openapi-typesafe 0.0.0 → 1.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +71 -1
- package/bin/cli.js +4 -0
- package/dist/adapters/node-file-system/node-file-system.cjs +46 -0
- package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -0
- package/dist/adapters/node-file-system/node-file-system.mjs +40 -0
- package/dist/adapters/node-file-system/node-file-system.mjs.map +1 -0
- package/dist/adapters/redocly-loader/alias-limit.cjs +16 -0
- package/dist/adapters/redocly-loader/alias-limit.cjs.map +1 -0
- package/dist/adapters/redocly-loader/alias-limit.mjs +14 -0
- package/dist/adapters/redocly-loader/alias-limit.mjs.map +1 -0
- package/dist/adapters/redocly-loader/allowed-hosts.cjs +42 -0
- package/dist/adapters/redocly-loader/allowed-hosts.cjs.map +1 -0
- package/dist/adapters/redocly-loader/allowed-hosts.mjs +40 -0
- package/dist/adapters/redocly-loader/allowed-hosts.mjs.map +1 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.cjs +53 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.cjs.map +1 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.mjs +51 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.mjs.map +1 -0
- package/dist/adapters/redocly-loader/malformed-refs.cjs +41 -0
- package/dist/adapters/redocly-loader/malformed-refs.cjs.map +1 -0
- package/dist/adapters/redocly-loader/malformed-refs.mjs +38 -0
- package/dist/adapters/redocly-loader/malformed-refs.mjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-config-source.cjs +61 -0
- package/dist/adapters/redocly-loader/redocly-config-source.cjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-config-source.mjs +54 -0
- package/dist/adapters/redocly-loader/redocly-config-source.mjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +179 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +177 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-access.cjs +107 -0
- package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-access.mjs +99 -0
- package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-holders.cjs +31 -0
- package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-holders.mjs +29 -0
- package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -0
- package/dist/adapters/redocly-loader/remote-fetch.cjs +60 -0
- package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -0
- package/dist/adapters/redocly-loader/remote-fetch.mjs +56 -0
- package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-load-errors.cjs +87 -0
- package/dist/adapters/redocly-loader/schema-load-errors.cjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-load-errors.mjs +77 -0
- package/dist/adapters/redocly-loader/schema-load-errors.mjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-source.cjs +104 -0
- package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-source.mjs +98 -0
- package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -0
- package/dist/adapters/redocly-loader/unsupported-keys.cjs +62 -0
- package/dist/adapters/redocly-loader/unsupported-keys.cjs.map +1 -0
- package/dist/adapters/redocly-loader/unsupported-keys.mjs +58 -0
- package/dist/adapters/redocly-loader/unsupported-keys.mjs.map +1 -0
- package/dist/adapters/terminal-logger/terminal-logger.cjs +67 -0
- package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -0
- package/dist/adapters/terminal-logger/terminal-logger.mjs +59 -0
- package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.cjs +21 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.mjs +17 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.cjs +75 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.mjs +71 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs +148 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs +142 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/lazy-node.cjs +23 -0
- package/dist/adapters/type-ast-bridge/lazy-node.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/lazy-node.mjs +21 -0
- package/dist/adapters/type-ast-bridge/lazy-node.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/load-typescript.cjs +57 -0
- package/dist/adapters/type-ast-bridge/load-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/load-typescript.mjs +51 -0
- package/dist/adapters/type-ast-bridge/load-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/print-typescript.cjs +21 -0
- package/dist/adapters/type-ast-bridge/print-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/print-typescript.mjs +19 -0
- package/dist/adapters/type-ast-bridge/print-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.cjs +33 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.mjs +29 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.cjs +210 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.mjs +207 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.mjs.map +1 -0
- package/dist/api/ast-to-string.cjs +39 -0
- package/dist/api/ast-to-string.cjs.map +1 -0
- package/dist/api/ast-to-string.mjs +37 -0
- package/dist/api/ast-to-string.mjs.map +1 -0
- package/dist/api/comment-header.cjs +11 -0
- package/dist/api/comment-header.cjs.map +1 -0
- package/dist/api/comment-header.mjs +9 -0
- package/dist/api/comment-header.mjs.map +1 -0
- package/dist/api/default-ports.cjs +38 -0
- package/dist/api/default-ports.cjs.map +1 -0
- package/dist/api/default-ports.mjs +28 -0
- package/dist/api/default-ports.mjs.map +1 -0
- package/dist/api/discriminator-conflict-warnings.cjs +25 -0
- package/dist/api/discriminator-conflict-warnings.cjs.map +1 -0
- package/dist/api/discriminator-conflict-warnings.mjs +23 -0
- package/dist/api/discriminator-conflict-warnings.mjs.map +1 -0
- package/dist/api/discriminator-enum-names.cjs +19 -0
- package/dist/api/discriminator-enum-names.cjs.map +1 -0
- package/dist/api/discriminator-enum-names.mjs +17 -0
- package/dist/api/discriminator-enum-names.mjs.map +1 -0
- package/dist/api/discriminator-enum-parent.cjs +59 -0
- package/dist/api/discriminator-enum-parent.cjs.map +1 -0
- package/dist/api/discriminator-enum-parent.mjs +57 -0
- package/dist/api/discriminator-enum-parent.mjs.map +1 -0
- package/dist/api/discriminator-enum.cjs +69 -0
- package/dist/api/discriminator-enum.cjs.map +1 -0
- package/dist/api/discriminator-enum.mjs +66 -0
- package/dist/api/discriminator-enum.mjs.map +1 -0
- package/dist/api/discriminator-other-owners.cjs +67 -0
- package/dist/api/discriminator-other-owners.cjs.map +1 -0
- package/dist/api/discriminator-other-owners.mjs +64 -0
- package/dist/api/discriminator-other-owners.mjs.map +1 -0
- package/dist/api/discriminator-patch.cjs +88 -0
- package/dist/api/discriminator-patch.cjs.map +1 -0
- package/dist/api/discriminator-patch.mjs +82 -0
- package/dist/api/discriminator-patch.mjs.map +1 -0
- package/dist/api/discriminator-scan.cjs +153 -0
- package/dist/api/discriminator-scan.cjs.map +1 -0
- package/dist/api/discriminator-scan.mjs +150 -0
- package/dist/api/discriminator-scan.mjs.map +1 -0
- package/dist/api/document-declarations.cjs +28 -0
- package/dist/api/document-declarations.cjs.map +1 -0
- package/dist/api/document-declarations.mjs +26 -0
- package/dist/api/document-declarations.mjs.map +1 -0
- package/dist/api/document-refs.cjs +53 -0
- package/dist/api/document-refs.cjs.map +1 -0
- package/dist/api/document-refs.mjs +50 -0
- package/dist/api/document-refs.mjs.map +1 -0
- package/dist/api/document-run.cjs +122 -0
- package/dist/api/document-run.cjs.map +1 -0
- package/dist/api/document-run.mjs +116 -0
- package/dist/api/document-run.mjs.map +1 -0
- package/dist/api/enum-values-warnings.cjs +16 -0
- package/dist/api/enum-values-warnings.cjs.map +1 -0
- package/dist/api/enum-values-warnings.mjs +14 -0
- package/dist/api/enum-values-warnings.mjs.map +1 -0
- package/dist/api/footer-entry.cjs +18 -0
- package/dist/api/footer-entry.cjs.map +1 -0
- package/dist/api/footer-entry.mjs +15 -0
- package/dist/api/footer-entry.mjs.map +1 -0
- package/dist/api/footer-sink.cjs +53 -0
- package/dist/api/footer-sink.cjs.map +1 -0
- package/dist/api/footer-sink.mjs +51 -0
- package/dist/api/footer-sink.mjs.map +1 -0
- package/dist/api/legacy-callback-warning.cjs +25 -0
- package/dist/api/legacy-callback-warning.cjs.map +1 -0
- package/dist/api/legacy-callback-warning.mjs +22 -0
- package/dist/api/legacy-callback-warning.mjs.map +1 -0
- package/dist/api/legacy-ts-helpers.cjs +203 -0
- package/dist/api/legacy-ts-helpers.cjs.map +1 -0
- package/dist/api/legacy-ts-helpers.mjs +187 -0
- package/dist/api/legacy-ts-helpers.mjs.map +1 -0
- package/dist/api/legacy-utils.cjs +65 -0
- package/dist/api/legacy-utils.cjs.map +1 -0
- package/dist/api/legacy-utils.mjs +50 -0
- package/dist/api/legacy-utils.mjs.map +1 -0
- package/dist/api/openapi-ts.cjs +40 -0
- package/dist/api/openapi-ts.cjs.map +1 -0
- package/dist/api/openapi-ts.mjs +34 -0
- package/dist/api/openapi-ts.mjs.map +1 -0
- package/dist/api/path-template-warnings.cjs +21 -0
- package/dist/api/path-template-warnings.cjs.map +1 -0
- package/dist/api/path-template-warnings.mjs +19 -0
- package/dist/api/path-template-warnings.mjs.map +1 -0
- package/dist/api/schema-callbacks.cjs +140 -0
- package/dist/api/schema-callbacks.cjs.map +1 -0
- package/dist/api/schema-callbacks.mjs +136 -0
- package/dist/api/schema-callbacks.mjs.map +1 -0
- package/dist/api/string-to-ast.cjs +21 -0
- package/dist/api/string-to-ast.cjs.map +1 -0
- package/dist/api/string-to-ast.mjs +18 -0
- package/dist/api/string-to-ast.mjs.map +1 -0
- package/dist/api/transform-context.cjs +84 -0
- package/dist/api/transform-context.cjs.map +1 -0
- package/dist/api/transform-context.mjs +67 -0
- package/dist/api/transform-context.mjs.map +1 -0
- package/dist/api/transform-schema.cjs +80 -0
- package/dist/api/transform-schema.cjs.map +1 -0
- package/dist/api/transform-schema.mjs +75 -0
- package/dist/api/transform-schema.mjs.map +1 -0
- package/dist/api/type-helpers.cjs +85 -0
- package/dist/api/type-helpers.cjs.map +1 -0
- package/dist/api/type-helpers.mjs +66 -0
- package/dist/api/type-helpers.mjs.map +1 -0
- package/dist/api/unsupported-feature-warnings.cjs +22 -0
- package/dist/api/unsupported-feature-warnings.cjs.map +1 -0
- package/dist/api/unsupported-feature-warnings.mjs +20 -0
- package/dist/api/unsupported-feature-warnings.mjs.map +1 -0
- package/dist/application/print/comment-writer.cjs +95 -0
- package/dist/application/print/comment-writer.cjs.map +1 -0
- package/dist/application/print/comment-writer.mjs +93 -0
- package/dist/application/print/comment-writer.mjs.map +1 -0
- package/dist/application/print/declaration-printer.cjs +83 -0
- package/dist/application/print/declaration-printer.cjs.map +1 -0
- package/dist/application/print/declaration-printer.mjs +81 -0
- package/dist/application/print/declaration-printer.mjs.map +1 -0
- package/dist/application/print/literal-text.cjs +52 -0
- package/dist/application/print/literal-text.cjs.map +1 -0
- package/dist/application/print/literal-text.mjs +48 -0
- package/dist/application/print/literal-text.mjs.map +1 -0
- package/dist/application/print/print-nodes.cjs +38 -0
- package/dist/application/print/print-nodes.cjs.map +1 -0
- package/dist/application/print/print-nodes.mjs +36 -0
- package/dist/application/print/print-nodes.mjs.map +1 -0
- package/dist/application/print/print-options.cjs +6 -0
- package/dist/application/print/print-options.cjs.map +1 -0
- package/dist/application/print/print-options.mjs +4 -0
- package/dist/application/print/print-options.mjs.map +1 -0
- package/dist/application/print/text-writer.cjs +63 -0
- package/dist/application/print/text-writer.cjs.map +1 -0
- package/dist/application/print/text-writer.mjs +60 -0
- package/dist/application/print/text-writer.mjs.map +1 -0
- package/dist/application/print/type-printer.cjs +219 -0
- package/dist/application/print/type-printer.cjs.map +1 -0
- package/dist/application/print/type-printer.mjs +215 -0
- package/dist/application/print/type-printer.mjs.map +1 -0
- package/dist/application/stack-overflow.cjs +36 -0
- package/dist/application/stack-overflow.cjs.map +1 -0
- package/dist/application/stack-overflow.mjs +31 -0
- package/dist/application/stack-overflow.mjs.map +1 -0
- package/dist/application/transform/document/assignability.cjs +144 -0
- package/dist/application/transform/document/assignability.cjs.map +1 -0
- package/dist/application/transform/document/assignability.mjs +138 -0
- package/dist/application/transform/document/assignability.mjs.map +1 -0
- package/dist/application/transform/document/components.cjs +104 -0
- package/dist/application/transform/document/components.cjs.map +1 -0
- package/dist/application/transform/document/components.mjs +102 -0
- package/dist/application/transform/document/components.mjs.map +1 -0
- package/dist/application/transform/document/declared-types.cjs +66 -0
- package/dist/application/transform/document/declared-types.cjs.map +1 -0
- package/dist/application/transform/document/declared-types.mjs +63 -0
- package/dist/application/transform/document/declared-types.mjs.map +1 -0
- package/dist/application/transform/document/defs-root.cjs +18 -0
- package/dist/application/transform/document/defs-root.cjs.map +1 -0
- package/dist/application/transform/document/defs-root.mjs +16 -0
- package/dist/application/transform/document/defs-root.mjs.map +1 -0
- package/dist/application/transform/document/document-member.cjs +13 -0
- package/dist/application/transform/document/document-member.cjs.map +1 -0
- package/dist/application/transform/document/document-member.mjs +11 -0
- package/dist/application/transform/document/document-member.mjs.map +1 -0
- package/dist/application/transform/document/document.cjs +109 -0
- package/dist/application/transform/document/document.cjs.map +1 -0
- package/dist/application/transform/document/document.mjs +106 -0
- package/dist/application/transform/document/document.mjs.map +1 -0
- package/dist/application/transform/document/exploded-query.cjs +46 -0
- package/dist/application/transform/document/exploded-query.cjs.map +1 -0
- package/dist/application/transform/document/exploded-query.mjs +43 -0
- package/dist/application/transform/document/exploded-query.mjs.map +1 -0
- package/dist/application/transform/document/global-type-references.cjs +63 -0
- package/dist/application/transform/document/global-type-references.cjs.map +1 -0
- package/dist/application/transform/document/global-type-references.mjs +61 -0
- package/dist/application/transform/document/global-type-references.mjs.map +1 -0
- package/dist/application/transform/document/header.cjs +27 -0
- package/dist/application/transform/document/header.cjs.map +1 -0
- package/dist/application/transform/document/header.mjs +25 -0
- package/dist/application/transform/document/header.mjs.map +1 -0
- package/dist/application/transform/document/kept-deprecated.cjs +96 -0
- package/dist/application/transform/document/kept-deprecated.cjs.map +1 -0
- package/dist/application/transform/document/kept-deprecated.mjs +94 -0
- package/dist/application/transform/document/kept-deprecated.mjs.map +1 -0
- package/dist/application/transform/document/list-assignability.cjs +54 -0
- package/dist/application/transform/document/list-assignability.cjs.map +1 -0
- package/dist/application/transform/document/list-assignability.mjs +52 -0
- package/dist/application/transform/document/list-assignability.mjs.map +1 -0
- package/dist/application/transform/document/media-type.cjs +42 -0
- package/dist/application/transform/document/media-type.cjs.map +1 -0
- package/dist/application/transform/document/media-type.mjs +38 -0
- package/dist/application/transform/document/media-type.mjs.map +1 -0
- package/dist/application/transform/document/operation.cjs +45 -0
- package/dist/application/transform/document/operation.cjs.map +1 -0
- package/dist/application/transform/document/operation.mjs +43 -0
- package/dist/application/transform/document/operation.mjs.map +1 -0
- package/dist/application/transform/document/parameter.cjs +25 -0
- package/dist/application/transform/document/parameter.cjs.map +1 -0
- package/dist/application/transform/document/parameter.mjs +23 -0
- package/dist/application/transform/document/parameter.mjs.map +1 -0
- package/dist/application/transform/document/parameters.cjs +146 -0
- package/dist/application/transform/document/parameters.cjs.map +1 -0
- package/dist/application/transform/document/parameters.mjs +144 -0
- package/dist/application/transform/document/parameters.mjs.map +1 -0
- package/dist/application/transform/document/path-item.cjs +82 -0
- package/dist/application/transform/document/path-item.cjs.map +1 -0
- package/dist/application/transform/document/path-item.mjs +80 -0
- package/dist/application/transform/document/path-item.mjs.map +1 -0
- package/dist/application/transform/document/path-key-overlaps.cjs +107 -0
- package/dist/application/transform/document/path-key-overlaps.cjs.map +1 -0
- package/dist/application/transform/document/path-key-overlaps.mjs +105 -0
- package/dist/application/transform/document/path-key-overlaps.mjs.map +1 -0
- package/dist/application/transform/document/path-template-replace.cjs +48 -0
- package/dist/application/transform/document/path-template-replace.cjs.map +1 -0
- package/dist/application/transform/document/path-template-replace.mjs +45 -0
- package/dist/application/transform/document/path-template-replace.mjs.map +1 -0
- package/dist/application/transform/document/paths-enum.cjs +75 -0
- package/dist/application/transform/document/paths-enum.cjs.map +1 -0
- package/dist/application/transform/document/paths-enum.mjs +72 -0
- package/dist/application/transform/document/paths-enum.mjs.map +1 -0
- package/dist/application/transform/document/paths.cjs +153 -0
- package/dist/application/transform/document/paths.cjs.map +1 -0
- package/dist/application/transform/document/paths.mjs +149 -0
- package/dist/application/transform/document/paths.mjs.map +1 -0
- package/dist/application/transform/document/request-body.cjs +36 -0
- package/dist/application/transform/document/request-body.cjs.map +1 -0
- package/dist/application/transform/document/request-body.mjs +34 -0
- package/dist/application/transform/document/request-body.mjs.map +1 -0
- package/dist/application/transform/document/response.cjs +59 -0
- package/dist/application/transform/document/response.cjs.map +1 -0
- package/dist/application/transform/document/response.mjs +57 -0
- package/dist/application/transform/document/response.mjs.map +1 -0
- package/dist/application/transform/document/responses.cjs +23 -0
- package/dist/application/transform/document/responses.cjs.map +1 -0
- package/dist/application/transform/document/responses.mjs +21 -0
- package/dist/application/transform/document/responses.mjs.map +1 -0
- package/dist/application/transform/document/root-type-aliases.cjs +70 -0
- package/dist/application/transform/document/root-type-aliases.cjs.map +1 -0
- package/dist/application/transform/document/root-type-aliases.mjs +67 -0
- package/dist/application/transform/document/root-type-aliases.mjs.map +1 -0
- package/dist/application/transform/document/template-key-match.cjs +128 -0
- package/dist/application/transform/document/template-key-match.cjs.map +1 -0
- package/dist/application/transform/document/template-key-match.mjs +125 -0
- package/dist/application/transform/document/template-key-match.mjs.map +1 -0
- package/dist/application/transform/document/type-assignability.cjs +192 -0
- package/dist/application/transform/document/type-assignability.cjs.map +1 -0
- package/dist/application/transform/document/type-assignability.mjs +190 -0
- package/dist/application/transform/document/type-assignability.mjs.map +1 -0
- package/dist/application/transform/document/type-key.cjs +70 -0
- package/dist/application/transform/document/type-key.cjs.map +1 -0
- package/dist/application/transform/document/type-key.mjs +68 -0
- package/dist/application/transform/document/type-key.mjs.map +1 -0
- package/dist/application/transform/document/type-resolution.cjs +131 -0
- package/dist/application/transform/document/type-resolution.cjs.map +1 -0
- package/dist/application/transform/document/type-resolution.mjs +125 -0
- package/dist/application/transform/document/type-resolution.mjs.map +1 -0
- package/dist/application/transform/document/webhooks.cjs +19 -0
- package/dist/application/transform/document/webhooks.cjs.map +1 -0
- package/dist/application/transform/document/webhooks.mjs +17 -0
- package/dist/application/transform/document/webhooks.mjs.map +1 -0
- package/dist/application/transform/document-entries.cjs +17 -0
- package/dist/application/transform/document-entries.cjs.map +1 -0
- package/dist/application/transform/document-entries.mjs +14 -0
- package/dist/application/transform/document-entries.mjs.map +1 -0
- package/dist/application/transform/footer/document-footer.cjs +150 -0
- package/dist/application/transform/footer/document-footer.cjs.map +1 -0
- package/dist/application/transform/footer/document-footer.mjs +148 -0
- package/dist/application/transform/footer/document-footer.mjs.map +1 -0
- package/dist/application/transform/footer/enum-naming.cjs +138 -0
- package/dist/application/transform/footer/enum-naming.cjs.map +1 -0
- package/dist/application/transform/footer/enum-naming.mjs +131 -0
- package/dist/application/transform/footer/enum-naming.mjs.map +1 -0
- package/dist/application/transform/footer/enum-values-check.cjs +129 -0
- package/dist/application/transform/footer/enum-values-check.cjs.map +1 -0
- package/dist/application/transform/footer/enum-values-check.mjs +127 -0
- package/dist/application/transform/footer/enum-values-check.mjs.map +1 -0
- package/dist/application/transform/footer/evaluation.cjs +33 -0
- package/dist/application/transform/footer/evaluation.cjs.map +1 -0
- package/dist/application/transform/footer/evaluation.mjs +26 -0
- package/dist/application/transform/footer/evaluation.mjs.map +1 -0
- package/dist/application/transform/footer/shared-enum-names.cjs +60 -0
- package/dist/application/transform/footer/shared-enum-names.cjs.map +1 -0
- package/dist/application/transform/footer/shared-enum-names.mjs +57 -0
- package/dist/application/transform/footer/shared-enum-names.mjs.map +1 -0
- package/dist/application/transform/footer/type-evaluation.cjs +246 -0
- package/dist/application/transform/footer/type-evaluation.cjs.map +1 -0
- package/dist/application/transform/footer/type-evaluation.mjs +244 -0
- package/dist/application/transform/footer/type-evaluation.mjs.map +1 -0
- package/dist/application/transform/footer/type-rules.cjs +172 -0
- package/dist/application/transform/footer/type-rules.cjs.map +1 -0
- package/dist/application/transform/footer/type-rules.mjs +166 -0
- package/dist/application/transform/footer/type-rules.mjs.map +1 -0
- package/dist/application/transform/helper-types.cjs +68 -0
- package/dist/application/transform/helper-types.cjs.map +1 -0
- package/dist/application/transform/helper-types.mjs +65 -0
- package/dist/application/transform/helper-types.mjs.map +1 -0
- package/dist/application/transform/literal-type.cjs +36 -0
- package/dist/application/transform/literal-type.cjs.map +1 -0
- package/dist/application/transform/literal-type.mjs +34 -0
- package/dist/application/transform/literal-type.mjs.map +1 -0
- package/dist/application/transform/numbered-names.cjs +18 -0
- package/dist/application/transform/numbered-names.cjs.map +1 -0
- package/dist/application/transform/numbered-names.mjs +16 -0
- package/dist/application/transform/numbered-names.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/generated-location.cjs +138 -0
- package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/generated-location.mjs +136 -0
- package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/generated-shape.cjs +171 -0
- package/dist/application/transform/ref-pointer/generated-shape.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/generated-shape.mjs +162 -0
- package/dist/application/transform/ref-pointer/generated-shape.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/inline-cycles.cjs +44 -0
- package/dist/application/transform/ref-pointer/inline-cycles.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/inline-cycles.mjs +42 -0
- package/dist/application/transform/ref-pointer/inline-cycles.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/original-index.cjs +62 -0
- package/dist/application/transform/ref-pointer/original-index.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/original-index.mjs +60 -0
- package/dist/application/transform/ref-pointer/original-index.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/pointer-type.cjs +60 -0
- package/dist/application/transform/ref-pointer/pointer-type.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/pointer-type.mjs +57 -0
- package/dist/application/transform/ref-pointer/pointer-type.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/pointer-walk.cjs +66 -0
- package/dist/application/transform/ref-pointer/pointer-walk.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/pointer-walk.mjs +56 -0
- package/dist/application/transform/ref-pointer/pointer-walk.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/typed-walk.cjs +124 -0
- package/dist/application/transform/ref-pointer/typed-walk.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/typed-walk.mjs +122 -0
- package/dist/application/transform/ref-pointer/typed-walk.mjs.map +1 -0
- package/dist/application/transform/ref-type.cjs +62 -0
- package/dist/application/transform/ref-type.cjs.map +1 -0
- package/dist/application/transform/ref-type.mjs +55 -0
- package/dist/application/transform/ref-type.mjs.map +1 -0
- package/dist/application/transform/schema/access-flags.cjs +38 -0
- package/dist/application/transform/schema/access-flags.cjs.map +1 -0
- package/dist/application/transform/schema/access-flags.mjs +36 -0
- package/dist/application/transform/schema/access-flags.mjs.map +1 -0
- package/dist/application/transform/schema/array-type.cjs +136 -0
- package/dist/application/transform/schema/array-type.cjs.map +1 -0
- package/dist/application/transform/schema/array-type.mjs +134 -0
- package/dist/application/transform/schema/array-type.mjs.map +1 -0
- package/dist/application/transform/schema/composition-type.cjs +142 -0
- package/dist/application/transform/schema/composition-type.cjs.map +1 -0
- package/dist/application/transform/schema/composition-type.mjs +140 -0
- package/dist/application/transform/schema/composition-type.mjs.map +1 -0
- package/dist/application/transform/schema/core-type.cjs +86 -0
- package/dist/application/transform/schema/core-type.cjs.map +1 -0
- package/dist/application/transform/schema/core-type.mjs +84 -0
- package/dist/application/transform/schema/core-type.mjs.map +1 -0
- package/dist/application/transform/schema/discriminated-union.cjs +30 -0
- package/dist/application/transform/schema/discriminated-union.cjs.map +1 -0
- package/dist/application/transform/schema/discriminated-union.mjs +27 -0
- package/dist/application/transform/schema/discriminated-union.mjs.map +1 -0
- package/dist/application/transform/schema/discriminator-property.cjs +22 -0
- package/dist/application/transform/schema/discriminator-property.cjs.map +1 -0
- package/dist/application/transform/schema/discriminator-property.mjs +20 -0
- package/dist/application/transform/schema/discriminator-property.mjs.map +1 -0
- package/dist/application/transform/schema/enum-rule.cjs +163 -0
- package/dist/application/transform/schema/enum-rule.cjs.map +1 -0
- package/dist/application/transform/schema/enum-rule.mjs +160 -0
- package/dist/application/transform/schema/enum-rule.mjs.map +1 -0
- package/dist/application/transform/schema/inherited-discriminator.cjs +29 -0
- package/dist/application/transform/schema/inherited-discriminator.cjs.map +1 -0
- package/dist/application/transform/schema/inherited-discriminator.mjs +26 -0
- package/dist/application/transform/schema/inherited-discriminator.mjs.map +1 -0
- package/dist/application/transform/schema/object-type.cjs +186 -0
- package/dist/application/transform/schema/object-type.cjs.map +1 -0
- package/dist/application/transform/schema/object-type.mjs +182 -0
- package/dist/application/transform/schema/object-type.mjs.map +1 -0
- package/dist/application/transform/schema/presence-members.cjs +59 -0
- package/dist/application/transform/schema/presence-members.cjs.map +1 -0
- package/dist/application/transform/schema/presence-members.mjs +57 -0
- package/dist/application/transform/schema/presence-members.mjs.map +1 -0
- package/dist/application/transform/schema/required-variants.cjs +45 -0
- package/dist/application/transform/schema/required-variants.cjs.map +1 -0
- package/dist/application/transform/schema/required-variants.mjs +42 -0
- package/dist/application/transform/schema/required-variants.mjs.map +1 -0
- package/dist/application/transform/schema/schema-transform.cjs +72 -0
- package/dist/application/transform/schema/schema-transform.cjs.map +1 -0
- package/dist/application/transform/schema/schema-transform.mjs +68 -0
- package/dist/application/transform/schema/schema-transform.mjs.map +1 -0
- package/dist/application/transform/schema/unevaluated-properties.cjs +61 -0
- package/dist/application/transform/schema/unevaluated-properties.cjs.map +1 -0
- package/dist/application/transform/schema/unevaluated-properties.mjs +59 -0
- package/dist/application/transform/schema/unevaluated-properties.mjs.map +1 -0
- package/dist/application/transform/schema-comment.cjs +130 -0
- package/dist/application/transform/schema-comment.cjs.map +1 -0
- package/dist/application/transform/schema-comment.mjs +125 -0
- package/dist/application/transform/schema-comment.mjs.map +1 -0
- package/dist/application/transform/shared-types.cjs +8 -0
- package/dist/application/transform/shared-types.cjs.map +1 -0
- package/dist/application/transform/shared-types.mjs +6 -0
- package/dist/application/transform/shared-types.mjs.map +1 -0
- package/dist/application/transform/type-combinators.cjs +49 -0
- package/dist/application/transform/type-combinators.cjs.map +1 -0
- package/dist/application/transform/type-combinators.mjs +42 -0
- package/dist/application/transform/type-combinators.mjs.map +1 -0
- package/dist/cli/cli-arguments.cjs +145 -0
- package/dist/cli/cli-arguments.cjs.map +1 -0
- package/dist/cli/cli-arguments.mjs +137 -0
- package/dist/cli/cli-arguments.mjs.map +1 -0
- package/dist/cli/cli-errors.cjs +81 -0
- package/dist/cli/cli-errors.cjs.map +1 -0
- package/dist/cli/cli-errors.mjs +77 -0
- package/dist/cli/cli-errors.mjs.map +1 -0
- package/dist/cli/cli-output.cjs +42 -0
- package/dist/cli/cli-output.cjs.map +1 -0
- package/dist/cli/cli-output.mjs +35 -0
- package/dist/cli/cli-output.mjs.map +1 -0
- package/dist/cli/docs-links.cjs +6 -0
- package/dist/cli/docs-links.cjs.map +1 -0
- package/dist/cli/docs-links.mjs +4 -0
- package/dist/cli/docs-links.mjs.map +1 -0
- package/dist/cli/fix-option.cjs +19 -0
- package/dist/cli/fix-option.cjs.map +1 -0
- package/dist/cli/fix-option.mjs +16 -0
- package/dist/cli/fix-option.mjs.map +1 -0
- package/dist/cli/help-text.cjs +44 -0
- package/dist/cli/help-text.cjs.map +1 -0
- package/dist/cli/help-text.mjs +42 -0
- package/dist/cli/help-text.mjs.map +1 -0
- package/dist/cli/main.cjs +67 -0
- package/dist/cli/main.cjs.map +1 -0
- package/dist/cli/main.d.cts +2 -0
- package/dist/cli/main.d.mts +2 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.mjs +59 -0
- package/dist/cli/main.mjs.map +1 -0
- package/dist/cli/redocly-apis.cjs +69 -0
- package/dist/cli/redocly-apis.cjs.map +1 -0
- package/dist/cli/redocly-apis.mjs +66 -0
- package/dist/cli/redocly-apis.mjs.map +1 -0
- package/dist/cli/ref-limits.cjs +14 -0
- package/dist/cli/ref-limits.cjs.map +1 -0
- package/dist/cli/ref-limits.mjs +12 -0
- package/dist/cli/ref-limits.mjs.map +1 -0
- package/dist/cli/run-cli.cjs +113 -0
- package/dist/cli/run-cli.cjs.map +1 -0
- package/dist/cli/run-cli.mjs +111 -0
- package/dist/cli/run-cli.mjs.map +1 -0
- package/dist/domain/assert-never.cjs +8 -0
- package/dist/domain/assert-never.cjs.map +1 -0
- package/dist/domain/assert-never.mjs +6 -0
- package/dist/domain/assert-never.mjs.map +1 -0
- package/dist/domain/errors.cjs +52 -0
- package/dist/domain/errors.cjs.map +1 -0
- package/dist/domain/errors.mjs +48 -0
- package/dist/domain/errors.mjs.map +1 -0
- package/dist/domain/ir/constructors.cjs +93 -0
- package/dist/domain/ir/constructors.cjs.map +1 -0
- package/dist/domain/ir/constructors.mjs +74 -0
- package/dist/domain/ir/constructors.mjs.map +1 -0
- package/dist/domain/ir/identifier-text.cjs +29 -0
- package/dist/domain/ir/identifier-text.cjs.map +1 -0
- package/dist/domain/ir/identifier-text.mjs +25 -0
- package/dist/domain/ir/identifier-text.mjs.map +1 -0
- package/dist/domain/ir/newer-identifier-ranges.cjs +109 -0
- package/dist/domain/ir/newer-identifier-ranges.cjs.map +1 -0
- package/dist/domain/ir/newer-identifier-ranges.mjs +106 -0
- package/dist/domain/ir/newer-identifier-ranges.mjs.map +1 -0
- package/dist/domain/ir/normalize.cjs +32 -0
- package/dist/domain/ir/normalize.cjs.map +1 -0
- package/dist/domain/ir/normalize.mjs +29 -0
- package/dist/domain/ir/normalize.mjs.map +1 -0
- package/dist/domain/ir/property-name.cjs +19 -0
- package/dist/domain/ir/property-name.cjs.map +1 -0
- package/dist/domain/ir/property-name.mjs +16 -0
- package/dist/domain/ir/property-name.mjs.map +1 -0
- package/dist/domain/ir/raw-text-escapes.cjs +25 -0
- package/dist/domain/ir/raw-text-escapes.cjs.map +1 -0
- package/dist/domain/ir/raw-text-escapes.mjs +22 -0
- package/dist/domain/ir/raw-text-escapes.mjs.map +1 -0
- package/dist/domain/openapi/admitted-values.cjs +75 -0
- package/dist/domain/openapi/admitted-values.cjs.map +1 -0
- package/dist/domain/openapi/admitted-values.mjs +72 -0
- package/dist/domain/openapi/admitted-values.mjs.map +1 -0
- package/dist/domain/openapi/alias-expansion.cjs +50 -0
- package/dist/domain/openapi/alias-expansion.cjs.map +1 -0
- package/dist/domain/openapi/alias-expansion.mjs +45 -0
- package/dist/domain/openapi/alias-expansion.mjs.map +1 -0
- package/dist/domain/openapi/binary-content.cjs +48 -0
- package/dist/domain/openapi/binary-content.cjs.map +1 -0
- package/dist/domain/openapi/binary-content.mjs +45 -0
- package/dist/domain/openapi/binary-content.mjs.map +1 -0
- package/dist/domain/openapi/components-object.cjs +29 -0
- package/dist/domain/openapi/components-object.cjs.map +1 -0
- package/dist/domain/openapi/components-object.mjs +24 -0
- package/dist/domain/openapi/components-object.mjs.map +1 -0
- package/dist/domain/openapi/discriminated-union.cjs +68 -0
- package/dist/domain/openapi/discriminated-union.cjs.map +1 -0
- package/dist/domain/openapi/discriminated-union.mjs +62 -0
- package/dist/domain/openapi/discriminated-union.mjs.map +1 -0
- package/dist/domain/openapi/discriminator-conflicts.cjs +143 -0
- package/dist/domain/openapi/discriminator-conflicts.cjs.map +1 -0
- package/dist/domain/openapi/discriminator-conflicts.mjs +141 -0
- package/dist/domain/openapi/discriminator-conflicts.mjs.map +1 -0
- package/dist/domain/openapi/json-pointer.cjs +31 -0
- package/dist/domain/openapi/json-pointer.cjs.map +1 -0
- package/dist/domain/openapi/json-pointer.mjs +27 -0
- package/dist/domain/openapi/json-pointer.mjs.map +1 -0
- package/dist/domain/openapi/media-type-object.cjs +14 -0
- package/dist/domain/openapi/media-type-object.cjs.map +1 -0
- package/dist/domain/openapi/media-type-object.mjs +11 -0
- package/dist/domain/openapi/media-type-object.mjs.map +1 -0
- package/dist/domain/openapi/parameter-object.cjs +13 -0
- package/dist/domain/openapi/parameter-object.cjs.map +1 -0
- package/dist/domain/openapi/parameter-object.mjs +10 -0
- package/dist/domain/openapi/parameter-object.mjs.map +1 -0
- package/dist/domain/openapi/path-item-object.cjs +35 -0
- package/dist/domain/openapi/path-item-object.cjs.map +1 -0
- package/dist/domain/openapi/path-item-object.mjs +30 -0
- package/dist/domain/openapi/path-item-object.mjs.map +1 -0
- package/dist/domain/openapi/path-templates.cjs +23 -0
- package/dist/domain/openapi/path-templates.cjs.map +1 -0
- package/dist/domain/openapi/path-templates.mjs +21 -0
- package/dist/domain/openapi/path-templates.mjs.map +1 -0
- package/dist/domain/openapi/unsupported-features.cjs +87 -0
- package/dist/domain/openapi/unsupported-features.cjs.map +1 -0
- package/dist/domain/openapi/unsupported-features.mjs +84 -0
- package/dist/domain/openapi/unsupported-features.mjs.map +1 -0
- package/dist/domain/output-fixes.cjs +101 -0
- package/dist/domain/output-fixes.cjs.map +1 -0
- package/dist/domain/output-fixes.mjs +94 -0
- package/dist/domain/output-fixes.mjs.map +1 -0
- package/dist/domain/warnings.cjs +15 -0
- package/dist/domain/warnings.cjs.map +1 -0
- package/dist/domain/warnings.mjs +12 -0
- package/dist/domain/warnings.mjs.map +1 -0
- package/dist/index.cjs +98 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +841 -0
- package/dist/index.d.mts +841 -0
- package/dist/index.d.ts +841 -0
- package/dist/index.mjs +27 -0
- package/dist/index.mjs.map +1 -0
- package/dist/transform/components-object.cjs +15 -0
- package/dist/transform/components-object.cjs.map +1 -0
- package/dist/transform/components-object.mjs +11 -0
- package/dist/transform/components-object.mjs.map +1 -0
- package/dist/transform/header-object.cjs +12 -0
- package/dist/transform/header-object.cjs.map +1 -0
- package/dist/transform/header-object.mjs +10 -0
- package/dist/transform/header-object.mjs.map +1 -0
- package/dist/transform/media-type-object.cjs +12 -0
- package/dist/transform/media-type-object.cjs.map +1 -0
- package/dist/transform/media-type-object.mjs +10 -0
- package/dist/transform/media-type-object.mjs.map +1 -0
- package/dist/transform/operation-object.cjs +26 -0
- package/dist/transform/operation-object.cjs.map +1 -0
- package/dist/transform/operation-object.mjs +21 -0
- package/dist/transform/operation-object.mjs.map +1 -0
- package/dist/transform/parameter-object.cjs +12 -0
- package/dist/transform/parameter-object.cjs.map +1 -0
- package/dist/transform/parameter-object.mjs +10 -0
- package/dist/transform/parameter-object.mjs.map +1 -0
- package/dist/transform/path-item-object.cjs +12 -0
- package/dist/transform/path-item-object.cjs.map +1 -0
- package/dist/transform/path-item-object.mjs +10 -0
- package/dist/transform/path-item-object.mjs.map +1 -0
- package/dist/transform/paths-object.cjs +11 -0
- package/dist/transform/paths-object.cjs.map +1 -0
- package/dist/transform/paths-object.mjs +9 -0
- package/dist/transform/paths-object.mjs.map +1 -0
- package/dist/transform/request-body-object.cjs +12 -0
- package/dist/transform/request-body-object.cjs.map +1 -0
- package/dist/transform/request-body-object.mjs +10 -0
- package/dist/transform/request-body-object.mjs.map +1 -0
- package/dist/transform/response-object.cjs +12 -0
- package/dist/transform/response-object.cjs.map +1 -0
- package/dist/transform/response-object.mjs +10 -0
- package/dist/transform/response-object.mjs.map +1 -0
- package/dist/transform/responses-object.cjs +12 -0
- package/dist/transform/responses-object.cjs.map +1 -0
- package/dist/transform/responses-object.mjs +10 -0
- package/dist/transform/responses-object.mjs.map +1 -0
- package/dist/transform/schema-object.cjs +21 -0
- package/dist/transform/schema-object.cjs.map +1 -0
- package/dist/transform/schema-object.mjs +16 -0
- package/dist/transform/schema-object.mjs.map +1 -0
- package/package.json +115 -4
- package/src/adapters/node-file-system/node-file-system.ts +44 -0
- package/src/adapters/redocly-loader/alias-limit.ts +20 -0
- package/src/adapters/redocly-loader/allowed-hosts.ts +62 -0
- package/src/adapters/redocly-loader/bundled-ref-repair.ts +65 -0
- package/src/adapters/redocly-loader/malformed-refs.ts +61 -0
- package/src/adapters/redocly-loader/redocly-config-source.ts +78 -0
- package/src/adapters/redocly-loader/redocly-schema-loader.ts +262 -0
- package/src/adapters/redocly-loader/ref-access.ts +146 -0
- package/src/adapters/redocly-loader/ref-holders.ts +43 -0
- package/src/adapters/redocly-loader/remote-fetch.ts +104 -0
- package/src/adapters/redocly-loader/schema-load-errors.ts +124 -0
- package/src/adapters/redocly-loader/schema-source.ts +151 -0
- package/src/adapters/redocly-loader/unsupported-keys.ts +102 -0
- package/src/adapters/terminal-logger/terminal-logger.ts +98 -0
- package/src/adapters/type-ast-bridge/footer-nodes.ts +38 -0
- package/src/adapters/type-ast-bridge/ir-declarations-to-typescript.ts +100 -0
- package/src/adapters/type-ast-bridge/ir-to-typescript.ts +223 -0
- package/src/adapters/type-ast-bridge/lazy-node.ts +24 -0
- package/src/adapters/type-ast-bridge/load-typescript.ts +84 -0
- package/src/adapters/type-ast-bridge/print-typescript.ts +33 -0
- package/src/adapters/type-ast-bridge/typescript-raw-text.ts +49 -0
- package/src/adapters/type-ast-bridge/typescript-to-ir.ts +294 -0
- package/src/adapters/type-ast-bridge/typescript-types.ts +8 -0
- package/src/api/ast-to-string.ts +59 -0
- package/src/api/comment-header.ts +7 -0
- package/src/api/default-ports.ts +44 -0
- package/src/api/discriminator-conflict-warnings.ts +43 -0
- package/src/api/discriminator-enum-names.ts +26 -0
- package/src/api/discriminator-enum-parent.ts +129 -0
- package/src/api/discriminator-enum.ts +115 -0
- package/src/api/discriminator-other-owners.ts +97 -0
- package/src/api/discriminator-patch.ts +147 -0
- package/src/api/discriminator-scan.ts +260 -0
- package/src/api/document-declarations.ts +41 -0
- package/src/api/document-refs.ts +71 -0
- package/src/api/document-run.ts +177 -0
- package/src/api/enum-values-warnings.ts +21 -0
- package/src/api/footer-entry.ts +23 -0
- package/src/api/footer-sink.ts +67 -0
- package/src/api/legacy-callback-warning.ts +29 -0
- package/src/api/legacy-ts-helpers.ts +311 -0
- package/src/api/legacy-utils.ts +118 -0
- package/src/api/openapi-ts.ts +62 -0
- package/src/api/path-template-warnings.ts +27 -0
- package/src/api/schema-callbacks.ts +211 -0
- package/src/api/string-to-ast.ts +27 -0
- package/src/api/transform-context.ts +93 -0
- package/src/api/transform-schema.ts +123 -0
- package/src/api/type-helpers.ts +130 -0
- package/src/api/unsupported-feature-warnings.ts +33 -0
- package/src/application/ports/file-system.ts +12 -0
- package/src/application/ports/logger.ts +16 -0
- package/src/application/ports/redocly-config-source.ts +20 -0
- package/src/application/ports/schema-loader.ts +32 -0
- package/src/application/print/comment-writer.ts +91 -0
- package/src/application/print/declaration-printer.ts +100 -0
- package/src/application/print/literal-text.ts +62 -0
- package/src/application/print/print-nodes.ts +62 -0
- package/src/application/print/print-options.ts +11 -0
- package/src/application/print/text-writer.ts +83 -0
- package/src/application/print/type-printer.ts +287 -0
- package/src/application/stack-overflow.ts +54 -0
- package/src/application/transform/document/assignability.ts +203 -0
- package/src/application/transform/document/components.ts +189 -0
- package/src/application/transform/document/declared-types.ts +93 -0
- package/src/application/transform/document/defs-root.ts +25 -0
- package/src/application/transform/document/document-member.ts +20 -0
- package/src/application/transform/document/document.ts +215 -0
- package/src/application/transform/document/exploded-query.ts +91 -0
- package/src/application/transform/document/global-type-references.ts +78 -0
- package/src/application/transform/document/header.ts +34 -0
- package/src/application/transform/document/kept-deprecated.ts +135 -0
- package/src/application/transform/document/list-assignability.ts +87 -0
- package/src/application/transform/document/media-type.ts +78 -0
- package/src/application/transform/document/operation.ts +64 -0
- package/src/application/transform/document/parameter.ts +45 -0
- package/src/application/transform/document/parameters.ts +265 -0
- package/src/application/transform/document/path-item.ts +168 -0
- package/src/application/transform/document/path-key-overlaps.ts +201 -0
- package/src/application/transform/document/path-template-replace.ts +90 -0
- package/src/application/transform/document/paths-enum.ts +127 -0
- package/src/application/transform/document/paths.ts +273 -0
- package/src/application/transform/document/request-body.ts +50 -0
- package/src/application/transform/document/response.ts +109 -0
- package/src/application/transform/document/responses.ts +29 -0
- package/src/application/transform/document/root-type-aliases.ts +107 -0
- package/src/application/transform/document/template-key-match.ts +183 -0
- package/src/application/transform/document/type-assignability.ts +268 -0
- package/src/application/transform/document/type-key.ts +80 -0
- package/src/application/transform/document/type-resolution.ts +163 -0
- package/src/application/transform/document/webhooks.ts +22 -0
- package/src/application/transform/document-entries.ts +28 -0
- package/src/application/transform/footer/document-footer.ts +212 -0
- package/src/application/transform/footer/enum-naming.ts +210 -0
- package/src/application/transform/footer/enum-values-check.ts +171 -0
- package/src/application/transform/footer/evaluation.ts +47 -0
- package/src/application/transform/footer/shared-enum-names.ts +86 -0
- package/src/application/transform/footer/type-evaluation.ts +294 -0
- package/src/application/transform/footer/type-rules.ts +269 -0
- package/src/application/transform/helper-types.ts +92 -0
- package/src/application/transform/literal-type.ts +54 -0
- package/src/application/transform/numbered-names.ts +20 -0
- package/src/application/transform/ref-pointer/generated-location.ts +211 -0
- package/src/application/transform/ref-pointer/generated-shape.ts +275 -0
- package/src/application/transform/ref-pointer/inline-cycles.ts +56 -0
- package/src/application/transform/ref-pointer/original-index.ts +95 -0
- package/src/application/transform/ref-pointer/pointer-type.ts +92 -0
- package/src/application/transform/ref-pointer/pointer-walk.ts +96 -0
- package/src/application/transform/ref-pointer/typed-walk.ts +192 -0
- package/src/application/transform/ref-type.ts +102 -0
- package/src/application/transform/schema/access-flags.ts +63 -0
- package/src/application/transform/schema/array-type.ts +213 -0
- package/src/application/transform/schema/composition-type.ts +255 -0
- package/src/application/transform/schema/core-type.ts +119 -0
- package/src/application/transform/schema/discriminated-union.ts +58 -0
- package/src/application/transform/schema/discriminator-property.ts +33 -0
- package/src/application/transform/schema/enum-rule.ts +280 -0
- package/src/application/transform/schema/inherited-discriminator.ts +54 -0
- package/src/application/transform/schema/object-type.ts +289 -0
- package/src/application/transform/schema/presence-members.ts +96 -0
- package/src/application/transform/schema/required-variants.ts +88 -0
- package/src/application/transform/schema/schema-context.ts +136 -0
- package/src/application/transform/schema/schema-rule.ts +29 -0
- package/src/application/transform/schema/schema-transform.ts +99 -0
- package/src/application/transform/schema/unevaluated-properties.ts +105 -0
- package/src/application/transform/schema-comment.ts +196 -0
- package/src/application/transform/shared-types.ts +9 -0
- package/src/application/transform/transform-context.ts +51 -0
- package/src/application/transform/type-combinators.ts +57 -0
- package/src/cli/cli-arguments.ts +208 -0
- package/src/cli/cli-dependencies.ts +47 -0
- package/src/cli/cli-errors.ts +127 -0
- package/src/cli/cli-output.ts +67 -0
- package/src/cli/docs-links.ts +6 -0
- package/src/cli/fix-option.ts +29 -0
- package/src/cli/help-text.ts +52 -0
- package/src/cli/main.ts +73 -0
- package/src/cli/redocly-apis.ts +95 -0
- package/src/cli/ref-limits.ts +16 -0
- package/src/cli/run-cli.ts +131 -0
- package/src/domain/assert-never.ts +8 -0
- package/src/domain/errors.ts +76 -0
- package/src/domain/ir/constructors.ts +142 -0
- package/src/domain/ir/identifier-text.ts +49 -0
- package/src/domain/ir/newer-identifier-ranges.ts +109 -0
- package/src/domain/ir/nodes.ts +225 -0
- package/src/domain/ir/normalize.ts +51 -0
- package/src/domain/ir/property-name.ts +28 -0
- package/src/domain/ir/raw-text-escapes.ts +37 -0
- package/src/domain/openapi/admitted-values.ts +113 -0
- package/src/domain/openapi/alias-expansion.ts +72 -0
- package/src/domain/openapi/binary-content.ts +74 -0
- package/src/domain/openapi/components-object.ts +52 -0
- package/src/domain/openapi/discriminated-union.ts +109 -0
- package/src/domain/openapi/discriminator-conflicts.ts +251 -0
- package/src/domain/openapi/document-object.ts +12 -0
- package/src/domain/openapi/header-object.ts +9 -0
- package/src/domain/openapi/json-pointer.ts +46 -0
- package/src/domain/openapi/media-type-object.ts +26 -0
- package/src/domain/openapi/operation-object.ts +13 -0
- package/src/domain/openapi/parameter-object.ts +34 -0
- package/src/domain/openapi/path-item-object.ts +70 -0
- package/src/domain/openapi/path-templates.ts +31 -0
- package/src/domain/openapi/request-body-object.ts +7 -0
- package/src/domain/openapi/response-object.ts +14 -0
- package/src/domain/openapi/schema-object.ts +61 -0
- package/src/domain/openapi/unsupported-features.ts +139 -0
- package/src/domain/output-fixes.ts +136 -0
- package/src/domain/warnings.ts +20 -0
- package/src/index.ts +67 -0
- package/src/transform/components-object.ts +27 -0
- package/src/transform/header-object.ts +19 -0
- package/src/transform/media-type-object.ts +19 -0
- package/src/transform/operation-object.ts +36 -0
- package/src/transform/parameter-object.ts +19 -0
- package/src/transform/parameters-array.ts +19 -0
- package/src/transform/path-item-object.ts +22 -0
- package/src/transform/paths-enum.ts +8 -0
- package/src/transform/paths-object.ts +15 -0
- package/src/transform/request-body-object.ts +19 -0
- package/src/transform/response-object.ts +19 -0
- package/src/transform/responses-object.ts +19 -0
- package/src/transform/schema-object.ts +36 -0
- package/src/transform/webhooks-object.ts +15 -0
- package/src/types/generator-options.ts +278 -0
- package/src/types/openapi-common.ts +100 -0
- package/src/types/openapi-document.ts +196 -0
- package/src/types/openapi-path-item.ts +130 -0
- package/src/types/openapi-request.ts +209 -0
- package/src/types/openapi-response.ts +81 -0
- package/src/types/openapi-schema.ts +169 -0
- package/src/types/openapi-security.ts +116 -0
- package/src/types.ts +12 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2020 Drew Powers
|
|
4
|
+
Copyright (c) 2026 Fedor Chishchin and openapi-typesafe contributors
|
|
5
|
+
|
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
in the Software without restriction, including without limitation the rights
|
|
9
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
furnished to do so, subject to the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be included in all
|
|
14
|
+
copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,73 @@
|
|
|
1
1
|
# openapi-typesafe
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Generate TypeScript types from [OpenAPI 3.0 and 3.1](https://spec.openapis.org/oas/latest.html) schemas.
|
|
4
|
+
Runs on Node.js; no Java, no running server, no runtime code in the output.
|
|
5
|
+
|
|
6
|
+
A maintained, drop-in successor to `openapi-typescript` (see the [repository README](../../README.md)).
|
|
7
|
+
|
|
8
|
+
> **Status: in development; not published to npm yet.**
|
|
9
|
+
|
|
10
|
+
## Features
|
|
11
|
+
|
|
12
|
+
- OpenAPI 3.0 and 3.1, including discriminators, `oneOf` / `anyOf` / `allOf`, and `$ref` across files.
|
|
13
|
+
- Runtime-free output: only types.
|
|
14
|
+
- Local or remote schemas, YAML or JSON.
|
|
15
|
+
- Swagger 2.0 is not supported.
|
|
16
|
+
|
|
17
|
+
## Setup
|
|
18
|
+
|
|
19
|
+
Requires Node.js 22 or newer.
|
|
20
|
+
|
|
21
|
+
```sh
|
|
22
|
+
npm i -D openapi-typesafe typescript
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Recommended `tsconfig.json` settings:
|
|
26
|
+
|
|
27
|
+
```jsonc
|
|
28
|
+
{
|
|
29
|
+
"compilerOptions": {
|
|
30
|
+
"module": "ESNext", // or "NodeNext"
|
|
31
|
+
"moduleResolution": "Bundler", // or "NodeNext"
|
|
32
|
+
"noUncheckedIndexedAccess": true
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Usage
|
|
38
|
+
|
|
39
|
+
```sh
|
|
40
|
+
# Local schema
|
|
41
|
+
npx openapi-typesafe ./path/to/schema.yaml -o ./path/to/schema.d.ts
|
|
42
|
+
|
|
43
|
+
# Remote schema
|
|
44
|
+
npx openapi-typesafe https://example.com/api/v1/openapi.yaml -o ./path/to/schema.d.ts
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Then import the types:
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
import type { components, paths } from "./path/to/schema";
|
|
51
|
+
|
|
52
|
+
type User = components["schemas"]["User"];
|
|
53
|
+
type GetUserResponse = paths["/users/{id}"]["get"]["responses"][200]["content"]["application/json"];
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
With `"moduleResolution": "NodeNext"`, write the extension: `"./path/to/schema.js"`.
|
|
57
|
+
|
|
58
|
+
Run `npx openapi-typesafe --help` for all options. Generated examples for real APIs are in [`examples/`](./examples).
|
|
59
|
+
|
|
60
|
+
## Migrating from openapi-typescript
|
|
61
|
+
|
|
62
|
+
Replace the package and the binary name; options and output are the same.
|
|
63
|
+
|
|
64
|
+
```diff
|
|
65
|
+
- npx openapi-typescript ./schema.yaml -o ./schema.d.ts
|
|
66
|
+
+ npx openapi-typesafe ./schema.yaml -o ./schema.d.ts
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
The header of generated files names the new generator, so regenerate and commit the output once.
|
|
70
|
+
|
|
71
|
+
## License
|
|
72
|
+
|
|
73
|
+
[MIT](./LICENSE)
|
package/bin/cli.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const fs = require('node:fs');
|
|
4
|
+
const node_url = require('node:url');
|
|
5
|
+
const errors = require('../../domain/errors.cjs');
|
|
6
|
+
|
|
7
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
|
|
8
|
+
|
|
9
|
+
const fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
|
|
10
|
+
|
|
11
|
+
function causeMessage(cause) {
|
|
12
|
+
return cause instanceof Error ? cause.message : String(cause);
|
|
13
|
+
}
|
|
14
|
+
class NodeFileSystem {
|
|
15
|
+
readText(file) {
|
|
16
|
+
try {
|
|
17
|
+
return fs__default.readFileSync(file, "utf8");
|
|
18
|
+
} catch (cause) {
|
|
19
|
+
throw new errors.OpenAPITypesafeError({
|
|
20
|
+
code: errors.ERROR_CODES.OUTPUT_READ_FAILED,
|
|
21
|
+
message: `Cannot read ${node_url.fileURLToPath(file)}: ${causeMessage(cause)}`,
|
|
22
|
+
details: { file: node_url.fileURLToPath(file) },
|
|
23
|
+
cause
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
writeText(file, contents) {
|
|
28
|
+
try {
|
|
29
|
+
fs__default.mkdirSync(new URL(".", file), { recursive: true });
|
|
30
|
+
fs__default.writeFileSync(file, contents, "utf8");
|
|
31
|
+
} catch (cause) {
|
|
32
|
+
throw new errors.OpenAPITypesafeError({
|
|
33
|
+
code: errors.ERROR_CODES.OUTPUT_WRITE_FAILED,
|
|
34
|
+
message: `Cannot write ${node_url.fileURLToPath(file)}: ${causeMessage(cause)}`,
|
|
35
|
+
details: { file: node_url.fileURLToPath(file) },
|
|
36
|
+
cause
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function createNodeFileSystem() {
|
|
42
|
+
return new NodeFileSystem();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
exports.createNodeFileSystem = createNodeFileSystem;
|
|
46
|
+
//# sourceMappingURL=node-file-system.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-file-system.cjs","sources":["../../../src/adapters/node-file-system/node-file-system.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport type { FileReader, FileWriter } from \"../../application/ports/file-system.js\";\nimport { ERROR_CODES, OpenAPITypesafeError } from \"../../domain/errors.js\";\n\n/** The file ports on Node's `fs`, with the failures as typed errors (ADR-011). */\n\nfunction causeMessage(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\n}\n\nclass NodeFileSystem implements FileReader, FileWriter {\n readText(file: URL): string {\n try {\n return fs.readFileSync(file, \"utf8\");\n } catch (cause) {\n throw new OpenAPITypesafeError({\n code: ERROR_CODES.OUTPUT_READ_FAILED,\n message: `Cannot read ${fileURLToPath(file)}: ${causeMessage(cause)}`,\n details: { file: fileURLToPath(file) },\n cause,\n });\n }\n }\n\n writeText(file: URL, contents: string): void {\n try {\n fs.mkdirSync(new URL(\".\", file), { recursive: true });\n fs.writeFileSync(file, contents, \"utf8\");\n } catch (cause) {\n throw new OpenAPITypesafeError({\n code: ERROR_CODES.OUTPUT_WRITE_FAILED,\n message: `Cannot write ${fileURLToPath(file)}: ${causeMessage(cause)}`,\n details: { file: fileURLToPath(file) },\n cause,\n });\n }\n }\n}\n\n/** File access for the CLI. */\nexport function createNodeFileSystem(): FileReader & FileWriter {\n return new NodeFileSystem();\n}\n"],"names":["fs","OpenAPITypesafeError","ERROR_CODES","fileURLToPath"],"mappings":";;;;;;;;;;AAOA,SAAS,aAAa,KAAA,EAAwB;AAC5C,EAAA,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC9D;AAEA,MAAM,cAAA,CAAiD;AAAA,EACrD,SAAS,IAAA,EAAmB;AAC1B,IAAA,IAAI;AACF,MAAA,OAAOA,WAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAM,CAAA;AAAA,IACrC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAIC,2BAAA,CAAqB;AAAA,QAC7B,MAAMC,kBAAA,CAAY,kBAAA;AAAA,QAClB,OAAA,EAAS,eAAeC,sBAAA,CAAc,IAAI,CAAC,CAAA,EAAA,EAAK,YAAA,CAAa,KAAK,CAAC,CAAA,CAAA;AAAA,QACnE,OAAA,EAAS,EAAE,IAAA,EAAMA,sBAAA,CAAc,IAAI,CAAA,EAAE;AAAA,QACrC;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,SAAA,CAAU,MAAW,QAAA,EAAwB;AAC3C,IAAA,IAAI;AACF,MAAAH,WAAA,CAAG,SAAA,CAAU,IAAI,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACpD,MAAAA,WAAA,CAAG,aAAA,CAAc,IAAA,EAAM,QAAA,EAAU,MAAM,CAAA;AAAA,IACzC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAIC,2BAAA,CAAqB;AAAA,QAC7B,MAAMC,kBAAA,CAAY,mBAAA;AAAA,QAClB,OAAA,EAAS,gBAAgBC,sBAAA,CAAc,IAAI,CAAC,CAAA,EAAA,EAAK,YAAA,CAAa,KAAK,CAAC,CAAA,CAAA;AAAA,QACpE,OAAA,EAAS,EAAE,IAAA,EAAMA,sBAAA,CAAc,IAAI,CAAA,EAAE;AAAA,QACrC;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AACF;AAGO,SAAS,oBAAA,GAAgD;AAC9D,EAAA,OAAO,IAAI,cAAA,EAAe;AAC5B;;"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { OpenAPITypesafeError, ERROR_CODES } from '../../domain/errors.mjs';
|
|
4
|
+
|
|
5
|
+
function causeMessage(cause) {
|
|
6
|
+
return cause instanceof Error ? cause.message : String(cause);
|
|
7
|
+
}
|
|
8
|
+
class NodeFileSystem {
|
|
9
|
+
readText(file) {
|
|
10
|
+
try {
|
|
11
|
+
return fs.readFileSync(file, "utf8");
|
|
12
|
+
} catch (cause) {
|
|
13
|
+
throw new OpenAPITypesafeError({
|
|
14
|
+
code: ERROR_CODES.OUTPUT_READ_FAILED,
|
|
15
|
+
message: `Cannot read ${fileURLToPath(file)}: ${causeMessage(cause)}`,
|
|
16
|
+
details: { file: fileURLToPath(file) },
|
|
17
|
+
cause
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
writeText(file, contents) {
|
|
22
|
+
try {
|
|
23
|
+
fs.mkdirSync(new URL(".", file), { recursive: true });
|
|
24
|
+
fs.writeFileSync(file, contents, "utf8");
|
|
25
|
+
} catch (cause) {
|
|
26
|
+
throw new OpenAPITypesafeError({
|
|
27
|
+
code: ERROR_CODES.OUTPUT_WRITE_FAILED,
|
|
28
|
+
message: `Cannot write ${fileURLToPath(file)}: ${causeMessage(cause)}`,
|
|
29
|
+
details: { file: fileURLToPath(file) },
|
|
30
|
+
cause
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function createNodeFileSystem() {
|
|
36
|
+
return new NodeFileSystem();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export { createNodeFileSystem };
|
|
40
|
+
//# sourceMappingURL=node-file-system.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-file-system.mjs","sources":["../../../src/adapters/node-file-system/node-file-system.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport type { FileReader, FileWriter } from \"../../application/ports/file-system.js\";\nimport { ERROR_CODES, OpenAPITypesafeError } from \"../../domain/errors.js\";\n\n/** The file ports on Node's `fs`, with the failures as typed errors (ADR-011). */\n\nfunction causeMessage(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\n}\n\nclass NodeFileSystem implements FileReader, FileWriter {\n readText(file: URL): string {\n try {\n return fs.readFileSync(file, \"utf8\");\n } catch (cause) {\n throw new OpenAPITypesafeError({\n code: ERROR_CODES.OUTPUT_READ_FAILED,\n message: `Cannot read ${fileURLToPath(file)}: ${causeMessage(cause)}`,\n details: { file: fileURLToPath(file) },\n cause,\n });\n }\n }\n\n writeText(file: URL, contents: string): void {\n try {\n fs.mkdirSync(new URL(\".\", file), { recursive: true });\n fs.writeFileSync(file, contents, \"utf8\");\n } catch (cause) {\n throw new OpenAPITypesafeError({\n code: ERROR_CODES.OUTPUT_WRITE_FAILED,\n message: `Cannot write ${fileURLToPath(file)}: ${causeMessage(cause)}`,\n details: { file: fileURLToPath(file) },\n cause,\n });\n }\n }\n}\n\n/** File access for the CLI. */\nexport function createNodeFileSystem(): FileReader & FileWriter {\n return new NodeFileSystem();\n}\n"],"names":[],"mappings":";;;;AAOA,SAAS,aAAa,KAAA,EAAwB;AAC5C,EAAA,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC9D;AAEA,MAAM,cAAA,CAAiD;AAAA,EACrD,SAAS,IAAA,EAAmB;AAC1B,IAAA,IAAI;AACF,MAAA,OAAO,EAAA,CAAG,YAAA,CAAa,IAAA,EAAM,MAAM,CAAA;AAAA,IACrC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,oBAAA,CAAqB;AAAA,QAC7B,MAAM,WAAA,CAAY,kBAAA;AAAA,QAClB,OAAA,EAAS,eAAe,aAAA,CAAc,IAAI,CAAC,CAAA,EAAA,EAAK,YAAA,CAAa,KAAK,CAAC,CAAA,CAAA;AAAA,QACnE,OAAA,EAAS,EAAE,IAAA,EAAM,aAAA,CAAc,IAAI,CAAA,EAAE;AAAA,QACrC;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,SAAA,CAAU,MAAW,QAAA,EAAwB;AAC3C,IAAA,IAAI;AACF,MAAA,EAAA,CAAG,SAAA,CAAU,IAAI,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACpD,MAAA,EAAA,CAAG,aAAA,CAAc,IAAA,EAAM,QAAA,EAAU,MAAM,CAAA;AAAA,IACzC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,oBAAA,CAAqB;AAAA,QAC7B,MAAM,WAAA,CAAY,mBAAA;AAAA,QAClB,OAAA,EAAS,gBAAgB,aAAA,CAAc,IAAI,CAAC,CAAA,EAAA,EAAK,YAAA,CAAa,KAAK,CAAC,CAAA,CAAA;AAAA,QACpE,OAAA,EAAS,EAAE,IAAA,EAAM,aAAA,CAAc,IAAI,CAAA,EAAE;AAAA,QACrC;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AACF;AAGO,SAAS,oBAAA,GAAgD;AAC9D,EAAA,OAAO,IAAI,cAAA,EAAe;AAC5B;;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const aliasExpansion = require('../../domain/openapi/alias-expansion.cjs');
|
|
4
|
+
|
|
5
|
+
function aliasExpansionFailure(parsed) {
|
|
6
|
+
const counts = aliasExpansion.countNodes(parsed);
|
|
7
|
+
if (!aliasExpansion.isAliasExpansionExcessive(counts)) {
|
|
8
|
+
return void 0;
|
|
9
|
+
}
|
|
10
|
+
return new Error(
|
|
11
|
+
`YAML aliases expand the document from ${counts.stored} to ${counts.expanded} nodes, more than ${aliasExpansion.ALIAS_EXPANSION_MAX_RATIO} times its size`
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
exports.aliasExpansionFailure = aliasExpansionFailure;
|
|
16
|
+
//# sourceMappingURL=alias-limit.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alias-limit.cjs","sources":["../../../src/adapters/redocly-loader/alias-limit.ts"],"sourcesContent":["import {\n ALIAS_EXPANSION_MAX_RATIO,\n countNodes,\n isAliasExpansionExcessive,\n} from \"../../domain/openapi/alias-expansion.js\";\n\n/**\n * The reason a parsed YAML document is refused, if its aliases expand it too far. The check runs\n * right after parsing, before Redocly or the generator walk the document (pre-beta test plan 10.2).\n */\nexport function aliasExpansionFailure(parsed: unknown): Error | undefined {\n const counts = countNodes(parsed);\n if (!isAliasExpansionExcessive(counts)) {\n return undefined;\n }\n return new Error(\n `YAML aliases expand the document from ${counts.stored} to ${counts.expanded} nodes, ` +\n `more than ${ALIAS_EXPANSION_MAX_RATIO} times its size`,\n );\n}\n"],"names":["countNodes","isAliasExpansionExcessive","ALIAS_EXPANSION_MAX_RATIO"],"mappings":";;;;AAUO,SAAS,sBAAsB,MAAA,EAAoC;AACxE,EAAA,MAAM,MAAA,GAASA,0BAAW,MAAM,CAAA;AAChC,EAAA,IAAI,CAACC,wCAAA,CAA0B,MAAM,CAAA,EAAG;AACtC,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAI,KAAA;AAAA,IACT,yCAAyC,MAAA,CAAO,MAAM,OAAO,MAAA,CAAO,QAAQ,qBAC7DC,wCAAyB,CAAA,eAAA;AAAA,GAC1C;AACF;;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { countNodes, isAliasExpansionExcessive, ALIAS_EXPANSION_MAX_RATIO } from '../../domain/openapi/alias-expansion.mjs';
|
|
2
|
+
|
|
3
|
+
function aliasExpansionFailure(parsed) {
|
|
4
|
+
const counts = countNodes(parsed);
|
|
5
|
+
if (!isAliasExpansionExcessive(counts)) {
|
|
6
|
+
return void 0;
|
|
7
|
+
}
|
|
8
|
+
return new Error(
|
|
9
|
+
`YAML aliases expand the document from ${counts.stored} to ${counts.expanded} nodes, more than ${ALIAS_EXPANSION_MAX_RATIO} times its size`
|
|
10
|
+
);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export { aliasExpansionFailure };
|
|
14
|
+
//# sourceMappingURL=alias-limit.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alias-limit.mjs","sources":["../../../src/adapters/redocly-loader/alias-limit.ts"],"sourcesContent":["import {\n ALIAS_EXPANSION_MAX_RATIO,\n countNodes,\n isAliasExpansionExcessive,\n} from \"../../domain/openapi/alias-expansion.js\";\n\n/**\n * The reason a parsed YAML document is refused, if its aliases expand it too far. The check runs\n * right after parsing, before Redocly or the generator walk the document (pre-beta test plan 10.2).\n */\nexport function aliasExpansionFailure(parsed: unknown): Error | undefined {\n const counts = countNodes(parsed);\n if (!isAliasExpansionExcessive(counts)) {\n return undefined;\n }\n return new Error(\n `YAML aliases expand the document from ${counts.stored} to ${counts.expanded} nodes, ` +\n `more than ${ALIAS_EXPANSION_MAX_RATIO} times its size`,\n );\n}\n"],"names":[],"mappings":";;AAUO,SAAS,sBAAsB,MAAA,EAAoC;AACxE,EAAA,MAAM,MAAA,GAAS,WAAW,MAAM,CAAA;AAChC,EAAA,IAAI,CAAC,yBAAA,CAA0B,MAAM,CAAA,EAAG;AACtC,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAI,KAAA;AAAA,IACT,yCAAyC,MAAA,CAAO,MAAM,OAAO,MAAA,CAAO,QAAQ,qBAC7D,yBAAyB,CAAA,eAAA;AAAA,GAC1C;AACF;;"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const DEFAULT_PORTS = { "http:": "80", "https:": "443" };
|
|
4
|
+
const FULLY_QUALIFIED_DOT = /\.$/;
|
|
5
|
+
const PORT_SUFFIX = /:(\d+)$/;
|
|
6
|
+
const NOT_A_HOST = /[/?#@\\]/;
|
|
7
|
+
function withBrackets(entry) {
|
|
8
|
+
const isBareIPv6 = !entry.startsWith("[") && entry.split(":").length > 2;
|
|
9
|
+
return isBareIPv6 ? `[${entry}]` : entry;
|
|
10
|
+
}
|
|
11
|
+
function hostnameOf(url) {
|
|
12
|
+
return url.hostname.replace(FULLY_QUALIFIED_DOT, "");
|
|
13
|
+
}
|
|
14
|
+
function portOf(url) {
|
|
15
|
+
return url.port === "" ? DEFAULT_PORTS[url.protocol] ?? "" : url.port;
|
|
16
|
+
}
|
|
17
|
+
function writtenPort(entry) {
|
|
18
|
+
const match = PORT_SUFFIX.exec(entry);
|
|
19
|
+
return match === null ? void 0 : String(Number(match[1]));
|
|
20
|
+
}
|
|
21
|
+
function parseHostEntry(entry) {
|
|
22
|
+
const written = withBrackets(entry.trim());
|
|
23
|
+
const candidate = `http://${written}`;
|
|
24
|
+
if (written === "" || NOT_A_HOST.test(written) || !URL.canParse(candidate)) {
|
|
25
|
+
return void 0;
|
|
26
|
+
}
|
|
27
|
+
return { hostname: hostnameOf(new URL(candidate)), port: writtenPort(written) };
|
|
28
|
+
}
|
|
29
|
+
function isHostAllowed(url, hosts) {
|
|
30
|
+
const hostname = hostnameOf(url);
|
|
31
|
+
if (hostname === "") {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
const port = portOf(url);
|
|
35
|
+
return hosts.map(parseHostEntry).some((entry) => {
|
|
36
|
+
const isAnyPort = entry?.port === void 0;
|
|
37
|
+
return entry?.hostname === hostname && (isAnyPort || entry.port === port);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
exports.isHostAllowed = isHostAllowed;
|
|
42
|
+
//# sourceMappingURL=allowed-hosts.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allowed-hosts.cjs","sources":["../../../src/adapters/redocly-loader/allowed-hosts.ts"],"sourcesContent":["/**\n * Matching URLs against the `--remote-ref-hosts` list (threat model R2, ADR-017). Both sides are\n * compared as the WHATWG URL parser writes hosts (lower case, Punycode, dotted IPv4, compressed\n * IPv6 in brackets), so `bücher.example`, `::1` and `api.example.com.` match the hosts they name.\n */\n\nconst DEFAULT_PORTS: Readonly<Record<string, string>> = { \"http:\": \"80\", \"https:\": \"443\" };\nconst FULLY_QUALIFIED_DOT = /\\.$/;\nconst PORT_SUFFIX = /:(\\d+)$/;\n/** Characters that end a host in a URL: an entry with them would match a different host. */\nconst NOT_A_HOST = /[/?#@\\\\]/;\n\ninterface HostEntry {\n readonly hostname: string;\n /** Undefined when the entry allows any port. */\n readonly port: string | undefined;\n}\n\n/** A bare IPv6 address has two colons or more and cannot carry a port; brackets add one. */\nfunction withBrackets(entry: string): string {\n const isBareIPv6 = !entry.startsWith(\"[\") && entry.split(\":\").length > 2;\n return isBareIPv6 ? `[${entry}]` : entry;\n}\n\nfunction hostnameOf(url: URL): string {\n return url.hostname.replace(FULLY_QUALIFIED_DOT, \"\");\n}\n\nfunction portOf(url: URL): string {\n return url.port === \"\" ? (DEFAULT_PORTS[url.protocol] ?? \"\") : url.port;\n}\n\n/** The written port without leading zeros, as the URL parser writes it; undefined when none. */\nfunction writtenPort(entry: string): string | undefined {\n const match = PORT_SUFFIX.exec(entry);\n return match === null ? undefined : String(Number(match[1]));\n}\n\n/** The entry as the URL parser reads it, or undefined when it is not a bare host or host:port. */\nfunction parseHostEntry(entry: string): HostEntry | undefined {\n const written = withBrackets(entry.trim());\n const candidate = `http://${written}`;\n if (written === \"\" || NOT_A_HOST.test(written) || !URL.canParse(candidate)) {\n return undefined;\n }\n // The port is read from the text: the parser drops a default port (`:80`), which must still\n // limit the entry to that port.\n return { hostname: hostnameOf(new URL(candidate)), port: writtenPort(written) };\n}\n\n/** Whether the URL's host is listed, by host name alone (any port) or with its port. */\nexport function isHostAllowed(url: URL, hosts: readonly string[]): boolean {\n const hostname = hostnameOf(url);\n if (hostname === \"\") {\n return false;\n }\n const port = portOf(url);\n return hosts.map(parseHostEntry).some((entry) => {\n const isAnyPort = entry?.port === undefined;\n return entry?.hostname === hostname && (isAnyPort || entry.port === port);\n });\n}\n"],"names":[],"mappings":";;AAMA,MAAM,aAAA,GAAkD,EAAE,OAAA,EAAS,IAAA,EAAM,UAAU,KAAA,EAAM;AACzF,MAAM,mBAAA,GAAsB,KAAA;AAC5B,MAAM,WAAA,GAAc,SAAA;AAEpB,MAAM,UAAA,GAAa,UAAA;AASnB,SAAS,aAAa,KAAA,EAAuB;AAC3C,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,CAAM,UAAA,CAAW,GAAG,KAAK,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,GAAS,CAAA;AACvE,EAAA,OAAO,UAAA,GAAa,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA,GAAM,KAAA;AACrC;AAEA,SAAS,WAAW,GAAA,EAAkB;AACpC,EAAA,OAAO,GAAA,CAAI,QAAA,CAAS,OAAA,CAAQ,mBAAA,EAAqB,EAAE,CAAA;AACrD;AAEA,SAAS,OAAO,GAAA,EAAkB;AAChC,EAAA,OAAO,GAAA,CAAI,SAAS,EAAA,GAAM,aAAA,CAAc,IAAI,QAAQ,CAAA,IAAK,KAAM,GAAA,CAAI,IAAA;AACrE;AAGA,SAAS,YAAY,KAAA,EAAmC;AACtD,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA;AACpC,EAAA,OAAO,KAAA,KAAU,OAAO,MAAA,GAAY,MAAA,CAAO,OAAO,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AAC7D;AAGA,SAAS,eAAe,KAAA,EAAsC;AAC5D,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,KAAA,CAAM,IAAA,EAAM,CAAA;AACzC,EAAA,MAAM,SAAA,GAAY,UAAU,OAAO,CAAA,CAAA;AACnC,EAAA,IAAI,OAAA,KAAY,EAAA,IAAM,UAAA,CAAW,IAAA,CAAK,OAAO,KAAK,CAAC,GAAA,CAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AAC1E,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,OAAO,EAAE,QAAA,EAAU,UAAA,CAAW,IAAI,GAAA,CAAI,SAAS,CAAC,CAAA,EAAG,IAAA,EAAM,WAAA,CAAY,OAAO,CAAA,EAAE;AAChF;AAGO,SAAS,aAAA,CAAc,KAAU,KAAA,EAAmC;AACzE,EAAA,MAAM,QAAA,GAAW,WAAW,GAAG,CAAA;AAC/B,EAAA,IAAI,aAAa,EAAA,EAAI;AACnB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,OAAO,GAAG,CAAA;AACvB,EAAA,OAAO,MAAM,GAAA,CAAI,cAAc,CAAA,CAAE,IAAA,CAAK,CAAC,KAAA,KAAU;AAC/C,IAAA,MAAM,SAAA,GAAY,OAAO,IAAA,KAAS,MAAA;AAClC,IAAA,OAAO,KAAA,EAAO,QAAA,KAAa,QAAA,KAAa,SAAA,IAAa,MAAM,IAAA,KAAS,IAAA,CAAA;AAAA,EACtE,CAAC,CAAA;AACH;;"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
const DEFAULT_PORTS = { "http:": "80", "https:": "443" };
|
|
2
|
+
const FULLY_QUALIFIED_DOT = /\.$/;
|
|
3
|
+
const PORT_SUFFIX = /:(\d+)$/;
|
|
4
|
+
const NOT_A_HOST = /[/?#@\\]/;
|
|
5
|
+
function withBrackets(entry) {
|
|
6
|
+
const isBareIPv6 = !entry.startsWith("[") && entry.split(":").length > 2;
|
|
7
|
+
return isBareIPv6 ? `[${entry}]` : entry;
|
|
8
|
+
}
|
|
9
|
+
function hostnameOf(url) {
|
|
10
|
+
return url.hostname.replace(FULLY_QUALIFIED_DOT, "");
|
|
11
|
+
}
|
|
12
|
+
function portOf(url) {
|
|
13
|
+
return url.port === "" ? DEFAULT_PORTS[url.protocol] ?? "" : url.port;
|
|
14
|
+
}
|
|
15
|
+
function writtenPort(entry) {
|
|
16
|
+
const match = PORT_SUFFIX.exec(entry);
|
|
17
|
+
return match === null ? void 0 : String(Number(match[1]));
|
|
18
|
+
}
|
|
19
|
+
function parseHostEntry(entry) {
|
|
20
|
+
const written = withBrackets(entry.trim());
|
|
21
|
+
const candidate = `http://${written}`;
|
|
22
|
+
if (written === "" || NOT_A_HOST.test(written) || !URL.canParse(candidate)) {
|
|
23
|
+
return void 0;
|
|
24
|
+
}
|
|
25
|
+
return { hostname: hostnameOf(new URL(candidate)), port: writtenPort(written) };
|
|
26
|
+
}
|
|
27
|
+
function isHostAllowed(url, hosts) {
|
|
28
|
+
const hostname = hostnameOf(url);
|
|
29
|
+
if (hostname === "") {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
const port = portOf(url);
|
|
33
|
+
return hosts.map(parseHostEntry).some((entry) => {
|
|
34
|
+
const isAnyPort = entry?.port === void 0;
|
|
35
|
+
return entry?.hostname === hostname && (isAnyPort || entry.port === port);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export { isHostAllowed };
|
|
40
|
+
//# sourceMappingURL=allowed-hosts.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"allowed-hosts.mjs","sources":["../../../src/adapters/redocly-loader/allowed-hosts.ts"],"sourcesContent":["/**\n * Matching URLs against the `--remote-ref-hosts` list (threat model R2, ADR-017). Both sides are\n * compared as the WHATWG URL parser writes hosts (lower case, Punycode, dotted IPv4, compressed\n * IPv6 in brackets), so `bücher.example`, `::1` and `api.example.com.` match the hosts they name.\n */\n\nconst DEFAULT_PORTS: Readonly<Record<string, string>> = { \"http:\": \"80\", \"https:\": \"443\" };\nconst FULLY_QUALIFIED_DOT = /\\.$/;\nconst PORT_SUFFIX = /:(\\d+)$/;\n/** Characters that end a host in a URL: an entry with them would match a different host. */\nconst NOT_A_HOST = /[/?#@\\\\]/;\n\ninterface HostEntry {\n readonly hostname: string;\n /** Undefined when the entry allows any port. */\n readonly port: string | undefined;\n}\n\n/** A bare IPv6 address has two colons or more and cannot carry a port; brackets add one. */\nfunction withBrackets(entry: string): string {\n const isBareIPv6 = !entry.startsWith(\"[\") && entry.split(\":\").length > 2;\n return isBareIPv6 ? `[${entry}]` : entry;\n}\n\nfunction hostnameOf(url: URL): string {\n return url.hostname.replace(FULLY_QUALIFIED_DOT, \"\");\n}\n\nfunction portOf(url: URL): string {\n return url.port === \"\" ? (DEFAULT_PORTS[url.protocol] ?? \"\") : url.port;\n}\n\n/** The written port without leading zeros, as the URL parser writes it; undefined when none. */\nfunction writtenPort(entry: string): string | undefined {\n const match = PORT_SUFFIX.exec(entry);\n return match === null ? undefined : String(Number(match[1]));\n}\n\n/** The entry as the URL parser reads it, or undefined when it is not a bare host or host:port. */\nfunction parseHostEntry(entry: string): HostEntry | undefined {\n const written = withBrackets(entry.trim());\n const candidate = `http://${written}`;\n if (written === \"\" || NOT_A_HOST.test(written) || !URL.canParse(candidate)) {\n return undefined;\n }\n // The port is read from the text: the parser drops a default port (`:80`), which must still\n // limit the entry to that port.\n return { hostname: hostnameOf(new URL(candidate)), port: writtenPort(written) };\n}\n\n/** Whether the URL's host is listed, by host name alone (any port) or with its port. */\nexport function isHostAllowed(url: URL, hosts: readonly string[]): boolean {\n const hostname = hostnameOf(url);\n if (hostname === \"\") {\n return false;\n }\n const port = portOf(url);\n return hosts.map(parseHostEntry).some((entry) => {\n const isAnyPort = entry?.port === undefined;\n return entry?.hostname === hostname && (isAnyPort || entry.port === port);\n });\n}\n"],"names":[],"mappings":"AAMA,MAAM,aAAA,GAAkD,EAAE,OAAA,EAAS,IAAA,EAAM,UAAU,KAAA,EAAM;AACzF,MAAM,mBAAA,GAAsB,KAAA;AAC5B,MAAM,WAAA,GAAc,SAAA;AAEpB,MAAM,UAAA,GAAa,UAAA;AASnB,SAAS,aAAa,KAAA,EAAuB;AAC3C,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,CAAM,UAAA,CAAW,GAAG,KAAK,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,GAAS,CAAA;AACvE,EAAA,OAAO,UAAA,GAAa,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA,GAAM,KAAA;AACrC;AAEA,SAAS,WAAW,GAAA,EAAkB;AACpC,EAAA,OAAO,GAAA,CAAI,QAAA,CAAS,OAAA,CAAQ,mBAAA,EAAqB,EAAE,CAAA;AACrD;AAEA,SAAS,OAAO,GAAA,EAAkB;AAChC,EAAA,OAAO,GAAA,CAAI,SAAS,EAAA,GAAM,aAAA,CAAc,IAAI,QAAQ,CAAA,IAAK,KAAM,GAAA,CAAI,IAAA;AACrE;AAGA,SAAS,YAAY,KAAA,EAAmC;AACtD,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA;AACpC,EAAA,OAAO,KAAA,KAAU,OAAO,MAAA,GAAY,MAAA,CAAO,OAAO,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AAC7D;AAGA,SAAS,eAAe,KAAA,EAAsC;AAC5D,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,KAAA,CAAM,IAAA,EAAM,CAAA;AACzC,EAAA,MAAM,SAAA,GAAY,UAAU,OAAO,CAAA,CAAA;AACnC,EAAA,IAAI,OAAA,KAAY,EAAA,IAAM,UAAA,CAAW,IAAA,CAAK,OAAO,KAAK,CAAC,GAAA,CAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AAC1E,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,OAAO,EAAE,QAAA,EAAU,UAAA,CAAW,IAAI,GAAA,CAAI,SAAS,CAAC,CAAA,EAAG,IAAA,EAAM,WAAA,CAAY,OAAO,CAAA,EAAE;AAChF;AAGO,SAAS,aAAA,CAAc,KAAU,KAAA,EAAmC;AACzE,EAAA,MAAM,QAAA,GAAW,WAAW,GAAG,CAAA;AAC/B,EAAA,IAAI,aAAa,EAAA,EAAI;AACnB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAA,GAAO,OAAO,GAAG,CAAA;AACvB,EAAA,OAAO,MAAM,GAAA,CAAI,cAAc,CAAA,CAAE,IAAA,CAAK,CAAC,KAAA,KAAU;AAC/C,IAAA,MAAM,SAAA,GAAY,OAAO,IAAA,KAAS,MAAA;AAClC,IAAA,OAAO,KAAA,EAAO,QAAA,KAAa,QAAA,KAAa,SAAA,IAAa,MAAM,IAAA,KAAS,IAAA,CAAA;AAAA,EACtE,CAAC,CAAA;AACH;;"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const jsonPointer = require('../../domain/openapi/json-pointer.cjs');
|
|
4
|
+
const refHolders = require('./ref-holders.cjs');
|
|
5
|
+
|
|
6
|
+
const LOCAL_REF_PREFIX = "#/";
|
|
7
|
+
function isContainer(value) {
|
|
8
|
+
return typeof value === "object" && value !== null;
|
|
9
|
+
}
|
|
10
|
+
function childAt(node, segment) {
|
|
11
|
+
if (!isContainer(node) || !Object.hasOwn(node, segment)) {
|
|
12
|
+
return void 0;
|
|
13
|
+
}
|
|
14
|
+
return node[segment];
|
|
15
|
+
}
|
|
16
|
+
function resolves(document, segments) {
|
|
17
|
+
return segments.reduce(childAt, document) !== void 0;
|
|
18
|
+
}
|
|
19
|
+
function decodedSegments(ref) {
|
|
20
|
+
try {
|
|
21
|
+
return jsonPointer.parseRefPointer(ref);
|
|
22
|
+
} catch (error) {
|
|
23
|
+
if (error instanceof URIError) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function repairedRef(document, ref) {
|
|
30
|
+
const decoded = decodedSegments(ref);
|
|
31
|
+
if (decoded && resolves(document, decoded)) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
const raw = ref.slice(LOCAL_REF_PREFIX.length).split("/").filter(Boolean);
|
|
35
|
+
if (!resolves(document, raw)) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
return `${LOCAL_REF_PREFIX}${raw.map(jsonPointer.escapePointerSegment).join("/")}`;
|
|
39
|
+
}
|
|
40
|
+
function repairBundledRefs(document) {
|
|
41
|
+
for (const { node } of refHolders.findRefHolders(document)) {
|
|
42
|
+
if (!node.$ref.startsWith(LOCAL_REF_PREFIX)) {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const repaired = repairedRef(document, node.$ref);
|
|
46
|
+
if (repaired !== null) {
|
|
47
|
+
node.$ref = repaired;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
exports.repairBundledRefs = repairBundledRefs;
|
|
53
|
+
//# sourceMappingURL=bundled-ref-repair.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundled-ref-repair.cjs","sources":["../../../src/adapters/redocly-loader/bundled-ref-repair.ts"],"sourcesContent":["import { escapePointerSegment, parseRefPointer } from \"../../domain/openapi/json-pointer.js\";\nimport { findRefHolders } from \"./ref-holders.js\";\n\n/**\n * Redocly 1.x bundles an external `$ref` into a component named after the raw segment of the\n * original pointer (`a~0b`, `50%`), and writes the new local `$ref` without escaping it. Read as a\n * JSON Pointer, `#/components/schemas/a~0b` names the key `a~b`, which does not exist, and\n * `#/components/schemas/50%` is malformed, so the generator failed on it. This rewrites every\n * local `$ref` that does not resolve as a pointer but does resolve segment by segment as written.\n */\n\nconst LOCAL_REF_PREFIX = \"#/\";\n\nfunction isContainer(value: unknown): value is object {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction childAt(node: unknown, segment: string): unknown {\n if (!isContainer(node) || !Object.hasOwn(node, segment)) {\n return undefined;\n }\n return (node as Record<string, unknown>)[segment];\n}\n\nfunction resolves(document: unknown, segments: readonly string[]): boolean {\n return segments.reduce<unknown>(childAt, document) !== undefined;\n}\n\n/** The pointer's segments, or null when the pointer has a malformed percent escape. */\nfunction decodedSegments(ref: string): string[] | null {\n try {\n return parseRefPointer(ref);\n } catch (error) {\n if (error instanceof URIError) {\n return null;\n }\n throw error;\n }\n}\n\n/** The repaired `$ref`, or null when the ref resolves already or cannot be repaired. */\nfunction repairedRef(document: unknown, ref: string): string | null {\n const decoded = decodedSegments(ref);\n if (decoded && resolves(document, decoded)) {\n return null;\n }\n const raw = ref.slice(LOCAL_REF_PREFIX.length).split(\"/\").filter(Boolean);\n if (!resolves(document, raw)) {\n return null;\n }\n return `${LOCAL_REF_PREFIX}${raw.map(escapePointerSegment).join(\"/\")}`;\n}\n\n/** Repair the local `$ref`s of a bundled document in place, as Redocly's bundle edits it. */\nexport function repairBundledRefs(document: unknown): void {\n for (const { node } of findRefHolders(document)) {\n if (!node.$ref.startsWith(LOCAL_REF_PREFIX)) {\n continue;\n }\n const repaired = repairedRef(document, node.$ref);\n if (repaired !== null) {\n node.$ref = repaired;\n }\n }\n}\n"],"names":["parseRefPointer","escapePointerSegment","findRefHolders"],"mappings":";;;;;AAWA,MAAM,gBAAA,GAAmB,IAAA;AAEzB,SAAS,YAAY,KAAA,EAAiC;AACpD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA;AAChD;AAEA,SAAS,OAAA,CAAQ,MAAe,OAAA,EAA0B;AACxD,EAAA,IAAI,CAAC,YAAY,IAAI,CAAA,IAAK,CAAC,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,OAAO,CAAA,EAAG;AACvD,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAQ,KAAiC,OAAO,CAAA;AAClD;AAEA,SAAS,QAAA,CAAS,UAAmB,QAAA,EAAsC;AACzE,EAAA,OAAO,QAAA,CAAS,MAAA,CAAgB,OAAA,EAAS,QAAQ,CAAA,KAAM,MAAA;AACzD;AAGA,SAAS,gBAAgB,GAAA,EAA8B;AACrD,EAAA,IAAI;AACF,IAAA,OAAOA,4BAAgB,GAAG,CAAA;AAAA,EAC5B,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,QAAA,EAAU;AAC7B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAGA,SAAS,WAAA,CAAY,UAAmB,GAAA,EAA4B;AAClE,EAAA,MAAM,OAAA,GAAU,gBAAgB,GAAG,CAAA;AACnC,EAAA,IAAI,OAAA,IAAW,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA,EAAG;AAC1C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,gBAAA,CAAiB,MAAM,EAAE,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AACxE,EAAA,IAAI,CAAC,QAAA,CAAS,QAAA,EAAU,GAAG,CAAA,EAAG;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAA,EAAG,gBAAgB,CAAA,EAAG,GAAA,CAAI,IAAIC,gCAAoB,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AACtE;AAGO,SAAS,kBAAkB,QAAA,EAAyB;AACzD,EAAA,KAAA,MAAW,EAAE,IAAA,EAAK,IAAKC,yBAAA,CAAe,QAAQ,CAAA,EAAG;AAC/C,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,gBAAgB,CAAA,EAAG;AAC3C,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,QAAA,EAAU,IAAA,CAAK,IAAI,CAAA;AAChD,IAAA,IAAI,aAAa,IAAA,EAAM;AACrB,MAAA,IAAA,CAAK,IAAA,GAAO,QAAA;AAAA,IACd;AAAA,EACF;AACF;;"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { escapePointerSegment, parseRefPointer } from '../../domain/openapi/json-pointer.mjs';
|
|
2
|
+
import { findRefHolders } from './ref-holders.mjs';
|
|
3
|
+
|
|
4
|
+
const LOCAL_REF_PREFIX = "#/";
|
|
5
|
+
function isContainer(value) {
|
|
6
|
+
return typeof value === "object" && value !== null;
|
|
7
|
+
}
|
|
8
|
+
function childAt(node, segment) {
|
|
9
|
+
if (!isContainer(node) || !Object.hasOwn(node, segment)) {
|
|
10
|
+
return void 0;
|
|
11
|
+
}
|
|
12
|
+
return node[segment];
|
|
13
|
+
}
|
|
14
|
+
function resolves(document, segments) {
|
|
15
|
+
return segments.reduce(childAt, document) !== void 0;
|
|
16
|
+
}
|
|
17
|
+
function decodedSegments(ref) {
|
|
18
|
+
try {
|
|
19
|
+
return parseRefPointer(ref);
|
|
20
|
+
} catch (error) {
|
|
21
|
+
if (error instanceof URIError) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
throw error;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function repairedRef(document, ref) {
|
|
28
|
+
const decoded = decodedSegments(ref);
|
|
29
|
+
if (decoded && resolves(document, decoded)) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
const raw = ref.slice(LOCAL_REF_PREFIX.length).split("/").filter(Boolean);
|
|
33
|
+
if (!resolves(document, raw)) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
return `${LOCAL_REF_PREFIX}${raw.map(escapePointerSegment).join("/")}`;
|
|
37
|
+
}
|
|
38
|
+
function repairBundledRefs(document) {
|
|
39
|
+
for (const { node } of findRefHolders(document)) {
|
|
40
|
+
if (!node.$ref.startsWith(LOCAL_REF_PREFIX)) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const repaired = repairedRef(document, node.$ref);
|
|
44
|
+
if (repaired !== null) {
|
|
45
|
+
node.$ref = repaired;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export { repairBundledRefs };
|
|
51
|
+
//# sourceMappingURL=bundled-ref-repair.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundled-ref-repair.mjs","sources":["../../../src/adapters/redocly-loader/bundled-ref-repair.ts"],"sourcesContent":["import { escapePointerSegment, parseRefPointer } from \"../../domain/openapi/json-pointer.js\";\nimport { findRefHolders } from \"./ref-holders.js\";\n\n/**\n * Redocly 1.x bundles an external `$ref` into a component named after the raw segment of the\n * original pointer (`a~0b`, `50%`), and writes the new local `$ref` without escaping it. Read as a\n * JSON Pointer, `#/components/schemas/a~0b` names the key `a~b`, which does not exist, and\n * `#/components/schemas/50%` is malformed, so the generator failed on it. This rewrites every\n * local `$ref` that does not resolve as a pointer but does resolve segment by segment as written.\n */\n\nconst LOCAL_REF_PREFIX = \"#/\";\n\nfunction isContainer(value: unknown): value is object {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction childAt(node: unknown, segment: string): unknown {\n if (!isContainer(node) || !Object.hasOwn(node, segment)) {\n return undefined;\n }\n return (node as Record<string, unknown>)[segment];\n}\n\nfunction resolves(document: unknown, segments: readonly string[]): boolean {\n return segments.reduce<unknown>(childAt, document) !== undefined;\n}\n\n/** The pointer's segments, or null when the pointer has a malformed percent escape. */\nfunction decodedSegments(ref: string): string[] | null {\n try {\n return parseRefPointer(ref);\n } catch (error) {\n if (error instanceof URIError) {\n return null;\n }\n throw error;\n }\n}\n\n/** The repaired `$ref`, or null when the ref resolves already or cannot be repaired. */\nfunction repairedRef(document: unknown, ref: string): string | null {\n const decoded = decodedSegments(ref);\n if (decoded && resolves(document, decoded)) {\n return null;\n }\n const raw = ref.slice(LOCAL_REF_PREFIX.length).split(\"/\").filter(Boolean);\n if (!resolves(document, raw)) {\n return null;\n }\n return `${LOCAL_REF_PREFIX}${raw.map(escapePointerSegment).join(\"/\")}`;\n}\n\n/** Repair the local `$ref`s of a bundled document in place, as Redocly's bundle edits it. */\nexport function repairBundledRefs(document: unknown): void {\n for (const { node } of findRefHolders(document)) {\n if (!node.$ref.startsWith(LOCAL_REF_PREFIX)) {\n continue;\n }\n const repaired = repairedRef(document, node.$ref);\n if (repaired !== null) {\n node.$ref = repaired;\n }\n }\n}\n"],"names":[],"mappings":";;;AAWA,MAAM,gBAAA,GAAmB,IAAA;AAEzB,SAAS,YAAY,KAAA,EAAiC;AACpD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA;AAChD;AAEA,SAAS,OAAA,CAAQ,MAAe,OAAA,EAA0B;AACxD,EAAA,IAAI,CAAC,YAAY,IAAI,CAAA,IAAK,CAAC,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,OAAO,CAAA,EAAG;AACvD,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAQ,KAAiC,OAAO,CAAA;AAClD;AAEA,SAAS,QAAA,CAAS,UAAmB,QAAA,EAAsC;AACzE,EAAA,OAAO,QAAA,CAAS,MAAA,CAAgB,OAAA,EAAS,QAAQ,CAAA,KAAM,MAAA;AACzD;AAGA,SAAS,gBAAgB,GAAA,EAA8B;AACrD,EAAA,IAAI;AACF,IAAA,OAAO,gBAAgB,GAAG,CAAA;AAAA,EAC5B,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,QAAA,EAAU;AAC7B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAGA,SAAS,WAAA,CAAY,UAAmB,GAAA,EAA4B;AAClE,EAAA,MAAM,OAAA,GAAU,gBAAgB,GAAG,CAAA;AACnC,EAAA,IAAI,OAAA,IAAW,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA,EAAG;AAC1C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,gBAAA,CAAiB,MAAM,EAAE,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AACxE,EAAA,IAAI,CAAC,QAAA,CAAS,QAAA,EAAU,GAAG,CAAA,EAAG;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAA,EAAG,gBAAgB,CAAA,EAAG,GAAA,CAAI,IAAI,oBAAoB,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AACtE;AAGO,SAAS,kBAAkB,QAAA,EAAyB;AACzD,EAAA,KAAA,MAAW,EAAE,IAAA,EAAK,IAAK,cAAA,CAAe,QAAQ,CAAA,EAAG;AAC/C,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,gBAAgB,CAAA,EAAG;AAC3C,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,QAAA,EAAU,IAAA,CAAK,IAAI,CAAA;AAChD,IAAA,IAAI,aAAa,IAAA,EAAM;AACrB,MAAA,IAAA,CAAK,IAAA,GAAO,QAAA;AAAA,IACd;AAAA,EACF;AACF;;"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const errors = require('../../domain/errors.cjs');
|
|
4
|
+
const jsonPointer = require('../../domain/openapi/json-pointer.cjs');
|
|
5
|
+
const refHolders = require('./ref-holders.cjs');
|
|
6
|
+
|
|
7
|
+
const REFS_IN_MESSAGE = 5;
|
|
8
|
+
function isMalformed(ref) {
|
|
9
|
+
try {
|
|
10
|
+
jsonPointer.parseRefPointer(ref);
|
|
11
|
+
return false;
|
|
12
|
+
} catch (error) {
|
|
13
|
+
if (error instanceof URIError) {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
throw error;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function findMalformedRefs(documents) {
|
|
20
|
+
return documents.flatMap(
|
|
21
|
+
(document) => refHolders.findRefHolders(document.parsed).filter(({ node }) => isMalformed(node.$ref)).map(({ node, pointer }) => ({ ref: node.$ref, pointer, source: document.source }))
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
function describeRef(found) {
|
|
25
|
+
return `"${found.ref}" at ${found.pointer} in ${found.source}`;
|
|
26
|
+
}
|
|
27
|
+
function malformedRefsError(refs, cause) {
|
|
28
|
+
const listed = refs.slice(0, REFS_IN_MESSAGE).map(describeRef);
|
|
29
|
+
const more = refs.length > REFS_IN_MESSAGE ? ` and ${refs.length - REFS_IN_MESSAGE} more` : "";
|
|
30
|
+
const where = listed.length === 0 ? "" : `: ${listed.join(", ")}${more}`;
|
|
31
|
+
return new errors.OpenAPITypesafeError({
|
|
32
|
+
code: errors.ERROR_CODES.SCHEMA_REF_INVALID,
|
|
33
|
+
message: `A $ref has a malformed percent escape; write "%" as "%25" in a JSON Pointer${where}.`,
|
|
34
|
+
details: { reason: "malformed", refs: refs.map((found) => ({ ...found })) },
|
|
35
|
+
cause
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
exports.findMalformedRefs = findMalformedRefs;
|
|
40
|
+
exports.malformedRefsError = malformedRefsError;
|
|
41
|
+
//# sourceMappingURL=malformed-refs.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"malformed-refs.cjs","sources":["../../../src/adapters/redocly-loader/malformed-refs.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../../domain/errors.js\";\nimport { parseRefPointer } from \"../../domain/openapi/json-pointer.js\";\nimport { findRefHolders } from \"./ref-holders.js\";\nimport type { LoadedDocument } from \"./unsupported-keys.js\";\n\n/**\n * Redocly percent-decodes every JSON Pointer in a `$ref` and throws a bare `URIError` for a\n * malformed escape such as `#/components/schemas/50%` (`%` must be written `%25`). The loader\n * looks for these refs only after Redocly threw, and names them.\n */\n\n/** Enough refs in the message to act on; `details.refs` has all of them. */\nconst REFS_IN_MESSAGE = 5;\n\n/** A `$ref` whose pointer has a malformed percent escape, and where it is. */\nexport interface MalformedRef {\n readonly ref: string;\n readonly pointer: string;\n readonly source: string;\n}\n\nfunction isMalformed(ref: string): boolean {\n try {\n parseRefPointer(ref);\n return false;\n } catch (error) {\n if (error instanceof URIError) {\n return true;\n }\n throw error;\n }\n}\n\n/** Every malformed `$ref` of the given documents. */\nexport function findMalformedRefs(documents: readonly LoadedDocument[]): MalformedRef[] {\n return documents.flatMap((document) =>\n findRefHolders(document.parsed)\n .filter(({ node }) => isMalformed(node.$ref))\n .map(({ node, pointer }) => ({ ref: node.$ref, pointer, source: document.source })),\n );\n}\n\nfunction describeRef(found: MalformedRef): string {\n return `\"${found.ref}\" at ${found.pointer} in ${found.source}`;\n}\n\n/** The typed error for Redocly's `URIError`; `cause` is that error. */\nexport function malformedRefsError(\n refs: readonly MalformedRef[],\n cause: unknown,\n): OpenAPITypesafeError {\n const listed = refs.slice(0, REFS_IN_MESSAGE).map(describeRef);\n const more = refs.length > REFS_IN_MESSAGE ? ` and ${refs.length - REFS_IN_MESSAGE} more` : \"\";\n const where = listed.length === 0 ? \"\" : `: ${listed.join(\", \")}${more}`;\n return new OpenAPITypesafeError({\n code: ERROR_CODES.SCHEMA_REF_INVALID,\n message: `A $ref has a malformed percent escape; write \"%\" as \"%25\" in a JSON Pointer${where}.`,\n details: { reason: \"malformed\", refs: refs.map((found) => ({ ...found })) },\n cause,\n });\n}\n"],"names":["parseRefPointer","findRefHolders","OpenAPITypesafeError","ERROR_CODES"],"mappings":";;;;;;AAYA,MAAM,eAAA,GAAkB,CAAA;AASxB,SAAS,YAAY,GAAA,EAAsB;AACzC,EAAA,IAAI;AACF,IAAAA,2BAAA,CAAgB,GAAG,CAAA;AACnB,IAAA,OAAO,KAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,QAAA,EAAU;AAC7B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAGO,SAAS,kBAAkB,SAAA,EAAsD;AACtF,EAAA,OAAO,SAAA,CAAU,OAAA;AAAA,IAAQ,CAAC,QAAA,KACxBC,yBAAA,CAAe,QAAA,CAAS,MAAM,CAAA,CAC3B,MAAA,CAAO,CAAC,EAAE,IAAA,EAAK,KAAM,WAAA,CAAY,KAAK,IAAI,CAAC,CAAA,CAC3C,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,OAAA,EAAQ,MAAO,EAAE,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,QAAA,CAAS,QAAO,CAAE;AAAA,GACtF;AACF;AAEA,SAAS,YAAY,KAAA,EAA6B;AAChD,EAAA,OAAO,CAAA,CAAA,EAAI,MAAM,GAAG,CAAA,KAAA,EAAQ,MAAM,OAAO,CAAA,IAAA,EAAO,MAAM,MAAM,CAAA,CAAA;AAC9D;AAGO,SAAS,kBAAA,CACd,MACA,KAAA,EACsB;AACtB,EAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,GAAG,eAAe,CAAA,CAAE,IAAI,WAAW,CAAA;AAC7D,EAAA,MAAM,IAAA,GAAO,KAAK,MAAA,GAAS,eAAA,GAAkB,QAAQ,IAAA,CAAK,MAAA,GAAS,eAAe,CAAA,KAAA,CAAA,GAAU,EAAA;AAC5F,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,KAAW,CAAA,GAAI,EAAA,GAAK,CAAA,EAAA,EAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,EAAG,IAAI,CAAA,CAAA;AACtE,EAAA,OAAO,IAAIC,2BAAA,CAAqB;AAAA,IAC9B,MAAMC,kBAAA,CAAY,kBAAA;AAAA,IAClB,OAAA,EAAS,8EAA8E,KAAK,CAAA,CAAA,CAAA;AAAA,IAC5F,OAAA,EAAS,EAAE,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,CAAC,KAAA,MAAW,EAAE,GAAG,KAAA,GAAQ,CAAA,EAAE;AAAA,IAC1E;AAAA,GACD,CAAA;AACH;;;"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { OpenAPITypesafeError, ERROR_CODES } from '../../domain/errors.mjs';
|
|
2
|
+
import { parseRefPointer } from '../../domain/openapi/json-pointer.mjs';
|
|
3
|
+
import { findRefHolders } from './ref-holders.mjs';
|
|
4
|
+
|
|
5
|
+
const REFS_IN_MESSAGE = 5;
|
|
6
|
+
function isMalformed(ref) {
|
|
7
|
+
try {
|
|
8
|
+
parseRefPointer(ref);
|
|
9
|
+
return false;
|
|
10
|
+
} catch (error) {
|
|
11
|
+
if (error instanceof URIError) {
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
throw error;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function findMalformedRefs(documents) {
|
|
18
|
+
return documents.flatMap(
|
|
19
|
+
(document) => findRefHolders(document.parsed).filter(({ node }) => isMalformed(node.$ref)).map(({ node, pointer }) => ({ ref: node.$ref, pointer, source: document.source }))
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
function describeRef(found) {
|
|
23
|
+
return `"${found.ref}" at ${found.pointer} in ${found.source}`;
|
|
24
|
+
}
|
|
25
|
+
function malformedRefsError(refs, cause) {
|
|
26
|
+
const listed = refs.slice(0, REFS_IN_MESSAGE).map(describeRef);
|
|
27
|
+
const more = refs.length > REFS_IN_MESSAGE ? ` and ${refs.length - REFS_IN_MESSAGE} more` : "";
|
|
28
|
+
const where = listed.length === 0 ? "" : `: ${listed.join(", ")}${more}`;
|
|
29
|
+
return new OpenAPITypesafeError({
|
|
30
|
+
code: ERROR_CODES.SCHEMA_REF_INVALID,
|
|
31
|
+
message: `A $ref has a malformed percent escape; write "%" as "%25" in a JSON Pointer${where}.`,
|
|
32
|
+
details: { reason: "malformed", refs: refs.map((found) => ({ ...found })) },
|
|
33
|
+
cause
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export { findMalformedRefs, malformedRefsError };
|
|
38
|
+
//# sourceMappingURL=malformed-refs.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"malformed-refs.mjs","sources":["../../../src/adapters/redocly-loader/malformed-refs.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../../domain/errors.js\";\nimport { parseRefPointer } from \"../../domain/openapi/json-pointer.js\";\nimport { findRefHolders } from \"./ref-holders.js\";\nimport type { LoadedDocument } from \"./unsupported-keys.js\";\n\n/**\n * Redocly percent-decodes every JSON Pointer in a `$ref` and throws a bare `URIError` for a\n * malformed escape such as `#/components/schemas/50%` (`%` must be written `%25`). The loader\n * looks for these refs only after Redocly threw, and names them.\n */\n\n/** Enough refs in the message to act on; `details.refs` has all of them. */\nconst REFS_IN_MESSAGE = 5;\n\n/** A `$ref` whose pointer has a malformed percent escape, and where it is. */\nexport interface MalformedRef {\n readonly ref: string;\n readonly pointer: string;\n readonly source: string;\n}\n\nfunction isMalformed(ref: string): boolean {\n try {\n parseRefPointer(ref);\n return false;\n } catch (error) {\n if (error instanceof URIError) {\n return true;\n }\n throw error;\n }\n}\n\n/** Every malformed `$ref` of the given documents. */\nexport function findMalformedRefs(documents: readonly LoadedDocument[]): MalformedRef[] {\n return documents.flatMap((document) =>\n findRefHolders(document.parsed)\n .filter(({ node }) => isMalformed(node.$ref))\n .map(({ node, pointer }) => ({ ref: node.$ref, pointer, source: document.source })),\n );\n}\n\nfunction describeRef(found: MalformedRef): string {\n return `\"${found.ref}\" at ${found.pointer} in ${found.source}`;\n}\n\n/** The typed error for Redocly's `URIError`; `cause` is that error. */\nexport function malformedRefsError(\n refs: readonly MalformedRef[],\n cause: unknown,\n): OpenAPITypesafeError {\n const listed = refs.slice(0, REFS_IN_MESSAGE).map(describeRef);\n const more = refs.length > REFS_IN_MESSAGE ? ` and ${refs.length - REFS_IN_MESSAGE} more` : \"\";\n const where = listed.length === 0 ? \"\" : `: ${listed.join(\", \")}${more}`;\n return new OpenAPITypesafeError({\n code: ERROR_CODES.SCHEMA_REF_INVALID,\n message: `A $ref has a malformed percent escape; write \"%\" as \"%25\" in a JSON Pointer${where}.`,\n details: { reason: \"malformed\", refs: refs.map((found) => ({ ...found })) },\n cause,\n });\n}\n"],"names":[],"mappings":";;;;AAYA,MAAM,eAAA,GAAkB,CAAA;AASxB,SAAS,YAAY,GAAA,EAAsB;AACzC,EAAA,IAAI;AACF,IAAA,eAAA,CAAgB,GAAG,CAAA;AACnB,IAAA,OAAO,KAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,QAAA,EAAU;AAC7B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAGO,SAAS,kBAAkB,SAAA,EAAsD;AACtF,EAAA,OAAO,SAAA,CAAU,OAAA;AAAA,IAAQ,CAAC,QAAA,KACxB,cAAA,CAAe,QAAA,CAAS,MAAM,CAAA,CAC3B,MAAA,CAAO,CAAC,EAAE,IAAA,EAAK,KAAM,WAAA,CAAY,KAAK,IAAI,CAAC,CAAA,CAC3C,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,OAAA,EAAQ,MAAO,EAAE,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,QAAA,CAAS,QAAO,CAAE;AAAA,GACtF;AACF;AAEA,SAAS,YAAY,KAAA,EAA6B;AAChD,EAAA,OAAO,CAAA,CAAA,EAAI,MAAM,GAAG,CAAA,KAAA,EAAQ,MAAM,OAAO,CAAA,IAAA,EAAO,MAAM,MAAM,CAAA,CAAA;AAC9D;AAGO,SAAS,kBAAA,CACd,MACA,KAAA,EACsB;AACtB,EAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,GAAG,eAAe,CAAA,CAAE,IAAI,WAAW,CAAA;AAC7D,EAAA,MAAM,IAAA,GAAO,KAAK,MAAA,GAAS,eAAA,GAAkB,QAAQ,IAAA,CAAK,MAAA,GAAS,eAAe,CAAA,KAAA,CAAA,GAAU,EAAA;AAC5F,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,KAAW,CAAA,GAAI,EAAA,GAAK,CAAA,EAAA,EAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,EAAG,IAAI,CAAA,CAAA;AACtE,EAAA,OAAO,IAAI,oBAAA,CAAqB;AAAA,IAC9B,MAAM,WAAA,CAAY,kBAAA;AAAA,IAClB,OAAA,EAAS,8EAA8E,KAAK,CAAA,CAAA,CAAA;AAAA,IAC5F,OAAA,EAAS,EAAE,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,CAAC,KAAA,MAAW,EAAE,GAAG,KAAA,GAAQ,CAAA,EAAE;AAAA,IAC1E;AAAA,GACD,CAAA;AACH;;"}
|