import { Equal } from "./internal/Equal"; import { IsTuple } from "./internal/IsTuple"; import { NativeClass } from "./internal/NativeClass"; import { ValueOf } from "./internal/ValueOf"; /** * Converts all object keys to camelCase. * * `CamelCase` transforms object property names to camelCase format and * erases methods like {@link Resolved}. Recursively processes nested * structures. * * @author Jeongho Nam - https://github.com/samchon * @template T Target type to transform */ export type CamelCase = Equal> extends true ? T : CamelizeMain; type CamelizeMain = T extends [never] ? never // special trick for (jsonable | null) type : T extends { valueOf(): boolean | bigint | number | string } ? ValueOf : T extends Function ? never : T extends object ? CamelizeObject : T; type CamelizeObject = T extends Array ? IsTuple extends true ? CamelizeTuple : CamelizeMain[] : T extends Set ? Set> : T extends Map ? Map, CamelizeMain> : T extends WeakSet | WeakMap ? never : T extends NativeClass ? T : { [Key in keyof T as CamelizeString]: CamelizeMain< T[Key] >; }; type CamelizeTuple = T extends [] ? [] : T extends [infer F] ? [CamelizeMain] : T extends [infer F, ...infer Rest extends readonly any[]] ? [CamelizeMain, ...CamelizeTuple] : T extends [(infer F)?] ? [CamelizeMain?] : T extends [(infer F)?, ...infer Rest extends readonly any[]] ? [CamelizeMain?, ...CamelizeTuple] : []; type CamelizeString = Key extends `_${infer R}` ? `_${CamelizeString}` : Key extends `${infer _F}_${infer _R}` ? CamelizeSnakeString : Key extends Uppercase ? Lowercase : CamelizePascalString; type CamelizePascalString = Key extends `${infer F}${infer R}` ? `${Lowercase}${R}` : Key; type CamelizeSnakeString = Key extends `_${infer R}` ? CamelizeSnakeString : Key extends `${infer F}_${infer M}${infer R}` ? M extends "_" ? CamelizeSnakeString<`${F}_${R}`> : `${Lowercase}${Uppercase}${CamelizeSnakeString}` : Lowercase;