@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,251 @@
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 built-in `python` generator — the first non-TypeScript library entry,
6
+ // authored the way the AGENTS.md skill teaches users' agents to author theirs:
7
+ // with the language-neutral toolkit only (Printer + schema/naming helpers).
8
+ // A guard test pins that this module never imports the TS emitter toolkit.
9
+ // One file per pipeline stage (ADR-0020); this entry assembles them.
10
+
11
+ import {
12
+ type CodeSample,
13
+ type Generator,
14
+ type GeneratorOptionsSchema,
15
+ identifierFor,
16
+ type OperationModel,
17
+ renderReferencePage,
18
+ type SampleContext,
19
+ securityRequirements,
20
+ } from '@redocly/client-generator';
21
+ import { PythonPrinter } from '@redocly/client-generator/printers/python';
22
+ import { PYTHON_RUNTIME_SOURCES } from '@redocly/client-generator/runtime-sources';
23
+
24
+ import { writeClientClass, writePythonServers } from './client.ts';
25
+ import { paginationSpec, pythonLiteral } from './descriptor.ts';
26
+ import {
27
+ discriminatorRegistrations,
28
+ pydanticDiscriminators,
29
+ renderPythonModels,
30
+ type PythonModels,
31
+ } from './models.ts';
32
+ import { operationIdents, PY } from './naming.ts';
33
+
34
+ export { renderPythonModels, type PythonModels } from './models.ts';
35
+ export { pythonType } from './types.ts';
36
+
37
+ export const pythonOptions: GeneratorOptionsSchema = {
38
+ type: 'object',
39
+ properties: {
40
+ models: {
41
+ enum: ['dataclass', 'pydantic'],
42
+ default: 'dataclass',
43
+ description:
44
+ 'Model style: standard-library dataclasses (default, httpx is the only dependency), or pydantic BaseModel classes (adds pydantic).',
45
+ },
46
+ },
47
+ additionalProperties: false,
48
+ };
49
+
50
+ /**
51
+ * The output path with an IMPORTABLE module name. The `--output` stem follows the
52
+ * TypeScript convention (`openapi.client.ts`), and `openapi.client.py` cannot be
53
+ * imported by name — nor can a hyphen or a leading digit — so the stem is converted
54
+ * to a legal module identifier (`openapi_client.py`). The directory is untouched.
55
+ */
56
+ function pythonModulePath(outputPath: string): string {
57
+ const separator = outputPath.lastIndexOf('/') >= 0 ? '/' : '\\';
58
+ const cut = outputPath.lastIndexOf(separator);
59
+ const dir = cut >= 0 ? outputPath.slice(0, cut + 1) : '';
60
+ const stem = (cut >= 0 ? outputPath.slice(cut + 1) : outputPath).replace(/\.[^.]+$/, '');
61
+ return `${dir}${identifierFor(stem, { style: 'snake', reserved: PY })}.py`;
62
+ }
63
+
64
+ /** The whole generated file: header, models, embedded runtime, descriptors, clients. */
65
+ export const pythonGenerator: Generator = ({
66
+ model,
67
+ output,
68
+ banner,
69
+ emit,
70
+ options,
71
+ pagination,
72
+ }) => {
73
+ const errorMode = emit.errorMode ?? 'throw';
74
+ const dateType = emit.dateType ?? 'string';
75
+ const models = (options?.models as PythonModels | undefined) ?? 'dataclass';
76
+ const pydantic = models === 'pydantic' ? pydanticDiscriminators(model) : undefined;
77
+ const printer = new PythonPrinter();
78
+ printer.line(
79
+ `# Generated by @redocly/client-generator (python) from "${model.title}" ${model.version}.`
80
+ );
81
+ printer.line('# Do not edit by hand — regenerate with `redocly generate-client`.');
82
+ printer.line(
83
+ models === 'pydantic'
84
+ ? '# Requires Python >= 3.9, httpx, and pydantic: pip install httpx pydantic'
85
+ : '# Requires Python >= 3.9 and httpx: pip install httpx'
86
+ );
87
+ printer.blank();
88
+
89
+ // Models (with the shared imports header).
90
+ printer.line(renderPythonModels(model, dateType, models).trimEnd());
91
+ printer.blank();
92
+ printer.blank();
93
+ writePythonServers(printer, model);
94
+
95
+ if (emit.runtime === 'module') {
96
+ // The runtime lives in real sibling modules; star imports rebind the same
97
+ // public names the inline stitching would have defined at this position.
98
+ printer.line('# ─── Runtime (real modules beside this file, written by the same run) ───');
99
+ for (const name of Object.keys(PYTHON_RUNTIME_SOURCES)) {
100
+ printer.line(`from ${name.replace(/\.py$/, '')} import *`);
101
+ }
102
+ printer.blank();
103
+ printer.blank();
104
+ } else {
105
+ // The embedded runtime, stitched into one module: `from __future__` may appear
106
+ // only at the top of a file, and the intra-runtime relative imports resolve to
107
+ // this same file — both are dropped; duplicate stdlib imports are legal Python.
108
+ printer.line('# ─── Embedded runtime (@redocly/client-generator python runtime) ───');
109
+ for (const source of Object.values(PYTHON_RUNTIME_SOURCES)) {
110
+ const stitched = source
111
+ .split('\n')
112
+ .filter((line) => !line.startsWith('from __future__') && !line.startsWith('from ._'))
113
+ .join('\n')
114
+ .trim();
115
+ printer.line(stitched);
116
+ printer.blank();
117
+ }
118
+ printer.blank();
119
+ }
120
+ const registrations = discriminatorRegistrations(model, new Set(pydantic?.unions.keys()));
121
+ if (registrations.length > 0) {
122
+ printer.line('# Discriminated unions dispatch by their property inside decode().');
123
+ for (const registration of registrations) printer.line(registration);
124
+ printer.blank();
125
+ }
126
+ printer.block('def _safe_json(response: httpx.Response) -> Any:', () => {
127
+ printer.block('try:', () => {
128
+ printer.line('return response.json()');
129
+ });
130
+ printer.block('except Exception:', () => {
131
+ printer.line('return None');
132
+ });
133
+ });
134
+ printer.blank();
135
+
136
+ // The wire-shape descriptor table the runtime routes by.
137
+ const paginationSpecs = new Map<string, Record<string, unknown> | undefined>();
138
+ for (const { op, ident } of operationIdents(model)) {
139
+ paginationSpecs.set(ident, paginationSpec(pagination?.get(op.name)?.spec));
140
+ }
141
+ printer.line('_OPERATIONS = {');
142
+ printer.indent(() => {
143
+ for (const { op, ident } of operationIdents(model)) {
144
+ const descriptor = {
145
+ id: op.specName ?? op.name,
146
+ method: op.method.toUpperCase(),
147
+ path: op.path,
148
+ ...(securityRequirements(op, model).length > 0
149
+ ? { security: securityRequirements(op, model) }
150
+ : {}),
151
+ ...(paginationSpecs.get(ident) !== undefined
152
+ ? { pagination: paginationSpecs.get(ident) }
153
+ : {}),
154
+ };
155
+ printer.line(`"${ident}": ${pythonLiteral(descriptor)},`);
156
+ }
157
+ });
158
+ printer.line('}');
159
+ printer.blank();
160
+ printer.blank();
161
+
162
+ // The `serverUrl` option overrides the description's server, like the TS sdk.
163
+ const serverUrl = emit.serverUrl ?? model.serverUrl ?? '';
164
+ writeClientClass(printer, model, errorMode, false, paginationSpecs, serverUrl, dateType);
165
+ writeClientClass(printer, model, errorMode, true, paginationSpecs, serverUrl, dateType);
166
+
167
+ const entry = { path: pythonModulePath(output.path), content: printer.toString() };
168
+ if (emit.runtime !== 'module') return [entry];
169
+ // The runtime modules, verbatim except the package-relative imports: the flat
170
+ // sibling layout has no package, so `from ._x` becomes the sibling `from _x`.
171
+ const header = banner.map((line) => `# ${line}`).join('\n');
172
+ const dir = pythonModulePath(output.path).replace(/[^\\/]+$/, '');
173
+ const runtimeFiles = Object.entries(PYTHON_RUNTIME_SOURCES).map(([name, source]) => ({
174
+ path: `${dir}${name}`,
175
+ content: `${header}\n\n${source
176
+ .split('\n')
177
+ .map((line) => (line.startsWith('from ._') ? line.replace('from ._', 'from _') : line))
178
+ .join('\n')
179
+ .trim()}\n`,
180
+ }));
181
+ return [entry, ...runtimeFiles];
182
+ };
183
+
184
+ /** One idiomatic Python call per operation — feeds `x-codeSamples` for docs. */
185
+ export function pythonSample(op: OperationModel, ctx: SampleContext): CodeSample {
186
+ // The module name this run writes, not a guess: `openapi.client.ts` becomes
187
+ // `openapi_client.py`, so `from client import Client` would not import.
188
+ const module = pythonModulePath(ctx.outputPath)
189
+ .replace(/^.*[\\/]/, '')
190
+ .replace(/\.py$/, '');
191
+ // The DEDUPED name: on a collision the method is `get_user_2`, and a snippet naming
192
+ // the raw `get_user` would show a call that goes to a different operation.
193
+ const ident =
194
+ operationIdents(ctx.model).find((entry) => entry.op.name === op.name)?.ident ??
195
+ identifierFor(op.name, { style: 'snake', reserved: PY });
196
+ const args = [
197
+ ...op.pathParams.map((param) => {
198
+ const python = identifierFor(param.name, { style: 'snake', reserved: PY });
199
+ return `${python}="<${python}>"`;
200
+ }),
201
+ ...op.queryParams
202
+ .filter((param) => param.required)
203
+ .map((param) => {
204
+ const python = identifierFor(param.name, { style: 'snake', reserved: PY });
205
+ return `${python}=...`;
206
+ }),
207
+ ...(op.requestBody ? ['body=...'] : []),
208
+ ];
209
+ return {
210
+ lang: 'python',
211
+ label: 'Python SDK',
212
+ source: `from ${module} import Client\n\nclient = Client()\nresult = client.${ident}(${args.join(', ')})\n`,
213
+ };
214
+ }
215
+
216
+ /**
217
+ * The SDK's own reference page, written when `client.docs` is on. The call snippets come
218
+ * from `pythonSample` — this generator's own hook — so the page can only ever show the syntax
219
+ * of the SDK beside it, and ejecting this generator takes the page with it.
220
+ */
221
+ export const pythonDocs: Generator = ({ model, output, emit, pagination }) => [
222
+ {
223
+ path: output.path.replace(/\.[^.\\/]+$/, '.python.md'),
224
+ content: renderReferencePage(model, {
225
+ title: `${model.title} Python SDK reference`,
226
+ frontmatter: emit.docsFrontmatter === true,
227
+ language: {
228
+ name: 'python',
229
+ label: 'Python',
230
+ fence: 'python',
231
+ requires: 'The SDK needs `httpx`.',
232
+ },
233
+ sample: (op) => pythonSample(op, { model, emit, outputPath: output.path }),
234
+ paginated: new Set(pagination?.keys() ?? []),
235
+ }),
236
+ },
237
+ ];
238
+
239
+ export default {
240
+ name: 'python',
241
+ run: pythonGenerator,
242
+ sample: pythonSample,
243
+ docs: pythonDocs,
244
+ notApplicable: {
245
+ "outputMode": "it always emits one self-contained file",
246
+ "runtime": "the runtime is always embedded in the generated file",
247
+ "argsStyle": "inputs follow the target language's own idiom",
248
+ "importExt": "the generated file has no relative imports"
249
+ },
250
+ requiresGenerator: '^0.4.0',
251
+ };
@@ -0,0 +1,242 @@
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 `models` stage: named schemas as Enum classes, dataclasses/pydantic models
6
+ // (allOf flattened), union aliases, and the decoder's discriminator registrations.
7
+
8
+ import {
9
+ type ApiModel,
10
+ type DateType,
11
+ discriminatorCases,
12
+ enumValues,
13
+ flattenAllOf,
14
+ type PropertyModel,
15
+ } from '@redocly/client-generator';
16
+ import { PythonPrinter } from '@redocly/client-generator/printers/python';
17
+
18
+ import { className, fieldName, naming } from './naming.ts';
19
+ import { pythonType } from './types.ts';
20
+
21
+ /** The model style the generator emits: plain dataclasses, or pydantic `BaseModel`s. */
22
+ export type PythonModels = 'dataclass' | 'pydantic';
23
+
24
+ /** The wire property and value a union's discriminator mapping pins on one member class. */
25
+ export type DiscriminatorPin = { property: string; value: string };
26
+
27
+ /**
28
+ * Under `models: pydantic` the decoder hands a whole object tree to `model_validate`, so a
29
+ * union nested in a model is resolved by pydantic and never reaches the `DISCRIMINATORS`
30
+ * table. Pydantic resolves it correctly when the annotation carries the discriminator, which
31
+ * it accepts only if every member types that property as a `Literal` — and the mapping
32
+ * already pins one value per member. This pass works out which unions qualify: every member
33
+ * must declare the property, and no member may be pinned to two different values (a schema
34
+ * reused by two unions).
35
+ */
36
+ export function pydanticDiscriminators(model: ApiModel): {
37
+ pins: Map<string, DiscriminatorPin>;
38
+ unions: Map<string, string>;
39
+ } {
40
+ const pins = new Map<string, DiscriminatorPin>();
41
+ const conflicted = new Set<string>();
42
+ const candidates: Array<{ name: string; property: string; members: string[] }> = [];
43
+ for (const { name, schema } of model.schemas) {
44
+ const cases = discriminatorCases(schema, model);
45
+ if (cases === undefined) continue;
46
+ const declares = cases.cases.every(
47
+ (entry) =>
48
+ flattenAllOf(entry.schema, model)?.properties.some(
49
+ (property) => property.name === cases.property
50
+ ) === true
51
+ );
52
+ if (!declares) continue;
53
+ for (const entry of cases.cases) {
54
+ const existing = pins.get(entry.schemaName);
55
+ if (existing !== undefined && existing.value !== entry.value) {
56
+ conflicted.add(entry.schemaName);
57
+ continue;
58
+ }
59
+ pins.set(entry.schemaName, { property: cases.property, value: entry.value });
60
+ }
61
+ candidates.push({
62
+ name,
63
+ property: cases.property,
64
+ members: cases.cases.map((entry) => entry.schemaName),
65
+ });
66
+ }
67
+ const unions = new Map<string, string>();
68
+ for (const candidate of candidates) {
69
+ if (candidate.members.some((member) => conflicted.has(member))) continue;
70
+ unions.set(candidate.name, fieldName(candidate.property).python);
71
+ }
72
+ for (const member of conflicted) pins.delete(member);
73
+ return { pins, unions };
74
+ }
75
+
76
+ function writeDataclass(
77
+ printer: PythonPrinter,
78
+ name: string,
79
+ properties: PropertyModel[],
80
+ dateType: DateType,
81
+ models: PythonModels,
82
+ description?: string,
83
+ /** The discriminator value this class is mapped to, pinned as a `Literal` (pydantic). */
84
+ pinned?: DiscriminatorPin
85
+ ): void {
86
+ const pydantic = models === 'pydantic';
87
+ if (!pydantic) printer.line('@dataclass');
88
+ const header = pydantic ? `class ${className(name)}(BaseModel):` : `class ${className(name)}:`;
89
+ printer.block(header, () => {
90
+ printer.doc(description);
91
+ // A wire name that is not a legal field name travels as an alias, so the model
92
+ // accepts both spellings; without this, populating by field name would fail.
93
+ if (pydantic) {
94
+ printer.line('model_config = ConfigDict(populate_by_name=True)');
95
+ printer.blank();
96
+ }
97
+ // Required fields first — a dataclass field without a default may not follow one with.
98
+ const ordered = [
99
+ ...properties.filter((property) => property.required),
100
+ ...properties.filter((property) => !property.required),
101
+ ];
102
+ const fieldMap: Array<[string, string]> = [];
103
+ if (ordered.length === 0) printer.line('pass');
104
+ for (const property of ordered) {
105
+ const { python, renamed } = fieldName(property.name);
106
+ if (renamed && !pydantic) fieldMap.push([python, property.name]);
107
+ const alias = renamed && pydantic ? `alias=${naming.string(property.name)}` : undefined;
108
+ const baseType =
109
+ pinned?.property === property.name
110
+ ? `Literal[${naming.literal(pinned.value)}]`
111
+ : pythonType(property.schema, dateType);
112
+ if (property.required) {
113
+ const value = alias === undefined ? '' : ` = Field(${alias})`;
114
+ printer.line(`${python}: ${baseType}${value}`);
115
+ } else {
116
+ const optional = baseType.startsWith('Optional[') ? baseType : `Optional[${baseType}]`;
117
+ const value = alias === undefined ? 'None' : `Field(default=None, ${alias})`;
118
+ printer.line(`${python}: ${optional} = ${value}`);
119
+ }
120
+ }
121
+ if (fieldMap.length > 0) {
122
+ printer.blank();
123
+ printer.line('# Python field name -> wire (JSON) name, for (de)serialization.');
124
+ const entries = fieldMap.map(([py, wire]) => `"${py}": ${naming.string(wire)}`).join(', ');
125
+ printer.line(`_field_map: ClassVar[Dict[str, str]] = {${entries}}`);
126
+ }
127
+ });
128
+ printer.blank();
129
+ printer.blank();
130
+ }
131
+
132
+ /** Render every named schema: Enum classes, dataclasses (allOf flattened), union aliases. */
133
+ export function renderPythonModels(
134
+ model: ApiModel,
135
+ dateType: DateType = 'string',
136
+ models: PythonModels = 'dataclass'
137
+ ): string {
138
+ const printer = new PythonPrinter();
139
+ const { pins, unions } =
140
+ models === 'pydantic'
141
+ ? pydanticDiscriminators(model)
142
+ : { pins: new Map<string, DiscriminatorPin>(), unions: new Map<string, string>() };
143
+ printer.line('from __future__ import annotations');
144
+ printer.blank();
145
+ if (models === 'dataclass') printer.line('from dataclasses import dataclass');
146
+ printer.line('from enum import Enum');
147
+ // `ClassVar` types the `_field_map` of a dataclass model, which pydantic mode
148
+ // replaces with field aliases — importing it there would be an unused import.
149
+ const typingNames = [
150
+ 'Any',
151
+ 'AsyncIterator',
152
+ 'Dict',
153
+ 'Iterator',
154
+ 'List',
155
+ 'Literal',
156
+ 'Optional',
157
+ 'Tuple',
158
+ 'Union',
159
+ ];
160
+ if (models === 'dataclass') typingNames.splice(2, 0, 'ClassVar');
161
+ if (unions.size > 0) typingNames.unshift('Annotated');
162
+ printer.line(`from typing import ${typingNames.join(', ')}`);
163
+ if (models === 'pydantic') printer.line('from pydantic import BaseModel, ConfigDict, Field');
164
+ // Only under `dateType: Date` — an unused import in every other client would be noise.
165
+ if (dateType === 'Date') printer.line('from datetime import date, datetime');
166
+ printer.blank();
167
+ printer.blank();
168
+
169
+ const aliases: Array<() => void> = [];
170
+ for (const { name, schema } of model.schemas) {
171
+ const asEnum = enumValues(schema);
172
+ if (asEnum !== undefined) {
173
+ const base = asEnum.scalar === 'string' ? 'str, Enum' : 'int, Enum';
174
+ printer.block(`class ${className(name)}(${base}):`, () => {
175
+ printer.doc(schema.description);
176
+ asEnum.values.forEach((value, index) => {
177
+ printer.line(`${asEnum.memberNames[index]} = ${naming.literal(value)}`);
178
+ });
179
+ });
180
+ printer.blank();
181
+ printer.blank();
182
+ continue;
183
+ }
184
+ if (schema.kind === 'object' || schema.kind === 'intersection') {
185
+ const flat = flattenAllOf(schema, model);
186
+ if (flat !== undefined) {
187
+ writeDataclass(
188
+ printer,
189
+ name,
190
+ flat.properties,
191
+ dateType,
192
+ models,
193
+ flat.description ?? schema.description,
194
+ pins.get(name)
195
+ );
196
+ continue;
197
+ }
198
+ }
199
+ // Everything else (unions, scalar aliases, records) becomes a module-level alias,
200
+ // emitted AFTER the classes it references so the assignment evaluates.
201
+ aliases.push(() => {
202
+ const cases = discriminatorCases(schema, model);
203
+ if (cases !== undefined) {
204
+ const table = cases.cases
205
+ .map((entry) => `${entry.value} -> ${className(entry.schemaName)}`)
206
+ .join(', ');
207
+ printer.line(`# Discriminated by "${cases.property}": ${table}`);
208
+ }
209
+ const field = unions.get(name);
210
+ const union =
211
+ field === undefined
212
+ ? pythonType(schema, dateType)
213
+ : `Annotated[${pythonType(schema, dateType)}, Field(discriminator=${naming.string(field)})]`;
214
+ printer.line(`${className(name)} = ${union}`);
215
+ printer.blank();
216
+ });
217
+ }
218
+ for (const emit of aliases) emit();
219
+ return printer.toString();
220
+ }
221
+
222
+ /**
223
+ * `DISCRIMINATORS[Pet] = ("petType", {"cat": Cat, ...})` registration lines, which `decode`
224
+ * dispatches through. A union whose annotation already carries the discriminator is left
225
+ * out: pydantic resolves it at any depth, and the `Literal` on each member makes the
226
+ * decoder's member probe exact.
227
+ */
228
+ export function discriminatorRegistrations(model: ApiModel, annotated: Set<string>): string[] {
229
+ const lines: string[] = [];
230
+ for (const { name, schema } of model.schemas) {
231
+ if (annotated.has(name)) continue;
232
+ const cases = discriminatorCases(schema, model);
233
+ if (cases === undefined) continue;
234
+ const mapping = cases.cases
235
+ .map((entry) => `${naming.string(entry.value)}: ${className(entry.schemaName)}`)
236
+ .join(', ');
237
+ lines.push(
238
+ `DISCRIMINATORS[${className(name)}] = (${naming.string(cases.property)}, {${mapping}})`
239
+ );
240
+ }
241
+ return lines;
242
+ }
@@ -0,0 +1,46 @@
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 `naming` stage: the shared printer/naming instance and the collision-free
6
+ // identifier derivations every other stage builds on.
7
+
8
+ import {
9
+ type ApiModel,
10
+ type OperationModel,
11
+ RESERVED_WORDS,
12
+ uniqueIdentifiers,
13
+ } from '@redocly/client-generator';
14
+ import { PythonPrinter } from '@redocly/client-generator/printers/python';
15
+
16
+ export const PY = RESERVED_WORDS.python;
17
+
18
+ // Naming delegates to the printer — one implementation, used here and by any ejected copy.
19
+ export const naming = new PythonPrinter();
20
+
21
+ /** A named schema's Python class name. */
22
+ export function className(name: string): string {
23
+ return naming.typeName(name);
24
+ }
25
+
26
+ /** A field/parameter name, with the wire name preserved when sanitization renames it. */
27
+ export function fieldName(name: string): { python: string; renamed: boolean } {
28
+ const { identifier, renamed } = naming.memberName(name);
29
+ return { python: identifier, renamed };
30
+ }
31
+
32
+ /** Every operation with its collision-free snake_case Python method name. */
33
+ export function operationIdents(model: ApiModel): Array<{ op: OperationModel; ident: string }> {
34
+ const operations = model.services.flatMap((service) => service.operations);
35
+ const idents = uniqueIdentifiers(
36
+ operations.map((op) => op.name),
37
+ { style: 'snake', reserved: PY }
38
+ );
39
+ return operations.map((op, index) => ({ op, ident: idents[index] }));
40
+ }
41
+
42
+ /**
43
+ * The argument names every request method declares itself. A parameter named after one of
44
+ * them takes a suffixed binding instead, so the slot keeps its meaning.
45
+ */
46
+ export const METHOD_ARG_SLOTS = ['self', 'body', 'headers', 'timeout', 'retry', 'idempotency_key'];
@@ -0,0 +1,147 @@
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 `operations` stage: one typed request method per operation (sync and async),
6
+ // with the optional `_with_headers` envelope variant.
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 { PythonPrinter } from '@redocly/client-generator/printers/python';
18
+
19
+ import { envelopeHeaderSpecs } from './descriptor.ts';
20
+ import { METHOD_ARG_SLOTS, naming, PY } from './naming.ts';
21
+ import { pythonType } from './types.ts';
22
+
23
+ export function writeMethod(
24
+ printer: PythonPrinter,
25
+ op: OperationModel,
26
+ ident: string,
27
+ errorMode: 'throw' | 'result',
28
+ isAsync: boolean,
29
+ dateType: DateType,
30
+ model?: ApiModel,
31
+ envelope = false
32
+ ): void {
33
+ // Every parameter is a separate argument, so path and query names share one namespace
34
+ // with the slots this method declares itself. `uniqueIdentifiers` moves a repeat aside
35
+ // (`id`, `id_2`) — a description may legally use one name in two locations, and a
36
+ // signature that declared it twice would not even parse.
37
+ const argNames = uniqueIdentifiers(
38
+ [...op.pathParams, ...op.queryParams].map((param) => param.name),
39
+ { style: 'snake', reserved: PY, taken: METHOD_ARG_SLOTS }
40
+ );
41
+ const pathArgs = op.pathParams.map((param, index) => ({ param, python: argNames[index] }));
42
+ const queryArgs = op.queryParams.map((param, index) => ({
43
+ param,
44
+ python: argNames[op.pathParams.length + index],
45
+ }));
46
+ const positional = pathArgs.map(
47
+ ({ param, python }) => `${python}: ${pythonType(param.schema, dateType)}`
48
+ );
49
+ const bodyArg = op.requestBody ? [`body: ${pythonType(op.requestBody.schema, dateType)}`] : [];
50
+ const kwargs = [
51
+ ...queryArgs.map(({ param, python }) => {
52
+ const annotation = pythonType(param.schema, dateType);
53
+ const optional = annotation.startsWith('Optional[') ? annotation : `Optional[${annotation}]`;
54
+ return `${python}: ${optional} = None`;
55
+ }),
56
+ 'headers: Optional[Dict[str, str]] = None',
57
+ 'timeout: Optional[float] = None',
58
+ 'retry: Optional[Dict[str, Any]] = None',
59
+ 'idempotency_key: Any = None',
60
+ ];
61
+ const success = jsonSuccessSchema(op);
62
+ const sse = sseResponse(op);
63
+ const returns = envelope
64
+ ? `Envelope[${success === undefined ? 'None' : pythonType(success, dateType)}]`
65
+ : sse !== undefined
66
+ ? `${isAsync ? 'AsyncIterator' : 'Iterator'}[ServerSentEvent]`
67
+ : errorMode === 'result'
68
+ ? 'Result'
69
+ : success === undefined
70
+ ? 'None'
71
+ : pythonType(success, dateType);
72
+ // Streaming methods are plain defs returning an (async) iterator — an `async def`
73
+ // would force awaiting the call before iterating it.
74
+ const prefix = isAsync && sse === undefined ? 'async def' : 'def';
75
+ const awaitKw = isAsync ? 'await ' : '';
76
+ const sendFn = isAsync ? 'send_async' : 'send';
77
+ const signature = ['self', ...positional, ...bodyArg, '*', ...kwargs].join(', ');
78
+ const defName = envelope ? `${ident}_with_headers` : ident;
79
+ printer.block(`${prefix} ${defName}(${signature}) -> ${returns}:`, () => {
80
+ printer.doc(
81
+ envelope
82
+ ? `Like ${ident}(), returning an Envelope with the declared response headers.`
83
+ : op.summary
84
+ );
85
+ printer.line(`op = _OPERATIONS["${ident}"]`);
86
+ printer.line('auth_headers, auth_query = resolve_auth(op.get("security") or [], self._auth)');
87
+ printer.line('params: Dict[str, Any] = dict(auth_query)');
88
+ for (const { param, python } of queryArgs) {
89
+ printer.block(`if ${python} is not None:`, () => {
90
+ printer.line(`params[${naming.string(param.name)}] = encode(${python})`);
91
+ });
92
+ }
93
+ const pathDict = pathArgs
94
+ .map(({ param, python }) => `${naming.string(param.name)}: ${python}`)
95
+ .join(', ');
96
+ printer.line(`url = build_url(self._server_url, op["path"], {${pathDict}})`);
97
+ if (sse !== undefined) {
98
+ const dataKind = sse.schema !== undefined && sse.schema.kind !== 'unknown' ? 'json' : 'text';
99
+ printer.block('def _open(extra_headers: Dict[str, str]):', () => {
100
+ printer.line(
101
+ 'return self._http.stream(op["method"], url, ' +
102
+ 'headers={**auth_headers, **(headers or {}), **extra_headers}, params=params, timeout=timeout)'
103
+ );
104
+ });
105
+ printer.line(`return ${isAsync ? 'aiter_sse' : 'iter_sse'}(_open, data_kind="${dataKind}")`);
106
+ return;
107
+ }
108
+ if (isMultipartBody(op)) printer.line('form_data, form_files = to_multipart(body)');
109
+ const bodyKw = op.requestBody
110
+ ? isMultipartBody(op)
111
+ ? ', data=form_data, files=form_files'
112
+ : ', json_body=encode(body)'
113
+ : '';
114
+ printer.line(
115
+ `response = ${awaitKw}${sendFn}(self._http, self._config, op, url, method=op["method"], ` +
116
+ `headers={**auth_headers, **(headers or {})}, params=params${bodyKw}, ` +
117
+ 'timeout=timeout, retry=retry, idempotency_key=idempotency_key)'
118
+ );
119
+ const decoded =
120
+ success === undefined
121
+ ? 'None'
122
+ : `decode(${pythonType(success, dateType)}, _safe_json(response))`;
123
+ if (envelope) {
124
+ printer.block('if not response.is_success:', () => {
125
+ printer.line(
126
+ 'raise ApiError(url, response.status_code, response.reason_phrase, _safe_json(response))'
127
+ );
128
+ });
129
+ printer.line(
130
+ `return Envelope(data=${decoded}, headers=read_envelope_headers(response, ${envelopeHeaderSpecs(op, model!)}), response=response)`
131
+ );
132
+ } else if (errorMode === 'result') {
133
+ printer.block('if not response.is_success:', () => {
134
+ printer.line('return Result(data=None, error=_safe_json(response), response=response)');
135
+ });
136
+ printer.line(`return Result(data=${decoded}, error=None, response=response)`);
137
+ } else {
138
+ printer.block('if not response.is_success:', () => {
139
+ printer.line(
140
+ 'raise ApiError(url, response.status_code, response.reason_phrase, _safe_json(response))'
141
+ );
142
+ });
143
+ printer.line(success === undefined ? 'return None' : `return ${decoded}`);
144
+ }
145
+ });
146
+ printer.blank();
147
+ }