openapi-typesafe 0.0.0 → 1.0.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +42 -0
- package/dist/adapters/redocly-loader/redocly-config-source.cjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-config-source.mjs +35 -0
- package/dist/adapters/redocly-loader/redocly-config-source.mjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +169 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +167 -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 +145 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs +139 -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 +204 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.mjs +201 -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-enum.cjs +44 -0
- package/dist/api/discriminator-enum.cjs.map +1 -0
- package/dist/api/discriminator-enum.mjs +42 -0
- package/dist/api/discriminator-enum.mjs.map +1 -0
- package/dist/api/discriminator-scan.cjs +168 -0
- package/dist/api/discriminator-scan.cjs.map +1 -0
- package/dist/api/discriminator-scan.mjs +165 -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 +107 -0
- package/dist/api/document-run.cjs.map +1 -0
- package/dist/api/document-run.mjs +101 -0
- package/dist/api/document-run.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/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 +82 -0
- package/dist/api/transform-context.cjs.map +1 -0
- package/dist/api/transform-context.mjs +65 -0
- package/dist/api/transform-context.mjs.map +1 -0
- package/dist/api/transform-schema.cjs +31 -0
- package/dist/api/transform-schema.cjs.map +1 -0
- package/dist/api/transform-schema.mjs +26 -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 +17 -0
- package/dist/api/unsupported-feature-warnings.cjs.map +1 -0
- package/dist/api/unsupported-feature-warnings.mjs +15 -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 +214 -0
- package/dist/application/print/type-printer.cjs.map +1 -0
- package/dist/application/print/type-printer.mjs +210 -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/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/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 +86 -0
- package/dist/application/transform/document/document.cjs.map +1 -0
- package/dist/application/transform/document/document.mjs +83 -0
- package/dist/application/transform/document/document.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/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 +114 -0
- package/dist/application/transform/document/parameters.cjs.map +1 -0
- package/dist/application/transform/document/parameters.mjs +112 -0
- package/dist/application/transform/document/parameters.mjs.map +1 -0
- package/dist/application/transform/document/path-item-conflicts.cjs +51 -0
- package/dist/application/transform/document/path-item-conflicts.cjs.map +1 -0
- package/dist/application/transform/document/path-item-conflicts.mjs +49 -0
- package/dist/application/transform/document/path-item-conflicts.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 +57 -0
- package/dist/application/transform/document/path-key-overlaps.cjs.map +1 -0
- package/dist/application/transform/document/path-key-overlaps.mjs +55 -0
- package/dist/application/transform/document/path-key-overlaps.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 +127 -0
- package/dist/application/transform/document/paths.cjs.map +1 -0
- package/dist/application/transform/document/paths.mjs +125 -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 +69 -0
- package/dist/application/transform/document/root-type-aliases.cjs.map +1 -0
- package/dist/application/transform/document/root-type-aliases.mjs +65 -0
- package/dist/application/transform/document/root-type-aliases.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 +88 -0
- package/dist/application/transform/footer/document-footer.cjs.map +1 -0
- package/dist/application/transform/footer/document-footer.mjs +86 -0
- package/dist/application/transform/footer/document-footer.mjs.map +1 -0
- package/dist/application/transform/footer/enum-naming.cjs +121 -0
- package/dist/application/transform/footer/enum-naming.cjs.map +1 -0
- package/dist/application/transform/footer/enum-naming.mjs +115 -0
- package/dist/application/transform/footer/enum-naming.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-type.cjs +57 -0
- package/dist/application/transform/ref-type.cjs.map +1 -0
- package/dist/application/transform/ref-type.mjs +54 -0
- package/dist/application/transform/ref-type.mjs.map +1 -0
- package/dist/application/transform/schema/array-type.cjs +105 -0
- package/dist/application/transform/schema/array-type.cjs.map +1 -0
- package/dist/application/transform/schema/array-type.mjs +103 -0
- package/dist/application/transform/schema/array-type.mjs.map +1 -0
- package/dist/application/transform/schema/composition-type.cjs +107 -0
- package/dist/application/transform/schema/composition-type.cjs.map +1 -0
- package/dist/application/transform/schema/composition-type.mjs +105 -0
- package/dist/application/transform/schema/composition-type.mjs.map +1 -0
- package/dist/application/transform/schema/core-type.cjs +84 -0
- package/dist/application/transform/schema/core-type.cjs.map +1 -0
- package/dist/application/transform/schema/core-type.mjs +82 -0
- package/dist/application/transform/schema/core-type.mjs.map +1 -0
- package/dist/application/transform/schema/discriminator-property.cjs +21 -0
- package/dist/application/transform/schema/discriminator-property.cjs.map +1 -0
- package/dist/application/transform/schema/discriminator-property.mjs +19 -0
- package/dist/application/transform/schema/discriminator-property.mjs.map +1 -0
- package/dist/application/transform/schema/enum-rule.cjs +107 -0
- package/dist/application/transform/schema/enum-rule.cjs.map +1 -0
- package/dist/application/transform/schema/enum-rule.mjs +105 -0
- package/dist/application/transform/schema/enum-rule.mjs.map +1 -0
- package/dist/application/transform/schema/object-type.cjs +173 -0
- package/dist/application/transform/schema/object-type.cjs.map +1 -0
- package/dist/application/transform/schema/object-type.mjs +170 -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/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 +84 -0
- package/dist/application/transform/schema-comment.cjs.map +1 -0
- package/dist/application/transform/schema-comment.mjs +81 -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 +137 -0
- package/dist/cli/cli-arguments.cjs.map +1 -0
- package/dist/cli/cli-arguments.mjs +129 -0
- package/dist/cli/cli-arguments.mjs.map +1 -0
- package/dist/cli/cli-errors.cjs +80 -0
- package/dist/cli/cli-errors.cjs.map +1 -0
- package/dist/cli/cli-errors.mjs +76 -0
- package/dist/cli/cli-errors.mjs.map +1 -0
- package/dist/cli/cli-output.cjs +37 -0
- package/dist/cli/cli-output.cjs.map +1 -0
- package/dist/cli/cli-output.mjs +30 -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 +62 -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 +54 -0
- package/dist/cli/main.mjs.map +1 -0
- package/dist/cli/redocly-apis.cjs +65 -0
- package/dist/cli/redocly-apis.cjs.map +1 -0
- package/dist/cli/redocly-apis.mjs +62 -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 +100 -0
- package/dist/cli/run-cli.cjs.map +1 -0
- package/dist/cli/run-cli.mjs +98 -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 +50 -0
- package/dist/domain/errors.cjs.map +1 -0
- package/dist/domain/errors.mjs +46 -0
- package/dist/domain/errors.mjs.map +1 -0
- package/dist/domain/ir/constructors.cjs +89 -0
- package/dist/domain/ir/constructors.cjs.map +1 -0
- package/dist/domain/ir/constructors.mjs +71 -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/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/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/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 +66 -0
- package/dist/domain/output-fixes.cjs.map +1 -0
- package/dist/domain/output-fixes.mjs +59 -0
- package/dist/domain/output-fixes.mjs.map +1 -0
- package/dist/index.cjs +98 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +812 -0
- package/dist/index.d.mts +812 -0
- package/dist/index.d.ts +812 -0
- package/dist/index.mjs +27 -0
- package/dist/index.mjs.map +1 -0
- package/dist/transform/components-object.cjs +14 -0
- package/dist/transform/components-object.cjs.map +1 -0
- package/dist/transform/components-object.mjs +10 -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 +43 -0
- package/src/adapters/redocly-loader/redocly-schema-loader.ts +246 -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 +220 -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 +280 -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-enum.ts +76 -0
- package/src/api/discriminator-scan.ts +272 -0
- package/src/api/document-declarations.ts +41 -0
- package/src/api/document-refs.ts +71 -0
- package/src/api/document-run.ts +159 -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/schema-callbacks.ts +211 -0
- package/src/api/string-to-ast.ts +27 -0
- package/src/api/transform-context.ts +87 -0
- package/src/api/transform-schema.ts +39 -0
- package/src/api/type-helpers.ts +130 -0
- package/src/api/unsupported-feature-warnings.ts +26 -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 +16 -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 +281 -0
- package/src/application/stack-overflow.ts +54 -0
- package/src/application/transform/document/components.ts +189 -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 +157 -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/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 +200 -0
- package/src/application/transform/document/path-item-conflicts.ts +79 -0
- package/src/application/transform/document/path-item.ts +168 -0
- package/src/application/transform/document/path-key-overlaps.ts +112 -0
- package/src/application/transform/document/paths-enum.ts +127 -0
- package/src/application/transform/document/paths.ts +211 -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 +106 -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 +127 -0
- package/src/application/transform/footer/enum-naming.ts +181 -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-type.ts +97 -0
- package/src/application/transform/schema/array-type.ts +152 -0
- package/src/application/transform/schema/composition-type.ts +183 -0
- package/src/application/transform/schema/core-type.ts +115 -0
- package/src/application/transform/schema/discriminator-property.ts +28 -0
- package/src/application/transform/schema/enum-rule.ts +157 -0
- package/src/application/transform/schema/object-type.ts +271 -0
- package/src/application/transform/schema/presence-members.ts +96 -0
- package/src/application/transform/schema/schema-context.ts +110 -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 +116 -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 +198 -0
- package/src/cli/cli-dependencies.ts +42 -0
- package/src/cli/cli-errors.ts +125 -0
- package/src/cli/cli-output.ts +53 -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 +67 -0
- package/src/cli/redocly-apis.ts +91 -0
- package/src/cli/ref-limits.ts +16 -0
- package/src/cli/run-cli.ts +114 -0
- package/src/domain/assert-never.ts +8 -0
- package/src/domain/errors.ts +74 -0
- package/src/domain/ir/constructors.ts +137 -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 +224 -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/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/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 +30 -0
- package/src/domain/openapi/path-item-object.ts +70 -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 +59 -0
- package/src/domain/openapi/unsupported-features.ts +139 -0
- package/src/domain/output-fixes.ts +95 -0
- package/src/index.ts +67 -0
- package/src/transform/components-object.ts +25 -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 +267 -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,168 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const defaultPorts = require('./default-ports.cjs');
|
|
4
|
+
const discriminatorEnum = require('./discriminator-enum.cjs');
|
|
5
|
+
const documentRefs = require('./document-refs.cjs');
|
|
6
|
+
const legacyUtils = require('./legacy-utils.cjs');
|
|
7
|
+
|
|
8
|
+
function addDiscriminatorEnum(state, patch) {
|
|
9
|
+
const { silent, logger } = state;
|
|
10
|
+
const resolved = documentRefs.resolveDocumentRef(state.schema, patch.ref, { silent, logger });
|
|
11
|
+
const added = discriminatorEnum.addEnumProperty(resolved, patch);
|
|
12
|
+
if (added === null) {
|
|
13
|
+
warnInvalidMapping(patch, state.logger);
|
|
14
|
+
}
|
|
15
|
+
return added;
|
|
16
|
+
}
|
|
17
|
+
function enumKey(patch) {
|
|
18
|
+
return `${patch.ref}
|
|
19
|
+
${patch.discriminator.propertyName}`;
|
|
20
|
+
}
|
|
21
|
+
function mergeIntoPatchedEnum(state, key, values) {
|
|
22
|
+
const patched = state.patchedEnums.get(key);
|
|
23
|
+
if (patched === void 0) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
const merged = patched.enum;
|
|
27
|
+
merged.push(...values.filter((value) => !merged.includes(value)));
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
function patchDiscriminatorEnum(state, patch) {
|
|
31
|
+
if (!state.fixesValueConflicts) {
|
|
32
|
+
return addDiscriminatorEnum(state, patch) !== null;
|
|
33
|
+
}
|
|
34
|
+
const key = enumKey(patch);
|
|
35
|
+
if (mergeIntoPatchedEnum(state, key, patch.values)) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
const added = addDiscriminatorEnum(state, patch);
|
|
39
|
+
if (added !== null) {
|
|
40
|
+
state.patchedEnums.set(key, added);
|
|
41
|
+
}
|
|
42
|
+
return added !== null;
|
|
43
|
+
}
|
|
44
|
+
function markHandled(state, ref) {
|
|
45
|
+
if (!state.refsHandled.includes(ref)) {
|
|
46
|
+
state.refsHandled.push(ref);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function warnInvalidMapping(patch, logger) {
|
|
50
|
+
const mapped = `${patch.ref} => ${patch.values.join(", ")}`;
|
|
51
|
+
logger.warn(
|
|
52
|
+
`Discriminator mapping has an invalid schema (neither an object schema nor an allOf array): ${mapped} (Discriminator: ${patch.discriminatorRef})`
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
function inferredMapping(oneOf) {
|
|
56
|
+
const mapping = {};
|
|
57
|
+
for (const item of oneOf) {
|
|
58
|
+
if (!("$ref" in item)) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
const value = item.$ref.split("/").pop();
|
|
62
|
+
if (value) {
|
|
63
|
+
mapping[item.$ref] = { ...mapping[item.$ref], inferred: value };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return mapping;
|
|
67
|
+
}
|
|
68
|
+
function addDefinedMapping(mapping, discriminator) {
|
|
69
|
+
for (const [mappedValue, mappedRef] of Object.entries(discriminator.mapping ?? {})) {
|
|
70
|
+
if (!mappedRef) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (!mapping[mappedRef]?.defined) {
|
|
74
|
+
mapping[mappedRef] = { defined: [] };
|
|
75
|
+
}
|
|
76
|
+
mapping[mappedRef].defined?.push(mappedValue);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function patchMappedSchemas(state, mapping, discriminator) {
|
|
80
|
+
for (const [ref, { inferred, defined }] of Object.entries(mapping)) {
|
|
81
|
+
const isSkipped = !state.fixesValueConflicts && state.refsHandled.includes(ref);
|
|
82
|
+
if (isSkipped || !inferred && !defined) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
const values = defined ?? [inferred];
|
|
86
|
+
if (state.fixesValueConflicts && defined === void 0) {
|
|
87
|
+
state.inferredPatches.push({ ...discriminator, ref, values });
|
|
88
|
+
} else if (patchDiscriminatorEnum(state, { ...discriminator, ref, values })) {
|
|
89
|
+
markHandled(state, ref);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function collectDiscriminator(state, value, path) {
|
|
94
|
+
const discriminator = value.discriminator;
|
|
95
|
+
if (!discriminator?.propertyName) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const discriminatorRef = legacyUtils.createRef(path);
|
|
99
|
+
state.objects[discriminatorRef] = discriminator;
|
|
100
|
+
if (!Array.isArray(value.oneOf)) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const mapping = inferredMapping(value.oneOf);
|
|
104
|
+
if (discriminator.mapping) {
|
|
105
|
+
addDefinedMapping(mapping, discriminator);
|
|
106
|
+
}
|
|
107
|
+
patchMappedSchemas(state, mapping, { discriminator, discriminatorRef });
|
|
108
|
+
}
|
|
109
|
+
function valuesMappedTo(discriminator, ref) {
|
|
110
|
+
return Object.entries(discriminator.mapping ?? {}).filter(([, mappedRef]) => mappedRef === ref).map(([mappedValue]) => mappedValue);
|
|
111
|
+
}
|
|
112
|
+
function inheritFromRef(state, parentRef, ref) {
|
|
113
|
+
const discriminator = state.objects[parentRef];
|
|
114
|
+
if (!discriminator) {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
const values = valuesMappedTo(discriminator, ref);
|
|
118
|
+
const patch = { ref, values, discriminator, discriminatorRef: parentRef };
|
|
119
|
+
if (values.length > 0 && patchDiscriminatorEnum(state, patch)) {
|
|
120
|
+
markHandled(state, ref);
|
|
121
|
+
}
|
|
122
|
+
state.objects[ref] = { ...discriminator };
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
function inheritDiscriminators(state, value, path) {
|
|
126
|
+
if (!Array.isArray(value.allOf)) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
for (const item of value.allOf) {
|
|
130
|
+
if ("$ref" in item) {
|
|
131
|
+
if (!inheritFromRef(state, item.$ref, legacyUtils.createRef(path))) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
} else if (item.discriminator?.propertyName) {
|
|
135
|
+
state.objects[legacyUtils.createRef(path)] = { ...item.discriminator };
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
function applyInferredPatches(state) {
|
|
140
|
+
const mapped = new Set(state.patchedEnums.keys());
|
|
141
|
+
for (const patch of state.inferredPatches) {
|
|
142
|
+
if (!mapped.has(enumKey(patch)) && patchDiscriminatorEnum(state, patch)) {
|
|
143
|
+
markHandled(state, patch.ref);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function findDiscriminators(schema, options) {
|
|
148
|
+
const state = {
|
|
149
|
+
...options,
|
|
150
|
+
schema,
|
|
151
|
+
objects: {},
|
|
152
|
+
refsHandled: [],
|
|
153
|
+
patchedEnums: /* @__PURE__ */ new Map(),
|
|
154
|
+
inferredPatches: []
|
|
155
|
+
};
|
|
156
|
+
documentRefs.walkDocument(schema, (value, path) => collectDiscriminator(state, value, path));
|
|
157
|
+
documentRefs.walkDocument(schema, (value, path) => inheritDiscriminators(state, value, path));
|
|
158
|
+
applyInferredPatches(state);
|
|
159
|
+
return { objects: state.objects, refsHandled: state.refsHandled };
|
|
160
|
+
}
|
|
161
|
+
function scanDiscriminators(schema, options, logger = defaultPorts.defaultLogger(options.silent ?? false)) {
|
|
162
|
+
const silent = options.silent ?? false;
|
|
163
|
+
return findDiscriminators(schema, { silent, logger, fixesValueConflicts: false });
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
exports.findDiscriminators = findDiscriminators;
|
|
167
|
+
exports.scanDiscriminators = scanDiscriminators;
|
|
168
|
+
//# sourceMappingURL=discriminator-scan.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discriminator-scan.cjs","sources":["../../src/api/discriminator-scan.ts"],"sourcesContent":["import type { Logger } from \"../application/ports/logger.js\";\nimport type {\n DiscriminatorObject,\n GeneratorOptions,\n OpenAPI3,\n ReferenceObject,\n SchemaObject,\n} from \"../types.js\";\nimport { defaultLogger } from \"./default-ports.js\";\nimport { addEnumProperty, type EnumPatch } from \"./discriminator-enum.js\";\nimport { resolveDocumentRef, walkDocument } from \"./document-refs.js\";\nimport { createRef } from \"./legacy-utils.js\";\n\n/**\n * The inherited discriminator pre-pass. It finds every discriminator in the bundled document and\n * patches the mapped schemas in place with a required enum property, so that TypeScript can narrow\n * the generated union. The behavior and the warning text match the original `scanDiscriminators`.\n */\n\ntype DiscriminatorMapping = Record<string, { inferred?: string; defined?: string[] }>;\n\n/** How to scan; `fixesValueConflicts` is the `discriminator-values` fix (ADR-021, roadmap R12). */\nexport interface DiscriminatorScanOptions {\n readonly silent: boolean;\n readonly logger: Logger;\n readonly fixesValueConflicts: boolean;\n}\n\n/** What the two passes share: the document they patch and what they found so far. */\ninterface ScanState extends DiscriminatorScanOptions {\n readonly schema: OpenAPI3;\n readonly objects: Record<string, DiscriminatorObject>;\n readonly refsHandled: string[];\n /** With the fix: the enum added to each schema, by schema and property, so values merge. */\n readonly patchedEnums: Map<string, SchemaObject>;\n /** With the fix: schema-name values, applied after both passes where no mapping names one. */\n readonly inferredPatches: EnumPatch[];\n}\n\n/** The enum the schema at `patch.ref` gets, or null (with a warning) for another kind of schema. */\nfunction addDiscriminatorEnum(state: ScanState, patch: EnumPatch): SchemaObject | null {\n const { silent, logger } = state;\n const resolved = resolveDocumentRef<SchemaObject>(state.schema, patch.ref, { silent, logger });\n const added = addEnumProperty(resolved, patch);\n if (added === null) {\n warnInvalidMapping(patch, state.logger);\n }\n return added;\n}\n\n/** One schema and discriminator property; two discriminators of one property share an enum. */\nfunction enumKey(patch: EnumPatch): string {\n return `${patch.ref}\\n${patch.discriminator.propertyName}`;\n}\n\n/** With the fix, a second discriminator of the same property adds its values to the first enum. */\nfunction mergeIntoPatchedEnum(state: ScanState, key: string, values: readonly string[]): boolean {\n const patched = state.patchedEnums.get(key);\n if (patched === undefined) {\n return false;\n }\n const merged = patched.enum as unknown[];\n merged.push(...values.filter((value) => !merged.includes(value)));\n return true;\n}\n\n/**\n * Add or replace the discriminator enum in the schema at `patch.ref`. Returns false, with a\n * warning, when that schema is neither an `allOf` nor an object schema. Without the fix every\n * patch adds a property, so two discriminators with different values intersect to `never`.\n */\nfunction patchDiscriminatorEnum(state: ScanState, patch: EnumPatch): boolean {\n if (!state.fixesValueConflicts) {\n return addDiscriminatorEnum(state, patch) !== null;\n }\n const key = enumKey(patch);\n if (mergeIntoPatchedEnum(state, key, patch.values)) {\n return true;\n }\n const added = addDiscriminatorEnum(state, patch);\n if (added !== null) {\n state.patchedEnums.set(key, added);\n }\n return added !== null;\n}\n\nfunction markHandled(state: ScanState, ref: string): void {\n if (!state.refsHandled.includes(ref)) {\n state.refsHandled.push(ref);\n }\n}\n\nfunction warnInvalidMapping(patch: EnumPatch, logger: Logger): void {\n const mapped = `${patch.ref} => ${patch.values.join(\", \")}`;\n logger.warn(\n \"Discriminator mapping has an invalid schema (neither an object schema nor an allOf array): \" +\n `${mapped} (Discriminator: ${patch.discriminatorRef})`,\n );\n}\n\n/** The schema name at the end of each `oneOf` `$ref` is the inferred discriminator value. */\nfunction inferredMapping(oneOf: (SchemaObject | ReferenceObject)[]): DiscriminatorMapping {\n const mapping: DiscriminatorMapping = {};\n for (const item of oneOf) {\n if (!(\"$ref\" in item)) {\n continue;\n }\n const value = item.$ref.split(\"/\").pop();\n if (value) {\n mapping[item.$ref] = { ...mapping[item.$ref], inferred: value };\n }\n }\n return mapping;\n}\n\n/** Values defined in `discriminator.mapping` replace inferred ones for the same schema. */\nfunction addDefinedMapping(\n mapping: DiscriminatorMapping,\n discriminator: DiscriminatorObject,\n): void {\n for (const [mappedValue, mappedRef] of Object.entries(discriminator.mapping ?? {})) {\n if (!mappedRef) {\n continue;\n }\n if (!mapping[mappedRef]?.defined) {\n mapping[mappedRef] = { defined: [] };\n }\n mapping[mappedRef].defined?.push(mappedValue);\n }\n}\n\nfunction patchMappedSchemas(\n state: ScanState,\n mapping: DiscriminatorMapping,\n discriminator: Omit<EnumPatch, \"ref\" | \"values\">,\n): void {\n for (const [ref, { inferred, defined }] of Object.entries(mapping)) {\n const isSkipped = !state.fixesValueConflicts && state.refsHandled.includes(ref);\n if (isSkipped || (!inferred && !defined)) {\n continue;\n }\n // A defined value wins: the schema name may not be the value the API sends.\n const values = defined ?? [inferred as string];\n if (state.fixesValueConflicts && defined === undefined) {\n // A mapping found later, in this pass or the next, may name the schema.\n state.inferredPatches.push({ ...discriminator, ref, values });\n } else if (patchDiscriminatorEnum(state, { ...discriminator, ref, values })) {\n markHandled(state, ref);\n }\n }\n}\n\n/** Pass 1: collect every discriminator; patch the schemas of a discriminator + `oneOf`. */\nfunction collectDiscriminator(\n state: ScanState,\n value: Record<string, unknown>,\n path: (string | number)[],\n): void {\n const discriminator = value.discriminator as DiscriminatorObject | undefined;\n if (!discriminator?.propertyName) {\n return;\n }\n const discriminatorRef = createRef(path);\n state.objects[discriminatorRef] = discriminator;\n if (!Array.isArray(value.oneOf)) {\n return;\n }\n const mapping = inferredMapping(value.oneOf);\n if (discriminator.mapping) {\n addDefinedMapping(mapping, discriminator);\n }\n patchMappedSchemas(state, mapping, { discriminator, discriminatorRef });\n}\n\n/** The mapping keys of `discriminator` that point at `ref`. */\nfunction valuesMappedTo(discriminator: DiscriminatorObject, ref: string): string[] {\n return Object.entries(discriminator.mapping ?? {})\n .filter(([, mappedRef]) => mappedRef === ref)\n .map(([mappedValue]) => mappedValue);\n}\n\n/**\n * An `allOf` item that is a `$ref` to a discriminator owner: the schema at `ref` inherits the\n * discriminator, and gets its enum when the parent's mapping names it. Returns false when the\n * `$ref` owns no discriminator, which ends the scan of this `allOf` (as in the original).\n */\nfunction inheritFromRef(state: ScanState, parentRef: string, ref: string): boolean {\n const discriminator = state.objects[parentRef];\n if (!discriminator) {\n return false;\n }\n const values = valuesMappedTo(discriminator, ref);\n const patch = { ref, values, discriminator, discriminatorRef: parentRef };\n if (values.length > 0 && patchDiscriminatorEnum(state, patch)) {\n markHandled(state, ref);\n }\n state.objects[ref] = { ...discriminator };\n return true;\n}\n\n/** Pass 2: a schema whose `allOf` holds a discriminator, or a `$ref` to one, inherits it. */\nfunction inheritDiscriminators(\n state: ScanState,\n value: Record<string, unknown>,\n path: (string | number)[],\n): void {\n if (!Array.isArray(value.allOf)) {\n return;\n }\n for (const item of value.allOf as (SchemaObject | ReferenceObject)[]) {\n if (\"$ref\" in item) {\n if (!inheritFromRef(state, item.$ref, createRef(path))) {\n return;\n }\n } else if (item.discriminator?.propertyName) {\n state.objects[createRef(path)] = { ...item.discriminator };\n }\n }\n}\n\n/** The discriminators of a bundled document, after patching the mapped schemas in place. */\nexport interface DiscriminatorScan {\n objects: Record<string, DiscriminatorObject>;\n refsHandled: string[];\n}\n\n/**\n * With the fix: a schema-name value, only for a schema and property that no mapping gave a value.\n * Every enum patched so far came from a mapping, since schema-name values wait for this step.\n */\nfunction applyInferredPatches(state: ScanState): void {\n const mapped = new Set(state.patchedEnums.keys());\n for (const patch of state.inferredPatches) {\n if (!mapped.has(enumKey(patch)) && patchDiscriminatorEnum(state, patch)) {\n markHandled(state, patch.ref);\n }\n }\n}\n\n/** Find every discriminator in `schema`; warnings go to `logger` unless `silent`. */\nexport function findDiscriminators(\n schema: OpenAPI3,\n options: DiscriminatorScanOptions,\n): DiscriminatorScan {\n const state: ScanState = {\n ...options,\n schema,\n objects: {},\n refsHandled: [],\n patchedEnums: new Map(),\n inferredPatches: [],\n };\n walkDocument(schema, (value, path) => collectDiscriminator(state, value, path));\n // A second pass, because an `allOf` may name a discriminator that is defined later.\n walkDocument(schema, (value, path) => inheritDiscriminators(state, value, path));\n applyInferredPatches(state);\n return { objects: state.objects, refsHandled: state.refsHandled };\n}\n\n/**\n * Return a key–value map of discriminator objects found in a schema. Warnings go to `logger`;\n * without one, to the default terminal logger, as the original did.\n * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).\n */\nexport function scanDiscriminators(\n schema: OpenAPI3,\n options: GeneratorOptions,\n logger: Logger = defaultLogger(options.silent ?? false),\n): DiscriminatorScan {\n const silent = options.silent ?? false;\n return findDiscriminators(schema, { silent, logger, fixesValueConflicts: false });\n}\n"],"names":["resolveDocumentRef","addEnumProperty","createRef","walkDocument","defaultLogger"],"mappings":"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"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { defaultLogger } from './default-ports.mjs';
|
|
2
|
+
import { addEnumProperty } from './discriminator-enum.mjs';
|
|
3
|
+
import { walkDocument, resolveDocumentRef } from './document-refs.mjs';
|
|
4
|
+
import { createRef } from './legacy-utils.mjs';
|
|
5
|
+
|
|
6
|
+
function addDiscriminatorEnum(state, patch) {
|
|
7
|
+
const { silent, logger } = state;
|
|
8
|
+
const resolved = resolveDocumentRef(state.schema, patch.ref, { silent, logger });
|
|
9
|
+
const added = addEnumProperty(resolved, patch);
|
|
10
|
+
if (added === null) {
|
|
11
|
+
warnInvalidMapping(patch, state.logger);
|
|
12
|
+
}
|
|
13
|
+
return added;
|
|
14
|
+
}
|
|
15
|
+
function enumKey(patch) {
|
|
16
|
+
return `${patch.ref}
|
|
17
|
+
${patch.discriminator.propertyName}`;
|
|
18
|
+
}
|
|
19
|
+
function mergeIntoPatchedEnum(state, key, values) {
|
|
20
|
+
const patched = state.patchedEnums.get(key);
|
|
21
|
+
if (patched === void 0) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
const merged = patched.enum;
|
|
25
|
+
merged.push(...values.filter((value) => !merged.includes(value)));
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
function patchDiscriminatorEnum(state, patch) {
|
|
29
|
+
if (!state.fixesValueConflicts) {
|
|
30
|
+
return addDiscriminatorEnum(state, patch) !== null;
|
|
31
|
+
}
|
|
32
|
+
const key = enumKey(patch);
|
|
33
|
+
if (mergeIntoPatchedEnum(state, key, patch.values)) {
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
const added = addDiscriminatorEnum(state, patch);
|
|
37
|
+
if (added !== null) {
|
|
38
|
+
state.patchedEnums.set(key, added);
|
|
39
|
+
}
|
|
40
|
+
return added !== null;
|
|
41
|
+
}
|
|
42
|
+
function markHandled(state, ref) {
|
|
43
|
+
if (!state.refsHandled.includes(ref)) {
|
|
44
|
+
state.refsHandled.push(ref);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function warnInvalidMapping(patch, logger) {
|
|
48
|
+
const mapped = `${patch.ref} => ${patch.values.join(", ")}`;
|
|
49
|
+
logger.warn(
|
|
50
|
+
`Discriminator mapping has an invalid schema (neither an object schema nor an allOf array): ${mapped} (Discriminator: ${patch.discriminatorRef})`
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
function inferredMapping(oneOf) {
|
|
54
|
+
const mapping = {};
|
|
55
|
+
for (const item of oneOf) {
|
|
56
|
+
if (!("$ref" in item)) {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const value = item.$ref.split("/").pop();
|
|
60
|
+
if (value) {
|
|
61
|
+
mapping[item.$ref] = { ...mapping[item.$ref], inferred: value };
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return mapping;
|
|
65
|
+
}
|
|
66
|
+
function addDefinedMapping(mapping, discriminator) {
|
|
67
|
+
for (const [mappedValue, mappedRef] of Object.entries(discriminator.mapping ?? {})) {
|
|
68
|
+
if (!mappedRef) {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (!mapping[mappedRef]?.defined) {
|
|
72
|
+
mapping[mappedRef] = { defined: [] };
|
|
73
|
+
}
|
|
74
|
+
mapping[mappedRef].defined?.push(mappedValue);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function patchMappedSchemas(state, mapping, discriminator) {
|
|
78
|
+
for (const [ref, { inferred, defined }] of Object.entries(mapping)) {
|
|
79
|
+
const isSkipped = !state.fixesValueConflicts && state.refsHandled.includes(ref);
|
|
80
|
+
if (isSkipped || !inferred && !defined) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
const values = defined ?? [inferred];
|
|
84
|
+
if (state.fixesValueConflicts && defined === void 0) {
|
|
85
|
+
state.inferredPatches.push({ ...discriminator, ref, values });
|
|
86
|
+
} else if (patchDiscriminatorEnum(state, { ...discriminator, ref, values })) {
|
|
87
|
+
markHandled(state, ref);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function collectDiscriminator(state, value, path) {
|
|
92
|
+
const discriminator = value.discriminator;
|
|
93
|
+
if (!discriminator?.propertyName) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const discriminatorRef = createRef(path);
|
|
97
|
+
state.objects[discriminatorRef] = discriminator;
|
|
98
|
+
if (!Array.isArray(value.oneOf)) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const mapping = inferredMapping(value.oneOf);
|
|
102
|
+
if (discriminator.mapping) {
|
|
103
|
+
addDefinedMapping(mapping, discriminator);
|
|
104
|
+
}
|
|
105
|
+
patchMappedSchemas(state, mapping, { discriminator, discriminatorRef });
|
|
106
|
+
}
|
|
107
|
+
function valuesMappedTo(discriminator, ref) {
|
|
108
|
+
return Object.entries(discriminator.mapping ?? {}).filter(([, mappedRef]) => mappedRef === ref).map(([mappedValue]) => mappedValue);
|
|
109
|
+
}
|
|
110
|
+
function inheritFromRef(state, parentRef, ref) {
|
|
111
|
+
const discriminator = state.objects[parentRef];
|
|
112
|
+
if (!discriminator) {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
const values = valuesMappedTo(discriminator, ref);
|
|
116
|
+
const patch = { ref, values, discriminator, discriminatorRef: parentRef };
|
|
117
|
+
if (values.length > 0 && patchDiscriminatorEnum(state, patch)) {
|
|
118
|
+
markHandled(state, ref);
|
|
119
|
+
}
|
|
120
|
+
state.objects[ref] = { ...discriminator };
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
function inheritDiscriminators(state, value, path) {
|
|
124
|
+
if (!Array.isArray(value.allOf)) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
for (const item of value.allOf) {
|
|
128
|
+
if ("$ref" in item) {
|
|
129
|
+
if (!inheritFromRef(state, item.$ref, createRef(path))) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
} else if (item.discriminator?.propertyName) {
|
|
133
|
+
state.objects[createRef(path)] = { ...item.discriminator };
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
function applyInferredPatches(state) {
|
|
138
|
+
const mapped = new Set(state.patchedEnums.keys());
|
|
139
|
+
for (const patch of state.inferredPatches) {
|
|
140
|
+
if (!mapped.has(enumKey(patch)) && patchDiscriminatorEnum(state, patch)) {
|
|
141
|
+
markHandled(state, patch.ref);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
function findDiscriminators(schema, options) {
|
|
146
|
+
const state = {
|
|
147
|
+
...options,
|
|
148
|
+
schema,
|
|
149
|
+
objects: {},
|
|
150
|
+
refsHandled: [],
|
|
151
|
+
patchedEnums: /* @__PURE__ */ new Map(),
|
|
152
|
+
inferredPatches: []
|
|
153
|
+
};
|
|
154
|
+
walkDocument(schema, (value, path) => collectDiscriminator(state, value, path));
|
|
155
|
+
walkDocument(schema, (value, path) => inheritDiscriminators(state, value, path));
|
|
156
|
+
applyInferredPatches(state);
|
|
157
|
+
return { objects: state.objects, refsHandled: state.refsHandled };
|
|
158
|
+
}
|
|
159
|
+
function scanDiscriminators(schema, options, logger = defaultLogger(options.silent ?? false)) {
|
|
160
|
+
const silent = options.silent ?? false;
|
|
161
|
+
return findDiscriminators(schema, { silent, logger, fixesValueConflicts: false });
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export { findDiscriminators, scanDiscriminators };
|
|
165
|
+
//# sourceMappingURL=discriminator-scan.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discriminator-scan.mjs","sources":["../../src/api/discriminator-scan.ts"],"sourcesContent":["import type { Logger } from \"../application/ports/logger.js\";\nimport type {\n DiscriminatorObject,\n GeneratorOptions,\n OpenAPI3,\n ReferenceObject,\n SchemaObject,\n} from \"../types.js\";\nimport { defaultLogger } from \"./default-ports.js\";\nimport { addEnumProperty, type EnumPatch } from \"./discriminator-enum.js\";\nimport { resolveDocumentRef, walkDocument } from \"./document-refs.js\";\nimport { createRef } from \"./legacy-utils.js\";\n\n/**\n * The inherited discriminator pre-pass. It finds every discriminator in the bundled document and\n * patches the mapped schemas in place with a required enum property, so that TypeScript can narrow\n * the generated union. The behavior and the warning text match the original `scanDiscriminators`.\n */\n\ntype DiscriminatorMapping = Record<string, { inferred?: string; defined?: string[] }>;\n\n/** How to scan; `fixesValueConflicts` is the `discriminator-values` fix (ADR-021, roadmap R12). */\nexport interface DiscriminatorScanOptions {\n readonly silent: boolean;\n readonly logger: Logger;\n readonly fixesValueConflicts: boolean;\n}\n\n/** What the two passes share: the document they patch and what they found so far. */\ninterface ScanState extends DiscriminatorScanOptions {\n readonly schema: OpenAPI3;\n readonly objects: Record<string, DiscriminatorObject>;\n readonly refsHandled: string[];\n /** With the fix: the enum added to each schema, by schema and property, so values merge. */\n readonly patchedEnums: Map<string, SchemaObject>;\n /** With the fix: schema-name values, applied after both passes where no mapping names one. */\n readonly inferredPatches: EnumPatch[];\n}\n\n/** The enum the schema at `patch.ref` gets, or null (with a warning) for another kind of schema. */\nfunction addDiscriminatorEnum(state: ScanState, patch: EnumPatch): SchemaObject | null {\n const { silent, logger } = state;\n const resolved = resolveDocumentRef<SchemaObject>(state.schema, patch.ref, { silent, logger });\n const added = addEnumProperty(resolved, patch);\n if (added === null) {\n warnInvalidMapping(patch, state.logger);\n }\n return added;\n}\n\n/** One schema and discriminator property; two discriminators of one property share an enum. */\nfunction enumKey(patch: EnumPatch): string {\n return `${patch.ref}\\n${patch.discriminator.propertyName}`;\n}\n\n/** With the fix, a second discriminator of the same property adds its values to the first enum. */\nfunction mergeIntoPatchedEnum(state: ScanState, key: string, values: readonly string[]): boolean {\n const patched = state.patchedEnums.get(key);\n if (patched === undefined) {\n return false;\n }\n const merged = patched.enum as unknown[];\n merged.push(...values.filter((value) => !merged.includes(value)));\n return true;\n}\n\n/**\n * Add or replace the discriminator enum in the schema at `patch.ref`. Returns false, with a\n * warning, when that schema is neither an `allOf` nor an object schema. Without the fix every\n * patch adds a property, so two discriminators with different values intersect to `never`.\n */\nfunction patchDiscriminatorEnum(state: ScanState, patch: EnumPatch): boolean {\n if (!state.fixesValueConflicts) {\n return addDiscriminatorEnum(state, patch) !== null;\n }\n const key = enumKey(patch);\n if (mergeIntoPatchedEnum(state, key, patch.values)) {\n return true;\n }\n const added = addDiscriminatorEnum(state, patch);\n if (added !== null) {\n state.patchedEnums.set(key, added);\n }\n return added !== null;\n}\n\nfunction markHandled(state: ScanState, ref: string): void {\n if (!state.refsHandled.includes(ref)) {\n state.refsHandled.push(ref);\n }\n}\n\nfunction warnInvalidMapping(patch: EnumPatch, logger: Logger): void {\n const mapped = `${patch.ref} => ${patch.values.join(\", \")}`;\n logger.warn(\n \"Discriminator mapping has an invalid schema (neither an object schema nor an allOf array): \" +\n `${mapped} (Discriminator: ${patch.discriminatorRef})`,\n );\n}\n\n/** The schema name at the end of each `oneOf` `$ref` is the inferred discriminator value. */\nfunction inferredMapping(oneOf: (SchemaObject | ReferenceObject)[]): DiscriminatorMapping {\n const mapping: DiscriminatorMapping = {};\n for (const item of oneOf) {\n if (!(\"$ref\" in item)) {\n continue;\n }\n const value = item.$ref.split(\"/\").pop();\n if (value) {\n mapping[item.$ref] = { ...mapping[item.$ref], inferred: value };\n }\n }\n return mapping;\n}\n\n/** Values defined in `discriminator.mapping` replace inferred ones for the same schema. */\nfunction addDefinedMapping(\n mapping: DiscriminatorMapping,\n discriminator: DiscriminatorObject,\n): void {\n for (const [mappedValue, mappedRef] of Object.entries(discriminator.mapping ?? {})) {\n if (!mappedRef) {\n continue;\n }\n if (!mapping[mappedRef]?.defined) {\n mapping[mappedRef] = { defined: [] };\n }\n mapping[mappedRef].defined?.push(mappedValue);\n }\n}\n\nfunction patchMappedSchemas(\n state: ScanState,\n mapping: DiscriminatorMapping,\n discriminator: Omit<EnumPatch, \"ref\" | \"values\">,\n): void {\n for (const [ref, { inferred, defined }] of Object.entries(mapping)) {\n const isSkipped = !state.fixesValueConflicts && state.refsHandled.includes(ref);\n if (isSkipped || (!inferred && !defined)) {\n continue;\n }\n // A defined value wins: the schema name may not be the value the API sends.\n const values = defined ?? [inferred as string];\n if (state.fixesValueConflicts && defined === undefined) {\n // A mapping found later, in this pass or the next, may name the schema.\n state.inferredPatches.push({ ...discriminator, ref, values });\n } else if (patchDiscriminatorEnum(state, { ...discriminator, ref, values })) {\n markHandled(state, ref);\n }\n }\n}\n\n/** Pass 1: collect every discriminator; patch the schemas of a discriminator + `oneOf`. */\nfunction collectDiscriminator(\n state: ScanState,\n value: Record<string, unknown>,\n path: (string | number)[],\n): void {\n const discriminator = value.discriminator as DiscriminatorObject | undefined;\n if (!discriminator?.propertyName) {\n return;\n }\n const discriminatorRef = createRef(path);\n state.objects[discriminatorRef] = discriminator;\n if (!Array.isArray(value.oneOf)) {\n return;\n }\n const mapping = inferredMapping(value.oneOf);\n if (discriminator.mapping) {\n addDefinedMapping(mapping, discriminator);\n }\n patchMappedSchemas(state, mapping, { discriminator, discriminatorRef });\n}\n\n/** The mapping keys of `discriminator` that point at `ref`. */\nfunction valuesMappedTo(discriminator: DiscriminatorObject, ref: string): string[] {\n return Object.entries(discriminator.mapping ?? {})\n .filter(([, mappedRef]) => mappedRef === ref)\n .map(([mappedValue]) => mappedValue);\n}\n\n/**\n * An `allOf` item that is a `$ref` to a discriminator owner: the schema at `ref` inherits the\n * discriminator, and gets its enum when the parent's mapping names it. Returns false when the\n * `$ref` owns no discriminator, which ends the scan of this `allOf` (as in the original).\n */\nfunction inheritFromRef(state: ScanState, parentRef: string, ref: string): boolean {\n const discriminator = state.objects[parentRef];\n if (!discriminator) {\n return false;\n }\n const values = valuesMappedTo(discriminator, ref);\n const patch = { ref, values, discriminator, discriminatorRef: parentRef };\n if (values.length > 0 && patchDiscriminatorEnum(state, patch)) {\n markHandled(state, ref);\n }\n state.objects[ref] = { ...discriminator };\n return true;\n}\n\n/** Pass 2: a schema whose `allOf` holds a discriminator, or a `$ref` to one, inherits it. */\nfunction inheritDiscriminators(\n state: ScanState,\n value: Record<string, unknown>,\n path: (string | number)[],\n): void {\n if (!Array.isArray(value.allOf)) {\n return;\n }\n for (const item of value.allOf as (SchemaObject | ReferenceObject)[]) {\n if (\"$ref\" in item) {\n if (!inheritFromRef(state, item.$ref, createRef(path))) {\n return;\n }\n } else if (item.discriminator?.propertyName) {\n state.objects[createRef(path)] = { ...item.discriminator };\n }\n }\n}\n\n/** The discriminators of a bundled document, after patching the mapped schemas in place. */\nexport interface DiscriminatorScan {\n objects: Record<string, DiscriminatorObject>;\n refsHandled: string[];\n}\n\n/**\n * With the fix: a schema-name value, only for a schema and property that no mapping gave a value.\n * Every enum patched so far came from a mapping, since schema-name values wait for this step.\n */\nfunction applyInferredPatches(state: ScanState): void {\n const mapped = new Set(state.patchedEnums.keys());\n for (const patch of state.inferredPatches) {\n if (!mapped.has(enumKey(patch)) && patchDiscriminatorEnum(state, patch)) {\n markHandled(state, patch.ref);\n }\n }\n}\n\n/** Find every discriminator in `schema`; warnings go to `logger` unless `silent`. */\nexport function findDiscriminators(\n schema: OpenAPI3,\n options: DiscriminatorScanOptions,\n): DiscriminatorScan {\n const state: ScanState = {\n ...options,\n schema,\n objects: {},\n refsHandled: [],\n patchedEnums: new Map(),\n inferredPatches: [],\n };\n walkDocument(schema, (value, path) => collectDiscriminator(state, value, path));\n // A second pass, because an `allOf` may name a discriminator that is defined later.\n walkDocument(schema, (value, path) => inheritDiscriminators(state, value, path));\n applyInferredPatches(state);\n return { objects: state.objects, refsHandled: state.refsHandled };\n}\n\n/**\n * Return a key–value map of discriminator objects found in a schema. Warnings go to `logger`;\n * without one, to the default terminal logger, as the original did.\n * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).\n */\nexport function scanDiscriminators(\n schema: OpenAPI3,\n options: GeneratorOptions,\n logger: Logger = defaultLogger(options.silent ?? false),\n): DiscriminatorScan {\n const silent = options.silent ?? false;\n return findDiscriminators(schema, { silent, logger, fixesValueConflicts: false });\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const loadTypescript = require('../adapters/type-ast-bridge/load-typescript.cjs');
|
|
4
|
+
const printTypescript = require('../adapters/type-ast-bridge/print-typescript.cjs');
|
|
5
|
+
const footerEntry = require('./footer-entry.cjs');
|
|
6
|
+
|
|
7
|
+
function withoutFinalLineBreak(text) {
|
|
8
|
+
return text.endsWith("\n") ? text.slice(0, -1) : text;
|
|
9
|
+
}
|
|
10
|
+
function printedNode(node) {
|
|
11
|
+
return {
|
|
12
|
+
kind: "rawDeclaration",
|
|
13
|
+
text: withoutFinalLineBreak(printTypescript.printWithTypeScript(loadTypescript.loadTypeScript(), [node]))
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function entryDeclaration(entry) {
|
|
17
|
+
return footerEntry.isIrDeclaration(entry) ? entry : printedNode(entry);
|
|
18
|
+
}
|
|
19
|
+
function documentDeclarations({
|
|
20
|
+
body,
|
|
21
|
+
footer,
|
|
22
|
+
closing
|
|
23
|
+
}) {
|
|
24
|
+
return [...body, ...footer.map(entryDeclaration), ...closing];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
exports.documentDeclarations = documentDeclarations;
|
|
28
|
+
//# sourceMappingURL=document-declarations.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-declarations.cjs","sources":["../../src/api/document-declarations.ts"],"sourcesContent":["import { loadTypeScript } from \"../adapters/type-ast-bridge/load-typescript.js\";\nimport { printWithTypeScript } from \"../adapters/type-ast-bridge/print-typescript.js\";\nimport type { ts } from \"../adapters/type-ast-bridge/typescript-types.js\";\nimport type { IrDeclaration } from \"../domain/ir/nodes.js\";\nimport { type FooterEntry, isIrDeclaration } from \"./footer-entry.js\";\n\n/** The document in three parts; the footer may hold TypeScript nodes from user code. */\nexport interface TransformedDocument {\n readonly body: readonly IrDeclaration[];\n readonly footer: readonly FooterEntry[];\n readonly closing: readonly IrDeclaration[];\n}\n\n/** The TypeScript printer ends the file with a line break; a raw declaration's text has none. */\nfunction withoutFinalLineBreak(text: string): string {\n return text.endsWith(\"\\n\") ? text.slice(0, -1) : text;\n}\n\n/** A TypeScript node from user code, as the TypeScript printer prints it. */\nfunction printedNode(node: ts.Node): IrDeclaration {\n return {\n kind: \"rawDeclaration\",\n text: withoutFinalLineBreak(printWithTypeScript(loadTypeScript(), [node])),\n };\n}\n\nfunction entryDeclaration(entry: FooterEntry): IrDeclaration {\n return isIrDeclaration(entry) ? entry : printedNode(entry);\n}\n\n/**\n * The document as IR declarations in output order. Footer TypeScript nodes from user code become\n * raw text through the bridge; raw text is printed as written (ADR-010, decision 4).\n */\nexport function documentDeclarations({\n body,\n footer,\n closing,\n}: TransformedDocument): IrDeclaration[] {\n return [...body, ...footer.map(entryDeclaration), ...closing];\n}\n"],"names":["printWithTypeScript","loadTypeScript","isIrDeclaration"],"mappings":";;;;;;AAcA,SAAS,sBAAsB,IAAA,EAAsB;AACnD,EAAA,OAAO,IAAA,CAAK,SAAS,IAAI,CAAA,GAAI,KAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,IAAA;AACnD;AAGA,SAAS,YAAY,IAAA,EAA8B;AACjD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,IAAA,EAAM,sBAAsBA,mCAAA,CAAoBC,6BAAA,IAAkB,CAAC,IAAI,CAAC,CAAC;AAAA,GAC3E;AACF;AAEA,SAAS,iBAAiB,KAAA,EAAmC;AAC3D,EAAA,OAAOC,2BAAA,CAAgB,KAAK,CAAA,GAAI,KAAA,GAAQ,YAAY,KAAK,CAAA;AAC3D;AAMO,SAAS,oBAAA,CAAqB;AAAA,EACnC,IAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAyC;AACvC,EAAA,OAAO,CAAC,GAAG,IAAA,EAAM,GAAG,OAAO,GAAA,CAAI,gBAAgB,CAAA,EAAG,GAAG,OAAO,CAAA;AAC9D;;"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { loadTypeScript } from '../adapters/type-ast-bridge/load-typescript.mjs';
|
|
2
|
+
import { printWithTypeScript } from '../adapters/type-ast-bridge/print-typescript.mjs';
|
|
3
|
+
import { isIrDeclaration } from './footer-entry.mjs';
|
|
4
|
+
|
|
5
|
+
function withoutFinalLineBreak(text) {
|
|
6
|
+
return text.endsWith("\n") ? text.slice(0, -1) : text;
|
|
7
|
+
}
|
|
8
|
+
function printedNode(node) {
|
|
9
|
+
return {
|
|
10
|
+
kind: "rawDeclaration",
|
|
11
|
+
text: withoutFinalLineBreak(printWithTypeScript(loadTypeScript(), [node]))
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function entryDeclaration(entry) {
|
|
15
|
+
return isIrDeclaration(entry) ? entry : printedNode(entry);
|
|
16
|
+
}
|
|
17
|
+
function documentDeclarations({
|
|
18
|
+
body,
|
|
19
|
+
footer,
|
|
20
|
+
closing
|
|
21
|
+
}) {
|
|
22
|
+
return [...body, ...footer.map(entryDeclaration), ...closing];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export { documentDeclarations };
|
|
26
|
+
//# sourceMappingURL=document-declarations.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-declarations.mjs","sources":["../../src/api/document-declarations.ts"],"sourcesContent":["import { loadTypeScript } from \"../adapters/type-ast-bridge/load-typescript.js\";\nimport { printWithTypeScript } from \"../adapters/type-ast-bridge/print-typescript.js\";\nimport type { ts } from \"../adapters/type-ast-bridge/typescript-types.js\";\nimport type { IrDeclaration } from \"../domain/ir/nodes.js\";\nimport { type FooterEntry, isIrDeclaration } from \"./footer-entry.js\";\n\n/** The document in three parts; the footer may hold TypeScript nodes from user code. */\nexport interface TransformedDocument {\n readonly body: readonly IrDeclaration[];\n readonly footer: readonly FooterEntry[];\n readonly closing: readonly IrDeclaration[];\n}\n\n/** The TypeScript printer ends the file with a line break; a raw declaration's text has none. */\nfunction withoutFinalLineBreak(text: string): string {\n return text.endsWith(\"\\n\") ? text.slice(0, -1) : text;\n}\n\n/** A TypeScript node from user code, as the TypeScript printer prints it. */\nfunction printedNode(node: ts.Node): IrDeclaration {\n return {\n kind: \"rawDeclaration\",\n text: withoutFinalLineBreak(printWithTypeScript(loadTypeScript(), [node])),\n };\n}\n\nfunction entryDeclaration(entry: FooterEntry): IrDeclaration {\n return isIrDeclaration(entry) ? entry : printedNode(entry);\n}\n\n/**\n * The document as IR declarations in output order. Footer TypeScript nodes from user code become\n * raw text through the bridge; raw text is printed as written (ADR-010, decision 4).\n */\nexport function documentDeclarations({\n body,\n footer,\n closing,\n}: TransformedDocument): IrDeclaration[] {\n return [...body, ...footer.map(entryDeclaration), ...closing];\n}\n"],"names":[],"mappings":";;;;AAcA,SAAS,sBAAsB,IAAA,EAAsB;AACnD,EAAA,OAAO,IAAA,CAAK,SAAS,IAAI,CAAA,GAAI,KAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,IAAA;AACnD;AAGA,SAAS,YAAY,IAAA,EAA8B;AACjD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,IAAA,EAAM,sBAAsB,mBAAA,CAAoB,cAAA,IAAkB,CAAC,IAAI,CAAC,CAAC;AAAA,GAC3E;AACF;AAEA,SAAS,iBAAiB,KAAA,EAAmC;AAC3D,EAAA,OAAO,eAAA,CAAgB,KAAK,CAAA,GAAI,KAAA,GAAQ,YAAY,KAAK,CAAA;AAC3D;AAMO,SAAS,oBAAA,CAAqB;AAAA,EACnC,IAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAyC;AACvC,EAAA,OAAO,CAAC,GAAG,IAAA,EAAM,GAAG,OAAO,GAAA,CAAI,gBAAgB,CAAA,EAAG,GAAG,OAAO,CAAA;AAC9D;;"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const refUtils_js = require('@redocly/openapi-core/lib/ref-utils.js');
|
|
4
|
+
const defaultPorts = require('./default-ports.cjs');
|
|
5
|
+
|
|
6
|
+
function resolveDocumentRef(schema, $ref, options) {
|
|
7
|
+
const { visited = [] } = options;
|
|
8
|
+
const logger = options.logger ?? defaultPorts.defaultLogger(options.silent ?? false);
|
|
9
|
+
const { pointer } = refUtils_js.parseRef($ref);
|
|
10
|
+
if (!pointer.length) {
|
|
11
|
+
return void 0;
|
|
12
|
+
}
|
|
13
|
+
let node = schema;
|
|
14
|
+
for (const key of pointer) {
|
|
15
|
+
if (node && typeof node === "object" && node[key]) {
|
|
16
|
+
node = node[key];
|
|
17
|
+
} else {
|
|
18
|
+
logger.warn(`Could not resolve $ref "${$ref}"`);
|
|
19
|
+
return void 0;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
if (node && typeof node === "object" && node.$ref) {
|
|
23
|
+
if (visited.includes(node.$ref)) {
|
|
24
|
+
logger.warn(`Could not resolve circular $ref "${$ref}"`);
|
|
25
|
+
return void 0;
|
|
26
|
+
}
|
|
27
|
+
return resolveDocumentRef(schema, node.$ref, {
|
|
28
|
+
...options,
|
|
29
|
+
logger,
|
|
30
|
+
visited: [...visited, node.$ref]
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return node;
|
|
34
|
+
}
|
|
35
|
+
function walkDocument(obj, cb, path = []) {
|
|
36
|
+
if (!obj || typeof obj !== "object") {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (Array.isArray(obj)) {
|
|
40
|
+
for (let i = 0; i < obj.length; i++) {
|
|
41
|
+
walkDocument(obj[i], cb, path.concat(i));
|
|
42
|
+
}
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
cb(obj, path);
|
|
46
|
+
for (const k of Object.keys(obj)) {
|
|
47
|
+
walkDocument(obj[k], cb, path.concat(k));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
exports.resolveDocumentRef = resolveDocumentRef;
|
|
52
|
+
exports.walkDocument = walkDocument;
|
|
53
|
+
//# sourceMappingURL=document-refs.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-refs.cjs","sources":["../../src/api/document-refs.ts"],"sourcesContent":["import { parseRef } from \"@redocly/openapi-core/lib/ref-utils.js\";\nimport type { Logger } from \"../application/ports/logger.js\";\nimport { defaultLogger } from \"./default-ports.js\";\n\n/** `$ref` resolution and the document walk that the generator's pre-pass uses. */\n\nexport interface ResolveRefOptions {\n silent: boolean;\n visited?: string[];\n /** @internal Where warnings go; the default terminal logger (respecting `silent`) if absent. */\n logger?: Logger;\n}\n\n/** Resolve a `$ref` in a document; warns and returns undefined when it cannot. */\nexport function resolveDocumentRef<T>(\n schema: any,\n $ref: string,\n options: ResolveRefOptions,\n): T | undefined {\n const { visited = [] } = options;\n const logger = options.logger ?? defaultLogger(options.silent ?? false);\n const { pointer } = parseRef($ref);\n if (!pointer.length) {\n return undefined;\n }\n let node = schema;\n for (const key of pointer) {\n if (node && typeof node === \"object\" && node[key]) {\n node = node[key];\n } else {\n logger.warn(`Could not resolve $ref \"${$ref}\"`);\n return undefined;\n }\n }\n\n // if this is also a $ref, keep tracing\n if (node && typeof node === \"object\" && node.$ref) {\n if (visited.includes(node.$ref)) {\n logger.warn(`Could not resolve circular $ref \"${$ref}\"`);\n return undefined;\n }\n return resolveDocumentRef(schema, node.$ref, {\n ...options,\n logger,\n visited: [...visited, node.$ref],\n });\n }\n\n return node;\n}\n\n/** Call `cb` for every object in a JSON-serializable (non-circular) value, depth first. */\nexport function walkDocument(\n obj: unknown,\n cb: (value: Record<string, unknown>, path: (string | number)[]) => void,\n path: (string | number)[] = [],\n): void {\n if (!obj || typeof obj !== \"object\") {\n return;\n }\n if (Array.isArray(obj)) {\n for (let i = 0; i < obj.length; i++) {\n walkDocument(obj[i], cb, path.concat(i));\n }\n return;\n }\n cb(obj as Record<string, unknown>, path);\n for (const k of Object.keys(obj)) {\n walkDocument((obj as Record<string, unknown>)[k], cb, path.concat(k));\n }\n}\n"],"names":["defaultLogger","parseRef"],"mappings":";;;;;AAcO,SAAS,kBAAA,CACd,MAAA,EACA,IAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,EAAE,OAAA,GAAU,EAAC,EAAE,GAAI,OAAA;AACzB,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA,IAAUA,0BAAA,CAAc,OAAA,CAAQ,UAAU,KAAK,CAAA;AACtE,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAIC,oBAAA,CAAS,IAAI,CAAA;AACjC,EAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,GAAO,MAAA;AACX,EAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,IAAA,IAAI,QAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,GAAG,CAAA,EAAG;AACjD,MAAA,IAAA,GAAO,KAAK,GAAG,CAAA;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,wBAAA,EAA2B,IAAI,CAAA,CAAA,CAAG,CAAA;AAC9C,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,KAAK,IAAA,EAAM;AACjD,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,EAAG;AAC/B,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,iCAAA,EAAoC,IAAI,CAAA,CAAA,CAAG,CAAA;AACvD,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAO,kBAAA,CAAmB,MAAA,EAAQ,IAAA,CAAK,IAAA,EAAM;AAAA,MAC3C,GAAG,OAAA;AAAA,MACH,MAAA;AAAA,MACA,OAAA,EAAS,CAAC,GAAG,OAAA,EAAS,KAAK,IAAI;AAAA,KAChC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,YAAA,CACd,GAAA,EACA,EAAA,EACA,IAAA,GAA4B,EAAC,EACvB;AACN,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACnC,IAAA;AAAA,EACF;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,MAAA,YAAA,CAAa,IAAI,CAAC,CAAA,EAAG,IAAI,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,IACzC;AACA,IAAA;AAAA,EACF;AACA,EAAA,EAAA,CAAG,KAAgC,IAAI,CAAA;AACvC,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AAChC,IAAA,YAAA,CAAc,IAAgC,CAAC,CAAA,EAAG,IAAI,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,EACtE;AACF;;;"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { parseRef } from '@redocly/openapi-core/lib/ref-utils.js';
|
|
2
|
+
import { defaultLogger } from './default-ports.mjs';
|
|
3
|
+
|
|
4
|
+
function resolveDocumentRef(schema, $ref, options) {
|
|
5
|
+
const { visited = [] } = options;
|
|
6
|
+
const logger = options.logger ?? defaultLogger(options.silent ?? false);
|
|
7
|
+
const { pointer } = parseRef($ref);
|
|
8
|
+
if (!pointer.length) {
|
|
9
|
+
return void 0;
|
|
10
|
+
}
|
|
11
|
+
let node = schema;
|
|
12
|
+
for (const key of pointer) {
|
|
13
|
+
if (node && typeof node === "object" && node[key]) {
|
|
14
|
+
node = node[key];
|
|
15
|
+
} else {
|
|
16
|
+
logger.warn(`Could not resolve $ref "${$ref}"`);
|
|
17
|
+
return void 0;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
if (node && typeof node === "object" && node.$ref) {
|
|
21
|
+
if (visited.includes(node.$ref)) {
|
|
22
|
+
logger.warn(`Could not resolve circular $ref "${$ref}"`);
|
|
23
|
+
return void 0;
|
|
24
|
+
}
|
|
25
|
+
return resolveDocumentRef(schema, node.$ref, {
|
|
26
|
+
...options,
|
|
27
|
+
logger,
|
|
28
|
+
visited: [...visited, node.$ref]
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
return node;
|
|
32
|
+
}
|
|
33
|
+
function walkDocument(obj, cb, path = []) {
|
|
34
|
+
if (!obj || typeof obj !== "object") {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (Array.isArray(obj)) {
|
|
38
|
+
for (let i = 0; i < obj.length; i++) {
|
|
39
|
+
walkDocument(obj[i], cb, path.concat(i));
|
|
40
|
+
}
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
cb(obj, path);
|
|
44
|
+
for (const k of Object.keys(obj)) {
|
|
45
|
+
walkDocument(obj[k], cb, path.concat(k));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export { resolveDocumentRef, walkDocument };
|
|
50
|
+
//# sourceMappingURL=document-refs.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-refs.mjs","sources":["../../src/api/document-refs.ts"],"sourcesContent":["import { parseRef } from \"@redocly/openapi-core/lib/ref-utils.js\";\nimport type { Logger } from \"../application/ports/logger.js\";\nimport { defaultLogger } from \"./default-ports.js\";\n\n/** `$ref` resolution and the document walk that the generator's pre-pass uses. */\n\nexport interface ResolveRefOptions {\n silent: boolean;\n visited?: string[];\n /** @internal Where warnings go; the default terminal logger (respecting `silent`) if absent. */\n logger?: Logger;\n}\n\n/** Resolve a `$ref` in a document; warns and returns undefined when it cannot. */\nexport function resolveDocumentRef<T>(\n schema: any,\n $ref: string,\n options: ResolveRefOptions,\n): T | undefined {\n const { visited = [] } = options;\n const logger = options.logger ?? defaultLogger(options.silent ?? false);\n const { pointer } = parseRef($ref);\n if (!pointer.length) {\n return undefined;\n }\n let node = schema;\n for (const key of pointer) {\n if (node && typeof node === \"object\" && node[key]) {\n node = node[key];\n } else {\n logger.warn(`Could not resolve $ref \"${$ref}\"`);\n return undefined;\n }\n }\n\n // if this is also a $ref, keep tracing\n if (node && typeof node === \"object\" && node.$ref) {\n if (visited.includes(node.$ref)) {\n logger.warn(`Could not resolve circular $ref \"${$ref}\"`);\n return undefined;\n }\n return resolveDocumentRef(schema, node.$ref, {\n ...options,\n logger,\n visited: [...visited, node.$ref],\n });\n }\n\n return node;\n}\n\n/** Call `cb` for every object in a JSON-serializable (non-circular) value, depth first. */\nexport function walkDocument(\n obj: unknown,\n cb: (value: Record<string, unknown>, path: (string | number)[]) => void,\n path: (string | number)[] = [],\n): void {\n if (!obj || typeof obj !== \"object\") {\n return;\n }\n if (Array.isArray(obj)) {\n for (let i = 0; i < obj.length; i++) {\n walkDocument(obj[i], cb, path.concat(i));\n }\n return;\n }\n cb(obj as Record<string, unknown>, path);\n for (const k of Object.keys(obj)) {\n walkDocument((obj as Record<string, unknown>)[k], cb, path.concat(k));\n }\n}\n"],"names":[],"mappings":";;;AAcO,SAAS,kBAAA,CACd,MAAA,EACA,IAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,EAAE,OAAA,GAAU,EAAC,EAAE,GAAI,OAAA;AACzB,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA,IAAU,aAAA,CAAc,OAAA,CAAQ,UAAU,KAAK,CAAA;AACtE,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,QAAA,CAAS,IAAI,CAAA;AACjC,EAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,GAAO,MAAA;AACX,EAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,IAAA,IAAI,QAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,GAAG,CAAA,EAAG;AACjD,MAAA,IAAA,GAAO,KAAK,GAAG,CAAA;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,wBAAA,EAA2B,IAAI,CAAA,CAAA,CAAG,CAAA;AAC9C,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,KAAK,IAAA,EAAM;AACjD,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,EAAG;AAC/B,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,iCAAA,EAAoC,IAAI,CAAA,CAAA,CAAG,CAAA;AACvD,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAO,kBAAA,CAAmB,MAAA,EAAQ,IAAA,CAAK,IAAA,EAAM;AAAA,MAC3C,GAAG,OAAA;AAAA,MACH,MAAA;AAAA,MACA,OAAA,EAAS,CAAC,GAAG,OAAA,EAAS,KAAK,IAAI;AAAA,KAChC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,YAAA,CACd,GAAA,EACA,EAAA,EACA,IAAA,GAA4B,EAAC,EACvB;AACN,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACnC,IAAA;AAAA,EACF;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,MAAA,YAAA,CAAa,IAAI,CAAC,CAAA,EAAG,IAAI,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,IACzC;AACA,IAAA;AAAA,EACF;AACA,EAAA,EAAA,CAAG,KAAgC,IAAI,CAAA;AACvC,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AAChC,IAAA,YAAA,CAAc,IAAgC,CAAC,CAAA,EAAG,IAAI,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,EACtE;AACF;;"}
|