openapi-typesafe 0.0.0 → 1.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +71 -1
- package/bin/cli.js +4 -0
- package/dist/adapters/node-file-system/node-file-system.cjs +46 -0
- package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -0
- package/dist/adapters/node-file-system/node-file-system.mjs +40 -0
- package/dist/adapters/node-file-system/node-file-system.mjs.map +1 -0
- package/dist/adapters/redocly-loader/alias-limit.cjs +16 -0
- package/dist/adapters/redocly-loader/alias-limit.cjs.map +1 -0
- package/dist/adapters/redocly-loader/alias-limit.mjs +14 -0
- package/dist/adapters/redocly-loader/alias-limit.mjs.map +1 -0
- package/dist/adapters/redocly-loader/allowed-hosts.cjs +42 -0
- package/dist/adapters/redocly-loader/allowed-hosts.cjs.map +1 -0
- package/dist/adapters/redocly-loader/allowed-hosts.mjs +40 -0
- package/dist/adapters/redocly-loader/allowed-hosts.mjs.map +1 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.cjs +53 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.cjs.map +1 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.mjs +51 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.mjs.map +1 -0
- package/dist/adapters/redocly-loader/malformed-refs.cjs +41 -0
- package/dist/adapters/redocly-loader/malformed-refs.cjs.map +1 -0
- package/dist/adapters/redocly-loader/malformed-refs.mjs +38 -0
- package/dist/adapters/redocly-loader/malformed-refs.mjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-config-source.cjs +61 -0
- package/dist/adapters/redocly-loader/redocly-config-source.cjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-config-source.mjs +54 -0
- package/dist/adapters/redocly-loader/redocly-config-source.mjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +179 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +177 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-access.cjs +107 -0
- package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-access.mjs +99 -0
- package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-holders.cjs +31 -0
- package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-holders.mjs +29 -0
- package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -0
- package/dist/adapters/redocly-loader/remote-fetch.cjs +60 -0
- package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -0
- package/dist/adapters/redocly-loader/remote-fetch.mjs +56 -0
- package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-load-errors.cjs +87 -0
- package/dist/adapters/redocly-loader/schema-load-errors.cjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-load-errors.mjs +77 -0
- package/dist/adapters/redocly-loader/schema-load-errors.mjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-source.cjs +104 -0
- package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-source.mjs +98 -0
- package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -0
- package/dist/adapters/redocly-loader/unsupported-keys.cjs +62 -0
- package/dist/adapters/redocly-loader/unsupported-keys.cjs.map +1 -0
- package/dist/adapters/redocly-loader/unsupported-keys.mjs +58 -0
- package/dist/adapters/redocly-loader/unsupported-keys.mjs.map +1 -0
- package/dist/adapters/terminal-logger/terminal-logger.cjs +67 -0
- package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -0
- package/dist/adapters/terminal-logger/terminal-logger.mjs +59 -0
- package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.cjs +21 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.mjs +17 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.cjs +75 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.mjs +71 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs +148 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs +142 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/lazy-node.cjs +23 -0
- package/dist/adapters/type-ast-bridge/lazy-node.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/lazy-node.mjs +21 -0
- package/dist/adapters/type-ast-bridge/lazy-node.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/load-typescript.cjs +57 -0
- package/dist/adapters/type-ast-bridge/load-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/load-typescript.mjs +51 -0
- package/dist/adapters/type-ast-bridge/load-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/print-typescript.cjs +21 -0
- package/dist/adapters/type-ast-bridge/print-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/print-typescript.mjs +19 -0
- package/dist/adapters/type-ast-bridge/print-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.cjs +33 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.mjs +29 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.cjs +210 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.mjs +207 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.mjs.map +1 -0
- package/dist/api/ast-to-string.cjs +39 -0
- package/dist/api/ast-to-string.cjs.map +1 -0
- package/dist/api/ast-to-string.mjs +37 -0
- package/dist/api/ast-to-string.mjs.map +1 -0
- package/dist/api/comment-header.cjs +11 -0
- package/dist/api/comment-header.cjs.map +1 -0
- package/dist/api/comment-header.mjs +9 -0
- package/dist/api/comment-header.mjs.map +1 -0
- package/dist/api/default-ports.cjs +38 -0
- package/dist/api/default-ports.cjs.map +1 -0
- package/dist/api/default-ports.mjs +28 -0
- package/dist/api/default-ports.mjs.map +1 -0
- package/dist/api/discriminator-conflict-warnings.cjs +25 -0
- package/dist/api/discriminator-conflict-warnings.cjs.map +1 -0
- package/dist/api/discriminator-conflict-warnings.mjs +23 -0
- package/dist/api/discriminator-conflict-warnings.mjs.map +1 -0
- package/dist/api/discriminator-enum-names.cjs +19 -0
- package/dist/api/discriminator-enum-names.cjs.map +1 -0
- package/dist/api/discriminator-enum-names.mjs +17 -0
- package/dist/api/discriminator-enum-names.mjs.map +1 -0
- package/dist/api/discriminator-enum-parent.cjs +59 -0
- package/dist/api/discriminator-enum-parent.cjs.map +1 -0
- package/dist/api/discriminator-enum-parent.mjs +57 -0
- package/dist/api/discriminator-enum-parent.mjs.map +1 -0
- package/dist/api/discriminator-enum.cjs +69 -0
- package/dist/api/discriminator-enum.cjs.map +1 -0
- package/dist/api/discriminator-enum.mjs +66 -0
- package/dist/api/discriminator-enum.mjs.map +1 -0
- package/dist/api/discriminator-other-owners.cjs +67 -0
- package/dist/api/discriminator-other-owners.cjs.map +1 -0
- package/dist/api/discriminator-other-owners.mjs +64 -0
- package/dist/api/discriminator-other-owners.mjs.map +1 -0
- package/dist/api/discriminator-patch.cjs +88 -0
- package/dist/api/discriminator-patch.cjs.map +1 -0
- package/dist/api/discriminator-patch.mjs +82 -0
- package/dist/api/discriminator-patch.mjs.map +1 -0
- package/dist/api/discriminator-scan.cjs +153 -0
- package/dist/api/discriminator-scan.cjs.map +1 -0
- package/dist/api/discriminator-scan.mjs +150 -0
- package/dist/api/discriminator-scan.mjs.map +1 -0
- package/dist/api/document-declarations.cjs +28 -0
- package/dist/api/document-declarations.cjs.map +1 -0
- package/dist/api/document-declarations.mjs +26 -0
- package/dist/api/document-declarations.mjs.map +1 -0
- package/dist/api/document-refs.cjs +53 -0
- package/dist/api/document-refs.cjs.map +1 -0
- package/dist/api/document-refs.mjs +50 -0
- package/dist/api/document-refs.mjs.map +1 -0
- package/dist/api/document-run.cjs +122 -0
- package/dist/api/document-run.cjs.map +1 -0
- package/dist/api/document-run.mjs +116 -0
- package/dist/api/document-run.mjs.map +1 -0
- package/dist/api/enum-values-warnings.cjs +16 -0
- package/dist/api/enum-values-warnings.cjs.map +1 -0
- package/dist/api/enum-values-warnings.mjs +14 -0
- package/dist/api/enum-values-warnings.mjs.map +1 -0
- package/dist/api/footer-entry.cjs +18 -0
- package/dist/api/footer-entry.cjs.map +1 -0
- package/dist/api/footer-entry.mjs +15 -0
- package/dist/api/footer-entry.mjs.map +1 -0
- package/dist/api/footer-sink.cjs +53 -0
- package/dist/api/footer-sink.cjs.map +1 -0
- package/dist/api/footer-sink.mjs +51 -0
- package/dist/api/footer-sink.mjs.map +1 -0
- package/dist/api/legacy-callback-warning.cjs +25 -0
- package/dist/api/legacy-callback-warning.cjs.map +1 -0
- package/dist/api/legacy-callback-warning.mjs +22 -0
- package/dist/api/legacy-callback-warning.mjs.map +1 -0
- package/dist/api/legacy-ts-helpers.cjs +203 -0
- package/dist/api/legacy-ts-helpers.cjs.map +1 -0
- package/dist/api/legacy-ts-helpers.mjs +187 -0
- package/dist/api/legacy-ts-helpers.mjs.map +1 -0
- package/dist/api/legacy-utils.cjs +65 -0
- package/dist/api/legacy-utils.cjs.map +1 -0
- package/dist/api/legacy-utils.mjs +50 -0
- package/dist/api/legacy-utils.mjs.map +1 -0
- package/dist/api/openapi-ts.cjs +40 -0
- package/dist/api/openapi-ts.cjs.map +1 -0
- package/dist/api/openapi-ts.mjs +34 -0
- package/dist/api/openapi-ts.mjs.map +1 -0
- package/dist/api/path-template-warnings.cjs +21 -0
- package/dist/api/path-template-warnings.cjs.map +1 -0
- package/dist/api/path-template-warnings.mjs +19 -0
- package/dist/api/path-template-warnings.mjs.map +1 -0
- package/dist/api/schema-callbacks.cjs +140 -0
- package/dist/api/schema-callbacks.cjs.map +1 -0
- package/dist/api/schema-callbacks.mjs +136 -0
- package/dist/api/schema-callbacks.mjs.map +1 -0
- package/dist/api/string-to-ast.cjs +21 -0
- package/dist/api/string-to-ast.cjs.map +1 -0
- package/dist/api/string-to-ast.mjs +18 -0
- package/dist/api/string-to-ast.mjs.map +1 -0
- package/dist/api/transform-context.cjs +84 -0
- package/dist/api/transform-context.cjs.map +1 -0
- package/dist/api/transform-context.mjs +67 -0
- package/dist/api/transform-context.mjs.map +1 -0
- package/dist/api/transform-schema.cjs +80 -0
- package/dist/api/transform-schema.cjs.map +1 -0
- package/dist/api/transform-schema.mjs +75 -0
- package/dist/api/transform-schema.mjs.map +1 -0
- package/dist/api/type-helpers.cjs +85 -0
- package/dist/api/type-helpers.cjs.map +1 -0
- package/dist/api/type-helpers.mjs +66 -0
- package/dist/api/type-helpers.mjs.map +1 -0
- package/dist/api/unsupported-feature-warnings.cjs +22 -0
- package/dist/api/unsupported-feature-warnings.cjs.map +1 -0
- package/dist/api/unsupported-feature-warnings.mjs +20 -0
- package/dist/api/unsupported-feature-warnings.mjs.map +1 -0
- package/dist/application/print/comment-writer.cjs +95 -0
- package/dist/application/print/comment-writer.cjs.map +1 -0
- package/dist/application/print/comment-writer.mjs +93 -0
- package/dist/application/print/comment-writer.mjs.map +1 -0
- package/dist/application/print/declaration-printer.cjs +83 -0
- package/dist/application/print/declaration-printer.cjs.map +1 -0
- package/dist/application/print/declaration-printer.mjs +81 -0
- package/dist/application/print/declaration-printer.mjs.map +1 -0
- package/dist/application/print/literal-text.cjs +52 -0
- package/dist/application/print/literal-text.cjs.map +1 -0
- package/dist/application/print/literal-text.mjs +48 -0
- package/dist/application/print/literal-text.mjs.map +1 -0
- package/dist/application/print/print-nodes.cjs +38 -0
- package/dist/application/print/print-nodes.cjs.map +1 -0
- package/dist/application/print/print-nodes.mjs +36 -0
- package/dist/application/print/print-nodes.mjs.map +1 -0
- package/dist/application/print/print-options.cjs +6 -0
- package/dist/application/print/print-options.cjs.map +1 -0
- package/dist/application/print/print-options.mjs +4 -0
- package/dist/application/print/print-options.mjs.map +1 -0
- package/dist/application/print/text-writer.cjs +63 -0
- package/dist/application/print/text-writer.cjs.map +1 -0
- package/dist/application/print/text-writer.mjs +60 -0
- package/dist/application/print/text-writer.mjs.map +1 -0
- package/dist/application/print/type-printer.cjs +219 -0
- package/dist/application/print/type-printer.cjs.map +1 -0
- package/dist/application/print/type-printer.mjs +215 -0
- package/dist/application/print/type-printer.mjs.map +1 -0
- package/dist/application/stack-overflow.cjs +36 -0
- package/dist/application/stack-overflow.cjs.map +1 -0
- package/dist/application/stack-overflow.mjs +31 -0
- package/dist/application/stack-overflow.mjs.map +1 -0
- package/dist/application/transform/document/assignability.cjs +144 -0
- package/dist/application/transform/document/assignability.cjs.map +1 -0
- package/dist/application/transform/document/assignability.mjs +138 -0
- package/dist/application/transform/document/assignability.mjs.map +1 -0
- package/dist/application/transform/document/components.cjs +104 -0
- package/dist/application/transform/document/components.cjs.map +1 -0
- package/dist/application/transform/document/components.mjs +102 -0
- package/dist/application/transform/document/components.mjs.map +1 -0
- package/dist/application/transform/document/declared-types.cjs +66 -0
- package/dist/application/transform/document/declared-types.cjs.map +1 -0
- package/dist/application/transform/document/declared-types.mjs +63 -0
- package/dist/application/transform/document/declared-types.mjs.map +1 -0
- package/dist/application/transform/document/defs-root.cjs +18 -0
- package/dist/application/transform/document/defs-root.cjs.map +1 -0
- package/dist/application/transform/document/defs-root.mjs +16 -0
- package/dist/application/transform/document/defs-root.mjs.map +1 -0
- package/dist/application/transform/document/document-member.cjs +13 -0
- package/dist/application/transform/document/document-member.cjs.map +1 -0
- package/dist/application/transform/document/document-member.mjs +11 -0
- package/dist/application/transform/document/document-member.mjs.map +1 -0
- package/dist/application/transform/document/document.cjs +109 -0
- package/dist/application/transform/document/document.cjs.map +1 -0
- package/dist/application/transform/document/document.mjs +106 -0
- package/dist/application/transform/document/document.mjs.map +1 -0
- package/dist/application/transform/document/exploded-query.cjs +46 -0
- package/dist/application/transform/document/exploded-query.cjs.map +1 -0
- package/dist/application/transform/document/exploded-query.mjs +43 -0
- package/dist/application/transform/document/exploded-query.mjs.map +1 -0
- package/dist/application/transform/document/global-type-references.cjs +63 -0
- package/dist/application/transform/document/global-type-references.cjs.map +1 -0
- package/dist/application/transform/document/global-type-references.mjs +61 -0
- package/dist/application/transform/document/global-type-references.mjs.map +1 -0
- package/dist/application/transform/document/header.cjs +27 -0
- package/dist/application/transform/document/header.cjs.map +1 -0
- package/dist/application/transform/document/header.mjs +25 -0
- package/dist/application/transform/document/header.mjs.map +1 -0
- package/dist/application/transform/document/kept-deprecated.cjs +96 -0
- package/dist/application/transform/document/kept-deprecated.cjs.map +1 -0
- package/dist/application/transform/document/kept-deprecated.mjs +94 -0
- package/dist/application/transform/document/kept-deprecated.mjs.map +1 -0
- package/dist/application/transform/document/list-assignability.cjs +54 -0
- package/dist/application/transform/document/list-assignability.cjs.map +1 -0
- package/dist/application/transform/document/list-assignability.mjs +52 -0
- package/dist/application/transform/document/list-assignability.mjs.map +1 -0
- package/dist/application/transform/document/media-type.cjs +42 -0
- package/dist/application/transform/document/media-type.cjs.map +1 -0
- package/dist/application/transform/document/media-type.mjs +38 -0
- package/dist/application/transform/document/media-type.mjs.map +1 -0
- package/dist/application/transform/document/operation.cjs +45 -0
- package/dist/application/transform/document/operation.cjs.map +1 -0
- package/dist/application/transform/document/operation.mjs +43 -0
- package/dist/application/transform/document/operation.mjs.map +1 -0
- package/dist/application/transform/document/parameter.cjs +25 -0
- package/dist/application/transform/document/parameter.cjs.map +1 -0
- package/dist/application/transform/document/parameter.mjs +23 -0
- package/dist/application/transform/document/parameter.mjs.map +1 -0
- package/dist/application/transform/document/parameters.cjs +146 -0
- package/dist/application/transform/document/parameters.cjs.map +1 -0
- package/dist/application/transform/document/parameters.mjs +144 -0
- package/dist/application/transform/document/parameters.mjs.map +1 -0
- package/dist/application/transform/document/path-item.cjs +82 -0
- package/dist/application/transform/document/path-item.cjs.map +1 -0
- package/dist/application/transform/document/path-item.mjs +80 -0
- package/dist/application/transform/document/path-item.mjs.map +1 -0
- package/dist/application/transform/document/path-key-overlaps.cjs +107 -0
- package/dist/application/transform/document/path-key-overlaps.cjs.map +1 -0
- package/dist/application/transform/document/path-key-overlaps.mjs +105 -0
- package/dist/application/transform/document/path-key-overlaps.mjs.map +1 -0
- package/dist/application/transform/document/path-template-replace.cjs +48 -0
- package/dist/application/transform/document/path-template-replace.cjs.map +1 -0
- package/dist/application/transform/document/path-template-replace.mjs +45 -0
- package/dist/application/transform/document/path-template-replace.mjs.map +1 -0
- package/dist/application/transform/document/paths-enum.cjs +75 -0
- package/dist/application/transform/document/paths-enum.cjs.map +1 -0
- package/dist/application/transform/document/paths-enum.mjs +72 -0
- package/dist/application/transform/document/paths-enum.mjs.map +1 -0
- package/dist/application/transform/document/paths.cjs +153 -0
- package/dist/application/transform/document/paths.cjs.map +1 -0
- package/dist/application/transform/document/paths.mjs +149 -0
- package/dist/application/transform/document/paths.mjs.map +1 -0
- package/dist/application/transform/document/request-body.cjs +36 -0
- package/dist/application/transform/document/request-body.cjs.map +1 -0
- package/dist/application/transform/document/request-body.mjs +34 -0
- package/dist/application/transform/document/request-body.mjs.map +1 -0
- package/dist/application/transform/document/response.cjs +59 -0
- package/dist/application/transform/document/response.cjs.map +1 -0
- package/dist/application/transform/document/response.mjs +57 -0
- package/dist/application/transform/document/response.mjs.map +1 -0
- package/dist/application/transform/document/responses.cjs +23 -0
- package/dist/application/transform/document/responses.cjs.map +1 -0
- package/dist/application/transform/document/responses.mjs +21 -0
- package/dist/application/transform/document/responses.mjs.map +1 -0
- package/dist/application/transform/document/root-type-aliases.cjs +70 -0
- package/dist/application/transform/document/root-type-aliases.cjs.map +1 -0
- package/dist/application/transform/document/root-type-aliases.mjs +67 -0
- package/dist/application/transform/document/root-type-aliases.mjs.map +1 -0
- package/dist/application/transform/document/template-key-match.cjs +128 -0
- package/dist/application/transform/document/template-key-match.cjs.map +1 -0
- package/dist/application/transform/document/template-key-match.mjs +125 -0
- package/dist/application/transform/document/template-key-match.mjs.map +1 -0
- package/dist/application/transform/document/type-assignability.cjs +192 -0
- package/dist/application/transform/document/type-assignability.cjs.map +1 -0
- package/dist/application/transform/document/type-assignability.mjs +190 -0
- package/dist/application/transform/document/type-assignability.mjs.map +1 -0
- package/dist/application/transform/document/type-key.cjs +70 -0
- package/dist/application/transform/document/type-key.cjs.map +1 -0
- package/dist/application/transform/document/type-key.mjs +68 -0
- package/dist/application/transform/document/type-key.mjs.map +1 -0
- package/dist/application/transform/document/type-resolution.cjs +131 -0
- package/dist/application/transform/document/type-resolution.cjs.map +1 -0
- package/dist/application/transform/document/type-resolution.mjs +125 -0
- package/dist/application/transform/document/type-resolution.mjs.map +1 -0
- package/dist/application/transform/document/webhooks.cjs +19 -0
- package/dist/application/transform/document/webhooks.cjs.map +1 -0
- package/dist/application/transform/document/webhooks.mjs +17 -0
- package/dist/application/transform/document/webhooks.mjs.map +1 -0
- package/dist/application/transform/document-entries.cjs +17 -0
- package/dist/application/transform/document-entries.cjs.map +1 -0
- package/dist/application/transform/document-entries.mjs +14 -0
- package/dist/application/transform/document-entries.mjs.map +1 -0
- package/dist/application/transform/footer/document-footer.cjs +150 -0
- package/dist/application/transform/footer/document-footer.cjs.map +1 -0
- package/dist/application/transform/footer/document-footer.mjs +148 -0
- package/dist/application/transform/footer/document-footer.mjs.map +1 -0
- package/dist/application/transform/footer/enum-naming.cjs +138 -0
- package/dist/application/transform/footer/enum-naming.cjs.map +1 -0
- package/dist/application/transform/footer/enum-naming.mjs +131 -0
- package/dist/application/transform/footer/enum-naming.mjs.map +1 -0
- package/dist/application/transform/footer/enum-values-check.cjs +129 -0
- package/dist/application/transform/footer/enum-values-check.cjs.map +1 -0
- package/dist/application/transform/footer/enum-values-check.mjs +127 -0
- package/dist/application/transform/footer/enum-values-check.mjs.map +1 -0
- package/dist/application/transform/footer/evaluation.cjs +33 -0
- package/dist/application/transform/footer/evaluation.cjs.map +1 -0
- package/dist/application/transform/footer/evaluation.mjs +26 -0
- package/dist/application/transform/footer/evaluation.mjs.map +1 -0
- package/dist/application/transform/footer/shared-enum-names.cjs +60 -0
- package/dist/application/transform/footer/shared-enum-names.cjs.map +1 -0
- package/dist/application/transform/footer/shared-enum-names.mjs +57 -0
- package/dist/application/transform/footer/shared-enum-names.mjs.map +1 -0
- package/dist/application/transform/footer/type-evaluation.cjs +246 -0
- package/dist/application/transform/footer/type-evaluation.cjs.map +1 -0
- package/dist/application/transform/footer/type-evaluation.mjs +244 -0
- package/dist/application/transform/footer/type-evaluation.mjs.map +1 -0
- package/dist/application/transform/footer/type-rules.cjs +172 -0
- package/dist/application/transform/footer/type-rules.cjs.map +1 -0
- package/dist/application/transform/footer/type-rules.mjs +166 -0
- package/dist/application/transform/footer/type-rules.mjs.map +1 -0
- package/dist/application/transform/helper-types.cjs +68 -0
- package/dist/application/transform/helper-types.cjs.map +1 -0
- package/dist/application/transform/helper-types.mjs +65 -0
- package/dist/application/transform/helper-types.mjs.map +1 -0
- package/dist/application/transform/literal-type.cjs +36 -0
- package/dist/application/transform/literal-type.cjs.map +1 -0
- package/dist/application/transform/literal-type.mjs +34 -0
- package/dist/application/transform/literal-type.mjs.map +1 -0
- package/dist/application/transform/numbered-names.cjs +18 -0
- package/dist/application/transform/numbered-names.cjs.map +1 -0
- package/dist/application/transform/numbered-names.mjs +16 -0
- package/dist/application/transform/numbered-names.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/generated-location.cjs +138 -0
- package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/generated-location.mjs +136 -0
- package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/generated-shape.cjs +171 -0
- package/dist/application/transform/ref-pointer/generated-shape.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/generated-shape.mjs +162 -0
- package/dist/application/transform/ref-pointer/generated-shape.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/inline-cycles.cjs +44 -0
- package/dist/application/transform/ref-pointer/inline-cycles.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/inline-cycles.mjs +42 -0
- package/dist/application/transform/ref-pointer/inline-cycles.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/original-index.cjs +62 -0
- package/dist/application/transform/ref-pointer/original-index.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/original-index.mjs +60 -0
- package/dist/application/transform/ref-pointer/original-index.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/pointer-type.cjs +60 -0
- package/dist/application/transform/ref-pointer/pointer-type.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/pointer-type.mjs +57 -0
- package/dist/application/transform/ref-pointer/pointer-type.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/pointer-walk.cjs +66 -0
- package/dist/application/transform/ref-pointer/pointer-walk.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/pointer-walk.mjs +56 -0
- package/dist/application/transform/ref-pointer/pointer-walk.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/typed-walk.cjs +124 -0
- package/dist/application/transform/ref-pointer/typed-walk.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/typed-walk.mjs +122 -0
- package/dist/application/transform/ref-pointer/typed-walk.mjs.map +1 -0
- package/dist/application/transform/ref-type.cjs +62 -0
- package/dist/application/transform/ref-type.cjs.map +1 -0
- package/dist/application/transform/ref-type.mjs +55 -0
- package/dist/application/transform/ref-type.mjs.map +1 -0
- package/dist/application/transform/schema/access-flags.cjs +38 -0
- package/dist/application/transform/schema/access-flags.cjs.map +1 -0
- package/dist/application/transform/schema/access-flags.mjs +36 -0
- package/dist/application/transform/schema/access-flags.mjs.map +1 -0
- package/dist/application/transform/schema/array-type.cjs +136 -0
- package/dist/application/transform/schema/array-type.cjs.map +1 -0
- package/dist/application/transform/schema/array-type.mjs +134 -0
- package/dist/application/transform/schema/array-type.mjs.map +1 -0
- package/dist/application/transform/schema/composition-type.cjs +142 -0
- package/dist/application/transform/schema/composition-type.cjs.map +1 -0
- package/dist/application/transform/schema/composition-type.mjs +140 -0
- package/dist/application/transform/schema/composition-type.mjs.map +1 -0
- package/dist/application/transform/schema/core-type.cjs +86 -0
- package/dist/application/transform/schema/core-type.cjs.map +1 -0
- package/dist/application/transform/schema/core-type.mjs +84 -0
- package/dist/application/transform/schema/core-type.mjs.map +1 -0
- package/dist/application/transform/schema/discriminated-union.cjs +30 -0
- package/dist/application/transform/schema/discriminated-union.cjs.map +1 -0
- package/dist/application/transform/schema/discriminated-union.mjs +27 -0
- package/dist/application/transform/schema/discriminated-union.mjs.map +1 -0
- package/dist/application/transform/schema/discriminator-property.cjs +22 -0
- package/dist/application/transform/schema/discriminator-property.cjs.map +1 -0
- package/dist/application/transform/schema/discriminator-property.mjs +20 -0
- package/dist/application/transform/schema/discriminator-property.mjs.map +1 -0
- package/dist/application/transform/schema/enum-rule.cjs +163 -0
- package/dist/application/transform/schema/enum-rule.cjs.map +1 -0
- package/dist/application/transform/schema/enum-rule.mjs +160 -0
- package/dist/application/transform/schema/enum-rule.mjs.map +1 -0
- package/dist/application/transform/schema/inherited-discriminator.cjs +29 -0
- package/dist/application/transform/schema/inherited-discriminator.cjs.map +1 -0
- package/dist/application/transform/schema/inherited-discriminator.mjs +26 -0
- package/dist/application/transform/schema/inherited-discriminator.mjs.map +1 -0
- package/dist/application/transform/schema/object-type.cjs +186 -0
- package/dist/application/transform/schema/object-type.cjs.map +1 -0
- package/dist/application/transform/schema/object-type.mjs +182 -0
- package/dist/application/transform/schema/object-type.mjs.map +1 -0
- package/dist/application/transform/schema/presence-members.cjs +59 -0
- package/dist/application/transform/schema/presence-members.cjs.map +1 -0
- package/dist/application/transform/schema/presence-members.mjs +57 -0
- package/dist/application/transform/schema/presence-members.mjs.map +1 -0
- package/dist/application/transform/schema/required-variants.cjs +45 -0
- package/dist/application/transform/schema/required-variants.cjs.map +1 -0
- package/dist/application/transform/schema/required-variants.mjs +42 -0
- package/dist/application/transform/schema/required-variants.mjs.map +1 -0
- package/dist/application/transform/schema/schema-transform.cjs +72 -0
- package/dist/application/transform/schema/schema-transform.cjs.map +1 -0
- package/dist/application/transform/schema/schema-transform.mjs +68 -0
- package/dist/application/transform/schema/schema-transform.mjs.map +1 -0
- package/dist/application/transform/schema/unevaluated-properties.cjs +61 -0
- package/dist/application/transform/schema/unevaluated-properties.cjs.map +1 -0
- package/dist/application/transform/schema/unevaluated-properties.mjs +59 -0
- package/dist/application/transform/schema/unevaluated-properties.mjs.map +1 -0
- package/dist/application/transform/schema-comment.cjs +130 -0
- package/dist/application/transform/schema-comment.cjs.map +1 -0
- package/dist/application/transform/schema-comment.mjs +125 -0
- package/dist/application/transform/schema-comment.mjs.map +1 -0
- package/dist/application/transform/shared-types.cjs +8 -0
- package/dist/application/transform/shared-types.cjs.map +1 -0
- package/dist/application/transform/shared-types.mjs +6 -0
- package/dist/application/transform/shared-types.mjs.map +1 -0
- package/dist/application/transform/type-combinators.cjs +49 -0
- package/dist/application/transform/type-combinators.cjs.map +1 -0
- package/dist/application/transform/type-combinators.mjs +42 -0
- package/dist/application/transform/type-combinators.mjs.map +1 -0
- package/dist/cli/cli-arguments.cjs +145 -0
- package/dist/cli/cli-arguments.cjs.map +1 -0
- package/dist/cli/cli-arguments.mjs +137 -0
- package/dist/cli/cli-arguments.mjs.map +1 -0
- package/dist/cli/cli-errors.cjs +81 -0
- package/dist/cli/cli-errors.cjs.map +1 -0
- package/dist/cli/cli-errors.mjs +77 -0
- package/dist/cli/cli-errors.mjs.map +1 -0
- package/dist/cli/cli-output.cjs +42 -0
- package/dist/cli/cli-output.cjs.map +1 -0
- package/dist/cli/cli-output.mjs +35 -0
- package/dist/cli/cli-output.mjs.map +1 -0
- package/dist/cli/docs-links.cjs +6 -0
- package/dist/cli/docs-links.cjs.map +1 -0
- package/dist/cli/docs-links.mjs +4 -0
- package/dist/cli/docs-links.mjs.map +1 -0
- package/dist/cli/fix-option.cjs +19 -0
- package/dist/cli/fix-option.cjs.map +1 -0
- package/dist/cli/fix-option.mjs +16 -0
- package/dist/cli/fix-option.mjs.map +1 -0
- package/dist/cli/help-text.cjs +44 -0
- package/dist/cli/help-text.cjs.map +1 -0
- package/dist/cli/help-text.mjs +42 -0
- package/dist/cli/help-text.mjs.map +1 -0
- package/dist/cli/main.cjs +67 -0
- package/dist/cli/main.cjs.map +1 -0
- package/dist/cli/main.d.cts +2 -0
- package/dist/cli/main.d.mts +2 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.mjs +59 -0
- package/dist/cli/main.mjs.map +1 -0
- package/dist/cli/redocly-apis.cjs +69 -0
- package/dist/cli/redocly-apis.cjs.map +1 -0
- package/dist/cli/redocly-apis.mjs +66 -0
- package/dist/cli/redocly-apis.mjs.map +1 -0
- package/dist/cli/ref-limits.cjs +14 -0
- package/dist/cli/ref-limits.cjs.map +1 -0
- package/dist/cli/ref-limits.mjs +12 -0
- package/dist/cli/ref-limits.mjs.map +1 -0
- package/dist/cli/run-cli.cjs +113 -0
- package/dist/cli/run-cli.cjs.map +1 -0
- package/dist/cli/run-cli.mjs +111 -0
- package/dist/cli/run-cli.mjs.map +1 -0
- package/dist/domain/assert-never.cjs +8 -0
- package/dist/domain/assert-never.cjs.map +1 -0
- package/dist/domain/assert-never.mjs +6 -0
- package/dist/domain/assert-never.mjs.map +1 -0
- package/dist/domain/errors.cjs +52 -0
- package/dist/domain/errors.cjs.map +1 -0
- package/dist/domain/errors.mjs +48 -0
- package/dist/domain/errors.mjs.map +1 -0
- package/dist/domain/ir/constructors.cjs +93 -0
- package/dist/domain/ir/constructors.cjs.map +1 -0
- package/dist/domain/ir/constructors.mjs +74 -0
- package/dist/domain/ir/constructors.mjs.map +1 -0
- package/dist/domain/ir/identifier-text.cjs +29 -0
- package/dist/domain/ir/identifier-text.cjs.map +1 -0
- package/dist/domain/ir/identifier-text.mjs +25 -0
- package/dist/domain/ir/identifier-text.mjs.map +1 -0
- package/dist/domain/ir/newer-identifier-ranges.cjs +109 -0
- package/dist/domain/ir/newer-identifier-ranges.cjs.map +1 -0
- package/dist/domain/ir/newer-identifier-ranges.mjs +106 -0
- package/dist/domain/ir/newer-identifier-ranges.mjs.map +1 -0
- package/dist/domain/ir/normalize.cjs +32 -0
- package/dist/domain/ir/normalize.cjs.map +1 -0
- package/dist/domain/ir/normalize.mjs +29 -0
- package/dist/domain/ir/normalize.mjs.map +1 -0
- package/dist/domain/ir/property-name.cjs +19 -0
- package/dist/domain/ir/property-name.cjs.map +1 -0
- package/dist/domain/ir/property-name.mjs +16 -0
- package/dist/domain/ir/property-name.mjs.map +1 -0
- package/dist/domain/ir/raw-text-escapes.cjs +25 -0
- package/dist/domain/ir/raw-text-escapes.cjs.map +1 -0
- package/dist/domain/ir/raw-text-escapes.mjs +22 -0
- package/dist/domain/ir/raw-text-escapes.mjs.map +1 -0
- package/dist/domain/openapi/admitted-values.cjs +75 -0
- package/dist/domain/openapi/admitted-values.cjs.map +1 -0
- package/dist/domain/openapi/admitted-values.mjs +72 -0
- package/dist/domain/openapi/admitted-values.mjs.map +1 -0
- package/dist/domain/openapi/alias-expansion.cjs +50 -0
- package/dist/domain/openapi/alias-expansion.cjs.map +1 -0
- package/dist/domain/openapi/alias-expansion.mjs +45 -0
- package/dist/domain/openapi/alias-expansion.mjs.map +1 -0
- package/dist/domain/openapi/binary-content.cjs +48 -0
- package/dist/domain/openapi/binary-content.cjs.map +1 -0
- package/dist/domain/openapi/binary-content.mjs +45 -0
- package/dist/domain/openapi/binary-content.mjs.map +1 -0
- package/dist/domain/openapi/components-object.cjs +29 -0
- package/dist/domain/openapi/components-object.cjs.map +1 -0
- package/dist/domain/openapi/components-object.mjs +24 -0
- package/dist/domain/openapi/components-object.mjs.map +1 -0
- package/dist/domain/openapi/discriminated-union.cjs +68 -0
- package/dist/domain/openapi/discriminated-union.cjs.map +1 -0
- package/dist/domain/openapi/discriminated-union.mjs +62 -0
- package/dist/domain/openapi/discriminated-union.mjs.map +1 -0
- package/dist/domain/openapi/discriminator-conflicts.cjs +143 -0
- package/dist/domain/openapi/discriminator-conflicts.cjs.map +1 -0
- package/dist/domain/openapi/discriminator-conflicts.mjs +141 -0
- package/dist/domain/openapi/discriminator-conflicts.mjs.map +1 -0
- package/dist/domain/openapi/json-pointer.cjs +31 -0
- package/dist/domain/openapi/json-pointer.cjs.map +1 -0
- package/dist/domain/openapi/json-pointer.mjs +27 -0
- package/dist/domain/openapi/json-pointer.mjs.map +1 -0
- package/dist/domain/openapi/media-type-object.cjs +14 -0
- package/dist/domain/openapi/media-type-object.cjs.map +1 -0
- package/dist/domain/openapi/media-type-object.mjs +11 -0
- package/dist/domain/openapi/media-type-object.mjs.map +1 -0
- package/dist/domain/openapi/parameter-object.cjs +13 -0
- package/dist/domain/openapi/parameter-object.cjs.map +1 -0
- package/dist/domain/openapi/parameter-object.mjs +10 -0
- package/dist/domain/openapi/parameter-object.mjs.map +1 -0
- package/dist/domain/openapi/path-item-object.cjs +35 -0
- package/dist/domain/openapi/path-item-object.cjs.map +1 -0
- package/dist/domain/openapi/path-item-object.mjs +30 -0
- package/dist/domain/openapi/path-item-object.mjs.map +1 -0
- package/dist/domain/openapi/path-templates.cjs +23 -0
- package/dist/domain/openapi/path-templates.cjs.map +1 -0
- package/dist/domain/openapi/path-templates.mjs +21 -0
- package/dist/domain/openapi/path-templates.mjs.map +1 -0
- package/dist/domain/openapi/unsupported-features.cjs +87 -0
- package/dist/domain/openapi/unsupported-features.cjs.map +1 -0
- package/dist/domain/openapi/unsupported-features.mjs +84 -0
- package/dist/domain/openapi/unsupported-features.mjs.map +1 -0
- package/dist/domain/output-fixes.cjs +101 -0
- package/dist/domain/output-fixes.cjs.map +1 -0
- package/dist/domain/output-fixes.mjs +94 -0
- package/dist/domain/output-fixes.mjs.map +1 -0
- package/dist/domain/warnings.cjs +15 -0
- package/dist/domain/warnings.cjs.map +1 -0
- package/dist/domain/warnings.mjs +12 -0
- package/dist/domain/warnings.mjs.map +1 -0
- package/dist/index.cjs +98 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +841 -0
- package/dist/index.d.mts +841 -0
- package/dist/index.d.ts +841 -0
- package/dist/index.mjs +27 -0
- package/dist/index.mjs.map +1 -0
- package/dist/transform/components-object.cjs +15 -0
- package/dist/transform/components-object.cjs.map +1 -0
- package/dist/transform/components-object.mjs +11 -0
- package/dist/transform/components-object.mjs.map +1 -0
- package/dist/transform/header-object.cjs +12 -0
- package/dist/transform/header-object.cjs.map +1 -0
- package/dist/transform/header-object.mjs +10 -0
- package/dist/transform/header-object.mjs.map +1 -0
- package/dist/transform/media-type-object.cjs +12 -0
- package/dist/transform/media-type-object.cjs.map +1 -0
- package/dist/transform/media-type-object.mjs +10 -0
- package/dist/transform/media-type-object.mjs.map +1 -0
- package/dist/transform/operation-object.cjs +26 -0
- package/dist/transform/operation-object.cjs.map +1 -0
- package/dist/transform/operation-object.mjs +21 -0
- package/dist/transform/operation-object.mjs.map +1 -0
- package/dist/transform/parameter-object.cjs +12 -0
- package/dist/transform/parameter-object.cjs.map +1 -0
- package/dist/transform/parameter-object.mjs +10 -0
- package/dist/transform/parameter-object.mjs.map +1 -0
- package/dist/transform/path-item-object.cjs +12 -0
- package/dist/transform/path-item-object.cjs.map +1 -0
- package/dist/transform/path-item-object.mjs +10 -0
- package/dist/transform/path-item-object.mjs.map +1 -0
- package/dist/transform/paths-object.cjs +11 -0
- package/dist/transform/paths-object.cjs.map +1 -0
- package/dist/transform/paths-object.mjs +9 -0
- package/dist/transform/paths-object.mjs.map +1 -0
- package/dist/transform/request-body-object.cjs +12 -0
- package/dist/transform/request-body-object.cjs.map +1 -0
- package/dist/transform/request-body-object.mjs +10 -0
- package/dist/transform/request-body-object.mjs.map +1 -0
- package/dist/transform/response-object.cjs +12 -0
- package/dist/transform/response-object.cjs.map +1 -0
- package/dist/transform/response-object.mjs +10 -0
- package/dist/transform/response-object.mjs.map +1 -0
- package/dist/transform/responses-object.cjs +12 -0
- package/dist/transform/responses-object.cjs.map +1 -0
- package/dist/transform/responses-object.mjs +10 -0
- package/dist/transform/responses-object.mjs.map +1 -0
- package/dist/transform/schema-object.cjs +21 -0
- package/dist/transform/schema-object.cjs.map +1 -0
- package/dist/transform/schema-object.mjs +16 -0
- package/dist/transform/schema-object.mjs.map +1 -0
- package/package.json +115 -4
- package/src/adapters/node-file-system/node-file-system.ts +44 -0
- package/src/adapters/redocly-loader/alias-limit.ts +20 -0
- package/src/adapters/redocly-loader/allowed-hosts.ts +62 -0
- package/src/adapters/redocly-loader/bundled-ref-repair.ts +65 -0
- package/src/adapters/redocly-loader/malformed-refs.ts +61 -0
- package/src/adapters/redocly-loader/redocly-config-source.ts +78 -0
- package/src/adapters/redocly-loader/redocly-schema-loader.ts +262 -0
- package/src/adapters/redocly-loader/ref-access.ts +146 -0
- package/src/adapters/redocly-loader/ref-holders.ts +43 -0
- package/src/adapters/redocly-loader/remote-fetch.ts +104 -0
- package/src/adapters/redocly-loader/schema-load-errors.ts +124 -0
- package/src/adapters/redocly-loader/schema-source.ts +151 -0
- package/src/adapters/redocly-loader/unsupported-keys.ts +102 -0
- package/src/adapters/terminal-logger/terminal-logger.ts +98 -0
- package/src/adapters/type-ast-bridge/footer-nodes.ts +38 -0
- package/src/adapters/type-ast-bridge/ir-declarations-to-typescript.ts +100 -0
- package/src/adapters/type-ast-bridge/ir-to-typescript.ts +223 -0
- package/src/adapters/type-ast-bridge/lazy-node.ts +24 -0
- package/src/adapters/type-ast-bridge/load-typescript.ts +84 -0
- package/src/adapters/type-ast-bridge/print-typescript.ts +33 -0
- package/src/adapters/type-ast-bridge/typescript-raw-text.ts +49 -0
- package/src/adapters/type-ast-bridge/typescript-to-ir.ts +294 -0
- package/src/adapters/type-ast-bridge/typescript-types.ts +8 -0
- package/src/api/ast-to-string.ts +59 -0
- package/src/api/comment-header.ts +7 -0
- package/src/api/default-ports.ts +44 -0
- package/src/api/discriminator-conflict-warnings.ts +43 -0
- package/src/api/discriminator-enum-names.ts +26 -0
- package/src/api/discriminator-enum-parent.ts +129 -0
- package/src/api/discriminator-enum.ts +115 -0
- package/src/api/discriminator-other-owners.ts +97 -0
- package/src/api/discriminator-patch.ts +147 -0
- package/src/api/discriminator-scan.ts +260 -0
- package/src/api/document-declarations.ts +41 -0
- package/src/api/document-refs.ts +71 -0
- package/src/api/document-run.ts +177 -0
- package/src/api/enum-values-warnings.ts +21 -0
- package/src/api/footer-entry.ts +23 -0
- package/src/api/footer-sink.ts +67 -0
- package/src/api/legacy-callback-warning.ts +29 -0
- package/src/api/legacy-ts-helpers.ts +311 -0
- package/src/api/legacy-utils.ts +118 -0
- package/src/api/openapi-ts.ts +62 -0
- package/src/api/path-template-warnings.ts +27 -0
- package/src/api/schema-callbacks.ts +211 -0
- package/src/api/string-to-ast.ts +27 -0
- package/src/api/transform-context.ts +93 -0
- package/src/api/transform-schema.ts +123 -0
- package/src/api/type-helpers.ts +130 -0
- package/src/api/unsupported-feature-warnings.ts +33 -0
- package/src/application/ports/file-system.ts +12 -0
- package/src/application/ports/logger.ts +16 -0
- package/src/application/ports/redocly-config-source.ts +20 -0
- package/src/application/ports/schema-loader.ts +32 -0
- package/src/application/print/comment-writer.ts +91 -0
- package/src/application/print/declaration-printer.ts +100 -0
- package/src/application/print/literal-text.ts +62 -0
- package/src/application/print/print-nodes.ts +62 -0
- package/src/application/print/print-options.ts +11 -0
- package/src/application/print/text-writer.ts +83 -0
- package/src/application/print/type-printer.ts +287 -0
- package/src/application/stack-overflow.ts +54 -0
- package/src/application/transform/document/assignability.ts +203 -0
- package/src/application/transform/document/components.ts +189 -0
- package/src/application/transform/document/declared-types.ts +93 -0
- package/src/application/transform/document/defs-root.ts +25 -0
- package/src/application/transform/document/document-member.ts +20 -0
- package/src/application/transform/document/document.ts +215 -0
- package/src/application/transform/document/exploded-query.ts +91 -0
- package/src/application/transform/document/global-type-references.ts +78 -0
- package/src/application/transform/document/header.ts +34 -0
- package/src/application/transform/document/kept-deprecated.ts +135 -0
- package/src/application/transform/document/list-assignability.ts +87 -0
- package/src/application/transform/document/media-type.ts +78 -0
- package/src/application/transform/document/operation.ts +64 -0
- package/src/application/transform/document/parameter.ts +45 -0
- package/src/application/transform/document/parameters.ts +265 -0
- package/src/application/transform/document/path-item.ts +168 -0
- package/src/application/transform/document/path-key-overlaps.ts +201 -0
- package/src/application/transform/document/path-template-replace.ts +90 -0
- package/src/application/transform/document/paths-enum.ts +127 -0
- package/src/application/transform/document/paths.ts +273 -0
- package/src/application/transform/document/request-body.ts +50 -0
- package/src/application/transform/document/response.ts +109 -0
- package/src/application/transform/document/responses.ts +29 -0
- package/src/application/transform/document/root-type-aliases.ts +107 -0
- package/src/application/transform/document/template-key-match.ts +183 -0
- package/src/application/transform/document/type-assignability.ts +268 -0
- package/src/application/transform/document/type-key.ts +80 -0
- package/src/application/transform/document/type-resolution.ts +163 -0
- package/src/application/transform/document/webhooks.ts +22 -0
- package/src/application/transform/document-entries.ts +28 -0
- package/src/application/transform/footer/document-footer.ts +212 -0
- package/src/application/transform/footer/enum-naming.ts +210 -0
- package/src/application/transform/footer/enum-values-check.ts +171 -0
- package/src/application/transform/footer/evaluation.ts +47 -0
- package/src/application/transform/footer/shared-enum-names.ts +86 -0
- package/src/application/transform/footer/type-evaluation.ts +294 -0
- package/src/application/transform/footer/type-rules.ts +269 -0
- package/src/application/transform/helper-types.ts +92 -0
- package/src/application/transform/literal-type.ts +54 -0
- package/src/application/transform/numbered-names.ts +20 -0
- package/src/application/transform/ref-pointer/generated-location.ts +211 -0
- package/src/application/transform/ref-pointer/generated-shape.ts +275 -0
- package/src/application/transform/ref-pointer/inline-cycles.ts +56 -0
- package/src/application/transform/ref-pointer/original-index.ts +95 -0
- package/src/application/transform/ref-pointer/pointer-type.ts +92 -0
- package/src/application/transform/ref-pointer/pointer-walk.ts +96 -0
- package/src/application/transform/ref-pointer/typed-walk.ts +192 -0
- package/src/application/transform/ref-type.ts +102 -0
- package/src/application/transform/schema/access-flags.ts +63 -0
- package/src/application/transform/schema/array-type.ts +213 -0
- package/src/application/transform/schema/composition-type.ts +255 -0
- package/src/application/transform/schema/core-type.ts +119 -0
- package/src/application/transform/schema/discriminated-union.ts +58 -0
- package/src/application/transform/schema/discriminator-property.ts +33 -0
- package/src/application/transform/schema/enum-rule.ts +280 -0
- package/src/application/transform/schema/inherited-discriminator.ts +54 -0
- package/src/application/transform/schema/object-type.ts +289 -0
- package/src/application/transform/schema/presence-members.ts +96 -0
- package/src/application/transform/schema/required-variants.ts +88 -0
- package/src/application/transform/schema/schema-context.ts +136 -0
- package/src/application/transform/schema/schema-rule.ts +29 -0
- package/src/application/transform/schema/schema-transform.ts +99 -0
- package/src/application/transform/schema/unevaluated-properties.ts +105 -0
- package/src/application/transform/schema-comment.ts +196 -0
- package/src/application/transform/shared-types.ts +9 -0
- package/src/application/transform/transform-context.ts +51 -0
- package/src/application/transform/type-combinators.ts +57 -0
- package/src/cli/cli-arguments.ts +208 -0
- package/src/cli/cli-dependencies.ts +47 -0
- package/src/cli/cli-errors.ts +127 -0
- package/src/cli/cli-output.ts +67 -0
- package/src/cli/docs-links.ts +6 -0
- package/src/cli/fix-option.ts +29 -0
- package/src/cli/help-text.ts +52 -0
- package/src/cli/main.ts +73 -0
- package/src/cli/redocly-apis.ts +95 -0
- package/src/cli/ref-limits.ts +16 -0
- package/src/cli/run-cli.ts +131 -0
- package/src/domain/assert-never.ts +8 -0
- package/src/domain/errors.ts +76 -0
- package/src/domain/ir/constructors.ts +142 -0
- package/src/domain/ir/identifier-text.ts +49 -0
- package/src/domain/ir/newer-identifier-ranges.ts +109 -0
- package/src/domain/ir/nodes.ts +225 -0
- package/src/domain/ir/normalize.ts +51 -0
- package/src/domain/ir/property-name.ts +28 -0
- package/src/domain/ir/raw-text-escapes.ts +37 -0
- package/src/domain/openapi/admitted-values.ts +113 -0
- package/src/domain/openapi/alias-expansion.ts +72 -0
- package/src/domain/openapi/binary-content.ts +74 -0
- package/src/domain/openapi/components-object.ts +52 -0
- package/src/domain/openapi/discriminated-union.ts +109 -0
- package/src/domain/openapi/discriminator-conflicts.ts +251 -0
- package/src/domain/openapi/document-object.ts +12 -0
- package/src/domain/openapi/header-object.ts +9 -0
- package/src/domain/openapi/json-pointer.ts +46 -0
- package/src/domain/openapi/media-type-object.ts +26 -0
- package/src/domain/openapi/operation-object.ts +13 -0
- package/src/domain/openapi/parameter-object.ts +34 -0
- package/src/domain/openapi/path-item-object.ts +70 -0
- package/src/domain/openapi/path-templates.ts +31 -0
- package/src/domain/openapi/request-body-object.ts +7 -0
- package/src/domain/openapi/response-object.ts +14 -0
- package/src/domain/openapi/schema-object.ts +61 -0
- package/src/domain/openapi/unsupported-features.ts +139 -0
- package/src/domain/output-fixes.ts +136 -0
- package/src/domain/warnings.ts +20 -0
- package/src/index.ts +67 -0
- package/src/transform/components-object.ts +27 -0
- package/src/transform/header-object.ts +19 -0
- package/src/transform/media-type-object.ts +19 -0
- package/src/transform/operation-object.ts +36 -0
- package/src/transform/parameter-object.ts +19 -0
- package/src/transform/parameters-array.ts +19 -0
- package/src/transform/path-item-object.ts +22 -0
- package/src/transform/paths-enum.ts +8 -0
- package/src/transform/paths-object.ts +15 -0
- package/src/transform/request-body-object.ts +19 -0
- package/src/transform/response-object.ts +19 -0
- package/src/transform/responses-object.ts +19 -0
- package/src/transform/schema-object.ts +36 -0
- package/src/transform/webhooks-object.ts +15 -0
- package/src/types/generator-options.ts +278 -0
- package/src/types/openapi-common.ts +100 -0
- package/src/types/openapi-document.ts +196 -0
- package/src/types/openapi-path-item.ts +130 -0
- package/src/types/openapi-request.ts +209 -0
- package/src/types/openapi-response.ts +81 -0
- package/src/types/openapi-schema.ts +169 -0
- package/src/types/openapi-security.ts +116 -0
- package/src/types.ts +12 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-type-object.mjs","sources":["../../../src/domain/openapi/media-type-object.ts"],"sourcesContent":["import { parseRefPointer } from \"./json-pointer.js\";\nimport type { ReferenceSchema, Schema } from \"./schema-object.js\";\n\n/** The parts of a Media Type Object the generator reads (OpenAPI 3.2 §4.8.14). */\nexport interface MediaTypeObject {\n /** The complete content. */\n readonly schema?: Schema;\n /** Each item of a sequential media type such as `application/jsonl` (OpenAPI 3.2). */\n readonly itemSchema?: Schema;\n}\n\n/** A `content` map: media type name to a Media Type Object or a `$ref` to one. */\nexport type ContentMap = Readonly<Record<string, MediaTypeObject | ReferenceSchema>>;\n\nconst COMPONENTS_SEGMENT = \"components\";\n/** The OpenAPI 3.2 component map of reusable Media Type Objects. */\nexport const MEDIA_TYPES_COMPONENT_KIND = \"mediaTypes\";\n\n/**\n * Whether a `content` entry's `$ref` points into `components.mediaTypes` (OpenAPI 3.2). Other\n * `$ref`s in `content` keep the output they had before 3.2 (ADR-020).\n */\nexport function isMediaTypeComponentRef(ref: string): boolean {\n const [root, kind] = parseRefPointer(ref);\n return ref.startsWith(\"#/\") && root === COMPONENTS_SEGMENT && kind === MEDIA_TYPES_COMPONENT_KIND;\n}\n"],"names":[],"mappings":";;AAcA,MAAM,kBAAA,GAAqB,YAAA;AAEpB,MAAM,0BAAA,GAA6B;AAMnC,SAAS,wBAAwB,GAAA,EAAsB;AAC5D,EAAA,MAAM,CAAC,IAAA,EAAM,IAAI,CAAA,GAAI,gBAAgB,GAAG,CAAA;AACxC,EAAA,OAAO,IAAI,UAAA,CAAW,IAAI,CAAA,IAAK,IAAA,KAAS,sBAAsB,IAAA,KAAS,0BAAA;AACzE;;"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const PARAMETER_LOCATIONS = Object.freeze([
|
|
4
|
+
"query",
|
|
5
|
+
"header",
|
|
6
|
+
"path",
|
|
7
|
+
"cookie"
|
|
8
|
+
]);
|
|
9
|
+
const QUERYSTRING_LOCATION = "querystring";
|
|
10
|
+
|
|
11
|
+
exports.PARAMETER_LOCATIONS = PARAMETER_LOCATIONS;
|
|
12
|
+
exports.QUERYSTRING_LOCATION = QUERYSTRING_LOCATION;
|
|
13
|
+
//# sourceMappingURL=parameter-object.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parameter-object.cjs","sources":["../../../src/domain/openapi/parameter-object.ts"],"sourcesContent":["import type { ContentMap } from \"./media-type-object.js\";\nimport type { ReferenceSchema, Schema } from \"./schema-object.js\";\n\nexport type ParameterLocation = \"query\" | \"header\" | \"path\" | \"cookie\";\n\n/** Every parameter location, in the order the generated `parameters` type lists them. */\nexport const PARAMETER_LOCATIONS: readonly ParameterLocation[] = Object.freeze([\n \"query\",\n \"header\",\n \"path\",\n \"cookie\",\n]);\n\n/**\n * The OpenAPI 3.2 location of a parameter that is the whole query string, described by `content`.\n * Its type becomes the `query` member of `parameters` (ADR-020).\n */\nexport const QUERYSTRING_LOCATION = \"querystring\";\n\n/** The parts of a Parameter Object the generator reads (OpenAPI 3.2 §4.8.12). */\nexport interface ParameterObject {\n readonly name: string;\n readonly in: ParameterLocation | typeof QUERYSTRING_LOCATION;\n readonly required?: boolean;\n readonly deprecated?: boolean;\n /** How the value is serialized; `form` for `in: query` when absent (§4.8.12.4). */\n readonly style?: string;\n /** Whether an array or object value is sent as several values; true for `form` when absent. */\n readonly explode?: boolean;\n readonly schema?: Schema;\n readonly content?: ContentMap;\n}\n\nexport type ParameterOrReference = ParameterObject | ReferenceSchema;\n"],"names":[],"mappings":";;AAMO,MAAM,mBAAA,GAAoD,OAAO,MAAA,CAAO;AAAA,EAC7E,OAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC;AAMM,MAAM,oBAAA,GAAuB;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parameter-object.mjs","sources":["../../../src/domain/openapi/parameter-object.ts"],"sourcesContent":["import type { ContentMap } from \"./media-type-object.js\";\nimport type { ReferenceSchema, Schema } from \"./schema-object.js\";\n\nexport type ParameterLocation = \"query\" | \"header\" | \"path\" | \"cookie\";\n\n/** Every parameter location, in the order the generated `parameters` type lists them. */\nexport const PARAMETER_LOCATIONS: readonly ParameterLocation[] = Object.freeze([\n \"query\",\n \"header\",\n \"path\",\n \"cookie\",\n]);\n\n/**\n * The OpenAPI 3.2 location of a parameter that is the whole query string, described by `content`.\n * Its type becomes the `query` member of `parameters` (ADR-020).\n */\nexport const QUERYSTRING_LOCATION = \"querystring\";\n\n/** The parts of a Parameter Object the generator reads (OpenAPI 3.2 §4.8.12). */\nexport interface ParameterObject {\n readonly name: string;\n readonly in: ParameterLocation | typeof QUERYSTRING_LOCATION;\n readonly required?: boolean;\n readonly deprecated?: boolean;\n /** How the value is serialized; `form` for `in: query` when absent (§4.8.12.4). */\n readonly style?: string;\n /** Whether an array or object value is sent as several values; true for `form` when absent. */\n readonly explode?: boolean;\n readonly schema?: Schema;\n readonly content?: ContentMap;\n}\n\nexport type ParameterOrReference = ParameterObject | ReferenceSchema;\n"],"names":[],"mappings":"AAMO,MAAM,mBAAA,GAAoD,OAAO,MAAA,CAAO;AAAA,EAC7E,OAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC;AAMM,MAAM,oBAAA,GAAuB;;"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const HTTP_METHODS = Object.freeze([
|
|
4
|
+
"get",
|
|
5
|
+
"put",
|
|
6
|
+
"post",
|
|
7
|
+
"delete",
|
|
8
|
+
"options",
|
|
9
|
+
"head",
|
|
10
|
+
"patch",
|
|
11
|
+
"trace"
|
|
12
|
+
]);
|
|
13
|
+
const QUERY_METHOD = "query";
|
|
14
|
+
const ADDITIONAL_OPERATIONS_KEY = "additionalOperations";
|
|
15
|
+
function pathItemOperations(pathItem) {
|
|
16
|
+
const methods = [...HTTP_METHODS, QUERY_METHOD];
|
|
17
|
+
const fixed = methods.flatMap((method) => {
|
|
18
|
+
const operation = pathItem[method];
|
|
19
|
+
return operation ? [{ method, operation, segments: [method] }] : [];
|
|
20
|
+
});
|
|
21
|
+
const additional = Object.entries(pathItem.additionalOperations ?? {}).map(
|
|
22
|
+
([method, operation]) => ({
|
|
23
|
+
method,
|
|
24
|
+
operation,
|
|
25
|
+
segments: [ADDITIONAL_OPERATIONS_KEY, method]
|
|
26
|
+
})
|
|
27
|
+
);
|
|
28
|
+
return [...fixed, ...additional];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
exports.ADDITIONAL_OPERATIONS_KEY = ADDITIONAL_OPERATIONS_KEY;
|
|
32
|
+
exports.HTTP_METHODS = HTTP_METHODS;
|
|
33
|
+
exports.QUERY_METHOD = QUERY_METHOD;
|
|
34
|
+
exports.pathItemOperations = pathItemOperations;
|
|
35
|
+
//# sourceMappingURL=path-item-object.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-item-object.cjs","sources":["../../../src/domain/openapi/path-item-object.ts"],"sourcesContent":["import type { OperationObject } from \"./operation-object.js\";\nimport type { ParameterOrReference } from \"./parameter-object.js\";\nimport type { ReferenceSchema } from \"./schema-object.js\";\n\n/** The methods every generated path item lists, with `?: never` when the document has none. */\nexport type HttpMethod = \"get\" | \"put\" | \"post\" | \"delete\" | \"options\" | \"head\" | \"patch\" | \"trace\";\n\n/** The operation fields of a path item, in the order the generated types list them. */\nexport const HTTP_METHODS: readonly HttpMethod[] = Object.freeze([\n \"get\",\n \"put\",\n \"post\",\n \"delete\",\n \"options\",\n \"head\",\n \"patch\",\n \"trace\",\n]);\n\n/**\n * The OpenAPI 3.2 QUERY method. Its member is written only when the path item declares it, so\n * documents without it keep their output (ADR-020).\n */\nexport const QUERY_METHOD = \"query\";\n\n/** Every operation field of a path item. */\nexport type PathItemMethod = HttpMethod | typeof QUERY_METHOD;\n\n/** The OpenAPI 3.2 path item field for methods other than the fixed fields, by exact name. */\nexport const ADDITIONAL_OPERATIONS_KEY = \"additionalOperations\";\n\nexport type OperationEntry = OperationObject | ReferenceSchema;\n\n/** The parts of a Path Item Object the generator reads (OpenAPI 3.2 §4.8.9). */\nexport type PathItemObject = {\n readonly parameters?: readonly ParameterOrReference[];\n readonly additionalOperations?: Readonly<Record<string, OperationEntry>>;\n} & { readonly [method in PathItemMethod]?: OperationEntry };\n\n/** Path items by URL template (OpenAPI 3.1 §4.8.8); webhooks use the same shape by name. */\nexport type PathsObject = Readonly<Record<string, PathItemObject | ReferenceSchema>>;\n\n/** One operation of a path item and the method it is declared under. */\nexport interface PathItemOperation {\n /** A fixed field (`get`, `query`, …) or an `additionalOperations` name (`SUBSCRIBE`). */\n readonly method: string;\n readonly operation: OperationEntry;\n /** JSON Pointer segments from the path item to the operation. */\n readonly segments: readonly string[];\n}\n\n/**\n * Every operation of a path item: the fixed methods in output order, then `query`, then\n * `additionalOperations` in document order.\n */\nexport function pathItemOperations(pathItem: PathItemObject): PathItemOperation[] {\n const methods: readonly PathItemMethod[] = [...HTTP_METHODS, QUERY_METHOD];\n const fixed = methods.flatMap((method) => {\n const operation = pathItem[method];\n return operation ? [{ method, operation, segments: [method] }] : [];\n });\n const additional = Object.entries(pathItem.additionalOperations ?? {}).map(\n ([method, operation]) => ({\n method,\n operation,\n segments: [ADDITIONAL_OPERATIONS_KEY, method],\n }),\n );\n return [...fixed, ...additional];\n}\n"],"names":[],"mappings":";;AAQO,MAAM,YAAA,GAAsC,OAAO,MAAA,CAAO;AAAA,EAC/D,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC;AAMM,MAAM,YAAA,GAAe;AAMrB,MAAM,yBAAA,GAA4B;AA0BlC,SAAS,mBAAmB,QAAA,EAA+C;AAChF,EAAA,MAAM,OAAA,GAAqC,CAAC,GAAG,YAAA,EAAc,YAAY,CAAA;AACzE,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,KAAW;AACxC,IAAA,MAAM,SAAA,GAAY,SAAS,MAAM,CAAA;AACjC,IAAA,OAAO,SAAA,GAAY,CAAC,EAAE,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,CAAC,MAAM,CAAA,EAAG,CAAA,GAAI,EAAC;AAAA,EACpE,CAAC,CAAA;AACD,EAAA,MAAM,aAAa,MAAA,CAAO,OAAA,CAAQ,SAAS,oBAAA,IAAwB,EAAE,CAAA,CAAE,GAAA;AAAA,IACrE,CAAC,CAAC,MAAA,EAAQ,SAAS,CAAA,MAAO;AAAA,MACxB,MAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA,EAAU,CAAC,yBAAA,EAA2B,MAAM;AAAA,KAC9C;AAAA,GACF;AACA,EAAA,OAAO,CAAC,GAAG,KAAA,EAAO,GAAG,UAAU,CAAA;AACjC;;;;;"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
const HTTP_METHODS = Object.freeze([
|
|
2
|
+
"get",
|
|
3
|
+
"put",
|
|
4
|
+
"post",
|
|
5
|
+
"delete",
|
|
6
|
+
"options",
|
|
7
|
+
"head",
|
|
8
|
+
"patch",
|
|
9
|
+
"trace"
|
|
10
|
+
]);
|
|
11
|
+
const QUERY_METHOD = "query";
|
|
12
|
+
const ADDITIONAL_OPERATIONS_KEY = "additionalOperations";
|
|
13
|
+
function pathItemOperations(pathItem) {
|
|
14
|
+
const methods = [...HTTP_METHODS, QUERY_METHOD];
|
|
15
|
+
const fixed = methods.flatMap((method) => {
|
|
16
|
+
const operation = pathItem[method];
|
|
17
|
+
return operation ? [{ method, operation, segments: [method] }] : [];
|
|
18
|
+
});
|
|
19
|
+
const additional = Object.entries(pathItem.additionalOperations ?? {}).map(
|
|
20
|
+
([method, operation]) => ({
|
|
21
|
+
method,
|
|
22
|
+
operation,
|
|
23
|
+
segments: [ADDITIONAL_OPERATIONS_KEY, method]
|
|
24
|
+
})
|
|
25
|
+
);
|
|
26
|
+
return [...fixed, ...additional];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export { ADDITIONAL_OPERATIONS_KEY, HTTP_METHODS, QUERY_METHOD, pathItemOperations };
|
|
30
|
+
//# sourceMappingURL=path-item-object.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-item-object.mjs","sources":["../../../src/domain/openapi/path-item-object.ts"],"sourcesContent":["import type { OperationObject } from \"./operation-object.js\";\nimport type { ParameterOrReference } from \"./parameter-object.js\";\nimport type { ReferenceSchema } from \"./schema-object.js\";\n\n/** The methods every generated path item lists, with `?: never` when the document has none. */\nexport type HttpMethod = \"get\" | \"put\" | \"post\" | \"delete\" | \"options\" | \"head\" | \"patch\" | \"trace\";\n\n/** The operation fields of a path item, in the order the generated types list them. */\nexport const HTTP_METHODS: readonly HttpMethod[] = Object.freeze([\n \"get\",\n \"put\",\n \"post\",\n \"delete\",\n \"options\",\n \"head\",\n \"patch\",\n \"trace\",\n]);\n\n/**\n * The OpenAPI 3.2 QUERY method. Its member is written only when the path item declares it, so\n * documents without it keep their output (ADR-020).\n */\nexport const QUERY_METHOD = \"query\";\n\n/** Every operation field of a path item. */\nexport type PathItemMethod = HttpMethod | typeof QUERY_METHOD;\n\n/** The OpenAPI 3.2 path item field for methods other than the fixed fields, by exact name. */\nexport const ADDITIONAL_OPERATIONS_KEY = \"additionalOperations\";\n\nexport type OperationEntry = OperationObject | ReferenceSchema;\n\n/** The parts of a Path Item Object the generator reads (OpenAPI 3.2 §4.8.9). */\nexport type PathItemObject = {\n readonly parameters?: readonly ParameterOrReference[];\n readonly additionalOperations?: Readonly<Record<string, OperationEntry>>;\n} & { readonly [method in PathItemMethod]?: OperationEntry };\n\n/** Path items by URL template (OpenAPI 3.1 §4.8.8); webhooks use the same shape by name. */\nexport type PathsObject = Readonly<Record<string, PathItemObject | ReferenceSchema>>;\n\n/** One operation of a path item and the method it is declared under. */\nexport interface PathItemOperation {\n /** A fixed field (`get`, `query`, …) or an `additionalOperations` name (`SUBSCRIBE`). */\n readonly method: string;\n readonly operation: OperationEntry;\n /** JSON Pointer segments from the path item to the operation. */\n readonly segments: readonly string[];\n}\n\n/**\n * Every operation of a path item: the fixed methods in output order, then `query`, then\n * `additionalOperations` in document order.\n */\nexport function pathItemOperations(pathItem: PathItemObject): PathItemOperation[] {\n const methods: readonly PathItemMethod[] = [...HTTP_METHODS, QUERY_METHOD];\n const fixed = methods.flatMap((method) => {\n const operation = pathItem[method];\n return operation ? [{ method, operation, segments: [method] }] : [];\n });\n const additional = Object.entries(pathItem.additionalOperations ?? {}).map(\n ([method, operation]) => ({\n method,\n operation,\n segments: [ADDITIONAL_OPERATIONS_KEY, method],\n }),\n );\n return [...fixed, ...additional];\n}\n"],"names":[],"mappings":"AAQO,MAAM,YAAA,GAAsC,OAAO,MAAA,CAAO;AAAA,EAC/D,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC;AAMM,MAAM,YAAA,GAAe;AAMrB,MAAM,yBAAA,GAA4B;AA0BlC,SAAS,mBAAmB,QAAA,EAA+C;AAChF,EAAA,MAAM,OAAA,GAAqC,CAAC,GAAG,YAAA,EAAc,YAAY,CAAA;AACzE,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,KAAW;AACxC,IAAA,MAAM,SAAA,GAAY,SAAS,MAAM,CAAA;AACjC,IAAA,OAAO,SAAA,GAAY,CAAC,EAAE,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,CAAC,MAAM,CAAA,EAAG,CAAA,GAAI,EAAC;AAAA,EACpE,CAAC,CAAA;AACD,EAAA,MAAM,aAAa,MAAA,CAAO,OAAA,CAAQ,SAAS,oBAAA,IAAwB,EAAE,CAAA,CAAE,GAAA;AAAA,IACrE,CAAC,CAAC,MAAA,EAAQ,SAAS,CAAA,MAAO;AAAA,MACxB,MAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA,EAAU,CAAC,yBAAA,EAA2B,MAAM;AAAA,KAC9C;AAAA,GACF;AACA,EAAA,OAAO,CAAC,GAAG,KAAA,EAAO,GAAG,UAAU,CAAA;AACjC;;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const PATH_PARAMETER_RE = /\{[^}]+\}/g;
|
|
4
|
+
const PATH_PREFIX = "/";
|
|
5
|
+
const UNNAMED_PARAMETER = "{}";
|
|
6
|
+
function isObject(value) {
|
|
7
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
8
|
+
}
|
|
9
|
+
function findIdenticalPathTemplates(document) {
|
|
10
|
+
const paths = isObject(document) && isObject(document.paths) ? document.paths : {};
|
|
11
|
+
const byHierarchy = /* @__PURE__ */ new Map();
|
|
12
|
+
for (const url of Object.keys(paths)) {
|
|
13
|
+
if (!url.startsWith(PATH_PREFIX) || !url.includes("{")) {
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
const hierarchy = url.replace(PATH_PARAMETER_RE, UNNAMED_PARAMETER);
|
|
17
|
+
byHierarchy.set(hierarchy, [...byHierarchy.get(hierarchy) ?? [], url]);
|
|
18
|
+
}
|
|
19
|
+
return [...byHierarchy.values()].filter((urls) => urls.length > 1);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
exports.findIdenticalPathTemplates = findIdenticalPathTemplates;
|
|
23
|
+
//# sourceMappingURL=path-templates.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-templates.cjs","sources":["../../../src/domain/openapi/path-templates.ts"],"sourcesContent":["/**\n * The Paths Object rule (OpenAPI 3.1 §4.8.8): \"Templated paths with the same hierarchy but\n * different templated names MUST NOT exist as they are identical.\" Such paths, `/a/{id}` and\n * `/a/{name}`, match the same URLs, so a client cannot tell which one a request is for.\n */\n\nconst PATH_PARAMETER_RE = /\\{[^}]+\\}/g;\nconst PATH_PREFIX = \"/\";\nconst UNNAMED_PARAMETER = \"{}\";\n\nfunction isObject(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * The groups of paths that differ only in the names of their template parameters, each group in\n * document order, the groups in the order of their first path. Keys that are no path, such as an\n * `x-` extension, are left out.\n */\nexport function findIdenticalPathTemplates(document: unknown): string[][] {\n const paths = isObject(document) && isObject(document.paths) ? document.paths : {};\n const byHierarchy = new Map<string, string[]>();\n for (const url of Object.keys(paths)) {\n if (!url.startsWith(PATH_PREFIX) || !url.includes(\"{\")) {\n continue;\n }\n const hierarchy = url.replace(PATH_PARAMETER_RE, UNNAMED_PARAMETER);\n byHierarchy.set(hierarchy, [...(byHierarchy.get(hierarchy) ?? []), url]);\n }\n return [...byHierarchy.values()].filter((urls) => urls.length > 1);\n}\n"],"names":[],"mappings":";;AAMA,MAAM,iBAAA,GAAoB,YAAA;AAC1B,MAAM,WAAA,GAAc,GAAA;AACpB,MAAM,iBAAA,GAAoB,IAAA;AAE1B,SAAS,SAAS,KAAA,EAA4D;AAC5E,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAOO,SAAS,2BAA2B,QAAA,EAA+B;AACxE,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,QAAQ,CAAA,IAAK,QAAA,CAAS,SAAS,KAAK,CAAA,GAAI,QAAA,CAAS,KAAA,GAAQ,EAAC;AACjF,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAsB;AAC9C,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AACpC,IAAA,IAAI,CAAC,IAAI,UAAA,CAAW,WAAW,KAAK,CAAC,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EAAG;AACtD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,OAAA,CAAQ,iBAAA,EAAmB,iBAAiB,CAAA;AAClE,IAAA,WAAA,CAAY,GAAA,CAAI,SAAA,EAAW,CAAC,GAAI,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA,IAAK,EAAC,EAAI,GAAG,CAAC,CAAA;AAAA,EACzE;AACA,EAAA,OAAO,CAAC,GAAG,WAAA,CAAY,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AACnE;;"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const PATH_PARAMETER_RE = /\{[^}]+\}/g;
|
|
2
|
+
const PATH_PREFIX = "/";
|
|
3
|
+
const UNNAMED_PARAMETER = "{}";
|
|
4
|
+
function isObject(value) {
|
|
5
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
6
|
+
}
|
|
7
|
+
function findIdenticalPathTemplates(document) {
|
|
8
|
+
const paths = isObject(document) && isObject(document.paths) ? document.paths : {};
|
|
9
|
+
const byHierarchy = /* @__PURE__ */ new Map();
|
|
10
|
+
for (const url of Object.keys(paths)) {
|
|
11
|
+
if (!url.startsWith(PATH_PREFIX) || !url.includes("{")) {
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
14
|
+
const hierarchy = url.replace(PATH_PARAMETER_RE, UNNAMED_PARAMETER);
|
|
15
|
+
byHierarchy.set(hierarchy, [...byHierarchy.get(hierarchy) ?? [], url]);
|
|
16
|
+
}
|
|
17
|
+
return [...byHierarchy.values()].filter((urls) => urls.length > 1);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export { findIdenticalPathTemplates };
|
|
21
|
+
//# sourceMappingURL=path-templates.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-templates.mjs","sources":["../../../src/domain/openapi/path-templates.ts"],"sourcesContent":["/**\n * The Paths Object rule (OpenAPI 3.1 §4.8.8): \"Templated paths with the same hierarchy but\n * different templated names MUST NOT exist as they are identical.\" Such paths, `/a/{id}` and\n * `/a/{name}`, match the same URLs, so a client cannot tell which one a request is for.\n */\n\nconst PATH_PARAMETER_RE = /\\{[^}]+\\}/g;\nconst PATH_PREFIX = \"/\";\nconst UNNAMED_PARAMETER = \"{}\";\n\nfunction isObject(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * The groups of paths that differ only in the names of their template parameters, each group in\n * document order, the groups in the order of their first path. Keys that are no path, such as an\n * `x-` extension, are left out.\n */\nexport function findIdenticalPathTemplates(document: unknown): string[][] {\n const paths = isObject(document) && isObject(document.paths) ? document.paths : {};\n const byHierarchy = new Map<string, string[]>();\n for (const url of Object.keys(paths)) {\n if (!url.startsWith(PATH_PREFIX) || !url.includes(\"{\")) {\n continue;\n }\n const hierarchy = url.replace(PATH_PARAMETER_RE, UNNAMED_PARAMETER);\n byHierarchy.set(hierarchy, [...(byHierarchy.get(hierarchy) ?? []), url]);\n }\n return [...byHierarchy.values()].filter((urls) => urls.length > 1);\n}\n"],"names":[],"mappings":"AAMA,MAAM,iBAAA,GAAoB,YAAA;AAC1B,MAAM,WAAA,GAAc,GAAA;AACpB,MAAM,iBAAA,GAAoB,IAAA;AAE1B,SAAS,SAAS,KAAA,EAA4D;AAC5E,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAOO,SAAS,2BAA2B,QAAA,EAA+B;AACxE,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,QAAQ,CAAA,IAAK,QAAA,CAAS,SAAS,KAAK,CAAA,GAAI,QAAA,CAAS,KAAA,GAAQ,EAAC;AACjF,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAsB;AAC9C,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AACpC,IAAA,IAAI,CAAC,IAAI,UAAA,CAAW,WAAW,KAAK,CAAC,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EAAG;AACtD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,OAAA,CAAQ,iBAAA,EAAmB,iBAAiB,CAAA;AAClE,IAAA,WAAA,CAAY,GAAA,CAAI,SAAA,EAAW,CAAC,GAAI,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA,IAAK,EAAC,EAAI,GAAG,CAAC,CAAA;AAAA,EACzE;AACA,EAAA,OAAO,CAAC,GAAG,WAAA,CAAY,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AACnE;;"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const jsonPointer = require('./json-pointer.cjs');
|
|
4
|
+
const parameterObject = require('./parameter-object.cjs');
|
|
5
|
+
const pathItemObject = require('./path-item-object.cjs');
|
|
6
|
+
|
|
7
|
+
const UnsupportedFeature = {
|
|
8
|
+
QUERYSTRING_NEXT_TO_QUERY: "querystring"
|
|
9
|
+
};
|
|
10
|
+
const QUERY_LOCATION = "query";
|
|
11
|
+
const LOCAL_REF_PREFIX = "#/";
|
|
12
|
+
function isObject(value) {
|
|
13
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
14
|
+
}
|
|
15
|
+
function resolveLocal(document, value) {
|
|
16
|
+
if (!isObject(value) || typeof value.$ref !== "string") {
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
if (!value.$ref.startsWith(LOCAL_REF_PREFIX)) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
let node = document;
|
|
23
|
+
for (const segment of jsonPointer.parseRefPointer(value.$ref)) {
|
|
24
|
+
node = isObject(node) || Array.isArray(node) ? node[segment] : void 0;
|
|
25
|
+
}
|
|
26
|
+
return node ?? null;
|
|
27
|
+
}
|
|
28
|
+
function locatedParameters(document, parameters, segments) {
|
|
29
|
+
if (!Array.isArray(parameters)) {
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
return parameters.flatMap((entry, index) => {
|
|
33
|
+
const parameter = resolveLocal(document, entry);
|
|
34
|
+
const pointer = jsonPointer.createRef([...segments, String(index)]);
|
|
35
|
+
return isObject(parameter) ? [{ pointer, parameter }] : [];
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function mergedParameters(shared, own) {
|
|
39
|
+
const byKey = /* @__PURE__ */ new Map();
|
|
40
|
+
for (const located of [...shared, ...own]) {
|
|
41
|
+
byKey.set(`${String(located.parameter.in)}-${String(located.parameter.name)}`, located);
|
|
42
|
+
}
|
|
43
|
+
return [...byKey.values()];
|
|
44
|
+
}
|
|
45
|
+
function querystringPointers(parameters) {
|
|
46
|
+
const hasQuery = parameters.some(({ parameter }) => parameter.in === QUERY_LOCATION);
|
|
47
|
+
return hasQuery ? parameters.filter(({ parameter }) => parameter.in === parameterObject.QUERYSTRING_LOCATION).map(({ pointer }) => pointer) : [];
|
|
48
|
+
}
|
|
49
|
+
function pathItemPointers(document, pathItem, segments) {
|
|
50
|
+
const shared = locatedParameters(document, pathItem.parameters, [...segments, "parameters"]);
|
|
51
|
+
return pathItemObject.pathItemOperations(pathItem).flatMap((entry) => {
|
|
52
|
+
const operation = resolveLocal(document, entry.operation);
|
|
53
|
+
if (!isObject(operation)) {
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
const operationSegments = [...segments, ...entry.segments, "parameters"];
|
|
57
|
+
const own = locatedParameters(document, operation.parameters, operationSegments);
|
|
58
|
+
return querystringPointers(mergedParameters(shared, own));
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
function pathItemsPointers(document, pathItems, root) {
|
|
62
|
+
if (!isObject(pathItems)) {
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
return Object.entries(pathItems).flatMap(
|
|
66
|
+
([key, pathItem]) => isObject(pathItem) ? pathItemPointers(document, pathItem, [...root, key]) : []
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
function findUnsupportedFeatures(document) {
|
|
70
|
+
if (!isObject(document)) {
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
const components = isObject(document.components) ? document.components : {};
|
|
74
|
+
const pointers = [
|
|
75
|
+
...pathItemsPointers(document, document.paths, ["paths"]),
|
|
76
|
+
...pathItemsPointers(document, document.webhooks, ["webhooks"]),
|
|
77
|
+
...pathItemsPointers(document, components.pathItems, ["components", "pathItems"])
|
|
78
|
+
];
|
|
79
|
+
return [...new Set(pointers)].map((pointer) => ({
|
|
80
|
+
feature: UnsupportedFeature.QUERYSTRING_NEXT_TO_QUERY,
|
|
81
|
+
pointer
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
exports.UnsupportedFeature = UnsupportedFeature;
|
|
86
|
+
exports.findUnsupportedFeatures = findUnsupportedFeatures;
|
|
87
|
+
//# sourceMappingURL=unsupported-features.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unsupported-features.cjs","sources":["../../../src/domain/openapi/unsupported-features.ts"],"sourcesContent":["import { createRef, parseRefPointer } from \"./json-pointer.js\";\nimport { QUERYSTRING_LOCATION } from \"./parameter-object.js\";\nimport { type PathItemObject, pathItemOperations } from \"./path-item-object.js\";\n\n/**\n * OpenAPI 3.2 uses that the generated types leave out, so each one gets a warning. The 3.2\n * features are typed (ADR-020); what is left is an `in: querystring` parameter next to\n * `in: query` parameters of the same operation, which 3.2 does not allow: the `query`\n * parameters keep their types and the `querystring` parameter is not in the output.\n */\nexport const UnsupportedFeature = {\n QUERYSTRING_NEXT_TO_QUERY: \"querystring\",\n} as const;\nexport type UnsupportedFeature = (typeof UnsupportedFeature)[keyof typeof UnsupportedFeature];\n\n/** One place in the document that uses a feature the output leaves out. */\nexport interface UnsupportedFeatureUse {\n readonly feature: UnsupportedFeature;\n /** A JSON Pointer to the object that has the feature's key, such as `#/paths/~1items`. */\n readonly pointer: string;\n}\n\nconst QUERY_LOCATION = \"query\";\nconst LOCAL_REF_PREFIX = \"#/\";\n\ntype JsonObject = Readonly<Record<string, unknown>>;\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** The value at a local `$ref` (`#/...`) of the document; null for other or broken `$ref`s. */\nfunction resolveLocal(document: JsonObject, value: unknown): unknown {\n if (!isObject(value) || typeof value.$ref !== \"string\") {\n return value;\n }\n if (!value.$ref.startsWith(LOCAL_REF_PREFIX)) {\n return null;\n }\n let node: unknown = document;\n for (const segment of parseRefPointer(value.$ref)) {\n node = isObject(node) || Array.isArray(node) ? (node as JsonObject)[segment] : undefined;\n }\n return node ?? null;\n}\n\n/** A parameter where it is written, with the object its `$ref` points to. */\ninterface LocatedParameter {\n readonly pointer: string;\n readonly parameter: JsonObject;\n}\n\nfunction locatedParameters(\n document: JsonObject,\n parameters: unknown,\n segments: readonly string[],\n): LocatedParameter[] {\n if (!Array.isArray(parameters)) {\n return [];\n }\n return parameters.flatMap((entry, index) => {\n const parameter = resolveLocal(document, entry);\n const pointer = createRef([...segments, String(index)]);\n return isObject(parameter) ? [{ pointer, parameter }] : [];\n });\n}\n\n/** Path item parameters, then the operation's, which replace those of the same `in` and name. */\nfunction mergedParameters(\n shared: readonly LocatedParameter[],\n own: readonly LocatedParameter[],\n): LocatedParameter[] {\n const byKey = new Map<string, LocatedParameter>();\n for (const located of [...shared, ...own]) {\n byKey.set(`${String(located.parameter.in)}-${String(located.parameter.name)}`, located);\n }\n return [...byKey.values()];\n}\n\n/** The `querystring` parameters of one operation that has `in: query` parameters as well. */\nfunction querystringPointers(parameters: readonly LocatedParameter[]): string[] {\n const hasQuery = parameters.some(({ parameter }) => parameter.in === QUERY_LOCATION);\n return hasQuery\n ? parameters\n .filter(({ parameter }) => parameter.in === QUERYSTRING_LOCATION)\n .map(({ pointer }) => pointer)\n : [];\n}\n\n/** Pointers of `querystring` parameters next to `query` ones in the operations of a path item. */\nfunction pathItemPointers(\n document: JsonObject,\n pathItem: JsonObject,\n segments: readonly string[],\n): string[] {\n const shared = locatedParameters(document, pathItem.parameters, [...segments, \"parameters\"]);\n return pathItemOperations(pathItem as PathItemObject).flatMap((entry) => {\n const operation = resolveLocal(document, entry.operation);\n if (!isObject(operation)) {\n return [];\n }\n const operationSegments = [...segments, ...entry.segments, \"parameters\"];\n const own = locatedParameters(document, operation.parameters, operationSegments);\n return querystringPointers(mergedParameters(shared, own));\n });\n}\n\nfunction pathItemsPointers(\n document: JsonObject,\n pathItems: unknown,\n root: readonly string[],\n): string[] {\n if (!isObject(pathItems)) {\n return [];\n }\n return Object.entries(pathItems).flatMap(([key, pathItem]) =>\n isObject(pathItem) ? pathItemPointers(document, pathItem, [...root, key]) : [],\n );\n}\n\n/**\n * Every use of a feature in `UnsupportedFeature`, once per pointer, in document order: `paths`,\n * then `webhooks`, then `components.pathItems`.\n */\nexport function findUnsupportedFeatures(document: unknown): UnsupportedFeatureUse[] {\n if (!isObject(document)) {\n return [];\n }\n const components = isObject(document.components) ? document.components : {};\n const pointers = [\n ...pathItemsPointers(document, document.paths, [\"paths\"]),\n ...pathItemsPointers(document, document.webhooks, [\"webhooks\"]),\n ...pathItemsPointers(document, components.pathItems, [\"components\", \"pathItems\"]),\n ];\n return [...new Set(pointers)].map((pointer) => ({\n feature: UnsupportedFeature.QUERYSTRING_NEXT_TO_QUERY,\n pointer,\n }));\n}\n"],"names":["parseRefPointer","createRef","QUERYSTRING_LOCATION","pathItemOperations"],"mappings":";;;;;;AAUO,MAAM,kBAAA,GAAqB;AAAA,EAChC,yBAAA,EAA2B;AAC7B;AAUA,MAAM,cAAA,GAAiB,OAAA;AACvB,MAAM,gBAAA,GAAmB,IAAA;AAIzB,SAAS,SAAS,KAAA,EAAqC;AACrD,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAGA,SAAS,YAAA,CAAa,UAAsB,KAAA,EAAyB;AACnE,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,KAAK,OAAO,KAAA,CAAM,SAAS,QAAA,EAAU;AACtD,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,gBAAgB,CAAA,EAAG;AAC5C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,GAAgB,QAAA;AACpB,EAAA,KAAA,MAAW,OAAA,IAAWA,2BAAA,CAAgB,KAAA,CAAM,IAAI,CAAA,EAAG;AACjD,IAAA,IAAA,GAAO,QAAA,CAAS,IAAI,CAAA,IAAK,KAAA,CAAM,QAAQ,IAAI,CAAA,GAAK,IAAA,CAAoB,OAAO,CAAA,GAAI,MAAA;AAAA,EACjF;AACA,EAAA,OAAO,IAAA,IAAQ,IAAA;AACjB;AAQA,SAAS,iBAAA,CACP,QAAA,EACA,UAAA,EACA,QAAA,EACoB;AACpB,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC9B,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,OAAO,UAAA,CAAW,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AAC1C,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,KAAK,CAAA;AAC9C,IAAA,MAAM,OAAA,GAAUC,sBAAU,CAAC,GAAG,UAAU,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AACtD,IAAA,OAAO,QAAA,CAAS,SAAS,CAAA,GAAI,CAAC,EAAE,OAAA,EAAS,SAAA,EAAW,CAAA,GAAI,EAAC;AAAA,EAC3D,CAAC,CAAA;AACH;AAGA,SAAS,gBAAA,CACP,QACA,GAAA,EACoB;AACpB,EAAA,MAAM,KAAA,uBAAY,GAAA,EAA8B;AAChD,EAAA,KAAA,MAAW,WAAW,CAAC,GAAG,MAAA,EAAQ,GAAG,GAAG,CAAA,EAAG;AACzC,IAAA,KAAA,CAAM,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,OAAA,CAAQ,UAAU,EAAE,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,OAAA,CAAQ,SAAA,CAAU,IAAI,CAAC,IAAI,OAAO,CAAA;AAAA,EACxF;AACA,EAAA,OAAO,CAAC,GAAG,KAAA,CAAM,MAAA,EAAQ,CAAA;AAC3B;AAGA,SAAS,oBAAoB,UAAA,EAAmD;AAC9E,EAAA,MAAM,QAAA,GAAW,WAAW,IAAA,CAAK,CAAC,EAAE,SAAA,EAAU,KAAM,SAAA,CAAU,EAAA,KAAO,cAAc,CAAA;AACnF,EAAA,OAAO,WACH,UAAA,CACG,MAAA,CAAO,CAAC,EAAE,SAAA,OAAgB,SAAA,CAAU,EAAA,KAAOC,oCAAoB,CAAA,CAC/D,IAAI,CAAC,EAAE,SAAQ,KAAM,OAAO,IAC/B,EAAC;AACP;AAGA,SAAS,gBAAA,CACP,QAAA,EACA,QAAA,EACA,QAAA,EACU;AACV,EAAA,MAAM,MAAA,GAAS,kBAAkB,QAAA,EAAU,QAAA,CAAS,YAAY,CAAC,GAAG,QAAA,EAAU,YAAY,CAAC,CAAA;AAC3F,EAAA,OAAOC,iCAAA,CAAmB,QAA0B,CAAA,CAAE,OAAA,CAAQ,CAAC,KAAA,KAAU;AACvE,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,QAAA,EAAU,KAAA,CAAM,SAAS,CAAA;AACxD,IAAA,IAAI,CAAC,QAAA,CAAS,SAAS,CAAA,EAAG;AACxB,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,MAAM,oBAAoB,CAAC,GAAG,UAAU,GAAG,KAAA,CAAM,UAAU,YAAY,CAAA;AACvE,IAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,QAAA,EAAU,SAAA,CAAU,YAAY,iBAAiB,CAAA;AAC/E,IAAA,OAAO,mBAAA,CAAoB,gBAAA,CAAiB,MAAA,EAAQ,GAAG,CAAC,CAAA;AAAA,EAC1D,CAAC,CAAA;AACH;AAEA,SAAS,iBAAA,CACP,QAAA,EACA,SAAA,EACA,IAAA,EACU;AACV,EAAA,IAAI,CAAC,QAAA,CAAS,SAAS,CAAA,EAAG;AACxB,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,CAAE,OAAA;AAAA,IAAQ,CAAC,CAAC,GAAA,EAAK,QAAQ,CAAA,KACtD,SAAS,QAAQ,CAAA,GAAI,gBAAA,CAAiB,QAAA,EAAU,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,IAAI;AAAC,GAC/E;AACF;AAMO,SAAS,wBAAwB,QAAA,EAA4C;AAClF,EAAA,IAAI,CAAC,QAAA,CAAS,QAAQ,CAAA,EAAG;AACvB,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,MAAM,aAAa,QAAA,CAAS,QAAA,CAAS,UAAU,CAAA,GAAI,QAAA,CAAS,aAAa,EAAC;AAC1E,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,GAAG,iBAAA,CAAkB,QAAA,EAAU,SAAS,KAAA,EAAO,CAAC,OAAO,CAAC,CAAA;AAAA,IACxD,GAAG,iBAAA,CAAkB,QAAA,EAAU,SAAS,QAAA,EAAU,CAAC,UAAU,CAAC,CAAA;AAAA,IAC9D,GAAG,kBAAkB,QAAA,EAAU,UAAA,CAAW,WAAW,CAAC,YAAA,EAAc,WAAW,CAAC;AAAA,GAClF;AACA,EAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,QAAQ,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,IAC9C,SAAS,kBAAA,CAAmB,yBAAA;AAAA,IAC5B;AAAA,GACF,CAAE,CAAA;AACJ;;;"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { createRef, parseRefPointer } from './json-pointer.mjs';
|
|
2
|
+
import { QUERYSTRING_LOCATION } from './parameter-object.mjs';
|
|
3
|
+
import { pathItemOperations } from './path-item-object.mjs';
|
|
4
|
+
|
|
5
|
+
const UnsupportedFeature = {
|
|
6
|
+
QUERYSTRING_NEXT_TO_QUERY: "querystring"
|
|
7
|
+
};
|
|
8
|
+
const QUERY_LOCATION = "query";
|
|
9
|
+
const LOCAL_REF_PREFIX = "#/";
|
|
10
|
+
function isObject(value) {
|
|
11
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
12
|
+
}
|
|
13
|
+
function resolveLocal(document, value) {
|
|
14
|
+
if (!isObject(value) || typeof value.$ref !== "string") {
|
|
15
|
+
return value;
|
|
16
|
+
}
|
|
17
|
+
if (!value.$ref.startsWith(LOCAL_REF_PREFIX)) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
let node = document;
|
|
21
|
+
for (const segment of parseRefPointer(value.$ref)) {
|
|
22
|
+
node = isObject(node) || Array.isArray(node) ? node[segment] : void 0;
|
|
23
|
+
}
|
|
24
|
+
return node ?? null;
|
|
25
|
+
}
|
|
26
|
+
function locatedParameters(document, parameters, segments) {
|
|
27
|
+
if (!Array.isArray(parameters)) {
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
return parameters.flatMap((entry, index) => {
|
|
31
|
+
const parameter = resolveLocal(document, entry);
|
|
32
|
+
const pointer = createRef([...segments, String(index)]);
|
|
33
|
+
return isObject(parameter) ? [{ pointer, parameter }] : [];
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
function mergedParameters(shared, own) {
|
|
37
|
+
const byKey = /* @__PURE__ */ new Map();
|
|
38
|
+
for (const located of [...shared, ...own]) {
|
|
39
|
+
byKey.set(`${String(located.parameter.in)}-${String(located.parameter.name)}`, located);
|
|
40
|
+
}
|
|
41
|
+
return [...byKey.values()];
|
|
42
|
+
}
|
|
43
|
+
function querystringPointers(parameters) {
|
|
44
|
+
const hasQuery = parameters.some(({ parameter }) => parameter.in === QUERY_LOCATION);
|
|
45
|
+
return hasQuery ? parameters.filter(({ parameter }) => parameter.in === QUERYSTRING_LOCATION).map(({ pointer }) => pointer) : [];
|
|
46
|
+
}
|
|
47
|
+
function pathItemPointers(document, pathItem, segments) {
|
|
48
|
+
const shared = locatedParameters(document, pathItem.parameters, [...segments, "parameters"]);
|
|
49
|
+
return pathItemOperations(pathItem).flatMap((entry) => {
|
|
50
|
+
const operation = resolveLocal(document, entry.operation);
|
|
51
|
+
if (!isObject(operation)) {
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
const operationSegments = [...segments, ...entry.segments, "parameters"];
|
|
55
|
+
const own = locatedParameters(document, operation.parameters, operationSegments);
|
|
56
|
+
return querystringPointers(mergedParameters(shared, own));
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
function pathItemsPointers(document, pathItems, root) {
|
|
60
|
+
if (!isObject(pathItems)) {
|
|
61
|
+
return [];
|
|
62
|
+
}
|
|
63
|
+
return Object.entries(pathItems).flatMap(
|
|
64
|
+
([key, pathItem]) => isObject(pathItem) ? pathItemPointers(document, pathItem, [...root, key]) : []
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
function findUnsupportedFeatures(document) {
|
|
68
|
+
if (!isObject(document)) {
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
const components = isObject(document.components) ? document.components : {};
|
|
72
|
+
const pointers = [
|
|
73
|
+
...pathItemsPointers(document, document.paths, ["paths"]),
|
|
74
|
+
...pathItemsPointers(document, document.webhooks, ["webhooks"]),
|
|
75
|
+
...pathItemsPointers(document, components.pathItems, ["components", "pathItems"])
|
|
76
|
+
];
|
|
77
|
+
return [...new Set(pointers)].map((pointer) => ({
|
|
78
|
+
feature: UnsupportedFeature.QUERYSTRING_NEXT_TO_QUERY,
|
|
79
|
+
pointer
|
|
80
|
+
}));
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export { UnsupportedFeature, findUnsupportedFeatures };
|
|
84
|
+
//# sourceMappingURL=unsupported-features.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unsupported-features.mjs","sources":["../../../src/domain/openapi/unsupported-features.ts"],"sourcesContent":["import { createRef, parseRefPointer } from \"./json-pointer.js\";\nimport { QUERYSTRING_LOCATION } from \"./parameter-object.js\";\nimport { type PathItemObject, pathItemOperations } from \"./path-item-object.js\";\n\n/**\n * OpenAPI 3.2 uses that the generated types leave out, so each one gets a warning. The 3.2\n * features are typed (ADR-020); what is left is an `in: querystring` parameter next to\n * `in: query` parameters of the same operation, which 3.2 does not allow: the `query`\n * parameters keep their types and the `querystring` parameter is not in the output.\n */\nexport const UnsupportedFeature = {\n QUERYSTRING_NEXT_TO_QUERY: \"querystring\",\n} as const;\nexport type UnsupportedFeature = (typeof UnsupportedFeature)[keyof typeof UnsupportedFeature];\n\n/** One place in the document that uses a feature the output leaves out. */\nexport interface UnsupportedFeatureUse {\n readonly feature: UnsupportedFeature;\n /** A JSON Pointer to the object that has the feature's key, such as `#/paths/~1items`. */\n readonly pointer: string;\n}\n\nconst QUERY_LOCATION = \"query\";\nconst LOCAL_REF_PREFIX = \"#/\";\n\ntype JsonObject = Readonly<Record<string, unknown>>;\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** The value at a local `$ref` (`#/...`) of the document; null for other or broken `$ref`s. */\nfunction resolveLocal(document: JsonObject, value: unknown): unknown {\n if (!isObject(value) || typeof value.$ref !== \"string\") {\n return value;\n }\n if (!value.$ref.startsWith(LOCAL_REF_PREFIX)) {\n return null;\n }\n let node: unknown = document;\n for (const segment of parseRefPointer(value.$ref)) {\n node = isObject(node) || Array.isArray(node) ? (node as JsonObject)[segment] : undefined;\n }\n return node ?? null;\n}\n\n/** A parameter where it is written, with the object its `$ref` points to. */\ninterface LocatedParameter {\n readonly pointer: string;\n readonly parameter: JsonObject;\n}\n\nfunction locatedParameters(\n document: JsonObject,\n parameters: unknown,\n segments: readonly string[],\n): LocatedParameter[] {\n if (!Array.isArray(parameters)) {\n return [];\n }\n return parameters.flatMap((entry, index) => {\n const parameter = resolveLocal(document, entry);\n const pointer = createRef([...segments, String(index)]);\n return isObject(parameter) ? [{ pointer, parameter }] : [];\n });\n}\n\n/** Path item parameters, then the operation's, which replace those of the same `in` and name. */\nfunction mergedParameters(\n shared: readonly LocatedParameter[],\n own: readonly LocatedParameter[],\n): LocatedParameter[] {\n const byKey = new Map<string, LocatedParameter>();\n for (const located of [...shared, ...own]) {\n byKey.set(`${String(located.parameter.in)}-${String(located.parameter.name)}`, located);\n }\n return [...byKey.values()];\n}\n\n/** The `querystring` parameters of one operation that has `in: query` parameters as well. */\nfunction querystringPointers(parameters: readonly LocatedParameter[]): string[] {\n const hasQuery = parameters.some(({ parameter }) => parameter.in === QUERY_LOCATION);\n return hasQuery\n ? parameters\n .filter(({ parameter }) => parameter.in === QUERYSTRING_LOCATION)\n .map(({ pointer }) => pointer)\n : [];\n}\n\n/** Pointers of `querystring` parameters next to `query` ones in the operations of a path item. */\nfunction pathItemPointers(\n document: JsonObject,\n pathItem: JsonObject,\n segments: readonly string[],\n): string[] {\n const shared = locatedParameters(document, pathItem.parameters, [...segments, \"parameters\"]);\n return pathItemOperations(pathItem as PathItemObject).flatMap((entry) => {\n const operation = resolveLocal(document, entry.operation);\n if (!isObject(operation)) {\n return [];\n }\n const operationSegments = [...segments, ...entry.segments, \"parameters\"];\n const own = locatedParameters(document, operation.parameters, operationSegments);\n return querystringPointers(mergedParameters(shared, own));\n });\n}\n\nfunction pathItemsPointers(\n document: JsonObject,\n pathItems: unknown,\n root: readonly string[],\n): string[] {\n if (!isObject(pathItems)) {\n return [];\n }\n return Object.entries(pathItems).flatMap(([key, pathItem]) =>\n isObject(pathItem) ? pathItemPointers(document, pathItem, [...root, key]) : [],\n );\n}\n\n/**\n * Every use of a feature in `UnsupportedFeature`, once per pointer, in document order: `paths`,\n * then `webhooks`, then `components.pathItems`.\n */\nexport function findUnsupportedFeatures(document: unknown): UnsupportedFeatureUse[] {\n if (!isObject(document)) {\n return [];\n }\n const components = isObject(document.components) ? document.components : {};\n const pointers = [\n ...pathItemsPointers(document, document.paths, [\"paths\"]),\n ...pathItemsPointers(document, document.webhooks, [\"webhooks\"]),\n ...pathItemsPointers(document, components.pathItems, [\"components\", \"pathItems\"]),\n ];\n return [...new Set(pointers)].map((pointer) => ({\n feature: UnsupportedFeature.QUERYSTRING_NEXT_TO_QUERY,\n pointer,\n }));\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const errors = require('./errors.cjs');
|
|
4
|
+
|
|
5
|
+
const OutputFix = {
|
|
6
|
+
/** An `allOf` `$ref` to a discriminated union is the union, without `Omit` or a schema name. */
|
|
7
|
+
ALLOF_DISCRIMINATED_UNION: "allof-discriminated-union",
|
|
8
|
+
/** An `allOf` member with only `required` makes those properties of the others required. */
|
|
9
|
+
ALLOF_REQUIRED: "allof-required",
|
|
10
|
+
/** The JSDoc of a schema lists the descriptions of its `anyOf` and `oneOf` members. */
|
|
11
|
+
ANYOF_ONEOF_DESCRIPTIONS: "anyof-oneof-descriptions",
|
|
12
|
+
/** `anyOf` / `oneOf` variants with only `required` make those keys of the parent required. */
|
|
13
|
+
ANYOF_ONEOF_REQUIRED: "anyof-oneof-required",
|
|
14
|
+
/** `anyOf` next to object keywords or `allOf` is intersected with them, not added to a union. */
|
|
15
|
+
ANYOF_PROPERTIES: "anyof-properties",
|
|
16
|
+
/** `--array-length` tuples have `min` to `max` items, nest right and follow `--immutable`. */
|
|
17
|
+
ARRAY_LENGTH_TUPLES: "array-length-tuples",
|
|
18
|
+
/** `--dedupe-enums` names a shared enum by all of its schemas, not by the first one. */
|
|
19
|
+
DEDUPE_ENUM_NAMES: "dedupe-enum-names",
|
|
20
|
+
/** `required` next to an `allOf` `$ref` to a discriminator member still gives `WithRequired`. */
|
|
21
|
+
DISCRIMINATOR_MEMBER_REQUIRED: "discriminator-member-required",
|
|
22
|
+
/**
|
|
23
|
+
* The value a discriminator member gets: one enum of every discriminator's values, a mapping
|
|
24
|
+
* before the schema name, a schema's own mapping before an inherited one, none where the member
|
|
25
|
+
* declares it, and with `--enum` a member of the owner's enum.
|
|
26
|
+
*/
|
|
27
|
+
DISCRIMINATOR_VALUES: "discriminator-values",
|
|
28
|
+
/** An exploded object query parameter's properties are keys of `query`, as they are sent. */
|
|
29
|
+
EXPLODED_QUERY_OBJECTS: "exploded-query-objects",
|
|
30
|
+
/** `--enum` declares an enum that lists `null` without it, and the type adds `| null`. */
|
|
31
|
+
NULLABLE_ENUMS: "nullable-enums",
|
|
32
|
+
/** `--path-params-as-types` gives each `{name}` its placeholder, `{number}` included. */
|
|
33
|
+
PATH_PARAM_TYPE_NAMES: "path-param-type-names",
|
|
34
|
+
/** A `prefixItems` tuple is open unless `items` or `unevaluatedItems` closes it (2020-12). */
|
|
35
|
+
PREFIX_ITEMS: "prefix-items",
|
|
36
|
+
/** `readOnly` and `writeOnly` of the schema a `$ref` names, or of `allOf` members, count. */
|
|
37
|
+
READ_WRITE_REFS: "read-write-refs",
|
|
38
|
+
/**
|
|
39
|
+
* A `$ref` into schema keywords (`content/<type>/schema`, `items`, `allOf/0`) gets the type it
|
|
40
|
+
* points at, also where the original type compiles through an index signature.
|
|
41
|
+
*/
|
|
42
|
+
REF_POINTERS: "ref-pointers",
|
|
43
|
+
/** Schemas of one root type name without the prefix each get an alias, the earlier numbered. */
|
|
44
|
+
ROOT_TYPE_NUMBERING: "root-type-numbering",
|
|
45
|
+
/** `unevaluatedProperties` types the keys no other keyword declares (an index signature). */
|
|
46
|
+
UNEVALUATED_PROPERTIES: "unevaluated-properties"
|
|
47
|
+
};
|
|
48
|
+
const OUTPUT_FIXES = Object.values(OutputFix);
|
|
49
|
+
const ALL_OUTPUT_FIXES = "all";
|
|
50
|
+
const KNOWN_NAMES = /* @__PURE__ */ new Set([...OUTPUT_FIXES, ALL_OUTPUT_FIXES]);
|
|
51
|
+
function isOutputFixName(value) {
|
|
52
|
+
return typeof value === "string" && KNOWN_NAMES.has(value);
|
|
53
|
+
}
|
|
54
|
+
function outputFixNamesOf(values) {
|
|
55
|
+
const unknown = values.filter((value) => !isOutputFixName(value));
|
|
56
|
+
if (unknown.length > 0) {
|
|
57
|
+
const names = unknown.map((value) => JSON.stringify(value)).join(", ");
|
|
58
|
+
const known = [...KNOWN_NAMES].join(", ");
|
|
59
|
+
throw new errors.OpenAPITypesafeError({
|
|
60
|
+
code: errors.ERROR_CODES.OPTION_FIX_UNKNOWN,
|
|
61
|
+
message: `Unknown fix ${names}. Known fixes: ${known}.`,
|
|
62
|
+
details: { unknown, known: [...KNOWN_NAMES] }
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return values;
|
|
66
|
+
}
|
|
67
|
+
function resolveOutputFixes(names) {
|
|
68
|
+
return new Set(names.flatMap((name) => name === ALL_OUTPUT_FIXES ? OUTPUT_FIXES : [name]));
|
|
69
|
+
}
|
|
70
|
+
const ROOT_TYPES = { option: "rootTypes", flag: "--root-types" };
|
|
71
|
+
const ENUM = { option: "enum", flag: "--enum" };
|
|
72
|
+
const NO_SCHEMA_PREFIX = {
|
|
73
|
+
option: "rootTypesNoSchemaPrefix",
|
|
74
|
+
flag: "--root-types-no-schema-prefix"
|
|
75
|
+
};
|
|
76
|
+
const REQUIREMENTS = {
|
|
77
|
+
[OutputFix.ARRAY_LENGTH_TUPLES]: [{ option: "arrayLength", flag: "--array-length" }],
|
|
78
|
+
[OutputFix.DEDUPE_ENUM_NAMES]: [ENUM, { option: "dedupeEnums", flag: "--dedupe-enums" }],
|
|
79
|
+
[OutputFix.NULLABLE_ENUMS]: [ENUM],
|
|
80
|
+
[OutputFix.PATH_PARAM_TYPE_NAMES]: [
|
|
81
|
+
{ option: "pathParamsAsTypes", flag: "--path-params-as-types" }
|
|
82
|
+
],
|
|
83
|
+
[OutputFix.ROOT_TYPE_NUMBERING]: [ROOT_TYPES, NO_SCHEMA_PREFIX]
|
|
84
|
+
};
|
|
85
|
+
function describeRequirement(requirement) {
|
|
86
|
+
return `${requirement.option} (${requirement.flag})`;
|
|
87
|
+
}
|
|
88
|
+
function ineffectiveFixNotices(names, isOptionOn) {
|
|
89
|
+
return [...new Set(names)].flatMap((name) => {
|
|
90
|
+
const missing = (REQUIREMENTS[name] ?? []).filter(({ option }) => !isOptionOn(option));
|
|
91
|
+
return missing.length === 0 ? [] : [`Fix "${name}" has no effect without ${missing.map(describeRequirement).join(" and ")}`];
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
exports.ALL_OUTPUT_FIXES = ALL_OUTPUT_FIXES;
|
|
96
|
+
exports.OUTPUT_FIXES = OUTPUT_FIXES;
|
|
97
|
+
exports.OutputFix = OutputFix;
|
|
98
|
+
exports.ineffectiveFixNotices = ineffectiveFixNotices;
|
|
99
|
+
exports.outputFixNamesOf = outputFixNamesOf;
|
|
100
|
+
exports.resolveOutputFixes = resolveOutputFixes;
|
|
101
|
+
//# sourceMappingURL=output-fixes.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-fixes.cjs","sources":["../../src/domain/output-fixes.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"./errors.js\";\n\n/**\n * Opt-in fixes of the output of valid schemas (ADR-021). Each one changes only the cases it names;\n * without any, the output is the same as openapi-typescript 7.13 gives. In 2.0 they become the\n * default.\n */\nexport const OutputFix = {\n /** An `allOf` `$ref` to a discriminated union is the union, without `Omit` or a schema name. */\n ALLOF_DISCRIMINATED_UNION: \"allof-discriminated-union\",\n /** An `allOf` member with only `required` makes those properties of the others required. */\n ALLOF_REQUIRED: \"allof-required\",\n /** The JSDoc of a schema lists the descriptions of its `anyOf` and `oneOf` members. */\n ANYOF_ONEOF_DESCRIPTIONS: \"anyof-oneof-descriptions\",\n /** `anyOf` / `oneOf` variants with only `required` make those keys of the parent required. */\n ANYOF_ONEOF_REQUIRED: \"anyof-oneof-required\",\n /** `anyOf` next to object keywords or `allOf` is intersected with them, not added to a union. */\n ANYOF_PROPERTIES: \"anyof-properties\",\n /** `--array-length` tuples have `min` to `max` items, nest right and follow `--immutable`. */\n ARRAY_LENGTH_TUPLES: \"array-length-tuples\",\n /** `--dedupe-enums` names a shared enum by all of its schemas, not by the first one. */\n DEDUPE_ENUM_NAMES: \"dedupe-enum-names\",\n /** `required` next to an `allOf` `$ref` to a discriminator member still gives `WithRequired`. */\n DISCRIMINATOR_MEMBER_REQUIRED: \"discriminator-member-required\",\n /**\n * The value a discriminator member gets: one enum of every discriminator's values, a mapping\n * before the schema name, a schema's own mapping before an inherited one, none where the member\n * declares it, and with `--enum` a member of the owner's enum.\n */\n DISCRIMINATOR_VALUES: \"discriminator-values\",\n /** An exploded object query parameter's properties are keys of `query`, as they are sent. */\n EXPLODED_QUERY_OBJECTS: \"exploded-query-objects\",\n /** `--enum` declares an enum that lists `null` without it, and the type adds `| null`. */\n NULLABLE_ENUMS: \"nullable-enums\",\n /** `--path-params-as-types` gives each `{name}` its placeholder, `{number}` included. */\n PATH_PARAM_TYPE_NAMES: \"path-param-type-names\",\n /** A `prefixItems` tuple is open unless `items` or `unevaluatedItems` closes it (2020-12). */\n PREFIX_ITEMS: \"prefix-items\",\n /** `readOnly` and `writeOnly` of the schema a `$ref` names, or of `allOf` members, count. */\n READ_WRITE_REFS: \"read-write-refs\",\n /**\n * A `$ref` into schema keywords (`content/<type>/schema`, `items`, `allOf/0`) gets the type it\n * points at, also where the original type compiles through an index signature.\n */\n REF_POINTERS: \"ref-pointers\",\n /** Schemas of one root type name without the prefix each get an alias, the earlier numbered. */\n ROOT_TYPE_NUMBERING: \"root-type-numbering\",\n /** `unevaluatedProperties` types the keys no other keyword declares (an index signature). */\n UNEVALUATED_PROPERTIES: \"unevaluated-properties\",\n} as const;\nexport type OutputFix = (typeof OutputFix)[keyof typeof OutputFix];\n\n/** Every fix of this version, in the order the docs list them. */\nexport const OUTPUT_FIXES: readonly OutputFix[] = Object.values(OutputFix);\n\n/** The name that turns on every fix of the installed version. */\nexport const ALL_OUTPUT_FIXES = \"all\";\n\n/** A name the `fix` option accepts: one fix, or `all`. */\nexport type OutputFixName = OutputFix | typeof ALL_OUTPUT_FIXES;\n\nconst KNOWN_NAMES: ReadonlySet<string> = new Set<string>([...OUTPUT_FIXES, ALL_OUTPUT_FIXES]);\n\nfunction isOutputFixName(value: unknown): value is OutputFixName {\n return typeof value === \"string\" && KNOWN_NAMES.has(value);\n}\n\n/** The fix names as given; fails with `OPTION_FIX_UNKNOWN` for any other value. */\nexport function outputFixNamesOf(values: readonly unknown[]): readonly OutputFixName[] {\n const unknown = values.filter((value) => !isOutputFixName(value));\n if (unknown.length > 0) {\n const names = unknown.map((value) => JSON.stringify(value)).join(\", \");\n const known = [...KNOWN_NAMES].join(\", \");\n throw new OpenAPITypesafeError({\n code: ERROR_CODES.OPTION_FIX_UNKNOWN,\n message: `Unknown fix ${names}. Known fixes: ${known}.`,\n details: { unknown, known: [...KNOWN_NAMES] },\n });\n }\n return values as readonly OutputFixName[];\n}\n\n/** The fixes the names turn on; `all` stands for every fix of this version. */\nexport function resolveOutputFixes(names: readonly OutputFixName[]): ReadonlySet<OutputFix> {\n return new Set(names.flatMap((name) => (name === ALL_OUTPUT_FIXES ? OUTPUT_FIXES : [name])));\n}\n\n/** A generator option that a fix works with; without it, the fix changes nothing (ADR-021). */\nexport interface OutputFixRequirement {\n readonly option:\n | \"arrayLength\"\n | \"dedupeEnums\"\n | \"enum\"\n | \"pathParamsAsTypes\"\n | \"rootTypes\"\n | \"rootTypesNoSchemaPrefix\";\n readonly flag: string;\n}\n\nconst ROOT_TYPES = { option: \"rootTypes\", flag: \"--root-types\" } as const;\nconst ENUM = { option: \"enum\", flag: \"--enum\" } as const;\nconst NO_SCHEMA_PREFIX = {\n option: \"rootTypesNoSchemaPrefix\",\n flag: \"--root-types-no-schema-prefix\",\n} as const;\n\n/** The options each fix needs, by fix name; `all` has none. */\nconst REQUIREMENTS: Readonly<Partial<Record<OutputFixName, readonly OutputFixRequirement[]>>> = {\n [OutputFix.ARRAY_LENGTH_TUPLES]: [{ option: \"arrayLength\", flag: \"--array-length\" }],\n [OutputFix.DEDUPE_ENUM_NAMES]: [ENUM, { option: \"dedupeEnums\", flag: \"--dedupe-enums\" }],\n [OutputFix.NULLABLE_ENUMS]: [ENUM],\n [OutputFix.PATH_PARAM_TYPE_NAMES]: [\n { option: \"pathParamsAsTypes\", flag: \"--path-params-as-types\" },\n ],\n [OutputFix.ROOT_TYPE_NUMBERING]: [ROOT_TYPES, NO_SCHEMA_PREFIX],\n};\n\nfunction describeRequirement(requirement: OutputFixRequirement): string {\n return `${requirement.option} (${requirement.flag})`;\n}\n\n/**\n * A notice for each fix given by name with an option it needs off; it names the options that are\n * off. `all` adds none: it means every fix that applies, so one that does not apply is expected.\n */\nexport function ineffectiveFixNotices(\n names: readonly OutputFixName[],\n isOptionOn: (option: OutputFixRequirement[\"option\"]) => boolean,\n): string[] {\n return [...new Set(names)].flatMap((name) => {\n const missing = (REQUIREMENTS[name] ?? []).filter(({ option }) => !isOptionOn(option));\n return missing.length === 0\n ? []\n : [`Fix \"${name}\" has no effect without ${missing.map(describeRequirement).join(\" and \")}`];\n });\n}\n"],"names":["OpenAPITypesafeError","ERROR_CODES"],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { OpenAPITypesafeError, ERROR_CODES } from './errors.mjs';
|
|
2
|
+
|
|
3
|
+
const OutputFix = {
|
|
4
|
+
/** An `allOf` `$ref` to a discriminated union is the union, without `Omit` or a schema name. */
|
|
5
|
+
ALLOF_DISCRIMINATED_UNION: "allof-discriminated-union",
|
|
6
|
+
/** An `allOf` member with only `required` makes those properties of the others required. */
|
|
7
|
+
ALLOF_REQUIRED: "allof-required",
|
|
8
|
+
/** The JSDoc of a schema lists the descriptions of its `anyOf` and `oneOf` members. */
|
|
9
|
+
ANYOF_ONEOF_DESCRIPTIONS: "anyof-oneof-descriptions",
|
|
10
|
+
/** `anyOf` / `oneOf` variants with only `required` make those keys of the parent required. */
|
|
11
|
+
ANYOF_ONEOF_REQUIRED: "anyof-oneof-required",
|
|
12
|
+
/** `anyOf` next to object keywords or `allOf` is intersected with them, not added to a union. */
|
|
13
|
+
ANYOF_PROPERTIES: "anyof-properties",
|
|
14
|
+
/** `--array-length` tuples have `min` to `max` items, nest right and follow `--immutable`. */
|
|
15
|
+
ARRAY_LENGTH_TUPLES: "array-length-tuples",
|
|
16
|
+
/** `--dedupe-enums` names a shared enum by all of its schemas, not by the first one. */
|
|
17
|
+
DEDUPE_ENUM_NAMES: "dedupe-enum-names",
|
|
18
|
+
/** `required` next to an `allOf` `$ref` to a discriminator member still gives `WithRequired`. */
|
|
19
|
+
DISCRIMINATOR_MEMBER_REQUIRED: "discriminator-member-required",
|
|
20
|
+
/**
|
|
21
|
+
* The value a discriminator member gets: one enum of every discriminator's values, a mapping
|
|
22
|
+
* before the schema name, a schema's own mapping before an inherited one, none where the member
|
|
23
|
+
* declares it, and with `--enum` a member of the owner's enum.
|
|
24
|
+
*/
|
|
25
|
+
DISCRIMINATOR_VALUES: "discriminator-values",
|
|
26
|
+
/** An exploded object query parameter's properties are keys of `query`, as they are sent. */
|
|
27
|
+
EXPLODED_QUERY_OBJECTS: "exploded-query-objects",
|
|
28
|
+
/** `--enum` declares an enum that lists `null` without it, and the type adds `| null`. */
|
|
29
|
+
NULLABLE_ENUMS: "nullable-enums",
|
|
30
|
+
/** `--path-params-as-types` gives each `{name}` its placeholder, `{number}` included. */
|
|
31
|
+
PATH_PARAM_TYPE_NAMES: "path-param-type-names",
|
|
32
|
+
/** A `prefixItems` tuple is open unless `items` or `unevaluatedItems` closes it (2020-12). */
|
|
33
|
+
PREFIX_ITEMS: "prefix-items",
|
|
34
|
+
/** `readOnly` and `writeOnly` of the schema a `$ref` names, or of `allOf` members, count. */
|
|
35
|
+
READ_WRITE_REFS: "read-write-refs",
|
|
36
|
+
/**
|
|
37
|
+
* A `$ref` into schema keywords (`content/<type>/schema`, `items`, `allOf/0`) gets the type it
|
|
38
|
+
* points at, also where the original type compiles through an index signature.
|
|
39
|
+
*/
|
|
40
|
+
REF_POINTERS: "ref-pointers",
|
|
41
|
+
/** Schemas of one root type name without the prefix each get an alias, the earlier numbered. */
|
|
42
|
+
ROOT_TYPE_NUMBERING: "root-type-numbering",
|
|
43
|
+
/** `unevaluatedProperties` types the keys no other keyword declares (an index signature). */
|
|
44
|
+
UNEVALUATED_PROPERTIES: "unevaluated-properties"
|
|
45
|
+
};
|
|
46
|
+
const OUTPUT_FIXES = Object.values(OutputFix);
|
|
47
|
+
const ALL_OUTPUT_FIXES = "all";
|
|
48
|
+
const KNOWN_NAMES = /* @__PURE__ */ new Set([...OUTPUT_FIXES, ALL_OUTPUT_FIXES]);
|
|
49
|
+
function isOutputFixName(value) {
|
|
50
|
+
return typeof value === "string" && KNOWN_NAMES.has(value);
|
|
51
|
+
}
|
|
52
|
+
function outputFixNamesOf(values) {
|
|
53
|
+
const unknown = values.filter((value) => !isOutputFixName(value));
|
|
54
|
+
if (unknown.length > 0) {
|
|
55
|
+
const names = unknown.map((value) => JSON.stringify(value)).join(", ");
|
|
56
|
+
const known = [...KNOWN_NAMES].join(", ");
|
|
57
|
+
throw new OpenAPITypesafeError({
|
|
58
|
+
code: ERROR_CODES.OPTION_FIX_UNKNOWN,
|
|
59
|
+
message: `Unknown fix ${names}. Known fixes: ${known}.`,
|
|
60
|
+
details: { unknown, known: [...KNOWN_NAMES] }
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return values;
|
|
64
|
+
}
|
|
65
|
+
function resolveOutputFixes(names) {
|
|
66
|
+
return new Set(names.flatMap((name) => name === ALL_OUTPUT_FIXES ? OUTPUT_FIXES : [name]));
|
|
67
|
+
}
|
|
68
|
+
const ROOT_TYPES = { option: "rootTypes", flag: "--root-types" };
|
|
69
|
+
const ENUM = { option: "enum", flag: "--enum" };
|
|
70
|
+
const NO_SCHEMA_PREFIX = {
|
|
71
|
+
option: "rootTypesNoSchemaPrefix",
|
|
72
|
+
flag: "--root-types-no-schema-prefix"
|
|
73
|
+
};
|
|
74
|
+
const REQUIREMENTS = {
|
|
75
|
+
[OutputFix.ARRAY_LENGTH_TUPLES]: [{ option: "arrayLength", flag: "--array-length" }],
|
|
76
|
+
[OutputFix.DEDUPE_ENUM_NAMES]: [ENUM, { option: "dedupeEnums", flag: "--dedupe-enums" }],
|
|
77
|
+
[OutputFix.NULLABLE_ENUMS]: [ENUM],
|
|
78
|
+
[OutputFix.PATH_PARAM_TYPE_NAMES]: [
|
|
79
|
+
{ option: "pathParamsAsTypes", flag: "--path-params-as-types" }
|
|
80
|
+
],
|
|
81
|
+
[OutputFix.ROOT_TYPE_NUMBERING]: [ROOT_TYPES, NO_SCHEMA_PREFIX]
|
|
82
|
+
};
|
|
83
|
+
function describeRequirement(requirement) {
|
|
84
|
+
return `${requirement.option} (${requirement.flag})`;
|
|
85
|
+
}
|
|
86
|
+
function ineffectiveFixNotices(names, isOptionOn) {
|
|
87
|
+
return [...new Set(names)].flatMap((name) => {
|
|
88
|
+
const missing = (REQUIREMENTS[name] ?? []).filter(({ option }) => !isOptionOn(option));
|
|
89
|
+
return missing.length === 0 ? [] : [`Fix "${name}" has no effect without ${missing.map(describeRequirement).join(" and ")}`];
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export { ALL_OUTPUT_FIXES, OUTPUT_FIXES, OutputFix, ineffectiveFixNotices, outputFixNamesOf, resolveOutputFixes };
|
|
94
|
+
//# sourceMappingURL=output-fixes.mjs.map
|