openapi-typesafe 1.0.0-rc.4 → 1.0.0-rc.6
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 +214 -0
- package/dist/adapters/node-file-system/node-file-system.cjs +7 -0
- package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -1
- package/dist/adapters/node-file-system/node-file-system.mjs +7 -0
- package/dist/adapters/node-file-system/node-file-system.mjs.map +1 -1
- package/dist/adapters/pipe-safe-writer/pipe-safe-writer.cjs +19 -0
- package/dist/adapters/pipe-safe-writer/pipe-safe-writer.cjs.map +1 -0
- package/dist/adapters/pipe-safe-writer/pipe-safe-writer.mjs +17 -0
- package/dist/adapters/pipe-safe-writer/pipe-safe-writer.mjs.map +1 -0
- package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs +5 -32
- package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs.map +1 -1
- package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs +6 -33
- package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs.map +1 -1
- package/dist/adapters/redocly-loader/component-schemas.cjs +17 -0
- package/dist/adapters/redocly-loader/component-schemas.cjs.map +1 -0
- package/dist/adapters/redocly-loader/component-schemas.mjs +14 -0
- package/dist/adapters/redocly-loader/component-schemas.mjs.map +1 -0
- package/dist/adapters/redocly-loader/mapping-schema-names.cjs +22 -0
- package/dist/adapters/redocly-loader/mapping-schema-names.cjs.map +1 -0
- package/dist/adapters/redocly-loader/mapping-schema-names.mjs +20 -0
- package/dist/adapters/redocly-loader/mapping-schema-names.mjs.map +1 -0
- package/dist/adapters/redocly-loader/query-document-names.cjs +50 -0
- package/dist/adapters/redocly-loader/query-document-names.cjs.map +1 -0
- package/dist/adapters/redocly-loader/query-document-names.mjs +48 -0
- package/dist/adapters/redocly-loader/query-document-names.mjs.map +1 -0
- package/dist/adapters/redocly-loader/query-named-components.cjs +129 -0
- package/dist/adapters/redocly-loader/query-named-components.cjs.map +1 -0
- package/dist/adapters/redocly-loader/query-named-components.mjs +126 -0
- package/dist/adapters/redocly-loader/query-named-components.mjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-config-source.cjs +3 -0
- package/dist/adapters/redocly-loader/redocly-config-source.cjs.map +1 -1
- package/dist/adapters/redocly-loader/redocly-config-source.mjs +4 -1
- package/dist/adapters/redocly-loader/redocly-config-source.mjs.map +1 -1
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +39 -18
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -1
- package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +40 -19
- package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -1
- package/dist/adapters/redocly-loader/ref-access.cjs +25 -4
- package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -1
- package/dist/adapters/redocly-loader/ref-access.mjs +26 -5
- package/dist/adapters/redocly-loader/ref-access.mjs.map +1 -1
- package/dist/adapters/redocly-loader/ref-holders.cjs +52 -10
- package/dist/adapters/redocly-loader/ref-holders.cjs.map +1 -1
- package/dist/adapters/redocly-loader/ref-holders.mjs +52 -11
- package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -1
- package/dist/adapters/redocly-loader/remote-fetch.cjs +20 -3
- package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -1
- package/dist/adapters/redocly-loader/remote-fetch.mjs +20 -4
- package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -1
- package/dist/adapters/redocly-loader/remote-node-limit.cjs +17 -3
- package/dist/adapters/redocly-loader/remote-node-limit.cjs.map +1 -1
- package/dist/adapters/redocly-loader/remote-node-limit.mjs +17 -3
- package/dist/adapters/redocly-loader/remote-node-limit.mjs.map +1 -1
- package/dist/adapters/redocly-loader/schema-source.cjs +7 -2
- package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -1
- package/dist/adapters/redocly-loader/schema-source.mjs +8 -3
- package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -1
- package/dist/adapters/terminal-logger/terminal-logger.cjs +7 -3
- package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -1
- package/dist/adapters/terminal-logger/terminal-logger.mjs +7 -3
- package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -1
- package/dist/api/cwd-option.cjs +58 -0
- package/dist/api/cwd-option.cjs.map +1 -0
- package/dist/api/cwd-option.mjs +52 -0
- package/dist/api/cwd-option.mjs.map +1 -0
- package/dist/api/default-ports.cjs +15 -7
- package/dist/api/default-ports.cjs.map +1 -1
- package/dist/api/default-ports.mjs +14 -8
- package/dist/api/default-ports.mjs.map +1 -1
- package/dist/api/document-refs.cjs +16 -1
- package/dist/api/document-refs.cjs.map +1 -1
- package/dist/api/document-refs.mjs +16 -1
- package/dist/api/document-refs.mjs.map +1 -1
- package/dist/api/document-run.cjs +6 -26
- package/dist/api/document-run.cjs.map +1 -1
- package/dist/api/document-run.mjs +5 -21
- package/dist/api/document-run.mjs.map +1 -1
- package/dist/api/legacy-utils.cjs +1 -1
- package/dist/api/legacy-utils.cjs.map +1 -1
- package/dist/api/legacy-utils.mjs +1 -1
- package/dist/api/legacy-utils.mjs.map +1 -1
- package/dist/api/openapi-ts.cjs +1 -2
- package/dist/api/openapi-ts.cjs.map +1 -1
- package/dist/api/openapi-ts.mjs +2 -3
- package/dist/api/openapi-ts.mjs.map +1 -1
- package/dist/api/option-errors.cjs +24 -0
- package/dist/api/option-errors.cjs.map +1 -0
- package/dist/api/option-errors.mjs +21 -0
- package/dist/api/option-errors.mjs.map +1 -0
- package/dist/api/ref-limit-options.cjs +58 -0
- package/dist/api/ref-limit-options.cjs.map +1 -0
- package/dist/api/ref-limit-options.mjs +52 -0
- package/dist/api/ref-limit-options.mjs.map +1 -0
- package/dist/api/transform-schema.cjs +12 -5
- package/dist/api/transform-schema.cjs.map +1 -1
- package/dist/api/transform-schema.mjs +12 -5
- package/dist/api/transform-schema.mjs.map +1 -1
- package/dist/application/transform/declared-value-types.cjs +36 -0
- package/dist/application/transform/declared-value-types.cjs.map +1 -0
- package/dist/application/transform/declared-value-types.mjs +34 -0
- package/dist/application/transform/declared-value-types.mjs.map +1 -0
- package/dist/application/transform/document/document.cjs +3 -1
- package/dist/application/transform/document/document.cjs.map +1 -1
- package/dist/application/transform/document/document.mjs +3 -1
- package/dist/application/transform/document/document.mjs.map +1 -1
- package/dist/application/transform/document/exploded-query-values.cjs +63 -0
- package/dist/application/transform/document/exploded-query-values.cjs.map +1 -0
- package/dist/application/transform/document/exploded-query-values.mjs +59 -0
- package/dist/application/transform/document/exploded-query-values.mjs.map +1 -0
- package/dist/application/transform/document/header.cjs +11 -3
- package/dist/application/transform/document/header.cjs.map +1 -1
- package/dist/application/transform/document/header.mjs +10 -2
- package/dist/application/transform/document/header.mjs.map +1 -1
- package/dist/application/transform/document/parameter.cjs +1 -1
- package/dist/application/transform/document/parameter.cjs.map +1 -1
- package/dist/application/transform/document/parameter.mjs +1 -1
- package/dist/application/transform/document/parameter.mjs.map +1 -1
- package/dist/application/transform/document/parameters.cjs +23 -5
- package/dist/application/transform/document/parameters.cjs.map +1 -1
- package/dist/application/transform/document/parameters.mjs +23 -5
- package/dist/application/transform/document/parameters.mjs.map +1 -1
- package/dist/application/transform/document/path-item.cjs +4 -3
- package/dist/application/transform/document/path-item.cjs.map +1 -1
- package/dist/application/transform/document/path-item.mjs +4 -4
- package/dist/application/transform/document/path-item.mjs.map +1 -1
- package/dist/application/transform/document/path-template-key.cjs +84 -0
- package/dist/application/transform/document/path-template-key.cjs.map +1 -0
- package/dist/application/transform/document/path-template-key.mjs +79 -0
- package/dist/application/transform/document/path-template-key.mjs.map +1 -0
- package/dist/application/transform/document/path-template-refs.cjs +80 -0
- package/dist/application/transform/document/path-template-refs.cjs.map +1 -0
- package/dist/application/transform/document/path-template-refs.mjs +77 -0
- package/dist/application/transform/document/path-template-refs.mjs.map +1 -0
- package/dist/application/transform/document/paths-enum.cjs +7 -6
- package/dist/application/transform/document/paths-enum.cjs.map +1 -1
- package/dist/application/transform/document/paths-enum.mjs +7 -6
- package/dist/application/transform/document/paths-enum.mjs.map +1 -1
- package/dist/application/transform/document/paths.cjs +38 -66
- package/dist/application/transform/document/paths.cjs.map +1 -1
- package/dist/application/transform/document/paths.mjs +36 -66
- package/dist/application/transform/document/paths.mjs.map +1 -1
- package/dist/application/transform/document/webhooks.cjs +10 -3
- package/dist/application/transform/document/webhooks.cjs.map +1 -1
- package/dist/application/transform/document/webhooks.mjs +9 -2
- package/dist/application/transform/document/webhooks.mjs.map +1 -1
- package/dist/application/transform/footer/document-footer.cjs +6 -3
- package/dist/application/transform/footer/document-footer.cjs.map +1 -1
- package/dist/application/transform/footer/document-footer.mjs +6 -3
- package/dist/application/transform/footer/document-footer.mjs.map +1 -1
- package/dist/application/transform/helper-types.cjs +3 -3
- package/dist/application/transform/helper-types.cjs.map +1 -1
- package/dist/application/transform/helper-types.mjs +3 -3
- package/dist/application/transform/helper-types.mjs.map +1 -1
- package/dist/application/transform/ref-pointer/generated-location.cjs +4 -4
- package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -1
- package/dist/application/transform/ref-pointer/generated-location.mjs +1 -1
- package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -1
- package/dist/application/transform/ref-pointer/generated-shape.cjs +63 -64
- package/dist/application/transform/ref-pointer/generated-shape.cjs.map +1 -1
- package/dist/application/transform/ref-pointer/generated-shape.mjs +57 -53
- package/dist/application/transform/ref-pointer/generated-shape.mjs.map +1 -1
- package/dist/application/transform/ref-pointer/inline-cycles.cjs +2 -2
- package/dist/application/transform/ref-pointer/inline-cycles.cjs.map +1 -1
- package/dist/application/transform/ref-pointer/inline-cycles.mjs +1 -1
- package/dist/application/transform/ref-pointer/inline-cycles.mjs.map +1 -1
- package/dist/application/transform/ref-pointer/located-node.cjs +23 -0
- package/dist/application/transform/ref-pointer/located-node.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/located-node.mjs +18 -0
- package/dist/application/transform/ref-pointer/located-node.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/original-index.cjs +69 -14
- package/dist/application/transform/ref-pointer/original-index.cjs.map +1 -1
- package/dist/application/transform/ref-pointer/original-index.mjs +71 -16
- package/dist/application/transform/ref-pointer/original-index.mjs.map +1 -1
- package/dist/application/transform/ref-pointer/pointer-type.cjs +2 -2
- package/dist/application/transform/ref-pointer/pointer-type.cjs.map +1 -1
- package/dist/application/transform/ref-pointer/pointer-type.mjs +1 -1
- package/dist/application/transform/ref-pointer/pointer-type.mjs.map +1 -1
- package/dist/application/transform/ref-pointer/pointer-walk.cjs +54 -13
- package/dist/application/transform/ref-pointer/pointer-walk.cjs.map +1 -1
- package/dist/application/transform/ref-pointer/pointer-walk.mjs +46 -7
- package/dist/application/transform/ref-pointer/pointer-walk.mjs.map +1 -1
- package/dist/application/transform/ref-pointer/property-shape.cjs +57 -0
- package/dist/application/transform/ref-pointer/property-shape.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/property-shape.mjs +49 -0
- package/dist/application/transform/ref-pointer/property-shape.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/typed-walk.cjs +90 -22
- package/dist/application/transform/ref-pointer/typed-walk.cjs.map +1 -1
- package/dist/application/transform/ref-pointer/typed-walk.mjs +87 -19
- package/dist/application/transform/ref-pointer/typed-walk.mjs.map +1 -1
- package/dist/application/transform/schema/access-flags.cjs.map +1 -1
- package/dist/application/transform/schema/access-flags.mjs.map +1 -1
- package/dist/application/transform/schema/index-signature-type.cjs +21 -0
- package/dist/application/transform/schema/index-signature-type.cjs.map +1 -0
- package/dist/application/transform/schema/index-signature-type.mjs +19 -0
- package/dist/application/transform/schema/index-signature-type.mjs.map +1 -0
- package/dist/application/transform/schema/input-location.cjs +23 -0
- package/dist/application/transform/schema/input-location.cjs.map +1 -0
- package/dist/application/transform/schema/input-location.mjs +21 -0
- package/dist/application/transform/schema/input-location.mjs.map +1 -0
- package/dist/application/transform/schema/object-type.cjs +15 -5
- package/dist/application/transform/schema/object-type.cjs.map +1 -1
- package/dist/application/transform/schema/object-type.mjs +15 -5
- package/dist/application/transform/schema/object-type.mjs.map +1 -1
- package/dist/application/transform/schema/schema-transform.cjs +2 -1
- package/dist/application/transform/schema/schema-transform.cjs.map +1 -1
- package/dist/application/transform/schema/schema-transform.mjs +2 -1
- package/dist/application/transform/schema/schema-transform.mjs.map +1 -1
- package/dist/application/transform/schema/unevaluated-properties.cjs +2 -30
- package/dist/application/transform/schema/unevaluated-properties.cjs.map +1 -1
- package/dist/application/transform/schema/unevaluated-properties.mjs +3 -31
- package/dist/application/transform/schema/unevaluated-properties.mjs.map +1 -1
- package/dist/cli/api-logger.cjs +13 -0
- package/dist/cli/api-logger.cjs.map +1 -0
- package/dist/cli/api-logger.mjs +11 -0
- package/dist/cli/api-logger.mjs.map +1 -0
- package/dist/cli/api-settings.cjs +10 -17
- package/dist/cli/api-settings.cjs.map +1 -1
- package/dist/cli/api-settings.mjs +10 -17
- package/dist/cli/api-settings.mjs.map +1 -1
- package/dist/cli/api-writes.cjs +7 -1
- package/dist/cli/api-writes.cjs.map +1 -1
- package/dist/cli/api-writes.mjs +7 -1
- package/dist/cli/api-writes.mjs.map +1 -1
- package/dist/cli/cli-arguments.cjs +32 -74
- package/dist/cli/cli-arguments.cjs.map +1 -1
- package/dist/cli/cli-arguments.mjs +28 -70
- package/dist/cli/cli-arguments.mjs.map +1 -1
- package/dist/cli/cli-errors.cjs +18 -0
- package/dist/cli/cli-errors.cjs.map +1 -1
- package/dist/cli/cli-errors.mjs +18 -1
- package/dist/cli/cli-errors.mjs.map +1 -1
- package/dist/cli/cli-flag-names.cjs +77 -0
- package/dist/cli/cli-flag-names.cjs.map +1 -0
- package/dist/cli/cli-flag-names.mjs +64 -0
- package/dist/cli/cli-flag-names.mjs.map +1 -0
- package/dist/cli/cli-output.cjs +13 -6
- package/dist/cli/cli-output.cjs.map +1 -1
- package/dist/cli/cli-output.mjs +14 -7
- package/dist/cli/cli-output.mjs.map +1 -1
- package/dist/cli/main.cjs +11 -5
- package/dist/cli/main.cjs.map +1 -1
- package/dist/cli/main.mjs +11 -5
- package/dist/cli/main.mjs.map +1 -1
- package/dist/cli/redocly-apis.cjs +33 -12
- package/dist/cli/redocly-apis.cjs.map +1 -1
- package/dist/cli/redocly-apis.mjs +35 -14
- package/dist/cli/redocly-apis.mjs.map +1 -1
- package/dist/cli/ref-limits.cjs +15 -1
- package/dist/cli/ref-limits.cjs.map +1 -1
- package/dist/cli/ref-limits.mjs +15 -2
- package/dist/cli/ref-limits.mjs.map +1 -1
- package/dist/cli/run-cli.cjs +24 -7
- package/dist/cli/run-cli.cjs.map +1 -1
- package/dist/cli/run-cli.mjs +25 -8
- package/dist/cli/run-cli.mjs.map +1 -1
- package/dist/cli/written-flags.cjs +83 -0
- package/dist/cli/written-flags.cjs.map +1 -0
- package/dist/cli/written-flags.mjs +77 -0
- package/dist/cli/written-flags.mjs.map +1 -0
- package/dist/domain/cause-secrets.cjs +31 -16
- package/dist/domain/cause-secrets.cjs.map +1 -1
- package/dist/domain/cause-secrets.mjs +31 -16
- package/dist/domain/cause-secrets.mjs.map +1 -1
- package/dist/domain/errors.cjs +3 -0
- package/dist/domain/errors.cjs.map +1 -1
- package/dist/domain/errors.mjs +3 -0
- package/dist/domain/errors.mjs.map +1 -1
- package/dist/domain/location-text.cjs +15 -0
- package/dist/domain/location-text.cjs.map +1 -0
- package/dist/domain/location-text.mjs +13 -0
- package/dist/domain/location-text.mjs.map +1 -0
- package/dist/domain/openapi/document-places.cjs +55 -0
- package/dist/domain/openapi/document-places.cjs.map +1 -0
- package/dist/domain/openapi/document-places.mjs +53 -0
- package/dist/domain/openapi/document-places.mjs.map +1 -0
- package/dist/domain/output-fixes.cjs +8 -2
- package/dist/domain/output-fixes.cjs.map +1 -1
- package/dist/domain/output-fixes.mjs +8 -2
- package/dist/domain/output-fixes.mjs.map +1 -1
- package/dist/domain/terminal-text.cjs +31 -0
- package/dist/domain/terminal-text.cjs.map +1 -0
- package/dist/domain/terminal-text.mjs +29 -0
- package/dist/domain/terminal-text.mjs.map +1 -0
- package/dist/domain/warnings.cjs +1 -0
- package/dist/domain/warnings.cjs.map +1 -1
- package/dist/domain/warnings.mjs +1 -0
- package/dist/domain/warnings.mjs.map +1 -1
- package/dist/index.d.cts +29 -18
- package/dist/index.d.mts +29 -18
- package/dist/index.d.ts +29 -18
- package/package.json +1 -1
- package/src/adapters/node-file-system/node-file-system.ts +14 -1
- package/src/adapters/pipe-safe-writer/pipe-safe-writer.ts +29 -0
- package/src/adapters/redocly-loader/bundled-mapping-copies.ts +7 -42
- package/src/adapters/redocly-loader/component-schemas.ts +19 -0
- package/src/adapters/redocly-loader/mapping-schema-names.ts +25 -0
- package/src/adapters/redocly-loader/query-document-names.ts +79 -0
- package/src/adapters/redocly-loader/query-named-components.ts +200 -0
- package/src/adapters/redocly-loader/redocly-config-source.ts +11 -1
- package/src/adapters/redocly-loader/redocly-schema-loader.ts +63 -17
- package/src/adapters/redocly-loader/ref-access.ts +32 -5
- package/src/adapters/redocly-loader/ref-holders.ts +75 -14
- package/src/adapters/redocly-loader/remote-fetch.ts +37 -2
- package/src/adapters/redocly-loader/remote-node-limit.ts +44 -4
- package/src/adapters/redocly-loader/schema-source.ts +15 -3
- package/src/adapters/terminal-logger/terminal-logger.ts +10 -4
- package/src/api/cwd-option.ts +76 -0
- package/src/api/default-ports.ts +33 -10
- package/src/api/document-refs.ts +29 -1
- package/src/api/document-run.ts +7 -32
- package/src/api/legacy-utils.ts +1 -1
- package/src/api/openapi-ts.ts +20 -4
- package/src/api/option-errors.ts +22 -0
- package/src/api/ref-limit-options.ts +69 -0
- package/src/api/transform-schema.ts +20 -5
- package/src/application/ports/file-system.ts +8 -0
- package/src/application/ports/redocly-config-source.ts +5 -0
- package/src/application/transform/declared-value-types.ts +42 -0
- package/src/application/transform/document/document.ts +4 -2
- package/src/application/transform/document/exploded-query-values.ts +88 -0
- package/src/application/transform/document/header.ts +25 -5
- package/src/application/transform/document/parameter.ts +4 -4
- package/src/application/transform/document/parameters.ts +45 -10
- package/src/application/transform/document/path-item.ts +3 -3
- package/src/application/transform/document/path-template-key.ts +152 -0
- package/src/application/transform/document/path-template-refs.ts +127 -0
- package/src/application/transform/document/paths-enum.ts +23 -9
- package/src/application/transform/document/paths.ts +53 -123
- package/src/application/transform/document/webhooks.ts +18 -5
- package/src/application/transform/footer/document-footer.ts +18 -8
- package/src/application/transform/helper-types.ts +4 -4
- package/src/application/transform/ref-pointer/generated-location.ts +1 -1
- package/src/application/transform/ref-pointer/generated-shape.ts +115 -83
- package/src/application/transform/ref-pointer/inline-cycles.ts +1 -1
- package/src/application/transform/ref-pointer/located-node.ts +38 -0
- package/src/application/transform/ref-pointer/original-index.ts +106 -20
- package/src/application/transform/ref-pointer/pointer-type.ts +1 -1
- package/src/application/transform/ref-pointer/pointer-walk.ts +82 -8
- package/src/application/transform/ref-pointer/property-shape.ts +106 -0
- package/src/application/transform/ref-pointer/typed-walk.ts +143 -29
- package/src/application/transform/schema/access-flags.ts +5 -2
- package/src/application/transform/schema/index-signature-type.ts +31 -0
- package/src/application/transform/schema/input-location.ts +35 -0
- package/src/application/transform/schema/object-type.ts +18 -8
- package/src/application/transform/schema/schema-transform.ts +2 -1
- package/src/application/transform/schema/unevaluated-properties.ts +4 -44
- package/src/cli/api-logger.ts +17 -0
- package/src/cli/api-settings.ts +12 -20
- package/src/cli/api-writes.ts +11 -3
- package/src/cli/cli-arguments.ts +57 -92
- package/src/cli/cli-dependencies.ts +7 -2
- package/src/cli/cli-errors.ts +23 -0
- package/src/cli/cli-flag-names.ts +99 -0
- package/src/cli/cli-output.ts +31 -16
- package/src/cli/main.ts +12 -5
- package/src/cli/redocly-apis.ts +56 -20
- package/src/cli/ref-limits.ts +21 -2
- package/src/cli/run-cli.ts +39 -7
- package/src/cli/written-flags.ts +131 -0
- package/src/domain/cause-secrets.ts +59 -25
- package/src/domain/errors.ts +3 -0
- package/src/domain/location-text.ts +27 -0
- package/src/domain/openapi/document-places.ts +78 -0
- package/src/domain/output-fixes.ts +9 -2
- package/src/domain/terminal-text.ts +44 -0
- package/src/domain/warnings.ts +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helper-types.mjs","sources":["../../../src/application/transform/helper-types.ts"],"sourcesContent":["/**\n * The helper type aliases the generator adds to the footer, declared once each. The text is the\n * original's source text as the TypeScript printer printed it, so printing it as written gives\n * the original output (ENGINEERING_PLAN 6.2 and 6.6), except for the fixes noted below.\n */\nexport interface HelperType {\n readonly name: string;\n readonly text: string;\n}\n\nfunction lines(...parts: readonly string[]): string {\n return parts.join(\"\\n\");\n}\n\nexport const HELPER_TYPES = {\n withRequired: {\n name: \"WithRequired\",\n text: lines(\"type WithRequired<T, K extends keyof T> = T & {\", \" [P in K]-?: T[P];\", \"};\"),\n },\n // `unevaluated-properties` (roadmap R11): the value types of every member of a union, so a\n // `$ref` to a `oneOf` schema gives the values of each variant, not only of the shared keys.\n propertyValues: {\n name: \"PropertyValues\",\n text: \"type PropertyValues<T> = T extends unknown ? T[keyof T] : never;\",\n },\n // Task 7.4 changes the original text on purpose: `readonly unknown[]` also flattens the arrays\n // of `--immutable` (upstream #2714, #2749), and `NonNullable` looks through nullable parents\n // (upstream #2737). The old text did not compile for those schemas.\n flattenedDeepRequired: {\n name: \"FlattenedDeepRequired\",\n text: lines(\n \"type FlattenedDeepRequired<T> = {\",\n \" [K in keyof T]-?: FlattenedDeepRequired<T[K] extends readonly unknown[] | undefined | \" +\n \"null ? Extract<T[K], readonly unknown[]>[number] : NonNullable<T[K]>>;\",\n \"};\",\n ),\n },\n // `readonly unknown[]`: a readonly array value type stays as is (upstream #2749).\n readonlyArray: {\n name: \"ReadonlyArray\",\n text: lines(\n \"type ReadonlyArray<T> = [\",\n \" Exclude<T, undefined>\",\n \"] extends [\",\n \" readonly unknown[]\",\n \"] ? Readonly<Exclude<T, undefined>> : Readonly<Exclude<T, undefined>[]>;\",\n ),\n },\n} as const satisfies Readonly<Record<string, HelperType>>;\n\n/**\n * The `--read-write-markers` helper types, written before the root types. Task 7.6 replaces the\n * original text on purpose (ADR-014): primitives (also branded), readonly arrays, tuples,\n * intersected arrays, null-only and `any` properties keep their types (upstream #2615, #2620,\n * #2632, #2717, #2765). The declarations equal the `Readable` / `Writable` that\n * openapi-typesafe-fetch declares (`test/api/read-write-marker-types.test.ts`); the text is what\n * the TypeScript printer prints.\n */\nexport const READ_WRITE_MARKER_TYPES = lines(\n \"export type $Read<T> = {\",\n \" readonly $read: T;\",\n \"};\",\n \"export type $Write<T> = {\",\n \" readonly $write: T;\",\n \"};\",\n \"type ReadWritePrimitive = string | number | boolean | bigint | symbol | null | undefined;\",\n \"type ReadWriteLeaf = ReadWritePrimitive | ((...args: never) => unknown);\",\n \"type ReadWriteMarkedKeys<T, Marker> = {\",\n \" [K in keyof T
|
|
1
|
+
{"version":3,"file":"helper-types.mjs","sources":["../../../src/application/transform/helper-types.ts"],"sourcesContent":["/**\n * The helper type aliases the generator adds to the footer, declared once each. The text is the\n * original's source text as the TypeScript printer printed it, so printing it as written gives\n * the original output (ENGINEERING_PLAN 6.2 and 6.6), except for the fixes noted below.\n */\nexport interface HelperType {\n readonly name: string;\n readonly text: string;\n}\n\nfunction lines(...parts: readonly string[]): string {\n return parts.join(\"\\n\");\n}\n\nexport const HELPER_TYPES = {\n withRequired: {\n name: \"WithRequired\",\n text: lines(\"type WithRequired<T, K extends keyof T> = T & {\", \" [P in K]-?: T[P];\", \"};\"),\n },\n // `unevaluated-properties` (roadmap R11): the value types of every member of a union, so a\n // `$ref` to a `oneOf` schema gives the values of each variant, not only of the shared keys.\n propertyValues: {\n name: \"PropertyValues\",\n text: \"type PropertyValues<T> = T extends unknown ? T[keyof T] : never;\",\n },\n // Task 7.4 changes the original text on purpose: `readonly unknown[]` also flattens the arrays\n // of `--immutable` (upstream #2714, #2749), and `NonNullable` looks through nullable parents\n // (upstream #2737). The old text did not compile for those schemas.\n flattenedDeepRequired: {\n name: \"FlattenedDeepRequired\",\n text: lines(\n \"type FlattenedDeepRequired<T> = {\",\n \" [K in keyof T]-?: FlattenedDeepRequired<T[K] extends readonly unknown[] | undefined | \" +\n \"null ? Extract<T[K], readonly unknown[]>[number] : NonNullable<T[K]>>;\",\n \"};\",\n ),\n },\n // `readonly unknown[]`: a readonly array value type stays as is (upstream #2749).\n readonlyArray: {\n name: \"ReadonlyArray\",\n text: lines(\n \"type ReadonlyArray<T> = [\",\n \" Exclude<T, undefined>\",\n \"] extends [\",\n \" readonly unknown[]\",\n \"] ? Readonly<Exclude<T, undefined>> : Readonly<Exclude<T, undefined>[]>;\",\n ),\n },\n} as const satisfies Readonly<Record<string, HelperType>>;\n\n/**\n * The `--read-write-markers` helper types, written before the root types. Task 7.6 replaces the\n * original text on purpose (ADR-014): primitives (also branded), readonly arrays, tuples,\n * intersected arrays, null-only and `any` properties keep their types (upstream #2615, #2620,\n * #2632, #2717, #2765). The declarations equal the `Readable` / `Writable` that\n * openapi-typesafe-fetch declares (`test/api/read-write-marker-types.test.ts`); the text is what\n * the TypeScript printer prints.\n */\nexport const READ_WRITE_MARKER_TYPES = lines(\n \"export type $Read<T> = {\",\n \" readonly $read: T;\",\n \"};\",\n \"export type $Write<T> = {\",\n \" readonly $write: T;\",\n \"};\",\n \"type ReadWritePrimitive = string | number | boolean | bigint | symbol | null | undefined;\",\n \"type ReadWriteLeaf = ReadWritePrimitive | ((...args: never) => unknown);\",\n \"type ReadWriteMarkedKeys<T, Marker> = keyof {\",\n \" [K in keyof T as 0 extends 1 & T[K] ? never : NonNullable<T[K]> extends never ? never : \" +\n \"NonNullable<T[K]> extends Marker ? K : never]: never;\",\n \"};\",\n 'type ReadWriteResolveArray<T extends readonly unknown[], Resolved extends \"read\" | ' +\n '\"write\"> = T[number][] extends T ? T extends unknown[] ? ReadWriteResolve<T[number], ' +\n \"Resolved>[] : readonly ReadWriteResolve<T[number], Resolved>[] : {\",\n \" [K in keyof T]: ReadWriteResolve<T[K], Resolved>;\",\n \"};\",\n 'type ReadWriteResolve<T, Resolved extends \"read\" | \"write\"> = Resolved extends \"read\" ? ' +\n \"Readable<T> : Writable<T>;\",\n \"export type Readable<T> = T extends $Write<any> ? never : T extends $Read<infer U> ? \" +\n \"Readable<U> : T extends ReadWriteLeaf ? T : T extends readonly unknown[] ? \" +\n 'ReadWriteResolveArray<T, \"read\"> : T extends object ? {',\n \" [K in keyof T as K extends ReadWriteMarkedKeys<T, $Write<any>> ? never : K]: \" +\n \"Readable<T[K]>;\",\n \"} : T;\",\n \"export type Writable<T> = T extends $Read<any> ? never : T extends $Write<infer U> ? \" +\n \"Writable<U> : T extends ReadWriteLeaf ? T : T extends readonly unknown[] ? \" +\n 'ReadWriteResolveArray<T, \"write\"> : T extends object ? {',\n \" [K in keyof T as K extends ReadWriteMarkedKeys<T, $Read<any>> ? never : K]: \" +\n \"Writable<T[K]>;\",\n \"} & {\",\n \" [K in ReadWriteMarkedKeys<T, $Read<any>>]?: never;\",\n \"} : T;\",\n);\n"],"names":[],"mappings":"AAUA,SAAS,SAAS,KAAA,EAAkC;AAClD,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEO,MAAM,YAAA,GAAe;AAAA,EAC1B,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,cAAA;AAAA,IACN,IAAA,EAAM,KAAA,CAAM,iDAAA,EAAmD,uBAAA,EAAyB,IAAI;AAAA,GAC9F;AAAA;AAAA;AAAA,EAGA,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,gBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA;AAAA;AAAA;AAAA,EAIA,qBAAA,EAAuB;AAAA,IACrB,IAAA,EAAM,uBAAA;AAAA,IACN,IAAA,EAAM,KAAA;AAAA,MACJ,mCAAA;AAAA,MACA,kKAAA;AAAA,MAEA;AAAA;AACF,GACF;AAAA;AAAA,EAEA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,eAAA;AAAA,IACN,IAAA,EAAM,KAAA;AAAA,MACJ,2BAAA;AAAA,MACA,2BAAA;AAAA,MACA,aAAA;AAAA,MACA,wBAAA;AAAA,MACA;AAAA;AACF;AAEJ;AAUO,MAAM,uBAAA,GAA0B,KAAA;AAAA,EACrC,0BAAA;AAAA,EACA,wBAAA;AAAA,EACA,IAAA;AAAA,EACA,2BAAA;AAAA,EACA,yBAAA;AAAA,EACA,IAAA;AAAA,EACA,2FAAA;AAAA,EACA,0EAAA;AAAA,EACA,+CAAA;AAAA,EACA,mJAAA;AAAA,EAEA,IAAA;AAAA,EACA,4OAAA;AAAA,EAGA,uDAAA;AAAA,EACA,IAAA;AAAA,EACA,oHAAA;AAAA,EAEA,yNAAA;AAAA,EAGA,kGAAA;AAAA,EAEA,QAAA;AAAA,EACA,0NAAA;AAAA,EAGA,iGAAA;AAAA,EAEA,OAAA;AAAA,EACA,wDAAA;AAAA,EACA;AACF;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
const jsonPointer = require('../../../domain/openapi/json-pointer.cjs');
|
|
4
|
-
const
|
|
4
|
+
const locatedNode = require('./located-node.cjs');
|
|
5
5
|
const pointerWalk = require('./pointer-walk.cjs');
|
|
6
6
|
|
|
7
7
|
const PARENT_LOCATION_PAIRS = /* @__PURE__ */ new Set([
|
|
@@ -17,7 +17,7 @@ const KEPT_PAIRS = /* @__PURE__ */ new Set(["anyOf", "oneOf", "$defs"]);
|
|
|
17
17
|
const PARENT_LOCATION_KEYWORDS = /* @__PURE__ */ new Set(["items", ...RECORD_VALUE_KEYWORDS]);
|
|
18
18
|
const INDEX_RE = /^\d+$/;
|
|
19
19
|
function childOf(node, segment) {
|
|
20
|
-
return (
|
|
20
|
+
return (locatedNode.isJsonObject(node) || Array.isArray(node)) && segment !== void 0 ? node[segment] : void 0;
|
|
21
21
|
}
|
|
22
22
|
function pairStep(value, next, path) {
|
|
23
23
|
return { path, child: childOf(value, next), length: 2, isSchema: true };
|
|
@@ -52,7 +52,7 @@ function isPathItem(path) {
|
|
|
52
52
|
}
|
|
53
53
|
function parameterStep(walk, next) {
|
|
54
54
|
const entry = childOf(childOf(walk.node, "parameters"), next);
|
|
55
|
-
const where =
|
|
55
|
+
const where = locatedNode.isJsonObject(entry) ? [String(entry.in), String(entry.name)] : [];
|
|
56
56
|
const prefix = isPathItem(walk.path) ? ["parameters"] : [];
|
|
57
57
|
return { path: [...prefix, "parameters", ...where], child: entry, length: 2, isSchema: false };
|
|
58
58
|
}
|
|
@@ -82,7 +82,7 @@ function stepAt(walk, pointer, index) {
|
|
|
82
82
|
return walk.isSchema ? schemaStep(walk.node, segment, segments[index + 1]) : documentStep(walk, segments, index);
|
|
83
83
|
}
|
|
84
84
|
function refOf(node) {
|
|
85
|
-
return
|
|
85
|
+
return locatedNode.isJsonObject(node) && typeof node.$ref === "string" ? node.$ref : null;
|
|
86
86
|
}
|
|
87
87
|
function crossed(walk, ref, refs, seen) {
|
|
88
88
|
if (seen.includes(ref)) {
|
|
@@ -1 +1 @@
|
|
|
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":";;;;;;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,CAAQA,2BAAA,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,GAAQA,2BAAA,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,GAAQC,6BAAA,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,EAAUC,0BAAA,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,OAAOF,2BAAA,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,GAAUG,yBAAa,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,MAAMC,yBAAA,CAAcC,wBAAA,EAAc,KAAK,IAAI,CAAA;AAAA,IACjE,0BAAA,EAA4B,MAAM,0BAAA,IAA8B;AAAA,GAClE;AACF;;"}
|
|
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 \"./located-node.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,5 +1,5 @@
|
|
|
1
1
|
import { appendPointer, ROOT_POINTER } from '../../../domain/openapi/json-pointer.mjs';
|
|
2
|
-
import { isJsonObject } from './
|
|
2
|
+
import { isJsonObject } from './located-node.mjs';
|
|
3
3
|
import { refPointerOf, leadingSegmentsOf, startsInSchema } from './pointer-walk.mjs';
|
|
4
4
|
|
|
5
5
|
const PARENT_LOCATION_PAIRS = /* @__PURE__ */ new Set([
|
|
@@ -1 +1 @@
|
|
|
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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"}
|
|
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 \"./located-node.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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"}
|
|
@@ -1,24 +1,14 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
const binaryContent = require('../../../domain/openapi/binary-content.cjs');
|
|
4
|
+
const locatedNode = require('./located-node.cjs');
|
|
5
|
+
const propertyShape = require('./property-shape.cjs');
|
|
4
6
|
|
|
5
7
|
const OPAQUE_KEYS = ["not", "enum", "const", "$ref"];
|
|
6
8
|
const MAX_DEPTH = 8;
|
|
7
9
|
const INDEX_RE = /^\d+$/;
|
|
8
10
|
const MISSING = { kind: "missing" };
|
|
9
11
|
const OPAQUE = { kind: "opaque" };
|
|
10
|
-
function isJsonObject(value) {
|
|
11
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
12
|
-
}
|
|
13
|
-
function followRefs(node, refs) {
|
|
14
|
-
return isJsonObject(node) && typeof node.$ref === "string" ? refs.resolve(node.$ref) : node;
|
|
15
|
-
}
|
|
16
|
-
function isNullableSchema(node) {
|
|
17
|
-
if (!isJsonObject(node)) {
|
|
18
|
-
return false;
|
|
19
|
-
}
|
|
20
|
-
return node.nullable === true || Array.isArray(node.type) && node.type.includes("null");
|
|
21
|
-
}
|
|
22
12
|
function typeNames(node) {
|
|
23
13
|
return Array.isArray(node.type) ? node.type : [node.type];
|
|
24
14
|
}
|
|
@@ -35,7 +25,7 @@ function isArrayShape(node) {
|
|
|
35
25
|
return typeNames(node).includes("array") || "items" in node;
|
|
36
26
|
}
|
|
37
27
|
function hasObjectKeywords(node) {
|
|
38
|
-
const hasProperties = isJsonObject(node.properties) && Object.keys(node.properties).length > 0;
|
|
28
|
+
const hasProperties = locatedNode.isJsonObject(node.properties) && Object.keys(node.properties).length > 0;
|
|
39
29
|
return hasProperties || Boolean(node.additionalProperties || node.patternProperties || node.$defs);
|
|
40
30
|
}
|
|
41
31
|
function emptyObjectMember(node, options) {
|
|
@@ -44,61 +34,75 @@ function emptyObjectMember(node, options) {
|
|
|
44
34
|
function isBuiltInMember(key, prototype) {
|
|
45
35
|
return key in prototype;
|
|
46
36
|
}
|
|
47
|
-
function
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
37
|
+
function isUnknownValue(value) {
|
|
38
|
+
return value === true || locatedNode.isJsonObject(value) && Object.keys(value).length === 0;
|
|
39
|
+
}
|
|
40
|
+
function typedIndexValues(owner) {
|
|
41
|
+
const { additionalProperties: values, patternProperties: patterns } = owner.node;
|
|
42
|
+
const located = [];
|
|
43
|
+
if (locatedNode.isJsonObject(values)) {
|
|
44
|
+
located.push({ node: values, location: locatedNode.childLocation(owner.location, "additionalProperties") });
|
|
51
45
|
}
|
|
52
|
-
|
|
53
|
-
|
|
46
|
+
for (const [pattern, node] of locatedNode.isJsonObject(patterns) ? Object.entries(patterns) : []) {
|
|
47
|
+
located.push({ node, location: locatedNode.childLocation(owner.location, "patternProperties", pattern) });
|
|
54
48
|
}
|
|
55
|
-
|
|
56
|
-
return isImplicit || !values && options.additionalProperties ? { kind: "index", node: void 0 } : null;
|
|
57
|
-
}
|
|
58
|
-
function isOptionalProperty(node, key, options) {
|
|
59
|
-
const required = Array.isArray(node.required) ? node.required : void 0;
|
|
60
|
-
const property = node.properties[key];
|
|
61
|
-
const hasDefault = isJsonObject(property) && property.default !== void 0;
|
|
62
|
-
const isRequired = required?.includes(key) === true || required === void 0 && options.propertiesRequiredByDefault || hasDefault && options.defaultNonNullable;
|
|
63
|
-
return !isRequired;
|
|
49
|
+
return located;
|
|
64
50
|
}
|
|
65
|
-
function
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
return
|
|
51
|
+
function indexMember(owner, isExcludedKey, input) {
|
|
52
|
+
const { additionalProperties: values, patternProperties: patterns } = owner.node;
|
|
53
|
+
const patternValues = locatedNode.isJsonObject(patterns) ? Object.values(patterns) : [];
|
|
54
|
+
const isUnknown = isUnknownValue(values) || patternValues.some(isUnknownValue) || !values && input.options.additionalProperties;
|
|
55
|
+
if (isUnknown) {
|
|
56
|
+
return { kind: "index", node: void 0, location: void 0, isOtherType: isExcludedKey };
|
|
71
57
|
}
|
|
72
|
-
const
|
|
58
|
+
const typed = typedIndexValues(owner);
|
|
59
|
+
const [only] = typed;
|
|
60
|
+
if (only === void 0 || typed.length > 1) {
|
|
61
|
+
return only === void 0 ? null : OPAQUE;
|
|
62
|
+
}
|
|
63
|
+
const isOtherType = isExcludedKey || propertyShape.hasKeptProperties(owner.node, input.options, input.refs);
|
|
64
|
+
return { kind: "index", ...only, isOtherType };
|
|
65
|
+
}
|
|
66
|
+
function objectMember(owner, key, input) {
|
|
67
|
+
const { options } = input;
|
|
68
|
+
const { node } = owner;
|
|
69
|
+
const properties = locatedNode.isJsonObject(node.properties) ? node.properties : {};
|
|
70
|
+
const isExcludedKey = Object.hasOwn(properties, key) && propertyShape.isExcludedProperty(properties[key], options, input.refs);
|
|
71
|
+
if (Object.hasOwn(properties, key) && !isExcludedKey) {
|
|
72
|
+
if (locatedNode.isJsonObject(node.discriminator)) {
|
|
73
|
+
return OPAQUE;
|
|
74
|
+
}
|
|
75
|
+
const location = locatedNode.childLocation(owner.location, "properties", key);
|
|
76
|
+
const isOptional = propertyShape.isOptionalProperty(owner, key, options);
|
|
77
|
+
const isMarked = propertyShape.isMarkedProperty(properties[key], options, input.refs);
|
|
78
|
+
return { kind: "property", node: properties[key], location, isOptional, isMarked };
|
|
79
|
+
}
|
|
80
|
+
const isUnknownShape = locatedNode.isJsonObject(node.discriminator) || node.unevaluatedProperties !== void 0;
|
|
73
81
|
if (isBuiltInMember(key, {}) || key === "$defs" || isUnknownShape) {
|
|
74
82
|
return OPAQUE;
|
|
75
83
|
}
|
|
76
|
-
return hasObjectKeywords(node) ? indexMember(
|
|
77
|
-
}
|
|
78
|
-
function schemaPresence(schema, refs) {
|
|
79
|
-
return isNullableSchema(followRefs(schema, refs)) ? "absent" : "present";
|
|
80
|
-
}
|
|
81
|
-
function propertyPresence(schema, key, options, refs) {
|
|
82
|
-
const node = followRefs(schema, refs);
|
|
83
|
-
const properties = isJsonObject(node) && isJsonObject(node.properties) ? node.properties : {};
|
|
84
|
-
if (!isJsonObject(node) || !Object.hasOwn(properties, key)) {
|
|
85
|
-
return "unknown";
|
|
86
|
-
}
|
|
87
|
-
return isOptionalProperty(node, key, options) ? "absent" : schemaPresence(properties[key], refs);
|
|
84
|
+
return hasObjectKeywords(node) ? indexMember(owner, isExcludedKey, input) ?? MISSING : emptyObjectMember(node, options);
|
|
88
85
|
}
|
|
89
86
|
function membersOf(node, keyword) {
|
|
90
87
|
const members = node[keyword];
|
|
91
88
|
return Array.isArray(members) ? members : [];
|
|
92
89
|
}
|
|
90
|
+
function locatedMembers(owner, keyword) {
|
|
91
|
+
return membersOf(owner.node, keyword).map((node, index) => ({
|
|
92
|
+
node,
|
|
93
|
+
location: locatedNode.childLocation(owner.location, keyword, String(index))
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
93
96
|
function withoutComposition(node) {
|
|
94
97
|
const { allOf: _allOf, anyOf: _anyOf, oneOf: _oneOf, ...own } = node;
|
|
95
98
|
return own;
|
|
96
99
|
}
|
|
97
100
|
function hasOwnObjectType(own) {
|
|
98
|
-
return isObjectShape(own) && (hasObjectKeywords(own) || isJsonObject(own.discriminator));
|
|
101
|
+
return isObjectShape(own) && (hasObjectKeywords(own) || locatedNode.isJsonObject(own.discriminator));
|
|
99
102
|
}
|
|
100
|
-
function composedMember(
|
|
101
|
-
const
|
|
103
|
+
function composedMember(owner, key, input) {
|
|
104
|
+
const { node } = owner;
|
|
105
|
+
const variants = [...locatedMembers(owner, "anyOf"), ...locatedMembers(owner, "oneOf")];
|
|
102
106
|
const own = withoutComposition(node);
|
|
103
107
|
const hasOwn = hasOwnObjectType(own);
|
|
104
108
|
if (variants.length > 0) {
|
|
@@ -106,7 +110,8 @@ function composedMember(node, key, input) {
|
|
|
106
110
|
const members = variants.map((variant) => memberAt(variant, key, input));
|
|
107
111
|
return isAlone && members.some((member) => member.kind === "missing") ? MISSING : OPAQUE;
|
|
108
112
|
}
|
|
109
|
-
const
|
|
113
|
+
const ownPart = { node: own, location: owner.location };
|
|
114
|
+
const parts = [...locatedMembers(owner, "allOf"), ...hasOwn ? [ownPart] : []];
|
|
110
115
|
return intersectionMember(parts.map((part) => memberAt(part, key, input)));
|
|
111
116
|
}
|
|
112
117
|
function isUnknownIndex(member) {
|
|
@@ -122,21 +127,20 @@ function intersectionMember(members) {
|
|
|
122
127
|
return typed.length === 1 && only.kind !== "opaque" ? only : OPAQUE;
|
|
123
128
|
}
|
|
124
129
|
function memberAt(schema, key, input) {
|
|
125
|
-
const
|
|
126
|
-
|
|
130
|
+
const followed = locatedNode.followLocated(schema, input.refs);
|
|
131
|
+
const { node } = followed;
|
|
132
|
+
if (!locatedNode.isJsonObject(node) || OPAQUE_KEYS.some((name) => name in node) || input.depth > MAX_DEPTH) {
|
|
127
133
|
return OPAQUE;
|
|
128
134
|
}
|
|
129
|
-
|
|
135
|
+
const owner = { ...followed, node };
|
|
136
|
+
if (propertyShape.isNullableSchema(node)) {
|
|
130
137
|
return isObjectShape(node) || isArrayShape(node) ? MISSING : OPAQUE;
|
|
131
138
|
}
|
|
132
|
-
if (input.options.readWriteMarkers) {
|
|
133
|
-
return OPAQUE;
|
|
134
|
-
}
|
|
135
139
|
if ("allOf" in node || "anyOf" in node || "oneOf" in node) {
|
|
136
|
-
return composedMember(
|
|
140
|
+
return composedMember(owner, key, { ...input, depth: input.depth + 1 });
|
|
137
141
|
}
|
|
138
142
|
if (isObjectShape(node)) {
|
|
139
|
-
return objectMember(
|
|
143
|
+
return objectMember(owner, key, input);
|
|
140
144
|
}
|
|
141
145
|
if (isArrayShape(node)) {
|
|
142
146
|
return INDEX_RE.test(key) || isBuiltInMember(key, []) ? OPAQUE : MISSING;
|
|
@@ -160,12 +164,7 @@ function generatedMember(schema, key, options, refs) {
|
|
|
160
164
|
return memberAt(schema, key, { options, refs, depth: 0 });
|
|
161
165
|
}
|
|
162
166
|
|
|
163
|
-
exports.followRefs = followRefs;
|
|
164
167
|
exports.generatedMember = generatedMember;
|
|
165
168
|
exports.isArrayShape = isArrayShape;
|
|
166
|
-
exports.isJsonObject = isJsonObject;
|
|
167
|
-
exports.isNullableSchema = isNullableSchema;
|
|
168
169
|
exports.isObjectShape = isObjectShape;
|
|
169
|
-
exports.propertyPresence = propertyPresence;
|
|
170
|
-
exports.schemaPresence = schemaPresence;
|
|
171
170
|
//# sourceMappingURL=generated-shape.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generated-shape.cjs","sources":["../../../../src/application/transform/ref-pointer/generated-shape.ts"],"sourcesContent":["import { isRawBinarySchema } from \"../../../domain/openapi/binary-content.js\";\nimport type { RefResolver, SchemaOptions } from \"../schema/schema-context.js\";\n\n/**\n * What the generated type of a schema has under a key, read from the schema itself. It answers the\n * question TypeScript answers when it checks `T[\"key\"]`, for the schema shapes where the answer is\n * sure; for every other shape it says `opaque`, so a caller never assumes an error that is not.\n */\n\nexport type GeneratedMember =\n | { readonly kind: \"property\"; readonly node: unknown; readonly isOptional: boolean }\n /** An index signature; `node` is undefined when its value type is `unknown`. */\n | { readonly kind: \"index\"; readonly node: unknown }\n | { readonly kind: \"missing\" }\n | { readonly kind: \"opaque\" };\n\ntype JsonObject = Readonly<Record<string, unknown>>;\n\nconst OPAQUE_KEYS = [\"not\", \"enum\", \"const\", \"$ref\"] as const;\n/** How deep `allOf`/`anyOf`/`oneOf` members are read; deeper shapes count as opaque. */\nconst MAX_DEPTH = 8;\nconst INDEX_RE = /^\\d+$/;\nconst MISSING: GeneratedMember = { kind: \"missing\" };\nconst OPAQUE: GeneratedMember = { kind: \"opaque\" };\n\nexport function isJsonObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** The schema a node stands for: a `$ref` is followed to its target. */\nexport function followRefs(node: unknown, refs: RefResolver): unknown {\n return isJsonObject(node) && typeof node.$ref === \"string\" ? refs.resolve(node.$ref) : node;\n}\n\n/** `nullable: true` or a `type` list with `null`: the generated type includes `null`. */\nexport function isNullableSchema(node: unknown): boolean {\n if (!isJsonObject(node)) {\n return false;\n }\n return node.nullable === true || (Array.isArray(node.type) && node.type.includes(\"null\"));\n}\n\nfunction typeNames(node: JsonObject): readonly unknown[] {\n return Array.isArray(node.type) ? node.type : [node.type];\n}\n\n/**\n * Whether the generated type is an object. One `type` name decides alone: `type: string` with\n * `properties` or `items` is `string`, as `coreType` matches the `type` before the keywords.\n */\nexport function isObjectShape(node: JsonObject): boolean {\n if (typeof node.type === \"string\") {\n return node.type === \"object\";\n }\n return (\n typeNames(node).includes(\"object\") ||\n \"properties\" in node ||\n \"additionalProperties\" in node ||\n \"patternProperties\" in node\n );\n}\n\n/** Whether the generated type is an array; one `type` name decides alone (`isObjectShape`). */\nexport function isArrayShape(node: JsonObject): boolean {\n if (typeof node.type === \"string\") {\n return node.type === \"array\";\n }\n return typeNames(node).includes(\"array\") || \"items\" in node;\n}\n\n/** Whether `objectType` writes a type for the schema; the same test as there. */\nfunction hasObjectKeywords(node: JsonObject): boolean {\n const hasProperties = isJsonObject(node.properties) && Object.keys(node.properties).length > 0;\n return (\n hasProperties || Boolean(node.additionalProperties || node.patternProperties || node.$defs)\n );\n}\n\n/**\n * A key of an object schema without object keywords. With a `type` it is `Record<string, never>`:\n * every key is `never`, and so is every key after it (or `unknown` with `--empty-objects-unknown`,\n * which has no key). Without a `type` it is `unknown`.\n */\nfunction emptyObjectMember(node: JsonObject, options: SchemaOptions): GeneratedMember {\n return node.type !== undefined && !options.emptyObjectsUnknown ? OPAQUE : MISSING;\n}\n\n/** Whether a key the object has no property for is still a member: `toString`, `length`, `0`. */\nfunction isBuiltInMember(key: string, prototype: object): boolean {\n return key in prototype;\n}\n\nfunction indexMember(node: JsonObject, options: SchemaOptions): GeneratedMember | null {\n const { additionalProperties: values, patternProperties: patterns } = node;\n if (isJsonObject(patterns) && Object.keys(patterns).length > 0) {\n return OPAQUE;\n }\n if (isJsonObject(values) && Object.keys(values).length > 0) {\n return { kind: \"index\", node: values };\n }\n const isImplicit = values === true || (isJsonObject(values) && Object.keys(values).length === 0);\n return isImplicit || (!values && options.additionalProperties)\n ? { kind: \"index\", node: undefined }\n : null;\n}\n\nfunction isOptionalProperty(node: JsonObject, key: string, options: SchemaOptions): boolean {\n const required = Array.isArray(node.required) ? node.required : undefined;\n const property = (node.properties as JsonObject)[key];\n const hasDefault = isJsonObject(property) && property.default !== undefined;\n const isRequired =\n required?.includes(key) === true ||\n (required === undefined && options.propertiesRequiredByDefault) ||\n (hasDefault && options.defaultNonNullable);\n return !isRequired;\n}\n\nfunction objectMember(node: JsonObject, key: string, options: SchemaOptions): GeneratedMember {\n const properties = isJsonObject(node.properties) ? node.properties : {};\n if (Object.hasOwn(properties, key)) {\n const property = properties[key];\n const isExcluded = options.excludeDeprecated && isJsonObject(property) && property.deprecated;\n return isExcluded || isJsonObject(node.discriminator)\n ? OPAQUE\n : { kind: \"property\", node: property, isOptional: isOptionalProperty(node, key, options) };\n }\n // `unevaluatedProperties` adds an index signature with its fix, so it counts as opaque too.\n const isUnknownShape =\n isJsonObject(node.discriminator) || node.unevaluatedProperties !== undefined;\n if (isBuiltInMember(key, {}) || key === \"$defs\" || isUnknownShape) {\n return OPAQUE;\n }\n return hasObjectKeywords(node)\n ? (indexMember(node, options) ?? MISSING)\n : emptyObjectMember(node, options);\n}\n\n/** Whether a value is there: `present`, `absent` (may be `undefined` or `null`) or `unknown`. */\nexport type Presence = \"present\" | \"absent\" | \"unknown\";\n\n/** The presence of a value of `schema` itself: `absent` when its type includes `null`. */\nexport function schemaPresence(schema: unknown, refs: RefResolver): Presence {\n return isNullableSchema(followRefs(schema, refs)) ? \"absent\" : \"present\";\n}\n\n/** The presence of property `key` of `schema`: optional or nullable is `absent`. */\nexport function propertyPresence(\n schema: unknown,\n key: string,\n options: SchemaOptions,\n refs: RefResolver,\n): Presence {\n const node = followRefs(schema, refs);\n const properties = isJsonObject(node) && isJsonObject(node.properties) ? node.properties : {};\n if (!isJsonObject(node) || !Object.hasOwn(properties, key)) {\n return \"unknown\";\n }\n return isOptionalProperty(node, key, options) ? \"absent\" : schemaPresence(properties[key], refs);\n}\n\nfunction membersOf(node: JsonObject, keyword: string): readonly unknown[] {\n const members = node[keyword];\n return Array.isArray(members) ? members : [];\n}\n\nfunction withoutComposition(node: JsonObject): JsonObject {\n const { allOf: _allOf, anyOf: _anyOf, oneOf: _oneOf, ...own } = node;\n return own;\n}\n\n/** Own keywords without an object type of their own (`properties: {}`) add no part. */\nfunction hasOwnObjectType(own: JsonObject): boolean {\n return isObjectShape(own) && (hasObjectKeywords(own) || isJsonObject(own.discriminator));\n}\n\n/**\n * `allOf` with own keywords is an intersection (`intersectionMember`).\n * `anyOf` or `oneOf` alone is a union: a key is missing if one member misses it. A mix of both\n * is written in more than one way (`anyof-properties`), so it counts as opaque.\n */\nfunction composedMember(node: JsonObject, key: string, input: MemberInput): GeneratedMember {\n const variants = [...membersOf(node, \"anyOf\"), ...membersOf(node, \"oneOf\")];\n const own = withoutComposition(node);\n const hasOwn = hasOwnObjectType(own);\n if (variants.length > 0) {\n const isAlone = membersOf(node, \"allOf\").length === 0 && !hasOwn;\n const members = variants.map((variant) => memberAt(variant, key, input));\n return isAlone && members.some((member) => member.kind === \"missing\") ? MISSING : OPAQUE;\n }\n const parts = [...membersOf(node, \"allOf\"), ...(hasOwn ? [own] : [])];\n return intersectionMember(parts.map((part) => memberAt(part, key, input)));\n}\n\nfunction isUnknownIndex(member: GeneratedMember): boolean {\n return member.kind === \"index\" && member.node === undefined;\n}\n\n/**\n * A key of an intersection: missing if every part misses it; the part's member if only one part\n * has it (`A & B` where `B` has no such key and no index signature); else opaque. A part's\n * `[key: string]: unknown` adds nothing (`unknown & T` is `T`), and only such parts give `unknown`.\n */\nfunction intersectionMember(members: readonly GeneratedMember[]): GeneratedMember {\n const found = members.filter((member) => member.kind !== \"missing\");\n const typed = found.filter((member) => !isUnknownIndex(member));\n const [only] = typed;\n if (only === undefined) {\n return found[0] ?? MISSING;\n }\n return typed.length === 1 && only.kind !== \"opaque\" ? only : OPAQUE;\n}\n\ninterface MemberInput {\n readonly options: SchemaOptions;\n readonly refs: RefResolver;\n readonly depth: number;\n}\n\nfunction memberAt(schema: unknown, key: string, input: MemberInput): GeneratedMember {\n const node = followRefs(schema, input.refs);\n if (!isJsonObject(node) || OPAQUE_KEYS.some((name) => name in node) || input.depth > MAX_DEPTH) {\n return OPAQUE;\n }\n if (isNullableSchema(node)) {\n // Every key of `T | null` is an error, unless `T` is unknown (then the type is `unknown`).\n return isObjectShape(node) || isArrayShape(node) ? MISSING : OPAQUE;\n }\n if (input.options.readWriteMarkers) {\n return OPAQUE;\n }\n if (\"allOf\" in node || \"anyOf\" in node || \"oneOf\" in node) {\n return composedMember(node, key, { ...input, depth: input.depth + 1 });\n }\n if (isObjectShape(node)) {\n return objectMember(node, key, input.options);\n }\n if (isArrayShape(node)) {\n return INDEX_RE.test(key) || isBuiltInMember(key, []) ? OPAQUE : MISSING;\n }\n // `--binary-as-blob` types raw binary strings as `Blob`, which has members of its own.\n return input.options.binaryAsBlob && isRawBinarySchema(node as never)\n ? OPAQUE\n : primitiveMember(node, key);\n}\n\n/** The JavaScript value whose members a primitive `type` has: `\"\".length`, `(0).toFixed`. */\nconst PRIMITIVE_PROTOTYPES: Readonly<Record<string, object>> = {\n string: String.prototype,\n number: Number.prototype,\n integer: Number.prototype,\n boolean: Boolean.prototype,\n};\n\n/**\n * A key of a schema with one primitive `type`: missing unless the primitive has it. Object and\n * array keywords next to that `type` do not change the type (`isObjectShape`). Without a `type`\n * and object keywords the schema is `unknown` (`objectType` writes nothing), which has no keys.\n */\nfunction primitiveMember(node: JsonObject, key: string): GeneratedMember {\n if (node.type === undefined) {\n return hasObjectKeywords(node) ? OPAQUE : MISSING;\n }\n const prototype = typeof node.type === \"string\" ? PRIMITIVE_PROTOTYPES[node.type] : undefined;\n return prototype !== undefined && !isBuiltInMember(key, prototype) ? MISSING : OPAQUE;\n}\n\n/** The member `key` of the type generated for `schema` (a `$ref` is followed first). */\nexport function generatedMember(\n schema: unknown,\n key: string,\n options: SchemaOptions,\n refs: RefResolver,\n): GeneratedMember {\n return memberAt(schema, key, { options, refs, depth: 0 });\n}\n"],"names":["isRawBinarySchema"],"mappings":";;;;AAkBA,MAAM,WAAA,GAAc,CAAC,KAAA,EAAO,MAAA,EAAQ,SAAS,MAAM,CAAA;AAEnD,MAAM,SAAA,GAAY,CAAA;AAClB,MAAM,QAAA,GAAW,OAAA;AACjB,MAAM,OAAA,GAA2B,EAAE,IAAA,EAAM,SAAA,EAAU;AACnD,MAAM,MAAA,GAA0B,EAAE,IAAA,EAAM,QAAA,EAAS;AAE1C,SAAS,aAAa,KAAA,EAAqC;AAChE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAGO,SAAS,UAAA,CAAW,MAAe,IAAA,EAA4B;AACpE,EAAA,OAAO,YAAA,CAAa,IAAI,CAAA,IAAK,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AACzF;AAGO,SAAS,iBAAiB,IAAA,EAAwB;AACvD,EAAA,IAAI,CAAC,YAAA,CAAa,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA,CAAK,QAAA,KAAa,IAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,IAAK,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AACzF;AAEA,SAAS,UAAU,IAAA,EAAsC;AACvD,EAAA,OAAO,KAAA,CAAM,QAAQ,IAAA,CAAK,IAAI,IAAI,IAAA,CAAK,IAAA,GAAO,CAAC,IAAA,CAAK,IAAI,CAAA;AAC1D;AAMO,SAAS,cAAc,IAAA,EAA2B;AACvD,EAAA,IAAI,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AACjC,IAAA,OAAO,KAAK,IAAA,KAAS,QAAA;AAAA,EACvB;AACA,EAAA,OACE,SAAA,CAAU,IAAI,CAAA,CAAE,QAAA,CAAS,QAAQ,KACjC,YAAA,IAAgB,IAAA,IAChB,sBAAA,IAA0B,IAAA,IAC1B,mBAAA,IAAuB,IAAA;AAE3B;AAGO,SAAS,aAAa,IAAA,EAA2B;AACtD,EAAA,IAAI,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AACjC,IAAA,OAAO,KAAK,IAAA,KAAS,OAAA;AAAA,EACvB;AACA,EAAA,OAAO,UAAU,IAAI,CAAA,CAAE,QAAA,CAAS,OAAO,KAAK,OAAA,IAAW,IAAA;AACzD;AAGA,SAAS,kBAAkB,IAAA,EAA2B;AACpD,EAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,IAAA,CAAK,UAAU,CAAA,IAAK,OAAO,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,GAAS,CAAA;AAC7F,EAAA,OACE,iBAAiB,OAAA,CAAQ,IAAA,CAAK,wBAAwB,IAAA,CAAK,iBAAA,IAAqB,KAAK,KAAK,CAAA;AAE9F;AAOA,SAAS,iBAAA,CAAkB,MAAkB,OAAA,EAAyC;AACpF,EAAA,OAAO,KAAK,IAAA,KAAS,MAAA,IAAa,CAAC,OAAA,CAAQ,sBAAsB,MAAA,GAAS,OAAA;AAC5E;AAGA,SAAS,eAAA,CAAgB,KAAa,SAAA,EAA4B;AAChE,EAAA,OAAO,GAAA,IAAO,SAAA;AAChB;AAEA,SAAS,WAAA,CAAY,MAAkB,OAAA,EAAgD;AACrF,EAAA,MAAM,EAAE,oBAAA,EAAsB,MAAA,EAAQ,iBAAA,EAAmB,UAAS,GAAI,IAAA;AACtE,EAAA,IAAI,YAAA,CAAa,QAAQ,CAAA,IAAK,MAAA,CAAO,KAAK,QAAQ,CAAA,CAAE,SAAS,CAAA,EAAG;AAC9D,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,YAAA,CAAa,MAAM,CAAA,IAAK,MAAA,CAAO,KAAK,MAAM,CAAA,CAAE,SAAS,CAAA,EAAG;AAC1D,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,MAAA,EAAO;AAAA,EACvC;AACA,EAAA,MAAM,UAAA,GAAa,MAAA,KAAW,IAAA,IAAS,YAAA,CAAa,MAAM,KAAK,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,KAAW,CAAA;AAC9F,EAAA,OAAO,UAAA,IAAe,CAAC,MAAA,IAAU,OAAA,CAAQ,oBAAA,GACrC,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,MAAA,EAAU,GACjC,IAAA;AACN;AAEA,SAAS,kBAAA,CAAmB,IAAA,EAAkB,GAAA,EAAa,OAAA,EAAiC;AAC1F,EAAA,MAAM,WAAW,KAAA,CAAM,OAAA,CAAQ,KAAK,QAAQ,CAAA,GAAI,KAAK,QAAA,GAAW,MAAA;AAChE,EAAA,MAAM,QAAA,GAAY,IAAA,CAAK,UAAA,CAA0B,GAAG,CAAA;AACpD,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,QAAQ,CAAA,IAAK,SAAS,OAAA,KAAY,MAAA;AAClE,EAAA,MAAM,UAAA,GACJ,QAAA,EAAU,QAAA,CAAS,GAAG,CAAA,KAAM,IAAA,IAC3B,QAAA,KAAa,MAAA,IAAa,OAAA,CAAQ,2BAAA,IAClC,UAAA,IAAc,OAAA,CAAQ,kBAAA;AACzB,EAAA,OAAO,CAAC,UAAA;AACV;AAEA,SAAS,YAAA,CAAa,IAAA,EAAkB,GAAA,EAAa,OAAA,EAAyC;AAC5F,EAAA,MAAM,aAAa,YAAA,CAAa,IAAA,CAAK,UAAU,CAAA,GAAI,IAAA,CAAK,aAAa,EAAC;AACtE,EAAA,IAAI,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,GAAG,CAAA,EAAG;AAClC,IAAA,MAAM,QAAA,GAAW,WAAW,GAAG,CAAA;AAC/B,IAAA,MAAM,aAAa,OAAA,CAAQ,iBAAA,IAAqB,YAAA,CAAa,QAAQ,KAAK,QAAA,CAAS,UAAA;AACnF,IAAA,OAAO,cAAc,YAAA,CAAa,IAAA,CAAK,aAAa,CAAA,GAChD,SACA,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,UAAU,UAAA,EAAY,kBAAA,CAAmB,IAAA,EAAM,GAAA,EAAK,OAAO,CAAA,EAAE;AAAA,EAC7F;AAEA,EAAA,MAAM,iBACJ,YAAA,CAAa,IAAA,CAAK,aAAa,CAAA,IAAK,KAAK,qBAAA,KAA0B,MAAA;AACrE,EAAA,IAAI,gBAAgB,GAAA,EAAK,EAAE,CAAA,IAAK,GAAA,KAAQ,WAAW,cAAA,EAAgB;AACjE,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,iBAAA,CAAkB,IAAI,CAAA,GACxB,WAAA,CAAY,IAAA,EAAM,OAAO,CAAA,IAAK,OAAA,GAC/B,iBAAA,CAAkB,IAAA,EAAM,OAAO,CAAA;AACrC;AAMO,SAAS,cAAA,CAAe,QAAiB,IAAA,EAA6B;AAC3E,EAAA,OAAO,iBAAiB,UAAA,CAAW,MAAA,EAAQ,IAAI,CAAC,IAAI,QAAA,GAAW,SAAA;AACjE;AAGO,SAAS,gBAAA,CACd,MAAA,EACA,GAAA,EACA,OAAA,EACA,IAAA,EACU;AACV,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,MAAA,EAAQ,IAAI,CAAA;AACpC,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,IAAI,CAAA,IAAK,YAAA,CAAa,KAAK,UAAU,CAAA,GAAI,IAAA,CAAK,UAAA,GAAa,EAAC;AAC5F,EAAA,IAAI,CAAC,aAAa,IAAI,CAAA,IAAK,CAAC,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,GAAG,CAAA,EAAG;AAC1D,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,OAAO,kBAAA,CAAmB,IAAA,EAAM,GAAA,EAAK,OAAO,CAAA,GAAI,WAAW,cAAA,CAAe,UAAA,CAAW,GAAG,CAAA,EAAG,IAAI,CAAA;AACjG;AAEA,SAAS,SAAA,CAAU,MAAkB,OAAA,EAAqC;AACxE,EAAA,MAAM,OAAA,GAAU,KAAK,OAAO,CAAA;AAC5B,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAAI,UAAU,EAAC;AAC7C;AAEA,SAAS,mBAAmB,IAAA,EAA8B;AACxD,EAAA,MAAM,EAAE,OAAO,MAAA,EAAQ,KAAA,EAAO,QAAQ,KAAA,EAAO,MAAA,EAAQ,GAAG,GAAA,EAAI,GAAI,IAAA;AAChE,EAAA,OAAO,GAAA;AACT;AAGA,SAAS,iBAAiB,GAAA,EAA0B;AAClD,EAAA,OAAO,aAAA,CAAc,GAAG,CAAA,KAAM,iBAAA,CAAkB,GAAG,CAAA,IAAK,YAAA,CAAa,IAAI,aAAa,CAAA,CAAA;AACxF;AAOA,SAAS,cAAA,CAAe,IAAA,EAAkB,GAAA,EAAa,KAAA,EAAqC;AAC1F,EAAA,MAAM,QAAA,GAAW,CAAC,GAAG,SAAA,CAAU,IAAA,EAAM,OAAO,CAAA,EAAG,GAAG,SAAA,CAAU,IAAA,EAAM,OAAO,CAAC,CAAA;AAC1E,EAAA,MAAM,GAAA,GAAM,mBAAmB,IAAI,CAAA;AACnC,EAAA,MAAM,MAAA,GAAS,iBAAiB,GAAG,CAAA;AACnC,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,UAAU,SAAA,CAAU,IAAA,EAAM,OAAO,CAAA,CAAE,MAAA,KAAW,KAAK,CAAC,MAAA;AAC1D,IAAA,MAAM,OAAA,GAAU,SAAS,GAAA,CAAI,CAAC,YAAY,QAAA,CAAS,OAAA,EAAS,GAAA,EAAK,KAAK,CAAC,CAAA;AACvE,IAAA,OAAO,OAAA,IAAW,QAAQ,IAAA,CAAK,CAAC,WAAW,MAAA,CAAO,IAAA,KAAS,SAAS,CAAA,GAAI,OAAA,GAAU,MAAA;AAAA,EACpF;AACA,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,SAAA,CAAU,IAAA,EAAM,OAAO,CAAA,EAAG,GAAI,MAAA,GAAS,CAAC,GAAG,CAAA,GAAI,EAAG,CAAA;AACpE,EAAA,OAAO,kBAAA,CAAmB,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,SAAS,IAAA,EAAM,GAAA,EAAK,KAAK,CAAC,CAAC,CAAA;AAC3E;AAEA,SAAS,eAAe,MAAA,EAAkC;AACxD,EAAA,OAAO,MAAA,CAAO,IAAA,KAAS,OAAA,IAAW,MAAA,CAAO,IAAA,KAAS,MAAA;AACpD;AAOA,SAAS,mBAAmB,OAAA,EAAsD;AAChF,EAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAA,KAAW,MAAA,CAAO,SAAS,SAAS,CAAA;AAClE,EAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,CAAC,WAAW,CAAC,cAAA,CAAe,MAAM,CAAC,CAAA;AAC9D,EAAA,MAAM,CAAC,IAAI,CAAA,GAAI,KAAA;AACf,EAAA,IAAI,SAAS,MAAA,EAAW;AACtB,IAAA,OAAO,KAAA,CAAM,CAAC,CAAA,IAAK,OAAA;AAAA,EACrB;AACA,EAAA,OAAO,MAAM,MAAA,KAAW,CAAA,IAAK,IAAA,CAAK,IAAA,KAAS,WAAW,IAAA,GAAO,MAAA;AAC/D;AAQA,SAAS,QAAA,CAAS,MAAA,EAAiB,GAAA,EAAa,KAAA,EAAqC;AACnF,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,MAAA,EAAQ,KAAA,CAAM,IAAI,CAAA;AAC1C,EAAA,IAAI,CAAC,YAAA,CAAa,IAAI,CAAA,IAAK,WAAA,CAAY,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,IAAQ,IAAI,CAAA,IAAK,KAAA,CAAM,QAAQ,SAAA,EAAW;AAC9F,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,gBAAA,CAAiB,IAAI,CAAA,EAAG;AAE1B,IAAA,OAAO,cAAc,IAAI,CAAA,IAAK,YAAA,CAAa,IAAI,IAAI,OAAA,GAAU,MAAA;AAAA,EAC/D;AACA,EAAA,IAAI,KAAA,CAAM,QAAQ,gBAAA,EAAkB;AAClC,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAA,IAAW,IAAA,IAAQ,OAAA,IAAW,IAAA,IAAQ,WAAW,IAAA,EAAM;AACzD,IAAA,OAAO,cAAA,CAAe,IAAA,EAAM,GAAA,EAAK,EAAE,GAAG,OAAO,KAAA,EAAO,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,CAAA;AAAA,EACvE;AACA,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,YAAA,CAAa,IAAA,EAAM,GAAA,EAAK,KAAA,CAAM,OAAO,CAAA;AAAA,EAC9C;AACA,EAAA,IAAI,YAAA,CAAa,IAAI,CAAA,EAAG;AACtB,IAAA,OAAO,QAAA,CAAS,KAAK,GAAG,CAAA,IAAK,gBAAgB,GAAA,EAAK,EAAE,CAAA,GAAI,MAAA,GAAS,OAAA;AAAA,EACnE;AAEA,EAAA,OAAO,KAAA,CAAM,QAAQ,YAAA,IAAgBA,+BAAA,CAAkB,IAAa,CAAA,GAChE,MAAA,GACA,eAAA,CAAgB,IAAA,EAAM,GAAG,CAAA;AAC/B;AAGA,MAAM,oBAAA,GAAyD;AAAA,EAC7D,QAAQ,MAAA,CAAO,SAAA;AAAA,EACf,QAAQ,MAAA,CAAO,SAAA;AAAA,EACf,SAAS,MAAA,CAAO,SAAA;AAAA,EAChB,SAAS,OAAA,CAAQ;AACnB,CAAA;AAOA,SAAS,eAAA,CAAgB,MAAkB,GAAA,EAA8B;AACvE,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAW;AAC3B,IAAA,OAAO,iBAAA,CAAkB,IAAI,CAAA,GAAI,MAAA,GAAS,OAAA;AAAA,EAC5C;AACA,EAAA,MAAM,SAAA,GAAY,OAAO,IAAA,CAAK,IAAA,KAAS,WAAW,oBAAA,CAAqB,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA;AACpF,EAAA,OAAO,cAAc,MAAA,IAAa,CAAC,gBAAgB,GAAA,EAAK,SAAS,IAAI,OAAA,GAAU,MAAA;AACjF;AAGO,SAAS,eAAA,CACd,MAAA,EACA,GAAA,EACA,OAAA,EACA,IAAA,EACiB;AACjB,EAAA,OAAO,QAAA,CAAS,QAAQ,GAAA,EAAK,EAAE,SAAS,IAAA,EAAM,KAAA,EAAO,GAAG,CAAA;AAC1D;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"generated-shape.cjs","sources":["../../../../src/application/transform/ref-pointer/generated-shape.ts"],"sourcesContent":["import { isRawBinarySchema } from \"../../../domain/openapi/binary-content.js\";\nimport type { RefResolver, SchemaOptions } from \"../schema/schema-context.js\";\nimport {\n childLocation,\n followLocated,\n isJsonObject,\n type JsonObject,\n type LocatedNode,\n} from \"./located-node.js\";\nimport {\n hasKeptProperties,\n isExcludedProperty,\n isMarkedProperty,\n isNullableSchema,\n isOptionalProperty,\n} from \"./property-shape.js\";\n\n/**\n * What the generated type of a schema has under a key, read from the schema itself. It answers the\n * question TypeScript answers when it checks `T[\"key\"]`, for the schema shapes where the answer is\n * sure; for every other shape it says `opaque`, so a caller never assumes an error that is not.\n */\n\nexport type GeneratedMember =\n | {\n readonly kind: \"property\";\n readonly node: unknown;\n readonly location: string | undefined;\n readonly isOptional: boolean;\n /** `$Read<T>` or `$Write<T>` (`isMarkedProperty`): no member but the marker's own. */\n readonly isMarked: boolean;\n }\n /**\n * An index signature; `node` is undefined when its value type is `unknown`. `isOtherType`: the\n * type read is not the type of the node the key names (`indexMember`).\n */\n | {\n readonly kind: \"index\";\n readonly node: unknown;\n readonly location: string | undefined;\n readonly isOtherType: boolean;\n }\n | { readonly kind: \"missing\" }\n | { readonly kind: \"opaque\" };\n\nconst OPAQUE_KEYS = [\"not\", \"enum\", \"const\", \"$ref\"] as const;\n/** How deep `allOf`/`anyOf`/`oneOf` members are read; deeper shapes count as opaque. */\nconst MAX_DEPTH = 8;\nconst INDEX_RE = /^\\d+$/;\nconst MISSING: GeneratedMember = { kind: \"missing\" };\nconst OPAQUE: GeneratedMember = { kind: \"opaque\" };\n\nfunction typeNames(node: JsonObject): readonly unknown[] {\n return Array.isArray(node.type) ? node.type : [node.type];\n}\n\n/**\n * Whether the generated type is an object. One `type` name decides alone: `type: string` with\n * `properties` or `items` is `string`, as `coreType` matches the `type` before the keywords.\n */\nexport function isObjectShape(node: JsonObject): boolean {\n if (typeof node.type === \"string\") {\n return node.type === \"object\";\n }\n return (\n typeNames(node).includes(\"object\") ||\n \"properties\" in node ||\n \"additionalProperties\" in node ||\n \"patternProperties\" in node\n );\n}\n\n/** Whether the generated type is an array; one `type` name decides alone (`isObjectShape`). */\nexport function isArrayShape(node: JsonObject): boolean {\n if (typeof node.type === \"string\") {\n return node.type === \"array\";\n }\n return typeNames(node).includes(\"array\") || \"items\" in node;\n}\n\n/** Whether `objectType` writes a type for the schema; the same test as there. */\nfunction hasObjectKeywords(node: JsonObject): boolean {\n const hasProperties = isJsonObject(node.properties) && Object.keys(node.properties).length > 0;\n return (\n hasProperties || Boolean(node.additionalProperties || node.patternProperties || node.$defs)\n );\n}\n\n/**\n * A key of an object schema without object keywords. With a `type` it is `Record<string, never>`:\n * every key is `never`, and so is every key after it (or `unknown` with `--empty-objects-unknown`,\n * which has no key). Without a `type` it is `unknown`.\n */\nfunction emptyObjectMember(node: JsonObject, options: SchemaOptions): GeneratedMember {\n return node.type !== undefined && !options.emptyObjectsUnknown ? OPAQUE : MISSING;\n}\n\n/** Whether a key the object has no property for is still a member: `toString`, `length`, `0`. */\nfunction isBuiltInMember(key: string, prototype: object): boolean {\n return key in prototype;\n}\n\n/** `additionalProperties: true` or `{}` (also as a pattern's schema): a value of `unknown`. */\nfunction isUnknownValue(value: unknown): boolean {\n return value === true || (isJsonObject(value) && Object.keys(value).length === 0);\n}\n\n/** The value schemas of an index signature none of whose values is `unknown`, located. */\nfunction typedIndexValues(owner: LocatedNode & { node: JsonObject }): LocatedNode[] {\n const { additionalProperties: values, patternProperties: patterns } = owner.node;\n const located: LocatedNode[] = [];\n if (isJsonObject(values)) {\n located.push({ node: values, location: childLocation(owner.location, \"additionalProperties\") });\n }\n for (const [pattern, node] of isJsonObject(patterns) ? Object.entries(patterns) : []) {\n located.push({ node, location: childLocation(owner.location, \"patternProperties\", pattern) });\n }\n return located;\n}\n\n/**\n * The index signature of an object schema, or null without one. Its type is the union of its\n * value schemas' types (`unknown` if one is `unknown`); a union of several counts as opaque. It\n * also holds the kept property types (`withPropertyTypes`), and a key that names a property\n * `--exclude-deprecated` left out reads it instead of that property: both are `isOtherType`.\n */\nfunction indexMember(\n owner: LocatedNode & { node: JsonObject },\n isExcludedKey: boolean,\n input: MemberInput,\n): GeneratedMember | null {\n const { additionalProperties: values, patternProperties: patterns } = owner.node;\n const patternValues = isJsonObject(patterns) ? Object.values(patterns) : [];\n const isUnknown =\n isUnknownValue(values) ||\n patternValues.some(isUnknownValue) ||\n (!values && input.options.additionalProperties);\n if (isUnknown) {\n return { kind: \"index\", node: undefined, location: undefined, isOtherType: isExcludedKey };\n }\n const typed = typedIndexValues(owner);\n const [only] = typed;\n if (only === undefined || typed.length > 1) {\n return only === undefined ? null : OPAQUE;\n }\n const isOtherType = isExcludedKey || hasKeptProperties(owner.node, input.options, input.refs);\n return { kind: \"index\", ...only, isOtherType };\n}\n\nfunction objectMember(\n owner: LocatedNode & { node: JsonObject },\n key: string,\n input: MemberInput,\n): GeneratedMember {\n const { options } = input;\n const { node } = owner;\n const properties = isJsonObject(node.properties) ? node.properties : {};\n const isExcludedKey =\n Object.hasOwn(properties, key) && isExcludedProperty(properties[key], options, input.refs);\n if (Object.hasOwn(properties, key) && !isExcludedKey) {\n if (isJsonObject(node.discriminator)) {\n return OPAQUE;\n }\n const location = childLocation(owner.location, \"properties\", key);\n const isOptional = isOptionalProperty(owner, key, options);\n const isMarked = isMarkedProperty(properties[key], options, input.refs);\n return { kind: \"property\", node: properties[key], location, isOptional, isMarked };\n }\n // `unevaluatedProperties` adds an index signature with its fix, so it counts as opaque too.\n const isUnknownShape =\n isJsonObject(node.discriminator) || node.unevaluatedProperties !== undefined;\n if (isBuiltInMember(key, {}) || key === \"$defs\" || isUnknownShape) {\n return OPAQUE;\n }\n return hasObjectKeywords(node)\n ? (indexMember(owner, isExcludedKey, input) ?? MISSING)\n : emptyObjectMember(node, options);\n}\n\nfunction membersOf(node: JsonObject, keyword: string): readonly unknown[] {\n const members = node[keyword];\n return Array.isArray(members) ? members : [];\n}\n\n/** The members of a composition keyword with their locations. */\nfunction locatedMembers(owner: LocatedNode & { node: JsonObject }, keyword: string): LocatedNode[] {\n return membersOf(owner.node, keyword).map((node, index) => ({\n node,\n location: childLocation(owner.location, keyword, String(index)),\n }));\n}\n\nfunction withoutComposition(node: JsonObject): JsonObject {\n const { allOf: _allOf, anyOf: _anyOf, oneOf: _oneOf, ...own } = node;\n return own;\n}\n\n/** Own keywords without an object type of their own (`properties: {}`) add no part. */\nfunction hasOwnObjectType(own: JsonObject): boolean {\n return isObjectShape(own) && (hasObjectKeywords(own) || isJsonObject(own.discriminator));\n}\n\n/**\n * `allOf` with own keywords is an intersection (`intersectionMember`).\n * `anyOf` or `oneOf` alone is a union: a key is missing if one member misses it. A mix of both\n * is written in more than one way (`anyof-properties`), so it counts as opaque.\n */\nfunction composedMember(\n owner: LocatedNode & { node: JsonObject },\n key: string,\n input: MemberInput,\n): GeneratedMember {\n const { node } = owner;\n const variants = [...locatedMembers(owner, \"anyOf\"), ...locatedMembers(owner, \"oneOf\")];\n const own = withoutComposition(node);\n const hasOwn = hasOwnObjectType(own);\n if (variants.length > 0) {\n const isAlone = membersOf(node, \"allOf\").length === 0 && !hasOwn;\n const members = variants.map((variant) => memberAt(variant, key, input));\n return isAlone && members.some((member) => member.kind === \"missing\") ? MISSING : OPAQUE;\n }\n const ownPart = { node: own, location: owner.location };\n const parts = [...locatedMembers(owner, \"allOf\"), ...(hasOwn ? [ownPart] : [])];\n return intersectionMember(parts.map((part) => memberAt(part, key, input)));\n}\n\nfunction isUnknownIndex(member: GeneratedMember): boolean {\n return member.kind === \"index\" && member.node === undefined;\n}\n\n/**\n * A key of an intersection: missing if every part misses it; the part's member if only one part\n * has it (`A & B` where `B` has no such key and no index signature); else opaque. A part's\n * `[key: string]: unknown` adds nothing (`unknown & T` is `T`), and only such parts give `unknown`.\n */\nfunction intersectionMember(members: readonly GeneratedMember[]): GeneratedMember {\n const found = members.filter((member) => member.kind !== \"missing\");\n const typed = found.filter((member) => !isUnknownIndex(member));\n const [only] = typed;\n if (only === undefined) {\n return found[0] ?? MISSING;\n }\n return typed.length === 1 && only.kind !== \"opaque\" ? only : OPAQUE;\n}\n\ninterface MemberInput {\n readonly options: SchemaOptions;\n readonly refs: RefResolver;\n readonly depth: number;\n}\n\nfunction memberAt(schema: LocatedNode, key: string, input: MemberInput): GeneratedMember {\n const followed = followLocated(schema, input.refs);\n const { node } = followed;\n if (!isJsonObject(node) || OPAQUE_KEYS.some((name) => name in node) || input.depth > MAX_DEPTH) {\n return OPAQUE;\n }\n const owner = { ...followed, node };\n if (isNullableSchema(node)) {\n // Every key of `T | null` is an error, unless `T` is unknown (then the type is `unknown`).\n return isObjectShape(node) || isArrayShape(node) ? MISSING : OPAQUE;\n }\n if (\"allOf\" in node || \"anyOf\" in node || \"oneOf\" in node) {\n return composedMember(owner, key, { ...input, depth: input.depth + 1 });\n }\n if (isObjectShape(node)) {\n return objectMember(owner, key, input);\n }\n if (isArrayShape(node)) {\n return INDEX_RE.test(key) || isBuiltInMember(key, []) ? OPAQUE : MISSING;\n }\n // `--binary-as-blob` types raw binary strings as `Blob`, which has members of its own.\n return input.options.binaryAsBlob && isRawBinarySchema(node as never)\n ? OPAQUE\n : primitiveMember(node, key);\n}\n\n/** The JavaScript value whose members a primitive `type` has: `\"\".length`, `(0).toFixed`. */\nconst PRIMITIVE_PROTOTYPES: Readonly<Record<string, object>> = {\n string: String.prototype,\n number: Number.prototype,\n integer: Number.prototype,\n boolean: Boolean.prototype,\n};\n\n/**\n * A key of a schema with one primitive `type`: missing unless the primitive has it. Object and\n * array keywords next to that `type` do not change the type (`isObjectShape`). Without a `type`\n * and object keywords the schema is `unknown` (`objectType` writes nothing), which has no keys.\n */\nfunction primitiveMember(node: JsonObject, key: string): GeneratedMember {\n if (node.type === undefined) {\n return hasObjectKeywords(node) ? OPAQUE : MISSING;\n }\n const prototype = typeof node.type === \"string\" ? PRIMITIVE_PROTOTYPES[node.type] : undefined;\n return prototype !== undefined && !isBuiltInMember(key, prototype) ? MISSING : OPAQUE;\n}\n\n/** The member `key` of the type generated for `schema` (a `$ref` is followed first). */\nexport function generatedMember(\n schema: LocatedNode,\n key: string,\n options: SchemaOptions,\n refs: RefResolver,\n): GeneratedMember {\n return memberAt(schema, key, { options, refs, depth: 0 });\n}\n"],"names":["isJsonObject","childLocation","hasKeptProperties","isExcludedProperty","isOptionalProperty","isMarkedProperty","followLocated","isNullableSchema","isRawBinarySchema"],"mappings":"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"}
|