diff --git a/__tests__/index.test.ts b/__tests__/index.test.ts index 3875857..a32be3d 100644 --- a/__tests__/index.test.ts +++ b/__tests__/index.test.ts @@ -169,6 +169,16 @@ describe("simple serialization", () => { expect(deserialized).toBeInstanceOf(Uint8Array); expect(new Uint8Array(deserialized)).toStrictEqual(new Uint8Array(buf)); }) + + it("preserves Invalid Date values through serialization", () => { + let invalidDate = new Date(NaN); + let serialized = serialize(invalidDate); + expect(serialized).toBe('["date",null]'); + + let deserialized = deserialize(serialized) as Date; + expect(deserialized).toBeInstanceOf(Date); + expect(Number.isNaN(deserialized.getTime())).toBe(true); + }) }); // ======================================================================================= diff --git a/src/serialize.ts b/src/serialize.ts index 11bf830..d7e913a 100644 --- a/src/serialize.ts +++ b/src/serialize.ts @@ -142,8 +142,10 @@ export class Devaluator { case "bigint": return ["bigint", (value).toString()]; - case "date": - return ["date", (value).getTime()]; + case "date": { + const time = (value).getTime(); + return ["date", Number.isNaN(time) ? null : time]; + } case "bytes": { let bytes = value as Uint8Array; @@ -496,6 +498,9 @@ export class Evaluator { } break; case "date": + if (value[1] === null) { + return new Date(NaN); + } if (typeof value[1] == "number") { return new Date(value[1]); }