yaml-diff-patch
Version:
Apply a JSON diff/patch to YAML while preserving whitespace, comments and overall structure
87 lines (86 loc) • 2.75 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseSafeIndex = exports.cloneNode = exports.copyProperties = exports.toAstValue = exports.isScalar = exports.isYamlSeq = exports.isYamlMap = void 0;
const yaml_1 = require("yaml");
function isYamlMap(value) {
return !value ? false : (0, yaml_1.isMap)(value);
}
exports.isYamlMap = isYamlMap;
function isYamlSeq(value) {
return !value ? false : (0, yaml_1.isSeq)(value);
}
exports.isYamlSeq = isYamlSeq;
function isScalar(value) {
if (value == null ||
typeof value === 'boolean' ||
typeof value === 'number' ||
typeof value === 'string')
return true;
return false;
}
exports.isScalar = isScalar;
function toAstValue(value) {
if (isScalar(value))
return new yaml_1.Scalar(value);
else if (Array.isArray(value)) {
const arr = new yaml_1.YAMLSeq();
arr.items = value.map(elem => toAstValue(elem));
return arr;
}
else if (typeof value === 'object') {
const obj = new yaml_1.YAMLMap();
obj.items = Object.entries(value)
.map(([key, value]) => new yaml_1.Pair(key, toAstValue(value)));
return obj;
}
else
throw new Error(`Invalid type: ${typeof value}`);
}
exports.toAstValue = toAstValue;
function copyProperties(target, source) {
target.comment = source.comment;
target.commentBefore = source.commentBefore;
target.spaceBefore = source.spaceBefore;
target.tag = source.tag;
// target.type = source.type;
}
exports.copyProperties = copyProperties;
function cloneNode(node) {
if (!node)
return node;
if ((0, yaml_1.isScalar)(node)) {
const ret = node.clone();
copyProperties(ret, node);
return ret;
}
else if (isYamlMap(node)) {
const ret = new yaml_1.YAMLMap();
ret.flow = node.flow;
copyProperties(ret, node);
node.items.map(pair => {
const newPair = new yaml_1.Pair(pair.key, cloneNode(pair.value));
ret.add(newPair);
});
return ret;
}
else if (isYamlSeq(node)) {
const ret = new yaml_1.YAMLSeq();
ret.flow = node.flow;
copyProperties(ret, node);
node.items.forEach(elem => {
ret.add(cloneNode(elem));
});
return ret;
}
else
throw new Error(`Cannot clone unknown type "${node.type}"`);
}
exports.cloneNode = cloneNode;
// Gets the index as a number (and <length> if index is '-')
function parseSafeIndex(index, length) {
if (index === '-')
return length;
const num = parseInt(index);
return (num < 0 || num > length) ? NaN : num;
}
exports.parseSafeIndex = parseSafeIndex;
;