@orizm/cli 3.1.0 → 3.2.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 (357) hide show
  1. package/README.md +27 -1
  2. package/dist/agent-Bd30EhQC.mjs +14 -0
  3. package/dist/agent-Bd30EhQC.mjs.map +1 -0
  4. package/dist/agent-vC2-9rjt.cjs +14 -0
  5. package/dist/agent-vC2-9rjt.cjs.map +1 -0
  6. package/dist/auth-BnXPHgBU.cjs +18 -0
  7. package/dist/{auth-CNbONZuf.cjs.map → auth-BnXPHgBU.cjs.map} +1 -1
  8. package/dist/{auth-BGW072BP.mjs → auth-DHVtM0sF.mjs} +4 -4
  9. package/dist/{auth-BGW072BP.mjs.map → auth-DHVtM0sF.mjs.map} +1 -1
  10. package/dist/{bucket-mg5QQORh.cjs → bucket-CFaYmimY.cjs} +3 -3
  11. package/dist/{bucket-mg5QQORh.cjs.map → bucket-CFaYmimY.cjs.map} +1 -1
  12. package/dist/{bucket-DqW-WEYb.mjs → bucket-D-lu1xgZ.mjs} +3 -3
  13. package/dist/{bucket-DqW-WEYb.mjs.map → bucket-D-lu1xgZ.mjs.map} +1 -1
  14. package/dist/cli/main.cjs +14 -12
  15. package/dist/cli/main.cjs.map +1 -1
  16. package/dist/cli/main.mjs +14 -13
  17. package/dist/cli/main.mjs.map +1 -1
  18. package/dist/{cms-Cnx-lDGu.cjs → cms-CId7jg5l.cjs} +5 -5
  19. package/dist/cms-CId7jg5l.cjs.map +1 -0
  20. package/dist/{cms-BJnovGYT.mjs → cms-DLOypcw8.mjs} +5 -5
  21. package/dist/cms-DLOypcw8.mjs.map +1 -0
  22. package/dist/{codegen-DZOB4ttR.mjs → codegen-BKE_IYoM.mjs} +3 -3
  23. package/dist/{codegen-DZOB4ttR.mjs.map → codegen-BKE_IYoM.mjs.map} +1 -1
  24. package/dist/{codegen-BF5b-u46.cjs → codegen-kbbIwPbb.cjs} +3 -3
  25. package/dist/{codegen-BF5b-u46.cjs.map → codegen-kbbIwPbb.cjs.map} +1 -1
  26. package/dist/{confirm-delete-B9o73U7B.cjs → confirm-delete-BX8bJrXZ.cjs} +3 -3
  27. package/dist/{confirm-delete-B9o73U7B.cjs.map → confirm-delete-BX8bJrXZ.cjs.map} +1 -1
  28. package/dist/{confirm-delete-CsWkW69-.mjs → confirm-delete-CcKLYuCB.mjs} +2 -2
  29. package/dist/{confirm-delete-CsWkW69-.mjs.map → confirm-delete-CcKLYuCB.mjs.map} +1 -1
  30. package/dist/{consumer-C4WiGHWG.mjs → consumer-BAM3E_68.mjs} +4 -4
  31. package/dist/{consumer-C4WiGHWG.mjs.map → consumer-BAM3E_68.mjs.map} +1 -1
  32. package/dist/{consumer-pU2HyiyA.mjs → consumer-CqyZdG9v.mjs} +4 -4
  33. package/dist/consumer-CqyZdG9v.mjs.map +1 -0
  34. package/dist/consumer-D-Y6KJ8a.cjs +18 -0
  35. package/dist/{consumer-l-8wUK8E.cjs.map → consumer-D-Y6KJ8a.cjs.map} +1 -1
  36. package/dist/{consumer-OF6Z_eTP.cjs → consumer-OG6IEJun.cjs} +4 -4
  37. package/dist/consumer-OG6IEJun.cjs.map +1 -0
  38. package/dist/content-ClRuLcGq.cjs +20 -0
  39. package/dist/{content-DMjSwor1.cjs.map → content-ClRuLcGq.cjs.map} +1 -1
  40. package/dist/content-DWnYo6ad.mjs +20 -0
  41. package/dist/{content-BOb6NC8M.mjs.map → content-DWnYo6ad.mjs.map} +1 -1
  42. package/dist/{create-DJY71sp9.cjs → create-B3d4CDel.cjs} +2 -2
  43. package/dist/{create-DJY71sp9.cjs.map → create-B3d4CDel.cjs.map} +1 -1
  44. package/dist/{create-CC814ixh.mjs → create-BD6iS4n6.mjs} +2 -2
  45. package/dist/{create-CC814ixh.mjs.map → create-BD6iS4n6.mjs.map} +1 -1
  46. package/dist/{create-B-PAOor6.mjs → create-BGV3F44O.mjs} +3 -3
  47. package/dist/{create-B-PAOor6.mjs.map → create-BGV3F44O.mjs.map} +1 -1
  48. package/dist/{create-Z-z3LXNW.cjs → create-BYDbsUvw.cjs} +3 -3
  49. package/dist/{create-Z-z3LXNW.cjs.map → create-BYDbsUvw.cjs.map} +1 -1
  50. package/dist/{create-Belwettw.mjs → create-BtuS23L3.mjs} +2 -2
  51. package/dist/{create-Belwettw.mjs.map → create-BtuS23L3.mjs.map} +1 -1
  52. package/dist/{create-CCsn7yp5.cjs → create-CNDCTpi0.cjs} +3 -3
  53. package/dist/{create-CCsn7yp5.cjs.map → create-CNDCTpi0.cjs.map} +1 -1
  54. package/dist/{create-BNYWcyuQ.cjs → create-DzRMGpm_.cjs} +2 -2
  55. package/dist/{create-BNYWcyuQ.cjs.map → create-DzRMGpm_.cjs.map} +1 -1
  56. package/dist/{create-B1ZBOqcV.mjs → create-fweRd0UB.mjs} +2 -2
  57. package/dist/{create-B1ZBOqcV.mjs.map → create-fweRd0UB.mjs.map} +1 -1
  58. package/dist/{create-D5suBd3J.mjs → create-m5fNBqQE.mjs} +3 -3
  59. package/dist/{create-D5suBd3J.mjs.map → create-m5fNBqQE.mjs.map} +1 -1
  60. package/dist/{create-CmOriwGo.cjs → create-tWGEtI3t.cjs} +2 -2
  61. package/dist/{create-CmOriwGo.cjs.map → create-tWGEtI3t.cjs.map} +1 -1
  62. package/dist/{delete-DhSU-Lx2.mjs → delete-B8VlzzCj.mjs} +3 -3
  63. package/dist/{delete-DhSU-Lx2.mjs.map → delete-B8VlzzCj.mjs.map} +1 -1
  64. package/dist/{delete-DVrafka1.cjs → delete-B9j8c8ln.cjs} +3 -3
  65. package/dist/{delete-DVrafka1.cjs.map → delete-B9j8c8ln.cjs.map} +1 -1
  66. package/dist/{delete-ZIifaG0i.mjs → delete-BhJK-8vE.mjs} +3 -3
  67. package/dist/{delete-ZIifaG0i.mjs.map → delete-BhJK-8vE.mjs.map} +1 -1
  68. package/dist/{delete-YYh_0khQ.mjs → delete-Bi6UhAhS.mjs} +3 -3
  69. package/dist/{delete-YYh_0khQ.mjs.map → delete-Bi6UhAhS.mjs.map} +1 -1
  70. package/dist/{delete-CCTiCYIL.cjs → delete-C_oxZa_p.cjs} +3 -3
  71. package/dist/{delete-CCTiCYIL.cjs.map → delete-C_oxZa_p.cjs.map} +1 -1
  72. package/dist/{delete-CSs5Czlo.mjs → delete-Ci7cq3mU.mjs} +3 -3
  73. package/dist/{delete-CSs5Czlo.mjs.map → delete-Ci7cq3mU.mjs.map} +1 -1
  74. package/dist/{delete-XWJRhBFs.mjs → delete-CiWkGnog.mjs} +3 -3
  75. package/dist/{delete-XWJRhBFs.mjs.map → delete-CiWkGnog.mjs.map} +1 -1
  76. package/dist/{delete-DozSxZQ7.cjs → delete-Cmk80aqF.cjs} +3 -3
  77. package/dist/{delete-DozSxZQ7.cjs.map → delete-Cmk80aqF.cjs.map} +1 -1
  78. package/dist/{delete-8yZ3j0vX.cjs → delete-CvtvB2Cr.cjs} +3 -3
  79. package/dist/{delete-8yZ3j0vX.cjs.map → delete-CvtvB2Cr.cjs.map} +1 -1
  80. package/dist/{delete-CIYY59v_.cjs → delete-DG825UwK.cjs} +4 -3
  81. package/dist/{delete-CIYY59v_.cjs.map → delete-DG825UwK.cjs.map} +1 -1
  82. package/dist/{delete-WpMIIvjj.cjs → delete-DGrSMqOt.cjs} +3 -3
  83. package/dist/{delete-WpMIIvjj.cjs.map → delete-DGrSMqOt.cjs.map} +1 -1
  84. package/dist/{delete-BOUObrDw.mjs → delete-Datr3Kqq.mjs} +3 -2
  85. package/dist/{delete-BOUObrDw.mjs.map → delete-Datr3Kqq.mjs.map} +1 -1
  86. package/dist/{delete-D4r1ve4v.cjs → delete-TTF4pIKw.cjs} +3 -3
  87. package/dist/{delete-D4r1ve4v.cjs.map → delete-TTF4pIKw.cjs.map} +1 -1
  88. package/dist/{delete-BSLIXrAh.mjs → delete-X8iVsETw.mjs} +3 -3
  89. package/dist/{delete-BSLIXrAh.mjs.map → delete-X8iVsETw.mjs.map} +1 -1
  90. package/dist/docs/features/cli/authentication.md +93 -0
  91. package/dist/docs/features/cli/commands/agent.md +49 -0
  92. package/dist/docs/features/cli/commands/auth.md +36 -0
  93. package/dist/docs/features/cli/commands/bucket.md +120 -0
  94. package/dist/docs/features/cli/commands/codegen.md +51 -0
  95. package/dist/docs/features/cli/commands/content.md +117 -0
  96. package/dist/docs/features/cli/commands/key.md +155 -0
  97. package/dist/docs/features/cli/commands/link.md +21 -0
  98. package/dist/docs/features/cli/commands/org.md +18 -0
  99. package/dist/docs/features/cli/commands/project-user.md +108 -0
  100. package/dist/docs/features/cli/commands/project.md +106 -0
  101. package/dist/docs/features/cli/commands/schema.md +107 -0
  102. package/dist/docs/features/cli/commands/webhook.md +110 -0
  103. package/dist/docs/features/cli/commands.md +110 -0
  104. package/dist/docs/features/cli/configuration.md +70 -0
  105. package/dist/docs/features/cli/output.md +53 -0
  106. package/dist/docs/features/cli/project-linking.md +58 -0
  107. package/dist/docs/features/cli/quickstart.md +83 -0
  108. package/dist/docs/features/cli.md +56 -0
  109. package/dist/docs/features/cms-sdk/account.md +122 -0
  110. package/dist/docs/features/cms-sdk/auth.md +122 -0
  111. package/dist/docs/features/cms-sdk/bucket.md +113 -0
  112. package/dist/docs/features/cms-sdk/cli.md +104 -0
  113. package/dist/docs/features/cms-sdk/fetch-contents.md +608 -0
  114. package/dist/docs/features/cms-sdk/install.md +98 -0
  115. package/dist/docs/features/cms-sdk/management-user.md +244 -0
  116. package/dist/docs/features/cms-sdk/migrate-to-v2.md +152 -0
  117. package/dist/docs/features/cms-sdk/mutation-contents.md +190 -0
  118. package/dist/docs/features/console/audit-logs.md +52 -0
  119. package/dist/docs/features/console/bucket.md +70 -0
  120. package/dist/docs/features/console/create-project.md +103 -0
  121. package/dist/docs/features/console/generate-api-key.md +103 -0
  122. package/dist/docs/features/console/invite-project-users.md +70 -0
  123. package/dist/docs/features/console/management-tables.md +131 -0
  124. package/dist/docs/features/console/organization-member-management.md +78 -0
  125. package/dist/docs/features/console/schema-history.md +29 -0
  126. package/dist/docs/features/console.md +15 -0
  127. package/dist/docs/features/consumer-sdk/cli.md +60 -0
  128. package/dist/docs/features/consumer-sdk/fetch-contents.md +603 -0
  129. package/dist/docs/features/consumer-sdk/install.md +90 -0
  130. package/dist/docs/features/consumer-sdk/migrate-to-v2.md +43 -0
  131. package/dist/docs/features/design-editor/about.md +36 -0
  132. package/dist/docs/features/design-editor/getting-started.md +244 -0
  133. package/dist/docs/features/design-editor/install.md +17 -0
  134. package/dist/docs/features/design-editor/prop-editor.md +83 -0
  135. package/dist/docs/features/design-editor/schema.md +279 -0
  136. package/dist/docs/features/draft.md +241 -0
  137. package/dist/docs/features/form/about.md +83 -0
  138. package/dist/docs/features/form/editor.md +410 -0
  139. package/dist/docs/features/form/submission.md +94 -0
  140. package/dist/docs/features/full-text-search.md +64 -0
  141. package/dist/docs/features/history.md +152 -0
  142. package/dist/docs/features/schema/about.md +215 -0
  143. package/dist/docs/features/schema/authority.md +456 -0
  144. package/dist/docs/features/schema/bucket.md +142 -0
  145. package/dist/docs/features/schema/database.md +419 -0
  146. package/dist/docs/features/schema/table-module.md +140 -0
  147. package/dist/docs/features/webhook/revalidate-nextjs.md +185 -0
  148. package/dist/docs/features/webhook.md +295 -0
  149. package/dist/docs/get-started/add-model-starter.md +124 -0
  150. package/dist/docs/get-started/get-started-with-starter.md +218 -0
  151. package/dist/docs/index.md +88 -0
  152. package/dist/docs/introduction.md +140 -0
  153. package/dist/docs/manifest.json +6 -0
  154. package/dist/docs/resources/cli-migration-guide.md +82 -0
  155. package/dist/docs/resources/cli-v2-to-v3-migration-guide.md +138 -0
  156. package/dist/docs/resources/deploy-to-vercel.md +62 -0
  157. package/dist/docs/resources/limits.md +24 -0
  158. package/dist/docs/resources/private-registry.md +23 -0
  159. package/dist/docs/resources/status.md +22 -0
  160. package/dist/docs/resources/user-model.md +38 -0
  161. package/dist/{download-ogGbb3FU.cjs → download-BkzmfQXD.cjs} +2 -2
  162. package/dist/{download-ogGbb3FU.cjs.map → download-BkzmfQXD.cjs.map} +1 -1
  163. package/dist/{download-oFGzg30E.mjs → download-Dx1oyrMg.mjs} +2 -2
  164. package/dist/{download-oFGzg30E.mjs.map → download-Dx1oyrMg.mjs.map} +1 -1
  165. package/dist/{erd-zDoF6I_y.mjs → erd-BNv5Th6z.mjs} +2 -2
  166. package/dist/{erd-zDoF6I_y.mjs.map → erd-BNv5Th6z.mjs.map} +1 -1
  167. package/dist/{erd-lKC5NB2l.cjs → erd-ByuVMQ5n.cjs} +2 -2
  168. package/dist/{erd-lKC5NB2l.cjs.map → erd-ByuVMQ5n.cjs.map} +1 -1
  169. package/dist/{get-CgEgETQa.mjs → get-1TtxSEoT.mjs} +2 -2
  170. package/dist/{get-CgEgETQa.mjs.map → get-1TtxSEoT.mjs.map} +1 -1
  171. package/dist/{get-DjRyK0hJ.cjs → get-B5S1GfjR.cjs} +2 -2
  172. package/dist/{get-DjRyK0hJ.cjs.map → get-B5S1GfjR.cjs.map} +1 -1
  173. package/dist/{get-DDB89cOs.mjs → get-BLDHE_Zl.mjs} +2 -2
  174. package/dist/{get-DDB89cOs.mjs.map → get-BLDHE_Zl.mjs.map} +1 -1
  175. package/dist/{get-KdWfYINc.cjs → get-C5OH05Ka.cjs} +2 -2
  176. package/dist/{get-KdWfYINc.cjs.map → get-C5OH05Ka.cjs.map} +1 -1
  177. package/dist/{get-DwtzBjGV.cjs → get-CKZPn669.cjs} +2 -2
  178. package/dist/{get-DwtzBjGV.cjs.map → get-CKZPn669.cjs.map} +1 -1
  179. package/dist/{get-IOU__2RP.cjs → get-CdDZkUXV.cjs} +2 -2
  180. package/dist/{get-IOU__2RP.cjs.map → get-CdDZkUXV.cjs.map} +1 -1
  181. package/dist/{get-DB80UNSR.mjs → get-Cw4Dw5NG.mjs} +2 -2
  182. package/dist/{get-DB80UNSR.mjs.map → get-Cw4Dw5NG.mjs.map} +1 -1
  183. package/dist/{get-C7dKoSIc.mjs → get-Dy3AD4il.mjs} +2 -2
  184. package/dist/{get-C7dKoSIc.mjs.map → get-Dy3AD4il.mjs.map} +1 -1
  185. package/dist/{get-BBOKSXkh.cjs → get-PVsUGHBR.cjs} +2 -2
  186. package/dist/{get-BBOKSXkh.cjs.map → get-PVsUGHBR.cjs.map} +1 -1
  187. package/dist/{get-B6vBaq_D.mjs → get-Vo3yr12d.mjs} +2 -2
  188. package/dist/{get-B6vBaq_D.mjs.map → get-Vo3yr12d.mjs.map} +1 -1
  189. package/dist/{get-jwXRlIBJ.cjs → get-jaN2o0XY.cjs} +2 -2
  190. package/dist/{get-jwXRlIBJ.cjs.map → get-jaN2o0XY.cjs.map} +1 -1
  191. package/dist/{get-DBxhbN1G.mjs → get-qOKYAc46.mjs} +2 -2
  192. package/dist/{get-DBxhbN1G.mjs.map → get-qOKYAc46.mjs.map} +1 -1
  193. package/dist/init-CPfpVlUN.mjs +372 -0
  194. package/dist/init-CPfpVlUN.mjs.map +1 -0
  195. package/dist/init-NaL2N3Go.cjs +374 -0
  196. package/dist/init-NaL2N3Go.cjs.map +1 -0
  197. package/dist/{invite-DPygtCoO.cjs → invite-Tw3SMV0Q.cjs} +2 -2
  198. package/dist/{invite-DPygtCoO.cjs.map → invite-Tw3SMV0Q.cjs.map} +1 -1
  199. package/dist/{invite-D66DSMvq.mjs → invite-vzajkU2u.mjs} +2 -2
  200. package/dist/{invite-D66DSMvq.mjs.map → invite-vzajkU2u.mjs.map} +1 -1
  201. package/dist/{key-C71Ffll9.mjs → key-CyVxu3Uk.mjs} +3 -3
  202. package/dist/{key-C71Ffll9.mjs.map → key-CyVxu3Uk.mjs.map} +1 -1
  203. package/dist/{key-DQr7qRL2.cjs → key-tRYRqYNo.cjs} +3 -3
  204. package/dist/{key-DQr7qRL2.cjs.map → key-tRYRqYNo.cjs.map} +1 -1
  205. package/dist/{link-BluFyxEL.mjs → link-Bd55x5Zf.mjs} +2 -2
  206. package/dist/{link-BluFyxEL.mjs.map → link-Bd55x5Zf.mjs.map} +1 -1
  207. package/dist/{link-DYu1Vjlw.cjs → link-Cz7MX02S.cjs} +2 -2
  208. package/dist/{link-DYu1Vjlw.cjs.map → link-Cz7MX02S.cjs.map} +1 -1
  209. package/dist/{list-D5PSDMWw.mjs → list-2otVufvs.mjs} +3 -3
  210. package/dist/{list-D5PSDMWw.mjs.map → list-2otVufvs.mjs.map} +1 -1
  211. package/dist/{list-sQk00GV5.mjs → list-BMnBuZMr.mjs} +2 -2
  212. package/dist/{list-sQk00GV5.mjs.map → list-BMnBuZMr.mjs.map} +1 -1
  213. package/dist/{list-BwfpuhmJ.cjs → list-Bo8IMFd0.cjs} +2 -2
  214. package/dist/{list-BwfpuhmJ.cjs.map → list-Bo8IMFd0.cjs.map} +1 -1
  215. package/dist/{list-B0N4-Q-5.mjs → list-BtgAAUKm.mjs} +2 -2
  216. package/dist/{list-B0N4-Q-5.mjs.map → list-BtgAAUKm.mjs.map} +1 -1
  217. package/dist/{list-vbMaOiza.mjs → list-C0lq-gBZ.mjs} +2 -2
  218. package/dist/{list-vbMaOiza.mjs.map → list-C0lq-gBZ.mjs.map} +1 -1
  219. package/dist/{list-BsYYq9wT.mjs → list-CGZ3iT6J.mjs} +2 -2
  220. package/dist/{list-BsYYq9wT.mjs.map → list-CGZ3iT6J.mjs.map} +1 -1
  221. package/dist/{list-CFwW0G9f.cjs → list-CMWXO4nB.cjs} +2 -2
  222. package/dist/{list-CFwW0G9f.cjs.map → list-CMWXO4nB.cjs.map} +1 -1
  223. package/dist/{list-rAn3uOA7.mjs → list-Ccaec0cs.mjs} +2 -2
  224. package/dist/{list-rAn3uOA7.mjs.map → list-Ccaec0cs.mjs.map} +1 -1
  225. package/dist/{list-CU42ERNY.cjs → list-Cp_mHwbN.cjs} +2 -2
  226. package/dist/{list-CU42ERNY.cjs.map → list-Cp_mHwbN.cjs.map} +1 -1
  227. package/dist/{list-D0-QrWmn.cjs → list-Cs7kbAAi.cjs} +3 -3
  228. package/dist/{list-D0-QrWmn.cjs.map → list-Cs7kbAAi.cjs.map} +1 -1
  229. package/dist/{list-DlJssPwy.cjs → list-D5IaYurn.cjs} +2 -2
  230. package/dist/{list-DlJssPwy.cjs.map → list-D5IaYurn.cjs.map} +1 -1
  231. package/dist/{list-CbvEh7eA.mjs → list-DcIBInNA.mjs} +2 -2
  232. package/dist/{list-CbvEh7eA.mjs.map → list-DcIBInNA.mjs.map} +1 -1
  233. package/dist/{list-BzLraBnA.cjs → list-Dd3veD9Z.cjs} +2 -2
  234. package/dist/{list-BzLraBnA.cjs.map → list-Dd3veD9Z.cjs.map} +1 -1
  235. package/dist/{list-DexBclfb.cjs → list-DdVKKaDN.cjs} +2 -2
  236. package/dist/{list-DexBclfb.cjs.map → list-DdVKKaDN.cjs.map} +1 -1
  237. package/dist/{list-Br6Cmi9S.cjs → list-E1sjTZLe.cjs} +2 -2
  238. package/dist/{list-Br6Cmi9S.cjs.map → list-E1sjTZLe.cjs.map} +1 -1
  239. package/dist/{list-BRh59EqI.cjs → list-KI-7REC_.cjs} +2 -2
  240. package/dist/{list-BRh59EqI.cjs.map → list-KI-7REC_.cjs.map} +1 -1
  241. package/dist/{list-ocfd7631.mjs → list-MWD4huKP.mjs} +2 -2
  242. package/dist/{list-ocfd7631.mjs.map → list-MWD4huKP.mjs.map} +1 -1
  243. package/dist/{list-57TUfNFd.mjs → list-Pf5aAoaN.mjs} +2 -2
  244. package/dist/{list-57TUfNFd.mjs.map → list-Pf5aAoaN.mjs.map} +1 -1
  245. package/dist/{list-BHvURTWd.cjs → list-fG4zo8zz.cjs} +2 -2
  246. package/dist/{list-BHvURTWd.cjs.map → list-fG4zo8zz.cjs.map} +1 -1
  247. package/dist/{list-DrZYlidZ.mjs → list-r2UPz1zW.mjs} +2 -2
  248. package/dist/{list-DrZYlidZ.mjs.map → list-r2UPz1zW.mjs.map} +1 -1
  249. package/dist/{login-FE_dbWMo.mjs → login-Dq2L3bI7.mjs} +2 -2
  250. package/dist/{login-FE_dbWMo.mjs.map → login-Dq2L3bI7.mjs.map} +1 -1
  251. package/dist/{login-2XcHd4wn.cjs → login-M1IF2MdC.cjs} +2 -2
  252. package/dist/{login-2XcHd4wn.cjs.map → login-M1IF2MdC.cjs.map} +1 -1
  253. package/dist/{logout-DC5TMJ5_.cjs → logout-BCSfFgPz.cjs} +2 -2
  254. package/dist/{logout-DC5TMJ5_.cjs.map → logout-BCSfFgPz.cjs.map} +1 -1
  255. package/dist/{logout-BDbWrGBm.mjs → logout-DFzQCQKe.mjs} +2 -2
  256. package/dist/{logout-BDbWrGBm.mjs.map → logout-DFzQCQKe.mjs.map} +1 -1
  257. package/dist/management-C1p-Hm2Z.cjs +19 -0
  258. package/dist/{management-BGYcZB4c.cjs.map → management-C1p-Hm2Z.cjs.map} +1 -1
  259. package/dist/{management-DDACMgbU.mjs → management-h4yE09a6.mjs} +5 -5
  260. package/dist/{management-DDACMgbU.mjs.map → management-h4yE09a6.mjs.map} +1 -1
  261. package/dist/object-CZDLoc9L.cjs +20 -0
  262. package/dist/{object-DVqidsEc.cjs.map → object-CZDLoc9L.cjs.map} +1 -1
  263. package/dist/object-CqMsEkh9.mjs +20 -0
  264. package/dist/{object-qdBdEghr.mjs.map → object-CqMsEkh9.mjs.map} +1 -1
  265. package/dist/{org-CPhTRTks.mjs → org-Co-rjfr-.mjs} +2 -2
  266. package/dist/{org-CPhTRTks.mjs.map → org-Co-rjfr-.mjs.map} +1 -1
  267. package/dist/{org-C4cVovOM.cjs → org-Drj3VqIm.cjs} +2 -2
  268. package/dist/{org-C4cVovOM.cjs.map → org-Drj3VqIm.cjs.map} +1 -1
  269. package/dist/{org-context-Bewx2NEW.cjs → org-context-DKFnPH_o.cjs} +2 -2
  270. package/dist/{org-context-Bewx2NEW.cjs.map → org-context-DKFnPH_o.cjs.map} +1 -1
  271. package/dist/{org-context-D0dwWC2M.mjs → org-context-Df5McOiK.mjs} +2 -2
  272. package/dist/{org-context-D0dwWC2M.mjs.map → org-context-Df5McOiK.mjs.map} +1 -1
  273. package/dist/project-C7qWFjMV.mjs +20 -0
  274. package/dist/{project-CaXD3QBs.mjs.map → project-C7qWFjMV.mjs.map} +1 -1
  275. package/dist/project-Dm7nr5NV.cjs +20 -0
  276. package/dist/{project-BX7zvWB1.cjs.map → project-Dm7nr5NV.cjs.map} +1 -1
  277. package/dist/project-user-D9h_QBc0.mjs +20 -0
  278. package/dist/{project-user-Cp7i6orv.mjs.map → project-user-D9h_QBc0.mjs.map} +1 -1
  279. package/dist/project-user-wLFnHFwB.cjs +20 -0
  280. package/dist/{project-user-Dm0qR-sh.cjs.map → project-user-wLFnHFwB.cjs.map} +1 -1
  281. package/dist/prompt-C-XNDSNE.cjs +42 -0
  282. package/dist/prompt-C-XNDSNE.cjs.map +1 -0
  283. package/dist/prompt-Dr2Rkxun.mjs +25 -0
  284. package/dist/prompt-Dr2Rkxun.mjs.map +1 -0
  285. package/dist/{push-D7co0keA.mjs → push-54rmb0T0.mjs} +3 -2
  286. package/dist/{push-D7co0keA.mjs.map → push-54rmb0T0.mjs.map} +1 -1
  287. package/dist/{push-0u6PDz4E.cjs → push-9fPpd4U8.cjs} +4 -3
  288. package/dist/{push-0u6PDz4E.cjs.map → push-9fPpd4U8.cjs.map} +1 -1
  289. package/dist/{run-codegen-DgaFaIQ1.mjs → run-codegen-DjnV60bE.mjs} +3 -3
  290. package/dist/{run-codegen-DgaFaIQ1.mjs.map → run-codegen-DjnV60bE.mjs.map} +1 -1
  291. package/dist/{run-codegen-Ceeosw5x.cjs → run-codegen-mclysZuT.cjs} +3 -3
  292. package/dist/{run-codegen-Ceeosw5x.cjs.map → run-codegen-mclysZuT.cjs.map} +1 -1
  293. package/dist/{run-with-context-CVhmzAFZ.mjs → run-with-context-B4DyI8Wo.mjs} +6 -26
  294. package/dist/run-with-context-B4DyI8Wo.mjs.map +1 -0
  295. package/dist/{run-with-context-DJNnEigg.cjs → run-with-context-D8pSrqD_.cjs} +7 -39
  296. package/dist/run-with-context-D8pSrqD_.cjs.map +1 -0
  297. package/dist/{schema-exG250MU.mjs → schema-BL6SlLtH.mjs} +5 -5
  298. package/dist/{schema-exG250MU.mjs.map → schema-BL6SlLtH.mjs.map} +1 -1
  299. package/dist/schema-CNSTXsVa.cjs +20 -0
  300. package/dist/{schema-B3iRqvYK.cjs.map → schema-CNSTXsVa.cjs.map} +1 -1
  301. package/dist/{status-Dq_NJE71.cjs → status-CqPJTxeK.cjs} +2 -2
  302. package/dist/{status-Dq_NJE71.cjs.map → status-CqPJTxeK.cjs.map} +1 -1
  303. package/dist/{status-fWqXzV0P.mjs → status-D7nOW3R3.mjs} +2 -2
  304. package/dist/{status-fWqXzV0P.mjs.map → status-D7nOW3R3.mjs.map} +1 -1
  305. package/dist/{token-store--9GYVL7N.cjs → token-store-BgWGhqq0.cjs} +3 -3
  306. package/dist/{token-store--9GYVL7N.cjs.map → token-store-BgWGhqq0.cjs.map} +1 -1
  307. package/dist/{token-store-reCGF86F.mjs → token-store-C2r7cFA-.mjs} +2 -2
  308. package/dist/{token-store-reCGF86F.mjs.map → token-store-C2r7cFA-.mjs.map} +1 -1
  309. package/dist/{update-B4lv4dAz.mjs → update-8-sHFvNB.mjs} +2 -2
  310. package/dist/{update-B4lv4dAz.mjs.map → update-8-sHFvNB.mjs.map} +1 -1
  311. package/dist/{update-Dyo4vuZs.mjs → update-B5hKKw0K.mjs} +3 -3
  312. package/dist/{update-Dyo4vuZs.mjs.map → update-B5hKKw0K.mjs.map} +1 -1
  313. package/dist/{update-Do9HHWzs.cjs → update-BVaqURWE.cjs} +2 -2
  314. package/dist/{update-Do9HHWzs.cjs.map → update-BVaqURWE.cjs.map} +1 -1
  315. package/dist/{update-DRnN1kiu.cjs → update-BlUwNhLA.cjs} +2 -2
  316. package/dist/{update-DRnN1kiu.cjs.map → update-BlUwNhLA.cjs.map} +1 -1
  317. package/dist/{update-Cx_2GkQj.cjs → update-BqhLwuP7.cjs} +2 -2
  318. package/dist/{update-Cx_2GkQj.cjs.map → update-BqhLwuP7.cjs.map} +1 -1
  319. package/dist/{update-mEmULIau.mjs → update-DaYjh5VN.mjs} +2 -2
  320. package/dist/{update-mEmULIau.mjs.map → update-DaYjh5VN.mjs.map} +1 -1
  321. package/dist/{update-CJgEmSWJ.cjs → update-DcTzR54Z.cjs} +3 -3
  322. package/dist/{update-CJgEmSWJ.cjs.map → update-DcTzR54Z.cjs.map} +1 -1
  323. package/dist/{update-CIH6sSVk.cjs → update-Dne7g_0s.cjs} +2 -2
  324. package/dist/{update-CIH6sSVk.cjs.map → update-Dne7g_0s.cjs.map} +1 -1
  325. package/dist/{update-CQ4n4Xuf.mjs → update-Dy1BOnTB.mjs} +2 -2
  326. package/dist/{update-CQ4n4Xuf.mjs.map → update-Dy1BOnTB.mjs.map} +1 -1
  327. package/dist/{update-rzij1b_o.mjs → update-slz_X0mG.mjs} +2 -2
  328. package/dist/{update-rzij1b_o.mjs.map → update-slz_X0mG.mjs.map} +1 -1
  329. package/dist/{upload-DGgJ1TQk.mjs → upload-CDtzV9Wx.mjs} +3 -3
  330. package/dist/{upload-DGgJ1TQk.mjs.map → upload-CDtzV9Wx.mjs.map} +1 -1
  331. package/dist/{upload-C43ZXxyb.cjs → upload-DIln1QDA.cjs} +3 -3
  332. package/dist/{upload-C43ZXxyb.cjs.map → upload-DIln1QDA.cjs.map} +1 -1
  333. package/dist/webhook-BT3cHrq5.mjs +20 -0
  334. package/dist/{webhook-CpZ1-Ho5.mjs.map → webhook-BT3cHrq5.mjs.map} +1 -1
  335. package/dist/webhook-CQeuAqec.cjs +20 -0
  336. package/dist/{webhook-CbL4QaR5.cjs.map → webhook-CQeuAqec.cjs.map} +1 -1
  337. package/package.json +6 -5
  338. package/dist/auth-CNbONZuf.cjs +0 -18
  339. package/dist/cms-BJnovGYT.mjs.map +0 -1
  340. package/dist/cms-Cnx-lDGu.cjs.map +0 -1
  341. package/dist/consumer-OF6Z_eTP.cjs.map +0 -1
  342. package/dist/consumer-l-8wUK8E.cjs +0 -18
  343. package/dist/consumer-pU2HyiyA.mjs.map +0 -1
  344. package/dist/content-BOb6NC8M.mjs +0 -20
  345. package/dist/content-DMjSwor1.cjs +0 -20
  346. package/dist/management-BGYcZB4c.cjs +0 -19
  347. package/dist/object-DVqidsEc.cjs +0 -20
  348. package/dist/object-qdBdEghr.mjs +0 -20
  349. package/dist/project-BX7zvWB1.cjs +0 -20
  350. package/dist/project-CaXD3QBs.mjs +0 -20
  351. package/dist/project-user-Cp7i6orv.mjs +0 -20
  352. package/dist/project-user-Dm0qR-sh.cjs +0 -20
  353. package/dist/run-with-context-CVhmzAFZ.mjs.map +0 -1
  354. package/dist/run-with-context-DJNnEigg.cjs.map +0 -1
  355. package/dist/schema-B3iRqvYK.cjs +0 -20
  356. package/dist/webhook-CbL4QaR5.cjs +0 -20
  357. package/dist/webhook-CpZ1-Ho5.mjs +0 -20
@@ -0,0 +1,20 @@
1
+ const require_cli_main = require('./cli/main.cjs');
2
+
3
+ //#region src/cli/commands/schema/index.ts
4
+ var schema_default = require_cli_main.defineCommand({
5
+ meta: {
6
+ name: "schema",
7
+ description: "Work with orizm.config.ts schema definitions"
8
+ },
9
+ subCommands: {
10
+ push: () => Promise.resolve().then(() => require("./push-9fPpd4U8.cjs")).then((m) => m.default),
11
+ list: () => Promise.resolve().then(() => require("./list-E1sjTZLe.cjs")).then((m) => m.default),
12
+ get: () => Promise.resolve().then(() => require("./get-CdDZkUXV.cjs")).then((m) => m.default),
13
+ validate: () => Promise.resolve().then(() => require("./validate-BpxZ8LTl.cjs")).then((m) => m.default),
14
+ erd: () => Promise.resolve().then(() => require("./erd-ByuVMQ5n.cjs")).then((m) => m.default)
15
+ }
16
+ });
17
+
18
+ //#endregion
19
+ exports.default = schema_default;
20
+ //# sourceMappingURL=schema-CNSTXsVa.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema-B3iRqvYK.cjs","names":["defineCommand"],"sources":["../src/cli/commands/schema/index.ts"],"sourcesContent":["import { defineCommand } from \"../define-command.js\";\n\nexport default defineCommand({\n meta: {\n name: \"schema\",\n description: \"Work with orizm.config.ts schema definitions\",\n },\n subCommands: {\n push: () => import(\"./push.js\").then((m) => m.default),\n list: () => import(\"./list.js\").then((m) => m.default),\n get: () => import(\"./get.js\").then((m) => m.default),\n validate: () => import(\"./validate.js\").then((m) => m.default),\n erd: () => import(\"./erd.js\").then((m) => m.default),\n },\n});\n"],"mappings":";;;AAEA,qBAAeA,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,aAAa;EACX,iDAAY,wBAAoB,MAAM,MAAM,EAAE,OAAO;EACrD,iDAAY,wBAAoB,MAAM,MAAM,EAAE,OAAO;EACrD,gDAAW,uBAAmB,MAAM,MAAM,EAAE,OAAO;EACnD,qDAAgB,4BAAwB,MAAM,MAAM,EAAE,OAAO;EAC7D,gDAAW,uBAAmB,MAAM,MAAM,EAAE,OAAO;CACrD;AACF,CAAC"}
1
+ {"version":3,"file":"schema-CNSTXsVa.cjs","names":["defineCommand"],"sources":["../src/cli/commands/schema/index.ts"],"sourcesContent":["import { defineCommand } from \"../define-command.js\";\n\nexport default defineCommand({\n meta: {\n name: \"schema\",\n description: \"Work with orizm.config.ts schema definitions\",\n },\n subCommands: {\n push: () => import(\"./push.js\").then((m) => m.default),\n list: () => import(\"./list.js\").then((m) => m.default),\n get: () => import(\"./get.js\").then((m) => m.default),\n validate: () => import(\"./validate.js\").then((m) => m.default),\n erd: () => import(\"./erd.js\").then((m) => m.default),\n },\n});\n"],"mappings":";;;AAEA,qBAAeA,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,aAAa;EACX,iDAAY,wBAAoB,MAAM,MAAM,EAAE,OAAO;EACrD,iDAAY,wBAAoB,MAAM,MAAM,EAAE,OAAO;EACrD,gDAAW,uBAAmB,MAAM,MAAM,EAAE,OAAO;EACnD,qDAAgB,4BAAwB,MAAM,MAAM,EAAE,OAAO;EAC7D,gDAAW,uBAAmB,MAAM,MAAM,EAAE,OAAO;CACrD;AACF,CAAC"}
@@ -1,6 +1,6 @@
1
1
  const require_cli_main = require('./cli/main.cjs');
2
2
  const require_shared = require('./shared-DHRPzzKl.cjs');
3
- const require_token_store = require('./token-store--9GYVL7N.cjs');
3
+ const require_token_store = require('./token-store-BgWGhqq0.cjs');
4
4
  let _praha_byethrow = require("@praha/byethrow");
5
5
 
6
6
  //#region src/cli/commands/auth/status.ts
@@ -46,4 +46,4 @@ var status_default = require_cli_main.defineCommand({
46
46
 
47
47
  //#endregion
48
48
  exports.default = status_default;
49
- //# sourceMappingURL=status-Dq_NJE71.cjs.map
49
+ //# sourceMappingURL=status-CqPJTxeK.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"status-Dq_NJE71.cjs","names":["defineCommand","globalArgs","resolveEnv","Result","FileTokenStore"],"sources":["../src/cli/commands/auth/status.ts"],"sourcesContent":["import { Result } from \"@praha/byethrow\";\nimport { defineCommand } from \"../define-command.js\";\nimport { globalArgs } from \"../shared.js\";\nimport { resolveEnv } from \"../../env.js\";\nimport { FileTokenStore } from \"../../auth/token-store.js\";\n\nexport default defineCommand({\n meta: {\n name: \"status\",\n description: \"Show the current authentication status\",\n },\n args: { ...globalArgs },\n run: async () => {\n const env = resolveEnv();\n if (Result.isFailure(env)) {\n return Result.fail({\n message: \"Invalid Orizm environment configuration.\",\n });\n }\n const { issuerUrl, apiKey } = env.value;\n\n const entry = await new FileTokenStore().get(issuerUrl);\n if (entry !== undefined) {\n const who = entry.profile.email ?? entry.profile.name ?? entry.subject;\n const lines = [\n `Signed in as ${who}.`,\n ...(apiKey != null\n ? [\" ORIZM_API_KEY is also set, but your signed-in session is used.\"]\n : []),\n ];\n return Result.succeed({\n // 細かな技術項目はスクリプト連携向けに --json でだけ提供する。\n json: {\n authenticated: true,\n method: \"oauth2\",\n issuer: issuerUrl,\n subject: entry.subject,\n name: entry.profile.name,\n email: entry.profile.email,\n scope: entry.scope,\n },\n text: () => lines.join(\"\\n\"),\n });\n }\n\n if (apiKey != null) {\n return Result.succeed({\n json: { authenticated: true, method: \"api-key\" },\n text: () => \"Signed in using ORIZM_API_KEY.\",\n });\n }\n\n return Result.fail({\n message:\n \"Not authenticated. Run `orizm auth login`, or set ORIZM_API_KEY.\",\n exitCode: 1,\n });\n },\n});\n"],"mappings":";;;;;;AAMA,qBAAeA,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM,EAAE,GAAGC,0BAAW;CACtB,KAAK,YAAY;EACf,MAAM,MAAMC,+BAAW;EACvB,IAAIC,uBAAO,UAAU,GAAG,GACtB,OAAOA,uBAAO,KAAK,EACjB,SAAS,2CACX,CAAC;EAEH,MAAM,EAAE,WAAW,WAAW,IAAI;EAElC,MAAM,QAAQ,MAAM,IAAIC,mCAAe,CAAC,CAAC,IAAI,SAAS;EACtD,IAAI,UAAU,QAAW;GAEvB,MAAM,QAAQ,CACZ,gBAFU,MAAM,QAAQ,SAAS,MAAM,QAAQ,QAAQ,MAAM,QAEzC,IACpB,GAAI,UAAU,OACV,CAAC,kEAAkE,IACnE,CAAC,CACP;GACA,OAAOD,uBAAO,QAAQ;IAEpB,MAAM;KACJ,eAAe;KACf,QAAQ;KACR,QAAQ;KACR,SAAS,MAAM;KACf,MAAM,MAAM,QAAQ;KACpB,OAAO,MAAM,QAAQ;KACrB,OAAO,MAAM;IACf;IACA,YAAY,MAAM,KAAK,IAAI;GAC7B,CAAC;EACH;EAEA,IAAI,UAAU,MACZ,OAAOA,uBAAO,QAAQ;GACpB,MAAM;IAAE,eAAe;IAAM,QAAQ;GAAU;GAC/C,YAAY;EACd,CAAC;EAGH,OAAOA,uBAAO,KAAK;GACjB,SACE;GACF,UAAU;EACZ,CAAC;CACH;AACF,CAAC"}
1
+ {"version":3,"file":"status-CqPJTxeK.cjs","names":["defineCommand","globalArgs","resolveEnv","Result","FileTokenStore"],"sources":["../src/cli/commands/auth/status.ts"],"sourcesContent":["import { Result } from \"@praha/byethrow\";\nimport { defineCommand } from \"../define-command.js\";\nimport { globalArgs } from \"../shared.js\";\nimport { resolveEnv } from \"../../env.js\";\nimport { FileTokenStore } from \"../../auth/token-store.js\";\n\nexport default defineCommand({\n meta: {\n name: \"status\",\n description: \"Show the current authentication status\",\n },\n args: { ...globalArgs },\n run: async () => {\n const env = resolveEnv();\n if (Result.isFailure(env)) {\n return Result.fail({\n message: \"Invalid Orizm environment configuration.\",\n });\n }\n const { issuerUrl, apiKey } = env.value;\n\n const entry = await new FileTokenStore().get(issuerUrl);\n if (entry !== undefined) {\n const who = entry.profile.email ?? entry.profile.name ?? entry.subject;\n const lines = [\n `Signed in as ${who}.`,\n ...(apiKey != null\n ? [\" ORIZM_API_KEY is also set, but your signed-in session is used.\"]\n : []),\n ];\n return Result.succeed({\n // 細かな技術項目はスクリプト連携向けに --json でだけ提供する。\n json: {\n authenticated: true,\n method: \"oauth2\",\n issuer: issuerUrl,\n subject: entry.subject,\n name: entry.profile.name,\n email: entry.profile.email,\n scope: entry.scope,\n },\n text: () => lines.join(\"\\n\"),\n });\n }\n\n if (apiKey != null) {\n return Result.succeed({\n json: { authenticated: true, method: \"api-key\" },\n text: () => \"Signed in using ORIZM_API_KEY.\",\n });\n }\n\n return Result.fail({\n message:\n \"Not authenticated. Run `orizm auth login`, or set ORIZM_API_KEY.\",\n exitCode: 1,\n });\n },\n});\n"],"mappings":";;;;;;AAMA,qBAAeA,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM,EAAE,GAAGC,0BAAW;CACtB,KAAK,YAAY;EACf,MAAM,MAAMC,+BAAW;EACvB,IAAIC,uBAAO,UAAU,GAAG,GACtB,OAAOA,uBAAO,KAAK,EACjB,SAAS,2CACX,CAAC;EAEH,MAAM,EAAE,WAAW,WAAW,IAAI;EAElC,MAAM,QAAQ,MAAM,IAAIC,mCAAe,CAAC,CAAC,IAAI,SAAS;EACtD,IAAI,UAAU,QAAW;GAEvB,MAAM,QAAQ,CACZ,gBAFU,MAAM,QAAQ,SAAS,MAAM,QAAQ,QAAQ,MAAM,QAEzC,IACpB,GAAI,UAAU,OACV,CAAC,kEAAkE,IACnE,CAAC,CACP;GACA,OAAOD,uBAAO,QAAQ;IAEpB,MAAM;KACJ,eAAe;KACf,QAAQ;KACR,QAAQ;KACR,SAAS,MAAM;KACf,MAAM,MAAM,QAAQ;KACpB,OAAO,MAAM,QAAQ;KACrB,OAAO,MAAM;IACf;IACA,YAAY,MAAM,KAAK,IAAI;GAC7B,CAAC;EACH;EAEA,IAAI,UAAU,MACZ,OAAOA,uBAAO,QAAQ;GACpB,MAAM;IAAE,eAAe;IAAM,QAAQ;GAAU;GAC/C,YAAY;EACd,CAAC;EAGH,OAAOA,uBAAO,KAAK;GACjB,SACE;GACF,UAAU;EACZ,CAAC;CACH;AACF,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { t as defineCommand } from "./cli/main.mjs";
2
2
  import { i as globalArgs } from "./shared-CZZimGxc.mjs";
3
- import { n as resolveEnv, t as FileTokenStore } from "./token-store-reCGF86F.mjs";
3
+ import { n as resolveEnv, t as FileTokenStore } from "./token-store-C2r7cFA-.mjs";
4
4
  import { Result } from "@praha/byethrow";
5
5
 
6
6
  //#region src/cli/commands/auth/status.ts
@@ -46,4 +46,4 @@ var status_default = defineCommand({
46
46
 
47
47
  //#endregion
48
48
  export { status_default as default };
49
- //# sourceMappingURL=status-fWqXzV0P.mjs.map
49
+ //# sourceMappingURL=status-D7nOW3R3.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"status-fWqXzV0P.mjs","names":[],"sources":["../src/cli/commands/auth/status.ts"],"sourcesContent":["import { Result } from \"@praha/byethrow\";\nimport { defineCommand } from \"../define-command.js\";\nimport { globalArgs } from \"../shared.js\";\nimport { resolveEnv } from \"../../env.js\";\nimport { FileTokenStore } from \"../../auth/token-store.js\";\n\nexport default defineCommand({\n meta: {\n name: \"status\",\n description: \"Show the current authentication status\",\n },\n args: { ...globalArgs },\n run: async () => {\n const env = resolveEnv();\n if (Result.isFailure(env)) {\n return Result.fail({\n message: \"Invalid Orizm environment configuration.\",\n });\n }\n const { issuerUrl, apiKey } = env.value;\n\n const entry = await new FileTokenStore().get(issuerUrl);\n if (entry !== undefined) {\n const who = entry.profile.email ?? entry.profile.name ?? entry.subject;\n const lines = [\n `Signed in as ${who}.`,\n ...(apiKey != null\n ? [\" ORIZM_API_KEY is also set, but your signed-in session is used.\"]\n : []),\n ];\n return Result.succeed({\n // 細かな技術項目はスクリプト連携向けに --json でだけ提供する。\n json: {\n authenticated: true,\n method: \"oauth2\",\n issuer: issuerUrl,\n subject: entry.subject,\n name: entry.profile.name,\n email: entry.profile.email,\n scope: entry.scope,\n },\n text: () => lines.join(\"\\n\"),\n });\n }\n\n if (apiKey != null) {\n return Result.succeed({\n json: { authenticated: true, method: \"api-key\" },\n text: () => \"Signed in using ORIZM_API_KEY.\",\n });\n }\n\n return Result.fail({\n message:\n \"Not authenticated. Run `orizm auth login`, or set ORIZM_API_KEY.\",\n exitCode: 1,\n });\n },\n});\n"],"mappings":";;;;;;AAMA,qBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM,EAAE,GAAG,WAAW;CACtB,KAAK,YAAY;EACf,MAAM,MAAM,WAAW;EACvB,IAAI,OAAO,UAAU,GAAG,GACtB,OAAO,OAAO,KAAK,EACjB,SAAS,2CACX,CAAC;EAEH,MAAM,EAAE,WAAW,WAAW,IAAI;EAElC,MAAM,QAAQ,MAAM,IAAI,eAAe,CAAC,CAAC,IAAI,SAAS;EACtD,IAAI,UAAU,QAAW;GAEvB,MAAM,QAAQ,CACZ,gBAFU,MAAM,QAAQ,SAAS,MAAM,QAAQ,QAAQ,MAAM,QAEzC,IACpB,GAAI,UAAU,OACV,CAAC,kEAAkE,IACnE,CAAC,CACP;GACA,OAAO,OAAO,QAAQ;IAEpB,MAAM;KACJ,eAAe;KACf,QAAQ;KACR,QAAQ;KACR,SAAS,MAAM;KACf,MAAM,MAAM,QAAQ;KACpB,OAAO,MAAM,QAAQ;KACrB,OAAO,MAAM;IACf;IACA,YAAY,MAAM,KAAK,IAAI;GAC7B,CAAC;EACH;EAEA,IAAI,UAAU,MACZ,OAAO,OAAO,QAAQ;GACpB,MAAM;IAAE,eAAe;IAAM,QAAQ;GAAU;GAC/C,YAAY;EACd,CAAC;EAGH,OAAO,OAAO,KAAK;GACjB,SACE;GACF,UAAU;EACZ,CAAC;CACH;AACF,CAAC"}
1
+ {"version":3,"file":"status-D7nOW3R3.mjs","names":[],"sources":["../src/cli/commands/auth/status.ts"],"sourcesContent":["import { Result } from \"@praha/byethrow\";\nimport { defineCommand } from \"../define-command.js\";\nimport { globalArgs } from \"../shared.js\";\nimport { resolveEnv } from \"../../env.js\";\nimport { FileTokenStore } from \"../../auth/token-store.js\";\n\nexport default defineCommand({\n meta: {\n name: \"status\",\n description: \"Show the current authentication status\",\n },\n args: { ...globalArgs },\n run: async () => {\n const env = resolveEnv();\n if (Result.isFailure(env)) {\n return Result.fail({\n message: \"Invalid Orizm environment configuration.\",\n });\n }\n const { issuerUrl, apiKey } = env.value;\n\n const entry = await new FileTokenStore().get(issuerUrl);\n if (entry !== undefined) {\n const who = entry.profile.email ?? entry.profile.name ?? entry.subject;\n const lines = [\n `Signed in as ${who}.`,\n ...(apiKey != null\n ? [\" ORIZM_API_KEY is also set, but your signed-in session is used.\"]\n : []),\n ];\n return Result.succeed({\n // 細かな技術項目はスクリプト連携向けに --json でだけ提供する。\n json: {\n authenticated: true,\n method: \"oauth2\",\n issuer: issuerUrl,\n subject: entry.subject,\n name: entry.profile.name,\n email: entry.profile.email,\n scope: entry.scope,\n },\n text: () => lines.join(\"\\n\"),\n });\n }\n\n if (apiKey != null) {\n return Result.succeed({\n json: { authenticated: true, method: \"api-key\" },\n text: () => \"Signed in using ORIZM_API_KEY.\",\n });\n }\n\n return Result.fail({\n message:\n \"Not authenticated. Run `orizm auth login`, or set ORIZM_API_KEY.\",\n exitCode: 1,\n });\n },\n});\n"],"mappings":";;;;;;AAMA,qBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM,EAAE,GAAG,WAAW;CACtB,KAAK,YAAY;EACf,MAAM,MAAM,WAAW;EACvB,IAAI,OAAO,UAAU,GAAG,GACtB,OAAO,OAAO,KAAK,EACjB,SAAS,2CACX,CAAC;EAEH,MAAM,EAAE,WAAW,WAAW,IAAI;EAElC,MAAM,QAAQ,MAAM,IAAI,eAAe,CAAC,CAAC,IAAI,SAAS;EACtD,IAAI,UAAU,QAAW;GAEvB,MAAM,QAAQ,CACZ,gBAFU,MAAM,QAAQ,SAAS,MAAM,QAAQ,QAAQ,MAAM,QAEzC,IACpB,GAAI,UAAU,OACV,CAAC,kEAAkE,IACnE,CAAC,CACP;GACA,OAAO,OAAO,QAAQ;IAEpB,MAAM;KACJ,eAAe;KACf,QAAQ;KACR,QAAQ;KACR,SAAS,MAAM;KACf,MAAM,MAAM,QAAQ;KACpB,OAAO,MAAM,QAAQ;KACrB,OAAO,MAAM;IACf;IACA,YAAY,MAAM,KAAK,IAAI;GAC7B,CAAC;EACH;EAEA,IAAI,UAAU,MACZ,OAAO,OAAO,QAAQ;GACpB,MAAM;IAAE,eAAe;IAAM,QAAQ;GAAU;GAC/C,YAAY;EACd,CAAC;EAGH,OAAO,OAAO,KAAK;GACjB,SACE;GACF,UAAU;EACZ,CAAC;CACH;AACF,CAAC"}
@@ -2,11 +2,11 @@ const require_cli_main = require('./cli/main.cjs');
2
2
  let _praha_byethrow = require("@praha/byethrow");
3
3
  let valibot = require("valibot");
4
4
  valibot = require_cli_main.__toESM(valibot, 1);
5
+ let node_path = require("node:path");
6
+ node_path = require_cli_main.__toESM(node_path, 1);
5
7
  let node_fs_promises = require("node:fs/promises");
6
8
  let node_os = require("node:os");
7
9
  node_os = require_cli_main.__toESM(node_os, 1);
8
- let node_path = require("node:path");
9
- node_path = require_cli_main.__toESM(node_path, 1);
10
10
 
11
11
  //#region src/cli/env.ts
12
12
  const DEFAULT_BASE_URL = "https://app.orizm.com";
@@ -136,4 +136,4 @@ Object.defineProperty(exports, 'resolveEnv', {
136
136
  return resolveEnv;
137
137
  }
138
138
  });
139
- //# sourceMappingURL=token-store--9GYVL7N.cjs.map
139
+ //# sourceMappingURL=token-store-BgWGhqq0.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"token-store--9GYVL7N.cjs","names":["v","Result","v","#dir","#file","path","#read","#write","os"],"sources":["../src/cli/env.ts","../src/cli/auth/token-store.ts"],"sourcesContent":["import * as v from \"valibot\";\nimport { Result } from \"@praha/byethrow\";\n\nexport const DEFAULT_BASE_URL = \"https://app.orizm.com\";\n\nexport type ResolvedEnv = {\n baseUrl: string;\n // OAuth2 issuer。ローカルで Hydra が別ポートのときだけ ORIZM_OAUTH_ISSUER_URL で上書きし、\n // 省略時は baseUrl と同じ。トークンストアの namespace キーともこの値で一致させる。\n issuerUrl: string;\n apiKey: string | undefined;\n project: string | undefined;\n};\n\nexport type EnvError = { type: \"invalid_env\"; issues: v.BaseIssue<unknown>[] };\n\nconst trimmedUrl = v.pipe(\n v.string(),\n v.url(),\n // 末尾スラッシュの有無で issuer namespace キーがブレないよう正規化する。\n v.transform((value) => value.replace(/\\/+$/, \"\")),\n);\n\nconst nonEmpty = v.pipe(v.string(), v.nonEmpty());\n\nconst EnvSchema = v.object({\n ORIZM_BASE_URL: v.optional(trimmedUrl, DEFAULT_BASE_URL),\n ORIZM_OAUTH_ISSUER_URL: v.optional(trimmedUrl),\n ORIZM_API_KEY: v.optional(nonEmpty),\n ORIZM_PROJECT: v.optional(nonEmpty),\n});\n\n// 空文字 / 空白のみの環境変数は未設定と同じ扱いにする(v.optional のデフォルト適用を働かせる)。\nfunction normalize(raw: string | undefined): string | undefined {\n if (raw === undefined) return undefined;\n const trimmed = raw.trim();\n return trimmed === \"\" ? undefined : trimmed;\n}\n\nexport function resolveEnv(\n source: NodeJS.ProcessEnv = process.env,\n): Result.Result<ResolvedEnv, EnvError> {\n const parsed = v.safeParse(EnvSchema, {\n ORIZM_BASE_URL: normalize(source.ORIZM_BASE_URL),\n ORIZM_OAUTH_ISSUER_URL: normalize(source.ORIZM_OAUTH_ISSUER_URL),\n ORIZM_API_KEY: normalize(source.ORIZM_API_KEY),\n ORIZM_PROJECT: normalize(source.ORIZM_PROJECT),\n });\n\n if (!parsed.success) {\n return Result.fail({ type: \"invalid_env\", issues: parsed.issues });\n }\n\n const {\n ORIZM_BASE_URL,\n ORIZM_OAUTH_ISSUER_URL,\n ORIZM_API_KEY,\n ORIZM_PROJECT,\n } = parsed.output;\n\n return Result.succeed({\n baseUrl: ORIZM_BASE_URL,\n issuerUrl: ORIZM_OAUTH_ISSUER_URL ?? ORIZM_BASE_URL,\n apiKey: ORIZM_API_KEY,\n project: ORIZM_PROJECT,\n });\n}\n","import {\n mkdir,\n readFile,\n rename,\n rm,\n writeFile,\n chmod,\n} from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport * as v from \"valibot\";\n\nconst TokenEntrySchema = v.object({\n accessToken: v.string(),\n refreshToken: v.string(),\n idToken: v.string(),\n // ISO8601。リフレッシュ要否の判定(残り 60 秒以下)に使う。\n expiresAt: v.string(),\n scope: v.string(),\n subject: v.string(),\n profile: v.object({\n name: v.optional(v.string()),\n email: v.optional(v.string()),\n }),\n});\n\nconst AuthFileSchema = v.object({\n issuers: v.record(v.string(), TokenEntrySchema),\n});\n\nexport type TokenEntry = v.InferOutput<typeof TokenEntrySchema>;\ntype AuthFile = v.InferOutput<typeof AuthFileSchema>;\n\nexport type TokenStore = {\n get(issuer: string): Promise<TokenEntry | undefined>;\n set(issuer: string, entry: TokenEntry): Promise<void>;\n remove(issuer: string): Promise<void>;\n};\n\n// 実装が 1 つでも、後で OS keychain など別の保管先に差し替えられるよう interface に寄せておく。\nexport class FileTokenStore implements TokenStore {\n readonly #dir: string;\n readonly #file: string;\n\n constructor(dir: string = defaultAuthDir()) {\n this.#dir = dir;\n this.#file = path.join(dir, \"auth.json\");\n }\n\n async get(issuer: string): Promise<TokenEntry | undefined> {\n const file = await this.#read();\n return file.issuers[issuer];\n }\n\n async set(issuer: string, entry: TokenEntry): Promise<void> {\n const file = await this.#read();\n file.issuers[issuer] = entry;\n await this.#write(file);\n }\n\n async remove(issuer: string): Promise<void> {\n const file = await this.#read();\n if (file.issuers[issuer] === undefined) return;\n file.issuers = Object.fromEntries(\n Object.entries(file.issuers).filter(([key]) => key !== issuer),\n );\n await this.#write(file);\n }\n\n async #read(): Promise<AuthFile> {\n const raw = await readFile(this.#file, \"utf-8\").catch(\n (error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") return undefined;\n throw error;\n },\n );\n if (raw === undefined) return { issuers: {} };\n\n const parsed = v.safeParse(AuthFileSchema, safeJsonParse(raw));\n if (!parsed.success) {\n throw new Error(`Malformed auth file: ${this.#file}`);\n }\n return parsed.output;\n }\n\n // Refresh Token rotation の途中でクラッシュしても token を失わないよう、\n // 一時ファイルへ書いてから rename で差し替える。\n async #write(file: AuthFile): Promise<void> {\n await mkdir(this.#dir, { recursive: true, mode: 0o700 });\n const temp = path.join(\n this.#dir,\n `auth.json.${globalThis.crypto.randomUUID()}.tmp`,\n );\n await writeFile(temp, JSON.stringify(file, null, 2), {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n if (process.platform !== \"win32\") {\n // umask の影響を受けないよう作成後に明示設定する。Windows は OS 既定 ACL に委ねる。\n await chmod(temp, 0o600);\n }\n await rename(temp, this.#file).catch(async (error: unknown) => {\n await rm(temp, { force: true });\n throw error;\n });\n }\n}\n\nexport function defaultAuthDir(): string {\n if (process.platform === \"win32\") {\n const appData =\n process.env.APPDATA ?? path.join(os.homedir(), \"AppData\", \"Roaming\");\n return path.join(appData, \"orizm\");\n }\n const xdg = process.env.XDG_CONFIG_HOME;\n const base =\n xdg != null && xdg !== \"\" ? xdg : path.join(os.homedir(), \".config\");\n return path.join(base, \"orizm\");\n}\n\nfunction safeJsonParse(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"token-store-BgWGhqq0.cjs","names":["v","Result","v","#dir","#file","path","#read","#write","os"],"sources":["../src/cli/env.ts","../src/cli/auth/token-store.ts"],"sourcesContent":["import * as v from \"valibot\";\nimport { Result } from \"@praha/byethrow\";\n\nexport const DEFAULT_BASE_URL = \"https://app.orizm.com\";\n\nexport type ResolvedEnv = {\n baseUrl: string;\n // OAuth2 issuer。ローカルで Hydra が別ポートのときだけ ORIZM_OAUTH_ISSUER_URL で上書きし、\n // 省略時は baseUrl と同じ。トークンストアの namespace キーともこの値で一致させる。\n issuerUrl: string;\n apiKey: string | undefined;\n project: string | undefined;\n};\n\nexport type EnvError = { type: \"invalid_env\"; issues: v.BaseIssue<unknown>[] };\n\nconst trimmedUrl = v.pipe(\n v.string(),\n v.url(),\n // 末尾スラッシュの有無で issuer namespace キーがブレないよう正規化する。\n v.transform((value) => value.replace(/\\/+$/, \"\")),\n);\n\nconst nonEmpty = v.pipe(v.string(), v.nonEmpty());\n\nconst EnvSchema = v.object({\n ORIZM_BASE_URL: v.optional(trimmedUrl, DEFAULT_BASE_URL),\n ORIZM_OAUTH_ISSUER_URL: v.optional(trimmedUrl),\n ORIZM_API_KEY: v.optional(nonEmpty),\n ORIZM_PROJECT: v.optional(nonEmpty),\n});\n\n// 空文字 / 空白のみの環境変数は未設定と同じ扱いにする(v.optional のデフォルト適用を働かせる)。\nfunction normalize(raw: string | undefined): string | undefined {\n if (raw === undefined) return undefined;\n const trimmed = raw.trim();\n return trimmed === \"\" ? undefined : trimmed;\n}\n\nexport function resolveEnv(\n source: NodeJS.ProcessEnv = process.env,\n): Result.Result<ResolvedEnv, EnvError> {\n const parsed = v.safeParse(EnvSchema, {\n ORIZM_BASE_URL: normalize(source.ORIZM_BASE_URL),\n ORIZM_OAUTH_ISSUER_URL: normalize(source.ORIZM_OAUTH_ISSUER_URL),\n ORIZM_API_KEY: normalize(source.ORIZM_API_KEY),\n ORIZM_PROJECT: normalize(source.ORIZM_PROJECT),\n });\n\n if (!parsed.success) {\n return Result.fail({ type: \"invalid_env\", issues: parsed.issues });\n }\n\n const {\n ORIZM_BASE_URL,\n ORIZM_OAUTH_ISSUER_URL,\n ORIZM_API_KEY,\n ORIZM_PROJECT,\n } = parsed.output;\n\n return Result.succeed({\n baseUrl: ORIZM_BASE_URL,\n issuerUrl: ORIZM_OAUTH_ISSUER_URL ?? ORIZM_BASE_URL,\n apiKey: ORIZM_API_KEY,\n project: ORIZM_PROJECT,\n });\n}\n","import {\n mkdir,\n readFile,\n rename,\n rm,\n writeFile,\n chmod,\n} from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport * as v from \"valibot\";\n\nconst TokenEntrySchema = v.object({\n accessToken: v.string(),\n refreshToken: v.string(),\n idToken: v.string(),\n // ISO8601。リフレッシュ要否の判定(残り 60 秒以下)に使う。\n expiresAt: v.string(),\n scope: v.string(),\n subject: v.string(),\n profile: v.object({\n name: v.optional(v.string()),\n email: v.optional(v.string()),\n }),\n});\n\nconst AuthFileSchema = v.object({\n issuers: v.record(v.string(), TokenEntrySchema),\n});\n\nexport type TokenEntry = v.InferOutput<typeof TokenEntrySchema>;\ntype AuthFile = v.InferOutput<typeof AuthFileSchema>;\n\nexport type TokenStore = {\n get(issuer: string): Promise<TokenEntry | undefined>;\n set(issuer: string, entry: TokenEntry): Promise<void>;\n remove(issuer: string): Promise<void>;\n};\n\n// 実装が 1 つでも、後で OS keychain など別の保管先に差し替えられるよう interface に寄せておく。\nexport class FileTokenStore implements TokenStore {\n readonly #dir: string;\n readonly #file: string;\n\n constructor(dir: string = defaultAuthDir()) {\n this.#dir = dir;\n this.#file = path.join(dir, \"auth.json\");\n }\n\n async get(issuer: string): Promise<TokenEntry | undefined> {\n const file = await this.#read();\n return file.issuers[issuer];\n }\n\n async set(issuer: string, entry: TokenEntry): Promise<void> {\n const file = await this.#read();\n file.issuers[issuer] = entry;\n await this.#write(file);\n }\n\n async remove(issuer: string): Promise<void> {\n const file = await this.#read();\n if (file.issuers[issuer] === undefined) return;\n file.issuers = Object.fromEntries(\n Object.entries(file.issuers).filter(([key]) => key !== issuer),\n );\n await this.#write(file);\n }\n\n async #read(): Promise<AuthFile> {\n const raw = await readFile(this.#file, \"utf-8\").catch(\n (error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") return undefined;\n throw error;\n },\n );\n if (raw === undefined) return { issuers: {} };\n\n const parsed = v.safeParse(AuthFileSchema, safeJsonParse(raw));\n if (!parsed.success) {\n throw new Error(`Malformed auth file: ${this.#file}`);\n }\n return parsed.output;\n }\n\n // Refresh Token rotation の途中でクラッシュしても token を失わないよう、\n // 一時ファイルへ書いてから rename で差し替える。\n async #write(file: AuthFile): Promise<void> {\n await mkdir(this.#dir, { recursive: true, mode: 0o700 });\n const temp = path.join(\n this.#dir,\n `auth.json.${globalThis.crypto.randomUUID()}.tmp`,\n );\n await writeFile(temp, JSON.stringify(file, null, 2), {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n if (process.platform !== \"win32\") {\n // umask の影響を受けないよう作成後に明示設定する。Windows は OS 既定 ACL に委ねる。\n await chmod(temp, 0o600);\n }\n await rename(temp, this.#file).catch(async (error: unknown) => {\n await rm(temp, { force: true });\n throw error;\n });\n }\n}\n\nexport function defaultAuthDir(): string {\n if (process.platform === \"win32\") {\n const appData =\n process.env.APPDATA ?? path.join(os.homedir(), \"AppData\", \"Roaming\");\n return path.join(appData, \"orizm\");\n }\n const xdg = process.env.XDG_CONFIG_HOME;\n const base =\n xdg != null && xdg !== \"\" ? xdg : path.join(os.homedir(), \".config\");\n return path.join(base, \"orizm\");\n}\n\nfunction safeJsonParse(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { Result } from "@praha/byethrow";
2
2
  import * as v from "valibot";
3
+ import path from "node:path";
3
4
  import { chmod, mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
4
5
  import os from "node:os";
5
- import path from "node:path";
6
6
 
7
7
  //#region src/cli/env.ts
8
8
  const DEFAULT_BASE_URL = "https://app.orizm.com";
@@ -121,4 +121,4 @@ function safeJsonParse(raw) {
121
121
 
122
122
  //#endregion
123
123
  export { resolveEnv as n, FileTokenStore as t };
124
- //# sourceMappingURL=token-store-reCGF86F.mjs.map
124
+ //# sourceMappingURL=token-store-C2r7cFA-.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"token-store-reCGF86F.mjs","names":["#dir","#file","#read","#write"],"sources":["../src/cli/env.ts","../src/cli/auth/token-store.ts"],"sourcesContent":["import * as v from \"valibot\";\nimport { Result } from \"@praha/byethrow\";\n\nexport const DEFAULT_BASE_URL = \"https://app.orizm.com\";\n\nexport type ResolvedEnv = {\n baseUrl: string;\n // OAuth2 issuer。ローカルで Hydra が別ポートのときだけ ORIZM_OAUTH_ISSUER_URL で上書きし、\n // 省略時は baseUrl と同じ。トークンストアの namespace キーともこの値で一致させる。\n issuerUrl: string;\n apiKey: string | undefined;\n project: string | undefined;\n};\n\nexport type EnvError = { type: \"invalid_env\"; issues: v.BaseIssue<unknown>[] };\n\nconst trimmedUrl = v.pipe(\n v.string(),\n v.url(),\n // 末尾スラッシュの有無で issuer namespace キーがブレないよう正規化する。\n v.transform((value) => value.replace(/\\/+$/, \"\")),\n);\n\nconst nonEmpty = v.pipe(v.string(), v.nonEmpty());\n\nconst EnvSchema = v.object({\n ORIZM_BASE_URL: v.optional(trimmedUrl, DEFAULT_BASE_URL),\n ORIZM_OAUTH_ISSUER_URL: v.optional(trimmedUrl),\n ORIZM_API_KEY: v.optional(nonEmpty),\n ORIZM_PROJECT: v.optional(nonEmpty),\n});\n\n// 空文字 / 空白のみの環境変数は未設定と同じ扱いにする(v.optional のデフォルト適用を働かせる)。\nfunction normalize(raw: string | undefined): string | undefined {\n if (raw === undefined) return undefined;\n const trimmed = raw.trim();\n return trimmed === \"\" ? undefined : trimmed;\n}\n\nexport function resolveEnv(\n source: NodeJS.ProcessEnv = process.env,\n): Result.Result<ResolvedEnv, EnvError> {\n const parsed = v.safeParse(EnvSchema, {\n ORIZM_BASE_URL: normalize(source.ORIZM_BASE_URL),\n ORIZM_OAUTH_ISSUER_URL: normalize(source.ORIZM_OAUTH_ISSUER_URL),\n ORIZM_API_KEY: normalize(source.ORIZM_API_KEY),\n ORIZM_PROJECT: normalize(source.ORIZM_PROJECT),\n });\n\n if (!parsed.success) {\n return Result.fail({ type: \"invalid_env\", issues: parsed.issues });\n }\n\n const {\n ORIZM_BASE_URL,\n ORIZM_OAUTH_ISSUER_URL,\n ORIZM_API_KEY,\n ORIZM_PROJECT,\n } = parsed.output;\n\n return Result.succeed({\n baseUrl: ORIZM_BASE_URL,\n issuerUrl: ORIZM_OAUTH_ISSUER_URL ?? ORIZM_BASE_URL,\n apiKey: ORIZM_API_KEY,\n project: ORIZM_PROJECT,\n });\n}\n","import {\n mkdir,\n readFile,\n rename,\n rm,\n writeFile,\n chmod,\n} from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport * as v from \"valibot\";\n\nconst TokenEntrySchema = v.object({\n accessToken: v.string(),\n refreshToken: v.string(),\n idToken: v.string(),\n // ISO8601。リフレッシュ要否の判定(残り 60 秒以下)に使う。\n expiresAt: v.string(),\n scope: v.string(),\n subject: v.string(),\n profile: v.object({\n name: v.optional(v.string()),\n email: v.optional(v.string()),\n }),\n});\n\nconst AuthFileSchema = v.object({\n issuers: v.record(v.string(), TokenEntrySchema),\n});\n\nexport type TokenEntry = v.InferOutput<typeof TokenEntrySchema>;\ntype AuthFile = v.InferOutput<typeof AuthFileSchema>;\n\nexport type TokenStore = {\n get(issuer: string): Promise<TokenEntry | undefined>;\n set(issuer: string, entry: TokenEntry): Promise<void>;\n remove(issuer: string): Promise<void>;\n};\n\n// 実装が 1 つでも、後で OS keychain など別の保管先に差し替えられるよう interface に寄せておく。\nexport class FileTokenStore implements TokenStore {\n readonly #dir: string;\n readonly #file: string;\n\n constructor(dir: string = defaultAuthDir()) {\n this.#dir = dir;\n this.#file = path.join(dir, \"auth.json\");\n }\n\n async get(issuer: string): Promise<TokenEntry | undefined> {\n const file = await this.#read();\n return file.issuers[issuer];\n }\n\n async set(issuer: string, entry: TokenEntry): Promise<void> {\n const file = await this.#read();\n file.issuers[issuer] = entry;\n await this.#write(file);\n }\n\n async remove(issuer: string): Promise<void> {\n const file = await this.#read();\n if (file.issuers[issuer] === undefined) return;\n file.issuers = Object.fromEntries(\n Object.entries(file.issuers).filter(([key]) => key !== issuer),\n );\n await this.#write(file);\n }\n\n async #read(): Promise<AuthFile> {\n const raw = await readFile(this.#file, \"utf-8\").catch(\n (error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") return undefined;\n throw error;\n },\n );\n if (raw === undefined) return { issuers: {} };\n\n const parsed = v.safeParse(AuthFileSchema, safeJsonParse(raw));\n if (!parsed.success) {\n throw new Error(`Malformed auth file: ${this.#file}`);\n }\n return parsed.output;\n }\n\n // Refresh Token rotation の途中でクラッシュしても token を失わないよう、\n // 一時ファイルへ書いてから rename で差し替える。\n async #write(file: AuthFile): Promise<void> {\n await mkdir(this.#dir, { recursive: true, mode: 0o700 });\n const temp = path.join(\n this.#dir,\n `auth.json.${globalThis.crypto.randomUUID()}.tmp`,\n );\n await writeFile(temp, JSON.stringify(file, null, 2), {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n if (process.platform !== \"win32\") {\n // umask の影響を受けないよう作成後に明示設定する。Windows は OS 既定 ACL に委ねる。\n await chmod(temp, 0o600);\n }\n await rename(temp, this.#file).catch(async (error: unknown) => {\n await rm(temp, { force: true });\n throw error;\n });\n }\n}\n\nexport function defaultAuthDir(): string {\n if (process.platform === \"win32\") {\n const appData =\n process.env.APPDATA ?? path.join(os.homedir(), \"AppData\", \"Roaming\");\n return path.join(appData, \"orizm\");\n }\n const xdg = process.env.XDG_CONFIG_HOME;\n const base =\n xdg != null && xdg !== \"\" ? xdg : path.join(os.homedir(), \".config\");\n return path.join(base, \"orizm\");\n}\n\nfunction safeJsonParse(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"token-store-C2r7cFA-.mjs","names":["#dir","#file","#read","#write"],"sources":["../src/cli/env.ts","../src/cli/auth/token-store.ts"],"sourcesContent":["import * as v from \"valibot\";\nimport { Result } from \"@praha/byethrow\";\n\nexport const DEFAULT_BASE_URL = \"https://app.orizm.com\";\n\nexport type ResolvedEnv = {\n baseUrl: string;\n // OAuth2 issuer。ローカルで Hydra が別ポートのときだけ ORIZM_OAUTH_ISSUER_URL で上書きし、\n // 省略時は baseUrl と同じ。トークンストアの namespace キーともこの値で一致させる。\n issuerUrl: string;\n apiKey: string | undefined;\n project: string | undefined;\n};\n\nexport type EnvError = { type: \"invalid_env\"; issues: v.BaseIssue<unknown>[] };\n\nconst trimmedUrl = v.pipe(\n v.string(),\n v.url(),\n // 末尾スラッシュの有無で issuer namespace キーがブレないよう正規化する。\n v.transform((value) => value.replace(/\\/+$/, \"\")),\n);\n\nconst nonEmpty = v.pipe(v.string(), v.nonEmpty());\n\nconst EnvSchema = v.object({\n ORIZM_BASE_URL: v.optional(trimmedUrl, DEFAULT_BASE_URL),\n ORIZM_OAUTH_ISSUER_URL: v.optional(trimmedUrl),\n ORIZM_API_KEY: v.optional(nonEmpty),\n ORIZM_PROJECT: v.optional(nonEmpty),\n});\n\n// 空文字 / 空白のみの環境変数は未設定と同じ扱いにする(v.optional のデフォルト適用を働かせる)。\nfunction normalize(raw: string | undefined): string | undefined {\n if (raw === undefined) return undefined;\n const trimmed = raw.trim();\n return trimmed === \"\" ? undefined : trimmed;\n}\n\nexport function resolveEnv(\n source: NodeJS.ProcessEnv = process.env,\n): Result.Result<ResolvedEnv, EnvError> {\n const parsed = v.safeParse(EnvSchema, {\n ORIZM_BASE_URL: normalize(source.ORIZM_BASE_URL),\n ORIZM_OAUTH_ISSUER_URL: normalize(source.ORIZM_OAUTH_ISSUER_URL),\n ORIZM_API_KEY: normalize(source.ORIZM_API_KEY),\n ORIZM_PROJECT: normalize(source.ORIZM_PROJECT),\n });\n\n if (!parsed.success) {\n return Result.fail({ type: \"invalid_env\", issues: parsed.issues });\n }\n\n const {\n ORIZM_BASE_URL,\n ORIZM_OAUTH_ISSUER_URL,\n ORIZM_API_KEY,\n ORIZM_PROJECT,\n } = parsed.output;\n\n return Result.succeed({\n baseUrl: ORIZM_BASE_URL,\n issuerUrl: ORIZM_OAUTH_ISSUER_URL ?? ORIZM_BASE_URL,\n apiKey: ORIZM_API_KEY,\n project: ORIZM_PROJECT,\n });\n}\n","import {\n mkdir,\n readFile,\n rename,\n rm,\n writeFile,\n chmod,\n} from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport * as v from \"valibot\";\n\nconst TokenEntrySchema = v.object({\n accessToken: v.string(),\n refreshToken: v.string(),\n idToken: v.string(),\n // ISO8601。リフレッシュ要否の判定(残り 60 秒以下)に使う。\n expiresAt: v.string(),\n scope: v.string(),\n subject: v.string(),\n profile: v.object({\n name: v.optional(v.string()),\n email: v.optional(v.string()),\n }),\n});\n\nconst AuthFileSchema = v.object({\n issuers: v.record(v.string(), TokenEntrySchema),\n});\n\nexport type TokenEntry = v.InferOutput<typeof TokenEntrySchema>;\ntype AuthFile = v.InferOutput<typeof AuthFileSchema>;\n\nexport type TokenStore = {\n get(issuer: string): Promise<TokenEntry | undefined>;\n set(issuer: string, entry: TokenEntry): Promise<void>;\n remove(issuer: string): Promise<void>;\n};\n\n// 実装が 1 つでも、後で OS keychain など別の保管先に差し替えられるよう interface に寄せておく。\nexport class FileTokenStore implements TokenStore {\n readonly #dir: string;\n readonly #file: string;\n\n constructor(dir: string = defaultAuthDir()) {\n this.#dir = dir;\n this.#file = path.join(dir, \"auth.json\");\n }\n\n async get(issuer: string): Promise<TokenEntry | undefined> {\n const file = await this.#read();\n return file.issuers[issuer];\n }\n\n async set(issuer: string, entry: TokenEntry): Promise<void> {\n const file = await this.#read();\n file.issuers[issuer] = entry;\n await this.#write(file);\n }\n\n async remove(issuer: string): Promise<void> {\n const file = await this.#read();\n if (file.issuers[issuer] === undefined) return;\n file.issuers = Object.fromEntries(\n Object.entries(file.issuers).filter(([key]) => key !== issuer),\n );\n await this.#write(file);\n }\n\n async #read(): Promise<AuthFile> {\n const raw = await readFile(this.#file, \"utf-8\").catch(\n (error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") return undefined;\n throw error;\n },\n );\n if (raw === undefined) return { issuers: {} };\n\n const parsed = v.safeParse(AuthFileSchema, safeJsonParse(raw));\n if (!parsed.success) {\n throw new Error(`Malformed auth file: ${this.#file}`);\n }\n return parsed.output;\n }\n\n // Refresh Token rotation の途中でクラッシュしても token を失わないよう、\n // 一時ファイルへ書いてから rename で差し替える。\n async #write(file: AuthFile): Promise<void> {\n await mkdir(this.#dir, { recursive: true, mode: 0o700 });\n const temp = path.join(\n this.#dir,\n `auth.json.${globalThis.crypto.randomUUID()}.tmp`,\n );\n await writeFile(temp, JSON.stringify(file, null, 2), {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n if (process.platform !== \"win32\") {\n // umask の影響を受けないよう作成後に明示設定する。Windows は OS 既定 ACL に委ねる。\n await chmod(temp, 0o600);\n }\n await rename(temp, this.#file).catch(async (error: unknown) => {\n await rm(temp, { force: true });\n throw error;\n });\n }\n}\n\nexport function defaultAuthDir(): string {\n if (process.platform === \"win32\") {\n const appData =\n process.env.APPDATA ?? path.join(os.homedir(), \"AppData\", \"Roaming\");\n return path.join(appData, \"orizm\");\n }\n const xdg = process.env.XDG_CONFIG_HOME;\n const base =\n xdg != null && xdg !== \"\" ? xdg : path.join(os.homedir(), \".config\");\n return path.join(base, \"orizm\");\n}\n\nfunction safeJsonParse(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { t as defineCommand } from "./cli/main.mjs";
2
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";
3
+ import { a as apiErrorFailure, c as toResult, n as runWithContext } from "./run-with-context-B4DyI8Wo.mjs";
4
4
  import { t as renderDetail } from "./detail-DN5jCQ4N.mjs";
5
5
  import { f as parseRepeatableFlag, t as collectRepeatableFlag } from "./parse-DA0k5AHa.mjs";
6
6
  import { r as resolveArrayUpdate } from "./array-update-CMFUoQEe.mjs";
@@ -106,4 +106,4 @@ var update_default = defineCommand({
106
106
 
107
107
  //#endregion
108
108
  export { update_default as default };
109
- //# sourceMappingURL=update-B4lv4dAz.mjs.map
109
+ //# sourceMappingURL=update-8-sHFvNB.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"update-B4lv4dAz.mjs","names":[],"sources":["../src/cli/commands/project-user/update.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 { renderDetail } from \"../../ui/detail.js\";\nimport { collectRepeatableFlag, parseRepeatableFlag } from \"../parse.js\";\nimport { resolveArrayUpdate, type ArrayUpdate } from \"../array-update.js\";\nimport {\n applyGroupRoleEdits,\n formatGroupRoles,\n warnMissingGroupRemovals,\n parseGroupRoles,\n type GroupRole,\n} from \"../group-roles.js\";\n\nexport async function projectUserUpdateHandler(\n ctx: CommandContext,\n options: {\n userId: string;\n name?: string;\n groupRoles: ArrayUpdate<GroupRole, string>;\n },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n if (options.name === undefined && options.groupRoles === undefined) {\n return Result.fail({\n message: \"Nothing to update. Pass --name or a --group-role option.\",\n });\n }\n\n // API は groupRoles の全置換しか受けないため、要素単位の編集は現状を取得してから組み立てる\n let groupRoles: GroupRole[] | undefined;\n if (options.groupRoles?.mode === \"edit\") {\n const current = toResult(\n await ctx.client.GET(\"/projects/{projectName}/users/{userId}\", {\n params: {\n path: { projectName: ctx.projectName, userId: options.userId },\n },\n }),\n );\n if (Result.isFailure(current)) return apiErrorFailure(current.error);\n warnMissingGroupRemovals(\n current.value.groupRoles,\n options.groupRoles.remove,\n );\n groupRoles = applyGroupRoleEdits(\n current.value.groupRoles,\n options.groupRoles,\n );\n } else if (options.groupRoles !== undefined) {\n groupRoles = options.groupRoles.items;\n }\n\n const body = {\n ...(options.name !== undefined ? { name: options.name } : {}),\n ...(groupRoles !== undefined ? { groupRoles } : {}),\n };\n\n const updated = toResult(\n await ctx.client.PUT(\"/projects/{projectName}/users/{userId}\", {\n params: {\n path: { projectName: ctx.projectName, userId: options.userId },\n },\n body,\n }),\n );\n if (Result.isFailure(updated)) return apiErrorFailure(updated.error);\n\n const value = updated.value;\n return Result.succeed({\n json: value,\n text: () =>\n renderDetail([\n [\"Updated\", value.id],\n [\"Name\", value.name],\n [\"Email\", value.email],\n [\"Group roles\", formatGroupRoles(value.groupRoles)],\n ]),\n });\n}\n\nconst updateArgs = {\n ...contextArgs,\n \"user-id\": {\n type: \"positional\",\n required: true,\n description: \"Project user ID\",\n },\n name: {\n type: \"string\",\n description: \"New display name\",\n },\n \"group-role\": {\n type: \"string\",\n description: \"Replace all RBAC assignments with <group>:<role>; repeatable\",\n },\n \"add-group-role\": {\n type: \"string\",\n description: \"Add an RBAC assignment as <group>:<role>; repeatable\",\n },\n \"remove-group-role\": {\n type: \"string\",\n description: \"Remove an RBAC assignment by group name; repeatable\",\n },\n \"clear-group-roles\": {\n type: \"boolean\",\n description: \"Remove all RBAC assignments\",\n default: false,\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"update\",\n description: \"Update a project user's name or group roles\",\n },\n args: updateArgs,\n run: async ({ args, rawArgs }) => {\n const replace = parseGroupRoles(\n \"group-role\",\n collectRepeatableFlag(rawArgs, \"group-role\"),\n );\n if (Result.isFailure(replace)) return replace;\n const added = parseGroupRoles(\n \"add-group-role\",\n collectRepeatableFlag(rawArgs, \"add-group-role\"),\n );\n if (Result.isFailure(added)) return added;\n const removeValues = collectRepeatableFlag(rawArgs, \"remove-group-role\");\n const removed =\n removeValues === undefined\n ? Result.succeed(undefined)\n : parseRepeatableFlag(\"remove-group-role\", removeValues);\n if (Result.isFailure(removed)) return removed;\n const groupRoles = resolveArrayUpdate({\n replaceFlag: \"group-role\",\n clearFlag: \"clear-group-roles\",\n editFlags: \"--add-group-role / --remove-group-role\",\n replace: replace.value,\n add: added.value,\n remove: removed.value,\n clear: args[\"clear-group-roles\"] === true,\n });\n if (Result.isFailure(groupRoles)) return groupRoles;\n\n return runWithContext(args, (ctx) =>\n projectUserUpdateHandler(ctx, {\n userId: args[\"user-id\"],\n name: typeof args.name === \"string\" ? args.name : undefined,\n groupRoles: groupRoles.value,\n }),\n );\n },\n});\n"],"mappings":";;;;;;;;;;AAsBA,eAAsB,yBACpB,KACA,SAKmE;CACnE,IAAI,QAAQ,SAAS,UAAa,QAAQ,eAAe,QACvD,OAAO,OAAO,KAAK,EACjB,SAAS,2DACX,CAAC;CAIH,IAAI;CACJ,IAAI,QAAQ,YAAY,SAAS,QAAQ;EACvC,MAAM,UAAU,SACd,MAAM,IAAI,OAAO,IAAI,0CAA0C,EAC7D,QAAQ,EACN,MAAM;GAAE,aAAa,IAAI;GAAa,QAAQ,QAAQ;EAAO,EAC/D,EACF,CAAC,CACH;EACA,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO,gBAAgB,QAAQ,KAAK;EACnE,yBACE,QAAQ,MAAM,YACd,QAAQ,WAAW,MACrB;EACA,aAAa,oBACX,QAAQ,MAAM,YACd,QAAQ,UACV;CACF,OAAO,IAAI,QAAQ,eAAe,QAChC,aAAa,QAAQ,WAAW;CAGlC,MAAM,OAAO;EACX,GAAI,QAAQ,SAAS,SAAY,EAAE,MAAM,QAAQ,KAAK,IAAI,CAAC;EAC3D,GAAI,eAAe,SAAY,EAAE,WAAW,IAAI,CAAC;CACnD;CAEA,MAAM,UAAU,SACd,MAAM,IAAI,OAAO,IAAI,0CAA0C;EAC7D,QAAQ,EACN,MAAM;GAAE,aAAa,IAAI;GAAa,QAAQ,QAAQ;EAAO,EAC/D;EACA;CACF,CAAC,CACH;CACA,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO,gBAAgB,QAAQ,KAAK;CAEnE,MAAM,QAAQ,QAAQ;CACtB,OAAO,OAAO,QAAQ;EACpB,MAAM;EACN,YACE,aAAa;GACX,CAAC,WAAW,MAAM,EAAE;GACpB,CAAC,QAAQ,MAAM,IAAI;GACnB,CAAC,SAAS,MAAM,KAAK;GACrB,CAAC,eAAe,iBAAiB,MAAM,UAAU,CAAC;EACpD,CAAC;CACL,CAAC;AACH;AAEA,MAAM,aAAa;CACjB,GAAG;CACH,WAAW;EACT,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,cAAc;EACZ,MAAM;EACN,aAAa;CACf;CACA,kBAAkB;EAChB,MAAM;EACN,aAAa;CACf;CACA,qBAAqB;EACnB,MAAM;EACN,aAAa;CACf;CACA,qBAAqB;EACnB,MAAM;EACN,aAAa;EACb,SAAS;CACX;AACF;AAEA,qBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,KAAK,OAAO,EAAE,MAAM,cAAc;EAChC,MAAM,UAAU,gBACd,cACA,sBAAsB,SAAS,YAAY,CAC7C;EACA,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO;EACtC,MAAM,QAAQ,gBACZ,kBACA,sBAAsB,SAAS,gBAAgB,CACjD;EACA,IAAI,OAAO,UAAU,KAAK,GAAG,OAAO;EACpC,MAAM,eAAe,sBAAsB,SAAS,mBAAmB;EACvE,MAAM,UACJ,iBAAiB,SACb,OAAO,QAAQ,MAAS,IACxB,oBAAoB,qBAAqB,YAAY;EAC3D,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO;EACtC,MAAM,aAAa,mBAAmB;GACpC,aAAa;GACb,WAAW;GACX,WAAW;GACX,SAAS,QAAQ;GACjB,KAAK,MAAM;GACX,QAAQ,QAAQ;GAChB,OAAO,KAAK,yBAAyB;EACvC,CAAC;EACD,IAAI,OAAO,UAAU,UAAU,GAAG,OAAO;EAEzC,OAAO,eAAe,OAAO,QAC3B,yBAAyB,KAAK;GAC5B,QAAQ,KAAK;GACb,MAAM,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;GAClD,YAAY,WAAW;EACzB,CAAC,CACH;CACF;AACF,CAAC"}
1
+ {"version":3,"file":"update-8-sHFvNB.mjs","names":[],"sources":["../src/cli/commands/project-user/update.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 { renderDetail } from \"../../ui/detail.js\";\nimport { collectRepeatableFlag, parseRepeatableFlag } from \"../parse.js\";\nimport { resolveArrayUpdate, type ArrayUpdate } from \"../array-update.js\";\nimport {\n applyGroupRoleEdits,\n formatGroupRoles,\n warnMissingGroupRemovals,\n parseGroupRoles,\n type GroupRole,\n} from \"../group-roles.js\";\n\nexport async function projectUserUpdateHandler(\n ctx: CommandContext,\n options: {\n userId: string;\n name?: string;\n groupRoles: ArrayUpdate<GroupRole, string>;\n },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n if (options.name === undefined && options.groupRoles === undefined) {\n return Result.fail({\n message: \"Nothing to update. Pass --name or a --group-role option.\",\n });\n }\n\n // API は groupRoles の全置換しか受けないため、要素単位の編集は現状を取得してから組み立てる\n let groupRoles: GroupRole[] | undefined;\n if (options.groupRoles?.mode === \"edit\") {\n const current = toResult(\n await ctx.client.GET(\"/projects/{projectName}/users/{userId}\", {\n params: {\n path: { projectName: ctx.projectName, userId: options.userId },\n },\n }),\n );\n if (Result.isFailure(current)) return apiErrorFailure(current.error);\n warnMissingGroupRemovals(\n current.value.groupRoles,\n options.groupRoles.remove,\n );\n groupRoles = applyGroupRoleEdits(\n current.value.groupRoles,\n options.groupRoles,\n );\n } else if (options.groupRoles !== undefined) {\n groupRoles = options.groupRoles.items;\n }\n\n const body = {\n ...(options.name !== undefined ? { name: options.name } : {}),\n ...(groupRoles !== undefined ? { groupRoles } : {}),\n };\n\n const updated = toResult(\n await ctx.client.PUT(\"/projects/{projectName}/users/{userId}\", {\n params: {\n path: { projectName: ctx.projectName, userId: options.userId },\n },\n body,\n }),\n );\n if (Result.isFailure(updated)) return apiErrorFailure(updated.error);\n\n const value = updated.value;\n return Result.succeed({\n json: value,\n text: () =>\n renderDetail([\n [\"Updated\", value.id],\n [\"Name\", value.name],\n [\"Email\", value.email],\n [\"Group roles\", formatGroupRoles(value.groupRoles)],\n ]),\n });\n}\n\nconst updateArgs = {\n ...contextArgs,\n \"user-id\": {\n type: \"positional\",\n required: true,\n description: \"Project user ID\",\n },\n name: {\n type: \"string\",\n description: \"New display name\",\n },\n \"group-role\": {\n type: \"string\",\n description: \"Replace all RBAC assignments with <group>:<role>; repeatable\",\n },\n \"add-group-role\": {\n type: \"string\",\n description: \"Add an RBAC assignment as <group>:<role>; repeatable\",\n },\n \"remove-group-role\": {\n type: \"string\",\n description: \"Remove an RBAC assignment by group name; repeatable\",\n },\n \"clear-group-roles\": {\n type: \"boolean\",\n description: \"Remove all RBAC assignments\",\n default: false,\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"update\",\n description: \"Update a project user's name or group roles\",\n },\n args: updateArgs,\n run: async ({ args, rawArgs }) => {\n const replace = parseGroupRoles(\n \"group-role\",\n collectRepeatableFlag(rawArgs, \"group-role\"),\n );\n if (Result.isFailure(replace)) return replace;\n const added = parseGroupRoles(\n \"add-group-role\",\n collectRepeatableFlag(rawArgs, \"add-group-role\"),\n );\n if (Result.isFailure(added)) return added;\n const removeValues = collectRepeatableFlag(rawArgs, \"remove-group-role\");\n const removed =\n removeValues === undefined\n ? Result.succeed(undefined)\n : parseRepeatableFlag(\"remove-group-role\", removeValues);\n if (Result.isFailure(removed)) return removed;\n const groupRoles = resolveArrayUpdate({\n replaceFlag: \"group-role\",\n clearFlag: \"clear-group-roles\",\n editFlags: \"--add-group-role / --remove-group-role\",\n replace: replace.value,\n add: added.value,\n remove: removed.value,\n clear: args[\"clear-group-roles\"] === true,\n });\n if (Result.isFailure(groupRoles)) return groupRoles;\n\n return runWithContext(args, (ctx) =>\n projectUserUpdateHandler(ctx, {\n userId: args[\"user-id\"],\n name: typeof args.name === \"string\" ? args.name : undefined,\n groupRoles: groupRoles.value,\n }),\n );\n },\n});\n"],"mappings":";;;;;;;;;;AAsBA,eAAsB,yBACpB,KACA,SAKmE;CACnE,IAAI,QAAQ,SAAS,UAAa,QAAQ,eAAe,QACvD,OAAO,OAAO,KAAK,EACjB,SAAS,2DACX,CAAC;CAIH,IAAI;CACJ,IAAI,QAAQ,YAAY,SAAS,QAAQ;EACvC,MAAM,UAAU,SACd,MAAM,IAAI,OAAO,IAAI,0CAA0C,EAC7D,QAAQ,EACN,MAAM;GAAE,aAAa,IAAI;GAAa,QAAQ,QAAQ;EAAO,EAC/D,EACF,CAAC,CACH;EACA,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO,gBAAgB,QAAQ,KAAK;EACnE,yBACE,QAAQ,MAAM,YACd,QAAQ,WAAW,MACrB;EACA,aAAa,oBACX,QAAQ,MAAM,YACd,QAAQ,UACV;CACF,OAAO,IAAI,QAAQ,eAAe,QAChC,aAAa,QAAQ,WAAW;CAGlC,MAAM,OAAO;EACX,GAAI,QAAQ,SAAS,SAAY,EAAE,MAAM,QAAQ,KAAK,IAAI,CAAC;EAC3D,GAAI,eAAe,SAAY,EAAE,WAAW,IAAI,CAAC;CACnD;CAEA,MAAM,UAAU,SACd,MAAM,IAAI,OAAO,IAAI,0CAA0C;EAC7D,QAAQ,EACN,MAAM;GAAE,aAAa,IAAI;GAAa,QAAQ,QAAQ;EAAO,EAC/D;EACA;CACF,CAAC,CACH;CACA,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO,gBAAgB,QAAQ,KAAK;CAEnE,MAAM,QAAQ,QAAQ;CACtB,OAAO,OAAO,QAAQ;EACpB,MAAM;EACN,YACE,aAAa;GACX,CAAC,WAAW,MAAM,EAAE;GACpB,CAAC,QAAQ,MAAM,IAAI;GACnB,CAAC,SAAS,MAAM,KAAK;GACrB,CAAC,eAAe,iBAAiB,MAAM,UAAU,CAAC;EACpD,CAAC;CACL,CAAC;AACH;AAEA,MAAM,aAAa;CACjB,GAAG;CACH,WAAW;EACT,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,cAAc;EACZ,MAAM;EACN,aAAa;CACf;CACA,kBAAkB;EAChB,MAAM;EACN,aAAa;CACf;CACA,qBAAqB;EACnB,MAAM;EACN,aAAa;CACf;CACA,qBAAqB;EACnB,MAAM;EACN,aAAa;EACb,SAAS;CACX;AACF;AAEA,qBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,KAAK,OAAO,EAAE,MAAM,cAAc;EAChC,MAAM,UAAU,gBACd,cACA,sBAAsB,SAAS,YAAY,CAC7C;EACA,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO;EACtC,MAAM,QAAQ,gBACZ,kBACA,sBAAsB,SAAS,gBAAgB,CACjD;EACA,IAAI,OAAO,UAAU,KAAK,GAAG,OAAO;EACpC,MAAM,eAAe,sBAAsB,SAAS,mBAAmB;EACvE,MAAM,UACJ,iBAAiB,SACb,OAAO,QAAQ,MAAS,IACxB,oBAAoB,qBAAqB,YAAY;EAC3D,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO;EACtC,MAAM,aAAa,mBAAmB;GACpC,aAAa;GACb,WAAW;GACX,WAAW;GACX,SAAS,QAAQ;GACjB,KAAK,MAAM;GACX,QAAQ,QAAQ;GAChB,OAAO,KAAK,yBAAyB;EACvC,CAAC;EACD,IAAI,OAAO,UAAU,UAAU,GAAG,OAAO;EAEzC,OAAO,eAAe,OAAO,QAC3B,yBAAyB,KAAK;GAC5B,QAAQ,KAAK;GACb,MAAM,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;GAClD,YAAY,WAAW;EACzB,CAAC,CACH;CACF;AACF,CAAC"}
@@ -1,11 +1,11 @@
1
1
  import { o as warn, t as defineCommand } from "./cli/main.mjs";
2
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";
3
+ import { a as apiErrorFailure, c as toResult, n as runWithContext } from "./run-with-context-B4DyI8Wo.mjs";
4
4
  import { t as renderDetail } from "./detail-DN5jCQ4N.mjs";
5
5
  import { a as parseHttpUrl, f as parseRepeatableFlag, i as parseHeaders, t as collectRepeatableFlag, u as parsePositionalId } from "./parse-DA0k5AHa.mjs";
6
6
  import { n as findDuplicateKey, r as resolveArrayUpdate, t as applyKeyedEdits } from "./array-update-CMFUoQEe.mjs";
7
7
  import { a as removeTableEvents, i as parseTableEvents, n as formatTableEvents, r as missingTableEventRemovals, t as addTableEvents } from "./table-event-C7gORNlb.mjs";
8
- import { formatCustomHeaders } from "./get-B6vBaq_D.mjs";
8
+ import { formatCustomHeaders } from "./get-Vo3yr12d.mjs";
9
9
  import { Result } from "@praha/byethrow";
10
10
 
11
11
  //#region src/cli/commands/webhook/update.ts
@@ -168,4 +168,4 @@ var update_default = defineCommand({
168
168
 
169
169
  //#endregion
170
170
  export { update_default as default };
171
- //# sourceMappingURL=update-Dyo4vuZs.mjs.map
171
+ //# sourceMappingURL=update-B5hKKw0K.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"update-Dyo4vuZs.mjs","names":[],"sources":["../src/cli/commands/webhook/update.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 { renderDetail } from \"../../ui/detail.js\";\nimport {\n collectRepeatableFlag,\n parseHeaders,\n parseHttpUrl,\n parsePositionalId,\n parseRepeatableFlag,\n} from \"../parse.js\";\nimport {\n applyKeyedEdits,\n findDuplicateKey,\n resolveArrayUpdate,\n type ArrayUpdate,\n} from \"../array-update.js\";\nimport { warn } from \"../../ui/output.js\";\nimport { formatCustomHeaders } from \"./get.js\";\nimport {\n addTableEvents,\n formatTableEvents,\n missingTableEventRemovals,\n parseTableEvents,\n removeTableEvents,\n type TableEvent,\n} from \"./table-event.js\";\n\ntype CustomHeader = { key: string; value: string };\n\nexport function applyHeaderEdits(\n current: CustomHeader[],\n edits: { add: CustomHeader[]; remove: string[] },\n): CustomHeader[] {\n return applyKeyedEdits(current, edits, (header) => header.key);\n}\n\nexport async function webhookUpdateHandler(\n ctx: CommandContext,\n options: {\n webhookId: number;\n name?: string;\n url?: string;\n tableEvents: ArrayUpdate<TableEvent, TableEvent>;\n customHeaders: ArrayUpdate<CustomHeader, string>;\n },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n if (\n options.name === undefined &&\n options.url === undefined &&\n options.tableEvents === undefined &&\n options.customHeaders === undefined\n ) {\n return Result.fail({\n message:\n \"Nothing to update. Pass --name, --url, a --table-event option, or a --header option.\",\n });\n }\n\n // API は配列の全置換しか受けないため、要素単位の編集は現状を取得してインメモリで編集してから送る\n let currentTableEvents: TableEvent[] = [];\n let currentHeaders: CustomHeader[] = [];\n if (\n options.tableEvents?.mode === \"edit\" ||\n options.customHeaders?.mode === \"edit\"\n ) {\n const current = toResult(\n await ctx.client.GET(\"/projects/{projectName}/webhooks/{webhookId}\", {\n params: {\n path: { projectName: ctx.projectName, webhookId: options.webhookId },\n },\n }),\n );\n if (Result.isFailure(current)) return apiErrorFailure(current.error);\n currentTableEvents = current.value.tableEvents;\n currentHeaders = current.value.customHeaders;\n\n // 存在しない対象の remove は冪等に無視する (エラーにしない) が、タイポに気づけるよう通知は出す\n if (options.tableEvents?.mode === \"edit\") {\n for (const missing of missingTableEventRemovals(\n currentTableEvents,\n options.tableEvents.remove,\n )) {\n warn(`Subscription \"${missing}\" is not set; skipped removing it.`);\n }\n }\n if (options.customHeaders?.mode === \"edit\") {\n for (const key of options.customHeaders.remove) {\n if (!currentHeaders.some((header) => header.key === key)) {\n warn(`Header \"${key}\" is not set; skipped removing it.`);\n }\n }\n }\n }\n\n const body = {\n ...(options.name !== undefined ? { name: options.name } : {}),\n ...(options.url !== undefined ? { url: options.url } : {}),\n ...(options.tableEvents !== undefined\n ? {\n tableEvents:\n options.tableEvents.mode === \"replace\"\n ? options.tableEvents.items\n : addTableEvents(\n removeTableEvents(\n currentTableEvents,\n options.tableEvents.remove,\n ),\n options.tableEvents.add,\n ),\n }\n : {}),\n ...(options.customHeaders !== undefined\n ? {\n customHeaders:\n options.customHeaders.mode === \"replace\"\n ? options.customHeaders.items\n : applyHeaderEdits(currentHeaders, options.customHeaders),\n }\n : {}),\n };\n\n const updated = toResult(\n await ctx.client.PUT(\"/projects/{projectName}/webhooks/{webhookId}\", {\n params: {\n path: { projectName: ctx.projectName, webhookId: options.webhookId },\n },\n body,\n }),\n );\n if (Result.isFailure(updated)) return apiErrorFailure(updated.error);\n\n const value = updated.value;\n return Result.succeed({\n json: value,\n text: () =>\n renderDetail([\n [\"ID\", String(value.id)],\n [\"Name\", value.name],\n [\"URL\", value.url],\n [\"Table events\", formatTableEvents(value.tableEvents)],\n [\"Custom headers\", formatCustomHeaders(value.customHeaders)],\n [\"Updated at\", value.updatedAt],\n ]),\n });\n}\n\nconst updateArgs = {\n ...contextArgs,\n id: {\n type: \"positional\",\n required: true,\n description: \"Numeric webhook ID\",\n },\n name: {\n type: \"string\",\n description: \"New webhook name\",\n },\n url: {\n type: \"string\",\n description: \"New URL to notify\",\n },\n \"table-event\": {\n type: \"string\",\n description: \"Replace all subscriptions with <table>:<event>; repeatable\",\n },\n \"add-table-event\": {\n type: \"string\",\n description: \"Add a subscription as <table>:<event>; repeatable\",\n },\n \"remove-table-event\": {\n type: \"string\",\n description: \"Remove a subscription as <table>:<event>; repeatable\",\n },\n \"clear-table-events\": {\n type: \"boolean\",\n description: \"Remove all subscriptions\",\n default: false,\n },\n header: {\n type: \"string\",\n description: \"Replace all custom headers with <key>:<value>; repeatable\",\n },\n \"add-header\": {\n type: \"string\",\n description:\n \"Add or overwrite a custom header as <key>:<value>; repeatable\",\n },\n \"remove-header\": {\n type: \"string\",\n description: \"Remove a custom header by key; repeatable\",\n },\n \"clear-headers\": {\n type: \"boolean\",\n description: \"Remove all custom headers\",\n default: false,\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"update\",\n description: \"Update a webhook\",\n },\n args: updateArgs,\n run: async ({ args, rawArgs }) => {\n const webhookId = parsePositionalId(\"webhook ID\", args.id);\n if (Result.isFailure(webhookId)) return webhookId;\n\n const replaceTableEvents = parseTableEvents(\n \"table-event\",\n collectRepeatableFlag(rawArgs, \"table-event\"),\n );\n if (Result.isFailure(replaceTableEvents)) return replaceTableEvents;\n const addedTableEvents = parseTableEvents(\n \"add-table-event\",\n collectRepeatableFlag(rawArgs, \"add-table-event\"),\n );\n if (Result.isFailure(addedTableEvents)) return addedTableEvents;\n const removedTableEvents = parseTableEvents(\n \"remove-table-event\",\n collectRepeatableFlag(rawArgs, \"remove-table-event\"),\n );\n if (Result.isFailure(removedTableEvents)) return removedTableEvents;\n const tableEvents = resolveArrayUpdate({\n replaceFlag: \"table-event\",\n clearFlag: \"clear-table-events\",\n editFlags: \"--add-table-event / --remove-table-event\",\n replace: replaceTableEvents.value,\n add: addedTableEvents.value,\n remove: removedTableEvents.value,\n clear: args[\"clear-table-events\"] === true,\n });\n if (Result.isFailure(tableEvents)) return tableEvents;\n\n const replaceHeaders = parseHeaders(\n \"header\",\n collectRepeatableFlag(rawArgs, \"header\"),\n );\n if (Result.isFailure(replaceHeaders)) return replaceHeaders;\n const addedHeaders = parseHeaders(\n \"add-header\",\n collectRepeatableFlag(rawArgs, \"add-header\"),\n );\n if (Result.isFailure(addedHeaders)) return addedHeaders;\n // add は同一 key を上書きする規則のため、1 回の実行内で同じ key を複数指定されると意図が曖昧になり弾く\n const duplicateAddedKey = findDuplicateKey(\n addedHeaders.value ?? [],\n (header) => header.key,\n );\n if (duplicateAddedKey !== undefined) {\n return Result.fail({\n message: `Invalid --add-header: key \"${duplicateAddedKey}\" is specified multiple times.`,\n });\n }\n const removeHeaderValues = collectRepeatableFlag(rawArgs, \"remove-header\");\n const removedHeaderKeys =\n removeHeaderValues === undefined\n ? Result.succeed(undefined)\n : parseRepeatableFlag(\"remove-header\", removeHeaderValues);\n if (Result.isFailure(removedHeaderKeys)) return removedHeaderKeys;\n const customHeaders = resolveArrayUpdate({\n replaceFlag: \"header\",\n clearFlag: \"clear-headers\",\n editFlags: \"--add-header / --remove-header\",\n replace: replaceHeaders.value,\n add: addedHeaders.value,\n remove: removedHeaderKeys.value,\n clear: args[\"clear-headers\"] === true,\n });\n if (Result.isFailure(customHeaders)) return customHeaders;\n\n let url: string | undefined;\n if (typeof args.url === \"string\") {\n const parsedUrl = parseHttpUrl(\"url\", args.url);\n if (Result.isFailure(parsedUrl)) return parsedUrl;\n url = parsedUrl.value;\n }\n\n return runWithContext(args, (ctx) =>\n webhookUpdateHandler(ctx, {\n webhookId: webhookId.value,\n name: typeof args.name === \"string\" ? args.name : undefined,\n url,\n tableEvents: tableEvents.value,\n customHeaders: customHeaders.value,\n }),\n );\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"update-B5hKKw0K.mjs","names":[],"sources":["../src/cli/commands/webhook/update.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 { renderDetail } from \"../../ui/detail.js\";\nimport {\n collectRepeatableFlag,\n parseHeaders,\n parseHttpUrl,\n parsePositionalId,\n parseRepeatableFlag,\n} from \"../parse.js\";\nimport {\n applyKeyedEdits,\n findDuplicateKey,\n resolveArrayUpdate,\n type ArrayUpdate,\n} from \"../array-update.js\";\nimport { warn } from \"../../ui/output.js\";\nimport { formatCustomHeaders } from \"./get.js\";\nimport {\n addTableEvents,\n formatTableEvents,\n missingTableEventRemovals,\n parseTableEvents,\n removeTableEvents,\n type TableEvent,\n} from \"./table-event.js\";\n\ntype CustomHeader = { key: string; value: string };\n\nexport function applyHeaderEdits(\n current: CustomHeader[],\n edits: { add: CustomHeader[]; remove: string[] },\n): CustomHeader[] {\n return applyKeyedEdits(current, edits, (header) => header.key);\n}\n\nexport async function webhookUpdateHandler(\n ctx: CommandContext,\n options: {\n webhookId: number;\n name?: string;\n url?: string;\n tableEvents: ArrayUpdate<TableEvent, TableEvent>;\n customHeaders: ArrayUpdate<CustomHeader, string>;\n },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n if (\n options.name === undefined &&\n options.url === undefined &&\n options.tableEvents === undefined &&\n options.customHeaders === undefined\n ) {\n return Result.fail({\n message:\n \"Nothing to update. Pass --name, --url, a --table-event option, or a --header option.\",\n });\n }\n\n // API は配列の全置換しか受けないため、要素単位の編集は現状を取得してインメモリで編集してから送る\n let currentTableEvents: TableEvent[] = [];\n let currentHeaders: CustomHeader[] = [];\n if (\n options.tableEvents?.mode === \"edit\" ||\n options.customHeaders?.mode === \"edit\"\n ) {\n const current = toResult(\n await ctx.client.GET(\"/projects/{projectName}/webhooks/{webhookId}\", {\n params: {\n path: { projectName: ctx.projectName, webhookId: options.webhookId },\n },\n }),\n );\n if (Result.isFailure(current)) return apiErrorFailure(current.error);\n currentTableEvents = current.value.tableEvents;\n currentHeaders = current.value.customHeaders;\n\n // 存在しない対象の remove は冪等に無視する (エラーにしない) が、タイポに気づけるよう通知は出す\n if (options.tableEvents?.mode === \"edit\") {\n for (const missing of missingTableEventRemovals(\n currentTableEvents,\n options.tableEvents.remove,\n )) {\n warn(`Subscription \"${missing}\" is not set; skipped removing it.`);\n }\n }\n if (options.customHeaders?.mode === \"edit\") {\n for (const key of options.customHeaders.remove) {\n if (!currentHeaders.some((header) => header.key === key)) {\n warn(`Header \"${key}\" is not set; skipped removing it.`);\n }\n }\n }\n }\n\n const body = {\n ...(options.name !== undefined ? { name: options.name } : {}),\n ...(options.url !== undefined ? { url: options.url } : {}),\n ...(options.tableEvents !== undefined\n ? {\n tableEvents:\n options.tableEvents.mode === \"replace\"\n ? options.tableEvents.items\n : addTableEvents(\n removeTableEvents(\n currentTableEvents,\n options.tableEvents.remove,\n ),\n options.tableEvents.add,\n ),\n }\n : {}),\n ...(options.customHeaders !== undefined\n ? {\n customHeaders:\n options.customHeaders.mode === \"replace\"\n ? options.customHeaders.items\n : applyHeaderEdits(currentHeaders, options.customHeaders),\n }\n : {}),\n };\n\n const updated = toResult(\n await ctx.client.PUT(\"/projects/{projectName}/webhooks/{webhookId}\", {\n params: {\n path: { projectName: ctx.projectName, webhookId: options.webhookId },\n },\n body,\n }),\n );\n if (Result.isFailure(updated)) return apiErrorFailure(updated.error);\n\n const value = updated.value;\n return Result.succeed({\n json: value,\n text: () =>\n renderDetail([\n [\"ID\", String(value.id)],\n [\"Name\", value.name],\n [\"URL\", value.url],\n [\"Table events\", formatTableEvents(value.tableEvents)],\n [\"Custom headers\", formatCustomHeaders(value.customHeaders)],\n [\"Updated at\", value.updatedAt],\n ]),\n });\n}\n\nconst updateArgs = {\n ...contextArgs,\n id: {\n type: \"positional\",\n required: true,\n description: \"Numeric webhook ID\",\n },\n name: {\n type: \"string\",\n description: \"New webhook name\",\n },\n url: {\n type: \"string\",\n description: \"New URL to notify\",\n },\n \"table-event\": {\n type: \"string\",\n description: \"Replace all subscriptions with <table>:<event>; repeatable\",\n },\n \"add-table-event\": {\n type: \"string\",\n description: \"Add a subscription as <table>:<event>; repeatable\",\n },\n \"remove-table-event\": {\n type: \"string\",\n description: \"Remove a subscription as <table>:<event>; repeatable\",\n },\n \"clear-table-events\": {\n type: \"boolean\",\n description: \"Remove all subscriptions\",\n default: false,\n },\n header: {\n type: \"string\",\n description: \"Replace all custom headers with <key>:<value>; repeatable\",\n },\n \"add-header\": {\n type: \"string\",\n description:\n \"Add or overwrite a custom header as <key>:<value>; repeatable\",\n },\n \"remove-header\": {\n type: \"string\",\n description: \"Remove a custom header by key; repeatable\",\n },\n \"clear-headers\": {\n type: \"boolean\",\n description: \"Remove all custom headers\",\n default: false,\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"update\",\n description: \"Update a webhook\",\n },\n args: updateArgs,\n run: async ({ args, rawArgs }) => {\n const webhookId = parsePositionalId(\"webhook ID\", args.id);\n if (Result.isFailure(webhookId)) return webhookId;\n\n const replaceTableEvents = parseTableEvents(\n \"table-event\",\n collectRepeatableFlag(rawArgs, \"table-event\"),\n );\n if (Result.isFailure(replaceTableEvents)) return replaceTableEvents;\n const addedTableEvents = parseTableEvents(\n \"add-table-event\",\n collectRepeatableFlag(rawArgs, \"add-table-event\"),\n );\n if (Result.isFailure(addedTableEvents)) return addedTableEvents;\n const removedTableEvents = parseTableEvents(\n \"remove-table-event\",\n collectRepeatableFlag(rawArgs, \"remove-table-event\"),\n );\n if (Result.isFailure(removedTableEvents)) return removedTableEvents;\n const tableEvents = resolveArrayUpdate({\n replaceFlag: \"table-event\",\n clearFlag: \"clear-table-events\",\n editFlags: \"--add-table-event / --remove-table-event\",\n replace: replaceTableEvents.value,\n add: addedTableEvents.value,\n remove: removedTableEvents.value,\n clear: args[\"clear-table-events\"] === true,\n });\n if (Result.isFailure(tableEvents)) return tableEvents;\n\n const replaceHeaders = parseHeaders(\n \"header\",\n collectRepeatableFlag(rawArgs, \"header\"),\n );\n if (Result.isFailure(replaceHeaders)) return replaceHeaders;\n const addedHeaders = parseHeaders(\n \"add-header\",\n collectRepeatableFlag(rawArgs, \"add-header\"),\n );\n if (Result.isFailure(addedHeaders)) return addedHeaders;\n // add は同一 key を上書きする規則のため、1 回の実行内で同じ key を複数指定されると意図が曖昧になり弾く\n const duplicateAddedKey = findDuplicateKey(\n addedHeaders.value ?? [],\n (header) => header.key,\n );\n if (duplicateAddedKey !== undefined) {\n return Result.fail({\n message: `Invalid --add-header: key \"${duplicateAddedKey}\" is specified multiple times.`,\n });\n }\n const removeHeaderValues = collectRepeatableFlag(rawArgs, \"remove-header\");\n const removedHeaderKeys =\n removeHeaderValues === undefined\n ? Result.succeed(undefined)\n : parseRepeatableFlag(\"remove-header\", removeHeaderValues);\n if (Result.isFailure(removedHeaderKeys)) return removedHeaderKeys;\n const customHeaders = resolveArrayUpdate({\n replaceFlag: \"header\",\n clearFlag: \"clear-headers\",\n editFlags: \"--add-header / --remove-header\",\n replace: replaceHeaders.value,\n add: addedHeaders.value,\n remove: removedHeaderKeys.value,\n clear: args[\"clear-headers\"] === true,\n });\n if (Result.isFailure(customHeaders)) return customHeaders;\n\n let url: string | undefined;\n if (typeof args.url === \"string\") {\n const parsedUrl = parseHttpUrl(\"url\", args.url);\n if (Result.isFailure(parsedUrl)) return parsedUrl;\n url = parsedUrl.value;\n }\n\n return runWithContext(args, (ctx) =>\n webhookUpdateHandler(ctx, {\n webhookId: webhookId.value,\n name: typeof args.name === \"string\" ? args.name : undefined,\n url,\n tableEvents: tableEvents.value,\n customHeaders: customHeaders.value,\n }),\n );\n },\n});\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  const require_cli_main = require('./cli/main.cjs');
2
2
  const require_shared = require('./shared-DHRPzzKl.cjs');
3
- const require_run_with_context = require('./run-with-context-DJNnEigg.cjs');
3
+ const require_run_with_context = require('./run-with-context-D8pSrqD_.cjs');
4
4
  const require_detail = require('./detail-8CXNIhKw.cjs');
5
5
  const require_parse = require('./parse-C8oHgQXx.cjs');
6
6
  const require_project_name = require('./project-name-CEoM-OL4.cjs');
@@ -70,4 +70,4 @@ var update_default = require_cli_main.defineCommand({
70
70
 
71
71
  //#endregion
72
72
  exports.default = update_default;
73
- //# sourceMappingURL=update-Do9HHWzs.cjs.map
73
+ //# sourceMappingURL=update-BVaqURWE.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"update-Do9HHWzs.cjs","names":["Result","toResult","apiErrorFailure","renderDetail","contextArgs","defineCommand","parseBooleanFlag","runWithContext","projectNameOverride"],"sources":["../src/cli/commands/project/update.ts"],"sourcesContent":["import type { ArgsDef } from \"citty\";\nimport { Result } from \"@praha/byethrow\";\nimport type { components } from \"@orizm/internal-shared/api-clients/dev-v2\";\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 { renderDetail } from \"../../ui/detail.js\";\nimport { parseBooleanFlag } from \"../parse.js\";\nimport { projectNameOverride } from \"./project-name.js\";\n\nexport async function projectUpdateHandler(\n ctx: CommandContext,\n options: {\n displayName?: string;\n cmsUrl?: string;\n deletionProtected?: boolean;\n },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const body: components[\"schemas\"][\"UpdateProjectRequest\"] = {\n ...(options.displayName !== undefined\n ? { displayName: options.displayName }\n : {}),\n ...(options.cmsUrl !== undefined ? { cmsUrl: options.cmsUrl } : {}),\n ...(options.deletionProtected !== undefined\n ? { isDeletionProtected: options.deletionProtected }\n : {}),\n };\n\n if (Object.keys(body).length === 0) {\n return Result.fail({\n message:\n \"Nothing to update. Pass --display-name, --cms-url, or --deletion-protected.\",\n });\n }\n\n const updated = toResult(\n await ctx.client.PUT(\"/projects/{projectName}\", {\n params: { path: { projectName: ctx.projectName } },\n body,\n }),\n );\n if (Result.isFailure(updated)) return apiErrorFailure(updated.error);\n\n const value = updated.value;\n return Result.succeed({\n json: value,\n text: () =>\n renderDetail([\n [\"Updated\", value.name],\n [\"Display name\", value.displayName],\n [\"CMS URL\", value.cmsUrl ?? \"-\"],\n [\"Deletion protected\", String(value.isDeletionProtected)],\n ]),\n });\n}\n\nconst updateArgs = {\n ...contextArgs,\n name: {\n type: \"positional\",\n required: false,\n description: \"Project name (defaults to the current project context)\",\n },\n \"display-name\": {\n type: \"string\",\n description: \"New display name\",\n },\n \"cms-url\": {\n type: \"string\",\n description: \"New CMS URL\",\n },\n // 「未指定 = 変更しない」「true / false = その値へ変更」の 3 状態を扱うため、\n // bare 指定が true になる boolean フラグではなく、値を明示させる文字列で受ける。\n \"deletion-protected\": {\n type: \"string\",\n description: \"Set deletion protection (true/false)\",\n valueHint: \"true|false\",\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"update\",\n description: \"Update a project's settings\",\n },\n args: updateArgs,\n run: async ({ args }) => {\n const deletionProtected = parseBooleanFlag(\n \"deletion-protected\",\n args[\"deletion-protected\"],\n );\n if (Result.isFailure(deletionProtected)) return deletionProtected;\n\n return runWithContext(projectNameOverride(args), (ctx) =>\n projectUpdateHandler(ctx, {\n displayName:\n typeof args[\"display-name\"] === \"string\"\n ? args[\"display-name\"]\n : undefined,\n cmsUrl:\n typeof args[\"cms-url\"] === \"string\" ? args[\"cms-url\"] : undefined,\n deletionProtected: deletionProtected.value,\n }),\n );\n },\n});\n"],"mappings":";;;;;;;;;AAgBA,eAAsB,qBACpB,KACA,SAKmE;CACnE,MAAM,OAAsD;EAC1D,GAAI,QAAQ,gBAAgB,SACxB,EAAE,aAAa,QAAQ,YAAY,IACnC,CAAC;EACL,GAAI,QAAQ,WAAW,SAAY,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;EACjE,GAAI,QAAQ,sBAAsB,SAC9B,EAAE,qBAAqB,QAAQ,kBAAkB,IACjD,CAAC;CACP;CAEA,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,WAAW,GAC/B,OAAOA,uBAAO,KAAK,EACjB,SACE,8EACJ,CAAC;CAGH,MAAM,UAAUC,kCACd,MAAM,IAAI,OAAO,IAAI,2BAA2B;EAC9C,QAAQ,EAAE,MAAM,EAAE,aAAa,IAAI,YAAY,EAAE;EACjD;CACF,CAAC,CACH;CACA,IAAID,uBAAO,UAAU,OAAO,GAAG,OAAOE,yCAAgB,QAAQ,KAAK;CAEnE,MAAM,QAAQ,QAAQ;CACtB,OAAOF,uBAAO,QAAQ;EACpB,MAAM;EACN,YACEG,4BAAa;GACX,CAAC,WAAW,MAAM,IAAI;GACtB,CAAC,gBAAgB,MAAM,WAAW;GAClC,CAAC,WAAW,MAAM,UAAU,GAAG;GAC/B,CAAC,sBAAsB,OAAO,MAAM,mBAAmB,CAAC;EAC1D,CAAC;CACL,CAAC;AACH;AAEA,MAAM,aAAa;CACjB,GAAGC;CACH,MAAM;EACJ,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,gBAAgB;EACd,MAAM;EACN,aAAa;CACf;CACA,WAAW;EACT,MAAM;EACN,aAAa;CACf;CAGA,sBAAsB;EACpB,MAAM;EACN,aAAa;EACb,WAAW;CACb;AACF;AAEA,qBAAeC,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,KAAK,OAAO,EAAE,WAAW;EACvB,MAAM,oBAAoBC,+BACxB,sBACA,KAAK,qBACP;EACA,IAAIN,uBAAO,UAAU,iBAAiB,GAAG,OAAO;EAEhD,OAAOO,wCAAeC,yCAAoB,IAAI,IAAI,QAChD,qBAAqB,KAAK;GACxB,aACE,OAAO,KAAK,oBAAoB,WAC5B,KAAK,kBACL;GACN,QACE,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa;GAC1D,mBAAmB,kBAAkB;EACvC,CAAC,CACH;CACF;AACF,CAAC"}
1
+ {"version":3,"file":"update-BVaqURWE.cjs","names":["Result","toResult","apiErrorFailure","renderDetail","contextArgs","defineCommand","parseBooleanFlag","runWithContext","projectNameOverride"],"sources":["../src/cli/commands/project/update.ts"],"sourcesContent":["import type { ArgsDef } from \"citty\";\nimport { Result } from \"@praha/byethrow\";\nimport type { components } from \"@orizm/internal-shared/api-clients/dev-v2\";\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 { renderDetail } from \"../../ui/detail.js\";\nimport { parseBooleanFlag } from \"../parse.js\";\nimport { projectNameOverride } from \"./project-name.js\";\n\nexport async function projectUpdateHandler(\n ctx: CommandContext,\n options: {\n displayName?: string;\n cmsUrl?: string;\n deletionProtected?: boolean;\n },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const body: components[\"schemas\"][\"UpdateProjectRequest\"] = {\n ...(options.displayName !== undefined\n ? { displayName: options.displayName }\n : {}),\n ...(options.cmsUrl !== undefined ? { cmsUrl: options.cmsUrl } : {}),\n ...(options.deletionProtected !== undefined\n ? { isDeletionProtected: options.deletionProtected }\n : {}),\n };\n\n if (Object.keys(body).length === 0) {\n return Result.fail({\n message:\n \"Nothing to update. Pass --display-name, --cms-url, or --deletion-protected.\",\n });\n }\n\n const updated = toResult(\n await ctx.client.PUT(\"/projects/{projectName}\", {\n params: { path: { projectName: ctx.projectName } },\n body,\n }),\n );\n if (Result.isFailure(updated)) return apiErrorFailure(updated.error);\n\n const value = updated.value;\n return Result.succeed({\n json: value,\n text: () =>\n renderDetail([\n [\"Updated\", value.name],\n [\"Display name\", value.displayName],\n [\"CMS URL\", value.cmsUrl ?? \"-\"],\n [\"Deletion protected\", String(value.isDeletionProtected)],\n ]),\n });\n}\n\nconst updateArgs = {\n ...contextArgs,\n name: {\n type: \"positional\",\n required: false,\n description: \"Project name (defaults to the current project context)\",\n },\n \"display-name\": {\n type: \"string\",\n description: \"New display name\",\n },\n \"cms-url\": {\n type: \"string\",\n description: \"New CMS URL\",\n },\n // 「未指定 = 変更しない」「true / false = その値へ変更」の 3 状態を扱うため、\n // bare 指定が true になる boolean フラグではなく、値を明示させる文字列で受ける。\n \"deletion-protected\": {\n type: \"string\",\n description: \"Set deletion protection (true/false)\",\n valueHint: \"true|false\",\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"update\",\n description: \"Update a project's settings\",\n },\n args: updateArgs,\n run: async ({ args }) => {\n const deletionProtected = parseBooleanFlag(\n \"deletion-protected\",\n args[\"deletion-protected\"],\n );\n if (Result.isFailure(deletionProtected)) return deletionProtected;\n\n return runWithContext(projectNameOverride(args), (ctx) =>\n projectUpdateHandler(ctx, {\n displayName:\n typeof args[\"display-name\"] === \"string\"\n ? args[\"display-name\"]\n : undefined,\n cmsUrl:\n typeof args[\"cms-url\"] === \"string\" ? args[\"cms-url\"] : undefined,\n deletionProtected: deletionProtected.value,\n }),\n );\n },\n});\n"],"mappings":";;;;;;;;;AAgBA,eAAsB,qBACpB,KACA,SAKmE;CACnE,MAAM,OAAsD;EAC1D,GAAI,QAAQ,gBAAgB,SACxB,EAAE,aAAa,QAAQ,YAAY,IACnC,CAAC;EACL,GAAI,QAAQ,WAAW,SAAY,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;EACjE,GAAI,QAAQ,sBAAsB,SAC9B,EAAE,qBAAqB,QAAQ,kBAAkB,IACjD,CAAC;CACP;CAEA,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,WAAW,GAC/B,OAAOA,uBAAO,KAAK,EACjB,SACE,8EACJ,CAAC;CAGH,MAAM,UAAUC,kCACd,MAAM,IAAI,OAAO,IAAI,2BAA2B;EAC9C,QAAQ,EAAE,MAAM,EAAE,aAAa,IAAI,YAAY,EAAE;EACjD;CACF,CAAC,CACH;CACA,IAAID,uBAAO,UAAU,OAAO,GAAG,OAAOE,yCAAgB,QAAQ,KAAK;CAEnE,MAAM,QAAQ,QAAQ;CACtB,OAAOF,uBAAO,QAAQ;EACpB,MAAM;EACN,YACEG,4BAAa;GACX,CAAC,WAAW,MAAM,IAAI;GACtB,CAAC,gBAAgB,MAAM,WAAW;GAClC,CAAC,WAAW,MAAM,UAAU,GAAG;GAC/B,CAAC,sBAAsB,OAAO,MAAM,mBAAmB,CAAC;EAC1D,CAAC;CACL,CAAC;AACH;AAEA,MAAM,aAAa;CACjB,GAAGC;CACH,MAAM;EACJ,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,gBAAgB;EACd,MAAM;EACN,aAAa;CACf;CACA,WAAW;EACT,MAAM;EACN,aAAa;CACf;CAGA,sBAAsB;EACpB,MAAM;EACN,aAAa;EACb,WAAW;CACb;AACF;AAEA,qBAAeC,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,KAAK,OAAO,EAAE,WAAW;EACvB,MAAM,oBAAoBC,+BACxB,sBACA,KAAK,qBACP;EACA,IAAIN,uBAAO,UAAU,iBAAiB,GAAG,OAAO;EAEhD,OAAOO,wCAAeC,yCAAoB,IAAI,IAAI,QAChD,qBAAqB,KAAK;GACxB,aACE,OAAO,KAAK,oBAAoB,WAC5B,KAAK,kBACL;GACN,QACE,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa;GAC1D,mBAAmB,kBAAkB;EACvC,CAAC,CACH;CACF;AACF,CAAC"}
@@ -1,6 +1,6 @@
1
1
  const require_cli_main = require('./cli/main.cjs');
2
2
  const require_shared = require('./shared-DHRPzzKl.cjs');
3
- const require_run_with_context = require('./run-with-context-DJNnEigg.cjs');
3
+ const require_run_with_context = require('./run-with-context-D8pSrqD_.cjs');
4
4
  const require_detail = require('./detail-8CXNIhKw.cjs');
5
5
  const require_parse = require('./parse-C8oHgQXx.cjs');
6
6
  const require_mask = require('./mask-CqYLib9p.cjs');
@@ -114,4 +114,4 @@ var update_default = require_cli_main.defineCommand({
114
114
 
115
115
  //#endregion
116
116
  exports.default = update_default;
117
- //# sourceMappingURL=update-DRnN1kiu.cjs.map
117
+ //# sourceMappingURL=update-BlUwNhLA.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"update-DRnN1kiu.cjs","names":["Result","toResult","apiErrorFailure","applyGroupRoleEdits","maskManagementKey","renderDetail","formatGroupRoles","contextArgs","showKeyArg","defineCommand","parsePositionalId","parseGroupRoles","collectRepeatableFlag","parseRepeatableFlag","resolveArrayUpdate","runWithContext"],"sources":["../src/cli/commands/key/management/update.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 { renderDetail } from \"../../../ui/detail.js\";\nimport {\n collectRepeatableFlag,\n parsePositionalId,\n parseRepeatableFlag,\n} from \"../../parse.js\";\nimport { resolveArrayUpdate, type ArrayUpdate } from \"../../array-update.js\";\nimport {\n applyGroupRoleEdits,\n formatGroupRoles,\n warnMissingGroupRemovals,\n parseGroupRoles,\n type GroupRole,\n} from \"../../group-roles.js\";\nimport { maskManagementKey, showKeyArg } from \"../mask.js\";\n\nexport async function keyManagementUpdateHandler(\n ctx: CommandContext,\n options: {\n id: number;\n description?: string;\n groupRoles: ArrayUpdate<GroupRole, string>;\n showKey: boolean;\n },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n if (options.description === undefined && options.groupRoles === undefined) {\n return Result.fail({\n message:\n \"Nothing to update. Pass --description or a --group-role option.\",\n });\n }\n\n // API は groupRoles の全置換しか受けないため、要素単位の編集は現状を取得してから組み立てる。\n // Management Key には単体 GET が無いので一覧から引く。\n let groupRoles: GroupRole[] | undefined;\n if (options.groupRoles?.mode === \"edit\") {\n const keys = toResult(\n await ctx.client.GET(\"/projects/{projectName}/management-keys\", {\n params: { path: { projectName: ctx.projectName } },\n }),\n );\n if (Result.isFailure(keys)) return apiErrorFailure(keys.error);\n const current = keys.value.find((key) => key.id === options.id);\n if (current === undefined) {\n return Result.fail({\n message: `Not found: management key ${options.id}.`,\n });\n }\n warnMissingGroupRemovals(current.groupRoles, options.groupRoles.remove);\n groupRoles = applyGroupRoleEdits(current.groupRoles, options.groupRoles);\n } else if (options.groupRoles !== undefined) {\n groupRoles = options.groupRoles.items;\n }\n\n const body = {\n ...(options.description !== undefined\n ? { description: options.description }\n : {}),\n ...(groupRoles !== undefined ? { groupRoles } : {}),\n };\n\n const updated = toResult(\n await ctx.client.PUT(\n \"/projects/{projectName}/management-keys/{projectManagementKeyId}\",\n {\n params: {\n path: {\n projectName: ctx.projectName,\n projectManagementKeyId: options.id,\n },\n },\n body,\n },\n ),\n );\n if (Result.isFailure(updated)) return apiErrorFailure(updated.error);\n\n // --json でもマスクを効かせるため、表示用データ自体を書き換える\n const value = options.showKey\n ? updated.value\n : { ...updated.value, key: maskManagementKey(updated.value.key) };\n return Result.succeed({\n json: value,\n text: () =>\n renderDetail([\n [\"ID\", String(value.id)],\n [\"Key\", value.key],\n [\"Description\", value.description],\n [\"Group roles\", formatGroupRoles(value.groupRoles)],\n [\"Updated at\", value.updatedAt],\n ]),\n });\n}\n\nconst updateArgs = {\n ...contextArgs,\n ...showKeyArg,\n id: {\n type: \"positional\",\n required: true,\n description: \"Numeric management key ID\",\n },\n description: {\n type: \"string\",\n description: \"New description\",\n },\n \"group-role\": {\n type: \"string\",\n description: \"Replace all RBAC assignments with <group>:<role>; repeatable\",\n },\n \"add-group-role\": {\n type: \"string\",\n description: \"Add an RBAC assignment as <group>:<role>; repeatable\",\n },\n \"remove-group-role\": {\n type: \"string\",\n description: \"Remove an RBAC assignment by group name; repeatable\",\n },\n \"clear-group-roles\": {\n type: \"boolean\",\n description: \"Remove all RBAC assignments\",\n default: false,\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"update\",\n description: \"Update a management key's description or group roles\",\n },\n args: updateArgs,\n run: async ({ args, rawArgs }) => {\n const id = parsePositionalId(\"management key ID\", args.id);\n if (Result.isFailure(id)) return id;\n const replace = parseGroupRoles(\n \"group-role\",\n collectRepeatableFlag(rawArgs, \"group-role\"),\n );\n if (Result.isFailure(replace)) return replace;\n const added = parseGroupRoles(\n \"add-group-role\",\n collectRepeatableFlag(rawArgs, \"add-group-role\"),\n );\n if (Result.isFailure(added)) return added;\n const removeValues = collectRepeatableFlag(rawArgs, \"remove-group-role\");\n const removed =\n removeValues === undefined\n ? Result.succeed(undefined)\n : parseRepeatableFlag(\"remove-group-role\", removeValues);\n if (Result.isFailure(removed)) return removed;\n const groupRoles = resolveArrayUpdate({\n replaceFlag: \"group-role\",\n clearFlag: \"clear-group-roles\",\n editFlags: \"--add-group-role / --remove-group-role\",\n replace: replace.value,\n add: added.value,\n remove: removed.value,\n clear: args[\"clear-group-roles\"] === true,\n });\n if (Result.isFailure(groupRoles)) return groupRoles;\n\n return runWithContext(args, (ctx) =>\n keyManagementUpdateHandler(ctx, {\n id: id.value,\n description:\n typeof args.description === \"string\" ? args.description : undefined,\n groupRoles: groupRoles.value,\n showKey: args[\"show-key\"] === true,\n }),\n );\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"update-BlUwNhLA.cjs","names":["Result","toResult","apiErrorFailure","applyGroupRoleEdits","maskManagementKey","renderDetail","formatGroupRoles","contextArgs","showKeyArg","defineCommand","parsePositionalId","parseGroupRoles","collectRepeatableFlag","parseRepeatableFlag","resolveArrayUpdate","runWithContext"],"sources":["../src/cli/commands/key/management/update.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 { renderDetail } from \"../../../ui/detail.js\";\nimport {\n collectRepeatableFlag,\n parsePositionalId,\n parseRepeatableFlag,\n} from \"../../parse.js\";\nimport { resolveArrayUpdate, type ArrayUpdate } from \"../../array-update.js\";\nimport {\n applyGroupRoleEdits,\n formatGroupRoles,\n warnMissingGroupRemovals,\n parseGroupRoles,\n type GroupRole,\n} from \"../../group-roles.js\";\nimport { maskManagementKey, showKeyArg } from \"../mask.js\";\n\nexport async function keyManagementUpdateHandler(\n ctx: CommandContext,\n options: {\n id: number;\n description?: string;\n groupRoles: ArrayUpdate<GroupRole, string>;\n showKey: boolean;\n },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n if (options.description === undefined && options.groupRoles === undefined) {\n return Result.fail({\n message:\n \"Nothing to update. Pass --description or a --group-role option.\",\n });\n }\n\n // API は groupRoles の全置換しか受けないため、要素単位の編集は現状を取得してから組み立てる。\n // Management Key には単体 GET が無いので一覧から引く。\n let groupRoles: GroupRole[] | undefined;\n if (options.groupRoles?.mode === \"edit\") {\n const keys = toResult(\n await ctx.client.GET(\"/projects/{projectName}/management-keys\", {\n params: { path: { projectName: ctx.projectName } },\n }),\n );\n if (Result.isFailure(keys)) return apiErrorFailure(keys.error);\n const current = keys.value.find((key) => key.id === options.id);\n if (current === undefined) {\n return Result.fail({\n message: `Not found: management key ${options.id}.`,\n });\n }\n warnMissingGroupRemovals(current.groupRoles, options.groupRoles.remove);\n groupRoles = applyGroupRoleEdits(current.groupRoles, options.groupRoles);\n } else if (options.groupRoles !== undefined) {\n groupRoles = options.groupRoles.items;\n }\n\n const body = {\n ...(options.description !== undefined\n ? { description: options.description }\n : {}),\n ...(groupRoles !== undefined ? { groupRoles } : {}),\n };\n\n const updated = toResult(\n await ctx.client.PUT(\n \"/projects/{projectName}/management-keys/{projectManagementKeyId}\",\n {\n params: {\n path: {\n projectName: ctx.projectName,\n projectManagementKeyId: options.id,\n },\n },\n body,\n },\n ),\n );\n if (Result.isFailure(updated)) return apiErrorFailure(updated.error);\n\n // --json でもマスクを効かせるため、表示用データ自体を書き換える\n const value = options.showKey\n ? updated.value\n : { ...updated.value, key: maskManagementKey(updated.value.key) };\n return Result.succeed({\n json: value,\n text: () =>\n renderDetail([\n [\"ID\", String(value.id)],\n [\"Key\", value.key],\n [\"Description\", value.description],\n [\"Group roles\", formatGroupRoles(value.groupRoles)],\n [\"Updated at\", value.updatedAt],\n ]),\n });\n}\n\nconst updateArgs = {\n ...contextArgs,\n ...showKeyArg,\n id: {\n type: \"positional\",\n required: true,\n description: \"Numeric management key ID\",\n },\n description: {\n type: \"string\",\n description: \"New description\",\n },\n \"group-role\": {\n type: \"string\",\n description: \"Replace all RBAC assignments with <group>:<role>; repeatable\",\n },\n \"add-group-role\": {\n type: \"string\",\n description: \"Add an RBAC assignment as <group>:<role>; repeatable\",\n },\n \"remove-group-role\": {\n type: \"string\",\n description: \"Remove an RBAC assignment by group name; repeatable\",\n },\n \"clear-group-roles\": {\n type: \"boolean\",\n description: \"Remove all RBAC assignments\",\n default: false,\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"update\",\n description: \"Update a management key's description or group roles\",\n },\n args: updateArgs,\n run: async ({ args, rawArgs }) => {\n const id = parsePositionalId(\"management key ID\", args.id);\n if (Result.isFailure(id)) return id;\n const replace = parseGroupRoles(\n \"group-role\",\n collectRepeatableFlag(rawArgs, \"group-role\"),\n );\n if (Result.isFailure(replace)) return replace;\n const added = parseGroupRoles(\n \"add-group-role\",\n collectRepeatableFlag(rawArgs, \"add-group-role\"),\n );\n if (Result.isFailure(added)) return added;\n const removeValues = collectRepeatableFlag(rawArgs, \"remove-group-role\");\n const removed =\n removeValues === undefined\n ? Result.succeed(undefined)\n : parseRepeatableFlag(\"remove-group-role\", removeValues);\n if (Result.isFailure(removed)) return removed;\n const groupRoles = resolveArrayUpdate({\n replaceFlag: \"group-role\",\n clearFlag: \"clear-group-roles\",\n editFlags: \"--add-group-role / --remove-group-role\",\n replace: replace.value,\n add: added.value,\n remove: removed.value,\n clear: args[\"clear-group-roles\"] === true,\n });\n if (Result.isFailure(groupRoles)) return groupRoles;\n\n return runWithContext(args, (ctx) =>\n keyManagementUpdateHandler(ctx, {\n id: id.value,\n description:\n typeof args.description === \"string\" ? args.description : undefined,\n groupRoles: groupRoles.value,\n showKey: args[\"show-key\"] === true,\n }),\n );\n },\n});\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  const require_cli_main = require('./cli/main.cjs');
2
2
  const require_shared = require('./shared-DHRPzzKl.cjs');
3
- const require_run_with_context = require('./run-with-context-DJNnEigg.cjs');
3
+ const require_run_with_context = require('./run-with-context-D8pSrqD_.cjs');
4
4
  const require_parse = require('./parse-C8oHgQXx.cjs');
5
5
  let _praha_byethrow = require("@praha/byethrow");
6
6
 
@@ -58,4 +58,4 @@ var update_default = require_cli_main.defineCommand({
58
58
 
59
59
  //#endregion
60
60
  exports.default = update_default;
61
- //# sourceMappingURL=update-Cx_2GkQj.cjs.map
61
+ //# sourceMappingURL=update-BqhLwuP7.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"update-Cx_2GkQj.cjs","names":["toResult","Result","apiErrorFailure","contextArgs","defineCommand","parseDataOption","runWithContext"],"sources":["../src/cli/commands/content/update.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 { parseDataOption } from \"../parse.js\";\n\nexport async function contentUpdateHandler(\n ctx: CommandContext,\n options: { table: string; contentId: string; data: Record<string, unknown> },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const updated = toResult(\n await ctx.client.PUT(\n \"/projects/{projectName}/tables/{tableName}/{contentId}\",\n {\n params: {\n path: {\n projectName: ctx.projectName,\n tableName: options.table,\n contentId: options.contentId,\n },\n },\n body: options.data,\n },\n ),\n );\n if (Result.isFailure(updated)) return apiErrorFailure(updated.error);\n\n const value = updated.value;\n return Result.succeed({\n json: value,\n text: () => JSON.stringify(value, null, 2),\n });\n}\n\nconst updateArgs = {\n ...contextArgs,\n table: {\n type: \"positional\",\n required: true,\n description: \"Table name\",\n },\n id: {\n type: \"positional\",\n required: true,\n description: \"Content ID\",\n },\n data: {\n type: \"string\",\n required: true,\n description: \"Content fields as a JSON object string or @path/to/file.json\",\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"update\",\n description: \"Update a content\",\n },\n args: updateArgs,\n run: async ({ args }) => {\n const data = await parseDataOption(args.data);\n if (Result.isFailure(data)) return data;\n\n return runWithContext(args, (ctx) =>\n contentUpdateHandler(ctx, {\n table: args.table,\n contentId: args.id,\n data: data.value,\n }),\n );\n },\n});\n"],"mappings":";;;;;;;AAaA,eAAsB,qBACpB,KACA,SACmE;CACnE,MAAM,UAAUA,kCACd,MAAM,IAAI,OAAO,IACf,0DACA;EACE,QAAQ,EACN,MAAM;GACJ,aAAa,IAAI;GACjB,WAAW,QAAQ;GACnB,WAAW,QAAQ;EACrB,EACF;EACA,MAAM,QAAQ;CAChB,CACF,CACF;CACA,IAAIC,uBAAO,UAAU,OAAO,GAAG,OAAOC,yCAAgB,QAAQ,KAAK;CAEnE,MAAM,QAAQ,QAAQ;CACtB,OAAOD,uBAAO,QAAQ;EACpB,MAAM;EACN,YAAY,KAAK,UAAU,OAAO,MAAM,CAAC;CAC3C,CAAC;AACH;AAEA,MAAM,aAAa;CACjB,GAAGE;CACH,OAAO;EACL,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,IAAI;EACF,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,MAAM;EACJ,MAAM;EACN,UAAU;EACV,aAAa;CACf;AACF;AAEA,qBAAeC,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,KAAK,OAAO,EAAE,WAAW;EACvB,MAAM,OAAO,MAAMC,8BAAgB,KAAK,IAAI;EAC5C,IAAIJ,uBAAO,UAAU,IAAI,GAAG,OAAO;EAEnC,OAAOK,wCAAe,OAAO,QAC3B,qBAAqB,KAAK;GACxB,OAAO,KAAK;GACZ,WAAW,KAAK;GAChB,MAAM,KAAK;EACb,CAAC,CACH;CACF;AACF,CAAC"}
1
+ {"version":3,"file":"update-BqhLwuP7.cjs","names":["toResult","Result","apiErrorFailure","contextArgs","defineCommand","parseDataOption","runWithContext"],"sources":["../src/cli/commands/content/update.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 { parseDataOption } from \"../parse.js\";\n\nexport async function contentUpdateHandler(\n ctx: CommandContext,\n options: { table: string; contentId: string; data: Record<string, unknown> },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const updated = toResult(\n await ctx.client.PUT(\n \"/projects/{projectName}/tables/{tableName}/{contentId}\",\n {\n params: {\n path: {\n projectName: ctx.projectName,\n tableName: options.table,\n contentId: options.contentId,\n },\n },\n body: options.data,\n },\n ),\n );\n if (Result.isFailure(updated)) return apiErrorFailure(updated.error);\n\n const value = updated.value;\n return Result.succeed({\n json: value,\n text: () => JSON.stringify(value, null, 2),\n });\n}\n\nconst updateArgs = {\n ...contextArgs,\n table: {\n type: \"positional\",\n required: true,\n description: \"Table name\",\n },\n id: {\n type: \"positional\",\n required: true,\n description: \"Content ID\",\n },\n data: {\n type: \"string\",\n required: true,\n description: \"Content fields as a JSON object string or @path/to/file.json\",\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"update\",\n description: \"Update a content\",\n },\n args: updateArgs,\n run: async ({ args }) => {\n const data = await parseDataOption(args.data);\n if (Result.isFailure(data)) return data;\n\n return runWithContext(args, (ctx) =>\n contentUpdateHandler(ctx, {\n table: args.table,\n contentId: args.id,\n data: data.value,\n }),\n );\n },\n});\n"],"mappings":";;;;;;;AAaA,eAAsB,qBACpB,KACA,SACmE;CACnE,MAAM,UAAUA,kCACd,MAAM,IAAI,OAAO,IACf,0DACA;EACE,QAAQ,EACN,MAAM;GACJ,aAAa,IAAI;GACjB,WAAW,QAAQ;GACnB,WAAW,QAAQ;EACrB,EACF;EACA,MAAM,QAAQ;CAChB,CACF,CACF;CACA,IAAIC,uBAAO,UAAU,OAAO,GAAG,OAAOC,yCAAgB,QAAQ,KAAK;CAEnE,MAAM,QAAQ,QAAQ;CACtB,OAAOD,uBAAO,QAAQ;EACpB,MAAM;EACN,YAAY,KAAK,UAAU,OAAO,MAAM,CAAC;CAC3C,CAAC;AACH;AAEA,MAAM,aAAa;CACjB,GAAGE;CACH,OAAO;EACL,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,IAAI;EACF,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,MAAM;EACJ,MAAM;EACN,UAAU;EACV,aAAa;CACf;AACF;AAEA,qBAAeC,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,KAAK,OAAO,EAAE,WAAW;EACvB,MAAM,OAAO,MAAMC,8BAAgB,KAAK,IAAI;EAC5C,IAAIJ,uBAAO,UAAU,IAAI,GAAG,OAAO;EAEnC,OAAOK,wCAAe,OAAO,QAC3B,qBAAqB,KAAK;GACxB,OAAO,KAAK;GACZ,WAAW,KAAK;GAChB,MAAM,KAAK;EACb,CAAC,CACH;CACF;AACF,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { t as defineCommand } from "./cli/main.mjs";
2
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";
3
+ import { a as apiErrorFailure, c as toResult, n as runWithContext } from "./run-with-context-B4DyI8Wo.mjs";
4
4
  import { t as renderDetail } from "./detail-DN5jCQ4N.mjs";
5
5
  import { n as parseBooleanFlag } from "./parse-DA0k5AHa.mjs";
6
6
  import { t as projectNameOverride } from "./project-name-DNMejnzZ.mjs";
@@ -70,4 +70,4 @@ var update_default = defineCommand({
70
70
 
71
71
  //#endregion
72
72
  export { update_default as default };
73
- //# sourceMappingURL=update-mEmULIau.mjs.map
73
+ //# sourceMappingURL=update-DaYjh5VN.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"update-mEmULIau.mjs","names":[],"sources":["../src/cli/commands/project/update.ts"],"sourcesContent":["import type { ArgsDef } from \"citty\";\nimport { Result } from \"@praha/byethrow\";\nimport type { components } from \"@orizm/internal-shared/api-clients/dev-v2\";\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 { renderDetail } from \"../../ui/detail.js\";\nimport { parseBooleanFlag } from \"../parse.js\";\nimport { projectNameOverride } from \"./project-name.js\";\n\nexport async function projectUpdateHandler(\n ctx: CommandContext,\n options: {\n displayName?: string;\n cmsUrl?: string;\n deletionProtected?: boolean;\n },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const body: components[\"schemas\"][\"UpdateProjectRequest\"] = {\n ...(options.displayName !== undefined\n ? { displayName: options.displayName }\n : {}),\n ...(options.cmsUrl !== undefined ? { cmsUrl: options.cmsUrl } : {}),\n ...(options.deletionProtected !== undefined\n ? { isDeletionProtected: options.deletionProtected }\n : {}),\n };\n\n if (Object.keys(body).length === 0) {\n return Result.fail({\n message:\n \"Nothing to update. Pass --display-name, --cms-url, or --deletion-protected.\",\n });\n }\n\n const updated = toResult(\n await ctx.client.PUT(\"/projects/{projectName}\", {\n params: { path: { projectName: ctx.projectName } },\n body,\n }),\n );\n if (Result.isFailure(updated)) return apiErrorFailure(updated.error);\n\n const value = updated.value;\n return Result.succeed({\n json: value,\n text: () =>\n renderDetail([\n [\"Updated\", value.name],\n [\"Display name\", value.displayName],\n [\"CMS URL\", value.cmsUrl ?? \"-\"],\n [\"Deletion protected\", String(value.isDeletionProtected)],\n ]),\n });\n}\n\nconst updateArgs = {\n ...contextArgs,\n name: {\n type: \"positional\",\n required: false,\n description: \"Project name (defaults to the current project context)\",\n },\n \"display-name\": {\n type: \"string\",\n description: \"New display name\",\n },\n \"cms-url\": {\n type: \"string\",\n description: \"New CMS URL\",\n },\n // 「未指定 = 変更しない」「true / false = その値へ変更」の 3 状態を扱うため、\n // bare 指定が true になる boolean フラグではなく、値を明示させる文字列で受ける。\n \"deletion-protected\": {\n type: \"string\",\n description: \"Set deletion protection (true/false)\",\n valueHint: \"true|false\",\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"update\",\n description: \"Update a project's settings\",\n },\n args: updateArgs,\n run: async ({ args }) => {\n const deletionProtected = parseBooleanFlag(\n \"deletion-protected\",\n args[\"deletion-protected\"],\n );\n if (Result.isFailure(deletionProtected)) return deletionProtected;\n\n return runWithContext(projectNameOverride(args), (ctx) =>\n projectUpdateHandler(ctx, {\n displayName:\n typeof args[\"display-name\"] === \"string\"\n ? args[\"display-name\"]\n : undefined,\n cmsUrl:\n typeof args[\"cms-url\"] === \"string\" ? args[\"cms-url\"] : undefined,\n deletionProtected: deletionProtected.value,\n }),\n );\n },\n});\n"],"mappings":";;;;;;;;;AAgBA,eAAsB,qBACpB,KACA,SAKmE;CACnE,MAAM,OAAsD;EAC1D,GAAI,QAAQ,gBAAgB,SACxB,EAAE,aAAa,QAAQ,YAAY,IACnC,CAAC;EACL,GAAI,QAAQ,WAAW,SAAY,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;EACjE,GAAI,QAAQ,sBAAsB,SAC9B,EAAE,qBAAqB,QAAQ,kBAAkB,IACjD,CAAC;CACP;CAEA,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,WAAW,GAC/B,OAAO,OAAO,KAAK,EACjB,SACE,8EACJ,CAAC;CAGH,MAAM,UAAU,SACd,MAAM,IAAI,OAAO,IAAI,2BAA2B;EAC9C,QAAQ,EAAE,MAAM,EAAE,aAAa,IAAI,YAAY,EAAE;EACjD;CACF,CAAC,CACH;CACA,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO,gBAAgB,QAAQ,KAAK;CAEnE,MAAM,QAAQ,QAAQ;CACtB,OAAO,OAAO,QAAQ;EACpB,MAAM;EACN,YACE,aAAa;GACX,CAAC,WAAW,MAAM,IAAI;GACtB,CAAC,gBAAgB,MAAM,WAAW;GAClC,CAAC,WAAW,MAAM,UAAU,GAAG;GAC/B,CAAC,sBAAsB,OAAO,MAAM,mBAAmB,CAAC;EAC1D,CAAC;CACL,CAAC;AACH;AAEA,MAAM,aAAa;CACjB,GAAG;CACH,MAAM;EACJ,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,gBAAgB;EACd,MAAM;EACN,aAAa;CACf;CACA,WAAW;EACT,MAAM;EACN,aAAa;CACf;CAGA,sBAAsB;EACpB,MAAM;EACN,aAAa;EACb,WAAW;CACb;AACF;AAEA,qBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,KAAK,OAAO,EAAE,WAAW;EACvB,MAAM,oBAAoB,iBACxB,sBACA,KAAK,qBACP;EACA,IAAI,OAAO,UAAU,iBAAiB,GAAG,OAAO;EAEhD,OAAO,eAAe,oBAAoB,IAAI,IAAI,QAChD,qBAAqB,KAAK;GACxB,aACE,OAAO,KAAK,oBAAoB,WAC5B,KAAK,kBACL;GACN,QACE,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa;GAC1D,mBAAmB,kBAAkB;EACvC,CAAC,CACH;CACF;AACF,CAAC"}
1
+ {"version":3,"file":"update-DaYjh5VN.mjs","names":[],"sources":["../src/cli/commands/project/update.ts"],"sourcesContent":["import type { ArgsDef } from \"citty\";\nimport { Result } from \"@praha/byethrow\";\nimport type { components } from \"@orizm/internal-shared/api-clients/dev-v2\";\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 { renderDetail } from \"../../ui/detail.js\";\nimport { parseBooleanFlag } from \"../parse.js\";\nimport { projectNameOverride } from \"./project-name.js\";\n\nexport async function projectUpdateHandler(\n ctx: CommandContext,\n options: {\n displayName?: string;\n cmsUrl?: string;\n deletionProtected?: boolean;\n },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const body: components[\"schemas\"][\"UpdateProjectRequest\"] = {\n ...(options.displayName !== undefined\n ? { displayName: options.displayName }\n : {}),\n ...(options.cmsUrl !== undefined ? { cmsUrl: options.cmsUrl } : {}),\n ...(options.deletionProtected !== undefined\n ? { isDeletionProtected: options.deletionProtected }\n : {}),\n };\n\n if (Object.keys(body).length === 0) {\n return Result.fail({\n message:\n \"Nothing to update. Pass --display-name, --cms-url, or --deletion-protected.\",\n });\n }\n\n const updated = toResult(\n await ctx.client.PUT(\"/projects/{projectName}\", {\n params: { path: { projectName: ctx.projectName } },\n body,\n }),\n );\n if (Result.isFailure(updated)) return apiErrorFailure(updated.error);\n\n const value = updated.value;\n return Result.succeed({\n json: value,\n text: () =>\n renderDetail([\n [\"Updated\", value.name],\n [\"Display name\", value.displayName],\n [\"CMS URL\", value.cmsUrl ?? \"-\"],\n [\"Deletion protected\", String(value.isDeletionProtected)],\n ]),\n });\n}\n\nconst updateArgs = {\n ...contextArgs,\n name: {\n type: \"positional\",\n required: false,\n description: \"Project name (defaults to the current project context)\",\n },\n \"display-name\": {\n type: \"string\",\n description: \"New display name\",\n },\n \"cms-url\": {\n type: \"string\",\n description: \"New CMS URL\",\n },\n // 「未指定 = 変更しない」「true / false = その値へ変更」の 3 状態を扱うため、\n // bare 指定が true になる boolean フラグではなく、値を明示させる文字列で受ける。\n \"deletion-protected\": {\n type: \"string\",\n description: \"Set deletion protection (true/false)\",\n valueHint: \"true|false\",\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"update\",\n description: \"Update a project's settings\",\n },\n args: updateArgs,\n run: async ({ args }) => {\n const deletionProtected = parseBooleanFlag(\n \"deletion-protected\",\n args[\"deletion-protected\"],\n );\n if (Result.isFailure(deletionProtected)) return deletionProtected;\n\n return runWithContext(projectNameOverride(args), (ctx) =>\n projectUpdateHandler(ctx, {\n displayName:\n typeof args[\"display-name\"] === \"string\"\n ? args[\"display-name\"]\n : undefined,\n cmsUrl:\n typeof args[\"cms-url\"] === \"string\" ? args[\"cms-url\"] : undefined,\n deletionProtected: deletionProtected.value,\n }),\n );\n },\n});\n"],"mappings":";;;;;;;;;AAgBA,eAAsB,qBACpB,KACA,SAKmE;CACnE,MAAM,OAAsD;EAC1D,GAAI,QAAQ,gBAAgB,SACxB,EAAE,aAAa,QAAQ,YAAY,IACnC,CAAC;EACL,GAAI,QAAQ,WAAW,SAAY,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;EACjE,GAAI,QAAQ,sBAAsB,SAC9B,EAAE,qBAAqB,QAAQ,kBAAkB,IACjD,CAAC;CACP;CAEA,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,WAAW,GAC/B,OAAO,OAAO,KAAK,EACjB,SACE,8EACJ,CAAC;CAGH,MAAM,UAAU,SACd,MAAM,IAAI,OAAO,IAAI,2BAA2B;EAC9C,QAAQ,EAAE,MAAM,EAAE,aAAa,IAAI,YAAY,EAAE;EACjD;CACF,CAAC,CACH;CACA,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO,gBAAgB,QAAQ,KAAK;CAEnE,MAAM,QAAQ,QAAQ;CACtB,OAAO,OAAO,QAAQ;EACpB,MAAM;EACN,YACE,aAAa;GACX,CAAC,WAAW,MAAM,IAAI;GACtB,CAAC,gBAAgB,MAAM,WAAW;GAClC,CAAC,WAAW,MAAM,UAAU,GAAG;GAC/B,CAAC,sBAAsB,OAAO,MAAM,mBAAmB,CAAC;EAC1D,CAAC;CACL,CAAC;AACH;AAEA,MAAM,aAAa;CACjB,GAAG;CACH,MAAM;EACJ,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,gBAAgB;EACd,MAAM;EACN,aAAa;CACf;CACA,WAAW;EACT,MAAM;EACN,aAAa;CACf;CAGA,sBAAsB;EACpB,MAAM;EACN,aAAa;EACb,WAAW;CACb;AACF;AAEA,qBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,KAAK,OAAO,EAAE,WAAW;EACvB,MAAM,oBAAoB,iBACxB,sBACA,KAAK,qBACP;EACA,IAAI,OAAO,UAAU,iBAAiB,GAAG,OAAO;EAEhD,OAAO,eAAe,oBAAoB,IAAI,IAAI,QAChD,qBAAqB,KAAK;GACxB,aACE,OAAO,KAAK,oBAAoB,WAC5B,KAAK,kBACL;GACN,QACE,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa;GAC1D,mBAAmB,kBAAkB;EACvC,CAAC,CACH;CACF;AACF,CAAC"}
@@ -1,11 +1,11 @@
1
1
  const require_cli_main = require('./cli/main.cjs');
2
2
  const require_shared = require('./shared-DHRPzzKl.cjs');
3
- const require_run_with_context = require('./run-with-context-DJNnEigg.cjs');
3
+ const require_run_with_context = require('./run-with-context-D8pSrqD_.cjs');
4
4
  const require_detail = require('./detail-8CXNIhKw.cjs');
5
5
  const require_parse = require('./parse-C8oHgQXx.cjs');
6
6
  const require_array_update = require('./array-update-Dch4e9tI.cjs');
7
7
  const require_table_event = require('./table-event-DXkCK29f.cjs');
8
- const require_get = require('./get-DwtzBjGV.cjs');
8
+ const require_get = require('./get-CKZPn669.cjs');
9
9
  let _praha_byethrow = require("@praha/byethrow");
10
10
 
11
11
  //#region src/cli/commands/webhook/update.ts
@@ -168,4 +168,4 @@ var update_default = require_cli_main.defineCommand({
168
168
 
169
169
  //#endregion
170
170
  exports.default = update_default;
171
- //# sourceMappingURL=update-CJgEmSWJ.cjs.map
171
+ //# sourceMappingURL=update-DcTzR54Z.cjs.map