/* eslint-disable @typescript-eslint/no-unused-vars */ export type Primitive = string | number | boolean | bigint | symbol | undefined | null; // eslint-disable-next-line @typescript-eslint/ban-types export type Builtin = Primitive | Function | Date | Error | RegExp; export type DeepRequired = T extends Builtin ? NonNullable : T extends Map ? Map, DeepRequired> : T extends ReadonlyMap ? ReadonlyMap, DeepRequired> : T extends WeakMap ? WeakMap, DeepRequired> : T extends Set ? Set> : T extends ReadonlySet ? ReadonlySet> : T extends WeakSet ? WeakSet> : T extends Promise ? Promise> : T extends {} // eslint-disable-line @typescript-eslint/ban-types ? { [K in keyof T]-?: DeepRequired } : NonNullable; export type RequiredExcept = Partial> & Required>; export type PartialRequired = Partial> & Required>; export type DeepPartial = { [P in keyof T]?: T[P] extends Array ? Array> : T[P] extends ReadonlyArray ? ReadonlyArray> : DeepPartial; }; export type ArgumentTypes unknown> = F extends (...args: infer A) => any ? A : never; /** * A readonly array of any values. * @private */ export type Arr = readonly any[]; /** * A generic constructor with parameters */ export type Ctor = new (...args: A) => R; /** * A generic constructor without parameters */ export type Constructor = new (...args: any[]) => T; /** * Gets the first argument of any given function */ export type FirstArgument = T extends (arg1: infer U, ...args: unknown[]) => unknown ? U : unknown; /** * Gets the second argument of any given function */ export type SecondArgument = T extends (arg1: unknown, arg2: infer U, ...args: unknown[]) => unknown ? U : unknown; /** * ReturnType for a function that can return either a value or a `Promise` with that value */ export type Awaited = PromiseLike | T; /** * Type union for the full 2 billion dollar mistake in the JavaScript ecosystem */ export type Nullish = null | undefined;