Skip to content

Commit 9734c27

Browse files
authored
Fixed reviver bug that prevented revival of type containers. (#7)
1 parent 0b50a23 commit 9734c27

File tree

7 files changed

+32
-17
lines changed

7 files changed

+32
-17
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
### 4.2.5
2+
3+
* Fixed reviver bug that prevented revival of type containers.
4+
15
### 4.2.4
26

37
* Fixed a reviver bug with quoted property names.

lib/options-manager.js

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
const big = require('./bignumber-util');
22
const util = require('./util');
33
const platform = require('./platform-specifics');
4-
const { ValueSourceWrapper } = require('./util');
4+
const { unwrap } = require('./util');
55

66
let globalOptions = {};
77
let globalParseOptions = {};
@@ -255,15 +255,12 @@ module.exports = {
255255
let typeName;
256256
let container = false;
257257

258-
/* istanbul ignore next */ // This isn't currently being hit, but I feel better leaving it in for safety.
259-
if (value instanceof ValueSourceWrapper) {
260-
value = value.value;
261-
}
258+
value = unwrap(value);
262259

263260
if (util.isTypeContainer(typeNameOrContainer)) {
264261
container = true;
265-
typeName = typeNameOrContainer._$_;
266-
value = typeNameOrContainer._$_value;
262+
typeName = unwrap(typeNameOrContainer._$_);
263+
value = unwrap(typeNameOrContainer._$_value);
267264
}
268265
else {
269266
typeName = typeNameOrContainer;

lib/parse.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1180,10 +1180,10 @@ module.exports = function parse(text, reviver, newOptions) {
11801180
parseStates[parseState]();
11811181
} while (token.type !== 'eof');
11821182

1183-
if (typeof reviver === 'function') {
1183+
if (reviver) {
11841184
const result = internalize({ '': root }, '', reviver);
11851185

1186-
return result === util.DELETE ? undefined : result;
1186+
root = result === util.DELETE ? undefined : result;
11871187
}
11881188

11891189
if (reviveTypedContainers && util.isTypeContainer(root)) {
@@ -1292,7 +1292,7 @@ module.exports = function parse(text, reviver, newOptions) {
12921292
const savedLastPos = lastPos;
12931293
const token = newToken(type, value);
12941294

1295-
if (typeof reviver === 'function' && parseState !== 'beforePropertyName') {
1295+
if (reviver && parseState !== 'beforePropertyName') {
12961296
token.offset = savedLastPos;
12971297
token.source = source.slice(savedLastPos, pos);
12981298
token.value = new ValueSourceWrapper(value, token.source);
@@ -1557,7 +1557,7 @@ module.exports = function parse(text, reviver, newOptions) {
15571557
let revived;
15581558

15591559
try {
1560-
const arg = typeof reviver === 'function' ? internalize({ '': current.arg }, '', reviver) : current.arg;
1560+
const arg = reviver ? internalize({ '': current.arg }, '', reviver) : current.arg;
15611561

15621562
revived = optionsMgr.reviveTypeValue(current.name, arg);
15631563
}

lib/util.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,14 @@ module.exports = {
6161
obj.hasOwnProperty('_$_value') && Object.keys(obj).length === 2;
6262
},
6363

64+
unwrap(obj) {
65+
if (obj instanceof ValueSourceWrapper) {
66+
return obj.value;
67+
}
68+
69+
return obj;
70+
},
71+
6472
LITERALLY_AS: function (value) {
6573
return new LITERALLY_AS(value);
6674
},

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "json-z",
3-
"version": "4.2.4",
3+
"version": "4.2.5",
44
"description": "JSON for everyone.",
55
"main": "lib/index.min.js",
66
"types": "lib/index.d.ts",

test/parse.spec.mjs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -652,9 +652,15 @@ it('parse(text, reviver)', () => {
652652

653653
it('parse(text, reviver) special cases', () => {
654654
expect(
655-
JSONZ.stringify(JSONZ.parse('{a:12.34d}', (k, v) => typeof v === 'number' ? 88 : v))).to.equal(
656-
'{a:12.34d}',
657-
'should not modify Decimal values'
655+
JSONZ.stringify(JSONZ.parse('[{_$_:"Date",_$_value:"2025-06-01T00:00:00.000Z"}]', (k, v) => v))).to.equal(
656+
"[_Date('2025-06-01T00:00:00.000Z')]",
657+
'should convert type container to Date'
658+
);
659+
660+
expect(
661+
JSONZ.stringify(JSONZ.parse('{_$_:"Date",_$_value:"2025-06-01T00:00:00.000Z"}', (k, v) => v))).to.equal(
662+
"_Date('2025-06-01T00:00:00.000Z')",
663+
'should convert type container at root to Date'
658664
);
659665

660666
expect(

0 commit comments

Comments
 (0)