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":"object-type.mjs","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":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"object-type.mjs","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":[],"mappings":";;;;;;;;;;;;AAsBA,MAAM,gBAAA,GAAmB,CAAC,YAAA,EAAc,aAAA,EAAe,eAAe,CAAA;AAE/D,MAAM,6BAA6B,oBAAA,CAAqB;AAAA,EAC7D,WAAA,CAAY,IAAA,EAA0B,GAAA,EAAa,KAAA,EAAgB;AACjE,IAAA,MAAM,WAAW,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,UAAU,OAAO,KAAA;AACzD,IAAA,KAAA,CAAM;AAAA,MACJ,MAAM,WAAA,CAAY,uBAAA;AAAA,MAClB,SACE,CAAA,EAAG,IAAI,CAAA,mBAAA,EAAsB,GAAG,4CAAiD,QAAQ,CAAA,CAAA;AAAA,MAC3F,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAU,KAAK,QAAA;AAAS,KAC1C,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AAAA,EACd;AACF;AAGA,SAAS,mBAAA,CAAoB,IAAA,EAAc,KAAA,EAAoB,OAAA,EAAgC;AAC7F,EAAA,IAAI,CAAC,OAAA,CAAQ,gBAAA,IAAoB,KAAA,CAAM,UAAA,KAAe,MAAM,WAAA,EAAa;AACvE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,YAAY,KAAA,CAAM,UAAA,GAAa,UAAU,QAAA,EAAU,CAAC,IAAI,CAAC,CAAA;AAClE;AAGA,SAAS,cAAA,CACP,QAAA,EACA,MAAA,EACA,IAAA,EACA,OAAA,EACqB;AACrB,EAAA,MAAM,QAAA,GAAW,EAAE,GAAG,OAAA,CAAQ,UAAU,IAAA,EAAK;AAC7C,EAAA,MAAM,WAAA,GACJ,QAAQ,OAAA,CAAQ,SAAA,CAAU,kBAAkB,QAAA,EAAU,MAAA,EAAQ,QAAQ,CAAA,IAAK,QAAA;AAE7E,EAAA,OAAO,iBAAA;AAAA,IACL,WAAA;AAAA,IACA,MAAA;AAAA,IACA,sBAAA,CAAuB,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,KAAK;AAAA,GACtD;AACF;AASA,SAAS,aAAA,CAAc,OAAe,OAAA,EAAuC;AAC3E,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,EAAE,GAAA,EAAK,MAAA,EAAW,KAAA,EAAO,EAAE,UAAA,EAAY,KAAA,EAAO,WAAA,EAAa,KAAA,EAAM,EAAG,UAAA,EAAY,KAAA,EAAM;AAAA,EAC/F;AAEA,EAAA,MAAM,MAAM,MAAA,IAAU,KAAA,IAAS,KAAA,CAAM,IAAA,GAAO,MAAM,IAAA,GAAO,MAAA;AACzD,EAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,KAAA,EAAO,OAAA,CAAQ,OAAO,CAAA;AACxD,EAAA,OAAO,EAAE,KAAK,KAAA,EAAO,UAAA,EAAY,aAAa,KAAA,IAAS,KAAA,CAAM,YAAY,MAAA,EAAU;AACrF;AAEA,SAAS,kBAAA,CACP,GAAA,EACA,KAAA,EACA,MAAA,EACA,OAAA,EACS;AACT,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,OAAA,CAAQ,OAAA;AAC5B,EAAA,MAAM,IAAA,GAAO,QAAQ,QAAA,CAAS,IAAA;AAC9B,EAAA,MAAM,iBAAA,GACJ,KAAA,CAAM,UAAA,IACN,OAAA,CAAQ,kBAAA,IACR,CAAC,gBAAA,CAAiB,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,EAAM,QAAA,CAAS,IAAI,CAAC,CAAA;AACvD,EAAA,MAAM,UAAA,GACJ,MAAA,CAAO,QAAA,EAAU,QAAA,CAAS,GAAG,KAC5B,MAAA,CAAO,QAAA,KAAa,MAAA,IAAa,OAAA,CAAQ,2BAAA,IAC1C,iBAAA;AACF,EAAA,OAAO,CAAC,UAAA;AACV;AAEA,SAAS,UAAA,CAAW,KAAA,EAAe,KAAA,EAAsB,OAAA,EAAiC;AACxF,EAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,iBAAA,EAAmB;AAC9C,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,QAAA,GAAW,MAAM,GAAA,GAAM,OAAA,CAAQ,QAAQ,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA;AACvE,EAAA,OAAO,OAAA,CAAS,UAAuC,UAAU,CAAA;AACnE;AAQA,SAAS,YAAA,CACP,GAAA,EACA,KAAA,EACA,KAAA,EACA,OAAA,EACc;AACd,EAAA,MAAM,OAAO,aAAA,CAAc,OAAA,CAAQ,SAAS,IAAA,EAAM,CAAC,GAAG,CAAC,CAAA;AACvD,EAAA,MAAM,OAAO,KAAA,CAAM,GAAA,GACf,aAAA,CAAc,KAAA,CAAM,KAAK,OAAO,CAAA,GAChC,OAAA,CAAQ,eAAA,CAAgB,OAAO,EAAE,GAAG,OAAA,CAAQ,QAAA,EAAU,MAAM,CAAA;AAChE,EAAA,MAAM,SAAS,OAAA,CAAQ,OAAA,CAAQ,UAAU,SAAA,CAAU,KAAA,EAAO,QAAQ,QAAQ,CAAA;AAC1E,EAAA,OAAO,MAAA,KAAW,IAAA,GACd,EAAE,IAAA,EAAM,YAAY,IAAA,EAAK,GACzB,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,UAAA,EAAY,MAAA,CAAO,cAAc,IAAA,EAAK;AACjE;AAEA,SAAS,cAAA,CACP,GAAA,EACA,KAAA,EACA,MAAA,EACA,OAAA,EACiB;AACjB,EAAA,IAAK,OAAO,UAAU,QAAA,IAAY,OAAO,UAAU,SAAA,IAAc,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACrF,IAAA,MAAM,IAAI,oBAAA,CAAqB,OAAA,CAAQ,QAAA,CAAS,IAAA,EAAM,KAAK,KAAK,CAAA;AAAA,EAClE;AACA,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,EAAO,OAAO,CAAA;AAC1C,EAAA,IAAI,UAAA,CAAW,KAAA,EAAO,KAAA,EAAO,OAAO,CAAA,EAAG;AACrC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,OAAA,CAAQ,OAAA;AAC5B,EAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,GAAA,EAAK,KAAA,EAAO,QAAQ,OAAO,CAAA;AACjE,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,GAAA,EAAK,KAAA,EAAO,OAAO,OAAO,CAAA;AACtD,EAAA,MAAM,QAAA,GAAW,UAAA;AAAA,IACf,eAAe,GAAG,CAAA;AAAA,IAClB,mBAAA,CAAoB,MAAA,CAAO,IAAA,EAAM,KAAA,CAAM,OAAO,OAAO,CAAA;AAAA,IACrD;AAAA,MACE,UAAA,EAAY,OAAO,UAAA,IAAc,UAAA;AAAA,MACjC,YAAY,OAAA,CAAQ,SAAA,IAAc,CAAC,OAAA,CAAQ,gBAAA,IAAoB,MAAM,KAAA,CAAM;AAAA;AAC7E,GACF;AACA,EAAA,OAAO,cAAA,CAAe,QAAA,EAAU,KAAA,EAAO,aAAA,CAAc,OAAA,CAAQ,QAAA,CAAS,IAAA,EAAM,CAAC,GAAG,CAAC,CAAA,EAAG,OAAO,CAAA;AAC7F;AAEA,SAAS,eAAA,CAAgB,QAAsB,OAAA,EAAoC;AACjF,EAAA,MAAM,UAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,eAAA,CAAgB,MAAA,CAAO,UAAA,IAAc,EAAC,EAAG,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC5F,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,GAAA,EAAK,KAAA,EAAO,QAAQ,OAAO,CAAA;AACzD,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,IACrB;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAOA,SAAS,UAAA,CACP,MACA,OAAA,EACU;AACV,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,OAAA,CAAQ,OAAA;AAC5B,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,IAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACzD,IAAA,MAAM,IAAA,GAAO,cAAc,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAC,OAAA,EAAS,GAAG,CAAC,CAAA;AAChE,IAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,KAAA,EAAO,OAAA,CAAQ,OAAO,CAAA;AACxD,IAAA,MAAM,IAAA,GAAO,mBAAA;AAAA,MACX,OAAA,CAAQ,gBAAgB,KAAA,EAAO,EAAE,GAAG,OAAA,CAAQ,QAAA,EAAU,MAAM,CAAA;AAAA,MAC5D,KAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,cAAA,CAAe,GAAG,GAAG,IAAA,EAAM;AAAA,MACrD,YAAY,OAAA,CAAQ,SAAA,IAAc,CAAC,OAAA,CAAQ,oBAAoB,KAAA,CAAM;AAAA,KACtE,CAAA;AACD,IAAA,OAAO,cAAA,CAAe,QAAA,EAAU,KAAA,EAAO,IAAA,EAAM,OAAO,CAAA;AAAA,EACtD,CAAC,CAAA;AACD,EAAA,OAAO,UAAA,CAAW,cAAA,CAAe,OAAO,CAAA,EAAG,QAAA,CAAS,OAAO,CAAA,EAAG,EAAE,UAAA,EAAY,IAAA,EAAM,CAAA;AACpF;AAEA,SAAS,kBAAkB,MAAA,EAA+B;AACxD,EAAA,MAAM,aAAA,GAAgB,QAAQ,MAAA,CAAO,UAAA,IAAc,OAAO,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA,CAAE,MAAM,CAAA;AACxF,EAAA,OACE,iBACA,OAAA,CAAQ,MAAA,CAAO,wBAAwB,MAAA,CAAO,iBAAA,IAAqB,OAAO,KAAK,CAAA;AAEnF;AAGA,SAAS,eAAA,CAAgB,QAAsB,OAAA,EAAkC;AAC/E,EAAA,MAAM,EAAE,sBAAqB,GAAI,MAAA;AACjC,EAAA,MAAM,QAAA,GAAW,OAAO,oBAAA,KAAyB,QAAA;AACjD,EAAA,MAAM,cAAc,QAAA,IAAY,MAAA,CAAO,IAAA,CAAK,oBAAoB,EAAE,MAAA,GAAS,CAAA;AAC3E,EAAA,MAAM,WAAA,GACJ,yBAAyB,IAAA,IAAS,QAAA,IAAY,OAAO,IAAA,CAAK,oBAAoB,EAAE,MAAA,KAAW,CAAA;AAC7F,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,KAAA,CAAM,KAAK,OAAA,CAAQ,eAAA,CAAgB,sBAAgC,OAAA,CAAQ,QAAA,EAAU,IAAI,CAAC,CAAA;AAAA,EAC5F;AACA,EAAA,IAAI,eAAgB,CAAC,oBAAA,IAAwB,OAAA,CAAQ,OAAA,CAAQ,QAAQ,oBAAA,EAAuB;AAC1F,IAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AAAA,EACzB;AACA,EAAA,MAAM,WAAW,MAAA,CAAO,iBAAA;AACxB,EAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,KAAa,IAAA,IAAQ,OAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG;AACzF,IAAA,KAAA,MAAW,GAAG,KAAK,CAAA,IAAK,gBAAgB,QAAA,EAAU,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1E,MAAA,KAAA,CAAM,KAAK,OAAA,CAAQ,eAAA,CAAgB,KAAA,EAAO,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,IAC7D;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAMO,SAAS,cAAA,CAAe,MAAA,EAAsB,GAAA,EAAa,OAAA,EAAiC;AACjG,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,UAAA,IAAc,EAAC;AACzC,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,GAAG,CAAA,EAAG;AACnC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQ,WAAW,GAAG,CAAA;AAC5B,EAAA,MAAM,eAAe,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,iBAAA,IAAqB,OAAO,KAAA,KAAU,QAAA;AACnF,EAAA,OAAO,CAAC,gBAAgB,CAAC,UAAA,CAAW,OAAO,aAAA,CAAc,KAAA,EAAO,OAAO,CAAA,EAAG,OAAO,CAAA;AACnF;AAQA,SAAS,+BAAA,CAAgC,QAAsB,OAAA,EAAoC;AACjG,EAAA,MAAM,SAAA,GAAY,sBAAA,CAAuB,MAAA,EAAQ,OAAO,CAAA;AACxD,EAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,IAAA,OAAO,eAAA,CAAgB,QAAQ,OAAO,CAAA;AAAA,EACxC;AACA,EAAA,MAAM,IAAA,GAAO,UAAU,aAAA,CAAc,YAAA;AACrC,EAAA,IAAI,CAAC,cAAA,CAAe,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAA,EAAG;AAC1C,IAAA,OAAO,CAAC,oBAAoB,SAAA,EAAW,OAAO,GAAG,GAAG,eAAA,CAAgB,MAAA,EAAQ,OAAO,CAAC,CAAA;AAAA,EACtF;AAGA,EAAA,MAAM,gBACJ,MAAA,CAAO,QAAA,KAAa,MAAA,IAAa,OAAA,CAAQ,QAAQ,OAAA,CAAQ,2BAAA;AAC3D,EAAA,MAAM,QAAA,GAAW,gBAAgB,MAAA,GAAY,CAAC,GAAI,MAAA,CAAO,QAAA,IAAY,EAAC,EAAI,IAAI,CAAA;AAC9E,EAAA,OAAO,gBAAgB,EAAE,GAAG,MAAA,EAAQ,QAAA,IAA4B,OAAO,CAAA;AACzE;AAOO,SAAS,UAAA,CAAW,QAAsB,OAAA,EAAuC;AACtF,EAAA,IAAI,CAAC,iBAAA,CAAkB,MAAM,CAAA,EAAG;AAC9B,IAAA,MAAM,SAAA,GAAY,sBAAA,CAAuB,MAAA,EAAQ,OAAO,CAAA;AACxD,IAAA,OAAO,SAAA,GAAY,SAAS,CAAC,mBAAA,CAAoB,WAAW,OAAO,CAAC,CAAC,CAAA,GAAI,IAAA;AAAA,EAC3E;AACA,EAAA,MAAM,OAAA,GAAU,+BAAA,CAAgC,MAAA,EAAQ,OAAO,CAAA;AAE/D,EAAA,IACE,OAAA,IAAW,MAAA,IACX,OAAO,MAAA,CAAO,KAAA,KAAU,QAAA,IACxB,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,CAAE,MAAA,GAAS,CAAA,EACnC;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,KAAA,EAAO,OAAO,CAAC,CAAA;AAAA,EAChD;AACA,EAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,MAAA,EAAQ,OAAO,CAAA;AAClD,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,OAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,QAAA,CAAS,OAAO,CAAA,GAAI,IAAA;AAAA,EAClD;AACA,EAAA,MAAM,QAAQ,QAAA,CAAS;AAAA,IACrB,sBAAA,CAAuB,OAAO,OAAA,CAAQ,UAAU,GAAG,OAAA,CAAQ,OAAA,CAAQ,QAAQ,SAAS;AAAA,GACrF,CAAA;AACD,EAAA,OAAO,cAAA,CAAe,CAAC,GAAI,OAAA,CAAQ,SAAS,CAAA,GAAI,CAAC,QAAA,CAAS,OAAO,CAAC,CAAA,GAAI,EAAC,EAAI,KAAK,CAAC,CAAA;AACnF;;"}
|
|
@@ -41,7 +41,7 @@ function memberSchema(member, request) {
|
|
|
41
41
|
}
|
|
42
42
|
function allOfMembers(members, request) {
|
|
43
43
|
const unchanged = { members, required: [] };
|
|
44
|
-
if (!request.context.options.fixes.has(outputFixes.
|
|
44
|
+
if (!request.context.options.fixes.has(outputFixes.FIX.ALLOF_REQUIRED)) {
|
|
45
45
|
return unchanged;
|
|
46
46
|
}
|
|
47
47
|
const schemas = members.map((member) => memberSchema(member, request));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presence-members.cjs","sources":["../../../../src/application/transform/schema/presence-members.ts"],"sourcesContent":["import type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport {
|
|
1
|
+
{"version":3,"file":"presence-members.cjs","sources":["../../../../src/application/transform/schema/presence-members.ts"],"sourcesContent":["import type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { FIX } from \"../../../domain/output-fixes.js\";\nimport type { SchemaRequest } from \"./schema-rule.js\";\n\n/**\n * The `allof-required` fix (ADR-021, roadmap R6). An `allOf` member such as `{ required: [name] }`\n * or `{ type: object }` says nothing about the shape of the object; it only asks that keys are\n * present. Typed as an object of its own, it adds `& Record<string, never>` or `& unknown`. With\n * the fix, such members are left out and their keys are made required in the other members, the\n * same way the parent's `required` is (upstream #1474, #1520, #2165).\n */\n\n/**\n * Keywords that do not change the shape: `type: object`, `required`, and annotations that the\n * generator does not read on an `allOf` member. `default`, `readOnly` and `writeOnly` are left out:\n * they change types elsewhere.\n */\nconst PRESENCE_KEYWORDS: ReadonlySet<string> = new Set([\n \"$comment\",\n \"deprecated\",\n \"description\",\n \"example\",\n \"examples\",\n \"required\",\n \"title\",\n \"type\",\n]);\n\nconst EXTENSION_PREFIX = \"x-\";\nconst OBJECT_TYPE = \"object\";\n\nfunction isStringList(value: unknown): value is readonly string[] {\n return Array.isArray(value) && value.every((entry) => typeof entry === \"string\");\n}\n\nfunction isPresenceKeyword([key, value]: readonly [string, unknown]): boolean {\n if (key === \"type\") {\n return value === OBJECT_TYPE;\n }\n if (key === \"required\") {\n return isStringList(value);\n }\n return PRESENCE_KEYWORDS.has(key) || key.startsWith(EXTENSION_PREFIX);\n}\n\nfunction isPresenceObject(schema: unknown): schema is SchemaObject {\n return (\n typeof schema === \"object\" &&\n schema !== null &&\n !Array.isArray(schema) &&\n !(\"$ref\" in schema) &&\n Object.entries(schema).every(isPresenceKeyword)\n );\n}\n\n/**\n * The schema a member stands for: itself, or the target of a `$ref` with no sibling keywords. The\n * discriminator scan has already added the discriminator property to a mapped target, so such a\n * target is never presence-only.\n */\nfunction memberSchema(member: Schema, request: SchemaRequest): unknown {\n if (typeof member !== \"object\" || member === null || !(\"$ref\" in member)) {\n return member;\n }\n const ref = (member as { readonly $ref: unknown }).$ref;\n if (typeof ref !== \"string\" || Object.keys(member).length !== 1) {\n return undefined;\n }\n return request.context.refs.resolve(ref);\n}\n\n/** The `allOf` members to type, and the keys the left-out members make required. */\nexport interface AllOfMembers {\n readonly members: readonly Schema[];\n readonly required: readonly string[];\n}\n\n/**\n * The members of `allOf` with presence-only ones left out, when the fix is on and another member\n * is left to carry the keys; otherwise the members as they are.\n */\nexport function allOfMembers(members: readonly Schema[], request: SchemaRequest): AllOfMembers {\n const unchanged = { members, required: [] };\n if (!request.context.options.fixes.has(FIX.ALLOF_REQUIRED)) {\n return unchanged;\n }\n const schemas = members.map((member) => memberSchema(member, request));\n const kept = members.filter((_, index) => !isPresenceObject(schemas[index]));\n if (kept.length === 0 || kept.length === members.length) {\n return unchanged;\n }\n const required = schemas.flatMap((schema) =>\n isPresenceObject(schema) ? (schema.required ?? []) : [],\n );\n return { members: kept, required };\n}\n"],"names":["FIX"],"mappings":";;;;AAiBA,MAAM,iBAAA,uBAA6C,GAAA,CAAI;AAAA,EACrD,UAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,MAAM,gBAAA,GAAmB,IAAA;AACzB,MAAM,WAAA,GAAc,QAAA;AAEpB,SAAS,aAAa,KAAA,EAA4C;AAChE,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,KAAA,CAAM,MAAM,CAAC,KAAA,KAAU,OAAO,KAAA,KAAU,QAAQ,CAAA;AACjF;AAEA,SAAS,iBAAA,CAAkB,CAAC,GAAA,EAAK,KAAK,CAAA,EAAwC;AAC5E,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,OAAO,KAAA,KAAU,WAAA;AAAA,EACnB;AACA,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,OAAO,aAAa,KAAK,CAAA;AAAA,EAC3B;AACA,EAAA,OAAO,kBAAkB,GAAA,CAAI,GAAG,CAAA,IAAK,GAAA,CAAI,WAAW,gBAAgB,CAAA;AACtE;AAEA,SAAS,iBAAiB,MAAA,EAAyC;AACjE,EAAA,OACE,OAAO,MAAA,KAAW,QAAA,IAClB,WAAW,IAAA,IACX,CAAC,MAAM,OAAA,CAAQ,MAAM,CAAA,IACrB,EAAE,UAAU,MAAA,CAAA,IACZ,MAAA,CAAO,QAAQ,MAAM,CAAA,CAAE,MAAM,iBAAiB,CAAA;AAElD;AAOA,SAAS,YAAA,CAAa,QAAgB,OAAA,EAAiC;AACrE,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,WAAW,IAAA,IAAQ,EAAE,UAAU,MAAA,CAAA,EAAS;AACxE,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAO,MAAA,CAAsC,IAAA;AACnD,EAAA,IAAI,OAAO,QAAQ,QAAA,IAAY,MAAA,CAAO,KAAK,MAAM,CAAA,CAAE,WAAW,CAAA,EAAG;AAC/D,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AACzC;AAYO,SAAS,YAAA,CAAa,SAA4B,OAAA,EAAsC;AAC7F,EAAA,MAAM,SAAA,GAAY,EAAE,OAAA,EAAS,QAAA,EAAU,EAAC,EAAE;AAC1C,EAAA,IAAI,CAAC,QAAQ,OAAA,CAAQ,OAAA,CAAQ,MAAM,GAAA,CAAIA,eAAA,CAAI,cAAc,CAAA,EAAG;AAC1D,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,QAAQ,GAAA,CAAI,CAAC,WAAW,YAAA,CAAa,MAAA,EAAQ,OAAO,CAAC,CAAA;AACrE,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,KAAA,KAAU,CAAC,gBAAA,CAAiB,OAAA,CAAQ,KAAK,CAAC,CAAC,CAAA;AAC3E,EAAA,IAAI,KAAK,MAAA,KAAW,CAAA,IAAK,IAAA,CAAK,MAAA,KAAW,QAAQ,MAAA,EAAQ;AACvD,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAW,OAAA,CAAQ,OAAA;AAAA,IAAQ,CAAC,WAChC,gBAAA,CAAiB,MAAM,IAAK,MAAA,CAAO,QAAA,IAAY,EAAC,GAAK;AAAC,GACxD;AACA,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,QAAA,EAAS;AACnC;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { FIX } from '../../../domain/output-fixes.mjs';
|
|
2
2
|
|
|
3
3
|
const PRESENCE_KEYWORDS = /* @__PURE__ */ new Set([
|
|
4
4
|
"$comment",
|
|
@@ -39,7 +39,7 @@ function memberSchema(member, request) {
|
|
|
39
39
|
}
|
|
40
40
|
function allOfMembers(members, request) {
|
|
41
41
|
const unchanged = { members, required: [] };
|
|
42
|
-
if (!request.context.options.fixes.has(
|
|
42
|
+
if (!request.context.options.fixes.has(FIX.ALLOF_REQUIRED)) {
|
|
43
43
|
return unchanged;
|
|
44
44
|
}
|
|
45
45
|
const schemas = members.map((member) => memberSchema(member, request));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presence-members.mjs","sources":["../../../../src/application/transform/schema/presence-members.ts"],"sourcesContent":["import type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport {
|
|
1
|
+
{"version":3,"file":"presence-members.mjs","sources":["../../../../src/application/transform/schema/presence-members.ts"],"sourcesContent":["import type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { FIX } from \"../../../domain/output-fixes.js\";\nimport type { SchemaRequest } from \"./schema-rule.js\";\n\n/**\n * The `allof-required` fix (ADR-021, roadmap R6). An `allOf` member such as `{ required: [name] }`\n * or `{ type: object }` says nothing about the shape of the object; it only asks that keys are\n * present. Typed as an object of its own, it adds `& Record<string, never>` or `& unknown`. With\n * the fix, such members are left out and their keys are made required in the other members, the\n * same way the parent's `required` is (upstream #1474, #1520, #2165).\n */\n\n/**\n * Keywords that do not change the shape: `type: object`, `required`, and annotations that the\n * generator does not read on an `allOf` member. `default`, `readOnly` and `writeOnly` are left out:\n * they change types elsewhere.\n */\nconst PRESENCE_KEYWORDS: ReadonlySet<string> = new Set([\n \"$comment\",\n \"deprecated\",\n \"description\",\n \"example\",\n \"examples\",\n \"required\",\n \"title\",\n \"type\",\n]);\n\nconst EXTENSION_PREFIX = \"x-\";\nconst OBJECT_TYPE = \"object\";\n\nfunction isStringList(value: unknown): value is readonly string[] {\n return Array.isArray(value) && value.every((entry) => typeof entry === \"string\");\n}\n\nfunction isPresenceKeyword([key, value]: readonly [string, unknown]): boolean {\n if (key === \"type\") {\n return value === OBJECT_TYPE;\n }\n if (key === \"required\") {\n return isStringList(value);\n }\n return PRESENCE_KEYWORDS.has(key) || key.startsWith(EXTENSION_PREFIX);\n}\n\nfunction isPresenceObject(schema: unknown): schema is SchemaObject {\n return (\n typeof schema === \"object\" &&\n schema !== null &&\n !Array.isArray(schema) &&\n !(\"$ref\" in schema) &&\n Object.entries(schema).every(isPresenceKeyword)\n );\n}\n\n/**\n * The schema a member stands for: itself, or the target of a `$ref` with no sibling keywords. The\n * discriminator scan has already added the discriminator property to a mapped target, so such a\n * target is never presence-only.\n */\nfunction memberSchema(member: Schema, request: SchemaRequest): unknown {\n if (typeof member !== \"object\" || member === null || !(\"$ref\" in member)) {\n return member;\n }\n const ref = (member as { readonly $ref: unknown }).$ref;\n if (typeof ref !== \"string\" || Object.keys(member).length !== 1) {\n return undefined;\n }\n return request.context.refs.resolve(ref);\n}\n\n/** The `allOf` members to type, and the keys the left-out members make required. */\nexport interface AllOfMembers {\n readonly members: readonly Schema[];\n readonly required: readonly string[];\n}\n\n/**\n * The members of `allOf` with presence-only ones left out, when the fix is on and another member\n * is left to carry the keys; otherwise the members as they are.\n */\nexport function allOfMembers(members: readonly Schema[], request: SchemaRequest): AllOfMembers {\n const unchanged = { members, required: [] };\n if (!request.context.options.fixes.has(FIX.ALLOF_REQUIRED)) {\n return unchanged;\n }\n const schemas = members.map((member) => memberSchema(member, request));\n const kept = members.filter((_, index) => !isPresenceObject(schemas[index]));\n if (kept.length === 0 || kept.length === members.length) {\n return unchanged;\n }\n const required = schemas.flatMap((schema) =>\n isPresenceObject(schema) ? (schema.required ?? []) : [],\n );\n return { members: kept, required };\n}\n"],"names":[],"mappings":";;AAiBA,MAAM,iBAAA,uBAA6C,GAAA,CAAI;AAAA,EACrD,UAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,MAAM,gBAAA,GAAmB,IAAA;AACzB,MAAM,WAAA,GAAc,QAAA;AAEpB,SAAS,aAAa,KAAA,EAA4C;AAChE,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,KAAA,CAAM,MAAM,CAAC,KAAA,KAAU,OAAO,KAAA,KAAU,QAAQ,CAAA;AACjF;AAEA,SAAS,iBAAA,CAAkB,CAAC,GAAA,EAAK,KAAK,CAAA,EAAwC;AAC5E,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,OAAO,KAAA,KAAU,WAAA;AAAA,EACnB;AACA,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,OAAO,aAAa,KAAK,CAAA;AAAA,EAC3B;AACA,EAAA,OAAO,kBAAkB,GAAA,CAAI,GAAG,CAAA,IAAK,GAAA,CAAI,WAAW,gBAAgB,CAAA;AACtE;AAEA,SAAS,iBAAiB,MAAA,EAAyC;AACjE,EAAA,OACE,OAAO,MAAA,KAAW,QAAA,IAClB,WAAW,IAAA,IACX,CAAC,MAAM,OAAA,CAAQ,MAAM,CAAA,IACrB,EAAE,UAAU,MAAA,CAAA,IACZ,MAAA,CAAO,QAAQ,MAAM,CAAA,CAAE,MAAM,iBAAiB,CAAA;AAElD;AAOA,SAAS,YAAA,CAAa,QAAgB,OAAA,EAAiC;AACrE,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,WAAW,IAAA,IAAQ,EAAE,UAAU,MAAA,CAAA,EAAS;AACxE,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAO,MAAA,CAAsC,IAAA;AACnD,EAAA,IAAI,OAAO,QAAQ,QAAA,IAAY,MAAA,CAAO,KAAK,MAAM,CAAA,CAAE,WAAW,CAAA,EAAG;AAC/D,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AACzC;AAYO,SAAS,YAAA,CAAa,SAA4B,OAAA,EAAsC;AAC7F,EAAA,MAAM,SAAA,GAAY,EAAE,OAAA,EAAS,QAAA,EAAU,EAAC,EAAE;AAC1C,EAAA,IAAI,CAAC,QAAQ,OAAA,CAAQ,OAAA,CAAQ,MAAM,GAAA,CAAI,GAAA,CAAI,cAAc,CAAA,EAAG;AAC1D,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,QAAQ,GAAA,CAAI,CAAC,WAAW,YAAA,CAAa,MAAA,EAAQ,OAAO,CAAC,CAAA;AACrE,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,KAAA,KAAU,CAAC,gBAAA,CAAiB,OAAA,CAAQ,KAAK,CAAC,CAAC,CAAA;AAC3E,EAAA,IAAI,KAAK,MAAA,KAAW,CAAA,IAAK,IAAA,CAAK,MAAA,KAAW,QAAQ,MAAA,EAAQ;AACvD,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAW,OAAA,CAAQ,OAAA;AAAA,IAAQ,CAAC,WAChC,gBAAA,CAAiB,MAAM,IAAK,MAAA,CAAO,QAAA,IAAY,EAAC,GAAK;AAAC,GACxD;AACA,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,QAAA,EAAS;AACnC;;"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const schemaDialect = require('../../../domain/openapi/schema-dialect.cjs');
|
|
4
|
+
const outputFixes = require('../../../domain/output-fixes.cjs');
|
|
5
|
+
|
|
6
|
+
const ANNOTATION_KEYWORDS = /* @__PURE__ */ new Set([
|
|
7
|
+
"$anchor",
|
|
8
|
+
"$comment",
|
|
9
|
+
"$defs",
|
|
10
|
+
"$dynamicAnchor",
|
|
11
|
+
"$id",
|
|
12
|
+
"$ref",
|
|
13
|
+
"$schema",
|
|
14
|
+
"contentEncoding",
|
|
15
|
+
"contentMediaType",
|
|
16
|
+
"default",
|
|
17
|
+
"deprecated",
|
|
18
|
+
"description",
|
|
19
|
+
"discriminator",
|
|
20
|
+
"example",
|
|
21
|
+
"examples",
|
|
22
|
+
"externalDocs",
|
|
23
|
+
"format",
|
|
24
|
+
"readOnly",
|
|
25
|
+
"title",
|
|
26
|
+
"writeOnly",
|
|
27
|
+
"xml"
|
|
28
|
+
]);
|
|
29
|
+
const EXTENSION_PREFIX = "x-";
|
|
30
|
+
function hasRef(schema) {
|
|
31
|
+
return typeof schema.$ref === "string";
|
|
32
|
+
}
|
|
33
|
+
function isTypeKeyword(keyword) {
|
|
34
|
+
return !ANNOTATION_KEYWORDS.has(keyword) && !keyword.startsWith(EXTENSION_PREFIX);
|
|
35
|
+
}
|
|
36
|
+
function refWithSiblingsAsAllOf(schema, options) {
|
|
37
|
+
const isApplied = options.fixes.has(outputFixes.FIX.REF_SIBLINGS) && options.schemaDialect === schemaDialect.SCHEMA_DIALECTS.JSON_SCHEMA_2020_12;
|
|
38
|
+
if (!isApplied || !hasRef(schema) || !Object.keys(schema).some(isTypeKeyword)) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
const { $ref, allOf = [], ...siblings } = schema;
|
|
42
|
+
const members = [{ $ref }, ...allOf];
|
|
43
|
+
return { ...siblings, allOf: members };
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
exports.refWithSiblingsAsAllOf = refWithSiblingsAsAllOf;
|
|
47
|
+
//# sourceMappingURL=ref-siblings.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ref-siblings.cjs","sources":["../../../../src/application/transform/schema/ref-siblings.ts"],"sourcesContent":["import { SCHEMA_DIALECTS } from \"../../../domain/openapi/schema-dialect.js\";\nimport type {\n ReferenceSchema,\n Schema,\n SchemaObject,\n} from \"../../../domain/openapi/schema-object.js\";\nimport { FIX } from \"../../../domain/output-fixes.js\";\nimport type { SchemaOptions } from \"./schema-context.js\";\n\n/**\n * The `ref-siblings` fix (ADR-021 amendment 2, RC4 G16): in JSON Schema 2020-12 (OpenAPI 3.1 and\n * 3.2) the keywords next to a `$ref` apply too, so `{ $ref: Base, required: [extra], properties:\n * { extra } }` is a `Base` that also has a required `extra`. That is what `allOf: [{ $ref: Base }]`\n * next to the same keywords means, so the schema is typed as that `allOf`, with every rule the\n * generator has for `allOf` and its siblings (`WithRequired`, intersections).\n */\n\n/**\n * Keywords that only annotate (JSON Schema 2020-12 meta-data, format-annotation and content\n * vocabularies, OpenAPI fixed fields), or that change no type on their own (`discriminator`\n * without `oneOf`). Next to a `$ref` they stay where they were, so the output keeps the plain\n * reference with its comment. Extension keywords (`x-…`) count as annotations too.\n */\nconst ANNOTATION_KEYWORDS: ReadonlySet<string> = new Set([\n \"$anchor\",\n \"$comment\",\n \"$defs\",\n \"$dynamicAnchor\",\n \"$id\",\n \"$ref\",\n \"$schema\",\n \"contentEncoding\",\n \"contentMediaType\",\n \"default\",\n \"deprecated\",\n \"description\",\n \"discriminator\",\n \"example\",\n \"examples\",\n \"externalDocs\",\n \"format\",\n \"readOnly\",\n \"title\",\n \"writeOnly\",\n \"xml\",\n]);\n\nconst EXTENSION_PREFIX = \"x-\";\n\nfunction hasRef(schema: SchemaObject): schema is SchemaObject & ReferenceSchema {\n return typeof (schema as Partial<ReferenceSchema>).$ref === \"string\";\n}\n\nfunction isTypeKeyword(keyword: string): boolean {\n return !ANNOTATION_KEYWORDS.has(keyword) && !keyword.startsWith(EXTENSION_PREFIX);\n}\n\n/**\n * A `$ref` schema as the `allOf` it means, or null where nothing changes: a schema without `$ref`,\n * no fix, an OpenAPI 3.0 document, or no sibling that changes the type. The result has no\n * `$ref`, so the shape rules type it as `enum`, `const` or a composition.\n */\nexport function refWithSiblingsAsAllOf(\n schema: SchemaObject,\n options: SchemaOptions,\n): SchemaObject | null {\n const isApplied =\n options.fixes.has(FIX.REF_SIBLINGS) &&\n options.schemaDialect === SCHEMA_DIALECTS.JSON_SCHEMA_2020_12;\n if (!isApplied || !hasRef(schema) || !Object.keys(schema).some(isTypeKeyword)) {\n return null;\n }\n const { $ref, allOf = [], ...siblings } = schema;\n const members: readonly Schema[] = [{ $ref }, ...allOf];\n return { ...siblings, allOf: members };\n}\n"],"names":["FIX","SCHEMA_DIALECTS"],"mappings":";;;;;AAuBA,MAAM,mBAAA,uBAA+C,GAAA,CAAI;AAAA,EACvD,SAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,gBAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,iBAAA;AAAA,EACA,kBAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,MAAM,gBAAA,GAAmB,IAAA;AAEzB,SAAS,OAAO,MAAA,EAAgE;AAC9E,EAAA,OAAO,OAAQ,OAAoC,IAAA,KAAS,QAAA;AAC9D;AAEA,SAAS,cAAc,OAAA,EAA0B;AAC/C,EAAA,OAAO,CAAC,oBAAoB,GAAA,CAAI,OAAO,KAAK,CAAC,OAAA,CAAQ,WAAW,gBAAgB,CAAA;AAClF;AAOO,SAAS,sBAAA,CACd,QACA,OAAA,EACqB;AACrB,EAAA,MAAM,SAAA,GACJ,QAAQ,KAAA,CAAM,GAAA,CAAIA,gBAAI,YAAY,CAAA,IAClC,OAAA,CAAQ,aAAA,KAAkBC,6BAAA,CAAgB,mBAAA;AAC5C,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,MAAA,CAAO,MAAM,CAAA,IAAK,CAAC,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,IAAA,CAAK,aAAa,CAAA,EAAG;AAC7E,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,GAAQ,EAAC,EAAG,GAAG,UAAS,GAAI,MAAA;AAC1C,EAAA,MAAM,UAA6B,CAAC,EAAE,IAAA,EAAK,EAAG,GAAG,KAAK,CAAA;AACtD,EAAA,OAAO,EAAE,GAAG,QAAA,EAAU,KAAA,EAAO,OAAA,EAAQ;AACvC;;"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { SCHEMA_DIALECTS } from '../../../domain/openapi/schema-dialect.mjs';
|
|
2
|
+
import { FIX } from '../../../domain/output-fixes.mjs';
|
|
3
|
+
|
|
4
|
+
const ANNOTATION_KEYWORDS = /* @__PURE__ */ new Set([
|
|
5
|
+
"$anchor",
|
|
6
|
+
"$comment",
|
|
7
|
+
"$defs",
|
|
8
|
+
"$dynamicAnchor",
|
|
9
|
+
"$id",
|
|
10
|
+
"$ref",
|
|
11
|
+
"$schema",
|
|
12
|
+
"contentEncoding",
|
|
13
|
+
"contentMediaType",
|
|
14
|
+
"default",
|
|
15
|
+
"deprecated",
|
|
16
|
+
"description",
|
|
17
|
+
"discriminator",
|
|
18
|
+
"example",
|
|
19
|
+
"examples",
|
|
20
|
+
"externalDocs",
|
|
21
|
+
"format",
|
|
22
|
+
"readOnly",
|
|
23
|
+
"title",
|
|
24
|
+
"writeOnly",
|
|
25
|
+
"xml"
|
|
26
|
+
]);
|
|
27
|
+
const EXTENSION_PREFIX = "x-";
|
|
28
|
+
function hasRef(schema) {
|
|
29
|
+
return typeof schema.$ref === "string";
|
|
30
|
+
}
|
|
31
|
+
function isTypeKeyword(keyword) {
|
|
32
|
+
return !ANNOTATION_KEYWORDS.has(keyword) && !keyword.startsWith(EXTENSION_PREFIX);
|
|
33
|
+
}
|
|
34
|
+
function refWithSiblingsAsAllOf(schema, options) {
|
|
35
|
+
const isApplied = options.fixes.has(FIX.REF_SIBLINGS) && options.schemaDialect === SCHEMA_DIALECTS.JSON_SCHEMA_2020_12;
|
|
36
|
+
if (!isApplied || !hasRef(schema) || !Object.keys(schema).some(isTypeKeyword)) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
const { $ref, allOf = [], ...siblings } = schema;
|
|
40
|
+
const members = [{ $ref }, ...allOf];
|
|
41
|
+
return { ...siblings, allOf: members };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export { refWithSiblingsAsAllOf };
|
|
45
|
+
//# sourceMappingURL=ref-siblings.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ref-siblings.mjs","sources":["../../../../src/application/transform/schema/ref-siblings.ts"],"sourcesContent":["import { SCHEMA_DIALECTS } from \"../../../domain/openapi/schema-dialect.js\";\nimport type {\n ReferenceSchema,\n Schema,\n SchemaObject,\n} from \"../../../domain/openapi/schema-object.js\";\nimport { FIX } from \"../../../domain/output-fixes.js\";\nimport type { SchemaOptions } from \"./schema-context.js\";\n\n/**\n * The `ref-siblings` fix (ADR-021 amendment 2, RC4 G16): in JSON Schema 2020-12 (OpenAPI 3.1 and\n * 3.2) the keywords next to a `$ref` apply too, so `{ $ref: Base, required: [extra], properties:\n * { extra } }` is a `Base` that also has a required `extra`. That is what `allOf: [{ $ref: Base }]`\n * next to the same keywords means, so the schema is typed as that `allOf`, with every rule the\n * generator has for `allOf` and its siblings (`WithRequired`, intersections).\n */\n\n/**\n * Keywords that only annotate (JSON Schema 2020-12 meta-data, format-annotation and content\n * vocabularies, OpenAPI fixed fields), or that change no type on their own (`discriminator`\n * without `oneOf`). Next to a `$ref` they stay where they were, so the output keeps the plain\n * reference with its comment. Extension keywords (`x-…`) count as annotations too.\n */\nconst ANNOTATION_KEYWORDS: ReadonlySet<string> = new Set([\n \"$anchor\",\n \"$comment\",\n \"$defs\",\n \"$dynamicAnchor\",\n \"$id\",\n \"$ref\",\n \"$schema\",\n \"contentEncoding\",\n \"contentMediaType\",\n \"default\",\n \"deprecated\",\n \"description\",\n \"discriminator\",\n \"example\",\n \"examples\",\n \"externalDocs\",\n \"format\",\n \"readOnly\",\n \"title\",\n \"writeOnly\",\n \"xml\",\n]);\n\nconst EXTENSION_PREFIX = \"x-\";\n\nfunction hasRef(schema: SchemaObject): schema is SchemaObject & ReferenceSchema {\n return typeof (schema as Partial<ReferenceSchema>).$ref === \"string\";\n}\n\nfunction isTypeKeyword(keyword: string): boolean {\n return !ANNOTATION_KEYWORDS.has(keyword) && !keyword.startsWith(EXTENSION_PREFIX);\n}\n\n/**\n * A `$ref` schema as the `allOf` it means, or null where nothing changes: a schema without `$ref`,\n * no fix, an OpenAPI 3.0 document, or no sibling that changes the type. The result has no\n * `$ref`, so the shape rules type it as `enum`, `const` or a composition.\n */\nexport function refWithSiblingsAsAllOf(\n schema: SchemaObject,\n options: SchemaOptions,\n): SchemaObject | null {\n const isApplied =\n options.fixes.has(FIX.REF_SIBLINGS) &&\n options.schemaDialect === SCHEMA_DIALECTS.JSON_SCHEMA_2020_12;\n if (!isApplied || !hasRef(schema) || !Object.keys(schema).some(isTypeKeyword)) {\n return null;\n }\n const { $ref, allOf = [], ...siblings } = schema;\n const members: readonly Schema[] = [{ $ref }, ...allOf];\n return { ...siblings, allOf: members };\n}\n"],"names":[],"mappings":";;;AAuBA,MAAM,mBAAA,uBAA+C,GAAA,CAAI;AAAA,EACvD,SAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,gBAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,iBAAA;AAAA,EACA,kBAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,MAAM,gBAAA,GAAmB,IAAA;AAEzB,SAAS,OAAO,MAAA,EAAgE;AAC9E,EAAA,OAAO,OAAQ,OAAoC,IAAA,KAAS,QAAA;AAC9D;AAEA,SAAS,cAAc,OAAA,EAA0B;AAC/C,EAAA,OAAO,CAAC,oBAAoB,GAAA,CAAI,OAAO,KAAK,CAAC,OAAA,CAAQ,WAAW,gBAAgB,CAAA;AAClF;AAOO,SAAS,sBAAA,CACd,QACA,OAAA,EACqB;AACrB,EAAA,MAAM,SAAA,GACJ,QAAQ,KAAA,CAAM,GAAA,CAAI,IAAI,YAAY,CAAA,IAClC,OAAA,CAAQ,aAAA,KAAkB,eAAA,CAAgB,mBAAA;AAC5C,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,MAAA,CAAO,MAAM,CAAA,IAAK,CAAC,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,IAAA,CAAK,aAAa,CAAA,EAAG;AAC7E,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,GAAQ,EAAC,EAAG,GAAG,UAAS,GAAI,MAAA;AAC1C,EAAA,MAAM,UAA6B,CAAC,EAAE,IAAA,EAAK,EAAG,GAAG,KAAK,CAAA;AACtD,EAAA,OAAO,EAAE,GAAG,QAAA,EAAU,KAAA,EAAO,OAAA,EAAQ;AACvC;;"}
|
|
@@ -23,10 +23,10 @@ function requiredKeyLists(schema, variants, request) {
|
|
|
23
23
|
return isApplicable ? keyLists : null;
|
|
24
24
|
}
|
|
25
25
|
function hasRequiredVariants(schema, variants, request) {
|
|
26
|
-
return request.context.options.fixes.has(outputFixes.
|
|
26
|
+
return request.context.options.fixes.has(outputFixes.FIX.ANYOF_ONEOF_REQUIRED) && isObjectTyped(schema) && requiredKeyLists(schema, variants, request) !== null;
|
|
27
27
|
}
|
|
28
28
|
function requiredVariantsType(previous, schema, variants, request) {
|
|
29
|
-
if (!request.context.options.fixes.has(outputFixes.
|
|
29
|
+
if (!request.context.options.fixes.has(outputFixes.FIX.ANYOF_ONEOF_REQUIRED) || previous === null) {
|
|
30
30
|
return null;
|
|
31
31
|
}
|
|
32
32
|
const keyLists = isObjectTyped(schema) ? requiredKeyLists(schema, variants, request) : null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"required-variants.cjs","sources":["../../../../src/application/transform/schema/required-variants.ts"],"sourcesContent":["import type { IrType } from \"../../../domain/ir/nodes.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport {
|
|
1
|
+
{"version":3,"file":"required-variants.cjs","sources":["../../../../src/application/transform/schema/required-variants.ts"],"sourcesContent":["import type { IrType } from \"../../../domain/ir/nodes.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { FIX } from \"../../../domain/output-fixes.js\";\nimport { unionOf, withRequiredKeys } from \"../type-combinators.js\";\nimport { isKeptProperty } from \"./object-type.js\";\nimport type { SchemaRequest } from \"./schema-rule.js\";\n\n/**\n * The `anyof-oneof-required` fix. `anyOf: [{ required: [a] }, { required: [b] }]` next to\n * `properties` says which of the properties must be there. Each such variant has no type of its\n * own (`unknown`), so the original gives `Props | unknown`, which is `unknown`. With the fix each\n * variant is the parent with its keys required:\n * `WithRequired<Props, \"a\"> | WithRequired<Props, \"b\">`.\n */\n\n/** Keywords that do not change a value's type: a variant of these and `required` counts. */\nconst ANNOTATION_KEYS: ReadonlySet<string> = new Set([\"required\", \"description\", \"title\"]);\n\n/** The `required` keys of a variant that has nothing else, or null for any other variant. */\nfunction requiredOnlyKeys(variant: Schema): readonly string[] | null {\n if (typeof variant !== \"object\" || variant === null || \"$ref\" in variant) {\n return null;\n }\n const { required } = variant as SchemaObject;\n const isRequiredOnly = Object.keys(variant).every((key) => ANNOTATION_KEYS.has(key));\n return isRequiredOnly && Array.isArray(required) && required.length > 0 ? required : null;\n}\n\n/** Whether the schema's type is an object: no `type`, `object`, or a list with `object`. */\nfunction isObjectTyped(schema: SchemaObject): boolean {\n const { type } = schema;\n return (\n type === undefined || type === \"object\" || (Array.isArray(type) && type.includes(\"object\"))\n );\n}\n\n/** The variants' key lists, or null unless each requires only properties the type keeps. */\nfunction requiredKeyLists(\n schema: SchemaObject,\n variants: readonly Schema[],\n request: SchemaRequest,\n): (readonly string[])[] | null {\n const keyLists = variants.map(requiredOnlyKeys);\n // A key of a property the type leaves out (`--exclude-deprecated`) is no key of `WithRequired`.\n const isApplicable =\n keyLists.length > 0 &&\n keyLists.every((keys) => keys?.every((key) => isKeptProperty(schema, key, request)) === true);\n return isApplicable ? (keyLists as (readonly string[])[]) : null;\n}\n\n/** Whether the fix gives `variants` of the schema their keys of its properties. */\nexport function hasRequiredVariants(\n schema: SchemaObject,\n variants: readonly Schema[],\n request: SchemaRequest,\n): boolean {\n return (\n request.context.options.fixes.has(FIX.ANYOF_ONEOF_REQUIRED) &&\n isObjectTyped(schema) &&\n requiredKeyLists(schema, variants, request) !== null\n );\n}\n\n/**\n * The union of the parent type with each variant's keys required, or null where the fix is off\n * or the variants are not all required-only ones over the parent's own, kept properties. Only an\n * object has the keys. For a `type` list, the `object` member has required them already\n * (`multipleTypes`), so the list is the whole type.\n */\nexport function requiredVariantsType(\n previous: IrType | null,\n schema: SchemaObject,\n variants: readonly Schema[],\n request: SchemaRequest,\n): IrType | null {\n if (!request.context.options.fixes.has(FIX.ANYOF_ONEOF_REQUIRED) || previous === null) {\n return null;\n }\n const keyLists = isObjectTyped(schema) ? requiredKeyLists(schema, variants, request) : null;\n if (keyLists === null) {\n return null;\n }\n if (Array.isArray(schema.type)) {\n return previous;\n }\n request.context.footer.requireWithRequired();\n return unionOf(keyLists.map((keys) => withRequiredKeys(previous, keys)));\n}\n"],"names":["isKeptProperty","FIX","unionOf","withRequiredKeys"],"mappings":";;;;;;AAgBA,MAAM,kCAAuC,IAAI,GAAA,CAAI,CAAC,UAAA,EAAY,aAAA,EAAe,OAAO,CAAC,CAAA;AAGzF,SAAS,iBAAiB,OAAA,EAA2C;AACnE,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,IAAA,IAAQ,UAAU,OAAA,EAAS;AACxE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,EAAE,UAAS,GAAI,OAAA;AACrB,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAC,CAAA;AACnF,EAAA,OAAO,cAAA,IAAkB,MAAM,OAAA,CAAQ,QAAQ,KAAK,QAAA,CAAS,MAAA,GAAS,IAAI,QAAA,GAAW,IAAA;AACvF;AAGA,SAAS,cAAc,MAAA,EAA+B;AACpD,EAAA,MAAM,EAAE,MAAK,GAAI,MAAA;AACjB,EAAA,OACE,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,QAAA,IAAa,KAAA,CAAM,QAAQ,IAAI,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAE7F;AAGA,SAAS,gBAAA,CACP,MAAA,EACA,QAAA,EACA,OAAA,EAC8B;AAC9B,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,gBAAgB,CAAA;AAE9C,EAAA,MAAM,eACJ,QAAA,CAAS,MAAA,GAAS,KAClB,QAAA,CAAS,KAAA,CAAM,CAAC,IAAA,KAAS,IAAA,EAAM,KAAA,CAAM,CAAC,QAAQA,yBAAA,CAAe,MAAA,EAAQ,KAAK,OAAO,CAAC,MAAM,IAAI,CAAA;AAC9F,EAAA,OAAO,eAAgB,QAAA,GAAqC,IAAA;AAC9D;AAGO,SAAS,mBAAA,CACd,MAAA,EACA,QAAA,EACA,OAAA,EACS;AACT,EAAA,OACE,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,IAAIC,eAAA,CAAI,oBAAoB,CAAA,IAC1D,aAAA,CAAc,MAAM,CAAA,IACpB,gBAAA,CAAiB,MAAA,EAAQ,QAAA,EAAU,OAAO,CAAA,KAAM,IAAA;AAEpD;AAQO,SAAS,oBAAA,CACd,QAAA,EACA,MAAA,EACA,QAAA,EACA,OAAA,EACe;AACf,EAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,IAAIA,eAAA,CAAI,oBAAoB,CAAA,IAAK,QAAA,KAAa,IAAA,EAAM;AACrF,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,QAAA,GAAW,cAAc,MAAM,CAAA,GAAI,iBAAiB,MAAA,EAAQ,QAAA,EAAU,OAAO,CAAA,GAAI,IAAA;AACvF,EAAA,IAAI,aAAa,IAAA,EAAM;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,EAAG;AAC9B,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,OAAA,CAAQ,OAAA,CAAQ,OAAO,mBAAA,EAAoB;AAC3C,EAAA,OAAOC,uBAAA,CAAQ,SAAS,GAAA,CAAI,CAAC,SAASC,gCAAA,CAAiB,QAAA,EAAU,IAAI,CAAC,CAAC,CAAA;AACzE;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { FIX } from '../../../domain/output-fixes.mjs';
|
|
2
2
|
import { unionOf, withRequiredKeys } from '../type-combinators.mjs';
|
|
3
3
|
import { isKeptProperty } from './object-type.mjs';
|
|
4
4
|
|
|
@@ -21,10 +21,10 @@ function requiredKeyLists(schema, variants, request) {
|
|
|
21
21
|
return isApplicable ? keyLists : null;
|
|
22
22
|
}
|
|
23
23
|
function hasRequiredVariants(schema, variants, request) {
|
|
24
|
-
return request.context.options.fixes.has(
|
|
24
|
+
return request.context.options.fixes.has(FIX.ANYOF_ONEOF_REQUIRED) && isObjectTyped(schema) && requiredKeyLists(schema, variants, request) !== null;
|
|
25
25
|
}
|
|
26
26
|
function requiredVariantsType(previous, schema, variants, request) {
|
|
27
|
-
if (!request.context.options.fixes.has(
|
|
27
|
+
if (!request.context.options.fixes.has(FIX.ANYOF_ONEOF_REQUIRED) || previous === null) {
|
|
28
28
|
return null;
|
|
29
29
|
}
|
|
30
30
|
const keyLists = isObjectTyped(schema) ? requiredKeyLists(schema, variants, request) : null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"required-variants.mjs","sources":["../../../../src/application/transform/schema/required-variants.ts"],"sourcesContent":["import type { IrType } from \"../../../domain/ir/nodes.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport {
|
|
1
|
+
{"version":3,"file":"required-variants.mjs","sources":["../../../../src/application/transform/schema/required-variants.ts"],"sourcesContent":["import type { IrType } from \"../../../domain/ir/nodes.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { FIX } from \"../../../domain/output-fixes.js\";\nimport { unionOf, withRequiredKeys } from \"../type-combinators.js\";\nimport { isKeptProperty } from \"./object-type.js\";\nimport type { SchemaRequest } from \"./schema-rule.js\";\n\n/**\n * The `anyof-oneof-required` fix. `anyOf: [{ required: [a] }, { required: [b] }]` next to\n * `properties` says which of the properties must be there. Each such variant has no type of its\n * own (`unknown`), so the original gives `Props | unknown`, which is `unknown`. With the fix each\n * variant is the parent with its keys required:\n * `WithRequired<Props, \"a\"> | WithRequired<Props, \"b\">`.\n */\n\n/** Keywords that do not change a value's type: a variant of these and `required` counts. */\nconst ANNOTATION_KEYS: ReadonlySet<string> = new Set([\"required\", \"description\", \"title\"]);\n\n/** The `required` keys of a variant that has nothing else, or null for any other variant. */\nfunction requiredOnlyKeys(variant: Schema): readonly string[] | null {\n if (typeof variant !== \"object\" || variant === null || \"$ref\" in variant) {\n return null;\n }\n const { required } = variant as SchemaObject;\n const isRequiredOnly = Object.keys(variant).every((key) => ANNOTATION_KEYS.has(key));\n return isRequiredOnly && Array.isArray(required) && required.length > 0 ? required : null;\n}\n\n/** Whether the schema's type is an object: no `type`, `object`, or a list with `object`. */\nfunction isObjectTyped(schema: SchemaObject): boolean {\n const { type } = schema;\n return (\n type === undefined || type === \"object\" || (Array.isArray(type) && type.includes(\"object\"))\n );\n}\n\n/** The variants' key lists, or null unless each requires only properties the type keeps. */\nfunction requiredKeyLists(\n schema: SchemaObject,\n variants: readonly Schema[],\n request: SchemaRequest,\n): (readonly string[])[] | null {\n const keyLists = variants.map(requiredOnlyKeys);\n // A key of a property the type leaves out (`--exclude-deprecated`) is no key of `WithRequired`.\n const isApplicable =\n keyLists.length > 0 &&\n keyLists.every((keys) => keys?.every((key) => isKeptProperty(schema, key, request)) === true);\n return isApplicable ? (keyLists as (readonly string[])[]) : null;\n}\n\n/** Whether the fix gives `variants` of the schema their keys of its properties. */\nexport function hasRequiredVariants(\n schema: SchemaObject,\n variants: readonly Schema[],\n request: SchemaRequest,\n): boolean {\n return (\n request.context.options.fixes.has(FIX.ANYOF_ONEOF_REQUIRED) &&\n isObjectTyped(schema) &&\n requiredKeyLists(schema, variants, request) !== null\n );\n}\n\n/**\n * The union of the parent type with each variant's keys required, or null where the fix is off\n * or the variants are not all required-only ones over the parent's own, kept properties. Only an\n * object has the keys. For a `type` list, the `object` member has required them already\n * (`multipleTypes`), so the list is the whole type.\n */\nexport function requiredVariantsType(\n previous: IrType | null,\n schema: SchemaObject,\n variants: readonly Schema[],\n request: SchemaRequest,\n): IrType | null {\n if (!request.context.options.fixes.has(FIX.ANYOF_ONEOF_REQUIRED) || previous === null) {\n return null;\n }\n const keyLists = isObjectTyped(schema) ? requiredKeyLists(schema, variants, request) : null;\n if (keyLists === null) {\n return null;\n }\n if (Array.isArray(schema.type)) {\n return previous;\n }\n request.context.footer.requireWithRequired();\n return unionOf(keyLists.map((keys) => withRequiredKeys(previous, keys)));\n}\n"],"names":[],"mappings":";;;;AAgBA,MAAM,kCAAuC,IAAI,GAAA,CAAI,CAAC,UAAA,EAAY,aAAA,EAAe,OAAO,CAAC,CAAA;AAGzF,SAAS,iBAAiB,OAAA,EAA2C;AACnE,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,IAAA,IAAQ,UAAU,OAAA,EAAS;AACxE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,EAAE,UAAS,GAAI,OAAA;AACrB,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAC,CAAA;AACnF,EAAA,OAAO,cAAA,IAAkB,MAAM,OAAA,CAAQ,QAAQ,KAAK,QAAA,CAAS,MAAA,GAAS,IAAI,QAAA,GAAW,IAAA;AACvF;AAGA,SAAS,cAAc,MAAA,EAA+B;AACpD,EAAA,MAAM,EAAE,MAAK,GAAI,MAAA;AACjB,EAAA,OACE,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,QAAA,IAAa,KAAA,CAAM,QAAQ,IAAI,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAE7F;AAGA,SAAS,gBAAA,CACP,MAAA,EACA,QAAA,EACA,OAAA,EAC8B;AAC9B,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,gBAAgB,CAAA;AAE9C,EAAA,MAAM,eACJ,QAAA,CAAS,MAAA,GAAS,KAClB,QAAA,CAAS,KAAA,CAAM,CAAC,IAAA,KAAS,IAAA,EAAM,KAAA,CAAM,CAAC,QAAQ,cAAA,CAAe,MAAA,EAAQ,KAAK,OAAO,CAAC,MAAM,IAAI,CAAA;AAC9F,EAAA,OAAO,eAAgB,QAAA,GAAqC,IAAA;AAC9D;AAGO,SAAS,mBAAA,CACd,MAAA,EACA,QAAA,EACA,OAAA,EACS;AACT,EAAA,OACE,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,GAAA,CAAI,oBAAoB,CAAA,IAC1D,aAAA,CAAc,MAAM,CAAA,IACpB,gBAAA,CAAiB,MAAA,EAAQ,QAAA,EAAU,OAAO,CAAA,KAAM,IAAA;AAEpD;AAQO,SAAS,oBAAA,CACd,QAAA,EACA,MAAA,EACA,QAAA,EACA,OAAA,EACe;AACf,EAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,GAAA,CAAI,oBAAoB,CAAA,IAAK,QAAA,KAAa,IAAA,EAAM;AACrF,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,QAAA,GAAW,cAAc,MAAM,CAAA,GAAI,iBAAiB,MAAA,EAAQ,QAAA,EAAU,OAAO,CAAA,GAAI,IAAA;AACvF,EAAA,IAAI,aAAa,IAAA,EAAM;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,EAAG;AAC9B,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,OAAA,CAAQ,OAAA,CAAQ,OAAO,mBAAA,EAAoB;AAC3C,EAAA,OAAO,OAAA,CAAQ,SAAS,GAAA,CAAI,CAAC,SAAS,gBAAA,CAAiB,QAAA,EAAU,IAAI,CAAC,CAAC,CAAA;AACzE;;"}
|
|
@@ -7,6 +7,7 @@ const pointerType = require('../ref-pointer/pointer-type.cjs');
|
|
|
7
7
|
const sharedTypes = require('../shared-types.cjs');
|
|
8
8
|
const compositionType = require('./composition-type.cjs');
|
|
9
9
|
const enumRule = require('./enum-rule.cjs');
|
|
10
|
+
const refSiblings = require('./ref-siblings.cjs');
|
|
10
11
|
|
|
11
12
|
class InvalidSchemaError extends errors.OpenAPITypesafeError {
|
|
12
13
|
constructor(schema, path) {
|
|
@@ -58,8 +59,9 @@ function transformSchemaShape(schema, location, context, isFromAdditionalPropert
|
|
|
58
59
|
return checked.type;
|
|
59
60
|
}
|
|
60
61
|
const current = request(location, context, isFromAdditionalProperties);
|
|
61
|
-
const
|
|
62
|
-
|
|
62
|
+
const shaped = refSiblings.refWithSiblingsAsAllOf(checked.schema, context.options) ?? checked.schema;
|
|
63
|
+
const rule = SHAPE_RULES.find((candidate) => candidate.matches(shaped));
|
|
64
|
+
return rule ? rule.transform(shaped, current) : compositionType.compositionType(shaped, current);
|
|
63
65
|
}
|
|
64
66
|
function transformSchema(schema, location, context, isFromAdditionalProperties = false) {
|
|
65
67
|
const type = transformSchemaShape(schema, location, context, isFromAdditionalProperties);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-transform.cjs","sources":["../../../../src/application/transform/schema/schema-transform.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../../../domain/errors.js\";\nimport { irKeyword } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { literalType } from \"../literal-type.js\";\nimport { schemaRefType } from \"../ref-pointer/pointer-type.js\";\nimport { UNKNOWN_TYPE } from \"../shared-types.js\";\nimport { compositionType } from \"./composition-type.js\";\nimport { enumRule } from \"./enum-rule.js\";\nimport type { SchemaContext, SchemaLocation } from \"./schema-context.js\";\nimport type { SchemaRequest, SchemaRule } from \"./schema-rule.js\";\n\nexport class InvalidSchemaError extends OpenAPITypesafeError {\n constructor(schema: unknown, path: string | undefined) {\n const received = Array.isArray(schema) ? \"Array\" : typeof schema;\n super({\n code: ERROR_CODES.SCHEMA_OBJECT_INVALID,\n message: `Expected SchemaObject, received ${received} at ${path}`,\n details: { path, received },\n });\n this.name = \"InvalidSchemaError\";\n }\n}\n\n/** Shape rules in the original precedence; composition handles everything they do not match. */\nconst SHAPE_RULES: readonly SchemaRule[] = [\n {\n name: \"$ref\",\n matches: (schema) => \"$ref\" in schema,\n transform: (schema, request) => schemaRefType((schema as { $ref: string }).$ref, request),\n },\n {\n name: \"const\",\n matches: (schema) => schema.const !== null && schema.const !== undefined,\n transform: (schema) => literalType(schema.const),\n },\n enumRule,\n];\n\n/** A schema checked for its input shape, or the type of a non-object schema. */\ntype CheckedSchema = { readonly type: IrType } | { readonly schema: SchemaObject };\n\n/** A missing schema is `never`; `true` allows anything; other non-objects are invalid. */\nfunction checkSchema(schema: unknown, path: string | undefined): CheckedSchema {\n if (!schema) {\n return { type: irKeyword(\"never\") };\n }\n if (schema === true) {\n return { type: UNKNOWN_TYPE };\n }\n if (Array.isArray(schema) || typeof schema !== \"object\") {\n throw new InvalidSchemaError(schema, path);\n }\n return { schema: schema as SchemaObject };\n}\n\nfunction request(\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties: boolean,\n): SchemaRequest {\n return {\n location,\n context,\n isFromAdditionalProperties,\n transformNested: (schema, nestedLocation, isNestedFromAdditionalProperties = false) =>\n transformSchema(schema, nestedLocation, context, isNestedFromAdditionalProperties),\n };\n}\n\n/**\n * Transform a schema without the `postTransform` callback (the original\n * `transformSchemaObjectWithComposition`). Nested schemas still get `postTransform`.\n */\nexport function transformSchemaShape(\n schema: Schema | null | undefined,\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties = false,\n): IrType {\n const checked = checkSchema(schema, location.path);\n if (\"type\" in checked) {\n return checked.type;\n }\n const current = request(location, context, isFromAdditionalProperties);\n const rule = SHAPE_RULES.find((candidate) => candidate.matches(
|
|
1
|
+
{"version":3,"file":"schema-transform.cjs","sources":["../../../../src/application/transform/schema/schema-transform.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../../../domain/errors.js\";\nimport { irKeyword } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { literalType } from \"../literal-type.js\";\nimport { schemaRefType } from \"../ref-pointer/pointer-type.js\";\nimport { UNKNOWN_TYPE } from \"../shared-types.js\";\nimport { compositionType } from \"./composition-type.js\";\nimport { enumRule } from \"./enum-rule.js\";\nimport { refWithSiblingsAsAllOf } from \"./ref-siblings.js\";\nimport type { SchemaContext, SchemaLocation } from \"./schema-context.js\";\nimport type { SchemaRequest, SchemaRule } from \"./schema-rule.js\";\n\nexport class InvalidSchemaError extends OpenAPITypesafeError {\n constructor(schema: unknown, path: string | undefined) {\n const received = Array.isArray(schema) ? \"Array\" : typeof schema;\n super({\n code: ERROR_CODES.SCHEMA_OBJECT_INVALID,\n message: `Expected SchemaObject, received ${received} at ${path}`,\n details: { path, received },\n });\n this.name = \"InvalidSchemaError\";\n }\n}\n\n/** Shape rules in the original precedence; composition handles everything they do not match. */\nconst SHAPE_RULES: readonly SchemaRule[] = [\n {\n name: \"$ref\",\n matches: (schema) => \"$ref\" in schema,\n transform: (schema, request) => schemaRefType((schema as { $ref: string }).$ref, request),\n },\n {\n name: \"const\",\n matches: (schema) => schema.const !== null && schema.const !== undefined,\n transform: (schema) => literalType(schema.const),\n },\n enumRule,\n];\n\n/** A schema checked for its input shape, or the type of a non-object schema. */\ntype CheckedSchema = { readonly type: IrType } | { readonly schema: SchemaObject };\n\n/** A missing schema is `never`; `true` allows anything; other non-objects are invalid. */\nfunction checkSchema(schema: unknown, path: string | undefined): CheckedSchema {\n if (!schema) {\n return { type: irKeyword(\"never\") };\n }\n if (schema === true) {\n return { type: UNKNOWN_TYPE };\n }\n if (Array.isArray(schema) || typeof schema !== \"object\") {\n throw new InvalidSchemaError(schema, path);\n }\n return { schema: schema as SchemaObject };\n}\n\nfunction request(\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties: boolean,\n): SchemaRequest {\n return {\n location,\n context,\n isFromAdditionalProperties,\n transformNested: (schema, nestedLocation, isNestedFromAdditionalProperties = false) =>\n transformSchema(schema, nestedLocation, context, isNestedFromAdditionalProperties),\n };\n}\n\n/**\n * Transform a schema without the `postTransform` callback (the original\n * `transformSchemaObjectWithComposition`). Nested schemas still get `postTransform`.\n */\nexport function transformSchemaShape(\n schema: Schema | null | undefined,\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties = false,\n): IrType {\n const checked = checkSchema(schema, location.path);\n if (\"type\" in checked) {\n return checked.type;\n }\n const current = request(location, context, isFromAdditionalProperties);\n const shaped = refWithSiblingsAsAllOf(checked.schema, context.options) ?? checked.schema;\n const rule = SHAPE_RULES.find((candidate) => candidate.matches(shaped));\n return rule ? rule.transform(shaped, current) : compositionType(shaped, current);\n}\n\n/** Transform a schema to IR, then apply `postTransform` (the original `transformSchemaObject`). */\nexport function transformSchema(\n schema: Schema | null | undefined,\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties = false,\n): IrType {\n const type = transformSchemaShape(schema, location, context, isFromAdditionalProperties);\n return context.callbacks.postTransform(type, location) ?? type;\n}\n"],"names":["OpenAPITypesafeError","ERROR_CODES","request","schemaRefType","literalType","enumRule","irKeyword","UNKNOWN_TYPE","refWithSiblingsAsAllOf","compositionType"],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import { schemaRefType } from '../ref-pointer/pointer-type.mjs';
|
|
|
5
5
|
import { UNKNOWN_TYPE } from '../shared-types.mjs';
|
|
6
6
|
import { compositionType } from './composition-type.mjs';
|
|
7
7
|
import { enumRule } from './enum-rule.mjs';
|
|
8
|
+
import { refWithSiblingsAsAllOf } from './ref-siblings.mjs';
|
|
8
9
|
|
|
9
10
|
class InvalidSchemaError extends OpenAPITypesafeError {
|
|
10
11
|
constructor(schema, path) {
|
|
@@ -56,8 +57,9 @@ function transformSchemaShape(schema, location, context, isFromAdditionalPropert
|
|
|
56
57
|
return checked.type;
|
|
57
58
|
}
|
|
58
59
|
const current = request(location, context, isFromAdditionalProperties);
|
|
59
|
-
const
|
|
60
|
-
|
|
60
|
+
const shaped = refWithSiblingsAsAllOf(checked.schema, context.options) ?? checked.schema;
|
|
61
|
+
const rule = SHAPE_RULES.find((candidate) => candidate.matches(shaped));
|
|
62
|
+
return rule ? rule.transform(shaped, current) : compositionType(shaped, current);
|
|
61
63
|
}
|
|
62
64
|
function transformSchema(schema, location, context, isFromAdditionalProperties = false) {
|
|
63
65
|
const type = transformSchemaShape(schema, location, context, isFromAdditionalProperties);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-transform.mjs","sources":["../../../../src/application/transform/schema/schema-transform.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../../../domain/errors.js\";\nimport { irKeyword } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { literalType } from \"../literal-type.js\";\nimport { schemaRefType } from \"../ref-pointer/pointer-type.js\";\nimport { UNKNOWN_TYPE } from \"../shared-types.js\";\nimport { compositionType } from \"./composition-type.js\";\nimport { enumRule } from \"./enum-rule.js\";\nimport type { SchemaContext, SchemaLocation } from \"./schema-context.js\";\nimport type { SchemaRequest, SchemaRule } from \"./schema-rule.js\";\n\nexport class InvalidSchemaError extends OpenAPITypesafeError {\n constructor(schema: unknown, path: string | undefined) {\n const received = Array.isArray(schema) ? \"Array\" : typeof schema;\n super({\n code: ERROR_CODES.SCHEMA_OBJECT_INVALID,\n message: `Expected SchemaObject, received ${received} at ${path}`,\n details: { path, received },\n });\n this.name = \"InvalidSchemaError\";\n }\n}\n\n/** Shape rules in the original precedence; composition handles everything they do not match. */\nconst SHAPE_RULES: readonly SchemaRule[] = [\n {\n name: \"$ref\",\n matches: (schema) => \"$ref\" in schema,\n transform: (schema, request) => schemaRefType((schema as { $ref: string }).$ref, request),\n },\n {\n name: \"const\",\n matches: (schema) => schema.const !== null && schema.const !== undefined,\n transform: (schema) => literalType(schema.const),\n },\n enumRule,\n];\n\n/** A schema checked for its input shape, or the type of a non-object schema. */\ntype CheckedSchema = { readonly type: IrType } | { readonly schema: SchemaObject };\n\n/** A missing schema is `never`; `true` allows anything; other non-objects are invalid. */\nfunction checkSchema(schema: unknown, path: string | undefined): CheckedSchema {\n if (!schema) {\n return { type: irKeyword(\"never\") };\n }\n if (schema === true) {\n return { type: UNKNOWN_TYPE };\n }\n if (Array.isArray(schema) || typeof schema !== \"object\") {\n throw new InvalidSchemaError(schema, path);\n }\n return { schema: schema as SchemaObject };\n}\n\nfunction request(\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties: boolean,\n): SchemaRequest {\n return {\n location,\n context,\n isFromAdditionalProperties,\n transformNested: (schema, nestedLocation, isNestedFromAdditionalProperties = false) =>\n transformSchema(schema, nestedLocation, context, isNestedFromAdditionalProperties),\n };\n}\n\n/**\n * Transform a schema without the `postTransform` callback (the original\n * `transformSchemaObjectWithComposition`). Nested schemas still get `postTransform`.\n */\nexport function transformSchemaShape(\n schema: Schema | null | undefined,\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties = false,\n): IrType {\n const checked = checkSchema(schema, location.path);\n if (\"type\" in checked) {\n return checked.type;\n }\n const current = request(location, context, isFromAdditionalProperties);\n const rule = SHAPE_RULES.find((candidate) => candidate.matches(
|
|
1
|
+
{"version":3,"file":"schema-transform.mjs","sources":["../../../../src/application/transform/schema/schema-transform.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../../../domain/errors.js\";\nimport { irKeyword } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { literalType } from \"../literal-type.js\";\nimport { schemaRefType } from \"../ref-pointer/pointer-type.js\";\nimport { UNKNOWN_TYPE } from \"../shared-types.js\";\nimport { compositionType } from \"./composition-type.js\";\nimport { enumRule } from \"./enum-rule.js\";\nimport { refWithSiblingsAsAllOf } from \"./ref-siblings.js\";\nimport type { SchemaContext, SchemaLocation } from \"./schema-context.js\";\nimport type { SchemaRequest, SchemaRule } from \"./schema-rule.js\";\n\nexport class InvalidSchemaError extends OpenAPITypesafeError {\n constructor(schema: unknown, path: string | undefined) {\n const received = Array.isArray(schema) ? \"Array\" : typeof schema;\n super({\n code: ERROR_CODES.SCHEMA_OBJECT_INVALID,\n message: `Expected SchemaObject, received ${received} at ${path}`,\n details: { path, received },\n });\n this.name = \"InvalidSchemaError\";\n }\n}\n\n/** Shape rules in the original precedence; composition handles everything they do not match. */\nconst SHAPE_RULES: readonly SchemaRule[] = [\n {\n name: \"$ref\",\n matches: (schema) => \"$ref\" in schema,\n transform: (schema, request) => schemaRefType((schema as { $ref: string }).$ref, request),\n },\n {\n name: \"const\",\n matches: (schema) => schema.const !== null && schema.const !== undefined,\n transform: (schema) => literalType(schema.const),\n },\n enumRule,\n];\n\n/** A schema checked for its input shape, or the type of a non-object schema. */\ntype CheckedSchema = { readonly type: IrType } | { readonly schema: SchemaObject };\n\n/** A missing schema is `never`; `true` allows anything; other non-objects are invalid. */\nfunction checkSchema(schema: unknown, path: string | undefined): CheckedSchema {\n if (!schema) {\n return { type: irKeyword(\"never\") };\n }\n if (schema === true) {\n return { type: UNKNOWN_TYPE };\n }\n if (Array.isArray(schema) || typeof schema !== \"object\") {\n throw new InvalidSchemaError(schema, path);\n }\n return { schema: schema as SchemaObject };\n}\n\nfunction request(\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties: boolean,\n): SchemaRequest {\n return {\n location,\n context,\n isFromAdditionalProperties,\n transformNested: (schema, nestedLocation, isNestedFromAdditionalProperties = false) =>\n transformSchema(schema, nestedLocation, context, isNestedFromAdditionalProperties),\n };\n}\n\n/**\n * Transform a schema without the `postTransform` callback (the original\n * `transformSchemaObjectWithComposition`). Nested schemas still get `postTransform`.\n */\nexport function transformSchemaShape(\n schema: Schema | null | undefined,\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties = false,\n): IrType {\n const checked = checkSchema(schema, location.path);\n if (\"type\" in checked) {\n return checked.type;\n }\n const current = request(location, context, isFromAdditionalProperties);\n const shaped = refWithSiblingsAsAllOf(checked.schema, context.options) ?? checked.schema;\n const rule = SHAPE_RULES.find((candidate) => candidate.matches(shaped));\n return rule ? rule.transform(shaped, current) : compositionType(shaped, current);\n}\n\n/** Transform a schema to IR, then apply `postTransform` (the original `transformSchemaObject`). */\nexport function transformSchema(\n schema: Schema | null | undefined,\n location: SchemaLocation,\n context: SchemaContext,\n isFromAdditionalProperties = false,\n): IrType {\n const type = transformSchemaShape(schema, location, context, isFromAdditionalProperties);\n return context.callbacks.postTransform(type, location) ?? type;\n}\n"],"names":["request"],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ const typeCombinators = require('../type-combinators.cjs');
|
|
|
8
8
|
|
|
9
9
|
function unevaluatedSchemaOf(schema, request) {
|
|
10
10
|
const { unevaluatedProperties } = schema;
|
|
11
|
-
if (!request.context.options.fixes.has(outputFixes.
|
|
11
|
+
if (!request.context.options.fixes.has(outputFixes.FIX.UNEVALUATED_PROPERTIES) || unevaluatedProperties === void 0 || unevaluatedProperties === false || schema.additionalProperties !== void 0) {
|
|
12
12
|
return null;
|
|
13
13
|
}
|
|
14
14
|
return schema.type === void 0 || schema.type === "object" ? unevaluatedProperties : null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unevaluated-properties.cjs","sources":["../../../../src/application/transform/schema/unevaluated-properties.ts"],"sourcesContent":["import {\n irKeyword,\n irObject,\n irReference,\n irStringIndexSignature,\n} from \"../../../domain/ir/constructors.js\";\nimport type { IrMember, IrType } from \"../../../domain/ir/nodes.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport {
|
|
1
|
+
{"version":3,"file":"unevaluated-properties.cjs","sources":["../../../../src/application/transform/schema/unevaluated-properties.ts"],"sourcesContent":["import {\n irKeyword,\n irObject,\n irReference,\n irStringIndexSignature,\n} from \"../../../domain/ir/constructors.js\";\nimport type { IrMember, IrType } from \"../../../domain/ir/nodes.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { FIX } from \"../../../domain/output-fixes.js\";\nimport { HELPER_TYPES } from \"../helper-types.js\";\nimport { UNKNOWN_TYPE } from \"../shared-types.js\";\nimport { unionOf } from \"../type-combinators.js\";\nimport type { SchemaRequest } from \"./schema-rule.js\";\n\n/**\n * The `unevaluated-properties` fix (ADR-021, roadmap R11; upstream #2839, #2880). Without it\n * `unevaluatedProperties` is ignored, so its value type is lost and an object with only that\n * keyword is `Record<string, never>`. With it the composed type is intersected with an index\n * signature, as `additionalProperties` gives: every key that no other keyword declares has the\n * `unevaluatedProperties` type. TypeScript checks that index signature against every key of a\n * value, declared ones included, so its type also holds the types of the declared properties\n * (of this schema and of its `allOf`, `anyOf` and `oneOf` members); otherwise a valid value would\n * not be assignable. `false` adds nothing, like `additionalProperties: false`: TypeScript has no\n * closed object type.\n */\n\n/**\n * Whether `unevaluatedProperties` applies. It types the keys left over at this level, so it\n * does nothing next to `additionalProperties` (which already types them all), and only an object\n * schema has keys. A `type` list is typed one listed type at a time, so its object gets it.\n */\nfunction unevaluatedSchemaOf(schema: SchemaObject, request: SchemaRequest): Schema | null {\n const { unevaluatedProperties } = schema;\n if (\n !request.context.options.fixes.has(FIX.UNEVALUATED_PROPERTIES) ||\n unevaluatedProperties === undefined ||\n unevaluatedProperties === false ||\n schema.additionalProperties !== undefined\n ) {\n return null;\n }\n return schema.type === undefined || schema.type === \"object\" ? unevaluatedProperties : null;\n}\n\nfunction isAnySchema(schema: Schema): boolean {\n return schema === true || (typeof schema === \"object\" && Object.keys(schema).length === 0);\n}\n\nfunction memberValueTypes(member: IrMember): IrType[] {\n if (member.kind === \"indexSignature\") {\n return [member.type];\n }\n return member.isOptional ? [member.type, irKeyword(\"undefined\")] : [member.type];\n}\n\n/**\n * The value types a key of the composed type can have, read from its IR: the members of object\n * types, through unions and intersections. A reference (a `$ref`, `Omit`, `WithRequired`) or a raw\n * type is read with `PropertyValues`. Primitives, literals and arrays declare no keys.\n */\nfunction declaredValueTypes(type: IrType, request: SchemaRequest): IrType[] {\n switch (type.kind) {\n case \"object\":\n return type.members.flatMap(memberValueTypes);\n case \"union\":\n case \"intersection\":\n return type.types.flatMap((member) => declaredValueTypes(member, request));\n case \"reference\":\n case \"indexedAccess\":\n case \"raw\":\n request.context.footer.requirePropertyValues();\n return [irReference(HELPER_TYPES.propertyValues.name, [type])];\n case \"keyword\":\n case \"stringLiteral\":\n case \"numberLiteral\":\n case \"booleanLiteral\":\n case \"array\":\n case \"tuple\":\n case \"readonly\":\n return [];\n }\n}\n\n/**\n * The index signature object for `unevaluatedProperties`, given the composed type of the other\n * keywords (null when there is none). Null when the fix is off or the keyword does not apply.\n */\nexport function unevaluatedPropertiesType(\n schema: SchemaObject,\n composed: IrType | null,\n request: SchemaRequest,\n): IrType | null {\n const unevaluated = unevaluatedSchemaOf(schema, request);\n if (unevaluated === null) {\n return null;\n }\n const valueTypes = isAnySchema(unevaluated)\n ? [UNKNOWN_TYPE]\n : [\n request.transformNested(unevaluated, request.location, true),\n ...(composed === null ? [] : declaredValueTypes(composed, request)),\n ];\n const { immutable } = request.context.options;\n return irObject([irStringIndexSignature(\"key\", unionOf(valueTypes), immutable)]);\n}\n"],"names":["FIX","irKeyword","irReference","HELPER_TYPES","UNKNOWN_TYPE","irObject","irStringIndexSignature","unionOf"],"mappings":";;;;;;;;AA+BA,SAAS,mBAAA,CAAoB,QAAsB,OAAA,EAAuC;AACxF,EAAA,MAAM,EAAE,uBAAsB,GAAI,MAAA;AAClC,EAAA,IACE,CAAC,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,MAAM,GAAA,CAAIA,eAAA,CAAI,sBAAsB,CAAA,IAC7D,0BAA0B,MAAA,IAC1B,qBAAA,KAA0B,KAAA,IAC1B,MAAA,CAAO,yBAAyB,MAAA,EAChC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAO,IAAA,KAAS,MAAA,IAAa,MAAA,CAAO,IAAA,KAAS,WAAW,qBAAA,GAAwB,IAAA;AACzF;AAEA,SAAS,YAAY,MAAA,EAAyB;AAC5C,EAAA,OAAO,MAAA,KAAW,QAAS,OAAO,MAAA,KAAW,YAAY,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,KAAW,CAAA;AAC1F;AAEA,SAAS,iBAAiB,MAAA,EAA4B;AACpD,EAAA,IAAI,MAAA,CAAO,SAAS,gBAAA,EAAkB;AACpC,IAAA,OAAO,CAAC,OAAO,IAAI,CAAA;AAAA,EACrB;AACA,EAAA,OAAO,MAAA,CAAO,UAAA,GAAa,CAAC,MAAA,CAAO,IAAA,EAAMC,sBAAA,CAAU,WAAW,CAAC,CAAA,GAAI,CAAC,MAAA,CAAO,IAAI,CAAA;AACjF;AAOA,SAAS,kBAAA,CAAmB,MAAc,OAAA,EAAkC;AAC1E,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,QAAA;AACH,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,gBAAgB,CAAA;AAAA,IAC9C,KAAK,OAAA;AAAA,IACL,KAAK,cAAA;AACH,MAAA,OAAO,IAAA,CAAK,MAAM,OAAA,CAAQ,CAAC,WAAW,kBAAA,CAAmB,MAAA,EAAQ,OAAO,CAAC,CAAA;AAAA,IAC3E,KAAK,WAAA;AAAA,IACL,KAAK,eAAA;AAAA,IACL,KAAK,KAAA;AACH,MAAA,OAAA,CAAQ,OAAA,CAAQ,OAAO,qBAAA,EAAsB;AAC7C,MAAA,OAAO,CAACC,yBAAYC,wBAAA,CAAa,cAAA,CAAe,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;AAAA,IAC/D,KAAK,SAAA;AAAA,IACL,KAAK,eAAA;AAAA,IACL,KAAK,eAAA;AAAA,IACL,KAAK,gBAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,UAAA;AACH,MAAA,OAAO,EAAC;AAAA;AAEd;AAMO,SAAS,yBAAA,CACd,MAAA,EACA,QAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,WAAA,GAAc,mBAAA,CAAoB,MAAA,EAAQ,OAAO,CAAA;AACvD,EAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,aAAa,WAAA,CAAY,WAAW,CAAA,GACtC,CAACC,wBAAY,CAAA,GACb;AAAA,IACE,OAAA,CAAQ,eAAA,CAAgB,WAAA,EAAa,OAAA,CAAQ,UAAU,IAAI,CAAA;AAAA,IAC3D,GAAI,QAAA,KAAa,IAAA,GAAO,EAAC,GAAI,kBAAA,CAAmB,UAAU,OAAO;AAAA,GACnE;AACJ,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,OAAA,CAAQ,OAAA,CAAQ,OAAA;AACtC,EAAA,OAAOC,qBAAA,CAAS,CAACC,mCAAA,CAAuB,KAAA,EAAOC,wBAAQ,UAAU,CAAA,EAAG,SAAS,CAAC,CAAC,CAAA;AACjF;;"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { irObject, irStringIndexSignature, irReference, irKeyword } from '../../../domain/ir/constructors.mjs';
|
|
2
|
-
import {
|
|
2
|
+
import { FIX } from '../../../domain/output-fixes.mjs';
|
|
3
3
|
import { HELPER_TYPES } from '../helper-types.mjs';
|
|
4
4
|
import { UNKNOWN_TYPE } from '../shared-types.mjs';
|
|
5
5
|
import { unionOf } from '../type-combinators.mjs';
|
|
6
6
|
|
|
7
7
|
function unevaluatedSchemaOf(schema, request) {
|
|
8
8
|
const { unevaluatedProperties } = schema;
|
|
9
|
-
if (!request.context.options.fixes.has(
|
|
9
|
+
if (!request.context.options.fixes.has(FIX.UNEVALUATED_PROPERTIES) || unevaluatedProperties === void 0 || unevaluatedProperties === false || schema.additionalProperties !== void 0) {
|
|
10
10
|
return null;
|
|
11
11
|
}
|
|
12
12
|
return schema.type === void 0 || schema.type === "object" ? unevaluatedProperties : null;
|