yaml 1.8.3 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/README.md +4 -4
  2. package/browser/dist/PlainValue-ff5147c6.js +1277 -0
  3. package/browser/dist/Schema-2bf2c74e.js +679 -0
  4. package/browser/dist/index.js +923 -38
  5. package/browser/dist/legacy-exports.js +3 -0
  6. package/browser/dist/parse-cst.js +1904 -0
  7. package/browser/dist/resolveSeq-04825f30.js +2373 -0
  8. package/browser/dist/types.js +4 -0
  9. package/browser/dist/util.js +2 -0
  10. package/browser/dist/warnings-0e4b70d3.js +499 -0
  11. package/browser/index.js +1 -1
  12. package/browser/map.js +2 -2
  13. package/browser/pair.js +2 -2
  14. package/browser/parse-cst.js +1 -1
  15. package/browser/scalar.js +2 -2
  16. package/browser/schema.js +8 -6
  17. package/browser/seq.js +2 -2
  18. package/browser/types/binary.js +3 -2
  19. package/browser/types/omap.js +3 -2
  20. package/browser/types/pairs.js +3 -2
  21. package/browser/types/set.js +3 -2
  22. package/browser/types/timestamp.js +6 -6
  23. package/browser/types.js +1 -11
  24. package/browser/util.js +1 -15
  25. package/dist/Document-2cf6b08c.js +757 -0
  26. package/dist/PlainValue-ec8e588e.js +876 -0
  27. package/dist/Schema-42e9705c.js +522 -0
  28. package/dist/index.js +21 -43
  29. package/dist/legacy-exports.js +16 -0
  30. package/dist/parse-cst.js +1747 -0
  31. package/dist/resolveSeq-4a68b39b.js +2115 -0
  32. package/dist/test-events.js +11 -14
  33. package/dist/types.js +23 -0
  34. package/dist/util.js +19 -0
  35. package/dist/warnings-39684f17.js +416 -0
  36. package/index.d.ts +372 -0
  37. package/index.js +1 -1
  38. package/map.js +2 -2
  39. package/package.json +32 -45
  40. package/pair.js +2 -2
  41. package/parse-cst.d.ts +187 -0
  42. package/parse-cst.js +1 -1
  43. package/scalar.js +2 -2
  44. package/schema.js +8 -6
  45. package/seq.js +2 -2
  46. package/types/binary.js +3 -2
  47. package/types/omap.js +3 -2
  48. package/types/pairs.js +3 -2
  49. package/types/set.js +3 -2
  50. package/types/timestamp.js +6 -6
  51. package/types.d.ts +407 -0
  52. package/types.js +16 -10
  53. package/types.mjs +15 -18
  54. package/util.d.ts +86 -0
  55. package/util.js +14 -13
  56. package/util.mjs +13 -19
  57. package/browser/dist/Anchors.js +0 -133
  58. package/browser/dist/Document.js +0 -819
  59. package/browser/dist/addComment.js +0 -8
  60. package/browser/dist/constants.js +0 -26
  61. package/browser/dist/cst/Alias.js +0 -42
  62. package/browser/dist/cst/BlankLine.js +0 -56
  63. package/browser/dist/cst/BlockValue.js +0 -247
  64. package/browser/dist/cst/Collection.js +0 -274
  65. package/browser/dist/cst/CollectionItem.js +0 -136
  66. package/browser/dist/cst/Comment.js +0 -40
  67. package/browser/dist/cst/Directive.js +0 -72
  68. package/browser/dist/cst/Document.js +0 -282
  69. package/browser/dist/cst/FlowCollection.js +0 -216
  70. package/browser/dist/cst/Node.js +0 -388
  71. package/browser/dist/cst/ParseContext.js +0 -248
  72. package/browser/dist/cst/PlainValue.js +0 -166
  73. package/browser/dist/cst/QuoteDouble.js +0 -241
  74. package/browser/dist/cst/QuoteSingle.js +0 -116
  75. package/browser/dist/cst/Range.js +0 -67
  76. package/browser/dist/cst/parse.js +0 -48
  77. package/browser/dist/cst/source-utils.js +0 -168
  78. package/browser/dist/errors.js +0 -112
  79. package/browser/dist/foldFlowLines.js +0 -138
  80. package/browser/dist/listTagNames.js +0 -28
  81. package/browser/dist/schema/Alias.js +0 -139
  82. package/browser/dist/schema/Collection.js +0 -267
  83. package/browser/dist/schema/Map.js +0 -178
  84. package/browser/dist/schema/Merge.js +0 -127
  85. package/browser/dist/schema/Node.js +0 -7
  86. package/browser/dist/schema/Pair.js +0 -171
  87. package/browser/dist/schema/Scalar.js +0 -38
  88. package/browser/dist/schema/Seq.js +0 -114
  89. package/browser/dist/schema/index.js +0 -382
  90. package/browser/dist/schema/parseMap.js +0 -312
  91. package/browser/dist/schema/parseSeq.js +0 -168
  92. package/browser/dist/schema/parseUtils.js +0 -110
  93. package/browser/dist/stringify.js +0 -331
  94. package/browser/dist/tags/core.js +0 -126
  95. package/browser/dist/tags/failsafe/index.js +0 -4
  96. package/browser/dist/tags/failsafe/map.js +0 -56
  97. package/browser/dist/tags/failsafe/seq.js +0 -43
  98. package/browser/dist/tags/failsafe/string.js +0 -28
  99. package/browser/dist/tags/index.js +0 -36
  100. package/browser/dist/tags/json.js +0 -76
  101. package/browser/dist/tags/options.js +0 -23
  102. package/browser/dist/tags/yaml-1.1/binary.js +0 -87
  103. package/browser/dist/tags/yaml-1.1/index.js +0 -157
  104. package/browser/dist/tags/yaml-1.1/omap.js +0 -142
  105. package/browser/dist/tags/yaml-1.1/pairs.js +0 -81
  106. package/browser/dist/tags/yaml-1.1/set.js +0 -114
  107. package/browser/dist/tags/yaml-1.1/timestamp.js +0 -97
  108. package/browser/dist/test-events.js +0 -163
  109. package/browser/dist/toJSON.js +0 -20
  110. package/browser/dist/warnings.js +0 -28
  111. package/dist/Anchors.js +0 -125
  112. package/dist/Document.js +0 -710
  113. package/dist/addComment.js +0 -17
  114. package/dist/constants.js +0 -34
  115. package/dist/cst/Alias.js +0 -38
  116. package/dist/cst/BlankLine.js +0 -56
  117. package/dist/cst/BlockValue.js +0 -248
  118. package/dist/cst/Collection.js +0 -271
  119. package/dist/cst/CollectionItem.js +0 -140
  120. package/dist/cst/Comment.js +0 -38
  121. package/dist/cst/Directive.js +0 -64
  122. package/dist/cst/Document.js +0 -281
  123. package/dist/cst/FlowCollection.js +0 -218
  124. package/dist/cst/Node.js +0 -365
  125. package/dist/cst/ParseContext.js +0 -258
  126. package/dist/cst/PlainValue.js +0 -161
  127. package/dist/cst/QuoteDouble.js +0 -237
  128. package/dist/cst/QuoteSingle.js +0 -113
  129. package/dist/cst/Range.js +0 -63
  130. package/dist/cst/parse.js +0 -55
  131. package/dist/cst/source-utils.js +0 -178
  132. package/dist/errors.js +0 -102
  133. package/dist/foldFlowLines.js +0 -146
  134. package/dist/listTagNames.js +0 -38
  135. package/dist/schema/Alias.js +0 -110
  136. package/dist/schema/Collection.js +0 -188
  137. package/dist/schema/Map.js +0 -103
  138. package/dist/schema/Merge.js +0 -80
  139. package/dist/schema/Node.js +0 -10
  140. package/dist/schema/Pair.js +0 -161
  141. package/dist/schema/Scalar.js +0 -31
  142. package/dist/schema/Seq.js +0 -78
  143. package/dist/schema/index.js +0 -315
  144. package/dist/schema/parseMap.js +0 -343
  145. package/dist/schema/parseSeq.js +0 -180
  146. package/dist/schema/parseUtils.js +0 -104
  147. package/dist/stringify.js +0 -358
  148. package/dist/tags/core.js +0 -114
  149. package/dist/tags/failsafe/index.js +0 -17
  150. package/dist/tags/failsafe/map.js +0 -37
  151. package/dist/tags/failsafe/seq.js +0 -34
  152. package/dist/tags/failsafe/string.js +0 -40
  153. package/dist/tags/index.js +0 -62
  154. package/dist/tags/json.js +0 -60
  155. package/dist/tags/options.js +0 -35
  156. package/dist/tags/yaml-1.1/binary.js +0 -97
  157. package/dist/tags/yaml-1.1/index.js +0 -131
  158. package/dist/tags/yaml-1.1/omap.js +0 -105
  159. package/dist/tags/yaml-1.1/pairs.js +0 -80
  160. package/dist/tags/yaml-1.1/set.js +0 -91
  161. package/dist/tags/yaml-1.1/timestamp.js +0 -93
  162. package/dist/toJSON.js +0 -23
  163. package/dist/warnings.js +0 -39
@@ -1,17 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.addCommentBefore = addCommentBefore;
7
- exports.default = addComment;
8
-
9
- function addCommentBefore(str, indent, comment) {
10
- if (!comment) return str;
11
- const cc = comment.replace(/[\s\S]^/gm, `$&${indent}#`);
12
- return `#${cc}\n${indent}${str}`;
13
- }
14
-
15
- function addComment(str, indent, comment) {
16
- return !comment ? str : comment.indexOf('\n') === -1 ? `${str} #${comment}` : `${str}\n` + comment.replace(/^/gm, `${indent || ''}#`);
17
- }
package/dist/constants.js DELETED
@@ -1,34 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.Type = exports.Char = void 0;
7
- const Char = {
8
- ANCHOR: '&',
9
- COMMENT: '#',
10
- TAG: '!',
11
- DIRECTIVES_END: '-',
12
- DOCUMENT_END: '.'
13
- };
14
- exports.Char = Char;
15
- const Type = {
16
- ALIAS: 'ALIAS',
17
- BLANK_LINE: 'BLANK_LINE',
18
- BLOCK_FOLDED: 'BLOCK_FOLDED',
19
- BLOCK_LITERAL: 'BLOCK_LITERAL',
20
- COMMENT: 'COMMENT',
21
- DIRECTIVE: 'DIRECTIVE',
22
- DOCUMENT: 'DOCUMENT',
23
- FLOW_MAP: 'FLOW_MAP',
24
- FLOW_SEQ: 'FLOW_SEQ',
25
- MAP: 'MAP',
26
- MAP_KEY: 'MAP_KEY',
27
- MAP_VALUE: 'MAP_VALUE',
28
- PLAIN: 'PLAIN',
29
- QUOTE_DOUBLE: 'QUOTE_DOUBLE',
30
- QUOTE_SINGLE: 'QUOTE_SINGLE',
31
- SEQ: 'SEQ',
32
- SEQ_ITEM: 'SEQ_ITEM'
33
- };
34
- exports.Type = Type;
package/dist/cst/Alias.js DELETED
@@ -1,38 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _Node = _interopRequireDefault(require("./Node"));
9
-
10
- var _Range = _interopRequireDefault(require("./Range"));
11
-
12
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
-
14
- class Alias extends _Node.default {
15
- /**
16
- * Parses an *alias from the source
17
- *
18
- * @param {ParseContext} context
19
- * @param {number} start - Index of first character
20
- * @returns {number} - Index of the character after this scalar
21
- */
22
- parse(context, start) {
23
- this.context = context;
24
- const {
25
- src
26
- } = context;
27
-
28
- let offset = _Node.default.endOfIdentifier(src, start + 1);
29
-
30
- this.valueRange = new _Range.default(start + 1, offset);
31
- offset = _Node.default.endOfWhiteSpace(src, offset);
32
- offset = this.parseComment(offset);
33
- return offset;
34
- }
35
-
36
- }
37
-
38
- exports.default = Alias;
@@ -1,56 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _constants = require("../constants");
9
-
10
- var _Node = _interopRequireDefault(require("./Node"));
11
-
12
- var _Range = _interopRequireDefault(require("./Range"));
13
-
14
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
-
16
- class BlankLine extends _Node.default {
17
- constructor() {
18
- super(_constants.Type.BLANK_LINE);
19
- }
20
- /* istanbul ignore next */
21
-
22
-
23
- get includesTrailingLines() {
24
- // This is never called from anywhere, but if it were,
25
- // this is the value it should return.
26
- return true;
27
- }
28
- /**
29
- * Parses blank lines from the source
30
- *
31
- * @param {ParseContext} context
32
- * @param {number} start - Index of first \n character
33
- * @returns {number} - Index of the character after this
34
- */
35
-
36
-
37
- parse(context, start) {
38
- this.context = context;
39
- const {
40
- src
41
- } = context;
42
- let offset = start + 1;
43
-
44
- while (_Node.default.atBlank(src, offset)) {
45
- const lineEnd = _Node.default.endOfWhiteSpace(src, offset);
46
-
47
- if (lineEnd === '\n') offset = lineEnd + 1;else break;
48
- }
49
-
50
- this.range = new _Range.default(start, offset);
51
- return offset;
52
- }
53
-
54
- }
55
-
56
- exports.default = BlankLine;
@@ -1,248 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = exports.Chomp = void 0;
7
-
8
- var _constants = require("../constants");
9
-
10
- var _Node = _interopRequireDefault(require("./Node"));
11
-
12
- var _Range = _interopRequireDefault(require("./Range"));
13
-
14
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
-
16
- const Chomp = {
17
- CLIP: 'CLIP',
18
- KEEP: 'KEEP',
19
- STRIP: 'STRIP'
20
- };
21
- exports.Chomp = Chomp;
22
-
23
- class BlockValue extends _Node.default {
24
- constructor(type, props) {
25
- super(type, props);
26
- this.blockIndent = null;
27
- this.chomping = Chomp.CLIP;
28
- this.header = null;
29
- }
30
-
31
- get includesTrailingLines() {
32
- return this.chomping === Chomp.KEEP;
33
- }
34
-
35
- get strValue() {
36
- if (!this.valueRange || !this.context) return null;
37
- let {
38
- start,
39
- end
40
- } = this.valueRange;
41
- const {
42
- indent,
43
- src
44
- } = this.context;
45
- if (this.valueRange.isEmpty()) return '';
46
- let lastNewLine = null;
47
- let ch = src[end - 1];
48
-
49
- while (ch === '\n' || ch === '\t' || ch === ' ') {
50
- end -= 1;
51
-
52
- if (end <= start) {
53
- if (this.chomping === Chomp.KEEP) break;else return ''; // probably never happens
54
- }
55
-
56
- if (ch === '\n') lastNewLine = end;
57
- ch = src[end - 1];
58
- }
59
-
60
- let keepStart = end + 1;
61
-
62
- if (lastNewLine) {
63
- if (this.chomping === Chomp.KEEP) {
64
- keepStart = lastNewLine;
65
- end = this.valueRange.end;
66
- } else {
67
- end = lastNewLine;
68
- }
69
- }
70
-
71
- const bi = indent + this.blockIndent;
72
- const folded = this.type === _constants.Type.BLOCK_FOLDED;
73
- let atStart = true;
74
- let str = '';
75
- let sep = '';
76
- let prevMoreIndented = false;
77
-
78
- for (let i = start; i < end; ++i) {
79
- for (let j = 0; j < bi; ++j) {
80
- if (src[i] !== ' ') break;
81
- i += 1;
82
- }
83
-
84
- const ch = src[i];
85
-
86
- if (ch === '\n') {
87
- if (sep === '\n') str += '\n';else sep = '\n';
88
- } else {
89
- const lineEnd = _Node.default.endOfLine(src, i);
90
-
91
- const line = src.slice(i, lineEnd);
92
- i = lineEnd;
93
-
94
- if (folded && (ch === ' ' || ch === '\t') && i < keepStart) {
95
- if (sep === ' ') sep = '\n';else if (!prevMoreIndented && !atStart && sep === '\n') sep = '\n\n';
96
- str += sep + line; //+ ((lineEnd < end && src[lineEnd]) || '')
97
-
98
- sep = lineEnd < end && src[lineEnd] || '';
99
- prevMoreIndented = true;
100
- } else {
101
- str += sep + line;
102
- sep = folded && i < keepStart ? ' ' : '\n';
103
- prevMoreIndented = false;
104
- }
105
-
106
- if (atStart && line !== '') atStart = false;
107
- }
108
- }
109
-
110
- return this.chomping === Chomp.STRIP ? str : str + '\n';
111
- }
112
-
113
- parseBlockHeader(start) {
114
- const {
115
- src
116
- } = this.context;
117
- let offset = start + 1;
118
- let bi = '';
119
-
120
- while (true) {
121
- const ch = src[offset];
122
-
123
- switch (ch) {
124
- case '-':
125
- this.chomping = Chomp.STRIP;
126
- break;
127
-
128
- case '+':
129
- this.chomping = Chomp.KEEP;
130
- break;
131
-
132
- case '0':
133
- case '1':
134
- case '2':
135
- case '3':
136
- case '4':
137
- case '5':
138
- case '6':
139
- case '7':
140
- case '8':
141
- case '9':
142
- bi += ch;
143
- break;
144
-
145
- default:
146
- this.blockIndent = Number(bi) || null;
147
- this.header = new _Range.default(start, offset);
148
- return offset;
149
- }
150
-
151
- offset += 1;
152
- }
153
- }
154
-
155
- parseBlockValue(start) {
156
- const {
157
- indent,
158
- src
159
- } = this.context;
160
- let offset = start;
161
- let valueEnd = start;
162
- let bi = this.blockIndent ? indent + this.blockIndent - 1 : indent;
163
- let minBlockIndent = 1;
164
-
165
- for (let ch = src[offset]; ch === '\n'; ch = src[offset]) {
166
- offset += 1;
167
- if (_Node.default.atDocumentBoundary(src, offset)) break;
168
-
169
- const end = _Node.default.endOfBlockIndent(src, bi, offset); // should not include tab?
170
-
171
-
172
- if (end === null) break;
173
-
174
- if (!this.blockIndent) {
175
- // no explicit block indent, none yet detected
176
- const lineIndent = end - (offset + indent);
177
-
178
- if (src[end] !== '\n') {
179
- // first line with non-whitespace content
180
- if (lineIndent < minBlockIndent) {
181
- offset -= 1;
182
- break;
183
- }
184
-
185
- this.blockIndent = lineIndent;
186
- bi = indent + this.blockIndent - 1;
187
- } else if (lineIndent > minBlockIndent) {
188
- // empty line with more whitespace
189
- minBlockIndent = lineIndent;
190
- }
191
- }
192
-
193
- if (src[end] === '\n') {
194
- offset = end;
195
- } else {
196
- offset = valueEnd = _Node.default.endOfLine(src, end);
197
- }
198
- }
199
-
200
- if (this.chomping !== Chomp.KEEP) {
201
- offset = src[valueEnd] ? valueEnd + 1 : valueEnd;
202
- }
203
-
204
- this.valueRange = new _Range.default(start + 1, offset);
205
- return offset;
206
- }
207
- /**
208
- * Parses a block value from the source
209
- *
210
- * Accepted forms are:
211
- * ```
212
- * BS
213
- * block
214
- * lines
215
- *
216
- * BS #comment
217
- * block
218
- * lines
219
- * ```
220
- * where the block style BS matches the regexp `[|>][-+1-9]*` and block lines
221
- * are empty or have an indent level greater than `indent`.
222
- *
223
- * @param {ParseContext} context
224
- * @param {number} start - Index of first character
225
- * @returns {number} - Index of the character after this block
226
- */
227
-
228
-
229
- parse(context, start) {
230
- this.context = context;
231
- const {
232
- src
233
- } = context;
234
- let offset = this.parseBlockHeader(start);
235
- offset = _Node.default.endOfWhiteSpace(src, offset);
236
- offset = this.parseComment(offset);
237
- offset = this.parseBlockValue(offset);
238
- return offset;
239
- }
240
-
241
- setOrigRanges(cr, offset) {
242
- offset = super.setOrigRanges(cr, offset);
243
- return this.header ? this.header.setOrigRange(cr, offset) : offset;
244
- }
245
-
246
- }
247
-
248
- exports.default = BlockValue;
@@ -1,271 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.grabCollectionEndComments = grabCollectionEndComments;
7
- exports.default = void 0;
8
-
9
- var _constants = require("../constants");
10
-
11
- var _BlankLine = _interopRequireDefault(require("./BlankLine"));
12
-
13
- var _CollectionItem = _interopRequireDefault(require("./CollectionItem"));
14
-
15
- var _Comment = _interopRequireDefault(require("./Comment"));
16
-
17
- var _Node = _interopRequireDefault(require("./Node"));
18
-
19
- var _Range = _interopRequireDefault(require("./Range"));
20
-
21
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
22
-
23
- function grabCollectionEndComments(node) {
24
- let cnode = node;
25
-
26
- while (cnode instanceof _CollectionItem.default) cnode = cnode.node;
27
-
28
- if (!(cnode instanceof Collection)) return null;
29
- const len = cnode.items.length;
30
- let ci = -1;
31
-
32
- for (let i = len - 1; i >= 0; --i) {
33
- const n = cnode.items[i];
34
-
35
- if (n.type === _constants.Type.COMMENT) {
36
- // Keep sufficiently indented comments with preceding node
37
- const {
38
- indent,
39
- lineStart
40
- } = n.context;
41
- if (indent > 0 && n.range.start >= lineStart + indent) break;
42
- ci = i;
43
- } else if (n.type === _constants.Type.BLANK_LINE) ci = i;else break;
44
- }
45
-
46
- if (ci === -1) return null;
47
- const ca = cnode.items.splice(ci, len - ci);
48
- const prevEnd = ca[0].range.start;
49
-
50
- while (true) {
51
- cnode.range.end = prevEnd;
52
- if (cnode.valueRange && cnode.valueRange.end > prevEnd) cnode.valueRange.end = prevEnd;
53
- if (cnode === node) break;
54
- cnode = cnode.context.parent;
55
- }
56
-
57
- return ca;
58
- }
59
-
60
- class Collection extends _Node.default {
61
- static nextContentHasIndent(src, offset, indent) {
62
- const lineStart = _Node.default.endOfLine(src, offset) + 1;
63
- offset = _Node.default.endOfWhiteSpace(src, lineStart);
64
- const ch = src[offset];
65
- if (!ch) return false;
66
- if (offset >= lineStart + indent) return true;
67
- if (ch !== '#' && ch !== '\n') return false;
68
- return Collection.nextContentHasIndent(src, offset, indent);
69
- }
70
-
71
- constructor(firstItem) {
72
- super(firstItem.type === _constants.Type.SEQ_ITEM ? _constants.Type.SEQ : _constants.Type.MAP);
73
-
74
- for (let i = firstItem.props.length - 1; i >= 0; --i) {
75
- if (firstItem.props[i].start < firstItem.context.lineStart) {
76
- // props on previous line are assumed by the collection
77
- this.props = firstItem.props.slice(0, i + 1);
78
- firstItem.props = firstItem.props.slice(i + 1);
79
- const itemRange = firstItem.props[0] || firstItem.valueRange;
80
- firstItem.range.start = itemRange.start;
81
- break;
82
- }
83
- }
84
-
85
- this.items = [firstItem];
86
- const ec = grabCollectionEndComments(firstItem);
87
- if (ec) Array.prototype.push.apply(this.items, ec);
88
- }
89
-
90
- get includesTrailingLines() {
91
- return this.items.length > 0;
92
- }
93
- /**
94
- * @param {ParseContext} context
95
- * @param {number} start - Index of first character
96
- * @returns {number} - Index of the character after this
97
- */
98
-
99
-
100
- parse(context, start) {
101
- this.context = context;
102
- const {
103
- parseNode,
104
- src
105
- } = context; // It's easier to recalculate lineStart here rather than tracking down the
106
- // last context from which to read it -- eemeli/yaml#2
107
-
108
- let lineStart = _Node.default.startOfLine(src, start);
109
-
110
- const firstItem = this.items[0]; // First-item context needs to be correct for later comment handling
111
- // -- eemeli/yaml#17
112
-
113
- firstItem.context.parent = this;
114
- this.valueRange = _Range.default.copy(firstItem.valueRange);
115
- const indent = firstItem.range.start - firstItem.context.lineStart;
116
- let offset = start;
117
- offset = _Node.default.normalizeOffset(src, offset);
118
- let ch = src[offset];
119
- let atLineStart = _Node.default.endOfWhiteSpace(src, lineStart) === offset;
120
- let prevIncludesTrailingLines = false;
121
-
122
- while (ch) {
123
- while (ch === '\n' || ch === '#') {
124
- if (atLineStart && ch === '\n' && !prevIncludesTrailingLines) {
125
- const blankLine = new _BlankLine.default();
126
- offset = blankLine.parse({
127
- src
128
- }, offset);
129
- this.valueRange.end = offset;
130
-
131
- if (offset >= src.length) {
132
- ch = null;
133
- break;
134
- }
135
-
136
- this.items.push(blankLine);
137
- offset -= 1; // blankLine.parse() consumes terminal newline
138
- } else if (ch === '#') {
139
- if (offset < lineStart + indent && !Collection.nextContentHasIndent(src, offset, indent)) {
140
- return offset;
141
- }
142
-
143
- const comment = new _Comment.default();
144
- offset = comment.parse({
145
- indent,
146
- lineStart,
147
- src
148
- }, offset);
149
- this.items.push(comment);
150
- this.valueRange.end = offset;
151
-
152
- if (offset >= src.length) {
153
- ch = null;
154
- break;
155
- }
156
- }
157
-
158
- lineStart = offset + 1;
159
- offset = _Node.default.endOfIndent(src, lineStart);
160
-
161
- if (_Node.default.atBlank(src, offset)) {
162
- const wsEnd = _Node.default.endOfWhiteSpace(src, offset);
163
-
164
- const next = src[wsEnd];
165
-
166
- if (!next || next === '\n' || next === '#') {
167
- offset = wsEnd;
168
- }
169
- }
170
-
171
- ch = src[offset];
172
- atLineStart = true;
173
- }
174
-
175
- if (!ch) {
176
- break;
177
- }
178
-
179
- if (offset !== lineStart + indent && (atLineStart || ch !== ':')) {
180
- if (lineStart > start) offset = lineStart;
181
- break;
182
- }
183
-
184
- if (firstItem.type === _constants.Type.SEQ_ITEM !== (ch === '-')) {
185
- let typeswitch = true;
186
-
187
- if (ch === '-') {
188
- // map key may start with -, as long as it's followed by a non-whitespace char
189
- const next = src[offset + 1];
190
- typeswitch = !next || next === '\n' || next === '\t' || next === ' ';
191
- }
192
-
193
- if (typeswitch) {
194
- if (lineStart > start) offset = lineStart;
195
- break;
196
- }
197
- }
198
-
199
- const node = parseNode({
200
- atLineStart,
201
- inCollection: true,
202
- indent,
203
- lineStart,
204
- parent: this
205
- }, offset);
206
- if (!node) return offset; // at next document start
207
-
208
- this.items.push(node);
209
- this.valueRange.end = node.valueRange.end;
210
- offset = _Node.default.normalizeOffset(src, node.range.end);
211
- ch = src[offset];
212
- atLineStart = false;
213
- prevIncludesTrailingLines = node.includesTrailingLines; // Need to reset lineStart and atLineStart here if preceding node's range
214
- // has advanced to check the current line's indentation level
215
- // -- eemeli/yaml#10 & eemeli/yaml#38
216
-
217
- if (ch) {
218
- let ls = offset - 1;
219
- let prev = src[ls];
220
-
221
- while (prev === ' ' || prev === '\t') prev = src[--ls];
222
-
223
- if (prev === '\n') {
224
- lineStart = ls + 1;
225
- atLineStart = true;
226
- }
227
- }
228
-
229
- const ec = grabCollectionEndComments(node);
230
- if (ec) Array.prototype.push.apply(this.items, ec);
231
- }
232
-
233
- return offset;
234
- }
235
-
236
- setOrigRanges(cr, offset) {
237
- offset = super.setOrigRanges(cr, offset);
238
- this.items.forEach(node => {
239
- offset = node.setOrigRanges(cr, offset);
240
- });
241
- return offset;
242
- }
243
-
244
- toString() {
245
- const {
246
- context: {
247
- src
248
- },
249
- items,
250
- range,
251
- value
252
- } = this;
253
- if (value != null) return value;
254
- let str = src.slice(range.start, items[0].range.start) + String(items[0]);
255
-
256
- for (let i = 1; i < items.length; ++i) {
257
- const item = items[i];
258
- const {
259
- atLineStart,
260
- indent
261
- } = item.context;
262
- if (atLineStart) for (let i = 0; i < indent; ++i) str += ' ';
263
- str += String(item);
264
- }
265
-
266
- return _Node.default.addStringTerminator(src, range.end, str);
267
- }
268
-
269
- }
270
-
271
- exports.default = Collection;