openapi-typesafe 0.0.0 → 1.0.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +71 -1
- package/bin/cli.js +4 -0
- package/dist/adapters/node-file-system/node-file-system.cjs +46 -0
- package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -0
- package/dist/adapters/node-file-system/node-file-system.mjs +40 -0
- package/dist/adapters/node-file-system/node-file-system.mjs.map +1 -0
- package/dist/adapters/redocly-loader/alias-limit.cjs +16 -0
- package/dist/adapters/redocly-loader/alias-limit.cjs.map +1 -0
- package/dist/adapters/redocly-loader/alias-limit.mjs +14 -0
- package/dist/adapters/redocly-loader/alias-limit.mjs.map +1 -0
- package/dist/adapters/redocly-loader/allowed-hosts.cjs +42 -0
- package/dist/adapters/redocly-loader/allowed-hosts.cjs.map +1 -0
- package/dist/adapters/redocly-loader/allowed-hosts.mjs +40 -0
- package/dist/adapters/redocly-loader/allowed-hosts.mjs.map +1 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.cjs +53 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.cjs.map +1 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.mjs +51 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.mjs.map +1 -0
- package/dist/adapters/redocly-loader/malformed-refs.cjs +41 -0
- package/dist/adapters/redocly-loader/malformed-refs.cjs.map +1 -0
- package/dist/adapters/redocly-loader/malformed-refs.mjs +38 -0
- package/dist/adapters/redocly-loader/malformed-refs.mjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-config-source.cjs +42 -0
- package/dist/adapters/redocly-loader/redocly-config-source.cjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-config-source.mjs +35 -0
- package/dist/adapters/redocly-loader/redocly-config-source.mjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +169 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +167 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-access.cjs +107 -0
- package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-access.mjs +99 -0
- package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-holders.cjs +31 -0
- package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-holders.mjs +29 -0
- package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -0
- package/dist/adapters/redocly-loader/remote-fetch.cjs +60 -0
- package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -0
- package/dist/adapters/redocly-loader/remote-fetch.mjs +56 -0
- package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-load-errors.cjs +87 -0
- package/dist/adapters/redocly-loader/schema-load-errors.cjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-load-errors.mjs +77 -0
- package/dist/adapters/redocly-loader/schema-load-errors.mjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-source.cjs +104 -0
- package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-source.mjs +98 -0
- package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -0
- package/dist/adapters/redocly-loader/unsupported-keys.cjs +62 -0
- package/dist/adapters/redocly-loader/unsupported-keys.cjs.map +1 -0
- package/dist/adapters/redocly-loader/unsupported-keys.mjs +58 -0
- package/dist/adapters/redocly-loader/unsupported-keys.mjs.map +1 -0
- package/dist/adapters/terminal-logger/terminal-logger.cjs +67 -0
- package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -0
- package/dist/adapters/terminal-logger/terminal-logger.mjs +59 -0
- package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.cjs +21 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.mjs +17 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.cjs +75 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.mjs +71 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs +145 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs +139 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/lazy-node.cjs +23 -0
- package/dist/adapters/type-ast-bridge/lazy-node.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/lazy-node.mjs +21 -0
- package/dist/adapters/type-ast-bridge/lazy-node.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/load-typescript.cjs +57 -0
- package/dist/adapters/type-ast-bridge/load-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/load-typescript.mjs +51 -0
- package/dist/adapters/type-ast-bridge/load-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/print-typescript.cjs +21 -0
- package/dist/adapters/type-ast-bridge/print-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/print-typescript.mjs +19 -0
- package/dist/adapters/type-ast-bridge/print-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.cjs +33 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.mjs +29 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.cjs +204 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.mjs +201 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.mjs.map +1 -0
- package/dist/api/ast-to-string.cjs +39 -0
- package/dist/api/ast-to-string.cjs.map +1 -0
- package/dist/api/ast-to-string.mjs +37 -0
- package/dist/api/ast-to-string.mjs.map +1 -0
- package/dist/api/comment-header.cjs +11 -0
- package/dist/api/comment-header.cjs.map +1 -0
- package/dist/api/comment-header.mjs +9 -0
- package/dist/api/comment-header.mjs.map +1 -0
- package/dist/api/default-ports.cjs +38 -0
- package/dist/api/default-ports.cjs.map +1 -0
- package/dist/api/default-ports.mjs +28 -0
- package/dist/api/default-ports.mjs.map +1 -0
- package/dist/api/discriminator-enum.cjs +44 -0
- package/dist/api/discriminator-enum.cjs.map +1 -0
- package/dist/api/discriminator-enum.mjs +42 -0
- package/dist/api/discriminator-enum.mjs.map +1 -0
- package/dist/api/discriminator-scan.cjs +168 -0
- package/dist/api/discriminator-scan.cjs.map +1 -0
- package/dist/api/discriminator-scan.mjs +165 -0
- package/dist/api/discriminator-scan.mjs.map +1 -0
- package/dist/api/document-declarations.cjs +28 -0
- package/dist/api/document-declarations.cjs.map +1 -0
- package/dist/api/document-declarations.mjs +26 -0
- package/dist/api/document-declarations.mjs.map +1 -0
- package/dist/api/document-refs.cjs +53 -0
- package/dist/api/document-refs.cjs.map +1 -0
- package/dist/api/document-refs.mjs +50 -0
- package/dist/api/document-refs.mjs.map +1 -0
- package/dist/api/document-run.cjs +107 -0
- package/dist/api/document-run.cjs.map +1 -0
- package/dist/api/document-run.mjs +101 -0
- package/dist/api/document-run.mjs.map +1 -0
- package/dist/api/footer-entry.cjs +18 -0
- package/dist/api/footer-entry.cjs.map +1 -0
- package/dist/api/footer-entry.mjs +15 -0
- package/dist/api/footer-entry.mjs.map +1 -0
- package/dist/api/footer-sink.cjs +53 -0
- package/dist/api/footer-sink.cjs.map +1 -0
- package/dist/api/footer-sink.mjs +51 -0
- package/dist/api/footer-sink.mjs.map +1 -0
- package/dist/api/legacy-callback-warning.cjs +25 -0
- package/dist/api/legacy-callback-warning.cjs.map +1 -0
- package/dist/api/legacy-callback-warning.mjs +22 -0
- package/dist/api/legacy-callback-warning.mjs.map +1 -0
- package/dist/api/legacy-ts-helpers.cjs +203 -0
- package/dist/api/legacy-ts-helpers.cjs.map +1 -0
- package/dist/api/legacy-ts-helpers.mjs +187 -0
- package/dist/api/legacy-ts-helpers.mjs.map +1 -0
- package/dist/api/legacy-utils.cjs +65 -0
- package/dist/api/legacy-utils.cjs.map +1 -0
- package/dist/api/legacy-utils.mjs +50 -0
- package/dist/api/legacy-utils.mjs.map +1 -0
- package/dist/api/openapi-ts.cjs +40 -0
- package/dist/api/openapi-ts.cjs.map +1 -0
- package/dist/api/openapi-ts.mjs +34 -0
- package/dist/api/openapi-ts.mjs.map +1 -0
- package/dist/api/schema-callbacks.cjs +140 -0
- package/dist/api/schema-callbacks.cjs.map +1 -0
- package/dist/api/schema-callbacks.mjs +136 -0
- package/dist/api/schema-callbacks.mjs.map +1 -0
- package/dist/api/string-to-ast.cjs +21 -0
- package/dist/api/string-to-ast.cjs.map +1 -0
- package/dist/api/string-to-ast.mjs +18 -0
- package/dist/api/string-to-ast.mjs.map +1 -0
- package/dist/api/transform-context.cjs +82 -0
- package/dist/api/transform-context.cjs.map +1 -0
- package/dist/api/transform-context.mjs +65 -0
- package/dist/api/transform-context.mjs.map +1 -0
- package/dist/api/transform-schema.cjs +31 -0
- package/dist/api/transform-schema.cjs.map +1 -0
- package/dist/api/transform-schema.mjs +26 -0
- package/dist/api/transform-schema.mjs.map +1 -0
- package/dist/api/type-helpers.cjs +85 -0
- package/dist/api/type-helpers.cjs.map +1 -0
- package/dist/api/type-helpers.mjs +66 -0
- package/dist/api/type-helpers.mjs.map +1 -0
- package/dist/api/unsupported-feature-warnings.cjs +17 -0
- package/dist/api/unsupported-feature-warnings.cjs.map +1 -0
- package/dist/api/unsupported-feature-warnings.mjs +15 -0
- package/dist/api/unsupported-feature-warnings.mjs.map +1 -0
- package/dist/application/print/comment-writer.cjs +95 -0
- package/dist/application/print/comment-writer.cjs.map +1 -0
- package/dist/application/print/comment-writer.mjs +93 -0
- package/dist/application/print/comment-writer.mjs.map +1 -0
- package/dist/application/print/declaration-printer.cjs +83 -0
- package/dist/application/print/declaration-printer.cjs.map +1 -0
- package/dist/application/print/declaration-printer.mjs +81 -0
- package/dist/application/print/declaration-printer.mjs.map +1 -0
- package/dist/application/print/literal-text.cjs +52 -0
- package/dist/application/print/literal-text.cjs.map +1 -0
- package/dist/application/print/literal-text.mjs +48 -0
- package/dist/application/print/literal-text.mjs.map +1 -0
- package/dist/application/print/print-nodes.cjs +38 -0
- package/dist/application/print/print-nodes.cjs.map +1 -0
- package/dist/application/print/print-nodes.mjs +36 -0
- package/dist/application/print/print-nodes.mjs.map +1 -0
- package/dist/application/print/print-options.cjs +6 -0
- package/dist/application/print/print-options.cjs.map +1 -0
- package/dist/application/print/print-options.mjs +4 -0
- package/dist/application/print/print-options.mjs.map +1 -0
- package/dist/application/print/text-writer.cjs +63 -0
- package/dist/application/print/text-writer.cjs.map +1 -0
- package/dist/application/print/text-writer.mjs +60 -0
- package/dist/application/print/text-writer.mjs.map +1 -0
- package/dist/application/print/type-printer.cjs +214 -0
- package/dist/application/print/type-printer.cjs.map +1 -0
- package/dist/application/print/type-printer.mjs +210 -0
- package/dist/application/print/type-printer.mjs.map +1 -0
- package/dist/application/stack-overflow.cjs +36 -0
- package/dist/application/stack-overflow.cjs.map +1 -0
- package/dist/application/stack-overflow.mjs +31 -0
- package/dist/application/stack-overflow.mjs.map +1 -0
- package/dist/application/transform/document/components.cjs +104 -0
- package/dist/application/transform/document/components.cjs.map +1 -0
- package/dist/application/transform/document/components.mjs +102 -0
- package/dist/application/transform/document/components.mjs.map +1 -0
- package/dist/application/transform/document/defs-root.cjs +18 -0
- package/dist/application/transform/document/defs-root.cjs.map +1 -0
- package/dist/application/transform/document/defs-root.mjs +16 -0
- package/dist/application/transform/document/defs-root.mjs.map +1 -0
- package/dist/application/transform/document/document-member.cjs +13 -0
- package/dist/application/transform/document/document-member.cjs.map +1 -0
- package/dist/application/transform/document/document-member.mjs +11 -0
- package/dist/application/transform/document/document-member.mjs.map +1 -0
- package/dist/application/transform/document/document.cjs +86 -0
- package/dist/application/transform/document/document.cjs.map +1 -0
- package/dist/application/transform/document/document.mjs +83 -0
- package/dist/application/transform/document/document.mjs.map +1 -0
- package/dist/application/transform/document/header.cjs +27 -0
- package/dist/application/transform/document/header.cjs.map +1 -0
- package/dist/application/transform/document/header.mjs +25 -0
- package/dist/application/transform/document/header.mjs.map +1 -0
- package/dist/application/transform/document/kept-deprecated.cjs +96 -0
- package/dist/application/transform/document/kept-deprecated.cjs.map +1 -0
- package/dist/application/transform/document/kept-deprecated.mjs +94 -0
- package/dist/application/transform/document/kept-deprecated.mjs.map +1 -0
- package/dist/application/transform/document/media-type.cjs +42 -0
- package/dist/application/transform/document/media-type.cjs.map +1 -0
- package/dist/application/transform/document/media-type.mjs +38 -0
- package/dist/application/transform/document/media-type.mjs.map +1 -0
- package/dist/application/transform/document/operation.cjs +45 -0
- package/dist/application/transform/document/operation.cjs.map +1 -0
- package/dist/application/transform/document/operation.mjs +43 -0
- package/dist/application/transform/document/operation.mjs.map +1 -0
- package/dist/application/transform/document/parameter.cjs +25 -0
- package/dist/application/transform/document/parameter.cjs.map +1 -0
- package/dist/application/transform/document/parameter.mjs +23 -0
- package/dist/application/transform/document/parameter.mjs.map +1 -0
- package/dist/application/transform/document/parameters.cjs +114 -0
- package/dist/application/transform/document/parameters.cjs.map +1 -0
- package/dist/application/transform/document/parameters.mjs +112 -0
- package/dist/application/transform/document/parameters.mjs.map +1 -0
- package/dist/application/transform/document/path-item-conflicts.cjs +51 -0
- package/dist/application/transform/document/path-item-conflicts.cjs.map +1 -0
- package/dist/application/transform/document/path-item-conflicts.mjs +49 -0
- package/dist/application/transform/document/path-item-conflicts.mjs.map +1 -0
- package/dist/application/transform/document/path-item.cjs +82 -0
- package/dist/application/transform/document/path-item.cjs.map +1 -0
- package/dist/application/transform/document/path-item.mjs +80 -0
- package/dist/application/transform/document/path-item.mjs.map +1 -0
- package/dist/application/transform/document/path-key-overlaps.cjs +57 -0
- package/dist/application/transform/document/path-key-overlaps.cjs.map +1 -0
- package/dist/application/transform/document/path-key-overlaps.mjs +55 -0
- package/dist/application/transform/document/path-key-overlaps.mjs.map +1 -0
- package/dist/application/transform/document/paths-enum.cjs +75 -0
- package/dist/application/transform/document/paths-enum.cjs.map +1 -0
- package/dist/application/transform/document/paths-enum.mjs +72 -0
- package/dist/application/transform/document/paths-enum.mjs.map +1 -0
- package/dist/application/transform/document/paths.cjs +127 -0
- package/dist/application/transform/document/paths.cjs.map +1 -0
- package/dist/application/transform/document/paths.mjs +125 -0
- package/dist/application/transform/document/paths.mjs.map +1 -0
- package/dist/application/transform/document/request-body.cjs +36 -0
- package/dist/application/transform/document/request-body.cjs.map +1 -0
- package/dist/application/transform/document/request-body.mjs +34 -0
- package/dist/application/transform/document/request-body.mjs.map +1 -0
- package/dist/application/transform/document/response.cjs +59 -0
- package/dist/application/transform/document/response.cjs.map +1 -0
- package/dist/application/transform/document/response.mjs +57 -0
- package/dist/application/transform/document/response.mjs.map +1 -0
- package/dist/application/transform/document/responses.cjs +23 -0
- package/dist/application/transform/document/responses.cjs.map +1 -0
- package/dist/application/transform/document/responses.mjs +21 -0
- package/dist/application/transform/document/responses.mjs.map +1 -0
- package/dist/application/transform/document/root-type-aliases.cjs +69 -0
- package/dist/application/transform/document/root-type-aliases.cjs.map +1 -0
- package/dist/application/transform/document/root-type-aliases.mjs +65 -0
- package/dist/application/transform/document/root-type-aliases.mjs.map +1 -0
- package/dist/application/transform/document/webhooks.cjs +19 -0
- package/dist/application/transform/document/webhooks.cjs.map +1 -0
- package/dist/application/transform/document/webhooks.mjs +17 -0
- package/dist/application/transform/document/webhooks.mjs.map +1 -0
- package/dist/application/transform/document-entries.cjs +17 -0
- package/dist/application/transform/document-entries.cjs.map +1 -0
- package/dist/application/transform/document-entries.mjs +14 -0
- package/dist/application/transform/document-entries.mjs.map +1 -0
- package/dist/application/transform/footer/document-footer.cjs +88 -0
- package/dist/application/transform/footer/document-footer.cjs.map +1 -0
- package/dist/application/transform/footer/document-footer.mjs +86 -0
- package/dist/application/transform/footer/document-footer.mjs.map +1 -0
- package/dist/application/transform/footer/enum-naming.cjs +121 -0
- package/dist/application/transform/footer/enum-naming.cjs.map +1 -0
- package/dist/application/transform/footer/enum-naming.mjs +115 -0
- package/dist/application/transform/footer/enum-naming.mjs.map +1 -0
- package/dist/application/transform/helper-types.cjs +68 -0
- package/dist/application/transform/helper-types.cjs.map +1 -0
- package/dist/application/transform/helper-types.mjs +65 -0
- package/dist/application/transform/helper-types.mjs.map +1 -0
- package/dist/application/transform/literal-type.cjs +36 -0
- package/dist/application/transform/literal-type.cjs.map +1 -0
- package/dist/application/transform/literal-type.mjs +34 -0
- package/dist/application/transform/literal-type.mjs.map +1 -0
- package/dist/application/transform/numbered-names.cjs +18 -0
- package/dist/application/transform/numbered-names.cjs.map +1 -0
- package/dist/application/transform/numbered-names.mjs +16 -0
- package/dist/application/transform/numbered-names.mjs.map +1 -0
- package/dist/application/transform/ref-type.cjs +57 -0
- package/dist/application/transform/ref-type.cjs.map +1 -0
- package/dist/application/transform/ref-type.mjs +54 -0
- package/dist/application/transform/ref-type.mjs.map +1 -0
- package/dist/application/transform/schema/array-type.cjs +105 -0
- package/dist/application/transform/schema/array-type.cjs.map +1 -0
- package/dist/application/transform/schema/array-type.mjs +103 -0
- package/dist/application/transform/schema/array-type.mjs.map +1 -0
- package/dist/application/transform/schema/composition-type.cjs +107 -0
- package/dist/application/transform/schema/composition-type.cjs.map +1 -0
- package/dist/application/transform/schema/composition-type.mjs +105 -0
- package/dist/application/transform/schema/composition-type.mjs.map +1 -0
- package/dist/application/transform/schema/core-type.cjs +84 -0
- package/dist/application/transform/schema/core-type.cjs.map +1 -0
- package/dist/application/transform/schema/core-type.mjs +82 -0
- package/dist/application/transform/schema/core-type.mjs.map +1 -0
- package/dist/application/transform/schema/discriminator-property.cjs +21 -0
- package/dist/application/transform/schema/discriminator-property.cjs.map +1 -0
- package/dist/application/transform/schema/discriminator-property.mjs +19 -0
- package/dist/application/transform/schema/discriminator-property.mjs.map +1 -0
- package/dist/application/transform/schema/enum-rule.cjs +107 -0
- package/dist/application/transform/schema/enum-rule.cjs.map +1 -0
- package/dist/application/transform/schema/enum-rule.mjs +105 -0
- package/dist/application/transform/schema/enum-rule.mjs.map +1 -0
- package/dist/application/transform/schema/object-type.cjs +173 -0
- package/dist/application/transform/schema/object-type.cjs.map +1 -0
- package/dist/application/transform/schema/object-type.mjs +170 -0
- package/dist/application/transform/schema/object-type.mjs.map +1 -0
- package/dist/application/transform/schema/presence-members.cjs +59 -0
- package/dist/application/transform/schema/presence-members.cjs.map +1 -0
- package/dist/application/transform/schema/presence-members.mjs +57 -0
- package/dist/application/transform/schema/presence-members.mjs.map +1 -0
- package/dist/application/transform/schema/schema-transform.cjs +72 -0
- package/dist/application/transform/schema/schema-transform.cjs.map +1 -0
- package/dist/application/transform/schema/schema-transform.mjs +68 -0
- package/dist/application/transform/schema/schema-transform.mjs.map +1 -0
- package/dist/application/transform/schema/unevaluated-properties.cjs +61 -0
- package/dist/application/transform/schema/unevaluated-properties.cjs.map +1 -0
- package/dist/application/transform/schema/unevaluated-properties.mjs +59 -0
- package/dist/application/transform/schema/unevaluated-properties.mjs.map +1 -0
- package/dist/application/transform/schema-comment.cjs +84 -0
- package/dist/application/transform/schema-comment.cjs.map +1 -0
- package/dist/application/transform/schema-comment.mjs +81 -0
- package/dist/application/transform/schema-comment.mjs.map +1 -0
- package/dist/application/transform/shared-types.cjs +8 -0
- package/dist/application/transform/shared-types.cjs.map +1 -0
- package/dist/application/transform/shared-types.mjs +6 -0
- package/dist/application/transform/shared-types.mjs.map +1 -0
- package/dist/application/transform/type-combinators.cjs +49 -0
- package/dist/application/transform/type-combinators.cjs.map +1 -0
- package/dist/application/transform/type-combinators.mjs +42 -0
- package/dist/application/transform/type-combinators.mjs.map +1 -0
- package/dist/cli/cli-arguments.cjs +137 -0
- package/dist/cli/cli-arguments.cjs.map +1 -0
- package/dist/cli/cli-arguments.mjs +129 -0
- package/dist/cli/cli-arguments.mjs.map +1 -0
- package/dist/cli/cli-errors.cjs +80 -0
- package/dist/cli/cli-errors.cjs.map +1 -0
- package/dist/cli/cli-errors.mjs +76 -0
- package/dist/cli/cli-errors.mjs.map +1 -0
- package/dist/cli/cli-output.cjs +37 -0
- package/dist/cli/cli-output.cjs.map +1 -0
- package/dist/cli/cli-output.mjs +30 -0
- package/dist/cli/cli-output.mjs.map +1 -0
- package/dist/cli/docs-links.cjs +6 -0
- package/dist/cli/docs-links.cjs.map +1 -0
- package/dist/cli/docs-links.mjs +4 -0
- package/dist/cli/docs-links.mjs.map +1 -0
- package/dist/cli/fix-option.cjs +19 -0
- package/dist/cli/fix-option.cjs.map +1 -0
- package/dist/cli/fix-option.mjs +16 -0
- package/dist/cli/fix-option.mjs.map +1 -0
- package/dist/cli/help-text.cjs +44 -0
- package/dist/cli/help-text.cjs.map +1 -0
- package/dist/cli/help-text.mjs +42 -0
- package/dist/cli/help-text.mjs.map +1 -0
- package/dist/cli/main.cjs +62 -0
- package/dist/cli/main.cjs.map +1 -0
- package/dist/cli/main.d.cts +2 -0
- package/dist/cli/main.d.mts +2 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.mjs +54 -0
- package/dist/cli/main.mjs.map +1 -0
- package/dist/cli/redocly-apis.cjs +65 -0
- package/dist/cli/redocly-apis.cjs.map +1 -0
- package/dist/cli/redocly-apis.mjs +62 -0
- package/dist/cli/redocly-apis.mjs.map +1 -0
- package/dist/cli/ref-limits.cjs +14 -0
- package/dist/cli/ref-limits.cjs.map +1 -0
- package/dist/cli/ref-limits.mjs +12 -0
- package/dist/cli/ref-limits.mjs.map +1 -0
- package/dist/cli/run-cli.cjs +100 -0
- package/dist/cli/run-cli.cjs.map +1 -0
- package/dist/cli/run-cli.mjs +98 -0
- package/dist/cli/run-cli.mjs.map +1 -0
- package/dist/domain/assert-never.cjs +8 -0
- package/dist/domain/assert-never.cjs.map +1 -0
- package/dist/domain/assert-never.mjs +6 -0
- package/dist/domain/assert-never.mjs.map +1 -0
- package/dist/domain/errors.cjs +50 -0
- package/dist/domain/errors.cjs.map +1 -0
- package/dist/domain/errors.mjs +46 -0
- package/dist/domain/errors.mjs.map +1 -0
- package/dist/domain/ir/constructors.cjs +89 -0
- package/dist/domain/ir/constructors.cjs.map +1 -0
- package/dist/domain/ir/constructors.mjs +71 -0
- package/dist/domain/ir/constructors.mjs.map +1 -0
- package/dist/domain/ir/identifier-text.cjs +29 -0
- package/dist/domain/ir/identifier-text.cjs.map +1 -0
- package/dist/domain/ir/identifier-text.mjs +25 -0
- package/dist/domain/ir/identifier-text.mjs.map +1 -0
- package/dist/domain/ir/newer-identifier-ranges.cjs +109 -0
- package/dist/domain/ir/newer-identifier-ranges.cjs.map +1 -0
- package/dist/domain/ir/newer-identifier-ranges.mjs +106 -0
- package/dist/domain/ir/newer-identifier-ranges.mjs.map +1 -0
- package/dist/domain/ir/normalize.cjs +32 -0
- package/dist/domain/ir/normalize.cjs.map +1 -0
- package/dist/domain/ir/normalize.mjs +29 -0
- package/dist/domain/ir/normalize.mjs.map +1 -0
- package/dist/domain/ir/property-name.cjs +19 -0
- package/dist/domain/ir/property-name.cjs.map +1 -0
- package/dist/domain/ir/property-name.mjs +16 -0
- package/dist/domain/ir/property-name.mjs.map +1 -0
- package/dist/domain/ir/raw-text-escapes.cjs +25 -0
- package/dist/domain/ir/raw-text-escapes.cjs.map +1 -0
- package/dist/domain/ir/raw-text-escapes.mjs +22 -0
- package/dist/domain/ir/raw-text-escapes.mjs.map +1 -0
- package/dist/domain/openapi/alias-expansion.cjs +50 -0
- package/dist/domain/openapi/alias-expansion.cjs.map +1 -0
- package/dist/domain/openapi/alias-expansion.mjs +45 -0
- package/dist/domain/openapi/alias-expansion.mjs.map +1 -0
- package/dist/domain/openapi/binary-content.cjs +48 -0
- package/dist/domain/openapi/binary-content.cjs.map +1 -0
- package/dist/domain/openapi/binary-content.mjs +45 -0
- package/dist/domain/openapi/binary-content.mjs.map +1 -0
- package/dist/domain/openapi/components-object.cjs +29 -0
- package/dist/domain/openapi/components-object.cjs.map +1 -0
- package/dist/domain/openapi/components-object.mjs +24 -0
- package/dist/domain/openapi/components-object.mjs.map +1 -0
- package/dist/domain/openapi/json-pointer.cjs +31 -0
- package/dist/domain/openapi/json-pointer.cjs.map +1 -0
- package/dist/domain/openapi/json-pointer.mjs +27 -0
- package/dist/domain/openapi/json-pointer.mjs.map +1 -0
- package/dist/domain/openapi/media-type-object.cjs +14 -0
- package/dist/domain/openapi/media-type-object.cjs.map +1 -0
- package/dist/domain/openapi/media-type-object.mjs +11 -0
- package/dist/domain/openapi/media-type-object.mjs.map +1 -0
- package/dist/domain/openapi/parameter-object.cjs +13 -0
- package/dist/domain/openapi/parameter-object.cjs.map +1 -0
- package/dist/domain/openapi/parameter-object.mjs +10 -0
- package/dist/domain/openapi/parameter-object.mjs.map +1 -0
- package/dist/domain/openapi/path-item-object.cjs +35 -0
- package/dist/domain/openapi/path-item-object.cjs.map +1 -0
- package/dist/domain/openapi/path-item-object.mjs +30 -0
- package/dist/domain/openapi/path-item-object.mjs.map +1 -0
- package/dist/domain/openapi/unsupported-features.cjs +87 -0
- package/dist/domain/openapi/unsupported-features.cjs.map +1 -0
- package/dist/domain/openapi/unsupported-features.mjs +84 -0
- package/dist/domain/openapi/unsupported-features.mjs.map +1 -0
- package/dist/domain/output-fixes.cjs +66 -0
- package/dist/domain/output-fixes.cjs.map +1 -0
- package/dist/domain/output-fixes.mjs +59 -0
- package/dist/domain/output-fixes.mjs.map +1 -0
- package/dist/index.cjs +98 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +812 -0
- package/dist/index.d.mts +812 -0
- package/dist/index.d.ts +812 -0
- package/dist/index.mjs +27 -0
- package/dist/index.mjs.map +1 -0
- package/dist/transform/components-object.cjs +14 -0
- package/dist/transform/components-object.cjs.map +1 -0
- package/dist/transform/components-object.mjs +10 -0
- package/dist/transform/components-object.mjs.map +1 -0
- package/dist/transform/header-object.cjs +12 -0
- package/dist/transform/header-object.cjs.map +1 -0
- package/dist/transform/header-object.mjs +10 -0
- package/dist/transform/header-object.mjs.map +1 -0
- package/dist/transform/media-type-object.cjs +12 -0
- package/dist/transform/media-type-object.cjs.map +1 -0
- package/dist/transform/media-type-object.mjs +10 -0
- package/dist/transform/media-type-object.mjs.map +1 -0
- package/dist/transform/operation-object.cjs +26 -0
- package/dist/transform/operation-object.cjs.map +1 -0
- package/dist/transform/operation-object.mjs +21 -0
- package/dist/transform/operation-object.mjs.map +1 -0
- package/dist/transform/parameter-object.cjs +12 -0
- package/dist/transform/parameter-object.cjs.map +1 -0
- package/dist/transform/parameter-object.mjs +10 -0
- package/dist/transform/parameter-object.mjs.map +1 -0
- package/dist/transform/path-item-object.cjs +12 -0
- package/dist/transform/path-item-object.cjs.map +1 -0
- package/dist/transform/path-item-object.mjs +10 -0
- package/dist/transform/path-item-object.mjs.map +1 -0
- package/dist/transform/paths-object.cjs +11 -0
- package/dist/transform/paths-object.cjs.map +1 -0
- package/dist/transform/paths-object.mjs +9 -0
- package/dist/transform/paths-object.mjs.map +1 -0
- package/dist/transform/request-body-object.cjs +12 -0
- package/dist/transform/request-body-object.cjs.map +1 -0
- package/dist/transform/request-body-object.mjs +10 -0
- package/dist/transform/request-body-object.mjs.map +1 -0
- package/dist/transform/response-object.cjs +12 -0
- package/dist/transform/response-object.cjs.map +1 -0
- package/dist/transform/response-object.mjs +10 -0
- package/dist/transform/response-object.mjs.map +1 -0
- package/dist/transform/responses-object.cjs +12 -0
- package/dist/transform/responses-object.cjs.map +1 -0
- package/dist/transform/responses-object.mjs +10 -0
- package/dist/transform/responses-object.mjs.map +1 -0
- package/dist/transform/schema-object.cjs +21 -0
- package/dist/transform/schema-object.cjs.map +1 -0
- package/dist/transform/schema-object.mjs +16 -0
- package/dist/transform/schema-object.mjs.map +1 -0
- package/package.json +115 -4
- package/src/adapters/node-file-system/node-file-system.ts +44 -0
- package/src/adapters/redocly-loader/alias-limit.ts +20 -0
- package/src/adapters/redocly-loader/allowed-hosts.ts +62 -0
- package/src/adapters/redocly-loader/bundled-ref-repair.ts +65 -0
- package/src/adapters/redocly-loader/malformed-refs.ts +61 -0
- package/src/adapters/redocly-loader/redocly-config-source.ts +43 -0
- package/src/adapters/redocly-loader/redocly-schema-loader.ts +246 -0
- package/src/adapters/redocly-loader/ref-access.ts +146 -0
- package/src/adapters/redocly-loader/ref-holders.ts +43 -0
- package/src/adapters/redocly-loader/remote-fetch.ts +104 -0
- package/src/adapters/redocly-loader/schema-load-errors.ts +124 -0
- package/src/adapters/redocly-loader/schema-source.ts +151 -0
- package/src/adapters/redocly-loader/unsupported-keys.ts +102 -0
- package/src/adapters/terminal-logger/terminal-logger.ts +98 -0
- package/src/adapters/type-ast-bridge/footer-nodes.ts +38 -0
- package/src/adapters/type-ast-bridge/ir-declarations-to-typescript.ts +100 -0
- package/src/adapters/type-ast-bridge/ir-to-typescript.ts +220 -0
- package/src/adapters/type-ast-bridge/lazy-node.ts +24 -0
- package/src/adapters/type-ast-bridge/load-typescript.ts +84 -0
- package/src/adapters/type-ast-bridge/print-typescript.ts +33 -0
- package/src/adapters/type-ast-bridge/typescript-raw-text.ts +49 -0
- package/src/adapters/type-ast-bridge/typescript-to-ir.ts +280 -0
- package/src/adapters/type-ast-bridge/typescript-types.ts +8 -0
- package/src/api/ast-to-string.ts +59 -0
- package/src/api/comment-header.ts +7 -0
- package/src/api/default-ports.ts +44 -0
- package/src/api/discriminator-enum.ts +76 -0
- package/src/api/discriminator-scan.ts +272 -0
- package/src/api/document-declarations.ts +41 -0
- package/src/api/document-refs.ts +71 -0
- package/src/api/document-run.ts +159 -0
- package/src/api/footer-entry.ts +23 -0
- package/src/api/footer-sink.ts +67 -0
- package/src/api/legacy-callback-warning.ts +29 -0
- package/src/api/legacy-ts-helpers.ts +311 -0
- package/src/api/legacy-utils.ts +118 -0
- package/src/api/openapi-ts.ts +62 -0
- package/src/api/schema-callbacks.ts +211 -0
- package/src/api/string-to-ast.ts +27 -0
- package/src/api/transform-context.ts +87 -0
- package/src/api/transform-schema.ts +39 -0
- package/src/api/type-helpers.ts +130 -0
- package/src/api/unsupported-feature-warnings.ts +26 -0
- package/src/application/ports/file-system.ts +12 -0
- package/src/application/ports/logger.ts +16 -0
- package/src/application/ports/redocly-config-source.ts +16 -0
- package/src/application/ports/schema-loader.ts +32 -0
- package/src/application/print/comment-writer.ts +91 -0
- package/src/application/print/declaration-printer.ts +100 -0
- package/src/application/print/literal-text.ts +62 -0
- package/src/application/print/print-nodes.ts +62 -0
- package/src/application/print/print-options.ts +11 -0
- package/src/application/print/text-writer.ts +83 -0
- package/src/application/print/type-printer.ts +281 -0
- package/src/application/stack-overflow.ts +54 -0
- package/src/application/transform/document/components.ts +189 -0
- package/src/application/transform/document/defs-root.ts +25 -0
- package/src/application/transform/document/document-member.ts +20 -0
- package/src/application/transform/document/document.ts +157 -0
- package/src/application/transform/document/header.ts +34 -0
- package/src/application/transform/document/kept-deprecated.ts +135 -0
- package/src/application/transform/document/media-type.ts +78 -0
- package/src/application/transform/document/operation.ts +64 -0
- package/src/application/transform/document/parameter.ts +45 -0
- package/src/application/transform/document/parameters.ts +200 -0
- package/src/application/transform/document/path-item-conflicts.ts +79 -0
- package/src/application/transform/document/path-item.ts +168 -0
- package/src/application/transform/document/path-key-overlaps.ts +112 -0
- package/src/application/transform/document/paths-enum.ts +127 -0
- package/src/application/transform/document/paths.ts +211 -0
- package/src/application/transform/document/request-body.ts +50 -0
- package/src/application/transform/document/response.ts +109 -0
- package/src/application/transform/document/responses.ts +29 -0
- package/src/application/transform/document/root-type-aliases.ts +106 -0
- package/src/application/transform/document/webhooks.ts +22 -0
- package/src/application/transform/document-entries.ts +28 -0
- package/src/application/transform/footer/document-footer.ts +127 -0
- package/src/application/transform/footer/enum-naming.ts +181 -0
- package/src/application/transform/helper-types.ts +92 -0
- package/src/application/transform/literal-type.ts +54 -0
- package/src/application/transform/numbered-names.ts +20 -0
- package/src/application/transform/ref-type.ts +97 -0
- package/src/application/transform/schema/array-type.ts +152 -0
- package/src/application/transform/schema/composition-type.ts +183 -0
- package/src/application/transform/schema/core-type.ts +115 -0
- package/src/application/transform/schema/discriminator-property.ts +28 -0
- package/src/application/transform/schema/enum-rule.ts +157 -0
- package/src/application/transform/schema/object-type.ts +271 -0
- package/src/application/transform/schema/presence-members.ts +96 -0
- package/src/application/transform/schema/schema-context.ts +110 -0
- package/src/application/transform/schema/schema-rule.ts +29 -0
- package/src/application/transform/schema/schema-transform.ts +99 -0
- package/src/application/transform/schema/unevaluated-properties.ts +105 -0
- package/src/application/transform/schema-comment.ts +116 -0
- package/src/application/transform/shared-types.ts +9 -0
- package/src/application/transform/transform-context.ts +51 -0
- package/src/application/transform/type-combinators.ts +57 -0
- package/src/cli/cli-arguments.ts +198 -0
- package/src/cli/cli-dependencies.ts +42 -0
- package/src/cli/cli-errors.ts +125 -0
- package/src/cli/cli-output.ts +53 -0
- package/src/cli/docs-links.ts +6 -0
- package/src/cli/fix-option.ts +29 -0
- package/src/cli/help-text.ts +52 -0
- package/src/cli/main.ts +67 -0
- package/src/cli/redocly-apis.ts +91 -0
- package/src/cli/ref-limits.ts +16 -0
- package/src/cli/run-cli.ts +114 -0
- package/src/domain/assert-never.ts +8 -0
- package/src/domain/errors.ts +74 -0
- package/src/domain/ir/constructors.ts +137 -0
- package/src/domain/ir/identifier-text.ts +49 -0
- package/src/domain/ir/newer-identifier-ranges.ts +109 -0
- package/src/domain/ir/nodes.ts +224 -0
- package/src/domain/ir/normalize.ts +51 -0
- package/src/domain/ir/property-name.ts +28 -0
- package/src/domain/ir/raw-text-escapes.ts +37 -0
- package/src/domain/openapi/alias-expansion.ts +72 -0
- package/src/domain/openapi/binary-content.ts +74 -0
- package/src/domain/openapi/components-object.ts +52 -0
- package/src/domain/openapi/document-object.ts +12 -0
- package/src/domain/openapi/header-object.ts +9 -0
- package/src/domain/openapi/json-pointer.ts +46 -0
- package/src/domain/openapi/media-type-object.ts +26 -0
- package/src/domain/openapi/operation-object.ts +13 -0
- package/src/domain/openapi/parameter-object.ts +30 -0
- package/src/domain/openapi/path-item-object.ts +70 -0
- package/src/domain/openapi/request-body-object.ts +7 -0
- package/src/domain/openapi/response-object.ts +14 -0
- package/src/domain/openapi/schema-object.ts +59 -0
- package/src/domain/openapi/unsupported-features.ts +139 -0
- package/src/domain/output-fixes.ts +95 -0
- package/src/index.ts +67 -0
- package/src/transform/components-object.ts +25 -0
- package/src/transform/header-object.ts +19 -0
- package/src/transform/media-type-object.ts +19 -0
- package/src/transform/operation-object.ts +36 -0
- package/src/transform/parameter-object.ts +19 -0
- package/src/transform/parameters-array.ts +19 -0
- package/src/transform/path-item-object.ts +22 -0
- package/src/transform/paths-enum.ts +8 -0
- package/src/transform/paths-object.ts +15 -0
- package/src/transform/request-body-object.ts +19 -0
- package/src/transform/response-object.ts +19 -0
- package/src/transform/responses-object.ts +19 -0
- package/src/transform/schema-object.ts +36 -0
- package/src/transform/webhooks-object.ts +15 -0
- package/src/types/generator-options.ts +267 -0
- package/src/types/openapi-common.ts +100 -0
- package/src/types/openapi-document.ts +196 -0
- package/src/types/openapi-path-item.ts +130 -0
- package/src/types/openapi-request.ts +209 -0
- package/src/types/openapi-response.ts +81 -0
- package/src/types/openapi-schema.ts +169 -0
- package/src/types/openapi-security.ts +116 -0
- package/src/types.ts +12 -0
package/package.json
CHANGED
|
@@ -1,6 +1,117 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "openapi-typesafe",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"description": "Convert OpenAPI 3.0 & 3.1 schemas to TypeScript",
|
|
4
|
+
"version": "1.0.0-rc.0",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Fedor Chishchin",
|
|
7
|
+
"url": "https://github.com/fedorello"
|
|
8
|
+
},
|
|
9
|
+
"contributors": [
|
|
10
|
+
{
|
|
11
|
+
"name": "Drew Powers",
|
|
12
|
+
"email": "drew@pow.rs"
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"bin": {
|
|
17
|
+
"openapi-typesafe": "bin/cli.js"
|
|
18
|
+
},
|
|
19
|
+
"type": "module",
|
|
20
|
+
"main": "./dist/index.mjs",
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"exports": {
|
|
23
|
+
".": {
|
|
24
|
+
"import": {
|
|
25
|
+
"types": "./dist/index.d.mts",
|
|
26
|
+
"default": "./dist/index.mjs"
|
|
27
|
+
},
|
|
28
|
+
"require": {
|
|
29
|
+
"types": "./dist/index.d.cts",
|
|
30
|
+
"default": "./dist/index.cjs"
|
|
31
|
+
},
|
|
32
|
+
"default": "./dist/index.mjs"
|
|
33
|
+
},
|
|
34
|
+
"./*.js": "./*.mjs",
|
|
35
|
+
"./*": "./*"
|
|
36
|
+
},
|
|
37
|
+
"files": [
|
|
38
|
+
"bin",
|
|
39
|
+
"dist",
|
|
40
|
+
"src"
|
|
41
|
+
],
|
|
42
|
+
"homepage": "https://github.com/openapi-typesafe/openapi-typesafe#readme",
|
|
43
|
+
"repository": {
|
|
44
|
+
"type": "git",
|
|
45
|
+
"url": "git+https://github.com/openapi-typesafe/openapi-typesafe.git",
|
|
46
|
+
"directory": "packages/openapi-typesafe"
|
|
47
|
+
},
|
|
48
|
+
"keywords": [
|
|
49
|
+
"swagger",
|
|
50
|
+
"typescript",
|
|
51
|
+
"ts",
|
|
52
|
+
"dts",
|
|
53
|
+
"openapi",
|
|
54
|
+
"codegen",
|
|
55
|
+
"generation",
|
|
56
|
+
"openapi 3",
|
|
57
|
+
"node"
|
|
58
|
+
],
|
|
59
|
+
"bugs": {
|
|
60
|
+
"url": "https://github.com/openapi-typesafe/openapi-typesafe/issues"
|
|
61
|
+
},
|
|
62
|
+
"peerDependencies": {
|
|
63
|
+
"@typescript/typescript6": "^6.0.0",
|
|
64
|
+
"typescript": ">=5.0.0"
|
|
65
|
+
},
|
|
66
|
+
"peerDependenciesMeta": {
|
|
67
|
+
"@typescript/typescript6": {
|
|
68
|
+
"optional": true
|
|
69
|
+
},
|
|
70
|
+
"typescript": {
|
|
71
|
+
"optional": true
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
"dependencies": {
|
|
75
|
+
"@redocly/openapi-core": "^1.34.22",
|
|
76
|
+
"ansi-colors": "^4.1.3",
|
|
77
|
+
"change-case": "^5.4.4",
|
|
78
|
+
"parse-json": "^8.3.0",
|
|
79
|
+
"scule": "^1.3.0",
|
|
80
|
+
"supports-color": "^11.0.0",
|
|
81
|
+
"yargs-parser": "^22.0.0"
|
|
82
|
+
},
|
|
83
|
+
"devDependencies": {
|
|
84
|
+
"@types/js-yaml": "4.0.9",
|
|
85
|
+
"@types/yargs-parser": "21.0.3",
|
|
86
|
+
"@typescript/typescript6": "6.0.2",
|
|
87
|
+
"degit": "3.10.1",
|
|
88
|
+
"dependency-cruiser": "18.7.0",
|
|
89
|
+
"execa": "^10.2.1",
|
|
90
|
+
"fast-check": "4.10.2",
|
|
91
|
+
"strip-ansi": "7.2.0",
|
|
92
|
+
"typescript": "^6.0.3",
|
|
93
|
+
"vite-node": "6.0.0"
|
|
94
|
+
},
|
|
95
|
+
"engines": {
|
|
96
|
+
"node": ">=22.12.0"
|
|
97
|
+
},
|
|
98
|
+
"scripts": {
|
|
99
|
+
"build": "unbuild",
|
|
100
|
+
"dev": "tsc -p tsconfig.build.json --watch",
|
|
101
|
+
"download:schemas": "vite-node ./scripts/download-schemas.ts",
|
|
102
|
+
"format": "biome format . --write",
|
|
103
|
+
"lint": "pnpm run lint:js && pnpm run lint:ts && pnpm run lint:deps && pnpm run lint:sizes",
|
|
104
|
+
"lint:js": "biome check .",
|
|
105
|
+
"lint:ts": "tsc --noEmit && tsc -p tsconfig.strict.json",
|
|
106
|
+
"test": "pnpm run test:js && pnpm run test:examples && pnpm run test:exports",
|
|
107
|
+
"test:js": "vitest run",
|
|
108
|
+
"test:exports": "pnpm run build && ../../scripts/check-exports.sh",
|
|
109
|
+
"test:examples": "tsc -p tsconfig.examples.json --noEmit",
|
|
110
|
+
"update:examples": "pnpm run build && pnpm run download:schemas && vite-node ./scripts/update-examples.ts",
|
|
111
|
+
"prepublish": "pnpm run build",
|
|
112
|
+
"version": "pnpm run build",
|
|
113
|
+
"lint:deps": "depcruise src --config .dependency-cruiser.cjs",
|
|
114
|
+
"test:coverage": "vitest run --coverage",
|
|
115
|
+
"lint:sizes": "vite-node scripts/size-rules/check-sizes.ts src"
|
|
116
|
+
}
|
|
117
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import type { FileReader, FileWriter } from "../../application/ports/file-system.js";
|
|
4
|
+
import { ERROR_CODES, OpenAPITypesafeError } from "../../domain/errors.js";
|
|
5
|
+
|
|
6
|
+
/** The file ports on Node's `fs`, with the failures as typed errors (ADR-011). */
|
|
7
|
+
|
|
8
|
+
function causeMessage(cause: unknown): string {
|
|
9
|
+
return cause instanceof Error ? cause.message : String(cause);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
class NodeFileSystem implements FileReader, FileWriter {
|
|
13
|
+
readText(file: URL): string {
|
|
14
|
+
try {
|
|
15
|
+
return fs.readFileSync(file, "utf8");
|
|
16
|
+
} catch (cause) {
|
|
17
|
+
throw new OpenAPITypesafeError({
|
|
18
|
+
code: ERROR_CODES.OUTPUT_READ_FAILED,
|
|
19
|
+
message: `Cannot read ${fileURLToPath(file)}: ${causeMessage(cause)}`,
|
|
20
|
+
details: { file: fileURLToPath(file) },
|
|
21
|
+
cause,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
writeText(file: URL, contents: string): void {
|
|
27
|
+
try {
|
|
28
|
+
fs.mkdirSync(new URL(".", file), { recursive: true });
|
|
29
|
+
fs.writeFileSync(file, contents, "utf8");
|
|
30
|
+
} catch (cause) {
|
|
31
|
+
throw new OpenAPITypesafeError({
|
|
32
|
+
code: ERROR_CODES.OUTPUT_WRITE_FAILED,
|
|
33
|
+
message: `Cannot write ${fileURLToPath(file)}: ${causeMessage(cause)}`,
|
|
34
|
+
details: { file: fileURLToPath(file) },
|
|
35
|
+
cause,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** File access for the CLI. */
|
|
42
|
+
export function createNodeFileSystem(): FileReader & FileWriter {
|
|
43
|
+
return new NodeFileSystem();
|
|
44
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ALIAS_EXPANSION_MAX_RATIO,
|
|
3
|
+
countNodes,
|
|
4
|
+
isAliasExpansionExcessive,
|
|
5
|
+
} from "../../domain/openapi/alias-expansion.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The reason a parsed YAML document is refused, if its aliases expand it too far. The check runs
|
|
9
|
+
* right after parsing, before Redocly or the generator walk the document (pre-beta test plan 10.2).
|
|
10
|
+
*/
|
|
11
|
+
export function aliasExpansionFailure(parsed: unknown): Error | undefined {
|
|
12
|
+
const counts = countNodes(parsed);
|
|
13
|
+
if (!isAliasExpansionExcessive(counts)) {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
return new Error(
|
|
17
|
+
`YAML aliases expand the document from ${counts.stored} to ${counts.expanded} nodes, ` +
|
|
18
|
+
`more than ${ALIAS_EXPANSION_MAX_RATIO} times its size`,
|
|
19
|
+
);
|
|
20
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Matching URLs against the `--remote-ref-hosts` list (threat model R2, ADR-017). Both sides are
|
|
3
|
+
* compared as the WHATWG URL parser writes hosts (lower case, Punycode, dotted IPv4, compressed
|
|
4
|
+
* IPv6 in brackets), so `bücher.example`, `::1` and `api.example.com.` match the hosts they name.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const DEFAULT_PORTS: Readonly<Record<string, string>> = { "http:": "80", "https:": "443" };
|
|
8
|
+
const FULLY_QUALIFIED_DOT = /\.$/;
|
|
9
|
+
const PORT_SUFFIX = /:(\d+)$/;
|
|
10
|
+
/** Characters that end a host in a URL: an entry with them would match a different host. */
|
|
11
|
+
const NOT_A_HOST = /[/?#@\\]/;
|
|
12
|
+
|
|
13
|
+
interface HostEntry {
|
|
14
|
+
readonly hostname: string;
|
|
15
|
+
/** Undefined when the entry allows any port. */
|
|
16
|
+
readonly port: string | undefined;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** A bare IPv6 address has two colons or more and cannot carry a port; brackets add one. */
|
|
20
|
+
function withBrackets(entry: string): string {
|
|
21
|
+
const isBareIPv6 = !entry.startsWith("[") && entry.split(":").length > 2;
|
|
22
|
+
return isBareIPv6 ? `[${entry}]` : entry;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function hostnameOf(url: URL): string {
|
|
26
|
+
return url.hostname.replace(FULLY_QUALIFIED_DOT, "");
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function portOf(url: URL): string {
|
|
30
|
+
return url.port === "" ? (DEFAULT_PORTS[url.protocol] ?? "") : url.port;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** The written port without leading zeros, as the URL parser writes it; undefined when none. */
|
|
34
|
+
function writtenPort(entry: string): string | undefined {
|
|
35
|
+
const match = PORT_SUFFIX.exec(entry);
|
|
36
|
+
return match === null ? undefined : String(Number(match[1]));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** The entry as the URL parser reads it, or undefined when it is not a bare host or host:port. */
|
|
40
|
+
function parseHostEntry(entry: string): HostEntry | undefined {
|
|
41
|
+
const written = withBrackets(entry.trim());
|
|
42
|
+
const candidate = `http://${written}`;
|
|
43
|
+
if (written === "" || NOT_A_HOST.test(written) || !URL.canParse(candidate)) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
// The port is read from the text: the parser drops a default port (`:80`), which must still
|
|
47
|
+
// limit the entry to that port.
|
|
48
|
+
return { hostname: hostnameOf(new URL(candidate)), port: writtenPort(written) };
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Whether the URL's host is listed, by host name alone (any port) or with its port. */
|
|
52
|
+
export function isHostAllowed(url: URL, hosts: readonly string[]): boolean {
|
|
53
|
+
const hostname = hostnameOf(url);
|
|
54
|
+
if (hostname === "") {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
const port = portOf(url);
|
|
58
|
+
return hosts.map(parseHostEntry).some((entry) => {
|
|
59
|
+
const isAnyPort = entry?.port === undefined;
|
|
60
|
+
return entry?.hostname === hostname && (isAnyPort || entry.port === port);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { escapePointerSegment, parseRefPointer } from "../../domain/openapi/json-pointer.js";
|
|
2
|
+
import { findRefHolders } from "./ref-holders.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Redocly 1.x bundles an external `$ref` into a component named after the raw segment of the
|
|
6
|
+
* original pointer (`a~0b`, `50%`), and writes the new local `$ref` without escaping it. Read as a
|
|
7
|
+
* JSON Pointer, `#/components/schemas/a~0b` names the key `a~b`, which does not exist, and
|
|
8
|
+
* `#/components/schemas/50%` is malformed, so the generator failed on it. This rewrites every
|
|
9
|
+
* local `$ref` that does not resolve as a pointer but does resolve segment by segment as written.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const LOCAL_REF_PREFIX = "#/";
|
|
13
|
+
|
|
14
|
+
function isContainer(value: unknown): value is object {
|
|
15
|
+
return typeof value === "object" && value !== null;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function childAt(node: unknown, segment: string): unknown {
|
|
19
|
+
if (!isContainer(node) || !Object.hasOwn(node, segment)) {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
return (node as Record<string, unknown>)[segment];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function resolves(document: unknown, segments: readonly string[]): boolean {
|
|
26
|
+
return segments.reduce<unknown>(childAt, document) !== undefined;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** The pointer's segments, or null when the pointer has a malformed percent escape. */
|
|
30
|
+
function decodedSegments(ref: string): string[] | null {
|
|
31
|
+
try {
|
|
32
|
+
return parseRefPointer(ref);
|
|
33
|
+
} catch (error) {
|
|
34
|
+
if (error instanceof URIError) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
throw error;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** The repaired `$ref`, or null when the ref resolves already or cannot be repaired. */
|
|
42
|
+
function repairedRef(document: unknown, ref: string): string | null {
|
|
43
|
+
const decoded = decodedSegments(ref);
|
|
44
|
+
if (decoded && resolves(document, decoded)) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
const raw = ref.slice(LOCAL_REF_PREFIX.length).split("/").filter(Boolean);
|
|
48
|
+
if (!resolves(document, raw)) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
return `${LOCAL_REF_PREFIX}${raw.map(escapePointerSegment).join("/")}`;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Repair the local `$ref`s of a bundled document in place, as Redocly's bundle edits it. */
|
|
55
|
+
export function repairBundledRefs(document: unknown): void {
|
|
56
|
+
for (const { node } of findRefHolders(document)) {
|
|
57
|
+
if (!node.$ref.startsWith(LOCAL_REF_PREFIX)) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
const repaired = repairedRef(document, node.$ref);
|
|
61
|
+
if (repaired !== null) {
|
|
62
|
+
node.$ref = repaired;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { ERROR_CODES, OpenAPITypesafeError } from "../../domain/errors.js";
|
|
2
|
+
import { parseRefPointer } from "../../domain/openapi/json-pointer.js";
|
|
3
|
+
import { findRefHolders } from "./ref-holders.js";
|
|
4
|
+
import type { LoadedDocument } from "./unsupported-keys.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Redocly percent-decodes every JSON Pointer in a `$ref` and throws a bare `URIError` for a
|
|
8
|
+
* malformed escape such as `#/components/schemas/50%` (`%` must be written `%25`). The loader
|
|
9
|
+
* looks for these refs only after Redocly threw, and names them.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/** Enough refs in the message to act on; `details.refs` has all of them. */
|
|
13
|
+
const REFS_IN_MESSAGE = 5;
|
|
14
|
+
|
|
15
|
+
/** A `$ref` whose pointer has a malformed percent escape, and where it is. */
|
|
16
|
+
export interface MalformedRef {
|
|
17
|
+
readonly ref: string;
|
|
18
|
+
readonly pointer: string;
|
|
19
|
+
readonly source: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function isMalformed(ref: string): boolean {
|
|
23
|
+
try {
|
|
24
|
+
parseRefPointer(ref);
|
|
25
|
+
return false;
|
|
26
|
+
} catch (error) {
|
|
27
|
+
if (error instanceof URIError) {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
throw error;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Every malformed `$ref` of the given documents. */
|
|
35
|
+
export function findMalformedRefs(documents: readonly LoadedDocument[]): MalformedRef[] {
|
|
36
|
+
return documents.flatMap((document) =>
|
|
37
|
+
findRefHolders(document.parsed)
|
|
38
|
+
.filter(({ node }) => isMalformed(node.$ref))
|
|
39
|
+
.map(({ node, pointer }) => ({ ref: node.$ref, pointer, source: document.source })),
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function describeRef(found: MalformedRef): string {
|
|
44
|
+
return `"${found.ref}" at ${found.pointer} in ${found.source}`;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** The typed error for Redocly's `URIError`; `cause` is that error. */
|
|
48
|
+
export function malformedRefsError(
|
|
49
|
+
refs: readonly MalformedRef[],
|
|
50
|
+
cause: unknown,
|
|
51
|
+
): OpenAPITypesafeError {
|
|
52
|
+
const listed = refs.slice(0, REFS_IN_MESSAGE).map(describeRef);
|
|
53
|
+
const more = refs.length > REFS_IN_MESSAGE ? ` and ${refs.length - REFS_IN_MESSAGE} more` : "";
|
|
54
|
+
const where = listed.length === 0 ? "" : `: ${listed.join(", ")}${more}`;
|
|
55
|
+
return new OpenAPITypesafeError({
|
|
56
|
+
code: ERROR_CODES.SCHEMA_REF_INVALID,
|
|
57
|
+
message: `A $ref has a malformed percent escape; write "%" as "%25" in a JSON Pointer${where}.`,
|
|
58
|
+
details: { reason: "malformed", refs: refs.map((found) => ({ ...found })) },
|
|
59
|
+
cause,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { createConfig, findConfig, loadConfig } from "@redocly/openapi-core";
|
|
4
|
+
import type {
|
|
5
|
+
RedoclyConfig,
|
|
6
|
+
RedoclyConfigSource,
|
|
7
|
+
} from "../../application/ports/redocly-config-source.js";
|
|
8
|
+
|
|
9
|
+
/** The Redocly config port on `@redocly/openapi-core`, resolving paths from `cwd`. */
|
|
10
|
+
class RedoclyConfigFiles implements RedoclyConfigSource {
|
|
11
|
+
readonly #cwd: string;
|
|
12
|
+
|
|
13
|
+
constructor(cwd: string) {
|
|
14
|
+
this.#cwd = cwd;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
find(explicitPath: string | undefined): string | undefined {
|
|
18
|
+
if (!explicitPath) {
|
|
19
|
+
return findConfig(this.#cwd);
|
|
20
|
+
}
|
|
21
|
+
const resolved = path.resolve(this.#cwd, explicitPath);
|
|
22
|
+
if (!fs.existsSync(resolved)) {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
return fs.statSync(resolved).isDirectory() ? findConfig(resolved) : resolved;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
load(configPath: string): Promise<RedoclyConfig> {
|
|
29
|
+
return loadConfig({ configPath });
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
createDefault(): Promise<RedoclyConfig> {
|
|
33
|
+
return createConfig(
|
|
34
|
+
{ rules: { "operation-operationId-unique": { severity: "warn" } } },
|
|
35
|
+
{ extends: ["minimal"] },
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Find and load `redocly.yaml` relative to the directory `cwd`. */
|
|
41
|
+
export function createRedoclyConfigSource(cwd: string): RedoclyConfigSource {
|
|
42
|
+
return new RedoclyConfigFiles(cwd);
|
|
43
|
+
}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { fileURLToPath } from "node:url";
|
|
2
|
+
import {
|
|
3
|
+
type BaseResolver,
|
|
4
|
+
bundle,
|
|
5
|
+
type Document,
|
|
6
|
+
lintDocument,
|
|
7
|
+
type NormalizedProblem,
|
|
8
|
+
type Config as RedoclyConfig,
|
|
9
|
+
} from "@redocly/openapi-core";
|
|
10
|
+
import type { Logger } from "../../application/ports/logger.js";
|
|
11
|
+
import type { SchemaLoader, SchemaLoadRequest } from "../../application/ports/schema-loader.js";
|
|
12
|
+
import { withStackOverflowReportedAsync } from "../../application/stack-overflow.js";
|
|
13
|
+
import type { OpenAPI3 } from "../../types.js";
|
|
14
|
+
import { repairBundledRefs } from "./bundled-ref-repair.js";
|
|
15
|
+
import { findMalformedRefs, malformedRefsError } from "./malformed-refs.js";
|
|
16
|
+
import { RefAccessResolver } from "./ref-access.js";
|
|
17
|
+
import { resolveConfigWithAccess } from "./remote-fetch.js";
|
|
18
|
+
import {
|
|
19
|
+
loadFailedError,
|
|
20
|
+
refCycleError,
|
|
21
|
+
schemaInvalidError,
|
|
22
|
+
versionUnsupportedError,
|
|
23
|
+
} from "./schema-load-errors.js";
|
|
24
|
+
import { parseSchema } from "./schema-source.js";
|
|
25
|
+
import {
|
|
26
|
+
findUnsupportedKeys,
|
|
27
|
+
type LoadedDocument,
|
|
28
|
+
unsupportedKeysError,
|
|
29
|
+
} from "./unsupported-keys.js";
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* The SchemaLoader port on Redocly 1.34 (ADR-005): parse any inherited source type, then lint and
|
|
33
|
+
* bundle with the given Redocly config. Problems go to the logger; errors fail the load.
|
|
34
|
+
*/
|
|
35
|
+
export interface RedoclySchemaLoaderOptions {
|
|
36
|
+
readonly redoc: RedoclyConfig;
|
|
37
|
+
readonly logger: Logger;
|
|
38
|
+
/** A monotonic time in milliseconds, for the debug durations. */
|
|
39
|
+
readonly now: () => number;
|
|
40
|
+
/** Time limit of one remote fetch, unless the Redocly config brings its own `customFetch`. */
|
|
41
|
+
readonly remoteRefTimeoutMs: number;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const UNSUPPORTED_FORMAT_MESSAGE = "Unsupported schema format, expected `openapi: 3.x`";
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Accept OpenAPI 3.x only; Swagger 2 and other formats get their own message. An empty file or a
|
|
48
|
+
* `null` root parses to nothing, so it is checked before any field is read.
|
|
49
|
+
*/
|
|
50
|
+
function assertOpenAPI3(document: unknown): void {
|
|
51
|
+
if (typeof document !== "object" || document === null) {
|
|
52
|
+
throw versionUnsupportedError(UNSUPPORTED_FORMAT_MESSAGE, {});
|
|
53
|
+
}
|
|
54
|
+
const parsed = document as Record<string, unknown>;
|
|
55
|
+
const openapiVersion = Number.parseFloat(parsed.openapi as string);
|
|
56
|
+
const isOpenAPI3 =
|
|
57
|
+
!parsed.swagger &&
|
|
58
|
+
Boolean(parsed.openapi) &&
|
|
59
|
+
!Number.isNaN(openapiVersion) &&
|
|
60
|
+
openapiVersion >= 3 &&
|
|
61
|
+
openapiVersion < 4;
|
|
62
|
+
if (isOpenAPI3) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (parsed.swagger) {
|
|
66
|
+
throw versionUnsupportedError(
|
|
67
|
+
"Unsupported Swagger version: 2.x. Use OpenAPI 3.x instead.",
|
|
68
|
+
parsed,
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
if (parsed.openapi || openapiVersion < 3 || openapiVersion >= 4) {
|
|
72
|
+
throw versionUnsupportedError(`Unsupported OpenAPI version: ${parsed.openapi}`, parsed);
|
|
73
|
+
}
|
|
74
|
+
throw versionUnsupportedError(UNSUPPORTED_FORMAT_MESSAGE, parsed);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** The base for relative `$ref`s: the source file or URL itself, else the working directory. */
|
|
78
|
+
function sourceAbsoluteRef(source: unknown, cwd: URL): string {
|
|
79
|
+
if (source instanceof URL) {
|
|
80
|
+
return source.protocol === "file:" ? sourceFilePath(source) : source.href;
|
|
81
|
+
}
|
|
82
|
+
return fileURLToPath(cwd);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* The path of a `file:` source. A URL that names no path on this platform (an encoded slash, a
|
|
87
|
+
* host on POSIX, no drive letter on Windows) cannot be read, so it fails as a read would.
|
|
88
|
+
*/
|
|
89
|
+
function sourceFilePath(source: URL): string {
|
|
90
|
+
try {
|
|
91
|
+
return fileURLToPath(source);
|
|
92
|
+
} catch (error) {
|
|
93
|
+
// Node.js reports these as TypeErrors (ERR_INVALID_FILE_URL_PATH, ERR_INVALID_FILE_URL_HOST).
|
|
94
|
+
if (!(error instanceof TypeError)) {
|
|
95
|
+
throw error;
|
|
96
|
+
}
|
|
97
|
+
throw loadFailedError(source.href, error);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** Redocly throws a plain Error for a `$ref` chain that points back to itself. */
|
|
102
|
+
const REF_CYCLE_MESSAGE = "Self-referencing circular pointer";
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* The root document and every other document the resolver loaded, as far as they parsed. A root
|
|
106
|
+
* read from a file or URL is in the resolver cache too, and is listed once.
|
|
107
|
+
*/
|
|
108
|
+
async function loadedDocuments(root: Document, resolver: BaseResolver): Promise<LoadedDocument[]> {
|
|
109
|
+
const cached = await Promise.all(resolver.cache.values());
|
|
110
|
+
const bySource = new Map<string, unknown>([[root.source.absoluteRef, root.parsed]]);
|
|
111
|
+
for (const document of cached) {
|
|
112
|
+
if ("parsed" in document && !bySource.has(document.source.absoluteRef)) {
|
|
113
|
+
bySource.set(document.source.absoluteRef, document.parsed);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return [...bySource].map(([source, parsed]) => ({ source, parsed }));
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/** Report the document problems Redocly throws as typed errors; anything else passes through. */
|
|
120
|
+
async function rethrowDocumentError(
|
|
121
|
+
error: unknown,
|
|
122
|
+
root: Document,
|
|
123
|
+
resolver: BaseResolver,
|
|
124
|
+
): Promise<never> {
|
|
125
|
+
if (error instanceof Error && error.message === REF_CYCLE_MESSAGE) {
|
|
126
|
+
throw refCycleError(error);
|
|
127
|
+
}
|
|
128
|
+
if (error instanceof URIError) {
|
|
129
|
+
throw malformedRefsError(findMalformedRefs(await loadedDocuments(root, resolver)), error);
|
|
130
|
+
}
|
|
131
|
+
if (error instanceof TypeError) {
|
|
132
|
+
const keys = findUnsupportedKeys(await loadedDocuments(root, resolver));
|
|
133
|
+
throw keys.length === 0 ? error : unsupportedKeysError(keys, error);
|
|
134
|
+
}
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
class RedoclySchemaLoader implements SchemaLoader {
|
|
139
|
+
readonly #options: RedoclySchemaLoaderOptions;
|
|
140
|
+
|
|
141
|
+
constructor(options: RedoclySchemaLoaderOptions) {
|
|
142
|
+
this.#options = options;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
async load(request: SchemaLoadRequest): Promise<OpenAPI3> {
|
|
146
|
+
const resolver = this.#resolver(request);
|
|
147
|
+
// Parsing is guarded too: `JSON.stringify` of a deep object source overflows the stack on
|
|
148
|
+
// Node.js 22 and 24, before linting starts.
|
|
149
|
+
const bundled = await withStackOverflowReportedAsync("load", () =>
|
|
150
|
+
this.#parseAndBundle(request, resolver),
|
|
151
|
+
).catch((error: unknown) => {
|
|
152
|
+
throw resolver.firstRefusal ?? error;
|
|
153
|
+
});
|
|
154
|
+
// A refused `$ref` is an unresolved-`$ref` problem, which a Redocly config can turn off.
|
|
155
|
+
if (resolver.firstRefusal !== undefined) {
|
|
156
|
+
throw resolver.firstRefusal;
|
|
157
|
+
}
|
|
158
|
+
return bundled;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
async #parseAndBundle(request: SchemaLoadRequest, resolver: BaseResolver): Promise<OpenAPI3> {
|
|
162
|
+
const { logger, now } = this.#options;
|
|
163
|
+
const configLoadedAt = now();
|
|
164
|
+
logger.debug("Loaded Redoc config", "redoc", now() - configLoadedAt);
|
|
165
|
+
const parseStartedAt = now();
|
|
166
|
+
const absoluteRef = sourceAbsoluteRef(request.source, request.cwd);
|
|
167
|
+
const document = await parseSchema(request.source, { absoluteRef, resolver });
|
|
168
|
+
logger.debug("Parsed schema", "redoc", now() - parseStartedAt);
|
|
169
|
+
assertOpenAPI3(document.parsed);
|
|
170
|
+
return this.#lintAndBundle(document, resolver, request.shouldLint);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
#resolver(request: SchemaLoadRequest): RefAccessResolver {
|
|
174
|
+
const { redoc, remoteRefTimeoutMs } = this.#options;
|
|
175
|
+
const config = resolveConfigWithAccess(redoc.resolve, {
|
|
176
|
+
timeoutMs: remoteRefTimeoutMs,
|
|
177
|
+
access: request.refAccess,
|
|
178
|
+
});
|
|
179
|
+
return new RefAccessResolver(config, request.refAccess);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
async #lintAndBundle(
|
|
183
|
+
document: Document,
|
|
184
|
+
resolver: BaseResolver,
|
|
185
|
+
shouldLint: boolean,
|
|
186
|
+
): Promise<OpenAPI3> {
|
|
187
|
+
const rethrow = (error: unknown) => rethrowDocumentError(error, document, resolver);
|
|
188
|
+
if (shouldLint) {
|
|
189
|
+
await this.#lint(document, resolver).catch(rethrow);
|
|
190
|
+
}
|
|
191
|
+
return this.#bundle(document, resolver).catch(rethrow);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
async #lint(document: Document, resolver: BaseResolver): Promise<void> {
|
|
195
|
+
const startedAt = this.#options.now();
|
|
196
|
+
const problems = await lintDocument({
|
|
197
|
+
document,
|
|
198
|
+
config: this.#options.redoc.styleguide,
|
|
199
|
+
externalRefResolver: resolver,
|
|
200
|
+
});
|
|
201
|
+
this.#report(problems);
|
|
202
|
+
this.#options.logger.debug("Linted schema", "lint", this.#options.now() - startedAt);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
async #bundle(document: Document, resolver: BaseResolver): Promise<OpenAPI3> {
|
|
206
|
+
const startedAt = this.#options.now();
|
|
207
|
+
// The lint resolver: documents it already loaded are not fetched again.
|
|
208
|
+
const bundled = await bundle({
|
|
209
|
+
config: this.#options.redoc,
|
|
210
|
+
dereference: false,
|
|
211
|
+
doc: document,
|
|
212
|
+
externalRefResolver: resolver,
|
|
213
|
+
});
|
|
214
|
+
this.#report(bundled.problems);
|
|
215
|
+
repairBundledRefs(bundled.bundle.parsed);
|
|
216
|
+
this.#options.logger.debug("Bundled schema", "bundle", this.#options.now() - startedAt);
|
|
217
|
+
return bundled.bundle.parsed;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/** Report every problem; then throw if any of them is an error. */
|
|
221
|
+
#report(problems: readonly NormalizedProblem[]): void {
|
|
222
|
+
const errorMessages: string[] = [];
|
|
223
|
+
for (const problem of problems) {
|
|
224
|
+
const message = problemMessage(problem);
|
|
225
|
+
if (problem.severity === "error") {
|
|
226
|
+
errorMessages.push(message);
|
|
227
|
+
this.#options.logger.error(message);
|
|
228
|
+
} else {
|
|
229
|
+
this.#options.logger.warn(message);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
if (errorMessages.length > 0) {
|
|
233
|
+
throw schemaInvalidError(errorMessages);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function problemMessage(problem: NormalizedProblem): string {
|
|
239
|
+
const location = problem.location?.[0]?.pointer;
|
|
240
|
+
return location ? `${problem.message} at ${location}` : problem.message;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/** A schema loader with one Redocly config and logger, for one or more loads. */
|
|
244
|
+
export function createRedoclySchemaLoader(options: RedoclySchemaLoaderOptions): SchemaLoader {
|
|
245
|
+
return new RedoclySchemaLoader(options);
|
|
246
|
+
}
|