yaml 2.0.0-0 → 2.0.0-11

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 (250) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +51 -35
  3. package/browser/dist/compose/compose-collection.js +59 -0
  4. package/browser/dist/compose/compose-doc.js +40 -0
  5. package/browser/dist/compose/compose-node.js +90 -0
  6. package/browser/dist/compose/compose-scalar.js +81 -0
  7. package/browser/dist/compose/composer.js +217 -0
  8. package/browser/dist/compose/resolve-block-map.js +107 -0
  9. package/browser/dist/compose/resolve-block-scalar.js +192 -0
  10. package/browser/dist/compose/resolve-block-seq.js +45 -0
  11. package/browser/dist/compose/resolve-end.js +37 -0
  12. package/browser/dist/compose/resolve-flow-collection.js +200 -0
  13. package/browser/dist/compose/resolve-flow-scalar.js +223 -0
  14. package/browser/dist/compose/resolve-props.js +130 -0
  15. package/browser/dist/compose/util-contains-newline.js +34 -0
  16. package/browser/dist/compose/util-empty-scalar-position.js +27 -0
  17. package/browser/dist/compose/util-flow-indent-check.js +15 -0
  18. package/browser/dist/compose/util-map-includes.js +17 -0
  19. package/browser/dist/doc/Document.js +328 -0
  20. package/browser/dist/doc/anchors.js +72 -0
  21. package/browser/dist/doc/applyReviver.js +54 -0
  22. package/browser/dist/doc/createNode.js +84 -0
  23. package/browser/dist/doc/directives.js +169 -0
  24. package/browser/dist/errors.js +57 -0
  25. package/browser/dist/index.js +17 -1045
  26. package/browser/dist/log.js +14 -0
  27. package/browser/dist/node_modules/tslib/tslib.es6.js +164 -0
  28. package/browser/dist/nodes/Alias.js +94 -0
  29. package/browser/dist/nodes/Collection.js +146 -0
  30. package/browser/dist/nodes/Node.js +48 -0
  31. package/browser/dist/nodes/Pair.js +36 -0
  32. package/browser/dist/nodes/Scalar.js +23 -0
  33. package/browser/dist/nodes/YAMLMap.js +116 -0
  34. package/browser/dist/nodes/YAMLSeq.js +105 -0
  35. package/browser/dist/nodes/addPairToJSMap.js +104 -0
  36. package/browser/dist/nodes/toJS.js +35 -0
  37. package/browser/dist/parse/cst-scalar.js +215 -0
  38. package/browser/dist/parse/cst-stringify.js +61 -0
  39. package/browser/dist/parse/cst-visit.js +97 -0
  40. package/browser/dist/parse/cst.js +98 -0
  41. package/browser/dist/parse/lexer.js +701 -0
  42. package/browser/dist/parse/line-counter.js +39 -0
  43. package/browser/dist/parse/parser.js +916 -0
  44. package/browser/dist/public-api.js +99 -0
  45. package/browser/dist/schema/Schema.js +34 -0
  46. package/browser/dist/schema/common/map.js +42 -0
  47. package/browser/dist/schema/common/null.js +15 -0
  48. package/browser/dist/schema/common/seq.js +33 -0
  49. package/browser/dist/schema/common/string.js +14 -0
  50. package/browser/dist/schema/core/bool.js +19 -0
  51. package/browser/dist/schema/core/float.js +43 -0
  52. package/browser/dist/schema/core/int.js +38 -0
  53. package/browser/dist/schema/core/schema.js +23 -0
  54. package/browser/dist/schema/json/schema.js +62 -0
  55. package/browser/dist/schema/tags.js +83 -0
  56. package/browser/dist/schema/yaml-1.1/binary.js +66 -0
  57. package/browser/dist/schema/yaml-1.1/bool.js +26 -0
  58. package/browser/dist/schema/yaml-1.1/float.js +46 -0
  59. package/browser/dist/schema/yaml-1.1/int.js +71 -0
  60. package/browser/dist/schema/yaml-1.1/omap.js +73 -0
  61. package/browser/dist/schema/yaml-1.1/pairs.js +77 -0
  62. package/browser/dist/schema/yaml-1.1/schema.js +37 -0
  63. package/browser/dist/schema/yaml-1.1/set.js +87 -0
  64. package/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
  65. package/browser/dist/stringify/foldFlowLines.js +135 -0
  66. package/browser/dist/stringify/stringify.js +124 -0
  67. package/browser/dist/stringify/stringifyCollection.js +152 -0
  68. package/browser/dist/stringify/stringifyComment.js +18 -0
  69. package/browser/dist/stringify/stringifyDocument.js +86 -0
  70. package/browser/dist/stringify/stringifyNumber.js +24 -0
  71. package/browser/dist/stringify/stringifyPair.js +122 -0
  72. package/browser/dist/stringify/stringifyString.js +314 -0
  73. package/browser/dist/util.js +9 -2
  74. package/browser/dist/visit.js +234 -0
  75. package/browser/index.js +5 -1
  76. package/browser/package.json +3 -0
  77. package/dist/compose/compose-collection.d.ts +5 -0
  78. package/dist/compose/compose-collection.js +61 -0
  79. package/dist/compose/compose-doc.d.ts +6 -0
  80. package/dist/compose/compose-doc.js +42 -0
  81. package/dist/compose/compose-node.d.ts +26 -0
  82. package/dist/compose/compose-node.js +93 -0
  83. package/dist/compose/compose-scalar.d.ts +5 -0
  84. package/dist/compose/compose-scalar.js +83 -0
  85. package/dist/compose/composer.d.ts +62 -0
  86. package/dist/compose/composer.js +221 -0
  87. package/dist/compose/resolve-block-map.d.ts +6 -0
  88. package/dist/compose/resolve-block-map.js +109 -0
  89. package/dist/compose/resolve-block-scalar.d.ts +10 -0
  90. package/dist/compose/resolve-block-scalar.js +194 -0
  91. package/dist/compose/resolve-block-seq.d.ts +5 -0
  92. package/dist/compose/resolve-block-seq.js +47 -0
  93. package/dist/compose/resolve-end.d.ts +6 -0
  94. package/dist/compose/resolve-end.js +39 -0
  95. package/dist/compose/resolve-flow-collection.d.ts +6 -0
  96. package/dist/compose/resolve-flow-collection.js +202 -0
  97. package/dist/compose/resolve-flow-scalar.d.ts +10 -0
  98. package/dist/compose/resolve-flow-scalar.js +225 -0
  99. package/dist/compose/resolve-props.d.ts +21 -0
  100. package/dist/compose/resolve-props.js +132 -0
  101. package/dist/compose/util-contains-newline.d.ts +2 -0
  102. package/dist/compose/util-contains-newline.js +36 -0
  103. package/dist/compose/util-empty-scalar-position.d.ts +2 -0
  104. package/dist/compose/util-empty-scalar-position.js +29 -0
  105. package/dist/compose/util-flow-indent-check.d.ts +3 -0
  106. package/dist/compose/util-flow-indent-check.js +17 -0
  107. package/dist/compose/util-map-includes.d.ts +4 -0
  108. package/dist/compose/util-map-includes.js +19 -0
  109. package/dist/doc/Document.d.ts +139 -0
  110. package/dist/doc/Document.js +330 -0
  111. package/dist/doc/anchors.d.ts +24 -0
  112. package/dist/doc/anchors.js +77 -0
  113. package/dist/doc/applyReviver.d.ts +9 -0
  114. package/dist/doc/applyReviver.js +56 -0
  115. package/dist/doc/createNode.d.ts +17 -0
  116. package/dist/doc/createNode.js +86 -0
  117. package/dist/doc/directives.d.ts +49 -0
  118. package/dist/doc/directives.js +171 -0
  119. package/dist/errors.d.ts +21 -0
  120. package/dist/errors.js +62 -0
  121. package/dist/index.d.ts +19 -0
  122. package/dist/index.js +48 -81
  123. package/dist/log.d.ts +3 -0
  124. package/dist/log.js +17 -0
  125. package/dist/node_modules/tslib/tslib.es6.js +76 -0
  126. package/dist/nodes/Alias.d.ts +28 -0
  127. package/dist/nodes/Alias.js +96 -0
  128. package/dist/nodes/Collection.d.ts +73 -0
  129. package/dist/nodes/Collection.js +150 -0
  130. package/dist/nodes/Node.d.ts +53 -0
  131. package/dist/nodes/Node.js +66 -0
  132. package/dist/nodes/Pair.d.ts +21 -0
  133. package/dist/nodes/Pair.js +39 -0
  134. package/dist/nodes/Scalar.d.ts +42 -0
  135. package/dist/nodes/Scalar.js +26 -0
  136. package/dist/nodes/YAMLMap.d.ts +41 -0
  137. package/dist/nodes/YAMLMap.js +119 -0
  138. package/dist/nodes/YAMLSeq.d.ts +55 -0
  139. package/dist/nodes/YAMLSeq.js +107 -0
  140. package/dist/nodes/addPairToJSMap.d.ts +3 -0
  141. package/dist/nodes/addPairToJSMap.js +106 -0
  142. package/dist/nodes/toJS.d.ts +30 -0
  143. package/dist/nodes/toJS.js +37 -0
  144. package/dist/options.d.ts +330 -0
  145. package/dist/parse/cst-scalar.d.ts +64 -0
  146. package/dist/parse/cst-scalar.js +219 -0
  147. package/dist/parse/cst-stringify.d.ts +8 -0
  148. package/dist/parse/cst-stringify.js +63 -0
  149. package/dist/parse/cst-visit.d.ts +39 -0
  150. package/dist/parse/cst-visit.js +99 -0
  151. package/dist/parse/cst.d.ts +106 -0
  152. package/dist/parse/cst.js +112 -0
  153. package/dist/parse/lexer.d.ts +87 -0
  154. package/dist/parse/lexer.js +703 -0
  155. package/dist/parse/line-counter.d.ts +22 -0
  156. package/dist/parse/line-counter.js +41 -0
  157. package/dist/parse/parser.d.ts +84 -0
  158. package/dist/parse/parser.js +920 -0
  159. package/dist/public-api.d.ts +43 -0
  160. package/dist/public-api.js +104 -0
  161. package/dist/schema/Schema.d.ts +18 -0
  162. package/dist/schema/Schema.js +36 -0
  163. package/dist/schema/common/map.d.ts +2 -0
  164. package/dist/schema/common/map.js +44 -0
  165. package/dist/schema/common/null.d.ts +4 -0
  166. package/dist/schema/common/null.js +17 -0
  167. package/dist/schema/common/seq.d.ts +2 -0
  168. package/dist/schema/common/seq.js +35 -0
  169. package/dist/schema/common/string.d.ts +2 -0
  170. package/dist/schema/common/string.js +16 -0
  171. package/dist/schema/core/bool.d.ts +4 -0
  172. package/dist/schema/core/bool.js +21 -0
  173. package/dist/schema/core/float.d.ts +4 -0
  174. package/dist/schema/core/float.js +47 -0
  175. package/dist/schema/core/int.d.ts +4 -0
  176. package/dist/schema/core/int.js +42 -0
  177. package/dist/schema/core/schema.d.ts +1 -0
  178. package/dist/schema/core/schema.js +25 -0
  179. package/dist/schema/json/schema.d.ts +2 -0
  180. package/dist/schema/json/schema.js +64 -0
  181. package/dist/schema/tags.d.ts +40 -0
  182. package/dist/schema/tags.js +86 -0
  183. package/dist/schema/types.d.ts +82 -0
  184. package/dist/schema/yaml-1.1/binary.d.ts +2 -0
  185. package/dist/schema/yaml-1.1/binary.js +68 -0
  186. package/dist/schema/yaml-1.1/bool.d.ts +7 -0
  187. package/dist/schema/yaml-1.1/bool.js +29 -0
  188. package/dist/schema/yaml-1.1/float.d.ts +4 -0
  189. package/dist/schema/yaml-1.1/float.js +50 -0
  190. package/dist/schema/yaml-1.1/int.d.ts +5 -0
  191. package/dist/schema/yaml-1.1/int.js +76 -0
  192. package/dist/schema/yaml-1.1/omap.d.ts +21 -0
  193. package/dist/schema/yaml-1.1/omap.js +76 -0
  194. package/dist/schema/yaml-1.1/pairs.d.ts +10 -0
  195. package/dist/schema/yaml-1.1/pairs.js +81 -0
  196. package/dist/schema/yaml-1.1/schema.d.ts +1 -0
  197. package/dist/schema/yaml-1.1/schema.js +39 -0
  198. package/dist/schema/yaml-1.1/set.d.ts +22 -0
  199. package/dist/schema/yaml-1.1/set.js +90 -0
  200. package/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
  201. package/dist/schema/yaml-1.1/timestamp.js +105 -0
  202. package/dist/stringify/foldFlowLines.d.ts +34 -0
  203. package/dist/stringify/foldFlowLines.js +140 -0
  204. package/dist/stringify/stringify.d.ts +20 -0
  205. package/dist/stringify/stringify.js +127 -0
  206. package/dist/stringify/stringifyCollection.d.ts +17 -0
  207. package/dist/stringify/stringifyCollection.js +154 -0
  208. package/dist/stringify/stringifyComment.d.ts +10 -0
  209. package/dist/stringify/stringifyComment.js +22 -0
  210. package/dist/stringify/stringifyDocument.d.ts +3 -0
  211. package/dist/stringify/stringifyDocument.js +88 -0
  212. package/dist/stringify/stringifyNumber.d.ts +2 -0
  213. package/dist/stringify/stringifyNumber.js +26 -0
  214. package/dist/stringify/stringifyPair.d.ts +3 -0
  215. package/dist/stringify/stringifyPair.js +124 -0
  216. package/dist/stringify/stringifyString.d.ts +3 -0
  217. package/dist/stringify/stringifyString.js +316 -0
  218. package/dist/test-events.d.ts +4 -0
  219. package/dist/test-events.js +125 -151
  220. package/dist/util.d.ts +9 -0
  221. package/dist/util.js +19 -14
  222. package/dist/visit.d.ts +102 -0
  223. package/dist/visit.js +237 -0
  224. package/package.json +49 -51
  225. package/util.d.ts +3 -86
  226. package/util.js +2 -16
  227. package/browser/dist/PlainValue-6b68dc0e.js +0 -1279
  228. package/browser/dist/Schema-d14032c2.js +0 -1047
  229. package/browser/dist/parse-6e806192.js +0 -1904
  230. package/browser/dist/parse-cst.js +0 -2
  231. package/browser/dist/resolveSeq-3477c430.js +0 -2478
  232. package/browser/dist/types.js +0 -3
  233. package/browser/parse-cst.js +0 -1
  234. package/browser/types.js +0 -1
  235. package/browser/util.js +0 -1
  236. package/dist/Document-59bd9290.js +0 -803
  237. package/dist/PlainValue-ec8e588e.js +0 -876
  238. package/dist/Schema-fe1471c4.js +0 -808
  239. package/dist/parse-ab8de154.js +0 -1748
  240. package/dist/parse-cst.js +0 -8
  241. package/dist/resolveSeq-6b2dc4ac.js +0 -2217
  242. package/dist/types.js +0 -22
  243. package/index.d.ts +0 -411
  244. package/index.js +0 -1
  245. package/parse-cst.d.ts +0 -187
  246. package/parse-cst.js +0 -1
  247. package/types.d.ts +0 -379
  248. package/types.js +0 -17
  249. package/types.mjs +0 -17
  250. package/util.mjs +0 -18
@@ -0,0 +1,107 @@
1
+ import { Pair } from '../nodes/Pair.js';
2
+ import { YAMLMap } from '../nodes/YAMLMap.js';
3
+ import { resolveProps } from './resolve-props.js';
4
+ import { containsNewline } from './util-contains-newline.js';
5
+ import { flowIndentCheck } from './util-flow-indent-check.js';
6
+ import { mapIncludes } from './util-map-includes.js';
7
+
8
+ const startColMsg = 'All mapping items must start at the same column';
9
+ function resolveBlockMap({ composeNode, composeEmptyNode }, ctx, bm, onError) {
10
+ var _a;
11
+ const map = new YAMLMap(ctx.schema);
12
+ if (ctx.atRoot)
13
+ ctx.atRoot = false;
14
+ let offset = bm.offset;
15
+ for (const collItem of bm.items) {
16
+ const { start, key, sep, value } = collItem;
17
+ // key properties
18
+ const keyProps = resolveProps(start, {
19
+ indicator: 'explicit-key-ind',
20
+ next: key || (sep === null || sep === void 0 ? void 0 : sep[0]),
21
+ offset,
22
+ onError,
23
+ startOnNewline: true
24
+ });
25
+ const implicitKey = !keyProps.found;
26
+ if (implicitKey) {
27
+ if (key) {
28
+ if (key.type === 'block-seq')
29
+ onError(offset, 'BLOCK_AS_IMPLICIT_KEY', 'A block sequence may not be used as an implicit map key');
30
+ else if ('indent' in key && key.indent !== bm.indent)
31
+ onError(offset, 'BAD_INDENT', startColMsg);
32
+ }
33
+ if (!keyProps.anchor && !keyProps.tag && !sep) {
34
+ // TODO: assert being at last item?
35
+ if (keyProps.comment) {
36
+ if (map.comment)
37
+ map.comment += '\n' + keyProps.comment;
38
+ else
39
+ map.comment = keyProps.comment;
40
+ }
41
+ continue;
42
+ }
43
+ }
44
+ else if (((_a = keyProps.found) === null || _a === void 0 ? void 0 : _a.indent) !== bm.indent)
45
+ onError(offset, 'BAD_INDENT', startColMsg);
46
+ if (implicitKey && containsNewline(key))
47
+ onError(key, // checked by containsNewline()
48
+ 'MULTILINE_IMPLICIT_KEY', 'Implicit keys need to be on a single line');
49
+ // key value
50
+ const keyStart = keyProps.end;
51
+ const keyNode = key
52
+ ? composeNode(ctx, key, keyProps, onError)
53
+ : composeEmptyNode(ctx, keyStart, start, null, keyProps, onError);
54
+ if (ctx.schema.compat)
55
+ flowIndentCheck(bm.indent, key, onError);
56
+ if (mapIncludes(ctx, map.items, keyNode))
57
+ onError(keyStart, 'DUPLICATE_KEY', 'Map keys must be unique');
58
+ // value properties
59
+ const valueProps = resolveProps(sep || [], {
60
+ indicator: 'map-value-ind',
61
+ next: value,
62
+ offset: keyNode.range[2],
63
+ onError,
64
+ startOnNewline: !key || key.type === 'block-scalar'
65
+ });
66
+ offset = valueProps.end;
67
+ if (valueProps.found) {
68
+ if (implicitKey) {
69
+ if ((value === null || value === void 0 ? void 0 : value.type) === 'block-map' && !valueProps.hasNewline)
70
+ onError(offset, 'BLOCK_AS_IMPLICIT_KEY', 'Nested mappings are not allowed in compact mappings');
71
+ if (ctx.options.strict &&
72
+ keyProps.start < valueProps.found.offset - 1024)
73
+ onError(keyNode.range, 'KEY_OVER_1024_CHARS', 'The : indicator must be at most 1024 chars after the start of an implicit block mapping key');
74
+ }
75
+ // value value
76
+ const valueNode = value
77
+ ? composeNode(ctx, value, valueProps, onError)
78
+ : composeEmptyNode(ctx, offset, sep, null, valueProps, onError);
79
+ if (ctx.schema.compat)
80
+ flowIndentCheck(bm.indent, value, onError);
81
+ offset = valueNode.range[2];
82
+ const pair = new Pair(keyNode, valueNode);
83
+ if (ctx.options.keepSourceTokens)
84
+ pair.srcToken = collItem;
85
+ map.items.push(pair);
86
+ }
87
+ else {
88
+ // key with no value
89
+ if (implicitKey)
90
+ onError(keyNode.range, 'MISSING_CHAR', 'Implicit map keys need to be followed by map values');
91
+ if (valueProps.comment) {
92
+ if (keyNode.comment)
93
+ keyNode.comment += '\n' + valueProps.comment;
94
+ else
95
+ keyNode.comment = valueProps.comment;
96
+ }
97
+ const pair = new Pair(keyNode);
98
+ if (ctx.options.keepSourceTokens)
99
+ pair.srcToken = collItem;
100
+ map.items.push(pair);
101
+ }
102
+ }
103
+ map.range = [bm.offset, offset, offset];
104
+ return map;
105
+ }
106
+
107
+ export { resolveBlockMap };
@@ -0,0 +1,192 @@
1
+ import { Scalar } from '../nodes/Scalar.js';
2
+
3
+ function resolveBlockScalar(scalar, strict, onError) {
4
+ const start = scalar.offset;
5
+ const header = parseBlockScalarHeader(scalar, 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
+ break;
48
+ }
49
+ offset += indent.length + content.length + 1;
50
+ }
51
+ // include trailing more-indented empty lines in content
52
+ for (let i = lines.length - 1; i >= chompStart; --i) {
53
+ if (lines[i][0].length > trimIndent)
54
+ chompStart = i + 1;
55
+ }
56
+ let value = '';
57
+ let sep = '';
58
+ let prevMoreIndented = false;
59
+ // leading whitespace is kept intact
60
+ for (let i = 0; i < contentStart; ++i)
61
+ value += lines[i][0].slice(trimIndent) + '\n';
62
+ for (let i = contentStart; i < chompStart; ++i) {
63
+ let [indent, content] = lines[i];
64
+ offset += indent.length + content.length + 1;
65
+ const crlf = content[content.length - 1] === '\r';
66
+ if (crlf)
67
+ content = content.slice(0, -1);
68
+ /* istanbul ignore if already caught in lexer */
69
+ if (content && indent.length < trimIndent) {
70
+ const src = header.indent
71
+ ? 'explicit indentation indicator'
72
+ : 'first line';
73
+ const message = `Block scalar lines must not be less indented than their ${src}`;
74
+ onError(offset - content.length - (crlf ? 2 : 1), 'BAD_INDENT', message);
75
+ indent = '';
76
+ }
77
+ if (type === Scalar.BLOCK_LITERAL) {
78
+ value += sep + indent.slice(trimIndent) + content;
79
+ sep = '\n';
80
+ }
81
+ else if (indent.length > trimIndent || content[0] === '\t') {
82
+ // more-indented content within a folded block
83
+ if (sep === ' ')
84
+ sep = '\n';
85
+ else if (!prevMoreIndented && sep === '\n')
86
+ sep = '\n\n';
87
+ value += sep + indent.slice(trimIndent) + content;
88
+ sep = '\n';
89
+ prevMoreIndented = true;
90
+ }
91
+ else if (content === '') {
92
+ // empty line
93
+ if (sep === '\n')
94
+ value += '\n';
95
+ else
96
+ sep = '\n';
97
+ }
98
+ else {
99
+ value += sep + content;
100
+ sep = ' ';
101
+ prevMoreIndented = false;
102
+ }
103
+ }
104
+ switch (header.chomp) {
105
+ case '-':
106
+ break;
107
+ case '+':
108
+ for (let i = chompStart; i < lines.length; ++i)
109
+ value += '\n' + lines[i][0].slice(trimIndent);
110
+ if (value[value.length - 1] !== '\n')
111
+ value += '\n';
112
+ break;
113
+ default:
114
+ value += '\n';
115
+ }
116
+ const end = start + header.length + scalar.source.length;
117
+ return { value, type, comment: header.comment, range: [start, end, end] };
118
+ }
119
+ function parseBlockScalarHeader({ offset, props }, strict, onError) {
120
+ /* istanbul ignore if should not happen */
121
+ if (props[0].type !== 'block-scalar-header') {
122
+ onError(props[0], 'IMPOSSIBLE', 'Block scalar header not found');
123
+ return null;
124
+ }
125
+ const { source } = props[0];
126
+ const mode = source[0];
127
+ let indent = 0;
128
+ let chomp = '';
129
+ let error = -1;
130
+ for (let i = 1; i < source.length; ++i) {
131
+ const ch = source[i];
132
+ if (!chomp && (ch === '-' || ch === '+'))
133
+ chomp = ch;
134
+ else {
135
+ const n = Number(ch);
136
+ if (!indent && n)
137
+ indent = n;
138
+ else if (error === -1)
139
+ error = offset + i;
140
+ }
141
+ }
142
+ if (error !== -1)
143
+ onError(error, 'UNEXPECTED_TOKEN', `Block scalar header includes extra characters: ${source}`);
144
+ let hasSpace = false;
145
+ let comment = '';
146
+ let length = source.length;
147
+ for (let i = 1; i < props.length; ++i) {
148
+ const token = props[i];
149
+ switch (token.type) {
150
+ case 'space':
151
+ hasSpace = true;
152
+ // fallthrough
153
+ case 'newline':
154
+ length += token.source.length;
155
+ break;
156
+ case 'comment':
157
+ if (strict && !hasSpace) {
158
+ const message = 'Comments must be separated from other tokens by white space characters';
159
+ onError(token, 'MISSING_CHAR', message);
160
+ }
161
+ length += token.source.length;
162
+ comment = token.source.substring(1);
163
+ break;
164
+ case 'error':
165
+ onError(token, 'UNEXPECTED_TOKEN', token.message);
166
+ length += token.source.length;
167
+ break;
168
+ /* istanbul ignore next should not happen */
169
+ default: {
170
+ const message = `Unexpected token in block scalar header: ${token.type}`;
171
+ onError(token, 'UNEXPECTED_TOKEN', message);
172
+ const ts = token.source;
173
+ if (ts && typeof ts === 'string')
174
+ length += ts.length;
175
+ }
176
+ }
177
+ }
178
+ return { mode, indent, chomp, comment, length };
179
+ }
180
+ /** @returns Array of lines split up as `[indent, content]` */
181
+ function splitLines(source) {
182
+ const split = source.split(/\n( *)/);
183
+ const first = split[0];
184
+ const m = first.match(/^( *)/);
185
+ const line0 = m && m[1] ? [m[1], first.slice(m[1].length)] : ['', first];
186
+ const lines = [line0];
187
+ for (let i = 1; i < split.length; i += 2)
188
+ lines.push([split[i], split[i + 1]]);
189
+ return lines;
190
+ }
191
+
192
+ export { resolveBlockScalar };
@@ -0,0 +1,45 @@
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) {
6
+ const seq = new YAMLSeq(ctx.schema);
7
+ if (ctx.atRoot)
8
+ ctx.atRoot = false;
9
+ let offset = bs.offset;
10
+ for (const { start, value } of bs.items) {
11
+ const props = resolveProps(start, {
12
+ indicator: 'seq-item-ind',
13
+ next: value,
14
+ offset,
15
+ onError,
16
+ startOnNewline: true
17
+ });
18
+ offset = props.end;
19
+ if (!props.found) {
20
+ if (props.anchor || props.tag || value) {
21
+ if (value && value.type === 'block-seq')
22
+ onError(offset, 'BAD_INDENT', 'All sequence items must start at the same column');
23
+ else
24
+ onError(offset, 'MISSING_CHAR', 'Sequence item without - indicator');
25
+ }
26
+ else {
27
+ // TODO: assert being at last item?
28
+ if (props.comment)
29
+ seq.comment = props.comment;
30
+ continue;
31
+ }
32
+ }
33
+ const node = value
34
+ ? composeNode(ctx, value, props, onError)
35
+ : composeEmptyNode(ctx, offset, start, null, props, onError);
36
+ if (ctx.schema.compat)
37
+ flowIndentCheck(bs.indent, value, onError);
38
+ offset = node.range[2];
39
+ seq.items.push(node);
40
+ }
41
+ seq.range = [bs.offset, offset, offset];
42
+ return seq;
43
+ }
44
+
45
+ export { resolveBlockSeq };
@@ -0,0 +1,37 @@
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 };
@@ -0,0 +1,200 @@
1
+ import { isPair } from '../nodes/Node.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) {
13
+ const isMap = fc.start.source === '{';
14
+ const fcName = isMap ? 'flow map' : 'flow sequence';
15
+ const coll = isMap
16
+ ? new YAMLMap(ctx.schema)
17
+ : new YAMLSeq(ctx.schema);
18
+ coll.flow = true;
19
+ const atRoot = ctx.atRoot;
20
+ if (atRoot)
21
+ ctx.atRoot = false;
22
+ let offset = fc.offset + fc.start.source.length;
23
+ for (let i = 0; i < fc.items.length; ++i) {
24
+ const collItem = fc.items[i];
25
+ const { start, key, sep, value } = collItem;
26
+ const props = resolveProps(start, {
27
+ flow: fcName,
28
+ indicator: 'explicit-key-ind',
29
+ next: key || (sep === null || sep === void 0 ? void 0 : sep[0]),
30
+ offset,
31
+ onError,
32
+ startOnNewline: false
33
+ });
34
+ if (!props.found) {
35
+ if (!props.anchor && !props.tag && !sep && !value) {
36
+ if (i === 0 && props.comma)
37
+ onError(props.comma, 'UNEXPECTED_TOKEN', `Unexpected , in ${fcName}`);
38
+ else if (i < fc.items.length - 1)
39
+ onError(props.start, 'UNEXPECTED_TOKEN', `Unexpected empty item in ${fcName}`);
40
+ if (props.comment) {
41
+ if (coll.comment)
42
+ coll.comment += '\n' + props.comment;
43
+ else
44
+ coll.comment = props.comment;
45
+ }
46
+ offset = props.end;
47
+ continue;
48
+ }
49
+ if (!isMap && ctx.options.strict && containsNewline(key))
50
+ onError(key, // checked by containsNewline()
51
+ 'MULTILINE_IMPLICIT_KEY', 'Implicit keys of flow sequence pairs need to be on a single line');
52
+ }
53
+ if (i === 0) {
54
+ if (props.comma)
55
+ onError(props.comma, 'UNEXPECTED_TOKEN', `Unexpected , in ${fcName}`);
56
+ }
57
+ else {
58
+ if (!props.comma)
59
+ onError(props.start, 'MISSING_CHAR', `Missing , between ${fcName} items`);
60
+ if (props.comment) {
61
+ let prevItemComment = '';
62
+ loop: for (const st of start) {
63
+ switch (st.type) {
64
+ case 'comma':
65
+ case 'space':
66
+ break;
67
+ case 'comment':
68
+ prevItemComment = st.source.substring(1);
69
+ break loop;
70
+ default:
71
+ break loop;
72
+ }
73
+ }
74
+ if (prevItemComment) {
75
+ let prev = coll.items[coll.items.length - 1];
76
+ if (isPair(prev))
77
+ prev = prev.value || prev.key;
78
+ if (prev.comment)
79
+ prev.comment += '\n' + prevItemComment;
80
+ else
81
+ prev.comment = prevItemComment;
82
+ props.comment = props.comment.substring(prevItemComment.length + 1);
83
+ }
84
+ }
85
+ }
86
+ if (!isMap && !sep && !props.found) {
87
+ // item is a value in a seq
88
+ // → key & sep are empty, start does not include ? or :
89
+ const valueNode = value
90
+ ? composeNode(ctx, value, props, onError)
91
+ : composeEmptyNode(ctx, props.end, sep, null, props, onError);
92
+ coll.items.push(valueNode);
93
+ offset = valueNode.range[2];
94
+ if (isBlock(value))
95
+ onError(valueNode.range, 'BLOCK_IN_FLOW', blockMsg);
96
+ }
97
+ else {
98
+ // item is a key+value pair
99
+ // key value
100
+ const keyStart = props.end;
101
+ const keyNode = key
102
+ ? composeNode(ctx, key, props, onError)
103
+ : composeEmptyNode(ctx, keyStart, start, null, props, onError);
104
+ if (isBlock(key))
105
+ onError(keyNode.range, 'BLOCK_IN_FLOW', blockMsg);
106
+ // value properties
107
+ const valueProps = resolveProps(sep || [], {
108
+ flow: fcName,
109
+ indicator: 'map-value-ind',
110
+ next: value,
111
+ offset: keyNode.range[2],
112
+ onError,
113
+ startOnNewline: false
114
+ });
115
+ if (valueProps.found) {
116
+ if (!isMap && !props.found && ctx.options.strict) {
117
+ if (sep)
118
+ for (const st of sep) {
119
+ if (st === valueProps.found)
120
+ break;
121
+ if (st.type === 'newline') {
122
+ onError(st, 'MULTILINE_IMPLICIT_KEY', 'Implicit keys of flow sequence pairs need to be on a single line');
123
+ break;
124
+ }
125
+ }
126
+ if (props.start < valueProps.found.offset - 1024)
127
+ onError(valueProps.found, 'KEY_OVER_1024_CHARS', 'The : indicator must be at most 1024 chars after the start of an implicit flow sequence key');
128
+ }
129
+ }
130
+ else if (value) {
131
+ if ('source' in value && value.source && value.source[0] === ':')
132
+ onError(value, 'MISSING_CHAR', `Missing space after : in ${fcName}`);
133
+ else
134
+ onError(valueProps.start, 'MISSING_CHAR', `Missing , or : between ${fcName} items`);
135
+ }
136
+ // value value
137
+ const valueNode = value
138
+ ? composeNode(ctx, value, valueProps, onError)
139
+ : valueProps.found
140
+ ? composeEmptyNode(ctx, valueProps.end, sep, null, valueProps, onError)
141
+ : null;
142
+ if (valueNode) {
143
+ if (isBlock(value))
144
+ onError(valueNode.range, 'BLOCK_IN_FLOW', blockMsg);
145
+ }
146
+ else if (valueProps.comment) {
147
+ if (keyNode.comment)
148
+ keyNode.comment += '\n' + valueProps.comment;
149
+ else
150
+ keyNode.comment = valueProps.comment;
151
+ }
152
+ const pair = new Pair(keyNode, valueNode);
153
+ if (ctx.options.keepSourceTokens)
154
+ pair.srcToken = collItem;
155
+ if (isMap) {
156
+ const map = coll;
157
+ if (mapIncludes(ctx, map.items, keyNode))
158
+ onError(keyStart, 'DUPLICATE_KEY', 'Map keys must be unique');
159
+ map.items.push(pair);
160
+ }
161
+ else {
162
+ const map = new YAMLMap(ctx.schema);
163
+ map.flow = true;
164
+ map.items.push(pair);
165
+ coll.items.push(map);
166
+ }
167
+ offset = valueNode ? valueNode.range[2] : valueProps.end;
168
+ }
169
+ }
170
+ const expectedEnd = isMap ? '}' : ']';
171
+ const [ce, ...ee] = fc.end;
172
+ let cePos = offset;
173
+ if (ce && ce.source === expectedEnd)
174
+ cePos = ce.offset + ce.source.length;
175
+ else {
176
+ const name = fcName[0].toUpperCase() + fcName.substring(1);
177
+ const msg = atRoot
178
+ ? `${name} must end with a ${expectedEnd}`
179
+ : `${name} in block collection must be sufficiently indented and end with a ${expectedEnd}`;
180
+ onError(offset, atRoot ? 'MISSING_CHAR' : 'BAD_INDENT', msg);
181
+ if (ce && ce.source.length !== 1)
182
+ ee.unshift(ce);
183
+ }
184
+ if (ee.length > 0) {
185
+ const end = resolveEnd(ee, cePos, ctx.options.strict, onError);
186
+ if (end.comment) {
187
+ if (coll.comment)
188
+ coll.comment += '\n' + end.comment;
189
+ else
190
+ coll.comment = end.comment;
191
+ }
192
+ coll.range = [fc.offset, cePos, end.offset];
193
+ }
194
+ else {
195
+ coll.range = [fc.offset, cePos, cePos];
196
+ }
197
+ return coll;
198
+ }
199
+
200
+ export { resolveFlowCollection };