openapi-typesafe 0.0.0 → 1.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +71 -1
- package/bin/cli.js +4 -0
- package/dist/adapters/node-file-system/node-file-system.cjs +46 -0
- package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -0
- package/dist/adapters/node-file-system/node-file-system.mjs +40 -0
- package/dist/adapters/node-file-system/node-file-system.mjs.map +1 -0
- package/dist/adapters/redocly-loader/alias-limit.cjs +16 -0
- package/dist/adapters/redocly-loader/alias-limit.cjs.map +1 -0
- package/dist/adapters/redocly-loader/alias-limit.mjs +14 -0
- package/dist/adapters/redocly-loader/alias-limit.mjs.map +1 -0
- package/dist/adapters/redocly-loader/allowed-hosts.cjs +42 -0
- package/dist/adapters/redocly-loader/allowed-hosts.cjs.map +1 -0
- package/dist/adapters/redocly-loader/allowed-hosts.mjs +40 -0
- package/dist/adapters/redocly-loader/allowed-hosts.mjs.map +1 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.cjs +53 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.cjs.map +1 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.mjs +51 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.mjs.map +1 -0
- package/dist/adapters/redocly-loader/malformed-refs.cjs +41 -0
- package/dist/adapters/redocly-loader/malformed-refs.cjs.map +1 -0
- package/dist/adapters/redocly-loader/malformed-refs.mjs +38 -0
- package/dist/adapters/redocly-loader/malformed-refs.mjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-config-source.cjs +61 -0
- package/dist/adapters/redocly-loader/redocly-config-source.cjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-config-source.mjs +54 -0
- package/dist/adapters/redocly-loader/redocly-config-source.mjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +179 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +177 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-access.cjs +107 -0
- package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-access.mjs +99 -0
- package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-holders.cjs +31 -0
- package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-holders.mjs +29 -0
- package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -0
- package/dist/adapters/redocly-loader/remote-fetch.cjs +60 -0
- package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -0
- package/dist/adapters/redocly-loader/remote-fetch.mjs +56 -0
- package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-load-errors.cjs +87 -0
- package/dist/adapters/redocly-loader/schema-load-errors.cjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-load-errors.mjs +77 -0
- package/dist/adapters/redocly-loader/schema-load-errors.mjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-source.cjs +104 -0
- package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-source.mjs +98 -0
- package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -0
- package/dist/adapters/redocly-loader/unsupported-keys.cjs +62 -0
- package/dist/adapters/redocly-loader/unsupported-keys.cjs.map +1 -0
- package/dist/adapters/redocly-loader/unsupported-keys.mjs +58 -0
- package/dist/adapters/redocly-loader/unsupported-keys.mjs.map +1 -0
- package/dist/adapters/terminal-logger/terminal-logger.cjs +67 -0
- package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -0
- package/dist/adapters/terminal-logger/terminal-logger.mjs +59 -0
- package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.cjs +21 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.mjs +17 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.cjs +75 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.mjs +71 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs +148 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs +142 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/lazy-node.cjs +23 -0
- package/dist/adapters/type-ast-bridge/lazy-node.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/lazy-node.mjs +21 -0
- package/dist/adapters/type-ast-bridge/lazy-node.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/load-typescript.cjs +57 -0
- package/dist/adapters/type-ast-bridge/load-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/load-typescript.mjs +51 -0
- package/dist/adapters/type-ast-bridge/load-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/print-typescript.cjs +21 -0
- package/dist/adapters/type-ast-bridge/print-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/print-typescript.mjs +19 -0
- package/dist/adapters/type-ast-bridge/print-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.cjs +33 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.mjs +29 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.cjs +210 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.mjs +207 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.mjs.map +1 -0
- package/dist/api/ast-to-string.cjs +39 -0
- package/dist/api/ast-to-string.cjs.map +1 -0
- package/dist/api/ast-to-string.mjs +37 -0
- package/dist/api/ast-to-string.mjs.map +1 -0
- package/dist/api/comment-header.cjs +11 -0
- package/dist/api/comment-header.cjs.map +1 -0
- package/dist/api/comment-header.mjs +9 -0
- package/dist/api/comment-header.mjs.map +1 -0
- package/dist/api/default-ports.cjs +38 -0
- package/dist/api/default-ports.cjs.map +1 -0
- package/dist/api/default-ports.mjs +28 -0
- package/dist/api/default-ports.mjs.map +1 -0
- package/dist/api/discriminator-conflict-warnings.cjs +25 -0
- package/dist/api/discriminator-conflict-warnings.cjs.map +1 -0
- package/dist/api/discriminator-conflict-warnings.mjs +23 -0
- package/dist/api/discriminator-conflict-warnings.mjs.map +1 -0
- package/dist/api/discriminator-enum-names.cjs +19 -0
- package/dist/api/discriminator-enum-names.cjs.map +1 -0
- package/dist/api/discriminator-enum-names.mjs +17 -0
- package/dist/api/discriminator-enum-names.mjs.map +1 -0
- package/dist/api/discriminator-enum-parent.cjs +59 -0
- package/dist/api/discriminator-enum-parent.cjs.map +1 -0
- package/dist/api/discriminator-enum-parent.mjs +57 -0
- package/dist/api/discriminator-enum-parent.mjs.map +1 -0
- package/dist/api/discriminator-enum.cjs +69 -0
- package/dist/api/discriminator-enum.cjs.map +1 -0
- package/dist/api/discriminator-enum.mjs +66 -0
- package/dist/api/discriminator-enum.mjs.map +1 -0
- package/dist/api/discriminator-other-owners.cjs +67 -0
- package/dist/api/discriminator-other-owners.cjs.map +1 -0
- package/dist/api/discriminator-other-owners.mjs +64 -0
- package/dist/api/discriminator-other-owners.mjs.map +1 -0
- package/dist/api/discriminator-patch.cjs +88 -0
- package/dist/api/discriminator-patch.cjs.map +1 -0
- package/dist/api/discriminator-patch.mjs +82 -0
- package/dist/api/discriminator-patch.mjs.map +1 -0
- package/dist/api/discriminator-scan.cjs +153 -0
- package/dist/api/discriminator-scan.cjs.map +1 -0
- package/dist/api/discriminator-scan.mjs +150 -0
- package/dist/api/discriminator-scan.mjs.map +1 -0
- package/dist/api/document-declarations.cjs +28 -0
- package/dist/api/document-declarations.cjs.map +1 -0
- package/dist/api/document-declarations.mjs +26 -0
- package/dist/api/document-declarations.mjs.map +1 -0
- package/dist/api/document-refs.cjs +53 -0
- package/dist/api/document-refs.cjs.map +1 -0
- package/dist/api/document-refs.mjs +50 -0
- package/dist/api/document-refs.mjs.map +1 -0
- package/dist/api/document-run.cjs +122 -0
- package/dist/api/document-run.cjs.map +1 -0
- package/dist/api/document-run.mjs +116 -0
- package/dist/api/document-run.mjs.map +1 -0
- package/dist/api/enum-values-warnings.cjs +16 -0
- package/dist/api/enum-values-warnings.cjs.map +1 -0
- package/dist/api/enum-values-warnings.mjs +14 -0
- package/dist/api/enum-values-warnings.mjs.map +1 -0
- package/dist/api/footer-entry.cjs +18 -0
- package/dist/api/footer-entry.cjs.map +1 -0
- package/dist/api/footer-entry.mjs +15 -0
- package/dist/api/footer-entry.mjs.map +1 -0
- package/dist/api/footer-sink.cjs +53 -0
- package/dist/api/footer-sink.cjs.map +1 -0
- package/dist/api/footer-sink.mjs +51 -0
- package/dist/api/footer-sink.mjs.map +1 -0
- package/dist/api/legacy-callback-warning.cjs +25 -0
- package/dist/api/legacy-callback-warning.cjs.map +1 -0
- package/dist/api/legacy-callback-warning.mjs +22 -0
- package/dist/api/legacy-callback-warning.mjs.map +1 -0
- package/dist/api/legacy-ts-helpers.cjs +203 -0
- package/dist/api/legacy-ts-helpers.cjs.map +1 -0
- package/dist/api/legacy-ts-helpers.mjs +187 -0
- package/dist/api/legacy-ts-helpers.mjs.map +1 -0
- package/dist/api/legacy-utils.cjs +65 -0
- package/dist/api/legacy-utils.cjs.map +1 -0
- package/dist/api/legacy-utils.mjs +50 -0
- package/dist/api/legacy-utils.mjs.map +1 -0
- package/dist/api/openapi-ts.cjs +40 -0
- package/dist/api/openapi-ts.cjs.map +1 -0
- package/dist/api/openapi-ts.mjs +34 -0
- package/dist/api/openapi-ts.mjs.map +1 -0
- package/dist/api/path-template-warnings.cjs +21 -0
- package/dist/api/path-template-warnings.cjs.map +1 -0
- package/dist/api/path-template-warnings.mjs +19 -0
- package/dist/api/path-template-warnings.mjs.map +1 -0
- package/dist/api/schema-callbacks.cjs +140 -0
- package/dist/api/schema-callbacks.cjs.map +1 -0
- package/dist/api/schema-callbacks.mjs +136 -0
- package/dist/api/schema-callbacks.mjs.map +1 -0
- package/dist/api/string-to-ast.cjs +21 -0
- package/dist/api/string-to-ast.cjs.map +1 -0
- package/dist/api/string-to-ast.mjs +18 -0
- package/dist/api/string-to-ast.mjs.map +1 -0
- package/dist/api/transform-context.cjs +84 -0
- package/dist/api/transform-context.cjs.map +1 -0
- package/dist/api/transform-context.mjs +67 -0
- package/dist/api/transform-context.mjs.map +1 -0
- package/dist/api/transform-schema.cjs +80 -0
- package/dist/api/transform-schema.cjs.map +1 -0
- package/dist/api/transform-schema.mjs +75 -0
- package/dist/api/transform-schema.mjs.map +1 -0
- package/dist/api/type-helpers.cjs +85 -0
- package/dist/api/type-helpers.cjs.map +1 -0
- package/dist/api/type-helpers.mjs +66 -0
- package/dist/api/type-helpers.mjs.map +1 -0
- package/dist/api/unsupported-feature-warnings.cjs +22 -0
- package/dist/api/unsupported-feature-warnings.cjs.map +1 -0
- package/dist/api/unsupported-feature-warnings.mjs +20 -0
- package/dist/api/unsupported-feature-warnings.mjs.map +1 -0
- package/dist/application/print/comment-writer.cjs +95 -0
- package/dist/application/print/comment-writer.cjs.map +1 -0
- package/dist/application/print/comment-writer.mjs +93 -0
- package/dist/application/print/comment-writer.mjs.map +1 -0
- package/dist/application/print/declaration-printer.cjs +83 -0
- package/dist/application/print/declaration-printer.cjs.map +1 -0
- package/dist/application/print/declaration-printer.mjs +81 -0
- package/dist/application/print/declaration-printer.mjs.map +1 -0
- package/dist/application/print/literal-text.cjs +52 -0
- package/dist/application/print/literal-text.cjs.map +1 -0
- package/dist/application/print/literal-text.mjs +48 -0
- package/dist/application/print/literal-text.mjs.map +1 -0
- package/dist/application/print/print-nodes.cjs +38 -0
- package/dist/application/print/print-nodes.cjs.map +1 -0
- package/dist/application/print/print-nodes.mjs +36 -0
- package/dist/application/print/print-nodes.mjs.map +1 -0
- package/dist/application/print/print-options.cjs +6 -0
- package/dist/application/print/print-options.cjs.map +1 -0
- package/dist/application/print/print-options.mjs +4 -0
- package/dist/application/print/print-options.mjs.map +1 -0
- package/dist/application/print/text-writer.cjs +63 -0
- package/dist/application/print/text-writer.cjs.map +1 -0
- package/dist/application/print/text-writer.mjs +60 -0
- package/dist/application/print/text-writer.mjs.map +1 -0
- package/dist/application/print/type-printer.cjs +219 -0
- package/dist/application/print/type-printer.cjs.map +1 -0
- package/dist/application/print/type-printer.mjs +215 -0
- package/dist/application/print/type-printer.mjs.map +1 -0
- package/dist/application/stack-overflow.cjs +36 -0
- package/dist/application/stack-overflow.cjs.map +1 -0
- package/dist/application/stack-overflow.mjs +31 -0
- package/dist/application/stack-overflow.mjs.map +1 -0
- package/dist/application/transform/document/assignability.cjs +144 -0
- package/dist/application/transform/document/assignability.cjs.map +1 -0
- package/dist/application/transform/document/assignability.mjs +138 -0
- package/dist/application/transform/document/assignability.mjs.map +1 -0
- package/dist/application/transform/document/components.cjs +104 -0
- package/dist/application/transform/document/components.cjs.map +1 -0
- package/dist/application/transform/document/components.mjs +102 -0
- package/dist/application/transform/document/components.mjs.map +1 -0
- package/dist/application/transform/document/declared-types.cjs +66 -0
- package/dist/application/transform/document/declared-types.cjs.map +1 -0
- package/dist/application/transform/document/declared-types.mjs +63 -0
- package/dist/application/transform/document/declared-types.mjs.map +1 -0
- package/dist/application/transform/document/defs-root.cjs +18 -0
- package/dist/application/transform/document/defs-root.cjs.map +1 -0
- package/dist/application/transform/document/defs-root.mjs +16 -0
- package/dist/application/transform/document/defs-root.mjs.map +1 -0
- package/dist/application/transform/document/document-member.cjs +13 -0
- package/dist/application/transform/document/document-member.cjs.map +1 -0
- package/dist/application/transform/document/document-member.mjs +11 -0
- package/dist/application/transform/document/document-member.mjs.map +1 -0
- package/dist/application/transform/document/document.cjs +109 -0
- package/dist/application/transform/document/document.cjs.map +1 -0
- package/dist/application/transform/document/document.mjs +106 -0
- package/dist/application/transform/document/document.mjs.map +1 -0
- package/dist/application/transform/document/exploded-query.cjs +46 -0
- package/dist/application/transform/document/exploded-query.cjs.map +1 -0
- package/dist/application/transform/document/exploded-query.mjs +43 -0
- package/dist/application/transform/document/exploded-query.mjs.map +1 -0
- package/dist/application/transform/document/global-type-references.cjs +63 -0
- package/dist/application/transform/document/global-type-references.cjs.map +1 -0
- package/dist/application/transform/document/global-type-references.mjs +61 -0
- package/dist/application/transform/document/global-type-references.mjs.map +1 -0
- package/dist/application/transform/document/header.cjs +27 -0
- package/dist/application/transform/document/header.cjs.map +1 -0
- package/dist/application/transform/document/header.mjs +25 -0
- package/dist/application/transform/document/header.mjs.map +1 -0
- package/dist/application/transform/document/kept-deprecated.cjs +96 -0
- package/dist/application/transform/document/kept-deprecated.cjs.map +1 -0
- package/dist/application/transform/document/kept-deprecated.mjs +94 -0
- package/dist/application/transform/document/kept-deprecated.mjs.map +1 -0
- package/dist/application/transform/document/list-assignability.cjs +54 -0
- package/dist/application/transform/document/list-assignability.cjs.map +1 -0
- package/dist/application/transform/document/list-assignability.mjs +52 -0
- package/dist/application/transform/document/list-assignability.mjs.map +1 -0
- package/dist/application/transform/document/media-type.cjs +42 -0
- package/dist/application/transform/document/media-type.cjs.map +1 -0
- package/dist/application/transform/document/media-type.mjs +38 -0
- package/dist/application/transform/document/media-type.mjs.map +1 -0
- package/dist/application/transform/document/operation.cjs +45 -0
- package/dist/application/transform/document/operation.cjs.map +1 -0
- package/dist/application/transform/document/operation.mjs +43 -0
- package/dist/application/transform/document/operation.mjs.map +1 -0
- package/dist/application/transform/document/parameter.cjs +25 -0
- package/dist/application/transform/document/parameter.cjs.map +1 -0
- package/dist/application/transform/document/parameter.mjs +23 -0
- package/dist/application/transform/document/parameter.mjs.map +1 -0
- package/dist/application/transform/document/parameters.cjs +146 -0
- package/dist/application/transform/document/parameters.cjs.map +1 -0
- package/dist/application/transform/document/parameters.mjs +144 -0
- package/dist/application/transform/document/parameters.mjs.map +1 -0
- package/dist/application/transform/document/path-item.cjs +82 -0
- package/dist/application/transform/document/path-item.cjs.map +1 -0
- package/dist/application/transform/document/path-item.mjs +80 -0
- package/dist/application/transform/document/path-item.mjs.map +1 -0
- package/dist/application/transform/document/path-key-overlaps.cjs +107 -0
- package/dist/application/transform/document/path-key-overlaps.cjs.map +1 -0
- package/dist/application/transform/document/path-key-overlaps.mjs +105 -0
- package/dist/application/transform/document/path-key-overlaps.mjs.map +1 -0
- package/dist/application/transform/document/path-template-replace.cjs +48 -0
- package/dist/application/transform/document/path-template-replace.cjs.map +1 -0
- package/dist/application/transform/document/path-template-replace.mjs +45 -0
- package/dist/application/transform/document/path-template-replace.mjs.map +1 -0
- package/dist/application/transform/document/paths-enum.cjs +75 -0
- package/dist/application/transform/document/paths-enum.cjs.map +1 -0
- package/dist/application/transform/document/paths-enum.mjs +72 -0
- package/dist/application/transform/document/paths-enum.mjs.map +1 -0
- package/dist/application/transform/document/paths.cjs +153 -0
- package/dist/application/transform/document/paths.cjs.map +1 -0
- package/dist/application/transform/document/paths.mjs +149 -0
- package/dist/application/transform/document/paths.mjs.map +1 -0
- package/dist/application/transform/document/request-body.cjs +36 -0
- package/dist/application/transform/document/request-body.cjs.map +1 -0
- package/dist/application/transform/document/request-body.mjs +34 -0
- package/dist/application/transform/document/request-body.mjs.map +1 -0
- package/dist/application/transform/document/response.cjs +59 -0
- package/dist/application/transform/document/response.cjs.map +1 -0
- package/dist/application/transform/document/response.mjs +57 -0
- package/dist/application/transform/document/response.mjs.map +1 -0
- package/dist/application/transform/document/responses.cjs +23 -0
- package/dist/application/transform/document/responses.cjs.map +1 -0
- package/dist/application/transform/document/responses.mjs +21 -0
- package/dist/application/transform/document/responses.mjs.map +1 -0
- package/dist/application/transform/document/root-type-aliases.cjs +70 -0
- package/dist/application/transform/document/root-type-aliases.cjs.map +1 -0
- package/dist/application/transform/document/root-type-aliases.mjs +67 -0
- package/dist/application/transform/document/root-type-aliases.mjs.map +1 -0
- package/dist/application/transform/document/template-key-match.cjs +128 -0
- package/dist/application/transform/document/template-key-match.cjs.map +1 -0
- package/dist/application/transform/document/template-key-match.mjs +125 -0
- package/dist/application/transform/document/template-key-match.mjs.map +1 -0
- package/dist/application/transform/document/type-assignability.cjs +192 -0
- package/dist/application/transform/document/type-assignability.cjs.map +1 -0
- package/dist/application/transform/document/type-assignability.mjs +190 -0
- package/dist/application/transform/document/type-assignability.mjs.map +1 -0
- package/dist/application/transform/document/type-key.cjs +70 -0
- package/dist/application/transform/document/type-key.cjs.map +1 -0
- package/dist/application/transform/document/type-key.mjs +68 -0
- package/dist/application/transform/document/type-key.mjs.map +1 -0
- package/dist/application/transform/document/type-resolution.cjs +131 -0
- package/dist/application/transform/document/type-resolution.cjs.map +1 -0
- package/dist/application/transform/document/type-resolution.mjs +125 -0
- package/dist/application/transform/document/type-resolution.mjs.map +1 -0
- package/dist/application/transform/document/webhooks.cjs +19 -0
- package/dist/application/transform/document/webhooks.cjs.map +1 -0
- package/dist/application/transform/document/webhooks.mjs +17 -0
- package/dist/application/transform/document/webhooks.mjs.map +1 -0
- package/dist/application/transform/document-entries.cjs +17 -0
- package/dist/application/transform/document-entries.cjs.map +1 -0
- package/dist/application/transform/document-entries.mjs +14 -0
- package/dist/application/transform/document-entries.mjs.map +1 -0
- package/dist/application/transform/footer/document-footer.cjs +150 -0
- package/dist/application/transform/footer/document-footer.cjs.map +1 -0
- package/dist/application/transform/footer/document-footer.mjs +148 -0
- package/dist/application/transform/footer/document-footer.mjs.map +1 -0
- package/dist/application/transform/footer/enum-naming.cjs +138 -0
- package/dist/application/transform/footer/enum-naming.cjs.map +1 -0
- package/dist/application/transform/footer/enum-naming.mjs +131 -0
- package/dist/application/transform/footer/enum-naming.mjs.map +1 -0
- package/dist/application/transform/footer/enum-values-check.cjs +129 -0
- package/dist/application/transform/footer/enum-values-check.cjs.map +1 -0
- package/dist/application/transform/footer/enum-values-check.mjs +127 -0
- package/dist/application/transform/footer/enum-values-check.mjs.map +1 -0
- package/dist/application/transform/footer/evaluation.cjs +33 -0
- package/dist/application/transform/footer/evaluation.cjs.map +1 -0
- package/dist/application/transform/footer/evaluation.mjs +26 -0
- package/dist/application/transform/footer/evaluation.mjs.map +1 -0
- package/dist/application/transform/footer/shared-enum-names.cjs +60 -0
- package/dist/application/transform/footer/shared-enum-names.cjs.map +1 -0
- package/dist/application/transform/footer/shared-enum-names.mjs +57 -0
- package/dist/application/transform/footer/shared-enum-names.mjs.map +1 -0
- package/dist/application/transform/footer/type-evaluation.cjs +246 -0
- package/dist/application/transform/footer/type-evaluation.cjs.map +1 -0
- package/dist/application/transform/footer/type-evaluation.mjs +244 -0
- package/dist/application/transform/footer/type-evaluation.mjs.map +1 -0
- package/dist/application/transform/footer/type-rules.cjs +172 -0
- package/dist/application/transform/footer/type-rules.cjs.map +1 -0
- package/dist/application/transform/footer/type-rules.mjs +166 -0
- package/dist/application/transform/footer/type-rules.mjs.map +1 -0
- package/dist/application/transform/helper-types.cjs +68 -0
- package/dist/application/transform/helper-types.cjs.map +1 -0
- package/dist/application/transform/helper-types.mjs +65 -0
- package/dist/application/transform/helper-types.mjs.map +1 -0
- package/dist/application/transform/literal-type.cjs +36 -0
- package/dist/application/transform/literal-type.cjs.map +1 -0
- package/dist/application/transform/literal-type.mjs +34 -0
- package/dist/application/transform/literal-type.mjs.map +1 -0
- package/dist/application/transform/numbered-names.cjs +18 -0
- package/dist/application/transform/numbered-names.cjs.map +1 -0
- package/dist/application/transform/numbered-names.mjs +16 -0
- package/dist/application/transform/numbered-names.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/generated-location.cjs +138 -0
- package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/generated-location.mjs +136 -0
- package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/generated-shape.cjs +171 -0
- package/dist/application/transform/ref-pointer/generated-shape.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/generated-shape.mjs +162 -0
- package/dist/application/transform/ref-pointer/generated-shape.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/inline-cycles.cjs +44 -0
- package/dist/application/transform/ref-pointer/inline-cycles.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/inline-cycles.mjs +42 -0
- package/dist/application/transform/ref-pointer/inline-cycles.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/original-index.cjs +62 -0
- package/dist/application/transform/ref-pointer/original-index.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/original-index.mjs +60 -0
- package/dist/application/transform/ref-pointer/original-index.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/pointer-type.cjs +60 -0
- package/dist/application/transform/ref-pointer/pointer-type.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/pointer-type.mjs +57 -0
- package/dist/application/transform/ref-pointer/pointer-type.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/pointer-walk.cjs +66 -0
- package/dist/application/transform/ref-pointer/pointer-walk.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/pointer-walk.mjs +56 -0
- package/dist/application/transform/ref-pointer/pointer-walk.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/typed-walk.cjs +124 -0
- package/dist/application/transform/ref-pointer/typed-walk.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/typed-walk.mjs +122 -0
- package/dist/application/transform/ref-pointer/typed-walk.mjs.map +1 -0
- package/dist/application/transform/ref-type.cjs +62 -0
- package/dist/application/transform/ref-type.cjs.map +1 -0
- package/dist/application/transform/ref-type.mjs +55 -0
- package/dist/application/transform/ref-type.mjs.map +1 -0
- package/dist/application/transform/schema/access-flags.cjs +38 -0
- package/dist/application/transform/schema/access-flags.cjs.map +1 -0
- package/dist/application/transform/schema/access-flags.mjs +36 -0
- package/dist/application/transform/schema/access-flags.mjs.map +1 -0
- package/dist/application/transform/schema/array-type.cjs +136 -0
- package/dist/application/transform/schema/array-type.cjs.map +1 -0
- package/dist/application/transform/schema/array-type.mjs +134 -0
- package/dist/application/transform/schema/array-type.mjs.map +1 -0
- package/dist/application/transform/schema/composition-type.cjs +142 -0
- package/dist/application/transform/schema/composition-type.cjs.map +1 -0
- package/dist/application/transform/schema/composition-type.mjs +140 -0
- package/dist/application/transform/schema/composition-type.mjs.map +1 -0
- package/dist/application/transform/schema/core-type.cjs +86 -0
- package/dist/application/transform/schema/core-type.cjs.map +1 -0
- package/dist/application/transform/schema/core-type.mjs +84 -0
- package/dist/application/transform/schema/core-type.mjs.map +1 -0
- package/dist/application/transform/schema/discriminated-union.cjs +30 -0
- package/dist/application/transform/schema/discriminated-union.cjs.map +1 -0
- package/dist/application/transform/schema/discriminated-union.mjs +27 -0
- package/dist/application/transform/schema/discriminated-union.mjs.map +1 -0
- package/dist/application/transform/schema/discriminator-property.cjs +22 -0
- package/dist/application/transform/schema/discriminator-property.cjs.map +1 -0
- package/dist/application/transform/schema/discriminator-property.mjs +20 -0
- package/dist/application/transform/schema/discriminator-property.mjs.map +1 -0
- package/dist/application/transform/schema/enum-rule.cjs +163 -0
- package/dist/application/transform/schema/enum-rule.cjs.map +1 -0
- package/dist/application/transform/schema/enum-rule.mjs +160 -0
- package/dist/application/transform/schema/enum-rule.mjs.map +1 -0
- package/dist/application/transform/schema/inherited-discriminator.cjs +29 -0
- package/dist/application/transform/schema/inherited-discriminator.cjs.map +1 -0
- package/dist/application/transform/schema/inherited-discriminator.mjs +26 -0
- package/dist/application/transform/schema/inherited-discriminator.mjs.map +1 -0
- package/dist/application/transform/schema/object-type.cjs +186 -0
- package/dist/application/transform/schema/object-type.cjs.map +1 -0
- package/dist/application/transform/schema/object-type.mjs +182 -0
- package/dist/application/transform/schema/object-type.mjs.map +1 -0
- package/dist/application/transform/schema/presence-members.cjs +59 -0
- package/dist/application/transform/schema/presence-members.cjs.map +1 -0
- package/dist/application/transform/schema/presence-members.mjs +57 -0
- package/dist/application/transform/schema/presence-members.mjs.map +1 -0
- package/dist/application/transform/schema/required-variants.cjs +45 -0
- package/dist/application/transform/schema/required-variants.cjs.map +1 -0
- package/dist/application/transform/schema/required-variants.mjs +42 -0
- package/dist/application/transform/schema/required-variants.mjs.map +1 -0
- package/dist/application/transform/schema/schema-transform.cjs +72 -0
- package/dist/application/transform/schema/schema-transform.cjs.map +1 -0
- package/dist/application/transform/schema/schema-transform.mjs +68 -0
- package/dist/application/transform/schema/schema-transform.mjs.map +1 -0
- package/dist/application/transform/schema/unevaluated-properties.cjs +61 -0
- package/dist/application/transform/schema/unevaluated-properties.cjs.map +1 -0
- package/dist/application/transform/schema/unevaluated-properties.mjs +59 -0
- package/dist/application/transform/schema/unevaluated-properties.mjs.map +1 -0
- package/dist/application/transform/schema-comment.cjs +130 -0
- package/dist/application/transform/schema-comment.cjs.map +1 -0
- package/dist/application/transform/schema-comment.mjs +125 -0
- package/dist/application/transform/schema-comment.mjs.map +1 -0
- package/dist/application/transform/shared-types.cjs +8 -0
- package/dist/application/transform/shared-types.cjs.map +1 -0
- package/dist/application/transform/shared-types.mjs +6 -0
- package/dist/application/transform/shared-types.mjs.map +1 -0
- package/dist/application/transform/type-combinators.cjs +49 -0
- package/dist/application/transform/type-combinators.cjs.map +1 -0
- package/dist/application/transform/type-combinators.mjs +42 -0
- package/dist/application/transform/type-combinators.mjs.map +1 -0
- package/dist/cli/cli-arguments.cjs +145 -0
- package/dist/cli/cli-arguments.cjs.map +1 -0
- package/dist/cli/cli-arguments.mjs +137 -0
- package/dist/cli/cli-arguments.mjs.map +1 -0
- package/dist/cli/cli-errors.cjs +81 -0
- package/dist/cli/cli-errors.cjs.map +1 -0
- package/dist/cli/cli-errors.mjs +77 -0
- package/dist/cli/cli-errors.mjs.map +1 -0
- package/dist/cli/cli-output.cjs +42 -0
- package/dist/cli/cli-output.cjs.map +1 -0
- package/dist/cli/cli-output.mjs +35 -0
- package/dist/cli/cli-output.mjs.map +1 -0
- package/dist/cli/docs-links.cjs +6 -0
- package/dist/cli/docs-links.cjs.map +1 -0
- package/dist/cli/docs-links.mjs +4 -0
- package/dist/cli/docs-links.mjs.map +1 -0
- package/dist/cli/fix-option.cjs +19 -0
- package/dist/cli/fix-option.cjs.map +1 -0
- package/dist/cli/fix-option.mjs +16 -0
- package/dist/cli/fix-option.mjs.map +1 -0
- package/dist/cli/help-text.cjs +44 -0
- package/dist/cli/help-text.cjs.map +1 -0
- package/dist/cli/help-text.mjs +42 -0
- package/dist/cli/help-text.mjs.map +1 -0
- package/dist/cli/main.cjs +67 -0
- package/dist/cli/main.cjs.map +1 -0
- package/dist/cli/main.d.cts +2 -0
- package/dist/cli/main.d.mts +2 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.mjs +59 -0
- package/dist/cli/main.mjs.map +1 -0
- package/dist/cli/redocly-apis.cjs +69 -0
- package/dist/cli/redocly-apis.cjs.map +1 -0
- package/dist/cli/redocly-apis.mjs +66 -0
- package/dist/cli/redocly-apis.mjs.map +1 -0
- package/dist/cli/ref-limits.cjs +14 -0
- package/dist/cli/ref-limits.cjs.map +1 -0
- package/dist/cli/ref-limits.mjs +12 -0
- package/dist/cli/ref-limits.mjs.map +1 -0
- package/dist/cli/run-cli.cjs +113 -0
- package/dist/cli/run-cli.cjs.map +1 -0
- package/dist/cli/run-cli.mjs +111 -0
- package/dist/cli/run-cli.mjs.map +1 -0
- package/dist/domain/assert-never.cjs +8 -0
- package/dist/domain/assert-never.cjs.map +1 -0
- package/dist/domain/assert-never.mjs +6 -0
- package/dist/domain/assert-never.mjs.map +1 -0
- package/dist/domain/errors.cjs +52 -0
- package/dist/domain/errors.cjs.map +1 -0
- package/dist/domain/errors.mjs +48 -0
- package/dist/domain/errors.mjs.map +1 -0
- package/dist/domain/ir/constructors.cjs +93 -0
- package/dist/domain/ir/constructors.cjs.map +1 -0
- package/dist/domain/ir/constructors.mjs +74 -0
- package/dist/domain/ir/constructors.mjs.map +1 -0
- package/dist/domain/ir/identifier-text.cjs +29 -0
- package/dist/domain/ir/identifier-text.cjs.map +1 -0
- package/dist/domain/ir/identifier-text.mjs +25 -0
- package/dist/domain/ir/identifier-text.mjs.map +1 -0
- package/dist/domain/ir/newer-identifier-ranges.cjs +109 -0
- package/dist/domain/ir/newer-identifier-ranges.cjs.map +1 -0
- package/dist/domain/ir/newer-identifier-ranges.mjs +106 -0
- package/dist/domain/ir/newer-identifier-ranges.mjs.map +1 -0
- package/dist/domain/ir/normalize.cjs +32 -0
- package/dist/domain/ir/normalize.cjs.map +1 -0
- package/dist/domain/ir/normalize.mjs +29 -0
- package/dist/domain/ir/normalize.mjs.map +1 -0
- package/dist/domain/ir/property-name.cjs +19 -0
- package/dist/domain/ir/property-name.cjs.map +1 -0
- package/dist/domain/ir/property-name.mjs +16 -0
- package/dist/domain/ir/property-name.mjs.map +1 -0
- package/dist/domain/ir/raw-text-escapes.cjs +25 -0
- package/dist/domain/ir/raw-text-escapes.cjs.map +1 -0
- package/dist/domain/ir/raw-text-escapes.mjs +22 -0
- package/dist/domain/ir/raw-text-escapes.mjs.map +1 -0
- package/dist/domain/openapi/admitted-values.cjs +75 -0
- package/dist/domain/openapi/admitted-values.cjs.map +1 -0
- package/dist/domain/openapi/admitted-values.mjs +72 -0
- package/dist/domain/openapi/admitted-values.mjs.map +1 -0
- package/dist/domain/openapi/alias-expansion.cjs +50 -0
- package/dist/domain/openapi/alias-expansion.cjs.map +1 -0
- package/dist/domain/openapi/alias-expansion.mjs +45 -0
- package/dist/domain/openapi/alias-expansion.mjs.map +1 -0
- package/dist/domain/openapi/binary-content.cjs +48 -0
- package/dist/domain/openapi/binary-content.cjs.map +1 -0
- package/dist/domain/openapi/binary-content.mjs +45 -0
- package/dist/domain/openapi/binary-content.mjs.map +1 -0
- package/dist/domain/openapi/components-object.cjs +29 -0
- package/dist/domain/openapi/components-object.cjs.map +1 -0
- package/dist/domain/openapi/components-object.mjs +24 -0
- package/dist/domain/openapi/components-object.mjs.map +1 -0
- package/dist/domain/openapi/discriminated-union.cjs +68 -0
- package/dist/domain/openapi/discriminated-union.cjs.map +1 -0
- package/dist/domain/openapi/discriminated-union.mjs +62 -0
- package/dist/domain/openapi/discriminated-union.mjs.map +1 -0
- package/dist/domain/openapi/discriminator-conflicts.cjs +143 -0
- package/dist/domain/openapi/discriminator-conflicts.cjs.map +1 -0
- package/dist/domain/openapi/discriminator-conflicts.mjs +141 -0
- package/dist/domain/openapi/discriminator-conflicts.mjs.map +1 -0
- package/dist/domain/openapi/json-pointer.cjs +31 -0
- package/dist/domain/openapi/json-pointer.cjs.map +1 -0
- package/dist/domain/openapi/json-pointer.mjs +27 -0
- package/dist/domain/openapi/json-pointer.mjs.map +1 -0
- package/dist/domain/openapi/media-type-object.cjs +14 -0
- package/dist/domain/openapi/media-type-object.cjs.map +1 -0
- package/dist/domain/openapi/media-type-object.mjs +11 -0
- package/dist/domain/openapi/media-type-object.mjs.map +1 -0
- package/dist/domain/openapi/parameter-object.cjs +13 -0
- package/dist/domain/openapi/parameter-object.cjs.map +1 -0
- package/dist/domain/openapi/parameter-object.mjs +10 -0
- package/dist/domain/openapi/parameter-object.mjs.map +1 -0
- package/dist/domain/openapi/path-item-object.cjs +35 -0
- package/dist/domain/openapi/path-item-object.cjs.map +1 -0
- package/dist/domain/openapi/path-item-object.mjs +30 -0
- package/dist/domain/openapi/path-item-object.mjs.map +1 -0
- package/dist/domain/openapi/path-templates.cjs +23 -0
- package/dist/domain/openapi/path-templates.cjs.map +1 -0
- package/dist/domain/openapi/path-templates.mjs +21 -0
- package/dist/domain/openapi/path-templates.mjs.map +1 -0
- package/dist/domain/openapi/unsupported-features.cjs +87 -0
- package/dist/domain/openapi/unsupported-features.cjs.map +1 -0
- package/dist/domain/openapi/unsupported-features.mjs +84 -0
- package/dist/domain/openapi/unsupported-features.mjs.map +1 -0
- package/dist/domain/output-fixes.cjs +101 -0
- package/dist/domain/output-fixes.cjs.map +1 -0
- package/dist/domain/output-fixes.mjs +94 -0
- package/dist/domain/output-fixes.mjs.map +1 -0
- package/dist/domain/warnings.cjs +15 -0
- package/dist/domain/warnings.cjs.map +1 -0
- package/dist/domain/warnings.mjs +12 -0
- package/dist/domain/warnings.mjs.map +1 -0
- package/dist/index.cjs +98 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +841 -0
- package/dist/index.d.mts +841 -0
- package/dist/index.d.ts +841 -0
- package/dist/index.mjs +27 -0
- package/dist/index.mjs.map +1 -0
- package/dist/transform/components-object.cjs +15 -0
- package/dist/transform/components-object.cjs.map +1 -0
- package/dist/transform/components-object.mjs +11 -0
- package/dist/transform/components-object.mjs.map +1 -0
- package/dist/transform/header-object.cjs +12 -0
- package/dist/transform/header-object.cjs.map +1 -0
- package/dist/transform/header-object.mjs +10 -0
- package/dist/transform/header-object.mjs.map +1 -0
- package/dist/transform/media-type-object.cjs +12 -0
- package/dist/transform/media-type-object.cjs.map +1 -0
- package/dist/transform/media-type-object.mjs +10 -0
- package/dist/transform/media-type-object.mjs.map +1 -0
- package/dist/transform/operation-object.cjs +26 -0
- package/dist/transform/operation-object.cjs.map +1 -0
- package/dist/transform/operation-object.mjs +21 -0
- package/dist/transform/operation-object.mjs.map +1 -0
- package/dist/transform/parameter-object.cjs +12 -0
- package/dist/transform/parameter-object.cjs.map +1 -0
- package/dist/transform/parameter-object.mjs +10 -0
- package/dist/transform/parameter-object.mjs.map +1 -0
- package/dist/transform/path-item-object.cjs +12 -0
- package/dist/transform/path-item-object.cjs.map +1 -0
- package/dist/transform/path-item-object.mjs +10 -0
- package/dist/transform/path-item-object.mjs.map +1 -0
- package/dist/transform/paths-object.cjs +11 -0
- package/dist/transform/paths-object.cjs.map +1 -0
- package/dist/transform/paths-object.mjs +9 -0
- package/dist/transform/paths-object.mjs.map +1 -0
- package/dist/transform/request-body-object.cjs +12 -0
- package/dist/transform/request-body-object.cjs.map +1 -0
- package/dist/transform/request-body-object.mjs +10 -0
- package/dist/transform/request-body-object.mjs.map +1 -0
- package/dist/transform/response-object.cjs +12 -0
- package/dist/transform/response-object.cjs.map +1 -0
- package/dist/transform/response-object.mjs +10 -0
- package/dist/transform/response-object.mjs.map +1 -0
- package/dist/transform/responses-object.cjs +12 -0
- package/dist/transform/responses-object.cjs.map +1 -0
- package/dist/transform/responses-object.mjs +10 -0
- package/dist/transform/responses-object.mjs.map +1 -0
- package/dist/transform/schema-object.cjs +21 -0
- package/dist/transform/schema-object.cjs.map +1 -0
- package/dist/transform/schema-object.mjs +16 -0
- package/dist/transform/schema-object.mjs.map +1 -0
- package/package.json +115 -4
- package/src/adapters/node-file-system/node-file-system.ts +44 -0
- package/src/adapters/redocly-loader/alias-limit.ts +20 -0
- package/src/adapters/redocly-loader/allowed-hosts.ts +62 -0
- package/src/adapters/redocly-loader/bundled-ref-repair.ts +65 -0
- package/src/adapters/redocly-loader/malformed-refs.ts +61 -0
- package/src/adapters/redocly-loader/redocly-config-source.ts +78 -0
- package/src/adapters/redocly-loader/redocly-schema-loader.ts +262 -0
- package/src/adapters/redocly-loader/ref-access.ts +146 -0
- package/src/adapters/redocly-loader/ref-holders.ts +43 -0
- package/src/adapters/redocly-loader/remote-fetch.ts +104 -0
- package/src/adapters/redocly-loader/schema-load-errors.ts +124 -0
- package/src/adapters/redocly-loader/schema-source.ts +151 -0
- package/src/adapters/redocly-loader/unsupported-keys.ts +102 -0
- package/src/adapters/terminal-logger/terminal-logger.ts +98 -0
- package/src/adapters/type-ast-bridge/footer-nodes.ts +38 -0
- package/src/adapters/type-ast-bridge/ir-declarations-to-typescript.ts +100 -0
- package/src/adapters/type-ast-bridge/ir-to-typescript.ts +223 -0
- package/src/adapters/type-ast-bridge/lazy-node.ts +24 -0
- package/src/adapters/type-ast-bridge/load-typescript.ts +84 -0
- package/src/adapters/type-ast-bridge/print-typescript.ts +33 -0
- package/src/adapters/type-ast-bridge/typescript-raw-text.ts +49 -0
- package/src/adapters/type-ast-bridge/typescript-to-ir.ts +294 -0
- package/src/adapters/type-ast-bridge/typescript-types.ts +8 -0
- package/src/api/ast-to-string.ts +59 -0
- package/src/api/comment-header.ts +7 -0
- package/src/api/default-ports.ts +44 -0
- package/src/api/discriminator-conflict-warnings.ts +43 -0
- package/src/api/discriminator-enum-names.ts +26 -0
- package/src/api/discriminator-enum-parent.ts +129 -0
- package/src/api/discriminator-enum.ts +115 -0
- package/src/api/discriminator-other-owners.ts +97 -0
- package/src/api/discriminator-patch.ts +147 -0
- package/src/api/discriminator-scan.ts +260 -0
- package/src/api/document-declarations.ts +41 -0
- package/src/api/document-refs.ts +71 -0
- package/src/api/document-run.ts +177 -0
- package/src/api/enum-values-warnings.ts +21 -0
- package/src/api/footer-entry.ts +23 -0
- package/src/api/footer-sink.ts +67 -0
- package/src/api/legacy-callback-warning.ts +29 -0
- package/src/api/legacy-ts-helpers.ts +311 -0
- package/src/api/legacy-utils.ts +118 -0
- package/src/api/openapi-ts.ts +62 -0
- package/src/api/path-template-warnings.ts +27 -0
- package/src/api/schema-callbacks.ts +211 -0
- package/src/api/string-to-ast.ts +27 -0
- package/src/api/transform-context.ts +93 -0
- package/src/api/transform-schema.ts +123 -0
- package/src/api/type-helpers.ts +130 -0
- package/src/api/unsupported-feature-warnings.ts +33 -0
- package/src/application/ports/file-system.ts +12 -0
- package/src/application/ports/logger.ts +16 -0
- package/src/application/ports/redocly-config-source.ts +20 -0
- package/src/application/ports/schema-loader.ts +32 -0
- package/src/application/print/comment-writer.ts +91 -0
- package/src/application/print/declaration-printer.ts +100 -0
- package/src/application/print/literal-text.ts +62 -0
- package/src/application/print/print-nodes.ts +62 -0
- package/src/application/print/print-options.ts +11 -0
- package/src/application/print/text-writer.ts +83 -0
- package/src/application/print/type-printer.ts +287 -0
- package/src/application/stack-overflow.ts +54 -0
- package/src/application/transform/document/assignability.ts +203 -0
- package/src/application/transform/document/components.ts +189 -0
- package/src/application/transform/document/declared-types.ts +93 -0
- package/src/application/transform/document/defs-root.ts +25 -0
- package/src/application/transform/document/document-member.ts +20 -0
- package/src/application/transform/document/document.ts +215 -0
- package/src/application/transform/document/exploded-query.ts +91 -0
- package/src/application/transform/document/global-type-references.ts +78 -0
- package/src/application/transform/document/header.ts +34 -0
- package/src/application/transform/document/kept-deprecated.ts +135 -0
- package/src/application/transform/document/list-assignability.ts +87 -0
- package/src/application/transform/document/media-type.ts +78 -0
- package/src/application/transform/document/operation.ts +64 -0
- package/src/application/transform/document/parameter.ts +45 -0
- package/src/application/transform/document/parameters.ts +265 -0
- package/src/application/transform/document/path-item.ts +168 -0
- package/src/application/transform/document/path-key-overlaps.ts +201 -0
- package/src/application/transform/document/path-template-replace.ts +90 -0
- package/src/application/transform/document/paths-enum.ts +127 -0
- package/src/application/transform/document/paths.ts +273 -0
- package/src/application/transform/document/request-body.ts +50 -0
- package/src/application/transform/document/response.ts +109 -0
- package/src/application/transform/document/responses.ts +29 -0
- package/src/application/transform/document/root-type-aliases.ts +107 -0
- package/src/application/transform/document/template-key-match.ts +183 -0
- package/src/application/transform/document/type-assignability.ts +268 -0
- package/src/application/transform/document/type-key.ts +80 -0
- package/src/application/transform/document/type-resolution.ts +163 -0
- package/src/application/transform/document/webhooks.ts +22 -0
- package/src/application/transform/document-entries.ts +28 -0
- package/src/application/transform/footer/document-footer.ts +212 -0
- package/src/application/transform/footer/enum-naming.ts +210 -0
- package/src/application/transform/footer/enum-values-check.ts +171 -0
- package/src/application/transform/footer/evaluation.ts +47 -0
- package/src/application/transform/footer/shared-enum-names.ts +86 -0
- package/src/application/transform/footer/type-evaluation.ts +294 -0
- package/src/application/transform/footer/type-rules.ts +269 -0
- package/src/application/transform/helper-types.ts +92 -0
- package/src/application/transform/literal-type.ts +54 -0
- package/src/application/transform/numbered-names.ts +20 -0
- package/src/application/transform/ref-pointer/generated-location.ts +211 -0
- package/src/application/transform/ref-pointer/generated-shape.ts +275 -0
- package/src/application/transform/ref-pointer/inline-cycles.ts +56 -0
- package/src/application/transform/ref-pointer/original-index.ts +95 -0
- package/src/application/transform/ref-pointer/pointer-type.ts +92 -0
- package/src/application/transform/ref-pointer/pointer-walk.ts +96 -0
- package/src/application/transform/ref-pointer/typed-walk.ts +192 -0
- package/src/application/transform/ref-type.ts +102 -0
- package/src/application/transform/schema/access-flags.ts +63 -0
- package/src/application/transform/schema/array-type.ts +213 -0
- package/src/application/transform/schema/composition-type.ts +255 -0
- package/src/application/transform/schema/core-type.ts +119 -0
- package/src/application/transform/schema/discriminated-union.ts +58 -0
- package/src/application/transform/schema/discriminator-property.ts +33 -0
- package/src/application/transform/schema/enum-rule.ts +280 -0
- package/src/application/transform/schema/inherited-discriminator.ts +54 -0
- package/src/application/transform/schema/object-type.ts +289 -0
- package/src/application/transform/schema/presence-members.ts +96 -0
- package/src/application/transform/schema/required-variants.ts +88 -0
- package/src/application/transform/schema/schema-context.ts +136 -0
- package/src/application/transform/schema/schema-rule.ts +29 -0
- package/src/application/transform/schema/schema-transform.ts +99 -0
- package/src/application/transform/schema/unevaluated-properties.ts +105 -0
- package/src/application/transform/schema-comment.ts +196 -0
- package/src/application/transform/shared-types.ts +9 -0
- package/src/application/transform/transform-context.ts +51 -0
- package/src/application/transform/type-combinators.ts +57 -0
- package/src/cli/cli-arguments.ts +208 -0
- package/src/cli/cli-dependencies.ts +47 -0
- package/src/cli/cli-errors.ts +127 -0
- package/src/cli/cli-output.ts +67 -0
- package/src/cli/docs-links.ts +6 -0
- package/src/cli/fix-option.ts +29 -0
- package/src/cli/help-text.ts +52 -0
- package/src/cli/main.ts +73 -0
- package/src/cli/redocly-apis.ts +95 -0
- package/src/cli/ref-limits.ts +16 -0
- package/src/cli/run-cli.ts +131 -0
- package/src/domain/assert-never.ts +8 -0
- package/src/domain/errors.ts +76 -0
- package/src/domain/ir/constructors.ts +142 -0
- package/src/domain/ir/identifier-text.ts +49 -0
- package/src/domain/ir/newer-identifier-ranges.ts +109 -0
- package/src/domain/ir/nodes.ts +225 -0
- package/src/domain/ir/normalize.ts +51 -0
- package/src/domain/ir/property-name.ts +28 -0
- package/src/domain/ir/raw-text-escapes.ts +37 -0
- package/src/domain/openapi/admitted-values.ts +113 -0
- package/src/domain/openapi/alias-expansion.ts +72 -0
- package/src/domain/openapi/binary-content.ts +74 -0
- package/src/domain/openapi/components-object.ts +52 -0
- package/src/domain/openapi/discriminated-union.ts +109 -0
- package/src/domain/openapi/discriminator-conflicts.ts +251 -0
- package/src/domain/openapi/document-object.ts +12 -0
- package/src/domain/openapi/header-object.ts +9 -0
- package/src/domain/openapi/json-pointer.ts +46 -0
- package/src/domain/openapi/media-type-object.ts +26 -0
- package/src/domain/openapi/operation-object.ts +13 -0
- package/src/domain/openapi/parameter-object.ts +34 -0
- package/src/domain/openapi/path-item-object.ts +70 -0
- package/src/domain/openapi/path-templates.ts +31 -0
- package/src/domain/openapi/request-body-object.ts +7 -0
- package/src/domain/openapi/response-object.ts +14 -0
- package/src/domain/openapi/schema-object.ts +61 -0
- package/src/domain/openapi/unsupported-features.ts +139 -0
- package/src/domain/output-fixes.ts +136 -0
- package/src/domain/warnings.ts +20 -0
- package/src/index.ts +67 -0
- package/src/transform/components-object.ts +27 -0
- package/src/transform/header-object.ts +19 -0
- package/src/transform/media-type-object.ts +19 -0
- package/src/transform/operation-object.ts +36 -0
- package/src/transform/parameter-object.ts +19 -0
- package/src/transform/parameters-array.ts +19 -0
- package/src/transform/path-item-object.ts +22 -0
- package/src/transform/paths-enum.ts +8 -0
- package/src/transform/paths-object.ts +15 -0
- package/src/transform/request-body-object.ts +19 -0
- package/src/transform/response-object.ts +19 -0
- package/src/transform/responses-object.ts +19 -0
- package/src/transform/schema-object.ts +36 -0
- package/src/transform/webhooks-object.ts +15 -0
- package/src/types/generator-options.ts +278 -0
- package/src/types/openapi-common.ts +100 -0
- package/src/types/openapi-document.ts +196 -0
- package/src/types/openapi-path-item.ts +130 -0
- package/src/types/openapi-request.ts +209 -0
- package/src/types/openapi-response.ts +81 -0
- package/src/types/openapi-schema.ts +169 -0
- package/src/types/openapi-security.ts +116 -0
- package/src/types.ts +12 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const jsonPointer = require('./json-pointer.cjs');
|
|
4
|
+
|
|
5
|
+
const UNION_KEYWORDS = ["oneOf", "anyOf"];
|
|
6
|
+
const COMPOSITION_KEYWORDS = ["allOf", ...UNION_KEYWORDS];
|
|
7
|
+
function isSchemaObject(value) {
|
|
8
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
9
|
+
}
|
|
10
|
+
function keywordItems(schema, keywords) {
|
|
11
|
+
const record = schema;
|
|
12
|
+
return keywords.flatMap((keyword) => {
|
|
13
|
+
const items = record[keyword];
|
|
14
|
+
return Array.isArray(items) ? items : [];
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
function unionMembers(schema) {
|
|
18
|
+
return isSchemaObject(schema) ? keywordItems(schema, UNION_KEYWORDS) : [];
|
|
19
|
+
}
|
|
20
|
+
function unionAt(ref, resolve) {
|
|
21
|
+
const schema = resolve(ref);
|
|
22
|
+
return isSchemaObject(schema) && unionMembers(schema).length > 0 ? schema : void 0;
|
|
23
|
+
}
|
|
24
|
+
function reaches(schema, search) {
|
|
25
|
+
if (!isSchemaObject(schema)) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
const ref = schema.$ref;
|
|
29
|
+
if (typeof ref === "string") {
|
|
30
|
+
if (ref === search.target) {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
if (search.visited.has(ref)) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
search.visited.add(ref);
|
|
37
|
+
return reaches(search.resolve(ref), search);
|
|
38
|
+
}
|
|
39
|
+
return keywordItems(schema, COMPOSITION_KEYWORDS).some((item) => reaches(item, search));
|
|
40
|
+
}
|
|
41
|
+
function unionReaches(union, target, resolve) {
|
|
42
|
+
const search = { target, resolve, visited: /* @__PURE__ */ new Set() };
|
|
43
|
+
return unionMembers(union).some((member) => reaches(member, search));
|
|
44
|
+
}
|
|
45
|
+
const COMPONENT_SCHEMAS = "#/components/schemas/";
|
|
46
|
+
function mappingRef(target) {
|
|
47
|
+
if (typeof target !== "string") {
|
|
48
|
+
return void 0;
|
|
49
|
+
}
|
|
50
|
+
return target.startsWith("#") ? target : `${COMPONENT_SCHEMAS}${jsonPointer.escapePointerSegment(target)}`;
|
|
51
|
+
}
|
|
52
|
+
function unionMaps(union, target) {
|
|
53
|
+
const mapping = union.discriminator?.mapping;
|
|
54
|
+
if (!isSchemaObject(mapping)) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
return Object.values(mapping).some((value) => mappingRef(value) === target);
|
|
58
|
+
}
|
|
59
|
+
function isUnionMember(union, target, resolve) {
|
|
60
|
+
return unionMaps(union, target) || unionReaches(union, target, resolve);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
exports.isUnionMember = isUnionMember;
|
|
64
|
+
exports.unionAt = unionAt;
|
|
65
|
+
exports.unionMaps = unionMaps;
|
|
66
|
+
exports.unionMembers = unionMembers;
|
|
67
|
+
exports.unionReaches = unionReaches;
|
|
68
|
+
//# sourceMappingURL=discriminated-union.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discriminated-union.cjs","sources":["../../../src/domain/openapi/discriminated-union.ts"],"sourcesContent":["import { escapePointerSegment } from \"./json-pointer.js\";\nimport type { Schema, SchemaObject } from \"./schema-object.js\";\n\n/**\n * A discriminator owner is either a parent that its members `allOf` (an object with the\n * discriminator property) or a union (`oneOf` / `anyOf` of the members). The generated type of a\n * union is a TypeScript union, so it cannot be used like a parent: `Omit<Union, \"kind\">` keeps\n * only the keys that every member has, and a member that intersects the union it belongs to\n * refers to itself (TS2502, upstream #1665).\n */\n\n/** Resolves a `$ref` of the document; `undefined` when it points nowhere. */\nexport type ResolveSchemaRef = (ref: string) => unknown;\n\nconst UNION_KEYWORDS = [\"oneOf\", \"anyOf\"] as const;\nconst COMPOSITION_KEYWORDS = [\"allOf\", ...UNION_KEYWORDS] as const;\n\nfunction isSchemaObject(value: unknown): value is SchemaObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction keywordItems(schema: SchemaObject, keywords: readonly string[]): readonly Schema[] {\n const record = schema as Readonly<Record<string, unknown>>;\n return keywords.flatMap((keyword) => {\n const items = record[keyword];\n return Array.isArray(items) ? (items as readonly Schema[]) : [];\n });\n}\n\n/** The `oneOf` and `anyOf` members of a schema; empty when it is not a union. */\nexport function unionMembers(schema: unknown): readonly Schema[] {\n return isSchemaObject(schema) ? keywordItems(schema, UNION_KEYWORDS) : [];\n}\n\n/** The schema at `ref` when it is a union (has `oneOf` or `anyOf` members), else undefined. */\nexport function unionAt(ref: string, resolve: ResolveSchemaRef): SchemaObject | undefined {\n const schema = resolve(ref);\n return isSchemaObject(schema) && unionMembers(schema).length > 0 ? schema : undefined;\n}\n\n/** What one search for a `$ref` has seen, so that a `$ref` cycle ends. */\ninterface Search {\n readonly target: string;\n readonly resolve: ResolveSchemaRef;\n readonly visited: Set<string>;\n}\n\nfunction reaches(schema: Schema, search: Search): boolean {\n if (!isSchemaObject(schema)) {\n return false;\n }\n const ref = (schema as { readonly $ref?: unknown }).$ref;\n if (typeof ref === \"string\") {\n if (ref === search.target) {\n return true;\n }\n if (search.visited.has(ref)) {\n return false;\n }\n search.visited.add(ref);\n return reaches(search.resolve(ref) as Schema, search);\n }\n return keywordItems(schema, COMPOSITION_KEYWORDS).some((item) => reaches(item, search));\n}\n\n/**\n * Whether the type of `union` contains the schema at `target` without an object in between: one\n * of its members is a `$ref` to it, or `allOf` / `oneOf` / `anyOf` such a `$ref`, at any depth.\n * Such a reference is resolved at once by TypeScript, unlike one in a property or an array.\n */\nexport function unionReaches(\n union: SchemaObject,\n target: string,\n resolve: ResolveSchemaRef,\n): boolean {\n const search = { target, resolve, visited: new Set<string>() };\n return unionMembers(union).some((member) => reaches(member, search));\n}\n\nconst COMPONENT_SCHEMAS = \"#/components/schemas/\";\n\n/** A mapping value as a `$ref`: a bare name is a component schema's name. */\nfunction mappingRef(target: unknown): string | undefined {\n if (typeof target !== \"string\") {\n return undefined;\n }\n return target.startsWith(\"#\") ? target : `${COMPONENT_SCHEMAS}${escapePointerSegment(target)}`;\n}\n\n/** Whether the discriminator `mapping` of `union` names the schema at `target`. */\nexport function unionMaps(union: SchemaObject, target: string): boolean {\n const mapping = (union.discriminator as { readonly mapping?: unknown } | undefined)?.mapping;\n if (!isSchemaObject(mapping)) {\n return false;\n }\n return Object.values(mapping).some((value) => mappingRef(value) === target);\n}\n\n/**\n * Whether the schema at `target` is a member of `union`: the union's type contains it, or the\n * discriminator `mapping` names it, which gives it a value of the union as a member does.\n */\nexport function isUnionMember(\n union: SchemaObject,\n target: string,\n resolve: ResolveSchemaRef,\n): boolean {\n return unionMaps(union, target) || unionReaches(union, target, resolve);\n}\n"],"names":["escapePointerSegment"],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { escapePointerSegment } from './json-pointer.mjs';
|
|
2
|
+
|
|
3
|
+
const UNION_KEYWORDS = ["oneOf", "anyOf"];
|
|
4
|
+
const COMPOSITION_KEYWORDS = ["allOf", ...UNION_KEYWORDS];
|
|
5
|
+
function isSchemaObject(value) {
|
|
6
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
7
|
+
}
|
|
8
|
+
function keywordItems(schema, keywords) {
|
|
9
|
+
const record = schema;
|
|
10
|
+
return keywords.flatMap((keyword) => {
|
|
11
|
+
const items = record[keyword];
|
|
12
|
+
return Array.isArray(items) ? items : [];
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
function unionMembers(schema) {
|
|
16
|
+
return isSchemaObject(schema) ? keywordItems(schema, UNION_KEYWORDS) : [];
|
|
17
|
+
}
|
|
18
|
+
function unionAt(ref, resolve) {
|
|
19
|
+
const schema = resolve(ref);
|
|
20
|
+
return isSchemaObject(schema) && unionMembers(schema).length > 0 ? schema : void 0;
|
|
21
|
+
}
|
|
22
|
+
function reaches(schema, search) {
|
|
23
|
+
if (!isSchemaObject(schema)) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
const ref = schema.$ref;
|
|
27
|
+
if (typeof ref === "string") {
|
|
28
|
+
if (ref === search.target) {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
if (search.visited.has(ref)) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
search.visited.add(ref);
|
|
35
|
+
return reaches(search.resolve(ref), search);
|
|
36
|
+
}
|
|
37
|
+
return keywordItems(schema, COMPOSITION_KEYWORDS).some((item) => reaches(item, search));
|
|
38
|
+
}
|
|
39
|
+
function unionReaches(union, target, resolve) {
|
|
40
|
+
const search = { target, resolve, visited: /* @__PURE__ */ new Set() };
|
|
41
|
+
return unionMembers(union).some((member) => reaches(member, search));
|
|
42
|
+
}
|
|
43
|
+
const COMPONENT_SCHEMAS = "#/components/schemas/";
|
|
44
|
+
function mappingRef(target) {
|
|
45
|
+
if (typeof target !== "string") {
|
|
46
|
+
return void 0;
|
|
47
|
+
}
|
|
48
|
+
return target.startsWith("#") ? target : `${COMPONENT_SCHEMAS}${escapePointerSegment(target)}`;
|
|
49
|
+
}
|
|
50
|
+
function unionMaps(union, target) {
|
|
51
|
+
const mapping = union.discriminator?.mapping;
|
|
52
|
+
if (!isSchemaObject(mapping)) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
return Object.values(mapping).some((value) => mappingRef(value) === target);
|
|
56
|
+
}
|
|
57
|
+
function isUnionMember(union, target, resolve) {
|
|
58
|
+
return unionMaps(union, target) || unionReaches(union, target, resolve);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export { isUnionMember, unionAt, unionMaps, unionMembers, unionReaches };
|
|
62
|
+
//# sourceMappingURL=discriminated-union.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discriminated-union.mjs","sources":["../../../src/domain/openapi/discriminated-union.ts"],"sourcesContent":["import { escapePointerSegment } from \"./json-pointer.js\";\nimport type { Schema, SchemaObject } from \"./schema-object.js\";\n\n/**\n * A discriminator owner is either a parent that its members `allOf` (an object with the\n * discriminator property) or a union (`oneOf` / `anyOf` of the members). The generated type of a\n * union is a TypeScript union, so it cannot be used like a parent: `Omit<Union, \"kind\">` keeps\n * only the keys that every member has, and a member that intersects the union it belongs to\n * refers to itself (TS2502, upstream #1665).\n */\n\n/** Resolves a `$ref` of the document; `undefined` when it points nowhere. */\nexport type ResolveSchemaRef = (ref: string) => unknown;\n\nconst UNION_KEYWORDS = [\"oneOf\", \"anyOf\"] as const;\nconst COMPOSITION_KEYWORDS = [\"allOf\", ...UNION_KEYWORDS] as const;\n\nfunction isSchemaObject(value: unknown): value is SchemaObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction keywordItems(schema: SchemaObject, keywords: readonly string[]): readonly Schema[] {\n const record = schema as Readonly<Record<string, unknown>>;\n return keywords.flatMap((keyword) => {\n const items = record[keyword];\n return Array.isArray(items) ? (items as readonly Schema[]) : [];\n });\n}\n\n/** The `oneOf` and `anyOf` members of a schema; empty when it is not a union. */\nexport function unionMembers(schema: unknown): readonly Schema[] {\n return isSchemaObject(schema) ? keywordItems(schema, UNION_KEYWORDS) : [];\n}\n\n/** The schema at `ref` when it is a union (has `oneOf` or `anyOf` members), else undefined. */\nexport function unionAt(ref: string, resolve: ResolveSchemaRef): SchemaObject | undefined {\n const schema = resolve(ref);\n return isSchemaObject(schema) && unionMembers(schema).length > 0 ? schema : undefined;\n}\n\n/** What one search for a `$ref` has seen, so that a `$ref` cycle ends. */\ninterface Search {\n readonly target: string;\n readonly resolve: ResolveSchemaRef;\n readonly visited: Set<string>;\n}\n\nfunction reaches(schema: Schema, search: Search): boolean {\n if (!isSchemaObject(schema)) {\n return false;\n }\n const ref = (schema as { readonly $ref?: unknown }).$ref;\n if (typeof ref === \"string\") {\n if (ref === search.target) {\n return true;\n }\n if (search.visited.has(ref)) {\n return false;\n }\n search.visited.add(ref);\n return reaches(search.resolve(ref) as Schema, search);\n }\n return keywordItems(schema, COMPOSITION_KEYWORDS).some((item) => reaches(item, search));\n}\n\n/**\n * Whether the type of `union` contains the schema at `target` without an object in between: one\n * of its members is a `$ref` to it, or `allOf` / `oneOf` / `anyOf` such a `$ref`, at any depth.\n * Such a reference is resolved at once by TypeScript, unlike one in a property or an array.\n */\nexport function unionReaches(\n union: SchemaObject,\n target: string,\n resolve: ResolveSchemaRef,\n): boolean {\n const search = { target, resolve, visited: new Set<string>() };\n return unionMembers(union).some((member) => reaches(member, search));\n}\n\nconst COMPONENT_SCHEMAS = \"#/components/schemas/\";\n\n/** A mapping value as a `$ref`: a bare name is a component schema's name. */\nfunction mappingRef(target: unknown): string | undefined {\n if (typeof target !== \"string\") {\n return undefined;\n }\n return target.startsWith(\"#\") ? target : `${COMPONENT_SCHEMAS}${escapePointerSegment(target)}`;\n}\n\n/** Whether the discriminator `mapping` of `union` names the schema at `target`. */\nexport function unionMaps(union: SchemaObject, target: string): boolean {\n const mapping = (union.discriminator as { readonly mapping?: unknown } | undefined)?.mapping;\n if (!isSchemaObject(mapping)) {\n return false;\n }\n return Object.values(mapping).some((value) => mappingRef(value) === target);\n}\n\n/**\n * Whether the schema at `target` is a member of `union`: the union's type contains it, or the\n * discriminator `mapping` names it, which gives it a value of the union as a member does.\n */\nexport function isUnionMember(\n union: SchemaObject,\n target: string,\n resolve: ResolveSchemaRef,\n): boolean {\n return unionMaps(union, target) || unionReaches(union, target, resolve);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const admittedValues = require('./admitted-values.cjs');
|
|
4
|
+
const discriminatedUnion = require('./discriminated-union.cjs');
|
|
5
|
+
const jsonPointer = require('./json-pointer.cjs');
|
|
6
|
+
|
|
7
|
+
const COMPONENT_SCHEMAS = "#/components/schemas/";
|
|
8
|
+
function isObject(value) {
|
|
9
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
10
|
+
}
|
|
11
|
+
function refsOf(list) {
|
|
12
|
+
return (Array.isArray(list) ? list : []).flatMap(
|
|
13
|
+
(item) => isObject(item) && typeof item.$ref === "string" ? [item.$ref] : []
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
function mappingTarget(target) {
|
|
17
|
+
return target.startsWith("#") ? target : `${COMPONENT_SCHEMAS}${jsonPointer.escapePointerSegment(target)}`;
|
|
18
|
+
}
|
|
19
|
+
function ownerAt(node, pointer) {
|
|
20
|
+
const discriminator = node.discriminator;
|
|
21
|
+
if (!isObject(discriminator) || typeof discriminator.propertyName !== "string") {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
const mapping = isObject(discriminator.mapping) ? discriminator.mapping : {};
|
|
25
|
+
const mapped = Object.values(mapping).filter((t) => typeof t === "string").map(mappingTarget);
|
|
26
|
+
const memberRefs = [...refsOf(node.oneOf), ...refsOf(node.anyOf), ...mapped];
|
|
27
|
+
return { pointer: pointer(), propertyName: discriminator.propertyName, mapping, memberRefs };
|
|
28
|
+
}
|
|
29
|
+
function pointerOf(visit) {
|
|
30
|
+
const segments = [];
|
|
31
|
+
for (let current = visit; current?.key != null; current = current.parent) {
|
|
32
|
+
segments.unshift(current.key);
|
|
33
|
+
}
|
|
34
|
+
return jsonPointer.createRef(segments);
|
|
35
|
+
}
|
|
36
|
+
function childrenOf(visit) {
|
|
37
|
+
const { node } = visit;
|
|
38
|
+
const entries = Array.isArray(node) ? node.map((item, index) => [String(index), item]) : isObject(node) ? Object.entries(node) : [];
|
|
39
|
+
return entries.map(([key, child]) => ({ node: child, key, parent: visit }));
|
|
40
|
+
}
|
|
41
|
+
function ownersIn(document) {
|
|
42
|
+
const found = [];
|
|
43
|
+
const stack = [{ node: document, key: null, parent: null }];
|
|
44
|
+
for (let visit = stack.pop(); visit !== void 0; visit = stack.pop()) {
|
|
45
|
+
const owner = isObject(visit.node) ? ownerAt(visit.node, () => pointerOf(visit)) : null;
|
|
46
|
+
if (owner !== null) {
|
|
47
|
+
found.push(owner);
|
|
48
|
+
}
|
|
49
|
+
stack.push(...childrenOf(visit).reverse());
|
|
50
|
+
}
|
|
51
|
+
return found;
|
|
52
|
+
}
|
|
53
|
+
function inheritingChildren(owner, search) {
|
|
54
|
+
const children = search.children.get(owner.pointer) ?? [];
|
|
55
|
+
const resolve = (ref) => admittedValues.resolveLocalRef(search.document, ref);
|
|
56
|
+
const union = search.isUnionReused ? discriminatedUnion.unionAt(owner.pointer, resolve) : void 0;
|
|
57
|
+
return union === void 0 ? children : children.filter((child) => discriminatedUnion.isUnionMember(union, child.ref, resolve));
|
|
58
|
+
}
|
|
59
|
+
function allOfChildren(document) {
|
|
60
|
+
const schemas = admittedValues.resolveLocalRef(document, "#/components/schemas");
|
|
61
|
+
const children = /* @__PURE__ */ new Map();
|
|
62
|
+
for (const [name, schema] of Object.entries(isObject(schemas) ? schemas : {})) {
|
|
63
|
+
if (!isObject(schema)) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const child = { ref: `${COMPONENT_SCHEMAS}${jsonPointer.escapePointerSegment(name)}`, schema };
|
|
67
|
+
for (const parent of new Set(refsOf(schema.allOf))) {
|
|
68
|
+
const siblings = children.get(parent) ?? [];
|
|
69
|
+
siblings.push(child);
|
|
70
|
+
children.set(parent, siblings);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return children;
|
|
74
|
+
}
|
|
75
|
+
function ownsProperty(schema, propertyName) {
|
|
76
|
+
const discriminator = schema.discriminator;
|
|
77
|
+
return isObject(discriminator) && discriminator.propertyName === propertyName;
|
|
78
|
+
}
|
|
79
|
+
function inheritingMembers(owner, search) {
|
|
80
|
+
const found = [];
|
|
81
|
+
const visited = /* @__PURE__ */ new Set([owner.pointer]);
|
|
82
|
+
const parents = [{ ref: owner.pointer, skipped: /* @__PURE__ */ new Set([owner.pointer]) }];
|
|
83
|
+
for (let parent = parents.shift(); parent !== void 0; parent = parents.shift()) {
|
|
84
|
+
const children = parent.ref === owner.pointer ? inheritingChildren(owner, search) : search.children.get(parent.ref) ?? [];
|
|
85
|
+
for (const child of children) {
|
|
86
|
+
if (visited.has(child.ref)) {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
visited.add(child.ref);
|
|
90
|
+
found.push({ ref: child.ref, skipped: parent.skipped });
|
|
91
|
+
if (!ownsProperty(child.schema, owner.propertyName)) {
|
|
92
|
+
parents.push({ ref: child.ref, skipped: /* @__PURE__ */ new Set([...parent.skipped, child.ref]) });
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return found;
|
|
97
|
+
}
|
|
98
|
+
function membersOf(owner, search) {
|
|
99
|
+
const listed = owner.memberRefs.map((ref) => ({ ref, skipped: /* @__PURE__ */ new Set([owner.pointer]) }));
|
|
100
|
+
const members = /* @__PURE__ */ new Map();
|
|
101
|
+
for (const member of [...listed, ...inheritingMembers(owner, search)]) {
|
|
102
|
+
if (!members.has(member.ref)) {
|
|
103
|
+
members.set(member.ref, member);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return [...members.values()];
|
|
107
|
+
}
|
|
108
|
+
function memberValues(owner, member) {
|
|
109
|
+
const values = Object.entries(owner.mapping).filter(([, target]) => typeof target === "string" && mappingTarget(target) === member).map(([key]) => key);
|
|
110
|
+
const name = jsonPointer.parseRefPointer(member).pop() ?? "";
|
|
111
|
+
return values.length > 0 ? { values, isImplicit: false } : { values: [name], isImplicit: true };
|
|
112
|
+
}
|
|
113
|
+
function conflictOf(owner, { ref: member, skipped }, document) {
|
|
114
|
+
const allowed = admittedValues.admittedPropertyValues(
|
|
115
|
+
admittedValues.resolveLocalRef(document, member),
|
|
116
|
+
owner.propertyName,
|
|
117
|
+
document,
|
|
118
|
+
skipped
|
|
119
|
+
);
|
|
120
|
+
const { values, isImplicit } = memberValues(owner, member);
|
|
121
|
+
if (allowed === null || values.some((value) => allowed.has(value))) {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
const { pointer, propertyName } = owner;
|
|
125
|
+
return { member, owner: pointer, propertyName, values, allowed: [...allowed], isImplicit };
|
|
126
|
+
}
|
|
127
|
+
function findDiscriminatorValueConflicts(document, options = { isUnionReused: false }) {
|
|
128
|
+
const conflicts = /* @__PURE__ */ new Map();
|
|
129
|
+
const search = { ...options, document, children: allOfChildren(document) };
|
|
130
|
+
for (const owner of ownersIn(document)) {
|
|
131
|
+
for (const member of membersOf(owner, search)) {
|
|
132
|
+
const conflict = conflictOf(owner, member, document);
|
|
133
|
+
const key = JSON.stringify([member.ref, conflict?.propertyName, conflict?.values]);
|
|
134
|
+
if (conflict !== null && !conflicts.has(key)) {
|
|
135
|
+
conflicts.set(key, conflict);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return [...conflicts.values()];
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
exports.findDiscriminatorValueConflicts = findDiscriminatorValueConflicts;
|
|
143
|
+
//# sourceMappingURL=discriminator-conflicts.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discriminator-conflicts.cjs","sources":["../../../src/domain/openapi/discriminator-conflicts.ts"],"sourcesContent":["import { admittedPropertyValues, resolveLocalRef } from \"./admitted-values.js\";\nimport { isUnionMember, unionAt } from \"./discriminated-union.js\";\nimport { createRef, escapePointerSegment, parseRefPointer } from \"./json-pointer.js\";\n\n/**\n * Discriminator members whose discriminator value their own property does not allow. By the\n * Discriminator Object rule, a member that no `mapping` entry names has its schema name as the\n * value, so with a property `enum` (or `const`) that does not list it no value of the member\n * matches, and where the generator adds the value to the member the property type is `never`.\n * Each one gets a warning (CODING_PRINCIPLES §8.7).\n */\n\nexport interface DiscriminatorValueConflict {\n /** The member schema, such as `#/components/schemas/EpisodeObject`. */\n readonly member: string;\n /** The schema that has the Discriminator Object. */\n readonly owner: string;\n readonly propertyName: string;\n /** The values the discriminator gives the member: its mapping keys, or its name. */\n readonly values: readonly string[];\n /** The values the member's property allows. */\n readonly allowed: readonly (string | number | boolean | null)[];\n /** Whether no mapping entry names the member, so its value is its schema name. */\n readonly isImplicit: boolean;\n}\n\ntype JsonObject = Readonly<Record<string, unknown>>;\n\nconst COMPONENT_SCHEMAS = \"#/components/schemas/\";\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\ninterface Owner {\n readonly pointer: string;\n readonly propertyName: string;\n readonly mapping: Readonly<Record<string, string>>;\n readonly memberRefs: readonly string[];\n}\n\nfunction refsOf(list: unknown): string[] {\n return (Array.isArray(list) ? list : []).flatMap((item) =>\n isObject(item) && typeof item.$ref === \"string\" ? [item.$ref] : [],\n );\n}\n\nfunction mappingTarget(target: string): string {\n return target.startsWith(\"#\") ? target : `${COMPONENT_SCHEMAS}${escapePointerSegment(target)}`;\n}\n\nfunction ownerAt(node: JsonObject, pointer: () => string): Owner | null {\n const discriminator = node.discriminator;\n if (!isObject(discriminator) || typeof discriminator.propertyName !== \"string\") {\n return null;\n }\n const mapping = isObject(discriminator.mapping)\n ? (discriminator.mapping as Readonly<Record<string, string>>)\n : {};\n const mapped = Object.values(mapping)\n .filter((t) => typeof t === \"string\")\n .map(mappingTarget);\n const memberRefs = [...refsOf(node.oneOf), ...refsOf(node.anyOf), ...mapped];\n return { pointer: pointer(), propertyName: discriminator.propertyName, mapping, memberRefs };\n}\n\n/** A node of the document walk; the pointer is built only for the nodes that need it. */\ninterface Visit {\n readonly node: unknown;\n readonly key: string | null;\n readonly parent: Visit | null;\n}\n\nfunction pointerOf(visit: Visit): string {\n const segments: string[] = [];\n for (let current: Visit | null = visit; current?.key != null; current = current.parent) {\n segments.unshift(current.key);\n }\n return createRef(segments);\n}\n\nfunction childrenOf(visit: Visit): Visit[] {\n const { node } = visit;\n const entries: [string, unknown][] = Array.isArray(node)\n ? node.map((item, index) => [String(index), item])\n : isObject(node)\n ? Object.entries(node)\n : [];\n return entries.map(([key, child]) => ({ node: child, key, parent: visit }));\n}\n\n/**\n * Every Discriminator Object of the document, depth first, with its pointer. The walk keeps its\n * own stack, so a document nested past the call stack fails in the transform, as it did before.\n */\nfunction ownersIn(document: unknown): Owner[] {\n const found: Owner[] = [];\n const stack: Visit[] = [{ node: document, key: null, parent: null }];\n for (let visit = stack.pop(); visit !== undefined; visit = stack.pop()) {\n const owner = isObject(visit.node) ? ownerAt(visit.node, () => pointerOf(visit)) : null;\n if (owner !== null) {\n found.push(owner);\n }\n stack.push(...childrenOf(visit).reverse());\n }\n return found;\n}\n\n/** A member and the `$ref`s whose properties its type leaves out (`Omit` of its parents). */\ninterface Member {\n readonly ref: string;\n readonly skipped: ReadonlySet<string>;\n}\n\ninterface Child {\n readonly ref: string;\n readonly schema: JsonObject;\n}\n\n/** How the run types an `allOf` of a discriminated union. */\nexport interface ConflictOptions {\n /**\n * `allof-discriminated-union`: a schema that `allOf`s a union which does not contain it reuses\n * the union and gets no value, so neither it nor the schemas below it are members.\n */\n readonly isUnionReused: boolean;\n}\n\n/** What the search for conflicts reads: the document and its `allOf` children by parent. */\ninterface ConflictSearch extends ConflictOptions {\n readonly document: unknown;\n readonly children: ReadonlyMap<string, readonly Child[]>;\n}\n\n/** The `allOf` children of the owner that inherit its discriminator. */\nfunction inheritingChildren(owner: Owner, search: ConflictSearch): readonly Child[] {\n const children = search.children.get(owner.pointer) ?? [];\n const resolve = (ref: string) => resolveLocalRef(search.document, ref);\n const union = search.isUnionReused ? unionAt(owner.pointer, resolve) : undefined;\n return union === undefined\n ? children\n : children.filter((child) => isUnionMember(union, child.ref, resolve));\n}\n\n/** The component schemas whose `allOf` holds a `$ref`, by that `$ref`, in document order. */\nfunction allOfChildren(document: unknown): Map<string, Child[]> {\n const schemas = resolveLocalRef(document, \"#/components/schemas\");\n const children = new Map<string, Child[]>();\n for (const [name, schema] of Object.entries(isObject(schemas) ? schemas : {})) {\n if (!isObject(schema)) {\n continue;\n }\n const child = { ref: `${COMPONENT_SCHEMAS}${escapePointerSegment(name)}`, schema };\n for (const parent of new Set(refsOf(schema.allOf))) {\n const siblings = children.get(parent) ?? [];\n siblings.push(child);\n children.set(parent, siblings);\n }\n }\n return children;\n}\n\n/** Whether a schema defines a discriminator of the property itself: it is the owner below. */\nfunction ownsProperty(schema: JsonObject, propertyName: string): boolean {\n const discriminator = schema.discriminator;\n return isObject(discriminator) && discriminator.propertyName === propertyName;\n}\n\n/**\n * Component schemas that inherit the owner through `allOf`, also through a chain\n * (`Lion: { allOf: [Cat] }`, `Cat: { allOf: [Pet] }`). Each parent on the way is left out of the\n * member's values, as its type omits the property. A schema with its own discriminator of the\n * property is a member, but the schemas below it are its own members.\n */\nfunction inheritingMembers(owner: Owner, search: ConflictSearch): Member[] {\n const found: Member[] = [];\n const visited = new Set([owner.pointer]);\n const parents: Member[] = [{ ref: owner.pointer, skipped: new Set([owner.pointer]) }];\n for (let parent = parents.shift(); parent !== undefined; parent = parents.shift()) {\n const children =\n parent.ref === owner.pointer\n ? inheritingChildren(owner, search)\n : (search.children.get(parent.ref) ?? []);\n for (const child of children) {\n if (visited.has(child.ref)) {\n continue;\n }\n visited.add(child.ref);\n found.push({ ref: child.ref, skipped: parent.skipped });\n if (!ownsProperty(child.schema, owner.propertyName)) {\n parents.push({ ref: child.ref, skipped: new Set([...parent.skipped, child.ref]) });\n }\n }\n }\n return found;\n}\n\n/** The members of an owner, each once: the listed and mapped ones, then the inheriting ones. */\nfunction membersOf(owner: Owner, search: ConflictSearch): Member[] {\n const listed = owner.memberRefs.map((ref) => ({ ref, skipped: new Set([owner.pointer]) }));\n const members = new Map<string, Member>();\n for (const member of [...listed, ...inheritingMembers(owner, search)]) {\n if (!members.has(member.ref)) {\n members.set(member.ref, member);\n }\n }\n return [...members.values()];\n}\n\nfunction memberValues(owner: Owner, member: string): { values: string[]; isImplicit: boolean } {\n const values = Object.entries(owner.mapping)\n .filter(([, target]) => typeof target === \"string\" && mappingTarget(target) === member)\n .map(([key]) => key);\n const name = parseRefPointer(member).pop() ?? \"\";\n return values.length > 0 ? { values, isImplicit: false } : { values: [name], isImplicit: true };\n}\n\nfunction conflictOf(owner: Owner, { ref: member, skipped }: Member, document: unknown) {\n // The owner's own property is left out of an inheriting member's type (`Omit`).\n const allowed = admittedPropertyValues(\n resolveLocalRef(document, member),\n owner.propertyName,\n document,\n skipped,\n );\n const { values, isImplicit } = memberValues(owner, member);\n if (allowed === null || values.some((value) => allowed.has(value))) {\n return null;\n }\n const { pointer, propertyName } = owner;\n return { member, owner: pointer, propertyName, values, allowed: [...allowed], isImplicit };\n}\n\n/** The conflicts of the document, one per member and value list, in document order. */\nexport function findDiscriminatorValueConflicts(\n document: unknown,\n options: ConflictOptions = { isUnionReused: false },\n): readonly DiscriminatorValueConflict[] {\n const conflicts = new Map<string, DiscriminatorValueConflict>();\n const search = { ...options, document, children: allOfChildren(document) };\n for (const owner of ownersIn(document)) {\n for (const member of membersOf(owner, search)) {\n const conflict = conflictOf(owner, member, document);\n const key = JSON.stringify([member.ref, conflict?.propertyName, conflict?.values]);\n if (conflict !== null && !conflicts.has(key)) {\n conflicts.set(key, conflict);\n }\n }\n }\n return [...conflicts.values()];\n}\n"],"names":["escapePointerSegment","createRef","resolveLocalRef","unionAt","isUnionMember","parseRefPointer","admittedPropertyValues"],"mappings":"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"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { resolveLocalRef, admittedPropertyValues } from './admitted-values.mjs';
|
|
2
|
+
import { unionAt, isUnionMember } from './discriminated-union.mjs';
|
|
3
|
+
import { escapePointerSegment, parseRefPointer, createRef } from './json-pointer.mjs';
|
|
4
|
+
|
|
5
|
+
const COMPONENT_SCHEMAS = "#/components/schemas/";
|
|
6
|
+
function isObject(value) {
|
|
7
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
8
|
+
}
|
|
9
|
+
function refsOf(list) {
|
|
10
|
+
return (Array.isArray(list) ? list : []).flatMap(
|
|
11
|
+
(item) => isObject(item) && typeof item.$ref === "string" ? [item.$ref] : []
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
function mappingTarget(target) {
|
|
15
|
+
return target.startsWith("#") ? target : `${COMPONENT_SCHEMAS}${escapePointerSegment(target)}`;
|
|
16
|
+
}
|
|
17
|
+
function ownerAt(node, pointer) {
|
|
18
|
+
const discriminator = node.discriminator;
|
|
19
|
+
if (!isObject(discriminator) || typeof discriminator.propertyName !== "string") {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
const mapping = isObject(discriminator.mapping) ? discriminator.mapping : {};
|
|
23
|
+
const mapped = Object.values(mapping).filter((t) => typeof t === "string").map(mappingTarget);
|
|
24
|
+
const memberRefs = [...refsOf(node.oneOf), ...refsOf(node.anyOf), ...mapped];
|
|
25
|
+
return { pointer: pointer(), propertyName: discriminator.propertyName, mapping, memberRefs };
|
|
26
|
+
}
|
|
27
|
+
function pointerOf(visit) {
|
|
28
|
+
const segments = [];
|
|
29
|
+
for (let current = visit; current?.key != null; current = current.parent) {
|
|
30
|
+
segments.unshift(current.key);
|
|
31
|
+
}
|
|
32
|
+
return createRef(segments);
|
|
33
|
+
}
|
|
34
|
+
function childrenOf(visit) {
|
|
35
|
+
const { node } = visit;
|
|
36
|
+
const entries = Array.isArray(node) ? node.map((item, index) => [String(index), item]) : isObject(node) ? Object.entries(node) : [];
|
|
37
|
+
return entries.map(([key, child]) => ({ node: child, key, parent: visit }));
|
|
38
|
+
}
|
|
39
|
+
function ownersIn(document) {
|
|
40
|
+
const found = [];
|
|
41
|
+
const stack = [{ node: document, key: null, parent: null }];
|
|
42
|
+
for (let visit = stack.pop(); visit !== void 0; visit = stack.pop()) {
|
|
43
|
+
const owner = isObject(visit.node) ? ownerAt(visit.node, () => pointerOf(visit)) : null;
|
|
44
|
+
if (owner !== null) {
|
|
45
|
+
found.push(owner);
|
|
46
|
+
}
|
|
47
|
+
stack.push(...childrenOf(visit).reverse());
|
|
48
|
+
}
|
|
49
|
+
return found;
|
|
50
|
+
}
|
|
51
|
+
function inheritingChildren(owner, search) {
|
|
52
|
+
const children = search.children.get(owner.pointer) ?? [];
|
|
53
|
+
const resolve = (ref) => resolveLocalRef(search.document, ref);
|
|
54
|
+
const union = search.isUnionReused ? unionAt(owner.pointer, resolve) : void 0;
|
|
55
|
+
return union === void 0 ? children : children.filter((child) => isUnionMember(union, child.ref, resolve));
|
|
56
|
+
}
|
|
57
|
+
function allOfChildren(document) {
|
|
58
|
+
const schemas = resolveLocalRef(document, "#/components/schemas");
|
|
59
|
+
const children = /* @__PURE__ */ new Map();
|
|
60
|
+
for (const [name, schema] of Object.entries(isObject(schemas) ? schemas : {})) {
|
|
61
|
+
if (!isObject(schema)) {
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
const child = { ref: `${COMPONENT_SCHEMAS}${escapePointerSegment(name)}`, schema };
|
|
65
|
+
for (const parent of new Set(refsOf(schema.allOf))) {
|
|
66
|
+
const siblings = children.get(parent) ?? [];
|
|
67
|
+
siblings.push(child);
|
|
68
|
+
children.set(parent, siblings);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return children;
|
|
72
|
+
}
|
|
73
|
+
function ownsProperty(schema, propertyName) {
|
|
74
|
+
const discriminator = schema.discriminator;
|
|
75
|
+
return isObject(discriminator) && discriminator.propertyName === propertyName;
|
|
76
|
+
}
|
|
77
|
+
function inheritingMembers(owner, search) {
|
|
78
|
+
const found = [];
|
|
79
|
+
const visited = /* @__PURE__ */ new Set([owner.pointer]);
|
|
80
|
+
const parents = [{ ref: owner.pointer, skipped: /* @__PURE__ */ new Set([owner.pointer]) }];
|
|
81
|
+
for (let parent = parents.shift(); parent !== void 0; parent = parents.shift()) {
|
|
82
|
+
const children = parent.ref === owner.pointer ? inheritingChildren(owner, search) : search.children.get(parent.ref) ?? [];
|
|
83
|
+
for (const child of children) {
|
|
84
|
+
if (visited.has(child.ref)) {
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
visited.add(child.ref);
|
|
88
|
+
found.push({ ref: child.ref, skipped: parent.skipped });
|
|
89
|
+
if (!ownsProperty(child.schema, owner.propertyName)) {
|
|
90
|
+
parents.push({ ref: child.ref, skipped: /* @__PURE__ */ new Set([...parent.skipped, child.ref]) });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return found;
|
|
95
|
+
}
|
|
96
|
+
function membersOf(owner, search) {
|
|
97
|
+
const listed = owner.memberRefs.map((ref) => ({ ref, skipped: /* @__PURE__ */ new Set([owner.pointer]) }));
|
|
98
|
+
const members = /* @__PURE__ */ new Map();
|
|
99
|
+
for (const member of [...listed, ...inheritingMembers(owner, search)]) {
|
|
100
|
+
if (!members.has(member.ref)) {
|
|
101
|
+
members.set(member.ref, member);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return [...members.values()];
|
|
105
|
+
}
|
|
106
|
+
function memberValues(owner, member) {
|
|
107
|
+
const values = Object.entries(owner.mapping).filter(([, target]) => typeof target === "string" && mappingTarget(target) === member).map(([key]) => key);
|
|
108
|
+
const name = parseRefPointer(member).pop() ?? "";
|
|
109
|
+
return values.length > 0 ? { values, isImplicit: false } : { values: [name], isImplicit: true };
|
|
110
|
+
}
|
|
111
|
+
function conflictOf(owner, { ref: member, skipped }, document) {
|
|
112
|
+
const allowed = admittedPropertyValues(
|
|
113
|
+
resolveLocalRef(document, member),
|
|
114
|
+
owner.propertyName,
|
|
115
|
+
document,
|
|
116
|
+
skipped
|
|
117
|
+
);
|
|
118
|
+
const { values, isImplicit } = memberValues(owner, member);
|
|
119
|
+
if (allowed === null || values.some((value) => allowed.has(value))) {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
const { pointer, propertyName } = owner;
|
|
123
|
+
return { member, owner: pointer, propertyName, values, allowed: [...allowed], isImplicit };
|
|
124
|
+
}
|
|
125
|
+
function findDiscriminatorValueConflicts(document, options = { isUnionReused: false }) {
|
|
126
|
+
const conflicts = /* @__PURE__ */ new Map();
|
|
127
|
+
const search = { ...options, document, children: allOfChildren(document) };
|
|
128
|
+
for (const owner of ownersIn(document)) {
|
|
129
|
+
for (const member of membersOf(owner, search)) {
|
|
130
|
+
const conflict = conflictOf(owner, member, document);
|
|
131
|
+
const key = JSON.stringify([member.ref, conflict?.propertyName, conflict?.values]);
|
|
132
|
+
if (conflict !== null && !conflicts.has(key)) {
|
|
133
|
+
conflicts.set(key, conflict);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return [...conflicts.values()];
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export { findDiscriminatorValueConflicts };
|
|
141
|
+
//# sourceMappingURL=discriminator-conflicts.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discriminator-conflicts.mjs","sources":["../../../src/domain/openapi/discriminator-conflicts.ts"],"sourcesContent":["import { admittedPropertyValues, resolveLocalRef } from \"./admitted-values.js\";\nimport { isUnionMember, unionAt } from \"./discriminated-union.js\";\nimport { createRef, escapePointerSegment, parseRefPointer } from \"./json-pointer.js\";\n\n/**\n * Discriminator members whose discriminator value their own property does not allow. By the\n * Discriminator Object rule, a member that no `mapping` entry names has its schema name as the\n * value, so with a property `enum` (or `const`) that does not list it no value of the member\n * matches, and where the generator adds the value to the member the property type is `never`.\n * Each one gets a warning (CODING_PRINCIPLES §8.7).\n */\n\nexport interface DiscriminatorValueConflict {\n /** The member schema, such as `#/components/schemas/EpisodeObject`. */\n readonly member: string;\n /** The schema that has the Discriminator Object. */\n readonly owner: string;\n readonly propertyName: string;\n /** The values the discriminator gives the member: its mapping keys, or its name. */\n readonly values: readonly string[];\n /** The values the member's property allows. */\n readonly allowed: readonly (string | number | boolean | null)[];\n /** Whether no mapping entry names the member, so its value is its schema name. */\n readonly isImplicit: boolean;\n}\n\ntype JsonObject = Readonly<Record<string, unknown>>;\n\nconst COMPONENT_SCHEMAS = \"#/components/schemas/\";\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\ninterface Owner {\n readonly pointer: string;\n readonly propertyName: string;\n readonly mapping: Readonly<Record<string, string>>;\n readonly memberRefs: readonly string[];\n}\n\nfunction refsOf(list: unknown): string[] {\n return (Array.isArray(list) ? list : []).flatMap((item) =>\n isObject(item) && typeof item.$ref === \"string\" ? [item.$ref] : [],\n );\n}\n\nfunction mappingTarget(target: string): string {\n return target.startsWith(\"#\") ? target : `${COMPONENT_SCHEMAS}${escapePointerSegment(target)}`;\n}\n\nfunction ownerAt(node: JsonObject, pointer: () => string): Owner | null {\n const discriminator = node.discriminator;\n if (!isObject(discriminator) || typeof discriminator.propertyName !== \"string\") {\n return null;\n }\n const mapping = isObject(discriminator.mapping)\n ? (discriminator.mapping as Readonly<Record<string, string>>)\n : {};\n const mapped = Object.values(mapping)\n .filter((t) => typeof t === \"string\")\n .map(mappingTarget);\n const memberRefs = [...refsOf(node.oneOf), ...refsOf(node.anyOf), ...mapped];\n return { pointer: pointer(), propertyName: discriminator.propertyName, mapping, memberRefs };\n}\n\n/** A node of the document walk; the pointer is built only for the nodes that need it. */\ninterface Visit {\n readonly node: unknown;\n readonly key: string | null;\n readonly parent: Visit | null;\n}\n\nfunction pointerOf(visit: Visit): string {\n const segments: string[] = [];\n for (let current: Visit | null = visit; current?.key != null; current = current.parent) {\n segments.unshift(current.key);\n }\n return createRef(segments);\n}\n\nfunction childrenOf(visit: Visit): Visit[] {\n const { node } = visit;\n const entries: [string, unknown][] = Array.isArray(node)\n ? node.map((item, index) => [String(index), item])\n : isObject(node)\n ? Object.entries(node)\n : [];\n return entries.map(([key, child]) => ({ node: child, key, parent: visit }));\n}\n\n/**\n * Every Discriminator Object of the document, depth first, with its pointer. The walk keeps its\n * own stack, so a document nested past the call stack fails in the transform, as it did before.\n */\nfunction ownersIn(document: unknown): Owner[] {\n const found: Owner[] = [];\n const stack: Visit[] = [{ node: document, key: null, parent: null }];\n for (let visit = stack.pop(); visit !== undefined; visit = stack.pop()) {\n const owner = isObject(visit.node) ? ownerAt(visit.node, () => pointerOf(visit)) : null;\n if (owner !== null) {\n found.push(owner);\n }\n stack.push(...childrenOf(visit).reverse());\n }\n return found;\n}\n\n/** A member and the `$ref`s whose properties its type leaves out (`Omit` of its parents). */\ninterface Member {\n readonly ref: string;\n readonly skipped: ReadonlySet<string>;\n}\n\ninterface Child {\n readonly ref: string;\n readonly schema: JsonObject;\n}\n\n/** How the run types an `allOf` of a discriminated union. */\nexport interface ConflictOptions {\n /**\n * `allof-discriminated-union`: a schema that `allOf`s a union which does not contain it reuses\n * the union and gets no value, so neither it nor the schemas below it are members.\n */\n readonly isUnionReused: boolean;\n}\n\n/** What the search for conflicts reads: the document and its `allOf` children by parent. */\ninterface ConflictSearch extends ConflictOptions {\n readonly document: unknown;\n readonly children: ReadonlyMap<string, readonly Child[]>;\n}\n\n/** The `allOf` children of the owner that inherit its discriminator. */\nfunction inheritingChildren(owner: Owner, search: ConflictSearch): readonly Child[] {\n const children = search.children.get(owner.pointer) ?? [];\n const resolve = (ref: string) => resolveLocalRef(search.document, ref);\n const union = search.isUnionReused ? unionAt(owner.pointer, resolve) : undefined;\n return union === undefined\n ? children\n : children.filter((child) => isUnionMember(union, child.ref, resolve));\n}\n\n/** The component schemas whose `allOf` holds a `$ref`, by that `$ref`, in document order. */\nfunction allOfChildren(document: unknown): Map<string, Child[]> {\n const schemas = resolveLocalRef(document, \"#/components/schemas\");\n const children = new Map<string, Child[]>();\n for (const [name, schema] of Object.entries(isObject(schemas) ? schemas : {})) {\n if (!isObject(schema)) {\n continue;\n }\n const child = { ref: `${COMPONENT_SCHEMAS}${escapePointerSegment(name)}`, schema };\n for (const parent of new Set(refsOf(schema.allOf))) {\n const siblings = children.get(parent) ?? [];\n siblings.push(child);\n children.set(parent, siblings);\n }\n }\n return children;\n}\n\n/** Whether a schema defines a discriminator of the property itself: it is the owner below. */\nfunction ownsProperty(schema: JsonObject, propertyName: string): boolean {\n const discriminator = schema.discriminator;\n return isObject(discriminator) && discriminator.propertyName === propertyName;\n}\n\n/**\n * Component schemas that inherit the owner through `allOf`, also through a chain\n * (`Lion: { allOf: [Cat] }`, `Cat: { allOf: [Pet] }`). Each parent on the way is left out of the\n * member's values, as its type omits the property. A schema with its own discriminator of the\n * property is a member, but the schemas below it are its own members.\n */\nfunction inheritingMembers(owner: Owner, search: ConflictSearch): Member[] {\n const found: Member[] = [];\n const visited = new Set([owner.pointer]);\n const parents: Member[] = [{ ref: owner.pointer, skipped: new Set([owner.pointer]) }];\n for (let parent = parents.shift(); parent !== undefined; parent = parents.shift()) {\n const children =\n parent.ref === owner.pointer\n ? inheritingChildren(owner, search)\n : (search.children.get(parent.ref) ?? []);\n for (const child of children) {\n if (visited.has(child.ref)) {\n continue;\n }\n visited.add(child.ref);\n found.push({ ref: child.ref, skipped: parent.skipped });\n if (!ownsProperty(child.schema, owner.propertyName)) {\n parents.push({ ref: child.ref, skipped: new Set([...parent.skipped, child.ref]) });\n }\n }\n }\n return found;\n}\n\n/** The members of an owner, each once: the listed and mapped ones, then the inheriting ones. */\nfunction membersOf(owner: Owner, search: ConflictSearch): Member[] {\n const listed = owner.memberRefs.map((ref) => ({ ref, skipped: new Set([owner.pointer]) }));\n const members = new Map<string, Member>();\n for (const member of [...listed, ...inheritingMembers(owner, search)]) {\n if (!members.has(member.ref)) {\n members.set(member.ref, member);\n }\n }\n return [...members.values()];\n}\n\nfunction memberValues(owner: Owner, member: string): { values: string[]; isImplicit: boolean } {\n const values = Object.entries(owner.mapping)\n .filter(([, target]) => typeof target === \"string\" && mappingTarget(target) === member)\n .map(([key]) => key);\n const name = parseRefPointer(member).pop() ?? \"\";\n return values.length > 0 ? { values, isImplicit: false } : { values: [name], isImplicit: true };\n}\n\nfunction conflictOf(owner: Owner, { ref: member, skipped }: Member, document: unknown) {\n // The owner's own property is left out of an inheriting member's type (`Omit`).\n const allowed = admittedPropertyValues(\n resolveLocalRef(document, member),\n owner.propertyName,\n document,\n skipped,\n );\n const { values, isImplicit } = memberValues(owner, member);\n if (allowed === null || values.some((value) => allowed.has(value))) {\n return null;\n }\n const { pointer, propertyName } = owner;\n return { member, owner: pointer, propertyName, values, allowed: [...allowed], isImplicit };\n}\n\n/** The conflicts of the document, one per member and value list, in document order. */\nexport function findDiscriminatorValueConflicts(\n document: unknown,\n options: ConflictOptions = { isUnionReused: false },\n): readonly DiscriminatorValueConflict[] {\n const conflicts = new Map<string, DiscriminatorValueConflict>();\n const search = { ...options, document, children: allOfChildren(document) };\n for (const owner of ownersIn(document)) {\n for (const member of membersOf(owner, search)) {\n const conflict = conflictOf(owner, member, document);\n const key = JSON.stringify([member.ref, conflict?.propertyName, conflict?.values]);\n if (conflict !== null && !conflicts.has(key)) {\n conflicts.set(key, conflict);\n }\n }\n }\n return [...conflicts.values()];\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function parseRefPointer(ref) {
|
|
4
|
+
const [, pointer = ""] = ref.split("#/");
|
|
5
|
+
return pointer.split("/").map(unescapePointerSegment).filter((segment) => segment.length > 0);
|
|
6
|
+
}
|
|
7
|
+
function unescapePointerSegment(segment) {
|
|
8
|
+
return decodeURIComponent(segment.replaceAll("~1", "/").replaceAll("~0", "~"));
|
|
9
|
+
}
|
|
10
|
+
function escapePointerSegment(segment) {
|
|
11
|
+
return segment.replaceAll("~", "~0").replaceAll("/", "~1").replaceAll("%", "%25");
|
|
12
|
+
}
|
|
13
|
+
function createRef(parts) {
|
|
14
|
+
let ref = "#";
|
|
15
|
+
for (const part of parts) {
|
|
16
|
+
if (part === void 0 || part === null || part === "") {
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
const text = String(part);
|
|
20
|
+
const segments = parseRefPointer(text);
|
|
21
|
+
for (const segment of segments.length > 0 ? segments : [text]) {
|
|
22
|
+
ref += `/${escapePointerSegment(segment)}`;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return ref;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
exports.createRef = createRef;
|
|
29
|
+
exports.escapePointerSegment = escapePointerSegment;
|
|
30
|
+
exports.parseRefPointer = parseRefPointer;
|
|
31
|
+
//# sourceMappingURL=json-pointer.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-pointer.cjs","sources":["../../../src/domain/openapi/json-pointer.ts"],"sourcesContent":["/**\n * The JSON Pointer of a `$ref` as path segments, with the semantics of Redocly's `parseRef`, which\n * the original generator used: the part after the first `#/`, split at `/`, each segment unescaped\n * (`~1` → `/`, `~0` → `~`, then percent-decoding), and empty segments dropped.\n *\n * Throws URIError for a malformed percent escape, as the original does.\n */\nexport function parseRefPointer(ref: string): string[] {\n const [, pointer = \"\"] = ref.split(\"#/\");\n return pointer\n .split(\"/\")\n .map(unescapePointerSegment)\n .filter((segment) => segment.length > 0);\n}\n\nfunction unescapePointerSegment(segment: string): string {\n return decodeURIComponent(segment.replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\"));\n}\n\n/**\n * Escape one segment for a JSON Pointer in a `$ref` fragment: `~` → `~0`, `/` → `~1`, and `%` →\n * `%25`, because reading a pointer back percent-decodes it. The original did not escape `%`, so a\n * name like `50%` threw URIError and `a%2Fb` read back as `a/b` (upstream #2251, #2828).\n */\nexport function escapePointerSegment(segment: string): string {\n return segment.replaceAll(\"~\", \"~0\").replaceAll(\"/\", \"~1\").replaceAll(\"%\", \"%25\");\n}\n\n/**\n * Join parts into a local `$ref` (the original `createRef`). Empty parts are skipped. A part that\n * is itself a `$ref` contributes its segments; any other part is one segment.\n */\nexport function createRef(parts: readonly (string | number | null | undefined)[]): string {\n let ref = \"#\";\n for (const part of parts) {\n if (part === undefined || part === null || part === \"\") {\n continue;\n }\n const text = String(part);\n const segments = parseRefPointer(text);\n for (const segment of segments.length > 0 ? segments : [text]) {\n ref += `/${escapePointerSegment(segment)}`;\n }\n }\n return ref;\n}\n"],"names":[],"mappings":";;AAOO,SAAS,gBAAgB,GAAA,EAAuB;AACrD,EAAA,MAAM,GAAG,OAAA,GAAU,EAAE,CAAA,GAAI,GAAA,CAAI,MAAM,IAAI,CAAA;AACvC,EAAA,OAAO,OAAA,CACJ,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,sBAAsB,CAAA,CAC1B,MAAA,CAAO,CAAC,OAAA,KAAY,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAC3C;AAEA,SAAS,uBAAuB,OAAA,EAAyB;AACvD,EAAA,OAAO,kBAAA,CAAmB,QAAQ,UAAA,CAAW,IAAA,EAAM,GAAG,CAAA,CAAE,UAAA,CAAW,IAAA,EAAM,GAAG,CAAC,CAAA;AAC/E;AAOO,SAAS,qBAAqB,OAAA,EAAyB;AAC5D,EAAA,OAAO,OAAA,CAAQ,UAAA,CAAW,GAAA,EAAK,IAAI,CAAA,CAAE,UAAA,CAAW,GAAA,EAAK,IAAI,CAAA,CAAE,UAAA,CAAW,GAAA,EAAK,KAAK,CAAA;AAClF;AAMO,SAAS,UAAU,KAAA,EAAgE;AACxF,EAAA,IAAI,GAAA,GAAM,GAAA;AACV,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,IAAA,IAAQ,SAAS,EAAA,EAAI;AACtD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,OAAO,IAAI,CAAA;AACxB,IAAA,MAAM,QAAA,GAAW,gBAAgB,IAAI,CAAA;AACrC,IAAA,KAAA,MAAW,WAAW,QAAA,CAAS,MAAA,GAAS,IAAI,QAAA,GAAW,CAAC,IAAI,CAAA,EAAG;AAC7D,MAAA,GAAA,IAAO,CAAA,CAAA,EAAI,oBAAA,CAAqB,OAAO,CAAC,CAAA,CAAA;AAAA,IAC1C;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;;;;"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
function parseRefPointer(ref) {
|
|
2
|
+
const [, pointer = ""] = ref.split("#/");
|
|
3
|
+
return pointer.split("/").map(unescapePointerSegment).filter((segment) => segment.length > 0);
|
|
4
|
+
}
|
|
5
|
+
function unescapePointerSegment(segment) {
|
|
6
|
+
return decodeURIComponent(segment.replaceAll("~1", "/").replaceAll("~0", "~"));
|
|
7
|
+
}
|
|
8
|
+
function escapePointerSegment(segment) {
|
|
9
|
+
return segment.replaceAll("~", "~0").replaceAll("/", "~1").replaceAll("%", "%25");
|
|
10
|
+
}
|
|
11
|
+
function createRef(parts) {
|
|
12
|
+
let ref = "#";
|
|
13
|
+
for (const part of parts) {
|
|
14
|
+
if (part === void 0 || part === null || part === "") {
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
const text = String(part);
|
|
18
|
+
const segments = parseRefPointer(text);
|
|
19
|
+
for (const segment of segments.length > 0 ? segments : [text]) {
|
|
20
|
+
ref += `/${escapePointerSegment(segment)}`;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return ref;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export { createRef, escapePointerSegment, parseRefPointer };
|
|
27
|
+
//# sourceMappingURL=json-pointer.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-pointer.mjs","sources":["../../../src/domain/openapi/json-pointer.ts"],"sourcesContent":["/**\n * The JSON Pointer of a `$ref` as path segments, with the semantics of Redocly's `parseRef`, which\n * the original generator used: the part after the first `#/`, split at `/`, each segment unescaped\n * (`~1` → `/`, `~0` → `~`, then percent-decoding), and empty segments dropped.\n *\n * Throws URIError for a malformed percent escape, as the original does.\n */\nexport function parseRefPointer(ref: string): string[] {\n const [, pointer = \"\"] = ref.split(\"#/\");\n return pointer\n .split(\"/\")\n .map(unescapePointerSegment)\n .filter((segment) => segment.length > 0);\n}\n\nfunction unescapePointerSegment(segment: string): string {\n return decodeURIComponent(segment.replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\"));\n}\n\n/**\n * Escape one segment for a JSON Pointer in a `$ref` fragment: `~` → `~0`, `/` → `~1`, and `%` →\n * `%25`, because reading a pointer back percent-decodes it. The original did not escape `%`, so a\n * name like `50%` threw URIError and `a%2Fb` read back as `a/b` (upstream #2251, #2828).\n */\nexport function escapePointerSegment(segment: string): string {\n return segment.replaceAll(\"~\", \"~0\").replaceAll(\"/\", \"~1\").replaceAll(\"%\", \"%25\");\n}\n\n/**\n * Join parts into a local `$ref` (the original `createRef`). Empty parts are skipped. A part that\n * is itself a `$ref` contributes its segments; any other part is one segment.\n */\nexport function createRef(parts: readonly (string | number | null | undefined)[]): string {\n let ref = \"#\";\n for (const part of parts) {\n if (part === undefined || part === null || part === \"\") {\n continue;\n }\n const text = String(part);\n const segments = parseRefPointer(text);\n for (const segment of segments.length > 0 ? segments : [text]) {\n ref += `/${escapePointerSegment(segment)}`;\n }\n }\n return ref;\n}\n"],"names":[],"mappings":"AAOO,SAAS,gBAAgB,GAAA,EAAuB;AACrD,EAAA,MAAM,GAAG,OAAA,GAAU,EAAE,CAAA,GAAI,GAAA,CAAI,MAAM,IAAI,CAAA;AACvC,EAAA,OAAO,OAAA,CACJ,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,sBAAsB,CAAA,CAC1B,MAAA,CAAO,CAAC,OAAA,KAAY,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAC3C;AAEA,SAAS,uBAAuB,OAAA,EAAyB;AACvD,EAAA,OAAO,kBAAA,CAAmB,QAAQ,UAAA,CAAW,IAAA,EAAM,GAAG,CAAA,CAAE,UAAA,CAAW,IAAA,EAAM,GAAG,CAAC,CAAA;AAC/E;AAOO,SAAS,qBAAqB,OAAA,EAAyB;AAC5D,EAAA,OAAO,OAAA,CAAQ,UAAA,CAAW,GAAA,EAAK,IAAI,CAAA,CAAE,UAAA,CAAW,GAAA,EAAK,IAAI,CAAA,CAAE,UAAA,CAAW,GAAA,EAAK,KAAK,CAAA;AAClF;AAMO,SAAS,UAAU,KAAA,EAAgE;AACxF,EAAA,IAAI,GAAA,GAAM,GAAA;AACV,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,IAAA,IAAQ,SAAS,EAAA,EAAI;AACtD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,OAAO,IAAI,CAAA;AACxB,IAAA,MAAM,QAAA,GAAW,gBAAgB,IAAI,CAAA;AACrC,IAAA,KAAA,MAAW,WAAW,QAAA,CAAS,MAAA,GAAS,IAAI,QAAA,GAAW,CAAC,IAAI,CAAA,EAAG;AAC7D,MAAA,GAAA,IAAO,CAAA,CAAA,EAAI,oBAAA,CAAqB,OAAO,CAAC,CAAA,CAAA;AAAA,IAC1C;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const jsonPointer = require('./json-pointer.cjs');
|
|
4
|
+
|
|
5
|
+
const COMPONENTS_SEGMENT = "components";
|
|
6
|
+
const MEDIA_TYPES_COMPONENT_KIND = "mediaTypes";
|
|
7
|
+
function isMediaTypeComponentRef(ref) {
|
|
8
|
+
const [root, kind] = jsonPointer.parseRefPointer(ref);
|
|
9
|
+
return ref.startsWith("#/") && root === COMPONENTS_SEGMENT && kind === MEDIA_TYPES_COMPONENT_KIND;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
exports.MEDIA_TYPES_COMPONENT_KIND = MEDIA_TYPES_COMPONENT_KIND;
|
|
13
|
+
exports.isMediaTypeComponentRef = isMediaTypeComponentRef;
|
|
14
|
+
//# sourceMappingURL=media-type-object.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-type-object.cjs","sources":["../../../src/domain/openapi/media-type-object.ts"],"sourcesContent":["import { parseRefPointer } from \"./json-pointer.js\";\nimport type { ReferenceSchema, Schema } from \"./schema-object.js\";\n\n/** The parts of a Media Type Object the generator reads (OpenAPI 3.2 §4.8.14). */\nexport interface MediaTypeObject {\n /** The complete content. */\n readonly schema?: Schema;\n /** Each item of a sequential media type such as `application/jsonl` (OpenAPI 3.2). */\n readonly itemSchema?: Schema;\n}\n\n/** A `content` map: media type name to a Media Type Object or a `$ref` to one. */\nexport type ContentMap = Readonly<Record<string, MediaTypeObject | ReferenceSchema>>;\n\nconst COMPONENTS_SEGMENT = \"components\";\n/** The OpenAPI 3.2 component map of reusable Media Type Objects. */\nexport const MEDIA_TYPES_COMPONENT_KIND = \"mediaTypes\";\n\n/**\n * Whether a `content` entry's `$ref` points into `components.mediaTypes` (OpenAPI 3.2). Other\n * `$ref`s in `content` keep the output they had before 3.2 (ADR-020).\n */\nexport function isMediaTypeComponentRef(ref: string): boolean {\n const [root, kind] = parseRefPointer(ref);\n return ref.startsWith(\"#/\") && root === COMPONENTS_SEGMENT && kind === MEDIA_TYPES_COMPONENT_KIND;\n}\n"],"names":["parseRefPointer"],"mappings":";;;;AAcA,MAAM,kBAAA,GAAqB,YAAA;AAEpB,MAAM,0BAAA,GAA6B;AAMnC,SAAS,wBAAwB,GAAA,EAAsB;AAC5D,EAAA,MAAM,CAAC,IAAA,EAAM,IAAI,CAAA,GAAIA,4BAAgB,GAAG,CAAA;AACxC,EAAA,OAAO,IAAI,UAAA,CAAW,IAAI,CAAA,IAAK,IAAA,KAAS,sBAAsB,IAAA,KAAS,0BAAA;AACzE;;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { parseRefPointer } from './json-pointer.mjs';
|
|
2
|
+
|
|
3
|
+
const COMPONENTS_SEGMENT = "components";
|
|
4
|
+
const MEDIA_TYPES_COMPONENT_KIND = "mediaTypes";
|
|
5
|
+
function isMediaTypeComponentRef(ref) {
|
|
6
|
+
const [root, kind] = parseRefPointer(ref);
|
|
7
|
+
return ref.startsWith("#/") && root === COMPONENTS_SEGMENT && kind === MEDIA_TYPES_COMPONENT_KIND;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export { MEDIA_TYPES_COMPONENT_KIND, isMediaTypeComponentRef };
|
|
11
|
+
//# sourceMappingURL=media-type-object.mjs.map
|