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,209 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var identity = require('../nodes/identity.js');
|
|
4
|
+
var Pair = require('../nodes/Pair.js');
|
|
5
|
+
var YAMLMap = require('../nodes/YAMLMap.js');
|
|
6
|
+
var YAMLSeq = require('../nodes/YAMLSeq.js');
|
|
7
|
+
var resolveEnd = require('./resolve-end.js');
|
|
8
|
+
var resolveProps = require('./resolve-props.js');
|
|
9
|
+
var utilContainsNewline = require('./util-contains-newline.js');
|
|
10
|
+
var utilMapIncludes = require('./util-map-includes.js');
|
|
11
|
+
|
|
12
|
+
const blockMsg = 'Block collections are not allowed within flow collections';
|
|
13
|
+
const isBlock = (token) => token && (token.type === 'block-map' || token.type === 'block-seq');
|
|
14
|
+
function resolveFlowCollection({ composeNode, composeEmptyNode }, ctx, fc, onError, tag) {
|
|
15
|
+
const isMap = fc.start.source === '{';
|
|
16
|
+
const fcName = isMap ? 'flow map' : 'flow sequence';
|
|
17
|
+
const NodeClass = (tag?.nodeClass ?? (isMap ? YAMLMap.YAMLMap : YAMLSeq.YAMLSeq));
|
|
18
|
+
const coll = new NodeClass(ctx.schema);
|
|
19
|
+
coll.flow = true;
|
|
20
|
+
const atRoot = ctx.atRoot;
|
|
21
|
+
if (atRoot)
|
|
22
|
+
ctx.atRoot = false;
|
|
23
|
+
if (ctx.atKey)
|
|
24
|
+
ctx.atKey = false;
|
|
25
|
+
let offset = fc.offset + fc.start.source.length;
|
|
26
|
+
for (let i = 0; i < fc.items.length; ++i) {
|
|
27
|
+
const collItem = fc.items[i];
|
|
28
|
+
const { start, key, sep, value } = collItem;
|
|
29
|
+
const props = resolveProps.resolveProps(start, {
|
|
30
|
+
flow: fcName,
|
|
31
|
+
indicator: 'explicit-key-ind',
|
|
32
|
+
next: key ?? sep?.[0],
|
|
33
|
+
offset,
|
|
34
|
+
onError,
|
|
35
|
+
parentIndent: fc.indent,
|
|
36
|
+
startOnNewline: false
|
|
37
|
+
});
|
|
38
|
+
if (!props.found) {
|
|
39
|
+
if (!props.anchor && !props.tag && !sep && !value) {
|
|
40
|
+
if (i === 0 && props.comma)
|
|
41
|
+
onError(props.comma, 'UNEXPECTED_TOKEN', `Unexpected , in ${fcName}`);
|
|
42
|
+
else if (i < fc.items.length - 1)
|
|
43
|
+
onError(props.start, 'UNEXPECTED_TOKEN', `Unexpected empty item in ${fcName}`);
|
|
44
|
+
if (props.comment) {
|
|
45
|
+
if (coll.comment)
|
|
46
|
+
coll.comment += '\n' + props.comment;
|
|
47
|
+
else
|
|
48
|
+
coll.comment = props.comment;
|
|
49
|
+
}
|
|
50
|
+
offset = props.end;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (!isMap && ctx.options.strict && utilContainsNewline.containsNewline(key))
|
|
54
|
+
onError(key, // checked by containsNewline()
|
|
55
|
+
'MULTILINE_IMPLICIT_KEY', 'Implicit keys of flow sequence pairs need to be on a single line');
|
|
56
|
+
}
|
|
57
|
+
if (i === 0) {
|
|
58
|
+
if (props.comma)
|
|
59
|
+
onError(props.comma, 'UNEXPECTED_TOKEN', `Unexpected , in ${fcName}`);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
if (!props.comma)
|
|
63
|
+
onError(props.start, 'MISSING_CHAR', `Missing , between ${fcName} items`);
|
|
64
|
+
if (props.comment) {
|
|
65
|
+
let prevItemComment = '';
|
|
66
|
+
loop: for (const st of start) {
|
|
67
|
+
switch (st.type) {
|
|
68
|
+
case 'comma':
|
|
69
|
+
case 'space':
|
|
70
|
+
break;
|
|
71
|
+
case 'comment':
|
|
72
|
+
prevItemComment = st.source.substring(1);
|
|
73
|
+
break loop;
|
|
74
|
+
default:
|
|
75
|
+
break loop;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (prevItemComment) {
|
|
79
|
+
let prev = coll.items[coll.items.length - 1];
|
|
80
|
+
if (identity.isPair(prev))
|
|
81
|
+
prev = prev.value ?? prev.key;
|
|
82
|
+
if (prev.comment)
|
|
83
|
+
prev.comment += '\n' + prevItemComment;
|
|
84
|
+
else
|
|
85
|
+
prev.comment = prevItemComment;
|
|
86
|
+
props.comment = props.comment.substring(prevItemComment.length + 1);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (!isMap && !sep && !props.found) {
|
|
91
|
+
// item is a value in a seq
|
|
92
|
+
// → key & sep are empty, start does not include ? or :
|
|
93
|
+
const valueNode = value
|
|
94
|
+
? composeNode(ctx, value, props, onError)
|
|
95
|
+
: composeEmptyNode(ctx, props.end, sep, null, props, onError);
|
|
96
|
+
coll.items.push(valueNode);
|
|
97
|
+
offset = valueNode.range[2];
|
|
98
|
+
if (isBlock(value))
|
|
99
|
+
onError(valueNode.range, 'BLOCK_IN_FLOW', blockMsg);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
// item is a key+value pair
|
|
103
|
+
// key value
|
|
104
|
+
ctx.atKey = true;
|
|
105
|
+
const keyStart = props.end;
|
|
106
|
+
const keyNode = key
|
|
107
|
+
? composeNode(ctx, key, props, onError)
|
|
108
|
+
: composeEmptyNode(ctx, keyStart, start, null, props, onError);
|
|
109
|
+
if (isBlock(key))
|
|
110
|
+
onError(keyNode.range, 'BLOCK_IN_FLOW', blockMsg);
|
|
111
|
+
ctx.atKey = false;
|
|
112
|
+
// value properties
|
|
113
|
+
const valueProps = resolveProps.resolveProps(sep ?? [], {
|
|
114
|
+
flow: fcName,
|
|
115
|
+
indicator: 'map-value-ind',
|
|
116
|
+
next: value,
|
|
117
|
+
offset: keyNode.range[2],
|
|
118
|
+
onError,
|
|
119
|
+
parentIndent: fc.indent,
|
|
120
|
+
startOnNewline: false
|
|
121
|
+
});
|
|
122
|
+
if (valueProps.found) {
|
|
123
|
+
if (!isMap && !props.found && ctx.options.strict) {
|
|
124
|
+
if (sep)
|
|
125
|
+
for (const st of sep) {
|
|
126
|
+
if (st === valueProps.found)
|
|
127
|
+
break;
|
|
128
|
+
if (st.type === 'newline') {
|
|
129
|
+
onError(st, 'MULTILINE_IMPLICIT_KEY', 'Implicit keys of flow sequence pairs need to be on a single line');
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (props.start < valueProps.found.offset - 1024)
|
|
134
|
+
onError(valueProps.found, 'KEY_OVER_1024_CHARS', 'The : indicator must be at most 1024 chars after the start of an implicit flow sequence key');
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
else if (value) {
|
|
138
|
+
if ('source' in value && value.source?.[0] === ':')
|
|
139
|
+
onError(value, 'MISSING_CHAR', `Missing space after : in ${fcName}`);
|
|
140
|
+
else
|
|
141
|
+
onError(valueProps.start, 'MISSING_CHAR', `Missing , or : between ${fcName} items`);
|
|
142
|
+
}
|
|
143
|
+
// value value
|
|
144
|
+
const valueNode = value
|
|
145
|
+
? composeNode(ctx, value, valueProps, onError)
|
|
146
|
+
: valueProps.found
|
|
147
|
+
? composeEmptyNode(ctx, valueProps.end, sep, null, valueProps, onError)
|
|
148
|
+
: null;
|
|
149
|
+
if (valueNode) {
|
|
150
|
+
if (isBlock(value))
|
|
151
|
+
onError(valueNode.range, 'BLOCK_IN_FLOW', blockMsg);
|
|
152
|
+
}
|
|
153
|
+
else if (valueProps.comment) {
|
|
154
|
+
if (keyNode.comment)
|
|
155
|
+
keyNode.comment += '\n' + valueProps.comment;
|
|
156
|
+
else
|
|
157
|
+
keyNode.comment = valueProps.comment;
|
|
158
|
+
}
|
|
159
|
+
const pair = new Pair.Pair(keyNode, valueNode);
|
|
160
|
+
if (ctx.options.keepSourceTokens)
|
|
161
|
+
pair.srcToken = collItem;
|
|
162
|
+
if (isMap) {
|
|
163
|
+
const map = coll;
|
|
164
|
+
if (utilMapIncludes.mapIncludes(ctx, map.items, keyNode))
|
|
165
|
+
onError(keyStart, 'DUPLICATE_KEY', 'Map keys must be unique');
|
|
166
|
+
map.items.push(pair);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
const map = new YAMLMap.YAMLMap(ctx.schema);
|
|
170
|
+
map.flow = true;
|
|
171
|
+
map.items.push(pair);
|
|
172
|
+
const endRange = (valueNode ?? keyNode).range;
|
|
173
|
+
map.range = [keyNode.range[0], endRange[1], endRange[2]];
|
|
174
|
+
coll.items.push(map);
|
|
175
|
+
}
|
|
176
|
+
offset = valueNode ? valueNode.range[2] : valueProps.end;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
const expectedEnd = isMap ? '}' : ']';
|
|
180
|
+
const [ce, ...ee] = fc.end;
|
|
181
|
+
let cePos = offset;
|
|
182
|
+
if (ce?.source === expectedEnd)
|
|
183
|
+
cePos = ce.offset + ce.source.length;
|
|
184
|
+
else {
|
|
185
|
+
const name = fcName[0].toUpperCase() + fcName.substring(1);
|
|
186
|
+
const msg = atRoot
|
|
187
|
+
? `${name} must end with a ${expectedEnd}`
|
|
188
|
+
: `${name} in block collection must be sufficiently indented and end with a ${expectedEnd}`;
|
|
189
|
+
onError(offset, atRoot ? 'MISSING_CHAR' : 'BAD_INDENT', msg);
|
|
190
|
+
if (ce && ce.source.length !== 1)
|
|
191
|
+
ee.unshift(ce);
|
|
192
|
+
}
|
|
193
|
+
if (ee.length > 0) {
|
|
194
|
+
const end = resolveEnd.resolveEnd(ee, cePos, ctx.options.strict, onError);
|
|
195
|
+
if (end.comment) {
|
|
196
|
+
if (coll.comment)
|
|
197
|
+
coll.comment += '\n' + end.comment;
|
|
198
|
+
else
|
|
199
|
+
coll.comment = end.comment;
|
|
200
|
+
}
|
|
201
|
+
coll.range = [fc.offset, cePos, end.offset];
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
coll.range = [fc.offset, cePos, cePos];
|
|
205
|
+
}
|
|
206
|
+
return coll;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
exports.resolveFlowCollection = resolveFlowCollection;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Range } from '../nodes/Node';
|
|
2
|
+
import { Scalar } from '../nodes/Scalar';
|
|
3
|
+
import type { FlowScalar } from '../parse/cst';
|
|
4
|
+
import type { ComposeErrorHandler } from './composer';
|
|
5
|
+
export declare function resolveFlowScalar(scalar: FlowScalar, strict: boolean, onError: ComposeErrorHandler): {
|
|
6
|
+
value: string;
|
|
7
|
+
type: Scalar.PLAIN | Scalar.QUOTE_DOUBLE | Scalar.QUOTE_SINGLE | null;
|
|
8
|
+
comment: string;
|
|
9
|
+
range: Range;
|
|
10
|
+
};
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var Scalar = require('../nodes/Scalar.js');
|
|
4
|
+
var resolveEnd = require('./resolve-end.js');
|
|
5
|
+
|
|
6
|
+
function resolveFlowScalar(scalar, strict, onError) {
|
|
7
|
+
const { offset, type, source, end } = scalar;
|
|
8
|
+
let _type;
|
|
9
|
+
let value;
|
|
10
|
+
const _onError = (rel, code, msg) => onError(offset + rel, code, msg);
|
|
11
|
+
switch (type) {
|
|
12
|
+
case 'scalar':
|
|
13
|
+
_type = Scalar.Scalar.PLAIN;
|
|
14
|
+
value = plainValue(source, _onError);
|
|
15
|
+
break;
|
|
16
|
+
case 'single-quoted-scalar':
|
|
17
|
+
_type = Scalar.Scalar.QUOTE_SINGLE;
|
|
18
|
+
value = singleQuotedValue(source, _onError);
|
|
19
|
+
break;
|
|
20
|
+
case 'double-quoted-scalar':
|
|
21
|
+
_type = Scalar.Scalar.QUOTE_DOUBLE;
|
|
22
|
+
value = doubleQuotedValue(source, _onError);
|
|
23
|
+
break;
|
|
24
|
+
/* istanbul ignore next should not happen */
|
|
25
|
+
default:
|
|
26
|
+
onError(scalar, 'UNEXPECTED_TOKEN', `Expected a flow scalar value, but found: ${type}`);
|
|
27
|
+
return {
|
|
28
|
+
value: '',
|
|
29
|
+
type: null,
|
|
30
|
+
comment: '',
|
|
31
|
+
range: [offset, offset + source.length, offset + source.length]
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const valueEnd = offset + source.length;
|
|
35
|
+
const re = resolveEnd.resolveEnd(end, valueEnd, strict, onError);
|
|
36
|
+
return {
|
|
37
|
+
value,
|
|
38
|
+
type: _type,
|
|
39
|
+
comment: re.comment,
|
|
40
|
+
range: [offset, valueEnd, re.offset]
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function plainValue(source, onError) {
|
|
44
|
+
let badChar = '';
|
|
45
|
+
switch (source[0]) {
|
|
46
|
+
/* istanbul ignore next should not happen */
|
|
47
|
+
case '\t':
|
|
48
|
+
badChar = 'a tab character';
|
|
49
|
+
break;
|
|
50
|
+
case ',':
|
|
51
|
+
badChar = 'flow indicator character ,';
|
|
52
|
+
break;
|
|
53
|
+
case '%':
|
|
54
|
+
badChar = 'directive indicator character %';
|
|
55
|
+
break;
|
|
56
|
+
case '|':
|
|
57
|
+
case '>': {
|
|
58
|
+
badChar = `block scalar indicator ${source[0]}`;
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
case '@':
|
|
62
|
+
case '`': {
|
|
63
|
+
badChar = `reserved character ${source[0]}`;
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (badChar)
|
|
68
|
+
onError(0, 'BAD_SCALAR_START', `Plain value cannot start with ${badChar}`);
|
|
69
|
+
return foldLines(source);
|
|
70
|
+
}
|
|
71
|
+
function singleQuotedValue(source, onError) {
|
|
72
|
+
if (source[source.length - 1] !== "'" || source.length === 1)
|
|
73
|
+
onError(source.length, 'MISSING_CHAR', "Missing closing 'quote");
|
|
74
|
+
return foldLines(source.slice(1, -1)).replace(/''/g, "'");
|
|
75
|
+
}
|
|
76
|
+
function foldLines(source) {
|
|
77
|
+
/**
|
|
78
|
+
* The negative lookbehind here and in the `re` RegExp is to
|
|
79
|
+
* prevent causing a polynomial search time in certain cases.
|
|
80
|
+
*
|
|
81
|
+
* The try-catch is for Safari, which doesn't support this yet:
|
|
82
|
+
* https://caniuse.com/js-regexp-lookbehind
|
|
83
|
+
*/
|
|
84
|
+
let first, line;
|
|
85
|
+
try {
|
|
86
|
+
first = new RegExp('(.*?)(?<![ \t])[ \t]*\r?\n', 'sy');
|
|
87
|
+
line = new RegExp('[ \t]*(.*?)(?:(?<![ \t])[ \t]*)?\r?\n', 'sy');
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
first = /(.*?)[ \t]*\r?\n/sy;
|
|
91
|
+
line = /[ \t]*(.*?)[ \t]*\r?\n/sy;
|
|
92
|
+
}
|
|
93
|
+
let match = first.exec(source);
|
|
94
|
+
if (!match)
|
|
95
|
+
return source;
|
|
96
|
+
let res = match[1];
|
|
97
|
+
let sep = ' ';
|
|
98
|
+
let pos = first.lastIndex;
|
|
99
|
+
line.lastIndex = pos;
|
|
100
|
+
while ((match = line.exec(source))) {
|
|
101
|
+
if (match[1] === '') {
|
|
102
|
+
if (sep === '\n')
|
|
103
|
+
res += sep;
|
|
104
|
+
else
|
|
105
|
+
sep = '\n';
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
res += sep + match[1];
|
|
109
|
+
sep = ' ';
|
|
110
|
+
}
|
|
111
|
+
pos = line.lastIndex;
|
|
112
|
+
}
|
|
113
|
+
const last = /[ \t]*(.*)/sy;
|
|
114
|
+
last.lastIndex = pos;
|
|
115
|
+
match = last.exec(source);
|
|
116
|
+
return res + sep + (match?.[1] ?? '');
|
|
117
|
+
}
|
|
118
|
+
function doubleQuotedValue(source, onError) {
|
|
119
|
+
let res = '';
|
|
120
|
+
for (let i = 1; i < source.length - 1; ++i) {
|
|
121
|
+
const ch = source[i];
|
|
122
|
+
if (ch === '\r' && source[i + 1] === '\n')
|
|
123
|
+
continue;
|
|
124
|
+
if (ch === '\n') {
|
|
125
|
+
const { fold, offset } = foldNewline(source, i);
|
|
126
|
+
res += fold;
|
|
127
|
+
i = offset;
|
|
128
|
+
}
|
|
129
|
+
else if (ch === '\\') {
|
|
130
|
+
let next = source[++i];
|
|
131
|
+
const cc = escapeCodes[next];
|
|
132
|
+
if (cc)
|
|
133
|
+
res += cc;
|
|
134
|
+
else if (next === '\n') {
|
|
135
|
+
// skip escaped newlines, but still trim the following line
|
|
136
|
+
next = source[i + 1];
|
|
137
|
+
while (next === ' ' || next === '\t')
|
|
138
|
+
next = source[++i + 1];
|
|
139
|
+
}
|
|
140
|
+
else if (next === '\r' && source[i + 1] === '\n') {
|
|
141
|
+
// skip escaped CRLF newlines, but still trim the following line
|
|
142
|
+
next = source[++i + 1];
|
|
143
|
+
while (next === ' ' || next === '\t')
|
|
144
|
+
next = source[++i + 1];
|
|
145
|
+
}
|
|
146
|
+
else if (next === 'x' || next === 'u' || next === 'U') {
|
|
147
|
+
const length = { x: 2, u: 4, U: 8 }[next];
|
|
148
|
+
res += parseCharCode(source, i + 1, length, onError);
|
|
149
|
+
i += length;
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
const raw = source.substr(i - 1, 2);
|
|
153
|
+
onError(i - 1, 'BAD_DQ_ESCAPE', `Invalid escape sequence ${raw}`);
|
|
154
|
+
res += raw;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
else if (ch === ' ' || ch === '\t') {
|
|
158
|
+
// trim trailing whitespace
|
|
159
|
+
const wsStart = i;
|
|
160
|
+
let next = source[i + 1];
|
|
161
|
+
while (next === ' ' || next === '\t')
|
|
162
|
+
next = source[++i + 1];
|
|
163
|
+
if (next !== '\n' && !(next === '\r' && source[i + 2] === '\n'))
|
|
164
|
+
res += i > wsStart ? source.slice(wsStart, i + 1) : ch;
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
res += ch;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (source[source.length - 1] !== '"' || source.length === 1)
|
|
171
|
+
onError(source.length, 'MISSING_CHAR', 'Missing closing "quote');
|
|
172
|
+
return res;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Fold a single newline into a space, multiple newlines to N - 1 newlines.
|
|
176
|
+
* Presumes `source[offset] === '\n'`
|
|
177
|
+
*/
|
|
178
|
+
function foldNewline(source, offset) {
|
|
179
|
+
let fold = '';
|
|
180
|
+
let ch = source[offset + 1];
|
|
181
|
+
while (ch === ' ' || ch === '\t' || ch === '\n' || ch === '\r') {
|
|
182
|
+
if (ch === '\r' && source[offset + 2] !== '\n')
|
|
183
|
+
break;
|
|
184
|
+
if (ch === '\n')
|
|
185
|
+
fold += '\n';
|
|
186
|
+
offset += 1;
|
|
187
|
+
ch = source[offset + 1];
|
|
188
|
+
}
|
|
189
|
+
if (!fold)
|
|
190
|
+
fold = ' ';
|
|
191
|
+
return { fold, offset };
|
|
192
|
+
}
|
|
193
|
+
const escapeCodes = {
|
|
194
|
+
'0': '\0', // null character
|
|
195
|
+
a: '\x07', // bell character
|
|
196
|
+
b: '\b', // backspace
|
|
197
|
+
e: '\x1b', // escape character
|
|
198
|
+
f: '\f', // form feed
|
|
199
|
+
n: '\n', // line feed
|
|
200
|
+
r: '\r', // carriage return
|
|
201
|
+
t: '\t', // horizontal tab
|
|
202
|
+
v: '\v', // vertical tab
|
|
203
|
+
N: '\u0085', // Unicode next line
|
|
204
|
+
_: '\u00a0', // Unicode non-breaking space
|
|
205
|
+
L: '\u2028', // Unicode line separator
|
|
206
|
+
P: '\u2029', // Unicode paragraph separator
|
|
207
|
+
' ': ' ',
|
|
208
|
+
'"': '"',
|
|
209
|
+
'/': '/',
|
|
210
|
+
'\\': '\\',
|
|
211
|
+
'\t': '\t'
|
|
212
|
+
};
|
|
213
|
+
function parseCharCode(source, offset, length, onError) {
|
|
214
|
+
const cc = source.substr(offset, length);
|
|
215
|
+
const ok = cc.length === length && /^[0-9a-fA-F]+$/.test(cc);
|
|
216
|
+
const code = ok ? parseInt(cc, 16) : NaN;
|
|
217
|
+
if (isNaN(code)) {
|
|
218
|
+
const raw = source.substr(offset - 2, length + 2);
|
|
219
|
+
onError(offset - 2, 'BAD_DQ_ESCAPE', `Invalid escape sequence ${raw}`);
|
|
220
|
+
return raw;
|
|
221
|
+
}
|
|
222
|
+
return String.fromCodePoint(code);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
exports.resolveFlowScalar = resolveFlowScalar;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { SourceToken, Token } from '../parse/cst';
|
|
2
|
+
import type { ComposeErrorHandler } from './composer';
|
|
3
|
+
export interface ResolvePropsArg {
|
|
4
|
+
flow?: 'flow map' | 'flow sequence';
|
|
5
|
+
indicator: 'doc-start' | 'explicit-key-ind' | 'map-value-ind' | 'seq-item-ind';
|
|
6
|
+
next: Token | null | undefined;
|
|
7
|
+
offset: number;
|
|
8
|
+
onError: ComposeErrorHandler;
|
|
9
|
+
parentIndent: number;
|
|
10
|
+
startOnNewline: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function resolveProps(tokens: SourceToken[], { flow, indicator, next, offset, onError, parentIndent, startOnNewline }: ResolvePropsArg): {
|
|
13
|
+
comma: SourceToken | null;
|
|
14
|
+
found: SourceToken | null;
|
|
15
|
+
spaceBefore: boolean;
|
|
16
|
+
comment: string;
|
|
17
|
+
hasNewline: boolean;
|
|
18
|
+
anchor: SourceToken | null;
|
|
19
|
+
tag: SourceToken | null;
|
|
20
|
+
newlineAfterProp: SourceToken | null;
|
|
21
|
+
end: number;
|
|
22
|
+
start: number;
|
|
23
|
+
};
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function resolveProps(tokens, { flow, indicator, next, offset, onError, parentIndent, startOnNewline }) {
|
|
4
|
+
let spaceBefore = false;
|
|
5
|
+
let atNewline = startOnNewline;
|
|
6
|
+
let hasSpace = startOnNewline;
|
|
7
|
+
let comment = '';
|
|
8
|
+
let commentSep = '';
|
|
9
|
+
let hasNewline = false;
|
|
10
|
+
let reqSpace = false;
|
|
11
|
+
let tab = null;
|
|
12
|
+
let anchor = null;
|
|
13
|
+
let tag = null;
|
|
14
|
+
let newlineAfterProp = null;
|
|
15
|
+
let comma = null;
|
|
16
|
+
let found = null;
|
|
17
|
+
let start = null;
|
|
18
|
+
for (const token of tokens) {
|
|
19
|
+
if (reqSpace) {
|
|
20
|
+
if (token.type !== 'space' &&
|
|
21
|
+
token.type !== 'newline' &&
|
|
22
|
+
token.type !== 'comma')
|
|
23
|
+
onError(token.offset, 'MISSING_CHAR', 'Tags and anchors must be separated from the next token by white space');
|
|
24
|
+
reqSpace = false;
|
|
25
|
+
}
|
|
26
|
+
if (tab) {
|
|
27
|
+
if (atNewline && token.type !== 'comment' && token.type !== 'newline') {
|
|
28
|
+
onError(tab, 'TAB_AS_INDENT', 'Tabs are not allowed as indentation');
|
|
29
|
+
}
|
|
30
|
+
tab = null;
|
|
31
|
+
}
|
|
32
|
+
switch (token.type) {
|
|
33
|
+
case 'space':
|
|
34
|
+
// At the doc level, tabs at line start may be parsed
|
|
35
|
+
// as leading white space rather than indentation.
|
|
36
|
+
// In a flow collection, only the parser handles indent.
|
|
37
|
+
if (!flow &&
|
|
38
|
+
(indicator !== 'doc-start' || next?.type !== 'flow-collection') &&
|
|
39
|
+
token.source.includes('\t')) {
|
|
40
|
+
tab = token;
|
|
41
|
+
}
|
|
42
|
+
hasSpace = true;
|
|
43
|
+
break;
|
|
44
|
+
case 'comment': {
|
|
45
|
+
if (!hasSpace)
|
|
46
|
+
onError(token, 'MISSING_CHAR', 'Comments must be separated from other tokens by white space characters');
|
|
47
|
+
const cb = token.source.substring(1) || ' ';
|
|
48
|
+
if (!comment)
|
|
49
|
+
comment = cb;
|
|
50
|
+
else
|
|
51
|
+
comment += commentSep + cb;
|
|
52
|
+
commentSep = '';
|
|
53
|
+
atNewline = false;
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
case 'newline':
|
|
57
|
+
if (atNewline) {
|
|
58
|
+
if (comment)
|
|
59
|
+
comment += token.source;
|
|
60
|
+
else if (!found || indicator !== 'seq-item-ind')
|
|
61
|
+
spaceBefore = true;
|
|
62
|
+
}
|
|
63
|
+
else
|
|
64
|
+
commentSep += token.source;
|
|
65
|
+
atNewline = true;
|
|
66
|
+
hasNewline = true;
|
|
67
|
+
if (anchor || tag)
|
|
68
|
+
newlineAfterProp = token;
|
|
69
|
+
hasSpace = true;
|
|
70
|
+
break;
|
|
71
|
+
case 'anchor':
|
|
72
|
+
if (anchor)
|
|
73
|
+
onError(token, 'MULTIPLE_ANCHORS', 'A node can have at most one anchor');
|
|
74
|
+
if (token.source.endsWith(':'))
|
|
75
|
+
onError(token.offset + token.source.length - 1, 'BAD_ALIAS', 'Anchor ending in : is ambiguous', true);
|
|
76
|
+
anchor = token;
|
|
77
|
+
start ?? (start = token.offset);
|
|
78
|
+
atNewline = false;
|
|
79
|
+
hasSpace = false;
|
|
80
|
+
reqSpace = true;
|
|
81
|
+
break;
|
|
82
|
+
case 'tag': {
|
|
83
|
+
if (tag)
|
|
84
|
+
onError(token, 'MULTIPLE_TAGS', 'A node can have at most one tag');
|
|
85
|
+
tag = token;
|
|
86
|
+
start ?? (start = token.offset);
|
|
87
|
+
atNewline = false;
|
|
88
|
+
hasSpace = false;
|
|
89
|
+
reqSpace = true;
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
case indicator:
|
|
93
|
+
// Could here handle preceding comments differently
|
|
94
|
+
if (anchor || tag)
|
|
95
|
+
onError(token, 'BAD_PROP_ORDER', `Anchors and tags must be after the ${token.source} indicator`);
|
|
96
|
+
if (found)
|
|
97
|
+
onError(token, 'UNEXPECTED_TOKEN', `Unexpected ${token.source} in ${flow ?? 'collection'}`);
|
|
98
|
+
found = token;
|
|
99
|
+
atNewline =
|
|
100
|
+
indicator === 'seq-item-ind' || indicator === 'explicit-key-ind';
|
|
101
|
+
hasSpace = false;
|
|
102
|
+
break;
|
|
103
|
+
case 'comma':
|
|
104
|
+
if (flow) {
|
|
105
|
+
if (comma)
|
|
106
|
+
onError(token, 'UNEXPECTED_TOKEN', `Unexpected , in ${flow}`);
|
|
107
|
+
comma = token;
|
|
108
|
+
atNewline = false;
|
|
109
|
+
hasSpace = false;
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
// else fallthrough
|
|
113
|
+
default:
|
|
114
|
+
onError(token, 'UNEXPECTED_TOKEN', `Unexpected ${token.type} token`);
|
|
115
|
+
atNewline = false;
|
|
116
|
+
hasSpace = false;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const last = tokens[tokens.length - 1];
|
|
120
|
+
const end = last ? last.offset + last.source.length : offset;
|
|
121
|
+
if (reqSpace &&
|
|
122
|
+
next &&
|
|
123
|
+
next.type !== 'space' &&
|
|
124
|
+
next.type !== 'newline' &&
|
|
125
|
+
next.type !== 'comma' &&
|
|
126
|
+
(next.type !== 'scalar' || next.source !== '')) {
|
|
127
|
+
onError(next.offset, 'MISSING_CHAR', 'Tags and anchors must be separated from the next token by white space');
|
|
128
|
+
}
|
|
129
|
+
if (tab &&
|
|
130
|
+
((atNewline && tab.indent <= parentIndent) ||
|
|
131
|
+
next?.type === 'block-map' ||
|
|
132
|
+
next?.type === 'block-seq'))
|
|
133
|
+
onError(tab, 'TAB_AS_INDENT', 'Tabs are not allowed as indentation');
|
|
134
|
+
return {
|
|
135
|
+
comma,
|
|
136
|
+
found,
|
|
137
|
+
spaceBefore,
|
|
138
|
+
comment,
|
|
139
|
+
hasNewline,
|
|
140
|
+
anchor,
|
|
141
|
+
tag,
|
|
142
|
+
newlineAfterProp,
|
|
143
|
+
end,
|
|
144
|
+
start: start ?? end
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
exports.resolveProps = resolveProps;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function containsNewline(key) {
|
|
4
|
+
if (!key)
|
|
5
|
+
return null;
|
|
6
|
+
switch (key.type) {
|
|
7
|
+
case 'alias':
|
|
8
|
+
case 'scalar':
|
|
9
|
+
case 'double-quoted-scalar':
|
|
10
|
+
case 'single-quoted-scalar':
|
|
11
|
+
if (key.source.includes('\n'))
|
|
12
|
+
return true;
|
|
13
|
+
if (key.end)
|
|
14
|
+
for (const st of key.end)
|
|
15
|
+
if (st.type === 'newline')
|
|
16
|
+
return true;
|
|
17
|
+
return false;
|
|
18
|
+
case 'flow-collection':
|
|
19
|
+
for (const it of key.items) {
|
|
20
|
+
for (const st of it.start)
|
|
21
|
+
if (st.type === 'newline')
|
|
22
|
+
return true;
|
|
23
|
+
if (it.sep)
|
|
24
|
+
for (const st of it.sep)
|
|
25
|
+
if (st.type === 'newline')
|
|
26
|
+
return true;
|
|
27
|
+
if (containsNewline(it.key) || containsNewline(it.value))
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
return false;
|
|
31
|
+
default:
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
exports.containsNewline = containsNewline;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function emptyScalarPosition(offset, before, pos) {
|
|
4
|
+
if (before) {
|
|
5
|
+
pos ?? (pos = before.length);
|
|
6
|
+
for (let i = pos - 1; i >= 0; --i) {
|
|
7
|
+
let st = before[i];
|
|
8
|
+
switch (st.type) {
|
|
9
|
+
case 'space':
|
|
10
|
+
case 'comment':
|
|
11
|
+
case 'newline':
|
|
12
|
+
offset -= st.source.length;
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
// Technically, an empty scalar is immediately after the last non-empty
|
|
16
|
+
// node, but it's more useful to place it after any whitespace.
|
|
17
|
+
st = before[++i];
|
|
18
|
+
while (st?.type === 'space') {
|
|
19
|
+
offset += st.source.length;
|
|
20
|
+
st = before[++i];
|
|
21
|
+
}
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return offset;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
exports.emptyScalarPosition = emptyScalarPosition;
|