summaryrefslogtreecommitdiff
path: root/src/prelude/await-all.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/prelude/await-all.ts')
-rw-r--r--src/prelude/await-all.ts22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/prelude/await-all.ts b/src/prelude/await-all.ts
new file mode 100644
index 0000000000..66303fe3ba
--- /dev/null
+++ b/src/prelude/await-all.ts
@@ -0,0 +1,22 @@
+type Await<T> = T extends Promise<infer U> ? U : T;
+
+type AwaitAll<T> = {
+ [P in keyof T]: Await<T[P]>;
+};
+
+export async function awaitAll<T>(obj: T): Promise<AwaitAll<T>> {
+ const target = {} as any;
+ const keys = Object.keys(obj);
+ const rawValues = Object.values(obj);
+ const retValues = ((values: any[]): any[] =>
+ values.map(value => {
+ if (!value || !value.constructor || value.constructor.name !== 'Object') return value;
+ return awaitAll(value);
+ })
+ )(rawValues);
+ const values = await Promise.all(retValues);
+ for (let i = 0; i < values.length; i++) {
+ target[keys[i]] = values[i];
+ }
+ return target;
+}