summary refs log tree commit diff
path: root/src/Util.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/Util.ts')
-rw-r--r--src/Util.ts38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/Util.ts b/src/Util.ts
new file mode 100644

index 00000000..291372c1 --- /dev/null +++ b/src/Util.ts
@@ -0,0 +1,38 @@ +import fs from "fs/promises"; +import "missing-native-js-functions"; + +export interface traverseDirectoryOptions { + dirname: string; + filter?: RegExp; + excludeDirs?: RegExp; + recursive?: boolean; +} + +const DEFAULT_EXCLUDE_DIR = /^\./; +const DEFAULT_FILTER = /^([^\.].*)\.js$/; + +export async function traverseDirectory<T>( + options: traverseDirectoryOptions, + action: (path: string) => T +): Promise<T[]> { + if (!options.filter) options.filter = DEFAULT_FILTER; + if (!options.excludeDirs) options.excludeDirs = DEFAULT_EXCLUDE_DIR; + + const routes = await fs.readdir(options.dirname); + const promises = <Promise<T | T[] | undefined>[]>routes.map(async (file) => { + const path = options.dirname + file; + const stat = await fs.lstat(path); + if (path.match(<RegExp>options.excludeDirs)) return; + + if (stat.isFile() && path.match(<RegExp>options.filter)) { + return action(path); + } else if (options.recursive && stat.isDirectory()) { + return traverseDirectory({ ...options, dirname: path + "/" }, action); + } + }); + const result = await Promise.all(promises); + + const t = <(T | undefined)[]>result.flat(); + + return <T[]>t.filter((x) => x != undefined); +}