openapi-typesafe 0.0.0 → 1.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +71 -1
- package/bin/cli.js +4 -0
- package/dist/adapters/node-file-system/node-file-system.cjs +46 -0
- package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -0
- package/dist/adapters/node-file-system/node-file-system.mjs +40 -0
- package/dist/adapters/node-file-system/node-file-system.mjs.map +1 -0
- package/dist/adapters/redocly-loader/alias-limit.cjs +16 -0
- package/dist/adapters/redocly-loader/alias-limit.cjs.map +1 -0
- package/dist/adapters/redocly-loader/alias-limit.mjs +14 -0
- package/dist/adapters/redocly-loader/alias-limit.mjs.map +1 -0
- package/dist/adapters/redocly-loader/allowed-hosts.cjs +42 -0
- package/dist/adapters/redocly-loader/allowed-hosts.cjs.map +1 -0
- package/dist/adapters/redocly-loader/allowed-hosts.mjs +40 -0
- package/dist/adapters/redocly-loader/allowed-hosts.mjs.map +1 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.cjs +53 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.cjs.map +1 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.mjs +51 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.mjs.map +1 -0
- package/dist/adapters/redocly-loader/malformed-refs.cjs +41 -0
- package/dist/adapters/redocly-loader/malformed-refs.cjs.map +1 -0
- package/dist/adapters/redocly-loader/malformed-refs.mjs +38 -0
- package/dist/adapters/redocly-loader/malformed-refs.mjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-config-source.cjs +61 -0
- package/dist/adapters/redocly-loader/redocly-config-source.cjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-config-source.mjs +54 -0
- package/dist/adapters/redocly-loader/redocly-config-source.mjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +179 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +177 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-access.cjs +107 -0
- package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-access.mjs +99 -0
- package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-holders.cjs +31 -0
- package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-holders.mjs +29 -0
- package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -0
- package/dist/adapters/redocly-loader/remote-fetch.cjs +60 -0
- package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -0
- package/dist/adapters/redocly-loader/remote-fetch.mjs +56 -0
- package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-load-errors.cjs +87 -0
- package/dist/adapters/redocly-loader/schema-load-errors.cjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-load-errors.mjs +77 -0
- package/dist/adapters/redocly-loader/schema-load-errors.mjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-source.cjs +104 -0
- package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-source.mjs +98 -0
- package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -0
- package/dist/adapters/redocly-loader/unsupported-keys.cjs +62 -0
- package/dist/adapters/redocly-loader/unsupported-keys.cjs.map +1 -0
- package/dist/adapters/redocly-loader/unsupported-keys.mjs +58 -0
- package/dist/adapters/redocly-loader/unsupported-keys.mjs.map +1 -0
- package/dist/adapters/terminal-logger/terminal-logger.cjs +67 -0
- package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -0
- package/dist/adapters/terminal-logger/terminal-logger.mjs +59 -0
- package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.cjs +21 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.mjs +17 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.cjs +75 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.mjs +71 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs +148 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs +142 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/lazy-node.cjs +23 -0
- package/dist/adapters/type-ast-bridge/lazy-node.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/lazy-node.mjs +21 -0
- package/dist/adapters/type-ast-bridge/lazy-node.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/load-typescript.cjs +57 -0
- package/dist/adapters/type-ast-bridge/load-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/load-typescript.mjs +51 -0
- package/dist/adapters/type-ast-bridge/load-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/print-typescript.cjs +21 -0
- package/dist/adapters/type-ast-bridge/print-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/print-typescript.mjs +19 -0
- package/dist/adapters/type-ast-bridge/print-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.cjs +33 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.mjs +29 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.cjs +210 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.mjs +207 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.mjs.map +1 -0
- package/dist/api/ast-to-string.cjs +39 -0
- package/dist/api/ast-to-string.cjs.map +1 -0
- package/dist/api/ast-to-string.mjs +37 -0
- package/dist/api/ast-to-string.mjs.map +1 -0
- package/dist/api/comment-header.cjs +11 -0
- package/dist/api/comment-header.cjs.map +1 -0
- package/dist/api/comment-header.mjs +9 -0
- package/dist/api/comment-header.mjs.map +1 -0
- package/dist/api/default-ports.cjs +38 -0
- package/dist/api/default-ports.cjs.map +1 -0
- package/dist/api/default-ports.mjs +28 -0
- package/dist/api/default-ports.mjs.map +1 -0
- package/dist/api/discriminator-conflict-warnings.cjs +25 -0
- package/dist/api/discriminator-conflict-warnings.cjs.map +1 -0
- package/dist/api/discriminator-conflict-warnings.mjs +23 -0
- package/dist/api/discriminator-conflict-warnings.mjs.map +1 -0
- package/dist/api/discriminator-enum-names.cjs +19 -0
- package/dist/api/discriminator-enum-names.cjs.map +1 -0
- package/dist/api/discriminator-enum-names.mjs +17 -0
- package/dist/api/discriminator-enum-names.mjs.map +1 -0
- package/dist/api/discriminator-enum-parent.cjs +59 -0
- package/dist/api/discriminator-enum-parent.cjs.map +1 -0
- package/dist/api/discriminator-enum-parent.mjs +57 -0
- package/dist/api/discriminator-enum-parent.mjs.map +1 -0
- package/dist/api/discriminator-enum.cjs +69 -0
- package/dist/api/discriminator-enum.cjs.map +1 -0
- package/dist/api/discriminator-enum.mjs +66 -0
- package/dist/api/discriminator-enum.mjs.map +1 -0
- package/dist/api/discriminator-other-owners.cjs +67 -0
- package/dist/api/discriminator-other-owners.cjs.map +1 -0
- package/dist/api/discriminator-other-owners.mjs +64 -0
- package/dist/api/discriminator-other-owners.mjs.map +1 -0
- package/dist/api/discriminator-patch.cjs +88 -0
- package/dist/api/discriminator-patch.cjs.map +1 -0
- package/dist/api/discriminator-patch.mjs +82 -0
- package/dist/api/discriminator-patch.mjs.map +1 -0
- package/dist/api/discriminator-scan.cjs +153 -0
- package/dist/api/discriminator-scan.cjs.map +1 -0
- package/dist/api/discriminator-scan.mjs +150 -0
- package/dist/api/discriminator-scan.mjs.map +1 -0
- package/dist/api/document-declarations.cjs +28 -0
- package/dist/api/document-declarations.cjs.map +1 -0
- package/dist/api/document-declarations.mjs +26 -0
- package/dist/api/document-declarations.mjs.map +1 -0
- package/dist/api/document-refs.cjs +53 -0
- package/dist/api/document-refs.cjs.map +1 -0
- package/dist/api/document-refs.mjs +50 -0
- package/dist/api/document-refs.mjs.map +1 -0
- package/dist/api/document-run.cjs +122 -0
- package/dist/api/document-run.cjs.map +1 -0
- package/dist/api/document-run.mjs +116 -0
- package/dist/api/document-run.mjs.map +1 -0
- package/dist/api/enum-values-warnings.cjs +16 -0
- package/dist/api/enum-values-warnings.cjs.map +1 -0
- package/dist/api/enum-values-warnings.mjs +14 -0
- package/dist/api/enum-values-warnings.mjs.map +1 -0
- package/dist/api/footer-entry.cjs +18 -0
- package/dist/api/footer-entry.cjs.map +1 -0
- package/dist/api/footer-entry.mjs +15 -0
- package/dist/api/footer-entry.mjs.map +1 -0
- package/dist/api/footer-sink.cjs +53 -0
- package/dist/api/footer-sink.cjs.map +1 -0
- package/dist/api/footer-sink.mjs +51 -0
- package/dist/api/footer-sink.mjs.map +1 -0
- package/dist/api/legacy-callback-warning.cjs +25 -0
- package/dist/api/legacy-callback-warning.cjs.map +1 -0
- package/dist/api/legacy-callback-warning.mjs +22 -0
- package/dist/api/legacy-callback-warning.mjs.map +1 -0
- package/dist/api/legacy-ts-helpers.cjs +203 -0
- package/dist/api/legacy-ts-helpers.cjs.map +1 -0
- package/dist/api/legacy-ts-helpers.mjs +187 -0
- package/dist/api/legacy-ts-helpers.mjs.map +1 -0
- package/dist/api/legacy-utils.cjs +65 -0
- package/dist/api/legacy-utils.cjs.map +1 -0
- package/dist/api/legacy-utils.mjs +50 -0
- package/dist/api/legacy-utils.mjs.map +1 -0
- package/dist/api/openapi-ts.cjs +40 -0
- package/dist/api/openapi-ts.cjs.map +1 -0
- package/dist/api/openapi-ts.mjs +34 -0
- package/dist/api/openapi-ts.mjs.map +1 -0
- package/dist/api/path-template-warnings.cjs +21 -0
- package/dist/api/path-template-warnings.cjs.map +1 -0
- package/dist/api/path-template-warnings.mjs +19 -0
- package/dist/api/path-template-warnings.mjs.map +1 -0
- package/dist/api/schema-callbacks.cjs +140 -0
- package/dist/api/schema-callbacks.cjs.map +1 -0
- package/dist/api/schema-callbacks.mjs +136 -0
- package/dist/api/schema-callbacks.mjs.map +1 -0
- package/dist/api/string-to-ast.cjs +21 -0
- package/dist/api/string-to-ast.cjs.map +1 -0
- package/dist/api/string-to-ast.mjs +18 -0
- package/dist/api/string-to-ast.mjs.map +1 -0
- package/dist/api/transform-context.cjs +84 -0
- package/dist/api/transform-context.cjs.map +1 -0
- package/dist/api/transform-context.mjs +67 -0
- package/dist/api/transform-context.mjs.map +1 -0
- package/dist/api/transform-schema.cjs +80 -0
- package/dist/api/transform-schema.cjs.map +1 -0
- package/dist/api/transform-schema.mjs +75 -0
- package/dist/api/transform-schema.mjs.map +1 -0
- package/dist/api/type-helpers.cjs +85 -0
- package/dist/api/type-helpers.cjs.map +1 -0
- package/dist/api/type-helpers.mjs +66 -0
- package/dist/api/type-helpers.mjs.map +1 -0
- package/dist/api/unsupported-feature-warnings.cjs +22 -0
- package/dist/api/unsupported-feature-warnings.cjs.map +1 -0
- package/dist/api/unsupported-feature-warnings.mjs +20 -0
- package/dist/api/unsupported-feature-warnings.mjs.map +1 -0
- package/dist/application/print/comment-writer.cjs +95 -0
- package/dist/application/print/comment-writer.cjs.map +1 -0
- package/dist/application/print/comment-writer.mjs +93 -0
- package/dist/application/print/comment-writer.mjs.map +1 -0
- package/dist/application/print/declaration-printer.cjs +83 -0
- package/dist/application/print/declaration-printer.cjs.map +1 -0
- package/dist/application/print/declaration-printer.mjs +81 -0
- package/dist/application/print/declaration-printer.mjs.map +1 -0
- package/dist/application/print/literal-text.cjs +52 -0
- package/dist/application/print/literal-text.cjs.map +1 -0
- package/dist/application/print/literal-text.mjs +48 -0
- package/dist/application/print/literal-text.mjs.map +1 -0
- package/dist/application/print/print-nodes.cjs +38 -0
- package/dist/application/print/print-nodes.cjs.map +1 -0
- package/dist/application/print/print-nodes.mjs +36 -0
- package/dist/application/print/print-nodes.mjs.map +1 -0
- package/dist/application/print/print-options.cjs +6 -0
- package/dist/application/print/print-options.cjs.map +1 -0
- package/dist/application/print/print-options.mjs +4 -0
- package/dist/application/print/print-options.mjs.map +1 -0
- package/dist/application/print/text-writer.cjs +63 -0
- package/dist/application/print/text-writer.cjs.map +1 -0
- package/dist/application/print/text-writer.mjs +60 -0
- package/dist/application/print/text-writer.mjs.map +1 -0
- package/dist/application/print/type-printer.cjs +219 -0
- package/dist/application/print/type-printer.cjs.map +1 -0
- package/dist/application/print/type-printer.mjs +215 -0
- package/dist/application/print/type-printer.mjs.map +1 -0
- package/dist/application/stack-overflow.cjs +36 -0
- package/dist/application/stack-overflow.cjs.map +1 -0
- package/dist/application/stack-overflow.mjs +31 -0
- package/dist/application/stack-overflow.mjs.map +1 -0
- package/dist/application/transform/document/assignability.cjs +144 -0
- package/dist/application/transform/document/assignability.cjs.map +1 -0
- package/dist/application/transform/document/assignability.mjs +138 -0
- package/dist/application/transform/document/assignability.mjs.map +1 -0
- package/dist/application/transform/document/components.cjs +104 -0
- package/dist/application/transform/document/components.cjs.map +1 -0
- package/dist/application/transform/document/components.mjs +102 -0
- package/dist/application/transform/document/components.mjs.map +1 -0
- package/dist/application/transform/document/declared-types.cjs +66 -0
- package/dist/application/transform/document/declared-types.cjs.map +1 -0
- package/dist/application/transform/document/declared-types.mjs +63 -0
- package/dist/application/transform/document/declared-types.mjs.map +1 -0
- package/dist/application/transform/document/defs-root.cjs +18 -0
- package/dist/application/transform/document/defs-root.cjs.map +1 -0
- package/dist/application/transform/document/defs-root.mjs +16 -0
- package/dist/application/transform/document/defs-root.mjs.map +1 -0
- package/dist/application/transform/document/document-member.cjs +13 -0
- package/dist/application/transform/document/document-member.cjs.map +1 -0
- package/dist/application/transform/document/document-member.mjs +11 -0
- package/dist/application/transform/document/document-member.mjs.map +1 -0
- package/dist/application/transform/document/document.cjs +109 -0
- package/dist/application/transform/document/document.cjs.map +1 -0
- package/dist/application/transform/document/document.mjs +106 -0
- package/dist/application/transform/document/document.mjs.map +1 -0
- package/dist/application/transform/document/exploded-query.cjs +46 -0
- package/dist/application/transform/document/exploded-query.cjs.map +1 -0
- package/dist/application/transform/document/exploded-query.mjs +43 -0
- package/dist/application/transform/document/exploded-query.mjs.map +1 -0
- package/dist/application/transform/document/global-type-references.cjs +63 -0
- package/dist/application/transform/document/global-type-references.cjs.map +1 -0
- package/dist/application/transform/document/global-type-references.mjs +61 -0
- package/dist/application/transform/document/global-type-references.mjs.map +1 -0
- package/dist/application/transform/document/header.cjs +27 -0
- package/dist/application/transform/document/header.cjs.map +1 -0
- package/dist/application/transform/document/header.mjs +25 -0
- package/dist/application/transform/document/header.mjs.map +1 -0
- package/dist/application/transform/document/kept-deprecated.cjs +96 -0
- package/dist/application/transform/document/kept-deprecated.cjs.map +1 -0
- package/dist/application/transform/document/kept-deprecated.mjs +94 -0
- package/dist/application/transform/document/kept-deprecated.mjs.map +1 -0
- package/dist/application/transform/document/list-assignability.cjs +54 -0
- package/dist/application/transform/document/list-assignability.cjs.map +1 -0
- package/dist/application/transform/document/list-assignability.mjs +52 -0
- package/dist/application/transform/document/list-assignability.mjs.map +1 -0
- package/dist/application/transform/document/media-type.cjs +42 -0
- package/dist/application/transform/document/media-type.cjs.map +1 -0
- package/dist/application/transform/document/media-type.mjs +38 -0
- package/dist/application/transform/document/media-type.mjs.map +1 -0
- package/dist/application/transform/document/operation.cjs +45 -0
- package/dist/application/transform/document/operation.cjs.map +1 -0
- package/dist/application/transform/document/operation.mjs +43 -0
- package/dist/application/transform/document/operation.mjs.map +1 -0
- package/dist/application/transform/document/parameter.cjs +25 -0
- package/dist/application/transform/document/parameter.cjs.map +1 -0
- package/dist/application/transform/document/parameter.mjs +23 -0
- package/dist/application/transform/document/parameter.mjs.map +1 -0
- package/dist/application/transform/document/parameters.cjs +146 -0
- package/dist/application/transform/document/parameters.cjs.map +1 -0
- package/dist/application/transform/document/parameters.mjs +144 -0
- package/dist/application/transform/document/parameters.mjs.map +1 -0
- package/dist/application/transform/document/path-item.cjs +82 -0
- package/dist/application/transform/document/path-item.cjs.map +1 -0
- package/dist/application/transform/document/path-item.mjs +80 -0
- package/dist/application/transform/document/path-item.mjs.map +1 -0
- package/dist/application/transform/document/path-key-overlaps.cjs +107 -0
- package/dist/application/transform/document/path-key-overlaps.cjs.map +1 -0
- package/dist/application/transform/document/path-key-overlaps.mjs +105 -0
- package/dist/application/transform/document/path-key-overlaps.mjs.map +1 -0
- package/dist/application/transform/document/path-template-replace.cjs +48 -0
- package/dist/application/transform/document/path-template-replace.cjs.map +1 -0
- package/dist/application/transform/document/path-template-replace.mjs +45 -0
- package/dist/application/transform/document/path-template-replace.mjs.map +1 -0
- package/dist/application/transform/document/paths-enum.cjs +75 -0
- package/dist/application/transform/document/paths-enum.cjs.map +1 -0
- package/dist/application/transform/document/paths-enum.mjs +72 -0
- package/dist/application/transform/document/paths-enum.mjs.map +1 -0
- package/dist/application/transform/document/paths.cjs +153 -0
- package/dist/application/transform/document/paths.cjs.map +1 -0
- package/dist/application/transform/document/paths.mjs +149 -0
- package/dist/application/transform/document/paths.mjs.map +1 -0
- package/dist/application/transform/document/request-body.cjs +36 -0
- package/dist/application/transform/document/request-body.cjs.map +1 -0
- package/dist/application/transform/document/request-body.mjs +34 -0
- package/dist/application/transform/document/request-body.mjs.map +1 -0
- package/dist/application/transform/document/response.cjs +59 -0
- package/dist/application/transform/document/response.cjs.map +1 -0
- package/dist/application/transform/document/response.mjs +57 -0
- package/dist/application/transform/document/response.mjs.map +1 -0
- package/dist/application/transform/document/responses.cjs +23 -0
- package/dist/application/transform/document/responses.cjs.map +1 -0
- package/dist/application/transform/document/responses.mjs +21 -0
- package/dist/application/transform/document/responses.mjs.map +1 -0
- package/dist/application/transform/document/root-type-aliases.cjs +70 -0
- package/dist/application/transform/document/root-type-aliases.cjs.map +1 -0
- package/dist/application/transform/document/root-type-aliases.mjs +67 -0
- package/dist/application/transform/document/root-type-aliases.mjs.map +1 -0
- package/dist/application/transform/document/template-key-match.cjs +128 -0
- package/dist/application/transform/document/template-key-match.cjs.map +1 -0
- package/dist/application/transform/document/template-key-match.mjs +125 -0
- package/dist/application/transform/document/template-key-match.mjs.map +1 -0
- package/dist/application/transform/document/type-assignability.cjs +192 -0
- package/dist/application/transform/document/type-assignability.cjs.map +1 -0
- package/dist/application/transform/document/type-assignability.mjs +190 -0
- package/dist/application/transform/document/type-assignability.mjs.map +1 -0
- package/dist/application/transform/document/type-key.cjs +70 -0
- package/dist/application/transform/document/type-key.cjs.map +1 -0
- package/dist/application/transform/document/type-key.mjs +68 -0
- package/dist/application/transform/document/type-key.mjs.map +1 -0
- package/dist/application/transform/document/type-resolution.cjs +131 -0
- package/dist/application/transform/document/type-resolution.cjs.map +1 -0
- package/dist/application/transform/document/type-resolution.mjs +125 -0
- package/dist/application/transform/document/type-resolution.mjs.map +1 -0
- package/dist/application/transform/document/webhooks.cjs +19 -0
- package/dist/application/transform/document/webhooks.cjs.map +1 -0
- package/dist/application/transform/document/webhooks.mjs +17 -0
- package/dist/application/transform/document/webhooks.mjs.map +1 -0
- package/dist/application/transform/document-entries.cjs +17 -0
- package/dist/application/transform/document-entries.cjs.map +1 -0
- package/dist/application/transform/document-entries.mjs +14 -0
- package/dist/application/transform/document-entries.mjs.map +1 -0
- package/dist/application/transform/footer/document-footer.cjs +150 -0
- package/dist/application/transform/footer/document-footer.cjs.map +1 -0
- package/dist/application/transform/footer/document-footer.mjs +148 -0
- package/dist/application/transform/footer/document-footer.mjs.map +1 -0
- package/dist/application/transform/footer/enum-naming.cjs +138 -0
- package/dist/application/transform/footer/enum-naming.cjs.map +1 -0
- package/dist/application/transform/footer/enum-naming.mjs +131 -0
- package/dist/application/transform/footer/enum-naming.mjs.map +1 -0
- package/dist/application/transform/footer/enum-values-check.cjs +129 -0
- package/dist/application/transform/footer/enum-values-check.cjs.map +1 -0
- package/dist/application/transform/footer/enum-values-check.mjs +127 -0
- package/dist/application/transform/footer/enum-values-check.mjs.map +1 -0
- package/dist/application/transform/footer/evaluation.cjs +33 -0
- package/dist/application/transform/footer/evaluation.cjs.map +1 -0
- package/dist/application/transform/footer/evaluation.mjs +26 -0
- package/dist/application/transform/footer/evaluation.mjs.map +1 -0
- package/dist/application/transform/footer/shared-enum-names.cjs +60 -0
- package/dist/application/transform/footer/shared-enum-names.cjs.map +1 -0
- package/dist/application/transform/footer/shared-enum-names.mjs +57 -0
- package/dist/application/transform/footer/shared-enum-names.mjs.map +1 -0
- package/dist/application/transform/footer/type-evaluation.cjs +246 -0
- package/dist/application/transform/footer/type-evaluation.cjs.map +1 -0
- package/dist/application/transform/footer/type-evaluation.mjs +244 -0
- package/dist/application/transform/footer/type-evaluation.mjs.map +1 -0
- package/dist/application/transform/footer/type-rules.cjs +172 -0
- package/dist/application/transform/footer/type-rules.cjs.map +1 -0
- package/dist/application/transform/footer/type-rules.mjs +166 -0
- package/dist/application/transform/footer/type-rules.mjs.map +1 -0
- package/dist/application/transform/helper-types.cjs +68 -0
- package/dist/application/transform/helper-types.cjs.map +1 -0
- package/dist/application/transform/helper-types.mjs +65 -0
- package/dist/application/transform/helper-types.mjs.map +1 -0
- package/dist/application/transform/literal-type.cjs +36 -0
- package/dist/application/transform/literal-type.cjs.map +1 -0
- package/dist/application/transform/literal-type.mjs +34 -0
- package/dist/application/transform/literal-type.mjs.map +1 -0
- package/dist/application/transform/numbered-names.cjs +18 -0
- package/dist/application/transform/numbered-names.cjs.map +1 -0
- package/dist/application/transform/numbered-names.mjs +16 -0
- package/dist/application/transform/numbered-names.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/generated-location.cjs +138 -0
- package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/generated-location.mjs +136 -0
- package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/generated-shape.cjs +171 -0
- package/dist/application/transform/ref-pointer/generated-shape.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/generated-shape.mjs +162 -0
- package/dist/application/transform/ref-pointer/generated-shape.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/inline-cycles.cjs +44 -0
- package/dist/application/transform/ref-pointer/inline-cycles.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/inline-cycles.mjs +42 -0
- package/dist/application/transform/ref-pointer/inline-cycles.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/original-index.cjs +62 -0
- package/dist/application/transform/ref-pointer/original-index.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/original-index.mjs +60 -0
- package/dist/application/transform/ref-pointer/original-index.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/pointer-type.cjs +60 -0
- package/dist/application/transform/ref-pointer/pointer-type.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/pointer-type.mjs +57 -0
- package/dist/application/transform/ref-pointer/pointer-type.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/pointer-walk.cjs +66 -0
- package/dist/application/transform/ref-pointer/pointer-walk.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/pointer-walk.mjs +56 -0
- package/dist/application/transform/ref-pointer/pointer-walk.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/typed-walk.cjs +124 -0
- package/dist/application/transform/ref-pointer/typed-walk.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/typed-walk.mjs +122 -0
- package/dist/application/transform/ref-pointer/typed-walk.mjs.map +1 -0
- package/dist/application/transform/ref-type.cjs +62 -0
- package/dist/application/transform/ref-type.cjs.map +1 -0
- package/dist/application/transform/ref-type.mjs +55 -0
- package/dist/application/transform/ref-type.mjs.map +1 -0
- package/dist/application/transform/schema/access-flags.cjs +38 -0
- package/dist/application/transform/schema/access-flags.cjs.map +1 -0
- package/dist/application/transform/schema/access-flags.mjs +36 -0
- package/dist/application/transform/schema/access-flags.mjs.map +1 -0
- package/dist/application/transform/schema/array-type.cjs +136 -0
- package/dist/application/transform/schema/array-type.cjs.map +1 -0
- package/dist/application/transform/schema/array-type.mjs +134 -0
- package/dist/application/transform/schema/array-type.mjs.map +1 -0
- package/dist/application/transform/schema/composition-type.cjs +142 -0
- package/dist/application/transform/schema/composition-type.cjs.map +1 -0
- package/dist/application/transform/schema/composition-type.mjs +140 -0
- package/dist/application/transform/schema/composition-type.mjs.map +1 -0
- package/dist/application/transform/schema/core-type.cjs +86 -0
- package/dist/application/transform/schema/core-type.cjs.map +1 -0
- package/dist/application/transform/schema/core-type.mjs +84 -0
- package/dist/application/transform/schema/core-type.mjs.map +1 -0
- package/dist/application/transform/schema/discriminated-union.cjs +30 -0
- package/dist/application/transform/schema/discriminated-union.cjs.map +1 -0
- package/dist/application/transform/schema/discriminated-union.mjs +27 -0
- package/dist/application/transform/schema/discriminated-union.mjs.map +1 -0
- package/dist/application/transform/schema/discriminator-property.cjs +22 -0
- package/dist/application/transform/schema/discriminator-property.cjs.map +1 -0
- package/dist/application/transform/schema/discriminator-property.mjs +20 -0
- package/dist/application/transform/schema/discriminator-property.mjs.map +1 -0
- package/dist/application/transform/schema/enum-rule.cjs +163 -0
- package/dist/application/transform/schema/enum-rule.cjs.map +1 -0
- package/dist/application/transform/schema/enum-rule.mjs +160 -0
- package/dist/application/transform/schema/enum-rule.mjs.map +1 -0
- package/dist/application/transform/schema/inherited-discriminator.cjs +29 -0
- package/dist/application/transform/schema/inherited-discriminator.cjs.map +1 -0
- package/dist/application/transform/schema/inherited-discriminator.mjs +26 -0
- package/dist/application/transform/schema/inherited-discriminator.mjs.map +1 -0
- package/dist/application/transform/schema/object-type.cjs +186 -0
- package/dist/application/transform/schema/object-type.cjs.map +1 -0
- package/dist/application/transform/schema/object-type.mjs +182 -0
- package/dist/application/transform/schema/object-type.mjs.map +1 -0
- package/dist/application/transform/schema/presence-members.cjs +59 -0
- package/dist/application/transform/schema/presence-members.cjs.map +1 -0
- package/dist/application/transform/schema/presence-members.mjs +57 -0
- package/dist/application/transform/schema/presence-members.mjs.map +1 -0
- package/dist/application/transform/schema/required-variants.cjs +45 -0
- package/dist/application/transform/schema/required-variants.cjs.map +1 -0
- package/dist/application/transform/schema/required-variants.mjs +42 -0
- package/dist/application/transform/schema/required-variants.mjs.map +1 -0
- package/dist/application/transform/schema/schema-transform.cjs +72 -0
- package/dist/application/transform/schema/schema-transform.cjs.map +1 -0
- package/dist/application/transform/schema/schema-transform.mjs +68 -0
- package/dist/application/transform/schema/schema-transform.mjs.map +1 -0
- package/dist/application/transform/schema/unevaluated-properties.cjs +61 -0
- package/dist/application/transform/schema/unevaluated-properties.cjs.map +1 -0
- package/dist/application/transform/schema/unevaluated-properties.mjs +59 -0
- package/dist/application/transform/schema/unevaluated-properties.mjs.map +1 -0
- package/dist/application/transform/schema-comment.cjs +130 -0
- package/dist/application/transform/schema-comment.cjs.map +1 -0
- package/dist/application/transform/schema-comment.mjs +125 -0
- package/dist/application/transform/schema-comment.mjs.map +1 -0
- package/dist/application/transform/shared-types.cjs +8 -0
- package/dist/application/transform/shared-types.cjs.map +1 -0
- package/dist/application/transform/shared-types.mjs +6 -0
- package/dist/application/transform/shared-types.mjs.map +1 -0
- package/dist/application/transform/type-combinators.cjs +49 -0
- package/dist/application/transform/type-combinators.cjs.map +1 -0
- package/dist/application/transform/type-combinators.mjs +42 -0
- package/dist/application/transform/type-combinators.mjs.map +1 -0
- package/dist/cli/cli-arguments.cjs +145 -0
- package/dist/cli/cli-arguments.cjs.map +1 -0
- package/dist/cli/cli-arguments.mjs +137 -0
- package/dist/cli/cli-arguments.mjs.map +1 -0
- package/dist/cli/cli-errors.cjs +81 -0
- package/dist/cli/cli-errors.cjs.map +1 -0
- package/dist/cli/cli-errors.mjs +77 -0
- package/dist/cli/cli-errors.mjs.map +1 -0
- package/dist/cli/cli-output.cjs +42 -0
- package/dist/cli/cli-output.cjs.map +1 -0
- package/dist/cli/cli-output.mjs +35 -0
- package/dist/cli/cli-output.mjs.map +1 -0
- package/dist/cli/docs-links.cjs +6 -0
- package/dist/cli/docs-links.cjs.map +1 -0
- package/dist/cli/docs-links.mjs +4 -0
- package/dist/cli/docs-links.mjs.map +1 -0
- package/dist/cli/fix-option.cjs +19 -0
- package/dist/cli/fix-option.cjs.map +1 -0
- package/dist/cli/fix-option.mjs +16 -0
- package/dist/cli/fix-option.mjs.map +1 -0
- package/dist/cli/help-text.cjs +44 -0
- package/dist/cli/help-text.cjs.map +1 -0
- package/dist/cli/help-text.mjs +42 -0
- package/dist/cli/help-text.mjs.map +1 -0
- package/dist/cli/main.cjs +67 -0
- package/dist/cli/main.cjs.map +1 -0
- package/dist/cli/main.d.cts +2 -0
- package/dist/cli/main.d.mts +2 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.mjs +59 -0
- package/dist/cli/main.mjs.map +1 -0
- package/dist/cli/redocly-apis.cjs +69 -0
- package/dist/cli/redocly-apis.cjs.map +1 -0
- package/dist/cli/redocly-apis.mjs +66 -0
- package/dist/cli/redocly-apis.mjs.map +1 -0
- package/dist/cli/ref-limits.cjs +14 -0
- package/dist/cli/ref-limits.cjs.map +1 -0
- package/dist/cli/ref-limits.mjs +12 -0
- package/dist/cli/ref-limits.mjs.map +1 -0
- package/dist/cli/run-cli.cjs +113 -0
- package/dist/cli/run-cli.cjs.map +1 -0
- package/dist/cli/run-cli.mjs +111 -0
- package/dist/cli/run-cli.mjs.map +1 -0
- package/dist/domain/assert-never.cjs +8 -0
- package/dist/domain/assert-never.cjs.map +1 -0
- package/dist/domain/assert-never.mjs +6 -0
- package/dist/domain/assert-never.mjs.map +1 -0
- package/dist/domain/errors.cjs +52 -0
- package/dist/domain/errors.cjs.map +1 -0
- package/dist/domain/errors.mjs +48 -0
- package/dist/domain/errors.mjs.map +1 -0
- package/dist/domain/ir/constructors.cjs +93 -0
- package/dist/domain/ir/constructors.cjs.map +1 -0
- package/dist/domain/ir/constructors.mjs +74 -0
- package/dist/domain/ir/constructors.mjs.map +1 -0
- package/dist/domain/ir/identifier-text.cjs +29 -0
- package/dist/domain/ir/identifier-text.cjs.map +1 -0
- package/dist/domain/ir/identifier-text.mjs +25 -0
- package/dist/domain/ir/identifier-text.mjs.map +1 -0
- package/dist/domain/ir/newer-identifier-ranges.cjs +109 -0
- package/dist/domain/ir/newer-identifier-ranges.cjs.map +1 -0
- package/dist/domain/ir/newer-identifier-ranges.mjs +106 -0
- package/dist/domain/ir/newer-identifier-ranges.mjs.map +1 -0
- package/dist/domain/ir/normalize.cjs +32 -0
- package/dist/domain/ir/normalize.cjs.map +1 -0
- package/dist/domain/ir/normalize.mjs +29 -0
- package/dist/domain/ir/normalize.mjs.map +1 -0
- package/dist/domain/ir/property-name.cjs +19 -0
- package/dist/domain/ir/property-name.cjs.map +1 -0
- package/dist/domain/ir/property-name.mjs +16 -0
- package/dist/domain/ir/property-name.mjs.map +1 -0
- package/dist/domain/ir/raw-text-escapes.cjs +25 -0
- package/dist/domain/ir/raw-text-escapes.cjs.map +1 -0
- package/dist/domain/ir/raw-text-escapes.mjs +22 -0
- package/dist/domain/ir/raw-text-escapes.mjs.map +1 -0
- package/dist/domain/openapi/admitted-values.cjs +75 -0
- package/dist/domain/openapi/admitted-values.cjs.map +1 -0
- package/dist/domain/openapi/admitted-values.mjs +72 -0
- package/dist/domain/openapi/admitted-values.mjs.map +1 -0
- package/dist/domain/openapi/alias-expansion.cjs +50 -0
- package/dist/domain/openapi/alias-expansion.cjs.map +1 -0
- package/dist/domain/openapi/alias-expansion.mjs +45 -0
- package/dist/domain/openapi/alias-expansion.mjs.map +1 -0
- package/dist/domain/openapi/binary-content.cjs +48 -0
- package/dist/domain/openapi/binary-content.cjs.map +1 -0
- package/dist/domain/openapi/binary-content.mjs +45 -0
- package/dist/domain/openapi/binary-content.mjs.map +1 -0
- package/dist/domain/openapi/components-object.cjs +29 -0
- package/dist/domain/openapi/components-object.cjs.map +1 -0
- package/dist/domain/openapi/components-object.mjs +24 -0
- package/dist/domain/openapi/components-object.mjs.map +1 -0
- package/dist/domain/openapi/discriminated-union.cjs +68 -0
- package/dist/domain/openapi/discriminated-union.cjs.map +1 -0
- package/dist/domain/openapi/discriminated-union.mjs +62 -0
- package/dist/domain/openapi/discriminated-union.mjs.map +1 -0
- package/dist/domain/openapi/discriminator-conflicts.cjs +143 -0
- package/dist/domain/openapi/discriminator-conflicts.cjs.map +1 -0
- package/dist/domain/openapi/discriminator-conflicts.mjs +141 -0
- package/dist/domain/openapi/discriminator-conflicts.mjs.map +1 -0
- package/dist/domain/openapi/json-pointer.cjs +31 -0
- package/dist/domain/openapi/json-pointer.cjs.map +1 -0
- package/dist/domain/openapi/json-pointer.mjs +27 -0
- package/dist/domain/openapi/json-pointer.mjs.map +1 -0
- package/dist/domain/openapi/media-type-object.cjs +14 -0
- package/dist/domain/openapi/media-type-object.cjs.map +1 -0
- package/dist/domain/openapi/media-type-object.mjs +11 -0
- package/dist/domain/openapi/media-type-object.mjs.map +1 -0
- package/dist/domain/openapi/parameter-object.cjs +13 -0
- package/dist/domain/openapi/parameter-object.cjs.map +1 -0
- package/dist/domain/openapi/parameter-object.mjs +10 -0
- package/dist/domain/openapi/parameter-object.mjs.map +1 -0
- package/dist/domain/openapi/path-item-object.cjs +35 -0
- package/dist/domain/openapi/path-item-object.cjs.map +1 -0
- package/dist/domain/openapi/path-item-object.mjs +30 -0
- package/dist/domain/openapi/path-item-object.mjs.map +1 -0
- package/dist/domain/openapi/path-templates.cjs +23 -0
- package/dist/domain/openapi/path-templates.cjs.map +1 -0
- package/dist/domain/openapi/path-templates.mjs +21 -0
- package/dist/domain/openapi/path-templates.mjs.map +1 -0
- package/dist/domain/openapi/unsupported-features.cjs +87 -0
- package/dist/domain/openapi/unsupported-features.cjs.map +1 -0
- package/dist/domain/openapi/unsupported-features.mjs +84 -0
- package/dist/domain/openapi/unsupported-features.mjs.map +1 -0
- package/dist/domain/output-fixes.cjs +101 -0
- package/dist/domain/output-fixes.cjs.map +1 -0
- package/dist/domain/output-fixes.mjs +94 -0
- package/dist/domain/output-fixes.mjs.map +1 -0
- package/dist/domain/warnings.cjs +15 -0
- package/dist/domain/warnings.cjs.map +1 -0
- package/dist/domain/warnings.mjs +12 -0
- package/dist/domain/warnings.mjs.map +1 -0
- package/dist/index.cjs +98 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +841 -0
- package/dist/index.d.mts +841 -0
- package/dist/index.d.ts +841 -0
- package/dist/index.mjs +27 -0
- package/dist/index.mjs.map +1 -0
- package/dist/transform/components-object.cjs +15 -0
- package/dist/transform/components-object.cjs.map +1 -0
- package/dist/transform/components-object.mjs +11 -0
- package/dist/transform/components-object.mjs.map +1 -0
- package/dist/transform/header-object.cjs +12 -0
- package/dist/transform/header-object.cjs.map +1 -0
- package/dist/transform/header-object.mjs +10 -0
- package/dist/transform/header-object.mjs.map +1 -0
- package/dist/transform/media-type-object.cjs +12 -0
- package/dist/transform/media-type-object.cjs.map +1 -0
- package/dist/transform/media-type-object.mjs +10 -0
- package/dist/transform/media-type-object.mjs.map +1 -0
- package/dist/transform/operation-object.cjs +26 -0
- package/dist/transform/operation-object.cjs.map +1 -0
- package/dist/transform/operation-object.mjs +21 -0
- package/dist/transform/operation-object.mjs.map +1 -0
- package/dist/transform/parameter-object.cjs +12 -0
- package/dist/transform/parameter-object.cjs.map +1 -0
- package/dist/transform/parameter-object.mjs +10 -0
- package/dist/transform/parameter-object.mjs.map +1 -0
- package/dist/transform/path-item-object.cjs +12 -0
- package/dist/transform/path-item-object.cjs.map +1 -0
- package/dist/transform/path-item-object.mjs +10 -0
- package/dist/transform/path-item-object.mjs.map +1 -0
- package/dist/transform/paths-object.cjs +11 -0
- package/dist/transform/paths-object.cjs.map +1 -0
- package/dist/transform/paths-object.mjs +9 -0
- package/dist/transform/paths-object.mjs.map +1 -0
- package/dist/transform/request-body-object.cjs +12 -0
- package/dist/transform/request-body-object.cjs.map +1 -0
- package/dist/transform/request-body-object.mjs +10 -0
- package/dist/transform/request-body-object.mjs.map +1 -0
- package/dist/transform/response-object.cjs +12 -0
- package/dist/transform/response-object.cjs.map +1 -0
- package/dist/transform/response-object.mjs +10 -0
- package/dist/transform/response-object.mjs.map +1 -0
- package/dist/transform/responses-object.cjs +12 -0
- package/dist/transform/responses-object.cjs.map +1 -0
- package/dist/transform/responses-object.mjs +10 -0
- package/dist/transform/responses-object.mjs.map +1 -0
- package/dist/transform/schema-object.cjs +21 -0
- package/dist/transform/schema-object.cjs.map +1 -0
- package/dist/transform/schema-object.mjs +16 -0
- package/dist/transform/schema-object.mjs.map +1 -0
- package/package.json +115 -4
- package/src/adapters/node-file-system/node-file-system.ts +44 -0
- package/src/adapters/redocly-loader/alias-limit.ts +20 -0
- package/src/adapters/redocly-loader/allowed-hosts.ts +62 -0
- package/src/adapters/redocly-loader/bundled-ref-repair.ts +65 -0
- package/src/adapters/redocly-loader/malformed-refs.ts +61 -0
- package/src/adapters/redocly-loader/redocly-config-source.ts +78 -0
- package/src/adapters/redocly-loader/redocly-schema-loader.ts +262 -0
- package/src/adapters/redocly-loader/ref-access.ts +146 -0
- package/src/adapters/redocly-loader/ref-holders.ts +43 -0
- package/src/adapters/redocly-loader/remote-fetch.ts +104 -0
- package/src/adapters/redocly-loader/schema-load-errors.ts +124 -0
- package/src/adapters/redocly-loader/schema-source.ts +151 -0
- package/src/adapters/redocly-loader/unsupported-keys.ts +102 -0
- package/src/adapters/terminal-logger/terminal-logger.ts +98 -0
- package/src/adapters/type-ast-bridge/footer-nodes.ts +38 -0
- package/src/adapters/type-ast-bridge/ir-declarations-to-typescript.ts +100 -0
- package/src/adapters/type-ast-bridge/ir-to-typescript.ts +223 -0
- package/src/adapters/type-ast-bridge/lazy-node.ts +24 -0
- package/src/adapters/type-ast-bridge/load-typescript.ts +84 -0
- package/src/adapters/type-ast-bridge/print-typescript.ts +33 -0
- package/src/adapters/type-ast-bridge/typescript-raw-text.ts +49 -0
- package/src/adapters/type-ast-bridge/typescript-to-ir.ts +294 -0
- package/src/adapters/type-ast-bridge/typescript-types.ts +8 -0
- package/src/api/ast-to-string.ts +59 -0
- package/src/api/comment-header.ts +7 -0
- package/src/api/default-ports.ts +44 -0
- package/src/api/discriminator-conflict-warnings.ts +43 -0
- package/src/api/discriminator-enum-names.ts +26 -0
- package/src/api/discriminator-enum-parent.ts +129 -0
- package/src/api/discriminator-enum.ts +115 -0
- package/src/api/discriminator-other-owners.ts +97 -0
- package/src/api/discriminator-patch.ts +147 -0
- package/src/api/discriminator-scan.ts +260 -0
- package/src/api/document-declarations.ts +41 -0
- package/src/api/document-refs.ts +71 -0
- package/src/api/document-run.ts +177 -0
- package/src/api/enum-values-warnings.ts +21 -0
- package/src/api/footer-entry.ts +23 -0
- package/src/api/footer-sink.ts +67 -0
- package/src/api/legacy-callback-warning.ts +29 -0
- package/src/api/legacy-ts-helpers.ts +311 -0
- package/src/api/legacy-utils.ts +118 -0
- package/src/api/openapi-ts.ts +62 -0
- package/src/api/path-template-warnings.ts +27 -0
- package/src/api/schema-callbacks.ts +211 -0
- package/src/api/string-to-ast.ts +27 -0
- package/src/api/transform-context.ts +93 -0
- package/src/api/transform-schema.ts +123 -0
- package/src/api/type-helpers.ts +130 -0
- package/src/api/unsupported-feature-warnings.ts +33 -0
- package/src/application/ports/file-system.ts +12 -0
- package/src/application/ports/logger.ts +16 -0
- package/src/application/ports/redocly-config-source.ts +20 -0
- package/src/application/ports/schema-loader.ts +32 -0
- package/src/application/print/comment-writer.ts +91 -0
- package/src/application/print/declaration-printer.ts +100 -0
- package/src/application/print/literal-text.ts +62 -0
- package/src/application/print/print-nodes.ts +62 -0
- package/src/application/print/print-options.ts +11 -0
- package/src/application/print/text-writer.ts +83 -0
- package/src/application/print/type-printer.ts +287 -0
- package/src/application/stack-overflow.ts +54 -0
- package/src/application/transform/document/assignability.ts +203 -0
- package/src/application/transform/document/components.ts +189 -0
- package/src/application/transform/document/declared-types.ts +93 -0
- package/src/application/transform/document/defs-root.ts +25 -0
- package/src/application/transform/document/document-member.ts +20 -0
- package/src/application/transform/document/document.ts +215 -0
- package/src/application/transform/document/exploded-query.ts +91 -0
- package/src/application/transform/document/global-type-references.ts +78 -0
- package/src/application/transform/document/header.ts +34 -0
- package/src/application/transform/document/kept-deprecated.ts +135 -0
- package/src/application/transform/document/list-assignability.ts +87 -0
- package/src/application/transform/document/media-type.ts +78 -0
- package/src/application/transform/document/operation.ts +64 -0
- package/src/application/transform/document/parameter.ts +45 -0
- package/src/application/transform/document/parameters.ts +265 -0
- package/src/application/transform/document/path-item.ts +168 -0
- package/src/application/transform/document/path-key-overlaps.ts +201 -0
- package/src/application/transform/document/path-template-replace.ts +90 -0
- package/src/application/transform/document/paths-enum.ts +127 -0
- package/src/application/transform/document/paths.ts +273 -0
- package/src/application/transform/document/request-body.ts +50 -0
- package/src/application/transform/document/response.ts +109 -0
- package/src/application/transform/document/responses.ts +29 -0
- package/src/application/transform/document/root-type-aliases.ts +107 -0
- package/src/application/transform/document/template-key-match.ts +183 -0
- package/src/application/transform/document/type-assignability.ts +268 -0
- package/src/application/transform/document/type-key.ts +80 -0
- package/src/application/transform/document/type-resolution.ts +163 -0
- package/src/application/transform/document/webhooks.ts +22 -0
- package/src/application/transform/document-entries.ts +28 -0
- package/src/application/transform/footer/document-footer.ts +212 -0
- package/src/application/transform/footer/enum-naming.ts +210 -0
- package/src/application/transform/footer/enum-values-check.ts +171 -0
- package/src/application/transform/footer/evaluation.ts +47 -0
- package/src/application/transform/footer/shared-enum-names.ts +86 -0
- package/src/application/transform/footer/type-evaluation.ts +294 -0
- package/src/application/transform/footer/type-rules.ts +269 -0
- package/src/application/transform/helper-types.ts +92 -0
- package/src/application/transform/literal-type.ts +54 -0
- package/src/application/transform/numbered-names.ts +20 -0
- package/src/application/transform/ref-pointer/generated-location.ts +211 -0
- package/src/application/transform/ref-pointer/generated-shape.ts +275 -0
- package/src/application/transform/ref-pointer/inline-cycles.ts +56 -0
- package/src/application/transform/ref-pointer/original-index.ts +95 -0
- package/src/application/transform/ref-pointer/pointer-type.ts +92 -0
- package/src/application/transform/ref-pointer/pointer-walk.ts +96 -0
- package/src/application/transform/ref-pointer/typed-walk.ts +192 -0
- package/src/application/transform/ref-type.ts +102 -0
- package/src/application/transform/schema/access-flags.ts +63 -0
- package/src/application/transform/schema/array-type.ts +213 -0
- package/src/application/transform/schema/composition-type.ts +255 -0
- package/src/application/transform/schema/core-type.ts +119 -0
- package/src/application/transform/schema/discriminated-union.ts +58 -0
- package/src/application/transform/schema/discriminator-property.ts +33 -0
- package/src/application/transform/schema/enum-rule.ts +280 -0
- package/src/application/transform/schema/inherited-discriminator.ts +54 -0
- package/src/application/transform/schema/object-type.ts +289 -0
- package/src/application/transform/schema/presence-members.ts +96 -0
- package/src/application/transform/schema/required-variants.ts +88 -0
- package/src/application/transform/schema/schema-context.ts +136 -0
- package/src/application/transform/schema/schema-rule.ts +29 -0
- package/src/application/transform/schema/schema-transform.ts +99 -0
- package/src/application/transform/schema/unevaluated-properties.ts +105 -0
- package/src/application/transform/schema-comment.ts +196 -0
- package/src/application/transform/shared-types.ts +9 -0
- package/src/application/transform/transform-context.ts +51 -0
- package/src/application/transform/type-combinators.ts +57 -0
- package/src/cli/cli-arguments.ts +208 -0
- package/src/cli/cli-dependencies.ts +47 -0
- package/src/cli/cli-errors.ts +127 -0
- package/src/cli/cli-output.ts +67 -0
- package/src/cli/docs-links.ts +6 -0
- package/src/cli/fix-option.ts +29 -0
- package/src/cli/help-text.ts +52 -0
- package/src/cli/main.ts +73 -0
- package/src/cli/redocly-apis.ts +95 -0
- package/src/cli/ref-limits.ts +16 -0
- package/src/cli/run-cli.ts +131 -0
- package/src/domain/assert-never.ts +8 -0
- package/src/domain/errors.ts +76 -0
- package/src/domain/ir/constructors.ts +142 -0
- package/src/domain/ir/identifier-text.ts +49 -0
- package/src/domain/ir/newer-identifier-ranges.ts +109 -0
- package/src/domain/ir/nodes.ts +225 -0
- package/src/domain/ir/normalize.ts +51 -0
- package/src/domain/ir/property-name.ts +28 -0
- package/src/domain/ir/raw-text-escapes.ts +37 -0
- package/src/domain/openapi/admitted-values.ts +113 -0
- package/src/domain/openapi/alias-expansion.ts +72 -0
- package/src/domain/openapi/binary-content.ts +74 -0
- package/src/domain/openapi/components-object.ts +52 -0
- package/src/domain/openapi/discriminated-union.ts +109 -0
- package/src/domain/openapi/discriminator-conflicts.ts +251 -0
- package/src/domain/openapi/document-object.ts +12 -0
- package/src/domain/openapi/header-object.ts +9 -0
- package/src/domain/openapi/json-pointer.ts +46 -0
- package/src/domain/openapi/media-type-object.ts +26 -0
- package/src/domain/openapi/operation-object.ts +13 -0
- package/src/domain/openapi/parameter-object.ts +34 -0
- package/src/domain/openapi/path-item-object.ts +70 -0
- package/src/domain/openapi/path-templates.ts +31 -0
- package/src/domain/openapi/request-body-object.ts +7 -0
- package/src/domain/openapi/response-object.ts +14 -0
- package/src/domain/openapi/schema-object.ts +61 -0
- package/src/domain/openapi/unsupported-features.ts +139 -0
- package/src/domain/output-fixes.ts +136 -0
- package/src/domain/warnings.ts +20 -0
- package/src/index.ts +67 -0
- package/src/transform/components-object.ts +27 -0
- package/src/transform/header-object.ts +19 -0
- package/src/transform/media-type-object.ts +19 -0
- package/src/transform/operation-object.ts +36 -0
- package/src/transform/parameter-object.ts +19 -0
- package/src/transform/parameters-array.ts +19 -0
- package/src/transform/path-item-object.ts +22 -0
- package/src/transform/paths-enum.ts +8 -0
- package/src/transform/paths-object.ts +15 -0
- package/src/transform/request-body-object.ts +19 -0
- package/src/transform/response-object.ts +19 -0
- package/src/transform/responses-object.ts +19 -0
- package/src/transform/schema-object.ts +36 -0
- package/src/transform/webhooks-object.ts +15 -0
- package/src/types/generator-options.ts +278 -0
- package/src/types/openapi-common.ts +100 -0
- package/src/types/openapi-document.ts +196 -0
- package/src/types/openapi-path-item.ts +130 -0
- package/src/types/openapi-request.ts +209 -0
- package/src/types/openapi-response.ts +81 -0
- package/src/types/openapi-schema.ts +169 -0
- package/src/types/openapi-security.ts +116 -0
- package/src/types.ts +12 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const errors = require('../../../domain/errors.cjs');
|
|
4
|
+
const numberedNames = require('../numbered-names.cjs');
|
|
5
|
+
|
|
6
|
+
const IDENTIFIER_RE = /^[A-Za-z_$][A-Za-z_$0-9]*$/;
|
|
7
|
+
const INVALID_RUN_THEN_CHARACTER_RE = /[^A-Za-z_$0-9]+(.)?/g;
|
|
8
|
+
const INVALID_RUN_RE = /[^A-Za-z_$0-9]+/;
|
|
9
|
+
const INVALID_RUNS_RE = /[^A-Za-z_$0-9]+/g;
|
|
10
|
+
const INVALID_CHARACTER_RE = /[^A-Za-z_$0-9]/;
|
|
11
|
+
const STARTS_WITH_DIGIT_RE = /^[0-9]/;
|
|
12
|
+
const SPECIAL_CHARACTERS = /* @__PURE__ */ new Map([["+", "Plus"]]);
|
|
13
|
+
const NUMBER_PREFIX = "Value";
|
|
14
|
+
const NEGATIVE_PREFIX = "ValueMinus";
|
|
15
|
+
class EmptyEnumNameError extends errors.OpenAPITypesafeError {
|
|
16
|
+
constructor(name) {
|
|
17
|
+
super({
|
|
18
|
+
code: errors.ERROR_CODES.ENUM_NAME_EMPTY,
|
|
19
|
+
message: `Cannot build an enum or enum values name from "${name}": no valid characters`,
|
|
20
|
+
details: { name }
|
|
21
|
+
});
|
|
22
|
+
this.name = "EmptyEnumNameError";
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
class EnumNaming {
|
|
26
|
+
isNextCheckSkipped = false;
|
|
27
|
+
/** `my-status` → `MyStatus`. */
|
|
28
|
+
enumName(name) {
|
|
29
|
+
const sanitized = this.sanitize(name);
|
|
30
|
+
return `${firstCharacter(sanitized, name).toUpperCase()}${sanitized.substring(1)}`;
|
|
31
|
+
}
|
|
32
|
+
/** `MyStatusValues` → `myStatusValues`. */
|
|
33
|
+
arrayName(name) {
|
|
34
|
+
const sanitized = this.sanitize(name);
|
|
35
|
+
return `${firstCharacter(sanitized, name).toLowerCase()}${sanitized.substring(1)}`;
|
|
36
|
+
}
|
|
37
|
+
/** A member name: a valid identifier, a rewritten one, or a quoted name. */
|
|
38
|
+
memberName(value, metadata = {}) {
|
|
39
|
+
const name = metadata.name ?? String(value);
|
|
40
|
+
if (IDENTIFIER_RE.test(name)) {
|
|
41
|
+
return name;
|
|
42
|
+
}
|
|
43
|
+
this.isNextCheckSkipped = false;
|
|
44
|
+
const prefixed = prefixedMemberName(name);
|
|
45
|
+
const invalidRun = INVALID_RUN_RE.exec(prefixed);
|
|
46
|
+
if (!invalidRun) {
|
|
47
|
+
return prefixed === "" ? quotedMemberName(prefixed) : prefixed;
|
|
48
|
+
}
|
|
49
|
+
return invalidRun[0] === prefixed ? quotedMemberName(prefixed) : prefixed.replace(INVALID_RUNS_RE, (run) => SPECIAL_CHARACTERS.get(run) ?? "_");
|
|
50
|
+
}
|
|
51
|
+
sanitize(name) {
|
|
52
|
+
const sanitized = name.replace(INVALID_RUN_THEN_CHARACTER_RE, (run) => {
|
|
53
|
+
const next = run.charAt(run.length - 1);
|
|
54
|
+
return this.isInvalid(next) ? "" : next.toUpperCase();
|
|
55
|
+
});
|
|
56
|
+
return STARTS_WITH_DIGIT_RE.test(sanitized) ? `${NUMBER_PREFIX}${sanitized}` : sanitized;
|
|
57
|
+
}
|
|
58
|
+
isInvalid(character) {
|
|
59
|
+
if (this.isNextCheckSkipped) {
|
|
60
|
+
this.isNextCheckSkipped = false;
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
this.isNextCheckSkipped = INVALID_CHARACTER_RE.test(character);
|
|
64
|
+
return this.isNextCheckSkipped;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function firstCharacter(sanitized, name) {
|
|
68
|
+
const first = sanitized[0];
|
|
69
|
+
if (first === void 0) {
|
|
70
|
+
throw new EmptyEnumNameError(name);
|
|
71
|
+
}
|
|
72
|
+
return first;
|
|
73
|
+
}
|
|
74
|
+
function quotedMemberName(name) {
|
|
75
|
+
return JSON.stringify(name);
|
|
76
|
+
}
|
|
77
|
+
function prefixedMemberName(name) {
|
|
78
|
+
if (Number(name[0]) >= 0) {
|
|
79
|
+
return `${NUMBER_PREFIX}${name}`.replace(".", "_");
|
|
80
|
+
}
|
|
81
|
+
return name[0] === "-" ? `${NEGATIVE_PREFIX}${name.slice(1)}` : name;
|
|
82
|
+
}
|
|
83
|
+
const LINE_TERMINATORS_RE = /\r\n|[\n\r\u2028\u2029]/g;
|
|
84
|
+
function enumMemberDescription(description) {
|
|
85
|
+
return description?.trim().replace(LINE_TERMINATORS_RE, " ") ?? "";
|
|
86
|
+
}
|
|
87
|
+
function enumMemberComments(metadata = {}) {
|
|
88
|
+
const description = enumMemberDescription(metadata.description);
|
|
89
|
+
return description ? [{ kind: "line", text: ` ${description}` }] : [];
|
|
90
|
+
}
|
|
91
|
+
const MEMBER_NUMBER_SEPARATOR = "_";
|
|
92
|
+
function numberedMemberName(name, count) {
|
|
93
|
+
const isQuoted = name.startsWith('"');
|
|
94
|
+
const raw = isQuoted ? JSON.parse(name) : name;
|
|
95
|
+
const numbered = `${raw}${MEMBER_NUMBER_SEPARATOR}${count}`;
|
|
96
|
+
return isQuoted ? quotedMemberName(numbered) : numbered;
|
|
97
|
+
}
|
|
98
|
+
function enumDeclaration(name, members, naming) {
|
|
99
|
+
const names = members.values.map(
|
|
100
|
+
(value, index) => naming.memberName(value, members.metadata[index])
|
|
101
|
+
);
|
|
102
|
+
const uniqueNames = numberedNames.withNumberedRepeats(names, numberedMemberName);
|
|
103
|
+
return {
|
|
104
|
+
kind: "enum",
|
|
105
|
+
name,
|
|
106
|
+
isExported: true,
|
|
107
|
+
members: members.values.map((value, index) => ({
|
|
108
|
+
name: uniqueNames[index],
|
|
109
|
+
value,
|
|
110
|
+
comments: enumMemberComments(members.metadata[index])
|
|
111
|
+
})),
|
|
112
|
+
comments: []
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function withoutDeclaredMembers(declaration, declared) {
|
|
116
|
+
const taken = new Set(declared.keys());
|
|
117
|
+
const members = [];
|
|
118
|
+
for (const member of declaration.members) {
|
|
119
|
+
if (declared.get(member.name) === member.value) {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
let name = member.name;
|
|
123
|
+
for (let count = 2; taken.has(name); count++) {
|
|
124
|
+
name = numberedMemberName(member.name, count);
|
|
125
|
+
}
|
|
126
|
+
taken.add(name);
|
|
127
|
+
members.push(name === member.name ? member : { ...member, name });
|
|
128
|
+
}
|
|
129
|
+
return { ...declaration, members };
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
exports.EmptyEnumNameError = EmptyEnumNameError;
|
|
133
|
+
exports.EnumNaming = EnumNaming;
|
|
134
|
+
exports.enumDeclaration = enumDeclaration;
|
|
135
|
+
exports.enumMemberDescription = enumMemberDescription;
|
|
136
|
+
exports.quotedMemberName = quotedMemberName;
|
|
137
|
+
exports.withoutDeclaredMembers = withoutDeclaredMembers;
|
|
138
|
+
//# sourceMappingURL=enum-naming.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enum-naming.cjs","sources":["../../../../src/application/transform/footer/enum-naming.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../../../domain/errors.js\";\nimport type { IrComment, IrEnumDeclaration } from \"../../../domain/ir/nodes.js\";\nimport { withNumberedRepeats } from \"../numbered-names.js\";\n\nconst IDENTIFIER_RE = /^[A-Za-z_$][A-Za-z_$0-9]*$/;\n/** A run of invalid characters and the character after it, which starts the next word. */\nconst INVALID_RUN_THEN_CHARACTER_RE = /[^A-Za-z_$0-9]+(.)?/g;\nconst INVALID_RUN_RE = /[^A-Za-z_$0-9]+/;\nconst INVALID_RUNS_RE = /[^A-Za-z_$0-9]+/g;\nconst INVALID_CHARACTER_RE = /[^A-Za-z_$0-9]/;\nconst STARTS_WITH_DIGIT_RE = /^[0-9]/;\n/** Invalid character runs with a readable replacement; any other run becomes `_`. */\nconst SPECIAL_CHARACTERS: ReadonlyMap<string, string> = new Map([[\"+\", \"Plus\"]]);\nconst NUMBER_PREFIX = \"Value\";\nconst NEGATIVE_PREFIX = \"ValueMinus\";\n\nexport class EmptyEnumNameError extends OpenAPITypesafeError {\n constructor(name: string) {\n super({\n code: ERROR_CODES.ENUM_NAME_EMPTY,\n message: `Cannot build an enum or enum values name from \"${name}\": no valid characters`,\n details: { name },\n });\n this.name = \"EmptyEnumNameError\";\n }\n}\n\n/** Metadata of one enum member (`x-enum-varnames`, `x-enum-descriptions`). */\nexport interface EnumMemberNaming {\n readonly name?: string | undefined;\n readonly description?: string | null | undefined;\n}\n\n/**\n * Names of `--enum` declarations, their members and `--enum-values` arrays, as the original\n * builds them. One instance per run.\n *\n * The original checks the character after an invalid run with a global regex and `.test()`,\n * which keeps `lastIndex`: after a check that finds an invalid character, the next check fails,\n * and a later member name with invalid characters resets it. `isNextCheckSkipped` keeps that\n * behavior within a run (research/legacy-bugs.md, item 2; fixed in Phase 7).\n */\nexport class EnumNaming {\n private isNextCheckSkipped = false;\n\n /** `my-status` → `MyStatus`. */\n enumName(name: string): string {\n const sanitized = this.sanitize(name);\n return `${firstCharacter(sanitized, name).toUpperCase()}${sanitized.substring(1)}`;\n }\n\n /** `MyStatusValues` → `myStatusValues`. */\n arrayName(name: string): string {\n const sanitized = this.sanitize(name);\n return `${firstCharacter(sanitized, name).toLowerCase()}${sanitized.substring(1)}`;\n }\n\n /** A member name: a valid identifier, a rewritten one, or a quoted name. */\n memberName(value: string | number, metadata: EnumMemberNaming = {}): string {\n const name = metadata.name ?? String(value);\n if (IDENTIFIER_RE.test(name)) {\n return name;\n }\n // The original runs a global `match` here, which resets the regex state.\n this.isNextCheckSkipped = false;\n const prefixed = prefixedMemberName(name);\n const invalidRun = INVALID_RUN_RE.exec(prefixed);\n if (!invalidRun) {\n // Only the empty name has no invalid run and is no identifier (upstream #2807).\n return prefixed === \"\" ? quotedMemberName(prefixed) : prefixed;\n }\n return invalidRun[0] === prefixed\n ? quotedMemberName(prefixed)\n : prefixed.replace(INVALID_RUNS_RE, (run) => SPECIAL_CHARACTERS.get(run) ?? \"_\");\n }\n\n private sanitize(name: string): string {\n const sanitized = name.replace(INVALID_RUN_THEN_CHARACTER_RE, (run) => {\n const next = run.charAt(run.length - 1);\n return this.isInvalid(next) ? \"\" : next.toUpperCase();\n });\n // The original prefixed the unsanitized name, which kept invalid characters after a leading\n // digit, and missed a digit that only became first after sanitizing (research/legacy-bugs.md,\n // item 15). Prefixing the sanitized name gives the same name wherever the original was valid.\n return STARTS_WITH_DIGIT_RE.test(sanitized) ? `${NUMBER_PREFIX}${sanitized}` : sanitized;\n }\n\n private isInvalid(character: string): boolean {\n if (this.isNextCheckSkipped) {\n this.isNextCheckSkipped = false;\n return false;\n }\n this.isNextCheckSkipped = INVALID_CHARACTER_RE.test(character);\n return this.isNextCheckSkipped;\n }\n}\n\nfunction firstCharacter(sanitized: string, name: string): string {\n const first = sanitized[0];\n if (first === undefined) {\n throw new EmptyEnumNameError(name);\n }\n return first;\n}\n\n/**\n * A string-literal member name. The original wrapped the name in quotes without escaping, so `\\`\n * and `\"` gave invalid output (upstream #2614); a JSON string is a valid TypeScript string.\n */\nexport function quotedMemberName(name: string): string {\n return JSON.stringify(name);\n}\n\nfunction prefixedMemberName(name: string): string {\n if (Number(name[0]) >= 0) {\n // Only the first dot: `1.5` → `Value1_5`.\n return `${NUMBER_PREFIX}${name}`.replace(\".\", \"_\");\n }\n return name[0] === \"-\" ? `${NEGATIVE_PREFIX}${name.slice(1)}` : name;\n}\n\n/** Every line terminator of JavaScript, which would end a `//` comment. */\nconst LINE_TERMINATORS_RE = /\\r\\n|[\\n\\r\\u2028\\u2029]/g;\n\n/** The text of a member's `//` comment: trimmed, on one line; empty when there is none. */\nexport function enumMemberDescription(description: string | null | undefined): string {\n return description?.trim().replace(LINE_TERMINATORS_RE, \" \") ?? \"\";\n}\n\n/**\n * The member comment: the trimmed description as a line comment, as in the original. Line breaks\n * become spaces: in a `//` comment they ended the comment early (upstream #2838).\n */\nfunction enumMemberComments(metadata: EnumMemberNaming = {}): IrComment[] {\n const description = enumMemberDescription(metadata.description);\n return description ? [{ kind: \"line\", text: ` ${description}` }] : [];\n}\n\n/** The members of an enum, by value, with optional metadata at the same index. */\nexport interface EnumMembers {\n readonly values: readonly (string | number)[];\n readonly metadata: readonly (EnumMemberNaming | undefined)[];\n}\n\n/** Separates a repeated member name from its number: `reactions_1` → `reactions_1_2`. */\nconst MEMBER_NUMBER_SEPARATOR = \"_\";\n\n/** The `count`-th use of a member name; a quoted name gets the number inside the quotes. */\nfunction numberedMemberName(name: string, count: number): string {\n const isQuoted = name.startsWith('\"');\n const raw = isQuoted ? (JSON.parse(name) as string) : name;\n const numbered = `${raw}${MEMBER_NUMBER_SEPARATOR}${count}`;\n return isQuoted ? quotedMemberName(numbered) : numbered;\n}\n\n/**\n * An exported enum with an already built `name`; member names advance the naming state. Values\n * whose names come out the same (`reactions-+1` and `reactions--1` are both `reactions_1`) would\n * not compile, so a repeated name gets a number (`reactions_1_2`).\n */\nexport function enumDeclaration(\n name: string,\n members: EnumMembers,\n naming: EnumNaming,\n): IrEnumDeclaration {\n const names = members.values.map((value, index) =>\n naming.memberName(value, members.metadata[index]),\n );\n const uniqueNames = withNumberedRepeats(names, numberedMemberName);\n return {\n kind: \"enum\",\n name,\n isExported: true,\n members: members.values.map((value, index) => ({\n name: uniqueNames[index] as string,\n value,\n comments: enumMemberComments(members.metadata[index]),\n })),\n comments: [],\n };\n}\n\n/** The member names an enum name has so far, with their values. */\nexport type DeclaredMembers = ReadonlyMap<string, string | number>;\n\n/**\n * A later declaration of an enum name merges with the earlier ones, and a member name declared\n * twice does not compile (TS2300): a property and an inline `allOf` item of one schema give one\n * name. A member that repeats one by name and value is left out; one whose name another value has\n * gets the next free number (`a_b_2`).\n */\nexport function withoutDeclaredMembers(\n declaration: IrEnumDeclaration,\n declared: DeclaredMembers,\n): IrEnumDeclaration {\n const taken = new Set(declared.keys());\n const members: IrEnumDeclaration[\"members\"][number][] = [];\n for (const member of declaration.members) {\n if (declared.get(member.name) === member.value) {\n continue;\n }\n let name = member.name;\n for (let count = 2; taken.has(name); count++) {\n name = numberedMemberName(member.name, count);\n }\n taken.add(name);\n members.push(name === member.name ? member : { ...member, name });\n }\n return { ...declaration, members };\n}\n"],"names":["OpenAPITypesafeError","ERROR_CODES","withNumberedRepeats"],"mappings":"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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { OpenAPITypesafeError, ERROR_CODES } from '../../../domain/errors.mjs';
|
|
2
|
+
import { withNumberedRepeats } from '../numbered-names.mjs';
|
|
3
|
+
|
|
4
|
+
const IDENTIFIER_RE = /^[A-Za-z_$][A-Za-z_$0-9]*$/;
|
|
5
|
+
const INVALID_RUN_THEN_CHARACTER_RE = /[^A-Za-z_$0-9]+(.)?/g;
|
|
6
|
+
const INVALID_RUN_RE = /[^A-Za-z_$0-9]+/;
|
|
7
|
+
const INVALID_RUNS_RE = /[^A-Za-z_$0-9]+/g;
|
|
8
|
+
const INVALID_CHARACTER_RE = /[^A-Za-z_$0-9]/;
|
|
9
|
+
const STARTS_WITH_DIGIT_RE = /^[0-9]/;
|
|
10
|
+
const SPECIAL_CHARACTERS = /* @__PURE__ */ new Map([["+", "Plus"]]);
|
|
11
|
+
const NUMBER_PREFIX = "Value";
|
|
12
|
+
const NEGATIVE_PREFIX = "ValueMinus";
|
|
13
|
+
class EmptyEnumNameError extends OpenAPITypesafeError {
|
|
14
|
+
constructor(name) {
|
|
15
|
+
super({
|
|
16
|
+
code: ERROR_CODES.ENUM_NAME_EMPTY,
|
|
17
|
+
message: `Cannot build an enum or enum values name from "${name}": no valid characters`,
|
|
18
|
+
details: { name }
|
|
19
|
+
});
|
|
20
|
+
this.name = "EmptyEnumNameError";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
class EnumNaming {
|
|
24
|
+
isNextCheckSkipped = false;
|
|
25
|
+
/** `my-status` → `MyStatus`. */
|
|
26
|
+
enumName(name) {
|
|
27
|
+
const sanitized = this.sanitize(name);
|
|
28
|
+
return `${firstCharacter(sanitized, name).toUpperCase()}${sanitized.substring(1)}`;
|
|
29
|
+
}
|
|
30
|
+
/** `MyStatusValues` → `myStatusValues`. */
|
|
31
|
+
arrayName(name) {
|
|
32
|
+
const sanitized = this.sanitize(name);
|
|
33
|
+
return `${firstCharacter(sanitized, name).toLowerCase()}${sanitized.substring(1)}`;
|
|
34
|
+
}
|
|
35
|
+
/** A member name: a valid identifier, a rewritten one, or a quoted name. */
|
|
36
|
+
memberName(value, metadata = {}) {
|
|
37
|
+
const name = metadata.name ?? String(value);
|
|
38
|
+
if (IDENTIFIER_RE.test(name)) {
|
|
39
|
+
return name;
|
|
40
|
+
}
|
|
41
|
+
this.isNextCheckSkipped = false;
|
|
42
|
+
const prefixed = prefixedMemberName(name);
|
|
43
|
+
const invalidRun = INVALID_RUN_RE.exec(prefixed);
|
|
44
|
+
if (!invalidRun) {
|
|
45
|
+
return prefixed === "" ? quotedMemberName(prefixed) : prefixed;
|
|
46
|
+
}
|
|
47
|
+
return invalidRun[0] === prefixed ? quotedMemberName(prefixed) : prefixed.replace(INVALID_RUNS_RE, (run) => SPECIAL_CHARACTERS.get(run) ?? "_");
|
|
48
|
+
}
|
|
49
|
+
sanitize(name) {
|
|
50
|
+
const sanitized = name.replace(INVALID_RUN_THEN_CHARACTER_RE, (run) => {
|
|
51
|
+
const next = run.charAt(run.length - 1);
|
|
52
|
+
return this.isInvalid(next) ? "" : next.toUpperCase();
|
|
53
|
+
});
|
|
54
|
+
return STARTS_WITH_DIGIT_RE.test(sanitized) ? `${NUMBER_PREFIX}${sanitized}` : sanitized;
|
|
55
|
+
}
|
|
56
|
+
isInvalid(character) {
|
|
57
|
+
if (this.isNextCheckSkipped) {
|
|
58
|
+
this.isNextCheckSkipped = false;
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
this.isNextCheckSkipped = INVALID_CHARACTER_RE.test(character);
|
|
62
|
+
return this.isNextCheckSkipped;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function firstCharacter(sanitized, name) {
|
|
66
|
+
const first = sanitized[0];
|
|
67
|
+
if (first === void 0) {
|
|
68
|
+
throw new EmptyEnumNameError(name);
|
|
69
|
+
}
|
|
70
|
+
return first;
|
|
71
|
+
}
|
|
72
|
+
function quotedMemberName(name) {
|
|
73
|
+
return JSON.stringify(name);
|
|
74
|
+
}
|
|
75
|
+
function prefixedMemberName(name) {
|
|
76
|
+
if (Number(name[0]) >= 0) {
|
|
77
|
+
return `${NUMBER_PREFIX}${name}`.replace(".", "_");
|
|
78
|
+
}
|
|
79
|
+
return name[0] === "-" ? `${NEGATIVE_PREFIX}${name.slice(1)}` : name;
|
|
80
|
+
}
|
|
81
|
+
const LINE_TERMINATORS_RE = /\r\n|[\n\r\u2028\u2029]/g;
|
|
82
|
+
function enumMemberDescription(description) {
|
|
83
|
+
return description?.trim().replace(LINE_TERMINATORS_RE, " ") ?? "";
|
|
84
|
+
}
|
|
85
|
+
function enumMemberComments(metadata = {}) {
|
|
86
|
+
const description = enumMemberDescription(metadata.description);
|
|
87
|
+
return description ? [{ kind: "line", text: ` ${description}` }] : [];
|
|
88
|
+
}
|
|
89
|
+
const MEMBER_NUMBER_SEPARATOR = "_";
|
|
90
|
+
function numberedMemberName(name, count) {
|
|
91
|
+
const isQuoted = name.startsWith('"');
|
|
92
|
+
const raw = isQuoted ? JSON.parse(name) : name;
|
|
93
|
+
const numbered = `${raw}${MEMBER_NUMBER_SEPARATOR}${count}`;
|
|
94
|
+
return isQuoted ? quotedMemberName(numbered) : numbered;
|
|
95
|
+
}
|
|
96
|
+
function enumDeclaration(name, members, naming) {
|
|
97
|
+
const names = members.values.map(
|
|
98
|
+
(value, index) => naming.memberName(value, members.metadata[index])
|
|
99
|
+
);
|
|
100
|
+
const uniqueNames = withNumberedRepeats(names, numberedMemberName);
|
|
101
|
+
return {
|
|
102
|
+
kind: "enum",
|
|
103
|
+
name,
|
|
104
|
+
isExported: true,
|
|
105
|
+
members: members.values.map((value, index) => ({
|
|
106
|
+
name: uniqueNames[index],
|
|
107
|
+
value,
|
|
108
|
+
comments: enumMemberComments(members.metadata[index])
|
|
109
|
+
})),
|
|
110
|
+
comments: []
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function withoutDeclaredMembers(declaration, declared) {
|
|
114
|
+
const taken = new Set(declared.keys());
|
|
115
|
+
const members = [];
|
|
116
|
+
for (const member of declaration.members) {
|
|
117
|
+
if (declared.get(member.name) === member.value) {
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
let name = member.name;
|
|
121
|
+
for (let count = 2; taken.has(name); count++) {
|
|
122
|
+
name = numberedMemberName(member.name, count);
|
|
123
|
+
}
|
|
124
|
+
taken.add(name);
|
|
125
|
+
members.push(name === member.name ? member : { ...member, name });
|
|
126
|
+
}
|
|
127
|
+
return { ...declaration, members };
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export { EmptyEnumNameError, EnumNaming, enumDeclaration, enumMemberDescription, quotedMemberName, withoutDeclaredMembers };
|
|
131
|
+
//# sourceMappingURL=enum-naming.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enum-naming.mjs","sources":["../../../../src/application/transform/footer/enum-naming.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../../../domain/errors.js\";\nimport type { IrComment, IrEnumDeclaration } from \"../../../domain/ir/nodes.js\";\nimport { withNumberedRepeats } from \"../numbered-names.js\";\n\nconst IDENTIFIER_RE = /^[A-Za-z_$][A-Za-z_$0-9]*$/;\n/** A run of invalid characters and the character after it, which starts the next word. */\nconst INVALID_RUN_THEN_CHARACTER_RE = /[^A-Za-z_$0-9]+(.)?/g;\nconst INVALID_RUN_RE = /[^A-Za-z_$0-9]+/;\nconst INVALID_RUNS_RE = /[^A-Za-z_$0-9]+/g;\nconst INVALID_CHARACTER_RE = /[^A-Za-z_$0-9]/;\nconst STARTS_WITH_DIGIT_RE = /^[0-9]/;\n/** Invalid character runs with a readable replacement; any other run becomes `_`. */\nconst SPECIAL_CHARACTERS: ReadonlyMap<string, string> = new Map([[\"+\", \"Plus\"]]);\nconst NUMBER_PREFIX = \"Value\";\nconst NEGATIVE_PREFIX = \"ValueMinus\";\n\nexport class EmptyEnumNameError extends OpenAPITypesafeError {\n constructor(name: string) {\n super({\n code: ERROR_CODES.ENUM_NAME_EMPTY,\n message: `Cannot build an enum or enum values name from \"${name}\": no valid characters`,\n details: { name },\n });\n this.name = \"EmptyEnumNameError\";\n }\n}\n\n/** Metadata of one enum member (`x-enum-varnames`, `x-enum-descriptions`). */\nexport interface EnumMemberNaming {\n readonly name?: string | undefined;\n readonly description?: string | null | undefined;\n}\n\n/**\n * Names of `--enum` declarations, their members and `--enum-values` arrays, as the original\n * builds them. One instance per run.\n *\n * The original checks the character after an invalid run with a global regex and `.test()`,\n * which keeps `lastIndex`: after a check that finds an invalid character, the next check fails,\n * and a later member name with invalid characters resets it. `isNextCheckSkipped` keeps that\n * behavior within a run (research/legacy-bugs.md, item 2; fixed in Phase 7).\n */\nexport class EnumNaming {\n private isNextCheckSkipped = false;\n\n /** `my-status` → `MyStatus`. */\n enumName(name: string): string {\n const sanitized = this.sanitize(name);\n return `${firstCharacter(sanitized, name).toUpperCase()}${sanitized.substring(1)}`;\n }\n\n /** `MyStatusValues` → `myStatusValues`. */\n arrayName(name: string): string {\n const sanitized = this.sanitize(name);\n return `${firstCharacter(sanitized, name).toLowerCase()}${sanitized.substring(1)}`;\n }\n\n /** A member name: a valid identifier, a rewritten one, or a quoted name. */\n memberName(value: string | number, metadata: EnumMemberNaming = {}): string {\n const name = metadata.name ?? String(value);\n if (IDENTIFIER_RE.test(name)) {\n return name;\n }\n // The original runs a global `match` here, which resets the regex state.\n this.isNextCheckSkipped = false;\n const prefixed = prefixedMemberName(name);\n const invalidRun = INVALID_RUN_RE.exec(prefixed);\n if (!invalidRun) {\n // Only the empty name has no invalid run and is no identifier (upstream #2807).\n return prefixed === \"\" ? quotedMemberName(prefixed) : prefixed;\n }\n return invalidRun[0] === prefixed\n ? quotedMemberName(prefixed)\n : prefixed.replace(INVALID_RUNS_RE, (run) => SPECIAL_CHARACTERS.get(run) ?? \"_\");\n }\n\n private sanitize(name: string): string {\n const sanitized = name.replace(INVALID_RUN_THEN_CHARACTER_RE, (run) => {\n const next = run.charAt(run.length - 1);\n return this.isInvalid(next) ? \"\" : next.toUpperCase();\n });\n // The original prefixed the unsanitized name, which kept invalid characters after a leading\n // digit, and missed a digit that only became first after sanitizing (research/legacy-bugs.md,\n // item 15). Prefixing the sanitized name gives the same name wherever the original was valid.\n return STARTS_WITH_DIGIT_RE.test(sanitized) ? `${NUMBER_PREFIX}${sanitized}` : sanitized;\n }\n\n private isInvalid(character: string): boolean {\n if (this.isNextCheckSkipped) {\n this.isNextCheckSkipped = false;\n return false;\n }\n this.isNextCheckSkipped = INVALID_CHARACTER_RE.test(character);\n return this.isNextCheckSkipped;\n }\n}\n\nfunction firstCharacter(sanitized: string, name: string): string {\n const first = sanitized[0];\n if (first === undefined) {\n throw new EmptyEnumNameError(name);\n }\n return first;\n}\n\n/**\n * A string-literal member name. The original wrapped the name in quotes without escaping, so `\\`\n * and `\"` gave invalid output (upstream #2614); a JSON string is a valid TypeScript string.\n */\nexport function quotedMemberName(name: string): string {\n return JSON.stringify(name);\n}\n\nfunction prefixedMemberName(name: string): string {\n if (Number(name[0]) >= 0) {\n // Only the first dot: `1.5` → `Value1_5`.\n return `${NUMBER_PREFIX}${name}`.replace(\".\", \"_\");\n }\n return name[0] === \"-\" ? `${NEGATIVE_PREFIX}${name.slice(1)}` : name;\n}\n\n/** Every line terminator of JavaScript, which would end a `//` comment. */\nconst LINE_TERMINATORS_RE = /\\r\\n|[\\n\\r\\u2028\\u2029]/g;\n\n/** The text of a member's `//` comment: trimmed, on one line; empty when there is none. */\nexport function enumMemberDescription(description: string | null | undefined): string {\n return description?.trim().replace(LINE_TERMINATORS_RE, \" \") ?? \"\";\n}\n\n/**\n * The member comment: the trimmed description as a line comment, as in the original. Line breaks\n * become spaces: in a `//` comment they ended the comment early (upstream #2838).\n */\nfunction enumMemberComments(metadata: EnumMemberNaming = {}): IrComment[] {\n const description = enumMemberDescription(metadata.description);\n return description ? [{ kind: \"line\", text: ` ${description}` }] : [];\n}\n\n/** The members of an enum, by value, with optional metadata at the same index. */\nexport interface EnumMembers {\n readonly values: readonly (string | number)[];\n readonly metadata: readonly (EnumMemberNaming | undefined)[];\n}\n\n/** Separates a repeated member name from its number: `reactions_1` → `reactions_1_2`. */\nconst MEMBER_NUMBER_SEPARATOR = \"_\";\n\n/** The `count`-th use of a member name; a quoted name gets the number inside the quotes. */\nfunction numberedMemberName(name: string, count: number): string {\n const isQuoted = name.startsWith('\"');\n const raw = isQuoted ? (JSON.parse(name) as string) : name;\n const numbered = `${raw}${MEMBER_NUMBER_SEPARATOR}${count}`;\n return isQuoted ? quotedMemberName(numbered) : numbered;\n}\n\n/**\n * An exported enum with an already built `name`; member names advance the naming state. Values\n * whose names come out the same (`reactions-+1` and `reactions--1` are both `reactions_1`) would\n * not compile, so a repeated name gets a number (`reactions_1_2`).\n */\nexport function enumDeclaration(\n name: string,\n members: EnumMembers,\n naming: EnumNaming,\n): IrEnumDeclaration {\n const names = members.values.map((value, index) =>\n naming.memberName(value, members.metadata[index]),\n );\n const uniqueNames = withNumberedRepeats(names, numberedMemberName);\n return {\n kind: \"enum\",\n name,\n isExported: true,\n members: members.values.map((value, index) => ({\n name: uniqueNames[index] as string,\n value,\n comments: enumMemberComments(members.metadata[index]),\n })),\n comments: [],\n };\n}\n\n/** The member names an enum name has so far, with their values. */\nexport type DeclaredMembers = ReadonlyMap<string, string | number>;\n\n/**\n * A later declaration of an enum name merges with the earlier ones, and a member name declared\n * twice does not compile (TS2300): a property and an inline `allOf` item of one schema give one\n * name. A member that repeats one by name and value is left out; one whose name another value has\n * gets the next free number (`a_b_2`).\n */\nexport function withoutDeclaredMembers(\n declaration: IrEnumDeclaration,\n declared: DeclaredMembers,\n): IrEnumDeclaration {\n const taken = new Set(declared.keys());\n const members: IrEnumDeclaration[\"members\"][number][] = [];\n for (const member of declaration.members) {\n if (declared.get(member.name) === member.value) {\n continue;\n }\n let name = member.name;\n for (let count = 2; taken.has(name); count++) {\n name = numberedMemberName(member.name, count);\n }\n taken.add(name);\n members.push(name === member.name ? member : { ...member, name });\n }\n return { ...declaration, members };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const constructors = require('../../../domain/ir/constructors.cjs');
|
|
4
|
+
const helperTypes = require('../helper-types.cjs');
|
|
5
|
+
const literalType = require('../literal-type.cjs');
|
|
6
|
+
const typeCombinators = require('../type-combinators.cjs');
|
|
7
|
+
const evaluation = require('./evaluation.cjs');
|
|
8
|
+
const typeEvaluation = require('./type-evaluation.cjs');
|
|
9
|
+
|
|
10
|
+
function literalAdmission(type, value) {
|
|
11
|
+
switch (type.kind) {
|
|
12
|
+
case "stringLiteral":
|
|
13
|
+
case "numberLiteral":
|
|
14
|
+
return type.value === value ? "yes" : "no";
|
|
15
|
+
case "booleanLiteral":
|
|
16
|
+
return "no";
|
|
17
|
+
case "keyword":
|
|
18
|
+
if (type.keyword === "unknown") {
|
|
19
|
+
return "yes";
|
|
20
|
+
}
|
|
21
|
+
return type.keyword === typeof value ? "yes" : "no";
|
|
22
|
+
case "object":
|
|
23
|
+
return type.members.length === 0 ? "yes" : "no";
|
|
24
|
+
case "array":
|
|
25
|
+
return "no";
|
|
26
|
+
default:
|
|
27
|
+
return "opaque";
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function admission(evaluator, value, item) {
|
|
31
|
+
const { type } = value;
|
|
32
|
+
if (type.kind === "union" || type.kind === "intersection") {
|
|
33
|
+
const parts = type.types.map((part) => {
|
|
34
|
+
const expanded = evaluator.expand({ ...value, type: part });
|
|
35
|
+
return expanded.kind === "type" ? admission(evaluator, expanded, item) : "opaque";
|
|
36
|
+
});
|
|
37
|
+
const decisive = type.kind === "union" ? "yes" : "no";
|
|
38
|
+
if (parts.includes(decisive)) {
|
|
39
|
+
return decisive;
|
|
40
|
+
}
|
|
41
|
+
return parts.includes("opaque") ? "opaque" : decisive === "yes" ? "no" : "yes";
|
|
42
|
+
}
|
|
43
|
+
return literalAdmission(type, item);
|
|
44
|
+
}
|
|
45
|
+
function elementOf(evaluator, value) {
|
|
46
|
+
const members = evaluator.membersOf(value);
|
|
47
|
+
const elements = members.map(
|
|
48
|
+
(member) => member.kind === "type" && member.type.kind === "array" ? member.type.element : null
|
|
49
|
+
);
|
|
50
|
+
if (members.length === 0 || elements.some((element) => element === null)) {
|
|
51
|
+
return value;
|
|
52
|
+
}
|
|
53
|
+
return evaluator.expand({ ...value, type: typeCombinators.unionOf(elements) });
|
|
54
|
+
}
|
|
55
|
+
const LITERAL_KINDS = /* @__PURE__ */ new Set([
|
|
56
|
+
"stringLiteral",
|
|
57
|
+
"numberLiteral",
|
|
58
|
+
"booleanLiteral"
|
|
59
|
+
]);
|
|
60
|
+
function isFiniteType(evaluator, value) {
|
|
61
|
+
const { type } = value;
|
|
62
|
+
if (type.kind === "union" || type.kind === "intersection") {
|
|
63
|
+
return type.types.every((part) => {
|
|
64
|
+
const expanded = evaluator.expand({ ...value, type: part });
|
|
65
|
+
return expanded.kind === "type" && isFiniteType(evaluator, expanded);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return LITERAL_KINDS.has(type.kind) || type.kind === "keyword" && type.keyword === "never";
|
|
69
|
+
}
|
|
70
|
+
function locationType(declaration) {
|
|
71
|
+
const { type } = declaration;
|
|
72
|
+
const isTyped = type.kind === "reference" && type.name === helperTypes.HELPER_TYPES.readonlyArray.name;
|
|
73
|
+
return isTyped ? type.typeArguments[0] ?? null : null;
|
|
74
|
+
}
|
|
75
|
+
function retypeOf(evaluator, declaration) {
|
|
76
|
+
const location = locationType(declaration);
|
|
77
|
+
const evaluated = location === null ? null : evaluator.evaluate(location);
|
|
78
|
+
if (evaluated === null || evaluated.kind === "opaque") {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
if (evaluated.kind === "missing") {
|
|
82
|
+
return { kind: "untyped", name: declaration.name };
|
|
83
|
+
}
|
|
84
|
+
const element = elementOf(evaluator, evaluated);
|
|
85
|
+
if (element.kind !== "type") {
|
|
86
|
+
return element.kind === "missing" ? { kind: "untyped", name: declaration.name } : null;
|
|
87
|
+
}
|
|
88
|
+
if (declaration.values.length === 0 && isNever(element.type)) {
|
|
89
|
+
return { kind: "untyped", name: declaration.name };
|
|
90
|
+
}
|
|
91
|
+
const results = declaration.values.map((value) => admission(evaluator, element, value));
|
|
92
|
+
if (!results.includes("no")) {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
if (!isFiniteType(evaluator, element)) {
|
|
96
|
+
return { kind: "untyped", name: declaration.name };
|
|
97
|
+
}
|
|
98
|
+
const excluded = declaration.values.filter((_, index) => results[index] === "no");
|
|
99
|
+
return { kind: "excluded", name: declaration.name, excluded };
|
|
100
|
+
}
|
|
101
|
+
function isNever(type) {
|
|
102
|
+
return type.kind === "keyword" && type.keyword === "never";
|
|
103
|
+
}
|
|
104
|
+
function ownValuesType(declaration) {
|
|
105
|
+
if (declaration.values.length === 0) {
|
|
106
|
+
return constructors.irReadonly(constructors.irArray(evaluation.NEVER));
|
|
107
|
+
}
|
|
108
|
+
const values = typeCombinators.unionOf(declaration.values.map((value) => literalType.literalType(value)));
|
|
109
|
+
return constructors.irReference(helperTypes.HELPER_TYPES.readonlyArray.name, [values]);
|
|
110
|
+
}
|
|
111
|
+
function checkedEnumValues(footer, declarations, isDeclaration) {
|
|
112
|
+
const evaluator = new typeEvaluation.TypeEvaluator([...declarations, ...footer.filter(isDeclaration)]);
|
|
113
|
+
const retyped = [];
|
|
114
|
+
const checked = footer.map((entry) => {
|
|
115
|
+
if (!isDeclaration(entry) || entry.kind !== "constArray") {
|
|
116
|
+
return entry;
|
|
117
|
+
}
|
|
118
|
+
const retype = retypeOf(evaluator, entry);
|
|
119
|
+
if (retype === null) {
|
|
120
|
+
return entry;
|
|
121
|
+
}
|
|
122
|
+
retyped.push(retype);
|
|
123
|
+
return { ...entry, type: ownValuesType(entry) };
|
|
124
|
+
});
|
|
125
|
+
return { footer: checked, retyped };
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
exports.checkedEnumValues = checkedEnumValues;
|
|
129
|
+
//# sourceMappingURL=enum-values-check.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enum-values-check.cjs","sources":["../../../../src/application/transform/footer/enum-values-check.ts"],"sourcesContent":["import { irArray, irReadonly, irReference } from \"../../../domain/ir/constructors.js\";\nimport type { IrConstArrayDeclaration, IrDeclaration, IrType } from \"../../../domain/ir/nodes.js\";\nimport { HELPER_TYPES } from \"../helper-types.js\";\nimport { literalType } from \"../literal-type.js\";\nimport { unionOf } from \"../type-combinators.js\";\nimport { type Evaluated, type Evaluation, NEVER } from \"./evaluation.js\";\nimport { TypeEvaluator } from \"./type-evaluation.js\";\n\n/**\n * `--enum-values` arrays are typed by the location of their schema in the generated types\n * (`FlattenedDeepRequired<components>[\"schemas\"][\"A\"][\"status\"]`). Where that type surely does not\n * hold the values (ADR-027), the array is typed by its own values instead, so it compiles:\n * - the location indexes a key the generated type does not have (`definitions`, `allOf`, a\n * property of `unknown`), or\n * - the type there does not admit a listed value (an `allOf` of different enums, a discriminator\n * value the property enum does not list, an array next to other `anyOf` members).\n * Everything else stays as it was.\n */\n\n/** Why an array got its own values as its type. */\nexport type EnumValuesRetype =\n /** The location's type admits only other values, or none: the document contradicts itself. */\n | { readonly kind: \"excluded\"; readonly name: string; readonly excluded: readonly unknown[] }\n /** The location could not be typed; nothing to report, the array is right now. */\n | { readonly kind: \"untyped\"; readonly name: string };\n\ntype Admission = \"yes\" | \"no\" | \"opaque\";\n\nfunction literalAdmission(type: IrType, value: string | number): Admission {\n switch (type.kind) {\n case \"stringLiteral\":\n case \"numberLiteral\":\n return type.value === value ? \"yes\" : \"no\";\n case \"booleanLiteral\":\n return \"no\";\n case \"keyword\":\n if (type.keyword === \"unknown\") {\n return \"yes\";\n }\n return type.keyword === typeof value ? \"yes\" : \"no\";\n case \"object\":\n // `{}` (as in `string & {}`) admits every value but `null` and `undefined`.\n return type.members.length === 0 ? \"yes\" : \"no\";\n case \"array\":\n return \"no\";\n default:\n return \"opaque\";\n }\n}\n\nfunction admission(evaluator: TypeEvaluator, value: Evaluated, item: string | number): Admission {\n const { type } = value;\n if (type.kind === \"union\" || type.kind === \"intersection\") {\n const parts = type.types.map((part) => {\n const expanded = evaluator.expand({ ...value, type: part });\n return expanded.kind === \"type\" ? admission(evaluator, expanded, item) : \"opaque\";\n });\n // A union admits a value one member admits; an intersection excludes one a part excludes.\n const decisive: Admission = type.kind === \"union\" ? \"yes\" : \"no\";\n if (parts.includes(decisive)) {\n return decisive;\n }\n return parts.includes(\"opaque\") ? \"opaque\" : decisive === \"yes\" ? \"no\" : \"yes\";\n }\n return literalAdmission(type, item);\n}\n\n/** `ReadonlyArray<T>`: an array type `T` is the array itself, so its elements are checked. */\nfunction elementOf(evaluator: TypeEvaluator, value: Evaluated): Evaluation {\n const members = evaluator.membersOf(value);\n const elements = members.map((member) =>\n member.kind === \"type\" && member.type.kind === \"array\" ? member.type.element : null,\n );\n if (members.length === 0 || elements.some((element) => element === null)) {\n return value;\n }\n return evaluator.expand({ ...value, type: unionOf(elements as IrType[]) });\n}\n\nconst LITERAL_KINDS: ReadonlySet<string> = new Set([\n \"stringLiteral\",\n \"numberLiteral\",\n \"booleanLiteral\",\n]);\n\n/** Whether a type is made of literals only (or `never`): a finite set of values. */\nfunction isFiniteType(evaluator: TypeEvaluator, value: Evaluated): boolean {\n const { type } = value;\n if (type.kind === \"union\" || type.kind === \"intersection\") {\n return type.types.every((part) => {\n const expanded = evaluator.expand({ ...value, type: part });\n return expanded.kind === \"type\" && isFiniteType(evaluator, expanded);\n });\n }\n return LITERAL_KINDS.has(type.kind) || (type.kind === \"keyword\" && type.keyword === \"never\");\n}\n\nfunction locationType(declaration: IrConstArrayDeclaration): IrType | null {\n const { type } = declaration;\n const isTyped = type.kind === \"reference\" && type.name === HELPER_TYPES.readonlyArray.name;\n return isTyped ? (type.typeArguments[0] ?? null) : null;\n}\n\nfunction retypeOf(\n evaluator: TypeEvaluator,\n declaration: IrConstArrayDeclaration,\n): EnumValuesRetype | null {\n const location = locationType(declaration);\n const evaluated = location === null ? null : evaluator.evaluate(location);\n if (evaluated === null || evaluated.kind === \"opaque\") {\n return null;\n }\n if (evaluated.kind === \"missing\") {\n return { kind: \"untyped\", name: declaration.name };\n }\n const element = elementOf(evaluator, evaluated);\n if (element.kind !== \"type\") {\n return element.kind === \"missing\" ? { kind: \"untyped\", name: declaration.name } : null;\n }\n if (declaration.values.length === 0 && isNever(element.type)) {\n // The `ReadonlyArray` helper of `never` is `never` (`never` extends an array): not even `[]`.\n return { kind: \"untyped\", name: declaration.name };\n }\n const results = declaration.values.map((value) => admission(evaluator, element, value));\n if (!results.includes(\"no\")) {\n return null;\n }\n if (!isFiniteType(evaluator, element)) {\n return { kind: \"untyped\", name: declaration.name };\n }\n const excluded = declaration.values.filter((_, index) => results[index] === \"no\");\n return { kind: \"excluded\", name: declaration.name, excluded };\n}\n\nfunction isNever(type: IrType): boolean {\n return type.kind === \"keyword\" && type.keyword === \"never\";\n}\n\n/** The values' own type; with no values `readonly never[]` (`ReadonlyArray<never>` is never). */\nfunction ownValuesType(declaration: IrConstArrayDeclaration): IrType {\n if (declaration.values.length === 0) {\n return irReadonly(irArray(NEVER));\n }\n const values = unionOf(declaration.values.map((value) => literalType(value)));\n return irReference(HELPER_TYPES.readonlyArray.name, [values]);\n}\n\n/**\n * The footer with each `--enum-values` array whose location type does not hold its values typed\n * by its own values, and why each one changed. `declarations` are the document's types.\n */\nexport function checkedEnumValues<T>(\n footer: readonly (T | IrDeclaration)[],\n declarations: readonly IrDeclaration[],\n isDeclaration: (entry: T | IrDeclaration) => entry is IrDeclaration,\n): { footer: (T | IrDeclaration)[]; retyped: EnumValuesRetype[] } {\n const evaluator = new TypeEvaluator([...declarations, ...footer.filter(isDeclaration)]);\n const retyped: EnumValuesRetype[] = [];\n const checked = footer.map((entry) => {\n if (!isDeclaration(entry) || entry.kind !== \"constArray\") {\n return entry;\n }\n const retype = retypeOf(evaluator, entry);\n if (retype === null) {\n return entry;\n }\n retyped.push(retype);\n return { ...entry, type: ownValuesType(entry) };\n });\n return { footer: checked, retyped };\n}\n"],"names":["unionOf","HELPER_TYPES","irReadonly","irArray","NEVER","literalType","irReference","TypeEvaluator"],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { irReadonly, irReference, irArray } from '../../../domain/ir/constructors.mjs';
|
|
2
|
+
import { HELPER_TYPES } from '../helper-types.mjs';
|
|
3
|
+
import { literalType } from '../literal-type.mjs';
|
|
4
|
+
import { unionOf } from '../type-combinators.mjs';
|
|
5
|
+
import { NEVER } from './evaluation.mjs';
|
|
6
|
+
import { TypeEvaluator } from './type-evaluation.mjs';
|
|
7
|
+
|
|
8
|
+
function literalAdmission(type, value) {
|
|
9
|
+
switch (type.kind) {
|
|
10
|
+
case "stringLiteral":
|
|
11
|
+
case "numberLiteral":
|
|
12
|
+
return type.value === value ? "yes" : "no";
|
|
13
|
+
case "booleanLiteral":
|
|
14
|
+
return "no";
|
|
15
|
+
case "keyword":
|
|
16
|
+
if (type.keyword === "unknown") {
|
|
17
|
+
return "yes";
|
|
18
|
+
}
|
|
19
|
+
return type.keyword === typeof value ? "yes" : "no";
|
|
20
|
+
case "object":
|
|
21
|
+
return type.members.length === 0 ? "yes" : "no";
|
|
22
|
+
case "array":
|
|
23
|
+
return "no";
|
|
24
|
+
default:
|
|
25
|
+
return "opaque";
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function admission(evaluator, value, item) {
|
|
29
|
+
const { type } = value;
|
|
30
|
+
if (type.kind === "union" || type.kind === "intersection") {
|
|
31
|
+
const parts = type.types.map((part) => {
|
|
32
|
+
const expanded = evaluator.expand({ ...value, type: part });
|
|
33
|
+
return expanded.kind === "type" ? admission(evaluator, expanded, item) : "opaque";
|
|
34
|
+
});
|
|
35
|
+
const decisive = type.kind === "union" ? "yes" : "no";
|
|
36
|
+
if (parts.includes(decisive)) {
|
|
37
|
+
return decisive;
|
|
38
|
+
}
|
|
39
|
+
return parts.includes("opaque") ? "opaque" : decisive === "yes" ? "no" : "yes";
|
|
40
|
+
}
|
|
41
|
+
return literalAdmission(type, item);
|
|
42
|
+
}
|
|
43
|
+
function elementOf(evaluator, value) {
|
|
44
|
+
const members = evaluator.membersOf(value);
|
|
45
|
+
const elements = members.map(
|
|
46
|
+
(member) => member.kind === "type" && member.type.kind === "array" ? member.type.element : null
|
|
47
|
+
);
|
|
48
|
+
if (members.length === 0 || elements.some((element) => element === null)) {
|
|
49
|
+
return value;
|
|
50
|
+
}
|
|
51
|
+
return evaluator.expand({ ...value, type: unionOf(elements) });
|
|
52
|
+
}
|
|
53
|
+
const LITERAL_KINDS = /* @__PURE__ */ new Set([
|
|
54
|
+
"stringLiteral",
|
|
55
|
+
"numberLiteral",
|
|
56
|
+
"booleanLiteral"
|
|
57
|
+
]);
|
|
58
|
+
function isFiniteType(evaluator, value) {
|
|
59
|
+
const { type } = value;
|
|
60
|
+
if (type.kind === "union" || type.kind === "intersection") {
|
|
61
|
+
return type.types.every((part) => {
|
|
62
|
+
const expanded = evaluator.expand({ ...value, type: part });
|
|
63
|
+
return expanded.kind === "type" && isFiniteType(evaluator, expanded);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
return LITERAL_KINDS.has(type.kind) || type.kind === "keyword" && type.keyword === "never";
|
|
67
|
+
}
|
|
68
|
+
function locationType(declaration) {
|
|
69
|
+
const { type } = declaration;
|
|
70
|
+
const isTyped = type.kind === "reference" && type.name === HELPER_TYPES.readonlyArray.name;
|
|
71
|
+
return isTyped ? type.typeArguments[0] ?? null : null;
|
|
72
|
+
}
|
|
73
|
+
function retypeOf(evaluator, declaration) {
|
|
74
|
+
const location = locationType(declaration);
|
|
75
|
+
const evaluated = location === null ? null : evaluator.evaluate(location);
|
|
76
|
+
if (evaluated === null || evaluated.kind === "opaque") {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
if (evaluated.kind === "missing") {
|
|
80
|
+
return { kind: "untyped", name: declaration.name };
|
|
81
|
+
}
|
|
82
|
+
const element = elementOf(evaluator, evaluated);
|
|
83
|
+
if (element.kind !== "type") {
|
|
84
|
+
return element.kind === "missing" ? { kind: "untyped", name: declaration.name } : null;
|
|
85
|
+
}
|
|
86
|
+
if (declaration.values.length === 0 && isNever(element.type)) {
|
|
87
|
+
return { kind: "untyped", name: declaration.name };
|
|
88
|
+
}
|
|
89
|
+
const results = declaration.values.map((value) => admission(evaluator, element, value));
|
|
90
|
+
if (!results.includes("no")) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
if (!isFiniteType(evaluator, element)) {
|
|
94
|
+
return { kind: "untyped", name: declaration.name };
|
|
95
|
+
}
|
|
96
|
+
const excluded = declaration.values.filter((_, index) => results[index] === "no");
|
|
97
|
+
return { kind: "excluded", name: declaration.name, excluded };
|
|
98
|
+
}
|
|
99
|
+
function isNever(type) {
|
|
100
|
+
return type.kind === "keyword" && type.keyword === "never";
|
|
101
|
+
}
|
|
102
|
+
function ownValuesType(declaration) {
|
|
103
|
+
if (declaration.values.length === 0) {
|
|
104
|
+
return irReadonly(irArray(NEVER));
|
|
105
|
+
}
|
|
106
|
+
const values = unionOf(declaration.values.map((value) => literalType(value)));
|
|
107
|
+
return irReference(HELPER_TYPES.readonlyArray.name, [values]);
|
|
108
|
+
}
|
|
109
|
+
function checkedEnumValues(footer, declarations, isDeclaration) {
|
|
110
|
+
const evaluator = new TypeEvaluator([...declarations, ...footer.filter(isDeclaration)]);
|
|
111
|
+
const retyped = [];
|
|
112
|
+
const checked = footer.map((entry) => {
|
|
113
|
+
if (!isDeclaration(entry) || entry.kind !== "constArray") {
|
|
114
|
+
return entry;
|
|
115
|
+
}
|
|
116
|
+
const retype = retypeOf(evaluator, entry);
|
|
117
|
+
if (retype === null) {
|
|
118
|
+
return entry;
|
|
119
|
+
}
|
|
120
|
+
retyped.push(retype);
|
|
121
|
+
return { ...entry, type: ownValuesType(entry) };
|
|
122
|
+
});
|
|
123
|
+
return { footer: checked, retyped };
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export { checkedEnumValues };
|
|
127
|
+
//# sourceMappingURL=enum-values-check.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enum-values-check.mjs","sources":["../../../../src/application/transform/footer/enum-values-check.ts"],"sourcesContent":["import { irArray, irReadonly, irReference } from \"../../../domain/ir/constructors.js\";\nimport type { IrConstArrayDeclaration, IrDeclaration, IrType } from \"../../../domain/ir/nodes.js\";\nimport { HELPER_TYPES } from \"../helper-types.js\";\nimport { literalType } from \"../literal-type.js\";\nimport { unionOf } from \"../type-combinators.js\";\nimport { type Evaluated, type Evaluation, NEVER } from \"./evaluation.js\";\nimport { TypeEvaluator } from \"./type-evaluation.js\";\n\n/**\n * `--enum-values` arrays are typed by the location of their schema in the generated types\n * (`FlattenedDeepRequired<components>[\"schemas\"][\"A\"][\"status\"]`). Where that type surely does not\n * hold the values (ADR-027), the array is typed by its own values instead, so it compiles:\n * - the location indexes a key the generated type does not have (`definitions`, `allOf`, a\n * property of `unknown`), or\n * - the type there does not admit a listed value (an `allOf` of different enums, a discriminator\n * value the property enum does not list, an array next to other `anyOf` members).\n * Everything else stays as it was.\n */\n\n/** Why an array got its own values as its type. */\nexport type EnumValuesRetype =\n /** The location's type admits only other values, or none: the document contradicts itself. */\n | { readonly kind: \"excluded\"; readonly name: string; readonly excluded: readonly unknown[] }\n /** The location could not be typed; nothing to report, the array is right now. */\n | { readonly kind: \"untyped\"; readonly name: string };\n\ntype Admission = \"yes\" | \"no\" | \"opaque\";\n\nfunction literalAdmission(type: IrType, value: string | number): Admission {\n switch (type.kind) {\n case \"stringLiteral\":\n case \"numberLiteral\":\n return type.value === value ? \"yes\" : \"no\";\n case \"booleanLiteral\":\n return \"no\";\n case \"keyword\":\n if (type.keyword === \"unknown\") {\n return \"yes\";\n }\n return type.keyword === typeof value ? \"yes\" : \"no\";\n case \"object\":\n // `{}` (as in `string & {}`) admits every value but `null` and `undefined`.\n return type.members.length === 0 ? \"yes\" : \"no\";\n case \"array\":\n return \"no\";\n default:\n return \"opaque\";\n }\n}\n\nfunction admission(evaluator: TypeEvaluator, value: Evaluated, item: string | number): Admission {\n const { type } = value;\n if (type.kind === \"union\" || type.kind === \"intersection\") {\n const parts = type.types.map((part) => {\n const expanded = evaluator.expand({ ...value, type: part });\n return expanded.kind === \"type\" ? admission(evaluator, expanded, item) : \"opaque\";\n });\n // A union admits a value one member admits; an intersection excludes one a part excludes.\n const decisive: Admission = type.kind === \"union\" ? \"yes\" : \"no\";\n if (parts.includes(decisive)) {\n return decisive;\n }\n return parts.includes(\"opaque\") ? \"opaque\" : decisive === \"yes\" ? \"no\" : \"yes\";\n }\n return literalAdmission(type, item);\n}\n\n/** `ReadonlyArray<T>`: an array type `T` is the array itself, so its elements are checked. */\nfunction elementOf(evaluator: TypeEvaluator, value: Evaluated): Evaluation {\n const members = evaluator.membersOf(value);\n const elements = members.map((member) =>\n member.kind === \"type\" && member.type.kind === \"array\" ? member.type.element : null,\n );\n if (members.length === 0 || elements.some((element) => element === null)) {\n return value;\n }\n return evaluator.expand({ ...value, type: unionOf(elements as IrType[]) });\n}\n\nconst LITERAL_KINDS: ReadonlySet<string> = new Set([\n \"stringLiteral\",\n \"numberLiteral\",\n \"booleanLiteral\",\n]);\n\n/** Whether a type is made of literals only (or `never`): a finite set of values. */\nfunction isFiniteType(evaluator: TypeEvaluator, value: Evaluated): boolean {\n const { type } = value;\n if (type.kind === \"union\" || type.kind === \"intersection\") {\n return type.types.every((part) => {\n const expanded = evaluator.expand({ ...value, type: part });\n return expanded.kind === \"type\" && isFiniteType(evaluator, expanded);\n });\n }\n return LITERAL_KINDS.has(type.kind) || (type.kind === \"keyword\" && type.keyword === \"never\");\n}\n\nfunction locationType(declaration: IrConstArrayDeclaration): IrType | null {\n const { type } = declaration;\n const isTyped = type.kind === \"reference\" && type.name === HELPER_TYPES.readonlyArray.name;\n return isTyped ? (type.typeArguments[0] ?? null) : null;\n}\n\nfunction retypeOf(\n evaluator: TypeEvaluator,\n declaration: IrConstArrayDeclaration,\n): EnumValuesRetype | null {\n const location = locationType(declaration);\n const evaluated = location === null ? null : evaluator.evaluate(location);\n if (evaluated === null || evaluated.kind === \"opaque\") {\n return null;\n }\n if (evaluated.kind === \"missing\") {\n return { kind: \"untyped\", name: declaration.name };\n }\n const element = elementOf(evaluator, evaluated);\n if (element.kind !== \"type\") {\n return element.kind === \"missing\" ? { kind: \"untyped\", name: declaration.name } : null;\n }\n if (declaration.values.length === 0 && isNever(element.type)) {\n // The `ReadonlyArray` helper of `never` is `never` (`never` extends an array): not even `[]`.\n return { kind: \"untyped\", name: declaration.name };\n }\n const results = declaration.values.map((value) => admission(evaluator, element, value));\n if (!results.includes(\"no\")) {\n return null;\n }\n if (!isFiniteType(evaluator, element)) {\n return { kind: \"untyped\", name: declaration.name };\n }\n const excluded = declaration.values.filter((_, index) => results[index] === \"no\");\n return { kind: \"excluded\", name: declaration.name, excluded };\n}\n\nfunction isNever(type: IrType): boolean {\n return type.kind === \"keyword\" && type.keyword === \"never\";\n}\n\n/** The values' own type; with no values `readonly never[]` (`ReadonlyArray<never>` is never). */\nfunction ownValuesType(declaration: IrConstArrayDeclaration): IrType {\n if (declaration.values.length === 0) {\n return irReadonly(irArray(NEVER));\n }\n const values = unionOf(declaration.values.map((value) => literalType(value)));\n return irReference(HELPER_TYPES.readonlyArray.name, [values]);\n}\n\n/**\n * The footer with each `--enum-values` array whose location type does not hold its values typed\n * by its own values, and why each one changed. `declarations` are the document's types.\n */\nexport function checkedEnumValues<T>(\n footer: readonly (T | IrDeclaration)[],\n declarations: readonly IrDeclaration[],\n isDeclaration: (entry: T | IrDeclaration) => entry is IrDeclaration,\n): { footer: (T | IrDeclaration)[]; retyped: EnumValuesRetype[] } {\n const evaluator = new TypeEvaluator([...declarations, ...footer.filter(isDeclaration)]);\n const retyped: EnumValuesRetype[] = [];\n const checked = footer.map((entry) => {\n if (!isDeclaration(entry) || entry.kind !== \"constArray\") {\n return entry;\n }\n const retype = retypeOf(evaluator, entry);\n if (retype === null) {\n return entry;\n }\n retyped.push(retype);\n return { ...entry, type: ownValuesType(entry) };\n });\n return { footer: checked, retyped };\n}\n"],"names":[],"mappings":"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"}
|