@redocly/client-generator 0.3.7 → 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,506 @@
|
|
|
1
|
+
// Ejected from @redocly/client-generator@0.4.0 — the built-in "transformers" 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 transformers --update`.
|
|
5
|
+
// Emits standalone Date-transformer functions from the IR. For each named
|
|
6
|
+
// schema that (recursively) carries a `format: date-time`/`date` string field,
|
|
7
|
+
// emits `export const transform<Name> = (data: <Name>): <Name> => { … };` that
|
|
8
|
+
// walks the value and rewrites those wire ISO strings to `new Date(...)` in
|
|
9
|
+
// place, so the runtime value matches the sdk's `--date-type Date` types.
|
|
10
|
+
//
|
|
11
|
+
// Pairs with the sdk generated under `dateType: 'Date'`; the client itself
|
|
12
|
+
// stays zero-dep (Date is standard). Transformers compose across refs:
|
|
13
|
+
// `transformPet` calls `transformOwner(data["owner"])` when `Pet.owner` is an
|
|
14
|
+
// `Owner` that has dates. Source-text templates throughout.
|
|
15
|
+
|
|
16
|
+
import type { ApiModel, NamedSchemaModel, SchemaModel } from '@redocly/client-generator';
|
|
17
|
+
import { pascalCase, safeIdent } from '@redocly/client-generator/printers/typescript';
|
|
18
|
+
|
|
19
|
+
const INDENT = ' ';
|
|
20
|
+
|
|
21
|
+
/** `transform<Name>` — the function bound to a named schema. */
|
|
22
|
+
function transformName(name: string): string {
|
|
23
|
+
return `transform${pascalCase(name)}`;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Strips `readonly` modifiers so a transform can write a `readOnly` spec field
|
|
28
|
+
* (e.g. `createdTime`) — emitted into the module only when such a write exists.
|
|
29
|
+
*/
|
|
30
|
+
const WRITABLE_DECL = 'type __Writable<T> = { -readonly [K in keyof T]: T[K] };';
|
|
31
|
+
/** Set by `writableLhs` during a render; `renderTransformersModule` resets and reads it. */
|
|
32
|
+
let writableUsed = false;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* A write target: the rendered expression plus its access path (base identifier
|
|
36
|
+
* followed by string keys), so the `readonly` cast can rebuild the
|
|
37
|
+
* `NonNullable<typeof …>` chain. Loop variables have a bare one-segment path.
|
|
38
|
+
*/
|
|
39
|
+
type Target = { text: string; path: string[] };
|
|
40
|
+
|
|
41
|
+
function ident(name: string): Target {
|
|
42
|
+
return { text: name, path: [name] };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** `<target>["key"]` — bracket access, robust for any (incl. non-identifier) key. */
|
|
46
|
+
function index(target: Target, key: string): Target {
|
|
47
|
+
return { text: `${target.text}[${JSON.stringify(key)}]`, path: [...target.path, key] };
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Whether transforming a value of `schema` REPLACES it (so the result must be
|
|
52
|
+
* assigned back) rather than mutating it in place: date scalars, arrays of
|
|
53
|
+
* them, unions containing them, and refs resolving to any of those. Objects,
|
|
54
|
+
* records, and intersections mutate in place.
|
|
55
|
+
*/
|
|
56
|
+
function needsReassign(
|
|
57
|
+
schema: SchemaModel,
|
|
58
|
+
byName: Map<string, SchemaModel>,
|
|
59
|
+
seen: Set<string>
|
|
60
|
+
): boolean {
|
|
61
|
+
if (isDateScalar(schema)) return true;
|
|
62
|
+
switch (schema.kind) {
|
|
63
|
+
case 'array':
|
|
64
|
+
return needsReassign(schema.items, byName, seen);
|
|
65
|
+
case 'union':
|
|
66
|
+
return schema.members.some((member) => needsReassign(member, byName, seen));
|
|
67
|
+
case 'ref': {
|
|
68
|
+
if (seen.has(schema.name)) return false;
|
|
69
|
+
const target = byName.get(schema.name);
|
|
70
|
+
return target !== undefined && needsReassign(target, byName, new Set(seen).add(schema.name));
|
|
71
|
+
}
|
|
72
|
+
default:
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** A scalar string with a `date-time`/`date` format — the leaf we convert. */
|
|
78
|
+
function isDateScalar(schema: SchemaModel): boolean {
|
|
79
|
+
return (
|
|
80
|
+
schema.kind === 'scalar' &&
|
|
81
|
+
schema.scalar === 'string' &&
|
|
82
|
+
(schema.metadata?.format === 'date-time' || schema.metadata?.format === 'date')
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Whether a schema contains a date leaf, following refs. `seen` guards ref
|
|
88
|
+
* cycles (a self-referential schema would otherwise recurse forever); a ref
|
|
89
|
+
* back into the visited set carries no *new* dates from here.
|
|
90
|
+
*/
|
|
91
|
+
function hasDates(
|
|
92
|
+
schema: SchemaModel,
|
|
93
|
+
byName: Map<string, SchemaModel>,
|
|
94
|
+
seen: Set<string>
|
|
95
|
+
): boolean {
|
|
96
|
+
if (isDateScalar(schema)) return true;
|
|
97
|
+
switch (schema.kind) {
|
|
98
|
+
case 'array':
|
|
99
|
+
return hasDates(schema.items, byName, seen);
|
|
100
|
+
case 'record':
|
|
101
|
+
return hasDates(schema.value, byName, seen);
|
|
102
|
+
case 'object':
|
|
103
|
+
return schema.properties.some((p) => hasDates(p.schema, byName, seen));
|
|
104
|
+
case 'union':
|
|
105
|
+
case 'intersection':
|
|
106
|
+
return schema.members.some((m) => hasDates(m, byName, seen));
|
|
107
|
+
case 'ref': {
|
|
108
|
+
const target = byName.get(schema.name);
|
|
109
|
+
return target !== undefined && !seen.has(schema.name)
|
|
110
|
+
? hasDates(target, byName, new Set(seen).add(schema.name))
|
|
111
|
+
: false;
|
|
112
|
+
}
|
|
113
|
+
default:
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* `if (<cond>) …` — a brace-less single-statement `then` prints on the next line one
|
|
120
|
+
* level deeper (`block: false`), a braced one wraps in `{ … }` (`block: true`);
|
|
121
|
+
* `then` receives the indent its lines must start at.
|
|
122
|
+
*/
|
|
123
|
+
function ifThen(
|
|
124
|
+
cond: string,
|
|
125
|
+
then: (indent: string) => string[],
|
|
126
|
+
indent: string,
|
|
127
|
+
block = false
|
|
128
|
+
): string[] {
|
|
129
|
+
if (block) return [`${indent}if (${cond}) {`, ...then(indent + INDENT), `${indent}}`];
|
|
130
|
+
return [`${indent}if (${cond})`, ...then(indent + INDENT)];
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** `<target> = <value>;` — the LHS cast writable when it is a `readonly` property. */
|
|
134
|
+
function assign(target: Target, value: string, readonlyLhs = false): (indent: string) => string[] {
|
|
135
|
+
const lhs = readonlyLhs ? writableLhs(target) : target.text;
|
|
136
|
+
return (indent) => [`${indent}${lhs} = ${value};`];
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function statement(expr: string): (indent: string) => string[] {
|
|
140
|
+
return (indent) => [`${indent}${expr};`];
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* The write target for a `readonly`-typed property:
|
|
145
|
+
* `(recv as __Writable<NonNullable<typeof recv>>)["key"]`. `readonly` is shallow —
|
|
146
|
+
* it blocks only the direct assignment — so nested writes stay uncast.
|
|
147
|
+
*/
|
|
148
|
+
function writableLhs(target: Target): string {
|
|
149
|
+
if (target.path.length < 2) return target.text; // a parameter reassignment is never readonly
|
|
150
|
+
writableUsed = true;
|
|
151
|
+
const receiver: Target = {
|
|
152
|
+
text: target.text.slice(0, target.text.lastIndexOf('[')),
|
|
153
|
+
path: target.path.slice(0, -1),
|
|
154
|
+
};
|
|
155
|
+
const key = target.path[target.path.length - 1];
|
|
156
|
+
return `(${receiver.text} as __Writable<${nonNullTypeOf(receiver)}>)[${JSON.stringify(key)}]`;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* `NonNullable<typeof <expr>>` for the access paths this emitter builds, with
|
|
161
|
+
* `NonNullable` applied at every step so optional intermediate properties don't
|
|
162
|
+
* poison the indexed type.
|
|
163
|
+
*/
|
|
164
|
+
function nonNullTypeOf(target: Target): string {
|
|
165
|
+
let type = `typeof ${target.path[0]}`;
|
|
166
|
+
for (const key of target.path.slice(1)) {
|
|
167
|
+
type = `NonNullable<${type}>[${JSON.stringify(key)}]`;
|
|
168
|
+
}
|
|
169
|
+
return `NonNullable<${type}>`;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/** Next nested loop variable: `item`, `item2`, `item3`, … (avoids shadowing). */
|
|
173
|
+
function nextItemVar(current: string): string {
|
|
174
|
+
if (current === 'data') return 'item';
|
|
175
|
+
return `item${Number(current.slice('item'.length)) + 1}`;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Conversion lines that, given the runtime value at `target` typed by `schema`,
|
|
180
|
+
* rewrite date leaves in place. Each branch self-gates by returning `[]` when
|
|
181
|
+
* nothing under it carries a date, so callers need no pre-check. `seen` follows
|
|
182
|
+
* refs and guards cycles; `itemVar` names nested loop variables.
|
|
183
|
+
*/
|
|
184
|
+
function convert(
|
|
185
|
+
target: Target,
|
|
186
|
+
schema: SchemaModel,
|
|
187
|
+
byName: Map<string, SchemaModel>,
|
|
188
|
+
seen: Set<string>,
|
|
189
|
+
itemVar: string,
|
|
190
|
+
indent: string,
|
|
191
|
+
readonlyLhs = false
|
|
192
|
+
): string[] {
|
|
193
|
+
if (isDateScalar(schema)) {
|
|
194
|
+
return ifThen(
|
|
195
|
+
`typeof ${target.text} === "string"`,
|
|
196
|
+
assign(target, `new Date(${target.text})`, readonlyLhs),
|
|
197
|
+
indent
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
switch (schema.kind) {
|
|
201
|
+
case 'ref':
|
|
202
|
+
return convertRef(target, schema.name, byName, seen, indent, readonlyLhs);
|
|
203
|
+
case 'object': {
|
|
204
|
+
const lines: string[] = [];
|
|
205
|
+
for (const p of schema.properties) {
|
|
206
|
+
lines.push(
|
|
207
|
+
...convertProperty(
|
|
208
|
+
index(target, p.name),
|
|
209
|
+
p.schema,
|
|
210
|
+
byName,
|
|
211
|
+
seen,
|
|
212
|
+
itemVar,
|
|
213
|
+
indent,
|
|
214
|
+
p.readOnly === true
|
|
215
|
+
)
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
return lines;
|
|
219
|
+
}
|
|
220
|
+
case 'array':
|
|
221
|
+
return convertArray(target, schema.items, byName, seen, itemVar, indent, readonlyLhs);
|
|
222
|
+
case 'record':
|
|
223
|
+
return convertCollection(target, schema.value, byName, seen, itemVar, indent, true);
|
|
224
|
+
case 'intersection': {
|
|
225
|
+
// An intersection value satisfies *every* member type, so each member's
|
|
226
|
+
// transform applies directly to `target` with no narrowing needed.
|
|
227
|
+
const lines: string[] = [];
|
|
228
|
+
for (const m of schema.members) {
|
|
229
|
+
lines.push(...convert(target, m, byName, seen, itemVar, indent, readonlyLhs));
|
|
230
|
+
}
|
|
231
|
+
return lines;
|
|
232
|
+
}
|
|
233
|
+
case 'union':
|
|
234
|
+
return convertUnion(target, schema.members, byName, seen, itemVar, indent, readonlyLhs);
|
|
235
|
+
default:
|
|
236
|
+
return [];
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* A union position. A runtime value inhabits exactly one member, so we apply
|
|
242
|
+
* every date-bearing member's conversion to the same `target` and let the
|
|
243
|
+
* unmatched members' runtime guards no-op.
|
|
244
|
+
*
|
|
245
|
+
* Type-safety is the catch: `target` is typed as the whole union, so an
|
|
246
|
+
* object/ref member's `transform<Ref>(target)` would fail `--date-type Date`
|
|
247
|
+
* strict-tsc (TS2345). We therefore gate the object-shaped members behind a
|
|
248
|
+
* single `typeof target === "object"` check and CAST `target` to each member's
|
|
249
|
+
* type — the cast makes it compile, the cast target's own internal string
|
|
250
|
+
* guards make a wrong-member application a safe runtime no-op. Scalar date
|
|
251
|
+
* members keep their `typeof === "string"` guard (their type is `Date` under
|
|
252
|
+
* `--date-type Date`, so the assignment type-checks).
|
|
253
|
+
*/
|
|
254
|
+
function convertUnion(
|
|
255
|
+
target: Target,
|
|
256
|
+
members: SchemaModel[],
|
|
257
|
+
byName: Map<string, SchemaModel>,
|
|
258
|
+
seen: Set<string>,
|
|
259
|
+
itemVar: string,
|
|
260
|
+
indent: string,
|
|
261
|
+
readonlyLhs = false
|
|
262
|
+
): string[] {
|
|
263
|
+
const lines: string[] = [];
|
|
264
|
+
const guardedIndent = indent + INDENT;
|
|
265
|
+
const objectGuarded: string[] = [];
|
|
266
|
+
for (const m of members) {
|
|
267
|
+
if (isDateScalar(m)) {
|
|
268
|
+
lines.push(...convert(target, m, byName, seen, itemVar, indent, readonlyLhs));
|
|
269
|
+
} else if (m.kind === 'ref') {
|
|
270
|
+
if (!hasDates(m, byName, seen)) continue;
|
|
271
|
+
const call = `${transformName(m.name)}(${target.text} as ${m.name})`;
|
|
272
|
+
// A replace-by-value ref (scalar dates) must be assigned back; an object
|
|
273
|
+
// ref mutates in place, so its return can be dropped.
|
|
274
|
+
const build = needsReassign(m, byName, seen)
|
|
275
|
+
? assign(target, call, readonlyLhs)
|
|
276
|
+
: statement(call);
|
|
277
|
+
objectGuarded.push(...build(guardedIndent));
|
|
278
|
+
} else {
|
|
279
|
+
// Object/array/record members: recurse under the shared object guard.
|
|
280
|
+
objectGuarded.push(...convert(target, m, byName, seen, itemVar, guardedIndent, readonlyLhs));
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
if (objectGuarded.length > 0) {
|
|
284
|
+
lines.push(
|
|
285
|
+
...ifThen(
|
|
286
|
+
`${target.text} && typeof ${target.text} === "object"`,
|
|
287
|
+
() => objectGuarded,
|
|
288
|
+
indent,
|
|
289
|
+
true
|
|
290
|
+
)
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
return lines;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* A ref position, emitted only when the ref target carries dates (so the
|
|
298
|
+
* sibling transform exists). An object-shaped ref mutates in place —
|
|
299
|
+
* `if (<target>) transform<Ref>(<target>);` — but a ref resolving to a date
|
|
300
|
+
* scalar (or an array/union of them) is replace-by-value, so its result is
|
|
301
|
+
* assigned back: `if (<target>) <target> = transform<Ref>(<target>);`.
|
|
302
|
+
*/
|
|
303
|
+
function convertRef(
|
|
304
|
+
target: Target,
|
|
305
|
+
name: string,
|
|
306
|
+
byName: Map<string, SchemaModel>,
|
|
307
|
+
seen: Set<string>,
|
|
308
|
+
indent: string,
|
|
309
|
+
readonlyLhs = false
|
|
310
|
+
): string[] {
|
|
311
|
+
const ref: SchemaModel = { kind: 'ref', name };
|
|
312
|
+
if (!hasDates(ref, byName, seen)) return [];
|
|
313
|
+
const call = `${transformName(name)}(${target.text})`;
|
|
314
|
+
return ifThen(
|
|
315
|
+
target.text,
|
|
316
|
+
needsReassign(ref, byName, seen) ? assign(target, call, readonlyLhs) : statement(call),
|
|
317
|
+
indent
|
|
318
|
+
);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* A property position: a nested inline object guards presence and recurses
|
|
323
|
+
* inside a block; everything else (scalars, refs, arrays, …) delegates to
|
|
324
|
+
* `convert`, which guards itself.
|
|
325
|
+
*/
|
|
326
|
+
function convertProperty(
|
|
327
|
+
target: Target,
|
|
328
|
+
schema: SchemaModel,
|
|
329
|
+
byName: Map<string, SchemaModel>,
|
|
330
|
+
seen: Set<string>,
|
|
331
|
+
itemVar: string,
|
|
332
|
+
indent: string,
|
|
333
|
+
readonlyLhs = false
|
|
334
|
+
): string[] {
|
|
335
|
+
if (schema.kind === 'ref') {
|
|
336
|
+
return convertRef(target, schema.name, byName, seen, indent, readonlyLhs);
|
|
337
|
+
}
|
|
338
|
+
if (schema.kind === 'object') {
|
|
339
|
+
// Nested writes go one level inside — `readonly` is shallow, so no cast needed.
|
|
340
|
+
const inner = convert(target, schema, byName, seen, itemVar, indent + INDENT);
|
|
341
|
+
if (inner.length === 0) return [];
|
|
342
|
+
return ifThen(target.text, () => inner, indent, true);
|
|
343
|
+
}
|
|
344
|
+
return convert(target, schema, byName, seen, itemVar, indent, readonlyLhs);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* A "replace-by-value" element is one a transform must overwrite wholesale
|
|
349
|
+
* rather than mutate in place: a date scalar (`new Date(v)`) or an array of
|
|
350
|
+
* such elements (`v.map(...)`). Returns the expression that yields the replaced
|
|
351
|
+
* value for the element bound to `value`, or `null` when the element instead
|
|
352
|
+
* mutates in place (object/ref/record). Recurses for arrays-of-arrays.
|
|
353
|
+
*/
|
|
354
|
+
function replacer(
|
|
355
|
+
value: string,
|
|
356
|
+
element: SchemaModel,
|
|
357
|
+
byName: Map<string, SchemaModel>,
|
|
358
|
+
seen: Set<string>,
|
|
359
|
+
depth = 0
|
|
360
|
+
): string | null {
|
|
361
|
+
if (isDateScalar(element)) return `new Date(${value})`;
|
|
362
|
+
// A ref resolving to a replace-by-value shape (a scalar-date named schema):
|
|
363
|
+
// its sibling transform returns the converted value — `transform<Ref>(v)`.
|
|
364
|
+
if (element.kind === 'ref' && needsReassign(element, byName, seen)) {
|
|
365
|
+
return `${transformName(element.name)}(${value})`;
|
|
366
|
+
}
|
|
367
|
+
if (element.kind === 'array') {
|
|
368
|
+
// Map var for the level below: `v` over the scalar leaf, else `row`, `row2`,
|
|
369
|
+
// … per array level — distinct names by depth avoid shadowing. Yields
|
|
370
|
+
// `.map(v => new Date(v))` and `.map(row => row.map(v => new Date(v)))`.
|
|
371
|
+
const varName = element.items.kind === 'array' ? rowVar(depth + 1) : 'v';
|
|
372
|
+
const inner = replacer(varName, element.items, byName, seen, depth + 1);
|
|
373
|
+
if (inner === null) return null;
|
|
374
|
+
return `${value}.map(${varName} => ${inner})`;
|
|
375
|
+
}
|
|
376
|
+
return null;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
/** Array map-var name by depth: `row`, `row2`, `row3`, … (avoids shadowing). */
|
|
380
|
+
function rowVar(depth: number): string {
|
|
381
|
+
return depth <= 1 ? 'row' : `row${depth}`;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/** Conversions for `target` being an array whose elements are typed by `items`. */
|
|
385
|
+
function convertArray(
|
|
386
|
+
target: Target,
|
|
387
|
+
items: SchemaModel,
|
|
388
|
+
byName: Map<string, SchemaModel>,
|
|
389
|
+
seen: Set<string>,
|
|
390
|
+
itemVar: string,
|
|
391
|
+
indent: string,
|
|
392
|
+
readonlyLhs = false
|
|
393
|
+
): string[] {
|
|
394
|
+
// Date scalars / arrays-of-date-scalars are replace-by-value: map over the
|
|
395
|
+
// array and reassign the slot (reassigning a loop var would be lost).
|
|
396
|
+
const varName = items.kind === 'array' ? rowVar(1) : 'v';
|
|
397
|
+
const mapped = replacer(varName, items, byName, seen, 1);
|
|
398
|
+
if (mapped !== null) {
|
|
399
|
+
// `if (Array.isArray(t)) t = t.map(v => new Date(v));` (or nested `row`)
|
|
400
|
+
return ifThen(
|
|
401
|
+
`Array.isArray(${target.text})`,
|
|
402
|
+
assign(target, `${target.text}.map(${varName} => ${mapped})`, readonlyLhs),
|
|
403
|
+
indent
|
|
404
|
+
);
|
|
405
|
+
}
|
|
406
|
+
if (items.kind === 'ref') {
|
|
407
|
+
if (!hasDates(items, byName, seen)) return [];
|
|
408
|
+
// `if (Array.isArray(t)) t.forEach(transformRef);`
|
|
409
|
+
return ifThen(
|
|
410
|
+
`Array.isArray(${target.text})`,
|
|
411
|
+
statement(`${target.text}.forEach(${transformName(items.name)})`),
|
|
412
|
+
indent
|
|
413
|
+
);
|
|
414
|
+
}
|
|
415
|
+
return convertCollection(target, items, byName, seen, itemVar, indent, false);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
/**
|
|
419
|
+
* Iterate a collection (array or record) of mutate-in-place elements (objects,
|
|
420
|
+
* refs, records) and recurse with a fresh loop variable. Arrays iterate the
|
|
421
|
+
* value directly; records iterate `Object.values(...)`. `[]` when the element
|
|
422
|
+
* bears no dates.
|
|
423
|
+
*
|
|
424
|
+
* Replace-by-value elements (date scalars) never reach the array path here —
|
|
425
|
+
* `convertArray` handles them via map-and-reassign. A *record* of date scalars
|
|
426
|
+
* does land here: a `forEach` loop variable can't write back, so we iterate the
|
|
427
|
+
* keys and assign back into the record (`rec[__k] = new Date(rec[__k])`).
|
|
428
|
+
*/
|
|
429
|
+
function convertCollection(
|
|
430
|
+
target: Target,
|
|
431
|
+
element: SchemaModel,
|
|
432
|
+
byName: Map<string, SchemaModel>,
|
|
433
|
+
seen: Set<string>,
|
|
434
|
+
itemVar: string,
|
|
435
|
+
indent: string,
|
|
436
|
+
isRecord: boolean
|
|
437
|
+
): string[] {
|
|
438
|
+
if (isRecord) {
|
|
439
|
+
// Replace-by-value elements (date scalars, arrays of them) can't be written
|
|
440
|
+
// through a `forEach` loop var, so iterate the keys and assign back into the
|
|
441
|
+
// record slot. Date scalars are string-guarded; nested arrays array-guarded.
|
|
442
|
+
const slot: Target = { text: `${target.text}[__k]`, path: [...target.path, '__k'] };
|
|
443
|
+
const replaced = replacer(slot.text, element, byName, seen);
|
|
444
|
+
if (replaced !== null) {
|
|
445
|
+
const guard = isDateScalar(element)
|
|
446
|
+
? `typeof ${slot.text} === "string"`
|
|
447
|
+
: `Array.isArray(${slot.text})`;
|
|
448
|
+
return ifThen(
|
|
449
|
+
target.text,
|
|
450
|
+
(loopIndent) => [
|
|
451
|
+
`${loopIndent}for (const __k of Object.keys(${target.text}))`,
|
|
452
|
+
...ifThen(guard, (inner) => [`${inner}${slot.text} = ${replaced};`], loopIndent + INDENT),
|
|
453
|
+
],
|
|
454
|
+
indent
|
|
455
|
+
);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
const next = nextItemVar(itemVar);
|
|
459
|
+
// The loop sits one `if` level in, and the forEach body one more.
|
|
460
|
+
const body = convert(ident(next), element, byName, seen, next, indent + INDENT + INDENT);
|
|
461
|
+
if (body.length === 0) return [];
|
|
462
|
+
const iterable = isRecord ? `Object.values(${target.text})` : target.text;
|
|
463
|
+
return ifThen(
|
|
464
|
+
isRecord ? target.text : `Array.isArray(${target.text})`,
|
|
465
|
+
(inner) => [`${inner}${iterable}.forEach(${next} => {`, ...body, `${inner}});`],
|
|
466
|
+
indent
|
|
467
|
+
);
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/** `export const transform<Name> = (data: <Name>): <Name> => { … };`. */
|
|
471
|
+
function transformBlock(named: NamedSchemaModel, byName: Map<string, SchemaModel>): string {
|
|
472
|
+
// The sdk exports the type verbatim; only the `transform<Pascal>` NAME is PascalCased.
|
|
473
|
+
const typeName = named.name;
|
|
474
|
+
const data = ident('data');
|
|
475
|
+
const body =
|
|
476
|
+
named.schema.kind === 'ref'
|
|
477
|
+
? convertRef(data, named.schema.name, byName, new Set(), INDENT)
|
|
478
|
+
: convert(data, named.schema, byName, new Set(), 'data', INDENT);
|
|
479
|
+
return [
|
|
480
|
+
`export const ${transformName(named.name)} = (data: ${typeName}): ${typeName} => {`,
|
|
481
|
+
...body,
|
|
482
|
+
`${INDENT}return data;`,
|
|
483
|
+
'};',
|
|
484
|
+
].join('\n');
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
/**
|
|
488
|
+
* Render the transformers module. Emits one `transform<Name>` per named schema
|
|
489
|
+
* that carries a date field; `''` when none do. `opts.sdkModule` is the import
|
|
490
|
+
* specifier the schema TYPES are pulled from (the transformers call each other
|
|
491
|
+
* as siblings, so only the types need importing).
|
|
492
|
+
*/
|
|
493
|
+
export function renderTransformersModule(model: ApiModel, opts: { sdkModule: string }): string {
|
|
494
|
+
const byName = new Map(model.schemas.map((s) => [s.name, s.schema]));
|
|
495
|
+
const dated = model.schemas.filter((s) => hasDates(s.schema, byName, new Set()));
|
|
496
|
+
if (dated.length === 0) return '';
|
|
497
|
+
const types = dated.map((s) => safeIdent(s.name)).join(', ');
|
|
498
|
+
writableUsed = false; // reset the per-render flag `writableLhs` sets
|
|
499
|
+
const transforms = dated.map((s) => transformBlock(s, byName));
|
|
500
|
+
const blocks = [
|
|
501
|
+
`import type { ${types} } from ${JSON.stringify(opts.sdkModule)};`,
|
|
502
|
+
...(writableUsed ? [WRITABLE_DECL] : []),
|
|
503
|
+
...transforms,
|
|
504
|
+
];
|
|
505
|
+
return blocks.join('\n\n');
|
|
506
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
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 type { ApiModel } from '@redocly/client-generator';
|
|
6
|
+
import { escapeJsDoc, splitLines } from '@redocly/client-generator/printers/typescript';
|
|
7
|
+
|
|
8
|
+
/** The generated-by banner prepended to every emitted module. */
|
|
9
|
+
export const HEADER = `// Generated by @redocly/client-generator — do not edit by hand.
|
|
10
|
+
// Source: OpenAPI description. Re-run \`redocly generate-client\` to update.`;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Assemble file content from a header banner and a printed body: the leading
|
|
14
|
+
* `// Generated by …` comment and the `/** title */` block are structural
|
|
15
|
+
* banners (not part of the printed AST), prepended with blank-line separation.
|
|
16
|
+
* Trailing newline mirrors a hand-authored file.
|
|
17
|
+
*/
|
|
18
|
+
export function banner(sections: string[]): string {
|
|
19
|
+
return sections.filter((s) => s.length > 0).join('\n\n') + '\n';
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function renderTitleComment(model: ApiModel): string {
|
|
23
|
+
// This banner is a raw string (it does not flow through `jsdoc()`), so escape
|
|
24
|
+
// `*/` here too — `info.title`/`info.description` are attacker-controllable and
|
|
25
|
+
// would otherwise close the comment and inject code at the top of every file.
|
|
26
|
+
const lines = [`/**`, ` * ${escapeJsDoc(`${model.title} (v${model.version})`)}`];
|
|
27
|
+
if (model.description) {
|
|
28
|
+
for (const line of splitLines(escapeJsDoc(model.description))) {
|
|
29
|
+
// A blank line prints as ` *` — a trailing space fails consumer formatter checks.
|
|
30
|
+
lines.push(` * ${line}`.replace(/ +$/, ''));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
lines.push(' */');
|
|
34
|
+
return lines.join('\n');
|
|
35
|
+
}
|