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
package/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2018 Eemeli Aro <eemeli@gmail.com>
1
+ Copyright Eemeli Aro <eemeli@gmail.com>
2
2
 
3
3
  Permission to use, copy, modify, and/or distribute this software for any purpose
4
4
  with or without fee is hereby granted, provided that the above copyright notice
package/README.md CHANGED
@@ -1,27 +1,37 @@
1
1
  # YAML <a href="https://www.npmjs.com/package/yaml"><img align="right" src="https://badge.fury.io/js/yaml.svg" title="npm package" /></a>
2
2
 
3
- `yaml` is a JavaScript parser and stringifier for [YAML](http://yaml.org/), a human friendly data serialization standard. It supports both parsing and stringifying data using all versions of YAML, along with all common data schemas. As a particularly distinguishing feature, `yaml` fully supports reading and writing comments and blank lines in YAML documents.
3
+ `yaml` is a definitive library for [YAML](http://yaml.org/), the human friendly data serialization standard.
4
+ This library:
5
+
6
+ - Supports both YAML 1.1 and YAML 1.2 and all common data schemas,
7
+ - Passes all of the [yaml-test-suite](https://github.com/yaml/yaml-test-suite) tests,
8
+ - Can accept any string as input without throwing, parsing as much YAML out of it as it can, and
9
+ - Supports parsing, modifying, and writing YAML comments and blank lines.
4
10
 
5
11
  The library is released under the ISC open source license, and the code is [available on GitHub](https://github.com/eemeli/yaml/).
6
12
  It has no external dependencies and runs on Node.js as well as modern browsers.
7
13
 
8
- For the purposes of versioning, any changes that break any of the endpoints or APIs documented here will be considered semver-major breaking changes. Undocumented library internals may change between minor versions, and previous APIs may be deprecated (but not removed).
14
+ For the purposes of versioning, any changes that break any of the documented endpoints or APIs will be considered semver-major breaking changes.
15
+ Undocumented library internals may change between minor versions, and previous APIs may be deprecated (but not removed).
9
16
 
10
17
  For more information, see the project's documentation site: [**eemeli.org/yaml**](https://eemeli.org/yaml/)
11
18
 
12
19
  To install:
13
20
 
14
21
  ```sh
15
- npm install yaml@next
22
+ npm install --save-exact yaml@next
16
23
  ```
17
24
 
18
25
  **Note:** These docs are for `yaml@2`. For v1, see the [v1.10.0 tag](https://github.com/eemeli/yaml/tree/v1.10.0) for the source and [eemeli.org/yaml/v1](https://eemeli.org/yaml/v1/) for the documentation.
19
26
 
20
27
  ## API Overview
21
28
 
22
- The API provided by `yaml` has three layers, depending on how deep you need to go: [Parse & Stringify](https://eemeli.org/yaml/#parse-amp-stringify), [Documents](https://eemeli.org/yaml/#documents), and the [CST Parser](https://eemeli.org/yaml/#cst-parser). The first has the simplest API and "just works", the second gets you all the bells and whistles supported by the library along with a decent [AST](https://eemeli.org/yaml/#content-nodes), and the third is the closest to YAML source, making it fast, raw, and crude.
29
+ The API provided by `yaml` has three layers, depending on how deep you need to go: [Parse & Stringify](https://eemeli.org/yaml/#parse-amp-stringify), [Documents](https://eemeli.org/yaml/#documents), and the underlying [Lexer/Parser/Composer](https://eemeli.org/yaml/#parsing-yaml).
30
+ The first has the simplest API and "just works", the second gets you all the bells and whistles supported by the library along with a decent [AST](https://eemeli.org/yaml/#content-nodes), and the third lets you get progressively closer to YAML source, if that's your thing.
23
31
 
24
32
  ```js
33
+ import { parse, stringify } from 'yaml'
34
+ // or
25
35
  import YAML from 'yaml'
26
36
  // or
27
37
  const YAML = require('yaml')
@@ -29,34 +39,44 @@ const YAML = require('yaml')
29
39
 
30
40
  ### Parse & Stringify
31
41
 
32
- - [`YAML.parse(str, reviver?, options?): value`](https://eemeli.org/yaml/#yaml-parse)
33
- - [`YAML.stringify(value, replacer?, options?): string`](https://eemeli.org/yaml/#yaml-stringify)
42
+ - [`parse(str, reviver?, options?): value`](https://eemeli.org/yaml/#yaml-parse)
43
+ - [`stringify(value, replacer?, options?): string`](https://eemeli.org/yaml/#yaml-stringify)
34
44
 
35
- ### YAML Documents
45
+ ### Documents
36
46
 
37
- - [`YAML.defaultOptions`](https://eemeli.org/yaml/#options)
38
- - [`YAML.Document`](https://eemeli.org/yaml/#yaml-documents)
47
+ - [`Document`](https://eemeli.org/yaml/#documents)
39
48
  - [`constructor(value, replacer?, options?)`](https://eemeli.org/yaml/#creating-documents)
40
- - [`defaults`](https://eemeli.org/yaml/#options)
41
- - [`#createNode(value, options?): Node`](https://eemeli.org/yaml/#creating-nodes)
42
49
  - [`#anchors`](https://eemeli.org/yaml/#working-with-anchors)
43
50
  - [`#contents`](https://eemeli.org/yaml/#content-nodes)
51
+ - [`#directives`](https://eemeli.org/yaml/#stream-directives)
44
52
  - [`#errors`](https://eemeli.org/yaml/#errors)
45
- - [`YAML.parseAllDocuments(str, options?): YAML.Document[]`](https://eemeli.org/yaml/#parsing-documents)
46
- - [`YAML.parseDocument(str, options?): YAML.Document`](https://eemeli.org/yaml/#parsing-documents)
47
- - [`YAML.visit(node, visitor)`](https://eemeli.org/yaml/#modifying-nodes)
48
-
49
- ```js
50
- import { Pair, YAMLMap, YAMLSeq } from 'yaml/types'
51
- ```
52
-
53
- - [`new Pair(key, value)`](https://eemeli.org/yaml/#creating-nodes)
54
- - [`new YAMLMap()`](https://eemeli.org/yaml/#creating-nodes)
55
- - [`new YAMLSeq()`](https://eemeli.org/yaml/#creating-nodes)
56
-
57
- ### CST Parser
58
-
59
- - [`YAML.parseCST(str): CSTDocument[]`](https://eemeli.org/yaml/#parsecst)
53
+ - [`#warnings`](https://eemeli.org/yaml/#errors)
54
+ - [`isDocument(foo): boolean`](https://eemeli.org/yaml/#identifying-nodes)
55
+ - [`parseAllDocuments(str, options?): Document[]`](https://eemeli.org/yaml/#parsing-documents)
56
+ - [`parseDocument(str, options?): Document`](https://eemeli.org/yaml/#parsing-documents)
57
+
58
+ ### Content Nodes
59
+
60
+ - [`isAlias(foo): boolean`](https://eemeli.org/yaml/#identifying-nodes)
61
+ - [`isCollection(foo): boolean`](https://eemeli.org/yaml/#identifying-nodes)
62
+ - [`isMap(foo): boolean`](https://eemeli.org/yaml/#identifying-nodes)
63
+ - [`isNode(foo): boolean`](https://eemeli.org/yaml/#identifying-nodes)
64
+ - [`isPair(foo): boolean`](https://eemeli.org/yaml/#identifying-nodes)
65
+ - [`isScalar(foo): boolean`](https://eemeli.org/yaml/#identifying-nodes)
66
+ - [`isSeq(foo): boolean`](https://eemeli.org/yaml/#identifying-nodes)
67
+ - [`new Scalar(value)`](https://eemeli.org/yaml/#scalar-values)
68
+ - [`new YAMLMap()`](https://eemeli.org/yaml/#collections)
69
+ - [`new YAMLSeq()`](https://eemeli.org/yaml/#collections)
70
+ - [`doc.createAlias(node, name?): Alias`](https://eemeli.org/yaml/#working-with-anchors)
71
+ - [`doc.createNode(value, options?): Node`](https://eemeli.org/yaml/#creating-nodes)
72
+ - [`doc.createPair(key, value): Pair`](https://eemeli.org/yaml/#creating-nodes)
73
+ - [`visit(node, visitor)`](https://eemeli.org/yaml/#modifying-nodes)
74
+
75
+ ### Parsing YAML
76
+
77
+ - [`new Lexer().lex(src)`](https://eemeli.org/yaml/#lexer)
78
+ - [`new Parser(onNewLine?).parse(src)`](https://eemeli.org/yaml/#parser)
79
+ - [`new Composer(options?).compose(tokens)`](https://eemeli.org/yaml/#composer)
60
80
 
61
81
  ## YAML.parse
62
82
 
@@ -0,0 +1,59 @@
1
+ import { isNode, isMap } from '../nodes/Node.js';
2
+ import { Scalar } from '../nodes/Scalar.js';
3
+ import { resolveBlockMap } from './resolve-block-map.js';
4
+ import { resolveBlockSeq } from './resolve-block-seq.js';
5
+ import { resolveFlowCollection } from './resolve-flow-collection.js';
6
+
7
+ function composeCollection(CN, ctx, token, tagToken, onError) {
8
+ let coll;
9
+ switch (token.type) {
10
+ case 'block-map': {
11
+ coll = resolveBlockMap(CN, ctx, token, onError);
12
+ break;
13
+ }
14
+ case 'block-seq': {
15
+ coll = resolveBlockSeq(CN, ctx, token, onError);
16
+ break;
17
+ }
18
+ case 'flow-collection': {
19
+ coll = resolveFlowCollection(CN, ctx, token, onError);
20
+ break;
21
+ }
22
+ }
23
+ if (!tagToken)
24
+ return coll;
25
+ const tagName = ctx.directives.tagName(tagToken.source, msg => onError(tagToken, 'TAG_RESOLVE_FAILED', msg));
26
+ if (!tagName)
27
+ return coll;
28
+ // Cast needed due to: https://github.com/Microsoft/TypeScript/issues/3841
29
+ const Coll = coll.constructor;
30
+ if (tagName === '!' || tagName === Coll.tagName) {
31
+ coll.tag = Coll.tagName;
32
+ return coll;
33
+ }
34
+ const expType = isMap(coll) ? 'map' : 'seq';
35
+ let tag = ctx.schema.tags.find(t => t.collection === expType && t.tag === tagName);
36
+ if (!tag) {
37
+ const kt = ctx.schema.knownTags[tagName];
38
+ if (kt && kt.collection === expType) {
39
+ ctx.schema.tags.push(Object.assign({}, kt, { default: false }));
40
+ tag = kt;
41
+ }
42
+ else {
43
+ onError(tagToken, 'TAG_RESOLVE_FAILED', `Unresolved tag: ${tagName}`, true);
44
+ coll.tag = tagName;
45
+ return coll;
46
+ }
47
+ }
48
+ const res = tag.resolve(coll, msg => onError(tagToken, 'TAG_RESOLVE_FAILED', msg), ctx.options);
49
+ const node = isNode(res)
50
+ ? res
51
+ : new Scalar(res);
52
+ node.range = coll.range;
53
+ node.tag = tagName;
54
+ if (tag === null || tag === void 0 ? void 0 : tag.format)
55
+ node.format = tag.format;
56
+ return node;
57
+ }
58
+
59
+ export { composeCollection };
@@ -0,0 +1,39 @@
1
+ import { Document } from '../doc/Document.js';
2
+ import { composeNode, composeEmptyNode } from './compose-node.js';
3
+ import { resolveEnd } from './resolve-end.js';
4
+ import { resolveProps } from './resolve-props.js';
5
+
6
+ function composeDoc(options, directives, { offset, start, value, end }, onError) {
7
+ const opts = Object.assign({ directives }, options);
8
+ const doc = new Document(undefined, opts);
9
+ const ctx = {
10
+ directives: doc.directives,
11
+ options: doc.options,
12
+ schema: doc.schema
13
+ };
14
+ const props = resolveProps(start, {
15
+ indicator: 'doc-start',
16
+ next: value || (end === null || end === void 0 ? void 0 : end[0]),
17
+ offset,
18
+ onError,
19
+ startOnNewline: true
20
+ });
21
+ if (props.found) {
22
+ doc.directives.marker = true;
23
+ if (value &&
24
+ (value.type === 'block-map' || value.type === 'block-seq') &&
25
+ !props.hasNewline)
26
+ onError(props.end, 'MISSING_CHAR', 'Block collection cannot start on same line with directives-end marker');
27
+ }
28
+ doc.contents = value
29
+ ? composeNode(ctx, value, props, onError)
30
+ : composeEmptyNode(ctx, props.end, start, null, props, onError);
31
+ const contentEnd = doc.contents.range[2];
32
+ const re = resolveEnd(end, contentEnd, false, onError);
33
+ if (re.comment)
34
+ doc.comment = re.comment;
35
+ doc.range = [offset, contentEnd, re.offset];
36
+ return doc;
37
+ }
38
+
39
+ export { composeDoc };
@@ -0,0 +1,72 @@
1
+ import { Alias } from '../nodes/Alias.js';
2
+ import { composeCollection } from './compose-collection.js';
3
+ import { composeScalar } from './compose-scalar.js';
4
+ import { resolveEnd } from './resolve-end.js';
5
+ import { emptyScalarPosition } from './util-empty-scalar-position.js';
6
+
7
+ const CN = { composeNode, composeEmptyNode };
8
+ function composeNode(ctx, token, props, onError) {
9
+ const { spaceBefore, comment, anchor, tag } = props;
10
+ let node;
11
+ switch (token.type) {
12
+ case 'alias':
13
+ node = composeAlias(ctx, token, onError);
14
+ if (anchor || tag)
15
+ onError(token, 'ALIAS_PROPS', 'An alias node must not specify any properties');
16
+ break;
17
+ case 'scalar':
18
+ case 'single-quoted-scalar':
19
+ case 'double-quoted-scalar':
20
+ case 'block-scalar':
21
+ node = composeScalar(ctx, token, tag, onError);
22
+ if (anchor)
23
+ node.anchor = anchor.source.substring(1);
24
+ break;
25
+ case 'block-map':
26
+ case 'block-seq':
27
+ case 'flow-collection':
28
+ node = composeCollection(CN, ctx, token, tag, onError);
29
+ if (anchor)
30
+ node.anchor = anchor.source.substring(1);
31
+ break;
32
+ default:
33
+ console.log(token);
34
+ throw new Error(`Unsupporten token type: ${token.type}`);
35
+ }
36
+ if (spaceBefore)
37
+ node.spaceBefore = true;
38
+ if (comment) {
39
+ if (token.type === 'scalar' && token.source === '')
40
+ node.comment = comment;
41
+ else
42
+ node.commentBefore = comment;
43
+ }
44
+ return node;
45
+ }
46
+ function composeEmptyNode(ctx, offset, before, pos, { spaceBefore, comment, anchor, tag }, onError) {
47
+ const token = {
48
+ type: 'scalar',
49
+ offset: emptyScalarPosition(offset, before, pos),
50
+ indent: -1,
51
+ source: ''
52
+ };
53
+ const node = composeScalar(ctx, token, tag, onError);
54
+ if (anchor)
55
+ node.anchor = anchor.source.substring(1);
56
+ if (spaceBefore)
57
+ node.spaceBefore = true;
58
+ if (comment)
59
+ node.comment = comment;
60
+ return node;
61
+ }
62
+ function composeAlias({ options }, { offset, source, end }, onError) {
63
+ const alias = new Alias(source.substring(1));
64
+ const valueEnd = offset + source.length;
65
+ const re = resolveEnd(end, valueEnd, options.strict, onError);
66
+ alias.range = [offset, valueEnd, re.offset];
67
+ if (re.comment)
68
+ alias.comment = re.comment;
69
+ return alias;
70
+ }
71
+
72
+ export { composeEmptyNode, composeNode };
@@ -0,0 +1,74 @@
1
+ import { isScalar, SCALAR } from '../nodes/Node.js';
2
+ import { Scalar } from '../nodes/Scalar.js';
3
+ import { resolveBlockScalar } from './resolve-block-scalar.js';
4
+ import { resolveFlowScalar } from './resolve-flow-scalar.js';
5
+
6
+ function composeScalar(ctx, token, tagToken, onError) {
7
+ const { value, type, comment, range } = token.type === 'block-scalar'
8
+ ? resolveBlockScalar(token, ctx.options.strict, onError)
9
+ : resolveFlowScalar(token, ctx.options.strict, onError);
10
+ const tagName = tagToken
11
+ ? ctx.directives.tagName(tagToken.source, msg => onError(tagToken, 'TAG_RESOLVE_FAILED', msg))
12
+ : null;
13
+ const tag = tagToken && tagName
14
+ ? findScalarTagByName(ctx.schema, value, tagName, tagToken, onError)
15
+ : findScalarTagByTest(ctx.schema, value, token.type === 'scalar');
16
+ let scalar;
17
+ try {
18
+ const res = tag.resolve(value, msg => onError(tagToken || token, 'TAG_RESOLVE_FAILED', msg), ctx.options);
19
+ scalar = isScalar(res) ? res : new Scalar(res);
20
+ }
21
+ catch (error) {
22
+ onError(tagToken || token, 'TAG_RESOLVE_FAILED', error.message);
23
+ scalar = new Scalar(value);
24
+ }
25
+ scalar.range = range;
26
+ scalar.source = value;
27
+ if (type)
28
+ scalar.type = type;
29
+ if (tagName)
30
+ scalar.tag = tagName;
31
+ if (tag.format)
32
+ scalar.format = tag.format;
33
+ if (comment)
34
+ scalar.comment = comment;
35
+ return scalar;
36
+ }
37
+ function findScalarTagByName(schema, value, tagName, tagToken, onError) {
38
+ var _a;
39
+ if (tagName === '!')
40
+ return schema[SCALAR]; // non-specific tag
41
+ const matchWithTest = [];
42
+ for (const tag of schema.tags) {
43
+ if (!tag.collection && tag.tag === tagName) {
44
+ if (tag.default && tag.test)
45
+ matchWithTest.push(tag);
46
+ else
47
+ return tag;
48
+ }
49
+ }
50
+ for (const tag of matchWithTest)
51
+ if ((_a = tag.test) === null || _a === void 0 ? void 0 : _a.test(value))
52
+ return tag;
53
+ const kt = schema.knownTags[tagName];
54
+ if (kt && !kt.collection) {
55
+ // Ensure that the known tag is available for stringifying,
56
+ // but does not get used by default.
57
+ schema.tags.push(Object.assign({}, kt, { default: false, test: undefined }));
58
+ return kt;
59
+ }
60
+ onError(tagToken, 'TAG_RESOLVE_FAILED', `Unresolved tag: ${tagName}`, tagName !== 'tag:yaml.org,2002:str');
61
+ return schema[SCALAR];
62
+ }
63
+ function findScalarTagByTest(schema, value, apply) {
64
+ var _a;
65
+ if (apply) {
66
+ for (const tag of schema.tags) {
67
+ if (tag.default && ((_a = tag.test) === null || _a === void 0 ? void 0 : _a.test(value)))
68
+ return tag;
69
+ }
70
+ }
71
+ return schema[SCALAR];
72
+ }
73
+
74
+ export { composeScalar };
@@ -0,0 +1,218 @@
1
+ import { Directives } from '../doc/directives.js';
2
+ import { Document } from '../doc/Document.js';
3
+ import { YAMLWarning, YAMLParseError } from '../errors.js';
4
+ import { isCollection, isPair } from '../nodes/Node.js';
5
+ import { defaultOptions } from '../options.js';
6
+ import { composeDoc } from './compose-doc.js';
7
+ import { resolveEnd } from './resolve-end.js';
8
+
9
+ function getErrorPos(src) {
10
+ if (typeof src === 'number')
11
+ return [src, src + 1];
12
+ if (Array.isArray(src))
13
+ return src.length === 2 ? src : [src[0], src[1]];
14
+ const { offset, source } = src;
15
+ return [offset, offset + (typeof source === 'string' ? source.length : 1)];
16
+ }
17
+ function parsePrelude(prelude) {
18
+ let comment = '';
19
+ let atComment = false;
20
+ let afterEmptyLine = false;
21
+ for (let i = 0; i < prelude.length; ++i) {
22
+ const source = prelude[i];
23
+ switch (source[0]) {
24
+ case '#':
25
+ comment +=
26
+ (comment === '' ? '' : afterEmptyLine ? '\n\n' : '\n') +
27
+ (source.substring(1) || ' ');
28
+ atComment = true;
29
+ afterEmptyLine = false;
30
+ break;
31
+ case '%':
32
+ if (prelude[i + 1][0] !== '#')
33
+ i += 1;
34
+ atComment = false;
35
+ break;
36
+ default:
37
+ // This may be wrong after doc-end, but in that case it doesn't matter
38
+ if (!atComment)
39
+ afterEmptyLine = true;
40
+ atComment = false;
41
+ }
42
+ }
43
+ return { comment, afterEmptyLine };
44
+ }
45
+ /**
46
+ * Compose a stream of CST nodes into a stream of YAML Documents.
47
+ *
48
+ * ```ts
49
+ * import { Composer, Parser } from 'yaml'
50
+ *
51
+ * const src: string = ...
52
+ * const tokens = new Parser().parse(src)
53
+ * const docs = new Composer().compose(tokens)
54
+ * ```
55
+ */
56
+ class Composer {
57
+ constructor(options = {}) {
58
+ this.doc = null;
59
+ this.atDirectives = false;
60
+ this.prelude = [];
61
+ this.errors = [];
62
+ this.warnings = [];
63
+ this.onError = (source, code, message, warning) => {
64
+ const pos = getErrorPos(source);
65
+ if (warning)
66
+ this.warnings.push(new YAMLWarning(pos, code, message));
67
+ else
68
+ this.errors.push(new YAMLParseError(pos, code, message));
69
+ };
70
+ this.directives = new Directives({
71
+ version: options.version || defaultOptions.version
72
+ });
73
+ this.options = options;
74
+ }
75
+ decorate(doc, afterDoc) {
76
+ const { comment, afterEmptyLine } = parsePrelude(this.prelude);
77
+ //console.log({ dc: doc.comment, prelude, comment })
78
+ if (comment) {
79
+ const dc = doc.contents;
80
+ if (afterDoc) {
81
+ doc.comment = doc.comment ? `${doc.comment}\n${comment}` : comment;
82
+ }
83
+ else if (afterEmptyLine || doc.directives.marker || !dc) {
84
+ doc.commentBefore = comment;
85
+ }
86
+ else if (isCollection(dc) && !dc.flow && dc.items.length > 0) {
87
+ let it = dc.items[0];
88
+ if (isPair(it))
89
+ it = it.key;
90
+ const cb = it.commentBefore;
91
+ it.commentBefore = cb ? `${comment}\n${cb}` : comment;
92
+ }
93
+ else {
94
+ const cb = dc.commentBefore;
95
+ dc.commentBefore = cb ? `${comment}\n${cb}` : comment;
96
+ }
97
+ }
98
+ if (afterDoc) {
99
+ Array.prototype.push.apply(doc.errors, this.errors);
100
+ Array.prototype.push.apply(doc.warnings, this.warnings);
101
+ }
102
+ else {
103
+ doc.errors = this.errors;
104
+ doc.warnings = this.warnings;
105
+ }
106
+ this.prelude = [];
107
+ this.errors = [];
108
+ this.warnings = [];
109
+ }
110
+ /**
111
+ * Current stream status information.
112
+ *
113
+ * Mostly useful at the end of input for an empty stream.
114
+ */
115
+ streamInfo() {
116
+ return {
117
+ comment: parsePrelude(this.prelude).comment,
118
+ directives: this.directives,
119
+ errors: this.errors,
120
+ warnings: this.warnings
121
+ };
122
+ }
123
+ /**
124
+ * Compose tokens into documents.
125
+ *
126
+ * @param forceDoc - If the stream contains no document, still emit a final document including any comments and directives that would be applied to a subsequent document.
127
+ * @param endOffset - Should be set if `forceDoc` is also set, to set the document range end and to indicate errors correctly.
128
+ */
129
+ *compose(tokens, forceDoc = false, endOffset = -1) {
130
+ for (const token of tokens)
131
+ yield* this.next(token);
132
+ yield* this.end(forceDoc, endOffset);
133
+ }
134
+ /** Advance the composer by one CST token. */
135
+ *next(token) {
136
+ switch (token.type) {
137
+ case 'directive':
138
+ this.directives.add(token.source, (offset, message, warning) => {
139
+ const pos = getErrorPos(token);
140
+ pos[0] += offset;
141
+ this.onError(pos, 'BAD_DIRECTIVE', message, warning);
142
+ });
143
+ this.prelude.push(token.source);
144
+ this.atDirectives = true;
145
+ break;
146
+ case 'document': {
147
+ const doc = composeDoc(this.options, this.directives, token, this.onError);
148
+ if (this.atDirectives && !doc.directives.marker)
149
+ this.onError(token, 'MISSING_CHAR', 'Missing directives-end indicator line');
150
+ this.decorate(doc, false);
151
+ if (this.doc)
152
+ yield this.doc;
153
+ this.doc = doc;
154
+ this.atDirectives = false;
155
+ break;
156
+ }
157
+ case 'byte-order-mark':
158
+ case 'space':
159
+ break;
160
+ case 'comment':
161
+ case 'newline':
162
+ this.prelude.push(token.source);
163
+ break;
164
+ case 'error': {
165
+ const msg = token.source
166
+ ? `${token.message}: ${JSON.stringify(token.source)}`
167
+ : token.message;
168
+ const error = new YAMLParseError(getErrorPos(token), 'UNEXPECTED_TOKEN', msg);
169
+ if (this.atDirectives || !this.doc)
170
+ this.errors.push(error);
171
+ else
172
+ this.doc.errors.push(error);
173
+ break;
174
+ }
175
+ case 'doc-end': {
176
+ if (!this.doc) {
177
+ const msg = 'Unexpected doc-end without preceding document';
178
+ this.errors.push(new YAMLParseError(getErrorPos(token), 'UNEXPECTED_TOKEN', msg));
179
+ break;
180
+ }
181
+ const end = resolveEnd(token.end, token.offset + token.source.length, this.doc.options.strict, this.onError);
182
+ this.decorate(this.doc, true);
183
+ if (end.comment) {
184
+ const dc = this.doc.comment;
185
+ this.doc.comment = dc ? `${dc}\n${end.comment}` : end.comment;
186
+ }
187
+ this.doc.range[2] = end.offset;
188
+ break;
189
+ }
190
+ default:
191
+ this.errors.push(new YAMLParseError(getErrorPos(token), 'UNEXPECTED_TOKEN', `Unsupported token ${token.type}`));
192
+ }
193
+ }
194
+ /**
195
+ * Call at end of input to yield any remaining document.
196
+ *
197
+ * @param forceDoc - If the stream contains no document, still emit a final document including any comments and directives that would be applied to a subsequent document.
198
+ * @param endOffset - Should be set if `forceDoc` is also set, to set the document range end and to indicate errors correctly.
199
+ */
200
+ *end(forceDoc = false, endOffset = -1) {
201
+ if (this.doc) {
202
+ this.decorate(this.doc, true);
203
+ yield this.doc;
204
+ this.doc = null;
205
+ }
206
+ else if (forceDoc) {
207
+ const opts = Object.assign({ directives: this.directives }, this.options);
208
+ const doc = new Document(undefined, opts);
209
+ if (this.atDirectives)
210
+ this.onError(endOffset, 'MISSING_CHAR', 'Missing directives-end indicator line');
211
+ doc.range = [0, endOffset, endOffset];
212
+ this.decorate(doc, false);
213
+ yield doc;
214
+ }
215
+ }
216
+ }
217
+
218
+ export { Composer };
@@ -0,0 +1,93 @@
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 { mapIncludes } from './util-map-includes.js';
6
+
7
+ const startColMsg = 'All mapping items must start at the same column';
8
+ function resolveBlockMap({ composeNode, composeEmptyNode }, ctx, bm, onError) {
9
+ var _a;
10
+ const map = new YAMLMap(ctx.schema);
11
+ let offset = bm.offset;
12
+ for (const { start, key, sep, value } of bm.items) {
13
+ // key properties
14
+ const keyProps = resolveProps(start, {
15
+ indicator: 'explicit-key-ind',
16
+ next: key || (sep === null || sep === void 0 ? void 0 : sep[0]),
17
+ offset,
18
+ onError,
19
+ startOnNewline: true
20
+ });
21
+ const implicitKey = !keyProps.found;
22
+ if (implicitKey) {
23
+ if (key) {
24
+ if (key.type === 'block-seq')
25
+ onError(offset, 'BLOCK_AS_IMPLICIT_KEY', 'A block sequence may not be used as an implicit map key');
26
+ else if ('indent' in key && key.indent !== bm.indent)
27
+ onError(offset, 'BAD_INDENT', startColMsg);
28
+ }
29
+ if (!keyProps.anchor && !keyProps.tag && !sep) {
30
+ // TODO: assert being at last item?
31
+ if (keyProps.comment) {
32
+ if (map.comment)
33
+ map.comment += '\n' + keyProps.comment;
34
+ else
35
+ map.comment = keyProps.comment;
36
+ }
37
+ continue;
38
+ }
39
+ }
40
+ else if (((_a = keyProps.found) === null || _a === void 0 ? void 0 : _a.indent) !== bm.indent)
41
+ onError(offset, 'BAD_INDENT', startColMsg);
42
+ if (implicitKey && containsNewline(key))
43
+ onError(key, // checked by containsNewline()
44
+ 'MULTILINE_IMPLICIT_KEY', 'Implicit keys need to be on a single line');
45
+ // key value
46
+ const keyStart = keyProps.end;
47
+ const keyNode = key
48
+ ? composeNode(ctx, key, keyProps, onError)
49
+ : composeEmptyNode(ctx, keyStart, start, null, keyProps, onError);
50
+ if (mapIncludes(ctx, map.items, keyNode))
51
+ onError(keyStart, 'DUPLICATE_KEY', 'Map keys must be unique');
52
+ // value properties
53
+ const valueProps = resolveProps(sep || [], {
54
+ indicator: 'map-value-ind',
55
+ next: value,
56
+ offset: keyNode.range[2],
57
+ onError,
58
+ startOnNewline: !key || key.type === 'block-scalar'
59
+ });
60
+ offset = valueProps.end;
61
+ if (valueProps.found) {
62
+ if (implicitKey) {
63
+ if ((value === null || value === void 0 ? void 0 : value.type) === 'block-map' && !valueProps.hasNewline)
64
+ onError(offset, 'BLOCK_AS_IMPLICIT_KEY', 'Nested mappings are not allowed in compact mappings');
65
+ if (ctx.options.strict &&
66
+ keyProps.start < valueProps.found.offset - 1024)
67
+ onError(keyNode.range, 'KEY_OVER_1024_CHARS', 'The : indicator must be at most 1024 chars after the start of an implicit block mapping key');
68
+ }
69
+ // value value
70
+ const valueNode = value
71
+ ? composeNode(ctx, value, valueProps, onError)
72
+ : composeEmptyNode(ctx, offset, sep, null, valueProps, onError);
73
+ offset = valueNode.range[2];
74
+ map.items.push(new Pair(keyNode, valueNode));
75
+ }
76
+ else {
77
+ // key with no value
78
+ if (implicitKey)
79
+ onError(keyNode.range, 'MISSING_CHAR', 'Implicit map keys need to be followed by map values');
80
+ if (valueProps.comment) {
81
+ if (keyNode.comment)
82
+ keyNode.comment += '\n' + valueProps.comment;
83
+ else
84
+ keyNode.comment = valueProps.comment;
85
+ }
86
+ map.items.push(new Pair(keyNode));
87
+ }
88
+ }
89
+ map.range = [bm.offset, offset, offset];
90
+ return map;
91
+ }
92
+
93
+ export { resolveBlockMap };