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.
Files changed (176) hide show
  1. package/.jsii +2 -2
  2. package/lib/awscdk/auto-discover.js +5 -5
  3. package/lib/awscdk/awscdk-app-java.js +1 -1
  4. package/lib/awscdk/awscdk-app-py.js +1 -1
  5. package/lib/awscdk/awscdk-app-ts.js +1 -1
  6. package/lib/awscdk/awscdk-construct.js +2 -2
  7. package/lib/awscdk/awscdk-deps-java.js +1 -1
  8. package/lib/awscdk/awscdk-deps-js.js +1 -1
  9. package/lib/awscdk/awscdk-deps-py.js +1 -1
  10. package/lib/awscdk/awscdk-deps.js +1 -1
  11. package/lib/awscdk/cdk-config.js +1 -1
  12. package/lib/awscdk/cdk-tasks.js +1 -1
  13. package/lib/awscdk/integration-test.js +1 -1
  14. package/lib/awscdk/lambda-extension.js +1 -1
  15. package/lib/awscdk/lambda-function.js +2 -2
  16. package/lib/build/build-workflow.js +1 -1
  17. package/lib/cdk/auto-discover-base.js +2 -2
  18. package/lib/cdk/construct-lib.js +1 -1
  19. package/lib/cdk/integration-test-base.js +1 -1
  20. package/lib/cdk/jsii-docgen.js +1 -1
  21. package/lib/cdk/jsii-project.js +1 -1
  22. package/lib/cdk8s/auto-discover.js +2 -2
  23. package/lib/cdk8s/cdk8s-app-py.js +1 -1
  24. package/lib/cdk8s/cdk8s-app-ts.js +1 -1
  25. package/lib/cdk8s/cdk8s-construct.js +1 -1
  26. package/lib/cdk8s/cdk8s-deps-py.js +1 -1
  27. package/lib/cdk8s/cdk8s-deps.js +1 -1
  28. package/lib/cdk8s/integration-test.js +1 -1
  29. package/lib/cdktf/cdktf-construct.js +1 -1
  30. package/lib/circleci/circleci.js +1 -1
  31. package/lib/component.js +1 -1
  32. package/lib/dependencies.js +1 -1
  33. package/lib/dev-env.js +1 -1
  34. package/lib/docker-compose/docker-compose-service.js +1 -1
  35. package/lib/docker-compose/docker-compose.js +1 -1
  36. package/lib/file.js +1 -1
  37. package/lib/gitattributes.js +1 -1
  38. package/lib/github/actions-provider.js +1 -1
  39. package/lib/github/auto-approve.js +1 -1
  40. package/lib/github/auto-merge.js +1 -1
  41. package/lib/github/dependabot.js +1 -1
  42. package/lib/github/github-credentials.js +1 -1
  43. package/lib/github/github-project.js +1 -1
  44. package/lib/github/github.js +1 -1
  45. package/lib/github/mergify.js +1 -1
  46. package/lib/github/pr-template.js +1 -1
  47. package/lib/github/pull-request-backport.js +1 -1
  48. package/lib/github/pull-request-lint.js +1 -1
  49. package/lib/github/stale.js +1 -1
  50. package/lib/github/task-workflow-job.js +1 -1
  51. package/lib/github/task-workflow.js +1 -1
  52. package/lib/github/workflow-actions.js +1 -1
  53. package/lib/github/workflow-jobs.js +1 -1
  54. package/lib/github/workflow-steps.js +1 -1
  55. package/lib/github/workflows.js +1 -1
  56. package/lib/gitlab/configuration.js +1 -1
  57. package/lib/gitlab/gitlab-configuration.js +1 -1
  58. package/lib/gitlab/nested-configuration.js +1 -1
  59. package/lib/gitpod.js +1 -1
  60. package/lib/ignore-file.js +1 -1
  61. package/lib/ini.js +1 -1
  62. package/lib/java/java-project.js +1 -1
  63. package/lib/java/junit.js +1 -1
  64. package/lib/java/maven-compile.js +1 -1
  65. package/lib/java/maven-packaging.js +1 -1
  66. package/lib/java/maven-sample.js +1 -1
  67. package/lib/java/pom.js +2 -2
  68. package/lib/java/projenrc.js +1 -1
  69. package/lib/javascript/bundler.js +1 -1
  70. package/lib/javascript/eslint.js +1 -1
  71. package/lib/javascript/jest.js +4 -4
  72. package/lib/javascript/license-checker.js +1 -1
  73. package/lib/javascript/node-package.js +1 -1
  74. package/lib/javascript/node-project.js +1 -1
  75. package/lib/javascript/npm-config.js +1 -1
  76. package/lib/javascript/prettier.js +1 -1
  77. package/lib/javascript/projenrc.js +1 -1
  78. package/lib/javascript/typescript-config.js +2 -2
  79. package/lib/javascript/upgrade-dependencies.js +2 -2
  80. package/lib/javascript/yarnrc.js +1 -1
  81. package/lib/json-patch.js +1 -1
  82. package/lib/json.js +1 -1
  83. package/lib/license.js +1 -1
  84. package/lib/logger.js +1 -1
  85. package/lib/makefile.js +1 -1
  86. package/lib/object-file.js +1 -1
  87. package/lib/project-build.js +1 -1
  88. package/lib/project-tree.js +1 -1
  89. package/lib/project.js +1 -1
  90. package/lib/projects.js +1 -1
  91. package/lib/projenrc-json.js +2 -2
  92. package/lib/projenrc.js +1 -1
  93. package/lib/python/pip.js +1 -1
  94. package/lib/python/poetry.js +2 -2
  95. package/lib/python/projenrc.js +1 -1
  96. package/lib/python/pytest-sample.js +1 -1
  97. package/lib/python/pytest.js +1 -1
  98. package/lib/python/python-project.js +1 -1
  99. package/lib/python/python-sample.js +1 -1
  100. package/lib/python/requirements-file.js +1 -1
  101. package/lib/python/setuppy.js +1 -1
  102. package/lib/python/setuptools.js +1 -1
  103. package/lib/python/venv.js +1 -1
  104. package/lib/readme.js +1 -1
  105. package/lib/release/publisher.js +1 -1
  106. package/lib/release/release-trigger.js +1 -1
  107. package/lib/release/release.js +1 -1
  108. package/lib/renovatebot.js +1 -1
  109. package/lib/sample-file.js +2 -2
  110. package/lib/semver.js +1 -1
  111. package/lib/source-code.js +1 -1
  112. package/lib/task-runtime.js +1 -1
  113. package/lib/task.js +1 -1
  114. package/lib/tasks.js +1 -1
  115. package/lib/testing.js +1 -1
  116. package/lib/textfile.js +1 -1
  117. package/lib/toml.js +1 -1
  118. package/lib/typescript/projenrc-ts.js +1 -1
  119. package/lib/typescript/projenrc.js +1 -1
  120. package/lib/typescript/typescript-typedoc.js +1 -1
  121. package/lib/typescript/typescript.js +6 -6
  122. package/lib/version.js +2 -2
  123. package/lib/vscode/devcontainer.js +1 -1
  124. package/lib/vscode/extensions.js +1 -1
  125. package/lib/vscode/launch-config.js +1 -1
  126. package/lib/vscode/settings.js +1 -1
  127. package/lib/vscode/vscode.js +1 -1
  128. package/lib/web/next.js +3 -3
  129. package/lib/web/postcss.js +1 -1
  130. package/lib/web/react.js +4 -4
  131. package/lib/web/tailwind.js +1 -1
  132. package/lib/xmlfile.js +1 -1
  133. package/lib/yaml.js +1 -1
  134. package/node_modules/yaml/README.md +17 -3
  135. package/node_modules/yaml/browser/dist/compose/compose-doc.js +1 -0
  136. package/node_modules/yaml/browser/dist/compose/compose-node.js +10 -0
  137. package/node_modules/yaml/browser/dist/compose/compose-scalar.js +14 -8
  138. package/node_modules/yaml/browser/dist/compose/resolve-block-map.js +2 -0
  139. package/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +2 -0
  140. package/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +4 -0
  141. package/node_modules/yaml/browser/dist/compose/util-map-includes.js +1 -5
  142. package/node_modules/yaml/browser/dist/doc/Document.js +3 -2
  143. package/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +7 -49
  144. package/node_modules/yaml/browser/dist/public-api.js +3 -0
  145. package/node_modules/yaml/browser/dist/schema/Schema.js +1 -2
  146. package/node_modules/yaml/browser/dist/schema/tags.js +26 -13
  147. package/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +64 -0
  148. package/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +2 -0
  149. package/node_modules/yaml/browser/dist/stringify/stringify.js +6 -1
  150. package/node_modules/yaml/dist/compose/compose-doc.js +1 -0
  151. package/node_modules/yaml/dist/compose/compose-node.d.ts +1 -0
  152. package/node_modules/yaml/dist/compose/compose-node.js +10 -0
  153. package/node_modules/yaml/dist/compose/compose-scalar.js +13 -7
  154. package/node_modules/yaml/dist/compose/resolve-block-map.js +2 -0
  155. package/node_modules/yaml/dist/compose/resolve-block-seq.js +2 -0
  156. package/node_modules/yaml/dist/compose/resolve-flow-collection.js +4 -0
  157. package/node_modules/yaml/dist/compose/util-map-includes.js +1 -5
  158. package/node_modules/yaml/dist/doc/Document.js +3 -2
  159. package/node_modules/yaml/dist/errors.d.ts +1 -1
  160. package/node_modules/yaml/dist/nodes/Node.d.ts +7 -1
  161. package/node_modules/yaml/dist/nodes/addPairToJSMap.js +6 -48
  162. package/node_modules/yaml/dist/options.d.ts +6 -0
  163. package/node_modules/yaml/dist/parse/lexer.d.ts +1 -1
  164. package/node_modules/yaml/dist/parse/parser.d.ts +3 -3
  165. package/node_modules/yaml/dist/public-api.js +3 -0
  166. package/node_modules/yaml/dist/schema/Schema.d.ts +0 -1
  167. package/node_modules/yaml/dist/schema/Schema.js +1 -2
  168. package/node_modules/yaml/dist/schema/tags.d.ts +9 -1
  169. package/node_modules/yaml/dist/schema/tags.js +26 -13
  170. package/node_modules/yaml/dist/schema/types.d.ts +6 -4
  171. package/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
  172. package/node_modules/yaml/dist/schema/yaml-1.1/merge.js +68 -0
  173. package/node_modules/yaml/dist/schema/yaml-1.1/schema.js +2 -0
  174. package/node_modules/yaml/dist/stringify/stringify.js +6 -1
  175. package/node_modules/yaml/package.json +1 -1
  176. package/package.json +3 -3
@@ -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.2" };
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.2" };
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.2" };
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
- <a href="https://www.scipress.io/">
34
- <img width=150 src="https://eemeli.org/yaml/images/scipress.svg" alt="Scipress" />
35
- </a>
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
+ &nbsp; &nbsp;
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 { SCALAR, isScalar } from '../nodes/identity.js';
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
- const tag = tagToken && tagName
14
- ? findScalarTagByName(ctx.schema, value, tagName, tagToken, onError)
15
- : token.type === 'scalar'
16
- ? findScalarTagByTest(ctx, value, token, onError)
17
- : ctx.schema[SCALAR];
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.test?.test(value)) || schema[SCALAR];
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 = { merge: true, resolveKnownTags: false, schema: 'yaml-1.1' };
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 = { merge: false, resolveKnownTags: true, schema: 'core' };
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 { isAlias, isSeq, isScalar, isMap, isNode } from './identity.js';
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 (ctx?.doc.schema.merge && isMergeKey(key)) {
10
- value = isAlias(value) ? value.resolve(ctx.doc) : value;
11
- if (isSeq(value))
12
- for (const it of value.items)
13
- mergeToJSMap(ctx, map, it);
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
- let tags = schemas.get(schemaName);
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
- return tags.map(tag => {
71
- if (typeof tag !== 'string')
72
- return tag;
73
- const tagObj = tagsByName[tag];
74
- if (tagObj)
75
- return tagObj;
76
- const keys = Object.keys(tagsByName)
77
- .map(key => JSON.stringify(key))
78
- .join(', ');
79
- throw new Error(`Unknown custom tag "${tag}"; use one of ${keys}`);
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
- const match = tags.filter(t => t.identify?.(obj));
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
- const tag = tagToken && tagName
16
- ? findScalarTagByName(ctx.schema, value, tagName, tagToken, onError)
17
- : token.type === 'scalar'
18
- ? findScalarTagByTest(ctx, value, token, onError)
19
- : ctx.schema[identity.SCALAR];
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.test?.test(value)) || schema[identity.SCALAR];
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,