import { Equal } from "./internal/Equal"; import { NativeClass } from "./internal/NativeClass"; import { ValueOf } from "./internal/ValueOf"; /** * Converts all object keys to snake_case. * * `SnakeCase` transforms object property names to snake_case 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 SnakeCase = Equal> extends true ? T : SnakageMain; type SnakageMain = T extends [never] ? never : T extends { valueOf(): boolean | bigint | number | string; } ? ValueOf : T extends Function ? never : T extends object ? SnakageObject : T; type SnakageObject = T extends Array ? IsTuple extends true ? SnakageTuple : SnakageMain[] : T extends Set ? Set> : T extends Map ? Map, SnakageMain> : T extends WeakSet | WeakMap ? never : T extends NativeClass ? T : { [Key in keyof T as SnakageString]: SnakageMain; }; type IsTuple = [T] extends [ never ] ? false : T extends readonly any[] ? number extends T["length"] ? false : true : false; type SnakageTuple = T extends [] ? [] : T extends [infer F] ? [SnakageMain] : T extends [infer F, ...infer Rest extends readonly any[]] ? [SnakageMain, ...SnakageTuple] : T extends [(infer F)?] ? [SnakageMain?] : T extends [(infer F)?, ...infer Rest extends readonly any[]] ? [SnakageMain?, ...SnakageTuple] : []; type SnakageString = Key extends `${infer _}` ? SnakageStringRepeatedly : Key; type SnakageStringRepeatedly = S extends `${infer First}${infer Second}${infer Rest}` ? `${Underscore}${Lowercase}${Underscore}${Lowercase}${SnakageStringRepeatedly}` : S extends `${infer First}` ? `${Underscore}${Lowercase}` : ""; type Underscore = First extends UpperAlphabetic | "" | "_" ? "" : Second extends UpperAlphabetic ? "_" : ""; type UpperAlphabetic = "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"; export {};