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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parameters.mjs","sources":["../../../../src/application/transform/document/parameters.ts"],"sourcesContent":["import {\n irIntersection,\n irKeyword,\n irObject,\n irProperty,\n irReference,\n} from \"../../../domain/ir/constructors.js\";\nimport type { IrPropertyName, IrPropertySignature, IrType } from \"../../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../../domain/ir/property-name.js\";\nimport { createRef } from \"../../../domain/openapi/json-pointer.js\";\nimport {\n PARAMETER_LOCATIONS,\n type ParameterLocation,\n type ParameterObject,\n type ParameterOrReference,\n QUERYSTRING_LOCATION,\n} from \"../../../domain/openapi/parameter-object.js\";\nimport type { SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { FIX } from \"../../../domain/output-fixes.js\";\nimport { refType } from \"../ref-type.js\";\nimport type { SchemaLocation } from \"../schema/schema-context.js\";\nimport { withSchemaComment } from \"../schema-comment.js\";\nimport type { TransformContext } from \"../transform-context.js\";\nimport { isExplodedQueryObject } from \"./exploded-query.js\";\nimport { parameterType } from \"./parameter.js\";\n\n/** `[^{}]` keeps the scan linear: `[^}]` retried from every `{` of a long run of them. */\nconst PATH_TEMPLATE_RE = /\\{([^{}]+)\\}/g;\n\n/** A parameter as written in the document, and the object its `$ref` points to. */\ninterface ParameterEntry {\n readonly original: ParameterOrReference;\n readonly resolved: ParameterObject | undefined;\n}\n\n/** An entry whose `$ref` resolved, so its location and name are known. */\ntype ResolvedEntry = ParameterEntry & { readonly resolved: ParameterObject };\n\nfunction resolveParameter(\n parameter: ParameterOrReference,\n context: TransformContext,\n): ParameterObject | undefined {\n return \"$ref\" in parameter\n ? (context.refs.resolve(parameter.$ref) as ParameterObject | undefined)\n : parameter;\n}\n\n/** Required string parameters for every `{name}` in a path template. */\nfunction pathTemplateParameters(path: string): ParameterObject[] {\n return (path.match(PATH_TEMPLATE_RE) ?? []).map((match) => ({\n name: match.slice(1, -1),\n in: \"path\",\n required: true,\n schema: { type: \"string\" },\n }));\n}\n\n/** `--generate-path-params`: add the path template parameters the list does not define. */\nfunction withPathTemplateParameters(\n parameters: readonly ParameterOrReference[],\n location: SchemaLocation,\n context: TransformContext,\n): ParameterOrReference[] {\n const result = [...parameters];\n if (!context.options.generatePathParams || !location.path) {\n return result;\n }\n for (const parameter of pathTemplateParameters(location.path)) {\n const isDefined = result.some((candidate) => {\n const resolved = resolveParameter(candidate, context);\n return resolved?.in === \"path\" && resolved.name === parameter.name;\n });\n if (!isDefined) {\n result.push(parameter);\n }\n }\n return result;\n}\n\nfunction isDeprecatedParameter(parameter: ParameterObject | undefined): boolean {\n const schema = parameter?.schema as SchemaObject | undefined;\n return Boolean(parameter?.deprecated || schema?.deprecated);\n}\n\n/** Resolved parameters, sorted for `--alphabetize`, without deprecated ones if excluded. */\nfunction parameterEntries(\n parameters: readonly ParameterOrReference[],\n context: TransformContext,\n): ParameterEntry[] {\n const entries = parameters.map((original) => ({\n original,\n resolved: resolveParameter(original, context),\n }));\n if (context.options.alphabetize) {\n // Unlike map keys, the original sorts parameters with the default locale's `localeCompare`.\n entries.sort((left, right) =>\n (left.resolved?.name ?? \"\").localeCompare(right.resolved?.name ?? \"\"),\n );\n }\n return context.options.excludeDeprecated\n ? entries.filter(({ resolved }) => !isDeprecatedParameter(resolved))\n : entries;\n}\n\n/** The original quotes a name that is not text (a missing name prints as `\"undefined\"`). */\nfunction parameterName(name: unknown): IrPropertyName {\n return typeof name === \"string\" || typeof name === \"number\"\n ? toPropertyName(name)\n : { kind: \"string\", value: String(name) };\n}\n\nfunction referencedParameterType(ref: string, resolved: ParameterObject): IrType {\n // A `$ref` that resolves to another `$ref` is not a parameter object yet: index it as a path.\n const isParameter = !(resolved as { $ref?: unknown }).$ref;\n const parameter = isParameter ? { in: resolved.in, name: resolved.name } : null;\n return refType(ref, { parameter });\n}\n\nfunction entryType(\n { original, resolved }: ResolvedEntry,\n location: SchemaLocation,\n context: TransformContext,\n): IrType {\n const path = createRef([location.path, \"parameters\", resolved.in, resolved.name]);\n return \"$ref\" in original\n ? referencedParameterType(original.$ref, resolved)\n : parameterType(resolved, { ...location, path }, context);\n}\n\nfunction parameterMember(\n entry: ResolvedEntry,\n location: SchemaLocation,\n context: TransformContext,\n): IrPropertySignature {\n const { resolved } = entry;\n const property = irProperty(parameterName(resolved.name), entryType(entry, location, context), {\n isOptional: resolved.in !== \"path\" && !resolved.required,\n isReadonly: context.options.immutable,\n });\n return withSchemaComment(property, resolved);\n}\n\n/**\n * The `query` member typed by an `in: querystring` parameter (OpenAPI 3.2, ADR-020): the parameter\n * is the whole query string. Null when there is none, or when `in: query` parameters sit next to\n * it, which 3.2 does not allow; those keep their types, and a warning names the parameter.\n */\nfunction querystringMember(\n entries: readonly ParameterEntry[],\n location: SchemaLocation,\n context: TransformContext,\n): IrPropertySignature | null {\n const querystring = entries.find(\n (entry): entry is ResolvedEntry => entry.resolved?.in === QUERYSTRING_LOCATION,\n );\n if (!querystring || entries.some((entry) => entry.resolved?.in === \"query\")) {\n return null;\n }\n const property = irProperty(toPropertyName(\"query\"), entryType(querystring, location, context), {\n isOptional: !querystring.resolved.required,\n isReadonly: context.options.immutable,\n });\n return withSchemaComment(property, querystring.resolved);\n}\n\n/** With `exploded-query-objects`, whether the parameter's object keys are keys of `query`. */\nfunction isExplodedEntry(entry: ResolvedEntry, context: TransformContext): boolean {\n return (\n context.options.fixes.has(FIX.EXPLODED_QUERY_OBJECTS) &&\n isExplodedQueryObject(entry.resolved, context.refs)\n );\n}\n\n/**\n * An exploded object parameter's part of `query`: its object type. A parameter that may be left\n * out sends none of its keys then, so they are optional: `Partial<…>`.\n */\nfunction explodedPart(\n entry: ResolvedEntry,\n location: SchemaLocation,\n context: TransformContext,\n): IrType {\n const type = entryType(entry, location, context);\n return entry.resolved.required ? type : irReference(\"Partial\", [type]);\n}\n\n/** A location's parameters as members, and the object types of its exploded parameters. */\ninterface LocationParts {\n readonly members: readonly IrPropertySignature[];\n readonly exploded: readonly IrType[];\n readonly isOptional: boolean;\n}\n\n/** Each parameter in document order, so the declarations they add keep their order. */\nfunction locationParts(\n entries: readonly ResolvedEntry[],\n location: SchemaLocation,\n context: TransformContext,\n): LocationParts {\n const members: IrPropertySignature[] = [];\n const exploded: IrType[] = [];\n let isOptional = true;\n for (const entry of entries) {\n if (isExplodedEntry(entry, context)) {\n exploded.push(explodedPart(entry, location, context));\n isOptional &&= !entry.resolved.required;\n continue;\n }\n const member = parameterMember(entry, location, context);\n members.push(member);\n isOptional &&= member.isOptional;\n }\n return { members, exploded, isOptional };\n}\n\n/** The members' object, intersected with the exploded parameters' types; `never` for none. */\nfunction locationType({ members, exploded }: LocationParts): IrType {\n const types = [...(members.length > 0 ? [irObject(members)] : []), ...exploded];\n const [first] = types;\n if (first === undefined) {\n return irKeyword(\"never\");\n }\n return types.length === 1 ? first : irIntersection(types);\n}\n\n/** One location's parameters; optional when all of them are, and `never` when there are none. */\nfunction locationMember(\n parameterIn: ParameterLocation,\n entries: readonly ParameterEntry[],\n location: SchemaLocation,\n context: TransformContext,\n): IrPropertySignature {\n const located = entries.filter(\n (entry): entry is ResolvedEntry => entry.resolved?.in === parameterIn,\n );\n const parts = locationParts(located, location, context);\n return irProperty(toPropertyName(parameterIn), locationType(parts), {\n isOptional: parts.isOptional,\n isReadonly: context.options.immutable,\n });\n}\n\n/**\n * The `parameters` property of an operation or path item: one member per location, each an object\n * of that location's parameters. `location.path` is the path template for\n * `--generate-path-params`.\n */\nexport function parametersMember(\n parameters: readonly ParameterOrReference[],\n location: SchemaLocation,\n context: TransformContext,\n): IrPropertySignature {\n const entries = parameterEntries(\n withPathTemplateParameters(parameters, location, context),\n context,\n );\n const querystring = querystringMember(entries, location, context);\n const members = PARAMETER_LOCATIONS.map((parameterIn) =>\n parameterIn === \"query\" && querystring\n ? querystring\n : locationMember(parameterIn, entries, location, context),\n );\n return irProperty(toPropertyName(\"parameters\"), irObject(members), {\n isReadonly: context.options.immutable,\n });\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parameters.mjs","sources":["../../../../src/application/transform/document/parameters.ts"],"sourcesContent":["import {\n irIntersection,\n irKeyword,\n irObject,\n irProperty,\n irReference,\n} from \"../../../domain/ir/constructors.js\";\nimport type { IrPropertyName, IrPropertySignature, IrType } from \"../../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../../domain/ir/property-name.js\";\nimport { appendPointer } from \"../../../domain/openapi/json-pointer.js\";\nimport {\n PARAMETER_LOCATIONS,\n type ParameterLocation,\n type ParameterObject,\n type ParameterOrReference,\n QUERYSTRING_LOCATION,\n} from \"../../../domain/openapi/parameter-object.js\";\nimport { FIX } from \"../../../domain/output-fixes.js\";\nimport { declaredValueTypes } from \"../declared-value-types.js\";\nimport type { SchemaLocation } from \"../schema/schema-context.js\";\nimport { withSchemaComment } from \"../schema-comment.js\";\nimport type { TransformContext } from \"../transform-context.js\";\nimport { isExplodedQueryObject } from \"./exploded-query.js\";\nimport { declaredObjectType, hasIndexSignature, withIndexValues } from \"./exploded-query-values.js\";\nimport { parameterType } from \"./parameter.js\";\nimport {\n type ParameterEntry,\n parameterEntries,\n type ResolvedEntry,\n resolveParameter,\n} from \"./parameter-entries.js\";\nimport { referencedParameterType } from \"./referenced-parameter.js\";\n\n/** `[^{}]` keeps the scan linear: `[^}]` retried from every `{` of a long run of them. */\nconst PATH_TEMPLATE_RE = /\\{([^{}]+)\\}/g;\n\n/** Required string parameters for every `{name}` in a path template. */\nfunction pathTemplateParameters(path: string): ParameterObject[] {\n return (path.match(PATH_TEMPLATE_RE) ?? []).map((match) => ({\n name: match.slice(1, -1),\n in: \"path\",\n required: true,\n schema: { type: \"string\" },\n }));\n}\n\n/** `--generate-path-params`: add the path template parameters the list does not define. */\nfunction withPathTemplateParameters(\n parameters: readonly ParameterOrReference[],\n location: SchemaLocation,\n context: TransformContext,\n): ParameterOrReference[] {\n const result = [...parameters];\n if (!context.options.generatePathParams || !location.path) {\n return result;\n }\n for (const parameter of pathTemplateParameters(location.path)) {\n const isDefined = result.some((candidate) => {\n const resolved = resolveParameter(candidate, context.refs);\n return resolved?.in === \"path\" && resolved.name === parameter.name;\n });\n if (!isDefined) {\n result.push(parameter);\n }\n }\n return result;\n}\n\n/** The original quotes a name that is not text (a missing name prints as `\"undefined\"`). */\nfunction parameterName(name: unknown): IrPropertyName {\n return typeof name === \"string\" || typeof name === \"number\"\n ? toPropertyName(name)\n : { kind: \"string\", value: String(name) };\n}\n\nfunction entryType(\n { original, resolved }: ResolvedEntry,\n location: SchemaLocation,\n context: TransformContext,\n): IrType {\n const path = appendPointer(location.path, [\"parameters\", resolved.in, resolved.name]);\n return \"$ref\" in original\n ? referencedParameterType(original.$ref, resolved, context)\n : parameterType(resolved, { ...location, path }, context);\n}\n\nfunction parameterMember(\n entry: ResolvedEntry,\n location: SchemaLocation,\n context: TransformContext,\n): IrPropertySignature {\n const { resolved } = entry;\n const property = irProperty(parameterName(resolved.name), entryType(entry, location, context), {\n isOptional: resolved.in !== \"path\" && !resolved.required,\n isReadonly: context.options.immutable,\n });\n return withSchemaComment(property, resolved);\n}\n\n/**\n * The `query` member typed by an `in: querystring` parameter (OpenAPI 3.2, ADR-020): the parameter\n * is the whole query string. Null when there is none, or when `in: query` parameters sit next to\n * it, which 3.2 does not allow; those keep their types, and a warning names the parameter.\n */\nfunction querystringMember(\n entries: readonly ParameterEntry[],\n location: SchemaLocation,\n context: TransformContext,\n): IrPropertySignature | null {\n const querystring = entries.find(\n (entry): entry is ResolvedEntry => entry.resolved?.in === QUERYSTRING_LOCATION,\n );\n if (!querystring || entries.some((entry) => entry.resolved?.in === \"query\")) {\n return null;\n }\n const property = irProperty(toPropertyName(\"query\"), entryType(querystring, location, context), {\n isOptional: !querystring.resolved.required,\n isReadonly: context.options.immutable,\n });\n return withSchemaComment(property, querystring.resolved);\n}\n\n/** With `exploded-query-objects`, whether the parameter's object keys are keys of `query`. */\nfunction isExplodedEntry(entry: ResolvedEntry, context: TransformContext): boolean {\n return (\n context.options.fixes.has(FIX.EXPLODED_QUERY_OBJECTS) &&\n isExplodedQueryObject(entry.resolved, context.refs)\n );\n}\n\n/** An exploded object parameter with its type, typed in document order. */\ninterface ExplodedEntry {\n readonly entry: ResolvedEntry;\n readonly type: IrType;\n}\n\n/**\n * The object type of an exploded parameter, written out when it is a reference to a type with an\n * index signature and `query` has other keys, which that signature must then admit. Without\n * other keys the reference is kept.\n */\nfunction explodedObjectType(\n { entry, type }: ExplodedEntry,\n hasOtherKeys: boolean,\n context: TransformContext,\n): IrType {\n if (!hasOtherKeys) {\n return type;\n }\n const declared = declaredObjectType(entry, context);\n return declared !== null && hasIndexSignature(declared) ? declared : type;\n}\n\n/**\n * The exploded object parameters' parts of `query`: their object types, each index signature\n * widened by the value types of the other keys (see `exploded-query-values.ts`). A parameter that\n * may be left out sends none of its keys then, so they are optional: `Partial<…>`.\n */\nfunction explodedParts(\n exploded: readonly ExplodedEntry[],\n members: readonly IrPropertySignature[],\n context: TransformContext,\n): IrType[] {\n const hasOtherKeys = members.length > 0 || exploded.length > 1;\n const types = exploded.map((part) => explodedObjectType(part, hasOtherKeys, context));\n const others = (index: number) => [\n ...(members.length > 0 ? [irObject(members)] : []),\n ...types.filter((_type, other) => other !== index),\n ];\n return types.map((type, index) => {\n const values = others(index).flatMap((other) => declaredValueTypes(other, context.footer));\n const widened = withIndexValues(type, values);\n return exploded[index]?.entry.resolved.required ? widened : irReference(\"Partial\", [widened]);\n });\n}\n\n/** A location's parameters as members, and the object types of its exploded parameters. */\ninterface LocationParts {\n readonly members: readonly IrPropertySignature[];\n readonly exploded: readonly IrType[];\n readonly isOptional: boolean;\n}\n\n/** Each parameter in document order, so the declarations they add keep their order. */\nfunction locationParts(\n entries: readonly ResolvedEntry[],\n location: SchemaLocation,\n context: TransformContext,\n): LocationParts {\n const members: IrPropertySignature[] = [];\n const exploded: ExplodedEntry[] = [];\n let isOptional = true;\n for (const entry of entries) {\n if (isExplodedEntry(entry, context)) {\n exploded.push({ entry, type: entryType(entry, location, context) });\n isOptional &&= !entry.resolved.required;\n continue;\n }\n const member = parameterMember(entry, location, context);\n members.push(member);\n isOptional &&= member.isOptional;\n }\n return { members, exploded: explodedParts(exploded, members, context), isOptional };\n}\n\n/** The members' object, intersected with the exploded parameters' types; `never` for none. */\nfunction locationType({ members, exploded }: LocationParts): IrType {\n const types = [...(members.length > 0 ? [irObject(members)] : []), ...exploded];\n const [first] = types;\n if (first === undefined) {\n return irKeyword(\"never\");\n }\n return types.length === 1 ? first : irIntersection(types);\n}\n\n/** One location's parameters; optional when all of them are, and `never` when there are none. */\nfunction locationMember(\n parameterIn: ParameterLocation,\n entries: readonly ParameterEntry[],\n location: SchemaLocation,\n context: TransformContext,\n): IrPropertySignature {\n const located = entries.filter(\n (entry): entry is ResolvedEntry => entry.resolved?.in === parameterIn,\n );\n const parts = locationParts(located, location, context);\n return irProperty(toPropertyName(parameterIn), locationType(parts), {\n isOptional: parts.isOptional,\n isReadonly: context.options.immutable,\n });\n}\n\n/**\n * The `parameters` property of an operation or path item: one member per location, each an object\n * of that location's parameters. `location.path` is the path template for\n * `--generate-path-params`.\n */\nexport function parametersMember(\n parameters: readonly ParameterOrReference[],\n location: SchemaLocation,\n context: TransformContext,\n): IrPropertySignature {\n const entries = parameterEntries(\n withPathTemplateParameters(parameters, location, context),\n context,\n );\n const querystring = querystringMember(entries, location, context);\n const members = PARAMETER_LOCATIONS.map((parameterIn) =>\n parameterIn === \"query\" && querystring\n ? querystring\n : locationMember(parameterIn, entries, location, context),\n );\n return irProperty(toPropertyName(\"parameters\"), irObject(members), {\n isReadonly: context.options.immutable,\n });\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -8,36 +8,32 @@ const documentEntries = require('../document-entries.cjs');
|
|
|
8
8
|
const refType = require('../ref-type.cjs');
|
|
9
9
|
const documentMember = require('./document-member.cjs');
|
|
10
10
|
const operation = require('./operation.cjs');
|
|
11
|
+
const parameterEntries = require('./parameter-entries.cjs');
|
|
11
12
|
const parameters = require('./parameters.cjs');
|
|
12
13
|
|
|
13
14
|
const HASH_RE = /#/g;
|
|
14
|
-
function
|
|
15
|
+
function operationKeyOf(operationId) {
|
|
16
|
+
return operationId.replace(HASH_RE, "/");
|
|
17
|
+
}
|
|
18
|
+
function isIncludedOperation(operation, context) {
|
|
15
19
|
if (!operation) {
|
|
16
20
|
return false;
|
|
17
21
|
}
|
|
18
22
|
const resolved = "$ref" in operation ? context.refs.resolve(operation.$ref) : operation;
|
|
19
23
|
return !(context.options.excludeDeprecated && resolved?.deprecated);
|
|
20
24
|
}
|
|
21
|
-
function mergedParameters(pathItem, operation, context) {
|
|
22
|
-
const byKey = /* @__PURE__ */ new Map();
|
|
23
|
-
for (const parameter of [...pathItem.parameters ?? [], ...operation.parameters ?? []]) {
|
|
24
|
-
const resolved = "$ref" in parameter ? context.refs.resolve(parameter.$ref) : parameter;
|
|
25
|
-
byKey.set(`${resolved?.in}-${resolved?.name}`, parameter);
|
|
26
|
-
}
|
|
27
|
-
return [...byKey.values()];
|
|
28
|
-
}
|
|
29
25
|
function operationType(pathItem, operation$1, location, context) {
|
|
30
|
-
const merged = { ...operation$1, parameters: mergedParameters(pathItem, operation$1, context) };
|
|
26
|
+
const merged = { ...operation$1, parameters: parameterEntries.mergedParameters(pathItem, operation$1, context.refs) };
|
|
31
27
|
if (!operation$1.operationId) {
|
|
32
28
|
return constructors.irObject(operation.operationMembers(merged, location, context));
|
|
33
29
|
}
|
|
34
|
-
const operationId = operation$1.operationId
|
|
30
|
+
const operationId = context.footer.operationKey(operationKeyOf(operation$1.operationId));
|
|
35
31
|
context.footer.addOperation(
|
|
36
32
|
() => constructors.irProperty(propertyName.toPropertyName(operationId), constructors.irObject(operation.operationMembers(merged, location, context)), {
|
|
37
33
|
isReadonly: context.options.immutable
|
|
38
34
|
})
|
|
39
35
|
);
|
|
40
|
-
return refType.refType(jsonPointer.
|
|
36
|
+
return refType.refType(jsonPointer.appendPointer(jsonPointer.ROOT_POINTER, ["operations", operationId]));
|
|
41
37
|
}
|
|
42
38
|
function operationMember({ name, operation, path }, pathItem, location, context) {
|
|
43
39
|
const type = "$ref" in operation ? refType.refType(operation.$ref) : operationType(pathItem, operation, { ...location, path }, context);
|
|
@@ -45,17 +41,17 @@ function operationMember({ name, operation, path }, pathItem, location, context)
|
|
|
45
41
|
}
|
|
46
42
|
function methodMember(method, pathItem, location, context) {
|
|
47
43
|
const operation = pathItem[method];
|
|
48
|
-
if (!
|
|
44
|
+
if (!isIncludedOperation(operation, context)) {
|
|
49
45
|
const isReadonly = context.options.immutable;
|
|
50
46
|
return constructors.irProperty(propertyName.toPropertyName(method), constructors.irKeyword("never"), { isOptional: true, isReadonly });
|
|
51
47
|
}
|
|
52
|
-
const path = jsonPointer.
|
|
48
|
+
const path = jsonPointer.appendPointer(location.path, [method]);
|
|
53
49
|
return operationMember({ name: method, operation, path }, pathItem, location, context);
|
|
54
50
|
}
|
|
55
51
|
function additionalOperationsMember(pathItem, location, context) {
|
|
56
52
|
const entries = documentEntries.documentEntries(pathItem.additionalOperations ?? {}, context.options);
|
|
57
|
-
const members = entries.filter(([, operation]) =>
|
|
58
|
-
const path = jsonPointer.
|
|
53
|
+
const members = entries.filter(([, operation]) => isIncludedOperation(operation, context)).map(([method, operation]) => {
|
|
54
|
+
const path = jsonPointer.appendPointer(location.path, [pathItemObject.ADDITIONAL_OPERATIONS_KEY, method]);
|
|
59
55
|
return operationMember({ name: method, operation, path }, pathItem, location, context);
|
|
60
56
|
});
|
|
61
57
|
return members.length > 0 ? constructors.irProperty(propertyName.toPropertyName(pathItemObject.ADDITIONAL_OPERATIONS_KEY), constructors.irObject(members), {
|
|
@@ -63,7 +59,7 @@ function additionalOperationsMember(pathItem, location, context) {
|
|
|
63
59
|
}) : null;
|
|
64
60
|
}
|
|
65
61
|
function pathItemType(pathItem, location, context) {
|
|
66
|
-
const parametersLocation = { ...location, path: jsonPointer.
|
|
62
|
+
const parametersLocation = { ...location, path: jsonPointer.appendPointer(location.path, ["parameters"]) };
|
|
67
63
|
const members = [
|
|
68
64
|
parameters.parametersMember(pathItem.parameters ?? [], parametersLocation, context),
|
|
69
65
|
...pathItemObject.HTTP_METHODS.map((method) => methodMember(method, pathItem, location, context))
|
|
@@ -78,5 +74,7 @@ function pathItemType(pathItem, location, context) {
|
|
|
78
74
|
return constructors.irObject(members);
|
|
79
75
|
}
|
|
80
76
|
|
|
77
|
+
exports.isIncludedOperation = isIncludedOperation;
|
|
78
|
+
exports.operationKeyOf = operationKeyOf;
|
|
81
79
|
exports.pathItemType = pathItemType;
|
|
82
80
|
//# sourceMappingURL=path-item.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-item.cjs","sources":["../../../../src/application/transform/document/path-item.ts"],"sourcesContent":["import { irKeyword, irObject, irProperty } from \"../../../domain/ir/constructors.js\";\nimport type { IrMember, IrPropertySignature, IrType } from \"../../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../../domain/ir/property-name.js\";\nimport { createRef } from \"../../../domain/openapi/json-pointer.js\";\nimport type { OperationObject } from \"../../../domain/openapi/operation-object.js\";\nimport type {\n ParameterObject,\n ParameterOrReference,\n} from \"../../../domain/openapi/parameter-object.js\";\nimport {\n ADDITIONAL_OPERATIONS_KEY,\n HTTP_METHODS,\n type OperationEntry,\n type PathItemMethod,\n type PathItemObject,\n QUERY_METHOD,\n} from \"../../../domain/openapi/path-item-object.js\";\nimport { documentEntries } from \"../document-entries.js\";\nimport { refType } from \"../ref-type.js\";\nimport type { SchemaLocation } from \"../schema/schema-context.js\";\nimport type { TransformContext } from \"../transform-context.js\";\nimport { documentMember } from \"./document-member.js\";\nimport { operationMembers } from \"./operation.js\";\nimport { parametersMember } from \"./parameters.js\";\n\n/** Redocly reads `#` in an operation ID as a pointer, so it is replaced (upstream issue #1542). */\nconst HASH_RE = /#/g;\n\n/** Whether the method has an operation, not removed by `--exclude-deprecated`. */\nfunction isIncluded(\n operation: OperationEntry | undefined,\n context: TransformContext,\n): operation is OperationEntry {\n if (!operation) {\n return false;\n }\n const resolved =\n \"$ref\" in operation\n ? (context.refs.resolve(operation.$ref) as OperationObject | undefined)\n : operation;\n return !(context.options.excludeDeprecated && resolved?.deprecated);\n}\n\n/**\n * Path item parameters followed by the operation's, keyed by location and name, so an operation\n * parameter replaces the path item parameter it redefines (upstream issue #1798).\n */\nfunction mergedParameters(\n pathItem: PathItemObject,\n operation: OperationObject,\n context: TransformContext,\n): ParameterOrReference[] {\n const byKey = new Map<string, ParameterOrReference>();\n for (const parameter of [...(pathItem.parameters ?? []), ...(operation.parameters ?? [])]) {\n const resolved =\n \"$ref\" in parameter\n ? (context.refs.resolve(parameter.$ref) as ParameterObject | undefined)\n : parameter;\n byKey.set(`${resolved?.in}-${resolved?.name}`, parameter);\n }\n return [...byKey.values()];\n}\n\n/**\n * An operation with an `operationId` goes into the `operations` interface and is referenced from\n * the path item; others are written inline.\n */\nfunction operationType(\n pathItem: PathItemObject,\n operation: OperationObject,\n location: SchemaLocation,\n context: TransformContext,\n): IrType {\n const merged = { ...operation, parameters: mergedParameters(pathItem, operation, context) };\n if (!operation.operationId) {\n return irObject(operationMembers(merged, location, context));\n }\n const operationId = operation.operationId.replace(HASH_RE, \"/\");\n context.footer.addOperation(() =>\n irProperty(toPropertyName(operationId), irObject(operationMembers(merged, location, context)), {\n isReadonly: context.options.immutable,\n }),\n );\n return refType(createRef([\"operations\", operationId]));\n}\n\n/** An included operation, the member name it gets and its location below the path item. */\ninterface DeclaredOperation {\n readonly name: string;\n readonly operation: OperationEntry;\n readonly path: string;\n}\n\nfunction operationMember(\n { name, operation, path }: DeclaredOperation,\n pathItem: PathItemObject,\n location: SchemaLocation,\n context: TransformContext,\n): IrPropertySignature {\n const type =\n \"$ref\" in operation\n ? refType(operation.$ref)\n : operationType(pathItem, operation, { ...location, path }, context);\n return documentMember(name, type, operation, { isReadonly: context.options.immutable });\n}\n\n/** A method member: the operation, or `?: never` when there is none or it is excluded. */\nfunction methodMember(\n method: PathItemMethod,\n pathItem: PathItemObject,\n location: SchemaLocation,\n context: TransformContext,\n): IrPropertySignature {\n const operation = pathItem[method];\n if (!isIncluded(operation, context)) {\n const isReadonly = context.options.immutable;\n return irProperty(toPropertyName(method), irKeyword(\"never\"), { isOptional: true, isReadonly });\n }\n const path = createRef([location.path, method]);\n return operationMember({ name: method, operation, path }, pathItem, location, context);\n}\n\n/**\n * `additionalOperations` (OpenAPI 3.2): the included operations keyed by their exact method name,\n * or null when the path item has none left.\n */\nfunction additionalOperationsMember(\n pathItem: PathItemObject,\n location: SchemaLocation,\n context: TransformContext,\n): IrPropertySignature | null {\n const entries = documentEntries(pathItem.additionalOperations ?? {}, context.options);\n const members = entries\n .filter(([, operation]) => isIncluded(operation, context))\n .map(([method, operation]) => {\n const path = createRef([location.path, ADDITIONAL_OPERATIONS_KEY, method]);\n return operationMember({ name: method, operation, path }, pathItem, location, context);\n });\n return members.length > 0\n ? irProperty(toPropertyName(ADDITIONAL_OPERATIONS_KEY), irObject(members), {\n isReadonly: context.options.immutable,\n })\n : null;\n}\n\n/**\n * A path item (OpenAPI 3.2 §4.8.9): its `parameters`, one member per HTTP method, then `query` and\n * `additionalOperations` when the path item declares them (ADR-020).\n */\nexport function pathItemType(\n pathItem: PathItemObject,\n location: SchemaLocation,\n context: TransformContext,\n): IrType {\n const parametersLocation = { ...location, path: createRef([location.path, \"parameters\"]) };\n const members: IrMember[] = [\n parametersMember(pathItem.parameters ?? [], parametersLocation, context),\n ...HTTP_METHODS.map((method) => methodMember(method, pathItem, location, context)),\n ];\n if (pathItem[QUERY_METHOD] !== undefined) {\n members.push(methodMember(QUERY_METHOD, pathItem, location, context));\n }\n const additionalOperations = additionalOperationsMember(pathItem, location, context);\n if (additionalOperations) {\n members.push(additionalOperations);\n }\n return irObject(members);\n}\n"],"names":["operation","irObject","operationMembers","irProperty","toPropertyName","refType","createRef","documentMember","irKeyword","documentEntries","ADDITIONAL_OPERATIONS_KEY","parametersMember","HTTP_METHODS","QUERY_METHOD"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"path-item.cjs","sources":["../../../../src/application/transform/document/path-item.ts"],"sourcesContent":["import { irKeyword, irObject, irProperty } from \"../../../domain/ir/constructors.js\";\nimport type { IrMember, IrPropertySignature, IrType } from \"../../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../../domain/ir/property-name.js\";\nimport { appendPointer, ROOT_POINTER } from \"../../../domain/openapi/json-pointer.js\";\nimport type { OperationObject } from \"../../../domain/openapi/operation-object.js\";\nimport {\n ADDITIONAL_OPERATIONS_KEY,\n HTTP_METHODS,\n type OperationEntry,\n type PathItemMethod,\n type PathItemObject,\n QUERY_METHOD,\n} from \"../../../domain/openapi/path-item-object.js\";\nimport { documentEntries } from \"../document-entries.js\";\nimport { refType } from \"../ref-type.js\";\nimport type { SchemaLocation } from \"../schema/schema-context.js\";\nimport type { TransformContext } from \"../transform-context.js\";\nimport { documentMember } from \"./document-member.js\";\nimport { operationMembers } from \"./operation.js\";\nimport { mergedParameters } from \"./parameter-entries.js\";\nimport { parametersMember } from \"./parameters.js\";\n\n/** Redocly reads `#` in an operation ID as a pointer, so it is replaced (upstream issue #1542). */\nconst HASH_RE = /#/g;\n\n/** The `operations` key an `operationId` asks for, before a repeated one gets a number. */\nexport function operationKeyOf(operationId: string): string {\n return operationId.replace(HASH_RE, \"/\");\n}\n\n/** Whether the method has an operation, not removed by `--exclude-deprecated`. */\nexport function isIncludedOperation(\n operation: OperationEntry | undefined,\n context: TransformContext,\n): operation is OperationEntry {\n if (!operation) {\n return false;\n }\n const resolved =\n \"$ref\" in operation\n ? (context.refs.resolve(operation.$ref) as OperationObject | undefined)\n : operation;\n return !(context.options.excludeDeprecated && resolved?.deprecated);\n}\n\n/**\n * An operation with an `operationId` goes into the `operations` interface and is referenced from\n * the path item; others are written inline.\n */\nfunction operationType(\n pathItem: PathItemObject,\n operation: OperationObject,\n location: SchemaLocation,\n context: TransformContext,\n): IrType {\n const merged = { ...operation, parameters: mergedParameters(pathItem, operation, context.refs) };\n if (!operation.operationId) {\n return irObject(operationMembers(merged, location, context));\n }\n const operationId = context.footer.operationKey(operationKeyOf(operation.operationId));\n context.footer.addOperation(() =>\n irProperty(toPropertyName(operationId), irObject(operationMembers(merged, location, context)), {\n isReadonly: context.options.immutable,\n }),\n );\n return refType(appendPointer(ROOT_POINTER, [\"operations\", operationId]));\n}\n\n/** An included operation, the member name it gets and its location below the path item. */\ninterface DeclaredOperation {\n readonly name: string;\n readonly operation: OperationEntry;\n readonly path: string;\n}\n\nfunction operationMember(\n { name, operation, path }: DeclaredOperation,\n pathItem: PathItemObject,\n location: SchemaLocation,\n context: TransformContext,\n): IrPropertySignature {\n const type =\n \"$ref\" in operation\n ? refType(operation.$ref)\n : operationType(pathItem, operation, { ...location, path }, context);\n return documentMember(name, type, operation, { isReadonly: context.options.immutable });\n}\n\n/** A method member: the operation, or `?: never` when there is none or it is excluded. */\nfunction methodMember(\n method: PathItemMethod,\n pathItem: PathItemObject,\n location: SchemaLocation,\n context: TransformContext,\n): IrPropertySignature {\n const operation = pathItem[method];\n if (!isIncludedOperation(operation, context)) {\n const isReadonly = context.options.immutable;\n return irProperty(toPropertyName(method), irKeyword(\"never\"), { isOptional: true, isReadonly });\n }\n const path = appendPointer(location.path, [method]);\n return operationMember({ name: method, operation, path }, pathItem, location, context);\n}\n\n/**\n * `additionalOperations` (OpenAPI 3.2): the included operations keyed by their exact method name,\n * or null when the path item has none left.\n */\nfunction additionalOperationsMember(\n pathItem: PathItemObject,\n location: SchemaLocation,\n context: TransformContext,\n): IrPropertySignature | null {\n const entries = documentEntries(pathItem.additionalOperations ?? {}, context.options);\n const members = entries\n .filter(([, operation]) => isIncludedOperation(operation, context))\n .map(([method, operation]) => {\n const path = appendPointer(location.path, [ADDITIONAL_OPERATIONS_KEY, method]);\n return operationMember({ name: method, operation, path }, pathItem, location, context);\n });\n return members.length > 0\n ? irProperty(toPropertyName(ADDITIONAL_OPERATIONS_KEY), irObject(members), {\n isReadonly: context.options.immutable,\n })\n : null;\n}\n\n/**\n * A path item (OpenAPI 3.2 §4.8.9): its `parameters`, one member per HTTP method, then `query` and\n * `additionalOperations` when the path item declares them (ADR-020).\n */\nexport function pathItemType(\n pathItem: PathItemObject,\n location: SchemaLocation,\n context: TransformContext,\n): IrType {\n const parametersLocation = { ...location, path: appendPointer(location.path, [\"parameters\"]) };\n const members: IrMember[] = [\n parametersMember(pathItem.parameters ?? [], parametersLocation, context),\n ...HTTP_METHODS.map((method) => methodMember(method, pathItem, location, context)),\n ];\n if (pathItem[QUERY_METHOD] !== undefined) {\n members.push(methodMember(QUERY_METHOD, pathItem, location, context));\n }\n const additionalOperations = additionalOperationsMember(pathItem, location, context);\n if (additionalOperations) {\n members.push(additionalOperations);\n }\n return irObject(members);\n}\n"],"names":["operation","mergedParameters","irObject","operationMembers","irProperty","toPropertyName","refType","appendPointer","ROOT_POINTER","documentMember","irKeyword","documentEntries","ADDITIONAL_OPERATIONS_KEY","parametersMember","HTTP_METHODS","QUERY_METHOD"],"mappings":"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"}
|
|
@@ -1,41 +1,37 @@
|
|
|
1
1
|
import { irObject, irProperty, irKeyword } from '../../../domain/ir/constructors.mjs';
|
|
2
2
|
import { toPropertyName } from '../../../domain/ir/property-name.mjs';
|
|
3
|
-
import {
|
|
3
|
+
import { appendPointer, ROOT_POINTER } from '../../../domain/openapi/json-pointer.mjs';
|
|
4
4
|
import { HTTP_METHODS, QUERY_METHOD, ADDITIONAL_OPERATIONS_KEY } from '../../../domain/openapi/path-item-object.mjs';
|
|
5
5
|
import { documentEntries } from '../document-entries.mjs';
|
|
6
6
|
import { refType } from '../ref-type.mjs';
|
|
7
7
|
import { documentMember } from './document-member.mjs';
|
|
8
8
|
import { operationMembers } from './operation.mjs';
|
|
9
|
+
import { mergedParameters } from './parameter-entries.mjs';
|
|
9
10
|
import { parametersMember } from './parameters.mjs';
|
|
10
11
|
|
|
11
12
|
const HASH_RE = /#/g;
|
|
12
|
-
function
|
|
13
|
+
function operationKeyOf(operationId) {
|
|
14
|
+
return operationId.replace(HASH_RE, "/");
|
|
15
|
+
}
|
|
16
|
+
function isIncludedOperation(operation, context) {
|
|
13
17
|
if (!operation) {
|
|
14
18
|
return false;
|
|
15
19
|
}
|
|
16
20
|
const resolved = "$ref" in operation ? context.refs.resolve(operation.$ref) : operation;
|
|
17
21
|
return !(context.options.excludeDeprecated && resolved?.deprecated);
|
|
18
22
|
}
|
|
19
|
-
function mergedParameters(pathItem, operation, context) {
|
|
20
|
-
const byKey = /* @__PURE__ */ new Map();
|
|
21
|
-
for (const parameter of [...pathItem.parameters ?? [], ...operation.parameters ?? []]) {
|
|
22
|
-
const resolved = "$ref" in parameter ? context.refs.resolve(parameter.$ref) : parameter;
|
|
23
|
-
byKey.set(`${resolved?.in}-${resolved?.name}`, parameter);
|
|
24
|
-
}
|
|
25
|
-
return [...byKey.values()];
|
|
26
|
-
}
|
|
27
23
|
function operationType(pathItem, operation, location, context) {
|
|
28
|
-
const merged = { ...operation, parameters: mergedParameters(pathItem, operation, context) };
|
|
24
|
+
const merged = { ...operation, parameters: mergedParameters(pathItem, operation, context.refs) };
|
|
29
25
|
if (!operation.operationId) {
|
|
30
26
|
return irObject(operationMembers(merged, location, context));
|
|
31
27
|
}
|
|
32
|
-
const operationId = operation.operationId
|
|
28
|
+
const operationId = context.footer.operationKey(operationKeyOf(operation.operationId));
|
|
33
29
|
context.footer.addOperation(
|
|
34
30
|
() => irProperty(toPropertyName(operationId), irObject(operationMembers(merged, location, context)), {
|
|
35
31
|
isReadonly: context.options.immutable
|
|
36
32
|
})
|
|
37
33
|
);
|
|
38
|
-
return refType(
|
|
34
|
+
return refType(appendPointer(ROOT_POINTER, ["operations", operationId]));
|
|
39
35
|
}
|
|
40
36
|
function operationMember({ name, operation, path }, pathItem, location, context) {
|
|
41
37
|
const type = "$ref" in operation ? refType(operation.$ref) : operationType(pathItem, operation, { ...location, path }, context);
|
|
@@ -43,17 +39,17 @@ function operationMember({ name, operation, path }, pathItem, location, context)
|
|
|
43
39
|
}
|
|
44
40
|
function methodMember(method, pathItem, location, context) {
|
|
45
41
|
const operation = pathItem[method];
|
|
46
|
-
if (!
|
|
42
|
+
if (!isIncludedOperation(operation, context)) {
|
|
47
43
|
const isReadonly = context.options.immutable;
|
|
48
44
|
return irProperty(toPropertyName(method), irKeyword("never"), { isOptional: true, isReadonly });
|
|
49
45
|
}
|
|
50
|
-
const path =
|
|
46
|
+
const path = appendPointer(location.path, [method]);
|
|
51
47
|
return operationMember({ name: method, operation, path }, pathItem, location, context);
|
|
52
48
|
}
|
|
53
49
|
function additionalOperationsMember(pathItem, location, context) {
|
|
54
50
|
const entries = documentEntries(pathItem.additionalOperations ?? {}, context.options);
|
|
55
|
-
const members = entries.filter(([, operation]) =>
|
|
56
|
-
const path =
|
|
51
|
+
const members = entries.filter(([, operation]) => isIncludedOperation(operation, context)).map(([method, operation]) => {
|
|
52
|
+
const path = appendPointer(location.path, [ADDITIONAL_OPERATIONS_KEY, method]);
|
|
57
53
|
return operationMember({ name: method, operation, path }, pathItem, location, context);
|
|
58
54
|
});
|
|
59
55
|
return members.length > 0 ? irProperty(toPropertyName(ADDITIONAL_OPERATIONS_KEY), irObject(members), {
|
|
@@ -61,7 +57,7 @@ function additionalOperationsMember(pathItem, location, context) {
|
|
|
61
57
|
}) : null;
|
|
62
58
|
}
|
|
63
59
|
function pathItemType(pathItem, location, context) {
|
|
64
|
-
const parametersLocation = { ...location, path:
|
|
60
|
+
const parametersLocation = { ...location, path: appendPointer(location.path, ["parameters"]) };
|
|
65
61
|
const members = [
|
|
66
62
|
parametersMember(pathItem.parameters ?? [], parametersLocation, context),
|
|
67
63
|
...HTTP_METHODS.map((method) => methodMember(method, pathItem, location, context))
|
|
@@ -76,5 +72,5 @@ function pathItemType(pathItem, location, context) {
|
|
|
76
72
|
return irObject(members);
|
|
77
73
|
}
|
|
78
74
|
|
|
79
|
-
export { pathItemType };
|
|
75
|
+
export { isIncludedOperation, operationKeyOf, pathItemType };
|
|
80
76
|
//# sourceMappingURL=path-item.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-item.mjs","sources":["../../../../src/application/transform/document/path-item.ts"],"sourcesContent":["import { irKeyword, irObject, irProperty } from \"../../../domain/ir/constructors.js\";\nimport type { IrMember, IrPropertySignature, IrType } from \"../../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../../domain/ir/property-name.js\";\nimport { createRef } from \"../../../domain/openapi/json-pointer.js\";\nimport type { OperationObject } from \"../../../domain/openapi/operation-object.js\";\nimport type {\n ParameterObject,\n ParameterOrReference,\n} from \"../../../domain/openapi/parameter-object.js\";\nimport {\n ADDITIONAL_OPERATIONS_KEY,\n HTTP_METHODS,\n type OperationEntry,\n type PathItemMethod,\n type PathItemObject,\n QUERY_METHOD,\n} from \"../../../domain/openapi/path-item-object.js\";\nimport { documentEntries } from \"../document-entries.js\";\nimport { refType } from \"../ref-type.js\";\nimport type { SchemaLocation } from \"../schema/schema-context.js\";\nimport type { TransformContext } from \"../transform-context.js\";\nimport { documentMember } from \"./document-member.js\";\nimport { operationMembers } from \"./operation.js\";\nimport { parametersMember } from \"./parameters.js\";\n\n/** Redocly reads `#` in an operation ID as a pointer, so it is replaced (upstream issue #1542). */\nconst HASH_RE = /#/g;\n\n/** Whether the method has an operation, not removed by `--exclude-deprecated`. */\nfunction isIncluded(\n operation: OperationEntry | undefined,\n context: TransformContext,\n): operation is OperationEntry {\n if (!operation) {\n return false;\n }\n const resolved =\n \"$ref\" in operation\n ? (context.refs.resolve(operation.$ref) as OperationObject | undefined)\n : operation;\n return !(context.options.excludeDeprecated && resolved?.deprecated);\n}\n\n/**\n * Path item parameters followed by the operation's, keyed by location and name, so an operation\n * parameter replaces the path item parameter it redefines (upstream issue #1798).\n */\nfunction mergedParameters(\n pathItem: PathItemObject,\n operation: OperationObject,\n context: TransformContext,\n): ParameterOrReference[] {\n const byKey = new Map<string, ParameterOrReference>();\n for (const parameter of [...(pathItem.parameters ?? []), ...(operation.parameters ?? [])]) {\n const resolved =\n \"$ref\" in parameter\n ? (context.refs.resolve(parameter.$ref) as ParameterObject | undefined)\n : parameter;\n byKey.set(`${resolved?.in}-${resolved?.name}`, parameter);\n }\n return [...byKey.values()];\n}\n\n/**\n * An operation with an `operationId` goes into the `operations` interface and is referenced from\n * the path item; others are written inline.\n */\nfunction operationType(\n pathItem: PathItemObject,\n operation: OperationObject,\n location: SchemaLocation,\n context: TransformContext,\n): IrType {\n const merged = { ...operation, parameters: mergedParameters(pathItem, operation, context) };\n if (!operation.operationId) {\n return irObject(operationMembers(merged, location, context));\n }\n const operationId = operation.operationId.replace(HASH_RE, \"/\");\n context.footer.addOperation(() =>\n irProperty(toPropertyName(operationId), irObject(operationMembers(merged, location, context)), {\n isReadonly: context.options.immutable,\n }),\n );\n return refType(createRef([\"operations\", operationId]));\n}\n\n/** An included operation, the member name it gets and its location below the path item. */\ninterface DeclaredOperation {\n readonly name: string;\n readonly operation: OperationEntry;\n readonly path: string;\n}\n\nfunction operationMember(\n { name, operation, path }: DeclaredOperation,\n pathItem: PathItemObject,\n location: SchemaLocation,\n context: TransformContext,\n): IrPropertySignature {\n const type =\n \"$ref\" in operation\n ? refType(operation.$ref)\n : operationType(pathItem, operation, { ...location, path }, context);\n return documentMember(name, type, operation, { isReadonly: context.options.immutable });\n}\n\n/** A method member: the operation, or `?: never` when there is none or it is excluded. */\nfunction methodMember(\n method: PathItemMethod,\n pathItem: PathItemObject,\n location: SchemaLocation,\n context: TransformContext,\n): IrPropertySignature {\n const operation = pathItem[method];\n if (!isIncluded(operation, context)) {\n const isReadonly = context.options.immutable;\n return irProperty(toPropertyName(method), irKeyword(\"never\"), { isOptional: true, isReadonly });\n }\n const path = createRef([location.path, method]);\n return operationMember({ name: method, operation, path }, pathItem, location, context);\n}\n\n/**\n * `additionalOperations` (OpenAPI 3.2): the included operations keyed by their exact method name,\n * or null when the path item has none left.\n */\nfunction additionalOperationsMember(\n pathItem: PathItemObject,\n location: SchemaLocation,\n context: TransformContext,\n): IrPropertySignature | null {\n const entries = documentEntries(pathItem.additionalOperations ?? {}, context.options);\n const members = entries\n .filter(([, operation]) => isIncluded(operation, context))\n .map(([method, operation]) => {\n const path = createRef([location.path, ADDITIONAL_OPERATIONS_KEY, method]);\n return operationMember({ name: method, operation, path }, pathItem, location, context);\n });\n return members.length > 0\n ? irProperty(toPropertyName(ADDITIONAL_OPERATIONS_KEY), irObject(members), {\n isReadonly: context.options.immutable,\n })\n : null;\n}\n\n/**\n * A path item (OpenAPI 3.2 §4.8.9): its `parameters`, one member per HTTP method, then `query` and\n * `additionalOperations` when the path item declares them (ADR-020).\n */\nexport function pathItemType(\n pathItem: PathItemObject,\n location: SchemaLocation,\n context: TransformContext,\n): IrType {\n const parametersLocation = { ...location, path: createRef([location.path, \"parameters\"]) };\n const members: IrMember[] = [\n parametersMember(pathItem.parameters ?? [], parametersLocation, context),\n ...HTTP_METHODS.map((method) => methodMember(method, pathItem, location, context)),\n ];\n if (pathItem[QUERY_METHOD] !== undefined) {\n members.push(methodMember(QUERY_METHOD, pathItem, location, context));\n }\n const additionalOperations = additionalOperationsMember(pathItem, location, context);\n if (additionalOperations) {\n members.push(additionalOperations);\n }\n return irObject(members);\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"path-item.mjs","sources":["../../../../src/application/transform/document/path-item.ts"],"sourcesContent":["import { irKeyword, irObject, irProperty } from \"../../../domain/ir/constructors.js\";\nimport type { IrMember, IrPropertySignature, IrType } from \"../../../domain/ir/nodes.js\";\nimport { toPropertyName } from \"../../../domain/ir/property-name.js\";\nimport { appendPointer, ROOT_POINTER } from \"../../../domain/openapi/json-pointer.js\";\nimport type { OperationObject } from \"../../../domain/openapi/operation-object.js\";\nimport {\n ADDITIONAL_OPERATIONS_KEY,\n HTTP_METHODS,\n type OperationEntry,\n type PathItemMethod,\n type PathItemObject,\n QUERY_METHOD,\n} from \"../../../domain/openapi/path-item-object.js\";\nimport { documentEntries } from \"../document-entries.js\";\nimport { refType } from \"../ref-type.js\";\nimport type { SchemaLocation } from \"../schema/schema-context.js\";\nimport type { TransformContext } from \"../transform-context.js\";\nimport { documentMember } from \"./document-member.js\";\nimport { operationMembers } from \"./operation.js\";\nimport { mergedParameters } from \"./parameter-entries.js\";\nimport { parametersMember } from \"./parameters.js\";\n\n/** Redocly reads `#` in an operation ID as a pointer, so it is replaced (upstream issue #1542). */\nconst HASH_RE = /#/g;\n\n/** The `operations` key an `operationId` asks for, before a repeated one gets a number. */\nexport function operationKeyOf(operationId: string): string {\n return operationId.replace(HASH_RE, \"/\");\n}\n\n/** Whether the method has an operation, not removed by `--exclude-deprecated`. */\nexport function isIncludedOperation(\n operation: OperationEntry | undefined,\n context: TransformContext,\n): operation is OperationEntry {\n if (!operation) {\n return false;\n }\n const resolved =\n \"$ref\" in operation\n ? (context.refs.resolve(operation.$ref) as OperationObject | undefined)\n : operation;\n return !(context.options.excludeDeprecated && resolved?.deprecated);\n}\n\n/**\n * An operation with an `operationId` goes into the `operations` interface and is referenced from\n * the path item; others are written inline.\n */\nfunction operationType(\n pathItem: PathItemObject,\n operation: OperationObject,\n location: SchemaLocation,\n context: TransformContext,\n): IrType {\n const merged = { ...operation, parameters: mergedParameters(pathItem, operation, context.refs) };\n if (!operation.operationId) {\n return irObject(operationMembers(merged, location, context));\n }\n const operationId = context.footer.operationKey(operationKeyOf(operation.operationId));\n context.footer.addOperation(() =>\n irProperty(toPropertyName(operationId), irObject(operationMembers(merged, location, context)), {\n isReadonly: context.options.immutable,\n }),\n );\n return refType(appendPointer(ROOT_POINTER, [\"operations\", operationId]));\n}\n\n/** An included operation, the member name it gets and its location below the path item. */\ninterface DeclaredOperation {\n readonly name: string;\n readonly operation: OperationEntry;\n readonly path: string;\n}\n\nfunction operationMember(\n { name, operation, path }: DeclaredOperation,\n pathItem: PathItemObject,\n location: SchemaLocation,\n context: TransformContext,\n): IrPropertySignature {\n const type =\n \"$ref\" in operation\n ? refType(operation.$ref)\n : operationType(pathItem, operation, { ...location, path }, context);\n return documentMember(name, type, operation, { isReadonly: context.options.immutable });\n}\n\n/** A method member: the operation, or `?: never` when there is none or it is excluded. */\nfunction methodMember(\n method: PathItemMethod,\n pathItem: PathItemObject,\n location: SchemaLocation,\n context: TransformContext,\n): IrPropertySignature {\n const operation = pathItem[method];\n if (!isIncludedOperation(operation, context)) {\n const isReadonly = context.options.immutable;\n return irProperty(toPropertyName(method), irKeyword(\"never\"), { isOptional: true, isReadonly });\n }\n const path = appendPointer(location.path, [method]);\n return operationMember({ name: method, operation, path }, pathItem, location, context);\n}\n\n/**\n * `additionalOperations` (OpenAPI 3.2): the included operations keyed by their exact method name,\n * or null when the path item has none left.\n */\nfunction additionalOperationsMember(\n pathItem: PathItemObject,\n location: SchemaLocation,\n context: TransformContext,\n): IrPropertySignature | null {\n const entries = documentEntries(pathItem.additionalOperations ?? {}, context.options);\n const members = entries\n .filter(([, operation]) => isIncludedOperation(operation, context))\n .map(([method, operation]) => {\n const path = appendPointer(location.path, [ADDITIONAL_OPERATIONS_KEY, method]);\n return operationMember({ name: method, operation, path }, pathItem, location, context);\n });\n return members.length > 0\n ? irProperty(toPropertyName(ADDITIONAL_OPERATIONS_KEY), irObject(members), {\n isReadonly: context.options.immutable,\n })\n : null;\n}\n\n/**\n * A path item (OpenAPI 3.2 §4.8.9): its `parameters`, one member per HTTP method, then `query` and\n * `additionalOperations` when the path item declares them (ADR-020).\n */\nexport function pathItemType(\n pathItem: PathItemObject,\n location: SchemaLocation,\n context: TransformContext,\n): IrType {\n const parametersLocation = { ...location, path: appendPointer(location.path, [\"parameters\"]) };\n const members: IrMember[] = [\n parametersMember(pathItem.parameters ?? [], parametersLocation, context),\n ...HTTP_METHODS.map((method) => methodMember(method, pathItem, location, context)),\n ];\n if (pathItem[QUERY_METHOD] !== undefined) {\n members.push(methodMember(QUERY_METHOD, pathItem, location, context));\n }\n const additionalOperations = additionalOperationsMember(pathItem, location, context);\n if (additionalOperations) {\n members.push(additionalOperations);\n }\n return irObject(members);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const rawTextEscapes = require('../../../domain/ir/raw-text-escapes.cjs');
|
|
4
|
+
const pathItemObject = require('../../../domain/openapi/path-item-object.cjs');
|
|
5
|
+
const outputFixes = require('../../../domain/output-fixes.cjs');
|
|
6
|
+
const pathTemplateReplace = require('./path-template-replace.cjs');
|
|
7
|
+
|
|
8
|
+
const PATH_PARAMETER_RE = /\{[^{}]+\}/g;
|
|
9
|
+
const PLACEHOLDERS = /* @__PURE__ */ new Map([
|
|
10
|
+
["number", "number"],
|
|
11
|
+
["integer", "number"],
|
|
12
|
+
["boolean", "boolean"]
|
|
13
|
+
]);
|
|
14
|
+
const STRING_PLACEHOLDER = "string";
|
|
15
|
+
function resolvedParameter(parameter, context) {
|
|
16
|
+
return "$ref" in parameter && parameter.$ref ? context.refs.resolve(parameter.$ref) : parameter;
|
|
17
|
+
}
|
|
18
|
+
function addPathParameters(parameters, byName, context) {
|
|
19
|
+
for (const parameter of parameters) {
|
|
20
|
+
const resolved = resolvedParameter(parameter, context);
|
|
21
|
+
if (resolved && resolved.in === "path") {
|
|
22
|
+
byName.set(resolved.name, resolved);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function pathParameters(pathItem, context) {
|
|
27
|
+
const byName = /* @__PURE__ */ new Map();
|
|
28
|
+
addPathParameters(pathItem.parameters ?? [], byName, context);
|
|
29
|
+
for (const { operation: entry } of pathItemObject.pathItemOperations(pathItem)) {
|
|
30
|
+
const operation = entry.$ref ? context.refs.resolve(entry.$ref) : entry;
|
|
31
|
+
addPathParameters(operation?.parameters ?? [], byName, context);
|
|
32
|
+
}
|
|
33
|
+
return byName;
|
|
34
|
+
}
|
|
35
|
+
function splitTemplateParts(url, matches) {
|
|
36
|
+
return url.split(PATH_PARAMETER_RE).flatMap((text, index) => {
|
|
37
|
+
const type = matches[index]?.type;
|
|
38
|
+
const textPart = { kind: "text", text };
|
|
39
|
+
return type === void 0 ? [textPart] : [textPart, { kind: "placeholder", type }];
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function pathTemplateParts(url, pathItem, context) {
|
|
43
|
+
const found = url.match(PATH_PARAMETER_RE);
|
|
44
|
+
if (!found) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
const parameters = pathParameters(pathItem, context);
|
|
48
|
+
const matches = found.map((match) => {
|
|
49
|
+
const schema = parameters.get(match.slice(1, -1))?.schema;
|
|
50
|
+
return { match, type: PLACEHOLDERS.get(schema?.type) ?? STRING_PLACEHOLDER };
|
|
51
|
+
});
|
|
52
|
+
return context.options.fixes.has(outputFixes.FIX.PATH_PARAM_TYPE_NAMES) ? splitTemplateParts(url, matches) : pathTemplateReplace.replacedTemplateParts(url, matches);
|
|
53
|
+
}
|
|
54
|
+
function templateText(parts) {
|
|
55
|
+
const text = parts.map(
|
|
56
|
+
(part) => part.kind === "text" ? rawTextEscapes.escapeTemplateText(part.text) : pathTemplateReplace.placeholderText(part.type)
|
|
57
|
+
).join("");
|
|
58
|
+
return `\`${text}\``;
|
|
59
|
+
}
|
|
60
|
+
const BOOLEAN_TEXTS = ["true", "false"];
|
|
61
|
+
const isBooleanPlaceholder = (part) => part.kind === "placeholder" && part.type === "boolean";
|
|
62
|
+
function booleanExpandedKeys(parts) {
|
|
63
|
+
const isBooleanOnly = parts.every((part) => part.kind === "text" || isBooleanPlaceholder(part));
|
|
64
|
+
if (!isBooleanOnly) {
|
|
65
|
+
return [[...parts]];
|
|
66
|
+
}
|
|
67
|
+
return parts.reduce(
|
|
68
|
+
(keys, part) => {
|
|
69
|
+
const choices = isBooleanPlaceholder(part) ? BOOLEAN_TEXTS.map((text) => ({ kind: "text", text })) : [part];
|
|
70
|
+
return keys.flatMap((key) => choices.map((choice) => [...key, choice]));
|
|
71
|
+
},
|
|
72
|
+
[[]]
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
function plainUrlOf(parts) {
|
|
76
|
+
const texts = parts.map((part) => part.kind === "text" ? part.text : null);
|
|
77
|
+
return texts.includes(null) ? null : texts.join("");
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
exports.booleanExpandedKeys = booleanExpandedKeys;
|
|
81
|
+
exports.pathTemplateParts = pathTemplateParts;
|
|
82
|
+
exports.plainUrlOf = plainUrlOf;
|
|
83
|
+
exports.templateText = templateText;
|
|
84
|
+
//# sourceMappingURL=path-template-key.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-template-key.cjs","sources":["../../../../src/application/transform/document/path-template-key.ts"],"sourcesContent":["import { escapeTemplateText } from \"../../../domain/ir/raw-text-escapes.js\";\nimport type { OperationObject } from \"../../../domain/openapi/operation-object.js\";\nimport type {\n ParameterObject,\n ParameterOrReference,\n} from \"../../../domain/openapi/parameter-object.js\";\nimport {\n type PathItemObject,\n pathItemOperations,\n} from \"../../../domain/openapi/path-item-object.js\";\nimport type { ReferenceSchema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { FIX } from \"../../../domain/output-fixes.js\";\nimport type { TransformContext } from \"../transform-context.js\";\nimport type { PathKeyPart, PathPlaceholder } from \"./path-key-overlaps.js\";\nimport {\n type PathParameterMatch,\n placeholderText,\n replacedTemplateParts,\n} from \"./path-template-replace.js\";\n\n/** The `--path-params-as-types` key of a path: its URL with a placeholder per parameter. */\n\n/** `[^{}]` keeps the scan linear: `[^}]` retried from every `{` of a long run of them. */\nconst PATH_PARAMETER_RE = /\\{[^{}]+\\}/g;\n\n/** Placeholders by parameter schema type; anything else is a string placeholder. */\nconst PLACEHOLDERS: ReadonlyMap<unknown, PathPlaceholder> = new Map([\n [\"number\", \"number\"],\n [\"integer\", \"number\"],\n [\"boolean\", \"boolean\"],\n]);\nconst STRING_PLACEHOLDER: PathPlaceholder = \"string\";\n\nfunction resolvedParameter(\n parameter: ParameterOrReference,\n context: TransformContext,\n): ParameterObject | undefined {\n return \"$ref\" in parameter && parameter.$ref\n ? (context.refs.resolve(parameter.$ref) as ParameterObject | undefined)\n : (parameter as ParameterObject);\n}\n\nfunction addPathParameters(\n parameters: readonly ParameterOrReference[],\n byName: Map<string, ParameterObject>,\n context: TransformContext,\n): void {\n for (const parameter of parameters) {\n const resolved = resolvedParameter(parameter, context);\n if (resolved && resolved.in === \"path\") {\n byName.set(resolved.name, resolved);\n }\n }\n}\n\n/** Path parameters of the path item and of its operations; later definitions win. */\nfunction pathParameters(\n pathItem: PathItemObject,\n context: TransformContext,\n): Map<string, ParameterObject> {\n const byName = new Map<string, ParameterObject>();\n addPathParameters(pathItem.parameters ?? [], byName, context);\n for (const { operation: entry } of pathItemOperations(pathItem)) {\n const operation = (entry as ReferenceSchema).$ref\n ? (context.refs.resolve((entry as ReferenceSchema).$ref) as OperationObject | undefined)\n : (entry as OperationObject);\n addPathParameters(operation?.parameters ?? [], byName, context);\n }\n return byName;\n}\n\n/** Each `{name}` of the URL and its own placeholder, from the URL split at the matches. */\nfunction splitTemplateParts(url: string, matches: readonly PathParameterMatch[]): PathKeyPart[] {\n return url.split(PATH_PARAMETER_RE).flatMap((text, index): PathKeyPart[] => {\n const type = matches[index]?.type;\n const textPart: PathKeyPart = { kind: \"text\", text };\n return type === undefined ? [textPart] : [textPart, { kind: \"placeholder\", type }];\n });\n}\n\n/**\n * `--path-params-as-types`: the URL as template parts, each `{name}` replaced by a placeholder for\n * its parameter's type, the way the original replaces them unless the `path-param-type-names` fix\n * is on (see `replacedTemplateParts`). Null when the URL has no complete `{…}` placeholder.\n */\nexport function pathTemplateParts(\n url: string,\n pathItem: PathItemObject,\n context: TransformContext,\n): PathKeyPart[] | null {\n const found = url.match(PATH_PARAMETER_RE);\n if (!found) {\n return null;\n }\n const parameters = pathParameters(pathItem, context);\n const matches = found.map((match): PathParameterMatch => {\n const schema = parameters.get(match.slice(1, -1))?.schema as SchemaObject | undefined;\n return { match, type: PLACEHOLDERS.get(schema?.type) ?? STRING_PLACEHOLDER };\n });\n return context.options.fixes.has(FIX.PATH_PARAM_TYPE_NAMES)\n ? splitTemplateParts(url, matches)\n : replacedTemplateParts(url, matches);\n}\n\n/**\n * The template literal type of the parts. The original escaped only backticks: a backslash or\n * `${` in the URL could end the literal or open a placeholder, and add code to the generated file\n * (intentional fix). So the text parts are escaped.\n */\nexport function templateText(parts: readonly PathKeyPart[]): string {\n const text = parts\n .map((part) =>\n part.kind === \"text\" ? escapeTemplateText(part.text) : placeholderText(part.type),\n )\n .join(\"\");\n return `\\`${text}\\``;\n}\n\nconst BOOLEAN_TEXTS = [\"true\", \"false\"] as const;\n\nconst isBooleanPlaceholder = (part: PathKeyPart): boolean =>\n part.kind === \"placeholder\" && part.type === \"boolean\";\n\n/**\n * The keys of a template whose only placeholders are `${boolean}`, with each written as `true`\n * and as `false`. Such a template is a union of literals, and an index signature takes none\n * (TS1337), so the original's `` [path: `/flags/${boolean}`] `` did not compile. A path with n\n * boolean parameters gets 2ⁿ plain URLs (`/flags/true`), all with the same path item type. Next to\n * another placeholder the template is a pattern, a valid signature that admits the same URLs, so\n * those parts stay one key.\n */\nexport function booleanExpandedKeys(parts: readonly PathKeyPart[]): PathKeyPart[][] {\n const isBooleanOnly = parts.every((part) => part.kind === \"text\" || isBooleanPlaceholder(part));\n if (!isBooleanOnly) {\n return [[...parts]];\n }\n return parts.reduce<PathKeyPart[][]>(\n (keys, part) => {\n const choices: readonly PathKeyPart[] = isBooleanPlaceholder(part)\n ? BOOLEAN_TEXTS.map((text) => ({ kind: \"text\", text }))\n : [part];\n return keys.flatMap((key) => choices.map((choice) => [...key, choice]));\n },\n [[]],\n );\n}\n\n/** The URL of parts without placeholders; null when one is left. */\nexport function plainUrlOf(parts: readonly PathKeyPart[]): string | null {\n const texts = parts.map((part) => (part.kind === \"text\" ? part.text : null));\n return texts.includes(null) ? null : texts.join(\"\");\n}\n"],"names":["pathItemOperations","FIX","replacedTemplateParts","escapeTemplateText","placeholderText"],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { escapeTemplateText } from '../../../domain/ir/raw-text-escapes.mjs';
|
|
2
|
+
import { pathItemOperations } from '../../../domain/openapi/path-item-object.mjs';
|
|
3
|
+
import { FIX } from '../../../domain/output-fixes.mjs';
|
|
4
|
+
import { replacedTemplateParts, placeholderText } from './path-template-replace.mjs';
|
|
5
|
+
|
|
6
|
+
const PATH_PARAMETER_RE = /\{[^{}]+\}/g;
|
|
7
|
+
const PLACEHOLDERS = /* @__PURE__ */ new Map([
|
|
8
|
+
["number", "number"],
|
|
9
|
+
["integer", "number"],
|
|
10
|
+
["boolean", "boolean"]
|
|
11
|
+
]);
|
|
12
|
+
const STRING_PLACEHOLDER = "string";
|
|
13
|
+
function resolvedParameter(parameter, context) {
|
|
14
|
+
return "$ref" in parameter && parameter.$ref ? context.refs.resolve(parameter.$ref) : parameter;
|
|
15
|
+
}
|
|
16
|
+
function addPathParameters(parameters, byName, context) {
|
|
17
|
+
for (const parameter of parameters) {
|
|
18
|
+
const resolved = resolvedParameter(parameter, context);
|
|
19
|
+
if (resolved && resolved.in === "path") {
|
|
20
|
+
byName.set(resolved.name, resolved);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function pathParameters(pathItem, context) {
|
|
25
|
+
const byName = /* @__PURE__ */ new Map();
|
|
26
|
+
addPathParameters(pathItem.parameters ?? [], byName, context);
|
|
27
|
+
for (const { operation: entry } of pathItemOperations(pathItem)) {
|
|
28
|
+
const operation = entry.$ref ? context.refs.resolve(entry.$ref) : entry;
|
|
29
|
+
addPathParameters(operation?.parameters ?? [], byName, context);
|
|
30
|
+
}
|
|
31
|
+
return byName;
|
|
32
|
+
}
|
|
33
|
+
function splitTemplateParts(url, matches) {
|
|
34
|
+
return url.split(PATH_PARAMETER_RE).flatMap((text, index) => {
|
|
35
|
+
const type = matches[index]?.type;
|
|
36
|
+
const textPart = { kind: "text", text };
|
|
37
|
+
return type === void 0 ? [textPart] : [textPart, { kind: "placeholder", type }];
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
function pathTemplateParts(url, pathItem, context) {
|
|
41
|
+
const found = url.match(PATH_PARAMETER_RE);
|
|
42
|
+
if (!found) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
const parameters = pathParameters(pathItem, context);
|
|
46
|
+
const matches = found.map((match) => {
|
|
47
|
+
const schema = parameters.get(match.slice(1, -1))?.schema;
|
|
48
|
+
return { match, type: PLACEHOLDERS.get(schema?.type) ?? STRING_PLACEHOLDER };
|
|
49
|
+
});
|
|
50
|
+
return context.options.fixes.has(FIX.PATH_PARAM_TYPE_NAMES) ? splitTemplateParts(url, matches) : replacedTemplateParts(url, matches);
|
|
51
|
+
}
|
|
52
|
+
function templateText(parts) {
|
|
53
|
+
const text = parts.map(
|
|
54
|
+
(part) => part.kind === "text" ? escapeTemplateText(part.text) : placeholderText(part.type)
|
|
55
|
+
).join("");
|
|
56
|
+
return `\`${text}\``;
|
|
57
|
+
}
|
|
58
|
+
const BOOLEAN_TEXTS = ["true", "false"];
|
|
59
|
+
const isBooleanPlaceholder = (part) => part.kind === "placeholder" && part.type === "boolean";
|
|
60
|
+
function booleanExpandedKeys(parts) {
|
|
61
|
+
const isBooleanOnly = parts.every((part) => part.kind === "text" || isBooleanPlaceholder(part));
|
|
62
|
+
if (!isBooleanOnly) {
|
|
63
|
+
return [[...parts]];
|
|
64
|
+
}
|
|
65
|
+
return parts.reduce(
|
|
66
|
+
(keys, part) => {
|
|
67
|
+
const choices = isBooleanPlaceholder(part) ? BOOLEAN_TEXTS.map((text) => ({ kind: "text", text })) : [part];
|
|
68
|
+
return keys.flatMap((key) => choices.map((choice) => [...key, choice]));
|
|
69
|
+
},
|
|
70
|
+
[[]]
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
function plainUrlOf(parts) {
|
|
74
|
+
const texts = parts.map((part) => part.kind === "text" ? part.text : null);
|
|
75
|
+
return texts.includes(null) ? null : texts.join("");
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export { booleanExpandedKeys, pathTemplateParts, plainUrlOf, templateText };
|
|
79
|
+
//# sourceMappingURL=path-template-key.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-template-key.mjs","sources":["../../../../src/application/transform/document/path-template-key.ts"],"sourcesContent":["import { escapeTemplateText } from \"../../../domain/ir/raw-text-escapes.js\";\nimport type { OperationObject } from \"../../../domain/openapi/operation-object.js\";\nimport type {\n ParameterObject,\n ParameterOrReference,\n} from \"../../../domain/openapi/parameter-object.js\";\nimport {\n type PathItemObject,\n pathItemOperations,\n} from \"../../../domain/openapi/path-item-object.js\";\nimport type { ReferenceSchema, SchemaObject } from \"../../../domain/openapi/schema-object.js\";\nimport { FIX } from \"../../../domain/output-fixes.js\";\nimport type { TransformContext } from \"../transform-context.js\";\nimport type { PathKeyPart, PathPlaceholder } from \"./path-key-overlaps.js\";\nimport {\n type PathParameterMatch,\n placeholderText,\n replacedTemplateParts,\n} from \"./path-template-replace.js\";\n\n/** The `--path-params-as-types` key of a path: its URL with a placeholder per parameter. */\n\n/** `[^{}]` keeps the scan linear: `[^}]` retried from every `{` of a long run of them. */\nconst PATH_PARAMETER_RE = /\\{[^{}]+\\}/g;\n\n/** Placeholders by parameter schema type; anything else is a string placeholder. */\nconst PLACEHOLDERS: ReadonlyMap<unknown, PathPlaceholder> = new Map([\n [\"number\", \"number\"],\n [\"integer\", \"number\"],\n [\"boolean\", \"boolean\"],\n]);\nconst STRING_PLACEHOLDER: PathPlaceholder = \"string\";\n\nfunction resolvedParameter(\n parameter: ParameterOrReference,\n context: TransformContext,\n): ParameterObject | undefined {\n return \"$ref\" in parameter && parameter.$ref\n ? (context.refs.resolve(parameter.$ref) as ParameterObject | undefined)\n : (parameter as ParameterObject);\n}\n\nfunction addPathParameters(\n parameters: readonly ParameterOrReference[],\n byName: Map<string, ParameterObject>,\n context: TransformContext,\n): void {\n for (const parameter of parameters) {\n const resolved = resolvedParameter(parameter, context);\n if (resolved && resolved.in === \"path\") {\n byName.set(resolved.name, resolved);\n }\n }\n}\n\n/** Path parameters of the path item and of its operations; later definitions win. */\nfunction pathParameters(\n pathItem: PathItemObject,\n context: TransformContext,\n): Map<string, ParameterObject> {\n const byName = new Map<string, ParameterObject>();\n addPathParameters(pathItem.parameters ?? [], byName, context);\n for (const { operation: entry } of pathItemOperations(pathItem)) {\n const operation = (entry as ReferenceSchema).$ref\n ? (context.refs.resolve((entry as ReferenceSchema).$ref) as OperationObject | undefined)\n : (entry as OperationObject);\n addPathParameters(operation?.parameters ?? [], byName, context);\n }\n return byName;\n}\n\n/** Each `{name}` of the URL and its own placeholder, from the URL split at the matches. */\nfunction splitTemplateParts(url: string, matches: readonly PathParameterMatch[]): PathKeyPart[] {\n return url.split(PATH_PARAMETER_RE).flatMap((text, index): PathKeyPart[] => {\n const type = matches[index]?.type;\n const textPart: PathKeyPart = { kind: \"text\", text };\n return type === undefined ? [textPart] : [textPart, { kind: \"placeholder\", type }];\n });\n}\n\n/**\n * `--path-params-as-types`: the URL as template parts, each `{name}` replaced by a placeholder for\n * its parameter's type, the way the original replaces them unless the `path-param-type-names` fix\n * is on (see `replacedTemplateParts`). Null when the URL has no complete `{…}` placeholder.\n */\nexport function pathTemplateParts(\n url: string,\n pathItem: PathItemObject,\n context: TransformContext,\n): PathKeyPart[] | null {\n const found = url.match(PATH_PARAMETER_RE);\n if (!found) {\n return null;\n }\n const parameters = pathParameters(pathItem, context);\n const matches = found.map((match): PathParameterMatch => {\n const schema = parameters.get(match.slice(1, -1))?.schema as SchemaObject | undefined;\n return { match, type: PLACEHOLDERS.get(schema?.type) ?? STRING_PLACEHOLDER };\n });\n return context.options.fixes.has(FIX.PATH_PARAM_TYPE_NAMES)\n ? splitTemplateParts(url, matches)\n : replacedTemplateParts(url, matches);\n}\n\n/**\n * The template literal type of the parts. The original escaped only backticks: a backslash or\n * `${` in the URL could end the literal or open a placeholder, and add code to the generated file\n * (intentional fix). So the text parts are escaped.\n */\nexport function templateText(parts: readonly PathKeyPart[]): string {\n const text = parts\n .map((part) =>\n part.kind === \"text\" ? escapeTemplateText(part.text) : placeholderText(part.type),\n )\n .join(\"\");\n return `\\`${text}\\``;\n}\n\nconst BOOLEAN_TEXTS = [\"true\", \"false\"] as const;\n\nconst isBooleanPlaceholder = (part: PathKeyPart): boolean =>\n part.kind === \"placeholder\" && part.type === \"boolean\";\n\n/**\n * The keys of a template whose only placeholders are `${boolean}`, with each written as `true`\n * and as `false`. Such a template is a union of literals, and an index signature takes none\n * (TS1337), so the original's `` [path: `/flags/${boolean}`] `` did not compile. A path with n\n * boolean parameters gets 2ⁿ plain URLs (`/flags/true`), all with the same path item type. Next to\n * another placeholder the template is a pattern, a valid signature that admits the same URLs, so\n * those parts stay one key.\n */\nexport function booleanExpandedKeys(parts: readonly PathKeyPart[]): PathKeyPart[][] {\n const isBooleanOnly = parts.every((part) => part.kind === \"text\" || isBooleanPlaceholder(part));\n if (!isBooleanOnly) {\n return [[...parts]];\n }\n return parts.reduce<PathKeyPart[][]>(\n (keys, part) => {\n const choices: readonly PathKeyPart[] = isBooleanPlaceholder(part)\n ? BOOLEAN_TEXTS.map((text) => ({ kind: \"text\", text }))\n : [part];\n return keys.flatMap((key) => choices.map((choice) => [...key, choice]));\n },\n [[]],\n );\n}\n\n/** The URL of parts without placeholders; null when one is left. */\nexport function plainUrlOf(parts: readonly PathKeyPart[]): string | null {\n const texts = parts.map((part) => (part.kind === \"text\" ? part.text : null));\n return texts.includes(null) ? null : texts.join(\"\");\n}\n"],"names":[],"mappings":"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"}
|