wallet-core/node_modules/stringify-object/index.js
2016-10-10 03:43:44 +02:00

114 lines
2.9 KiB
JavaScript

'use strict';
var isRegexp = require('is-regexp');
var isPlainObj = require('is-plain-obj');
module.exports = function (val, opts, pad) {
var seen = [];
return (function stringify(val, opts, pad) {
opts = opts || {};
opts.indent = opts.indent || '\t';
pad = pad || '';
var tokens;
if(opts.inlineCharacterLimit == void 0) {
tokens = {
newLine: '\n',
newLineOrSpace: '\n',
pad: pad,
indent: pad + opts.indent
};
} else {
tokens = {
newLine: '@@__STRINGIFY_OBJECT_NEW_LINE__@@',
newLineOrSpace: '@@__STRINGIFY_OBJECT_NEW_LINE_OR_SPACE__@@',
pad: '@@__STRINGIFY_OBJECT_PAD__@@',
indent: '@@__STRINGIFY_OBJECT_INDENT__@@'
}
}
var expandWhiteSpace = function(string) {
if (opts.inlineCharacterLimit == void 0) { return string; }
var oneLined = string.
replace(new RegExp(tokens.newLine, 'g'), '').
replace(new RegExp(tokens.newLineOrSpace, 'g'), ' ').
replace(new RegExp(tokens.pad + '|' + tokens.indent, 'g'), '');
if(oneLined.length <= opts.inlineCharacterLimit) {
return oneLined;
} else {
return string.
replace(new RegExp(tokens.newLine + '|' + tokens.newLineOrSpace, 'g'), '\n').
replace(new RegExp(tokens.pad, 'g'), pad).
replace(new RegExp(tokens.indent, 'g'), pad + opts.indent);
}
};
if (seen.indexOf(val) !== -1) {
return '"[Circular]"';
}
if (val === null ||
val === undefined ||
typeof val === 'number' ||
typeof val === 'boolean' ||
typeof val === 'function' ||
isRegexp(val)) {
return String(val);
}
if (val instanceof Date) {
return 'new Date(\'' + val.toISOString() + '\')';
}
if (Array.isArray(val)) {
if (val.length === 0) {
return '[]';
}
seen.push(val);
var ret = '[' + tokens.newLine + val.map(function (el, i) {
var eol = val.length - 1 === i ? tokens.newLine : ',' + tokens.newLineOrSpace;
return tokens.indent + stringify(el, opts, pad + opts.indent) + eol;
}).join('') + tokens.pad + ']';
seen.pop(val);
return expandWhiteSpace(ret);
}
if (isPlainObj(val)) {
var objKeys = Object.keys(val);
if (objKeys.length === 0) {
return '{}';
}
seen.push(val);
var ret = '{' + tokens.newLine + objKeys.map(function (el, i) {
if (opts.filter && !opts.filter(val, el)) {
return '';
}
var eol = objKeys.length - 1 === i ? tokens.newLine : ',' + tokens.newLineOrSpace;
var key = /^[a-z$_][a-z$_0-9]*$/i.test(el) ? el : stringify(el, opts);
return tokens.indent + key + ': ' + stringify(val[el], opts, pad + opts.indent) + eol;
}).join('') + tokens.pad + '}';
seen.pop(val);
return expandWhiteSpace(ret);
}
val = String(val).replace(/[\r\n]/g, function (x) {
return x === '\n' ? '\\n' : '\\r';
});
if (opts.singleQuotes === false) {
return '"' + val.replace(/"/g, '\\\"') + '"';
}
return '\'' + val.replace(/'/g, '\\\'') + '\'';
})(val, opts, pad);
};