@@ -16,22 +16,22 @@ type IsUpper<S extends string> = S extends Uppercase<S> ? true : false;
16
16
type IsLower < S extends string > = S extends Lowercase < S > ? true : false ;
17
17
type SameLetterCase <
18
18
X extends string ,
19
- Y extends string
19
+ Y extends string ,
20
20
> = IsUpper < X > extends IsUpper < Y >
21
21
? true
22
22
: IsLower < X > extends IsLower < Y >
23
- ? true
24
- : false ;
23
+ ? true
24
+ : false ;
25
25
type CapitalizedWords <
26
26
T extends readonly string [ ] ,
27
- Accumulator extends string = ""
27
+ Accumulator extends string = "" ,
28
28
> = T extends readonly [ infer F extends string , ...infer R extends string [ ] ]
29
29
? CapitalizedWords < R , `${Accumulator } ${Capitalize < F > } `>
30
30
: Accumulator ;
31
31
type JoinLowercaseWords <
32
32
T extends readonly string [ ] ,
33
33
Joiner extends string ,
34
- Accumulator extends string = ""
34
+ Accumulator extends string = "" ,
35
35
> = T extends readonly [ infer F extends string , ...infer R extends string [ ] ]
36
36
? Accumulator extends ""
37
37
? JoinLowercaseWords < R , Joiner , `${Accumulator } ${Lowercase < F > } `>
@@ -46,85 +46,88 @@ type RemoveLastOfArray<T extends any[]> = T extends [...infer F, any]
46
46
export type SplitByCase <
47
47
T ,
48
48
Separator extends string = Splitter ,
49
- Accumulator extends unknown [ ] = [ ]
49
+ Accumulator extends unknown [ ] = [ ] ,
50
50
> = string extends Separator
51
51
? string [ ]
52
52
: T extends `${infer F } ${infer R } `
53
- ? [ LastOfArray < Accumulator > ] extends [ never ]
54
- ? SplitByCase < R , Separator , [ F ] >
55
- : LastOfArray < Accumulator > extends string
56
- ? R extends ""
57
- ? SplitByCase <
58
- R ,
59
- Separator ,
60
- [ ...RemoveLastOfArray < Accumulator > , `${LastOfArray < Accumulator > } ${F } `]
61
- >
62
- : SameLetterCase < F , FirstOfString < R > > extends true
63
- ? F extends Separator
64
- ? FirstOfString < R > extends Separator
65
- ? SplitByCase < R , Separator , [ ...Accumulator , "" ] >
66
- : IsUpper < FirstOfString < R > > extends true
53
+ ? [ LastOfArray < Accumulator > ] extends [ never ]
54
+ ? SplitByCase < R , Separator , [ F ] >
55
+ : LastOfArray < Accumulator > extends string
56
+ ? R extends ""
67
57
? SplitByCase <
68
- RemoveFirstOfString < R > ,
58
+ R ,
69
59
Separator ,
70
- [ ...Accumulator , FirstOfString < R > ]
60
+ [
61
+ ...RemoveLastOfArray < Accumulator > ,
62
+ `${LastOfArray < Accumulator > } ${F } `,
63
+ ]
71
64
>
72
- : SplitByCase < R , Separator , [ ...Accumulator , "" ] >
73
- : SplitByCase <
74
- R ,
75
- Separator ,
76
- [
77
- ...RemoveLastOfArray < Accumulator > ,
78
- `${LastOfArray < Accumulator > } ${F } `
79
- ]
80
- >
81
- : IsLower < F > extends true
82
- ? SplitByCase <
83
- RemoveFirstOfString < R > ,
84
- Separator ,
85
- [
86
- ...RemoveLastOfArray < Accumulator > ,
87
- `${LastOfArray < Accumulator > } ${F } `,
88
- FirstOfString < R >
89
- ]
90
- >
91
- : SplitByCase < R , Separator , [ ...Accumulator , F ] >
92
- : never
93
- : Accumulator extends [ ]
94
- ? T extends ""
95
- ? [ ]
96
- : string [ ]
97
- : Accumulator ;
65
+ : SameLetterCase < F , FirstOfString < R > > extends true
66
+ ? F extends Separator
67
+ ? FirstOfString < R > extends Separator
68
+ ? SplitByCase < R , Separator , [ ...Accumulator , "" ] >
69
+ : IsUpper < FirstOfString < R > > extends true
70
+ ? SplitByCase <
71
+ RemoveFirstOfString < R > ,
72
+ Separator ,
73
+ [ ...Accumulator , FirstOfString < R > ]
74
+ >
75
+ : SplitByCase < R , Separator , [ ...Accumulator , "" ] >
76
+ : SplitByCase <
77
+ R ,
78
+ Separator ,
79
+ [
80
+ ...RemoveLastOfArray < Accumulator > ,
81
+ `${LastOfArray < Accumulator > } ${F } `,
82
+ ]
83
+ >
84
+ : IsLower < F > extends true
85
+ ? SplitByCase <
86
+ RemoveFirstOfString < R > ,
87
+ Separator ,
88
+ [
89
+ ...RemoveLastOfArray < Accumulator > ,
90
+ `${LastOfArray < Accumulator > } ${F } `,
91
+ FirstOfString < R > ,
92
+ ]
93
+ >
94
+ : SplitByCase < R , Separator , [ ...Accumulator , F ] >
95
+ : never
96
+ : Accumulator extends [ ]
97
+ ? T extends ""
98
+ ? [ ]
99
+ : string [ ]
100
+ : Accumulator ;
98
101
99
102
export type PascalCase < T > = string extends T
100
103
? string
101
104
: string [ ] extends T
102
- ? string
103
- : T extends string
104
- ? SplitByCase < T > extends readonly string [ ]
105
- ? CapitalizedWords < SplitByCase < T > >
106
- : never
107
- : T extends readonly string [ ]
108
- ? CapitalizedWords < T >
109
- : never ;
105
+ ? string
106
+ : T extends string
107
+ ? SplitByCase < T > extends readonly string [ ]
108
+ ? CapitalizedWords < SplitByCase < T > >
109
+ : never
110
+ : T extends readonly string [ ]
111
+ ? CapitalizedWords < T >
112
+ : never ;
110
113
111
114
export type CamelCase < T > = string extends T
112
115
? string
113
116
: string [ ] extends T
114
- ? string
115
- : Uncapitalize < PascalCase < T > > ;
117
+ ? string
118
+ : Uncapitalize < PascalCase < T > > ;
116
119
117
120
export type JoinByCase < T , Joiner extends string > = string extends T
118
121
? string
119
122
: string [ ] extends T
120
- ? string
121
- : T extends string
122
- ? SplitByCase < T > extends readonly string [ ]
123
- ? JoinLowercaseWords < SplitByCase < T > , Joiner >
124
- : never
125
- : T extends readonly string [ ]
126
- ? JoinLowercaseWords < T , Joiner >
127
- : never ;
123
+ ? string
124
+ : T extends string
125
+ ? SplitByCase < T > extends readonly string [ ]
126
+ ? JoinLowercaseWords < SplitByCase < T > , Joiner >
127
+ : never
128
+ : T extends readonly string [ ]
129
+ ? JoinLowercaseWords < T , Joiner >
130
+ : never ;
128
131
129
132
// eslint-disable-next-line @typescript-eslint/no-unused-vars
130
133
type __tests = [
@@ -184,6 +187,6 @@ type __tests = [
184
187
Assert < Equal < JoinByCase < "FooBARb" , "-" > , "foo-ba-rb" > > ,
185
188
Assert < Equal < JoinByCase < "foo_bar-baz/qux" , "-" > , "foo-bar-baz-qux" > > ,
186
189
// array
187
- Assert < Equal < JoinByCase < [ "Foo" , "Bar" ] , "-" > , "foo-bar" > >
190
+ Assert < Equal < JoinByCase < [ "Foo" , "Bar" ] , "-" > , "foo-bar" > > ,
188
191
] ;
189
192
/* eslint-enable @typescript-eslint/no-unused-vars */
0 commit comments