@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.
Files changed (617) hide show
  1. package/README.md +32 -54
  2. package/eject-assets/AGENTS.md +137 -0
  3. package/eject-assets/generators/cli/docs.ts +224 -0
  4. package/eject-assets/generators/cli/engine-source.ts +21 -0
  5. package/eject-assets/generators/cli/index.ts +90 -0
  6. package/eject-assets/generators/cli/render.ts +348 -0
  7. package/eject-assets/generators/go/client.ts +57 -0
  8. package/eject-assets/generators/go/descriptor.ts +41 -0
  9. package/eject-assets/generators/go/index.ts +336 -0
  10. package/eject-assets/generators/go/models.ts +179 -0
  11. package/eject-assets/generators/go/naming.ts +49 -0
  12. package/eject-assets/generators/go/operations.ts +296 -0
  13. package/eject-assets/generators/go/pagination.ts +194 -0
  14. package/eject-assets/generators/go/types.ts +60 -0
  15. package/eject-assets/generators/mock/faker.ts +214 -0
  16. package/eject-assets/generators/mock/index.ts +35 -0
  17. package/eject-assets/generators/mock/render.ts +282 -0
  18. package/eject-assets/generators/mock/sample.ts +316 -0
  19. package/eject-assets/generators/mock/values.ts +63 -0
  20. package/eject-assets/generators/php/client.ts +63 -0
  21. package/eject-assets/generators/php/descriptor.ts +58 -0
  22. package/eject-assets/generators/php/index.ts +237 -0
  23. package/eject-assets/generators/php/models.ts +275 -0
  24. package/eject-assets/generators/php/naming.ts +51 -0
  25. package/eject-assets/generators/php/operations.ts +232 -0
  26. package/eject-assets/generators/php/pagination.ts +133 -0
  27. package/eject-assets/generators/php/types.ts +148 -0
  28. package/eject-assets/generators/python/client.ts +123 -0
  29. package/eject-assets/generators/python/descriptor.ts +52 -0
  30. package/eject-assets/generators/python/index.ts +251 -0
  31. package/eject-assets/generators/python/models.ts +242 -0
  32. package/eject-assets/generators/python/naming.ts +46 -0
  33. package/eject-assets/generators/python/operations.ts +147 -0
  34. package/eject-assets/generators/python/pagination.ts +128 -0
  35. package/eject-assets/generators/python/types.ts +54 -0
  36. package/eject-assets/generators/swr/index.ts +37 -0
  37. package/eject-assets/generators/swr/render.ts +78 -0
  38. package/eject-assets/generators/tanstack-query/index.ts +48 -0
  39. package/eject-assets/generators/tanstack-query/render.ts +346 -0
  40. package/eject-assets/generators/transformers/index.ts +46 -0
  41. package/eject-assets/generators/transformers/render.ts +506 -0
  42. package/eject-assets/generators/typescript/banner.ts +35 -0
  43. package/eject-assets/generators/typescript/client.ts +254 -0
  44. package/eject-assets/generators/typescript/descriptor.ts +137 -0
  45. package/eject-assets/generators/typescript/index.ts +101 -0
  46. package/eject-assets/generators/typescript/inline-runtime.ts +135 -0
  47. package/eject-assets/generators/typescript/operation-signature.ts +62 -0
  48. package/eject-assets/generators/typescript/operation-types.ts +17 -0
  49. package/eject-assets/generators/typescript/operations.ts +524 -0
  50. package/eject-assets/generators/typescript/response-headers.ts +74 -0
  51. package/eject-assets/generators/typescript/type-guards.ts +159 -0
  52. package/eject-assets/generators/typescript/types.ts +172 -0
  53. package/eject-assets/generators/zod/index.ts +32 -0
  54. package/eject-assets/generators/zod/schemas.ts +456 -0
  55. package/eject-assets/skills/cli-generator/SKILL.md +121 -0
  56. package/eject-assets/skills/client-generators/SKILL.md +142 -0
  57. package/eject-assets/skills/go-generator/SKILL.md +96 -0
  58. package/eject-assets/skills/mock-generator/SKILL.md +50 -0
  59. package/eject-assets/skills/php-generator/SKILL.md +112 -0
  60. package/eject-assets/skills/python-generator/SKILL.md +110 -0
  61. package/eject-assets/skills/swr-generator/SKILL.md +50 -0
  62. package/eject-assets/skills/tanstack-query-generator/SKILL.md +55 -0
  63. package/eject-assets/skills/transformers-generator/SKILL.md +47 -0
  64. package/eject-assets/skills/typescript-generator/SKILL.md +95 -0
  65. package/eject-assets/skills/zod-generator/SKILL.md +54 -0
  66. package/lib/authoring/index.d.ts +11 -0
  67. package/lib/authoring/index.d.ts.map +1 -0
  68. package/lib/authoring/index.js +42 -0
  69. package/lib/authoring/index.js.map +1 -0
  70. package/lib/authoring/naming.d.ts +34 -0
  71. package/lib/authoring/naming.d.ts.map +1 -0
  72. package/lib/authoring/naming.js +104 -0
  73. package/lib/authoring/naming.js.map +1 -0
  74. package/lib/authoring/operation.d.ts +47 -0
  75. package/lib/authoring/operation.d.ts.map +1 -0
  76. package/lib/authoring/operation.js +86 -0
  77. package/lib/authoring/operation.js.map +1 -0
  78. package/lib/authoring/options.d.ts +9 -0
  79. package/lib/authoring/options.d.ts.map +1 -0
  80. package/lib/authoring/options.js +5 -0
  81. package/lib/authoring/options.js.map +1 -0
  82. package/lib/authoring/pagination.d.ts +19 -0
  83. package/lib/authoring/pagination.d.ts.map +1 -0
  84. package/lib/authoring/pagination.js +45 -0
  85. package/lib/authoring/pagination.js.map +1 -0
  86. package/lib/authoring/printer.d.ts +16 -0
  87. package/lib/authoring/printer.d.ts.map +1 -0
  88. package/lib/authoring/printer.js +36 -0
  89. package/lib/authoring/printer.js.map +1 -0
  90. package/lib/authoring/reference-page.d.ts +31 -0
  91. package/lib/authoring/reference-page.d.ts.map +1 -0
  92. package/lib/authoring/reference-page.js +160 -0
  93. package/lib/authoring/reference-page.js.map +1 -0
  94. package/lib/authoring/schema.d.ts +51 -0
  95. package/lib/authoring/schema.d.ts.map +1 -0
  96. package/lib/authoring/schema.js +190 -0
  97. package/lib/authoring/schema.js.map +1 -0
  98. package/lib/cli-contract.d.ts +126 -0
  99. package/lib/cli-contract.d.ts.map +1 -0
  100. package/lib/cli-contract.js +25 -0
  101. package/lib/cli-contract.js.map +1 -0
  102. package/lib/{emitters/wrapper-support.d.ts → contracts/typescript.d.ts} +13 -24
  103. package/lib/contracts/typescript.d.ts.map +1 -0
  104. package/lib/contracts/typescript.js +87 -0
  105. package/lib/contracts/typescript.js.map +1 -0
  106. package/lib/generate.d.ts +10 -10
  107. package/lib/generate.d.ts.map +1 -1
  108. package/lib/generate.js +25 -106
  109. package/lib/generate.js.map +1 -1
  110. package/lib/generators/cli/docs.d.ts +19 -0
  111. package/lib/generators/cli/docs.d.ts.map +1 -0
  112. package/lib/generators/cli/docs.js +187 -0
  113. package/lib/generators/cli/docs.js.map +1 -0
  114. package/lib/generators/cli/engine-source.d.ts +5 -0
  115. package/lib/generators/cli/engine-source.d.ts.map +1 -0
  116. package/lib/generators/cli/engine-source.js +12 -0
  117. package/lib/generators/cli/engine-source.js.map +1 -0
  118. package/lib/generators/cli/index.d.ts +18 -0
  119. package/lib/generators/cli/index.d.ts.map +1 -0
  120. package/lib/generators/cli/index.js +67 -0
  121. package/lib/generators/cli/index.js.map +1 -0
  122. package/lib/generators/cli/render.d.ts +39 -0
  123. package/lib/generators/cli/render.d.ts.map +1 -0
  124. package/lib/generators/cli/render.js +281 -0
  125. package/lib/generators/cli/render.js.map +1 -0
  126. package/lib/generators/cli/runtime/cli.d.ts +42 -0
  127. package/lib/generators/cli/runtime/cli.d.ts.map +1 -0
  128. package/lib/generators/cli/runtime/cli.js +582 -0
  129. package/lib/generators/cli/runtime/cli.js.map +1 -0
  130. package/lib/generators/compatibility.d.ts +10 -0
  131. package/lib/generators/compatibility.d.ts.map +1 -0
  132. package/lib/generators/compatibility.js +45 -0
  133. package/lib/generators/compatibility.js.map +1 -0
  134. package/lib/generators/go/client.d.ts +5 -0
  135. package/lib/generators/go/client.d.ts.map +1 -0
  136. package/lib/generators/go/client.js +34 -0
  137. package/lib/generators/go/client.js.map +1 -0
  138. package/lib/generators/go/descriptor.d.ts +6 -0
  139. package/lib/generators/go/descriptor.d.ts.map +1 -0
  140. package/lib/generators/go/descriptor.js +26 -0
  141. package/lib/generators/go/descriptor.js.map +1 -0
  142. package/lib/generators/go/index.d.ts +14 -0
  143. package/lib/generators/go/index.d.ts.map +1 -0
  144. package/lib/generators/go/index.js +240 -0
  145. package/lib/generators/go/index.js.map +1 -0
  146. package/lib/generators/go/models.d.ts +4 -0
  147. package/lib/generators/go/models.d.ts.map +1 -0
  148. package/lib/generators/go/models.js +125 -0
  149. package/lib/generators/go/models.js.map +1 -0
  150. package/lib/generators/go/naming.d.ts +15 -0
  151. package/lib/generators/go/naming.d.ts.map +1 -0
  152. package/lib/generators/go/naming.js +36 -0
  153. package/lib/generators/go/naming.js.map +1 -0
  154. package/lib/generators/go/operations.d.ts +16 -0
  155. package/lib/generators/go/operations.d.ts.map +1 -0
  156. package/lib/generators/go/operations.js +200 -0
  157. package/lib/generators/go/operations.js.map +1 -0
  158. package/lib/generators/go/pagination.d.ts +5 -0
  159. package/lib/generators/go/pagination.d.ts.map +1 -0
  160. package/lib/generators/go/pagination.js +93 -0
  161. package/lib/generators/go/pagination.js.map +1 -0
  162. package/lib/generators/go/types.d.ts +4 -0
  163. package/lib/generators/go/types.d.ts.map +1 -0
  164. package/lib/generators/go/types.js +48 -0
  165. package/lib/generators/go/types.js.map +1 -0
  166. package/lib/generators/index.d.ts +2 -3
  167. package/lib/generators/index.d.ts.map +1 -1
  168. package/lib/generators/index.js +31 -53
  169. package/lib/generators/index.js.map +1 -1
  170. package/lib/generators/meta.d.ts +13 -0
  171. package/lib/generators/meta.d.ts.map +1 -0
  172. package/lib/generators/meta.js +157 -0
  173. package/lib/generators/meta.js.map +1 -0
  174. package/lib/{emitters → generators/mock}/faker.d.ts +4 -5
  175. package/lib/generators/mock/faker.d.ts.map +1 -0
  176. package/lib/generators/mock/faker.js +180 -0
  177. package/lib/generators/mock/faker.js.map +1 -0
  178. package/lib/generators/{mock.d.ts → mock/index.d.ts} +2 -2
  179. package/lib/generators/mock/index.d.ts.map +1 -0
  180. package/lib/generators/{mock.js → mock/index.js} +8 -8
  181. package/lib/generators/mock/index.js.map +1 -0
  182. package/lib/{emitters/mock.d.ts → generators/mock/render.d.ts} +2 -3
  183. package/lib/generators/mock/render.d.ts.map +1 -0
  184. package/lib/generators/mock/render.js +228 -0
  185. package/lib/generators/mock/render.js.map +1 -0
  186. package/lib/{emitters → generators/mock}/sample.d.ts +1 -2
  187. package/lib/generators/mock/sample.d.ts.map +1 -0
  188. package/lib/generators/mock/sample.js.map +1 -0
  189. package/lib/generators/mock/values.d.ts +33 -0
  190. package/lib/generators/mock/values.d.ts.map +1 -0
  191. package/lib/generators/mock/values.js +46 -0
  192. package/lib/generators/mock/values.js.map +1 -0
  193. package/lib/generators/options.d.ts +7 -0
  194. package/lib/generators/options.d.ts.map +1 -0
  195. package/lib/generators/options.js +74 -0
  196. package/lib/generators/options.js.map +1 -0
  197. package/lib/generators/php/client.d.ts +5 -0
  198. package/lib/generators/php/client.d.ts.map +1 -0
  199. package/lib/generators/php/client.js +38 -0
  200. package/lib/generators/php/client.js.map +1 -0
  201. package/lib/generators/php/descriptor.d.ts +7 -0
  202. package/lib/generators/php/descriptor.d.ts.map +1 -0
  203. package/lib/generators/php/descriptor.js +42 -0
  204. package/lib/generators/php/descriptor.js.map +1 -0
  205. package/lib/generators/php/index.d.ts +14 -0
  206. package/lib/generators/php/index.d.ts.map +1 -0
  207. package/lib/generators/php/index.js +166 -0
  208. package/lib/generators/php/index.js.map +1 -0
  209. package/lib/generators/php/models.d.ts +8 -0
  210. package/lib/generators/php/models.d.ts.map +1 -0
  211. package/lib/generators/php/models.js +200 -0
  212. package/lib/generators/php/models.js.map +1 -0
  213. package/lib/generators/php/naming.d.ts +16 -0
  214. package/lib/generators/php/naming.d.ts.map +1 -0
  215. package/lib/generators/php/naming.js +31 -0
  216. package/lib/generators/php/naming.js.map +1 -0
  217. package/lib/generators/php/operations.d.ts +21 -0
  218. package/lib/generators/php/operations.d.ts.map +1 -0
  219. package/lib/generators/php/operations.js +156 -0
  220. package/lib/generators/php/operations.js.map +1 -0
  221. package/lib/generators/php/pagination.d.ts +5 -0
  222. package/lib/generators/php/pagination.d.ts.map +1 -0
  223. package/lib/generators/php/pagination.js +68 -0
  224. package/lib/generators/php/pagination.js.map +1 -0
  225. package/lib/generators/php/types.d.ts +27 -0
  226. package/lib/generators/php/types.d.ts.map +1 -0
  227. package/lib/generators/php/types.js +128 -0
  228. package/lib/generators/php/types.js.map +1 -0
  229. package/lib/generators/python/client.d.ts +6 -0
  230. package/lib/generators/python/client.d.ts.map +1 -0
  231. package/lib/generators/python/client.js +80 -0
  232. package/lib/generators/python/client.js.map +1 -0
  233. package/lib/generators/python/descriptor.d.ts +9 -0
  234. package/lib/generators/python/descriptor.d.ts.map +1 -0
  235. package/lib/generators/python/descriptor.js +38 -0
  236. package/lib/generators/python/descriptor.js.map +1 -0
  237. package/lib/generators/python/index.d.ts +15 -0
  238. package/lib/generators/python/index.d.ts.map +1 -0
  239. package/lib/generators/python/index.js +197 -0
  240. package/lib/generators/python/index.js.map +1 -0
  241. package/lib/generators/python/models.d.ts +31 -0
  242. package/lib/generators/python/models.d.ts.map +1 -0
  243. package/lib/generators/python/models.js +203 -0
  244. package/lib/generators/python/models.js.map +1 -0
  245. package/lib/generators/python/naming.d.ts +22 -0
  246. package/lib/generators/python/naming.d.ts.map +1 -0
  247. package/lib/generators/python/naming.js +28 -0
  248. package/lib/generators/python/naming.js.map +1 -0
  249. package/lib/generators/python/operations.d.ts +4 -0
  250. package/lib/generators/python/operations.d.ts.map +1 -0
  251. package/lib/generators/python/operations.js +108 -0
  252. package/lib/generators/python/operations.js.map +1 -0
  253. package/lib/generators/python/pagination.d.ts +5 -0
  254. package/lib/generators/python/pagination.d.ts.map +1 -0
  255. package/lib/generators/python/pagination.js +95 -0
  256. package/lib/generators/python/pagination.js.map +1 -0
  257. package/lib/generators/python/types.d.ts +4 -0
  258. package/lib/generators/python/types.d.ts.map +1 -0
  259. package/lib/generators/python/types.js +45 -0
  260. package/lib/generators/python/types.js.map +1 -0
  261. package/lib/generators/resolve.d.ts.map +1 -1
  262. package/lib/generators/resolve.js +92 -13
  263. package/lib/generators/resolve.js.map +1 -1
  264. package/lib/generators/{swr.d.ts → swr/index.d.ts} +3 -3
  265. package/lib/generators/swr/index.d.ts.map +1 -0
  266. package/lib/generators/{swr.js → swr/index.js} +7 -10
  267. package/lib/generators/swr/index.js.map +1 -0
  268. package/lib/{emitters/swr.d.ts → generators/swr/render.d.ts} +2 -4
  269. package/lib/generators/swr/render.d.ts.map +1 -0
  270. package/lib/generators/swr/render.js +57 -0
  271. package/lib/generators/swr/render.js.map +1 -0
  272. package/lib/generators/{tanstack-query.d.ts → tanstack-query/index.d.ts} +3 -3
  273. package/lib/generators/tanstack-query/index.d.ts.map +1 -0
  274. package/lib/generators/{tanstack-query.js → tanstack-query/index.js} +11 -10
  275. package/lib/generators/tanstack-query/index.js.map +1 -0
  276. package/lib/{emitters/tanstack-query.d.ts → generators/tanstack-query/render.d.ts} +6 -5
  277. package/lib/generators/tanstack-query/render.d.ts.map +1 -0
  278. package/lib/{emitters/tanstack-query.js → generators/tanstack-query/render.js} +33 -21
  279. package/lib/generators/tanstack-query/render.js.map +1 -0
  280. package/lib/generators/{transformers.d.ts → transformers/index.d.ts} +2 -2
  281. package/lib/generators/transformers/index.d.ts.map +1 -0
  282. package/lib/generators/{transformers.js → transformers/index.js} +11 -8
  283. package/lib/generators/transformers/index.js.map +1 -0
  284. package/lib/{emitters/transformers.d.ts → generators/transformers/render.d.ts} +2 -2
  285. package/lib/generators/transformers/render.d.ts.map +1 -0
  286. package/lib/{emitters/transformers.js → generators/transformers/render.js} +125 -165
  287. package/lib/generators/transformers/render.js.map +1 -0
  288. package/lib/generators/types.d.ts +190 -12
  289. package/lib/generators/types.d.ts.map +1 -1
  290. package/lib/generators/typescript/banner.d.ts +12 -0
  291. package/lib/generators/typescript/banner.d.ts.map +1 -0
  292. package/lib/{emitters/emit-options.js → generators/typescript/banner.js} +2 -3
  293. package/lib/generators/typescript/banner.js.map +1 -0
  294. package/lib/generators/typescript/client.d.ts +25 -0
  295. package/lib/generators/typescript/client.d.ts.map +1 -0
  296. package/lib/generators/typescript/client.js +207 -0
  297. package/lib/generators/typescript/client.js.map +1 -0
  298. package/lib/generators/typescript/descriptor.d.ts +11 -0
  299. package/lib/generators/typescript/descriptor.d.ts.map +1 -0
  300. package/lib/generators/typescript/descriptor.js +97 -0
  301. package/lib/generators/typescript/descriptor.js.map +1 -0
  302. package/lib/generators/typescript/index.d.ts +20 -0
  303. package/lib/generators/typescript/index.d.ts.map +1 -0
  304. package/lib/generators/typescript/index.js +80 -0
  305. package/lib/generators/typescript/index.js.map +1 -0
  306. package/lib/generators/typescript/inline-runtime.d.ts +21 -0
  307. package/lib/generators/typescript/inline-runtime.d.ts.map +1 -0
  308. package/lib/generators/typescript/inline-runtime.js +114 -0
  309. package/lib/generators/typescript/inline-runtime.js.map +1 -0
  310. package/lib/generators/typescript/operation-signature.d.ts +23 -0
  311. package/lib/generators/typescript/operation-signature.d.ts.map +1 -0
  312. package/lib/generators/typescript/operation-signature.js +41 -0
  313. package/lib/generators/typescript/operation-signature.js.map +1 -0
  314. package/lib/generators/typescript/operation-types.d.ts +9 -0
  315. package/lib/generators/typescript/operation-types.d.ts.map +1 -0
  316. package/lib/generators/typescript/operation-types.js +11 -0
  317. package/lib/generators/typescript/operation-types.js.map +1 -0
  318. package/lib/generators/typescript/operations.d.ts +60 -0
  319. package/lib/generators/typescript/operations.d.ts.map +1 -0
  320. package/lib/generators/typescript/operations.js +386 -0
  321. package/lib/generators/typescript/operations.js.map +1 -0
  322. package/lib/generators/typescript/response-headers.d.ts +12 -0
  323. package/lib/generators/typescript/response-headers.d.ts.map +1 -0
  324. package/lib/generators/typescript/response-headers.js +40 -0
  325. package/lib/generators/typescript/response-headers.js.map +1 -0
  326. package/lib/generators/typescript/runtime/auth.d.ts.map +1 -0
  327. package/lib/generators/typescript/runtime/auth.js.map +1 -0
  328. package/lib/{runtime → generators/typescript/runtime}/create-client.d.ts +7 -2
  329. package/lib/generators/typescript/runtime/create-client.d.ts.map +1 -0
  330. package/lib/{runtime → generators/typescript/runtime}/create-client.js +84 -30
  331. package/lib/generators/typescript/runtime/create-client.js.map +1 -0
  332. package/lib/generators/typescript/runtime/errors.d.ts.map +1 -0
  333. package/lib/generators/typescript/runtime/errors.js.map +1 -0
  334. package/lib/generators/typescript/runtime/index.d.ts.map +1 -0
  335. package/lib/generators/typescript/runtime/index.js.map +1 -0
  336. package/lib/generators/typescript/runtime/multipart.d.ts.map +1 -0
  337. package/lib/generators/typescript/runtime/multipart.js.map +1 -0
  338. package/lib/{runtime → generators/typescript/runtime}/paginate.d.ts +2 -2
  339. package/lib/generators/typescript/runtime/paginate.d.ts.map +1 -0
  340. package/lib/{runtime → generators/typescript/runtime}/paginate.js +12 -12
  341. package/lib/generators/typescript/runtime/paginate.js.map +1 -0
  342. package/lib/generators/typescript/runtime/parse.d.ts.map +1 -0
  343. package/lib/generators/typescript/runtime/parse.js.map +1 -0
  344. package/lib/generators/typescript/runtime/retry.d.ts.map +1 -0
  345. package/lib/generators/typescript/runtime/retry.js.map +1 -0
  346. package/lib/generators/typescript/runtime/send.d.ts.map +1 -0
  347. package/lib/generators/typescript/runtime/send.js.map +1 -0
  348. package/lib/generators/typescript/runtime/setup.d.ts.map +1 -0
  349. package/lib/generators/typescript/runtime/setup.js.map +1 -0
  350. package/lib/generators/typescript/runtime/sse.d.ts.map +1 -0
  351. package/lib/generators/typescript/runtime/sse.js.map +1 -0
  352. package/lib/{runtime → generators/typescript/runtime}/types.d.ts +17 -95
  353. package/lib/generators/typescript/runtime/types.d.ts.map +1 -0
  354. package/lib/generators/typescript/runtime/types.js.map +1 -0
  355. package/lib/generators/typescript/runtime/url.d.ts.map +1 -0
  356. package/lib/generators/typescript/runtime/url.js.map +1 -0
  357. package/lib/generators/typescript/type-guards.d.ts +4 -0
  358. package/lib/generators/typescript/type-guards.d.ts.map +1 -0
  359. package/lib/{emitters → generators/typescript}/type-guards.js +18 -52
  360. package/lib/generators/typescript/type-guards.js.map +1 -0
  361. package/lib/generators/typescript/types.d.ts +8 -0
  362. package/lib/generators/typescript/types.d.ts.map +1 -0
  363. package/lib/generators/typescript/types.js +132 -0
  364. package/lib/generators/typescript/types.js.map +1 -0
  365. package/lib/generators/{zod.d.ts → zod/index.d.ts} +2 -2
  366. package/lib/generators/zod/index.d.ts.map +1 -0
  367. package/lib/generators/{zod.js → zod/index.js} +5 -7
  368. package/lib/generators/zod/index.js.map +1 -0
  369. package/lib/{emitters/zod.d.ts → generators/zod/schemas.d.ts} +4 -5
  370. package/lib/generators/zod/schemas.d.ts.map +1 -0
  371. package/lib/{emitters/zod.js → generators/zod/schemas.js} +118 -154
  372. package/lib/generators/zod/schemas.js.map +1 -0
  373. package/lib/index.d.ts +8 -3
  374. package/lib/index.d.ts.map +1 -1
  375. package/lib/index.js +18 -11
  376. package/lib/index.js.map +1 -1
  377. package/lib/intermediate-representation/build.d.ts +8 -1
  378. package/lib/intermediate-representation/build.d.ts.map +1 -1
  379. package/lib/intermediate-representation/build.js +59 -4
  380. package/lib/intermediate-representation/build.js.map +1 -1
  381. package/lib/intermediate-representation/model.d.ts +26 -1
  382. package/lib/intermediate-representation/model.d.ts.map +1 -1
  383. package/lib/intermediate-representation/model.js.map +1 -1
  384. package/lib/intermediate-representation/sanitize-identifiers.d.ts +1 -10
  385. package/lib/intermediate-representation/sanitize-identifiers.d.ts.map +1 -1
  386. package/lib/intermediate-representation/sanitize-identifiers.js +37 -38
  387. package/lib/intermediate-representation/sanitize-identifiers.js.map +1 -1
  388. package/lib/{emitters/pagination.d.ts → pagination.d.ts} +39 -15
  389. package/lib/pagination.d.ts.map +1 -0
  390. package/lib/{emitters/pagination.js → pagination.js} +13 -52
  391. package/lib/pagination.js.map +1 -0
  392. package/lib/pipeline.d.ts +17 -0
  393. package/lib/pipeline.d.ts.map +1 -0
  394. package/lib/pipeline.js +244 -0
  395. package/lib/pipeline.js.map +1 -0
  396. package/lib/plugin.d.ts +4 -4
  397. package/lib/plugin.d.ts.map +1 -1
  398. package/lib/plugin.js +12 -9
  399. package/lib/plugin.js.map +1 -1
  400. package/lib/printers/go.d.ts +33 -0
  401. package/lib/printers/go.d.ts.map +1 -0
  402. package/lib/printers/go.js +209 -0
  403. package/lib/printers/go.js.map +1 -0
  404. package/lib/printers/index.d.ts +5 -0
  405. package/lib/printers/index.d.ts.map +1 -0
  406. package/lib/printers/index.js +9 -0
  407. package/lib/printers/index.js.map +1 -0
  408. package/lib/printers/php.d.ts +21 -0
  409. package/lib/printers/php.d.ts.map +1 -0
  410. package/lib/printers/php.js +68 -0
  411. package/lib/printers/php.js.map +1 -0
  412. package/lib/printers/python.d.ts +31 -0
  413. package/lib/printers/python.d.ts.map +1 -0
  414. package/lib/printers/python.js +101 -0
  415. package/lib/printers/python.js.map +1 -0
  416. package/lib/printers/typescript.d.ts +82 -0
  417. package/lib/printers/typescript.d.ts.map +1 -0
  418. package/lib/printers/typescript.js +268 -0
  419. package/lib/printers/typescript.js.map +1 -0
  420. package/lib/reserved-names.d.ts +8 -0
  421. package/lib/reserved-names.d.ts.map +1 -0
  422. package/lib/{emitters/reserved-names.js → reserved-names.js} +16 -27
  423. package/lib/reserved-names.js.map +1 -0
  424. package/lib/runtime-contract.d.ts +62 -2
  425. package/lib/runtime-contract.d.ts.map +1 -1
  426. package/lib/runtime-contract.js +3 -3
  427. package/lib/runtime-contract.js.map +1 -1
  428. package/lib/runtime-sources/go.d.ts +2 -0
  429. package/lib/runtime-sources/go.d.ts.map +1 -0
  430. package/lib/runtime-sources/go.js +3 -0
  431. package/lib/runtime-sources/go.js.map +1 -0
  432. package/lib/runtime-sources/php.d.ts +2 -0
  433. package/lib/runtime-sources/php.d.ts.map +1 -0
  434. package/lib/runtime-sources/php.js +3 -0
  435. package/lib/runtime-sources/php.js.map +1 -0
  436. package/lib/runtime-sources/python.d.ts +12 -0
  437. package/lib/runtime-sources/python.d.ts.map +1 -0
  438. package/lib/runtime-sources/python.js +12 -0
  439. package/lib/runtime-sources/python.js.map +1 -0
  440. package/lib/runtime-sources/typescript.d.ts +36 -0
  441. package/lib/runtime-sources/typescript.d.ts.map +1 -0
  442. package/lib/runtime-sources/typescript.js +152 -0
  443. package/lib/runtime-sources/typescript.js.map +1 -0
  444. package/lib/runtime-sources.d.ts +5 -0
  445. package/lib/runtime-sources.d.ts.map +1 -0
  446. package/lib/runtime-sources.js +10 -0
  447. package/lib/runtime-sources.js.map +1 -0
  448. package/lib/setup-bake.d.ts.map +1 -0
  449. package/lib/{emitters/setup-bake.js → setup-bake.js} +11 -2
  450. package/lib/setup-bake.js.map +1 -0
  451. package/lib/types.d.ts +38 -8
  452. package/lib/types.d.ts.map +1 -1
  453. package/package.json +40 -4
  454. package/lib/emitters/auth.d.ts +0 -14
  455. package/lib/emitters/auth.d.ts.map +0 -1
  456. package/lib/emitters/auth.js +0 -30
  457. package/lib/emitters/auth.js.map +0 -1
  458. package/lib/emitters/client-assembly.d.ts +0 -15
  459. package/lib/emitters/client-assembly.d.ts.map +0 -1
  460. package/lib/emitters/client-assembly.js +0 -358
  461. package/lib/emitters/client-assembly.js.map +0 -1
  462. package/lib/emitters/descriptor.d.ts +0 -22
  463. package/lib/emitters/descriptor.d.ts.map +0 -1
  464. package/lib/emitters/descriptor.js +0 -199
  465. package/lib/emitters/descriptor.js.map +0 -1
  466. package/lib/emitters/emit-options.d.ts +0 -67
  467. package/lib/emitters/emit-options.d.ts.map +0 -1
  468. package/lib/emitters/emit-options.js.map +0 -1
  469. package/lib/emitters/faker.d.ts.map +0 -1
  470. package/lib/emitters/faker.js +0 -221
  471. package/lib/emitters/faker.js.map +0 -1
  472. package/lib/emitters/identifier.d.ts +0 -34
  473. package/lib/emitters/identifier.d.ts.map +0 -1
  474. package/lib/emitters/identifier.js +0 -104
  475. package/lib/emitters/identifier.js.map +0 -1
  476. package/lib/emitters/inline-runtime.d.ts +0 -11
  477. package/lib/emitters/inline-runtime.d.ts.map +0 -1
  478. package/lib/emitters/inline-runtime.js +0 -99
  479. package/lib/emitters/inline-runtime.js.map +0 -1
  480. package/lib/emitters/jsdoc.d.ts +0 -9
  481. package/lib/emitters/jsdoc.d.ts.map +0 -1
  482. package/lib/emitters/jsdoc.js +0 -83
  483. package/lib/emitters/jsdoc.js.map +0 -1
  484. package/lib/emitters/mock.d.ts.map +0 -1
  485. package/lib/emitters/mock.js +0 -265
  486. package/lib/emitters/mock.js.map +0 -1
  487. package/lib/emitters/operation-aliases.d.ts +0 -27
  488. package/lib/emitters/operation-aliases.d.ts.map +0 -1
  489. package/lib/emitters/operation-aliases.js +0 -150
  490. package/lib/emitters/operation-aliases.js.map +0 -1
  491. package/lib/emitters/operation-signature.d.ts +0 -24
  492. package/lib/emitters/operation-signature.d.ts.map +0 -1
  493. package/lib/emitters/operation-signature.js +0 -42
  494. package/lib/emitters/operation-signature.js.map +0 -1
  495. package/lib/emitters/operation-types.d.ts +0 -32
  496. package/lib/emitters/operation-types.d.ts.map +0 -1
  497. package/lib/emitters/operation-types.js +0 -117
  498. package/lib/emitters/operation-types.js.map +0 -1
  499. package/lib/emitters/operations.d.ts +0 -41
  500. package/lib/emitters/operations.d.ts.map +0 -1
  501. package/lib/emitters/operations.js +0 -35
  502. package/lib/emitters/operations.js.map +0 -1
  503. package/lib/emitters/pagination.d.ts.map +0 -1
  504. package/lib/emitters/pagination.js.map +0 -1
  505. package/lib/emitters/reserved-names.d.ts +0 -5
  506. package/lib/emitters/reserved-names.d.ts.map +0 -1
  507. package/lib/emitters/reserved-names.js.map +0 -1
  508. package/lib/emitters/response-headers.d.ts +0 -14
  509. package/lib/emitters/response-headers.d.ts.map +0 -1
  510. package/lib/emitters/response-headers.js +0 -91
  511. package/lib/emitters/response-headers.js.map +0 -1
  512. package/lib/emitters/runtime-sources.d.ts +0 -16
  513. package/lib/emitters/runtime-sources.d.ts.map +0 -1
  514. package/lib/emitters/runtime-sources.js +0 -16
  515. package/lib/emitters/runtime-sources.js.map +0 -1
  516. package/lib/emitters/sample.d.ts.map +0 -1
  517. package/lib/emitters/sample.js.map +0 -1
  518. package/lib/emitters/setup-bake.d.ts.map +0 -1
  519. package/lib/emitters/setup-bake.js.map +0 -1
  520. package/lib/emitters/sse.d.ts +0 -10
  521. package/lib/emitters/sse.d.ts.map +0 -1
  522. package/lib/emitters/sse.js +0 -46
  523. package/lib/emitters/sse.js.map +0 -1
  524. package/lib/emitters/support.d.ts +0 -18
  525. package/lib/emitters/support.d.ts.map +0 -1
  526. package/lib/emitters/support.js +0 -37
  527. package/lib/emitters/support.js.map +0 -1
  528. package/lib/emitters/swr.d.ts.map +0 -1
  529. package/lib/emitters/swr.js +0 -88
  530. package/lib/emitters/swr.js.map +0 -1
  531. package/lib/emitters/tanstack-query.d.ts.map +0 -1
  532. package/lib/emitters/tanstack-query.js.map +0 -1
  533. package/lib/emitters/transformers.d.ts.map +0 -1
  534. package/lib/emitters/transformers.js.map +0 -1
  535. package/lib/emitters/ts.d.ts +0 -42
  536. package/lib/emitters/ts.d.ts.map +0 -1
  537. package/lib/emitters/ts.js +0 -116
  538. package/lib/emitters/ts.js.map +0 -1
  539. package/lib/emitters/type-guards.d.ts +0 -21
  540. package/lib/emitters/type-guards.d.ts.map +0 -1
  541. package/lib/emitters/type-guards.js.map +0 -1
  542. package/lib/emitters/types.d.ts +0 -15
  543. package/lib/emitters/types.d.ts.map +0 -1
  544. package/lib/emitters/types.js +0 -125
  545. package/lib/emitters/types.js.map +0 -1
  546. package/lib/emitters/wrapper-support.d.ts.map +0 -1
  547. package/lib/emitters/wrapper-support.js +0 -127
  548. package/lib/emitters/wrapper-support.js.map +0 -1
  549. package/lib/emitters/zod.d.ts.map +0 -1
  550. package/lib/emitters/zod.js.map +0 -1
  551. package/lib/generators/anchor.d.ts +0 -9
  552. package/lib/generators/anchor.d.ts.map +0 -1
  553. package/lib/generators/anchor.js +0 -10
  554. package/lib/generators/anchor.js.map +0 -1
  555. package/lib/generators/mock.d.ts.map +0 -1
  556. package/lib/generators/mock.js.map +0 -1
  557. package/lib/generators/sdk.d.ts +0 -12
  558. package/lib/generators/sdk.d.ts.map +0 -1
  559. package/lib/generators/sdk.js +0 -26
  560. package/lib/generators/sdk.js.map +0 -1
  561. package/lib/generators/swr.d.ts.map +0 -1
  562. package/lib/generators/swr.js.map +0 -1
  563. package/lib/generators/tanstack-query.d.ts.map +0 -1
  564. package/lib/generators/tanstack-query.js.map +0 -1
  565. package/lib/generators/transformers.d.ts.map +0 -1
  566. package/lib/generators/transformers.js.map +0 -1
  567. package/lib/generators/zod.d.ts.map +0 -1
  568. package/lib/generators/zod.js.map +0 -1
  569. package/lib/runtime/auth.d.ts.map +0 -1
  570. package/lib/runtime/auth.js.map +0 -1
  571. package/lib/runtime/create-client.d.ts.map +0 -1
  572. package/lib/runtime/create-client.js.map +0 -1
  573. package/lib/runtime/errors.d.ts.map +0 -1
  574. package/lib/runtime/errors.js.map +0 -1
  575. package/lib/runtime/index.d.ts.map +0 -1
  576. package/lib/runtime/index.js.map +0 -1
  577. package/lib/runtime/multipart.d.ts.map +0 -1
  578. package/lib/runtime/multipart.js.map +0 -1
  579. package/lib/runtime/paginate.d.ts.map +0 -1
  580. package/lib/runtime/paginate.js.map +0 -1
  581. package/lib/runtime/parse.d.ts.map +0 -1
  582. package/lib/runtime/parse.js.map +0 -1
  583. package/lib/runtime/retry.d.ts.map +0 -1
  584. package/lib/runtime/retry.js.map +0 -1
  585. package/lib/runtime/send.d.ts.map +0 -1
  586. package/lib/runtime/send.js.map +0 -1
  587. package/lib/runtime/setup.d.ts.map +0 -1
  588. package/lib/runtime/setup.js.map +0 -1
  589. package/lib/runtime/sse.d.ts.map +0 -1
  590. package/lib/runtime/sse.js.map +0 -1
  591. package/lib/runtime/types.d.ts.map +0 -1
  592. package/lib/runtime/types.js.map +0 -1
  593. package/lib/runtime/url.d.ts.map +0 -1
  594. package/lib/runtime/url.js.map +0 -1
  595. /package/lib/{emitters → generators/mock}/sample.js +0 -0
  596. /package/lib/{runtime → generators/typescript/runtime}/auth.d.ts +0 -0
  597. /package/lib/{runtime → generators/typescript/runtime}/auth.js +0 -0
  598. /package/lib/{runtime → generators/typescript/runtime}/errors.d.ts +0 -0
  599. /package/lib/{runtime → generators/typescript/runtime}/errors.js +0 -0
  600. /package/lib/{runtime → generators/typescript/runtime}/index.d.ts +0 -0
  601. /package/lib/{runtime → generators/typescript/runtime}/index.js +0 -0
  602. /package/lib/{runtime → generators/typescript/runtime}/multipart.d.ts +0 -0
  603. /package/lib/{runtime → generators/typescript/runtime}/multipart.js +0 -0
  604. /package/lib/{runtime → generators/typescript/runtime}/parse.d.ts +0 -0
  605. /package/lib/{runtime → generators/typescript/runtime}/parse.js +0 -0
  606. /package/lib/{runtime → generators/typescript/runtime}/retry.d.ts +0 -0
  607. /package/lib/{runtime → generators/typescript/runtime}/retry.js +0 -0
  608. /package/lib/{runtime → generators/typescript/runtime}/send.d.ts +0 -0
  609. /package/lib/{runtime → generators/typescript/runtime}/send.js +0 -0
  610. /package/lib/{runtime → generators/typescript/runtime}/setup.d.ts +0 -0
  611. /package/lib/{runtime → generators/typescript/runtime}/setup.js +0 -0
  612. /package/lib/{runtime → generators/typescript/runtime}/sse.d.ts +0 -0
  613. /package/lib/{runtime → generators/typescript/runtime}/sse.js +0 -0
  614. /package/lib/{runtime → generators/typescript/runtime}/types.js +0 -0
  615. /package/lib/{runtime → generators/typescript/runtime}/url.d.ts +0 -0
  616. /package/lib/{runtime → generators/typescript/runtime}/url.js +0 -0
  617. /package/lib/{emitters/setup-bake.d.ts → setup-bake.d.ts} +0 -0
@@ -0,0 +1,232 @@
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 `operations` stage: one typed request method per operation, plus the
6
+ // argument planning and request prologue it shares with the pagination wrappers.
7
+
8
+ import {
9
+ type ApiModel,
10
+ type DateType,
11
+ isMultipartBody,
12
+ jsonSuccessSchema,
13
+ type OperationModel,
14
+ sseResponse,
15
+ uniqueIdentifiers,
16
+ } from '@redocly/client-generator';
17
+ import type { PhpPrinter } from '@redocly/client-generator/printers/php';
18
+
19
+ import { envelopeHeaderSpecs } from './descriptor.ts';
20
+ import { hydration, serialization } from './models.ts';
21
+ import { PHP, phpString } from './naming.ts';
22
+ import { phpElementType, phpNullable, phpType } from './types.ts';
23
+
24
+ const MUTATING = new Set(['post', 'put', 'patch']);
25
+
26
+ type MethodArgs = {
27
+ pathArgs: Array<{ php: string; wire: string; type: string }>;
28
+ /** `value` is the expression to send: a date object formats itself, everything else is the variable. */
29
+ queryArgs: Array<{ php: string; wire: string; type: string; value: string }>;
30
+ signature: string[];
31
+ };
32
+
33
+ /**
34
+ * The argument names a request method declares beside its parameters. A parameter named
35
+ * after one of them takes a suffixed variable instead, so the slot keeps its meaning.
36
+ */
37
+ const SIGNATURE_ARG_SLOTS = ['body', 'headers', 'idempotencyKey'];
38
+
39
+ export function methodArgs(
40
+ op: OperationModel,
41
+ model: ApiModel,
42
+ includeBody: boolean,
43
+ dateType: DateType
44
+ ): MethodArgs {
45
+ // Each parameter is its own argument, so path and query names share one namespace with
46
+ // the slots this signature declares itself (`$body`, `$headers`, `$idempotencyKey`).
47
+ // A repeat moves aside (`$id`, `$id_2`): PHP rejects a redefined parameter outright, and
48
+ // a description may legally use one name in two locations.
49
+ const names = uniqueIdentifiers(
50
+ [...op.pathParams, ...op.queryParams].map((param) => param.name),
51
+ { style: 'camel', reserved: PHP, taken: SIGNATURE_ARG_SLOTS }
52
+ );
53
+ const pathArgs = op.pathParams.map((param, index) => ({
54
+ php: names[index],
55
+ wire: param.name,
56
+ type: phpType(param.schema, model, dateType),
57
+ }));
58
+ const queryArgs = op.queryParams.map((param, index) => {
59
+ const php = names[op.pathParams.length + index];
60
+ return {
61
+ php,
62
+ wire: param.name,
63
+ type: phpType(param.schema, model, dateType),
64
+ value: serialization(param.schema, `${'$'}${php}`, model, dateType) ?? `${'$'}${php}`,
65
+ };
66
+ });
67
+ const signature = [
68
+ ...pathArgs.map(({ php, type }) => `${type} ${'$'}${php}`),
69
+ ...(includeBody && op.requestBody
70
+ ? [
71
+ `${isMultipartBody(op) ? 'array' : phpType(op.requestBody.schema, model, dateType)} ${'$'}body`,
72
+ ]
73
+ : []),
74
+ ...queryArgs.map(({ php, type }) => {
75
+ const nullable = phpNullable(type);
76
+ return `${nullable} ${'$'}${php} = null`;
77
+ }),
78
+ '?array $headers = null',
79
+ ...(includeBody && MUTATING.has(op.method.toLowerCase())
80
+ ? ['?string $idempotencyKey = null']
81
+ : []),
82
+ ];
83
+ return { pathArgs, queryArgs, signature };
84
+ }
85
+
86
+ /** The shared prologue: resolve auth, build query/url, merge headers. */
87
+ function writeRequestSetup(printer: PhpPrinter, op: OperationModel, args: MethodArgs): void {
88
+ printer.line(`$op = OPERATIONS[${phpString(op.specName ?? op.name)}];`);
89
+ printer.line(
90
+ "[$authHeaders, $query, $cookies] = resolveAuth($op['security'] ?? [], $this->config->auth);"
91
+ );
92
+ for (const { php, wire, value } of args.queryArgs) {
93
+ printer.block(
94
+ `if (${'$'}${php} !== null) {`,
95
+ () => {
96
+ printer.line(`$query[${phpString(wire)}] = ${value};`);
97
+ },
98
+ '}'
99
+ );
100
+ }
101
+ const pathDict = args.pathArgs
102
+ .map(({ php, wire }) => `${phpString(wire)} => ${'$'}${php}`)
103
+ .join(', ');
104
+ printer.line(`$url = buildUrl($this->config->serverUrl, $op['path'], [${pathDict}]);`);
105
+ printer.line('$requestHeaders = array_merge($authHeaders, $headers ?? []);');
106
+ printer.block(
107
+ 'if ($cookies !== []) {',
108
+ () => {
109
+ printer.line("$requestHeaders['Cookie'] = implode('; ', $cookies);");
110
+ },
111
+ '}'
112
+ );
113
+ }
114
+
115
+ export function writePhpMethod(
116
+ printer: PhpPrinter,
117
+ op: OperationModel,
118
+ ident: string,
119
+ model: ApiModel,
120
+ dateType: DateType,
121
+ envelope = false
122
+ ): void {
123
+ const args = methodArgs(op, model, true, dateType);
124
+ const sse = sseResponse(op);
125
+ const success = jsonSuccessSchema(op);
126
+ // Non-JSON success bodies (PDFs, images, octet streams) return the raw body string.
127
+ const rawBody =
128
+ sse === undefined &&
129
+ success === undefined &&
130
+ op.successResponses.some((response) => response.contentType !== '');
131
+ const returnType = envelope
132
+ ? 'Envelope'
133
+ : sse !== undefined
134
+ ? '\\Generator'
135
+ : success !== undefined
136
+ ? phpType(success, model, dateType)
137
+ : rawBody
138
+ ? 'string'
139
+ : 'void';
140
+ const name = envelope ? `${ident}WithHeaders` : ident;
141
+ const element = envelope ? undefined : phpElementType(success, model, dateType);
142
+ printer.doc(
143
+ name,
144
+ envelope
145
+ ? `Like ${ident}(), returning an Envelope with the declared response headers.`
146
+ : (op.summary ?? `${op.method.toUpperCase()} ${op.path}`),
147
+ element === undefined ? [] : [`@return ${element}[]`]
148
+ );
149
+ printer.line(`public function ${name}(${args.signature.join(', ')}): ${returnType}`);
150
+ printer.block(
151
+ '{',
152
+ () => {
153
+ writeRequestSetup(printer, op, args);
154
+ if (sse !== undefined) {
155
+ const jsonData = sse.schema !== undefined && sse.schema.kind !== 'unknown';
156
+ printer.line('$url = appendQuery($url, $query);');
157
+ printer.block(
158
+ '$open = function (array $extraHeaders) use ($url, $requestHeaders): \\CurlHandle {',
159
+ () => {
160
+ printer.line('$handle = curl_init($url);');
161
+ printer.line('$lines = [];');
162
+ printer.block(
163
+ 'foreach (array_merge($requestHeaders, $extraHeaders) as $name => $value) {',
164
+ () => {
165
+ printer.line("$lines[] = $name . ': ' . $value;");
166
+ },
167
+ '}'
168
+ );
169
+ printer.line('curl_setopt($handle, CURLOPT_HTTPHEADER, $lines);');
170
+ printer.line('return $handle;');
171
+ },
172
+ '};'
173
+ );
174
+ printer.line(`yield from iterSse($open, ${jsonData ? 'true' : 'false'});`);
175
+ return;
176
+ }
177
+ const request = [
178
+ `'operationId' => $op['id']`,
179
+ `'method' => $op['method']`,
180
+ `'url' => $url`,
181
+ `'headers' => $requestHeaders`,
182
+ `'query' => $query`,
183
+ ];
184
+ if (op.requestBody && isMultipartBody(op)) {
185
+ printer.line('[$contentType, $encoded] = toMultipart($body);');
186
+ request.push(`'body' => $encoded`, `'contentType' => $contentType`);
187
+ } else if (op.requestBody) {
188
+ const wire = serialization(op.requestBody.schema, '$body', model, dateType) ?? '$body';
189
+ printer.line(`$payload = json_encode(${wire});`);
190
+ request.push(
191
+ `'body' => $payload`,
192
+ `'contentType' => ${phpString(op.requestBody.contentType)}`
193
+ );
194
+ }
195
+ if (MUTATING.has(op.method.toLowerCase()) && op.requestBody) {
196
+ request.push(`'idempotencyKey' => $idempotencyKey`);
197
+ }
198
+ printer.line(`$response = send($this->config, [${request.join(', ')}]);`);
199
+ printer.block(
200
+ "if ($response['status'] >= 400) {",
201
+ () => {
202
+ printer.line('throw apiErrorFrom($response);');
203
+ },
204
+ '}'
205
+ );
206
+ const decoded = rawBody
207
+ ? "$response['body']"
208
+ : ((success === undefined
209
+ ? undefined
210
+ : hydration(success, 'decodeJson($response)', model, dateType)) ??
211
+ 'decodeJson($response)');
212
+ if (envelope) {
213
+ printer.line(`$data = ${decoded};`);
214
+ printer.line(
215
+ `return new Envelope(data: $data, headers: readEnvelopeHeaders($response, ${envelopeHeaderSpecs(op, model)}), status: $response['status']);`
216
+ );
217
+ return;
218
+ }
219
+ if (rawBody) {
220
+ printer.line("return $response['body'];");
221
+ return;
222
+ }
223
+ if (returnType === 'void') {
224
+ printer.line('decodeJson($response);');
225
+ return;
226
+ }
227
+ printer.line(`return ${decoded};`);
228
+ },
229
+ '}'
230
+ );
231
+ printer.blank();
232
+ }
@@ -0,0 +1,133 @@
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 `pagination` stage: the `<op>Pages()` / `<op>Items()` generator methods
6
+ // over the runtime's iterPages.
7
+
8
+ import {
9
+ type ApiModel,
10
+ type DateType,
11
+ jsonSuccessSchema,
12
+ type OperationModel,
13
+ } from '@redocly/client-generator';
14
+ import type { PhpPrinter } from '@redocly/client-generator/printers/php';
15
+
16
+ import { phpString } from './naming.ts';
17
+ import { methodArgs } from './operations.ts';
18
+ import { phpType } from './types.ts';
19
+
20
+ /** `<op>Pages()` / `<op>Items()` generators over the runtime's iterPages. */
21
+ export function writePhpPaginationWrappers(
22
+ printer: PhpPrinter,
23
+ op: OperationModel,
24
+ ident: string,
25
+ model: ApiModel,
26
+ dateType: DateType,
27
+ pageHydration: string | undefined,
28
+ itemHydration: string | undefined,
29
+ itemsPointer: string | undefined,
30
+ itemYield: string
31
+ ): void {
32
+ const args = methodArgs(op, model, false, dateType);
33
+ const name = ident;
34
+
35
+ const writeCall = () => {
36
+ printer.line(`$op = OPERATIONS[${phpString(op.specName ?? op.name)}];`);
37
+ printer.line('$base = [];');
38
+ for (const { php, wire, value } of args.queryArgs) {
39
+ printer.block(
40
+ `if (${'$'}${php} !== null) {`,
41
+ () => {
42
+ printer.line(`$base[${phpString(wire)}] = ${value};`);
43
+ },
44
+ '}'
45
+ );
46
+ }
47
+ const pathDict = args.pathArgs
48
+ .map(({ php, wire }) => `${phpString(wire)} => ${'$'}${php}`)
49
+ .join(', ');
50
+ printer.block(
51
+ '$call = function (array $params) use ($op, $headers): array {',
52
+ () => {
53
+ printer.line(
54
+ "[$authHeaders, $authQuery, $cookies] = resolveAuth($op['security'] ?? [], $this->config->auth);"
55
+ );
56
+ printer.line(`$url = buildUrl($this->config->serverUrl, $op['path'], [${pathDict}]);`);
57
+ printer.line('$requestHeaders = array_merge($authHeaders, $headers ?? []);');
58
+ printer.block(
59
+ 'if ($cookies !== []) {',
60
+ () => {
61
+ printer.line("$requestHeaders['Cookie'] = implode('; ', $cookies);");
62
+ },
63
+ '}'
64
+ );
65
+ printer.line(
66
+ "$response = send($this->config, ['operationId' => $op['id'], 'method' => $op['method'], 'url' => $url, 'headers' => $requestHeaders, 'query' => array_merge($params, $authQuery)]);"
67
+ );
68
+ printer.block(
69
+ "if ($response['status'] >= 400) {",
70
+ () => {
71
+ printer.line('throw apiErrorFrom($response);');
72
+ },
73
+ '}'
74
+ );
75
+ printer.line('return [decodeJson($response), $response];');
76
+ },
77
+ '};'
78
+ );
79
+ };
80
+
81
+ const pageType = phpType(jsonSuccessSchema(op) ?? { kind: 'unknown' }, model, dateType);
82
+ const pageYield = pageType === 'mixed' ? 'mixed' : pageType;
83
+ printer.line('/**');
84
+ printer.line(` * ${name} response pages, following the pagination rule automatically.`);
85
+ printer.line(' *');
86
+ printer.line(` * @return \\Generator<int, ${pageYield}>`);
87
+ printer.line(' */');
88
+ printer.line(`public function ${name}Pages(${args.signature.join(', ')}): \\Generator`);
89
+ printer.block(
90
+ '{',
91
+ () => {
92
+ writeCall();
93
+ printer.block(
94
+ "foreach (iterPages($call, $op['pagination'], $base) as $page) {",
95
+ () => {
96
+ printer.line(`yield ${pageHydration ?? '$page'};`);
97
+ },
98
+ '}'
99
+ );
100
+ },
101
+ '}'
102
+ );
103
+ printer.blank();
104
+
105
+ printer.line('/**');
106
+ printer.line(` * The items of every ${name} page.`);
107
+ printer.line(' *');
108
+ printer.line(` * @return \\Generator<int, ${itemYield}>`);
109
+ printer.line(' */');
110
+ printer.line(`public function ${name}Items(${args.signature.join(', ')}): \\Generator`);
111
+ printer.block(
112
+ '{',
113
+ () => {
114
+ writeCall();
115
+ printer.block(
116
+ "foreach (iterPages($call, $op['pagination'], $base) as $page) {",
117
+ () => {
118
+ printer.line(`$items = resolvePointer($page, ${phpString(itemsPointer ?? '')});`);
119
+ printer.block(
120
+ 'foreach (is_array($items) ? $items : [] as $item) {',
121
+ () => {
122
+ printer.line(`yield ${itemHydration ?? '$item'};`);
123
+ },
124
+ '}'
125
+ );
126
+ },
127
+ '}'
128
+ );
129
+ },
130
+ '}'
131
+ );
132
+ printer.blank();
133
+ }
@@ -0,0 +1,148 @@
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 `types` stage: the PHP type declaration for a schema, its nullable and
6
+ // union forms, and the element type PHP's own syntax erases.
7
+
8
+ import {
9
+ type ApiModel,
10
+ type DateType,
11
+ deref,
12
+ enumValues,
13
+ flattenAllOf,
14
+ isNullable,
15
+ type SchemaModel,
16
+ unwrapNullable,
17
+ } from '@redocly/client-generator';
18
+
19
+ import { className } from './naming.ts';
20
+
21
+ /** What a named schema renders as: a class, a native enum, or nothing (alias). */
22
+ export function classify(name: string, model: ApiModel): 'class' | 'enum' | 'other' {
23
+ const named = model.schemas.find((candidate) => candidate.name === name);
24
+ if (named === undefined) return 'other';
25
+ const schema = named.schema;
26
+ const asEnum = enumValues(schema);
27
+ if (asEnum !== undefined && (asEnum.scalar === 'string' || asEnum.scalar === 'integer')) {
28
+ return 'enum';
29
+ }
30
+ if (
31
+ (schema.kind === 'object' || schema.kind === 'intersection') &&
32
+ flattenAllOf(schema, model) !== undefined
33
+ ) {
34
+ return 'class';
35
+ }
36
+ return 'other';
37
+ }
38
+
39
+ /** The PHP type declaration for a schema (arrays and unions widen to array/mixed). */
40
+ export function phpType(
41
+ schema: SchemaModel,
42
+ model: ApiModel,
43
+ dateType: DateType = 'string'
44
+ ): string {
45
+ if (isNullable(schema)) {
46
+ const inner = phpType(unwrapNullable(schema), model, dateType);
47
+ return phpNullable(inner);
48
+ }
49
+ switch (schema.kind) {
50
+ case 'scalar':
51
+ // Under `dateType: Date`, date and date-time become DateTimeImmutable — PHP's
52
+ // immutable date object parses and formats both wire shapes.
53
+ if (dateType === 'Date' && schema.scalar === 'string' && isDateFormat(schema)) {
54
+ return '\\DateTimeImmutable';
55
+ }
56
+ return { string: 'string', integer: 'int', number: 'float', boolean: 'bool' }[schema.scalar];
57
+ case 'array':
58
+ case 'record':
59
+ return 'array';
60
+ case 'ref': {
61
+ const kind = classify(schema.name, model);
62
+ if (kind === 'class' || kind === 'enum') return className(schema.name);
63
+ const target = deref(schema, model);
64
+ return target === undefined ? 'mixed' : phpType(target, model, dateType);
65
+ }
66
+ case 'enum':
67
+ // Anonymous (inline) enums keep the wire scalar; only NAMED enums get types.
68
+ return { string: 'string', integer: 'int', number: 'float', boolean: 'bool' }[schema.scalar];
69
+ case 'literal':
70
+ return typeof schema.value === 'string'
71
+ ? 'string'
72
+ : typeof schema.value === 'boolean'
73
+ ? 'bool'
74
+ : 'float';
75
+ case 'omit':
76
+ // PHP has no Omit; the base class is the honest annotation.
77
+ return className(schema.base);
78
+ case 'union':
79
+ return phpUnionType(schema.members, model, dateType);
80
+ case 'null':
81
+ case 'object':
82
+ case 'intersection':
83
+ case 'unknown':
84
+ return 'mixed';
85
+ }
86
+ }
87
+
88
+ /** `date` or `date-time` — the two formats `dateType: Date` turns into objects. */
89
+ export function isDateFormat(schema: SchemaModel): boolean {
90
+ const format = schema.metadata?.format;
91
+ return format === 'date' || format === 'date-time';
92
+ }
93
+
94
+ /**
95
+ * The nullable form of a PHP type. `?T` for a single type, `A|B|null` for a union — PHP
96
+ * forbids mixing `?` with `|`, and `mixed` already includes null.
97
+ */
98
+ export function phpNullable(type: string): string {
99
+ if (type === 'mixed' || type.startsWith('?') || type.endsWith('|null')) return type;
100
+ return type.includes('|') ? `${type}|null` : `?${type}`;
101
+ }
102
+
103
+ /**
104
+ * A union as a native PHP 8.1 union type (`int|string`, `PromotionType|array`). Rich list
105
+ * filters are usually unions, and collapsing them to `mixed` throws away the typing that
106
+ * makes the SDK worth generating. `mixed` cannot be a union member, so a member without a
107
+ * PHP type of its own (inline object, intersection, unknown) forces the whole union to
108
+ * `mixed`. Members that map to the same PHP type collapse to one.
109
+ */
110
+ export function phpUnionType(members: SchemaModel[], model: ApiModel, dateType: DateType): string {
111
+ const rendered: string[] = [];
112
+ for (const member of members) {
113
+ // `null` is handled by the caller's nullability check, never as a member here.
114
+ if (member.kind === 'null') continue;
115
+ const type = phpType(member, model, dateType);
116
+ if (type === 'mixed') return 'mixed';
117
+ // A nullable member inside a union contributes its bare type plus null.
118
+ const bare = type.startsWith('?') ? type.slice(1) : type;
119
+ if (!rendered.includes(bare)) rendered.push(bare);
120
+ if (type.startsWith('?') && !rendered.includes('null')) rendered.push('null');
121
+ }
122
+ if (rendered.length === 0) return 'mixed';
123
+ return rendered.join('|');
124
+ }
125
+
126
+ /**
127
+ * The element type behind a PHP type that erases it. `array` and `\Generator` are as
128
+ * specific as PHP's syntax gets, so the docblock carries what they hold — that is what
129
+ * static analysis and readers actually go by.
130
+ */
131
+ export function phpElementType(
132
+ schema: SchemaModel | undefined,
133
+ model: ApiModel,
134
+ dateType: DateType
135
+ ): string | undefined {
136
+ if (schema === undefined) return undefined;
137
+ const bare = unwrapNullable(schema);
138
+ if (bare.kind === 'ref') {
139
+ const target = deref(bare, model);
140
+ // A named schema that IS an array (a collection alias) keeps its element type.
141
+ return classify(bare.name, model) === 'other'
142
+ ? phpElementType(target, model, dateType)
143
+ : undefined;
144
+ }
145
+ if (bare.kind !== 'array') return undefined;
146
+ const element = phpType(bare.items, model, dateType);
147
+ return element === 'mixed' ? undefined : element;
148
+ }
@@ -0,0 +1,123 @@
1
+ // Ejected from @redocly/client-generator@0.4.0 — the built-in "python" 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 python --update`.
5
+ // The `client` stage: the `Servers` helper class and the `Client`/`AsyncClient`
6
+ // classes that assemble the per-operation methods.
7
+
8
+ import {
9
+ type ApiModel,
10
+ type DateType,
11
+ identifierFor,
12
+ jsonSuccessSchema,
13
+ paginationItemSchema,
14
+ type ServerModel,
15
+ serverUrlParts,
16
+ sseResponse,
17
+ } from '@redocly/client-generator';
18
+ import type { PythonPrinter } from '@redocly/client-generator/printers/python';
19
+
20
+ import { fieldName, naming, operationIdents, PY } from './naming.ts';
21
+ import { writeMethod } from './operations.ts';
22
+ import { writePaginationWrappers } from './pagination.ts';
23
+ import { pythonType } from './types.ts';
24
+
25
+ /** The server URL as a Python expression: literals concatenated with declared-variable args. */
26
+ function serverUrlExpression(server: ServerModel): string {
27
+ const parts = serverUrlParts(server).map((part) =>
28
+ part.kind === 'literal' ? naming.string(part.value) : fieldName(part.name).python
29
+ );
30
+ return parts.join(' + ');
31
+ }
32
+
33
+ /** One static method per declared server; server variables become keyword arguments. */
34
+ export function writePythonServers(printer: PythonPrinter, model: ApiModel): void {
35
+ const servers = model.servers ?? [];
36
+ if (servers.length === 0) return;
37
+ const usedNames = new Set<string>();
38
+ printer.block('class Servers:', () => {
39
+ printer.line(
40
+ '"""The declared servers; variables default to the values from the description."""'
41
+ );
42
+ printer.blank();
43
+ servers.forEach((server, index) => {
44
+ let name = identifierFor(server.description ?? `server${index + 1}`, {
45
+ style: 'snake',
46
+ reserved: PY,
47
+ });
48
+ if (usedNames.has(name)) name = `${name}_${index + 1}`;
49
+ usedNames.add(name);
50
+ const params = server.variables.map(
51
+ (variable) => `${fieldName(variable.name).python}: str = ${naming.string(variable.default)}`
52
+ );
53
+ if (index > 0) printer.blank();
54
+ printer.line('@staticmethod');
55
+ printer.block(`def ${name}(${params.join(', ')}) -> str:`, () => {
56
+ printer.line(`return ${serverUrlExpression(server)}`);
57
+ });
58
+ });
59
+ });
60
+ printer.blank();
61
+ }
62
+
63
+ export function writeClientClass(
64
+ printer: PythonPrinter,
65
+ model: ApiModel,
66
+ errorMode: 'throw' | 'result',
67
+ isAsync: boolean,
68
+ paginationSpecs: Map<string, Record<string, unknown> | undefined>,
69
+ serverUrl: string,
70
+ dateType: DateType
71
+ ): void {
72
+ const name = isAsync ? 'AsyncClient' : 'Client';
73
+ const httpType = isAsync ? 'httpx.AsyncClient' : 'httpx.Client';
74
+ printer.block(`class ${name}:`, () => {
75
+ printer.doc(`${isAsync ? 'Async ' : ''}client for ${model.title} (${model.version}).`);
76
+ printer.block(
77
+ `def __init__(self, server_url: str = ${naming.string(serverUrl)}, *, ` +
78
+ 'auth: Optional[Dict[str, Any]] = None, headers: Optional[Dict[str, str]] = None, ' +
79
+ 'timeout: Optional[float] = None, retry: Optional[Dict[str, Any]] = None, ' +
80
+ 'middleware: Optional[List[Any]] = None, idempotency_key: Any = None, ' +
81
+ `http_client: Optional[${httpType}] = None) -> None:`,
82
+ () => {
83
+ printer.line('self._server_url = server_url');
84
+ printer.line('self._auth = auth or {}');
85
+ printer.line('self._config: Dict[str, Any] = {');
86
+ printer.indent(() => {
87
+ printer.line('"headers": headers or {},');
88
+ printer.line('"timeout": timeout,');
89
+ printer.line('"retry": retry or {},');
90
+ printer.line('"middleware": middleware or [],');
91
+ printer.line('"idempotency_key": idempotency_key,');
92
+ });
93
+ printer.line('}');
94
+ printer.line(`self._http = http_client or ${httpType}()`);
95
+ }
96
+ );
97
+ printer.blank();
98
+ for (const { op, ident } of operationIdents(model)) {
99
+ writeMethod(printer, op, ident, errorMode, isAsync, dateType);
100
+ if (sseResponse(op) === undefined && (op.successResponseHeaders?.length ?? 0) > 0) {
101
+ writeMethod(printer, op, ident, errorMode, isAsync, dateType, model, true);
102
+ }
103
+ const spec = paginationSpecs.get(ident);
104
+ if (spec !== undefined) {
105
+ const success = jsonSuccessSchema(op);
106
+ const element = paginationItemSchema(
107
+ success,
108
+ typeof spec.items === 'string' ? spec.items : undefined,
109
+ model
110
+ );
111
+ writePaginationWrappers(
112
+ printer,
113
+ op,
114
+ ident,
115
+ isAsync,
116
+ element === undefined ? 'Any' : pythonType(element, dateType),
117
+ dateType
118
+ );
119
+ }
120
+ }
121
+ });
122
+ printer.blank();
123
+ }
@@ -0,0 +1,52 @@
1
+ // Ejected from @redocly/client-generator@0.4.0 — the built-in "python" 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 python --update`.
5
+ // The `descriptor` stage: the wire-shape literals the embedded runtime routes by —
6
+ // pagination specs, envelope-header coerce specs, and Python data literals.
7
+
8
+ import {
9
+ type ApiModel,
10
+ headerCoerceType,
11
+ identifierFor,
12
+ type NeutralPaginationRule,
13
+ type OperationModel,
14
+ } from '@redocly/client-generator';
15
+
16
+ import { naming, PY } from './naming.ts';
17
+
18
+ /** JSON → Python literal (dicts/lists/strings/numbers/bools/None). */
19
+ export function pythonLiteral(value: unknown): string {
20
+ return naming.literal(value);
21
+ }
22
+
23
+ /** The resolved pagination rule mapped to the snake_case spec dict the embedded
24
+ * Python runtime consumes. */
25
+ export function paginationSpec(
26
+ rule: NeutralPaginationRule | undefined
27
+ ): Record<string, unknown> | undefined {
28
+ if (rule === undefined) return undefined;
29
+ return {
30
+ style: rule.style,
31
+ ...(rule.param !== undefined ? { param: rule.param } : {}),
32
+ ...(rule.nextCursor !== undefined ? { next_cursor: rule.nextCursor } : {}),
33
+ ...(rule.hasMore !== undefined ? { has_more: rule.hasMore } : {}),
34
+ ...(rule.limitParam !== undefined ? { limit_param: rule.limitParam } : {}),
35
+ ...(rule.items !== undefined ? { items: rule.items } : {}),
36
+ };
37
+ }
38
+
39
+ /** Declared response headers as runtime coerce specs: `("wire-name", "snake_key", "type")`. */
40
+ export function envelopeHeaderSpecs(op: OperationModel, model: ApiModel): string {
41
+ const used = new Set<string>();
42
+ const specs = (op.successResponseHeaders ?? []).map((header) => {
43
+ const base = identifierFor(header.name, { style: 'snake', reserved: PY });
44
+ let key = base;
45
+ let suffix = 2;
46
+ while (used.has(key)) key = `${base}_${suffix++}`;
47
+ used.add(key);
48
+ const type = headerCoerceType(header.schema, model);
49
+ return `(${naming.string(header.name)}, ${naming.string(key)}, ${naming.string(type)})`;
50
+ });
51
+ return `[${specs.join(', ')}]`;
52
+ }