@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,214 @@
|
|
|
1
|
+
// Ejected from @redocly/client-generator@0.4.0 — the built-in "mock" 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 mock --update`.
|
|
5
|
+
// Builds the body value for a faker-mode mock factory: a tree of
|
|
6
|
+
// `@faker-js/faker` call expressions that produce realistic — and, with a seed,
|
|
7
|
+
// reproducible — data. Structurally mirrors `./sample.ts`'s `walk` (same
|
|
8
|
+
// recursion + same visited-set cycle guard), but yields faker calls instead of a
|
|
9
|
+
// static value. Nested refs are INLINED under the same cycle guard (never
|
|
10
|
+
// `create<Ref>()` calls), so a cyclic schema terminates with `null` at the cycle
|
|
11
|
+
// instead of recursing forever at runtime — exactly like the static path. The
|
|
12
|
+
// factory signatures are identical to the static mode's, so a consumer can flip
|
|
13
|
+
// `mockData` without touching call sites; `@faker-js/faker` becomes their
|
|
14
|
+
// dev-dep while the real client stays dependency-free.
|
|
15
|
+
|
|
16
|
+
import {
|
|
17
|
+
type DateType,
|
|
18
|
+
type NamedSchemaModel,
|
|
19
|
+
type ScalarKind,
|
|
20
|
+
type SchemaMetadata,
|
|
21
|
+
type SchemaModel,
|
|
22
|
+
} from '@redocly/client-generator';
|
|
23
|
+
import { codeLiteral } from '@redocly/client-generator/printers/typescript';
|
|
24
|
+
|
|
25
|
+
import { splitIntersection } from './sample.ts';
|
|
26
|
+
import { expr, isObjectValue, type MockEntry, type MockValue, objectValue } from './values.ts';
|
|
27
|
+
|
|
28
|
+
/** The faker-call value for an IR schema. Refs resolve against `schemas`;
|
|
29
|
+
* recursion is cut with a visited-set (`null` at the cycle). `dateType` mirrors
|
|
30
|
+
* the sdk's `--date-type`: under `'Date'`, date fields stay `faker.date.recent()`
|
|
31
|
+
* (a `Date`); otherwise they are stringified to match the `string`-typed sdk. */
|
|
32
|
+
export function fakerExpression(
|
|
33
|
+
schema: SchemaModel,
|
|
34
|
+
schemas: NamedSchemaModel[],
|
|
35
|
+
opts: { dateType?: DateType } = {}
|
|
36
|
+
): MockValue {
|
|
37
|
+
const byName = new Map(schemas.map((s) => [s.name, s.schema]));
|
|
38
|
+
const value = walk(schema, byName, new Set(), opts.dateType ?? 'string');
|
|
39
|
+
// A `CYCLE` that reaches the root has no container to absorb it (e.g. a
|
|
40
|
+
// self-referential union); fall back to null.
|
|
41
|
+
return value === CYCLE ? expr('null') : value;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Sentinel returned by `walk` when a `$ref` re-enters a name already on the stack.
|
|
46
|
+
* Containers turn it into the type-correct empty value for their position — an array
|
|
47
|
+
* to `[]`, a record to `{}`, an optional property to omission — mirroring `./sample.ts`
|
|
48
|
+
* so a recursive schema yields a faker tree that still satisfies its non-nullable type.
|
|
49
|
+
* Only a required, non-container self-reference (an uninhabitable schema) degrades to null.
|
|
50
|
+
*/
|
|
51
|
+
const CYCLE = Symbol('cycle');
|
|
52
|
+
|
|
53
|
+
type WalkResult = MockValue | typeof CYCLE;
|
|
54
|
+
|
|
55
|
+
function walk(
|
|
56
|
+
schema: SchemaModel,
|
|
57
|
+
byName: Map<string, SchemaModel>,
|
|
58
|
+
visiting: Set<string>,
|
|
59
|
+
dateType: DateType
|
|
60
|
+
): WalkResult {
|
|
61
|
+
switch (schema.kind) {
|
|
62
|
+
case 'scalar':
|
|
63
|
+
return expr(scalarExpr(schema.scalar, schema.metadata, dateType));
|
|
64
|
+
case 'array': {
|
|
65
|
+
// A cyclic item type collapses the array to `[]` — itself a valid `T[]`.
|
|
66
|
+
const item = walk(schema.items, byName, visiting, dateType);
|
|
67
|
+
return item === CYCLE ? expr('[]') : multiple(item);
|
|
68
|
+
}
|
|
69
|
+
case 'object':
|
|
70
|
+
return objectValue(
|
|
71
|
+
schema.properties.flatMap((p): MockEntry[] => {
|
|
72
|
+
const value = walk(p.schema, byName, visiting, dateType);
|
|
73
|
+
// A cyclic optional property is omitted; a cyclic required property is
|
|
74
|
+
// uninhabitable, so null is the only stand-in.
|
|
75
|
+
if (value === CYCLE) return p.required ? [{ key: p.name, value: expr('null') }] : [];
|
|
76
|
+
return [{ key: p.name, value }];
|
|
77
|
+
})
|
|
78
|
+
);
|
|
79
|
+
case 'record': {
|
|
80
|
+
const value = walk(schema.value, byName, visiting, dateType);
|
|
81
|
+
return value === CYCLE ? expr('{}') : objectValue([{ key: 'key', value }]);
|
|
82
|
+
}
|
|
83
|
+
case 'enum':
|
|
84
|
+
return expr(
|
|
85
|
+
`faker.helpers.arrayElement([${schema.values.map((value) => codeLiteral(value)).join(', ')}] as const)`
|
|
86
|
+
);
|
|
87
|
+
case 'literal':
|
|
88
|
+
return expr(codeLiteral(schema.value));
|
|
89
|
+
case 'union': {
|
|
90
|
+
// First non-cyclic member; if every member cycles, propagate `CYCLE`.
|
|
91
|
+
for (const member of schema.members) {
|
|
92
|
+
const value = walk(member, byName, visiting, dateType);
|
|
93
|
+
if (value !== CYCLE) return value;
|
|
94
|
+
}
|
|
95
|
+
return schema.members.length > 0 ? CYCLE : expr('null');
|
|
96
|
+
}
|
|
97
|
+
case 'intersection': {
|
|
98
|
+
// Mirror the static sampler: object members merge into one synthetic object whose
|
|
99
|
+
// property conflicts resolve by SPECIFICITY (see `splitIntersection`); `unknown`
|
|
100
|
+
// members are constraint-only and dropped; with no object member, the first
|
|
101
|
+
// member's expression IS the value (a scalar-narrowing intersection).
|
|
102
|
+
const { merged, rest } = splitIntersection(schema.members, byName);
|
|
103
|
+
const parts = rest
|
|
104
|
+
.map((member) => walk(member, byName, visiting, dateType))
|
|
105
|
+
.filter((part): part is MockValue => part !== CYCLE);
|
|
106
|
+
if (merged) {
|
|
107
|
+
const value = walk(merged, byName, visiting, dateType);
|
|
108
|
+
const own = value !== CYCLE && isObjectValue(value) ? value.entries : [];
|
|
109
|
+
const folded = parts.filter(isObjectValue).flatMap((part) => part.entries);
|
|
110
|
+
return objectValue([...own, ...folded]);
|
|
111
|
+
}
|
|
112
|
+
const objects = parts.filter(isObjectValue);
|
|
113
|
+
if (objects.length > 0) {
|
|
114
|
+
return objectValue(objects.flatMap((part) => part.entries));
|
|
115
|
+
}
|
|
116
|
+
return parts[0] ?? objectValue([]);
|
|
117
|
+
}
|
|
118
|
+
case 'omit':
|
|
119
|
+
return omitExpr(schema.base, schema.keys, byName, visiting, dateType);
|
|
120
|
+
case 'ref': {
|
|
121
|
+
if (visiting.has(schema.name)) return CYCLE;
|
|
122
|
+
const target = byName.get(schema.name);
|
|
123
|
+
if (!target) return expr('null');
|
|
124
|
+
visiting.add(schema.name);
|
|
125
|
+
const result = walk(target, byName, visiting, dateType);
|
|
126
|
+
visiting.delete(schema.name);
|
|
127
|
+
return result;
|
|
128
|
+
}
|
|
129
|
+
case 'null':
|
|
130
|
+
case 'unknown':
|
|
131
|
+
return expr('null');
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** The faker call for a scalar, keyed by kind then `format`. A binary field has no
|
|
136
|
+
* faker generator (its type is `Blob`), so it emits `new Blob([])` — the same
|
|
137
|
+
* type-demanded expression the static path uses, taking precedence over any example. */
|
|
138
|
+
function scalarExpr(
|
|
139
|
+
scalar: ScalarKind,
|
|
140
|
+
meta: SchemaMetadata | undefined,
|
|
141
|
+
dateType: DateType
|
|
142
|
+
): string {
|
|
143
|
+
if (meta?.format === 'binary') return 'new Blob([])';
|
|
144
|
+
if (scalar === 'boolean') return 'faker.datatype.boolean()';
|
|
145
|
+
if (scalar === 'integer') return `faker.number.int(${boundsArg(meta)})`;
|
|
146
|
+
if (scalar === 'number') return `faker.number.float(${boundsArg(meta)})`;
|
|
147
|
+
switch (meta?.format) {
|
|
148
|
+
case 'email':
|
|
149
|
+
return 'faker.internet.email()';
|
|
150
|
+
case 'uuid':
|
|
151
|
+
return 'faker.string.uuid()';
|
|
152
|
+
case 'uri':
|
|
153
|
+
case 'url':
|
|
154
|
+
return 'faker.internet.url()';
|
|
155
|
+
case 'hostname':
|
|
156
|
+
return 'faker.internet.domainName()';
|
|
157
|
+
case 'ipv4':
|
|
158
|
+
return 'faker.internet.ipv4()';
|
|
159
|
+
case 'date-time':
|
|
160
|
+
return dateExpr(dateType, false);
|
|
161
|
+
case 'date':
|
|
162
|
+
return dateExpr(dateType, true);
|
|
163
|
+
default:
|
|
164
|
+
return 'faker.lorem.word()';
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/** `faker.date.recent()` (under `dateType: 'Date'`); else its ISO string, sliced to
|
|
169
|
+
* `YYYY-MM-DD` for a `date` so the wire shape matches the `string`-typed field. */
|
|
170
|
+
function dateExpr(dateType: DateType, dateOnly: boolean): string {
|
|
171
|
+
if (dateType === 'Date') return 'faker.date.recent()';
|
|
172
|
+
const iso = 'faker.date.recent().toISOString()';
|
|
173
|
+
return dateOnly ? `${iso}.slice(0, 10)` : iso;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/** `{ min, max }` arg for a bounded numeric, or empty when neither bound is set. */
|
|
177
|
+
function boundsArg(meta: SchemaMetadata | undefined): string {
|
|
178
|
+
const props = [
|
|
179
|
+
...(meta?.minimum !== undefined ? [`min: ${meta.minimum}`] : []),
|
|
180
|
+
...(meta?.maximum !== undefined ? [`max: ${meta.maximum}`] : []),
|
|
181
|
+
];
|
|
182
|
+
return props.length > 0 ? `{ ${props.join(', ')} }` : '';
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/** `faker.helpers.multiple(() => <item>, { count: 1 })` — one element keeps output small.
|
|
186
|
+
* An object-literal arrow body must be parenthesized (`() => ({ … })`), or the braces
|
|
187
|
+
* parse as a block. */
|
|
188
|
+
function multiple(item: MockValue): MockValue {
|
|
189
|
+
const object = isObjectValue(item);
|
|
190
|
+
return {
|
|
191
|
+
kind: 'wrap',
|
|
192
|
+
before: `faker.helpers.multiple(() => ${object ? '(' : ''}`,
|
|
193
|
+
value: item,
|
|
194
|
+
after: `${object ? ')' : ''}, { count: 1 })`,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/** An `omit`: the base named schema's faker value minus the dropped keys. Resolves the
|
|
199
|
+
* base via the schema set (cycle-guarded); a non-object base passes through unchanged. */
|
|
200
|
+
function omitExpr(
|
|
201
|
+
base: string,
|
|
202
|
+
keys: string[],
|
|
203
|
+
byName: Map<string, SchemaModel>,
|
|
204
|
+
visiting: Set<string>,
|
|
205
|
+
dateType: DateType
|
|
206
|
+
): WalkResult {
|
|
207
|
+
const target = byName.get(base);
|
|
208
|
+
if (!target) return expr('null');
|
|
209
|
+
const value = walk(target, byName, visiting, dateType);
|
|
210
|
+
// A cyclic or non-object base passes through unchanged (a container/root absorbs `CYCLE`).
|
|
211
|
+
if (value === CYCLE || !isObjectValue(value)) return value;
|
|
212
|
+
const drop = new Set(keys);
|
|
213
|
+
return objectValue(value.entries.filter((entry) => 'spread' in entry || !drop.has(entry.key)));
|
|
214
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// Ejected from @redocly/client-generator@0.4.0 — the built-in "mock" 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 mock --update`.
|
|
5
|
+
import type { Generator } from '@redocly/client-generator';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
|
|
8
|
+
import { renderMockModule } from './render.ts';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* The mock generator: a standalone `<stem>.mocks.ts` module of MSW handlers and
|
|
12
|
+
* data factories baked from the spec. Imports `msw` (the consumer's dev-dep); the
|
|
13
|
+
* sdk client stays dependency-free. Output-mode-agnostic in v1 — one module beside
|
|
14
|
+
* the client. Emits nothing when there are no operations.
|
|
15
|
+
*/
|
|
16
|
+
export const mockGenerator: Generator = ({ model, output, banner, emit }) => {
|
|
17
|
+
const header = banner.map((line) => `// ${line}`).join('\n');
|
|
18
|
+
const content = renderMockModule(model, {
|
|
19
|
+
sdkModule: `./${output.stem}.${emit.importExt ?? 'js'}`,
|
|
20
|
+
dateType: emit.dateType,
|
|
21
|
+
mockData: emit.mockData,
|
|
22
|
+
mockSeed: emit.mockSeed,
|
|
23
|
+
});
|
|
24
|
+
if (content === '') return [];
|
|
25
|
+
return [
|
|
26
|
+
{ path: join(output.dir, `${output.stem}.mocks.ts`), content: `${header}\n\n${content}` },
|
|
27
|
+
];
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export default {
|
|
31
|
+
name: 'mock',
|
|
32
|
+
run: mockGenerator,
|
|
33
|
+
requires: ["typescript"],
|
|
34
|
+
requiresGenerator: '^0.4.0',
|
|
35
|
+
};
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
// Ejected from @redocly/client-generator@0.4.0 — the built-in "mock" 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 mock --update`.
|
|
5
|
+
// Emits a `*.mocks.ts` module: a `create<Schema>(overrides?)` data factory per
|
|
6
|
+
// named schema, an `<op>Handler(override?)` MSW request handler per operation
|
|
7
|
+
// (its primary success response), and an aggregated `handlers` array. Response
|
|
8
|
+
// data is sampled at codegen time (`sampleValue`) and printed as TypeScript
|
|
9
|
+
// literals — source-text templates — so the generated module depends only on
|
|
10
|
+
// `msw`; the real client stays zero-dependency.
|
|
11
|
+
|
|
12
|
+
import {
|
|
13
|
+
allOperations,
|
|
14
|
+
type ApiModel,
|
|
15
|
+
type DateType,
|
|
16
|
+
type NamedSchemaModel,
|
|
17
|
+
type OperationModel,
|
|
18
|
+
type ResponseBodyModel,
|
|
19
|
+
type SchemaModel,
|
|
20
|
+
} from '@redocly/client-generator';
|
|
21
|
+
import {
|
|
22
|
+
codeLiteral,
|
|
23
|
+
isIdentifier,
|
|
24
|
+
pascalCase,
|
|
25
|
+
} from '@redocly/client-generator/printers/typescript';
|
|
26
|
+
import { isPlainObject } from '@redocly/openapi-core';
|
|
27
|
+
|
|
28
|
+
import { fakerExpression } from './faker.ts';
|
|
29
|
+
import { sampleValue, SampleExpression } from './sample.ts';
|
|
30
|
+
import {
|
|
31
|
+
expr,
|
|
32
|
+
isObjectValue,
|
|
33
|
+
type MockValue,
|
|
34
|
+
objectValue,
|
|
35
|
+
renderMockValue,
|
|
36
|
+
spreadInto,
|
|
37
|
+
} from './values.ts';
|
|
38
|
+
|
|
39
|
+
const INDENT = ' ';
|
|
40
|
+
|
|
41
|
+
export type MockOptions = {
|
|
42
|
+
/** Import specifier for the sdk entry the schema types live in. */
|
|
43
|
+
sdkModule: string;
|
|
44
|
+
/** Must match the sdk's `--date-type`: under `'Date'` the sampler bakes date
|
|
45
|
+
* fields as `new Date(...)` so the mock data matches the `Date`-typed sdk. */
|
|
46
|
+
dateType?: DateType;
|
|
47
|
+
/**
|
|
48
|
+
* How factory/handler bodies produce data. `'static'` (default) inlines deterministic
|
|
49
|
+
* literals from the sampler (zero-dep, contract-faithful). `'faker'` emits
|
|
50
|
+
* `@faker-js/faker` calls for realistic data — reproducible when `mockSeed` is set —
|
|
51
|
+
* making `@faker-js/faker` the consumer's dev-dep. Factory signatures are identical
|
|
52
|
+
* across modes, so a consumer can flip this without changing call sites.
|
|
53
|
+
*/
|
|
54
|
+
mockData?: 'static' | 'faker';
|
|
55
|
+
/** When set in `'faker'` mode, emit a top-level `faker.seed(<n>);` so runs reproduce. */
|
|
56
|
+
mockSeed?: number;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/** The body value for `schema` under the active data mode: a static literal tree
|
|
60
|
+
* (`'static'`) or a tree of `@faker-js/faker` calls (`'faker'`). Both honor `dateType`
|
|
61
|
+
* and the binary/Blob type demand; the faker path inlines refs with the same cycle
|
|
62
|
+
* guard as the static sampler, so neither recurses forever on a cyclic schema. */
|
|
63
|
+
function bodyValue(schema: SchemaModel, model: ApiModel, opts: MockOptions): MockValue {
|
|
64
|
+
return opts.mockData === 'faker'
|
|
65
|
+
? fakerExpression(schema, model.schemas, { dateType: opts.dateType })
|
|
66
|
+
: literal(sampleValue(schema, model.schemas, { dateType: opts.dateType }));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** Render the full `*.mocks.ts` source. `''` when the model has no operations. */
|
|
70
|
+
export function renderMockModule(model: ApiModel, opts: MockOptions): string {
|
|
71
|
+
const operations = allOperations(model.services);
|
|
72
|
+
if (operations.length === 0) return '';
|
|
73
|
+
const blocks = [
|
|
74
|
+
...schemaTypeImport(model, opts),
|
|
75
|
+
// Faker mode imports `faker` (the consumer's dev-dep) and, with a seed, pins it once
|
|
76
|
+
// at module top so every run reproduces. Static mode emits neither (stays zero-dep).
|
|
77
|
+
...(opts.mockData === 'faker' && opts.mockSeed !== undefined
|
|
78
|
+
? [`faker.seed(${opts.mockSeed});`]
|
|
79
|
+
: []),
|
|
80
|
+
...model.schemas.map((s) => factoryFor(s, model, opts)),
|
|
81
|
+
...operations.flatMap((op) => [
|
|
82
|
+
handlerFor(op, model, opts),
|
|
83
|
+
...(op.errorResponses.length > 0 ? [errorHandlerFor(op, model, opts)] : []),
|
|
84
|
+
]),
|
|
85
|
+
handlersArray(operations),
|
|
86
|
+
];
|
|
87
|
+
const fakerImport = opts.mockData === 'faker' ? "import { faker } from '@faker-js/faker';\n" : '';
|
|
88
|
+
return `import { http, HttpResponse } from 'msw';\n${fakerImport}\n${blocks.join('\n\n')}`;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* `import type { A, B, … } from '<sdkModule>';` — the named-schema types the factories
|
|
93
|
+
* reference (`create<Pascal>` returns/accepts `<Pascal>`). Sorted for stable output.
|
|
94
|
+
* Empty when the model has no named schemas (so no type import is emitted). Importing
|
|
95
|
+
* the schema types also shadows globals of the same name (e.g. an `Error` schema) so the
|
|
96
|
+
* factory return types resolve to the generated type, not `globalThis.Error`.
|
|
97
|
+
*/
|
|
98
|
+
function schemaTypeImport(model: ApiModel, opts: MockOptions): string[] {
|
|
99
|
+
if (model.schemas.length === 0) return [];
|
|
100
|
+
// Verbatim, not PascalCased: the sdk exports each schema type under its emitted name
|
|
101
|
+
// (`pet` stays `pet`), and the import must match it exactly.
|
|
102
|
+
const names = model.schemas.map((s) => s.name).sort();
|
|
103
|
+
return [`import type { ${names.join(', ')} } from ${JSON.stringify(opts.sdkModule)};`];
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* `export function create<Pascal>(overrides?: Partial<Name>): Name { return { …sampled, ...overrides }; }`.
|
|
108
|
+
* A schema whose sample is not an object literal (a scalar, enum, date, …) has nothing
|
|
109
|
+
* to spread into — `Partial<string>` is meaningless and would silently drop the argument —
|
|
110
|
+
* so its factory takes the FULL type and returns the override wholesale (`overrides ?? sample`).
|
|
111
|
+
*/
|
|
112
|
+
function factoryFor(named: NamedSchemaModel, model: ApiModel, opts: MockOptions): string {
|
|
113
|
+
const pascal = pascalCase(named.name);
|
|
114
|
+
const sampled = bodyValue(named.schema, model, opts);
|
|
115
|
+
// Type references use the sdk's verbatim export name; only the factory NAME is PascalCased.
|
|
116
|
+
const typeName = named.name;
|
|
117
|
+
const spreads = isObjectValue(sampled);
|
|
118
|
+
// Spreading `Partial<Union>` (the override type of a union schema) distributes into
|
|
119
|
+
// `Partial<A> | Partial<B>`, which widens any discriminant property (e.g. `category`)
|
|
120
|
+
// and defeats narrowing — TS can no longer place the literal in a single union member.
|
|
121
|
+
// The sampled object is already a complete, correct member, so re-assert the type.
|
|
122
|
+
const rendered = renderMockValue(spreads ? spreadInto(sampled, 'overrides') : sampled, INDENT);
|
|
123
|
+
const body = !spreads
|
|
124
|
+
? `overrides ?? ${rendered}`
|
|
125
|
+
: named.schema.kind === 'union'
|
|
126
|
+
? `${rendered} as ${typeName}`
|
|
127
|
+
: rendered;
|
|
128
|
+
const overridesType = spreads ? `Partial<${typeName}>` : typeName;
|
|
129
|
+
return [
|
|
130
|
+
`export function create${pascal}(overrides?: ${overridesType}): ${typeName} {`,
|
|
131
|
+
`${INDENT}return ${body};`,
|
|
132
|
+
'}',
|
|
133
|
+
].join('\n');
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* The interpolation gate for values that land in emitted CODE positions (binding
|
|
138
|
+
* names, `http.<method>` member access). The pipeline sanitizes operation names
|
|
139
|
+
* before any emitter runs; this re-checks at the construction site so a hostile
|
|
140
|
+
* name can never become code even if that invariant regresses.
|
|
141
|
+
*/
|
|
142
|
+
function codeIdent(value: string): string {
|
|
143
|
+
if (!isIdentifier(value)) {
|
|
144
|
+
throw new Error(`Unsafe identifier in mock emission: ${JSON.stringify(value)}`);
|
|
145
|
+
}
|
|
146
|
+
return value;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/** `export const <op>Handler = (override?: <OverrideType>) => http.<method>('<path>', () => <response>);`. */
|
|
150
|
+
function handlerFor(op: OperationModel, model: ApiModel, opts: MockOptions): string {
|
|
151
|
+
const override = overrideParam(op, model, opts);
|
|
152
|
+
const params = override ?? '';
|
|
153
|
+
const call = `http.${codeIdent(op.method)}(${JSON.stringify(mswPath(op.path))}, () => ${responseExpression(op, model, opts)})`;
|
|
154
|
+
return `export const ${codeIdent(op.name)}Handler = (${params}) => ${call};`;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* `export const <op>ErrorHandler = (status: <StatusUnion>, body?: <BodyType>) =>
|
|
159
|
+
* http.<method>("<mswPath>", () => HttpResponse.json(body ?? <staticSample>, { status }));`
|
|
160
|
+
*
|
|
161
|
+
* Opt-in (not added to `handlers`): `server.use(getPetErrorHandler(404))` overrides the
|
|
162
|
+
* happy path with an error. `<StatusUnion>` is the declared error statuses as literals
|
|
163
|
+
* (plus `number` when a `default` error is present, so any status is allowed). The static
|
|
164
|
+
* fallback samples the FIRST error response's schema.
|
|
165
|
+
*/
|
|
166
|
+
function errorHandlerFor(op: OperationModel, model: ApiModel, opts: MockOptions): string {
|
|
167
|
+
const first = op.errorResponses[0];
|
|
168
|
+
const sampled = renderMockValue(bodyValue(first.schema, model, opts), '');
|
|
169
|
+
const resolver = `() => HttpResponse.json(body ?? ${sampled}, { status })`;
|
|
170
|
+
const call = `http.${codeIdent(op.method)}(${JSON.stringify(mswPath(op.path))}, ${resolver})`;
|
|
171
|
+
return `export const ${codeIdent(op.name)}ErrorHandler = (status: ${errorStatusType(op)}, body?: ${errorBodyType(op)}) => ${call};`;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* A union of the op's declared numeric error statuses (as literals); `number` is used in place
|
|
176
|
+
* of a literal whenever a `default` error or a `4XX`/`5XX` range is present, so any status is
|
|
177
|
+
* accepted. De-duped, since a multi-media-type error contributes the same status more than once.
|
|
178
|
+
*/
|
|
179
|
+
function errorStatusType(op: OperationModel): string {
|
|
180
|
+
const codes = [
|
|
181
|
+
...new Set(
|
|
182
|
+
op.errorResponses.filter((r) => typeof r.status === 'number').map((r) => r.status as number)
|
|
183
|
+
),
|
|
184
|
+
];
|
|
185
|
+
const members: string[] = codes.map(String);
|
|
186
|
+
// A `default` error (or a range wildcard) means any status is valid — widen with `number`.
|
|
187
|
+
if (op.errorResponses.some((r) => typeof r.status !== 'number')) {
|
|
188
|
+
members.push('number');
|
|
189
|
+
}
|
|
190
|
+
return members.join(' | ');
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* The `body?` type: the union of the error responses' body types — `ref` bodies map to their
|
|
195
|
+
* named type, anything else to `unknown` (matching how the success handler types its override
|
|
196
|
+
* loosely). De-duped by printed name.
|
|
197
|
+
*/
|
|
198
|
+
function errorBodyType(op: OperationModel): string {
|
|
199
|
+
const names = new Set<string>();
|
|
200
|
+
let hasUnknown = false;
|
|
201
|
+
for (const r of op.errorResponses) {
|
|
202
|
+
if (r.schema.kind === 'ref') names.add(r.schema.name);
|
|
203
|
+
else hasUnknown = true;
|
|
204
|
+
}
|
|
205
|
+
const members = [...names];
|
|
206
|
+
if (hasUnknown || members.length === 0) members.push('unknown');
|
|
207
|
+
return members.join(' | ');
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* The handler's `override?` parameter, present only when the response consumes it.
|
|
212
|
+
* A `ref` success body forwards `override` to `create<Schema>(override)`, so its type
|
|
213
|
+
* mirrors the factory's parameter (`Partial<Schema>`, or the full type when the factory
|
|
214
|
+
* replaces wholesale — see `factoryFor`). An inline object body spreads `override`, typed
|
|
215
|
+
* `Record<string, unknown>`. A body-less or non-object inline response has nothing to
|
|
216
|
+
* override, so the handler takes no parameter.
|
|
217
|
+
*/
|
|
218
|
+
function overrideParam(op: OperationModel, model: ApiModel, opts: MockOptions): string | undefined {
|
|
219
|
+
const success = op.successResponses[0];
|
|
220
|
+
if (!success || success.schema.kind === 'unknown') return undefined;
|
|
221
|
+
if (success.schema.kind === 'ref') {
|
|
222
|
+
const typeName = success.schema.name;
|
|
223
|
+
const type = isObjectValue(bodyValue(success.schema, model, opts))
|
|
224
|
+
? `Partial<${typeName}>`
|
|
225
|
+
: typeName;
|
|
226
|
+
return `override?: ${type}`;
|
|
227
|
+
}
|
|
228
|
+
if (!isObjectValue(bodyValue(success.schema, model, opts))) return undefined;
|
|
229
|
+
return 'override?: Record<string, unknown>';
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* The handler's response. A primary success body becomes `HttpResponse.json(…)`:
|
|
234
|
+
* a `ref` body calls its named `create<Schema>(override)` factory; an inline body
|
|
235
|
+
* is sampled and printed in place with `...override` spread in. A success with no
|
|
236
|
+
* usable body (an `unknown` schema, or no success response at all) becomes a
|
|
237
|
+
* body-less `new HttpResponse(null, { status })`. The status is the success
|
|
238
|
+
* response's declared code, or 200 when it's `default`/absent.
|
|
239
|
+
*/
|
|
240
|
+
function responseExpression(op: OperationModel, model: ApiModel, opts: MockOptions): string {
|
|
241
|
+
const success = op.successResponses[0];
|
|
242
|
+
const status = statusCode(success?.status);
|
|
243
|
+
if (!success || success.schema.kind === 'unknown') {
|
|
244
|
+
return `new HttpResponse(null, { status: ${status} })`;
|
|
245
|
+
}
|
|
246
|
+
const data =
|
|
247
|
+
success.schema.kind === 'ref'
|
|
248
|
+
? `create${pascalCase(success.schema.name)}(override)`
|
|
249
|
+
: renderMockValue(spreadInto(bodyValue(success.schema, model, opts), 'override'), '');
|
|
250
|
+
// `HttpResponse.json(x)` already defaults to 200, so only pass `{ status }` when it differs.
|
|
251
|
+
const args = status === 200 ? data : `${data}, { status: ${status} }`;
|
|
252
|
+
return `HttpResponse.json(${args})`;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/** Numeric status for a response, mapping `default`/absent to 200. */
|
|
256
|
+
function statusCode(status: ResponseBodyModel['status'] | undefined): number {
|
|
257
|
+
return typeof status === 'number' ? status : 200;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/** `export const handlers = [<op>Handler(), …];`. */
|
|
261
|
+
function handlersArray(operations: OperationModel[]): string {
|
|
262
|
+
const elements = operations.map((op) => `${codeIdent(op.name)}Handler()`).join(', ');
|
|
263
|
+
return `export const handlers = [${elements}];`;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/** `/pets/{petId}` → `*/pets/:petId` — MSW path with a wildcard origin and `:param` segments. */
|
|
267
|
+
function mswPath(path: string): string {
|
|
268
|
+
return `*${path.replace(/\{([^{}]+)\}/g, ':$1')}`;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/** Recursively lift a sampled JS value into the render tree. Containers render
|
|
272
|
+
* multiline; a `SampleExpression` carries pre-built source (`new Date(...)`). */
|
|
273
|
+
function literal(value: unknown): MockValue {
|
|
274
|
+
if (value instanceof SampleExpression) return expr(value.code);
|
|
275
|
+
if (Array.isArray(value)) return { kind: 'array', items: value.map(literal) };
|
|
276
|
+
if (isPlainObject(value)) {
|
|
277
|
+
return objectValue(
|
|
278
|
+
Object.entries(value).map(([key, entryValue]) => ({ key, value: literal(entryValue) }))
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
return expr(codeLiteral(value));
|
|
282
|
+
}
|