|
|
"use strict";
|
|
|
|
|
|
// Note: This regex matches even invalid JSON strings, but since we’re
|
|
|
// working on the output of `JSON.stringify` we know that only valid strings
|
|
|
// are present (unless the user supplied a weird `options.indent` but in
|
|
|
// that case we don’t care since the output would be invalid anyway).
|
|
|
var stringOrChar = /("(?:[^\\"]|\\.)*")|[:,]/g;
|
|
|
|
|
|
module.exports = function stringify(passedObj, options) {
|
|
|
var indent, maxLength, replacer;
|
|
|
|
|
|
options = options || {};
|
|
|
indent = JSON.stringify(
|
|
|
[1],
|
|
|
undefined,
|
|
|
options.indent === undefined ? 2 : options.indent
|
|
|
).slice(2, -3);
|
|
|
maxLength =
|
|
|
indent === ""
|
|
|
? Infinity
|
|
|
: options.maxLength === undefined
|
|
|
? 80
|
|
|
: options.maxLength;
|
|
|
replacer = options.replacer;
|
|
|
|
|
|
return (function _stringify(obj, currentIndent, reserved) {
|
|
|
// prettier-ignore
|
|
|
var end, index, items, key, keyPart, keys, length, nextIndent, prettified, start, string, value;
|
|
|
|
|
|
if (obj && typeof obj.toJSON === "function") {
|
|
|
obj = obj.toJSON();
|
|
|
}
|
|
|
|
|
|
string = JSON.stringify(obj, replacer);
|
|
|
|
|
|
if (string === undefined) {
|
|
|
return string;
|
|
|
}
|
|
|
|
|
|
length = maxLength - currentIndent.length - reserved;
|
|
|
|
|
|
if (string.length <= length) {
|
|
|
prettified = string.replace(stringOrChar, function(match, stringLiteral) {
|
|
|
return stringLiteral || match + " ";
|
|
|
});
|
|
|
if (prettified.length <= length) {
|
|
|
return prettified;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (replacer != null) {
|
|
|
obj = JSON.parse(string);
|
|
|
replacer = undefined;
|
|
|
}
|
|
|
|
|
|
if (typeof obj === "object" && obj !== null) {
|
|
|
nextIndent = currentIndent + indent;
|
|
|
items = [];
|
|
|
index = 0;
|
|
|
|
|
|
if (Array.isArray(obj)) {
|
|
|
start = "[";
|
|
|
end = "]";
|
|
|
length = obj.length;
|
|
|
for (; index < length; index++) {
|
|
|
items.push(
|
|
|
_stringify(obj[index], nextIndent, index === length - 1 ? 0 : 1) ||
|
|
|
"null"
|
|
|
);
|
|
|
}
|
|
|
} else {
|
|
|
start = "{";
|
|
|
end = "}";
|
|
|
keys = Object.keys(obj);
|
|
|
length = keys.length;
|
|
|
for (; index < length; index++) {
|
|
|
key = keys[index];
|
|
|
keyPart = JSON.stringify(key) + ": ";
|
|
|
value = _stringify(
|
|
|
obj[key],
|
|
|
nextIndent,
|
|
|
keyPart.length + (index === length - 1 ? 0 : 1)
|
|
|
);
|
|
|
if (value !== undefined) {
|
|
|
items.push(keyPart + value);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (items.length > 0) {
|
|
|
return [start, indent + items.join(",\n" + nextIndent), end].join(
|
|
|
"\n" + currentIndent
|
|
|
);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return string;
|
|
|
})(passedObj, "", 0);
|
|
|
};
|