| 4 | type Filter = (name: string, dir: string) => boolean |
| 5 | |
| 6 | export async function readdirRecursive(root: string, filter?: Filter, dir = ""): Promise<string[]> { |
| 7 | const absoluteDir = path.resolve(root, dir) |
| 8 | const dirStats = await fs.stat(absoluteDir) |
| 9 | |
| 10 | if (dirStats.isDirectory()) { |
| 11 | let entries = await fs.readdir(absoluteDir) |
| 12 | |
| 13 | if (filter) { |
| 14 | entries = entries.filter((name) => filter(name, dir)) |
| 15 | } |
| 16 | |
| 17 | const recursiveList = await Promise.all( |
| 18 | entries.map((name) => readdirRecursive(root, filter, path.join(dir, name))), |
| 19 | ) |
| 20 | return recursiveList.flat(Infinity) as string[] |
| 21 | } else { |
| 22 | return [dir] |
| 23 | } |
| 24 | } |