Pop-up dictionary browser extension for language learning. Successor to Yomichan. (PERSONAL FORK)
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}