projen 0.88.2 → 0.88.3
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 +2 -2
- package/lib/awscdk/auto-discover.js +5 -5
- 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-py.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-py.js +1 -1
- package/lib/cdk8s/cdk8s-app-ts.js +1 -1
- package/lib/cdk8s/cdk8s-construct.js +1 -1
- package/lib/cdk8s/cdk8s-deps-py.js +1 -1
- package/lib/cdk8s/cdk8s-deps.js +1 -1
- package/lib/cdk8s/integration-test.js +1 -1
- package/lib/cdktf/cdktf-construct.js +1 -1
- package/lib/circleci/circleci.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/docker-compose-service.js +1 -1
- package/lib/docker-compose/docker-compose.js +1 -1
- package/lib/file.js +1 -1
- package/lib/gitattributes.js +1 -1
- package/lib/github/actions-provider.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-backport.js +1 -1
- package/lib/github/pull-request-lint.js +1 -1
- package/lib/github/stale.js +1 -1
- package/lib/github/task-workflow-job.js +1 -1
- package/lib/github/task-workflow.js +1 -1
- package/lib/github/workflow-actions.js +1 -1
- package/lib/github/workflow-jobs.js +1 -1
- package/lib/github/workflow-steps.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 +2 -2
- 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 +4 -4
- package/lib/javascript/license-checker.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 +2 -2
- package/lib/javascript/upgrade-dependencies.js +2 -2
- package/lib/javascript/yarnrc.js +1 -1
- package/lib/json-patch.js +1 -1
- 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-tree.js +1 -1
- package/lib/project.js +1 -1
- package/lib/projects.js +1 -1
- package/lib/projenrc-json.js +2 -2
- package/lib/projenrc.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/renovatebot.js +1 -1
- 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-ts.js +1 -1
- package/lib/typescript/projenrc.js +1 -1
- package/lib/typescript/typescript-typedoc.js +1 -1
- package/lib/typescript/typescript.js +6 -6
- package/lib/version.js +2 -2
- package/lib/vscode/devcontainer.js +1 -1
- package/lib/vscode/extensions.js +1 -1
- package/lib/vscode/launch-config.js +1 -1
- package/lib/vscode/settings.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/yaml/README.md +17 -3
- package/node_modules/yaml/browser/dist/compose/compose-doc.js +1 -0
- package/node_modules/yaml/browser/dist/compose/compose-node.js +10 -0
- package/node_modules/yaml/browser/dist/compose/compose-scalar.js +14 -8
- package/node_modules/yaml/browser/dist/compose/resolve-block-map.js +2 -0
- package/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +2 -0
- package/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +4 -0
- package/node_modules/yaml/browser/dist/compose/util-map-includes.js +1 -5
- package/node_modules/yaml/browser/dist/doc/Document.js +3 -2
- package/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +7 -49
- package/node_modules/yaml/browser/dist/public-api.js +3 -0
- package/node_modules/yaml/browser/dist/schema/Schema.js +1 -2
- package/node_modules/yaml/browser/dist/schema/tags.js +26 -13
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +64 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +2 -0
- package/node_modules/yaml/browser/dist/stringify/stringify.js +6 -1
- package/node_modules/yaml/dist/compose/compose-doc.js +1 -0
- package/node_modules/yaml/dist/compose/compose-node.d.ts +1 -0
- package/node_modules/yaml/dist/compose/compose-node.js +10 -0
- package/node_modules/yaml/dist/compose/compose-scalar.js +13 -7
- package/node_modules/yaml/dist/compose/resolve-block-map.js +2 -0
- package/node_modules/yaml/dist/compose/resolve-block-seq.js +2 -0
- package/node_modules/yaml/dist/compose/resolve-flow-collection.js +4 -0
- package/node_modules/yaml/dist/compose/util-map-includes.js +1 -5
- package/node_modules/yaml/dist/doc/Document.js +3 -2
- package/node_modules/yaml/dist/errors.d.ts +1 -1
- package/node_modules/yaml/dist/nodes/Node.d.ts +7 -1
- package/node_modules/yaml/dist/nodes/addPairToJSMap.js +6 -48
- package/node_modules/yaml/dist/options.d.ts +6 -0
- package/node_modules/yaml/dist/parse/lexer.d.ts +1 -1
- package/node_modules/yaml/dist/parse/parser.d.ts +3 -3
- package/node_modules/yaml/dist/public-api.js +3 -0
- package/node_modules/yaml/dist/schema/Schema.d.ts +0 -1
- package/node_modules/yaml/dist/schema/Schema.js +1 -2
- package/node_modules/yaml/dist/schema/tags.d.ts +9 -1
- package/node_modules/yaml/dist/schema/tags.js +26 -13
- package/node_modules/yaml/dist/schema/types.d.ts +6 -4
- package/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/merge.js +68 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/schema.js +2 -0
- package/node_modules/yaml/dist/stringify/stringify.js +6 -1
- package/node_modules/yaml/package.json +1 -1
- package/package.json +3 -3
package/lib/web/tailwind.js
CHANGED
|
@@ -33,5 +33,5 @@ class TailwindConfig {
|
|
|
33
33
|
}
|
|
34
34
|
exports.TailwindConfig = TailwindConfig;
|
|
35
35
|
_a = JSII_RTTI_SYMBOL_1;
|
|
36
|
-
TailwindConfig[_a] = { fqn: "projen.web.TailwindConfig", version: "0.88.
|
|
36
|
+
TailwindConfig[_a] = { fqn: "projen.web.TailwindConfig", version: "0.88.3" };
|
|
37
37
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFpbHdpbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2ViL3RhaWx3aW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0Esa0NBQW1DO0FBU25DOzs7Ozs7O0dBT0c7QUFDSCxNQUFhLGNBQWM7SUFJekIsWUFBWSxPQUFvQixFQUFFLE9BQStCO1FBQy9ELElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxFQUFFLFFBQVEsSUFBSSxzQkFBc0IsQ0FBQztRQUU1RCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksZUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQy9DLEdBQUcsRUFBRTtnQkFDSCxPQUFPLEVBQUUsRUFBRTtnQkFDWCxLQUFLLEVBQUUsS0FBSztnQkFDWixLQUFLLEVBQUU7b0JBQ0wsTUFBTSxFQUFFLEVBQUU7aUJBQ1g7Z0JBQ0QsUUFBUSxFQUFFO29CQUNSLE1BQU0sRUFBRSxFQUFFO2lCQUNYO2dCQUNELE9BQU8sRUFBRSxFQUFFO2FBQ1o7U0FDRixDQUFDLENBQUM7UUFFSCxPQUFPLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7O0FBdEJILHdDQXVCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5vZGVQcm9qZWN0IH0gZnJvbSBcIi4uL2phdmFzY3JpcHRcIjtcbmltcG9ydCB7IEpzb25GaWxlIH0gZnJvbSBcIi4uL2pzb25cIjtcblxuZXhwb3J0IGludGVyZmFjZSBUYWlsd2luZENvbmZpZ09wdGlvbnMge1xuICAvKipcbiAgICogQGRlZmF1bHQgXCJ0YWlsd2luZC5jb25maWcuanNvblwiXG4gICAqL1xuICByZWFkb25seSBmaWxlTmFtZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZWNsYXJlcyBhIFRhaWx3aW5kIENTUyBjb25maWd1cmF0aW9uIGZpbGUuXG4gKlxuICogVGhlcmUgYXJlIG11bHRpcGxlIHdheXMgdG8gYWRkIFRhaWx3aW5kIENTUyBpbiB5b3VyIG5vZGUgcHJvamVjdCAtIHNlZTpcbiAqIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvaW5zdGFsbGF0aW9uXG4gKlxuICogQHNlZSBQb3N0Q3NzXG4gKi9cbmV4cG9ydCBjbGFzcyBUYWlsd2luZENvbmZpZyB7XG4gIHB1YmxpYyByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgZmlsZTogSnNvbkZpbGU7XG5cbiAgY29uc3RydWN0b3IocHJvamVjdDogTm9kZVByb2plY3QsIG9wdGlvbnM/OiBUYWlsd2luZENvbmZpZ09wdGlvbnMpIHtcbiAgICB0aGlzLmZpbGVOYW1lID0gb3B0aW9ucz8uZmlsZU5hbWUgPz8gXCJ0YWlsd2luZC5jb25maWcuanNvblwiO1xuXG4gICAgdGhpcy5maWxlID0gbmV3IEpzb25GaWxlKHByb2plY3QsIHRoaXMuZmlsZU5hbWUsIHtcbiAgICAgIG9iajoge1xuICAgICAgICBjb250ZW50OiBbXSxcbiAgICAgICAgbWVkaWE6IGZhbHNlLFxuICAgICAgICB0aGVtZToge1xuICAgICAgICAgIGV4dGVuZDoge30sXG4gICAgICAgIH0sXG4gICAgICAgIHZhcmlhbnRzOiB7XG4gICAgICAgICAgZXh0ZW5kOiB7fSxcbiAgICAgICAgfSxcbiAgICAgICAgcGx1Z2luczogW10sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgcHJvamVjdC5ucG1pZ25vcmU/LmV4Y2x1ZGUoYC8ke3RoaXMuZmlsZU5hbWV9YCk7XG4gIH1cbn1cbiJdfQ==
|
package/lib/xmlfile.js
CHANGED
|
@@ -32,5 +32,5 @@ class XmlFile extends object_file_1.ObjectFile {
|
|
|
32
32
|
}
|
|
33
33
|
exports.XmlFile = XmlFile;
|
|
34
34
|
_a = JSII_RTTI_SYMBOL_1;
|
|
35
|
-
XmlFile[_a] = { fqn: "projen.XmlFile", version: "0.88.
|
|
35
|
+
XmlFile[_a] = { fqn: "projen.XmlFile", version: "0.88.3" };
|
|
36
36
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1sZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy94bWxmaWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQWtEO0FBRWxELCtDQUE4RDtBQVE5RDs7Ozs7R0FLRztBQUNILE1BQWEsT0FBUSxTQUFRLHdCQUFVO0lBQ3JDLFlBQ0UsT0FBZ0IsRUFDaEIsUUFBZ0IsRUFDaEIsVUFBMEIsRUFBRTtRQUU1QixLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRVMsaUJBQWlCLENBQUMsUUFBbUI7UUFDN0MsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNULE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFBLG9CQUFTLEVBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQzFELFdBQVcsRUFBRSxJQUFJO1lBQ2pCLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUN0QixDQUFDLENBQUM7UUFFSCxPQUFPO1lBQ0wsU0FBUztZQUNULEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLE1BQU0sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNwRCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNmLENBQUM7O0FBeEJILDBCQXlCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZSBhcyBjcmVhdGV4bWwgfSBmcm9tIFwieG1sYnVpbGRlcjJcIjtcbmltcG9ydCB7IElSZXNvbHZlciB9IGZyb20gXCIuL2ZpbGVcIjtcbmltcG9ydCB7IE9iamVjdEZpbGUsIE9iamVjdEZpbGVPcHRpb25zIH0gZnJvbSBcIi4vb2JqZWN0LWZpbGVcIjtcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tIFwiLi9wcm9qZWN0XCI7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYFhtbEZpbGVgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFhtbEZpbGVPcHRpb25zIGV4dGVuZHMgT2JqZWN0RmlsZU9wdGlvbnMge31cblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIFhNTCBmaWxlLlxuICpcbiAqIE9iamVjdHMgcGFzc2VkIGluIHdpbGwgYmUgc3ludGhlc2l6ZWQgdXNpbmcgdGhlIG5wbSBcInhtbFwiIGxpYnJhcnkuXG4gKiBAc2VlIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL3htbFxuICovXG5leHBvcnQgY2xhc3MgWG1sRmlsZSBleHRlbmRzIE9iamVjdEZpbGUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm9qZWN0OiBQcm9qZWN0LFxuICAgIGZpbGVQYXRoOiBzdHJpbmcsXG4gICAgb3B0aW9uczogWG1sRmlsZU9wdGlvbnMgPSB7fVxuICApIHtcbiAgICBzdXBlcihwcm9qZWN0LCBmaWxlUGF0aCwgb3B0aW9ucyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3ludGhlc2l6ZUNvbnRlbnQocmVzb2x2ZXI6IElSZXNvbHZlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgb2JqID0gc3VwZXIuc3ludGhlc2l6ZUNvbnRlbnQocmVzb2x2ZXIpO1xuICAgIGlmICghb2JqKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHhtbFN0cmluZyA9IGNyZWF0ZXhtbCh7IGVuY29kaW5nOiBcIlVURi04XCIgfSwgb2JqKS5lbmQoe1xuICAgICAgcHJldHR5UHJpbnQ6IHRydWUsXG4gICAgICBpbmRlbnQ6IFwiIFwiLnJlcGVhdCg0KSxcbiAgICB9KTtcblxuICAgIHJldHVybiBbXG4gICAgICB4bWxTdHJpbmcsXG4gICAgICAuLi4odGhpcy5tYXJrZXIgPyBbYDwhLS0gJHt0aGlzLm1hcmtlcn0gLS0+YF0gOiBbXSksXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICB9XG59XG4iXX0=
|
package/lib/yaml.js
CHANGED
|
@@ -30,5 +30,5 @@ class YamlFile extends object_file_1.ObjectFile {
|
|
|
30
30
|
}
|
|
31
31
|
exports.YamlFile = YamlFile;
|
|
32
32
|
_a = JSII_RTTI_SYMBOL_1;
|
|
33
|
-
YamlFile[_a] = { fqn: "projen.YamlFile", version: "0.88.
|
|
33
|
+
YamlFile[_a] = { fqn: "projen.YamlFile", version: "0.88.3" };
|
|
34
34
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieWFtbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy95YW1sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0EsNkJBQTZCO0FBRTdCLCtDQUE4RDtBQWM5RDs7R0FFRztBQUNILE1BQWEsUUFBUyxTQUFRLHdCQUFVO0lBTXRDLFlBQVksS0FBaUIsRUFBRSxRQUFnQixFQUFFLE9BQXdCO1FBQ3ZFLEtBQUssQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVTLGlCQUFpQixDQUFDLFFBQW1CO1FBQzdDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsT0FBTztZQUNMLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxFQUFFO1lBQ0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMvQixNQUFNLEVBQUUsQ0FBQztnQkFDVCxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7YUFDMUIsQ0FBQztTQUNILENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2YsQ0FBQzs7QUF6QkgsNEJBMEJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUNvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgKiBhcyBZQU1MIGZyb20gXCJ5YW1sXCI7XG5pbXBvcnQgeyBJUmVzb2x2ZXIgfSBmcm9tIFwiLi9maWxlXCI7XG5pbXBvcnQgeyBPYmplY3RGaWxlLCBPYmplY3RGaWxlT3B0aW9ucyB9IGZyb20gXCIuL29iamVjdC1maWxlXCI7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYEpzb25GaWxlYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBZYW1sRmlsZU9wdGlvbnMgZXh0ZW5kcyBPYmplY3RGaWxlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBNYXhpbXVtIGxpbmUgd2lkdGggKHNldCB0byAwIHRvIGRpc2FibGUgZm9sZGluZykuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gMFxuICAgKi9cbiAgcmVhZG9ubHkgbGluZVdpZHRoPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBZQU1MIGZpbGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBZYW1sRmlsZSBleHRlbmRzIE9iamVjdEZpbGUge1xuICAvKipcbiAgICogTWF4aW11bSBsaW5lIHdpZHRoIChzZXQgdG8gMCB0byBkaXNhYmxlIGZvbGRpbmcpLlxuICAgKi9cbiAgcHVibGljIGxpbmVXaWR0aDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBJQ29uc3RydWN0LCBmaWxlUGF0aDogc3RyaW5nLCBvcHRpb25zOiBZYW1sRmlsZU9wdGlvbnMpIHtcbiAgICBzdXBlcihzY29wZSwgZmlsZVBhdGgsIG9wdGlvbnMpO1xuICAgIHRoaXMubGluZVdpZHRoID0gb3B0aW9ucy5saW5lV2lkdGggPz8gMDtcbiAgfVxuXG4gIHByb3RlY3RlZCBzeW50aGVzaXplQ29udGVudChyZXNvbHZlcjogSVJlc29sdmVyKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBqc29uID0gc3VwZXIuc3ludGhlc2l6ZUNvbnRlbnQocmVzb2x2ZXIpO1xuICAgIGlmICghanNvbikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gW1xuICAgICAgLi4uKHRoaXMubWFya2VyID8gW2AjICR7dGhpcy5tYXJrZXJ9YF0gOiBbXSksXG4gICAgICBcIlwiLFxuICAgICAgWUFNTC5zdHJpbmdpZnkoSlNPTi5wYXJzZShqc29uKSwge1xuICAgICAgICBpbmRlbnQ6IDIsXG4gICAgICAgIGxpbmVXaWR0aDogdGhpcy5saW5lV2lkdGgsXG4gICAgICB9KSxcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -30,9 +30,23 @@ npm install yaml
|
|
|
30
30
|
|
|
31
31
|
The development and maintenance of this library is [sponsored](https://github.com/sponsors/eemeli) by:
|
|
32
32
|
|
|
33
|
-
<
|
|
34
|
-
<
|
|
35
|
-
|
|
33
|
+
<p align="center" width="100%">
|
|
34
|
+
<a href="https://www.scipress.io/"
|
|
35
|
+
><img
|
|
36
|
+
width="150"
|
|
37
|
+
align="top"
|
|
38
|
+
src="https://eemeli.org/yaml/images/scipress.svg"
|
|
39
|
+
alt="Scipress"
|
|
40
|
+
/></a>
|
|
41
|
+
|
|
42
|
+
<a href="https://manifest.build/"
|
|
43
|
+
><img
|
|
44
|
+
width="150"
|
|
45
|
+
align="top"
|
|
46
|
+
src="https://eemeli.org/yaml/images/manifest.svg"
|
|
47
|
+
alt="Manifest"
|
|
48
|
+
/></a>
|
|
49
|
+
</p>
|
|
36
50
|
|
|
37
51
|
## API Overview
|
|
38
52
|
|
|
@@ -7,6 +7,7 @@ function composeDoc(options, directives, { offset, start, value, end }, onError)
|
|
|
7
7
|
const opts = Object.assign({ _directives: directives }, options);
|
|
8
8
|
const doc = new Document(undefined, opts);
|
|
9
9
|
const ctx = {
|
|
10
|
+
atKey: false,
|
|
10
11
|
atRoot: true,
|
|
11
12
|
directives: doc.directives,
|
|
12
13
|
options: doc.options,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Alias } from '../nodes/Alias.js';
|
|
2
|
+
import { isScalar } from '../nodes/identity.js';
|
|
2
3
|
import { composeCollection } from './compose-collection.js';
|
|
3
4
|
import { composeScalar } from './compose-scalar.js';
|
|
4
5
|
import { resolveEnd } from './resolve-end.js';
|
|
@@ -6,6 +7,7 @@ import { emptyScalarPosition } from './util-empty-scalar-position.js';
|
|
|
6
7
|
|
|
7
8
|
const CN = { composeNode, composeEmptyNode };
|
|
8
9
|
function composeNode(ctx, token, props, onError) {
|
|
10
|
+
const atKey = ctx.atKey;
|
|
9
11
|
const { spaceBefore, comment, anchor, tag } = props;
|
|
10
12
|
let node;
|
|
11
13
|
let isSrcToken = true;
|
|
@@ -41,6 +43,14 @@ function composeNode(ctx, token, props, onError) {
|
|
|
41
43
|
}
|
|
42
44
|
if (anchor && node.anchor === '')
|
|
43
45
|
onError(anchor, 'BAD_ALIAS', 'Anchor cannot be an empty string');
|
|
46
|
+
if (atKey &&
|
|
47
|
+
ctx.options.stringKeys &&
|
|
48
|
+
(!isScalar(node) ||
|
|
49
|
+
typeof node.value !== 'string' ||
|
|
50
|
+
(node.tag && node.tag !== 'tag:yaml.org,2002:str'))) {
|
|
51
|
+
const msg = 'With stringKeys, all keys must be strings';
|
|
52
|
+
onError(tag ?? token, 'NON_STRING_KEY', msg);
|
|
53
|
+
}
|
|
44
54
|
if (spaceBefore)
|
|
45
55
|
node.spaceBefore = true;
|
|
46
56
|
if (comment) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isScalar, SCALAR } from '../nodes/identity.js';
|
|
2
2
|
import { Scalar } from '../nodes/Scalar.js';
|
|
3
3
|
import { resolveBlockScalar } from './resolve-block-scalar.js';
|
|
4
4
|
import { resolveFlowScalar } from './resolve-flow-scalar.js';
|
|
@@ -10,11 +10,16 @@ function composeScalar(ctx, token, tagToken, onError) {
|
|
|
10
10
|
const tagName = tagToken
|
|
11
11
|
? ctx.directives.tagName(tagToken.source, msg => onError(tagToken, 'TAG_RESOLVE_FAILED', msg))
|
|
12
12
|
: null;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
let tag;
|
|
14
|
+
if (ctx.options.stringKeys && ctx.atKey) {
|
|
15
|
+
tag = ctx.schema[SCALAR];
|
|
16
|
+
}
|
|
17
|
+
else if (tagName)
|
|
18
|
+
tag = findScalarTagByName(ctx.schema, value, tagName, tagToken, onError);
|
|
19
|
+
else if (token.type === 'scalar')
|
|
20
|
+
tag = findScalarTagByTest(ctx, value, token, onError);
|
|
21
|
+
else
|
|
22
|
+
tag = ctx.schema[SCALAR];
|
|
18
23
|
let scalar;
|
|
19
24
|
try {
|
|
20
25
|
const res = tag.resolve(value, msg => onError(tagToken ?? token, 'TAG_RESOLVE_FAILED', msg), ctx.options);
|
|
@@ -62,8 +67,9 @@ function findScalarTagByName(schema, value, tagName, tagToken, onError) {
|
|
|
62
67
|
onError(tagToken, 'TAG_RESOLVE_FAILED', `Unresolved tag: ${tagName}`, tagName !== 'tag:yaml.org,2002:str');
|
|
63
68
|
return schema[SCALAR];
|
|
64
69
|
}
|
|
65
|
-
function findScalarTagByTest({ directives, schema }, value, token, onError) {
|
|
66
|
-
const tag = schema.tags.find(tag => tag.default && tag.
|
|
70
|
+
function findScalarTagByTest({ atKey, directives, schema }, value, token, onError) {
|
|
71
|
+
const tag = schema.tags.find(tag => (tag.default === true || (atKey && tag.default === 'key')) &&
|
|
72
|
+
tag.test?.test(value)) || schema[SCALAR];
|
|
67
73
|
if (schema.compat) {
|
|
68
74
|
const compat = schema.compat.find(tag => tag.default && tag.test?.test(value)) ??
|
|
69
75
|
schema[SCALAR];
|
|
@@ -50,12 +50,14 @@ function resolveBlockMap({ composeNode, composeEmptyNode }, ctx, bm, onError, ta
|
|
|
50
50
|
onError(offset, 'BAD_INDENT', startColMsg);
|
|
51
51
|
}
|
|
52
52
|
// key value
|
|
53
|
+
ctx.atKey = true;
|
|
53
54
|
const keyStart = keyProps.end;
|
|
54
55
|
const keyNode = key
|
|
55
56
|
? composeNode(ctx, key, keyProps, onError)
|
|
56
57
|
: composeEmptyNode(ctx, keyStart, start, null, keyProps, onError);
|
|
57
58
|
if (ctx.schema.compat)
|
|
58
59
|
flowIndentCheck(bm.indent, key, onError);
|
|
60
|
+
ctx.atKey = false;
|
|
59
61
|
if (mapIncludes(ctx, map.items, keyNode))
|
|
60
62
|
onError(keyStart, 'DUPLICATE_KEY', 'Map keys must be unique');
|
|
61
63
|
// value properties
|
|
@@ -7,6 +7,8 @@ function resolveBlockSeq({ composeNode, composeEmptyNode }, ctx, bs, onError, ta
|
|
|
7
7
|
const seq = new NodeClass(ctx.schema);
|
|
8
8
|
if (ctx.atRoot)
|
|
9
9
|
ctx.atRoot = false;
|
|
10
|
+
if (ctx.atKey)
|
|
11
|
+
ctx.atKey = false;
|
|
10
12
|
let offset = bs.offset;
|
|
11
13
|
let commentEnd = null;
|
|
12
14
|
for (const { start, value } of bs.items) {
|
|
@@ -18,6 +18,8 @@ function resolveFlowCollection({ composeNode, composeEmptyNode }, ctx, fc, onErr
|
|
|
18
18
|
const atRoot = ctx.atRoot;
|
|
19
19
|
if (atRoot)
|
|
20
20
|
ctx.atRoot = false;
|
|
21
|
+
if (ctx.atKey)
|
|
22
|
+
ctx.atKey = false;
|
|
21
23
|
let offset = fc.offset + fc.start.source.length;
|
|
22
24
|
for (let i = 0; i < fc.items.length; ++i) {
|
|
23
25
|
const collItem = fc.items[i];
|
|
@@ -97,12 +99,14 @@ function resolveFlowCollection({ composeNode, composeEmptyNode }, ctx, fc, onErr
|
|
|
97
99
|
else {
|
|
98
100
|
// item is a key+value pair
|
|
99
101
|
// key value
|
|
102
|
+
ctx.atKey = true;
|
|
100
103
|
const keyStart = props.end;
|
|
101
104
|
const keyNode = key
|
|
102
105
|
? composeNode(ctx, key, props, onError)
|
|
103
106
|
: composeEmptyNode(ctx, keyStart, start, null, props, onError);
|
|
104
107
|
if (isBlock(key))
|
|
105
108
|
onError(keyNode.range, 'BLOCK_IN_FLOW', blockMsg);
|
|
109
|
+
ctx.atKey = false;
|
|
106
110
|
// value properties
|
|
107
111
|
const valueProps = resolveProps(sep ?? [], {
|
|
108
112
|
flow: fcName,
|
|
@@ -6,11 +6,7 @@ function mapIncludes(ctx, items, search) {
|
|
|
6
6
|
return false;
|
|
7
7
|
const isEqual = typeof uniqueKeys === 'function'
|
|
8
8
|
? uniqueKeys
|
|
9
|
-
: (a, b) => a === b ||
|
|
10
|
-
(isScalar(a) &&
|
|
11
|
-
isScalar(b) &&
|
|
12
|
-
a.value === b.value &&
|
|
13
|
-
!(a.value === '<<' && ctx.schema.merge));
|
|
9
|
+
: (a, b) => a === b || (isScalar(a) && isScalar(b) && a.value === b.value);
|
|
14
10
|
return items.some(pair => isEqual(pair.key, search));
|
|
15
11
|
}
|
|
16
12
|
|
|
@@ -35,6 +35,7 @@ class Document {
|
|
|
35
35
|
logLevel: 'warn',
|
|
36
36
|
prettyErrors: true,
|
|
37
37
|
strict: true,
|
|
38
|
+
stringKeys: false,
|
|
38
39
|
uniqueKeys: true,
|
|
39
40
|
version: '1.2'
|
|
40
41
|
}, options);
|
|
@@ -258,7 +259,7 @@ class Document {
|
|
|
258
259
|
this.directives.yaml.version = '1.1';
|
|
259
260
|
else
|
|
260
261
|
this.directives = new Directives({ version: '1.1' });
|
|
261
|
-
opt = {
|
|
262
|
+
opt = { resolveKnownTags: false, schema: 'yaml-1.1' };
|
|
262
263
|
break;
|
|
263
264
|
case '1.2':
|
|
264
265
|
case 'next':
|
|
@@ -266,7 +267,7 @@ class Document {
|
|
|
266
267
|
this.directives.yaml.version = version;
|
|
267
268
|
else
|
|
268
269
|
this.directives = new Directives({ version });
|
|
269
|
-
opt = {
|
|
270
|
+
opt = { resolveKnownTags: true, schema: 'core' };
|
|
270
271
|
break;
|
|
271
272
|
case null:
|
|
272
273
|
if (this.directives)
|
|
@@ -1,22 +1,15 @@
|
|
|
1
1
|
import { warn } from '../log.js';
|
|
2
|
+
import { isMergeKey, addMergeToJSMap } from '../schema/yaml-1.1/merge.js';
|
|
2
3
|
import { createStringifyContext } from '../stringify/stringify.js';
|
|
3
|
-
import {
|
|
4
|
-
import { Scalar } from './Scalar.js';
|
|
4
|
+
import { isNode } from './identity.js';
|
|
5
5
|
import { toJS } from './toJS.js';
|
|
6
6
|
|
|
7
|
-
const MERGE_KEY = '<<';
|
|
8
7
|
function addPairToJSMap(ctx, map, { key, value }) {
|
|
9
|
-
if (
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
else if (Array.isArray(value))
|
|
15
|
-
for (const it of value)
|
|
16
|
-
mergeToJSMap(ctx, map, it);
|
|
17
|
-
else
|
|
18
|
-
mergeToJSMap(ctx, map, value);
|
|
19
|
-
}
|
|
8
|
+
if (isNode(key) && key.addToJSMap)
|
|
9
|
+
key.addToJSMap(ctx, map, value);
|
|
10
|
+
// TODO: Should drop this special case for bare << handling
|
|
11
|
+
else if (isMergeKey(ctx, key))
|
|
12
|
+
addMergeToJSMap(ctx, map, value);
|
|
20
13
|
else {
|
|
21
14
|
const jsKey = toJS(key, '', ctx);
|
|
22
15
|
if (map instanceof Map) {
|
|
@@ -41,41 +34,6 @@ function addPairToJSMap(ctx, map, { key, value }) {
|
|
|
41
34
|
}
|
|
42
35
|
return map;
|
|
43
36
|
}
|
|
44
|
-
const isMergeKey = (key) => key === MERGE_KEY ||
|
|
45
|
-
(isScalar(key) &&
|
|
46
|
-
key.value === MERGE_KEY &&
|
|
47
|
-
(!key.type || key.type === Scalar.PLAIN));
|
|
48
|
-
// If the value associated with a merge key is a single mapping node, each of
|
|
49
|
-
// its key/value pairs is inserted into the current mapping, unless the key
|
|
50
|
-
// already exists in it. If the value associated with the merge key is a
|
|
51
|
-
// sequence, then this sequence is expected to contain mapping nodes and each
|
|
52
|
-
// of these nodes is merged in turn according to its order in the sequence.
|
|
53
|
-
// Keys in mapping nodes earlier in the sequence override keys specified in
|
|
54
|
-
// later mapping nodes. -- http://yaml.org/type/merge.html
|
|
55
|
-
function mergeToJSMap(ctx, map, value) {
|
|
56
|
-
const source = ctx && isAlias(value) ? value.resolve(ctx.doc) : value;
|
|
57
|
-
if (!isMap(source))
|
|
58
|
-
throw new Error('Merge sources must be maps or map aliases');
|
|
59
|
-
const srcMap = source.toJSON(null, ctx, Map);
|
|
60
|
-
for (const [key, value] of srcMap) {
|
|
61
|
-
if (map instanceof Map) {
|
|
62
|
-
if (!map.has(key))
|
|
63
|
-
map.set(key, value);
|
|
64
|
-
}
|
|
65
|
-
else if (map instanceof Set) {
|
|
66
|
-
map.add(key);
|
|
67
|
-
}
|
|
68
|
-
else if (!Object.prototype.hasOwnProperty.call(map, key)) {
|
|
69
|
-
Object.defineProperty(map, key, {
|
|
70
|
-
value,
|
|
71
|
-
writable: true,
|
|
72
|
-
enumerable: true,
|
|
73
|
-
configurable: true
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return map;
|
|
78
|
-
}
|
|
79
37
|
function stringifyKey(key, jsKey, ctx) {
|
|
80
38
|
if (jsKey === null)
|
|
81
39
|
return '';
|
|
@@ -2,6 +2,7 @@ import { Composer } from './compose/composer.js';
|
|
|
2
2
|
import { Document } from './doc/Document.js';
|
|
3
3
|
import { prettifyError, YAMLParseError } from './errors.js';
|
|
4
4
|
import { warn } from './log.js';
|
|
5
|
+
import { isDocument } from './nodes/identity.js';
|
|
5
6
|
import { LineCounter } from './parse/line-counter.js';
|
|
6
7
|
import { Parser } from './parse/parser.js';
|
|
7
8
|
|
|
@@ -93,6 +94,8 @@ function stringify(value, replacer, options) {
|
|
|
93
94
|
if (!keepUndefined)
|
|
94
95
|
return undefined;
|
|
95
96
|
}
|
|
97
|
+
if (isDocument(value) && !_replacer)
|
|
98
|
+
return value.toString(options);
|
|
96
99
|
return new Document(value, _replacer, options).toString(options);
|
|
97
100
|
}
|
|
98
101
|
|
|
@@ -12,10 +12,9 @@ class Schema {
|
|
|
12
12
|
: compat
|
|
13
13
|
? getTags(null, compat)
|
|
14
14
|
: null;
|
|
15
|
-
this.merge = !!merge;
|
|
16
15
|
this.name = (typeof schema === 'string' && schema) || 'core';
|
|
17
16
|
this.knownTags = resolveKnownTags ? coreKnownTags : {};
|
|
18
|
-
this.tags = getTags(customTags, this.name);
|
|
17
|
+
this.tags = getTags(customTags, this.name, merge);
|
|
19
18
|
this.toStringOptions = toStringDefaults ?? null;
|
|
20
19
|
Object.defineProperty(this, MAP, { value: map });
|
|
21
20
|
Object.defineProperty(this, SCALAR, { value: string });
|
|
@@ -8,6 +8,7 @@ import { int, intHex, intOct } from './core/int.js';
|
|
|
8
8
|
import { schema } from './core/schema.js';
|
|
9
9
|
import { schema as schema$1 } from './json/schema.js';
|
|
10
10
|
import { binary } from './yaml-1.1/binary.js';
|
|
11
|
+
import { merge } from './yaml-1.1/merge.js';
|
|
11
12
|
import { omap } from './yaml-1.1/omap.js';
|
|
12
13
|
import { pairs } from './yaml-1.1/pairs.js';
|
|
13
14
|
import { schema as schema$2 } from './yaml-1.1/schema.js';
|
|
@@ -33,6 +34,7 @@ const tagsByName = {
|
|
|
33
34
|
intOct,
|
|
34
35
|
intTime,
|
|
35
36
|
map,
|
|
37
|
+
merge,
|
|
36
38
|
null: nullTag,
|
|
37
39
|
omap,
|
|
38
40
|
pairs,
|
|
@@ -42,13 +44,20 @@ const tagsByName = {
|
|
|
42
44
|
};
|
|
43
45
|
const coreKnownTags = {
|
|
44
46
|
'tag:yaml.org,2002:binary': binary,
|
|
47
|
+
'tag:yaml.org,2002:merge': merge,
|
|
45
48
|
'tag:yaml.org,2002:omap': omap,
|
|
46
49
|
'tag:yaml.org,2002:pairs': pairs,
|
|
47
50
|
'tag:yaml.org,2002:set': set,
|
|
48
51
|
'tag:yaml.org,2002:timestamp': timestamp
|
|
49
52
|
};
|
|
50
|
-
function getTags(customTags, schemaName) {
|
|
51
|
-
|
|
53
|
+
function getTags(customTags, schemaName, addMergeTag) {
|
|
54
|
+
const schemaTags = schemas.get(schemaName);
|
|
55
|
+
if (schemaTags && !customTags) {
|
|
56
|
+
return addMergeTag && !schemaTags.includes(merge)
|
|
57
|
+
? schemaTags.concat(merge)
|
|
58
|
+
: schemaTags.slice();
|
|
59
|
+
}
|
|
60
|
+
let tags = schemaTags;
|
|
52
61
|
if (!tags) {
|
|
53
62
|
if (Array.isArray(customTags))
|
|
54
63
|
tags = [];
|
|
@@ -67,17 +76,21 @@ function getTags(customTags, schemaName) {
|
|
|
67
76
|
else if (typeof customTags === 'function') {
|
|
68
77
|
tags = customTags(tags.slice());
|
|
69
78
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
const tagObj = tagsByName[tag];
|
|
74
|
-
if (tagObj)
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
79
|
+
if (addMergeTag)
|
|
80
|
+
tags = tags.concat(merge);
|
|
81
|
+
return tags.reduce((tags, tag) => {
|
|
82
|
+
const tagObj = typeof tag === 'string' ? tagsByName[tag] : tag;
|
|
83
|
+
if (!tagObj) {
|
|
84
|
+
const tagName = JSON.stringify(tag);
|
|
85
|
+
const keys = Object.keys(tagsByName)
|
|
86
|
+
.map(key => JSON.stringify(key))
|
|
87
|
+
.join(', ');
|
|
88
|
+
throw new Error(`Unknown custom tag ${tagName}; use one of ${keys}`);
|
|
89
|
+
}
|
|
90
|
+
if (!tags.includes(tagObj))
|
|
91
|
+
tags.push(tagObj);
|
|
92
|
+
return tags;
|
|
93
|
+
}, []);
|
|
81
94
|
}
|
|
82
95
|
|
|
83
96
|
export { coreKnownTags, getTags };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { isScalar, isAlias, isSeq, isMap } from '../../nodes/identity.js';
|
|
2
|
+
import { Scalar } from '../../nodes/Scalar.js';
|
|
3
|
+
|
|
4
|
+
// If the value associated with a merge key is a single mapping node, each of
|
|
5
|
+
// its key/value pairs is inserted into the current mapping, unless the key
|
|
6
|
+
// already exists in it. If the value associated with the merge key is a
|
|
7
|
+
// sequence, then this sequence is expected to contain mapping nodes and each
|
|
8
|
+
// of these nodes is merged in turn according to its order in the sequence.
|
|
9
|
+
// Keys in mapping nodes earlier in the sequence override keys specified in
|
|
10
|
+
// later mapping nodes. -- http://yaml.org/type/merge.html
|
|
11
|
+
const MERGE_KEY = '<<';
|
|
12
|
+
const merge = {
|
|
13
|
+
identify: value => value === MERGE_KEY ||
|
|
14
|
+
(typeof value === 'symbol' && value.description === MERGE_KEY),
|
|
15
|
+
default: 'key',
|
|
16
|
+
tag: 'tag:yaml.org,2002:merge',
|
|
17
|
+
test: /^<<$/,
|
|
18
|
+
resolve: () => Object.assign(new Scalar(Symbol(MERGE_KEY)), {
|
|
19
|
+
addToJSMap: addMergeToJSMap
|
|
20
|
+
}),
|
|
21
|
+
stringify: () => MERGE_KEY
|
|
22
|
+
};
|
|
23
|
+
const isMergeKey = (ctx, key) => (merge.identify(key) ||
|
|
24
|
+
(isScalar(key) &&
|
|
25
|
+
(!key.type || key.type === Scalar.PLAIN) &&
|
|
26
|
+
merge.identify(key.value))) &&
|
|
27
|
+
ctx?.doc.schema.tags.some(tag => tag.tag === merge.tag && tag.default);
|
|
28
|
+
function addMergeToJSMap(ctx, map, value) {
|
|
29
|
+
value = ctx && isAlias(value) ? value.resolve(ctx.doc) : value;
|
|
30
|
+
if (isSeq(value))
|
|
31
|
+
for (const it of value.items)
|
|
32
|
+
mergeValue(ctx, map, it);
|
|
33
|
+
else if (Array.isArray(value))
|
|
34
|
+
for (const it of value)
|
|
35
|
+
mergeValue(ctx, map, it);
|
|
36
|
+
else
|
|
37
|
+
mergeValue(ctx, map, value);
|
|
38
|
+
}
|
|
39
|
+
function mergeValue(ctx, map, value) {
|
|
40
|
+
const source = ctx && isAlias(value) ? value.resolve(ctx.doc) : value;
|
|
41
|
+
if (!isMap(source))
|
|
42
|
+
throw new Error('Merge sources must be maps or map aliases');
|
|
43
|
+
const srcMap = source.toJSON(null, ctx, Map);
|
|
44
|
+
for (const [key, value] of srcMap) {
|
|
45
|
+
if (map instanceof Map) {
|
|
46
|
+
if (!map.has(key))
|
|
47
|
+
map.set(key, value);
|
|
48
|
+
}
|
|
49
|
+
else if (map instanceof Set) {
|
|
50
|
+
map.add(key);
|
|
51
|
+
}
|
|
52
|
+
else if (!Object.prototype.hasOwnProperty.call(map, key)) {
|
|
53
|
+
Object.defineProperty(map, key, {
|
|
54
|
+
value,
|
|
55
|
+
writable: true,
|
|
56
|
+
enumerable: true,
|
|
57
|
+
configurable: true
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return map;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export { addMergeToJSMap, isMergeKey, merge };
|
|
@@ -6,6 +6,7 @@ import { binary } from './binary.js';
|
|
|
6
6
|
import { trueTag, falseTag } from './bool.js';
|
|
7
7
|
import { floatNaN, floatExp, float } from './float.js';
|
|
8
8
|
import { intBin, intOct, int, intHex } from './int.js';
|
|
9
|
+
import { merge } from './merge.js';
|
|
9
10
|
import { omap } from './omap.js';
|
|
10
11
|
import { pairs } from './pairs.js';
|
|
11
12
|
import { set } from './set.js';
|
|
@@ -26,6 +27,7 @@ const schema = [
|
|
|
26
27
|
floatExp,
|
|
27
28
|
float,
|
|
28
29
|
binary,
|
|
30
|
+
merge,
|
|
29
31
|
omap,
|
|
30
32
|
pairs,
|
|
31
33
|
set,
|
|
@@ -54,7 +54,12 @@ function getTagObject(tags, item) {
|
|
|
54
54
|
let obj;
|
|
55
55
|
if (isScalar(item)) {
|
|
56
56
|
obj = item.value;
|
|
57
|
-
|
|
57
|
+
let match = tags.filter(t => t.identify?.(obj));
|
|
58
|
+
if (match.length > 1) {
|
|
59
|
+
const testMatch = match.filter(t => t.test);
|
|
60
|
+
if (testMatch.length > 0)
|
|
61
|
+
match = testMatch;
|
|
62
|
+
}
|
|
58
63
|
tagObj =
|
|
59
64
|
match.find(t => t.format === item.format) ?? match.find(t => !t.format);
|
|
60
65
|
}
|
|
@@ -9,6 +9,7 @@ function composeDoc(options, directives, { offset, start, value, end }, onError)
|
|
|
9
9
|
const opts = Object.assign({ _directives: directives }, options);
|
|
10
10
|
const doc = new Document.Document(undefined, opts);
|
|
11
11
|
const ctx = {
|
|
12
|
+
atKey: false,
|
|
12
13
|
atRoot: true,
|
|
13
14
|
directives: doc.directives,
|
|
14
15
|
options: doc.options,
|
|
@@ -5,6 +5,7 @@ import type { SourceToken, Token } from '../parse/cst.js';
|
|
|
5
5
|
import type { Schema } from '../schema/Schema.js';
|
|
6
6
|
import type { ComposeErrorHandler } from './composer.js';
|
|
7
7
|
export interface ComposeContext {
|
|
8
|
+
atKey: boolean;
|
|
8
9
|
atRoot: boolean;
|
|
9
10
|
directives: Directives;
|
|
10
11
|
options: Readonly<Required<Omit<ParseOptions, 'lineCounter'>>>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var Alias = require('../nodes/Alias.js');
|
|
4
|
+
var identity = require('../nodes/identity.js');
|
|
4
5
|
var composeCollection = require('./compose-collection.js');
|
|
5
6
|
var composeScalar = require('./compose-scalar.js');
|
|
6
7
|
var resolveEnd = require('./resolve-end.js');
|
|
@@ -8,6 +9,7 @@ var utilEmptyScalarPosition = require('./util-empty-scalar-position.js');
|
|
|
8
9
|
|
|
9
10
|
const CN = { composeNode, composeEmptyNode };
|
|
10
11
|
function composeNode(ctx, token, props, onError) {
|
|
12
|
+
const atKey = ctx.atKey;
|
|
11
13
|
const { spaceBefore, comment, anchor, tag } = props;
|
|
12
14
|
let node;
|
|
13
15
|
let isSrcToken = true;
|
|
@@ -43,6 +45,14 @@ function composeNode(ctx, token, props, onError) {
|
|
|
43
45
|
}
|
|
44
46
|
if (anchor && node.anchor === '')
|
|
45
47
|
onError(anchor, 'BAD_ALIAS', 'Anchor cannot be an empty string');
|
|
48
|
+
if (atKey &&
|
|
49
|
+
ctx.options.stringKeys &&
|
|
50
|
+
(!identity.isScalar(node) ||
|
|
51
|
+
typeof node.value !== 'string' ||
|
|
52
|
+
(node.tag && node.tag !== 'tag:yaml.org,2002:str'))) {
|
|
53
|
+
const msg = 'With stringKeys, all keys must be strings';
|
|
54
|
+
onError(tag ?? token, 'NON_STRING_KEY', msg);
|
|
55
|
+
}
|
|
46
56
|
if (spaceBefore)
|
|
47
57
|
node.spaceBefore = true;
|
|
48
58
|
if (comment) {
|
|
@@ -12,11 +12,16 @@ function composeScalar(ctx, token, tagToken, onError) {
|
|
|
12
12
|
const tagName = tagToken
|
|
13
13
|
? ctx.directives.tagName(tagToken.source, msg => onError(tagToken, 'TAG_RESOLVE_FAILED', msg))
|
|
14
14
|
: null;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
15
|
+
let tag;
|
|
16
|
+
if (ctx.options.stringKeys && ctx.atKey) {
|
|
17
|
+
tag = ctx.schema[identity.SCALAR];
|
|
18
|
+
}
|
|
19
|
+
else if (tagName)
|
|
20
|
+
tag = findScalarTagByName(ctx.schema, value, tagName, tagToken, onError);
|
|
21
|
+
else if (token.type === 'scalar')
|
|
22
|
+
tag = findScalarTagByTest(ctx, value, token, onError);
|
|
23
|
+
else
|
|
24
|
+
tag = ctx.schema[identity.SCALAR];
|
|
20
25
|
let scalar;
|
|
21
26
|
try {
|
|
22
27
|
const res = tag.resolve(value, msg => onError(tagToken ?? token, 'TAG_RESOLVE_FAILED', msg), ctx.options);
|
|
@@ -64,8 +69,9 @@ function findScalarTagByName(schema, value, tagName, tagToken, onError) {
|
|
|
64
69
|
onError(tagToken, 'TAG_RESOLVE_FAILED', `Unresolved tag: ${tagName}`, tagName !== 'tag:yaml.org,2002:str');
|
|
65
70
|
return schema[identity.SCALAR];
|
|
66
71
|
}
|
|
67
|
-
function findScalarTagByTest({ directives, schema }, value, token, onError) {
|
|
68
|
-
const tag = schema.tags.find(tag => tag.default && tag.
|
|
72
|
+
function findScalarTagByTest({ atKey, directives, schema }, value, token, onError) {
|
|
73
|
+
const tag = schema.tags.find(tag => (tag.default === true || (atKey && tag.default === 'key')) &&
|
|
74
|
+
tag.test?.test(value)) || schema[identity.SCALAR];
|
|
69
75
|
if (schema.compat) {
|
|
70
76
|
const compat = schema.compat.find(tag => tag.default && tag.test?.test(value)) ??
|
|
71
77
|
schema[identity.SCALAR];
|
|
@@ -52,12 +52,14 @@ function resolveBlockMap({ composeNode, composeEmptyNode }, ctx, bm, onError, ta
|
|
|
52
52
|
onError(offset, 'BAD_INDENT', startColMsg);
|
|
53
53
|
}
|
|
54
54
|
// key value
|
|
55
|
+
ctx.atKey = true;
|
|
55
56
|
const keyStart = keyProps.end;
|
|
56
57
|
const keyNode = key
|
|
57
58
|
? composeNode(ctx, key, keyProps, onError)
|
|
58
59
|
: composeEmptyNode(ctx, keyStart, start, null, keyProps, onError);
|
|
59
60
|
if (ctx.schema.compat)
|
|
60
61
|
utilFlowIndentCheck.flowIndentCheck(bm.indent, key, onError);
|
|
62
|
+
ctx.atKey = false;
|
|
61
63
|
if (utilMapIncludes.mapIncludes(ctx, map.items, keyNode))
|
|
62
64
|
onError(keyStart, 'DUPLICATE_KEY', 'Map keys must be unique');
|
|
63
65
|
// value properties
|
|
@@ -9,6 +9,8 @@ function resolveBlockSeq({ composeNode, composeEmptyNode }, ctx, bs, onError, ta
|
|
|
9
9
|
const seq = new NodeClass(ctx.schema);
|
|
10
10
|
if (ctx.atRoot)
|
|
11
11
|
ctx.atRoot = false;
|
|
12
|
+
if (ctx.atKey)
|
|
13
|
+
ctx.atKey = false;
|
|
12
14
|
let offset = bs.offset;
|
|
13
15
|
let commentEnd = null;
|
|
14
16
|
for (const { start, value } of bs.items) {
|
|
@@ -20,6 +20,8 @@ function resolveFlowCollection({ composeNode, composeEmptyNode }, ctx, fc, onErr
|
|
|
20
20
|
const atRoot = ctx.atRoot;
|
|
21
21
|
if (atRoot)
|
|
22
22
|
ctx.atRoot = false;
|
|
23
|
+
if (ctx.atKey)
|
|
24
|
+
ctx.atKey = false;
|
|
23
25
|
let offset = fc.offset + fc.start.source.length;
|
|
24
26
|
for (let i = 0; i < fc.items.length; ++i) {
|
|
25
27
|
const collItem = fc.items[i];
|
|
@@ -99,12 +101,14 @@ function resolveFlowCollection({ composeNode, composeEmptyNode }, ctx, fc, onErr
|
|
|
99
101
|
else {
|
|
100
102
|
// item is a key+value pair
|
|
101
103
|
// key value
|
|
104
|
+
ctx.atKey = true;
|
|
102
105
|
const keyStart = props.end;
|
|
103
106
|
const keyNode = key
|
|
104
107
|
? composeNode(ctx, key, props, onError)
|
|
105
108
|
: composeEmptyNode(ctx, keyStart, start, null, props, onError);
|
|
106
109
|
if (isBlock(key))
|
|
107
110
|
onError(keyNode.range, 'BLOCK_IN_FLOW', blockMsg);
|
|
111
|
+
ctx.atKey = false;
|
|
108
112
|
// value properties
|
|
109
113
|
const valueProps = resolveProps.resolveProps(sep ?? [], {
|
|
110
114
|
flow: fcName,
|