openapi-typesafe 1.0.0-rc.3 → 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-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 +14 -2
- package/dist/api/default-ports.cjs.map +1 -1
- package/dist/api/default-ports.mjs +14 -2
- package/dist/api/default-ports.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 +5 -1
- package/dist/api/discriminator-patch.cjs.map +1 -1
- package/dist/api/discriminator-patch.mjs +5 -1
- package/dist/api/discriminator-patch.mjs.map +1 -1
- package/dist/api/discriminator-scan.cjs +15 -8
- package/dist/api/discriminator-scan.cjs.map +1 -1
- package/dist/api/discriminator-scan.mjs +15 -8
- package/dist/api/discriminator-scan.mjs.map +1 -1
- package/dist/api/document-run.cjs +2 -2
- package/dist/api/document-run.cjs.map +1 -1
- package/dist/api/document-run.mjs +2 -2
- package/dist/api/document-run.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 +8 -4
- package/dist/api/openapi-ts.cjs.map +1 -1
- package/dist/api/openapi-ts.mjs +8 -5
- 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/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 +40 -10
- package/dist/api/transform-schema.cjs.map +1 -1
- package/dist/api/transform-schema.mjs +41 -11
- 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 +1 -1
- package/dist/application/transform/document/components.cjs.map +1 -1
- package/dist/application/transform/document/components.mjs +2 -2
- 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 +6 -29
- package/dist/application/transform/document/parameters.cjs.map +1 -1
- package/dist/application/transform/document/parameters.mjs +6 -29
- 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 +5 -1
- package/dist/application/transform/document/paths.cjs.map +1 -1
- package/dist/application/transform/document/paths.mjs +6 -2
- 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-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/composition-type.cjs +1 -1
- package/dist/application/transform/schema/composition-type.cjs.map +1 -1
- package/dist/application/transform/schema/composition-type.mjs +2 -2
- package/dist/application/transform/schema/composition-type.mjs.map +1 -1
- package/dist/application/transform/schema/enum-rule.cjs +1 -1
- package/dist/application/transform/schema/enum-rule.cjs.map +1 -1
- package/dist/application/transform/schema/enum-rule.mjs +2 -2
- 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/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/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-comment.cjs +5 -1
- package/dist/application/transform/schema-comment.cjs.map +1 -1
- package/dist/application/transform/schema-comment.mjs +5 -1
- 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/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 +14 -0
- package/dist/domain/output-fixes.cjs.map +1 -1
- package/dist/domain/output-fixes.mjs +14 -0
- 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/index.d.cts +22 -4
- package/dist/index.d.mts +22 -4
- package/dist/index.d.ts +22 -4
- package/package.json +4 -5
- 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 +33 -4
- package/src/api/discriminator-enum-parent.ts +3 -3
- package/src/api/discriminator-other-owners.ts +5 -3
- package/src/api/discriminator-patch.ts +5 -1
- package/src/api/discriminator-scan.ts +16 -8
- package/src/api/document-run.ts +4 -3
- package/src/api/legacy-utils.ts +5 -1
- package/src/api/openapi-ts.ts +20 -5
- package/src/api/run-context.ts +3 -0
- package/src/api/schema-callbacks.ts +60 -17
- package/src/api/transform-context.ts +7 -3
- package/src/api/transform-schema.ts +64 -12
- 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 +2 -2
- 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 +11 -56
- 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 +6 -2
- 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-type.ts +2 -1
- package/src/application/transform/schema/composition-type.ts +2 -2
- package/src/application/transform/schema/enum-rule.ts +6 -2
- package/src/application/transform/schema/object-type.ts +4 -4
- package/src/application/transform/schema/ref-siblings.ts +76 -0
- 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-comment.ts +5 -1
- 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/errors.ts +14 -5
- 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 +21 -2
- package/src/domain/url-secrets.ts +72 -0
- 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":"generated-location.cjs","sources":["../../../../src/application/transform/ref-pointer/generated-location.ts"],"sourcesContent":["import { createRef } from \"../../../domain/openapi/json-pointer.js\";\nimport type { RefResolver } from \"../schema/schema-context.js\";\nimport { isJsonObject } from \"./generated-shape.js\";\nimport {\n leadingSegmentsOf,\n type RefPointer,\n refPointerOf,\n startsInSchema,\n} from \"./pointer-walk.js\";\n\n/**\n * Where the generator types the node a `$ref` points at: the location path it passes down, which\n * also names the node's `--enum` declaration and `--enum-values` array. A target written inline\n * (ADR-026) is typed there, so it shares the generator's enum instead of declaring a second one\n * named after the pointer: two TypeScript enums with the same members are not assignable.\n *\n * The path follows the generator: `properties` is skipped; `allOf/N`, `items`, `prefixItems/N`,\n * `patternProperties/P` and `additionalProperties` type their schema at the parent's location;\n * the `schema` of a parameter, header or media type is typed at the container's; a positional\n * parameter is named by `in` and `name`. A `$ref` crossed on the way continues at its target's\n * location. A node under a schema keyword the generator does not type (`definitions/A`, `not`) is\n * typed nowhere else, so it keeps its pointer as its location.\n */\n\nexport interface GeneratedLocation {\n readonly path: string;\n /** The node is an `additionalProperties` value, as `transformNested` is told. */\n readonly isFromAdditionalProperties: boolean;\n}\n\ninterface LocationWalk {\n readonly path: readonly string[];\n readonly node: unknown;\n readonly isSchema: boolean;\n readonly isFromAdditionalProperties: boolean;\n}\n\n/** One step: the segments it adds to the path, the node it moves to, the segments it reads. */\ninterface Step {\n readonly path: readonly string[];\n readonly child: unknown;\n readonly length: 1 | 2;\n readonly isSchema: boolean;\n readonly isFromAdditionalProperties?: boolean;\n}\n\n/** Keywords followed by a name or position whose schema is typed at the parent's location. */\nconst PARENT_LOCATION_PAIRS: ReadonlySet<string> = new Set([\n \"allOf\",\n \"prefixItems\",\n \"patternProperties\",\n]);\n/** Keywords whose schema is typed at the parent's location as a record value. */\nconst RECORD_VALUE_KEYWORDS: ReadonlySet<string> = new Set([\n \"additionalProperties\",\n \"unevaluatedProperties\",\n]);\n/** Keywords followed by a name or position that both stay in the location. */\nconst KEPT_PAIRS: ReadonlySet<string> = new Set([\"anyOf\", \"oneOf\", \"$defs\"]);\n/** The other schema keywords the generator types: at the parent's location. */\nconst PARENT_LOCATION_KEYWORDS: ReadonlySet<string> = new Set([\"items\", ...RECORD_VALUE_KEYWORDS]);\nconst INDEX_RE = /^\\d+$/;\n\nfunction childOf(node: unknown, segment: string | undefined): unknown {\n return (isJsonObject(node) || Array.isArray(node)) && segment !== undefined\n ? (node as Readonly<Record<string, unknown>>)[segment]\n : undefined;\n}\n\nfunction pairStep(value: unknown, next: string | undefined, path: readonly string[]): Step {\n return { path, child: childOf(value, next), length: 2, isSchema: true };\n}\n\n/** The step through a schema keyword; null for a keyword the generator does not type. */\nfunction schemaStep(node: unknown, segment: string, next: string | undefined): Step | null {\n const value = childOf(node, segment);\n const named = next === undefined ? [] : [next];\n if (segment === \"properties\") {\n return pairStep(value, next, named);\n }\n if (PARENT_LOCATION_PAIRS.has(segment) || (segment === \"items\" && Array.isArray(value))) {\n return pairStep(value, next, []);\n }\n if (KEPT_PAIRS.has(segment)) {\n return pairStep(value, next, [segment, ...named]);\n }\n if (!PARENT_LOCATION_KEYWORDS.has(segment)) {\n return null;\n }\n const isRecordValue = RECORD_VALUE_KEYWORDS.has(segment);\n return {\n path: [],\n child: value,\n length: 1,\n isSchema: true,\n isFromAdditionalProperties: isRecordValue,\n };\n}\n\n/** A path item's own parameters sit under one more `parameters` segment (`pathItemType`). */\nfunction isPathItem(path: readonly string[]): boolean {\n const [root, section] = path;\n return (\n (path.length === 2 && (root === \"paths\" || root === \"webhooks\")) ||\n (path.length === 3 && root === \"components\" && section === \"pathItems\")\n );\n}\n\n/** `parameters/N`: the parameter is named by `in` and `name` (a `$ref` one is crossed later). */\nfunction parameterStep(walk: LocationWalk, next: string): Step {\n const entry = childOf(childOf(walk.node, \"parameters\"), next);\n const where = isJsonObject(entry) ? [String(entry.in), String(entry.name)] : [];\n const prefix = isPathItem(walk.path) ? [\"parameters\"] : [];\n return { path: [...prefix, \"parameters\", ...where], child: entry, length: 2, isSchema: false };\n}\n\nfunction documentStep(walk: LocationWalk, segments: readonly string[], index: number): Step {\n const segment = segments[index] as string;\n const next = segments[index + 1];\n const value = childOf(walk.node, segment);\n if (segment === \"schema\") {\n return { path: [], child: value, length: 1, isSchema: true };\n }\n if (segment === \"parameters\" && next !== undefined && INDEX_RE.test(next)) {\n return parameterStep(walk, next);\n }\n // A header's `content` entries are typed at `headers/<name>/<media type>` (`headerType`).\n if (segment === \"content\" && segments[index - 2] === \"headers\") {\n const path = next === undefined ? [] : [next];\n return { path, child: childOf(value, next), length: 2, isSchema: false };\n }\n return { path: [segment], child: value, length: 1, isSchema: false };\n}\n\nfunction stepAt(walk: LocationWalk, pointer: RefPointer, index: number): Step | null {\n const { segments } = pointer;\n const segment = segments[index] as string;\n if (index < leadingSegmentsOf(pointer)) {\n const child = childOf(walk.node, segment);\n return { path: [segment], child, length: 1, isSchema: startsInSchema(pointer) };\n }\n return walk.isSchema\n ? schemaStep(walk.node, segment, segments[index + 1])\n : documentStep(walk, segments, index);\n}\n\nfunction refOf(node: unknown): string | null {\n return isJsonObject(node) && typeof node.$ref === \"string\" ? node.$ref : null;\n}\n\n/**\n * The walk at a crossed `$ref`'s target, through `$ref`s to `$ref`s; null where the target has\n * no generated location. A cycle of `$ref`s has no node.\n */\nfunction crossed(\n walk: LocationWalk,\n ref: string,\n refs: RefResolver,\n seen: readonly string[],\n): LocationWalk | null {\n if (seen.includes(ref)) {\n return { ...walk, node: undefined };\n }\n const target = walkTo(ref, refs, seen);\n const inner = refOf(target?.node);\n return target === null || inner === null ? target : crossed(target, inner, refs, [...seen, ref]);\n}\n\nfunction walkTo(ref: string, refs: RefResolver, seen: readonly string[]): LocationWalk | null {\n const pointer = refPointerOf(ref);\n if (pointer === null || seen.includes(ref)) {\n return null;\n }\n const root = pointer.rootSegment;\n let walk: LocationWalk = {\n path: [root],\n node: refs.resolve(`#/${root}`),\n isSchema: false,\n isFromAdditionalProperties: false,\n };\n for (let index = 0; index < pointer.segments.length; ) {\n const step = stepAt(walk, pointer, index);\n if (step === null) {\n return null;\n }\n index += step.length;\n walk = {\n path: [...walk.path, ...step.path],\n node: step.child,\n isSchema: step.isSchema,\n isFromAdditionalProperties: step.isFromAdditionalProperties === true,\n };\n const inner = refOf(walk.node);\n const target = inner !== null && index < pointer.segments.length;\n const next = target ? crossed(walk, inner, refs, [...seen, ref]) : walk;\n if (next === null) {\n return null;\n }\n walk = next;\n }\n return walk;\n}\n\n/** The location the generator types the node at `ref` with; see the module comment. */\nexport function generatedLocationOf(ref: string, refs: RefResolver): GeneratedLocation {\n const walk = walkTo(ref, refs, []);\n return {\n path: walk === null ? ref : createRef(walk.path),\n isFromAdditionalProperties: walk?.isFromAdditionalProperties ?? false,\n };\n}\n"],"names":["isJsonObject","leadingSegmentsOf","startsInSchema","refPointerOf","createRef"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"generated-location.cjs","sources":["../../../../src/application/transform/ref-pointer/generated-location.ts"],"sourcesContent":["import { appendPointer, ROOT_POINTER } from \"../../../domain/openapi/json-pointer.js\";\nimport type { RefResolver } from \"../schema/schema-context.js\";\nimport { isJsonObject } from \"./generated-shape.js\";\nimport {\n leadingSegmentsOf,\n type RefPointer,\n refPointerOf,\n startsInSchema,\n} from \"./pointer-walk.js\";\n\n/**\n * Where the generator types the node a `$ref` points at: the location path it passes down, which\n * also names the node's `--enum` declaration and `--enum-values` array. A target written inline\n * (ADR-026) is typed there, so it shares the generator's enum instead of declaring a second one\n * named after the pointer: two TypeScript enums with the same members are not assignable.\n *\n * The path follows the generator: `properties` is skipped; `allOf/N`, `items`, `prefixItems/N`,\n * `patternProperties/P` and `additionalProperties` type their schema at the parent's location;\n * the `schema` of a parameter, header or media type is typed at the container's; a positional\n * parameter is named by `in` and `name`. A `$ref` crossed on the way continues at its target's\n * location. A node under a schema keyword the generator does not type (`definitions/A`, `not`) is\n * typed nowhere else, so it keeps its pointer as its location.\n */\n\nexport interface GeneratedLocation {\n readonly path: string;\n /** The node is an `additionalProperties` value, as `transformNested` is told. */\n readonly isFromAdditionalProperties: boolean;\n}\n\ninterface LocationWalk {\n readonly path: readonly string[];\n readonly node: unknown;\n readonly isSchema: boolean;\n readonly isFromAdditionalProperties: boolean;\n}\n\n/** One step: the segments it adds to the path, the node it moves to, the segments it reads. */\ninterface Step {\n readonly path: readonly string[];\n readonly child: unknown;\n readonly length: 1 | 2;\n readonly isSchema: boolean;\n readonly isFromAdditionalProperties?: boolean;\n}\n\n/** Keywords followed by a name or position whose schema is typed at the parent's location. */\nconst PARENT_LOCATION_PAIRS: ReadonlySet<string> = new Set([\n \"allOf\",\n \"prefixItems\",\n \"patternProperties\",\n]);\n/** Keywords whose schema is typed at the parent's location as a record value. */\nconst RECORD_VALUE_KEYWORDS: ReadonlySet<string> = new Set([\n \"additionalProperties\",\n \"unevaluatedProperties\",\n]);\n/** Keywords followed by a name or position that both stay in the location. */\nconst KEPT_PAIRS: ReadonlySet<string> = new Set([\"anyOf\", \"oneOf\", \"$defs\"]);\n/** The other schema keywords the generator types: at the parent's location. */\nconst PARENT_LOCATION_KEYWORDS: ReadonlySet<string> = new Set([\"items\", ...RECORD_VALUE_KEYWORDS]);\nconst INDEX_RE = /^\\d+$/;\n\nfunction childOf(node: unknown, segment: string | undefined): unknown {\n return (isJsonObject(node) || Array.isArray(node)) && segment !== undefined\n ? (node as Readonly<Record<string, unknown>>)[segment]\n : undefined;\n}\n\nfunction pairStep(value: unknown, next: string | undefined, path: readonly string[]): Step {\n return { path, child: childOf(value, next), length: 2, isSchema: true };\n}\n\n/** The step through a schema keyword; null for a keyword the generator does not type. */\nfunction schemaStep(node: unknown, segment: string, next: string | undefined): Step | null {\n const value = childOf(node, segment);\n const named = next === undefined ? [] : [next];\n if (segment === \"properties\") {\n return pairStep(value, next, named);\n }\n if (PARENT_LOCATION_PAIRS.has(segment) || (segment === \"items\" && Array.isArray(value))) {\n return pairStep(value, next, []);\n }\n if (KEPT_PAIRS.has(segment)) {\n return pairStep(value, next, [segment, ...named]);\n }\n if (!PARENT_LOCATION_KEYWORDS.has(segment)) {\n return null;\n }\n const isRecordValue = RECORD_VALUE_KEYWORDS.has(segment);\n return {\n path: [],\n child: value,\n length: 1,\n isSchema: true,\n isFromAdditionalProperties: isRecordValue,\n };\n}\n\n/** A path item's own parameters sit under one more `parameters` segment (`pathItemType`). */\nfunction isPathItem(path: readonly string[]): boolean {\n const [root, section] = path;\n return (\n (path.length === 2 && (root === \"paths\" || root === \"webhooks\")) ||\n (path.length === 3 && root === \"components\" && section === \"pathItems\")\n );\n}\n\n/** `parameters/N`: the parameter is named by `in` and `name` (a `$ref` one is crossed later). */\nfunction parameterStep(walk: LocationWalk, next: string): Step {\n const entry = childOf(childOf(walk.node, \"parameters\"), next);\n const where = isJsonObject(entry) ? [String(entry.in), String(entry.name)] : [];\n const prefix = isPathItem(walk.path) ? [\"parameters\"] : [];\n return { path: [...prefix, \"parameters\", ...where], child: entry, length: 2, isSchema: false };\n}\n\nfunction documentStep(walk: LocationWalk, segments: readonly string[], index: number): Step {\n const segment = segments[index] as string;\n const next = segments[index + 1];\n const value = childOf(walk.node, segment);\n if (segment === \"schema\") {\n return { path: [], child: value, length: 1, isSchema: true };\n }\n if (segment === \"parameters\" && next !== undefined && INDEX_RE.test(next)) {\n return parameterStep(walk, next);\n }\n // A header's `content` entries are typed at `headers/<name>/<media type>` (`headerType`).\n if (segment === \"content\" && segments[index - 2] === \"headers\") {\n const path = next === undefined ? [] : [next];\n return { path, child: childOf(value, next), length: 2, isSchema: false };\n }\n return { path: [segment], child: value, length: 1, isSchema: false };\n}\n\nfunction stepAt(walk: LocationWalk, pointer: RefPointer, index: number): Step | null {\n const { segments } = pointer;\n const segment = segments[index] as string;\n if (index < leadingSegmentsOf(pointer)) {\n const child = childOf(walk.node, segment);\n return { path: [segment], child, length: 1, isSchema: startsInSchema(pointer) };\n }\n return walk.isSchema\n ? schemaStep(walk.node, segment, segments[index + 1])\n : documentStep(walk, segments, index);\n}\n\nfunction refOf(node: unknown): string | null {\n return isJsonObject(node) && typeof node.$ref === \"string\" ? node.$ref : null;\n}\n\n/**\n * The walk at a crossed `$ref`'s target, through `$ref`s to `$ref`s; null where the target has\n * no generated location. A cycle of `$ref`s has no node.\n */\nfunction crossed(\n walk: LocationWalk,\n ref: string,\n refs: RefResolver,\n seen: readonly string[],\n): LocationWalk | null {\n if (seen.includes(ref)) {\n return { ...walk, node: undefined };\n }\n const target = walkTo(ref, refs, seen);\n const inner = refOf(target?.node);\n return target === null || inner === null ? target : crossed(target, inner, refs, [...seen, ref]);\n}\n\nfunction walkTo(ref: string, refs: RefResolver, seen: readonly string[]): LocationWalk | null {\n const pointer = refPointerOf(ref);\n if (pointer === null || seen.includes(ref)) {\n return null;\n }\n const root = pointer.rootSegment;\n let walk: LocationWalk = {\n path: [root],\n node: refs.resolve(`#/${root}`),\n isSchema: false,\n isFromAdditionalProperties: false,\n };\n for (let index = 0; index < pointer.segments.length; ) {\n const step = stepAt(walk, pointer, index);\n if (step === null) {\n return null;\n }\n index += step.length;\n walk = {\n path: [...walk.path, ...step.path],\n node: step.child,\n isSchema: step.isSchema,\n isFromAdditionalProperties: step.isFromAdditionalProperties === true,\n };\n const inner = refOf(walk.node);\n const target = inner !== null && index < pointer.segments.length;\n const next = target ? crossed(walk, inner, refs, [...seen, ref]) : walk;\n if (next === null) {\n return null;\n }\n walk = next;\n }\n return walk;\n}\n\n/** The location the generator types the node at `ref` with; see the module comment. */\nexport function generatedLocationOf(ref: string, refs: RefResolver): GeneratedLocation {\n const walk = walkTo(ref, refs, []);\n return {\n path: walk === null ? ref : appendPointer(ROOT_POINTER, walk.path),\n isFromAdditionalProperties: walk?.isFromAdditionalProperties ?? false,\n };\n}\n"],"names":["isJsonObject","leadingSegmentsOf","startsInSchema","refPointerOf","appendPointer","ROOT_POINTER"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { appendPointer, ROOT_POINTER } from '../../../domain/openapi/json-pointer.mjs';
|
|
2
2
|
import { isJsonObject } from './generated-shape.mjs';
|
|
3
3
|
import { refPointerOf, leadingSegmentsOf, startsInSchema } from './pointer-walk.mjs';
|
|
4
4
|
|
|
@@ -127,7 +127,7 @@ function walkTo(ref, refs, seen) {
|
|
|
127
127
|
function generatedLocationOf(ref, refs) {
|
|
128
128
|
const walk = walkTo(ref, refs, []);
|
|
129
129
|
return {
|
|
130
|
-
path: walk === null ? ref :
|
|
130
|
+
path: walk === null ? ref : appendPointer(ROOT_POINTER, walk.path),
|
|
131
131
|
isFromAdditionalProperties: walk?.isFromAdditionalProperties ?? false
|
|
132
132
|
};
|
|
133
133
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generated-location.mjs","sources":["../../../../src/application/transform/ref-pointer/generated-location.ts"],"sourcesContent":["import { createRef } from \"../../../domain/openapi/json-pointer.js\";\nimport type { RefResolver } from \"../schema/schema-context.js\";\nimport { isJsonObject } from \"./generated-shape.js\";\nimport {\n leadingSegmentsOf,\n type RefPointer,\n refPointerOf,\n startsInSchema,\n} from \"./pointer-walk.js\";\n\n/**\n * Where the generator types the node a `$ref` points at: the location path it passes down, which\n * also names the node's `--enum` declaration and `--enum-values` array. A target written inline\n * (ADR-026) is typed there, so it shares the generator's enum instead of declaring a second one\n * named after the pointer: two TypeScript enums with the same members are not assignable.\n *\n * The path follows the generator: `properties` is skipped; `allOf/N`, `items`, `prefixItems/N`,\n * `patternProperties/P` and `additionalProperties` type their schema at the parent's location;\n * the `schema` of a parameter, header or media type is typed at the container's; a positional\n * parameter is named by `in` and `name`. A `$ref` crossed on the way continues at its target's\n * location. A node under a schema keyword the generator does not type (`definitions/A`, `not`) is\n * typed nowhere else, so it keeps its pointer as its location.\n */\n\nexport interface GeneratedLocation {\n readonly path: string;\n /** The node is an `additionalProperties` value, as `transformNested` is told. */\n readonly isFromAdditionalProperties: boolean;\n}\n\ninterface LocationWalk {\n readonly path: readonly string[];\n readonly node: unknown;\n readonly isSchema: boolean;\n readonly isFromAdditionalProperties: boolean;\n}\n\n/** One step: the segments it adds to the path, the node it moves to, the segments it reads. */\ninterface Step {\n readonly path: readonly string[];\n readonly child: unknown;\n readonly length: 1 | 2;\n readonly isSchema: boolean;\n readonly isFromAdditionalProperties?: boolean;\n}\n\n/** Keywords followed by a name or position whose schema is typed at the parent's location. */\nconst PARENT_LOCATION_PAIRS: ReadonlySet<string> = new Set([\n \"allOf\",\n \"prefixItems\",\n \"patternProperties\",\n]);\n/** Keywords whose schema is typed at the parent's location as a record value. */\nconst RECORD_VALUE_KEYWORDS: ReadonlySet<string> = new Set([\n \"additionalProperties\",\n \"unevaluatedProperties\",\n]);\n/** Keywords followed by a name or position that both stay in the location. */\nconst KEPT_PAIRS: ReadonlySet<string> = new Set([\"anyOf\", \"oneOf\", \"$defs\"]);\n/** The other schema keywords the generator types: at the parent's location. */\nconst PARENT_LOCATION_KEYWORDS: ReadonlySet<string> = new Set([\"items\", ...RECORD_VALUE_KEYWORDS]);\nconst INDEX_RE = /^\\d+$/;\n\nfunction childOf(node: unknown, segment: string | undefined): unknown {\n return (isJsonObject(node) || Array.isArray(node)) && segment !== undefined\n ? (node as Readonly<Record<string, unknown>>)[segment]\n : undefined;\n}\n\nfunction pairStep(value: unknown, next: string | undefined, path: readonly string[]): Step {\n return { path, child: childOf(value, next), length: 2, isSchema: true };\n}\n\n/** The step through a schema keyword; null for a keyword the generator does not type. */\nfunction schemaStep(node: unknown, segment: string, next: string | undefined): Step | null {\n const value = childOf(node, segment);\n const named = next === undefined ? [] : [next];\n if (segment === \"properties\") {\n return pairStep(value, next, named);\n }\n if (PARENT_LOCATION_PAIRS.has(segment) || (segment === \"items\" && Array.isArray(value))) {\n return pairStep(value, next, []);\n }\n if (KEPT_PAIRS.has(segment)) {\n return pairStep(value, next, [segment, ...named]);\n }\n if (!PARENT_LOCATION_KEYWORDS.has(segment)) {\n return null;\n }\n const isRecordValue = RECORD_VALUE_KEYWORDS.has(segment);\n return {\n path: [],\n child: value,\n length: 1,\n isSchema: true,\n isFromAdditionalProperties: isRecordValue,\n };\n}\n\n/** A path item's own parameters sit under one more `parameters` segment (`pathItemType`). */\nfunction isPathItem(path: readonly string[]): boolean {\n const [root, section] = path;\n return (\n (path.length === 2 && (root === \"paths\" || root === \"webhooks\")) ||\n (path.length === 3 && root === \"components\" && section === \"pathItems\")\n );\n}\n\n/** `parameters/N`: the parameter is named by `in` and `name` (a `$ref` one is crossed later). */\nfunction parameterStep(walk: LocationWalk, next: string): Step {\n const entry = childOf(childOf(walk.node, \"parameters\"), next);\n const where = isJsonObject(entry) ? [String(entry.in), String(entry.name)] : [];\n const prefix = isPathItem(walk.path) ? [\"parameters\"] : [];\n return { path: [...prefix, \"parameters\", ...where], child: entry, length: 2, isSchema: false };\n}\n\nfunction documentStep(walk: LocationWalk, segments: readonly string[], index: number): Step {\n const segment = segments[index] as string;\n const next = segments[index + 1];\n const value = childOf(walk.node, segment);\n if (segment === \"schema\") {\n return { path: [], child: value, length: 1, isSchema: true };\n }\n if (segment === \"parameters\" && next !== undefined && INDEX_RE.test(next)) {\n return parameterStep(walk, next);\n }\n // A header's `content` entries are typed at `headers/<name>/<media type>` (`headerType`).\n if (segment === \"content\" && segments[index - 2] === \"headers\") {\n const path = next === undefined ? [] : [next];\n return { path, child: childOf(value, next), length: 2, isSchema: false };\n }\n return { path: [segment], child: value, length: 1, isSchema: false };\n}\n\nfunction stepAt(walk: LocationWalk, pointer: RefPointer, index: number): Step | null {\n const { segments } = pointer;\n const segment = segments[index] as string;\n if (index < leadingSegmentsOf(pointer)) {\n const child = childOf(walk.node, segment);\n return { path: [segment], child, length: 1, isSchema: startsInSchema(pointer) };\n }\n return walk.isSchema\n ? schemaStep(walk.node, segment, segments[index + 1])\n : documentStep(walk, segments, index);\n}\n\nfunction refOf(node: unknown): string | null {\n return isJsonObject(node) && typeof node.$ref === \"string\" ? node.$ref : null;\n}\n\n/**\n * The walk at a crossed `$ref`'s target, through `$ref`s to `$ref`s; null where the target has\n * no generated location. A cycle of `$ref`s has no node.\n */\nfunction crossed(\n walk: LocationWalk,\n ref: string,\n refs: RefResolver,\n seen: readonly string[],\n): LocationWalk | null {\n if (seen.includes(ref)) {\n return { ...walk, node: undefined };\n }\n const target = walkTo(ref, refs, seen);\n const inner = refOf(target?.node);\n return target === null || inner === null ? target : crossed(target, inner, refs, [...seen, ref]);\n}\n\nfunction walkTo(ref: string, refs: RefResolver, seen: readonly string[]): LocationWalk | null {\n const pointer = refPointerOf(ref);\n if (pointer === null || seen.includes(ref)) {\n return null;\n }\n const root = pointer.rootSegment;\n let walk: LocationWalk = {\n path: [root],\n node: refs.resolve(`#/${root}`),\n isSchema: false,\n isFromAdditionalProperties: false,\n };\n for (let index = 0; index < pointer.segments.length; ) {\n const step = stepAt(walk, pointer, index);\n if (step === null) {\n return null;\n }\n index += step.length;\n walk = {\n path: [...walk.path, ...step.path],\n node: step.child,\n isSchema: step.isSchema,\n isFromAdditionalProperties: step.isFromAdditionalProperties === true,\n };\n const inner = refOf(walk.node);\n const target = inner !== null && index < pointer.segments.length;\n const next = target ? crossed(walk, inner, refs, [...seen, ref]) : walk;\n if (next === null) {\n return null;\n }\n walk = next;\n }\n return walk;\n}\n\n/** The location the generator types the node at `ref` with; see the module comment. */\nexport function generatedLocationOf(ref: string, refs: RefResolver): GeneratedLocation {\n const walk = walkTo(ref, refs, []);\n return {\n path: walk === null ? ref : createRef(walk.path),\n isFromAdditionalProperties: walk?.isFromAdditionalProperties ?? false,\n };\n}\n"],"names":[],"mappings":";;;;AA+CA,MAAM,qBAAA,uBAAiD,GAAA,CAAI;AAAA,EACzD,OAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,MAAM,qBAAA,uBAAiD,GAAA,CAAI;AAAA,EACzD,sBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,MAAM,6BAAkC,IAAI,GAAA,CAAI,CAAC,OAAA,EAAS,OAAA,EAAS,OAAO,CAAC,CAAA;AAE3E,MAAM,2CAAgD,IAAI,GAAA,CAAI,CAAC,OAAA,EAAS,GAAG,qBAAqB,CAAC,CAAA;AACjG,MAAM,QAAA,GAAW,OAAA;AAEjB,SAAS,OAAA,CAAQ,MAAe,OAAA,EAAsC;AACpE,EAAA,OAAA,CAAQ,YAAA,CAAa,IAAI,CAAA,IAAK,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,KAAM,OAAA,KAAY,MAAA,GAC7D,IAAA,CAA2C,OAAO,CAAA,GACnD,MAAA;AACN;AAEA,SAAS,QAAA,CAAS,KAAA,EAAgB,IAAA,EAA0B,IAAA,EAA+B;AACzF,EAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,QAAA,EAAU,IAAA,EAAK;AACxE;AAGA,SAAS,UAAA,CAAW,IAAA,EAAe,OAAA,EAAiB,IAAA,EAAuC;AACzF,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA;AACnC,EAAA,MAAM,QAAQ,IAAA,KAAS,MAAA,GAAY,EAAC,GAAI,CAAC,IAAI,CAAA;AAC7C,EAAA,IAAI,YAAY,YAAA,EAAc;AAC5B,IAAA,OAAO,QAAA,CAAS,KAAA,EAAO,IAAA,EAAM,KAAK,CAAA;AAAA,EACpC;AACA,EAAA,IAAI,qBAAA,CAAsB,IAAI,OAAO,CAAA,IAAM,YAAY,OAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAI;AACvF,IAAA,OAAO,QAAA,CAAS,KAAA,EAAO,IAAA,EAAM,EAAE,CAAA;AAAA,EACjC;AACA,EAAA,IAAI,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA,EAAG;AAC3B,IAAA,OAAO,SAAS,KAAA,EAAO,IAAA,EAAM,CAAC,OAAA,EAAS,GAAG,KAAK,CAAC,CAAA;AAAA,EAClD;AACA,EAAA,IAAI,CAAC,wBAAA,CAAyB,GAAA,CAAI,OAAO,CAAA,EAAG;AAC1C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,aAAA,GAAgB,qBAAA,CAAsB,GAAA,CAAI,OAAO,CAAA;AACvD,EAAA,OAAO;AAAA,IACL,MAAM,EAAC;AAAA,IACP,KAAA,EAAO,KAAA;AAAA,IACP,MAAA,EAAQ,CAAA;AAAA,IACR,QAAA,EAAU,IAAA;AAAA,IACV,0BAAA,EAA4B;AAAA,GAC9B;AACF;AAGA,SAAS,WAAW,IAAA,EAAkC;AACpD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,IAAA;AACxB,EAAA,OACG,IAAA,CAAK,MAAA,KAAW,CAAA,KAAM,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,UAAA,CAAA,IACnD,IAAA,CAAK,MAAA,KAAW,CAAA,IAAK,IAAA,KAAS,YAAA,IAAgB,OAAA,KAAY,WAAA;AAE/D;AAGA,SAAS,aAAA,CAAc,MAAoB,IAAA,EAAoB;AAC7D,EAAA,MAAM,QAAQ,OAAA,CAAQ,OAAA,CAAQ,KAAK,IAAA,EAAM,YAAY,GAAG,IAAI,CAAA;AAC5D,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,KAAK,CAAA,GAAI,CAAC,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,IAAI,CAAC,IAAI,EAAC;AAC9E,EAAA,MAAM,MAAA,GAAS,WAAW,IAAA,CAAK,IAAI,IAAI,CAAC,YAAY,IAAI,EAAC;AACzD,EAAA,OAAO,EAAE,IAAA,EAAM,CAAC,GAAG,QAAQ,YAAA,EAAc,GAAG,KAAK,CAAA,EAAG,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,CAAA,EAAG,UAAU,KAAA,EAAM;AAC/F;AAEA,SAAS,YAAA,CAAa,IAAA,EAAoB,QAAA,EAA6B,KAAA,EAAqB;AAC1F,EAAA,MAAM,OAAA,GAAU,SAAS,KAAK,CAAA;AAC9B,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,GAAQ,CAAC,CAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAK,IAAA,EAAM,OAAO,CAAA;AACxC,EAAA,IAAI,YAAY,QAAA,EAAU;AACxB,IAAA,OAAO,EAAE,MAAM,EAAC,EAAG,OAAO,KAAA,EAAO,MAAA,EAAQ,CAAA,EAAG,QAAA,EAAU,IAAA,EAAK;AAAA,EAC7D;AACA,EAAA,IAAI,YAAY,YAAA,IAAgB,IAAA,KAAS,UAAa,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,EAAG;AACzE,IAAA,OAAO,aAAA,CAAc,MAAM,IAAI,CAAA;AAAA,EACjC;AAEA,EAAA,IAAI,YAAY,SAAA,IAAa,QAAA,CAAS,KAAA,GAAQ,CAAC,MAAM,SAAA,EAAW;AAC9D,IAAA,MAAM,OAAO,IAAA,KAAS,MAAA,GAAY,EAAC,GAAI,CAAC,IAAI,CAAA;AAC5C,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,QAAA,EAAU,KAAA,EAAM;AAAA,EACzE;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,CAAC,OAAO,CAAA,EAAG,OAAO,KAAA,EAAO,MAAA,EAAQ,CAAA,EAAG,QAAA,EAAU,KAAA,EAAM;AACrE;AAEA,SAAS,MAAA,CAAO,IAAA,EAAoB,OAAA,EAAqB,KAAA,EAA4B;AACnF,EAAA,MAAM,EAAE,UAAS,GAAI,OAAA;AACrB,EAAA,MAAM,OAAA,GAAU,SAAS,KAAK,CAAA;AAC9B,EAAA,IAAI,KAAA,GAAQ,iBAAA,CAAkB,OAAO,CAAA,EAAG;AACtC,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAK,IAAA,EAAM,OAAO,CAAA;AACxC,IAAA,OAAO,EAAE,IAAA,EAAM,CAAC,OAAO,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,CAAA,EAAG,QAAA,EAAU,cAAA,CAAe,OAAO,CAAA,EAAE;AAAA,EAChF;AACA,EAAA,OAAO,IAAA,CAAK,QAAA,GACR,UAAA,CAAW,IAAA,CAAK,MAAM,OAAA,EAAS,QAAA,CAAS,KAAA,GAAQ,CAAC,CAAC,CAAA,GAClD,YAAA,CAAa,IAAA,EAAM,UAAU,KAAK,CAAA;AACxC;AAEA,SAAS,MAAM,IAAA,EAA8B;AAC3C,EAAA,OAAO,YAAA,CAAa,IAAI,CAAA,IAAK,OAAO,KAAK,IAAA,KAAS,QAAA,GAAW,KAAK,IAAA,GAAO,IAAA;AAC3E;AAMA,SAAS,OAAA,CACP,IAAA,EACA,GAAA,EACA,IAAA,EACA,IAAA,EACqB;AACrB,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AACtB,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,MAAA,EAAU;AAAA,EACpC;AACA,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,GAAA,EAAK,IAAA,EAAM,IAAI,CAAA;AACrC,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,EAAQ,IAAI,CAAA;AAChC,EAAA,OAAO,MAAA,KAAW,IAAA,IAAQ,KAAA,KAAU,IAAA,GAAO,MAAA,GAAS,OAAA,CAAQ,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,CAAC,GAAG,IAAA,EAAM,GAAG,CAAC,CAAA;AACjG;AAEA,SAAS,MAAA,CAAO,GAAA,EAAa,IAAA,EAAmB,IAAA,EAA8C;AAC5F,EAAA,MAAM,OAAA,GAAU,aAAa,GAAG,CAAA;AAChC,EAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AAC1C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAO,OAAA,CAAQ,WAAA;AACrB,EAAA,IAAI,IAAA,GAAqB;AAAA,IACvB,IAAA,EAAM,CAAC,IAAI,CAAA;AAAA,IACX,IAAA,EAAM,IAAA,CAAK,OAAA,CAAQ,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AAAA,IAC9B,QAAA,EAAU,KAAA;AAAA,IACV,0BAAA,EAA4B;AAAA,GAC9B;AACA,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,OAAA,CAAQ,SAAS,MAAA,IAAU;AACrD,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,EAAM,OAAA,EAAS,KAAK,CAAA;AACxC,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,KAAA,IAAS,IAAA,CAAK,MAAA;AACd,IAAA,IAAA,GAAO;AAAA,MACL,MAAM,CAAC,GAAG,KAAK,IAAA,EAAM,GAAG,KAAK,IAAI,CAAA;AAAA,MACjC,MAAM,IAAA,CAAK,KAAA;AAAA,MACX,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,0BAAA,EAA4B,KAAK,0BAAA,KAA+B;AAAA,KAClE;AACA,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAC7B,IAAA,MAAM,MAAA,GAAS,KAAA,KAAU,IAAA,IAAQ,KAAA,GAAQ,QAAQ,QAAA,CAAS,MAAA;AAC1D,IAAA,MAAM,IAAA,GAAO,MAAA,GAAS,OAAA,CAAQ,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,CAAC,GAAG,IAAA,EAAM,GAAG,CAAC,CAAA,GAAI,IAAA;AACnE,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAA,GAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,mBAAA,CAAoB,KAAa,IAAA,EAAsC;AACrF,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,EAAK,IAAA,EAAM,EAAE,CAAA;AACjC,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,KAAS,IAAA,GAAO,GAAA,GAAM,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,IAC/C,0BAAA,EAA4B,MAAM,0BAAA,IAA8B;AAAA,GAClE;AACF;;"}
|
|
1
|
+
{"version":3,"file":"generated-location.mjs","sources":["../../../../src/application/transform/ref-pointer/generated-location.ts"],"sourcesContent":["import { appendPointer, ROOT_POINTER } from \"../../../domain/openapi/json-pointer.js\";\nimport type { RefResolver } from \"../schema/schema-context.js\";\nimport { isJsonObject } from \"./generated-shape.js\";\nimport {\n leadingSegmentsOf,\n type RefPointer,\n refPointerOf,\n startsInSchema,\n} from \"./pointer-walk.js\";\n\n/**\n * Where the generator types the node a `$ref` points at: the location path it passes down, which\n * also names the node's `--enum` declaration and `--enum-values` array. A target written inline\n * (ADR-026) is typed there, so it shares the generator's enum instead of declaring a second one\n * named after the pointer: two TypeScript enums with the same members are not assignable.\n *\n * The path follows the generator: `properties` is skipped; `allOf/N`, `items`, `prefixItems/N`,\n * `patternProperties/P` and `additionalProperties` type their schema at the parent's location;\n * the `schema` of a parameter, header or media type is typed at the container's; a positional\n * parameter is named by `in` and `name`. A `$ref` crossed on the way continues at its target's\n * location. A node under a schema keyword the generator does not type (`definitions/A`, `not`) is\n * typed nowhere else, so it keeps its pointer as its location.\n */\n\nexport interface GeneratedLocation {\n readonly path: string;\n /** The node is an `additionalProperties` value, as `transformNested` is told. */\n readonly isFromAdditionalProperties: boolean;\n}\n\ninterface LocationWalk {\n readonly path: readonly string[];\n readonly node: unknown;\n readonly isSchema: boolean;\n readonly isFromAdditionalProperties: boolean;\n}\n\n/** One step: the segments it adds to the path, the node it moves to, the segments it reads. */\ninterface Step {\n readonly path: readonly string[];\n readonly child: unknown;\n readonly length: 1 | 2;\n readonly isSchema: boolean;\n readonly isFromAdditionalProperties?: boolean;\n}\n\n/** Keywords followed by a name or position whose schema is typed at the parent's location. */\nconst PARENT_LOCATION_PAIRS: ReadonlySet<string> = new Set([\n \"allOf\",\n \"prefixItems\",\n \"patternProperties\",\n]);\n/** Keywords whose schema is typed at the parent's location as a record value. */\nconst RECORD_VALUE_KEYWORDS: ReadonlySet<string> = new Set([\n \"additionalProperties\",\n \"unevaluatedProperties\",\n]);\n/** Keywords followed by a name or position that both stay in the location. */\nconst KEPT_PAIRS: ReadonlySet<string> = new Set([\"anyOf\", \"oneOf\", \"$defs\"]);\n/** The other schema keywords the generator types: at the parent's location. */\nconst PARENT_LOCATION_KEYWORDS: ReadonlySet<string> = new Set([\"items\", ...RECORD_VALUE_KEYWORDS]);\nconst INDEX_RE = /^\\d+$/;\n\nfunction childOf(node: unknown, segment: string | undefined): unknown {\n return (isJsonObject(node) || Array.isArray(node)) && segment !== undefined\n ? (node as Readonly<Record<string, unknown>>)[segment]\n : undefined;\n}\n\nfunction pairStep(value: unknown, next: string | undefined, path: readonly string[]): Step {\n return { path, child: childOf(value, next), length: 2, isSchema: true };\n}\n\n/** The step through a schema keyword; null for a keyword the generator does not type. */\nfunction schemaStep(node: unknown, segment: string, next: string | undefined): Step | null {\n const value = childOf(node, segment);\n const named = next === undefined ? [] : [next];\n if (segment === \"properties\") {\n return pairStep(value, next, named);\n }\n if (PARENT_LOCATION_PAIRS.has(segment) || (segment === \"items\" && Array.isArray(value))) {\n return pairStep(value, next, []);\n }\n if (KEPT_PAIRS.has(segment)) {\n return pairStep(value, next, [segment, ...named]);\n }\n if (!PARENT_LOCATION_KEYWORDS.has(segment)) {\n return null;\n }\n const isRecordValue = RECORD_VALUE_KEYWORDS.has(segment);\n return {\n path: [],\n child: value,\n length: 1,\n isSchema: true,\n isFromAdditionalProperties: isRecordValue,\n };\n}\n\n/** A path item's own parameters sit under one more `parameters` segment (`pathItemType`). */\nfunction isPathItem(path: readonly string[]): boolean {\n const [root, section] = path;\n return (\n (path.length === 2 && (root === \"paths\" || root === \"webhooks\")) ||\n (path.length === 3 && root === \"components\" && section === \"pathItems\")\n );\n}\n\n/** `parameters/N`: the parameter is named by `in` and `name` (a `$ref` one is crossed later). */\nfunction parameterStep(walk: LocationWalk, next: string): Step {\n const entry = childOf(childOf(walk.node, \"parameters\"), next);\n const where = isJsonObject(entry) ? [String(entry.in), String(entry.name)] : [];\n const prefix = isPathItem(walk.path) ? [\"parameters\"] : [];\n return { path: [...prefix, \"parameters\", ...where], child: entry, length: 2, isSchema: false };\n}\n\nfunction documentStep(walk: LocationWalk, segments: readonly string[], index: number): Step {\n const segment = segments[index] as string;\n const next = segments[index + 1];\n const value = childOf(walk.node, segment);\n if (segment === \"schema\") {\n return { path: [], child: value, length: 1, isSchema: true };\n }\n if (segment === \"parameters\" && next !== undefined && INDEX_RE.test(next)) {\n return parameterStep(walk, next);\n }\n // A header's `content` entries are typed at `headers/<name>/<media type>` (`headerType`).\n if (segment === \"content\" && segments[index - 2] === \"headers\") {\n const path = next === undefined ? [] : [next];\n return { path, child: childOf(value, next), length: 2, isSchema: false };\n }\n return { path: [segment], child: value, length: 1, isSchema: false };\n}\n\nfunction stepAt(walk: LocationWalk, pointer: RefPointer, index: number): Step | null {\n const { segments } = pointer;\n const segment = segments[index] as string;\n if (index < leadingSegmentsOf(pointer)) {\n const child = childOf(walk.node, segment);\n return { path: [segment], child, length: 1, isSchema: startsInSchema(pointer) };\n }\n return walk.isSchema\n ? schemaStep(walk.node, segment, segments[index + 1])\n : documentStep(walk, segments, index);\n}\n\nfunction refOf(node: unknown): string | null {\n return isJsonObject(node) && typeof node.$ref === \"string\" ? node.$ref : null;\n}\n\n/**\n * The walk at a crossed `$ref`'s target, through `$ref`s to `$ref`s; null where the target has\n * no generated location. A cycle of `$ref`s has no node.\n */\nfunction crossed(\n walk: LocationWalk,\n ref: string,\n refs: RefResolver,\n seen: readonly string[],\n): LocationWalk | null {\n if (seen.includes(ref)) {\n return { ...walk, node: undefined };\n }\n const target = walkTo(ref, refs, seen);\n const inner = refOf(target?.node);\n return target === null || inner === null ? target : crossed(target, inner, refs, [...seen, ref]);\n}\n\nfunction walkTo(ref: string, refs: RefResolver, seen: readonly string[]): LocationWalk | null {\n const pointer = refPointerOf(ref);\n if (pointer === null || seen.includes(ref)) {\n return null;\n }\n const root = pointer.rootSegment;\n let walk: LocationWalk = {\n path: [root],\n node: refs.resolve(`#/${root}`),\n isSchema: false,\n isFromAdditionalProperties: false,\n };\n for (let index = 0; index < pointer.segments.length; ) {\n const step = stepAt(walk, pointer, index);\n if (step === null) {\n return null;\n }\n index += step.length;\n walk = {\n path: [...walk.path, ...step.path],\n node: step.child,\n isSchema: step.isSchema,\n isFromAdditionalProperties: step.isFromAdditionalProperties === true,\n };\n const inner = refOf(walk.node);\n const target = inner !== null && index < pointer.segments.length;\n const next = target ? crossed(walk, inner, refs, [...seen, ref]) : walk;\n if (next === null) {\n return null;\n }\n walk = next;\n }\n return walk;\n}\n\n/** The location the generator types the node at `ref` with; see the module comment. */\nexport function generatedLocationOf(ref: string, refs: RefResolver): GeneratedLocation {\n const walk = walkTo(ref, refs, []);\n return {\n path: walk === null ? ref : appendPointer(ROOT_POINTER, walk.path),\n isFromAdditionalProperties: walk?.isFromAdditionalProperties ?? false,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -31,7 +31,8 @@ function indexKeyword(type, segment, isLast) {
|
|
|
31
31
|
return segment === DEFS_KEYWORD && !isLast ? constructors.irReference("NonNullable", [indexed]) : indexed;
|
|
32
32
|
}
|
|
33
33
|
function rootType(rootSegment, isDeep) {
|
|
34
|
-
|
|
34
|
+
const root = constructors.irReference(rootSegment);
|
|
35
|
+
return isDeep ? constructors.irReference("FlattenedDeepRequired", [root]) : root;
|
|
35
36
|
}
|
|
36
37
|
function refType(ref, options = {}) {
|
|
37
38
|
const [rootSegment, ...pointer] = jsonPointer.parseRefPointer(ref);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ref-type.cjs","sources":["../../../src/application/transform/ref-type.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../../domain/errors.js\";\nimport {\n irIndexedAccess,\n irKeyword,\n irObject,\n irProperty,\n irReference,\n irString,\n} from \"../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../domain/ir/property-name.js\";\nimport { parseRefPointer } from \"../../domain/openapi/json-pointer.js\";\n\n/** Where a referenced parameter lives in the generated `parameters` type. */\nexport interface RefParameterTarget {\n readonly in: string;\n readonly name: string;\n}\n\nexport interface RefTypeOptions {\n /** Wrap the root in `FlattenedDeepRequired<…>`. */\n readonly isDeep?: boolean;\n /** Segments to narrow with `Extract<T, { segment: unknown }>` before indexing. */\n readonly extractProperties?: readonly string[];\n /** Set when the `$ref` resolves to a parameter object: its last segment indexes `in`, `name`. */\n readonly parameter?: RefParameterTarget | null;\n}\n\nexport class InvalidRefError extends OpenAPITypesafeError {\n constructor(ref: string) {\n super({\n code: ERROR_CODES.SCHEMA_REF_INVALID,\n message: `Error parsing $ref: ${ref}. Is this a valid $ref?`,\n details: { ref },\n });\n this.name = \"InvalidRefError\";\n }\n}\n\n/** Segments that index into the root type, always as escaped string literal types. */\nexport function indexBy(type: IrType, ...segments: readonly string[]): IrType {\n return segments.reduce<IrType>(\n (object, segment) => irIndexedAccess(object, irString(segment, \"escaped\")),\n type,\n );\n}\n\n/**\n * `Extract<T, { name: unknown }>`. The original wrote the name as an identifier even when it is\n * not one (`{ content-type: unknown }`), which is a syntax error; it is now quoted like any other\n * property name, and an identifier stays as it was.\n */\nexport function extractVariantsWith(type: IrType, propertyName: string): IrType {\n const probe = irProperty(toPropertyName(propertyName), irKeyword(\"unknown\"));\n return irReference(\"Extract\", [type, irObject([probe])]);\n}\n\nconst DEFS_KEYWORD = \"$defs\";\n\n/**\n * Index by `segment`. A `$defs` member is optional (it is a keyword, not data), so when more\n * segments follow it is wrapped in `NonNullable<…>` first; otherwise the next index fails on\n * `undefined` (upstream #2664).\n */\nexport function indexKeyword(type: IrType, segment: string, isLast: boolean): IrType {\n const indexed = indexBy(type, segment);\n return segment === DEFS_KEYWORD && !isLast ? irReference(\"NonNullable\", [indexed]) : indexed;\n}\n\nexport function rootType(rootSegment: string, isDeep: boolean): IrType {\n
|
|
1
|
+
{"version":3,"file":"ref-type.cjs","sources":["../../../src/application/transform/ref-type.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../../domain/errors.js\";\nimport {\n irIndexedAccess,\n irKeyword,\n irObject,\n irProperty,\n irReference,\n irString,\n} from \"../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../domain/ir/property-name.js\";\nimport { parseRefPointer } from \"../../domain/openapi/json-pointer.js\";\n\n/** Where a referenced parameter lives in the generated `parameters` type. */\nexport interface RefParameterTarget {\n readonly in: string;\n readonly name: string;\n}\n\nexport interface RefTypeOptions {\n /** Wrap the root in `FlattenedDeepRequired<…>`. */\n readonly isDeep?: boolean;\n /** Segments to narrow with `Extract<T, { segment: unknown }>` before indexing. */\n readonly extractProperties?: readonly string[];\n /** Set when the `$ref` resolves to a parameter object: its last segment indexes `in`, `name`. */\n readonly parameter?: RefParameterTarget | null;\n}\n\nexport class InvalidRefError extends OpenAPITypesafeError {\n constructor(ref: string) {\n super({\n code: ERROR_CODES.SCHEMA_REF_INVALID,\n message: `Error parsing $ref: ${ref}. Is this a valid $ref?`,\n details: { ref },\n });\n this.name = \"InvalidRefError\";\n }\n}\n\n/** Segments that index into the root type, always as escaped string literal types. */\nexport function indexBy(type: IrType, ...segments: readonly string[]): IrType {\n return segments.reduce<IrType>(\n (object, segment) => irIndexedAccess(object, irString(segment, \"escaped\")),\n type,\n );\n}\n\n/**\n * `Extract<T, { name: unknown }>`. The original wrote the name as an identifier even when it is\n * not one (`{ content-type: unknown }`), which is a syntax error; it is now quoted like any other\n * property name, and an identifier stays as it was.\n */\nexport function extractVariantsWith(type: IrType, propertyName: string): IrType {\n const probe = irProperty(toPropertyName(propertyName), irKeyword(\"unknown\"));\n return irReference(\"Extract\", [type, irObject([probe])]);\n}\n\nconst DEFS_KEYWORD = \"$defs\";\n\n/**\n * Index by `segment`. A `$defs` member is optional (it is a keyword, not data), so when more\n * segments follow it is wrapped in `NonNullable<…>` first; otherwise the next index fails on\n * `undefined` (upstream #2664).\n */\nexport function indexKeyword(type: IrType, segment: string, isLast: boolean): IrType {\n const indexed = indexBy(type, segment);\n return segment === DEFS_KEYWORD && !isLast ? irReference(\"NonNullable\", [indexed]) : indexed;\n}\n\nexport function rootType(rootSegment: string, isDeep: boolean): IrType {\n const root = irReference(rootSegment);\n return isDeep ? irReference(\"FlattenedDeepRequired\", [root]) : root;\n}\n\n/**\n * The indexed-access type of a `$ref` into the generated types (the original `oapiRef`), for\n * example `components[\"schemas\"][\"Foo\"]`. The first three segments index directly. After them,\n * `properties` segments are skipped (objects are flattened, upstream issue 1742), a parameter's\n * last segment becomes `[in][name]`, and listed segments are narrowed with `Extract` first.\n *\n * Throws InvalidRefError when the `$ref` has no pointer.\n */\nexport function refType(ref: string, options: RefTypeOptions = {}): IrType {\n const [rootSegment, ...pointer] = parseRefPointer(ref);\n if (rootSegment === undefined) {\n throw new InvalidRefError(ref);\n }\n const extracted = new Set(options.extractProperties ?? []);\n const lastIndex = pointer.length - 1;\n const leading = indexBy(rootType(rootSegment, options.isDeep ?? false), ...pointer.slice(0, 2));\n return pointer.slice(2).reduce<IrType>((type, segment, offset) => {\n if (segment === \"properties\") {\n return type;\n }\n if (options.parameter && offset + 2 === lastIndex) {\n return indexBy(type, options.parameter.in, options.parameter.name);\n }\n const isLast = offset + 2 === lastIndex;\n return extracted.has(segment)\n ? indexBy(extractVariantsWith(type, segment), segment)\n : indexKeyword(type, segment, isLast);\n }, leading);\n}\n"],"names":["OpenAPITypesafeError","ERROR_CODES","irIndexedAccess","irString","propertyName","irProperty","toPropertyName","irKeyword","irReference","irObject","parseRefPointer"],"mappings":";;;;;;;AA4BO,MAAM,wBAAwBA,2BAAA,CAAqB;AAAA,EACxD,YAAY,GAAA,EAAa;AACvB,IAAA,KAAA,CAAM;AAAA,MACJ,MAAMC,kBAAA,CAAY,kBAAA;AAAA,MAClB,OAAA,EAAS,uBAAuB,GAAG,CAAA,uBAAA,CAAA;AAAA,MACnC,OAAA,EAAS,EAAE,GAAA;AAAI,KAChB,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AAGO,SAAS,OAAA,CAAQ,SAAiB,QAAA,EAAqC;AAC5E,EAAA,OAAO,QAAA,CAAS,MAAA;AAAA,IACd,CAAC,QAAQ,OAAA,KAAYC,4BAAA,CAAgB,QAAQC,qBAAA,CAAS,OAAA,EAAS,SAAS,CAAC,CAAA;AAAA,IACzE;AAAA,GACF;AACF;AAOO,SAAS,mBAAA,CAAoB,MAAcC,cAAA,EAA8B;AAC9E,EAAA,MAAM,QAAQC,uBAAA,CAAWC,2BAAA,CAAeF,cAAY,CAAA,EAAGG,sBAAA,CAAU,SAAS,CAAC,CAAA;AAC3E,EAAA,OAAOC,wBAAA,CAAY,WAAW,CAAC,IAAA,EAAMC,sBAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AACzD;AAEA,MAAM,YAAA,GAAe,OAAA;AAOd,SAAS,YAAA,CAAa,IAAA,EAAc,OAAA,EAAiB,MAAA,EAAyB;AACnF,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA;AACrC,EAAA,OAAO,OAAA,KAAY,gBAAgB,CAAC,MAAA,GAASD,yBAAY,aAAA,EAAe,CAAC,OAAO,CAAC,CAAA,GAAI,OAAA;AACvF;AAEO,SAAS,QAAA,CAAS,aAAqB,MAAA,EAAyB;AACrE,EAAA,MAAM,IAAA,GAAOA,yBAAY,WAAW,CAAA;AACpC,EAAA,OAAO,SAASA,wBAAA,CAAY,uBAAA,EAAyB,CAAC,IAAI,CAAC,CAAA,GAAI,IAAA;AACjE;AAUO,SAAS,OAAA,CAAQ,GAAA,EAAa,OAAA,GAA0B,EAAC,EAAW;AACzE,EAAA,MAAM,CAAC,WAAA,EAAa,GAAG,OAAO,CAAA,GAAIE,4BAAgB,GAAG,CAAA;AACrD,EAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,IAAA,MAAM,IAAI,gBAAgB,GAAG,CAAA;AAAA,EAC/B;AACA,EAAA,MAAM,YAAY,IAAI,GAAA,CAAI,OAAA,CAAQ,iBAAA,IAAqB,EAAE,CAAA;AACzD,EAAA,MAAM,SAAA,GAAY,QAAQ,MAAA,GAAS,CAAA;AACnC,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,QAAA,CAAS,WAAA,EAAa,OAAA,CAAQ,MAAA,IAAU,KAAK,CAAA,EAAG,GAAG,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAC9F,EAAA,OAAO,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAE,OAAe,CAAC,IAAA,EAAM,SAAS,MAAA,KAAW;AAChE,IAAA,IAAI,YAAY,YAAA,EAAc;AAC5B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,OAAA,CAAQ,SAAA,IAAa,MAAA,GAAS,CAAA,KAAM,SAAA,EAAW;AACjD,MAAA,OAAO,QAAQ,IAAA,EAAM,OAAA,CAAQ,UAAU,EAAA,EAAI,OAAA,CAAQ,UAAU,IAAI,CAAA;AAAA,IACnE;AACA,IAAA,MAAM,MAAA,GAAS,SAAS,CAAA,KAAM,SAAA;AAC9B,IAAA,OAAO,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA,GACxB,QAAQ,mBAAA,CAAoB,IAAA,EAAM,OAAO,CAAA,EAAG,OAAO,CAAA,GACnD,YAAA,CAAa,IAAA,EAAM,SAAS,MAAM,CAAA;AAAA,EACxC,GAAG,OAAO,CAAA;AACZ;;;;;;;"}
|
|
@@ -29,7 +29,8 @@ function indexKeyword(type, segment, isLast) {
|
|
|
29
29
|
return segment === DEFS_KEYWORD && !isLast ? irReference("NonNullable", [indexed]) : indexed;
|
|
30
30
|
}
|
|
31
31
|
function rootType(rootSegment, isDeep) {
|
|
32
|
-
|
|
32
|
+
const root = irReference(rootSegment);
|
|
33
|
+
return isDeep ? irReference("FlattenedDeepRequired", [root]) : root;
|
|
33
34
|
}
|
|
34
35
|
function refType(ref, options = {}) {
|
|
35
36
|
const [rootSegment, ...pointer] = parseRefPointer(ref);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ref-type.mjs","sources":["../../../src/application/transform/ref-type.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../../domain/errors.js\";\nimport {\n irIndexedAccess,\n irKeyword,\n irObject,\n irProperty,\n irReference,\n irString,\n} from \"../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../domain/ir/property-name.js\";\nimport { parseRefPointer } from \"../../domain/openapi/json-pointer.js\";\n\n/** Where a referenced parameter lives in the generated `parameters` type. */\nexport interface RefParameterTarget {\n readonly in: string;\n readonly name: string;\n}\n\nexport interface RefTypeOptions {\n /** Wrap the root in `FlattenedDeepRequired<…>`. */\n readonly isDeep?: boolean;\n /** Segments to narrow with `Extract<T, { segment: unknown }>` before indexing. */\n readonly extractProperties?: readonly string[];\n /** Set when the `$ref` resolves to a parameter object: its last segment indexes `in`, `name`. */\n readonly parameter?: RefParameterTarget | null;\n}\n\nexport class InvalidRefError extends OpenAPITypesafeError {\n constructor(ref: string) {\n super({\n code: ERROR_CODES.SCHEMA_REF_INVALID,\n message: `Error parsing $ref: ${ref}. Is this a valid $ref?`,\n details: { ref },\n });\n this.name = \"InvalidRefError\";\n }\n}\n\n/** Segments that index into the root type, always as escaped string literal types. */\nexport function indexBy(type: IrType, ...segments: readonly string[]): IrType {\n return segments.reduce<IrType>(\n (object, segment) => irIndexedAccess(object, irString(segment, \"escaped\")),\n type,\n );\n}\n\n/**\n * `Extract<T, { name: unknown }>`. The original wrote the name as an identifier even when it is\n * not one (`{ content-type: unknown }`), which is a syntax error; it is now quoted like any other\n * property name, and an identifier stays as it was.\n */\nexport function extractVariantsWith(type: IrType, propertyName: string): IrType {\n const probe = irProperty(toPropertyName(propertyName), irKeyword(\"unknown\"));\n return irReference(\"Extract\", [type, irObject([probe])]);\n}\n\nconst DEFS_KEYWORD = \"$defs\";\n\n/**\n * Index by `segment`. A `$defs` member is optional (it is a keyword, not data), so when more\n * segments follow it is wrapped in `NonNullable<…>` first; otherwise the next index fails on\n * `undefined` (upstream #2664).\n */\nexport function indexKeyword(type: IrType, segment: string, isLast: boolean): IrType {\n const indexed = indexBy(type, segment);\n return segment === DEFS_KEYWORD && !isLast ? irReference(\"NonNullable\", [indexed]) : indexed;\n}\n\nexport function rootType(rootSegment: string, isDeep: boolean): IrType {\n
|
|
1
|
+
{"version":3,"file":"ref-type.mjs","sources":["../../../src/application/transform/ref-type.ts"],"sourcesContent":["import { ERROR_CODES, OpenAPITypesafeError } from \"../../domain/errors.js\";\nimport {\n irIndexedAccess,\n irKeyword,\n irObject,\n irProperty,\n irReference,\n irString,\n} from \"../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../domain/ir/property-name.js\";\nimport { parseRefPointer } from \"../../domain/openapi/json-pointer.js\";\n\n/** Where a referenced parameter lives in the generated `parameters` type. */\nexport interface RefParameterTarget {\n readonly in: string;\n readonly name: string;\n}\n\nexport interface RefTypeOptions {\n /** Wrap the root in `FlattenedDeepRequired<…>`. */\n readonly isDeep?: boolean;\n /** Segments to narrow with `Extract<T, { segment: unknown }>` before indexing. */\n readonly extractProperties?: readonly string[];\n /** Set when the `$ref` resolves to a parameter object: its last segment indexes `in`, `name`. */\n readonly parameter?: RefParameterTarget | null;\n}\n\nexport class InvalidRefError extends OpenAPITypesafeError {\n constructor(ref: string) {\n super({\n code: ERROR_CODES.SCHEMA_REF_INVALID,\n message: `Error parsing $ref: ${ref}. Is this a valid $ref?`,\n details: { ref },\n });\n this.name = \"InvalidRefError\";\n }\n}\n\n/** Segments that index into the root type, always as escaped string literal types. */\nexport function indexBy(type: IrType, ...segments: readonly string[]): IrType {\n return segments.reduce<IrType>(\n (object, segment) => irIndexedAccess(object, irString(segment, \"escaped\")),\n type,\n );\n}\n\n/**\n * `Extract<T, { name: unknown }>`. The original wrote the name as an identifier even when it is\n * not one (`{ content-type: unknown }`), which is a syntax error; it is now quoted like any other\n * property name, and an identifier stays as it was.\n */\nexport function extractVariantsWith(type: IrType, propertyName: string): IrType {\n const probe = irProperty(toPropertyName(propertyName), irKeyword(\"unknown\"));\n return irReference(\"Extract\", [type, irObject([probe])]);\n}\n\nconst DEFS_KEYWORD = \"$defs\";\n\n/**\n * Index by `segment`. A `$defs` member is optional (it is a keyword, not data), so when more\n * segments follow it is wrapped in `NonNullable<…>` first; otherwise the next index fails on\n * `undefined` (upstream #2664).\n */\nexport function indexKeyword(type: IrType, segment: string, isLast: boolean): IrType {\n const indexed = indexBy(type, segment);\n return segment === DEFS_KEYWORD && !isLast ? irReference(\"NonNullable\", [indexed]) : indexed;\n}\n\nexport function rootType(rootSegment: string, isDeep: boolean): IrType {\n const root = irReference(rootSegment);\n return isDeep ? irReference(\"FlattenedDeepRequired\", [root]) : root;\n}\n\n/**\n * The indexed-access type of a `$ref` into the generated types (the original `oapiRef`), for\n * example `components[\"schemas\"][\"Foo\"]`. The first three segments index directly. After them,\n * `properties` segments are skipped (objects are flattened, upstream issue 1742), a parameter's\n * last segment becomes `[in][name]`, and listed segments are narrowed with `Extract` first.\n *\n * Throws InvalidRefError when the `$ref` has no pointer.\n */\nexport function refType(ref: string, options: RefTypeOptions = {}): IrType {\n const [rootSegment, ...pointer] = parseRefPointer(ref);\n if (rootSegment === undefined) {\n throw new InvalidRefError(ref);\n }\n const extracted = new Set(options.extractProperties ?? []);\n const lastIndex = pointer.length - 1;\n const leading = indexBy(rootType(rootSegment, options.isDeep ?? false), ...pointer.slice(0, 2));\n return pointer.slice(2).reduce<IrType>((type, segment, offset) => {\n if (segment === \"properties\") {\n return type;\n }\n if (options.parameter && offset + 2 === lastIndex) {\n return indexBy(type, options.parameter.in, options.parameter.name);\n }\n const isLast = offset + 2 === lastIndex;\n return extracted.has(segment)\n ? indexBy(extractVariantsWith(type, segment), segment)\n : indexKeyword(type, segment, isLast);\n }, leading);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -16,7 +16,7 @@ function variantTypes(variants, keyword, request) {
|
|
|
16
16
|
return variants.map(
|
|
17
17
|
(variant, index) => request.transformNested(variant, {
|
|
18
18
|
...request.location,
|
|
19
|
-
path: jsonPointer.
|
|
19
|
+
path: jsonPointer.appendPointer(request.location.path, [keyword, index])
|
|
20
20
|
})
|
|
21
21
|
);
|
|
22
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composition-type.cjs","sources":["../../../../src/application/transform/schema/composition-type.ts"],"sourcesContent":["import { irKeyword, irRecord } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport { createRef } from \"../../../domain/openapi/json-pointer.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { FIX } from \"../../../domain/output-fixes.js\";\nimport { requirableRefType } from \"../ref-pointer/pointer-type.js\";\nimport { UNKNOWN_TYPE } from \"../shared-types.js\";\nimport {\n intersectionOf,\n isPrimitiveType,\n nullableOf,\n omitKeys,\n unionOf,\n withRequiredKeys,\n} from \"../type-combinators.js\";\nimport { coreType } from \"./core-type.js\";\nimport { unionItemOf, unionOwnKeywords } from \"./discriminated-union.js\";\nimport { allOfMembers } from \"./presence-members.js\";\nimport { requiredVariantsType } from \"./required-variants.js\";\nimport type { SchemaRequest } from \"./schema-rule.js\";\nimport { unevaluatedPropertiesType } from \"./unevaluated-properties.js\";\n\n/** `anyOf` / `oneOf` variants; the position is part of the path so nested names stay unique. */\nfunction variantTypes(\n variants: readonly Schema[],\n keyword: \"anyOf\" | \"oneOf\",\n request: SchemaRequest,\n): IrType[] {\n return variants.map((variant, index) =>\n request.transformNested(variant, {\n ...request.location,\n path: createRef([request.location.path, keyword, String(index)]),\n }),\n );\n}\n\n/**\n * Whether an `allOf` item is a `$ref`. Like the original, this uses `in`, so a boolean item throws\n * a TypeError instead of being accepted.\n */\nfunction isRefItem(item: Schema): item is { readonly $ref: string } {\n return \"$ref\" in (item as object);\n}\n\n/**\n * The parent's `required` keys that the target at `ref` defines. A target that the discriminator\n * scan gave its property got none: the scan made that property required, but the other keys were\n * lost too. With `discriminator-member-required` only keys the target requires already are left\n * out (#2162).\n */\nfunction keysToRequire(\n ref: string,\n target: SchemaObject,\n required: readonly string[],\n request: SchemaRequest,\n): readonly string[] {\n const defined = required.filter((key) => Boolean(target.properties?.[key]));\n if (!request.context.discriminators.isHandled(ref)) {\n return defined;\n }\n if (!request.context.options.fixes.has(FIX.DISCRIMINATOR_MEMBER_REQUIRED)) {\n return [];\n }\n return defined.filter((key) => !target.required?.includes(key));\n}\n\n/** A `$ref` item gets the parent's `required` keys that its target defines (`WithRequired`). */\nfunction refItemType(\n item: { readonly $ref: string },\n required: readonly string[],\n request: SchemaRequest,\n): IrType {\n const type = request.transformNested(item, request.location);\n const resolved = request.context.refs.resolve(item.$ref) as SchemaObject | undefined;\n if (!resolved || typeof resolved !== \"object\" || !(\"properties\" in resolved)) {\n return type;\n }\n const keys = keysToRequire(item.$ref, resolved, required, request);\n if (keys.length === 0) {\n return type;\n }\n request.context.footer.requireWithRequired();\n return withRequiredKeys(requirableRefType(item.$ref, type, request), keys);\n}\n\n/** An inline item merges the parent's `required` keys with its own. */\nfunction inlineItemType(item: Schema, required: readonly string[], request: SchemaRequest): IrType {\n const own =\n typeof item === \"object\" && Array.isArray((item as SchemaObject).required)\n ? ((item as SchemaObject).required ?? [])\n : [];\n return request.transformNested(\n { ...(item as SchemaObject), required: [...required, ...own] },\n request.location,\n );\n}\n\n/**\n * The union's own keywords at the union's location, so nested names (enums) stay the union's.\n * Null when the union has none.\n */\nfunction ownKeywordsType(own: SchemaObject, ref: string, request: SchemaRequest): IrType | null {\n return combinedType(own, { ...request, location: { ...request.location, path: ref } });\n}\n\n/**\n * An `allOf` item; one with a discriminator omits that property (the parent redefines it). A\n * `$ref` to a discriminated union is not such a parent: for a member of the union it is the\n * union's own keywords, since the union contains the member (#1665); with\n * `allof-discriminated-union` it is the union, since `Omit` on a union drops keys (#1464), unless\n * the union's mapping names the schema: then it is a member, as the discriminator scan has it.\n */\nfunction allOfItemType(\n item: Schema,\n required: readonly string[],\n request: SchemaRequest,\n): IrType | null {\n const isRef = isRefItem(item);\n const discriminator =\n (isRef && request.context.discriminators.objectAt(item.$ref)) ||\n (item as SchemaObject).discriminator;\n const propertyName = discriminator?.propertyName;\n const unionItem = isRef && propertyName ? unionItemOf(item.$ref, request) : undefined;\n if (isRef && propertyName && unionItem?.isMember) {\n const own = unionOwnKeywords(unionItem.union, propertyName, required);\n return ownKeywordsType(own, item.$ref, request);\n }\n const type = isRef\n ? refItemType(item, required, request)\n : inlineItemType(item, required, request);\n const isUnion =\n unionItem !== undefined &&\n !unionItem.isMapped &&\n request.context.options.fixes.has(FIX.ALLOF_DISCRIMINATED_UNION);\n if (!propertyName || isUnion) {\n return type;\n }\n // With `discriminator-values` the schema also redefines the properties of other owners above\n // it, so no item may keep a value of its own for them (a parent mapped as `content`).\n const { path } = request.location;\n const others = path === undefined ? [] : request.context.discriminators.otherPropertiesAt(path);\n return omitKeys(type, [propertyName, ...others]);\n}\n\nfunction allOfTypes(\n items: readonly Schema[],\n required: readonly string[],\n request: SchemaRequest,\n): IrType[] {\n return items.flatMap((item) => allOfItemType(item, required, request) ?? []);\n}\n\nfunction oneOfType(previous: IrType | null, variants: readonly IrType[]): IrType {\n const before = previous === null ? [] : [previous];\n // Only `oneOf` may list primitives; then it stays a flat union.\n return variants.every(isPrimitiveType)\n ? unionOf([...before, ...variants])\n : intersectionOf([...before, unionOf(variants)]);\n}\n\n/**\n * `anyOf` is a union: TypeScript unions are not exclusive, which matches anyOf better than oneOf.\n * By default the sibling type is one more member, as in the original. With `anyof-properties` it\n * is intersected with the union, so it applies to every variant (#2380); for a `type` list, each\n * listed type has applied `anyOf` already (`multipleTypes`), so the list is the whole type.\n */\nfunction anyOfType(\n previous: IrType | null,\n schema: SchemaObject,\n request: SchemaRequest,\n): IrType | null {\n const variants = variantTypes(schema.anyOf ?? [], \"anyOf\", request);\n if (variants.length === 0 || previous === null) {\n return variants.length === 0 ? previous : unionOf(variants);\n }\n if (!request.context.options.fixes.has(FIX.ANYOF_PROPERTIES)) {\n return unionOf([previous, ...variants]);\n }\n return Array.isArray(schema.type) ? previous : intersectionOf([previous, unionOf(variants)]);\n}\n\n/** Object enums are written as `oneOf` over their values. */\nfunction oneOfVariants(schema: SchemaObject): readonly Schema[] {\n const objectEnum =\n \"type\" in schema && schema.type === \"object\" && (schema.enum as Schema[] | undefined);\n return schema.oneOf || objectEnum || [];\n}\n\n/**\n * The parent's `required` keys, plus the keys of left-out `allOf` members (`allof-required`).\n * Without such keys the parent's list stays as it is, duplicates included, as in the original.\n */\nfunction requiredKeys(schema: SchemaObject, presenceKeys: readonly string[]): readonly string[] {\n const own = schema.required ?? [];\n return presenceKeys.length === 0 ? own : [...new Set([...own, ...presenceKeys])];\n}\n\nfunction composedType(schema: SchemaObject, request: SchemaRequest): IrType | null {\n let type: IrType | null = null;\n const core = coreType(schema, request);\n const { members, required } = allOfMembers(schema.allOf ?? [], request);\n const allOf = allOfTypes(members, requiredKeys(schema, required), request);\n if (core !== null || allOf.length > 0) {\n const allOfType = allOf.length > 0 ? [intersectionOf(allOf)] : [];\n type = intersectionOf([...(core === null ? [] : [core]), ...allOfType]);\n }\n return variantsType(type, schema, request);\n}\n\n/** `anyOf`, then `oneOf`, applied to the core and `allOf` type (`anyof-oneof-required` first). */\nfunction variantsType(\n previous: IrType | null,\n schema: SchemaObject,\n request: SchemaRequest,\n): IrType | null {\n const type =\n requiredVariantsType(previous, schema, schema.anyOf ?? [], request) ??\n anyOfType(previous, schema, request);\n const oneOfRequired = requiredVariantsType(type, schema, schema.oneOf ?? [], request);\n if (oneOfRequired !== null) {\n return oneOfRequired;\n }\n const oneOf = variantTypes(oneOfVariants(schema), \"oneOf\", request);\n return oneOf.length > 0 ? oneOfType(type, oneOf) : type;\n}\n\n/** The composed type, with the `unevaluatedProperties` index signature when it applies. */\nfunction combinedType(schema: SchemaObject, request: SchemaRequest): IrType | null {\n const type = composedType(schema, request);\n const unevaluated = unevaluatedPropertiesType(schema, type, request);\n if (unevaluated === null) {\n return type;\n }\n if (type === null) {\n return unevaluated;\n }\n // One flat intersection, so an `allOf` intersection is not printed in parentheses.\n const parts = type.kind === \"intersection\" ? type.types : [type];\n return intersectionOf([...parts, unevaluated]);\n}\n\n/**\n * The schema with composition: core type and `allOf` intersected, then `anyOf` and `oneOf`. Without\n * any of them: `Record<string, never>` (or `unknown` with `--empty-objects-unknown`) when `type` is\n * present, else `unknown`. `nullable: true` adds `null`, except to the shared `unknown`.\n */\nexport function compositionType(schema: SchemaObject, request: SchemaRequest): IrType {\n const { emptyObjectsUnknown } = request.context.options;\n const empty =\n \"type\" in schema\n ? irRecord(irKeyword(\"string\"), emptyObjectsUnknown ? UNKNOWN_TYPE : irKeyword(\"never\"))\n : UNKNOWN_TYPE;\n const type = combinedType(schema, request) ?? empty;\n return type !== UNKNOWN_TYPE && schema.nullable ? nullableOf([type]) : type;\n}\n"],"names":["createRef","FIX","withRequiredKeys","requirableRefType","unionItemOf","unionOwnKeywords","omitKeys","isPrimitiveType","unionOf","intersectionOf","coreType","allOfMembers","requiredVariantsType","unevaluatedPropertiesType","irRecord","irKeyword","UNKNOWN_TYPE","nullableOf"],"mappings":";;;;;;;;;;;;;;AAuBA,SAAS,YAAA,CACP,QAAA,EACA,OAAA,EACA,OAAA,EACU;AACV,EAAA,OAAO,QAAA,CAAS,GAAA;AAAA,IAAI,CAAC,OAAA,EAAS,KAAA,KAC5B,OAAA,CAAQ,gBAAgB,OAAA,EAAS;AAAA,MAC/B,GAAG,OAAA,CAAQ,QAAA;AAAA,MACX,IAAA,EAAMA,qBAAA,CAAU,CAAC,OAAA,CAAQ,QAAA,CAAS,MAAM,OAAA,EAAS,MAAA,CAAO,KAAK,CAAC,CAAC;AAAA,KAChE;AAAA,GACH;AACF;AAMA,SAAS,UAAU,IAAA,EAAiD;AAClE,EAAA,OAAO,MAAA,IAAW,IAAA;AACpB;AAQA,SAAS,aAAA,CACP,GAAA,EACA,MAAA,EACA,QAAA,EACA,OAAA,EACmB;AACnB,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,MAAA,CAAO,CAAC,GAAA,KAAQ,QAAQ,MAAA,CAAO,UAAA,GAAa,GAAG,CAAC,CAAC,CAAA;AAC1E,EAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,CAAQ,cAAA,CAAe,SAAA,CAAU,GAAG,CAAA,EAAG;AAClD,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,QAAQ,OAAA,CAAQ,OAAA,CAAQ,MAAM,GAAA,CAAIC,eAAA,CAAI,6BAA6B,CAAA,EAAG;AACzE,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,OAAO,OAAA,CAAQ,OAAO,CAAC,GAAA,KAAQ,CAAC,MAAA,CAAO,QAAA,EAAU,QAAA,CAAS,GAAG,CAAC,CAAA;AAChE;AAGA,SAAS,WAAA,CACP,IAAA,EACA,QAAA,EACA,OAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,eAAA,CAAgB,IAAA,EAAM,QAAQ,QAAQ,CAAA;AAC3D,EAAA,MAAM,WAAW,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,KAAK,IAAI,CAAA;AACvD,EAAA,IAAI,CAAC,QAAA,IAAY,OAAO,aAAa,QAAA,IAAY,EAAE,gBAAgB,QAAA,CAAA,EAAW;AAC5E,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAO,aAAA,CAAc,IAAA,CAAK,IAAA,EAAM,QAAA,EAAU,UAAU,OAAO,CAAA;AACjE,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAA,CAAQ,OAAA,CAAQ,OAAO,mBAAA,EAAoB;AAC3C,EAAA,OAAOC,iCAAiBC,6BAAA,CAAkB,IAAA,CAAK,MAAM,IAAA,EAAM,OAAO,GAAG,IAAI,CAAA;AAC3E;AAGA,SAAS,cAAA,CAAe,IAAA,EAAc,QAAA,EAA6B,OAAA,EAAgC;AACjG,EAAA,MAAM,GAAA,GACJ,OAAO,IAAA,KAAS,QAAA,IAAY,KAAA,CAAM,OAAA,CAAS,IAAA,CAAsB,QAAQ,CAAA,GACnE,IAAA,CAAsB,QAAA,IAAY,KACpC,EAAC;AACP,EAAA,OAAO,OAAA,CAAQ,eAAA;AAAA,IACb,EAAE,GAAI,IAAA,EAAuB,QAAA,EAAU,CAAC,GAAG,QAAA,EAAU,GAAG,GAAG,CAAA,EAAE;AAAA,IAC7D,OAAA,CAAQ;AAAA,GACV;AACF;AAMA,SAAS,eAAA,CAAgB,GAAA,EAAmB,GAAA,EAAa,OAAA,EAAuC;AAC9F,EAAA,OAAO,YAAA,CAAa,GAAA,EAAK,EAAE,GAAG,OAAA,EAAS,QAAA,EAAU,EAAE,GAAG,OAAA,CAAQ,QAAA,EAAU,IAAA,EAAM,GAAA,IAAO,CAAA;AACvF;AASA,SAAS,aAAA,CACP,IAAA,EACA,QAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,KAAA,GAAQ,UAAU,IAAI,CAAA;AAC5B,EAAA,MAAM,aAAA,GACH,SAAS,OAAA,CAAQ,OAAA,CAAQ,eAAe,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,IAC1D,IAAA,CAAsB,aAAA;AACzB,EAAA,MAAM,eAAe,aAAA,EAAe,YAAA;AACpC,EAAA,MAAM,YAAY,KAAA,IAAS,YAAA,GAAeC,+BAAY,IAAA,CAAK,IAAA,EAAM,OAAO,CAAA,GAAI,MAAA;AAC5E,EAAA,IAAI,KAAA,IAAS,YAAA,IAAgB,SAAA,EAAW,QAAA,EAAU;AAChD,IAAA,MAAM,GAAA,GAAMC,mCAAA,CAAiB,SAAA,CAAU,KAAA,EAAO,cAAc,QAAQ,CAAA;AACpE,IAAA,OAAO,eAAA,CAAgB,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,OAAO,CAAA;AAAA,EAChD;AACA,EAAA,MAAM,IAAA,GAAO,KAAA,GACT,WAAA,CAAY,IAAA,EAAM,QAAA,EAAU,OAAO,CAAA,GACnC,cAAA,CAAe,IAAA,EAAM,QAAA,EAAU,OAAO,CAAA;AAC1C,EAAA,MAAM,OAAA,GACJ,SAAA,KAAc,MAAA,IACd,CAAC,SAAA,CAAU,QAAA,IACX,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAIJ,eAAA,CAAI,yBAAyB,CAAA;AACjE,EAAA,IAAI,CAAC,gBAAgB,OAAA,EAAS;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,OAAA,CAAQ,QAAA;AACzB,EAAA,MAAM,MAAA,GAAS,SAAS,MAAA,GAAY,KAAK,OAAA,CAAQ,OAAA,CAAQ,cAAA,CAAe,iBAAA,CAAkB,IAAI,CAAA;AAC9F,EAAA,OAAOK,yBAAS,IAAA,EAAM,CAAC,YAAA,EAAc,GAAG,MAAM,CAAC,CAAA;AACjD;AAEA,SAAS,UAAA,CACP,KAAA,EACA,QAAA,EACA,OAAA,EACU;AACV,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS,aAAA,CAAc,MAAM,QAAA,EAAU,OAAO,CAAA,IAAK,EAAE,CAAA;AAC7E;AAEA,SAAS,SAAA,CAAU,UAAyB,QAAA,EAAqC;AAC/E,EAAA,MAAM,SAAS,QAAA,KAAa,IAAA,GAAO,EAAC,GAAI,CAAC,QAAQ,CAAA;AAEjD,EAAA,OAAO,SAAS,KAAA,CAAMC,+BAAe,IACjCC,uBAAA,CAAQ,CAAC,GAAG,MAAA,EAAQ,GAAG,QAAQ,CAAC,CAAA,GAChCC,+BAAe,CAAC,GAAG,QAAQD,uBAAA,CAAQ,QAAQ,CAAC,CAAC,CAAA;AACnD;AAQA,SAAS,SAAA,CACP,QAAA,EACA,MAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,WAAW,YAAA,CAAa,MAAA,CAAO,SAAS,EAAC,EAAG,SAAS,OAAO,CAAA;AAClE,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,IAAK,QAAA,KAAa,IAAA,EAAM;AAC9C,IAAA,OAAO,QAAA,CAAS,MAAA,KAAW,CAAA,GAAI,QAAA,GAAWA,wBAAQ,QAAQ,CAAA;AAAA,EAC5D;AACA,EAAA,IAAI,CAAC,QAAQ,OAAA,CAAQ,OAAA,CAAQ,MAAM,GAAA,CAAIP,eAAA,CAAI,gBAAgB,CAAA,EAAG;AAC5D,IAAA,OAAOO,uBAAA,CAAQ,CAAC,QAAA,EAAU,GAAG,QAAQ,CAAC,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,GAAI,QAAA,GAAWC,8BAAA,CAAe,CAAC,QAAA,EAAUD,uBAAA,CAAQ,QAAQ,CAAC,CAAC,CAAA;AAC7F;AAGA,SAAS,cAAc,MAAA,EAAyC;AAC9D,EAAA,MAAM,aACJ,MAAA,IAAU,MAAA,IAAU,MAAA,CAAO,IAAA,KAAS,YAAa,MAAA,CAAO,IAAA;AAC1D,EAAA,OAAO,MAAA,CAAO,KAAA,IAAS,UAAA,IAAc,EAAC;AACxC;AAMA,SAAS,YAAA,CAAa,QAAsB,YAAA,EAAoD;AAC9F,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,QAAA,IAAY,EAAC;AAChC,EAAA,OAAO,YAAA,CAAa,MAAA,KAAW,CAAA,GAAI,GAAA,GAAM,CAAC,mBAAG,IAAI,GAAA,CAAI,CAAC,GAAG,GAAA,EAAK,GAAG,YAAY,CAAC,CAAC,CAAA;AACjF;AAEA,SAAS,YAAA,CAAa,QAAsB,OAAA,EAAuC;AACjF,EAAA,IAAI,IAAA,GAAsB,IAAA;AAC1B,EAAA,MAAM,IAAA,GAAOE,iBAAA,CAAS,MAAA,EAAQ,OAAO,CAAA;AACrC,EAAA,MAAM,EAAE,SAAS,QAAA,EAAS,GAAIC,6BAAa,MAAA,CAAO,KAAA,IAAS,EAAC,EAAG,OAAO,CAAA;AACtE,EAAA,MAAM,QAAQ,UAAA,CAAW,OAAA,EAAS,aAAa,MAAA,EAAQ,QAAQ,GAAG,OAAO,CAAA;AACzE,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACrC,IAAA,MAAM,SAAA,GAAY,MAAM,MAAA,GAAS,CAAA,GAAI,CAACF,8BAAA,CAAe,KAAK,CAAC,CAAA,GAAI,EAAC;AAChE,IAAA,IAAA,GAAOA,8BAAA,CAAe,CAAC,GAAI,IAAA,KAAS,IAAA,GAAO,EAAC,GAAI,CAAC,IAAI,CAAA,EAAI,GAAG,SAAS,CAAC,CAAA;AAAA,EACxE;AACA,EAAA,OAAO,YAAA,CAAa,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAA;AAC3C;AAGA,SAAS,YAAA,CACP,QAAA,EACA,MAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,IAAA,GACJG,qCAAA,CAAqB,QAAA,EAAU,MAAA,EAAQ,MAAA,CAAO,KAAA,IAAS,EAAC,EAAG,OAAO,CAAA,IAClE,SAAA,CAAU,QAAA,EAAU,QAAQ,OAAO,CAAA;AACrC,EAAA,MAAM,aAAA,GAAgBA,sCAAqB,IAAA,EAAM,MAAA,EAAQ,OAAO,KAAA,IAAS,IAAI,OAAO,CAAA;AACpF,EAAA,IAAI,kBAAkB,IAAA,EAAM;AAC1B,IAAA,OAAO,aAAA;AAAA,EACT;AACA,EAAA,MAAM,QAAQ,YAAA,CAAa,aAAA,CAAc,MAAM,CAAA,EAAG,SAAS,OAAO,CAAA;AAClE,EAAA,OAAO,MAAM,MAAA,GAAS,CAAA,GAAI,SAAA,CAAU,IAAA,EAAM,KAAK,CAAA,GAAI,IAAA;AACrD;AAGA,SAAS,YAAA,CAAa,QAAsB,OAAA,EAAuC;AACjF,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,MAAA,EAAQ,OAAO,CAAA;AACzC,EAAA,MAAM,WAAA,GAAcC,+CAAA,CAA0B,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAA;AACnE,EAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,KAAS,iBAAiB,IAAA,CAAK,KAAA,GAAQ,CAAC,IAAI,CAAA;AAC/D,EAAA,OAAOJ,8BAAA,CAAe,CAAC,GAAG,KAAA,EAAO,WAAW,CAAC,CAAA;AAC/C;AAOO,SAAS,eAAA,CAAgB,QAAsB,OAAA,EAAgC;AACpF,EAAA,MAAM,EAAE,mBAAA,EAAoB,GAAI,OAAA,CAAQ,OAAA,CAAQ,OAAA;AAChD,EAAA,MAAM,KAAA,GACJ,MAAA,IAAU,MAAA,GACNK,qBAAA,CAASC,sBAAA,CAAU,QAAQ,CAAA,EAAG,mBAAA,GAAsBC,wBAAA,GAAeD,sBAAA,CAAU,OAAO,CAAC,CAAA,GACrFC,wBAAA;AACN,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,MAAA,EAAQ,OAAO,CAAA,IAAK,KAAA;AAC9C,EAAA,OAAO,IAAA,KAASA,4BAAgB,MAAA,CAAO,QAAA,GAAWC,2BAAW,CAAC,IAAI,CAAC,CAAA,GAAI,IAAA;AACzE;;"}
|
|
1
|
+
{"version":3,"file":"composition-type.cjs","sources":["../../../../src/application/transform/schema/composition-type.ts"],"sourcesContent":["import { irKeyword, irRecord } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport { appendPointer } from \"../../../domain/openapi/json-pointer.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { FIX } from \"../../../domain/output-fixes.js\";\nimport { requirableRefType } from \"../ref-pointer/pointer-type.js\";\nimport { UNKNOWN_TYPE } from \"../shared-types.js\";\nimport {\n intersectionOf,\n isPrimitiveType,\n nullableOf,\n omitKeys,\n unionOf,\n withRequiredKeys,\n} from \"../type-combinators.js\";\nimport { coreType } from \"./core-type.js\";\nimport { unionItemOf, unionOwnKeywords } from \"./discriminated-union.js\";\nimport { allOfMembers } from \"./presence-members.js\";\nimport { requiredVariantsType } from \"./required-variants.js\";\nimport type { SchemaRequest } from \"./schema-rule.js\";\nimport { unevaluatedPropertiesType } from \"./unevaluated-properties.js\";\n\n/** `anyOf` / `oneOf` variants; the position is part of the path so nested names stay unique. */\nfunction variantTypes(\n variants: readonly Schema[],\n keyword: \"anyOf\" | \"oneOf\",\n request: SchemaRequest,\n): IrType[] {\n return variants.map((variant, index) =>\n request.transformNested(variant, {\n ...request.location,\n path: appendPointer(request.location.path, [keyword, index]),\n }),\n );\n}\n\n/**\n * Whether an `allOf` item is a `$ref`. Like the original, this uses `in`, so a boolean item throws\n * a TypeError instead of being accepted.\n */\nfunction isRefItem(item: Schema): item is { readonly $ref: string } {\n return \"$ref\" in (item as object);\n}\n\n/**\n * The parent's `required` keys that the target at `ref` defines. A target that the discriminator\n * scan gave its property got none: the scan made that property required, but the other keys were\n * lost too. With `discriminator-member-required` only keys the target requires already are left\n * out (#2162).\n */\nfunction keysToRequire(\n ref: string,\n target: SchemaObject,\n required: readonly string[],\n request: SchemaRequest,\n): readonly string[] {\n const defined = required.filter((key) => Boolean(target.properties?.[key]));\n if (!request.context.discriminators.isHandled(ref)) {\n return defined;\n }\n if (!request.context.options.fixes.has(FIX.DISCRIMINATOR_MEMBER_REQUIRED)) {\n return [];\n }\n return defined.filter((key) => !target.required?.includes(key));\n}\n\n/** A `$ref` item gets the parent's `required` keys that its target defines (`WithRequired`). */\nfunction refItemType(\n item: { readonly $ref: string },\n required: readonly string[],\n request: SchemaRequest,\n): IrType {\n const type = request.transformNested(item, request.location);\n const resolved = request.context.refs.resolve(item.$ref) as SchemaObject | undefined;\n if (!resolved || typeof resolved !== \"object\" || !(\"properties\" in resolved)) {\n return type;\n }\n const keys = keysToRequire(item.$ref, resolved, required, request);\n if (keys.length === 0) {\n return type;\n }\n request.context.footer.requireWithRequired();\n return withRequiredKeys(requirableRefType(item.$ref, type, request), keys);\n}\n\n/** An inline item merges the parent's `required` keys with its own. */\nfunction inlineItemType(item: Schema, required: readonly string[], request: SchemaRequest): IrType {\n const own =\n typeof item === \"object\" && Array.isArray((item as SchemaObject).required)\n ? ((item as SchemaObject).required ?? [])\n : [];\n return request.transformNested(\n { ...(item as SchemaObject), required: [...required, ...own] },\n request.location,\n );\n}\n\n/**\n * The union's own keywords at the union's location, so nested names (enums) stay the union's.\n * Null when the union has none.\n */\nfunction ownKeywordsType(own: SchemaObject, ref: string, request: SchemaRequest): IrType | null {\n return combinedType(own, { ...request, location: { ...request.location, path: ref } });\n}\n\n/**\n * An `allOf` item; one with a discriminator omits that property (the parent redefines it). A\n * `$ref` to a discriminated union is not such a parent: for a member of the union it is the\n * union's own keywords, since the union contains the member (#1665); with\n * `allof-discriminated-union` it is the union, since `Omit` on a union drops keys (#1464), unless\n * the union's mapping names the schema: then it is a member, as the discriminator scan has it.\n */\nfunction allOfItemType(\n item: Schema,\n required: readonly string[],\n request: SchemaRequest,\n): IrType | null {\n const isRef = isRefItem(item);\n const discriminator =\n (isRef && request.context.discriminators.objectAt(item.$ref)) ||\n (item as SchemaObject).discriminator;\n const propertyName = discriminator?.propertyName;\n const unionItem = isRef && propertyName ? unionItemOf(item.$ref, request) : undefined;\n if (isRef && propertyName && unionItem?.isMember) {\n const own = unionOwnKeywords(unionItem.union, propertyName, required);\n return ownKeywordsType(own, item.$ref, request);\n }\n const type = isRef\n ? refItemType(item, required, request)\n : inlineItemType(item, required, request);\n const isUnion =\n unionItem !== undefined &&\n !unionItem.isMapped &&\n request.context.options.fixes.has(FIX.ALLOF_DISCRIMINATED_UNION);\n if (!propertyName || isUnion) {\n return type;\n }\n // With `discriminator-values` the schema also redefines the properties of other owners above\n // it, so no item may keep a value of its own for them (a parent mapped as `content`).\n const { path } = request.location;\n const others = path === undefined ? [] : request.context.discriminators.otherPropertiesAt(path);\n return omitKeys(type, [propertyName, ...others]);\n}\n\nfunction allOfTypes(\n items: readonly Schema[],\n required: readonly string[],\n request: SchemaRequest,\n): IrType[] {\n return items.flatMap((item) => allOfItemType(item, required, request) ?? []);\n}\n\nfunction oneOfType(previous: IrType | null, variants: readonly IrType[]): IrType {\n const before = previous === null ? [] : [previous];\n // Only `oneOf` may list primitives; then it stays a flat union.\n return variants.every(isPrimitiveType)\n ? unionOf([...before, ...variants])\n : intersectionOf([...before, unionOf(variants)]);\n}\n\n/**\n * `anyOf` is a union: TypeScript unions are not exclusive, which matches anyOf better than oneOf.\n * By default the sibling type is one more member, as in the original. With `anyof-properties` it\n * is intersected with the union, so it applies to every variant (#2380); for a `type` list, each\n * listed type has applied `anyOf` already (`multipleTypes`), so the list is the whole type.\n */\nfunction anyOfType(\n previous: IrType | null,\n schema: SchemaObject,\n request: SchemaRequest,\n): IrType | null {\n const variants = variantTypes(schema.anyOf ?? [], \"anyOf\", request);\n if (variants.length === 0 || previous === null) {\n return variants.length === 0 ? previous : unionOf(variants);\n }\n if (!request.context.options.fixes.has(FIX.ANYOF_PROPERTIES)) {\n return unionOf([previous, ...variants]);\n }\n return Array.isArray(schema.type) ? previous : intersectionOf([previous, unionOf(variants)]);\n}\n\n/** Object enums are written as `oneOf` over their values. */\nfunction oneOfVariants(schema: SchemaObject): readonly Schema[] {\n const objectEnum =\n \"type\" in schema && schema.type === \"object\" && (schema.enum as Schema[] | undefined);\n return schema.oneOf || objectEnum || [];\n}\n\n/**\n * The parent's `required` keys, plus the keys of left-out `allOf` members (`allof-required`).\n * Without such keys the parent's list stays as it is, duplicates included, as in the original.\n */\nfunction requiredKeys(schema: SchemaObject, presenceKeys: readonly string[]): readonly string[] {\n const own = schema.required ?? [];\n return presenceKeys.length === 0 ? own : [...new Set([...own, ...presenceKeys])];\n}\n\nfunction composedType(schema: SchemaObject, request: SchemaRequest): IrType | null {\n let type: IrType | null = null;\n const core = coreType(schema, request);\n const { members, required } = allOfMembers(schema.allOf ?? [], request);\n const allOf = allOfTypes(members, requiredKeys(schema, required), request);\n if (core !== null || allOf.length > 0) {\n const allOfType = allOf.length > 0 ? [intersectionOf(allOf)] : [];\n type = intersectionOf([...(core === null ? [] : [core]), ...allOfType]);\n }\n return variantsType(type, schema, request);\n}\n\n/** `anyOf`, then `oneOf`, applied to the core and `allOf` type (`anyof-oneof-required` first). */\nfunction variantsType(\n previous: IrType | null,\n schema: SchemaObject,\n request: SchemaRequest,\n): IrType | null {\n const type =\n requiredVariantsType(previous, schema, schema.anyOf ?? [], request) ??\n anyOfType(previous, schema, request);\n const oneOfRequired = requiredVariantsType(type, schema, schema.oneOf ?? [], request);\n if (oneOfRequired !== null) {\n return oneOfRequired;\n }\n const oneOf = variantTypes(oneOfVariants(schema), \"oneOf\", request);\n return oneOf.length > 0 ? oneOfType(type, oneOf) : type;\n}\n\n/** The composed type, with the `unevaluatedProperties` index signature when it applies. */\nfunction combinedType(schema: SchemaObject, request: SchemaRequest): IrType | null {\n const type = composedType(schema, request);\n const unevaluated = unevaluatedPropertiesType(schema, type, request);\n if (unevaluated === null) {\n return type;\n }\n if (type === null) {\n return unevaluated;\n }\n // One flat intersection, so an `allOf` intersection is not printed in parentheses.\n const parts = type.kind === \"intersection\" ? type.types : [type];\n return intersectionOf([...parts, unevaluated]);\n}\n\n/**\n * The schema with composition: core type and `allOf` intersected, then `anyOf` and `oneOf`. Without\n * any of them: `Record<string, never>` (or `unknown` with `--empty-objects-unknown`) when `type` is\n * present, else `unknown`. `nullable: true` adds `null`, except to the shared `unknown`.\n */\nexport function compositionType(schema: SchemaObject, request: SchemaRequest): IrType {\n const { emptyObjectsUnknown } = request.context.options;\n const empty =\n \"type\" in schema\n ? irRecord(irKeyword(\"string\"), emptyObjectsUnknown ? UNKNOWN_TYPE : irKeyword(\"never\"))\n : UNKNOWN_TYPE;\n const type = combinedType(schema, request) ?? empty;\n return type !== UNKNOWN_TYPE && schema.nullable ? nullableOf([type]) : type;\n}\n"],"names":["appendPointer","FIX","withRequiredKeys","requirableRefType","unionItemOf","unionOwnKeywords","omitKeys","isPrimitiveType","unionOf","intersectionOf","coreType","allOfMembers","requiredVariantsType","unevaluatedPropertiesType","irRecord","irKeyword","UNKNOWN_TYPE","nullableOf"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { irRecord, irKeyword } from '../../../domain/ir/constructors.mjs';
|
|
2
|
-
import {
|
|
2
|
+
import { appendPointer } from '../../../domain/openapi/json-pointer.mjs';
|
|
3
3
|
import { FIX } from '../../../domain/output-fixes.mjs';
|
|
4
4
|
import { requirableRefType } from '../ref-pointer/pointer-type.mjs';
|
|
5
5
|
import { UNKNOWN_TYPE } from '../shared-types.mjs';
|
|
@@ -14,7 +14,7 @@ function variantTypes(variants, keyword, request) {
|
|
|
14
14
|
return variants.map(
|
|
15
15
|
(variant, index) => request.transformNested(variant, {
|
|
16
16
|
...request.location,
|
|
17
|
-
path:
|
|
17
|
+
path: appendPointer(request.location.path, [keyword, index])
|
|
18
18
|
})
|
|
19
19
|
);
|
|
20
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composition-type.mjs","sources":["../../../../src/application/transform/schema/composition-type.ts"],"sourcesContent":["import { irKeyword, irRecord } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport { createRef } from \"../../../domain/openapi/json-pointer.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { FIX } from \"../../../domain/output-fixes.js\";\nimport { requirableRefType } from \"../ref-pointer/pointer-type.js\";\nimport { UNKNOWN_TYPE } from \"../shared-types.js\";\nimport {\n intersectionOf,\n isPrimitiveType,\n nullableOf,\n omitKeys,\n unionOf,\n withRequiredKeys,\n} from \"../type-combinators.js\";\nimport { coreType } from \"./core-type.js\";\nimport { unionItemOf, unionOwnKeywords } from \"./discriminated-union.js\";\nimport { allOfMembers } from \"./presence-members.js\";\nimport { requiredVariantsType } from \"./required-variants.js\";\nimport type { SchemaRequest } from \"./schema-rule.js\";\nimport { unevaluatedPropertiesType } from \"./unevaluated-properties.js\";\n\n/** `anyOf` / `oneOf` variants; the position is part of the path so nested names stay unique. */\nfunction variantTypes(\n variants: readonly Schema[],\n keyword: \"anyOf\" | \"oneOf\",\n request: SchemaRequest,\n): IrType[] {\n return variants.map((variant, index) =>\n request.transformNested(variant, {\n ...request.location,\n path: createRef([request.location.path, keyword, String(index)]),\n }),\n );\n}\n\n/**\n * Whether an `allOf` item is a `$ref`. Like the original, this uses `in`, so a boolean item throws\n * a TypeError instead of being accepted.\n */\nfunction isRefItem(item: Schema): item is { readonly $ref: string } {\n return \"$ref\" in (item as object);\n}\n\n/**\n * The parent's `required` keys that the target at `ref` defines. A target that the discriminator\n * scan gave its property got none: the scan made that property required, but the other keys were\n * lost too. With `discriminator-member-required` only keys the target requires already are left\n * out (#2162).\n */\nfunction keysToRequire(\n ref: string,\n target: SchemaObject,\n required: readonly string[],\n request: SchemaRequest,\n): readonly string[] {\n const defined = required.filter((key) => Boolean(target.properties?.[key]));\n if (!request.context.discriminators.isHandled(ref)) {\n return defined;\n }\n if (!request.context.options.fixes.has(FIX.DISCRIMINATOR_MEMBER_REQUIRED)) {\n return [];\n }\n return defined.filter((key) => !target.required?.includes(key));\n}\n\n/** A `$ref` item gets the parent's `required` keys that its target defines (`WithRequired`). */\nfunction refItemType(\n item: { readonly $ref: string },\n required: readonly string[],\n request: SchemaRequest,\n): IrType {\n const type = request.transformNested(item, request.location);\n const resolved = request.context.refs.resolve(item.$ref) as SchemaObject | undefined;\n if (!resolved || typeof resolved !== \"object\" || !(\"properties\" in resolved)) {\n return type;\n }\n const keys = keysToRequire(item.$ref, resolved, required, request);\n if (keys.length === 0) {\n return type;\n }\n request.context.footer.requireWithRequired();\n return withRequiredKeys(requirableRefType(item.$ref, type, request), keys);\n}\n\n/** An inline item merges the parent's `required` keys with its own. */\nfunction inlineItemType(item: Schema, required: readonly string[], request: SchemaRequest): IrType {\n const own =\n typeof item === \"object\" && Array.isArray((item as SchemaObject).required)\n ? ((item as SchemaObject).required ?? [])\n : [];\n return request.transformNested(\n { ...(item as SchemaObject), required: [...required, ...own] },\n request.location,\n );\n}\n\n/**\n * The union's own keywords at the union's location, so nested names (enums) stay the union's.\n * Null when the union has none.\n */\nfunction ownKeywordsType(own: SchemaObject, ref: string, request: SchemaRequest): IrType | null {\n return combinedType(own, { ...request, location: { ...request.location, path: ref } });\n}\n\n/**\n * An `allOf` item; one with a discriminator omits that property (the parent redefines it). A\n * `$ref` to a discriminated union is not such a parent: for a member of the union it is the\n * union's own keywords, since the union contains the member (#1665); with\n * `allof-discriminated-union` it is the union, since `Omit` on a union drops keys (#1464), unless\n * the union's mapping names the schema: then it is a member, as the discriminator scan has it.\n */\nfunction allOfItemType(\n item: Schema,\n required: readonly string[],\n request: SchemaRequest,\n): IrType | null {\n const isRef = isRefItem(item);\n const discriminator =\n (isRef && request.context.discriminators.objectAt(item.$ref)) ||\n (item as SchemaObject).discriminator;\n const propertyName = discriminator?.propertyName;\n const unionItem = isRef && propertyName ? unionItemOf(item.$ref, request) : undefined;\n if (isRef && propertyName && unionItem?.isMember) {\n const own = unionOwnKeywords(unionItem.union, propertyName, required);\n return ownKeywordsType(own, item.$ref, request);\n }\n const type = isRef\n ? refItemType(item, required, request)\n : inlineItemType(item, required, request);\n const isUnion =\n unionItem !== undefined &&\n !unionItem.isMapped &&\n request.context.options.fixes.has(FIX.ALLOF_DISCRIMINATED_UNION);\n if (!propertyName || isUnion) {\n return type;\n }\n // With `discriminator-values` the schema also redefines the properties of other owners above\n // it, so no item may keep a value of its own for them (a parent mapped as `content`).\n const { path } = request.location;\n const others = path === undefined ? [] : request.context.discriminators.otherPropertiesAt(path);\n return omitKeys(type, [propertyName, ...others]);\n}\n\nfunction allOfTypes(\n items: readonly Schema[],\n required: readonly string[],\n request: SchemaRequest,\n): IrType[] {\n return items.flatMap((item) => allOfItemType(item, required, request) ?? []);\n}\n\nfunction oneOfType(previous: IrType | null, variants: readonly IrType[]): IrType {\n const before = previous === null ? [] : [previous];\n // Only `oneOf` may list primitives; then it stays a flat union.\n return variants.every(isPrimitiveType)\n ? unionOf([...before, ...variants])\n : intersectionOf([...before, unionOf(variants)]);\n}\n\n/**\n * `anyOf` is a union: TypeScript unions are not exclusive, which matches anyOf better than oneOf.\n * By default the sibling type is one more member, as in the original. With `anyof-properties` it\n * is intersected with the union, so it applies to every variant (#2380); for a `type` list, each\n * listed type has applied `anyOf` already (`multipleTypes`), so the list is the whole type.\n */\nfunction anyOfType(\n previous: IrType | null,\n schema: SchemaObject,\n request: SchemaRequest,\n): IrType | null {\n const variants = variantTypes(schema.anyOf ?? [], \"anyOf\", request);\n if (variants.length === 0 || previous === null) {\n return variants.length === 0 ? previous : unionOf(variants);\n }\n if (!request.context.options.fixes.has(FIX.ANYOF_PROPERTIES)) {\n return unionOf([previous, ...variants]);\n }\n return Array.isArray(schema.type) ? previous : intersectionOf([previous, unionOf(variants)]);\n}\n\n/** Object enums are written as `oneOf` over their values. */\nfunction oneOfVariants(schema: SchemaObject): readonly Schema[] {\n const objectEnum =\n \"type\" in schema && schema.type === \"object\" && (schema.enum as Schema[] | undefined);\n return schema.oneOf || objectEnum || [];\n}\n\n/**\n * The parent's `required` keys, plus the keys of left-out `allOf` members (`allof-required`).\n * Without such keys the parent's list stays as it is, duplicates included, as in the original.\n */\nfunction requiredKeys(schema: SchemaObject, presenceKeys: readonly string[]): readonly string[] {\n const own = schema.required ?? [];\n return presenceKeys.length === 0 ? own : [...new Set([...own, ...presenceKeys])];\n}\n\nfunction composedType(schema: SchemaObject, request: SchemaRequest): IrType | null {\n let type: IrType | null = null;\n const core = coreType(schema, request);\n const { members, required } = allOfMembers(schema.allOf ?? [], request);\n const allOf = allOfTypes(members, requiredKeys(schema, required), request);\n if (core !== null || allOf.length > 0) {\n const allOfType = allOf.length > 0 ? [intersectionOf(allOf)] : [];\n type = intersectionOf([...(core === null ? [] : [core]), ...allOfType]);\n }\n return variantsType(type, schema, request);\n}\n\n/** `anyOf`, then `oneOf`, applied to the core and `allOf` type (`anyof-oneof-required` first). */\nfunction variantsType(\n previous: IrType | null,\n schema: SchemaObject,\n request: SchemaRequest,\n): IrType | null {\n const type =\n requiredVariantsType(previous, schema, schema.anyOf ?? [], request) ??\n anyOfType(previous, schema, request);\n const oneOfRequired = requiredVariantsType(type, schema, schema.oneOf ?? [], request);\n if (oneOfRequired !== null) {\n return oneOfRequired;\n }\n const oneOf = variantTypes(oneOfVariants(schema), \"oneOf\", request);\n return oneOf.length > 0 ? oneOfType(type, oneOf) : type;\n}\n\n/** The composed type, with the `unevaluatedProperties` index signature when it applies. */\nfunction combinedType(schema: SchemaObject, request: SchemaRequest): IrType | null {\n const type = composedType(schema, request);\n const unevaluated = unevaluatedPropertiesType(schema, type, request);\n if (unevaluated === null) {\n return type;\n }\n if (type === null) {\n return unevaluated;\n }\n // One flat intersection, so an `allOf` intersection is not printed in parentheses.\n const parts = type.kind === \"intersection\" ? type.types : [type];\n return intersectionOf([...parts, unevaluated]);\n}\n\n/**\n * The schema with composition: core type and `allOf` intersected, then `anyOf` and `oneOf`. Without\n * any of them: `Record<string, never>` (or `unknown` with `--empty-objects-unknown`) when `type` is\n * present, else `unknown`. `nullable: true` adds `null`, except to the shared `unknown`.\n */\nexport function compositionType(schema: SchemaObject, request: SchemaRequest): IrType {\n const { emptyObjectsUnknown } = request.context.options;\n const empty =\n \"type\" in schema\n ? irRecord(irKeyword(\"string\"), emptyObjectsUnknown ? UNKNOWN_TYPE : irKeyword(\"never\"))\n : UNKNOWN_TYPE;\n const type = combinedType(schema, request) ?? empty;\n return type !== UNKNOWN_TYPE && schema.nullable ? nullableOf([type]) : type;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"composition-type.mjs","sources":["../../../../src/application/transform/schema/composition-type.ts"],"sourcesContent":["import { irKeyword, irRecord } from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport { appendPointer } from \"../../../domain/openapi/json-pointer.js\";\nimport type { Schema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { FIX } from \"../../../domain/output-fixes.js\";\nimport { requirableRefType } from \"../ref-pointer/pointer-type.js\";\nimport { UNKNOWN_TYPE } from \"../shared-types.js\";\nimport {\n intersectionOf,\n isPrimitiveType,\n nullableOf,\n omitKeys,\n unionOf,\n withRequiredKeys,\n} from \"../type-combinators.js\";\nimport { coreType } from \"./core-type.js\";\nimport { unionItemOf, unionOwnKeywords } from \"./discriminated-union.js\";\nimport { allOfMembers } from \"./presence-members.js\";\nimport { requiredVariantsType } from \"./required-variants.js\";\nimport type { SchemaRequest } from \"./schema-rule.js\";\nimport { unevaluatedPropertiesType } from \"./unevaluated-properties.js\";\n\n/** `anyOf` / `oneOf` variants; the position is part of the path so nested names stay unique. */\nfunction variantTypes(\n variants: readonly Schema[],\n keyword: \"anyOf\" | \"oneOf\",\n request: SchemaRequest,\n): IrType[] {\n return variants.map((variant, index) =>\n request.transformNested(variant, {\n ...request.location,\n path: appendPointer(request.location.path, [keyword, index]),\n }),\n );\n}\n\n/**\n * Whether an `allOf` item is a `$ref`. Like the original, this uses `in`, so a boolean item throws\n * a TypeError instead of being accepted.\n */\nfunction isRefItem(item: Schema): item is { readonly $ref: string } {\n return \"$ref\" in (item as object);\n}\n\n/**\n * The parent's `required` keys that the target at `ref` defines. A target that the discriminator\n * scan gave its property got none: the scan made that property required, but the other keys were\n * lost too. With `discriminator-member-required` only keys the target requires already are left\n * out (#2162).\n */\nfunction keysToRequire(\n ref: string,\n target: SchemaObject,\n required: readonly string[],\n request: SchemaRequest,\n): readonly string[] {\n const defined = required.filter((key) => Boolean(target.properties?.[key]));\n if (!request.context.discriminators.isHandled(ref)) {\n return defined;\n }\n if (!request.context.options.fixes.has(FIX.DISCRIMINATOR_MEMBER_REQUIRED)) {\n return [];\n }\n return defined.filter((key) => !target.required?.includes(key));\n}\n\n/** A `$ref` item gets the parent's `required` keys that its target defines (`WithRequired`). */\nfunction refItemType(\n item: { readonly $ref: string },\n required: readonly string[],\n request: SchemaRequest,\n): IrType {\n const type = request.transformNested(item, request.location);\n const resolved = request.context.refs.resolve(item.$ref) as SchemaObject | undefined;\n if (!resolved || typeof resolved !== \"object\" || !(\"properties\" in resolved)) {\n return type;\n }\n const keys = keysToRequire(item.$ref, resolved, required, request);\n if (keys.length === 0) {\n return type;\n }\n request.context.footer.requireWithRequired();\n return withRequiredKeys(requirableRefType(item.$ref, type, request), keys);\n}\n\n/** An inline item merges the parent's `required` keys with its own. */\nfunction inlineItemType(item: Schema, required: readonly string[], request: SchemaRequest): IrType {\n const own =\n typeof item === \"object\" && Array.isArray((item as SchemaObject).required)\n ? ((item as SchemaObject).required ?? [])\n : [];\n return request.transformNested(\n { ...(item as SchemaObject), required: [...required, ...own] },\n request.location,\n );\n}\n\n/**\n * The union's own keywords at the union's location, so nested names (enums) stay the union's.\n * Null when the union has none.\n */\nfunction ownKeywordsType(own: SchemaObject, ref: string, request: SchemaRequest): IrType | null {\n return combinedType(own, { ...request, location: { ...request.location, path: ref } });\n}\n\n/**\n * An `allOf` item; one with a discriminator omits that property (the parent redefines it). A\n * `$ref` to a discriminated union is not such a parent: for a member of the union it is the\n * union's own keywords, since the union contains the member (#1665); with\n * `allof-discriminated-union` it is the union, since `Omit` on a union drops keys (#1464), unless\n * the union's mapping names the schema: then it is a member, as the discriminator scan has it.\n */\nfunction allOfItemType(\n item: Schema,\n required: readonly string[],\n request: SchemaRequest,\n): IrType | null {\n const isRef = isRefItem(item);\n const discriminator =\n (isRef && request.context.discriminators.objectAt(item.$ref)) ||\n (item as SchemaObject).discriminator;\n const propertyName = discriminator?.propertyName;\n const unionItem = isRef && propertyName ? unionItemOf(item.$ref, request) : undefined;\n if (isRef && propertyName && unionItem?.isMember) {\n const own = unionOwnKeywords(unionItem.union, propertyName, required);\n return ownKeywordsType(own, item.$ref, request);\n }\n const type = isRef\n ? refItemType(item, required, request)\n : inlineItemType(item, required, request);\n const isUnion =\n unionItem !== undefined &&\n !unionItem.isMapped &&\n request.context.options.fixes.has(FIX.ALLOF_DISCRIMINATED_UNION);\n if (!propertyName || isUnion) {\n return type;\n }\n // With `discriminator-values` the schema also redefines the properties of other owners above\n // it, so no item may keep a value of its own for them (a parent mapped as `content`).\n const { path } = request.location;\n const others = path === undefined ? [] : request.context.discriminators.otherPropertiesAt(path);\n return omitKeys(type, [propertyName, ...others]);\n}\n\nfunction allOfTypes(\n items: readonly Schema[],\n required: readonly string[],\n request: SchemaRequest,\n): IrType[] {\n return items.flatMap((item) => allOfItemType(item, required, request) ?? []);\n}\n\nfunction oneOfType(previous: IrType | null, variants: readonly IrType[]): IrType {\n const before = previous === null ? [] : [previous];\n // Only `oneOf` may list primitives; then it stays a flat union.\n return variants.every(isPrimitiveType)\n ? unionOf([...before, ...variants])\n : intersectionOf([...before, unionOf(variants)]);\n}\n\n/**\n * `anyOf` is a union: TypeScript unions are not exclusive, which matches anyOf better than oneOf.\n * By default the sibling type is one more member, as in the original. With `anyof-properties` it\n * is intersected with the union, so it applies to every variant (#2380); for a `type` list, each\n * listed type has applied `anyOf` already (`multipleTypes`), so the list is the whole type.\n */\nfunction anyOfType(\n previous: IrType | null,\n schema: SchemaObject,\n request: SchemaRequest,\n): IrType | null {\n const variants = variantTypes(schema.anyOf ?? [], \"anyOf\", request);\n if (variants.length === 0 || previous === null) {\n return variants.length === 0 ? previous : unionOf(variants);\n }\n if (!request.context.options.fixes.has(FIX.ANYOF_PROPERTIES)) {\n return unionOf([previous, ...variants]);\n }\n return Array.isArray(schema.type) ? previous : intersectionOf([previous, unionOf(variants)]);\n}\n\n/** Object enums are written as `oneOf` over their values. */\nfunction oneOfVariants(schema: SchemaObject): readonly Schema[] {\n const objectEnum =\n \"type\" in schema && schema.type === \"object\" && (schema.enum as Schema[] | undefined);\n return schema.oneOf || objectEnum || [];\n}\n\n/**\n * The parent's `required` keys, plus the keys of left-out `allOf` members (`allof-required`).\n * Without such keys the parent's list stays as it is, duplicates included, as in the original.\n */\nfunction requiredKeys(schema: SchemaObject, presenceKeys: readonly string[]): readonly string[] {\n const own = schema.required ?? [];\n return presenceKeys.length === 0 ? own : [...new Set([...own, ...presenceKeys])];\n}\n\nfunction composedType(schema: SchemaObject, request: SchemaRequest): IrType | null {\n let type: IrType | null = null;\n const core = coreType(schema, request);\n const { members, required } = allOfMembers(schema.allOf ?? [], request);\n const allOf = allOfTypes(members, requiredKeys(schema, required), request);\n if (core !== null || allOf.length > 0) {\n const allOfType = allOf.length > 0 ? [intersectionOf(allOf)] : [];\n type = intersectionOf([...(core === null ? [] : [core]), ...allOfType]);\n }\n return variantsType(type, schema, request);\n}\n\n/** `anyOf`, then `oneOf`, applied to the core and `allOf` type (`anyof-oneof-required` first). */\nfunction variantsType(\n previous: IrType | null,\n schema: SchemaObject,\n request: SchemaRequest,\n): IrType | null {\n const type =\n requiredVariantsType(previous, schema, schema.anyOf ?? [], request) ??\n anyOfType(previous, schema, request);\n const oneOfRequired = requiredVariantsType(type, schema, schema.oneOf ?? [], request);\n if (oneOfRequired !== null) {\n return oneOfRequired;\n }\n const oneOf = variantTypes(oneOfVariants(schema), \"oneOf\", request);\n return oneOf.length > 0 ? oneOfType(type, oneOf) : type;\n}\n\n/** The composed type, with the `unevaluatedProperties` index signature when it applies. */\nfunction combinedType(schema: SchemaObject, request: SchemaRequest): IrType | null {\n const type = composedType(schema, request);\n const unevaluated = unevaluatedPropertiesType(schema, type, request);\n if (unevaluated === null) {\n return type;\n }\n if (type === null) {\n return unevaluated;\n }\n // One flat intersection, so an `allOf` intersection is not printed in parentheses.\n const parts = type.kind === \"intersection\" ? type.types : [type];\n return intersectionOf([...parts, unevaluated]);\n}\n\n/**\n * The schema with composition: core type and `allOf` intersected, then `anyOf` and `oneOf`. Without\n * any of them: `Record<string, never>` (or `unknown` with `--empty-objects-unknown`) when `type` is\n * present, else `unknown`. `nullable: true` adds `null`, except to the shared `unknown`.\n */\nexport function compositionType(schema: SchemaObject, request: SchemaRequest): IrType {\n const { emptyObjectsUnknown } = request.context.options;\n const empty =\n \"type\" in schema\n ? irRecord(irKeyword(\"string\"), emptyObjectsUnknown ? UNKNOWN_TYPE : irKeyword(\"never\"))\n : UNKNOWN_TYPE;\n const type = combinedType(schema, request) ?? empty;\n return type !== UNKNOWN_TYPE && schema.nullable ? nullableOf([type]) : type;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -120,7 +120,7 @@ function enumValuesPointer(path) {
|
|
|
120
120
|
kept.push(pointer[index]);
|
|
121
121
|
}
|
|
122
122
|
const extract = firstVariantStart === null ? [] : pointer.slice(firstVariantStart).filter((segment) => !UNION_KEYWORDS.has(segment) && !INDEX_RE.test(segment));
|
|
123
|
-
return { ref: jsonPointer.
|
|
123
|
+
return { ref: jsonPointer.appendPointer(jsonPointer.ROOT_POINTER, kept), extract };
|
|
124
124
|
}
|
|
125
125
|
function addEnumValues(schema, request) {
|
|
126
126
|
const { ref, extract } = enumValuesPointer(request.location.path);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enum-rule.cjs","sources":["../../../../src/application/transform/schema/enum-rule.ts"],"sourcesContent":["import {\n irIndexedAccess,\n irKeyword,\n irObject,\n irReference,\n irString,\n} from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport { createRef, parseRefPointer } from \"../../../domain/openapi/json-pointer.js\";\nimport type { SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { FIX } from \"../../../domain/output-fixes.js\";\nimport { literalType } from \"../literal-type.js\";\nimport { refType } from \"../ref-type.js\";\nimport { intersectionOf, unionOf } from \"../type-combinators.js\";\nimport type {\n DiscriminatorEnumParent,\n EnumDeclarationRequest,\n EnumMemberMetadata,\n SchemaOptions,\n} from \"./schema-context.js\";\nimport type { SchemaRequest, SchemaRule } from \"./schema-rule.js\";\n\n/** Removed from generated names, so `#/components/schemas/Status` gives `Status`. */\nconst COMPONENT_SCHEMAS_PREFIX = \"components/schemas\";\nconst UNION_KEYWORDS: ReadonlySet<string> = new Set([\"anyOf\", \"oneOf\"]);\nconst INDEX_RE = /^\\d+$/;\n\nfunction hasAdditionalProperties(schema: SchemaObject): boolean {\n return \"additionalProperties\" in schema && Boolean(schema.additionalProperties);\n}\n\n/** A name from the schema's pointer: `#/components/schemas/Pet/status` → `/Pet/status`. */\nfunction nameFromPath(path: string | undefined): string {\n return parseRefPointer(path ?? \"\")\n .join(\"/\")\n .replace(COMPONENT_SCHEMAS_PREFIX, \"\");\n}\n\n/** `#/components/schemas/Name`, and no deeper pointer. */\nconst COMPONENT_SCHEMA_RE = /^#\\/components\\/schemas\\/[^/]+$/;\n\nfunction hasEnumMetadata(schema: SchemaObject): boolean {\n return [\n schema[\"x-enum-varnames\"],\n schema[\"x-enumNames\"],\n schema[\"x-enum-descriptions\"],\n schema[\"x-enumDescriptions\"],\n ].some(Array.isArray);\n}\n\n/**\n * The values a TypeScript enum declares, with their positions in `enum`. With the\n * `nullable-enums` fix a `null` value is left out (upstream #1872): an enum member cannot be\n * `null`, so the type adds it as `| null` instead (`tsEnumType`).\n */\nfunction tsEnumEntries(schema: SchemaObject, options: SchemaOptions): [unknown, number][] {\n const entries = (schema.enum ?? []).map((value, index): [unknown, number] => [value, index]);\n return options.fixes.has(FIX.NULLABLE_ENUMS)\n ? entries.filter(([value]) => value !== null)\n : entries;\n}\n\n/**\n * `--enum`: string and number enums become TypeScript enums. The original meant to allow `null`\n * too, but tested `typeof value` against `null`, so an enum containing null stays a union; the\n * `nullable-enums` fix declares its other values.\n */\nfunction isTsEnum(schema: SchemaObject, options: SchemaOptions): boolean {\n if (!options.enum || !schema.enum) {\n return false;\n }\n const entries = tsEnumEntries(schema, options);\n // An empty `enum` stays an empty TypeScript enum, as the original made it; an enum of only\n // `null` has no member left once the fix drops `null`, so it stays a union.\n const isOnlyNull = entries.length === 0 && schema.enum.length > 0;\n const isSupported =\n !isOnlyNull && entries.every(([value]) => [\"string\", \"number\"].includes(typeof value));\n // `--conditional-enums` converts only enums that carry x-enum-* metadata.\n return isSupported && (!options.conditionalEnums || hasEnumMetadata(schema));\n}\n\nfunction enumMetadata(\n schema: SchemaObject,\n entries: readonly [unknown, number][],\n): EnumMemberMetadata[] {\n return entries.map(([, index]) => ({\n name: schema[\"x-enum-varnames\"]?.[index] ?? schema[\"x-enumNames\"]?.[index],\n description: schema[\"x-enum-descriptions\"]?.[index] ?? schema[\"x-enumDescriptions\"]?.[index],\n }));\n}\n\n/**\n * Whether `null` is a valid value: it is in `enum` and the schema's type admits it (`type`\n * absent or listing `\"null\"`, or OpenAPI 3.0 `nullable: true`). Both keywords must pass.\n */\nfunction isNullAllowed(schema: SchemaObject): boolean {\n const { type } = schema;\n const isTypeNullable =\n type === undefined ||\n (Array.isArray(type) && type.includes(\"null\")) ||\n Boolean(schema.nullable);\n return (schema.enum ?? []).includes(null) && isTypeNullable;\n}\n\n/**\n * `additionalProperties: true` on a string enum keeps other strings allowed but still offers the\n * listed values in editors: `\"a\" | \"b\" | (string & {})`.\n */\nfunction withOtherStrings(type: IrType, schema: SchemaObject): IrType {\n if (!hasAdditionalProperties(schema) || schema.type !== \"string\") {\n return type;\n }\n return unionOf([type, intersectionOf([irKeyword(\"string\"), irObject([])])]);\n}\n\n/** The enum declaration of `schema` typed at `path`; its values are strings and numbers. */\nfunction enumRequest(\n schema: SchemaObject,\n path: string | undefined,\n options: SchemaOptions,\n): EnumDeclarationRequest {\n const entries = tsEnumEntries(schema, options);\n return {\n name: nameFromPath(path),\n isComponentSchema: COMPONENT_SCHEMA_RE.test(path ?? \"\"),\n values: entries.map(([value]) => value as string | number),\n metadata: enumMetadata(schema, entries),\n };\n}\n\n/** One member's type; a quoted member cannot follow a dot, `typeof E[\"+\"]` is the same type. */\nfunction enumMemberType(enumName: string, member: string): IrType {\n return member.startsWith('\"')\n ? irIndexedAccess(irReference(`typeof ${enumName}`), irString(JSON.parse(member), \"escaped\"))\n : irReference(`${enumName}.${member}`);\n}\n\n/**\n * The `discriminator-values` fix: a member's discriminator value is typed with members of\n * the owner's enum (`PetType.Cat`), so the member is one of the owner's type (#1700). `key` is the\n * enum the scan added or the inherited discriminator object. Null when the fix is off, or the\n * owner's property is no TypeScript enum with every value.\n */\nexport function ownerEnumMembersType(\n key: object,\n values: readonly unknown[],\n request: SchemaRequest,\n): IrType | null {\n const { options, discriminators, footer } = request.context;\n const parent: DiscriminatorEnumParent | undefined = options.fixes.has(FIX.DISCRIMINATOR_VALUES)\n ? discriminators.enumParentOf(key)\n : undefined;\n if (parent === undefined || !isTsEnum(parent.schema, options)) {\n return null;\n }\n const reference = { ...enumRequest(parent.schema, parent.path, options), isOwnerReference: true };\n const name = footer.addEnum(reference);\n const members = footer.enumMembers(name);\n const names = values.map((value) => members.get(value as string | number));\n if (names.length === 0 || names.some((member) => member === undefined)) {\n return null;\n }\n return unionOf(names.map((member) => enumMemberType(name, member as string)));\n}\n\nfunction tsEnumType(schema: SchemaObject, request: SchemaRequest): IrType {\n const { options, footer } = request.context;\n // `isTsEnum` admits only strings and numbers, and the fix leaves `null` out of the members.\n const values = tsEnumEntries(schema, options).map(([value]) => value);\n const type =\n ownerEnumMembersType(schema, values, request) ??\n withOtherStrings(\n irReference(footer.addEnum(enumRequest(schema, request.location.path, options))),\n schema,\n );\n return options.fixes.has(FIX.NULLABLE_ENUMS) && isNullAllowed(schema)\n ? unionOf([type, irKeyword(\"null\")])\n : type;\n}\n\nfunction isUnionPosition(pointer: readonly string[], index: number): boolean {\n const next = pointer[index + 1];\n return UNION_KEYWORDS.has(pointer[index] as string) && next !== undefined && INDEX_RE.test(next);\n}\n\nconst PARAMETERS = \"parameters\";\n\n/** Where the `parameters` of a path item sit in its pointer: `paths/<key>/…`, `components/…`. */\nfunction pathItemParametersIndex(pointer: readonly string[]): number | null {\n if (pointer[0] === \"paths\" || pointer[0] === \"webhooks\") {\n return 2;\n }\n return pointer[0] === \"components\" && pointer[1] === \"pathItems\" ? 3 : null;\n}\n\n/**\n * The location of a path item parameter repeats `parameters` (`paths/~1a/parameters/parameters/\n * path/id`), which keeps the generated names as they were. The generated type has the segment\n * once: `paths[\"/a\"][\"parameters\"][\"path\"][\"id\"]`.\n */\nfunction withSingleParametersSegment(pointer: readonly string[]): readonly string[] {\n const index = pathItemParametersIndex(pointer);\n const isRepeated =\n index !== null && pointer[index] === PARAMETERS && pointer[index + 1] === PARAMETERS;\n return isRepeated ? [...pointer.slice(0, index), ...pointer.slice(index + 1)] : pointer;\n}\n\n/**\n * The pointer of `--enum-values` arrays without union positions (`anyOf/0`), so names stay\n * stable. Every property after the first union position is narrowed with `Extract`: a no-op where\n * all variants have it, and the needed narrowing where only some do.\n */\nfunction enumValuesPointer(path: string | undefined): { ref: string; extract: string[] } {\n const pointer = withSingleParametersSegment(parseRefPointer(path ?? \"\"));\n const kept: string[] = [];\n let firstVariantStart: number | null = null;\n for (let index = 0; index < pointer.length; index++) {\n if (isUnionPosition(pointer, index)) {\n firstVariantStart ??= index + 2;\n index++;\n continue;\n }\n kept.push(pointer[index] as string);\n }\n const extract =\n firstVariantStart === null\n ? []\n : pointer\n .slice(firstVariantStart)\n .filter((segment) => !UNION_KEYWORDS.has(segment) && !INDEX_RE.test(segment));\n return { ref: createRef(kept), extract };\n}\n\nfunction addEnumValues(schema: SchemaObject, request: SchemaRequest): void {\n const { ref, extract } = enumValuesPointer(request.location.path);\n const valuesType = refType(ref, { isDeep: true, extractProperties: extract });\n request.context.footer.addEnumValues({\n name: `${nameFromPath(request.location.path)}Values`,\n // A record value (`additionalProperties`) is reached by indexing with `string`.\n type: request.isFromAdditionalProperties\n ? irIndexedAccess(valuesType, irReference(\"string\"))\n : valuesType,\n values: (schema.enum ?? []) as (string | number)[],\n });\n}\n\nfunction literalEnumType(schema: SchemaObject, request: SchemaRequest): IrType {\n const values = schema.enum ?? [];\n const isNullable =\n (Array.isArray(schema.type) && schema.type.includes(\"null\")) || Boolean(schema.nullable);\n const literals = [...values.map(literalType), ...(isNullable ? [irKeyword(\"null\")] : [])];\n const type = withOtherStrings(unionOf(literals), schema);\n const isListable = values.every(\n (value) => typeof value === \"string\" || typeof value === \"number\",\n );\n if (request.context.options.enumValues && isListable) {\n addEnumValues(schema, request);\n }\n return type;\n}\n\n/**\n * `enum` on anything but an object (object enums are handled as `oneOf`). With\n * `additionalProperties`, only string enums are handled here; others fall through to composition.\n */\nexport const enumRule: SchemaRule = {\n name: \"enum\",\n matches(schema) {\n const isCandidate =\n Array.isArray(schema.enum) && schema.type !== \"object\" && !(\"properties\" in schema);\n return isCandidate && (!hasAdditionalProperties(schema) || schema.type === \"string\");\n },\n transform(schema, request) {\n return isTsEnum(schema, request.context.options)\n ? tsEnumType(schema, request)\n : literalEnumType(schema, request);\n },\n};\n"],"names":["parseRefPointer","FIX","unionOf","intersectionOf","irKeyword","irObject","irIndexedAccess","irReference","irString","createRef","refType","literalType"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"enum-rule.cjs","sources":["../../../../src/application/transform/schema/enum-rule.ts"],"sourcesContent":["import {\n irIndexedAccess,\n irKeyword,\n irObject,\n irReference,\n irString,\n} from \"../../../domain/ir/constructors.js\";\nimport type { IrType } from \"../../../domain/ir/nodes.js\";\nimport {\n appendPointer,\n parseRefPointer,\n ROOT_POINTER,\n} from \"../../../domain/openapi/json-pointer.js\";\nimport type { SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { FIX } from \"../../../domain/output-fixes.js\";\nimport { literalType } from \"../literal-type.js\";\nimport { refType } from \"../ref-type.js\";\nimport { intersectionOf, unionOf } from \"../type-combinators.js\";\nimport type {\n DiscriminatorEnumParent,\n EnumDeclarationRequest,\n EnumMemberMetadata,\n SchemaOptions,\n} from \"./schema-context.js\";\nimport type { SchemaRequest, SchemaRule } from \"./schema-rule.js\";\n\n/** Removed from generated names, so `#/components/schemas/Status` gives `Status`. */\nconst COMPONENT_SCHEMAS_PREFIX = \"components/schemas\";\nconst UNION_KEYWORDS: ReadonlySet<string> = new Set([\"anyOf\", \"oneOf\"]);\nconst INDEX_RE = /^\\d+$/;\n\nfunction hasAdditionalProperties(schema: SchemaObject): boolean {\n return \"additionalProperties\" in schema && Boolean(schema.additionalProperties);\n}\n\n/** A name from the schema's pointer: `#/components/schemas/Pet/status` → `/Pet/status`. */\nfunction nameFromPath(path: string | undefined): string {\n return parseRefPointer(path ?? \"\")\n .join(\"/\")\n .replace(COMPONENT_SCHEMAS_PREFIX, \"\");\n}\n\n/** `#/components/schemas/Name`, and no deeper pointer. */\nconst COMPONENT_SCHEMA_RE = /^#\\/components\\/schemas\\/[^/]+$/;\n\nfunction hasEnumMetadata(schema: SchemaObject): boolean {\n return [\n schema[\"x-enum-varnames\"],\n schema[\"x-enumNames\"],\n schema[\"x-enum-descriptions\"],\n schema[\"x-enumDescriptions\"],\n ].some(Array.isArray);\n}\n\n/**\n * The values a TypeScript enum declares, with their positions in `enum`. With the\n * `nullable-enums` fix a `null` value is left out (upstream #1872): an enum member cannot be\n * `null`, so the type adds it as `| null` instead (`tsEnumType`).\n */\nfunction tsEnumEntries(schema: SchemaObject, options: SchemaOptions): [unknown, number][] {\n const entries = (schema.enum ?? []).map((value, index): [unknown, number] => [value, index]);\n return options.fixes.has(FIX.NULLABLE_ENUMS)\n ? entries.filter(([value]) => value !== null)\n : entries;\n}\n\n/**\n * `--enum`: string and number enums become TypeScript enums. The original meant to allow `null`\n * too, but tested `typeof value` against `null`, so an enum containing null stays a union; the\n * `nullable-enums` fix declares its other values.\n */\nfunction isTsEnum(schema: SchemaObject, options: SchemaOptions): boolean {\n if (!options.enum || !schema.enum) {\n return false;\n }\n const entries = tsEnumEntries(schema, options);\n // An empty `enum` stays an empty TypeScript enum, as the original made it; an enum of only\n // `null` has no member left once the fix drops `null`, so it stays a union.\n const isOnlyNull = entries.length === 0 && schema.enum.length > 0;\n const isSupported =\n !isOnlyNull && entries.every(([value]) => [\"string\", \"number\"].includes(typeof value));\n // `--conditional-enums` converts only enums that carry x-enum-* metadata.\n return isSupported && (!options.conditionalEnums || hasEnumMetadata(schema));\n}\n\nfunction enumMetadata(\n schema: SchemaObject,\n entries: readonly [unknown, number][],\n): EnumMemberMetadata[] {\n return entries.map(([, index]) => ({\n name: schema[\"x-enum-varnames\"]?.[index] ?? schema[\"x-enumNames\"]?.[index],\n description: schema[\"x-enum-descriptions\"]?.[index] ?? schema[\"x-enumDescriptions\"]?.[index],\n }));\n}\n\n/**\n * Whether `null` is a valid value: it is in `enum` and the schema's type admits it (`type`\n * absent or listing `\"null\"`, or OpenAPI 3.0 `nullable: true`). Both keywords must pass.\n */\nfunction isNullAllowed(schema: SchemaObject): boolean {\n const { type } = schema;\n const isTypeNullable =\n type === undefined ||\n (Array.isArray(type) && type.includes(\"null\")) ||\n Boolean(schema.nullable);\n return (schema.enum ?? []).includes(null) && isTypeNullable;\n}\n\n/**\n * `additionalProperties: true` on a string enum keeps other strings allowed but still offers the\n * listed values in editors: `\"a\" | \"b\" | (string & {})`.\n */\nfunction withOtherStrings(type: IrType, schema: SchemaObject): IrType {\n if (!hasAdditionalProperties(schema) || schema.type !== \"string\") {\n return type;\n }\n return unionOf([type, intersectionOf([irKeyword(\"string\"), irObject([])])]);\n}\n\n/** The enum declaration of `schema` typed at `path`; its values are strings and numbers. */\nfunction enumRequest(\n schema: SchemaObject,\n path: string | undefined,\n options: SchemaOptions,\n): EnumDeclarationRequest {\n const entries = tsEnumEntries(schema, options);\n return {\n name: nameFromPath(path),\n isComponentSchema: COMPONENT_SCHEMA_RE.test(path ?? \"\"),\n values: entries.map(([value]) => value as string | number),\n metadata: enumMetadata(schema, entries),\n };\n}\n\n/** One member's type; a quoted member cannot follow a dot, `typeof E[\"+\"]` is the same type. */\nfunction enumMemberType(enumName: string, member: string): IrType {\n return member.startsWith('\"')\n ? irIndexedAccess(irReference(`typeof ${enumName}`), irString(JSON.parse(member), \"escaped\"))\n : irReference(`${enumName}.${member}`);\n}\n\n/**\n * The `discriminator-values` fix: a member's discriminator value is typed with members of\n * the owner's enum (`PetType.Cat`), so the member is one of the owner's type (#1700). `key` is the\n * enum the scan added or the inherited discriminator object. Null when the fix is off, or the\n * owner's property is no TypeScript enum with every value.\n */\nexport function ownerEnumMembersType(\n key: object,\n values: readonly unknown[],\n request: SchemaRequest,\n): IrType | null {\n const { options, discriminators, footer } = request.context;\n const parent: DiscriminatorEnumParent | undefined = options.fixes.has(FIX.DISCRIMINATOR_VALUES)\n ? discriminators.enumParentOf(key)\n : undefined;\n if (parent === undefined || !isTsEnum(parent.schema, options)) {\n return null;\n }\n const reference = { ...enumRequest(parent.schema, parent.path, options), isOwnerReference: true };\n const name = footer.addEnum(reference);\n const members = footer.enumMembers(name);\n const names = values.map((value) => members.get(value as string | number));\n if (names.length === 0 || names.some((member) => member === undefined)) {\n return null;\n }\n return unionOf(names.map((member) => enumMemberType(name, member as string)));\n}\n\nfunction tsEnumType(schema: SchemaObject, request: SchemaRequest): IrType {\n const { options, footer } = request.context;\n // `isTsEnum` admits only strings and numbers, and the fix leaves `null` out of the members.\n const values = tsEnumEntries(schema, options).map(([value]) => value);\n const type =\n ownerEnumMembersType(schema, values, request) ??\n withOtherStrings(\n irReference(footer.addEnum(enumRequest(schema, request.location.path, options))),\n schema,\n );\n return options.fixes.has(FIX.NULLABLE_ENUMS) && isNullAllowed(schema)\n ? unionOf([type, irKeyword(\"null\")])\n : type;\n}\n\nfunction isUnionPosition(pointer: readonly string[], index: number): boolean {\n const next = pointer[index + 1];\n return UNION_KEYWORDS.has(pointer[index] as string) && next !== undefined && INDEX_RE.test(next);\n}\n\nconst PARAMETERS = \"parameters\";\n\n/** Where the `parameters` of a path item sit in its pointer: `paths/<key>/…`, `components/…`. */\nfunction pathItemParametersIndex(pointer: readonly string[]): number | null {\n if (pointer[0] === \"paths\" || pointer[0] === \"webhooks\") {\n return 2;\n }\n return pointer[0] === \"components\" && pointer[1] === \"pathItems\" ? 3 : null;\n}\n\n/**\n * The location of a path item parameter repeats `parameters` (`paths/~1a/parameters/parameters/\n * path/id`), which keeps the generated names as they were. The generated type has the segment\n * once: `paths[\"/a\"][\"parameters\"][\"path\"][\"id\"]`.\n */\nfunction withSingleParametersSegment(pointer: readonly string[]): readonly string[] {\n const index = pathItemParametersIndex(pointer);\n const isRepeated =\n index !== null && pointer[index] === PARAMETERS && pointer[index + 1] === PARAMETERS;\n return isRepeated ? [...pointer.slice(0, index), ...pointer.slice(index + 1)] : pointer;\n}\n\n/**\n * The pointer of `--enum-values` arrays without union positions (`anyOf/0`), so names stay\n * stable. Every property after the first union position is narrowed with `Extract`: a no-op where\n * all variants have it, and the needed narrowing where only some do.\n */\nfunction enumValuesPointer(path: string | undefined): { ref: string; extract: string[] } {\n const pointer = withSingleParametersSegment(parseRefPointer(path ?? \"\"));\n const kept: string[] = [];\n let firstVariantStart: number | null = null;\n for (let index = 0; index < pointer.length; index++) {\n if (isUnionPosition(pointer, index)) {\n firstVariantStart ??= index + 2;\n index++;\n continue;\n }\n kept.push(pointer[index] as string);\n }\n const extract =\n firstVariantStart === null\n ? []\n : pointer\n .slice(firstVariantStart)\n .filter((segment) => !UNION_KEYWORDS.has(segment) && !INDEX_RE.test(segment));\n return { ref: appendPointer(ROOT_POINTER, kept), extract };\n}\n\nfunction addEnumValues(schema: SchemaObject, request: SchemaRequest): void {\n const { ref, extract } = enumValuesPointer(request.location.path);\n const valuesType = refType(ref, { isDeep: true, extractProperties: extract });\n request.context.footer.addEnumValues({\n name: `${nameFromPath(request.location.path)}Values`,\n // A record value (`additionalProperties`) is reached by indexing with `string`.\n type: request.isFromAdditionalProperties\n ? irIndexedAccess(valuesType, irReference(\"string\"))\n : valuesType,\n values: (schema.enum ?? []) as (string | number)[],\n });\n}\n\nfunction literalEnumType(schema: SchemaObject, request: SchemaRequest): IrType {\n const values = schema.enum ?? [];\n const isNullable =\n (Array.isArray(schema.type) && schema.type.includes(\"null\")) || Boolean(schema.nullable);\n const literals = [...values.map(literalType), ...(isNullable ? [irKeyword(\"null\")] : [])];\n const type = withOtherStrings(unionOf(literals), schema);\n const isListable = values.every(\n (value) => typeof value === \"string\" || typeof value === \"number\",\n );\n if (request.context.options.enumValues && isListable) {\n addEnumValues(schema, request);\n }\n return type;\n}\n\n/**\n * `enum` on anything but an object (object enums are handled as `oneOf`). With\n * `additionalProperties`, only string enums are handled here; others fall through to composition.\n */\nexport const enumRule: SchemaRule = {\n name: \"enum\",\n matches(schema) {\n const isCandidate =\n Array.isArray(schema.enum) && schema.type !== \"object\" && !(\"properties\" in schema);\n return isCandidate && (!hasAdditionalProperties(schema) || schema.type === \"string\");\n },\n transform(schema, request) {\n return isTsEnum(schema, request.context.options)\n ? tsEnumType(schema, request)\n : literalEnumType(schema, request);\n },\n};\n"],"names":["parseRefPointer","FIX","unionOf","intersectionOf","irKeyword","irObject","irIndexedAccess","irReference","irString","appendPointer","ROOT_POINTER","refType","literalType"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { irReference, irKeyword, irIndexedAccess, irString, irObject } from '../../../domain/ir/constructors.mjs';
|
|
2
|
-
import { parseRefPointer,
|
|
2
|
+
import { parseRefPointer, appendPointer, ROOT_POINTER } from '../../../domain/openapi/json-pointer.mjs';
|
|
3
3
|
import { FIX } from '../../../domain/output-fixes.mjs';
|
|
4
4
|
import { literalType } from '../literal-type.mjs';
|
|
5
5
|
import { refType } from '../ref-type.mjs';
|
|
@@ -118,7 +118,7 @@ function enumValuesPointer(path) {
|
|
|
118
118
|
kept.push(pointer[index]);
|
|
119
119
|
}
|
|
120
120
|
const extract = firstVariantStart === null ? [] : pointer.slice(firstVariantStart).filter((segment) => !UNION_KEYWORDS.has(segment) && !INDEX_RE.test(segment));
|
|
121
|
-
return { ref:
|
|
121
|
+
return { ref: appendPointer(ROOT_POINTER, kept), extract };
|
|
122
122
|
}
|
|
123
123
|
function addEnumValues(schema, request) {
|
|
124
124
|
const { ref, extract } = enumValuesPointer(request.location.path);
|