yaml 2.8.4 → 3.0.0-1

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 (238) hide show
  1. package/README.md +65 -85
  2. package/{bin.mjs → bin.js} +1 -1
  3. package/dist/chunk-pbuEa-1d.js +13 -0
  4. package/dist/cli.d.ts +10 -7
  5. package/dist/cli.js +180 -0
  6. package/dist/directives-CiM56lHW.js +2963 -0
  7. package/dist/directives-DlYEVlkC.d.ts +1396 -0
  8. package/dist/index.d.ts +320 -25
  9. package/dist/index.js +4 -50
  10. package/dist/line-counter-bmCJ4fGy.js +3086 -0
  11. package/dist/public-api-BTMehGT6.js +77 -0
  12. package/dist/test-events.d.ts +6 -3
  13. package/dist/test-events.js +105 -126
  14. package/dist/util.d.ts +2 -16
  15. package/dist/util.js +2 -28
  16. package/package.json +20 -44
  17. package/browser/dist/compose/compose-collection.js +0 -88
  18. package/browser/dist/compose/compose-doc.js +0 -43
  19. package/browser/dist/compose/compose-node.js +0 -109
  20. package/browser/dist/compose/compose-scalar.js +0 -86
  21. package/browser/dist/compose/composer.js +0 -217
  22. package/browser/dist/compose/resolve-block-map.js +0 -115
  23. package/browser/dist/compose/resolve-block-scalar.js +0 -198
  24. package/browser/dist/compose/resolve-block-seq.js +0 -49
  25. package/browser/dist/compose/resolve-end.js +0 -37
  26. package/browser/dist/compose/resolve-flow-collection.js +0 -207
  27. package/browser/dist/compose/resolve-flow-scalar.js +0 -225
  28. package/browser/dist/compose/resolve-props.js +0 -146
  29. package/browser/dist/compose/util-contains-newline.js +0 -34
  30. package/browser/dist/compose/util-empty-scalar-position.js +0 -26
  31. package/browser/dist/compose/util-flow-indent-check.js +0 -15
  32. package/browser/dist/compose/util-map-includes.js +0 -13
  33. package/browser/dist/doc/Document.js +0 -335
  34. package/browser/dist/doc/anchors.js +0 -71
  35. package/browser/dist/doc/applyReviver.js +0 -55
  36. package/browser/dist/doc/createNode.js +0 -88
  37. package/browser/dist/doc/directives.js +0 -176
  38. package/browser/dist/errors.js +0 -57
  39. package/browser/dist/index.js +0 -17
  40. package/browser/dist/log.js +0 -11
  41. package/browser/dist/nodes/Alias.js +0 -116
  42. package/browser/dist/nodes/Collection.js +0 -147
  43. package/browser/dist/nodes/Node.js +0 -38
  44. package/browser/dist/nodes/Pair.js +0 -36
  45. package/browser/dist/nodes/Scalar.js +0 -24
  46. package/browser/dist/nodes/YAMLMap.js +0 -144
  47. package/browser/dist/nodes/YAMLSeq.js +0 -113
  48. package/browser/dist/nodes/addPairToJSMap.js +0 -63
  49. package/browser/dist/nodes/identity.js +0 -36
  50. package/browser/dist/nodes/toJS.js +0 -37
  51. package/browser/dist/parse/cst-scalar.js +0 -214
  52. package/browser/dist/parse/cst-stringify.js +0 -61
  53. package/browser/dist/parse/cst-visit.js +0 -97
  54. package/browser/dist/parse/cst.js +0 -98
  55. package/browser/dist/parse/lexer.js +0 -717
  56. package/browser/dist/parse/line-counter.js +0 -39
  57. package/browser/dist/parse/parser.js +0 -967
  58. package/browser/dist/public-api.js +0 -102
  59. package/browser/dist/schema/Schema.js +0 -37
  60. package/browser/dist/schema/common/map.js +0 -17
  61. package/browser/dist/schema/common/null.js +0 -15
  62. package/browser/dist/schema/common/seq.js +0 -17
  63. package/browser/dist/schema/common/string.js +0 -14
  64. package/browser/dist/schema/core/bool.js +0 -19
  65. package/browser/dist/schema/core/float.js +0 -43
  66. package/browser/dist/schema/core/int.js +0 -38
  67. package/browser/dist/schema/core/schema.js +0 -23
  68. package/browser/dist/schema/json/schema.js +0 -62
  69. package/browser/dist/schema/tags.js +0 -96
  70. package/browser/dist/schema/yaml-1.1/binary.js +0 -58
  71. package/browser/dist/schema/yaml-1.1/bool.js +0 -26
  72. package/browser/dist/schema/yaml-1.1/float.js +0 -46
  73. package/browser/dist/schema/yaml-1.1/int.js +0 -71
  74. package/browser/dist/schema/yaml-1.1/merge.js +0 -67
  75. package/browser/dist/schema/yaml-1.1/omap.js +0 -74
  76. package/browser/dist/schema/yaml-1.1/pairs.js +0 -78
  77. package/browser/dist/schema/yaml-1.1/schema.js +0 -39
  78. package/browser/dist/schema/yaml-1.1/set.js +0 -93
  79. package/browser/dist/schema/yaml-1.1/timestamp.js +0 -101
  80. package/browser/dist/stringify/foldFlowLines.js +0 -146
  81. package/browser/dist/stringify/stringify.js +0 -129
  82. package/browser/dist/stringify/stringifyCollection.js +0 -153
  83. package/browser/dist/stringify/stringifyComment.js +0 -20
  84. package/browser/dist/stringify/stringifyDocument.js +0 -85
  85. package/browser/dist/stringify/stringifyNumber.js +0 -25
  86. package/browser/dist/stringify/stringifyPair.js +0 -150
  87. package/browser/dist/stringify/stringifyString.js +0 -336
  88. package/browser/dist/util.js +0 -11
  89. package/browser/dist/visit.js +0 -233
  90. package/browser/index.js +0 -5
  91. package/browser/package.json +0 -3
  92. package/dist/cli.mjs +0 -201
  93. package/dist/compose/compose-collection.d.ts +0 -11
  94. package/dist/compose/compose-collection.js +0 -90
  95. package/dist/compose/compose-doc.d.ts +0 -7
  96. package/dist/compose/compose-doc.js +0 -45
  97. package/dist/compose/compose-node.d.ts +0 -29
  98. package/dist/compose/compose-node.js +0 -112
  99. package/dist/compose/compose-scalar.d.ts +0 -5
  100. package/dist/compose/compose-scalar.js +0 -88
  101. package/dist/compose/composer.d.ts +0 -63
  102. package/dist/compose/composer.js +0 -222
  103. package/dist/compose/resolve-block-map.d.ts +0 -6
  104. package/dist/compose/resolve-block-map.js +0 -117
  105. package/dist/compose/resolve-block-scalar.d.ts +0 -11
  106. package/dist/compose/resolve-block-scalar.js +0 -200
  107. package/dist/compose/resolve-block-seq.d.ts +0 -6
  108. package/dist/compose/resolve-block-seq.js +0 -51
  109. package/dist/compose/resolve-end.d.ts +0 -6
  110. package/dist/compose/resolve-end.js +0 -39
  111. package/dist/compose/resolve-flow-collection.d.ts +0 -7
  112. package/dist/compose/resolve-flow-collection.js +0 -209
  113. package/dist/compose/resolve-flow-scalar.d.ts +0 -10
  114. package/dist/compose/resolve-flow-scalar.js +0 -227
  115. package/dist/compose/resolve-props.d.ts +0 -23
  116. package/dist/compose/resolve-props.js +0 -148
  117. package/dist/compose/util-contains-newline.d.ts +0 -2
  118. package/dist/compose/util-contains-newline.js +0 -36
  119. package/dist/compose/util-empty-scalar-position.d.ts +0 -2
  120. package/dist/compose/util-empty-scalar-position.js +0 -28
  121. package/dist/compose/util-flow-indent-check.d.ts +0 -3
  122. package/dist/compose/util-flow-indent-check.js +0 -17
  123. package/dist/compose/util-map-includes.d.ts +0 -4
  124. package/dist/compose/util-map-includes.js +0 -15
  125. package/dist/doc/Document.d.ts +0 -141
  126. package/dist/doc/Document.js +0 -337
  127. package/dist/doc/anchors.d.ts +0 -24
  128. package/dist/doc/anchors.js +0 -76
  129. package/dist/doc/applyReviver.d.ts +0 -9
  130. package/dist/doc/applyReviver.js +0 -57
  131. package/dist/doc/createNode.d.ts +0 -17
  132. package/dist/doc/createNode.js +0 -90
  133. package/dist/doc/directives.d.ts +0 -49
  134. package/dist/doc/directives.js +0 -178
  135. package/dist/errors.d.ts +0 -21
  136. package/dist/errors.js +0 -62
  137. package/dist/log.d.ts +0 -3
  138. package/dist/log.js +0 -19
  139. package/dist/nodes/Alias.d.ts +0 -29
  140. package/dist/nodes/Alias.js +0 -118
  141. package/dist/nodes/Collection.d.ts +0 -73
  142. package/dist/nodes/Collection.js +0 -151
  143. package/dist/nodes/Node.d.ts +0 -53
  144. package/dist/nodes/Node.js +0 -40
  145. package/dist/nodes/Pair.d.ts +0 -22
  146. package/dist/nodes/Pair.js +0 -39
  147. package/dist/nodes/Scalar.d.ts +0 -47
  148. package/dist/nodes/Scalar.js +0 -27
  149. package/dist/nodes/YAMLMap.d.ts +0 -53
  150. package/dist/nodes/YAMLMap.js +0 -147
  151. package/dist/nodes/YAMLSeq.d.ts +0 -60
  152. package/dist/nodes/YAMLSeq.js +0 -115
  153. package/dist/nodes/addPairToJSMap.d.ts +0 -4
  154. package/dist/nodes/addPairToJSMap.js +0 -65
  155. package/dist/nodes/identity.d.ts +0 -23
  156. package/dist/nodes/identity.js +0 -53
  157. package/dist/nodes/toJS.d.ts +0 -29
  158. package/dist/nodes/toJS.js +0 -39
  159. package/dist/options.d.ts +0 -350
  160. package/dist/parse/cst-scalar.d.ts +0 -64
  161. package/dist/parse/cst-scalar.js +0 -218
  162. package/dist/parse/cst-stringify.d.ts +0 -8
  163. package/dist/parse/cst-stringify.js +0 -63
  164. package/dist/parse/cst-visit.d.ts +0 -39
  165. package/dist/parse/cst-visit.js +0 -99
  166. package/dist/parse/cst.d.ts +0 -109
  167. package/dist/parse/cst.js +0 -112
  168. package/dist/parse/lexer.d.ts +0 -87
  169. package/dist/parse/lexer.js +0 -719
  170. package/dist/parse/line-counter.d.ts +0 -22
  171. package/dist/parse/line-counter.js +0 -41
  172. package/dist/parse/parser.d.ts +0 -84
  173. package/dist/parse/parser.js +0 -972
  174. package/dist/public-api.d.ts +0 -44
  175. package/dist/public-api.js +0 -107
  176. package/dist/schema/Schema.d.ts +0 -17
  177. package/dist/schema/Schema.js +0 -39
  178. package/dist/schema/common/map.d.ts +0 -2
  179. package/dist/schema/common/map.js +0 -19
  180. package/dist/schema/common/null.d.ts +0 -4
  181. package/dist/schema/common/null.js +0 -17
  182. package/dist/schema/common/seq.d.ts +0 -2
  183. package/dist/schema/common/seq.js +0 -19
  184. package/dist/schema/common/string.d.ts +0 -2
  185. package/dist/schema/common/string.js +0 -16
  186. package/dist/schema/core/bool.d.ts +0 -4
  187. package/dist/schema/core/bool.js +0 -21
  188. package/dist/schema/core/float.d.ts +0 -4
  189. package/dist/schema/core/float.js +0 -47
  190. package/dist/schema/core/int.d.ts +0 -4
  191. package/dist/schema/core/int.js +0 -42
  192. package/dist/schema/core/schema.d.ts +0 -1
  193. package/dist/schema/core/schema.js +0 -25
  194. package/dist/schema/json/schema.d.ts +0 -2
  195. package/dist/schema/json/schema.js +0 -64
  196. package/dist/schema/json-schema.d.ts +0 -69
  197. package/dist/schema/tags.d.ts +0 -48
  198. package/dist/schema/tags.js +0 -99
  199. package/dist/schema/types.d.ts +0 -92
  200. package/dist/schema/yaml-1.1/binary.d.ts +0 -2
  201. package/dist/schema/yaml-1.1/binary.js +0 -70
  202. package/dist/schema/yaml-1.1/bool.d.ts +0 -7
  203. package/dist/schema/yaml-1.1/bool.js +0 -29
  204. package/dist/schema/yaml-1.1/float.d.ts +0 -4
  205. package/dist/schema/yaml-1.1/float.js +0 -50
  206. package/dist/schema/yaml-1.1/int.d.ts +0 -5
  207. package/dist/schema/yaml-1.1/int.js +0 -76
  208. package/dist/schema/yaml-1.1/merge.d.ts +0 -9
  209. package/dist/schema/yaml-1.1/merge.js +0 -71
  210. package/dist/schema/yaml-1.1/omap.d.ts +0 -22
  211. package/dist/schema/yaml-1.1/omap.js +0 -77
  212. package/dist/schema/yaml-1.1/pairs.d.ts +0 -10
  213. package/dist/schema/yaml-1.1/pairs.js +0 -82
  214. package/dist/schema/yaml-1.1/schema.d.ts +0 -1
  215. package/dist/schema/yaml-1.1/schema.js +0 -41
  216. package/dist/schema/yaml-1.1/set.d.ts +0 -28
  217. package/dist/schema/yaml-1.1/set.js +0 -96
  218. package/dist/schema/yaml-1.1/timestamp.d.ts +0 -6
  219. package/dist/schema/yaml-1.1/timestamp.js +0 -105
  220. package/dist/stringify/foldFlowLines.d.ts +0 -34
  221. package/dist/stringify/foldFlowLines.js +0 -151
  222. package/dist/stringify/stringify.d.ts +0 -21
  223. package/dist/stringify/stringify.js +0 -132
  224. package/dist/stringify/stringifyCollection.d.ts +0 -17
  225. package/dist/stringify/stringifyCollection.js +0 -155
  226. package/dist/stringify/stringifyComment.d.ts +0 -10
  227. package/dist/stringify/stringifyComment.js +0 -24
  228. package/dist/stringify/stringifyDocument.d.ts +0 -4
  229. package/dist/stringify/stringifyDocument.js +0 -87
  230. package/dist/stringify/stringifyNumber.d.ts +0 -2
  231. package/dist/stringify/stringifyNumber.js +0 -27
  232. package/dist/stringify/stringifyPair.d.ts +0 -3
  233. package/dist/stringify/stringifyPair.js +0 -152
  234. package/dist/stringify/stringifyString.d.ts +0 -9
  235. package/dist/stringify/stringifyString.js +0 -338
  236. package/dist/visit.d.ts +0 -102
  237. package/dist/visit.js +0 -236
  238. package/util.js +0 -2
@@ -1,972 +0,0 @@
1
- 'use strict';
2
-
3
- var node_process = require('process');
4
- var cst = require('./cst.js');
5
- var lexer = require('./lexer.js');
6
-
7
- function includesToken(list, type) {
8
- for (let i = 0; i < list.length; ++i)
9
- if (list[i].type === type)
10
- return true;
11
- return false;
12
- }
13
- function findNonEmptyIndex(list) {
14
- for (let i = 0; i < list.length; ++i) {
15
- switch (list[i].type) {
16
- case 'space':
17
- case 'comment':
18
- case 'newline':
19
- break;
20
- default:
21
- return i;
22
- }
23
- }
24
- return -1;
25
- }
26
- function isFlowToken(token) {
27
- switch (token?.type) {
28
- case 'alias':
29
- case 'scalar':
30
- case 'single-quoted-scalar':
31
- case 'double-quoted-scalar':
32
- case 'flow-collection':
33
- return true;
34
- default:
35
- return false;
36
- }
37
- }
38
- function getPrevProps(parent) {
39
- switch (parent.type) {
40
- case 'document':
41
- return parent.start;
42
- case 'block-map': {
43
- const it = parent.items[parent.items.length - 1];
44
- return it.sep ?? it.start;
45
- }
46
- case 'block-seq':
47
- return parent.items[parent.items.length - 1].start;
48
- /* istanbul ignore next should not happen */
49
- default:
50
- return [];
51
- }
52
- }
53
- /** Note: May modify input array */
54
- function getFirstKeyStartProps(prev) {
55
- if (prev.length === 0)
56
- return [];
57
- let i = prev.length;
58
- loop: while (--i >= 0) {
59
- switch (prev[i].type) {
60
- case 'doc-start':
61
- case 'explicit-key-ind':
62
- case 'map-value-ind':
63
- case 'seq-item-ind':
64
- case 'newline':
65
- break loop;
66
- }
67
- }
68
- while (prev[++i]?.type === 'space') {
69
- /* loop */
70
- }
71
- return prev.splice(i, prev.length);
72
- }
73
- function fixFlowSeqItems(fc) {
74
- if (fc.start.type === 'flow-seq-start') {
75
- for (const it of fc.items) {
76
- if (it.sep &&
77
- !it.value &&
78
- !includesToken(it.start, 'explicit-key-ind') &&
79
- !includesToken(it.sep, 'map-value-ind')) {
80
- if (it.key)
81
- it.value = it.key;
82
- delete it.key;
83
- if (isFlowToken(it.value)) {
84
- if (it.value.end)
85
- Array.prototype.push.apply(it.value.end, it.sep);
86
- else
87
- it.value.end = it.sep;
88
- }
89
- else
90
- Array.prototype.push.apply(it.start, it.sep);
91
- delete it.sep;
92
- }
93
- }
94
- }
95
- }
96
- /**
97
- * A YAML concrete syntax tree (CST) parser
98
- *
99
- * ```ts
100
- * const src: string = ...
101
- * for (const token of new Parser().parse(src)) {
102
- * // token: Token
103
- * }
104
- * ```
105
- *
106
- * To use the parser with a user-provided lexer:
107
- *
108
- * ```ts
109
- * function* parse(source: string, lexer: Lexer) {
110
- * const parser = new Parser()
111
- * for (const lexeme of lexer.lex(source))
112
- * yield* parser.next(lexeme)
113
- * yield* parser.end()
114
- * }
115
- *
116
- * const src: string = ...
117
- * const lexer = new Lexer()
118
- * for (const token of parse(src, lexer)) {
119
- * // token: Token
120
- * }
121
- * ```
122
- */
123
- class Parser {
124
- /**
125
- * @param onNewLine - If defined, called separately with the start position of
126
- * each new line (in `parse()`, including the start of input).
127
- */
128
- constructor(onNewLine) {
129
- /** If true, space and sequence indicators count as indentation */
130
- this.atNewLine = true;
131
- /** If true, next token is a scalar value */
132
- this.atScalar = false;
133
- /** Current indentation level */
134
- this.indent = 0;
135
- /** Current offset since the start of parsing */
136
- this.offset = 0;
137
- /** On the same line with a block map key */
138
- this.onKeyLine = false;
139
- /** Top indicates the node that's currently being built */
140
- this.stack = [];
141
- /** The source of the current token, set in parse() */
142
- this.source = '';
143
- /** The type of the current token, set in parse() */
144
- this.type = '';
145
- // Must be defined after `next()`
146
- this.lexer = new lexer.Lexer();
147
- this.onNewLine = onNewLine;
148
- }
149
- /**
150
- * Parse `source` as a YAML stream.
151
- * If `incomplete`, a part of the last line may be left as a buffer for the next call.
152
- *
153
- * Errors are not thrown, but yielded as `{ type: 'error', message }` tokens.
154
- *
155
- * @returns A generator of tokens representing each directive, document, and other structure.
156
- */
157
- *parse(source, incomplete = false) {
158
- if (this.onNewLine && this.offset === 0)
159
- this.onNewLine(0);
160
- for (const lexeme of this.lexer.lex(source, incomplete))
161
- yield* this.next(lexeme);
162
- if (!incomplete)
163
- yield* this.end();
164
- }
165
- /**
166
- * Advance the parser by the `source` of one lexical token.
167
- */
168
- *next(source) {
169
- this.source = source;
170
- if (node_process.env.LOG_TOKENS)
171
- console.log('|', cst.prettyToken(source));
172
- if (this.atScalar) {
173
- this.atScalar = false;
174
- yield* this.step();
175
- this.offset += source.length;
176
- return;
177
- }
178
- const type = cst.tokenType(source);
179
- if (!type) {
180
- const message = `Not a YAML token: ${source}`;
181
- yield* this.pop({ type: 'error', offset: this.offset, message, source });
182
- this.offset += source.length;
183
- }
184
- else if (type === 'scalar') {
185
- this.atNewLine = false;
186
- this.atScalar = true;
187
- this.type = 'scalar';
188
- }
189
- else {
190
- this.type = type;
191
- yield* this.step();
192
- switch (type) {
193
- case 'newline':
194
- this.atNewLine = true;
195
- this.indent = 0;
196
- if (this.onNewLine)
197
- this.onNewLine(this.offset + source.length);
198
- break;
199
- case 'space':
200
- if (this.atNewLine && source[0] === ' ')
201
- this.indent += source.length;
202
- break;
203
- case 'explicit-key-ind':
204
- case 'map-value-ind':
205
- case 'seq-item-ind':
206
- if (this.atNewLine)
207
- this.indent += source.length;
208
- break;
209
- case 'doc-mode':
210
- case 'flow-error-end':
211
- return;
212
- default:
213
- this.atNewLine = false;
214
- }
215
- this.offset += source.length;
216
- }
217
- }
218
- /** Call at end of input to push out any remaining constructions */
219
- *end() {
220
- while (this.stack.length > 0)
221
- yield* this.pop();
222
- }
223
- get sourceToken() {
224
- const st = {
225
- type: this.type,
226
- offset: this.offset,
227
- indent: this.indent,
228
- source: this.source
229
- };
230
- return st;
231
- }
232
- *step() {
233
- const top = this.peek(1);
234
- if (this.type === 'doc-end' && top?.type !== 'doc-end') {
235
- while (this.stack.length > 0)
236
- yield* this.pop();
237
- this.stack.push({
238
- type: 'doc-end',
239
- offset: this.offset,
240
- source: this.source
241
- });
242
- return;
243
- }
244
- if (!top)
245
- return yield* this.stream();
246
- switch (top.type) {
247
- case 'document':
248
- return yield* this.document(top);
249
- case 'alias':
250
- case 'scalar':
251
- case 'single-quoted-scalar':
252
- case 'double-quoted-scalar':
253
- return yield* this.scalar(top);
254
- case 'block-scalar':
255
- return yield* this.blockScalar(top);
256
- case 'block-map':
257
- return yield* this.blockMap(top);
258
- case 'block-seq':
259
- return yield* this.blockSequence(top);
260
- case 'flow-collection':
261
- return yield* this.flowCollection(top);
262
- case 'doc-end':
263
- return yield* this.documentEnd(top);
264
- }
265
- /* istanbul ignore next should not happen */
266
- yield* this.pop();
267
- }
268
- peek(n) {
269
- return this.stack[this.stack.length - n];
270
- }
271
- *pop(error) {
272
- const token = error ?? this.stack.pop();
273
- /* istanbul ignore if should not happen */
274
- if (!token) {
275
- const message = 'Tried to pop an empty stack';
276
- yield { type: 'error', offset: this.offset, source: '', message };
277
- }
278
- else if (this.stack.length === 0) {
279
- yield token;
280
- }
281
- else {
282
- const top = this.peek(1);
283
- if (token.type === 'block-scalar') {
284
- // Block scalars use their parent rather than header indent
285
- token.indent = 'indent' in top ? top.indent : 0;
286
- }
287
- else if (token.type === 'flow-collection' && top.type === 'document') {
288
- // Ignore all indent for top-level flow collections
289
- token.indent = 0;
290
- }
291
- if (token.type === 'flow-collection')
292
- fixFlowSeqItems(token);
293
- switch (top.type) {
294
- case 'document':
295
- top.value = token;
296
- break;
297
- case 'block-scalar':
298
- top.props.push(token); // error
299
- break;
300
- case 'block-map': {
301
- const it = top.items[top.items.length - 1];
302
- if (it.value) {
303
- top.items.push({ start: [], key: token, sep: [] });
304
- this.onKeyLine = true;
305
- return;
306
- }
307
- else if (it.sep) {
308
- it.value = token;
309
- }
310
- else {
311
- Object.assign(it, { key: token, sep: [] });
312
- this.onKeyLine = !it.explicitKey;
313
- return;
314
- }
315
- break;
316
- }
317
- case 'block-seq': {
318
- const it = top.items[top.items.length - 1];
319
- if (it.value)
320
- top.items.push({ start: [], value: token });
321
- else
322
- it.value = token;
323
- break;
324
- }
325
- case 'flow-collection': {
326
- const it = top.items[top.items.length - 1];
327
- if (!it || it.value)
328
- top.items.push({ start: [], key: token, sep: [] });
329
- else if (it.sep)
330
- it.value = token;
331
- else
332
- Object.assign(it, { key: token, sep: [] });
333
- return;
334
- }
335
- /* istanbul ignore next should not happen */
336
- default:
337
- yield* this.pop();
338
- yield* this.pop(token);
339
- }
340
- if ((top.type === 'document' ||
341
- top.type === 'block-map' ||
342
- top.type === 'block-seq') &&
343
- (token.type === 'block-map' || token.type === 'block-seq')) {
344
- const last = token.items[token.items.length - 1];
345
- if (last &&
346
- !last.sep &&
347
- !last.value &&
348
- last.start.length > 0 &&
349
- findNonEmptyIndex(last.start) === -1 &&
350
- (token.indent === 0 ||
351
- last.start.every(st => st.type !== 'comment' || st.indent < token.indent))) {
352
- if (top.type === 'document')
353
- top.end = last.start;
354
- else
355
- top.items.push({ start: last.start });
356
- token.items.splice(-1, 1);
357
- }
358
- }
359
- }
360
- }
361
- *stream() {
362
- switch (this.type) {
363
- case 'directive-line':
364
- yield { type: 'directive', offset: this.offset, source: this.source };
365
- return;
366
- case 'byte-order-mark':
367
- case 'space':
368
- case 'comment':
369
- case 'newline':
370
- yield this.sourceToken;
371
- return;
372
- case 'doc-mode':
373
- case 'doc-start': {
374
- const doc = {
375
- type: 'document',
376
- offset: this.offset,
377
- start: []
378
- };
379
- if (this.type === 'doc-start')
380
- doc.start.push(this.sourceToken);
381
- this.stack.push(doc);
382
- return;
383
- }
384
- }
385
- yield {
386
- type: 'error',
387
- offset: this.offset,
388
- message: `Unexpected ${this.type} token in YAML stream`,
389
- source: this.source
390
- };
391
- }
392
- *document(doc) {
393
- if (doc.value)
394
- return yield* this.lineEnd(doc);
395
- switch (this.type) {
396
- case 'doc-start': {
397
- if (findNonEmptyIndex(doc.start) !== -1) {
398
- yield* this.pop();
399
- yield* this.step();
400
- }
401
- else
402
- doc.start.push(this.sourceToken);
403
- return;
404
- }
405
- case 'anchor':
406
- case 'tag':
407
- case 'space':
408
- case 'comment':
409
- case 'newline':
410
- doc.start.push(this.sourceToken);
411
- return;
412
- }
413
- const bv = this.startBlockValue(doc);
414
- if (bv)
415
- this.stack.push(bv);
416
- else {
417
- yield {
418
- type: 'error',
419
- offset: this.offset,
420
- message: `Unexpected ${this.type} token in YAML document`,
421
- source: this.source
422
- };
423
- }
424
- }
425
- *scalar(scalar) {
426
- if (this.type === 'map-value-ind') {
427
- const prev = getPrevProps(this.peek(2));
428
- const start = getFirstKeyStartProps(prev);
429
- let sep;
430
- if (scalar.end) {
431
- sep = scalar.end;
432
- sep.push(this.sourceToken);
433
- delete scalar.end;
434
- }
435
- else
436
- sep = [this.sourceToken];
437
- const map = {
438
- type: 'block-map',
439
- offset: scalar.offset,
440
- indent: scalar.indent,
441
- items: [{ start, key: scalar, sep }]
442
- };
443
- this.onKeyLine = true;
444
- this.stack[this.stack.length - 1] = map;
445
- }
446
- else
447
- yield* this.lineEnd(scalar);
448
- }
449
- *blockScalar(scalar) {
450
- switch (this.type) {
451
- case 'space':
452
- case 'comment':
453
- case 'newline':
454
- scalar.props.push(this.sourceToken);
455
- return;
456
- case 'scalar':
457
- scalar.source = this.source;
458
- // block-scalar source includes trailing newline
459
- this.atNewLine = true;
460
- this.indent = 0;
461
- if (this.onNewLine) {
462
- let nl = this.source.indexOf('\n') + 1;
463
- while (nl !== 0) {
464
- this.onNewLine(this.offset + nl);
465
- nl = this.source.indexOf('\n', nl) + 1;
466
- }
467
- }
468
- yield* this.pop();
469
- break;
470
- /* istanbul ignore next should not happen */
471
- default:
472
- yield* this.pop();
473
- yield* this.step();
474
- }
475
- }
476
- *blockMap(map) {
477
- const it = map.items[map.items.length - 1];
478
- // it.sep is true-ish if pair already has key or : separator
479
- switch (this.type) {
480
- case 'newline':
481
- this.onKeyLine = false;
482
- if (it.value) {
483
- const end = 'end' in it.value ? it.value.end : undefined;
484
- const last = Array.isArray(end) ? end[end.length - 1] : undefined;
485
- if (last?.type === 'comment')
486
- end?.push(this.sourceToken);
487
- else
488
- map.items.push({ start: [this.sourceToken] });
489
- }
490
- else if (it.sep) {
491
- it.sep.push(this.sourceToken);
492
- }
493
- else {
494
- it.start.push(this.sourceToken);
495
- }
496
- return;
497
- case 'space':
498
- case 'comment':
499
- if (it.value) {
500
- map.items.push({ start: [this.sourceToken] });
501
- }
502
- else if (it.sep) {
503
- it.sep.push(this.sourceToken);
504
- }
505
- else {
506
- if (this.atIndentedComment(it.start, map.indent)) {
507
- const prev = map.items[map.items.length - 2];
508
- const end = prev?.value?.end;
509
- if (Array.isArray(end)) {
510
- Array.prototype.push.apply(end, it.start);
511
- end.push(this.sourceToken);
512
- map.items.pop();
513
- return;
514
- }
515
- }
516
- it.start.push(this.sourceToken);
517
- }
518
- return;
519
- }
520
- if (this.indent >= map.indent) {
521
- const atMapIndent = !this.onKeyLine && this.indent === map.indent;
522
- const atNextItem = atMapIndent &&
523
- (it.sep || it.explicitKey) &&
524
- this.type !== 'seq-item-ind';
525
- // For empty nodes, assign newline-separated not indented empty tokens to following node
526
- let start = [];
527
- if (atNextItem && it.sep && !it.value) {
528
- const nl = [];
529
- for (let i = 0; i < it.sep.length; ++i) {
530
- const st = it.sep[i];
531
- switch (st.type) {
532
- case 'newline':
533
- nl.push(i);
534
- break;
535
- case 'space':
536
- break;
537
- case 'comment':
538
- if (st.indent > map.indent)
539
- nl.length = 0;
540
- break;
541
- default:
542
- nl.length = 0;
543
- }
544
- }
545
- if (nl.length >= 2)
546
- start = it.sep.splice(nl[1]);
547
- }
548
- switch (this.type) {
549
- case 'anchor':
550
- case 'tag':
551
- if (atNextItem || it.value) {
552
- start.push(this.sourceToken);
553
- map.items.push({ start });
554
- this.onKeyLine = true;
555
- }
556
- else if (it.sep) {
557
- it.sep.push(this.sourceToken);
558
- }
559
- else {
560
- it.start.push(this.sourceToken);
561
- }
562
- return;
563
- case 'explicit-key-ind':
564
- if (!it.sep && !it.explicitKey) {
565
- it.start.push(this.sourceToken);
566
- it.explicitKey = true;
567
- }
568
- else if (atNextItem || it.value) {
569
- start.push(this.sourceToken);
570
- map.items.push({ start, explicitKey: true });
571
- }
572
- else {
573
- this.stack.push({
574
- type: 'block-map',
575
- offset: this.offset,
576
- indent: this.indent,
577
- items: [{ start: [this.sourceToken], explicitKey: true }]
578
- });
579
- }
580
- this.onKeyLine = true;
581
- return;
582
- case 'map-value-ind':
583
- if (it.explicitKey) {
584
- if (!it.sep) {
585
- if (includesToken(it.start, 'newline')) {
586
- Object.assign(it, { key: null, sep: [this.sourceToken] });
587
- }
588
- else {
589
- const start = getFirstKeyStartProps(it.start);
590
- this.stack.push({
591
- type: 'block-map',
592
- offset: this.offset,
593
- indent: this.indent,
594
- items: [{ start, key: null, sep: [this.sourceToken] }]
595
- });
596
- }
597
- }
598
- else if (it.value) {
599
- map.items.push({ start: [], key: null, sep: [this.sourceToken] });
600
- }
601
- else if (includesToken(it.sep, 'map-value-ind')) {
602
- this.stack.push({
603
- type: 'block-map',
604
- offset: this.offset,
605
- indent: this.indent,
606
- items: [{ start, key: null, sep: [this.sourceToken] }]
607
- });
608
- }
609
- else if (isFlowToken(it.key) &&
610
- !includesToken(it.sep, 'newline')) {
611
- const start = getFirstKeyStartProps(it.start);
612
- const key = it.key;
613
- const sep = it.sep;
614
- sep.push(this.sourceToken);
615
- // @ts-expect-error type guard is wrong here
616
- delete it.key;
617
- // @ts-expect-error type guard is wrong here
618
- delete it.sep;
619
- this.stack.push({
620
- type: 'block-map',
621
- offset: this.offset,
622
- indent: this.indent,
623
- items: [{ start, key, sep }]
624
- });
625
- }
626
- else if (start.length > 0) {
627
- // Not actually at next item
628
- it.sep = it.sep.concat(start, this.sourceToken);
629
- }
630
- else {
631
- it.sep.push(this.sourceToken);
632
- }
633
- }
634
- else {
635
- if (!it.sep) {
636
- Object.assign(it, { key: null, sep: [this.sourceToken] });
637
- }
638
- else if (it.value || atNextItem) {
639
- map.items.push({ start, key: null, sep: [this.sourceToken] });
640
- }
641
- else if (includesToken(it.sep, 'map-value-ind')) {
642
- this.stack.push({
643
- type: 'block-map',
644
- offset: this.offset,
645
- indent: this.indent,
646
- items: [{ start: [], key: null, sep: [this.sourceToken] }]
647
- });
648
- }
649
- else {
650
- it.sep.push(this.sourceToken);
651
- }
652
- }
653
- this.onKeyLine = true;
654
- return;
655
- case 'alias':
656
- case 'scalar':
657
- case 'single-quoted-scalar':
658
- case 'double-quoted-scalar': {
659
- const fs = this.flowScalar(this.type);
660
- if (atNextItem || it.value) {
661
- map.items.push({ start, key: fs, sep: [] });
662
- this.onKeyLine = true;
663
- }
664
- else if (it.sep) {
665
- this.stack.push(fs);
666
- }
667
- else {
668
- Object.assign(it, { key: fs, sep: [] });
669
- this.onKeyLine = true;
670
- }
671
- return;
672
- }
673
- default: {
674
- const bv = this.startBlockValue(map);
675
- if (bv) {
676
- if (bv.type === 'block-seq') {
677
- if (!it.explicitKey &&
678
- it.sep &&
679
- !includesToken(it.sep, 'newline')) {
680
- yield* this.pop({
681
- type: 'error',
682
- offset: this.offset,
683
- message: 'Unexpected block-seq-ind on same line with key',
684
- source: this.source
685
- });
686
- return;
687
- }
688
- }
689
- else if (atMapIndent) {
690
- map.items.push({ start });
691
- }
692
- this.stack.push(bv);
693
- return;
694
- }
695
- }
696
- }
697
- }
698
- yield* this.pop();
699
- yield* this.step();
700
- }
701
- *blockSequence(seq) {
702
- const it = seq.items[seq.items.length - 1];
703
- switch (this.type) {
704
- case 'newline':
705
- if (it.value) {
706
- const end = 'end' in it.value ? it.value.end : undefined;
707
- const last = Array.isArray(end) ? end[end.length - 1] : undefined;
708
- if (last?.type === 'comment')
709
- end?.push(this.sourceToken);
710
- else
711
- seq.items.push({ start: [this.sourceToken] });
712
- }
713
- else
714
- it.start.push(this.sourceToken);
715
- return;
716
- case 'space':
717
- case 'comment':
718
- if (it.value)
719
- seq.items.push({ start: [this.sourceToken] });
720
- else {
721
- if (this.atIndentedComment(it.start, seq.indent)) {
722
- const prev = seq.items[seq.items.length - 2];
723
- const end = prev?.value?.end;
724
- if (Array.isArray(end)) {
725
- Array.prototype.push.apply(end, it.start);
726
- end.push(this.sourceToken);
727
- seq.items.pop();
728
- return;
729
- }
730
- }
731
- it.start.push(this.sourceToken);
732
- }
733
- return;
734
- case 'anchor':
735
- case 'tag':
736
- if (it.value || this.indent <= seq.indent)
737
- break;
738
- it.start.push(this.sourceToken);
739
- return;
740
- case 'seq-item-ind':
741
- if (this.indent !== seq.indent)
742
- break;
743
- if (it.value || includesToken(it.start, 'seq-item-ind'))
744
- seq.items.push({ start: [this.sourceToken] });
745
- else
746
- it.start.push(this.sourceToken);
747
- return;
748
- }
749
- if (this.indent > seq.indent) {
750
- const bv = this.startBlockValue(seq);
751
- if (bv) {
752
- this.stack.push(bv);
753
- return;
754
- }
755
- }
756
- yield* this.pop();
757
- yield* this.step();
758
- }
759
- *flowCollection(fc) {
760
- const it = fc.items[fc.items.length - 1];
761
- if (this.type === 'flow-error-end') {
762
- let top;
763
- do {
764
- yield* this.pop();
765
- top = this.peek(1);
766
- } while (top?.type === 'flow-collection');
767
- }
768
- else if (fc.end.length === 0) {
769
- switch (this.type) {
770
- case 'comma':
771
- case 'explicit-key-ind':
772
- if (!it || it.sep)
773
- fc.items.push({ start: [this.sourceToken] });
774
- else
775
- it.start.push(this.sourceToken);
776
- return;
777
- case 'map-value-ind':
778
- if (!it || it.value)
779
- fc.items.push({ start: [], key: null, sep: [this.sourceToken] });
780
- else if (it.sep)
781
- it.sep.push(this.sourceToken);
782
- else
783
- Object.assign(it, { key: null, sep: [this.sourceToken] });
784
- return;
785
- case 'space':
786
- case 'comment':
787
- case 'newline':
788
- case 'anchor':
789
- case 'tag':
790
- if (!it || it.value)
791
- fc.items.push({ start: [this.sourceToken] });
792
- else if (it.sep)
793
- it.sep.push(this.sourceToken);
794
- else
795
- it.start.push(this.sourceToken);
796
- return;
797
- case 'alias':
798
- case 'scalar':
799
- case 'single-quoted-scalar':
800
- case 'double-quoted-scalar': {
801
- const fs = this.flowScalar(this.type);
802
- if (!it || it.value)
803
- fc.items.push({ start: [], key: fs, sep: [] });
804
- else if (it.sep)
805
- this.stack.push(fs);
806
- else
807
- Object.assign(it, { key: fs, sep: [] });
808
- return;
809
- }
810
- case 'flow-map-end':
811
- case 'flow-seq-end':
812
- fc.end.push(this.sourceToken);
813
- return;
814
- }
815
- const bv = this.startBlockValue(fc);
816
- /* istanbul ignore else should not happen */
817
- if (bv)
818
- this.stack.push(bv);
819
- else {
820
- yield* this.pop();
821
- yield* this.step();
822
- }
823
- }
824
- else {
825
- const parent = this.peek(2);
826
- if (parent.type === 'block-map' &&
827
- ((this.type === 'map-value-ind' && parent.indent === fc.indent) ||
828
- (this.type === 'newline' &&
829
- !parent.items[parent.items.length - 1].sep))) {
830
- yield* this.pop();
831
- yield* this.step();
832
- }
833
- else if (this.type === 'map-value-ind' &&
834
- parent.type !== 'flow-collection') {
835
- const prev = getPrevProps(parent);
836
- const start = getFirstKeyStartProps(prev);
837
- fixFlowSeqItems(fc);
838
- const sep = fc.end.splice(1, fc.end.length);
839
- sep.push(this.sourceToken);
840
- const map = {
841
- type: 'block-map',
842
- offset: fc.offset,
843
- indent: fc.indent,
844
- items: [{ start, key: fc, sep }]
845
- };
846
- this.onKeyLine = true;
847
- this.stack[this.stack.length - 1] = map;
848
- }
849
- else {
850
- yield* this.lineEnd(fc);
851
- }
852
- }
853
- }
854
- flowScalar(type) {
855
- if (this.onNewLine) {
856
- let nl = this.source.indexOf('\n') + 1;
857
- while (nl !== 0) {
858
- this.onNewLine(this.offset + nl);
859
- nl = this.source.indexOf('\n', nl) + 1;
860
- }
861
- }
862
- return {
863
- type,
864
- offset: this.offset,
865
- indent: this.indent,
866
- source: this.source
867
- };
868
- }
869
- startBlockValue(parent) {
870
- switch (this.type) {
871
- case 'alias':
872
- case 'scalar':
873
- case 'single-quoted-scalar':
874
- case 'double-quoted-scalar':
875
- return this.flowScalar(this.type);
876
- case 'block-scalar-header':
877
- return {
878
- type: 'block-scalar',
879
- offset: this.offset,
880
- indent: this.indent,
881
- props: [this.sourceToken],
882
- source: ''
883
- };
884
- case 'flow-map-start':
885
- case 'flow-seq-start':
886
- return {
887
- type: 'flow-collection',
888
- offset: this.offset,
889
- indent: this.indent,
890
- start: this.sourceToken,
891
- items: [],
892
- end: []
893
- };
894
- case 'seq-item-ind':
895
- return {
896
- type: 'block-seq',
897
- offset: this.offset,
898
- indent: this.indent,
899
- items: [{ start: [this.sourceToken] }]
900
- };
901
- case 'explicit-key-ind': {
902
- this.onKeyLine = true;
903
- const prev = getPrevProps(parent);
904
- const start = getFirstKeyStartProps(prev);
905
- start.push(this.sourceToken);
906
- return {
907
- type: 'block-map',
908
- offset: this.offset,
909
- indent: this.indent,
910
- items: [{ start, explicitKey: true }]
911
- };
912
- }
913
- case 'map-value-ind': {
914
- this.onKeyLine = true;
915
- const prev = getPrevProps(parent);
916
- const start = getFirstKeyStartProps(prev);
917
- return {
918
- type: 'block-map',
919
- offset: this.offset,
920
- indent: this.indent,
921
- items: [{ start, key: null, sep: [this.sourceToken] }]
922
- };
923
- }
924
- }
925
- return null;
926
- }
927
- atIndentedComment(start, indent) {
928
- if (this.type !== 'comment')
929
- return false;
930
- if (this.indent <= indent)
931
- return false;
932
- return start.every(st => st.type === 'newline' || st.type === 'space');
933
- }
934
- *documentEnd(docEnd) {
935
- if (this.type !== 'doc-mode') {
936
- if (docEnd.end)
937
- docEnd.end.push(this.sourceToken);
938
- else
939
- docEnd.end = [this.sourceToken];
940
- if (this.type === 'newline')
941
- yield* this.pop();
942
- }
943
- }
944
- *lineEnd(token) {
945
- switch (this.type) {
946
- case 'comma':
947
- case 'doc-start':
948
- case 'doc-end':
949
- case 'flow-seq-end':
950
- case 'flow-map-end':
951
- case 'map-value-ind':
952
- yield* this.pop();
953
- yield* this.step();
954
- break;
955
- case 'newline':
956
- this.onKeyLine = false;
957
- // fallthrough
958
- case 'space':
959
- case 'comment':
960
- default:
961
- // all other values are errors
962
- if (token.end)
963
- token.end.push(this.sourceToken);
964
- else
965
- token.end = [this.sourceToken];
966
- if (this.type === 'newline')
967
- yield* this.pop();
968
- }
969
- }
970
- }
971
-
972
- exports.Parser = Parser;