diff options
Diffstat (limited to 'src/util/node-utils.js')
-rw-r--r-- | src/util/node-utils.js | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/util/node-utils.js b/src/util/node-utils.js index 76684827..6c75bab6 100644 --- a/src/util/node-utils.js +++ b/src/util/node-utils.js @@ -1,5 +1,6 @@ // Utility functions which are only relevant to particular Node.js constructs. +import {readdir} from 'fs/promises'; import {fileURLToPath} from 'url'; import * as path from 'path'; @@ -54,3 +55,24 @@ export function isMain(importMetaURL) { isIndexJS && 'index.js' ].includes(relative); } + +// Like readdir... but it's recursive! +export function traverse(startDirPath, { + filterFile = () => true, + filterDir = () => true +} = {}) { + const recursive = (names, subDirPath) => + Promise.all( + names.map((name) => + readdir(path.join(startDirPath, subDirPath, name)).then( + (names) => + filterDir(name) + ? recursive(names, path.join(subDirPath, name)) + : [], + () => (filterFile(name) ? [path.join(subDirPath, name)] : []) + ) + ) + ).then((pathArrays) => pathArrays.flatMap((x) => x)); + + return readdir(startDirPath).then((names) => recursive(names, '')); +} |