@dipscope/type-manager
Version:
Transform JSON strings or plain objects into JS class instances.
62 lines • 2.37 kB
JavaScript
export function jsonStringify(x, replacer, space) {
var spacing = typeof space === 'number' ? new Array(isFinite(space) ? space + 1 : 0).join(' ') : (space !== null && space !== void 0 ? space : '');
var separator = spacing ? ': ' : ':';
var seen = new Set();
var indents = [''];
var indentify = function (level) {
while (indents.length <= level) {
indents.push(indents[indents.length - 1] + spacing);
}
return indents[level];
};
var stringify = function (parent, key, node, level) {
if (node && node.toJSON && typeof node.toJSON === 'function') {
node = node.toJSON();
}
if (replacer) {
node = replacer.call(parent, key, node);
}
if (node === undefined) {
return '';
}
if (node === null) {
return 'null';
}
if (typeof node === 'number') {
return isFinite(node) ? String(node) : 'null';
}
if (typeof node !== 'object') {
return JSON.stringify(node);
}
if (seen.has(node)) {
return 'null';
}
seen.add(node);
var indent = spacing ? '\n' + indentify(level + 1) : '';
var closingIndent = spacing ? '\n' + indentify(level) : '';
var parts = new Array();
if (Array.isArray(node)) {
for (var i = 0; i < node.length; i++) {
var value = stringify(node, String(i), node[i], level + 1) || 'null';
parts.push("".concat(indent).concat(value));
}
var result_1 = "[".concat(parts.join(',')).concat(closingIndent, "]");
seen.delete(node);
return result_1;
}
var nodeKeys = Object.keys(node).sort();
for (var i = 0; i < nodeKeys.length; i++) {
var nodeKey = nodeKeys[i];
var value = stringify(node, nodeKey, node[nodeKey], level + 1);
if (value === '') {
continue;
}
parts.push("".concat(indent).concat(JSON.stringify(nodeKey)).concat(separator).concat(value));
}
var result = "{".concat(parts.join(',')).concat(closingIndent, "}");
seen.delete(node);
return result;
};
return stringify({ '': x }, '', x, 0);
}
//# sourceMappingURL=json-stringify.js.map