openapi-typesafe 1.0.0-rc.3 → 1.0.0-rc.5
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 +1972 -0
- package/dist/adapters/node-file-system/file-claims.cjs +105 -0
- package/dist/adapters/node-file-system/file-claims.cjs.map +1 -0
- package/dist/adapters/node-file-system/file-claims.mjs +95 -0
- package/dist/adapters/node-file-system/file-claims.mjs.map +1 -0
- package/dist/adapters/node-file-system/file-identity.cjs +82 -0
- package/dist/adapters/node-file-system/file-identity.cjs.map +1 -0
- package/dist/adapters/node-file-system/file-identity.mjs +74 -0
- package/dist/adapters/node-file-system/file-identity.mjs.map +1 -0
- package/dist/adapters/node-file-system/node-file-system.cjs +97 -14
- package/dist/adapters/node-file-system/node-file-system.cjs.map +1 -1
- package/dist/adapters/node-file-system/node-file-system.mjs +97 -14
- 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 +48 -0
- package/dist/adapters/redocly-loader/bundled-mapping-copies.cjs.map +1 -0
- package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs +45 -0
- package/dist/adapters/redocly-loader/bundled-mapping-copies.mjs.map +1 -0
- package/dist/adapters/redocly-loader/bundled-ref-repair.cjs +1 -1
- package/dist/adapters/redocly-loader/bundled-ref-repair.cjs.map +1 -1
- package/dist/adapters/redocly-loader/bundled-ref-repair.mjs +2 -2
- package/dist/adapters/redocly-loader/bundled-ref-repair.mjs.map +1 -1
- package/dist/adapters/redocly-loader/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/loaded-documents.cjs +28 -0
- package/dist/adapters/redocly-loader/loaded-documents.cjs.map +1 -0
- package/dist/adapters/redocly-loader/loaded-documents.mjs +21 -0
- package/dist/adapters/redocly-loader/loaded-documents.mjs.map +1 -0
- package/dist/adapters/redocly-loader/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-named-components.cjs +137 -0
- package/dist/adapters/redocly-loader/query-named-components.cjs.map +1 -0
- package/dist/adapters/redocly-loader/query-named-components.mjs +134 -0
- package/dist/adapters/redocly-loader/query-named-components.mjs.map +1 -0
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs +40 -29
- package/dist/adapters/redocly-loader/redocly-schema-loader.cjs.map +1 -1
- package/dist/adapters/redocly-loader/redocly-schema-loader.mjs +38 -27
- package/dist/adapters/redocly-loader/redocly-schema-loader.mjs.map +1 -1
- package/dist/adapters/redocly-loader/ref-access.cjs +45 -4
- package/dist/adapters/redocly-loader/ref-access.cjs.map +1 -1
- package/dist/adapters/redocly-loader/ref-access.mjs +45 -4
- 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 +53 -12
- package/dist/adapters/redocly-loader/ref-holders.mjs.map +1 -1
- package/dist/adapters/redocly-loader/remote-body-limit.cjs +50 -0
- package/dist/adapters/redocly-loader/remote-body-limit.cjs.map +1 -0
- package/dist/adapters/redocly-loader/remote-body-limit.mjs +48 -0
- package/dist/adapters/redocly-loader/remote-body-limit.mjs.map +1 -0
- package/dist/adapters/redocly-loader/remote-fetch.cjs +40 -9
- package/dist/adapters/redocly-loader/remote-fetch.cjs.map +1 -1
- package/dist/adapters/redocly-loader/remote-fetch.mjs +40 -9
- package/dist/adapters/redocly-loader/remote-fetch.mjs.map +1 -1
- package/dist/adapters/redocly-loader/remote-node-limit.cjs +61 -0
- package/dist/adapters/redocly-loader/remote-node-limit.cjs.map +1 -0
- package/dist/adapters/redocly-loader/remote-node-limit.mjs +58 -0
- package/dist/adapters/redocly-loader/remote-node-limit.mjs.map +1 -0
- package/dist/adapters/redocly-loader/schema-load-errors.cjs +32 -8
- package/dist/adapters/redocly-loader/schema-load-errors.cjs.map +1 -1
- package/dist/adapters/redocly-loader/schema-load-errors.mjs +32 -9
- package/dist/adapters/redocly-loader/schema-load-errors.mjs.map +1 -1
- package/dist/adapters/redocly-loader/schema-source.cjs +18 -9
- package/dist/adapters/redocly-loader/schema-source.cjs.map +1 -1
- package/dist/adapters/redocly-loader/schema-source.mjs +20 -11
- package/dist/adapters/redocly-loader/schema-source.mjs.map +1 -1
- package/dist/adapters/redocly-loader/unsupported-keys.cjs +3 -5
- package/dist/adapters/redocly-loader/unsupported-keys.cjs.map +1 -1
- package/dist/adapters/redocly-loader/unsupported-keys.mjs +3 -5
- package/dist/adapters/redocly-loader/unsupported-keys.mjs.map +1 -1
- package/dist/adapters/terminal-logger/terminal-logger.cjs +10 -4
- package/dist/adapters/terminal-logger/terminal-logger.cjs.map +1 -1
- package/dist/adapters/terminal-logger/terminal-logger.mjs +10 -4
- package/dist/adapters/terminal-logger/terminal-logger.mjs.map +1 -1
- package/dist/api/default-ports.cjs +14 -2
- package/dist/api/default-ports.cjs.map +1 -1
- package/dist/api/default-ports.mjs +14 -2
- package/dist/api/default-ports.mjs.map +1 -1
- package/dist/api/discriminator-enum-parent.cjs +2 -2
- package/dist/api/discriminator-enum-parent.cjs.map +1 -1
- package/dist/api/discriminator-enum-parent.mjs +3 -3
- package/dist/api/discriminator-enum-parent.mjs.map +1 -1
- package/dist/api/discriminator-other-owners.cjs +5 -3
- package/dist/api/discriminator-other-owners.cjs.map +1 -1
- package/dist/api/discriminator-other-owners.mjs +5 -3
- package/dist/api/discriminator-other-owners.mjs.map +1 -1
- package/dist/api/discriminator-patch.cjs +5 -1
- package/dist/api/discriminator-patch.cjs.map +1 -1
- package/dist/api/discriminator-patch.mjs +5 -1
- package/dist/api/discriminator-patch.mjs.map +1 -1
- package/dist/api/discriminator-scan.cjs +15 -8
- package/dist/api/discriminator-scan.cjs.map +1 -1
- package/dist/api/discriminator-scan.mjs +15 -8
- package/dist/api/discriminator-scan.mjs.map +1 -1
- package/dist/api/document-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 -12
- package/dist/api/document-run.cjs.map +1 -1
- package/dist/api/document-run.mjs +6 -12
- package/dist/api/document-run.mjs.map +1 -1
- package/dist/api/legacy-utils.cjs.map +1 -1
- package/dist/api/legacy-utils.mjs.map +1 -1
- package/dist/api/openapi-ts.cjs +9 -6
- package/dist/api/openapi-ts.cjs.map +1 -1
- package/dist/api/openapi-ts.mjs +10 -8
- package/dist/api/openapi-ts.mjs.map +1 -1
- package/dist/api/ref-limit-options.cjs +63 -0
- package/dist/api/ref-limit-options.cjs.map +1 -0
- package/dist/api/ref-limit-options.mjs +57 -0
- package/dist/api/ref-limit-options.mjs.map +1 -0
- package/dist/api/schema-callbacks.cjs +36 -12
- package/dist/api/schema-callbacks.cjs.map +1 -1
- package/dist/api/schema-callbacks.mjs +36 -12
- package/dist/api/schema-callbacks.mjs.map +1 -1
- package/dist/api/transform-context.cjs +7 -3
- package/dist/api/transform-context.cjs.map +1 -1
- package/dist/api/transform-context.mjs +7 -3
- package/dist/api/transform-context.mjs.map +1 -1
- package/dist/api/transform-schema.cjs +47 -10
- package/dist/api/transform-schema.cjs.map +1 -1
- package/dist/api/transform-schema.mjs +48 -11
- package/dist/api/transform-schema.mjs.map +1 -1
- package/dist/application/print/text-writer.cjs +10 -3
- package/dist/application/print/text-writer.cjs.map +1 -1
- package/dist/application/print/text-writer.mjs +10 -3
- package/dist/application/print/text-writer.mjs.map +1 -1
- package/dist/application/stack-overflow.cjs +2 -1
- package/dist/application/stack-overflow.cjs.map +1 -1
- package/dist/application/stack-overflow.mjs +2 -1
- package/dist/application/stack-overflow.mjs.map +1 -1
- package/dist/application/transform/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/components.cjs +1 -1
- package/dist/application/transform/document/components.cjs.map +1 -1
- package/dist/application/transform/document/components.mjs +2 -2
- package/dist/application/transform/document/components.mjs.map +1 -1
- package/dist/application/transform/document/declared-type-names.cjs +23 -0
- package/dist/application/transform/document/declared-type-names.cjs.map +1 -0
- package/dist/application/transform/document/declared-type-names.mjs +20 -0
- package/dist/application/transform/document/declared-type-names.mjs.map +1 -0
- package/dist/application/transform/document/defs-root.cjs +1 -1
- package/dist/application/transform/document/defs-root.cjs.map +1 -1
- package/dist/application/transform/document/defs-root.mjs +2 -2
- package/dist/application/transform/document/defs-root.mjs.map +1 -1
- package/dist/application/transform/document/document.cjs +7 -2
- package/dist/application/transform/document/document.cjs.map +1 -1
- package/dist/application/transform/document/document.mjs +6 -3
- package/dist/application/transform/document/document.mjs.map +1 -1
- package/dist/application/transform/document/enum-names-given-back.cjs +62 -0
- package/dist/application/transform/document/enum-names-given-back.cjs.map +1 -0
- package/dist/application/transform/document/enum-names-given-back.mjs +58 -0
- package/dist/application/transform/document/enum-names-given-back.mjs.map +1 -0
- package/dist/application/transform/document/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/global-type-references.cjs +1 -0
- package/dist/application/transform/document/global-type-references.cjs.map +1 -1
- package/dist/application/transform/document/global-type-references.mjs +1 -1
- package/dist/application/transform/document/global-type-references.mjs.map +1 -1
- package/dist/application/transform/document/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/media-type.cjs +2 -2
- package/dist/application/transform/document/media-type.cjs.map +1 -1
- package/dist/application/transform/document/media-type.mjs +3 -3
- package/dist/application/transform/document/media-type.mjs.map +1 -1
- package/dist/application/transform/document/operation-keys-written.cjs +26 -0
- package/dist/application/transform/document/operation-keys-written.cjs.map +1 -0
- package/dist/application/transform/document/operation-keys-written.mjs +24 -0
- package/dist/application/transform/document/operation-keys-written.mjs.map +1 -0
- package/dist/application/transform/document/operation.cjs +1 -1
- package/dist/application/transform/document/operation.cjs.map +1 -1
- package/dist/application/transform/document/operation.mjs +2 -2
- package/dist/application/transform/document/operation.mjs.map +1 -1
- package/dist/application/transform/document/parameter-entries.cjs +34 -0
- package/dist/application/transform/document/parameter-entries.cjs.map +1 -0
- package/dist/application/transform/document/parameter-entries.mjs +30 -0
- package/dist/application/transform/document/parameter-entries.mjs.map +1 -0
- package/dist/application/transform/document/parameter.cjs +12 -4
- package/dist/application/transform/document/parameter.cjs.map +1 -1
- package/dist/application/transform/document/parameter.mjs +13 -5
- package/dist/application/transform/document/parameter.mjs.map +1 -1
- package/dist/application/transform/document/parameters.cjs +29 -34
- package/dist/application/transform/document/parameters.cjs.map +1 -1
- package/dist/application/transform/document/parameters.mjs +29 -34
- package/dist/application/transform/document/parameters.mjs.map +1 -1
- package/dist/application/transform/document/path-item.cjs +15 -17
- package/dist/application/transform/document/path-item.cjs.map +1 -1
- package/dist/application/transform/document/path-item.mjs +15 -19
- 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 +70 -0
- package/dist/application/transform/document/path-template-refs.cjs.map +1 -0
- package/dist/application/transform/document/path-template-refs.mjs +67 -0
- package/dist/application/transform/document/path-template-refs.mjs.map +1 -0
- package/dist/application/transform/document/paths-enum.cjs +8 -6
- package/dist/application/transform/document/paths-enum.cjs.map +1 -1
- package/dist/application/transform/document/paths-enum.mjs +8 -7
- package/dist/application/transform/document/paths-enum.mjs.map +1 -1
- package/dist/application/transform/document/paths.cjs +43 -67
- package/dist/application/transform/document/paths.cjs.map +1 -1
- package/dist/application/transform/document/paths.mjs +42 -68
- package/dist/application/transform/document/paths.mjs.map +1 -1
- package/dist/application/transform/document/referenced-parameter.cjs +80 -0
- package/dist/application/transform/document/referenced-parameter.cjs.map +1 -0
- package/dist/application/transform/document/referenced-parameter.mjs +78 -0
- package/dist/application/transform/document/referenced-parameter.mjs.map +1 -0
- package/dist/application/transform/document/request-body.cjs +1 -1
- package/dist/application/transform/document/request-body.cjs.map +1 -1
- package/dist/application/transform/document/request-body.mjs +2 -2
- package/dist/application/transform/document/request-body.mjs.map +1 -1
- package/dist/application/transform/document/response.cjs +2 -2
- package/dist/application/transform/document/response.cjs.map +1 -1
- package/dist/application/transform/document/response.mjs +3 -3
- package/dist/application/transform/document/response.mjs.map +1 -1
- package/dist/application/transform/document/responses.cjs +1 -1
- package/dist/application/transform/document/responses.cjs.map +1 -1
- package/dist/application/transform/document/responses.mjs +2 -2
- package/dist/application/transform/document/responses.mjs.map +1 -1
- package/dist/application/transform/document/root-type-aliases.cjs +8 -23
- package/dist/application/transform/document/root-type-aliases.cjs.map +1 -1
- package/dist/application/transform/document/root-type-aliases.mjs +8 -24
- package/dist/application/transform/document/root-type-aliases.mjs.map +1 -1
- package/dist/application/transform/document/type-resolution.cjs +3 -1
- package/dist/application/transform/document/type-resolution.cjs.map +1 -1
- package/dist/application/transform/document/type-resolution.mjs +3 -1
- package/dist/application/transform/document/type-resolution.mjs.map +1 -1
- package/dist/application/transform/document/webhooks.cjs +10 -3
- package/dist/application/transform/document/webhooks.cjs.map +1 -1
- package/dist/application/transform/document/webhooks.mjs +10 -3
- package/dist/application/transform/document/webhooks.mjs.map +1 -1
- package/dist/application/transform/footer/document-footer.cjs +16 -5
- package/dist/application/transform/footer/document-footer.cjs.map +1 -1
- package/dist/application/transform/footer/document-footer.mjs +16 -5
- package/dist/application/transform/footer/document-footer.mjs.map +1 -1
- package/dist/application/transform/footer/enum-name-claims.cjs +48 -0
- package/dist/application/transform/footer/enum-name-claims.cjs.map +1 -0
- package/dist/application/transform/footer/enum-name-claims.mjs +46 -0
- package/dist/application/transform/footer/enum-name-claims.mjs.map +1 -0
- package/dist/application/transform/footer/operation-keys.cjs +23 -0
- package/dist/application/transform/footer/operation-keys.cjs.map +1 -0
- package/dist/application/transform/footer/operation-keys.mjs +21 -0
- package/dist/application/transform/footer/operation-keys.mjs.map +1 -0
- package/dist/application/transform/footer/type-evaluation.cjs +4 -4
- package/dist/application/transform/footer/type-evaluation.cjs.map +1 -1
- package/dist/application/transform/footer/type-evaluation.mjs +4 -4
- package/dist/application/transform/footer/type-evaluation.mjs.map +1 -1
- package/dist/application/transform/helper-types.cjs +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/numbered-names.cjs +9 -0
- package/dist/application/transform/numbered-names.cjs.map +1 -1
- package/dist/application/transform/numbered-names.mjs +9 -1
- package/dist/application/transform/numbered-names.mjs.map +1 -1
- package/dist/application/transform/ref-pointer/generated-location.cjs +5 -5
- package/dist/application/transform/ref-pointer/generated-location.cjs.map +1 -1
- package/dist/application/transform/ref-pointer/generated-location.mjs +3 -3
- package/dist/application/transform/ref-pointer/generated-location.mjs.map +1 -1
- package/dist/application/transform/ref-pointer/generated-shape.cjs +47 -66
- package/dist/application/transform/ref-pointer/generated-shape.cjs.map +1 -1
- package/dist/application/transform/ref-pointer/generated-shape.mjs +36 -50
- 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 +68 -13
- package/dist/application/transform/ref-pointer/original-index.cjs.map +1 -1
- package/dist/application/transform/ref-pointer/original-index.mjs +70 -15
- 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 +52 -0
- package/dist/application/transform/ref-pointer/property-shape.cjs.map +1 -0
- package/dist/application/transform/ref-pointer/property-shape.mjs +45 -0
- package/dist/application/transform/ref-pointer/property-shape.mjs.map +1 -0
- package/dist/application/transform/ref-pointer/typed-walk.cjs +79 -21
- package/dist/application/transform/ref-pointer/typed-walk.cjs.map +1 -1
- package/dist/application/transform/ref-pointer/typed-walk.mjs +76 -18
- package/dist/application/transform/ref-pointer/typed-walk.mjs.map +1 -1
- package/dist/application/transform/ref-type.cjs +2 -1
- package/dist/application/transform/ref-type.cjs.map +1 -1
- package/dist/application/transform/ref-type.mjs +2 -1
- package/dist/application/transform/ref-type.mjs.map +1 -1
- package/dist/application/transform/schema/access-flags.cjs.map +1 -1
- package/dist/application/transform/schema/access-flags.mjs.map +1 -1
- package/dist/application/transform/schema/composition-type.cjs +1 -1
- package/dist/application/transform/schema/composition-type.cjs.map +1 -1
- package/dist/application/transform/schema/composition-type.mjs +2 -2
- package/dist/application/transform/schema/composition-type.mjs.map +1 -1
- package/dist/application/transform/schema/enum-rule.cjs +1 -1
- package/dist/application/transform/schema/enum-rule.cjs.map +1 -1
- package/dist/application/transform/schema/enum-rule.mjs +2 -2
- package/dist/application/transform/schema/enum-rule.mjs.map +1 -1
- package/dist/application/transform/schema/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 +18 -8
- package/dist/application/transform/schema/object-type.cjs.map +1 -1
- package/dist/application/transform/schema/object-type.mjs +19 -9
- package/dist/application/transform/schema/object-type.mjs.map +1 -1
- package/dist/application/transform/schema/ref-siblings.cjs +47 -0
- package/dist/application/transform/schema/ref-siblings.cjs.map +1 -0
- package/dist/application/transform/schema/ref-siblings.mjs +45 -0
- package/dist/application/transform/schema/ref-siblings.mjs.map +1 -0
- package/dist/application/transform/schema/schema-transform.cjs +6 -3
- package/dist/application/transform/schema/schema-transform.cjs.map +1 -1
- package/dist/application/transform/schema/schema-transform.mjs +6 -3
- 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/application/transform/schema-comment.cjs +5 -1
- package/dist/application/transform/schema-comment.cjs.map +1 -1
- package/dist/application/transform/schema-comment.mjs +5 -1
- package/dist/application/transform/schema-comment.mjs.map +1 -1
- package/dist/cli/api-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 +57 -9
- package/dist/cli/api-settings.cjs.map +1 -1
- package/dist/cli/api-settings.mjs +56 -11
- package/dist/cli/api-settings.mjs.map +1 -1
- package/dist/cli/api-writes.cjs +72 -0
- package/dist/cli/api-writes.cjs.map +1 -0
- package/dist/cli/api-writes.mjs +69 -0
- package/dist/cli/api-writes.mjs.map +1 -0
- package/dist/cli/cli-arguments.cjs +51 -11
- package/dist/cli/cli-arguments.cjs.map +1 -1
- package/dist/cli/cli-arguments.mjs +51 -11
- package/dist/cli/cli-arguments.mjs.map +1 -1
- package/dist/cli/cli-errors.cjs +29 -1
- package/dist/cli/cli-errors.cjs.map +1 -1
- package/dist/cli/cli-errors.mjs +29 -2
- package/dist/cli/cli-errors.mjs.map +1 -1
- package/dist/cli/cli-output.cjs +111 -4
- package/dist/cli/cli-output.cjs.map +1 -1
- package/dist/cli/cli-output.mjs +104 -5
- package/dist/cli/cli-output.mjs.map +1 -1
- package/dist/cli/main.cjs +13 -3
- package/dist/cli/main.cjs.map +1 -1
- package/dist/cli/main.mjs +14 -4
- package/dist/cli/main.mjs.map +1 -1
- package/dist/cli/redocly-apis.cjs +94 -37
- package/dist/cli/redocly-apis.cjs.map +1 -1
- package/dist/cli/redocly-apis.mjs +99 -42
- 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 +37 -14
- package/dist/cli/run-cli.cjs.map +1 -1
- package/dist/cli/run-cli.mjs +39 -16
- package/dist/cli/run-cli.mjs.map +1 -1
- package/dist/domain/append-all.cjs +10 -0
- package/dist/domain/append-all.cjs.map +1 -0
- package/dist/domain/append-all.mjs +8 -0
- package/dist/domain/append-all.mjs.map +1 -0
- package/dist/domain/cause-secrets.cjs +52 -0
- package/dist/domain/cause-secrets.cjs.map +1 -0
- package/dist/domain/cause-secrets.mjs +50 -0
- package/dist/domain/cause-secrets.mjs.map +1 -0
- package/dist/domain/errors.cjs +11 -3
- package/dist/domain/errors.cjs.map +1 -1
- package/dist/domain/errors.mjs +11 -3
- package/dist/domain/errors.mjs.map +1 -1
- package/dist/domain/ir/identifier-text.cjs.map +1 -1
- package/dist/domain/ir/identifier-text.mjs +1 -1
- package/dist/domain/ir/identifier-text.mjs.map +1 -1
- package/dist/domain/ir/ir-shape.cjs +187 -0
- package/dist/domain/ir/ir-shape.cjs.map +1 -0
- package/dist/domain/ir/ir-shape.mjs +184 -0
- package/dist/domain/ir/ir-shape.mjs.map +1 -0
- package/dist/domain/ir/newer-identifier-ranges.cjs +182 -29
- package/dist/domain/ir/newer-identifier-ranges.cjs.map +1 -1
- package/dist/domain/ir/newer-identifier-ranges.mjs +182 -29
- package/dist/domain/ir/newer-identifier-ranges.mjs.map +1 -1
- package/dist/domain/location-text.cjs +9 -0
- package/dist/domain/location-text.cjs.map +1 -0
- package/dist/domain/location-text.mjs +7 -0
- package/dist/domain/location-text.mjs.map +1 -0
- package/dist/domain/openapi/alias-expansion.cjs +3 -1
- package/dist/domain/openapi/alias-expansion.cjs.map +1 -1
- package/dist/domain/openapi/alias-expansion.mjs +3 -1
- package/dist/domain/openapi/alias-expansion.mjs.map +1 -1
- package/dist/domain/openapi/discriminated-union.cjs +3 -3
- package/dist/domain/openapi/discriminated-union.cjs.map +1 -1
- package/dist/domain/openapi/discriminated-union.mjs +4 -4
- package/dist/domain/openapi/discriminated-union.mjs.map +1 -1
- package/dist/domain/openapi/discriminator-conflicts.cjs +10 -6
- package/dist/domain/openapi/discriminator-conflicts.cjs.map +1 -1
- package/dist/domain/openapi/discriminator-conflicts.mjs +11 -7
- package/dist/domain/openapi/discriminator-conflicts.mjs.map +1 -1
- package/dist/domain/openapi/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/openapi/json-pointer.cjs +43 -1
- package/dist/domain/openapi/json-pointer.cjs.map +1 -1
- package/dist/domain/openapi/json-pointer.mjs +40 -2
- package/dist/domain/openapi/json-pointer.mjs.map +1 -1
- package/dist/domain/openapi/schema-dialect.cjs +15 -0
- package/dist/domain/openapi/schema-dialect.cjs.map +1 -0
- package/dist/domain/openapi/schema-dialect.mjs +12 -0
- package/dist/domain/openapi/schema-dialect.mjs.map +1 -0
- package/dist/domain/openapi/unsupported-features.cjs +1 -1
- package/dist/domain/openapi/unsupported-features.cjs.map +1 -1
- package/dist/domain/openapi/unsupported-features.mjs +2 -2
- package/dist/domain/openapi/unsupported-features.mjs.map +1 -1
- package/dist/domain/output-fixes.cjs +20 -0
- package/dist/domain/output-fixes.cjs.map +1 -1
- package/dist/domain/output-fixes.mjs +20 -0
- 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/url-secrets.cjs +48 -0
- package/dist/domain/url-secrets.cjs.map +1 -0
- package/dist/domain/url-secrets.mjs +45 -0
- package/dist/domain/url-secrets.mjs.map +1 -0
- package/dist/domain/warnings.cjs +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 +46 -20
- package/dist/index.d.mts +46 -20
- package/dist/index.d.ts +46 -20
- package/package.json +4 -5
- package/src/adapters/node-file-system/file-claims.ts +138 -0
- package/src/adapters/node-file-system/file-identity.ts +137 -0
- package/src/adapters/node-file-system/node-file-system.ts +158 -18
- package/src/adapters/pipe-safe-writer/pipe-safe-writer.ts +29 -0
- package/src/adapters/redocly-loader/bundled-mapping-copies.ts +60 -0
- package/src/adapters/redocly-loader/bundled-ref-repair.ts +2 -2
- package/src/adapters/redocly-loader/component-schemas.ts +19 -0
- package/src/adapters/redocly-loader/loaded-documents.ts +46 -0
- package/src/adapters/redocly-loader/mapping-schema-names.ts +25 -0
- package/src/adapters/redocly-loader/query-named-components.ts +201 -0
- package/src/adapters/redocly-loader/redocly-schema-loader.ts +64 -38
- package/src/adapters/redocly-loader/ref-access.ts +51 -4
- package/src/adapters/redocly-loader/ref-holders.ts +76 -15
- package/src/adapters/redocly-loader/remote-body-limit.ts +66 -0
- package/src/adapters/redocly-loader/remote-fetch.ts +85 -13
- package/src/adapters/redocly-loader/remote-node-limit.ts +102 -0
- package/src/adapters/redocly-loader/schema-load-errors.ts +52 -13
- package/src/adapters/redocly-loader/schema-source.ts +35 -11
- package/src/adapters/redocly-loader/unsupported-keys.ts +3 -7
- package/src/adapters/terminal-logger/terminal-logger.ts +17 -6
- package/src/api/default-ports.ts +33 -4
- package/src/api/discriminator-enum-parent.ts +3 -3
- package/src/api/discriminator-other-owners.ts +5 -3
- package/src/api/discriminator-patch.ts +5 -1
- package/src/api/discriminator-scan.ts +16 -8
- package/src/api/document-refs.ts +29 -1
- package/src/api/document-run.ts +10 -19
- package/src/api/legacy-utils.ts +5 -1
- package/src/api/openapi-ts.ts +26 -8
- package/src/api/ref-limit-options.ts +76 -0
- package/src/api/run-context.ts +3 -0
- package/src/api/schema-callbacks.ts +60 -17
- package/src/api/transform-context.ts +7 -3
- package/src/api/transform-schema.ts +79 -12
- package/src/application/ports/file-system.ts +47 -0
- package/src/application/ports/schema-loader.ts +11 -1
- package/src/application/print/text-writer.ts +10 -3
- package/src/application/stack-overflow.ts +9 -5
- package/src/application/transform/declared-value-types.ts +42 -0
- package/src/application/transform/document/components.ts +2 -2
- package/src/application/transform/document/declared-type-names.ts +36 -0
- package/src/application/transform/document/defs-root.ts +2 -2
- package/src/application/transform/document/document.ts +8 -5
- package/src/application/transform/document/enum-names-given-back.ts +91 -0
- package/src/application/transform/document/exploded-query-values.ts +88 -0
- package/src/application/transform/document/global-type-references.ts +1 -1
- package/src/application/transform/document/header.ts +25 -5
- package/src/application/transform/document/media-type.ts +4 -3
- package/src/application/transform/document/operation-keys-written.ts +27 -0
- package/src/application/transform/document/operation.ts +2 -2
- package/src/application/transform/document/parameter-entries.ts +70 -0
- package/src/application/transform/document/parameter.ts +21 -9
- package/src/application/transform/document/parameters.ts +56 -66
- package/src/application/transform/document/path-item.ts +16 -34
- package/src/application/transform/document/path-template-key.ts +152 -0
- package/src/application/transform/document/path-template-refs.ts +106 -0
- package/src/application/transform/document/paths-enum.ts +24 -10
- package/src/application/transform/document/paths.ts +59 -125
- package/src/application/transform/document/referenced-parameter.ts +146 -0
- package/src/application/transform/document/request-body.ts +2 -2
- package/src/application/transform/document/response.ts +3 -3
- package/src/application/transform/document/responses.ts +2 -2
- package/src/application/transform/document/root-type-aliases.ts +17 -38
- package/src/application/transform/document/type-resolution.ts +2 -1
- package/src/application/transform/document/webhooks.ts +19 -6
- package/src/application/transform/footer/document-footer.ts +36 -9
- package/src/application/transform/footer/enum-name-claims.ts +62 -0
- package/src/application/transform/footer/operation-keys.ts +28 -0
- package/src/application/transform/footer/type-evaluation.ts +4 -4
- package/src/application/transform/helper-types.ts +8 -7
- package/src/application/transform/numbered-names.ts +15 -0
- package/src/application/transform/ref-pointer/generated-location.ts +3 -3
- package/src/application/transform/ref-pointer/generated-shape.ts +67 -78
- 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 +100 -17
- 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 +97 -0
- package/src/application/transform/ref-pointer/typed-walk.ts +117 -25
- package/src/application/transform/ref-type.ts +2 -1
- package/src/application/transform/schema/access-flags.ts +5 -2
- package/src/application/transform/schema/composition-type.ts +2 -2
- package/src/application/transform/schema/enum-rule.ts +6 -2
- package/src/application/transform/schema/index-signature-type.ts +31 -0
- package/src/application/transform/schema/input-location.ts +35 -0
- package/src/application/transform/schema/object-type.ts +22 -12
- package/src/application/transform/schema/ref-siblings.ts +76 -0
- package/src/application/transform/schema/schema-context.ts +3 -0
- package/src/application/transform/schema/schema-transform.ts +6 -3
- package/src/application/transform/schema/unevaluated-properties.ts +4 -44
- package/src/application/transform/schema-comment.ts +5 -1
- package/src/application/transform/transform-context.ts +5 -0
- package/src/cli/api-logger.ts +17 -0
- package/src/cli/api-settings.ts +80 -13
- package/src/cli/api-writes.ts +117 -0
- package/src/cli/cli-arguments.ts +90 -14
- package/src/cli/cli-dependencies.ts +26 -4
- package/src/cli/cli-errors.ts +42 -1
- package/src/cli/cli-output.ts +195 -15
- package/src/cli/main.ts +14 -5
- package/src/cli/redocly-apis.ts +177 -52
- package/src/cli/ref-limits.ts +21 -2
- package/src/cli/run-cli.ts +76 -15
- package/src/domain/append-all.ts +10 -0
- package/src/domain/cause-secrets.ts +86 -0
- package/src/domain/errors.ts +16 -5
- package/src/domain/ir/identifier-text.ts +6 -5
- package/src/domain/ir/ir-shape.ts +299 -0
- package/src/domain/ir/newer-identifier-ranges.ts +183 -30
- package/src/domain/location-text.ts +12 -0
- package/src/domain/openapi/alias-expansion.ts +4 -1
- package/src/domain/openapi/discriminated-union.ts +6 -4
- package/src/domain/openapi/discriminator-conflicts.ts +21 -7
- package/src/domain/openapi/document-object.ts +2 -0
- package/src/domain/openapi/document-places.ts +78 -0
- package/src/domain/openapi/json-pointer.ts +96 -7
- package/src/domain/openapi/schema-dialect.ts +22 -0
- package/src/domain/openapi/unsupported-features.ts +2 -2
- package/src/domain/output-fixes.ts +28 -2
- package/src/domain/terminal-text.ts +44 -0
- package/src/domain/url-secrets.ts +72 -0
- package/src/domain/warnings.ts +1 -0
- package/src/types/generator-options.ts +1 -1
- package/dist/cli/main.d.cts +0 -2
- package/dist/cli/main.d.mts +0 -2
- package/dist/cli/main.d.ts +0 -2
- package/dist/domain/url-credentials.cjs +0 -10
- package/dist/domain/url-credentials.cjs.map +0 -1
- package/dist/domain/url-credentials.mjs +0 -8
- package/dist/domain/url-credentials.mjs.map +0 -1
- package/src/domain/url-credentials.ts +0 -18
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const accessFlags = require('../schema/access-flags.cjs');
|
|
4
|
+
const inputLocation = require('../schema/input-location.cjs');
|
|
5
|
+
const locatedNode = require('./located-node.cjs');
|
|
6
|
+
|
|
7
|
+
function isNullableSchema(node) {
|
|
8
|
+
if (!locatedNode.isJsonObject(node)) {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
return node.nullable === true || Array.isArray(node.type) && node.type.includes("null");
|
|
12
|
+
}
|
|
13
|
+
function isOptionalProperty(owner, key, options) {
|
|
14
|
+
const { node } = owner;
|
|
15
|
+
const required = Array.isArray(node.required) ? node.required : void 0;
|
|
16
|
+
const property = node.properties[key];
|
|
17
|
+
const hasDefault = locatedNode.isJsonObject(property) && property.default !== void 0;
|
|
18
|
+
const isDefaultRequired = hasDefault && options.defaultNonNullable && !inputLocation.isInputLocation(owner.location, options.fixes);
|
|
19
|
+
const isRequired = required?.includes(key) === true || required === void 0 && options.propertiesRequiredByDefault || isDefaultRequired;
|
|
20
|
+
return !isRequired;
|
|
21
|
+
}
|
|
22
|
+
function isExcludedProperty(property, options, refs) {
|
|
23
|
+
const resolved = locatedNode.followRefs(property, refs);
|
|
24
|
+
return options.excludeDeprecated && locatedNode.isJsonObject(resolved) && Boolean(resolved.deprecated);
|
|
25
|
+
}
|
|
26
|
+
function isMarkedProperty(value, options, refs) {
|
|
27
|
+
if (!options.readWriteMarkers || !locatedNode.isJsonObject(value)) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
const flags = accessFlags.propertyAccessFlags(value, { options, refs });
|
|
31
|
+
return flags.isReadOnly !== flags.isWriteOnly;
|
|
32
|
+
}
|
|
33
|
+
function schemaPresence(schema, refs) {
|
|
34
|
+
return isNullableSchema(locatedNode.followRefs(schema, refs)) ? "absent" : "present";
|
|
35
|
+
}
|
|
36
|
+
function propertyPresence(schema, key, options, refs) {
|
|
37
|
+
const owner = locatedNode.followLocated(schema, refs);
|
|
38
|
+
const { node } = owner;
|
|
39
|
+
const properties = locatedNode.isJsonObject(node) && locatedNode.isJsonObject(node.properties) ? node.properties : {};
|
|
40
|
+
if (!locatedNode.isJsonObject(node) || !Object.hasOwn(properties, key)) {
|
|
41
|
+
return "unknown";
|
|
42
|
+
}
|
|
43
|
+
return isOptionalProperty({ ...owner, node }, key, options) ? "absent" : schemaPresence(properties[key], refs);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
exports.isExcludedProperty = isExcludedProperty;
|
|
47
|
+
exports.isMarkedProperty = isMarkedProperty;
|
|
48
|
+
exports.isNullableSchema = isNullableSchema;
|
|
49
|
+
exports.isOptionalProperty = isOptionalProperty;
|
|
50
|
+
exports.propertyPresence = propertyPresence;
|
|
51
|
+
exports.schemaPresence = schemaPresence;
|
|
52
|
+
//# sourceMappingURL=property-shape.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"property-shape.cjs","sources":["../../../../src/application/transform/ref-pointer/property-shape.ts"],"sourcesContent":["import type { Schema } from \"../../../domain/openapi/schema-object.js\";\nimport { propertyAccessFlags } from \"../schema/access-flags.js\";\nimport { isInputLocation } from \"../schema/input-location.js\";\nimport type { RefResolver, SchemaOptions } from \"../schema/schema-context.js\";\nimport {\n followLocated,\n followRefs,\n isJsonObject,\n type JsonObject,\n type LocatedNode,\n} from \"./located-node.js\";\n\n/**\n * What the generated type of an object schema makes of one of its properties: optional, left\n * out, wrapped in a read or write marker, or a value that may be `undefined` or `null`.\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\n/**\n * Whether the generated type has the property as optional, as `objectType` decides: a `default`\n * makes a property required except in an input location, where the client may leave it out.\n */\nexport function isOptionalProperty(\n owner: LocatedNode & { node: JsonObject },\n key: string,\n options: SchemaOptions,\n): boolean {\n const { node } = owner;\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 isDefaultRequired =\n hasDefault && options.defaultNonNullable && !isInputLocation(owner.location, options.fixes);\n const isRequired =\n required?.includes(key) === true ||\n (required === undefined && options.propertiesRequiredByDefault) ||\n isDefaultRequired;\n return !isRequired;\n}\n\n/**\n * Whether `--exclude-deprecated` leaves the property out: its object, or the one its `$ref`\n * names, is deprecated (`objectType`). The key is then not in the generated type at all.\n */\nexport function isExcludedProperty(\n property: unknown,\n options: SchemaOptions,\n refs: RefResolver,\n): boolean {\n const resolved = followRefs(property, refs);\n return options.excludeDeprecated && isJsonObject(resolved) && Boolean(resolved.deprecated);\n}\n\n/**\n * Whether `--read-write-markers` wraps the type of a property or `$defs` member: one that is only\n * `readOnly` or only `writeOnly` is `$Read<T>` or `$Write<T>` (object-type.ts).\n */\nexport function isMarkedProperty(value: unknown, options: SchemaOptions, refs: RefResolver) {\n if (!options.readWriteMarkers || !isJsonObject(value)) {\n return false;\n }\n const flags = propertyAccessFlags(value as Schema, { options, refs });\n return flags.isReadOnly !== flags.isWriteOnly;\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: LocatedNode,\n key: string,\n options: SchemaOptions,\n refs: RefResolver,\n): Presence {\n const owner = followLocated(schema, refs);\n const { node } = owner;\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({ ...owner, node }, key, options)\n ? \"absent\"\n : schemaPresence(properties[key], refs);\n}\n"],"names":["isJsonObject","isInputLocation","followRefs","propertyAccessFlags","followLocated"],"mappings":";;;;;;AAkBO,SAAS,iBAAiB,IAAA,EAAwB;AACvD,EAAA,IAAI,CAACA,wBAAA,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;AAMO,SAAS,kBAAA,CACd,KAAA,EACA,GAAA,EACA,OAAA,EACS;AACT,EAAA,MAAM,EAAE,MAAK,GAAI,KAAA;AACjB,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,GAAaA,wBAAA,CAAa,QAAQ,CAAA,IAAK,SAAS,OAAA,KAAY,MAAA;AAClE,EAAA,MAAM,iBAAA,GACJ,cAAc,OAAA,CAAQ,kBAAA,IAAsB,CAACC,6BAAA,CAAgB,KAAA,CAAM,QAAA,EAAU,OAAA,CAAQ,KAAK,CAAA;AAC5F,EAAA,MAAM,UAAA,GACJ,UAAU,QAAA,CAAS,GAAG,MAAM,IAAA,IAC3B,QAAA,KAAa,MAAA,IAAa,OAAA,CAAQ,2BAAA,IACnC,iBAAA;AACF,EAAA,OAAO,CAAC,UAAA;AACV;AAMO,SAAS,kBAAA,CACd,QAAA,EACA,OAAA,EACA,IAAA,EACS;AACT,EAAA,MAAM,QAAA,GAAWC,sBAAA,CAAW,QAAA,EAAU,IAAI,CAAA;AAC1C,EAAA,OAAO,QAAQ,iBAAA,IAAqBF,wBAAA,CAAa,QAAQ,CAAA,IAAK,OAAA,CAAQ,SAAS,UAAU,CAAA;AAC3F;AAMO,SAAS,gBAAA,CAAiB,KAAA,EAAgB,OAAA,EAAwB,IAAA,EAAmB;AAC1F,EAAA,IAAI,CAAC,OAAA,CAAQ,gBAAA,IAAoB,CAACA,wBAAA,CAAa,KAAK,CAAA,EAAG;AACrD,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,QAAQG,+BAAA,CAAoB,KAAA,EAAiB,EAAE,OAAA,EAAS,MAAM,CAAA;AACpE,EAAA,OAAO,KAAA,CAAM,eAAe,KAAA,CAAM,WAAA;AACpC;AAMO,SAAS,cAAA,CAAe,QAAiB,IAAA,EAA6B;AAC3E,EAAA,OAAO,iBAAiBD,sBAAA,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,KAAA,GAAQE,yBAAA,CAAc,MAAA,EAAQ,IAAI,CAAA;AACxC,EAAA,MAAM,EAAE,MAAK,GAAI,KAAA;AACjB,EAAA,MAAM,UAAA,GAAaJ,wBAAA,CAAa,IAAI,CAAA,IAAKA,wBAAA,CAAa,KAAK,UAAU,CAAA,GAAI,IAAA,CAAK,UAAA,GAAa,EAAC;AAC5F,EAAA,IAAI,CAACA,yBAAa,IAAI,CAAA,IAAK,CAAC,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,GAAG,CAAA,EAAG;AAC1D,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,OAAO,kBAAA,CAAmB,EAAE,GAAG,KAAA,EAAO,MAAK,EAAG,GAAA,EAAK,OAAO,CAAA,GACtD,QAAA,GACA,cAAA,CAAe,UAAA,CAAW,GAAG,GAAG,IAAI,CAAA;AAC1C;;;;;;;"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { propertyAccessFlags } from '../schema/access-flags.mjs';
|
|
2
|
+
import { isInputLocation } from '../schema/input-location.mjs';
|
|
3
|
+
import { followRefs, isJsonObject, followLocated } from './located-node.mjs';
|
|
4
|
+
|
|
5
|
+
function isNullableSchema(node) {
|
|
6
|
+
if (!isJsonObject(node)) {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
return node.nullable === true || Array.isArray(node.type) && node.type.includes("null");
|
|
10
|
+
}
|
|
11
|
+
function isOptionalProperty(owner, key, options) {
|
|
12
|
+
const { node } = owner;
|
|
13
|
+
const required = Array.isArray(node.required) ? node.required : void 0;
|
|
14
|
+
const property = node.properties[key];
|
|
15
|
+
const hasDefault = isJsonObject(property) && property.default !== void 0;
|
|
16
|
+
const isDefaultRequired = hasDefault && options.defaultNonNullable && !isInputLocation(owner.location, options.fixes);
|
|
17
|
+
const isRequired = required?.includes(key) === true || required === void 0 && options.propertiesRequiredByDefault || isDefaultRequired;
|
|
18
|
+
return !isRequired;
|
|
19
|
+
}
|
|
20
|
+
function isExcludedProperty(property, options, refs) {
|
|
21
|
+
const resolved = followRefs(property, refs);
|
|
22
|
+
return options.excludeDeprecated && isJsonObject(resolved) && Boolean(resolved.deprecated);
|
|
23
|
+
}
|
|
24
|
+
function isMarkedProperty(value, options, refs) {
|
|
25
|
+
if (!options.readWriteMarkers || !isJsonObject(value)) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
const flags = propertyAccessFlags(value, { options, refs });
|
|
29
|
+
return flags.isReadOnly !== flags.isWriteOnly;
|
|
30
|
+
}
|
|
31
|
+
function schemaPresence(schema, refs) {
|
|
32
|
+
return isNullableSchema(followRefs(schema, refs)) ? "absent" : "present";
|
|
33
|
+
}
|
|
34
|
+
function propertyPresence(schema, key, options, refs) {
|
|
35
|
+
const owner = followLocated(schema, refs);
|
|
36
|
+
const { node } = owner;
|
|
37
|
+
const properties = isJsonObject(node) && isJsonObject(node.properties) ? node.properties : {};
|
|
38
|
+
if (!isJsonObject(node) || !Object.hasOwn(properties, key)) {
|
|
39
|
+
return "unknown";
|
|
40
|
+
}
|
|
41
|
+
return isOptionalProperty({ ...owner, node }, key, options) ? "absent" : schemaPresence(properties[key], refs);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export { isExcludedProperty, isMarkedProperty, isNullableSchema, isOptionalProperty, propertyPresence, schemaPresence };
|
|
45
|
+
//# sourceMappingURL=property-shape.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"property-shape.mjs","sources":["../../../../src/application/transform/ref-pointer/property-shape.ts"],"sourcesContent":["import type { Schema } from \"../../../domain/openapi/schema-object.js\";\nimport { propertyAccessFlags } from \"../schema/access-flags.js\";\nimport { isInputLocation } from \"../schema/input-location.js\";\nimport type { RefResolver, SchemaOptions } from \"../schema/schema-context.js\";\nimport {\n followLocated,\n followRefs,\n isJsonObject,\n type JsonObject,\n type LocatedNode,\n} from \"./located-node.js\";\n\n/**\n * What the generated type of an object schema makes of one of its properties: optional, left\n * out, wrapped in a read or write marker, or a value that may be `undefined` or `null`.\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\n/**\n * Whether the generated type has the property as optional, as `objectType` decides: a `default`\n * makes a property required except in an input location, where the client may leave it out.\n */\nexport function isOptionalProperty(\n owner: LocatedNode & { node: JsonObject },\n key: string,\n options: SchemaOptions,\n): boolean {\n const { node } = owner;\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 isDefaultRequired =\n hasDefault && options.defaultNonNullable && !isInputLocation(owner.location, options.fixes);\n const isRequired =\n required?.includes(key) === true ||\n (required === undefined && options.propertiesRequiredByDefault) ||\n isDefaultRequired;\n return !isRequired;\n}\n\n/**\n * Whether `--exclude-deprecated` leaves the property out: its object, or the one its `$ref`\n * names, is deprecated (`objectType`). The key is then not in the generated type at all.\n */\nexport function isExcludedProperty(\n property: unknown,\n options: SchemaOptions,\n refs: RefResolver,\n): boolean {\n const resolved = followRefs(property, refs);\n return options.excludeDeprecated && isJsonObject(resolved) && Boolean(resolved.deprecated);\n}\n\n/**\n * Whether `--read-write-markers` wraps the type of a property or `$defs` member: one that is only\n * `readOnly` or only `writeOnly` is `$Read<T>` or `$Write<T>` (object-type.ts).\n */\nexport function isMarkedProperty(value: unknown, options: SchemaOptions, refs: RefResolver) {\n if (!options.readWriteMarkers || !isJsonObject(value)) {\n return false;\n }\n const flags = propertyAccessFlags(value as Schema, { options, refs });\n return flags.isReadOnly !== flags.isWriteOnly;\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: LocatedNode,\n key: string,\n options: SchemaOptions,\n refs: RefResolver,\n): Presence {\n const owner = followLocated(schema, refs);\n const { node } = owner;\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({ ...owner, node }, key, options)\n ? \"absent\"\n : schemaPresence(properties[key], refs);\n}\n"],"names":[],"mappings":";;;;AAkBO,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;AAMO,SAAS,kBAAA,CACd,KAAA,EACA,GAAA,EACA,OAAA,EACS;AACT,EAAA,MAAM,EAAE,MAAK,GAAI,KAAA;AACjB,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,iBAAA,GACJ,cAAc,OAAA,CAAQ,kBAAA,IAAsB,CAAC,eAAA,CAAgB,KAAA,CAAM,QAAA,EAAU,OAAA,CAAQ,KAAK,CAAA;AAC5F,EAAA,MAAM,UAAA,GACJ,UAAU,QAAA,CAAS,GAAG,MAAM,IAAA,IAC3B,QAAA,KAAa,MAAA,IAAa,OAAA,CAAQ,2BAAA,IACnC,iBAAA;AACF,EAAA,OAAO,CAAC,UAAA;AACV;AAMO,SAAS,kBAAA,CACd,QAAA,EACA,OAAA,EACA,IAAA,EACS;AACT,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,QAAA,EAAU,IAAI,CAAA;AAC1C,EAAA,OAAO,QAAQ,iBAAA,IAAqB,YAAA,CAAa,QAAQ,CAAA,IAAK,OAAA,CAAQ,SAAS,UAAU,CAAA;AAC3F;AAMO,SAAS,gBAAA,CAAiB,KAAA,EAAgB,OAAA,EAAwB,IAAA,EAAmB;AAC1F,EAAA,IAAI,CAAC,OAAA,CAAQ,gBAAA,IAAoB,CAAC,YAAA,CAAa,KAAK,CAAA,EAAG;AACrD,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,QAAQ,mBAAA,CAAoB,KAAA,EAAiB,EAAE,OAAA,EAAS,MAAM,CAAA;AACpE,EAAA,OAAO,KAAA,CAAM,eAAe,KAAA,CAAM,WAAA;AACpC;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,KAAA,GAAQ,aAAA,CAAc,MAAA,EAAQ,IAAI,CAAA;AACxC,EAAA,MAAM,EAAE,MAAK,GAAI,KAAA;AACjB,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,EAAE,GAAG,KAAA,EAAO,MAAK,EAAG,GAAA,EAAK,OAAO,CAAA,GACtD,QAAA,GACA,cAAA,CAAe,UAAA,CAAW,GAAG,GAAG,IAAI,CAAA;AAC1C;;"}
|
|
@@ -3,40 +3,56 @@
|
|
|
3
3
|
const constructors = require('../../../domain/ir/constructors.cjs');
|
|
4
4
|
const refType = require('../ref-type.cjs');
|
|
5
5
|
const generatedShape = require('./generated-shape.cjs');
|
|
6
|
+
const locatedNode = require('./located-node.cjs');
|
|
6
7
|
const pointerWalk = require('./pointer-walk.cjs');
|
|
8
|
+
const propertyShape = require('./property-shape.cjs');
|
|
7
9
|
|
|
8
10
|
const DEFS_KEYWORD = "$defs";
|
|
9
11
|
function present(walk) {
|
|
10
12
|
return walk.presence === "present" ? walk.type : constructors.irReference("NonNullable", [walk.type]);
|
|
11
13
|
}
|
|
12
14
|
function indexEntries(walk, key, keyword, refs) {
|
|
13
|
-
const owner =
|
|
14
|
-
const child =
|
|
15
|
+
const owner = locatedNode.followLocated(walk, refs);
|
|
16
|
+
const child = locatedNode.isJsonObject(owner.node) ? owner.node[keyword] : void 0;
|
|
15
17
|
return {
|
|
16
18
|
...walk,
|
|
17
19
|
type: constructors.irIndexedAccess(present(walk), constructors.irKeyword(key)),
|
|
18
20
|
node: child,
|
|
19
|
-
|
|
21
|
+
location: locatedNode.childLocation(owner.location, keyword),
|
|
22
|
+
presence: propertyShape.schemaPresence(child, refs)
|
|
20
23
|
};
|
|
21
24
|
}
|
|
22
25
|
function nameStep(walk, name, isLast, input) {
|
|
23
|
-
const owner =
|
|
24
|
-
const
|
|
26
|
+
const owner = locatedNode.followLocated(walk, input.refs);
|
|
27
|
+
const { node } = owner;
|
|
28
|
+
const properties = locatedNode.isJsonObject(node) && locatedNode.isJsonObject(node.properties) ? node.properties : {};
|
|
29
|
+
const value = properties[name];
|
|
30
|
+
const { options, refs } = input;
|
|
31
|
+
const isMarkedOnTheWay = !isLast && propertyShape.isMarkedProperty(value, options, refs);
|
|
32
|
+
if (propertyShape.isExcludedProperty(value, options, refs) || isMarkedOnTheWay) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
25
35
|
const type = walk.presence === "present" ? refType.indexKeyword(walk.type, name, isLast) : refType.indexBy(present(walk), name);
|
|
26
36
|
return {
|
|
27
37
|
...walk,
|
|
28
38
|
type,
|
|
29
|
-
node:
|
|
39
|
+
node: value,
|
|
40
|
+
location: locatedNode.childLocation(walk.namesLocation, name),
|
|
30
41
|
isName: false,
|
|
31
|
-
presence:
|
|
42
|
+
presence: propertyShape.propertyPresence(walk, name, input.options, input.refs)
|
|
32
43
|
};
|
|
33
44
|
}
|
|
34
45
|
function defsStep(walk, owner, isLast) {
|
|
35
|
-
const
|
|
46
|
+
const { node } = owner;
|
|
47
|
+
const defs = locatedNode.isJsonObject(node) && locatedNode.isJsonObject(node[DEFS_KEYWORD]) ? node[DEFS_KEYWORD] : {};
|
|
48
|
+
const namesLocation = locatedNode.childLocation(owner.location, DEFS_KEYWORD);
|
|
36
49
|
return {
|
|
37
50
|
...walk,
|
|
38
51
|
type: refType.indexKeyword(present(walk), DEFS_KEYWORD, isLast),
|
|
52
|
+
// A node of its own, not in the document: its properties are the definitions.
|
|
39
53
|
node: { properties: defs, required: Object.keys(defs) },
|
|
54
|
+
location: namesLocation,
|
|
55
|
+
namesLocation,
|
|
40
56
|
isName: true,
|
|
41
57
|
presence: "present"
|
|
42
58
|
};
|
|
@@ -47,19 +63,19 @@ const SHAPED_KEYWORDS = /* @__PURE__ */ new Set([
|
|
|
47
63
|
"additionalProperties"
|
|
48
64
|
]);
|
|
49
65
|
function hasKeywordMember(owner, segment) {
|
|
50
|
-
if (!SHAPED_KEYWORDS.has(segment) || !
|
|
66
|
+
if (!SHAPED_KEYWORDS.has(segment) || !locatedNode.isJsonObject(owner)) {
|
|
51
67
|
return true;
|
|
52
68
|
}
|
|
53
69
|
return segment === "items" ? generatedShape.isArrayShape(owner) : generatedShape.isObjectShape(owner);
|
|
54
70
|
}
|
|
55
71
|
function keywordStep(walk, segment, isLast, input) {
|
|
56
|
-
const owner =
|
|
57
|
-
if (!hasKeywordMember(owner, segment)) {
|
|
72
|
+
const owner = locatedNode.followLocated(walk, input.refs);
|
|
73
|
+
if (!hasKeywordMember(owner.node, segment)) {
|
|
58
74
|
return null;
|
|
59
75
|
}
|
|
60
76
|
switch (segment) {
|
|
61
77
|
case "properties":
|
|
62
|
-
return { ...walk, isName: true };
|
|
78
|
+
return { ...walk, isName: true, namesLocation: locatedNode.childLocation(owner.location, segment) };
|
|
63
79
|
case "items":
|
|
64
80
|
return indexEntries(walk, "number", "items", input.refs);
|
|
65
81
|
case "additionalProperties":
|
|
@@ -72,15 +88,56 @@ function keywordStep(walk, segment, isLast, input) {
|
|
|
72
88
|
}
|
|
73
89
|
function containerStep(walk, index, input) {
|
|
74
90
|
const segment = input.pointer.segments[index];
|
|
75
|
-
const owner =
|
|
91
|
+
const owner = locatedNode.followRefs(walk.node, input.refs);
|
|
76
92
|
const isOptional = segment === "requestBody" && pointerWalk.isOptionalRequestBody(owner, input.refs) || pointerWalk.isOptionalHeader(input.pointer, index, owner);
|
|
77
93
|
return {
|
|
78
94
|
...walk,
|
|
79
95
|
type: refType.indexBy(present(walk), segment),
|
|
80
|
-
node:
|
|
96
|
+
node: locatedNode.isJsonObject(owner) ? owner[segment] : void 0,
|
|
97
|
+
location: locatedNode.childLocation(locatedNode.followLocated(walk, input.refs).location, segment),
|
|
81
98
|
presence: isOptional ? "absent" : "present"
|
|
82
99
|
};
|
|
83
100
|
}
|
|
101
|
+
function contentStep(walk, form, isLast, refs) {
|
|
102
|
+
const isMapTyped = form === "media-type-members" || form === "first-media-type" && !isLast;
|
|
103
|
+
if (!isMapTyped) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
const owner = locatedNode.followLocated(walk, refs);
|
|
107
|
+
return {
|
|
108
|
+
...walk,
|
|
109
|
+
node: locatedNode.isJsonObject(owner.node) ? owner.node.content : void 0,
|
|
110
|
+
location: locatedNode.childLocation(owner.location, "content"),
|
|
111
|
+
isFirstMediaType: form === "first-media-type"
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function firstMediaTypeStep(walk, segment) {
|
|
115
|
+
const content = locatedNode.isJsonObject(walk.node) ? walk.node : {};
|
|
116
|
+
if (Object.keys(content)[0] !== segment) {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
const location = locatedNode.childLocation(walk.location, segment);
|
|
120
|
+
return { ...walk, node: content[segment], location, isFirstMediaType: false };
|
|
121
|
+
}
|
|
122
|
+
function schemaStep(walk, refs) {
|
|
123
|
+
const owner = locatedNode.followLocated(walk, refs);
|
|
124
|
+
const schema = locatedNode.isJsonObject(owner.node) ? owner.node.schema : void 0;
|
|
125
|
+
const location = locatedNode.childLocation(owner.location, "schema");
|
|
126
|
+
const presence = walk.presence === "absent" ? "absent" : propertyShape.schemaPresence(schema, refs);
|
|
127
|
+
return { ...walk, node: schema, location, isSchema: true, presence };
|
|
128
|
+
}
|
|
129
|
+
function documentStep(walk, index, input) {
|
|
130
|
+
const owner = locatedNode.followRefs(walk.node, input.refs);
|
|
131
|
+
const form = pointerWalk.headerParameterContentForm(input.pointer, index, owner, input.options);
|
|
132
|
+
if (form !== null) {
|
|
133
|
+
const isLast = index === input.pointer.segments.length - 1;
|
|
134
|
+
return contentStep(walk, form, isLast, input.refs);
|
|
135
|
+
}
|
|
136
|
+
if (pointerWalk.isParameterList(input.pointer, index) || pointerWalk.isExcludedOperation(input.pointer, index, owner, input)) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
return containerStep(walk, index, input);
|
|
140
|
+
}
|
|
84
141
|
function step(walk, index, input) {
|
|
85
142
|
const { segments } = input.pointer;
|
|
86
143
|
const segment = segments[index];
|
|
@@ -88,17 +145,17 @@ function step(walk, index, input) {
|
|
|
88
145
|
if (walk.isSchema) {
|
|
89
146
|
return walk.isName ? nameStep(walk, segment, isLast, input) : keywordStep(walk, segment, isLast, input);
|
|
90
147
|
}
|
|
148
|
+
if (walk.isFirstMediaType) {
|
|
149
|
+
return firstMediaTypeStep(walk, segment);
|
|
150
|
+
}
|
|
91
151
|
if (segment === "schema" && pointerWalk.isTypedAsSchema(input.pointer, index)) {
|
|
92
|
-
|
|
93
|
-
const schema = generatedShape.isJsonObject(owner) ? owner.schema : void 0;
|
|
94
|
-
const presence = walk.presence === "absent" ? "absent" : generatedShape.schemaPresence(schema, input.refs);
|
|
95
|
-
return { ...walk, node: schema, isSchema: true, presence };
|
|
152
|
+
return schemaStep(walk, input.refs);
|
|
96
153
|
}
|
|
97
|
-
return
|
|
154
|
+
return documentStep(walk, index, input);
|
|
98
155
|
}
|
|
99
156
|
function typedWalk(input) {
|
|
100
157
|
const { pointer } = input;
|
|
101
|
-
const node = pointerWalk.
|
|
158
|
+
const { node, location } = pointerWalk.leadingLocated(pointer, input.refs);
|
|
102
159
|
const isSchema = pointerWalk.startsInSchema(pointer);
|
|
103
160
|
let walk = {
|
|
104
161
|
type: refType.indexBy(
|
|
@@ -106,9 +163,10 @@ function typedWalk(input) {
|
|
|
106
163
|
...pointer.segments.slice(0, pointerWalk.leadingSegmentsOf(pointer))
|
|
107
164
|
),
|
|
108
165
|
node,
|
|
166
|
+
location,
|
|
109
167
|
isSchema,
|
|
110
168
|
isName: false,
|
|
111
|
-
presence: isSchema ?
|
|
169
|
+
presence: isSchema ? propertyShape.schemaPresence(node, input.refs) : "present"
|
|
112
170
|
};
|
|
113
171
|
for (let index = pointerWalk.leadingSegmentsOf(pointer); index < pointer.segments.length; index++) {
|
|
114
172
|
const next = step(walk, index, input);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typed-walk.cjs","sources":["../../../../src/application/transform/ref-pointer/typed-walk.ts"],"sourcesContent":["import { irIndexedAccess, irKeyword, irReference } from \"../../../domain/ir/constructors.js\";\nimport type { IrKeyword, IrType } from \"../../../domain/ir/nodes.js\";\nimport { indexBy, indexKeyword, rootType } from \"../ref-type.js\";\nimport type { RefResolver, SchemaOptions } from \"../schema/schema-context.js\";\nimport {\n followRefs,\n isArrayShape,\n isJsonObject,\n isObjectShape,\n type Presence,\n propertyPresence,\n schemaPresence,\n} from \"./generated-shape.js\";\nimport {\n isOptionalHeader,\n isOptionalRequestBody,\n isParameterList,\n isTypedAsSchema,\n leadingNode,\n leadingSegmentsOf,\n type RefPointer,\n startsInSchema,\n} from \"./pointer-walk.js\";\n\n/**\n * The type of a `$ref` pointer as the generated types have it: the `schema` of a media type,\n * header or component parameter is its type, `items` is indexed by `number`,\n * `additionalProperties` by `string`, and a value that may be `undefined` or `null` is wrapped in\n * `NonNullable` before it is indexed. The walk stops at a segment with no type of its own\n * (`allOf/0`, `definitions/A`, operation `parameters/0`): the caller types the target itself.\n */\n\nconst DEFS_KEYWORD = \"$defs\";\n\nexport interface TypedWalk {\n readonly type: IrType;\n /** The document node the type stands for (not followed through a `$ref`). */\n readonly node: unknown;\n readonly isSchema: boolean;\n /** The segment is a property or `$defs` name, not a keyword. */\n readonly isName: boolean;\n readonly presence: Presence;\n}\n\nexport interface TypedWalkInput {\n readonly pointer: RefPointer;\n readonly options: SchemaOptions;\n readonly refs: RefResolver;\n}\n\n/** The walk result: a type, or the index of the first segment that has no type. */\nexport type TypedWalkResult =\n | { readonly kind: \"typed\"; readonly walk: TypedWalk }\n | { readonly kind: \"untyped\"; readonly index: number };\n\nfunction present(walk: TypedWalk): IrType {\n return walk.presence === \"present\" ? walk.type : irReference(\"NonNullable\", [walk.type]);\n}\n\nfunction indexEntries(walk: TypedWalk, key: IrKeyword, keyword: string, refs: RefResolver) {\n const owner = followRefs(walk.node, refs);\n const child = isJsonObject(owner) ? owner[keyword] : undefined;\n return {\n ...walk,\n type: irIndexedAccess(present(walk), irKeyword(key)),\n node: child,\n presence: schemaPresence(child, refs),\n };\n}\n\nfunction nameStep(walk: TypedWalk, name: string, isLast: boolean, input: TypedWalkInput) {\n const owner = followRefs(walk.node, input.refs);\n const properties = isJsonObject(owner) && isJsonObject(owner.properties) ? owner.properties : {};\n const type =\n walk.presence === \"present\"\n ? indexKeyword(walk.type, name, isLast)\n : indexBy(present(walk), name);\n return {\n ...walk,\n type,\n node: properties[name],\n isName: false,\n presence: propertyPresence(walk.node, name, input.options, input.refs),\n };\n}\n\n/** `$defs` is optional (`NonNullable` when more follows); its members are present. */\nfunction defsStep(walk: TypedWalk, owner: unknown, isLast: boolean): TypedWalk {\n const defs = isJsonObject(owner) && isJsonObject(owner[DEFS_KEYWORD]) ? owner[DEFS_KEYWORD] : {};\n return {\n ...walk,\n type: indexKeyword(present(walk), DEFS_KEYWORD, isLast),\n node: { properties: defs, required: Object.keys(defs) },\n isName: true,\n presence: \"present\",\n };\n}\n\nconst SHAPED_KEYWORDS: ReadonlySet<string> = new Set([\n \"properties\",\n \"items\",\n \"additionalProperties\",\n]);\n\n/**\n * Whether the keyword gives the owner's generated type a member: `items` only an array,\n * `properties` and `additionalProperties` only an object (`type: string` ignores them). A node\n * that is not in the document is indexed as the keyword says.\n */\nfunction hasKeywordMember(owner: unknown, segment: string): boolean {\n if (!SHAPED_KEYWORDS.has(segment) || !isJsonObject(owner)) {\n return true;\n }\n return segment === \"items\" ? isArrayShape(owner) : isObjectShape(owner);\n}\n\nfunction keywordStep(walk: TypedWalk, segment: string, isLast: boolean, input: TypedWalkInput) {\n const owner = followRefs(walk.node, input.refs);\n if (!hasKeywordMember(owner, segment)) {\n return null;\n }\n switch (segment) {\n case \"properties\":\n return { ...walk, isName: true };\n case \"items\":\n return indexEntries(walk, \"number\", \"items\", input.refs);\n case \"additionalProperties\":\n return indexEntries(walk, \"string\", \"additionalProperties\", input.refs);\n case DEFS_KEYWORD:\n return defsStep(walk, owner, isLast);\n default:\n return null;\n }\n}\n\nfunction containerStep(walk: TypedWalk, index: number, input: TypedWalkInput): TypedWalk {\n const segment = input.pointer.segments[index] as string;\n const owner = followRefs(walk.node, input.refs);\n const isOptional =\n (segment === \"requestBody\" && isOptionalRequestBody(owner, input.refs)) ||\n isOptionalHeader(input.pointer, index, owner);\n return {\n ...walk,\n type: indexBy(present(walk), segment),\n node: isJsonObject(owner) ? owner[segment] : undefined,\n presence: isOptional ? \"absent\" : \"present\",\n };\n}\n\nfunction step(walk: TypedWalk, index: number, input: TypedWalkInput): TypedWalk | null {\n const { segments } = input.pointer;\n const segment = segments[index] as string;\n const isLast = index === segments.length - 1;\n if (walk.isSchema) {\n return walk.isName\n ? nameStep(walk, segment, isLast, input)\n : keywordStep(walk, segment, isLast, input);\n }\n if (segment === \"schema\" && isTypedAsSchema(input.pointer, index)) {\n const owner = followRefs(walk.node, input.refs);\n const schema = isJsonObject(owner) ? owner.schema : undefined;\n // The container's type is its schema's type: an optional header stays optional.\n const presence = walk.presence === \"absent\" ? \"absent\" : schemaPresence(schema, input.refs);\n return { ...walk, node: schema, isSchema: true, presence };\n }\n return isParameterList(input.pointer, index) ? null : containerStep(walk, index, input);\n}\n\n/** Walk the whole pointer; see the module comment. */\nexport function typedWalk(input: TypedWalkInput): TypedWalkResult {\n const { pointer } = input;\n const node = leadingNode(pointer, input.refs);\n const isSchema = startsInSchema(pointer);\n let walk: TypedWalk = {\n type: indexBy(\n rootType(pointer.rootSegment, false),\n ...pointer.segments.slice(0, leadingSegmentsOf(pointer)),\n ),\n node,\n isSchema,\n isName: false,\n presence: isSchema ? schemaPresence(node, input.refs) : \"present\",\n };\n for (let index = leadingSegmentsOf(pointer); index < pointer.segments.length; index++) {\n const next = step(walk, index, input);\n if (next === null) {\n return { kind: \"untyped\", index };\n }\n walk = next;\n }\n return { kind: \"typed\", walk };\n}\n"],"names":["irReference","followRefs","isJsonObject","irIndexedAccess","irKeyword","schemaPresence","indexKeyword","indexBy","propertyPresence","isArrayShape","isObjectShape","isOptionalRequestBody","isOptionalHeader","isTypedAsSchema","isParameterList","leadingNode","startsInSchema","rootType","leadingSegmentsOf"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"typed-walk.cjs","sources":["../../../../src/application/transform/ref-pointer/typed-walk.ts"],"sourcesContent":["import { irIndexedAccess, irKeyword, irReference } from \"../../../domain/ir/constructors.js\";\nimport type { IrKeyword, IrType } from \"../../../domain/ir/nodes.js\";\nimport { indexBy, indexKeyword, rootType } from \"../ref-type.js\";\nimport type { RefResolver, SchemaOptions } from \"../schema/schema-context.js\";\nimport { isArrayShape, isObjectShape } from \"./generated-shape.js\";\nimport {\n childLocation,\n followLocated,\n followRefs,\n isJsonObject,\n type LocatedNode,\n} from \"./located-node.js\";\nimport {\n type ContentForm,\n headerParameterContentForm,\n isExcludedOperation,\n isOptionalHeader,\n isOptionalRequestBody,\n isParameterList,\n isTypedAsSchema,\n leadingLocated,\n leadingSegmentsOf,\n type RefPointer,\n startsInSchema,\n} from \"./pointer-walk.js\";\nimport {\n isExcludedProperty,\n isMarkedProperty,\n type Presence,\n propertyPresence,\n schemaPresence,\n} from \"./property-shape.js\";\n\n/**\n * The type of a `$ref` pointer as the generated types have it: the `schema` of a media type,\n * header or component parameter is its type, `items` is indexed by `number`,\n * `additionalProperties` by `string`, and a value that may be `undefined` or `null` is wrapped in\n * `NonNullable` before it is indexed. The walk stops at a segment with no type of its own\n * (`allOf/0`, `definitions/A`, operation `parameters/0`): the caller types the target itself.\n */\n\nconst DEFS_KEYWORD = \"$defs\";\n\nexport interface TypedWalk {\n readonly type: IrType;\n /** The document node the type stands for (not followed through a `$ref`). */\n readonly node: unknown;\n /** The node's JSON Pointer, where the generator writes its type (`LocatedNode`). */\n readonly location: string | undefined;\n readonly isSchema: boolean;\n /** The segment is a property or `$defs` name, not a keyword. */\n readonly isName: boolean;\n /** The location of the map of names (`properties` or `$defs`) when `isName`. */\n readonly namesLocation?: string | undefined;\n /**\n * The node is the `content` of a header or parameter typed as its first media type, so the\n * next segment must name that media type and adds no member.\n */\n readonly isFirstMediaType?: boolean;\n readonly presence: Presence;\n}\n\nexport interface TypedWalkInput {\n readonly pointer: RefPointer;\n readonly options: SchemaOptions;\n readonly refs: RefResolver;\n}\n\n/** The walk result: a type, or the index of the first segment that has no type. */\nexport type TypedWalkResult =\n | { readonly kind: \"typed\"; readonly walk: TypedWalk }\n | { readonly kind: \"untyped\"; readonly index: number };\n\nfunction present(walk: TypedWalk): IrType {\n return walk.presence === \"present\" ? walk.type : irReference(\"NonNullable\", [walk.type]);\n}\n\nfunction indexEntries(walk: TypedWalk, key: IrKeyword, keyword: string, refs: RefResolver) {\n const owner = followLocated(walk, refs);\n const child = isJsonObject(owner.node) ? owner.node[keyword] : undefined;\n return {\n ...walk,\n type: irIndexedAccess(present(walk), irKeyword(key)),\n node: child,\n location: childLocation(owner.location, keyword),\n presence: schemaPresence(child, refs),\n };\n}\n\n/**\n * A property `--exclude-deprecated` left out has no member to index, and the `$Read<T>` or\n * `$Write<T>` of a marked property has no member but the marker's: such a pointer is typed in\n * place.\n */\nfunction nameStep(walk: TypedWalk, name: string, isLast: boolean, input: TypedWalkInput) {\n const owner = followLocated(walk, input.refs);\n const { node } = owner;\n const properties = isJsonObject(node) && isJsonObject(node.properties) ? node.properties : {};\n const value = properties[name];\n const { options, refs } = input;\n const isMarkedOnTheWay = !isLast && isMarkedProperty(value, options, refs);\n if (isExcludedProperty(value, options, refs) || isMarkedOnTheWay) {\n return null;\n }\n const type =\n walk.presence === \"present\"\n ? indexKeyword(walk.type, name, isLast)\n : indexBy(present(walk), name);\n return {\n ...walk,\n type,\n node: value,\n location: childLocation(walk.namesLocation, name),\n isName: false,\n presence: propertyPresence(walk, name, input.options, input.refs),\n };\n}\n\n/** `$defs` is optional (`NonNullable` when more follows); its members are present. */\nfunction defsStep(walk: TypedWalk, owner: LocatedNode, isLast: boolean): TypedWalk {\n const { node } = owner;\n const defs = isJsonObject(node) && isJsonObject(node[DEFS_KEYWORD]) ? node[DEFS_KEYWORD] : {};\n const namesLocation = childLocation(owner.location, DEFS_KEYWORD);\n return {\n ...walk,\n type: indexKeyword(present(walk), DEFS_KEYWORD, isLast),\n // A node of its own, not in the document: its properties are the definitions.\n node: { properties: defs, required: Object.keys(defs) },\n location: namesLocation,\n namesLocation,\n isName: true,\n presence: \"present\",\n };\n}\n\nconst SHAPED_KEYWORDS: ReadonlySet<string> = new Set([\n \"properties\",\n \"items\",\n \"additionalProperties\",\n]);\n\n/**\n * Whether the keyword gives the owner's generated type a member: `items` only an array,\n * `properties` and `additionalProperties` only an object (`type: string` ignores them). A node\n * that is not in the document is indexed as the keyword says.\n */\nfunction hasKeywordMember(owner: unknown, segment: string): boolean {\n if (!SHAPED_KEYWORDS.has(segment) || !isJsonObject(owner)) {\n return true;\n }\n return segment === \"items\" ? isArrayShape(owner) : isObjectShape(owner);\n}\n\nfunction keywordStep(walk: TypedWalk, segment: string, isLast: boolean, input: TypedWalkInput) {\n const owner = followLocated(walk, input.refs);\n if (!hasKeywordMember(owner.node, segment)) {\n return null;\n }\n switch (segment) {\n case \"properties\":\n return { ...walk, isName: true, namesLocation: childLocation(owner.location, segment) };\n case \"items\":\n return indexEntries(walk, \"number\", \"items\", input.refs);\n case \"additionalProperties\":\n return indexEntries(walk, \"string\", \"additionalProperties\", input.refs);\n case DEFS_KEYWORD:\n return defsStep(walk, owner, isLast);\n default:\n return null;\n }\n}\n\nfunction containerStep(walk: TypedWalk, index: number, input: TypedWalkInput): TypedWalk {\n const segment = input.pointer.segments[index] as string;\n const owner = followRefs(walk.node, input.refs);\n const isOptional =\n (segment === \"requestBody\" && isOptionalRequestBody(owner, input.refs)) ||\n isOptionalHeader(input.pointer, index, owner);\n return {\n ...walk,\n type: indexBy(present(walk), segment),\n node: isJsonObject(owner) ? owner[segment] : undefined,\n location: childLocation(followLocated(walk, input.refs).location, segment),\n presence: isOptional ? \"absent\" : \"present\",\n };\n}\n\n/**\n * The `content` of a header or parameter: no member of its own, since the type holds its media\n * types (or the first one's type). Untyped where the type is `string` or a `schema`'s, and as the\n * last segment of the first media type form, whose type is not the map's.\n */\nfunction contentStep(walk: TypedWalk, form: ContentForm, isLast: boolean, refs: RefResolver) {\n const isMapTyped = form === \"media-type-members\" || (form === \"first-media-type\" && !isLast);\n if (!isMapTyped) {\n return null;\n }\n const owner = followLocated(walk, refs);\n return {\n ...walk,\n node: isJsonObject(owner.node) ? owner.node.content : undefined,\n location: childLocation(owner.location, \"content\"),\n isFirstMediaType: form === \"first-media-type\",\n };\n}\n\n/** The first media type of such a `content` is the type itself; another one has no type. */\nfunction firstMediaTypeStep(walk: TypedWalk, segment: string): TypedWalk | null {\n const content = isJsonObject(walk.node) ? walk.node : {};\n if (Object.keys(content)[0] !== segment) {\n return null;\n }\n const location = childLocation(walk.location, segment);\n return { ...walk, node: content[segment], location, isFirstMediaType: false };\n}\n\nfunction schemaStep(walk: TypedWalk, refs: RefResolver): TypedWalk {\n const owner = followLocated(walk, refs);\n const schema = isJsonObject(owner.node) ? owner.node.schema : undefined;\n const location = childLocation(owner.location, \"schema\");\n // The container's type is its schema's type: an optional header stays optional.\n const presence = walk.presence === \"absent\" ? \"absent\" : schemaPresence(schema, refs);\n return { ...walk, node: schema, location, isSchema: true, presence };\n}\n\nfunction documentStep(walk: TypedWalk, index: number, input: TypedWalkInput): TypedWalk | null {\n const owner = followRefs(walk.node, input.refs);\n const form = headerParameterContentForm(input.pointer, index, owner, input.options);\n if (form !== null) {\n const isLast = index === input.pointer.segments.length - 1;\n return contentStep(walk, form, isLast, input.refs);\n }\n if (\n isParameterList(input.pointer, index) ||\n isExcludedOperation(input.pointer, index, owner, input)\n ) {\n return null;\n }\n return containerStep(walk, index, input);\n}\n\nfunction step(walk: TypedWalk, index: number, input: TypedWalkInput): TypedWalk | null {\n const { segments } = input.pointer;\n const segment = segments[index] as string;\n const isLast = index === segments.length - 1;\n if (walk.isSchema) {\n return walk.isName\n ? nameStep(walk, segment, isLast, input)\n : keywordStep(walk, segment, isLast, input);\n }\n if (walk.isFirstMediaType) {\n return firstMediaTypeStep(walk, segment);\n }\n if (segment === \"schema\" && isTypedAsSchema(input.pointer, index)) {\n return schemaStep(walk, input.refs);\n }\n return documentStep(walk, index, input);\n}\n\n/** Walk the whole pointer; see the module comment. */\nexport function typedWalk(input: TypedWalkInput): TypedWalkResult {\n const { pointer } = input;\n const { node, location } = leadingLocated(pointer, input.refs);\n const isSchema = startsInSchema(pointer);\n let walk: TypedWalk = {\n type: indexBy(\n rootType(pointer.rootSegment, false),\n ...pointer.segments.slice(0, leadingSegmentsOf(pointer)),\n ),\n node,\n location,\n isSchema,\n isName: false,\n presence: isSchema ? schemaPresence(node, input.refs) : \"present\",\n };\n for (let index = leadingSegmentsOf(pointer); index < pointer.segments.length; index++) {\n const next = step(walk, index, input);\n if (next === null) {\n return { kind: \"untyped\", index };\n }\n walk = next;\n }\n return { kind: \"typed\", walk };\n}\n"],"names":["irReference","followLocated","isJsonObject","irIndexedAccess","irKeyword","childLocation","schemaPresence","isMarkedProperty","isExcludedProperty","indexKeyword","indexBy","propertyPresence","isArrayShape","isObjectShape","followRefs","isOptionalRequestBody","isOptionalHeader","headerParameterContentForm","isParameterList","isExcludedOperation","isTypedAsSchema","leadingLocated","startsInSchema","rootType","leadingSegmentsOf"],"mappings":"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"}
|
|
@@ -1,40 +1,56 @@
|
|
|
1
1
|
import { irReference, irIndexedAccess, irKeyword } from '../../../domain/ir/constructors.mjs';
|
|
2
2
|
import { indexBy, rootType, indexKeyword } from '../ref-type.mjs';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { isArrayShape, isObjectShape } from './generated-shape.mjs';
|
|
4
|
+
import { followLocated, isJsonObject, childLocation, followRefs } from './located-node.mjs';
|
|
5
|
+
import { leadingLocated, startsInSchema, leadingSegmentsOf, isTypedAsSchema, headerParameterContentForm, isParameterList, isExcludedOperation, isOptionalRequestBody, isOptionalHeader } from './pointer-walk.mjs';
|
|
6
|
+
import { schemaPresence, isMarkedProperty, isExcludedProperty, propertyPresence } from './property-shape.mjs';
|
|
5
7
|
|
|
6
8
|
const DEFS_KEYWORD = "$defs";
|
|
7
9
|
function present(walk) {
|
|
8
10
|
return walk.presence === "present" ? walk.type : irReference("NonNullable", [walk.type]);
|
|
9
11
|
}
|
|
10
12
|
function indexEntries(walk, key, keyword, refs) {
|
|
11
|
-
const owner =
|
|
12
|
-
const child = isJsonObject(owner) ? owner[keyword] : void 0;
|
|
13
|
+
const owner = followLocated(walk, refs);
|
|
14
|
+
const child = isJsonObject(owner.node) ? owner.node[keyword] : void 0;
|
|
13
15
|
return {
|
|
14
16
|
...walk,
|
|
15
17
|
type: irIndexedAccess(present(walk), irKeyword(key)),
|
|
16
18
|
node: child,
|
|
19
|
+
location: childLocation(owner.location, keyword),
|
|
17
20
|
presence: schemaPresence(child, refs)
|
|
18
21
|
};
|
|
19
22
|
}
|
|
20
23
|
function nameStep(walk, name, isLast, input) {
|
|
21
|
-
const owner =
|
|
22
|
-
const
|
|
24
|
+
const owner = followLocated(walk, input.refs);
|
|
25
|
+
const { node } = owner;
|
|
26
|
+
const properties = isJsonObject(node) && isJsonObject(node.properties) ? node.properties : {};
|
|
27
|
+
const value = properties[name];
|
|
28
|
+
const { options, refs } = input;
|
|
29
|
+
const isMarkedOnTheWay = !isLast && isMarkedProperty(value, options, refs);
|
|
30
|
+
if (isExcludedProperty(value, options, refs) || isMarkedOnTheWay) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
23
33
|
const type = walk.presence === "present" ? indexKeyword(walk.type, name, isLast) : indexBy(present(walk), name);
|
|
24
34
|
return {
|
|
25
35
|
...walk,
|
|
26
36
|
type,
|
|
27
|
-
node:
|
|
37
|
+
node: value,
|
|
38
|
+
location: childLocation(walk.namesLocation, name),
|
|
28
39
|
isName: false,
|
|
29
|
-
presence: propertyPresence(walk
|
|
40
|
+
presence: propertyPresence(walk, name, input.options, input.refs)
|
|
30
41
|
};
|
|
31
42
|
}
|
|
32
43
|
function defsStep(walk, owner, isLast) {
|
|
33
|
-
const
|
|
44
|
+
const { node } = owner;
|
|
45
|
+
const defs = isJsonObject(node) && isJsonObject(node[DEFS_KEYWORD]) ? node[DEFS_KEYWORD] : {};
|
|
46
|
+
const namesLocation = childLocation(owner.location, DEFS_KEYWORD);
|
|
34
47
|
return {
|
|
35
48
|
...walk,
|
|
36
49
|
type: indexKeyword(present(walk), DEFS_KEYWORD, isLast),
|
|
50
|
+
// A node of its own, not in the document: its properties are the definitions.
|
|
37
51
|
node: { properties: defs, required: Object.keys(defs) },
|
|
52
|
+
location: namesLocation,
|
|
53
|
+
namesLocation,
|
|
38
54
|
isName: true,
|
|
39
55
|
presence: "present"
|
|
40
56
|
};
|
|
@@ -51,13 +67,13 @@ function hasKeywordMember(owner, segment) {
|
|
|
51
67
|
return segment === "items" ? isArrayShape(owner) : isObjectShape(owner);
|
|
52
68
|
}
|
|
53
69
|
function keywordStep(walk, segment, isLast, input) {
|
|
54
|
-
const owner =
|
|
55
|
-
if (!hasKeywordMember(owner, segment)) {
|
|
70
|
+
const owner = followLocated(walk, input.refs);
|
|
71
|
+
if (!hasKeywordMember(owner.node, segment)) {
|
|
56
72
|
return null;
|
|
57
73
|
}
|
|
58
74
|
switch (segment) {
|
|
59
75
|
case "properties":
|
|
60
|
-
return { ...walk, isName: true };
|
|
76
|
+
return { ...walk, isName: true, namesLocation: childLocation(owner.location, segment) };
|
|
61
77
|
case "items":
|
|
62
78
|
return indexEntries(walk, "number", "items", input.refs);
|
|
63
79
|
case "additionalProperties":
|
|
@@ -76,9 +92,50 @@ function containerStep(walk, index, input) {
|
|
|
76
92
|
...walk,
|
|
77
93
|
type: indexBy(present(walk), segment),
|
|
78
94
|
node: isJsonObject(owner) ? owner[segment] : void 0,
|
|
95
|
+
location: childLocation(followLocated(walk, input.refs).location, segment),
|
|
79
96
|
presence: isOptional ? "absent" : "present"
|
|
80
97
|
};
|
|
81
98
|
}
|
|
99
|
+
function contentStep(walk, form, isLast, refs) {
|
|
100
|
+
const isMapTyped = form === "media-type-members" || form === "first-media-type" && !isLast;
|
|
101
|
+
if (!isMapTyped) {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
const owner = followLocated(walk, refs);
|
|
105
|
+
return {
|
|
106
|
+
...walk,
|
|
107
|
+
node: isJsonObject(owner.node) ? owner.node.content : void 0,
|
|
108
|
+
location: childLocation(owner.location, "content"),
|
|
109
|
+
isFirstMediaType: form === "first-media-type"
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function firstMediaTypeStep(walk, segment) {
|
|
113
|
+
const content = isJsonObject(walk.node) ? walk.node : {};
|
|
114
|
+
if (Object.keys(content)[0] !== segment) {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
const location = childLocation(walk.location, segment);
|
|
118
|
+
return { ...walk, node: content[segment], location, isFirstMediaType: false };
|
|
119
|
+
}
|
|
120
|
+
function schemaStep(walk, refs) {
|
|
121
|
+
const owner = followLocated(walk, refs);
|
|
122
|
+
const schema = isJsonObject(owner.node) ? owner.node.schema : void 0;
|
|
123
|
+
const location = childLocation(owner.location, "schema");
|
|
124
|
+
const presence = walk.presence === "absent" ? "absent" : schemaPresence(schema, refs);
|
|
125
|
+
return { ...walk, node: schema, location, isSchema: true, presence };
|
|
126
|
+
}
|
|
127
|
+
function documentStep(walk, index, input) {
|
|
128
|
+
const owner = followRefs(walk.node, input.refs);
|
|
129
|
+
const form = headerParameterContentForm(input.pointer, index, owner, input.options);
|
|
130
|
+
if (form !== null) {
|
|
131
|
+
const isLast = index === input.pointer.segments.length - 1;
|
|
132
|
+
return contentStep(walk, form, isLast, input.refs);
|
|
133
|
+
}
|
|
134
|
+
if (isParameterList(input.pointer, index) || isExcludedOperation(input.pointer, index, owner, input)) {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
return containerStep(walk, index, input);
|
|
138
|
+
}
|
|
82
139
|
function step(walk, index, input) {
|
|
83
140
|
const { segments } = input.pointer;
|
|
84
141
|
const segment = segments[index];
|
|
@@ -86,17 +143,17 @@ function step(walk, index, input) {
|
|
|
86
143
|
if (walk.isSchema) {
|
|
87
144
|
return walk.isName ? nameStep(walk, segment, isLast, input) : keywordStep(walk, segment, isLast, input);
|
|
88
145
|
}
|
|
146
|
+
if (walk.isFirstMediaType) {
|
|
147
|
+
return firstMediaTypeStep(walk, segment);
|
|
148
|
+
}
|
|
89
149
|
if (segment === "schema" && isTypedAsSchema(input.pointer, index)) {
|
|
90
|
-
|
|
91
|
-
const schema = isJsonObject(owner) ? owner.schema : void 0;
|
|
92
|
-
const presence = walk.presence === "absent" ? "absent" : schemaPresence(schema, input.refs);
|
|
93
|
-
return { ...walk, node: schema, isSchema: true, presence };
|
|
150
|
+
return schemaStep(walk, input.refs);
|
|
94
151
|
}
|
|
95
|
-
return
|
|
152
|
+
return documentStep(walk, index, input);
|
|
96
153
|
}
|
|
97
154
|
function typedWalk(input) {
|
|
98
155
|
const { pointer } = input;
|
|
99
|
-
const node =
|
|
156
|
+
const { node, location } = leadingLocated(pointer, input.refs);
|
|
100
157
|
const isSchema = startsInSchema(pointer);
|
|
101
158
|
let walk = {
|
|
102
159
|
type: indexBy(
|
|
@@ -104,6 +161,7 @@ function typedWalk(input) {
|
|
|
104
161
|
...pointer.segments.slice(0, leadingSegmentsOf(pointer))
|
|
105
162
|
),
|
|
106
163
|
node,
|
|
164
|
+
location,
|
|
107
165
|
isSchema,
|
|
108
166
|
isName: false,
|
|
109
167
|
presence: isSchema ? schemaPresence(node, input.refs) : "present"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typed-walk.mjs","sources":["../../../../src/application/transform/ref-pointer/typed-walk.ts"],"sourcesContent":["import { irIndexedAccess, irKeyword, irReference } from \"../../../domain/ir/constructors.js\";\nimport type { IrKeyword, IrType } from \"../../../domain/ir/nodes.js\";\nimport { indexBy, indexKeyword, rootType } from \"../ref-type.js\";\nimport type { RefResolver, SchemaOptions } from \"../schema/schema-context.js\";\nimport {\n followRefs,\n isArrayShape,\n isJsonObject,\n isObjectShape,\n type Presence,\n propertyPresence,\n schemaPresence,\n} from \"./generated-shape.js\";\nimport {\n isOptionalHeader,\n isOptionalRequestBody,\n isParameterList,\n isTypedAsSchema,\n leadingNode,\n leadingSegmentsOf,\n type RefPointer,\n startsInSchema,\n} from \"./pointer-walk.js\";\n\n/**\n * The type of a `$ref` pointer as the generated types have it: the `schema` of a media type,\n * header or component parameter is its type, `items` is indexed by `number`,\n * `additionalProperties` by `string`, and a value that may be `undefined` or `null` is wrapped in\n * `NonNullable` before it is indexed. The walk stops at a segment with no type of its own\n * (`allOf/0`, `definitions/A`, operation `parameters/0`): the caller types the target itself.\n */\n\nconst DEFS_KEYWORD = \"$defs\";\n\nexport interface TypedWalk {\n readonly type: IrType;\n /** The document node the type stands for (not followed through a `$ref`). */\n readonly node: unknown;\n readonly isSchema: boolean;\n /** The segment is a property or `$defs` name, not a keyword. */\n readonly isName: boolean;\n readonly presence: Presence;\n}\n\nexport interface TypedWalkInput {\n readonly pointer: RefPointer;\n readonly options: SchemaOptions;\n readonly refs: RefResolver;\n}\n\n/** The walk result: a type, or the index of the first segment that has no type. */\nexport type TypedWalkResult =\n | { readonly kind: \"typed\"; readonly walk: TypedWalk }\n | { readonly kind: \"untyped\"; readonly index: number };\n\nfunction present(walk: TypedWalk): IrType {\n return walk.presence === \"present\" ? walk.type : irReference(\"NonNullable\", [walk.type]);\n}\n\nfunction indexEntries(walk: TypedWalk, key: IrKeyword, keyword: string, refs: RefResolver) {\n const owner = followRefs(walk.node, refs);\n const child = isJsonObject(owner) ? owner[keyword] : undefined;\n return {\n ...walk,\n type: irIndexedAccess(present(walk), irKeyword(key)),\n node: child,\n presence: schemaPresence(child, refs),\n };\n}\n\nfunction nameStep(walk: TypedWalk, name: string, isLast: boolean, input: TypedWalkInput) {\n const owner = followRefs(walk.node, input.refs);\n const properties = isJsonObject(owner) && isJsonObject(owner.properties) ? owner.properties : {};\n const type =\n walk.presence === \"present\"\n ? indexKeyword(walk.type, name, isLast)\n : indexBy(present(walk), name);\n return {\n ...walk,\n type,\n node: properties[name],\n isName: false,\n presence: propertyPresence(walk.node, name, input.options, input.refs),\n };\n}\n\n/** `$defs` is optional (`NonNullable` when more follows); its members are present. */\nfunction defsStep(walk: TypedWalk, owner: unknown, isLast: boolean): TypedWalk {\n const defs = isJsonObject(owner) && isJsonObject(owner[DEFS_KEYWORD]) ? owner[DEFS_KEYWORD] : {};\n return {\n ...walk,\n type: indexKeyword(present(walk), DEFS_KEYWORD, isLast),\n node: { properties: defs, required: Object.keys(defs) },\n isName: true,\n presence: \"present\",\n };\n}\n\nconst SHAPED_KEYWORDS: ReadonlySet<string> = new Set([\n \"properties\",\n \"items\",\n \"additionalProperties\",\n]);\n\n/**\n * Whether the keyword gives the owner's generated type a member: `items` only an array,\n * `properties` and `additionalProperties` only an object (`type: string` ignores them). A node\n * that is not in the document is indexed as the keyword says.\n */\nfunction hasKeywordMember(owner: unknown, segment: string): boolean {\n if (!SHAPED_KEYWORDS.has(segment) || !isJsonObject(owner)) {\n return true;\n }\n return segment === \"items\" ? isArrayShape(owner) : isObjectShape(owner);\n}\n\nfunction keywordStep(walk: TypedWalk, segment: string, isLast: boolean, input: TypedWalkInput) {\n const owner = followRefs(walk.node, input.refs);\n if (!hasKeywordMember(owner, segment)) {\n return null;\n }\n switch (segment) {\n case \"properties\":\n return { ...walk, isName: true };\n case \"items\":\n return indexEntries(walk, \"number\", \"items\", input.refs);\n case \"additionalProperties\":\n return indexEntries(walk, \"string\", \"additionalProperties\", input.refs);\n case DEFS_KEYWORD:\n return defsStep(walk, owner, isLast);\n default:\n return null;\n }\n}\n\nfunction containerStep(walk: TypedWalk, index: number, input: TypedWalkInput): TypedWalk {\n const segment = input.pointer.segments[index] as string;\n const owner = followRefs(walk.node, input.refs);\n const isOptional =\n (segment === \"requestBody\" && isOptionalRequestBody(owner, input.refs)) ||\n isOptionalHeader(input.pointer, index, owner);\n return {\n ...walk,\n type: indexBy(present(walk), segment),\n node: isJsonObject(owner) ? owner[segment] : undefined,\n presence: isOptional ? \"absent\" : \"present\",\n };\n}\n\nfunction step(walk: TypedWalk, index: number, input: TypedWalkInput): TypedWalk | null {\n const { segments } = input.pointer;\n const segment = segments[index] as string;\n const isLast = index === segments.length - 1;\n if (walk.isSchema) {\n return walk.isName\n ? nameStep(walk, segment, isLast, input)\n : keywordStep(walk, segment, isLast, input);\n }\n if (segment === \"schema\" && isTypedAsSchema(input.pointer, index)) {\n const owner = followRefs(walk.node, input.refs);\n const schema = isJsonObject(owner) ? owner.schema : undefined;\n // The container's type is its schema's type: an optional header stays optional.\n const presence = walk.presence === \"absent\" ? \"absent\" : schemaPresence(schema, input.refs);\n return { ...walk, node: schema, isSchema: true, presence };\n }\n return isParameterList(input.pointer, index) ? null : containerStep(walk, index, input);\n}\n\n/** Walk the whole pointer; see the module comment. */\nexport function typedWalk(input: TypedWalkInput): TypedWalkResult {\n const { pointer } = input;\n const node = leadingNode(pointer, input.refs);\n const isSchema = startsInSchema(pointer);\n let walk: TypedWalk = {\n type: indexBy(\n rootType(pointer.rootSegment, false),\n ...pointer.segments.slice(0, leadingSegmentsOf(pointer)),\n ),\n node,\n isSchema,\n isName: false,\n presence: isSchema ? schemaPresence(node, input.refs) : \"present\",\n };\n for (let index = leadingSegmentsOf(pointer); index < pointer.segments.length; index++) {\n const next = step(walk, index, input);\n if (next === null) {\n return { kind: \"untyped\", index };\n }\n walk = next;\n }\n return { kind: \"typed\", walk };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"typed-walk.mjs","sources":["../../../../src/application/transform/ref-pointer/typed-walk.ts"],"sourcesContent":["import { irIndexedAccess, irKeyword, irReference } from \"../../../domain/ir/constructors.js\";\nimport type { IrKeyword, IrType } from \"../../../domain/ir/nodes.js\";\nimport { indexBy, indexKeyword, rootType } from \"../ref-type.js\";\nimport type { RefResolver, SchemaOptions } from \"../schema/schema-context.js\";\nimport { isArrayShape, isObjectShape } from \"./generated-shape.js\";\nimport {\n childLocation,\n followLocated,\n followRefs,\n isJsonObject,\n type LocatedNode,\n} from \"./located-node.js\";\nimport {\n type ContentForm,\n headerParameterContentForm,\n isExcludedOperation,\n isOptionalHeader,\n isOptionalRequestBody,\n isParameterList,\n isTypedAsSchema,\n leadingLocated,\n leadingSegmentsOf,\n type RefPointer,\n startsInSchema,\n} from \"./pointer-walk.js\";\nimport {\n isExcludedProperty,\n isMarkedProperty,\n type Presence,\n propertyPresence,\n schemaPresence,\n} from \"./property-shape.js\";\n\n/**\n * The type of a `$ref` pointer as the generated types have it: the `schema` of a media type,\n * header or component parameter is its type, `items` is indexed by `number`,\n * `additionalProperties` by `string`, and a value that may be `undefined` or `null` is wrapped in\n * `NonNullable` before it is indexed. The walk stops at a segment with no type of its own\n * (`allOf/0`, `definitions/A`, operation `parameters/0`): the caller types the target itself.\n */\n\nconst DEFS_KEYWORD = \"$defs\";\n\nexport interface TypedWalk {\n readonly type: IrType;\n /** The document node the type stands for (not followed through a `$ref`). */\n readonly node: unknown;\n /** The node's JSON Pointer, where the generator writes its type (`LocatedNode`). */\n readonly location: string | undefined;\n readonly isSchema: boolean;\n /** The segment is a property or `$defs` name, not a keyword. */\n readonly isName: boolean;\n /** The location of the map of names (`properties` or `$defs`) when `isName`. */\n readonly namesLocation?: string | undefined;\n /**\n * The node is the `content` of a header or parameter typed as its first media type, so the\n * next segment must name that media type and adds no member.\n */\n readonly isFirstMediaType?: boolean;\n readonly presence: Presence;\n}\n\nexport interface TypedWalkInput {\n readonly pointer: RefPointer;\n readonly options: SchemaOptions;\n readonly refs: RefResolver;\n}\n\n/** The walk result: a type, or the index of the first segment that has no type. */\nexport type TypedWalkResult =\n | { readonly kind: \"typed\"; readonly walk: TypedWalk }\n | { readonly kind: \"untyped\"; readonly index: number };\n\nfunction present(walk: TypedWalk): IrType {\n return walk.presence === \"present\" ? walk.type : irReference(\"NonNullable\", [walk.type]);\n}\n\nfunction indexEntries(walk: TypedWalk, key: IrKeyword, keyword: string, refs: RefResolver) {\n const owner = followLocated(walk, refs);\n const child = isJsonObject(owner.node) ? owner.node[keyword] : undefined;\n return {\n ...walk,\n type: irIndexedAccess(present(walk), irKeyword(key)),\n node: child,\n location: childLocation(owner.location, keyword),\n presence: schemaPresence(child, refs),\n };\n}\n\n/**\n * A property `--exclude-deprecated` left out has no member to index, and the `$Read<T>` or\n * `$Write<T>` of a marked property has no member but the marker's: such a pointer is typed in\n * place.\n */\nfunction nameStep(walk: TypedWalk, name: string, isLast: boolean, input: TypedWalkInput) {\n const owner = followLocated(walk, input.refs);\n const { node } = owner;\n const properties = isJsonObject(node) && isJsonObject(node.properties) ? node.properties : {};\n const value = properties[name];\n const { options, refs } = input;\n const isMarkedOnTheWay = !isLast && isMarkedProperty(value, options, refs);\n if (isExcludedProperty(value, options, refs) || isMarkedOnTheWay) {\n return null;\n }\n const type =\n walk.presence === \"present\"\n ? indexKeyword(walk.type, name, isLast)\n : indexBy(present(walk), name);\n return {\n ...walk,\n type,\n node: value,\n location: childLocation(walk.namesLocation, name),\n isName: false,\n presence: propertyPresence(walk, name, input.options, input.refs),\n };\n}\n\n/** `$defs` is optional (`NonNullable` when more follows); its members are present. */\nfunction defsStep(walk: TypedWalk, owner: LocatedNode, isLast: boolean): TypedWalk {\n const { node } = owner;\n const defs = isJsonObject(node) && isJsonObject(node[DEFS_KEYWORD]) ? node[DEFS_KEYWORD] : {};\n const namesLocation = childLocation(owner.location, DEFS_KEYWORD);\n return {\n ...walk,\n type: indexKeyword(present(walk), DEFS_KEYWORD, isLast),\n // A node of its own, not in the document: its properties are the definitions.\n node: { properties: defs, required: Object.keys(defs) },\n location: namesLocation,\n namesLocation,\n isName: true,\n presence: \"present\",\n };\n}\n\nconst SHAPED_KEYWORDS: ReadonlySet<string> = new Set([\n \"properties\",\n \"items\",\n \"additionalProperties\",\n]);\n\n/**\n * Whether the keyword gives the owner's generated type a member: `items` only an array,\n * `properties` and `additionalProperties` only an object (`type: string` ignores them). A node\n * that is not in the document is indexed as the keyword says.\n */\nfunction hasKeywordMember(owner: unknown, segment: string): boolean {\n if (!SHAPED_KEYWORDS.has(segment) || !isJsonObject(owner)) {\n return true;\n }\n return segment === \"items\" ? isArrayShape(owner) : isObjectShape(owner);\n}\n\nfunction keywordStep(walk: TypedWalk, segment: string, isLast: boolean, input: TypedWalkInput) {\n const owner = followLocated(walk, input.refs);\n if (!hasKeywordMember(owner.node, segment)) {\n return null;\n }\n switch (segment) {\n case \"properties\":\n return { ...walk, isName: true, namesLocation: childLocation(owner.location, segment) };\n case \"items\":\n return indexEntries(walk, \"number\", \"items\", input.refs);\n case \"additionalProperties\":\n return indexEntries(walk, \"string\", \"additionalProperties\", input.refs);\n case DEFS_KEYWORD:\n return defsStep(walk, owner, isLast);\n default:\n return null;\n }\n}\n\nfunction containerStep(walk: TypedWalk, index: number, input: TypedWalkInput): TypedWalk {\n const segment = input.pointer.segments[index] as string;\n const owner = followRefs(walk.node, input.refs);\n const isOptional =\n (segment === \"requestBody\" && isOptionalRequestBody(owner, input.refs)) ||\n isOptionalHeader(input.pointer, index, owner);\n return {\n ...walk,\n type: indexBy(present(walk), segment),\n node: isJsonObject(owner) ? owner[segment] : undefined,\n location: childLocation(followLocated(walk, input.refs).location, segment),\n presence: isOptional ? \"absent\" : \"present\",\n };\n}\n\n/**\n * The `content` of a header or parameter: no member of its own, since the type holds its media\n * types (or the first one's type). Untyped where the type is `string` or a `schema`'s, and as the\n * last segment of the first media type form, whose type is not the map's.\n */\nfunction contentStep(walk: TypedWalk, form: ContentForm, isLast: boolean, refs: RefResolver) {\n const isMapTyped = form === \"media-type-members\" || (form === \"first-media-type\" && !isLast);\n if (!isMapTyped) {\n return null;\n }\n const owner = followLocated(walk, refs);\n return {\n ...walk,\n node: isJsonObject(owner.node) ? owner.node.content : undefined,\n location: childLocation(owner.location, \"content\"),\n isFirstMediaType: form === \"first-media-type\",\n };\n}\n\n/** The first media type of such a `content` is the type itself; another one has no type. */\nfunction firstMediaTypeStep(walk: TypedWalk, segment: string): TypedWalk | null {\n const content = isJsonObject(walk.node) ? walk.node : {};\n if (Object.keys(content)[0] !== segment) {\n return null;\n }\n const location = childLocation(walk.location, segment);\n return { ...walk, node: content[segment], location, isFirstMediaType: false };\n}\n\nfunction schemaStep(walk: TypedWalk, refs: RefResolver): TypedWalk {\n const owner = followLocated(walk, refs);\n const schema = isJsonObject(owner.node) ? owner.node.schema : undefined;\n const location = childLocation(owner.location, \"schema\");\n // The container's type is its schema's type: an optional header stays optional.\n const presence = walk.presence === \"absent\" ? \"absent\" : schemaPresence(schema, refs);\n return { ...walk, node: schema, location, isSchema: true, presence };\n}\n\nfunction documentStep(walk: TypedWalk, index: number, input: TypedWalkInput): TypedWalk | null {\n const owner = followRefs(walk.node, input.refs);\n const form = headerParameterContentForm(input.pointer, index, owner, input.options);\n if (form !== null) {\n const isLast = index === input.pointer.segments.length - 1;\n return contentStep(walk, form, isLast, input.refs);\n }\n if (\n isParameterList(input.pointer, index) ||\n isExcludedOperation(input.pointer, index, owner, input)\n ) {\n return null;\n }\n return containerStep(walk, index, input);\n}\n\nfunction step(walk: TypedWalk, index: number, input: TypedWalkInput): TypedWalk | null {\n const { segments } = input.pointer;\n const segment = segments[index] as string;\n const isLast = index === segments.length - 1;\n if (walk.isSchema) {\n return walk.isName\n ? nameStep(walk, segment, isLast, input)\n : keywordStep(walk, segment, isLast, input);\n }\n if (walk.isFirstMediaType) {\n return firstMediaTypeStep(walk, segment);\n }\n if (segment === \"schema\" && isTypedAsSchema(input.pointer, index)) {\n return schemaStep(walk, input.refs);\n }\n return documentStep(walk, index, input);\n}\n\n/** Walk the whole pointer; see the module comment. */\nexport function typedWalk(input: TypedWalkInput): TypedWalkResult {\n const { pointer } = input;\n const { node, location } = leadingLocated(pointer, input.refs);\n const isSchema = startsInSchema(pointer);\n let walk: TypedWalk = {\n type: indexBy(\n rootType(pointer.rootSegment, false),\n ...pointer.segments.slice(0, leadingSegmentsOf(pointer)),\n ),\n node,\n location,\n isSchema,\n isName: false,\n presence: isSchema ? schemaPresence(node, input.refs) : \"present\",\n };\n for (let index = leadingSegmentsOf(pointer); index < pointer.segments.length; index++) {\n const next = step(walk, index, input);\n if (next === null) {\n return { kind: \"untyped\", index };\n }\n walk = next;\n }\n return { kind: \"typed\", walk };\n}\n"],"names":[],"mappings":"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"}
|