@redocly/client-generator 0.3.8 → 0.4.0
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/README.md +32 -54
- package/eject-assets/AGENTS.md +137 -0
- package/eject-assets/generators/cli/docs.ts +224 -0
- package/eject-assets/generators/cli/engine-source.ts +21 -0
- package/eject-assets/generators/cli/index.ts +90 -0
- package/eject-assets/generators/cli/render.ts +348 -0
- package/eject-assets/generators/go/client.ts +57 -0
- package/eject-assets/generators/go/descriptor.ts +41 -0
- package/eject-assets/generators/go/index.ts +336 -0
- package/eject-assets/generators/go/models.ts +179 -0
- package/eject-assets/generators/go/naming.ts +49 -0
- package/eject-assets/generators/go/operations.ts +296 -0
- package/eject-assets/generators/go/pagination.ts +194 -0
- package/eject-assets/generators/go/types.ts +60 -0
- package/eject-assets/generators/mock/faker.ts +214 -0
- package/eject-assets/generators/mock/index.ts +35 -0
- package/eject-assets/generators/mock/render.ts +282 -0
- package/eject-assets/generators/mock/sample.ts +316 -0
- package/eject-assets/generators/mock/values.ts +63 -0
- package/eject-assets/generators/php/client.ts +63 -0
- package/eject-assets/generators/php/descriptor.ts +58 -0
- package/eject-assets/generators/php/index.ts +237 -0
- package/eject-assets/generators/php/models.ts +275 -0
- package/eject-assets/generators/php/naming.ts +51 -0
- package/eject-assets/generators/php/operations.ts +232 -0
- package/eject-assets/generators/php/pagination.ts +133 -0
- package/eject-assets/generators/php/types.ts +148 -0
- package/eject-assets/generators/python/client.ts +123 -0
- package/eject-assets/generators/python/descriptor.ts +52 -0
- package/eject-assets/generators/python/index.ts +251 -0
- package/eject-assets/generators/python/models.ts +242 -0
- package/eject-assets/generators/python/naming.ts +46 -0
- package/eject-assets/generators/python/operations.ts +147 -0
- package/eject-assets/generators/python/pagination.ts +128 -0
- package/eject-assets/generators/python/types.ts +54 -0
- package/eject-assets/generators/swr/index.ts +37 -0
- package/eject-assets/generators/swr/render.ts +78 -0
- package/eject-assets/generators/tanstack-query/index.ts +48 -0
- package/eject-assets/generators/tanstack-query/render.ts +346 -0
- package/eject-assets/generators/transformers/index.ts +46 -0
- package/eject-assets/generators/transformers/render.ts +506 -0
- package/eject-assets/generators/typescript/banner.ts +35 -0
- package/eject-assets/generators/typescript/client.ts +254 -0
- package/eject-assets/generators/typescript/descriptor.ts +137 -0
- package/eject-assets/generators/typescript/index.ts +101 -0
- package/eject-assets/generators/typescript/inline-runtime.ts +135 -0
- package/eject-assets/generators/typescript/operation-signature.ts +62 -0
- package/eject-assets/generators/typescript/operation-types.ts +17 -0
- package/eject-assets/generators/typescript/operations.ts +524 -0
- package/eject-assets/generators/typescript/response-headers.ts +74 -0
- package/eject-assets/generators/typescript/type-guards.ts +159 -0
- package/eject-assets/generators/typescript/types.ts +172 -0
- package/eject-assets/generators/zod/index.ts +32 -0
- package/eject-assets/generators/zod/schemas.ts +456 -0
- package/eject-assets/skills/cli-generator/SKILL.md +121 -0
- package/eject-assets/skills/client-generators/SKILL.md +142 -0
- package/eject-assets/skills/go-generator/SKILL.md +96 -0
- package/eject-assets/skills/mock-generator/SKILL.md +50 -0
- package/eject-assets/skills/php-generator/SKILL.md +112 -0
- package/eject-assets/skills/python-generator/SKILL.md +110 -0
- package/eject-assets/skills/swr-generator/SKILL.md +50 -0
- package/eject-assets/skills/tanstack-query-generator/SKILL.md +55 -0
- package/eject-assets/skills/transformers-generator/SKILL.md +47 -0
- package/eject-assets/skills/typescript-generator/SKILL.md +95 -0
- package/eject-assets/skills/zod-generator/SKILL.md +54 -0
- package/lib/authoring/index.d.ts +11 -0
- package/lib/authoring/index.d.ts.map +1 -0
- package/lib/authoring/index.js +42 -0
- package/lib/authoring/index.js.map +1 -0
- package/lib/authoring/naming.d.ts +34 -0
- package/lib/authoring/naming.d.ts.map +1 -0
- package/lib/authoring/naming.js +104 -0
- package/lib/authoring/naming.js.map +1 -0
- package/lib/authoring/operation.d.ts +47 -0
- package/lib/authoring/operation.d.ts.map +1 -0
- package/lib/authoring/operation.js +86 -0
- package/lib/authoring/operation.js.map +1 -0
- package/lib/authoring/options.d.ts +9 -0
- package/lib/authoring/options.d.ts.map +1 -0
- package/lib/authoring/options.js +5 -0
- package/lib/authoring/options.js.map +1 -0
- package/lib/authoring/pagination.d.ts +19 -0
- package/lib/authoring/pagination.d.ts.map +1 -0
- package/lib/authoring/pagination.js +45 -0
- package/lib/authoring/pagination.js.map +1 -0
- package/lib/authoring/printer.d.ts +16 -0
- package/lib/authoring/printer.d.ts.map +1 -0
- package/lib/authoring/printer.js +36 -0
- package/lib/authoring/printer.js.map +1 -0
- package/lib/authoring/reference-page.d.ts +31 -0
- package/lib/authoring/reference-page.d.ts.map +1 -0
- package/lib/authoring/reference-page.js +160 -0
- package/lib/authoring/reference-page.js.map +1 -0
- package/lib/authoring/schema.d.ts +51 -0
- package/lib/authoring/schema.d.ts.map +1 -0
- package/lib/authoring/schema.js +190 -0
- package/lib/authoring/schema.js.map +1 -0
- package/lib/cli-contract.d.ts +126 -0
- package/lib/cli-contract.d.ts.map +1 -0
- package/lib/cli-contract.js +25 -0
- package/lib/cli-contract.js.map +1 -0
- package/lib/{emitters/wrapper-support.d.ts → contracts/typescript.d.ts} +13 -24
- package/lib/contracts/typescript.d.ts.map +1 -0
- package/lib/contracts/typescript.js +87 -0
- package/lib/contracts/typescript.js.map +1 -0
- package/lib/generate.d.ts +10 -10
- package/lib/generate.d.ts.map +1 -1
- package/lib/generate.js +25 -106
- package/lib/generate.js.map +1 -1
- package/lib/generators/cli/docs.d.ts +19 -0
- package/lib/generators/cli/docs.d.ts.map +1 -0
- package/lib/generators/cli/docs.js +187 -0
- package/lib/generators/cli/docs.js.map +1 -0
- package/lib/generators/cli/engine-source.d.ts +5 -0
- package/lib/generators/cli/engine-source.d.ts.map +1 -0
- package/lib/generators/cli/engine-source.js +12 -0
- package/lib/generators/cli/engine-source.js.map +1 -0
- package/lib/generators/cli/index.d.ts +18 -0
- package/lib/generators/cli/index.d.ts.map +1 -0
- package/lib/generators/cli/index.js +67 -0
- package/lib/generators/cli/index.js.map +1 -0
- package/lib/generators/cli/render.d.ts +39 -0
- package/lib/generators/cli/render.d.ts.map +1 -0
- package/lib/generators/cli/render.js +281 -0
- package/lib/generators/cli/render.js.map +1 -0
- package/lib/generators/cli/runtime/cli.d.ts +42 -0
- package/lib/generators/cli/runtime/cli.d.ts.map +1 -0
- package/lib/generators/cli/runtime/cli.js +582 -0
- package/lib/generators/cli/runtime/cli.js.map +1 -0
- package/lib/generators/compatibility.d.ts +10 -0
- package/lib/generators/compatibility.d.ts.map +1 -0
- package/lib/generators/compatibility.js +45 -0
- package/lib/generators/compatibility.js.map +1 -0
- package/lib/generators/go/client.d.ts +5 -0
- package/lib/generators/go/client.d.ts.map +1 -0
- package/lib/generators/go/client.js +34 -0
- package/lib/generators/go/client.js.map +1 -0
- package/lib/generators/go/descriptor.d.ts +6 -0
- package/lib/generators/go/descriptor.d.ts.map +1 -0
- package/lib/generators/go/descriptor.js +26 -0
- package/lib/generators/go/descriptor.js.map +1 -0
- package/lib/generators/go/index.d.ts +14 -0
- package/lib/generators/go/index.d.ts.map +1 -0
- package/lib/generators/go/index.js +240 -0
- package/lib/generators/go/index.js.map +1 -0
- package/lib/generators/go/models.d.ts +4 -0
- package/lib/generators/go/models.d.ts.map +1 -0
- package/lib/generators/go/models.js +125 -0
- package/lib/generators/go/models.js.map +1 -0
- package/lib/generators/go/naming.d.ts +15 -0
- package/lib/generators/go/naming.d.ts.map +1 -0
- package/lib/generators/go/naming.js +36 -0
- package/lib/generators/go/naming.js.map +1 -0
- package/lib/generators/go/operations.d.ts +16 -0
- package/lib/generators/go/operations.d.ts.map +1 -0
- package/lib/generators/go/operations.js +200 -0
- package/lib/generators/go/operations.js.map +1 -0
- package/lib/generators/go/pagination.d.ts +5 -0
- package/lib/generators/go/pagination.d.ts.map +1 -0
- package/lib/generators/go/pagination.js +93 -0
- package/lib/generators/go/pagination.js.map +1 -0
- package/lib/generators/go/types.d.ts +4 -0
- package/lib/generators/go/types.d.ts.map +1 -0
- package/lib/generators/go/types.js +48 -0
- package/lib/generators/go/types.js.map +1 -0
- package/lib/generators/index.d.ts +2 -3
- package/lib/generators/index.d.ts.map +1 -1
- package/lib/generators/index.js +31 -53
- package/lib/generators/index.js.map +1 -1
- package/lib/generators/meta.d.ts +13 -0
- package/lib/generators/meta.d.ts.map +1 -0
- package/lib/generators/meta.js +157 -0
- package/lib/generators/meta.js.map +1 -0
- package/lib/{emitters → generators/mock}/faker.d.ts +4 -5
- package/lib/generators/mock/faker.d.ts.map +1 -0
- package/lib/generators/mock/faker.js +180 -0
- package/lib/generators/mock/faker.js.map +1 -0
- package/lib/generators/{mock.d.ts → mock/index.d.ts} +2 -2
- package/lib/generators/mock/index.d.ts.map +1 -0
- package/lib/generators/{mock.js → mock/index.js} +8 -8
- package/lib/generators/mock/index.js.map +1 -0
- package/lib/{emitters/mock.d.ts → generators/mock/render.d.ts} +2 -3
- package/lib/generators/mock/render.d.ts.map +1 -0
- package/lib/generators/mock/render.js +228 -0
- package/lib/generators/mock/render.js.map +1 -0
- package/lib/{emitters → generators/mock}/sample.d.ts +1 -2
- package/lib/generators/mock/sample.d.ts.map +1 -0
- package/lib/generators/mock/sample.js.map +1 -0
- package/lib/generators/mock/values.d.ts +33 -0
- package/lib/generators/mock/values.d.ts.map +1 -0
- package/lib/generators/mock/values.js +46 -0
- package/lib/generators/mock/values.js.map +1 -0
- package/lib/generators/options.d.ts +7 -0
- package/lib/generators/options.d.ts.map +1 -0
- package/lib/generators/options.js +74 -0
- package/lib/generators/options.js.map +1 -0
- package/lib/generators/php/client.d.ts +5 -0
- package/lib/generators/php/client.d.ts.map +1 -0
- package/lib/generators/php/client.js +38 -0
- package/lib/generators/php/client.js.map +1 -0
- package/lib/generators/php/descriptor.d.ts +7 -0
- package/lib/generators/php/descriptor.d.ts.map +1 -0
- package/lib/generators/php/descriptor.js +42 -0
- package/lib/generators/php/descriptor.js.map +1 -0
- package/lib/generators/php/index.d.ts +14 -0
- package/lib/generators/php/index.d.ts.map +1 -0
- package/lib/generators/php/index.js +166 -0
- package/lib/generators/php/index.js.map +1 -0
- package/lib/generators/php/models.d.ts +8 -0
- package/lib/generators/php/models.d.ts.map +1 -0
- package/lib/generators/php/models.js +200 -0
- package/lib/generators/php/models.js.map +1 -0
- package/lib/generators/php/naming.d.ts +16 -0
- package/lib/generators/php/naming.d.ts.map +1 -0
- package/lib/generators/php/naming.js +31 -0
- package/lib/generators/php/naming.js.map +1 -0
- package/lib/generators/php/operations.d.ts +21 -0
- package/lib/generators/php/operations.d.ts.map +1 -0
- package/lib/generators/php/operations.js +156 -0
- package/lib/generators/php/operations.js.map +1 -0
- package/lib/generators/php/pagination.d.ts +5 -0
- package/lib/generators/php/pagination.d.ts.map +1 -0
- package/lib/generators/php/pagination.js +68 -0
- package/lib/generators/php/pagination.js.map +1 -0
- package/lib/generators/php/types.d.ts +27 -0
- package/lib/generators/php/types.d.ts.map +1 -0
- package/lib/generators/php/types.js +128 -0
- package/lib/generators/php/types.js.map +1 -0
- package/lib/generators/python/client.d.ts +6 -0
- package/lib/generators/python/client.d.ts.map +1 -0
- package/lib/generators/python/client.js +80 -0
- package/lib/generators/python/client.js.map +1 -0
- package/lib/generators/python/descriptor.d.ts +9 -0
- package/lib/generators/python/descriptor.d.ts.map +1 -0
- package/lib/generators/python/descriptor.js +38 -0
- package/lib/generators/python/descriptor.js.map +1 -0
- package/lib/generators/python/index.d.ts +15 -0
- package/lib/generators/python/index.d.ts.map +1 -0
- package/lib/generators/python/index.js +197 -0
- package/lib/generators/python/index.js.map +1 -0
- package/lib/generators/python/models.d.ts +31 -0
- package/lib/generators/python/models.d.ts.map +1 -0
- package/lib/generators/python/models.js +203 -0
- package/lib/generators/python/models.js.map +1 -0
- package/lib/generators/python/naming.d.ts +22 -0
- package/lib/generators/python/naming.d.ts.map +1 -0
- package/lib/generators/python/naming.js +28 -0
- package/lib/generators/python/naming.js.map +1 -0
- package/lib/generators/python/operations.d.ts +4 -0
- package/lib/generators/python/operations.d.ts.map +1 -0
- package/lib/generators/python/operations.js +108 -0
- package/lib/generators/python/operations.js.map +1 -0
- package/lib/generators/python/pagination.d.ts +5 -0
- package/lib/generators/python/pagination.d.ts.map +1 -0
- package/lib/generators/python/pagination.js +95 -0
- package/lib/generators/python/pagination.js.map +1 -0
- package/lib/generators/python/types.d.ts +4 -0
- package/lib/generators/python/types.d.ts.map +1 -0
- package/lib/generators/python/types.js +45 -0
- package/lib/generators/python/types.js.map +1 -0
- package/lib/generators/resolve.d.ts.map +1 -1
- package/lib/generators/resolve.js +92 -13
- package/lib/generators/resolve.js.map +1 -1
- package/lib/generators/{swr.d.ts → swr/index.d.ts} +3 -3
- package/lib/generators/swr/index.d.ts.map +1 -0
- package/lib/generators/{swr.js → swr/index.js} +7 -10
- package/lib/generators/swr/index.js.map +1 -0
- package/lib/{emitters/swr.d.ts → generators/swr/render.d.ts} +2 -4
- package/lib/generators/swr/render.d.ts.map +1 -0
- package/lib/generators/swr/render.js +57 -0
- package/lib/generators/swr/render.js.map +1 -0
- package/lib/generators/{tanstack-query.d.ts → tanstack-query/index.d.ts} +3 -3
- package/lib/generators/tanstack-query/index.d.ts.map +1 -0
- package/lib/generators/{tanstack-query.js → tanstack-query/index.js} +11 -10
- package/lib/generators/tanstack-query/index.js.map +1 -0
- package/lib/{emitters/tanstack-query.d.ts → generators/tanstack-query/render.d.ts} +6 -5
- package/lib/generators/tanstack-query/render.d.ts.map +1 -0
- package/lib/{emitters/tanstack-query.js → generators/tanstack-query/render.js} +33 -21
- package/lib/generators/tanstack-query/render.js.map +1 -0
- package/lib/generators/{transformers.d.ts → transformers/index.d.ts} +2 -2
- package/lib/generators/transformers/index.d.ts.map +1 -0
- package/lib/generators/{transformers.js → transformers/index.js} +11 -8
- package/lib/generators/transformers/index.js.map +1 -0
- package/lib/{emitters/transformers.d.ts → generators/transformers/render.d.ts} +2 -2
- package/lib/generators/transformers/render.d.ts.map +1 -0
- package/lib/{emitters/transformers.js → generators/transformers/render.js} +125 -165
- package/lib/generators/transformers/render.js.map +1 -0
- package/lib/generators/types.d.ts +190 -12
- package/lib/generators/types.d.ts.map +1 -1
- package/lib/generators/typescript/banner.d.ts +12 -0
- package/lib/generators/typescript/banner.d.ts.map +1 -0
- package/lib/{emitters/emit-options.js → generators/typescript/banner.js} +2 -3
- package/lib/generators/typescript/banner.js.map +1 -0
- package/lib/generators/typescript/client.d.ts +25 -0
- package/lib/generators/typescript/client.d.ts.map +1 -0
- package/lib/generators/typescript/client.js +207 -0
- package/lib/generators/typescript/client.js.map +1 -0
- package/lib/generators/typescript/descriptor.d.ts +11 -0
- package/lib/generators/typescript/descriptor.d.ts.map +1 -0
- package/lib/generators/typescript/descriptor.js +97 -0
- package/lib/generators/typescript/descriptor.js.map +1 -0
- package/lib/generators/typescript/index.d.ts +20 -0
- package/lib/generators/typescript/index.d.ts.map +1 -0
- package/lib/generators/typescript/index.js +80 -0
- package/lib/generators/typescript/index.js.map +1 -0
- package/lib/generators/typescript/inline-runtime.d.ts +21 -0
- package/lib/generators/typescript/inline-runtime.d.ts.map +1 -0
- package/lib/generators/typescript/inline-runtime.js +114 -0
- package/lib/generators/typescript/inline-runtime.js.map +1 -0
- package/lib/generators/typescript/operation-signature.d.ts +23 -0
- package/lib/generators/typescript/operation-signature.d.ts.map +1 -0
- package/lib/generators/typescript/operation-signature.js +41 -0
- package/lib/generators/typescript/operation-signature.js.map +1 -0
- package/lib/generators/typescript/operation-types.d.ts +9 -0
- package/lib/generators/typescript/operation-types.d.ts.map +1 -0
- package/lib/generators/typescript/operation-types.js +11 -0
- package/lib/generators/typescript/operation-types.js.map +1 -0
- package/lib/generators/typescript/operations.d.ts +60 -0
- package/lib/generators/typescript/operations.d.ts.map +1 -0
- package/lib/generators/typescript/operations.js +386 -0
- package/lib/generators/typescript/operations.js.map +1 -0
- package/lib/generators/typescript/response-headers.d.ts +12 -0
- package/lib/generators/typescript/response-headers.d.ts.map +1 -0
- package/lib/generators/typescript/response-headers.js +40 -0
- package/lib/generators/typescript/response-headers.js.map +1 -0
- package/lib/generators/typescript/runtime/auth.d.ts.map +1 -0
- package/lib/generators/typescript/runtime/auth.js.map +1 -0
- package/lib/{runtime → generators/typescript/runtime}/create-client.d.ts +7 -2
- package/lib/generators/typescript/runtime/create-client.d.ts.map +1 -0
- package/lib/{runtime → generators/typescript/runtime}/create-client.js +84 -30
- package/lib/generators/typescript/runtime/create-client.js.map +1 -0
- package/lib/generators/typescript/runtime/errors.d.ts.map +1 -0
- package/lib/generators/typescript/runtime/errors.js.map +1 -0
- package/lib/generators/typescript/runtime/index.d.ts.map +1 -0
- package/lib/generators/typescript/runtime/index.js.map +1 -0
- package/lib/generators/typescript/runtime/multipart.d.ts.map +1 -0
- package/lib/generators/typescript/runtime/multipart.js.map +1 -0
- package/lib/{runtime → generators/typescript/runtime}/paginate.d.ts +2 -2
- package/lib/generators/typescript/runtime/paginate.d.ts.map +1 -0
- package/lib/{runtime → generators/typescript/runtime}/paginate.js +12 -12
- package/lib/generators/typescript/runtime/paginate.js.map +1 -0
- package/lib/generators/typescript/runtime/parse.d.ts.map +1 -0
- package/lib/generators/typescript/runtime/parse.js.map +1 -0
- package/lib/generators/typescript/runtime/retry.d.ts.map +1 -0
- package/lib/generators/typescript/runtime/retry.js.map +1 -0
- package/lib/generators/typescript/runtime/send.d.ts.map +1 -0
- package/lib/generators/typescript/runtime/send.js.map +1 -0
- package/lib/generators/typescript/runtime/setup.d.ts.map +1 -0
- package/lib/generators/typescript/runtime/setup.js.map +1 -0
- package/lib/generators/typescript/runtime/sse.d.ts.map +1 -0
- package/lib/generators/typescript/runtime/sse.js.map +1 -0
- package/lib/{runtime → generators/typescript/runtime}/types.d.ts +17 -95
- package/lib/generators/typescript/runtime/types.d.ts.map +1 -0
- package/lib/generators/typescript/runtime/types.js.map +1 -0
- package/lib/generators/typescript/runtime/url.d.ts.map +1 -0
- package/lib/generators/typescript/runtime/url.js.map +1 -0
- package/lib/generators/typescript/type-guards.d.ts +4 -0
- package/lib/generators/typescript/type-guards.d.ts.map +1 -0
- package/lib/{emitters → generators/typescript}/type-guards.js +18 -52
- package/lib/generators/typescript/type-guards.js.map +1 -0
- package/lib/generators/typescript/types.d.ts +8 -0
- package/lib/generators/typescript/types.d.ts.map +1 -0
- package/lib/generators/typescript/types.js +132 -0
- package/lib/generators/typescript/types.js.map +1 -0
- package/lib/generators/{zod.d.ts → zod/index.d.ts} +2 -2
- package/lib/generators/zod/index.d.ts.map +1 -0
- package/lib/generators/{zod.js → zod/index.js} +5 -7
- package/lib/generators/zod/index.js.map +1 -0
- package/lib/{emitters/zod.d.ts → generators/zod/schemas.d.ts} +4 -5
- package/lib/generators/zod/schemas.d.ts.map +1 -0
- package/lib/{emitters/zod.js → generators/zod/schemas.js} +118 -154
- package/lib/generators/zod/schemas.js.map +1 -0
- package/lib/index.d.ts +8 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +18 -11
- package/lib/index.js.map +1 -1
- package/lib/intermediate-representation/build.d.ts +8 -1
- package/lib/intermediate-representation/build.d.ts.map +1 -1
- package/lib/intermediate-representation/build.js +59 -4
- package/lib/intermediate-representation/build.js.map +1 -1
- package/lib/intermediate-representation/model.d.ts +26 -1
- package/lib/intermediate-representation/model.d.ts.map +1 -1
- package/lib/intermediate-representation/model.js.map +1 -1
- package/lib/intermediate-representation/sanitize-identifiers.d.ts +1 -10
- package/lib/intermediate-representation/sanitize-identifiers.d.ts.map +1 -1
- package/lib/intermediate-representation/sanitize-identifiers.js +37 -38
- package/lib/intermediate-representation/sanitize-identifiers.js.map +1 -1
- package/lib/{emitters/pagination.d.ts → pagination.d.ts} +39 -15
- package/lib/pagination.d.ts.map +1 -0
- package/lib/{emitters/pagination.js → pagination.js} +13 -52
- package/lib/pagination.js.map +1 -0
- package/lib/pipeline.d.ts +17 -0
- package/lib/pipeline.d.ts.map +1 -0
- package/lib/pipeline.js +244 -0
- package/lib/pipeline.js.map +1 -0
- package/lib/plugin.d.ts +4 -4
- package/lib/plugin.d.ts.map +1 -1
- package/lib/plugin.js +12 -9
- package/lib/plugin.js.map +1 -1
- package/lib/printers/go.d.ts +33 -0
- package/lib/printers/go.d.ts.map +1 -0
- package/lib/printers/go.js +209 -0
- package/lib/printers/go.js.map +1 -0
- package/lib/printers/index.d.ts +5 -0
- package/lib/printers/index.d.ts.map +1 -0
- package/lib/printers/index.js +9 -0
- package/lib/printers/index.js.map +1 -0
- package/lib/printers/php.d.ts +21 -0
- package/lib/printers/php.d.ts.map +1 -0
- package/lib/printers/php.js +68 -0
- package/lib/printers/php.js.map +1 -0
- package/lib/printers/python.d.ts +31 -0
- package/lib/printers/python.d.ts.map +1 -0
- package/lib/printers/python.js +101 -0
- package/lib/printers/python.js.map +1 -0
- package/lib/printers/typescript.d.ts +82 -0
- package/lib/printers/typescript.d.ts.map +1 -0
- package/lib/printers/typescript.js +268 -0
- package/lib/printers/typescript.js.map +1 -0
- package/lib/reserved-names.d.ts +8 -0
- package/lib/reserved-names.d.ts.map +1 -0
- package/lib/{emitters/reserved-names.js → reserved-names.js} +16 -27
- package/lib/reserved-names.js.map +1 -0
- package/lib/runtime-contract.d.ts +62 -2
- package/lib/runtime-contract.d.ts.map +1 -1
- package/lib/runtime-contract.js +3 -3
- package/lib/runtime-contract.js.map +1 -1
- package/lib/runtime-sources/go.d.ts +2 -0
- package/lib/runtime-sources/go.d.ts.map +1 -0
- package/lib/runtime-sources/go.js +3 -0
- package/lib/runtime-sources/go.js.map +1 -0
- package/lib/runtime-sources/php.d.ts +2 -0
- package/lib/runtime-sources/php.d.ts.map +1 -0
- package/lib/runtime-sources/php.js +3 -0
- package/lib/runtime-sources/php.js.map +1 -0
- package/lib/runtime-sources/python.d.ts +12 -0
- package/lib/runtime-sources/python.d.ts.map +1 -0
- package/lib/runtime-sources/python.js +12 -0
- package/lib/runtime-sources/python.js.map +1 -0
- package/lib/runtime-sources/typescript.d.ts +36 -0
- package/lib/runtime-sources/typescript.d.ts.map +1 -0
- package/lib/runtime-sources/typescript.js +152 -0
- package/lib/runtime-sources/typescript.js.map +1 -0
- package/lib/runtime-sources.d.ts +5 -0
- package/lib/runtime-sources.d.ts.map +1 -0
- package/lib/runtime-sources.js +10 -0
- package/lib/runtime-sources.js.map +1 -0
- package/lib/setup-bake.d.ts.map +1 -0
- package/lib/{emitters/setup-bake.js → setup-bake.js} +11 -2
- package/lib/setup-bake.js.map +1 -0
- package/lib/types.d.ts +38 -8
- package/lib/types.d.ts.map +1 -1
- package/package.json +40 -4
- package/lib/emitters/auth.d.ts +0 -14
- package/lib/emitters/auth.d.ts.map +0 -1
- package/lib/emitters/auth.js +0 -30
- package/lib/emitters/auth.js.map +0 -1
- package/lib/emitters/client-assembly.d.ts +0 -15
- package/lib/emitters/client-assembly.d.ts.map +0 -1
- package/lib/emitters/client-assembly.js +0 -358
- package/lib/emitters/client-assembly.js.map +0 -1
- package/lib/emitters/descriptor.d.ts +0 -22
- package/lib/emitters/descriptor.d.ts.map +0 -1
- package/lib/emitters/descriptor.js +0 -199
- package/lib/emitters/descriptor.js.map +0 -1
- package/lib/emitters/emit-options.d.ts +0 -67
- package/lib/emitters/emit-options.d.ts.map +0 -1
- package/lib/emitters/emit-options.js.map +0 -1
- package/lib/emitters/faker.d.ts.map +0 -1
- package/lib/emitters/faker.js +0 -221
- package/lib/emitters/faker.js.map +0 -1
- package/lib/emitters/identifier.d.ts +0 -34
- package/lib/emitters/identifier.d.ts.map +0 -1
- package/lib/emitters/identifier.js +0 -104
- package/lib/emitters/identifier.js.map +0 -1
- package/lib/emitters/inline-runtime.d.ts +0 -11
- package/lib/emitters/inline-runtime.d.ts.map +0 -1
- package/lib/emitters/inline-runtime.js +0 -99
- package/lib/emitters/inline-runtime.js.map +0 -1
- package/lib/emitters/jsdoc.d.ts +0 -9
- package/lib/emitters/jsdoc.d.ts.map +0 -1
- package/lib/emitters/jsdoc.js +0 -83
- package/lib/emitters/jsdoc.js.map +0 -1
- package/lib/emitters/mock.d.ts.map +0 -1
- package/lib/emitters/mock.js +0 -265
- package/lib/emitters/mock.js.map +0 -1
- package/lib/emitters/operation-aliases.d.ts +0 -27
- package/lib/emitters/operation-aliases.d.ts.map +0 -1
- package/lib/emitters/operation-aliases.js +0 -150
- package/lib/emitters/operation-aliases.js.map +0 -1
- package/lib/emitters/operation-signature.d.ts +0 -24
- package/lib/emitters/operation-signature.d.ts.map +0 -1
- package/lib/emitters/operation-signature.js +0 -42
- package/lib/emitters/operation-signature.js.map +0 -1
- package/lib/emitters/operation-types.d.ts +0 -32
- package/lib/emitters/operation-types.d.ts.map +0 -1
- package/lib/emitters/operation-types.js +0 -117
- package/lib/emitters/operation-types.js.map +0 -1
- package/lib/emitters/operations.d.ts +0 -41
- package/lib/emitters/operations.d.ts.map +0 -1
- package/lib/emitters/operations.js +0 -35
- package/lib/emitters/operations.js.map +0 -1
- package/lib/emitters/pagination.d.ts.map +0 -1
- package/lib/emitters/pagination.js.map +0 -1
- package/lib/emitters/reserved-names.d.ts +0 -5
- package/lib/emitters/reserved-names.d.ts.map +0 -1
- package/lib/emitters/reserved-names.js.map +0 -1
- package/lib/emitters/response-headers.d.ts +0 -14
- package/lib/emitters/response-headers.d.ts.map +0 -1
- package/lib/emitters/response-headers.js +0 -91
- package/lib/emitters/response-headers.js.map +0 -1
- package/lib/emitters/runtime-sources.d.ts +0 -16
- package/lib/emitters/runtime-sources.d.ts.map +0 -1
- package/lib/emitters/runtime-sources.js +0 -16
- package/lib/emitters/runtime-sources.js.map +0 -1
- package/lib/emitters/sample.d.ts.map +0 -1
- package/lib/emitters/sample.js.map +0 -1
- package/lib/emitters/setup-bake.d.ts.map +0 -1
- package/lib/emitters/setup-bake.js.map +0 -1
- package/lib/emitters/sse.d.ts +0 -10
- package/lib/emitters/sse.d.ts.map +0 -1
- package/lib/emitters/sse.js +0 -46
- package/lib/emitters/sse.js.map +0 -1
- package/lib/emitters/support.d.ts +0 -18
- package/lib/emitters/support.d.ts.map +0 -1
- package/lib/emitters/support.js +0 -37
- package/lib/emitters/support.js.map +0 -1
- package/lib/emitters/swr.d.ts.map +0 -1
- package/lib/emitters/swr.js +0 -88
- package/lib/emitters/swr.js.map +0 -1
- package/lib/emitters/tanstack-query.d.ts.map +0 -1
- package/lib/emitters/tanstack-query.js.map +0 -1
- package/lib/emitters/transformers.d.ts.map +0 -1
- package/lib/emitters/transformers.js.map +0 -1
- package/lib/emitters/ts.d.ts +0 -42
- package/lib/emitters/ts.d.ts.map +0 -1
- package/lib/emitters/ts.js +0 -116
- package/lib/emitters/ts.js.map +0 -1
- package/lib/emitters/type-guards.d.ts +0 -21
- package/lib/emitters/type-guards.d.ts.map +0 -1
- package/lib/emitters/type-guards.js.map +0 -1
- package/lib/emitters/types.d.ts +0 -15
- package/lib/emitters/types.d.ts.map +0 -1
- package/lib/emitters/types.js +0 -125
- package/lib/emitters/types.js.map +0 -1
- package/lib/emitters/wrapper-support.d.ts.map +0 -1
- package/lib/emitters/wrapper-support.js +0 -127
- package/lib/emitters/wrapper-support.js.map +0 -1
- package/lib/emitters/zod.d.ts.map +0 -1
- package/lib/emitters/zod.js.map +0 -1
- package/lib/generators/anchor.d.ts +0 -9
- package/lib/generators/anchor.d.ts.map +0 -1
- package/lib/generators/anchor.js +0 -10
- package/lib/generators/anchor.js.map +0 -1
- package/lib/generators/mock.d.ts.map +0 -1
- package/lib/generators/mock.js.map +0 -1
- package/lib/generators/sdk.d.ts +0 -12
- package/lib/generators/sdk.d.ts.map +0 -1
- package/lib/generators/sdk.js +0 -26
- package/lib/generators/sdk.js.map +0 -1
- package/lib/generators/swr.d.ts.map +0 -1
- package/lib/generators/swr.js.map +0 -1
- package/lib/generators/tanstack-query.d.ts.map +0 -1
- package/lib/generators/tanstack-query.js.map +0 -1
- package/lib/generators/transformers.d.ts.map +0 -1
- package/lib/generators/transformers.js.map +0 -1
- package/lib/generators/zod.d.ts.map +0 -1
- package/lib/generators/zod.js.map +0 -1
- package/lib/runtime/auth.d.ts.map +0 -1
- package/lib/runtime/auth.js.map +0 -1
- package/lib/runtime/create-client.d.ts.map +0 -1
- package/lib/runtime/create-client.js.map +0 -1
- package/lib/runtime/errors.d.ts.map +0 -1
- package/lib/runtime/errors.js.map +0 -1
- package/lib/runtime/index.d.ts.map +0 -1
- package/lib/runtime/index.js.map +0 -1
- package/lib/runtime/multipart.d.ts.map +0 -1
- package/lib/runtime/multipart.js.map +0 -1
- package/lib/runtime/paginate.d.ts.map +0 -1
- package/lib/runtime/paginate.js.map +0 -1
- package/lib/runtime/parse.d.ts.map +0 -1
- package/lib/runtime/parse.js.map +0 -1
- package/lib/runtime/retry.d.ts.map +0 -1
- package/lib/runtime/retry.js.map +0 -1
- package/lib/runtime/send.d.ts.map +0 -1
- package/lib/runtime/send.js.map +0 -1
- package/lib/runtime/setup.d.ts.map +0 -1
- package/lib/runtime/setup.js.map +0 -1
- package/lib/runtime/sse.d.ts.map +0 -1
- package/lib/runtime/sse.js.map +0 -1
- package/lib/runtime/types.d.ts.map +0 -1
- package/lib/runtime/types.js.map +0 -1
- package/lib/runtime/url.d.ts.map +0 -1
- package/lib/runtime/url.js.map +0 -1
- /package/lib/{emitters → generators/mock}/sample.js +0 -0
- /package/lib/{runtime → generators/typescript/runtime}/auth.d.ts +0 -0
- /package/lib/{runtime → generators/typescript/runtime}/auth.js +0 -0
- /package/lib/{runtime → generators/typescript/runtime}/errors.d.ts +0 -0
- /package/lib/{runtime → generators/typescript/runtime}/errors.js +0 -0
- /package/lib/{runtime → generators/typescript/runtime}/index.d.ts +0 -0
- /package/lib/{runtime → generators/typescript/runtime}/index.js +0 -0
- /package/lib/{runtime → generators/typescript/runtime}/multipart.d.ts +0 -0
- /package/lib/{runtime → generators/typescript/runtime}/multipart.js +0 -0
- /package/lib/{runtime → generators/typescript/runtime}/parse.d.ts +0 -0
- /package/lib/{runtime → generators/typescript/runtime}/parse.js +0 -0
- /package/lib/{runtime → generators/typescript/runtime}/retry.d.ts +0 -0
- /package/lib/{runtime → generators/typescript/runtime}/retry.js +0 -0
- /package/lib/{runtime → generators/typescript/runtime}/send.d.ts +0 -0
- /package/lib/{runtime → generators/typescript/runtime}/send.js +0 -0
- /package/lib/{runtime → generators/typescript/runtime}/setup.d.ts +0 -0
- /package/lib/{runtime → generators/typescript/runtime}/setup.js +0 -0
- /package/lib/{runtime → generators/typescript/runtime}/sse.d.ts +0 -0
- /package/lib/{runtime → generators/typescript/runtime}/sse.js +0 -0
- /package/lib/{runtime → generators/typescript/runtime}/types.js +0 -0
- /package/lib/{runtime → generators/typescript/runtime}/url.d.ts +0 -0
- /package/lib/{runtime → generators/typescript/runtime}/url.js +0 -0
- /package/lib/{emitters/setup-bake.d.ts → setup-bake.d.ts} +0 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// Ejected from @redocly/client-generator@0.4.0 — the built-in "typescript" generator.
|
|
2
|
+
// This file is yours: edit freely; the generated client stays machine-owned and is
|
|
3
|
+
// rebuilt by `redocly generate-client`. Newer generator versions merge in with
|
|
4
|
+
// `redocly eject-generator typescript --update`.
|
|
5
|
+
// The shared calling-convention description for an operation. The sdk (which emits each
|
|
6
|
+
// operation's input type) and the wrapper generators (which forward it) read slot presence
|
|
7
|
+
// and `<Op>Variables` naming from this one source, so a call and its type cannot drift.
|
|
8
|
+
|
|
9
|
+
import type { OperationModel, ParamModel } from '@redocly/client-generator';
|
|
10
|
+
import { pascalCase } from '@redocly/client-generator/printers/typescript';
|
|
11
|
+
|
|
12
|
+
export type OperationSignature = {
|
|
13
|
+
/** Slot presence — which input layers the operation has. */
|
|
14
|
+
hasQuery: boolean;
|
|
15
|
+
hasBody: boolean;
|
|
16
|
+
hasHeaders: boolean;
|
|
17
|
+
hasCookies: boolean;
|
|
18
|
+
/** Any input at all — i.e. a `<Op>Variables` type exists for the operation. */
|
|
19
|
+
hasInputs: boolean;
|
|
20
|
+
/** Whether the input argument is required (else it defaults to `= {}`). */
|
|
21
|
+
varsRequired: boolean;
|
|
22
|
+
/** The `<Op>Variables` type-alias name. */
|
|
23
|
+
variablesTypeName: string;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Path parameters in URL-template order — the order a reader sees them in the path, and the
|
|
28
|
+
* order the old positional signature used. A parameter declared but absent from the template
|
|
29
|
+
* is dropped: it has nowhere to go in the URL, so asking for a value would mislead.
|
|
30
|
+
*/
|
|
31
|
+
export function templatePathParams(op: OperationModel): ParamModel[] {
|
|
32
|
+
const byName = new Map(op.pathParams.map((param) => [param.name, param] as const));
|
|
33
|
+
const ordered: ParamModel[] = [];
|
|
34
|
+
for (const match of op.path.matchAll(/\{([^{}]+)\}/g)) {
|
|
35
|
+
const param = byName.get(match[1]);
|
|
36
|
+
if (param !== undefined) ordered.push(param);
|
|
37
|
+
}
|
|
38
|
+
return ordered;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Compute the calling-convention description for `op`. Pure; no AST. */
|
|
42
|
+
export function operationSignature(op: OperationModel): OperationSignature {
|
|
43
|
+
const pathParams = templatePathParams(op);
|
|
44
|
+
const hasQuery = op.queryParams.length > 0;
|
|
45
|
+
const hasBody = Boolean(op.requestBody);
|
|
46
|
+
const hasHeaders = op.headerParams.length > 0;
|
|
47
|
+
const hasCookies = op.cookieParams.length > 0;
|
|
48
|
+
return {
|
|
49
|
+
hasQuery,
|
|
50
|
+
hasBody,
|
|
51
|
+
hasHeaders,
|
|
52
|
+
hasCookies,
|
|
53
|
+
hasInputs: pathParams.length > 0 || hasQuery || hasBody || hasHeaders || hasCookies,
|
|
54
|
+
varsRequired:
|
|
55
|
+
pathParams.length > 0 ||
|
|
56
|
+
op.queryParams.some((p) => p.required) ||
|
|
57
|
+
(op.requestBody?.required ?? false) ||
|
|
58
|
+
op.headerParams.some((p) => p.required) ||
|
|
59
|
+
op.cookieParams.some((p) => p.required),
|
|
60
|
+
variablesTypeName: `${pascalCase(op.name)}Variables`,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Ejected from @redocly/client-generator@0.4.0 — the built-in "typescript" generator.
|
|
2
|
+
// This file is yours: edit freely; the generated client stays machine-owned and is
|
|
3
|
+
// rebuilt by `redocly generate-client`. Newer generator versions merge in with
|
|
4
|
+
// `redocly eject-generator typescript --update`.
|
|
5
|
+
// Shared operation-shape predicates.
|
|
6
|
+
|
|
7
|
+
import type { RequestBodyModel } from '@redocly/client-generator';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* A multipart body whose schema is a concrete object — the case worth typing. Such a body
|
|
11
|
+
* is emitted as its object shape (binary fields → `Blob`); the runtime serializes it to
|
|
12
|
+
* `FormData` (`runtime/multipart.ts`) after the onRequest chain. Multipart bodies with a
|
|
13
|
+
* non-object schema can't be typed field-by-field, so they keep the raw `FormData` escape hatch.
|
|
14
|
+
*/
|
|
15
|
+
export function isTypedMultipart(rb: RequestBodyModel): boolean {
|
|
16
|
+
return rb.contentType === 'multipart/form-data' && rb.schema.kind === 'object';
|
|
17
|
+
}
|
|
@@ -0,0 +1,524 @@
|
|
|
1
|
+
// Ejected from @redocly/client-generator@0.4.0 — the built-in "typescript" generator.
|
|
2
|
+
// This file is yours: edit freely; the generated client stays machine-owned and is
|
|
3
|
+
// rebuilt by `redocly generate-client`. Newer generator versions merge in with
|
|
4
|
+
// `redocly eject-generator typescript --update`.
|
|
5
|
+
import {
|
|
6
|
+
allOperations,
|
|
7
|
+
type ApiModel,
|
|
8
|
+
type ArgsStyle,
|
|
9
|
+
type DateType,
|
|
10
|
+
type ErrorMode,
|
|
11
|
+
type ModelPagination,
|
|
12
|
+
type NamedSchemaModel,
|
|
13
|
+
type OperationModel,
|
|
14
|
+
type ParamModel,
|
|
15
|
+
type RequestBodyModel,
|
|
16
|
+
type ResponseBodyModel,
|
|
17
|
+
type SchemaModel,
|
|
18
|
+
} from '@redocly/client-generator';
|
|
19
|
+
// The operation-level renderers behind the client assembly: the `Ops` type map,
|
|
20
|
+
// the `<Op>*` alias cluster, the flat call sugar, and the split layout's schema
|
|
21
|
+
// import list — all derived from the IR and the shared `EmitContext`.
|
|
22
|
+
import { pascalCase, safeIdent } from '@redocly/client-generator/printers/typescript';
|
|
23
|
+
|
|
24
|
+
import { operationSignature, templatePathParams } from './operation-signature.ts';
|
|
25
|
+
import { isTypedMultipart } from './operation-types.ts';
|
|
26
|
+
import { responseHeadersTypeText } from './response-headers.ts';
|
|
27
|
+
import { tsJsdoc, tsType } from './types.ts';
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* The emit configuration every operation shares. Bundling it into one value keeps
|
|
31
|
+
* it out of the positional parameter lists of the operation emitters (which would
|
|
32
|
+
* otherwise thread the same arguments through every layer, inviting transposition
|
|
33
|
+
* bugs). Per-call structural data (response type, ordered path params, …) stays an
|
|
34
|
+
* explicit argument; only this cross-cutting config travels as `ctx`.
|
|
35
|
+
*/
|
|
36
|
+
export type EmitContext = {
|
|
37
|
+
argsStyle: ArgsStyle;
|
|
38
|
+
errorMode: ErrorMode;
|
|
39
|
+
dateType: DateType;
|
|
40
|
+
/** Names of every exported schema, used for `<Op>*` alias collision suppression. */
|
|
41
|
+
schemaNames: Set<string>;
|
|
42
|
+
/** Named schemas — used to resolve `$ref` / `allOf` wrappers on response-header types. */
|
|
43
|
+
schemas?: readonly NamedSchemaModel[];
|
|
44
|
+
/** Resolved auto-pagination per operation name (absent ⇒ nothing paginates). */
|
|
45
|
+
pagination?: ModelPagination;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const INDENT = ' ';
|
|
49
|
+
|
|
50
|
+
/** The request-body TS type: special wrapper types per content-type, else the schema. */
|
|
51
|
+
export function bodyTypeText(rb: RequestBodyModel, dateType: DateType, indent = ''): string {
|
|
52
|
+
if (isTypedMultipart(rb)) return tsType(rb.schema, dateType, indent);
|
|
53
|
+
switch (rb.contentType) {
|
|
54
|
+
case 'multipart/form-data':
|
|
55
|
+
return 'FormData';
|
|
56
|
+
case 'application/x-www-form-urlencoded':
|
|
57
|
+
return 'URLSearchParams';
|
|
58
|
+
case 'application/octet-stream':
|
|
59
|
+
return 'Blob | ArrayBuffer';
|
|
60
|
+
default:
|
|
61
|
+
return tsType(rb.schema, dateType, indent);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** The `{ … }` type literal for a params object (query or headers), with per-prop JSDoc. */
|
|
66
|
+
export function paramsTypeText(params: ParamModel[], dateType: DateType, indent = ''): string {
|
|
67
|
+
const inner = indent + INDENT;
|
|
68
|
+
const lines = params.flatMap((param) => [
|
|
69
|
+
...tsJsdoc(param.description, param.schema.metadata, inner),
|
|
70
|
+
`${inner}${safeIdent(param.name)}${param.required ? '' : '?'}: ${tsType(param.schema, dateType, inner)};`,
|
|
71
|
+
]);
|
|
72
|
+
return lines.length === 0 ? '{}' : `{\n${lines.join('\n')}\n${indent}}`;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** The success-response type + kind (JSON preferred; binary/text fall back; deduped union). */
|
|
76
|
+
export function responseText(
|
|
77
|
+
responses: ResponseBodyModel[],
|
|
78
|
+
dateType: DateType,
|
|
79
|
+
indent = ''
|
|
80
|
+
): { type: string; kind: 'json' | 'blob' | 'text' | 'void' } {
|
|
81
|
+
if (responses.length === 0) return { type: 'void', kind: 'void' };
|
|
82
|
+
const jsonResponse = responses.find((r) => r.contentType.toLowerCase().includes('json'));
|
|
83
|
+
if (jsonResponse) return { type: tsType(jsonResponse.schema, dateType, indent), kind: 'json' };
|
|
84
|
+
const members: string[] = [];
|
|
85
|
+
const seen = new Set<string>();
|
|
86
|
+
let hasBinary = false;
|
|
87
|
+
let hasText = false;
|
|
88
|
+
for (const response of responses) {
|
|
89
|
+
let member: string;
|
|
90
|
+
if (
|
|
91
|
+
response.contentType.startsWith('image/') ||
|
|
92
|
+
response.contentType === 'application/octet-stream'
|
|
93
|
+
) {
|
|
94
|
+
member = 'Blob';
|
|
95
|
+
hasBinary = true;
|
|
96
|
+
} else if (response.contentType.startsWith('text/')) {
|
|
97
|
+
member = 'string';
|
|
98
|
+
hasText = true;
|
|
99
|
+
} else {
|
|
100
|
+
member = tsType(response.schema, dateType, indent);
|
|
101
|
+
}
|
|
102
|
+
if (seen.has(member)) continue;
|
|
103
|
+
seen.add(member);
|
|
104
|
+
members.push(member);
|
|
105
|
+
}
|
|
106
|
+
return { type: members.join(' | '), kind: hasBinary ? 'blob' : hasText ? 'text' : 'json' };
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** The deduped error-response body types, or `[]` when none. */
|
|
110
|
+
export function errorTypeTexts(
|
|
111
|
+
responses: ResponseBodyModel[],
|
|
112
|
+
dateType: DateType,
|
|
113
|
+
indent = ''
|
|
114
|
+
): string[] {
|
|
115
|
+
const seen = new Set<string>();
|
|
116
|
+
const members: string[] = [];
|
|
117
|
+
for (const response of responses) {
|
|
118
|
+
const member = tsType(response.schema, dateType, indent);
|
|
119
|
+
if (seen.has(member)) continue;
|
|
120
|
+
seen.add(member);
|
|
121
|
+
members.push(member);
|
|
122
|
+
}
|
|
123
|
+
return members;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** The TS type of a streamed event payload (`string` when no schema is declared). */
|
|
127
|
+
function sseEventText(op: OperationModel, dateType: DateType, indent = ''): string {
|
|
128
|
+
const schema = op.sse?.eventSchema;
|
|
129
|
+
return schema ? tsType(schema, dateType, indent) : 'string';
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** A `<key>(?): <Alias>` line, inlining the type when `<Alias>` collides with a schema. */
|
|
133
|
+
function inputPropLine(
|
|
134
|
+
key: string,
|
|
135
|
+
alias: string,
|
|
136
|
+
inlineType: () => string,
|
|
137
|
+
required: boolean,
|
|
138
|
+
schemaNames: Set<string>,
|
|
139
|
+
indent: string
|
|
140
|
+
): string {
|
|
141
|
+
const type = schemaNames.has(alias) ? inlineType() : alias;
|
|
142
|
+
return `${indent}${key}${required ? '' : '?'}: ${type};`;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** The named schema a `ref` chain ends at, for deciding whether a body can merge. */
|
|
146
|
+
function resolvedSchema(
|
|
147
|
+
schema: SchemaModel,
|
|
148
|
+
schemas: readonly NamedSchemaModel[] | undefined
|
|
149
|
+
): SchemaModel | undefined {
|
|
150
|
+
const seen = new Set<string>();
|
|
151
|
+
let current = schema;
|
|
152
|
+
while (current.kind === 'ref') {
|
|
153
|
+
const { name } = current;
|
|
154
|
+
if (seen.has(name)) return undefined;
|
|
155
|
+
seen.add(name);
|
|
156
|
+
const named = schemas?.find((candidate) => candidate.name === name);
|
|
157
|
+
if (named === undefined) return undefined;
|
|
158
|
+
current = named.schema;
|
|
159
|
+
}
|
|
160
|
+
return current;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* The property names of a body a merged call spreads. An `allOf` composition contributes the
|
|
165
|
+
* names of every member, because that is what the merged object ends up carrying; a member
|
|
166
|
+
* that is not an object makes the whole body unspreadable.
|
|
167
|
+
*/
|
|
168
|
+
function mergedBodyProperties(
|
|
169
|
+
schema: SchemaModel,
|
|
170
|
+
schemas: readonly NamedSchemaModel[] | undefined
|
|
171
|
+
): string[] | undefined {
|
|
172
|
+
const resolved = resolvedSchema(schema, schemas);
|
|
173
|
+
if (resolved?.kind === 'object') return resolved.properties.map((property) => property.name);
|
|
174
|
+
if (resolved?.kind !== 'intersection') return undefined;
|
|
175
|
+
// Deduplicated: `allOf` members routinely redeclare a property to refine it, and the
|
|
176
|
+
// merged body still carries one key for it — counting it twice would read as a collision
|
|
177
|
+
// and push a mergeable operation back to the namespaced shape.
|
|
178
|
+
const names = new Set<string>();
|
|
179
|
+
for (const member of resolved.members) {
|
|
180
|
+
const memberNames = mergedBodyProperties(member, schemas);
|
|
181
|
+
if (memberNames === undefined) return undefined;
|
|
182
|
+
for (const name of memberNames) names.add(name);
|
|
183
|
+
}
|
|
184
|
+
return [...names];
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* How a flat-style call spells one operation's inputs. Every parameter sits at one level,
|
|
189
|
+
* and a REQUIRED object body contributes its own properties — an optional body cannot
|
|
190
|
+
* (omitting it and omitting its required properties would look the same), and neither can
|
|
191
|
+
* an array, scalar, or binary body, so those keep the `body` key.
|
|
192
|
+
*
|
|
193
|
+
* When one name appears in two layers (a path and a query parameter of the same name, which
|
|
194
|
+
* OpenAPI permits) a merged call cannot say which is which, so that operation keeps the
|
|
195
|
+
* namespaced shape. The caller reports it once.
|
|
196
|
+
*/
|
|
197
|
+
export function flatInputShape(
|
|
198
|
+
op: OperationModel,
|
|
199
|
+
schemas: readonly NamedSchemaModel[] | undefined
|
|
200
|
+
): { mergeBody: boolean } | { collisions: string[] } {
|
|
201
|
+
const params = [
|
|
202
|
+
...templatePathParams(op),
|
|
203
|
+
...op.queryParams,
|
|
204
|
+
...op.headerParams,
|
|
205
|
+
...op.cookieParams,
|
|
206
|
+
];
|
|
207
|
+
const bodyProperties =
|
|
208
|
+
(op.requestBody?.required ?? false) && op.requestBody !== undefined
|
|
209
|
+
? mergedBodyProperties(op.requestBody.schema, schemas)
|
|
210
|
+
: undefined;
|
|
211
|
+
const mergeBody = bodyProperties !== undefined;
|
|
212
|
+
const counts = new Map<string, number>();
|
|
213
|
+
for (const param of params) counts.set(param.name, (counts.get(param.name) ?? 0) + 1);
|
|
214
|
+
// An unmerged body keeps the `body` key, which a parameter of that name would shadow.
|
|
215
|
+
if (op.requestBody && !mergeBody) counts.set('body', (counts.get('body') ?? 0) + 1);
|
|
216
|
+
for (const property of bodyProperties ?? []) {
|
|
217
|
+
counts.set(property, (counts.get(property) ?? 0) + 1);
|
|
218
|
+
}
|
|
219
|
+
const collisions = [...counts].filter(([, count]) => count > 1).map(([paramName]) => paramName);
|
|
220
|
+
return collisions.length > 0 ? { collisions } : { mergeBody };
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/** `<key>: <type>` lines for parameters written at one level (the merged, flat shape). */
|
|
224
|
+
function mergedParamLines(params: ParamModel[], ctx: EmitContext, inner: string): string[] {
|
|
225
|
+
return params.flatMap((param) => [
|
|
226
|
+
...tsJsdoc(param.description, param.schema.metadata, inner),
|
|
227
|
+
`${inner}${safeIdent(param.name)}${param.required ? '' : '?'}: ${tsType(param.schema, ctx.dateType, inner)};`,
|
|
228
|
+
]);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/** The `<Op>Variables` object type literal (see operation-aliases.ts for the contract). */
|
|
232
|
+
export function variablesTypeText(
|
|
233
|
+
op: OperationModel,
|
|
234
|
+
name: string,
|
|
235
|
+
ctx: EmitContext,
|
|
236
|
+
indent = ''
|
|
237
|
+
): string {
|
|
238
|
+
const { dateType, schemaNames } = ctx;
|
|
239
|
+
const inner = indent + INDENT;
|
|
240
|
+
const flat = ctx.argsStyle === 'flat' ? flatInputShape(op, ctx.schemas) : undefined;
|
|
241
|
+
if (flat !== undefined && 'mergeBody' in flat) {
|
|
242
|
+
return mergedVariablesText(op, name, ctx, flat.mergeBody, indent);
|
|
243
|
+
}
|
|
244
|
+
const lines: string[] = [];
|
|
245
|
+
const pathParams = templatePathParams(op);
|
|
246
|
+
if (pathParams.length > 0) {
|
|
247
|
+
lines.push(
|
|
248
|
+
inputPropLine(
|
|
249
|
+
'path',
|
|
250
|
+
`${name}Path`,
|
|
251
|
+
() => paramsTypeText(pathParams, dateType, inner),
|
|
252
|
+
true,
|
|
253
|
+
schemaNames,
|
|
254
|
+
inner
|
|
255
|
+
)
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
if (op.queryParams.length > 0) {
|
|
259
|
+
lines.push(
|
|
260
|
+
inputPropLine(
|
|
261
|
+
'query',
|
|
262
|
+
`${name}Query`,
|
|
263
|
+
() => paramsTypeText(op.queryParams, dateType, inner),
|
|
264
|
+
op.queryParams.some((p) => p.required),
|
|
265
|
+
schemaNames,
|
|
266
|
+
inner
|
|
267
|
+
)
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
if (op.requestBody) {
|
|
271
|
+
lines.push(
|
|
272
|
+
inputPropLine(
|
|
273
|
+
'body',
|
|
274
|
+
`${name}Body`,
|
|
275
|
+
() => bodyTypeText(op.requestBody!, dateType, inner),
|
|
276
|
+
op.requestBody.required,
|
|
277
|
+
schemaNames,
|
|
278
|
+
inner
|
|
279
|
+
)
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
if (op.headerParams.length > 0) {
|
|
283
|
+
lines.push(
|
|
284
|
+
inputPropLine(
|
|
285
|
+
'headers',
|
|
286
|
+
`${name}Headers`,
|
|
287
|
+
() => paramsTypeText(op.headerParams, dateType, inner),
|
|
288
|
+
op.headerParams.some((p) => p.required),
|
|
289
|
+
schemaNames,
|
|
290
|
+
inner
|
|
291
|
+
)
|
|
292
|
+
);
|
|
293
|
+
}
|
|
294
|
+
if (op.cookieParams.length > 0) {
|
|
295
|
+
lines.push(
|
|
296
|
+
inputPropLine(
|
|
297
|
+
'cookies',
|
|
298
|
+
`${name}Cookies`,
|
|
299
|
+
() => paramsTypeText(op.cookieParams, dateType, inner),
|
|
300
|
+
op.cookieParams.some((p) => p.required),
|
|
301
|
+
schemaNames,
|
|
302
|
+
inner
|
|
303
|
+
)
|
|
304
|
+
);
|
|
305
|
+
}
|
|
306
|
+
return lines.length === 0 ? '{}' : `{\n${lines.join('\n')}\n${indent}}`;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* The merged (`argsStyle: flat`) `<Op>Variables`: every parameter at one level, intersected
|
|
311
|
+
* with the body alias when the body merges. Intersecting reuses the `<Op>Body` alias rather
|
|
312
|
+
* than reprinting its properties, so one body type stays one type.
|
|
313
|
+
*/
|
|
314
|
+
function mergedVariablesText(
|
|
315
|
+
op: OperationModel,
|
|
316
|
+
name: string,
|
|
317
|
+
ctx: EmitContext,
|
|
318
|
+
mergeBody: boolean,
|
|
319
|
+
indent: string
|
|
320
|
+
): string {
|
|
321
|
+
const inner = indent + INDENT;
|
|
322
|
+
const lines = mergedParamLines(
|
|
323
|
+
[...templatePathParams(op), ...op.queryParams, ...op.headerParams, ...op.cookieParams],
|
|
324
|
+
ctx,
|
|
325
|
+
inner
|
|
326
|
+
);
|
|
327
|
+
if (op.requestBody && !mergeBody) {
|
|
328
|
+
lines.push(
|
|
329
|
+
inputPropLine(
|
|
330
|
+
'body',
|
|
331
|
+
`${name}Body`,
|
|
332
|
+
() => bodyTypeText(op.requestBody!, ctx.dateType, inner),
|
|
333
|
+
op.requestBody.required,
|
|
334
|
+
ctx.schemaNames,
|
|
335
|
+
inner
|
|
336
|
+
)
|
|
337
|
+
);
|
|
338
|
+
}
|
|
339
|
+
const bodyRef = ctx.schemaNames.has(`${name}Body`)
|
|
340
|
+
? bodyTypeText(op.requestBody!, ctx.dateType, indent)
|
|
341
|
+
: `${name}Body`;
|
|
342
|
+
const object = lines.length === 0 ? '{}' : `{\n${lines.join('\n')}\n${indent}}`;
|
|
343
|
+
if (!mergeBody) return object;
|
|
344
|
+
return lines.length === 0 ? bodyRef : `${object} & ${bodyRef}`;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/** The raw success ref: the `<Op>Result` alias, or the inline type when that name collides. */
|
|
348
|
+
function rawResultText(op: OperationModel, ctx: EmitContext, indent: string): string {
|
|
349
|
+
const resultName = `${pascalCase(op.name)}Result`;
|
|
350
|
+
return ctx.schemaNames.has(resultName)
|
|
351
|
+
? responseText(op.successResponses, ctx.dateType, indent).type
|
|
352
|
+
: resultName;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/** The `Result<…, E>` error argument (result mode): `unknown`, the alias, or the inline union. */
|
|
356
|
+
function errorArgText(op: OperationModel, ctx: EmitContext, indent: string): string {
|
|
357
|
+
const members = errorTypeTexts(op.errorResponses, ctx.dateType, indent);
|
|
358
|
+
if (members.length === 0) return 'unknown';
|
|
359
|
+
const alias = `${pascalCase(op.name)}Error`;
|
|
360
|
+
if (!ctx.schemaNames.has(alias)) return alias;
|
|
361
|
+
return members.join(' | ');
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/** `export type Ops = { <ident>: { args; result; item?; page?; kind? } }` — what `createClient<Ops>` consumes. */
|
|
365
|
+
export function renderOpsType(
|
|
366
|
+
model: ApiModel,
|
|
367
|
+
idents: Map<string, string>,
|
|
368
|
+
ctx: EmitContext
|
|
369
|
+
): string {
|
|
370
|
+
const ops = allOperations(model.services);
|
|
371
|
+
if (ops.length === 0) return '';
|
|
372
|
+
const memberBlocks = ops.flatMap((op) => {
|
|
373
|
+
const ident = idents.get(op.name)!;
|
|
374
|
+
const name = pascalCase(op.name);
|
|
375
|
+
const inner = INDENT + INDENT;
|
|
376
|
+
const args = variablesTypeText(op, name, ctx, inner);
|
|
377
|
+
const sse = op.sse !== undefined;
|
|
378
|
+
const result = sse
|
|
379
|
+
? sseEventText(op, ctx.dateType, inner)
|
|
380
|
+
: ctx.errorMode === 'result'
|
|
381
|
+
? `Result<${rawResultText(op, ctx, inner)}, ${errorArgText(op, ctx, inner)}>`
|
|
382
|
+
: rawResultText(op, ctx, inner);
|
|
383
|
+
const lines = [`${inner}args: ${args};`, `${inner}result: ${result};`];
|
|
384
|
+
// Result-mode entries mark themselves so the runtime's mapped methods skip the
|
|
385
|
+
// throw-only envelope typing; declared headers type the `{ envelope: true }` bag.
|
|
386
|
+
if (ctx.errorMode === 'result' && !sse) lines.push(`${inner}mode: "result";`);
|
|
387
|
+
const responseHeaders = op.successResponseHeaders;
|
|
388
|
+
if (responseHeaders && responseHeaders.length > 0) {
|
|
389
|
+
lines.push(
|
|
390
|
+
`${inner}headers: ${responseHeadersTypeText(responseHeaders, ctx.schemas, inner)};`
|
|
391
|
+
);
|
|
392
|
+
}
|
|
393
|
+
const paginated = ctx.pagination?.get(op.name);
|
|
394
|
+
if (paginated) {
|
|
395
|
+
lines.push(`${inner}item: ${tsType(paginated.itemSchema, ctx.dateType, inner)};`);
|
|
396
|
+
if (ctx.errorMode === 'result') {
|
|
397
|
+
lines.push(`${inner}page: ${rawResultText(op, ctx, inner)};`);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
if (sse) lines.push(`${inner}kind: "sse";`);
|
|
401
|
+
return [`${INDENT}${ident}: {`, ...lines, `${INDENT}};`];
|
|
402
|
+
});
|
|
403
|
+
return [
|
|
404
|
+
...tsJsdoc(
|
|
405
|
+
"Per-operation `args`/`result` shapes (plus `kind: 'sse'` for event streams) — the\n" +
|
|
406
|
+
'type-level companion of `OPERATIONS` that gives `createClient<Ops>` its typed methods.',
|
|
407
|
+
undefined,
|
|
408
|
+
''
|
|
409
|
+
),
|
|
410
|
+
'export type Ops = {',
|
|
411
|
+
...memberBlocks,
|
|
412
|
+
'};',
|
|
413
|
+
].join('\n');
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/** One operation's `<Op>*` aliases (Result/Error/Path/Query/Body/Headers/Cookies/Variables), collision-suppressed. */
|
|
417
|
+
export function renderAliases(op: OperationModel, ctx: EmitContext): string {
|
|
418
|
+
const { dateType, schemaNames } = ctx;
|
|
419
|
+
const name = pascalCase(op.name);
|
|
420
|
+
const sse = op.sse !== undefined;
|
|
421
|
+
const { hasInputs } = operationSignature(op);
|
|
422
|
+
const blocks: string[] = [];
|
|
423
|
+
|
|
424
|
+
if (!sse) {
|
|
425
|
+
const resultName = `${name}Result`;
|
|
426
|
+
if (!schemaNames.has(resultName)) {
|
|
427
|
+
blocks.push(
|
|
428
|
+
`export type ${resultName} = ${responseText(op.successResponses, dateType).type};`
|
|
429
|
+
);
|
|
430
|
+
}
|
|
431
|
+
if (ctx.errorMode === 'result') {
|
|
432
|
+
const members = errorTypeTexts(op.errorResponses, dateType);
|
|
433
|
+
const errorAlias = `${name}Error`;
|
|
434
|
+
if (members.length > 0 && !schemaNames.has(errorAlias)) {
|
|
435
|
+
blocks.push(`export type ${errorAlias} = ${members.join(' | ')};`);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
const pathParams = templatePathParams(op);
|
|
440
|
+
if (pathParams.length > 0 && !schemaNames.has(`${name}Path`)) {
|
|
441
|
+
blocks.push(`export type ${name}Path = ${paramsTypeText(pathParams, dateType)};`);
|
|
442
|
+
}
|
|
443
|
+
if (op.queryParams.length > 0 && !schemaNames.has(`${name}Query`)) {
|
|
444
|
+
blocks.push(`export type ${name}Query = ${paramsTypeText(op.queryParams, dateType)};`);
|
|
445
|
+
}
|
|
446
|
+
if (op.requestBody && !schemaNames.has(`${name}Body`)) {
|
|
447
|
+
blocks.push(`export type ${name}Body = ${bodyTypeText(op.requestBody, dateType)};`);
|
|
448
|
+
}
|
|
449
|
+
if (op.headerParams.length > 0 && !schemaNames.has(`${name}Headers`)) {
|
|
450
|
+
blocks.push(`export type ${name}Headers = ${paramsTypeText(op.headerParams, dateType)};`);
|
|
451
|
+
}
|
|
452
|
+
// Response headers (envelope) — distinct from request `<Op>Headers`.
|
|
453
|
+
const responseHeaders = op.successResponseHeaders;
|
|
454
|
+
if (responseHeaders && responseHeaders.length > 0 && !schemaNames.has(`${name}ResponseHeaders`)) {
|
|
455
|
+
blocks.push(
|
|
456
|
+
`export type ${name}ResponseHeaders = ${responseHeadersTypeText(responseHeaders, ctx.schemas)};`
|
|
457
|
+
);
|
|
458
|
+
}
|
|
459
|
+
if (op.cookieParams.length > 0 && !schemaNames.has(`${name}Cookies`)) {
|
|
460
|
+
blocks.push(`export type ${name}Cookies = ${paramsTypeText(op.cookieParams, dateType)};`);
|
|
461
|
+
}
|
|
462
|
+
if (hasInputs && !schemaNames.has(`${name}Variables`)) {
|
|
463
|
+
blocks.push(`export type ${name}Variables = ${variablesTypeText(op, name, ctx)};`);
|
|
464
|
+
}
|
|
465
|
+
return blocks.join('\n\n');
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
/**
|
|
469
|
+
* Schema names the ENTRY file's own types reference — the split layout's type-only
|
|
470
|
+
* import list. Derived from the IR (the exact sources the alias/Ops renderers type):
|
|
471
|
+
* every ref reachable from operation inputs, success responses, error responses
|
|
472
|
+
* (result mode only — throw mode never renders them), and pagination item schemas.
|
|
473
|
+
* Named schema BODIES are not expanded: a ref renders as its bare name.
|
|
474
|
+
*/
|
|
475
|
+
export function collectEntrySchemaRefs(model: ApiModel, ctx: EmitContext): string[] {
|
|
476
|
+
const referenced = new Set<string>();
|
|
477
|
+
const walk = (schema: SchemaModel): void => {
|
|
478
|
+
switch (schema.kind) {
|
|
479
|
+
case 'ref':
|
|
480
|
+
referenced.add(schema.name);
|
|
481
|
+
return;
|
|
482
|
+
case 'omit':
|
|
483
|
+
referenced.add(schema.base);
|
|
484
|
+
return;
|
|
485
|
+
case 'array':
|
|
486
|
+
walk(schema.items);
|
|
487
|
+
return;
|
|
488
|
+
case 'record':
|
|
489
|
+
walk(schema.value);
|
|
490
|
+
return;
|
|
491
|
+
case 'object':
|
|
492
|
+
for (const property of schema.properties) walk(property.schema);
|
|
493
|
+
return;
|
|
494
|
+
case 'union':
|
|
495
|
+
case 'intersection':
|
|
496
|
+
for (const member of schema.members) walk(member);
|
|
497
|
+
return;
|
|
498
|
+
default:
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
501
|
+
};
|
|
502
|
+
for (const op of allOperations(model.services)) {
|
|
503
|
+
for (const param of [
|
|
504
|
+
...op.pathParams,
|
|
505
|
+
...op.queryParams,
|
|
506
|
+
...op.headerParams,
|
|
507
|
+
...op.cookieParams,
|
|
508
|
+
]) {
|
|
509
|
+
walk(param.schema);
|
|
510
|
+
}
|
|
511
|
+
if (op.requestBody) walk(op.requestBody.schema);
|
|
512
|
+
for (const response of op.successResponses) {
|
|
513
|
+
walk(response.schema);
|
|
514
|
+
// SSE responses type their event payload from the stream's item schema.
|
|
515
|
+
if (response.itemSchema) walk(response.itemSchema);
|
|
516
|
+
}
|
|
517
|
+
if (ctx.errorMode === 'result') {
|
|
518
|
+
for (const response of op.errorResponses) walk(response.schema);
|
|
519
|
+
}
|
|
520
|
+
const paginated = ctx.pagination?.get(op.name);
|
|
521
|
+
if (paginated) walk(paginated.itemSchema);
|
|
522
|
+
}
|
|
523
|
+
return [...referenced].filter((name) => ctx.schemaNames.has(name)).sort();
|
|
524
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// Ejected from @redocly/client-generator@0.4.0 — the built-in "typescript" generator.
|
|
2
|
+
// This file is yours: edit freely; the generated client stays machine-owned and is
|
|
3
|
+
// rebuilt by `redocly generate-client`. Newer generator versions merge in with
|
|
4
|
+
// `redocly eject-generator typescript --update`.
|
|
5
|
+
// Success-response header helpers: descriptor parse hints + Ops / alias type text
|
|
6
|
+
// for throw-mode `{ envelope: true }`.
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
headerCoerceType,
|
|
10
|
+
type NamedSchemaModel,
|
|
11
|
+
type ResponseHeaderModel,
|
|
12
|
+
type ResponseHeaderSpec,
|
|
13
|
+
type SchemaModel,
|
|
14
|
+
} from '@redocly/client-generator';
|
|
15
|
+
import { headerPropertyKey, uniqueIdent } from '@redocly/client-generator/printers/typescript';
|
|
16
|
+
|
|
17
|
+
const INDENT = ' ';
|
|
18
|
+
|
|
19
|
+
type PlannedResponseHeader = ResponseHeaderModel & {
|
|
20
|
+
key: string;
|
|
21
|
+
type: ResponseHeaderSpec['type'];
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Runtime coerce hint from a header schema (complex schemas fall back to string).
|
|
26
|
+
* Delegates to the neutral `headerCoerceType`; JavaScript has one number type,
|
|
27
|
+
* so `integer` collapses to `number`.
|
|
28
|
+
*/
|
|
29
|
+
export function headerParseType(
|
|
30
|
+
schema: SchemaModel,
|
|
31
|
+
schemas: readonly NamedSchemaModel[] = []
|
|
32
|
+
): ResponseHeaderSpec['type'] {
|
|
33
|
+
const coerce = headerCoerceType(schema, { schemas });
|
|
34
|
+
return coerce === 'integer' ? 'number' : coerce;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Descriptor `responseHeaders` entries from the success response's declared headers. */
|
|
38
|
+
export function responseHeaderSpecs(
|
|
39
|
+
headers: ResponseHeaderModel[] | undefined,
|
|
40
|
+
schemas: readonly NamedSchemaModel[] = []
|
|
41
|
+
): ResponseHeaderSpec[] | undefined {
|
|
42
|
+
const planned = planResponseHeaders(headers, schemas);
|
|
43
|
+
if (planned.length === 0) return undefined;
|
|
44
|
+
return planned.map((header) => ({
|
|
45
|
+
name: header.name,
|
|
46
|
+
key: header.key,
|
|
47
|
+
type: header.type,
|
|
48
|
+
}));
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Type-literal text for Ops.`headers` / `<Op>ResponseHeaders`, rendered at `indent`. */
|
|
52
|
+
export function responseHeadersTypeText(
|
|
53
|
+
headers: ResponseHeaderModel[],
|
|
54
|
+
schemas: readonly NamedSchemaModel[] = [],
|
|
55
|
+
indent = ''
|
|
56
|
+
): string {
|
|
57
|
+
const inner = indent + INDENT;
|
|
58
|
+
const lines = planResponseHeaders(headers, schemas).map(
|
|
59
|
+
(header) => `${inner}${header.key}${header.required === true ? '' : '?'}: ${header.type};`
|
|
60
|
+
);
|
|
61
|
+
return lines.length === 0 ? '{}' : `{\n${lines.join('\n')}\n${indent}}`;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function planResponseHeaders(
|
|
65
|
+
headers: ResponseHeaderModel[] | undefined,
|
|
66
|
+
schemas: readonly NamedSchemaModel[]
|
|
67
|
+
): PlannedResponseHeader[] {
|
|
68
|
+
const used = new Set<string>();
|
|
69
|
+
return (headers ?? []).map((header) => ({
|
|
70
|
+
...header,
|
|
71
|
+
key: uniqueIdent(headerPropertyKey(header.name), used),
|
|
72
|
+
type: headerParseType(header.schema, schemas),
|
|
73
|
+
}));
|
|
74
|
+
}
|