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 PascalCase. * * `PascalCase` transforms object property names to PascalCase 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 PascalCase = Equal> extends true ? T : PascalizeMain; type PascalizeMain = 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 ? PascalizeObject : T; type PascalizeObject = T extends Array ? IsTuple extends true ? PascalizeTuple : PascalizeMain[] : T extends Set ? Set> : T extends Map ? Map, PascalizeMain> : T extends WeakSet | WeakMap ? never : T extends NativeClass ? T : { [Key in keyof T as PascalizeString< Key & string >]: PascalizeMain; }; type PascalizeTuple = T extends [] ? [] : T extends [infer F] ? [PascalizeMain] : T extends [infer F, ...infer Rest extends readonly any[]] ? [PascalizeMain, ...PascalizeTuple] : T extends [(infer F)?] ? [PascalizeMain?] : T extends [(infer F)?, ...infer Rest extends readonly any[]] ? [PascalizeMain?, ...PascalizeTuple] : []; type PascalizeString = Key extends `_${infer R}` ? `_${PascalizeString}` : Key extends `${infer _F}_${infer _R}` ? PascalizeSnakeString : Capitalize; type PascalizeSnakeString = Key extends `_${infer R}` ? PascalizeSnakeString : Key extends `${infer F}${infer M}_${infer R}` ? `${Uppercase}${Lowercase}${PascalizeSnakeString}` : Key extends `${infer F}${infer R}` ? `${Uppercase}${Lowercase}` : Key;