UNPKG

rivo

Version:

🤖 The ultimate library you need for composable type-level programming in TypeScript, powered by HKT.

28 lines (24 loc) • 1.08 kB
import type { Args, Fn } from "../HKT"; import type { List } from "../List"; import type { ToSnakeCase } from "../Str/ToSnakeCase"; type _SnakeizeMutableList<TS extends List> = TS extends [infer Head, ...infer Tail] ? [Head extends object ? Snakeize<Head> : Head, ..._SnakeizeMutableList<Tail>] : []; type _SnakeizeImmutableList<TS extends List> = TS extends readonly [infer Head, ...infer Tail] ? readonly [Head extends object ? Snakeize<Head> : Head, ..._SnakeizeImmutableList<Tail>] : readonly []; export type Snakeize<O extends object> = O extends Array<infer U> ? number extends O["length"] ? Array<U extends object ? Snakeize<U> : U> : _SnakeizeMutableList<O> : O extends ReadonlyArray<infer U> ? number extends O["length"] ? ReadonlyArray<U extends object ? Snakeize<U> : U> : _SnakeizeImmutableList<O> : { [K in keyof O & string as ToSnakeCase<K>]: [O[K]] extends [object] ? Snakeize<O[K]> : O[K] }; export default interface SnakeizeFn extends Fn<[object], object> { def: ([o]: Args<this>) => Snakeize<typeof o>; }