-
-
Notifications
You must be signed in to change notification settings - Fork 11
/
$extract_manipulated_string.ts
50 lines (49 loc) · 1.22 KB
/
$extract_manipulated_string.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/**
* 🧰 *type util*
*
* Extract the manipulated string from any of the intrinsic string manipulation types:
*
* - `Uppercase`
* - `Lowercase`
* - `Capitalize`
* - `Uncapitalize`
*/
export type $ExtractManipulatedString<T extends string> = [T, unknown] extends [unknown, T]
? T
: $ExtractManipulatedString._UpperOrElse<
T,
$ExtractManipulatedString._LowerOrElse<
T,
$ExtractManipulatedString._CapOrElse<T, $ExtractManipulatedString._UncapOrElse<T, T>>
>
>
export namespace $ExtractManipulatedString {
export type _UpperOrElse<N, Else> = N extends Uppercase<infer Y>
? string extends Y
? Uppercase<any> extends N
? Y
: N
: $ExtractManipulatedString<Y>
: Else
export type _LowerOrElse<N, Else> = N extends Lowercase<infer Y>
? string extends Y
? Lowercase<any> extends N
? Y
: N
: $ExtractManipulatedString<Y>
: Else
export type _CapOrElse<N, Else> = N extends Capitalize<infer Y>
? string extends Y
? Capitalize<any> extends N
? Y
: N
: $ExtractManipulatedString<Y>
: Else
export type _UncapOrElse<N, Else> = N extends Uncapitalize<infer Y>
? string extends Y
? Uncapitalize<any> extends N
? Y
: N
: $ExtractManipulatedString<Y>
: Else
}