Skip to content

Commit f9e828f

Browse files
committed
fix: key ending in number
resolves #64
1 parent 05203cd commit f9e828f

File tree

3 files changed

+17
-1
lines changed

3 files changed

+17
-1
lines changed

src/caseConvert.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,12 @@ export type ToSnake<S extends string | number | symbol> = S extends string
192192
? Caps extends CapitalChars
193193
? Head extends Lowercase<Head> /* 'abcD' */
194194
? Caps extends Numbers
195-
? never /* stop union type forming */
195+
? // Head exists and is lowercase, tail does not, Caps is a number, we may be in a sub-select
196+
// if head ends with number, don't split head an Caps, keep contiguous numbers together
197+
Head extends `${string}${Numbers}`
198+
? never
199+
: // head does not end in number, safe to split. 'abc2' -> 'abc_2'
200+
`${ToSnake<Head>}_${Caps}`
196201
: `${ToSnake<Head>}_${ToSnake<Caps>}` /* 'abcD' 'abc25' */
197202
: never /* stop union type forming */
198203
: never

test/caseConvert.bugs.test.ts

+9
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,15 @@ describe('bug fixes', () => {
141141
console.log(convertedSnakeObj.array);
142142
expect(convertedSnakeObj.array[0] instanceof Date).toBeTruthy();
143143
});
144+
145+
it('#64 - camel to snake missing property name ending in a number', () => {
146+
const camelObject = {
147+
aaaBbb1: 'a',
148+
};
149+
const snakeObject = objectToSnake(camelObject);
150+
expect(snakeObject.aaa_bbb_1).toEqual('a');
151+
expect(Object.keys(snakeObject)).toHaveLength(1);
152+
});
144153
});
145154

146155
// Bug #50

test/caseConvert.test.ts

+2
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,8 @@ type T23 = ToSnake<'abc25A50'>;
313313
const _s23: AssertEqual<T23, 'abc_25_a50'> = true;
314314
type T25 = ToSnake<'a'>;
315315
const _s25: AssertEqual<T25, 'a'> = true;
316+
type T36 = ToSnake<'abc1'>;
317+
const _s36: AssertEqual<T36, 'abc_1'> = true;
316318

317319
interface I24 {
318320
optionalObject?: {

0 commit comments

Comments
 (0)