export type PartialRequired = Omit, S> & Partial>; export function getRange(size: number, startAt: number = 0): readonly number[] { return [...Array(size).keys()].map((i) => i + startAt); } export const getDelay = async (ms: number): Promise => await new Promise((resolve) => setTimeout(resolve, ms)); // Vendored from https://github.com/kbrabrand/camelize-ts/blob/main/src/index.ts // Copyright (c) 2021 Kristoffer Brabrand type CamelCase = S extends `${infer P1}_${infer P2}${infer P3}` ? `${P1}${Uppercase}${CamelCase}` : S; export type Camelize = { [K in keyof T as CamelCase]: T[K] extends Array ? U extends Record | undefined ? Array> : T[K] : T[K] extends Record | undefined ? Camelize : T[K]; }; export function camelCase(str: string): string { return str.replace(/[_.-](\w|$)/g, function (_, x) { return x.toUpperCase(); }); } function walk(obj: any): any { if (obj == null || typeof obj !== "object") return obj; if (obj instanceof Date || obj instanceof RegExp) return obj; if (Array.isArray(obj)) return obj.map(walk); return Object.keys(obj).reduce((res, key) => { const camel = camelCase(key); res[camel] = walk(obj[key]); return res; }, {}); } export function camelize(obj: T): T extends string ? string : Camelize { return typeof obj === "string" ? camelCase(obj) : walk(obj); } export function isPromise(arg: any): arg is Promise { return Boolean( arg != null && typeof arg === "object" && typeof arg.then === "function" ); }