@orizm/cli 2.2.6 → 3.0.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 (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-6d3VNt1D.mjs +17 -0
  11. package/dist/bucket-6d3VNt1D.mjs.map +1 -0
  12. package/dist/bucket-DjbHz9_A.cjs +17 -0
  13. package/dist/bucket-DjbHz9_A.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 -27
  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-BBsH8b1j.cjs +18 -0
  44. package/dist/consumer-BBsH8b1j.cjs.map +1 -0
  45. package/dist/consumer-DqyRfpsl.mjs +18 -0
  46. package/dist/consumer-DqyRfpsl.mjs.map +1 -0
  47. package/dist/consumer-OF6Z_eTP.cjs +95 -0
  48. package/dist/consumer-OF6Z_eTP.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-BsoRmjis.mjs +20 -0
  52. package/dist/content-BsoRmjis.mjs.map +1 -0
  53. package/dist/content-Y-2Y0cyn.cjs +20 -0
  54. package/dist/content-Y-2Y0cyn.cjs.map +1 -0
  55. package/dist/create--1NYduI_.cjs +58 -0
  56. package/dist/create--1NYduI_.cjs.map +1 -0
  57. package/dist/create-B-PAOor6.mjs +66 -0
  58. package/dist/create-B-PAOor6.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-B_gsZCL-.cjs +54 -0
  62. package/dist/create-B_gsZCL-.cjs.map +1 -0
  63. package/dist/create-BqlxdhcR.mjs +81 -0
  64. package/dist/create-BqlxdhcR.mjs.map +1 -0
  65. package/dist/create-CC814ixh.mjs +66 -0
  66. package/dist/create-CC814ixh.mjs.map +1 -0
  67. package/dist/create-CkFBiEDH.mjs +58 -0
  68. package/dist/create-CkFBiEDH.mjs.map +1 -0
  69. package/dist/create-CykRHseR.cjs +81 -0
  70. package/dist/create-CykRHseR.cjs.map +1 -0
  71. package/dist/create-RLyp_dl6.mjs +54 -0
  72. package/dist/create-RLyp_dl6.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-BenBNL2p.mjs +56 -0
  82. package/dist/delete-BenBNL2p.mjs.map +1 -0
  83. package/dist/delete-Bx2oNROv.cjs +56 -0
  84. package/dist/delete-Bx2oNROv.cjs.map +1 -0
  85. package/dist/delete-CCTiCYIL.cjs +51 -0
  86. package/dist/delete-CCTiCYIL.cjs.map +1 -0
  87. package/dist/delete-CGW0VMK6.cjs +56 -0
  88. package/dist/delete-CGW0VMK6.cjs.map +1 -0
  89. package/dist/delete-CIYY59v_.cjs +48 -0
  90. package/dist/delete-CIYY59v_.cjs.map +1 -0
  91. package/dist/delete-CSSd0gmt.mjs +56 -0
  92. package/dist/delete-CSSd0gmt.mjs.map +1 -0
  93. package/dist/delete-CSs5Czlo.mjs +59 -0
  94. package/dist/delete-CSs5Czlo.mjs.map +1 -0
  95. package/dist/delete-CrOVRvMo.cjs +56 -0
  96. package/dist/delete-CrOVRvMo.cjs.map +1 -0
  97. package/dist/delete-DehKYCXh.mjs +56 -0
  98. package/dist/delete-DehKYCXh.mjs.map +1 -0
  99. package/dist/delete-DhSU-Lx2.mjs +51 -0
  100. package/dist/delete-DhSU-Lx2.mjs.map +1 -0
  101. package/dist/delete-DozSxZQ7.cjs +59 -0
  102. package/dist/delete-DozSxZQ7.cjs.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-BHniACk5.cjs +57 -0
  118. package/dist/get-BHniACk5.cjs.map +1 -0
  119. package/dist/get-BtmzDaVn.mjs +47 -0
  120. package/dist/get-BtmzDaVn.mjs.map +1 -0
  121. package/dist/get-CVV3h6HR.cjs +47 -0
  122. package/dist/get-CVV3h6HR.cjs.map +1 -0
  123. package/dist/get-CgEgETQa.mjs +52 -0
  124. package/dist/get-CgEgETQa.mjs.map +1 -0
  125. package/dist/get-DB80UNSR.mjs +47 -0
  126. package/dist/get-DB80UNSR.mjs.map +1 -0
  127. package/dist/get-DBxhbN1G.mjs +57 -0
  128. package/dist/get-DBxhbN1G.mjs.map +1 -0
  129. package/dist/get-DDB89cOs.mjs +48 -0
  130. package/dist/get-DDB89cOs.mjs.map +1 -0
  131. package/dist/get-DPGx1zU4.mjs +56 -0
  132. package/dist/get-DPGx1zU4.mjs.map +1 -0
  133. package/dist/get-IOU__2RP.cjs +52 -0
  134. package/dist/get-IOU__2RP.cjs.map +1 -0
  135. package/dist/get-KdWfYINc.cjs +47 -0
  136. package/dist/get-KdWfYINc.cjs.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-BEEzLxPX.mjs +36 -0
  140. package/dist/group-roles-BEEzLxPX.mjs.map +1 -0
  141. package/dist/group-roles-Bl_mEodO.cjs +59 -0
  142. package/dist/group-roles-Bl_mEodO.cjs.map +1 -0
  143. package/dist/invite-DsOCKGTJ.mjs +66 -0
  144. package/dist/invite-DsOCKGTJ.mjs.map +1 -0
  145. package/dist/invite-Dts9uNQL.cjs +66 -0
  146. package/dist/invite-Dts9uNQL.cjs.map +1 -0
  147. package/dist/key-BogfSiz_.mjs +17 -0
  148. package/dist/key-BogfSiz_.mjs.map +1 -0
  149. package/dist/key-Czwiu2pW.cjs +17 -0
  150. package/dist/key-Czwiu2pW.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-2BpPj4Z0.cjs +40 -0
  156. package/dist/list-2BpPj4Z0.cjs.map +1 -0
  157. package/dist/list-57TUfNFd.mjs +48 -0
  158. package/dist/list-57TUfNFd.mjs.map +1 -0
  159. package/dist/list-60NcDr0q.cjs +81 -0
  160. package/dist/list-60NcDr0q.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-BwfpuhmJ.cjs +37 -0
  164. package/dist/list-BwfpuhmJ.cjs.map +1 -0
  165. package/dist/list-CJuefq_I.cjs +82 -0
  166. package/dist/list-CJuefq_I.cjs.map +1 -0
  167. package/dist/list-CYE9Exi3.cjs +72 -0
  168. package/dist/list-CYE9Exi3.cjs.map +1 -0
  169. package/dist/list-CbvEh7eA.mjs +35 -0
  170. package/dist/list-CbvEh7eA.mjs.map +1 -0
  171. package/dist/list-CfIeReBx.mjs +82 -0
  172. package/dist/list-CfIeReBx.mjs.map +1 -0
  173. package/dist/list-CxHDoXjv.mjs +81 -0
  174. package/dist/list-CxHDoXjv.mjs.map +1 -0
  175. package/dist/list-D0-QrWmn.cjs +51 -0
  176. package/dist/list-D0-QrWmn.cjs.map +1 -0
  177. package/dist/list-D24J_Qbm.mjs +49 -0
  178. package/dist/list-D24J_Qbm.mjs.map +1 -0
  179. package/dist/list-D5PSDMWw.mjs +51 -0
  180. package/dist/list-D5PSDMWw.mjs.map +1 -0
  181. package/dist/list-DRKF2uKW.cjs +95 -0
  182. package/dist/list-DRKF2uKW.cjs.map +1 -0
  183. package/dist/list-DdJ05juK.mjs +72 -0
  184. package/dist/list-DdJ05juK.mjs.map +1 -0
  185. package/dist/list-DlJssPwy.cjs +48 -0
  186. package/dist/list-DlJssPwy.cjs.map +1 -0
  187. package/dist/list-V3W6hvOa.cjs +49 -0
  188. package/dist/list-V3W6hvOa.cjs.map +1 -0
  189. package/dist/list-rAn3uOA7.mjs +37 -0
  190. package/dist/list-rAn3uOA7.mjs.map +1 -0
  191. package/dist/list-syVDGkVR.mjs +40 -0
  192. package/dist/list-syVDGkVR.mjs.map +1 -0
  193. package/dist/list-yQZLzkC7.mjs +95 -0
  194. package/dist/list-yQZLzkC7.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-BaN1Nynl.mjs +19 -0
  204. package/dist/management-BaN1Nynl.mjs.map +1 -0
  205. package/dist/management-DHXxdCra.cjs +19 -0
  206. package/dist/management-DHXxdCra.cjs.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-BfUf8Y6w.mjs +20 -0
  216. package/dist/object-BfUf8Y6w.mjs.map +1 -0
  217. package/dist/object-DT7UEW9G.cjs +20 -0
  218. package/dist/object-DT7UEW9G.cjs.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-BeO2IwfI.cjs +229 -0
  228. package/dist/parse-BeO2IwfI.cjs.map +1 -0
  229. package/dist/parse-CA5fBB3x.mjs +150 -0
  230. package/dist/parse-CA5fBB3x.mjs.map +1 -0
  231. package/dist/project-CNr9xMny.cjs +20 -0
  232. package/dist/project-CNr9xMny.cjs.map +1 -0
  233. package/dist/project-DFoHcXi5.mjs +20 -0
  234. package/dist/project-DFoHcXi5.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-9D7Ey_Fu.mjs +20 -0
  240. package/dist/project-user-9D7Ey_Fu.mjs.map +1 -0
  241. package/dist/project-user-DTPFjyfZ.cjs +20 -0
  242. package/dist/project-user-DTPFjyfZ.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-DDzrgjkT.mjs +20 -0
  256. package/dist/schema-DDzrgjkT.mjs.map +1 -0
  257. package/dist/schema-DdhyEh81.cjs +20 -0
  258. package/dist/schema-DdhyEh81.cjs.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-C16cp9nq.mjs +72 -0
  272. package/dist/table-event-C16cp9nq.mjs.map +1 -0
  273. package/dist/table-event-D7PPuS7E.cjs +101 -0
  274. package/dist/table-event-D7PPuS7E.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-8e3u4jKa.mjs +109 -0
  280. package/dist/update-8e3u4jKa.mjs.map +1 -0
  281. package/dist/update-CDLviRuu.cjs +73 -0
  282. package/dist/update-CDLviRuu.cjs.map +1 -0
  283. package/dist/update-CSiOfiPL.mjs +117 -0
  284. package/dist/update-CSiOfiPL.mjs.map +1 -0
  285. package/dist/update-CjbcI8Qc.mjs +61 -0
  286. package/dist/update-CjbcI8Qc.mjs.map +1 -0
  287. package/dist/update-Cktd0zXA.cjs +109 -0
  288. package/dist/update-Cktd0zXA.cjs.map +1 -0
  289. package/dist/update-D-X32BVW.cjs +117 -0
  290. package/dist/update-D-X32BVW.cjs.map +1 -0
  291. package/dist/update-DfYV_TQb.mjs +171 -0
  292. package/dist/update-DfYV_TQb.mjs.map +1 -0
  293. package/dist/update-OWC5K8Ne.cjs +61 -0
  294. package/dist/update-OWC5K8Ne.cjs.map +1 -0
  295. package/dist/update-ap5Qv1Yl.cjs +171 -0
  296. package/dist/update-ap5Qv1Yl.cjs.map +1 -0
  297. package/dist/update-yscrx6WQ.mjs +73 -0
  298. package/dist/update-yscrx6WQ.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-3zs6Ulxd.mjs +20 -0
  308. package/dist/webhook-3zs6Ulxd.mjs.map +1 -0
  309. package/dist/webhook-BsygMMf-.cjs +20 -0
  310. package/dist/webhook-BsygMMf-.cjs.map +1 -0
  311. package/package.json +29 -18
  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-DehKYCXh.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,51 @@
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 { Result } from "@praha/byethrow";
6
+
7
+ //#region src/cli/commands/project-user/delete.ts
8
+ async function projectUserDeleteHandler(ctx, options) {
9
+ const confirmed = await confirmDeletion(`project user ${options.userId}`, options.yes);
10
+ if (Result.isFailure(confirmed)) return confirmed;
11
+ const deleted = toResult(await ctx.client.DELETE("/projects/{projectName}/users/{userId}", { params: { path: {
12
+ projectName: ctx.projectName,
13
+ userId: options.userId
14
+ } } }));
15
+ if (Result.isFailure(deleted)) return apiErrorFailure(deleted.error);
16
+ return Result.succeed({
17
+ json: {
18
+ deleted: true,
19
+ userId: options.userId
20
+ },
21
+ text: () => `Removed project user ${options.userId}.`
22
+ });
23
+ }
24
+ const deleteArgs = {
25
+ ...contextArgs,
26
+ "user-id": {
27
+ type: "positional",
28
+ required: true,
29
+ description: "Project user ID"
30
+ },
31
+ yes: {
32
+ type: "boolean",
33
+ description: "Skip the confirmation prompt",
34
+ default: false
35
+ }
36
+ };
37
+ var delete_default = defineCommand({
38
+ meta: {
39
+ name: "delete",
40
+ description: "Remove a user from the project"
41
+ },
42
+ args: deleteArgs,
43
+ run: ({ args }) => runWithContext(args, (ctx) => projectUserDeleteHandler(ctx, {
44
+ userId: args["user-id"],
45
+ yes: args.yes === true
46
+ }))
47
+ });
48
+
49
+ //#endregion
50
+ export { delete_default as default };
51
+ //# sourceMappingURL=delete-DhSU-Lx2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-DhSU-Lx2.mjs","names":[],"sources":["../src/cli/commands/project-user/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\";\n\nexport async function projectUserDeleteHandler(\n ctx: CommandContext,\n options: { userId: string; yes: boolean },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const confirmed = await confirmDeletion(\n `project user ${options.userId}`,\n options.yes,\n );\n if (Result.isFailure(confirmed)) return confirmed;\n\n const deleted = toResult(\n await ctx.client.DELETE(\"/projects/{projectName}/users/{userId}\", {\n params: {\n path: { projectName: ctx.projectName, userId: options.userId },\n },\n }),\n );\n if (Result.isFailure(deleted)) return apiErrorFailure(deleted.error);\n\n return Result.succeed({\n json: { deleted: true, userId: options.userId },\n text: () => `Removed project user ${options.userId}.`,\n });\n}\n\nconst deleteArgs = {\n ...contextArgs,\n \"user-id\": {\n type: \"positional\",\n required: true,\n description: \"Project user 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: \"Remove a user from the project\",\n },\n args: deleteArgs,\n run: ({ args }) =>\n runWithContext(args, (ctx) =>\n projectUserDeleteHandler(ctx, {\n userId: args[\"user-id\"],\n yes: args.yes === true,\n }),\n ),\n});\n"],"mappings":";;;;;;;AAaA,eAAsB,yBACpB,KACA,SACmE;CACnE,MAAM,YAAY,MAAM,gBACtB,gBAAgB,QAAQ,UACxB,QAAQ,GACV;CACA,IAAI,OAAO,UAAU,SAAS,GAAG,OAAO;CAExC,MAAM,UAAU,SACd,MAAM,IAAI,OAAO,OAAO,0CAA0C,EAChE,QAAQ,EACN,MAAM;EAAE,aAAa,IAAI;EAAa,QAAQ,QAAQ;CAAO,EAC/D,EACF,CAAC,CACH;CACA,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO,gBAAgB,QAAQ,KAAK;CAEnE,OAAO,OAAO,QAAQ;EACpB,MAAM;GAAE,SAAS;GAAM,QAAQ,QAAQ;EAAO;EAC9C,YAAY,wBAAwB,QAAQ,OAAO;CACrD,CAAC;AACH;AAEA,MAAM,aAAa;CACjB,GAAG;CACH,WAAW;EACT,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,MAAM,EAAE,WACN,eAAe,OAAO,QACpB,yBAAyB,KAAK;EAC5B,QAAQ,KAAK;EACb,KAAK,KAAK,QAAQ;CACpB,CAAC,CACH;AACJ,CAAC"}
@@ -0,0 +1,59 @@
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
+ const require_confirm_delete = require('./confirm-delete-B9o73U7B.cjs');
5
+ let _praha_byethrow = require("@praha/byethrow");
6
+
7
+ //#region src/cli/commands/bucket/object/delete.ts
8
+ async function bucketObjectDeleteHandler(ctx, options) {
9
+ const confirmed = await require_confirm_delete.confirmDeletion(`object ${options.key} in bucket ${options.bucket}`, options.yes);
10
+ if (_praha_byethrow.Result.isFailure(confirmed)) return confirmed;
11
+ const deleted = require_run_with_context.toResult(await ctx.client.DELETE("/projects/{projectName}/buckets/{bucketName}/objects/{objectKey}", { params: { path: {
12
+ projectName: ctx.projectName,
13
+ bucketName: options.bucket,
14
+ objectKey: options.key
15
+ } } }));
16
+ if (_praha_byethrow.Result.isFailure(deleted)) return require_run_with_context.apiErrorFailure(deleted.error);
17
+ return _praha_byethrow.Result.succeed({
18
+ json: {
19
+ deleted: true,
20
+ bucket: options.bucket,
21
+ key: options.key
22
+ },
23
+ text: () => `Deleted object ${options.key} from bucket ${options.bucket}.`
24
+ });
25
+ }
26
+ const deleteArgs = {
27
+ ...require_shared.contextArgs,
28
+ bucket: {
29
+ type: "positional",
30
+ required: true,
31
+ description: "Bucket name"
32
+ },
33
+ key: {
34
+ type: "positional",
35
+ required: true,
36
+ description: "Object key"
37
+ },
38
+ yes: {
39
+ type: "boolean",
40
+ description: "Skip the confirmation prompt",
41
+ default: false
42
+ }
43
+ };
44
+ var delete_default = require_cli_main.defineCommand({
45
+ meta: {
46
+ name: "delete",
47
+ description: "Delete a bucket object"
48
+ },
49
+ args: deleteArgs,
50
+ run: ({ args }) => require_run_with_context.runWithContext(args, (ctx) => bucketObjectDeleteHandler(ctx, {
51
+ bucket: args.bucket,
52
+ key: args.key,
53
+ yes: args.yes === true
54
+ }))
55
+ });
56
+
57
+ //#endregion
58
+ exports.default = delete_default;
59
+ //# sourceMappingURL=delete-DozSxZQ7.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-DozSxZQ7.cjs","names":["confirmDeletion","Result","toResult","apiErrorFailure","contextArgs","defineCommand","runWithContext"],"sources":["../src/cli/commands/bucket/object/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\";\n\nexport async function bucketObjectDeleteHandler(\n ctx: CommandContext,\n options: { bucket: string; key: string; yes: boolean },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const confirmed = await confirmDeletion(\n `object ${options.key} in bucket ${options.bucket}`,\n options.yes,\n );\n if (Result.isFailure(confirmed)) return confirmed;\n\n const deleted = toResult(\n await ctx.client.DELETE(\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(deleted)) return apiErrorFailure(deleted.error);\n\n return Result.succeed({\n json: { deleted: true, bucket: options.bucket, key: options.key },\n text: () => `Deleted object ${options.key} from bucket ${options.bucket}.`,\n });\n}\n\nconst deleteArgs = {\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 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 bucket object\",\n },\n args: deleteArgs,\n run: ({ args }) =>\n runWithContext(args, (ctx) =>\n bucketObjectDeleteHandler(ctx, {\n bucket: args.bucket,\n key: args.key,\n yes: args.yes === true,\n }),\n ),\n});\n"],"mappings":";;;;;;;AAaA,eAAsB,0BACpB,KACA,SACmE;CACnE,MAAM,YAAY,MAAMA,uCACtB,UAAU,QAAQ,IAAI,aAAa,QAAQ,UAC3C,QAAQ,GACV;CACA,IAAIC,uBAAO,UAAU,SAAS,GAAG,OAAO;CAExC,MAAM,UAAUC,kCACd,MAAM,IAAI,OAAO,OACf,oEACA,EACE,QAAQ,EACN,MAAM;EACJ,aAAa,IAAI;EACjB,YAAY,QAAQ;EACpB,WAAW,QAAQ;CACrB,EACF,EACF,CACF,CACF;CACA,IAAID,uBAAO,UAAU,OAAO,GAAG,OAAOE,yCAAgB,QAAQ,KAAK;CAEnE,OAAOF,uBAAO,QAAQ;EACpB,MAAM;GAAE,SAAS;GAAM,QAAQ,QAAQ;GAAQ,KAAK,QAAQ;EAAI;EAChE,YAAY,kBAAkB,QAAQ,IAAI,eAAe,QAAQ,OAAO;CAC1E,CAAC;AACH;AAEA,MAAM,aAAa;CACjB,GAAGG;CACH,QAAQ;EACN,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,KAAK;EACH,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,KAAK;EACH,MAAM;EACN,aAAa;EACb,SAAS;CACX;AACF;AAEA,qBAAeC,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,MAAM,EAAE,WACNC,wCAAe,OAAO,QACpB,0BAA0B,KAAK;EAC7B,QAAQ,KAAK;EACb,KAAK,KAAK;EACV,KAAK,KAAK,QAAQ;CACpB,CAAC,CACH;AACJ,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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"}