export type Promiseable = { [K in keyof T]: Promise | T[K]; }; export async function awaitAll(obj: Promiseable): Promise { const target = {} as T; const keys = Object.keys(obj) as unknown as (keyof T)[]; const values = Object.values(obj) as any[]; const resolvedValues = await Promise.all( values.map((value) => !(value?.constructor ) || value.constructor.name !== "Object" ? value : awaitAll(value), ), ); for (let i = 0; i < keys.length; i++) { target[keys[i]] = resolvedValues[i]; } return target; }