openapi-typesafe 1.0.0-rc.2 → 1.0.0-rc.4
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/CHANGELOG.md +1831 -0
- package/dist/adapters/node-deprecations/node-deprecations.cjs +14 -0
- package/dist/adapters/node-deprecations/node-deprecations.cjs.map +1 -0
- package/dist/adapters/node-deprecations/node-deprecations.mjs +12 -0
- package/dist/adapters/node-deprecations/node-deprecations.mjs.map +1 -0
- package/dist/adapters/node-file-system/file-claims.cjs +105 -0
- package/dist/adapters/node-file-system/file-claims.cjs.map +1 -0
- package/dist/adapters/node-file-system/file-claims.mjs +95 -0
- package/dist/adapters/node-file-system/file-claims.mjs.map +1 -0
- package/dist/adapters/node-file-system/file-identity.cjs +82 -0
- package/dist/adapters/node-file-system/file-identity.cjs.map +1 -0
- package/dist/adapters/node-file-system/file-identity.mjs +74 -0
- package/dist/adapters/node-file-system/file-identity.mjs.map +1 -0
- package/dist/adapters/node-file-system/node-file-system.cjs +90 -14
- package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -1
- package/dist/adapters/node-file-system/node-file-system.mjs +90 -14
- package/dist/adapters/node-file-system/node-file-system.mjs.map +1 -1
- package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs +75 -0
- package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs.map +1 -0
- package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs +72 -0
- package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs.map +1 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.cjs +1 -1
- package/dist/adapters/redocly-loader/bundled-ref-repair.cjs.map +1 -1
- package/dist/adapters/redocly-loader/bundled-ref-repair.mjs +2 -2
- package/dist/adapters/redocly-loader/bundled-ref-repair.mjs.map +1 -1
- package/dist/adapters/redocly-loader/loaded-documents.cjs +28 -0
- package/dist/adapters/redocly-loader/loaded-documents.cjs.map +1 -0
- package/dist/adapters/redocly-loader/loaded-documents.mjs +21 -0
- package/dist/adapters/redocly-loader/loaded-documents.mjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +14 -15
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -1
- package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +12 -13
- package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -1
- package/dist/adapters/redocly-loader/ref-access.cjs +31 -3
- package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -1
- package/dist/adapters/redocly-loader/ref-access.mjs +31 -3
- package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -1
- package/dist/adapters/redocly-loader/ref-holders.cjs +2 -2
- package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -1
- package/dist/adapters/redocly-loader/ref-holders.mjs +3 -3
- package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -1
- package/dist/adapters/redocly-loader/remote-body-limit.cjs +50 -0
- package/dist/adapters/redocly-loader/remote-body-limit.cjs.map +1 -0
- package/dist/adapters/redocly-loader/remote-body-limit.mjs +48 -0
- package/dist/adapters/redocly-loader/remote-body-limit.mjs.map +1 -0
- package/dist/adapters/redocly-loader/remote-fetch.cjs +35 -6
- package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -1
- package/dist/adapters/redocly-loader/remote-fetch.mjs +35 -6
- package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -1
- package/dist/adapters/redocly-loader/remote-node-limit.cjs +47 -0
- package/dist/adapters/redocly-loader/remote-node-limit.cjs.map +1 -0
- package/dist/adapters/redocly-loader/remote-node-limit.mjs +44 -0
- package/dist/adapters/redocly-loader/remote-node-limit.mjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-load-errors.cjs +32 -8
- package/dist/adapters/redocly-loader/schema-load-errors.cjs.map +1 -1
- package/dist/adapters/redocly-loader/schema-load-errors.mjs +32 -9
- package/dist/adapters/redocly-loader/schema-load-errors.mjs.map +1 -1
- package/dist/adapters/redocly-loader/schema-source.cjs +11 -7
- package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -1
- package/dist/adapters/redocly-loader/schema-source.mjs +12 -8
- package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -1
- package/dist/adapters/redocly-loader/unsupported-keys.cjs +3 -5
- package/dist/adapters/redocly-loader/unsupported-keys.cjs.map +1 -1
- package/dist/adapters/redocly-loader/unsupported-keys.mjs +3 -5
- package/dist/adapters/redocly-loader/unsupported-keys.mjs.map +1 -1
- package/dist/adapters/terminal-logger/terminal-logger.cjs +6 -4
- package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -1
- package/dist/adapters/terminal-logger/terminal-logger.mjs +6 -4
- package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -1
- package/dist/api/default-ports.cjs +19 -2
- package/dist/api/default-ports.cjs.map +1 -1
- package/dist/api/default-ports.mjs +19 -3
- package/dist/api/default-ports.mjs.map +1 -1
- package/dist/api/discriminator-conflict-warnings.cjs +1 -1
- package/dist/api/discriminator-conflict-warnings.cjs.map +1 -1
- package/dist/api/discriminator-conflict-warnings.mjs +2 -2
- package/dist/api/discriminator-conflict-warnings.mjs.map +1 -1
- package/dist/api/discriminator-enum-parent.cjs +2 -2
- package/dist/api/discriminator-enum-parent.cjs.map +1 -1
- package/dist/api/discriminator-enum-parent.mjs +3 -3
- package/dist/api/discriminator-enum-parent.mjs.map +1 -1
- package/dist/api/discriminator-other-owners.cjs +5 -3
- package/dist/api/discriminator-other-owners.cjs.map +1 -1
- package/dist/api/discriminator-other-owners.mjs +5 -3
- package/dist/api/discriminator-other-owners.mjs.map +1 -1
- package/dist/api/discriminator-patch.cjs +8 -4
- package/dist/api/discriminator-patch.cjs.map +1 -1
- package/dist/api/discriminator-patch.mjs +9 -5
- package/dist/api/discriminator-patch.mjs.map +1 -1
- package/dist/api/discriminator-scan.cjs +17 -10
- package/dist/api/discriminator-scan.cjs.map +1 -1
- package/dist/api/discriminator-scan.mjs +18 -11
- package/dist/api/discriminator-scan.mjs.map +1 -1
- package/dist/api/document-run.cjs +4 -3
- package/dist/api/document-run.cjs.map +1 -1
- package/dist/api/document-run.mjs +4 -3
- package/dist/api/document-run.mjs.map +1 -1
- package/dist/api/legacy-callback-warning.cjs +7 -4
- package/dist/api/legacy-callback-warning.cjs.map +1 -1
- package/dist/api/legacy-callback-warning.mjs +8 -5
- package/dist/api/legacy-callback-warning.mjs.map +1 -1
- package/dist/api/legacy-utils.cjs.map +1 -1
- package/dist/api/legacy-utils.mjs.map +1 -1
- package/dist/api/openapi-ts.cjs +9 -5
- package/dist/api/openapi-ts.cjs.map +1 -1
- package/dist/api/openapi-ts.mjs +10 -7
- package/dist/api/openapi-ts.mjs.map +1 -1
- package/dist/api/schema-callbacks.cjs +36 -12
- package/dist/api/schema-callbacks.cjs.map +1 -1
- package/dist/api/schema-callbacks.mjs +36 -12
- package/dist/api/schema-callbacks.mjs.map +1 -1
- package/dist/api/string-to-ast.cjs +7 -9
- package/dist/api/string-to-ast.cjs.map +1 -1
- package/dist/api/string-to-ast.mjs +8 -9
- package/dist/api/string-to-ast.mjs.map +1 -1
- package/dist/api/transform-context.cjs +7 -3
- package/dist/api/transform-context.cjs.map +1 -1
- package/dist/api/transform-context.mjs +7 -3
- package/dist/api/transform-context.mjs.map +1 -1
- package/dist/api/transform-schema.cjs +42 -12
- package/dist/api/transform-schema.cjs.map +1 -1
- package/dist/api/transform-schema.mjs +44 -14
- package/dist/api/transform-schema.mjs.map +1 -1
- package/dist/application/print/text-writer.cjs +10 -3
- package/dist/application/print/text-writer.cjs.map +1 -1
- package/dist/application/print/text-writer.mjs +10 -3
- package/dist/application/print/text-writer.mjs.map +1 -1
- package/dist/application/stack-overflow.cjs +2 -1
- package/dist/application/stack-overflow.cjs.map +1 -1
- package/dist/application/stack-overflow.mjs +2 -1
- package/dist/application/stack-overflow.mjs.map +1 -1
- package/dist/application/transform/document/components.cjs +2 -2
- package/dist/application/transform/document/components.cjs.map +1 -1
- package/dist/application/transform/document/components.mjs +4 -4
- package/dist/application/transform/document/components.mjs.map +1 -1
- package/dist/application/transform/document/declared-type-names.cjs +23 -0
- package/dist/application/transform/document/declared-type-names.cjs.map +1 -0
- package/dist/application/transform/document/declared-type-names.mjs +20 -0
- package/dist/application/transform/document/declared-type-names.mjs.map +1 -0
- package/dist/application/transform/document/defs-root.cjs +1 -1
- package/dist/application/transform/document/defs-root.cjs.map +1 -1
- package/dist/application/transform/document/defs-root.mjs +2 -2
- package/dist/application/transform/document/defs-root.mjs.map +1 -1
- package/dist/application/transform/document/document.cjs +4 -1
- package/dist/application/transform/document/document.cjs.map +1 -1
- package/dist/application/transform/document/document.mjs +3 -2
- package/dist/application/transform/document/document.mjs.map +1 -1
- package/dist/application/transform/document/enum-names-given-back.cjs +62 -0
- package/dist/application/transform/document/enum-names-given-back.cjs.map +1 -0
- package/dist/application/transform/document/enum-names-given-back.mjs +58 -0
- package/dist/application/transform/document/enum-names-given-back.mjs.map +1 -0
- package/dist/application/transform/document/global-type-references.cjs +1 -0
- package/dist/application/transform/document/global-type-references.cjs.map +1 -1
- package/dist/application/transform/document/global-type-references.mjs +1 -1
- package/dist/application/transform/document/global-type-references.mjs.map +1 -1
- package/dist/application/transform/document/media-type.cjs +2 -2
- package/dist/application/transform/document/media-type.cjs.map +1 -1
- package/dist/application/transform/document/media-type.mjs +3 -3
- package/dist/application/transform/document/media-type.mjs.map +1 -1
- package/dist/application/transform/document/operation-keys-written.cjs +26 -0
- package/dist/application/transform/document/operation-keys-written.cjs.map +1 -0
- package/dist/application/transform/document/operation-keys-written.mjs +24 -0
- package/dist/application/transform/document/operation-keys-written.mjs.map +1 -0
- package/dist/application/transform/document/operation.cjs +1 -1
- package/dist/application/transform/document/operation.cjs.map +1 -1
- package/dist/application/transform/document/operation.mjs +2 -2
- package/dist/application/transform/document/operation.mjs.map +1 -1
- package/dist/application/transform/document/parameter-entries.cjs +34 -0
- package/dist/application/transform/document/parameter-entries.cjs.map +1 -0
- package/dist/application/transform/document/parameter-entries.mjs +30 -0
- package/dist/application/transform/document/parameter-entries.mjs.map +1 -0
- package/dist/application/transform/document/parameter.cjs +12 -4
- package/dist/application/transform/document/parameter.cjs.map +1 -1
- package/dist/application/transform/document/parameter.mjs +13 -5
- package/dist/application/transform/document/parameter.mjs.map +1 -1
- package/dist/application/transform/document/parameters.cjs +7 -30
- package/dist/application/transform/document/parameters.cjs.map +1 -1
- package/dist/application/transform/document/parameters.mjs +8 -31
- package/dist/application/transform/document/parameters.mjs.map +1 -1
- package/dist/application/transform/document/path-item.cjs +11 -14
- package/dist/application/transform/document/path-item.cjs.map +1 -1
- package/dist/application/transform/document/path-item.mjs +12 -16
- package/dist/application/transform/document/path-item.mjs.map +1 -1
- package/dist/application/transform/document/paths-enum.cjs +1 -0
- package/dist/application/transform/document/paths-enum.cjs.map +1 -1
- package/dist/application/transform/document/paths-enum.mjs +1 -1
- package/dist/application/transform/document/paths-enum.mjs.map +1 -1
- package/dist/application/transform/document/paths.cjs +6 -2
- package/dist/application/transform/document/paths.cjs.map +1 -1
- package/dist/application/transform/document/paths.mjs +8 -4
- package/dist/application/transform/document/paths.mjs.map +1 -1
- package/dist/application/transform/document/referenced-parameter.cjs +80 -0
- package/dist/application/transform/document/referenced-parameter.cjs.map +1 -0
- package/dist/application/transform/document/referenced-parameter.mjs +78 -0
- package/dist/application/transform/document/referenced-parameter.mjs.map +1 -0
- package/dist/application/transform/document/request-body.cjs +1 -1
- package/dist/application/transform/document/request-body.cjs.map +1 -1
- package/dist/application/transform/document/request-body.mjs +2 -2
- package/dist/application/transform/document/request-body.mjs.map +1 -1
- package/dist/application/transform/document/response.cjs +2 -2
- package/dist/application/transform/document/response.cjs.map +1 -1
- package/dist/application/transform/document/response.mjs +3 -3
- package/dist/application/transform/document/response.mjs.map +1 -1
- package/dist/application/transform/document/responses.cjs +1 -1
- package/dist/application/transform/document/responses.cjs.map +1 -1
- package/dist/application/transform/document/responses.mjs +2 -2
- package/dist/application/transform/document/responses.mjs.map +1 -1
- package/dist/application/transform/document/root-type-aliases.cjs +8 -23
- package/dist/application/transform/document/root-type-aliases.cjs.map +1 -1
- package/dist/application/transform/document/root-type-aliases.mjs +8 -24
- package/dist/application/transform/document/root-type-aliases.mjs.map +1 -1
- package/dist/application/transform/document/type-resolution.cjs +3 -1
- package/dist/application/transform/document/type-resolution.cjs.map +1 -1
- package/dist/application/transform/document/type-resolution.mjs +3 -1
- package/dist/application/transform/document/type-resolution.mjs.map +1 -1
- package/dist/application/transform/document/webhooks.cjs +1 -1
- package/dist/application/transform/document/webhooks.cjs.map +1 -1
- package/dist/application/transform/document/webhooks.mjs +2 -2
- package/dist/application/transform/document/webhooks.mjs.map +1 -1
- package/dist/application/transform/footer/document-footer.cjs +10 -2
- package/dist/application/transform/footer/document-footer.cjs.map +1 -1
- package/dist/application/transform/footer/document-footer.mjs +10 -2
- package/dist/application/transform/footer/document-footer.mjs.map +1 -1
- package/dist/application/transform/footer/enum-name-claims.cjs +48 -0
- package/dist/application/transform/footer/enum-name-claims.cjs.map +1 -0
- package/dist/application/transform/footer/enum-name-claims.mjs +46 -0
- package/dist/application/transform/footer/enum-name-claims.mjs.map +1 -0
- package/dist/application/transform/footer/operation-keys.cjs +23 -0
- package/dist/application/transform/footer/operation-keys.cjs.map +1 -0
- package/dist/application/transform/footer/operation-keys.mjs +21 -0
- package/dist/application/transform/footer/operation-keys.mjs.map +1 -0
- package/dist/application/transform/footer/type-evaluation.cjs +4 -4
- package/dist/application/transform/footer/type-evaluation.cjs.map +1 -1
- package/dist/application/transform/footer/type-evaluation.mjs +4 -4
- package/dist/application/transform/footer/type-evaluation.mjs.map +1 -1
- package/dist/application/transform/helper-types.cjs +1 -1
- package/dist/application/transform/helper-types.cjs.map +1 -1
- package/dist/application/transform/helper-types.mjs +1 -1
- package/dist/application/transform/helper-types.mjs.map +1 -1
- package/dist/application/transform/numbered-names.cjs +9 -0
- package/dist/application/transform/numbered-names.cjs.map +1 -1
- package/dist/application/transform/numbered-names.mjs +9 -1
- package/dist/application/transform/numbered-names.mjs.map +1 -1
- package/dist/application/transform/ref-pointer/generated-location.cjs +1 -1
- package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -1
- package/dist/application/transform/ref-pointer/generated-location.mjs +2 -2
- package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -1
- package/dist/application/transform/ref-pointer/pointer-type.cjs +1 -1
- package/dist/application/transform/ref-pointer/pointer-type.cjs.map +1 -1
- package/dist/application/transform/ref-pointer/pointer-type.mjs +2 -2
- package/dist/application/transform/ref-pointer/pointer-type.mjs.map +1 -1
- package/dist/application/transform/ref-type.cjs +2 -1
- package/dist/application/transform/ref-type.cjs.map +1 -1
- package/dist/application/transform/ref-type.mjs +2 -1
- package/dist/application/transform/ref-type.mjs.map +1 -1
- package/dist/application/transform/schema/access-flags.cjs +1 -1
- package/dist/application/transform/schema/access-flags.cjs.map +1 -1
- package/dist/application/transform/schema/access-flags.mjs +2 -2
- package/dist/application/transform/schema/access-flags.mjs.map +1 -1
- package/dist/application/transform/schema/array-type.cjs +2 -2
- package/dist/application/transform/schema/array-type.cjs.map +1 -1
- package/dist/application/transform/schema/array-type.mjs +3 -3
- package/dist/application/transform/schema/array-type.mjs.map +1 -1
- package/dist/application/transform/schema/composition-type.cjs +4 -4
- package/dist/application/transform/schema/composition-type.cjs.map +1 -1
- package/dist/application/transform/schema/composition-type.mjs +6 -6
- package/dist/application/transform/schema/composition-type.mjs.map +1 -1
- package/dist/application/transform/schema/enum-rule.cjs +4 -6
- package/dist/application/transform/schema/enum-rule.cjs.map +1 -1
- package/dist/application/transform/schema/enum-rule.mjs +6 -8
- package/dist/application/transform/schema/enum-rule.mjs.map +1 -1
- package/dist/application/transform/schema/object-type.cjs +3 -3
- package/dist/application/transform/schema/object-type.cjs.map +1 -1
- package/dist/application/transform/schema/object-type.mjs +4 -4
- package/dist/application/transform/schema/object-type.mjs.map +1 -1
- package/dist/application/transform/schema/presence-members.cjs +1 -1
- package/dist/application/transform/schema/presence-members.cjs.map +1 -1
- package/dist/application/transform/schema/presence-members.mjs +2 -2
- package/dist/application/transform/schema/presence-members.mjs.map +1 -1
- package/dist/application/transform/schema/ref-siblings.cjs +47 -0
- package/dist/application/transform/schema/ref-siblings.cjs.map +1 -0
- package/dist/application/transform/schema/ref-siblings.mjs +45 -0
- package/dist/application/transform/schema/ref-siblings.mjs.map +1 -0
- package/dist/application/transform/schema/required-variants.cjs +2 -2
- package/dist/application/transform/schema/required-variants.cjs.map +1 -1
- package/dist/application/transform/schema/required-variants.mjs +3 -3
- package/dist/application/transform/schema/required-variants.mjs.map +1 -1
- package/dist/application/transform/schema/schema-transform.cjs +4 -2
- package/dist/application/transform/schema/schema-transform.cjs.map +1 -1
- package/dist/application/transform/schema/schema-transform.mjs +4 -2
- package/dist/application/transform/schema/schema-transform.mjs.map +1 -1
- package/dist/application/transform/schema/unevaluated-properties.cjs +1 -1
- package/dist/application/transform/schema/unevaluated-properties.cjs.map +1 -1
- package/dist/application/transform/schema/unevaluated-properties.mjs +2 -2
- package/dist/application/transform/schema/unevaluated-properties.mjs.map +1 -1
- package/dist/application/transform/schema-comment.cjs +6 -2
- package/dist/application/transform/schema-comment.cjs.map +1 -1
- package/dist/application/transform/schema-comment.mjs +7 -3
- package/dist/application/transform/schema-comment.mjs.map +1 -1
- package/dist/cli/api-settings.cjs +62 -6
- package/dist/cli/api-settings.cjs.map +1 -1
- package/dist/cli/api-settings.mjs +60 -7
- package/dist/cli/api-settings.mjs.map +1 -1
- package/dist/cli/api-writes.cjs +72 -0
- package/dist/cli/api-writes.cjs.map +1 -0
- package/dist/cli/api-writes.mjs +69 -0
- package/dist/cli/api-writes.mjs.map +1 -0
- package/dist/cli/cli-errors.cjs +12 -1
- package/dist/cli/cli-errors.cjs.map +1 -1
- package/dist/cli/cli-errors.mjs +12 -1
- package/dist/cli/cli-errors.mjs.map +1 -1
- package/dist/cli/cli-output.cjs +106 -1
- package/dist/cli/cli-output.cjs.map +1 -1
- package/dist/cli/cli-output.mjs +99 -2
- package/dist/cli/cli-output.mjs.map +1 -1
- package/dist/cli/main.cjs +5 -1
- package/dist/cli/main.cjs.map +1 -1
- package/dist/cli/main.mjs +6 -2
- package/dist/cli/main.mjs.map +1 -1
- package/dist/cli/redocly-apis.cjs +82 -36
- package/dist/cli/redocly-apis.cjs.map +1 -1
- package/dist/cli/redocly-apis.mjs +85 -39
- package/dist/cli/redocly-apis.mjs.map +1 -1
- package/dist/cli/run-cli.cjs +13 -7
- package/dist/cli/run-cli.cjs.map +1 -1
- package/dist/cli/run-cli.mjs +14 -8
- package/dist/cli/run-cli.mjs.map +1 -1
- package/dist/domain/append-all.cjs +10 -0
- package/dist/domain/append-all.cjs.map +1 -0
- package/dist/domain/append-all.mjs +8 -0
- package/dist/domain/append-all.mjs.map +1 -0
- package/dist/domain/cause-secrets.cjs +37 -0
- package/dist/domain/cause-secrets.cjs.map +1 -0
- package/dist/domain/cause-secrets.mjs +35 -0
- package/dist/domain/cause-secrets.mjs.map +1 -0
- package/dist/domain/deprecations.cjs +11 -0
- package/dist/domain/deprecations.cjs.map +1 -0
- package/dist/domain/deprecations.mjs +9 -0
- package/dist/domain/deprecations.mjs.map +1 -0
- package/dist/domain/errors.cjs +9 -3
- package/dist/domain/errors.cjs.map +1 -1
- package/dist/domain/errors.mjs +9 -3
- package/dist/domain/errors.mjs.map +1 -1
- package/dist/domain/ir/identifier-text.cjs.map +1 -1
- package/dist/domain/ir/identifier-text.mjs +1 -1
- package/dist/domain/ir/identifier-text.mjs.map +1 -1
- package/dist/domain/ir/ir-shape.cjs +187 -0
- package/dist/domain/ir/ir-shape.cjs.map +1 -0
- package/dist/domain/ir/ir-shape.mjs +184 -0
- package/dist/domain/ir/ir-shape.mjs.map +1 -0
- package/dist/domain/ir/newer-identifier-ranges.cjs +182 -29
- package/dist/domain/ir/newer-identifier-ranges.cjs.map +1 -1
- package/dist/domain/ir/newer-identifier-ranges.mjs +182 -29
- package/dist/domain/ir/newer-identifier-ranges.mjs.map +1 -1
- package/dist/domain/openapi/alias-expansion.cjs +3 -1
- package/dist/domain/openapi/alias-expansion.cjs.map +1 -1
- package/dist/domain/openapi/alias-expansion.mjs +3 -1
- package/dist/domain/openapi/alias-expansion.mjs.map +1 -1
- package/dist/domain/openapi/discriminated-union.cjs +3 -3
- package/dist/domain/openapi/discriminated-union.cjs.map +1 -1
- package/dist/domain/openapi/discriminated-union.mjs +4 -4
- package/dist/domain/openapi/discriminated-union.mjs.map +1 -1
- package/dist/domain/openapi/discriminator-conflicts.cjs +10 -6
- package/dist/domain/openapi/discriminator-conflicts.cjs.map +1 -1
- package/dist/domain/openapi/discriminator-conflicts.mjs +11 -7
- package/dist/domain/openapi/discriminator-conflicts.mjs.map +1 -1
- package/dist/domain/openapi/json-pointer.cjs +43 -1
- package/dist/domain/openapi/json-pointer.cjs.map +1 -1
- package/dist/domain/openapi/json-pointer.mjs +40 -2
- package/dist/domain/openapi/json-pointer.mjs.map +1 -1
- package/dist/domain/openapi/schema-dialect.cjs +15 -0
- package/dist/domain/openapi/schema-dialect.cjs.map +1 -0
- package/dist/domain/openapi/schema-dialect.mjs +12 -0
- package/dist/domain/openapi/schema-dialect.mjs.map +1 -0
- package/dist/domain/openapi/unsupported-features.cjs +1 -1
- package/dist/domain/openapi/unsupported-features.cjs.map +1 -1
- package/dist/domain/openapi/unsupported-features.mjs +2 -2
- package/dist/domain/openapi/unsupported-features.mjs.map +1 -1
- package/dist/domain/output-fixes.cjs +25 -14
- package/dist/domain/output-fixes.cjs.map +1 -1
- package/dist/domain/output-fixes.mjs +25 -13
- package/dist/domain/output-fixes.mjs.map +1 -1
- package/dist/domain/url-secrets.cjs +48 -0
- package/dist/domain/url-secrets.cjs.map +1 -0
- package/dist/domain/url-secrets.mjs +45 -0
- package/dist/domain/url-secrets.mjs.map +1 -0
- package/dist/domain/warnings.cjs +0 -1
- package/dist/domain/warnings.cjs.map +1 -1
- package/dist/domain/warnings.mjs +0 -1
- package/dist/domain/warnings.mjs.map +1 -1
- package/dist/index.cjs +2 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +57 -20
- package/dist/index.d.mts +57 -20
- package/dist/index.d.ts +57 -20
- package/dist/index.mjs +3 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -6
- package/src/adapters/node-deprecations/node-deprecations.ts +14 -0
- package/src/adapters/node-file-system/file-claims.ts +138 -0
- package/src/adapters/node-file-system/file-identity.ts +137 -0
- package/src/adapters/node-file-system/node-file-system.ts +145 -18
- package/src/adapters/redocly-loader/bundled-mapping-copies.ts +95 -0
- package/src/adapters/redocly-loader/bundled-ref-repair.ts +2 -2
- package/src/adapters/redocly-loader/loaded-documents.ts +46 -0
- package/src/adapters/redocly-loader/redocly-schema-loader.ts +18 -24
- package/src/adapters/redocly-loader/ref-access.ts +37 -3
- package/src/adapters/redocly-loader/ref-holders.ts +3 -3
- package/src/adapters/redocly-loader/remote-body-limit.ts +66 -0
- package/src/adapters/redocly-loader/remote-fetch.ts +74 -11
- package/src/adapters/redocly-loader/remote-node-limit.ts +62 -0
- package/src/adapters/redocly-loader/schema-load-errors.ts +52 -13
- package/src/adapters/redocly-loader/schema-source.ts +20 -8
- package/src/adapters/redocly-loader/unsupported-keys.ts +3 -7
- package/src/adapters/terminal-logger/terminal-logger.ts +10 -5
- package/src/api/default-ports.ts +40 -4
- package/src/api/discriminator-conflict-warnings.ts +2 -2
- package/src/api/discriminator-enum-parent.ts +3 -3
- package/src/api/discriminator-other-owners.ts +5 -3
- package/src/api/discriminator-patch.ts +9 -6
- package/src/api/discriminator-scan.ts +19 -11
- package/src/api/document-run.ts +9 -3
- package/src/api/legacy-callback-warning.ts +13 -6
- package/src/api/legacy-utils.ts +5 -1
- package/src/api/openapi-ts.ts +26 -7
- package/src/api/run-context.ts +6 -0
- package/src/api/schema-callbacks.ts +60 -17
- package/src/api/string-to-ast.ts +11 -15
- package/src/api/transform-context.ts +7 -3
- package/src/api/transform-schema.ts +67 -15
- package/src/application/ports/deprecation-reporter.ts +9 -0
- package/src/application/ports/file-system.ts +39 -0
- package/src/application/ports/schema-loader.ts +11 -1
- package/src/application/print/text-writer.ts +10 -3
- package/src/application/stack-overflow.ts +9 -5
- package/src/application/transform/document/components.ts +4 -4
- package/src/application/transform/document/declared-type-names.ts +36 -0
- package/src/application/transform/document/defs-root.ts +2 -2
- package/src/application/transform/document/document.ts +4 -3
- package/src/application/transform/document/enum-names-given-back.ts +91 -0
- package/src/application/transform/document/global-type-references.ts +1 -1
- package/src/application/transform/document/media-type.ts +4 -3
- package/src/application/transform/document/operation-keys-written.ts +27 -0
- package/src/application/transform/document/operation.ts +2 -2
- package/src/application/transform/document/parameter-entries.ts +70 -0
- package/src/application/transform/document/parameter.ts +21 -9
- package/src/application/transform/document/parameters.ts +13 -58
- package/src/application/transform/document/path-item.ts +13 -31
- package/src/application/transform/document/paths-enum.ts +1 -1
- package/src/application/transform/document/paths.ts +8 -4
- package/src/application/transform/document/referenced-parameter.ts +146 -0
- package/src/application/transform/document/request-body.ts +2 -2
- package/src/application/transform/document/response.ts +3 -3
- package/src/application/transform/document/responses.ts +2 -2
- package/src/application/transform/document/root-type-aliases.ts +17 -38
- package/src/application/transform/document/type-resolution.ts +2 -1
- package/src/application/transform/document/webhooks.ts +2 -2
- package/src/application/transform/footer/document-footer.ts +18 -1
- package/src/application/transform/footer/enum-name-claims.ts +62 -0
- package/src/application/transform/footer/operation-keys.ts +28 -0
- package/src/application/transform/footer/type-evaluation.ts +4 -4
- package/src/application/transform/helper-types.ts +6 -5
- package/src/application/transform/numbered-names.ts +15 -0
- package/src/application/transform/ref-pointer/generated-location.ts +2 -2
- package/src/application/transform/ref-pointer/pointer-type.ts +2 -4
- package/src/application/transform/ref-type.ts +2 -1
- package/src/application/transform/schema/access-flags.ts +2 -2
- package/src/application/transform/schema/array-type.ts +3 -5
- package/src/application/transform/schema/composition-type.ts +6 -6
- package/src/application/transform/schema/enum-rule.ts +10 -8
- package/src/application/transform/schema/object-type.ts +4 -4
- package/src/application/transform/schema/presence-members.ts +2 -2
- package/src/application/transform/schema/ref-siblings.ts +76 -0
- package/src/application/transform/schema/required-variants.ts +3 -3
- package/src/application/transform/schema/schema-context.ts +3 -0
- package/src/application/transform/schema/schema-transform.ts +4 -2
- package/src/application/transform/schema/unevaluated-properties.ts +2 -2
- package/src/application/transform/schema-comment.ts +7 -3
- package/src/application/transform/transform-context.ts +5 -0
- package/src/cli/api-settings.ts +82 -7
- package/src/cli/api-writes.ts +117 -0
- package/src/cli/cli-dependencies.ts +21 -4
- package/src/cli/cli-errors.ts +20 -1
- package/src/cli/cli-output.ts +186 -7
- package/src/cli/main.ts +6 -3
- package/src/cli/redocly-apis.ts +153 -48
- package/src/cli/run-cli.ts +37 -8
- package/src/domain/append-all.ts +10 -0
- package/src/domain/cause-secrets.ts +52 -0
- package/src/domain/deprecations.ts +15 -0
- package/src/domain/errors.ts +22 -7
- package/src/domain/ir/identifier-text.ts +6 -5
- package/src/domain/ir/ir-shape.ts +299 -0
- package/src/domain/ir/newer-identifier-ranges.ts +183 -30
- package/src/domain/openapi/alias-expansion.ts +4 -1
- package/src/domain/openapi/discriminated-union.ts +6 -4
- package/src/domain/openapi/discriminator-conflicts.ts +21 -7
- package/src/domain/openapi/document-object.ts +2 -0
- package/src/domain/openapi/json-pointer.ts +96 -7
- package/src/domain/openapi/schema-dialect.ts +22 -0
- package/src/domain/openapi/unsupported-features.ts +2 -2
- package/src/domain/output-fixes.ts +37 -18
- package/src/domain/url-secrets.ts +72 -0
- package/src/domain/warnings.ts +0 -1
- package/src/index.ts +2 -6
- package/src/types/generator-options.ts +1 -1
- package/dist/cli/main.d.cts +0 -2
- package/dist/cli/main.d.mts +0 -2
- package/dist/cli/main.d.ts +0 -2
- package/dist/domain/url-credentials.cjs +0 -10
- package/dist/domain/url-credentials.cjs.map +0 -1
- package/dist/domain/url-credentials.mjs +0 -8
- package/dist/domain/url-credentials.mjs.map +0 -1
- package/src/domain/url-credentials.ts +0 -18
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composition-type.mjs","sources":["../../../../src/application/transform/schema/composition-type.ts"],"sourcesContent":["import { irKeyword, irRecord } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport { createRef } from \"../../../domain/openapi/json-pointer.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { OutputFix } from \"../../../domain/output-fixes.js\";\nimport { requirableRefType } from \"../ref-pointer/pointer-type.js\";\nimport { UNKNOWN_TYPE } from \"../shared-types.js\";\nimport {\n intersectionOf,\n isPrimitiveType,\n nullableOf,\n omitKeys,\n unionOf,\n withRequiredKeys,\n} from \"../type-combinators.js\";\nimport { coreType } from \"./core-type.js\";\nimport { unionItemOf, unionOwnKeywords } from \"./discriminated-union.js\";\nimport { allOfMembers } from \"./presence-members.js\";\nimport { requiredVariantsType } from \"./required-variants.js\";\nimport type { SchemaRequest } from \"./schema-rule.js\";\nimport { unevaluatedPropertiesType } from \"./unevaluated-properties.js\";\n\n/** `anyOf` / `oneOf` variants; the position is part of the path so nested names stay unique. */\nfunction variantTypes(\n variants: readonly Schema[],\n keyword: \"anyOf\" | \"oneOf\",\n request: SchemaRequest,\n): IrType[] {\n return variants.map((variant, index) =>\n request.transformNested(variant, {\n ...request.location,\n path: createRef([request.location.path, keyword, String(index)]),\n }),\n );\n}\n\n/**\n * Whether an `allOf` item is a `$ref`. Like the original, this uses `in`, so a boolean item throws\n * a TypeError instead of being accepted.\n */\nfunction isRefItem(item: Schema): item is { readonly $ref: string } {\n return \"$ref\" in (item as object);\n}\n\n/**\n * The parent's `required` keys that the target at `ref` defines. A target that the discriminator\n * scan gave its property got none: the scan made that property required, but the other keys were\n * lost too. With `discriminator-member-required` only keys the target requires already are left\n * out (#2162).\n */\nfunction keysToRequire(\n ref: string,\n target: SchemaObject,\n required: readonly string[],\n request: SchemaRequest,\n): readonly string[] {\n const defined = required.filter((key) => Boolean(target.properties?.[key]));\n if (!request.context.discriminators.isHandled(ref)) {\n return defined;\n }\n if (!request.context.options.fixes.has(OutputFix.DISCRIMINATOR_MEMBER_REQUIRED)) {\n return [];\n }\n return defined.filter((key) => !target.required?.includes(key));\n}\n\n/** A `$ref` item gets the parent's `required` keys that its target defines (`WithRequired`). */\nfunction refItemType(\n item: { readonly $ref: string },\n required: readonly string[],\n request: SchemaRequest,\n): IrType {\n const type = request.transformNested(item, request.location);\n const resolved = request.context.refs.resolve(item.$ref) as SchemaObject | undefined;\n if (!resolved || typeof resolved !== \"object\" || !(\"properties\" in resolved)) {\n return type;\n }\n const keys = keysToRequire(item.$ref, resolved, required, request);\n if (keys.length === 0) {\n return type;\n }\n request.context.footer.requireWithRequired();\n return withRequiredKeys(requirableRefType(item.$ref, type, request), keys);\n}\n\n/** An inline item merges the parent's `required` keys with its own. */\nfunction inlineItemType(item: Schema, required: readonly string[], request: SchemaRequest): IrType {\n const own =\n typeof item === \"object\" && Array.isArray((item as SchemaObject).required)\n ? ((item as SchemaObject).required ?? [])\n : [];\n return request.transformNested(\n { ...(item as SchemaObject), required: [...required, ...own] },\n request.location,\n );\n}\n\n/**\n * The union's own keywords at the union's location, so nested names (enums) stay the union's.\n * Null when the union has none.\n */\nfunction ownKeywordsType(own: SchemaObject, ref: string, request: SchemaRequest): IrType | null {\n return combinedType(own, { ...request, location: { ...request.location, path: ref } });\n}\n\n/**\n * An `allOf` item; one with a discriminator omits that property (the parent redefines it). A\n * `$ref` to a discriminated union is not such a parent: for a member of the union it is the\n * union's own keywords, since the union contains the member (#1665); with\n * `allof-discriminated-union` it is the union, since `Omit` on a union drops keys (#1464), unless\n * the union's mapping names the schema: then it is a member, as the discriminator scan has it.\n */\nfunction allOfItemType(\n item: Schema,\n required: readonly string[],\n request: SchemaRequest,\n): IrType | null {\n const isRef = isRefItem(item);\n const discriminator =\n (isRef && request.context.discriminators.objectAt(item.$ref)) ||\n (item as SchemaObject).discriminator;\n const propertyName = discriminator?.propertyName;\n const unionItem = isRef && propertyName ? unionItemOf(item.$ref, request) : undefined;\n if (isRef && propertyName && unionItem?.isMember) {\n const own = unionOwnKeywords(unionItem.union, propertyName, required);\n return ownKeywordsType(own, item.$ref, request);\n }\n const type = isRef\n ? refItemType(item, required, request)\n : inlineItemType(item, required, request);\n const isUnion =\n unionItem !== undefined &&\n !unionItem.isMapped &&\n request.context.options.fixes.has(OutputFix.ALLOF_DISCRIMINATED_UNION);\n if (!propertyName || isUnion) {\n return type;\n }\n // With `discriminator-values` the schema also redefines the properties of other owners above\n // it, so no item may keep a value of its own for them (a parent mapped as `content`).\n const { path } = request.location;\n const others = path === undefined ? [] : request.context.discriminators.otherPropertiesAt(path);\n return omitKeys(type, [propertyName, ...others]);\n}\n\nfunction allOfTypes(\n items: readonly Schema[],\n required: readonly string[],\n request: SchemaRequest,\n): IrType[] {\n return items.flatMap((item) => allOfItemType(item, required, request) ?? []);\n}\n\nfunction oneOfType(previous: IrType | null, variants: readonly IrType[]): IrType {\n const before = previous === null ? [] : [previous];\n // Only `oneOf` may list primitives; then it stays a flat union.\n return variants.every(isPrimitiveType)\n ? unionOf([...before, ...variants])\n : intersectionOf([...before, unionOf(variants)]);\n}\n\n/**\n * `anyOf` is a union: TypeScript unions are not exclusive, which matches anyOf better than oneOf.\n * By default the sibling type is one more member, as in the original. With `anyof-properties` it\n * is intersected with the union, so it applies to every variant (#2380); for a `type` list, each\n * listed type has applied `anyOf` already (`multipleTypes`), so the list is the whole type.\n */\nfunction anyOfType(\n previous: IrType | null,\n schema: SchemaObject,\n request: SchemaRequest,\n): IrType | null {\n const variants = variantTypes(schema.anyOf ?? [], \"anyOf\", request);\n if (variants.length === 0 || previous === null) {\n return variants.length === 0 ? previous : unionOf(variants);\n }\n if (!request.context.options.fixes.has(OutputFix.ANYOF_PROPERTIES)) {\n return unionOf([previous, ...variants]);\n }\n return Array.isArray(schema.type) ? previous : intersectionOf([previous, unionOf(variants)]);\n}\n\n/** Object enums are written as `oneOf` over their values. */\nfunction oneOfVariants(schema: SchemaObject): readonly Schema[] {\n const objectEnum =\n \"type\" in schema && schema.type === \"object\" && (schema.enum as Schema[] | undefined);\n return schema.oneOf || objectEnum || [];\n}\n\n/**\n * The parent's `required` keys, plus the keys of left-out `allOf` members (`allof-required`).\n * Without such keys the parent's list stays as it is, duplicates included, as in the original.\n */\nfunction requiredKeys(schema: SchemaObject, presenceKeys: readonly string[]): readonly string[] {\n const own = schema.required ?? [];\n return presenceKeys.length === 0 ? own : [...new Set([...own, ...presenceKeys])];\n}\n\nfunction composedType(schema: SchemaObject, request: SchemaRequest): IrType | null {\n let type: IrType | null = null;\n const core = coreType(schema, request);\n const { members, required } = allOfMembers(schema.allOf ?? [], request);\n const allOf = allOfTypes(members, requiredKeys(schema, required), request);\n if (core !== null || allOf.length > 0) {\n const allOfType = allOf.length > 0 ? [intersectionOf(allOf)] : [];\n type = intersectionOf([...(core === null ? [] : [core]), ...allOfType]);\n }\n return variantsType(type, schema, request);\n}\n\n/** `anyOf`, then `oneOf`, applied to the core and `allOf` type (`anyof-oneof-required` first). */\nfunction variantsType(\n previous: IrType | null,\n schema: SchemaObject,\n request: SchemaRequest,\n): IrType | null {\n const type =\n requiredVariantsType(previous, schema, schema.anyOf ?? [], request) ??\n anyOfType(previous, schema, request);\n const oneOfRequired = requiredVariantsType(type, schema, schema.oneOf ?? [], request);\n if (oneOfRequired !== null) {\n return oneOfRequired;\n }\n const oneOf = variantTypes(oneOfVariants(schema), \"oneOf\", request);\n return oneOf.length > 0 ? oneOfType(type, oneOf) : type;\n}\n\n/** The composed type, with the `unevaluatedProperties` index signature when it applies. */\nfunction combinedType(schema: SchemaObject, request: SchemaRequest): IrType | null {\n const type = composedType(schema, request);\n const unevaluated = unevaluatedPropertiesType(schema, type, request);\n if (unevaluated === null) {\n return type;\n }\n if (type === null) {\n return unevaluated;\n }\n // One flat intersection, so an `allOf` intersection is not printed in parentheses.\n const parts = type.kind === \"intersection\" ? type.types : [type];\n return intersectionOf([...parts, unevaluated]);\n}\n\n/**\n * The schema with composition: core type and `allOf` intersected, then `anyOf` and `oneOf`. Without\n * any of them: `Record<string, never>` (or `unknown` with `--empty-objects-unknown`) when `type` is\n * present, else `unknown`. `nullable: true` adds `null`, except to the shared `unknown`.\n */\nexport function compositionType(schema: SchemaObject, request: SchemaRequest): IrType {\n const { emptyObjectsUnknown } = request.context.options;\n const empty =\n \"type\" in schema\n ? irRecord(irKeyword(\"string\"), emptyObjectsUnknown ? UNKNOWN_TYPE : irKeyword(\"never\"))\n : UNKNOWN_TYPE;\n const type = combinedType(schema, request) ?? empty;\n return type !== UNKNOWN_TYPE && schema.nullable ? nullableOf([type]) : type;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"composition-type.mjs","sources":["../../../../src/application/transform/schema/composition-type.ts"],"sourcesContent":["import { irKeyword, irRecord } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport { appendPointer } from \"../../../domain/openapi/json-pointer.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { FIX } from \"../../../domain/output-fixes.js\";\nimport { requirableRefType } from \"../ref-pointer/pointer-type.js\";\nimport { UNKNOWN_TYPE } from \"../shared-types.js\";\nimport {\n intersectionOf,\n isPrimitiveType,\n nullableOf,\n omitKeys,\n unionOf,\n withRequiredKeys,\n} from \"../type-combinators.js\";\nimport { coreType } from \"./core-type.js\";\nimport { unionItemOf, unionOwnKeywords } from \"./discriminated-union.js\";\nimport { allOfMembers } from \"./presence-members.js\";\nimport { requiredVariantsType } from \"./required-variants.js\";\nimport type { SchemaRequest } from \"./schema-rule.js\";\nimport { unevaluatedPropertiesType } from \"./unevaluated-properties.js\";\n\n/** `anyOf` / `oneOf` variants; the position is part of the path so nested names stay unique. */\nfunction variantTypes(\n variants: readonly Schema[],\n keyword: \"anyOf\" | \"oneOf\",\n request: SchemaRequest,\n): IrType[] {\n return variants.map((variant, index) =>\n request.transformNested(variant, {\n ...request.location,\n path: appendPointer(request.location.path, [keyword, index]),\n }),\n );\n}\n\n/**\n * Whether an `allOf` item is a `$ref`. Like the original, this uses `in`, so a boolean item throws\n * a TypeError instead of being accepted.\n */\nfunction isRefItem(item: Schema): item is { readonly $ref: string } {\n return \"$ref\" in (item as object);\n}\n\n/**\n * The parent's `required` keys that the target at `ref` defines. A target that the discriminator\n * scan gave its property got none: the scan made that property required, but the other keys were\n * lost too. With `discriminator-member-required` only keys the target requires already are left\n * out (#2162).\n */\nfunction keysToRequire(\n ref: string,\n target: SchemaObject,\n required: readonly string[],\n request: SchemaRequest,\n): readonly string[] {\n const defined = required.filter((key) => Boolean(target.properties?.[key]));\n if (!request.context.discriminators.isHandled(ref)) {\n return defined;\n }\n if (!request.context.options.fixes.has(FIX.DISCRIMINATOR_MEMBER_REQUIRED)) {\n return [];\n }\n return defined.filter((key) => !target.required?.includes(key));\n}\n\n/** A `$ref` item gets the parent's `required` keys that its target defines (`WithRequired`). */\nfunction refItemType(\n item: { readonly $ref: string },\n required: readonly string[],\n request: SchemaRequest,\n): IrType {\n const type = request.transformNested(item, request.location);\n const resolved = request.context.refs.resolve(item.$ref) as SchemaObject | undefined;\n if (!resolved || typeof resolved !== \"object\" || !(\"properties\" in resolved)) {\n return type;\n }\n const keys = keysToRequire(item.$ref, resolved, required, request);\n if (keys.length === 0) {\n return type;\n }\n request.context.footer.requireWithRequired();\n return withRequiredKeys(requirableRefType(item.$ref, type, request), keys);\n}\n\n/** An inline item merges the parent's `required` keys with its own. */\nfunction inlineItemType(item: Schema, required: readonly string[], request: SchemaRequest): IrType {\n const own =\n typeof item === \"object\" && Array.isArray((item as SchemaObject).required)\n ? ((item as SchemaObject).required ?? [])\n : [];\n return request.transformNested(\n { ...(item as SchemaObject), required: [...required, ...own] },\n request.location,\n );\n}\n\n/**\n * The union's own keywords at the union's location, so nested names (enums) stay the union's.\n * Null when the union has none.\n */\nfunction ownKeywordsType(own: SchemaObject, ref: string, request: SchemaRequest): IrType | null {\n return combinedType(own, { ...request, location: { ...request.location, path: ref } });\n}\n\n/**\n * An `allOf` item; one with a discriminator omits that property (the parent redefines it). A\n * `$ref` to a discriminated union is not such a parent: for a member of the union it is the\n * union's own keywords, since the union contains the member (#1665); with\n * `allof-discriminated-union` it is the union, since `Omit` on a union drops keys (#1464), unless\n * the union's mapping names the schema: then it is a member, as the discriminator scan has it.\n */\nfunction allOfItemType(\n item: Schema,\n required: readonly string[],\n request: SchemaRequest,\n): IrType | null {\n const isRef = isRefItem(item);\n const discriminator =\n (isRef && request.context.discriminators.objectAt(item.$ref)) ||\n (item as SchemaObject).discriminator;\n const propertyName = discriminator?.propertyName;\n const unionItem = isRef && propertyName ? unionItemOf(item.$ref, request) : undefined;\n if (isRef && propertyName && unionItem?.isMember) {\n const own = unionOwnKeywords(unionItem.union, propertyName, required);\n return ownKeywordsType(own, item.$ref, request);\n }\n const type = isRef\n ? refItemType(item, required, request)\n : inlineItemType(item, required, request);\n const isUnion =\n unionItem !== undefined &&\n !unionItem.isMapped &&\n request.context.options.fixes.has(FIX.ALLOF_DISCRIMINATED_UNION);\n if (!propertyName || isUnion) {\n return type;\n }\n // With `discriminator-values` the schema also redefines the properties of other owners above\n // it, so no item may keep a value of its own for them (a parent mapped as `content`).\n const { path } = request.location;\n const others = path === undefined ? [] : request.context.discriminators.otherPropertiesAt(path);\n return omitKeys(type, [propertyName, ...others]);\n}\n\nfunction allOfTypes(\n items: readonly Schema[],\n required: readonly string[],\n request: SchemaRequest,\n): IrType[] {\n return items.flatMap((item) => allOfItemType(item, required, request) ?? []);\n}\n\nfunction oneOfType(previous: IrType | null, variants: readonly IrType[]): IrType {\n const before = previous === null ? [] : [previous];\n // Only `oneOf` may list primitives; then it stays a flat union.\n return variants.every(isPrimitiveType)\n ? unionOf([...before, ...variants])\n : intersectionOf([...before, unionOf(variants)]);\n}\n\n/**\n * `anyOf` is a union: TypeScript unions are not exclusive, which matches anyOf better than oneOf.\n * By default the sibling type is one more member, as in the original. With `anyof-properties` it\n * is intersected with the union, so it applies to every variant (#2380); for a `type` list, each\n * listed type has applied `anyOf` already (`multipleTypes`), so the list is the whole type.\n */\nfunction anyOfType(\n previous: IrType | null,\n schema: SchemaObject,\n request: SchemaRequest,\n): IrType | null {\n const variants = variantTypes(schema.anyOf ?? [], \"anyOf\", request);\n if (variants.length === 0 || previous === null) {\n return variants.length === 0 ? previous : unionOf(variants);\n }\n if (!request.context.options.fixes.has(FIX.ANYOF_PROPERTIES)) {\n return unionOf([previous, ...variants]);\n }\n return Array.isArray(schema.type) ? previous : intersectionOf([previous, unionOf(variants)]);\n}\n\n/** Object enums are written as `oneOf` over their values. */\nfunction oneOfVariants(schema: SchemaObject): readonly Schema[] {\n const objectEnum =\n \"type\" in schema && schema.type === \"object\" && (schema.enum as Schema[] | undefined);\n return schema.oneOf || objectEnum || [];\n}\n\n/**\n * The parent's `required` keys, plus the keys of left-out `allOf` members (`allof-required`).\n * Without such keys the parent's list stays as it is, duplicates included, as in the original.\n */\nfunction requiredKeys(schema: SchemaObject, presenceKeys: readonly string[]): readonly string[] {\n const own = schema.required ?? [];\n return presenceKeys.length === 0 ? own : [...new Set([...own, ...presenceKeys])];\n}\n\nfunction composedType(schema: SchemaObject, request: SchemaRequest): IrType | null {\n let type: IrType | null = null;\n const core = coreType(schema, request);\n const { members, required } = allOfMembers(schema.allOf ?? [], request);\n const allOf = allOfTypes(members, requiredKeys(schema, required), request);\n if (core !== null || allOf.length > 0) {\n const allOfType = allOf.length > 0 ? [intersectionOf(allOf)] : [];\n type = intersectionOf([...(core === null ? [] : [core]), ...allOfType]);\n }\n return variantsType(type, schema, request);\n}\n\n/** `anyOf`, then `oneOf`, applied to the core and `allOf` type (`anyof-oneof-required` first). */\nfunction variantsType(\n previous: IrType | null,\n schema: SchemaObject,\n request: SchemaRequest,\n): IrType | null {\n const type =\n requiredVariantsType(previous, schema, schema.anyOf ?? [], request) ??\n anyOfType(previous, schema, request);\n const oneOfRequired = requiredVariantsType(type, schema, schema.oneOf ?? [], request);\n if (oneOfRequired !== null) {\n return oneOfRequired;\n }\n const oneOf = variantTypes(oneOfVariants(schema), \"oneOf\", request);\n return oneOf.length > 0 ? oneOfType(type, oneOf) : type;\n}\n\n/** The composed type, with the `unevaluatedProperties` index signature when it applies. */\nfunction combinedType(schema: SchemaObject, request: SchemaRequest): IrType | null {\n const type = composedType(schema, request);\n const unevaluated = unevaluatedPropertiesType(schema, type, request);\n if (unevaluated === null) {\n return type;\n }\n if (type === null) {\n return unevaluated;\n }\n // One flat intersection, so an `allOf` intersection is not printed in parentheses.\n const parts = type.kind === \"intersection\" ? type.types : [type];\n return intersectionOf([...parts, unevaluated]);\n}\n\n/**\n * The schema with composition: core type and `allOf` intersected, then `anyOf` and `oneOf`. Without\n * any of them: `Record<string, never>` (or `unknown` with `--empty-objects-unknown`) when `type` is\n * present, else `unknown`. `nullable: true` adds `null`, except to the shared `unknown`.\n */\nexport function compositionType(schema: SchemaObject, request: SchemaRequest): IrType {\n const { emptyObjectsUnknown } = request.context.options;\n const empty =\n \"type\" in schema\n ? irRecord(irKeyword(\"string\"), emptyObjectsUnknown ? UNKNOWN_TYPE : irKeyword(\"never\"))\n : UNKNOWN_TYPE;\n const type = combinedType(schema, request) ?? empty;\n return type !== UNKNOWN_TYPE && schema.nullable ? nullableOf([type]) : type;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -27,7 +27,7 @@ function hasEnumMetadata(schema) {
|
|
|
27
27
|
}
|
|
28
28
|
function tsEnumEntries(schema, options) {
|
|
29
29
|
const entries = (schema.enum ?? []).map((value, index) => [value, index]);
|
|
30
|
-
return options.fixes.has(outputFixes.
|
|
30
|
+
return options.fixes.has(outputFixes.FIX.NULLABLE_ENUMS) ? entries.filter(([value]) => value !== null) : entries;
|
|
31
31
|
}
|
|
32
32
|
function isTsEnum(schema, options) {
|
|
33
33
|
if (!options.enum || !schema.enum) {
|
|
@@ -69,9 +69,7 @@ function enumMemberType(enumName, member) {
|
|
|
69
69
|
}
|
|
70
70
|
function ownerEnumMembersType(key, values, request) {
|
|
71
71
|
const { options, discriminators, footer } = request.context;
|
|
72
|
-
const parent = options.fixes.has(
|
|
73
|
-
outputFixes.OutputFix.DISCRIMINATOR_VALUES
|
|
74
|
-
) ? discriminators.enumParentOf(key) : void 0;
|
|
72
|
+
const parent = options.fixes.has(outputFixes.FIX.DISCRIMINATOR_VALUES) ? discriminators.enumParentOf(key) : void 0;
|
|
75
73
|
if (parent === void 0 || !isTsEnum(parent.schema, options)) {
|
|
76
74
|
return null;
|
|
77
75
|
}
|
|
@@ -91,7 +89,7 @@ function tsEnumType(schema, request) {
|
|
|
91
89
|
constructors.irReference(footer.addEnum(enumRequest(schema, request.location.path, options))),
|
|
92
90
|
schema
|
|
93
91
|
);
|
|
94
|
-
return options.fixes.has(outputFixes.
|
|
92
|
+
return options.fixes.has(outputFixes.FIX.NULLABLE_ENUMS) && isNullAllowed(schema) ? typeCombinators.unionOf([type, constructors.irKeyword("null")]) : type;
|
|
95
93
|
}
|
|
96
94
|
function isUnionPosition(pointer, index) {
|
|
97
95
|
const next = pointer[index + 1];
|
|
@@ -122,7 +120,7 @@ function enumValuesPointer(path) {
|
|
|
122
120
|
kept.push(pointer[index]);
|
|
123
121
|
}
|
|
124
122
|
const extract = firstVariantStart === null ? [] : pointer.slice(firstVariantStart).filter((segment) => !UNION_KEYWORDS.has(segment) && !INDEX_RE.test(segment));
|
|
125
|
-
return { ref: jsonPointer.
|
|
123
|
+
return { ref: jsonPointer.appendPointer(jsonPointer.ROOT_POINTER, kept), extract };
|
|
126
124
|
}
|
|
127
125
|
function addEnumValues(schema, request) {
|
|
128
126
|
const { ref, extract } = enumValuesPointer(request.location.path);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enum-rule.cjs","sources":["../../../../src/application/transform/schema/enum-rule.ts"],"sourcesContent":["import {\n irIndexedAccess,\n irKeyword,\n irObject,\n irReference,\n irString,\n} from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport { createRef, parseRefPointer } from \"../../../domain/openapi/json-pointer.js\";\nimport type { SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { OutputFix } from \"../../../domain/output-fixes.js\";\nimport { literalType } from \"../literal-type.js\";\nimport { refType } from \"../ref-type.js\";\nimport { intersectionOf, unionOf } from \"../type-combinators.js\";\nimport type {\n DiscriminatorEnumParent,\n EnumDeclarationRequest,\n EnumMemberMetadata,\n SchemaOptions,\n} from \"./schema-context.js\";\nimport type { SchemaRequest, SchemaRule } from \"./schema-rule.js\";\n\n/** Removed from generated names, so `#/components/schemas/Status` gives `Status`. */\nconst COMPONENT_SCHEMAS_PREFIX = \"components/schemas\";\nconst UNION_KEYWORDS: ReadonlySet<string> = new Set([\"anyOf\", \"oneOf\"]);\nconst INDEX_RE = /^\\d+$/;\n\nfunction hasAdditionalProperties(schema: SchemaObject): boolean {\n return \"additionalProperties\" in schema && Boolean(schema.additionalProperties);\n}\n\n/** A name from the schema's pointer: `#/components/schemas/Pet/status` → `/Pet/status`. */\nfunction nameFromPath(path: string | undefined): string {\n return parseRefPointer(path ?? \"\")\n .join(\"/\")\n .replace(COMPONENT_SCHEMAS_PREFIX, \"\");\n}\n\n/** `#/components/schemas/Name`, and no deeper pointer. */\nconst COMPONENT_SCHEMA_RE = /^#\\/components\\/schemas\\/[^/]+$/;\n\nfunction hasEnumMetadata(schema: SchemaObject): boolean {\n return [\n schema[\"x-enum-varnames\"],\n schema[\"x-enumNames\"],\n schema[\"x-enum-descriptions\"],\n schema[\"x-enumDescriptions\"],\n ].some(Array.isArray);\n}\n\n/**\n * The values a TypeScript enum declares, with their positions in `enum`. With the\n * `nullable-enums` fix a `null` value is left out (upstream #1872): an enum member cannot be\n * `null`, so the type adds it as `| null` instead (`tsEnumType`).\n */\nfunction tsEnumEntries(schema: SchemaObject, options: SchemaOptions): [unknown, number][] {\n const entries = (schema.enum ?? []).map((value, index): [unknown, number] => [value, index]);\n return options.fixes.has(OutputFix.NULLABLE_ENUMS)\n ? entries.filter(([value]) => value !== null)\n : entries;\n}\n\n/**\n * `--enum`: string and number enums become TypeScript enums. The original meant to allow `null`\n * too, but tested `typeof value` against `null`, so an enum containing null stays a union; the\n * `nullable-enums` fix declares its other values.\n */\nfunction isTsEnum(schema: SchemaObject, options: SchemaOptions): boolean {\n if (!options.enum || !schema.enum) {\n return false;\n }\n const entries = tsEnumEntries(schema, options);\n // An empty `enum` stays an empty TypeScript enum, as the original made it; an enum of only\n // `null` has no member left once the fix drops `null`, so it stays a union.\n const isOnlyNull = entries.length === 0 && schema.enum.length > 0;\n const isSupported =\n !isOnlyNull && entries.every(([value]) => [\"string\", \"number\"].includes(typeof value));\n // `--conditional-enums` converts only enums that carry x-enum-* metadata.\n return isSupported && (!options.conditionalEnums || hasEnumMetadata(schema));\n}\n\nfunction enumMetadata(\n schema: SchemaObject,\n entries: readonly [unknown, number][],\n): EnumMemberMetadata[] {\n return entries.map(([, index]) => ({\n name: schema[\"x-enum-varnames\"]?.[index] ?? schema[\"x-enumNames\"]?.[index],\n description: schema[\"x-enum-descriptions\"]?.[index] ?? schema[\"x-enumDescriptions\"]?.[index],\n }));\n}\n\n/**\n * Whether `null` is a valid value: it is in `enum` and the schema's type admits it (`type`\n * absent or listing `\"null\"`, or OpenAPI 3.0 `nullable: true`). Both keywords must pass.\n */\nfunction isNullAllowed(schema: SchemaObject): boolean {\n const { type } = schema;\n const isTypeNullable =\n type === undefined ||\n (Array.isArray(type) && type.includes(\"null\")) ||\n Boolean(schema.nullable);\n return (schema.enum ?? []).includes(null) && isTypeNullable;\n}\n\n/**\n * `additionalProperties: true` on a string enum keeps other strings allowed but still offers the\n * listed values in editors: `\"a\" | \"b\" | (string & {})`.\n */\nfunction withOtherStrings(type: IrType, schema: SchemaObject): IrType {\n if (!hasAdditionalProperties(schema) || schema.type !== \"string\") {\n return type;\n }\n return unionOf([type, intersectionOf([irKeyword(\"string\"), irObject([])])]);\n}\n\n/** The enum declaration of `schema` typed at `path`; its values are strings and numbers. */\nfunction enumRequest(\n schema: SchemaObject,\n path: string | undefined,\n options: SchemaOptions,\n): EnumDeclarationRequest {\n const entries = tsEnumEntries(schema, options);\n return {\n name: nameFromPath(path),\n isComponentSchema: COMPONENT_SCHEMA_RE.test(path ?? \"\"),\n values: entries.map(([value]) => value as string | number),\n metadata: enumMetadata(schema, entries),\n };\n}\n\n/** One member's type; a quoted member cannot follow a dot, `typeof E[\"+\"]` is the same type. */\nfunction enumMemberType(enumName: string, member: string): IrType {\n return member.startsWith('\"')\n ? irIndexedAccess(irReference(`typeof ${enumName}`), irString(JSON.parse(member), \"escaped\"))\n : irReference(`${enumName}.${member}`);\n}\n\n/**\n * The `discriminator-values` fix: a member's discriminator value is typed with members of\n * the owner's enum (`PetType.Cat`), so the member is one of the owner's type (#1700). `key` is the\n * enum the scan added or the inherited discriminator object. Null when the fix is off, or the\n * owner's property is no TypeScript enum with every value.\n */\nexport function ownerEnumMembersType(\n key: object,\n values: readonly unknown[],\n request: SchemaRequest,\n): IrType | null {\n const { options, discriminators, footer } = request.context;\n const parent: DiscriminatorEnumParent | undefined = options.fixes.has(\n OutputFix.DISCRIMINATOR_VALUES,\n )\n ? discriminators.enumParentOf(key)\n : undefined;\n if (parent === undefined || !isTsEnum(parent.schema, options)) {\n return null;\n }\n const reference = { ...enumRequest(parent.schema, parent.path, options), isOwnerReference: true };\n const name = footer.addEnum(reference);\n const members = footer.enumMembers(name);\n const names = values.map((value) => members.get(value as string | number));\n if (names.length === 0 || names.some((member) => member === undefined)) {\n return null;\n }\n return unionOf(names.map((member) => enumMemberType(name, member as string)));\n}\n\nfunction tsEnumType(schema: SchemaObject, request: SchemaRequest): IrType {\n const { options, footer } = request.context;\n // `isTsEnum` admits only strings and numbers, and the fix leaves `null` out of the members.\n const values = tsEnumEntries(schema, options).map(([value]) => value);\n const type =\n ownerEnumMembersType(schema, values, request) ??\n withOtherStrings(\n irReference(footer.addEnum(enumRequest(schema, request.location.path, options))),\n schema,\n );\n return options.fixes.has(OutputFix.NULLABLE_ENUMS) && isNullAllowed(schema)\n ? unionOf([type, irKeyword(\"null\")])\n : type;\n}\n\nfunction isUnionPosition(pointer: readonly string[], index: number): boolean {\n const next = pointer[index + 1];\n return UNION_KEYWORDS.has(pointer[index] as string) && next !== undefined && INDEX_RE.test(next);\n}\n\nconst PARAMETERS = \"parameters\";\n\n/** Where the `parameters` of a path item sit in its pointer: `paths/<key>/…`, `components/…`. */\nfunction pathItemParametersIndex(pointer: readonly string[]): number | null {\n if (pointer[0] === \"paths\" || pointer[0] === \"webhooks\") {\n return 2;\n }\n return pointer[0] === \"components\" && pointer[1] === \"pathItems\" ? 3 : null;\n}\n\n/**\n * The location of a path item parameter repeats `parameters` (`paths/~1a/parameters/parameters/\n * path/id`), which keeps the generated names as they were. The generated type has the segment\n * once: `paths[\"/a\"][\"parameters\"][\"path\"][\"id\"]`.\n */\nfunction withSingleParametersSegment(pointer: readonly string[]): readonly string[] {\n const index = pathItemParametersIndex(pointer);\n const isRepeated =\n index !== null && pointer[index] === PARAMETERS && pointer[index + 1] === PARAMETERS;\n return isRepeated ? [...pointer.slice(0, index), ...pointer.slice(index + 1)] : pointer;\n}\n\n/**\n * The pointer of `--enum-values` arrays without union positions (`anyOf/0`), so names stay\n * stable. Every property after the first union position is narrowed with `Extract`: a no-op where\n * all variants have it, and the needed narrowing where only some do.\n */\nfunction enumValuesPointer(path: string | undefined): { ref: string; extract: string[] } {\n const pointer = withSingleParametersSegment(parseRefPointer(path ?? \"\"));\n const kept: string[] = [];\n let firstVariantStart: number | null = null;\n for (let index = 0; index < pointer.length; index++) {\n if (isUnionPosition(pointer, index)) {\n firstVariantStart ??= index + 2;\n index++;\n continue;\n }\n kept.push(pointer[index] as string);\n }\n const extract =\n firstVariantStart === null\n ? []\n : pointer\n .slice(firstVariantStart)\n .filter((segment) => !UNION_KEYWORDS.has(segment) && !INDEX_RE.test(segment));\n return { ref: createRef(kept), extract };\n}\n\nfunction addEnumValues(schema: SchemaObject, request: SchemaRequest): void {\n const { ref, extract } = enumValuesPointer(request.location.path);\n const valuesType = refType(ref, { isDeep: true, extractProperties: extract });\n request.context.footer.addEnumValues({\n name: `${nameFromPath(request.location.path)}Values`,\n // A record value (`additionalProperties`) is reached by indexing with `string`.\n type: request.isFromAdditionalProperties\n ? irIndexedAccess(valuesType, irReference(\"string\"))\n : valuesType,\n values: (schema.enum ?? []) as (string | number)[],\n });\n}\n\nfunction literalEnumType(schema: SchemaObject, request: SchemaRequest): IrType {\n const values = schema.enum ?? [];\n const isNullable =\n (Array.isArray(schema.type) && schema.type.includes(\"null\")) || Boolean(schema.nullable);\n const literals = [...values.map(literalType), ...(isNullable ? [irKeyword(\"null\")] : [])];\n const type = withOtherStrings(unionOf(literals), schema);\n const isListable = values.every(\n (value) => typeof value === \"string\" || typeof value === \"number\",\n );\n if (request.context.options.enumValues && isListable) {\n addEnumValues(schema, request);\n }\n return type;\n}\n\n/**\n * `enum` on anything but an object (object enums are handled as `oneOf`). With\n * `additionalProperties`, only string enums are handled here; others fall through to composition.\n */\nexport const enumRule: SchemaRule = {\n name: \"enum\",\n matches(schema) {\n const isCandidate =\n Array.isArray(schema.enum) && schema.type !== \"object\" && !(\"properties\" in schema);\n return isCandidate && (!hasAdditionalProperties(schema) || schema.type === \"string\");\n },\n transform(schema, request) {\n return isTsEnum(schema, request.context.options)\n ? tsEnumType(schema, request)\n : literalEnumType(schema, request);\n },\n};\n"],"names":["parseRefPointer","OutputFix","unionOf","intersectionOf","irKeyword","irObject","irIndexedAccess","irReference","irString","createRef","refType","literalType"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"enum-rule.cjs","sources":["../../../../src/application/transform/schema/enum-rule.ts"],"sourcesContent":["import {\n irIndexedAccess,\n irKeyword,\n irObject,\n irReference,\n irString,\n} from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport {\n appendPointer,\n parseRefPointer,\n ROOT_POINTER,\n} from \"../../../domain/openapi/json-pointer.js\";\nimport type { SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { FIX } from \"../../../domain/output-fixes.js\";\nimport { literalType } from \"../literal-type.js\";\nimport { refType } from \"../ref-type.js\";\nimport { intersectionOf, unionOf } from \"../type-combinators.js\";\nimport type {\n DiscriminatorEnumParent,\n EnumDeclarationRequest,\n EnumMemberMetadata,\n SchemaOptions,\n} from \"./schema-context.js\";\nimport type { SchemaRequest, SchemaRule } from \"./schema-rule.js\";\n\n/** Removed from generated names, so `#/components/schemas/Status` gives `Status`. */\nconst COMPONENT_SCHEMAS_PREFIX = \"components/schemas\";\nconst UNION_KEYWORDS: ReadonlySet<string> = new Set([\"anyOf\", \"oneOf\"]);\nconst INDEX_RE = /^\\d+$/;\n\nfunction hasAdditionalProperties(schema: SchemaObject): boolean {\n return \"additionalProperties\" in schema && Boolean(schema.additionalProperties);\n}\n\n/** A name from the schema's pointer: `#/components/schemas/Pet/status` → `/Pet/status`. */\nfunction nameFromPath(path: string | undefined): string {\n return parseRefPointer(path ?? \"\")\n .join(\"/\")\n .replace(COMPONENT_SCHEMAS_PREFIX, \"\");\n}\n\n/** `#/components/schemas/Name`, and no deeper pointer. */\nconst COMPONENT_SCHEMA_RE = /^#\\/components\\/schemas\\/[^/]+$/;\n\nfunction hasEnumMetadata(schema: SchemaObject): boolean {\n return [\n schema[\"x-enum-varnames\"],\n schema[\"x-enumNames\"],\n schema[\"x-enum-descriptions\"],\n schema[\"x-enumDescriptions\"],\n ].some(Array.isArray);\n}\n\n/**\n * The values a TypeScript enum declares, with their positions in `enum`. With the\n * `nullable-enums` fix a `null` value is left out (upstream #1872): an enum member cannot be\n * `null`, so the type adds it as `| null` instead (`tsEnumType`).\n */\nfunction tsEnumEntries(schema: SchemaObject, options: SchemaOptions): [unknown, number][] {\n const entries = (schema.enum ?? []).map((value, index): [unknown, number] => [value, index]);\n return options.fixes.has(FIX.NULLABLE_ENUMS)\n ? entries.filter(([value]) => value !== null)\n : entries;\n}\n\n/**\n * `--enum`: string and number enums become TypeScript enums. The original meant to allow `null`\n * too, but tested `typeof value` against `null`, so an enum containing null stays a union; the\n * `nullable-enums` fix declares its other values.\n */\nfunction isTsEnum(schema: SchemaObject, options: SchemaOptions): boolean {\n if (!options.enum || !schema.enum) {\n return false;\n }\n const entries = tsEnumEntries(schema, options);\n // An empty `enum` stays an empty TypeScript enum, as the original made it; an enum of only\n // `null` has no member left once the fix drops `null`, so it stays a union.\n const isOnlyNull = entries.length === 0 && schema.enum.length > 0;\n const isSupported =\n !isOnlyNull && entries.every(([value]) => [\"string\", \"number\"].includes(typeof value));\n // `--conditional-enums` converts only enums that carry x-enum-* metadata.\n return isSupported && (!options.conditionalEnums || hasEnumMetadata(schema));\n}\n\nfunction enumMetadata(\n schema: SchemaObject,\n entries: readonly [unknown, number][],\n): EnumMemberMetadata[] {\n return entries.map(([, index]) => ({\n name: schema[\"x-enum-varnames\"]?.[index] ?? schema[\"x-enumNames\"]?.[index],\n description: schema[\"x-enum-descriptions\"]?.[index] ?? schema[\"x-enumDescriptions\"]?.[index],\n }));\n}\n\n/**\n * Whether `null` is a valid value: it is in `enum` and the schema's type admits it (`type`\n * absent or listing `\"null\"`, or OpenAPI 3.0 `nullable: true`). Both keywords must pass.\n */\nfunction isNullAllowed(schema: SchemaObject): boolean {\n const { type } = schema;\n const isTypeNullable =\n type === undefined ||\n (Array.isArray(type) && type.includes(\"null\")) ||\n Boolean(schema.nullable);\n return (schema.enum ?? []).includes(null) && isTypeNullable;\n}\n\n/**\n * `additionalProperties: true` on a string enum keeps other strings allowed but still offers the\n * listed values in editors: `\"a\" | \"b\" | (string & {})`.\n */\nfunction withOtherStrings(type: IrType, schema: SchemaObject): IrType {\n if (!hasAdditionalProperties(schema) || schema.type !== \"string\") {\n return type;\n }\n return unionOf([type, intersectionOf([irKeyword(\"string\"), irObject([])])]);\n}\n\n/** The enum declaration of `schema` typed at `path`; its values are strings and numbers. */\nfunction enumRequest(\n schema: SchemaObject,\n path: string | undefined,\n options: SchemaOptions,\n): EnumDeclarationRequest {\n const entries = tsEnumEntries(schema, options);\n return {\n name: nameFromPath(path),\n isComponentSchema: COMPONENT_SCHEMA_RE.test(path ?? \"\"),\n values: entries.map(([value]) => value as string | number),\n metadata: enumMetadata(schema, entries),\n };\n}\n\n/** One member's type; a quoted member cannot follow a dot, `typeof E[\"+\"]` is the same type. */\nfunction enumMemberType(enumName: string, member: string): IrType {\n return member.startsWith('\"')\n ? irIndexedAccess(irReference(`typeof ${enumName}`), irString(JSON.parse(member), \"escaped\"))\n : irReference(`${enumName}.${member}`);\n}\n\n/**\n * The `discriminator-values` fix: a member's discriminator value is typed with members of\n * the owner's enum (`PetType.Cat`), so the member is one of the owner's type (#1700). `key` is the\n * enum the scan added or the inherited discriminator object. Null when the fix is off, or the\n * owner's property is no TypeScript enum with every value.\n */\nexport function ownerEnumMembersType(\n key: object,\n values: readonly unknown[],\n request: SchemaRequest,\n): IrType | null {\n const { options, discriminators, footer } = request.context;\n const parent: DiscriminatorEnumParent | undefined = options.fixes.has(FIX.DISCRIMINATOR_VALUES)\n ? discriminators.enumParentOf(key)\n : undefined;\n if (parent === undefined || !isTsEnum(parent.schema, options)) {\n return null;\n }\n const reference = { ...enumRequest(parent.schema, parent.path, options), isOwnerReference: true };\n const name = footer.addEnum(reference);\n const members = footer.enumMembers(name);\n const names = values.map((value) => members.get(value as string | number));\n if (names.length === 0 || names.some((member) => member === undefined)) {\n return null;\n }\n return unionOf(names.map((member) => enumMemberType(name, member as string)));\n}\n\nfunction tsEnumType(schema: SchemaObject, request: SchemaRequest): IrType {\n const { options, footer } = request.context;\n // `isTsEnum` admits only strings and numbers, and the fix leaves `null` out of the members.\n const values = tsEnumEntries(schema, options).map(([value]) => value);\n const type =\n ownerEnumMembersType(schema, values, request) ??\n withOtherStrings(\n irReference(footer.addEnum(enumRequest(schema, request.location.path, options))),\n schema,\n );\n return options.fixes.has(FIX.NULLABLE_ENUMS) && isNullAllowed(schema)\n ? unionOf([type, irKeyword(\"null\")])\n : type;\n}\n\nfunction isUnionPosition(pointer: readonly string[], index: number): boolean {\n const next = pointer[index + 1];\n return UNION_KEYWORDS.has(pointer[index] as string) && next !== undefined && INDEX_RE.test(next);\n}\n\nconst PARAMETERS = \"parameters\";\n\n/** Where the `parameters` of a path item sit in its pointer: `paths/<key>/…`, `components/…`. */\nfunction pathItemParametersIndex(pointer: readonly string[]): number | null {\n if (pointer[0] === \"paths\" || pointer[0] === \"webhooks\") {\n return 2;\n }\n return pointer[0] === \"components\" && pointer[1] === \"pathItems\" ? 3 : null;\n}\n\n/**\n * The location of a path item parameter repeats `parameters` (`paths/~1a/parameters/parameters/\n * path/id`), which keeps the generated names as they were. The generated type has the segment\n * once: `paths[\"/a\"][\"parameters\"][\"path\"][\"id\"]`.\n */\nfunction withSingleParametersSegment(pointer: readonly string[]): readonly string[] {\n const index = pathItemParametersIndex(pointer);\n const isRepeated =\n index !== null && pointer[index] === PARAMETERS && pointer[index + 1] === PARAMETERS;\n return isRepeated ? [...pointer.slice(0, index), ...pointer.slice(index + 1)] : pointer;\n}\n\n/**\n * The pointer of `--enum-values` arrays without union positions (`anyOf/0`), so names stay\n * stable. Every property after the first union position is narrowed with `Extract`: a no-op where\n * all variants have it, and the needed narrowing where only some do.\n */\nfunction enumValuesPointer(path: string | undefined): { ref: string; extract: string[] } {\n const pointer = withSingleParametersSegment(parseRefPointer(path ?? \"\"));\n const kept: string[] = [];\n let firstVariantStart: number | null = null;\n for (let index = 0; index < pointer.length; index++) {\n if (isUnionPosition(pointer, index)) {\n firstVariantStart ??= index + 2;\n index++;\n continue;\n }\n kept.push(pointer[index] as string);\n }\n const extract =\n firstVariantStart === null\n ? []\n : pointer\n .slice(firstVariantStart)\n .filter((segment) => !UNION_KEYWORDS.has(segment) && !INDEX_RE.test(segment));\n return { ref: appendPointer(ROOT_POINTER, kept), extract };\n}\n\nfunction addEnumValues(schema: SchemaObject, request: SchemaRequest): void {\n const { ref, extract } = enumValuesPointer(request.location.path);\n const valuesType = refType(ref, { isDeep: true, extractProperties: extract });\n request.context.footer.addEnumValues({\n name: `${nameFromPath(request.location.path)}Values`,\n // A record value (`additionalProperties`) is reached by indexing with `string`.\n type: request.isFromAdditionalProperties\n ? irIndexedAccess(valuesType, irReference(\"string\"))\n : valuesType,\n values: (schema.enum ?? []) as (string | number)[],\n });\n}\n\nfunction literalEnumType(schema: SchemaObject, request: SchemaRequest): IrType {\n const values = schema.enum ?? [];\n const isNullable =\n (Array.isArray(schema.type) && schema.type.includes(\"null\")) || Boolean(schema.nullable);\n const literals = [...values.map(literalType), ...(isNullable ? [irKeyword(\"null\")] : [])];\n const type = withOtherStrings(unionOf(literals), schema);\n const isListable = values.every(\n (value) => typeof value === \"string\" || typeof value === \"number\",\n );\n if (request.context.options.enumValues && isListable) {\n addEnumValues(schema, request);\n }\n return type;\n}\n\n/**\n * `enum` on anything but an object (object enums are handled as `oneOf`). With\n * `additionalProperties`, only string enums are handled here; others fall through to composition.\n */\nexport const enumRule: SchemaRule = {\n name: \"enum\",\n matches(schema) {\n const isCandidate =\n Array.isArray(schema.enum) && schema.type !== \"object\" && !(\"properties\" in schema);\n return isCandidate && (!hasAdditionalProperties(schema) || schema.type === \"string\");\n },\n transform(schema, request) {\n return isTsEnum(schema, request.context.options)\n ? tsEnumType(schema, request)\n : literalEnumType(schema, request);\n },\n};\n"],"names":["parseRefPointer","FIX","unionOf","intersectionOf","irKeyword","irObject","irIndexedAccess","irReference","irString","appendPointer","ROOT_POINTER","refType","literalType"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { irReference, irKeyword, irIndexedAccess, irString, irObject } from '../../../domain/ir/constructors.mjs';
|
|
2
|
-
import { parseRefPointer,
|
|
3
|
-
import {
|
|
2
|
+
import { parseRefPointer, appendPointer, ROOT_POINTER } from '../../../domain/openapi/json-pointer.mjs';
|
|
3
|
+
import { FIX } from '../../../domain/output-fixes.mjs';
|
|
4
4
|
import { literalType } from '../literal-type.mjs';
|
|
5
5
|
import { refType } from '../ref-type.mjs';
|
|
6
6
|
import { unionOf, intersectionOf } from '../type-combinators.mjs';
|
|
@@ -25,7 +25,7 @@ function hasEnumMetadata(schema) {
|
|
|
25
25
|
}
|
|
26
26
|
function tsEnumEntries(schema, options) {
|
|
27
27
|
const entries = (schema.enum ?? []).map((value, index) => [value, index]);
|
|
28
|
-
return options.fixes.has(
|
|
28
|
+
return options.fixes.has(FIX.NULLABLE_ENUMS) ? entries.filter(([value]) => value !== null) : entries;
|
|
29
29
|
}
|
|
30
30
|
function isTsEnum(schema, options) {
|
|
31
31
|
if (!options.enum || !schema.enum) {
|
|
@@ -67,9 +67,7 @@ function enumMemberType(enumName, member) {
|
|
|
67
67
|
}
|
|
68
68
|
function ownerEnumMembersType(key, values, request) {
|
|
69
69
|
const { options, discriminators, footer } = request.context;
|
|
70
|
-
const parent = options.fixes.has(
|
|
71
|
-
OutputFix.DISCRIMINATOR_VALUES
|
|
72
|
-
) ? discriminators.enumParentOf(key) : void 0;
|
|
70
|
+
const parent = options.fixes.has(FIX.DISCRIMINATOR_VALUES) ? discriminators.enumParentOf(key) : void 0;
|
|
73
71
|
if (parent === void 0 || !isTsEnum(parent.schema, options)) {
|
|
74
72
|
return null;
|
|
75
73
|
}
|
|
@@ -89,7 +87,7 @@ function tsEnumType(schema, request) {
|
|
|
89
87
|
irReference(footer.addEnum(enumRequest(schema, request.location.path, options))),
|
|
90
88
|
schema
|
|
91
89
|
);
|
|
92
|
-
return options.fixes.has(
|
|
90
|
+
return options.fixes.has(FIX.NULLABLE_ENUMS) && isNullAllowed(schema) ? unionOf([type, irKeyword("null")]) : type;
|
|
93
91
|
}
|
|
94
92
|
function isUnionPosition(pointer, index) {
|
|
95
93
|
const next = pointer[index + 1];
|
|
@@ -120,7 +118,7 @@ function enumValuesPointer(path) {
|
|
|
120
118
|
kept.push(pointer[index]);
|
|
121
119
|
}
|
|
122
120
|
const extract = firstVariantStart === null ? [] : pointer.slice(firstVariantStart).filter((segment) => !UNION_KEYWORDS.has(segment) && !INDEX_RE.test(segment));
|
|
123
|
-
return { ref:
|
|
121
|
+
return { ref: appendPointer(ROOT_POINTER, kept), extract };
|
|
124
122
|
}
|
|
125
123
|
function addEnumValues(schema, request) {
|
|
126
124
|
const { ref, extract } = enumValuesPointer(request.location.path);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enum-rule.mjs","sources":["../../../../src/application/transform/schema/enum-rule.ts"],"sourcesContent":["import {\n irIndexedAccess,\n irKeyword,\n irObject,\n irReference,\n irString,\n} from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport { createRef, parseRefPointer } from \"../../../domain/openapi/json-pointer.js\";\nimport type { SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { OutputFix } from \"../../../domain/output-fixes.js\";\nimport { literalType } from \"../literal-type.js\";\nimport { refType } from \"../ref-type.js\";\nimport { intersectionOf, unionOf } from \"../type-combinators.js\";\nimport type {\n DiscriminatorEnumParent,\n EnumDeclarationRequest,\n EnumMemberMetadata,\n SchemaOptions,\n} from \"./schema-context.js\";\nimport type { SchemaRequest, SchemaRule } from \"./schema-rule.js\";\n\n/** Removed from generated names, so `#/components/schemas/Status` gives `Status`. */\nconst COMPONENT_SCHEMAS_PREFIX = \"components/schemas\";\nconst UNION_KEYWORDS: ReadonlySet<string> = new Set([\"anyOf\", \"oneOf\"]);\nconst INDEX_RE = /^\\d+$/;\n\nfunction hasAdditionalProperties(schema: SchemaObject): boolean {\n return \"additionalProperties\" in schema && Boolean(schema.additionalProperties);\n}\n\n/** A name from the schema's pointer: `#/components/schemas/Pet/status` → `/Pet/status`. */\nfunction nameFromPath(path: string | undefined): string {\n return parseRefPointer(path ?? \"\")\n .join(\"/\")\n .replace(COMPONENT_SCHEMAS_PREFIX, \"\");\n}\n\n/** `#/components/schemas/Name`, and no deeper pointer. */\nconst COMPONENT_SCHEMA_RE = /^#\\/components\\/schemas\\/[^/]+$/;\n\nfunction hasEnumMetadata(schema: SchemaObject): boolean {\n return [\n schema[\"x-enum-varnames\"],\n schema[\"x-enumNames\"],\n schema[\"x-enum-descriptions\"],\n schema[\"x-enumDescriptions\"],\n ].some(Array.isArray);\n}\n\n/**\n * The values a TypeScript enum declares, with their positions in `enum`. With the\n * `nullable-enums` fix a `null` value is left out (upstream #1872): an enum member cannot be\n * `null`, so the type adds it as `| null` instead (`tsEnumType`).\n */\nfunction tsEnumEntries(schema: SchemaObject, options: SchemaOptions): [unknown, number][] {\n const entries = (schema.enum ?? []).map((value, index): [unknown, number] => [value, index]);\n return options.fixes.has(OutputFix.NULLABLE_ENUMS)\n ? entries.filter(([value]) => value !== null)\n : entries;\n}\n\n/**\n * `--enum`: string and number enums become TypeScript enums. The original meant to allow `null`\n * too, but tested `typeof value` against `null`, so an enum containing null stays a union; the\n * `nullable-enums` fix declares its other values.\n */\nfunction isTsEnum(schema: SchemaObject, options: SchemaOptions): boolean {\n if (!options.enum || !schema.enum) {\n return false;\n }\n const entries = tsEnumEntries(schema, options);\n // An empty `enum` stays an empty TypeScript enum, as the original made it; an enum of only\n // `null` has no member left once the fix drops `null`, so it stays a union.\n const isOnlyNull = entries.length === 0 && schema.enum.length > 0;\n const isSupported =\n !isOnlyNull && entries.every(([value]) => [\"string\", \"number\"].includes(typeof value));\n // `--conditional-enums` converts only enums that carry x-enum-* metadata.\n return isSupported && (!options.conditionalEnums || hasEnumMetadata(schema));\n}\n\nfunction enumMetadata(\n schema: SchemaObject,\n entries: readonly [unknown, number][],\n): EnumMemberMetadata[] {\n return entries.map(([, index]) => ({\n name: schema[\"x-enum-varnames\"]?.[index] ?? schema[\"x-enumNames\"]?.[index],\n description: schema[\"x-enum-descriptions\"]?.[index] ?? schema[\"x-enumDescriptions\"]?.[index],\n }));\n}\n\n/**\n * Whether `null` is a valid value: it is in `enum` and the schema's type admits it (`type`\n * absent or listing `\"null\"`, or OpenAPI 3.0 `nullable: true`). Both keywords must pass.\n */\nfunction isNullAllowed(schema: SchemaObject): boolean {\n const { type } = schema;\n const isTypeNullable =\n type === undefined ||\n (Array.isArray(type) && type.includes(\"null\")) ||\n Boolean(schema.nullable);\n return (schema.enum ?? []).includes(null) && isTypeNullable;\n}\n\n/**\n * `additionalProperties: true` on a string enum keeps other strings allowed but still offers the\n * listed values in editors: `\"a\" | \"b\" | (string & {})`.\n */\nfunction withOtherStrings(type: IrType, schema: SchemaObject): IrType {\n if (!hasAdditionalProperties(schema) || schema.type !== \"string\") {\n return type;\n }\n return unionOf([type, intersectionOf([irKeyword(\"string\"), irObject([])])]);\n}\n\n/** The enum declaration of `schema` typed at `path`; its values are strings and numbers. */\nfunction enumRequest(\n schema: SchemaObject,\n path: string | undefined,\n options: SchemaOptions,\n): EnumDeclarationRequest {\n const entries = tsEnumEntries(schema, options);\n return {\n name: nameFromPath(path),\n isComponentSchema: COMPONENT_SCHEMA_RE.test(path ?? \"\"),\n values: entries.map(([value]) => value as string | number),\n metadata: enumMetadata(schema, entries),\n };\n}\n\n/** One member's type; a quoted member cannot follow a dot, `typeof E[\"+\"]` is the same type. */\nfunction enumMemberType(enumName: string, member: string): IrType {\n return member.startsWith('\"')\n ? irIndexedAccess(irReference(`typeof ${enumName}`), irString(JSON.parse(member), \"escaped\"))\n : irReference(`${enumName}.${member}`);\n}\n\n/**\n * The `discriminator-values` fix: a member's discriminator value is typed with members of\n * the owner's enum (`PetType.Cat`), so the member is one of the owner's type (#1700). `key` is the\n * enum the scan added or the inherited discriminator object. Null when the fix is off, or the\n * owner's property is no TypeScript enum with every value.\n */\nexport function ownerEnumMembersType(\n key: object,\n values: readonly unknown[],\n request: SchemaRequest,\n): IrType | null {\n const { options, discriminators, footer } = request.context;\n const parent: DiscriminatorEnumParent | undefined = options.fixes.has(\n OutputFix.DISCRIMINATOR_VALUES,\n )\n ? discriminators.enumParentOf(key)\n : undefined;\n if (parent === undefined || !isTsEnum(parent.schema, options)) {\n return null;\n }\n const reference = { ...enumRequest(parent.schema, parent.path, options), isOwnerReference: true };\n const name = footer.addEnum(reference);\n const members = footer.enumMembers(name);\n const names = values.map((value) => members.get(value as string | number));\n if (names.length === 0 || names.some((member) => member === undefined)) {\n return null;\n }\n return unionOf(names.map((member) => enumMemberType(name, member as string)));\n}\n\nfunction tsEnumType(schema: SchemaObject, request: SchemaRequest): IrType {\n const { options, footer } = request.context;\n // `isTsEnum` admits only strings and numbers, and the fix leaves `null` out of the members.\n const values = tsEnumEntries(schema, options).map(([value]) => value);\n const type =\n ownerEnumMembersType(schema, values, request) ??\n withOtherStrings(\n irReference(footer.addEnum(enumRequest(schema, request.location.path, options))),\n schema,\n );\n return options.fixes.has(OutputFix.NULLABLE_ENUMS) && isNullAllowed(schema)\n ? unionOf([type, irKeyword(\"null\")])\n : type;\n}\n\nfunction isUnionPosition(pointer: readonly string[], index: number): boolean {\n const next = pointer[index + 1];\n return UNION_KEYWORDS.has(pointer[index] as string) && next !== undefined && INDEX_RE.test(next);\n}\n\nconst PARAMETERS = \"parameters\";\n\n/** Where the `parameters` of a path item sit in its pointer: `paths/<key>/…`, `components/…`. */\nfunction pathItemParametersIndex(pointer: readonly string[]): number | null {\n if (pointer[0] === \"paths\" || pointer[0] === \"webhooks\") {\n return 2;\n }\n return pointer[0] === \"components\" && pointer[1] === \"pathItems\" ? 3 : null;\n}\n\n/**\n * The location of a path item parameter repeats `parameters` (`paths/~1a/parameters/parameters/\n * path/id`), which keeps the generated names as they were. The generated type has the segment\n * once: `paths[\"/a\"][\"parameters\"][\"path\"][\"id\"]`.\n */\nfunction withSingleParametersSegment(pointer: readonly string[]): readonly string[] {\n const index = pathItemParametersIndex(pointer);\n const isRepeated =\n index !== null && pointer[index] === PARAMETERS && pointer[index + 1] === PARAMETERS;\n return isRepeated ? [...pointer.slice(0, index), ...pointer.slice(index + 1)] : pointer;\n}\n\n/**\n * The pointer of `--enum-values` arrays without union positions (`anyOf/0`), so names stay\n * stable. Every property after the first union position is narrowed with `Extract`: a no-op where\n * all variants have it, and the needed narrowing where only some do.\n */\nfunction enumValuesPointer(path: string | undefined): { ref: string; extract: string[] } {\n const pointer = withSingleParametersSegment(parseRefPointer(path ?? \"\"));\n const kept: string[] = [];\n let firstVariantStart: number | null = null;\n for (let index = 0; index < pointer.length; index++) {\n if (isUnionPosition(pointer, index)) {\n firstVariantStart ??= index + 2;\n index++;\n continue;\n }\n kept.push(pointer[index] as string);\n }\n const extract =\n firstVariantStart === null\n ? []\n : pointer\n .slice(firstVariantStart)\n .filter((segment) => !UNION_KEYWORDS.has(segment) && !INDEX_RE.test(segment));\n return { ref: createRef(kept), extract };\n}\n\nfunction addEnumValues(schema: SchemaObject, request: SchemaRequest): void {\n const { ref, extract } = enumValuesPointer(request.location.path);\n const valuesType = refType(ref, { isDeep: true, extractProperties: extract });\n request.context.footer.addEnumValues({\n name: `${nameFromPath(request.location.path)}Values`,\n // A record value (`additionalProperties`) is reached by indexing with `string`.\n type: request.isFromAdditionalProperties\n ? irIndexedAccess(valuesType, irReference(\"string\"))\n : valuesType,\n values: (schema.enum ?? []) as (string | number)[],\n });\n}\n\nfunction literalEnumType(schema: SchemaObject, request: SchemaRequest): IrType {\n const values = schema.enum ?? [];\n const isNullable =\n (Array.isArray(schema.type) && schema.type.includes(\"null\")) || Boolean(schema.nullable);\n const literals = [...values.map(literalType), ...(isNullable ? [irKeyword(\"null\")] : [])];\n const type = withOtherStrings(unionOf(literals), schema);\n const isListable = values.every(\n (value) => typeof value === \"string\" || typeof value === \"number\",\n );\n if (request.context.options.enumValues && isListable) {\n addEnumValues(schema, request);\n }\n return type;\n}\n\n/**\n * `enum` on anything but an object (object enums are handled as `oneOf`). With\n * `additionalProperties`, only string enums are handled here; others fall through to composition.\n */\nexport const enumRule: SchemaRule = {\n name: \"enum\",\n matches(schema) {\n const isCandidate =\n Array.isArray(schema.enum) && schema.type !== \"object\" && !(\"properties\" in schema);\n return isCandidate && (!hasAdditionalProperties(schema) || schema.type === \"string\");\n },\n transform(schema, request) {\n return isTsEnum(schema, request.context.options)\n ? tsEnumType(schema, request)\n : literalEnumType(schema, request);\n },\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"enum-rule.mjs","sources":["../../../../src/application/transform/schema/enum-rule.ts"],"sourcesContent":["import {\n irIndexedAccess,\n irKeyword,\n irObject,\n irReference,\n irString,\n} from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport {\n appendPointer,\n parseRefPointer,\n ROOT_POINTER,\n} from \"../../../domain/openapi/json-pointer.js\";\nimport type { SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { FIX } from \"../../../domain/output-fixes.js\";\nimport { literalType } from \"../literal-type.js\";\nimport { refType } from \"../ref-type.js\";\nimport { intersectionOf, unionOf } from \"../type-combinators.js\";\nimport type {\n DiscriminatorEnumParent,\n EnumDeclarationRequest,\n EnumMemberMetadata,\n SchemaOptions,\n} from \"./schema-context.js\";\nimport type { SchemaRequest, SchemaRule } from \"./schema-rule.js\";\n\n/** Removed from generated names, so `#/components/schemas/Status` gives `Status`. */\nconst COMPONENT_SCHEMAS_PREFIX = \"components/schemas\";\nconst UNION_KEYWORDS: ReadonlySet<string> = new Set([\"anyOf\", \"oneOf\"]);\nconst INDEX_RE = /^\\d+$/;\n\nfunction hasAdditionalProperties(schema: SchemaObject): boolean {\n return \"additionalProperties\" in schema && Boolean(schema.additionalProperties);\n}\n\n/** A name from the schema's pointer: `#/components/schemas/Pet/status` → `/Pet/status`. */\nfunction nameFromPath(path: string | undefined): string {\n return parseRefPointer(path ?? \"\")\n .join(\"/\")\n .replace(COMPONENT_SCHEMAS_PREFIX, \"\");\n}\n\n/** `#/components/schemas/Name`, and no deeper pointer. */\nconst COMPONENT_SCHEMA_RE = /^#\\/components\\/schemas\\/[^/]+$/;\n\nfunction hasEnumMetadata(schema: SchemaObject): boolean {\n return [\n schema[\"x-enum-varnames\"],\n schema[\"x-enumNames\"],\n schema[\"x-enum-descriptions\"],\n schema[\"x-enumDescriptions\"],\n ].some(Array.isArray);\n}\n\n/**\n * The values a TypeScript enum declares, with their positions in `enum`. With the\n * `nullable-enums` fix a `null` value is left out (upstream #1872): an enum member cannot be\n * `null`, so the type adds it as `| null` instead (`tsEnumType`).\n */\nfunction tsEnumEntries(schema: SchemaObject, options: SchemaOptions): [unknown, number][] {\n const entries = (schema.enum ?? []).map((value, index): [unknown, number] => [value, index]);\n return options.fixes.has(FIX.NULLABLE_ENUMS)\n ? entries.filter(([value]) => value !== null)\n : entries;\n}\n\n/**\n * `--enum`: string and number enums become TypeScript enums. The original meant to allow `null`\n * too, but tested `typeof value` against `null`, so an enum containing null stays a union; the\n * `nullable-enums` fix declares its other values.\n */\nfunction isTsEnum(schema: SchemaObject, options: SchemaOptions): boolean {\n if (!options.enum || !schema.enum) {\n return false;\n }\n const entries = tsEnumEntries(schema, options);\n // An empty `enum` stays an empty TypeScript enum, as the original made it; an enum of only\n // `null` has no member left once the fix drops `null`, so it stays a union.\n const isOnlyNull = entries.length === 0 && schema.enum.length > 0;\n const isSupported =\n !isOnlyNull && entries.every(([value]) => [\"string\", \"number\"].includes(typeof value));\n // `--conditional-enums` converts only enums that carry x-enum-* metadata.\n return isSupported && (!options.conditionalEnums || hasEnumMetadata(schema));\n}\n\nfunction enumMetadata(\n schema: SchemaObject,\n entries: readonly [unknown, number][],\n): EnumMemberMetadata[] {\n return entries.map(([, index]) => ({\n name: schema[\"x-enum-varnames\"]?.[index] ?? schema[\"x-enumNames\"]?.[index],\n description: schema[\"x-enum-descriptions\"]?.[index] ?? schema[\"x-enumDescriptions\"]?.[index],\n }));\n}\n\n/**\n * Whether `null` is a valid value: it is in `enum` and the schema's type admits it (`type`\n * absent or listing `\"null\"`, or OpenAPI 3.0 `nullable: true`). Both keywords must pass.\n */\nfunction isNullAllowed(schema: SchemaObject): boolean {\n const { type } = schema;\n const isTypeNullable =\n type === undefined ||\n (Array.isArray(type) && type.includes(\"null\")) ||\n Boolean(schema.nullable);\n return (schema.enum ?? []).includes(null) && isTypeNullable;\n}\n\n/**\n * `additionalProperties: true` on a string enum keeps other strings allowed but still offers the\n * listed values in editors: `\"a\" | \"b\" | (string & {})`.\n */\nfunction withOtherStrings(type: IrType, schema: SchemaObject): IrType {\n if (!hasAdditionalProperties(schema) || schema.type !== \"string\") {\n return type;\n }\n return unionOf([type, intersectionOf([irKeyword(\"string\"), irObject([])])]);\n}\n\n/** The enum declaration of `schema` typed at `path`; its values are strings and numbers. */\nfunction enumRequest(\n schema: SchemaObject,\n path: string | undefined,\n options: SchemaOptions,\n): EnumDeclarationRequest {\n const entries = tsEnumEntries(schema, options);\n return {\n name: nameFromPath(path),\n isComponentSchema: COMPONENT_SCHEMA_RE.test(path ?? \"\"),\n values: entries.map(([value]) => value as string | number),\n metadata: enumMetadata(schema, entries),\n };\n}\n\n/** One member's type; a quoted member cannot follow a dot, `typeof E[\"+\"]` is the same type. */\nfunction enumMemberType(enumName: string, member: string): IrType {\n return member.startsWith('\"')\n ? irIndexedAccess(irReference(`typeof ${enumName}`), irString(JSON.parse(member), \"escaped\"))\n : irReference(`${enumName}.${member}`);\n}\n\n/**\n * The `discriminator-values` fix: a member's discriminator value is typed with members of\n * the owner's enum (`PetType.Cat`), so the member is one of the owner's type (#1700). `key` is the\n * enum the scan added or the inherited discriminator object. Null when the fix is off, or the\n * owner's property is no TypeScript enum with every value.\n */\nexport function ownerEnumMembersType(\n key: object,\n values: readonly unknown[],\n request: SchemaRequest,\n): IrType | null {\n const { options, discriminators, footer } = request.context;\n const parent: DiscriminatorEnumParent | undefined = options.fixes.has(FIX.DISCRIMINATOR_VALUES)\n ? discriminators.enumParentOf(key)\n : undefined;\n if (parent === undefined || !isTsEnum(parent.schema, options)) {\n return null;\n }\n const reference = { ...enumRequest(parent.schema, parent.path, options), isOwnerReference: true };\n const name = footer.addEnum(reference);\n const members = footer.enumMembers(name);\n const names = values.map((value) => members.get(value as string | number));\n if (names.length === 0 || names.some((member) => member === undefined)) {\n return null;\n }\n return unionOf(names.map((member) => enumMemberType(name, member as string)));\n}\n\nfunction tsEnumType(schema: SchemaObject, request: SchemaRequest): IrType {\n const { options, footer } = request.context;\n // `isTsEnum` admits only strings and numbers, and the fix leaves `null` out of the members.\n const values = tsEnumEntries(schema, options).map(([value]) => value);\n const type =\n ownerEnumMembersType(schema, values, request) ??\n withOtherStrings(\n irReference(footer.addEnum(enumRequest(schema, request.location.path, options))),\n schema,\n );\n return options.fixes.has(FIX.NULLABLE_ENUMS) && isNullAllowed(schema)\n ? unionOf([type, irKeyword(\"null\")])\n : type;\n}\n\nfunction isUnionPosition(pointer: readonly string[], index: number): boolean {\n const next = pointer[index + 1];\n return UNION_KEYWORDS.has(pointer[index] as string) && next !== undefined && INDEX_RE.test(next);\n}\n\nconst PARAMETERS = \"parameters\";\n\n/** Where the `parameters` of a path item sit in its pointer: `paths/<key>/…`, `components/…`. */\nfunction pathItemParametersIndex(pointer: readonly string[]): number | null {\n if (pointer[0] === \"paths\" || pointer[0] === \"webhooks\") {\n return 2;\n }\n return pointer[0] === \"components\" && pointer[1] === \"pathItems\" ? 3 : null;\n}\n\n/**\n * The location of a path item parameter repeats `parameters` (`paths/~1a/parameters/parameters/\n * path/id`), which keeps the generated names as they were. The generated type has the segment\n * once: `paths[\"/a\"][\"parameters\"][\"path\"][\"id\"]`.\n */\nfunction withSingleParametersSegment(pointer: readonly string[]): readonly string[] {\n const index = pathItemParametersIndex(pointer);\n const isRepeated =\n index !== null && pointer[index] === PARAMETERS && pointer[index + 1] === PARAMETERS;\n return isRepeated ? [...pointer.slice(0, index), ...pointer.slice(index + 1)] : pointer;\n}\n\n/**\n * The pointer of `--enum-values` arrays without union positions (`anyOf/0`), so names stay\n * stable. Every property after the first union position is narrowed with `Extract`: a no-op where\n * all variants have it, and the needed narrowing where only some do.\n */\nfunction enumValuesPointer(path: string | undefined): { ref: string; extract: string[] } {\n const pointer = withSingleParametersSegment(parseRefPointer(path ?? \"\"));\n const kept: string[] = [];\n let firstVariantStart: number | null = null;\n for (let index = 0; index < pointer.length; index++) {\n if (isUnionPosition(pointer, index)) {\n firstVariantStart ??= index + 2;\n index++;\n continue;\n }\n kept.push(pointer[index] as string);\n }\n const extract =\n firstVariantStart === null\n ? []\n : pointer\n .slice(firstVariantStart)\n .filter((segment) => !UNION_KEYWORDS.has(segment) && !INDEX_RE.test(segment));\n return { ref: appendPointer(ROOT_POINTER, kept), extract };\n}\n\nfunction addEnumValues(schema: SchemaObject, request: SchemaRequest): void {\n const { ref, extract } = enumValuesPointer(request.location.path);\n const valuesType = refType(ref, { isDeep: true, extractProperties: extract });\n request.context.footer.addEnumValues({\n name: `${nameFromPath(request.location.path)}Values`,\n // A record value (`additionalProperties`) is reached by indexing with `string`.\n type: request.isFromAdditionalProperties\n ? irIndexedAccess(valuesType, irReference(\"string\"))\n : valuesType,\n values: (schema.enum ?? []) as (string | number)[],\n });\n}\n\nfunction literalEnumType(schema: SchemaObject, request: SchemaRequest): IrType {\n const values = schema.enum ?? [];\n const isNullable =\n (Array.isArray(schema.type) && schema.type.includes(\"null\")) || Boolean(schema.nullable);\n const literals = [...values.map(literalType), ...(isNullable ? [irKeyword(\"null\")] : [])];\n const type = withOtherStrings(unionOf(literals), schema);\n const isListable = values.every(\n (value) => typeof value === \"string\" || typeof value === \"number\",\n );\n if (request.context.options.enumValues && isListable) {\n addEnumValues(schema, request);\n }\n return type;\n}\n\n/**\n * `enum` on anything but an object (object enums are handled as `oneOf`). With\n * `additionalProperties`, only string enums are handled here; others fall through to composition.\n */\nexport const enumRule: SchemaRule = {\n name: \"enum\",\n matches(schema) {\n const isCandidate =\n Array.isArray(schema.enum) && schema.type !== \"object\" && !(\"properties\" in schema);\n return isCandidate && (!hasAdditionalProperties(schema) || schema.type === \"string\");\n },\n transform(schema, request) {\n return isTsEnum(schema, request.context.options)\n ? tsEnumType(schema, request)\n : literalEnumType(schema, request);\n },\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -62,7 +62,7 @@ function isExcluded(value, facts, request) {
|
|
|
62
62
|
return Boolean(resolved?.deprecated);
|
|
63
63
|
}
|
|
64
64
|
function propertyType(key, value, facts, request) {
|
|
65
|
-
const path = jsonPointer.
|
|
65
|
+
const path = jsonPointer.appendPointer(request.location.path, [key]);
|
|
66
66
|
const type = facts.ref ? pointerType.schemaRefType(facts.ref, request) : request.transformNested(value, { ...request.location, path });
|
|
67
67
|
const custom = request.context.callbacks.transform(value, request.location);
|
|
68
68
|
return custom === null ? { type, isOptional: null } : { type: custom.type, isOptional: custom.isOptional || null };
|
|
@@ -86,7 +86,7 @@ function propertyMember(key, value, schema, request) {
|
|
|
86
86
|
isReadonly: options.immutable || !options.readWriteMarkers && facts.flags.isReadOnly
|
|
87
87
|
}
|
|
88
88
|
);
|
|
89
|
-
return finishProperty(property, value, jsonPointer.
|
|
89
|
+
return finishProperty(property, value, jsonPointer.appendPointer(request.location.path, [key]), request);
|
|
90
90
|
}
|
|
91
91
|
function propertyMembers(schema, request) {
|
|
92
92
|
const members = [];
|
|
@@ -101,7 +101,7 @@ function propertyMembers(schema, request) {
|
|
|
101
101
|
function defsMember(defs, request) {
|
|
102
102
|
const { options } = request.context;
|
|
103
103
|
const members = Object.entries(defs).map(([key, value]) => {
|
|
104
|
-
const path = jsonPointer.
|
|
104
|
+
const path = jsonPointer.appendPointer(request.location.path, ["$defs", key]);
|
|
105
105
|
const flags = accessFlags.propertyAccessFlags(value, request.context);
|
|
106
106
|
const type = withReadWriteMarker(
|
|
107
107
|
request.transformNested(value, { ...request.location, path }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object-type.cjs","sources":["../../../../src/application/transform/schema/object-type.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../../../domain/errors.js\";\nimport {\n irObject,\n irProperty,\n irReference,\n irStringIndexSignature,\n} from \"../../../domain/ir/constructors.js\";\nimport type { IrMember, IrPropertySignature, IrType } from \"../../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../../domain/ir/property-name.js\";\nimport { createRef } from \"../../../domain/openapi/json-pointer.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { documentEntries } from \"../document-entries.js\";\nimport { schemaRefType } from \"../ref-pointer/pointer-type.js\";\nimport { schemaCommentOptionsOf, withSchemaComment } from \"../schema-comment.js\";\nimport { UNKNOWN_TYPE } from \"../shared-types.js\";\nimport { intersectionOf, unionOf } from \"../type-combinators.js\";\nimport { type AccessFlags, propertyAccessFlags } from \"./access-flags.js\";\nimport { discriminatorMember, inheritedDiscriminator } from \"./inherited-discriminator.js\";\nimport type { SchemaOptions } from \"./schema-context.js\";\nimport type { SchemaRequest } from \"./schema-rule.js\";\n\n/** Path parts where a default value cannot make a property required (inputs may omit it). */\nconst INPUT_PATH_PARTS = [\"parameters\", \"requestBody\", \"requestBodies\"] as const;\n\nexport class InvalidPropertyError extends OpenAPITypesafeError {\n constructor(path: string | undefined, key: string, value: unknown) {\n const received = Array.isArray(value) ? \"Array\" : typeof value;\n super({\n code: ERROR_CODES.SCHEMA_PROPERTY_INVALID,\n message:\n `${path}: invalid property ${key}. ` + `Expected Schema Object or boolean, got ${received}`,\n details: { path, property: key, received },\n });\n this.name = \"InvalidPropertyError\";\n }\n}\n\n/** `--read-write-markers`: `$Read<T>` / `$Write<T>`, unless the property is both or neither. */\nfunction withReadWriteMarker(type: IrType, flags: AccessFlags, options: SchemaOptions): IrType {\n if (!options.readWriteMarkers || flags.isReadOnly === flags.isWriteOnly) {\n return type;\n }\n return irReference(flags.isReadOnly ? \"$Read\" : \"$Write\", [type]);\n}\n\n/** Apply `transformProperty`, then the schema's JSDoc. */\nfunction finishProperty(\n property: IrPropertySignature,\n schema: Schema,\n path: string,\n request: SchemaRequest,\n): IrPropertySignature {\n const location = { ...request.location, path };\n const transformed =\n request.context.callbacks.transformProperty(property, schema, location) ?? property;\n // The original adds the schema's comment after any comment the callback set.\n return withSchemaComment(\n transformed,\n schema,\n schemaCommentOptionsOf(request.context.options.fixes),\n );\n}\n\n/** What the property loop reads from a property schema, in the original order. */\ninterface PropertyFacts {\n readonly ref: string | undefined;\n readonly flags: AccessFlags;\n readonly hasDefault: boolean;\n}\n\nfunction propertyFacts(value: Schema, request: SchemaRequest): PropertyFacts {\n if (typeof value !== \"object\") {\n return { ref: undefined, flags: { isReadOnly: false, isWriteOnly: false }, hasDefault: false };\n }\n // `in` throws for a null value, as in the original (which also reads `$ref` first).\n const ref = \"$ref\" in value && value.$ref ? value.$ref : undefined;\n const flags = propertyAccessFlags(value, request.context);\n return { ref, flags, hasDefault: \"default\" in value && value.default !== undefined };\n}\n\nfunction isOptionalProperty(\n key: string,\n facts: PropertyFacts,\n schema: SchemaObject,\n request: SchemaRequest,\n): boolean {\n const { options } = request.context;\n const path = request.location.path;\n const isDefaultRequired =\n facts.hasDefault &&\n options.defaultNonNullable &&\n !INPUT_PATH_PARTS.some((part) => path?.includes(part));\n const isRequired =\n schema.required?.includes(key) ||\n (schema.required === undefined && options.propertiesRequiredByDefault) ||\n isDefaultRequired;\n return !isRequired;\n}\n\nfunction isExcluded(value: Schema, facts: PropertyFacts, request: SchemaRequest): boolean {\n if (!request.context.options.excludeDeprecated) {\n return false;\n }\n const resolved = facts.ref ? request.context.refs.resolve(facts.ref) : value;\n return Boolean((resolved as SchemaObject | undefined)?.deprecated);\n}\n\n/** A type, and whether a callback forced the property optional (null: no override). */\ninterface CustomResult {\n readonly type: IrType;\n readonly isOptional: true | null;\n}\n\nfunction propertyType(\n key: string,\n value: Schema,\n facts: PropertyFacts,\n request: SchemaRequest,\n): CustomResult {\n const path = createRef([request.location.path, key]);\n const type = facts.ref\n ? schemaRefType(facts.ref, request)\n : request.transformNested(value, { ...request.location, path });\n const custom = request.context.callbacks.transform(value, request.location);\n return custom === null\n ? { type, isOptional: null }\n : { type: custom.type, isOptional: custom.isOptional || null };\n}\n\nfunction propertyMember(\n key: string,\n value: Schema,\n schema: SchemaObject,\n request: SchemaRequest,\n): IrMember | null {\n if ((typeof value !== \"object\" && typeof value !== \"boolean\") || Array.isArray(value)) {\n throw new InvalidPropertyError(request.location.path, key, value);\n }\n const facts = propertyFacts(value, request);\n if (isExcluded(value, facts, request)) {\n return null;\n }\n const { options } = request.context;\n const isOptional = isOptionalProperty(key, facts, schema, request);\n const result = propertyType(key, value, facts, request);\n const property = irProperty(\n toPropertyName(key),\n withReadWriteMarker(result.type, facts.flags, options),\n {\n isOptional: result.isOptional ?? isOptional,\n isReadonly: options.immutable || (!options.readWriteMarkers && facts.flags.isReadOnly),\n },\n );\n return finishProperty(property, value, createRef([request.location.path, key]), request);\n}\n\nfunction propertyMembers(schema: SchemaObject, request: SchemaRequest): IrMember[] {\n const members: IrMember[] = [];\n for (const [key, value] of documentEntries(schema.properties ?? {}, request.context.options)) {\n const member = propertyMember(key, value, schema, request);\n if (member !== null) {\n members.push(member);\n }\n }\n return members;\n}\n\n/**\n * `$defs` as a nested `$defs?: { … }` member, in document order (never alphabetized). It is\n * optional because `$defs` is a schema keyword, not data: the original made it required, so a\n * value of the type needed a `$defs` key (research/legacy-bugs.md, item 17, upstream #2664).\n */\nfunction defsMember(\n defs: Readonly<Record<string, SchemaObject>>,\n request: SchemaRequest,\n): IrMember {\n const { options } = request.context;\n const members = Object.entries(defs).map(([key, value]) => {\n const path = createRef([request.location.path, \"$defs\", key]);\n const flags = propertyAccessFlags(value, request.context);\n const type = withReadWriteMarker(\n request.transformNested(value, { ...request.location, path }),\n flags,\n options,\n );\n const property = irProperty(toPropertyName(key), type, {\n isReadonly: options.immutable || (!options.readWriteMarkers && flags.isReadOnly),\n });\n return finishProperty(property, value, path, request);\n });\n return irProperty(toPropertyName(\"$defs\"), irObject(members), { isOptional: true });\n}\n\nfunction hasObjectKeywords(schema: SchemaObject): boolean {\n const hasProperties = Boolean(schema.properties && Object.keys(schema.properties).length);\n return (\n hasProperties ||\n Boolean(schema.additionalProperties || schema.patternProperties || schema.$defs)\n );\n}\n\n/** Value types of the `[key: string]` index signature, in the original order. */\nfunction indexValueTypes(schema: SchemaObject, request: SchemaRequest): IrType[] {\n const { additionalProperties } = schema;\n const isObject = typeof additionalProperties === \"object\";\n const hasExplicit = isObject && Object.keys(additionalProperties).length > 0;\n const hasImplicit =\n additionalProperties === true || (isObject && Object.keys(additionalProperties).length === 0);\n const types: IrType[] = [];\n if (hasExplicit) {\n types.push(request.transformNested(additionalProperties as Schema, request.location, true));\n }\n if (hasImplicit || (!additionalProperties && request.context.options.additionalProperties)) {\n types.push(UNKNOWN_TYPE);\n }\n const patterns = schema.patternProperties;\n if (typeof patterns === \"object\" && patterns !== null && Object.keys(patterns).length > 0) {\n for (const [, value] of documentEntries(patterns, request.context.options)) {\n types.push(request.transformNested(value, request.location));\n }\n }\n return types;\n}\n\n/**\n * Whether the schema declares property `key` and the type keeps it: `--exclude-deprecated` drops\n * a deprecated one.\n */\nexport function isKeptProperty(schema: SchemaObject, key: string, request: SchemaRequest): boolean {\n const properties = schema.properties ?? {};\n if (!Object.hasOwn(properties, key)) {\n return false;\n }\n const value = properties[key] as Schema;\n const isExcludable = request.context.options.excludeDeprecated && typeof value === \"object\";\n return !isExcludable || !isExcluded(value, propertyFacts(value, request), request);\n}\n\n/**\n * The members for the discriminator and `properties`. A schema that declares the discriminator\n * property itself keeps its own declaration, required as the discriminator needs: both in one\n * object type do not compile (TS2300, the Apple SiriKit Cloud Media API). A declaration that\n * `--exclude-deprecated` drops does not count, so the discriminator property stays.\n */\nfunction discriminatorAndPropertyMembers(schema: SchemaObject, request: SchemaRequest): IrMember[] {\n const inherited = inheritedDiscriminator(schema, request);\n if (inherited === undefined) {\n return propertyMembers(schema, request);\n }\n const name = inherited.discriminator.propertyName;\n if (!isKeptProperty(schema, name, request)) {\n return [discriminatorMember(inherited, request), ...propertyMembers(schema, request)];\n }\n // Without `required`, `--properties-required-by-default` requires every property already; a\n // list of one would make the others optional.\n const isAllRequired =\n schema.required === undefined && request.context.options.propertiesRequiredByDefault;\n const required = isAllRequired ? undefined : [...(schema.required ?? []), name];\n return propertyMembers({ ...schema, required } as SchemaObject, request);\n}\n\n/**\n * Object keywords: discriminator, `properties`, `$defs`, and an index signature for\n * `additionalProperties` / `patternProperties` (or `--additional-properties`). Null when the schema\n * has none of them.\n */\nexport function objectType(schema: SchemaObject, request: SchemaRequest): IrType | null {\n if (!hasObjectKeywords(schema)) {\n const inherited = inheritedDiscriminator(schema, request);\n return inherited ? irObject([discriminatorMember(inherited, request)]) : null;\n }\n const members = discriminatorAndPropertyMembers(schema, request);\n // As in the original, a null `$defs` throws here (Object.keys) instead of being skipped.\n if (\n \"$defs\" in schema &&\n typeof schema.$defs === \"object\" &&\n Object.keys(schema.$defs).length > 0\n ) {\n members.push(defsMember(schema.$defs, request));\n }\n const valueTypes = indexValueTypes(schema, request);\n if (valueTypes.length === 0) {\n return members.length > 0 ? irObject(members) : null;\n }\n const index = irObject([\n irStringIndexSignature(\"key\", unionOf(valueTypes), request.context.options.immutable),\n ]);\n return intersectionOf([...(members.length > 0 ? [irObject(members)] : []), index]);\n}\n"],"names":["OpenAPITypesafeError","ERROR_CODES","irReference","withSchemaComment","schemaCommentOptionsOf","propertyAccessFlags","createRef","schemaRefType","irProperty","toPropertyName","documentEntries","irObject","UNKNOWN_TYPE","inheritedDiscriminator","discriminatorMember","irStringIndexSignature","unionOf","intersectionOf"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"object-type.cjs","sources":["../../../../src/application/transform/schema/object-type.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../../../domain/errors.js\";\nimport {\n irObject,\n irProperty,\n irReference,\n irStringIndexSignature,\n} from \"../../../domain/ir/constructors.js\";\nimport type { IrMember, IrPropertySignature, IrType } from \"../../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../../domain/ir/property-name.js\";\nimport { appendPointer } from \"../../../domain/openapi/json-pointer.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { documentEntries } from \"../document-entries.js\";\nimport { schemaRefType } from \"../ref-pointer/pointer-type.js\";\nimport { schemaCommentOptionsOf, withSchemaComment } from \"../schema-comment.js\";\nimport { UNKNOWN_TYPE } from \"../shared-types.js\";\nimport { intersectionOf, unionOf } from \"../type-combinators.js\";\nimport { type AccessFlags, propertyAccessFlags } from \"./access-flags.js\";\nimport { discriminatorMember, inheritedDiscriminator } from \"./inherited-discriminator.js\";\nimport type { SchemaOptions } from \"./schema-context.js\";\nimport type { SchemaRequest } from \"./schema-rule.js\";\n\n/** Path parts where a default value cannot make a property required (inputs may omit it). */\nconst INPUT_PATH_PARTS = [\"parameters\", \"requestBody\", \"requestBodies\"] as const;\n\nexport class InvalidPropertyError extends OpenAPITypesafeError {\n constructor(path: string | undefined, key: string, value: unknown) {\n const received = Array.isArray(value) ? \"Array\" : typeof value;\n super({\n code: ERROR_CODES.SCHEMA_PROPERTY_INVALID,\n message:\n `${path}: invalid property ${key}. ` + `Expected Schema Object or boolean, got ${received}`,\n details: { path, property: key, received },\n });\n this.name = \"InvalidPropertyError\";\n }\n}\n\n/** `--read-write-markers`: `$Read<T>` / `$Write<T>`, unless the property is both or neither. */\nfunction withReadWriteMarker(type: IrType, flags: AccessFlags, options: SchemaOptions): IrType {\n if (!options.readWriteMarkers || flags.isReadOnly === flags.isWriteOnly) {\n return type;\n }\n return irReference(flags.isReadOnly ? \"$Read\" : \"$Write\", [type]);\n}\n\n/** Apply `transformProperty`, then the schema's JSDoc. */\nfunction finishProperty(\n property: IrPropertySignature,\n schema: Schema,\n path: string,\n request: SchemaRequest,\n): IrPropertySignature {\n const location = { ...request.location, path };\n const transformed =\n request.context.callbacks.transformProperty(property, schema, location) ?? property;\n // The original adds the schema's comment after any comment the callback set.\n return withSchemaComment(\n transformed,\n schema,\n schemaCommentOptionsOf(request.context.options.fixes),\n );\n}\n\n/** What the property loop reads from a property schema, in the original order. */\ninterface PropertyFacts {\n readonly ref: string | undefined;\n readonly flags: AccessFlags;\n readonly hasDefault: boolean;\n}\n\nfunction propertyFacts(value: Schema, request: SchemaRequest): PropertyFacts {\n if (typeof value !== \"object\") {\n return { ref: undefined, flags: { isReadOnly: false, isWriteOnly: false }, hasDefault: false };\n }\n // `in` throws for a null value, as in the original (which also reads `$ref` first).\n const ref = \"$ref\" in value && value.$ref ? value.$ref : undefined;\n const flags = propertyAccessFlags(value, request.context);\n return { ref, flags, hasDefault: \"default\" in value && value.default !== undefined };\n}\n\nfunction isOptionalProperty(\n key: string,\n facts: PropertyFacts,\n schema: SchemaObject,\n request: SchemaRequest,\n): boolean {\n const { options } = request.context;\n const path = request.location.path;\n const isDefaultRequired =\n facts.hasDefault &&\n options.defaultNonNullable &&\n !INPUT_PATH_PARTS.some((part) => path?.includes(part));\n const isRequired =\n schema.required?.includes(key) ||\n (schema.required === undefined && options.propertiesRequiredByDefault) ||\n isDefaultRequired;\n return !isRequired;\n}\n\nfunction isExcluded(value: Schema, facts: PropertyFacts, request: SchemaRequest): boolean {\n if (!request.context.options.excludeDeprecated) {\n return false;\n }\n const resolved = facts.ref ? request.context.refs.resolve(facts.ref) : value;\n return Boolean((resolved as SchemaObject | undefined)?.deprecated);\n}\n\n/** A type, and whether a callback forced the property optional (null: no override). */\ninterface CustomResult {\n readonly type: IrType;\n readonly isOptional: true | null;\n}\n\nfunction propertyType(\n key: string,\n value: Schema,\n facts: PropertyFacts,\n request: SchemaRequest,\n): CustomResult {\n const path = appendPointer(request.location.path, [key]);\n const type = facts.ref\n ? schemaRefType(facts.ref, request)\n : request.transformNested(value, { ...request.location, path });\n const custom = request.context.callbacks.transform(value, request.location);\n return custom === null\n ? { type, isOptional: null }\n : { type: custom.type, isOptional: custom.isOptional || null };\n}\n\nfunction propertyMember(\n key: string,\n value: Schema,\n schema: SchemaObject,\n request: SchemaRequest,\n): IrMember | null {\n if ((typeof value !== \"object\" && typeof value !== \"boolean\") || Array.isArray(value)) {\n throw new InvalidPropertyError(request.location.path, key, value);\n }\n const facts = propertyFacts(value, request);\n if (isExcluded(value, facts, request)) {\n return null;\n }\n const { options } = request.context;\n const isOptional = isOptionalProperty(key, facts, schema, request);\n const result = propertyType(key, value, facts, request);\n const property = irProperty(\n toPropertyName(key),\n withReadWriteMarker(result.type, facts.flags, options),\n {\n isOptional: result.isOptional ?? isOptional,\n isReadonly: options.immutable || (!options.readWriteMarkers && facts.flags.isReadOnly),\n },\n );\n return finishProperty(property, value, appendPointer(request.location.path, [key]), request);\n}\n\nfunction propertyMembers(schema: SchemaObject, request: SchemaRequest): IrMember[] {\n const members: IrMember[] = [];\n for (const [key, value] of documentEntries(schema.properties ?? {}, request.context.options)) {\n const member = propertyMember(key, value, schema, request);\n if (member !== null) {\n members.push(member);\n }\n }\n return members;\n}\n\n/**\n * `$defs` as a nested `$defs?: { … }` member, in document order (never alphabetized). It is\n * optional because `$defs` is a schema keyword, not data: the original made it required, so a\n * value of the type needed a `$defs` key (research/legacy-bugs.md, item 17, upstream #2664).\n */\nfunction defsMember(\n defs: Readonly<Record<string, SchemaObject>>,\n request: SchemaRequest,\n): IrMember {\n const { options } = request.context;\n const members = Object.entries(defs).map(([key, value]) => {\n const path = appendPointer(request.location.path, [\"$defs\", key]);\n const flags = propertyAccessFlags(value, request.context);\n const type = withReadWriteMarker(\n request.transformNested(value, { ...request.location, path }),\n flags,\n options,\n );\n const property = irProperty(toPropertyName(key), type, {\n isReadonly: options.immutable || (!options.readWriteMarkers && flags.isReadOnly),\n });\n return finishProperty(property, value, path, request);\n });\n return irProperty(toPropertyName(\"$defs\"), irObject(members), { isOptional: true });\n}\n\nfunction hasObjectKeywords(schema: SchemaObject): boolean {\n const hasProperties = Boolean(schema.properties && Object.keys(schema.properties).length);\n return (\n hasProperties ||\n Boolean(schema.additionalProperties || schema.patternProperties || schema.$defs)\n );\n}\n\n/** Value types of the `[key: string]` index signature, in the original order. */\nfunction indexValueTypes(schema: SchemaObject, request: SchemaRequest): IrType[] {\n const { additionalProperties } = schema;\n const isObject = typeof additionalProperties === \"object\";\n const hasExplicit = isObject && Object.keys(additionalProperties).length > 0;\n const hasImplicit =\n additionalProperties === true || (isObject && Object.keys(additionalProperties).length === 0);\n const types: IrType[] = [];\n if (hasExplicit) {\n types.push(request.transformNested(additionalProperties as Schema, request.location, true));\n }\n if (hasImplicit || (!additionalProperties && request.context.options.additionalProperties)) {\n types.push(UNKNOWN_TYPE);\n }\n const patterns = schema.patternProperties;\n if (typeof patterns === \"object\" && patterns !== null && Object.keys(patterns).length > 0) {\n for (const [, value] of documentEntries(patterns, request.context.options)) {\n types.push(request.transformNested(value, request.location));\n }\n }\n return types;\n}\n\n/**\n * Whether the schema declares property `key` and the type keeps it: `--exclude-deprecated` drops\n * a deprecated one.\n */\nexport function isKeptProperty(schema: SchemaObject, key: string, request: SchemaRequest): boolean {\n const properties = schema.properties ?? {};\n if (!Object.hasOwn(properties, key)) {\n return false;\n }\n const value = properties[key] as Schema;\n const isExcludable = request.context.options.excludeDeprecated && typeof value === \"object\";\n return !isExcludable || !isExcluded(value, propertyFacts(value, request), request);\n}\n\n/**\n * The members for the discriminator and `properties`. A schema that declares the discriminator\n * property itself keeps its own declaration, required as the discriminator needs: both in one\n * object type do not compile (TS2300, the Apple SiriKit Cloud Media API). A declaration that\n * `--exclude-deprecated` drops does not count, so the discriminator property stays.\n */\nfunction discriminatorAndPropertyMembers(schema: SchemaObject, request: SchemaRequest): IrMember[] {\n const inherited = inheritedDiscriminator(schema, request);\n if (inherited === undefined) {\n return propertyMembers(schema, request);\n }\n const name = inherited.discriminator.propertyName;\n if (!isKeptProperty(schema, name, request)) {\n return [discriminatorMember(inherited, request), ...propertyMembers(schema, request)];\n }\n // Without `required`, `--properties-required-by-default` requires every property already; a\n // list of one would make the others optional.\n const isAllRequired =\n schema.required === undefined && request.context.options.propertiesRequiredByDefault;\n const required = isAllRequired ? undefined : [...(schema.required ?? []), name];\n return propertyMembers({ ...schema, required } as SchemaObject, request);\n}\n\n/**\n * Object keywords: discriminator, `properties`, `$defs`, and an index signature for\n * `additionalProperties` / `patternProperties` (or `--additional-properties`). Null when the schema\n * has none of them.\n */\nexport function objectType(schema: SchemaObject, request: SchemaRequest): IrType | null {\n if (!hasObjectKeywords(schema)) {\n const inherited = inheritedDiscriminator(schema, request);\n return inherited ? irObject([discriminatorMember(inherited, request)]) : null;\n }\n const members = discriminatorAndPropertyMembers(schema, request);\n // As in the original, a null `$defs` throws here (Object.keys) instead of being skipped.\n if (\n \"$defs\" in schema &&\n typeof schema.$defs === \"object\" &&\n Object.keys(schema.$defs).length > 0\n ) {\n members.push(defsMember(schema.$defs, request));\n }\n const valueTypes = indexValueTypes(schema, request);\n if (valueTypes.length === 0) {\n return members.length > 0 ? irObject(members) : null;\n }\n const index = irObject([\n irStringIndexSignature(\"key\", unionOf(valueTypes), request.context.options.immutable),\n ]);\n return intersectionOf([...(members.length > 0 ? [irObject(members)] : []), index]);\n}\n"],"names":["OpenAPITypesafeError","ERROR_CODES","irReference","withSchemaComment","schemaCommentOptionsOf","propertyAccessFlags","appendPointer","schemaRefType","irProperty","toPropertyName","documentEntries","irObject","UNKNOWN_TYPE","inheritedDiscriminator","discriminatorMember","irStringIndexSignature","unionOf","intersectionOf"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { OpenAPITypesafeError, ERROR_CODES } from '../../../domain/errors.mjs';
|
|
2
2
|
import { irObject, irStringIndexSignature, irProperty, irReference } from '../../../domain/ir/constructors.mjs';
|
|
3
3
|
import { toPropertyName } from '../../../domain/ir/property-name.mjs';
|
|
4
|
-
import {
|
|
4
|
+
import { appendPointer } from '../../../domain/openapi/json-pointer.mjs';
|
|
5
5
|
import { documentEntries } from '../document-entries.mjs';
|
|
6
6
|
import { schemaRefType } from '../ref-pointer/pointer-type.mjs';
|
|
7
7
|
import { withSchemaComment, schemaCommentOptionsOf } from '../schema-comment.mjs';
|
|
@@ -60,7 +60,7 @@ function isExcluded(value, facts, request) {
|
|
|
60
60
|
return Boolean(resolved?.deprecated);
|
|
61
61
|
}
|
|
62
62
|
function propertyType(key, value, facts, request) {
|
|
63
|
-
const path =
|
|
63
|
+
const path = appendPointer(request.location.path, [key]);
|
|
64
64
|
const type = facts.ref ? schemaRefType(facts.ref, request) : request.transformNested(value, { ...request.location, path });
|
|
65
65
|
const custom = request.context.callbacks.transform(value, request.location);
|
|
66
66
|
return custom === null ? { type, isOptional: null } : { type: custom.type, isOptional: custom.isOptional || null };
|
|
@@ -84,7 +84,7 @@ function propertyMember(key, value, schema, request) {
|
|
|
84
84
|
isReadonly: options.immutable || !options.readWriteMarkers && facts.flags.isReadOnly
|
|
85
85
|
}
|
|
86
86
|
);
|
|
87
|
-
return finishProperty(property, value,
|
|
87
|
+
return finishProperty(property, value, appendPointer(request.location.path, [key]), request);
|
|
88
88
|
}
|
|
89
89
|
function propertyMembers(schema, request) {
|
|
90
90
|
const members = [];
|
|
@@ -99,7 +99,7 @@ function propertyMembers(schema, request) {
|
|
|
99
99
|
function defsMember(defs, request) {
|
|
100
100
|
const { options } = request.context;
|
|
101
101
|
const members = Object.entries(defs).map(([key, value]) => {
|
|
102
|
-
const path =
|
|
102
|
+
const path = appendPointer(request.location.path, ["$defs", key]);
|
|
103
103
|
const flags = propertyAccessFlags(value, request.context);
|
|
104
104
|
const type = withReadWriteMarker(
|
|
105
105
|
request.transformNested(value, { ...request.location, path }),
|