summary refs log tree commit diff
path: root/src/Util.ts
diff options
context:
space:
mode:
authorxnacly <matteogropp@gmail.com>2021-01-03 22:43:52 +0100
committerxnacly <matteogropp@gmail.com>2021-01-03 22:43:52 +0100
commit6c10e25bcabe4fd2ddc6c3fcd2da7e7ed4d17064 (patch)
tree7ccc395d9d7e0bd92ea672a89b11a3017d94d25e /src/Util.ts
parent:tada: standard client finished (diff)
downloadserver-6c10e25bcabe4fd2ddc6c3fcd2da7e7ed4d17064.tar.xz
routes + util + snowflake
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); +}