-
Notifications
You must be signed in to change notification settings - Fork 11
/
json.js
80 lines (70 loc) · 2.38 KB
/
json.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/*
** Copyright 2020 Bloomberg Finance L.P.
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
import { Record } from "./record";
import { createTupleFromIterableObject } from "./tuple";
import { isRecord, isTuple, validateProperty } from "./utils";
const JSON$stringify = JSON.stringify;
const JSON$parse = JSON.parse;
export function stringify(value, replacer, space) {
let props;
if (Array.isArray(replacer)) {
props = new Set();
replacer.forEach(v => {
if (
typeof v === "string" ||
typeof v === "number" ||
v instanceof Number ||
v instanceof String
) {
props.add(String(v));
}
});
}
let isTopLevel = true;
return JSON$stringify(
value,
function stringifyReplacer(key, val) {
if (props && !isTopLevel && !props.has(key)) {
return undefined;
}
isTopLevel = false; // The top-level value is never excluded
if (typeof replacer === "function") {
val = replacer.call(this, key, val);
}
if (isRecord(val)) return { ...val };
else if (isTuple(val)) return Array.from(val);
return val;
},
space,
);
}
export function parseImmutable(text, reviver) {
return JSON$parse(text, function parseImmutableReviver(key, value) {
if (typeof value === "object") {
if (Array.isArray(value)) {
value = createTupleFromIterableObject(value);
} else if (value !== null) {
value = Record(value);
}
}
// This should check IsCallable(reviver)
if (typeof reviver === "function") {
value = reviver(key, value);
validateProperty(value);
}
return value;
});
}