Skip to content

Commit d69729a

Browse files
committedSep 27, 2024
fix(lossless-parser): correctly parse number array
fixes #258
1 parent f7ab6eb commit d69729a

File tree

3 files changed

+21
-5
lines changed

3 files changed

+21
-5
lines changed
 

‎src/__tests__/lib/LosslessJsonParser.unit.spec.ts

+14-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {
22
BigIntValue,
33
ChildDto,
4+
createDtoInstance,
45
Int64String,
56
LosslessDto,
67
losslessParse,
@@ -387,14 +388,22 @@ test('LosslessJsonParser will throw if given stringified JSON with an unsafe int
387388

388389
test('It rejects Date, Map, and Set types', () => {
389390
class Dto extends LosslessDto {
390-
date!: Date
391-
name!: string
391+
date?: Date
392+
name?: string
393+
map?: Map<string, string>
394+
set?: Set<string>
392395
}
393396
const date = new Date()
394-
const dto = new Dto({ date, name: 'me' })
397+
const dto = createDtoInstance(Dto, { date, name: 'me' })
395398
expect(() => losslessStringify(dto)).toThrow('Date')
396-
const mapDto = new Dto({ map: new Map() })
399+
const mapDto = createDtoInstance(Dto, { map: new Map() })
397400
expect(() => losslessStringify(mapDto)).toThrow('Map')
398-
const setDto = new Dto({ set: new Set() })
401+
const setDto = createDtoInstance(Dto, { set: new Set<string>() })
399402
expect(() => losslessStringify(setDto)).toThrow('Set')
400403
})
404+
405+
test('It correctly handles a number array in a subkey', () => {
406+
const json = `{"message":"Hello from automation","userId":null,"sendTo":[12022907,12022896,12022831]}`
407+
const res = losslessParse(json)
408+
expect(res.sendTo[0]).toBe(12022907)
409+
})

‎src/lib/CreateDtoInstance.ts

+4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
*
44
* This provides a type-safe method to create a DTO instance from a plain object.
55
*
6+
* Node 22's experimental strip types does not play well with the previous "via the constructor" method.
7+
*
8+
* See: https://gist.github.com/jwulf/6e7b093b5b7b3e12c7b76f55b9e4be84
9+
*
610
* @param dtoClass
711
* @param dtoData
812
* @returns

‎src/lib/LosslessJsonParser.ts

+3
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,9 @@ function convertLosslessNumbersToNumberOrThrow<T>(obj: any): T {
262262
if (!obj) {
263263
return obj
264264
}
265+
if (obj instanceof LosslessNumber) {
266+
return toSafeNumberOrThrow(obj.toString()) as T
267+
}
265268
let currentKey = ''
266269
try {
267270
Object.keys(obj).forEach((key) => {

0 commit comments

Comments
 (0)
Please sign in to comment.