openapi-typesafe 0.0.0 → 1.0.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +71 -1
- package/bin/cli.js +4 -0
- package/dist/adapters/node-file-system/node-file-system.cjs +46 -0
- package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -0
- package/dist/adapters/node-file-system/node-file-system.mjs +40 -0
- package/dist/adapters/node-file-system/node-file-system.mjs.map +1 -0
- package/dist/adapters/redocly-loader/alias-limit.cjs +16 -0
- package/dist/adapters/redocly-loader/alias-limit.cjs.map +1 -0
- package/dist/adapters/redocly-loader/alias-limit.mjs +14 -0
- package/dist/adapters/redocly-loader/alias-limit.mjs.map +1 -0
- package/dist/adapters/redocly-loader/allowed-hosts.cjs +42 -0
- package/dist/adapters/redocly-loader/allowed-hosts.cjs.map +1 -0
- package/dist/adapters/redocly-loader/allowed-hosts.mjs +40 -0
- package/dist/adapters/redocly-loader/allowed-hosts.mjs.map +1 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.cjs +53 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.cjs.map +1 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.mjs +51 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.mjs.map +1 -0
- package/dist/adapters/redocly-loader/malformed-refs.cjs +41 -0
- package/dist/adapters/redocly-loader/malformed-refs.cjs.map +1 -0
- package/dist/adapters/redocly-loader/malformed-refs.mjs +38 -0
- package/dist/adapters/redocly-loader/malformed-refs.mjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-config-source.cjs +42 -0
- package/dist/adapters/redocly-loader/redocly-config-source.cjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-config-source.mjs +35 -0
- package/dist/adapters/redocly-loader/redocly-config-source.mjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +169 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +167 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-access.cjs +107 -0
- package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-access.mjs +99 -0
- package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-holders.cjs +31 -0
- package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -0
- package/dist/adapters/redocly-loader/ref-holders.mjs +29 -0
- package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -0
- package/dist/adapters/redocly-loader/remote-fetch.cjs +60 -0
- package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -0
- package/dist/adapters/redocly-loader/remote-fetch.mjs +56 -0
- package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-load-errors.cjs +87 -0
- package/dist/adapters/redocly-loader/schema-load-errors.cjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-load-errors.mjs +77 -0
- package/dist/adapters/redocly-loader/schema-load-errors.mjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-source.cjs +104 -0
- package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-source.mjs +98 -0
- package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -0
- package/dist/adapters/redocly-loader/unsupported-keys.cjs +62 -0
- package/dist/adapters/redocly-loader/unsupported-keys.cjs.map +1 -0
- package/dist/adapters/redocly-loader/unsupported-keys.mjs +58 -0
- package/dist/adapters/redocly-loader/unsupported-keys.mjs.map +1 -0
- package/dist/adapters/terminal-logger/terminal-logger.cjs +67 -0
- package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -0
- package/dist/adapters/terminal-logger/terminal-logger.mjs +59 -0
- package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.cjs +21 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.mjs +17 -0
- package/dist/adapters/type-ast-bridge/footer-nodes.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.cjs +75 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.mjs +71 -0
- package/dist/adapters/type-ast-bridge/ir-declarations-to-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs +145 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs +139 -0
- package/dist/adapters/type-ast-bridge/ir-to-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/lazy-node.cjs +23 -0
- package/dist/adapters/type-ast-bridge/lazy-node.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/lazy-node.mjs +21 -0
- package/dist/adapters/type-ast-bridge/lazy-node.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/load-typescript.cjs +57 -0
- package/dist/adapters/type-ast-bridge/load-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/load-typescript.mjs +51 -0
- package/dist/adapters/type-ast-bridge/load-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/print-typescript.cjs +21 -0
- package/dist/adapters/type-ast-bridge/print-typescript.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/print-typescript.mjs +19 -0
- package/dist/adapters/type-ast-bridge/print-typescript.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.cjs +33 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.mjs +29 -0
- package/dist/adapters/type-ast-bridge/typescript-raw-text.mjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.cjs +204 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.cjs.map +1 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.mjs +201 -0
- package/dist/adapters/type-ast-bridge/typescript-to-ir.mjs.map +1 -0
- package/dist/api/ast-to-string.cjs +39 -0
- package/dist/api/ast-to-string.cjs.map +1 -0
- package/dist/api/ast-to-string.mjs +37 -0
- package/dist/api/ast-to-string.mjs.map +1 -0
- package/dist/api/comment-header.cjs +11 -0
- package/dist/api/comment-header.cjs.map +1 -0
- package/dist/api/comment-header.mjs +9 -0
- package/dist/api/comment-header.mjs.map +1 -0
- package/dist/api/default-ports.cjs +38 -0
- package/dist/api/default-ports.cjs.map +1 -0
- package/dist/api/default-ports.mjs +28 -0
- package/dist/api/default-ports.mjs.map +1 -0
- package/dist/api/discriminator-enum.cjs +44 -0
- package/dist/api/discriminator-enum.cjs.map +1 -0
- package/dist/api/discriminator-enum.mjs +42 -0
- package/dist/api/discriminator-enum.mjs.map +1 -0
- package/dist/api/discriminator-scan.cjs +168 -0
- package/dist/api/discriminator-scan.cjs.map +1 -0
- package/dist/api/discriminator-scan.mjs +165 -0
- package/dist/api/discriminator-scan.mjs.map +1 -0
- package/dist/api/document-declarations.cjs +28 -0
- package/dist/api/document-declarations.cjs.map +1 -0
- package/dist/api/document-declarations.mjs +26 -0
- package/dist/api/document-declarations.mjs.map +1 -0
- package/dist/api/document-refs.cjs +53 -0
- package/dist/api/document-refs.cjs.map +1 -0
- package/dist/api/document-refs.mjs +50 -0
- package/dist/api/document-refs.mjs.map +1 -0
- package/dist/api/document-run.cjs +107 -0
- package/dist/api/document-run.cjs.map +1 -0
- package/dist/api/document-run.mjs +101 -0
- package/dist/api/document-run.mjs.map +1 -0
- package/dist/api/footer-entry.cjs +18 -0
- package/dist/api/footer-entry.cjs.map +1 -0
- package/dist/api/footer-entry.mjs +15 -0
- package/dist/api/footer-entry.mjs.map +1 -0
- package/dist/api/footer-sink.cjs +53 -0
- package/dist/api/footer-sink.cjs.map +1 -0
- package/dist/api/footer-sink.mjs +51 -0
- package/dist/api/footer-sink.mjs.map +1 -0
- package/dist/api/legacy-callback-warning.cjs +25 -0
- package/dist/api/legacy-callback-warning.cjs.map +1 -0
- package/dist/api/legacy-callback-warning.mjs +22 -0
- package/dist/api/legacy-callback-warning.mjs.map +1 -0
- package/dist/api/legacy-ts-helpers.cjs +203 -0
- package/dist/api/legacy-ts-helpers.cjs.map +1 -0
- package/dist/api/legacy-ts-helpers.mjs +187 -0
- package/dist/api/legacy-ts-helpers.mjs.map +1 -0
- package/dist/api/legacy-utils.cjs +65 -0
- package/dist/api/legacy-utils.cjs.map +1 -0
- package/dist/api/legacy-utils.mjs +50 -0
- package/dist/api/legacy-utils.mjs.map +1 -0
- package/dist/api/openapi-ts.cjs +40 -0
- package/dist/api/openapi-ts.cjs.map +1 -0
- package/dist/api/openapi-ts.mjs +34 -0
- package/dist/api/openapi-ts.mjs.map +1 -0
- package/dist/api/schema-callbacks.cjs +140 -0
- package/dist/api/schema-callbacks.cjs.map +1 -0
- package/dist/api/schema-callbacks.mjs +136 -0
- package/dist/api/schema-callbacks.mjs.map +1 -0
- package/dist/api/string-to-ast.cjs +21 -0
- package/dist/api/string-to-ast.cjs.map +1 -0
- package/dist/api/string-to-ast.mjs +18 -0
- package/dist/api/string-to-ast.mjs.map +1 -0
- package/dist/api/transform-context.cjs +82 -0
- package/dist/api/transform-context.cjs.map +1 -0
- package/dist/api/transform-context.mjs +65 -0
- package/dist/api/transform-context.mjs.map +1 -0
- package/dist/api/transform-schema.cjs +31 -0
- package/dist/api/transform-schema.cjs.map +1 -0
- package/dist/api/transform-schema.mjs +26 -0
- package/dist/api/transform-schema.mjs.map +1 -0
- package/dist/api/type-helpers.cjs +85 -0
- package/dist/api/type-helpers.cjs.map +1 -0
- package/dist/api/type-helpers.mjs +66 -0
- package/dist/api/type-helpers.mjs.map +1 -0
- package/dist/api/unsupported-feature-warnings.cjs +17 -0
- package/dist/api/unsupported-feature-warnings.cjs.map +1 -0
- package/dist/api/unsupported-feature-warnings.mjs +15 -0
- package/dist/api/unsupported-feature-warnings.mjs.map +1 -0
- package/dist/application/print/comment-writer.cjs +95 -0
- package/dist/application/print/comment-writer.cjs.map +1 -0
- package/dist/application/print/comment-writer.mjs +93 -0
- package/dist/application/print/comment-writer.mjs.map +1 -0
- package/dist/application/print/declaration-printer.cjs +83 -0
- package/dist/application/print/declaration-printer.cjs.map +1 -0
- package/dist/application/print/declaration-printer.mjs +81 -0
- package/dist/application/print/declaration-printer.mjs.map +1 -0
- package/dist/application/print/literal-text.cjs +52 -0
- package/dist/application/print/literal-text.cjs.map +1 -0
- package/dist/application/print/literal-text.mjs +48 -0
- package/dist/application/print/literal-text.mjs.map +1 -0
- package/dist/application/print/print-nodes.cjs +38 -0
- package/dist/application/print/print-nodes.cjs.map +1 -0
- package/dist/application/print/print-nodes.mjs +36 -0
- package/dist/application/print/print-nodes.mjs.map +1 -0
- package/dist/application/print/print-options.cjs +6 -0
- package/dist/application/print/print-options.cjs.map +1 -0
- package/dist/application/print/print-options.mjs +4 -0
- package/dist/application/print/print-options.mjs.map +1 -0
- package/dist/application/print/text-writer.cjs +63 -0
- package/dist/application/print/text-writer.cjs.map +1 -0
- package/dist/application/print/text-writer.mjs +60 -0
- package/dist/application/print/text-writer.mjs.map +1 -0
- package/dist/application/print/type-printer.cjs +214 -0
- package/dist/application/print/type-printer.cjs.map +1 -0
- package/dist/application/print/type-printer.mjs +210 -0
- package/dist/application/print/type-printer.mjs.map +1 -0
- package/dist/application/stack-overflow.cjs +36 -0
- package/dist/application/stack-overflow.cjs.map +1 -0
- package/dist/application/stack-overflow.mjs +31 -0
- package/dist/application/stack-overflow.mjs.map +1 -0
- package/dist/application/transform/document/components.cjs +104 -0
- package/dist/application/transform/document/components.cjs.map +1 -0
- package/dist/application/transform/document/components.mjs +102 -0
- package/dist/application/transform/document/components.mjs.map +1 -0
- package/dist/application/transform/document/defs-root.cjs +18 -0
- package/dist/application/transform/document/defs-root.cjs.map +1 -0
- package/dist/application/transform/document/defs-root.mjs +16 -0
- package/dist/application/transform/document/defs-root.mjs.map +1 -0
- package/dist/application/transform/document/document-member.cjs +13 -0
- package/dist/application/transform/document/document-member.cjs.map +1 -0
- package/dist/application/transform/document/document-member.mjs +11 -0
- package/dist/application/transform/document/document-member.mjs.map +1 -0
- package/dist/application/transform/document/document.cjs +86 -0
- package/dist/application/transform/document/document.cjs.map +1 -0
- package/dist/application/transform/document/document.mjs +83 -0
- package/dist/application/transform/document/document.mjs.map +1 -0
- package/dist/application/transform/document/header.cjs +27 -0
- package/dist/application/transform/document/header.cjs.map +1 -0
- package/dist/application/transform/document/header.mjs +25 -0
- package/dist/application/transform/document/header.mjs.map +1 -0
- package/dist/application/transform/document/kept-deprecated.cjs +96 -0
- package/dist/application/transform/document/kept-deprecated.cjs.map +1 -0
- package/dist/application/transform/document/kept-deprecated.mjs +94 -0
- package/dist/application/transform/document/kept-deprecated.mjs.map +1 -0
- package/dist/application/transform/document/media-type.cjs +42 -0
- package/dist/application/transform/document/media-type.cjs.map +1 -0
- package/dist/application/transform/document/media-type.mjs +38 -0
- package/dist/application/transform/document/media-type.mjs.map +1 -0
- package/dist/application/transform/document/operation.cjs +45 -0
- package/dist/application/transform/document/operation.cjs.map +1 -0
- package/dist/application/transform/document/operation.mjs +43 -0
- package/dist/application/transform/document/operation.mjs.map +1 -0
- package/dist/application/transform/document/parameter.cjs +25 -0
- package/dist/application/transform/document/parameter.cjs.map +1 -0
- package/dist/application/transform/document/parameter.mjs +23 -0
- package/dist/application/transform/document/parameter.mjs.map +1 -0
- package/dist/application/transform/document/parameters.cjs +114 -0
- package/dist/application/transform/document/parameters.cjs.map +1 -0
- package/dist/application/transform/document/parameters.mjs +112 -0
- package/dist/application/transform/document/parameters.mjs.map +1 -0
- package/dist/application/transform/document/path-item-conflicts.cjs +51 -0
- package/dist/application/transform/document/path-item-conflicts.cjs.map +1 -0
- package/dist/application/transform/document/path-item-conflicts.mjs +49 -0
- package/dist/application/transform/document/path-item-conflicts.mjs.map +1 -0
- package/dist/application/transform/document/path-item.cjs +82 -0
- package/dist/application/transform/document/path-item.cjs.map +1 -0
- package/dist/application/transform/document/path-item.mjs +80 -0
- package/dist/application/transform/document/path-item.mjs.map +1 -0
- package/dist/application/transform/document/path-key-overlaps.cjs +57 -0
- package/dist/application/transform/document/path-key-overlaps.cjs.map +1 -0
- package/dist/application/transform/document/path-key-overlaps.mjs +55 -0
- package/dist/application/transform/document/path-key-overlaps.mjs.map +1 -0
- package/dist/application/transform/document/paths-enum.cjs +75 -0
- package/dist/application/transform/document/paths-enum.cjs.map +1 -0
- package/dist/application/transform/document/paths-enum.mjs +72 -0
- package/dist/application/transform/document/paths-enum.mjs.map +1 -0
- package/dist/application/transform/document/paths.cjs +127 -0
- package/dist/application/transform/document/paths.cjs.map +1 -0
- package/dist/application/transform/document/paths.mjs +125 -0
- package/dist/application/transform/document/paths.mjs.map +1 -0
- package/dist/application/transform/document/request-body.cjs +36 -0
- package/dist/application/transform/document/request-body.cjs.map +1 -0
- package/dist/application/transform/document/request-body.mjs +34 -0
- package/dist/application/transform/document/request-body.mjs.map +1 -0
- package/dist/application/transform/document/response.cjs +59 -0
- package/dist/application/transform/document/response.cjs.map +1 -0
- package/dist/application/transform/document/response.mjs +57 -0
- package/dist/application/transform/document/response.mjs.map +1 -0
- package/dist/application/transform/document/responses.cjs +23 -0
- package/dist/application/transform/document/responses.cjs.map +1 -0
- package/dist/application/transform/document/responses.mjs +21 -0
- package/dist/application/transform/document/responses.mjs.map +1 -0
- package/dist/application/transform/document/root-type-aliases.cjs +69 -0
- package/dist/application/transform/document/root-type-aliases.cjs.map +1 -0
- package/dist/application/transform/document/root-type-aliases.mjs +65 -0
- package/dist/application/transform/document/root-type-aliases.mjs.map +1 -0
- package/dist/application/transform/document/webhooks.cjs +19 -0
- package/dist/application/transform/document/webhooks.cjs.map +1 -0
- package/dist/application/transform/document/webhooks.mjs +17 -0
- package/dist/application/transform/document/webhooks.mjs.map +1 -0
- package/dist/application/transform/document-entries.cjs +17 -0
- package/dist/application/transform/document-entries.cjs.map +1 -0
- package/dist/application/transform/document-entries.mjs +14 -0
- package/dist/application/transform/document-entries.mjs.map +1 -0
- package/dist/application/transform/footer/document-footer.cjs +88 -0
- package/dist/application/transform/footer/document-footer.cjs.map +1 -0
- package/dist/application/transform/footer/document-footer.mjs +86 -0
- package/dist/application/transform/footer/document-footer.mjs.map +1 -0
- package/dist/application/transform/footer/enum-naming.cjs +121 -0
- package/dist/application/transform/footer/enum-naming.cjs.map +1 -0
- package/dist/application/transform/footer/enum-naming.mjs +115 -0
- package/dist/application/transform/footer/enum-naming.mjs.map +1 -0
- package/dist/application/transform/helper-types.cjs +68 -0
- package/dist/application/transform/helper-types.cjs.map +1 -0
- package/dist/application/transform/helper-types.mjs +65 -0
- package/dist/application/transform/helper-types.mjs.map +1 -0
- package/dist/application/transform/literal-type.cjs +36 -0
- package/dist/application/transform/literal-type.cjs.map +1 -0
- package/dist/application/transform/literal-type.mjs +34 -0
- package/dist/application/transform/literal-type.mjs.map +1 -0
- package/dist/application/transform/numbered-names.cjs +18 -0
- package/dist/application/transform/numbered-names.cjs.map +1 -0
- package/dist/application/transform/numbered-names.mjs +16 -0
- package/dist/application/transform/numbered-names.mjs.map +1 -0
- package/dist/application/transform/ref-type.cjs +57 -0
- package/dist/application/transform/ref-type.cjs.map +1 -0
- package/dist/application/transform/ref-type.mjs +54 -0
- package/dist/application/transform/ref-type.mjs.map +1 -0
- package/dist/application/transform/schema/array-type.cjs +105 -0
- package/dist/application/transform/schema/array-type.cjs.map +1 -0
- package/dist/application/transform/schema/array-type.mjs +103 -0
- package/dist/application/transform/schema/array-type.mjs.map +1 -0
- package/dist/application/transform/schema/composition-type.cjs +107 -0
- package/dist/application/transform/schema/composition-type.cjs.map +1 -0
- package/dist/application/transform/schema/composition-type.mjs +105 -0
- package/dist/application/transform/schema/composition-type.mjs.map +1 -0
- package/dist/application/transform/schema/core-type.cjs +84 -0
- package/dist/application/transform/schema/core-type.cjs.map +1 -0
- package/dist/application/transform/schema/core-type.mjs +82 -0
- package/dist/application/transform/schema/core-type.mjs.map +1 -0
- package/dist/application/transform/schema/discriminator-property.cjs +21 -0
- package/dist/application/transform/schema/discriminator-property.cjs.map +1 -0
- package/dist/application/transform/schema/discriminator-property.mjs +19 -0
- package/dist/application/transform/schema/discriminator-property.mjs.map +1 -0
- package/dist/application/transform/schema/enum-rule.cjs +107 -0
- package/dist/application/transform/schema/enum-rule.cjs.map +1 -0
- package/dist/application/transform/schema/enum-rule.mjs +105 -0
- package/dist/application/transform/schema/enum-rule.mjs.map +1 -0
- package/dist/application/transform/schema/object-type.cjs +173 -0
- package/dist/application/transform/schema/object-type.cjs.map +1 -0
- package/dist/application/transform/schema/object-type.mjs +170 -0
- package/dist/application/transform/schema/object-type.mjs.map +1 -0
- package/dist/application/transform/schema/presence-members.cjs +59 -0
- package/dist/application/transform/schema/presence-members.cjs.map +1 -0
- package/dist/application/transform/schema/presence-members.mjs +57 -0
- package/dist/application/transform/schema/presence-members.mjs.map +1 -0
- package/dist/application/transform/schema/schema-transform.cjs +72 -0
- package/dist/application/transform/schema/schema-transform.cjs.map +1 -0
- package/dist/application/transform/schema/schema-transform.mjs +68 -0
- package/dist/application/transform/schema/schema-transform.mjs.map +1 -0
- package/dist/application/transform/schema/unevaluated-properties.cjs +61 -0
- package/dist/application/transform/schema/unevaluated-properties.cjs.map +1 -0
- package/dist/application/transform/schema/unevaluated-properties.mjs +59 -0
- package/dist/application/transform/schema/unevaluated-properties.mjs.map +1 -0
- package/dist/application/transform/schema-comment.cjs +84 -0
- package/dist/application/transform/schema-comment.cjs.map +1 -0
- package/dist/application/transform/schema-comment.mjs +81 -0
- package/dist/application/transform/schema-comment.mjs.map +1 -0
- package/dist/application/transform/shared-types.cjs +8 -0
- package/dist/application/transform/shared-types.cjs.map +1 -0
- package/dist/application/transform/shared-types.mjs +6 -0
- package/dist/application/transform/shared-types.mjs.map +1 -0
- package/dist/application/transform/type-combinators.cjs +49 -0
- package/dist/application/transform/type-combinators.cjs.map +1 -0
- package/dist/application/transform/type-combinators.mjs +42 -0
- package/dist/application/transform/type-combinators.mjs.map +1 -0
- package/dist/cli/cli-arguments.cjs +137 -0
- package/dist/cli/cli-arguments.cjs.map +1 -0
- package/dist/cli/cli-arguments.mjs +129 -0
- package/dist/cli/cli-arguments.mjs.map +1 -0
- package/dist/cli/cli-errors.cjs +80 -0
- package/dist/cli/cli-errors.cjs.map +1 -0
- package/dist/cli/cli-errors.mjs +76 -0
- package/dist/cli/cli-errors.mjs.map +1 -0
- package/dist/cli/cli-output.cjs +37 -0
- package/dist/cli/cli-output.cjs.map +1 -0
- package/dist/cli/cli-output.mjs +30 -0
- package/dist/cli/cli-output.mjs.map +1 -0
- package/dist/cli/docs-links.cjs +6 -0
- package/dist/cli/docs-links.cjs.map +1 -0
- package/dist/cli/docs-links.mjs +4 -0
- package/dist/cli/docs-links.mjs.map +1 -0
- package/dist/cli/fix-option.cjs +19 -0
- package/dist/cli/fix-option.cjs.map +1 -0
- package/dist/cli/fix-option.mjs +16 -0
- package/dist/cli/fix-option.mjs.map +1 -0
- package/dist/cli/help-text.cjs +44 -0
- package/dist/cli/help-text.cjs.map +1 -0
- package/dist/cli/help-text.mjs +42 -0
- package/dist/cli/help-text.mjs.map +1 -0
- package/dist/cli/main.cjs +62 -0
- package/dist/cli/main.cjs.map +1 -0
- package/dist/cli/main.d.cts +2 -0
- package/dist/cli/main.d.mts +2 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.mjs +54 -0
- package/dist/cli/main.mjs.map +1 -0
- package/dist/cli/redocly-apis.cjs +65 -0
- package/dist/cli/redocly-apis.cjs.map +1 -0
- package/dist/cli/redocly-apis.mjs +62 -0
- package/dist/cli/redocly-apis.mjs.map +1 -0
- package/dist/cli/ref-limits.cjs +14 -0
- package/dist/cli/ref-limits.cjs.map +1 -0
- package/dist/cli/ref-limits.mjs +12 -0
- package/dist/cli/ref-limits.mjs.map +1 -0
- package/dist/cli/run-cli.cjs +100 -0
- package/dist/cli/run-cli.cjs.map +1 -0
- package/dist/cli/run-cli.mjs +98 -0
- package/dist/cli/run-cli.mjs.map +1 -0
- package/dist/domain/assert-never.cjs +8 -0
- package/dist/domain/assert-never.cjs.map +1 -0
- package/dist/domain/assert-never.mjs +6 -0
- package/dist/domain/assert-never.mjs.map +1 -0
- package/dist/domain/errors.cjs +50 -0
- package/dist/domain/errors.cjs.map +1 -0
- package/dist/domain/errors.mjs +46 -0
- package/dist/domain/errors.mjs.map +1 -0
- package/dist/domain/ir/constructors.cjs +89 -0
- package/dist/domain/ir/constructors.cjs.map +1 -0
- package/dist/domain/ir/constructors.mjs +71 -0
- package/dist/domain/ir/constructors.mjs.map +1 -0
- package/dist/domain/ir/identifier-text.cjs +29 -0
- package/dist/domain/ir/identifier-text.cjs.map +1 -0
- package/dist/domain/ir/identifier-text.mjs +25 -0
- package/dist/domain/ir/identifier-text.mjs.map +1 -0
- package/dist/domain/ir/newer-identifier-ranges.cjs +109 -0
- package/dist/domain/ir/newer-identifier-ranges.cjs.map +1 -0
- package/dist/domain/ir/newer-identifier-ranges.mjs +106 -0
- package/dist/domain/ir/newer-identifier-ranges.mjs.map +1 -0
- package/dist/domain/ir/normalize.cjs +32 -0
- package/dist/domain/ir/normalize.cjs.map +1 -0
- package/dist/domain/ir/normalize.mjs +29 -0
- package/dist/domain/ir/normalize.mjs.map +1 -0
- package/dist/domain/ir/property-name.cjs +19 -0
- package/dist/domain/ir/property-name.cjs.map +1 -0
- package/dist/domain/ir/property-name.mjs +16 -0
- package/dist/domain/ir/property-name.mjs.map +1 -0
- package/dist/domain/ir/raw-text-escapes.cjs +25 -0
- package/dist/domain/ir/raw-text-escapes.cjs.map +1 -0
- package/dist/domain/ir/raw-text-escapes.mjs +22 -0
- package/dist/domain/ir/raw-text-escapes.mjs.map +1 -0
- package/dist/domain/openapi/alias-expansion.cjs +50 -0
- package/dist/domain/openapi/alias-expansion.cjs.map +1 -0
- package/dist/domain/openapi/alias-expansion.mjs +45 -0
- package/dist/domain/openapi/alias-expansion.mjs.map +1 -0
- package/dist/domain/openapi/binary-content.cjs +48 -0
- package/dist/domain/openapi/binary-content.cjs.map +1 -0
- package/dist/domain/openapi/binary-content.mjs +45 -0
- package/dist/domain/openapi/binary-content.mjs.map +1 -0
- package/dist/domain/openapi/components-object.cjs +29 -0
- package/dist/domain/openapi/components-object.cjs.map +1 -0
- package/dist/domain/openapi/components-object.mjs +24 -0
- package/dist/domain/openapi/components-object.mjs.map +1 -0
- package/dist/domain/openapi/json-pointer.cjs +31 -0
- package/dist/domain/openapi/json-pointer.cjs.map +1 -0
- package/dist/domain/openapi/json-pointer.mjs +27 -0
- package/dist/domain/openapi/json-pointer.mjs.map +1 -0
- package/dist/domain/openapi/media-type-object.cjs +14 -0
- package/dist/domain/openapi/media-type-object.cjs.map +1 -0
- package/dist/domain/openapi/media-type-object.mjs +11 -0
- package/dist/domain/openapi/media-type-object.mjs.map +1 -0
- package/dist/domain/openapi/parameter-object.cjs +13 -0
- package/dist/domain/openapi/parameter-object.cjs.map +1 -0
- package/dist/domain/openapi/parameter-object.mjs +10 -0
- package/dist/domain/openapi/parameter-object.mjs.map +1 -0
- package/dist/domain/openapi/path-item-object.cjs +35 -0
- package/dist/domain/openapi/path-item-object.cjs.map +1 -0
- package/dist/domain/openapi/path-item-object.mjs +30 -0
- package/dist/domain/openapi/path-item-object.mjs.map +1 -0
- package/dist/domain/openapi/unsupported-features.cjs +87 -0
- package/dist/domain/openapi/unsupported-features.cjs.map +1 -0
- package/dist/domain/openapi/unsupported-features.mjs +84 -0
- package/dist/domain/openapi/unsupported-features.mjs.map +1 -0
- package/dist/domain/output-fixes.cjs +66 -0
- package/dist/domain/output-fixes.cjs.map +1 -0
- package/dist/domain/output-fixes.mjs +59 -0
- package/dist/domain/output-fixes.mjs.map +1 -0
- package/dist/index.cjs +98 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +812 -0
- package/dist/index.d.mts +812 -0
- package/dist/index.d.ts +812 -0
- package/dist/index.mjs +27 -0
- package/dist/index.mjs.map +1 -0
- package/dist/transform/components-object.cjs +14 -0
- package/dist/transform/components-object.cjs.map +1 -0
- package/dist/transform/components-object.mjs +10 -0
- package/dist/transform/components-object.mjs.map +1 -0
- package/dist/transform/header-object.cjs +12 -0
- package/dist/transform/header-object.cjs.map +1 -0
- package/dist/transform/header-object.mjs +10 -0
- package/dist/transform/header-object.mjs.map +1 -0
- package/dist/transform/media-type-object.cjs +12 -0
- package/dist/transform/media-type-object.cjs.map +1 -0
- package/dist/transform/media-type-object.mjs +10 -0
- package/dist/transform/media-type-object.mjs.map +1 -0
- package/dist/transform/operation-object.cjs +26 -0
- package/dist/transform/operation-object.cjs.map +1 -0
- package/dist/transform/operation-object.mjs +21 -0
- package/dist/transform/operation-object.mjs.map +1 -0
- package/dist/transform/parameter-object.cjs +12 -0
- package/dist/transform/parameter-object.cjs.map +1 -0
- package/dist/transform/parameter-object.mjs +10 -0
- package/dist/transform/parameter-object.mjs.map +1 -0
- package/dist/transform/path-item-object.cjs +12 -0
- package/dist/transform/path-item-object.cjs.map +1 -0
- package/dist/transform/path-item-object.mjs +10 -0
- package/dist/transform/path-item-object.mjs.map +1 -0
- package/dist/transform/paths-object.cjs +11 -0
- package/dist/transform/paths-object.cjs.map +1 -0
- package/dist/transform/paths-object.mjs +9 -0
- package/dist/transform/paths-object.mjs.map +1 -0
- package/dist/transform/request-body-object.cjs +12 -0
- package/dist/transform/request-body-object.cjs.map +1 -0
- package/dist/transform/request-body-object.mjs +10 -0
- package/dist/transform/request-body-object.mjs.map +1 -0
- package/dist/transform/response-object.cjs +12 -0
- package/dist/transform/response-object.cjs.map +1 -0
- package/dist/transform/response-object.mjs +10 -0
- package/dist/transform/response-object.mjs.map +1 -0
- package/dist/transform/responses-object.cjs +12 -0
- package/dist/transform/responses-object.cjs.map +1 -0
- package/dist/transform/responses-object.mjs +10 -0
- package/dist/transform/responses-object.mjs.map +1 -0
- package/dist/transform/schema-object.cjs +21 -0
- package/dist/transform/schema-object.cjs.map +1 -0
- package/dist/transform/schema-object.mjs +16 -0
- package/dist/transform/schema-object.mjs.map +1 -0
- package/package.json +115 -4
- package/src/adapters/node-file-system/node-file-system.ts +44 -0
- package/src/adapters/redocly-loader/alias-limit.ts +20 -0
- package/src/adapters/redocly-loader/allowed-hosts.ts +62 -0
- package/src/adapters/redocly-loader/bundled-ref-repair.ts +65 -0
- package/src/adapters/redocly-loader/malformed-refs.ts +61 -0
- package/src/adapters/redocly-loader/redocly-config-source.ts +43 -0
- package/src/adapters/redocly-loader/redocly-schema-loader.ts +246 -0
- package/src/adapters/redocly-loader/ref-access.ts +146 -0
- package/src/adapters/redocly-loader/ref-holders.ts +43 -0
- package/src/adapters/redocly-loader/remote-fetch.ts +104 -0
- package/src/adapters/redocly-loader/schema-load-errors.ts +124 -0
- package/src/adapters/redocly-loader/schema-source.ts +151 -0
- package/src/adapters/redocly-loader/unsupported-keys.ts +102 -0
- package/src/adapters/terminal-logger/terminal-logger.ts +98 -0
- package/src/adapters/type-ast-bridge/footer-nodes.ts +38 -0
- package/src/adapters/type-ast-bridge/ir-declarations-to-typescript.ts +100 -0
- package/src/adapters/type-ast-bridge/ir-to-typescript.ts +220 -0
- package/src/adapters/type-ast-bridge/lazy-node.ts +24 -0
- package/src/adapters/type-ast-bridge/load-typescript.ts +84 -0
- package/src/adapters/type-ast-bridge/print-typescript.ts +33 -0
- package/src/adapters/type-ast-bridge/typescript-raw-text.ts +49 -0
- package/src/adapters/type-ast-bridge/typescript-to-ir.ts +280 -0
- package/src/adapters/type-ast-bridge/typescript-types.ts +8 -0
- package/src/api/ast-to-string.ts +59 -0
- package/src/api/comment-header.ts +7 -0
- package/src/api/default-ports.ts +44 -0
- package/src/api/discriminator-enum.ts +76 -0
- package/src/api/discriminator-scan.ts +272 -0
- package/src/api/document-declarations.ts +41 -0
- package/src/api/document-refs.ts +71 -0
- package/src/api/document-run.ts +159 -0
- package/src/api/footer-entry.ts +23 -0
- package/src/api/footer-sink.ts +67 -0
- package/src/api/legacy-callback-warning.ts +29 -0
- package/src/api/legacy-ts-helpers.ts +311 -0
- package/src/api/legacy-utils.ts +118 -0
- package/src/api/openapi-ts.ts +62 -0
- package/src/api/schema-callbacks.ts +211 -0
- package/src/api/string-to-ast.ts +27 -0
- package/src/api/transform-context.ts +87 -0
- package/src/api/transform-schema.ts +39 -0
- package/src/api/type-helpers.ts +130 -0
- package/src/api/unsupported-feature-warnings.ts +26 -0
- package/src/application/ports/file-system.ts +12 -0
- package/src/application/ports/logger.ts +16 -0
- package/src/application/ports/redocly-config-source.ts +16 -0
- package/src/application/ports/schema-loader.ts +32 -0
- package/src/application/print/comment-writer.ts +91 -0
- package/src/application/print/declaration-printer.ts +100 -0
- package/src/application/print/literal-text.ts +62 -0
- package/src/application/print/print-nodes.ts +62 -0
- package/src/application/print/print-options.ts +11 -0
- package/src/application/print/text-writer.ts +83 -0
- package/src/application/print/type-printer.ts +281 -0
- package/src/application/stack-overflow.ts +54 -0
- package/src/application/transform/document/components.ts +189 -0
- package/src/application/transform/document/defs-root.ts +25 -0
- package/src/application/transform/document/document-member.ts +20 -0
- package/src/application/transform/document/document.ts +157 -0
- package/src/application/transform/document/header.ts +34 -0
- package/src/application/transform/document/kept-deprecated.ts +135 -0
- package/src/application/transform/document/media-type.ts +78 -0
- package/src/application/transform/document/operation.ts +64 -0
- package/src/application/transform/document/parameter.ts +45 -0
- package/src/application/transform/document/parameters.ts +200 -0
- package/src/application/transform/document/path-item-conflicts.ts +79 -0
- package/src/application/transform/document/path-item.ts +168 -0
- package/src/application/transform/document/path-key-overlaps.ts +112 -0
- package/src/application/transform/document/paths-enum.ts +127 -0
- package/src/application/transform/document/paths.ts +211 -0
- package/src/application/transform/document/request-body.ts +50 -0
- package/src/application/transform/document/response.ts +109 -0
- package/src/application/transform/document/responses.ts +29 -0
- package/src/application/transform/document/root-type-aliases.ts +106 -0
- package/src/application/transform/document/webhooks.ts +22 -0
- package/src/application/transform/document-entries.ts +28 -0
- package/src/application/transform/footer/document-footer.ts +127 -0
- package/src/application/transform/footer/enum-naming.ts +181 -0
- package/src/application/transform/helper-types.ts +92 -0
- package/src/application/transform/literal-type.ts +54 -0
- package/src/application/transform/numbered-names.ts +20 -0
- package/src/application/transform/ref-type.ts +97 -0
- package/src/application/transform/schema/array-type.ts +152 -0
- package/src/application/transform/schema/composition-type.ts +183 -0
- package/src/application/transform/schema/core-type.ts +115 -0
- package/src/application/transform/schema/discriminator-property.ts +28 -0
- package/src/application/transform/schema/enum-rule.ts +157 -0
- package/src/application/transform/schema/object-type.ts +271 -0
- package/src/application/transform/schema/presence-members.ts +96 -0
- package/src/application/transform/schema/schema-context.ts +110 -0
- package/src/application/transform/schema/schema-rule.ts +29 -0
- package/src/application/transform/schema/schema-transform.ts +99 -0
- package/src/application/transform/schema/unevaluated-properties.ts +105 -0
- package/src/application/transform/schema-comment.ts +116 -0
- package/src/application/transform/shared-types.ts +9 -0
- package/src/application/transform/transform-context.ts +51 -0
- package/src/application/transform/type-combinators.ts +57 -0
- package/src/cli/cli-arguments.ts +198 -0
- package/src/cli/cli-dependencies.ts +42 -0
- package/src/cli/cli-errors.ts +125 -0
- package/src/cli/cli-output.ts +53 -0
- package/src/cli/docs-links.ts +6 -0
- package/src/cli/fix-option.ts +29 -0
- package/src/cli/help-text.ts +52 -0
- package/src/cli/main.ts +67 -0
- package/src/cli/redocly-apis.ts +91 -0
- package/src/cli/ref-limits.ts +16 -0
- package/src/cli/run-cli.ts +114 -0
- package/src/domain/assert-never.ts +8 -0
- package/src/domain/errors.ts +74 -0
- package/src/domain/ir/constructors.ts +137 -0
- package/src/domain/ir/identifier-text.ts +49 -0
- package/src/domain/ir/newer-identifier-ranges.ts +109 -0
- package/src/domain/ir/nodes.ts +224 -0
- package/src/domain/ir/normalize.ts +51 -0
- package/src/domain/ir/property-name.ts +28 -0
- package/src/domain/ir/raw-text-escapes.ts +37 -0
- package/src/domain/openapi/alias-expansion.ts +72 -0
- package/src/domain/openapi/binary-content.ts +74 -0
- package/src/domain/openapi/components-object.ts +52 -0
- package/src/domain/openapi/document-object.ts +12 -0
- package/src/domain/openapi/header-object.ts +9 -0
- package/src/domain/openapi/json-pointer.ts +46 -0
- package/src/domain/openapi/media-type-object.ts +26 -0
- package/src/domain/openapi/operation-object.ts +13 -0
- package/src/domain/openapi/parameter-object.ts +30 -0
- package/src/domain/openapi/path-item-object.ts +70 -0
- package/src/domain/openapi/request-body-object.ts +7 -0
- package/src/domain/openapi/response-object.ts +14 -0
- package/src/domain/openapi/schema-object.ts +59 -0
- package/src/domain/openapi/unsupported-features.ts +139 -0
- package/src/domain/output-fixes.ts +95 -0
- package/src/index.ts +67 -0
- package/src/transform/components-object.ts +25 -0
- package/src/transform/header-object.ts +19 -0
- package/src/transform/media-type-object.ts +19 -0
- package/src/transform/operation-object.ts +36 -0
- package/src/transform/parameter-object.ts +19 -0
- package/src/transform/parameters-array.ts +19 -0
- package/src/transform/path-item-object.ts +22 -0
- package/src/transform/paths-enum.ts +8 -0
- package/src/transform/paths-object.ts +15 -0
- package/src/transform/request-body-object.ts +19 -0
- package/src/transform/response-object.ts +19 -0
- package/src/transform/responses-object.ts +19 -0
- package/src/transform/schema-object.ts +36 -0
- package/src/transform/webhooks-object.ts +15 -0
- package/src/types/generator-options.ts +267 -0
- package/src/types/openapi-common.ts +100 -0
- package/src/types/openapi-document.ts +196 -0
- package/src/types/openapi-path-item.ts +130 -0
- package/src/types/openapi-request.ts +209 -0
- package/src/types/openapi-response.ts +81 -0
- package/src/types/openapi-schema.ts +169 -0
- package/src/types/openapi-security.ts +116 -0
- package/src/types.ts +12 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const constructors = require('../../../domain/ir/constructors.cjs');
|
|
4
|
+
const helperTypes = require('../helper-types.cjs');
|
|
5
|
+
const enumNaming = require('./enum-naming.cjs');
|
|
6
|
+
|
|
7
|
+
function dedupeKey(request) {
|
|
8
|
+
return [...request.values].sort(compareAsStrings).map((value, index) => metadataKey(String(value), request.metadata[index])).join(",");
|
|
9
|
+
}
|
|
10
|
+
function compareAsStrings(left, right) {
|
|
11
|
+
const leftText = String(left);
|
|
12
|
+
const rightText = String(right);
|
|
13
|
+
if (leftText === rightText) {
|
|
14
|
+
return 0;
|
|
15
|
+
}
|
|
16
|
+
return leftText < rightText ? -1 : 1;
|
|
17
|
+
}
|
|
18
|
+
function metadataKey(value, metadata) {
|
|
19
|
+
return `${metadata?.name ?? value}:${metadata?.description || ""}`;
|
|
20
|
+
}
|
|
21
|
+
function declarationKey(name, request) {
|
|
22
|
+
return JSON.stringify([name, request.values, request.metadata]);
|
|
23
|
+
}
|
|
24
|
+
class RunFooter {
|
|
25
|
+
naming = new enumNaming.EnumNaming();
|
|
26
|
+
enumNamesByKey = /* @__PURE__ */ new Map();
|
|
27
|
+
/** Declarations added already: the same one twice fails with "Duplicate identifier". */
|
|
28
|
+
declaredEnums = /* @__PURE__ */ new Set();
|
|
29
|
+
sink;
|
|
30
|
+
isDedupingEnums;
|
|
31
|
+
constructor(sink, isDedupingEnums) {
|
|
32
|
+
this.sink = sink;
|
|
33
|
+
this.isDedupingEnums = isDedupingEnums;
|
|
34
|
+
}
|
|
35
|
+
addEnum(request) {
|
|
36
|
+
const name = this.naming.enumName(request.name);
|
|
37
|
+
const key = this.isDedupingEnums ? dedupeKey(request) : null;
|
|
38
|
+
const known = key === null ? void 0 : this.enumNamesByKey.get(key);
|
|
39
|
+
if (known !== void 0) {
|
|
40
|
+
return known;
|
|
41
|
+
}
|
|
42
|
+
const declared = request.values.length > 0 ? declarationKey(name, request) : null;
|
|
43
|
+
if (declared !== null && this.declaredEnums.has(declared)) {
|
|
44
|
+
return name;
|
|
45
|
+
}
|
|
46
|
+
if (declared !== null) {
|
|
47
|
+
this.declaredEnums.add(declared);
|
|
48
|
+
}
|
|
49
|
+
this.sink.add(enumNaming.enumDeclaration(name, request, this.naming));
|
|
50
|
+
if (key !== null) {
|
|
51
|
+
this.enumNamesByKey.set(key, name);
|
|
52
|
+
}
|
|
53
|
+
return name;
|
|
54
|
+
}
|
|
55
|
+
addEnumValues(request) {
|
|
56
|
+
const name = this.naming.arrayName(request.name);
|
|
57
|
+
this.require(helperTypes.HELPER_TYPES.flattenedDeepRequired);
|
|
58
|
+
this.require(helperTypes.HELPER_TYPES.readonlyArray);
|
|
59
|
+
this.sink.add({
|
|
60
|
+
kind: "constArray",
|
|
61
|
+
name,
|
|
62
|
+
isExported: true,
|
|
63
|
+
type: readonlyArrayOf(request.type),
|
|
64
|
+
values: request.values,
|
|
65
|
+
comments: []
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
requireWithRequired() {
|
|
69
|
+
this.require(helperTypes.HELPER_TYPES.withRequired);
|
|
70
|
+
}
|
|
71
|
+
requirePropertyValues() {
|
|
72
|
+
this.require(helperTypes.HELPER_TYPES.propertyValues);
|
|
73
|
+
}
|
|
74
|
+
addOperation(build) {
|
|
75
|
+
this.sink.addOperation(build);
|
|
76
|
+
}
|
|
77
|
+
require(helper) {
|
|
78
|
+
if (!this.sink.hasTypeAlias(helper.name)) {
|
|
79
|
+
this.sink.add({ kind: "rawDeclaration", name: helper.name, text: helper.text });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function readonlyArrayOf(type) {
|
|
84
|
+
return constructors.irReference(helperTypes.HELPER_TYPES.readonlyArray.name, [type]);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
exports.RunFooter = RunFooter;
|
|
88
|
+
//# sourceMappingURL=document-footer.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-footer.cjs","sources":["../../../../src/application/transform/footer/document-footer.ts"],"sourcesContent":["import { irReference } from \"../../../domain/ir/constructors.js\";\nimport type { IrDeclaration, IrPropertySignature, IrType } from \"../../../domain/ir/nodes.js\";\nimport { HELPER_TYPES, type HelperType } from \"../helper-types.js\";\nimport type {\n EnumDeclarationRequest,\n EnumMemberMetadata,\n EnumValuesRequest,\n} from \"../schema/schema-context.js\";\nimport type { DocumentFooter } from \"../transform-context.js\";\nimport { EnumNaming, enumDeclaration } from \"./enum-naming.js\";\n\n/** Where footer declarations go, in order: the run's `ctx.injectFooter`, open to user code. */\nexport interface FooterSink {\n /** Whether a type alias with this name is declared already (by the generator or a user). */\n hasTypeAlias(name: string): boolean;\n add(declaration: IrDeclaration): void;\n /** Add a member to the `operations` interface, declared first if needed; see `DocumentFooter`. */\n addOperation(build: () => IrPropertySignature): void;\n}\n\n/**\n * The `--dedupe-enums` key of the original: the values in default sort order, each paired with\n * the metadata at its sorted position (not the value's own metadata), as the original does.\n */\nfunction dedupeKey(request: EnumDeclarationRequest): string {\n return [...request.values]\n .sort(compareAsStrings)\n .map((value, index) => metadataKey(String(value), request.metadata[index]))\n .join(\",\");\n}\n\n/** `Array.prototype.sort` without a comparator: compares the values as strings. */\nfunction compareAsStrings(left: string | number, right: string | number): number {\n const leftText = String(left);\n const rightText = String(right);\n if (leftText === rightText) {\n return 0;\n }\n return leftText < rightText ? -1 : 1;\n}\n\nfunction metadataKey(value: string, metadata: EnumMemberMetadata | undefined): string {\n return `${metadata?.name ?? value}:${metadata?.description || \"\"}`;\n}\n\n/** The whole declaration: an equal key means the same enum, member for member. */\nfunction declarationKey(name: string, request: EnumDeclarationRequest): string {\n return JSON.stringify([name, request.values, request.metadata]);\n}\n\n/**\n * The footer of one run: enums (deduplicated with `--dedupe-enums`), `--enum-values` arrays, the\n * helper types they need, and the `operations` interface. Replaces the original's module-level\n * `enumCache`, so runs no longer share enums (research/legacy-bugs.md, item 3).\n */\nexport class RunFooter implements DocumentFooter {\n private readonly naming = new EnumNaming();\n private readonly enumNamesByKey = new Map<string, string>();\n /** Declarations added already: the same one twice fails with \"Duplicate identifier\". */\n private readonly declaredEnums = new Set<string>();\n private readonly sink: FooterSink;\n private readonly isDedupingEnums: boolean;\n\n constructor(sink: FooterSink, isDedupingEnums: boolean) {\n this.sink = sink;\n this.isDedupingEnums = isDedupingEnums;\n }\n\n addEnum(request: EnumDeclarationRequest): string {\n // The name is built before the cache lookup: it advances the naming state either way.\n const name = this.naming.enumName(request.name);\n const key = this.isDedupingEnums ? dedupeKey(request) : null;\n const known = key === null ? undefined : this.enumNamesByKey.get(key);\n if (known !== undefined) {\n return known;\n }\n // Only a repeated member fails to compile; two empty declarations merge, so they stay.\n const declared = request.values.length > 0 ? declarationKey(name, request) : null;\n if (declared !== null && this.declaredEnums.has(declared)) {\n return name;\n }\n if (declared !== null) {\n this.declaredEnums.add(declared);\n }\n this.sink.add(enumDeclaration(name, request, this.naming));\n if (key !== null) {\n this.enumNamesByKey.set(key, name);\n }\n return name;\n }\n\n addEnumValues(request: EnumValuesRequest): void {\n const name = this.naming.arrayName(request.name);\n this.require(HELPER_TYPES.flattenedDeepRequired);\n this.require(HELPER_TYPES.readonlyArray);\n this.sink.add({\n kind: \"constArray\",\n name,\n isExported: true,\n type: readonlyArrayOf(request.type),\n values: request.values,\n comments: [],\n });\n }\n\n requireWithRequired(): void {\n this.require(HELPER_TYPES.withRequired);\n }\n\n requirePropertyValues(): void {\n this.require(HELPER_TYPES.propertyValues);\n }\n\n addOperation(build: () => IrPropertySignature): void {\n this.sink.addOperation(build);\n }\n\n private require(helper: HelperType): void {\n if (!this.sink.hasTypeAlias(helper.name)) {\n this.sink.add({ kind: \"rawDeclaration\", name: helper.name, text: helper.text });\n }\n }\n}\n\nfunction readonlyArrayOf(type: IrType): IrType {\n return irReference(HELPER_TYPES.readonlyArray.name, [type]);\n}\n"],"names":["EnumNaming","enumDeclaration","HELPER_TYPES","irReference"],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { irReference } from '../../../domain/ir/constructors.mjs';
|
|
2
|
+
import { HELPER_TYPES } from '../helper-types.mjs';
|
|
3
|
+
import { EnumNaming, enumDeclaration } from './enum-naming.mjs';
|
|
4
|
+
|
|
5
|
+
function dedupeKey(request) {
|
|
6
|
+
return [...request.values].sort(compareAsStrings).map((value, index) => metadataKey(String(value), request.metadata[index])).join(",");
|
|
7
|
+
}
|
|
8
|
+
function compareAsStrings(left, right) {
|
|
9
|
+
const leftText = String(left);
|
|
10
|
+
const rightText = String(right);
|
|
11
|
+
if (leftText === rightText) {
|
|
12
|
+
return 0;
|
|
13
|
+
}
|
|
14
|
+
return leftText < rightText ? -1 : 1;
|
|
15
|
+
}
|
|
16
|
+
function metadataKey(value, metadata) {
|
|
17
|
+
return `${metadata?.name ?? value}:${metadata?.description || ""}`;
|
|
18
|
+
}
|
|
19
|
+
function declarationKey(name, request) {
|
|
20
|
+
return JSON.stringify([name, request.values, request.metadata]);
|
|
21
|
+
}
|
|
22
|
+
class RunFooter {
|
|
23
|
+
naming = new EnumNaming();
|
|
24
|
+
enumNamesByKey = /* @__PURE__ */ new Map();
|
|
25
|
+
/** Declarations added already: the same one twice fails with "Duplicate identifier". */
|
|
26
|
+
declaredEnums = /* @__PURE__ */ new Set();
|
|
27
|
+
sink;
|
|
28
|
+
isDedupingEnums;
|
|
29
|
+
constructor(sink, isDedupingEnums) {
|
|
30
|
+
this.sink = sink;
|
|
31
|
+
this.isDedupingEnums = isDedupingEnums;
|
|
32
|
+
}
|
|
33
|
+
addEnum(request) {
|
|
34
|
+
const name = this.naming.enumName(request.name);
|
|
35
|
+
const key = this.isDedupingEnums ? dedupeKey(request) : null;
|
|
36
|
+
const known = key === null ? void 0 : this.enumNamesByKey.get(key);
|
|
37
|
+
if (known !== void 0) {
|
|
38
|
+
return known;
|
|
39
|
+
}
|
|
40
|
+
const declared = request.values.length > 0 ? declarationKey(name, request) : null;
|
|
41
|
+
if (declared !== null && this.declaredEnums.has(declared)) {
|
|
42
|
+
return name;
|
|
43
|
+
}
|
|
44
|
+
if (declared !== null) {
|
|
45
|
+
this.declaredEnums.add(declared);
|
|
46
|
+
}
|
|
47
|
+
this.sink.add(enumDeclaration(name, request, this.naming));
|
|
48
|
+
if (key !== null) {
|
|
49
|
+
this.enumNamesByKey.set(key, name);
|
|
50
|
+
}
|
|
51
|
+
return name;
|
|
52
|
+
}
|
|
53
|
+
addEnumValues(request) {
|
|
54
|
+
const name = this.naming.arrayName(request.name);
|
|
55
|
+
this.require(HELPER_TYPES.flattenedDeepRequired);
|
|
56
|
+
this.require(HELPER_TYPES.readonlyArray);
|
|
57
|
+
this.sink.add({
|
|
58
|
+
kind: "constArray",
|
|
59
|
+
name,
|
|
60
|
+
isExported: true,
|
|
61
|
+
type: readonlyArrayOf(request.type),
|
|
62
|
+
values: request.values,
|
|
63
|
+
comments: []
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
requireWithRequired() {
|
|
67
|
+
this.require(HELPER_TYPES.withRequired);
|
|
68
|
+
}
|
|
69
|
+
requirePropertyValues() {
|
|
70
|
+
this.require(HELPER_TYPES.propertyValues);
|
|
71
|
+
}
|
|
72
|
+
addOperation(build) {
|
|
73
|
+
this.sink.addOperation(build);
|
|
74
|
+
}
|
|
75
|
+
require(helper) {
|
|
76
|
+
if (!this.sink.hasTypeAlias(helper.name)) {
|
|
77
|
+
this.sink.add({ kind: "rawDeclaration", name: helper.name, text: helper.text });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function readonlyArrayOf(type) {
|
|
82
|
+
return irReference(HELPER_TYPES.readonlyArray.name, [type]);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export { RunFooter };
|
|
86
|
+
//# sourceMappingURL=document-footer.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-footer.mjs","sources":["../../../../src/application/transform/footer/document-footer.ts"],"sourcesContent":["import { irReference } from \"../../../domain/ir/constructors.js\";\nimport type { IrDeclaration, IrPropertySignature, IrType } from \"../../../domain/ir/nodes.js\";\nimport { HELPER_TYPES, type HelperType } from \"../helper-types.js\";\nimport type {\n EnumDeclarationRequest,\n EnumMemberMetadata,\n EnumValuesRequest,\n} from \"../schema/schema-context.js\";\nimport type { DocumentFooter } from \"../transform-context.js\";\nimport { EnumNaming, enumDeclaration } from \"./enum-naming.js\";\n\n/** Where footer declarations go, in order: the run's `ctx.injectFooter`, open to user code. */\nexport interface FooterSink {\n /** Whether a type alias with this name is declared already (by the generator or a user). */\n hasTypeAlias(name: string): boolean;\n add(declaration: IrDeclaration): void;\n /** Add a member to the `operations` interface, declared first if needed; see `DocumentFooter`. */\n addOperation(build: () => IrPropertySignature): void;\n}\n\n/**\n * The `--dedupe-enums` key of the original: the values in default sort order, each paired with\n * the metadata at its sorted position (not the value's own metadata), as the original does.\n */\nfunction dedupeKey(request: EnumDeclarationRequest): string {\n return [...request.values]\n .sort(compareAsStrings)\n .map((value, index) => metadataKey(String(value), request.metadata[index]))\n .join(\",\");\n}\n\n/** `Array.prototype.sort` without a comparator: compares the values as strings. */\nfunction compareAsStrings(left: string | number, right: string | number): number {\n const leftText = String(left);\n const rightText = String(right);\n if (leftText === rightText) {\n return 0;\n }\n return leftText < rightText ? -1 : 1;\n}\n\nfunction metadataKey(value: string, metadata: EnumMemberMetadata | undefined): string {\n return `${metadata?.name ?? value}:${metadata?.description || \"\"}`;\n}\n\n/** The whole declaration: an equal key means the same enum, member for member. */\nfunction declarationKey(name: string, request: EnumDeclarationRequest): string {\n return JSON.stringify([name, request.values, request.metadata]);\n}\n\n/**\n * The footer of one run: enums (deduplicated with `--dedupe-enums`), `--enum-values` arrays, the\n * helper types they need, and the `operations` interface. Replaces the original's module-level\n * `enumCache`, so runs no longer share enums (research/legacy-bugs.md, item 3).\n */\nexport class RunFooter implements DocumentFooter {\n private readonly naming = new EnumNaming();\n private readonly enumNamesByKey = new Map<string, string>();\n /** Declarations added already: the same one twice fails with \"Duplicate identifier\". */\n private readonly declaredEnums = new Set<string>();\n private readonly sink: FooterSink;\n private readonly isDedupingEnums: boolean;\n\n constructor(sink: FooterSink, isDedupingEnums: boolean) {\n this.sink = sink;\n this.isDedupingEnums = isDedupingEnums;\n }\n\n addEnum(request: EnumDeclarationRequest): string {\n // The name is built before the cache lookup: it advances the naming state either way.\n const name = this.naming.enumName(request.name);\n const key = this.isDedupingEnums ? dedupeKey(request) : null;\n const known = key === null ? undefined : this.enumNamesByKey.get(key);\n if (known !== undefined) {\n return known;\n }\n // Only a repeated member fails to compile; two empty declarations merge, so they stay.\n const declared = request.values.length > 0 ? declarationKey(name, request) : null;\n if (declared !== null && this.declaredEnums.has(declared)) {\n return name;\n }\n if (declared !== null) {\n this.declaredEnums.add(declared);\n }\n this.sink.add(enumDeclaration(name, request, this.naming));\n if (key !== null) {\n this.enumNamesByKey.set(key, name);\n }\n return name;\n }\n\n addEnumValues(request: EnumValuesRequest): void {\n const name = this.naming.arrayName(request.name);\n this.require(HELPER_TYPES.flattenedDeepRequired);\n this.require(HELPER_TYPES.readonlyArray);\n this.sink.add({\n kind: \"constArray\",\n name,\n isExported: true,\n type: readonlyArrayOf(request.type),\n values: request.values,\n comments: [],\n });\n }\n\n requireWithRequired(): void {\n this.require(HELPER_TYPES.withRequired);\n }\n\n requirePropertyValues(): void {\n this.require(HELPER_TYPES.propertyValues);\n }\n\n addOperation(build: () => IrPropertySignature): void {\n this.sink.addOperation(build);\n }\n\n private require(helper: HelperType): void {\n if (!this.sink.hasTypeAlias(helper.name)) {\n this.sink.add({ kind: \"rawDeclaration\", name: helper.name, text: helper.text });\n }\n }\n}\n\nfunction readonlyArrayOf(type: IrType): IrType {\n return irReference(HELPER_TYPES.readonlyArray.name, [type]);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
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
|
+
|
|
116
|
+
exports.EmptyEnumNameError = EmptyEnumNameError;
|
|
117
|
+
exports.EnumNaming = EnumNaming;
|
|
118
|
+
exports.enumDeclaration = enumDeclaration;
|
|
119
|
+
exports.enumMemberDescription = enumMemberDescription;
|
|
120
|
+
exports.quotedMemberName = quotedMemberName;
|
|
121
|
+
//# 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"],"names":["OpenAPITypesafeError","ERROR_CODES","withNumberedRepeats"],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
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
|
+
|
|
114
|
+
export { EmptyEnumNameError, EnumNaming, enumDeclaration, enumMemberDescription, quotedMemberName };
|
|
115
|
+
//# 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"],"names":[],"mappings":";;;AAIA,MAAM,aAAA,GAAgB,4BAAA;AAEtB,MAAM,6BAAA,GAAgC,sBAAA;AACtC,MAAM,cAAA,GAAiB,iBAAA;AACvB,MAAM,eAAA,GAAkB,kBAAA;AACxB,MAAM,oBAAA,GAAuB,gBAAA;AAC7B,MAAM,oBAAA,GAAuB,QAAA;AAE7B,MAAM,kBAAA,uBAAsD,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,MAAM,CAAC,CAAC,CAAA;AAC/E,MAAM,aAAA,GAAgB,OAAA;AACtB,MAAM,eAAA,GAAkB,YAAA;AAEjB,MAAM,2BAA2B,oBAAA,CAAqB;AAAA,EAC3D,YAAY,IAAA,EAAc;AACxB,IAAA,KAAA,CAAM;AAAA,MACJ,MAAM,WAAA,CAAY,eAAA;AAAA,MAClB,OAAA,EAAS,kDAAkD,IAAI,CAAA,sBAAA,CAAA;AAAA,MAC/D,OAAA,EAAS,EAAE,IAAA;AAAK,KACjB,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF;AAiBO,MAAM,UAAA,CAAW;AAAA,EACd,kBAAA,GAAqB,KAAA;AAAA;AAAA,EAG7B,SAAS,IAAA,EAAsB;AAC7B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AACpC,IAAA,OAAO,CAAA,EAAG,cAAA,CAAe,SAAA,EAAW,IAAI,CAAA,CAAE,WAAA,EAAa,CAAA,EAAG,SAAA,CAAU,SAAA,CAAU,CAAC,CAAC,CAAA,CAAA;AAAA,EAClF;AAAA;AAAA,EAGA,UAAU,IAAA,EAAsB;AAC9B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AACpC,IAAA,OAAO,CAAA,EAAG,cAAA,CAAe,SAAA,EAAW,IAAI,CAAA,CAAE,WAAA,EAAa,CAAA,EAAG,SAAA,CAAU,SAAA,CAAU,CAAC,CAAC,CAAA,CAAA;AAAA,EAClF;AAAA;AAAA,EAGA,UAAA,CAAW,KAAA,EAAwB,QAAA,GAA6B,EAAC,EAAW;AAC1E,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,IAAQ,MAAA,CAAO,KAAK,CAAA;AAC1C,IAAA,IAAI,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA,EAAG;AAC5B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAA;AAC1B,IAAA,MAAM,QAAA,GAAW,mBAAmB,IAAI,CAAA;AACxC,IAAA,MAAM,UAAA,GAAa,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA;AAC/C,IAAA,IAAI,CAAC,UAAA,EAAY;AAEf,MAAA,OAAO,QAAA,KAAa,EAAA,GAAK,gBAAA,CAAiB,QAAQ,CAAA,GAAI,QAAA;AAAA,IACxD;AACA,IAAA,OAAO,WAAW,CAAC,CAAA,KAAM,QAAA,GACrB,gBAAA,CAAiB,QAAQ,CAAA,GACzB,QAAA,CAAS,OAAA,CAAQ,eAAA,EAAiB,CAAC,GAAA,KAAQ,kBAAA,CAAmB,GAAA,CAAI,GAAG,KAAK,GAAG,CAAA;AAAA,EACnF;AAAA,EAEQ,SAAS,IAAA,EAAsB;AACrC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,6BAAA,EAA+B,CAAC,GAAA,KAAQ;AACrE,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,SAAS,CAAC,CAAA;AACtC,MAAA,OAAO,KAAK,SAAA,CAAU,IAAI,CAAA,GAAI,EAAA,GAAK,KAAK,WAAA,EAAY;AAAA,IACtD,CAAC,CAAA;AAID,IAAA,OAAO,oBAAA,CAAqB,KAAK,SAAS,CAAA,GAAI,GAAG,aAAa,CAAA,EAAG,SAAS,CAAA,CAAA,GAAK,SAAA;AAAA,EACjF;AAAA,EAEQ,UAAU,SAAA,EAA4B;AAC5C,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,MAAA,IAAA,CAAK,kBAAA,GAAqB,KAAA;AAC1B,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAA,CAAK,kBAAA,GAAqB,oBAAA,CAAqB,IAAA,CAAK,SAAS,CAAA;AAC7D,IAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,EACd;AACF;AAEA,SAAS,cAAA,CAAe,WAAmB,IAAA,EAAsB;AAC/D,EAAA,MAAM,KAAA,GAAQ,UAAU,CAAC,CAAA;AACzB,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,MAAM,IAAI,mBAAmB,IAAI,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,KAAA;AACT;AAMO,SAAS,iBAAiB,IAAA,EAAsB;AACrD,EAAA,OAAO,IAAA,CAAK,UAAU,IAAI,CAAA;AAC5B;AAEA,SAAS,mBAAmB,IAAA,EAAsB;AAChD,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,KAAK,CAAA,EAAG;AAExB,IAAA,OAAO,GAAG,aAAa,CAAA,EAAG,IAAI,CAAA,CAAA,CAAG,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,EACnD;AACA,EAAA,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,GAAM,CAAA,EAAG,eAAe,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA,GAAK,IAAA;AAClE;AAGA,MAAM,mBAAA,GAAsB,0BAAA;AAGrB,SAAS,sBAAsB,WAAA,EAAgD;AACpF,EAAA,OAAO,aAAa,IAAA,EAAK,CAAE,OAAA,CAAQ,mBAAA,EAAqB,GAAG,CAAA,IAAK,EAAA;AAClE;AAMA,SAAS,kBAAA,CAAmB,QAAA,GAA6B,EAAC,EAAgB;AACxE,EAAA,MAAM,WAAA,GAAc,qBAAA,CAAsB,QAAA,CAAS,WAAW,CAAA;AAC9D,EAAA,OAAO,WAAA,GAAc,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,EAAI,CAAA,GAAI,EAAC;AACtE;AASA,MAAM,uBAAA,GAA0B,GAAA;AAGhC,SAAS,kBAAA,CAAmB,MAAc,KAAA,EAAuB;AAC/D,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA;AACpC,EAAA,MAAM,GAAA,GAAM,QAAA,GAAY,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAe,IAAA;AACtD,EAAA,MAAM,WAAW,CAAA,EAAG,GAAG,CAAA,EAAG,uBAAuB,GAAG,KAAK,CAAA,CAAA;AACzD,EAAA,OAAO,QAAA,GAAW,gBAAA,CAAiB,QAAQ,CAAA,GAAI,QAAA;AACjD;AAOO,SAAS,eAAA,CACd,IAAA,EACA,OAAA,EACA,MAAA,EACmB;AACnB,EAAA,MAAM,KAAA,GAAQ,QAAQ,MAAA,CAAO,GAAA;AAAA,IAAI,CAAC,OAAO,KAAA,KACvC,MAAA,CAAO,WAAW,KAAA,EAAO,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAC;AAAA,GAClD;AACA,EAAA,MAAM,WAAA,GAAc,mBAAA,CAAoB,KAAA,EAAO,kBAAkB,CAAA;AACjE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,MAAA;AAAA,IACN,IAAA;AAAA,IACA,UAAA,EAAY,IAAA;AAAA,IACZ,SAAS,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,OAAO,KAAA,MAAW;AAAA,MAC7C,IAAA,EAAM,YAAY,KAAK,CAAA;AAAA,MACvB,KAAA;AAAA,MACA,QAAA,EAAU,kBAAA,CAAmB,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAC;AAAA,KACtD,CAAE,CAAA;AAAA,IACF,UAAU;AAAC,GACb;AACF;;"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function lines(...parts) {
|
|
4
|
+
return parts.join("\n");
|
|
5
|
+
}
|
|
6
|
+
const HELPER_TYPES = {
|
|
7
|
+
withRequired: {
|
|
8
|
+
name: "WithRequired",
|
|
9
|
+
text: lines("type WithRequired<T, K extends keyof T> = T & {", " [P in K]-?: T[P];", "};")
|
|
10
|
+
},
|
|
11
|
+
// `unevaluated-properties` (roadmap R11): the value types of every member of a union, so a
|
|
12
|
+
// `$ref` to a `oneOf` schema gives the values of each variant, not only of the shared keys.
|
|
13
|
+
propertyValues: {
|
|
14
|
+
name: "PropertyValues",
|
|
15
|
+
text: "type PropertyValues<T> = T extends unknown ? T[keyof T] : never;"
|
|
16
|
+
},
|
|
17
|
+
// Task 7.4 changes the original text on purpose: `readonly unknown[]` also flattens the arrays
|
|
18
|
+
// of `--immutable` (upstream #2714, #2749), and `NonNullable` looks through nullable parents
|
|
19
|
+
// (upstream #2737). The old text did not compile for those schemas.
|
|
20
|
+
flattenedDeepRequired: {
|
|
21
|
+
name: "FlattenedDeepRequired",
|
|
22
|
+
text: lines(
|
|
23
|
+
"type FlattenedDeepRequired<T> = {",
|
|
24
|
+
" [K in keyof T]-?: FlattenedDeepRequired<T[K] extends readonly unknown[] | undefined | null ? Extract<T[K], readonly unknown[]>[number] : NonNullable<T[K]>>;",
|
|
25
|
+
"};"
|
|
26
|
+
)
|
|
27
|
+
},
|
|
28
|
+
// `readonly unknown[]`: a readonly array value type stays as is (upstream #2749).
|
|
29
|
+
readonlyArray: {
|
|
30
|
+
name: "ReadonlyArray",
|
|
31
|
+
text: lines(
|
|
32
|
+
"type ReadonlyArray<T> = [",
|
|
33
|
+
" Exclude<T, undefined>",
|
|
34
|
+
"] extends [",
|
|
35
|
+
" readonly unknown[]",
|
|
36
|
+
"] ? Readonly<Exclude<T, undefined>> : Readonly<Exclude<T, undefined>[]>;"
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
const READ_WRITE_MARKER_TYPES = lines(
|
|
41
|
+
"export type $Read<T> = {",
|
|
42
|
+
" readonly $read: T;",
|
|
43
|
+
"};",
|
|
44
|
+
"export type $Write<T> = {",
|
|
45
|
+
" readonly $write: T;",
|
|
46
|
+
"};",
|
|
47
|
+
"type ReadWritePrimitive = string | number | boolean | bigint | symbol | null | undefined;",
|
|
48
|
+
"type ReadWriteLeaf = ReadWritePrimitive | ((...args: never) => unknown);",
|
|
49
|
+
"type ReadWriteMarkedKeys<T, Marker> = {",
|
|
50
|
+
" [K in keyof T]-?: NonNullable<T[K]> extends never ? never : NonNullable<T[K]> extends Marker ? K : never;",
|
|
51
|
+
"}[keyof T];",
|
|
52
|
+
'type ReadWriteResolveArray<T extends readonly unknown[], Resolved extends "read" | "write"> = T[number][] extends T ? T extends unknown[] ? ReadWriteResolve<T[number], Resolved>[] : readonly ReadWriteResolve<T[number], Resolved>[] : {',
|
|
53
|
+
" [K in keyof T]: ReadWriteResolve<T[K], Resolved>;",
|
|
54
|
+
"};",
|
|
55
|
+
'type ReadWriteResolve<T, Resolved extends "read" | "write"> = Resolved extends "read" ? Readable<T> : Writable<T>;',
|
|
56
|
+
'export type Readable<T> = T extends $Write<any> ? never : T extends $Read<infer U> ? Readable<U> : T extends ReadWriteLeaf ? T : T extends readonly unknown[] ? ReadWriteResolveArray<T, "read"> : T extends object ? {',
|
|
57
|
+
" [K in keyof T as K extends ReadWriteMarkedKeys<T, $Write<any>> ? never : K]: Readable<T[K]>;",
|
|
58
|
+
"} : T;",
|
|
59
|
+
'export type Writable<T> = T extends $Read<any> ? never : T extends $Write<infer U> ? Writable<U> : T extends ReadWriteLeaf ? T : T extends readonly unknown[] ? ReadWriteResolveArray<T, "write"> : T extends object ? {',
|
|
60
|
+
" [K in keyof T as K extends ReadWriteMarkedKeys<T, $Read<any>> ? never : K]: Writable<T[K]>;",
|
|
61
|
+
"} & {",
|
|
62
|
+
" [K in ReadWriteMarkedKeys<T, $Read<any>>]?: never;",
|
|
63
|
+
"} : T;"
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
exports.HELPER_TYPES = HELPER_TYPES;
|
|
67
|
+
exports.READ_WRITE_MARKER_TYPES = READ_WRITE_MARKER_TYPES;
|
|
68
|
+
//# sourceMappingURL=helper-types.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helper-types.cjs","sources":["../../../src/application/transform/helper-types.ts"],"sourcesContent":["/**\n * The helper type aliases the generator adds to the footer, declared once each. The text is the\n * original's source text as the TypeScript printer printed it, so printing it as written gives\n * the original output (ENGINEERING_PLAN 6.2 and 6.6), except for the fixes noted below.\n */\nexport interface HelperType {\n readonly name: string;\n readonly text: string;\n}\n\nfunction lines(...parts: readonly string[]): string {\n return parts.join(\"\\n\");\n}\n\nexport const HELPER_TYPES = {\n withRequired: {\n name: \"WithRequired\",\n text: lines(\"type WithRequired<T, K extends keyof T> = T & {\", \" [P in K]-?: T[P];\", \"};\"),\n },\n // `unevaluated-properties` (roadmap R11): the value types of every member of a union, so a\n // `$ref` to a `oneOf` schema gives the values of each variant, not only of the shared keys.\n propertyValues: {\n name: \"PropertyValues\",\n text: \"type PropertyValues<T> = T extends unknown ? T[keyof T] : never;\",\n },\n // Task 7.4 changes the original text on purpose: `readonly unknown[]` also flattens the arrays\n // of `--immutable` (upstream #2714, #2749), and `NonNullable` looks through nullable parents\n // (upstream #2737). The old text did not compile for those schemas.\n flattenedDeepRequired: {\n name: \"FlattenedDeepRequired\",\n text: lines(\n \"type FlattenedDeepRequired<T> = {\",\n \" [K in keyof T]-?: FlattenedDeepRequired<T[K] extends readonly unknown[] | undefined | \" +\n \"null ? Extract<T[K], readonly unknown[]>[number] : NonNullable<T[K]>>;\",\n \"};\",\n ),\n },\n // `readonly unknown[]`: a readonly array value type stays as is (upstream #2749).\n readonlyArray: {\n name: \"ReadonlyArray\",\n text: lines(\n \"type ReadonlyArray<T> = [\",\n \" Exclude<T, undefined>\",\n \"] extends [\",\n \" readonly unknown[]\",\n \"] ? Readonly<Exclude<T, undefined>> : Readonly<Exclude<T, undefined>[]>;\",\n ),\n },\n} as const satisfies Readonly<Record<string, HelperType>>;\n\n/**\n * The `--read-write-markers` helper types, written before the root types. Task 7.6 replaces the\n * original text on purpose (ADR-014): primitives (also branded), readonly arrays, tuples,\n * intersected arrays and null-only properties keep their types (upstream #2615, #2620, #2632,\n * #2717, #2765). The declarations equal `Readable` / `Writable` of openapi-typesafe-helpers\n * (`test/api/read-write-marker-types.test.ts`); the text is what the TypeScript printer prints.\n */\nexport const READ_WRITE_MARKER_TYPES = lines(\n \"export type $Read<T> = {\",\n \" readonly $read: T;\",\n \"};\",\n \"export type $Write<T> = {\",\n \" readonly $write: T;\",\n \"};\",\n \"type ReadWritePrimitive = string | number | boolean | bigint | symbol | null | undefined;\",\n \"type ReadWriteLeaf = ReadWritePrimitive | ((...args: never) => unknown);\",\n \"type ReadWriteMarkedKeys<T, Marker> = {\",\n \" [K in keyof T]-?: NonNullable<T[K]> extends never ? never : NonNullable<T[K]> \" +\n \"extends Marker ? K : never;\",\n \"}[keyof T];\",\n 'type ReadWriteResolveArray<T extends readonly unknown[], Resolved extends \"read\" | ' +\n '\"write\"> = T[number][] extends T ? T extends unknown[] ? ReadWriteResolve<T[number], ' +\n \"Resolved>[] : readonly ReadWriteResolve<T[number], Resolved>[] : {\",\n \" [K in keyof T]: ReadWriteResolve<T[K], Resolved>;\",\n \"};\",\n 'type ReadWriteResolve<T, Resolved extends \"read\" | \"write\"> = Resolved extends \"read\" ? ' +\n \"Readable<T> : Writable<T>;\",\n \"export type Readable<T> = T extends $Write<any> ? never : T extends $Read<infer U> ? \" +\n \"Readable<U> : T extends ReadWriteLeaf ? T : T extends readonly unknown[] ? \" +\n 'ReadWriteResolveArray<T, \"read\"> : T extends object ? {',\n \" [K in keyof T as K extends ReadWriteMarkedKeys<T, $Write<any>> ? never : K]: \" +\n \"Readable<T[K]>;\",\n \"} : T;\",\n \"export type Writable<T> = T extends $Read<any> ? never : T extends $Write<infer U> ? \" +\n \"Writable<U> : T extends ReadWriteLeaf ? T : T extends readonly unknown[] ? \" +\n 'ReadWriteResolveArray<T, \"write\"> : T extends object ? {',\n \" [K in keyof T as K extends ReadWriteMarkedKeys<T, $Read<any>> ? never : K]: \" +\n \"Writable<T[K]>;\",\n \"} & {\",\n \" [K in ReadWriteMarkedKeys<T, $Read<any>>]?: never;\",\n \"} : T;\",\n);\n"],"names":[],"mappings":";;AAUA,SAAS,SAAS,KAAA,EAAkC;AAClD,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEO,MAAM,YAAA,GAAe;AAAA,EAC1B,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,cAAA;AAAA,IACN,IAAA,EAAM,KAAA,CAAM,iDAAA,EAAmD,uBAAA,EAAyB,IAAI;AAAA,GAC9F;AAAA;AAAA;AAAA,EAGA,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,gBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA;AAAA;AAAA;AAAA,EAIA,qBAAA,EAAuB;AAAA,IACrB,IAAA,EAAM,uBAAA;AAAA,IACN,IAAA,EAAM,KAAA;AAAA,MACJ,mCAAA;AAAA,MACA,kKAAA;AAAA,MAEA;AAAA;AACF,GACF;AAAA;AAAA,EAEA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,eAAA;AAAA,IACN,IAAA,EAAM,KAAA;AAAA,MACJ,2BAAA;AAAA,MACA,2BAAA;AAAA,MACA,aAAA;AAAA,MACA,wBAAA;AAAA,MACA;AAAA;AACF;AAEJ;AASO,MAAM,uBAAA,GAA0B,KAAA;AAAA,EACrC,0BAAA;AAAA,EACA,wBAAA;AAAA,EACA,IAAA;AAAA,EACA,2BAAA;AAAA,EACA,yBAAA;AAAA,EACA,IAAA;AAAA,EACA,2FAAA;AAAA,EACA,0EAAA;AAAA,EACA,yCAAA;AAAA,EACA,+GAAA;AAAA,EAEA,aAAA;AAAA,EACA,4OAAA;AAAA,EAGA,uDAAA;AAAA,EACA,IAAA;AAAA,EACA,oHAAA;AAAA,EAEA,yNAAA;AAAA,EAGA,kGAAA;AAAA,EAEA,QAAA;AAAA,EACA,0NAAA;AAAA,EAGA,iGAAA;AAAA,EAEA,OAAA;AAAA,EACA,wDAAA;AAAA,EACA;AACF;;;"}
|