yaml 2.0.0-3 → 2.0.0-7

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 (345) 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 +79 -0
  6. package/browser/dist/compose/compose-scalar.js +74 -0
  7. package/browser/dist/compose/composer.js +219 -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 +217 -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 +75 -55
  22. package/browser/dist/doc/directives.js +161 -0
  23. package/browser/dist/errors.js +50 -72
  24. package/browser/dist/index.js +16 -72
  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 +674 -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 +134 -71
  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 +82 -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 +223 -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 +219 -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 +75 -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 +39 -70
  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 +676 -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 +134 -71
  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/constants.js +0 -40
  233. package/browser/dist/cst/Alias.js +0 -26
  234. package/browser/dist/cst/BlankLine.js +0 -34
  235. package/browser/dist/cst/BlockValue.js +0 -240
  236. package/browser/dist/cst/Collection.js +0 -259
  237. package/browser/dist/cst/CollectionItem.js +0 -123
  238. package/browser/dist/cst/Comment.js +0 -27
  239. package/browser/dist/cst/Directive.js +0 -53
  240. package/browser/dist/cst/Document.js +0 -262
  241. package/browser/dist/cst/FlowCollection.js +0 -201
  242. package/browser/dist/cst/Node.js +0 -355
  243. package/browser/dist/cst/ParseContext.js +0 -234
  244. package/browser/dist/cst/PlainValue.js +0 -171
  245. package/browser/dist/cst/QuoteDouble.js +0 -224
  246. package/browser/dist/cst/QuoteSingle.js +0 -100
  247. package/browser/dist/cst/Range.js +0 -56
  248. package/browser/dist/cst/parse.js +0 -46
  249. package/browser/dist/cst/source-utils.js +0 -169
  250. package/browser/dist/doc/Anchors.js +0 -115
  251. package/browser/dist/doc/Schema.js +0 -34
  252. package/browser/dist/doc/getSchemaTags.js +0 -33
  253. package/browser/dist/doc/listTagNames.js +0 -27
  254. package/browser/dist/doc/parseContents.js +0 -60
  255. package/browser/dist/doc/parseDirectives.js +0 -107
  256. package/browser/dist/resolve/collection-utils.js +0 -86
  257. package/browser/dist/resolve/resolveMap.js +0 -315
  258. package/browser/dist/resolve/resolveNode.js +0 -173
  259. package/browser/dist/resolve/resolveScalar.js +0 -20
  260. package/browser/dist/resolve/resolveSeq.js +0 -170
  261. package/browser/dist/resolve/resolveTag.js +0 -107
  262. package/browser/dist/resolve/resolveTagName.js +0 -87
  263. package/browser/dist/stringify/addComment.js +0 -10
  264. package/browser/dist/stringify/stringifyTag.js +0 -28
  265. package/browser/dist/tags/core.js +0 -128
  266. package/browser/dist/tags/failsafe/index.js +0 -7
  267. package/browser/dist/tags/failsafe/map.js +0 -37
  268. package/browser/dist/tags/failsafe/seq.js +0 -34
  269. package/browser/dist/tags/failsafe/string.js +0 -20
  270. package/browser/dist/tags/index.js +0 -39
  271. package/browser/dist/tags/json.js +0 -62
  272. package/browser/dist/tags/options.js +0 -31
  273. package/browser/dist/tags/yaml-1.1/binary.js +0 -83
  274. package/browser/dist/tags/yaml-1.1/index.js +0 -174
  275. package/browser/dist/tags/yaml-1.1/omap.js +0 -86
  276. package/browser/dist/tags/yaml-1.1/pairs.js +0 -62
  277. package/browser/dist/tags/yaml-1.1/set.js +0 -78
  278. package/browser/dist/tags/yaml-1.1/timestamp.js +0 -101
  279. package/browser/dist/types.js +0 -10
  280. package/cst.d.ts +0 -185
  281. package/dist/_virtual/_rollupPluginBabelHelpers.js +0 -18
  282. package/dist/ast/Alias.js +0 -97
  283. package/dist/ast/Collection.js +0 -196
  284. package/dist/ast/Merge.js +0 -74
  285. package/dist/ast/Node.js +0 -5
  286. package/dist/ast/Pair.js +0 -203
  287. package/dist/ast/Scalar.js +0 -24
  288. package/dist/ast/YAMLMap.js +0 -94
  289. package/dist/ast/YAMLSeq.js +0 -69
  290. package/dist/ast/toJS.js +0 -31
  291. package/dist/constants.js +0 -46
  292. package/dist/cst/Alias.js +0 -28
  293. package/dist/cst/BlankLine.js +0 -36
  294. package/dist/cst/BlockValue.js +0 -243
  295. package/dist/cst/Collection.js +0 -262
  296. package/dist/cst/CollectionItem.js +0 -125
  297. package/dist/cst/Comment.js +0 -29
  298. package/dist/cst/Directive.js +0 -55
  299. package/dist/cst/Document.js +0 -264
  300. package/dist/cst/FlowCollection.js +0 -203
  301. package/dist/cst/Node.js +0 -357
  302. package/dist/cst/ParseContext.js +0 -236
  303. package/dist/cst/PlainValue.js +0 -173
  304. package/dist/cst/QuoteDouble.js +0 -226
  305. package/dist/cst/QuoteSingle.js +0 -102
  306. package/dist/cst/Range.js +0 -58
  307. package/dist/cst/parse.js +0 -48
  308. package/dist/cst/source-utils.js +0 -173
  309. package/dist/doc/Anchors.js +0 -117
  310. package/dist/doc/Schema.js +0 -36
  311. package/dist/doc/getSchemaTags.js +0 -35
  312. package/dist/doc/listTagNames.js +0 -29
  313. package/dist/doc/parseContents.js +0 -62
  314. package/dist/doc/parseDirectives.js +0 -109
  315. package/dist/resolve/collection-utils.js +0 -91
  316. package/dist/resolve/resolveMap.js +0 -317
  317. package/dist/resolve/resolveNode.js +0 -175
  318. package/dist/resolve/resolveScalar.js +0 -22
  319. package/dist/resolve/resolveSeq.js +0 -172
  320. package/dist/resolve/resolveTag.js +0 -109
  321. package/dist/resolve/resolveTagName.js +0 -89
  322. package/dist/stringify/addComment.js +0 -13
  323. package/dist/stringify/stringifyTag.js +0 -30
  324. package/dist/tags/core.js +0 -138
  325. package/dist/tags/failsafe/index.js +0 -9
  326. package/dist/tags/failsafe/map.js +0 -39
  327. package/dist/tags/failsafe/seq.js +0 -36
  328. package/dist/tags/failsafe/string.js +0 -22
  329. package/dist/tags/index.js +0 -42
  330. package/dist/tags/json.js +0 -64
  331. package/dist/tags/options.js +0 -37
  332. package/dist/tags/yaml-1.1/binary.js +0 -85
  333. package/dist/tags/yaml-1.1/index.js +0 -176
  334. package/dist/tags/yaml-1.1/omap.js +0 -89
  335. package/dist/tags/yaml-1.1/pairs.js +0 -66
  336. package/dist/tags/yaml-1.1/set.js +0 -81
  337. package/dist/tags/yaml-1.1/timestamp.js +0 -105
  338. package/dist/types.js +0 -29
  339. package/index.d.ts +0 -519
  340. package/index.js +0 -1
  341. package/types.d.ts +0 -379
  342. package/types.js +0 -17
  343. package/types.mjs +0 -17
  344. package/util.d.ts +0 -76
  345. 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 };