yamlify-object
Version:
Stringify object/array with yaml syntax
120 lines • 4.99 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var typeOf_js_1 = require("./typeOf.js");
var config_js_1 = require("./config.js");
var getPrefix_js_1 = require("./getPrefix.js");
/**
* value types that not require indent after property name that include the value
*/
var NO_INDENT_TYPES = ['object', 'array'];
function yamlifyObject(target, config) {
var _a = (0, config_js_1.getConfig)(config), colors = _a.colors, prefix = _a.prefix, postfix = _a.postfix, dateToString = _a.dateToString, errorToString = _a.errorToString, indentChars = _a.indent;
var seen = new Map();
/**
* Object to yaml string formatter
*/
function objectProperty(obj, indentLength, inArray) {
if (indentLength === void 0) { indentLength = 1; }
if (inArray === void 0) { inArray = 0; }
if (Object.keys(obj).length === 0) {
return " ".concat(colors.base('{}'));
}
var str = '\n';
var objectPrefix = (0, getPrefix_js_1.getPrefix)(indentLength, indentChars);
Object
.keys(obj)
.forEach(function (name) {
var value = obj[name];
var type = (0, typeOf_js_1.typeOf)(value);
var inArrayPrefix = (0, getPrefix_js_1.getPrefix)(inArray, ' ');
var afterPropsIndent = NO_INDENT_TYPES.includes(type) ? '' : ' ';
var valueString = checkCircular(value)
? " ".concat(colors.base('[Circular]'))
: typifiedString(type, value, indentLength + 1, inArray);
str += "".concat(inArrayPrefix).concat(objectPrefix).concat(colors.base("".concat(name, ":"))).concat(afterPropsIndent).concat(valueString, "\n");
});
return str.substring(0, str.length - 1);
}
/**
* Array to yaml string formatter
*/
function arrayProperty(values, indentLength, inArray) {
if (indentLength === void 0) { indentLength = 1; }
if (inArray === void 0) { inArray = 0; }
if (values.length === 0) {
return " ".concat(colors.base('[]'));
}
var str = '\n';
var arrayPrefix = (0, getPrefix_js_1.getPrefix)(indentLength, indentChars);
values
.forEach(function (value) {
var type = (0, typeOf_js_1.typeOf)(value);
var inArrayPrefix = (0, getPrefix_js_1.getPrefix)(inArray, ' ');
var valueString = checkCircular(value)
? colors.base('[Circular]')
: typifiedString(type, value, indentLength, inArray + 1)
.toString()
.trimLeft();
str += "".concat(inArrayPrefix).concat(arrayPrefix).concat("".concat(colors.base('-'), " ")).concat(valueString, "\n");
});
return str.substring(0, str.length - 1);
}
function typifiedString(type, value, indentLength, inArray) {
switch (type) {
case 'array':
return arrayProperty(value, indentLength, inArray);
case 'object':
return objectProperty(value, indentLength, inArray);
case 'string':
return colors.string(value);
case 'symbol':
return colors.symbol(value.toString());
case 'number':
return colors.number(value);
case 'boolean':
return colors.boolean(value);
case 'null':
return colors.null('null');
case 'undefined':
return colors.undefined('undefined');
case 'date':
return colors.date(dateToString(value));
case 'error':
return colors.error(errorToString(value, (0, getPrefix_js_1.getPrefix)(indentLength, indentChars)));
case 'regexp':
return colors.regexp(value.toString());
default:
if (value && value.toString) {
return value.toString();
}
return Object.prototype.toString.call(value);
}
}
function checkCircular(value) {
if (!['object', 'array'].includes((0, typeOf_js_1.typeOf)(value))) {
return false;
}
if (seen.has(value)) {
return true;
}
seen.set(value, true);
return false;
}
var string = '';
seen.set(target, true);
if ((0, typeOf_js_1.typeOf)(target) === 'object'
&& Object.keys(target).length > 0) {
string = objectProperty(target);
}
else if ((0, typeOf_js_1.typeOf)(target) === 'array'
&& target.length > 0) {
string = arrayProperty(target);
}
if (string.length === 0) {
return '';
}
return "".concat(prefix).concat(string.slice(1)).concat(postfix);
}
exports.default = yamlifyObject;
;
//# sourceMappingURL=index.js.map