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.
- package/LICENSE +1 -1
- package/README.md +46 -26
- package/browser/dist/compose/compose-collection.js +59 -0
- package/browser/dist/compose/compose-doc.js +39 -0
- package/browser/dist/compose/compose-node.js +79 -0
- package/browser/dist/compose/compose-scalar.js +74 -0
- package/browser/dist/compose/composer.js +219 -0
- package/browser/dist/compose/resolve-block-map.js +93 -0
- package/browser/dist/compose/resolve-block-scalar.js +185 -0
- package/browser/dist/compose/resolve-block-seq.js +40 -0
- package/browser/dist/compose/resolve-end.js +37 -0
- package/browser/dist/compose/resolve-flow-collection.js +189 -0
- package/browser/dist/compose/resolve-flow-scalar.js +217 -0
- package/browser/dist/compose/resolve-props.js +126 -0
- package/browser/dist/compose/util-contains-newline.js +34 -0
- package/browser/dist/compose/util-empty-scalar-position.js +27 -0
- package/browser/dist/compose/util-map-includes.js +17 -0
- package/browser/dist/doc/Document.js +251 -348
- package/browser/dist/doc/anchors.js +72 -0
- package/browser/dist/doc/applyReviver.js +41 -28
- package/browser/dist/doc/createNode.js +75 -55
- package/browser/dist/doc/directives.js +161 -0
- package/browser/dist/errors.js +50 -72
- package/browser/dist/index.js +16 -72
- package/browser/dist/log.js +11 -7
- package/browser/dist/nodes/Alias.js +94 -0
- package/browser/dist/nodes/Collection.js +133 -0
- package/browser/dist/nodes/Node.js +41 -0
- package/browser/dist/nodes/Pair.js +28 -0
- package/browser/dist/nodes/Scalar.js +23 -0
- package/browser/dist/nodes/YAMLMap.js +116 -0
- package/browser/dist/nodes/YAMLSeq.js +105 -0
- package/browser/dist/nodes/addPairToJSMap.js +103 -0
- package/browser/dist/nodes/toJS.js +35 -0
- package/browser/dist/options.js +14 -95
- package/browser/dist/parse/cst-scalar.js +219 -0
- package/browser/dist/parse/cst-stringify.js +61 -0
- package/browser/dist/parse/cst-visit.js +97 -0
- package/browser/dist/parse/cst.js +98 -0
- package/browser/dist/parse/lexer.js +674 -0
- package/browser/dist/parse/line-counter.js +39 -0
- package/browser/dist/parse/parser.js +876 -0
- package/browser/dist/public-api.js +101 -0
- package/browser/dist/schema/Schema.js +23 -0
- package/browser/dist/schema/common/map.js +42 -0
- package/browser/dist/schema/common/null.js +13 -0
- package/browser/dist/schema/common/seq.js +33 -0
- package/browser/dist/schema/common/string.js +14 -0
- package/browser/dist/schema/core/bool.js +19 -0
- package/browser/dist/schema/core/float.js +40 -0
- package/browser/dist/schema/core/int.js +38 -0
- package/browser/dist/schema/core/schema.js +23 -0
- package/browser/dist/schema/json/schema.js +62 -0
- package/browser/dist/schema/tags.js +79 -0
- package/browser/dist/schema/yaml-1.1/binary.js +66 -0
- package/browser/dist/schema/yaml-1.1/bool.js +26 -0
- package/browser/dist/schema/yaml-1.1/float.js +43 -0
- package/browser/dist/schema/yaml-1.1/int.js +71 -0
- package/browser/dist/schema/yaml-1.1/omap.js +73 -0
- package/browser/dist/schema/yaml-1.1/pairs.js +77 -0
- package/browser/dist/schema/yaml-1.1/schema.js +37 -0
- package/browser/dist/schema/yaml-1.1/set.js +87 -0
- package/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
- package/browser/dist/stringify/foldFlowLines.js +121 -139
- package/browser/dist/stringify/stringify.js +87 -72
- package/browser/dist/stringify/stringifyCollection.js +122 -0
- package/browser/dist/stringify/stringifyComment.js +14 -0
- package/browser/dist/stringify/stringifyDocument.js +64 -0
- package/browser/dist/stringify/stringifyNumber.js +20 -23
- package/browser/dist/stringify/stringifyPair.js +111 -0
- package/browser/dist/stringify/stringifyString.js +295 -322
- package/browser/dist/util.js +4 -4
- package/browser/dist/visit.js +134 -71
- package/browser/index.js +4 -1
- package/dist/compose/compose-collection.d.ts +5 -0
- package/dist/compose/compose-collection.js +61 -0
- package/dist/compose/compose-doc.d.ts +6 -0
- package/dist/compose/compose-doc.js +41 -0
- package/dist/compose/compose-node.d.ts +25 -0
- package/dist/compose/compose-node.js +82 -0
- package/dist/compose/compose-scalar.d.ts +5 -0
- package/dist/compose/compose-scalar.js +76 -0
- package/dist/compose/composer.d.ts +62 -0
- package/dist/compose/composer.js +223 -0
- package/dist/compose/resolve-block-map.d.ts +6 -0
- package/dist/compose/resolve-block-map.js +95 -0
- package/dist/compose/resolve-block-scalar.d.ts +10 -0
- package/dist/compose/resolve-block-scalar.js +187 -0
- package/dist/compose/resolve-block-seq.d.ts +5 -0
- package/dist/compose/resolve-block-seq.js +42 -0
- package/dist/compose/resolve-end.d.ts +6 -0
- package/dist/compose/resolve-end.js +39 -0
- package/dist/compose/resolve-flow-collection.d.ts +6 -0
- package/dist/compose/resolve-flow-collection.js +191 -0
- package/dist/compose/resolve-flow-scalar.d.ts +10 -0
- package/dist/compose/resolve-flow-scalar.js +219 -0
- package/dist/compose/resolve-props.d.ts +21 -0
- package/dist/compose/resolve-props.js +128 -0
- package/dist/compose/util-contains-newline.d.ts +2 -0
- package/dist/compose/util-contains-newline.js +36 -0
- package/dist/compose/util-empty-scalar-position.d.ts +2 -0
- package/dist/compose/util-empty-scalar-position.js +29 -0
- package/dist/compose/util-map-includes.d.ts +4 -0
- package/dist/compose/util-map-includes.js +19 -0
- package/dist/doc/Document.d.ts +130 -0
- package/dist/doc/Document.js +250 -347
- package/dist/doc/anchors.d.ts +24 -0
- package/dist/doc/anchors.js +77 -0
- package/dist/doc/applyReviver.d.ts +9 -0
- package/dist/doc/applyReviver.js +41 -28
- package/dist/doc/createNode.d.ts +16 -0
- package/dist/doc/createNode.js +75 -55
- package/dist/doc/directives.d.ts +46 -0
- package/dist/doc/directives.js +163 -0
- package/dist/errors.d.ts +21 -0
- package/dist/errors.js +51 -74
- package/dist/index.d.ts +19 -0
- package/dist/index.js +39 -70
- package/dist/log.d.ts +3 -0
- package/dist/log.js +11 -6
- package/dist/nodes/Alias.d.ts +24 -0
- package/dist/nodes/Alias.js +96 -0
- package/dist/nodes/Collection.d.ts +67 -0
- package/dist/nodes/Collection.js +137 -0
- package/dist/nodes/Node.d.ts +48 -0
- package/dist/nodes/Node.js +59 -0
- package/dist/nodes/Pair.d.ts +16 -0
- package/dist/nodes/Pair.js +31 -0
- package/dist/nodes/Scalar.d.ts +40 -0
- package/dist/nodes/Scalar.js +26 -0
- package/dist/nodes/YAMLMap.d.ts +39 -0
- package/dist/nodes/YAMLMap.js +119 -0
- package/dist/nodes/YAMLSeq.d.ts +53 -0
- package/dist/nodes/YAMLSeq.js +107 -0
- package/dist/nodes/addPairToJSMap.d.ts +3 -0
- package/dist/nodes/addPairToJSMap.js +105 -0
- package/dist/nodes/toJS.d.ts +30 -0
- package/dist/nodes/toJS.js +37 -0
- package/dist/options.d.ts +278 -0
- package/dist/options.js +13 -96
- package/dist/parse/cst-scalar.d.ts +58 -0
- package/dist/parse/cst-scalar.js +223 -0
- package/dist/parse/cst-stringify.d.ts +8 -0
- package/dist/parse/cst-stringify.js +63 -0
- package/dist/parse/cst-visit.d.ts +39 -0
- package/dist/parse/cst-visit.js +99 -0
- package/dist/parse/cst.d.ts +106 -0
- package/dist/parse/cst.js +112 -0
- package/dist/parse/lexer.d.ts +85 -0
- package/dist/parse/lexer.js +676 -0
- package/dist/parse/line-counter.d.ts +22 -0
- package/dist/parse/line-counter.js +41 -0
- package/dist/parse/parser.d.ts +84 -0
- package/dist/parse/parser.js +880 -0
- package/dist/public-api.d.ts +43 -0
- package/dist/public-api.js +106 -0
- package/dist/schema/Schema.d.ts +16 -0
- package/dist/schema/Schema.js +25 -0
- package/dist/schema/common/map.d.ts +2 -0
- package/dist/schema/common/map.js +44 -0
- package/dist/schema/common/null.d.ts +4 -0
- package/dist/schema/common/null.js +15 -0
- package/dist/schema/common/seq.d.ts +2 -0
- package/dist/schema/common/seq.js +35 -0
- package/dist/schema/common/string.d.ts +2 -0
- package/dist/schema/common/string.js +16 -0
- package/dist/schema/core/bool.d.ts +4 -0
- package/dist/schema/core/bool.js +21 -0
- package/dist/schema/core/float.d.ts +4 -0
- package/dist/schema/core/float.js +44 -0
- package/dist/schema/core/int.d.ts +4 -0
- package/dist/schema/core/int.js +42 -0
- package/dist/schema/core/schema.d.ts +1 -0
- package/dist/schema/core/schema.js +25 -0
- package/dist/schema/json/schema.d.ts +2 -0
- package/dist/schema/json/schema.js +64 -0
- package/dist/schema/tags.d.ts +41 -0
- package/dist/schema/tags.js +82 -0
- package/dist/schema/types.d.ts +82 -0
- package/dist/schema/yaml-1.1/binary.d.ts +2 -0
- package/dist/schema/yaml-1.1/binary.js +68 -0
- package/dist/schema/yaml-1.1/bool.d.ts +7 -0
- package/dist/schema/yaml-1.1/bool.js +29 -0
- package/dist/schema/yaml-1.1/float.d.ts +4 -0
- package/dist/schema/yaml-1.1/float.js +47 -0
- package/dist/schema/yaml-1.1/int.d.ts +5 -0
- package/dist/schema/yaml-1.1/int.js +76 -0
- package/dist/schema/yaml-1.1/omap.d.ts +21 -0
- package/dist/schema/yaml-1.1/omap.js +76 -0
- package/dist/schema/yaml-1.1/pairs.d.ts +10 -0
- package/dist/schema/yaml-1.1/pairs.js +81 -0
- package/dist/schema/yaml-1.1/schema.d.ts +1 -0
- package/dist/schema/yaml-1.1/schema.js +39 -0
- package/dist/schema/yaml-1.1/set.d.ts +22 -0
- package/dist/schema/yaml-1.1/set.js +90 -0
- package/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
- package/dist/schema/yaml-1.1/timestamp.js +105 -0
- package/dist/stringify/foldFlowLines.d.ts +34 -0
- package/dist/stringify/foldFlowLines.js +121 -139
- package/dist/stringify/stringify.d.ts +18 -0
- package/dist/stringify/stringify.js +87 -71
- package/dist/stringify/stringifyCollection.d.ts +21 -0
- package/dist/stringify/stringifyCollection.js +124 -0
- package/dist/stringify/stringifyComment.d.ts +2 -0
- package/dist/stringify/stringifyComment.js +17 -0
- package/dist/stringify/stringifyDocument.d.ts +3 -0
- package/dist/stringify/stringifyDocument.js +66 -0
- package/dist/stringify/stringifyNumber.d.ts +2 -0
- package/dist/stringify/stringifyNumber.js +20 -23
- package/dist/stringify/stringifyPair.d.ts +3 -0
- package/dist/stringify/stringifyPair.js +113 -0
- package/dist/stringify/stringifyString.d.ts +3 -0
- package/dist/stringify/stringifyString.js +295 -322
- package/dist/test-events.d.ts +4 -0
- package/dist/test-events.js +124 -148
- package/dist/util.d.ts +6 -0
- package/dist/util.js +9 -12
- package/dist/visit.d.ts +63 -0
- package/dist/visit.js +134 -71
- package/package.json +31 -39
- package/util.js +2 -14
- package/browser/dist/_virtual/_rollupPluginBabelHelpers.js +0 -16
- package/browser/dist/ast/Alias.js +0 -95
- package/browser/dist/ast/Collection.js +0 -192
- package/browser/dist/ast/Merge.js +0 -71
- package/browser/dist/ast/Node.js +0 -3
- package/browser/dist/ast/Pair.js +0 -200
- package/browser/dist/ast/Scalar.js +0 -21
- package/browser/dist/ast/YAMLMap.js +0 -91
- package/browser/dist/ast/YAMLSeq.js +0 -67
- package/browser/dist/ast/toJS.js +0 -29
- package/browser/dist/constants.js +0 -40
- package/browser/dist/cst/Alias.js +0 -26
- package/browser/dist/cst/BlankLine.js +0 -34
- package/browser/dist/cst/BlockValue.js +0 -240
- package/browser/dist/cst/Collection.js +0 -259
- package/browser/dist/cst/CollectionItem.js +0 -123
- package/browser/dist/cst/Comment.js +0 -27
- package/browser/dist/cst/Directive.js +0 -53
- package/browser/dist/cst/Document.js +0 -262
- package/browser/dist/cst/FlowCollection.js +0 -201
- package/browser/dist/cst/Node.js +0 -355
- package/browser/dist/cst/ParseContext.js +0 -234
- package/browser/dist/cst/PlainValue.js +0 -171
- package/browser/dist/cst/QuoteDouble.js +0 -224
- package/browser/dist/cst/QuoteSingle.js +0 -100
- package/browser/dist/cst/Range.js +0 -56
- package/browser/dist/cst/parse.js +0 -46
- package/browser/dist/cst/source-utils.js +0 -169
- package/browser/dist/doc/Anchors.js +0 -115
- package/browser/dist/doc/Schema.js +0 -34
- package/browser/dist/doc/getSchemaTags.js +0 -33
- package/browser/dist/doc/listTagNames.js +0 -27
- package/browser/dist/doc/parseContents.js +0 -60
- package/browser/dist/doc/parseDirectives.js +0 -107
- package/browser/dist/resolve/collection-utils.js +0 -86
- package/browser/dist/resolve/resolveMap.js +0 -315
- package/browser/dist/resolve/resolveNode.js +0 -173
- package/browser/dist/resolve/resolveScalar.js +0 -20
- package/browser/dist/resolve/resolveSeq.js +0 -170
- package/browser/dist/resolve/resolveTag.js +0 -107
- package/browser/dist/resolve/resolveTagName.js +0 -87
- package/browser/dist/stringify/addComment.js +0 -10
- package/browser/dist/stringify/stringifyTag.js +0 -28
- package/browser/dist/tags/core.js +0 -128
- package/browser/dist/tags/failsafe/index.js +0 -7
- package/browser/dist/tags/failsafe/map.js +0 -37
- package/browser/dist/tags/failsafe/seq.js +0 -34
- package/browser/dist/tags/failsafe/string.js +0 -20
- package/browser/dist/tags/index.js +0 -39
- package/browser/dist/tags/json.js +0 -62
- package/browser/dist/tags/options.js +0 -31
- package/browser/dist/tags/yaml-1.1/binary.js +0 -83
- package/browser/dist/tags/yaml-1.1/index.js +0 -174
- package/browser/dist/tags/yaml-1.1/omap.js +0 -86
- package/browser/dist/tags/yaml-1.1/pairs.js +0 -62
- package/browser/dist/tags/yaml-1.1/set.js +0 -78
- package/browser/dist/tags/yaml-1.1/timestamp.js +0 -101
- package/browser/dist/types.js +0 -10
- package/cst.d.ts +0 -185
- package/dist/_virtual/_rollupPluginBabelHelpers.js +0 -18
- package/dist/ast/Alias.js +0 -97
- package/dist/ast/Collection.js +0 -196
- package/dist/ast/Merge.js +0 -74
- package/dist/ast/Node.js +0 -5
- package/dist/ast/Pair.js +0 -203
- package/dist/ast/Scalar.js +0 -24
- package/dist/ast/YAMLMap.js +0 -94
- package/dist/ast/YAMLSeq.js +0 -69
- package/dist/ast/toJS.js +0 -31
- package/dist/constants.js +0 -46
- package/dist/cst/Alias.js +0 -28
- package/dist/cst/BlankLine.js +0 -36
- package/dist/cst/BlockValue.js +0 -243
- package/dist/cst/Collection.js +0 -262
- package/dist/cst/CollectionItem.js +0 -125
- package/dist/cst/Comment.js +0 -29
- package/dist/cst/Directive.js +0 -55
- package/dist/cst/Document.js +0 -264
- package/dist/cst/FlowCollection.js +0 -203
- package/dist/cst/Node.js +0 -357
- package/dist/cst/ParseContext.js +0 -236
- package/dist/cst/PlainValue.js +0 -173
- package/dist/cst/QuoteDouble.js +0 -226
- package/dist/cst/QuoteSingle.js +0 -102
- package/dist/cst/Range.js +0 -58
- package/dist/cst/parse.js +0 -48
- package/dist/cst/source-utils.js +0 -173
- package/dist/doc/Anchors.js +0 -117
- package/dist/doc/Schema.js +0 -36
- package/dist/doc/getSchemaTags.js +0 -35
- package/dist/doc/listTagNames.js +0 -29
- package/dist/doc/parseContents.js +0 -62
- package/dist/doc/parseDirectives.js +0 -109
- package/dist/resolve/collection-utils.js +0 -91
- package/dist/resolve/resolveMap.js +0 -317
- package/dist/resolve/resolveNode.js +0 -175
- package/dist/resolve/resolveScalar.js +0 -22
- package/dist/resolve/resolveSeq.js +0 -172
- package/dist/resolve/resolveTag.js +0 -109
- package/dist/resolve/resolveTagName.js +0 -89
- package/dist/stringify/addComment.js +0 -13
- package/dist/stringify/stringifyTag.js +0 -30
- package/dist/tags/core.js +0 -138
- package/dist/tags/failsafe/index.js +0 -9
- package/dist/tags/failsafe/map.js +0 -39
- package/dist/tags/failsafe/seq.js +0 -36
- package/dist/tags/failsafe/string.js +0 -22
- package/dist/tags/index.js +0 -42
- package/dist/tags/json.js +0 -64
- package/dist/tags/options.js +0 -37
- package/dist/tags/yaml-1.1/binary.js +0 -85
- package/dist/tags/yaml-1.1/index.js +0 -176
- package/dist/tags/yaml-1.1/omap.js +0 -89
- package/dist/tags/yaml-1.1/pairs.js +0 -66
- package/dist/tags/yaml-1.1/set.js +0 -81
- package/dist/tags/yaml-1.1/timestamp.js +0 -105
- package/dist/types.js +0 -29
- package/index.d.ts +0 -519
- package/index.js +0 -1
- package/types.d.ts +0 -379
- package/types.js +0 -17
- package/types.mjs +0 -17
- package/util.d.ts +0 -76
- package/util.mjs +0 -15
package/LICENSE
CHANGED
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
|
|
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
|
|
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 [
|
|
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
|
-
- [`
|
|
33
|
-
- [`
|
|
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
|
-
###
|
|
45
|
+
### Documents
|
|
36
46
|
|
|
37
|
-
- [`
|
|
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
|
-
- [`
|
|
46
|
-
- [`
|
|
47
|
-
- [`
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
- [`
|
|
54
|
-
- [`
|
|
55
|
-
- [`
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
- [`
|
|
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,79 @@
|
|
|
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 (anchor && node.anchor === '')
|
|
37
|
+
onError(anchor, 'BAD_ALIAS', 'Anchor cannot be an empty string');
|
|
38
|
+
if (spaceBefore)
|
|
39
|
+
node.spaceBefore = true;
|
|
40
|
+
if (comment) {
|
|
41
|
+
if (token.type === 'scalar' && token.source === '')
|
|
42
|
+
node.comment = comment;
|
|
43
|
+
else
|
|
44
|
+
node.commentBefore = comment;
|
|
45
|
+
}
|
|
46
|
+
return node;
|
|
47
|
+
}
|
|
48
|
+
function composeEmptyNode(ctx, offset, before, pos, { spaceBefore, comment, anchor, tag }, onError) {
|
|
49
|
+
const token = {
|
|
50
|
+
type: 'scalar',
|
|
51
|
+
offset: emptyScalarPosition(offset, before, pos),
|
|
52
|
+
indent: -1,
|
|
53
|
+
source: ''
|
|
54
|
+
};
|
|
55
|
+
const node = composeScalar(ctx, token, tag, onError);
|
|
56
|
+
if (anchor) {
|
|
57
|
+
node.anchor = anchor.source.substring(1);
|
|
58
|
+
if (node.anchor === '')
|
|
59
|
+
onError(anchor, 'BAD_ALIAS', 'Anchor cannot be an empty string');
|
|
60
|
+
}
|
|
61
|
+
if (spaceBefore)
|
|
62
|
+
node.spaceBefore = true;
|
|
63
|
+
if (comment)
|
|
64
|
+
node.comment = comment;
|
|
65
|
+
return node;
|
|
66
|
+
}
|
|
67
|
+
function composeAlias({ options }, { offset, source, end }, onError) {
|
|
68
|
+
const alias = new Alias(source.substring(1));
|
|
69
|
+
if (alias.source === '')
|
|
70
|
+
onError(offset, 'BAD_ALIAS', 'Alias cannot be an empty string');
|
|
71
|
+
const valueEnd = offset + source.length;
|
|
72
|
+
const re = resolveEnd(end, valueEnd, options.strict, onError);
|
|
73
|
+
alias.range = [offset, valueEnd, re.offset];
|
|
74
|
+
if (re.comment)
|
|
75
|
+
alias.comment = re.comment;
|
|
76
|
+
return alias;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
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,219 @@
|
|
|
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
|
+
var _a;
|
|
19
|
+
let comment = '';
|
|
20
|
+
let atComment = false;
|
|
21
|
+
let afterEmptyLine = false;
|
|
22
|
+
for (let i = 0; i < prelude.length; ++i) {
|
|
23
|
+
const source = prelude[i];
|
|
24
|
+
switch (source[0]) {
|
|
25
|
+
case '#':
|
|
26
|
+
comment +=
|
|
27
|
+
(comment === '' ? '' : afterEmptyLine ? '\n\n' : '\n') +
|
|
28
|
+
(source.substring(1) || ' ');
|
|
29
|
+
atComment = true;
|
|
30
|
+
afterEmptyLine = false;
|
|
31
|
+
break;
|
|
32
|
+
case '%':
|
|
33
|
+
if (((_a = prelude[i + 1]) === null || _a === void 0 ? void 0 : _a[0]) !== '#')
|
|
34
|
+
i += 1;
|
|
35
|
+
atComment = false;
|
|
36
|
+
break;
|
|
37
|
+
default:
|
|
38
|
+
// This may be wrong after doc-end, but in that case it doesn't matter
|
|
39
|
+
if (!atComment)
|
|
40
|
+
afterEmptyLine = true;
|
|
41
|
+
atComment = false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return { comment, afterEmptyLine };
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Compose a stream of CST nodes into a stream of YAML Documents.
|
|
48
|
+
*
|
|
49
|
+
* ```ts
|
|
50
|
+
* import { Composer, Parser } from 'yaml'
|
|
51
|
+
*
|
|
52
|
+
* const src: string = ...
|
|
53
|
+
* const tokens = new Parser().parse(src)
|
|
54
|
+
* const docs = new Composer().compose(tokens)
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
class Composer {
|
|
58
|
+
constructor(options = {}) {
|
|
59
|
+
this.doc = null;
|
|
60
|
+
this.atDirectives = false;
|
|
61
|
+
this.prelude = [];
|
|
62
|
+
this.errors = [];
|
|
63
|
+
this.warnings = [];
|
|
64
|
+
this.onError = (source, code, message, warning) => {
|
|
65
|
+
const pos = getErrorPos(source);
|
|
66
|
+
if (warning)
|
|
67
|
+
this.warnings.push(new YAMLWarning(pos, code, message));
|
|
68
|
+
else
|
|
69
|
+
this.errors.push(new YAMLParseError(pos, code, message));
|
|
70
|
+
};
|
|
71
|
+
this.directives = new Directives({
|
|
72
|
+
version: options.version || defaultOptions.version
|
|
73
|
+
});
|
|
74
|
+
this.options = options;
|
|
75
|
+
}
|
|
76
|
+
decorate(doc, afterDoc) {
|
|
77
|
+
const { comment, afterEmptyLine } = parsePrelude(this.prelude);
|
|
78
|
+
//console.log({ dc: doc.comment, prelude, comment })
|
|
79
|
+
if (comment) {
|
|
80
|
+
const dc = doc.contents;
|
|
81
|
+
if (afterDoc) {
|
|
82
|
+
doc.comment = doc.comment ? `${doc.comment}\n${comment}` : comment;
|
|
83
|
+
}
|
|
84
|
+
else if (afterEmptyLine || doc.directives.marker || !dc) {
|
|
85
|
+
doc.commentBefore = comment;
|
|
86
|
+
}
|
|
87
|
+
else if (isCollection(dc) && !dc.flow && dc.items.length > 0) {
|
|
88
|
+
let it = dc.items[0];
|
|
89
|
+
if (isPair(it))
|
|
90
|
+
it = it.key;
|
|
91
|
+
const cb = it.commentBefore;
|
|
92
|
+
it.commentBefore = cb ? `${comment}\n${cb}` : comment;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
const cb = dc.commentBefore;
|
|
96
|
+
dc.commentBefore = cb ? `${comment}\n${cb}` : comment;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (afterDoc) {
|
|
100
|
+
Array.prototype.push.apply(doc.errors, this.errors);
|
|
101
|
+
Array.prototype.push.apply(doc.warnings, this.warnings);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
doc.errors = this.errors;
|
|
105
|
+
doc.warnings = this.warnings;
|
|
106
|
+
}
|
|
107
|
+
this.prelude = [];
|
|
108
|
+
this.errors = [];
|
|
109
|
+
this.warnings = [];
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Current stream status information.
|
|
113
|
+
*
|
|
114
|
+
* Mostly useful at the end of input for an empty stream.
|
|
115
|
+
*/
|
|
116
|
+
streamInfo() {
|
|
117
|
+
return {
|
|
118
|
+
comment: parsePrelude(this.prelude).comment,
|
|
119
|
+
directives: this.directives,
|
|
120
|
+
errors: this.errors,
|
|
121
|
+
warnings: this.warnings
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Compose tokens into documents.
|
|
126
|
+
*
|
|
127
|
+
* @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.
|
|
128
|
+
* @param endOffset - Should be set if `forceDoc` is also set, to set the document range end and to indicate errors correctly.
|
|
129
|
+
*/
|
|
130
|
+
*compose(tokens, forceDoc = false, endOffset = -1) {
|
|
131
|
+
for (const token of tokens)
|
|
132
|
+
yield* this.next(token);
|
|
133
|
+
yield* this.end(forceDoc, endOffset);
|
|
134
|
+
}
|
|
135
|
+
/** Advance the composer by one CST token. */
|
|
136
|
+
*next(token) {
|
|
137
|
+
switch (token.type) {
|
|
138
|
+
case 'directive':
|
|
139
|
+
this.directives.add(token.source, (offset, message, warning) => {
|
|
140
|
+
const pos = getErrorPos(token);
|
|
141
|
+
pos[0] += offset;
|
|
142
|
+
this.onError(pos, 'BAD_DIRECTIVE', message, warning);
|
|
143
|
+
});
|
|
144
|
+
this.prelude.push(token.source);
|
|
145
|
+
this.atDirectives = true;
|
|
146
|
+
break;
|
|
147
|
+
case 'document': {
|
|
148
|
+
const doc = composeDoc(this.options, this.directives, token, this.onError);
|
|
149
|
+
if (this.atDirectives && !doc.directives.marker)
|
|
150
|
+
this.onError(token, 'MISSING_CHAR', 'Missing directives-end indicator line');
|
|
151
|
+
this.decorate(doc, false);
|
|
152
|
+
if (this.doc)
|
|
153
|
+
yield this.doc;
|
|
154
|
+
this.doc = doc;
|
|
155
|
+
this.atDirectives = false;
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
case 'byte-order-mark':
|
|
159
|
+
case 'space':
|
|
160
|
+
break;
|
|
161
|
+
case 'comment':
|
|
162
|
+
case 'newline':
|
|
163
|
+
this.prelude.push(token.source);
|
|
164
|
+
break;
|
|
165
|
+
case 'error': {
|
|
166
|
+
const msg = token.source
|
|
167
|
+
? `${token.message}: ${JSON.stringify(token.source)}`
|
|
168
|
+
: token.message;
|
|
169
|
+
const error = new YAMLParseError(getErrorPos(token), 'UNEXPECTED_TOKEN', msg);
|
|
170
|
+
if (this.atDirectives || !this.doc)
|
|
171
|
+
this.errors.push(error);
|
|
172
|
+
else
|
|
173
|
+
this.doc.errors.push(error);
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
case 'doc-end': {
|
|
177
|
+
if (!this.doc) {
|
|
178
|
+
const msg = 'Unexpected doc-end without preceding document';
|
|
179
|
+
this.errors.push(new YAMLParseError(getErrorPos(token), 'UNEXPECTED_TOKEN', msg));
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
const end = resolveEnd(token.end, token.offset + token.source.length, this.doc.options.strict, this.onError);
|
|
183
|
+
this.decorate(this.doc, true);
|
|
184
|
+
if (end.comment) {
|
|
185
|
+
const dc = this.doc.comment;
|
|
186
|
+
this.doc.comment = dc ? `${dc}\n${end.comment}` : end.comment;
|
|
187
|
+
}
|
|
188
|
+
this.doc.range[2] = end.offset;
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
default:
|
|
192
|
+
this.errors.push(new YAMLParseError(getErrorPos(token), 'UNEXPECTED_TOKEN', `Unsupported token ${token.type}`));
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Call at end of input to yield any remaining document.
|
|
197
|
+
*
|
|
198
|
+
* @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.
|
|
199
|
+
* @param endOffset - Should be set if `forceDoc` is also set, to set the document range end and to indicate errors correctly.
|
|
200
|
+
*/
|
|
201
|
+
*end(forceDoc = false, endOffset = -1) {
|
|
202
|
+
if (this.doc) {
|
|
203
|
+
this.decorate(this.doc, true);
|
|
204
|
+
yield this.doc;
|
|
205
|
+
this.doc = null;
|
|
206
|
+
}
|
|
207
|
+
else if (forceDoc) {
|
|
208
|
+
const opts = Object.assign({ directives: this.directives }, this.options);
|
|
209
|
+
const doc = new Document(undefined, opts);
|
|
210
|
+
if (this.atDirectives)
|
|
211
|
+
this.onError(endOffset, 'MISSING_CHAR', 'Missing directives-end indicator line');
|
|
212
|
+
doc.range = [0, endOffset, endOffset];
|
|
213
|
+
this.decorate(doc, false);
|
|
214
|
+
yield doc;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
export { Composer };
|