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":"discriminator-scan.mjs","sources":["../../src/api/discriminator-scan.ts"],"sourcesContent":["import type { Logger } from \"../application/ports/logger.js\";\nimport { isUnionMember, unionAt } from \"../domain/openapi/discriminated-union.js\";\nimport { FIX } from \"../domain/output-fixes.js\";\nimport type {\n DiscriminatorObject,\n GeneratorOptions,\n OpenAPI3,\n ReferenceObject,\n SchemaObject,\n} from \"../types.js\";\nimport { defaultLogger } from \"./default-ports.js\";\nimport type { EnumPatch } from \"./discriminator-enum.js\";\nimport type { EnumParent } from \"./discriminator-enum-parent.js\";\nimport { applyOtherInferredPatches, inheritOtherOwners } from \"./discriminator-other-owners.js\";\nimport {\n type DiscriminatorScanOptions,\n enumKey,\n markHandled,\n mergesValues,\n patchDiscriminatorEnum,\n recordEnumParent,\n type ScanState,\n} from \"./discriminator-patch.js\";\nimport { resolveDocumentRef, walkDocument } from \"./document-refs.js\";\nimport { createRef } from \"./legacy-utils.js\";\n\n/**\n * The inherited discriminator pre-pass. It finds every discriminator in the bundled document and\n * patches the mapped schemas in place with a required enum property, so that TypeScript can narrow\n * the generated union. The behavior and the warning text match the original `scanDiscriminators`.\n */\n\ntype DiscriminatorMapping = Record<string, { inferred?: string; defined?: string[] }>;\n\n/** The schema name at the end of each `oneOf` `$ref` is the inferred discriminator value. */\nfunction inferredMapping(oneOf: (SchemaObject | ReferenceObject)[]): DiscriminatorMapping {\n const mapping: DiscriminatorMapping = {};\n for (const item of oneOf) {\n if (!(\"$ref\" in item)) {\n continue;\n }\n const value = item.$ref.split(\"/\").pop();\n if (value) {\n mapping[item.$ref] = { ...mapping[item.$ref], inferred: value };\n }\n }\n return mapping;\n}\n\n/** Values defined in `discriminator.mapping` replace inferred ones for the same schema. */\nfunction addDefinedMapping(\n mapping: DiscriminatorMapping,\n defined: Readonly<Record<string, string>>,\n): void {\n for (const [mappedValue, mappedRef] of Object.entries(defined)) {\n if (!mappedRef) {\n continue;\n }\n if (!mapping[mappedRef]?.defined) {\n mapping[mappedRef] = { defined: [] };\n }\n mapping[mappedRef].defined?.push(mappedValue);\n }\n}\n\nfunction patchMappedSchemas(\n state: ScanState,\n mapping: DiscriminatorMapping,\n discriminator: Omit<EnumPatch, \"ref\" | \"values\">,\n): void {\n for (const [ref, { inferred, defined }] of Object.entries(mapping)) {\n const isSkipped = !mergesValues(state) && state.refsHandled.includes(ref);\n if (isSkipped || (!inferred && !defined)) {\n continue;\n }\n // A defined value wins: the schema name may not be the value the API sends.\n const values = defined ?? [inferred as string];\n if (mergesValues(state) && defined === undefined) {\n // A mapping found later, in this pass or the next, may name the schema.\n state.inferredPatches.push({ ...discriminator, ref, values });\n } else if (patchDiscriminatorEnum(state, { ...discriminator, ref, values })) {\n markHandled(state, ref);\n }\n }\n}\n\n/** Pass 1: collect every discriminator; patch the schemas of a discriminator + `oneOf`. */\nfunction collectDiscriminator(\n state: ScanState,\n value: Record<string, unknown>,\n path: (string | number)[],\n): void {\n const discriminator = value.discriminator as DiscriminatorObject | undefined;\n if (!discriminator?.propertyName) {\n return;\n }\n const discriminatorRef = createRef(path);\n state.objects[discriminatorRef] = discriminator;\n state.owners.add(discriminatorRef);\n if (!Array.isArray(value.oneOf)) {\n return;\n }\n const mapping = inferredMapping(value.oneOf);\n if (discriminator.mapping) {\n addDefinedMapping(mapping, discriminator.mapping);\n }\n patchMappedSchemas(state, mapping, { discriminator, discriminatorRef });\n}\n\n/** The mapping keys of `discriminator` that point at `ref`. */\nfunction valuesMappedTo(discriminator: DiscriminatorObject, ref: string): string[] {\n return Object.entries(discriminator.mapping ?? {})\n .filter(([, mappedRef]) => mappedRef === ref)\n .map(([mappedValue]) => mappedValue);\n}\n\n/**\n * Whether the schema at `ref` takes the discriminator of its `allOf` parent at `parentRef`. With\n * `allof-discriminated-union`, a schema that `allOf`s a discriminated union that does not contain\n * it is that union, not one of its members, so it gets no value of its own (#1464, #1690). A\n * schema that the union's mapping names is a member.\n */\nfunction inheritsDiscriminator(state: ScanState, parentRef: string, ref: string): boolean {\n if (!state.fixes.has(FIX.ALLOF_DISCRIMINATED_UNION)) {\n return true;\n }\n const resolve = (target: string) => resolveDocumentRef(state.schema, target, state);\n const union = unionAt(parentRef, resolve);\n return union === undefined || isUnionMember(union, ref, resolve);\n}\n\n/**\n * The schema at `ref` inherits `discriminator`. With `discriminator-values`, a schema that\n * defines a discriminator keeps it: the inherited one replaced its mapping, so the members walked\n * after this schema got their schema name instead of the mapped value (#2200). `ownerRef` is the\n * schema that declares the discriminator property, whose enum `--enum` values use (#1700).\n */\nfunction recordInherited(\n state: ScanState,\n ref: string,\n discriminator: DiscriminatorObject,\n ownerRef: string,\n): void {\n if (state.fixes.has(FIX.DISCRIMINATOR_VALUES) && state.owners.has(ref)) {\n return;\n }\n const inherited = { ...discriminator };\n state.objects[ref] = inherited;\n recordEnumParent(state, { discriminator, discriminatorRef: ownerRef }, inherited);\n}\n\n/**\n * An `allOf` item that is a `$ref` to a discriminator owner: the schema at `ref` inherits the\n * discriminator, and gets its enum when the parent's mapping names it. Returns false when the\n * `$ref` owns no discriminator, which ends the scan of this `allOf` (as in the original).\n */\nfunction inheritFromRef(state: ScanState, parentRef: string, ref: string): boolean {\n const discriminator = state.objects[parentRef];\n if (!discriminator) {\n return false;\n }\n const values = valuesMappedTo(discriminator, ref);\n const patch = { ref, values, discriminator, discriminatorRef: parentRef };\n if (values.length > 0 && patchDiscriminatorEnum(state, patch)) {\n markHandled(state, ref);\n }\n if (inheritsDiscriminator(state, parentRef, ref)) {\n recordInherited(state, ref, discriminator, parentRef);\n if (mergesValues(state)) {\n inheritOtherOwners(state, parentRef, ref);\n }\n }\n return true;\n}\n\n/** Pass 2: a schema whose `allOf` holds a discriminator, or a `$ref` to one, inherits it. */\nfunction inheritDiscriminators(\n state: ScanState,\n value: Record<string, unknown>,\n path: (string | number)[],\n): void {\n if (!Array.isArray(value.allOf)) {\n return;\n }\n for (const item of value.allOf as (SchemaObject | ReferenceObject)[]) {\n if (\"$ref\" in item) {\n if (!inheritFromRef(state, item.$ref, createRef(path))) {\n return;\n }\n } else if (item.discriminator?.propertyName) {\n // The inline item is typed at the schema's own location.\n recordInherited(state, createRef(path), item.discriminator, createRef(path));\n }\n }\n}\n\n/** The discriminators of a bundled document, after patching the mapped schemas in place. */\nexport interface DiscriminatorScan {\n objects: Record<string, DiscriminatorObject>;\n refsHandled: string[];\n /** With `discriminator-values`: the owner's enum of each enum the scan added. */\n enumParents: ReadonlyMap<object, EnumParent>;\n /** With `discriminator-values`: the properties of the other discriminators a schema inherits. */\n otherProperties: Readonly<Record<string, readonly string[]>>;\n}\n\n/**\n * With the fix: a schema-name value, only for a schema and property that no mapping gave a value.\n * Every enum patched so far came from a mapping, since schema-name values wait for this step.\n */\nfunction applyInferredPatches(state: ScanState): void {\n // A value that a schema declares itself came from a mapping as well.\n const mapped = new Set([...state.patchedEnums.keys(), ...state.declaredKeys]);\n for (const patch of state.inferredPatches) {\n if (!mapped.has(enumKey(patch)) && patchDiscriminatorEnum(state, patch)) {\n markHandled(state, patch.ref);\n }\n }\n applyOtherInferredPatches(state, mapped);\n}\n\n/** Find every discriminator in `schema`; warnings go to `logger` unless `silent`. */\nexport function findDiscriminators(\n schema: OpenAPI3,\n options: DiscriminatorScanOptions,\n): DiscriminatorScan {\n const state: ScanState = {\n ...options,\n schema,\n objects: {},\n owners: new Set(),\n refsHandled: [],\n patchedEnums: new Map(),\n inferredPatches: [],\n otherInferredPatches: [],\n otherProperties: {},\n declaredKeys: new Set(),\n enumParents: new Map(),\n };\n walkDocument(schema, (value, path) => collectDiscriminator(state, value, path));\n // A second pass, because an `allOf` may name a discriminator that is defined later.\n walkDocument(schema, (value, path) => inheritDiscriminators(state, value, path));\n applyInferredPatches(state);\n const { objects, refsHandled, enumParents, otherProperties } = state;\n return { objects, refsHandled, enumParents, otherProperties };\n}\n\n/**\n * Return a key–value map of discriminator objects found in a schema. Warnings go to `logger`;\n * without one, to the default terminal logger, as the original did.\n * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).\n */\nexport function scanDiscriminators(\n schema: OpenAPI3,\n options: GeneratorOptions,\n logger: Logger = defaultLogger(options.silent ?? false),\n): DiscriminatorScan {\n const silent = options.silent ?? false;\n return findDiscriminators(schema, { silent, logger, fixes: new Set() });\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"discriminator-scan.mjs","sources":["../../src/api/discriminator-scan.ts"],"sourcesContent":["import type { Logger } from \"../application/ports/logger.js\";\nimport { isUnionMember, unionAt } from \"../domain/openapi/discriminated-union.js\";\nimport { appendPointer, canonicalRef, ROOT_POINTER } from \"../domain/openapi/json-pointer.js\";\nimport { FIX } from \"../domain/output-fixes.js\";\nimport type {\n DiscriminatorObject,\n GeneratorOptions,\n OpenAPI3,\n ReferenceObject,\n SchemaObject,\n} from \"../types.js\";\nimport { defaultLogger } from \"./default-ports.js\";\nimport type { EnumPatch } from \"./discriminator-enum.js\";\nimport type { EnumParent } from \"./discriminator-enum-parent.js\";\nimport { applyOtherInferredPatches, inheritOtherOwners } from \"./discriminator-other-owners.js\";\nimport {\n type DiscriminatorScanOptions,\n enumKey,\n markHandled,\n mergesValues,\n patchDiscriminatorEnum,\n recordEnumParent,\n type ScanState,\n} from \"./discriminator-patch.js\";\nimport { resolveDocumentRef, walkDocument } from \"./document-refs.js\";\n\n/**\n * The inherited discriminator pre-pass. It finds every discriminator in the bundled document and\n * patches the mapped schemas in place with a required enum property, so that TypeScript can narrow\n * the generated union. The behavior and the warning text match the original `scanDiscriminators`.\n */\n\ntype DiscriminatorMapping = Record<string, { inferred?: string; defined?: string[] }>;\n\n/** The schema name at the end of each `oneOf` `$ref` is the inferred discriminator value. */\nfunction inferredMapping(oneOf: (SchemaObject | ReferenceObject)[]): DiscriminatorMapping {\n const mapping: DiscriminatorMapping = {};\n for (const item of oneOf) {\n if (!(\"$ref\" in item)) {\n continue;\n }\n // The value is the name as the `$ref` writes it, as in the original.\n const value = item.$ref.split(\"/\").pop();\n const ref = canonicalRef(item.$ref);\n if (value) {\n mapping[ref] = { ...mapping[ref], inferred: value };\n }\n }\n return mapping;\n}\n\n/** Values defined in `discriminator.mapping` replace inferred ones for the same schema. */\nfunction addDefinedMapping(\n mapping: DiscriminatorMapping,\n defined: Readonly<Record<string, string>>,\n): void {\n for (const [mappedValue, target] of Object.entries(defined)) {\n if (!target) {\n continue;\n }\n const mappedRef = canonicalRef(target);\n if (!mapping[mappedRef]?.defined) {\n mapping[mappedRef] = { defined: [] };\n }\n mapping[mappedRef].defined?.push(mappedValue);\n }\n}\n\nfunction patchMappedSchemas(\n state: ScanState,\n mapping: DiscriminatorMapping,\n discriminator: Omit<EnumPatch, \"ref\" | \"values\">,\n): void {\n for (const [ref, { inferred, defined }] of Object.entries(mapping)) {\n const isSkipped = !mergesValues(state) && state.refsHandled.includes(ref);\n if (isSkipped || (!inferred && !defined)) {\n continue;\n }\n // A defined value wins: the schema name may not be the value the API sends.\n const values = defined ?? [inferred as string];\n if (mergesValues(state) && defined === undefined) {\n // A mapping found later, in this pass or the next, may name the schema.\n state.inferredPatches.push({ ...discriminator, ref, values });\n } else if (patchDiscriminatorEnum(state, { ...discriminator, ref, values })) {\n markHandled(state, ref);\n }\n }\n}\n\n/** Pass 1: collect every discriminator; patch the schemas of a discriminator + `oneOf`. */\nfunction collectDiscriminator(\n state: ScanState,\n value: Record<string, unknown>,\n path: (string | number)[],\n): void {\n const discriminator = value.discriminator as DiscriminatorObject | undefined;\n if (!discriminator?.propertyName) {\n return;\n }\n const discriminatorRef = appendPointer(ROOT_POINTER, path);\n state.objects[discriminatorRef] = discriminator;\n state.owners.add(discriminatorRef);\n if (!Array.isArray(value.oneOf)) {\n return;\n }\n const mapping = inferredMapping(value.oneOf);\n if (discriminator.mapping) {\n addDefinedMapping(mapping, discriminator.mapping);\n }\n patchMappedSchemas(state, mapping, { discriminator, discriminatorRef });\n}\n\n/** The mapping keys of `discriminator` that point at `ref`. */\nfunction valuesMappedTo(discriminator: DiscriminatorObject, ref: string): string[] {\n return Object.entries(discriminator.mapping ?? {})\n .filter(([, mappedRef]) => canonicalRef(mappedRef) === ref)\n .map(([mappedValue]) => mappedValue);\n}\n\n/**\n * Whether the schema at `ref` takes the discriminator of its `allOf` parent at `parentRef`. With\n * `allof-discriminated-union`, a schema that `allOf`s a discriminated union that does not contain\n * it is that union, not one of its members, so it gets no value of its own (#1464, #1690). A\n * schema that the union's mapping names is a member.\n */\nfunction inheritsDiscriminator(state: ScanState, parentRef: string, ref: string): boolean {\n if (!state.fixes.has(FIX.ALLOF_DISCRIMINATED_UNION)) {\n return true;\n }\n const resolve = (target: string) => resolveDocumentRef(state.schema, target, state);\n const union = unionAt(parentRef, resolve);\n return union === undefined || isUnionMember(union, ref, resolve);\n}\n\n/**\n * The schema at `ref` inherits `discriminator`. With `discriminator-values`, a schema that\n * defines a discriminator keeps it: the inherited one replaced its mapping, so the members walked\n * after this schema got their schema name instead of the mapped value (#2200). `ownerRef` is the\n * schema that declares the discriminator property, whose enum `--enum` values use (#1700).\n */\nfunction recordInherited(\n state: ScanState,\n ref: string,\n discriminator: DiscriminatorObject,\n ownerRef: string,\n): void {\n if (state.fixes.has(FIX.DISCRIMINATOR_VALUES) && state.owners.has(ref)) {\n return;\n }\n const inherited = { ...discriminator };\n state.objects[ref] = inherited;\n recordEnumParent(state, { discriminator, discriminatorRef: ownerRef }, inherited);\n}\n\n/**\n * An `allOf` item that is a `$ref` to a discriminator owner: the schema at `ref` inherits the\n * discriminator, and gets its enum when the parent's mapping names it. Returns false when the\n * `$ref` owns no discriminator, which ends the scan of this `allOf` (as in the original).\n */\nfunction inheritFromRef(state: ScanState, parentRef: string, ref: string): boolean {\n const discriminator = state.objects[parentRef];\n if (!discriminator) {\n return false;\n }\n const values = valuesMappedTo(discriminator, ref);\n const patch = { ref, values, discriminator, discriminatorRef: parentRef };\n if (values.length > 0 && patchDiscriminatorEnum(state, patch)) {\n markHandled(state, ref);\n }\n if (inheritsDiscriminator(state, parentRef, ref)) {\n recordInherited(state, ref, discriminator, parentRef);\n if (mergesValues(state)) {\n inheritOtherOwners(state, parentRef, ref);\n }\n }\n return true;\n}\n\n/** Pass 2: a schema whose `allOf` holds a discriminator, or a `$ref` to one, inherits it. */\nfunction inheritDiscriminators(\n state: ScanState,\n value: Record<string, unknown>,\n path: (string | number)[],\n): void {\n if (!Array.isArray(value.allOf)) {\n return;\n }\n for (const item of value.allOf as (SchemaObject | ReferenceObject)[]) {\n if (\"$ref\" in item) {\n if (!inheritFromRef(state, canonicalRef(item.$ref), appendPointer(ROOT_POINTER, path))) {\n return;\n }\n } else if (item.discriminator?.propertyName) {\n // The inline item is typed at the schema's own location.\n recordInherited(\n state,\n appendPointer(ROOT_POINTER, path),\n item.discriminator,\n appendPointer(ROOT_POINTER, path),\n );\n }\n }\n}\n\n/** The discriminators of a bundled document, after patching the mapped schemas in place. */\nexport interface DiscriminatorScan {\n objects: Record<string, DiscriminatorObject>;\n refsHandled: string[];\n /** With `discriminator-values`: the owner's enum of each enum the scan added. */\n enumParents: ReadonlyMap<object, EnumParent>;\n /** With `discriminator-values`: the properties of the other discriminators a schema inherits. */\n otherProperties: Readonly<Record<string, readonly string[]>>;\n}\n\n/**\n * With the fix: a schema-name value, only for a schema and property that no mapping gave a value.\n * Every enum patched so far came from a mapping, since schema-name values wait for this step.\n */\nfunction applyInferredPatches(state: ScanState): void {\n // A value that a schema declares itself came from a mapping as well.\n const mapped = new Set([...state.patchedEnums.keys(), ...state.declaredKeys]);\n for (const patch of state.inferredPatches) {\n if (!mapped.has(enumKey(patch)) && patchDiscriminatorEnum(state, patch)) {\n markHandled(state, patch.ref);\n }\n }\n applyOtherInferredPatches(state, mapped);\n}\n\n/** Find every discriminator in `schema`; warnings go to `logger` unless `silent`. */\nexport function findDiscriminators(\n schema: OpenAPI3,\n options: DiscriminatorScanOptions,\n): DiscriminatorScan {\n const state: ScanState = {\n ...options,\n schema,\n objects: {},\n owners: new Set(),\n refsHandled: [],\n patchedEnums: new Map(),\n inferredPatches: [],\n otherInferredPatches: [],\n otherProperties: {},\n declaredKeys: new Set(),\n enumParents: new Map(),\n };\n walkDocument(schema, (value, path) => collectDiscriminator(state, value, path));\n // A second pass, because an `allOf` may name a discriminator that is defined later.\n walkDocument(schema, (value, path) => inheritDiscriminators(state, value, path));\n applyInferredPatches(state);\n const { objects, refsHandled, enumParents, otherProperties } = state;\n return { objects, refsHandled, enumParents, otherProperties };\n}\n\n/**\n * Return a key–value map of discriminator objects found in a schema. Warnings go to `logger`;\n * without one, to the default terminal logger, as the original did.\n * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).\n */\nexport function scanDiscriminators(\n schema: OpenAPI3,\n options: GeneratorOptions,\n logger: Logger = defaultLogger(options.silent ?? false),\n): DiscriminatorScan {\n const silent = options.silent ?? false;\n return findDiscriminators(schema, { silent, logger, fixes: new Set() });\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,21 @@ const defaultPorts = require('./default-ports.cjs');
|
|
|
7
7
|
function isObject(value) {
|
|
8
8
|
return typeof value === "object" && value !== null;
|
|
9
9
|
}
|
|
10
|
+
function childOf(schema, node, key, options) {
|
|
11
|
+
if (!isObject(node)) {
|
|
12
|
+
return void 0;
|
|
13
|
+
}
|
|
14
|
+
const { visited = [] } = options;
|
|
15
|
+
const target = node.$ref;
|
|
16
|
+
if (node[key] || typeof target !== "string" || visited.includes(target)) {
|
|
17
|
+
return node[key];
|
|
18
|
+
}
|
|
19
|
+
const resolved = resolveDocumentRef(schema, target, {
|
|
20
|
+
...options,
|
|
21
|
+
visited: [...visited, target]
|
|
22
|
+
});
|
|
23
|
+
return isObject(resolved) ? resolved[key] : void 0;
|
|
24
|
+
}
|
|
10
25
|
function resolveDocumentRef(schema, $ref, options) {
|
|
11
26
|
const { visited = [] } = options;
|
|
12
27
|
const logger = options.logger ?? defaultPorts.defaultLogger(options.silent ?? false);
|
|
@@ -16,7 +31,7 @@ function resolveDocumentRef(schema, $ref, options) {
|
|
|
16
31
|
}
|
|
17
32
|
let node = schema;
|
|
18
33
|
for (const key of pointer) {
|
|
19
|
-
const child =
|
|
34
|
+
const child = childOf(schema, node, key, { ...options, logger });
|
|
20
35
|
if (!child) {
|
|
21
36
|
logger.warn(warnings.warningText(`Could not resolve $ref "${$ref}"`, warnings.WARNING_CODES.REF_NOT_FOUND));
|
|
22
37
|
return void 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-refs.cjs","sources":["../../src/api/document-refs.ts"],"sourcesContent":["import { parseRef } from \"@redocly/openapi-core/lib/ref-utils.js\";\nimport type { Logger } from \"../application/ports/logger.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport { defaultLogger } from \"./default-ports.js\";\n\n/** `$ref` resolution and the document walk that the generator's pre-pass uses. */\n\nexport interface ResolveRefOptions {\n silent: boolean;\n visited?: string[];\n /** @internal Where warnings go; the default terminal logger (respecting `silent`) if absent. */\n logger?: Logger;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\n/** Resolve a `$ref` in a document; warns and returns undefined when it cannot. */\nexport function resolveDocumentRef<T>(\n schema: unknown,\n $ref: string,\n options: ResolveRefOptions,\n): T | undefined {\n const { visited = [] } = options;\n const logger = options.logger ?? defaultLogger(options.silent ?? false);\n const { pointer } = parseRef($ref);\n if (!pointer.length) {\n return undefined;\n }\n let node: unknown = schema;\n for (const key of pointer) {\n const child =
|
|
1
|
+
{"version":3,"file":"document-refs.cjs","sources":["../../src/api/document-refs.ts"],"sourcesContent":["import { parseRef } from \"@redocly/openapi-core/lib/ref-utils.js\";\nimport type { Logger } from \"../application/ports/logger.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport { defaultLogger } from \"./default-ports.js\";\n\n/** `$ref` resolution and the document walk that the generator's pre-pass uses. */\n\nexport interface ResolveRefOptions {\n silent: boolean;\n visited?: string[];\n /** @internal Where warnings go; the default terminal logger (respecting `silent`) if absent. */\n logger?: Logger;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\n/**\n * The child of a node under a pointer key. A pointer may pass through a `$ref`\n * (`#/components/schemas/Wrap/properties/o/properties/v`, where `o` is a `$ref`): a key the node\n * does not have is read from the node's target, as the generated types index it (ADR-026). A key\n * the node has is read from it, so a pointer to a sibling of a `$ref` (OpenAPI 3.1) stays as\n * written.\n */\nfunction childOf(\n schema: unknown,\n node: unknown,\n key: string,\n options: ResolveRefOptions & { logger: Logger },\n): unknown {\n if (!isObject(node)) {\n return undefined;\n }\n const { visited = [] } = options;\n const target = node.$ref;\n if (node[key] || typeof target !== \"string\" || visited.includes(target)) {\n return node[key];\n }\n const resolved = resolveDocumentRef(schema, target, {\n ...options,\n visited: [...visited, target],\n });\n return isObject(resolved) ? resolved[key] : undefined;\n}\n\n/** Resolve a `$ref` in a document; warns and returns undefined when it cannot. */\nexport function resolveDocumentRef<T>(\n schema: unknown,\n $ref: string,\n options: ResolveRefOptions,\n): T | undefined {\n const { visited = [] } = options;\n const logger = options.logger ?? defaultLogger(options.silent ?? false);\n const { pointer } = parseRef($ref);\n if (!pointer.length) {\n return undefined;\n }\n let node: unknown = schema;\n for (const key of pointer) {\n const child = childOf(schema, node, key, { ...options, logger });\n if (!child) {\n logger.warn(warningText(`Could not resolve $ref \"${$ref}\"`, WARNING_CODES.REF_NOT_FOUND));\n return undefined;\n }\n node = child;\n }\n\n // if this is also a $ref, keep tracing\n const next = isObject(node) ? node.$ref : undefined;\n if (typeof next === \"string\" && next) {\n if (visited.includes(next)) {\n logger.warn(\n warningText(`Could not resolve circular $ref \"${$ref}\"`, WARNING_CODES.REF_CIRCULAR),\n );\n return undefined;\n }\n return resolveDocumentRef(schema, next, { ...options, logger, visited: [...visited, next] });\n }\n\n return node as T;\n}\n\n/** Call `cb` for every object in a JSON-serializable (non-circular) value, depth first. */\nexport function walkDocument(\n obj: unknown,\n cb: (value: Record<string, unknown>, path: (string | number)[]) => void,\n path: (string | number)[] = [],\n): void {\n if (!obj || typeof obj !== \"object\") {\n return;\n }\n if (Array.isArray(obj)) {\n for (let i = 0; i < obj.length; i++) {\n walkDocument(obj[i], cb, path.concat(i));\n }\n return;\n }\n cb(obj as Record<string, unknown>, path);\n for (const k of Object.keys(obj)) {\n walkDocument((obj as Record<string, unknown>)[k], cb, path.concat(k));\n }\n}\n"],"names":["defaultLogger","parseRef","warningText","WARNING_CODES"],"mappings":";;;;;;AAcA,SAAS,SAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA;AAChD;AASA,SAAS,OAAA,CACP,MAAA,EACA,IAAA,EACA,GAAA,EACA,OAAA,EACS;AACT,EAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,EAAG;AACnB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,EAAE,OAAA,GAAU,EAAC,EAAE,GAAI,OAAA;AACzB,EAAA,MAAM,SAAS,IAAA,CAAK,IAAA;AACpB,EAAA,IAAI,IAAA,CAAK,GAAG,CAAA,IAAK,OAAO,WAAW,QAAA,IAAY,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AACvE,IAAA,OAAO,KAAK,GAAG,CAAA;AAAA,EACjB;AACA,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,MAAA,EAAQ,MAAA,EAAQ;AAAA,IAClD,GAAG,OAAA;AAAA,IACH,OAAA,EAAS,CAAC,GAAG,OAAA,EAAS,MAAM;AAAA,GAC7B,CAAA;AACD,EAAA,OAAO,QAAA,CAAS,QAAQ,CAAA,GAAI,QAAA,CAAS,GAAG,CAAA,GAAI,MAAA;AAC9C;AAGO,SAAS,kBAAA,CACd,MAAA,EACA,IAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,EAAE,OAAA,GAAU,EAAC,EAAE,GAAI,OAAA;AACzB,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA,IAAUA,0BAAA,CAAc,OAAA,CAAQ,UAAU,KAAK,CAAA;AACtE,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAIC,oBAAA,CAAS,IAAI,CAAA;AACjC,EAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,IAAA,GAAgB,MAAA;AACpB,EAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,IAAA,MAAM,KAAA,GAAQ,QAAQ,MAAA,EAAQ,IAAA,EAAM,KAAK,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,CAAA;AAC/D,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAA,CAAO,KAAKC,oBAAA,CAAY,CAAA,wBAAA,EAA2B,IAAI,CAAA,CAAA,CAAA,EAAKC,sBAAA,CAAc,aAAa,CAAC,CAAA;AACxF,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,IAAA,GAAO,KAAA;AAAA,EACT;AAGA,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAI,CAAA,GAAI,KAAK,IAAA,GAAO,MAAA;AAC1C,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,EAAM;AACpC,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1B,MAAA,MAAA,CAAO,IAAA;AAAA,QACLD,oBAAA,CAAY,CAAA,iCAAA,EAAoC,IAAI,CAAA,CAAA,CAAA,EAAKC,uBAAc,YAAY;AAAA,OACrF;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAO,kBAAA,CAAmB,MAAA,EAAQ,IAAA,EAAM,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAS,CAAC,GAAG,OAAA,EAAS,IAAI,GAAG,CAAA;AAAA,EAC7F;AAEA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,YAAA,CACd,GAAA,EACA,EAAA,EACA,IAAA,GAA4B,EAAC,EACvB;AACN,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACnC,IAAA;AAAA,EACF;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,MAAA,YAAA,CAAa,IAAI,CAAC,CAAA,EAAG,IAAI,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,IACzC;AACA,IAAA;AAAA,EACF;AACA,EAAA,EAAA,CAAG,KAAgC,IAAI,CAAA;AACvC,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AAChC,IAAA,YAAA,CAAc,IAAgC,CAAC,CAAA,EAAG,IAAI,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,EACtE;AACF;;;"}
|
|
@@ -5,6 +5,21 @@ import { defaultLogger } from './default-ports.mjs';
|
|
|
5
5
|
function isObject(value) {
|
|
6
6
|
return typeof value === "object" && value !== null;
|
|
7
7
|
}
|
|
8
|
+
function childOf(schema, node, key, options) {
|
|
9
|
+
if (!isObject(node)) {
|
|
10
|
+
return void 0;
|
|
11
|
+
}
|
|
12
|
+
const { visited = [] } = options;
|
|
13
|
+
const target = node.$ref;
|
|
14
|
+
if (node[key] || typeof target !== "string" || visited.includes(target)) {
|
|
15
|
+
return node[key];
|
|
16
|
+
}
|
|
17
|
+
const resolved = resolveDocumentRef(schema, target, {
|
|
18
|
+
...options,
|
|
19
|
+
visited: [...visited, target]
|
|
20
|
+
});
|
|
21
|
+
return isObject(resolved) ? resolved[key] : void 0;
|
|
22
|
+
}
|
|
8
23
|
function resolveDocumentRef(schema, $ref, options) {
|
|
9
24
|
const { visited = [] } = options;
|
|
10
25
|
const logger = options.logger ?? defaultLogger(options.silent ?? false);
|
|
@@ -14,7 +29,7 @@ function resolveDocumentRef(schema, $ref, options) {
|
|
|
14
29
|
}
|
|
15
30
|
let node = schema;
|
|
16
31
|
for (const key of pointer) {
|
|
17
|
-
const child =
|
|
32
|
+
const child = childOf(schema, node, key, { ...options, logger });
|
|
18
33
|
if (!child) {
|
|
19
34
|
logger.warn(warningText(`Could not resolve $ref "${$ref}"`, WARNING_CODES.REF_NOT_FOUND));
|
|
20
35
|
return void 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-refs.mjs","sources":["../../src/api/document-refs.ts"],"sourcesContent":["import { parseRef } from \"@redocly/openapi-core/lib/ref-utils.js\";\nimport type { Logger } from \"../application/ports/logger.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport { defaultLogger } from \"./default-ports.js\";\n\n/** `$ref` resolution and the document walk that the generator's pre-pass uses. */\n\nexport interface ResolveRefOptions {\n silent: boolean;\n visited?: string[];\n /** @internal Where warnings go; the default terminal logger (respecting `silent`) if absent. */\n logger?: Logger;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\n/** Resolve a `$ref` in a document; warns and returns undefined when it cannot. */\nexport function resolveDocumentRef<T>(\n schema: unknown,\n $ref: string,\n options: ResolveRefOptions,\n): T | undefined {\n const { visited = [] } = options;\n const logger = options.logger ?? defaultLogger(options.silent ?? false);\n const { pointer } = parseRef($ref);\n if (!pointer.length) {\n return undefined;\n }\n let node: unknown = schema;\n for (const key of pointer) {\n const child =
|
|
1
|
+
{"version":3,"file":"document-refs.mjs","sources":["../../src/api/document-refs.ts"],"sourcesContent":["import { parseRef } from \"@redocly/openapi-core/lib/ref-utils.js\";\nimport type { Logger } from \"../application/ports/logger.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport { defaultLogger } from \"./default-ports.js\";\n\n/** `$ref` resolution and the document walk that the generator's pre-pass uses. */\n\nexport interface ResolveRefOptions {\n silent: boolean;\n visited?: string[];\n /** @internal Where warnings go; the default terminal logger (respecting `silent`) if absent. */\n logger?: Logger;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\n/**\n * The child of a node under a pointer key. A pointer may pass through a `$ref`\n * (`#/components/schemas/Wrap/properties/o/properties/v`, where `o` is a `$ref`): a key the node\n * does not have is read from the node's target, as the generated types index it (ADR-026). A key\n * the node has is read from it, so a pointer to a sibling of a `$ref` (OpenAPI 3.1) stays as\n * written.\n */\nfunction childOf(\n schema: unknown,\n node: unknown,\n key: string,\n options: ResolveRefOptions & { logger: Logger },\n): unknown {\n if (!isObject(node)) {\n return undefined;\n }\n const { visited = [] } = options;\n const target = node.$ref;\n if (node[key] || typeof target !== \"string\" || visited.includes(target)) {\n return node[key];\n }\n const resolved = resolveDocumentRef(schema, target, {\n ...options,\n visited: [...visited, target],\n });\n return isObject(resolved) ? resolved[key] : undefined;\n}\n\n/** Resolve a `$ref` in a document; warns and returns undefined when it cannot. */\nexport function resolveDocumentRef<T>(\n schema: unknown,\n $ref: string,\n options: ResolveRefOptions,\n): T | undefined {\n const { visited = [] } = options;\n const logger = options.logger ?? defaultLogger(options.silent ?? false);\n const { pointer } = parseRef($ref);\n if (!pointer.length) {\n return undefined;\n }\n let node: unknown = schema;\n for (const key of pointer) {\n const child = childOf(schema, node, key, { ...options, logger });\n if (!child) {\n logger.warn(warningText(`Could not resolve $ref \"${$ref}\"`, WARNING_CODES.REF_NOT_FOUND));\n return undefined;\n }\n node = child;\n }\n\n // if this is also a $ref, keep tracing\n const next = isObject(node) ? node.$ref : undefined;\n if (typeof next === \"string\" && next) {\n if (visited.includes(next)) {\n logger.warn(\n warningText(`Could not resolve circular $ref \"${$ref}\"`, WARNING_CODES.REF_CIRCULAR),\n );\n return undefined;\n }\n return resolveDocumentRef(schema, next, { ...options, logger, visited: [...visited, next] });\n }\n\n return node as T;\n}\n\n/** Call `cb` for every object in a JSON-serializable (non-circular) value, depth first. */\nexport function walkDocument(\n obj: unknown,\n cb: (value: Record<string, unknown>, path: (string | number)[]) => void,\n path: (string | number)[] = [],\n): void {\n if (!obj || typeof obj !== \"object\") {\n return;\n }\n if (Array.isArray(obj)) {\n for (let i = 0; i < obj.length; i++) {\n walkDocument(obj[i], cb, path.concat(i));\n }\n return;\n }\n cb(obj as Record<string, unknown>, path);\n for (const k of Object.keys(obj)) {\n walkDocument((obj as Record<string, unknown>)[k], cb, path.concat(k));\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ const discriminatorConflictWarnings = require('./discriminator-conflict-warnings
|
|
|
11
11
|
const discriminatorScan = require('./discriminator-scan.cjs');
|
|
12
12
|
const documentRefs = require('./document-refs.cjs');
|
|
13
13
|
const pathTemplateWarnings = require('./path-template-warnings.cjs');
|
|
14
|
+
const refLimitOptions = require('./ref-limit-options.cjs');
|
|
14
15
|
const unsupportedFeatureWarnings = require('./unsupported-feature-warnings.cjs');
|
|
15
16
|
|
|
16
17
|
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
|
|
@@ -25,14 +26,6 @@ function sourceCwd(options) {
|
|
|
25
26
|
const directory = path__default.resolve(cwd === void 0 ? defaultPorts.processCwd() : cwd.toString());
|
|
26
27
|
return node_url.pathToFileURL(path__default.join(directory, path__default.sep));
|
|
27
28
|
}
|
|
28
|
-
function refAccessOf(options, cwd) {
|
|
29
|
-
const { localRefRoot, remoteRefHosts } = options;
|
|
30
|
-
const localRoot = typeof localRefRoot === "string" ? node_url.pathToFileURL(path__default.resolve(node_url.fileURLToPath(cwd), localRefRoot)) : localRefRoot;
|
|
31
|
-
return {
|
|
32
|
-
...localRoot === void 0 ? {} : { localRoot },
|
|
33
|
-
...remoteRefHosts === void 0 ? {} : { remoteHosts: remoteRefHosts }
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
29
|
function callbackOptions(options) {
|
|
37
30
|
return {
|
|
38
31
|
irCallbacks: options.irCallbacks === true,
|
|
@@ -71,7 +64,8 @@ function contextFlags(options) {
|
|
|
71
64
|
}
|
|
72
65
|
function outputFixesOf(options, logger) {
|
|
73
66
|
const names = outputFixes.outputFixNamesOf(options.fix ?? []);
|
|
74
|
-
|
|
67
|
+
const flags = contextFlags(options);
|
|
68
|
+
for (const notice of outputFixes.ineffectiveFixNotices(names, (option) => flags[option])) {
|
|
75
69
|
logger.warn(warnings.warningText(notice, warnings.WARNING_CODES.FIX_NEEDS_OPTION));
|
|
76
70
|
}
|
|
77
71
|
return [...outputFixes.resolveOutputFixes(names)];
|
|
@@ -92,11 +86,11 @@ async function createDocumentRun(source, options, ports) {
|
|
|
92
86
|
const fix = outputFixesOf(options, logger);
|
|
93
87
|
const silent = options.silent ?? false;
|
|
94
88
|
const cwd = sourceCwd(options);
|
|
95
|
-
const schema = await ports.loader.load({
|
|
89
|
+
const { document: schema, localFiles } = await ports.loader.load({
|
|
96
90
|
source,
|
|
97
91
|
cwd,
|
|
98
92
|
shouldLint: options.lint ?? true,
|
|
99
|
-
refAccess: refAccessOf(options, cwd)
|
|
93
|
+
refAccess: refLimitOptions.refAccessOf(options, cwd)
|
|
100
94
|
});
|
|
101
95
|
warnAboutDocument(schema, fix, logger);
|
|
102
96
|
const ctx = {
|
|
@@ -118,7 +112,7 @@ async function createDocumentRun(source, options, ports) {
|
|
|
118
112
|
logger,
|
|
119
113
|
deprecations: ports.deprecations
|
|
120
114
|
};
|
|
121
|
-
return { schema, ctx };
|
|
115
|
+
return { schema, localFiles, ctx };
|
|
122
116
|
}
|
|
123
117
|
|
|
124
118
|
exports.createDocumentRun = createDocumentRun;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-run.cjs","sources":["../../src/api/document-run.ts"],"sourcesContent":["import path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport type { Config as RedoclyConfig } from \"@redocly/openapi-core\";\nimport { sourceEmptyError } from \"../adapters/redocly-loader/schema-load-errors.js\";\nimport type { DeprecationReporter } from \"../application/ports/deprecation-reporter.js\";\nimport type { Logger } from \"../application/ports/logger.js\";\nimport type { RefAccess, SchemaLoader } from \"../application/ports/schema-loader.js\";\nimport { withStackOverflowReported } from \"../application/stack-overflow.js\";\nimport {\n ineffectiveFixNotices,\n type OutputFix,\n outputFixNamesOf,\n resolveOutputFixes,\n} from \"../domain/output-fixes.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport type { GeneratorOptions, OpenAPI3, SchemaSource } from \"../types.js\";\nimport { processCwd } from \"./default-ports.js\";\nimport { warnDiscriminatorValueConflicts } from \"./discriminator-conflict-warnings.js\";\nimport { findDiscriminators } from \"./discriminator-scan.js\";\nimport { resolveDocumentRef } from \"./document-refs.js\";\nimport { warnIdenticalPathTemplates } from \"./path-template-warnings.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { warnUnsupportedFeatures } from \"./unsupported-feature-warnings.js\";\n\n/** The ports of one generator run, wired by the Node API or the CLI (ENGINEERING_PLAN 4.5). */\nexport interface GeneratorPorts {\n readonly loader: SchemaLoader;\n readonly logger: Logger;\n /** Where the run reports the deprecated callback forms (ADR-004). */\n readonly deprecations: DeprecationReporter;\n /** The Redocly config the loader uses; the run's context exposes it as `ctx.redoc`. */\n readonly redoc: RedoclyConfig;\n /** A monotonic time in milliseconds, for debug durations. */\n readonly now: () => number;\n}\n\n/** A validated, bundled document and the context of one generator run. */\nexport interface DocumentRun {\n readonly schema: OpenAPI3;\n readonly ctx: RunContext;\n}\n\n/** The context fields that are user flags, with the original defaults. */\ntype ContextFlags = Omit<\n RunContext,\n | \"discriminators\"\n | \"injectFooter\"\n | \"redoc\"\n | \"resolve\"\n | \"runFooter\"\n | \"legacyCallbackWarnings\"\n | \"logger\"\n | \"deprecations\"\n | \"fix\"\n>;\n\n/**\n * The directory that relative `$ref`s of an inline source resolve against, as a URL that ends in\n * a slash. A path is resolved and encoded (`#`, `%`, spaces); a URL without the slash gets one.\n */\nfunction sourceCwd(options: GeneratorOptions): URL {\n const { cwd } = options;\n if (cwd instanceof URL) {\n return cwd.pathname.endsWith(\"/\") ? cwd : new URL(`${cwd.pathname}/`, cwd);\n }\n const directory = path.resolve(cwd === undefined ? processCwd() : cwd.toString());\n return pathToFileURL(path.join(directory, path.sep));\n}\n\n/** The `$ref` limits of the options; a relative local root resolves against the cwd. */\nfunction refAccessOf(options: GeneratorOptions, cwd: URL): RefAccess {\n const { localRefRoot, remoteRefHosts } = options;\n const localRoot =\n typeof localRefRoot === \"string\"\n ? pathToFileURL(path.resolve(fileURLToPath(cwd), localRefRoot))\n : localRefRoot;\n return {\n ...(localRoot === undefined ? {} : { localRoot }),\n ...(remoteRefHosts === undefined ? {} : { remoteHosts: remoteRefHosts }),\n };\n}\n\nfunction callbackOptions(options: GeneratorOptions) {\n return {\n irCallbacks: options.irCallbacks === true,\n postTransform: typeof options.postTransform === \"function\" ? options.postTransform : undefined,\n transform: typeof options.transform === \"function\" ? options.transform : undefined,\n transformProperty:\n typeof options.transformProperty === \"function\" ? options.transformProperty : undefined,\n };\n}\n\nfunction contextFlags(options: GeneratorOptions): ContextFlags {\n return {\n additionalProperties: options.additionalProperties ?? false,\n alphabetize: options.alphabetize ?? false,\n arrayLength: options.arrayLength ?? false,\n binaryAsBlob: options.binaryAsBlob ?? false,\n defaultNonNullable: options.defaultNonNullable ?? true,\n emptyObjectsUnknown: options.emptyObjectsUnknown ?? false,\n enum: options.enum ?? false,\n enumValues: options.enumValues ?? false,\n conditionalEnums: options.conditionalEnums ?? false,\n dedupeEnums: options.dedupeEnums ?? false,\n excludeDeprecated: options.excludeDeprecated ?? false,\n exportType: options.exportType ?? false,\n immutable: options.immutable ?? false,\n rootTypes: options.rootTypes ?? false,\n rootTypesNoSchemaPrefix: options.rootTypesNoSchemaPrefix ?? false,\n rootTypesKeepCasing: options.rootTypesKeepCasing ?? false,\n pathParamsAsTypes: options.pathParamsAsTypes ?? false,\n propertiesRequiredByDefault: options.propertiesRequiredByDefault ?? false,\n silent: options.silent ?? false,\n ...(options.inject === undefined ? {} : { inject: options.inject }),\n makePathsEnum: options.makePathsEnum ?? false,\n generatePathParams: options.generatePathParams ?? false,\n readWriteMarkers: options.readWriteMarkers ?? false,\n ...callbackOptions(options),\n };\n}\n\n/**\n * The fixes of the options, `all` expanded; fails with `OPTION_FIX_UNKNOWN` for another name.\n * A fix named without the option it needs is reported, since it changes nothing.\n */\nfunction outputFixesOf(options: GeneratorOptions, logger: Logger): readonly OutputFix[] {\n const names = outputFixNamesOf(options.fix ?? []);\n for (const notice of ineffectiveFixNotices(names, (option) => options[option] === true)) {\n logger.warn(warningText(notice, WARNING_CODES.FIX_NEEDS_OPTION));\n }\n return [...resolveOutputFixes(names)];\n}\n\n/** The warnings about the loaded document itself, before it is transformed. */\nfunction warnAboutDocument(schema: OpenAPI3, fix: readonly OutputFix[], logger: Logger): void {\n withStackOverflowReported(\"transform\", () => warnUnsupportedFeatures(schema, logger));\n withStackOverflowReported(\"transform\", () =>\n warnDiscriminatorValueConflicts(schema, fix, logger),\n );\n warnIdenticalPathTemplates(schema, logger);\n}\n\n/**\n * Load the source through the ports, then build the run's context from the options. The fix names\n * are checked first, so a typo fails before the document is read.\n */\nexport async function createDocumentRun(\n source: SchemaSource,\n options: GeneratorOptions,\n ports: GeneratorPorts,\n): Promise<DocumentRun> {\n if (!source) {\n throw sourceEmptyError(\"Empty schema. Please specify a URL, file path, or Redocly Config\");\n }\n const { logger } = ports;\n const fix = outputFixesOf(options, logger);\n const silent = options.silent ?? false;\n const cwd = sourceCwd(options);\n const schema = await ports.loader.load({\n source,\n cwd,\n shouldLint: options.lint ?? true,\n refAccess: refAccessOf(options, cwd),\n });\n warnAboutDocument(schema, fix, logger);\n const ctx: RunContext = {\n ...contextFlags(options),\n fix,\n // The scan walks every schema before the transform does, so on a larger stack, where loading\n // passed, it is the first step to run out.\n discriminators: withStackOverflowReported(\"transform\", () =>\n findDiscriminators(schema, {\n silent,\n logger,\n fixes: new Set(fix),\n }),\n ),\n injectFooter: [],\n redoc: ports.redoc,\n resolve: ($ref) => resolveDocumentRef(schema, $ref, { silent, logger }),\n logger,\n deprecations: ports.deprecations,\n };\n return { schema, ctx };\n}\n"],"names":["path","processCwd","pathToFileURL","fileURLToPath","outputFixNamesOf","ineffectiveFixNotices","warningText","WARNING_CODES","resolveOutputFixes","withStackOverflowReported","warnUnsupportedFeatures","warnDiscriminatorValueConflicts","warnIdenticalPathTemplates","sourceEmptyError","findDiscriminators","resolveDocumentRef"],"mappings":";;;;;;;;;;;;;;;;;;;AA4DA,SAAS,UAAU,OAAA,EAAgC;AACjD,EAAA,MAAM,EAAE,KAAI,GAAI,OAAA;AAChB,EAAA,IAAI,eAAe,GAAA,EAAK;AACtB,IAAA,OAAO,GAAA,CAAI,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,GAAI,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,EAAG,GAAA,CAAI,QAAQ,CAAA,CAAA,CAAA,EAAK,GAAG,CAAA;AAAA,EAC3E;AACA,EAAA,MAAM,SAAA,GAAYA,cAAK,OAAA,CAAQ,GAAA,KAAQ,SAAYC,uBAAA,EAAW,GAAI,GAAA,CAAI,QAAA,EAAU,CAAA;AAChF,EAAA,OAAOC,uBAAcF,aAAA,CAAK,IAAA,CAAK,SAAA,EAAWA,aAAA,CAAK,GAAG,CAAC,CAAA;AACrD;AAGA,SAAS,WAAA,CAAY,SAA2B,GAAA,EAAqB;AACnE,EAAA,MAAM,EAAE,YAAA,EAAc,cAAA,EAAe,GAAI,OAAA;AACzC,EAAA,MAAM,SAAA,GACJ,OAAO,YAAA,KAAiB,QAAA,GACpBE,sBAAA,CAAcF,aAAA,CAAK,OAAA,CAAQG,sBAAA,CAAc,GAAG,CAAA,EAAG,YAAY,CAAC,CAAA,GAC5D,YAAA;AACN,EAAA,OAAO;AAAA,IACL,GAAI,SAAA,KAAc,MAAA,GAAY,EAAC,GAAI,EAAE,SAAA,EAAU;AAAA,IAC/C,GAAI,cAAA,KAAmB,MAAA,GAAY,EAAC,GAAI,EAAE,aAAa,cAAA;AAAe,GACxE;AACF;AAEA,SAAS,gBAAgB,OAAA,EAA2B;AAClD,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,QAAQ,WAAA,KAAgB,IAAA;AAAA,IACrC,eAAe,OAAO,OAAA,CAAQ,aAAA,KAAkB,UAAA,GAAa,QAAQ,aAAA,GAAgB,MAAA;AAAA,IACrF,WAAW,OAAO,OAAA,CAAQ,SAAA,KAAc,UAAA,GAAa,QAAQ,SAAA,GAAY,MAAA;AAAA,IACzE,mBACE,OAAO,OAAA,CAAQ,iBAAA,KAAsB,UAAA,GAAa,QAAQ,iBAAA,GAAoB;AAAA,GAClF;AACF;AAEA,SAAS,aAAa,OAAA,EAAyC;AAC7D,EAAA,OAAO;AAAA,IACL,oBAAA,EAAsB,QAAQ,oBAAA,IAAwB,KAAA;AAAA,IACtD,WAAA,EAAa,QAAQ,WAAA,IAAe,KAAA;AAAA,IACpC,WAAA,EAAa,QAAQ,WAAA,IAAe,KAAA;AAAA,IACpC,YAAA,EAAc,QAAQ,YAAA,IAAgB,KAAA;AAAA,IACtC,kBAAA,EAAoB,QAAQ,kBAAA,IAAsB,IAAA;AAAA,IAClD,mBAAA,EAAqB,QAAQ,mBAAA,IAAuB,KAAA;AAAA,IACpD,IAAA,EAAM,QAAQ,IAAA,IAAQ,KAAA;AAAA,IACtB,UAAA,EAAY,QAAQ,UAAA,IAAc,KAAA;AAAA,IAClC,gBAAA,EAAkB,QAAQ,gBAAA,IAAoB,KAAA;AAAA,IAC9C,WAAA,EAAa,QAAQ,WAAA,IAAe,KAAA;AAAA,IACpC,iBAAA,EAAmB,QAAQ,iBAAA,IAAqB,KAAA;AAAA,IAChD,UAAA,EAAY,QAAQ,UAAA,IAAc,KAAA;AAAA,IAClC,SAAA,EAAW,QAAQ,SAAA,IAAa,KAAA;AAAA,IAChC,SAAA,EAAW,QAAQ,SAAA,IAAa,KAAA;AAAA,IAChC,uBAAA,EAAyB,QAAQ,uBAAA,IAA2B,KAAA;AAAA,IAC5D,mBAAA,EAAqB,QAAQ,mBAAA,IAAuB,KAAA;AAAA,IACpD,iBAAA,EAAmB,QAAQ,iBAAA,IAAqB,KAAA;AAAA,IAChD,2BAAA,EAA6B,QAAQ,2BAAA,IAA+B,KAAA;AAAA,IACpE,MAAA,EAAQ,QAAQ,MAAA,IAAU,KAAA;AAAA,IAC1B,GAAI,QAAQ,MAAA,KAAW,MAAA,GAAY,EAAC,GAAI,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO;AAAA,IACjE,aAAA,EAAe,QAAQ,aAAA,IAAiB,KAAA;AAAA,IACxC,kBAAA,EAAoB,QAAQ,kBAAA,IAAsB,KAAA;AAAA,IAClD,gBAAA,EAAkB,QAAQ,gBAAA,IAAoB,KAAA;AAAA,IAC9C,GAAG,gBAAgB,OAAO;AAAA,GAC5B;AACF;AAMA,SAAS,aAAA,CAAc,SAA2B,MAAA,EAAsC;AACtF,EAAA,MAAM,KAAA,GAAQC,4BAAA,CAAiB,OAAA,CAAQ,GAAA,IAAO,EAAE,CAAA;AAChD,EAAA,KAAA,MAAW,MAAA,IAAUC,kCAAsB,KAAA,EAAO,CAAC,WAAW,OAAA,CAAQ,MAAM,CAAA,KAAM,IAAI,CAAA,EAAG;AACvF,IAAA,MAAA,CAAO,IAAA,CAAKC,oBAAA,CAAY,MAAA,EAAQC,sBAAA,CAAc,gBAAgB,CAAC,CAAA;AAAA,EACjE;AACA,EAAA,OAAO,CAAC,GAAGC,8BAAA,CAAmB,KAAK,CAAC,CAAA;AACtC;AAGA,SAAS,iBAAA,CAAkB,MAAA,EAAkB,GAAA,EAA2B,MAAA,EAAsB;AAC5F,EAAAC,uCAAA,CAA0B,WAAA,EAAa,MAAMC,kDAAA,CAAwB,MAAA,EAAQ,MAAM,CAAC,CAAA;AACpF,EAAAD,uCAAA;AAAA,IAA0B,WAAA;AAAA,IAAa,MACrCE,6DAAA,CAAgC,MAAA,EAAQ,GAAA,EAAK,MAAM;AAAA,GACrD;AACA,EAAAC,+CAAA,CAA2B,QAAQ,MAAM,CAAA;AAC3C;AAMA,eAAsB,iBAAA,CACpB,MAAA,EACA,OAAA,EACA,KAAA,EACsB;AACtB,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAMC,kCAAiB,kEAAkE,CAAA;AAAA,EAC3F;AACA,EAAA,MAAM,EAAE,QAAO,GAAI,KAAA;AACnB,EAAA,MAAM,GAAA,GAAM,aAAA,CAAc,OAAA,EAAS,MAAM,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,KAAA;AACjC,EAAA,MAAM,GAAA,GAAM,UAAU,OAAO,CAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK;AAAA,IACrC,MAAA;AAAA,IACA,GAAA;AAAA,IACA,UAAA,EAAY,QAAQ,IAAA,IAAQ,IAAA;AAAA,IAC5B,SAAA,EAAW,WAAA,CAAY,OAAA,EAAS,GAAG;AAAA,GACpC,CAAA;AACD,EAAA,iBAAA,CAAkB,MAAA,EAAQ,KAAK,MAAM,CAAA;AACrC,EAAA,MAAM,GAAA,GAAkB;AAAA,IACtB,GAAG,aAAa,OAAO,CAAA;AAAA,IACvB,GAAA;AAAA;AAAA;AAAA,IAGA,cAAA,EAAgBJ,uCAAA;AAAA,MAA0B,WAAA;AAAA,MAAa,MACrDK,qCAAmB,MAAA,EAAQ;AAAA,QACzB,MAAA;AAAA,QACA,MAAA;AAAA,QACA,KAAA,EAAO,IAAI,GAAA,CAAI,GAAG;AAAA,OACnB;AAAA,KACH;AAAA,IACA,cAAc,EAAC;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,OAAA,EAAS,CAAC,IAAA,KAASC,+BAAA,CAAmB,QAAQ,IAAA,EAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAAA,IACtE,MAAA;AAAA,IACA,cAAc,KAAA,CAAM;AAAA,GACtB;AACA,EAAA,OAAO,EAAE,QAAQ,GAAA,EAAI;AACvB;;"}
|
|
1
|
+
{"version":3,"file":"document-run.cjs","sources":["../../src/api/document-run.ts"],"sourcesContent":["import path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { Config as RedoclyConfig } from \"@redocly/openapi-core\";\nimport { sourceEmptyError } from \"../adapters/redocly-loader/schema-load-errors.js\";\nimport type { DeprecationReporter } from \"../application/ports/deprecation-reporter.js\";\nimport type { Logger } from \"../application/ports/logger.js\";\nimport type { SchemaLoader } from \"../application/ports/schema-loader.js\";\nimport { withStackOverflowReported } from \"../application/stack-overflow.js\";\nimport {\n ineffectiveFixNotices,\n type OutputFix,\n outputFixNamesOf,\n resolveOutputFixes,\n} from \"../domain/output-fixes.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport type { GeneratorOptions, OpenAPI3, SchemaSource } from \"../types.js\";\nimport { processCwd } from \"./default-ports.js\";\nimport { warnDiscriminatorValueConflicts } from \"./discriminator-conflict-warnings.js\";\nimport { findDiscriminators } from \"./discriminator-scan.js\";\nimport { resolveDocumentRef } from \"./document-refs.js\";\nimport { warnIdenticalPathTemplates } from \"./path-template-warnings.js\";\nimport { refAccessOf } from \"./ref-limit-options.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { warnUnsupportedFeatures } from \"./unsupported-feature-warnings.js\";\n\n/** The ports of one generator run, wired by the Node API or the CLI (ENGINEERING_PLAN 4.5). */\nexport interface GeneratorPorts {\n readonly loader: SchemaLoader;\n readonly logger: Logger;\n /** Where the run reports the deprecated callback forms (ADR-004). */\n readonly deprecations: DeprecationReporter;\n /** The Redocly config the loader uses; the run's context exposes it as `ctx.redoc`. */\n readonly redoc: RedoclyConfig;\n /** A monotonic time in milliseconds, for debug durations. */\n readonly now: () => number;\n}\n\n/** A validated, bundled document, the local files it was read from, and the run's context. */\nexport interface DocumentRun {\n readonly schema: OpenAPI3;\n readonly localFiles: readonly URL[];\n readonly ctx: RunContext;\n}\n\n/** The context fields that are user flags, with the original defaults. */\ntype ContextFlags = Omit<\n RunContext,\n | \"discriminators\"\n | \"injectFooter\"\n | \"redoc\"\n | \"resolve\"\n | \"runFooter\"\n | \"legacyCallbackWarnings\"\n | \"logger\"\n | \"deprecations\"\n | \"fix\"\n>;\n\n/**\n * The directory that relative `$ref`s of an inline source resolve against, as a URL that ends in\n * a slash. A path is resolved and encoded (`#`, `%`, spaces); a URL without the slash gets one.\n */\nfunction sourceCwd(options: GeneratorOptions): URL {\n const { cwd } = options;\n if (cwd instanceof URL) {\n return cwd.pathname.endsWith(\"/\") ? cwd : new URL(`${cwd.pathname}/`, cwd);\n }\n const directory = path.resolve(cwd === undefined ? processCwd() : cwd.toString());\n return pathToFileURL(path.join(directory, path.sep));\n}\n\nfunction callbackOptions(options: GeneratorOptions) {\n return {\n irCallbacks: options.irCallbacks === true,\n postTransform: typeof options.postTransform === \"function\" ? options.postTransform : undefined,\n transform: typeof options.transform === \"function\" ? options.transform : undefined,\n transformProperty:\n typeof options.transformProperty === \"function\" ? options.transformProperty : undefined,\n };\n}\n\nfunction contextFlags(options: GeneratorOptions): ContextFlags {\n return {\n additionalProperties: options.additionalProperties ?? false,\n alphabetize: options.alphabetize ?? false,\n arrayLength: options.arrayLength ?? false,\n binaryAsBlob: options.binaryAsBlob ?? false,\n defaultNonNullable: options.defaultNonNullable ?? true,\n emptyObjectsUnknown: options.emptyObjectsUnknown ?? false,\n enum: options.enum ?? false,\n enumValues: options.enumValues ?? false,\n conditionalEnums: options.conditionalEnums ?? false,\n dedupeEnums: options.dedupeEnums ?? false,\n excludeDeprecated: options.excludeDeprecated ?? false,\n exportType: options.exportType ?? false,\n immutable: options.immutable ?? false,\n rootTypes: options.rootTypes ?? false,\n rootTypesNoSchemaPrefix: options.rootTypesNoSchemaPrefix ?? false,\n rootTypesKeepCasing: options.rootTypesKeepCasing ?? false,\n pathParamsAsTypes: options.pathParamsAsTypes ?? false,\n propertiesRequiredByDefault: options.propertiesRequiredByDefault ?? false,\n silent: options.silent ?? false,\n ...(options.inject === undefined ? {} : { inject: options.inject }),\n makePathsEnum: options.makePathsEnum ?? false,\n generatePathParams: options.generatePathParams ?? false,\n readWriteMarkers: options.readWriteMarkers ?? false,\n ...callbackOptions(options),\n };\n}\n\n/**\n * The fixes of the options, `all` expanded; fails with `OPTION_FIX_UNKNOWN` for another name.\n * A fix named without the option it needs is reported, since it changes nothing.\n */\nfunction outputFixesOf(options: GeneratorOptions, logger: Logger): readonly OutputFix[] {\n const names = outputFixNamesOf(options.fix ?? []);\n // The options with their defaults: `defaultNonNullable` is on unless set to false.\n const flags = contextFlags(options);\n for (const notice of ineffectiveFixNotices(names, (option) => flags[option])) {\n logger.warn(warningText(notice, WARNING_CODES.FIX_NEEDS_OPTION));\n }\n return [...resolveOutputFixes(names)];\n}\n\n/** The warnings about the loaded document itself, before it is transformed. */\nfunction warnAboutDocument(schema: OpenAPI3, fix: readonly OutputFix[], logger: Logger): void {\n withStackOverflowReported(\"transform\", () => warnUnsupportedFeatures(schema, logger));\n withStackOverflowReported(\"transform\", () =>\n warnDiscriminatorValueConflicts(schema, fix, logger),\n );\n warnIdenticalPathTemplates(schema, logger);\n}\n\n/**\n * Load the source through the ports, then build the run's context from the options. The fix names\n * are checked first, so a typo fails before the document is read.\n */\nexport async function createDocumentRun(\n source: SchemaSource,\n options: GeneratorOptions,\n ports: GeneratorPorts,\n): Promise<DocumentRun> {\n if (!source) {\n throw sourceEmptyError(\"Empty schema. Please specify a URL, file path, or Redocly Config\");\n }\n const { logger } = ports;\n const fix = outputFixesOf(options, logger);\n const silent = options.silent ?? false;\n const cwd = sourceCwd(options);\n const { document: schema, localFiles } = await ports.loader.load({\n source,\n cwd,\n shouldLint: options.lint ?? true,\n refAccess: refAccessOf(options, cwd),\n });\n warnAboutDocument(schema, fix, logger);\n const ctx: RunContext = {\n ...contextFlags(options),\n fix,\n // The scan walks every schema before the transform does, so on a larger stack, where loading\n // passed, it is the first step to run out.\n discriminators: withStackOverflowReported(\"transform\", () =>\n findDiscriminators(schema, {\n silent,\n logger,\n fixes: new Set(fix),\n }),\n ),\n injectFooter: [],\n redoc: ports.redoc,\n resolve: ($ref) => resolveDocumentRef(schema, $ref, { silent, logger }),\n logger,\n deprecations: ports.deprecations,\n };\n return { schema, localFiles, ctx };\n}\n"],"names":["path","processCwd","pathToFileURL","outputFixNamesOf","ineffectiveFixNotices","warningText","WARNING_CODES","resolveOutputFixes","withStackOverflowReported","warnUnsupportedFeatures","warnDiscriminatorValueConflicts","warnIdenticalPathTemplates","sourceEmptyError","refAccessOf","findDiscriminators","resolveDocumentRef"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
|
-
import { pathToFileURL
|
|
2
|
+
import { pathToFileURL } from 'node:url';
|
|
3
3
|
import { sourceEmptyError } from '../adapters/redocly-loader/schema-load-errors.mjs';
|
|
4
4
|
import { withStackOverflowReported } from '../application/stack-overflow.mjs';
|
|
5
5
|
import { outputFixNamesOf, ineffectiveFixNotices, resolveOutputFixes } from '../domain/output-fixes.mjs';
|
|
@@ -9,6 +9,7 @@ import { warnDiscriminatorValueConflicts } from './discriminator-conflict-warnin
|
|
|
9
9
|
import { findDiscriminators } from './discriminator-scan.mjs';
|
|
10
10
|
import { resolveDocumentRef } from './document-refs.mjs';
|
|
11
11
|
import { warnIdenticalPathTemplates } from './path-template-warnings.mjs';
|
|
12
|
+
import { refAccessOf } from './ref-limit-options.mjs';
|
|
12
13
|
import { warnUnsupportedFeatures } from './unsupported-feature-warnings.mjs';
|
|
13
14
|
|
|
14
15
|
function sourceCwd(options) {
|
|
@@ -19,14 +20,6 @@ function sourceCwd(options) {
|
|
|
19
20
|
const directory = path.resolve(cwd === void 0 ? processCwd() : cwd.toString());
|
|
20
21
|
return pathToFileURL(path.join(directory, path.sep));
|
|
21
22
|
}
|
|
22
|
-
function refAccessOf(options, cwd) {
|
|
23
|
-
const { localRefRoot, remoteRefHosts } = options;
|
|
24
|
-
const localRoot = typeof localRefRoot === "string" ? pathToFileURL(path.resolve(fileURLToPath(cwd), localRefRoot)) : localRefRoot;
|
|
25
|
-
return {
|
|
26
|
-
...localRoot === void 0 ? {} : { localRoot },
|
|
27
|
-
...remoteRefHosts === void 0 ? {} : { remoteHosts: remoteRefHosts }
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
23
|
function callbackOptions(options) {
|
|
31
24
|
return {
|
|
32
25
|
irCallbacks: options.irCallbacks === true,
|
|
@@ -65,7 +58,8 @@ function contextFlags(options) {
|
|
|
65
58
|
}
|
|
66
59
|
function outputFixesOf(options, logger) {
|
|
67
60
|
const names = outputFixNamesOf(options.fix ?? []);
|
|
68
|
-
|
|
61
|
+
const flags = contextFlags(options);
|
|
62
|
+
for (const notice of ineffectiveFixNotices(names, (option) => flags[option])) {
|
|
69
63
|
logger.warn(warningText(notice, WARNING_CODES.FIX_NEEDS_OPTION));
|
|
70
64
|
}
|
|
71
65
|
return [...resolveOutputFixes(names)];
|
|
@@ -86,7 +80,7 @@ async function createDocumentRun(source, options, ports) {
|
|
|
86
80
|
const fix = outputFixesOf(options, logger);
|
|
87
81
|
const silent = options.silent ?? false;
|
|
88
82
|
const cwd = sourceCwd(options);
|
|
89
|
-
const schema = await ports.loader.load({
|
|
83
|
+
const { document: schema, localFiles } = await ports.loader.load({
|
|
90
84
|
source,
|
|
91
85
|
cwd,
|
|
92
86
|
shouldLint: options.lint ?? true,
|
|
@@ -112,7 +106,7 @@ async function createDocumentRun(source, options, ports) {
|
|
|
112
106
|
logger,
|
|
113
107
|
deprecations: ports.deprecations
|
|
114
108
|
};
|
|
115
|
-
return { schema, ctx };
|
|
109
|
+
return { schema, localFiles, ctx };
|
|
116
110
|
}
|
|
117
111
|
|
|
118
112
|
export { createDocumentRun };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-run.mjs","sources":["../../src/api/document-run.ts"],"sourcesContent":["import path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport type { Config as RedoclyConfig } from \"@redocly/openapi-core\";\nimport { sourceEmptyError } from \"../adapters/redocly-loader/schema-load-errors.js\";\nimport type { DeprecationReporter } from \"../application/ports/deprecation-reporter.js\";\nimport type { Logger } from \"../application/ports/logger.js\";\nimport type { RefAccess, SchemaLoader } from \"../application/ports/schema-loader.js\";\nimport { withStackOverflowReported } from \"../application/stack-overflow.js\";\nimport {\n ineffectiveFixNotices,\n type OutputFix,\n outputFixNamesOf,\n resolveOutputFixes,\n} from \"../domain/output-fixes.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport type { GeneratorOptions, OpenAPI3, SchemaSource } from \"../types.js\";\nimport { processCwd } from \"./default-ports.js\";\nimport { warnDiscriminatorValueConflicts } from \"./discriminator-conflict-warnings.js\";\nimport { findDiscriminators } from \"./discriminator-scan.js\";\nimport { resolveDocumentRef } from \"./document-refs.js\";\nimport { warnIdenticalPathTemplates } from \"./path-template-warnings.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { warnUnsupportedFeatures } from \"./unsupported-feature-warnings.js\";\n\n/** The ports of one generator run, wired by the Node API or the CLI (ENGINEERING_PLAN 4.5). */\nexport interface GeneratorPorts {\n readonly loader: SchemaLoader;\n readonly logger: Logger;\n /** Where the run reports the deprecated callback forms (ADR-004). */\n readonly deprecations: DeprecationReporter;\n /** The Redocly config the loader uses; the run's context exposes it as `ctx.redoc`. */\n readonly redoc: RedoclyConfig;\n /** A monotonic time in milliseconds, for debug durations. */\n readonly now: () => number;\n}\n\n/** A validated, bundled document and the context of one generator run. */\nexport interface DocumentRun {\n readonly schema: OpenAPI3;\n readonly ctx: RunContext;\n}\n\n/** The context fields that are user flags, with the original defaults. */\ntype ContextFlags = Omit<\n RunContext,\n | \"discriminators\"\n | \"injectFooter\"\n | \"redoc\"\n | \"resolve\"\n | \"runFooter\"\n | \"legacyCallbackWarnings\"\n | \"logger\"\n | \"deprecations\"\n | \"fix\"\n>;\n\n/**\n * The directory that relative `$ref`s of an inline source resolve against, as a URL that ends in\n * a slash. A path is resolved and encoded (`#`, `%`, spaces); a URL without the slash gets one.\n */\nfunction sourceCwd(options: GeneratorOptions): URL {\n const { cwd } = options;\n if (cwd instanceof URL) {\n return cwd.pathname.endsWith(\"/\") ? cwd : new URL(`${cwd.pathname}/`, cwd);\n }\n const directory = path.resolve(cwd === undefined ? processCwd() : cwd.toString());\n return pathToFileURL(path.join(directory, path.sep));\n}\n\n/** The `$ref` limits of the options; a relative local root resolves against the cwd. */\nfunction refAccessOf(options: GeneratorOptions, cwd: URL): RefAccess {\n const { localRefRoot, remoteRefHosts } = options;\n const localRoot =\n typeof localRefRoot === \"string\"\n ? pathToFileURL(path.resolve(fileURLToPath(cwd), localRefRoot))\n : localRefRoot;\n return {\n ...(localRoot === undefined ? {} : { localRoot }),\n ...(remoteRefHosts === undefined ? {} : { remoteHosts: remoteRefHosts }),\n };\n}\n\nfunction callbackOptions(options: GeneratorOptions) {\n return {\n irCallbacks: options.irCallbacks === true,\n postTransform: typeof options.postTransform === \"function\" ? options.postTransform : undefined,\n transform: typeof options.transform === \"function\" ? options.transform : undefined,\n transformProperty:\n typeof options.transformProperty === \"function\" ? options.transformProperty : undefined,\n };\n}\n\nfunction contextFlags(options: GeneratorOptions): ContextFlags {\n return {\n additionalProperties: options.additionalProperties ?? false,\n alphabetize: options.alphabetize ?? false,\n arrayLength: options.arrayLength ?? false,\n binaryAsBlob: options.binaryAsBlob ?? false,\n defaultNonNullable: options.defaultNonNullable ?? true,\n emptyObjectsUnknown: options.emptyObjectsUnknown ?? false,\n enum: options.enum ?? false,\n enumValues: options.enumValues ?? false,\n conditionalEnums: options.conditionalEnums ?? false,\n dedupeEnums: options.dedupeEnums ?? false,\n excludeDeprecated: options.excludeDeprecated ?? false,\n exportType: options.exportType ?? false,\n immutable: options.immutable ?? false,\n rootTypes: options.rootTypes ?? false,\n rootTypesNoSchemaPrefix: options.rootTypesNoSchemaPrefix ?? false,\n rootTypesKeepCasing: options.rootTypesKeepCasing ?? false,\n pathParamsAsTypes: options.pathParamsAsTypes ?? false,\n propertiesRequiredByDefault: options.propertiesRequiredByDefault ?? false,\n silent: options.silent ?? false,\n ...(options.inject === undefined ? {} : { inject: options.inject }),\n makePathsEnum: options.makePathsEnum ?? false,\n generatePathParams: options.generatePathParams ?? false,\n readWriteMarkers: options.readWriteMarkers ?? false,\n ...callbackOptions(options),\n };\n}\n\n/**\n * The fixes of the options, `all` expanded; fails with `OPTION_FIX_UNKNOWN` for another name.\n * A fix named without the option it needs is reported, since it changes nothing.\n */\nfunction outputFixesOf(options: GeneratorOptions, logger: Logger): readonly OutputFix[] {\n const names = outputFixNamesOf(options.fix ?? []);\n for (const notice of ineffectiveFixNotices(names, (option) => options[option] === true)) {\n logger.warn(warningText(notice, WARNING_CODES.FIX_NEEDS_OPTION));\n }\n return [...resolveOutputFixes(names)];\n}\n\n/** The warnings about the loaded document itself, before it is transformed. */\nfunction warnAboutDocument(schema: OpenAPI3, fix: readonly OutputFix[], logger: Logger): void {\n withStackOverflowReported(\"transform\", () => warnUnsupportedFeatures(schema, logger));\n withStackOverflowReported(\"transform\", () =>\n warnDiscriminatorValueConflicts(schema, fix, logger),\n );\n warnIdenticalPathTemplates(schema, logger);\n}\n\n/**\n * Load the source through the ports, then build the run's context from the options. The fix names\n * are checked first, so a typo fails before the document is read.\n */\nexport async function createDocumentRun(\n source: SchemaSource,\n options: GeneratorOptions,\n ports: GeneratorPorts,\n): Promise<DocumentRun> {\n if (!source) {\n throw sourceEmptyError(\"Empty schema. Please specify a URL, file path, or Redocly Config\");\n }\n const { logger } = ports;\n const fix = outputFixesOf(options, logger);\n const silent = options.silent ?? false;\n const cwd = sourceCwd(options);\n const schema = await ports.loader.load({\n source,\n cwd,\n shouldLint: options.lint ?? true,\n refAccess: refAccessOf(options, cwd),\n });\n warnAboutDocument(schema, fix, logger);\n const ctx: RunContext = {\n ...contextFlags(options),\n fix,\n // The scan walks every schema before the transform does, so on a larger stack, where loading\n // passed, it is the first step to run out.\n discriminators: withStackOverflowReported(\"transform\", () =>\n findDiscriminators(schema, {\n silent,\n logger,\n fixes: new Set(fix),\n }),\n ),\n injectFooter: [],\n redoc: ports.redoc,\n resolve: ($ref) => resolveDocumentRef(schema, $ref, { silent, logger }),\n logger,\n deprecations: ports.deprecations,\n };\n return { schema, ctx };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"document-run.mjs","sources":["../../src/api/document-run.ts"],"sourcesContent":["import path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { Config as RedoclyConfig } from \"@redocly/openapi-core\";\nimport { sourceEmptyError } from \"../adapters/redocly-loader/schema-load-errors.js\";\nimport type { DeprecationReporter } from \"../application/ports/deprecation-reporter.js\";\nimport type { Logger } from \"../application/ports/logger.js\";\nimport type { SchemaLoader } from \"../application/ports/schema-loader.js\";\nimport { withStackOverflowReported } from \"../application/stack-overflow.js\";\nimport {\n ineffectiveFixNotices,\n type OutputFix,\n outputFixNamesOf,\n resolveOutputFixes,\n} from \"../domain/output-fixes.js\";\nimport { WARNING_CODES, warningText } from \"../domain/warnings.js\";\nimport type { GeneratorOptions, OpenAPI3, SchemaSource } from \"../types.js\";\nimport { processCwd } from \"./default-ports.js\";\nimport { warnDiscriminatorValueConflicts } from \"./discriminator-conflict-warnings.js\";\nimport { findDiscriminators } from \"./discriminator-scan.js\";\nimport { resolveDocumentRef } from \"./document-refs.js\";\nimport { warnIdenticalPathTemplates } from \"./path-template-warnings.js\";\nimport { refAccessOf } from \"./ref-limit-options.js\";\nimport type { RunContext } from \"./run-context.js\";\nimport { warnUnsupportedFeatures } from \"./unsupported-feature-warnings.js\";\n\n/** The ports of one generator run, wired by the Node API or the CLI (ENGINEERING_PLAN 4.5). */\nexport interface GeneratorPorts {\n readonly loader: SchemaLoader;\n readonly logger: Logger;\n /** Where the run reports the deprecated callback forms (ADR-004). */\n readonly deprecations: DeprecationReporter;\n /** The Redocly config the loader uses; the run's context exposes it as `ctx.redoc`. */\n readonly redoc: RedoclyConfig;\n /** A monotonic time in milliseconds, for debug durations. */\n readonly now: () => number;\n}\n\n/** A validated, bundled document, the local files it was read from, and the run's context. */\nexport interface DocumentRun {\n readonly schema: OpenAPI3;\n readonly localFiles: readonly URL[];\n readonly ctx: RunContext;\n}\n\n/** The context fields that are user flags, with the original defaults. */\ntype ContextFlags = Omit<\n RunContext,\n | \"discriminators\"\n | \"injectFooter\"\n | \"redoc\"\n | \"resolve\"\n | \"runFooter\"\n | \"legacyCallbackWarnings\"\n | \"logger\"\n | \"deprecations\"\n | \"fix\"\n>;\n\n/**\n * The directory that relative `$ref`s of an inline source resolve against, as a URL that ends in\n * a slash. A path is resolved and encoded (`#`, `%`, spaces); a URL without the slash gets one.\n */\nfunction sourceCwd(options: GeneratorOptions): URL {\n const { cwd } = options;\n if (cwd instanceof URL) {\n return cwd.pathname.endsWith(\"/\") ? cwd : new URL(`${cwd.pathname}/`, cwd);\n }\n const directory = path.resolve(cwd === undefined ? processCwd() : cwd.toString());\n return pathToFileURL(path.join(directory, path.sep));\n}\n\nfunction callbackOptions(options: GeneratorOptions) {\n return {\n irCallbacks: options.irCallbacks === true,\n postTransform: typeof options.postTransform === \"function\" ? options.postTransform : undefined,\n transform: typeof options.transform === \"function\" ? options.transform : undefined,\n transformProperty:\n typeof options.transformProperty === \"function\" ? options.transformProperty : undefined,\n };\n}\n\nfunction contextFlags(options: GeneratorOptions): ContextFlags {\n return {\n additionalProperties: options.additionalProperties ?? false,\n alphabetize: options.alphabetize ?? false,\n arrayLength: options.arrayLength ?? false,\n binaryAsBlob: options.binaryAsBlob ?? false,\n defaultNonNullable: options.defaultNonNullable ?? true,\n emptyObjectsUnknown: options.emptyObjectsUnknown ?? false,\n enum: options.enum ?? false,\n enumValues: options.enumValues ?? false,\n conditionalEnums: options.conditionalEnums ?? false,\n dedupeEnums: options.dedupeEnums ?? false,\n excludeDeprecated: options.excludeDeprecated ?? false,\n exportType: options.exportType ?? false,\n immutable: options.immutable ?? false,\n rootTypes: options.rootTypes ?? false,\n rootTypesNoSchemaPrefix: options.rootTypesNoSchemaPrefix ?? false,\n rootTypesKeepCasing: options.rootTypesKeepCasing ?? false,\n pathParamsAsTypes: options.pathParamsAsTypes ?? false,\n propertiesRequiredByDefault: options.propertiesRequiredByDefault ?? false,\n silent: options.silent ?? false,\n ...(options.inject === undefined ? {} : { inject: options.inject }),\n makePathsEnum: options.makePathsEnum ?? false,\n generatePathParams: options.generatePathParams ?? false,\n readWriteMarkers: options.readWriteMarkers ?? false,\n ...callbackOptions(options),\n };\n}\n\n/**\n * The fixes of the options, `all` expanded; fails with `OPTION_FIX_UNKNOWN` for another name.\n * A fix named without the option it needs is reported, since it changes nothing.\n */\nfunction outputFixesOf(options: GeneratorOptions, logger: Logger): readonly OutputFix[] {\n const names = outputFixNamesOf(options.fix ?? []);\n // The options with their defaults: `defaultNonNullable` is on unless set to false.\n const flags = contextFlags(options);\n for (const notice of ineffectiveFixNotices(names, (option) => flags[option])) {\n logger.warn(warningText(notice, WARNING_CODES.FIX_NEEDS_OPTION));\n }\n return [...resolveOutputFixes(names)];\n}\n\n/** The warnings about the loaded document itself, before it is transformed. */\nfunction warnAboutDocument(schema: OpenAPI3, fix: readonly OutputFix[], logger: Logger): void {\n withStackOverflowReported(\"transform\", () => warnUnsupportedFeatures(schema, logger));\n withStackOverflowReported(\"transform\", () =>\n warnDiscriminatorValueConflicts(schema, fix, logger),\n );\n warnIdenticalPathTemplates(schema, logger);\n}\n\n/**\n * Load the source through the ports, then build the run's context from the options. The fix names\n * are checked first, so a typo fails before the document is read.\n */\nexport async function createDocumentRun(\n source: SchemaSource,\n options: GeneratorOptions,\n ports: GeneratorPorts,\n): Promise<DocumentRun> {\n if (!source) {\n throw sourceEmptyError(\"Empty schema. Please specify a URL, file path, or Redocly Config\");\n }\n const { logger } = ports;\n const fix = outputFixesOf(options, logger);\n const silent = options.silent ?? false;\n const cwd = sourceCwd(options);\n const { document: schema, localFiles } = await ports.loader.load({\n source,\n cwd,\n shouldLint: options.lint ?? true,\n refAccess: refAccessOf(options, cwd),\n });\n warnAboutDocument(schema, fix, logger);\n const ctx: RunContext = {\n ...contextFlags(options),\n fix,\n // The scan walks every schema before the transform does, so on a larger stack, where loading\n // passed, it is the first step to run out.\n discriminators: withStackOverflowReported(\"transform\", () =>\n findDiscriminators(schema, {\n silent,\n logger,\n fixes: new Set(fix),\n }),\n ),\n injectFooter: [],\n redoc: ports.redoc,\n resolve: ($ref) => resolveDocumentRef(schema, $ref, { silent, logger }),\n logger,\n deprecations: ports.deprecations,\n };\n return { schema, localFiles, ctx };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"legacy-utils.cjs","sources":["../../src/api/legacy-utils.ts"],"sourcesContent":["import colors from \"ansi-colors\";\nimport { formatDuration } from \"../adapters/terminal-logger/terminal-logger.js\";\nimport type { DebugGroup } from \"../application/ports/logger.js\";\nimport { discriminatorProperty } from \"../application/transform/schema/discriminator-property.js\";\nimport type { IrPropertySignature } from \"../domain/ir/nodes.js\";\nimport { createRef as createDomainRef } from \"../domain/openapi/json-pointer.js\";\nimport type { DiscriminatorObject } from \"../types.js\";\nimport { defaultLogger, terminalSupportsColor } from \"./default-ports.js\";\nimport { type ResolveRefOptions, resolveDocumentRef, walkDocument } from \"./document-refs.js\";\n\n/**\n * The original's exported utilities, kept for 1.x (ADR-004, decision 9). The generator itself\n * logs through the Logger port; `debug`, `warn` and `error` here write through the default one.\n */\n\n// The exported `c` is the shared ansi-colors instance, switched off at import when the terminal has\n// no colors, as the original did. The generator's own logger uses a separate instance.\nif (!terminalSupportsColor()) {\n colors.enabled = false;\n}\n\n/**\n * The shared ansi-colors instance.\n * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9). Use a color library directly.\n */\nexport const c = colors;\n\n/**\n * The discriminator property of a schema at `path`, typed as its discriminator value. Returns IR\n * (task 6.2), like the exported transformers.\n */\nexport function createDiscriminatorProperty(\n discriminator: DiscriminatorObject,\n { path, readonly = false }: { path: string; readonly?: boolean },\n): IrPropertySignature {\n return discriminatorProperty(discriminator, path, readonly);\n}\n\n
|
|
1
|
+
{"version":3,"file":"legacy-utils.cjs","sources":["../../src/api/legacy-utils.ts"],"sourcesContent":["import colors from \"ansi-colors\";\nimport { formatDuration } from \"../adapters/terminal-logger/terminal-logger.js\";\nimport type { DebugGroup } from \"../application/ports/logger.js\";\nimport { discriminatorProperty } from \"../application/transform/schema/discriminator-property.js\";\nimport type { IrPropertySignature } from \"../domain/ir/nodes.js\";\nimport { createRef as createDomainRef } from \"../domain/openapi/json-pointer.js\";\nimport type { DiscriminatorObject } from \"../types.js\";\nimport { defaultLogger, terminalSupportsColor } from \"./default-ports.js\";\nimport { type ResolveRefOptions, resolveDocumentRef, walkDocument } from \"./document-refs.js\";\n\n/**\n * The original's exported utilities, kept for 1.x (ADR-004, decision 9). The generator itself\n * logs through the Logger port; `debug`, `warn` and `error` here write through the default one.\n */\n\n// The exported `c` is the shared ansi-colors instance, switched off at import when the terminal has\n// no colors, as the original did. The generator's own logger uses a separate instance.\nif (!terminalSupportsColor()) {\n colors.enabled = false;\n}\n\n/**\n * The shared ansi-colors instance.\n * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9). Use a color library directly.\n */\nexport const c = colors;\n\n/**\n * The discriminator property of a schema at `path`, typed as its discriminator value. Returns IR\n * (task 6.2), like the exported transformers.\n */\nexport function createDiscriminatorProperty(\n discriminator: DiscriminatorObject,\n { path, readonly = false }: { path: string; readonly?: boolean },\n): IrPropertySignature {\n return discriminatorProperty(discriminator, path, readonly);\n}\n\n/**\n * Create a $ref pointer (even from other $refs). A part that contains `#/` is read as a `$ref`\n * and contributes its decoded segments, so it throws URIError for a malformed percent escape; any\n * other part is one segment. To append raw document keys, escape each one instead.\n */\nexport function createRef(parts: (number | string | undefined | null)[]): string {\n return createDomainRef(parts);\n}\n\n/**\n * Print debug message (cribbed from the `debug` package, but without all the bells & whistles\n * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).\n */\nexport function debug(msg: string, group?: string, time?: number) {\n // Any group name was accepted; one the logger does not know prints in white, as before.\n defaultLogger(false).debug(msg, group as DebugGroup | undefined, time);\n}\n\n/**\n * Print error message\n * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).\n */\nexport function error(msg: string) {\n defaultLogger(false).error(msg);\n}\n\n/** Format a performance log in a friendly format */\nexport function formatTime(t: number) {\n return typeof t === \"number\" ? formatDuration(t) : t;\n}\n\n/** Call Object.entries() and optionally sort */\nexport function getEntries<T>(\n obj: ArrayLike<T> | Record<string, T>,\n options?: {\n alphabetize?: boolean;\n excludeDeprecated?: boolean;\n },\n) {\n let entries = Object.entries(obj);\n if (options?.alphabetize) {\n entries.sort(([a], [b]) => a.localeCompare(b, \"en-us\", { numeric: true }));\n }\n if (options?.excludeDeprecated) {\n entries = entries.filter(\n ([, v]) => !(v && typeof v === \"object\" && \"deprecated\" in v && v.deprecated),\n );\n }\n return entries;\n}\n\nexport type { ResolveRefOptions } from \"./document-refs.js\";\n\n/**\n * resolve a $ref in a schema\n * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).\n */\nexport function resolveRef<T>(\n schema: unknown,\n $ref: string,\n options: ResolveRefOptions,\n): T | undefined {\n return resolveDocumentRef<T>(schema, $ref, options);\n}\n\n/**\n * Walk through any JSON-serializable (i.e. non-circular) object\n * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).\n */\nexport function walk(\n obj: unknown,\n cb: (value: Record<string, unknown>, path: (string | number)[]) => void,\n path: (string | number)[] = [],\n): void {\n walkDocument(obj, cb, path);\n}\n\n/**\n * Print warning message\n * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).\n */\nexport function warn(msg: string, silent = false) {\n defaultLogger(silent).warn(msg);\n}\n"],"names":["terminalSupportsColor","colors","discriminatorProperty","createDomainRef","defaultLogger","formatDuration","resolveDocumentRef","walkDocument"],"mappings":";;;;;;;;;;;;;AAiBA,IAAI,CAACA,oCAAsB,EAAG;AAC5B,EAAAC,eAAA,CAAO,OAAA,GAAU,KAAA;AACnB;AAMO,MAAM,CAAA,GAAIA;AAMV,SAAS,4BACd,aAAA,EACA,EAAE,IAAA,EAAM,QAAA,GAAW,OAAM,EACJ;AACrB,EAAA,OAAOC,2CAAA,CAAsB,aAAA,EAAe,IAAA,EAAM,QAAQ,CAAA;AAC5D;AAOO,SAAS,UAAU,KAAA,EAAuD;AAC/E,EAAA,OAAOC,sBAAgB,KAAK,CAAA;AAC9B;AAMO,SAAS,KAAA,CAAM,GAAA,EAAa,KAAA,EAAgB,IAAA,EAAe;AAEhE,EAAAC,0BAAA,CAAc,KAAK,CAAA,CAAE,KAAA,CAAM,GAAA,EAAK,OAAiC,IAAI,CAAA;AACvE;AAMO,SAAS,MAAM,GAAA,EAAa;AACjC,EAAAA,0BAAA,CAAc,KAAK,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA;AAChC;AAGO,SAAS,WAAW,CAAA,EAAW;AACpC,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,GAAWC,6BAAA,CAAe,CAAC,CAAA,GAAI,CAAA;AACrD;AAGO,SAAS,UAAA,CACd,KACA,OAAA,EAIA;AACA,EAAA,IAAI,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAChC,EAAA,IAAI,SAAS,WAAA,EAAa;AACxB,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,GAAG,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,EAC3E;AACA,EAAA,IAAI,SAAS,iBAAA,EAAmB;AAC9B,IAAA,OAAA,GAAU,OAAA,CAAQ,MAAA;AAAA,MAChB,CAAC,GAAG,CAAC,CAAA,KAAM,EAAE,CAAA,IAAK,OAAO,CAAA,KAAM,QAAA,IAAY,YAAA,IAAgB,CAAA,IAAK,CAAA,CAAE,UAAA;AAAA,KACpE;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAQO,SAAS,UAAA,CACd,MAAA,EACA,IAAA,EACA,OAAA,EACe;AACf,EAAA,OAAOC,+BAAA,CAAsB,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAA;AACpD;AAMO,SAAS,IAAA,CACd,GAAA,EACA,EAAA,EACA,IAAA,GAA4B,EAAC,EACvB;AACN,EAAAC,yBAAA,CAAa,GAAA,EAAK,IAAI,IAAI,CAAA;AAC5B;AAMO,SAAS,IAAA,CAAK,GAAA,EAAa,MAAA,GAAS,KAAA,EAAO;AAChD,EAAAH,0BAAA,CAAc,MAAM,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAChC;;;;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"legacy-utils.mjs","sources":["../../src/api/legacy-utils.ts"],"sourcesContent":["import colors from \"ansi-colors\";\nimport { formatDuration } from \"../adapters/terminal-logger/terminal-logger.js\";\nimport type { DebugGroup } from \"../application/ports/logger.js\";\nimport { discriminatorProperty } from \"../application/transform/schema/discriminator-property.js\";\nimport type { IrPropertySignature } from \"../domain/ir/nodes.js\";\nimport { createRef as createDomainRef } from \"../domain/openapi/json-pointer.js\";\nimport type { DiscriminatorObject } from \"../types.js\";\nimport { defaultLogger, terminalSupportsColor } from \"./default-ports.js\";\nimport { type ResolveRefOptions, resolveDocumentRef, walkDocument } from \"./document-refs.js\";\n\n/**\n * The original's exported utilities, kept for 1.x (ADR-004, decision 9). The generator itself\n * logs through the Logger port; `debug`, `warn` and `error` here write through the default one.\n */\n\n// The exported `c` is the shared ansi-colors instance, switched off at import when the terminal has\n// no colors, as the original did. The generator's own logger uses a separate instance.\nif (!terminalSupportsColor()) {\n colors.enabled = false;\n}\n\n/**\n * The shared ansi-colors instance.\n * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9). Use a color library directly.\n */\nexport const c = colors;\n\n/**\n * The discriminator property of a schema at `path`, typed as its discriminator value. Returns IR\n * (task 6.2), like the exported transformers.\n */\nexport function createDiscriminatorProperty(\n discriminator: DiscriminatorObject,\n { path, readonly = false }: { path: string; readonly?: boolean },\n): IrPropertySignature {\n return discriminatorProperty(discriminator, path, readonly);\n}\n\n
|
|
1
|
+
{"version":3,"file":"legacy-utils.mjs","sources":["../../src/api/legacy-utils.ts"],"sourcesContent":["import colors from \"ansi-colors\";\nimport { formatDuration } from \"../adapters/terminal-logger/terminal-logger.js\";\nimport type { DebugGroup } from \"../application/ports/logger.js\";\nimport { discriminatorProperty } from \"../application/transform/schema/discriminator-property.js\";\nimport type { IrPropertySignature } from \"../domain/ir/nodes.js\";\nimport { createRef as createDomainRef } from \"../domain/openapi/json-pointer.js\";\nimport type { DiscriminatorObject } from \"../types.js\";\nimport { defaultLogger, terminalSupportsColor } from \"./default-ports.js\";\nimport { type ResolveRefOptions, resolveDocumentRef, walkDocument } from \"./document-refs.js\";\n\n/**\n * The original's exported utilities, kept for 1.x (ADR-004, decision 9). The generator itself\n * logs through the Logger port; `debug`, `warn` and `error` here write through the default one.\n */\n\n// The exported `c` is the shared ansi-colors instance, switched off at import when the terminal has\n// no colors, as the original did. The generator's own logger uses a separate instance.\nif (!terminalSupportsColor()) {\n colors.enabled = false;\n}\n\n/**\n * The shared ansi-colors instance.\n * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9). Use a color library directly.\n */\nexport const c = colors;\n\n/**\n * The discriminator property of a schema at `path`, typed as its discriminator value. Returns IR\n * (task 6.2), like the exported transformers.\n */\nexport function createDiscriminatorProperty(\n discriminator: DiscriminatorObject,\n { path, readonly = false }: { path: string; readonly?: boolean },\n): IrPropertySignature {\n return discriminatorProperty(discriminator, path, readonly);\n}\n\n/**\n * Create a $ref pointer (even from other $refs). A part that contains `#/` is read as a `$ref`\n * and contributes its decoded segments, so it throws URIError for a malformed percent escape; any\n * other part is one segment. To append raw document keys, escape each one instead.\n */\nexport function createRef(parts: (number | string | undefined | null)[]): string {\n return createDomainRef(parts);\n}\n\n/**\n * Print debug message (cribbed from the `debug` package, but without all the bells & whistles\n * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).\n */\nexport function debug(msg: string, group?: string, time?: number) {\n // Any group name was accepted; one the logger does not know prints in white, as before.\n defaultLogger(false).debug(msg, group as DebugGroup | undefined, time);\n}\n\n/**\n * Print error message\n * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).\n */\nexport function error(msg: string) {\n defaultLogger(false).error(msg);\n}\n\n/** Format a performance log in a friendly format */\nexport function formatTime(t: number) {\n return typeof t === \"number\" ? formatDuration(t) : t;\n}\n\n/** Call Object.entries() and optionally sort */\nexport function getEntries<T>(\n obj: ArrayLike<T> | Record<string, T>,\n options?: {\n alphabetize?: boolean;\n excludeDeprecated?: boolean;\n },\n) {\n let entries = Object.entries(obj);\n if (options?.alphabetize) {\n entries.sort(([a], [b]) => a.localeCompare(b, \"en-us\", { numeric: true }));\n }\n if (options?.excludeDeprecated) {\n entries = entries.filter(\n ([, v]) => !(v && typeof v === \"object\" && \"deprecated\" in v && v.deprecated),\n );\n }\n return entries;\n}\n\nexport type { ResolveRefOptions } from \"./document-refs.js\";\n\n/**\n * resolve a $ref in a schema\n * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).\n */\nexport function resolveRef<T>(\n schema: unknown,\n $ref: string,\n options: ResolveRefOptions,\n): T | undefined {\n return resolveDocumentRef<T>(schema, $ref, options);\n}\n\n/**\n * Walk through any JSON-serializable (i.e. non-circular) object\n * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).\n */\nexport function walk(\n obj: unknown,\n cb: (value: Record<string, unknown>, path: (string | number)[]) => void,\n path: (string | number)[] = [],\n): void {\n walkDocument(obj, cb, path);\n}\n\n/**\n * Print warning message\n * @deprecated Kept for 1.x; removed in 2.0 (ADR-004, decision 9).\n */\nexport function warn(msg: string, silent = false) {\n defaultLogger(silent).warn(msg);\n}\n"],"names":["createDomainRef"],"mappings":";;;;;;;AAiBA,IAAI,CAAC,uBAAsB,EAAG;AAC5B,EAAA,MAAA,CAAO,OAAA,GAAU,KAAA;AACnB;AAMO,MAAM,CAAA,GAAI;AAMV,SAAS,4BACd,aAAA,EACA,EAAE,IAAA,EAAM,QAAA,GAAW,OAAM,EACJ;AACrB,EAAA,OAAO,qBAAA,CAAsB,aAAA,EAAe,IAAA,EAAM,QAAQ,CAAA;AAC5D;AAOO,SAAS,UAAU,KAAA,EAAuD;AAC/E,EAAA,OAAOA,YAAgB,KAAK,CAAA;AAC9B;AAMO,SAAS,KAAA,CAAM,GAAA,EAAa,KAAA,EAAgB,IAAA,EAAe;AAEhE,EAAA,aAAA,CAAc,KAAK,CAAA,CAAE,KAAA,CAAM,GAAA,EAAK,OAAiC,IAAI,CAAA;AACvE;AAMO,SAAS,MAAM,GAAA,EAAa;AACjC,EAAA,aAAA,CAAc,KAAK,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA;AAChC;AAGO,SAAS,WAAW,CAAA,EAAW;AACpC,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,GAAW,cAAA,CAAe,CAAC,CAAA,GAAI,CAAA;AACrD;AAGO,SAAS,UAAA,CACd,KACA,OAAA,EAIA;AACA,EAAA,IAAI,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAChC,EAAA,IAAI,SAAS,WAAA,EAAa;AACxB,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,GAAG,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,EAC3E;AACA,EAAA,IAAI,SAAS,iBAAA,EAAmB;AAC9B,IAAA,OAAA,GAAU,OAAA,CAAQ,MAAA;AAAA,MAChB,CAAC,GAAG,CAAC,CAAA,KAAM,EAAE,CAAA,IAAK,OAAO,CAAA,KAAM,QAAA,IAAY,YAAA,IAAgB,CAAA,IAAK,CAAA,CAAE,UAAA;AAAA,KACpE;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAQO,SAAS,UAAA,CACd,MAAA,EACA,IAAA,EACA,OAAA,EACe;AACf,EAAA,OAAO,kBAAA,CAAsB,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAA;AACpD;AAMO,SAAS,IAAA,CACd,GAAA,EACA,EAAA,EACA,IAAA,GAA4B,EAAC,EACvB;AACN,EAAA,YAAA,CAAa,GAAA,EAAK,IAAI,IAAI,CAAA;AAC5B;AAMO,SAAS,IAAA,CAAK,GAAA,EAAa,MAAA,GAAS,KAAA,EAAO;AAChD,EAAA,aAAA,CAAc,MAAM,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAChC;;"}
|
package/dist/api/openapi-ts.cjs
CHANGED
|
@@ -8,19 +8,21 @@ const defaultPorts = require('./default-ports.cjs');
|
|
|
8
8
|
const documentRun = require('./document-run.cjs');
|
|
9
9
|
const transformSchema = require('./transform-schema.cjs');
|
|
10
10
|
|
|
11
|
-
async function
|
|
12
|
-
const { schema, ctx } = await documentRun.createDocumentRun(source, options, ports);
|
|
11
|
+
async function generateDocument(source, options, ports) {
|
|
12
|
+
const { schema, localFiles, ctx } = await documentRun.createDocumentRun(source, options, ports);
|
|
13
13
|
const startedAt = ports.now();
|
|
14
|
-
const
|
|
14
|
+
const declarations = stackOverflow.withStackOverflowReported("transform", () => transformSchema.default(schema, ctx));
|
|
15
15
|
ports.logger.debug(
|
|
16
16
|
"Completed AST transformation for entire document",
|
|
17
17
|
"ts",
|
|
18
18
|
ports.now() - startedAt
|
|
19
19
|
);
|
|
20
|
-
return
|
|
20
|
+
return { declarations, localFiles };
|
|
21
|
+
}
|
|
22
|
+
async function generateDeclarations(source, options, ports) {
|
|
23
|
+
return (await generateDocument(source, options, ports)).declarations;
|
|
21
24
|
}
|
|
22
|
-
async function defaultGeneratorPorts(options) {
|
|
23
|
-
const logger = defaultPorts.defaultLogger(options.silent ?? false);
|
|
25
|
+
async function defaultGeneratorPorts(options, logger = defaultPorts.defaultLogger(options.silent ?? false)) {
|
|
24
26
|
const redoc = options.redocly ?? await defaultPorts.defaultRedoclyConfig();
|
|
25
27
|
const loader = redoclySchemaLoader.createRedoclySchemaLoader({
|
|
26
28
|
redoc,
|
|
@@ -38,4 +40,5 @@ async function openapiTS(source, options = {}) {
|
|
|
38
40
|
exports.default = openapiTS;
|
|
39
41
|
exports.defaultGeneratorPorts = defaultGeneratorPorts;
|
|
40
42
|
exports.generateDeclarations = generateDeclarations;
|
|
43
|
+
exports.generateDocument = generateDocument;
|
|
41
44
|
//# sourceMappingURL=openapi-ts.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi-ts.cjs","sources":["../../src/api/openapi-ts.ts"],"sourcesContent":["import { createRedoclySchemaLoader } from \"../adapters/redocly-loader/redocly-schema-loader.js\";\nimport { withStackOverflowReported } from \"../application/stack-overflow.js\";\nimport type { IrDeclaration } from \"../domain/ir/nodes.js\";\nimport type { GeneratorOptions, SchemaSource } from \"../types.js\";\nimport {\n DEFAULT_REMOTE_DOCUMENT_LIMITS,\n defaultDeprecationReporter,\n defaultLogger,\n defaultRedoclyConfig,\n monotonicNow,\n REMOTE_REF_TIMEOUT_MS,\n} from \"./default-ports.js\";\nimport { createDocumentRun, type GeneratorPorts } from \"./document-run.js\";\nimport transformSchema from \"./transform-schema.js\";\n\n/**\n * The Node API's composition root (ENGINEERING_PLAN 4.5): `openapiTS` wires the default adapters;\n * `generateDeclarations` runs with any ports, which is how the CLI calls it.\n */\n\n/** Load, validate and bundle the source, then transform it into IR declarations. */\nexport async function
|
|
1
|
+
{"version":3,"file":"openapi-ts.cjs","sources":["../../src/api/openapi-ts.ts"],"sourcesContent":["import { createRedoclySchemaLoader } from \"../adapters/redocly-loader/redocly-schema-loader.js\";\nimport type { Logger } from \"../application/ports/logger.js\";\nimport { withStackOverflowReported } from \"../application/stack-overflow.js\";\nimport type { IrDeclaration } from \"../domain/ir/nodes.js\";\nimport type { GeneratorOptions, SchemaSource } from \"../types.js\";\nimport {\n DEFAULT_REMOTE_DOCUMENT_LIMITS,\n defaultDeprecationReporter,\n defaultLogger,\n defaultRedoclyConfig,\n monotonicNow,\n REMOTE_REF_TIMEOUT_MS,\n} from \"./default-ports.js\";\nimport { createDocumentRun, type GeneratorPorts } from \"./document-run.js\";\nimport transformSchema from \"./transform-schema.js\";\n\n/**\n * The Node API's composition root (ENGINEERING_PLAN 4.5): `openapiTS` wires the default adapters;\n * `generateDeclarations` runs with any ports, which is how the CLI calls it.\n */\n\n/** The declarations of one document, and the local files it was read from. */\nexport interface GeneratedDocument {\n readonly declarations: IrDeclaration[];\n readonly localFiles: readonly URL[];\n}\n\n/** Load, validate and bundle the source, then transform it into IR declarations. */\nexport async function generateDocument(\n source: SchemaSource,\n options: GeneratorOptions,\n ports: GeneratorPorts,\n): Promise<GeneratedDocument> {\n const { schema, localFiles, ctx } = await createDocumentRun(source, options, ports);\n const startedAt = ports.now();\n const declarations = withStackOverflowReported(\"transform\", () => transformSchema(schema, ctx));\n ports.logger.debug(\n \"Completed AST transformation for entire document\",\n \"ts\",\n ports.now() - startedAt,\n );\n return { declarations, localFiles };\n}\n\n/** As `generateDocument`, the declarations only. */\nexport async function generateDeclarations(\n source: SchemaSource,\n options: GeneratorOptions,\n ports: GeneratorPorts,\n): Promise<IrDeclaration[]> {\n return (await generateDocument(source, options, ports)).declarations;\n}\n\n/**\n * The default ports: the terminal logger, Node.js deprecation warnings, the given or default\n * Redocly config, Redocly loading. A given `logger` takes every line, the loader's included.\n */\nexport async function defaultGeneratorPorts(\n options: GeneratorOptions,\n logger: Logger = defaultLogger(options.silent ?? false),\n): Promise<GeneratorPorts> {\n const redoc = options.redocly ?? (await defaultRedoclyConfig());\n const loader = createRedoclySchemaLoader({\n redoc,\n logger,\n now: monotonicNow,\n remoteRefTimeoutMs: REMOTE_REF_TIMEOUT_MS,\n remoteDocumentLimits: DEFAULT_REMOTE_DOCUMENT_LIMITS,\n });\n return { loader, logger, deprecations: defaultDeprecationReporter(), redoc, now: monotonicNow };\n}\n\n/**\n * Convert an OpenAPI schema to TypeScript declarations (IR nodes; print them with `astToString`)\n * @param {string|URL|object|Readable} source OpenAPI schema source:\n * - YAML: string\n * - JSON: parsed object\n * - URL: URL to a YAML or JSON file (local or remote)\n * - Readable: Readable stream of YAML or JSON\n */\nexport default async function openapiTS(\n source: SchemaSource,\n options: GeneratorOptions = {},\n): Promise<IrDeclaration[]> {\n return generateDeclarations(source, options, await defaultGeneratorPorts(options));\n}\n"],"names":["createDocumentRun","withStackOverflowReported","transformSchema","defaultLogger","defaultRedoclyConfig","createRedoclySchemaLoader","monotonicNow","REMOTE_REF_TIMEOUT_MS","DEFAULT_REMOTE_DOCUMENT_LIMITS","defaultDeprecationReporter"],"mappings":";;;;;;;;;;AA4BA,eAAsB,gBAAA,CACpB,MAAA,EACA,OAAA,EACA,KAAA,EAC4B;AAC5B,EAAA,MAAM,EAAE,QAAQ,UAAA,EAAY,GAAA,KAAQ,MAAMA,6BAAA,CAAkB,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAA;AAClF,EAAA,MAAM,SAAA,GAAY,MAAM,GAAA,EAAI;AAC5B,EAAA,MAAM,eAAeC,uCAAA,CAA0B,WAAA,EAAa,MAAMC,uBAAA,CAAgB,MAAA,EAAQ,GAAG,CAAC,CAAA;AAC9F,EAAA,KAAA,CAAM,MAAA,CAAO,KAAA;AAAA,IACX,kDAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA,CAAM,KAAI,GAAI;AAAA,GAChB;AACA,EAAA,OAAO,EAAE,cAAc,UAAA,EAAW;AACpC;AAGA,eAAsB,oBAAA,CACpB,MAAA,EACA,OAAA,EACA,KAAA,EAC0B;AAC1B,EAAA,OAAA,CAAQ,MAAM,gBAAA,CAAiB,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAA,EAAG,YAAA;AAC1D;AAMA,eAAsB,sBACpB,OAAA,EACA,MAAA,GAAiBC,2BAAc,OAAA,CAAQ,MAAA,IAAU,KAAK,CAAA,EAC7B;AACzB,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,IAAY,MAAMC,iCAAA,EAAqB;AAC7D,EAAA,MAAM,SAASC,6CAAA,CAA0B;AAAA,IACvC,KAAA;AAAA,IACA,MAAA;AAAA,IACA,GAAA,EAAKC,yBAAA;AAAA,IACL,kBAAA,EAAoBC,kCAAA;AAAA,IACpB,oBAAA,EAAsBC;AAAA,GACvB,CAAA;AACD,EAAA,OAAO,EAAE,QAAQ,MAAA,EAAQ,YAAA,EAAcC,yCAA2B,EAAG,KAAA,EAAO,KAAKH,yBAAA,EAAa;AAChG;AAUA,eAA8B,SAAA,CAC5B,MAAA,EACA,OAAA,GAA4B,EAAC,EACH;AAC1B,EAAA,OAAO,qBAAqB,MAAA,EAAQ,OAAA,EAAS,MAAM,qBAAA,CAAsB,OAAO,CAAC,CAAA;AACnF;;;;;"}
|
package/dist/api/openapi-ts.mjs
CHANGED
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
import { createRedoclySchemaLoader } from '../adapters/redocly-loader/redocly-schema-loader.mjs';
|
|
2
2
|
import { withStackOverflowReported } from '../application/stack-overflow.mjs';
|
|
3
|
-
import {
|
|
3
|
+
import { defaultRedoclyConfig, monotonicNow, defaultDeprecationReporter, defaultLogger, DEFAULT_REMOTE_DOCUMENT_LIMITS, REMOTE_REF_TIMEOUT_MS } from './default-ports.mjs';
|
|
4
4
|
import { createDocumentRun } from './document-run.mjs';
|
|
5
5
|
import transformSchema from './transform-schema.mjs';
|
|
6
6
|
|
|
7
|
-
async function
|
|
8
|
-
const { schema, ctx } = await createDocumentRun(source, options, ports);
|
|
7
|
+
async function generateDocument(source, options, ports) {
|
|
8
|
+
const { schema, localFiles, ctx } = await createDocumentRun(source, options, ports);
|
|
9
9
|
const startedAt = ports.now();
|
|
10
|
-
const
|
|
10
|
+
const declarations = withStackOverflowReported("transform", () => transformSchema(schema, ctx));
|
|
11
11
|
ports.logger.debug(
|
|
12
12
|
"Completed AST transformation for entire document",
|
|
13
13
|
"ts",
|
|
14
14
|
ports.now() - startedAt
|
|
15
15
|
);
|
|
16
|
-
return
|
|
16
|
+
return { declarations, localFiles };
|
|
17
|
+
}
|
|
18
|
+
async function generateDeclarations(source, options, ports) {
|
|
19
|
+
return (await generateDocument(source, options, ports)).declarations;
|
|
17
20
|
}
|
|
18
|
-
async function defaultGeneratorPorts(options) {
|
|
19
|
-
const logger = defaultLogger(options.silent ?? false);
|
|
21
|
+
async function defaultGeneratorPorts(options, logger = defaultLogger(options.silent ?? false)) {
|
|
20
22
|
const redoc = options.redocly ?? await defaultRedoclyConfig();
|
|
21
23
|
const loader = createRedoclySchemaLoader({
|
|
22
24
|
redoc,
|
|
@@ -31,5 +33,5 @@ async function openapiTS(source, options = {}) {
|
|
|
31
33
|
return generateDeclarations(source, options, await defaultGeneratorPorts(options));
|
|
32
34
|
}
|
|
33
35
|
|
|
34
|
-
export { openapiTS as default, defaultGeneratorPorts, generateDeclarations };
|
|
36
|
+
export { openapiTS as default, defaultGeneratorPorts, generateDeclarations, generateDocument };
|
|
35
37
|
//# sourceMappingURL=openapi-ts.mjs.map
|