variable-name-conversion
Version:
To easily convert a variable name to camelCase, kebab-case, etc.
73 lines (72 loc) • 3.21 kB
TypeScript
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 {};