"use strict"; exports.Pair = void 0; var _addComment = require("../addComment"); var _constants = require("../constants"); var _toJSON = require("../toJSON"); var _Collection = require("./Collection"); var _Node = require("./Node"); var _Scalar = require("./Scalar"); var _Seq = require("./Seq"); function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } const stringifyKey = (key, jsKey, ctx) => { if (jsKey === null) return ''; if (typeof jsKey !== 'object') return String(jsKey); if (key instanceof _Node.Node && ctx && ctx.doc) return key.toString({ anchors: {}, doc: ctx.doc, indent: '', indentStep: ctx.indentStep, inFlow: true, inStringifyKey: true }); return JSON.stringify(jsKey); }; class Pair extends _Node.Node { constructor(key, value = null) { super(); this.key = key; this.value = value; this.type = Pair.Type.PAIR; } get commentBefore() { return this.key && this.key.commentBefore; } set commentBefore(cb) { if (this.key == null) this.key = new _Scalar.Scalar(null); this.key.commentBefore = cb; } addToJSMap(ctx, map) { const key = (0, _toJSON.toJSON)(this.key, '', ctx); if (map instanceof Map) { const value = (0, _toJSON.toJSON)(this.value, key, ctx); map.set(key, value); } else if (map instanceof Set) { map.add(key); } else { const stringKey = stringifyKey(this.key, key, ctx); map[stringKey] = (0, _toJSON.toJSON)(this.value, stringKey, ctx); } return map; } toJSON(_, ctx) { const pair = ctx && ctx.mapAsMap ? new Map() : {}; return this.addToJSMap(ctx, pair); } toString(ctx, onComment, onChompKeep) { if (!ctx || !ctx.doc) return JSON.stringify(this); const { indent: indentSize, indentSeq, simpleKeys } = ctx.doc.options; let { key, value } = this; let keyComment = key instanceof _Node.Node && key.comment; if (simpleKeys) { if (keyComment) { throw new Error('With simple keys, key nodes cannot have comments'); } if (key instanceof _Collection.Collection) { const msg = 'With simple keys, collection cannot be used as a key value'; throw new Error(msg); } } const explicitKey = !simpleKeys && (!key || keyComment || key instanceof _Collection.Collection || key.type === _constants.Type.BLOCK_FOLDED || key.type === _constants.Type.BLOCK_LITERAL); const { doc, indent, indentStep } = ctx; ctx = Object.assign({}, ctx, { implicitKey: !explicitKey, indent: indent + indentStep }); let chompKeep = false; let str = doc.schema.stringify(key, ctx, () => keyComment = null, () => chompKeep = true); str = (0, _addComment.addComment)(str, ctx.indent, keyComment); if (ctx.allNullValues && !simpleKeys) { if (this.comment) { str = (0, _addComment.addComment)(str, ctx.indent, this.comment); if (onComment) onComment(); } else if (chompKeep && !keyComment && onChompKeep) onChompKeep(); return ctx.inFlow ? str : `? ${str}`; } str = explicitKey ? `? ${str}\n${indent}:` : `${str}:`; if (this.comment) { // expected (but not strictly required) to be a single-line comment str = (0, _addComment.addComment)(str, ctx.indent, this.comment); if (onComment) onComment(); } let vcb = ''; let valueComment = null; if (value instanceof _Node.Node) { if (value.spaceBefore) vcb = '\n'; if (value.commentBefore) { const cs = value.commentBefore.replace(/^/gm, `${ctx.indent}#`); vcb += `\n${cs}`; } valueComment = value.comment; } else if (value && typeof value === 'object') { value = doc.schema.createNode(value, true); } ctx.implicitKey = false; if (!explicitKey && !this.comment && value instanceof _Scalar.Scalar) ctx.indentAtStart = str.length + 1; chompKeep = false; if (!indentSeq && indentSize >= 2 && !ctx.inFlow && !explicitKey && value instanceof _Seq.YAMLSeq && value.type !== _constants.Type.FLOW_SEQ && !value.tag && !doc.anchors.getName(value)) { // If indentSeq === false, consider '- ' as part of indentation where possible ctx.indent = ctx.indent.substr(2); } const valueStr = doc.schema.stringify(value, ctx, () => valueComment = null, () => chompKeep = true); let ws = ' '; if (vcb || this.comment) { ws = `${vcb}\n${ctx.indent}`; } else if (!explicitKey && value instanceof _Collection.Collection) { const flow = valueStr[0] === '[' || valueStr[0] === '{'; if (!flow || valueStr.includes('\n')) ws = `\n${ctx.indent}`; } if (chompKeep && !valueComment && onChompKeep) onChompKeep(); return (0, _addComment.addComment)(str + ws + valueStr, ctx.indent, valueComment); } } exports.Pair = Pair; _defineProperty(Pair, "Type", { PAIR: 'PAIR', MERGE_PAIR: 'MERGE_PAIR' });