93 lines
4.6 KiB
JavaScript
93 lines
4.6 KiB
JavaScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
(function (factory) {
|
|
if (typeof module === "object" && typeof module.exports === "object") {
|
|
var v = factory(require, exports);
|
|
if (v !== undefined) module.exports = v;
|
|
}
|
|
else if (typeof define === "function" && define.amd) {
|
|
define(["require", "exports"], factory);
|
|
}
|
|
})(function (require, exports) {
|
|
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.stringifyObject = void 0;
|
|
function stringifyObject(obj, indent, stringifyLiteral, settings, depth = 0, consecutiveArrays = 0) {
|
|
if (obj !== null && typeof obj === 'object') {
|
|
/**
|
|
* When we are autocompleting a snippet from a property we need the indent so everything underneath the property
|
|
* is properly indented. When we are auto completion from a value we don't want the indent because the cursor
|
|
* is already in the correct place
|
|
*/
|
|
const newIndent = (depth === 0 && settings.shouldIndentWithTab) || depth > 0 ? indent + settings.indentation : '';
|
|
if (Array.isArray(obj)) {
|
|
consecutiveArrays += 1;
|
|
if (obj.length === 0) {
|
|
return '';
|
|
}
|
|
let result = '';
|
|
for (let i = 0; i < obj.length; i++) {
|
|
let pseudoObj = obj[i];
|
|
if (typeof obj[i] !== 'object') {
|
|
result += '\n' + newIndent + '- ' + stringifyLiteral(obj[i]);
|
|
continue;
|
|
}
|
|
if (!Array.isArray(obj[i])) {
|
|
pseudoObj = prependToObject(obj[i], consecutiveArrays);
|
|
}
|
|
result += stringifyObject(pseudoObj, indent, stringifyLiteral, settings, (depth += 1), consecutiveArrays);
|
|
}
|
|
return result;
|
|
}
|
|
else {
|
|
const keys = Object.keys(obj);
|
|
if (keys.length === 0) {
|
|
return '';
|
|
}
|
|
let result = (depth === 0 && settings.newLineFirst) || depth > 0 ? '\n' : '';
|
|
let isFirstProp = true;
|
|
for (let i = 0; i < keys.length; i++) {
|
|
const key = keys[i];
|
|
if (depth === 0 && settings.existingProps.includes(key)) {
|
|
// Don't add existing properties to the YAML
|
|
continue;
|
|
}
|
|
const isObject = typeof obj[key] === 'object';
|
|
const colonDelimiter = isObject ? ':' : ': '; // add space only when value is primitive
|
|
const parentArrayCompensation = isObject && /^\s|-/.test(key) ? settings.indentation : ''; // add extra space if parent is an array
|
|
const objectIndent = newIndent + parentArrayCompensation;
|
|
const lineBreak = isFirstProp ? '' : '\n'; // break line only if it's not the first property
|
|
// The first child of an array needs to be treated specially, otherwise indentations will be off
|
|
if (depth === 0 && isFirstProp && !settings.indentFirstObject) {
|
|
const value = stringifyObject(obj[key], objectIndent, stringifyLiteral, settings, depth + 1, 0);
|
|
result += lineBreak + indent + key + colonDelimiter + value;
|
|
}
|
|
else {
|
|
const value = stringifyObject(obj[key], objectIndent, stringifyLiteral, settings, depth + 1, 0);
|
|
result += lineBreak + newIndent + key + colonDelimiter + value;
|
|
}
|
|
isFirstProp = false;
|
|
}
|
|
return result;
|
|
}
|
|
}
|
|
return stringifyLiteral(obj);
|
|
}
|
|
exports.stringifyObject = stringifyObject;
|
|
function prependToObject(obj, consecutiveArrays) {
|
|
const newObj = {};
|
|
for (let i = 0; i < Object.keys(obj).length; i++) {
|
|
const key = Object.keys(obj)[i];
|
|
if (i === 0) {
|
|
newObj['- '.repeat(consecutiveArrays) + key] = obj[key];
|
|
}
|
|
else {
|
|
newObj[' '.repeat(consecutiveArrays) + key] = obj[key];
|
|
}
|
|
}
|
|
return newObj;
|
|
}
|
|
});
|
|
//# sourceMappingURL=json.js.map
|