yaml 2.1.2 → 2.2.0
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/browser/dist/compose/resolve-block-map.js +5 -2
- package/browser/dist/compose/resolve-block-seq.js +5 -5
- package/browser/dist/nodes/YAMLMap.js +3 -3
- package/browser/dist/nodes/YAMLSeq.js +3 -3
- package/browser/dist/stringify/stringify.js +2 -0
- package/browser/dist/stringify/stringifyCollection.js +2 -2
- package/browser/dist/stringify/stringifyPair.js +45 -20
- package/dist/compose/compose-node.d.ts +1 -1
- package/dist/compose/composer.d.ts +2 -2
- package/dist/compose/resolve-block-map.js +5 -2
- package/dist/compose/resolve-block-seq.js +5 -5
- package/dist/doc/Document.d.ts +1 -1
- package/dist/doc/applyReviver.d.ts +1 -1
- package/dist/errors.d.ts +2 -2
- package/dist/log.d.ts +1 -1
- package/dist/nodes/Node.d.ts +4 -4
- package/dist/nodes/YAMLMap.d.ts +1 -1
- package/dist/nodes/YAMLMap.js +3 -3
- package/dist/nodes/YAMLSeq.js +3 -3
- package/dist/options.d.ts +13 -6
- package/dist/parse/cst-visit.d.ts +2 -2
- package/dist/parse/cst.d.ts +3 -3
- package/dist/schema/json-schema.d.ts +2 -2
- package/dist/schema/tags.d.ts +2 -2
- package/dist/schema/types.d.ts +1 -1
- package/dist/stringify/foldFlowLines.d.ts +1 -1
- package/dist/stringify/stringify.d.ts +2 -1
- package/dist/stringify/stringify.js +2 -0
- package/dist/stringify/stringifyCollection.js +2 -2
- package/dist/stringify/stringifyPair.js +45 -20
- package/dist/stringify/stringifyString.d.ts +7 -1
- package/dist/visit.d.ts +4 -4
- package/package.json +9 -9
|
@@ -11,6 +11,7 @@ function resolveBlockMap({ composeNode, composeEmptyNode }, ctx, bm, onError) {
|
|
|
11
11
|
if (ctx.atRoot)
|
|
12
12
|
ctx.atRoot = false;
|
|
13
13
|
let offset = bm.offset;
|
|
14
|
+
let commentEnd = null;
|
|
14
15
|
for (const collItem of bm.items) {
|
|
15
16
|
const { start, key, sep, value } = collItem;
|
|
16
17
|
// key properties
|
|
@@ -30,7 +31,7 @@ function resolveBlockMap({ composeNode, composeEmptyNode }, ctx, bm, onError) {
|
|
|
30
31
|
onError(offset, 'BAD_INDENT', startColMsg);
|
|
31
32
|
}
|
|
32
33
|
if (!keyProps.anchor && !keyProps.tag && !sep) {
|
|
33
|
-
|
|
34
|
+
commentEnd = keyProps.end;
|
|
34
35
|
if (keyProps.comment) {
|
|
35
36
|
if (map.comment)
|
|
36
37
|
map.comment += '\n' + keyProps.comment;
|
|
@@ -100,7 +101,9 @@ function resolveBlockMap({ composeNode, composeEmptyNode }, ctx, bm, onError) {
|
|
|
100
101
|
map.items.push(pair);
|
|
101
102
|
}
|
|
102
103
|
}
|
|
103
|
-
|
|
104
|
+
if (commentEnd && commentEnd < offset)
|
|
105
|
+
onError(commentEnd, 'IMPOSSIBLE', 'Map comment with trailing content');
|
|
106
|
+
map.range = [bm.offset, offset, commentEnd ?? offset];
|
|
104
107
|
return map;
|
|
105
108
|
}
|
|
106
109
|
|
|
@@ -7,6 +7,7 @@ function resolveBlockSeq({ composeNode, composeEmptyNode }, ctx, bs, onError) {
|
|
|
7
7
|
if (ctx.atRoot)
|
|
8
8
|
ctx.atRoot = false;
|
|
9
9
|
let offset = bs.offset;
|
|
10
|
+
let commentEnd = null;
|
|
10
11
|
for (const { start, value } of bs.items) {
|
|
11
12
|
const props = resolveProps(start, {
|
|
12
13
|
indicator: 'seq-item-ind',
|
|
@@ -15,16 +16,15 @@ function resolveBlockSeq({ composeNode, composeEmptyNode }, ctx, bs, onError) {
|
|
|
15
16
|
onError,
|
|
16
17
|
startOnNewline: true
|
|
17
18
|
});
|
|
18
|
-
offset = props.end;
|
|
19
19
|
if (!props.found) {
|
|
20
20
|
if (props.anchor || props.tag || value) {
|
|
21
21
|
if (value && value.type === 'block-seq')
|
|
22
|
-
onError(
|
|
22
|
+
onError(props.end, 'BAD_INDENT', 'All sequence items must start at the same column');
|
|
23
23
|
else
|
|
24
24
|
onError(offset, 'MISSING_CHAR', 'Sequence item without - indicator');
|
|
25
25
|
}
|
|
26
26
|
else {
|
|
27
|
-
|
|
27
|
+
commentEnd = props.end;
|
|
28
28
|
if (props.comment)
|
|
29
29
|
seq.comment = props.comment;
|
|
30
30
|
continue;
|
|
@@ -32,13 +32,13 @@ function resolveBlockSeq({ composeNode, composeEmptyNode }, ctx, bs, onError) {
|
|
|
32
32
|
}
|
|
33
33
|
const node = value
|
|
34
34
|
? composeNode(ctx, value, props, onError)
|
|
35
|
-
: composeEmptyNode(ctx,
|
|
35
|
+
: composeEmptyNode(ctx, props.end, start, null, props, onError);
|
|
36
36
|
if (ctx.schema.compat)
|
|
37
37
|
flowIndentCheck(bs.indent, value, onError);
|
|
38
38
|
offset = node.range[2];
|
|
39
39
|
seq.items.push(node);
|
|
40
40
|
}
|
|
41
|
-
seq.range = [bs.offset, offset, offset];
|
|
41
|
+
seq.range = [bs.offset, offset, commentEnd ?? offset];
|
|
42
42
|
return seq;
|
|
43
43
|
}
|
|
44
44
|
|
|
@@ -18,13 +18,13 @@ function findPair(items, key) {
|
|
|
18
18
|
return undefined;
|
|
19
19
|
}
|
|
20
20
|
class YAMLMap extends Collection {
|
|
21
|
+
static get tagName() {
|
|
22
|
+
return 'tag:yaml.org,2002:map';
|
|
23
|
+
}
|
|
21
24
|
constructor(schema) {
|
|
22
25
|
super(MAP, schema);
|
|
23
26
|
this.items = [];
|
|
24
27
|
}
|
|
25
|
-
static get tagName() {
|
|
26
|
-
return 'tag:yaml.org,2002:map';
|
|
27
|
-
}
|
|
28
28
|
/**
|
|
29
29
|
* Adds a value to the collection.
|
|
30
30
|
*
|
|
@@ -5,13 +5,13 @@ import { isScalarValue } from './Scalar.js';
|
|
|
5
5
|
import { toJS } from './toJS.js';
|
|
6
6
|
|
|
7
7
|
class YAMLSeq extends Collection {
|
|
8
|
+
static get tagName() {
|
|
9
|
+
return 'tag:yaml.org,2002:seq';
|
|
10
|
+
}
|
|
8
11
|
constructor(schema) {
|
|
9
12
|
super(SEQ, schema);
|
|
10
13
|
this.items = [];
|
|
11
14
|
}
|
|
12
|
-
static get tagName() {
|
|
13
|
-
return 'tag:yaml.org,2002:seq';
|
|
14
|
-
}
|
|
15
15
|
add(value) {
|
|
16
16
|
this.items.push(value);
|
|
17
17
|
}
|
|
@@ -13,6 +13,7 @@ function createStringifyContext(doc, options) {
|
|
|
13
13
|
doubleQuotedAsJSON: false,
|
|
14
14
|
doubleQuotedMinMultiLineLength: 40,
|
|
15
15
|
falseStr: 'false',
|
|
16
|
+
flowCollectionPadding: true,
|
|
16
17
|
indentSeq: true,
|
|
17
18
|
lineWidth: 80,
|
|
18
19
|
minContentWidth: 20,
|
|
@@ -36,6 +37,7 @@ function createStringifyContext(doc, options) {
|
|
|
36
37
|
return {
|
|
37
38
|
anchors: new Set(),
|
|
38
39
|
doc,
|
|
40
|
+
flowCollectionPadding: opt.flowCollectionPadding ? ' ' : '',
|
|
39
41
|
indent: '',
|
|
40
42
|
indentStep: typeof opt.indent === 'number' ? ' '.repeat(opt.indent) : ' ',
|
|
41
43
|
inFlow,
|
|
@@ -60,7 +60,7 @@ function stringifyBlockCollection({ comment, items }, ctx, { blockItemPrefix, fl
|
|
|
60
60
|
return str;
|
|
61
61
|
}
|
|
62
62
|
function stringifyFlowCollection({ comment, items }, ctx, { flowChars, itemIndent, onComment }) {
|
|
63
|
-
const { indent, indentStep, options: { commentString } } = ctx;
|
|
63
|
+
const { indent, indentStep, flowCollectionPadding: fcPadding, options: { commentString } } = ctx;
|
|
64
64
|
itemIndent += indentStep;
|
|
65
65
|
const itemCtx = Object.assign({}, ctx, {
|
|
66
66
|
indent: itemIndent,
|
|
@@ -129,7 +129,7 @@ function stringifyFlowCollection({ comment, items }, ctx, { flowChars, itemInden
|
|
|
129
129
|
str += `\n${indent}${end}`;
|
|
130
130
|
}
|
|
131
131
|
else {
|
|
132
|
-
str = `${start}
|
|
132
|
+
str = `${start}${fcPadding}${lines.join(' ')}${fcPadding}${end}`;
|
|
133
133
|
}
|
|
134
134
|
}
|
|
135
135
|
if (comment) {
|
|
@@ -63,19 +63,18 @@ function stringifyPair({ key, value }, ctx, onComment, onChompKeep) {
|
|
|
63
63
|
if (keyComment)
|
|
64
64
|
str += lineComment(str, ctx.indent, commentString(keyComment));
|
|
65
65
|
}
|
|
66
|
-
let vcb
|
|
67
|
-
let valueComment = null;
|
|
66
|
+
let vsb, vcb, valueComment;
|
|
68
67
|
if (isNode(value)) {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
if (value.commentBefore) {
|
|
72
|
-
const cs = commentString(value.commentBefore);
|
|
73
|
-
vcb += `\n${indentComment(cs, ctx.indent)}`;
|
|
74
|
-
}
|
|
68
|
+
vsb = !!value.spaceBefore;
|
|
69
|
+
vcb = value.commentBefore;
|
|
75
70
|
valueComment = value.comment;
|
|
76
71
|
}
|
|
77
|
-
else
|
|
78
|
-
|
|
72
|
+
else {
|
|
73
|
+
vsb = false;
|
|
74
|
+
vcb = null;
|
|
75
|
+
valueComment = null;
|
|
76
|
+
if (value && typeof value === 'object')
|
|
77
|
+
value = doc.createNode(value);
|
|
79
78
|
}
|
|
80
79
|
ctx.implicitKey = false;
|
|
81
80
|
if (!explicitKey && !keyComment && isScalar(value))
|
|
@@ -90,24 +89,50 @@ function stringifyPair({ key, value }, ctx, onComment, onChompKeep) {
|
|
|
90
89
|
!value.tag &&
|
|
91
90
|
!value.anchor) {
|
|
92
91
|
// If indentSeq === false, consider '- ' as part of indentation where possible
|
|
93
|
-
ctx.indent = ctx.indent.
|
|
92
|
+
ctx.indent = ctx.indent.substring(2);
|
|
94
93
|
}
|
|
95
94
|
let valueCommentDone = false;
|
|
96
95
|
const valueStr = stringify(value, ctx, () => (valueCommentDone = true), () => (chompKeep = true));
|
|
97
96
|
let ws = ' ';
|
|
98
|
-
if (
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
ws
|
|
97
|
+
if (keyComment || vsb || vcb) {
|
|
98
|
+
ws = vsb ? '\n' : '';
|
|
99
|
+
if (vcb) {
|
|
100
|
+
const cs = commentString(vcb);
|
|
101
|
+
ws += `\n${indentComment(cs, ctx.indent)}`;
|
|
102
|
+
}
|
|
103
|
+
if (valueStr === '' && !ctx.inFlow) {
|
|
104
|
+
if (ws === '\n')
|
|
105
|
+
ws = '\n\n';
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
ws += `\n${ctx.indent}`;
|
|
109
|
+
}
|
|
103
110
|
}
|
|
104
111
|
else if (!explicitKey && isCollection(value)) {
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
|
|
112
|
+
const vs0 = valueStr[0];
|
|
113
|
+
const nl0 = valueStr.indexOf('\n');
|
|
114
|
+
const hasNewline = nl0 !== -1;
|
|
115
|
+
const flow = ctx.inFlow ?? value.flow ?? value.items.length === 0;
|
|
116
|
+
if (hasNewline || !flow) {
|
|
117
|
+
let hasPropsLine = false;
|
|
118
|
+
if (hasNewline && (vs0 === '&' || vs0 === '!')) {
|
|
119
|
+
let sp0 = valueStr.indexOf(' ');
|
|
120
|
+
if (vs0 === '&' &&
|
|
121
|
+
sp0 !== -1 &&
|
|
122
|
+
sp0 < nl0 &&
|
|
123
|
+
valueStr[sp0 + 1] === '!') {
|
|
124
|
+
sp0 = valueStr.indexOf(' ', sp0 + 1);
|
|
125
|
+
}
|
|
126
|
+
if (sp0 === -1 || nl0 < sp0)
|
|
127
|
+
hasPropsLine = true;
|
|
128
|
+
}
|
|
129
|
+
if (!hasPropsLine)
|
|
130
|
+
ws = `\n${ctx.indent}`;
|
|
131
|
+
}
|
|
108
132
|
}
|
|
109
|
-
else if (valueStr === '' || valueStr[0] === '\n')
|
|
133
|
+
else if (valueStr === '' || valueStr[0] === '\n') {
|
|
110
134
|
ws = '';
|
|
135
|
+
}
|
|
111
136
|
str += ws + valueStr;
|
|
112
137
|
if (ctx.inFlow) {
|
|
113
138
|
if (valueCommentDone && onComment)
|
|
@@ -21,7 +21,7 @@ declare const CN: {
|
|
|
21
21
|
composeNode: typeof composeNode;
|
|
22
22
|
composeEmptyNode: typeof composeEmptyNode;
|
|
23
23
|
};
|
|
24
|
-
export
|
|
24
|
+
export type ComposeNode = typeof CN;
|
|
25
25
|
export declare function composeNode(ctx: ComposeContext, token: Token, props: Props, onError: ComposeErrorHandler): ParsedNode;
|
|
26
26
|
export declare function composeEmptyNode(ctx: ComposeContext, offset: number, before: Token[] | undefined, pos: number | null, { spaceBefore, comment, anchor, tag, end }: Props, onError: ComposeErrorHandler): import("../index.js").Scalar.Parsed;
|
|
27
27
|
export {};
|
|
@@ -4,11 +4,11 @@ import { ErrorCode, YAMLParseError, YAMLWarning } from '../errors.js';
|
|
|
4
4
|
import { Range } from '../nodes/Node.js';
|
|
5
5
|
import type { DocumentOptions, ParseOptions, SchemaOptions } from '../options.js';
|
|
6
6
|
import type { Token } from '../parse/cst.js';
|
|
7
|
-
|
|
7
|
+
type ErrorSource = number | [number, number] | Range | {
|
|
8
8
|
offset: number;
|
|
9
9
|
source?: string;
|
|
10
10
|
};
|
|
11
|
-
export
|
|
11
|
+
export type ComposeErrorHandler = (source: ErrorSource, code: ErrorCode, message: string, warning?: boolean) => void;
|
|
12
12
|
/**
|
|
13
13
|
* Compose a stream of CST nodes into a stream of YAML Documents.
|
|
14
14
|
*
|
|
@@ -13,6 +13,7 @@ function resolveBlockMap({ composeNode, composeEmptyNode }, ctx, bm, onError) {
|
|
|
13
13
|
if (ctx.atRoot)
|
|
14
14
|
ctx.atRoot = false;
|
|
15
15
|
let offset = bm.offset;
|
|
16
|
+
let commentEnd = null;
|
|
16
17
|
for (const collItem of bm.items) {
|
|
17
18
|
const { start, key, sep, value } = collItem;
|
|
18
19
|
// key properties
|
|
@@ -32,7 +33,7 @@ function resolveBlockMap({ composeNode, composeEmptyNode }, ctx, bm, onError) {
|
|
|
32
33
|
onError(offset, 'BAD_INDENT', startColMsg);
|
|
33
34
|
}
|
|
34
35
|
if (!keyProps.anchor && !keyProps.tag && !sep) {
|
|
35
|
-
|
|
36
|
+
commentEnd = keyProps.end;
|
|
36
37
|
if (keyProps.comment) {
|
|
37
38
|
if (map.comment)
|
|
38
39
|
map.comment += '\n' + keyProps.comment;
|
|
@@ -102,7 +103,9 @@ function resolveBlockMap({ composeNode, composeEmptyNode }, ctx, bm, onError) {
|
|
|
102
103
|
map.items.push(pair);
|
|
103
104
|
}
|
|
104
105
|
}
|
|
105
|
-
|
|
106
|
+
if (commentEnd && commentEnd < offset)
|
|
107
|
+
onError(commentEnd, 'IMPOSSIBLE', 'Map comment with trailing content');
|
|
108
|
+
map.range = [bm.offset, offset, commentEnd ?? offset];
|
|
106
109
|
return map;
|
|
107
110
|
}
|
|
108
111
|
|
|
@@ -9,6 +9,7 @@ function resolveBlockSeq({ composeNode, composeEmptyNode }, ctx, bs, onError) {
|
|
|
9
9
|
if (ctx.atRoot)
|
|
10
10
|
ctx.atRoot = false;
|
|
11
11
|
let offset = bs.offset;
|
|
12
|
+
let commentEnd = null;
|
|
12
13
|
for (const { start, value } of bs.items) {
|
|
13
14
|
const props = resolveProps.resolveProps(start, {
|
|
14
15
|
indicator: 'seq-item-ind',
|
|
@@ -17,16 +18,15 @@ function resolveBlockSeq({ composeNode, composeEmptyNode }, ctx, bs, onError) {
|
|
|
17
18
|
onError,
|
|
18
19
|
startOnNewline: true
|
|
19
20
|
});
|
|
20
|
-
offset = props.end;
|
|
21
21
|
if (!props.found) {
|
|
22
22
|
if (props.anchor || props.tag || value) {
|
|
23
23
|
if (value && value.type === 'block-seq')
|
|
24
|
-
onError(
|
|
24
|
+
onError(props.end, 'BAD_INDENT', 'All sequence items must start at the same column');
|
|
25
25
|
else
|
|
26
26
|
onError(offset, 'MISSING_CHAR', 'Sequence item without - indicator');
|
|
27
27
|
}
|
|
28
28
|
else {
|
|
29
|
-
|
|
29
|
+
commentEnd = props.end;
|
|
30
30
|
if (props.comment)
|
|
31
31
|
seq.comment = props.comment;
|
|
32
32
|
continue;
|
|
@@ -34,13 +34,13 @@ function resolveBlockSeq({ composeNode, composeEmptyNode }, ctx, bs, onError) {
|
|
|
34
34
|
}
|
|
35
35
|
const node = value
|
|
36
36
|
? composeNode(ctx, value, props, onError)
|
|
37
|
-
: composeEmptyNode(ctx,
|
|
37
|
+
: composeEmptyNode(ctx, props.end, start, null, props, onError);
|
|
38
38
|
if (ctx.schema.compat)
|
|
39
39
|
utilFlowIndentCheck.flowIndentCheck(bs.indent, value, onError);
|
|
40
40
|
offset = node.range[2];
|
|
41
41
|
seq.items.push(node);
|
|
42
42
|
}
|
|
43
|
-
seq.range = [bs.offset, offset, offset];
|
|
43
|
+
seq.range = [bs.offset, offset, commentEnd ?? offset];
|
|
44
44
|
return seq;
|
|
45
45
|
}
|
|
46
46
|
|
package/dist/doc/Document.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ import type { YAMLSeq } from '../nodes/YAMLSeq.js';
|
|
|
8
8
|
import type { CreateNodeOptions, DocumentOptions, ParseOptions, SchemaOptions, ToJSOptions, ToStringOptions } from '../options.js';
|
|
9
9
|
import { Schema } from '../schema/Schema.js';
|
|
10
10
|
import { Directives } from './directives.js';
|
|
11
|
-
export
|
|
11
|
+
export type Replacer = any[] | ((key: any, value: any) => unknown);
|
|
12
12
|
export declare namespace Document {
|
|
13
13
|
interface Parsed<T extends ParsedNode = ParsedNode> extends Document<T> {
|
|
14
14
|
directives: Directives;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export
|
|
1
|
+
export type Reviver = (key: unknown, value: unknown) => unknown;
|
|
2
2
|
/**
|
|
3
3
|
* Applies the JSON.parse reviver algorithm as defined in the ECMA-262 spec,
|
|
4
4
|
* in section 24.5.1.1 "Runtime Semantics: InternalizeJSONProperty" of the
|
package/dist/errors.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { LineCounter } from './parse/line-counter';
|
|
2
|
-
export
|
|
3
|
-
export
|
|
2
|
+
export type ErrorCode = 'ALIAS_PROPS' | 'BAD_ALIAS' | 'BAD_DIRECTIVE' | 'BAD_DQ_ESCAPE' | 'BAD_INDENT' | 'BAD_PROP_ORDER' | 'BAD_SCALAR_START' | 'BLOCK_AS_IMPLICIT_KEY' | 'BLOCK_IN_FLOW' | 'DUPLICATE_KEY' | 'IMPOSSIBLE' | 'KEY_OVER_1024_CHARS' | 'MISSING_CHAR' | 'MULTILINE_IMPLICIT_KEY' | 'MULTIPLE_ANCHORS' | 'MULTIPLE_DOCS' | 'MULTIPLE_TAGS' | 'TAB_AS_INDENT' | 'TAG_RESOLVE_FAILED' | 'UNEXPECTED_TOKEN';
|
|
3
|
+
export type LinePos = {
|
|
4
4
|
line: number;
|
|
5
5
|
col: number;
|
|
6
6
|
};
|
package/dist/log.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export
|
|
1
|
+
export type LogLevelId = 'silent' | 'error' | 'warn' | 'debug';
|
|
2
2
|
export declare function debug(logLevel: LogLevelId, ...messages: any[]): void;
|
|
3
3
|
export declare function warn(logLevel: LogLevelId, warning: string | Error): void;
|
package/dist/nodes/Node.d.ts
CHANGED
|
@@ -6,15 +6,15 @@ import type { Pair } from './Pair.js';
|
|
|
6
6
|
import type { Scalar } from './Scalar.js';
|
|
7
7
|
import type { YAMLMap } from './YAMLMap.js';
|
|
8
8
|
import type { YAMLSeq } from './YAMLSeq.js';
|
|
9
|
-
export
|
|
9
|
+
export type Node<T = unknown> = Alias | Scalar<T> | YAMLMap<unknown, T> | YAMLSeq<T>;
|
|
10
10
|
/** Utility type mapper */
|
|
11
|
-
export
|
|
11
|
+
export type NodeType<T> = T extends string | number | bigint | boolean | null ? Scalar<T> : T extends Array<any> ? YAMLSeq<NodeType<T[number]>> : T extends {
|
|
12
12
|
[key: string]: any;
|
|
13
13
|
} ? YAMLMap<NodeType<keyof T>, NodeType<T[keyof T]>> : T extends {
|
|
14
14
|
[key: number]: any;
|
|
15
15
|
} ? YAMLMap<NodeType<keyof T>, NodeType<T[keyof T]>> : Node;
|
|
16
|
-
export
|
|
17
|
-
export
|
|
16
|
+
export type ParsedNode = Alias.Parsed | Scalar.Parsed | YAMLMap.Parsed | YAMLSeq.Parsed;
|
|
17
|
+
export type Range = [number, number, number];
|
|
18
18
|
export declare const ALIAS: unique symbol;
|
|
19
19
|
export declare const DOC: unique symbol;
|
|
20
20
|
export declare const MAP: unique symbol;
|
package/dist/nodes/YAMLMap.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { ParsedNode, Range } from './Node.js';
|
|
|
6
6
|
import { Pair } from './Pair.js';
|
|
7
7
|
import { Scalar } from './Scalar.js';
|
|
8
8
|
import type { ToJSContext } from './toJS.js';
|
|
9
|
-
export
|
|
9
|
+
export type MapLike = Map<unknown, unknown> | Set<unknown> | Record<string | number | symbol, unknown>;
|
|
10
10
|
export declare function findPair<K = unknown, V = unknown>(items: Iterable<Pair<K, V>>, key: unknown): Pair<K, V> | undefined;
|
|
11
11
|
export declare namespace YAMLMap {
|
|
12
12
|
interface Parsed<K extends ParsedNode = ParsedNode, V extends ParsedNode | null = ParsedNode | null> extends YAMLMap<K, V> {
|
package/dist/nodes/YAMLMap.js
CHANGED
|
@@ -20,13 +20,13 @@ function findPair(items, key) {
|
|
|
20
20
|
return undefined;
|
|
21
21
|
}
|
|
22
22
|
class YAMLMap extends Collection.Collection {
|
|
23
|
+
static get tagName() {
|
|
24
|
+
return 'tag:yaml.org,2002:map';
|
|
25
|
+
}
|
|
23
26
|
constructor(schema) {
|
|
24
27
|
super(Node.MAP, schema);
|
|
25
28
|
this.items = [];
|
|
26
29
|
}
|
|
27
|
-
static get tagName() {
|
|
28
|
-
return 'tag:yaml.org,2002:map';
|
|
29
|
-
}
|
|
30
30
|
/**
|
|
31
31
|
* Adds a value to the collection.
|
|
32
32
|
*
|
package/dist/nodes/YAMLSeq.js
CHANGED
|
@@ -7,13 +7,13 @@ var Scalar = require('./Scalar.js');
|
|
|
7
7
|
var toJS = require('./toJS.js');
|
|
8
8
|
|
|
9
9
|
class YAMLSeq extends Collection.Collection {
|
|
10
|
+
static get tagName() {
|
|
11
|
+
return 'tag:yaml.org,2002:seq';
|
|
12
|
+
}
|
|
10
13
|
constructor(schema) {
|
|
11
14
|
super(Node.SEQ, schema);
|
|
12
15
|
this.items = [];
|
|
13
16
|
}
|
|
14
|
-
static get tagName() {
|
|
15
|
-
return 'tag:yaml.org,2002:seq';
|
|
16
|
-
}
|
|
17
17
|
add(value) {
|
|
18
18
|
this.items.push(value);
|
|
19
19
|
}
|
package/dist/options.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ import type { LineCounter } from './parse/line-counter.js';
|
|
|
8
8
|
import type { Schema } from './schema/Schema.js';
|
|
9
9
|
import type { Tags } from './schema/tags.js';
|
|
10
10
|
import type { CollectionTag, ScalarTag } from './schema/types.js';
|
|
11
|
-
export
|
|
11
|
+
export type ParseOptions = {
|
|
12
12
|
/**
|
|
13
13
|
* Whether integers should be parsed into BigInt rather than number values.
|
|
14
14
|
*
|
|
@@ -56,7 +56,7 @@ export declare type ParseOptions = {
|
|
|
56
56
|
*/
|
|
57
57
|
uniqueKeys?: boolean | ((a: ParsedNode, b: ParsedNode) => boolean);
|
|
58
58
|
};
|
|
59
|
-
export
|
|
59
|
+
export type DocumentOptions = {
|
|
60
60
|
/**
|
|
61
61
|
* @internal
|
|
62
62
|
* Used internally by Composer. If set and includes an explicit version,
|
|
@@ -76,7 +76,7 @@ export declare type DocumentOptions = {
|
|
|
76
76
|
*/
|
|
77
77
|
version?: '1.1' | '1.2' | 'next';
|
|
78
78
|
};
|
|
79
|
-
export
|
|
79
|
+
export type SchemaOptions = {
|
|
80
80
|
/**
|
|
81
81
|
* When parsing, warn about compatibility issues with the given schema.
|
|
82
82
|
* When stringifying, use scalar styles that are parsed correctly
|
|
@@ -133,7 +133,7 @@ export declare type SchemaOptions = {
|
|
|
133
133
|
*/
|
|
134
134
|
toStringDefaults?: ToStringOptions;
|
|
135
135
|
};
|
|
136
|
-
export
|
|
136
|
+
export type CreateNodeOptions = {
|
|
137
137
|
/**
|
|
138
138
|
* During node construction, use anchors and aliases to keep strictly equal
|
|
139
139
|
* non-null objects as equivalent in YAML.
|
|
@@ -163,7 +163,7 @@ export declare type CreateNodeOptions = {
|
|
|
163
163
|
*/
|
|
164
164
|
tag?: string;
|
|
165
165
|
};
|
|
166
|
-
export
|
|
166
|
+
export type ToJSOptions = {
|
|
167
167
|
/**
|
|
168
168
|
* Use Map rather than Object to represent mappings.
|
|
169
169
|
*
|
|
@@ -189,7 +189,7 @@ export declare type ToJSOptions = {
|
|
|
189
189
|
*/
|
|
190
190
|
reviver?: Reviver;
|
|
191
191
|
};
|
|
192
|
-
export
|
|
192
|
+
export type ToStringOptions = {
|
|
193
193
|
/**
|
|
194
194
|
* Use block quote styles for scalar values where applicable.
|
|
195
195
|
* Set to `false` to disable block quotes completely.
|
|
@@ -264,6 +264,13 @@ export declare type ToStringOptions = {
|
|
|
264
264
|
* Default: `'false'`
|
|
265
265
|
*/
|
|
266
266
|
falseStr?: string;
|
|
267
|
+
/**
|
|
268
|
+
* When true, a single space of padding will be added inside the delimiters
|
|
269
|
+
* of non-empty single-line flow collections.
|
|
270
|
+
*
|
|
271
|
+
* Default: `true`
|
|
272
|
+
*/
|
|
273
|
+
flowCollectionPadding?: boolean;
|
|
267
274
|
/**
|
|
268
275
|
* The number of spaces to use when indenting code.
|
|
269
276
|
*
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { CollectionItem, Document } from './cst.js';
|
|
2
|
-
export
|
|
3
|
-
export
|
|
2
|
+
export type VisitPath = readonly ['key' | 'value', number][];
|
|
3
|
+
export type Visitor = (item: CollectionItem, path: VisitPath) => number | symbol | Visitor | void;
|
|
4
4
|
/**
|
|
5
5
|
* Apply a visitor to a CST document or item.
|
|
6
6
|
*
|
package/dist/parse/cst.d.ts
CHANGED
|
@@ -72,7 +72,7 @@ export interface BlockSequence {
|
|
|
72
72
|
value?: Token;
|
|
73
73
|
}>;
|
|
74
74
|
}
|
|
75
|
-
export
|
|
75
|
+
export type CollectionItem = {
|
|
76
76
|
start: SourceToken[];
|
|
77
77
|
key?: Token | null;
|
|
78
78
|
sep?: SourceToken[];
|
|
@@ -86,8 +86,8 @@ export interface FlowCollection {
|
|
|
86
86
|
items: CollectionItem[];
|
|
87
87
|
end: SourceToken[];
|
|
88
88
|
}
|
|
89
|
-
export
|
|
90
|
-
export
|
|
89
|
+
export type Token = SourceToken | ErrorToken | Directive | Document | DocumentEnd | FlowScalar | BlockScalar | BlockMap | BlockSequence | FlowCollection;
|
|
90
|
+
export type TokenType = SourceToken['type'] | DocumentEnd['type'] | FlowScalar['type'];
|
|
91
91
|
/** The byte order mark */
|
|
92
92
|
export declare const BOM = "\uFEFF";
|
|
93
93
|
/** Start of doc-mode */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
type JsonSchema = boolean | ArraySchema | ObjectSchema | NumberSchema | StringSchema;
|
|
2
|
+
type JsonType = 'array' | 'object' | 'string' | 'number' | 'integer' | 'boolean' | 'null';
|
|
3
3
|
interface CommonSchema {
|
|
4
4
|
type?: JsonType | JsonType[];
|
|
5
5
|
const?: unknown;
|
package/dist/schema/tags.d.ts
CHANGED
|
@@ -25,8 +25,8 @@ declare const tagsByName: {
|
|
|
25
25
|
test: RegExp;
|
|
26
26
|
};
|
|
27
27
|
};
|
|
28
|
-
export
|
|
29
|
-
export
|
|
28
|
+
export type TagId = keyof typeof tagsByName;
|
|
29
|
+
export type Tags = Array<ScalarTag | CollectionTag | TagId>;
|
|
30
30
|
export declare const coreKnownTags: {
|
|
31
31
|
'tag:yaml.org,2002:binary': ScalarTag;
|
|
32
32
|
'tag:yaml.org,2002:omap': CollectionTag;
|
package/dist/schema/types.d.ts
CHANGED
|
@@ -16,7 +16,7 @@ interface TagBase {
|
|
|
16
16
|
* an explicit tag. For most cases, it's unlikely that you'll actually want to
|
|
17
17
|
* use this, even if you first think you do.
|
|
18
18
|
*/
|
|
19
|
-
default
|
|
19
|
+
default?: boolean;
|
|
20
20
|
/**
|
|
21
21
|
* If a tag has multiple forms that should be parsed and/or stringified
|
|
22
22
|
* differently, use `format` to identify them.
|
|
@@ -5,7 +5,7 @@ export declare const FOLD_QUOTED = "quoted";
|
|
|
5
5
|
* `'block'` prevents more-indented lines from being folded;
|
|
6
6
|
* `'quoted'` allows for `\` escapes, including escaped newlines
|
|
7
7
|
*/
|
|
8
|
-
export
|
|
8
|
+
export type FoldMode = 'flow' | 'block' | 'quoted';
|
|
9
9
|
export interface FoldOptions {
|
|
10
10
|
/**
|
|
11
11
|
* Accounts for leading contents on the first line, defaulting to
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Document } from '../doc/Document.js';
|
|
2
2
|
import type { Alias } from '../nodes/Alias.js';
|
|
3
3
|
import type { ToStringOptions } from '../options.js';
|
|
4
|
-
export
|
|
4
|
+
export type StringifyContext = {
|
|
5
5
|
actualString?: boolean;
|
|
6
6
|
allNullValues?: boolean;
|
|
7
7
|
anchors: Set<string>;
|
|
@@ -13,6 +13,7 @@ export declare type StringifyContext = {
|
|
|
13
13
|
indentAtStart?: number;
|
|
14
14
|
inFlow: boolean | null;
|
|
15
15
|
inStringifyKey?: boolean;
|
|
16
|
+
flowCollectionPadding: string;
|
|
16
17
|
options: Readonly<Required<Omit<ToStringOptions, 'collectionStyle' | 'indent'>>>;
|
|
17
18
|
resolvedAliases?: Set<Alias>;
|
|
18
19
|
};
|
|
@@ -15,6 +15,7 @@ function createStringifyContext(doc, options) {
|
|
|
15
15
|
doubleQuotedAsJSON: false,
|
|
16
16
|
doubleQuotedMinMultiLineLength: 40,
|
|
17
17
|
falseStr: 'false',
|
|
18
|
+
flowCollectionPadding: true,
|
|
18
19
|
indentSeq: true,
|
|
19
20
|
lineWidth: 80,
|
|
20
21
|
minContentWidth: 20,
|
|
@@ -38,6 +39,7 @@ function createStringifyContext(doc, options) {
|
|
|
38
39
|
return {
|
|
39
40
|
anchors: new Set(),
|
|
40
41
|
doc,
|
|
42
|
+
flowCollectionPadding: opt.flowCollectionPadding ? ' ' : '',
|
|
41
43
|
indent: '',
|
|
42
44
|
indentStep: typeof opt.indent === 'number' ? ' '.repeat(opt.indent) : ' ',
|
|
43
45
|
inFlow,
|
|
@@ -62,7 +62,7 @@ function stringifyBlockCollection({ comment, items }, ctx, { blockItemPrefix, fl
|
|
|
62
62
|
return str;
|
|
63
63
|
}
|
|
64
64
|
function stringifyFlowCollection({ comment, items }, ctx, { flowChars, itemIndent, onComment }) {
|
|
65
|
-
const { indent, indentStep, options: { commentString } } = ctx;
|
|
65
|
+
const { indent, indentStep, flowCollectionPadding: fcPadding, options: { commentString } } = ctx;
|
|
66
66
|
itemIndent += indentStep;
|
|
67
67
|
const itemCtx = Object.assign({}, ctx, {
|
|
68
68
|
indent: itemIndent,
|
|
@@ -131,7 +131,7 @@ function stringifyFlowCollection({ comment, items }, ctx, { flowChars, itemInden
|
|
|
131
131
|
str += `\n${indent}${end}`;
|
|
132
132
|
}
|
|
133
133
|
else {
|
|
134
|
-
str = `${start}
|
|
134
|
+
str = `${start}${fcPadding}${lines.join(' ')}${fcPadding}${end}`;
|
|
135
135
|
}
|
|
136
136
|
}
|
|
137
137
|
if (comment) {
|
|
@@ -65,19 +65,18 @@ function stringifyPair({ key, value }, ctx, onComment, onChompKeep) {
|
|
|
65
65
|
if (keyComment)
|
|
66
66
|
str += stringifyComment.lineComment(str, ctx.indent, commentString(keyComment));
|
|
67
67
|
}
|
|
68
|
-
let vcb
|
|
69
|
-
let valueComment = null;
|
|
68
|
+
let vsb, vcb, valueComment;
|
|
70
69
|
if (Node.isNode(value)) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
if (value.commentBefore) {
|
|
74
|
-
const cs = commentString(value.commentBefore);
|
|
75
|
-
vcb += `\n${stringifyComment.indentComment(cs, ctx.indent)}`;
|
|
76
|
-
}
|
|
70
|
+
vsb = !!value.spaceBefore;
|
|
71
|
+
vcb = value.commentBefore;
|
|
77
72
|
valueComment = value.comment;
|
|
78
73
|
}
|
|
79
|
-
else
|
|
80
|
-
|
|
74
|
+
else {
|
|
75
|
+
vsb = false;
|
|
76
|
+
vcb = null;
|
|
77
|
+
valueComment = null;
|
|
78
|
+
if (value && typeof value === 'object')
|
|
79
|
+
value = doc.createNode(value);
|
|
81
80
|
}
|
|
82
81
|
ctx.implicitKey = false;
|
|
83
82
|
if (!explicitKey && !keyComment && Node.isScalar(value))
|
|
@@ -92,24 +91,50 @@ function stringifyPair({ key, value }, ctx, onComment, onChompKeep) {
|
|
|
92
91
|
!value.tag &&
|
|
93
92
|
!value.anchor) {
|
|
94
93
|
// If indentSeq === false, consider '- ' as part of indentation where possible
|
|
95
|
-
ctx.indent = ctx.indent.
|
|
94
|
+
ctx.indent = ctx.indent.substring(2);
|
|
96
95
|
}
|
|
97
96
|
let valueCommentDone = false;
|
|
98
97
|
const valueStr = stringify.stringify(value, ctx, () => (valueCommentDone = true), () => (chompKeep = true));
|
|
99
98
|
let ws = ' ';
|
|
100
|
-
if (
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
ws
|
|
99
|
+
if (keyComment || vsb || vcb) {
|
|
100
|
+
ws = vsb ? '\n' : '';
|
|
101
|
+
if (vcb) {
|
|
102
|
+
const cs = commentString(vcb);
|
|
103
|
+
ws += `\n${stringifyComment.indentComment(cs, ctx.indent)}`;
|
|
104
|
+
}
|
|
105
|
+
if (valueStr === '' && !ctx.inFlow) {
|
|
106
|
+
if (ws === '\n')
|
|
107
|
+
ws = '\n\n';
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
ws += `\n${ctx.indent}`;
|
|
111
|
+
}
|
|
105
112
|
}
|
|
106
113
|
else if (!explicitKey && Node.isCollection(value)) {
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
114
|
+
const vs0 = valueStr[0];
|
|
115
|
+
const nl0 = valueStr.indexOf('\n');
|
|
116
|
+
const hasNewline = nl0 !== -1;
|
|
117
|
+
const flow = ctx.inFlow ?? value.flow ?? value.items.length === 0;
|
|
118
|
+
if (hasNewline || !flow) {
|
|
119
|
+
let hasPropsLine = false;
|
|
120
|
+
if (hasNewline && (vs0 === '&' || vs0 === '!')) {
|
|
121
|
+
let sp0 = valueStr.indexOf(' ');
|
|
122
|
+
if (vs0 === '&' &&
|
|
123
|
+
sp0 !== -1 &&
|
|
124
|
+
sp0 < nl0 &&
|
|
125
|
+
valueStr[sp0 + 1] === '!') {
|
|
126
|
+
sp0 = valueStr.indexOf(' ', sp0 + 1);
|
|
127
|
+
}
|
|
128
|
+
if (sp0 === -1 || nl0 < sp0)
|
|
129
|
+
hasPropsLine = true;
|
|
130
|
+
}
|
|
131
|
+
if (!hasPropsLine)
|
|
132
|
+
ws = `\n${ctx.indent}`;
|
|
133
|
+
}
|
|
110
134
|
}
|
|
111
|
-
else if (valueStr === '' || valueStr[0] === '\n')
|
|
135
|
+
else if (valueStr === '' || valueStr[0] === '\n') {
|
|
112
136
|
ws = '';
|
|
137
|
+
}
|
|
113
138
|
str += ws + valueStr;
|
|
114
139
|
if (ctx.inFlow) {
|
|
115
140
|
if (valueCommentDone && onComment)
|
|
@@ -1,3 +1,9 @@
|
|
|
1
1
|
import { Scalar } from '../nodes/Scalar.js';
|
|
2
2
|
import type { StringifyContext } from './stringify.js';
|
|
3
|
-
|
|
3
|
+
interface StringifyScalar {
|
|
4
|
+
value: string;
|
|
5
|
+
comment?: string | null;
|
|
6
|
+
type?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function stringifyString(item: Scalar | StringifyScalar, ctx: StringifyContext, onComment?: () => void, onChompKeep?: () => void): string;
|
|
9
|
+
export {};
|
package/dist/visit.d.ts
CHANGED
|
@@ -5,8 +5,8 @@ import type { Pair } from './nodes/Pair.js';
|
|
|
5
5
|
import type { Scalar } from './nodes/Scalar.js';
|
|
6
6
|
import type { YAMLMap } from './nodes/YAMLMap.js';
|
|
7
7
|
import type { YAMLSeq } from './nodes/YAMLSeq.js';
|
|
8
|
-
export
|
|
9
|
-
export
|
|
8
|
+
export type visitorFn<T> = (key: number | 'key' | 'value' | null, node: T, path: readonly (Document | Node | Pair)[]) => void | symbol | number | Node | Pair;
|
|
9
|
+
export type visitor = visitorFn<unknown> | {
|
|
10
10
|
Alias?: visitorFn<Alias>;
|
|
11
11
|
Collection?: visitorFn<YAMLMap | YAMLSeq>;
|
|
12
12
|
Map?: visitorFn<YAMLMap>;
|
|
@@ -16,8 +16,8 @@ export declare type visitor = visitorFn<unknown> | {
|
|
|
16
16
|
Seq?: visitorFn<YAMLSeq>;
|
|
17
17
|
Value?: visitorFn<Scalar | YAMLMap | YAMLSeq>;
|
|
18
18
|
};
|
|
19
|
-
export
|
|
20
|
-
export
|
|
19
|
+
export type asyncVisitorFn<T> = (key: number | 'key' | 'value' | null, node: T, path: readonly (Document | Node | Pair)[]) => void | symbol | number | Node | Pair | Promise<void | symbol | number | Node | Pair>;
|
|
20
|
+
export type asyncVisitor = asyncVisitorFn<unknown> | {
|
|
21
21
|
Alias?: asyncVisitorFn<Alias>;
|
|
22
22
|
Collection?: asyncVisitorFn<YAMLMap | YAMLSeq>;
|
|
23
23
|
Map?: asyncVisitorFn<YAMLMap>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "yaml",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"license": "ISC",
|
|
5
5
|
"author": "Eemeli Aro <eemeli@gmail.com>",
|
|
6
6
|
"repository": "github:eemeli/yaml",
|
|
@@ -37,8 +37,8 @@
|
|
|
37
37
|
},
|
|
38
38
|
"scripts": {
|
|
39
39
|
"build": "npm run build:node && npm run build:browser",
|
|
40
|
-
"build:browser": "rollup -c config/rollup.browser-config.
|
|
41
|
-
"build:node": "rollup -c config/rollup.node-config.
|
|
40
|
+
"build:browser": "rollup -c config/rollup.browser-config.mjs",
|
|
41
|
+
"build:node": "rollup -c config/rollup.node-config.mjs",
|
|
42
42
|
"clean": "git clean -fdxe node_modules",
|
|
43
43
|
"lint": "eslint src/",
|
|
44
44
|
"prettier": "prettier --write .",
|
|
@@ -69,11 +69,11 @@
|
|
|
69
69
|
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1",
|
|
70
70
|
"@babel/plugin-transform-typescript": "^7.12.17",
|
|
71
71
|
"@babel/preset-env": "^7.12.11",
|
|
72
|
-
"@rollup/plugin-babel": "^
|
|
73
|
-
"@rollup/plugin-replace": "^
|
|
74
|
-
"@rollup/plugin-typescript": "^
|
|
75
|
-
"@types/jest": "^
|
|
76
|
-
"@types/node": "^
|
|
72
|
+
"@rollup/plugin-babel": "^6.0.3",
|
|
73
|
+
"@rollup/plugin-replace": "^5.0.2",
|
|
74
|
+
"@rollup/plugin-typescript": "^10.0.1",
|
|
75
|
+
"@types/jest": "^29.2.4",
|
|
76
|
+
"@types/node": "^14.18.35",
|
|
77
77
|
"@typescript-eslint/eslint-plugin": "^5.3.1",
|
|
78
78
|
"@typescript-eslint/parser": "^5.3.1",
|
|
79
79
|
"babel-jest": "^29.0.1",
|
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
"jest": "^29.0.1",
|
|
85
85
|
"jest-ts-webcompat-resolver": "^1.0.0",
|
|
86
86
|
"prettier": "^2.2.1",
|
|
87
|
-
"rollup": "^
|
|
87
|
+
"rollup": "^3.7.5",
|
|
88
88
|
"tslib": "^2.1.0",
|
|
89
89
|
"typescript": "^4.3.5"
|
|
90
90
|
},
|