@redocly/client-generator 0.3.7 → 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,214 @@
1
+ // Ejected from @redocly/client-generator@0.4.0 — the built-in "mock" 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 mock --update`.
5
+ // Builds the body value for a faker-mode mock factory: a tree of
6
+ // `@faker-js/faker` call expressions that produce realistic — and, with a seed,
7
+ // reproducible — data. Structurally mirrors `./sample.ts`'s `walk` (same
8
+ // recursion + same visited-set cycle guard), but yields faker calls instead of a
9
+ // static value. Nested refs are INLINED under the same cycle guard (never
10
+ // `create<Ref>()` calls), so a cyclic schema terminates with `null` at the cycle
11
+ // instead of recursing forever at runtime — exactly like the static path. The
12
+ // factory signatures are identical to the static mode's, so a consumer can flip
13
+ // `mockData` without touching call sites; `@faker-js/faker` becomes their
14
+ // dev-dep while the real client stays dependency-free.
15
+
16
+ import {
17
+ type DateType,
18
+ type NamedSchemaModel,
19
+ type ScalarKind,
20
+ type SchemaMetadata,
21
+ type SchemaModel,
22
+ } from '@redocly/client-generator';
23
+ import { codeLiteral } from '@redocly/client-generator/printers/typescript';
24
+
25
+ import { splitIntersection } from './sample.ts';
26
+ import { expr, isObjectValue, type MockEntry, type MockValue, objectValue } from './values.ts';
27
+
28
+ /** The faker-call value for an IR schema. Refs resolve against `schemas`;
29
+ * recursion is cut with a visited-set (`null` at the cycle). `dateType` mirrors
30
+ * the sdk's `--date-type`: under `'Date'`, date fields stay `faker.date.recent()`
31
+ * (a `Date`); otherwise they are stringified to match the `string`-typed sdk. */
32
+ export function fakerExpression(
33
+ schema: SchemaModel,
34
+ schemas: NamedSchemaModel[],
35
+ opts: { dateType?: DateType } = {}
36
+ ): MockValue {
37
+ const byName = new Map(schemas.map((s) => [s.name, s.schema]));
38
+ const value = walk(schema, byName, new Set(), opts.dateType ?? 'string');
39
+ // A `CYCLE` that reaches the root has no container to absorb it (e.g. a
40
+ // self-referential union); fall back to null.
41
+ return value === CYCLE ? expr('null') : value;
42
+ }
43
+
44
+ /**
45
+ * Sentinel returned by `walk` when a `$ref` re-enters a name already on the stack.
46
+ * Containers turn it into the type-correct empty value for their position — an array
47
+ * to `[]`, a record to `{}`, an optional property to omission — mirroring `./sample.ts`
48
+ * so a recursive schema yields a faker tree that still satisfies its non-nullable type.
49
+ * Only a required, non-container self-reference (an uninhabitable schema) degrades to null.
50
+ */
51
+ const CYCLE = Symbol('cycle');
52
+
53
+ type WalkResult = MockValue | typeof CYCLE;
54
+
55
+ function walk(
56
+ schema: SchemaModel,
57
+ byName: Map<string, SchemaModel>,
58
+ visiting: Set<string>,
59
+ dateType: DateType
60
+ ): WalkResult {
61
+ switch (schema.kind) {
62
+ case 'scalar':
63
+ return expr(scalarExpr(schema.scalar, schema.metadata, dateType));
64
+ case 'array': {
65
+ // A cyclic item type collapses the array to `[]` — itself a valid `T[]`.
66
+ const item = walk(schema.items, byName, visiting, dateType);
67
+ return item === CYCLE ? expr('[]') : multiple(item);
68
+ }
69
+ case 'object':
70
+ return objectValue(
71
+ schema.properties.flatMap((p): MockEntry[] => {
72
+ const value = walk(p.schema, byName, visiting, dateType);
73
+ // A cyclic optional property is omitted; a cyclic required property is
74
+ // uninhabitable, so null is the only stand-in.
75
+ if (value === CYCLE) return p.required ? [{ key: p.name, value: expr('null') }] : [];
76
+ return [{ key: p.name, value }];
77
+ })
78
+ );
79
+ case 'record': {
80
+ const value = walk(schema.value, byName, visiting, dateType);
81
+ return value === CYCLE ? expr('{}') : objectValue([{ key: 'key', value }]);
82
+ }
83
+ case 'enum':
84
+ return expr(
85
+ `faker.helpers.arrayElement([${schema.values.map((value) => codeLiteral(value)).join(', ')}] as const)`
86
+ );
87
+ case 'literal':
88
+ return expr(codeLiteral(schema.value));
89
+ case 'union': {
90
+ // First non-cyclic member; if every member cycles, propagate `CYCLE`.
91
+ for (const member of schema.members) {
92
+ const value = walk(member, byName, visiting, dateType);
93
+ if (value !== CYCLE) return value;
94
+ }
95
+ return schema.members.length > 0 ? CYCLE : expr('null');
96
+ }
97
+ case 'intersection': {
98
+ // Mirror the static sampler: object members merge into one synthetic object whose
99
+ // property conflicts resolve by SPECIFICITY (see `splitIntersection`); `unknown`
100
+ // members are constraint-only and dropped; with no object member, the first
101
+ // member's expression IS the value (a scalar-narrowing intersection).
102
+ const { merged, rest } = splitIntersection(schema.members, byName);
103
+ const parts = rest
104
+ .map((member) => walk(member, byName, visiting, dateType))
105
+ .filter((part): part is MockValue => part !== CYCLE);
106
+ if (merged) {
107
+ const value = walk(merged, byName, visiting, dateType);
108
+ const own = value !== CYCLE && isObjectValue(value) ? value.entries : [];
109
+ const folded = parts.filter(isObjectValue).flatMap((part) => part.entries);
110
+ return objectValue([...own, ...folded]);
111
+ }
112
+ const objects = parts.filter(isObjectValue);
113
+ if (objects.length > 0) {
114
+ return objectValue(objects.flatMap((part) => part.entries));
115
+ }
116
+ return parts[0] ?? objectValue([]);
117
+ }
118
+ case 'omit':
119
+ return omitExpr(schema.base, schema.keys, byName, visiting, dateType);
120
+ case 'ref': {
121
+ if (visiting.has(schema.name)) return CYCLE;
122
+ const target = byName.get(schema.name);
123
+ if (!target) return expr('null');
124
+ visiting.add(schema.name);
125
+ const result = walk(target, byName, visiting, dateType);
126
+ visiting.delete(schema.name);
127
+ return result;
128
+ }
129
+ case 'null':
130
+ case 'unknown':
131
+ return expr('null');
132
+ }
133
+ }
134
+
135
+ /** The faker call for a scalar, keyed by kind then `format`. A binary field has no
136
+ * faker generator (its type is `Blob`), so it emits `new Blob([])` — the same
137
+ * type-demanded expression the static path uses, taking precedence over any example. */
138
+ function scalarExpr(
139
+ scalar: ScalarKind,
140
+ meta: SchemaMetadata | undefined,
141
+ dateType: DateType
142
+ ): string {
143
+ if (meta?.format === 'binary') return 'new Blob([])';
144
+ if (scalar === 'boolean') return 'faker.datatype.boolean()';
145
+ if (scalar === 'integer') return `faker.number.int(${boundsArg(meta)})`;
146
+ if (scalar === 'number') return `faker.number.float(${boundsArg(meta)})`;
147
+ switch (meta?.format) {
148
+ case 'email':
149
+ return 'faker.internet.email()';
150
+ case 'uuid':
151
+ return 'faker.string.uuid()';
152
+ case 'uri':
153
+ case 'url':
154
+ return 'faker.internet.url()';
155
+ case 'hostname':
156
+ return 'faker.internet.domainName()';
157
+ case 'ipv4':
158
+ return 'faker.internet.ipv4()';
159
+ case 'date-time':
160
+ return dateExpr(dateType, false);
161
+ case 'date':
162
+ return dateExpr(dateType, true);
163
+ default:
164
+ return 'faker.lorem.word()';
165
+ }
166
+ }
167
+
168
+ /** `faker.date.recent()` (under `dateType: 'Date'`); else its ISO string, sliced to
169
+ * `YYYY-MM-DD` for a `date` so the wire shape matches the `string`-typed field. */
170
+ function dateExpr(dateType: DateType, dateOnly: boolean): string {
171
+ if (dateType === 'Date') return 'faker.date.recent()';
172
+ const iso = 'faker.date.recent().toISOString()';
173
+ return dateOnly ? `${iso}.slice(0, 10)` : iso;
174
+ }
175
+
176
+ /** `{ min, max }` arg for a bounded numeric, or empty when neither bound is set. */
177
+ function boundsArg(meta: SchemaMetadata | undefined): string {
178
+ const props = [
179
+ ...(meta?.minimum !== undefined ? [`min: ${meta.minimum}`] : []),
180
+ ...(meta?.maximum !== undefined ? [`max: ${meta.maximum}`] : []),
181
+ ];
182
+ return props.length > 0 ? `{ ${props.join(', ')} }` : '';
183
+ }
184
+
185
+ /** `faker.helpers.multiple(() => <item>, { count: 1 })` — one element keeps output small.
186
+ * An object-literal arrow body must be parenthesized (`() => ({ … })`), or the braces
187
+ * parse as a block. */
188
+ function multiple(item: MockValue): MockValue {
189
+ const object = isObjectValue(item);
190
+ return {
191
+ kind: 'wrap',
192
+ before: `faker.helpers.multiple(() => ${object ? '(' : ''}`,
193
+ value: item,
194
+ after: `${object ? ')' : ''}, { count: 1 })`,
195
+ };
196
+ }
197
+
198
+ /** An `omit`: the base named schema's faker value minus the dropped keys. Resolves the
199
+ * base via the schema set (cycle-guarded); a non-object base passes through unchanged. */
200
+ function omitExpr(
201
+ base: string,
202
+ keys: string[],
203
+ byName: Map<string, SchemaModel>,
204
+ visiting: Set<string>,
205
+ dateType: DateType
206
+ ): WalkResult {
207
+ const target = byName.get(base);
208
+ if (!target) return expr('null');
209
+ const value = walk(target, byName, visiting, dateType);
210
+ // A cyclic or non-object base passes through unchanged (a container/root absorbs `CYCLE`).
211
+ if (value === CYCLE || !isObjectValue(value)) return value;
212
+ const drop = new Set(keys);
213
+ return objectValue(value.entries.filter((entry) => 'spread' in entry || !drop.has(entry.key)));
214
+ }
@@ -0,0 +1,35 @@
1
+ // Ejected from @redocly/client-generator@0.4.0 — the built-in "mock" 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 mock --update`.
5
+ import type { Generator } from '@redocly/client-generator';
6
+ import { join } from 'node:path';
7
+
8
+ import { renderMockModule } from './render.ts';
9
+
10
+ /**
11
+ * The mock generator: a standalone `<stem>.mocks.ts` module of MSW handlers and
12
+ * data factories baked from the spec. Imports `msw` (the consumer's dev-dep); the
13
+ * sdk client stays dependency-free. Output-mode-agnostic in v1 — one module beside
14
+ * the client. Emits nothing when there are no operations.
15
+ */
16
+ export const mockGenerator: Generator = ({ model, output, banner, emit }) => {
17
+ const header = banner.map((line) => `// ${line}`).join('\n');
18
+ const content = renderMockModule(model, {
19
+ sdkModule: `./${output.stem}.${emit.importExt ?? 'js'}`,
20
+ dateType: emit.dateType,
21
+ mockData: emit.mockData,
22
+ mockSeed: emit.mockSeed,
23
+ });
24
+ if (content === '') return [];
25
+ return [
26
+ { path: join(output.dir, `${output.stem}.mocks.ts`), content: `${header}\n\n${content}` },
27
+ ];
28
+ };
29
+
30
+ export default {
31
+ name: 'mock',
32
+ run: mockGenerator,
33
+ requires: ["typescript"],
34
+ requiresGenerator: '^0.4.0',
35
+ };
@@ -0,0 +1,282 @@
1
+ // Ejected from @redocly/client-generator@0.4.0 — the built-in "mock" 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 mock --update`.
5
+ // Emits a `*.mocks.ts` module: a `create<Schema>(overrides?)` data factory per
6
+ // named schema, an `<op>Handler(override?)` MSW request handler per operation
7
+ // (its primary success response), and an aggregated `handlers` array. Response
8
+ // data is sampled at codegen time (`sampleValue`) and printed as TypeScript
9
+ // literals — source-text templates — so the generated module depends only on
10
+ // `msw`; the real client stays zero-dependency.
11
+
12
+ import {
13
+ allOperations,
14
+ type ApiModel,
15
+ type DateType,
16
+ type NamedSchemaModel,
17
+ type OperationModel,
18
+ type ResponseBodyModel,
19
+ type SchemaModel,
20
+ } from '@redocly/client-generator';
21
+ import {
22
+ codeLiteral,
23
+ isIdentifier,
24
+ pascalCase,
25
+ } from '@redocly/client-generator/printers/typescript';
26
+ import { isPlainObject } from '@redocly/openapi-core';
27
+
28
+ import { fakerExpression } from './faker.ts';
29
+ import { sampleValue, SampleExpression } from './sample.ts';
30
+ import {
31
+ expr,
32
+ isObjectValue,
33
+ type MockValue,
34
+ objectValue,
35
+ renderMockValue,
36
+ spreadInto,
37
+ } from './values.ts';
38
+
39
+ const INDENT = ' ';
40
+
41
+ export type MockOptions = {
42
+ /** Import specifier for the sdk entry the schema types live in. */
43
+ sdkModule: string;
44
+ /** Must match the sdk's `--date-type`: under `'Date'` the sampler bakes date
45
+ * fields as `new Date(...)` so the mock data matches the `Date`-typed sdk. */
46
+ dateType?: DateType;
47
+ /**
48
+ * How factory/handler bodies produce data. `'static'` (default) inlines deterministic
49
+ * literals from the sampler (zero-dep, contract-faithful). `'faker'` emits
50
+ * `@faker-js/faker` calls for realistic data — reproducible when `mockSeed` is set —
51
+ * making `@faker-js/faker` the consumer's dev-dep. Factory signatures are identical
52
+ * across modes, so a consumer can flip this without changing call sites.
53
+ */
54
+ mockData?: 'static' | 'faker';
55
+ /** When set in `'faker'` mode, emit a top-level `faker.seed(<n>);` so runs reproduce. */
56
+ mockSeed?: number;
57
+ };
58
+
59
+ /** The body value for `schema` under the active data mode: a static literal tree
60
+ * (`'static'`) or a tree of `@faker-js/faker` calls (`'faker'`). Both honor `dateType`
61
+ * and the binary/Blob type demand; the faker path inlines refs with the same cycle
62
+ * guard as the static sampler, so neither recurses forever on a cyclic schema. */
63
+ function bodyValue(schema: SchemaModel, model: ApiModel, opts: MockOptions): MockValue {
64
+ return opts.mockData === 'faker'
65
+ ? fakerExpression(schema, model.schemas, { dateType: opts.dateType })
66
+ : literal(sampleValue(schema, model.schemas, { dateType: opts.dateType }));
67
+ }
68
+
69
+ /** Render the full `*.mocks.ts` source. `''` when the model has no operations. */
70
+ export function renderMockModule(model: ApiModel, opts: MockOptions): string {
71
+ const operations = allOperations(model.services);
72
+ if (operations.length === 0) return '';
73
+ const blocks = [
74
+ ...schemaTypeImport(model, opts),
75
+ // Faker mode imports `faker` (the consumer's dev-dep) and, with a seed, pins it once
76
+ // at module top so every run reproduces. Static mode emits neither (stays zero-dep).
77
+ ...(opts.mockData === 'faker' && opts.mockSeed !== undefined
78
+ ? [`faker.seed(${opts.mockSeed});`]
79
+ : []),
80
+ ...model.schemas.map((s) => factoryFor(s, model, opts)),
81
+ ...operations.flatMap((op) => [
82
+ handlerFor(op, model, opts),
83
+ ...(op.errorResponses.length > 0 ? [errorHandlerFor(op, model, opts)] : []),
84
+ ]),
85
+ handlersArray(operations),
86
+ ];
87
+ const fakerImport = opts.mockData === 'faker' ? "import { faker } from '@faker-js/faker';\n" : '';
88
+ return `import { http, HttpResponse } from 'msw';\n${fakerImport}\n${blocks.join('\n\n')}`;
89
+ }
90
+
91
+ /**
92
+ * `import type { A, B, … } from '<sdkModule>';` — the named-schema types the factories
93
+ * reference (`create<Pascal>` returns/accepts `<Pascal>`). Sorted for stable output.
94
+ * Empty when the model has no named schemas (so no type import is emitted). Importing
95
+ * the schema types also shadows globals of the same name (e.g. an `Error` schema) so the
96
+ * factory return types resolve to the generated type, not `globalThis.Error`.
97
+ */
98
+ function schemaTypeImport(model: ApiModel, opts: MockOptions): string[] {
99
+ if (model.schemas.length === 0) return [];
100
+ // Verbatim, not PascalCased: the sdk exports each schema type under its emitted name
101
+ // (`pet` stays `pet`), and the import must match it exactly.
102
+ const names = model.schemas.map((s) => s.name).sort();
103
+ return [`import type { ${names.join(', ')} } from ${JSON.stringify(opts.sdkModule)};`];
104
+ }
105
+
106
+ /**
107
+ * `export function create<Pascal>(overrides?: Partial<Name>): Name { return { …sampled, ...overrides }; }`.
108
+ * A schema whose sample is not an object literal (a scalar, enum, date, …) has nothing
109
+ * to spread into — `Partial<string>` is meaningless and would silently drop the argument —
110
+ * so its factory takes the FULL type and returns the override wholesale (`overrides ?? sample`).
111
+ */
112
+ function factoryFor(named: NamedSchemaModel, model: ApiModel, opts: MockOptions): string {
113
+ const pascal = pascalCase(named.name);
114
+ const sampled = bodyValue(named.schema, model, opts);
115
+ // Type references use the sdk's verbatim export name; only the factory NAME is PascalCased.
116
+ const typeName = named.name;
117
+ const spreads = isObjectValue(sampled);
118
+ // Spreading `Partial<Union>` (the override type of a union schema) distributes into
119
+ // `Partial<A> | Partial<B>`, which widens any discriminant property (e.g. `category`)
120
+ // and defeats narrowing — TS can no longer place the literal in a single union member.
121
+ // The sampled object is already a complete, correct member, so re-assert the type.
122
+ const rendered = renderMockValue(spreads ? spreadInto(sampled, 'overrides') : sampled, INDENT);
123
+ const body = !spreads
124
+ ? `overrides ?? ${rendered}`
125
+ : named.schema.kind === 'union'
126
+ ? `${rendered} as ${typeName}`
127
+ : rendered;
128
+ const overridesType = spreads ? `Partial<${typeName}>` : typeName;
129
+ return [
130
+ `export function create${pascal}(overrides?: ${overridesType}): ${typeName} {`,
131
+ `${INDENT}return ${body};`,
132
+ '}',
133
+ ].join('\n');
134
+ }
135
+
136
+ /**
137
+ * The interpolation gate for values that land in emitted CODE positions (binding
138
+ * names, `http.<method>` member access). The pipeline sanitizes operation names
139
+ * before any emitter runs; this re-checks at the construction site so a hostile
140
+ * name can never become code even if that invariant regresses.
141
+ */
142
+ function codeIdent(value: string): string {
143
+ if (!isIdentifier(value)) {
144
+ throw new Error(`Unsafe identifier in mock emission: ${JSON.stringify(value)}`);
145
+ }
146
+ return value;
147
+ }
148
+
149
+ /** `export const <op>Handler = (override?: <OverrideType>) => http.<method>('<path>', () => <response>);`. */
150
+ function handlerFor(op: OperationModel, model: ApiModel, opts: MockOptions): string {
151
+ const override = overrideParam(op, model, opts);
152
+ const params = override ?? '';
153
+ const call = `http.${codeIdent(op.method)}(${JSON.stringify(mswPath(op.path))}, () => ${responseExpression(op, model, opts)})`;
154
+ return `export const ${codeIdent(op.name)}Handler = (${params}) => ${call};`;
155
+ }
156
+
157
+ /**
158
+ * `export const <op>ErrorHandler = (status: <StatusUnion>, body?: <BodyType>) =>
159
+ * http.<method>("<mswPath>", () => HttpResponse.json(body ?? <staticSample>, { status }));`
160
+ *
161
+ * Opt-in (not added to `handlers`): `server.use(getPetErrorHandler(404))` overrides the
162
+ * happy path with an error. `<StatusUnion>` is the declared error statuses as literals
163
+ * (plus `number` when a `default` error is present, so any status is allowed). The static
164
+ * fallback samples the FIRST error response's schema.
165
+ */
166
+ function errorHandlerFor(op: OperationModel, model: ApiModel, opts: MockOptions): string {
167
+ const first = op.errorResponses[0];
168
+ const sampled = renderMockValue(bodyValue(first.schema, model, opts), '');
169
+ const resolver = `() => HttpResponse.json(body ?? ${sampled}, { status })`;
170
+ const call = `http.${codeIdent(op.method)}(${JSON.stringify(mswPath(op.path))}, ${resolver})`;
171
+ return `export const ${codeIdent(op.name)}ErrorHandler = (status: ${errorStatusType(op)}, body?: ${errorBodyType(op)}) => ${call};`;
172
+ }
173
+
174
+ /**
175
+ * A union of the op's declared numeric error statuses (as literals); `number` is used in place
176
+ * of a literal whenever a `default` error or a `4XX`/`5XX` range is present, so any status is
177
+ * accepted. De-duped, since a multi-media-type error contributes the same status more than once.
178
+ */
179
+ function errorStatusType(op: OperationModel): string {
180
+ const codes = [
181
+ ...new Set(
182
+ op.errorResponses.filter((r) => typeof r.status === 'number').map((r) => r.status as number)
183
+ ),
184
+ ];
185
+ const members: string[] = codes.map(String);
186
+ // A `default` error (or a range wildcard) means any status is valid — widen with `number`.
187
+ if (op.errorResponses.some((r) => typeof r.status !== 'number')) {
188
+ members.push('number');
189
+ }
190
+ return members.join(' | ');
191
+ }
192
+
193
+ /**
194
+ * The `body?` type: the union of the error responses' body types — `ref` bodies map to their
195
+ * named type, anything else to `unknown` (matching how the success handler types its override
196
+ * loosely). De-duped by printed name.
197
+ */
198
+ function errorBodyType(op: OperationModel): string {
199
+ const names = new Set<string>();
200
+ let hasUnknown = false;
201
+ for (const r of op.errorResponses) {
202
+ if (r.schema.kind === 'ref') names.add(r.schema.name);
203
+ else hasUnknown = true;
204
+ }
205
+ const members = [...names];
206
+ if (hasUnknown || members.length === 0) members.push('unknown');
207
+ return members.join(' | ');
208
+ }
209
+
210
+ /**
211
+ * The handler's `override?` parameter, present only when the response consumes it.
212
+ * A `ref` success body forwards `override` to `create<Schema>(override)`, so its type
213
+ * mirrors the factory's parameter (`Partial<Schema>`, or the full type when the factory
214
+ * replaces wholesale — see `factoryFor`). An inline object body spreads `override`, typed
215
+ * `Record<string, unknown>`. A body-less or non-object inline response has nothing to
216
+ * override, so the handler takes no parameter.
217
+ */
218
+ function overrideParam(op: OperationModel, model: ApiModel, opts: MockOptions): string | undefined {
219
+ const success = op.successResponses[0];
220
+ if (!success || success.schema.kind === 'unknown') return undefined;
221
+ if (success.schema.kind === 'ref') {
222
+ const typeName = success.schema.name;
223
+ const type = isObjectValue(bodyValue(success.schema, model, opts))
224
+ ? `Partial<${typeName}>`
225
+ : typeName;
226
+ return `override?: ${type}`;
227
+ }
228
+ if (!isObjectValue(bodyValue(success.schema, model, opts))) return undefined;
229
+ return 'override?: Record<string, unknown>';
230
+ }
231
+
232
+ /**
233
+ * The handler's response. A primary success body becomes `HttpResponse.json(…)`:
234
+ * a `ref` body calls its named `create<Schema>(override)` factory; an inline body
235
+ * is sampled and printed in place with `...override` spread in. A success with no
236
+ * usable body (an `unknown` schema, or no success response at all) becomes a
237
+ * body-less `new HttpResponse(null, { status })`. The status is the success
238
+ * response's declared code, or 200 when it's `default`/absent.
239
+ */
240
+ function responseExpression(op: OperationModel, model: ApiModel, opts: MockOptions): string {
241
+ const success = op.successResponses[0];
242
+ const status = statusCode(success?.status);
243
+ if (!success || success.schema.kind === 'unknown') {
244
+ return `new HttpResponse(null, { status: ${status} })`;
245
+ }
246
+ const data =
247
+ success.schema.kind === 'ref'
248
+ ? `create${pascalCase(success.schema.name)}(override)`
249
+ : renderMockValue(spreadInto(bodyValue(success.schema, model, opts), 'override'), '');
250
+ // `HttpResponse.json(x)` already defaults to 200, so only pass `{ status }` when it differs.
251
+ const args = status === 200 ? data : `${data}, { status: ${status} }`;
252
+ return `HttpResponse.json(${args})`;
253
+ }
254
+
255
+ /** Numeric status for a response, mapping `default`/absent to 200. */
256
+ function statusCode(status: ResponseBodyModel['status'] | undefined): number {
257
+ return typeof status === 'number' ? status : 200;
258
+ }
259
+
260
+ /** `export const handlers = [<op>Handler(), …];`. */
261
+ function handlersArray(operations: OperationModel[]): string {
262
+ const elements = operations.map((op) => `${codeIdent(op.name)}Handler()`).join(', ');
263
+ return `export const handlers = [${elements}];`;
264
+ }
265
+
266
+ /** `/pets/{petId}` → `*​/pets/:petId` — MSW path with a wildcard origin and `:param` segments. */
267
+ function mswPath(path: string): string {
268
+ return `*${path.replace(/\{([^{}]+)\}/g, ':$1')}`;
269
+ }
270
+
271
+ /** Recursively lift a sampled JS value into the render tree. Containers render
272
+ * multiline; a `SampleExpression` carries pre-built source (`new Date(...)`). */
273
+ function literal(value: unknown): MockValue {
274
+ if (value instanceof SampleExpression) return expr(value.code);
275
+ if (Array.isArray(value)) return { kind: 'array', items: value.map(literal) };
276
+ if (isPlainObject(value)) {
277
+ return objectValue(
278
+ Object.entries(value).map(([key, entryValue]) => ({ key, value: literal(entryValue) }))
279
+ );
280
+ }
281
+ return expr(codeLiteral(value));
282
+ }