@orizm/cli 2.2.7 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +111 -4
- package/dist/array-update-CMFUoQEe.mjs +41 -0
- package/dist/array-update-CMFUoQEe.mjs.map +1 -0
- package/dist/array-update-Dch4e9tI.cjs +58 -0
- package/dist/array-update-Dch4e9tI.cjs.map +1 -0
- package/dist/auth-BGW072BP.mjs +18 -0
- package/dist/auth-BGW072BP.mjs.map +1 -0
- package/dist/auth-CNbONZuf.cjs +18 -0
- package/dist/auth-CNbONZuf.cjs.map +1 -0
- package/dist/bucket-DqW-WEYb.mjs +17 -0
- package/dist/bucket-DqW-WEYb.mjs.map +1 -0
- package/dist/bucket-mg5QQORh.cjs +17 -0
- package/dist/bucket-mg5QQORh.cjs.map +1 -0
- package/dist/cli/main.cjs +231 -0
- package/dist/cli/main.cjs.map +1 -0
- package/dist/cli/main.d.cts +1 -0
- package/dist/cli/main.d.mts +1 -0
- package/dist/cli/main.mjs +196 -0
- package/dist/cli/main.mjs.map +1 -0
- package/dist/cms-BJnovGYT.mjs +172 -0
- package/dist/cms-BJnovGYT.mjs.map +1 -0
- package/dist/cms-Cnx-lDGu.cjs +172 -0
- package/dist/cms-Cnx-lDGu.cjs.map +1 -0
- package/dist/codegen-BF5b-u46.cjs +17 -0
- package/dist/codegen-BF5b-u46.cjs.map +1 -0
- package/dist/codegen-DZOB4ttR.mjs +17 -0
- package/dist/codegen-DZOB4ttR.mjs.map +1 -0
- package/dist/config/index.cjs +49 -96
- package/dist/config/index.cjs.map +1 -1
- package/dist/config/index.d.cts +1 -53
- package/dist/config/{index.d.ts → index.d.mts} +29 -28
- package/dist/config/index.d.mts.map +1 -0
- package/dist/config/index.mjs +59 -0
- package/dist/config/index.mjs.map +1 -0
- package/dist/config-loader-BEgS869e.mjs +65 -0
- package/dist/config-loader-BEgS869e.mjs.map +1 -0
- package/dist/config-loader-D8x32gEU.cjs +78 -0
- package/dist/config-loader-D8x32gEU.cjs.map +1 -0
- package/dist/confirm-delete-B9o73U7B.cjs +19 -0
- package/dist/confirm-delete-B9o73U7B.cjs.map +1 -0
- package/dist/confirm-delete-CsWkW69-.mjs +14 -0
- package/dist/confirm-delete-CsWkW69-.mjs.map +1 -0
- package/dist/consumer-C4WiGHWG.mjs +18 -0
- package/dist/consumer-C4WiGHWG.mjs.map +1 -0
- package/dist/consumer-OF6Z_eTP.cjs +95 -0
- package/dist/consumer-OF6Z_eTP.cjs.map +1 -0
- package/dist/consumer-l-8wUK8E.cjs +18 -0
- package/dist/consumer-l-8wUK8E.cjs.map +1 -0
- package/dist/consumer-pU2HyiyA.mjs +95 -0
- package/dist/consumer-pU2HyiyA.mjs.map +1 -0
- package/dist/content-BOb6NC8M.mjs +20 -0
- package/dist/content-BOb6NC8M.mjs.map +1 -0
- package/dist/content-DMjSwor1.cjs +20 -0
- package/dist/content-DMjSwor1.cjs.map +1 -0
- package/dist/create-B-PAOor6.mjs +66 -0
- package/dist/create-B-PAOor6.mjs.map +1 -0
- package/dist/create-B1ZBOqcV.mjs +58 -0
- package/dist/create-B1ZBOqcV.mjs.map +1 -0
- package/dist/create-BNYWcyuQ.cjs +66 -0
- package/dist/create-BNYWcyuQ.cjs.map +1 -0
- package/dist/create-Belwettw.mjs +54 -0
- package/dist/create-Belwettw.mjs.map +1 -0
- package/dist/create-BvERyMKa.cjs +81 -0
- package/dist/create-BvERyMKa.cjs.map +1 -0
- package/dist/create-CC814ixh.mjs +66 -0
- package/dist/create-CC814ixh.mjs.map +1 -0
- package/dist/create-CmOriwGo.cjs +58 -0
- package/dist/create-CmOriwGo.cjs.map +1 -0
- package/dist/create-DJY71sp9.cjs +54 -0
- package/dist/create-DJY71sp9.cjs.map +1 -0
- package/dist/create-Dups0gV2.mjs +81 -0
- package/dist/create-Dups0gV2.mjs.map +1 -0
- package/dist/create-Z-z3LXNW.cjs +66 -0
- package/dist/create-Z-z3LXNW.cjs.map +1 -0
- package/dist/delete-8yZ3j0vX.cjs +59 -0
- package/dist/delete-8yZ3j0vX.cjs.map +1 -0
- package/dist/delete-BOUObrDw.mjs +48 -0
- package/dist/delete-BOUObrDw.mjs.map +1 -0
- package/dist/delete-BSLIXrAh.mjs +59 -0
- package/dist/delete-BSLIXrAh.mjs.map +1 -0
- package/dist/delete-CCTiCYIL.cjs +51 -0
- package/dist/delete-CCTiCYIL.cjs.map +1 -0
- package/dist/delete-CIYY59v_.cjs +48 -0
- package/dist/delete-CIYY59v_.cjs.map +1 -0
- package/dist/delete-CSs5Czlo.mjs +59 -0
- package/dist/delete-CSs5Czlo.mjs.map +1 -0
- package/dist/delete-D4r1ve4v.cjs +56 -0
- package/dist/delete-D4r1ve4v.cjs.map +1 -0
- package/dist/delete-DVrafka1.cjs +56 -0
- package/dist/delete-DVrafka1.cjs.map +1 -0
- package/dist/delete-DhSU-Lx2.mjs +51 -0
- package/dist/delete-DhSU-Lx2.mjs.map +1 -0
- package/dist/delete-DozSxZQ7.cjs +59 -0
- package/dist/delete-DozSxZQ7.cjs.map +1 -0
- package/dist/delete-WpMIIvjj.cjs +56 -0
- package/dist/delete-WpMIIvjj.cjs.map +1 -0
- package/dist/delete-XWJRhBFs.mjs +56 -0
- package/dist/delete-XWJRhBFs.mjs.map +1 -0
- package/dist/delete-YYh_0khQ.mjs +56 -0
- package/dist/delete-YYh_0khQ.mjs.map +1 -0
- package/dist/delete-ZIifaG0i.mjs +56 -0
- package/dist/delete-ZIifaG0i.mjs.map +1 -0
- package/dist/detail-8CXNIhKw.cjs +16 -0
- package/dist/detail-8CXNIhKw.cjs.map +1 -0
- package/dist/detail-DN5jCQ4N.mjs +10 -0
- package/dist/detail-DN5jCQ4N.mjs.map +1 -0
- package/dist/download-oFGzg30E.mjs +68 -0
- package/dist/download-oFGzg30E.mjs.map +1 -0
- package/dist/download-ogGbb3FU.cjs +68 -0
- package/dist/download-ogGbb3FU.cjs.map +1 -0
- package/dist/erd-lKC5NB2l.cjs +124 -0
- package/dist/erd-lKC5NB2l.cjs.map +1 -0
- package/dist/erd-zDoF6I_y.mjs +123 -0
- package/dist/erd-zDoF6I_y.mjs.map +1 -0
- package/dist/get-BBOKSXkh.cjs +48 -0
- package/dist/get-BBOKSXkh.cjs.map +1 -0
- package/dist/get-BiPEF_m-.cjs +57 -0
- package/dist/get-BiPEF_m-.cjs.map +1 -0
- package/dist/get-C7dKoSIc.mjs +47 -0
- package/dist/get-C7dKoSIc.mjs.map +1 -0
- package/dist/get-CgEgETQa.mjs +52 -0
- package/dist/get-CgEgETQa.mjs.map +1 -0
- package/dist/get-DB80UNSR.mjs +47 -0
- package/dist/get-DB80UNSR.mjs.map +1 -0
- package/dist/get-DBxhbN1G.mjs +57 -0
- package/dist/get-DBxhbN1G.mjs.map +1 -0
- package/dist/get-DDB89cOs.mjs +48 -0
- package/dist/get-DDB89cOs.mjs.map +1 -0
- package/dist/get-DjRyK0hJ.cjs +47 -0
- package/dist/get-DjRyK0hJ.cjs.map +1 -0
- package/dist/get-IOU__2RP.cjs +52 -0
- package/dist/get-IOU__2RP.cjs.map +1 -0
- package/dist/get-KdWfYINc.cjs +47 -0
- package/dist/get-KdWfYINc.cjs.map +1 -0
- package/dist/get-RpxdnCKR.mjs +56 -0
- package/dist/get-RpxdnCKR.mjs.map +1 -0
- package/dist/get-jwXRlIBJ.cjs +57 -0
- package/dist/get-jwXRlIBJ.cjs.map +1 -0
- package/dist/group-roles-BIH7q8tf.mjs +36 -0
- package/dist/group-roles-BIH7q8tf.mjs.map +1 -0
- package/dist/group-roles-B_iAZog-.cjs +59 -0
- package/dist/group-roles-B_iAZog-.cjs.map +1 -0
- package/dist/invite-D66DSMvq.mjs +66 -0
- package/dist/invite-D66DSMvq.mjs.map +1 -0
- package/dist/invite-DPygtCoO.cjs +66 -0
- package/dist/invite-DPygtCoO.cjs.map +1 -0
- package/dist/key-C71Ffll9.mjs +17 -0
- package/dist/key-C71Ffll9.mjs.map +1 -0
- package/dist/key-DQr7qRL2.cjs +17 -0
- package/dist/key-DQr7qRL2.cjs.map +1 -0
- package/dist/link-BluFyxEL.mjs +42 -0
- package/dist/link-BluFyxEL.mjs.map +1 -0
- package/dist/link-DYu1Vjlw.cjs +42 -0
- package/dist/link-DYu1Vjlw.cjs.map +1 -0
- package/dist/list-57TUfNFd.mjs +48 -0
- package/dist/list-57TUfNFd.mjs.map +1 -0
- package/dist/list-B0N4-Q-5.mjs +81 -0
- package/dist/list-B0N4-Q-5.mjs.map +1 -0
- package/dist/list-BHvURTWd.cjs +40 -0
- package/dist/list-BHvURTWd.cjs.map +1 -0
- package/dist/list-BRh59EqI.cjs +35 -0
- package/dist/list-BRh59EqI.cjs.map +1 -0
- package/dist/list-Br6Cmi9S.cjs +95 -0
- package/dist/list-Br6Cmi9S.cjs.map +1 -0
- package/dist/list-BsYYq9wT.mjs +40 -0
- package/dist/list-BsYYq9wT.mjs.map +1 -0
- package/dist/list-BwfpuhmJ.cjs +37 -0
- package/dist/list-BwfpuhmJ.cjs.map +1 -0
- package/dist/list-BzLraBnA.cjs +82 -0
- package/dist/list-BzLraBnA.cjs.map +1 -0
- package/dist/list-CFwW0G9f.cjs +49 -0
- package/dist/list-CFwW0G9f.cjs.map +1 -0
- package/dist/list-CU42ERNY.cjs +81 -0
- package/dist/list-CU42ERNY.cjs.map +1 -0
- package/dist/list-CbvEh7eA.mjs +35 -0
- package/dist/list-CbvEh7eA.mjs.map +1 -0
- package/dist/list-D0-QrWmn.cjs +51 -0
- package/dist/list-D0-QrWmn.cjs.map +1 -0
- package/dist/list-D5PSDMWw.mjs +51 -0
- package/dist/list-D5PSDMWw.mjs.map +1 -0
- package/dist/list-DexBclfb.cjs +72 -0
- package/dist/list-DexBclfb.cjs.map +1 -0
- package/dist/list-DlJssPwy.cjs +48 -0
- package/dist/list-DlJssPwy.cjs.map +1 -0
- package/dist/list-DrZYlidZ.mjs +72 -0
- package/dist/list-DrZYlidZ.mjs.map +1 -0
- package/dist/list-ocfd7631.mjs +49 -0
- package/dist/list-ocfd7631.mjs.map +1 -0
- package/dist/list-rAn3uOA7.mjs +37 -0
- package/dist/list-rAn3uOA7.mjs.map +1 -0
- package/dist/list-sQk00GV5.mjs +95 -0
- package/dist/list-sQk00GV5.mjs.map +1 -0
- package/dist/list-vbMaOiza.mjs +82 -0
- package/dist/list-vbMaOiza.mjs.map +1 -0
- package/dist/login-2XcHd4wn.cjs +212 -0
- package/dist/login-2XcHd4wn.cjs.map +1 -0
- package/dist/login-FE_dbWMo.mjs +211 -0
- package/dist/login-FE_dbWMo.mjs.map +1 -0
- package/dist/logout-BDbWrGBm.mjs +35 -0
- package/dist/logout-BDbWrGBm.mjs.map +1 -0
- package/dist/logout-DC5TMJ5_.cjs +35 -0
- package/dist/logout-DC5TMJ5_.cjs.map +1 -0
- package/dist/management-BGYcZB4c.cjs +19 -0
- package/dist/management-BGYcZB4c.cjs.map +1 -0
- package/dist/management-DDACMgbU.mjs +19 -0
- package/dist/management-DDACMgbU.mjs.map +1 -0
- package/dist/mask-B1qD73jb.mjs +22 -0
- package/dist/mask-B1qD73jb.mjs.map +1 -0
- package/dist/mask-CqYLib9p.cjs +40 -0
- package/dist/mask-CqYLib9p.cjs.map +1 -0
- package/dist/oauth-client-CdD0evAV.cjs +170 -0
- package/dist/oauth-client-CdD0evAV.cjs.map +1 -0
- package/dist/oauth-client-QHuDa4fW.mjs +139 -0
- package/dist/oauth-client-QHuDa4fW.mjs.map +1 -0
- package/dist/object-DVqidsEc.cjs +20 -0
- package/dist/object-DVqidsEc.cjs.map +1 -0
- package/dist/object-qdBdEghr.mjs +20 -0
- package/dist/object-qdBdEghr.mjs.map +1 -0
- package/dist/org-C4cVovOM.cjs +14 -0
- package/dist/org-C4cVovOM.cjs.map +1 -0
- package/dist/org-CPhTRTks.mjs +14 -0
- package/dist/org-CPhTRTks.mjs.map +1 -0
- package/dist/org-context-Bewx2NEW.cjs +30 -0
- package/dist/org-context-Bewx2NEW.cjs.map +1 -0
- package/dist/org-context-D0dwWC2M.mjs +25 -0
- package/dist/org-context-D0dwWC2M.mjs.map +1 -0
- package/dist/parse-C8oHgQXx.cjs +229 -0
- package/dist/parse-C8oHgQXx.cjs.map +1 -0
- package/dist/parse-DA0k5AHa.mjs +150 -0
- package/dist/parse-DA0k5AHa.mjs.map +1 -0
- package/dist/project-BX7zvWB1.cjs +20 -0
- package/dist/project-BX7zvWB1.cjs.map +1 -0
- package/dist/project-CaXD3QBs.mjs +20 -0
- package/dist/project-CaXD3QBs.mjs.map +1 -0
- package/dist/project-name-CEoM-OL4.cjs +18 -0
- package/dist/project-name-CEoM-OL4.cjs.map +1 -0
- package/dist/project-name-DNMejnzZ.mjs +12 -0
- package/dist/project-name-DNMejnzZ.mjs.map +1 -0
- package/dist/project-user-Cp7i6orv.mjs +20 -0
- package/dist/project-user-Cp7i6orv.mjs.map +1 -0
- package/dist/project-user-Dm0qR-sh.cjs +20 -0
- package/dist/project-user-Dm0qR-sh.cjs.map +1 -0
- package/dist/push-0u6PDz4E.cjs +166 -0
- package/dist/push-0u6PDz4E.cjs.map +1 -0
- package/dist/push-D7co0keA.mjs +166 -0
- package/dist/push-D7co0keA.mjs.map +1 -0
- package/dist/run-codegen-Ceeosw5x.cjs +272 -0
- package/dist/run-codegen-Ceeosw5x.cjs.map +1 -0
- package/dist/run-codegen-DgaFaIQ1.mjs +190 -0
- package/dist/run-codegen-DgaFaIQ1.mjs.map +1 -0
- package/dist/run-with-context-CVhmzAFZ.mjs +876 -0
- package/dist/run-with-context-CVhmzAFZ.mjs.map +1 -0
- package/dist/run-with-context-DJNnEigg.cjs +943 -0
- package/dist/run-with-context-DJNnEigg.cjs.map +1 -0
- package/dist/schema-B3iRqvYK.cjs +20 -0
- package/dist/schema-B3iRqvYK.cjs.map +1 -0
- package/dist/schema-exG250MU.mjs +20 -0
- package/dist/schema-exG250MU.mjs.map +1 -0
- package/dist/shared-CZZimGxc.mjs +35 -0
- package/dist/shared-CZZimGxc.mjs.map +1 -0
- package/dist/shared-DHRPzzKl.cjs +59 -0
- package/dist/shared-DHRPzzKl.cjs.map +1 -0
- package/dist/status-Dq_NJE71.cjs +49 -0
- package/dist/status-Dq_NJE71.cjs.map +1 -0
- package/dist/status-fWqXzV0P.mjs +49 -0
- package/dist/status-fWqXzV0P.mjs.map +1 -0
- package/dist/table-C74eOSh8.cjs +27 -0
- package/dist/table-C74eOSh8.cjs.map +1 -0
- package/dist/table-MHEfbnWO.mjs +20 -0
- package/dist/table-MHEfbnWO.mjs.map +1 -0
- package/dist/table-event-C7gORNlb.mjs +72 -0
- package/dist/table-event-C7gORNlb.mjs.map +1 -0
- package/dist/table-event-DXkCK29f.cjs +101 -0
- package/dist/table-event-DXkCK29f.cjs.map +1 -0
- package/dist/token-store--9GYVL7N.cjs +139 -0
- package/dist/token-store--9GYVL7N.cjs.map +1 -0
- package/dist/token-store-reCGF86F.mjs +124 -0
- package/dist/token-store-reCGF86F.mjs.map +1 -0
- package/dist/update-B4lv4dAz.mjs +109 -0
- package/dist/update-B4lv4dAz.mjs.map +1 -0
- package/dist/update-BXhSosHG.cjs +171 -0
- package/dist/update-BXhSosHG.cjs.map +1 -0
- package/dist/update-CIH6sSVk.cjs +109 -0
- package/dist/update-CIH6sSVk.cjs.map +1 -0
- package/dist/update-CQ4n4Xuf.mjs +117 -0
- package/dist/update-CQ4n4Xuf.mjs.map +1 -0
- package/dist/update-CuPRoVw3.mjs +171 -0
- package/dist/update-CuPRoVw3.mjs.map +1 -0
- package/dist/update-Cx_2GkQj.cjs +61 -0
- package/dist/update-Cx_2GkQj.cjs.map +1 -0
- package/dist/update-DRnN1kiu.cjs +117 -0
- package/dist/update-DRnN1kiu.cjs.map +1 -0
- package/dist/update-Do9HHWzs.cjs +73 -0
- package/dist/update-Do9HHWzs.cjs.map +1 -0
- package/dist/update-mEmULIau.mjs +73 -0
- package/dist/update-mEmULIau.mjs.map +1 -0
- package/dist/update-rzij1b_o.mjs +61 -0
- package/dist/update-rzij1b_o.mjs.map +1 -0
- package/dist/upload-C43ZXxyb.cjs +95 -0
- package/dist/upload-C43ZXxyb.cjs.map +1 -0
- package/dist/upload-DGgJ1TQk.mjs +94 -0
- package/dist/upload-DGgJ1TQk.mjs.map +1 -0
- package/dist/validate-BpxZ8LTl.cjs +31 -0
- package/dist/validate-BpxZ8LTl.cjs.map +1 -0
- package/dist/validate-Ca0CRo16.mjs +31 -0
- package/dist/validate-Ca0CRo16.mjs.map +1 -0
- package/dist/webhook-CVFmch5W.cjs +20 -0
- package/dist/webhook-CVFmch5W.cjs.map +1 -0
- package/dist/webhook-Cy850dNs.mjs +20 -0
- package/dist/webhook-Cy850dNs.mjs.map +1 -0
- package/package.json +28 -17
- package/bin/index.js +0 -3
- package/dist/cli.cjs +0 -1978
- package/dist/cli.cjs.map +0 -1
- package/dist/cli.d.cts +0 -2
- package/dist/cli.d.ts +0 -2
- package/dist/cli.js +0 -1954
- package/dist/cli.js.map +0 -1
- package/dist/config/index.js +0 -81
- package/dist/config/index.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout-DC5TMJ5_.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"}
|
|
@@ -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-CFwW0G9f.cjs")).then((m) => m.default),
|
|
11
|
+
create: () => Promise.resolve().then(() => require("./create-CmOriwGo.cjs")).then((m) => m.default),
|
|
12
|
+
update: () => Promise.resolve().then(() => require("./update-DRnN1kiu.cjs")).then((m) => m.default),
|
|
13
|
+
delete: () => Promise.resolve().then(() => require("./delete-WpMIIvjj.cjs")).then((m) => m.default)
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
//#endregion
|
|
18
|
+
exports.default = management_default;
|
|
19
|
+
//# sourceMappingURL=management-BGYcZB4c.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"management-BGYcZB4c.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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { t as defineCommand } from "./cli/main.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/cli/commands/key/management/index.ts
|
|
4
|
+
var management_default = defineCommand({
|
|
5
|
+
meta: {
|
|
6
|
+
name: "management",
|
|
7
|
+
description: "Manage management keys (content CRUD with RBAC)"
|
|
8
|
+
},
|
|
9
|
+
subCommands: {
|
|
10
|
+
list: () => import("./list-ocfd7631.mjs").then((m) => m.default),
|
|
11
|
+
create: () => import("./create-B1ZBOqcV.mjs").then((m) => m.default),
|
|
12
|
+
update: () => import("./update-CQ4n4Xuf.mjs").then((m) => m.default),
|
|
13
|
+
delete: () => import("./delete-XWJRhBFs.mjs").then((m) => m.default)
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
//#endregion
|
|
18
|
+
export { management_default as default };
|
|
19
|
+
//# sourceMappingURL=management-DDACMgbU.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"management-DDACMgbU.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,22 @@
|
|
|
1
|
+
//#region src/cli/commands/key/mask.ts
|
|
2
|
+
const CONSUMER_KEY_PREFIX = "x_consumer_";
|
|
3
|
+
const MANAGEMENT_KEY_PREFIX = "x_management_";
|
|
4
|
+
function maskConsumerKey(key) {
|
|
5
|
+
return maskWithPrefix(key, CONSUMER_KEY_PREFIX);
|
|
6
|
+
}
|
|
7
|
+
function maskManagementKey(key) {
|
|
8
|
+
return maskWithPrefix(key, MANAGEMENT_KEY_PREFIX);
|
|
9
|
+
}
|
|
10
|
+
function maskWithPrefix(key, prefix) {
|
|
11
|
+
if (!key.startsWith(prefix)) return key.replace(/./g, "*");
|
|
12
|
+
return prefix + key.slice(prefix.length).replace(/./g, "*");
|
|
13
|
+
}
|
|
14
|
+
const showKeyArg = { "show-key": {
|
|
15
|
+
type: "boolean",
|
|
16
|
+
description: "Show key values in plaintext instead of masking them",
|
|
17
|
+
default: false
|
|
18
|
+
} };
|
|
19
|
+
|
|
20
|
+
//#endregion
|
|
21
|
+
export { maskManagementKey as n, showKeyArg as r, maskConsumerKey as t };
|
|
22
|
+
//# sourceMappingURL=mask-B1qD73jb.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mask-B1qD73jb.mjs","names":[],"sources":["../src/cli/commands/key/mask.ts"],"sourcesContent":["import type { ArgsDef } from \"citty\";\n\n// Orizm の key は発行後も API から常に平文で返る仕様だが、画面共有やログ転記での\n// 露出事故を防ぐため、--show-key が明示されない限りマスクして表示する。\n// 見せ方は apps/console の SecretTokenView (revealedPrefix + 残りを * 置換) に揃える。\nconst CONSUMER_KEY_PREFIX = \"x_consumer_\";\nconst MANAGEMENT_KEY_PREFIX = \"x_management_\";\n\nexport function maskConsumerKey(key: string): string {\n return maskWithPrefix(key, CONSUMER_KEY_PREFIX);\n}\n\nexport function maskManagementKey(key: string): string {\n return maskWithPrefix(key, MANAGEMENT_KEY_PREFIX);\n}\n\nfunction maskWithPrefix(key: string, prefix: string): string {\n // 想定外の形式の key で prefix.length 分を素通しすると本物の秘密文字が露出するため全マスク。\n if (!key.startsWith(prefix)) return key.replace(/./g, \"*\");\n return prefix + key.slice(prefix.length).replace(/./g, \"*\");\n}\n\nexport const showKeyArg = {\n \"show-key\": {\n type: \"boolean\",\n description: \"Show key values in plaintext instead of masking them\",\n default: false,\n },\n} satisfies ArgsDef;\n"],"mappings":";AAKA,MAAM,sBAAsB;AAC5B,MAAM,wBAAwB;AAE9B,SAAgB,gBAAgB,KAAqB;CACnD,OAAO,eAAe,KAAK,mBAAmB;AAChD;AAEA,SAAgB,kBAAkB,KAAqB;CACrD,OAAO,eAAe,KAAK,qBAAqB;AAClD;AAEA,SAAS,eAAe,KAAa,QAAwB;CAE3D,IAAI,CAAC,IAAI,WAAW,MAAM,GAAG,OAAO,IAAI,QAAQ,MAAM,GAAG;CACzD,OAAO,SAAS,IAAI,MAAM,OAAO,MAAM,CAAC,CAAC,QAAQ,MAAM,GAAG;AAC5D;AAEA,MAAa,aAAa,EACxB,YAAY;CACV,MAAM;CACN,aAAa;CACb,SAAS;AACX,EACF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/cli/commands/key/mask.ts
|
|
3
|
+
const CONSUMER_KEY_PREFIX = "x_consumer_";
|
|
4
|
+
const MANAGEMENT_KEY_PREFIX = "x_management_";
|
|
5
|
+
function maskConsumerKey(key) {
|
|
6
|
+
return maskWithPrefix(key, CONSUMER_KEY_PREFIX);
|
|
7
|
+
}
|
|
8
|
+
function maskManagementKey(key) {
|
|
9
|
+
return maskWithPrefix(key, MANAGEMENT_KEY_PREFIX);
|
|
10
|
+
}
|
|
11
|
+
function maskWithPrefix(key, prefix) {
|
|
12
|
+
if (!key.startsWith(prefix)) return key.replace(/./g, "*");
|
|
13
|
+
return prefix + key.slice(prefix.length).replace(/./g, "*");
|
|
14
|
+
}
|
|
15
|
+
const showKeyArg = { "show-key": {
|
|
16
|
+
type: "boolean",
|
|
17
|
+
description: "Show key values in plaintext instead of masking them",
|
|
18
|
+
default: false
|
|
19
|
+
} };
|
|
20
|
+
|
|
21
|
+
//#endregion
|
|
22
|
+
Object.defineProperty(exports, 'maskConsumerKey', {
|
|
23
|
+
enumerable: true,
|
|
24
|
+
get: function () {
|
|
25
|
+
return maskConsumerKey;
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
Object.defineProperty(exports, 'maskManagementKey', {
|
|
29
|
+
enumerable: true,
|
|
30
|
+
get: function () {
|
|
31
|
+
return maskManagementKey;
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
Object.defineProperty(exports, 'showKeyArg', {
|
|
35
|
+
enumerable: true,
|
|
36
|
+
get: function () {
|
|
37
|
+
return showKeyArg;
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
//# sourceMappingURL=mask-CqYLib9p.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mask-CqYLib9p.cjs","names":[],"sources":["../src/cli/commands/key/mask.ts"],"sourcesContent":["import type { ArgsDef } from \"citty\";\n\n// Orizm の key は発行後も API から常に平文で返る仕様だが、画面共有やログ転記での\n// 露出事故を防ぐため、--show-key が明示されない限りマスクして表示する。\n// 見せ方は apps/console の SecretTokenView (revealedPrefix + 残りを * 置換) に揃える。\nconst CONSUMER_KEY_PREFIX = \"x_consumer_\";\nconst MANAGEMENT_KEY_PREFIX = \"x_management_\";\n\nexport function maskConsumerKey(key: string): string {\n return maskWithPrefix(key, CONSUMER_KEY_PREFIX);\n}\n\nexport function maskManagementKey(key: string): string {\n return maskWithPrefix(key, MANAGEMENT_KEY_PREFIX);\n}\n\nfunction maskWithPrefix(key: string, prefix: string): string {\n // 想定外の形式の key で prefix.length 分を素通しすると本物の秘密文字が露出するため全マスク。\n if (!key.startsWith(prefix)) return key.replace(/./g, \"*\");\n return prefix + key.slice(prefix.length).replace(/./g, \"*\");\n}\n\nexport const showKeyArg = {\n \"show-key\": {\n type: \"boolean\",\n description: \"Show key values in plaintext instead of masking them\",\n default: false,\n },\n} satisfies ArgsDef;\n"],"mappings":";;AAKA,MAAM,sBAAsB;AAC5B,MAAM,wBAAwB;AAE9B,SAAgB,gBAAgB,KAAqB;CACnD,OAAO,eAAe,KAAK,mBAAmB;AAChD;AAEA,SAAgB,kBAAkB,KAAqB;CACrD,OAAO,eAAe,KAAK,qBAAqB;AAClD;AAEA,SAAS,eAAe,KAAa,QAAwB;CAE3D,IAAI,CAAC,IAAI,WAAW,MAAM,GAAG,OAAO,IAAI,QAAQ,MAAM,GAAG;CACzD,OAAO,SAAS,IAAI,MAAM,OAAO,MAAM,CAAC,CAAC,QAAQ,MAAM,GAAG;AAC5D;AAEA,MAAa,aAAa,EACxB,YAAY;CACV,MAAM;CACN,aAAa;CACb,SAAS;AACX,EACF"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
const require_cli_main = require('./cli/main.cjs');
|
|
2
|
+
let _praha_byethrow = require("@praha/byethrow");
|
|
3
|
+
let valibot = require("valibot");
|
|
4
|
+
valibot = require_cli_main.__toESM(valibot, 1);
|
|
5
|
+
let jose = require("jose");
|
|
6
|
+
|
|
7
|
+
//#region src/cli/auth/oauth-client.ts
|
|
8
|
+
const CLIENT_ID = "orizm-cli";
|
|
9
|
+
const SCOPES = [
|
|
10
|
+
"openid",
|
|
11
|
+
"offline_access",
|
|
12
|
+
"profile",
|
|
13
|
+
"email",
|
|
14
|
+
"content:read",
|
|
15
|
+
"content:write",
|
|
16
|
+
"schema:read",
|
|
17
|
+
"schema:write",
|
|
18
|
+
"project:read",
|
|
19
|
+
"project:write",
|
|
20
|
+
"project-users:read",
|
|
21
|
+
"project-users:write",
|
|
22
|
+
"api-keys:read",
|
|
23
|
+
"api-keys:write",
|
|
24
|
+
"organization:read",
|
|
25
|
+
"organization:write",
|
|
26
|
+
"profile:write",
|
|
27
|
+
"invitation:read",
|
|
28
|
+
"invitation:write"
|
|
29
|
+
];
|
|
30
|
+
function authorizationEndpoint(issuerUrl) {
|
|
31
|
+
return `${issuerUrl}/oauth2/auth`;
|
|
32
|
+
}
|
|
33
|
+
function tokenEndpoint(issuerUrl) {
|
|
34
|
+
return `${issuerUrl}/oauth2/token`;
|
|
35
|
+
}
|
|
36
|
+
function revocationEndpoint(issuerUrl) {
|
|
37
|
+
return `${issuerUrl}/oauth2/revoke`;
|
|
38
|
+
}
|
|
39
|
+
function jwksUri(issuerUrl) {
|
|
40
|
+
return `${issuerUrl}/.well-known/jwks.json`;
|
|
41
|
+
}
|
|
42
|
+
function buildAuthorizationUrl(params) {
|
|
43
|
+
const url = new URL(authorizationEndpoint(params.issuerUrl));
|
|
44
|
+
url.searchParams.set("response_type", "code");
|
|
45
|
+
url.searchParams.set("client_id", CLIENT_ID);
|
|
46
|
+
url.searchParams.set("redirect_uri", params.redirectUri);
|
|
47
|
+
url.searchParams.set("scope", SCOPES.join(" "));
|
|
48
|
+
url.searchParams.set("state", params.state);
|
|
49
|
+
url.searchParams.set("code_challenge", params.codeChallenge);
|
|
50
|
+
url.searchParams.set("code_challenge_method", params.codeChallengeMethod);
|
|
51
|
+
return url.toString();
|
|
52
|
+
}
|
|
53
|
+
const TokenResponseSchema = valibot.pipe(valibot.object({
|
|
54
|
+
access_token: valibot.string(),
|
|
55
|
+
refresh_token: valibot.string(),
|
|
56
|
+
id_token: valibot.string(),
|
|
57
|
+
expires_in: valibot.number(),
|
|
58
|
+
scope: valibot.string()
|
|
59
|
+
}), valibot.transform((raw) => ({
|
|
60
|
+
accessToken: raw.access_token,
|
|
61
|
+
refreshToken: raw.refresh_token,
|
|
62
|
+
idToken: raw.id_token,
|
|
63
|
+
scope: raw.scope,
|
|
64
|
+
expiresAt: new Date(Date.now() + raw.expires_in * 1e3).toISOString()
|
|
65
|
+
})));
|
|
66
|
+
const OAuthErrorSchema = valibot.object({
|
|
67
|
+
error: valibot.optional(valibot.string()),
|
|
68
|
+
error_description: valibot.optional(valibot.string())
|
|
69
|
+
});
|
|
70
|
+
async function postToken(issuerUrl, body) {
|
|
71
|
+
const response = await fetch(tokenEndpoint(issuerUrl), {
|
|
72
|
+
method: "POST",
|
|
73
|
+
headers: { "content-type": "application/x-www-form-urlencoded" },
|
|
74
|
+
body
|
|
75
|
+
});
|
|
76
|
+
if (response.status >= 500) throw new Error(`Token endpoint returned ${response.status}`);
|
|
77
|
+
const json = await response.json().catch(() => void 0);
|
|
78
|
+
if (!response.ok) {
|
|
79
|
+
const reason = extractOAuthError(json) ?? `HTTP ${response.status}`;
|
|
80
|
+
return _praha_byethrow.Result.fail({
|
|
81
|
+
type: "token_exchange_failed",
|
|
82
|
+
reason
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
const parsed = valibot.safeParse(TokenResponseSchema, json);
|
|
86
|
+
if (!parsed.success) return _praha_byethrow.Result.fail({
|
|
87
|
+
type: "token_exchange_failed",
|
|
88
|
+
reason: "Token endpoint returned an unexpected payload"
|
|
89
|
+
});
|
|
90
|
+
return _praha_byethrow.Result.succeed(parsed.output);
|
|
91
|
+
}
|
|
92
|
+
function exchangeCode(params) {
|
|
93
|
+
const body = new URLSearchParams({
|
|
94
|
+
grant_type: "authorization_code",
|
|
95
|
+
code: params.code,
|
|
96
|
+
redirect_uri: params.redirectUri,
|
|
97
|
+
client_id: CLIENT_ID,
|
|
98
|
+
code_verifier: params.codeVerifier
|
|
99
|
+
});
|
|
100
|
+
return postToken(params.issuerUrl, body);
|
|
101
|
+
}
|
|
102
|
+
function refreshTokens(params) {
|
|
103
|
+
const body = new URLSearchParams({
|
|
104
|
+
grant_type: "refresh_token",
|
|
105
|
+
refresh_token: params.refreshToken,
|
|
106
|
+
client_id: CLIENT_ID
|
|
107
|
+
});
|
|
108
|
+
return postToken(params.issuerUrl, body);
|
|
109
|
+
}
|
|
110
|
+
async function verifyIdToken(issuerUrl, idToken) {
|
|
111
|
+
const { payload } = await (0, jose.jwtVerify)(idToken, (0, jose.createRemoteJWKSet)(new URL(jwksUri(issuerUrl))), {
|
|
112
|
+
issuer: issuerUrl,
|
|
113
|
+
audience: CLIENT_ID
|
|
114
|
+
});
|
|
115
|
+
return {
|
|
116
|
+
subject: payload.sub ?? "",
|
|
117
|
+
name: typeof payload.name === "string" ? payload.name : void 0,
|
|
118
|
+
email: typeof payload.email === "string" ? payload.email : void 0
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
async function revokeToken(issuerUrl, refreshToken) {
|
|
122
|
+
await fetch(revocationEndpoint(issuerUrl), {
|
|
123
|
+
method: "POST",
|
|
124
|
+
headers: { "content-type": "application/x-www-form-urlencoded" },
|
|
125
|
+
body: new URLSearchParams({
|
|
126
|
+
token: refreshToken,
|
|
127
|
+
client_id: CLIENT_ID
|
|
128
|
+
})
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
function extractOAuthError(value) {
|
|
132
|
+
const parsed = valibot.safeParse(OAuthErrorSchema, value);
|
|
133
|
+
if (!parsed.success) return void 0;
|
|
134
|
+
const { error, error_description } = parsed.output;
|
|
135
|
+
if (error == null && error_description == null) return void 0;
|
|
136
|
+
return [error, error_description].filter((part) => part != null).join(": ");
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
//#endregion
|
|
140
|
+
Object.defineProperty(exports, 'buildAuthorizationUrl', {
|
|
141
|
+
enumerable: true,
|
|
142
|
+
get: function () {
|
|
143
|
+
return buildAuthorizationUrl;
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
Object.defineProperty(exports, 'exchangeCode', {
|
|
147
|
+
enumerable: true,
|
|
148
|
+
get: function () {
|
|
149
|
+
return exchangeCode;
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
Object.defineProperty(exports, 'refreshTokens', {
|
|
153
|
+
enumerable: true,
|
|
154
|
+
get: function () {
|
|
155
|
+
return refreshTokens;
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
Object.defineProperty(exports, 'revokeToken', {
|
|
159
|
+
enumerable: true,
|
|
160
|
+
get: function () {
|
|
161
|
+
return revokeToken;
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
Object.defineProperty(exports, 'verifyIdToken', {
|
|
165
|
+
enumerable: true,
|
|
166
|
+
get: function () {
|
|
167
|
+
return verifyIdToken;
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
//# sourceMappingURL=oauth-client-CdD0evAV.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-client-CdD0evAV.cjs","names":["v","Result"],"sources":["../src/cli/auth/oauth-client.ts"],"sourcesContent":["import { createRemoteJWKSet, jwtVerify } from \"jose\";\nimport { Result } from \"@praha/byethrow\";\nimport * as v from \"valibot\";\n\nexport const CLIENT_ID = \"orizm-cli\";\n\n// orizm-cli client にサーバー側で登録されたスコープの複製。サーバーの登録内容と\n// 完全に一致している必要があり、ずれると認可リクエストが拒否されるので両方を揃えて変更する。\nexport const SCOPES = [\n \"openid\",\n \"offline_access\",\n \"profile\",\n \"email\",\n \"content:read\",\n \"content:write\",\n \"schema:read\",\n \"schema:write\",\n \"project:read\",\n \"project:write\",\n \"project-users:read\",\n \"project-users:write\",\n \"api-keys:read\",\n \"api-keys:write\",\n \"organization:read\",\n \"organization:write\",\n \"profile:write\",\n \"invitation:read\",\n \"invitation:write\",\n] as const;\n\nexport type IdTokenClaims = {\n subject: string;\n name?: string;\n email?: string;\n};\n\nexport type TokenSet = {\n accessToken: string;\n refreshToken: string;\n idToken: string;\n scope: string;\n expiresAt: string;\n};\n\nexport type TokenExchangeError = {\n type: \"token_exchange_failed\";\n reason: string;\n};\n\nfunction authorizationEndpoint(issuerUrl: string): string {\n return `${issuerUrl}/oauth2/auth`;\n}\n\nfunction tokenEndpoint(issuerUrl: string): string {\n return `${issuerUrl}/oauth2/token`;\n}\n\nfunction revocationEndpoint(issuerUrl: string): string {\n return `${issuerUrl}/oauth2/revoke`;\n}\n\nfunction jwksUri(issuerUrl: string): string {\n return `${issuerUrl}/.well-known/jwks.json`;\n}\n\nexport function buildAuthorizationUrl(params: {\n issuerUrl: string;\n redirectUri: string;\n codeChallenge: string;\n codeChallengeMethod: string;\n state: string;\n}): string {\n const url = new URL(authorizationEndpoint(params.issuerUrl));\n url.searchParams.set(\"response_type\", \"code\");\n url.searchParams.set(\"client_id\", CLIENT_ID);\n url.searchParams.set(\"redirect_uri\", params.redirectUri);\n url.searchParams.set(\"scope\", SCOPES.join(\" \"));\n url.searchParams.set(\"state\", params.state);\n url.searchParams.set(\"code_challenge\", params.codeChallenge);\n url.searchParams.set(\"code_challenge_method\", params.codeChallengeMethod);\n return url.toString();\n}\n\nconst TokenResponseSchema = v.pipe(\n v.object({\n access_token: v.string(),\n refresh_token: v.string(),\n id_token: v.string(),\n expires_in: v.number(),\n scope: v.string(),\n }),\n v.transform(\n (raw): TokenSet => ({\n accessToken: raw.access_token,\n refreshToken: raw.refresh_token,\n idToken: raw.id_token,\n scope: raw.scope,\n expiresAt: new Date(Date.now() + raw.expires_in * 1000).toISOString(),\n }),\n ),\n);\n\nconst OAuthErrorSchema = v.object({\n error: v.optional(v.string()),\n error_description: v.optional(v.string()),\n});\n\n// 4xx は呼び出し側が分岐で扱える予測可能エラーなので Result.fail、\n// 回復しようのない 5xx / network は throw して上位の共通ハンドラに任せる。\nasync function postToken(\n issuerUrl: string,\n body: URLSearchParams,\n): Promise<Result.Result<TokenSet, TokenExchangeError>> {\n const response = await fetch(tokenEndpoint(issuerUrl), {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body,\n });\n\n if (response.status >= 500) {\n throw new Error(`Token endpoint returned ${response.status}`);\n }\n\n const json: unknown = await response.json().catch(() => undefined);\n\n if (!response.ok) {\n const reason = extractOAuthError(json) ?? `HTTP ${response.status}`;\n return Result.fail({ type: \"token_exchange_failed\", reason });\n }\n\n const parsed = v.safeParse(TokenResponseSchema, json);\n if (!parsed.success) {\n return Result.fail({\n type: \"token_exchange_failed\",\n reason: \"Token endpoint returned an unexpected payload\",\n });\n }\n\n return Result.succeed(parsed.output);\n}\n\nexport function exchangeCode(params: {\n issuerUrl: string;\n code: string;\n redirectUri: string;\n codeVerifier: string;\n}): Promise<Result.Result<TokenSet, TokenExchangeError>> {\n const body = new URLSearchParams({\n grant_type: \"authorization_code\",\n code: params.code,\n redirect_uri: params.redirectUri,\n client_id: CLIENT_ID,\n code_verifier: params.codeVerifier,\n });\n return postToken(params.issuerUrl, body);\n}\n\nexport function refreshTokens(params: {\n issuerUrl: string;\n refreshToken: string;\n}): Promise<Result.Result<TokenSet, TokenExchangeError>> {\n const body = new URLSearchParams({\n grant_type: \"refresh_token\",\n refresh_token: params.refreshToken,\n client_id: CLIENT_ID,\n });\n return postToken(params.issuerUrl, body);\n}\n\nexport async function verifyIdToken(\n issuerUrl: string,\n idToken: string,\n): Promise<IdTokenClaims> {\n const jwks = createRemoteJWKSet(new URL(jwksUri(issuerUrl)));\n const { payload } = await jwtVerify(idToken, jwks, {\n issuer: issuerUrl,\n audience: CLIENT_ID,\n });\n return {\n subject: payload.sub ?? \"\",\n name: typeof payload.name === \"string\" ? payload.name : undefined,\n email: typeof payload.email === \"string\" ? payload.email : undefined,\n };\n}\n\n// refresh_token を Hydra 側でも無効化する。失敗してもログアウト自体は成立させる(best-effort)。\nexport async function revokeToken(\n issuerUrl: string,\n refreshToken: string,\n): Promise<void> {\n await fetch(revocationEndpoint(issuerUrl), {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({ token: refreshToken, client_id: CLIENT_ID }),\n });\n}\n\nfunction extractOAuthError(value: unknown): string | undefined {\n const parsed = v.safeParse(OAuthErrorSchema, value);\n if (!parsed.success) return undefined;\n const { error, error_description } = parsed.output;\n if (error == null && error_description == null) return undefined;\n return [error, error_description].filter((part) => part != null).join(\": \");\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { Result } from "@praha/byethrow";
|
|
2
|
+
import * as v from "valibot";
|
|
3
|
+
import { createRemoteJWKSet, jwtVerify } from "jose";
|
|
4
|
+
|
|
5
|
+
//#region src/cli/auth/oauth-client.ts
|
|
6
|
+
const CLIENT_ID = "orizm-cli";
|
|
7
|
+
const SCOPES = [
|
|
8
|
+
"openid",
|
|
9
|
+
"offline_access",
|
|
10
|
+
"profile",
|
|
11
|
+
"email",
|
|
12
|
+
"content:read",
|
|
13
|
+
"content:write",
|
|
14
|
+
"schema:read",
|
|
15
|
+
"schema:write",
|
|
16
|
+
"project:read",
|
|
17
|
+
"project:write",
|
|
18
|
+
"project-users:read",
|
|
19
|
+
"project-users:write",
|
|
20
|
+
"api-keys:read",
|
|
21
|
+
"api-keys:write",
|
|
22
|
+
"organization:read",
|
|
23
|
+
"organization:write",
|
|
24
|
+
"profile:write",
|
|
25
|
+
"invitation:read",
|
|
26
|
+
"invitation:write"
|
|
27
|
+
];
|
|
28
|
+
function authorizationEndpoint(issuerUrl) {
|
|
29
|
+
return `${issuerUrl}/oauth2/auth`;
|
|
30
|
+
}
|
|
31
|
+
function tokenEndpoint(issuerUrl) {
|
|
32
|
+
return `${issuerUrl}/oauth2/token`;
|
|
33
|
+
}
|
|
34
|
+
function revocationEndpoint(issuerUrl) {
|
|
35
|
+
return `${issuerUrl}/oauth2/revoke`;
|
|
36
|
+
}
|
|
37
|
+
function jwksUri(issuerUrl) {
|
|
38
|
+
return `${issuerUrl}/.well-known/jwks.json`;
|
|
39
|
+
}
|
|
40
|
+
function buildAuthorizationUrl(params) {
|
|
41
|
+
const url = new URL(authorizationEndpoint(params.issuerUrl));
|
|
42
|
+
url.searchParams.set("response_type", "code");
|
|
43
|
+
url.searchParams.set("client_id", CLIENT_ID);
|
|
44
|
+
url.searchParams.set("redirect_uri", params.redirectUri);
|
|
45
|
+
url.searchParams.set("scope", SCOPES.join(" "));
|
|
46
|
+
url.searchParams.set("state", params.state);
|
|
47
|
+
url.searchParams.set("code_challenge", params.codeChallenge);
|
|
48
|
+
url.searchParams.set("code_challenge_method", params.codeChallengeMethod);
|
|
49
|
+
return url.toString();
|
|
50
|
+
}
|
|
51
|
+
const TokenResponseSchema = v.pipe(v.object({
|
|
52
|
+
access_token: v.string(),
|
|
53
|
+
refresh_token: v.string(),
|
|
54
|
+
id_token: v.string(),
|
|
55
|
+
expires_in: v.number(),
|
|
56
|
+
scope: v.string()
|
|
57
|
+
}), v.transform((raw) => ({
|
|
58
|
+
accessToken: raw.access_token,
|
|
59
|
+
refreshToken: raw.refresh_token,
|
|
60
|
+
idToken: raw.id_token,
|
|
61
|
+
scope: raw.scope,
|
|
62
|
+
expiresAt: new Date(Date.now() + raw.expires_in * 1e3).toISOString()
|
|
63
|
+
})));
|
|
64
|
+
const OAuthErrorSchema = v.object({
|
|
65
|
+
error: v.optional(v.string()),
|
|
66
|
+
error_description: v.optional(v.string())
|
|
67
|
+
});
|
|
68
|
+
async function postToken(issuerUrl, body) {
|
|
69
|
+
const response = await fetch(tokenEndpoint(issuerUrl), {
|
|
70
|
+
method: "POST",
|
|
71
|
+
headers: { "content-type": "application/x-www-form-urlencoded" },
|
|
72
|
+
body
|
|
73
|
+
});
|
|
74
|
+
if (response.status >= 500) throw new Error(`Token endpoint returned ${response.status}`);
|
|
75
|
+
const json = await response.json().catch(() => void 0);
|
|
76
|
+
if (!response.ok) {
|
|
77
|
+
const reason = extractOAuthError(json) ?? `HTTP ${response.status}`;
|
|
78
|
+
return Result.fail({
|
|
79
|
+
type: "token_exchange_failed",
|
|
80
|
+
reason
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
const parsed = v.safeParse(TokenResponseSchema, json);
|
|
84
|
+
if (!parsed.success) return Result.fail({
|
|
85
|
+
type: "token_exchange_failed",
|
|
86
|
+
reason: "Token endpoint returned an unexpected payload"
|
|
87
|
+
});
|
|
88
|
+
return Result.succeed(parsed.output);
|
|
89
|
+
}
|
|
90
|
+
function exchangeCode(params) {
|
|
91
|
+
const body = new URLSearchParams({
|
|
92
|
+
grant_type: "authorization_code",
|
|
93
|
+
code: params.code,
|
|
94
|
+
redirect_uri: params.redirectUri,
|
|
95
|
+
client_id: CLIENT_ID,
|
|
96
|
+
code_verifier: params.codeVerifier
|
|
97
|
+
});
|
|
98
|
+
return postToken(params.issuerUrl, body);
|
|
99
|
+
}
|
|
100
|
+
function refreshTokens(params) {
|
|
101
|
+
const body = new URLSearchParams({
|
|
102
|
+
grant_type: "refresh_token",
|
|
103
|
+
refresh_token: params.refreshToken,
|
|
104
|
+
client_id: CLIENT_ID
|
|
105
|
+
});
|
|
106
|
+
return postToken(params.issuerUrl, body);
|
|
107
|
+
}
|
|
108
|
+
async function verifyIdToken(issuerUrl, idToken) {
|
|
109
|
+
const { payload } = await jwtVerify(idToken, createRemoteJWKSet(new URL(jwksUri(issuerUrl))), {
|
|
110
|
+
issuer: issuerUrl,
|
|
111
|
+
audience: CLIENT_ID
|
|
112
|
+
});
|
|
113
|
+
return {
|
|
114
|
+
subject: payload.sub ?? "",
|
|
115
|
+
name: typeof payload.name === "string" ? payload.name : void 0,
|
|
116
|
+
email: typeof payload.email === "string" ? payload.email : void 0
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
async function revokeToken(issuerUrl, refreshToken) {
|
|
120
|
+
await fetch(revocationEndpoint(issuerUrl), {
|
|
121
|
+
method: "POST",
|
|
122
|
+
headers: { "content-type": "application/x-www-form-urlencoded" },
|
|
123
|
+
body: new URLSearchParams({
|
|
124
|
+
token: refreshToken,
|
|
125
|
+
client_id: CLIENT_ID
|
|
126
|
+
})
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
function extractOAuthError(value) {
|
|
130
|
+
const parsed = v.safeParse(OAuthErrorSchema, value);
|
|
131
|
+
if (!parsed.success) return void 0;
|
|
132
|
+
const { error, error_description } = parsed.output;
|
|
133
|
+
if (error == null && error_description == null) return void 0;
|
|
134
|
+
return [error, error_description].filter((part) => part != null).join(": ");
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
//#endregion
|
|
138
|
+
export { verifyIdToken as a, revokeToken as i, exchangeCode as n, refreshTokens as r, buildAuthorizationUrl as t };
|
|
139
|
+
//# sourceMappingURL=oauth-client-QHuDa4fW.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-client-QHuDa4fW.mjs","names":[],"sources":["../src/cli/auth/oauth-client.ts"],"sourcesContent":["import { createRemoteJWKSet, jwtVerify } from \"jose\";\nimport { Result } from \"@praha/byethrow\";\nimport * as v from \"valibot\";\n\nexport const CLIENT_ID = \"orizm-cli\";\n\n// orizm-cli client にサーバー側で登録されたスコープの複製。サーバーの登録内容と\n// 完全に一致している必要があり、ずれると認可リクエストが拒否されるので両方を揃えて変更する。\nexport const SCOPES = [\n \"openid\",\n \"offline_access\",\n \"profile\",\n \"email\",\n \"content:read\",\n \"content:write\",\n \"schema:read\",\n \"schema:write\",\n \"project:read\",\n \"project:write\",\n \"project-users:read\",\n \"project-users:write\",\n \"api-keys:read\",\n \"api-keys:write\",\n \"organization:read\",\n \"organization:write\",\n \"profile:write\",\n \"invitation:read\",\n \"invitation:write\",\n] as const;\n\nexport type IdTokenClaims = {\n subject: string;\n name?: string;\n email?: string;\n};\n\nexport type TokenSet = {\n accessToken: string;\n refreshToken: string;\n idToken: string;\n scope: string;\n expiresAt: string;\n};\n\nexport type TokenExchangeError = {\n type: \"token_exchange_failed\";\n reason: string;\n};\n\nfunction authorizationEndpoint(issuerUrl: string): string {\n return `${issuerUrl}/oauth2/auth`;\n}\n\nfunction tokenEndpoint(issuerUrl: string): string {\n return `${issuerUrl}/oauth2/token`;\n}\n\nfunction revocationEndpoint(issuerUrl: string): string {\n return `${issuerUrl}/oauth2/revoke`;\n}\n\nfunction jwksUri(issuerUrl: string): string {\n return `${issuerUrl}/.well-known/jwks.json`;\n}\n\nexport function buildAuthorizationUrl(params: {\n issuerUrl: string;\n redirectUri: string;\n codeChallenge: string;\n codeChallengeMethod: string;\n state: string;\n}): string {\n const url = new URL(authorizationEndpoint(params.issuerUrl));\n url.searchParams.set(\"response_type\", \"code\");\n url.searchParams.set(\"client_id\", CLIENT_ID);\n url.searchParams.set(\"redirect_uri\", params.redirectUri);\n url.searchParams.set(\"scope\", SCOPES.join(\" \"));\n url.searchParams.set(\"state\", params.state);\n url.searchParams.set(\"code_challenge\", params.codeChallenge);\n url.searchParams.set(\"code_challenge_method\", params.codeChallengeMethod);\n return url.toString();\n}\n\nconst TokenResponseSchema = v.pipe(\n v.object({\n access_token: v.string(),\n refresh_token: v.string(),\n id_token: v.string(),\n expires_in: v.number(),\n scope: v.string(),\n }),\n v.transform(\n (raw): TokenSet => ({\n accessToken: raw.access_token,\n refreshToken: raw.refresh_token,\n idToken: raw.id_token,\n scope: raw.scope,\n expiresAt: new Date(Date.now() + raw.expires_in * 1000).toISOString(),\n }),\n ),\n);\n\nconst OAuthErrorSchema = v.object({\n error: v.optional(v.string()),\n error_description: v.optional(v.string()),\n});\n\n// 4xx は呼び出し側が分岐で扱える予測可能エラーなので Result.fail、\n// 回復しようのない 5xx / network は throw して上位の共通ハンドラに任せる。\nasync function postToken(\n issuerUrl: string,\n body: URLSearchParams,\n): Promise<Result.Result<TokenSet, TokenExchangeError>> {\n const response = await fetch(tokenEndpoint(issuerUrl), {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body,\n });\n\n if (response.status >= 500) {\n throw new Error(`Token endpoint returned ${response.status}`);\n }\n\n const json: unknown = await response.json().catch(() => undefined);\n\n if (!response.ok) {\n const reason = extractOAuthError(json) ?? `HTTP ${response.status}`;\n return Result.fail({ type: \"token_exchange_failed\", reason });\n }\n\n const parsed = v.safeParse(TokenResponseSchema, json);\n if (!parsed.success) {\n return Result.fail({\n type: \"token_exchange_failed\",\n reason: \"Token endpoint returned an unexpected payload\",\n });\n }\n\n return Result.succeed(parsed.output);\n}\n\nexport function exchangeCode(params: {\n issuerUrl: string;\n code: string;\n redirectUri: string;\n codeVerifier: string;\n}): Promise<Result.Result<TokenSet, TokenExchangeError>> {\n const body = new URLSearchParams({\n grant_type: \"authorization_code\",\n code: params.code,\n redirect_uri: params.redirectUri,\n client_id: CLIENT_ID,\n code_verifier: params.codeVerifier,\n });\n return postToken(params.issuerUrl, body);\n}\n\nexport function refreshTokens(params: {\n issuerUrl: string;\n refreshToken: string;\n}): Promise<Result.Result<TokenSet, TokenExchangeError>> {\n const body = new URLSearchParams({\n grant_type: \"refresh_token\",\n refresh_token: params.refreshToken,\n client_id: CLIENT_ID,\n });\n return postToken(params.issuerUrl, body);\n}\n\nexport async function verifyIdToken(\n issuerUrl: string,\n idToken: string,\n): Promise<IdTokenClaims> {\n const jwks = createRemoteJWKSet(new URL(jwksUri(issuerUrl)));\n const { payload } = await jwtVerify(idToken, jwks, {\n issuer: issuerUrl,\n audience: CLIENT_ID,\n });\n return {\n subject: payload.sub ?? \"\",\n name: typeof payload.name === \"string\" ? payload.name : undefined,\n email: typeof payload.email === \"string\" ? payload.email : undefined,\n };\n}\n\n// refresh_token を Hydra 側でも無効化する。失敗してもログアウト自体は成立させる(best-effort)。\nexport async function revokeToken(\n issuerUrl: string,\n refreshToken: string,\n): Promise<void> {\n await fetch(revocationEndpoint(issuerUrl), {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({ token: refreshToken, client_id: CLIENT_ID }),\n });\n}\n\nfunction extractOAuthError(value: unknown): string | undefined {\n const parsed = v.safeParse(OAuthErrorSchema, value);\n if (!parsed.success) return undefined;\n const { error, error_description } = parsed.output;\n if (error == null && error_description == null) return undefined;\n return [error, error_description].filter((part) => part != null).join(\": \");\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const require_cli_main = require('./cli/main.cjs');
|
|
2
|
+
|
|
3
|
+
//#region src/cli/commands/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-BzLraBnA.cjs")).then((m) => m.default),
|
|
11
|
+
get: () => Promise.resolve().then(() => require("./get-jwXRlIBJ.cjs")).then((m) => m.default),
|
|
12
|
+
upload: () => Promise.resolve().then(() => require("./upload-C43ZXxyb.cjs")).then((m) => m.default),
|
|
13
|
+
download: () => Promise.resolve().then(() => require("./download-ogGbb3FU.cjs")).then((m) => m.default),
|
|
14
|
+
delete: () => Promise.resolve().then(() => require("./delete-DozSxZQ7.cjs")).then((m) => m.default)
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
//#endregion
|
|
19
|
+
exports.default = object_default;
|
|
20
|
+
//# sourceMappingURL=object-DVqidsEc.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object-DVqidsEc.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-vbMaOiza.mjs").then((m) => m.default),
|
|
11
|
+
get: () => import("./get-DBxhbN1G.mjs").then((m) => m.default),
|
|
12
|
+
upload: () => import("./upload-DGgJ1TQk.mjs").then((m) => m.default),
|
|
13
|
+
download: () => import("./download-oFGzg30E.mjs").then((m) => m.default),
|
|
14
|
+
delete: () => import("./delete-BSLIXrAh.mjs").then((m) => m.default)
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
//#endregion
|
|
19
|
+
export { object_default as default };
|
|
20
|
+
//# sourceMappingURL=object-qdBdEghr.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object-qdBdEghr.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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const require_cli_main = require('./cli/main.cjs');
|
|
2
|
+
|
|
3
|
+
//#region src/cli/commands/org/index.ts
|
|
4
|
+
var org_default = require_cli_main.defineCommand({
|
|
5
|
+
meta: {
|
|
6
|
+
name: "org",
|
|
7
|
+
description: "Work with organizations"
|
|
8
|
+
},
|
|
9
|
+
subCommands: { list: () => Promise.resolve().then(() => require("./list-BRh59EqI.cjs")).then((m) => m.default) }
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
//#endregion
|
|
13
|
+
exports.default = org_default;
|
|
14
|
+
//# sourceMappingURL=org-C4cVovOM.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"org-C4cVovOM.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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { t as defineCommand } from "./cli/main.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/cli/commands/org/index.ts
|
|
4
|
+
var org_default = defineCommand({
|
|
5
|
+
meta: {
|
|
6
|
+
name: "org",
|
|
7
|
+
description: "Work with organizations"
|
|
8
|
+
},
|
|
9
|
+
subCommands: { list: () => import("./list-CbvEh7eA.mjs").then((m) => m.default) }
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
//#endregion
|
|
13
|
+
export { org_default as default };
|
|
14
|
+
//# sourceMappingURL=org-CPhTRTks.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"org-CPhTRTks.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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
const require_run_with_context = require('./run-with-context-DJNnEigg.cjs');
|
|
2
|
+
let _praha_byethrow = require("@praha/byethrow");
|
|
3
|
+
|
|
4
|
+
//#region src/cli/commands/org-context.ts
|
|
5
|
+
async function resolveOrganizationIdFromArgs(params) {
|
|
6
|
+
const name = await require_run_with_context.resolveOrganizationName({
|
|
7
|
+
flag: params.flag,
|
|
8
|
+
cwd: params.cwd
|
|
9
|
+
});
|
|
10
|
+
if (_praha_byethrow.Result.isFailure(name)) switch (name.error.type) {
|
|
11
|
+
case "project_json_invalid": return _praha_byethrow.Result.fail({ message: `Invalid project file: ${name.error.path}` });
|
|
12
|
+
case "no_project_context":
|
|
13
|
+
case "no_organization_context": return _praha_byethrow.Result.fail({ message: "No organization selected. Run `orizm link` or pass --organization <name>." });
|
|
14
|
+
}
|
|
15
|
+
const id = await require_run_with_context.resolveOrganizationId(params.client, name.value);
|
|
16
|
+
if (_praha_byethrow.Result.isFailure(id)) {
|
|
17
|
+
if (id.error.type === "organization_not_found") return _praha_byethrow.Result.fail({ message: `Organization not found: ${id.error.name}` });
|
|
18
|
+
return require_run_with_context.apiErrorFailure(id.error);
|
|
19
|
+
}
|
|
20
|
+
return _praha_byethrow.Result.succeed(id.value);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
//#endregion
|
|
24
|
+
Object.defineProperty(exports, 'resolveOrganizationIdFromArgs', {
|
|
25
|
+
enumerable: true,
|
|
26
|
+
get: function () {
|
|
27
|
+
return resolveOrganizationIdFromArgs;
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=org-context-Bewx2NEW.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"org-context-Bewx2NEW.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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { a as apiErrorFailure, d as resolveOrganizationName, l as resolveOrganizationId } from "./run-with-context-CVhmzAFZ.mjs";
|
|
2
|
+
import { Result } from "@praha/byethrow";
|
|
3
|
+
|
|
4
|
+
//#region src/cli/commands/org-context.ts
|
|
5
|
+
async function resolveOrganizationIdFromArgs(params) {
|
|
6
|
+
const name = await resolveOrganizationName({
|
|
7
|
+
flag: params.flag,
|
|
8
|
+
cwd: params.cwd
|
|
9
|
+
});
|
|
10
|
+
if (Result.isFailure(name)) switch (name.error.type) {
|
|
11
|
+
case "project_json_invalid": return Result.fail({ message: `Invalid project file: ${name.error.path}` });
|
|
12
|
+
case "no_project_context":
|
|
13
|
+
case "no_organization_context": return Result.fail({ message: "No organization selected. Run `orizm link` or pass --organization <name>." });
|
|
14
|
+
}
|
|
15
|
+
const id = await resolveOrganizationId(params.client, name.value);
|
|
16
|
+
if (Result.isFailure(id)) {
|
|
17
|
+
if (id.error.type === "organization_not_found") return Result.fail({ message: `Organization not found: ${id.error.name}` });
|
|
18
|
+
return apiErrorFailure(id.error);
|
|
19
|
+
}
|
|
20
|
+
return Result.succeed(id.value);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
//#endregion
|
|
24
|
+
export { resolveOrganizationIdFromArgs as t };
|
|
25
|
+
//# sourceMappingURL=org-context-D0dwWC2M.mjs.map
|