@orizm/cli 2.2.7 → 3.0.1

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 (320) hide show
  1. package/README.md +111 -4
  2. package/dist/array-update-CMFUoQEe.mjs +41 -0
  3. package/dist/array-update-CMFUoQEe.mjs.map +1 -0
  4. package/dist/array-update-Dch4e9tI.cjs +58 -0
  5. package/dist/array-update-Dch4e9tI.cjs.map +1 -0
  6. package/dist/auth-BGW072BP.mjs +18 -0
  7. package/dist/auth-BGW072BP.mjs.map +1 -0
  8. package/dist/auth-CNbONZuf.cjs +18 -0
  9. package/dist/auth-CNbONZuf.cjs.map +1 -0
  10. package/dist/bucket-DqW-WEYb.mjs +17 -0
  11. package/dist/bucket-DqW-WEYb.mjs.map +1 -0
  12. package/dist/bucket-mg5QQORh.cjs +17 -0
  13. package/dist/bucket-mg5QQORh.cjs.map +1 -0
  14. package/dist/cli/main.cjs +231 -0
  15. package/dist/cli/main.cjs.map +1 -0
  16. package/dist/cli/main.d.cts +1 -0
  17. package/dist/cli/main.d.mts +1 -0
  18. package/dist/cli/main.mjs +196 -0
  19. package/dist/cli/main.mjs.map +1 -0
  20. package/dist/cms-BJnovGYT.mjs +172 -0
  21. package/dist/cms-BJnovGYT.mjs.map +1 -0
  22. package/dist/cms-Cnx-lDGu.cjs +172 -0
  23. package/dist/cms-Cnx-lDGu.cjs.map +1 -0
  24. package/dist/codegen-BF5b-u46.cjs +17 -0
  25. package/dist/codegen-BF5b-u46.cjs.map +1 -0
  26. package/dist/codegen-DZOB4ttR.mjs +17 -0
  27. package/dist/codegen-DZOB4ttR.mjs.map +1 -0
  28. package/dist/config/index.cjs +49 -96
  29. package/dist/config/index.cjs.map +1 -1
  30. package/dist/config/index.d.cts +1 -53
  31. package/dist/config/{index.d.ts → index.d.mts} +29 -28
  32. package/dist/config/index.d.mts.map +1 -0
  33. package/dist/config/index.mjs +59 -0
  34. package/dist/config/index.mjs.map +1 -0
  35. package/dist/config-loader-BEgS869e.mjs +65 -0
  36. package/dist/config-loader-BEgS869e.mjs.map +1 -0
  37. package/dist/config-loader-D8x32gEU.cjs +78 -0
  38. package/dist/config-loader-D8x32gEU.cjs.map +1 -0
  39. package/dist/confirm-delete-B9o73U7B.cjs +19 -0
  40. package/dist/confirm-delete-B9o73U7B.cjs.map +1 -0
  41. package/dist/confirm-delete-CsWkW69-.mjs +14 -0
  42. package/dist/confirm-delete-CsWkW69-.mjs.map +1 -0
  43. package/dist/consumer-C4WiGHWG.mjs +18 -0
  44. package/dist/consumer-C4WiGHWG.mjs.map +1 -0
  45. package/dist/consumer-OF6Z_eTP.cjs +95 -0
  46. package/dist/consumer-OF6Z_eTP.cjs.map +1 -0
  47. package/dist/consumer-l-8wUK8E.cjs +18 -0
  48. package/dist/consumer-l-8wUK8E.cjs.map +1 -0
  49. package/dist/consumer-pU2HyiyA.mjs +95 -0
  50. package/dist/consumer-pU2HyiyA.mjs.map +1 -0
  51. package/dist/content-BOb6NC8M.mjs +20 -0
  52. package/dist/content-BOb6NC8M.mjs.map +1 -0
  53. package/dist/content-DMjSwor1.cjs +20 -0
  54. package/dist/content-DMjSwor1.cjs.map +1 -0
  55. package/dist/create-B-PAOor6.mjs +66 -0
  56. package/dist/create-B-PAOor6.mjs.map +1 -0
  57. package/dist/create-B1ZBOqcV.mjs +58 -0
  58. package/dist/create-B1ZBOqcV.mjs.map +1 -0
  59. package/dist/create-BNYWcyuQ.cjs +66 -0
  60. package/dist/create-BNYWcyuQ.cjs.map +1 -0
  61. package/dist/create-Belwettw.mjs +54 -0
  62. package/dist/create-Belwettw.mjs.map +1 -0
  63. package/dist/create-BvERyMKa.cjs +81 -0
  64. package/dist/create-BvERyMKa.cjs.map +1 -0
  65. package/dist/create-CC814ixh.mjs +66 -0
  66. package/dist/create-CC814ixh.mjs.map +1 -0
  67. package/dist/create-CmOriwGo.cjs +58 -0
  68. package/dist/create-CmOriwGo.cjs.map +1 -0
  69. package/dist/create-DJY71sp9.cjs +54 -0
  70. package/dist/create-DJY71sp9.cjs.map +1 -0
  71. package/dist/create-Dups0gV2.mjs +81 -0
  72. package/dist/create-Dups0gV2.mjs.map +1 -0
  73. package/dist/create-Z-z3LXNW.cjs +66 -0
  74. package/dist/create-Z-z3LXNW.cjs.map +1 -0
  75. package/dist/delete-8yZ3j0vX.cjs +59 -0
  76. package/dist/delete-8yZ3j0vX.cjs.map +1 -0
  77. package/dist/delete-BOUObrDw.mjs +48 -0
  78. package/dist/delete-BOUObrDw.mjs.map +1 -0
  79. package/dist/delete-BSLIXrAh.mjs +59 -0
  80. package/dist/delete-BSLIXrAh.mjs.map +1 -0
  81. package/dist/delete-CCTiCYIL.cjs +51 -0
  82. package/dist/delete-CCTiCYIL.cjs.map +1 -0
  83. package/dist/delete-CIYY59v_.cjs +48 -0
  84. package/dist/delete-CIYY59v_.cjs.map +1 -0
  85. package/dist/delete-CSs5Czlo.mjs +59 -0
  86. package/dist/delete-CSs5Czlo.mjs.map +1 -0
  87. package/dist/delete-D4r1ve4v.cjs +56 -0
  88. package/dist/delete-D4r1ve4v.cjs.map +1 -0
  89. package/dist/delete-DVrafka1.cjs +56 -0
  90. package/dist/delete-DVrafka1.cjs.map +1 -0
  91. package/dist/delete-DhSU-Lx2.mjs +51 -0
  92. package/dist/delete-DhSU-Lx2.mjs.map +1 -0
  93. package/dist/delete-DozSxZQ7.cjs +59 -0
  94. package/dist/delete-DozSxZQ7.cjs.map +1 -0
  95. package/dist/delete-WpMIIvjj.cjs +56 -0
  96. package/dist/delete-WpMIIvjj.cjs.map +1 -0
  97. package/dist/delete-XWJRhBFs.mjs +56 -0
  98. package/dist/delete-XWJRhBFs.mjs.map +1 -0
  99. package/dist/delete-YYh_0khQ.mjs +56 -0
  100. package/dist/delete-YYh_0khQ.mjs.map +1 -0
  101. package/dist/delete-ZIifaG0i.mjs +56 -0
  102. package/dist/delete-ZIifaG0i.mjs.map +1 -0
  103. package/dist/detail-8CXNIhKw.cjs +16 -0
  104. package/dist/detail-8CXNIhKw.cjs.map +1 -0
  105. package/dist/detail-DN5jCQ4N.mjs +10 -0
  106. package/dist/detail-DN5jCQ4N.mjs.map +1 -0
  107. package/dist/download-oFGzg30E.mjs +68 -0
  108. package/dist/download-oFGzg30E.mjs.map +1 -0
  109. package/dist/download-ogGbb3FU.cjs +68 -0
  110. package/dist/download-ogGbb3FU.cjs.map +1 -0
  111. package/dist/erd-lKC5NB2l.cjs +124 -0
  112. package/dist/erd-lKC5NB2l.cjs.map +1 -0
  113. package/dist/erd-zDoF6I_y.mjs +123 -0
  114. package/dist/erd-zDoF6I_y.mjs.map +1 -0
  115. package/dist/get-BBOKSXkh.cjs +48 -0
  116. package/dist/get-BBOKSXkh.cjs.map +1 -0
  117. package/dist/get-BiPEF_m-.cjs +57 -0
  118. package/dist/get-BiPEF_m-.cjs.map +1 -0
  119. package/dist/get-C7dKoSIc.mjs +47 -0
  120. package/dist/get-C7dKoSIc.mjs.map +1 -0
  121. package/dist/get-CgEgETQa.mjs +52 -0
  122. package/dist/get-CgEgETQa.mjs.map +1 -0
  123. package/dist/get-DB80UNSR.mjs +47 -0
  124. package/dist/get-DB80UNSR.mjs.map +1 -0
  125. package/dist/get-DBxhbN1G.mjs +57 -0
  126. package/dist/get-DBxhbN1G.mjs.map +1 -0
  127. package/dist/get-DDB89cOs.mjs +48 -0
  128. package/dist/get-DDB89cOs.mjs.map +1 -0
  129. package/dist/get-DjRyK0hJ.cjs +47 -0
  130. package/dist/get-DjRyK0hJ.cjs.map +1 -0
  131. package/dist/get-IOU__2RP.cjs +52 -0
  132. package/dist/get-IOU__2RP.cjs.map +1 -0
  133. package/dist/get-KdWfYINc.cjs +47 -0
  134. package/dist/get-KdWfYINc.cjs.map +1 -0
  135. package/dist/get-RpxdnCKR.mjs +56 -0
  136. package/dist/get-RpxdnCKR.mjs.map +1 -0
  137. package/dist/get-jwXRlIBJ.cjs +57 -0
  138. package/dist/get-jwXRlIBJ.cjs.map +1 -0
  139. package/dist/group-roles-BIH7q8tf.mjs +36 -0
  140. package/dist/group-roles-BIH7q8tf.mjs.map +1 -0
  141. package/dist/group-roles-B_iAZog-.cjs +59 -0
  142. package/dist/group-roles-B_iAZog-.cjs.map +1 -0
  143. package/dist/invite-D66DSMvq.mjs +66 -0
  144. package/dist/invite-D66DSMvq.mjs.map +1 -0
  145. package/dist/invite-DPygtCoO.cjs +66 -0
  146. package/dist/invite-DPygtCoO.cjs.map +1 -0
  147. package/dist/key-C71Ffll9.mjs +17 -0
  148. package/dist/key-C71Ffll9.mjs.map +1 -0
  149. package/dist/key-DQr7qRL2.cjs +17 -0
  150. package/dist/key-DQr7qRL2.cjs.map +1 -0
  151. package/dist/link-BluFyxEL.mjs +42 -0
  152. package/dist/link-BluFyxEL.mjs.map +1 -0
  153. package/dist/link-DYu1Vjlw.cjs +42 -0
  154. package/dist/link-DYu1Vjlw.cjs.map +1 -0
  155. package/dist/list-57TUfNFd.mjs +48 -0
  156. package/dist/list-57TUfNFd.mjs.map +1 -0
  157. package/dist/list-B0N4-Q-5.mjs +81 -0
  158. package/dist/list-B0N4-Q-5.mjs.map +1 -0
  159. package/dist/list-BHvURTWd.cjs +40 -0
  160. package/dist/list-BHvURTWd.cjs.map +1 -0
  161. package/dist/list-BRh59EqI.cjs +35 -0
  162. package/dist/list-BRh59EqI.cjs.map +1 -0
  163. package/dist/list-Br6Cmi9S.cjs +95 -0
  164. package/dist/list-Br6Cmi9S.cjs.map +1 -0
  165. package/dist/list-BsYYq9wT.mjs +40 -0
  166. package/dist/list-BsYYq9wT.mjs.map +1 -0
  167. package/dist/list-BwfpuhmJ.cjs +37 -0
  168. package/dist/list-BwfpuhmJ.cjs.map +1 -0
  169. package/dist/list-BzLraBnA.cjs +82 -0
  170. package/dist/list-BzLraBnA.cjs.map +1 -0
  171. package/dist/list-CFwW0G9f.cjs +49 -0
  172. package/dist/list-CFwW0G9f.cjs.map +1 -0
  173. package/dist/list-CU42ERNY.cjs +81 -0
  174. package/dist/list-CU42ERNY.cjs.map +1 -0
  175. package/dist/list-CbvEh7eA.mjs +35 -0
  176. package/dist/list-CbvEh7eA.mjs.map +1 -0
  177. package/dist/list-D0-QrWmn.cjs +51 -0
  178. package/dist/list-D0-QrWmn.cjs.map +1 -0
  179. package/dist/list-D5PSDMWw.mjs +51 -0
  180. package/dist/list-D5PSDMWw.mjs.map +1 -0
  181. package/dist/list-DexBclfb.cjs +72 -0
  182. package/dist/list-DexBclfb.cjs.map +1 -0
  183. package/dist/list-DlJssPwy.cjs +48 -0
  184. package/dist/list-DlJssPwy.cjs.map +1 -0
  185. package/dist/list-DrZYlidZ.mjs +72 -0
  186. package/dist/list-DrZYlidZ.mjs.map +1 -0
  187. package/dist/list-ocfd7631.mjs +49 -0
  188. package/dist/list-ocfd7631.mjs.map +1 -0
  189. package/dist/list-rAn3uOA7.mjs +37 -0
  190. package/dist/list-rAn3uOA7.mjs.map +1 -0
  191. package/dist/list-sQk00GV5.mjs +95 -0
  192. package/dist/list-sQk00GV5.mjs.map +1 -0
  193. package/dist/list-vbMaOiza.mjs +82 -0
  194. package/dist/list-vbMaOiza.mjs.map +1 -0
  195. package/dist/login-2XcHd4wn.cjs +212 -0
  196. package/dist/login-2XcHd4wn.cjs.map +1 -0
  197. package/dist/login-FE_dbWMo.mjs +211 -0
  198. package/dist/login-FE_dbWMo.mjs.map +1 -0
  199. package/dist/logout-BDbWrGBm.mjs +35 -0
  200. package/dist/logout-BDbWrGBm.mjs.map +1 -0
  201. package/dist/logout-DC5TMJ5_.cjs +35 -0
  202. package/dist/logout-DC5TMJ5_.cjs.map +1 -0
  203. package/dist/management-BGYcZB4c.cjs +19 -0
  204. package/dist/management-BGYcZB4c.cjs.map +1 -0
  205. package/dist/management-DDACMgbU.mjs +19 -0
  206. package/dist/management-DDACMgbU.mjs.map +1 -0
  207. package/dist/mask-B1qD73jb.mjs +22 -0
  208. package/dist/mask-B1qD73jb.mjs.map +1 -0
  209. package/dist/mask-CqYLib9p.cjs +40 -0
  210. package/dist/mask-CqYLib9p.cjs.map +1 -0
  211. package/dist/oauth-client-CdD0evAV.cjs +170 -0
  212. package/dist/oauth-client-CdD0evAV.cjs.map +1 -0
  213. package/dist/oauth-client-QHuDa4fW.mjs +139 -0
  214. package/dist/oauth-client-QHuDa4fW.mjs.map +1 -0
  215. package/dist/object-DVqidsEc.cjs +20 -0
  216. package/dist/object-DVqidsEc.cjs.map +1 -0
  217. package/dist/object-qdBdEghr.mjs +20 -0
  218. package/dist/object-qdBdEghr.mjs.map +1 -0
  219. package/dist/org-C4cVovOM.cjs +14 -0
  220. package/dist/org-C4cVovOM.cjs.map +1 -0
  221. package/dist/org-CPhTRTks.mjs +14 -0
  222. package/dist/org-CPhTRTks.mjs.map +1 -0
  223. package/dist/org-context-Bewx2NEW.cjs +30 -0
  224. package/dist/org-context-Bewx2NEW.cjs.map +1 -0
  225. package/dist/org-context-D0dwWC2M.mjs +25 -0
  226. package/dist/org-context-D0dwWC2M.mjs.map +1 -0
  227. package/dist/parse-C8oHgQXx.cjs +229 -0
  228. package/dist/parse-C8oHgQXx.cjs.map +1 -0
  229. package/dist/parse-DA0k5AHa.mjs +150 -0
  230. package/dist/parse-DA0k5AHa.mjs.map +1 -0
  231. package/dist/project-BX7zvWB1.cjs +20 -0
  232. package/dist/project-BX7zvWB1.cjs.map +1 -0
  233. package/dist/project-CaXD3QBs.mjs +20 -0
  234. package/dist/project-CaXD3QBs.mjs.map +1 -0
  235. package/dist/project-name-CEoM-OL4.cjs +18 -0
  236. package/dist/project-name-CEoM-OL4.cjs.map +1 -0
  237. package/dist/project-name-DNMejnzZ.mjs +12 -0
  238. package/dist/project-name-DNMejnzZ.mjs.map +1 -0
  239. package/dist/project-user-Cp7i6orv.mjs +20 -0
  240. package/dist/project-user-Cp7i6orv.mjs.map +1 -0
  241. package/dist/project-user-Dm0qR-sh.cjs +20 -0
  242. package/dist/project-user-Dm0qR-sh.cjs.map +1 -0
  243. package/dist/push-0u6PDz4E.cjs +166 -0
  244. package/dist/push-0u6PDz4E.cjs.map +1 -0
  245. package/dist/push-D7co0keA.mjs +166 -0
  246. package/dist/push-D7co0keA.mjs.map +1 -0
  247. package/dist/run-codegen-Ceeosw5x.cjs +272 -0
  248. package/dist/run-codegen-Ceeosw5x.cjs.map +1 -0
  249. package/dist/run-codegen-DgaFaIQ1.mjs +190 -0
  250. package/dist/run-codegen-DgaFaIQ1.mjs.map +1 -0
  251. package/dist/run-with-context-CVhmzAFZ.mjs +876 -0
  252. package/dist/run-with-context-CVhmzAFZ.mjs.map +1 -0
  253. package/dist/run-with-context-DJNnEigg.cjs +943 -0
  254. package/dist/run-with-context-DJNnEigg.cjs.map +1 -0
  255. package/dist/schema-B3iRqvYK.cjs +20 -0
  256. package/dist/schema-B3iRqvYK.cjs.map +1 -0
  257. package/dist/schema-exG250MU.mjs +20 -0
  258. package/dist/schema-exG250MU.mjs.map +1 -0
  259. package/dist/shared-CZZimGxc.mjs +35 -0
  260. package/dist/shared-CZZimGxc.mjs.map +1 -0
  261. package/dist/shared-DHRPzzKl.cjs +59 -0
  262. package/dist/shared-DHRPzzKl.cjs.map +1 -0
  263. package/dist/status-Dq_NJE71.cjs +49 -0
  264. package/dist/status-Dq_NJE71.cjs.map +1 -0
  265. package/dist/status-fWqXzV0P.mjs +49 -0
  266. package/dist/status-fWqXzV0P.mjs.map +1 -0
  267. package/dist/table-C74eOSh8.cjs +27 -0
  268. package/dist/table-C74eOSh8.cjs.map +1 -0
  269. package/dist/table-MHEfbnWO.mjs +20 -0
  270. package/dist/table-MHEfbnWO.mjs.map +1 -0
  271. package/dist/table-event-C7gORNlb.mjs +72 -0
  272. package/dist/table-event-C7gORNlb.mjs.map +1 -0
  273. package/dist/table-event-DXkCK29f.cjs +101 -0
  274. package/dist/table-event-DXkCK29f.cjs.map +1 -0
  275. package/dist/token-store--9GYVL7N.cjs +139 -0
  276. package/dist/token-store--9GYVL7N.cjs.map +1 -0
  277. package/dist/token-store-reCGF86F.mjs +124 -0
  278. package/dist/token-store-reCGF86F.mjs.map +1 -0
  279. package/dist/update-B4lv4dAz.mjs +109 -0
  280. package/dist/update-B4lv4dAz.mjs.map +1 -0
  281. package/dist/update-BXhSosHG.cjs +171 -0
  282. package/dist/update-BXhSosHG.cjs.map +1 -0
  283. package/dist/update-CIH6sSVk.cjs +109 -0
  284. package/dist/update-CIH6sSVk.cjs.map +1 -0
  285. package/dist/update-CQ4n4Xuf.mjs +117 -0
  286. package/dist/update-CQ4n4Xuf.mjs.map +1 -0
  287. package/dist/update-CuPRoVw3.mjs +171 -0
  288. package/dist/update-CuPRoVw3.mjs.map +1 -0
  289. package/dist/update-Cx_2GkQj.cjs +61 -0
  290. package/dist/update-Cx_2GkQj.cjs.map +1 -0
  291. package/dist/update-DRnN1kiu.cjs +117 -0
  292. package/dist/update-DRnN1kiu.cjs.map +1 -0
  293. package/dist/update-Do9HHWzs.cjs +73 -0
  294. package/dist/update-Do9HHWzs.cjs.map +1 -0
  295. package/dist/update-mEmULIau.mjs +73 -0
  296. package/dist/update-mEmULIau.mjs.map +1 -0
  297. package/dist/update-rzij1b_o.mjs +61 -0
  298. package/dist/update-rzij1b_o.mjs.map +1 -0
  299. package/dist/upload-C43ZXxyb.cjs +95 -0
  300. package/dist/upload-C43ZXxyb.cjs.map +1 -0
  301. package/dist/upload-DGgJ1TQk.mjs +94 -0
  302. package/dist/upload-DGgJ1TQk.mjs.map +1 -0
  303. package/dist/validate-BpxZ8LTl.cjs +31 -0
  304. package/dist/validate-BpxZ8LTl.cjs.map +1 -0
  305. package/dist/validate-Ca0CRo16.mjs +31 -0
  306. package/dist/validate-Ca0CRo16.mjs.map +1 -0
  307. package/dist/webhook-CVFmch5W.cjs +20 -0
  308. package/dist/webhook-CVFmch5W.cjs.map +1 -0
  309. package/dist/webhook-Cy850dNs.mjs +20 -0
  310. package/dist/webhook-Cy850dNs.mjs.map +1 -0
  311. package/package.json +28 -17
  312. package/bin/index.js +0 -3
  313. package/dist/cli.cjs +0 -1978
  314. package/dist/cli.cjs.map +0 -1
  315. package/dist/cli.d.cts +0 -2
  316. package/dist/cli.d.ts +0 -2
  317. package/dist/cli.js +0 -1954
  318. package/dist/cli.js.map +0 -1
  319. package/dist/config/index.js +0 -81
  320. package/dist/config/index.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-XWJRhBFs.mjs","names":[],"sources":["../src/cli/commands/key/management/delete.ts"],"sourcesContent":["import type { ArgsDef } from \"citty\";\nimport { Result } from \"@praha/byethrow\";\nimport {\n defineCommand,\n type CommandFailure,\n type CommandOutput,\n} from \"../../define-command.js\";\nimport { contextArgs } from \"../../shared.js\";\nimport { runWithContext, type CommandContext } from \"../../run-with-context.js\";\nimport { apiErrorFailure } from \"../../api-errors.js\";\nimport { toResult } from \"../../../api/errors.js\";\nimport { confirmDeletion } from \"../../confirm-delete.js\";\nimport { parsePositionalId } from \"../../parse.js\";\n\nexport async function keyManagementDeleteHandler(\n ctx: CommandContext,\n options: { id: number; yes: boolean },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const confirmed = await confirmDeletion(\n `management key ${options.id}`,\n options.yes,\n );\n if (Result.isFailure(confirmed)) return confirmed;\n\n const deleted = toResult(\n await ctx.client.DELETE(\n \"/projects/{projectName}/management-keys/{projectManagementKeyId}\",\n {\n params: {\n path: {\n projectName: ctx.projectName,\n projectManagementKeyId: options.id,\n },\n },\n },\n ),\n );\n if (Result.isFailure(deleted)) return apiErrorFailure(deleted.error);\n\n return Result.succeed({\n json: { deleted: true, id: options.id },\n text: () => `Deleted management key ${options.id}.`,\n });\n}\n\nconst deleteArgs = {\n ...contextArgs,\n id: {\n type: \"positional\",\n required: true,\n description: \"Numeric management key ID\",\n },\n yes: {\n type: \"boolean\",\n description: \"Skip the confirmation prompt\",\n default: false,\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"delete\",\n description: \"Delete a management key\",\n },\n args: deleteArgs,\n run: async ({ args }) => {\n const id = parsePositionalId(\"management key ID\", args.id);\n if (Result.isFailure(id)) return id;\n\n return runWithContext(args, (ctx) =>\n keyManagementDeleteHandler(ctx, { id: id.value, yes: args.yes === true }),\n );\n },\n});\n"],"mappings":";;;;;;;;AAcA,eAAsB,2BACpB,KACA,SACmE;CACnE,MAAM,YAAY,MAAM,gBACtB,kBAAkB,QAAQ,MAC1B,QAAQ,GACV;CACA,IAAI,OAAO,UAAU,SAAS,GAAG,OAAO;CAExC,MAAM,UAAU,SACd,MAAM,IAAI,OAAO,OACf,oEACA,EACE,QAAQ,EACN,MAAM;EACJ,aAAa,IAAI;EACjB,wBAAwB,QAAQ;CAClC,EACF,EACF,CACF,CACF;CACA,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO,gBAAgB,QAAQ,KAAK;CAEnE,OAAO,OAAO,QAAQ;EACpB,MAAM;GAAE,SAAS;GAAM,IAAI,QAAQ;EAAG;EACtC,YAAY,0BAA0B,QAAQ,GAAG;CACnD,CAAC;AACH;AAEA,MAAM,aAAa;CACjB,GAAG;CACH,IAAI;EACF,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,KAAK;EACH,MAAM;EACN,aAAa;EACb,SAAS;CACX;AACF;AAEA,qBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,KAAK,OAAO,EAAE,WAAW;EACvB,MAAM,KAAK,kBAAkB,qBAAqB,KAAK,EAAE;EACzD,IAAI,OAAO,UAAU,EAAE,GAAG,OAAO;EAEjC,OAAO,eAAe,OAAO,QAC3B,2BAA2B,KAAK;GAAE,IAAI,GAAG;GAAO,KAAK,KAAK,QAAQ;EAAK,CAAC,CAC1E;CACF;AACF,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { t as defineCommand } from "./cli/main.mjs";
2
+ import { r as contextArgs } from "./shared-CZZimGxc.mjs";
3
+ import { a as apiErrorFailure, n as runWithContext, u as toResult } from "./run-with-context-CVhmzAFZ.mjs";
4
+ import { t as confirmDeletion } from "./confirm-delete-CsWkW69-.mjs";
5
+ import { u as parsePositionalId } from "./parse-DA0k5AHa.mjs";
6
+ import { Result } from "@praha/byethrow";
7
+
8
+ //#region src/cli/commands/key/consumer/delete.ts
9
+ async function keyConsumerDeleteHandler(ctx, options) {
10
+ const confirmed = await confirmDeletion(`consumer key ${options.id}`, options.yes);
11
+ if (Result.isFailure(confirmed)) return confirmed;
12
+ const deleted = toResult(await ctx.client.DELETE("/projects/{projectName}/consumer-keys/{projectConsumerKeyId}", { params: { path: {
13
+ projectName: ctx.projectName,
14
+ projectConsumerKeyId: options.id
15
+ } } }));
16
+ if (Result.isFailure(deleted)) return apiErrorFailure(deleted.error);
17
+ return Result.succeed({
18
+ json: {
19
+ deleted: true,
20
+ id: options.id
21
+ },
22
+ text: () => `Deleted consumer key ${options.id}.`
23
+ });
24
+ }
25
+ const deleteArgs = {
26
+ ...contextArgs,
27
+ id: {
28
+ type: "positional",
29
+ required: true,
30
+ description: "Numeric consumer key ID"
31
+ },
32
+ yes: {
33
+ type: "boolean",
34
+ description: "Skip the confirmation prompt",
35
+ default: false
36
+ }
37
+ };
38
+ var delete_default = defineCommand({
39
+ meta: {
40
+ name: "delete",
41
+ description: "Delete a consumer key"
42
+ },
43
+ args: deleteArgs,
44
+ run: async ({ args }) => {
45
+ const id = parsePositionalId("consumer key ID", args.id);
46
+ if (Result.isFailure(id)) return id;
47
+ return runWithContext(args, (ctx) => keyConsumerDeleteHandler(ctx, {
48
+ id: id.value,
49
+ yes: args.yes === true
50
+ }));
51
+ }
52
+ });
53
+
54
+ //#endregion
55
+ export { delete_default as default };
56
+ //# sourceMappingURL=delete-YYh_0khQ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-YYh_0khQ.mjs","names":[],"sources":["../src/cli/commands/key/consumer/delete.ts"],"sourcesContent":["import type { ArgsDef } from \"citty\";\nimport { Result } from \"@praha/byethrow\";\nimport {\n defineCommand,\n type CommandFailure,\n type CommandOutput,\n} from \"../../define-command.js\";\nimport { contextArgs } from \"../../shared.js\";\nimport { runWithContext, type CommandContext } from \"../../run-with-context.js\";\nimport { apiErrorFailure } from \"../../api-errors.js\";\nimport { toResult } from \"../../../api/errors.js\";\nimport { confirmDeletion } from \"../../confirm-delete.js\";\nimport { parsePositionalId } from \"../../parse.js\";\n\nexport async function keyConsumerDeleteHandler(\n ctx: CommandContext,\n options: { id: number; yes: boolean },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const confirmed = await confirmDeletion(\n `consumer key ${options.id}`,\n options.yes,\n );\n if (Result.isFailure(confirmed)) return confirmed;\n\n const deleted = toResult(\n await ctx.client.DELETE(\n \"/projects/{projectName}/consumer-keys/{projectConsumerKeyId}\",\n {\n params: {\n path: {\n projectName: ctx.projectName,\n projectConsumerKeyId: options.id,\n },\n },\n },\n ),\n );\n if (Result.isFailure(deleted)) return apiErrorFailure(deleted.error);\n\n return Result.succeed({\n json: { deleted: true, id: options.id },\n text: () => `Deleted consumer key ${options.id}.`,\n });\n}\n\nconst deleteArgs = {\n ...contextArgs,\n id: {\n type: \"positional\",\n required: true,\n description: \"Numeric consumer key ID\",\n },\n yes: {\n type: \"boolean\",\n description: \"Skip the confirmation prompt\",\n default: false,\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"delete\",\n description: \"Delete a consumer key\",\n },\n args: deleteArgs,\n run: async ({ args }) => {\n const id = parsePositionalId(\"consumer key ID\", args.id);\n if (Result.isFailure(id)) return id;\n\n return runWithContext(args, (ctx) =>\n keyConsumerDeleteHandler(ctx, { id: id.value, yes: args.yes === true }),\n );\n },\n});\n"],"mappings":";;;;;;;;AAcA,eAAsB,yBACpB,KACA,SACmE;CACnE,MAAM,YAAY,MAAM,gBACtB,gBAAgB,QAAQ,MACxB,QAAQ,GACV;CACA,IAAI,OAAO,UAAU,SAAS,GAAG,OAAO;CAExC,MAAM,UAAU,SACd,MAAM,IAAI,OAAO,OACf,gEACA,EACE,QAAQ,EACN,MAAM;EACJ,aAAa,IAAI;EACjB,sBAAsB,QAAQ;CAChC,EACF,EACF,CACF,CACF;CACA,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO,gBAAgB,QAAQ,KAAK;CAEnE,OAAO,OAAO,QAAQ;EACpB,MAAM;GAAE,SAAS;GAAM,IAAI,QAAQ;EAAG;EACtC,YAAY,wBAAwB,QAAQ,GAAG;CACjD,CAAC;AACH;AAEA,MAAM,aAAa;CACjB,GAAG;CACH,IAAI;EACF,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,KAAK;EACH,MAAM;EACN,aAAa;EACb,SAAS;CACX;AACF;AAEA,qBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,KAAK,OAAO,EAAE,WAAW;EACvB,MAAM,KAAK,kBAAkB,mBAAmB,KAAK,EAAE;EACvD,IAAI,OAAO,UAAU,EAAE,GAAG,OAAO;EAEjC,OAAO,eAAe,OAAO,QAC3B,yBAAyB,KAAK;GAAE,IAAI,GAAG;GAAO,KAAK,KAAK,QAAQ;EAAK,CAAC,CACxE;CACF;AACF,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { t as defineCommand } from "./cli/main.mjs";
2
+ import { r as contextArgs } from "./shared-CZZimGxc.mjs";
3
+ import { a as apiErrorFailure, n as runWithContext, u as toResult } from "./run-with-context-CVhmzAFZ.mjs";
4
+ import { t as confirmDeletion } from "./confirm-delete-CsWkW69-.mjs";
5
+ import { u as parsePositionalId } from "./parse-DA0k5AHa.mjs";
6
+ import { Result } from "@praha/byethrow";
7
+
8
+ //#region src/cli/commands/webhook/delete.ts
9
+ async function webhookDeleteHandler(ctx, options) {
10
+ const confirmed = await confirmDeletion(`webhook ${options.webhookId}`, options.yes);
11
+ if (Result.isFailure(confirmed)) return confirmed;
12
+ const deleted = toResult(await ctx.client.DELETE("/projects/{projectName}/webhooks/{webhookId}", { params: { path: {
13
+ projectName: ctx.projectName,
14
+ webhookId: options.webhookId
15
+ } } }));
16
+ if (Result.isFailure(deleted)) return apiErrorFailure(deleted.error);
17
+ return Result.succeed({
18
+ json: {
19
+ deleted: true,
20
+ id: options.webhookId
21
+ },
22
+ text: () => `Deleted webhook ${options.webhookId}.`
23
+ });
24
+ }
25
+ const deleteArgs = {
26
+ ...contextArgs,
27
+ id: {
28
+ type: "positional",
29
+ required: true,
30
+ description: "Numeric webhook ID"
31
+ },
32
+ yes: {
33
+ type: "boolean",
34
+ description: "Skip the confirmation prompt",
35
+ default: false
36
+ }
37
+ };
38
+ var delete_default = defineCommand({
39
+ meta: {
40
+ name: "delete",
41
+ description: "Delete a webhook"
42
+ },
43
+ args: deleteArgs,
44
+ run: async ({ args }) => {
45
+ const webhookId = parsePositionalId("webhook ID", args.id);
46
+ if (Result.isFailure(webhookId)) return webhookId;
47
+ return runWithContext(args, (ctx) => webhookDeleteHandler(ctx, {
48
+ webhookId: webhookId.value,
49
+ yes: args.yes === true
50
+ }));
51
+ }
52
+ });
53
+
54
+ //#endregion
55
+ export { delete_default as default };
56
+ //# sourceMappingURL=delete-ZIifaG0i.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-ZIifaG0i.mjs","names":[],"sources":["../src/cli/commands/webhook/delete.ts"],"sourcesContent":["import type { ArgsDef } from \"citty\";\nimport { Result } from \"@praha/byethrow\";\nimport {\n defineCommand,\n type CommandFailure,\n type CommandOutput,\n} from \"../define-command.js\";\nimport { contextArgs } from \"../shared.js\";\nimport { runWithContext, type CommandContext } from \"../run-with-context.js\";\nimport { apiErrorFailure } from \"../api-errors.js\";\nimport { toResult } from \"../../api/errors.js\";\nimport { confirmDeletion } from \"../confirm-delete.js\";\nimport { parsePositionalId } from \"../parse.js\";\n\nexport async function webhookDeleteHandler(\n ctx: CommandContext,\n options: { webhookId: number; yes: boolean },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const confirmed = await confirmDeletion(\n `webhook ${options.webhookId}`,\n options.yes,\n );\n if (Result.isFailure(confirmed)) return confirmed;\n\n const deleted = toResult(\n await ctx.client.DELETE(\"/projects/{projectName}/webhooks/{webhookId}\", {\n params: {\n path: { projectName: ctx.projectName, webhookId: options.webhookId },\n },\n }),\n );\n if (Result.isFailure(deleted)) return apiErrorFailure(deleted.error);\n\n return Result.succeed({\n json: { deleted: true, id: options.webhookId },\n text: () => `Deleted webhook ${options.webhookId}.`,\n });\n}\n\nconst deleteArgs = {\n ...contextArgs,\n id: {\n type: \"positional\",\n required: true,\n description: \"Numeric webhook ID\",\n },\n yes: {\n type: \"boolean\",\n description: \"Skip the confirmation prompt\",\n default: false,\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"delete\",\n description: \"Delete a webhook\",\n },\n args: deleteArgs,\n run: async ({ args }) => {\n const webhookId = parsePositionalId(\"webhook ID\", args.id);\n if (Result.isFailure(webhookId)) return webhookId;\n\n return runWithContext(args, (ctx) =>\n webhookDeleteHandler(ctx, {\n webhookId: webhookId.value,\n yes: args.yes === true,\n }),\n );\n },\n});\n"],"mappings":";;;;;;;;AAcA,eAAsB,qBACpB,KACA,SACmE;CACnE,MAAM,YAAY,MAAM,gBACtB,WAAW,QAAQ,aACnB,QAAQ,GACV;CACA,IAAI,OAAO,UAAU,SAAS,GAAG,OAAO;CAExC,MAAM,UAAU,SACd,MAAM,IAAI,OAAO,OAAO,gDAAgD,EACtE,QAAQ,EACN,MAAM;EAAE,aAAa,IAAI;EAAa,WAAW,QAAQ;CAAU,EACrE,EACF,CAAC,CACH;CACA,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO,gBAAgB,QAAQ,KAAK;CAEnE,OAAO,OAAO,QAAQ;EACpB,MAAM;GAAE,SAAS;GAAM,IAAI,QAAQ;EAAU;EAC7C,YAAY,mBAAmB,QAAQ,UAAU;CACnD,CAAC;AACH;AAEA,MAAM,aAAa;CACjB,GAAG;CACH,IAAI;EACF,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,KAAK;EACH,MAAM;EACN,aAAa;EACb,SAAS;CACX;AACF;AAEA,qBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,KAAK,OAAO,EAAE,WAAW;EACvB,MAAM,YAAY,kBAAkB,cAAc,KAAK,EAAE;EACzD,IAAI,OAAO,UAAU,SAAS,GAAG,OAAO;EAExC,OAAO,eAAe,OAAO,QAC3B,qBAAqB,KAAK;GACxB,WAAW,UAAU;GACrB,KAAK,KAAK,QAAQ;EACpB,CAAC,CACH;CACF;AACF,CAAC"}
@@ -0,0 +1,16 @@
1
+
2
+ //#region src/cli/ui/detail.ts
3
+ function renderDetail(entries) {
4
+ if (entries.length === 0) return "";
5
+ const width = Math.max(...entries.map(([label]) => label.length));
6
+ return entries.map(([label, value]) => `${label.padEnd(width)} ${value}`).join("\n");
7
+ }
8
+
9
+ //#endregion
10
+ Object.defineProperty(exports, 'renderDetail', {
11
+ enumerable: true,
12
+ get: function () {
13
+ return renderDetail;
14
+ }
15
+ });
16
+ //# sourceMappingURL=detail-8CXNIhKw.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detail-8CXNIhKw.cjs","names":[],"sources":["../src/cli/ui/detail.ts"],"sourcesContent":["// get 系コマンドの単一リソース表示。ラベル幅を揃えた key/value の縦並び。\nexport function renderDetail(\n entries: [label: string, value: string][],\n): string {\n if (entries.length === 0) return \"\";\n const width = Math.max(...entries.map(([label]) => label.length));\n return entries\n .map(([label, value]) => `${label.padEnd(width)} ${value}`)\n .join(\"\\n\");\n}\n"],"mappings":";;AACA,SAAgB,aACd,SACQ;CACR,IAAI,QAAQ,WAAW,GAAG,OAAO;CACjC,MAAM,QAAQ,KAAK,IAAI,GAAG,QAAQ,KAAK,CAAC,WAAW,MAAM,MAAM,CAAC;CAChE,OAAO,QACJ,KAAK,CAAC,OAAO,WAAW,GAAG,MAAM,OAAO,KAAK,EAAE,IAAI,OAAO,CAAC,CAC3D,KAAK,IAAI;AACd"}
@@ -0,0 +1,10 @@
1
+ //#region src/cli/ui/detail.ts
2
+ function renderDetail(entries) {
3
+ if (entries.length === 0) return "";
4
+ const width = Math.max(...entries.map(([label]) => label.length));
5
+ return entries.map(([label, value]) => `${label.padEnd(width)} ${value}`).join("\n");
6
+ }
7
+
8
+ //#endregion
9
+ export { renderDetail as t };
10
+ //# sourceMappingURL=detail-DN5jCQ4N.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detail-DN5jCQ4N.mjs","names":[],"sources":["../src/cli/ui/detail.ts"],"sourcesContent":["// get 系コマンドの単一リソース表示。ラベル幅を揃えた key/value の縦並び。\nexport function renderDetail(\n entries: [label: string, value: string][],\n): string {\n if (entries.length === 0) return \"\";\n const width = Math.max(...entries.map(([label]) => label.length));\n return entries\n .map(([label, value]) => `${label.padEnd(width)} ${value}`)\n .join(\"\\n\");\n}\n"],"mappings":";AACA,SAAgB,aACd,SACQ;CACR,IAAI,QAAQ,WAAW,GAAG,OAAO;CACjC,MAAM,QAAQ,KAAK,IAAI,GAAG,QAAQ,KAAK,CAAC,WAAW,MAAM,MAAM,CAAC;CAChE,OAAO,QACJ,KAAK,CAAC,OAAO,WAAW,GAAG,MAAM,OAAO,KAAK,EAAE,IAAI,OAAO,CAAC,CAC3D,KAAK,IAAI;AACd"}
@@ -0,0 +1,68 @@
1
+ import { t as defineCommand } from "./cli/main.mjs";
2
+ import { r as contextArgs } from "./shared-CZZimGxc.mjs";
3
+ import { a as apiErrorFailure, n as runWithContext, u as toResult } from "./run-with-context-CVhmzAFZ.mjs";
4
+ import { Result } from "@praha/byethrow";
5
+ import { writeFile } from "node:fs/promises";
6
+
7
+ //#region src/cli/commands/bucket/object/download.ts
8
+ async function bucketObjectDownloadHandler(ctx, options) {
9
+ const output = options.output;
10
+ if (options.jsonMode && output === void 0) return Result.fail({ message: "--json requires --output for binary downloads." });
11
+ if (output === void 0 && options.stdoutIsTTY) return Result.fail({ message: "Refusing to write binary output to a terminal. Pass --output <file>, or pipe/redirect stdout." });
12
+ const object = toResult(await ctx.client.GET("/projects/{projectName}/buckets/{bucketName}/objects/{objectKey}", { params: { path: {
13
+ projectName: ctx.projectName,
14
+ bucketName: options.bucket,
15
+ objectKey: options.key
16
+ } } }));
17
+ if (Result.isFailure(object)) return apiErrorFailure(object.error);
18
+ const response = await globalThis.fetch(object.value.protectedUrl);
19
+ if (!response.ok) throw new Error(`Failed to download object ${options.key}: HTTP ${response.status}`);
20
+ const bytes = new Uint8Array(await response.arrayBuffer());
21
+ if (output !== void 0) {
22
+ await writeFile(output, bytes);
23
+ return Result.succeed({
24
+ json: {
25
+ ...object.value,
26
+ savedTo: output
27
+ },
28
+ text: () => `Downloaded ${options.key} (${bytes.byteLength} bytes) to ${output}.`
29
+ });
30
+ }
31
+ process.stdout.write(bytes);
32
+ return Result.succeed(void 0);
33
+ }
34
+ const downloadArgs = {
35
+ ...contextArgs,
36
+ bucket: {
37
+ type: "positional",
38
+ required: true,
39
+ description: "Bucket name"
40
+ },
41
+ key: {
42
+ type: "positional",
43
+ required: true,
44
+ description: "Object key"
45
+ },
46
+ output: {
47
+ type: "string",
48
+ description: "Output file path (writes bytes to stdout when omitted)"
49
+ }
50
+ };
51
+ var download_default = defineCommand({
52
+ meta: {
53
+ name: "download",
54
+ description: "Download a bucket object"
55
+ },
56
+ args: downloadArgs,
57
+ run: ({ args }) => runWithContext(args, (ctx) => bucketObjectDownloadHandler(ctx, {
58
+ bucket: args.bucket,
59
+ key: args.key,
60
+ output: typeof args.output === "string" ? args.output : void 0,
61
+ jsonMode: args.json === true,
62
+ stdoutIsTTY: process.stdout.isTTY === true
63
+ }))
64
+ });
65
+
66
+ //#endregion
67
+ export { download_default as default };
68
+ //# sourceMappingURL=download-oFGzg30E.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download-oFGzg30E.mjs","names":[],"sources":["../src/cli/commands/bucket/object/download.ts"],"sourcesContent":["import { writeFile } from \"node:fs/promises\";\nimport type { ArgsDef } from \"citty\";\nimport { Result } from \"@praha/byethrow\";\nimport {\n defineCommand,\n type CommandFailure,\n type CommandOutput,\n} from \"../../define-command.js\";\nimport { contextArgs } from \"../../shared.js\";\nimport { runWithContext, type CommandContext } from \"../../run-with-context.js\";\nimport { apiErrorFailure } from \"../../api-errors.js\";\nimport { toResult } from \"../../../api/errors.js\";\n\nexport async function bucketObjectDownloadHandler(\n ctx: CommandContext,\n options: {\n bucket: string;\n key: string;\n output?: string;\n jsonMode: boolean;\n stdoutIsTTY: boolean;\n },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const output = options.output;\n // --output なしのバイナリ stdout と --json の JSON stdout は両立しない\n if (options.jsonMode && output === undefined) {\n return Result.fail({\n message: \"--json requires --output for binary downloads.\",\n });\n }\n // 生バイナリを対話端末に書くと制御シーケンスで端末が壊れ、信用できない内容なら攻撃面にもなる。\n if (output === undefined && options.stdoutIsTTY) {\n return Result.fail({\n message:\n \"Refusing to write binary output to a terminal. Pass --output <file>, or pipe/redirect stdout.\",\n });\n }\n\n const object = toResult(\n await ctx.client.GET(\n \"/projects/{projectName}/buckets/{bucketName}/objects/{objectKey}\",\n {\n params: {\n path: {\n projectName: ctx.projectName,\n bucketName: options.bucket,\n objectKey: options.key,\n },\n },\n },\n ),\n );\n if (Result.isFailure(object)) return apiErrorFailure(object.error);\n\n // protectedUrl は署名クエリで認可されるため、認証ヘッダを付けず素の fetch で取得する\n const response = await globalThis.fetch(object.value.protectedUrl);\n if (!response.ok) {\n throw new Error(\n `Failed to download object ${options.key}: HTTP ${response.status}`,\n );\n }\n const bytes = new Uint8Array(await response.arrayBuffer());\n\n if (output !== undefined) {\n await writeFile(output, bytes);\n return Result.succeed({\n json: { ...object.value, savedTo: output },\n text: () =>\n `Downloaded ${options.key} (${bytes.byteLength} bytes) to ${output}.`,\n });\n }\n\n // バイナリは writeOutput(文字列前提の共通出口)を通すと壊れるため、ここだけ直接 stdout に書く\n process.stdout.write(bytes);\n return Result.succeed(undefined);\n}\n\nconst downloadArgs = {\n ...contextArgs,\n bucket: {\n type: \"positional\",\n required: true,\n description: \"Bucket name\",\n },\n key: {\n type: \"positional\",\n required: true,\n description: \"Object key\",\n },\n output: {\n type: \"string\",\n description: \"Output file path (writes bytes to stdout when omitted)\",\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"download\",\n description: \"Download a bucket object\",\n },\n args: downloadArgs,\n run: ({ args }) =>\n runWithContext(args, (ctx) =>\n bucketObjectDownloadHandler(ctx, {\n bucket: args.bucket,\n key: args.key,\n output: typeof args.output === \"string\" ? args.output : undefined,\n jsonMode: args.json === true,\n stdoutIsTTY: process.stdout.isTTY === true,\n }),\n ),\n});\n"],"mappings":";;;;;;;AAaA,eAAsB,4BACpB,KACA,SAOmE;CACnE,MAAM,SAAS,QAAQ;CAEvB,IAAI,QAAQ,YAAY,WAAW,QACjC,OAAO,OAAO,KAAK,EACjB,SAAS,iDACX,CAAC;CAGH,IAAI,WAAW,UAAa,QAAQ,aAClC,OAAO,OAAO,KAAK,EACjB,SACE,gGACJ,CAAC;CAGH,MAAM,SAAS,SACb,MAAM,IAAI,OAAO,IACf,oEACA,EACE,QAAQ,EACN,MAAM;EACJ,aAAa,IAAI;EACjB,YAAY,QAAQ;EACpB,WAAW,QAAQ;CACrB,EACF,EACF,CACF,CACF;CACA,IAAI,OAAO,UAAU,MAAM,GAAG,OAAO,gBAAgB,OAAO,KAAK;CAGjE,MAAM,WAAW,MAAM,WAAW,MAAM,OAAO,MAAM,YAAY;CACjE,IAAI,CAAC,SAAS,IACZ,MAAM,IAAI,MACR,6BAA6B,QAAQ,IAAI,SAAS,SAAS,QAC7D;CAEF,MAAM,QAAQ,IAAI,WAAW,MAAM,SAAS,YAAY,CAAC;CAEzD,IAAI,WAAW,QAAW;EACxB,MAAM,UAAU,QAAQ,KAAK;EAC7B,OAAO,OAAO,QAAQ;GACpB,MAAM;IAAE,GAAG,OAAO;IAAO,SAAS;GAAO;GACzC,YACE,cAAc,QAAQ,IAAI,IAAI,MAAM,WAAW,aAAa,OAAO;EACvE,CAAC;CACH;CAGA,QAAQ,OAAO,MAAM,KAAK;CAC1B,OAAO,OAAO,QAAQ,MAAS;AACjC;AAEA,MAAM,eAAe;CACnB,GAAG;CACH,QAAQ;EACN,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,KAAK;EACH,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,QAAQ;EACN,MAAM;EACN,aAAa;CACf;AACF;AAEA,uBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,MAAM,EAAE,WACN,eAAe,OAAO,QACpB,4BAA4B,KAAK;EAC/B,QAAQ,KAAK;EACb,KAAK,KAAK;EACV,QAAQ,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS;EACxD,UAAU,KAAK,SAAS;EACxB,aAAa,QAAQ,OAAO,UAAU;CACxC,CAAC,CACH;AACJ,CAAC"}
@@ -0,0 +1,68 @@
1
+ const require_cli_main = require('./cli/main.cjs');
2
+ const require_shared = require('./shared-DHRPzzKl.cjs');
3
+ const require_run_with_context = require('./run-with-context-DJNnEigg.cjs');
4
+ let _praha_byethrow = require("@praha/byethrow");
5
+ let node_fs_promises = require("node:fs/promises");
6
+
7
+ //#region src/cli/commands/bucket/object/download.ts
8
+ async function bucketObjectDownloadHandler(ctx, options) {
9
+ const output = options.output;
10
+ if (options.jsonMode && output === void 0) return _praha_byethrow.Result.fail({ message: "--json requires --output for binary downloads." });
11
+ if (output === void 0 && options.stdoutIsTTY) return _praha_byethrow.Result.fail({ message: "Refusing to write binary output to a terminal. Pass --output <file>, or pipe/redirect stdout." });
12
+ const object = require_run_with_context.toResult(await ctx.client.GET("/projects/{projectName}/buckets/{bucketName}/objects/{objectKey}", { params: { path: {
13
+ projectName: ctx.projectName,
14
+ bucketName: options.bucket,
15
+ objectKey: options.key
16
+ } } }));
17
+ if (_praha_byethrow.Result.isFailure(object)) return require_run_with_context.apiErrorFailure(object.error);
18
+ const response = await globalThis.fetch(object.value.protectedUrl);
19
+ if (!response.ok) throw new Error(`Failed to download object ${options.key}: HTTP ${response.status}`);
20
+ const bytes = new Uint8Array(await response.arrayBuffer());
21
+ if (output !== void 0) {
22
+ await (0, node_fs_promises.writeFile)(output, bytes);
23
+ return _praha_byethrow.Result.succeed({
24
+ json: {
25
+ ...object.value,
26
+ savedTo: output
27
+ },
28
+ text: () => `Downloaded ${options.key} (${bytes.byteLength} bytes) to ${output}.`
29
+ });
30
+ }
31
+ process.stdout.write(bytes);
32
+ return _praha_byethrow.Result.succeed(void 0);
33
+ }
34
+ const downloadArgs = {
35
+ ...require_shared.contextArgs,
36
+ bucket: {
37
+ type: "positional",
38
+ required: true,
39
+ description: "Bucket name"
40
+ },
41
+ key: {
42
+ type: "positional",
43
+ required: true,
44
+ description: "Object key"
45
+ },
46
+ output: {
47
+ type: "string",
48
+ description: "Output file path (writes bytes to stdout when omitted)"
49
+ }
50
+ };
51
+ var download_default = require_cli_main.defineCommand({
52
+ meta: {
53
+ name: "download",
54
+ description: "Download a bucket object"
55
+ },
56
+ args: downloadArgs,
57
+ run: ({ args }) => require_run_with_context.runWithContext(args, (ctx) => bucketObjectDownloadHandler(ctx, {
58
+ bucket: args.bucket,
59
+ key: args.key,
60
+ output: typeof args.output === "string" ? args.output : void 0,
61
+ jsonMode: args.json === true,
62
+ stdoutIsTTY: process.stdout.isTTY === true
63
+ }))
64
+ });
65
+
66
+ //#endregion
67
+ exports.default = download_default;
68
+ //# sourceMappingURL=download-ogGbb3FU.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download-ogGbb3FU.cjs","names":["Result","toResult","apiErrorFailure","contextArgs","defineCommand","runWithContext"],"sources":["../src/cli/commands/bucket/object/download.ts"],"sourcesContent":["import { writeFile } from \"node:fs/promises\";\nimport type { ArgsDef } from \"citty\";\nimport { Result } from \"@praha/byethrow\";\nimport {\n defineCommand,\n type CommandFailure,\n type CommandOutput,\n} from \"../../define-command.js\";\nimport { contextArgs } from \"../../shared.js\";\nimport { runWithContext, type CommandContext } from \"../../run-with-context.js\";\nimport { apiErrorFailure } from \"../../api-errors.js\";\nimport { toResult } from \"../../../api/errors.js\";\n\nexport async function bucketObjectDownloadHandler(\n ctx: CommandContext,\n options: {\n bucket: string;\n key: string;\n output?: string;\n jsonMode: boolean;\n stdoutIsTTY: boolean;\n },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const output = options.output;\n // --output なしのバイナリ stdout と --json の JSON stdout は両立しない\n if (options.jsonMode && output === undefined) {\n return Result.fail({\n message: \"--json requires --output for binary downloads.\",\n });\n }\n // 生バイナリを対話端末に書くと制御シーケンスで端末が壊れ、信用できない内容なら攻撃面にもなる。\n if (output === undefined && options.stdoutIsTTY) {\n return Result.fail({\n message:\n \"Refusing to write binary output to a terminal. Pass --output <file>, or pipe/redirect stdout.\",\n });\n }\n\n const object = toResult(\n await ctx.client.GET(\n \"/projects/{projectName}/buckets/{bucketName}/objects/{objectKey}\",\n {\n params: {\n path: {\n projectName: ctx.projectName,\n bucketName: options.bucket,\n objectKey: options.key,\n },\n },\n },\n ),\n );\n if (Result.isFailure(object)) return apiErrorFailure(object.error);\n\n // protectedUrl は署名クエリで認可されるため、認証ヘッダを付けず素の fetch で取得する\n const response = await globalThis.fetch(object.value.protectedUrl);\n if (!response.ok) {\n throw new Error(\n `Failed to download object ${options.key}: HTTP ${response.status}`,\n );\n }\n const bytes = new Uint8Array(await response.arrayBuffer());\n\n if (output !== undefined) {\n await writeFile(output, bytes);\n return Result.succeed({\n json: { ...object.value, savedTo: output },\n text: () =>\n `Downloaded ${options.key} (${bytes.byteLength} bytes) to ${output}.`,\n });\n }\n\n // バイナリは writeOutput(文字列前提の共通出口)を通すと壊れるため、ここだけ直接 stdout に書く\n process.stdout.write(bytes);\n return Result.succeed(undefined);\n}\n\nconst downloadArgs = {\n ...contextArgs,\n bucket: {\n type: \"positional\",\n required: true,\n description: \"Bucket name\",\n },\n key: {\n type: \"positional\",\n required: true,\n description: \"Object key\",\n },\n output: {\n type: \"string\",\n description: \"Output file path (writes bytes to stdout when omitted)\",\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"download\",\n description: \"Download a bucket object\",\n },\n args: downloadArgs,\n run: ({ args }) =>\n runWithContext(args, (ctx) =>\n bucketObjectDownloadHandler(ctx, {\n bucket: args.bucket,\n key: args.key,\n output: typeof args.output === \"string\" ? args.output : undefined,\n jsonMode: args.json === true,\n stdoutIsTTY: process.stdout.isTTY === true,\n }),\n ),\n});\n"],"mappings":";;;;;;;AAaA,eAAsB,4BACpB,KACA,SAOmE;CACnE,MAAM,SAAS,QAAQ;CAEvB,IAAI,QAAQ,YAAY,WAAW,QACjC,OAAOA,uBAAO,KAAK,EACjB,SAAS,iDACX,CAAC;CAGH,IAAI,WAAW,UAAa,QAAQ,aAClC,OAAOA,uBAAO,KAAK,EACjB,SACE,gGACJ,CAAC;CAGH,MAAM,SAASC,kCACb,MAAM,IAAI,OAAO,IACf,oEACA,EACE,QAAQ,EACN,MAAM;EACJ,aAAa,IAAI;EACjB,YAAY,QAAQ;EACpB,WAAW,QAAQ;CACrB,EACF,EACF,CACF,CACF;CACA,IAAID,uBAAO,UAAU,MAAM,GAAG,OAAOE,yCAAgB,OAAO,KAAK;CAGjE,MAAM,WAAW,MAAM,WAAW,MAAM,OAAO,MAAM,YAAY;CACjE,IAAI,CAAC,SAAS,IACZ,MAAM,IAAI,MACR,6BAA6B,QAAQ,IAAI,SAAS,SAAS,QAC7D;CAEF,MAAM,QAAQ,IAAI,WAAW,MAAM,SAAS,YAAY,CAAC;CAEzD,IAAI,WAAW,QAAW;EACxB,sCAAgB,QAAQ,KAAK;EAC7B,OAAOF,uBAAO,QAAQ;GACpB,MAAM;IAAE,GAAG,OAAO;IAAO,SAAS;GAAO;GACzC,YACE,cAAc,QAAQ,IAAI,IAAI,MAAM,WAAW,aAAa,OAAO;EACvE,CAAC;CACH;CAGA,QAAQ,OAAO,MAAM,KAAK;CAC1B,OAAOA,uBAAO,QAAQ,MAAS;AACjC;AAEA,MAAM,eAAe;CACnB,GAAGG;CACH,QAAQ;EACN,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,KAAK;EACH,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,QAAQ;EACN,MAAM;EACN,aAAa;CACf;AACF;AAEA,uBAAeC,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,MAAM,EAAE,WACNC,wCAAe,OAAO,QACpB,4BAA4B,KAAK;EAC/B,QAAQ,KAAK;EACb,KAAK,KAAK;EACV,QAAQ,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS;EACxD,UAAU,KAAK,SAAS;EACxB,aAAa,QAAQ,OAAO,UAAU;CACxC,CAAC,CACH;AACJ,CAAC"}
@@ -0,0 +1,124 @@
1
+ const require_cli_main = require('./cli/main.cjs');
2
+ const require_shared = require('./shared-DHRPzzKl.cjs');
3
+ const require_config_loader = require('./config-loader-D8x32gEU.cjs');
4
+ let _praha_byethrow = require("@praha/byethrow");
5
+ let node_fs_promises = require("node:fs/promises");
6
+ let node_path = require("node:path");
7
+ node_path = require_cli_main.__toESM(node_path, 1);
8
+
9
+ //#region src/cli/erd.ts
10
+ const RELATION = {
11
+ ONE_TO_MANY: "||--o{",
12
+ ONE_TO_ONE: "||--||"
13
+ };
14
+ function convertToInput(config) {
15
+ const tables = [];
16
+ const relations = [];
17
+ for (const table of config.tables) {
18
+ const modules = [];
19
+ const erdTable = {
20
+ name: table.name,
21
+ columns: []
22
+ };
23
+ for (const column of table.columns) {
24
+ erdTable.columns.push({
25
+ name: column.name,
26
+ type: column.type,
27
+ isForeignKey: column.type === "reference"
28
+ });
29
+ if (column.type === "reference") relations.push({
30
+ from: column.tableName,
31
+ to: table.name,
32
+ type: RELATION.ONE_TO_MANY,
33
+ comment: "reference"
34
+ });
35
+ if (column.type === "module" || column.type === "module-array") {
36
+ const module = config.tableModules.find((m) => m.name === column.moduleName);
37
+ if (!module) continue;
38
+ const moduleTableName = `${table.name}_${column.name}_${column.moduleName}`;
39
+ modules.push({
40
+ name: moduleTableName,
41
+ columns: module.columns.map((c) => ({
42
+ name: c.name,
43
+ type: c.type,
44
+ isForeignKey: c.type === "reference"
45
+ }))
46
+ });
47
+ relations.push({
48
+ from: table.name,
49
+ to: moduleTableName,
50
+ type: column.type === "module" ? RELATION.ONE_TO_ONE : RELATION.ONE_TO_MANY,
51
+ comment: column.type === "module" ? "module" : "module-array"
52
+ });
53
+ for (const moduleColumn of module.columns) if (moduleColumn.type === "reference") relations.push({
54
+ from: moduleTableName,
55
+ to: moduleColumn.tableName,
56
+ type: RELATION.ONE_TO_MANY,
57
+ comment: "reference"
58
+ });
59
+ }
60
+ }
61
+ tables.push(erdTable);
62
+ tables.push(...modules);
63
+ }
64
+ return {
65
+ tables,
66
+ relations
67
+ };
68
+ }
69
+ function renderMermaid(input) {
70
+ return `generated by @orizm/cli
71
+
72
+ \`\`\`mermaid
73
+ erDiagram
74
+ ${input.tables.map((table) => {
75
+ const columns = [" id string PK", ...table.columns.map((col) => ` ${col.name} ${col.type}${col.isForeignKey ? " FK" : ""}`)].join("\n");
76
+ return ` ${table.name} {\n${columns}\n }`;
77
+ }).join("\n")}
78
+
79
+ ${input.relations.map((rel) => ` ${rel.from} ${rel.type} ${rel.to} : ${rel.comment}`).join("\n")}
80
+ \`\`\``;
81
+ }
82
+ function generateErd(config) {
83
+ return renderMermaid(convertToInput(config));
84
+ }
85
+
86
+ //#endregion
87
+ //#region src/cli/commands/schema/erd.ts
88
+ var erd_default = require_cli_main.defineCommand({
89
+ meta: {
90
+ name: "erd",
91
+ description: "Generate an ERD in Mermaid format from orizm.config.ts"
92
+ },
93
+ args: {
94
+ ...require_shared.globalArgs,
95
+ "config-file": require_shared.configFileArg,
96
+ output: {
97
+ type: "string",
98
+ alias: "o",
99
+ description: "Output file path (defaults to stdout)"
100
+ }
101
+ },
102
+ run: async ({ args }) => {
103
+ const loaded = await require_config_loader.loadConfig(args["config-file"] ?? "orizm.config.ts");
104
+ if (_praha_byethrow.Result.isFailure(loaded)) return require_config_loader.configLoadFailure(loaded.error);
105
+ const mermaid = generateErd(loaded.value);
106
+ if (args.output != null && args.output !== "") {
107
+ const output = args.output;
108
+ await (0, node_fs_promises.mkdir)(node_path.default.dirname(output), { recursive: true });
109
+ await (0, node_fs_promises.writeFile)(output, mermaid + "\n", "utf-8");
110
+ return _praha_byethrow.Result.succeed({
111
+ json: { output },
112
+ text: () => `ERD written to ${output}`
113
+ });
114
+ }
115
+ return _praha_byethrow.Result.succeed({
116
+ json: { erd: mermaid },
117
+ text: () => mermaid
118
+ });
119
+ }
120
+ });
121
+
122
+ //#endregion
123
+ exports.default = erd_default;
124
+ //# sourceMappingURL=erd-lKC5NB2l.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"erd-lKC5NB2l.cjs","names":["defineCommand","globalArgs","configFileArg","loadConfig","Result","configLoadFailure","path"],"sources":["../src/cli/erd.ts","../src/cli/commands/schema/erd.ts"],"sourcesContent":["import { CommonOrizmConfig } from \"./types.js\";\n\ntype TableInput = {\n name: string;\n columns: ColumnInput[];\n};\n\ntype ColumnInput = {\n name: string;\n type: string;\n isForeignKey: boolean;\n};\n\ntype RelationInput = {\n from: string;\n to: string;\n type: string;\n comment: string;\n};\n\ntype TemplateInput = {\n tables: TableInput[];\n relations: RelationInput[];\n};\n\nconst RELATION = {\n ONE_TO_MANY: \"||--o{\",\n ONE_TO_ONE: \"||--||\",\n} as const;\n\nfunction convertToInput(config: CommonOrizmConfig): TemplateInput {\n const tables: TableInput[] = [];\n const relations: RelationInput[] = [];\n\n for (const table of config.tables) {\n const modules: TableInput[] = [];\n const erdTable: TableInput = { name: table.name, columns: [] };\n\n for (const column of table.columns) {\n erdTable.columns.push({\n name: column.name,\n type: column.type,\n isForeignKey: column.type === \"reference\",\n });\n\n if (column.type === \"reference\") {\n relations.push({\n from: column.tableName,\n to: table.name,\n type: RELATION.ONE_TO_MANY,\n comment: \"reference\",\n });\n }\n\n if (column.type === \"module\" || column.type === \"module-array\") {\n const module = config.tableModules.find(\n (m) => m.name === column.moduleName,\n );\n if (!module) {\n continue;\n }\n\n const moduleTableName = `${table.name}_${column.name}_${column.moduleName}`;\n modules.push({\n name: moduleTableName,\n columns: module.columns.map((c) => ({\n name: c.name,\n type: c.type,\n isForeignKey: c.type === \"reference\",\n })),\n });\n\n relations.push({\n from: table.name,\n to: moduleTableName,\n type:\n column.type === \"module\"\n ? RELATION.ONE_TO_ONE\n : RELATION.ONE_TO_MANY,\n comment: column.type === \"module\" ? \"module\" : \"module-array\",\n });\n\n for (const moduleColumn of module.columns) {\n if (moduleColumn.type === \"reference\") {\n relations.push({\n from: moduleTableName,\n to: moduleColumn.tableName,\n type: RELATION.ONE_TO_MANY,\n comment: \"reference\",\n });\n }\n }\n }\n }\n\n tables.push(erdTable);\n tables.push(...modules);\n }\n\n return { tables, relations };\n}\n\nfunction renderMermaid(input: TemplateInput): string {\n const tables = input.tables\n .map((table) => {\n const columns = [\n \" id string PK\",\n ...table.columns.map(\n (col) =>\n ` ${col.name} ${col.type}${col.isForeignKey ? \" FK\" : \"\"}`,\n ),\n ].join(\"\\n\");\n return ` ${table.name} {\\n${columns}\\n }`;\n })\n .join(\"\\n\");\n\n const relations = input.relations\n .map((rel) => ` ${rel.from} ${rel.type} ${rel.to} : ${rel.comment}`)\n .join(\"\\n\");\n\n return `generated by @orizm/cli\n\n\\`\\`\\`mermaid\nerDiagram\n${tables}\n\n${relations}\n\\`\\`\\``;\n}\n\nexport function generateErd(config: CommonOrizmConfig): string {\n return renderMermaid(convertToInput(config));\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Result } from \"@praha/byethrow\";\nimport { defineCommand } from \"../define-command.js\";\nimport { globalArgs, configFileArg, DEFAULT_CONFIG_FILE } from \"../shared.js\";\nimport { configLoadFailure } from \"../config-errors.js\";\nimport { loadConfig } from \"../../config-loader.js\";\nimport { generateErd } from \"../../erd.js\";\n\nexport default defineCommand({\n meta: {\n name: \"erd\",\n description: \"Generate an ERD in Mermaid format from orizm.config.ts\",\n },\n args: {\n ...globalArgs,\n \"config-file\": configFileArg,\n output: {\n type: \"string\",\n alias: \"o\",\n description: \"Output file path (defaults to stdout)\",\n },\n },\n run: async ({ args }) => {\n const loaded = await loadConfig(args[\"config-file\"] ?? DEFAULT_CONFIG_FILE);\n if (Result.isFailure(loaded)) return configLoadFailure(loaded.error);\n\n const mermaid = generateErd(loaded.value);\n\n if (args.output != null && args.output !== \"\") {\n const output = args.output;\n await mkdir(path.dirname(output), { recursive: true });\n await writeFile(output, mermaid + \"\\n\", \"utf-8\");\n return Result.succeed({\n json: { output },\n text: () => `ERD written to ${output}`,\n });\n }\n\n return Result.succeed({ json: { erd: mermaid }, text: () => mermaid });\n },\n});\n"],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ import { t as defineCommand } from "./cli/main.mjs";
2
+ import { i as globalArgs, n as configFileArg, t as DEFAULT_CONFIG_FILE } from "./shared-CZZimGxc.mjs";
3
+ import { n as configLoadFailure, t as loadConfig } from "./config-loader-BEgS869e.mjs";
4
+ import { Result } from "@praha/byethrow";
5
+ import { mkdir, writeFile } from "node:fs/promises";
6
+ import path from "node:path";
7
+
8
+ //#region src/cli/erd.ts
9
+ const RELATION = {
10
+ ONE_TO_MANY: "||--o{",
11
+ ONE_TO_ONE: "||--||"
12
+ };
13
+ function convertToInput(config) {
14
+ const tables = [];
15
+ const relations = [];
16
+ for (const table of config.tables) {
17
+ const modules = [];
18
+ const erdTable = {
19
+ name: table.name,
20
+ columns: []
21
+ };
22
+ for (const column of table.columns) {
23
+ erdTable.columns.push({
24
+ name: column.name,
25
+ type: column.type,
26
+ isForeignKey: column.type === "reference"
27
+ });
28
+ if (column.type === "reference") relations.push({
29
+ from: column.tableName,
30
+ to: table.name,
31
+ type: RELATION.ONE_TO_MANY,
32
+ comment: "reference"
33
+ });
34
+ if (column.type === "module" || column.type === "module-array") {
35
+ const module = config.tableModules.find((m) => m.name === column.moduleName);
36
+ if (!module) continue;
37
+ const moduleTableName = `${table.name}_${column.name}_${column.moduleName}`;
38
+ modules.push({
39
+ name: moduleTableName,
40
+ columns: module.columns.map((c) => ({
41
+ name: c.name,
42
+ type: c.type,
43
+ isForeignKey: c.type === "reference"
44
+ }))
45
+ });
46
+ relations.push({
47
+ from: table.name,
48
+ to: moduleTableName,
49
+ type: column.type === "module" ? RELATION.ONE_TO_ONE : RELATION.ONE_TO_MANY,
50
+ comment: column.type === "module" ? "module" : "module-array"
51
+ });
52
+ for (const moduleColumn of module.columns) if (moduleColumn.type === "reference") relations.push({
53
+ from: moduleTableName,
54
+ to: moduleColumn.tableName,
55
+ type: RELATION.ONE_TO_MANY,
56
+ comment: "reference"
57
+ });
58
+ }
59
+ }
60
+ tables.push(erdTable);
61
+ tables.push(...modules);
62
+ }
63
+ return {
64
+ tables,
65
+ relations
66
+ };
67
+ }
68
+ function renderMermaid(input) {
69
+ return `generated by @orizm/cli
70
+
71
+ \`\`\`mermaid
72
+ erDiagram
73
+ ${input.tables.map((table) => {
74
+ const columns = [" id string PK", ...table.columns.map((col) => ` ${col.name} ${col.type}${col.isForeignKey ? " FK" : ""}`)].join("\n");
75
+ return ` ${table.name} {\n${columns}\n }`;
76
+ }).join("\n")}
77
+
78
+ ${input.relations.map((rel) => ` ${rel.from} ${rel.type} ${rel.to} : ${rel.comment}`).join("\n")}
79
+ \`\`\``;
80
+ }
81
+ function generateErd(config) {
82
+ return renderMermaid(convertToInput(config));
83
+ }
84
+
85
+ //#endregion
86
+ //#region src/cli/commands/schema/erd.ts
87
+ var erd_default = defineCommand({
88
+ meta: {
89
+ name: "erd",
90
+ description: "Generate an ERD in Mermaid format from orizm.config.ts"
91
+ },
92
+ args: {
93
+ ...globalArgs,
94
+ "config-file": configFileArg,
95
+ output: {
96
+ type: "string",
97
+ alias: "o",
98
+ description: "Output file path (defaults to stdout)"
99
+ }
100
+ },
101
+ run: async ({ args }) => {
102
+ const loaded = await loadConfig(args["config-file"] ?? "orizm.config.ts");
103
+ if (Result.isFailure(loaded)) return configLoadFailure(loaded.error);
104
+ const mermaid = generateErd(loaded.value);
105
+ if (args.output != null && args.output !== "") {
106
+ const output = args.output;
107
+ await mkdir(path.dirname(output), { recursive: true });
108
+ await writeFile(output, mermaid + "\n", "utf-8");
109
+ return Result.succeed({
110
+ json: { output },
111
+ text: () => `ERD written to ${output}`
112
+ });
113
+ }
114
+ return Result.succeed({
115
+ json: { erd: mermaid },
116
+ text: () => mermaid
117
+ });
118
+ }
119
+ });
120
+
121
+ //#endregion
122
+ export { erd_default as default };
123
+ //# sourceMappingURL=erd-zDoF6I_y.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"erd-zDoF6I_y.mjs","names":[],"sources":["../src/cli/erd.ts","../src/cli/commands/schema/erd.ts"],"sourcesContent":["import { CommonOrizmConfig } from \"./types.js\";\n\ntype TableInput = {\n name: string;\n columns: ColumnInput[];\n};\n\ntype ColumnInput = {\n name: string;\n type: string;\n isForeignKey: boolean;\n};\n\ntype RelationInput = {\n from: string;\n to: string;\n type: string;\n comment: string;\n};\n\ntype TemplateInput = {\n tables: TableInput[];\n relations: RelationInput[];\n};\n\nconst RELATION = {\n ONE_TO_MANY: \"||--o{\",\n ONE_TO_ONE: \"||--||\",\n} as const;\n\nfunction convertToInput(config: CommonOrizmConfig): TemplateInput {\n const tables: TableInput[] = [];\n const relations: RelationInput[] = [];\n\n for (const table of config.tables) {\n const modules: TableInput[] = [];\n const erdTable: TableInput = { name: table.name, columns: [] };\n\n for (const column of table.columns) {\n erdTable.columns.push({\n name: column.name,\n type: column.type,\n isForeignKey: column.type === \"reference\",\n });\n\n if (column.type === \"reference\") {\n relations.push({\n from: column.tableName,\n to: table.name,\n type: RELATION.ONE_TO_MANY,\n comment: \"reference\",\n });\n }\n\n if (column.type === \"module\" || column.type === \"module-array\") {\n const module = config.tableModules.find(\n (m) => m.name === column.moduleName,\n );\n if (!module) {\n continue;\n }\n\n const moduleTableName = `${table.name}_${column.name}_${column.moduleName}`;\n modules.push({\n name: moduleTableName,\n columns: module.columns.map((c) => ({\n name: c.name,\n type: c.type,\n isForeignKey: c.type === \"reference\",\n })),\n });\n\n relations.push({\n from: table.name,\n to: moduleTableName,\n type:\n column.type === \"module\"\n ? RELATION.ONE_TO_ONE\n : RELATION.ONE_TO_MANY,\n comment: column.type === \"module\" ? \"module\" : \"module-array\",\n });\n\n for (const moduleColumn of module.columns) {\n if (moduleColumn.type === \"reference\") {\n relations.push({\n from: moduleTableName,\n to: moduleColumn.tableName,\n type: RELATION.ONE_TO_MANY,\n comment: \"reference\",\n });\n }\n }\n }\n }\n\n tables.push(erdTable);\n tables.push(...modules);\n }\n\n return { tables, relations };\n}\n\nfunction renderMermaid(input: TemplateInput): string {\n const tables = input.tables\n .map((table) => {\n const columns = [\n \" id string PK\",\n ...table.columns.map(\n (col) =>\n ` ${col.name} ${col.type}${col.isForeignKey ? \" FK\" : \"\"}`,\n ),\n ].join(\"\\n\");\n return ` ${table.name} {\\n${columns}\\n }`;\n })\n .join(\"\\n\");\n\n const relations = input.relations\n .map((rel) => ` ${rel.from} ${rel.type} ${rel.to} : ${rel.comment}`)\n .join(\"\\n\");\n\n return `generated by @orizm/cli\n\n\\`\\`\\`mermaid\nerDiagram\n${tables}\n\n${relations}\n\\`\\`\\``;\n}\n\nexport function generateErd(config: CommonOrizmConfig): string {\n return renderMermaid(convertToInput(config));\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Result } from \"@praha/byethrow\";\nimport { defineCommand } from \"../define-command.js\";\nimport { globalArgs, configFileArg, DEFAULT_CONFIG_FILE } from \"../shared.js\";\nimport { configLoadFailure } from \"../config-errors.js\";\nimport { loadConfig } from \"../../config-loader.js\";\nimport { generateErd } from \"../../erd.js\";\n\nexport default defineCommand({\n meta: {\n name: \"erd\",\n description: \"Generate an ERD in Mermaid format from orizm.config.ts\",\n },\n args: {\n ...globalArgs,\n \"config-file\": configFileArg,\n output: {\n type: \"string\",\n alias: \"o\",\n description: \"Output file path (defaults to stdout)\",\n },\n },\n run: async ({ args }) => {\n const loaded = await loadConfig(args[\"config-file\"] ?? DEFAULT_CONFIG_FILE);\n if (Result.isFailure(loaded)) return configLoadFailure(loaded.error);\n\n const mermaid = generateErd(loaded.value);\n\n if (args.output != null && args.output !== \"\") {\n const output = args.output;\n await mkdir(path.dirname(output), { recursive: true });\n await writeFile(output, mermaid + \"\\n\", \"utf-8\");\n return Result.succeed({\n json: { output },\n text: () => `ERD written to ${output}`,\n });\n }\n\n return Result.succeed({ json: { erd: mermaid }, text: () => mermaid });\n },\n});\n"],"mappings":"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"}