summary refs log tree commit diff
path: root/src/Utils.ts
diff options
context:
space:
mode:
authorFlam3rboy <34555296+Flam3rboy@users.noreply.github.com>2020-11-28 19:31:04 +0100
committerFlam3rboy <34555296+Flam3rboy@users.noreply.github.com>2020-11-28 19:31:04 +0100
commitbb9a76a2a1852350318998f77966c96b54887295 (patch)
treeda8938b2d423a47bc3fc15955599463cdaf9cde7 /src/Utils.ts
parentInitial commit (diff)
downloadserver-bb9a76a2a1852350318998f77966c96b54887295.tar.xz
:tada: standard client finished
Diffstat (limited to 'src/Utils.ts')
-rw-r--r--src/Utils.ts47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/Utils.ts b/src/Utils.ts
new file mode 100644

index 00000000..09d8e8c6 --- /dev/null +++ b/src/Utils.ts
@@ -0,0 +1,47 @@ +import fs from "fs/promises"; + +declare global { + interface Array<T> { + flat(): T; + } +} + +Array.prototype.flat = function () { + return this.reduce((acc, val) => (Array.isArray(val) ? acc.concat(val.flat()) : acc.concat(val)), []); +}; + +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); +}