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,198 +0,0 @@
1
- import { Scalar } from '../nodes/Scalar.js';
2
-
3
- function resolveBlockScalar(ctx, scalar, onError) {
4
- const start = scalar.offset;
5
- const header = parseBlockScalarHeader(scalar, ctx.options.strict, onError);
6
- if (!header)
7
- return { value: '', type: null, comment: '', range: [start, start, start] };
8
- const type = header.mode === '>' ? Scalar.BLOCK_FOLDED : Scalar.BLOCK_LITERAL;
9
- const lines = scalar.source ? splitLines(scalar.source) : [];
10
- // determine the end of content & start of chomping
11
- let chompStart = lines.length;
12
- for (let i = lines.length - 1; i >= 0; --i) {
13
- const content = lines[i][1];
14
- if (content === '' || content === '\r')
15
- chompStart = i;
16
- else
17
- break;
18
- }
19
- // shortcut for empty contents
20
- if (chompStart === 0) {
21
- const value = header.chomp === '+' && lines.length > 0
22
- ? '\n'.repeat(Math.max(1, lines.length - 1))
23
- : '';
24
- let end = start + header.length;
25
- if (scalar.source)
26
- end += scalar.source.length;
27
- return { value, type, comment: header.comment, range: [start, end, end] };
28
- }
29
- // find the indentation level to trim from start
30
- let trimIndent = scalar.indent + header.indent;
31
- let offset = scalar.offset + header.length;
32
- let contentStart = 0;
33
- for (let i = 0; i < chompStart; ++i) {
34
- const [indent, content] = lines[i];
35
- if (content === '' || content === '\r') {
36
- if (header.indent === 0 && indent.length > trimIndent)
37
- trimIndent = indent.length;
38
- }
39
- else {
40
- if (indent.length < trimIndent) {
41
- const message = 'Block scalars with more-indented leading empty lines must use an explicit indentation indicator';
42
- onError(offset + indent.length, 'MISSING_CHAR', message);
43
- }
44
- if (header.indent === 0)
45
- trimIndent = indent.length;
46
- contentStart = i;
47
- if (trimIndent === 0 && !ctx.atRoot) {
48
- const message = 'Block scalar values in collections must be indented';
49
- onError(offset, 'BAD_INDENT', message);
50
- }
51
- break;
52
- }
53
- offset += indent.length + content.length + 1;
54
- }
55
- // include trailing more-indented empty lines in content
56
- for (let i = lines.length - 1; i >= chompStart; --i) {
57
- if (lines[i][0].length > trimIndent)
58
- chompStart = i + 1;
59
- }
60
- let value = '';
61
- let sep = '';
62
- let prevMoreIndented = false;
63
- // leading whitespace is kept intact
64
- for (let i = 0; i < contentStart; ++i)
65
- value += lines[i][0].slice(trimIndent) + '\n';
66
- for (let i = contentStart; i < chompStart; ++i) {
67
- let [indent, content] = lines[i];
68
- offset += indent.length + content.length + 1;
69
- const crlf = content[content.length - 1] === '\r';
70
- if (crlf)
71
- content = content.slice(0, -1);
72
- /* istanbul ignore if already caught in lexer */
73
- if (content && indent.length < trimIndent) {
74
- const src = header.indent
75
- ? 'explicit indentation indicator'
76
- : 'first line';
77
- const message = `Block scalar lines must not be less indented than their ${src}`;
78
- onError(offset - content.length - (crlf ? 2 : 1), 'BAD_INDENT', message);
79
- indent = '';
80
- }
81
- if (type === Scalar.BLOCK_LITERAL) {
82
- value += sep + indent.slice(trimIndent) + content;
83
- sep = '\n';
84
- }
85
- else if (indent.length > trimIndent || content[0] === '\t') {
86
- // more-indented content within a folded block
87
- if (sep === ' ')
88
- sep = '\n';
89
- else if (!prevMoreIndented && sep === '\n')
90
- sep = '\n\n';
91
- value += sep + indent.slice(trimIndent) + content;
92
- sep = '\n';
93
- prevMoreIndented = true;
94
- }
95
- else if (content === '') {
96
- // empty line
97
- if (sep === '\n')
98
- value += '\n';
99
- else
100
- sep = '\n';
101
- }
102
- else {
103
- value += sep + content;
104
- sep = ' ';
105
- prevMoreIndented = false;
106
- }
107
- }
108
- switch (header.chomp) {
109
- case '-':
110
- break;
111
- case '+':
112
- for (let i = chompStart; i < lines.length; ++i)
113
- value += '\n' + lines[i][0].slice(trimIndent);
114
- if (value[value.length - 1] !== '\n')
115
- value += '\n';
116
- break;
117
- default:
118
- value += '\n';
119
- }
120
- const end = start + header.length + scalar.source.length;
121
- return { value, type, comment: header.comment, range: [start, end, end] };
122
- }
123
- function parseBlockScalarHeader({ offset, props }, strict, onError) {
124
- /* istanbul ignore if should not happen */
125
- if (props[0].type !== 'block-scalar-header') {
126
- onError(props[0], 'IMPOSSIBLE', 'Block scalar header not found');
127
- return null;
128
- }
129
- const { source } = props[0];
130
- const mode = source[0];
131
- let indent = 0;
132
- let chomp = '';
133
- let error = -1;
134
- for (let i = 1; i < source.length; ++i) {
135
- const ch = source[i];
136
- if (!chomp && (ch === '-' || ch === '+'))
137
- chomp = ch;
138
- else {
139
- const n = Number(ch);
140
- if (!indent && n)
141
- indent = n;
142
- else if (error === -1)
143
- error = offset + i;
144
- }
145
- }
146
- if (error !== -1)
147
- onError(error, 'UNEXPECTED_TOKEN', `Block scalar header includes extra characters: ${source}`);
148
- let hasSpace = false;
149
- let comment = '';
150
- let length = source.length;
151
- for (let i = 1; i < props.length; ++i) {
152
- const token = props[i];
153
- switch (token.type) {
154
- case 'space':
155
- hasSpace = true;
156
- // fallthrough
157
- case 'newline':
158
- length += token.source.length;
159
- break;
160
- case 'comment':
161
- if (strict && !hasSpace) {
162
- const message = 'Comments must be separated from other tokens by white space characters';
163
- onError(token, 'MISSING_CHAR', message);
164
- }
165
- length += token.source.length;
166
- comment = token.source.substring(1);
167
- break;
168
- case 'error':
169
- onError(token, 'UNEXPECTED_TOKEN', token.message);
170
- length += token.source.length;
171
- break;
172
- /* istanbul ignore next should not happen */
173
- default: {
174
- const message = `Unexpected token in block scalar header: ${token.type}`;
175
- onError(token, 'UNEXPECTED_TOKEN', message);
176
- const ts = token.source;
177
- if (ts && typeof ts === 'string')
178
- length += ts.length;
179
- }
180
- }
181
- }
182
- return { mode, indent, chomp, comment, length };
183
- }
184
- /** @returns Array of lines split up as `[indent, content]` */
185
- function splitLines(source) {
186
- const split = source.split(/\n( *)/);
187
- const first = split[0];
188
- const m = first.match(/^( *)/);
189
- const line0 = m?.[1]
190
- ? [m[1], first.slice(m[1].length)]
191
- : ['', first];
192
- const lines = [line0];
193
- for (let i = 1; i < split.length; i += 2)
194
- lines.push([split[i], split[i + 1]]);
195
- return lines;
196
- }
197
-
198
- export { resolveBlockScalar };
@@ -1,49 +0,0 @@
1
- import { YAMLSeq } from '../nodes/YAMLSeq.js';
2
- import { resolveProps } from './resolve-props.js';
3
- import { flowIndentCheck } from './util-flow-indent-check.js';
4
-
5
- function resolveBlockSeq({ composeNode, composeEmptyNode }, ctx, bs, onError, tag) {
6
- const NodeClass = tag?.nodeClass ?? YAMLSeq;
7
- const seq = new NodeClass(ctx.schema);
8
- if (ctx.atRoot)
9
- ctx.atRoot = false;
10
- if (ctx.atKey)
11
- ctx.atKey = false;
12
- let offset = bs.offset;
13
- let commentEnd = null;
14
- for (const { start, value } of bs.items) {
15
- const props = resolveProps(start, {
16
- indicator: 'seq-item-ind',
17
- next: value,
18
- offset,
19
- onError,
20
- parentIndent: bs.indent,
21
- startOnNewline: true
22
- });
23
- if (!props.found) {
24
- if (props.anchor || props.tag || value) {
25
- if (value?.type === 'block-seq')
26
- onError(props.end, 'BAD_INDENT', 'All sequence items must start at the same column');
27
- else
28
- onError(offset, 'MISSING_CHAR', 'Sequence item without - indicator');
29
- }
30
- else {
31
- commentEnd = props.end;
32
- if (props.comment)
33
- seq.comment = props.comment;
34
- continue;
35
- }
36
- }
37
- const node = value
38
- ? composeNode(ctx, value, props, onError)
39
- : composeEmptyNode(ctx, props.end, start, null, props, onError);
40
- if (ctx.schema.compat)
41
- flowIndentCheck(bs.indent, value, onError);
42
- offset = node.range[2];
43
- seq.items.push(node);
44
- }
45
- seq.range = [bs.offset, offset, commentEnd ?? offset];
46
- return seq;
47
- }
48
-
49
- export { resolveBlockSeq };
@@ -1,37 +0,0 @@
1
- function resolveEnd(end, offset, reqSpace, onError) {
2
- let comment = '';
3
- if (end) {
4
- let hasSpace = false;
5
- let sep = '';
6
- for (const token of end) {
7
- const { source, type } = token;
8
- switch (type) {
9
- case 'space':
10
- hasSpace = true;
11
- break;
12
- case 'comment': {
13
- if (reqSpace && !hasSpace)
14
- onError(token, 'MISSING_CHAR', 'Comments must be separated from other tokens by white space characters');
15
- const cb = source.substring(1) || ' ';
16
- if (!comment)
17
- comment = cb;
18
- else
19
- comment += sep + cb;
20
- sep = '';
21
- break;
22
- }
23
- case 'newline':
24
- if (comment)
25
- sep += source;
26
- hasSpace = true;
27
- break;
28
- default:
29
- onError(token, 'UNEXPECTED_TOKEN', `Unexpected ${type} at node end`);
30
- }
31
- offset += source.length;
32
- }
33
- }
34
- return { comment, offset };
35
- }
36
-
37
- export { resolveEnd };
@@ -1,207 +0,0 @@
1
- import { isPair } from '../nodes/identity.js';
2
- import { Pair } from '../nodes/Pair.js';
3
- import { YAMLMap } from '../nodes/YAMLMap.js';
4
- import { YAMLSeq } from '../nodes/YAMLSeq.js';
5
- import { resolveEnd } from './resolve-end.js';
6
- import { resolveProps } from './resolve-props.js';
7
- import { containsNewline } from './util-contains-newline.js';
8
- import { mapIncludes } from './util-map-includes.js';
9
-
10
- const blockMsg = 'Block collections are not allowed within flow collections';
11
- const isBlock = (token) => token && (token.type === 'block-map' || token.type === 'block-seq');
12
- function resolveFlowCollection({ composeNode, composeEmptyNode }, ctx, fc, onError, tag) {
13
- const isMap = fc.start.source === '{';
14
- const fcName = isMap ? 'flow map' : 'flow sequence';
15
- const NodeClass = (tag?.nodeClass ?? (isMap ? YAMLMap : YAMLSeq));
16
- const coll = new NodeClass(ctx.schema);
17
- coll.flow = true;
18
- const atRoot = ctx.atRoot;
19
- if (atRoot)
20
- ctx.atRoot = false;
21
- if (ctx.atKey)
22
- ctx.atKey = false;
23
- let offset = fc.offset + fc.start.source.length;
24
- for (let i = 0; i < fc.items.length; ++i) {
25
- const collItem = fc.items[i];
26
- const { start, key, sep, value } = collItem;
27
- const props = resolveProps(start, {
28
- flow: fcName,
29
- indicator: 'explicit-key-ind',
30
- next: key ?? sep?.[0],
31
- offset,
32
- onError,
33
- parentIndent: fc.indent,
34
- startOnNewline: false
35
- });
36
- if (!props.found) {
37
- if (!props.anchor && !props.tag && !sep && !value) {
38
- if (i === 0 && props.comma)
39
- onError(props.comma, 'UNEXPECTED_TOKEN', `Unexpected , in ${fcName}`);
40
- else if (i < fc.items.length - 1)
41
- onError(props.start, 'UNEXPECTED_TOKEN', `Unexpected empty item in ${fcName}`);
42
- if (props.comment) {
43
- if (coll.comment)
44
- coll.comment += '\n' + props.comment;
45
- else
46
- coll.comment = props.comment;
47
- }
48
- offset = props.end;
49
- continue;
50
- }
51
- if (!isMap && ctx.options.strict && containsNewline(key))
52
- onError(key, // checked by containsNewline()
53
- 'MULTILINE_IMPLICIT_KEY', 'Implicit keys of flow sequence pairs need to be on a single line');
54
- }
55
- if (i === 0) {
56
- if (props.comma)
57
- onError(props.comma, 'UNEXPECTED_TOKEN', `Unexpected , in ${fcName}`);
58
- }
59
- else {
60
- if (!props.comma)
61
- onError(props.start, 'MISSING_CHAR', `Missing , between ${fcName} items`);
62
- if (props.comment) {
63
- let prevItemComment = '';
64
- loop: for (const st of start) {
65
- switch (st.type) {
66
- case 'comma':
67
- case 'space':
68
- break;
69
- case 'comment':
70
- prevItemComment = st.source.substring(1);
71
- break loop;
72
- default:
73
- break loop;
74
- }
75
- }
76
- if (prevItemComment) {
77
- let prev = coll.items[coll.items.length - 1];
78
- if (isPair(prev))
79
- prev = prev.value ?? prev.key;
80
- if (prev.comment)
81
- prev.comment += '\n' + prevItemComment;
82
- else
83
- prev.comment = prevItemComment;
84
- props.comment = props.comment.substring(prevItemComment.length + 1);
85
- }
86
- }
87
- }
88
- if (!isMap && !sep && !props.found) {
89
- // item is a value in a seq
90
- // → key & sep are empty, start does not include ? or :
91
- const valueNode = value
92
- ? composeNode(ctx, value, props, onError)
93
- : composeEmptyNode(ctx, props.end, sep, null, props, onError);
94
- coll.items.push(valueNode);
95
- offset = valueNode.range[2];
96
- if (isBlock(value))
97
- onError(valueNode.range, 'BLOCK_IN_FLOW', blockMsg);
98
- }
99
- else {
100
- // item is a key+value pair
101
- // key value
102
- ctx.atKey = true;
103
- const keyStart = props.end;
104
- const keyNode = key
105
- ? composeNode(ctx, key, props, onError)
106
- : composeEmptyNode(ctx, keyStart, start, null, props, onError);
107
- if (isBlock(key))
108
- onError(keyNode.range, 'BLOCK_IN_FLOW', blockMsg);
109
- ctx.atKey = false;
110
- // value properties
111
- const valueProps = resolveProps(sep ?? [], {
112
- flow: fcName,
113
- indicator: 'map-value-ind',
114
- next: value,
115
- offset: keyNode.range[2],
116
- onError,
117
- parentIndent: fc.indent,
118
- startOnNewline: false
119
- });
120
- if (valueProps.found) {
121
- if (!isMap && !props.found && ctx.options.strict) {
122
- if (sep)
123
- for (const st of sep) {
124
- if (st === valueProps.found)
125
- break;
126
- if (st.type === 'newline') {
127
- onError(st, 'MULTILINE_IMPLICIT_KEY', 'Implicit keys of flow sequence pairs need to be on a single line');
128
- break;
129
- }
130
- }
131
- if (props.start < valueProps.found.offset - 1024)
132
- onError(valueProps.found, 'KEY_OVER_1024_CHARS', 'The : indicator must be at most 1024 chars after the start of an implicit flow sequence key');
133
- }
134
- }
135
- else if (value) {
136
- if ('source' in value && value.source?.[0] === ':')
137
- onError(value, 'MISSING_CHAR', `Missing space after : in ${fcName}`);
138
- else
139
- onError(valueProps.start, 'MISSING_CHAR', `Missing , or : between ${fcName} items`);
140
- }
141
- // value value
142
- const valueNode = value
143
- ? composeNode(ctx, value, valueProps, onError)
144
- : valueProps.found
145
- ? composeEmptyNode(ctx, valueProps.end, sep, null, valueProps, onError)
146
- : null;
147
- if (valueNode) {
148
- if (isBlock(value))
149
- onError(valueNode.range, 'BLOCK_IN_FLOW', blockMsg);
150
- }
151
- else if (valueProps.comment) {
152
- if (keyNode.comment)
153
- keyNode.comment += '\n' + valueProps.comment;
154
- else
155
- keyNode.comment = valueProps.comment;
156
- }
157
- const pair = new Pair(keyNode, valueNode);
158
- if (ctx.options.keepSourceTokens)
159
- pair.srcToken = collItem;
160
- if (isMap) {
161
- const map = coll;
162
- if (mapIncludes(ctx, map.items, keyNode))
163
- onError(keyStart, 'DUPLICATE_KEY', 'Map keys must be unique');
164
- map.items.push(pair);
165
- }
166
- else {
167
- const map = new YAMLMap(ctx.schema);
168
- map.flow = true;
169
- map.items.push(pair);
170
- const endRange = (valueNode ?? keyNode).range;
171
- map.range = [keyNode.range[0], endRange[1], endRange[2]];
172
- coll.items.push(map);
173
- }
174
- offset = valueNode ? valueNode.range[2] : valueProps.end;
175
- }
176
- }
177
- const expectedEnd = isMap ? '}' : ']';
178
- const [ce, ...ee] = fc.end;
179
- let cePos = offset;
180
- if (ce?.source === expectedEnd)
181
- cePos = ce.offset + ce.source.length;
182
- else {
183
- const name = fcName[0].toUpperCase() + fcName.substring(1);
184
- const msg = atRoot
185
- ? `${name} must end with a ${expectedEnd}`
186
- : `${name} in block collection must be sufficiently indented and end with a ${expectedEnd}`;
187
- onError(offset, atRoot ? 'MISSING_CHAR' : 'BAD_INDENT', msg);
188
- if (ce && ce.source.length !== 1)
189
- ee.unshift(ce);
190
- }
191
- if (ee.length > 0) {
192
- const end = resolveEnd(ee, cePos, ctx.options.strict, onError);
193
- if (end.comment) {
194
- if (coll.comment)
195
- coll.comment += '\n' + end.comment;
196
- else
197
- coll.comment = end.comment;
198
- }
199
- coll.range = [fc.offset, cePos, end.offset];
200
- }
201
- else {
202
- coll.range = [fc.offset, cePos, cePos];
203
- }
204
- return coll;
205
- }
206
-
207
- export { resolveFlowCollection };