yaml 2.8.4 → 3.0.0-1
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/README.md +65 -85
- package/{bin.mjs → bin.js} +1 -1
- package/dist/chunk-pbuEa-1d.js +13 -0
- package/dist/cli.d.ts +10 -7
- package/dist/cli.js +180 -0
- package/dist/directives-CiM56lHW.js +2963 -0
- package/dist/directives-DlYEVlkC.d.ts +1396 -0
- package/dist/index.d.ts +320 -25
- package/dist/index.js +4 -50
- package/dist/line-counter-bmCJ4fGy.js +3086 -0
- package/dist/public-api-BTMehGT6.js +77 -0
- package/dist/test-events.d.ts +6 -3
- package/dist/test-events.js +105 -126
- package/dist/util.d.ts +2 -16
- package/dist/util.js +2 -28
- package/package.json +20 -44
- package/browser/dist/compose/compose-collection.js +0 -88
- package/browser/dist/compose/compose-doc.js +0 -43
- package/browser/dist/compose/compose-node.js +0 -109
- package/browser/dist/compose/compose-scalar.js +0 -86
- package/browser/dist/compose/composer.js +0 -217
- package/browser/dist/compose/resolve-block-map.js +0 -115
- package/browser/dist/compose/resolve-block-scalar.js +0 -198
- package/browser/dist/compose/resolve-block-seq.js +0 -49
- package/browser/dist/compose/resolve-end.js +0 -37
- package/browser/dist/compose/resolve-flow-collection.js +0 -207
- package/browser/dist/compose/resolve-flow-scalar.js +0 -225
- package/browser/dist/compose/resolve-props.js +0 -146
- package/browser/dist/compose/util-contains-newline.js +0 -34
- package/browser/dist/compose/util-empty-scalar-position.js +0 -26
- package/browser/dist/compose/util-flow-indent-check.js +0 -15
- package/browser/dist/compose/util-map-includes.js +0 -13
- package/browser/dist/doc/Document.js +0 -335
- package/browser/dist/doc/anchors.js +0 -71
- package/browser/dist/doc/applyReviver.js +0 -55
- package/browser/dist/doc/createNode.js +0 -88
- package/browser/dist/doc/directives.js +0 -176
- package/browser/dist/errors.js +0 -57
- package/browser/dist/index.js +0 -17
- package/browser/dist/log.js +0 -11
- package/browser/dist/nodes/Alias.js +0 -116
- package/browser/dist/nodes/Collection.js +0 -147
- package/browser/dist/nodes/Node.js +0 -38
- package/browser/dist/nodes/Pair.js +0 -36
- package/browser/dist/nodes/Scalar.js +0 -24
- package/browser/dist/nodes/YAMLMap.js +0 -144
- package/browser/dist/nodes/YAMLSeq.js +0 -113
- package/browser/dist/nodes/addPairToJSMap.js +0 -63
- package/browser/dist/nodes/identity.js +0 -36
- package/browser/dist/nodes/toJS.js +0 -37
- package/browser/dist/parse/cst-scalar.js +0 -214
- package/browser/dist/parse/cst-stringify.js +0 -61
- package/browser/dist/parse/cst-visit.js +0 -97
- package/browser/dist/parse/cst.js +0 -98
- package/browser/dist/parse/lexer.js +0 -717
- package/browser/dist/parse/line-counter.js +0 -39
- package/browser/dist/parse/parser.js +0 -967
- package/browser/dist/public-api.js +0 -102
- package/browser/dist/schema/Schema.js +0 -37
- package/browser/dist/schema/common/map.js +0 -17
- package/browser/dist/schema/common/null.js +0 -15
- package/browser/dist/schema/common/seq.js +0 -17
- package/browser/dist/schema/common/string.js +0 -14
- package/browser/dist/schema/core/bool.js +0 -19
- package/browser/dist/schema/core/float.js +0 -43
- package/browser/dist/schema/core/int.js +0 -38
- package/browser/dist/schema/core/schema.js +0 -23
- package/browser/dist/schema/json/schema.js +0 -62
- package/browser/dist/schema/tags.js +0 -96
- package/browser/dist/schema/yaml-1.1/binary.js +0 -58
- package/browser/dist/schema/yaml-1.1/bool.js +0 -26
- package/browser/dist/schema/yaml-1.1/float.js +0 -46
- package/browser/dist/schema/yaml-1.1/int.js +0 -71
- package/browser/dist/schema/yaml-1.1/merge.js +0 -67
- package/browser/dist/schema/yaml-1.1/omap.js +0 -74
- package/browser/dist/schema/yaml-1.1/pairs.js +0 -78
- package/browser/dist/schema/yaml-1.1/schema.js +0 -39
- package/browser/dist/schema/yaml-1.1/set.js +0 -93
- package/browser/dist/schema/yaml-1.1/timestamp.js +0 -101
- package/browser/dist/stringify/foldFlowLines.js +0 -146
- package/browser/dist/stringify/stringify.js +0 -129
- package/browser/dist/stringify/stringifyCollection.js +0 -153
- package/browser/dist/stringify/stringifyComment.js +0 -20
- package/browser/dist/stringify/stringifyDocument.js +0 -85
- package/browser/dist/stringify/stringifyNumber.js +0 -25
- package/browser/dist/stringify/stringifyPair.js +0 -150
- package/browser/dist/stringify/stringifyString.js +0 -336
- package/browser/dist/util.js +0 -11
- package/browser/dist/visit.js +0 -233
- package/browser/index.js +0 -5
- package/browser/package.json +0 -3
- package/dist/cli.mjs +0 -201
- package/dist/compose/compose-collection.d.ts +0 -11
- package/dist/compose/compose-collection.js +0 -90
- package/dist/compose/compose-doc.d.ts +0 -7
- package/dist/compose/compose-doc.js +0 -45
- package/dist/compose/compose-node.d.ts +0 -29
- package/dist/compose/compose-node.js +0 -112
- package/dist/compose/compose-scalar.d.ts +0 -5
- package/dist/compose/compose-scalar.js +0 -88
- package/dist/compose/composer.d.ts +0 -63
- package/dist/compose/composer.js +0 -222
- package/dist/compose/resolve-block-map.d.ts +0 -6
- package/dist/compose/resolve-block-map.js +0 -117
- package/dist/compose/resolve-block-scalar.d.ts +0 -11
- package/dist/compose/resolve-block-scalar.js +0 -200
- package/dist/compose/resolve-block-seq.d.ts +0 -6
- package/dist/compose/resolve-block-seq.js +0 -51
- package/dist/compose/resolve-end.d.ts +0 -6
- package/dist/compose/resolve-end.js +0 -39
- package/dist/compose/resolve-flow-collection.d.ts +0 -7
- package/dist/compose/resolve-flow-collection.js +0 -209
- package/dist/compose/resolve-flow-scalar.d.ts +0 -10
- package/dist/compose/resolve-flow-scalar.js +0 -227
- package/dist/compose/resolve-props.d.ts +0 -23
- package/dist/compose/resolve-props.js +0 -148
- package/dist/compose/util-contains-newline.d.ts +0 -2
- package/dist/compose/util-contains-newline.js +0 -36
- package/dist/compose/util-empty-scalar-position.d.ts +0 -2
- package/dist/compose/util-empty-scalar-position.js +0 -28
- package/dist/compose/util-flow-indent-check.d.ts +0 -3
- package/dist/compose/util-flow-indent-check.js +0 -17
- package/dist/compose/util-map-includes.d.ts +0 -4
- package/dist/compose/util-map-includes.js +0 -15
- package/dist/doc/Document.d.ts +0 -141
- package/dist/doc/Document.js +0 -337
- package/dist/doc/anchors.d.ts +0 -24
- package/dist/doc/anchors.js +0 -76
- package/dist/doc/applyReviver.d.ts +0 -9
- package/dist/doc/applyReviver.js +0 -57
- package/dist/doc/createNode.d.ts +0 -17
- package/dist/doc/createNode.js +0 -90
- package/dist/doc/directives.d.ts +0 -49
- package/dist/doc/directives.js +0 -178
- package/dist/errors.d.ts +0 -21
- package/dist/errors.js +0 -62
- package/dist/log.d.ts +0 -3
- package/dist/log.js +0 -19
- package/dist/nodes/Alias.d.ts +0 -29
- package/dist/nodes/Alias.js +0 -118
- package/dist/nodes/Collection.d.ts +0 -73
- package/dist/nodes/Collection.js +0 -151
- package/dist/nodes/Node.d.ts +0 -53
- package/dist/nodes/Node.js +0 -40
- package/dist/nodes/Pair.d.ts +0 -22
- package/dist/nodes/Pair.js +0 -39
- package/dist/nodes/Scalar.d.ts +0 -47
- package/dist/nodes/Scalar.js +0 -27
- package/dist/nodes/YAMLMap.d.ts +0 -53
- package/dist/nodes/YAMLMap.js +0 -147
- package/dist/nodes/YAMLSeq.d.ts +0 -60
- package/dist/nodes/YAMLSeq.js +0 -115
- package/dist/nodes/addPairToJSMap.d.ts +0 -4
- package/dist/nodes/addPairToJSMap.js +0 -65
- package/dist/nodes/identity.d.ts +0 -23
- package/dist/nodes/identity.js +0 -53
- package/dist/nodes/toJS.d.ts +0 -29
- package/dist/nodes/toJS.js +0 -39
- package/dist/options.d.ts +0 -350
- package/dist/parse/cst-scalar.d.ts +0 -64
- package/dist/parse/cst-scalar.js +0 -218
- package/dist/parse/cst-stringify.d.ts +0 -8
- package/dist/parse/cst-stringify.js +0 -63
- package/dist/parse/cst-visit.d.ts +0 -39
- package/dist/parse/cst-visit.js +0 -99
- package/dist/parse/cst.d.ts +0 -109
- package/dist/parse/cst.js +0 -112
- package/dist/parse/lexer.d.ts +0 -87
- package/dist/parse/lexer.js +0 -719
- package/dist/parse/line-counter.d.ts +0 -22
- package/dist/parse/line-counter.js +0 -41
- package/dist/parse/parser.d.ts +0 -84
- package/dist/parse/parser.js +0 -972
- package/dist/public-api.d.ts +0 -44
- package/dist/public-api.js +0 -107
- package/dist/schema/Schema.d.ts +0 -17
- package/dist/schema/Schema.js +0 -39
- package/dist/schema/common/map.d.ts +0 -2
- package/dist/schema/common/map.js +0 -19
- package/dist/schema/common/null.d.ts +0 -4
- package/dist/schema/common/null.js +0 -17
- package/dist/schema/common/seq.d.ts +0 -2
- package/dist/schema/common/seq.js +0 -19
- package/dist/schema/common/string.d.ts +0 -2
- package/dist/schema/common/string.js +0 -16
- package/dist/schema/core/bool.d.ts +0 -4
- package/dist/schema/core/bool.js +0 -21
- package/dist/schema/core/float.d.ts +0 -4
- package/dist/schema/core/float.js +0 -47
- package/dist/schema/core/int.d.ts +0 -4
- package/dist/schema/core/int.js +0 -42
- package/dist/schema/core/schema.d.ts +0 -1
- package/dist/schema/core/schema.js +0 -25
- package/dist/schema/json/schema.d.ts +0 -2
- package/dist/schema/json/schema.js +0 -64
- package/dist/schema/json-schema.d.ts +0 -69
- package/dist/schema/tags.d.ts +0 -48
- package/dist/schema/tags.js +0 -99
- package/dist/schema/types.d.ts +0 -92
- package/dist/schema/yaml-1.1/binary.d.ts +0 -2
- package/dist/schema/yaml-1.1/binary.js +0 -70
- package/dist/schema/yaml-1.1/bool.d.ts +0 -7
- package/dist/schema/yaml-1.1/bool.js +0 -29
- package/dist/schema/yaml-1.1/float.d.ts +0 -4
- package/dist/schema/yaml-1.1/float.js +0 -50
- package/dist/schema/yaml-1.1/int.d.ts +0 -5
- package/dist/schema/yaml-1.1/int.js +0 -76
- package/dist/schema/yaml-1.1/merge.d.ts +0 -9
- package/dist/schema/yaml-1.1/merge.js +0 -71
- package/dist/schema/yaml-1.1/omap.d.ts +0 -22
- package/dist/schema/yaml-1.1/omap.js +0 -77
- package/dist/schema/yaml-1.1/pairs.d.ts +0 -10
- package/dist/schema/yaml-1.1/pairs.js +0 -82
- package/dist/schema/yaml-1.1/schema.d.ts +0 -1
- package/dist/schema/yaml-1.1/schema.js +0 -41
- package/dist/schema/yaml-1.1/set.d.ts +0 -28
- package/dist/schema/yaml-1.1/set.js +0 -96
- package/dist/schema/yaml-1.1/timestamp.d.ts +0 -6
- package/dist/schema/yaml-1.1/timestamp.js +0 -105
- package/dist/stringify/foldFlowLines.d.ts +0 -34
- package/dist/stringify/foldFlowLines.js +0 -151
- package/dist/stringify/stringify.d.ts +0 -21
- package/dist/stringify/stringify.js +0 -132
- package/dist/stringify/stringifyCollection.d.ts +0 -17
- package/dist/stringify/stringifyCollection.js +0 -155
- package/dist/stringify/stringifyComment.d.ts +0 -10
- package/dist/stringify/stringifyComment.js +0 -24
- package/dist/stringify/stringifyDocument.d.ts +0 -4
- package/dist/stringify/stringifyDocument.js +0 -87
- package/dist/stringify/stringifyNumber.d.ts +0 -2
- package/dist/stringify/stringifyNumber.js +0 -27
- package/dist/stringify/stringifyPair.d.ts +0 -3
- package/dist/stringify/stringifyPair.js +0 -152
- package/dist/stringify/stringifyString.d.ts +0 -9
- package/dist/stringify/stringifyString.js +0 -338
- package/dist/visit.d.ts +0 -102
- package/dist/visit.js +0 -236
- package/util.js +0 -2
|
@@ -1,198 +0,0 @@
|
|
|
1
|
-
import { Scalar } from '../nodes/Scalar.js';
|
|
2
|
-
|
|
3
|
-
function resolveBlockScalar(ctx, scalar, onError) {
|
|
4
|
-
const start = scalar.offset;
|
|
5
|
-
const header = parseBlockScalarHeader(scalar, ctx.options.strict, onError);
|
|
6
|
-
if (!header)
|
|
7
|
-
return { value: '', type: null, comment: '', range: [start, start, start] };
|
|
8
|
-
const type = header.mode === '>' ? Scalar.BLOCK_FOLDED : Scalar.BLOCK_LITERAL;
|
|
9
|
-
const lines = scalar.source ? splitLines(scalar.source) : [];
|
|
10
|
-
// determine the end of content & start of chomping
|
|
11
|
-
let chompStart = lines.length;
|
|
12
|
-
for (let i = lines.length - 1; i >= 0; --i) {
|
|
13
|
-
const content = lines[i][1];
|
|
14
|
-
if (content === '' || content === '\r')
|
|
15
|
-
chompStart = i;
|
|
16
|
-
else
|
|
17
|
-
break;
|
|
18
|
-
}
|
|
19
|
-
// shortcut for empty contents
|
|
20
|
-
if (chompStart === 0) {
|
|
21
|
-
const value = header.chomp === '+' && lines.length > 0
|
|
22
|
-
? '\n'.repeat(Math.max(1, lines.length - 1))
|
|
23
|
-
: '';
|
|
24
|
-
let end = start + header.length;
|
|
25
|
-
if (scalar.source)
|
|
26
|
-
end += scalar.source.length;
|
|
27
|
-
return { value, type, comment: header.comment, range: [start, end, end] };
|
|
28
|
-
}
|
|
29
|
-
// find the indentation level to trim from start
|
|
30
|
-
let trimIndent = scalar.indent + header.indent;
|
|
31
|
-
let offset = scalar.offset + header.length;
|
|
32
|
-
let contentStart = 0;
|
|
33
|
-
for (let i = 0; i < chompStart; ++i) {
|
|
34
|
-
const [indent, content] = lines[i];
|
|
35
|
-
if (content === '' || content === '\r') {
|
|
36
|
-
if (header.indent === 0 && indent.length > trimIndent)
|
|
37
|
-
trimIndent = indent.length;
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
if (indent.length < trimIndent) {
|
|
41
|
-
const message = 'Block scalars with more-indented leading empty lines must use an explicit indentation indicator';
|
|
42
|
-
onError(offset + indent.length, 'MISSING_CHAR', message);
|
|
43
|
-
}
|
|
44
|
-
if (header.indent === 0)
|
|
45
|
-
trimIndent = indent.length;
|
|
46
|
-
contentStart = i;
|
|
47
|
-
if (trimIndent === 0 && !ctx.atRoot) {
|
|
48
|
-
const message = 'Block scalar values in collections must be indented';
|
|
49
|
-
onError(offset, 'BAD_INDENT', message);
|
|
50
|
-
}
|
|
51
|
-
break;
|
|
52
|
-
}
|
|
53
|
-
offset += indent.length + content.length + 1;
|
|
54
|
-
}
|
|
55
|
-
// include trailing more-indented empty lines in content
|
|
56
|
-
for (let i = lines.length - 1; i >= chompStart; --i) {
|
|
57
|
-
if (lines[i][0].length > trimIndent)
|
|
58
|
-
chompStart = i + 1;
|
|
59
|
-
}
|
|
60
|
-
let value = '';
|
|
61
|
-
let sep = '';
|
|
62
|
-
let prevMoreIndented = false;
|
|
63
|
-
// leading whitespace is kept intact
|
|
64
|
-
for (let i = 0; i < contentStart; ++i)
|
|
65
|
-
value += lines[i][0].slice(trimIndent) + '\n';
|
|
66
|
-
for (let i = contentStart; i < chompStart; ++i) {
|
|
67
|
-
let [indent, content] = lines[i];
|
|
68
|
-
offset += indent.length + content.length + 1;
|
|
69
|
-
const crlf = content[content.length - 1] === '\r';
|
|
70
|
-
if (crlf)
|
|
71
|
-
content = content.slice(0, -1);
|
|
72
|
-
/* istanbul ignore if already caught in lexer */
|
|
73
|
-
if (content && indent.length < trimIndent) {
|
|
74
|
-
const src = header.indent
|
|
75
|
-
? 'explicit indentation indicator'
|
|
76
|
-
: 'first line';
|
|
77
|
-
const message = `Block scalar lines must not be less indented than their ${src}`;
|
|
78
|
-
onError(offset - content.length - (crlf ? 2 : 1), 'BAD_INDENT', message);
|
|
79
|
-
indent = '';
|
|
80
|
-
}
|
|
81
|
-
if (type === Scalar.BLOCK_LITERAL) {
|
|
82
|
-
value += sep + indent.slice(trimIndent) + content;
|
|
83
|
-
sep = '\n';
|
|
84
|
-
}
|
|
85
|
-
else if (indent.length > trimIndent || content[0] === '\t') {
|
|
86
|
-
// more-indented content within a folded block
|
|
87
|
-
if (sep === ' ')
|
|
88
|
-
sep = '\n';
|
|
89
|
-
else if (!prevMoreIndented && sep === '\n')
|
|
90
|
-
sep = '\n\n';
|
|
91
|
-
value += sep + indent.slice(trimIndent) + content;
|
|
92
|
-
sep = '\n';
|
|
93
|
-
prevMoreIndented = true;
|
|
94
|
-
}
|
|
95
|
-
else if (content === '') {
|
|
96
|
-
// empty line
|
|
97
|
-
if (sep === '\n')
|
|
98
|
-
value += '\n';
|
|
99
|
-
else
|
|
100
|
-
sep = '\n';
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
value += sep + content;
|
|
104
|
-
sep = ' ';
|
|
105
|
-
prevMoreIndented = false;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
switch (header.chomp) {
|
|
109
|
-
case '-':
|
|
110
|
-
break;
|
|
111
|
-
case '+':
|
|
112
|
-
for (let i = chompStart; i < lines.length; ++i)
|
|
113
|
-
value += '\n' + lines[i][0].slice(trimIndent);
|
|
114
|
-
if (value[value.length - 1] !== '\n')
|
|
115
|
-
value += '\n';
|
|
116
|
-
break;
|
|
117
|
-
default:
|
|
118
|
-
value += '\n';
|
|
119
|
-
}
|
|
120
|
-
const end = start + header.length + scalar.source.length;
|
|
121
|
-
return { value, type, comment: header.comment, range: [start, end, end] };
|
|
122
|
-
}
|
|
123
|
-
function parseBlockScalarHeader({ offset, props }, strict, onError) {
|
|
124
|
-
/* istanbul ignore if should not happen */
|
|
125
|
-
if (props[0].type !== 'block-scalar-header') {
|
|
126
|
-
onError(props[0], 'IMPOSSIBLE', 'Block scalar header not found');
|
|
127
|
-
return null;
|
|
128
|
-
}
|
|
129
|
-
const { source } = props[0];
|
|
130
|
-
const mode = source[0];
|
|
131
|
-
let indent = 0;
|
|
132
|
-
let chomp = '';
|
|
133
|
-
let error = -1;
|
|
134
|
-
for (let i = 1; i < source.length; ++i) {
|
|
135
|
-
const ch = source[i];
|
|
136
|
-
if (!chomp && (ch === '-' || ch === '+'))
|
|
137
|
-
chomp = ch;
|
|
138
|
-
else {
|
|
139
|
-
const n = Number(ch);
|
|
140
|
-
if (!indent && n)
|
|
141
|
-
indent = n;
|
|
142
|
-
else if (error === -1)
|
|
143
|
-
error = offset + i;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
if (error !== -1)
|
|
147
|
-
onError(error, 'UNEXPECTED_TOKEN', `Block scalar header includes extra characters: ${source}`);
|
|
148
|
-
let hasSpace = false;
|
|
149
|
-
let comment = '';
|
|
150
|
-
let length = source.length;
|
|
151
|
-
for (let i = 1; i < props.length; ++i) {
|
|
152
|
-
const token = props[i];
|
|
153
|
-
switch (token.type) {
|
|
154
|
-
case 'space':
|
|
155
|
-
hasSpace = true;
|
|
156
|
-
// fallthrough
|
|
157
|
-
case 'newline':
|
|
158
|
-
length += token.source.length;
|
|
159
|
-
break;
|
|
160
|
-
case 'comment':
|
|
161
|
-
if (strict && !hasSpace) {
|
|
162
|
-
const message = 'Comments must be separated from other tokens by white space characters';
|
|
163
|
-
onError(token, 'MISSING_CHAR', message);
|
|
164
|
-
}
|
|
165
|
-
length += token.source.length;
|
|
166
|
-
comment = token.source.substring(1);
|
|
167
|
-
break;
|
|
168
|
-
case 'error':
|
|
169
|
-
onError(token, 'UNEXPECTED_TOKEN', token.message);
|
|
170
|
-
length += token.source.length;
|
|
171
|
-
break;
|
|
172
|
-
/* istanbul ignore next should not happen */
|
|
173
|
-
default: {
|
|
174
|
-
const message = `Unexpected token in block scalar header: ${token.type}`;
|
|
175
|
-
onError(token, 'UNEXPECTED_TOKEN', message);
|
|
176
|
-
const ts = token.source;
|
|
177
|
-
if (ts && typeof ts === 'string')
|
|
178
|
-
length += ts.length;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
return { mode, indent, chomp, comment, length };
|
|
183
|
-
}
|
|
184
|
-
/** @returns Array of lines split up as `[indent, content]` */
|
|
185
|
-
function splitLines(source) {
|
|
186
|
-
const split = source.split(/\n( *)/);
|
|
187
|
-
const first = split[0];
|
|
188
|
-
const m = first.match(/^( *)/);
|
|
189
|
-
const line0 = m?.[1]
|
|
190
|
-
? [m[1], first.slice(m[1].length)]
|
|
191
|
-
: ['', first];
|
|
192
|
-
const lines = [line0];
|
|
193
|
-
for (let i = 1; i < split.length; i += 2)
|
|
194
|
-
lines.push([split[i], split[i + 1]]);
|
|
195
|
-
return lines;
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
export { resolveBlockScalar };
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { YAMLSeq } from '../nodes/YAMLSeq.js';
|
|
2
|
-
import { resolveProps } from './resolve-props.js';
|
|
3
|
-
import { flowIndentCheck } from './util-flow-indent-check.js';
|
|
4
|
-
|
|
5
|
-
function resolveBlockSeq({ composeNode, composeEmptyNode }, ctx, bs, onError, tag) {
|
|
6
|
-
const NodeClass = tag?.nodeClass ?? YAMLSeq;
|
|
7
|
-
const seq = new NodeClass(ctx.schema);
|
|
8
|
-
if (ctx.atRoot)
|
|
9
|
-
ctx.atRoot = false;
|
|
10
|
-
if (ctx.atKey)
|
|
11
|
-
ctx.atKey = false;
|
|
12
|
-
let offset = bs.offset;
|
|
13
|
-
let commentEnd = null;
|
|
14
|
-
for (const { start, value } of bs.items) {
|
|
15
|
-
const props = resolveProps(start, {
|
|
16
|
-
indicator: 'seq-item-ind',
|
|
17
|
-
next: value,
|
|
18
|
-
offset,
|
|
19
|
-
onError,
|
|
20
|
-
parentIndent: bs.indent,
|
|
21
|
-
startOnNewline: true
|
|
22
|
-
});
|
|
23
|
-
if (!props.found) {
|
|
24
|
-
if (props.anchor || props.tag || value) {
|
|
25
|
-
if (value?.type === 'block-seq')
|
|
26
|
-
onError(props.end, 'BAD_INDENT', 'All sequence items must start at the same column');
|
|
27
|
-
else
|
|
28
|
-
onError(offset, 'MISSING_CHAR', 'Sequence item without - indicator');
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
commentEnd = props.end;
|
|
32
|
-
if (props.comment)
|
|
33
|
-
seq.comment = props.comment;
|
|
34
|
-
continue;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
const node = value
|
|
38
|
-
? composeNode(ctx, value, props, onError)
|
|
39
|
-
: composeEmptyNode(ctx, props.end, start, null, props, onError);
|
|
40
|
-
if (ctx.schema.compat)
|
|
41
|
-
flowIndentCheck(bs.indent, value, onError);
|
|
42
|
-
offset = node.range[2];
|
|
43
|
-
seq.items.push(node);
|
|
44
|
-
}
|
|
45
|
-
seq.range = [bs.offset, offset, commentEnd ?? offset];
|
|
46
|
-
return seq;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export { resolveBlockSeq };
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
function resolveEnd(end, offset, reqSpace, onError) {
|
|
2
|
-
let comment = '';
|
|
3
|
-
if (end) {
|
|
4
|
-
let hasSpace = false;
|
|
5
|
-
let sep = '';
|
|
6
|
-
for (const token of end) {
|
|
7
|
-
const { source, type } = token;
|
|
8
|
-
switch (type) {
|
|
9
|
-
case 'space':
|
|
10
|
-
hasSpace = true;
|
|
11
|
-
break;
|
|
12
|
-
case 'comment': {
|
|
13
|
-
if (reqSpace && !hasSpace)
|
|
14
|
-
onError(token, 'MISSING_CHAR', 'Comments must be separated from other tokens by white space characters');
|
|
15
|
-
const cb = source.substring(1) || ' ';
|
|
16
|
-
if (!comment)
|
|
17
|
-
comment = cb;
|
|
18
|
-
else
|
|
19
|
-
comment += sep + cb;
|
|
20
|
-
sep = '';
|
|
21
|
-
break;
|
|
22
|
-
}
|
|
23
|
-
case 'newline':
|
|
24
|
-
if (comment)
|
|
25
|
-
sep += source;
|
|
26
|
-
hasSpace = true;
|
|
27
|
-
break;
|
|
28
|
-
default:
|
|
29
|
-
onError(token, 'UNEXPECTED_TOKEN', `Unexpected ${type} at node end`);
|
|
30
|
-
}
|
|
31
|
-
offset += source.length;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
return { comment, offset };
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export { resolveEnd };
|
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
import { isPair } from '../nodes/identity.js';
|
|
2
|
-
import { Pair } from '../nodes/Pair.js';
|
|
3
|
-
import { YAMLMap } from '../nodes/YAMLMap.js';
|
|
4
|
-
import { YAMLSeq } from '../nodes/YAMLSeq.js';
|
|
5
|
-
import { resolveEnd } from './resolve-end.js';
|
|
6
|
-
import { resolveProps } from './resolve-props.js';
|
|
7
|
-
import { containsNewline } from './util-contains-newline.js';
|
|
8
|
-
import { mapIncludes } from './util-map-includes.js';
|
|
9
|
-
|
|
10
|
-
const blockMsg = 'Block collections are not allowed within flow collections';
|
|
11
|
-
const isBlock = (token) => token && (token.type === 'block-map' || token.type === 'block-seq');
|
|
12
|
-
function resolveFlowCollection({ composeNode, composeEmptyNode }, ctx, fc, onError, tag) {
|
|
13
|
-
const isMap = fc.start.source === '{';
|
|
14
|
-
const fcName = isMap ? 'flow map' : 'flow sequence';
|
|
15
|
-
const NodeClass = (tag?.nodeClass ?? (isMap ? YAMLMap : YAMLSeq));
|
|
16
|
-
const coll = new NodeClass(ctx.schema);
|
|
17
|
-
coll.flow = true;
|
|
18
|
-
const atRoot = ctx.atRoot;
|
|
19
|
-
if (atRoot)
|
|
20
|
-
ctx.atRoot = false;
|
|
21
|
-
if (ctx.atKey)
|
|
22
|
-
ctx.atKey = false;
|
|
23
|
-
let offset = fc.offset + fc.start.source.length;
|
|
24
|
-
for (let i = 0; i < fc.items.length; ++i) {
|
|
25
|
-
const collItem = fc.items[i];
|
|
26
|
-
const { start, key, sep, value } = collItem;
|
|
27
|
-
const props = resolveProps(start, {
|
|
28
|
-
flow: fcName,
|
|
29
|
-
indicator: 'explicit-key-ind',
|
|
30
|
-
next: key ?? sep?.[0],
|
|
31
|
-
offset,
|
|
32
|
-
onError,
|
|
33
|
-
parentIndent: fc.indent,
|
|
34
|
-
startOnNewline: false
|
|
35
|
-
});
|
|
36
|
-
if (!props.found) {
|
|
37
|
-
if (!props.anchor && !props.tag && !sep && !value) {
|
|
38
|
-
if (i === 0 && props.comma)
|
|
39
|
-
onError(props.comma, 'UNEXPECTED_TOKEN', `Unexpected , in ${fcName}`);
|
|
40
|
-
else if (i < fc.items.length - 1)
|
|
41
|
-
onError(props.start, 'UNEXPECTED_TOKEN', `Unexpected empty item in ${fcName}`);
|
|
42
|
-
if (props.comment) {
|
|
43
|
-
if (coll.comment)
|
|
44
|
-
coll.comment += '\n' + props.comment;
|
|
45
|
-
else
|
|
46
|
-
coll.comment = props.comment;
|
|
47
|
-
}
|
|
48
|
-
offset = props.end;
|
|
49
|
-
continue;
|
|
50
|
-
}
|
|
51
|
-
if (!isMap && ctx.options.strict && containsNewline(key))
|
|
52
|
-
onError(key, // checked by containsNewline()
|
|
53
|
-
'MULTILINE_IMPLICIT_KEY', 'Implicit keys of flow sequence pairs need to be on a single line');
|
|
54
|
-
}
|
|
55
|
-
if (i === 0) {
|
|
56
|
-
if (props.comma)
|
|
57
|
-
onError(props.comma, 'UNEXPECTED_TOKEN', `Unexpected , in ${fcName}`);
|
|
58
|
-
}
|
|
59
|
-
else {
|
|
60
|
-
if (!props.comma)
|
|
61
|
-
onError(props.start, 'MISSING_CHAR', `Missing , between ${fcName} items`);
|
|
62
|
-
if (props.comment) {
|
|
63
|
-
let prevItemComment = '';
|
|
64
|
-
loop: for (const st of start) {
|
|
65
|
-
switch (st.type) {
|
|
66
|
-
case 'comma':
|
|
67
|
-
case 'space':
|
|
68
|
-
break;
|
|
69
|
-
case 'comment':
|
|
70
|
-
prevItemComment = st.source.substring(1);
|
|
71
|
-
break loop;
|
|
72
|
-
default:
|
|
73
|
-
break loop;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
if (prevItemComment) {
|
|
77
|
-
let prev = coll.items[coll.items.length - 1];
|
|
78
|
-
if (isPair(prev))
|
|
79
|
-
prev = prev.value ?? prev.key;
|
|
80
|
-
if (prev.comment)
|
|
81
|
-
prev.comment += '\n' + prevItemComment;
|
|
82
|
-
else
|
|
83
|
-
prev.comment = prevItemComment;
|
|
84
|
-
props.comment = props.comment.substring(prevItemComment.length + 1);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
if (!isMap && !sep && !props.found) {
|
|
89
|
-
// item is a value in a seq
|
|
90
|
-
// → key & sep are empty, start does not include ? or :
|
|
91
|
-
const valueNode = value
|
|
92
|
-
? composeNode(ctx, value, props, onError)
|
|
93
|
-
: composeEmptyNode(ctx, props.end, sep, null, props, onError);
|
|
94
|
-
coll.items.push(valueNode);
|
|
95
|
-
offset = valueNode.range[2];
|
|
96
|
-
if (isBlock(value))
|
|
97
|
-
onError(valueNode.range, 'BLOCK_IN_FLOW', blockMsg);
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
// item is a key+value pair
|
|
101
|
-
// key value
|
|
102
|
-
ctx.atKey = true;
|
|
103
|
-
const keyStart = props.end;
|
|
104
|
-
const keyNode = key
|
|
105
|
-
? composeNode(ctx, key, props, onError)
|
|
106
|
-
: composeEmptyNode(ctx, keyStart, start, null, props, onError);
|
|
107
|
-
if (isBlock(key))
|
|
108
|
-
onError(keyNode.range, 'BLOCK_IN_FLOW', blockMsg);
|
|
109
|
-
ctx.atKey = false;
|
|
110
|
-
// value properties
|
|
111
|
-
const valueProps = resolveProps(sep ?? [], {
|
|
112
|
-
flow: fcName,
|
|
113
|
-
indicator: 'map-value-ind',
|
|
114
|
-
next: value,
|
|
115
|
-
offset: keyNode.range[2],
|
|
116
|
-
onError,
|
|
117
|
-
parentIndent: fc.indent,
|
|
118
|
-
startOnNewline: false
|
|
119
|
-
});
|
|
120
|
-
if (valueProps.found) {
|
|
121
|
-
if (!isMap && !props.found && ctx.options.strict) {
|
|
122
|
-
if (sep)
|
|
123
|
-
for (const st of sep) {
|
|
124
|
-
if (st === valueProps.found)
|
|
125
|
-
break;
|
|
126
|
-
if (st.type === 'newline') {
|
|
127
|
-
onError(st, 'MULTILINE_IMPLICIT_KEY', 'Implicit keys of flow sequence pairs need to be on a single line');
|
|
128
|
-
break;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
if (props.start < valueProps.found.offset - 1024)
|
|
132
|
-
onError(valueProps.found, 'KEY_OVER_1024_CHARS', 'The : indicator must be at most 1024 chars after the start of an implicit flow sequence key');
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
else if (value) {
|
|
136
|
-
if ('source' in value && value.source?.[0] === ':')
|
|
137
|
-
onError(value, 'MISSING_CHAR', `Missing space after : in ${fcName}`);
|
|
138
|
-
else
|
|
139
|
-
onError(valueProps.start, 'MISSING_CHAR', `Missing , or : between ${fcName} items`);
|
|
140
|
-
}
|
|
141
|
-
// value value
|
|
142
|
-
const valueNode = value
|
|
143
|
-
? composeNode(ctx, value, valueProps, onError)
|
|
144
|
-
: valueProps.found
|
|
145
|
-
? composeEmptyNode(ctx, valueProps.end, sep, null, valueProps, onError)
|
|
146
|
-
: null;
|
|
147
|
-
if (valueNode) {
|
|
148
|
-
if (isBlock(value))
|
|
149
|
-
onError(valueNode.range, 'BLOCK_IN_FLOW', blockMsg);
|
|
150
|
-
}
|
|
151
|
-
else if (valueProps.comment) {
|
|
152
|
-
if (keyNode.comment)
|
|
153
|
-
keyNode.comment += '\n' + valueProps.comment;
|
|
154
|
-
else
|
|
155
|
-
keyNode.comment = valueProps.comment;
|
|
156
|
-
}
|
|
157
|
-
const pair = new Pair(keyNode, valueNode);
|
|
158
|
-
if (ctx.options.keepSourceTokens)
|
|
159
|
-
pair.srcToken = collItem;
|
|
160
|
-
if (isMap) {
|
|
161
|
-
const map = coll;
|
|
162
|
-
if (mapIncludes(ctx, map.items, keyNode))
|
|
163
|
-
onError(keyStart, 'DUPLICATE_KEY', 'Map keys must be unique');
|
|
164
|
-
map.items.push(pair);
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
const map = new YAMLMap(ctx.schema);
|
|
168
|
-
map.flow = true;
|
|
169
|
-
map.items.push(pair);
|
|
170
|
-
const endRange = (valueNode ?? keyNode).range;
|
|
171
|
-
map.range = [keyNode.range[0], endRange[1], endRange[2]];
|
|
172
|
-
coll.items.push(map);
|
|
173
|
-
}
|
|
174
|
-
offset = valueNode ? valueNode.range[2] : valueProps.end;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
const expectedEnd = isMap ? '}' : ']';
|
|
178
|
-
const [ce, ...ee] = fc.end;
|
|
179
|
-
let cePos = offset;
|
|
180
|
-
if (ce?.source === expectedEnd)
|
|
181
|
-
cePos = ce.offset + ce.source.length;
|
|
182
|
-
else {
|
|
183
|
-
const name = fcName[0].toUpperCase() + fcName.substring(1);
|
|
184
|
-
const msg = atRoot
|
|
185
|
-
? `${name} must end with a ${expectedEnd}`
|
|
186
|
-
: `${name} in block collection must be sufficiently indented and end with a ${expectedEnd}`;
|
|
187
|
-
onError(offset, atRoot ? 'MISSING_CHAR' : 'BAD_INDENT', msg);
|
|
188
|
-
if (ce && ce.source.length !== 1)
|
|
189
|
-
ee.unshift(ce);
|
|
190
|
-
}
|
|
191
|
-
if (ee.length > 0) {
|
|
192
|
-
const end = resolveEnd(ee, cePos, ctx.options.strict, onError);
|
|
193
|
-
if (end.comment) {
|
|
194
|
-
if (coll.comment)
|
|
195
|
-
coll.comment += '\n' + end.comment;
|
|
196
|
-
else
|
|
197
|
-
coll.comment = end.comment;
|
|
198
|
-
}
|
|
199
|
-
coll.range = [fc.offset, cePos, end.offset];
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
coll.range = [fc.offset, cePos, cePos];
|
|
203
|
-
}
|
|
204
|
-
return coll;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
export { resolveFlowCollection };
|