yaml 2.0.0-2 → 2.0.0-6

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 (347) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +46 -26
  3. package/browser/dist/compose/compose-collection.js +59 -0
  4. package/browser/dist/compose/compose-doc.js +39 -0
  5. package/browser/dist/compose/compose-node.js +72 -0
  6. package/browser/dist/compose/compose-scalar.js +74 -0
  7. package/browser/dist/compose/composer.js +218 -0
  8. package/browser/dist/compose/resolve-block-map.js +93 -0
  9. package/browser/dist/compose/resolve-block-scalar.js +185 -0
  10. package/browser/dist/compose/resolve-block-seq.js +40 -0
  11. package/browser/dist/compose/resolve-end.js +37 -0
  12. package/browser/dist/compose/resolve-flow-collection.js +189 -0
  13. package/browser/dist/compose/resolve-flow-scalar.js +211 -0
  14. package/browser/dist/compose/resolve-props.js +126 -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-map-includes.js +17 -0
  18. package/browser/dist/doc/Document.js +251 -348
  19. package/browser/dist/doc/anchors.js +72 -0
  20. package/browser/dist/doc/applyReviver.js +41 -28
  21. package/browser/dist/doc/createNode.js +71 -55
  22. package/browser/dist/doc/directives.js +161 -0
  23. package/browser/dist/errors.js +50 -72
  24. package/browser/dist/index.js +17 -73
  25. package/browser/dist/log.js +11 -7
  26. package/browser/dist/nodes/Alias.js +94 -0
  27. package/browser/dist/nodes/Collection.js +133 -0
  28. package/browser/dist/nodes/Node.js +41 -0
  29. package/browser/dist/nodes/Pair.js +28 -0
  30. package/browser/dist/nodes/Scalar.js +23 -0
  31. package/browser/dist/nodes/YAMLMap.js +116 -0
  32. package/browser/dist/nodes/YAMLSeq.js +105 -0
  33. package/browser/dist/nodes/addPairToJSMap.js +103 -0
  34. package/browser/dist/nodes/toJS.js +35 -0
  35. package/browser/dist/options.js +14 -95
  36. package/browser/dist/parse/cst-scalar.js +219 -0
  37. package/browser/dist/parse/cst-stringify.js +61 -0
  38. package/browser/dist/parse/cst-visit.js +97 -0
  39. package/browser/dist/parse/cst.js +98 -0
  40. package/browser/dist/parse/lexer.js +656 -0
  41. package/browser/dist/parse/line-counter.js +39 -0
  42. package/browser/dist/parse/parser.js +876 -0
  43. package/browser/dist/public-api.js +101 -0
  44. package/browser/dist/schema/Schema.js +23 -0
  45. package/browser/dist/schema/common/map.js +42 -0
  46. package/browser/dist/schema/common/null.js +13 -0
  47. package/browser/dist/schema/common/seq.js +33 -0
  48. package/browser/dist/schema/common/string.js +14 -0
  49. package/browser/dist/schema/core/bool.js +19 -0
  50. package/browser/dist/schema/core/float.js +40 -0
  51. package/browser/dist/schema/core/int.js +38 -0
  52. package/browser/dist/schema/core/schema.js +23 -0
  53. package/browser/dist/schema/json/schema.js +62 -0
  54. package/browser/dist/schema/tags.js +79 -0
  55. package/browser/dist/schema/yaml-1.1/binary.js +66 -0
  56. package/browser/dist/schema/yaml-1.1/bool.js +26 -0
  57. package/browser/dist/schema/yaml-1.1/float.js +43 -0
  58. package/browser/dist/schema/yaml-1.1/int.js +71 -0
  59. package/browser/dist/schema/yaml-1.1/omap.js +73 -0
  60. package/browser/dist/schema/yaml-1.1/pairs.js +77 -0
  61. package/browser/dist/schema/yaml-1.1/schema.js +37 -0
  62. package/browser/dist/schema/yaml-1.1/set.js +87 -0
  63. package/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
  64. package/browser/dist/stringify/foldFlowLines.js +121 -139
  65. package/browser/dist/stringify/stringify.js +87 -72
  66. package/browser/dist/stringify/stringifyCollection.js +122 -0
  67. package/browser/dist/stringify/stringifyComment.js +14 -0
  68. package/browser/dist/stringify/stringifyDocument.js +64 -0
  69. package/browser/dist/stringify/stringifyNumber.js +20 -23
  70. package/browser/dist/stringify/stringifyPair.js +111 -0
  71. package/browser/dist/stringify/stringifyString.js +295 -322
  72. package/browser/dist/util.js +4 -4
  73. package/browser/dist/visit.js +146 -0
  74. package/browser/index.js +4 -1
  75. package/dist/compose/compose-collection.d.ts +5 -0
  76. package/dist/compose/compose-collection.js +61 -0
  77. package/dist/compose/compose-doc.d.ts +6 -0
  78. package/dist/compose/compose-doc.js +41 -0
  79. package/dist/compose/compose-node.d.ts +25 -0
  80. package/dist/compose/compose-node.js +75 -0
  81. package/dist/compose/compose-scalar.d.ts +5 -0
  82. package/dist/compose/compose-scalar.js +76 -0
  83. package/dist/compose/composer.d.ts +62 -0
  84. package/dist/compose/composer.js +222 -0
  85. package/dist/compose/resolve-block-map.d.ts +6 -0
  86. package/dist/compose/resolve-block-map.js +95 -0
  87. package/dist/compose/resolve-block-scalar.d.ts +10 -0
  88. package/dist/compose/resolve-block-scalar.js +187 -0
  89. package/dist/compose/resolve-block-seq.d.ts +5 -0
  90. package/dist/compose/resolve-block-seq.js +42 -0
  91. package/dist/compose/resolve-end.d.ts +6 -0
  92. package/dist/compose/resolve-end.js +39 -0
  93. package/dist/compose/resolve-flow-collection.d.ts +6 -0
  94. package/dist/compose/resolve-flow-collection.js +191 -0
  95. package/dist/compose/resolve-flow-scalar.d.ts +10 -0
  96. package/dist/compose/resolve-flow-scalar.js +213 -0
  97. package/dist/compose/resolve-props.d.ts +21 -0
  98. package/dist/compose/resolve-props.js +128 -0
  99. package/dist/compose/util-contains-newline.d.ts +2 -0
  100. package/dist/compose/util-contains-newline.js +36 -0
  101. package/dist/compose/util-empty-scalar-position.d.ts +2 -0
  102. package/dist/compose/util-empty-scalar-position.js +29 -0
  103. package/dist/compose/util-map-includes.d.ts +4 -0
  104. package/dist/compose/util-map-includes.js +19 -0
  105. package/dist/doc/Document.d.ts +130 -0
  106. package/dist/doc/Document.js +250 -347
  107. package/dist/doc/anchors.d.ts +24 -0
  108. package/dist/doc/anchors.js +77 -0
  109. package/dist/doc/applyReviver.d.ts +9 -0
  110. package/dist/doc/applyReviver.js +41 -28
  111. package/dist/doc/createNode.d.ts +16 -0
  112. package/dist/doc/createNode.js +71 -55
  113. package/dist/doc/directives.d.ts +46 -0
  114. package/dist/doc/directives.js +163 -0
  115. package/dist/errors.d.ts +21 -0
  116. package/dist/errors.js +51 -74
  117. package/dist/index.d.ts +19 -0
  118. package/dist/index.js +40 -71
  119. package/dist/log.d.ts +3 -0
  120. package/dist/log.js +11 -6
  121. package/dist/nodes/Alias.d.ts +24 -0
  122. package/dist/nodes/Alias.js +96 -0
  123. package/dist/nodes/Collection.d.ts +67 -0
  124. package/dist/nodes/Collection.js +137 -0
  125. package/dist/nodes/Node.d.ts +48 -0
  126. package/dist/nodes/Node.js +59 -0
  127. package/dist/nodes/Pair.d.ts +16 -0
  128. package/dist/nodes/Pair.js +31 -0
  129. package/dist/nodes/Scalar.d.ts +40 -0
  130. package/dist/nodes/Scalar.js +26 -0
  131. package/dist/nodes/YAMLMap.d.ts +39 -0
  132. package/dist/nodes/YAMLMap.js +119 -0
  133. package/dist/nodes/YAMLSeq.d.ts +53 -0
  134. package/dist/nodes/YAMLSeq.js +107 -0
  135. package/dist/nodes/addPairToJSMap.d.ts +3 -0
  136. package/dist/nodes/addPairToJSMap.js +105 -0
  137. package/dist/nodes/toJS.d.ts +30 -0
  138. package/dist/nodes/toJS.js +37 -0
  139. package/dist/options.d.ts +278 -0
  140. package/dist/options.js +13 -96
  141. package/dist/parse/cst-scalar.d.ts +58 -0
  142. package/dist/parse/cst-scalar.js +223 -0
  143. package/dist/parse/cst-stringify.d.ts +8 -0
  144. package/dist/parse/cst-stringify.js +63 -0
  145. package/dist/parse/cst-visit.d.ts +39 -0
  146. package/dist/parse/cst-visit.js +99 -0
  147. package/dist/parse/cst.d.ts +106 -0
  148. package/dist/parse/cst.js +112 -0
  149. package/dist/parse/lexer.d.ts +85 -0
  150. package/dist/parse/lexer.js +658 -0
  151. package/dist/parse/line-counter.d.ts +22 -0
  152. package/dist/parse/line-counter.js +41 -0
  153. package/dist/parse/parser.d.ts +84 -0
  154. package/dist/parse/parser.js +880 -0
  155. package/dist/public-api.d.ts +43 -0
  156. package/dist/public-api.js +106 -0
  157. package/dist/schema/Schema.d.ts +16 -0
  158. package/dist/schema/Schema.js +25 -0
  159. package/dist/schema/common/map.d.ts +2 -0
  160. package/dist/schema/common/map.js +44 -0
  161. package/dist/schema/common/null.d.ts +4 -0
  162. package/dist/schema/common/null.js +15 -0
  163. package/dist/schema/common/seq.d.ts +2 -0
  164. package/dist/schema/common/seq.js +35 -0
  165. package/dist/schema/common/string.d.ts +2 -0
  166. package/dist/schema/common/string.js +16 -0
  167. package/dist/schema/core/bool.d.ts +4 -0
  168. package/dist/schema/core/bool.js +21 -0
  169. package/dist/schema/core/float.d.ts +4 -0
  170. package/dist/schema/core/float.js +44 -0
  171. package/dist/schema/core/int.d.ts +4 -0
  172. package/dist/schema/core/int.js +42 -0
  173. package/dist/schema/core/schema.d.ts +1 -0
  174. package/dist/schema/core/schema.js +25 -0
  175. package/dist/schema/json/schema.d.ts +2 -0
  176. package/dist/schema/json/schema.js +64 -0
  177. package/dist/schema/tags.d.ts +41 -0
  178. package/dist/schema/tags.js +82 -0
  179. package/dist/schema/types.d.ts +82 -0
  180. package/dist/schema/yaml-1.1/binary.d.ts +2 -0
  181. package/dist/schema/yaml-1.1/binary.js +68 -0
  182. package/dist/schema/yaml-1.1/bool.d.ts +7 -0
  183. package/dist/schema/yaml-1.1/bool.js +29 -0
  184. package/dist/schema/yaml-1.1/float.d.ts +4 -0
  185. package/dist/schema/yaml-1.1/float.js +47 -0
  186. package/dist/schema/yaml-1.1/int.d.ts +5 -0
  187. package/dist/schema/yaml-1.1/int.js +76 -0
  188. package/dist/schema/yaml-1.1/omap.d.ts +21 -0
  189. package/dist/schema/yaml-1.1/omap.js +76 -0
  190. package/dist/schema/yaml-1.1/pairs.d.ts +10 -0
  191. package/dist/schema/yaml-1.1/pairs.js +81 -0
  192. package/dist/schema/yaml-1.1/schema.d.ts +1 -0
  193. package/dist/schema/yaml-1.1/schema.js +39 -0
  194. package/dist/schema/yaml-1.1/set.d.ts +22 -0
  195. package/dist/schema/yaml-1.1/set.js +90 -0
  196. package/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
  197. package/dist/schema/yaml-1.1/timestamp.js +105 -0
  198. package/dist/stringify/foldFlowLines.d.ts +34 -0
  199. package/dist/stringify/foldFlowLines.js +121 -139
  200. package/dist/stringify/stringify.d.ts +18 -0
  201. package/dist/stringify/stringify.js +87 -71
  202. package/dist/stringify/stringifyCollection.d.ts +21 -0
  203. package/dist/stringify/stringifyCollection.js +124 -0
  204. package/dist/stringify/stringifyComment.d.ts +2 -0
  205. package/dist/stringify/stringifyComment.js +17 -0
  206. package/dist/stringify/stringifyDocument.d.ts +3 -0
  207. package/dist/stringify/stringifyDocument.js +66 -0
  208. package/dist/stringify/stringifyNumber.d.ts +2 -0
  209. package/dist/stringify/stringifyNumber.js +20 -23
  210. package/dist/stringify/stringifyPair.d.ts +3 -0
  211. package/dist/stringify/stringifyPair.js +113 -0
  212. package/dist/stringify/stringifyString.d.ts +3 -0
  213. package/dist/stringify/stringifyString.js +295 -322
  214. package/dist/test-events.d.ts +4 -0
  215. package/dist/test-events.js +124 -148
  216. package/dist/util.d.ts +6 -0
  217. package/dist/util.js +9 -12
  218. package/dist/visit.d.ts +63 -0
  219. package/dist/visit.js +148 -0
  220. package/package.json +31 -39
  221. package/util.js +2 -14
  222. package/browser/dist/_virtual/_rollupPluginBabelHelpers.js +0 -16
  223. package/browser/dist/ast/Alias.js +0 -95
  224. package/browser/dist/ast/Collection.js +0 -192
  225. package/browser/dist/ast/Merge.js +0 -71
  226. package/browser/dist/ast/Node.js +0 -3
  227. package/browser/dist/ast/Pair.js +0 -200
  228. package/browser/dist/ast/Scalar.js +0 -21
  229. package/browser/dist/ast/YAMLMap.js +0 -91
  230. package/browser/dist/ast/YAMLSeq.js +0 -67
  231. package/browser/dist/ast/toJS.js +0 -29
  232. package/browser/dist/ast/visit.js +0 -83
  233. package/browser/dist/constants.js +0 -40
  234. package/browser/dist/cst/Alias.js +0 -26
  235. package/browser/dist/cst/BlankLine.js +0 -34
  236. package/browser/dist/cst/BlockValue.js +0 -240
  237. package/browser/dist/cst/Collection.js +0 -259
  238. package/browser/dist/cst/CollectionItem.js +0 -123
  239. package/browser/dist/cst/Comment.js +0 -27
  240. package/browser/dist/cst/Directive.js +0 -53
  241. package/browser/dist/cst/Document.js +0 -262
  242. package/browser/dist/cst/FlowCollection.js +0 -201
  243. package/browser/dist/cst/Node.js +0 -355
  244. package/browser/dist/cst/ParseContext.js +0 -234
  245. package/browser/dist/cst/PlainValue.js +0 -171
  246. package/browser/dist/cst/QuoteDouble.js +0 -224
  247. package/browser/dist/cst/QuoteSingle.js +0 -100
  248. package/browser/dist/cst/Range.js +0 -56
  249. package/browser/dist/cst/parse.js +0 -46
  250. package/browser/dist/cst/source-utils.js +0 -169
  251. package/browser/dist/doc/Anchors.js +0 -115
  252. package/browser/dist/doc/Schema.js +0 -34
  253. package/browser/dist/doc/getSchemaTags.js +0 -33
  254. package/browser/dist/doc/listTagNames.js +0 -27
  255. package/browser/dist/doc/parseContents.js +0 -60
  256. package/browser/dist/doc/parseDirectives.js +0 -107
  257. package/browser/dist/resolve/collection-utils.js +0 -86
  258. package/browser/dist/resolve/resolveMap.js +0 -315
  259. package/browser/dist/resolve/resolveNode.js +0 -173
  260. package/browser/dist/resolve/resolveScalar.js +0 -20
  261. package/browser/dist/resolve/resolveSeq.js +0 -170
  262. package/browser/dist/resolve/resolveTag.js +0 -107
  263. package/browser/dist/resolve/resolveTagName.js +0 -87
  264. package/browser/dist/stringify/addComment.js +0 -10
  265. package/browser/dist/stringify/stringifyTag.js +0 -28
  266. package/browser/dist/tags/core.js +0 -128
  267. package/browser/dist/tags/failsafe/index.js +0 -7
  268. package/browser/dist/tags/failsafe/map.js +0 -37
  269. package/browser/dist/tags/failsafe/seq.js +0 -34
  270. package/browser/dist/tags/failsafe/string.js +0 -20
  271. package/browser/dist/tags/index.js +0 -39
  272. package/browser/dist/tags/json.js +0 -62
  273. package/browser/dist/tags/options.js +0 -31
  274. package/browser/dist/tags/yaml-1.1/binary.js +0 -83
  275. package/browser/dist/tags/yaml-1.1/index.js +0 -174
  276. package/browser/dist/tags/yaml-1.1/omap.js +0 -86
  277. package/browser/dist/tags/yaml-1.1/pairs.js +0 -62
  278. package/browser/dist/tags/yaml-1.1/set.js +0 -78
  279. package/browser/dist/tags/yaml-1.1/timestamp.js +0 -101
  280. package/browser/dist/types.js +0 -10
  281. package/cst.d.ts +0 -185
  282. package/dist/_virtual/_rollupPluginBabelHelpers.js +0 -18
  283. package/dist/ast/Alias.js +0 -97
  284. package/dist/ast/Collection.js +0 -196
  285. package/dist/ast/Merge.js +0 -74
  286. package/dist/ast/Node.js +0 -5
  287. package/dist/ast/Pair.js +0 -203
  288. package/dist/ast/Scalar.js +0 -24
  289. package/dist/ast/YAMLMap.js +0 -94
  290. package/dist/ast/YAMLSeq.js +0 -69
  291. package/dist/ast/toJS.js +0 -31
  292. package/dist/ast/visit.js +0 -85
  293. package/dist/constants.js +0 -46
  294. package/dist/cst/Alias.js +0 -28
  295. package/dist/cst/BlankLine.js +0 -36
  296. package/dist/cst/BlockValue.js +0 -243
  297. package/dist/cst/Collection.js +0 -262
  298. package/dist/cst/CollectionItem.js +0 -125
  299. package/dist/cst/Comment.js +0 -29
  300. package/dist/cst/Directive.js +0 -55
  301. package/dist/cst/Document.js +0 -264
  302. package/dist/cst/FlowCollection.js +0 -203
  303. package/dist/cst/Node.js +0 -357
  304. package/dist/cst/ParseContext.js +0 -236
  305. package/dist/cst/PlainValue.js +0 -173
  306. package/dist/cst/QuoteDouble.js +0 -226
  307. package/dist/cst/QuoteSingle.js +0 -102
  308. package/dist/cst/Range.js +0 -58
  309. package/dist/cst/parse.js +0 -48
  310. package/dist/cst/source-utils.js +0 -173
  311. package/dist/doc/Anchors.js +0 -117
  312. package/dist/doc/Schema.js +0 -36
  313. package/dist/doc/getSchemaTags.js +0 -35
  314. package/dist/doc/listTagNames.js +0 -29
  315. package/dist/doc/parseContents.js +0 -62
  316. package/dist/doc/parseDirectives.js +0 -109
  317. package/dist/resolve/collection-utils.js +0 -91
  318. package/dist/resolve/resolveMap.js +0 -317
  319. package/dist/resolve/resolveNode.js +0 -175
  320. package/dist/resolve/resolveScalar.js +0 -22
  321. package/dist/resolve/resolveSeq.js +0 -172
  322. package/dist/resolve/resolveTag.js +0 -109
  323. package/dist/resolve/resolveTagName.js +0 -89
  324. package/dist/stringify/addComment.js +0 -13
  325. package/dist/stringify/stringifyTag.js +0 -30
  326. package/dist/tags/core.js +0 -138
  327. package/dist/tags/failsafe/index.js +0 -9
  328. package/dist/tags/failsafe/map.js +0 -39
  329. package/dist/tags/failsafe/seq.js +0 -36
  330. package/dist/tags/failsafe/string.js +0 -22
  331. package/dist/tags/index.js +0 -42
  332. package/dist/tags/json.js +0 -64
  333. package/dist/tags/options.js +0 -37
  334. package/dist/tags/yaml-1.1/binary.js +0 -85
  335. package/dist/tags/yaml-1.1/index.js +0 -176
  336. package/dist/tags/yaml-1.1/omap.js +0 -89
  337. package/dist/tags/yaml-1.1/pairs.js +0 -66
  338. package/dist/tags/yaml-1.1/set.js +0 -81
  339. package/dist/tags/yaml-1.1/timestamp.js +0 -105
  340. package/dist/types.js +0 -29
  341. package/index.d.ts +0 -519
  342. package/index.js +0 -1
  343. package/types.d.ts +0 -379
  344. package/types.js +0 -17
  345. package/types.mjs +0 -17
  346. package/util.d.ts +0 -76
  347. package/util.mjs +0 -15
@@ -0,0 +1,191 @@
1
+ 'use strict';
2
+
3
+ var Node = require('../nodes/Node.js');
4
+ var Pair = require('../nodes/Pair.js');
5
+ var YAMLMap = require('../nodes/YAMLMap.js');
6
+ var YAMLSeq = require('../nodes/YAMLSeq.js');
7
+ var resolveEnd = require('./resolve-end.js');
8
+ var resolveProps = require('./resolve-props.js');
9
+ var utilContainsNewline = require('./util-contains-newline.js');
10
+ var utilMapIncludes = require('./util-map-includes.js');
11
+
12
+ const blockMsg = 'Block collections are not allowed within flow collections';
13
+ const isBlock = (token) => token && (token.type === 'block-map' || token.type === 'block-seq');
14
+ function resolveFlowCollection({ composeNode, composeEmptyNode }, ctx, fc, onError) {
15
+ const isMap = fc.start.source === '{';
16
+ const fcName = isMap ? 'flow map' : 'flow sequence';
17
+ const coll = isMap
18
+ ? new YAMLMap.YAMLMap(ctx.schema)
19
+ : new YAMLSeq.YAMLSeq(ctx.schema);
20
+ coll.flow = true;
21
+ let offset = fc.offset;
22
+ for (let i = 0; i < fc.items.length; ++i) {
23
+ const { start, key, sep, value } = fc.items[i];
24
+ const props = resolveProps.resolveProps(start, {
25
+ flow: fcName,
26
+ indicator: 'explicit-key-ind',
27
+ next: key || (sep === null || sep === void 0 ? void 0 : sep[0]),
28
+ offset,
29
+ onError,
30
+ startOnNewline: false
31
+ });
32
+ if (!props.found) {
33
+ if (!props.anchor && !props.tag && !sep && !value) {
34
+ if (i === 0 && props.comma)
35
+ onError(props.comma, 'UNEXPECTED_TOKEN', `Unexpected , in ${fcName}`);
36
+ else if (i < fc.items.length - 1)
37
+ onError(props.start, 'UNEXPECTED_TOKEN', `Unexpected empty item in ${fcName}`);
38
+ if (props.comment) {
39
+ if (coll.comment)
40
+ coll.comment += '\n' + props.comment;
41
+ else
42
+ coll.comment = props.comment;
43
+ }
44
+ continue;
45
+ }
46
+ if (!isMap && ctx.options.strict && utilContainsNewline.containsNewline(key))
47
+ onError(key, // checked by containsNewline()
48
+ 'MULTILINE_IMPLICIT_KEY', 'Implicit keys of flow sequence pairs need to be on a single line');
49
+ }
50
+ if (i === 0) {
51
+ if (props.comma)
52
+ onError(props.comma, 'UNEXPECTED_TOKEN', `Unexpected , in ${fcName}`);
53
+ }
54
+ else {
55
+ if (!props.comma)
56
+ onError(props.start, 'MISSING_CHAR', `Missing , between ${fcName} items`);
57
+ if (props.comment) {
58
+ let prevItemComment = '';
59
+ loop: for (const st of start) {
60
+ switch (st.type) {
61
+ case 'comma':
62
+ case 'space':
63
+ break;
64
+ case 'comment':
65
+ prevItemComment = st.source.substring(1);
66
+ break loop;
67
+ default:
68
+ break loop;
69
+ }
70
+ }
71
+ if (prevItemComment) {
72
+ let prev = coll.items[coll.items.length - 1];
73
+ if (Node.isPair(prev))
74
+ prev = prev.value || prev.key;
75
+ if (prev.comment)
76
+ prev.comment += '\n' + prevItemComment;
77
+ else
78
+ prev.comment = prevItemComment;
79
+ props.comment = props.comment.substring(prevItemComment.length + 1);
80
+ }
81
+ }
82
+ }
83
+ if (!isMap && !sep && !props.found) {
84
+ // item is a value in a seq
85
+ // → key & sep are empty, start does not include ? or :
86
+ const valueNode = value
87
+ ? composeNode(ctx, value, props, onError)
88
+ : composeEmptyNode(ctx, props.end, sep, null, props, onError);
89
+ coll.items.push(valueNode);
90
+ offset = valueNode.range[2];
91
+ if (isBlock(value))
92
+ onError(valueNode.range, 'BLOCK_IN_FLOW', blockMsg);
93
+ }
94
+ else {
95
+ // item is a key+value pair
96
+ // key value
97
+ const keyStart = props.end;
98
+ const keyNode = key
99
+ ? composeNode(ctx, key, props, onError)
100
+ : composeEmptyNode(ctx, keyStart, start, null, props, onError);
101
+ if (isBlock(key))
102
+ onError(keyNode.range, 'BLOCK_IN_FLOW', blockMsg);
103
+ // value properties
104
+ const valueProps = resolveProps.resolveProps(sep || [], {
105
+ flow: fcName,
106
+ indicator: 'map-value-ind',
107
+ next: value,
108
+ offset: keyNode.range[2],
109
+ onError,
110
+ startOnNewline: false
111
+ });
112
+ if (valueProps.found) {
113
+ if (!isMap && !props.found && ctx.options.strict) {
114
+ if (sep)
115
+ for (const st of sep) {
116
+ if (st === valueProps.found)
117
+ break;
118
+ if (st.type === 'newline') {
119
+ onError(st, 'MULTILINE_IMPLICIT_KEY', 'Implicit keys of flow sequence pairs need to be on a single line');
120
+ break;
121
+ }
122
+ }
123
+ if (props.start < valueProps.found.offset - 1024)
124
+ onError(valueProps.found, 'KEY_OVER_1024_CHARS', 'The : indicator must be at most 1024 chars after the start of an implicit flow sequence key');
125
+ }
126
+ }
127
+ else if (value) {
128
+ if ('source' in value && value.source && value.source[0] === ':')
129
+ onError(value, 'MISSING_CHAR', `Missing space after : in ${fcName}`);
130
+ else
131
+ onError(valueProps.start, 'MISSING_CHAR', `Missing , or : between ${fcName} items`);
132
+ }
133
+ // value value
134
+ const valueNode = value
135
+ ? composeNode(ctx, value, valueProps, onError)
136
+ : valueProps.found
137
+ ? composeEmptyNode(ctx, valueProps.end, sep, null, valueProps, onError)
138
+ : null;
139
+ if (valueNode) {
140
+ if (isBlock(value))
141
+ onError(valueNode.range, 'BLOCK_IN_FLOW', blockMsg);
142
+ }
143
+ else if (valueProps.comment) {
144
+ if (keyNode.comment)
145
+ keyNode.comment += '\n' + valueProps.comment;
146
+ else
147
+ keyNode.comment = valueProps.comment;
148
+ }
149
+ const pair = new Pair.Pair(keyNode, valueNode);
150
+ if (isMap) {
151
+ const map = coll;
152
+ if (utilMapIncludes.mapIncludes(ctx, map.items, keyNode))
153
+ onError(keyStart, 'DUPLICATE_KEY', 'Map keys must be unique');
154
+ map.items.push(pair);
155
+ }
156
+ else {
157
+ const map = new YAMLMap.YAMLMap(ctx.schema);
158
+ map.flow = true;
159
+ map.items.push(pair);
160
+ coll.items.push(map);
161
+ }
162
+ offset = valueNode ? valueNode.range[2] : valueProps.end;
163
+ }
164
+ }
165
+ const expectedEnd = isMap ? '}' : ']';
166
+ const [ce, ...ee] = fc.end;
167
+ let cePos = offset;
168
+ if (ce && ce.source === expectedEnd)
169
+ cePos = ce.offset + ce.source.length;
170
+ else {
171
+ onError(offset + 1, 'MISSING_CHAR', `Expected ${fcName} to end with ${expectedEnd}`);
172
+ if (ce && ce.source.length !== 1)
173
+ ee.unshift(ce);
174
+ }
175
+ if (ee.length > 0) {
176
+ const end = resolveEnd.resolveEnd(ee, cePos, ctx.options.strict, onError);
177
+ if (end.comment) {
178
+ if (coll.comment)
179
+ coll.comment += '\n' + end.comment;
180
+ else
181
+ coll.comment = end.comment;
182
+ }
183
+ coll.range = [fc.offset, cePos, end.offset];
184
+ }
185
+ else {
186
+ coll.range = [fc.offset, cePos, cePos];
187
+ }
188
+ return coll;
189
+ }
190
+
191
+ exports.resolveFlowCollection = resolveFlowCollection;
@@ -0,0 +1,10 @@
1
+ import { Range } from '../nodes/Node.js';
2
+ import { Scalar } from '../nodes/Scalar.js';
3
+ import type { FlowScalar } from '../parse/cst.js';
4
+ import type { ComposeErrorHandler } from './composer.js';
5
+ export declare function resolveFlowScalar(scalar: FlowScalar, strict: boolean, onError: ComposeErrorHandler): {
6
+ value: string;
7
+ type: Scalar.PLAIN | Scalar.QUOTE_DOUBLE | Scalar.QUOTE_SINGLE | null;
8
+ comment: string;
9
+ range: Range;
10
+ };
@@ -0,0 +1,213 @@
1
+ 'use strict';
2
+
3
+ var Scalar = require('../nodes/Scalar.js');
4
+ var resolveEnd = require('./resolve-end.js');
5
+
6
+ function resolveFlowScalar(scalar, strict, onError) {
7
+ const { offset, type, source, end } = scalar;
8
+ let _type;
9
+ let value;
10
+ const _onError = (rel, code, msg) => onError(offset + rel, code, msg);
11
+ switch (type) {
12
+ case 'scalar':
13
+ _type = Scalar.Scalar.PLAIN;
14
+ value = plainValue(source, _onError);
15
+ break;
16
+ case 'single-quoted-scalar':
17
+ _type = Scalar.Scalar.QUOTE_SINGLE;
18
+ value = singleQuotedValue(source, _onError);
19
+ break;
20
+ case 'double-quoted-scalar':
21
+ _type = Scalar.Scalar.QUOTE_DOUBLE;
22
+ value = doubleQuotedValue(source, _onError);
23
+ break;
24
+ /* istanbul ignore next should not happen */
25
+ default:
26
+ onError(scalar, 'UNEXPECTED_TOKEN', `Expected a flow scalar value, but found: ${type}`);
27
+ return {
28
+ value: '',
29
+ type: null,
30
+ comment: '',
31
+ range: [offset, offset + source.length, offset + source.length]
32
+ };
33
+ }
34
+ const valueEnd = offset + source.length;
35
+ const re = resolveEnd.resolveEnd(end, valueEnd, strict, onError);
36
+ return {
37
+ value,
38
+ type: _type,
39
+ comment: re.comment,
40
+ range: [offset, valueEnd, re.offset]
41
+ };
42
+ }
43
+ function plainValue(source, onError) {
44
+ let message = '';
45
+ switch (source[0]) {
46
+ /* istanbul ignore next should not happen */
47
+ case '\t':
48
+ message = 'Plain value cannot start with a tab character';
49
+ break;
50
+ case '|':
51
+ case '>': {
52
+ message = `Plain value cannot start with block scalar indicator ${source[0]}`;
53
+ break;
54
+ }
55
+ case '@':
56
+ case '`': {
57
+ message = `Plain value cannot start with reserved character ${source[0]}`;
58
+ break;
59
+ }
60
+ }
61
+ if (message)
62
+ onError(0, 'BAD_SCALAR_START', message);
63
+ return foldLines(source);
64
+ }
65
+ function singleQuotedValue(source, onError) {
66
+ if (source[source.length - 1] !== "'" || source.length === 1)
67
+ onError(source.length, 'MISSING_CHAR', "Missing closing 'quote");
68
+ return foldLines(source.slice(1, -1)).replace(/''/g, "'");
69
+ }
70
+ function foldLines(source) {
71
+ /**
72
+ * The negative lookbehind here and in the `re` RegExp is to
73
+ * prevent causing a polynomial search time in certain cases.
74
+ *
75
+ * The try-catch is for Safari, which doesn't support this yet:
76
+ * https://caniuse.com/js-regexp-lookbehind
77
+ */
78
+ let first, line;
79
+ try {
80
+ first = new RegExp('(.*?)(?<![ \t])[ \t]*\r?\n', 'sy');
81
+ line = new RegExp('[ \t]*(.*?)(?:(?<![ \t])[ \t]*)?\r?\n', 'sy');
82
+ }
83
+ catch (_) {
84
+ first = /(.*?)[ \t]*\r?\n/sy;
85
+ line = /[ \t]*(.*?)[ \t]*\r?\n/sy;
86
+ }
87
+ let match = first.exec(source);
88
+ if (!match)
89
+ return source;
90
+ let res = match[1];
91
+ let sep = ' ';
92
+ let pos = first.lastIndex;
93
+ line.lastIndex = pos;
94
+ while ((match = line.exec(source))) {
95
+ if (match[1] === '') {
96
+ if (sep === '\n')
97
+ res += sep;
98
+ else
99
+ sep = '\n';
100
+ }
101
+ else {
102
+ res += sep + match[1];
103
+ sep = ' ';
104
+ }
105
+ pos = line.lastIndex;
106
+ }
107
+ const last = /[ \t]*(.*)/sy;
108
+ last.lastIndex = pos;
109
+ match = last.exec(source);
110
+ return res + sep + ((match && match[1]) || '');
111
+ }
112
+ function doubleQuotedValue(source, onError) {
113
+ let res = '';
114
+ for (let i = 1; i < source.length - 1; ++i) {
115
+ const ch = source[i];
116
+ if (ch === '\r' && source[i + 1] === '\n')
117
+ continue;
118
+ if (ch === '\n') {
119
+ const { fold, offset } = foldNewline(source, i);
120
+ res += fold;
121
+ i = offset;
122
+ }
123
+ else if (ch === '\\') {
124
+ let next = source[++i];
125
+ const cc = escapeCodes[next];
126
+ if (cc)
127
+ res += cc;
128
+ else if (next === '\n') {
129
+ // skip escaped newlines, but still trim the following line
130
+ next = source[i + 1];
131
+ while (next === ' ' || next === '\t')
132
+ next = source[++i + 1];
133
+ }
134
+ else if (next === 'x' || next === 'u' || next === 'U') {
135
+ const length = { x: 2, u: 4, U: 8 }[next];
136
+ res += parseCharCode(source, i + 1, length, onError);
137
+ i += length;
138
+ }
139
+ else {
140
+ const raw = source.substr(i - 1, 2);
141
+ onError(i - 1, 'BAD_DQ_ESCAPE', `Invalid escape sequence ${raw}`);
142
+ res += raw;
143
+ }
144
+ }
145
+ else if (ch === ' ' || ch === '\t') {
146
+ // trim trailing whitespace
147
+ const wsStart = i;
148
+ let next = source[i + 1];
149
+ while (next === ' ' || next === '\t')
150
+ next = source[++i + 1];
151
+ if (next !== '\n')
152
+ res += i > wsStart ? source.slice(wsStart, i + 1) : ch;
153
+ }
154
+ else {
155
+ res += ch;
156
+ }
157
+ }
158
+ if (source[source.length - 1] !== '"' || source.length === 1)
159
+ onError(source.length, 'MISSING_CHAR', 'Missing closing "quote');
160
+ return res;
161
+ }
162
+ /**
163
+ * Fold a single newline into a space, multiple newlines to N - 1 newlines.
164
+ * Presumes `source[offset] === '\n'`
165
+ */
166
+ function foldNewline(source, offset) {
167
+ let fold = '';
168
+ let ch = source[offset + 1];
169
+ while (ch === ' ' || ch === '\t' || ch === '\n' || ch === '\r') {
170
+ if (ch === '\r' && source[offset + 2] !== '\n')
171
+ break;
172
+ if (ch === '\n')
173
+ fold += '\n';
174
+ offset += 1;
175
+ ch = source[offset + 1];
176
+ }
177
+ if (!fold)
178
+ fold = ' ';
179
+ return { fold, offset };
180
+ }
181
+ const escapeCodes = {
182
+ '0': '\0',
183
+ a: '\x07',
184
+ b: '\b',
185
+ e: '\x1b',
186
+ f: '\f',
187
+ n: '\n',
188
+ r: '\r',
189
+ t: '\t',
190
+ v: '\v',
191
+ N: '\u0085',
192
+ _: '\u00a0',
193
+ L: '\u2028',
194
+ P: '\u2029',
195
+ ' ': ' ',
196
+ '"': '"',
197
+ '/': '/',
198
+ '\\': '\\',
199
+ '\t': '\t'
200
+ };
201
+ function parseCharCode(source, offset, length, onError) {
202
+ const cc = source.substr(offset, length);
203
+ const ok = cc.length === length && /^[0-9a-fA-F]+$/.test(cc);
204
+ const code = ok ? parseInt(cc, 16) : NaN;
205
+ if (isNaN(code)) {
206
+ const raw = source.substr(offset - 2, length + 2);
207
+ onError(offset - 2, 'BAD_DQ_ESCAPE', `Invalid escape sequence ${raw}`);
208
+ return raw;
209
+ }
210
+ return String.fromCodePoint(code);
211
+ }
212
+
213
+ exports.resolveFlowScalar = resolveFlowScalar;
@@ -0,0 +1,21 @@
1
+ import type { SourceToken, Token } from '../parse/cst.js';
2
+ import type { ComposeErrorHandler } from './composer.js';
3
+ export interface ResolvePropsArg {
4
+ flow?: string;
5
+ indicator: 'doc-start' | 'explicit-key-ind' | 'map-value-ind' | 'seq-item-ind';
6
+ next: Token | null | undefined;
7
+ offset: number;
8
+ onError: ComposeErrorHandler;
9
+ startOnNewline: boolean;
10
+ }
11
+ export declare function resolveProps(tokens: SourceToken[], { flow, indicator, next, offset, onError, startOnNewline }: ResolvePropsArg): {
12
+ comma: SourceToken | null;
13
+ found: SourceToken | null;
14
+ spaceBefore: boolean;
15
+ comment: string;
16
+ hasNewline: boolean;
17
+ anchor: SourceToken | null;
18
+ tag: SourceToken | null;
19
+ end: number;
20
+ start: number;
21
+ };
@@ -0,0 +1,128 @@
1
+ 'use strict';
2
+
3
+ function resolveProps(tokens, { flow, indicator, next, offset, onError, startOnNewline }) {
4
+ let spaceBefore = false;
5
+ let atNewline = startOnNewline;
6
+ let hasSpace = startOnNewline;
7
+ let comment = '';
8
+ let commentSep = '';
9
+ let hasNewline = false;
10
+ let reqSpace = false;
11
+ let anchor = null;
12
+ let tag = null;
13
+ let comma = null;
14
+ let found = null;
15
+ let start = null;
16
+ for (const token of tokens) {
17
+ if (reqSpace) {
18
+ if (token.type !== 'space' &&
19
+ token.type !== 'newline' &&
20
+ token.type !== 'comma')
21
+ onError(token.offset, 'MISSING_CHAR', 'Tags and anchors must be separated from the next token by white space');
22
+ reqSpace = false;
23
+ }
24
+ switch (token.type) {
25
+ case 'space':
26
+ // At the doc level, tabs at line start may be parsed
27
+ // as leading white space rather than indentation.
28
+ // In a flow collection, only the parser handles indent.
29
+ if (!flow &&
30
+ atNewline &&
31
+ indicator !== 'doc-start' &&
32
+ token.source[0] === '\t')
33
+ onError(token, 'TAB_AS_INDENT', 'Tabs are not allowed as indentation');
34
+ hasSpace = true;
35
+ break;
36
+ case 'comment': {
37
+ if (!hasSpace)
38
+ onError(token, 'MISSING_CHAR', 'Comments must be separated from other tokens by white space characters');
39
+ const cb = token.source.substring(1) || ' ';
40
+ if (!comment)
41
+ comment = cb;
42
+ else
43
+ comment += commentSep + cb;
44
+ commentSep = '';
45
+ atNewline = false;
46
+ break;
47
+ }
48
+ case 'newline':
49
+ if (atNewline) {
50
+ if (comment)
51
+ comment += token.source;
52
+ else
53
+ spaceBefore = true;
54
+ }
55
+ else
56
+ commentSep += token.source;
57
+ atNewline = true;
58
+ hasNewline = true;
59
+ hasSpace = true;
60
+ break;
61
+ case 'anchor':
62
+ if (anchor)
63
+ onError(token, 'MULTIPLE_ANCHORS', 'A node can have at most one anchor');
64
+ anchor = token;
65
+ if (start === null)
66
+ start = token.offset;
67
+ atNewline = false;
68
+ hasSpace = false;
69
+ reqSpace = true;
70
+ break;
71
+ case 'tag': {
72
+ if (tag)
73
+ onError(token, 'MULTIPLE_TAGS', 'A node can have at most one tag');
74
+ tag = token;
75
+ if (start === null)
76
+ start = token.offset;
77
+ atNewline = false;
78
+ hasSpace = false;
79
+ reqSpace = true;
80
+ break;
81
+ }
82
+ case indicator:
83
+ // Could here handle preceding comments differently
84
+ if (anchor || tag)
85
+ onError(token, 'BAD_PROP_ORDER', `Anchors and tags must be after the ${token.source} indicator`);
86
+ found = token;
87
+ atNewline = false;
88
+ hasSpace = false;
89
+ break;
90
+ case 'comma':
91
+ if (flow) {
92
+ if (comma)
93
+ onError(token, 'UNEXPECTED_TOKEN', `Unexpected , in ${flow}`);
94
+ comma = token;
95
+ atNewline = false;
96
+ hasSpace = false;
97
+ break;
98
+ }
99
+ // else fallthrough
100
+ default:
101
+ onError(token, 'UNEXPECTED_TOKEN', `Unexpected ${token.type} token`);
102
+ atNewline = false;
103
+ hasSpace = false;
104
+ }
105
+ }
106
+ const last = tokens[tokens.length - 1];
107
+ const end = last ? last.offset + last.source.length : offset;
108
+ if (reqSpace &&
109
+ next &&
110
+ next.type !== 'space' &&
111
+ next.type !== 'newline' &&
112
+ next.type !== 'comma' &&
113
+ (next.type !== 'scalar' || next.source !== ''))
114
+ onError(next.offset, 'MISSING_CHAR', 'Tags and anchors must be separated from the next token by white space');
115
+ return {
116
+ comma,
117
+ found,
118
+ spaceBefore,
119
+ comment,
120
+ hasNewline,
121
+ anchor,
122
+ tag,
123
+ end,
124
+ start: start !== null && start !== void 0 ? start : end
125
+ };
126
+ }
127
+
128
+ exports.resolveProps = resolveProps;
@@ -0,0 +1,2 @@
1
+ import type { Token } from '../parse/cst.js';
2
+ export declare function containsNewline(key: Token | null | undefined): boolean | null;
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ function containsNewline(key) {
4
+ if (!key)
5
+ return null;
6
+ switch (key.type) {
7
+ case 'alias':
8
+ case 'scalar':
9
+ case 'double-quoted-scalar':
10
+ case 'single-quoted-scalar':
11
+ if (key.source.includes('\n'))
12
+ return true;
13
+ if (key.end)
14
+ for (const st of key.end)
15
+ if (st.type === 'newline')
16
+ return true;
17
+ return false;
18
+ case 'flow-collection':
19
+ for (const it of key.items) {
20
+ for (const st of it.start)
21
+ if (st.type === 'newline')
22
+ return true;
23
+ if (it.sep)
24
+ for (const st of it.sep)
25
+ if (st.type === 'newline')
26
+ return true;
27
+ if (containsNewline(it.key) || containsNewline(it.value))
28
+ return true;
29
+ }
30
+ return false;
31
+ default:
32
+ return true;
33
+ }
34
+ }
35
+
36
+ exports.containsNewline = containsNewline;
@@ -0,0 +1,2 @@
1
+ import type { Token } from '../parse/cst.js';
2
+ export declare function emptyScalarPosition(offset: number, before: Token[] | undefined, pos: number | null): number;
@@ -0,0 +1,29 @@
1
+ 'use strict';
2
+
3
+ function emptyScalarPosition(offset, before, pos) {
4
+ if (before) {
5
+ if (pos === null)
6
+ pos = before.length;
7
+ for (let i = pos - 1; i >= 0; --i) {
8
+ let st = before[i];
9
+ switch (st.type) {
10
+ case 'space':
11
+ case 'comment':
12
+ case 'newline':
13
+ offset -= st.source.length;
14
+ continue;
15
+ }
16
+ // Technically, an empty scalar is immediately after the last non-empty
17
+ // node, but it's more useful to place it after any whitespace.
18
+ st = before[++i];
19
+ while ((st === null || st === void 0 ? void 0 : st.type) === 'space') {
20
+ offset += st.source.length;
21
+ st = before[++i];
22
+ }
23
+ break;
24
+ }
25
+ }
26
+ return offset;
27
+ }
28
+
29
+ exports.emptyScalarPosition = emptyScalarPosition;
@@ -0,0 +1,4 @@
1
+ import { ParsedNode } from '../nodes/Node';
2
+ import { Pair } from '../nodes/Pair';
3
+ import { ComposeContext } from './compose-node';
4
+ export declare function mapIncludes(ctx: ComposeContext, items: Pair<ParsedNode>[], search: ParsedNode): boolean;
@@ -0,0 +1,19 @@
1
+ 'use strict';
2
+
3
+ var Node = require('../nodes/Node.js');
4
+
5
+ function mapIncludes(ctx, items, search) {
6
+ const { uniqueKeys } = ctx.options;
7
+ if (uniqueKeys === false)
8
+ return false;
9
+ const isEqual = typeof uniqueKeys === 'function'
10
+ ? uniqueKeys
11
+ : (a, b) => a === b ||
12
+ (Node.isScalar(a) &&
13
+ Node.isScalar(b) &&
14
+ a.value === b.value &&
15
+ !(a.value === '<<' && ctx.schema.merge));
16
+ return items.some(pair => isEqual(pair.key, search));
17
+ }
18
+
19
+ exports.mapIncludes = mapIncludes;