import _classCallCheck from "@babel/runtime/helpers/classCallCheck"; import _createClass from "@babel/runtime/helpers/createClass"; import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn"; import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf"; import _get from "@babel/runtime/helpers/get"; import _inherits from "@babel/runtime/helpers/inherits"; import { Type } from '../constants'; import { YAMLSemanticError } from '../errors'; import BlankLine from './BlankLine'; import Comment from './Comment'; import Node from './Node'; import Range from './Range'; var FlowCollection = /*#__PURE__*/function (_Node) { _inherits(FlowCollection, _Node); function FlowCollection(type, props) { var _this; _classCallCheck(this, FlowCollection); _this = _possibleConstructorReturn(this, _getPrototypeOf(FlowCollection).call(this, type, props)); _this.items = null; return _this; } _createClass(FlowCollection, [{ key: "prevNodeIsJsonLike", value: function prevNodeIsJsonLike() { var idx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.items.length; var node = this.items[idx - 1]; return !!node && (node.jsonLike || node.type === Type.COMMENT && this.nodeIsJsonLike(idx - 1)); } /** * @param {ParseContext} context * @param {number} start - Index of first character * @returns {number} - Index of the character after this */ }, { key: "parse", value: function parse(context, start) { this.context = context; var parseNode = context.parseNode, src = context.src; var indent = context.indent, lineStart = context.lineStart; var char = src[start]; // { or [ this.items = [{ char: char, offset: start }]; var offset = Node.endOfWhiteSpace(src, start + 1); char = src[offset]; while (char && char !== ']' && char !== '}') { switch (char) { case '\n': { lineStart = offset + 1; var wsEnd = Node.endOfWhiteSpace(src, lineStart); if (src[wsEnd] === '\n') { var blankLine = new BlankLine(); lineStart = blankLine.parse({ src: src }, lineStart); this.items.push(blankLine); } offset = Node.endOfIndent(src, lineStart); if (offset <= lineStart + indent) { char = src[offset]; if (offset < lineStart + indent || char !== ']' && char !== '}') { var msg = 'Insufficient indentation in flow collection'; this.error = new YAMLSemanticError(this, msg); } } } break; case ',': { this.items.push({ char: char, offset: offset }); offset += 1; } break; case '#': { var comment = new Comment(); offset = comment.parse({ src: src }, offset); this.items.push(comment); } break; case '?': case ':': { var next = src[offset + 1]; if (next === '\n' || next === '\t' || next === ' ' || next === ',' || // in-flow : after JSON-like key does not need to be followed by whitespace char === ':' && this.prevNodeIsJsonLike()) { this.items.push({ char: char, offset: offset }); offset += 1; break; } } // fallthrough default: { var node = parseNode({ atLineStart: false, inCollection: false, inFlow: true, indent: -1, lineStart: lineStart, parent: this }, offset); if (!node) { // at next document start this.valueRange = new Range(start, offset); return offset; } this.items.push(node); offset = Node.normalizeOffset(src, node.range.end); } } offset = Node.endOfWhiteSpace(src, offset); char = src[offset]; } this.valueRange = new Range(start, offset + 1); if (char) { this.items.push({ char: char, offset: offset }); offset = Node.endOfWhiteSpace(src, offset + 1); offset = this.parseComment(offset); } return offset; } }, { key: "setOrigRanges", value: function setOrigRanges(cr, offset) { offset = _get(_getPrototypeOf(FlowCollection.prototype), "setOrigRanges", this).call(this, cr, offset); this.items.forEach(function (node) { if (node instanceof Node) { offset = node.setOrigRanges(cr, offset); } else if (cr.length === 0) { node.origOffset = node.offset; } else { var i = offset; while (i < cr.length) { if (cr[i] > node.offset) break;else ++i; } node.origOffset = node.offset + i; offset = i; } }); return offset; } }, { key: "toString", value: function toString() { var src = this.context.src, items = this.items, range = this.range, value = this.value; if (value != null) return value; var nodes = items.filter(function (item) { return item instanceof Node; }); var str = ''; var prevEnd = range.start; nodes.forEach(function (node) { var prefix = src.slice(prevEnd, node.range.start); prevEnd = node.range.end; str += prefix + String(node); if (str[str.length - 1] === '\n' && src[prevEnd - 1] !== '\n' && src[prevEnd] === '\n') { // Comment range does not include the terminal newline, but its // stringified value does. Without this fix, newlines at comment ends // get duplicated. prevEnd += 1; } }); str += src.slice(prevEnd, range.end); return Node.addStringTerminator(src, range.end, str); } }]); return FlowCollection; }(Node); export { FlowCollection as default };