@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,506 @@
1
+ // Ejected from @redocly/client-generator@0.4.0 — the built-in "transformers" 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 transformers --update`.
5
+ // Emits standalone Date-transformer functions from the IR. For each named
6
+ // schema that (recursively) carries a `format: date-time`/`date` string field,
7
+ // emits `export const transform<Name> = (data: <Name>): <Name> => { … };` that
8
+ // walks the value and rewrites those wire ISO strings to `new Date(...)` in
9
+ // place, so the runtime value matches the sdk's `--date-type Date` types.
10
+ //
11
+ // Pairs with the sdk generated under `dateType: 'Date'`; the client itself
12
+ // stays zero-dep (Date is standard). Transformers compose across refs:
13
+ // `transformPet` calls `transformOwner(data["owner"])` when `Pet.owner` is an
14
+ // `Owner` that has dates. Source-text templates throughout.
15
+
16
+ import type { ApiModel, NamedSchemaModel, SchemaModel } from '@redocly/client-generator';
17
+ import { pascalCase, safeIdent } from '@redocly/client-generator/printers/typescript';
18
+
19
+ const INDENT = ' ';
20
+
21
+ /** `transform<Name>` — the function bound to a named schema. */
22
+ function transformName(name: string): string {
23
+ return `transform${pascalCase(name)}`;
24
+ }
25
+
26
+ /**
27
+ * Strips `readonly` modifiers so a transform can write a `readOnly` spec field
28
+ * (e.g. `createdTime`) — emitted into the module only when such a write exists.
29
+ */
30
+ const WRITABLE_DECL = 'type __Writable<T> = { -readonly [K in keyof T]: T[K] };';
31
+ /** Set by `writableLhs` during a render; `renderTransformersModule` resets and reads it. */
32
+ let writableUsed = false;
33
+
34
+ /**
35
+ * A write target: the rendered expression plus its access path (base identifier
36
+ * followed by string keys), so the `readonly` cast can rebuild the
37
+ * `NonNullable<typeof …>` chain. Loop variables have a bare one-segment path.
38
+ */
39
+ type Target = { text: string; path: string[] };
40
+
41
+ function ident(name: string): Target {
42
+ return { text: name, path: [name] };
43
+ }
44
+
45
+ /** `<target>["key"]` — bracket access, robust for any (incl. non-identifier) key. */
46
+ function index(target: Target, key: string): Target {
47
+ return { text: `${target.text}[${JSON.stringify(key)}]`, path: [...target.path, key] };
48
+ }
49
+
50
+ /**
51
+ * Whether transforming a value of `schema` REPLACES it (so the result must be
52
+ * assigned back) rather than mutating it in place: date scalars, arrays of
53
+ * them, unions containing them, and refs resolving to any of those. Objects,
54
+ * records, and intersections mutate in place.
55
+ */
56
+ function needsReassign(
57
+ schema: SchemaModel,
58
+ byName: Map<string, SchemaModel>,
59
+ seen: Set<string>
60
+ ): boolean {
61
+ if (isDateScalar(schema)) return true;
62
+ switch (schema.kind) {
63
+ case 'array':
64
+ return needsReassign(schema.items, byName, seen);
65
+ case 'union':
66
+ return schema.members.some((member) => needsReassign(member, byName, seen));
67
+ case 'ref': {
68
+ if (seen.has(schema.name)) return false;
69
+ const target = byName.get(schema.name);
70
+ return target !== undefined && needsReassign(target, byName, new Set(seen).add(schema.name));
71
+ }
72
+ default:
73
+ return false;
74
+ }
75
+ }
76
+
77
+ /** A scalar string with a `date-time`/`date` format — the leaf we convert. */
78
+ function isDateScalar(schema: SchemaModel): boolean {
79
+ return (
80
+ schema.kind === 'scalar' &&
81
+ schema.scalar === 'string' &&
82
+ (schema.metadata?.format === 'date-time' || schema.metadata?.format === 'date')
83
+ );
84
+ }
85
+
86
+ /**
87
+ * Whether a schema contains a date leaf, following refs. `seen` guards ref
88
+ * cycles (a self-referential schema would otherwise recurse forever); a ref
89
+ * back into the visited set carries no *new* dates from here.
90
+ */
91
+ function hasDates(
92
+ schema: SchemaModel,
93
+ byName: Map<string, SchemaModel>,
94
+ seen: Set<string>
95
+ ): boolean {
96
+ if (isDateScalar(schema)) return true;
97
+ switch (schema.kind) {
98
+ case 'array':
99
+ return hasDates(schema.items, byName, seen);
100
+ case 'record':
101
+ return hasDates(schema.value, byName, seen);
102
+ case 'object':
103
+ return schema.properties.some((p) => hasDates(p.schema, byName, seen));
104
+ case 'union':
105
+ case 'intersection':
106
+ return schema.members.some((m) => hasDates(m, byName, seen));
107
+ case 'ref': {
108
+ const target = byName.get(schema.name);
109
+ return target !== undefined && !seen.has(schema.name)
110
+ ? hasDates(target, byName, new Set(seen).add(schema.name))
111
+ : false;
112
+ }
113
+ default:
114
+ return false;
115
+ }
116
+ }
117
+
118
+ /**
119
+ * `if (<cond>) …` — a brace-less single-statement `then` prints on the next line one
120
+ * level deeper (`block: false`), a braced one wraps in `{ … }` (`block: true`);
121
+ * `then` receives the indent its lines must start at.
122
+ */
123
+ function ifThen(
124
+ cond: string,
125
+ then: (indent: string) => string[],
126
+ indent: string,
127
+ block = false
128
+ ): string[] {
129
+ if (block) return [`${indent}if (${cond}) {`, ...then(indent + INDENT), `${indent}}`];
130
+ return [`${indent}if (${cond})`, ...then(indent + INDENT)];
131
+ }
132
+
133
+ /** `<target> = <value>;` — the LHS cast writable when it is a `readonly` property. */
134
+ function assign(target: Target, value: string, readonlyLhs = false): (indent: string) => string[] {
135
+ const lhs = readonlyLhs ? writableLhs(target) : target.text;
136
+ return (indent) => [`${indent}${lhs} = ${value};`];
137
+ }
138
+
139
+ function statement(expr: string): (indent: string) => string[] {
140
+ return (indent) => [`${indent}${expr};`];
141
+ }
142
+
143
+ /**
144
+ * The write target for a `readonly`-typed property:
145
+ * `(recv as __Writable<NonNullable<typeof recv>>)["key"]`. `readonly` is shallow —
146
+ * it blocks only the direct assignment — so nested writes stay uncast.
147
+ */
148
+ function writableLhs(target: Target): string {
149
+ if (target.path.length < 2) return target.text; // a parameter reassignment is never readonly
150
+ writableUsed = true;
151
+ const receiver: Target = {
152
+ text: target.text.slice(0, target.text.lastIndexOf('[')),
153
+ path: target.path.slice(0, -1),
154
+ };
155
+ const key = target.path[target.path.length - 1];
156
+ return `(${receiver.text} as __Writable<${nonNullTypeOf(receiver)}>)[${JSON.stringify(key)}]`;
157
+ }
158
+
159
+ /**
160
+ * `NonNullable<typeof <expr>>` for the access paths this emitter builds, with
161
+ * `NonNullable` applied at every step so optional intermediate properties don't
162
+ * poison the indexed type.
163
+ */
164
+ function nonNullTypeOf(target: Target): string {
165
+ let type = `typeof ${target.path[0]}`;
166
+ for (const key of target.path.slice(1)) {
167
+ type = `NonNullable<${type}>[${JSON.stringify(key)}]`;
168
+ }
169
+ return `NonNullable<${type}>`;
170
+ }
171
+
172
+ /** Next nested loop variable: `item`, `item2`, `item3`, … (avoids shadowing). */
173
+ function nextItemVar(current: string): string {
174
+ if (current === 'data') return 'item';
175
+ return `item${Number(current.slice('item'.length)) + 1}`;
176
+ }
177
+
178
+ /**
179
+ * Conversion lines that, given the runtime value at `target` typed by `schema`,
180
+ * rewrite date leaves in place. Each branch self-gates by returning `[]` when
181
+ * nothing under it carries a date, so callers need no pre-check. `seen` follows
182
+ * refs and guards cycles; `itemVar` names nested loop variables.
183
+ */
184
+ function convert(
185
+ target: Target,
186
+ schema: SchemaModel,
187
+ byName: Map<string, SchemaModel>,
188
+ seen: Set<string>,
189
+ itemVar: string,
190
+ indent: string,
191
+ readonlyLhs = false
192
+ ): string[] {
193
+ if (isDateScalar(schema)) {
194
+ return ifThen(
195
+ `typeof ${target.text} === "string"`,
196
+ assign(target, `new Date(${target.text})`, readonlyLhs),
197
+ indent
198
+ );
199
+ }
200
+ switch (schema.kind) {
201
+ case 'ref':
202
+ return convertRef(target, schema.name, byName, seen, indent, readonlyLhs);
203
+ case 'object': {
204
+ const lines: string[] = [];
205
+ for (const p of schema.properties) {
206
+ lines.push(
207
+ ...convertProperty(
208
+ index(target, p.name),
209
+ p.schema,
210
+ byName,
211
+ seen,
212
+ itemVar,
213
+ indent,
214
+ p.readOnly === true
215
+ )
216
+ );
217
+ }
218
+ return lines;
219
+ }
220
+ case 'array':
221
+ return convertArray(target, schema.items, byName, seen, itemVar, indent, readonlyLhs);
222
+ case 'record':
223
+ return convertCollection(target, schema.value, byName, seen, itemVar, indent, true);
224
+ case 'intersection': {
225
+ // An intersection value satisfies *every* member type, so each member's
226
+ // transform applies directly to `target` with no narrowing needed.
227
+ const lines: string[] = [];
228
+ for (const m of schema.members) {
229
+ lines.push(...convert(target, m, byName, seen, itemVar, indent, readonlyLhs));
230
+ }
231
+ return lines;
232
+ }
233
+ case 'union':
234
+ return convertUnion(target, schema.members, byName, seen, itemVar, indent, readonlyLhs);
235
+ default:
236
+ return [];
237
+ }
238
+ }
239
+
240
+ /**
241
+ * A union position. A runtime value inhabits exactly one member, so we apply
242
+ * every date-bearing member's conversion to the same `target` and let the
243
+ * unmatched members' runtime guards no-op.
244
+ *
245
+ * Type-safety is the catch: `target` is typed as the whole union, so an
246
+ * object/ref member's `transform<Ref>(target)` would fail `--date-type Date`
247
+ * strict-tsc (TS2345). We therefore gate the object-shaped members behind a
248
+ * single `typeof target === "object"` check and CAST `target` to each member's
249
+ * type — the cast makes it compile, the cast target's own internal string
250
+ * guards make a wrong-member application a safe runtime no-op. Scalar date
251
+ * members keep their `typeof === "string"` guard (their type is `Date` under
252
+ * `--date-type Date`, so the assignment type-checks).
253
+ */
254
+ function convertUnion(
255
+ target: Target,
256
+ members: SchemaModel[],
257
+ byName: Map<string, SchemaModel>,
258
+ seen: Set<string>,
259
+ itemVar: string,
260
+ indent: string,
261
+ readonlyLhs = false
262
+ ): string[] {
263
+ const lines: string[] = [];
264
+ const guardedIndent = indent + INDENT;
265
+ const objectGuarded: string[] = [];
266
+ for (const m of members) {
267
+ if (isDateScalar(m)) {
268
+ lines.push(...convert(target, m, byName, seen, itemVar, indent, readonlyLhs));
269
+ } else if (m.kind === 'ref') {
270
+ if (!hasDates(m, byName, seen)) continue;
271
+ const call = `${transformName(m.name)}(${target.text} as ${m.name})`;
272
+ // A replace-by-value ref (scalar dates) must be assigned back; an object
273
+ // ref mutates in place, so its return can be dropped.
274
+ const build = needsReassign(m, byName, seen)
275
+ ? assign(target, call, readonlyLhs)
276
+ : statement(call);
277
+ objectGuarded.push(...build(guardedIndent));
278
+ } else {
279
+ // Object/array/record members: recurse under the shared object guard.
280
+ objectGuarded.push(...convert(target, m, byName, seen, itemVar, guardedIndent, readonlyLhs));
281
+ }
282
+ }
283
+ if (objectGuarded.length > 0) {
284
+ lines.push(
285
+ ...ifThen(
286
+ `${target.text} && typeof ${target.text} === "object"`,
287
+ () => objectGuarded,
288
+ indent,
289
+ true
290
+ )
291
+ );
292
+ }
293
+ return lines;
294
+ }
295
+
296
+ /**
297
+ * A ref position, emitted only when the ref target carries dates (so the
298
+ * sibling transform exists). An object-shaped ref mutates in place —
299
+ * `if (<target>) transform<Ref>(<target>);` — but a ref resolving to a date
300
+ * scalar (or an array/union of them) is replace-by-value, so its result is
301
+ * assigned back: `if (<target>) <target> = transform<Ref>(<target>);`.
302
+ */
303
+ function convertRef(
304
+ target: Target,
305
+ name: string,
306
+ byName: Map<string, SchemaModel>,
307
+ seen: Set<string>,
308
+ indent: string,
309
+ readonlyLhs = false
310
+ ): string[] {
311
+ const ref: SchemaModel = { kind: 'ref', name };
312
+ if (!hasDates(ref, byName, seen)) return [];
313
+ const call = `${transformName(name)}(${target.text})`;
314
+ return ifThen(
315
+ target.text,
316
+ needsReassign(ref, byName, seen) ? assign(target, call, readonlyLhs) : statement(call),
317
+ indent
318
+ );
319
+ }
320
+
321
+ /**
322
+ * A property position: a nested inline object guards presence and recurses
323
+ * inside a block; everything else (scalars, refs, arrays, …) delegates to
324
+ * `convert`, which guards itself.
325
+ */
326
+ function convertProperty(
327
+ target: Target,
328
+ schema: SchemaModel,
329
+ byName: Map<string, SchemaModel>,
330
+ seen: Set<string>,
331
+ itemVar: string,
332
+ indent: string,
333
+ readonlyLhs = false
334
+ ): string[] {
335
+ if (schema.kind === 'ref') {
336
+ return convertRef(target, schema.name, byName, seen, indent, readonlyLhs);
337
+ }
338
+ if (schema.kind === 'object') {
339
+ // Nested writes go one level inside — `readonly` is shallow, so no cast needed.
340
+ const inner = convert(target, schema, byName, seen, itemVar, indent + INDENT);
341
+ if (inner.length === 0) return [];
342
+ return ifThen(target.text, () => inner, indent, true);
343
+ }
344
+ return convert(target, schema, byName, seen, itemVar, indent, readonlyLhs);
345
+ }
346
+
347
+ /**
348
+ * A "replace-by-value" element is one a transform must overwrite wholesale
349
+ * rather than mutate in place: a date scalar (`new Date(v)`) or an array of
350
+ * such elements (`v.map(...)`). Returns the expression that yields the replaced
351
+ * value for the element bound to `value`, or `null` when the element instead
352
+ * mutates in place (object/ref/record). Recurses for arrays-of-arrays.
353
+ */
354
+ function replacer(
355
+ value: string,
356
+ element: SchemaModel,
357
+ byName: Map<string, SchemaModel>,
358
+ seen: Set<string>,
359
+ depth = 0
360
+ ): string | null {
361
+ if (isDateScalar(element)) return `new Date(${value})`;
362
+ // A ref resolving to a replace-by-value shape (a scalar-date named schema):
363
+ // its sibling transform returns the converted value — `transform<Ref>(v)`.
364
+ if (element.kind === 'ref' && needsReassign(element, byName, seen)) {
365
+ return `${transformName(element.name)}(${value})`;
366
+ }
367
+ if (element.kind === 'array') {
368
+ // Map var for the level below: `v` over the scalar leaf, else `row`, `row2`,
369
+ // … per array level — distinct names by depth avoid shadowing. Yields
370
+ // `.map(v => new Date(v))` and `.map(row => row.map(v => new Date(v)))`.
371
+ const varName = element.items.kind === 'array' ? rowVar(depth + 1) : 'v';
372
+ const inner = replacer(varName, element.items, byName, seen, depth + 1);
373
+ if (inner === null) return null;
374
+ return `${value}.map(${varName} => ${inner})`;
375
+ }
376
+ return null;
377
+ }
378
+
379
+ /** Array map-var name by depth: `row`, `row2`, `row3`, … (avoids shadowing). */
380
+ function rowVar(depth: number): string {
381
+ return depth <= 1 ? 'row' : `row${depth}`;
382
+ }
383
+
384
+ /** Conversions for `target` being an array whose elements are typed by `items`. */
385
+ function convertArray(
386
+ target: Target,
387
+ items: SchemaModel,
388
+ byName: Map<string, SchemaModel>,
389
+ seen: Set<string>,
390
+ itemVar: string,
391
+ indent: string,
392
+ readonlyLhs = false
393
+ ): string[] {
394
+ // Date scalars / arrays-of-date-scalars are replace-by-value: map over the
395
+ // array and reassign the slot (reassigning a loop var would be lost).
396
+ const varName = items.kind === 'array' ? rowVar(1) : 'v';
397
+ const mapped = replacer(varName, items, byName, seen, 1);
398
+ if (mapped !== null) {
399
+ // `if (Array.isArray(t)) t = t.map(v => new Date(v));` (or nested `row`)
400
+ return ifThen(
401
+ `Array.isArray(${target.text})`,
402
+ assign(target, `${target.text}.map(${varName} => ${mapped})`, readonlyLhs),
403
+ indent
404
+ );
405
+ }
406
+ if (items.kind === 'ref') {
407
+ if (!hasDates(items, byName, seen)) return [];
408
+ // `if (Array.isArray(t)) t.forEach(transformRef);`
409
+ return ifThen(
410
+ `Array.isArray(${target.text})`,
411
+ statement(`${target.text}.forEach(${transformName(items.name)})`),
412
+ indent
413
+ );
414
+ }
415
+ return convertCollection(target, items, byName, seen, itemVar, indent, false);
416
+ }
417
+
418
+ /**
419
+ * Iterate a collection (array or record) of mutate-in-place elements (objects,
420
+ * refs, records) and recurse with a fresh loop variable. Arrays iterate the
421
+ * value directly; records iterate `Object.values(...)`. `[]` when the element
422
+ * bears no dates.
423
+ *
424
+ * Replace-by-value elements (date scalars) never reach the array path here —
425
+ * `convertArray` handles them via map-and-reassign. A *record* of date scalars
426
+ * does land here: a `forEach` loop variable can't write back, so we iterate the
427
+ * keys and assign back into the record (`rec[__k] = new Date(rec[__k])`).
428
+ */
429
+ function convertCollection(
430
+ target: Target,
431
+ element: SchemaModel,
432
+ byName: Map<string, SchemaModel>,
433
+ seen: Set<string>,
434
+ itemVar: string,
435
+ indent: string,
436
+ isRecord: boolean
437
+ ): string[] {
438
+ if (isRecord) {
439
+ // Replace-by-value elements (date scalars, arrays of them) can't be written
440
+ // through a `forEach` loop var, so iterate the keys and assign back into the
441
+ // record slot. Date scalars are string-guarded; nested arrays array-guarded.
442
+ const slot: Target = { text: `${target.text}[__k]`, path: [...target.path, '__k'] };
443
+ const replaced = replacer(slot.text, element, byName, seen);
444
+ if (replaced !== null) {
445
+ const guard = isDateScalar(element)
446
+ ? `typeof ${slot.text} === "string"`
447
+ : `Array.isArray(${slot.text})`;
448
+ return ifThen(
449
+ target.text,
450
+ (loopIndent) => [
451
+ `${loopIndent}for (const __k of Object.keys(${target.text}))`,
452
+ ...ifThen(guard, (inner) => [`${inner}${slot.text} = ${replaced};`], loopIndent + INDENT),
453
+ ],
454
+ indent
455
+ );
456
+ }
457
+ }
458
+ const next = nextItemVar(itemVar);
459
+ // The loop sits one `if` level in, and the forEach body one more.
460
+ const body = convert(ident(next), element, byName, seen, next, indent + INDENT + INDENT);
461
+ if (body.length === 0) return [];
462
+ const iterable = isRecord ? `Object.values(${target.text})` : target.text;
463
+ return ifThen(
464
+ isRecord ? target.text : `Array.isArray(${target.text})`,
465
+ (inner) => [`${inner}${iterable}.forEach(${next} => {`, ...body, `${inner}});`],
466
+ indent
467
+ );
468
+ }
469
+
470
+ /** `export const transform<Name> = (data: <Name>): <Name> => { … };`. */
471
+ function transformBlock(named: NamedSchemaModel, byName: Map<string, SchemaModel>): string {
472
+ // The sdk exports the type verbatim; only the `transform<Pascal>` NAME is PascalCased.
473
+ const typeName = named.name;
474
+ const data = ident('data');
475
+ const body =
476
+ named.schema.kind === 'ref'
477
+ ? convertRef(data, named.schema.name, byName, new Set(), INDENT)
478
+ : convert(data, named.schema, byName, new Set(), 'data', INDENT);
479
+ return [
480
+ `export const ${transformName(named.name)} = (data: ${typeName}): ${typeName} => {`,
481
+ ...body,
482
+ `${INDENT}return data;`,
483
+ '};',
484
+ ].join('\n');
485
+ }
486
+
487
+ /**
488
+ * Render the transformers module. Emits one `transform<Name>` per named schema
489
+ * that carries a date field; `''` when none do. `opts.sdkModule` is the import
490
+ * specifier the schema TYPES are pulled from (the transformers call each other
491
+ * as siblings, so only the types need importing).
492
+ */
493
+ export function renderTransformersModule(model: ApiModel, opts: { sdkModule: string }): string {
494
+ const byName = new Map(model.schemas.map((s) => [s.name, s.schema]));
495
+ const dated = model.schemas.filter((s) => hasDates(s.schema, byName, new Set()));
496
+ if (dated.length === 0) return '';
497
+ const types = dated.map((s) => safeIdent(s.name)).join(', ');
498
+ writableUsed = false; // reset the per-render flag `writableLhs` sets
499
+ const transforms = dated.map((s) => transformBlock(s, byName));
500
+ const blocks = [
501
+ `import type { ${types} } from ${JSON.stringify(opts.sdkModule)};`,
502
+ ...(writableUsed ? [WRITABLE_DECL] : []),
503
+ ...transforms,
504
+ ];
505
+ return blocks.join('\n\n');
506
+ }
@@ -0,0 +1,35 @@
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 type { ApiModel } from '@redocly/client-generator';
6
+ import { escapeJsDoc, splitLines } from '@redocly/client-generator/printers/typescript';
7
+
8
+ /** The generated-by banner prepended to every emitted module. */
9
+ export const HEADER = `// Generated by @redocly/client-generator — do not edit by hand.
10
+ // Source: OpenAPI description. Re-run \`redocly generate-client\` to update.`;
11
+
12
+ /**
13
+ * Assemble file content from a header banner and a printed body: the leading
14
+ * `// Generated by …` comment and the `/** title *​/` block are structural
15
+ * banners (not part of the printed AST), prepended with blank-line separation.
16
+ * Trailing newline mirrors a hand-authored file.
17
+ */
18
+ export function banner(sections: string[]): string {
19
+ return sections.filter((s) => s.length > 0).join('\n\n') + '\n';
20
+ }
21
+
22
+ export function renderTitleComment(model: ApiModel): string {
23
+ // This banner is a raw string (it does not flow through `jsdoc()`), so escape
24
+ // `*/` here too — `info.title`/`info.description` are attacker-controllable and
25
+ // would otherwise close the comment and inject code at the top of every file.
26
+ const lines = [`/**`, ` * ${escapeJsDoc(`${model.title} (v${model.version})`)}`];
27
+ if (model.description) {
28
+ for (const line of splitLines(escapeJsDoc(model.description))) {
29
+ // A blank line prints as ` *` — a trailing space fails consumer formatter checks.
30
+ lines.push(` * ${line}`.replace(/ +$/, ''));
31
+ }
32
+ }
33
+ lines.push(' */');
34
+ return lines.join('\n');
35
+ }