@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,62 @@
1
+ // Ejected from @redocly/client-generator@0.4.0 — the built-in "typescript" generator.
2
+ // This file is yours: edit freely; the generated client stays machine-owned and is
3
+ // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
+ // `redocly eject-generator typescript --update`.
5
+ // The shared calling-convention description for an operation. The sdk (which emits each
6
+ // operation's input type) and the wrapper generators (which forward it) read slot presence
7
+ // and `<Op>Variables` naming from this one source, so a call and its type cannot drift.
8
+
9
+ import type { OperationModel, ParamModel } from '@redocly/client-generator';
10
+ import { pascalCase } from '@redocly/client-generator/printers/typescript';
11
+
12
+ export type OperationSignature = {
13
+ /** Slot presence — which input layers the operation has. */
14
+ hasQuery: boolean;
15
+ hasBody: boolean;
16
+ hasHeaders: boolean;
17
+ hasCookies: boolean;
18
+ /** Any input at all — i.e. a `<Op>Variables` type exists for the operation. */
19
+ hasInputs: boolean;
20
+ /** Whether the input argument is required (else it defaults to `= {}`). */
21
+ varsRequired: boolean;
22
+ /** The `<Op>Variables` type-alias name. */
23
+ variablesTypeName: string;
24
+ };
25
+
26
+ /**
27
+ * Path parameters in URL-template order — the order a reader sees them in the path, and the
28
+ * order the old positional signature used. A parameter declared but absent from the template
29
+ * is dropped: it has nowhere to go in the URL, so asking for a value would mislead.
30
+ */
31
+ export function templatePathParams(op: OperationModel): ParamModel[] {
32
+ const byName = new Map(op.pathParams.map((param) => [param.name, param] as const));
33
+ const ordered: ParamModel[] = [];
34
+ for (const match of op.path.matchAll(/\{([^{}]+)\}/g)) {
35
+ const param = byName.get(match[1]);
36
+ if (param !== undefined) ordered.push(param);
37
+ }
38
+ return ordered;
39
+ }
40
+
41
+ /** Compute the calling-convention description for `op`. Pure; no AST. */
42
+ export function operationSignature(op: OperationModel): OperationSignature {
43
+ const pathParams = templatePathParams(op);
44
+ const hasQuery = op.queryParams.length > 0;
45
+ const hasBody = Boolean(op.requestBody);
46
+ const hasHeaders = op.headerParams.length > 0;
47
+ const hasCookies = op.cookieParams.length > 0;
48
+ return {
49
+ hasQuery,
50
+ hasBody,
51
+ hasHeaders,
52
+ hasCookies,
53
+ hasInputs: pathParams.length > 0 || hasQuery || hasBody || hasHeaders || hasCookies,
54
+ varsRequired:
55
+ pathParams.length > 0 ||
56
+ op.queryParams.some((p) => p.required) ||
57
+ (op.requestBody?.required ?? false) ||
58
+ op.headerParams.some((p) => p.required) ||
59
+ op.cookieParams.some((p) => p.required),
60
+ variablesTypeName: `${pascalCase(op.name)}Variables`,
61
+ };
62
+ }
@@ -0,0 +1,17 @@
1
+ // Ejected from @redocly/client-generator@0.4.0 — the built-in "typescript" generator.
2
+ // This file is yours: edit freely; the generated client stays machine-owned and is
3
+ // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
+ // `redocly eject-generator typescript --update`.
5
+ // Shared operation-shape predicates.
6
+
7
+ import type { RequestBodyModel } from '@redocly/client-generator';
8
+
9
+ /**
10
+ * A multipart body whose schema is a concrete object — the case worth typing. Such a body
11
+ * is emitted as its object shape (binary fields → `Blob`); the runtime serializes it to
12
+ * `FormData` (`runtime/multipart.ts`) after the onRequest chain. Multipart bodies with a
13
+ * non-object schema can't be typed field-by-field, so they keep the raw `FormData` escape hatch.
14
+ */
15
+ export function isTypedMultipart(rb: RequestBodyModel): boolean {
16
+ return rb.contentType === 'multipart/form-data' && rb.schema.kind === 'object';
17
+ }
@@ -0,0 +1,524 @@
1
+ // Ejected from @redocly/client-generator@0.4.0 — the built-in "typescript" generator.
2
+ // This file is yours: edit freely; the generated client stays machine-owned and is
3
+ // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
+ // `redocly eject-generator typescript --update`.
5
+ import {
6
+ allOperations,
7
+ type ApiModel,
8
+ type ArgsStyle,
9
+ type DateType,
10
+ type ErrorMode,
11
+ type ModelPagination,
12
+ type NamedSchemaModel,
13
+ type OperationModel,
14
+ type ParamModel,
15
+ type RequestBodyModel,
16
+ type ResponseBodyModel,
17
+ type SchemaModel,
18
+ } from '@redocly/client-generator';
19
+ // The operation-level renderers behind the client assembly: the `Ops` type map,
20
+ // the `<Op>*` alias cluster, the flat call sugar, and the split layout's schema
21
+ // import list — all derived from the IR and the shared `EmitContext`.
22
+ import { pascalCase, safeIdent } from '@redocly/client-generator/printers/typescript';
23
+
24
+ import { operationSignature, templatePathParams } from './operation-signature.ts';
25
+ import { isTypedMultipart } from './operation-types.ts';
26
+ import { responseHeadersTypeText } from './response-headers.ts';
27
+ import { tsJsdoc, tsType } from './types.ts';
28
+
29
+ /**
30
+ * The emit configuration every operation shares. Bundling it into one value keeps
31
+ * it out of the positional parameter lists of the operation emitters (which would
32
+ * otherwise thread the same arguments through every layer, inviting transposition
33
+ * bugs). Per-call structural data (response type, ordered path params, …) stays an
34
+ * explicit argument; only this cross-cutting config travels as `ctx`.
35
+ */
36
+ export type EmitContext = {
37
+ argsStyle: ArgsStyle;
38
+ errorMode: ErrorMode;
39
+ dateType: DateType;
40
+ /** Names of every exported schema, used for `<Op>*` alias collision suppression. */
41
+ schemaNames: Set<string>;
42
+ /** Named schemas — used to resolve `$ref` / `allOf` wrappers on response-header types. */
43
+ schemas?: readonly NamedSchemaModel[];
44
+ /** Resolved auto-pagination per operation name (absent ⇒ nothing paginates). */
45
+ pagination?: ModelPagination;
46
+ };
47
+
48
+ const INDENT = ' ';
49
+
50
+ /** The request-body TS type: special wrapper types per content-type, else the schema. */
51
+ export function bodyTypeText(rb: RequestBodyModel, dateType: DateType, indent = ''): string {
52
+ if (isTypedMultipart(rb)) return tsType(rb.schema, dateType, indent);
53
+ switch (rb.contentType) {
54
+ case 'multipart/form-data':
55
+ return 'FormData';
56
+ case 'application/x-www-form-urlencoded':
57
+ return 'URLSearchParams';
58
+ case 'application/octet-stream':
59
+ return 'Blob | ArrayBuffer';
60
+ default:
61
+ return tsType(rb.schema, dateType, indent);
62
+ }
63
+ }
64
+
65
+ /** The `{ … }` type literal for a params object (query or headers), with per-prop JSDoc. */
66
+ export function paramsTypeText(params: ParamModel[], dateType: DateType, indent = ''): string {
67
+ const inner = indent + INDENT;
68
+ const lines = params.flatMap((param) => [
69
+ ...tsJsdoc(param.description, param.schema.metadata, inner),
70
+ `${inner}${safeIdent(param.name)}${param.required ? '' : '?'}: ${tsType(param.schema, dateType, inner)};`,
71
+ ]);
72
+ return lines.length === 0 ? '{}' : `{\n${lines.join('\n')}\n${indent}}`;
73
+ }
74
+
75
+ /** The success-response type + kind (JSON preferred; binary/text fall back; deduped union). */
76
+ export function responseText(
77
+ responses: ResponseBodyModel[],
78
+ dateType: DateType,
79
+ indent = ''
80
+ ): { type: string; kind: 'json' | 'blob' | 'text' | 'void' } {
81
+ if (responses.length === 0) return { type: 'void', kind: 'void' };
82
+ const jsonResponse = responses.find((r) => r.contentType.toLowerCase().includes('json'));
83
+ if (jsonResponse) return { type: tsType(jsonResponse.schema, dateType, indent), kind: 'json' };
84
+ const members: string[] = [];
85
+ const seen = new Set<string>();
86
+ let hasBinary = false;
87
+ let hasText = false;
88
+ for (const response of responses) {
89
+ let member: string;
90
+ if (
91
+ response.contentType.startsWith('image/') ||
92
+ response.contentType === 'application/octet-stream'
93
+ ) {
94
+ member = 'Blob';
95
+ hasBinary = true;
96
+ } else if (response.contentType.startsWith('text/')) {
97
+ member = 'string';
98
+ hasText = true;
99
+ } else {
100
+ member = tsType(response.schema, dateType, indent);
101
+ }
102
+ if (seen.has(member)) continue;
103
+ seen.add(member);
104
+ members.push(member);
105
+ }
106
+ return { type: members.join(' | '), kind: hasBinary ? 'blob' : hasText ? 'text' : 'json' };
107
+ }
108
+
109
+ /** The deduped error-response body types, or `[]` when none. */
110
+ export function errorTypeTexts(
111
+ responses: ResponseBodyModel[],
112
+ dateType: DateType,
113
+ indent = ''
114
+ ): string[] {
115
+ const seen = new Set<string>();
116
+ const members: string[] = [];
117
+ for (const response of responses) {
118
+ const member = tsType(response.schema, dateType, indent);
119
+ if (seen.has(member)) continue;
120
+ seen.add(member);
121
+ members.push(member);
122
+ }
123
+ return members;
124
+ }
125
+
126
+ /** The TS type of a streamed event payload (`string` when no schema is declared). */
127
+ function sseEventText(op: OperationModel, dateType: DateType, indent = ''): string {
128
+ const schema = op.sse?.eventSchema;
129
+ return schema ? tsType(schema, dateType, indent) : 'string';
130
+ }
131
+
132
+ /** A `<key>(?): <Alias>` line, inlining the type when `<Alias>` collides with a schema. */
133
+ function inputPropLine(
134
+ key: string,
135
+ alias: string,
136
+ inlineType: () => string,
137
+ required: boolean,
138
+ schemaNames: Set<string>,
139
+ indent: string
140
+ ): string {
141
+ const type = schemaNames.has(alias) ? inlineType() : alias;
142
+ return `${indent}${key}${required ? '' : '?'}: ${type};`;
143
+ }
144
+
145
+ /** The named schema a `ref` chain ends at, for deciding whether a body can merge. */
146
+ function resolvedSchema(
147
+ schema: SchemaModel,
148
+ schemas: readonly NamedSchemaModel[] | undefined
149
+ ): SchemaModel | undefined {
150
+ const seen = new Set<string>();
151
+ let current = schema;
152
+ while (current.kind === 'ref') {
153
+ const { name } = current;
154
+ if (seen.has(name)) return undefined;
155
+ seen.add(name);
156
+ const named = schemas?.find((candidate) => candidate.name === name);
157
+ if (named === undefined) return undefined;
158
+ current = named.schema;
159
+ }
160
+ return current;
161
+ }
162
+
163
+ /**
164
+ * The property names of a body a merged call spreads. An `allOf` composition contributes the
165
+ * names of every member, because that is what the merged object ends up carrying; a member
166
+ * that is not an object makes the whole body unspreadable.
167
+ */
168
+ function mergedBodyProperties(
169
+ schema: SchemaModel,
170
+ schemas: readonly NamedSchemaModel[] | undefined
171
+ ): string[] | undefined {
172
+ const resolved = resolvedSchema(schema, schemas);
173
+ if (resolved?.kind === 'object') return resolved.properties.map((property) => property.name);
174
+ if (resolved?.kind !== 'intersection') return undefined;
175
+ // Deduplicated: `allOf` members routinely redeclare a property to refine it, and the
176
+ // merged body still carries one key for it — counting it twice would read as a collision
177
+ // and push a mergeable operation back to the namespaced shape.
178
+ const names = new Set<string>();
179
+ for (const member of resolved.members) {
180
+ const memberNames = mergedBodyProperties(member, schemas);
181
+ if (memberNames === undefined) return undefined;
182
+ for (const name of memberNames) names.add(name);
183
+ }
184
+ return [...names];
185
+ }
186
+
187
+ /**
188
+ * How a flat-style call spells one operation's inputs. Every parameter sits at one level,
189
+ * and a REQUIRED object body contributes its own properties — an optional body cannot
190
+ * (omitting it and omitting its required properties would look the same), and neither can
191
+ * an array, scalar, or binary body, so those keep the `body` key.
192
+ *
193
+ * When one name appears in two layers (a path and a query parameter of the same name, which
194
+ * OpenAPI permits) a merged call cannot say which is which, so that operation keeps the
195
+ * namespaced shape. The caller reports it once.
196
+ */
197
+ export function flatInputShape(
198
+ op: OperationModel,
199
+ schemas: readonly NamedSchemaModel[] | undefined
200
+ ): { mergeBody: boolean } | { collisions: string[] } {
201
+ const params = [
202
+ ...templatePathParams(op),
203
+ ...op.queryParams,
204
+ ...op.headerParams,
205
+ ...op.cookieParams,
206
+ ];
207
+ const bodyProperties =
208
+ (op.requestBody?.required ?? false) && op.requestBody !== undefined
209
+ ? mergedBodyProperties(op.requestBody.schema, schemas)
210
+ : undefined;
211
+ const mergeBody = bodyProperties !== undefined;
212
+ const counts = new Map<string, number>();
213
+ for (const param of params) counts.set(param.name, (counts.get(param.name) ?? 0) + 1);
214
+ // An unmerged body keeps the `body` key, which a parameter of that name would shadow.
215
+ if (op.requestBody && !mergeBody) counts.set('body', (counts.get('body') ?? 0) + 1);
216
+ for (const property of bodyProperties ?? []) {
217
+ counts.set(property, (counts.get(property) ?? 0) + 1);
218
+ }
219
+ const collisions = [...counts].filter(([, count]) => count > 1).map(([paramName]) => paramName);
220
+ return collisions.length > 0 ? { collisions } : { mergeBody };
221
+ }
222
+
223
+ /** `<key>: <type>` lines for parameters written at one level (the merged, flat shape). */
224
+ function mergedParamLines(params: ParamModel[], ctx: EmitContext, inner: string): string[] {
225
+ return params.flatMap((param) => [
226
+ ...tsJsdoc(param.description, param.schema.metadata, inner),
227
+ `${inner}${safeIdent(param.name)}${param.required ? '' : '?'}: ${tsType(param.schema, ctx.dateType, inner)};`,
228
+ ]);
229
+ }
230
+
231
+ /** The `<Op>Variables` object type literal (see operation-aliases.ts for the contract). */
232
+ export function variablesTypeText(
233
+ op: OperationModel,
234
+ name: string,
235
+ ctx: EmitContext,
236
+ indent = ''
237
+ ): string {
238
+ const { dateType, schemaNames } = ctx;
239
+ const inner = indent + INDENT;
240
+ const flat = ctx.argsStyle === 'flat' ? flatInputShape(op, ctx.schemas) : undefined;
241
+ if (flat !== undefined && 'mergeBody' in flat) {
242
+ return mergedVariablesText(op, name, ctx, flat.mergeBody, indent);
243
+ }
244
+ const lines: string[] = [];
245
+ const pathParams = templatePathParams(op);
246
+ if (pathParams.length > 0) {
247
+ lines.push(
248
+ inputPropLine(
249
+ 'path',
250
+ `${name}Path`,
251
+ () => paramsTypeText(pathParams, dateType, inner),
252
+ true,
253
+ schemaNames,
254
+ inner
255
+ )
256
+ );
257
+ }
258
+ if (op.queryParams.length > 0) {
259
+ lines.push(
260
+ inputPropLine(
261
+ 'query',
262
+ `${name}Query`,
263
+ () => paramsTypeText(op.queryParams, dateType, inner),
264
+ op.queryParams.some((p) => p.required),
265
+ schemaNames,
266
+ inner
267
+ )
268
+ );
269
+ }
270
+ if (op.requestBody) {
271
+ lines.push(
272
+ inputPropLine(
273
+ 'body',
274
+ `${name}Body`,
275
+ () => bodyTypeText(op.requestBody!, dateType, inner),
276
+ op.requestBody.required,
277
+ schemaNames,
278
+ inner
279
+ )
280
+ );
281
+ }
282
+ if (op.headerParams.length > 0) {
283
+ lines.push(
284
+ inputPropLine(
285
+ 'headers',
286
+ `${name}Headers`,
287
+ () => paramsTypeText(op.headerParams, dateType, inner),
288
+ op.headerParams.some((p) => p.required),
289
+ schemaNames,
290
+ inner
291
+ )
292
+ );
293
+ }
294
+ if (op.cookieParams.length > 0) {
295
+ lines.push(
296
+ inputPropLine(
297
+ 'cookies',
298
+ `${name}Cookies`,
299
+ () => paramsTypeText(op.cookieParams, dateType, inner),
300
+ op.cookieParams.some((p) => p.required),
301
+ schemaNames,
302
+ inner
303
+ )
304
+ );
305
+ }
306
+ return lines.length === 0 ? '{}' : `{\n${lines.join('\n')}\n${indent}}`;
307
+ }
308
+
309
+ /**
310
+ * The merged (`argsStyle: flat`) `<Op>Variables`: every parameter at one level, intersected
311
+ * with the body alias when the body merges. Intersecting reuses the `<Op>Body` alias rather
312
+ * than reprinting its properties, so one body type stays one type.
313
+ */
314
+ function mergedVariablesText(
315
+ op: OperationModel,
316
+ name: string,
317
+ ctx: EmitContext,
318
+ mergeBody: boolean,
319
+ indent: string
320
+ ): string {
321
+ const inner = indent + INDENT;
322
+ const lines = mergedParamLines(
323
+ [...templatePathParams(op), ...op.queryParams, ...op.headerParams, ...op.cookieParams],
324
+ ctx,
325
+ inner
326
+ );
327
+ if (op.requestBody && !mergeBody) {
328
+ lines.push(
329
+ inputPropLine(
330
+ 'body',
331
+ `${name}Body`,
332
+ () => bodyTypeText(op.requestBody!, ctx.dateType, inner),
333
+ op.requestBody.required,
334
+ ctx.schemaNames,
335
+ inner
336
+ )
337
+ );
338
+ }
339
+ const bodyRef = ctx.schemaNames.has(`${name}Body`)
340
+ ? bodyTypeText(op.requestBody!, ctx.dateType, indent)
341
+ : `${name}Body`;
342
+ const object = lines.length === 0 ? '{}' : `{\n${lines.join('\n')}\n${indent}}`;
343
+ if (!mergeBody) return object;
344
+ return lines.length === 0 ? bodyRef : `${object} & ${bodyRef}`;
345
+ }
346
+
347
+ /** The raw success ref: the `<Op>Result` alias, or the inline type when that name collides. */
348
+ function rawResultText(op: OperationModel, ctx: EmitContext, indent: string): string {
349
+ const resultName = `${pascalCase(op.name)}Result`;
350
+ return ctx.schemaNames.has(resultName)
351
+ ? responseText(op.successResponses, ctx.dateType, indent).type
352
+ : resultName;
353
+ }
354
+
355
+ /** The `Result<…, E>` error argument (result mode): `unknown`, the alias, or the inline union. */
356
+ function errorArgText(op: OperationModel, ctx: EmitContext, indent: string): string {
357
+ const members = errorTypeTexts(op.errorResponses, ctx.dateType, indent);
358
+ if (members.length === 0) return 'unknown';
359
+ const alias = `${pascalCase(op.name)}Error`;
360
+ if (!ctx.schemaNames.has(alias)) return alias;
361
+ return members.join(' | ');
362
+ }
363
+
364
+ /** `export type Ops = { <ident>: { args; result; item?; page?; kind? } }` — what `createClient<Ops>` consumes. */
365
+ export function renderOpsType(
366
+ model: ApiModel,
367
+ idents: Map<string, string>,
368
+ ctx: EmitContext
369
+ ): string {
370
+ const ops = allOperations(model.services);
371
+ if (ops.length === 0) return '';
372
+ const memberBlocks = ops.flatMap((op) => {
373
+ const ident = idents.get(op.name)!;
374
+ const name = pascalCase(op.name);
375
+ const inner = INDENT + INDENT;
376
+ const args = variablesTypeText(op, name, ctx, inner);
377
+ const sse = op.sse !== undefined;
378
+ const result = sse
379
+ ? sseEventText(op, ctx.dateType, inner)
380
+ : ctx.errorMode === 'result'
381
+ ? `Result<${rawResultText(op, ctx, inner)}, ${errorArgText(op, ctx, inner)}>`
382
+ : rawResultText(op, ctx, inner);
383
+ const lines = [`${inner}args: ${args};`, `${inner}result: ${result};`];
384
+ // Result-mode entries mark themselves so the runtime's mapped methods skip the
385
+ // throw-only envelope typing; declared headers type the `{ envelope: true }` bag.
386
+ if (ctx.errorMode === 'result' && !sse) lines.push(`${inner}mode: "result";`);
387
+ const responseHeaders = op.successResponseHeaders;
388
+ if (responseHeaders && responseHeaders.length > 0) {
389
+ lines.push(
390
+ `${inner}headers: ${responseHeadersTypeText(responseHeaders, ctx.schemas, inner)};`
391
+ );
392
+ }
393
+ const paginated = ctx.pagination?.get(op.name);
394
+ if (paginated) {
395
+ lines.push(`${inner}item: ${tsType(paginated.itemSchema, ctx.dateType, inner)};`);
396
+ if (ctx.errorMode === 'result') {
397
+ lines.push(`${inner}page: ${rawResultText(op, ctx, inner)};`);
398
+ }
399
+ }
400
+ if (sse) lines.push(`${inner}kind: "sse";`);
401
+ return [`${INDENT}${ident}: {`, ...lines, `${INDENT}};`];
402
+ });
403
+ return [
404
+ ...tsJsdoc(
405
+ "Per-operation `args`/`result` shapes (plus `kind: 'sse'` for event streams) — the\n" +
406
+ 'type-level companion of `OPERATIONS` that gives `createClient<Ops>` its typed methods.',
407
+ undefined,
408
+ ''
409
+ ),
410
+ 'export type Ops = {',
411
+ ...memberBlocks,
412
+ '};',
413
+ ].join('\n');
414
+ }
415
+
416
+ /** One operation's `<Op>*` aliases (Result/Error/Path/Query/Body/Headers/Cookies/Variables), collision-suppressed. */
417
+ export function renderAliases(op: OperationModel, ctx: EmitContext): string {
418
+ const { dateType, schemaNames } = ctx;
419
+ const name = pascalCase(op.name);
420
+ const sse = op.sse !== undefined;
421
+ const { hasInputs } = operationSignature(op);
422
+ const blocks: string[] = [];
423
+
424
+ if (!sse) {
425
+ const resultName = `${name}Result`;
426
+ if (!schemaNames.has(resultName)) {
427
+ blocks.push(
428
+ `export type ${resultName} = ${responseText(op.successResponses, dateType).type};`
429
+ );
430
+ }
431
+ if (ctx.errorMode === 'result') {
432
+ const members = errorTypeTexts(op.errorResponses, dateType);
433
+ const errorAlias = `${name}Error`;
434
+ if (members.length > 0 && !schemaNames.has(errorAlias)) {
435
+ blocks.push(`export type ${errorAlias} = ${members.join(' | ')};`);
436
+ }
437
+ }
438
+ }
439
+ const pathParams = templatePathParams(op);
440
+ if (pathParams.length > 0 && !schemaNames.has(`${name}Path`)) {
441
+ blocks.push(`export type ${name}Path = ${paramsTypeText(pathParams, dateType)};`);
442
+ }
443
+ if (op.queryParams.length > 0 && !schemaNames.has(`${name}Query`)) {
444
+ blocks.push(`export type ${name}Query = ${paramsTypeText(op.queryParams, dateType)};`);
445
+ }
446
+ if (op.requestBody && !schemaNames.has(`${name}Body`)) {
447
+ blocks.push(`export type ${name}Body = ${bodyTypeText(op.requestBody, dateType)};`);
448
+ }
449
+ if (op.headerParams.length > 0 && !schemaNames.has(`${name}Headers`)) {
450
+ blocks.push(`export type ${name}Headers = ${paramsTypeText(op.headerParams, dateType)};`);
451
+ }
452
+ // Response headers (envelope) — distinct from request `<Op>Headers`.
453
+ const responseHeaders = op.successResponseHeaders;
454
+ if (responseHeaders && responseHeaders.length > 0 && !schemaNames.has(`${name}ResponseHeaders`)) {
455
+ blocks.push(
456
+ `export type ${name}ResponseHeaders = ${responseHeadersTypeText(responseHeaders, ctx.schemas)};`
457
+ );
458
+ }
459
+ if (op.cookieParams.length > 0 && !schemaNames.has(`${name}Cookies`)) {
460
+ blocks.push(`export type ${name}Cookies = ${paramsTypeText(op.cookieParams, dateType)};`);
461
+ }
462
+ if (hasInputs && !schemaNames.has(`${name}Variables`)) {
463
+ blocks.push(`export type ${name}Variables = ${variablesTypeText(op, name, ctx)};`);
464
+ }
465
+ return blocks.join('\n\n');
466
+ }
467
+
468
+ /**
469
+ * Schema names the ENTRY file's own types reference — the split layout's type-only
470
+ * import list. Derived from the IR (the exact sources the alias/Ops renderers type):
471
+ * every ref reachable from operation inputs, success responses, error responses
472
+ * (result mode only — throw mode never renders them), and pagination item schemas.
473
+ * Named schema BODIES are not expanded: a ref renders as its bare name.
474
+ */
475
+ export function collectEntrySchemaRefs(model: ApiModel, ctx: EmitContext): string[] {
476
+ const referenced = new Set<string>();
477
+ const walk = (schema: SchemaModel): void => {
478
+ switch (schema.kind) {
479
+ case 'ref':
480
+ referenced.add(schema.name);
481
+ return;
482
+ case 'omit':
483
+ referenced.add(schema.base);
484
+ return;
485
+ case 'array':
486
+ walk(schema.items);
487
+ return;
488
+ case 'record':
489
+ walk(schema.value);
490
+ return;
491
+ case 'object':
492
+ for (const property of schema.properties) walk(property.schema);
493
+ return;
494
+ case 'union':
495
+ case 'intersection':
496
+ for (const member of schema.members) walk(member);
497
+ return;
498
+ default:
499
+ return;
500
+ }
501
+ };
502
+ for (const op of allOperations(model.services)) {
503
+ for (const param of [
504
+ ...op.pathParams,
505
+ ...op.queryParams,
506
+ ...op.headerParams,
507
+ ...op.cookieParams,
508
+ ]) {
509
+ walk(param.schema);
510
+ }
511
+ if (op.requestBody) walk(op.requestBody.schema);
512
+ for (const response of op.successResponses) {
513
+ walk(response.schema);
514
+ // SSE responses type their event payload from the stream's item schema.
515
+ if (response.itemSchema) walk(response.itemSchema);
516
+ }
517
+ if (ctx.errorMode === 'result') {
518
+ for (const response of op.errorResponses) walk(response.schema);
519
+ }
520
+ const paginated = ctx.pagination?.get(op.name);
521
+ if (paginated) walk(paginated.itemSchema);
522
+ }
523
+ return [...referenced].filter((name) => ctx.schemaNames.has(name)).sort();
524
+ }
@@ -0,0 +1,74 @@
1
+ // Ejected from @redocly/client-generator@0.4.0 — the built-in "typescript" generator.
2
+ // This file is yours: edit freely; the generated client stays machine-owned and is
3
+ // rebuilt by `redocly generate-client`. Newer generator versions merge in with
4
+ // `redocly eject-generator typescript --update`.
5
+ // Success-response header helpers: descriptor parse hints + Ops / alias type text
6
+ // for throw-mode `{ envelope: true }`.
7
+
8
+ import {
9
+ headerCoerceType,
10
+ type NamedSchemaModel,
11
+ type ResponseHeaderModel,
12
+ type ResponseHeaderSpec,
13
+ type SchemaModel,
14
+ } from '@redocly/client-generator';
15
+ import { headerPropertyKey, uniqueIdent } from '@redocly/client-generator/printers/typescript';
16
+
17
+ const INDENT = ' ';
18
+
19
+ type PlannedResponseHeader = ResponseHeaderModel & {
20
+ key: string;
21
+ type: ResponseHeaderSpec['type'];
22
+ };
23
+
24
+ /**
25
+ * Runtime coerce hint from a header schema (complex schemas fall back to string).
26
+ * Delegates to the neutral `headerCoerceType`; JavaScript has one number type,
27
+ * so `integer` collapses to `number`.
28
+ */
29
+ export function headerParseType(
30
+ schema: SchemaModel,
31
+ schemas: readonly NamedSchemaModel[] = []
32
+ ): ResponseHeaderSpec['type'] {
33
+ const coerce = headerCoerceType(schema, { schemas });
34
+ return coerce === 'integer' ? 'number' : coerce;
35
+ }
36
+
37
+ /** Descriptor `responseHeaders` entries from the success response's declared headers. */
38
+ export function responseHeaderSpecs(
39
+ headers: ResponseHeaderModel[] | undefined,
40
+ schemas: readonly NamedSchemaModel[] = []
41
+ ): ResponseHeaderSpec[] | undefined {
42
+ const planned = planResponseHeaders(headers, schemas);
43
+ if (planned.length === 0) return undefined;
44
+ return planned.map((header) => ({
45
+ name: header.name,
46
+ key: header.key,
47
+ type: header.type,
48
+ }));
49
+ }
50
+
51
+ /** Type-literal text for Ops.`headers` / `<Op>ResponseHeaders`, rendered at `indent`. */
52
+ export function responseHeadersTypeText(
53
+ headers: ResponseHeaderModel[],
54
+ schemas: readonly NamedSchemaModel[] = [],
55
+ indent = ''
56
+ ): string {
57
+ const inner = indent + INDENT;
58
+ const lines = planResponseHeaders(headers, schemas).map(
59
+ (header) => `${inner}${header.key}${header.required === true ? '' : '?'}: ${header.type};`
60
+ );
61
+ return lines.length === 0 ? '{}' : `{\n${lines.join('\n')}\n${indent}}`;
62
+ }
63
+
64
+ function planResponseHeaders(
65
+ headers: ResponseHeaderModel[] | undefined,
66
+ schemas: readonly NamedSchemaModel[]
67
+ ): PlannedResponseHeader[] {
68
+ const used = new Set<string>();
69
+ return (headers ?? []).map((header) => ({
70
+ ...header,
71
+ key: uniqueIdent(headerPropertyKey(header.name), used),
72
+ type: headerParseType(header.schema, schemas),
73
+ }));
74
+ }