openapi-typesafe 0.0.0 → 1.0.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +71 -1
- package/bin/cli.js +4 -0
- package/dist/adapters/node-file-system/node-file-system.cjs +46 -0
- package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -0
- package/dist/adapters/node-file-system/node-file-system.mjs +40 -0
- package/dist/adapters/node-file-system/node-file-system.mjs.map +1 -0
- package/dist/adapters/redocly-loader/alias-limit.cjs +16 -0
- package/dist/adapters/redocly-loader/alias-limit.cjs.map +1 -0
- package/dist/adapters/redocly-loader/alias-limit.mjs +14 -0
- package/dist/adapters/redocly-loader/alias-limit.mjs.map +1 -0
- package/dist/adapters/redocly-loader/allowed-hosts.cjs +42 -0
- package/dist/adapters/redocly-loader/allowed-hosts.cjs.map +1 -0
- package/dist/adapters/redocly-loader/allowed-hosts.mjs +40 -0
- package/dist/adapters/redocly-loader/allowed-hosts.mjs.map +1 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.cjs +53 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.cjs.map +1 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.mjs +51 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.mjs.map +1 -0
- package/dist/adapters/redocly-loader/malformed-refs.cjs +41 -0
- package/dist/adapters/redocly-loader/malformed-refs.cjs.map +1 -0
- package/dist/adapters/redocly-loader/malformed-refs.mjs +38 -0
- package/dist/adapters/redocly-loader/malformed-refs.mjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-config-source.cjs +42 -0
- package/dist/adapters/redocly-loader/redocly-config-source.cjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-config-source.mjs +35 -0
- package/dist/adapters/redocly-loader/redocly-config-source.mjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +169 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +167 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-access.cjs +107 -0
- package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-access.mjs +99 -0
- package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-holders.cjs +31 -0
- package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-holders.mjs +29 -0
- package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -0
- package/dist/adapters/redocly-loader/remote-fetch.cjs +60 -0
- package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -0
- package/dist/adapters/redocly-loader/remote-fetch.mjs +56 -0
- package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-load-errors.cjs +87 -0
- package/dist/adapters/redocly-loader/schema-load-errors.cjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-load-errors.mjs +77 -0
- package/dist/adapters/redocly-loader/schema-load-errors.mjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-source.cjs +104 -0
- package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-source.mjs +98 -0
- package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -0
- package/dist/adapters/redocly-loader/unsupported-keys.cjs +62 -0
- package/dist/adapters/redocly-loader/unsupported-keys.cjs.map +1 -0
- package/dist/adapters/redocly-loader/unsupported-keys.mjs +58 -0
- package/dist/adapters/redocly-loader/unsupported-keys.mjs.map +1 -0
- package/dist/adapters/terminal-logger/terminal-logger.cjs +67 -0
- package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -0
- package/dist/adapters/terminal-logger/terminal-logger.mjs +59 -0
- package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.cjs +21 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.mjs +17 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.cjs +75 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.mjs +71 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs +145 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs +139 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/lazy-node.cjs +23 -0
- package/dist/adapters/type-ast-bridge/lazy-node.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/lazy-node.mjs +21 -0
- package/dist/adapters/type-ast-bridge/lazy-node.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/load-typescript.cjs +57 -0
- package/dist/adapters/type-ast-bridge/load-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/load-typescript.mjs +51 -0
- package/dist/adapters/type-ast-bridge/load-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/print-typescript.cjs +21 -0
- package/dist/adapters/type-ast-bridge/print-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/print-typescript.mjs +19 -0
- package/dist/adapters/type-ast-bridge/print-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.cjs +33 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.mjs +29 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.cjs +204 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.mjs +201 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.mjs.map +1 -0
- package/dist/api/ast-to-string.cjs +39 -0
- package/dist/api/ast-to-string.cjs.map +1 -0
- package/dist/api/ast-to-string.mjs +37 -0
- package/dist/api/ast-to-string.mjs.map +1 -0
- package/dist/api/comment-header.cjs +11 -0
- package/dist/api/comment-header.cjs.map +1 -0
- package/dist/api/comment-header.mjs +9 -0
- package/dist/api/comment-header.mjs.map +1 -0
- package/dist/api/default-ports.cjs +38 -0
- package/dist/api/default-ports.cjs.map +1 -0
- package/dist/api/default-ports.mjs +28 -0
- package/dist/api/default-ports.mjs.map +1 -0
- package/dist/api/discriminator-enum.cjs +44 -0
- package/dist/api/discriminator-enum.cjs.map +1 -0
- package/dist/api/discriminator-enum.mjs +42 -0
- package/dist/api/discriminator-enum.mjs.map +1 -0
- package/dist/api/discriminator-scan.cjs +168 -0
- package/dist/api/discriminator-scan.cjs.map +1 -0
- package/dist/api/discriminator-scan.mjs +165 -0
- package/dist/api/discriminator-scan.mjs.map +1 -0
- package/dist/api/document-declarations.cjs +28 -0
- package/dist/api/document-declarations.cjs.map +1 -0
- package/dist/api/document-declarations.mjs +26 -0
- package/dist/api/document-declarations.mjs.map +1 -0
- package/dist/api/document-refs.cjs +53 -0
- package/dist/api/document-refs.cjs.map +1 -0
- package/dist/api/document-refs.mjs +50 -0
- package/dist/api/document-refs.mjs.map +1 -0
- package/dist/api/document-run.cjs +107 -0
- package/dist/api/document-run.cjs.map +1 -0
- package/dist/api/document-run.mjs +101 -0
- package/dist/api/document-run.mjs.map +1 -0
- package/dist/api/footer-entry.cjs +18 -0
- package/dist/api/footer-entry.cjs.map +1 -0
- package/dist/api/footer-entry.mjs +15 -0
- package/dist/api/footer-entry.mjs.map +1 -0
- package/dist/api/footer-sink.cjs +53 -0
- package/dist/api/footer-sink.cjs.map +1 -0
- package/dist/api/footer-sink.mjs +51 -0
- package/dist/api/footer-sink.mjs.map +1 -0
- package/dist/api/legacy-callback-warning.cjs +25 -0
- package/dist/api/legacy-callback-warning.cjs.map +1 -0
- package/dist/api/legacy-callback-warning.mjs +22 -0
- package/dist/api/legacy-callback-warning.mjs.map +1 -0
- package/dist/api/legacy-ts-helpers.cjs +203 -0
- package/dist/api/legacy-ts-helpers.cjs.map +1 -0
- package/dist/api/legacy-ts-helpers.mjs +187 -0
- package/dist/api/legacy-ts-helpers.mjs.map +1 -0
- package/dist/api/legacy-utils.cjs +65 -0
- package/dist/api/legacy-utils.cjs.map +1 -0
- package/dist/api/legacy-utils.mjs +50 -0
- package/dist/api/legacy-utils.mjs.map +1 -0
- package/dist/api/openapi-ts.cjs +40 -0
- package/dist/api/openapi-ts.cjs.map +1 -0
- package/dist/api/openapi-ts.mjs +34 -0
- package/dist/api/openapi-ts.mjs.map +1 -0
- package/dist/api/schema-callbacks.cjs +140 -0
- package/dist/api/schema-callbacks.cjs.map +1 -0
- package/dist/api/schema-callbacks.mjs +136 -0
- package/dist/api/schema-callbacks.mjs.map +1 -0
- package/dist/api/string-to-ast.cjs +21 -0
- package/dist/api/string-to-ast.cjs.map +1 -0
- package/dist/api/string-to-ast.mjs +18 -0
- package/dist/api/string-to-ast.mjs.map +1 -0
- package/dist/api/transform-context.cjs +82 -0
- package/dist/api/transform-context.cjs.map +1 -0
- package/dist/api/transform-context.mjs +65 -0
- package/dist/api/transform-context.mjs.map +1 -0
- package/dist/api/transform-schema.cjs +31 -0
- package/dist/api/transform-schema.cjs.map +1 -0
- package/dist/api/transform-schema.mjs +26 -0
- package/dist/api/transform-schema.mjs.map +1 -0
- package/dist/api/type-helpers.cjs +85 -0
- package/dist/api/type-helpers.cjs.map +1 -0
- package/dist/api/type-helpers.mjs +66 -0
- package/dist/api/type-helpers.mjs.map +1 -0
- package/dist/api/unsupported-feature-warnings.cjs +17 -0
- package/dist/api/unsupported-feature-warnings.cjs.map +1 -0
- package/dist/api/unsupported-feature-warnings.mjs +15 -0
- package/dist/api/unsupported-feature-warnings.mjs.map +1 -0
- package/dist/application/print/comment-writer.cjs +95 -0
- package/dist/application/print/comment-writer.cjs.map +1 -0
- package/dist/application/print/comment-writer.mjs +93 -0
- package/dist/application/print/comment-writer.mjs.map +1 -0
- package/dist/application/print/declaration-printer.cjs +83 -0
- package/dist/application/print/declaration-printer.cjs.map +1 -0
- package/dist/application/print/declaration-printer.mjs +81 -0
- package/dist/application/print/declaration-printer.mjs.map +1 -0
- package/dist/application/print/literal-text.cjs +52 -0
- package/dist/application/print/literal-text.cjs.map +1 -0
- package/dist/application/print/literal-text.mjs +48 -0
- package/dist/application/print/literal-text.mjs.map +1 -0
- package/dist/application/print/print-nodes.cjs +38 -0
- package/dist/application/print/print-nodes.cjs.map +1 -0
- package/dist/application/print/print-nodes.mjs +36 -0
- package/dist/application/print/print-nodes.mjs.map +1 -0
- package/dist/application/print/print-options.cjs +6 -0
- package/dist/application/print/print-options.cjs.map +1 -0
- package/dist/application/print/print-options.mjs +4 -0
- package/dist/application/print/print-options.mjs.map +1 -0
- package/dist/application/print/text-writer.cjs +63 -0
- package/dist/application/print/text-writer.cjs.map +1 -0
- package/dist/application/print/text-writer.mjs +60 -0
- package/dist/application/print/text-writer.mjs.map +1 -0
- package/dist/application/print/type-printer.cjs +214 -0
- package/dist/application/print/type-printer.cjs.map +1 -0
- package/dist/application/print/type-printer.mjs +210 -0
- package/dist/application/print/type-printer.mjs.map +1 -0
- package/dist/application/stack-overflow.cjs +36 -0
- package/dist/application/stack-overflow.cjs.map +1 -0
- package/dist/application/stack-overflow.mjs +31 -0
- package/dist/application/stack-overflow.mjs.map +1 -0
- package/dist/application/transform/document/components.cjs +104 -0
- package/dist/application/transform/document/components.cjs.map +1 -0
- package/dist/application/transform/document/components.mjs +102 -0
- package/dist/application/transform/document/components.mjs.map +1 -0
- package/dist/application/transform/document/defs-root.cjs +18 -0
- package/dist/application/transform/document/defs-root.cjs.map +1 -0
- package/dist/application/transform/document/defs-root.mjs +16 -0
- package/dist/application/transform/document/defs-root.mjs.map +1 -0
- package/dist/application/transform/document/document-member.cjs +13 -0
- package/dist/application/transform/document/document-member.cjs.map +1 -0
- package/dist/application/transform/document/document-member.mjs +11 -0
- package/dist/application/transform/document/document-member.mjs.map +1 -0
- package/dist/application/transform/document/document.cjs +86 -0
- package/dist/application/transform/document/document.cjs.map +1 -0
- package/dist/application/transform/document/document.mjs +83 -0
- package/dist/application/transform/document/document.mjs.map +1 -0
- package/dist/application/transform/document/header.cjs +27 -0
- package/dist/application/transform/document/header.cjs.map +1 -0
- package/dist/application/transform/document/header.mjs +25 -0
- package/dist/application/transform/document/header.mjs.map +1 -0
- package/dist/application/transform/document/kept-deprecated.cjs +96 -0
- package/dist/application/transform/document/kept-deprecated.cjs.map +1 -0
- package/dist/application/transform/document/kept-deprecated.mjs +94 -0
- package/dist/application/transform/document/kept-deprecated.mjs.map +1 -0
- package/dist/application/transform/document/media-type.cjs +42 -0
- package/dist/application/transform/document/media-type.cjs.map +1 -0
- package/dist/application/transform/document/media-type.mjs +38 -0
- package/dist/application/transform/document/media-type.mjs.map +1 -0
- package/dist/application/transform/document/operation.cjs +45 -0
- package/dist/application/transform/document/operation.cjs.map +1 -0
- package/dist/application/transform/document/operation.mjs +43 -0
- package/dist/application/transform/document/operation.mjs.map +1 -0
- package/dist/application/transform/document/parameter.cjs +25 -0
- package/dist/application/transform/document/parameter.cjs.map +1 -0
- package/dist/application/transform/document/parameter.mjs +23 -0
- package/dist/application/transform/document/parameter.mjs.map +1 -0
- package/dist/application/transform/document/parameters.cjs +114 -0
- package/dist/application/transform/document/parameters.cjs.map +1 -0
- package/dist/application/transform/document/parameters.mjs +112 -0
- package/dist/application/transform/document/parameters.mjs.map +1 -0
- package/dist/application/transform/document/path-item-conflicts.cjs +51 -0
- package/dist/application/transform/document/path-item-conflicts.cjs.map +1 -0
- package/dist/application/transform/document/path-item-conflicts.mjs +49 -0
- package/dist/application/transform/document/path-item-conflicts.mjs.map +1 -0
- package/dist/application/transform/document/path-item.cjs +82 -0
- package/dist/application/transform/document/path-item.cjs.map +1 -0
- package/dist/application/transform/document/path-item.mjs +80 -0
- package/dist/application/transform/document/path-item.mjs.map +1 -0
- package/dist/application/transform/document/path-key-overlaps.cjs +57 -0
- package/dist/application/transform/document/path-key-overlaps.cjs.map +1 -0
- package/dist/application/transform/document/path-key-overlaps.mjs +55 -0
- package/dist/application/transform/document/path-key-overlaps.mjs.map +1 -0
- package/dist/application/transform/document/paths-enum.cjs +75 -0
- package/dist/application/transform/document/paths-enum.cjs.map +1 -0
- package/dist/application/transform/document/paths-enum.mjs +72 -0
- package/dist/application/transform/document/paths-enum.mjs.map +1 -0
- package/dist/application/transform/document/paths.cjs +127 -0
- package/dist/application/transform/document/paths.cjs.map +1 -0
- package/dist/application/transform/document/paths.mjs +125 -0
- package/dist/application/transform/document/paths.mjs.map +1 -0
- package/dist/application/transform/document/request-body.cjs +36 -0
- package/dist/application/transform/document/request-body.cjs.map +1 -0
- package/dist/application/transform/document/request-body.mjs +34 -0
- package/dist/application/transform/document/request-body.mjs.map +1 -0
- package/dist/application/transform/document/response.cjs +59 -0
- package/dist/application/transform/document/response.cjs.map +1 -0
- package/dist/application/transform/document/response.mjs +57 -0
- package/dist/application/transform/document/response.mjs.map +1 -0
- package/dist/application/transform/document/responses.cjs +23 -0
- package/dist/application/transform/document/responses.cjs.map +1 -0
- package/dist/application/transform/document/responses.mjs +21 -0
- package/dist/application/transform/document/responses.mjs.map +1 -0
- package/dist/application/transform/document/root-type-aliases.cjs +69 -0
- package/dist/application/transform/document/root-type-aliases.cjs.map +1 -0
- package/dist/application/transform/document/root-type-aliases.mjs +65 -0
- package/dist/application/transform/document/root-type-aliases.mjs.map +1 -0
- package/dist/application/transform/document/webhooks.cjs +19 -0
- package/dist/application/transform/document/webhooks.cjs.map +1 -0
- package/dist/application/transform/document/webhooks.mjs +17 -0
- package/dist/application/transform/document/webhooks.mjs.map +1 -0
- package/dist/application/transform/document-entries.cjs +17 -0
- package/dist/application/transform/document-entries.cjs.map +1 -0
- package/dist/application/transform/document-entries.mjs +14 -0
- package/dist/application/transform/document-entries.mjs.map +1 -0
- package/dist/application/transform/footer/document-footer.cjs +88 -0
- package/dist/application/transform/footer/document-footer.cjs.map +1 -0
- package/dist/application/transform/footer/document-footer.mjs +86 -0
- package/dist/application/transform/footer/document-footer.mjs.map +1 -0
- package/dist/application/transform/footer/enum-naming.cjs +121 -0
- package/dist/application/transform/footer/enum-naming.cjs.map +1 -0
- package/dist/application/transform/footer/enum-naming.mjs +115 -0
- package/dist/application/transform/footer/enum-naming.mjs.map +1 -0
- package/dist/application/transform/helper-types.cjs +68 -0
- package/dist/application/transform/helper-types.cjs.map +1 -0
- package/dist/application/transform/helper-types.mjs +65 -0
- package/dist/application/transform/helper-types.mjs.map +1 -0
- package/dist/application/transform/literal-type.cjs +36 -0
- package/dist/application/transform/literal-type.cjs.map +1 -0
- package/dist/application/transform/literal-type.mjs +34 -0
- package/dist/application/transform/literal-type.mjs.map +1 -0
- package/dist/application/transform/numbered-names.cjs +18 -0
- package/dist/application/transform/numbered-names.cjs.map +1 -0
- package/dist/application/transform/numbered-names.mjs +16 -0
- package/dist/application/transform/numbered-names.mjs.map +1 -0
- package/dist/application/transform/ref-type.cjs +57 -0
- package/dist/application/transform/ref-type.cjs.map +1 -0
- package/dist/application/transform/ref-type.mjs +54 -0
- package/dist/application/transform/ref-type.mjs.map +1 -0
- package/dist/application/transform/schema/array-type.cjs +105 -0
- package/dist/application/transform/schema/array-type.cjs.map +1 -0
- package/dist/application/transform/schema/array-type.mjs +103 -0
- package/dist/application/transform/schema/array-type.mjs.map +1 -0
- package/dist/application/transform/schema/composition-type.cjs +107 -0
- package/dist/application/transform/schema/composition-type.cjs.map +1 -0
- package/dist/application/transform/schema/composition-type.mjs +105 -0
- package/dist/application/transform/schema/composition-type.mjs.map +1 -0
- package/dist/application/transform/schema/core-type.cjs +84 -0
- package/dist/application/transform/schema/core-type.cjs.map +1 -0
- package/dist/application/transform/schema/core-type.mjs +82 -0
- package/dist/application/transform/schema/core-type.mjs.map +1 -0
- package/dist/application/transform/schema/discriminator-property.cjs +21 -0
- package/dist/application/transform/schema/discriminator-property.cjs.map +1 -0
- package/dist/application/transform/schema/discriminator-property.mjs +19 -0
- package/dist/application/transform/schema/discriminator-property.mjs.map +1 -0
- package/dist/application/transform/schema/enum-rule.cjs +107 -0
- package/dist/application/transform/schema/enum-rule.cjs.map +1 -0
- package/dist/application/transform/schema/enum-rule.mjs +105 -0
- package/dist/application/transform/schema/enum-rule.mjs.map +1 -0
- package/dist/application/transform/schema/object-type.cjs +173 -0
- package/dist/application/transform/schema/object-type.cjs.map +1 -0
- package/dist/application/transform/schema/object-type.mjs +170 -0
- package/dist/application/transform/schema/object-type.mjs.map +1 -0
- package/dist/application/transform/schema/presence-members.cjs +59 -0
- package/dist/application/transform/schema/presence-members.cjs.map +1 -0
- package/dist/application/transform/schema/presence-members.mjs +57 -0
- package/dist/application/transform/schema/presence-members.mjs.map +1 -0
- package/dist/application/transform/schema/schema-transform.cjs +72 -0
- package/dist/application/transform/schema/schema-transform.cjs.map +1 -0
- package/dist/application/transform/schema/schema-transform.mjs +68 -0
- package/dist/application/transform/schema/schema-transform.mjs.map +1 -0
- package/dist/application/transform/schema/unevaluated-properties.cjs +61 -0
- package/dist/application/transform/schema/unevaluated-properties.cjs.map +1 -0
- package/dist/application/transform/schema/unevaluated-properties.mjs +59 -0
- package/dist/application/transform/schema/unevaluated-properties.mjs.map +1 -0
- package/dist/application/transform/schema-comment.cjs +84 -0
- package/dist/application/transform/schema-comment.cjs.map +1 -0
- package/dist/application/transform/schema-comment.mjs +81 -0
- package/dist/application/transform/schema-comment.mjs.map +1 -0
- package/dist/application/transform/shared-types.cjs +8 -0
- package/dist/application/transform/shared-types.cjs.map +1 -0
- package/dist/application/transform/shared-types.mjs +6 -0
- package/dist/application/transform/shared-types.mjs.map +1 -0
- package/dist/application/transform/type-combinators.cjs +49 -0
- package/dist/application/transform/type-combinators.cjs.map +1 -0
- package/dist/application/transform/type-combinators.mjs +42 -0
- package/dist/application/transform/type-combinators.mjs.map +1 -0
- package/dist/cli/cli-arguments.cjs +137 -0
- package/dist/cli/cli-arguments.cjs.map +1 -0
- package/dist/cli/cli-arguments.mjs +129 -0
- package/dist/cli/cli-arguments.mjs.map +1 -0
- package/dist/cli/cli-errors.cjs +80 -0
- package/dist/cli/cli-errors.cjs.map +1 -0
- package/dist/cli/cli-errors.mjs +76 -0
- package/dist/cli/cli-errors.mjs.map +1 -0
- package/dist/cli/cli-output.cjs +37 -0
- package/dist/cli/cli-output.cjs.map +1 -0
- package/dist/cli/cli-output.mjs +30 -0
- package/dist/cli/cli-output.mjs.map +1 -0
- package/dist/cli/docs-links.cjs +6 -0
- package/dist/cli/docs-links.cjs.map +1 -0
- package/dist/cli/docs-links.mjs +4 -0
- package/dist/cli/docs-links.mjs.map +1 -0
- package/dist/cli/fix-option.cjs +19 -0
- package/dist/cli/fix-option.cjs.map +1 -0
- package/dist/cli/fix-option.mjs +16 -0
- package/dist/cli/fix-option.mjs.map +1 -0
- package/dist/cli/help-text.cjs +44 -0
- package/dist/cli/help-text.cjs.map +1 -0
- package/dist/cli/help-text.mjs +42 -0
- package/dist/cli/help-text.mjs.map +1 -0
- package/dist/cli/main.cjs +62 -0
- package/dist/cli/main.cjs.map +1 -0
- package/dist/cli/main.d.cts +2 -0
- package/dist/cli/main.d.mts +2 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.mjs +54 -0
- package/dist/cli/main.mjs.map +1 -0
- package/dist/cli/redocly-apis.cjs +65 -0
- package/dist/cli/redocly-apis.cjs.map +1 -0
- package/dist/cli/redocly-apis.mjs +62 -0
- package/dist/cli/redocly-apis.mjs.map +1 -0
- package/dist/cli/ref-limits.cjs +14 -0
- package/dist/cli/ref-limits.cjs.map +1 -0
- package/dist/cli/ref-limits.mjs +12 -0
- package/dist/cli/ref-limits.mjs.map +1 -0
- package/dist/cli/run-cli.cjs +100 -0
- package/dist/cli/run-cli.cjs.map +1 -0
- package/dist/cli/run-cli.mjs +98 -0
- package/dist/cli/run-cli.mjs.map +1 -0
- package/dist/domain/assert-never.cjs +8 -0
- package/dist/domain/assert-never.cjs.map +1 -0
- package/dist/domain/assert-never.mjs +6 -0
- package/dist/domain/assert-never.mjs.map +1 -0
- package/dist/domain/errors.cjs +50 -0
- package/dist/domain/errors.cjs.map +1 -0
- package/dist/domain/errors.mjs +46 -0
- package/dist/domain/errors.mjs.map +1 -0
- package/dist/domain/ir/constructors.cjs +89 -0
- package/dist/domain/ir/constructors.cjs.map +1 -0
- package/dist/domain/ir/constructors.mjs +71 -0
- package/dist/domain/ir/constructors.mjs.map +1 -0
- package/dist/domain/ir/identifier-text.cjs +29 -0
- package/dist/domain/ir/identifier-text.cjs.map +1 -0
- package/dist/domain/ir/identifier-text.mjs +25 -0
- package/dist/domain/ir/identifier-text.mjs.map +1 -0
- package/dist/domain/ir/newer-identifier-ranges.cjs +109 -0
- package/dist/domain/ir/newer-identifier-ranges.cjs.map +1 -0
- package/dist/domain/ir/newer-identifier-ranges.mjs +106 -0
- package/dist/domain/ir/newer-identifier-ranges.mjs.map +1 -0
- package/dist/domain/ir/normalize.cjs +32 -0
- package/dist/domain/ir/normalize.cjs.map +1 -0
- package/dist/domain/ir/normalize.mjs +29 -0
- package/dist/domain/ir/normalize.mjs.map +1 -0
- package/dist/domain/ir/property-name.cjs +19 -0
- package/dist/domain/ir/property-name.cjs.map +1 -0
- package/dist/domain/ir/property-name.mjs +16 -0
- package/dist/domain/ir/property-name.mjs.map +1 -0
- package/dist/domain/ir/raw-text-escapes.cjs +25 -0
- package/dist/domain/ir/raw-text-escapes.cjs.map +1 -0
- package/dist/domain/ir/raw-text-escapes.mjs +22 -0
- package/dist/domain/ir/raw-text-escapes.mjs.map +1 -0
- package/dist/domain/openapi/alias-expansion.cjs +50 -0
- package/dist/domain/openapi/alias-expansion.cjs.map +1 -0
- package/dist/domain/openapi/alias-expansion.mjs +45 -0
- package/dist/domain/openapi/alias-expansion.mjs.map +1 -0
- package/dist/domain/openapi/binary-content.cjs +48 -0
- package/dist/domain/openapi/binary-content.cjs.map +1 -0
- package/dist/domain/openapi/binary-content.mjs +45 -0
- package/dist/domain/openapi/binary-content.mjs.map +1 -0
- package/dist/domain/openapi/components-object.cjs +29 -0
- package/dist/domain/openapi/components-object.cjs.map +1 -0
- package/dist/domain/openapi/components-object.mjs +24 -0
- package/dist/domain/openapi/components-object.mjs.map +1 -0
- package/dist/domain/openapi/json-pointer.cjs +31 -0
- package/dist/domain/openapi/json-pointer.cjs.map +1 -0
- package/dist/domain/openapi/json-pointer.mjs +27 -0
- package/dist/domain/openapi/json-pointer.mjs.map +1 -0
- package/dist/domain/openapi/media-type-object.cjs +14 -0
- package/dist/domain/openapi/media-type-object.cjs.map +1 -0
- package/dist/domain/openapi/media-type-object.mjs +11 -0
- package/dist/domain/openapi/media-type-object.mjs.map +1 -0
- package/dist/domain/openapi/parameter-object.cjs +13 -0
- package/dist/domain/openapi/parameter-object.cjs.map +1 -0
- package/dist/domain/openapi/parameter-object.mjs +10 -0
- package/dist/domain/openapi/parameter-object.mjs.map +1 -0
- package/dist/domain/openapi/path-item-object.cjs +35 -0
- package/dist/domain/openapi/path-item-object.cjs.map +1 -0
- package/dist/domain/openapi/path-item-object.mjs +30 -0
- package/dist/domain/openapi/path-item-object.mjs.map +1 -0
- package/dist/domain/openapi/unsupported-features.cjs +87 -0
- package/dist/domain/openapi/unsupported-features.cjs.map +1 -0
- package/dist/domain/openapi/unsupported-features.mjs +84 -0
- package/dist/domain/openapi/unsupported-features.mjs.map +1 -0
- package/dist/domain/output-fixes.cjs +66 -0
- package/dist/domain/output-fixes.cjs.map +1 -0
- package/dist/domain/output-fixes.mjs +59 -0
- package/dist/domain/output-fixes.mjs.map +1 -0
- package/dist/index.cjs +98 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +812 -0
- package/dist/index.d.mts +812 -0
- package/dist/index.d.ts +812 -0
- package/dist/index.mjs +27 -0
- package/dist/index.mjs.map +1 -0
- package/dist/transform/components-object.cjs +14 -0
- package/dist/transform/components-object.cjs.map +1 -0
- package/dist/transform/components-object.mjs +10 -0
- package/dist/transform/components-object.mjs.map +1 -0
- package/dist/transform/header-object.cjs +12 -0
- package/dist/transform/header-object.cjs.map +1 -0
- package/dist/transform/header-object.mjs +10 -0
- package/dist/transform/header-object.mjs.map +1 -0
- package/dist/transform/media-type-object.cjs +12 -0
- package/dist/transform/media-type-object.cjs.map +1 -0
- package/dist/transform/media-type-object.mjs +10 -0
- package/dist/transform/media-type-object.mjs.map +1 -0
- package/dist/transform/operation-object.cjs +26 -0
- package/dist/transform/operation-object.cjs.map +1 -0
- package/dist/transform/operation-object.mjs +21 -0
- package/dist/transform/operation-object.mjs.map +1 -0
- package/dist/transform/parameter-object.cjs +12 -0
- package/dist/transform/parameter-object.cjs.map +1 -0
- package/dist/transform/parameter-object.mjs +10 -0
- package/dist/transform/parameter-object.mjs.map +1 -0
- package/dist/transform/path-item-object.cjs +12 -0
- package/dist/transform/path-item-object.cjs.map +1 -0
- package/dist/transform/path-item-object.mjs +10 -0
- package/dist/transform/path-item-object.mjs.map +1 -0
- package/dist/transform/paths-object.cjs +11 -0
- package/dist/transform/paths-object.cjs.map +1 -0
- package/dist/transform/paths-object.mjs +9 -0
- package/dist/transform/paths-object.mjs.map +1 -0
- package/dist/transform/request-body-object.cjs +12 -0
- package/dist/transform/request-body-object.cjs.map +1 -0
- package/dist/transform/request-body-object.mjs +10 -0
- package/dist/transform/request-body-object.mjs.map +1 -0
- package/dist/transform/response-object.cjs +12 -0
- package/dist/transform/response-object.cjs.map +1 -0
- package/dist/transform/response-object.mjs +10 -0
- package/dist/transform/response-object.mjs.map +1 -0
- package/dist/transform/responses-object.cjs +12 -0
- package/dist/transform/responses-object.cjs.map +1 -0
- package/dist/transform/responses-object.mjs +10 -0
- package/dist/transform/responses-object.mjs.map +1 -0
- package/dist/transform/schema-object.cjs +21 -0
- package/dist/transform/schema-object.cjs.map +1 -0
- package/dist/transform/schema-object.mjs +16 -0
- package/dist/transform/schema-object.mjs.map +1 -0
- package/package.json +115 -4
- package/src/adapters/node-file-system/node-file-system.ts +44 -0
- package/src/adapters/redocly-loader/alias-limit.ts +20 -0
- package/src/adapters/redocly-loader/allowed-hosts.ts +62 -0
- package/src/adapters/redocly-loader/bundled-ref-repair.ts +65 -0
- package/src/adapters/redocly-loader/malformed-refs.ts +61 -0
- package/src/adapters/redocly-loader/redocly-config-source.ts +43 -0
- package/src/adapters/redocly-loader/redocly-schema-loader.ts +246 -0
- package/src/adapters/redocly-loader/ref-access.ts +146 -0
- package/src/adapters/redocly-loader/ref-holders.ts +43 -0
- package/src/adapters/redocly-loader/remote-fetch.ts +104 -0
- package/src/adapters/redocly-loader/schema-load-errors.ts +124 -0
- package/src/adapters/redocly-loader/schema-source.ts +151 -0
- package/src/adapters/redocly-loader/unsupported-keys.ts +102 -0
- package/src/adapters/terminal-logger/terminal-logger.ts +98 -0
- package/src/adapters/type-ast-bridge/footer-nodes.ts +38 -0
- package/src/adapters/type-ast-bridge/ir-declarations-to-typescript.ts +100 -0
- package/src/adapters/type-ast-bridge/ir-to-typescript.ts +220 -0
- package/src/adapters/type-ast-bridge/lazy-node.ts +24 -0
- package/src/adapters/type-ast-bridge/load-typescript.ts +84 -0
- package/src/adapters/type-ast-bridge/print-typescript.ts +33 -0
- package/src/adapters/type-ast-bridge/typescript-raw-text.ts +49 -0
- package/src/adapters/type-ast-bridge/typescript-to-ir.ts +280 -0
- package/src/adapters/type-ast-bridge/typescript-types.ts +8 -0
- package/src/api/ast-to-string.ts +59 -0
- package/src/api/comment-header.ts +7 -0
- package/src/api/default-ports.ts +44 -0
- package/src/api/discriminator-enum.ts +76 -0
- package/src/api/discriminator-scan.ts +272 -0
- package/src/api/document-declarations.ts +41 -0
- package/src/api/document-refs.ts +71 -0
- package/src/api/document-run.ts +159 -0
- package/src/api/footer-entry.ts +23 -0
- package/src/api/footer-sink.ts +67 -0
- package/src/api/legacy-callback-warning.ts +29 -0
- package/src/api/legacy-ts-helpers.ts +311 -0
- package/src/api/legacy-utils.ts +118 -0
- package/src/api/openapi-ts.ts +62 -0
- package/src/api/schema-callbacks.ts +211 -0
- package/src/api/string-to-ast.ts +27 -0
- package/src/api/transform-context.ts +87 -0
- package/src/api/transform-schema.ts +39 -0
- package/src/api/type-helpers.ts +130 -0
- package/src/api/unsupported-feature-warnings.ts +26 -0
- package/src/application/ports/file-system.ts +12 -0
- package/src/application/ports/logger.ts +16 -0
- package/src/application/ports/redocly-config-source.ts +16 -0
- package/src/application/ports/schema-loader.ts +32 -0
- package/src/application/print/comment-writer.ts +91 -0
- package/src/application/print/declaration-printer.ts +100 -0
- package/src/application/print/literal-text.ts +62 -0
- package/src/application/print/print-nodes.ts +62 -0
- package/src/application/print/print-options.ts +11 -0
- package/src/application/print/text-writer.ts +83 -0
- package/src/application/print/type-printer.ts +281 -0
- package/src/application/stack-overflow.ts +54 -0
- package/src/application/transform/document/components.ts +189 -0
- package/src/application/transform/document/defs-root.ts +25 -0
- package/src/application/transform/document/document-member.ts +20 -0
- package/src/application/transform/document/document.ts +157 -0
- package/src/application/transform/document/header.ts +34 -0
- package/src/application/transform/document/kept-deprecated.ts +135 -0
- package/src/application/transform/document/media-type.ts +78 -0
- package/src/application/transform/document/operation.ts +64 -0
- package/src/application/transform/document/parameter.ts +45 -0
- package/src/application/transform/document/parameters.ts +200 -0
- package/src/application/transform/document/path-item-conflicts.ts +79 -0
- package/src/application/transform/document/path-item.ts +168 -0
- package/src/application/transform/document/path-key-overlaps.ts +112 -0
- package/src/application/transform/document/paths-enum.ts +127 -0
- package/src/application/transform/document/paths.ts +211 -0
- package/src/application/transform/document/request-body.ts +50 -0
- package/src/application/transform/document/response.ts +109 -0
- package/src/application/transform/document/responses.ts +29 -0
- package/src/application/transform/document/root-type-aliases.ts +106 -0
- package/src/application/transform/document/webhooks.ts +22 -0
- package/src/application/transform/document-entries.ts +28 -0
- package/src/application/transform/footer/document-footer.ts +127 -0
- package/src/application/transform/footer/enum-naming.ts +181 -0
- package/src/application/transform/helper-types.ts +92 -0
- package/src/application/transform/literal-type.ts +54 -0
- package/src/application/transform/numbered-names.ts +20 -0
- package/src/application/transform/ref-type.ts +97 -0
- package/src/application/transform/schema/array-type.ts +152 -0
- package/src/application/transform/schema/composition-type.ts +183 -0
- package/src/application/transform/schema/core-type.ts +115 -0
- package/src/application/transform/schema/discriminator-property.ts +28 -0
- package/src/application/transform/schema/enum-rule.ts +157 -0
- package/src/application/transform/schema/object-type.ts +271 -0
- package/src/application/transform/schema/presence-members.ts +96 -0
- package/src/application/transform/schema/schema-context.ts +110 -0
- package/src/application/transform/schema/schema-rule.ts +29 -0
- package/src/application/transform/schema/schema-transform.ts +99 -0
- package/src/application/transform/schema/unevaluated-properties.ts +105 -0
- package/src/application/transform/schema-comment.ts +116 -0
- package/src/application/transform/shared-types.ts +9 -0
- package/src/application/transform/transform-context.ts +51 -0
- package/src/application/transform/type-combinators.ts +57 -0
- package/src/cli/cli-arguments.ts +198 -0
- package/src/cli/cli-dependencies.ts +42 -0
- package/src/cli/cli-errors.ts +125 -0
- package/src/cli/cli-output.ts +53 -0
- package/src/cli/docs-links.ts +6 -0
- package/src/cli/fix-option.ts +29 -0
- package/src/cli/help-text.ts +52 -0
- package/src/cli/main.ts +67 -0
- package/src/cli/redocly-apis.ts +91 -0
- package/src/cli/ref-limits.ts +16 -0
- package/src/cli/run-cli.ts +114 -0
- package/src/domain/assert-never.ts +8 -0
- package/src/domain/errors.ts +74 -0
- package/src/domain/ir/constructors.ts +137 -0
- package/src/domain/ir/identifier-text.ts +49 -0
- package/src/domain/ir/newer-identifier-ranges.ts +109 -0
- package/src/domain/ir/nodes.ts +224 -0
- package/src/domain/ir/normalize.ts +51 -0
- package/src/domain/ir/property-name.ts +28 -0
- package/src/domain/ir/raw-text-escapes.ts +37 -0
- package/src/domain/openapi/alias-expansion.ts +72 -0
- package/src/domain/openapi/binary-content.ts +74 -0
- package/src/domain/openapi/components-object.ts +52 -0
- package/src/domain/openapi/document-object.ts +12 -0
- package/src/domain/openapi/header-object.ts +9 -0
- package/src/domain/openapi/json-pointer.ts +46 -0
- package/src/domain/openapi/media-type-object.ts +26 -0
- package/src/domain/openapi/operation-object.ts +13 -0
- package/src/domain/openapi/parameter-object.ts +30 -0
- package/src/domain/openapi/path-item-object.ts +70 -0
- package/src/domain/openapi/request-body-object.ts +7 -0
- package/src/domain/openapi/response-object.ts +14 -0
- package/src/domain/openapi/schema-object.ts +59 -0
- package/src/domain/openapi/unsupported-features.ts +139 -0
- package/src/domain/output-fixes.ts +95 -0
- package/src/index.ts +67 -0
- package/src/transform/components-object.ts +25 -0
- package/src/transform/header-object.ts +19 -0
- package/src/transform/media-type-object.ts +19 -0
- package/src/transform/operation-object.ts +36 -0
- package/src/transform/parameter-object.ts +19 -0
- package/src/transform/parameters-array.ts +19 -0
- package/src/transform/path-item-object.ts +22 -0
- package/src/transform/paths-enum.ts +8 -0
- package/src/transform/paths-object.ts +15 -0
- package/src/transform/request-body-object.ts +19 -0
- package/src/transform/response-object.ts +19 -0
- package/src/transform/responses-object.ts +19 -0
- package/src/transform/schema-object.ts +36 -0
- package/src/transform/webhooks-object.ts +15 -0
- package/src/types/generator-options.ts +267 -0
- package/src/types/openapi-common.ts +100 -0
- package/src/types/openapi-document.ts +196 -0
- package/src/types/openapi-path-item.ts +130 -0
- package/src/types/openapi-request.ts +209 -0
- package/src/types/openapi-response.ts +81 -0
- package/src/types/openapi-schema.ts +169 -0
- package/src/types/openapi-security.ts +116 -0
- package/src/types.ts +12 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
function lines(...parts) {
|
|
2
|
+
return parts.join("\n");
|
|
3
|
+
}
|
|
4
|
+
const HELPER_TYPES = {
|
|
5
|
+
withRequired: {
|
|
6
|
+
name: "WithRequired",
|
|
7
|
+
text: lines("type WithRequired<T, K extends keyof T> = T & {", " [P in K]-?: T[P];", "};")
|
|
8
|
+
},
|
|
9
|
+
// `unevaluated-properties` (roadmap R11): the value types of every member of a union, so a
|
|
10
|
+
// `$ref` to a `oneOf` schema gives the values of each variant, not only of the shared keys.
|
|
11
|
+
propertyValues: {
|
|
12
|
+
name: "PropertyValues",
|
|
13
|
+
text: "type PropertyValues<T> = T extends unknown ? T[keyof T] : never;"
|
|
14
|
+
},
|
|
15
|
+
// Task 7.4 changes the original text on purpose: `readonly unknown[]` also flattens the arrays
|
|
16
|
+
// of `--immutable` (upstream #2714, #2749), and `NonNullable` looks through nullable parents
|
|
17
|
+
// (upstream #2737). The old text did not compile for those schemas.
|
|
18
|
+
flattenedDeepRequired: {
|
|
19
|
+
name: "FlattenedDeepRequired",
|
|
20
|
+
text: lines(
|
|
21
|
+
"type FlattenedDeepRequired<T> = {",
|
|
22
|
+
" [K in keyof T]-?: FlattenedDeepRequired<T[K] extends readonly unknown[] | undefined | null ? Extract<T[K], readonly unknown[]>[number] : NonNullable<T[K]>>;",
|
|
23
|
+
"};"
|
|
24
|
+
)
|
|
25
|
+
},
|
|
26
|
+
// `readonly unknown[]`: a readonly array value type stays as is (upstream #2749).
|
|
27
|
+
readonlyArray: {
|
|
28
|
+
name: "ReadonlyArray",
|
|
29
|
+
text: lines(
|
|
30
|
+
"type ReadonlyArray<T> = [",
|
|
31
|
+
" Exclude<T, undefined>",
|
|
32
|
+
"] extends [",
|
|
33
|
+
" readonly unknown[]",
|
|
34
|
+
"] ? Readonly<Exclude<T, undefined>> : Readonly<Exclude<T, undefined>[]>;"
|
|
35
|
+
)
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
const READ_WRITE_MARKER_TYPES = lines(
|
|
39
|
+
"export type $Read<T> = {",
|
|
40
|
+
" readonly $read: T;",
|
|
41
|
+
"};",
|
|
42
|
+
"export type $Write<T> = {",
|
|
43
|
+
" readonly $write: T;",
|
|
44
|
+
"};",
|
|
45
|
+
"type ReadWritePrimitive = string | number | boolean | bigint | symbol | null | undefined;",
|
|
46
|
+
"type ReadWriteLeaf = ReadWritePrimitive | ((...args: never) => unknown);",
|
|
47
|
+
"type ReadWriteMarkedKeys<T, Marker> = {",
|
|
48
|
+
" [K in keyof T]-?: NonNullable<T[K]> extends never ? never : NonNullable<T[K]> extends Marker ? K : never;",
|
|
49
|
+
"}[keyof T];",
|
|
50
|
+
'type ReadWriteResolveArray<T extends readonly unknown[], Resolved extends "read" | "write"> = T[number][] extends T ? T extends unknown[] ? ReadWriteResolve<T[number], Resolved>[] : readonly ReadWriteResolve<T[number], Resolved>[] : {',
|
|
51
|
+
" [K in keyof T]: ReadWriteResolve<T[K], Resolved>;",
|
|
52
|
+
"};",
|
|
53
|
+
'type ReadWriteResolve<T, Resolved extends "read" | "write"> = Resolved extends "read" ? Readable<T> : Writable<T>;',
|
|
54
|
+
'export type Readable<T> = T extends $Write<any> ? never : T extends $Read<infer U> ? Readable<U> : T extends ReadWriteLeaf ? T : T extends readonly unknown[] ? ReadWriteResolveArray<T, "read"> : T extends object ? {',
|
|
55
|
+
" [K in keyof T as K extends ReadWriteMarkedKeys<T, $Write<any>> ? never : K]: Readable<T[K]>;",
|
|
56
|
+
"} : T;",
|
|
57
|
+
'export type Writable<T> = T extends $Read<any> ? never : T extends $Write<infer U> ? Writable<U> : T extends ReadWriteLeaf ? T : T extends readonly unknown[] ? ReadWriteResolveArray<T, "write"> : T extends object ? {',
|
|
58
|
+
" [K in keyof T as K extends ReadWriteMarkedKeys<T, $Read<any>> ? never : K]: Writable<T[K]>;",
|
|
59
|
+
"} & {",
|
|
60
|
+
" [K in ReadWriteMarkedKeys<T, $Read<any>>]?: never;",
|
|
61
|
+
"} : T;"
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
export { HELPER_TYPES, READ_WRITE_MARKER_TYPES };
|
|
65
|
+
//# sourceMappingURL=helper-types.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helper-types.mjs","sources":["../../../src/application/transform/helper-types.ts"],"sourcesContent":["/**\n * The helper type aliases the generator adds to the footer, declared once each. The text is the\n * original's source text as the TypeScript printer printed it, so printing it as written gives\n * the original output (ENGINEERING_PLAN 6.2 and 6.6), except for the fixes noted below.\n */\nexport interface HelperType {\n readonly name: string;\n readonly text: string;\n}\n\nfunction lines(...parts: readonly string[]): string {\n return parts.join(\"\\n\");\n}\n\nexport const HELPER_TYPES = {\n withRequired: {\n name: \"WithRequired\",\n text: lines(\"type WithRequired<T, K extends keyof T> = T & {\", \" [P in K]-?: T[P];\", \"};\"),\n },\n // `unevaluated-properties` (roadmap R11): the value types of every member of a union, so a\n // `$ref` to a `oneOf` schema gives the values of each variant, not only of the shared keys.\n propertyValues: {\n name: \"PropertyValues\",\n text: \"type PropertyValues<T> = T extends unknown ? T[keyof T] : never;\",\n },\n // Task 7.4 changes the original text on purpose: `readonly unknown[]` also flattens the arrays\n // of `--immutable` (upstream #2714, #2749), and `NonNullable` looks through nullable parents\n // (upstream #2737). The old text did not compile for those schemas.\n flattenedDeepRequired: {\n name: \"FlattenedDeepRequired\",\n text: lines(\n \"type FlattenedDeepRequired<T> = {\",\n \" [K in keyof T]-?: FlattenedDeepRequired<T[K] extends readonly unknown[] | undefined | \" +\n \"null ? Extract<T[K], readonly unknown[]>[number] : NonNullable<T[K]>>;\",\n \"};\",\n ),\n },\n // `readonly unknown[]`: a readonly array value type stays as is (upstream #2749).\n readonlyArray: {\n name: \"ReadonlyArray\",\n text: lines(\n \"type ReadonlyArray<T> = [\",\n \" Exclude<T, undefined>\",\n \"] extends [\",\n \" readonly unknown[]\",\n \"] ? Readonly<Exclude<T, undefined>> : Readonly<Exclude<T, undefined>[]>;\",\n ),\n },\n} as const satisfies Readonly<Record<string, HelperType>>;\n\n/**\n * The `--read-write-markers` helper types, written before the root types. Task 7.6 replaces the\n * original text on purpose (ADR-014): primitives (also branded), readonly arrays, tuples,\n * intersected arrays and null-only properties keep their types (upstream #2615, #2620, #2632,\n * #2717, #2765). The declarations equal `Readable` / `Writable` of openapi-typesafe-helpers\n * (`test/api/read-write-marker-types.test.ts`); the text is what the TypeScript printer prints.\n */\nexport const READ_WRITE_MARKER_TYPES = lines(\n \"export type $Read<T> = {\",\n \" readonly $read: T;\",\n \"};\",\n \"export type $Write<T> = {\",\n \" readonly $write: T;\",\n \"};\",\n \"type ReadWritePrimitive = string | number | boolean | bigint | symbol | null | undefined;\",\n \"type ReadWriteLeaf = ReadWritePrimitive | ((...args: never) => unknown);\",\n \"type ReadWriteMarkedKeys<T, Marker> = {\",\n \" [K in keyof T]-?: NonNullable<T[K]> extends never ? never : NonNullable<T[K]> \" +\n \"extends Marker ? K : never;\",\n \"}[keyof T];\",\n 'type ReadWriteResolveArray<T extends readonly unknown[], Resolved extends \"read\" | ' +\n '\"write\"> = T[number][] extends T ? T extends unknown[] ? ReadWriteResolve<T[number], ' +\n \"Resolved>[] : readonly ReadWriteResolve<T[number], Resolved>[] : {\",\n \" [K in keyof T]: ReadWriteResolve<T[K], Resolved>;\",\n \"};\",\n 'type ReadWriteResolve<T, Resolved extends \"read\" | \"write\"> = Resolved extends \"read\" ? ' +\n \"Readable<T> : Writable<T>;\",\n \"export type Readable<T> = T extends $Write<any> ? never : T extends $Read<infer U> ? \" +\n \"Readable<U> : T extends ReadWriteLeaf ? T : T extends readonly unknown[] ? \" +\n 'ReadWriteResolveArray<T, \"read\"> : T extends object ? {',\n \" [K in keyof T as K extends ReadWriteMarkedKeys<T, $Write<any>> ? never : K]: \" +\n \"Readable<T[K]>;\",\n \"} : T;\",\n \"export type Writable<T> = T extends $Read<any> ? never : T extends $Write<infer U> ? \" +\n \"Writable<U> : T extends ReadWriteLeaf ? T : T extends readonly unknown[] ? \" +\n 'ReadWriteResolveArray<T, \"write\"> : T extends object ? {',\n \" [K in keyof T as K extends ReadWriteMarkedKeys<T, $Read<any>> ? never : K]: \" +\n \"Writable<T[K]>;\",\n \"} & {\",\n \" [K in ReadWriteMarkedKeys<T, $Read<any>>]?: never;\",\n \"} : T;\",\n);\n"],"names":[],"mappings":"AAUA,SAAS,SAAS,KAAA,EAAkC;AAClD,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEO,MAAM,YAAA,GAAe;AAAA,EAC1B,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,cAAA;AAAA,IACN,IAAA,EAAM,KAAA,CAAM,iDAAA,EAAmD,uBAAA,EAAyB,IAAI;AAAA,GAC9F;AAAA;AAAA;AAAA,EAGA,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,gBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA;AAAA;AAAA;AAAA,EAIA,qBAAA,EAAuB;AAAA,IACrB,IAAA,EAAM,uBAAA;AAAA,IACN,IAAA,EAAM,KAAA;AAAA,MACJ,mCAAA;AAAA,MACA,kKAAA;AAAA,MAEA;AAAA;AACF,GACF;AAAA;AAAA,EAEA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,eAAA;AAAA,IACN,IAAA,EAAM,KAAA;AAAA,MACJ,2BAAA;AAAA,MACA,2BAAA;AAAA,MACA,aAAA;AAAA,MACA,wBAAA;AAAA,MACA;AAAA;AACF;AAEJ;AASO,MAAM,uBAAA,GAA0B,KAAA;AAAA,EACrC,0BAAA;AAAA,EACA,wBAAA;AAAA,EACA,IAAA;AAAA,EACA,2BAAA;AAAA,EACA,yBAAA;AAAA,EACA,IAAA;AAAA,EACA,2FAAA;AAAA,EACA,0EAAA;AAAA,EACA,yCAAA;AAAA,EACA,+GAAA;AAAA,EAEA,aAAA;AAAA,EACA,4OAAA;AAAA,EAGA,uDAAA;AAAA,EACA,IAAA;AAAA,EACA,oHAAA;AAAA,EAEA,yNAAA;AAAA,EAGA,kGAAA;AAAA,EAEA,QAAA;AAAA,EACA,0NAAA;AAAA,EAGA,iGAAA;AAAA,EAEA,OAAA;AAAA,EACA,wDAAA;AAAA,EACA;AACF;;"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const constructors = require('../../domain/ir/constructors.cjs');
|
|
4
|
+
const propertyName = require('../../domain/ir/property-name.cjs');
|
|
5
|
+
const sharedTypes = require('./shared-types.cjs');
|
|
6
|
+
|
|
7
|
+
function objectLiteralType(value) {
|
|
8
|
+
const members = Object.entries(value).map(
|
|
9
|
+
([key, entry]) => constructors.irProperty(propertyName.toPropertyName(key), literalType(entry))
|
|
10
|
+
);
|
|
11
|
+
return members.length > 0 ? constructors.irObject(members) : constructors.irRecord(constructors.irKeyword("string"), constructors.irKeyword("never"));
|
|
12
|
+
}
|
|
13
|
+
function arrayLiteralType(value) {
|
|
14
|
+
return value.length === 0 ? constructors.irArray(constructors.irKeyword("never")) : constructors.irTuple(value.map((item) => constructors.irTupleElement(literalType(item))));
|
|
15
|
+
}
|
|
16
|
+
function literalType(value) {
|
|
17
|
+
if (typeof value === "string") {
|
|
18
|
+
return constructors.irString(value, "json");
|
|
19
|
+
}
|
|
20
|
+
if (typeof value === "number") {
|
|
21
|
+
return Number.isFinite(value) ? constructors.irNumber(value) : constructors.irRaw(String(value));
|
|
22
|
+
}
|
|
23
|
+
if (typeof value === "boolean") {
|
|
24
|
+
return constructors.irBoolean(value);
|
|
25
|
+
}
|
|
26
|
+
if (value === null) {
|
|
27
|
+
return constructors.irKeyword("null");
|
|
28
|
+
}
|
|
29
|
+
if (Array.isArray(value)) {
|
|
30
|
+
return arrayLiteralType(value);
|
|
31
|
+
}
|
|
32
|
+
return typeof value === "object" ? objectLiteralType(value) : sharedTypes.UNKNOWN_TYPE;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
exports.literalType = literalType;
|
|
36
|
+
//# sourceMappingURL=literal-type.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"literal-type.cjs","sources":["../../../src/application/transform/literal-type.ts"],"sourcesContent":["import {\n irArray,\n irBoolean,\n irKeyword,\n irNumber,\n irObject,\n irProperty,\n irRaw,\n irRecord,\n irString,\n irTuple,\n irTupleElement,\n} from \"../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../domain/ir/property-name.js\";\nimport { UNKNOWN_TYPE } from \"./shared-types.js\";\n\nfunction objectLiteralType(value: object): IrType {\n const members = Object.entries(value).map(([key, entry]) =>\n irProperty(toPropertyName(key), literalType(entry)),\n );\n return members.length > 0 ? irObject(members) : irRecord(irKeyword(\"string\"), irKeyword(\"never\"));\n}\n\nfunction arrayLiteralType(value: readonly unknown[]): IrType {\n return value.length === 0\n ? irArray(irKeyword(\"never\"))\n : irTuple(value.map((item) => irTupleElement(literalType(item))));\n}\n\n/**\n * The literal type of a JSON value (the original `tsLiteral`): strings as JSON text, arrays as\n * tuples (an empty one as `never[]`), objects as object types (an empty one as\n * `Record<string, never>`), and anything else (`undefined`, functions) as `unknown`.\n */\nexport function literalType(value: unknown): IrType {\n if (typeof value === \"string\") {\n return irString(value, \"json\");\n }\n if (typeof value === \"number\") {\n // YAML `.nan` and `.inf` have no literal type; the original prints them as `NaN`, `-Infinity`.\n return Number.isFinite(value) ? irNumber(value) : irRaw(String(value));\n }\n if (typeof value === \"boolean\") {\n return irBoolean(value);\n }\n if (value === null) {\n return irKeyword(\"null\");\n }\n if (Array.isArray(value)) {\n return arrayLiteralType(value);\n }\n return typeof value === \"object\" ? objectLiteralType(value) : UNKNOWN_TYPE;\n}\n"],"names":["irProperty","toPropertyName","irObject","irRecord","irKeyword","irArray","irTuple","irTupleElement","irString","irNumber","irRaw","irBoolean","UNKNOWN_TYPE"],"mappings":";;;;;;AAiBA,SAAS,kBAAkB,KAAA,EAAuB;AAChD,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,GAAA;AAAA,IAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KACpDA,uBAAA,CAAWC,2BAAA,CAAe,GAAG,CAAA,EAAG,WAAA,CAAY,KAAK,CAAC;AAAA,GACpD;AACA,EAAA,OAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAIC,qBAAA,CAAS,OAAO,CAAA,GAAIC,qBAAA,CAASC,sBAAA,CAAU,QAAQ,CAAA,EAAGA,sBAAA,CAAU,OAAO,CAAC,CAAA;AAClG;AAEA,SAAS,iBAAiB,KAAA,EAAmC;AAC3D,EAAA,OAAO,MAAM,MAAA,KAAW,CAAA,GACpBC,qBAAQD,sBAAA,CAAU,OAAO,CAAC,CAAA,GAC1BE,oBAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAASC,2BAAA,CAAe,YAAY,IAAI,CAAC,CAAC,CAAC,CAAA;AACpE;AAOO,SAAS,YAAY,KAAA,EAAwB;AAClD,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAOC,qBAAA,CAAS,OAAO,MAAM,CAAA;AAAA,EAC/B;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAE7B,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,GAAIC,qBAAA,CAAS,KAAK,CAAA,GAAIC,kBAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EACvE;AACA,EAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,IAAA,OAAOC,uBAAU,KAAK,CAAA;AAAA,EACxB;AACA,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,OAAOP,uBAAU,MAAM,CAAA;AAAA,EACzB;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,iBAAiB,KAAK,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,iBAAA,CAAkB,KAAK,CAAA,GAAIQ,wBAAA;AAChE;;"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { irString, irNumber, irRaw, irBoolean, irKeyword, irArray, irTuple, irTupleElement, irProperty, irObject, irRecord } from '../../domain/ir/constructors.mjs';
|
|
2
|
+
import { toPropertyName } from '../../domain/ir/property-name.mjs';
|
|
3
|
+
import { UNKNOWN_TYPE } from './shared-types.mjs';
|
|
4
|
+
|
|
5
|
+
function objectLiteralType(value) {
|
|
6
|
+
const members = Object.entries(value).map(
|
|
7
|
+
([key, entry]) => irProperty(toPropertyName(key), literalType(entry))
|
|
8
|
+
);
|
|
9
|
+
return members.length > 0 ? irObject(members) : irRecord(irKeyword("string"), irKeyword("never"));
|
|
10
|
+
}
|
|
11
|
+
function arrayLiteralType(value) {
|
|
12
|
+
return value.length === 0 ? irArray(irKeyword("never")) : irTuple(value.map((item) => irTupleElement(literalType(item))));
|
|
13
|
+
}
|
|
14
|
+
function literalType(value) {
|
|
15
|
+
if (typeof value === "string") {
|
|
16
|
+
return irString(value, "json");
|
|
17
|
+
}
|
|
18
|
+
if (typeof value === "number") {
|
|
19
|
+
return Number.isFinite(value) ? irNumber(value) : irRaw(String(value));
|
|
20
|
+
}
|
|
21
|
+
if (typeof value === "boolean") {
|
|
22
|
+
return irBoolean(value);
|
|
23
|
+
}
|
|
24
|
+
if (value === null) {
|
|
25
|
+
return irKeyword("null");
|
|
26
|
+
}
|
|
27
|
+
if (Array.isArray(value)) {
|
|
28
|
+
return arrayLiteralType(value);
|
|
29
|
+
}
|
|
30
|
+
return typeof value === "object" ? objectLiteralType(value) : UNKNOWN_TYPE;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export { literalType };
|
|
34
|
+
//# sourceMappingURL=literal-type.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"literal-type.mjs","sources":["../../../src/application/transform/literal-type.ts"],"sourcesContent":["import {\n irArray,\n irBoolean,\n irKeyword,\n irNumber,\n irObject,\n irProperty,\n irRaw,\n irRecord,\n irString,\n irTuple,\n irTupleElement,\n} from \"../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../domain/ir/property-name.js\";\nimport { UNKNOWN_TYPE } from \"./shared-types.js\";\n\nfunction objectLiteralType(value: object): IrType {\n const members = Object.entries(value).map(([key, entry]) =>\n irProperty(toPropertyName(key), literalType(entry)),\n );\n return members.length > 0 ? irObject(members) : irRecord(irKeyword(\"string\"), irKeyword(\"never\"));\n}\n\nfunction arrayLiteralType(value: readonly unknown[]): IrType {\n return value.length === 0\n ? irArray(irKeyword(\"never\"))\n : irTuple(value.map((item) => irTupleElement(literalType(item))));\n}\n\n/**\n * The literal type of a JSON value (the original `tsLiteral`): strings as JSON text, arrays as\n * tuples (an empty one as `never[]`), objects as object types (an empty one as\n * `Record<string, never>`), and anything else (`undefined`, functions) as `unknown`.\n */\nexport function literalType(value: unknown): IrType {\n if (typeof value === \"string\") {\n return irString(value, \"json\");\n }\n if (typeof value === \"number\") {\n // YAML `.nan` and `.inf` have no literal type; the original prints them as `NaN`, `-Infinity`.\n return Number.isFinite(value) ? irNumber(value) : irRaw(String(value));\n }\n if (typeof value === \"boolean\") {\n return irBoolean(value);\n }\n if (value === null) {\n return irKeyword(\"null\");\n }\n if (Array.isArray(value)) {\n return arrayLiteralType(value);\n }\n return typeof value === \"object\" ? objectLiteralType(value) : UNKNOWN_TYPE;\n}\n"],"names":[],"mappings":";;;;AAiBA,SAAS,kBAAkB,KAAA,EAAuB;AAChD,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,GAAA;AAAA,IAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KACpD,UAAA,CAAW,cAAA,CAAe,GAAG,CAAA,EAAG,WAAA,CAAY,KAAK,CAAC;AAAA,GACpD;AACA,EAAA,OAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,QAAA,CAAS,OAAO,CAAA,GAAI,QAAA,CAAS,SAAA,CAAU,QAAQ,CAAA,EAAG,SAAA,CAAU,OAAO,CAAC,CAAA;AAClG;AAEA,SAAS,iBAAiB,KAAA,EAAmC;AAC3D,EAAA,OAAO,MAAM,MAAA,KAAW,CAAA,GACpB,QAAQ,SAAA,CAAU,OAAO,CAAC,CAAA,GAC1B,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,cAAA,CAAe,YAAY,IAAI,CAAC,CAAC,CAAC,CAAA;AACpE;AAOO,SAAS,YAAY,KAAA,EAAwB;AAClD,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,QAAA,CAAS,OAAO,MAAM,CAAA;AAAA,EAC/B;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAE7B,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,GAAI,QAAA,CAAS,KAAK,CAAA,GAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EACvE;AACA,EAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,IAAA,OAAO,UAAU,KAAK,CAAA;AAAA,EACxB;AACA,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,OAAO,UAAU,MAAM,CAAA;AAAA,EACzB;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,iBAAiB,KAAK,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,iBAAA,CAAkB,KAAK,CAAA,GAAI,YAAA;AAChE;;"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function withNumberedRepeats(names, numbered) {
|
|
4
|
+
const written = new Set(names);
|
|
5
|
+
const taken = /* @__PURE__ */ new Set();
|
|
6
|
+
return names.map((name) => {
|
|
7
|
+
let unique = name;
|
|
8
|
+
for (let count = 2; taken.has(unique); count += 1) {
|
|
9
|
+
const candidate = numbered(name, count);
|
|
10
|
+
unique = written.has(candidate) ? unique : candidate;
|
|
11
|
+
}
|
|
12
|
+
taken.add(unique);
|
|
13
|
+
return unique;
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
exports.withNumberedRepeats = withNumberedRepeats;
|
|
18
|
+
//# sourceMappingURL=numbered-names.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"numbered-names.cjs","sources":["../../../src/application/transform/numbered-names.ts"],"sourcesContent":["/** Builds the name for the `count`-th use of `name` (2, 3…). */\nexport type NumberedName = (name: string, count: number) => string;\n\n/**\n * Names made unique, in order: the first use of a name keeps it, each repeat gets the lowest\n * number from 2 whose name is not written anywhere in the list.\n */\nexport function withNumberedRepeats(names: readonly string[], numbered: NumberedName): string[] {\n const written = new Set(names);\n const taken = new Set<string>();\n return names.map((name) => {\n let unique = name;\n for (let count = 2; taken.has(unique); count += 1) {\n const candidate = numbered(name, count);\n unique = written.has(candidate) ? unique : candidate;\n }\n taken.add(unique);\n return unique;\n });\n}\n"],"names":[],"mappings":";;AAOO,SAAS,mBAAA,CAAoB,OAA0B,QAAA,EAAkC;AAC9F,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,KAAK,CAAA;AAC7B,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,CAAM,IAAI,MAAM,CAAA,EAAG,SAAS,CAAA,EAAG;AACjD,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,IAAA,EAAM,KAAK,CAAA;AACtC,MAAA,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,GAAI,MAAA,GAAS,SAAA;AAAA,IAC7C;AACA,IAAA,KAAA,CAAM,IAAI,MAAM,CAAA;AAChB,IAAA,OAAO,MAAA;AAAA,EACT,CAAC,CAAA;AACH;;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
function withNumberedRepeats(names, numbered) {
|
|
2
|
+
const written = new Set(names);
|
|
3
|
+
const taken = /* @__PURE__ */ new Set();
|
|
4
|
+
return names.map((name) => {
|
|
5
|
+
let unique = name;
|
|
6
|
+
for (let count = 2; taken.has(unique); count += 1) {
|
|
7
|
+
const candidate = numbered(name, count);
|
|
8
|
+
unique = written.has(candidate) ? unique : candidate;
|
|
9
|
+
}
|
|
10
|
+
taken.add(unique);
|
|
11
|
+
return unique;
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export { withNumberedRepeats };
|
|
16
|
+
//# sourceMappingURL=numbered-names.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"numbered-names.mjs","sources":["../../../src/application/transform/numbered-names.ts"],"sourcesContent":["/** Builds the name for the `count`-th use of `name` (2, 3…). */\nexport type NumberedName = (name: string, count: number) => string;\n\n/**\n * Names made unique, in order: the first use of a name keeps it, each repeat gets the lowest\n * number from 2 whose name is not written anywhere in the list.\n */\nexport function withNumberedRepeats(names: readonly string[], numbered: NumberedName): string[] {\n const written = new Set(names);\n const taken = new Set<string>();\n return names.map((name) => {\n let unique = name;\n for (let count = 2; taken.has(unique); count += 1) {\n const candidate = numbered(name, count);\n unique = written.has(candidate) ? unique : candidate;\n }\n taken.add(unique);\n return unique;\n });\n}\n"],"names":[],"mappings":"AAOO,SAAS,mBAAA,CAAoB,OAA0B,QAAA,EAAkC;AAC9F,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,KAAK,CAAA;AAC7B,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,CAAM,IAAI,MAAM,CAAA,EAAG,SAAS,CAAA,EAAG;AACjD,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,IAAA,EAAM,KAAK,CAAA;AACtC,MAAA,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,GAAI,MAAA,GAAS,SAAA;AAAA,IAC7C;AACA,IAAA,KAAA,CAAM,IAAI,MAAM,CAAA;AAChB,IAAA,OAAO,MAAA;AAAA,EACT,CAAC,CAAA;AACH;;"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const errors = require('../../domain/errors.cjs');
|
|
4
|
+
const constructors = require('../../domain/ir/constructors.cjs');
|
|
5
|
+
const jsonPointer = require('../../domain/openapi/json-pointer.cjs');
|
|
6
|
+
|
|
7
|
+
class InvalidRefError extends errors.OpenAPITypesafeError {
|
|
8
|
+
constructor(ref) {
|
|
9
|
+
super({
|
|
10
|
+
code: errors.ERROR_CODES.SCHEMA_REF_INVALID,
|
|
11
|
+
message: `Error parsing $ref: ${ref}. Is this a valid $ref?`,
|
|
12
|
+
details: { ref }
|
|
13
|
+
});
|
|
14
|
+
this.name = "InvalidRefError";
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function indexBy(type, ...segments) {
|
|
18
|
+
return segments.reduce(
|
|
19
|
+
(object, segment) => constructors.irIndexedAccess(object, constructors.irString(segment, "escaped")),
|
|
20
|
+
type
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
function extractVariantsWith(type, propertyName) {
|
|
24
|
+
const probe = constructors.irProperty({ kind: "identifier", text: propertyName }, constructors.irKeyword("unknown"));
|
|
25
|
+
return constructors.irReference("Extract", [type, constructors.irObject([probe])]);
|
|
26
|
+
}
|
|
27
|
+
const DEFS_KEYWORD = "$defs";
|
|
28
|
+
function indexKeyword(type, segment, isLast) {
|
|
29
|
+
const indexed = indexBy(type, segment);
|
|
30
|
+
return segment === DEFS_KEYWORD && !isLast ? constructors.irReference("NonNullable", [indexed]) : indexed;
|
|
31
|
+
}
|
|
32
|
+
function rootType(rootSegment, isDeep) {
|
|
33
|
+
return constructors.irReference(isDeep ? `FlattenedDeepRequired<${rootSegment}>` : rootSegment);
|
|
34
|
+
}
|
|
35
|
+
function refType(ref, options = {}) {
|
|
36
|
+
const [rootSegment, ...pointer] = jsonPointer.parseRefPointer(ref);
|
|
37
|
+
if (rootSegment === void 0) {
|
|
38
|
+
throw new InvalidRefError(ref);
|
|
39
|
+
}
|
|
40
|
+
const extracted = new Set(options.extractProperties ?? []);
|
|
41
|
+
const lastIndex = pointer.length - 1;
|
|
42
|
+
const leading = indexBy(rootType(rootSegment, options.isDeep ?? false), ...pointer.slice(0, 2));
|
|
43
|
+
return pointer.slice(2).reduce((type, segment, offset) => {
|
|
44
|
+
if (segment === "properties") {
|
|
45
|
+
return type;
|
|
46
|
+
}
|
|
47
|
+
if (options.parameter && offset + 2 === lastIndex) {
|
|
48
|
+
return indexBy(type, options.parameter.in, options.parameter.name);
|
|
49
|
+
}
|
|
50
|
+
const isLast = offset + 2 === lastIndex;
|
|
51
|
+
return extracted.has(segment) ? indexBy(extractVariantsWith(type, segment), segment) : indexKeyword(type, segment, isLast);
|
|
52
|
+
}, leading);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
exports.InvalidRefError = InvalidRefError;
|
|
56
|
+
exports.refType = refType;
|
|
57
|
+
//# sourceMappingURL=ref-type.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ref-type.cjs","sources":["../../../src/application/transform/ref-type.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../../domain/errors.js\";\nimport {\n irIndexedAccess,\n irKeyword,\n irObject,\n irProperty,\n irReference,\n irString,\n} from \"../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../domain/ir/nodes.js\";\nimport { parseRefPointer } from \"../../domain/openapi/json-pointer.js\";\n\n/** Where a referenced parameter lives in the generated `parameters` type. */\nexport interface RefParameterTarget {\n readonly in: string;\n readonly name: string;\n}\n\nexport interface RefTypeOptions {\n /** Wrap the root in `FlattenedDeepRequired<…>`. */\n readonly isDeep?: boolean;\n /** Segments to narrow with `Extract<T, { segment: unknown }>` before indexing. */\n readonly extractProperties?: readonly string[];\n /** Set when the `$ref` resolves to a parameter object: its last segment indexes `in`, `name`. */\n readonly parameter?: RefParameterTarget | null;\n}\n\nexport class InvalidRefError extends OpenAPITypesafeError {\n constructor(ref: string) {\n super({\n code: ERROR_CODES.SCHEMA_REF_INVALID,\n message: `Error parsing $ref: ${ref}. Is this a valid $ref?`,\n details: { ref },\n });\n this.name = \"InvalidRefError\";\n }\n}\n\n/** Segments that index into the root type, always as escaped string literal types. */\nfunction indexBy(type: IrType, ...segments: readonly string[]): IrType {\n return segments.reduce<IrType>(\n (object, segment) => irIndexedAccess(object, irString(segment, \"escaped\")),\n type,\n );\n}\n\n/** `Extract<T, { name: unknown }>`; the name is written as an identifier, as in the original. */\nfunction extractVariantsWith(type: IrType, propertyName: string): IrType {\n const probe = irProperty({ kind: \"identifier\", text: propertyName }, irKeyword(\"unknown\"));\n return irReference(\"Extract\", [type, irObject([probe])]);\n}\n\nconst DEFS_KEYWORD = \"$defs\";\n\n/**\n * Index by `segment`. A `$defs` member is optional (it is a keyword, not data), so when more\n * segments follow it is wrapped in `NonNullable<…>` first; otherwise the next index fails on\n * `undefined` (upstream #2664).\n */\nfunction indexKeyword(type: IrType, segment: string, isLast: boolean): IrType {\n const indexed = indexBy(type, segment);\n return segment === DEFS_KEYWORD && !isLast ? irReference(\"NonNullable\", [indexed]) : indexed;\n}\n\nfunction rootType(rootSegment: string, isDeep: boolean): IrType {\n return irReference(isDeep ? `FlattenedDeepRequired<${rootSegment}>` : rootSegment);\n}\n\n/**\n * The indexed-access type of a `$ref` into the generated types (the original `oapiRef`), for\n * example `components[\"schemas\"][\"Foo\"]`. The first three segments index directly. After them,\n * `properties` segments are skipped (objects are flattened, upstream issue 1742), a parameter's\n * last segment becomes `[in][name]`, and listed segments are narrowed with `Extract` first.\n *\n * Throws InvalidRefError when the `$ref` has no pointer.\n */\nexport function refType(ref: string, options: RefTypeOptions = {}): IrType {\n const [rootSegment, ...pointer] = parseRefPointer(ref);\n if (rootSegment === undefined) {\n throw new InvalidRefError(ref);\n }\n const extracted = new Set(options.extractProperties ?? []);\n const lastIndex = pointer.length - 1;\n const leading = indexBy(rootType(rootSegment, options.isDeep ?? false), ...pointer.slice(0, 2));\n return pointer.slice(2).reduce<IrType>((type, segment, offset) => {\n if (segment === \"properties\") {\n return type;\n }\n if (options.parameter && offset + 2 === lastIndex) {\n return indexBy(type, options.parameter.in, options.parameter.name);\n }\n const isLast = offset + 2 === lastIndex;\n return extracted.has(segment)\n ? indexBy(extractVariantsWith(type, segment), segment)\n : indexKeyword(type, segment, isLast);\n }, leading);\n}\n"],"names":["OpenAPITypesafeError","ERROR_CODES","irIndexedAccess","irString","irProperty","irKeyword","irReference","irObject","parseRefPointer"],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { OpenAPITypesafeError, ERROR_CODES } from '../../domain/errors.mjs';
|
|
2
|
+
import { irIndexedAccess, irReference, irProperty, irKeyword, irObject, irString } from '../../domain/ir/constructors.mjs';
|
|
3
|
+
import { parseRefPointer } from '../../domain/openapi/json-pointer.mjs';
|
|
4
|
+
|
|
5
|
+
class InvalidRefError extends OpenAPITypesafeError {
|
|
6
|
+
constructor(ref) {
|
|
7
|
+
super({
|
|
8
|
+
code: ERROR_CODES.SCHEMA_REF_INVALID,
|
|
9
|
+
message: `Error parsing $ref: ${ref}. Is this a valid $ref?`,
|
|
10
|
+
details: { ref }
|
|
11
|
+
});
|
|
12
|
+
this.name = "InvalidRefError";
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function indexBy(type, ...segments) {
|
|
16
|
+
return segments.reduce(
|
|
17
|
+
(object, segment) => irIndexedAccess(object, irString(segment, "escaped")),
|
|
18
|
+
type
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
function extractVariantsWith(type, propertyName) {
|
|
22
|
+
const probe = irProperty({ kind: "identifier", text: propertyName }, irKeyword("unknown"));
|
|
23
|
+
return irReference("Extract", [type, irObject([probe])]);
|
|
24
|
+
}
|
|
25
|
+
const DEFS_KEYWORD = "$defs";
|
|
26
|
+
function indexKeyword(type, segment, isLast) {
|
|
27
|
+
const indexed = indexBy(type, segment);
|
|
28
|
+
return segment === DEFS_KEYWORD && !isLast ? irReference("NonNullable", [indexed]) : indexed;
|
|
29
|
+
}
|
|
30
|
+
function rootType(rootSegment, isDeep) {
|
|
31
|
+
return irReference(isDeep ? `FlattenedDeepRequired<${rootSegment}>` : rootSegment);
|
|
32
|
+
}
|
|
33
|
+
function refType(ref, options = {}) {
|
|
34
|
+
const [rootSegment, ...pointer] = parseRefPointer(ref);
|
|
35
|
+
if (rootSegment === void 0) {
|
|
36
|
+
throw new InvalidRefError(ref);
|
|
37
|
+
}
|
|
38
|
+
const extracted = new Set(options.extractProperties ?? []);
|
|
39
|
+
const lastIndex = pointer.length - 1;
|
|
40
|
+
const leading = indexBy(rootType(rootSegment, options.isDeep ?? false), ...pointer.slice(0, 2));
|
|
41
|
+
return pointer.slice(2).reduce((type, segment, offset) => {
|
|
42
|
+
if (segment === "properties") {
|
|
43
|
+
return type;
|
|
44
|
+
}
|
|
45
|
+
if (options.parameter && offset + 2 === lastIndex) {
|
|
46
|
+
return indexBy(type, options.parameter.in, options.parameter.name);
|
|
47
|
+
}
|
|
48
|
+
const isLast = offset + 2 === lastIndex;
|
|
49
|
+
return extracted.has(segment) ? indexBy(extractVariantsWith(type, segment), segment) : indexKeyword(type, segment, isLast);
|
|
50
|
+
}, leading);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export { InvalidRefError, refType };
|
|
54
|
+
//# sourceMappingURL=ref-type.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ref-type.mjs","sources":["../../../src/application/transform/ref-type.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../../domain/errors.js\";\nimport {\n irIndexedAccess,\n irKeyword,\n irObject,\n irProperty,\n irReference,\n irString,\n} from \"../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../domain/ir/nodes.js\";\nimport { parseRefPointer } from \"../../domain/openapi/json-pointer.js\";\n\n/** Where a referenced parameter lives in the generated `parameters` type. */\nexport interface RefParameterTarget {\n readonly in: string;\n readonly name: string;\n}\n\nexport interface RefTypeOptions {\n /** Wrap the root in `FlattenedDeepRequired<…>`. */\n readonly isDeep?: boolean;\n /** Segments to narrow with `Extract<T, { segment: unknown }>` before indexing. */\n readonly extractProperties?: readonly string[];\n /** Set when the `$ref` resolves to a parameter object: its last segment indexes `in`, `name`. */\n readonly parameter?: RefParameterTarget | null;\n}\n\nexport class InvalidRefError extends OpenAPITypesafeError {\n constructor(ref: string) {\n super({\n code: ERROR_CODES.SCHEMA_REF_INVALID,\n message: `Error parsing $ref: ${ref}. Is this a valid $ref?`,\n details: { ref },\n });\n this.name = \"InvalidRefError\";\n }\n}\n\n/** Segments that index into the root type, always as escaped string literal types. */\nfunction indexBy(type: IrType, ...segments: readonly string[]): IrType {\n return segments.reduce<IrType>(\n (object, segment) => irIndexedAccess(object, irString(segment, \"escaped\")),\n type,\n );\n}\n\n/** `Extract<T, { name: unknown }>`; the name is written as an identifier, as in the original. */\nfunction extractVariantsWith(type: IrType, propertyName: string): IrType {\n const probe = irProperty({ kind: \"identifier\", text: propertyName }, irKeyword(\"unknown\"));\n return irReference(\"Extract\", [type, irObject([probe])]);\n}\n\nconst DEFS_KEYWORD = \"$defs\";\n\n/**\n * Index by `segment`. A `$defs` member is optional (it is a keyword, not data), so when more\n * segments follow it is wrapped in `NonNullable<…>` first; otherwise the next index fails on\n * `undefined` (upstream #2664).\n */\nfunction indexKeyword(type: IrType, segment: string, isLast: boolean): IrType {\n const indexed = indexBy(type, segment);\n return segment === DEFS_KEYWORD && !isLast ? irReference(\"NonNullable\", [indexed]) : indexed;\n}\n\nfunction rootType(rootSegment: string, isDeep: boolean): IrType {\n return irReference(isDeep ? `FlattenedDeepRequired<${rootSegment}>` : rootSegment);\n}\n\n/**\n * The indexed-access type of a `$ref` into the generated types (the original `oapiRef`), for\n * example `components[\"schemas\"][\"Foo\"]`. The first three segments index directly. After them,\n * `properties` segments are skipped (objects are flattened, upstream issue 1742), a parameter's\n * last segment becomes `[in][name]`, and listed segments are narrowed with `Extract` first.\n *\n * Throws InvalidRefError when the `$ref` has no pointer.\n */\nexport function refType(ref: string, options: RefTypeOptions = {}): IrType {\n const [rootSegment, ...pointer] = parseRefPointer(ref);\n if (rootSegment === undefined) {\n throw new InvalidRefError(ref);\n }\n const extracted = new Set(options.extractProperties ?? []);\n const lastIndex = pointer.length - 1;\n const leading = indexBy(rootType(rootSegment, options.isDeep ?? false), ...pointer.slice(0, 2));\n return pointer.slice(2).reduce<IrType>((type, segment, offset) => {\n if (segment === \"properties\") {\n return type;\n }\n if (options.parameter && offset + 2 === lastIndex) {\n return indexBy(type, options.parameter.in, options.parameter.name);\n }\n const isLast = offset + 2 === lastIndex;\n return extracted.has(segment)\n ? indexBy(extractVariantsWith(type, segment), segment)\n : indexKeyword(type, segment, isLast);\n }, leading);\n}\n"],"names":[],"mappings":";;;;AA2BO,MAAM,wBAAwB,oBAAA,CAAqB;AAAA,EACxD,YAAY,GAAA,EAAa;AACvB,IAAA,KAAA,CAAM;AAAA,MACJ,MAAM,WAAA,CAAY,kBAAA;AAAA,MAClB,OAAA,EAAS,uBAAuB,GAAG,CAAA,uBAAA,CAAA;AAAA,MACnC,OAAA,EAAS,EAAE,GAAA;AAAI,KAChB,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AAGA,SAAS,OAAA,CAAQ,SAAiB,QAAA,EAAqC;AACrE,EAAA,OAAO,QAAA,CAAS,MAAA;AAAA,IACd,CAAC,QAAQ,OAAA,KAAY,eAAA,CAAgB,QAAQ,QAAA,CAAS,OAAA,EAAS,SAAS,CAAC,CAAA;AAAA,IACzE;AAAA,GACF;AACF;AAGA,SAAS,mBAAA,CAAoB,MAAc,YAAA,EAA8B;AACvE,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,EAAE,IAAA,EAAM,YAAA,EAAc,MAAM,YAAA,EAAa,EAAG,SAAA,CAAU,SAAS,CAAC,CAAA;AACzF,EAAA,OAAO,WAAA,CAAY,WAAW,CAAC,IAAA,EAAM,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AACzD;AAEA,MAAM,YAAA,GAAe,OAAA;AAOrB,SAAS,YAAA,CAAa,IAAA,EAAc,OAAA,EAAiB,MAAA,EAAyB;AAC5E,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA;AACrC,EAAA,OAAO,OAAA,KAAY,gBAAgB,CAAC,MAAA,GAAS,YAAY,aAAA,EAAe,CAAC,OAAO,CAAC,CAAA,GAAI,OAAA;AACvF;AAEA,SAAS,QAAA,CAAS,aAAqB,MAAA,EAAyB;AAC9D,EAAA,OAAO,WAAA,CAAY,MAAA,GAAS,CAAA,sBAAA,EAAyB,WAAW,MAAM,WAAW,CAAA;AACnF;AAUO,SAAS,OAAA,CAAQ,GAAA,EAAa,OAAA,GAA0B,EAAC,EAAW;AACzE,EAAA,MAAM,CAAC,WAAA,EAAa,GAAG,OAAO,CAAA,GAAI,gBAAgB,GAAG,CAAA;AACrD,EAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,IAAA,MAAM,IAAI,gBAAgB,GAAG,CAAA;AAAA,EAC/B;AACA,EAAA,MAAM,YAAY,IAAI,GAAA,CAAI,OAAA,CAAQ,iBAAA,IAAqB,EAAE,CAAA;AACzD,EAAA,MAAM,SAAA,GAAY,QAAQ,MAAA,GAAS,CAAA;AACnC,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,QAAA,CAAS,WAAA,EAAa,OAAA,CAAQ,MAAA,IAAU,KAAK,CAAA,EAAG,GAAG,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAC9F,EAAA,OAAO,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAE,OAAe,CAAC,IAAA,EAAM,SAAS,MAAA,KAAW;AAChE,IAAA,IAAI,YAAY,YAAA,EAAc;AAC5B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,OAAA,CAAQ,SAAA,IAAa,MAAA,GAAS,CAAA,KAAM,SAAA,EAAW;AACjD,MAAA,OAAO,QAAQ,IAAA,EAAM,OAAA,CAAQ,UAAU,EAAA,EAAI,OAAA,CAAQ,UAAU,IAAI,CAAA;AAAA,IACnE;AACA,IAAA,MAAM,MAAA,GAAS,SAAS,CAAA,KAAM,SAAA;AAC9B,IAAA,OAAO,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA,GACxB,QAAQ,mBAAA,CAAoB,IAAA,EAAM,OAAO,CAAA,EAAG,OAAO,CAAA,GACnD,YAAA,CAAa,IAAA,EAAM,SAAS,MAAM,CAAA;AAAA,EACxC,GAAG,OAAO,CAAA;AACZ;;"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const constructors = require('../../../domain/ir/constructors.cjs');
|
|
4
|
+
const outputFixes = require('../../../domain/output-fixes.cjs');
|
|
5
|
+
const sharedTypes = require('../shared-types.cjs');
|
|
6
|
+
const typeCombinators = require('../type-combinators.cjs');
|
|
7
|
+
|
|
8
|
+
const MAX_LENGTH_TUPLE_ELEMENTS = 30;
|
|
9
|
+
function prefixTupleType(schema, request) {
|
|
10
|
+
const { items } = schema;
|
|
11
|
+
if (!schema.prefixItems && !Array.isArray(items)) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
const prefixItems = schema.prefixItems ?? items;
|
|
15
|
+
return constructors.irTuple(
|
|
16
|
+
prefixItems.map((item) => constructors.irTupleElement(request.transformNested(item, request.location)))
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
function singleItemType(schema, request) {
|
|
20
|
+
const { items } = schema;
|
|
21
|
+
return items ? request.transformNested(items, request.location) : sharedTypes.UNKNOWN_TYPE;
|
|
22
|
+
}
|
|
23
|
+
function itemType(schema, request) {
|
|
24
|
+
const tuple = prefixTupleType(schema, request);
|
|
25
|
+
if (tuple !== null) {
|
|
26
|
+
return tuple;
|
|
27
|
+
}
|
|
28
|
+
const { items } = schema;
|
|
29
|
+
if (!items) {
|
|
30
|
+
return sharedTypes.UNKNOWN_TYPE;
|
|
31
|
+
}
|
|
32
|
+
const nested = singleItemType(schema, request);
|
|
33
|
+
const isNestedArray = typeof items === "object" && "type" in items && items.type === "array";
|
|
34
|
+
return isNestedArray ? constructors.irArray(nested) : nested;
|
|
35
|
+
}
|
|
36
|
+
function repeat(type, count) {
|
|
37
|
+
return Array.from({ length: count }, () => type);
|
|
38
|
+
}
|
|
39
|
+
function lengthBounds(schema) {
|
|
40
|
+
const { minItems, maxItems } = schema;
|
|
41
|
+
const min = typeof minItems === "number" && minItems >= 0 ? minItems : 0;
|
|
42
|
+
const isMaxValid = typeof maxItems === "number" && maxItems >= 0 && min <= maxItems;
|
|
43
|
+
return { min, max: isMaxValid ? maxItems : void 0 };
|
|
44
|
+
}
|
|
45
|
+
function lengthTupleType(schema, item, bounds) {
|
|
46
|
+
const { min, max } = bounds;
|
|
47
|
+
if (min === max) {
|
|
48
|
+
return typeCombinators.unionOf([constructors.irTuple(repeat(item, min).map((type) => constructors.irTupleElement(type)))]);
|
|
49
|
+
}
|
|
50
|
+
if (schema.maxItems > 0) {
|
|
51
|
+
const lengths = Array.from({ length: Math.max(0, (max ?? 0) - min + 1) }, (_, index) => index);
|
|
52
|
+
return typeCombinators.unionOf(
|
|
53
|
+
lengths.map((length) => constructors.irTuple(repeat(item, length).map((type) => constructors.irTupleElement(type))))
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
const elements = repeat(item, min).map((type) => constructors.irTupleElement(type));
|
|
57
|
+
return constructors.irTuple([...elements, constructors.irTupleElement(constructors.irArray(item), true)]);
|
|
58
|
+
}
|
|
59
|
+
function isLengthTupleWanted(bounds, request) {
|
|
60
|
+
const { min, max } = bounds;
|
|
61
|
+
const estimatedSize = max === void 0 ? min : (max * (max + 1) - min * (min - 1)) / 2;
|
|
62
|
+
const hasBounds = min !== 0 || max !== void 0;
|
|
63
|
+
return request.context.options.arrayLength && hasBounds && estimatedSize < MAX_LENGTH_TUPLE_ELEMENTS;
|
|
64
|
+
}
|
|
65
|
+
function tupleOf(item, length, isOpen) {
|
|
66
|
+
const elements = repeat(item, length).map((type) => constructors.irTupleElement(type));
|
|
67
|
+
return constructors.irTuple(isOpen ? [...elements, constructors.irTupleElement(constructors.irArray(item), true)] : elements);
|
|
68
|
+
}
|
|
69
|
+
function fixedLengthTupleType(item, bounds, wrap) {
|
|
70
|
+
const { min, max } = bounds;
|
|
71
|
+
if (max === void 0) {
|
|
72
|
+
return wrap(tupleOf(item, min, true));
|
|
73
|
+
}
|
|
74
|
+
const lengths = Array.from({ length: max - min + 1 }, (_, index) => min + index);
|
|
75
|
+
return typeCombinators.unionOf(lengths.map((length) => wrap(tupleOf(item, length, false))));
|
|
76
|
+
}
|
|
77
|
+
function fixedArrayType(schema, request) {
|
|
78
|
+
const wrap = (type) => request.context.options.immutable ? constructors.irReadonly(type) : type;
|
|
79
|
+
const tuple = prefixTupleType(schema, request);
|
|
80
|
+
if (tuple !== null) {
|
|
81
|
+
return wrap(tuple);
|
|
82
|
+
}
|
|
83
|
+
const item = singleItemType(schema, request);
|
|
84
|
+
const bounds = lengthBounds(schema);
|
|
85
|
+
return isLengthTupleWanted(bounds, request) ? fixedLengthTupleType(item, bounds, wrap) : wrap(constructors.irArray(item));
|
|
86
|
+
}
|
|
87
|
+
function isArrayLengthFixed(request) {
|
|
88
|
+
const { arrayLength, fixes } = request.context.options;
|
|
89
|
+
return arrayLength && fixes.has(outputFixes.OutputFix.ARRAY_LENGTH_TUPLES);
|
|
90
|
+
}
|
|
91
|
+
function arrayType(schema, request) {
|
|
92
|
+
if (isArrayLengthFixed(request)) {
|
|
93
|
+
return fixedArrayType(schema, request);
|
|
94
|
+
}
|
|
95
|
+
const item = itemType(schema, request);
|
|
96
|
+
const bounds = lengthBounds(schema);
|
|
97
|
+
if (isLengthTupleWanted(bounds, request)) {
|
|
98
|
+
return lengthTupleType(schema, item, bounds);
|
|
99
|
+
}
|
|
100
|
+
const type = item.kind === "tuple" || item.kind === "array" ? item : constructors.irArray(item);
|
|
101
|
+
return request.context.options.immutable ? constructors.irReadonly(type) : type;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
exports.arrayType = arrayType;
|
|
105
|
+
//# sourceMappingURL=array-type.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array-type.cjs","sources":["../../../../src/application/transform/schema/array-type.ts"],"sourcesContent":["import { irArray, irReadonly, irTuple, irTupleElement } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport type { SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { OutputFix } from \"../../../domain/output-fixes.js\";\nimport { UNKNOWN_TYPE } from \"../shared-types.js\";\nimport { unionOf } from \"../type-combinators.js\";\nimport type { SchemaRequest } from \"./schema-rule.js\";\n\n/**\n * `--array-length` writes tuples only while the estimated number of tuple elements stays below\n * this; the original chose it as roughly where TypeScript starts to struggle with tuple inference.\n */\nconst MAX_LENGTH_TUPLE_ELEMENTS = 30;\n\n/** The tuple of `prefixItems` (or of an `items` list); null without either. */\nfunction prefixTupleType(schema: SchemaObject, request: SchemaRequest): IrType | null {\n const { items } = schema;\n if (!schema.prefixItems && !Array.isArray(items)) {\n return null;\n }\n const prefixItems = schema.prefixItems ?? (items as SchemaObject[]);\n return irTuple(\n prefixItems.map((item) => irTupleElement(request.transformNested(item, request.location))),\n );\n}\n\n/** The type of one item; `unknown` without `items`. */\nfunction singleItemType(schema: SchemaObject, request: SchemaRequest): IrType {\n const { items } = schema;\n return items ? request.transformNested(items as SchemaObject, request.location) : UNKNOWN_TYPE;\n}\n\n/**\n * The item type as the original returns it: a tuple stands for the whole array, and a nested\n * `type: array` item is wrapped in an array here already.\n */\nfunction itemType(schema: SchemaObject, request: SchemaRequest): IrType {\n const tuple = prefixTupleType(schema, request);\n if (tuple !== null) {\n return tuple;\n }\n const { items } = schema;\n // Checked first: the `in` test below throws for `items: null`.\n if (!items) {\n return UNKNOWN_TYPE;\n }\n const nested = singleItemType(schema, request);\n const isNestedArray = typeof items === \"object\" && \"type\" in items && items.type === \"array\";\n return isNestedArray ? irArray(nested) : nested;\n}\n\nfunction repeat(type: IrType, count: number): IrType[] {\n return Array.from({ length: count }, () => type);\n}\n\ninterface LengthBounds {\n readonly min: number;\n readonly max: number | undefined;\n}\n\nfunction lengthBounds(schema: SchemaObject): LengthBounds {\n const { minItems, maxItems } = schema;\n const min = typeof minItems === \"number\" && minItems >= 0 ? minItems : 0;\n const isMaxValid = typeof maxItems === \"number\" && maxItems >= 0 && min <= maxItems;\n return { min, max: isMaxValid ? maxItems : undefined };\n}\n\n/**\n * Tuples for `--array-length`, as the original builds them. With both bounds it emits tuples of\n * length 0 to `max - min` (not `min` to `max`); the `array-length-tuples` fix corrects it.\n */\nfunction lengthTupleType(schema: SchemaObject, item: IrType, bounds: LengthBounds): IrType {\n const { min, max } = bounds;\n if (min === max) {\n return unionOf([irTuple(repeat(item, min).map((type) => irTupleElement(type)))]);\n }\n if ((schema.maxItems as number) > 0) {\n const lengths = Array.from({ length: Math.max(0, (max ?? 0) - min + 1) }, (_, index) => index);\n return unionOf(\n lengths.map((length) => irTuple(repeat(item, length).map((type) => irTupleElement(type)))),\n );\n }\n const elements = repeat(item, min).map((type) => irTupleElement(type));\n return irTuple([...elements, irTupleElement(irArray(item), true)]);\n}\n\nfunction isLengthTupleWanted(bounds: LengthBounds, request: SchemaRequest): boolean {\n const { min, max } = bounds;\n const estimatedSize = max === undefined ? min : (max * (max + 1) - min * (min - 1)) / 2;\n const hasBounds = min !== 0 || max !== undefined;\n return (\n request.context.options.arrayLength && hasBounds && estimatedSize < MAX_LENGTH_TUPLE_ELEMENTS\n );\n}\n\n/** Applies `--immutable` to one array or tuple type. */\ntype ArrayWrapper = (type: IrType) => IrType;\n\nfunction tupleOf(item: IrType, length: number, isOpen: boolean): IrType {\n const elements = repeat(item, length).map((type) => irTupleElement(type));\n return irTuple(isOpen ? [...elements, irTupleElement(irArray(item), true)] : elements);\n}\n\n/** Tuples of every length from `min` to `max`; without `max`, `min` items and a rest element. */\nfunction fixedLengthTupleType(item: IrType, bounds: LengthBounds, wrap: ArrayWrapper): IrType {\n const { min, max } = bounds;\n if (max === undefined) {\n return wrap(tupleOf(item, min, true));\n }\n const lengths = Array.from({ length: max - min + 1 }, (_, index) => min + index);\n return unionOf(lengths.map((length) => wrap(tupleOf(item, length, false))));\n}\n\n/**\n * `type: array` with `--array-length` and the `array-length-tuples` fix (#2048, #2330, #2546):\n * the tuples have `min` to `max` items, the item type is used as it is (a nested array stays one\n * level deep), a `prefixItems` tuple gets no length tuples around it, and `--immutable` makes\n * every tuple `readonly`.\n */\nfunction fixedArrayType(schema: SchemaObject, request: SchemaRequest): IrType {\n const wrap: ArrayWrapper = (type) =>\n request.context.options.immutable ? irReadonly(type) : type;\n const tuple = prefixTupleType(schema, request);\n if (tuple !== null) {\n return wrap(tuple);\n }\n const item = singleItemType(schema, request);\n const bounds = lengthBounds(schema);\n return isLengthTupleWanted(bounds, request)\n ? fixedLengthTupleType(item, bounds, wrap)\n : wrap(irArray(item));\n}\n\nfunction isArrayLengthFixed(request: SchemaRequest): boolean {\n const { arrayLength, fixes } = request.context.options;\n return arrayLength && fixes.has(OutputFix.ARRAY_LENGTH_TUPLES);\n}\n\n/** `type: array`, including tuples (`prefixItems`, array `items`) and `--array-length`. */\nexport function arrayType(schema: SchemaObject, request: SchemaRequest): IrType {\n if (isArrayLengthFixed(request)) {\n return fixedArrayType(schema, request);\n }\n const item = itemType(schema, request);\n const bounds = lengthBounds(schema);\n if (isLengthTupleWanted(bounds, request)) {\n return lengthTupleType(schema, item, bounds);\n }\n // A tuple or an array item is used as the array type itself.\n const type = item.kind === \"tuple\" || item.kind === \"array\" ? item : irArray(item);\n return request.context.options.immutable ? irReadonly(type) : type;\n}\n"],"names":["irTuple","irTupleElement","UNKNOWN_TYPE","irArray","unionOf","irReadonly","OutputFix"],"mappings":";;;;;;;AAYA,MAAM,yBAAA,GAA4B,EAAA;AAGlC,SAAS,eAAA,CAAgB,QAAsB,OAAA,EAAuC;AACpF,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAClB,EAAA,IAAI,CAAC,MAAA,CAAO,WAAA,IAAe,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAA,GAAc,OAAO,WAAA,IAAgB,KAAA;AAC3C,EAAA,OAAOA,oBAAA;AAAA,IACL,WAAA,CAAY,GAAA,CAAI,CAAC,IAAA,KAASC,2BAAA,CAAe,OAAA,CAAQ,eAAA,CAAgB,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAC,CAAC;AAAA,GAC3F;AACF;AAGA,SAAS,cAAA,CAAe,QAAsB,OAAA,EAAgC;AAC5E,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAClB,EAAA,OAAO,QAAQ,OAAA,CAAQ,eAAA,CAAgB,KAAA,EAAuB,OAAA,CAAQ,QAAQ,CAAA,GAAIC,wBAAA;AACpF;AAMA,SAAS,QAAA,CAAS,QAAsB,OAAA,EAAgC;AACtE,EAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,MAAA,EAAQ,OAAO,CAAA;AAC7C,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAElB,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAOA,wBAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,MAAA,EAAQ,OAAO,CAAA;AAC7C,EAAA,MAAM,gBAAgB,OAAO,KAAA,KAAU,YAAY,MAAA,IAAU,KAAA,IAAS,MAAM,IAAA,KAAS,OAAA;AACrF,EAAA,OAAO,aAAA,GAAgBC,oBAAA,CAAQ,MAAM,CAAA,GAAI,MAAA;AAC3C;AAEA,SAAS,MAAA,CAAO,MAAc,KAAA,EAAyB;AACrD,EAAA,OAAO,MAAM,IAAA,CAAK,EAAE,QAAQ,KAAA,EAAM,EAAG,MAAM,IAAI,CAAA;AACjD;AAOA,SAAS,aAAa,MAAA,EAAoC;AACxD,EAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAS,GAAI,MAAA;AAC/B,EAAA,MAAM,MAAM,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,IAAY,IAAI,QAAA,GAAW,CAAA;AACvE,EAAA,MAAM,aAAa,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,IAAY,KAAK,GAAA,IAAO,QAAA;AAC3E,EAAA,OAAO,EAAE,GAAA,EAAK,GAAA,EAAK,UAAA,GAAa,WAAW,MAAA,EAAU;AACvD;AAMA,SAAS,eAAA,CAAgB,MAAA,EAAsB,IAAA,EAAc,MAAA,EAA8B;AACzF,EAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,MAAA;AACrB,EAAA,IAAI,QAAQ,GAAA,EAAK;AACf,IAAA,OAAOC,uBAAA,CAAQ,CAACJ,oBAAA,CAAQ,MAAA,CAAO,MAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,SAASC,2BAAA,CAAe,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;AAAA,EACjF;AACA,EAAA,IAAK,MAAA,CAAO,WAAsB,CAAA,EAAG;AACnC,IAAA,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAK,GAAA,CAAI,CAAA,EAAA,CAAI,GAAA,IAAO,CAAA,IAAK,MAAM,CAAC,CAAA,IAAK,CAAC,CAAA,EAAG,UAAU,KAAK,CAAA;AAC7F,IAAA,OAAOG,uBAAA;AAAA,MACL,QAAQ,GAAA,CAAI,CAAC,MAAA,KAAWJ,oBAAA,CAAQ,OAAO,IAAA,EAAM,MAAM,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAASC,2BAAA,CAAe,IAAI,CAAC,CAAC,CAAC;AAAA,KAC3F;AAAA,EACF;AACA,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,EAAM,GAAG,CAAA,CAAE,IAAI,CAAC,IAAA,KAASA,2BAAA,CAAe,IAAI,CAAC,CAAA;AACrE,EAAA,OAAOD,oBAAA,CAAQ,CAAC,GAAG,QAAA,EAAUC,2BAAA,CAAeE,qBAAQ,IAAI,CAAA,EAAG,IAAI,CAAC,CAAC,CAAA;AACnE;AAEA,SAAS,mBAAA,CAAoB,QAAsB,OAAA,EAAiC;AAClF,EAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,MAAA;AACrB,EAAA,MAAM,aAAA,GAAgB,QAAQ,MAAA,GAAY,GAAA,GAAA,CAAO,OAAO,GAAA,GAAM,CAAA,CAAA,GAAK,GAAA,IAAO,GAAA,GAAM,CAAA,CAAA,IAAM,CAAA;AACtF,EAAA,MAAM,SAAA,GAAY,GAAA,KAAQ,CAAA,IAAK,GAAA,KAAQ,MAAA;AACvC,EAAA,OACE,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,WAAA,IAAe,aAAa,aAAA,GAAgB,yBAAA;AAExE;AAKA,SAAS,OAAA,CAAQ,IAAA,EAAc,MAAA,EAAgB,MAAA,EAAyB;AACtE,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA,CAAE,IAAI,CAAC,IAAA,KAASF,2BAAA,CAAe,IAAI,CAAC,CAAA;AACxE,EAAA,OAAOD,oBAAA,CAAQ,MAAA,GAAS,CAAC,GAAG,QAAA,EAAUC,2BAAA,CAAeE,oBAAA,CAAQ,IAAI,CAAA,EAAG,IAAI,CAAC,CAAA,GAAI,QAAQ,CAAA;AACvF;AAGA,SAAS,oBAAA,CAAqB,IAAA,EAAc,MAAA,EAAsB,IAAA,EAA4B;AAC5F,EAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,MAAA;AACrB,EAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,GAAA,EAAK,IAAI,CAAC,CAAA;AAAA,EACtC;AACA,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,GAAA,GAAM,GAAA,GAAM,CAAA,EAAE,EAAG,CAAC,CAAA,EAAG,KAAA,KAAU,MAAM,KAAK,CAAA;AAC/E,EAAA,OAAOC,uBAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAC,CAAC,CAAC,CAAA;AAC5E;AAQA,SAAS,cAAA,CAAe,QAAsB,OAAA,EAAgC;AAC5E,EAAA,MAAM,IAAA,GAAqB,CAAC,IAAA,KAC1B,OAAA,CAAQ,QAAQ,OAAA,CAAQ,SAAA,GAAYC,uBAAA,CAAW,IAAI,CAAA,GAAI,IAAA;AACzD,EAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,MAAA,EAAQ,OAAO,CAAA;AAC7C,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,OAAO,KAAK,KAAK,CAAA;AAAA,EACnB;AACA,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,MAAA,EAAQ,OAAO,CAAA;AAC3C,EAAA,MAAM,MAAA,GAAS,aAAa,MAAM,CAAA;AAClC,EAAA,OAAO,mBAAA,CAAoB,MAAA,EAAQ,OAAO,CAAA,GACtC,oBAAA,CAAqB,IAAA,EAAM,MAAA,EAAQ,IAAI,CAAA,GACvC,IAAA,CAAKF,oBAAA,CAAQ,IAAI,CAAC,CAAA;AACxB;AAEA,SAAS,mBAAmB,OAAA,EAAiC;AAC3D,EAAA,MAAM,EAAE,WAAA,EAAa,KAAA,EAAM,GAAI,QAAQ,OAAA,CAAQ,OAAA;AAC/C,EAAA,OAAO,WAAA,IAAe,KAAA,CAAM,GAAA,CAAIG,qBAAA,CAAU,mBAAmB,CAAA;AAC/D;AAGO,SAAS,SAAA,CAAU,QAAsB,OAAA,EAAgC;AAC9E,EAAA,IAAI,kBAAA,CAAmB,OAAO,CAAA,EAAG;AAC/B,IAAA,OAAO,cAAA,CAAe,QAAQ,OAAO,CAAA;AAAA,EACvC;AACA,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,MAAA,EAAQ,OAAO,CAAA;AACrC,EAAA,MAAM,MAAA,GAAS,aAAa,MAAM,CAAA;AAClC,EAAA,IAAI,mBAAA,CAAoB,MAAA,EAAQ,OAAO,CAAA,EAAG;AACxC,IAAA,OAAO,eAAA,CAAgB,MAAA,EAAQ,IAAA,EAAM,MAAM,CAAA;AAAA,EAC7C;AAEA,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,KAAS,OAAA,IAAW,KAAK,IAAA,KAAS,OAAA,GAAU,IAAA,GAAOH,oBAAA,CAAQ,IAAI,CAAA;AACjF,EAAA,OAAO,QAAQ,OAAA,CAAQ,OAAA,CAAQ,SAAA,GAAYE,uBAAA,CAAW,IAAI,CAAA,GAAI,IAAA;AAChE;;"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { irArray, irReadonly, irTuple, irTupleElement } from '../../../domain/ir/constructors.mjs';
|
|
2
|
+
import { OutputFix } from '../../../domain/output-fixes.mjs';
|
|
3
|
+
import { UNKNOWN_TYPE } from '../shared-types.mjs';
|
|
4
|
+
import { unionOf } from '../type-combinators.mjs';
|
|
5
|
+
|
|
6
|
+
const MAX_LENGTH_TUPLE_ELEMENTS = 30;
|
|
7
|
+
function prefixTupleType(schema, request) {
|
|
8
|
+
const { items } = schema;
|
|
9
|
+
if (!schema.prefixItems && !Array.isArray(items)) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
const prefixItems = schema.prefixItems ?? items;
|
|
13
|
+
return irTuple(
|
|
14
|
+
prefixItems.map((item) => irTupleElement(request.transformNested(item, request.location)))
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
function singleItemType(schema, request) {
|
|
18
|
+
const { items } = schema;
|
|
19
|
+
return items ? request.transformNested(items, request.location) : UNKNOWN_TYPE;
|
|
20
|
+
}
|
|
21
|
+
function itemType(schema, request) {
|
|
22
|
+
const tuple = prefixTupleType(schema, request);
|
|
23
|
+
if (tuple !== null) {
|
|
24
|
+
return tuple;
|
|
25
|
+
}
|
|
26
|
+
const { items } = schema;
|
|
27
|
+
if (!items) {
|
|
28
|
+
return UNKNOWN_TYPE;
|
|
29
|
+
}
|
|
30
|
+
const nested = singleItemType(schema, request);
|
|
31
|
+
const isNestedArray = typeof items === "object" && "type" in items && items.type === "array";
|
|
32
|
+
return isNestedArray ? irArray(nested) : nested;
|
|
33
|
+
}
|
|
34
|
+
function repeat(type, count) {
|
|
35
|
+
return Array.from({ length: count }, () => type);
|
|
36
|
+
}
|
|
37
|
+
function lengthBounds(schema) {
|
|
38
|
+
const { minItems, maxItems } = schema;
|
|
39
|
+
const min = typeof minItems === "number" && minItems >= 0 ? minItems : 0;
|
|
40
|
+
const isMaxValid = typeof maxItems === "number" && maxItems >= 0 && min <= maxItems;
|
|
41
|
+
return { min, max: isMaxValid ? maxItems : void 0 };
|
|
42
|
+
}
|
|
43
|
+
function lengthTupleType(schema, item, bounds) {
|
|
44
|
+
const { min, max } = bounds;
|
|
45
|
+
if (min === max) {
|
|
46
|
+
return unionOf([irTuple(repeat(item, min).map((type) => irTupleElement(type)))]);
|
|
47
|
+
}
|
|
48
|
+
if (schema.maxItems > 0) {
|
|
49
|
+
const lengths = Array.from({ length: Math.max(0, (max ?? 0) - min + 1) }, (_, index) => index);
|
|
50
|
+
return unionOf(
|
|
51
|
+
lengths.map((length) => irTuple(repeat(item, length).map((type) => irTupleElement(type))))
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
const elements = repeat(item, min).map((type) => irTupleElement(type));
|
|
55
|
+
return irTuple([...elements, irTupleElement(irArray(item), true)]);
|
|
56
|
+
}
|
|
57
|
+
function isLengthTupleWanted(bounds, request) {
|
|
58
|
+
const { min, max } = bounds;
|
|
59
|
+
const estimatedSize = max === void 0 ? min : (max * (max + 1) - min * (min - 1)) / 2;
|
|
60
|
+
const hasBounds = min !== 0 || max !== void 0;
|
|
61
|
+
return request.context.options.arrayLength && hasBounds && estimatedSize < MAX_LENGTH_TUPLE_ELEMENTS;
|
|
62
|
+
}
|
|
63
|
+
function tupleOf(item, length, isOpen) {
|
|
64
|
+
const elements = repeat(item, length).map((type) => irTupleElement(type));
|
|
65
|
+
return irTuple(isOpen ? [...elements, irTupleElement(irArray(item), true)] : elements);
|
|
66
|
+
}
|
|
67
|
+
function fixedLengthTupleType(item, bounds, wrap) {
|
|
68
|
+
const { min, max } = bounds;
|
|
69
|
+
if (max === void 0) {
|
|
70
|
+
return wrap(tupleOf(item, min, true));
|
|
71
|
+
}
|
|
72
|
+
const lengths = Array.from({ length: max - min + 1 }, (_, index) => min + index);
|
|
73
|
+
return unionOf(lengths.map((length) => wrap(tupleOf(item, length, false))));
|
|
74
|
+
}
|
|
75
|
+
function fixedArrayType(schema, request) {
|
|
76
|
+
const wrap = (type) => request.context.options.immutable ? irReadonly(type) : type;
|
|
77
|
+
const tuple = prefixTupleType(schema, request);
|
|
78
|
+
if (tuple !== null) {
|
|
79
|
+
return wrap(tuple);
|
|
80
|
+
}
|
|
81
|
+
const item = singleItemType(schema, request);
|
|
82
|
+
const bounds = lengthBounds(schema);
|
|
83
|
+
return isLengthTupleWanted(bounds, request) ? fixedLengthTupleType(item, bounds, wrap) : wrap(irArray(item));
|
|
84
|
+
}
|
|
85
|
+
function isArrayLengthFixed(request) {
|
|
86
|
+
const { arrayLength, fixes } = request.context.options;
|
|
87
|
+
return arrayLength && fixes.has(OutputFix.ARRAY_LENGTH_TUPLES);
|
|
88
|
+
}
|
|
89
|
+
function arrayType(schema, request) {
|
|
90
|
+
if (isArrayLengthFixed(request)) {
|
|
91
|
+
return fixedArrayType(schema, request);
|
|
92
|
+
}
|
|
93
|
+
const item = itemType(schema, request);
|
|
94
|
+
const bounds = lengthBounds(schema);
|
|
95
|
+
if (isLengthTupleWanted(bounds, request)) {
|
|
96
|
+
return lengthTupleType(schema, item, bounds);
|
|
97
|
+
}
|
|
98
|
+
const type = item.kind === "tuple" || item.kind === "array" ? item : irArray(item);
|
|
99
|
+
return request.context.options.immutable ? irReadonly(type) : type;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export { arrayType };
|
|
103
|
+
//# sourceMappingURL=array-type.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array-type.mjs","sources":["../../../../src/application/transform/schema/array-type.ts"],"sourcesContent":["import { irArray, irReadonly, irTuple, irTupleElement } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport type { SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { OutputFix } from \"../../../domain/output-fixes.js\";\nimport { UNKNOWN_TYPE } from \"../shared-types.js\";\nimport { unionOf } from \"../type-combinators.js\";\nimport type { SchemaRequest } from \"./schema-rule.js\";\n\n/**\n * `--array-length` writes tuples only while the estimated number of tuple elements stays below\n * this; the original chose it as roughly where TypeScript starts to struggle with tuple inference.\n */\nconst MAX_LENGTH_TUPLE_ELEMENTS = 30;\n\n/** The tuple of `prefixItems` (or of an `items` list); null without either. */\nfunction prefixTupleType(schema: SchemaObject, request: SchemaRequest): IrType | null {\n const { items } = schema;\n if (!schema.prefixItems && !Array.isArray(items)) {\n return null;\n }\n const prefixItems = schema.prefixItems ?? (items as SchemaObject[]);\n return irTuple(\n prefixItems.map((item) => irTupleElement(request.transformNested(item, request.location))),\n );\n}\n\n/** The type of one item; `unknown` without `items`. */\nfunction singleItemType(schema: SchemaObject, request: SchemaRequest): IrType {\n const { items } = schema;\n return items ? request.transformNested(items as SchemaObject, request.location) : UNKNOWN_TYPE;\n}\n\n/**\n * The item type as the original returns it: a tuple stands for the whole array, and a nested\n * `type: array` item is wrapped in an array here already.\n */\nfunction itemType(schema: SchemaObject, request: SchemaRequest): IrType {\n const tuple = prefixTupleType(schema, request);\n if (tuple !== null) {\n return tuple;\n }\n const { items } = schema;\n // Checked first: the `in` test below throws for `items: null`.\n if (!items) {\n return UNKNOWN_TYPE;\n }\n const nested = singleItemType(schema, request);\n const isNestedArray = typeof items === \"object\" && \"type\" in items && items.type === \"array\";\n return isNestedArray ? irArray(nested) : nested;\n}\n\nfunction repeat(type: IrType, count: number): IrType[] {\n return Array.from({ length: count }, () => type);\n}\n\ninterface LengthBounds {\n readonly min: number;\n readonly max: number | undefined;\n}\n\nfunction lengthBounds(schema: SchemaObject): LengthBounds {\n const { minItems, maxItems } = schema;\n const min = typeof minItems === \"number\" && minItems >= 0 ? minItems : 0;\n const isMaxValid = typeof maxItems === \"number\" && maxItems >= 0 && min <= maxItems;\n return { min, max: isMaxValid ? maxItems : undefined };\n}\n\n/**\n * Tuples for `--array-length`, as the original builds them. With both bounds it emits tuples of\n * length 0 to `max - min` (not `min` to `max`); the `array-length-tuples` fix corrects it.\n */\nfunction lengthTupleType(schema: SchemaObject, item: IrType, bounds: LengthBounds): IrType {\n const { min, max } = bounds;\n if (min === max) {\n return unionOf([irTuple(repeat(item, min).map((type) => irTupleElement(type)))]);\n }\n if ((schema.maxItems as number) > 0) {\n const lengths = Array.from({ length: Math.max(0, (max ?? 0) - min + 1) }, (_, index) => index);\n return unionOf(\n lengths.map((length) => irTuple(repeat(item, length).map((type) => irTupleElement(type)))),\n );\n }\n const elements = repeat(item, min).map((type) => irTupleElement(type));\n return irTuple([...elements, irTupleElement(irArray(item), true)]);\n}\n\nfunction isLengthTupleWanted(bounds: LengthBounds, request: SchemaRequest): boolean {\n const { min, max } = bounds;\n const estimatedSize = max === undefined ? min : (max * (max + 1) - min * (min - 1)) / 2;\n const hasBounds = min !== 0 || max !== undefined;\n return (\n request.context.options.arrayLength && hasBounds && estimatedSize < MAX_LENGTH_TUPLE_ELEMENTS\n );\n}\n\n/** Applies `--immutable` to one array or tuple type. */\ntype ArrayWrapper = (type: IrType) => IrType;\n\nfunction tupleOf(item: IrType, length: number, isOpen: boolean): IrType {\n const elements = repeat(item, length).map((type) => irTupleElement(type));\n return irTuple(isOpen ? [...elements, irTupleElement(irArray(item), true)] : elements);\n}\n\n/** Tuples of every length from `min` to `max`; without `max`, `min` items and a rest element. */\nfunction fixedLengthTupleType(item: IrType, bounds: LengthBounds, wrap: ArrayWrapper): IrType {\n const { min, max } = bounds;\n if (max === undefined) {\n return wrap(tupleOf(item, min, true));\n }\n const lengths = Array.from({ length: max - min + 1 }, (_, index) => min + index);\n return unionOf(lengths.map((length) => wrap(tupleOf(item, length, false))));\n}\n\n/**\n * `type: array` with `--array-length` and the `array-length-tuples` fix (#2048, #2330, #2546):\n * the tuples have `min` to `max` items, the item type is used as it is (a nested array stays one\n * level deep), a `prefixItems` tuple gets no length tuples around it, and `--immutable` makes\n * every tuple `readonly`.\n */\nfunction fixedArrayType(schema: SchemaObject, request: SchemaRequest): IrType {\n const wrap: ArrayWrapper = (type) =>\n request.context.options.immutable ? irReadonly(type) : type;\n const tuple = prefixTupleType(schema, request);\n if (tuple !== null) {\n return wrap(tuple);\n }\n const item = singleItemType(schema, request);\n const bounds = lengthBounds(schema);\n return isLengthTupleWanted(bounds, request)\n ? fixedLengthTupleType(item, bounds, wrap)\n : wrap(irArray(item));\n}\n\nfunction isArrayLengthFixed(request: SchemaRequest): boolean {\n const { arrayLength, fixes } = request.context.options;\n return arrayLength && fixes.has(OutputFix.ARRAY_LENGTH_TUPLES);\n}\n\n/** `type: array`, including tuples (`prefixItems`, array `items`) and `--array-length`. */\nexport function arrayType(schema: SchemaObject, request: SchemaRequest): IrType {\n if (isArrayLengthFixed(request)) {\n return fixedArrayType(schema, request);\n }\n const item = itemType(schema, request);\n const bounds = lengthBounds(schema);\n if (isLengthTupleWanted(bounds, request)) {\n return lengthTupleType(schema, item, bounds);\n }\n // A tuple or an array item is used as the array type itself.\n const type = item.kind === \"tuple\" || item.kind === \"array\" ? item : irArray(item);\n return request.context.options.immutable ? irReadonly(type) : type;\n}\n"],"names":[],"mappings":";;;;;AAYA,MAAM,yBAAA,GAA4B,EAAA;AAGlC,SAAS,eAAA,CAAgB,QAAsB,OAAA,EAAuC;AACpF,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAClB,EAAA,IAAI,CAAC,MAAA,CAAO,WAAA,IAAe,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAA,GAAc,OAAO,WAAA,IAAgB,KAAA;AAC3C,EAAA,OAAO,OAAA;AAAA,IACL,WAAA,CAAY,GAAA,CAAI,CAAC,IAAA,KAAS,cAAA,CAAe,OAAA,CAAQ,eAAA,CAAgB,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAC,CAAC;AAAA,GAC3F;AACF;AAGA,SAAS,cAAA,CAAe,QAAsB,OAAA,EAAgC;AAC5E,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAClB,EAAA,OAAO,QAAQ,OAAA,CAAQ,eAAA,CAAgB,KAAA,EAAuB,OAAA,CAAQ,QAAQ,CAAA,GAAI,YAAA;AACpF;AAMA,SAAS,QAAA,CAAS,QAAsB,OAAA,EAAgC;AACtE,EAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,MAAA,EAAQ,OAAO,CAAA;AAC7C,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAElB,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,YAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,MAAA,EAAQ,OAAO,CAAA;AAC7C,EAAA,MAAM,gBAAgB,OAAO,KAAA,KAAU,YAAY,MAAA,IAAU,KAAA,IAAS,MAAM,IAAA,KAAS,OAAA;AACrF,EAAA,OAAO,aAAA,GAAgB,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAA;AAC3C;AAEA,SAAS,MAAA,CAAO,MAAc,KAAA,EAAyB;AACrD,EAAA,OAAO,MAAM,IAAA,CAAK,EAAE,QAAQ,KAAA,EAAM,EAAG,MAAM,IAAI,CAAA;AACjD;AAOA,SAAS,aAAa,MAAA,EAAoC;AACxD,EAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAS,GAAI,MAAA;AAC/B,EAAA,MAAM,MAAM,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,IAAY,IAAI,QAAA,GAAW,CAAA;AACvE,EAAA,MAAM,aAAa,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,IAAY,KAAK,GAAA,IAAO,QAAA;AAC3E,EAAA,OAAO,EAAE,GAAA,EAAK,GAAA,EAAK,UAAA,GAAa,WAAW,MAAA,EAAU;AACvD;AAMA,SAAS,eAAA,CAAgB,MAAA,EAAsB,IAAA,EAAc,MAAA,EAA8B;AACzF,EAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,MAAA;AACrB,EAAA,IAAI,QAAQ,GAAA,EAAK;AACf,IAAA,OAAO,OAAA,CAAQ,CAAC,OAAA,CAAQ,MAAA,CAAO,MAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,SAAS,cAAA,CAAe,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;AAAA,EACjF;AACA,EAAA,IAAK,MAAA,CAAO,WAAsB,CAAA,EAAG;AACnC,IAAA,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAK,GAAA,CAAI,CAAA,EAAA,CAAI,GAAA,IAAO,CAAA,IAAK,MAAM,CAAC,CAAA,IAAK,CAAC,CAAA,EAAG,UAAU,KAAK,CAAA;AAC7F,IAAA,OAAO,OAAA;AAAA,MACL,QAAQ,GAAA,CAAI,CAAC,MAAA,KAAW,OAAA,CAAQ,OAAO,IAAA,EAAM,MAAM,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,cAAA,CAAe,IAAI,CAAC,CAAC,CAAC;AAAA,KAC3F;AAAA,EACF;AACA,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,EAAM,GAAG,CAAA,CAAE,IAAI,CAAC,IAAA,KAAS,cAAA,CAAe,IAAI,CAAC,CAAA;AACrE,EAAA,OAAO,OAAA,CAAQ,CAAC,GAAG,QAAA,EAAU,cAAA,CAAe,QAAQ,IAAI,CAAA,EAAG,IAAI,CAAC,CAAC,CAAA;AACnE;AAEA,SAAS,mBAAA,CAAoB,QAAsB,OAAA,EAAiC;AAClF,EAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,MAAA;AACrB,EAAA,MAAM,aAAA,GAAgB,QAAQ,MAAA,GAAY,GAAA,GAAA,CAAO,OAAO,GAAA,GAAM,CAAA,CAAA,GAAK,GAAA,IAAO,GAAA,GAAM,CAAA,CAAA,IAAM,CAAA;AACtF,EAAA,MAAM,SAAA,GAAY,GAAA,KAAQ,CAAA,IAAK,GAAA,KAAQ,MAAA;AACvC,EAAA,OACE,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,WAAA,IAAe,aAAa,aAAA,GAAgB,yBAAA;AAExE;AAKA,SAAS,OAAA,CAAQ,IAAA,EAAc,MAAA,EAAgB,MAAA,EAAyB;AACtE,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA,CAAE,IAAI,CAAC,IAAA,KAAS,cAAA,CAAe,IAAI,CAAC,CAAA;AACxE,EAAA,OAAO,OAAA,CAAQ,MAAA,GAAS,CAAC,GAAG,QAAA,EAAU,cAAA,CAAe,OAAA,CAAQ,IAAI,CAAA,EAAG,IAAI,CAAC,CAAA,GAAI,QAAQ,CAAA;AACvF;AAGA,SAAS,oBAAA,CAAqB,IAAA,EAAc,MAAA,EAAsB,IAAA,EAA4B;AAC5F,EAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,MAAA;AACrB,EAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,GAAA,EAAK,IAAI,CAAC,CAAA;AAAA,EACtC;AACA,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,GAAA,GAAM,GAAA,GAAM,CAAA,EAAE,EAAG,CAAC,CAAA,EAAG,KAAA,KAAU,MAAM,KAAK,CAAA;AAC/E,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,MAAA,EAAQ,KAAK,CAAC,CAAC,CAAC,CAAA;AAC5E;AAQA,SAAS,cAAA,CAAe,QAAsB,OAAA,EAAgC;AAC5E,EAAA,MAAM,IAAA,GAAqB,CAAC,IAAA,KAC1B,OAAA,CAAQ,QAAQ,OAAA,CAAQ,SAAA,GAAY,UAAA,CAAW,IAAI,CAAA,GAAI,IAAA;AACzD,EAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,MAAA,EAAQ,OAAO,CAAA;AAC7C,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,OAAO,KAAK,KAAK,CAAA;AAAA,EACnB;AACA,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,MAAA,EAAQ,OAAO,CAAA;AAC3C,EAAA,MAAM,MAAA,GAAS,aAAa,MAAM,CAAA;AAClC,EAAA,OAAO,mBAAA,CAAoB,MAAA,EAAQ,OAAO,CAAA,GACtC,oBAAA,CAAqB,IAAA,EAAM,MAAA,EAAQ,IAAI,CAAA,GACvC,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAC,CAAA;AACxB;AAEA,SAAS,mBAAmB,OAAA,EAAiC;AAC3D,EAAA,MAAM,EAAE,WAAA,EAAa,KAAA,EAAM,GAAI,QAAQ,OAAA,CAAQ,OAAA;AAC/C,EAAA,OAAO,WAAA,IAAe,KAAA,CAAM,GAAA,CAAI,SAAA,CAAU,mBAAmB,CAAA;AAC/D;AAGO,SAAS,SAAA,CAAU,QAAsB,OAAA,EAAgC;AAC9E,EAAA,IAAI,kBAAA,CAAmB,OAAO,CAAA,EAAG;AAC/B,IAAA,OAAO,cAAA,CAAe,QAAQ,OAAO,CAAA;AAAA,EACvC;AACA,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,MAAA,EAAQ,OAAO,CAAA;AACrC,EAAA,MAAM,MAAA,GAAS,aAAa,MAAM,CAAA;AAClC,EAAA,IAAI,mBAAA,CAAoB,MAAA,EAAQ,OAAO,CAAA,EAAG;AACxC,IAAA,OAAO,eAAA,CAAgB,MAAA,EAAQ,IAAA,EAAM,MAAM,CAAA;AAAA,EAC7C;AAEA,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,KAAS,OAAA,IAAW,KAAK,IAAA,KAAS,OAAA,GAAU,IAAA,GAAO,OAAA,CAAQ,IAAI,CAAA;AACjF,EAAA,OAAO,QAAQ,OAAA,CAAQ,OAAA,CAAQ,SAAA,GAAY,UAAA,CAAW,IAAI,CAAA,GAAI,IAAA;AAChE;;"}
|