phantom-pr 0.2.2 → 0.2.5
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/bin/phantom-pr.cjs +20 -0
- package/dist/cli.js +7 -0
- package/dist/cli.js.map +1 -1
- package/node_modules/ignore/LICENSE-MIT +21 -0
- package/node_modules/ignore/README.md +452 -0
- package/node_modules/ignore/index.d.ts +81 -0
- package/node_modules/ignore/index.js +784 -0
- package/node_modules/ignore/legacy.js +681 -0
- package/node_modules/ignore/package.json +87 -0
- package/node_modules/yaml/LICENSE +13 -0
- package/node_modules/yaml/README.md +172 -0
- package/node_modules/yaml/bin.mjs +11 -0
- package/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
- package/node_modules/yaml/browser/dist/compose/compose-doc.js +43 -0
- package/node_modules/yaml/browser/dist/compose/compose-node.js +102 -0
- package/node_modules/yaml/browser/dist/compose/compose-scalar.js +86 -0
- package/node_modules/yaml/browser/dist/compose/composer.js +217 -0
- package/node_modules/yaml/browser/dist/compose/resolve-block-map.js +115 -0
- package/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
- package/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +49 -0
- package/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
- package/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +207 -0
- package/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +223 -0
- package/node_modules/yaml/browser/dist/compose/resolve-props.js +146 -0
- package/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
- package/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +26 -0
- package/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
- package/node_modules/yaml/browser/dist/compose/util-map-includes.js +13 -0
- package/node_modules/yaml/browser/dist/doc/Document.js +335 -0
- package/node_modules/yaml/browser/dist/doc/anchors.js +71 -0
- package/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
- package/node_modules/yaml/browser/dist/doc/createNode.js +88 -0
- package/node_modules/yaml/browser/dist/doc/directives.js +176 -0
- package/node_modules/yaml/browser/dist/errors.js +57 -0
- package/node_modules/yaml/browser/dist/index.js +17 -0
- package/node_modules/yaml/browser/dist/log.js +11 -0
- package/node_modules/yaml/browser/dist/nodes/Alias.js +114 -0
- package/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
- package/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
- package/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
- package/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
- package/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
- package/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
- package/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +63 -0
- package/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
- package/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
- package/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
- package/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
- package/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
- package/node_modules/yaml/browser/dist/parse/cst.js +98 -0
- package/node_modules/yaml/browser/dist/parse/lexer.js +717 -0
- package/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
- package/node_modules/yaml/browser/dist/parse/parser.js +967 -0
- package/node_modules/yaml/browser/dist/public-api.js +102 -0
- package/node_modules/yaml/browser/dist/schema/Schema.js +37 -0
- package/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
- package/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
- package/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
- package/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
- package/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
- package/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
- package/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
- package/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
- package/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
- package/node_modules/yaml/browser/dist/schema/tags.js +96 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +58 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +64 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +39 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
- package/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
- package/node_modules/yaml/browser/dist/stringify/stringify.js +128 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +143 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +24 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyString.js +336 -0
- package/node_modules/yaml/browser/dist/util.js +11 -0
- package/node_modules/yaml/browser/dist/visit.js +233 -0
- package/node_modules/yaml/browser/index.js +5 -0
- package/node_modules/yaml/browser/package.json +3 -0
- package/node_modules/yaml/dist/cli.d.ts +8 -0
- package/node_modules/yaml/dist/cli.mjs +201 -0
- package/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
- package/node_modules/yaml/dist/compose/compose-collection.js +90 -0
- package/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
- package/node_modules/yaml/dist/compose/compose-doc.js +45 -0
- package/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
- package/node_modules/yaml/dist/compose/compose-node.js +105 -0
- package/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
- package/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
- package/node_modules/yaml/dist/compose/composer.d.ts +63 -0
- package/node_modules/yaml/dist/compose/composer.js +222 -0
- package/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
- package/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
- package/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
- package/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
- package/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
- package/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
- package/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
- package/node_modules/yaml/dist/compose/resolve-end.js +39 -0
- package/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
- package/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
- package/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
- package/node_modules/yaml/dist/compose/resolve-flow-scalar.js +225 -0
- package/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
- package/node_modules/yaml/dist/compose/resolve-props.js +148 -0
- package/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
- package/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
- package/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
- package/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
- package/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
- package/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
- package/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
- package/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
- package/node_modules/yaml/dist/doc/Document.d.ts +141 -0
- package/node_modules/yaml/dist/doc/Document.js +337 -0
- package/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
- package/node_modules/yaml/dist/doc/anchors.js +76 -0
- package/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
- package/node_modules/yaml/dist/doc/applyReviver.js +57 -0
- package/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
- package/node_modules/yaml/dist/doc/createNode.js +90 -0
- package/node_modules/yaml/dist/doc/directives.d.ts +49 -0
- package/node_modules/yaml/dist/doc/directives.js +178 -0
- package/node_modules/yaml/dist/errors.d.ts +21 -0
- package/node_modules/yaml/dist/errors.js +62 -0
- package/node_modules/yaml/dist/index.d.ts +25 -0
- package/node_modules/yaml/dist/index.js +50 -0
- package/node_modules/yaml/dist/log.d.ts +3 -0
- package/node_modules/yaml/dist/log.js +19 -0
- package/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
- package/node_modules/yaml/dist/nodes/Alias.js +116 -0
- package/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
- package/node_modules/yaml/dist/nodes/Collection.js +151 -0
- package/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
- package/node_modules/yaml/dist/nodes/Node.js +40 -0
- package/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
- package/node_modules/yaml/dist/nodes/Pair.js +39 -0
- package/node_modules/yaml/dist/nodes/Scalar.d.ts +43 -0
- package/node_modules/yaml/dist/nodes/Scalar.js +27 -0
- package/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
- package/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
- package/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
- package/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
- package/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
- package/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
- package/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
- package/node_modules/yaml/dist/nodes/identity.js +53 -0
- package/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
- package/node_modules/yaml/dist/nodes/toJS.js +39 -0
- package/node_modules/yaml/dist/options.d.ts +344 -0
- package/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
- package/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
- package/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
- package/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
- package/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
- package/node_modules/yaml/dist/parse/cst-visit.js +99 -0
- package/node_modules/yaml/dist/parse/cst.d.ts +109 -0
- package/node_modules/yaml/dist/parse/cst.js +112 -0
- package/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
- package/node_modules/yaml/dist/parse/lexer.js +719 -0
- package/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
- package/node_modules/yaml/dist/parse/line-counter.js +41 -0
- package/node_modules/yaml/dist/parse/parser.d.ts +84 -0
- package/node_modules/yaml/dist/parse/parser.js +972 -0
- package/node_modules/yaml/dist/public-api.d.ts +44 -0
- package/node_modules/yaml/dist/public-api.js +107 -0
- package/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
- package/node_modules/yaml/dist/schema/Schema.js +39 -0
- package/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
- package/node_modules/yaml/dist/schema/common/map.js +19 -0
- package/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
- package/node_modules/yaml/dist/schema/common/null.js +17 -0
- package/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
- package/node_modules/yaml/dist/schema/common/seq.js +19 -0
- package/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
- package/node_modules/yaml/dist/schema/common/string.js +16 -0
- package/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
- package/node_modules/yaml/dist/schema/core/bool.js +21 -0
- package/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
- package/node_modules/yaml/dist/schema/core/float.js +47 -0
- package/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
- package/node_modules/yaml/dist/schema/core/int.js +42 -0
- package/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
- package/node_modules/yaml/dist/schema/core/schema.js +25 -0
- package/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
- package/node_modules/yaml/dist/schema/json/schema.js +64 -0
- package/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
- package/node_modules/yaml/dist/schema/tags.d.ts +48 -0
- package/node_modules/yaml/dist/schema/tags.js +99 -0
- package/node_modules/yaml/dist/schema/types.d.ts +92 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/merge.js +68 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
- package/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
- package/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
- package/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
- package/node_modules/yaml/dist/stringify/stringify.js +131 -0
- package/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
- package/node_modules/yaml/dist/stringify/stringifyCollection.js +145 -0
- package/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
- package/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
- package/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
- package/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
- package/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
- package/node_modules/yaml/dist/stringify/stringifyNumber.js +26 -0
- package/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
- package/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
- package/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
- package/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
- package/node_modules/yaml/dist/test-events.d.ts +4 -0
- package/node_modules/yaml/dist/test-events.js +134 -0
- package/node_modules/yaml/dist/util.d.ts +16 -0
- package/node_modules/yaml/dist/util.js +28 -0
- package/node_modules/yaml/dist/visit.d.ts +102 -0
- package/node_modules/yaml/dist/visit.js +236 -0
- package/node_modules/yaml/package.json +97 -0
- package/node_modules/yaml/util.js +2 -0
- package/package.json +7 -3
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { resolve } from 'path';
|
|
2
|
+
import { parseArgs } from 'util';
|
|
3
|
+
import { prettyToken } from './parse/cst.js';
|
|
4
|
+
import { Lexer } from './parse/lexer.js';
|
|
5
|
+
import { Parser } from './parse/parser.js';
|
|
6
|
+
import { Composer } from './compose/composer.js';
|
|
7
|
+
import { LineCounter } from './parse/line-counter.js';
|
|
8
|
+
import { prettifyError } from './errors.js';
|
|
9
|
+
import { visit } from './visit.js';
|
|
10
|
+
|
|
11
|
+
const help = `\
|
|
12
|
+
yaml: A command-line YAML processor and inspector
|
|
13
|
+
|
|
14
|
+
Reads stdin and writes output to stdout and errors & warnings to stderr.
|
|
15
|
+
|
|
16
|
+
Usage:
|
|
17
|
+
yaml Process a YAML stream, outputting it as YAML
|
|
18
|
+
yaml cst Parse the CST of a YAML stream
|
|
19
|
+
yaml lex Parse the lexical tokens of a YAML stream
|
|
20
|
+
yaml valid Validate a YAML stream, returning 0 on success
|
|
21
|
+
|
|
22
|
+
Options:
|
|
23
|
+
--help, -h Show this message.
|
|
24
|
+
--json, -j Output JSON.
|
|
25
|
+
--indent 2 Output pretty-printed data, indented by the given number of spaces.
|
|
26
|
+
--merge, -m Enable support for "<<" merge keys.
|
|
27
|
+
|
|
28
|
+
Additional options for bare "yaml" command:
|
|
29
|
+
--doc, -d Output pretty-printed JS Document objects.
|
|
30
|
+
--single, -1 Require the input to consist of a single YAML document.
|
|
31
|
+
--strict, -s Stop on errors.
|
|
32
|
+
--visit, -v Apply a visitor to each document (requires a path to import)
|
|
33
|
+
--yaml 1.1 Set the YAML version. (default: 1.2)`;
|
|
34
|
+
class UserError extends Error {
|
|
35
|
+
constructor(code, message) {
|
|
36
|
+
super(`Error: ${message}`);
|
|
37
|
+
this.code = code;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
UserError.ARGS = 2;
|
|
41
|
+
UserError.SINGLE = 3;
|
|
42
|
+
async function cli(stdin, done, argv) {
|
|
43
|
+
let args;
|
|
44
|
+
try {
|
|
45
|
+
args = parseArgs({
|
|
46
|
+
args: argv,
|
|
47
|
+
allowPositionals: true,
|
|
48
|
+
options: {
|
|
49
|
+
doc: { type: 'boolean', short: 'd' },
|
|
50
|
+
help: { type: 'boolean', short: 'h' },
|
|
51
|
+
indent: { type: 'string', short: 'i' },
|
|
52
|
+
merge: { type: 'boolean', short: 'm' },
|
|
53
|
+
json: { type: 'boolean', short: 'j' },
|
|
54
|
+
single: { type: 'boolean', short: '1' },
|
|
55
|
+
strict: { type: 'boolean', short: 's' },
|
|
56
|
+
visit: { type: 'string', short: 'v' },
|
|
57
|
+
yaml: { type: 'string', default: '1.2' }
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
return done(new UserError(UserError.ARGS, error.message));
|
|
63
|
+
}
|
|
64
|
+
const { positionals: [mode], values: opt } = args;
|
|
65
|
+
let indent = Number(opt.indent);
|
|
66
|
+
stdin.setEncoding('utf-8');
|
|
67
|
+
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
|
|
68
|
+
switch (opt.help || mode) {
|
|
69
|
+
/* istanbul ignore next */
|
|
70
|
+
case true: // --help
|
|
71
|
+
console.log(help);
|
|
72
|
+
break;
|
|
73
|
+
case 'lex': {
|
|
74
|
+
const lexer = new Lexer();
|
|
75
|
+
const data = [];
|
|
76
|
+
const add = (tok) => {
|
|
77
|
+
if (opt.json)
|
|
78
|
+
data.push(tok);
|
|
79
|
+
else
|
|
80
|
+
console.log(prettyToken(tok));
|
|
81
|
+
};
|
|
82
|
+
stdin.on('data', (chunk) => {
|
|
83
|
+
for (const tok of lexer.lex(chunk, true))
|
|
84
|
+
add(tok);
|
|
85
|
+
});
|
|
86
|
+
stdin.on('end', () => {
|
|
87
|
+
for (const tok of lexer.lex('', false))
|
|
88
|
+
add(tok);
|
|
89
|
+
if (opt.json)
|
|
90
|
+
console.log(JSON.stringify(data, null, indent));
|
|
91
|
+
done();
|
|
92
|
+
});
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
case 'cst': {
|
|
96
|
+
const parser = new Parser();
|
|
97
|
+
const data = [];
|
|
98
|
+
const add = (tok) => {
|
|
99
|
+
if (opt.json)
|
|
100
|
+
data.push(tok);
|
|
101
|
+
else
|
|
102
|
+
console.dir(tok, { depth: null });
|
|
103
|
+
};
|
|
104
|
+
stdin.on('data', (chunk) => {
|
|
105
|
+
for (const tok of parser.parse(chunk, true))
|
|
106
|
+
add(tok);
|
|
107
|
+
});
|
|
108
|
+
stdin.on('end', () => {
|
|
109
|
+
for (const tok of parser.parse('', false))
|
|
110
|
+
add(tok);
|
|
111
|
+
if (opt.json)
|
|
112
|
+
console.log(JSON.stringify(data, null, indent));
|
|
113
|
+
done();
|
|
114
|
+
});
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
case undefined:
|
|
118
|
+
case 'valid': {
|
|
119
|
+
const lineCounter = new LineCounter();
|
|
120
|
+
const parser = new Parser(lineCounter.addNewLine);
|
|
121
|
+
// @ts-expect-error Version is validated at runtime
|
|
122
|
+
const composer = new Composer({ version: opt.yaml, merge: opt.merge });
|
|
123
|
+
const visitor = opt.visit
|
|
124
|
+
? (await import(resolve(opt.visit))).default
|
|
125
|
+
: null;
|
|
126
|
+
let source = '';
|
|
127
|
+
let hasDoc = false;
|
|
128
|
+
let reqDocEnd = false;
|
|
129
|
+
const data = [];
|
|
130
|
+
const add = (doc) => {
|
|
131
|
+
if (hasDoc && opt.single) {
|
|
132
|
+
return done(new UserError(UserError.SINGLE, 'Input stream contains multiple documents'));
|
|
133
|
+
}
|
|
134
|
+
for (const error of doc.errors) {
|
|
135
|
+
prettifyError(source, lineCounter)(error);
|
|
136
|
+
if (opt.strict || mode === 'valid')
|
|
137
|
+
return done(error);
|
|
138
|
+
console.error(error);
|
|
139
|
+
}
|
|
140
|
+
for (const warning of doc.warnings) {
|
|
141
|
+
prettifyError(source, lineCounter)(warning);
|
|
142
|
+
console.error(warning);
|
|
143
|
+
}
|
|
144
|
+
if (visitor)
|
|
145
|
+
visit(doc, visitor);
|
|
146
|
+
if (mode === 'valid')
|
|
147
|
+
doc.toJS();
|
|
148
|
+
else if (opt.json)
|
|
149
|
+
data.push(doc);
|
|
150
|
+
else if (opt.doc) {
|
|
151
|
+
Object.defineProperties(doc, {
|
|
152
|
+
options: { enumerable: false },
|
|
153
|
+
schema: { enumerable: false }
|
|
154
|
+
});
|
|
155
|
+
console.dir(doc, { depth: null });
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
if (reqDocEnd)
|
|
159
|
+
console.log('...');
|
|
160
|
+
try {
|
|
161
|
+
indent || (indent = 2);
|
|
162
|
+
const str = doc.toString({ indent });
|
|
163
|
+
console.log(str.endsWith('\n') ? str.slice(0, -1) : str);
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
done(error);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
hasDoc = true;
|
|
170
|
+
reqDocEnd = !doc.directives?.docEnd;
|
|
171
|
+
};
|
|
172
|
+
stdin.on('data', (chunk) => {
|
|
173
|
+
source += chunk;
|
|
174
|
+
for (const tok of parser.parse(chunk, true)) {
|
|
175
|
+
for (const doc of composer.next(tok))
|
|
176
|
+
add(doc);
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
stdin.on('end', () => {
|
|
180
|
+
for (const tok of parser.parse('', false)) {
|
|
181
|
+
for (const doc of composer.next(tok))
|
|
182
|
+
add(doc);
|
|
183
|
+
}
|
|
184
|
+
for (const doc of composer.end(false))
|
|
185
|
+
add(doc);
|
|
186
|
+
if (opt.single && !hasDoc) {
|
|
187
|
+
return done(new UserError(UserError.SINGLE, 'Input stream contained no documents'));
|
|
188
|
+
}
|
|
189
|
+
if (mode !== 'valid' && opt.json) {
|
|
190
|
+
console.log(JSON.stringify(opt.single ? data[0] : data, null, indent));
|
|
191
|
+
}
|
|
192
|
+
done();
|
|
193
|
+
});
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
default:
|
|
197
|
+
done(new UserError(UserError.ARGS, `Unknown command: ${JSON.stringify(mode)}`));
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export { UserError, cli, help };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ParsedNode } from '../nodes/Node';
|
|
2
|
+
import type { BlockMap, BlockSequence, FlowCollection, SourceToken } from '../parse/cst';
|
|
3
|
+
import type { ComposeContext, ComposeNode } from './compose-node';
|
|
4
|
+
import type { ComposeErrorHandler } from './composer';
|
|
5
|
+
interface Props {
|
|
6
|
+
anchor: SourceToken | null;
|
|
7
|
+
tag: SourceToken | null;
|
|
8
|
+
newlineAfterProp: SourceToken | null;
|
|
9
|
+
}
|
|
10
|
+
export declare function composeCollection(CN: ComposeNode, ctx: ComposeContext, token: BlockMap | BlockSequence | FlowCollection, props: Props, onError: ComposeErrorHandler): ParsedNode;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var identity = require('../nodes/identity.js');
|
|
4
|
+
var Scalar = require('../nodes/Scalar.js');
|
|
5
|
+
var YAMLMap = require('../nodes/YAMLMap.js');
|
|
6
|
+
var YAMLSeq = require('../nodes/YAMLSeq.js');
|
|
7
|
+
var resolveBlockMap = require('./resolve-block-map.js');
|
|
8
|
+
var resolveBlockSeq = require('./resolve-block-seq.js');
|
|
9
|
+
var resolveFlowCollection = require('./resolve-flow-collection.js');
|
|
10
|
+
|
|
11
|
+
function resolveCollection(CN, ctx, token, onError, tagName, tag) {
|
|
12
|
+
const coll = token.type === 'block-map'
|
|
13
|
+
? resolveBlockMap.resolveBlockMap(CN, ctx, token, onError, tag)
|
|
14
|
+
: token.type === 'block-seq'
|
|
15
|
+
? resolveBlockSeq.resolveBlockSeq(CN, ctx, token, onError, tag)
|
|
16
|
+
: resolveFlowCollection.resolveFlowCollection(CN, ctx, token, onError, tag);
|
|
17
|
+
const Coll = coll.constructor;
|
|
18
|
+
// If we got a tagName matching the class, or the tag name is '!',
|
|
19
|
+
// then use the tagName from the node class used to create it.
|
|
20
|
+
if (tagName === '!' || tagName === Coll.tagName) {
|
|
21
|
+
coll.tag = Coll.tagName;
|
|
22
|
+
return coll;
|
|
23
|
+
}
|
|
24
|
+
if (tagName)
|
|
25
|
+
coll.tag = tagName;
|
|
26
|
+
return coll;
|
|
27
|
+
}
|
|
28
|
+
function composeCollection(CN, ctx, token, props, onError) {
|
|
29
|
+
const tagToken = props.tag;
|
|
30
|
+
const tagName = !tagToken
|
|
31
|
+
? null
|
|
32
|
+
: ctx.directives.tagName(tagToken.source, msg => onError(tagToken, 'TAG_RESOLVE_FAILED', msg));
|
|
33
|
+
if (token.type === 'block-seq') {
|
|
34
|
+
const { anchor, newlineAfterProp: nl } = props;
|
|
35
|
+
const lastProp = anchor && tagToken
|
|
36
|
+
? anchor.offset > tagToken.offset
|
|
37
|
+
? anchor
|
|
38
|
+
: tagToken
|
|
39
|
+
: (anchor ?? tagToken);
|
|
40
|
+
if (lastProp && (!nl || nl.offset < lastProp.offset)) {
|
|
41
|
+
const message = 'Missing newline after block sequence props';
|
|
42
|
+
onError(lastProp, 'MISSING_CHAR', message);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const expType = token.type === 'block-map'
|
|
46
|
+
? 'map'
|
|
47
|
+
: token.type === 'block-seq'
|
|
48
|
+
? 'seq'
|
|
49
|
+
: token.start.source === '{'
|
|
50
|
+
? 'map'
|
|
51
|
+
: 'seq';
|
|
52
|
+
// shortcut: check if it's a generic YAMLMap or YAMLSeq
|
|
53
|
+
// before jumping into the custom tag logic.
|
|
54
|
+
if (!tagToken ||
|
|
55
|
+
!tagName ||
|
|
56
|
+
tagName === '!' ||
|
|
57
|
+
(tagName === YAMLMap.YAMLMap.tagName && expType === 'map') ||
|
|
58
|
+
(tagName === YAMLSeq.YAMLSeq.tagName && expType === 'seq')) {
|
|
59
|
+
return resolveCollection(CN, ctx, token, onError, tagName);
|
|
60
|
+
}
|
|
61
|
+
let tag = ctx.schema.tags.find(t => t.tag === tagName && t.collection === expType);
|
|
62
|
+
if (!tag) {
|
|
63
|
+
const kt = ctx.schema.knownTags[tagName];
|
|
64
|
+
if (kt?.collection === expType) {
|
|
65
|
+
ctx.schema.tags.push(Object.assign({}, kt, { default: false }));
|
|
66
|
+
tag = kt;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
if (kt) {
|
|
70
|
+
onError(tagToken, 'BAD_COLLECTION_TYPE', `${kt.tag} used for ${expType} collection, but expects ${kt.collection ?? 'scalar'}`, true);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
onError(tagToken, 'TAG_RESOLVE_FAILED', `Unresolved tag: ${tagName}`, true);
|
|
74
|
+
}
|
|
75
|
+
return resolveCollection(CN, ctx, token, onError, tagName);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const coll = resolveCollection(CN, ctx, token, onError, tagName, tag);
|
|
79
|
+
const res = tag.resolve?.(coll, msg => onError(tagToken, 'TAG_RESOLVE_FAILED', msg), ctx.options) ?? coll;
|
|
80
|
+
const node = identity.isNode(res)
|
|
81
|
+
? res
|
|
82
|
+
: new Scalar.Scalar(res);
|
|
83
|
+
node.range = coll.range;
|
|
84
|
+
node.tag = tagName;
|
|
85
|
+
if (tag?.format)
|
|
86
|
+
node.format = tag.format;
|
|
87
|
+
return node;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
exports.composeCollection = composeCollection;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Directives } from '../doc/directives';
|
|
2
|
+
import { Document } from '../doc/Document';
|
|
3
|
+
import type { ParsedNode } from '../nodes/Node';
|
|
4
|
+
import type { DocumentOptions, ParseOptions, SchemaOptions } from '../options';
|
|
5
|
+
import type * as CST from '../parse/cst';
|
|
6
|
+
import type { ComposeErrorHandler } from './composer';
|
|
7
|
+
export declare function composeDoc<Contents extends ParsedNode = ParsedNode, Strict extends boolean = true>(options: ParseOptions & DocumentOptions & SchemaOptions, directives: Directives, { offset, start, value, end }: CST.Document, onError: ComposeErrorHandler): Document.Parsed<Contents, Strict>;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var Document = require('../doc/Document.js');
|
|
4
|
+
var composeNode = require('./compose-node.js');
|
|
5
|
+
var resolveEnd = require('./resolve-end.js');
|
|
6
|
+
var resolveProps = require('./resolve-props.js');
|
|
7
|
+
|
|
8
|
+
function composeDoc(options, directives, { offset, start, value, end }, onError) {
|
|
9
|
+
const opts = Object.assign({ _directives: directives }, options);
|
|
10
|
+
const doc = new Document.Document(undefined, opts);
|
|
11
|
+
const ctx = {
|
|
12
|
+
atKey: false,
|
|
13
|
+
atRoot: true,
|
|
14
|
+
directives: doc.directives,
|
|
15
|
+
options: doc.options,
|
|
16
|
+
schema: doc.schema
|
|
17
|
+
};
|
|
18
|
+
const props = resolveProps.resolveProps(start, {
|
|
19
|
+
indicator: 'doc-start',
|
|
20
|
+
next: value ?? end?.[0],
|
|
21
|
+
offset,
|
|
22
|
+
onError,
|
|
23
|
+
parentIndent: 0,
|
|
24
|
+
startOnNewline: true
|
|
25
|
+
});
|
|
26
|
+
if (props.found) {
|
|
27
|
+
doc.directives.docStart = true;
|
|
28
|
+
if (value &&
|
|
29
|
+
(value.type === 'block-map' || value.type === 'block-seq') &&
|
|
30
|
+
!props.hasNewline)
|
|
31
|
+
onError(props.end, 'MISSING_CHAR', 'Block collection cannot start on same line with directives-end marker');
|
|
32
|
+
}
|
|
33
|
+
// @ts-expect-error If Contents is set, let's trust the user
|
|
34
|
+
doc.contents = value
|
|
35
|
+
? composeNode.composeNode(ctx, value, props, onError)
|
|
36
|
+
: composeNode.composeEmptyNode(ctx, props.end, start, null, props, onError);
|
|
37
|
+
const contentEnd = doc.contents.range[2];
|
|
38
|
+
const re = resolveEnd.resolveEnd(end, contentEnd, false, onError);
|
|
39
|
+
if (re.comment)
|
|
40
|
+
doc.comment = re.comment;
|
|
41
|
+
doc.range = [offset, contentEnd, re.offset];
|
|
42
|
+
return doc;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
exports.composeDoc = composeDoc;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Directives } from '../doc/directives';
|
|
2
|
+
import type { ParsedNode } from '../nodes/Node';
|
|
3
|
+
import type { ParseOptions } from '../options';
|
|
4
|
+
import type { SourceToken, Token } from '../parse/cst';
|
|
5
|
+
import type { Schema } from '../schema/Schema';
|
|
6
|
+
import type { ComposeErrorHandler } from './composer';
|
|
7
|
+
export interface ComposeContext {
|
|
8
|
+
atKey: boolean;
|
|
9
|
+
atRoot: boolean;
|
|
10
|
+
directives: Directives;
|
|
11
|
+
options: Readonly<Required<Omit<ParseOptions, 'lineCounter'>>>;
|
|
12
|
+
schema: Readonly<Schema>;
|
|
13
|
+
}
|
|
14
|
+
interface Props {
|
|
15
|
+
spaceBefore: boolean;
|
|
16
|
+
comment: string;
|
|
17
|
+
anchor: SourceToken | null;
|
|
18
|
+
tag: SourceToken | null;
|
|
19
|
+
newlineAfterProp: SourceToken | null;
|
|
20
|
+
end: number;
|
|
21
|
+
}
|
|
22
|
+
declare const CN: {
|
|
23
|
+
composeNode: typeof composeNode;
|
|
24
|
+
composeEmptyNode: typeof composeEmptyNode;
|
|
25
|
+
};
|
|
26
|
+
export type ComposeNode = typeof CN;
|
|
27
|
+
export declare function composeNode(ctx: ComposeContext, token: Token, props: Props, onError: ComposeErrorHandler): ParsedNode;
|
|
28
|
+
export declare function composeEmptyNode(ctx: ComposeContext, offset: number, before: Token[] | undefined, pos: number | null, { spaceBefore, comment, anchor, tag, end }: Props, onError: ComposeErrorHandler): import('../index').Scalar.Parsed;
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var Alias = require('../nodes/Alias.js');
|
|
4
|
+
var identity = require('../nodes/identity.js');
|
|
5
|
+
var composeCollection = require('./compose-collection.js');
|
|
6
|
+
var composeScalar = require('./compose-scalar.js');
|
|
7
|
+
var resolveEnd = require('./resolve-end.js');
|
|
8
|
+
var utilEmptyScalarPosition = require('./util-empty-scalar-position.js');
|
|
9
|
+
|
|
10
|
+
const CN = { composeNode, composeEmptyNode };
|
|
11
|
+
function composeNode(ctx, token, props, onError) {
|
|
12
|
+
const atKey = ctx.atKey;
|
|
13
|
+
const { spaceBefore, comment, anchor, tag } = props;
|
|
14
|
+
let node;
|
|
15
|
+
let isSrcToken = true;
|
|
16
|
+
switch (token.type) {
|
|
17
|
+
case 'alias':
|
|
18
|
+
node = composeAlias(ctx, token, onError);
|
|
19
|
+
if (anchor || tag)
|
|
20
|
+
onError(token, 'ALIAS_PROPS', 'An alias node must not specify any properties');
|
|
21
|
+
break;
|
|
22
|
+
case 'scalar':
|
|
23
|
+
case 'single-quoted-scalar':
|
|
24
|
+
case 'double-quoted-scalar':
|
|
25
|
+
case 'block-scalar':
|
|
26
|
+
node = composeScalar.composeScalar(ctx, token, tag, onError);
|
|
27
|
+
if (anchor)
|
|
28
|
+
node.anchor = anchor.source.substring(1);
|
|
29
|
+
break;
|
|
30
|
+
case 'block-map':
|
|
31
|
+
case 'block-seq':
|
|
32
|
+
case 'flow-collection':
|
|
33
|
+
node = composeCollection.composeCollection(CN, ctx, token, props, onError);
|
|
34
|
+
if (anchor)
|
|
35
|
+
node.anchor = anchor.source.substring(1);
|
|
36
|
+
break;
|
|
37
|
+
default: {
|
|
38
|
+
const message = token.type === 'error'
|
|
39
|
+
? token.message
|
|
40
|
+
: `Unsupported token (type: ${token.type})`;
|
|
41
|
+
onError(token, 'UNEXPECTED_TOKEN', message);
|
|
42
|
+
node = composeEmptyNode(ctx, token.offset, undefined, null, props, onError);
|
|
43
|
+
isSrcToken = false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (anchor && node.anchor === '')
|
|
47
|
+
onError(anchor, 'BAD_ALIAS', 'Anchor cannot be an empty string');
|
|
48
|
+
if (atKey &&
|
|
49
|
+
ctx.options.stringKeys &&
|
|
50
|
+
(!identity.isScalar(node) ||
|
|
51
|
+
typeof node.value !== 'string' ||
|
|
52
|
+
(node.tag && node.tag !== 'tag:yaml.org,2002:str'))) {
|
|
53
|
+
const msg = 'With stringKeys, all keys must be strings';
|
|
54
|
+
onError(tag ?? token, 'NON_STRING_KEY', msg);
|
|
55
|
+
}
|
|
56
|
+
if (spaceBefore)
|
|
57
|
+
node.spaceBefore = true;
|
|
58
|
+
if (comment) {
|
|
59
|
+
if (token.type === 'scalar' && token.source === '')
|
|
60
|
+
node.comment = comment;
|
|
61
|
+
else
|
|
62
|
+
node.commentBefore = comment;
|
|
63
|
+
}
|
|
64
|
+
// @ts-expect-error Type checking misses meaning of isSrcToken
|
|
65
|
+
if (ctx.options.keepSourceTokens && isSrcToken)
|
|
66
|
+
node.srcToken = token;
|
|
67
|
+
return node;
|
|
68
|
+
}
|
|
69
|
+
function composeEmptyNode(ctx, offset, before, pos, { spaceBefore, comment, anchor, tag, end }, onError) {
|
|
70
|
+
const token = {
|
|
71
|
+
type: 'scalar',
|
|
72
|
+
offset: utilEmptyScalarPosition.emptyScalarPosition(offset, before, pos),
|
|
73
|
+
indent: -1,
|
|
74
|
+
source: ''
|
|
75
|
+
};
|
|
76
|
+
const node = composeScalar.composeScalar(ctx, token, tag, onError);
|
|
77
|
+
if (anchor) {
|
|
78
|
+
node.anchor = anchor.source.substring(1);
|
|
79
|
+
if (node.anchor === '')
|
|
80
|
+
onError(anchor, 'BAD_ALIAS', 'Anchor cannot be an empty string');
|
|
81
|
+
}
|
|
82
|
+
if (spaceBefore)
|
|
83
|
+
node.spaceBefore = true;
|
|
84
|
+
if (comment) {
|
|
85
|
+
node.comment = comment;
|
|
86
|
+
node.range[2] = end;
|
|
87
|
+
}
|
|
88
|
+
return node;
|
|
89
|
+
}
|
|
90
|
+
function composeAlias({ options }, { offset, source, end }, onError) {
|
|
91
|
+
const alias = new Alias.Alias(source.substring(1));
|
|
92
|
+
if (alias.source === '')
|
|
93
|
+
onError(offset, 'BAD_ALIAS', 'Alias cannot be an empty string');
|
|
94
|
+
if (alias.source.endsWith(':'))
|
|
95
|
+
onError(offset + source.length - 1, 'BAD_ALIAS', 'Alias ending in : is ambiguous', true);
|
|
96
|
+
const valueEnd = offset + source.length;
|
|
97
|
+
const re = resolveEnd.resolveEnd(end, valueEnd, options.strict, onError);
|
|
98
|
+
alias.range = [offset, valueEnd, re.offset];
|
|
99
|
+
if (re.comment)
|
|
100
|
+
alias.comment = re.comment;
|
|
101
|
+
return alias;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
exports.composeEmptyNode = composeEmptyNode;
|
|
105
|
+
exports.composeNode = composeNode;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Scalar } from '../nodes/Scalar';
|
|
2
|
+
import type { BlockScalar, FlowScalar, SourceToken } from '../parse/cst';
|
|
3
|
+
import type { ComposeContext } from './compose-node';
|
|
4
|
+
import type { ComposeErrorHandler } from './composer';
|
|
5
|
+
export declare function composeScalar(ctx: ComposeContext, token: FlowScalar | BlockScalar, tagToken: SourceToken | null, onError: ComposeErrorHandler): Scalar.Parsed;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var identity = require('../nodes/identity.js');
|
|
4
|
+
var Scalar = require('../nodes/Scalar.js');
|
|
5
|
+
var resolveBlockScalar = require('./resolve-block-scalar.js');
|
|
6
|
+
var resolveFlowScalar = require('./resolve-flow-scalar.js');
|
|
7
|
+
|
|
8
|
+
function composeScalar(ctx, token, tagToken, onError) {
|
|
9
|
+
const { value, type, comment, range } = token.type === 'block-scalar'
|
|
10
|
+
? resolveBlockScalar.resolveBlockScalar(ctx, token, onError)
|
|
11
|
+
: resolveFlowScalar.resolveFlowScalar(token, ctx.options.strict, onError);
|
|
12
|
+
const tagName = tagToken
|
|
13
|
+
? ctx.directives.tagName(tagToken.source, msg => onError(tagToken, 'TAG_RESOLVE_FAILED', msg))
|
|
14
|
+
: null;
|
|
15
|
+
let tag;
|
|
16
|
+
if (ctx.options.stringKeys && ctx.atKey) {
|
|
17
|
+
tag = ctx.schema[identity.SCALAR];
|
|
18
|
+
}
|
|
19
|
+
else if (tagName)
|
|
20
|
+
tag = findScalarTagByName(ctx.schema, value, tagName, tagToken, onError);
|
|
21
|
+
else if (token.type === 'scalar')
|
|
22
|
+
tag = findScalarTagByTest(ctx, value, token, onError);
|
|
23
|
+
else
|
|
24
|
+
tag = ctx.schema[identity.SCALAR];
|
|
25
|
+
let scalar;
|
|
26
|
+
try {
|
|
27
|
+
const res = tag.resolve(value, msg => onError(tagToken ?? token, 'TAG_RESOLVE_FAILED', msg), ctx.options);
|
|
28
|
+
scalar = identity.isScalar(res) ? res : new Scalar.Scalar(res);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
32
|
+
onError(tagToken ?? token, 'TAG_RESOLVE_FAILED', msg);
|
|
33
|
+
scalar = new Scalar.Scalar(value);
|
|
34
|
+
}
|
|
35
|
+
scalar.range = range;
|
|
36
|
+
scalar.source = value;
|
|
37
|
+
if (type)
|
|
38
|
+
scalar.type = type;
|
|
39
|
+
if (tagName)
|
|
40
|
+
scalar.tag = tagName;
|
|
41
|
+
if (tag.format)
|
|
42
|
+
scalar.format = tag.format;
|
|
43
|
+
if (comment)
|
|
44
|
+
scalar.comment = comment;
|
|
45
|
+
return scalar;
|
|
46
|
+
}
|
|
47
|
+
function findScalarTagByName(schema, value, tagName, tagToken, onError) {
|
|
48
|
+
if (tagName === '!')
|
|
49
|
+
return schema[identity.SCALAR]; // non-specific tag
|
|
50
|
+
const matchWithTest = [];
|
|
51
|
+
for (const tag of schema.tags) {
|
|
52
|
+
if (!tag.collection && tag.tag === tagName) {
|
|
53
|
+
if (tag.default && tag.test)
|
|
54
|
+
matchWithTest.push(tag);
|
|
55
|
+
else
|
|
56
|
+
return tag;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
for (const tag of matchWithTest)
|
|
60
|
+
if (tag.test?.test(value))
|
|
61
|
+
return tag;
|
|
62
|
+
const kt = schema.knownTags[tagName];
|
|
63
|
+
if (kt && !kt.collection) {
|
|
64
|
+
// Ensure that the known tag is available for stringifying,
|
|
65
|
+
// but does not get used by default.
|
|
66
|
+
schema.tags.push(Object.assign({}, kt, { default: false, test: undefined }));
|
|
67
|
+
return kt;
|
|
68
|
+
}
|
|
69
|
+
onError(tagToken, 'TAG_RESOLVE_FAILED', `Unresolved tag: ${tagName}`, tagName !== 'tag:yaml.org,2002:str');
|
|
70
|
+
return schema[identity.SCALAR];
|
|
71
|
+
}
|
|
72
|
+
function findScalarTagByTest({ atKey, directives, schema }, value, token, onError) {
|
|
73
|
+
const tag = schema.tags.find(tag => (tag.default === true || (atKey && tag.default === 'key')) &&
|
|
74
|
+
tag.test?.test(value)) || schema[identity.SCALAR];
|
|
75
|
+
if (schema.compat) {
|
|
76
|
+
const compat = schema.compat.find(tag => tag.default && tag.test?.test(value)) ??
|
|
77
|
+
schema[identity.SCALAR];
|
|
78
|
+
if (tag.tag !== compat.tag) {
|
|
79
|
+
const ts = directives.tagString(tag.tag);
|
|
80
|
+
const cs = directives.tagString(compat.tag);
|
|
81
|
+
const msg = `Value may be parsed as either ${ts} or ${cs}`;
|
|
82
|
+
onError(token, 'TAG_RESOLVE_FAILED', msg, true);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return tag;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
exports.composeScalar = composeScalar;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Directives } from '../doc/directives';
|
|
2
|
+
import { Document } from '../doc/Document';
|
|
3
|
+
import type { ErrorCode } from '../errors';
|
|
4
|
+
import { YAMLParseError, YAMLWarning } from '../errors';
|
|
5
|
+
import type { ParsedNode, Range } from '../nodes/Node';
|
|
6
|
+
import type { DocumentOptions, ParseOptions, SchemaOptions } from '../options';
|
|
7
|
+
import type { Token } from '../parse/cst';
|
|
8
|
+
type ErrorSource = number | [number, number] | Range | {
|
|
9
|
+
offset: number;
|
|
10
|
+
source?: string;
|
|
11
|
+
};
|
|
12
|
+
export type ComposeErrorHandler = (source: ErrorSource, code: ErrorCode, message: string, warning?: boolean) => void;
|
|
13
|
+
/**
|
|
14
|
+
* Compose a stream of CST nodes into a stream of YAML Documents.
|
|
15
|
+
*
|
|
16
|
+
* ```ts
|
|
17
|
+
* import { Composer, Parser } from 'yaml'
|
|
18
|
+
*
|
|
19
|
+
* const src: string = ...
|
|
20
|
+
* const tokens = new Parser().parse(src)
|
|
21
|
+
* const docs = new Composer().compose(tokens)
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare class Composer<Contents extends ParsedNode = ParsedNode, Strict extends boolean = true> {
|
|
25
|
+
private directives;
|
|
26
|
+
private doc;
|
|
27
|
+
private options;
|
|
28
|
+
private atDirectives;
|
|
29
|
+
private prelude;
|
|
30
|
+
private errors;
|
|
31
|
+
private warnings;
|
|
32
|
+
constructor(options?: ParseOptions & DocumentOptions & SchemaOptions);
|
|
33
|
+
private onError;
|
|
34
|
+
private decorate;
|
|
35
|
+
/**
|
|
36
|
+
* Current stream status information.
|
|
37
|
+
*
|
|
38
|
+
* Mostly useful at the end of input for an empty stream.
|
|
39
|
+
*/
|
|
40
|
+
streamInfo(): {
|
|
41
|
+
comment: string;
|
|
42
|
+
directives: Directives;
|
|
43
|
+
errors: YAMLParseError[];
|
|
44
|
+
warnings: YAMLWarning[];
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Compose tokens into documents.
|
|
48
|
+
*
|
|
49
|
+
* @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.
|
|
50
|
+
* @param endOffset - Should be set if `forceDoc` is also set, to set the document range end and to indicate errors correctly.
|
|
51
|
+
*/
|
|
52
|
+
compose(tokens: Iterable<Token>, forceDoc?: boolean, endOffset?: number): Generator<Document.Parsed<Contents, Strict>, void, unknown>;
|
|
53
|
+
/** Advance the composer by one CST token. */
|
|
54
|
+
next(token: Token): Generator<Document.Parsed<Contents, Strict>, void, unknown>;
|
|
55
|
+
/**
|
|
56
|
+
* Call at end of input to yield any remaining document.
|
|
57
|
+
*
|
|
58
|
+
* @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.
|
|
59
|
+
* @param endOffset - Should be set if `forceDoc` is also set, to set the document range end and to indicate errors correctly.
|
|
60
|
+
*/
|
|
61
|
+
end(forceDoc?: boolean, endOffset?: number): Generator<Document.Parsed<Contents, Strict>, void, unknown>;
|
|
62
|
+
}
|
|
63
|
+
export {};
|