Skip to content

Commit aaa3c76

Browse files
authored
Stopped undefined reviver return value from deleting undefined values. Trimmed whitespace from context.source. (#8)
1 parent 9734c27 commit aaa3c76

File tree

5 files changed

+19
-28
lines changed

5 files changed

+19
-28
lines changed

CHANGELOG.md

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,6 @@
1-
### 4.2.5
1+
### 4.2.1-4.2.6
22

3-
* Fixed reviver bug that prevented revival of type containers.
4-
5-
### 4.2.4
6-
7-
* Fixed a reviver bug with quoted property names.
8-
9-
### 4.2.3
10-
11-
* Fixed a reviver bug with non-primitive arguments of function types.
12-
13-
### 4.2.2
14-
15-
* Fixed a couple of bugs related to performing deletions of array/object elements via replacer or reviver functions.
16-
17-
### 4.2.1
18-
19-
* Documentation-only update, clarifying replacer and reviver functions.
3+
* Fixed assorted replacer/reviver bugs.
204

215
### 4.2.0
226

lib/parse.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ const util = require('./util');
22
const big = require('./bignumber-util');
33
const optionsMgr = require('./options-manager');
44
const { isBigNumber } = require('./bignumber-util');
5-
const { ValueSourceWrapper } = require('./util');
5+
const { ValueSourceWrapper, unwrap } = require('./util');
66

77
const QUOTE_NONE = 0;
88
const QUOTE_SINGLE = 1;
@@ -1205,9 +1205,10 @@ module.exports = function parse(text, reviver, newOptions) {
12051205
const keys = Object.keys(value).reverse();
12061206

12071207
for (const key of keys) {
1208+
const original = unwrap(value[key]);
12081209
const replacement = internalize(value, key, reviver);
12091210

1210-
if (replacement === undefined || replacement === util.DELETE) {
1211+
if ((replacement === undefined && original !== undefined) || replacement === util.DELETE) {
12111212
if (!Array.isArray(value) || key < value.length - 1) {
12121213
delete value[key];
12131214
}
@@ -1294,7 +1295,7 @@ module.exports = function parse(text, reviver, newOptions) {
12941295

12951296
if (reviver && parseState !== 'beforePropertyName') {
12961297
token.offset = savedLastPos;
1297-
token.source = source.slice(savedLastPos, pos);
1298+
token.source = source.slice(savedLastPos, pos).trim();
12981299
token.value = new ValueSourceWrapper(value, token.source);
12991300
}
13001301

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.5",
3+
"version": "4.2.6",
44
"description": "JSON for everyone.",
55
"main": "lib/index.min.js",
66
"types": "lib/index.d.ts",

test/parse.spec.mjs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -569,15 +569,15 @@ it('parse(text, reviver)', () => {
569569
);
570570

571571
expect(
572-
JSONZ.parse('{a:1,b:2}', (k, v) => (k === 'a') ? JSONZ.DELETE : v)).to.deep.equal(
572+
JSONZ.parse('{a:1,b:2,c:undefined}', (k, v) => (k && k !== 'b') ? JSONZ.DELETE : v)).to.deep.equal(
573573
{ b: 2 },
574574
'JSONZ.DELETE deletes property values'
575575
);
576576

577577
expect(
578-
JSONZ.parse('{a:1,b:2}', (k, v) => (k === 'a') ? undefined : v)).to.deep.equal(
579-
{ b: 2 },
580-
'`undefined` deletes property values'
578+
JSONZ.parse('{a:1,b:2,c:undefined}', (k, v) => (k && k !== 'b') ? undefined : v)).to.deep.equal(
579+
{ b: 2, c: undefined },
580+
'`undefined` deletes property values (but not already undefined values)'
581581
);
582582

583583
expect(
@@ -669,6 +669,12 @@ it('parse(text, reviver) special cases', () => {
669669
'should not modify BigDecimal values'
670670
);
671671

672+
expect(
673+
JSONZ.stringify(JSONZ.parse('[ 4,5 , 6 , 7]', (k, v, context) => context.source || v))).to.equal(
674+
"['4','5','6','7']",
675+
'no white space included in source'
676+
);
677+
672678
expect(
673679
JSONZ.stringify(JSONZ.parse('[11,+11.,13,"q",`q`]',
674680
(k, v, context, noContext) => {

0 commit comments

Comments
 (0)