@orizm/cli 3.1.0 → 3.3.0-beta.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 (379) hide show
  1. package/README.md +27 -1
  2. package/dist/agent-Kf8iuW2I.mjs +14 -0
  3. package/dist/agent-Kf8iuW2I.mjs.map +1 -0
  4. package/dist/agent-UZZtdOZS.cjs +14 -0
  5. package/dist/agent-UZZtdOZS.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-BJnovGYT.mjs → cms-8XZhxwsM.mjs} +8 -5
  19. package/dist/cms-8XZhxwsM.mjs.map +1 -0
  20. package/dist/{cms-Cnx-lDGu.cjs → cms-C4zEtppZ.cjs} +8 -5
  21. package/dist/cms-C4zEtppZ.cjs.map +1 -0
  22. package/dist/{codegen-BF5b-u46.cjs → codegen-Cypg4O3L.cjs} +3 -3
  23. package/dist/{codegen-BF5b-u46.cjs.map → codegen-Cypg4O3L.cjs.map} +1 -1
  24. package/dist/{codegen-DZOB4ttR.mjs → codegen-Dnjv7zfm.mjs} +3 -3
  25. package/dist/{codegen-DZOB4ttR.mjs.map → codegen-Dnjv7zfm.mjs.map} +1 -1
  26. package/dist/config/index.cjs +4 -2
  27. package/dist/config/index.cjs.map +1 -1
  28. package/dist/config/index.d.mts +8 -1
  29. package/dist/config/index.d.mts.map +1 -1
  30. package/dist/config/index.mjs +4 -2
  31. package/dist/config/index.mjs.map +1 -1
  32. package/dist/{config-loader-D8x32gEU.cjs → config-loader-CZfANHBf.cjs} +2 -2
  33. package/dist/config-loader-CZfANHBf.cjs.map +1 -0
  34. package/dist/{config-loader-BEgS869e.mjs → config-loader-CtbZOGjc.mjs} +3 -3
  35. package/dist/config-loader-CtbZOGjc.mjs.map +1 -0
  36. package/dist/{confirm-delete-B9o73U7B.cjs → confirm-delete-BX8bJrXZ.cjs} +3 -3
  37. package/dist/{confirm-delete-B9o73U7B.cjs.map → confirm-delete-BX8bJrXZ.cjs.map} +1 -1
  38. package/dist/{confirm-delete-CsWkW69-.mjs → confirm-delete-CcKLYuCB.mjs} +2 -2
  39. package/dist/{confirm-delete-CsWkW69-.mjs.map → confirm-delete-CcKLYuCB.mjs.map} +1 -1
  40. package/dist/{consumer-C4WiGHWG.mjs → consumer-BAM3E_68.mjs} +4 -4
  41. package/dist/{consumer-C4WiGHWG.mjs.map → consumer-BAM3E_68.mjs.map} +1 -1
  42. package/dist/{consumer-OF6Z_eTP.cjs → consumer-BSgriLn0.cjs} +4 -4
  43. package/dist/consumer-BSgriLn0.cjs.map +1 -0
  44. package/dist/consumer-D-Y6KJ8a.cjs +18 -0
  45. package/dist/{consumer-l-8wUK8E.cjs.map → consumer-D-Y6KJ8a.cjs.map} +1 -1
  46. package/dist/{consumer-pU2HyiyA.mjs → consumer-s8LnLw4e.mjs} +4 -4
  47. package/dist/consumer-s8LnLw4e.mjs.map +1 -0
  48. package/dist/content-ClRuLcGq.cjs +20 -0
  49. package/dist/{content-DMjSwor1.cjs.map → content-ClRuLcGq.cjs.map} +1 -1
  50. package/dist/content-DWnYo6ad.mjs +20 -0
  51. package/dist/{content-BOb6NC8M.mjs.map → content-DWnYo6ad.mjs.map} +1 -1
  52. package/dist/{create-DJY71sp9.cjs → create-B3d4CDel.cjs} +2 -2
  53. package/dist/{create-DJY71sp9.cjs.map → create-B3d4CDel.cjs.map} +1 -1
  54. package/dist/{create-CC814ixh.mjs → create-BD6iS4n6.mjs} +2 -2
  55. package/dist/{create-CC814ixh.mjs.map → create-BD6iS4n6.mjs.map} +1 -1
  56. package/dist/{create-B-PAOor6.mjs → create-BGV3F44O.mjs} +3 -3
  57. package/dist/{create-B-PAOor6.mjs.map → create-BGV3F44O.mjs.map} +1 -1
  58. package/dist/{create-Z-z3LXNW.cjs → create-BYDbsUvw.cjs} +3 -3
  59. package/dist/{create-Z-z3LXNW.cjs.map → create-BYDbsUvw.cjs.map} +1 -1
  60. package/dist/{create-Belwettw.mjs → create-BtuS23L3.mjs} +2 -2
  61. package/dist/{create-Belwettw.mjs.map → create-BtuS23L3.mjs.map} +1 -1
  62. package/dist/{create-CCsn7yp5.cjs → create-CNDCTpi0.cjs} +3 -3
  63. package/dist/{create-CCsn7yp5.cjs.map → create-CNDCTpi0.cjs.map} +1 -1
  64. package/dist/{create-BNYWcyuQ.cjs → create-DzRMGpm_.cjs} +2 -2
  65. package/dist/{create-BNYWcyuQ.cjs.map → create-DzRMGpm_.cjs.map} +1 -1
  66. package/dist/{create-B1ZBOqcV.mjs → create-fweRd0UB.mjs} +2 -2
  67. package/dist/{create-B1ZBOqcV.mjs.map → create-fweRd0UB.mjs.map} +1 -1
  68. package/dist/{create-D5suBd3J.mjs → create-m5fNBqQE.mjs} +3 -3
  69. package/dist/{create-D5suBd3J.mjs.map → create-m5fNBqQE.mjs.map} +1 -1
  70. package/dist/{create-CmOriwGo.cjs → create-tWGEtI3t.cjs} +2 -2
  71. package/dist/{create-CmOriwGo.cjs.map → create-tWGEtI3t.cjs.map} +1 -1
  72. package/dist/{delete-DhSU-Lx2.mjs → delete-B8VlzzCj.mjs} +3 -3
  73. package/dist/{delete-DhSU-Lx2.mjs.map → delete-B8VlzzCj.mjs.map} +1 -1
  74. package/dist/{delete-DVrafka1.cjs → delete-B9j8c8ln.cjs} +3 -3
  75. package/dist/{delete-DVrafka1.cjs.map → delete-B9j8c8ln.cjs.map} +1 -1
  76. package/dist/{delete-ZIifaG0i.mjs → delete-BhJK-8vE.mjs} +3 -3
  77. package/dist/{delete-ZIifaG0i.mjs.map → delete-BhJK-8vE.mjs.map} +1 -1
  78. package/dist/{delete-YYh_0khQ.mjs → delete-Bi6UhAhS.mjs} +3 -3
  79. package/dist/{delete-YYh_0khQ.mjs.map → delete-Bi6UhAhS.mjs.map} +1 -1
  80. package/dist/{delete-CCTiCYIL.cjs → delete-C_oxZa_p.cjs} +3 -3
  81. package/dist/{delete-CCTiCYIL.cjs.map → delete-C_oxZa_p.cjs.map} +1 -1
  82. package/dist/{delete-CSs5Czlo.mjs → delete-Ci7cq3mU.mjs} +3 -3
  83. package/dist/{delete-CSs5Czlo.mjs.map → delete-Ci7cq3mU.mjs.map} +1 -1
  84. package/dist/{delete-XWJRhBFs.mjs → delete-CiWkGnog.mjs} +3 -3
  85. package/dist/{delete-XWJRhBFs.mjs.map → delete-CiWkGnog.mjs.map} +1 -1
  86. package/dist/{delete-DozSxZQ7.cjs → delete-Cmk80aqF.cjs} +3 -3
  87. package/dist/{delete-DozSxZQ7.cjs.map → delete-Cmk80aqF.cjs.map} +1 -1
  88. package/dist/{delete-8yZ3j0vX.cjs → delete-CvtvB2Cr.cjs} +3 -3
  89. package/dist/{delete-8yZ3j0vX.cjs.map → delete-CvtvB2Cr.cjs.map} +1 -1
  90. package/dist/{delete-CIYY59v_.cjs → delete-DG825UwK.cjs} +4 -3
  91. package/dist/{delete-CIYY59v_.cjs.map → delete-DG825UwK.cjs.map} +1 -1
  92. package/dist/{delete-WpMIIvjj.cjs → delete-DGrSMqOt.cjs} +3 -3
  93. package/dist/{delete-WpMIIvjj.cjs.map → delete-DGrSMqOt.cjs.map} +1 -1
  94. package/dist/{delete-BOUObrDw.mjs → delete-Datr3Kqq.mjs} +3 -2
  95. package/dist/{delete-BOUObrDw.mjs.map → delete-Datr3Kqq.mjs.map} +1 -1
  96. package/dist/{delete-D4r1ve4v.cjs → delete-TTF4pIKw.cjs} +3 -3
  97. package/dist/{delete-D4r1ve4v.cjs.map → delete-TTF4pIKw.cjs.map} +1 -1
  98. package/dist/{delete-BSLIXrAh.mjs → delete-X8iVsETw.mjs} +3 -3
  99. package/dist/{delete-BSLIXrAh.mjs.map → delete-X8iVsETw.mjs.map} +1 -1
  100. package/dist/docs/features/cli/authentication.md +93 -0
  101. package/dist/docs/features/cli/commands/agent.md +49 -0
  102. package/dist/docs/features/cli/commands/auth.md +36 -0
  103. package/dist/docs/features/cli/commands/bucket.md +120 -0
  104. package/dist/docs/features/cli/commands/codegen.md +51 -0
  105. package/dist/docs/features/cli/commands/content.md +117 -0
  106. package/dist/docs/features/cli/commands/key.md +155 -0
  107. package/dist/docs/features/cli/commands/link.md +21 -0
  108. package/dist/docs/features/cli/commands/org.md +18 -0
  109. package/dist/docs/features/cli/commands/project-user.md +108 -0
  110. package/dist/docs/features/cli/commands/project.md +106 -0
  111. package/dist/docs/features/cli/commands/schema.md +108 -0
  112. package/dist/docs/features/cli/commands/webhook.md +110 -0
  113. package/dist/docs/features/cli/commands.md +110 -0
  114. package/dist/docs/features/cli/configuration.md +70 -0
  115. package/dist/docs/features/cli/output.md +53 -0
  116. package/dist/docs/features/cli/project-linking.md +58 -0
  117. package/dist/docs/features/cli/quickstart.md +83 -0
  118. package/dist/docs/features/cli.md +56 -0
  119. package/dist/docs/features/cms-sdk/account.md +122 -0
  120. package/dist/docs/features/cms-sdk/auth.md +122 -0
  121. package/dist/docs/features/cms-sdk/bucket.md +113 -0
  122. package/dist/docs/features/cms-sdk/cli.md +104 -0
  123. package/dist/docs/features/cms-sdk/fetch-contents.md +608 -0
  124. package/dist/docs/features/cms-sdk/install.md +98 -0
  125. package/dist/docs/features/cms-sdk/management-user.md +244 -0
  126. package/dist/docs/features/cms-sdk/migrate-to-v2.md +152 -0
  127. package/dist/docs/features/cms-sdk/mutation-contents.md +190 -0
  128. package/dist/docs/features/console/audit-logs.md +55 -0
  129. package/dist/docs/features/console/bucket.md +70 -0
  130. package/dist/docs/features/console/create-project.md +103 -0
  131. package/dist/docs/features/console/generate-api-key.md +103 -0
  132. package/dist/docs/features/console/invite-project-users.md +70 -0
  133. package/dist/docs/features/console/management-tables.md +131 -0
  134. package/dist/docs/features/console/organization-member-management.md +78 -0
  135. package/dist/docs/features/console/schema-history.md +29 -0
  136. package/dist/docs/features/console.md +15 -0
  137. package/dist/docs/features/consumer-sdk/cli.md +60 -0
  138. package/dist/docs/features/consumer-sdk/fetch-contents.md +603 -0
  139. package/dist/docs/features/consumer-sdk/install.md +90 -0
  140. package/dist/docs/features/consumer-sdk/migrate-to-v2.md +43 -0
  141. package/dist/docs/features/design-editor/about.md +36 -0
  142. package/dist/docs/features/design-editor/getting-started.md +244 -0
  143. package/dist/docs/features/design-editor/install.md +17 -0
  144. package/dist/docs/features/design-editor/prop-editor.md +83 -0
  145. package/dist/docs/features/design-editor/schema.md +279 -0
  146. package/dist/docs/features/dictionary.md +265 -0
  147. package/dist/docs/features/draft.md +241 -0
  148. package/dist/docs/features/form/about.md +83 -0
  149. package/dist/docs/features/form/editor.md +410 -0
  150. package/dist/docs/features/form/submission.md +94 -0
  151. package/dist/docs/features/full-text-search.md +114 -0
  152. package/dist/docs/features/history.md +152 -0
  153. package/dist/docs/features/schema/about.md +215 -0
  154. package/dist/docs/features/schema/authority.md +456 -0
  155. package/dist/docs/features/schema/bucket.md +142 -0
  156. package/dist/docs/features/schema/database.md +419 -0
  157. package/dist/docs/features/schema/table-module.md +140 -0
  158. package/dist/docs/features/webhook/revalidate-nextjs.md +185 -0
  159. package/dist/docs/features/webhook.md +295 -0
  160. package/dist/docs/get-started/add-model-starter.md +124 -0
  161. package/dist/docs/get-started/get-started-with-starter.md +218 -0
  162. package/dist/docs/index.md +89 -0
  163. package/dist/docs/introduction.md +140 -0
  164. package/dist/docs/manifest.json +6 -0
  165. package/dist/docs/resources/cli-migration-guide.md +82 -0
  166. package/dist/docs/resources/cli-v2-to-v3-migration-guide.md +138 -0
  167. package/dist/docs/resources/deploy-to-vercel.md +62 -0
  168. package/dist/docs/resources/limits.md +24 -0
  169. package/dist/docs/resources/private-registry.md +23 -0
  170. package/dist/docs/resources/status.md +22 -0
  171. package/dist/docs/resources/user-model.md +38 -0
  172. package/dist/{download-ogGbb3FU.cjs → download-BkzmfQXD.cjs} +2 -2
  173. package/dist/{download-ogGbb3FU.cjs.map → download-BkzmfQXD.cjs.map} +1 -1
  174. package/dist/{download-oFGzg30E.mjs → download-Dx1oyrMg.mjs} +2 -2
  175. package/dist/{download-oFGzg30E.mjs.map → download-Dx1oyrMg.mjs.map} +1 -1
  176. package/dist/{erd-zDoF6I_y.mjs → erd-BihhEfZ_.mjs} +3 -3
  177. package/dist/{erd-zDoF6I_y.mjs.map → erd-BihhEfZ_.mjs.map} +1 -1
  178. package/dist/{erd-lKC5NB2l.cjs → erd-DmnB1v2c.cjs} +3 -3
  179. package/dist/{erd-lKC5NB2l.cjs.map → erd-DmnB1v2c.cjs.map} +1 -1
  180. package/dist/{get-CgEgETQa.mjs → get-1TtxSEoT.mjs} +2 -2
  181. package/dist/{get-CgEgETQa.mjs.map → get-1TtxSEoT.mjs.map} +1 -1
  182. package/dist/{get-DjRyK0hJ.cjs → get-B5S1GfjR.cjs} +2 -2
  183. package/dist/{get-DjRyK0hJ.cjs.map → get-B5S1GfjR.cjs.map} +1 -1
  184. package/dist/{get-DDB89cOs.mjs → get-BLDHE_Zl.mjs} +2 -2
  185. package/dist/{get-DDB89cOs.mjs.map → get-BLDHE_Zl.mjs.map} +1 -1
  186. package/dist/{get-KdWfYINc.cjs → get-C5OH05Ka.cjs} +2 -2
  187. package/dist/{get-KdWfYINc.cjs.map → get-C5OH05Ka.cjs.map} +1 -1
  188. package/dist/{get-DwtzBjGV.cjs → get-CKZPn669.cjs} +2 -2
  189. package/dist/{get-DwtzBjGV.cjs.map → get-CKZPn669.cjs.map} +1 -1
  190. package/dist/{get-IOU__2RP.cjs → get-CdDZkUXV.cjs} +2 -2
  191. package/dist/{get-IOU__2RP.cjs.map → get-CdDZkUXV.cjs.map} +1 -1
  192. package/dist/{get-DB80UNSR.mjs → get-Cw4Dw5NG.mjs} +2 -2
  193. package/dist/{get-DB80UNSR.mjs.map → get-Cw4Dw5NG.mjs.map} +1 -1
  194. package/dist/{get-C7dKoSIc.mjs → get-Dy3AD4il.mjs} +2 -2
  195. package/dist/{get-C7dKoSIc.mjs.map → get-Dy3AD4il.mjs.map} +1 -1
  196. package/dist/{get-BBOKSXkh.cjs → get-PVsUGHBR.cjs} +2 -2
  197. package/dist/{get-BBOKSXkh.cjs.map → get-PVsUGHBR.cjs.map} +1 -1
  198. package/dist/{get-B6vBaq_D.mjs → get-Vo3yr12d.mjs} +2 -2
  199. package/dist/{get-B6vBaq_D.mjs.map → get-Vo3yr12d.mjs.map} +1 -1
  200. package/dist/{get-jwXRlIBJ.cjs → get-jaN2o0XY.cjs} +2 -2
  201. package/dist/{get-jwXRlIBJ.cjs.map → get-jaN2o0XY.cjs.map} +1 -1
  202. package/dist/{get-DBxhbN1G.mjs → get-qOKYAc46.mjs} +2 -2
  203. package/dist/{get-DBxhbN1G.mjs.map → get-qOKYAc46.mjs.map} +1 -1
  204. package/dist/init-BpKpTQ0z.mjs +425 -0
  205. package/dist/init-BpKpTQ0z.mjs.map +1 -0
  206. package/dist/init-BrZCChEG.cjs +427 -0
  207. package/dist/init-BrZCChEG.cjs.map +1 -0
  208. package/dist/{invite-DPygtCoO.cjs → invite-Tw3SMV0Q.cjs} +2 -2
  209. package/dist/{invite-DPygtCoO.cjs.map → invite-Tw3SMV0Q.cjs.map} +1 -1
  210. package/dist/{invite-D66DSMvq.mjs → invite-vzajkU2u.mjs} +2 -2
  211. package/dist/{invite-D66DSMvq.mjs.map → invite-vzajkU2u.mjs.map} +1 -1
  212. package/dist/{key-C71Ffll9.mjs → key-CyVxu3Uk.mjs} +3 -3
  213. package/dist/{key-C71Ffll9.mjs.map → key-CyVxu3Uk.mjs.map} +1 -1
  214. package/dist/{key-DQr7qRL2.cjs → key-tRYRqYNo.cjs} +3 -3
  215. package/dist/{key-DQr7qRL2.cjs.map → key-tRYRqYNo.cjs.map} +1 -1
  216. package/dist/{link-BluFyxEL.mjs → link-Bd55x5Zf.mjs} +2 -2
  217. package/dist/{link-BluFyxEL.mjs.map → link-Bd55x5Zf.mjs.map} +1 -1
  218. package/dist/{link-DYu1Vjlw.cjs → link-Cz7MX02S.cjs} +2 -2
  219. package/dist/{link-DYu1Vjlw.cjs.map → link-Cz7MX02S.cjs.map} +1 -1
  220. package/dist/{list-D5PSDMWw.mjs → list-2otVufvs.mjs} +3 -3
  221. package/dist/{list-D5PSDMWw.mjs.map → list-2otVufvs.mjs.map} +1 -1
  222. package/dist/{list-sQk00GV5.mjs → list-BMnBuZMr.mjs} +2 -2
  223. package/dist/{list-sQk00GV5.mjs.map → list-BMnBuZMr.mjs.map} +1 -1
  224. package/dist/{list-BwfpuhmJ.cjs → list-Bo8IMFd0.cjs} +2 -2
  225. package/dist/{list-BwfpuhmJ.cjs.map → list-Bo8IMFd0.cjs.map} +1 -1
  226. package/dist/{list-B0N4-Q-5.mjs → list-BtgAAUKm.mjs} +2 -2
  227. package/dist/{list-B0N4-Q-5.mjs.map → list-BtgAAUKm.mjs.map} +1 -1
  228. package/dist/{list-vbMaOiza.mjs → list-C0lq-gBZ.mjs} +2 -2
  229. package/dist/{list-vbMaOiza.mjs.map → list-C0lq-gBZ.mjs.map} +1 -1
  230. package/dist/{list-BsYYq9wT.mjs → list-CGZ3iT6J.mjs} +2 -2
  231. package/dist/{list-BsYYq9wT.mjs.map → list-CGZ3iT6J.mjs.map} +1 -1
  232. package/dist/{list-CFwW0G9f.cjs → list-CMWXO4nB.cjs} +2 -2
  233. package/dist/{list-CFwW0G9f.cjs.map → list-CMWXO4nB.cjs.map} +1 -1
  234. package/dist/{list-rAn3uOA7.mjs → list-Ccaec0cs.mjs} +2 -2
  235. package/dist/{list-rAn3uOA7.mjs.map → list-Ccaec0cs.mjs.map} +1 -1
  236. package/dist/{list-CU42ERNY.cjs → list-Cp_mHwbN.cjs} +2 -2
  237. package/dist/{list-CU42ERNY.cjs.map → list-Cp_mHwbN.cjs.map} +1 -1
  238. package/dist/{list-D0-QrWmn.cjs → list-Cs7kbAAi.cjs} +3 -3
  239. package/dist/{list-D0-QrWmn.cjs.map → list-Cs7kbAAi.cjs.map} +1 -1
  240. package/dist/{list-DlJssPwy.cjs → list-D5IaYurn.cjs} +2 -2
  241. package/dist/{list-DlJssPwy.cjs.map → list-D5IaYurn.cjs.map} +1 -1
  242. package/dist/{list-CbvEh7eA.mjs → list-DcIBInNA.mjs} +2 -2
  243. package/dist/{list-CbvEh7eA.mjs.map → list-DcIBInNA.mjs.map} +1 -1
  244. package/dist/{list-BzLraBnA.cjs → list-Dd3veD9Z.cjs} +2 -2
  245. package/dist/{list-BzLraBnA.cjs.map → list-Dd3veD9Z.cjs.map} +1 -1
  246. package/dist/{list-DexBclfb.cjs → list-DdVKKaDN.cjs} +2 -2
  247. package/dist/{list-DexBclfb.cjs.map → list-DdVKKaDN.cjs.map} +1 -1
  248. package/dist/{list-Br6Cmi9S.cjs → list-E1sjTZLe.cjs} +2 -2
  249. package/dist/{list-Br6Cmi9S.cjs.map → list-E1sjTZLe.cjs.map} +1 -1
  250. package/dist/{list-BRh59EqI.cjs → list-KI-7REC_.cjs} +2 -2
  251. package/dist/{list-BRh59EqI.cjs.map → list-KI-7REC_.cjs.map} +1 -1
  252. package/dist/{list-ocfd7631.mjs → list-MWD4huKP.mjs} +2 -2
  253. package/dist/{list-ocfd7631.mjs.map → list-MWD4huKP.mjs.map} +1 -1
  254. package/dist/{list-57TUfNFd.mjs → list-Pf5aAoaN.mjs} +2 -2
  255. package/dist/{list-57TUfNFd.mjs.map → list-Pf5aAoaN.mjs.map} +1 -1
  256. package/dist/{list-BHvURTWd.cjs → list-fG4zo8zz.cjs} +2 -2
  257. package/dist/{list-BHvURTWd.cjs.map → list-fG4zo8zz.cjs.map} +1 -1
  258. package/dist/{list-DrZYlidZ.mjs → list-r2UPz1zW.mjs} +2 -2
  259. package/dist/{list-DrZYlidZ.mjs.map → list-r2UPz1zW.mjs.map} +1 -1
  260. package/dist/{login-FE_dbWMo.mjs → login-Dq2L3bI7.mjs} +2 -2
  261. package/dist/{login-FE_dbWMo.mjs.map → login-Dq2L3bI7.mjs.map} +1 -1
  262. package/dist/{login-2XcHd4wn.cjs → login-M1IF2MdC.cjs} +2 -2
  263. package/dist/{login-2XcHd4wn.cjs.map → login-M1IF2MdC.cjs.map} +1 -1
  264. package/dist/{logout-DC5TMJ5_.cjs → logout-BCSfFgPz.cjs} +2 -2
  265. package/dist/{logout-DC5TMJ5_.cjs.map → logout-BCSfFgPz.cjs.map} +1 -1
  266. package/dist/{logout-BDbWrGBm.mjs → logout-DFzQCQKe.mjs} +2 -2
  267. package/dist/{logout-BDbWrGBm.mjs.map → logout-DFzQCQKe.mjs.map} +1 -1
  268. package/dist/management-C1p-Hm2Z.cjs +19 -0
  269. package/dist/{management-BGYcZB4c.cjs.map → management-C1p-Hm2Z.cjs.map} +1 -1
  270. package/dist/{management-DDACMgbU.mjs → management-h4yE09a6.mjs} +5 -5
  271. package/dist/{management-DDACMgbU.mjs.map → management-h4yE09a6.mjs.map} +1 -1
  272. package/dist/object-CZDLoc9L.cjs +20 -0
  273. package/dist/{object-DVqidsEc.cjs.map → object-CZDLoc9L.cjs.map} +1 -1
  274. package/dist/object-CqMsEkh9.mjs +20 -0
  275. package/dist/{object-qdBdEghr.mjs.map → object-CqMsEkh9.mjs.map} +1 -1
  276. package/dist/{org-CPhTRTks.mjs → org-Co-rjfr-.mjs} +2 -2
  277. package/dist/{org-CPhTRTks.mjs.map → org-Co-rjfr-.mjs.map} +1 -1
  278. package/dist/{org-C4cVovOM.cjs → org-Drj3VqIm.cjs} +2 -2
  279. package/dist/{org-C4cVovOM.cjs.map → org-Drj3VqIm.cjs.map} +1 -1
  280. package/dist/{org-context-Bewx2NEW.cjs → org-context-DKFnPH_o.cjs} +2 -2
  281. package/dist/{org-context-Bewx2NEW.cjs.map → org-context-DKFnPH_o.cjs.map} +1 -1
  282. package/dist/{org-context-D0dwWC2M.mjs → org-context-Df5McOiK.mjs} +2 -2
  283. package/dist/{org-context-D0dwWC2M.mjs.map → org-context-Df5McOiK.mjs.map} +1 -1
  284. package/dist/project-C7qWFjMV.mjs +20 -0
  285. package/dist/{project-CaXD3QBs.mjs.map → project-C7qWFjMV.mjs.map} +1 -1
  286. package/dist/project-Dm7nr5NV.cjs +20 -0
  287. package/dist/{project-BX7zvWB1.cjs.map → project-Dm7nr5NV.cjs.map} +1 -1
  288. package/dist/project-user-D9h_QBc0.mjs +20 -0
  289. package/dist/{project-user-Cp7i6orv.mjs.map → project-user-D9h_QBc0.mjs.map} +1 -1
  290. package/dist/project-user-wLFnHFwB.cjs +20 -0
  291. package/dist/{project-user-Dm0qR-sh.cjs.map → project-user-wLFnHFwB.cjs.map} +1 -1
  292. package/dist/prompt-C-XNDSNE.cjs +42 -0
  293. package/dist/prompt-C-XNDSNE.cjs.map +1 -0
  294. package/dist/prompt-Dr2Rkxun.mjs +25 -0
  295. package/dist/prompt-Dr2Rkxun.mjs.map +1 -0
  296. package/dist/{push-0u6PDz4E.cjs → push-BggkrD0g.cjs} +31 -12
  297. package/dist/push-BggkrD0g.cjs.map +1 -0
  298. package/dist/{push-D7co0keA.mjs → push-xWnD9oov.mjs} +30 -11
  299. package/dist/push-xWnD9oov.mjs.map +1 -0
  300. package/dist/{run-codegen-Ceeosw5x.cjs → run-codegen-B-90rvjk.cjs} +4 -4
  301. package/dist/run-codegen-B-90rvjk.cjs.map +1 -0
  302. package/dist/{run-codegen-DgaFaIQ1.mjs → run-codegen-CrO08jJT.mjs} +4 -4
  303. package/dist/run-codegen-CrO08jJT.mjs.map +1 -0
  304. package/dist/{run-with-context-CVhmzAFZ.mjs → run-with-context-B4DyI8Wo.mjs} +6 -26
  305. package/dist/run-with-context-B4DyI8Wo.mjs.map +1 -0
  306. package/dist/{run-with-context-DJNnEigg.cjs → run-with-context-D8pSrqD_.cjs} +7 -39
  307. package/dist/run-with-context-D8pSrqD_.cjs.map +1 -0
  308. package/dist/schema-CUVTXrHk.cjs +20 -0
  309. package/dist/{schema-B3iRqvYK.cjs.map → schema-CUVTXrHk.cjs.map} +1 -1
  310. package/dist/schema-DlUWHV_t.mjs +20 -0
  311. package/dist/{schema-exG250MU.mjs.map → schema-DlUWHV_t.mjs.map} +1 -1
  312. package/dist/{status-Dq_NJE71.cjs → status-CqPJTxeK.cjs} +2 -2
  313. package/dist/{status-Dq_NJE71.cjs.map → status-CqPJTxeK.cjs.map} +1 -1
  314. package/dist/{status-fWqXzV0P.mjs → status-D7nOW3R3.mjs} +2 -2
  315. package/dist/{status-fWqXzV0P.mjs.map → status-D7nOW3R3.mjs.map} +1 -1
  316. package/dist/{token-store--9GYVL7N.cjs → token-store-BgWGhqq0.cjs} +3 -3
  317. package/dist/{token-store--9GYVL7N.cjs.map → token-store-BgWGhqq0.cjs.map} +1 -1
  318. package/dist/{token-store-reCGF86F.mjs → token-store-C2r7cFA-.mjs} +2 -2
  319. package/dist/{token-store-reCGF86F.mjs.map → token-store-C2r7cFA-.mjs.map} +1 -1
  320. package/dist/{update-B4lv4dAz.mjs → update-8-sHFvNB.mjs} +2 -2
  321. package/dist/{update-B4lv4dAz.mjs.map → update-8-sHFvNB.mjs.map} +1 -1
  322. package/dist/{update-Dyo4vuZs.mjs → update-B5hKKw0K.mjs} +3 -3
  323. package/dist/{update-Dyo4vuZs.mjs.map → update-B5hKKw0K.mjs.map} +1 -1
  324. package/dist/{update-Do9HHWzs.cjs → update-BVaqURWE.cjs} +2 -2
  325. package/dist/{update-Do9HHWzs.cjs.map → update-BVaqURWE.cjs.map} +1 -1
  326. package/dist/{update-DRnN1kiu.cjs → update-BlUwNhLA.cjs} +2 -2
  327. package/dist/{update-DRnN1kiu.cjs.map → update-BlUwNhLA.cjs.map} +1 -1
  328. package/dist/{update-Cx_2GkQj.cjs → update-BqhLwuP7.cjs} +2 -2
  329. package/dist/{update-Cx_2GkQj.cjs.map → update-BqhLwuP7.cjs.map} +1 -1
  330. package/dist/{update-mEmULIau.mjs → update-DaYjh5VN.mjs} +2 -2
  331. package/dist/{update-mEmULIau.mjs.map → update-DaYjh5VN.mjs.map} +1 -1
  332. package/dist/{update-CJgEmSWJ.cjs → update-DcTzR54Z.cjs} +3 -3
  333. package/dist/{update-CJgEmSWJ.cjs.map → update-DcTzR54Z.cjs.map} +1 -1
  334. package/dist/{update-CIH6sSVk.cjs → update-Dne7g_0s.cjs} +2 -2
  335. package/dist/{update-CIH6sSVk.cjs.map → update-Dne7g_0s.cjs.map} +1 -1
  336. package/dist/{update-CQ4n4Xuf.mjs → update-Dy1BOnTB.mjs} +2 -2
  337. package/dist/{update-CQ4n4Xuf.mjs.map → update-Dy1BOnTB.mjs.map} +1 -1
  338. package/dist/{update-rzij1b_o.mjs → update-slz_X0mG.mjs} +2 -2
  339. package/dist/{update-rzij1b_o.mjs.map → update-slz_X0mG.mjs.map} +1 -1
  340. package/dist/{upload-DGgJ1TQk.mjs → upload-CDtzV9Wx.mjs} +3 -3
  341. package/dist/{upload-DGgJ1TQk.mjs.map → upload-CDtzV9Wx.mjs.map} +1 -1
  342. package/dist/{upload-C43ZXxyb.cjs → upload-DIln1QDA.cjs} +3 -3
  343. package/dist/{upload-C43ZXxyb.cjs.map → upload-DIln1QDA.cjs.map} +1 -1
  344. package/dist/{validate-BpxZ8LTl.cjs → validate-BH8jqdqq.cjs} +2 -2
  345. package/dist/{validate-BpxZ8LTl.cjs.map → validate-BH8jqdqq.cjs.map} +1 -1
  346. package/dist/{validate-Ca0CRo16.mjs → validate-COS4bfr0.mjs} +2 -2
  347. package/dist/{validate-Ca0CRo16.mjs.map → validate-COS4bfr0.mjs.map} +1 -1
  348. package/dist/webhook-BT3cHrq5.mjs +20 -0
  349. package/dist/{webhook-CpZ1-Ho5.mjs.map → webhook-BT3cHrq5.mjs.map} +1 -1
  350. package/dist/webhook-CQeuAqec.cjs +20 -0
  351. package/dist/{webhook-CbL4QaR5.cjs.map → webhook-CQeuAqec.cjs.map} +1 -1
  352. package/package.json +10 -9
  353. package/dist/auth-CNbONZuf.cjs +0 -18
  354. package/dist/cms-BJnovGYT.mjs.map +0 -1
  355. package/dist/cms-Cnx-lDGu.cjs.map +0 -1
  356. package/dist/config-loader-BEgS869e.mjs.map +0 -1
  357. package/dist/config-loader-D8x32gEU.cjs.map +0 -1
  358. package/dist/consumer-OF6Z_eTP.cjs.map +0 -1
  359. package/dist/consumer-l-8wUK8E.cjs +0 -18
  360. package/dist/consumer-pU2HyiyA.mjs.map +0 -1
  361. package/dist/content-BOb6NC8M.mjs +0 -20
  362. package/dist/content-DMjSwor1.cjs +0 -20
  363. package/dist/management-BGYcZB4c.cjs +0 -19
  364. package/dist/object-DVqidsEc.cjs +0 -20
  365. package/dist/object-qdBdEghr.mjs +0 -20
  366. package/dist/project-BX7zvWB1.cjs +0 -20
  367. package/dist/project-CaXD3QBs.mjs +0 -20
  368. package/dist/project-user-Cp7i6orv.mjs +0 -20
  369. package/dist/project-user-Dm0qR-sh.cjs +0 -20
  370. package/dist/push-0u6PDz4E.cjs.map +0 -1
  371. package/dist/push-D7co0keA.mjs.map +0 -1
  372. package/dist/run-codegen-Ceeosw5x.cjs.map +0 -1
  373. package/dist/run-codegen-DgaFaIQ1.mjs.map +0 -1
  374. package/dist/run-with-context-CVhmzAFZ.mjs.map +0 -1
  375. package/dist/run-with-context-DJNnEigg.cjs.map +0 -1
  376. package/dist/schema-B3iRqvYK.cjs +0 -20
  377. package/dist/schema-exG250MU.mjs +0 -20
  378. package/dist/webhook-CbL4QaR5.cjs +0 -20
  379. package/dist/webhook-CpZ1-Ho5.mjs +0 -20
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-with-context-D8pSrqD_.cjs","names":["#store","#inflight","Result","#toAccessToken","#refreshOnce","#doRefresh","refreshTokens","v","path","Result","Result","Result","v","Result","Result","path","Result","Result","select","confirm","resolveEnv","Result","FileTokenStore"],"sources":["../src/cli/auth/refresh.ts","../src/cli/context/project.ts","../src/cli/credentials/resolve.ts","../../internal-shared/dist/assert-valid-url-origin-XeiLzH_m.mjs","../../internal-shared/dist/api-clients/dev-v2-api-client.mjs","../src/cli/api/client.ts","../src/cli/api/errors.ts","../src/cli/api/organizations.ts","../src/cli/context/gitignore.ts","../src/cli/commands/api-errors.ts","../src/cli/commands/link-flow.ts","../src/cli/commands/run-with-context.ts"],"sourcesContent":["import { Result } from \"@praha/byethrow\";\nimport { refreshTokens } from \"./oauth-client.js\";\nimport type { TokenEntry, TokenStore } from \"./token-store.js\";\n\nconst REFRESH_THRESHOLD_MS = 60 * 1000;\n\nexport type RefreshError =\n | { type: \"no_token\" }\n | { type: \"refresh_failed\"; reason: string };\n\nexport class TokenRefresher {\n readonly #store: TokenStore;\n // 同一プロセス内で同じ issuer のリフレッシュを二重に走らせると rotation reuse 検出に当たるため、\n // 進行中の Promise を共有して 1 度だけ走らせる。\n readonly #inflight = new Map<\n string,\n Promise<Result.Result<TokenEntry, RefreshError>>\n >();\n\n constructor(store: TokenStore) {\n this.#store = store;\n }\n\n async getValidAccessToken(\n issuerUrl: string,\n ): Promise<Result.Result<string, RefreshError>> {\n const entry = await this.#store.get(issuerUrl);\n if (entry === undefined) return Result.fail({ type: \"no_token\" });\n if (!isExpiringSoon(entry.expiresAt)) {\n return Result.succeed(entry.accessToken);\n }\n return this.#toAccessToken(this.#refreshOnce(issuerUrl));\n }\n\n // 401 受信後に明示的に 1 度だけ呼ぶリアクティブなリフレッシュ。\n async forceRefresh(\n issuerUrl: string,\n ): Promise<Result.Result<string, RefreshError>> {\n return this.#toAccessToken(this.#refreshOnce(issuerUrl));\n }\n\n async #toAccessToken(\n pending: Promise<Result.Result<TokenEntry, RefreshError>>,\n ): Promise<Result.Result<string, RefreshError>> {\n const result = await pending;\n if (Result.isFailure(result)) return result;\n return Result.succeed(result.value.accessToken);\n }\n\n #refreshOnce(\n issuerUrl: string,\n ): Promise<Result.Result<TokenEntry, RefreshError>> {\n const existing = this.#inflight.get(issuerUrl);\n if (existing !== undefined) return existing;\n\n const pending = this.#doRefresh(issuerUrl).finally(() =>\n this.#inflight.delete(issuerUrl),\n );\n this.#inflight.set(issuerUrl, pending);\n return pending;\n }\n\n async #doRefresh(\n issuerUrl: string,\n ): Promise<Result.Result<TokenEntry, RefreshError>> {\n const entry = await this.#store.get(issuerUrl);\n if (entry === undefined) return Result.fail({ type: \"no_token\" });\n\n const refreshed = await refreshTokens({\n issuerUrl,\n refreshToken: entry.refreshToken,\n });\n if (Result.isFailure(refreshed)) {\n // revoked / expired。再ログインを促すためエントリを消す。\n await this.#store.remove(issuerUrl);\n return Result.fail({\n type: \"refresh_failed\",\n reason: refreshed.error.reason,\n });\n }\n\n const updated: TokenEntry = {\n ...entry,\n accessToken: refreshed.value.accessToken,\n refreshToken: refreshed.value.refreshToken,\n idToken: refreshed.value.idToken,\n scope: refreshed.value.scope,\n expiresAt: refreshed.value.expiresAt,\n };\n // 古い refresh_token を二度使うと rotation reuse 検出で失効するため、\n // 永続化を完了させてから呼び出し側へ返す。\n await this.#store.set(issuerUrl, updated);\n return Result.succeed(updated);\n }\n}\n\nfunction isExpiringSoon(expiresAt: string): boolean {\n const remaining = Date.parse(expiresAt) - Date.now();\n return remaining <= REFRESH_THRESHOLD_MS;\n}\n","import { access, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport * as v from \"valibot\";\nimport { Result } from \"@praha/byethrow\";\n\nexport type ProjectContext = {\n projectName: string;\n organizationName?: string;\n};\n\nexport type ProjectContextError =\n | { type: \"project_json_invalid\"; path: string }\n | { type: \"no_project_context\" };\n\nexport type OrganizationContextError = { type: \"no_organization_context\" };\n\nconst ProjectFileSchema = v.object({\n projectName: v.pipe(v.string(), v.nonEmpty()),\n organizationName: v.optional(v.pipe(v.string(), v.nonEmpty())),\n});\n\ntype FoundProjectFile = { path: string; context: ProjectContext };\n\n// リポジトリのサブディレクトリから実行されてもルート付近に置いた設定を拾えるよう、\n// 親方向にたどって最寄りの .orizm/project.json を探す。\nexport async function readNearestProjectFile(\n cwd: string = process.cwd(),\n): Promise<Result.Result<FoundProjectFile | undefined, ProjectContextError>> {\n let dir = path.resolve(cwd);\n for (;;) {\n const file = path.join(dir, \".orizm\", \"project.json\");\n const raw = await readFile(file, \"utf-8\").catch(\n (error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") return undefined;\n throw error;\n },\n );\n\n if (raw !== undefined) {\n const parsed = v.safeParse(ProjectFileSchema, safeJsonParse(raw));\n if (!parsed.success) {\n return Result.fail({ type: \"project_json_invalid\", path: file });\n }\n return Result.succeed({ path: file, context: parsed.output });\n }\n\n const parent = path.dirname(dir);\n if (parent === dir) return Result.succeed(undefined);\n dir = parent;\n }\n}\n\n// より明示的に与えられた指定ほど優先する(フラグ → 環境変数 → ファイル)。\nexport async function resolveProjectName(params: {\n flag?: string;\n env?: string;\n cwd?: string;\n}): Promise<Result.Result<string, ProjectContextError>> {\n if (params.flag != null && params.flag !== \"\") {\n return Result.succeed(params.flag);\n }\n if (params.env != null && params.env !== \"\") {\n return Result.succeed(params.env);\n }\n\n const found = await readNearestProjectFile(params.cwd);\n if (Result.isFailure(found)) return found;\n if (found.value === undefined) {\n return Result.fail({ type: \"no_project_context\" });\n }\n return Result.succeed(found.value.context.projectName);\n}\n\n// org が必要なコマンド(project list / create)は flag → .orizm/project.json の順で解決する。\n// ADR-004 の通り ORIZM_ORGANIZATION env は持たない。\nexport async function resolveOrganizationName(params: {\n flag?: string;\n cwd?: string;\n}): Promise<\n Result.Result<string, ProjectContextError | OrganizationContextError>\n> {\n if (params.flag != null && params.flag !== \"\") {\n return Result.succeed(params.flag);\n }\n\n const found = await readNearestProjectFile(params.cwd);\n if (Result.isFailure(found)) return found;\n\n const organizationName = found.value?.context.organizationName;\n if (organizationName == null || organizationName === \"\") {\n return Result.fail({ type: \"no_organization_context\" });\n }\n return Result.succeed(organizationName);\n}\n\n// link が対象とするディレクトリ。CWD から親方向に .orizm/project.json を持つ最寄りを探し、\n// 見つかればそのディレクトリを、無ければ CWD を返す。read (resolveProjectName) と同じ探索のため、\n// link が書くファイルと後続コマンドが読むファイルが必ず一致し、重複した .orizm を作らない。\nexport async function resolveLinkDirectory(\n cwd: string = process.cwd(),\n): Promise<string> {\n let dir = path.resolve(cwd);\n for (;;) {\n const exists = await access(path.join(dir, \".orizm\", \"project.json\")).then(\n () => true,\n () => false,\n );\n if (exists) return dir;\n\n const parent = path.dirname(dir);\n if (parent === dir) return path.resolve(cwd);\n dir = parent;\n }\n}\n\n// 指定ディレクトリ直下の .orizm/project.json を読む。無い / 壊れているなら undefined。\nexport async function readProjectFileAt(\n dir: string,\n): Promise<ProjectContext | undefined> {\n const file = path.join(path.resolve(dir), \".orizm\", \"project.json\");\n const raw = await readFile(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 undefined;\n\n const parsed = v.safeParse(ProjectFileSchema, safeJsonParse(raw));\n return parsed.success ? parsed.output : undefined;\n}\n\n// link で選んだ結果を 指定ディレクトリ直下の .orizm/project.json に書き出す。戻り値は書き込んだパス。\nexport async function writeProjectFile(\n dir: string,\n context: ProjectContext,\n): Promise<string> {\n const orizmDir = path.join(path.resolve(dir), \".orizm\");\n await mkdir(orizmDir, { recursive: true });\n const file = path.join(orizmDir, \"project.json\");\n await writeFile(file, JSON.stringify(context, null, 2) + \"\\n\", \"utf-8\");\n return file;\n}\n\nfunction safeJsonParse(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return undefined;\n }\n}\n","import { Result } from \"@praha/byethrow\";\nimport type { TokenStore } from \"../auth/token-store.js\";\n\nexport type Credentials =\n | { type: \"bearer\"; issuerUrl: string }\n | { type: \"api-key\"; apiKey: string };\n\nexport type ResolveCredentialsError = { type: \"no_credentials\" };\n\n// ログイン済みなら OAuth2 トークンを優先し、無ければ ORIZM_API_KEY を使う。\n// トークンがあるのに API キーへフォールバックすると、ログインした identity と\n// 別アカウントのキーが混ざって原因の分かりにくいアクセス失敗を招くため、フォールバックしない。\nexport async function resolveCredentials(params: {\n store: TokenStore;\n issuerUrl: string;\n apiKey: string | undefined;\n}): Promise<Result.Result<Credentials, ResolveCredentialsError>> {\n const entry = await params.store.get(params.issuerUrl);\n if (entry !== undefined) {\n return Result.succeed({ type: \"bearer\", issuerUrl: params.issuerUrl });\n }\n if (params.apiKey !== undefined) {\n return Result.succeed({ type: \"api-key\", apiKey: params.apiKey });\n }\n return Result.fail({ type: \"no_credentials\" });\n}\n","//#region ../../node_modules/.pnpm/openapi-fetch@0.17.0/node_modules/openapi-fetch/dist/index.mjs\nconst PATH_PARAM_RE = /\\{[^{}]+\\}/g;\nconst supportsRequestInitExt = () => {\n\treturn typeof process === \"object\" && Number.parseInt(process?.versions?.node?.substring(0, 2)) >= 18 && process.versions.undici;\n};\nfunction randomID() {\n\treturn Math.random().toString(36).slice(2, 11);\n}\nfunction createClient(clientOptions) {\n\tlet { baseUrl = \"\", Request: CustomRequest = globalThis.Request, fetch: baseFetch = globalThis.fetch, querySerializer: globalQuerySerializer, bodySerializer: globalBodySerializer, pathSerializer: globalPathSerializer, headers: baseHeaders, requestInitExt = void 0, ...baseOptions } = { ...clientOptions };\n\trequestInitExt = supportsRequestInitExt() ? requestInitExt : void 0;\n\tbaseUrl = removeTrailingSlash(baseUrl);\n\tconst globalMiddlewares = [];\n\tasync function coreFetch(schemaPath, fetchOptions) {\n\t\tconst { baseUrl: localBaseUrl, fetch = baseFetch, Request = CustomRequest, headers, params = {}, parseAs = \"json\", querySerializer: requestQuerySerializer, bodySerializer = globalBodySerializer ?? defaultBodySerializer, pathSerializer: requestPathSerializer, body, middleware: requestMiddlewares = [], ...init } = fetchOptions || {};\n\t\tlet finalBaseUrl = baseUrl;\n\t\tif (localBaseUrl) finalBaseUrl = removeTrailingSlash(localBaseUrl) ?? baseUrl;\n\t\tlet querySerializer = typeof globalQuerySerializer === \"function\" ? globalQuerySerializer : createQuerySerializer(globalQuerySerializer);\n\t\tif (requestQuerySerializer) querySerializer = typeof requestQuerySerializer === \"function\" ? requestQuerySerializer : createQuerySerializer({\n\t\t\t...typeof globalQuerySerializer === \"object\" ? globalQuerySerializer : {},\n\t\t\t...requestQuerySerializer\n\t\t});\n\t\tconst pathSerializer = requestPathSerializer || globalPathSerializer || defaultPathSerializer;\n\t\tconst serializedBody = body === void 0 ? void 0 : bodySerializer(body, mergeHeaders(baseHeaders, headers, params.header));\n\t\tconst finalHeaders = mergeHeaders(serializedBody === void 0 || serializedBody instanceof FormData ? {} : { \"Content-Type\": \"application/json\" }, baseHeaders, headers, params.header);\n\t\tconst finalMiddlewares = [...globalMiddlewares, ...requestMiddlewares];\n\t\tconst requestInit = {\n\t\t\tredirect: \"follow\",\n\t\t\t...baseOptions,\n\t\t\t...init,\n\t\t\tbody: serializedBody,\n\t\t\theaders: finalHeaders\n\t\t};\n\t\tlet id;\n\t\tlet options;\n\t\tlet request = new Request(createFinalURL(schemaPath, {\n\t\t\tbaseUrl: finalBaseUrl,\n\t\t\tparams,\n\t\t\tquerySerializer,\n\t\t\tpathSerializer\n\t\t}), requestInit);\n\t\tlet response;\n\t\tfor (const key in init) if (!(key in request)) request[key] = init[key];\n\t\tif (finalMiddlewares.length) {\n\t\t\tid = randomID();\n\t\t\toptions = Object.freeze({\n\t\t\t\tbaseUrl: finalBaseUrl,\n\t\t\t\tfetch,\n\t\t\t\tparseAs,\n\t\t\t\tquerySerializer,\n\t\t\t\tbodySerializer,\n\t\t\t\tpathSerializer\n\t\t\t});\n\t\t\tfor (const m of finalMiddlewares) if (m && typeof m === \"object\" && typeof m.onRequest === \"function\") {\n\t\t\t\tconst result = await m.onRequest({\n\t\t\t\t\trequest,\n\t\t\t\t\tschemaPath,\n\t\t\t\t\tparams,\n\t\t\t\t\toptions,\n\t\t\t\t\tid\n\t\t\t\t});\n\t\t\t\tif (result) if (result instanceof Request) request = result;\n\t\t\t\telse if (result instanceof Response) {\n\t\t\t\t\tresponse = result;\n\t\t\t\t\tbreak;\n\t\t\t\t} else throw new Error(\"onRequest: must return new Request() or Response() when modifying the request\");\n\t\t\t}\n\t\t}\n\t\tif (!response) {\n\t\t\ttry {\n\t\t\t\tresponse = await fetch(request, requestInitExt);\n\t\t\t} catch (error2) {\n\t\t\t\tlet errorAfterMiddleware = error2;\n\t\t\t\tif (finalMiddlewares.length) for (let i = finalMiddlewares.length - 1; i >= 0; i--) {\n\t\t\t\t\tconst m = finalMiddlewares[i];\n\t\t\t\t\tif (m && typeof m === \"object\" && typeof m.onError === \"function\") {\n\t\t\t\t\t\tconst result = await m.onError({\n\t\t\t\t\t\t\trequest,\n\t\t\t\t\t\t\terror: errorAfterMiddleware,\n\t\t\t\t\t\t\tschemaPath,\n\t\t\t\t\t\t\tparams,\n\t\t\t\t\t\t\toptions,\n\t\t\t\t\t\t\tid\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (result) {\n\t\t\t\t\t\t\tif (result instanceof Response) {\n\t\t\t\t\t\t\t\terrorAfterMiddleware = void 0;\n\t\t\t\t\t\t\t\tresponse = result;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (result instanceof Error) {\n\t\t\t\t\t\t\t\terrorAfterMiddleware = result;\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthrow new Error(\"onError: must return new Response() or instance of Error\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (errorAfterMiddleware) throw errorAfterMiddleware;\n\t\t\t}\n\t\t\tif (finalMiddlewares.length) for (let i = finalMiddlewares.length - 1; i >= 0; i--) {\n\t\t\t\tconst m = finalMiddlewares[i];\n\t\t\t\tif (m && typeof m === \"object\" && typeof m.onResponse === \"function\") {\n\t\t\t\t\tconst result = await m.onResponse({\n\t\t\t\t\t\trequest,\n\t\t\t\t\t\tresponse,\n\t\t\t\t\t\tschemaPath,\n\t\t\t\t\t\tparams,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\tid\n\t\t\t\t\t});\n\t\t\t\t\tif (result) {\n\t\t\t\t\t\tif (!(result instanceof Response)) throw new Error(\"onResponse: must return new Response() when modifying the response\");\n\t\t\t\t\t\tresponse = result;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst contentLength = response.headers.get(\"Content-Length\");\n\t\tif (response.status === 204 || request.method === \"HEAD\" || contentLength === \"0\" && !response.headers.get(\"Transfer-Encoding\")?.includes(\"chunked\")) return response.ok ? {\n\t\t\tdata: void 0,\n\t\t\tresponse\n\t\t} : {\n\t\t\terror: void 0,\n\t\t\tresponse\n\t\t};\n\t\tif (response.ok) {\n\t\t\tconst getResponseData = async () => {\n\t\t\t\tif (parseAs === \"stream\") return response.body;\n\t\t\t\tif (parseAs === \"json\" && !contentLength) {\n\t\t\t\t\tconst raw = await response.text();\n\t\t\t\t\treturn raw ? JSON.parse(raw) : void 0;\n\t\t\t\t}\n\t\t\t\treturn await response[parseAs]();\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tdata: await getResponseData(),\n\t\t\t\tresponse\n\t\t\t};\n\t\t}\n\t\tlet error = await response.text();\n\t\ttry {\n\t\t\terror = JSON.parse(error);\n\t\t} catch {}\n\t\treturn {\n\t\t\terror,\n\t\t\tresponse\n\t\t};\n\t}\n\treturn {\n\t\trequest(method, url, init) {\n\t\t\treturn coreFetch(url, {\n\t\t\t\t...init,\n\t\t\t\tmethod: method.toUpperCase()\n\t\t\t});\n\t\t},\n\t\t/** Call a GET endpoint */\n\t\tGET(url, init) {\n\t\t\treturn coreFetch(url, {\n\t\t\t\t...init,\n\t\t\t\tmethod: \"GET\"\n\t\t\t});\n\t\t},\n\t\t/** Call a PUT endpoint */\n\t\tPUT(url, init) {\n\t\t\treturn coreFetch(url, {\n\t\t\t\t...init,\n\t\t\t\tmethod: \"PUT\"\n\t\t\t});\n\t\t},\n\t\t/** Call a POST endpoint */\n\t\tPOST(url, init) {\n\t\t\treturn coreFetch(url, {\n\t\t\t\t...init,\n\t\t\t\tmethod: \"POST\"\n\t\t\t});\n\t\t},\n\t\t/** Call a DELETE endpoint */\n\t\tDELETE(url, init) {\n\t\t\treturn coreFetch(url, {\n\t\t\t\t...init,\n\t\t\t\tmethod: \"DELETE\"\n\t\t\t});\n\t\t},\n\t\t/** Call a OPTIONS endpoint */\n\t\tOPTIONS(url, init) {\n\t\t\treturn coreFetch(url, {\n\t\t\t\t...init,\n\t\t\t\tmethod: \"OPTIONS\"\n\t\t\t});\n\t\t},\n\t\t/** Call a HEAD endpoint */\n\t\tHEAD(url, init) {\n\t\t\treturn coreFetch(url, {\n\t\t\t\t...init,\n\t\t\t\tmethod: \"HEAD\"\n\t\t\t});\n\t\t},\n\t\t/** Call a PATCH endpoint */\n\t\tPATCH(url, init) {\n\t\t\treturn coreFetch(url, {\n\t\t\t\t...init,\n\t\t\t\tmethod: \"PATCH\"\n\t\t\t});\n\t\t},\n\t\t/** Call a TRACE endpoint */\n\t\tTRACE(url, init) {\n\t\t\treturn coreFetch(url, {\n\t\t\t\t...init,\n\t\t\t\tmethod: \"TRACE\"\n\t\t\t});\n\t\t},\n\t\t/** Register middleware */\n\t\tuse(...middleware) {\n\t\t\tfor (const m of middleware) {\n\t\t\t\tif (!m) continue;\n\t\t\t\tif (typeof m !== \"object\" || !(\"onRequest\" in m || \"onResponse\" in m || \"onError\" in m)) throw new Error(\"Middleware must be an object with one of `onRequest()`, `onResponse() or `onError()`\");\n\t\t\t\tglobalMiddlewares.push(m);\n\t\t\t}\n\t\t},\n\t\t/** Unregister middleware */\n\t\teject(...middleware) {\n\t\t\tfor (const m of middleware) {\n\t\t\t\tconst i = globalMiddlewares.indexOf(m);\n\t\t\t\tif (i !== -1) globalMiddlewares.splice(i, 1);\n\t\t\t}\n\t\t}\n\t};\n}\nvar PathCallForwarder = class {\n\tconstructor(client, url) {\n\t\tthis.client = client;\n\t\tthis.url = url;\n\t}\n\tGET = (init) => {\n\t\treturn this.client.GET(this.url, init);\n\t};\n\tPUT = (init) => {\n\t\treturn this.client.PUT(this.url, init);\n\t};\n\tPOST = (init) => {\n\t\treturn this.client.POST(this.url, init);\n\t};\n\tDELETE = (init) => {\n\t\treturn this.client.DELETE(this.url, init);\n\t};\n\tOPTIONS = (init) => {\n\t\treturn this.client.OPTIONS(this.url, init);\n\t};\n\tHEAD = (init) => {\n\t\treturn this.client.HEAD(this.url, init);\n\t};\n\tPATCH = (init) => {\n\t\treturn this.client.PATCH(this.url, init);\n\t};\n\tTRACE = (init) => {\n\t\treturn this.client.TRACE(this.url, init);\n\t};\n};\nvar PathClientProxyHandler = class {\n\tconstructor() {\n\t\tthis.client = null;\n\t}\n\tget(coreClient, url) {\n\t\tconst forwarder = new PathCallForwarder(coreClient, url);\n\t\tthis.client[url] = forwarder;\n\t\treturn forwarder;\n\t}\n};\nfunction wrapAsPathBasedClient(coreClient) {\n\tconst handler = new PathClientProxyHandler();\n\tconst proxy = new Proxy(coreClient, handler);\n\tfunction Client() {}\n\tClient.prototype = proxy;\n\tconst client = new Client();\n\thandler.client = client;\n\treturn client;\n}\nfunction createPathBasedClient(clientOptions) {\n\treturn wrapAsPathBasedClient(createClient(clientOptions));\n}\nfunction serializePrimitiveParam(name, value, options) {\n\tif (value === void 0 || value === null) return \"\";\n\tif (typeof value === \"object\") throw new Error(\"Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.\");\n\treturn `${name}=${options?.allowReserved === true ? value : encodeURIComponent(value)}`;\n}\nfunction serializeObjectParam(name, value, options) {\n\tif (!value || typeof value !== \"object\") return \"\";\n\tconst values = [];\n\tconst joiner = {\n\t\tsimple: \",\",\n\t\tlabel: \".\",\n\t\tmatrix: \";\"\n\t}[options.style] || \"&\";\n\tif (options.style !== \"deepObject\" && options.explode === false) {\n\t\tfor (const k in value) values.push(k, options.allowReserved === true ? value[k] : encodeURIComponent(value[k]));\n\t\tconst final2 = values.join(\",\");\n\t\tswitch (options.style) {\n\t\t\tcase \"form\": return `${name}=${final2}`;\n\t\t\tcase \"label\": return `.${final2}`;\n\t\t\tcase \"matrix\": return `;${name}=${final2}`;\n\t\t\tdefault: return final2;\n\t\t}\n\t}\n\tfor (const k in value) {\n\t\tconst finalName = options.style === \"deepObject\" ? `${name}[${k}]` : k;\n\t\tvalues.push(serializePrimitiveParam(finalName, value[k], options));\n\t}\n\tconst final = values.join(joiner);\n\treturn options.style === \"label\" || options.style === \"matrix\" ? `${joiner}${final}` : final;\n}\nfunction serializeArrayParam(name, value, options) {\n\tif (!Array.isArray(value)) return \"\";\n\tif (options.explode === false) {\n\t\tconst joiner2 = {\n\t\t\tform: \",\",\n\t\t\tspaceDelimited: \"%20\",\n\t\t\tpipeDelimited: \"|\"\n\t\t}[options.style] || \",\";\n\t\tconst final = (options.allowReserved === true ? value : value.map((v) => encodeURIComponent(v))).join(joiner2);\n\t\tswitch (options.style) {\n\t\t\tcase \"simple\": return final;\n\t\t\tcase \"label\": return `.${final}`;\n\t\t\tcase \"matrix\": return `;${name}=${final}`;\n\t\t\tdefault: return `${name}=${final}`;\n\t\t}\n\t}\n\tconst joiner = {\n\t\tsimple: \",\",\n\t\tlabel: \".\",\n\t\tmatrix: \";\"\n\t}[options.style] || \"&\";\n\tconst values = [];\n\tfor (const v of value) if (options.style === \"simple\" || options.style === \"label\") values.push(options.allowReserved === true ? v : encodeURIComponent(v));\n\telse values.push(serializePrimitiveParam(name, v, options));\n\treturn options.style === \"label\" || options.style === \"matrix\" ? `${joiner}${values.join(joiner)}` : values.join(joiner);\n}\nfunction createQuerySerializer(options) {\n\treturn function querySerializer(queryParams) {\n\t\tconst search = [];\n\t\tif (queryParams && typeof queryParams === \"object\") for (const name in queryParams) {\n\t\t\tconst value = queryParams[name];\n\t\t\tif (value === void 0 || value === null) continue;\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tif (value.length === 0) continue;\n\t\t\t\tsearch.push(serializeArrayParam(name, value, {\n\t\t\t\t\tstyle: \"form\",\n\t\t\t\t\texplode: true,\n\t\t\t\t\t...options?.array,\n\t\t\t\t\tallowReserved: options?.allowReserved || false\n\t\t\t\t}));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (typeof value === \"object\") {\n\t\t\t\tsearch.push(serializeObjectParam(name, value, {\n\t\t\t\t\tstyle: \"deepObject\",\n\t\t\t\t\texplode: true,\n\t\t\t\t\t...options?.object,\n\t\t\t\t\tallowReserved: options?.allowReserved || false\n\t\t\t\t}));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tsearch.push(serializePrimitiveParam(name, value, options));\n\t\t}\n\t\treturn search.join(\"&\");\n\t};\n}\nfunction defaultPathSerializer(pathname, pathParams) {\n\tlet nextURL = pathname;\n\tfor (const match of pathname.match(PATH_PARAM_RE) ?? []) {\n\t\tlet name = match.substring(1, match.length - 1);\n\t\tlet explode = false;\n\t\tlet style = \"simple\";\n\t\tif (name.endsWith(\"*\")) {\n\t\t\texplode = true;\n\t\t\tname = name.substring(0, name.length - 1);\n\t\t}\n\t\tif (name.startsWith(\".\")) {\n\t\t\tstyle = \"label\";\n\t\t\tname = name.substring(1);\n\t\t} else if (name.startsWith(\";\")) {\n\t\t\tstyle = \"matrix\";\n\t\t\tname = name.substring(1);\n\t\t}\n\t\tif (!pathParams || pathParams[name] === void 0 || pathParams[name] === null) continue;\n\t\tconst value = pathParams[name];\n\t\tif (Array.isArray(value)) {\n\t\t\tnextURL = nextURL.replace(match, serializeArrayParam(name, value, {\n\t\t\t\tstyle,\n\t\t\t\texplode\n\t\t\t}));\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof value === \"object\") {\n\t\t\tnextURL = nextURL.replace(match, serializeObjectParam(name, value, {\n\t\t\t\tstyle,\n\t\t\t\texplode\n\t\t\t}));\n\t\t\tcontinue;\n\t\t}\n\t\tif (style === \"matrix\") {\n\t\t\tnextURL = nextURL.replace(match, `;${serializePrimitiveParam(name, value)}`);\n\t\t\tcontinue;\n\t\t}\n\t\tnextURL = nextURL.replace(match, style === \"label\" ? `.${encodeURIComponent(value)}` : encodeURIComponent(value));\n\t}\n\treturn nextURL;\n}\nfunction defaultBodySerializer(body, headers) {\n\tif (body instanceof FormData) return body;\n\tif (headers) {\n\t\tif ((headers.get instanceof Function ? headers.get(\"Content-Type\") ?? headers.get(\"content-type\") : headers[\"Content-Type\"] ?? headers[\"content-type\"]) === \"application/x-www-form-urlencoded\") return new URLSearchParams(body).toString();\n\t}\n\treturn JSON.stringify(body);\n}\nfunction createFinalURL(pathname, options) {\n\tlet finalURL = `${options.baseUrl}${pathname}`;\n\tif (options.params?.path) finalURL = options.pathSerializer(finalURL, options.params.path);\n\tlet search = options.querySerializer(options.params.query ?? {});\n\tif (search.startsWith(\"?\")) search = search.substring(1);\n\tif (search) finalURL += `?${search}`;\n\treturn finalURL;\n}\nfunction mergeHeaders(...allHeaders) {\n\tconst finalHeaders = new Headers();\n\tfor (const h of allHeaders) {\n\t\tif (!h || typeof h !== \"object\") continue;\n\t\tconst iterator = h instanceof Headers ? h.entries() : Object.entries(h);\n\t\tfor (const [k, v] of iterator) if (v === null) finalHeaders.delete(k);\n\t\telse if (Array.isArray(v)) for (const v2 of v) finalHeaders.append(k, v2);\n\t\telse if (v !== void 0) finalHeaders.set(k, v);\n\t}\n\treturn finalHeaders;\n}\nfunction removeTrailingSlash(url) {\n\tif (url.endsWith(\"/\")) return url.substring(0, url.length - 1);\n\treturn url;\n}\n\n//#endregion\n//#region src/api-clients/assert-valid-url-origin.ts\nfunction assertValidUrlOrigin(origin) {\n\tif (new URL(origin).origin !== origin) throw new Error(`${origin} is not a valid URL origin`);\n}\n\n//#endregion\nexport { createClient as n, createPathBasedClient as r, assertValidUrlOrigin as t };\n//# sourceMappingURL=assert-valid-url-origin-XeiLzH_m.mjs.map","import { n as createClient, r as createPathBasedClient, t as assertValidUrlOrigin } from \"../assert-valid-url-origin-XeiLzH_m.mjs\";\n\n//#region src/api-clients/dev-v2-api-client.ts\nfunction createDeveloperAPIv2Client({ serverOrigin = \"\", fetch, headers }) {\n\tif (serverOrigin) assertValidUrlOrigin(serverOrigin);\n\treturn createClient({\n\t\tbaseUrl: `${serverOrigin}/api/dev/v2`,\n\t\tfetch,\n\t\theaders\n\t});\n}\nfunction createPathBasedDeveloperAPIv2Client({ serverOrigin = \"\", fetch, headers }) {\n\tif (serverOrigin) assertValidUrlOrigin(serverOrigin);\n\treturn createPathBasedClient({\n\t\tbaseUrl: `${serverOrigin}/api/dev/v2`,\n\t\tfetch,\n\t\theaders\n\t});\n}\n\n//#endregion\nexport { createDeveloperAPIv2Client, createPathBasedDeveloperAPIv2Client };\n//# sourceMappingURL=dev-v2-api-client.mjs.map","import { Result } from \"@praha/byethrow\";\nimport { createDeveloperAPIv2Client } from \"@orizm/internal-shared/api-clients/dev-v2\";\nimport type { Credentials } from \"../credentials/resolve.js\";\nimport type { TokenRefresher } from \"../auth/refresh.js\";\n\nexport type DeveloperApiClient = ReturnType<typeof createDeveloperAPIv2Client>;\n\nexport function createAuthenticatedClient(params: {\n baseUrl: string;\n credentials: Credentials;\n refresher: TokenRefresher;\n}): DeveloperApiClient {\n const authFetch = buildAuthFetch(params.credentials, params.refresher);\n return createDeveloperAPIv2Client({\n serverOrigin: params.baseUrl,\n fetch: authFetch,\n });\n}\n\nfunction buildAuthFetch(\n credentials: Credentials,\n refresher: TokenRefresher,\n): typeof fetch {\n if (credentials.type === \"api-key\") {\n const { apiKey } = credentials;\n return async (input, init) => {\n const request = new Request(input, init);\n request.headers.set(\"x-api-key\", apiKey);\n return globalThis.fetch(request);\n };\n }\n\n const { issuerUrl } = credentials;\n return async (input, init) => {\n const token = await refresher.getValidAccessToken(issuerUrl);\n if (Result.isFailure(token)) return unauthorizedResponse();\n\n const request = new Request(input, init);\n // 401 を受けたら 1 度だけリフレッシュして再送するため、消費前に複製しておく。\n const retryRequest = request.clone();\n request.headers.set(\"Authorization\", `Bearer ${token.value}`);\n\n const first = await globalThis.fetch(request);\n if (first.status !== 401) return first;\n\n const refreshed = await refresher.forceRefresh(issuerUrl);\n if (Result.isFailure(refreshed)) return first;\n\n retryRequest.headers.set(\"Authorization\", `Bearer ${refreshed.value}`);\n return globalThis.fetch(retryRequest);\n };\n}\n\n// OAuth2 トークンが解決できないときは 401 として返し、呼び出し側で unauthorized として扱わせる。\nfunction unauthorizedResponse(): Response {\n return new Response(\n JSON.stringify({\n type: \"unauthorized\",\n title: \"Unauthorized\",\n detail: \"Authentication is required. Run `orizm auth login`.\",\n }),\n { status: 401, headers: { \"content-type\": \"application/json\" } },\n );\n}\n","import * as v from \"valibot\";\nimport { Result } from \"@praha/byethrow\";\n\nexport type ApiError =\n | {\n type: \"bad_request\";\n detail: string;\n fields: { field: string; message: string }[];\n }\n | { type: \"unauthorized\"; detail: string }\n | { type: \"forbidden\"; detail: string }\n | { type: \"not_found\"; detail: string }\n | { type: \"conflict\"; detail: string };\n\nconst ProblemSchema = v.object({\n type: v.string(),\n title: v.string(),\n detail: v.string(),\n fields: v.optional(\n v.array(\n v.union([\n v.string(),\n v.object({ field: v.string(), message: v.string() }),\n ]),\n ),\n ),\n});\n\n// フラットな形にして data から T をクリーンに推論させる(discriminated union だと T が\n// `Body | undefined` に広がってしまう)。成否は data の有無ではなく error の有無で判定する。\ntype ApiCallResult<T> = { data?: T; error?: unknown; response: Response };\n\n// openapi-fetch は空 body(Content-Length: 0)だと 4xx でも error: undefined を返すため、\n// error の有無だけでは成功と判定できず response.ok も併せて見る。\n// 204 No Content は T 自体が undefined なので { data: T } への narrowing は健全。\nfunction isSuccess<T>(\n result: ApiCallResult<T>,\n): result is { data: T; error?: undefined; response: Response } {\n return result.response.ok && result.error === undefined;\n}\n\n// 4xx は呼び出し側が型で扱える予測可能エラーなので Result.fail に落とし、\n// 回復しようのない 5xx / 想定外なレスポンスは throw して上位の共通ハンドラに委ねる。\nexport function toResult<T>(\n result: ApiCallResult<T>,\n): Result.Result<T, ApiError> {\n if (result.response.status >= 500) {\n throw new Error(`Server responded with ${result.response.status}`);\n }\n\n if (!isSuccess(result)) {\n return failFromProblem(result.error, result.response);\n }\n\n // 条件型推論(Promise 分岐)を避けるためリテラルで返す。204 No Content は value が undefined。\n return { type: \"Success\", value: result.data };\n}\n\nfunction failFromProblem(\n error: unknown,\n response: Response,\n): Result.Result<never, ApiError> {\n const problem = v.safeParse(ProblemSchema, error);\n if (!problem.success) {\n throw new Error(`Unexpected API response (status ${response.status})`);\n }\n\n const apiError = toApiError(problem.output);\n if (apiError === undefined) {\n throw new Error(`Unhandled API error type: ${problem.output.type}`);\n }\n return Result.fail(apiError);\n}\n\nfunction toApiError(\n problem: v.InferOutput<typeof ProblemSchema>,\n): ApiError | undefined {\n switch (problem.type) {\n case \"bad-request\":\n return {\n type: \"bad_request\",\n detail: problem.detail,\n fields: objectFields(problem.fields),\n };\n case \"unauthorized\":\n return { type: \"unauthorized\", detail: problem.detail };\n case \"forbidden\":\n return { type: \"forbidden\", detail: problem.detail };\n case \"not-found\":\n return { type: \"not_found\", detail: problem.detail };\n case \"conflict\":\n return { type: \"conflict\", detail: problem.detail };\n default:\n return undefined;\n }\n}\n\nfunction objectFields(\n fields: v.InferOutput<typeof ProblemSchema>[\"fields\"],\n): { field: string; message: string }[] {\n if (fields === undefined) return [];\n return fields.filter(\n (field): field is { field: string; message: string } =>\n typeof field !== \"string\",\n );\n}\n","import { Result } from \"@praha/byethrow\";\nimport type { components } from \"@orizm/internal-shared/api-clients/dev-v2\";\nimport type { DeveloperApiClient } from \"./client.js\";\nimport { toResult, type ApiError } from \"./errors.js\";\n\nexport type Organization = components[\"schemas\"][\"Organization\"];\nexport type OrganizationId = components[\"schemas\"][\"OrganizationId\"];\n\nexport async function fetchOrganizations(\n client: DeveloperApiClient,\n): Promise<Result.Result<Organization[], ApiError>> {\n return toResult(await client.GET(\"/organizations\"));\n}\n\nexport type OrganizationResolveError =\n | ApiError\n | { type: \"organization_not_found\"; name: string };\n\n// Developer API は org を数値 id でしか受けないため、name → id を一覧から解決する(ADR-004)。\nexport async function resolveOrganizationId(\n client: DeveloperApiClient,\n name: string,\n): Promise<Result.Result<OrganizationId, OrganizationResolveError>> {\n const organizations = await fetchOrganizations(client);\n if (Result.isFailure(organizations)) return organizations;\n\n const matched = organizations.value.find((org) => org.name === name);\n if (matched === undefined) {\n return Result.fail({ type: \"organization_not_found\", name });\n }\n return Result.succeed(matched.id);\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nconst ENTRY = \".orizm/\";\n\n// 末尾スラッシュの有無や前後空白の揺れを許容して .orizm を無視済みか判定する。\nexport function gitignoreHasEntry(content: string): boolean {\n return content\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .some((line) => line === \".orizm\" || line === \".orizm/\");\n}\n\nfunction enoentToUndefined(error: NodeJS.ErrnoException): undefined {\n if (error.code === \"ENOENT\") return undefined;\n throw error;\n}\n\nexport async function gitignoreContainsEntry(dir: string): Promise<boolean> {\n const existing = await readFile(path.join(dir, \".gitignore\"), \"utf-8\").catch(\n enoentToUndefined,\n );\n return existing !== undefined && gitignoreHasEntry(existing);\n}\n\nexport async function appendGitignoreEntry(dir: string): Promise<void> {\n const file = path.join(dir, \".gitignore\");\n const existing = await readFile(file, \"utf-8\").catch(enoentToUndefined);\n const prefix =\n existing == null || existing === \"\" || existing.endsWith(\"\\n\")\n ? (existing ?? \"\")\n : existing + \"\\n\";\n await writeFile(file, `${prefix}${ENTRY}\\n`, \"utf-8\");\n}\n","import { Result } from \"@praha/byethrow\";\nimport type { ApiError } from \"../api/errors.js\";\nimport type { CommandFailure } from \"./define-command.js\";\n\n// API の 4xx(ApiError)を user-facing メッセージへ変換する。複数コマンドで共有する。\nexport function apiErrorFailure(\n error: ApiError,\n): Result.Result<never, CommandFailure> {\n switch (error.type) {\n case \"bad_request\": {\n const fieldLines = error.fields.map(\n (field) => `\\n - ${field.field}: ${field.message}`,\n );\n return Result.fail({ message: `${error.detail}${fieldLines.join(\"\")}` });\n }\n case \"unauthorized\":\n return Result.fail({\n message: `Not authorized: ${error.detail}. Run \\`orizm auth login\\` or check ORIZM_API_KEY.`,\n });\n case \"forbidden\":\n // 403 は権限不足以外(削除保護など)でも返るため、理由はサーバーの detail に語らせる。\n return Result.fail({ message: `Forbidden: ${error.detail}` });\n case \"not_found\":\n return Result.fail({ message: `Not found: ${error.detail}` });\n case \"conflict\":\n return Result.fail({ message: `Conflict: ${error.detail}` });\n }\n}\n","import { Result } from \"@praha/byethrow\";\nimport type { components } from \"@orizm/internal-shared/api-clients/dev-v2\";\nimport { fetchOrganizations, type Organization } from \"../api/organizations.js\";\nimport { toResult } from \"../api/errors.js\";\nimport {\n readProjectFileAt,\n resolveLinkDirectory,\n writeProjectFile,\n type ProjectContext,\n} from \"../context/project.js\";\nimport {\n appendGitignoreEntry,\n gitignoreContainsEntry,\n} from \"../context/gitignore.js\";\nimport { confirm, select } from \"../ui/prompt.js\";\nimport { apiErrorFailure } from \"./api-errors.js\";\nimport type { CommandFailure } from \"./define-command.js\";\n// link コマンドと runWithContext(project 未解決時の自動 link)の両方から使うため独立モジュールにする。\n// AuthContext は型のみの参照に留め、run-with-context.ts との循環 import を避ける。\nimport type { AuthContext } from \"./run-with-context.js\";\n\ntype Project = components[\"schemas\"][\"Project\"];\n\n// 対話部分を注入可能にして、データ取得 + 書き込みのロジックを非対話でテストできるようにする。\nexport type LinkPrompts = {\n confirmOverwrite: (existing: ProjectContext) => Promise<boolean>;\n selectOrganization: (\n organizations: Organization[],\n ) => Promise<Organization | undefined>;\n selectProject: (projects: Project[]) => Promise<Project | undefined>;\n confirmGitignore: () => Promise<boolean>;\n};\n\nexport type LinkFlowResult =\n | {\n linked: true;\n projectName: string;\n organizationName: string;\n file: string;\n gitignoreNote: string;\n }\n | { linked: false };\n\nexport async function runLinkFlow(\n ctx: AuthContext,\n options: { cwd: string; prompts: LinkPrompts },\n): Promise<Result.Result<LinkFlowResult, CommandFailure>> {\n // CWD から親方向に既存 .orizm を探し、あればそこを、無ければ CWD を対象にする。\n // read と同じ探索なので link が書く先と後続コマンドが読む先が一致する。\n const linkDir = await resolveLinkDirectory(options.cwd);\n\n // 既存リンクの誤上書きで後続コマンドが別 project を対象にしないよう、先に確認する。\n const existing = await readProjectFileAt(linkDir);\n if (existing !== undefined) {\n const overwrite = await options.prompts.confirmOverwrite(existing);\n if (!overwrite) {\n return Result.succeed({ linked: false });\n }\n }\n\n const organizations = await fetchOrganizations(ctx.client);\n if (Result.isFailure(organizations)) {\n return apiErrorFailure(organizations.error);\n }\n if (organizations.value.length === 0) {\n return Result.fail({ message: \"You do not belong to any organization.\" });\n }\n\n const organization = await options.prompts.selectOrganization(\n organizations.value,\n );\n if (organization === undefined) {\n return Result.succeed({ linked: false });\n }\n\n const projects = toResult(\n await ctx.client.GET(\"/projects\", {\n params: { query: { organizationId: organization.id } },\n }),\n );\n if (Result.isFailure(projects)) return apiErrorFailure(projects.error);\n if (projects.value.length === 0) {\n return Result.fail({\n message: `Organization \"${organization.name}\" has no projects.`,\n });\n }\n\n const project = await options.prompts.selectProject(projects.value);\n if (project === undefined) {\n return Result.succeed({ linked: false });\n }\n\n const file = await writeProjectFile(linkDir, {\n projectName: project.name,\n organizationName: organization.name,\n });\n\n const gitignoreNote = await ensureGitignore(\n linkDir,\n options.prompts.confirmGitignore,\n );\n\n return Result.succeed({\n linked: true,\n projectName: project.name,\n organizationName: organization.name,\n file,\n gitignoreNote,\n });\n}\n\n// 無視ルールは対象の .orizm と同じディレクトリに置く(git ルートまで遡らない)。\n// 「複数 .gitignore のどれか」「.git の場所」を気にせず自己完結し、Vercel と同じ挙動になる。\nasync function ensureGitignore(\n linkDir: string,\n confirmGitignore: () => Promise<boolean>,\n): Promise<string> {\n if (await gitignoreContainsEntry(linkDir)) return \"\";\n\n const approved = await confirmGitignore();\n if (!approved) {\n return \"Skipped updating .gitignore. Consider ignoring .orizm/ yourself.\";\n }\n await appendGitignoreEntry(linkDir);\n return \"Added .orizm/ to .gitignore.\";\n}\n\nasync function promptSelectFromList<T>(\n items: T[],\n message: string,\n label: (item: T) => string,\n value: (item: T) => string,\n): Promise<T | undefined> {\n const selected = await select(\n message,\n items.map((item) => ({ label: label(item), value: value(item) })),\n );\n if (selected === undefined) return undefined;\n return items.find((item) => value(item) === selected);\n}\n\nexport function defaultLinkPrompts(): LinkPrompts {\n return {\n confirmOverwrite: (existing) =>\n confirm(\n `This directory is already linked to \"${existing.projectName}\". Overwrite?`,\n false,\n ),\n selectOrganization: (organizations) =>\n promptSelectFromList(\n organizations,\n \"Select an organization:\",\n (organization) => `${organization.displayName} (${organization.name})`,\n (organization) => organization.name,\n ),\n selectProject: (projects) =>\n promptSelectFromList(\n projects,\n \"Select a project:\",\n (project) => `${project.displayName} (${project.name})`,\n (project) => project.name,\n ),\n confirmGitignore: () => confirm(\"Add .orizm/ to .gitignore?\", true),\n };\n}\n","import { Result } from \"@praha/byethrow\";\nimport { FileTokenStore, type TokenStore } from \"../auth/token-store.js\";\nimport { TokenRefresher } from \"../auth/refresh.js\";\nimport { resolveEnv, type ResolvedEnv } from \"../env.js\";\nimport { resolveProjectName } from \"../context/project.js\";\nimport { resolveCredentials } from \"../credentials/resolve.js\";\nimport {\n createAuthenticatedClient,\n type DeveloperApiClient,\n} from \"../api/client.js\";\nimport { notice } from \"../ui/output.js\";\nimport {\n defaultLinkPrompts,\n runLinkFlow,\n type LinkPrompts,\n} from \"./link-flow.js\";\nimport type { CommandFailure, CommandOutput } from \"./define-command.js\";\n\nexport type AuthContext = {\n baseUrl: string;\n client: DeveloperApiClient;\n};\n\nexport type CommandContext = AuthContext & {\n projectName: string;\n};\n\ntype RunOptions = {\n store?: TokenStore;\n cwd?: string;\n envSource?: NodeJS.ProcessEnv;\n // テストから TTY 判定と対話 link を差し替えるための注入口。\n isTTY?: boolean;\n linkPrompts?: LinkPrompts;\n};\n\ntype Handler<C> = (\n context: C,\n) => Promise<Result.Result<CommandOutput | undefined, CommandFailure>>;\n\ntype ResolvedAuth = {\n context: AuthContext;\n env: ResolvedEnv;\n};\n\nasync function resolveAuth(\n options: RunOptions,\n): Promise<Result.Result<ResolvedAuth, CommandFailure>> {\n const env = resolveEnv(options.envSource);\n if (Result.isFailure(env)) {\n return Result.fail({\n message: \"Invalid environment variable configuration for Orizm.\",\n });\n }\n\n const store = options.store ?? new FileTokenStore();\n const refresher = new TokenRefresher(store);\n\n const credentials = await resolveCredentials({\n store,\n issuerUrl: env.value.issuerUrl,\n apiKey: env.value.apiKey,\n });\n if (Result.isFailure(credentials)) {\n return Result.fail({\n message:\n \"Not authenticated. Run `orizm auth login`, or set ORIZM_API_KEY.\",\n });\n }\n\n // Bearer 経路は期限切れ + リフレッシュ失敗を早めに検知して再ログインを促す。\n if (credentials.value.type === \"bearer\") {\n const token = await refresher.getValidAccessToken(env.value.issuerUrl);\n if (Result.isFailure(token)) {\n return Result.fail({\n message:\n \"Your session has expired or was revoked. Run `orizm auth login` to sign in again.\",\n });\n }\n }\n\n const client = createAuthenticatedClient({\n baseUrl: env.value.baseUrl,\n credentials: credentials.value,\n refresher,\n });\n\n return Result.succeed({\n context: { baseUrl: env.value.baseUrl, client },\n env: env.value,\n });\n}\n\n// 認証だけ必要で Project context を取らないコマンド(org list / project list / link 等)用。\nexport async function runWithAuth(\n handler: Handler<AuthContext>,\n options: RunOptions = {},\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const auth = await resolveAuth(options);\n if (Result.isFailure(auth)) return auth;\n return handler(auth.value.context);\n}\n\n// 各コマンドが project 解決と認証を繰り返さずビジネスロジックだけ書けるよう、\n// ここで一括解決して認証ヘッダ付与済みの client を handler に渡す。\nexport async function runWithContext(\n args: Record<string, unknown>,\n handler: Handler<CommandContext>,\n options: RunOptions = {},\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const auth = await resolveAuth(options);\n if (Result.isFailure(auth)) return auth;\n\n const projectFlag =\n typeof args.project === \"string\" ? args.project : undefined;\n const project = await resolveProjectName({\n flag: projectFlag,\n env: auth.value.env.project,\n cwd: options.cwd,\n });\n if (Result.isFailure(project)) {\n if (project.error.type === \"no_project_context\") {\n const linked = await tryInteractiveLink(auth.value.context, options);\n if (linked !== undefined) {\n if (Result.isFailure(linked)) return linked;\n return handler({ ...auth.value.context, projectName: linked.value });\n }\n }\n return Result.fail(projectContextFailure(project.error));\n }\n\n return handler({ ...auth.value.context, projectName: project.value });\n}\n\n// project 未解決でも TTY なら対話 link を実行してそのまま続行する(ADR-004、Vercel の初回体験と同じ)。\n// 非 TTY では undefined を返し、呼び出し側が通常のエラー案内に落とす。\nasync function tryInteractiveLink(\n ctx: AuthContext,\n options: RunOptions,\n): Promise<Result.Result<string, CommandFailure> | undefined> {\n const isTTY = options.isTTY ?? process.stdin.isTTY === true;\n if (!isTTY) return undefined;\n\n notice(\"No project is linked to this directory yet. Select one to continue.\");\n const flow = await runLinkFlow(ctx, {\n cwd: options.cwd ?? process.cwd(),\n prompts: options.linkPrompts ?? defaultLinkPrompts(),\n });\n if (Result.isFailure(flow)) return flow;\n if (!flow.value.linked) {\n return Result.fail(projectContextFailure({ type: \"no_project_context\" }));\n }\n\n notice(\n `Linked to project ${flow.value.projectName} (organization ${flow.value.organizationName}).`,\n );\n if (flow.value.gitignoreNote !== \"\") {\n notice(flow.value.gitignoreNote);\n }\n return Result.succeed(flow.value.projectName);\n}\n\nfunction projectContextFailure(\n error:\n | { type: \"project_json_invalid\"; path: string }\n | { type: \"no_project_context\" },\n): CommandFailure {\n switch (error.type) {\n case \"project_json_invalid\":\n return { message: `Invalid project file: ${error.path}` };\n case \"no_project_context\":\n return {\n message:\n \"No project selected. Run `orizm link`, pass --project <name>, or set ORIZM_PROJECT.\",\n };\n }\n}\n"],"mappings":"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"}
@@ -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-BggkrD0g.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-BH8jqdqq.cjs")).then((m) => m.default),
14
+ erd: () => Promise.resolve().then(() => require("./erd-DmnB1v2c.cjs")).then((m) => m.default)
15
+ }
16
+ });
17
+
18
+ //#endregion
19
+ exports.default = schema_default;
20
+ //# sourceMappingURL=schema-CUVTXrHk.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-CUVTXrHk.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"}
@@ -0,0 +1,20 @@
1
+ import { t as defineCommand } from "./cli/main.mjs";
2
+
3
+ //#region src/cli/commands/schema/index.ts
4
+ var schema_default = defineCommand({
5
+ meta: {
6
+ name: "schema",
7
+ description: "Work with orizm.config.ts schema definitions"
8
+ },
9
+ subCommands: {
10
+ push: () => import("./push-xWnD9oov.mjs").then((m) => m.default),
11
+ list: () => import("./list-BMnBuZMr.mjs").then((m) => m.default),
12
+ get: () => import("./get-1TtxSEoT.mjs").then((m) => m.default),
13
+ validate: () => import("./validate-COS4bfr0.mjs").then((m) => m.default),
14
+ erd: () => import("./erd-BihhEfZ_.mjs").then((m) => m.default)
15
+ }
16
+ });
17
+
18
+ //#endregion
19
+ export { schema_default as default };
20
+ //# sourceMappingURL=schema-DlUWHV_t.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema-exG250MU.mjs","names":[],"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,qBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,aAAa;EACX,YAAY,OAAO,sBAAY,CAAC,MAAM,MAAM,EAAE,OAAO;EACrD,YAAY,OAAO,sBAAY,CAAC,MAAM,MAAM,EAAE,OAAO;EACrD,WAAW,OAAO,qBAAW,CAAC,MAAM,MAAM,EAAE,OAAO;EACnD,gBAAgB,OAAO,0BAAgB,CAAC,MAAM,MAAM,EAAE,OAAO;EAC7D,WAAW,OAAO,qBAAW,CAAC,MAAM,MAAM,EAAE,OAAO;CACrD;AACF,CAAC"}
1
+ {"version":3,"file":"schema-DlUWHV_t.mjs","names":[],"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,qBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,aAAa;EACX,YAAY,OAAO,sBAAY,CAAC,MAAM,MAAM,EAAE,OAAO;EACrD,YAAY,OAAO,sBAAY,CAAC,MAAM,MAAM,EAAE,OAAO;EACrD,WAAW,OAAO,qBAAW,CAAC,MAAM,MAAM,EAAE,OAAO;EACnD,gBAAgB,OAAO,0BAAgB,CAAC,MAAM,MAAM,EAAE,OAAO;EAC7D,WAAW,OAAO,qBAAW,CAAC,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