diff --git a/cjs/serialize.js b/cjs/serialize.js index 59b2d38..ac6cec1 100644 --- a/cjs/serialize.js +++ b/cjs/serialize.js @@ -119,7 +119,7 @@ const serializer = (strict, json, $, _) => { return index; } case DATE: - return as([TYPE, value.toISOString()], value); + return as([TYPE, isNaN(value.getTime()) ? EMPTY : value.toISOString()], value); case REGEXP: { const {source, flags} = value; return as([TYPE, {source, flags}], value); diff --git a/esm/serialize.js b/esm/serialize.js index 6286047..24cfe2c 100644 --- a/esm/serialize.js +++ b/esm/serialize.js @@ -121,7 +121,7 @@ const serializer = (strict, json, $, _) => { return index; } case DATE: - return as([TYPE, value.toISOString()], value); + return as([TYPE, isNaN(value.getTime()) ? EMPTY : value.toISOString()], value); case REGEXP: { const {source, flags} = value; return as([TYPE, {source, flags}], value); diff --git a/test/index.js b/test/index.js index b5e542d..0277401 100644 --- a/test/index.js +++ b/test/index.js @@ -159,4 +159,13 @@ assert(lossy2[3].size, 0); assert(JSON.stringify(lossy2[4]), '{}'); assert(lossy2[5], 'OK'); +// an Invalid Date must round-trip like native structuredClone instead of throwing +const invalidDate = new Date(NaN); +const invalidViaRecord = deserialize(serialize(invalidDate)); +assert(invalidViaRecord instanceof Date, true); +assert(Number.isNaN(invalidViaRecord.getTime()), true); +const invalidViaJSON = parse(stringify(invalidDate)); +assert(invalidViaJSON instanceof Date, true); +assert(Number.isNaN(invalidViaJSON.getTime()), true); + require('./eval.js');