projen 0.54.56 → 0.55.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/.jsii +3 -3
- package/changelog.md +5 -3
- package/lib/awscdk/auto-discover.js +4 -4
- package/lib/awscdk/awscdk-app-java.js +1 -1
- package/lib/awscdk/awscdk-app-py.js +1 -1
- package/lib/awscdk/awscdk-app-ts.js +1 -1
- package/lib/awscdk/awscdk-construct.js +2 -2
- package/lib/awscdk/awscdk-deps-java.js +1 -1
- package/lib/awscdk/awscdk-deps-js.js +1 -1
- package/lib/awscdk/awscdk-deps.js +1 -1
- package/lib/awscdk/cdk-config.js +1 -1
- package/lib/awscdk/cdk-tasks.js +1 -1
- package/lib/awscdk/integration-test.js +1 -1
- package/lib/awscdk/lambda-extension.js +1 -1
- package/lib/awscdk/lambda-function.js +2 -2
- package/lib/build/build-workflow.js +1 -1
- package/lib/cdk/auto-discover-base.js +2 -2
- package/lib/cdk/construct-lib.js +1 -1
- package/lib/cdk/integration-test-base.js +1 -1
- package/lib/cdk/jsii-docgen.js +1 -1
- package/lib/cdk/jsii-project.js +1 -1
- package/lib/cdk8s/auto-discover.js +2 -2
- package/lib/cdk8s/cdk8s-app-ts.js +1 -1
- package/lib/cdk8s/cdk8s-construct.js +1 -1
- package/lib/cdk8s/integration-test.js +1 -1
- package/lib/cdktf/cdktf-construct.js +1 -1
- package/lib/component.js +1 -1
- package/lib/dependencies.js +1 -1
- package/lib/dev-env.js +1 -1
- package/lib/docker-compose.js +2 -2
- package/lib/file.js +1 -1
- package/lib/gitattributes.js +1 -1
- package/lib/github/auto-approve.js +1 -1
- package/lib/github/auto-merge.js +1 -1
- package/lib/github/dependabot.js +1 -1
- package/lib/github/github-credentials.js +1 -1
- package/lib/github/github-project.js +1 -1
- package/lib/github/github.js +1 -1
- package/lib/github/mergify.js +1 -1
- package/lib/github/pr-template.js +1 -1
- package/lib/github/pull-request-lint.js +1 -1
- package/lib/github/stale.js +1 -1
- package/lib/github/task-workflow.js +1 -1
- package/lib/github/workflows.js +1 -1
- package/lib/gitlab/configuration.js +1 -1
- package/lib/gitlab/gitlab-configuration.js +1 -1
- package/lib/gitlab/nested-configuration.js +1 -1
- package/lib/gitpod.js +1 -1
- package/lib/ignore-file.js +1 -1
- package/lib/ini.js +1 -1
- package/lib/java/java-project.js +1 -1
- package/lib/java/junit.js +1 -1
- package/lib/java/maven-compile.js +1 -1
- package/lib/java/maven-packaging.js +1 -1
- package/lib/java/maven-sample.js +1 -1
- package/lib/java/pom.js +1 -1
- package/lib/java/projenrc.js +1 -1
- package/lib/javascript/bundler.js +1 -1
- package/lib/javascript/eslint.js +1 -1
- package/lib/javascript/jest.js +1 -1
- package/lib/javascript/node-package.js +1 -1
- package/lib/javascript/node-project.js +1 -1
- package/lib/javascript/npm-config.js +1 -1
- package/lib/javascript/prettier.js +1 -1
- package/lib/javascript/projenrc.js +1 -1
- package/lib/javascript/typescript-config.js +1 -1
- package/lib/javascript/upgrade-dependencies.js +2 -2
- package/lib/json.js +1 -1
- package/lib/license.js +1 -1
- package/lib/logger.js +1 -1
- package/lib/makefile.js +1 -1
- package/lib/object-file.js +1 -1
- package/lib/project-build.js +1 -1
- package/lib/project.js +1 -1
- package/lib/projects.js +1 -1
- package/lib/projenrc-json.js +1 -1
- package/lib/python/pip.js +1 -1
- package/lib/python/poetry.js +2 -2
- package/lib/python/projenrc.js +1 -1
- package/lib/python/pytest-sample.js +1 -1
- package/lib/python/pytest.js +1 -1
- package/lib/python/python-project.js +1 -1
- package/lib/python/python-sample.js +1 -1
- package/lib/python/requirements-file.js +1 -1
- package/lib/python/setuppy.js +1 -1
- package/lib/python/setuptools.js +1 -1
- package/lib/python/venv.js +1 -1
- package/lib/readme.js +1 -1
- package/lib/release/publisher.js +1 -1
- package/lib/release/release-trigger.js +1 -1
- package/lib/release/release.js +1 -1
- package/lib/run-task.js +1813 -0
- package/lib/sample-file.js +2 -2
- package/lib/semver.js +1 -1
- package/lib/source-code.js +1 -1
- package/lib/task-runtime.js +1 -1
- package/lib/task.js +1 -1
- package/lib/tasks.js +1 -1
- package/lib/testing.js +1 -1
- package/lib/textfile.js +1 -1
- package/lib/toml.js +1 -1
- package/lib/typescript/projenrc.js +1 -1
- package/lib/typescript/typescript-typedoc.js +1 -1
- package/lib/typescript/typescript.js +5 -5
- package/lib/util.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/vscode/devcontainer.js +1 -1
- package/lib/vscode/launch-config.js +1 -1
- package/lib/vscode/vscode.js +1 -1
- package/lib/web/next.js +3 -3
- package/lib/web/postcss.js +1 -1
- package/lib/web/react.js +4 -4
- package/lib/web/tailwind.js +1 -1
- package/lib/xmlfile.js +1 -1
- package/lib/yaml.js +1 -1
- package/node_modules/xmlbuilder2/node_modules/@types/node/README.md +1 -1
- package/node_modules/xmlbuilder2/node_modules/@types/node/diagnostics_channel.d.ts +18 -0
- package/node_modules/xmlbuilder2/node_modules/@types/node/package.json +2 -2
- package/node_modules/yaml/README.md +1 -1
- package/node_modules/yaml/browser/dist/compose/compose-doc.js +1 -1
- package/node_modules/yaml/browser/dist/compose/compose-scalar.js +4 -4
- package/node_modules/yaml/browser/dist/compose/composer.js +1 -0
- package/node_modules/yaml/browser/dist/compose/resolve-block-map.js +2 -2
- package/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +3 -1
- package/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +4 -3
- package/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +2 -1
- package/node_modules/yaml/browser/dist/compose/resolve-props.js +1 -1
- package/node_modules/yaml/browser/dist/doc/Document.js +9 -5
- package/node_modules/yaml/browser/dist/doc/anchors.js +2 -2
- package/node_modules/yaml/browser/dist/doc/createNode.js +7 -4
- package/node_modules/yaml/browser/dist/nodes/Pair.js +2 -2
- package/node_modules/yaml/browser/dist/nodes/Scalar.js +1 -1
- package/node_modules/yaml/browser/dist/nodes/YAMLMap.js +5 -4
- package/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +1 -1
- package/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +1 -1
- package/node_modules/yaml/browser/dist/nodes/toJS.js +3 -1
- package/node_modules/yaml/browser/dist/parse/cst-visit.js +2 -2
- package/node_modules/yaml/browser/dist/parse/lexer.js +2 -1
- package/node_modules/yaml/browser/dist/parse/parser.js +50 -14
- package/node_modules/yaml/browser/dist/public-api.js +2 -1
- package/node_modules/yaml/browser/dist/schema/Schema.js +6 -2
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +1 -1
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +2 -1
- package/node_modules/yaml/browser/dist/stringify/stringify.js +8 -8
- package/node_modules/yaml/browser/dist/stringify/stringifyComment.js +5 -3
- package/node_modules/yaml/browser/dist/stringify/stringifyPair.js +4 -1
- package/node_modules/yaml/browser/dist/stringify/stringifyString.js +2 -2
- package/node_modules/yaml/dist/compose/compose-doc.js +1 -1
- package/node_modules/yaml/dist/compose/compose-scalar.js +4 -4
- package/node_modules/yaml/dist/compose/composer.js +1 -0
- package/node_modules/yaml/dist/compose/resolve-block-map.js +2 -2
- package/node_modules/yaml/dist/compose/resolve-block-scalar.js +3 -1
- package/node_modules/yaml/dist/compose/resolve-flow-collection.js +4 -3
- package/node_modules/yaml/dist/compose/resolve-flow-scalar.js +2 -1
- package/node_modules/yaml/dist/compose/resolve-props.d.ts +1 -1
- package/node_modules/yaml/dist/compose/resolve-props.js +1 -1
- package/node_modules/yaml/dist/doc/Document.d.ts +1 -1
- package/node_modules/yaml/dist/doc/Document.js +9 -5
- package/node_modules/yaml/dist/doc/anchors.d.ts +2 -2
- package/node_modules/yaml/dist/doc/anchors.js +2 -2
- package/node_modules/yaml/dist/doc/createNode.d.ts +1 -1
- package/node_modules/yaml/dist/doc/createNode.js +7 -4
- package/node_modules/yaml/dist/doc/directives.d.ts +1 -1
- package/node_modules/yaml/dist/nodes/Pair.js +2 -2
- package/node_modules/yaml/dist/nodes/Scalar.js +1 -1
- package/node_modules/yaml/dist/nodes/YAMLMap.d.ts +3 -1
- package/node_modules/yaml/dist/nodes/YAMLMap.js +5 -4
- package/node_modules/yaml/dist/nodes/YAMLSeq.js +1 -1
- package/node_modules/yaml/dist/nodes/addPairToJSMap.js +1 -1
- package/node_modules/yaml/dist/nodes/toJS.js +3 -1
- package/node_modules/yaml/dist/options.d.ts +1 -1
- package/node_modules/yaml/dist/parse/cst-visit.js +2 -2
- package/node_modules/yaml/dist/parse/lexer.js +2 -1
- package/node_modules/yaml/dist/parse/parser.js +50 -14
- package/node_modules/yaml/dist/public-api.js +2 -1
- package/node_modules/yaml/dist/schema/Schema.js +6 -2
- package/node_modules/yaml/dist/schema/yaml-1.1/omap.js +1 -1
- package/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +2 -1
- package/node_modules/yaml/dist/stringify/stringify.js +8 -8
- package/node_modules/yaml/dist/stringify/stringifyComment.js +5 -3
- package/node_modules/yaml/dist/stringify/stringifyPair.js +4 -1
- package/node_modules/yaml/dist/stringify/stringifyString.js +2 -2
- package/node_modules/yaml/dist/test-events.js +1 -1
- package/node_modules/yaml/package.json +2 -2
- package/package.json +4 -4
- package/releasetag.txt +1 -1
- package/version.txt +1 -1
|
@@ -33,12 +33,13 @@ function isFlowToken(token) {
|
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
function getPrevProps(parent) {
|
|
36
|
+
var _a;
|
|
36
37
|
switch (parent.type) {
|
|
37
38
|
case 'document':
|
|
38
39
|
return parent.start;
|
|
39
40
|
case 'block-map': {
|
|
40
41
|
const it = parent.items[parent.items.length - 1];
|
|
41
|
-
return it.sep
|
|
42
|
+
return (_a = it.sep) !== null && _a !== void 0 ? _a : it.start;
|
|
42
43
|
}
|
|
43
44
|
case 'block-seq':
|
|
44
45
|
return parent.items[parent.items.length - 1].start;
|
|
@@ -265,7 +266,7 @@ class Parser {
|
|
|
265
266
|
return this.stack[this.stack.length - n];
|
|
266
267
|
}
|
|
267
268
|
*pop(error) {
|
|
268
|
-
const token = error
|
|
269
|
+
const token = error !== null && error !== void 0 ? error : this.stack.pop();
|
|
269
270
|
/* istanbul ignore if should not happen */
|
|
270
271
|
if (!token) {
|
|
271
272
|
const message = 'Tried to pop an empty stack';
|
|
@@ -514,30 +515,60 @@ class Parser {
|
|
|
514
515
|
const atNextItem = !this.onKeyLine &&
|
|
515
516
|
this.indent === map.indent &&
|
|
516
517
|
(it.sep || includesNonEmpty(it.start));
|
|
518
|
+
// For empty nodes, assign newline-separated not indented empty tokens to following node
|
|
519
|
+
let start = [];
|
|
520
|
+
if (atNextItem && it.sep && !it.value) {
|
|
521
|
+
const nl = [];
|
|
522
|
+
for (let i = 0; i < it.sep.length; ++i) {
|
|
523
|
+
const st = it.sep[i];
|
|
524
|
+
switch (st.type) {
|
|
525
|
+
case 'newline':
|
|
526
|
+
nl.push(i);
|
|
527
|
+
break;
|
|
528
|
+
case 'space':
|
|
529
|
+
break;
|
|
530
|
+
case 'comment':
|
|
531
|
+
if (st.indent > map.indent)
|
|
532
|
+
nl.length = 0;
|
|
533
|
+
break;
|
|
534
|
+
default:
|
|
535
|
+
nl.length = 0;
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
if (nl.length >= 2)
|
|
539
|
+
start = it.sep.splice(nl[1]);
|
|
540
|
+
}
|
|
517
541
|
switch (this.type) {
|
|
518
542
|
case 'anchor':
|
|
519
543
|
case 'tag':
|
|
520
544
|
if (atNextItem || it.value) {
|
|
521
|
-
|
|
545
|
+
start.push(this.sourceToken);
|
|
546
|
+
map.items.push({ start });
|
|
522
547
|
this.onKeyLine = true;
|
|
523
548
|
}
|
|
524
|
-
else if (it.sep)
|
|
549
|
+
else if (it.sep) {
|
|
525
550
|
it.sep.push(this.sourceToken);
|
|
526
|
-
|
|
551
|
+
}
|
|
552
|
+
else {
|
|
527
553
|
it.start.push(this.sourceToken);
|
|
554
|
+
}
|
|
528
555
|
return;
|
|
529
556
|
case 'explicit-key-ind':
|
|
530
|
-
if (!it.sep && !includesToken(it.start, 'explicit-key-ind'))
|
|
557
|
+
if (!it.sep && !includesToken(it.start, 'explicit-key-ind')) {
|
|
531
558
|
it.start.push(this.sourceToken);
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
559
|
+
}
|
|
560
|
+
else if (atNextItem || it.value) {
|
|
561
|
+
start.push(this.sourceToken);
|
|
562
|
+
map.items.push({ start });
|
|
563
|
+
}
|
|
564
|
+
else {
|
|
535
565
|
this.stack.push({
|
|
536
566
|
type: 'block-map',
|
|
537
567
|
offset: this.offset,
|
|
538
568
|
indent: this.indent,
|
|
539
569
|
items: [{ start: [this.sourceToken] }]
|
|
540
570
|
});
|
|
571
|
+
}
|
|
541
572
|
this.onKeyLine = true;
|
|
542
573
|
return;
|
|
543
574
|
case 'map-value-ind':
|
|
@@ -564,7 +595,7 @@ class Parser {
|
|
|
564
595
|
type: 'block-map',
|
|
565
596
|
offset: this.offset,
|
|
566
597
|
indent: this.indent,
|
|
567
|
-
items: [{ start
|
|
598
|
+
items: [{ start, key: null, sep: [this.sourceToken] }]
|
|
568
599
|
});
|
|
569
600
|
}
|
|
570
601
|
else if (isFlowToken(it.key) &&
|
|
@@ -582,6 +613,10 @@ class Parser {
|
|
|
582
613
|
items: [{ start, key, sep }]
|
|
583
614
|
});
|
|
584
615
|
}
|
|
616
|
+
else if (start.length > 0) {
|
|
617
|
+
// Not actually at next item
|
|
618
|
+
it.sep = it.sep.concat(start, this.sourceToken);
|
|
619
|
+
}
|
|
585
620
|
else {
|
|
586
621
|
it.sep.push(this.sourceToken);
|
|
587
622
|
}
|
|
@@ -591,7 +626,7 @@ class Parser {
|
|
|
591
626
|
Object.assign(it, { key: null, sep: [this.sourceToken] });
|
|
592
627
|
}
|
|
593
628
|
else if (it.value || atNextItem) {
|
|
594
|
-
map.items.push({ start
|
|
629
|
+
map.items.push({ start, key: null, sep: [this.sourceToken] });
|
|
595
630
|
}
|
|
596
631
|
else if (includesToken(it.sep, 'map-value-ind')) {
|
|
597
632
|
this.stack.push({
|
|
@@ -613,7 +648,7 @@ class Parser {
|
|
|
613
648
|
case 'double-quoted-scalar': {
|
|
614
649
|
const fs = this.flowScalar(this.type);
|
|
615
650
|
if (atNextItem || it.value) {
|
|
616
|
-
map.items.push({ start
|
|
651
|
+
map.items.push({ start, key: fs, sep: [] });
|
|
617
652
|
this.onKeyLine = true;
|
|
618
653
|
}
|
|
619
654
|
else if (it.sep) {
|
|
@@ -630,8 +665,9 @@ class Parser {
|
|
|
630
665
|
if (bv) {
|
|
631
666
|
if (atNextItem &&
|
|
632
667
|
bv.type !== 'block-seq' &&
|
|
633
|
-
includesToken(it.start, 'explicit-key-ind'))
|
|
634
|
-
map.items.push({ start
|
|
668
|
+
includesToken(it.start, 'explicit-key-ind')) {
|
|
669
|
+
map.items.push({ start });
|
|
670
|
+
}
|
|
635
671
|
this.stack.push(bv);
|
|
636
672
|
return;
|
|
637
673
|
}
|
|
@@ -75,6 +75,7 @@ function parse(src, reviver, options) {
|
|
|
75
75
|
return doc.toJS(Object.assign({ reviver: _reviver }, options));
|
|
76
76
|
}
|
|
77
77
|
function stringify(value, replacer, options) {
|
|
78
|
+
var _a;
|
|
78
79
|
let _replacer = null;
|
|
79
80
|
if (typeof replacer === 'function' || Array.isArray(replacer)) {
|
|
80
81
|
_replacer = replacer;
|
|
@@ -89,7 +90,7 @@ function stringify(value, replacer, options) {
|
|
|
89
90
|
options = indent < 1 ? undefined : indent > 8 ? { indent: 8 } : { indent };
|
|
90
91
|
}
|
|
91
92
|
if (value === undefined) {
|
|
92
|
-
const { keepUndefined } = options
|
|
93
|
+
const { keepUndefined } = (_a = options !== null && options !== void 0 ? options : replacer) !== null && _a !== void 0 ? _a : {};
|
|
93
94
|
if (!keepUndefined)
|
|
94
95
|
return undefined;
|
|
95
96
|
}
|
|
@@ -16,13 +16,17 @@ class Schema {
|
|
|
16
16
|
this.name = (typeof schema === 'string' && schema) || 'core';
|
|
17
17
|
this.knownTags = resolveKnownTags ? coreKnownTags : {};
|
|
18
18
|
this.tags = getTags(customTags, this.name);
|
|
19
|
-
this.toStringOptions = toStringDefaults
|
|
19
|
+
this.toStringOptions = toStringDefaults !== null && toStringDefaults !== void 0 ? toStringDefaults : null;
|
|
20
20
|
Object.defineProperty(this, MAP, { value: map });
|
|
21
21
|
Object.defineProperty(this, SCALAR, { value: string });
|
|
22
22
|
Object.defineProperty(this, SEQ, { value: seq });
|
|
23
23
|
// Used by createMap()
|
|
24
24
|
this.sortMapEntries =
|
|
25
|
-
sortMapEntries ===
|
|
25
|
+
typeof sortMapEntries === 'function'
|
|
26
|
+
? sortMapEntries
|
|
27
|
+
: sortMapEntries === true
|
|
28
|
+
? sortMapEntriesByKey
|
|
29
|
+
: null;
|
|
26
30
|
}
|
|
27
31
|
clone() {
|
|
28
32
|
const copy = Object.create(Schema.prototype, Object.getOwnPropertyDescriptors(this));
|
|
@@ -22,7 +22,7 @@ class YAMLOMap extends YAMLSeq {
|
|
|
22
22
|
if (!ctx)
|
|
23
23
|
return super.toJSON(_);
|
|
24
24
|
const map = new Map();
|
|
25
|
-
if (ctx
|
|
25
|
+
if (ctx === null || ctx === void 0 ? void 0 : ctx.onCreate)
|
|
26
26
|
ctx.onCreate(map);
|
|
27
27
|
for (const pair of this.items) {
|
|
28
28
|
let key, value;
|
|
@@ -4,6 +4,7 @@ import { Scalar } from '../../nodes/Scalar.js';
|
|
|
4
4
|
import { YAMLSeq } from '../../nodes/YAMLSeq.js';
|
|
5
5
|
|
|
6
6
|
function resolvePairs(seq, onError) {
|
|
7
|
+
var _a;
|
|
7
8
|
if (isSeq(seq)) {
|
|
8
9
|
for (let i = 0; i < seq.items.length; ++i) {
|
|
9
10
|
let item = seq.items[i];
|
|
@@ -18,7 +19,7 @@ function resolvePairs(seq, onError) {
|
|
|
18
19
|
? `${item.commentBefore}\n${pair.key.commentBefore}`
|
|
19
20
|
: item.commentBefore;
|
|
20
21
|
if (item.comment) {
|
|
21
|
-
const cn = pair.value
|
|
22
|
+
const cn = (_a = pair.value) !== null && _a !== void 0 ? _a : pair.key;
|
|
22
23
|
cn.comment = cn.comment
|
|
23
24
|
? `${item.comment}\n${cn.comment}`
|
|
24
25
|
: item.comment;
|
|
@@ -43,26 +43,26 @@ function createStringifyContext(doc, options) {
|
|
|
43
43
|
};
|
|
44
44
|
}
|
|
45
45
|
function getTagObject(tags, item) {
|
|
46
|
+
var _a, _b, _c, _d;
|
|
46
47
|
if (item.tag) {
|
|
47
48
|
const match = tags.filter(t => t.tag === item.tag);
|
|
48
49
|
if (match.length > 0)
|
|
49
|
-
return match.find(t => t.format === item.format)
|
|
50
|
+
return (_a = match.find(t => t.format === item.format)) !== null && _a !== void 0 ? _a : match[0];
|
|
50
51
|
}
|
|
51
52
|
let tagObj = undefined;
|
|
52
53
|
let obj;
|
|
53
54
|
if (isScalar(item)) {
|
|
54
55
|
obj = item.value;
|
|
55
|
-
const match = tags.filter(t => t.identify
|
|
56
|
+
const match = tags.filter(t => { var _a; return (_a = t.identify) === null || _a === void 0 ? void 0 : _a.call(t, obj); });
|
|
56
57
|
tagObj =
|
|
57
|
-
match.find(t => t.format === item.format)
|
|
58
|
+
(_b = match.find(t => t.format === item.format)) !== null && _b !== void 0 ? _b : match.find(t => !t.format);
|
|
58
59
|
}
|
|
59
60
|
else {
|
|
60
61
|
obj = item;
|
|
61
62
|
tagObj = tags.find(t => t.nodeClass && obj instanceof t.nodeClass);
|
|
62
63
|
}
|
|
63
64
|
if (!tagObj) {
|
|
64
|
-
|
|
65
|
-
const name = obj && obj.constructor ? obj.constructor.name : typeof obj;
|
|
65
|
+
const name = (_d = (_c = obj === null || obj === void 0 ? void 0 : obj.constructor) === null || _c === void 0 ? void 0 : _c.name) !== null && _d !== void 0 ? _d : typeof obj;
|
|
66
66
|
throw new Error(`Tag not resolved for ${name} value`);
|
|
67
67
|
}
|
|
68
68
|
return tagObj;
|
|
@@ -77,13 +77,13 @@ function stringifyProps(node, tagObj, { anchors, doc }) {
|
|
|
77
77
|
anchors.add(anchor);
|
|
78
78
|
props.push(`&${anchor}`);
|
|
79
79
|
}
|
|
80
|
-
const tag = node.tag
|
|
80
|
+
const tag = node.tag ? node.tag : tagObj.default ? null : tagObj.tag;
|
|
81
81
|
if (tag)
|
|
82
82
|
props.push(doc.directives.tagString(tag));
|
|
83
83
|
return props.join(' ');
|
|
84
84
|
}
|
|
85
85
|
function stringify(item, ctx, onComment, onChompKeep) {
|
|
86
|
-
var _a;
|
|
86
|
+
var _a, _b;
|
|
87
87
|
if (isPair(item))
|
|
88
88
|
return item.toString(ctx, onComment, onChompKeep);
|
|
89
89
|
if (isAlias(item)) {
|
|
@@ -108,7 +108,7 @@ function stringify(item, ctx, onComment, onChompKeep) {
|
|
|
108
108
|
tagObj = getTagObject(ctx.doc.schema.tags, node);
|
|
109
109
|
const props = stringifyProps(node, tagObj, ctx);
|
|
110
110
|
if (props.length > 0)
|
|
111
|
-
ctx.indentAtStart = (ctx.indentAtStart
|
|
111
|
+
ctx.indentAtStart = ((_b = ctx.indentAtStart) !== null && _b !== void 0 ? _b : 0) + props.length + 1;
|
|
112
112
|
const str = typeof tagObj.stringify === 'function'
|
|
113
113
|
? tagObj.stringify(node, ctx, onComment, onChompKeep)
|
|
114
114
|
: isScalar(node)
|
|
@@ -11,8 +11,10 @@ function indentComment(comment, indent) {
|
|
|
11
11
|
return comment.substring(1);
|
|
12
12
|
return indent ? comment.replace(/^(?! *$)/gm, indent) : comment;
|
|
13
13
|
}
|
|
14
|
-
const lineComment = (str, indent, comment) =>
|
|
15
|
-
?
|
|
16
|
-
:
|
|
14
|
+
const lineComment = (str, indent, comment) => str.endsWith('\n')
|
|
15
|
+
? indentComment(comment, indent)
|
|
16
|
+
: comment.includes('\n')
|
|
17
|
+
? '\n' + indentComment(comment, indent)
|
|
18
|
+
: (str.endsWith(' ') ? '' : ' ') + comment;
|
|
17
19
|
|
|
18
20
|
export { indentComment, lineComment, stringifyComment };
|
|
@@ -96,7 +96,10 @@ function stringifyPair({ key, value }, ctx, onComment, onChompKeep) {
|
|
|
96
96
|
const valueStr = stringify(value, ctx, () => (valueCommentDone = true), () => (chompKeep = true));
|
|
97
97
|
let ws = ' ';
|
|
98
98
|
if (vcb || keyComment) {
|
|
99
|
-
|
|
99
|
+
if (valueStr === '' && !ctx.inFlow)
|
|
100
|
+
ws = vcb === '\n' ? '\n\n' : vcb;
|
|
101
|
+
else
|
|
102
|
+
ws = `${vcb}\n${ctx.indent}`;
|
|
100
103
|
}
|
|
101
104
|
else if (!explicitKey && isCollection(value)) {
|
|
102
105
|
const flow = valueStr[0] === '[' || valueStr[0] === '{';
|
|
@@ -243,14 +243,14 @@ function plainString(item, ctx, onComment, onChompKeep) {
|
|
|
243
243
|
// - '\n ', ': ' or ' \n' anywhere
|
|
244
244
|
// - '#' not preceded by a non-space char
|
|
245
245
|
// - end with ' ' or ':'
|
|
246
|
-
return implicitKey || inFlow || value.
|
|
246
|
+
return implicitKey || inFlow || !value.includes('\n')
|
|
247
247
|
? quotedString(value, ctx)
|
|
248
248
|
: blockString(item, ctx, onComment, onChompKeep);
|
|
249
249
|
}
|
|
250
250
|
if (!implicitKey &&
|
|
251
251
|
!inFlow &&
|
|
252
252
|
type !== Scalar.PLAIN &&
|
|
253
|
-
value.
|
|
253
|
+
value.includes('\n')) {
|
|
254
254
|
// Where allowed & type not set explicitly, prefer block style for multiline strings
|
|
255
255
|
return blockString(item, ctx, onComment, onChompKeep);
|
|
256
256
|
}
|
|
@@ -16,7 +16,7 @@ function composeDoc(options, directives, { offset, start, value, end }, onError)
|
|
|
16
16
|
};
|
|
17
17
|
const props = resolveProps.resolveProps(start, {
|
|
18
18
|
indicator: 'doc-start',
|
|
19
|
-
next: value
|
|
19
|
+
next: value !== null && value !== void 0 ? value : end === null || end === void 0 ? void 0 : end[0],
|
|
20
20
|
offset,
|
|
21
21
|
onError,
|
|
22
22
|
startOnNewline: true
|
|
@@ -19,12 +19,12 @@ function composeScalar(ctx, token, tagToken, onError) {
|
|
|
19
19
|
: ctx.schema[Node.SCALAR];
|
|
20
20
|
let scalar;
|
|
21
21
|
try {
|
|
22
|
-
const res = tag.resolve(value, msg => onError(tagToken
|
|
22
|
+
const res = tag.resolve(value, msg => onError(tagToken !== null && tagToken !== void 0 ? tagToken : token, 'TAG_RESOLVE_FAILED', msg), ctx.options);
|
|
23
23
|
scalar = Node.isScalar(res) ? res : new Scalar.Scalar(res);
|
|
24
24
|
}
|
|
25
25
|
catch (error) {
|
|
26
26
|
const msg = error instanceof Error ? error.message : String(error);
|
|
27
|
-
onError(tagToken
|
|
27
|
+
onError(tagToken !== null && tagToken !== void 0 ? tagToken : token, 'TAG_RESOLVE_FAILED', msg);
|
|
28
28
|
scalar = new Scalar.Scalar(value);
|
|
29
29
|
}
|
|
30
30
|
scalar.range = range;
|
|
@@ -66,10 +66,10 @@ function findScalarTagByName(schema, value, tagName, tagToken, onError) {
|
|
|
66
66
|
return schema[Node.SCALAR];
|
|
67
67
|
}
|
|
68
68
|
function findScalarTagByTest({ directives, schema }, value, token, onError) {
|
|
69
|
+
var _a;
|
|
69
70
|
const tag = schema.tags.find(tag => { var _a; return tag.default && ((_a = tag.test) === null || _a === void 0 ? void 0 : _a.test(value)); }) || schema[Node.SCALAR];
|
|
70
71
|
if (schema.compat) {
|
|
71
|
-
const compat = schema.compat.find(tag => { var _a; return tag.default && ((_a = tag.test) === null || _a === void 0 ? void 0 : _a.test(value)); })
|
|
72
|
-
schema[Node.SCALAR];
|
|
72
|
+
const compat = (_a = schema.compat.find(tag => { var _a; return tag.default && ((_a = tag.test) === null || _a === void 0 ? void 0 : _a.test(value)); })) !== null && _a !== void 0 ? _a : schema[Node.SCALAR];
|
|
73
73
|
if (tag.tag !== compat.tag) {
|
|
74
74
|
const ts = directives.tagString(tag.tag);
|
|
75
75
|
const cs = directives.tagString(compat.tag);
|
|
@@ -69,6 +69,7 @@ class Composer {
|
|
|
69
69
|
else
|
|
70
70
|
this.errors.push(new errors.YAMLParseError(pos, code, message));
|
|
71
71
|
};
|
|
72
|
+
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
|
|
72
73
|
this.directives = new directives.Directives({ version: options.version || '1.2' });
|
|
73
74
|
this.options = options;
|
|
74
75
|
}
|
|
@@ -19,7 +19,7 @@ function resolveBlockMap({ composeNode, composeEmptyNode }, ctx, bm, onError) {
|
|
|
19
19
|
// key properties
|
|
20
20
|
const keyProps = resolveProps.resolveProps(start, {
|
|
21
21
|
indicator: 'explicit-key-ind',
|
|
22
|
-
next: key
|
|
22
|
+
next: key !== null && key !== void 0 ? key : sep === null || sep === void 0 ? void 0 : sep[0],
|
|
23
23
|
offset,
|
|
24
24
|
onError,
|
|
25
25
|
startOnNewline: true
|
|
@@ -58,7 +58,7 @@ function resolveBlockMap({ composeNode, composeEmptyNode }, ctx, bm, onError) {
|
|
|
58
58
|
if (utilMapIncludes.mapIncludes(ctx, map.items, keyNode))
|
|
59
59
|
onError(keyStart, 'DUPLICATE_KEY', 'Map keys must be unique');
|
|
60
60
|
// value properties
|
|
61
|
-
const valueProps = resolveProps.resolveProps(sep
|
|
61
|
+
const valueProps = resolveProps.resolveProps(sep !== null && sep !== void 0 ? sep : [], {
|
|
62
62
|
indicator: 'map-value-ind',
|
|
63
63
|
next: value,
|
|
64
64
|
offset: keyNode.range[2],
|
|
@@ -184,7 +184,9 @@ function splitLines(source) {
|
|
|
184
184
|
const split = source.split(/\n( *)/);
|
|
185
185
|
const first = split[0];
|
|
186
186
|
const m = first.match(/^( *)/);
|
|
187
|
-
const line0 = m
|
|
187
|
+
const line0 = (m === null || m === void 0 ? void 0 : m[1])
|
|
188
|
+
? [m[1], first.slice(m[1].length)]
|
|
189
|
+
: ['', first];
|
|
188
190
|
const lines = [line0];
|
|
189
191
|
for (let i = 1; i < split.length; i += 2)
|
|
190
192
|
lines.push([split[i], split[i + 1]]);
|
|
@@ -12,6 +12,7 @@ var utilMapIncludes = require('./util-map-includes.js');
|
|
|
12
12
|
const blockMsg = 'Block collections are not allowed within flow collections';
|
|
13
13
|
const isBlock = (token) => token && (token.type === 'block-map' || token.type === 'block-seq');
|
|
14
14
|
function resolveFlowCollection({ composeNode, composeEmptyNode }, ctx, fc, onError) {
|
|
15
|
+
var _a;
|
|
15
16
|
const isMap = fc.start.source === '{';
|
|
16
17
|
const fcName = isMap ? 'flow map' : 'flow sequence';
|
|
17
18
|
const coll = isMap
|
|
@@ -28,7 +29,7 @@ function resolveFlowCollection({ composeNode, composeEmptyNode }, ctx, fc, onErr
|
|
|
28
29
|
const props = resolveProps.resolveProps(start, {
|
|
29
30
|
flow: fcName,
|
|
30
31
|
indicator: 'explicit-key-ind',
|
|
31
|
-
next: key
|
|
32
|
+
next: key !== null && key !== void 0 ? key : sep === null || sep === void 0 ? void 0 : sep[0],
|
|
32
33
|
offset,
|
|
33
34
|
onError,
|
|
34
35
|
startOnNewline: false
|
|
@@ -76,7 +77,7 @@ function resolveFlowCollection({ composeNode, composeEmptyNode }, ctx, fc, onErr
|
|
|
76
77
|
if (prevItemComment) {
|
|
77
78
|
let prev = coll.items[coll.items.length - 1];
|
|
78
79
|
if (Node.isPair(prev))
|
|
79
|
-
prev = prev.value
|
|
80
|
+
prev = (_a = prev.value) !== null && _a !== void 0 ? _a : prev.key;
|
|
80
81
|
if (prev.comment)
|
|
81
82
|
prev.comment += '\n' + prevItemComment;
|
|
82
83
|
else
|
|
@@ -106,7 +107,7 @@ function resolveFlowCollection({ composeNode, composeEmptyNode }, ctx, fc, onErr
|
|
|
106
107
|
if (isBlock(key))
|
|
107
108
|
onError(keyNode.range, 'BLOCK_IN_FLOW', blockMsg);
|
|
108
109
|
// value properties
|
|
109
|
-
const valueProps = resolveProps.resolveProps(sep
|
|
110
|
+
const valueProps = resolveProps.resolveProps(sep !== null && sep !== void 0 ? sep : [], {
|
|
110
111
|
flow: fcName,
|
|
111
112
|
indicator: 'map-value-ind',
|
|
112
113
|
next: value,
|
|
@@ -74,6 +74,7 @@ function singleQuotedValue(source, onError) {
|
|
|
74
74
|
return foldLines(source.slice(1, -1)).replace(/''/g, "'");
|
|
75
75
|
}
|
|
76
76
|
function foldLines(source) {
|
|
77
|
+
var _a;
|
|
77
78
|
/**
|
|
78
79
|
* The negative lookbehind here and in the `re` RegExp is to
|
|
79
80
|
* prevent causing a polynomial search time in certain cases.
|
|
@@ -113,7 +114,7 @@ function foldLines(source) {
|
|
|
113
114
|
const last = /[ \t]*(.*)/sy;
|
|
114
115
|
last.lastIndex = pos;
|
|
115
116
|
match = last.exec(source);
|
|
116
|
-
return res + sep + ((match
|
|
117
|
+
return res + sep + ((_a = match === null || match === void 0 ? void 0 : match[1]) !== null && _a !== void 0 ? _a : '');
|
|
117
118
|
}
|
|
118
119
|
function doubleQuotedValue(source, onError) {
|
|
119
120
|
let res = '';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { SourceToken, Token } from '../parse/cst.js';
|
|
2
2
|
import type { ComposeErrorHandler } from './composer.js';
|
|
3
3
|
export interface ResolvePropsArg {
|
|
4
|
-
flow?:
|
|
4
|
+
flow?: 'flow map' | 'flow sequence';
|
|
5
5
|
indicator: 'doc-start' | 'explicit-key-ind' | 'map-value-ind' | 'seq-item-ind';
|
|
6
6
|
next: Token | null | undefined;
|
|
7
7
|
offset: number;
|
|
@@ -86,7 +86,7 @@ function resolveProps(tokens, { flow, indicator, next, offset, onError, startOnN
|
|
|
86
86
|
if (anchor || tag)
|
|
87
87
|
onError(token, 'BAD_PROP_ORDER', `Anchors and tags must be after the ${token.source} indicator`);
|
|
88
88
|
if (found)
|
|
89
|
-
onError(token, 'UNEXPECTED_TOKEN', `Unexpected ${token.source} in ${flow
|
|
89
|
+
onError(token, 'UNEXPECTED_TOKEN', `Unexpected ${token.source} in ${flow !== null && flow !== void 0 ? flow : 'collection'}`);
|
|
90
90
|
found = token;
|
|
91
91
|
atNewline = false;
|
|
92
92
|
hasSpace = false;
|
|
@@ -122,7 +122,7 @@ export declare class Document<T = unknown> {
|
|
|
122
122
|
*
|
|
123
123
|
* Overrides all previously set schema options.
|
|
124
124
|
*/
|
|
125
|
-
setSchema(version: '1.1' | '1.2' | null, options?: SchemaOptions): void;
|
|
125
|
+
setSchema(version: '1.1' | '1.2' | 'next' | null, options?: SchemaOptions): void;
|
|
126
126
|
/** A plain JavaScript representation of the document `contents`. */
|
|
127
127
|
toJS(opt?: ToJSOptions & {
|
|
128
128
|
[ignored: string]: unknown;
|
|
@@ -104,6 +104,7 @@ class Document {
|
|
|
104
104
|
if (!node.anchor) {
|
|
105
105
|
const prev = anchors.anchorNames(this);
|
|
106
106
|
node.anchor =
|
|
107
|
+
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
|
|
107
108
|
!name || prev.has(name) ? anchors.findNewAnchor(name || 'a', prev) : name;
|
|
108
109
|
}
|
|
109
110
|
return new Alias.Alias(node.anchor);
|
|
@@ -125,8 +126,10 @@ class Document {
|
|
|
125
126
|
options = replacer;
|
|
126
127
|
replacer = undefined;
|
|
127
128
|
}
|
|
128
|
-
const { aliasDuplicateObjects, anchorPrefix, flow, keepUndefined, onTagObj, tag } = options
|
|
129
|
-
const { onAnchor, setAnchors, sourceObjects } = anchors.createNodeAnchors(this,
|
|
129
|
+
const { aliasDuplicateObjects, anchorPrefix, flow, keepUndefined, onTagObj, tag } = options !== null && options !== void 0 ? options : {};
|
|
130
|
+
const { onAnchor, setAnchors, sourceObjects } = anchors.createNodeAnchors(this,
|
|
131
|
+
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
|
|
132
|
+
anchorPrefix || 'a');
|
|
130
133
|
const ctx = {
|
|
131
134
|
aliasDuplicateObjects: aliasDuplicateObjects !== null && aliasDuplicateObjects !== void 0 ? aliasDuplicateObjects : true,
|
|
132
135
|
keepUndefined: keepUndefined !== null && keepUndefined !== void 0 ? keepUndefined : false,
|
|
@@ -257,10 +260,11 @@ class Document {
|
|
|
257
260
|
opt = { merge: true, resolveKnownTags: false, schema: 'yaml-1.1' };
|
|
258
261
|
break;
|
|
259
262
|
case '1.2':
|
|
263
|
+
case 'next':
|
|
260
264
|
if (this.directives)
|
|
261
|
-
this.directives.yaml.version =
|
|
265
|
+
this.directives.yaml.version = version;
|
|
262
266
|
else
|
|
263
|
-
this.directives = new directives.Directives({ version
|
|
267
|
+
this.directives = new directives.Directives({ version });
|
|
264
268
|
opt = { merge: false, resolveKnownTags: true, schema: 'core' };
|
|
265
269
|
break;
|
|
266
270
|
case null:
|
|
@@ -292,7 +296,7 @@ class Document {
|
|
|
292
296
|
maxAliasCount: typeof maxAliasCount === 'number' ? maxAliasCount : 100,
|
|
293
297
|
stringify: stringify.stringify
|
|
294
298
|
};
|
|
295
|
-
const res = toJS.toJS(this.contents, jsonArg
|
|
299
|
+
const res = toJS.toJS(this.contents, jsonArg !== null && jsonArg !== void 0 ? jsonArg : '', ctx);
|
|
296
300
|
if (typeof onAnchor === 'function')
|
|
297
301
|
for (const { count, res } of ctx.anchors.values())
|
|
298
302
|
onAnchor(res, count);
|
|
@@ -10,13 +10,13 @@ export declare function anchorNames(root: Document | Node): Set<string>;
|
|
|
10
10
|
/** Find a new anchor name with the given `prefix` and a one-indexed suffix. */
|
|
11
11
|
export declare function findNewAnchor(prefix: string, exclude: Set<string>): string;
|
|
12
12
|
export declare function createNodeAnchors(doc: Document, prefix: string): {
|
|
13
|
-
onAnchor(source: unknown)
|
|
13
|
+
onAnchor: (source: unknown) => string;
|
|
14
14
|
/**
|
|
15
15
|
* With circular references, the source node is only resolved after all
|
|
16
16
|
* of its child nodes are. This is why anchors are set only after all of
|
|
17
17
|
* the nodes have been created.
|
|
18
18
|
*/
|
|
19
|
-
setAnchors()
|
|
19
|
+
setAnchors: () => void;
|
|
20
20
|
sourceObjects: Map<unknown, {
|
|
21
21
|
anchor: string | null;
|
|
22
22
|
node: Node | null;
|
|
@@ -39,7 +39,7 @@ function createNodeAnchors(doc, prefix) {
|
|
|
39
39
|
const sourceObjects = new Map();
|
|
40
40
|
let prevAnchors = null;
|
|
41
41
|
return {
|
|
42
|
-
onAnchor(source) {
|
|
42
|
+
onAnchor: (source) => {
|
|
43
43
|
aliasObjects.push(source);
|
|
44
44
|
if (!prevAnchors)
|
|
45
45
|
prevAnchors = anchorNames(doc);
|
|
@@ -52,7 +52,7 @@ function createNodeAnchors(doc, prefix) {
|
|
|
52
52
|
* of its child nodes are. This is why anchors are set only after all of
|
|
53
53
|
* the nodes have been created.
|
|
54
54
|
*/
|
|
55
|
-
setAnchors() {
|
|
55
|
+
setAnchors: () => {
|
|
56
56
|
for (const source of aliasObjects) {
|
|
57
57
|
const ref = sourceObjects.get(source);
|
|
58
58
|
if (typeof ref === 'object' &&
|
|
@@ -5,7 +5,7 @@ import type { Replacer } from './Document.js';
|
|
|
5
5
|
export interface CreateNodeContext {
|
|
6
6
|
aliasDuplicateObjects: boolean;
|
|
7
7
|
keepUndefined: boolean;
|
|
8
|
-
onAnchor(source: unknown)
|
|
8
|
+
onAnchor: (source: unknown) => string;
|
|
9
9
|
onTagObj?: (tagObj: ScalarTag | CollectionTag) => void;
|
|
10
10
|
sourceObjects: Map<unknown, {
|
|
11
11
|
anchor: string | null;
|
|
@@ -6,14 +6,15 @@ var Scalar = require('../nodes/Scalar.js');
|
|
|
6
6
|
|
|
7
7
|
const defaultTagPrefix = 'tag:yaml.org,2002:';
|
|
8
8
|
function findTagObject(value, tagName, tags) {
|
|
9
|
+
var _a;
|
|
9
10
|
if (tagName) {
|
|
10
11
|
const match = tags.filter(t => t.tag === tagName);
|
|
11
|
-
const tagObj = match.find(t => !t.format)
|
|
12
|
+
const tagObj = (_a = match.find(t => !t.format)) !== null && _a !== void 0 ? _a : match[0];
|
|
12
13
|
if (!tagObj)
|
|
13
14
|
throw new Error(`Tag ${tagName} not found`);
|
|
14
15
|
return tagObj;
|
|
15
16
|
}
|
|
16
|
-
return tags.find(t => t.identify
|
|
17
|
+
return tags.find(t => { var _a; return ((_a = t.identify) === null || _a === void 0 ? void 0 : _a.call(t, value)) && !t.format; });
|
|
17
18
|
}
|
|
18
19
|
function createNode(value, tagName, ctx) {
|
|
19
20
|
var _a, _b;
|
|
@@ -50,12 +51,14 @@ function createNode(value, tagName, ctx) {
|
|
|
50
51
|
sourceObjects.set(value, ref);
|
|
51
52
|
}
|
|
52
53
|
}
|
|
53
|
-
if (tagName
|
|
54
|
+
if (tagName === null || tagName === void 0 ? void 0 : tagName.startsWith('!!'))
|
|
54
55
|
tagName = defaultTagPrefix + tagName.slice(2);
|
|
55
56
|
let tagObj = findTagObject(value, tagName, schema.tags);
|
|
56
57
|
if (!tagObj) {
|
|
57
|
-
if (value && typeof value.toJSON === 'function')
|
|
58
|
+
if (value && typeof value.toJSON === 'function') {
|
|
59
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
|
|
58
60
|
value = value.toJSON();
|
|
61
|
+
}
|
|
59
62
|
if (!value || typeof value !== 'object') {
|
|
60
63
|
const node = new Scalar.Scalar(value);
|
|
61
64
|
if (ref)
|
|
@@ -25,11 +25,11 @@ class Pair {
|
|
|
25
25
|
return new Pair(key, value);
|
|
26
26
|
}
|
|
27
27
|
toJSON(_, ctx) {
|
|
28
|
-
const pair = ctx
|
|
28
|
+
const pair = (ctx === null || ctx === void 0 ? void 0 : ctx.mapAsMap) ? new Map() : {};
|
|
29
29
|
return addPairToJSMap.addPairToJSMap(ctx, pair, this);
|
|
30
30
|
}
|
|
31
31
|
toString(ctx, onComment, onChompKeep) {
|
|
32
|
-
return ctx
|
|
32
|
+
return (ctx === null || ctx === void 0 ? void 0 : ctx.doc)
|
|
33
33
|
? stringifyPair.stringifyPair(this, ctx, onComment, onChompKeep)
|
|
34
34
|
: JSON.stringify(this);
|
|
35
35
|
}
|
|
@@ -10,7 +10,7 @@ class Scalar extends Node.NodeBase {
|
|
|
10
10
|
this.value = value;
|
|
11
11
|
}
|
|
12
12
|
toJSON(arg, ctx) {
|
|
13
|
-
return ctx
|
|
13
|
+
return (ctx === null || ctx === void 0 ? void 0 : ctx.keep) ? this.value : toJS.toJS(this.value, arg, ctx);
|
|
14
14
|
}
|
|
15
15
|
toString() {
|
|
16
16
|
return String(this.value);
|