/** * @see https://newbedev.com/typescript-convert-generic-object-from-snake-to-camel-case */ type SnakeCase = S extends `${infer T}${infer U}` ? `${T extends Capitalize ? "_" : ""}${Lowercase}${SnakeCase}` : S; type SnakifyObject = { [K in keyof T as SnakeCase]: T[K] extends Date ? T[K] : T[K] extends RegExp ? T[K] : T[K] extends Array ? U extends ({} | undefined) ? Array> : T[K] : T[K] extends ({} | undefined) ? S extends true ? T[K] : SnakifyObject : T[K]; }; export type Snakify = T extends Array<(infer U)> ? Array> : SnakifyObject; export default function snakify( /** * Value to be snakified */ obj: T, /** * If true, only the top level keys of the obj will be camel cased */ shallow?: S): T extends String ? string : Snakify; export {};