/* eslint-disable max-len */ type Nullable = T | null; type PropType = TObj[TProp]; // Create a type that generates a union of prefixed keys type PrefixedKeys = { [K in keyof T as `${Prefix}${Extract}`]: K; }; // type ReturnTypeAsync = ReturnType Promise ? () => U : T>; type ReturnTypeAsync any> = ReturnType Promise ? () => U : T>; /** * ObjectKeyPaths declaration */ type Join = T extends [] ? never : T extends [infer F extends string | number | bigint | boolean | null | undefined] ? `${Prefix}${F}` : T extends [infer F, ...infer R] ? F extends string[] ? Join : F extends string ? `${Prefix}${F}${D}${Join, D>}` : never : string; type LeafPathTree = { [P in keyof T]-?: T[P] extends object ? [P] | [P, ...LeafPath] : [P]; }; type LeafPath = LeafPathTree[keyof LeafPathTree]; type ObjectKeyPaths = Join, '.', Prefix>; type ObjectKeysTree = { [P in keyof T]-?: P; }; /** * Get object keys as union */ type ObjectKeys = ObjectKeysTree[keyof ObjectKeysTree]; type ObjectKeysArrayTree = { [P in keyof T]-?: [P]; }; /** * Get object keys as array */ type ObjectKeysArray = ObjectKeysArrayTree[keyof ObjectKeysArrayTree]; type JoinArray = T extends [] ? never : T extends [infer F] ? F extends string ? Suffix extends [] ? never : Suffix extends [infer X] ? X extends string | number ? `${Prefix}${F}${Separator}${X}` : never : Suffix extends string | number ? Suffix extends '' ? `${Prefix}${F}` : `${Prefix}${F}${Separator}${Suffix}` : `${Prefix}${F}` : never : string; /** * Transform keys to kebab */ type Upper = 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X' | 'Y' | 'Z'; type Kebab = T extends `${infer L}${Upper}${infer R}` ? T extends `${L}${infer U}${R}` ? `${L}-${Lowercase}${Kebab}` : T : T; type KebabKeys = { [K in keyof T as K extends string ? Kebab : K]: T[K] };