Pop-up dictionary browser extension for language learning. Successor to Yomichan. (PERSONAL FORK)
at lambda-fork/main 47 lines 1.9 kB view raw
1/* 2 * Copyright (C) 2023-2025 Yomitan Authors 3 * Copyright (C) 2020-2022 Yomichan Authors 4 * 5 * This program is free software: you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation, either version 3 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program. If not, see <https://www.gnu.org/licenses/>. 17 */ 18 19import fs from 'fs'; 20import path from 'path'; 21 22/** 23 * @param {string} baseDirectory 24 * @param {?(fileName: string, isDirectory: boolean) => boolean} predicate 25 * @returns {string[]} 26 */ 27export function getAllFiles(baseDirectory, predicate = null) { 28 const results = []; 29 const directories = [baseDirectory]; 30 while (directories.length > 0) { 31 const directory = /** @type {string} */ (directories.shift()); 32 const fileNames = fs.readdirSync(directory); 33 for (const fileName of fileNames) { 34 const fullFileName = path.join(directory, fileName); 35 const relativeFileName = path.relative(baseDirectory, fullFileName); 36 const stats = fs.lstatSync(fullFileName); 37 if (stats.isFile()) { 38 if (typeof predicate !== 'function' || predicate(relativeFileName, false)) { 39 results.push(relativeFileName); 40 } 41 } else if (stats.isDirectory() && (typeof predicate !== 'function' || predicate(relativeFileName, true))) { 42 directories.push(fullFileName); 43 } 44 } 45 } 46 return results; 47}