1
1
function convertObject <
2
2
TInput extends object ,
3
3
TResult extends
4
- | ObjectToCamel < TInput >
5
- | ObjectToSnake < TInput >
6
- | ObjectToPascal < TInput > ,
4
+ | ObjectToCamel < TInput >
5
+ | ObjectToSnake < TInput >
6
+ | ObjectToPascal < TInput > ,
7
7
> ( obj : TInput , keyConverter : ( arg : string ) => string ) : TResult {
8
8
if ( obj === null || typeof obj === 'undefined' || typeof obj !== 'object' ) {
9
9
return obj ;
@@ -16,31 +16,31 @@ function convertObject<
16
16
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
17
17
out [ keyConverter ( k ) ] = Array . isArray ( v )
18
18
? ( v . map ( < ArrayItem extends object > ( item : ArrayItem ) =>
19
- typeof item === 'object' &&
19
+ typeof item === 'object' &&
20
20
! ( item instanceof Uint8Array ) &&
21
21
! ( item instanceof Date )
22
- ? convertObject <
23
- ArrayItem ,
24
- TResult extends ObjectToCamel < TInput >
25
- ? ObjectToCamel < ArrayItem >
26
- : TResult extends ObjectToPascal < TInput >
27
- ? ObjectToPascal < ArrayItem >
28
- : ObjectToSnake < ArrayItem >
29
- > ( item , keyConverter )
30
- : item ,
31
- ) as unknown [ ] )
22
+ ? convertObject <
23
+ ArrayItem ,
24
+ TResult extends ObjectToCamel < TInput >
25
+ ? ObjectToCamel < ArrayItem >
26
+ : TResult extends ObjectToPascal < TInput >
27
+ ? ObjectToPascal < ArrayItem >
28
+ : ObjectToSnake < ArrayItem >
29
+ > ( item , keyConverter )
30
+ : item ,
31
+ ) as unknown [ ] )
32
32
: v instanceof Uint8Array || v instanceof Date
33
- ? v
34
- : typeof v === 'object'
35
- ? convertObject <
36
- typeof v ,
37
- TResult extends ObjectToCamel < TInput >
33
+ ? v
34
+ : typeof v === 'object'
35
+ ? convertObject <
36
+ typeof v ,
37
+ TResult extends ObjectToCamel < TInput >
38
38
? ObjectToCamel < typeof v >
39
39
: TResult extends ObjectToPascal < TInput >
40
40
? ObjectToPascal < typeof v >
41
41
: ObjectToSnake < typeof v >
42
- > ( v , keyConverter )
43
- : ( v as unknown ) ;
42
+ > ( v , keyConverter )
43
+ : ( v as unknown ) ;
44
44
}
45
45
return out ;
46
46
}
@@ -50,8 +50,8 @@ export function toCamel<T extends string>(term: T): ToCamel<T> {
50
50
term . length === 1
51
51
? term . toLowerCase ( )
52
52
: term
53
- . replace ( / ^ ( [ A - Z ] ) / , ( m ) => m [ 0 ] . toLowerCase ( ) )
54
- . replace ( / [ _ - ] ( [ a - z 0 - 9 ] ) / g, ( m ) => m [ 1 ] . toUpperCase ( ) )
53
+ . replace ( / ^ ( [ A - Z ] ) / , ( m ) => m [ 0 ] . toLowerCase ( ) )
54
+ . replace ( / [ _ - ] ( [ a - z 0 - 9 ] ) / g, ( m ) => m [ 1 ] . toUpperCase ( ) )
55
55
) as ToCamel < T > ;
56
56
}
57
57
@@ -107,134 +107,135 @@ export function objectToPascal<T extends object>(obj: T): ObjectToPascal<T> {
107
107
108
108
export type ToCamel < S extends string | number | symbol > = S extends string
109
109
? S extends `${infer Head } _${infer Tail } `
110
- ? `${ToCamel < Uncapitalize < Head > > } ${Capitalize < ToCamel < Tail > > } `
111
- : S extends `${infer Head } -${infer Tail } `
112
- ? `${ToCamel < Uncapitalize < Head > > } ${Capitalize < ToCamel < Tail > > } `
113
- : Uncapitalize < S >
114
- : never ;
110
+ ? `${ToCamel < Uncapitalize < Head > > } ${Capitalize < ToCamel < Tail > > } `
111
+ : S extends `${infer Head } -${infer Tail } `
112
+ ? `${ToCamel < Uncapitalize < Head > > } ${Capitalize < ToCamel < Tail > > } `
113
+ : Uncapitalize < S >
114
+ : never ;
115
115
116
116
export type ObjectToCamel < T extends object | undefined | null > =
117
117
T extends undefined
118
- ? undefined
119
- : T extends null
120
- ? null
121
- : T extends Array < infer ArrayType extends string | number >
122
- ? Array < ArrayType >
123
- : T extends Array < infer ArrayType extends object >
124
- ? Array < ObjectToCamel < ArrayType > >
125
- : T extends Uint8Array
126
- ? Uint8Array
127
- : T extends Date
128
- ? Date
129
- : {
130
- [ K in keyof T as ToCamel < K > ] : T [ K ] extends Array < infer ArrayType extends string | number >
118
+ ? undefined
119
+ : T extends null
120
+ ? null
121
+ : T extends Array < infer ArrayType extends string | number >
131
122
? Array < ArrayType >
132
123
: T extends Array < infer ArrayType extends object >
133
124
? Array < ObjectToCamel < ArrayType > >
134
- : T [ K ] extends object | undefined | null
135
- ? ObjectToCamel < T [ K ] >
136
- : T [ K ] ;
137
- } ;
125
+ : T extends Uint8Array
126
+ ? Uint8Array
127
+ : T extends Date
128
+ ? Date
129
+ : {
130
+ [ K in keyof T as ToCamel < K > ] : T [ K ] extends Array < infer ArrayType extends string | number >
131
+ ? Array < ArrayType >
132
+ : T extends Array < infer ArrayType extends object >
133
+ ? Array < ObjectToCamel < ArrayType > >
134
+ : T [ K ] extends object | undefined | null
135
+ ? ObjectToCamel < T [ K ] >
136
+ : T [ K ] ;
137
+ } ;
138
138
139
139
export type ToPascal < S extends string | number | symbol > = S extends string
140
140
? S extends `${infer Head } _${infer Tail } `
141
- ? `${Capitalize < ToCamel < Head > > } ${Capitalize < ToCamel < Tail > > } `
142
- : S extends `${infer Head } -${infer Tail } `
143
- ? `${Capitalize < ToCamel < Head > > } ${Capitalize < ToCamel < Tail > > } `
144
- : Capitalize < S >
145
- : never ;
141
+ ? `${Capitalize < ToCamel < Head > > } ${Capitalize < ToCamel < Tail > > } `
142
+ : S extends `${infer Head } -${infer Tail } `
143
+ ? `${Capitalize < ToCamel < Head > > } ${Capitalize < ToCamel < Tail > > } `
144
+ : Capitalize < S >
145
+ : never ;
146
146
147
147
export type ObjectToPascal < T extends object | undefined | null > =
148
148
T extends undefined
149
- ? undefined
150
- : T extends null
151
- ? null
152
- : T extends Array < infer ArrayType extends string | number >
153
- ? Array < ArrayType >
154
- : T extends Array < infer ArrayType extends object >
155
- ? Array < ObjectToPascal < ArrayType > >
156
- : T extends Uint8Array
157
- ? Uint8Array
158
- : T extends Date
159
- ? Date
160
- : {
161
- [ K in keyof T as ToPascal < K > ] : T [ K ] extends Array < infer ArrayType extends string | number >
149
+ ? undefined
150
+ : T extends null
151
+ ? null
152
+ : T extends Array < infer ArrayType extends string | number >
162
153
? Array < ArrayType >
163
- : T extends Array < infer ArrayType extends object >
164
- ? Array < ObjectToPascal < ArrayType > >
165
- : T [ K ] extends object | undefined | null
166
- ? ObjectToPascal < T [ K ] >
167
- : T [ K ] ;
168
- } ;
154
+ : T extends Array < infer ArrayType extends object >
155
+ ? Array < ObjectToPascal < ArrayType > >
156
+ : T extends Uint8Array
157
+ ? Uint8Array
158
+ : T extends Date
159
+ ? Date
160
+ : {
161
+ [ K in keyof T as ToPascal < K > ] : T [ K ] extends Array < infer ArrayType extends string | number >
162
+ ? Array < ArrayType >
163
+ : T extends Array < infer ArrayType extends object >
164
+ ? Array < ObjectToPascal < ArrayType > >
165
+ : T [ K ] extends object | undefined | null
166
+ ? ObjectToPascal < T [ K ] >
167
+ : T [ K ] ;
168
+ } ;
169
169
170
170
export type ToSnake < S extends string | number | symbol > = S extends string
171
171
? S extends `${infer Head } ${CapitalChars } ${infer Tail } ` // string has a capital char somewhere
172
- ? Head extends '' // there is a capital char in the first position
173
- ? Tail extends ''
174
- ? Lowercase < S > /* 'A' */
175
- : S extends `${infer Caps } ${Tail } ` // tail exists, has capital characters
176
- ? Caps extends CapitalChars
177
- ? Tail extends CapitalLetters
178
- ? `${Lowercase < Caps > } _${Lowercase < Tail > } ` /* 'AB' */
179
- : Tail extends `${CapitalLetters } ${string } `
180
- ? `${ToSnake < Caps > } _${ToSnake < Tail > } ` /* first tail char is upper? 'ABcd' */
181
- : `${ToSnake < Caps > } ${ToSnake < Tail > } ` /* 'AbCD','AbcD', */ /* TODO: if tail is only numbers, append without underscore */
182
- : never /* never reached, used for inference of caps */
183
- : never
184
- : Tail extends '' /* 'aB' 'abCD' 'ABCD' 'AB' */
185
- ? S extends `${Head } ${infer Caps } `
186
- ? Caps extends CapitalChars
187
- ? Head extends Lowercase < Head > /* 'abcD' */
188
- ? Caps extends Numbers
189
- ? // Head exists and is lowercase, tail does not, Caps is a number, we may be in a sub-select
190
- // if head ends with number, don't split head an Caps, keep contiguous numbers together
191
- Head extends `${string } ${Numbers } `
192
- ? never
193
- : // head does not end in number, safe to split. 'abc2' -> 'abc_2'
194
- `${ToSnake < Head > } _${Caps } `
195
- : `${ToSnake < Head > } _${ToSnake < Caps > } ` /* 'abcD' 'abc25' */
196
- : never /* stop union type forming */
197
- : never
198
- : never /* never reached, used for inference of caps */
199
- : S extends `${Head } ${infer Caps } ${Tail } ` /* 'abCd' 'ABCD' 'AbCd' 'ABcD' */
200
- ? Caps extends CapitalChars
201
- ? Head extends Lowercase < Head > /* is 'abCd' 'abCD' ? */
202
- ? Tail extends CapitalLetters /* is 'abCD' where Caps = 'C' */
203
- ? `${ToSnake < Head > } _${ToSnake < Caps > } _${Lowercase < Tail > } ` /* aBCD Tail = 'D', Head = 'aB' */
204
- : Tail extends `${CapitalLetters } ${string } ` /* is 'aBCd' where Caps = 'B' */
205
- ? Head extends Numbers
206
- ? never /* stop union type forming */
207
- : Head extends `${string } ${Numbers } `
208
- ? never /* stop union type forming */
209
- : `${Head } _${ToSnake < Caps > } _${ToSnake < Tail > } ` /* 'aBCd' => `${'a'}_${Lowercase<'B'>}_${ToSnake<'Cd'>}` */
210
- : `${ToSnake < Head > } _${Lowercase < Caps > } ${ToSnake < Tail > } ` /* 'aBcD' where Caps = 'B' tail starts as lowercase */
211
- : never
212
- : never
213
- : never
172
+ ? Head extends '' // there is a capital char in the first position
173
+ ? Tail extends ''
174
+ ? Lowercase < S > /* 'A' */
175
+ : S extends `${infer Caps } ${Tail } ` // tail exists, has capital characters
176
+ ? Caps extends CapitalChars
177
+ ? Tail extends CapitalLetters
178
+ ? `${Lowercase < Caps > } _${Lowercase < Tail > } ` /* 'AB' */
179
+ : Tail extends `${CapitalLetters } ${string } `
180
+ ? `${ToSnake < Caps > } _${ToSnake < Tail > } ` /* first tail char is upper? 'ABcd' */
181
+ : `${ToSnake < Caps > } ${ToSnake < Tail > } ` /* 'AbCD','AbcD', */ /* TODO: if tail is only numbers, append without underscore */
182
+ : never /* never reached, used for inference of caps */
183
+ : never
184
+ : Tail extends '' /* 'aB' 'abCD' 'ABCD' 'AB' */
185
+ ? S extends `${Head } ${infer Caps } `
186
+ ? Caps extends CapitalChars
187
+ ? Head extends Lowercase < Head > /* 'abcD' */
188
+ ? Caps extends Numbers
189
+ ? // Head exists and is lowercase, tail does not, Caps is a number, we may be in a sub-select
190
+ // if head ends with number, don't split head an Caps, keep contiguous numbers together
191
+ Head extends `${string } ${Numbers } `
192
+ ? never
193
+ : // head does not end in number, safe to split. 'abc2' -> 'abc_2'
194
+ `${ToSnake < Head > } _${Caps } `
195
+ : `${ToSnake < Head > } _${ToSnake < Caps > } ` /* 'abcD' 'abc25' */
196
+ : never /* stop union type forming */
197
+ : never
198
+ : never /* never reached, used for inference of caps */
199
+ : S extends `${Head } ${infer Caps } ${Tail } ` /* 'abCd' 'ABCD' 'AbCd' 'ABcD' */
200
+ ? Caps extends CapitalChars
201
+ ? Head extends Lowercase < Head > /* is 'abCd' 'abCD' ? */
202
+ ? Tail extends CapitalLetters /* is 'abCD' where Caps = 'C' */
203
+ ? `${ToSnake < Head > } _${ToSnake < Caps > } _${Lowercase < Tail > } ` /* aBCD Tail = 'D', Head = 'aB' */
204
+ : Tail extends `${CapitalLetters } ${string } ` /* is 'aBCd' where Caps = 'B' */
205
+ ? Head extends Numbers
206
+ ? never /* stop union type forming */
207
+ : Head extends `${string } ${Numbers } `
208
+ ? never /* stop union type forming */
209
+ : `${Head } _${ToSnake < Caps > } _${ToSnake < Tail > } ` /* 'aBCd' => `${'a'}_${Lowercase<'B'>}_${ToSnake<'Cd'>}` */
210
+ : `${ToSnake < Head > } _${Lowercase < Caps > } ${ToSnake < Tail > } ` /* 'aBcD' where Caps = 'B' tail starts as lowercase */
211
+ : never
212
+ : never
213
+ : never
214
214
: S /* 'abc' */
215
215
: never ;
216
216
217
- export type ObjectToSnake < T extends object | undefined | null > = T extends undefined
218
- ? undefined
219
- : T extends null
220
- ? null
221
- : T extends Array < infer ArrayType extends string | number >
222
- ? Array < ArrayType >
223
- : T extends Array < infer ArrayType extends object >
224
- ? Array < ObjectToSnake < ArrayType > >
225
- : T extends Uint8Array
226
- ? Uint8Array
227
- : T extends Date
228
- ? Date
229
- : {
230
- [ K in keyof T as ToSnake < K > ] : T [ K ] extends Array < infer ArrayType extends string | number >
217
+ export type ObjectToSnake < T extends object | undefined | null > =
218
+ T extends undefined
219
+ ? undefined
220
+ : T extends null
221
+ ? null
222
+ : T extends Array < infer ArrayType extends string | number >
231
223
? Array < ArrayType >
232
224
: T extends Array < infer ArrayType extends object >
233
- ? Array < ObjectToPascal < ArrayType > >
234
- : T [ K ] extends object | undefined | null
235
- ? ObjectToSnake < T [ K ] >
236
- : T [ K ] ;
237
- } ;
225
+ ? Array < ObjectToSnake < ArrayType > >
226
+ : T extends Uint8Array
227
+ ? Uint8Array
228
+ : T extends Date
229
+ ? Date
230
+ : {
231
+ [ K in keyof T as ToSnake < K > ] : T [ K ] extends Array < infer ArrayType extends string | number >
232
+ ? Array < ArrayType >
233
+ : T extends Array < infer ArrayType extends object >
234
+ ? Array < ObjectToPascal < ArrayType > >
235
+ : T [ K ] extends object | undefined | null
236
+ ? ObjectToSnake < T [ K ] >
237
+ : T [ K ] ;
238
+ } ;
238
239
239
240
type CapitalLetters =
240
241
| 'A'
0 commit comments