@orizm/cli 3.0.1 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -1
- package/dist/agent-Bd30EhQC.mjs +14 -0
- package/dist/agent-Bd30EhQC.mjs.map +1 -0
- package/dist/agent-vC2-9rjt.cjs +14 -0
- package/dist/agent-vC2-9rjt.cjs.map +1 -0
- package/dist/auth-BnXPHgBU.cjs +18 -0
- package/dist/{auth-CNbONZuf.cjs.map → auth-BnXPHgBU.cjs.map} +1 -1
- package/dist/{auth-BGW072BP.mjs → auth-DHVtM0sF.mjs} +4 -4
- package/dist/{auth-BGW072BP.mjs.map → auth-DHVtM0sF.mjs.map} +1 -1
- package/dist/{bucket-mg5QQORh.cjs → bucket-CFaYmimY.cjs} +3 -3
- package/dist/{bucket-mg5QQORh.cjs.map → bucket-CFaYmimY.cjs.map} +1 -1
- package/dist/{bucket-DqW-WEYb.mjs → bucket-D-lu1xgZ.mjs} +3 -3
- package/dist/{bucket-DqW-WEYb.mjs.map → bucket-D-lu1xgZ.mjs.map} +1 -1
- package/dist/cli/main.cjs +14 -12
- package/dist/cli/main.cjs.map +1 -1
- package/dist/cli/main.mjs +14 -13
- package/dist/cli/main.mjs.map +1 -1
- package/dist/{cms-Cnx-lDGu.cjs → cms-CId7jg5l.cjs} +5 -5
- package/dist/cms-CId7jg5l.cjs.map +1 -0
- package/dist/{cms-BJnovGYT.mjs → cms-DLOypcw8.mjs} +5 -5
- package/dist/cms-DLOypcw8.mjs.map +1 -0
- package/dist/{codegen-DZOB4ttR.mjs → codegen-BKE_IYoM.mjs} +3 -3
- package/dist/{codegen-DZOB4ttR.mjs.map → codegen-BKE_IYoM.mjs.map} +1 -1
- package/dist/{codegen-BF5b-u46.cjs → codegen-kbbIwPbb.cjs} +3 -3
- package/dist/{codegen-BF5b-u46.cjs.map → codegen-kbbIwPbb.cjs.map} +1 -1
- package/dist/{confirm-delete-B9o73U7B.cjs → confirm-delete-BX8bJrXZ.cjs} +3 -3
- package/dist/{confirm-delete-B9o73U7B.cjs.map → confirm-delete-BX8bJrXZ.cjs.map} +1 -1
- package/dist/{confirm-delete-CsWkW69-.mjs → confirm-delete-CcKLYuCB.mjs} +2 -2
- package/dist/{confirm-delete-CsWkW69-.mjs.map → confirm-delete-CcKLYuCB.mjs.map} +1 -1
- package/dist/{consumer-C4WiGHWG.mjs → consumer-BAM3E_68.mjs} +4 -4
- package/dist/{consumer-C4WiGHWG.mjs.map → consumer-BAM3E_68.mjs.map} +1 -1
- package/dist/{consumer-pU2HyiyA.mjs → consumer-CqyZdG9v.mjs} +4 -4
- package/dist/consumer-CqyZdG9v.mjs.map +1 -0
- package/dist/consumer-D-Y6KJ8a.cjs +18 -0
- package/dist/{consumer-l-8wUK8E.cjs.map → consumer-D-Y6KJ8a.cjs.map} +1 -1
- package/dist/{consumer-OF6Z_eTP.cjs → consumer-OG6IEJun.cjs} +4 -4
- package/dist/consumer-OG6IEJun.cjs.map +1 -0
- package/dist/content-ClRuLcGq.cjs +20 -0
- package/dist/{content-DMjSwor1.cjs.map → content-ClRuLcGq.cjs.map} +1 -1
- package/dist/content-DWnYo6ad.mjs +20 -0
- package/dist/{content-BOb6NC8M.mjs.map → content-DWnYo6ad.mjs.map} +1 -1
- package/dist/{create-DJY71sp9.cjs → create-B3d4CDel.cjs} +2 -2
- package/dist/{create-DJY71sp9.cjs.map → create-B3d4CDel.cjs.map} +1 -1
- package/dist/{create-CC814ixh.mjs → create-BD6iS4n6.mjs} +2 -2
- package/dist/{create-CC814ixh.mjs.map → create-BD6iS4n6.mjs.map} +1 -1
- package/dist/{create-B-PAOor6.mjs → create-BGV3F44O.mjs} +3 -3
- package/dist/{create-B-PAOor6.mjs.map → create-BGV3F44O.mjs.map} +1 -1
- package/dist/{create-Z-z3LXNW.cjs → create-BYDbsUvw.cjs} +3 -3
- package/dist/{create-Z-z3LXNW.cjs.map → create-BYDbsUvw.cjs.map} +1 -1
- package/dist/{create-Belwettw.mjs → create-BtuS23L3.mjs} +2 -2
- package/dist/{create-Belwettw.mjs.map → create-BtuS23L3.mjs.map} +1 -1
- package/dist/{create-BvERyMKa.cjs → create-CNDCTpi0.cjs} +3 -3
- package/dist/{create-BvERyMKa.cjs.map → create-CNDCTpi0.cjs.map} +1 -1
- package/dist/{create-BNYWcyuQ.cjs → create-DzRMGpm_.cjs} +2 -2
- package/dist/{create-BNYWcyuQ.cjs.map → create-DzRMGpm_.cjs.map} +1 -1
- package/dist/{create-B1ZBOqcV.mjs → create-fweRd0UB.mjs} +2 -2
- package/dist/{create-B1ZBOqcV.mjs.map → create-fweRd0UB.mjs.map} +1 -1
- package/dist/{create-Dups0gV2.mjs → create-m5fNBqQE.mjs} +3 -3
- package/dist/{create-Dups0gV2.mjs.map → create-m5fNBqQE.mjs.map} +1 -1
- package/dist/{create-CmOriwGo.cjs → create-tWGEtI3t.cjs} +2 -2
- package/dist/{create-CmOriwGo.cjs.map → create-tWGEtI3t.cjs.map} +1 -1
- package/dist/{delete-DhSU-Lx2.mjs → delete-B8VlzzCj.mjs} +3 -3
- package/dist/{delete-DhSU-Lx2.mjs.map → delete-B8VlzzCj.mjs.map} +1 -1
- package/dist/{delete-DVrafka1.cjs → delete-B9j8c8ln.cjs} +3 -3
- package/dist/{delete-DVrafka1.cjs.map → delete-B9j8c8ln.cjs.map} +1 -1
- package/dist/{delete-ZIifaG0i.mjs → delete-BhJK-8vE.mjs} +3 -3
- package/dist/{delete-ZIifaG0i.mjs.map → delete-BhJK-8vE.mjs.map} +1 -1
- package/dist/{delete-YYh_0khQ.mjs → delete-Bi6UhAhS.mjs} +3 -3
- package/dist/{delete-YYh_0khQ.mjs.map → delete-Bi6UhAhS.mjs.map} +1 -1
- package/dist/{delete-CCTiCYIL.cjs → delete-C_oxZa_p.cjs} +3 -3
- package/dist/{delete-CCTiCYIL.cjs.map → delete-C_oxZa_p.cjs.map} +1 -1
- package/dist/{delete-CSs5Czlo.mjs → delete-Ci7cq3mU.mjs} +3 -3
- package/dist/{delete-CSs5Czlo.mjs.map → delete-Ci7cq3mU.mjs.map} +1 -1
- package/dist/{delete-XWJRhBFs.mjs → delete-CiWkGnog.mjs} +3 -3
- package/dist/{delete-XWJRhBFs.mjs.map → delete-CiWkGnog.mjs.map} +1 -1
- package/dist/{delete-DozSxZQ7.cjs → delete-Cmk80aqF.cjs} +3 -3
- package/dist/{delete-DozSxZQ7.cjs.map → delete-Cmk80aqF.cjs.map} +1 -1
- package/dist/{delete-8yZ3j0vX.cjs → delete-CvtvB2Cr.cjs} +3 -3
- package/dist/{delete-8yZ3j0vX.cjs.map → delete-CvtvB2Cr.cjs.map} +1 -1
- package/dist/{delete-CIYY59v_.cjs → delete-DG825UwK.cjs} +4 -3
- package/dist/{delete-CIYY59v_.cjs.map → delete-DG825UwK.cjs.map} +1 -1
- package/dist/{delete-WpMIIvjj.cjs → delete-DGrSMqOt.cjs} +3 -3
- package/dist/{delete-WpMIIvjj.cjs.map → delete-DGrSMqOt.cjs.map} +1 -1
- package/dist/{delete-BOUObrDw.mjs → delete-Datr3Kqq.mjs} +3 -2
- package/dist/{delete-BOUObrDw.mjs.map → delete-Datr3Kqq.mjs.map} +1 -1
- package/dist/{delete-D4r1ve4v.cjs → delete-TTF4pIKw.cjs} +3 -3
- package/dist/{delete-D4r1ve4v.cjs.map → delete-TTF4pIKw.cjs.map} +1 -1
- package/dist/{delete-BSLIXrAh.mjs → delete-X8iVsETw.mjs} +3 -3
- package/dist/{delete-BSLIXrAh.mjs.map → delete-X8iVsETw.mjs.map} +1 -1
- package/dist/docs/features/cli/authentication.md +93 -0
- package/dist/docs/features/cli/commands/agent.md +49 -0
- package/dist/docs/features/cli/commands/auth.md +36 -0
- package/dist/docs/features/cli/commands/bucket.md +120 -0
- package/dist/docs/features/cli/commands/codegen.md +51 -0
- package/dist/docs/features/cli/commands/content.md +117 -0
- package/dist/docs/features/cli/commands/key.md +155 -0
- package/dist/docs/features/cli/commands/link.md +21 -0
- package/dist/docs/features/cli/commands/org.md +18 -0
- package/dist/docs/features/cli/commands/project-user.md +108 -0
- package/dist/docs/features/cli/commands/project.md +106 -0
- package/dist/docs/features/cli/commands/schema.md +107 -0
- package/dist/docs/features/cli/commands/webhook.md +110 -0
- package/dist/docs/features/cli/commands.md +110 -0
- package/dist/docs/features/cli/configuration.md +70 -0
- package/dist/docs/features/cli/output.md +53 -0
- package/dist/docs/features/cli/project-linking.md +58 -0
- package/dist/docs/features/cli/quickstart.md +83 -0
- package/dist/docs/features/cli.md +56 -0
- package/dist/docs/features/cms-sdk/account.md +122 -0
- package/dist/docs/features/cms-sdk/auth.md +122 -0
- package/dist/docs/features/cms-sdk/bucket.md +113 -0
- package/dist/docs/features/cms-sdk/cli.md +104 -0
- package/dist/docs/features/cms-sdk/fetch-contents.md +608 -0
- package/dist/docs/features/cms-sdk/install.md +98 -0
- package/dist/docs/features/cms-sdk/management-user.md +244 -0
- package/dist/docs/features/cms-sdk/migrate-to-v2.md +152 -0
- package/dist/docs/features/cms-sdk/mutation-contents.md +190 -0
- package/dist/docs/features/console/audit-logs.md +52 -0
- package/dist/docs/features/console/bucket.md +70 -0
- package/dist/docs/features/console/create-project.md +103 -0
- package/dist/docs/features/console/generate-api-key.md +103 -0
- package/dist/docs/features/console/invite-project-users.md +70 -0
- package/dist/docs/features/console/management-tables.md +131 -0
- package/dist/docs/features/console/organization-member-management.md +78 -0
- package/dist/docs/features/console/schema-history.md +29 -0
- package/dist/docs/features/console.md +15 -0
- package/dist/docs/features/consumer-sdk/cli.md +60 -0
- package/dist/docs/features/consumer-sdk/fetch-contents.md +603 -0
- package/dist/docs/features/consumer-sdk/install.md +90 -0
- package/dist/docs/features/consumer-sdk/migrate-to-v2.md +43 -0
- package/dist/docs/features/design-editor/about.md +36 -0
- package/dist/docs/features/design-editor/getting-started.md +244 -0
- package/dist/docs/features/design-editor/install.md +17 -0
- package/dist/docs/features/design-editor/prop-editor.md +83 -0
- package/dist/docs/features/design-editor/schema.md +279 -0
- package/dist/docs/features/draft.md +241 -0
- package/dist/docs/features/form/about.md +83 -0
- package/dist/docs/features/form/editor.md +410 -0
- package/dist/docs/features/form/submission.md +94 -0
- package/dist/docs/features/full-text-search.md +64 -0
- package/dist/docs/features/history.md +152 -0
- package/dist/docs/features/schema/about.md +215 -0
- package/dist/docs/features/schema/authority.md +456 -0
- package/dist/docs/features/schema/bucket.md +142 -0
- package/dist/docs/features/schema/database.md +419 -0
- package/dist/docs/features/schema/table-module.md +140 -0
- package/dist/docs/features/webhook/revalidate-nextjs.md +185 -0
- package/dist/docs/features/webhook.md +295 -0
- package/dist/docs/get-started/add-model-starter.md +124 -0
- package/dist/docs/get-started/get-started-with-starter.md +218 -0
- package/dist/docs/index.md +88 -0
- package/dist/docs/introduction.md +140 -0
- package/dist/docs/manifest.json +6 -0
- package/dist/docs/resources/cli-migration-guide.md +82 -0
- package/dist/docs/resources/cli-v2-to-v3-migration-guide.md +138 -0
- package/dist/docs/resources/deploy-to-vercel.md +62 -0
- package/dist/docs/resources/limits.md +24 -0
- package/dist/docs/resources/private-registry.md +23 -0
- package/dist/docs/resources/status.md +22 -0
- package/dist/docs/resources/user-model.md +38 -0
- package/dist/{download-ogGbb3FU.cjs → download-BkzmfQXD.cjs} +2 -2
- package/dist/{download-ogGbb3FU.cjs.map → download-BkzmfQXD.cjs.map} +1 -1
- package/dist/{download-oFGzg30E.mjs → download-Dx1oyrMg.mjs} +2 -2
- package/dist/{download-oFGzg30E.mjs.map → download-Dx1oyrMg.mjs.map} +1 -1
- package/dist/{erd-zDoF6I_y.mjs → erd-BNv5Th6z.mjs} +2 -2
- package/dist/{erd-zDoF6I_y.mjs.map → erd-BNv5Th6z.mjs.map} +1 -1
- package/dist/{erd-lKC5NB2l.cjs → erd-ByuVMQ5n.cjs} +2 -2
- package/dist/{erd-lKC5NB2l.cjs.map → erd-ByuVMQ5n.cjs.map} +1 -1
- package/dist/{get-CgEgETQa.mjs → get-1TtxSEoT.mjs} +2 -2
- package/dist/{get-CgEgETQa.mjs.map → get-1TtxSEoT.mjs.map} +1 -1
- package/dist/{get-DjRyK0hJ.cjs → get-B5S1GfjR.cjs} +2 -2
- package/dist/{get-DjRyK0hJ.cjs.map → get-B5S1GfjR.cjs.map} +1 -1
- package/dist/{get-DDB89cOs.mjs → get-BLDHE_Zl.mjs} +2 -2
- package/dist/{get-DDB89cOs.mjs.map → get-BLDHE_Zl.mjs.map} +1 -1
- package/dist/{get-KdWfYINc.cjs → get-C5OH05Ka.cjs} +2 -2
- package/dist/{get-KdWfYINc.cjs.map → get-C5OH05Ka.cjs.map} +1 -1
- package/dist/{get-BiPEF_m-.cjs → get-CKZPn669.cjs} +3 -2
- package/dist/get-CKZPn669.cjs.map +1 -0
- package/dist/{get-IOU__2RP.cjs → get-CdDZkUXV.cjs} +2 -2
- package/dist/{get-IOU__2RP.cjs.map → get-CdDZkUXV.cjs.map} +1 -1
- package/dist/{get-DB80UNSR.mjs → get-Cw4Dw5NG.mjs} +2 -2
- package/dist/{get-DB80UNSR.mjs.map → get-Cw4Dw5NG.mjs.map} +1 -1
- package/dist/{get-C7dKoSIc.mjs → get-Dy3AD4il.mjs} +2 -2
- package/dist/{get-C7dKoSIc.mjs.map → get-Dy3AD4il.mjs.map} +1 -1
- package/dist/{get-BBOKSXkh.cjs → get-PVsUGHBR.cjs} +2 -2
- package/dist/{get-BBOKSXkh.cjs.map → get-PVsUGHBR.cjs.map} +1 -1
- package/dist/{get-RpxdnCKR.mjs → get-Vo3yr12d.mjs} +3 -2
- package/dist/get-Vo3yr12d.mjs.map +1 -0
- package/dist/{get-jwXRlIBJ.cjs → get-jaN2o0XY.cjs} +2 -2
- package/dist/{get-jwXRlIBJ.cjs.map → get-jaN2o0XY.cjs.map} +1 -1
- package/dist/{get-DBxhbN1G.mjs → get-qOKYAc46.mjs} +2 -2
- package/dist/{get-DBxhbN1G.mjs.map → get-qOKYAc46.mjs.map} +1 -1
- package/dist/init-CPfpVlUN.mjs +372 -0
- package/dist/init-CPfpVlUN.mjs.map +1 -0
- package/dist/init-NaL2N3Go.cjs +374 -0
- package/dist/init-NaL2N3Go.cjs.map +1 -0
- package/dist/{invite-DPygtCoO.cjs → invite-Tw3SMV0Q.cjs} +2 -2
- package/dist/{invite-DPygtCoO.cjs.map → invite-Tw3SMV0Q.cjs.map} +1 -1
- package/dist/{invite-D66DSMvq.mjs → invite-vzajkU2u.mjs} +2 -2
- package/dist/{invite-D66DSMvq.mjs.map → invite-vzajkU2u.mjs.map} +1 -1
- package/dist/{key-C71Ffll9.mjs → key-CyVxu3Uk.mjs} +3 -3
- package/dist/{key-C71Ffll9.mjs.map → key-CyVxu3Uk.mjs.map} +1 -1
- package/dist/{key-DQr7qRL2.cjs → key-tRYRqYNo.cjs} +3 -3
- package/dist/{key-DQr7qRL2.cjs.map → key-tRYRqYNo.cjs.map} +1 -1
- package/dist/{link-BluFyxEL.mjs → link-Bd55x5Zf.mjs} +2 -2
- package/dist/{link-BluFyxEL.mjs.map → link-Bd55x5Zf.mjs.map} +1 -1
- package/dist/{link-DYu1Vjlw.cjs → link-Cz7MX02S.cjs} +2 -2
- package/dist/{link-DYu1Vjlw.cjs.map → link-Cz7MX02S.cjs.map} +1 -1
- package/dist/{list-D5PSDMWw.mjs → list-2otVufvs.mjs} +3 -3
- package/dist/{list-D5PSDMWw.mjs.map → list-2otVufvs.mjs.map} +1 -1
- package/dist/{list-sQk00GV5.mjs → list-BMnBuZMr.mjs} +2 -2
- package/dist/{list-sQk00GV5.mjs.map → list-BMnBuZMr.mjs.map} +1 -1
- package/dist/{list-BwfpuhmJ.cjs → list-Bo8IMFd0.cjs} +2 -2
- package/dist/{list-BwfpuhmJ.cjs.map → list-Bo8IMFd0.cjs.map} +1 -1
- package/dist/{list-B0N4-Q-5.mjs → list-BtgAAUKm.mjs} +2 -2
- package/dist/{list-B0N4-Q-5.mjs.map → list-BtgAAUKm.mjs.map} +1 -1
- package/dist/{list-vbMaOiza.mjs → list-C0lq-gBZ.mjs} +2 -2
- package/dist/{list-vbMaOiza.mjs.map → list-C0lq-gBZ.mjs.map} +1 -1
- package/dist/{list-BsYYq9wT.mjs → list-CGZ3iT6J.mjs} +2 -2
- package/dist/{list-BsYYq9wT.mjs.map → list-CGZ3iT6J.mjs.map} +1 -1
- package/dist/{list-CFwW0G9f.cjs → list-CMWXO4nB.cjs} +2 -2
- package/dist/{list-CFwW0G9f.cjs.map → list-CMWXO4nB.cjs.map} +1 -1
- package/dist/{list-rAn3uOA7.mjs → list-Ccaec0cs.mjs} +2 -2
- package/dist/{list-rAn3uOA7.mjs.map → list-Ccaec0cs.mjs.map} +1 -1
- package/dist/{list-CU42ERNY.cjs → list-Cp_mHwbN.cjs} +2 -2
- package/dist/{list-CU42ERNY.cjs.map → list-Cp_mHwbN.cjs.map} +1 -1
- package/dist/{list-D0-QrWmn.cjs → list-Cs7kbAAi.cjs} +3 -3
- package/dist/{list-D0-QrWmn.cjs.map → list-Cs7kbAAi.cjs.map} +1 -1
- package/dist/{list-DlJssPwy.cjs → list-D5IaYurn.cjs} +2 -2
- package/dist/{list-DlJssPwy.cjs.map → list-D5IaYurn.cjs.map} +1 -1
- package/dist/{list-CbvEh7eA.mjs → list-DcIBInNA.mjs} +2 -2
- package/dist/{list-CbvEh7eA.mjs.map → list-DcIBInNA.mjs.map} +1 -1
- package/dist/{list-BzLraBnA.cjs → list-Dd3veD9Z.cjs} +2 -2
- package/dist/{list-BzLraBnA.cjs.map → list-Dd3veD9Z.cjs.map} +1 -1
- package/dist/{list-DexBclfb.cjs → list-DdVKKaDN.cjs} +2 -2
- package/dist/{list-DexBclfb.cjs.map → list-DdVKKaDN.cjs.map} +1 -1
- package/dist/{list-Br6Cmi9S.cjs → list-E1sjTZLe.cjs} +2 -2
- package/dist/{list-Br6Cmi9S.cjs.map → list-E1sjTZLe.cjs.map} +1 -1
- package/dist/{list-BRh59EqI.cjs → list-KI-7REC_.cjs} +2 -2
- package/dist/{list-BRh59EqI.cjs.map → list-KI-7REC_.cjs.map} +1 -1
- package/dist/{list-ocfd7631.mjs → list-MWD4huKP.mjs} +2 -2
- package/dist/{list-ocfd7631.mjs.map → list-MWD4huKP.mjs.map} +1 -1
- package/dist/{list-57TUfNFd.mjs → list-Pf5aAoaN.mjs} +2 -2
- package/dist/{list-57TUfNFd.mjs.map → list-Pf5aAoaN.mjs.map} +1 -1
- package/dist/{list-BHvURTWd.cjs → list-fG4zo8zz.cjs} +2 -2
- package/dist/{list-BHvURTWd.cjs.map → list-fG4zo8zz.cjs.map} +1 -1
- package/dist/{list-DrZYlidZ.mjs → list-r2UPz1zW.mjs} +2 -2
- package/dist/{list-DrZYlidZ.mjs.map → list-r2UPz1zW.mjs.map} +1 -1
- package/dist/{login-FE_dbWMo.mjs → login-Dq2L3bI7.mjs} +2 -2
- package/dist/{login-FE_dbWMo.mjs.map → login-Dq2L3bI7.mjs.map} +1 -1
- package/dist/{login-2XcHd4wn.cjs → login-M1IF2MdC.cjs} +2 -2
- package/dist/{login-2XcHd4wn.cjs.map → login-M1IF2MdC.cjs.map} +1 -1
- package/dist/{logout-DC5TMJ5_.cjs → logout-BCSfFgPz.cjs} +2 -2
- package/dist/{logout-DC5TMJ5_.cjs.map → logout-BCSfFgPz.cjs.map} +1 -1
- package/dist/{logout-BDbWrGBm.mjs → logout-DFzQCQKe.mjs} +2 -2
- package/dist/{logout-BDbWrGBm.mjs.map → logout-DFzQCQKe.mjs.map} +1 -1
- package/dist/management-C1p-Hm2Z.cjs +19 -0
- package/dist/{management-BGYcZB4c.cjs.map → management-C1p-Hm2Z.cjs.map} +1 -1
- package/dist/{management-DDACMgbU.mjs → management-h4yE09a6.mjs} +5 -5
- package/dist/{management-DDACMgbU.mjs.map → management-h4yE09a6.mjs.map} +1 -1
- package/dist/object-CZDLoc9L.cjs +20 -0
- package/dist/{object-DVqidsEc.cjs.map → object-CZDLoc9L.cjs.map} +1 -1
- package/dist/object-CqMsEkh9.mjs +20 -0
- package/dist/{object-qdBdEghr.mjs.map → object-CqMsEkh9.mjs.map} +1 -1
- package/dist/{org-CPhTRTks.mjs → org-Co-rjfr-.mjs} +2 -2
- package/dist/{org-CPhTRTks.mjs.map → org-Co-rjfr-.mjs.map} +1 -1
- package/dist/{org-C4cVovOM.cjs → org-Drj3VqIm.cjs} +2 -2
- package/dist/{org-C4cVovOM.cjs.map → org-Drj3VqIm.cjs.map} +1 -1
- package/dist/{org-context-Bewx2NEW.cjs → org-context-DKFnPH_o.cjs} +2 -2
- package/dist/{org-context-Bewx2NEW.cjs.map → org-context-DKFnPH_o.cjs.map} +1 -1
- package/dist/{org-context-D0dwWC2M.mjs → org-context-Df5McOiK.mjs} +2 -2
- package/dist/{org-context-D0dwWC2M.mjs.map → org-context-Df5McOiK.mjs.map} +1 -1
- package/dist/project-C7qWFjMV.mjs +20 -0
- package/dist/{project-CaXD3QBs.mjs.map → project-C7qWFjMV.mjs.map} +1 -1
- package/dist/project-Dm7nr5NV.cjs +20 -0
- package/dist/{project-BX7zvWB1.cjs.map → project-Dm7nr5NV.cjs.map} +1 -1
- package/dist/project-user-D9h_QBc0.mjs +20 -0
- package/dist/{project-user-Cp7i6orv.mjs.map → project-user-D9h_QBc0.mjs.map} +1 -1
- package/dist/project-user-wLFnHFwB.cjs +20 -0
- package/dist/{project-user-Dm0qR-sh.cjs.map → project-user-wLFnHFwB.cjs.map} +1 -1
- package/dist/prompt-C-XNDSNE.cjs +42 -0
- package/dist/prompt-C-XNDSNE.cjs.map +1 -0
- package/dist/prompt-Dr2Rkxun.mjs +25 -0
- package/dist/prompt-Dr2Rkxun.mjs.map +1 -0
- package/dist/{push-D7co0keA.mjs → push-54rmb0T0.mjs} +3 -2
- package/dist/{push-D7co0keA.mjs.map → push-54rmb0T0.mjs.map} +1 -1
- package/dist/{push-0u6PDz4E.cjs → push-9fPpd4U8.cjs} +4 -3
- package/dist/{push-0u6PDz4E.cjs.map → push-9fPpd4U8.cjs.map} +1 -1
- package/dist/{run-codegen-DgaFaIQ1.mjs → run-codegen-DjnV60bE.mjs} +3 -3
- package/dist/{run-codegen-DgaFaIQ1.mjs.map → run-codegen-DjnV60bE.mjs.map} +1 -1
- package/dist/{run-codegen-Ceeosw5x.cjs → run-codegen-mclysZuT.cjs} +3 -3
- package/dist/{run-codegen-Ceeosw5x.cjs.map → run-codegen-mclysZuT.cjs.map} +1 -1
- package/dist/{run-with-context-CVhmzAFZ.mjs → run-with-context-B4DyI8Wo.mjs} +6 -26
- package/dist/run-with-context-B4DyI8Wo.mjs.map +1 -0
- package/dist/{run-with-context-DJNnEigg.cjs → run-with-context-D8pSrqD_.cjs} +7 -39
- package/dist/run-with-context-D8pSrqD_.cjs.map +1 -0
- package/dist/{schema-exG250MU.mjs → schema-BL6SlLtH.mjs} +5 -5
- package/dist/{schema-exG250MU.mjs.map → schema-BL6SlLtH.mjs.map} +1 -1
- package/dist/schema-CNSTXsVa.cjs +20 -0
- package/dist/{schema-B3iRqvYK.cjs.map → schema-CNSTXsVa.cjs.map} +1 -1
- package/dist/{status-Dq_NJE71.cjs → status-CqPJTxeK.cjs} +2 -2
- package/dist/{status-Dq_NJE71.cjs.map → status-CqPJTxeK.cjs.map} +1 -1
- package/dist/{status-fWqXzV0P.mjs → status-D7nOW3R3.mjs} +2 -2
- package/dist/{status-fWqXzV0P.mjs.map → status-D7nOW3R3.mjs.map} +1 -1
- package/dist/{token-store--9GYVL7N.cjs → token-store-BgWGhqq0.cjs} +3 -3
- package/dist/{token-store--9GYVL7N.cjs.map → token-store-BgWGhqq0.cjs.map} +1 -1
- package/dist/{token-store-reCGF86F.mjs → token-store-C2r7cFA-.mjs} +2 -2
- package/dist/{token-store-reCGF86F.mjs.map → token-store-C2r7cFA-.mjs.map} +1 -1
- package/dist/{update-B4lv4dAz.mjs → update-8-sHFvNB.mjs} +2 -2
- package/dist/{update-B4lv4dAz.mjs.map → update-8-sHFvNB.mjs.map} +1 -1
- package/dist/{update-CuPRoVw3.mjs → update-B5hKKw0K.mjs} +3 -3
- package/dist/{update-CuPRoVw3.mjs.map → update-B5hKKw0K.mjs.map} +1 -1
- package/dist/{update-Do9HHWzs.cjs → update-BVaqURWE.cjs} +2 -2
- package/dist/{update-Do9HHWzs.cjs.map → update-BVaqURWE.cjs.map} +1 -1
- package/dist/{update-DRnN1kiu.cjs → update-BlUwNhLA.cjs} +2 -2
- package/dist/{update-DRnN1kiu.cjs.map → update-BlUwNhLA.cjs.map} +1 -1
- package/dist/{update-Cx_2GkQj.cjs → update-BqhLwuP7.cjs} +2 -2
- package/dist/{update-Cx_2GkQj.cjs.map → update-BqhLwuP7.cjs.map} +1 -1
- package/dist/{update-mEmULIau.mjs → update-DaYjh5VN.mjs} +2 -2
- package/dist/{update-mEmULIau.mjs.map → update-DaYjh5VN.mjs.map} +1 -1
- package/dist/{update-BXhSosHG.cjs → update-DcTzR54Z.cjs} +3 -3
- package/dist/{update-BXhSosHG.cjs.map → update-DcTzR54Z.cjs.map} +1 -1
- package/dist/{update-CIH6sSVk.cjs → update-Dne7g_0s.cjs} +2 -2
- package/dist/{update-CIH6sSVk.cjs.map → update-Dne7g_0s.cjs.map} +1 -1
- package/dist/{update-CQ4n4Xuf.mjs → update-Dy1BOnTB.mjs} +2 -2
- package/dist/{update-CQ4n4Xuf.mjs.map → update-Dy1BOnTB.mjs.map} +1 -1
- package/dist/{update-rzij1b_o.mjs → update-slz_X0mG.mjs} +2 -2
- package/dist/{update-rzij1b_o.mjs.map → update-slz_X0mG.mjs.map} +1 -1
- package/dist/{upload-DGgJ1TQk.mjs → upload-CDtzV9Wx.mjs} +3 -3
- package/dist/{upload-DGgJ1TQk.mjs.map → upload-CDtzV9Wx.mjs.map} +1 -1
- package/dist/{upload-C43ZXxyb.cjs → upload-DIln1QDA.cjs} +3 -3
- package/dist/{upload-C43ZXxyb.cjs.map → upload-DIln1QDA.cjs.map} +1 -1
- package/dist/webhook-BT3cHrq5.mjs +20 -0
- package/dist/{webhook-Cy850dNs.mjs.map → webhook-BT3cHrq5.mjs.map} +1 -1
- package/dist/webhook-CQeuAqec.cjs +20 -0
- package/dist/{webhook-CVFmch5W.cjs.map → webhook-CQeuAqec.cjs.map} +1 -1
- package/package.json +6 -5
- package/dist/auth-CNbONZuf.cjs +0 -18
- package/dist/cms-BJnovGYT.mjs.map +0 -1
- package/dist/cms-Cnx-lDGu.cjs.map +0 -1
- package/dist/consumer-OF6Z_eTP.cjs.map +0 -1
- package/dist/consumer-l-8wUK8E.cjs +0 -18
- package/dist/consumer-pU2HyiyA.mjs.map +0 -1
- package/dist/content-BOb6NC8M.mjs +0 -20
- package/dist/content-DMjSwor1.cjs +0 -20
- package/dist/get-BiPEF_m-.cjs.map +0 -1
- package/dist/get-RpxdnCKR.mjs.map +0 -1
- package/dist/management-BGYcZB4c.cjs +0 -19
- package/dist/object-DVqidsEc.cjs +0 -20
- package/dist/object-qdBdEghr.mjs +0 -20
- package/dist/project-BX7zvWB1.cjs +0 -20
- package/dist/project-CaXD3QBs.mjs +0 -20
- package/dist/project-user-Cp7i6orv.mjs +0 -20
- package/dist/project-user-Dm0qR-sh.cjs +0 -20
- package/dist/run-with-context-CVhmzAFZ.mjs.map +0 -1
- package/dist/run-with-context-DJNnEigg.cjs.map +0 -1
- package/dist/schema-B3iRqvYK.cjs +0 -20
- package/dist/webhook-CVFmch5W.cjs +0 -20
- package/dist/webhook-Cy850dNs.mjs +0 -20
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-
|
|
1
|
+
{"version":3,"file":"list-KI-7REC_.cjs","names":["fetchOrganizations","Result","apiErrorFailure","renderTable","getOutputState","defineCommand","globalArgs","runWithAuth"],"sources":["../src/cli/commands/org/list.ts"],"sourcesContent":["import { Result } from \"@praha/byethrow\";\nimport {\n defineCommand,\n type CommandFailure,\n type CommandOutput,\n} from \"../define-command.js\";\nimport { globalArgs } from \"../shared.js\";\nimport { runWithAuth, type AuthContext } from \"../run-with-context.js\";\nimport { apiErrorFailure } from \"../api-errors.js\";\nimport { fetchOrganizations } from \"../../api/organizations.js\";\nimport { getOutputState } from \"../../ui/output.js\";\nimport { renderTable } from \"../../ui/table.js\";\n\nexport async function orgListHandler(\n ctx: AuthContext,\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const organizations = await fetchOrganizations(ctx.client);\n if (Result.isFailure(organizations))\n return apiErrorFailure(organizations.error);\n\n return Result.succeed({\n json: organizations.value,\n text: () =>\n renderTable(\n [\"NAME\", \"DISPLAY NAME\", \"ID\"],\n organizations.value.map((org) => ({\n cells: [org.name, org.displayName, String(org.id)],\n })),\n getOutputState().color,\n ),\n });\n}\n\nexport default defineCommand({\n meta: {\n name: \"list\",\n description: \"List organizations you belong to\",\n },\n args: { ...globalArgs },\n run: () => runWithAuth(orgListHandler),\n});\n"],"mappings":";;;;;;;AAaA,eAAsB,eACpB,KACmE;CACnE,MAAM,gBAAgB,MAAMA,4CAAmB,IAAI,MAAM;CACzD,IAAIC,uBAAO,UAAU,aAAa,GAChC,OAAOC,yCAAgB,cAAc,KAAK;CAE5C,OAAOD,uBAAO,QAAQ;EACpB,MAAM,cAAc;EACpB,YACEE,0BACE;GAAC;GAAQ;GAAgB;EAAI,GAC7B,cAAc,MAAM,KAAK,SAAS,EAChC,OAAO;GAAC,IAAI;GAAM,IAAI;GAAa,OAAO,IAAI,EAAE;EAAC,EACnD,EAAE,GACFC,gCAAe,CAAC,CAAC,KACnB;CACJ,CAAC;AACH;AAEA,mBAAeC,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM,EAAE,GAAGC,0BAAW;CACtB,WAAWC,qCAAY,cAAc;AACvC,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { r as getOutputState, t as defineCommand } from "./cli/main.mjs";
|
|
2
2
|
import { r as contextArgs } from "./shared-CZZimGxc.mjs";
|
|
3
|
-
import { a as apiErrorFailure,
|
|
3
|
+
import { a as apiErrorFailure, c as toResult, n as runWithContext } from "./run-with-context-B4DyI8Wo.mjs";
|
|
4
4
|
import { t as renderTable } from "./table-MHEfbnWO.mjs";
|
|
5
5
|
import { n as maskManagementKey, r as showKeyArg } from "./mask-B1qD73jb.mjs";
|
|
6
6
|
import { n as formatGroupRoles } from "./group-roles-BIH7q8tf.mjs";
|
|
@@ -46,4 +46,4 @@ var list_default = defineCommand({
|
|
|
46
46
|
|
|
47
47
|
//#endregion
|
|
48
48
|
export { list_default as default };
|
|
49
|
-
//# sourceMappingURL=list-
|
|
49
|
+
//# sourceMappingURL=list-MWD4huKP.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-
|
|
1
|
+
{"version":3,"file":"list-MWD4huKP.mjs","names":[],"sources":["../src/cli/commands/key/management/list.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 { getOutputState } from \"../../../ui/output.js\";\nimport { renderTable } from \"../../../ui/table.js\";\nimport { formatGroupRoles } from \"../../group-roles.js\";\nimport { maskManagementKey, showKeyArg } from \"../mask.js\";\n\nexport async function keyManagementListHandler(\n ctx: CommandContext,\n options: { showKey: boolean },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const keys = toResult(\n await ctx.client.GET(\"/projects/{projectName}/management-keys\", {\n params: { path: { projectName: ctx.projectName } },\n }),\n );\n if (Result.isFailure(keys)) return apiErrorFailure(keys.error);\n\n // --json でもマスクを効かせるため、表示用データ自体を書き換える\n const value = keys.value.map((item) =>\n options.showKey ? item : { ...item, key: maskManagementKey(item.key) },\n );\n return Result.succeed({\n json: value,\n text: () =>\n renderTable(\n [\"ID\", \"KEY\", \"DESCRIPTION\", \"GROUP ROLES\", \"CREATED AT\"],\n value.map((item) => ({\n cells: [\n String(item.id),\n item.key,\n item.description,\n formatGroupRoles(item.groupRoles),\n item.createdAt,\n ],\n })),\n getOutputState().color,\n ),\n });\n}\n\nconst listArgs = {\n ...contextArgs,\n ...showKeyArg,\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"list\",\n description: \"List management keys\",\n },\n args: listArgs,\n run: ({ args }) =>\n runWithContext(args, (ctx) =>\n keyManagementListHandler(ctx, { showKey: args[\"show-key\"] === true }),\n ),\n});\n"],"mappings":";;;;;;;;;AAgBA,eAAsB,yBACpB,KACA,SACmE;CACnE,MAAM,OAAO,SACX,MAAM,IAAI,OAAO,IAAI,2CAA2C,EAC9D,QAAQ,EAAE,MAAM,EAAE,aAAa,IAAI,YAAY,EAAE,EACnD,CAAC,CACH;CACA,IAAI,OAAO,UAAU,IAAI,GAAG,OAAO,gBAAgB,KAAK,KAAK;CAG7D,MAAM,QAAQ,KAAK,MAAM,KAAK,SAC5B,QAAQ,UAAU,OAAO;EAAE,GAAG;EAAM,KAAK,kBAAkB,KAAK,GAAG;CAAE,CACvE;CACA,OAAO,OAAO,QAAQ;EACpB,MAAM;EACN,YACE,YACE;GAAC;GAAM;GAAO;GAAe;GAAe;EAAY,GACxD,MAAM,KAAK,UAAU,EACnB,OAAO;GACL,OAAO,KAAK,EAAE;GACd,KAAK;GACL,KAAK;GACL,iBAAiB,KAAK,UAAU;GAChC,KAAK;EACP,EACF,EAAE,GACF,eAAe,CAAC,CAAC,KACnB;CACJ,CAAC;AACH;AAEA,MAAM,WAAW;CACf,GAAG;CACH,GAAG;AACL;AAEA,mBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,MAAM,EAAE,WACN,eAAe,OAAO,QACpB,yBAAyB,KAAK,EAAE,SAAS,KAAK,gBAAgB,KAAK,CAAC,CACtE;AACJ,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { r as getOutputState, t as defineCommand } from "./cli/main.mjs";
|
|
2
2
|
import { r as contextArgs } from "./shared-CZZimGxc.mjs";
|
|
3
|
-
import { a as apiErrorFailure,
|
|
3
|
+
import { a as apiErrorFailure, c as toResult, n as runWithContext } from "./run-with-context-B4DyI8Wo.mjs";
|
|
4
4
|
import { t as renderTable } from "./table-MHEfbnWO.mjs";
|
|
5
5
|
import { r as showKeyArg, t as maskConsumerKey } from "./mask-B1qD73jb.mjs";
|
|
6
6
|
import { Result } from "@praha/byethrow";
|
|
@@ -45,4 +45,4 @@ var list_default = defineCommand({
|
|
|
45
45
|
|
|
46
46
|
//#endregion
|
|
47
47
|
export { list_default as default };
|
|
48
|
-
//# sourceMappingURL=list-
|
|
48
|
+
//# sourceMappingURL=list-Pf5aAoaN.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-
|
|
1
|
+
{"version":3,"file":"list-Pf5aAoaN.mjs","names":[],"sources":["../src/cli/commands/key/consumer/list.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 { getOutputState } from \"../../../ui/output.js\";\nimport { renderTable } from \"../../../ui/table.js\";\nimport { maskConsumerKey, showKeyArg } from \"../mask.js\";\n\nexport async function keyConsumerListHandler(\n ctx: CommandContext,\n options: { showKey: boolean },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const keys = toResult(\n await ctx.client.GET(\"/projects/{projectName}/consumer-keys\", {\n params: { path: { projectName: ctx.projectName } },\n }),\n );\n if (Result.isFailure(keys)) return apiErrorFailure(keys.error);\n\n // --json でもマスクを効かせるため、表示用データ自体を書き換える\n const value = keys.value.map((item) =>\n options.showKey ? item : { ...item, key: maskConsumerKey(item.key) },\n );\n return Result.succeed({\n json: value,\n text: () =>\n renderTable(\n [\"ID\", \"KEY\", \"DESCRIPTION\", \"CAN READ DRAFTS\", \"CREATED AT\"],\n value.map((item) => ({\n cells: [\n String(item.id),\n item.key,\n item.description,\n String(item.canReadDrafts),\n item.createdAt,\n ],\n })),\n getOutputState().color,\n ),\n });\n}\n\nconst listArgs = {\n ...contextArgs,\n ...showKeyArg,\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"list\",\n description: \"List consumer keys\",\n },\n args: listArgs,\n run: ({ args }) =>\n runWithContext(args, (ctx) =>\n keyConsumerListHandler(ctx, { showKey: args[\"show-key\"] === true }),\n ),\n});\n"],"mappings":";;;;;;;;AAeA,eAAsB,uBACpB,KACA,SACmE;CACnE,MAAM,OAAO,SACX,MAAM,IAAI,OAAO,IAAI,yCAAyC,EAC5D,QAAQ,EAAE,MAAM,EAAE,aAAa,IAAI,YAAY,EAAE,EACnD,CAAC,CACH;CACA,IAAI,OAAO,UAAU,IAAI,GAAG,OAAO,gBAAgB,KAAK,KAAK;CAG7D,MAAM,QAAQ,KAAK,MAAM,KAAK,SAC5B,QAAQ,UAAU,OAAO;EAAE,GAAG;EAAM,KAAK,gBAAgB,KAAK,GAAG;CAAE,CACrE;CACA,OAAO,OAAO,QAAQ;EACpB,MAAM;EACN,YACE,YACE;GAAC;GAAM;GAAO;GAAe;GAAmB;EAAY,GAC5D,MAAM,KAAK,UAAU,EACnB,OAAO;GACL,OAAO,KAAK,EAAE;GACd,KAAK;GACL,KAAK;GACL,OAAO,KAAK,aAAa;GACzB,KAAK;EACP,EACF,EAAE,GACF,eAAe,CAAC,CAAC,KACnB;CACJ,CAAC;AACH;AAEA,MAAM,WAAW;CACf,GAAG;CACH,GAAG;AACL;AAEA,mBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,MAAM,EAAE,WACN,eAAe,OAAO,QACpB,uBAAuB,KAAK,EAAE,SAAS,KAAK,gBAAgB,KAAK,CAAC,CACpE;AACJ,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const require_cli_main = require('./cli/main.cjs');
|
|
2
2
|
const require_shared = require('./shared-DHRPzzKl.cjs');
|
|
3
|
-
const require_run_with_context = require('./run-with-context-
|
|
3
|
+
const require_run_with_context = require('./run-with-context-D8pSrqD_.cjs');
|
|
4
4
|
const require_table = require('./table-C74eOSh8.cjs');
|
|
5
5
|
const require_table_event = require('./table-event-DXkCK29f.cjs');
|
|
6
6
|
let _praha_byethrow = require("@praha/byethrow");
|
|
@@ -37,4 +37,4 @@ var list_default = require_cli_main.defineCommand({
|
|
|
37
37
|
|
|
38
38
|
//#endregion
|
|
39
39
|
exports.default = list_default;
|
|
40
|
-
//# sourceMappingURL=list-
|
|
40
|
+
//# sourceMappingURL=list-fG4zo8zz.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-
|
|
1
|
+
{"version":3,"file":"list-fG4zo8zz.cjs","names":["toResult","Result","apiErrorFailure","renderTable","formatTableEvents","getOutputState","contextArgs","defineCommand","runWithContext"],"sources":["../src/cli/commands/webhook/list.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 { getOutputState } from \"../../ui/output.js\";\nimport { renderTable } from \"../../ui/table.js\";\nimport { formatTableEvents } from \"./table-event.js\";\n\nexport async function webhookListHandler(\n ctx: CommandContext,\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const webhooks = toResult(\n await ctx.client.GET(\"/projects/{projectName}/webhooks\", {\n params: { path: { projectName: ctx.projectName } },\n }),\n );\n if (Result.isFailure(webhooks)) return apiErrorFailure(webhooks.error);\n\n const value = webhooks.value;\n return Result.succeed({\n json: value,\n text: () =>\n renderTable(\n [\"ID\", \"NAME\", \"URL\", \"TABLE EVENTS\"],\n value.map((webhook) => ({\n cells: [\n String(webhook.id),\n webhook.name,\n webhook.url,\n formatTableEvents(webhook.tableEvents),\n ],\n })),\n getOutputState().color,\n ),\n });\n}\n\nconst listArgs = {\n ...contextArgs,\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"list\",\n description: \"List webhooks\",\n },\n args: listArgs,\n run: ({ args }) => runWithContext(args, (ctx) => webhookListHandler(ctx)),\n});\n"],"mappings":";;;;;;;;AAeA,eAAsB,mBACpB,KACmE;CACnE,MAAM,WAAWA,kCACf,MAAM,IAAI,OAAO,IAAI,oCAAoC,EACvD,QAAQ,EAAE,MAAM,EAAE,aAAa,IAAI,YAAY,EAAE,EACnD,CAAC,CACH;CACA,IAAIC,uBAAO,UAAU,QAAQ,GAAG,OAAOC,yCAAgB,SAAS,KAAK;CAErE,MAAM,QAAQ,SAAS;CACvB,OAAOD,uBAAO,QAAQ;EACpB,MAAM;EACN,YACEE,0BACE;GAAC;GAAM;GAAQ;GAAO;EAAc,GACpC,MAAM,KAAK,aAAa,EACtB,OAAO;GACL,OAAO,QAAQ,EAAE;GACjB,QAAQ;GACR,QAAQ;GACRC,sCAAkB,QAAQ,WAAW;EACvC,EACF,EAAE,GACFC,gCAAe,CAAC,CAAC,KACnB;CACJ,CAAC;AACH;AAEA,MAAM,WAAW,EACf,GAAGC,2BACL;AAEA,mBAAeC,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,MAAM,EAAE,WAAWC,wCAAe,OAAO,QAAQ,mBAAmB,GAAG,CAAC;AAC1E,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { r as getOutputState, t as defineCommand } from "./cli/main.mjs";
|
|
2
2
|
import { r as contextArgs } from "./shared-CZZimGxc.mjs";
|
|
3
|
-
import { a as apiErrorFailure,
|
|
3
|
+
import { a as apiErrorFailure, c as toResult, n as runWithContext } from "./run-with-context-B4DyI8Wo.mjs";
|
|
4
4
|
import { t as renderTable } from "./table-MHEfbnWO.mjs";
|
|
5
5
|
import { l as parseNonNegativeInteger, o as parseIntegerChoice } from "./parse-DA0k5AHa.mjs";
|
|
6
6
|
import { n as formatGroupRoles } from "./group-roles-BIH7q8tf.mjs";
|
|
@@ -69,4 +69,4 @@ var list_default = defineCommand({
|
|
|
69
69
|
|
|
70
70
|
//#endregion
|
|
71
71
|
export { list_default as default };
|
|
72
|
-
//# sourceMappingURL=list-
|
|
72
|
+
//# sourceMappingURL=list-r2UPz1zW.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-
|
|
1
|
+
{"version":3,"file":"list-r2UPz1zW.mjs","names":[],"sources":["../src/cli/commands/project-user/list.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 { getOutputState } from \"../../ui/output.js\";\nimport { renderTable } from \"../../ui/table.js\";\nimport { parseIntegerChoice, parseNonNegativeInteger } from \"../parse.js\";\nimport { formatGroupRoles } from \"../group-roles.js\";\n\nexport async function projectUserListHandler(\n ctx: CommandContext,\n options: { limit: number; offset: number },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const users = toResult(\n await ctx.client.GET(\"/projects/{projectName}/users\", {\n params: {\n path: { projectName: ctx.projectName },\n query: { limit: options.limit, offset: options.offset },\n },\n }),\n );\n if (Result.isFailure(users)) return apiErrorFailure(users.error);\n\n const value = users.value;\n return Result.succeed({\n json: value,\n text: () =>\n renderTable(\n [\"ID\", \"NAME\", \"EMAIL\", \"GROUP ROLES\"],\n value.projectUsers.map((user) => ({\n cells: [\n user.id,\n user.name,\n user.email,\n formatGroupRoles(user.groupRoles),\n ],\n })),\n getOutputState().color,\n ),\n });\n}\n\nconst listArgs = {\n ...contextArgs,\n limit: {\n type: \"string\",\n description: \"Max number of users to return (50, 100, or 200)\",\n default: \"50\",\n },\n offset: {\n type: \"string\",\n description: \"Pagination offset\",\n default: \"0\",\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"list\",\n description: \"List project users\",\n },\n args: listArgs,\n run: async ({ args }) => {\n const limit = parseIntegerChoice(\"limit\", args.limit, [50, 100, 200]);\n if (Result.isFailure(limit)) return limit;\n const offset = parseNonNegativeInteger(\"offset\", args.offset);\n if (Result.isFailure(offset)) return offset;\n\n return runWithContext(args, (ctx) =>\n projectUserListHandler(ctx, {\n limit: limit.value,\n offset: offset.value,\n }),\n );\n },\n});\n"],"mappings":";;;;;;;;;AAgBA,eAAsB,uBACpB,KACA,SACmE;CACnE,MAAM,QAAQ,SACZ,MAAM,IAAI,OAAO,IAAI,iCAAiC,EACpD,QAAQ;EACN,MAAM,EAAE,aAAa,IAAI,YAAY;EACrC,OAAO;GAAE,OAAO,QAAQ;GAAO,QAAQ,QAAQ;EAAO;CACxD,EACF,CAAC,CACH;CACA,IAAI,OAAO,UAAU,KAAK,GAAG,OAAO,gBAAgB,MAAM,KAAK;CAE/D,MAAM,QAAQ,MAAM;CACpB,OAAO,OAAO,QAAQ;EACpB,MAAM;EACN,YACE,YACE;GAAC;GAAM;GAAQ;GAAS;EAAa,GACrC,MAAM,aAAa,KAAK,UAAU,EAChC,OAAO;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,iBAAiB,KAAK,UAAU;EAClC,EACF,EAAE,GACF,eAAe,CAAC,CAAC,KACnB;CACJ,CAAC;AACH;AAEA,MAAM,WAAW;CACf,GAAG;CACH,OAAO;EACL,MAAM;EACN,aAAa;EACb,SAAS;CACX;CACA,QAAQ;EACN,MAAM;EACN,aAAa;EACb,SAAS;CACX;AACF;AAEA,mBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,KAAK,OAAO,EAAE,WAAW;EACvB,MAAM,QAAQ,mBAAmB,SAAS,KAAK,OAAO;GAAC;GAAI;GAAK;EAAG,CAAC;EACpE,IAAI,OAAO,UAAU,KAAK,GAAG,OAAO;EACpC,MAAM,SAAS,wBAAwB,UAAU,KAAK,MAAM;EAC5D,IAAI,OAAO,UAAU,MAAM,GAAG,OAAO;EAErC,OAAO,eAAe,OAAO,QAC3B,uBAAuB,KAAK;GAC1B,OAAO,MAAM;GACb,QAAQ,OAAO;EACjB,CAAC,CACH;CACF;AACF,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { a as notice, 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-
|
|
3
|
+
import { n as resolveEnv, t as FileTokenStore } from "./token-store-C2r7cFA-.mjs";
|
|
4
4
|
import { a as verifyIdToken, n as exchangeCode, t as buildAuthorizationUrl } from "./oauth-client-QHuDa4fW.mjs";
|
|
5
5
|
import { Result } from "@praha/byethrow";
|
|
6
6
|
import { serve } from "@hono/node-server";
|
|
@@ -208,4 +208,4 @@ function authorizeFailure(error) {
|
|
|
208
208
|
|
|
209
209
|
//#endregion
|
|
210
210
|
export { login_default as default };
|
|
211
|
-
//# sourceMappingURL=login-
|
|
211
|
+
//# sourceMappingURL=login-Dq2L3bI7.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login-FE_dbWMo.mjs","names":[],"sources":["../src/cli/util/base64url.ts","../src/cli/util/random.ts","../src/cli/util/sha256.ts","../src/cli/auth/pkce.ts","../src/cli/auth/state.ts","../src/cli/auth/authorize.ts","../src/cli/commands/auth/login.ts"],"sourcesContent":["// Node 固有の Buffer ではなく Web 標準の btoa/atob を使う。特定ランタイムの API に\n// 縛られず、ブラウザ / Deno / Edge でもそのまま動く形にしておくため。\nexport function encodeBase64Url(bytes: Uint8Array): string {\n let binary = \"\";\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n return globalThis\n .btoa(binary)\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/, \"\");\n}\n\nexport function decodeBase64Url(text: string): Uint8Array {\n const base64 = text.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const binary = globalThis.atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n","export function randomBytes(length: number): Uint8Array {\n return globalThis.crypto.getRandomValues(new Uint8Array(length));\n}\n","export async function sha256(data: Uint8Array): Promise<Uint8Array> {\n // 新しい TS lib は Uint8Array を ArrayBufferLike でジェネリックにし digest が ArrayBuffer 裏付けを要求するため、\n // ArrayBuffer 裏付けの view にコピーしてから渡す。\n const view = new Uint8Array(data);\n const digest = await globalThis.crypto.subtle.digest(\"SHA-256\", view);\n return new Uint8Array(digest);\n}\n","import { encodeBase64Url } from \"../util/base64url.js\";\nimport { randomBytes } from \"../util/random.js\";\nimport { sha256 } from \"../util/sha256.js\";\n\nexport type Pkce = {\n codeVerifier: string;\n codeChallenge: string;\n codeChallengeMethod: \"S256\";\n};\n\nexport async function createPkce(): Promise<Pkce> {\n const codeVerifier = encodeBase64Url(randomBytes(32));\n const digest = await sha256(new TextEncoder().encode(codeVerifier));\n return {\n codeVerifier,\n codeChallenge: encodeBase64Url(digest),\n codeChallengeMethod: \"S256\",\n };\n}\n","import { encodeBase64Url } from \"../util/base64url.js\";\nimport { randomBytes } from \"../util/random.js\";\n\nexport function createState(): string {\n return encodeBase64Url(randomBytes(32));\n}\n\nexport function verifyState(\n expected: string,\n received: string | null,\n): boolean {\n return received !== null && received === expected;\n}\n","import { serve, type ServerType } from \"@hono/node-server\";\nimport { Hono } from \"hono\";\nimport openBrowser from \"open\";\nimport { Result } from \"@praha/byethrow\";\nimport { createPkce } from \"./pkce.js\";\nimport { createState, verifyState } from \"./state.js\";\nimport {\n buildAuthorizationUrl,\n exchangeCode,\n verifyIdToken,\n type IdTokenClaims,\n type TokenExchangeError,\n type TokenSet,\n} from \"./oauth-client.js\";\n\nconst DEFAULT_TIMEOUT_MS = 5 * 60 * 1000;\n\nexport type AuthorizeError =\n | { type: \"callback_server_failed\" }\n | { type: \"callback_timeout\" }\n | { type: \"state_mismatch\" }\n | { type: \"user_denied\"; description?: string }\n | TokenExchangeError;\n\nexport type AuthorizeSuccess = {\n issuerUrl: string;\n tokenSet: TokenSet;\n claims: IdTokenClaims;\n};\n\ntype CallbackQuery = {\n code?: string;\n state?: string;\n error?: string;\n errorDescription?: string;\n};\n\nexport type AuthorizeParams = {\n issuerUrl: string;\n // ブラウザ起動を差し替え可能にして統合テストで「ブラウザ役」の fetch を流せるようにする。\n openBrowser?: (url: string) => Promise<void>;\n // ブラウザ起動に失敗したときに authorization URL を利用者へ手動提示するための通知口。\n onAuthorizationUrl?: (url: string) => void;\n timeoutMs?: number;\n};\n\nexport async function authorize(\n params: AuthorizeParams,\n): Promise<Result.Result<AuthorizeSuccess, AuthorizeError>> {\n const { issuerUrl } = params;\n const pkce = await createPkce();\n const state = createState();\n\n let resolveCallback: (query: CallbackQuery) => void = () => {};\n const callbackReceived = new Promise<CallbackQuery>((resolve) => {\n resolveCallback = resolve;\n });\n\n const app = new Hono();\n app.get(\"/callback\", (c) => {\n const query = c.req.query();\n resolveCallback({\n code: query.code,\n state: query.state,\n error: query.error,\n errorDescription: query.error_description,\n });\n return c.html(renderCallbackHtml(query.error == null));\n });\n\n let listened: { server: ServerType; port: number };\n try {\n listened = await listen(app);\n } catch {\n // loopback に bind できない環境ではログインを完遂できないため、待たずに失敗を返す。\n return Result.fail({ type: \"callback_server_failed\" });\n }\n const { server, port } = listened;\n\n try {\n const redirectUri = `http://127.0.0.1:${port}/callback`;\n const authorizationUrl = buildAuthorizationUrl({\n issuerUrl,\n redirectUri,\n codeChallenge: pkce.codeChallenge,\n codeChallengeMethod: pkce.codeChallengeMethod,\n state,\n });\n\n const openImpl = params.openBrowser ?? openBrowser;\n await openImpl(authorizationUrl).catch(() => {\n params.onAuthorizationUrl?.(authorizationUrl);\n });\n\n const query = await waitForCallback(\n callbackReceived,\n params.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n );\n if (query == null) {\n return Result.fail({ type: \"callback_timeout\" });\n }\n\n // 成功・失敗どちらの応答も Authorization Server は state を返すため、分岐する前に検証する。\n // 無関係なローカルリクエスト(?error=... 等)で進行中のログインを中断させないため。\n if (!verifyState(state, query.state ?? null)) {\n return Result.fail({ type: \"state_mismatch\" });\n }\n\n if (query.error != null) {\n if (query.error === \"access_denied\") {\n return Result.fail({\n type: \"user_denied\",\n description: query.errorDescription,\n });\n }\n return Result.fail({\n type: \"token_exchange_failed\",\n reason: [query.error, query.errorDescription]\n .filter((part) => part != null)\n .join(\": \"),\n });\n }\n\n if (query.code == null) {\n return Result.fail({\n type: \"token_exchange_failed\",\n reason: \"Authorization response did not include a code\",\n });\n }\n\n const exchanged = await exchangeCode({\n issuerUrl,\n code: query.code,\n redirectUri,\n codeVerifier: pkce.codeVerifier,\n });\n if (Result.isFailure(exchanged)) return exchanged;\n\n const claims = await verifyIdToken(issuerUrl, exchanged.value.idToken);\n\n return Result.succeed({ issuerUrl, tokenSet: exchanged.value, claims });\n } finally {\n await closeServer(server);\n }\n}\n\nasync function listen(\n app: Hono,\n): Promise<{ server: ServerType; port: number }> {\n return new Promise((resolve, reject) => {\n const server = serve(\n { fetch: app.fetch, hostname: \"127.0.0.1\", port: 0 },\n (info) => resolve({ server, port: info.port }),\n );\n server.on(\"error\", (error) => reject(error));\n });\n}\n\nasync function waitForCallback(\n callbackReceived: Promise<CallbackQuery>,\n timeoutMs: number,\n): Promise<CallbackQuery | undefined> {\n let timer: NodeJS.Timeout | undefined;\n const timedOut = new Promise<undefined>((resolve) => {\n timer = setTimeout(() => resolve(undefined), timeoutMs);\n });\n try {\n return await Promise.race([callbackReceived, timedOut]);\n } finally {\n if (timer != null) clearTimeout(timer);\n }\n}\n\nasync function closeServer(server: ServerType): Promise<void> {\n await new Promise<void>((resolve) => server.close(() => resolve()));\n}\n\nfunction renderCallbackHtml(success: boolean): string {\n const message = success\n ? \"Login successful. You can close this tab and return to the terminal.\"\n : \"Login failed. You can close this tab and return to the terminal.\";\n return `<!doctype html><html><head><meta charset=\"utf-8\"><title>Orizm CLI</title></head><body><p>${message}</p></body></html>`;\n}\n","import { Result } from \"@praha/byethrow\";\nimport { defineCommand } from \"../define-command.js\";\nimport { globalArgs } from \"../shared.js\";\nimport { CommandFailure } from \"../define-command.js\";\nimport { resolveEnv } from \"../../env.js\";\nimport { authorize, type AuthorizeError } from \"../../auth/authorize.js\";\nimport { FileTokenStore } from \"../../auth/token-store.js\";\nimport { notice } from \"../../ui/output.js\";\n\nexport default defineCommand({\n meta: {\n name: \"login\",\n description: \"Sign in to Orizm\",\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 } = env.value;\n\n notice(\n \"Opening your browser to complete sign-in. Finish within 5 minutes...\",\n );\n\n const result = await authorize({\n issuerUrl,\n onAuthorizationUrl: (url) =>\n notice(\n `Could not open a browser automatically. Open this URL:\\n${url}`,\n ),\n });\n if (Result.isFailure(result)) {\n return authorizeFailure(result.error);\n }\n\n const { tokenSet, claims } = result.value;\n await new FileTokenStore().set(issuerUrl, {\n accessToken: tokenSet.accessToken,\n refreshToken: tokenSet.refreshToken,\n idToken: tokenSet.idToken,\n expiresAt: tokenSet.expiresAt,\n scope: tokenSet.scope,\n subject: claims.subject,\n profile: { name: claims.name, email: claims.email },\n });\n\n const who = claims.email ?? claims.name ?? claims.subject;\n return Result.succeed({\n json: { issuer: issuerUrl, subject: claims.subject, email: claims.email },\n text: () => `Logged in as ${who}.`,\n });\n },\n});\n\nfunction authorizeFailure(\n error: AuthorizeError,\n): Result.Result<never, CommandFailure> {\n switch (error.type) {\n case \"callback_server_failed\":\n return Result.fail({\n message:\n \"Could not start the local sign-in listener. Check that your environment allows local connections, then try again.\",\n });\n case \"callback_timeout\":\n return Result.fail({\n message:\n \"Timed out before the browser sign-in completed. Run `orizm auth login` again.\",\n });\n case \"state_mismatch\":\n return Result.fail({\n message: \"Sign-in failed due to a security check. Please try again.\",\n });\n case \"user_denied\":\n return Result.fail({ message: \"Sign-in was denied.\" });\n case \"token_exchange_failed\":\n return Result.fail({\n message: `Sign-in failed: ${error.reason}. Please try again.`,\n });\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"login-Dq2L3bI7.mjs","names":[],"sources":["../src/cli/util/base64url.ts","../src/cli/util/random.ts","../src/cli/util/sha256.ts","../src/cli/auth/pkce.ts","../src/cli/auth/state.ts","../src/cli/auth/authorize.ts","../src/cli/commands/auth/login.ts"],"sourcesContent":["// Node 固有の Buffer ではなく Web 標準の btoa/atob を使う。特定ランタイムの API に\n// 縛られず、ブラウザ / Deno / Edge でもそのまま動く形にしておくため。\nexport function encodeBase64Url(bytes: Uint8Array): string {\n let binary = \"\";\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n return globalThis\n .btoa(binary)\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/, \"\");\n}\n\nexport function decodeBase64Url(text: string): Uint8Array {\n const base64 = text.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const binary = globalThis.atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n","export function randomBytes(length: number): Uint8Array {\n return globalThis.crypto.getRandomValues(new Uint8Array(length));\n}\n","export async function sha256(data: Uint8Array): Promise<Uint8Array> {\n // 新しい TS lib は Uint8Array を ArrayBufferLike でジェネリックにし digest が ArrayBuffer 裏付けを要求するため、\n // ArrayBuffer 裏付けの view にコピーしてから渡す。\n const view = new Uint8Array(data);\n const digest = await globalThis.crypto.subtle.digest(\"SHA-256\", view);\n return new Uint8Array(digest);\n}\n","import { encodeBase64Url } from \"../util/base64url.js\";\nimport { randomBytes } from \"../util/random.js\";\nimport { sha256 } from \"../util/sha256.js\";\n\nexport type Pkce = {\n codeVerifier: string;\n codeChallenge: string;\n codeChallengeMethod: \"S256\";\n};\n\nexport async function createPkce(): Promise<Pkce> {\n const codeVerifier = encodeBase64Url(randomBytes(32));\n const digest = await sha256(new TextEncoder().encode(codeVerifier));\n return {\n codeVerifier,\n codeChallenge: encodeBase64Url(digest),\n codeChallengeMethod: \"S256\",\n };\n}\n","import { encodeBase64Url } from \"../util/base64url.js\";\nimport { randomBytes } from \"../util/random.js\";\n\nexport function createState(): string {\n return encodeBase64Url(randomBytes(32));\n}\n\nexport function verifyState(\n expected: string,\n received: string | null,\n): boolean {\n return received !== null && received === expected;\n}\n","import { serve, type ServerType } from \"@hono/node-server\";\nimport { Hono } from \"hono\";\nimport openBrowser from \"open\";\nimport { Result } from \"@praha/byethrow\";\nimport { createPkce } from \"./pkce.js\";\nimport { createState, verifyState } from \"./state.js\";\nimport {\n buildAuthorizationUrl,\n exchangeCode,\n verifyIdToken,\n type IdTokenClaims,\n type TokenExchangeError,\n type TokenSet,\n} from \"./oauth-client.js\";\n\nconst DEFAULT_TIMEOUT_MS = 5 * 60 * 1000;\n\nexport type AuthorizeError =\n | { type: \"callback_server_failed\" }\n | { type: \"callback_timeout\" }\n | { type: \"state_mismatch\" }\n | { type: \"user_denied\"; description?: string }\n | TokenExchangeError;\n\nexport type AuthorizeSuccess = {\n issuerUrl: string;\n tokenSet: TokenSet;\n claims: IdTokenClaims;\n};\n\ntype CallbackQuery = {\n code?: string;\n state?: string;\n error?: string;\n errorDescription?: string;\n};\n\nexport type AuthorizeParams = {\n issuerUrl: string;\n // ブラウザ起動を差し替え可能にして統合テストで「ブラウザ役」の fetch を流せるようにする。\n openBrowser?: (url: string) => Promise<void>;\n // ブラウザ起動に失敗したときに authorization URL を利用者へ手動提示するための通知口。\n onAuthorizationUrl?: (url: string) => void;\n timeoutMs?: number;\n};\n\nexport async function authorize(\n params: AuthorizeParams,\n): Promise<Result.Result<AuthorizeSuccess, AuthorizeError>> {\n const { issuerUrl } = params;\n const pkce = await createPkce();\n const state = createState();\n\n let resolveCallback: (query: CallbackQuery) => void = () => {};\n const callbackReceived = new Promise<CallbackQuery>((resolve) => {\n resolveCallback = resolve;\n });\n\n const app = new Hono();\n app.get(\"/callback\", (c) => {\n const query = c.req.query();\n resolveCallback({\n code: query.code,\n state: query.state,\n error: query.error,\n errorDescription: query.error_description,\n });\n return c.html(renderCallbackHtml(query.error == null));\n });\n\n let listened: { server: ServerType; port: number };\n try {\n listened = await listen(app);\n } catch {\n // loopback に bind できない環境ではログインを完遂できないため、待たずに失敗を返す。\n return Result.fail({ type: \"callback_server_failed\" });\n }\n const { server, port } = listened;\n\n try {\n const redirectUri = `http://127.0.0.1:${port}/callback`;\n const authorizationUrl = buildAuthorizationUrl({\n issuerUrl,\n redirectUri,\n codeChallenge: pkce.codeChallenge,\n codeChallengeMethod: pkce.codeChallengeMethod,\n state,\n });\n\n const openImpl = params.openBrowser ?? openBrowser;\n await openImpl(authorizationUrl).catch(() => {\n params.onAuthorizationUrl?.(authorizationUrl);\n });\n\n const query = await waitForCallback(\n callbackReceived,\n params.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n );\n if (query == null) {\n return Result.fail({ type: \"callback_timeout\" });\n }\n\n // 成功・失敗どちらの応答も Authorization Server は state を返すため、分岐する前に検証する。\n // 無関係なローカルリクエスト(?error=... 等)で進行中のログインを中断させないため。\n if (!verifyState(state, query.state ?? null)) {\n return Result.fail({ type: \"state_mismatch\" });\n }\n\n if (query.error != null) {\n if (query.error === \"access_denied\") {\n return Result.fail({\n type: \"user_denied\",\n description: query.errorDescription,\n });\n }\n return Result.fail({\n type: \"token_exchange_failed\",\n reason: [query.error, query.errorDescription]\n .filter((part) => part != null)\n .join(\": \"),\n });\n }\n\n if (query.code == null) {\n return Result.fail({\n type: \"token_exchange_failed\",\n reason: \"Authorization response did not include a code\",\n });\n }\n\n const exchanged = await exchangeCode({\n issuerUrl,\n code: query.code,\n redirectUri,\n codeVerifier: pkce.codeVerifier,\n });\n if (Result.isFailure(exchanged)) return exchanged;\n\n const claims = await verifyIdToken(issuerUrl, exchanged.value.idToken);\n\n return Result.succeed({ issuerUrl, tokenSet: exchanged.value, claims });\n } finally {\n await closeServer(server);\n }\n}\n\nasync function listen(\n app: Hono,\n): Promise<{ server: ServerType; port: number }> {\n return new Promise((resolve, reject) => {\n const server = serve(\n { fetch: app.fetch, hostname: \"127.0.0.1\", port: 0 },\n (info) => resolve({ server, port: info.port }),\n );\n server.on(\"error\", (error) => reject(error));\n });\n}\n\nasync function waitForCallback(\n callbackReceived: Promise<CallbackQuery>,\n timeoutMs: number,\n): Promise<CallbackQuery | undefined> {\n let timer: NodeJS.Timeout | undefined;\n const timedOut = new Promise<undefined>((resolve) => {\n timer = setTimeout(() => resolve(undefined), timeoutMs);\n });\n try {\n return await Promise.race([callbackReceived, timedOut]);\n } finally {\n if (timer != null) clearTimeout(timer);\n }\n}\n\nasync function closeServer(server: ServerType): Promise<void> {\n await new Promise<void>((resolve) => server.close(() => resolve()));\n}\n\nfunction renderCallbackHtml(success: boolean): string {\n const message = success\n ? \"Login successful. You can close this tab and return to the terminal.\"\n : \"Login failed. You can close this tab and return to the terminal.\";\n return `<!doctype html><html><head><meta charset=\"utf-8\"><title>Orizm CLI</title></head><body><p>${message}</p></body></html>`;\n}\n","import { Result } from \"@praha/byethrow\";\nimport { defineCommand } from \"../define-command.js\";\nimport { globalArgs } from \"../shared.js\";\nimport { CommandFailure } from \"../define-command.js\";\nimport { resolveEnv } from \"../../env.js\";\nimport { authorize, type AuthorizeError } from \"../../auth/authorize.js\";\nimport { FileTokenStore } from \"../../auth/token-store.js\";\nimport { notice } from \"../../ui/output.js\";\n\nexport default defineCommand({\n meta: {\n name: \"login\",\n description: \"Sign in to Orizm\",\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 } = env.value;\n\n notice(\n \"Opening your browser to complete sign-in. Finish within 5 minutes...\",\n );\n\n const result = await authorize({\n issuerUrl,\n onAuthorizationUrl: (url) =>\n notice(\n `Could not open a browser automatically. Open this URL:\\n${url}`,\n ),\n });\n if (Result.isFailure(result)) {\n return authorizeFailure(result.error);\n }\n\n const { tokenSet, claims } = result.value;\n await new FileTokenStore().set(issuerUrl, {\n accessToken: tokenSet.accessToken,\n refreshToken: tokenSet.refreshToken,\n idToken: tokenSet.idToken,\n expiresAt: tokenSet.expiresAt,\n scope: tokenSet.scope,\n subject: claims.subject,\n profile: { name: claims.name, email: claims.email },\n });\n\n const who = claims.email ?? claims.name ?? claims.subject;\n return Result.succeed({\n json: { issuer: issuerUrl, subject: claims.subject, email: claims.email },\n text: () => `Logged in as ${who}.`,\n });\n },\n});\n\nfunction authorizeFailure(\n error: AuthorizeError,\n): Result.Result<never, CommandFailure> {\n switch (error.type) {\n case \"callback_server_failed\":\n return Result.fail({\n message:\n \"Could not start the local sign-in listener. Check that your environment allows local connections, then try again.\",\n });\n case \"callback_timeout\":\n return Result.fail({\n message:\n \"Timed out before the browser sign-in completed. Run `orizm auth login` again.\",\n });\n case \"state_mismatch\":\n return Result.fail({\n message: \"Sign-in failed due to a security check. Please try again.\",\n });\n case \"user_denied\":\n return Result.fail({ message: \"Sign-in was denied.\" });\n case \"token_exchange_failed\":\n return Result.fail({\n message: `Sign-in failed: ${error.reason}. Please try again.`,\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_token_store = require('./token-store
|
|
3
|
+
const require_token_store = require('./token-store-BgWGhqq0.cjs');
|
|
4
4
|
const require_oauth_client = require('./oauth-client-CdD0evAV.cjs');
|
|
5
5
|
let _praha_byethrow = require("@praha/byethrow");
|
|
6
6
|
let _hono_node_server = require("@hono/node-server");
|
|
@@ -209,4 +209,4 @@ function authorizeFailure(error) {
|
|
|
209
209
|
|
|
210
210
|
//#endregion
|
|
211
211
|
exports.default = login_default;
|
|
212
|
-
//# sourceMappingURL=login-
|
|
212
|
+
//# sourceMappingURL=login-M1IF2MdC.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login-2XcHd4wn.cjs","names":["Hono","Result","buildAuthorizationUrl","openBrowser","exchangeCode","verifyIdToken","defineCommand","globalArgs","resolveEnv","Result","notice","FileTokenStore"],"sources":["../src/cli/util/base64url.ts","../src/cli/util/random.ts","../src/cli/util/sha256.ts","../src/cli/auth/pkce.ts","../src/cli/auth/state.ts","../src/cli/auth/authorize.ts","../src/cli/commands/auth/login.ts"],"sourcesContent":["// Node 固有の Buffer ではなく Web 標準の btoa/atob を使う。特定ランタイムの API に\n// 縛られず、ブラウザ / Deno / Edge でもそのまま動く形にしておくため。\nexport function encodeBase64Url(bytes: Uint8Array): string {\n let binary = \"\";\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n return globalThis\n .btoa(binary)\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/, \"\");\n}\n\nexport function decodeBase64Url(text: string): Uint8Array {\n const base64 = text.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const binary = globalThis.atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n","export function randomBytes(length: number): Uint8Array {\n return globalThis.crypto.getRandomValues(new Uint8Array(length));\n}\n","export async function sha256(data: Uint8Array): Promise<Uint8Array> {\n // 新しい TS lib は Uint8Array を ArrayBufferLike でジェネリックにし digest が ArrayBuffer 裏付けを要求するため、\n // ArrayBuffer 裏付けの view にコピーしてから渡す。\n const view = new Uint8Array(data);\n const digest = await globalThis.crypto.subtle.digest(\"SHA-256\", view);\n return new Uint8Array(digest);\n}\n","import { encodeBase64Url } from \"../util/base64url.js\";\nimport { randomBytes } from \"../util/random.js\";\nimport { sha256 } from \"../util/sha256.js\";\n\nexport type Pkce = {\n codeVerifier: string;\n codeChallenge: string;\n codeChallengeMethod: \"S256\";\n};\n\nexport async function createPkce(): Promise<Pkce> {\n const codeVerifier = encodeBase64Url(randomBytes(32));\n const digest = await sha256(new TextEncoder().encode(codeVerifier));\n return {\n codeVerifier,\n codeChallenge: encodeBase64Url(digest),\n codeChallengeMethod: \"S256\",\n };\n}\n","import { encodeBase64Url } from \"../util/base64url.js\";\nimport { randomBytes } from \"../util/random.js\";\n\nexport function createState(): string {\n return encodeBase64Url(randomBytes(32));\n}\n\nexport function verifyState(\n expected: string,\n received: string | null,\n): boolean {\n return received !== null && received === expected;\n}\n","import { serve, type ServerType } from \"@hono/node-server\";\nimport { Hono } from \"hono\";\nimport openBrowser from \"open\";\nimport { Result } from \"@praha/byethrow\";\nimport { createPkce } from \"./pkce.js\";\nimport { createState, verifyState } from \"./state.js\";\nimport {\n buildAuthorizationUrl,\n exchangeCode,\n verifyIdToken,\n type IdTokenClaims,\n type TokenExchangeError,\n type TokenSet,\n} from \"./oauth-client.js\";\n\nconst DEFAULT_TIMEOUT_MS = 5 * 60 * 1000;\n\nexport type AuthorizeError =\n | { type: \"callback_server_failed\" }\n | { type: \"callback_timeout\" }\n | { type: \"state_mismatch\" }\n | { type: \"user_denied\"; description?: string }\n | TokenExchangeError;\n\nexport type AuthorizeSuccess = {\n issuerUrl: string;\n tokenSet: TokenSet;\n claims: IdTokenClaims;\n};\n\ntype CallbackQuery = {\n code?: string;\n state?: string;\n error?: string;\n errorDescription?: string;\n};\n\nexport type AuthorizeParams = {\n issuerUrl: string;\n // ブラウザ起動を差し替え可能にして統合テストで「ブラウザ役」の fetch を流せるようにする。\n openBrowser?: (url: string) => Promise<void>;\n // ブラウザ起動に失敗したときに authorization URL を利用者へ手動提示するための通知口。\n onAuthorizationUrl?: (url: string) => void;\n timeoutMs?: number;\n};\n\nexport async function authorize(\n params: AuthorizeParams,\n): Promise<Result.Result<AuthorizeSuccess, AuthorizeError>> {\n const { issuerUrl } = params;\n const pkce = await createPkce();\n const state = createState();\n\n let resolveCallback: (query: CallbackQuery) => void = () => {};\n const callbackReceived = new Promise<CallbackQuery>((resolve) => {\n resolveCallback = resolve;\n });\n\n const app = new Hono();\n app.get(\"/callback\", (c) => {\n const query = c.req.query();\n resolveCallback({\n code: query.code,\n state: query.state,\n error: query.error,\n errorDescription: query.error_description,\n });\n return c.html(renderCallbackHtml(query.error == null));\n });\n\n let listened: { server: ServerType; port: number };\n try {\n listened = await listen(app);\n } catch {\n // loopback に bind できない環境ではログインを完遂できないため、待たずに失敗を返す。\n return Result.fail({ type: \"callback_server_failed\" });\n }\n const { server, port } = listened;\n\n try {\n const redirectUri = `http://127.0.0.1:${port}/callback`;\n const authorizationUrl = buildAuthorizationUrl({\n issuerUrl,\n redirectUri,\n codeChallenge: pkce.codeChallenge,\n codeChallengeMethod: pkce.codeChallengeMethod,\n state,\n });\n\n const openImpl = params.openBrowser ?? openBrowser;\n await openImpl(authorizationUrl).catch(() => {\n params.onAuthorizationUrl?.(authorizationUrl);\n });\n\n const query = await waitForCallback(\n callbackReceived,\n params.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n );\n if (query == null) {\n return Result.fail({ type: \"callback_timeout\" });\n }\n\n // 成功・失敗どちらの応答も Authorization Server は state を返すため、分岐する前に検証する。\n // 無関係なローカルリクエスト(?error=... 等)で進行中のログインを中断させないため。\n if (!verifyState(state, query.state ?? null)) {\n return Result.fail({ type: \"state_mismatch\" });\n }\n\n if (query.error != null) {\n if (query.error === \"access_denied\") {\n return Result.fail({\n type: \"user_denied\",\n description: query.errorDescription,\n });\n }\n return Result.fail({\n type: \"token_exchange_failed\",\n reason: [query.error, query.errorDescription]\n .filter((part) => part != null)\n .join(\": \"),\n });\n }\n\n if (query.code == null) {\n return Result.fail({\n type: \"token_exchange_failed\",\n reason: \"Authorization response did not include a code\",\n });\n }\n\n const exchanged = await exchangeCode({\n issuerUrl,\n code: query.code,\n redirectUri,\n codeVerifier: pkce.codeVerifier,\n });\n if (Result.isFailure(exchanged)) return exchanged;\n\n const claims = await verifyIdToken(issuerUrl, exchanged.value.idToken);\n\n return Result.succeed({ issuerUrl, tokenSet: exchanged.value, claims });\n } finally {\n await closeServer(server);\n }\n}\n\nasync function listen(\n app: Hono,\n): Promise<{ server: ServerType; port: number }> {\n return new Promise((resolve, reject) => {\n const server = serve(\n { fetch: app.fetch, hostname: \"127.0.0.1\", port: 0 },\n (info) => resolve({ server, port: info.port }),\n );\n server.on(\"error\", (error) => reject(error));\n });\n}\n\nasync function waitForCallback(\n callbackReceived: Promise<CallbackQuery>,\n timeoutMs: number,\n): Promise<CallbackQuery | undefined> {\n let timer: NodeJS.Timeout | undefined;\n const timedOut = new Promise<undefined>((resolve) => {\n timer = setTimeout(() => resolve(undefined), timeoutMs);\n });\n try {\n return await Promise.race([callbackReceived, timedOut]);\n } finally {\n if (timer != null) clearTimeout(timer);\n }\n}\n\nasync function closeServer(server: ServerType): Promise<void> {\n await new Promise<void>((resolve) => server.close(() => resolve()));\n}\n\nfunction renderCallbackHtml(success: boolean): string {\n const message = success\n ? \"Login successful. You can close this tab and return to the terminal.\"\n : \"Login failed. You can close this tab and return to the terminal.\";\n return `<!doctype html><html><head><meta charset=\"utf-8\"><title>Orizm CLI</title></head><body><p>${message}</p></body></html>`;\n}\n","import { Result } from \"@praha/byethrow\";\nimport { defineCommand } from \"../define-command.js\";\nimport { globalArgs } from \"../shared.js\";\nimport { CommandFailure } from \"../define-command.js\";\nimport { resolveEnv } from \"../../env.js\";\nimport { authorize, type AuthorizeError } from \"../../auth/authorize.js\";\nimport { FileTokenStore } from \"../../auth/token-store.js\";\nimport { notice } from \"../../ui/output.js\";\n\nexport default defineCommand({\n meta: {\n name: \"login\",\n description: \"Sign in to Orizm\",\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 } = env.value;\n\n notice(\n \"Opening your browser to complete sign-in. Finish within 5 minutes...\",\n );\n\n const result = await authorize({\n issuerUrl,\n onAuthorizationUrl: (url) =>\n notice(\n `Could not open a browser automatically. Open this URL:\\n${url}`,\n ),\n });\n if (Result.isFailure(result)) {\n return authorizeFailure(result.error);\n }\n\n const { tokenSet, claims } = result.value;\n await new FileTokenStore().set(issuerUrl, {\n accessToken: tokenSet.accessToken,\n refreshToken: tokenSet.refreshToken,\n idToken: tokenSet.idToken,\n expiresAt: tokenSet.expiresAt,\n scope: tokenSet.scope,\n subject: claims.subject,\n profile: { name: claims.name, email: claims.email },\n });\n\n const who = claims.email ?? claims.name ?? claims.subject;\n return Result.succeed({\n json: { issuer: issuerUrl, subject: claims.subject, email: claims.email },\n text: () => `Logged in as ${who}.`,\n });\n },\n});\n\nfunction authorizeFailure(\n error: AuthorizeError,\n): Result.Result<never, CommandFailure> {\n switch (error.type) {\n case \"callback_server_failed\":\n return Result.fail({\n message:\n \"Could not start the local sign-in listener. Check that your environment allows local connections, then try again.\",\n });\n case \"callback_timeout\":\n return Result.fail({\n message:\n \"Timed out before the browser sign-in completed. Run `orizm auth login` again.\",\n });\n case \"state_mismatch\":\n return Result.fail({\n message: \"Sign-in failed due to a security check. Please try again.\",\n });\n case \"user_denied\":\n return Result.fail({ message: \"Sign-in was denied.\" });\n case \"token_exchange_failed\":\n return Result.fail({\n message: `Sign-in failed: ${error.reason}. Please try again.`,\n });\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"login-M1IF2MdC.cjs","names":["Hono","Result","buildAuthorizationUrl","openBrowser","exchangeCode","verifyIdToken","defineCommand","globalArgs","resolveEnv","Result","notice","FileTokenStore"],"sources":["../src/cli/util/base64url.ts","../src/cli/util/random.ts","../src/cli/util/sha256.ts","../src/cli/auth/pkce.ts","../src/cli/auth/state.ts","../src/cli/auth/authorize.ts","../src/cli/commands/auth/login.ts"],"sourcesContent":["// Node 固有の Buffer ではなく Web 標準の btoa/atob を使う。特定ランタイムの API に\n// 縛られず、ブラウザ / Deno / Edge でもそのまま動く形にしておくため。\nexport function encodeBase64Url(bytes: Uint8Array): string {\n let binary = \"\";\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n return globalThis\n .btoa(binary)\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/, \"\");\n}\n\nexport function decodeBase64Url(text: string): Uint8Array {\n const base64 = text.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const binary = globalThis.atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n","export function randomBytes(length: number): Uint8Array {\n return globalThis.crypto.getRandomValues(new Uint8Array(length));\n}\n","export async function sha256(data: Uint8Array): Promise<Uint8Array> {\n // 新しい TS lib は Uint8Array を ArrayBufferLike でジェネリックにし digest が ArrayBuffer 裏付けを要求するため、\n // ArrayBuffer 裏付けの view にコピーしてから渡す。\n const view = new Uint8Array(data);\n const digest = await globalThis.crypto.subtle.digest(\"SHA-256\", view);\n return new Uint8Array(digest);\n}\n","import { encodeBase64Url } from \"../util/base64url.js\";\nimport { randomBytes } from \"../util/random.js\";\nimport { sha256 } from \"../util/sha256.js\";\n\nexport type Pkce = {\n codeVerifier: string;\n codeChallenge: string;\n codeChallengeMethod: \"S256\";\n};\n\nexport async function createPkce(): Promise<Pkce> {\n const codeVerifier = encodeBase64Url(randomBytes(32));\n const digest = await sha256(new TextEncoder().encode(codeVerifier));\n return {\n codeVerifier,\n codeChallenge: encodeBase64Url(digest),\n codeChallengeMethod: \"S256\",\n };\n}\n","import { encodeBase64Url } from \"../util/base64url.js\";\nimport { randomBytes } from \"../util/random.js\";\n\nexport function createState(): string {\n return encodeBase64Url(randomBytes(32));\n}\n\nexport function verifyState(\n expected: string,\n received: string | null,\n): boolean {\n return received !== null && received === expected;\n}\n","import { serve, type ServerType } from \"@hono/node-server\";\nimport { Hono } from \"hono\";\nimport openBrowser from \"open\";\nimport { Result } from \"@praha/byethrow\";\nimport { createPkce } from \"./pkce.js\";\nimport { createState, verifyState } from \"./state.js\";\nimport {\n buildAuthorizationUrl,\n exchangeCode,\n verifyIdToken,\n type IdTokenClaims,\n type TokenExchangeError,\n type TokenSet,\n} from \"./oauth-client.js\";\n\nconst DEFAULT_TIMEOUT_MS = 5 * 60 * 1000;\n\nexport type AuthorizeError =\n | { type: \"callback_server_failed\" }\n | { type: \"callback_timeout\" }\n | { type: \"state_mismatch\" }\n | { type: \"user_denied\"; description?: string }\n | TokenExchangeError;\n\nexport type AuthorizeSuccess = {\n issuerUrl: string;\n tokenSet: TokenSet;\n claims: IdTokenClaims;\n};\n\ntype CallbackQuery = {\n code?: string;\n state?: string;\n error?: string;\n errorDescription?: string;\n};\n\nexport type AuthorizeParams = {\n issuerUrl: string;\n // ブラウザ起動を差し替え可能にして統合テストで「ブラウザ役」の fetch を流せるようにする。\n openBrowser?: (url: string) => Promise<void>;\n // ブラウザ起動に失敗したときに authorization URL を利用者へ手動提示するための通知口。\n onAuthorizationUrl?: (url: string) => void;\n timeoutMs?: number;\n};\n\nexport async function authorize(\n params: AuthorizeParams,\n): Promise<Result.Result<AuthorizeSuccess, AuthorizeError>> {\n const { issuerUrl } = params;\n const pkce = await createPkce();\n const state = createState();\n\n let resolveCallback: (query: CallbackQuery) => void = () => {};\n const callbackReceived = new Promise<CallbackQuery>((resolve) => {\n resolveCallback = resolve;\n });\n\n const app = new Hono();\n app.get(\"/callback\", (c) => {\n const query = c.req.query();\n resolveCallback({\n code: query.code,\n state: query.state,\n error: query.error,\n errorDescription: query.error_description,\n });\n return c.html(renderCallbackHtml(query.error == null));\n });\n\n let listened: { server: ServerType; port: number };\n try {\n listened = await listen(app);\n } catch {\n // loopback に bind できない環境ではログインを完遂できないため、待たずに失敗を返す。\n return Result.fail({ type: \"callback_server_failed\" });\n }\n const { server, port } = listened;\n\n try {\n const redirectUri = `http://127.0.0.1:${port}/callback`;\n const authorizationUrl = buildAuthorizationUrl({\n issuerUrl,\n redirectUri,\n codeChallenge: pkce.codeChallenge,\n codeChallengeMethod: pkce.codeChallengeMethod,\n state,\n });\n\n const openImpl = params.openBrowser ?? openBrowser;\n await openImpl(authorizationUrl).catch(() => {\n params.onAuthorizationUrl?.(authorizationUrl);\n });\n\n const query = await waitForCallback(\n callbackReceived,\n params.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n );\n if (query == null) {\n return Result.fail({ type: \"callback_timeout\" });\n }\n\n // 成功・失敗どちらの応答も Authorization Server は state を返すため、分岐する前に検証する。\n // 無関係なローカルリクエスト(?error=... 等)で進行中のログインを中断させないため。\n if (!verifyState(state, query.state ?? null)) {\n return Result.fail({ type: \"state_mismatch\" });\n }\n\n if (query.error != null) {\n if (query.error === \"access_denied\") {\n return Result.fail({\n type: \"user_denied\",\n description: query.errorDescription,\n });\n }\n return Result.fail({\n type: \"token_exchange_failed\",\n reason: [query.error, query.errorDescription]\n .filter((part) => part != null)\n .join(\": \"),\n });\n }\n\n if (query.code == null) {\n return Result.fail({\n type: \"token_exchange_failed\",\n reason: \"Authorization response did not include a code\",\n });\n }\n\n const exchanged = await exchangeCode({\n issuerUrl,\n code: query.code,\n redirectUri,\n codeVerifier: pkce.codeVerifier,\n });\n if (Result.isFailure(exchanged)) return exchanged;\n\n const claims = await verifyIdToken(issuerUrl, exchanged.value.idToken);\n\n return Result.succeed({ issuerUrl, tokenSet: exchanged.value, claims });\n } finally {\n await closeServer(server);\n }\n}\n\nasync function listen(\n app: Hono,\n): Promise<{ server: ServerType; port: number }> {\n return new Promise((resolve, reject) => {\n const server = serve(\n { fetch: app.fetch, hostname: \"127.0.0.1\", port: 0 },\n (info) => resolve({ server, port: info.port }),\n );\n server.on(\"error\", (error) => reject(error));\n });\n}\n\nasync function waitForCallback(\n callbackReceived: Promise<CallbackQuery>,\n timeoutMs: number,\n): Promise<CallbackQuery | undefined> {\n let timer: NodeJS.Timeout | undefined;\n const timedOut = new Promise<undefined>((resolve) => {\n timer = setTimeout(() => resolve(undefined), timeoutMs);\n });\n try {\n return await Promise.race([callbackReceived, timedOut]);\n } finally {\n if (timer != null) clearTimeout(timer);\n }\n}\n\nasync function closeServer(server: ServerType): Promise<void> {\n await new Promise<void>((resolve) => server.close(() => resolve()));\n}\n\nfunction renderCallbackHtml(success: boolean): string {\n const message = success\n ? \"Login successful. You can close this tab and return to the terminal.\"\n : \"Login failed. You can close this tab and return to the terminal.\";\n return `<!doctype html><html><head><meta charset=\"utf-8\"><title>Orizm CLI</title></head><body><p>${message}</p></body></html>`;\n}\n","import { Result } from \"@praha/byethrow\";\nimport { defineCommand } from \"../define-command.js\";\nimport { globalArgs } from \"../shared.js\";\nimport { CommandFailure } from \"../define-command.js\";\nimport { resolveEnv } from \"../../env.js\";\nimport { authorize, type AuthorizeError } from \"../../auth/authorize.js\";\nimport { FileTokenStore } from \"../../auth/token-store.js\";\nimport { notice } from \"../../ui/output.js\";\n\nexport default defineCommand({\n meta: {\n name: \"login\",\n description: \"Sign in to Orizm\",\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 } = env.value;\n\n notice(\n \"Opening your browser to complete sign-in. Finish within 5 minutes...\",\n );\n\n const result = await authorize({\n issuerUrl,\n onAuthorizationUrl: (url) =>\n notice(\n `Could not open a browser automatically. Open this URL:\\n${url}`,\n ),\n });\n if (Result.isFailure(result)) {\n return authorizeFailure(result.error);\n }\n\n const { tokenSet, claims } = result.value;\n await new FileTokenStore().set(issuerUrl, {\n accessToken: tokenSet.accessToken,\n refreshToken: tokenSet.refreshToken,\n idToken: tokenSet.idToken,\n expiresAt: tokenSet.expiresAt,\n scope: tokenSet.scope,\n subject: claims.subject,\n profile: { name: claims.name, email: claims.email },\n });\n\n const who = claims.email ?? claims.name ?? claims.subject;\n return Result.succeed({\n json: { issuer: issuerUrl, subject: claims.subject, email: claims.email },\n text: () => `Logged in as ${who}.`,\n });\n },\n});\n\nfunction authorizeFailure(\n error: AuthorizeError,\n): Result.Result<never, CommandFailure> {\n switch (error.type) {\n case \"callback_server_failed\":\n return Result.fail({\n message:\n \"Could not start the local sign-in listener. Check that your environment allows local connections, then try again.\",\n });\n case \"callback_timeout\":\n return Result.fail({\n message:\n \"Timed out before the browser sign-in completed. Run `orizm auth login` again.\",\n });\n case \"state_mismatch\":\n return Result.fail({\n message: \"Sign-in failed due to a security check. Please try again.\",\n });\n case \"user_denied\":\n return Result.fail({ message: \"Sign-in was denied.\" });\n case \"token_exchange_failed\":\n return Result.fail({\n message: `Sign-in failed: ${error.reason}. Please try again.`,\n });\n }\n}\n"],"mappings":";;;;;;;;;;;AAEA,SAAgB,gBAAgB,OAA2B;CACzD,IAAI,SAAS;CACb,KAAK,MAAM,QAAQ,OACjB,UAAU,OAAO,aAAa,IAAI;CAEpC,OAAO,WACJ,KAAK,MAAM,CAAC,CACZ,QAAQ,OAAO,GAAG,CAAC,CACnB,QAAQ,OAAO,GAAG,CAAC,CACnB,QAAQ,OAAO,EAAE;AACtB;;;;ACZA,SAAgB,YAAY,QAA4B;CACtD,OAAO,WAAW,OAAO,gBAAgB,IAAI,WAAW,MAAM,CAAC;AACjE;;;;ACFA,eAAsB,OAAO,MAAuC;CAGlE,MAAM,OAAO,IAAI,WAAW,IAAI;CAChC,MAAM,SAAS,MAAM,WAAW,OAAO,OAAO,OAAO,WAAW,IAAI;CACpE,OAAO,IAAI,WAAW,MAAM;AAC9B;;;;ACIA,eAAsB,aAA4B;CAChD,MAAM,eAAe,gBAAgB,YAAY,EAAE,CAAC;CAEpD,OAAO;EACL;EACA,eAAe,gBAAgB,MAHZ,OAAO,IAAI,YAAY,CAAC,CAAC,OAAO,YAAY,CAAC,CAG3B;EACrC,qBAAqB;CACvB;AACF;;;;ACfA,SAAgB,cAAsB;CACpC,OAAO,gBAAgB,YAAY,EAAE,CAAC;AACxC;AAEA,SAAgB,YACd,UACA,UACS;CACT,OAAO,aAAa,QAAQ,aAAa;AAC3C;;;;ACGA,MAAM,qBAAqB,MAAS;AA+BpC,eAAsB,UACpB,QAC0D;CAC1D,MAAM,EAAE,cAAc;CACtB,MAAM,OAAO,MAAM,WAAW;CAC9B,MAAM,QAAQ,YAAY;CAE1B,IAAI,wBAAwD,CAAC;CAC7D,MAAM,mBAAmB,IAAI,SAAwB,YAAY;EAC/D,kBAAkB;CACpB,CAAC;CAED,MAAM,MAAM,IAAIA,UAAK;CACrB,IAAI,IAAI,cAAc,MAAM;EAC1B,MAAM,QAAQ,EAAE,IAAI,MAAM;EAC1B,gBAAgB;GACd,MAAM,MAAM;GACZ,OAAO,MAAM;GACb,OAAO,MAAM;GACb,kBAAkB,MAAM;EAC1B,CAAC;EACD,OAAO,EAAE,KAAK,mBAAmB,MAAM,SAAS,IAAI,CAAC;CACvD,CAAC;CAED,IAAI;CACJ,IAAI;EACF,WAAW,MAAM,OAAO,GAAG;CAC7B,QAAQ;EAEN,OAAOC,uBAAO,KAAK,EAAE,MAAM,yBAAyB,CAAC;CACvD;CACA,MAAM,EAAE,QAAQ,SAAS;CAEzB,IAAI;EACF,MAAM,cAAc,oBAAoB,KAAK;EAC7C,MAAM,mBAAmBC,2CAAsB;GAC7C;GACA;GACA,eAAe,KAAK;GACpB,qBAAqB,KAAK;GAC1B;EACF,CAAC;EAGD,OADiB,OAAO,eAAeC,aACzB,CAAC,gBAAgB,CAAC,CAAC,YAAY;GAC3C,OAAO,qBAAqB,gBAAgB;EAC9C,CAAC;EAED,MAAM,QAAQ,MAAM,gBAClB,kBACA,OAAO,aAAa,kBACtB;EACA,IAAI,SAAS,MACX,OAAOF,uBAAO,KAAK,EAAE,MAAM,mBAAmB,CAAC;EAKjD,IAAI,CAAC,YAAY,OAAO,MAAM,SAAS,IAAI,GACzC,OAAOA,uBAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;EAG/C,IAAI,MAAM,SAAS,MAAM;GACvB,IAAI,MAAM,UAAU,iBAClB,OAAOA,uBAAO,KAAK;IACjB,MAAM;IACN,aAAa,MAAM;GACrB,CAAC;GAEH,OAAOA,uBAAO,KAAK;IACjB,MAAM;IACN,QAAQ,CAAC,MAAM,OAAO,MAAM,gBAAgB,CAAC,CAC1C,QAAQ,SAAS,QAAQ,IAAI,CAAC,CAC9B,KAAK,IAAI;GACd,CAAC;EACH;EAEA,IAAI,MAAM,QAAQ,MAChB,OAAOA,uBAAO,KAAK;GACjB,MAAM;GACN,QAAQ;EACV,CAAC;EAGH,MAAM,YAAY,MAAMG,kCAAa;GACnC;GACA,MAAM,MAAM;GACZ;GACA,cAAc,KAAK;EACrB,CAAC;EACD,IAAIH,uBAAO,UAAU,SAAS,GAAG,OAAO;EAExC,MAAM,SAAS,MAAMI,mCAAc,WAAW,UAAU,MAAM,OAAO;EAErE,OAAOJ,uBAAO,QAAQ;GAAE;GAAW,UAAU,UAAU;GAAO;EAAO,CAAC;CACxE,UAAU;EACR,MAAM,YAAY,MAAM;CAC1B;AACF;AAEA,eAAe,OACb,KAC+C;CAC/C,OAAO,IAAI,SAAS,SAAS,WAAW;EACtC,MAAM,sCACJ;GAAE,OAAO,IAAI;GAAO,UAAU;GAAa,MAAM;EAAE,IAClD,SAAS,QAAQ;GAAE;GAAQ,MAAM,KAAK;EAAK,CAAC,CAC/C;EACA,OAAO,GAAG,UAAU,UAAU,OAAO,KAAK,CAAC;CAC7C,CAAC;AACH;AAEA,eAAe,gBACb,kBACA,WACoC;CACpC,IAAI;CACJ,MAAM,WAAW,IAAI,SAAoB,YAAY;EACnD,QAAQ,iBAAiB,QAAQ,MAAS,GAAG,SAAS;CACxD,CAAC;CACD,IAAI;EACF,OAAO,MAAM,QAAQ,KAAK,CAAC,kBAAkB,QAAQ,CAAC;CACxD,UAAU;EACR,IAAI,SAAS,MAAM,aAAa,KAAK;CACvC;AACF;AAEA,eAAe,YAAY,QAAmC;CAC5D,MAAM,IAAI,SAAe,YAAY,OAAO,YAAY,QAAQ,CAAC,CAAC;AACpE;AAEA,SAAS,mBAAmB,SAA0B;CAIpD,OAAO,4FAHS,UACZ,yEACA,mEACuG;AAC7G;;;;AC7KA,oBAAeK,+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,cAAc,IAAI;EAE1B,wBACE,sEACF;EAEA,MAAM,SAAS,MAAM,UAAU;GAC7B;GACA,qBAAqB,QACnBC,wBACE,2DAA2D,KAC7D;EACJ,CAAC;EACD,IAAID,uBAAO,UAAU,MAAM,GACzB,OAAO,iBAAiB,OAAO,KAAK;EAGtC,MAAM,EAAE,UAAU,WAAW,OAAO;EACpC,MAAM,IAAIE,mCAAe,CAAC,CAAC,IAAI,WAAW;GACxC,aAAa,SAAS;GACtB,cAAc,SAAS;GACvB,SAAS,SAAS;GAClB,WAAW,SAAS;GACpB,OAAO,SAAS;GAChB,SAAS,OAAO;GAChB,SAAS;IAAE,MAAM,OAAO;IAAM,OAAO,OAAO;GAAM;EACpD,CAAC;EAED,MAAM,MAAM,OAAO,SAAS,OAAO,QAAQ,OAAO;EAClD,OAAOF,uBAAO,QAAQ;GACpB,MAAM;IAAE,QAAQ;IAAW,SAAS,OAAO;IAAS,OAAO,OAAO;GAAM;GACxE,YAAY,gBAAgB,IAAI;EAClC,CAAC;CACH;AACF,CAAC;AAED,SAAS,iBACP,OACsC;CACtC,QAAQ,MAAM,MAAd;EACE,KAAK,0BACH,OAAOA,uBAAO,KAAK,EACjB,SACE,oHACJ,CAAC;EACH,KAAK,oBACH,OAAOA,uBAAO,KAAK,EACjB,SACE,gFACJ,CAAC;EACH,KAAK,kBACH,OAAOA,uBAAO,KAAK,EACjB,SAAS,4DACX,CAAC;EACH,KAAK,eACH,OAAOA,uBAAO,KAAK,EAAE,SAAS,sBAAsB,CAAC;EACvD,KAAK,yBACH,OAAOA,uBAAO,KAAK,EACjB,SAAS,mBAAmB,MAAM,OAAO,qBAC3C,CAAC;CACL;AACF"}
|
|
@@ -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
|
|
3
|
+
const require_token_store = require('./token-store-BgWGhqq0.cjs');
|
|
4
4
|
const require_oauth_client = require('./oauth-client-CdD0evAV.cjs');
|
|
5
5
|
let _praha_byethrow = require("@praha/byethrow");
|
|
6
6
|
|
|
@@ -32,4 +32,4 @@ var logout_default = require_cli_main.defineCommand({
|
|
|
32
32
|
|
|
33
33
|
//#endregion
|
|
34
34
|
exports.default = logout_default;
|
|
35
|
-
//# sourceMappingURL=logout-
|
|
35
|
+
//# sourceMappingURL=logout-BCSfFgPz.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logout-
|
|
1
|
+
{"version":3,"file":"logout-BCSfFgPz.cjs","names":["defineCommand","globalArgs","resolveEnv","Result","FileTokenStore","revokeToken"],"sources":["../src/cli/commands/auth/logout.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\";\nimport { revokeToken } from \"../../auth/oauth-client.js\";\n\nexport default defineCommand({\n meta: {\n name: \"logout\",\n description: \"Sign out of Orizm\",\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 } = env.value;\n\n const store = new FileTokenStore();\n const entry = await store.get(issuerUrl);\n if (entry === undefined) {\n return Result.succeed({\n json: { loggedOut: false },\n text: () => \"You are not logged in.\",\n });\n }\n\n // Hydra 側 revoke は best-effort。失敗してもローカル破棄でログアウトは成立させる。\n await revokeToken(issuerUrl, entry.refreshToken).catch(() => undefined);\n await store.remove(issuerUrl);\n\n return Result.succeed({\n json: { loggedOut: true },\n text: () => \"Logged out.\",\n });\n },\n});\n"],"mappings":";;;;;;;AAOA,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,cAAc,IAAI;EAE1B,MAAM,QAAQ,IAAIC,mCAAe;EACjC,MAAM,QAAQ,MAAM,MAAM,IAAI,SAAS;EACvC,IAAI,UAAU,QACZ,OAAOD,uBAAO,QAAQ;GACpB,MAAM,EAAE,WAAW,MAAM;GACzB,YAAY;EACd,CAAC;EAIH,MAAME,iCAAY,WAAW,MAAM,YAAY,CAAC,CAAC,YAAY,MAAS;EACtE,MAAM,MAAM,OAAO,SAAS;EAE5B,OAAOF,uBAAO,QAAQ;GACpB,MAAM,EAAE,WAAW,KAAK;GACxB,YAAY;EACd,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-
|
|
3
|
+
import { n as resolveEnv, t as FileTokenStore } from "./token-store-C2r7cFA-.mjs";
|
|
4
4
|
import { i as revokeToken } from "./oauth-client-QHuDa4fW.mjs";
|
|
5
5
|
import { Result } from "@praha/byethrow";
|
|
6
6
|
|
|
@@ -32,4 +32,4 @@ var logout_default = defineCommand({
|
|
|
32
32
|
|
|
33
33
|
//#endregion
|
|
34
34
|
export { logout_default as default };
|
|
35
|
-
//# sourceMappingURL=logout-
|
|
35
|
+
//# sourceMappingURL=logout-DFzQCQKe.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logout-
|
|
1
|
+
{"version":3,"file":"logout-DFzQCQKe.mjs","names":[],"sources":["../src/cli/commands/auth/logout.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\";\nimport { revokeToken } from \"../../auth/oauth-client.js\";\n\nexport default defineCommand({\n meta: {\n name: \"logout\",\n description: \"Sign out of Orizm\",\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 } = env.value;\n\n const store = new FileTokenStore();\n const entry = await store.get(issuerUrl);\n if (entry === undefined) {\n return Result.succeed({\n json: { loggedOut: false },\n text: () => \"You are not logged in.\",\n });\n }\n\n // Hydra 側 revoke は best-effort。失敗してもローカル破棄でログアウトは成立させる。\n await revokeToken(issuerUrl, entry.refreshToken).catch(() => undefined);\n await store.remove(issuerUrl);\n\n return Result.succeed({\n json: { loggedOut: true },\n text: () => \"Logged out.\",\n });\n },\n});\n"],"mappings":";;;;;;;AAOA,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,cAAc,IAAI;EAE1B,MAAM,QAAQ,IAAI,eAAe;EACjC,MAAM,QAAQ,MAAM,MAAM,IAAI,SAAS;EACvC,IAAI,UAAU,QACZ,OAAO,OAAO,QAAQ;GACpB,MAAM,EAAE,WAAW,MAAM;GACzB,YAAY;EACd,CAAC;EAIH,MAAM,YAAY,WAAW,MAAM,YAAY,CAAC,CAAC,YAAY,MAAS;EACtE,MAAM,MAAM,OAAO,SAAS;EAE5B,OAAO,OAAO,QAAQ;GACpB,MAAM,EAAE,WAAW,KAAK;GACxB,YAAY;EACd,CAAC;CACH;AACF,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
const require_cli_main = require('./cli/main.cjs');
|
|
2
|
+
|
|
3
|
+
//#region src/cli/commands/key/management/index.ts
|
|
4
|
+
var management_default = require_cli_main.defineCommand({
|
|
5
|
+
meta: {
|
|
6
|
+
name: "management",
|
|
7
|
+
description: "Manage management keys (content CRUD with RBAC)"
|
|
8
|
+
},
|
|
9
|
+
subCommands: {
|
|
10
|
+
list: () => Promise.resolve().then(() => require("./list-CMWXO4nB.cjs")).then((m) => m.default),
|
|
11
|
+
create: () => Promise.resolve().then(() => require("./create-tWGEtI3t.cjs")).then((m) => m.default),
|
|
12
|
+
update: () => Promise.resolve().then(() => require("./update-BlUwNhLA.cjs")).then((m) => m.default),
|
|
13
|
+
delete: () => Promise.resolve().then(() => require("./delete-DGrSMqOt.cjs")).then((m) => m.default)
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
//#endregion
|
|
18
|
+
exports.default = management_default;
|
|
19
|
+
//# sourceMappingURL=management-C1p-Hm2Z.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"management-
|
|
1
|
+
{"version":3,"file":"management-C1p-Hm2Z.cjs","names":["defineCommand"],"sources":["../src/cli/commands/key/management/index.ts"],"sourcesContent":["import { defineCommand } from \"../../define-command.js\";\n\nexport default defineCommand({\n meta: {\n name: \"management\",\n description: \"Manage management keys (content CRUD with RBAC)\",\n },\n subCommands: {\n list: () => import(\"./list.js\").then((m) => m.default),\n create: () => import(\"./create.js\").then((m) => m.default),\n update: () => import(\"./update.js\").then((m) => m.default),\n delete: () => import(\"./delete.js\").then((m) => m.default),\n },\n});\n"],"mappings":";;;AAEA,yBAAeA,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,aAAa;EACX,iDAAY,wBAAoB,MAAM,MAAM,EAAE,OAAO;EACrD,mDAAc,0BAAsB,MAAM,MAAM,EAAE,OAAO;EACzD,mDAAc,0BAAsB,MAAM,MAAM,EAAE,OAAO;EACzD,mDAAc,0BAAsB,MAAM,MAAM,EAAE,OAAO;CAC3D;AACF,CAAC"}
|
|
@@ -7,13 +7,13 @@ var management_default = defineCommand({
|
|
|
7
7
|
description: "Manage management keys (content CRUD with RBAC)"
|
|
8
8
|
},
|
|
9
9
|
subCommands: {
|
|
10
|
-
list: () => import("./list-
|
|
11
|
-
create: () => import("./create-
|
|
12
|
-
update: () => import("./update-
|
|
13
|
-
delete: () => import("./delete-
|
|
10
|
+
list: () => import("./list-MWD4huKP.mjs").then((m) => m.default),
|
|
11
|
+
create: () => import("./create-fweRd0UB.mjs").then((m) => m.default),
|
|
12
|
+
update: () => import("./update-Dy1BOnTB.mjs").then((m) => m.default),
|
|
13
|
+
delete: () => import("./delete-CiWkGnog.mjs").then((m) => m.default)
|
|
14
14
|
}
|
|
15
15
|
});
|
|
16
16
|
|
|
17
17
|
//#endregion
|
|
18
18
|
export { management_default as default };
|
|
19
|
-
//# sourceMappingURL=management-
|
|
19
|
+
//# sourceMappingURL=management-h4yE09a6.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"management-
|
|
1
|
+
{"version":3,"file":"management-h4yE09a6.mjs","names":[],"sources":["../src/cli/commands/key/management/index.ts"],"sourcesContent":["import { defineCommand } from \"../../define-command.js\";\n\nexport default defineCommand({\n meta: {\n name: \"management\",\n description: \"Manage management keys (content CRUD with RBAC)\",\n },\n subCommands: {\n list: () => import(\"./list.js\").then((m) => m.default),\n create: () => import(\"./create.js\").then((m) => m.default),\n update: () => import(\"./update.js\").then((m) => m.default),\n delete: () => import(\"./delete.js\").then((m) => m.default),\n },\n});\n"],"mappings":";;;AAEA,yBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,aAAa;EACX,YAAY,OAAO,sBAAY,CAAC,MAAM,MAAM,EAAE,OAAO;EACrD,cAAc,OAAO,wBAAc,CAAC,MAAM,MAAM,EAAE,OAAO;EACzD,cAAc,OAAO,wBAAc,CAAC,MAAM,MAAM,EAAE,OAAO;EACzD,cAAc,OAAO,wBAAc,CAAC,MAAM,MAAM,EAAE,OAAO;CAC3D;AACF,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const require_cli_main = require('./cli/main.cjs');
|
|
2
|
+
|
|
3
|
+
//#region src/cli/commands/bucket/object/index.ts
|
|
4
|
+
var object_default = require_cli_main.defineCommand({
|
|
5
|
+
meta: {
|
|
6
|
+
name: "object",
|
|
7
|
+
description: "Manage objects in a bucket"
|
|
8
|
+
},
|
|
9
|
+
subCommands: {
|
|
10
|
+
list: () => Promise.resolve().then(() => require("./list-Dd3veD9Z.cjs")).then((m) => m.default),
|
|
11
|
+
get: () => Promise.resolve().then(() => require("./get-jaN2o0XY.cjs")).then((m) => m.default),
|
|
12
|
+
upload: () => Promise.resolve().then(() => require("./upload-DIln1QDA.cjs")).then((m) => m.default),
|
|
13
|
+
download: () => Promise.resolve().then(() => require("./download-BkzmfQXD.cjs")).then((m) => m.default),
|
|
14
|
+
delete: () => Promise.resolve().then(() => require("./delete-Cmk80aqF.cjs")).then((m) => m.default)
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
//#endregion
|
|
19
|
+
exports.default = object_default;
|
|
20
|
+
//# sourceMappingURL=object-CZDLoc9L.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object-
|
|
1
|
+
{"version":3,"file":"object-CZDLoc9L.cjs","names":["defineCommand"],"sources":["../src/cli/commands/bucket/object/index.ts"],"sourcesContent":["import { defineCommand } from \"../../define-command.js\";\n\nexport default defineCommand({\n meta: {\n name: \"object\",\n description: \"Manage objects in a bucket\",\n },\n subCommands: {\n list: () => import(\"./list.js\").then((m) => m.default),\n get: () => import(\"./get.js\").then((m) => m.default),\n upload: () => import(\"./upload.js\").then((m) => m.default),\n download: () => import(\"./download.js\").then((m) => m.default),\n delete: () => import(\"./delete.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,gDAAW,uBAAmB,MAAM,MAAM,EAAE,OAAO;EACnD,mDAAc,0BAAsB,MAAM,MAAM,EAAE,OAAO;EACzD,qDAAgB,4BAAwB,MAAM,MAAM,EAAE,OAAO;EAC7D,mDAAc,0BAAsB,MAAM,MAAM,EAAE,OAAO;CAC3D;AACF,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { t as defineCommand } from "./cli/main.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/cli/commands/bucket/object/index.ts
|
|
4
|
+
var object_default = defineCommand({
|
|
5
|
+
meta: {
|
|
6
|
+
name: "object",
|
|
7
|
+
description: "Manage objects in a bucket"
|
|
8
|
+
},
|
|
9
|
+
subCommands: {
|
|
10
|
+
list: () => import("./list-C0lq-gBZ.mjs").then((m) => m.default),
|
|
11
|
+
get: () => import("./get-qOKYAc46.mjs").then((m) => m.default),
|
|
12
|
+
upload: () => import("./upload-CDtzV9Wx.mjs").then((m) => m.default),
|
|
13
|
+
download: () => import("./download-Dx1oyrMg.mjs").then((m) => m.default),
|
|
14
|
+
delete: () => import("./delete-X8iVsETw.mjs").then((m) => m.default)
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
//#endregion
|
|
19
|
+
export { object_default as default };
|
|
20
|
+
//# sourceMappingURL=object-CqMsEkh9.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object-
|
|
1
|
+
{"version":3,"file":"object-CqMsEkh9.mjs","names":[],"sources":["../src/cli/commands/bucket/object/index.ts"],"sourcesContent":["import { defineCommand } from \"../../define-command.js\";\n\nexport default defineCommand({\n meta: {\n name: \"object\",\n description: \"Manage objects in a bucket\",\n },\n subCommands: {\n list: () => import(\"./list.js\").then((m) => m.default),\n get: () => import(\"./get.js\").then((m) => m.default),\n upload: () => import(\"./upload.js\").then((m) => m.default),\n download: () => import(\"./download.js\").then((m) => m.default),\n delete: () => import(\"./delete.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,WAAW,OAAO,qBAAW,CAAC,MAAM,MAAM,EAAE,OAAO;EACnD,cAAc,OAAO,wBAAc,CAAC,MAAM,MAAM,EAAE,OAAO;EACzD,gBAAgB,OAAO,0BAAgB,CAAC,MAAM,MAAM,EAAE,OAAO;EAC7D,cAAc,OAAO,wBAAc,CAAC,MAAM,MAAM,EAAE,OAAO;CAC3D;AACF,CAAC"}
|
|
@@ -6,9 +6,9 @@ var org_default = defineCommand({
|
|
|
6
6
|
name: "org",
|
|
7
7
|
description: "Work with organizations"
|
|
8
8
|
},
|
|
9
|
-
subCommands: { list: () => import("./list-
|
|
9
|
+
subCommands: { list: () => import("./list-DcIBInNA.mjs").then((m) => m.default) }
|
|
10
10
|
});
|
|
11
11
|
|
|
12
12
|
//#endregion
|
|
13
13
|
export { org_default as default };
|
|
14
|
-
//# sourceMappingURL=org-
|
|
14
|
+
//# sourceMappingURL=org-Co-rjfr-.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"org-
|
|
1
|
+
{"version":3,"file":"org-Co-rjfr-.mjs","names":[],"sources":["../src/cli/commands/org/index.ts"],"sourcesContent":["import { defineCommand } from \"../define-command.js\";\n\nexport default defineCommand({\n meta: {\n name: \"org\",\n description: \"Work with organizations\",\n },\n subCommands: {\n list: () => import(\"./list.js\").then((m) => m.default),\n },\n});\n"],"mappings":";;;AAEA,kBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,aAAa,EACX,YAAY,OAAO,sBAAY,CAAC,MAAM,MAAM,EAAE,OAAO,EACvD;AACF,CAAC"}
|
|
@@ -6,9 +6,9 @@ var org_default = require_cli_main.defineCommand({
|
|
|
6
6
|
name: "org",
|
|
7
7
|
description: "Work with organizations"
|
|
8
8
|
},
|
|
9
|
-
subCommands: { list: () => Promise.resolve().then(() => require("./list-
|
|
9
|
+
subCommands: { list: () => Promise.resolve().then(() => require("./list-KI-7REC_.cjs")).then((m) => m.default) }
|
|
10
10
|
});
|
|
11
11
|
|
|
12
12
|
//#endregion
|
|
13
13
|
exports.default = org_default;
|
|
14
|
-
//# sourceMappingURL=org-
|
|
14
|
+
//# sourceMappingURL=org-Drj3VqIm.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"org-
|
|
1
|
+
{"version":3,"file":"org-Drj3VqIm.cjs","names":["defineCommand"],"sources":["../src/cli/commands/org/index.ts"],"sourcesContent":["import { defineCommand } from \"../define-command.js\";\n\nexport default defineCommand({\n meta: {\n name: \"org\",\n description: \"Work with organizations\",\n },\n subCommands: {\n list: () => import(\"./list.js\").then((m) => m.default),\n },\n});\n"],"mappings":";;;AAEA,kBAAeA,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,aAAa,EACX,iDAAY,wBAAoB,MAAM,MAAM,EAAE,OAAO,EACvD;AACF,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const require_run_with_context = require('./run-with-context-
|
|
1
|
+
const require_run_with_context = require('./run-with-context-D8pSrqD_.cjs');
|
|
2
2
|
let _praha_byethrow = require("@praha/byethrow");
|
|
3
3
|
|
|
4
4
|
//#region src/cli/commands/org-context.ts
|
|
@@ -27,4 +27,4 @@ Object.defineProperty(exports, 'resolveOrganizationIdFromArgs', {
|
|
|
27
27
|
return resolveOrganizationIdFromArgs;
|
|
28
28
|
}
|
|
29
29
|
});
|
|
30
|
-
//# sourceMappingURL=org-context-
|
|
30
|
+
//# sourceMappingURL=org-context-DKFnPH_o.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"org-context-
|
|
1
|
+
{"version":3,"file":"org-context-DKFnPH_o.cjs","names":["resolveOrganizationName","Result","resolveOrganizationId","apiErrorFailure"],"sources":["../src/cli/commands/org-context.ts"],"sourcesContent":["import { Result } from \"@praha/byethrow\";\nimport type { DeveloperApiClient } from \"../api/client.js\";\nimport {\n resolveOrganizationId,\n type OrganizationId,\n} from \"../api/organizations.js\";\nimport { resolveOrganizationName } from \"../context/project.js\";\nimport { apiErrorFailure } from \"./api-errors.js\";\nimport type { CommandFailure } from \"./define-command.js\";\n\n// project list / create が --organization or .orizm/project.json から org id を解決する共通経路。\n// 解決失敗を user-facing メッセージへ畳む。\nexport async function resolveOrganizationIdFromArgs(params: {\n client: DeveloperApiClient;\n flag?: string;\n cwd?: string;\n}): Promise<Result.Result<OrganizationId, CommandFailure>> {\n const name = await resolveOrganizationName({\n flag: params.flag,\n cwd: params.cwd,\n });\n if (Result.isFailure(name)) {\n switch (name.error.type) {\n case \"project_json_invalid\":\n return Result.fail({\n message: `Invalid project file: ${name.error.path}`,\n });\n case \"no_project_context\":\n case \"no_organization_context\":\n return Result.fail({\n message:\n \"No organization selected. Run `orizm link` or pass --organization <name>.\",\n });\n }\n }\n\n const id = await resolveOrganizationId(params.client, name.value);\n if (Result.isFailure(id)) {\n if (id.error.type === \"organization_not_found\") {\n return Result.fail({\n message: `Organization not found: ${id.error.name}`,\n });\n }\n return apiErrorFailure(id.error);\n }\n return Result.succeed(id.value);\n}\n"],"mappings":";;;;AAYA,eAAsB,8BAA8B,QAIO;CACzD,MAAM,OAAO,MAAMA,iDAAwB;EACzC,MAAM,OAAO;EACb,KAAK,OAAO;CACd,CAAC;CACD,IAAIC,uBAAO,UAAU,IAAI,GACvB,QAAQ,KAAK,MAAM,MAAnB;EACE,KAAK,wBACH,OAAOA,uBAAO,KAAK,EACjB,SAAS,yBAAyB,KAAK,MAAM,OAC/C,CAAC;EACH,KAAK;EACL,KAAK,2BACH,OAAOA,uBAAO,KAAK,EACjB,SACE,4EACJ,CAAC;CACL;CAGF,MAAM,KAAK,MAAMC,+CAAsB,OAAO,QAAQ,KAAK,KAAK;CAChE,IAAID,uBAAO,UAAU,EAAE,GAAG;EACxB,IAAI,GAAG,MAAM,SAAS,0BACpB,OAAOA,uBAAO,KAAK,EACjB,SAAS,2BAA2B,GAAG,MAAM,OAC/C,CAAC;EAEH,OAAOE,yCAAgB,GAAG,KAAK;CACjC;CACA,OAAOF,uBAAO,QAAQ,GAAG,KAAK;AAChC"}
|