UNPKG

variable-name-conversion

Version:

To easily convert a variable name to camelCase, kebab-case, etc.

73 lines (72 loc) 3.21 kB
export type Camelize<TRaw extends string, TSep extends string = "_", TKeepCase extends boolean = false> = TRaw extends `${infer Before}${TSep}${infer After}` ? TKeepCase extends false ? `${Lowercase<Before>}${Capitalize<Camelize<After>>}` : `${IsUpperCase<Before> extends true ? Before : Lowercase<Before>}${Capitalize<IsUpperCase<After> extends true ? After : Camelize<After>>}` : TRaw; export type Snakify<TRaw extends string, TSep extends string = "_", PreviousChar extends string = ""> = TRaw extends `${infer ThisChar}${infer Subsequent}` ? `${PreviousChar extends "" ? "" : IsUpperOrDigitNotSymbol<ThisChar> extends true ? IsUpperCase<PreviousChar> extends false ? TSep : Subsequent extends `${infer NextChar}${string}` ? IsUpperCase<NextChar> extends false ? IsSymbol<PreviousChar> extends true ? "" : TSep : "" : "" : ""}${ThisChar}${Snakify<Subsequent, TSep, ThisChar>}` : ""; export type Replace< TRaw extends string, TSource extends string, TDestination extends string, Accumulated extends string = "", > = TRaw extends `${infer Before}${TSource}${infer After}` ? Replace<After, TSource, TDestination, `${Accumulated}${Before}${TDestination}`> : `${Accumulated}${TRaw}`; type ToLowercaseIfAllUppercase<TRaw extends string> = Uppercase<TRaw> extends TRaw ? Lowercase<TRaw> : TRaw; type Trim<TRaw extends string> = TRaw extends ` ${infer After}` ? Trim<After> : TRaw extends `${infer Before} ` ? Trim<Before> : TRaw; export type DefaultSep = "_"; type ParseRawInternal<TRaw extends string, NotAllUpper extends string = ToLowercaseIfAllUppercase<Trim<TRaw>>> = Trim< NotAllUpper extends `${string}_${string}` ? NotAllUpper : NotAllUpper extends `${string}-${string}` ? Replace<NotAllUpper, "-", DefaultSep> : NotAllUpper extends `${string}.${string}` ? Replace<NotAllUpper, ".", DefaultSep> : NotAllUpper extends `${string}/${string}` ? Replace<NotAllUpper, "/", DefaultSep> : NotAllUpper extends `${string}\\${string}` ? Replace<NotAllUpper, "\\", DefaultSep> : NotAllUpper extends `${string} ${string}` ? Replace<NotAllUpper, " ", DefaultSep> : Snakify<NotAllUpper, DefaultSep> >; export type ParseRaw<TRaw extends string> = string extends TRaw ? string : IsUpperCase<TRaw> extends true ? Uppercase<ParseRawInternal<TRaw>> : ParseRawInternal<TRaw>; export type Titleize<TRaw extends string, TSep extends string = " "> = TRaw extends `${infer Before}${TSep}${infer After}` ? `${Capitalize<Before>}${TSep}${Titleize<After, TSep>}` : Capitalize<TRaw>; type IsDigit<TChar extends string> = TChar extends "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ? true : false; /** Are all letters in the string uppercase? */ export type IsUpperCase<T extends string> = Uppercase<T> extends T ? true : false; /** Is uppercase or digit but not symbol or empty string? */ type IsUpperOrDigitNotSymbol<T extends string> = Uppercase<T> extends T ? IsDigit<T> extends true ? true : Lowercase<T> extends T ? false : true : false; /** Is symbol but not digit? */ type IsSymbol<T extends string> = Uppercase<T> extends T ? Lowercase<T> extends T ? IsDigit<T> extends true ? false : true : false : false; export {};