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
@@ -1,153 +1,135 @@
1
1
  const FOLD_FLOW = 'flow';
2
2
  const FOLD_BLOCK = 'block';
3
- const FOLD_QUOTED = 'quoted'; // presumes i+1 is at the start of a line
4
- // returns index of last newline in more-indented block
5
-
6
- const consumeMoreIndentedLines = (text, i) => {
7
- let ch = text[i + 1];
8
-
9
- while (ch === ' ' || ch === '\t') {
10
- do {
11
- ch = text[i += 1];
12
- } while (ch && ch !== '\n');
13
-
14
- ch = text[i + 1];
15
- }
16
-
17
- return i;
18
- };
3
+ const FOLD_QUOTED = 'quoted';
19
4
  /**
20
5
  * Tries to keep input at up to `lineWidth` characters, splitting only on spaces
21
6
  * not followed by newlines or spaces unless `mode` is `'quoted'`. Lines are
22
7
  * terminated with `\n` and started with `indent`.
23
- *
24
- * @param {string} text
25
- * @param {string} indent
26
- * @param {string} [mode='flow'] `'block'` prevents more-indented lines
27
- * from being folded; `'quoted'` allows for `\` escapes, including escaped
28
- * newlines
29
- * @param {Object} options
30
- * @param {number} [options.indentAtStart] Accounts for leading contents on
31
- * the first line, defaulting to `indent.length`
32
- * @param {number} [options.lineWidth=80]
33
- * @param {number} [options.minContentWidth=20] Allow highly indented lines to
34
- * stretch the line width or indent content from the start
35
- * @param {function} options.onFold Called once if the text is folded
36
- * @param {function} options.onFold Called once if any line of text exceeds
37
- * lineWidth characters
38
8
  */
39
-
40
-
41
- function foldFlowLines(text, indent, mode, {
42
- indentAtStart,
43
- lineWidth = 80,
44
- minContentWidth = 20,
45
- onFold,
46
- onOverflow
47
- }) {
48
- if (!lineWidth || lineWidth < 0) return text;
49
- const endStep = Math.max(1 + minContentWidth, 1 + lineWidth - indent.length);
50
- if (text.length <= endStep) return text;
51
- const folds = [];
52
- const escapedFolds = {};
53
- let end = lineWidth - indent.length;
54
-
55
- if (typeof indentAtStart === 'number') {
56
- if (indentAtStart > lineWidth - Math.max(2, minContentWidth)) folds.push(0);else end = lineWidth - indentAtStart;
57
- }
58
-
59
- let split = undefined;
60
- let prev = undefined;
61
- let overflow = false;
62
- let i = -1;
63
- let escStart = -1;
64
- let escEnd = -1;
65
-
66
- if (mode === FOLD_BLOCK) {
67
- i = consumeMoreIndentedLines(text, i);
68
- if (i !== -1) end = i + endStep;
69
- }
70
-
71
- for (let ch; ch = text[i += 1];) {
72
- if (mode === FOLD_QUOTED && ch === '\\') {
73
- escStart = i;
74
-
75
- switch (text[i + 1]) {
76
- case 'x':
77
- i += 3;
78
- break;
79
-
80
- case 'u':
81
- i += 5;
82
- break;
83
-
84
- case 'U':
85
- i += 9;
86
- break;
87
-
88
- default:
89
- i += 1;
90
- }
91
-
92
- escEnd = i;
9
+ function foldFlowLines(text, indent, mode = 'flow', { indentAtStart, lineWidth = 80, minContentWidth = 20, onFold, onOverflow } = {}) {
10
+ if (!lineWidth || lineWidth < 0)
11
+ return text;
12
+ const endStep = Math.max(1 + minContentWidth, 1 + lineWidth - indent.length);
13
+ if (text.length <= endStep)
14
+ return text;
15
+ const folds = [];
16
+ const escapedFolds = {};
17
+ let end = lineWidth - indent.length;
18
+ if (typeof indentAtStart === 'number') {
19
+ if (indentAtStart > lineWidth - Math.max(2, minContentWidth))
20
+ folds.push(0);
21
+ else
22
+ end = lineWidth - indentAtStart;
93
23
  }
94
-
95
- if (ch === '\n') {
96
- if (mode === FOLD_BLOCK) i = consumeMoreIndentedLines(text, i);
97
- end = i + endStep;
98
- split = undefined;
99
- } else {
100
- if (ch === ' ' && prev && prev !== ' ' && prev !== '\n' && prev !== '\t') {
101
- // space surrounded by non-space can be replaced with newline + indent
102
- const next = text[i + 1];
103
- if (next && next !== ' ' && next !== '\n' && next !== '\t') split = i;
104
- }
105
-
106
- if (i >= end) {
107
- if (split) {
108
- folds.push(split);
109
- end = split + endStep;
110
- split = undefined;
111
- } else if (mode === FOLD_QUOTED) {
112
- // white-space collected at end may stretch past lineWidth
113
- while (prev === ' ' || prev === '\t') {
114
- prev = ch;
115
- ch = text[i += 1];
116
- overflow = true;
117
- } // Account for newline escape, but don't break preceding escape
118
-
119
-
120
- const j = i > escEnd + 1 ? i - 2 : escStart - 1; // Bail out if lineWidth & minContentWidth are shorter than an escape string
121
-
122
- if (escapedFolds[j]) return text;
123
- folds.push(j);
124
- escapedFolds[j] = true;
125
- end = j + endStep;
126
- split = undefined;
127
- } else {
128
- overflow = true;
24
+ let split = undefined;
25
+ let prev = undefined;
26
+ let overflow = false;
27
+ let i = -1;
28
+ let escStart = -1;
29
+ let escEnd = -1;
30
+ if (mode === FOLD_BLOCK) {
31
+ i = consumeMoreIndentedLines(text, i);
32
+ if (i !== -1)
33
+ end = i + endStep;
34
+ }
35
+ for (let ch; (ch = text[(i += 1)]);) {
36
+ if (mode === FOLD_QUOTED && ch === '\\') {
37
+ escStart = i;
38
+ switch (text[i + 1]) {
39
+ case 'x':
40
+ i += 3;
41
+ break;
42
+ case 'u':
43
+ i += 5;
44
+ break;
45
+ case 'U':
46
+ i += 9;
47
+ break;
48
+ default:
49
+ i += 1;
50
+ }
51
+ escEnd = i;
52
+ }
53
+ if (ch === '\n') {
54
+ if (mode === FOLD_BLOCK)
55
+ i = consumeMoreIndentedLines(text, i);
56
+ end = i + endStep;
57
+ split = undefined;
129
58
  }
130
- }
59
+ else {
60
+ if (ch === ' ' &&
61
+ prev &&
62
+ prev !== ' ' &&
63
+ prev !== '\n' &&
64
+ prev !== '\t') {
65
+ // space surrounded by non-space can be replaced with newline + indent
66
+ const next = text[i + 1];
67
+ if (next && next !== ' ' && next !== '\n' && next !== '\t')
68
+ split = i;
69
+ }
70
+ if (i >= end) {
71
+ if (split) {
72
+ folds.push(split);
73
+ end = split + endStep;
74
+ split = undefined;
75
+ }
76
+ else if (mode === FOLD_QUOTED) {
77
+ // white-space collected at end may stretch past lineWidth
78
+ while (prev === ' ' || prev === '\t') {
79
+ prev = ch;
80
+ ch = text[(i += 1)];
81
+ overflow = true;
82
+ }
83
+ // Account for newline escape, but don't break preceding escape
84
+ const j = i > escEnd + 1 ? i - 2 : escStart - 1;
85
+ // Bail out if lineWidth & minContentWidth are shorter than an escape string
86
+ if (escapedFolds[j])
87
+ return text;
88
+ folds.push(j);
89
+ escapedFolds[j] = true;
90
+ end = j + endStep;
91
+ split = undefined;
92
+ }
93
+ else {
94
+ overflow = true;
95
+ }
96
+ }
97
+ }
98
+ prev = ch;
131
99
  }
132
-
133
- prev = ch;
134
- }
135
-
136
- if (overflow && onOverflow) onOverflow();
137
- if (folds.length === 0) return text;
138
- if (onFold) onFold();
139
- let res = text.slice(0, folds[0]);
140
-
141
- for (let i = 0; i < folds.length; ++i) {
142
- const fold = folds[i];
143
- const end = folds[i + 1] || text.length;
144
- if (fold === 0) res = "\n".concat(indent).concat(text.slice(0, end));else {
145
- if (mode === FOLD_QUOTED && escapedFolds[fold]) res += "".concat(text[fold], "\\");
146
- res += "\n".concat(indent).concat(text.slice(fold + 1, end));
100
+ if (overflow && onOverflow)
101
+ onOverflow();
102
+ if (folds.length === 0)
103
+ return text;
104
+ if (onFold)
105
+ onFold();
106
+ let res = text.slice(0, folds[0]);
107
+ for (let i = 0; i < folds.length; ++i) {
108
+ const fold = folds[i];
109
+ const end = folds[i + 1] || text.length;
110
+ if (fold === 0)
111
+ res = `\n${indent}${text.slice(0, end)}`;
112
+ else {
113
+ if (mode === FOLD_QUOTED && escapedFolds[fold])
114
+ res += `${text[fold]}\\`;
115
+ res += `\n${indent}${text.slice(fold + 1, end)}`;
116
+ }
147
117
  }
148
- }
149
-
150
- return res;
118
+ return res;
119
+ }
120
+ /**
121
+ * Presumes `i + 1` is at the start of a line
122
+ * @returns index of last newline in more-indented block
123
+ */
124
+ function consumeMoreIndentedLines(text, i) {
125
+ let ch = text[i + 1];
126
+ while (ch === ' ' || ch === '\t') {
127
+ do {
128
+ ch = text[(i += 1)];
129
+ } while (ch && ch !== '\n');
130
+ ch = text[i + 1];
131
+ }
132
+ return i;
151
133
  }
152
134
 
153
135
  export { FOLD_BLOCK, FOLD_FLOW, FOLD_QUOTED, foldFlowLines };
@@ -1,79 +1,94 @@
1
- import { Alias } from '../ast/Alias.js';
2
- import { Node } from '../ast/Node.js';
3
- import { Pair } from '../ast/Pair.js';
4
- import { Scalar } from '../ast/Scalar.js';
1
+ import { anchorIsValid } from '../doc/anchors.js';
2
+ import { isPair, isAlias, isNode, isScalar, isCollection } from '../nodes/Node.js';
5
3
  import { stringifyString } from './stringifyString.js';
6
- import { stringifyTag } from './stringifyTag.js';
7
4
 
5
+ const createStringifyContext = (doc, options) => ({
6
+ anchors: new Set(),
7
+ doc,
8
+ indent: '',
9
+ indentStep: typeof options.indent === 'number' ? ' '.repeat(options.indent) : ' ',
10
+ options: Object.assign({
11
+ defaultKeyType: null,
12
+ defaultStringType: 'PLAIN',
13
+ directives: null,
14
+ doubleQuotedAsJSON: false,
15
+ doubleQuotedMinMultiLineLength: 40,
16
+ falseStr: 'false',
17
+ indentSeq: true,
18
+ lineWidth: 80,
19
+ minContentWidth: 20,
20
+ nullStr: 'null',
21
+ simpleKeys: false,
22
+ singleQuote: false,
23
+ trueStr: 'true',
24
+ verifyAliasOrder: true
25
+ }, options)
26
+ });
8
27
  function getTagObject(tags, item) {
9
- if (item instanceof Alias) return Alias;
10
-
11
- if (item.tag) {
12
- const match = tags.filter(t => t.tag === item.tag);
13
- if (match.length > 0) return match.find(t => t.format === item.format) || match[0];
14
- }
15
-
16
- let tagObj, obj;
17
-
18
- if (item instanceof Scalar) {
19
- obj = item.value;
20
- const match = tags.filter(t => t.identify && t.identify(obj));
21
- tagObj = match.find(t => t.format === item.format) || match.find(t => !t.format);
22
- } else {
23
- obj = item;
24
- tagObj = tags.find(t => t.nodeClass && obj instanceof t.nodeClass);
25
- }
26
-
27
- if (!tagObj) {
28
- const name = obj && obj.constructor ? obj.constructor.name : typeof obj;
29
- throw new Error("Tag not resolved for ".concat(name, " value"));
30
- }
31
-
32
- return tagObj;
33
- } // needs to be called before value stringifier to allow for circular anchor refs
34
-
35
-
36
- function stringifyProps(node, tagObj, {
37
- anchors,
38
- doc
39
- }) {
40
- const props = [];
41
- const anchor = doc.anchors.getName(node);
42
-
43
- if (anchor) {
44
- anchors[anchor] = node;
45
- props.push("&".concat(anchor));
46
- }
47
-
48
- if (node.tag) {
49
- props.push(stringifyTag(doc, node.tag));
50
- } else if (!tagObj.default) {
51
- props.push(stringifyTag(doc, tagObj.tag));
52
- }
53
-
54
- return props.join(' ');
28
+ if (item.tag) {
29
+ const match = tags.filter(t => t.tag === item.tag);
30
+ if (match.length > 0)
31
+ return match.find(t => t.format === item.format) || match[0];
32
+ }
33
+ let tagObj = undefined;
34
+ let obj;
35
+ if (isScalar(item)) {
36
+ obj = item.value;
37
+ const match = tags.filter(t => t.identify && t.identify(obj));
38
+ tagObj =
39
+ match.find(t => t.format === item.format) || match.find(t => !t.format);
40
+ }
41
+ else {
42
+ obj = item;
43
+ tagObj = tags.find(t => t.nodeClass && obj instanceof t.nodeClass);
44
+ }
45
+ if (!tagObj) {
46
+ // @ts-ignore
47
+ const name = obj && obj.constructor ? obj.constructor.name : typeof obj;
48
+ throw new Error(`Tag not resolved for ${name} value`);
49
+ }
50
+ return tagObj;
51
+ }
52
+ // needs to be called before value stringifier to allow for circular anchor refs
53
+ function stringifyProps(node, tagObj, { anchors, doc }) {
54
+ const props = [];
55
+ const anchor = (isScalar(node) || isCollection(node)) && node.anchor;
56
+ if (anchor && anchorIsValid(anchor)) {
57
+ anchors.add(anchor);
58
+ props.push(`&${anchor}`);
59
+ }
60
+ if (node.tag) {
61
+ props.push(doc.directives.tagString(node.tag));
62
+ }
63
+ else if (!tagObj.default) {
64
+ props.push(doc.directives.tagString(tagObj.tag));
65
+ }
66
+ return props.join(' ');
55
67
  }
56
-
57
68
  function stringify(item, ctx, onComment, onChompKeep) {
58
- const {
59
- schema
60
- } = ctx.doc;
61
- let tagObj;
62
-
63
- if (!(item instanceof Node)) {
64
- item = ctx.doc.createNode(item, {
65
- onTagObj: o => tagObj = o,
66
- wrapScalars: true
67
- });
68
- }
69
-
70
- if (item instanceof Pair) return item.toString(ctx, onComment, onChompKeep);
71
- if (!tagObj) tagObj = getTagObject(schema.tags, item);
72
- const props = stringifyProps(item, tagObj, ctx);
73
- if (props.length > 0) ctx.indentAtStart = (ctx.indentAtStart || 0) + props.length + 1;
74
- const str = typeof tagObj.stringify === 'function' ? tagObj.stringify(item, ctx, onComment, onChompKeep) : item instanceof Scalar ? stringifyString(item, ctx, onComment, onChompKeep) : item.toString(ctx, onComment, onChompKeep);
75
- if (!props) return str;
76
- return item instanceof Scalar || str[0] === '{' || str[0] === '[' ? "".concat(props, " ").concat(str) : "".concat(props, "\n").concat(ctx.indent).concat(str);
69
+ if (isPair(item))
70
+ return item.toString(ctx, onComment, onChompKeep);
71
+ if (isAlias(item))
72
+ return item.toString(ctx);
73
+ let tagObj = undefined;
74
+ const node = isNode(item)
75
+ ? item
76
+ : ctx.doc.createNode(item, { onTagObj: o => (tagObj = o) });
77
+ if (!tagObj)
78
+ tagObj = getTagObject(ctx.doc.schema.tags, node);
79
+ const props = stringifyProps(node, tagObj, ctx);
80
+ if (props.length > 0)
81
+ ctx.indentAtStart = (ctx.indentAtStart || 0) + props.length + 1;
82
+ const str = typeof tagObj.stringify === 'function'
83
+ ? tagObj.stringify(node, ctx, onComment, onChompKeep)
84
+ : isScalar(node)
85
+ ? stringifyString(node, ctx, onComment, onChompKeep)
86
+ : node.toString(ctx, onComment, onChompKeep);
87
+ if (!props)
88
+ return str;
89
+ return isScalar(node) || str[0] === '{' || str[0] === '['
90
+ ? `${props} ${str}`
91
+ : `${props}\n${ctx.indent}${str}`;
77
92
  }
78
93
 
79
- export { stringify };
94
+ export { createStringifyContext, stringify };
@@ -0,0 +1,122 @@
1
+ import { Collection } from '../nodes/Collection.js';
2
+ import { isNode, isPair } from '../nodes/Node.js';
3
+ import { stringify } from './stringify.js';
4
+ import { addComment, stringifyComment } from './stringifyComment.js';
5
+
6
+ function stringifyCollection({ comment, flow, items }, ctx, { blockItem, flowChars, itemIndent, onChompKeep, onComment }) {
7
+ const { indent, indentStep } = ctx;
8
+ const inFlow = flow || ctx.inFlow;
9
+ if (inFlow)
10
+ itemIndent += indentStep;
11
+ ctx = Object.assign({}, ctx, { indent: itemIndent, inFlow, type: null });
12
+ let singleLineOutput = true;
13
+ let chompKeep = false; // flag for the preceding node's status
14
+ const nodes = items.reduce((nodes, item, i) => {
15
+ let comment = null;
16
+ if (isNode(item)) {
17
+ if (!chompKeep && item.spaceBefore)
18
+ nodes.push({ comment: true, str: '' });
19
+ let cb = item.commentBefore;
20
+ if (cb && chompKeep)
21
+ cb = cb.replace(/^\n+/, '');
22
+ if (cb) {
23
+ if (/^\n+$/.test(cb))
24
+ cb = cb.substring(1);
25
+ // This match will always succeed on a non-empty string
26
+ for (const line of cb.match(/^.*$/gm)) {
27
+ const str = line === ' ' ? '#' : line ? `#${line}` : '';
28
+ nodes.push({ comment: true, str });
29
+ }
30
+ }
31
+ if (item.comment) {
32
+ comment = item.comment;
33
+ singleLineOutput = false;
34
+ }
35
+ }
36
+ else if (isPair(item)) {
37
+ const ik = isNode(item.key) ? item.key : null;
38
+ if (ik) {
39
+ if (!chompKeep && ik.spaceBefore)
40
+ nodes.push({ comment: true, str: '' });
41
+ let cb = ik.commentBefore;
42
+ if (cb && chompKeep)
43
+ cb = cb.replace(/^\n+/, '');
44
+ if (cb) {
45
+ if (/^\n+$/.test(cb))
46
+ cb = cb.substring(1);
47
+ // This match will always succeed on a non-empty string
48
+ for (const line of cb.match(/^.*$/gm)) {
49
+ const str = line === ' ' ? '#' : line ? `#${line}` : '';
50
+ nodes.push({ comment: true, str });
51
+ }
52
+ }
53
+ if (ik.comment)
54
+ singleLineOutput = false;
55
+ }
56
+ if (inFlow) {
57
+ const iv = isNode(item.value) ? item.value : null;
58
+ if (iv) {
59
+ if (iv.comment)
60
+ comment = iv.comment;
61
+ if (iv.comment || iv.commentBefore)
62
+ singleLineOutput = false;
63
+ }
64
+ else if (item.value == null && ik && ik.comment) {
65
+ comment = ik.comment;
66
+ }
67
+ }
68
+ }
69
+ chompKeep = false;
70
+ let str = stringify(item, ctx, () => (comment = null), () => (chompKeep = true));
71
+ if (inFlow && i < items.length - 1)
72
+ str += ',';
73
+ str = addComment(str, itemIndent, comment);
74
+ if (chompKeep && (comment || inFlow))
75
+ chompKeep = false;
76
+ nodes.push({ comment: false, str });
77
+ return nodes;
78
+ }, []);
79
+ let str;
80
+ if (nodes.length === 0) {
81
+ str = flowChars.start + flowChars.end;
82
+ }
83
+ else if (inFlow) {
84
+ const { start, end } = flowChars;
85
+ const strings = nodes.map(n => n.str);
86
+ let singleLineLength = 2;
87
+ for (const node of nodes) {
88
+ if (node.comment || node.str.includes('\n')) {
89
+ singleLineOutput = false;
90
+ break;
91
+ }
92
+ singleLineLength += node.str.length + 2;
93
+ }
94
+ if (!singleLineOutput ||
95
+ singleLineLength > Collection.maxFlowStringSingleLineLength) {
96
+ str = start;
97
+ for (const s of strings) {
98
+ str += s ? `\n${indentStep}${indent}${s}` : '\n';
99
+ }
100
+ str += `\n${indent}${end}`;
101
+ }
102
+ else {
103
+ str = `${start} ${strings.join(' ')} ${end}`;
104
+ }
105
+ }
106
+ else {
107
+ const strings = nodes.map(blockItem);
108
+ str = strings.shift() || '';
109
+ for (const s of strings)
110
+ str += s ? `\n${indent}${s}` : '\n';
111
+ }
112
+ if (comment) {
113
+ str += '\n' + stringifyComment(comment, indent);
114
+ if (onComment)
115
+ onComment();
116
+ }
117
+ else if (chompKeep && onChompKeep)
118
+ onChompKeep();
119
+ return str;
120
+ }
121
+
122
+ export { stringifyCollection };
@@ -0,0 +1,14 @@
1
+ const stringifyComment = (comment, indent) => /^\n+$/.test(comment)
2
+ ? comment.substring(1)
3
+ : comment.replace(/^(?!$)(?: $)?/gm, `${indent}#`);
4
+ function addComment(str, indent, comment) {
5
+ return !comment
6
+ ? str
7
+ : comment.includes('\n')
8
+ ? `${str}\n` + stringifyComment(comment, indent)
9
+ : str.endsWith(' ')
10
+ ? `${str}#${comment}`
11
+ : `${str} #${comment}`;
12
+ }
13
+
14
+ export { addComment, stringifyComment };
@@ -0,0 +1,64 @@
1
+ import { isNode } from '../nodes/Node.js';
2
+ import { createStringifyContext, stringify } from './stringify.js';
3
+ import { stringifyComment, addComment } from './stringifyComment.js';
4
+
5
+ function stringifyDocument(doc, options) {
6
+ const lines = [];
7
+ let hasDirectives = options.directives === true;
8
+ if (options.directives !== false) {
9
+ const dir = doc.directives.toString(doc);
10
+ if (dir) {
11
+ lines.push(dir);
12
+ hasDirectives = true;
13
+ }
14
+ else if (doc.directives.marker)
15
+ hasDirectives = true;
16
+ }
17
+ if (hasDirectives)
18
+ lines.push('---');
19
+ if (doc.commentBefore) {
20
+ if (lines.length !== 1)
21
+ lines.unshift('');
22
+ lines.unshift(stringifyComment(doc.commentBefore, ''));
23
+ }
24
+ const ctx = createStringifyContext(doc, options);
25
+ let chompKeep = false;
26
+ let contentComment = null;
27
+ if (doc.contents) {
28
+ if (isNode(doc.contents)) {
29
+ if (doc.contents.spaceBefore && hasDirectives)
30
+ lines.push('');
31
+ if (doc.contents.commentBefore)
32
+ lines.push(stringifyComment(doc.contents.commentBefore, ''));
33
+ // top-level block scalars need to be indented if followed by a comment
34
+ ctx.forceBlockIndent = !!doc.comment;
35
+ contentComment = doc.contents.comment;
36
+ }
37
+ const onChompKeep = contentComment ? undefined : () => (chompKeep = true);
38
+ let body = stringify(doc.contents, ctx, () => (contentComment = null), onChompKeep);
39
+ if (contentComment)
40
+ body = addComment(body, '', contentComment);
41
+ if ((body[0] === '|' || body[0] === '>') &&
42
+ lines[lines.length - 1] === '---') {
43
+ // Top-level block scalars with a preceding doc marker ought to use the
44
+ // same line for their header.
45
+ lines[lines.length - 1] = `--- ${body}`;
46
+ }
47
+ else
48
+ lines.push(body);
49
+ }
50
+ else {
51
+ lines.push(stringify(doc.contents, ctx));
52
+ }
53
+ let dc = doc.comment;
54
+ if (dc && chompKeep)
55
+ dc = dc.replace(/^\n+/, '');
56
+ if (dc) {
57
+ if ((!chompKeep || contentComment) && lines[lines.length - 1] !== '')
58
+ lines.push('');
59
+ lines.push(stringifyComment(dc, ''));
60
+ }
61
+ return lines.join('\n') + '\n';
62
+ }
63
+
64
+ export { stringifyDocument };