Skip to content

Commit e978a1b

Browse files
fix: serialize Dates with expanded ISO years (#232)
1 parent 2864b3c commit e978a1b

2 files changed

Lines changed: 15 additions & 1 deletion

File tree

‎index.js‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ module.exports = function serialize(obj, options) {
323323
if (type === 'D') {
324324
// Validate ISO string format to prevent code injection via spoofed toISOString()
325325
var isoStr = String(dates[valueIndex].toISOString());
326-
if (!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{3})?Z$/.test(isoStr)) {
326+
if (!/^(?:\d{4}|[+-]\d{6})-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{3})?Z$/.test(isoStr)) {
327327
throw new TypeError('Invalid Date ISO string');
328328
}
329329
return "new Date(\"" + isoStr + "\")";

‎test/unit/expanded-date-years.js‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
const { describe, it } = require('node:test');
2+
const { strictEqual } = require('node:assert');
3+
const serialize = require('../../');
4+
5+
describe('Dates with expanded ISO years', function () {
6+
for (const timestamp of [-8640000000000000, -62198755200000, 253402300800000, 8640000000000000]) {
7+
it('round trips timestamp ' + timestamp, function () {
8+
const date = new Date(timestamp);
9+
const decoded = eval('(' + serialize(date) + ')');
10+
strictEqual(decoded.getTime(), date.getTime());
11+
strictEqual(decoded.toISOString(), date.toISOString());
12+
});
13+
}
14+
});

0 commit comments

Comments
 (0)