/****************************************************************************** Types ******************************************************************************/ export type TruthyObject = NonNullable; type Primitive = string | number | boolean | bigint | symbol | null | undefined; export type Dict = Record; export type KeysParam = keyof T | (keyof T)[]; export type Mutable = T extends (...args: any[]) => any ? T : T extends ReadonlyArray ? Mutable[] : T extends object ? { -readonly [K in keyof T]: Mutable; } : T; export type KeyUnion> = K extends (keyof T)[] ? K[number] : K; export type OmitKeys> = Omit>; export type PickKeys> = Pick>; export type Entry = T extends object ? { [K in keyof T]-?: [K, T[K]]; }[keyof T] : never; export type SetToNever = T & { [P in K]: never; }; type NonNeverKeys = { [K in keyof T]-?: [T[K]] extends [never] ? never : K; }[keyof T]; export type OmitNever = Pick>; type UnionToIntersection = (U extends any ? (x: U) => void : never) extends (x: infer I) => void ? I : never; type LastOf = UnionToIntersection U : never> extends () => infer L ? L : never; type UnionToTuple = [U] extends [never] ? R : UnionToTuple>, [LastOf, ...R]>; type Entries = { [K in keyof T]-?: [K, T[K]]; }[keyof T]; export type EntriesTuple = UnionToTuple>; export type KeyTuple = UnionToTuple; export type ValueTuple = UnionToTuple; type WidenPrimitive = T extends string ? string : T extends number ? number : T extends boolean ? boolean : T extends bigint ? bigint : T extends symbol ? symbol : T; export type DeepWiden = T extends Primitive ? WidenPrimitive : T extends (...args: any[]) => any ? T : T extends readonly (infer U)[] ? DeepWiden[] : T extends object ? { [K in keyof T]: DeepWiden; } : T; export type EntryToAdd = readonly [PropertyKey, unknown]; export type AddEntries = T & { [K in Entries[number] as K[0]]: Extract[1]; }; type UnionKeys = U extends unknown ? keyof U : never; type UnionValuesForKey = U extends unknown ? (K extends keyof U ? U[K] : never) : never; type MergeUnion = [UnionKeys] extends [never] ? Dict : { [K in UnionKeys]: UnionValuesForKey; }; export type MergeArray = MergeUnion; export {};