UNPKG

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
"use strict"; 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;