| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- "use strict";
-
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.default = void 0;
-
- var _constants = require("../constants");
-
- var _errors = require("../errors");
-
- var _BlankLine = _interopRequireDefault(require("./BlankLine"));
-
- var _Comment = _interopRequireDefault(require("./Comment"));
-
- var _Node = _interopRequireDefault(require("./Node"));
-
- var _Range = _interopRequireDefault(require("./Range"));
-
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
- class FlowCollection extends _Node.default {
- constructor(type, props) {
- super(type, props);
- this.items = null;
- }
-
- prevNodeIsJsonLike(idx = this.items.length) {
- const node = this.items[idx - 1];
- return !!node && (node.jsonLike || node.type === _constants.Type.COMMENT && this.nodeIsJsonLike(idx - 1));
- }
- /**
- * @param {ParseContext} context
- * @param {number} start - Index of first character
- * @returns {number} - Index of the character after this
- */
-
-
- parse(context, start) {
- this.context = context;
- const {
- parseNode,
- src
- } = context;
- let {
- indent,
- lineStart
- } = context;
- let char = src[start]; // { or [
-
- this.items = [{
- char,
- offset: start
- }];
-
- let offset = _Node.default.endOfWhiteSpace(src, start + 1);
-
- char = src[offset];
-
- while (char && char !== ']' && char !== '}') {
- switch (char) {
- case '\n':
- {
- lineStart = offset + 1;
-
- const wsEnd = _Node.default.endOfWhiteSpace(src, lineStart);
-
- if (src[wsEnd] === '\n') {
- const blankLine = new _BlankLine.default();
- lineStart = blankLine.parse({
- src
- }, lineStart);
- this.items.push(blankLine);
- }
-
- offset = _Node.default.endOfIndent(src, lineStart);
-
- if (offset <= lineStart + indent) {
- char = src[offset];
-
- if (offset < lineStart + indent || char !== ']' && char !== '}') {
- const msg = 'Insufficient indentation in flow collection';
- this.error = new _errors.YAMLSemanticError(this, msg);
- }
- }
- }
- break;
-
- case ',':
- {
- this.items.push({
- char,
- offset
- });
- offset += 1;
- }
- break;
-
- case '#':
- {
- const comment = new _Comment.default();
- offset = comment.parse({
- src
- }, offset);
- this.items.push(comment);
- }
- break;
-
- case '?':
- case ':':
- {
- const 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,
- offset
- });
- offset += 1;
- break;
- }
- }
- // fallthrough
-
- default:
- {
- const node = parseNode({
- atLineStart: false,
- inCollection: false,
- inFlow: true,
- indent: -1,
- lineStart,
- parent: this
- }, offset);
-
- if (!node) {
- // at next document start
- this.valueRange = new _Range.default(start, offset);
- return offset;
- }
-
- this.items.push(node);
- offset = _Node.default.normalizeOffset(src, node.range.end);
- }
- }
-
- offset = _Node.default.endOfWhiteSpace(src, offset);
- char = src[offset];
- }
-
- this.valueRange = new _Range.default(start, offset + 1);
-
- if (char) {
- this.items.push({
- char,
- offset
- });
- offset = _Node.default.endOfWhiteSpace(src, offset + 1);
- offset = this.parseComment(offset);
- }
-
- return offset;
- }
-
- setOrigRanges(cr, offset) {
- offset = super.setOrigRanges(cr, offset);
- this.items.forEach(node => {
- if (node instanceof _Node.default) {
- offset = node.setOrigRanges(cr, offset);
- } else if (cr.length === 0) {
- node.origOffset = node.offset;
- } else {
- let i = offset;
-
- while (i < cr.length) {
- if (cr[i] > node.offset) break;else ++i;
- }
-
- node.origOffset = node.offset + i;
- offset = i;
- }
- });
- return offset;
- }
-
- toString() {
- const {
- context: {
- src
- },
- items,
- range,
- value
- } = this;
- if (value != null) return value;
- const nodes = items.filter(item => item instanceof _Node.default);
- let str = '';
- let prevEnd = range.start;
- nodes.forEach(node => {
- const 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.default.addStringTerminator(src, range.end, str);
- }
-
- }
-
- exports.default = FlowCollection;
|