@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,237 @@
|
|
|
1
|
+
// Ejected from @redocly/client-generator@0.4.0 — the built-in "php" 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 php --update`.
|
|
5
|
+
// The built-in `php` generator — the third non-TypeScript library entry, authored
|
|
6
|
+
// with the language-neutral toolkit only (same dogfooding invariant as python/go,
|
|
7
|
+
// pinned by the guard test). Output is a single PHP >= 8.1 file over the curl
|
|
8
|
+
// extension: promoted-constructor classes with fromArray/toArray hydration, native
|
|
9
|
+
// backed enums, match-based discriminator dispatchers, and a Client over the
|
|
10
|
+
// embedded runtime. Exceptions are the error mode (`errorMode` does not apply).
|
|
11
|
+
|
|
12
|
+
import {
|
|
13
|
+
type CodeSample,
|
|
14
|
+
type Generator,
|
|
15
|
+
identifierFor,
|
|
16
|
+
jsonSuccessSchema,
|
|
17
|
+
type NeutralPaginationRule,
|
|
18
|
+
type OperationModel,
|
|
19
|
+
paginationItemSchema,
|
|
20
|
+
renderReferencePage,
|
|
21
|
+
type SampleContext,
|
|
22
|
+
sseResponse,
|
|
23
|
+
} from '@redocly/client-generator';
|
|
24
|
+
import { PhpPrinter } from '@redocly/client-generator/printers/php';
|
|
25
|
+
import { PHP_RUNTIME_SOURCE } from '@redocly/client-generator/runtime-sources';
|
|
26
|
+
|
|
27
|
+
import { writeServers } from './client.ts';
|
|
28
|
+
import { phpPaginationLiteral, phpSecurityLiteral } from './descriptor.ts';
|
|
29
|
+
import { hydration, renderPhpModels } from './models.ts';
|
|
30
|
+
import { methodIdents, methodName, PHP, phpString, propertyName } from './naming.ts';
|
|
31
|
+
import { writePhpMethod } from './operations.ts';
|
|
32
|
+
import { writePhpPaginationWrappers } from './pagination.ts';
|
|
33
|
+
import { phpType } from './types.ts';
|
|
34
|
+
|
|
35
|
+
export { renderPhpModels } from './models.ts';
|
|
36
|
+
export { phpType } from './types.ts';
|
|
37
|
+
|
|
38
|
+
/** Drop the standalone header (<?php, declare, namespace, leading comments) for stitching. */
|
|
39
|
+
function stripPhpHeader(source: string): string {
|
|
40
|
+
const lines = source.split('\n');
|
|
41
|
+
let start = 0;
|
|
42
|
+
for (let index = 0; index < lines.length; index++) {
|
|
43
|
+
const line = lines[index].trim();
|
|
44
|
+
if (line.startsWith('namespace ')) {
|
|
45
|
+
start = index + 1;
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return lines.slice(start).join('\n').trim();
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** The whole generated file: namespace + models + embedded runtime + operations + Client. */
|
|
53
|
+
export const phpGenerator: Generator = ({ model, output, banner, emit, pagination }) => {
|
|
54
|
+
const printer = new PhpPrinter();
|
|
55
|
+
const dateType = emit.dateType ?? 'string';
|
|
56
|
+
const namespace = identifierFor(model.title, { style: 'pascal', reserved: PHP });
|
|
57
|
+
printer.line('<?php');
|
|
58
|
+
printer.blank();
|
|
59
|
+
printer.line(
|
|
60
|
+
`// Code generated by @redocly/client-generator (php) from ${phpString(model.title)} ${model.version}. DO NOT EDIT.`
|
|
61
|
+
);
|
|
62
|
+
printer.line(
|
|
63
|
+
'// Regenerate with `redocly generate-client`. PHP >= 8.1, curl extension — zero Composer dependencies.'
|
|
64
|
+
);
|
|
65
|
+
printer.blank();
|
|
66
|
+
printer.line('declare(strict_types=1);');
|
|
67
|
+
printer.blank();
|
|
68
|
+
printer.line(`namespace ${namespace};`);
|
|
69
|
+
printer.blank();
|
|
70
|
+
printer.line(renderPhpModels(model, dateType));
|
|
71
|
+
writeServers(printer, model);
|
|
72
|
+
if (emit.runtime === 'module') {
|
|
73
|
+
// The runtime file re-declares this same namespace, so the require binds the
|
|
74
|
+
// exact names the inline stitching would have defined at this position.
|
|
75
|
+
printer.line('// ─── Runtime (a real file beside this one, written by the same run) ───');
|
|
76
|
+
printer.line("require_once __DIR__ . '/runtime.php';");
|
|
77
|
+
printer.blank();
|
|
78
|
+
} else {
|
|
79
|
+
printer.line('// ─── Embedded runtime (@redocly/client-generator php runtime) ───');
|
|
80
|
+
printer.line(stripPhpHeader(PHP_RUNTIME_SOURCE));
|
|
81
|
+
printer.blank();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const operations = model.services.flatMap((service) => service.operations);
|
|
85
|
+
const idents = methodIdents(model);
|
|
86
|
+
// Pagination arrives RESOLVED from the pipeline — one fit-verified answer per run.
|
|
87
|
+
const paginationRules = new Map<string, NeutralPaginationRule>();
|
|
88
|
+
for (const op of operations) {
|
|
89
|
+
const spec = pagination?.get(op.name)?.spec;
|
|
90
|
+
if (spec !== undefined) paginationRules.set(op.name, spec);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
printer.block(
|
|
94
|
+
'const OPERATIONS = [',
|
|
95
|
+
() => {
|
|
96
|
+
for (const op of operations) {
|
|
97
|
+
const id = op.specName ?? op.name;
|
|
98
|
+
const security = phpSecurityLiteral(op, model);
|
|
99
|
+
const rule = paginationRules.get(op.name);
|
|
100
|
+
const fields = [
|
|
101
|
+
`'id' => ${phpString(id)}`,
|
|
102
|
+
`'method' => ${phpString(op.method.toUpperCase())}`,
|
|
103
|
+
`'path' => ${phpString(op.path)}`,
|
|
104
|
+
...(security !== undefined ? [`'security' => ${security}`] : []),
|
|
105
|
+
...(rule !== undefined ? [`'pagination' => ${phpPaginationLiteral(rule)}`] : []),
|
|
106
|
+
];
|
|
107
|
+
printer.line(`${phpString(id)} => [${fields.join(', ')}],`);
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
'];'
|
|
111
|
+
);
|
|
112
|
+
printer.blank();
|
|
113
|
+
|
|
114
|
+
printer.doc('Client', `Client for ${model.title} (${model.version}).`);
|
|
115
|
+
// Not final: PHP test suites mock concrete classes (createMock(Client::class)).
|
|
116
|
+
printer.line('class Client');
|
|
117
|
+
printer.block(
|
|
118
|
+
'{',
|
|
119
|
+
() => {
|
|
120
|
+
printer.line('public function __construct(private Config $config)');
|
|
121
|
+
printer.block(
|
|
122
|
+
'{',
|
|
123
|
+
() => {
|
|
124
|
+
printer.block(
|
|
125
|
+
"if ($this->config->serverUrl === '') {",
|
|
126
|
+
() => {
|
|
127
|
+
printer.line(
|
|
128
|
+
`$this->config->serverUrl = ${phpString(emit.serverUrl ?? model.serverUrl ?? '')};`
|
|
129
|
+
);
|
|
130
|
+
},
|
|
131
|
+
'}'
|
|
132
|
+
);
|
|
133
|
+
},
|
|
134
|
+
'}'
|
|
135
|
+
);
|
|
136
|
+
printer.blank();
|
|
137
|
+
|
|
138
|
+
for (const op of operations) {
|
|
139
|
+
const ident = idents.get(op.name)!;
|
|
140
|
+
writePhpMethod(printer, op, ident, model, dateType);
|
|
141
|
+
if (sseResponse(op) === undefined && (op.successResponseHeaders?.length ?? 0) > 0) {
|
|
142
|
+
writePhpMethod(printer, op, ident, model, dateType, true);
|
|
143
|
+
}
|
|
144
|
+
const rule = paginationRules.get(op.name);
|
|
145
|
+
if (rule === undefined) continue;
|
|
146
|
+
const success = jsonSuccessSchema(op);
|
|
147
|
+
const pageHydration =
|
|
148
|
+
success === undefined ? undefined : hydration(success, '$page', model, dateType);
|
|
149
|
+
const element = paginationItemSchema(success, rule.items, model);
|
|
150
|
+
const itemHydration =
|
|
151
|
+
element === undefined ? undefined : hydration(element, '$item', model, dateType);
|
|
152
|
+
writePhpPaginationWrappers(
|
|
153
|
+
printer,
|
|
154
|
+
op,
|
|
155
|
+
ident,
|
|
156
|
+
model,
|
|
157
|
+
dateType,
|
|
158
|
+
pageHydration,
|
|
159
|
+
itemHydration,
|
|
160
|
+
rule.items,
|
|
161
|
+
element === undefined ? 'mixed' : phpType(element, model, dateType)
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
'}'
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
const entry = { path: output.path.replace(/\.[^.\\/]+$/, '.php'), content: printer.toString() };
|
|
169
|
+
if (emit.runtime !== 'module') return [entry];
|
|
170
|
+
// The runtime, verbatim except its namespace: rewritten to the client's, so one
|
|
171
|
+
// namespace spans both files and every bare reference resolves unchanged.
|
|
172
|
+
const header = banner.map((line) => `// ${line}`).join('\n');
|
|
173
|
+
const runtimeSource = PHP_RUNTIME_SOURCE.replace(/^namespace .*$/m, `namespace ${namespace};`)
|
|
174
|
+
.replace(/^<\?php\n/, `<?php\n\n${header}\n`)
|
|
175
|
+
.trimEnd();
|
|
176
|
+
return [
|
|
177
|
+
entry,
|
|
178
|
+
{ path: entry.path.replace(/[^\\/]+$/, 'runtime.php'), content: `${runtimeSource}\n` },
|
|
179
|
+
];
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
/** One idiomatic PHP call per operation — feeds `x-codeSamples` for docs. */
|
|
183
|
+
export function phpSample(op: OperationModel, ctx: SampleContext): CodeSample {
|
|
184
|
+
const args = [
|
|
185
|
+
...op.pathParams.map((param) => `${phpString(`<${propertyName(param.name)}>`)}`),
|
|
186
|
+
...(op.requestBody ? ['$body'] : []),
|
|
187
|
+
...(op.queryParams.length > 0
|
|
188
|
+
? [`${propertyName(op.queryParams[0].name)}: ${phpString('<value>')}`]
|
|
189
|
+
: []),
|
|
190
|
+
];
|
|
191
|
+
const namespace = identifierFor(ctx.model.title, { style: 'pascal', reserved: PHP });
|
|
192
|
+
// The file this run writes, so the snippet requires something that exists.
|
|
193
|
+
const file = ctx.outputPath.replace(/^.*[\\/]/, '').replace(/\.[^.]+$/, '.php');
|
|
194
|
+
return {
|
|
195
|
+
lang: 'php',
|
|
196
|
+
label: 'PHP SDK',
|
|
197
|
+
source: `require '${file}';\n\nuse ${namespace}\\{Client, Config};\n\n$client = new Client(new Config());\n$result = $client->${methodIdents(ctx.model).get(op.name) ?? methodName(op)}(${args.join(', ')});\n`,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* The SDK's own reference page, written when `client.docs` is on. The call snippets come
|
|
203
|
+
* from `phpSample` — this generator's own hook — so the page can only ever show the syntax
|
|
204
|
+
* of the SDK beside it, and ejecting this generator takes the page with it.
|
|
205
|
+
*/
|
|
206
|
+
export const phpDocs: Generator = ({ model, output, emit, pagination }) => [
|
|
207
|
+
{
|
|
208
|
+
path: output.path.replace(/\.[^.\\/]+$/, '.php.md'),
|
|
209
|
+
content: renderReferencePage(model, {
|
|
210
|
+
title: `${model.title} PHP SDK reference`,
|
|
211
|
+
frontmatter: emit.docsFrontmatter === true,
|
|
212
|
+
language: {
|
|
213
|
+
name: 'php',
|
|
214
|
+
label: 'PHP',
|
|
215
|
+
fence: 'php',
|
|
216
|
+
requires: 'The SDK needs the curl extension.',
|
|
217
|
+
},
|
|
218
|
+
sample: (op) => phpSample(op, { model, emit, outputPath: output.path }),
|
|
219
|
+
paginated: new Set(pagination?.keys() ?? []),
|
|
220
|
+
}),
|
|
221
|
+
},
|
|
222
|
+
];
|
|
223
|
+
|
|
224
|
+
export default {
|
|
225
|
+
name: 'php',
|
|
226
|
+
run: phpGenerator,
|
|
227
|
+
sample: phpSample,
|
|
228
|
+
docs: phpDocs,
|
|
229
|
+
errorModes: ["throw"],
|
|
230
|
+
notApplicable: {
|
|
231
|
+
"outputMode": "it always emits one self-contained file",
|
|
232
|
+
"runtime": "the runtime is always embedded in the generated file",
|
|
233
|
+
"argsStyle": "inputs follow the target language's own idiom",
|
|
234
|
+
"importExt": "the generated file has no relative imports"
|
|
235
|
+
},
|
|
236
|
+
requiresGenerator: '^0.4.0',
|
|
237
|
+
};
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
// Ejected from @redocly/client-generator@0.4.0 — the built-in "php" 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 php --update`.
|
|
5
|
+
// The `models` stage: named schemas as promoted-constructor classes with
|
|
6
|
+
// fromArray/toArray hydration, native backed enums, and match-based union
|
|
7
|
+
// dispatchers — plus the wire↔typed value expressions the methods reuse.
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
type ApiModel,
|
|
11
|
+
type DateType,
|
|
12
|
+
deref,
|
|
13
|
+
discriminatorCases,
|
|
14
|
+
enumValues,
|
|
15
|
+
flattenAllOf,
|
|
16
|
+
type PropertyModel,
|
|
17
|
+
type SchemaModel,
|
|
18
|
+
uniqueIdentifiers,
|
|
19
|
+
unwrapNullable,
|
|
20
|
+
} from '@redocly/client-generator';
|
|
21
|
+
import { PhpPrinter } from '@redocly/client-generator/printers/php';
|
|
22
|
+
|
|
23
|
+
import { className, PHP, phpString, propertyName } from './naming.ts';
|
|
24
|
+
import { classify, isDateFormat, phpNullable, phpType } from './types.ts';
|
|
25
|
+
|
|
26
|
+
/** True when the named schema renders as an `unmarshalX` union dispatcher. */
|
|
27
|
+
function isDiscriminatedUnion(name: string, model: ApiModel): boolean {
|
|
28
|
+
const named = model.schemas.find((candidate) => candidate.name === name);
|
|
29
|
+
return named !== undefined && discriminatorCases(named.schema, model) !== undefined;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Wire value → typed value expression, or undefined when the raw value is already right. */
|
|
33
|
+
export function hydration(
|
|
34
|
+
schema: SchemaModel,
|
|
35
|
+
expr: string,
|
|
36
|
+
model: ApiModel,
|
|
37
|
+
// Required on purpose: a defaulted `'string'` let a call site forget it, and the method
|
|
38
|
+
// then returned a raw string where its own signature declared `\DateTimeImmutable`.
|
|
39
|
+
dateType: DateType
|
|
40
|
+
): string | undefined {
|
|
41
|
+
const bare = unwrapNullable(schema);
|
|
42
|
+
if (dateType === 'Date' && bare.kind === 'scalar' && bare.scalar === 'string') {
|
|
43
|
+
if (isDateFormat(bare)) return `new \\DateTimeImmutable(${expr})`;
|
|
44
|
+
}
|
|
45
|
+
if (bare.kind === 'omit')
|
|
46
|
+
return hydration({ kind: 'ref', name: bare.base }, expr, model, dateType);
|
|
47
|
+
if (bare.kind === 'ref') {
|
|
48
|
+
const kind = classify(bare.name, model);
|
|
49
|
+
if (kind === 'class') return `${className(bare.name)}::fromArray(${expr})`;
|
|
50
|
+
if (kind === 'enum') return `${className(bare.name)}::from(${expr})`;
|
|
51
|
+
if (isDiscriminatedUnion(bare.name, model)) return `unmarshal${className(bare.name)}(${expr})`;
|
|
52
|
+
const target = deref(bare, model);
|
|
53
|
+
return target === undefined ? undefined : hydration(target, expr, model, dateType);
|
|
54
|
+
}
|
|
55
|
+
if (bare.kind === 'array') {
|
|
56
|
+
const item = hydration(bare.items, '$item', model, dateType);
|
|
57
|
+
if (item === undefined) return undefined;
|
|
58
|
+
return `array_map(static fn ($item) => ${item}, ${expr})`;
|
|
59
|
+
}
|
|
60
|
+
if (bare.kind === 'record') {
|
|
61
|
+
const item = hydration(bare.value, '$item', model, dateType);
|
|
62
|
+
if (item === undefined) return undefined;
|
|
63
|
+
return `array_map(static fn ($item) => ${item}, ${expr})`;
|
|
64
|
+
}
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Typed value → wire value expression, or undefined when it serializes as-is. */
|
|
69
|
+
export function serialization(
|
|
70
|
+
schema: SchemaModel,
|
|
71
|
+
expr: string,
|
|
72
|
+
model: ApiModel,
|
|
73
|
+
dateType: DateType = 'string'
|
|
74
|
+
): string | undefined {
|
|
75
|
+
const bare = unwrapNullable(schema);
|
|
76
|
+
if (dateType === 'Date' && bare.kind === 'scalar' && bare.scalar === 'string') {
|
|
77
|
+
// A date-only value must not gain a time component on the way out.
|
|
78
|
+
if (bare.metadata?.format === 'date') return `${expr}->format('Y-m-d')`;
|
|
79
|
+
if (bare.metadata?.format === 'date-time') {
|
|
80
|
+
return `${expr}->format(\\DateTimeInterface::ATOM)`;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (bare.kind === 'omit') {
|
|
84
|
+
return serialization({ kind: 'ref', name: bare.base }, expr, model, dateType);
|
|
85
|
+
}
|
|
86
|
+
if (bare.kind === 'ref') {
|
|
87
|
+
const kind = classify(bare.name, model);
|
|
88
|
+
if (kind === 'class') return `${expr}->toArray()`;
|
|
89
|
+
if (kind === 'enum') return `${expr}->value`;
|
|
90
|
+
// A union value may be a hydrated member instance or a raw (default-case) array.
|
|
91
|
+
if (isDiscriminatedUnion(bare.name, model)) {
|
|
92
|
+
return `is_object(${expr}) ? ${expr}->toArray() : ${expr}`;
|
|
93
|
+
}
|
|
94
|
+
const target = deref(bare, model);
|
|
95
|
+
return target === undefined ? undefined : serialization(target, expr, model, dateType);
|
|
96
|
+
}
|
|
97
|
+
if (bare.kind === 'array' || bare.kind === 'record') {
|
|
98
|
+
const inner = bare.kind === 'array' ? bare.items : bare.value;
|
|
99
|
+
const item = serialization(inner, '$item', model, dateType);
|
|
100
|
+
if (item === undefined) return undefined;
|
|
101
|
+
return `array_map(static fn ($item) => ${item}, ${expr})`;
|
|
102
|
+
}
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function writeClass(
|
|
107
|
+
printer: PhpPrinter,
|
|
108
|
+
name: string,
|
|
109
|
+
properties: PropertyModel[],
|
|
110
|
+
model: ApiModel,
|
|
111
|
+
dateType: DateType,
|
|
112
|
+
description?: string
|
|
113
|
+
): void {
|
|
114
|
+
// PHP requires defaulted parameters after required ones.
|
|
115
|
+
const ordered = [
|
|
116
|
+
...properties.filter((property) => property.required),
|
|
117
|
+
...properties.filter((property) => !property.required),
|
|
118
|
+
];
|
|
119
|
+
printer.doc(className(name), description);
|
|
120
|
+
printer.line(`final class ${className(name)}`);
|
|
121
|
+
printer.block(
|
|
122
|
+
'{',
|
|
123
|
+
() => {
|
|
124
|
+
printer.block(
|
|
125
|
+
'public function __construct(',
|
|
126
|
+
() => {
|
|
127
|
+
for (const property of ordered) {
|
|
128
|
+
const type = phpType(property.schema, model, dateType);
|
|
129
|
+
if (property.required) {
|
|
130
|
+
printer.line(`public ${type} ${'$'}${propertyName(property.name)},`);
|
|
131
|
+
} else {
|
|
132
|
+
const nullable = phpNullable(type);
|
|
133
|
+
printer.line(`public ${nullable} ${'$'}${propertyName(property.name)} = null,`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
') {'
|
|
138
|
+
);
|
|
139
|
+
printer.line('}');
|
|
140
|
+
printer.blank();
|
|
141
|
+
|
|
142
|
+
printer.line('public static function fromArray(array $data): self');
|
|
143
|
+
printer.block(
|
|
144
|
+
'{',
|
|
145
|
+
() => {
|
|
146
|
+
printer.block(
|
|
147
|
+
'return new self(',
|
|
148
|
+
() => {
|
|
149
|
+
for (const property of ordered) {
|
|
150
|
+
const raw = `$data[${phpString(property.name)}]`;
|
|
151
|
+
const typed = hydration(property.schema, raw, model, dateType);
|
|
152
|
+
const php = propertyName(property.name);
|
|
153
|
+
if (property.required) {
|
|
154
|
+
printer.line(`${php}: ${typed ?? raw},`);
|
|
155
|
+
} else if (typed === undefined) {
|
|
156
|
+
printer.line(`${php}: ${raw} ?? null,`);
|
|
157
|
+
} else {
|
|
158
|
+
printer.line(`${php}: isset(${raw}) ? ${typed} : null,`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
');'
|
|
163
|
+
);
|
|
164
|
+
},
|
|
165
|
+
'}'
|
|
166
|
+
);
|
|
167
|
+
printer.blank();
|
|
168
|
+
|
|
169
|
+
printer.line('public function toArray(): array');
|
|
170
|
+
printer.block(
|
|
171
|
+
'{',
|
|
172
|
+
() => {
|
|
173
|
+
printer.line('$data = [];');
|
|
174
|
+
for (const property of ordered) {
|
|
175
|
+
const value = `$this->${propertyName(property.name)}`;
|
|
176
|
+
const wire = serialization(property.schema, value, model, dateType) ?? value;
|
|
177
|
+
if (property.required) {
|
|
178
|
+
printer.line(`$data[${phpString(property.name)}] = ${wire};`);
|
|
179
|
+
} else {
|
|
180
|
+
printer.block(
|
|
181
|
+
`if (${value} !== null) {`,
|
|
182
|
+
() => {
|
|
183
|
+
printer.line(`$data[${phpString(property.name)}] = ${wire};`);
|
|
184
|
+
},
|
|
185
|
+
'}'
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
printer.line('return $data;');
|
|
190
|
+
},
|
|
191
|
+
'}'
|
|
192
|
+
);
|
|
193
|
+
},
|
|
194
|
+
'}'
|
|
195
|
+
);
|
|
196
|
+
printer.blank();
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/** Render every named schema: classes (allOf flattened), native enums, union dispatchers. */
|
|
200
|
+
export function renderPhpModels(model: ApiModel, dateType: DateType = 'string'): string {
|
|
201
|
+
const printer = new PhpPrinter();
|
|
202
|
+
for (const { name, schema } of model.schemas) {
|
|
203
|
+
const asEnum = enumValues(schema);
|
|
204
|
+
if (asEnum !== undefined && (asEnum.scalar === 'string' || asEnum.scalar === 'integer')) {
|
|
205
|
+
const backing = asEnum.scalar === 'string' ? 'string' : 'int';
|
|
206
|
+
printer.doc(className(name), schema.description);
|
|
207
|
+
printer.line(`enum ${className(name)}: ${backing}`);
|
|
208
|
+
printer.block(
|
|
209
|
+
'{',
|
|
210
|
+
() => {
|
|
211
|
+
// `1.5` and `15` fold to one pascal name; PHP rejects a duplicate case.
|
|
212
|
+
const members = uniqueIdentifiers(
|
|
213
|
+
asEnum.values.map((value) => String(value)),
|
|
214
|
+
{ style: 'pascal', reserved: PHP }
|
|
215
|
+
);
|
|
216
|
+
asEnum.values.forEach((value, index) => {
|
|
217
|
+
const literal = typeof value === 'string' ? phpString(value) : String(value);
|
|
218
|
+
printer.line(`case ${members[index]} = ${literal};`);
|
|
219
|
+
});
|
|
220
|
+
},
|
|
221
|
+
'}'
|
|
222
|
+
);
|
|
223
|
+
printer.blank();
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
if (schema.kind === 'object' || schema.kind === 'intersection') {
|
|
227
|
+
const flat = flattenAllOf(schema, model);
|
|
228
|
+
if (flat !== undefined) {
|
|
229
|
+
writeClass(
|
|
230
|
+
printer,
|
|
231
|
+
name,
|
|
232
|
+
flat.properties,
|
|
233
|
+
model,
|
|
234
|
+
dateType,
|
|
235
|
+
flat.description ?? schema.description
|
|
236
|
+
);
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
const cases = discriminatorCases(schema, model);
|
|
241
|
+
if (cases !== undefined) {
|
|
242
|
+
const typeName = className(name);
|
|
243
|
+
const table = cases.cases
|
|
244
|
+
.map((entry) => `${entry.value} -> ${className(entry.schemaName)}`)
|
|
245
|
+
.join(', ');
|
|
246
|
+
printer.line(
|
|
247
|
+
`/** ${typeName} is a discriminated union (${phpString(cases.property)}): ${table}. */`
|
|
248
|
+
);
|
|
249
|
+
printer.line(`function unmarshal${typeName}(array $data): mixed`);
|
|
250
|
+
printer.block(
|
|
251
|
+
'{',
|
|
252
|
+
() => {
|
|
253
|
+
printer.block(
|
|
254
|
+
`return match ($data[${phpString(cases.property)}] ?? null) {`,
|
|
255
|
+
() => {
|
|
256
|
+
for (const entry of cases.cases) {
|
|
257
|
+
printer.line(
|
|
258
|
+
`${phpString(entry.value)} => ${className(entry.schemaName)}::fromArray($data),`
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
printer.line('default => $data,');
|
|
262
|
+
},
|
|
263
|
+
'};'
|
|
264
|
+
);
|
|
265
|
+
},
|
|
266
|
+
'}'
|
|
267
|
+
);
|
|
268
|
+
printer.blank();
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
271
|
+
// Everything else (plain unions, aliases, records) has no PHP declaration;
|
|
272
|
+
// references resolve to the underlying type via phpType.
|
|
273
|
+
}
|
|
274
|
+
return printer.toString();
|
|
275
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// Ejected from @redocly/client-generator@0.4.0 — the built-in "php" 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 php --update`.
|
|
5
|
+
// The `naming` stage: the shared printer/naming instance, the string escaper, and
|
|
6
|
+
// the collision-free class/property/method identifiers every other stage builds on.
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
type ApiModel,
|
|
10
|
+
identifierFor,
|
|
11
|
+
type OperationModel,
|
|
12
|
+
RESERVED_WORDS,
|
|
13
|
+
uniqueIdentifiers,
|
|
14
|
+
} from '@redocly/client-generator';
|
|
15
|
+
import { PhpPrinter } from '@redocly/client-generator/printers/php';
|
|
16
|
+
|
|
17
|
+
export const PHP = RESERVED_WORDS.php;
|
|
18
|
+
|
|
19
|
+
// Naming and escaping delegate to the printer — one implementation, one policy.
|
|
20
|
+
export const naming = new PhpPrinter();
|
|
21
|
+
|
|
22
|
+
export function className(name: string): string {
|
|
23
|
+
return naming.typeName(name);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function propertyName(name: string): string {
|
|
27
|
+
return naming.memberName(name);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** `'…'` with backslashes and quotes escaped — safe for any spec-supplied text. */
|
|
31
|
+
export function phpString(value: string): string {
|
|
32
|
+
return naming.string(value);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function methodName(op: OperationModel): string {
|
|
36
|
+
return identifierFor(op.name, { style: 'camel', reserved: PHP });
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* The method name for every operation, unique across the client — PHP fatals on a
|
|
41
|
+
* redeclared method, and two operationIds may camel-case to one name (`get-user`,
|
|
42
|
+
* `getUser`). Keyed by the IR name, which the sanitizer already made unique.
|
|
43
|
+
*/
|
|
44
|
+
export function methodIdents(model: ApiModel): Map<string, string> {
|
|
45
|
+
const operations = model.services.flatMap((service) => service.operations);
|
|
46
|
+
const names = uniqueIdentifiers(
|
|
47
|
+
operations.map((op) => op.name),
|
|
48
|
+
{ style: 'camel', reserved: PHP }
|
|
49
|
+
);
|
|
50
|
+
return new Map(operations.map((op, index) => [op.name, names[index]]));
|
|
51
|
+
}
|