@orizm/cli 2.2.7 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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-6d3VNt1D.mjs +17 -0
- package/dist/bucket-6d3VNt1D.mjs.map +1 -0
- package/dist/bucket-DjbHz9_A.cjs +17 -0
- package/dist/bucket-DjbHz9_A.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 -27
- 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-BBsH8b1j.cjs +18 -0
- package/dist/consumer-BBsH8b1j.cjs.map +1 -0
- package/dist/consumer-DqyRfpsl.mjs +18 -0
- package/dist/consumer-DqyRfpsl.mjs.map +1 -0
- package/dist/consumer-OF6Z_eTP.cjs +95 -0
- package/dist/consumer-OF6Z_eTP.cjs.map +1 -0
- package/dist/consumer-pU2HyiyA.mjs +95 -0
- package/dist/consumer-pU2HyiyA.mjs.map +1 -0
- package/dist/content-BsoRmjis.mjs +20 -0
- package/dist/content-BsoRmjis.mjs.map +1 -0
- package/dist/content-Y-2Y0cyn.cjs +20 -0
- package/dist/content-Y-2Y0cyn.cjs.map +1 -0
- package/dist/create--1NYduI_.cjs +58 -0
- package/dist/create--1NYduI_.cjs.map +1 -0
- package/dist/create-B-PAOor6.mjs +66 -0
- package/dist/create-B-PAOor6.mjs.map +1 -0
- package/dist/create-BNYWcyuQ.cjs +66 -0
- package/dist/create-BNYWcyuQ.cjs.map +1 -0
- package/dist/create-B_gsZCL-.cjs +54 -0
- package/dist/create-B_gsZCL-.cjs.map +1 -0
- package/dist/create-BqlxdhcR.mjs +81 -0
- package/dist/create-BqlxdhcR.mjs.map +1 -0
- package/dist/create-CC814ixh.mjs +66 -0
- package/dist/create-CC814ixh.mjs.map +1 -0
- package/dist/create-CkFBiEDH.mjs +58 -0
- package/dist/create-CkFBiEDH.mjs.map +1 -0
- package/dist/create-CykRHseR.cjs +81 -0
- package/dist/create-CykRHseR.cjs.map +1 -0
- package/dist/create-RLyp_dl6.mjs +54 -0
- package/dist/create-RLyp_dl6.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-BenBNL2p.mjs +56 -0
- package/dist/delete-BenBNL2p.mjs.map +1 -0
- package/dist/delete-Bx2oNROv.cjs +56 -0
- package/dist/delete-Bx2oNROv.cjs.map +1 -0
- package/dist/delete-CCTiCYIL.cjs +51 -0
- package/dist/delete-CCTiCYIL.cjs.map +1 -0
- package/dist/delete-CGW0VMK6.cjs +56 -0
- package/dist/delete-CGW0VMK6.cjs.map +1 -0
- package/dist/delete-CIYY59v_.cjs +48 -0
- package/dist/delete-CIYY59v_.cjs.map +1 -0
- package/dist/delete-CSSd0gmt.mjs +56 -0
- package/dist/delete-CSSd0gmt.mjs.map +1 -0
- package/dist/delete-CSs5Czlo.mjs +59 -0
- package/dist/delete-CSs5Czlo.mjs.map +1 -0
- package/dist/delete-CrOVRvMo.cjs +56 -0
- package/dist/delete-CrOVRvMo.cjs.map +1 -0
- package/dist/delete-DehKYCXh.mjs +56 -0
- package/dist/delete-DehKYCXh.mjs.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/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-BHniACk5.cjs +57 -0
- package/dist/get-BHniACk5.cjs.map +1 -0
- package/dist/get-BtmzDaVn.mjs +47 -0
- package/dist/get-BtmzDaVn.mjs.map +1 -0
- package/dist/get-CVV3h6HR.cjs +47 -0
- package/dist/get-CVV3h6HR.cjs.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-DPGx1zU4.mjs +56 -0
- package/dist/get-DPGx1zU4.mjs.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-jwXRlIBJ.cjs +57 -0
- package/dist/get-jwXRlIBJ.cjs.map +1 -0
- package/dist/group-roles-BEEzLxPX.mjs +36 -0
- package/dist/group-roles-BEEzLxPX.mjs.map +1 -0
- package/dist/group-roles-Bl_mEodO.cjs +59 -0
- package/dist/group-roles-Bl_mEodO.cjs.map +1 -0
- package/dist/invite-DsOCKGTJ.mjs +66 -0
- package/dist/invite-DsOCKGTJ.mjs.map +1 -0
- package/dist/invite-Dts9uNQL.cjs +66 -0
- package/dist/invite-Dts9uNQL.cjs.map +1 -0
- package/dist/key-BogfSiz_.mjs +17 -0
- package/dist/key-BogfSiz_.mjs.map +1 -0
- package/dist/key-Czwiu2pW.cjs +17 -0
- package/dist/key-Czwiu2pW.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-2BpPj4Z0.cjs +40 -0
- package/dist/list-2BpPj4Z0.cjs.map +1 -0
- package/dist/list-57TUfNFd.mjs +48 -0
- package/dist/list-57TUfNFd.mjs.map +1 -0
- package/dist/list-60NcDr0q.cjs +81 -0
- package/dist/list-60NcDr0q.cjs.map +1 -0
- package/dist/list-BRh59EqI.cjs +35 -0
- package/dist/list-BRh59EqI.cjs.map +1 -0
- package/dist/list-BwfpuhmJ.cjs +37 -0
- package/dist/list-BwfpuhmJ.cjs.map +1 -0
- package/dist/list-CJuefq_I.cjs +82 -0
- package/dist/list-CJuefq_I.cjs.map +1 -0
- package/dist/list-CYE9Exi3.cjs +72 -0
- package/dist/list-CYE9Exi3.cjs.map +1 -0
- package/dist/list-CbvEh7eA.mjs +35 -0
- package/dist/list-CbvEh7eA.mjs.map +1 -0
- package/dist/list-CfIeReBx.mjs +82 -0
- package/dist/list-CfIeReBx.mjs.map +1 -0
- package/dist/list-CxHDoXjv.mjs +81 -0
- package/dist/list-CxHDoXjv.mjs.map +1 -0
- package/dist/list-D0-QrWmn.cjs +51 -0
- package/dist/list-D0-QrWmn.cjs.map +1 -0
- package/dist/list-D24J_Qbm.mjs +49 -0
- package/dist/list-D24J_Qbm.mjs.map +1 -0
- package/dist/list-D5PSDMWw.mjs +51 -0
- package/dist/list-D5PSDMWw.mjs.map +1 -0
- package/dist/list-DRKF2uKW.cjs +95 -0
- package/dist/list-DRKF2uKW.cjs.map +1 -0
- package/dist/list-DdJ05juK.mjs +72 -0
- package/dist/list-DdJ05juK.mjs.map +1 -0
- package/dist/list-DlJssPwy.cjs +48 -0
- package/dist/list-DlJssPwy.cjs.map +1 -0
- package/dist/list-V3W6hvOa.cjs +49 -0
- package/dist/list-V3W6hvOa.cjs.map +1 -0
- package/dist/list-rAn3uOA7.mjs +37 -0
- package/dist/list-rAn3uOA7.mjs.map +1 -0
- package/dist/list-syVDGkVR.mjs +40 -0
- package/dist/list-syVDGkVR.mjs.map +1 -0
- package/dist/list-yQZLzkC7.mjs +95 -0
- package/dist/list-yQZLzkC7.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-BaN1Nynl.mjs +19 -0
- package/dist/management-BaN1Nynl.mjs.map +1 -0
- package/dist/management-DHXxdCra.cjs +19 -0
- package/dist/management-DHXxdCra.cjs.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-BfUf8Y6w.mjs +20 -0
- package/dist/object-BfUf8Y6w.mjs.map +1 -0
- package/dist/object-DT7UEW9G.cjs +20 -0
- package/dist/object-DT7UEW9G.cjs.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-BeO2IwfI.cjs +229 -0
- package/dist/parse-BeO2IwfI.cjs.map +1 -0
- package/dist/parse-CA5fBB3x.mjs +150 -0
- package/dist/parse-CA5fBB3x.mjs.map +1 -0
- package/dist/project-CNr9xMny.cjs +20 -0
- package/dist/project-CNr9xMny.cjs.map +1 -0
- package/dist/project-DFoHcXi5.mjs +20 -0
- package/dist/project-DFoHcXi5.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-9D7Ey_Fu.mjs +20 -0
- package/dist/project-user-9D7Ey_Fu.mjs.map +1 -0
- package/dist/project-user-DTPFjyfZ.cjs +20 -0
- package/dist/project-user-DTPFjyfZ.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-DDzrgjkT.mjs +20 -0
- package/dist/schema-DDzrgjkT.mjs.map +1 -0
- package/dist/schema-DdhyEh81.cjs +20 -0
- package/dist/schema-DdhyEh81.cjs.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-C16cp9nq.mjs +72 -0
- package/dist/table-event-C16cp9nq.mjs.map +1 -0
- package/dist/table-event-D7PPuS7E.cjs +101 -0
- package/dist/table-event-D7PPuS7E.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-8e3u4jKa.mjs +109 -0
- package/dist/update-8e3u4jKa.mjs.map +1 -0
- package/dist/update-CDLviRuu.cjs +73 -0
- package/dist/update-CDLviRuu.cjs.map +1 -0
- package/dist/update-CSiOfiPL.mjs +117 -0
- package/dist/update-CSiOfiPL.mjs.map +1 -0
- package/dist/update-CjbcI8Qc.mjs +61 -0
- package/dist/update-CjbcI8Qc.mjs.map +1 -0
- package/dist/update-Cktd0zXA.cjs +109 -0
- package/dist/update-Cktd0zXA.cjs.map +1 -0
- package/dist/update-D-X32BVW.cjs +117 -0
- package/dist/update-D-X32BVW.cjs.map +1 -0
- package/dist/update-DfYV_TQb.mjs +171 -0
- package/dist/update-DfYV_TQb.mjs.map +1 -0
- package/dist/update-OWC5K8Ne.cjs +61 -0
- package/dist/update-OWC5K8Ne.cjs.map +1 -0
- package/dist/update-ap5Qv1Yl.cjs +171 -0
- package/dist/update-ap5Qv1Yl.cjs.map +1 -0
- package/dist/update-yscrx6WQ.mjs +73 -0
- package/dist/update-yscrx6WQ.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-3zs6Ulxd.mjs +20 -0
- package/dist/webhook-3zs6Ulxd.mjs.map +1 -0
- package/dist/webhook-BsygMMf-.cjs +20 -0
- package/dist/webhook-BsygMMf-.cjs.map +1 -0
- package/package.json +27 -16
- 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":"update-DfYV_TQb.mjs","names":[],"sources":["../src/cli/commands/webhook/update.ts"],"sourcesContent":["import type { ArgsDef } from \"citty\";\nimport { Result } from \"@praha/byethrow\";\nimport {\n defineCommand,\n type CommandFailure,\n type CommandOutput,\n} from \"../define-command.js\";\nimport { contextArgs } from \"../shared.js\";\nimport { runWithContext, type CommandContext } from \"../run-with-context.js\";\nimport { apiErrorFailure } from \"../api-errors.js\";\nimport { toResult } from \"../../api/errors.js\";\nimport { renderDetail } from \"../../ui/detail.js\";\nimport {\n collectRepeatableFlag,\n parseHeaders,\n parseHttpUrl,\n parsePositionalId,\n parseRepeatableFlag,\n} from \"../parse.js\";\nimport {\n applyKeyedEdits,\n findDuplicateKey,\n resolveArrayUpdate,\n type ArrayUpdate,\n} from \"../array-update.js\";\nimport { warn } from \"../../ui/output.js\";\nimport { formatCustomHeaders } from \"./get.js\";\nimport {\n addTableEvents,\n formatTableEvents,\n missingTableEventRemovals,\n parseTableEvents,\n removeTableEvents,\n type TableEvent,\n} from \"./table-event.js\";\n\ntype CustomHeader = { key: string; value: string };\n\nexport function applyHeaderEdits(\n current: CustomHeader[],\n edits: { add: CustomHeader[]; remove: string[] },\n): CustomHeader[] {\n return applyKeyedEdits(current, edits, (header) => header.key);\n}\n\nexport async function webhookUpdateHandler(\n ctx: CommandContext,\n options: {\n webhookId: number;\n name?: string;\n url?: string;\n tableEvents: ArrayUpdate<TableEvent, TableEvent>;\n customHeaders: ArrayUpdate<CustomHeader, string>;\n },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n if (\n options.name === undefined &&\n options.url === undefined &&\n options.tableEvents === undefined &&\n options.customHeaders === undefined\n ) {\n return Result.fail({\n message:\n \"Nothing to update. Pass --name, --url, a --table-event option, or a --header option.\",\n });\n }\n\n // API は配列の全置換しか受けないため、要素単位の編集は現状を取得してインメモリで編集してから送る\n let currentTableEvents: TableEvent[] = [];\n let currentHeaders: CustomHeader[] = [];\n if (\n options.tableEvents?.mode === \"edit\" ||\n options.customHeaders?.mode === \"edit\"\n ) {\n const current = toResult(\n await ctx.client.GET(\"/projects/{projectName}/webhooks/{webhookId}\", {\n params: {\n path: { projectName: ctx.projectName, webhookId: options.webhookId },\n },\n }),\n );\n if (Result.isFailure(current)) return apiErrorFailure(current.error);\n currentTableEvents = current.value.tableEvents;\n currentHeaders = current.value.customHeaders;\n\n // 存在しない対象の remove は冪等に無視する (エラーにしない) が、タイポに気づけるよう通知は出す\n if (options.tableEvents?.mode === \"edit\") {\n for (const missing of missingTableEventRemovals(\n currentTableEvents,\n options.tableEvents.remove,\n )) {\n warn(`Subscription \"${missing}\" is not set; skipped removing it.`);\n }\n }\n if (options.customHeaders?.mode === \"edit\") {\n for (const key of options.customHeaders.remove) {\n if (!currentHeaders.some((header) => header.key === key)) {\n warn(`Header \"${key}\" is not set; skipped removing it.`);\n }\n }\n }\n }\n\n const body = {\n ...(options.name !== undefined ? { name: options.name } : {}),\n ...(options.url !== undefined ? { url: options.url } : {}),\n ...(options.tableEvents !== undefined\n ? {\n tableEvents:\n options.tableEvents.mode === \"replace\"\n ? options.tableEvents.items\n : addTableEvents(\n removeTableEvents(\n currentTableEvents,\n options.tableEvents.remove,\n ),\n options.tableEvents.add,\n ),\n }\n : {}),\n ...(options.customHeaders !== undefined\n ? {\n customHeaders:\n options.customHeaders.mode === \"replace\"\n ? options.customHeaders.items\n : applyHeaderEdits(currentHeaders, options.customHeaders),\n }\n : {}),\n };\n\n const updated = toResult(\n await ctx.client.PUT(\"/projects/{projectName}/webhooks/{webhookId}\", {\n params: {\n path: { projectName: ctx.projectName, webhookId: options.webhookId },\n },\n body,\n }),\n );\n if (Result.isFailure(updated)) return apiErrorFailure(updated.error);\n\n const value = updated.value;\n return Result.succeed({\n json: value,\n text: () =>\n renderDetail([\n [\"ID\", String(value.id)],\n [\"Name\", value.name],\n [\"URL\", value.url],\n [\"Table events\", formatTableEvents(value.tableEvents)],\n [\"Custom headers\", formatCustomHeaders(value.customHeaders)],\n [\"Updated at\", value.updatedAt],\n ]),\n });\n}\n\nconst updateArgs = {\n ...contextArgs,\n id: {\n type: \"positional\",\n required: true,\n description: \"Numeric webhook ID\",\n },\n name: {\n type: \"string\",\n description: \"New webhook name\",\n },\n url: {\n type: \"string\",\n description: \"New URL to notify\",\n },\n \"table-event\": {\n type: \"string\",\n description: \"Replace all subscriptions with <table>:<event>; repeatable\",\n },\n \"add-table-event\": {\n type: \"string\",\n description: \"Add a subscription as <table>:<event>; repeatable\",\n },\n \"remove-table-event\": {\n type: \"string\",\n description: \"Remove a subscription as <table>:<event>; repeatable\",\n },\n \"clear-table-events\": {\n type: \"boolean\",\n description: \"Remove all subscriptions\",\n default: false,\n },\n header: {\n type: \"string\",\n description: \"Replace all custom headers with <key>:<value>; repeatable\",\n },\n \"add-header\": {\n type: \"string\",\n description:\n \"Add or overwrite a custom header as <key>:<value>; repeatable\",\n },\n \"remove-header\": {\n type: \"string\",\n description: \"Remove a custom header by key; repeatable\",\n },\n \"clear-headers\": {\n type: \"boolean\",\n description: \"Remove all custom headers\",\n default: false,\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"update\",\n description: \"Update a webhook\",\n },\n args: updateArgs,\n run: async ({ args, rawArgs }) => {\n const webhookId = parsePositionalId(\"webhook ID\", args.id);\n if (Result.isFailure(webhookId)) return webhookId;\n\n const replaceTableEvents = parseTableEvents(\n \"table-event\",\n collectRepeatableFlag(rawArgs, \"table-event\"),\n );\n if (Result.isFailure(replaceTableEvents)) return replaceTableEvents;\n const addedTableEvents = parseTableEvents(\n \"add-table-event\",\n collectRepeatableFlag(rawArgs, \"add-table-event\"),\n );\n if (Result.isFailure(addedTableEvents)) return addedTableEvents;\n const removedTableEvents = parseTableEvents(\n \"remove-table-event\",\n collectRepeatableFlag(rawArgs, \"remove-table-event\"),\n );\n if (Result.isFailure(removedTableEvents)) return removedTableEvents;\n const tableEvents = resolveArrayUpdate({\n replaceFlag: \"table-event\",\n clearFlag: \"clear-table-events\",\n editFlags: \"--add-table-event / --remove-table-event\",\n replace: replaceTableEvents.value,\n add: addedTableEvents.value,\n remove: removedTableEvents.value,\n clear: args[\"clear-table-events\"] === true,\n });\n if (Result.isFailure(tableEvents)) return tableEvents;\n\n const replaceHeaders = parseHeaders(\n \"header\",\n collectRepeatableFlag(rawArgs, \"header\"),\n );\n if (Result.isFailure(replaceHeaders)) return replaceHeaders;\n const addedHeaders = parseHeaders(\n \"add-header\",\n collectRepeatableFlag(rawArgs, \"add-header\"),\n );\n if (Result.isFailure(addedHeaders)) return addedHeaders;\n // add は同一 key を上書きする規則のため、1 回の実行内で同じ key を複数指定されると意図が曖昧になり弾く\n const duplicateAddedKey = findDuplicateKey(\n addedHeaders.value ?? [],\n (header) => header.key,\n );\n if (duplicateAddedKey !== undefined) {\n return Result.fail({\n message: `Invalid --add-header: key \"${duplicateAddedKey}\" is specified multiple times.`,\n });\n }\n const removeHeaderValues = collectRepeatableFlag(rawArgs, \"remove-header\");\n const removedHeaderKeys =\n removeHeaderValues === undefined\n ? Result.succeed(undefined)\n : parseRepeatableFlag(\"remove-header\", removeHeaderValues);\n if (Result.isFailure(removedHeaderKeys)) return removedHeaderKeys;\n const customHeaders = resolveArrayUpdate({\n replaceFlag: \"header\",\n clearFlag: \"clear-headers\",\n editFlags: \"--add-header / --remove-header\",\n replace: replaceHeaders.value,\n add: addedHeaders.value,\n remove: removedHeaderKeys.value,\n clear: args[\"clear-headers\"] === true,\n });\n if (Result.isFailure(customHeaders)) return customHeaders;\n\n let url: string | undefined;\n if (typeof args.url === \"string\") {\n const parsedUrl = parseHttpUrl(\"url\", args.url);\n if (Result.isFailure(parsedUrl)) return parsedUrl;\n url = parsedUrl.value;\n }\n\n return runWithContext(args, (ctx) =>\n webhookUpdateHandler(ctx, {\n webhookId: webhookId.value,\n name: typeof args.name === \"string\" ? args.name : undefined,\n url,\n tableEvents: tableEvents.value,\n customHeaders: customHeaders.value,\n }),\n );\n },\n});\n"],"mappings":";;;;;;;;;;;AAsCA,SAAgB,iBACd,SACA,OACgB;CAChB,OAAO,gBAAgB,SAAS,QAAQ,WAAW,OAAO,GAAG;AAC/D;AAEA,eAAsB,qBACpB,KACA,SAOmE;CACnE,IACE,QAAQ,SAAS,UACjB,QAAQ,QAAQ,UAChB,QAAQ,gBAAgB,UACxB,QAAQ,kBAAkB,QAE1B,OAAO,OAAO,KAAK,EACjB,SACE,uFACJ,CAAC;CAIH,IAAI,qBAAmC,CAAC;CACxC,IAAI,iBAAiC,CAAC;CACtC,IACE,QAAQ,aAAa,SAAS,UAC9B,QAAQ,eAAe,SAAS,QAChC;EACA,MAAM,UAAU,SACd,MAAM,IAAI,OAAO,IAAI,gDAAgD,EACnE,QAAQ,EACN,MAAM;GAAE,aAAa,IAAI;GAAa,WAAW,QAAQ;EAAU,EACrE,EACF,CAAC,CACH;EACA,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO,gBAAgB,QAAQ,KAAK;EACnE,qBAAqB,QAAQ,MAAM;EACnC,iBAAiB,QAAQ,MAAM;EAG/B,IAAI,QAAQ,aAAa,SAAS,QAChC,KAAK,MAAM,WAAW,0BACpB,oBACA,QAAQ,YAAY,MACtB,GACE,KAAK,iBAAiB,QAAQ,mCAAmC;EAGrE,IAAI,QAAQ,eAAe,SAAS,QAClC;QAAK,MAAM,OAAO,QAAQ,cAAc,QACtC,IAAI,CAAC,eAAe,MAAM,WAAW,OAAO,QAAQ,GAAG,GACrD,KAAK,WAAW,IAAI,mCAAmC;EAE3D;CAEJ;CAEA,MAAM,OAAO;EACX,GAAI,QAAQ,SAAS,SAAY,EAAE,MAAM,QAAQ,KAAK,IAAI,CAAC;EAC3D,GAAI,QAAQ,QAAQ,SAAY,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC;EACxD,GAAI,QAAQ,gBAAgB,SACxB,EACE,aACE,QAAQ,YAAY,SAAS,YACzB,QAAQ,YAAY,QACpB,eACE,kBACE,oBACA,QAAQ,YAAY,MACtB,GACA,QAAQ,YAAY,GACtB,EACR,IACA,CAAC;EACL,GAAI,QAAQ,kBAAkB,SAC1B,EACE,eACE,QAAQ,cAAc,SAAS,YAC3B,QAAQ,cAAc,QACtB,iBAAiB,gBAAgB,QAAQ,aAAa,EAC9D,IACA,CAAC;CACP;CAEA,MAAM,UAAU,SACd,MAAM,IAAI,OAAO,IAAI,gDAAgD;EACnE,QAAQ,EACN,MAAM;GAAE,aAAa,IAAI;GAAa,WAAW,QAAQ;EAAU,EACrE;EACA;CACF,CAAC,CACH;CACA,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO,gBAAgB,QAAQ,KAAK;CAEnE,MAAM,QAAQ,QAAQ;CACtB,OAAO,OAAO,QAAQ;EACpB,MAAM;EACN,YACE,aAAa;GACX,CAAC,MAAM,OAAO,MAAM,EAAE,CAAC;GACvB,CAAC,QAAQ,MAAM,IAAI;GACnB,CAAC,OAAO,MAAM,GAAG;GACjB,CAAC,gBAAgB,kBAAkB,MAAM,WAAW,CAAC;GACrD,CAAC,kBAAkB,oBAAoB,MAAM,aAAa,CAAC;GAC3D,CAAC,cAAc,MAAM,SAAS;EAChC,CAAC;CACL,CAAC;AACH;AAEA,MAAM,aAAa;CACjB,GAAG;CACH,IAAI;EACF,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,KAAK;EACH,MAAM;EACN,aAAa;CACf;CACA,eAAe;EACb,MAAM;EACN,aAAa;CACf;CACA,mBAAmB;EACjB,MAAM;EACN,aAAa;CACf;CACA,sBAAsB;EACpB,MAAM;EACN,aAAa;CACf;CACA,sBAAsB;EACpB,MAAM;EACN,aAAa;EACb,SAAS;CACX;CACA,QAAQ;EACN,MAAM;EACN,aAAa;CACf;CACA,cAAc;EACZ,MAAM;EACN,aACE;CACJ;CACA,iBAAiB;EACf,MAAM;EACN,aAAa;CACf;CACA,iBAAiB;EACf,MAAM;EACN,aAAa;EACb,SAAS;CACX;AACF;AAEA,qBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,KAAK,OAAO,EAAE,MAAM,cAAc;EAChC,MAAM,YAAY,kBAAkB,cAAc,KAAK,EAAE;EACzD,IAAI,OAAO,UAAU,SAAS,GAAG,OAAO;EAExC,MAAM,qBAAqB,iBACzB,eACA,sBAAsB,SAAS,aAAa,CAC9C;EACA,IAAI,OAAO,UAAU,kBAAkB,GAAG,OAAO;EACjD,MAAM,mBAAmB,iBACvB,mBACA,sBAAsB,SAAS,iBAAiB,CAClD;EACA,IAAI,OAAO,UAAU,gBAAgB,GAAG,OAAO;EAC/C,MAAM,qBAAqB,iBACzB,sBACA,sBAAsB,SAAS,oBAAoB,CACrD;EACA,IAAI,OAAO,UAAU,kBAAkB,GAAG,OAAO;EACjD,MAAM,cAAc,mBAAmB;GACrC,aAAa;GACb,WAAW;GACX,WAAW;GACX,SAAS,mBAAmB;GAC5B,KAAK,iBAAiB;GACtB,QAAQ,mBAAmB;GAC3B,OAAO,KAAK,0BAA0B;EACxC,CAAC;EACD,IAAI,OAAO,UAAU,WAAW,GAAG,OAAO;EAE1C,MAAM,iBAAiB,aACrB,UACA,sBAAsB,SAAS,QAAQ,CACzC;EACA,IAAI,OAAO,UAAU,cAAc,GAAG,OAAO;EAC7C,MAAM,eAAe,aACnB,cACA,sBAAsB,SAAS,YAAY,CAC7C;EACA,IAAI,OAAO,UAAU,YAAY,GAAG,OAAO;EAE3C,MAAM,oBAAoB,iBACxB,aAAa,SAAS,CAAC,IACtB,WAAW,OAAO,GACrB;EACA,IAAI,sBAAsB,QACxB,OAAO,OAAO,KAAK,EACjB,SAAS,8BAA8B,kBAAkB,gCAC3D,CAAC;EAEH,MAAM,qBAAqB,sBAAsB,SAAS,eAAe;EACzE,MAAM,oBACJ,uBAAuB,SACnB,OAAO,QAAQ,MAAS,IACxB,oBAAoB,iBAAiB,kBAAkB;EAC7D,IAAI,OAAO,UAAU,iBAAiB,GAAG,OAAO;EAChD,MAAM,gBAAgB,mBAAmB;GACvC,aAAa;GACb,WAAW;GACX,WAAW;GACX,SAAS,eAAe;GACxB,KAAK,aAAa;GAClB,QAAQ,kBAAkB;GAC1B,OAAO,KAAK,qBAAqB;EACnC,CAAC;EACD,IAAI,OAAO,UAAU,aAAa,GAAG,OAAO;EAE5C,IAAI;EACJ,IAAI,OAAO,KAAK,QAAQ,UAAU;GAChC,MAAM,YAAY,aAAa,OAAO,KAAK,GAAG;GAC9C,IAAI,OAAO,UAAU,SAAS,GAAG,OAAO;GACxC,MAAM,UAAU;EAClB;EAEA,OAAO,eAAe,OAAO,QAC3B,qBAAqB,KAAK;GACxB,WAAW,UAAU;GACrB,MAAM,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;GAClD;GACA,aAAa,YAAY;GACzB,eAAe,cAAc;EAC/B,CAAC,CACH;CACF;AACF,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
const require_cli_main = require('./cli/main.cjs');
|
|
2
|
+
const require_shared = require('./shared-DHRPzzKl.cjs');
|
|
3
|
+
const require_run_with_context = require('./run-with-context-DJNnEigg.cjs');
|
|
4
|
+
const require_parse = require('./parse-BeO2IwfI.cjs');
|
|
5
|
+
let _praha_byethrow = require("@praha/byethrow");
|
|
6
|
+
|
|
7
|
+
//#region src/cli/commands/content/update.ts
|
|
8
|
+
async function contentUpdateHandler(ctx, options) {
|
|
9
|
+
const updated = require_run_with_context.toResult(await ctx.client.PUT("/projects/{projectName}/tables/{tableName}/{contentId}", {
|
|
10
|
+
params: { path: {
|
|
11
|
+
projectName: ctx.projectName,
|
|
12
|
+
tableName: options.table,
|
|
13
|
+
contentId: options.contentId
|
|
14
|
+
} },
|
|
15
|
+
body: options.data
|
|
16
|
+
}));
|
|
17
|
+
if (_praha_byethrow.Result.isFailure(updated)) return require_run_with_context.apiErrorFailure(updated.error);
|
|
18
|
+
const value = updated.value;
|
|
19
|
+
return _praha_byethrow.Result.succeed({
|
|
20
|
+
json: value,
|
|
21
|
+
text: () => JSON.stringify(value, null, 2)
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
const updateArgs = {
|
|
25
|
+
...require_shared.contextArgs,
|
|
26
|
+
table: {
|
|
27
|
+
type: "positional",
|
|
28
|
+
required: true,
|
|
29
|
+
description: "Table name"
|
|
30
|
+
},
|
|
31
|
+
id: {
|
|
32
|
+
type: "positional",
|
|
33
|
+
required: true,
|
|
34
|
+
description: "Content ID"
|
|
35
|
+
},
|
|
36
|
+
data: {
|
|
37
|
+
type: "string",
|
|
38
|
+
required: true,
|
|
39
|
+
description: "Content fields as a JSON object string or @path/to/file.json"
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
var update_default = require_cli_main.defineCommand({
|
|
43
|
+
meta: {
|
|
44
|
+
name: "update",
|
|
45
|
+
description: "Update a content"
|
|
46
|
+
},
|
|
47
|
+
args: updateArgs,
|
|
48
|
+
run: async ({ args }) => {
|
|
49
|
+
const data = await require_parse.parseDataOption(args.data);
|
|
50
|
+
if (_praha_byethrow.Result.isFailure(data)) return data;
|
|
51
|
+
return require_run_with_context.runWithContext(args, (ctx) => contentUpdateHandler(ctx, {
|
|
52
|
+
table: args.table,
|
|
53
|
+
contentId: args.id,
|
|
54
|
+
data: data.value
|
|
55
|
+
}));
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
//#endregion
|
|
60
|
+
exports.default = update_default;
|
|
61
|
+
//# sourceMappingURL=update-OWC5K8Ne.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-OWC5K8Ne.cjs","names":["toResult","Result","apiErrorFailure","contextArgs","defineCommand","parseDataOption","runWithContext"],"sources":["../src/cli/commands/content/update.ts"],"sourcesContent":["import type { ArgsDef } from \"citty\";\nimport { Result } from \"@praha/byethrow\";\nimport {\n defineCommand,\n type CommandFailure,\n type CommandOutput,\n} from \"../define-command.js\";\nimport { contextArgs } from \"../shared.js\";\nimport { runWithContext, type CommandContext } from \"../run-with-context.js\";\nimport { apiErrorFailure } from \"../api-errors.js\";\nimport { toResult } from \"../../api/errors.js\";\nimport { parseDataOption } from \"../parse.js\";\n\nexport async function contentUpdateHandler(\n ctx: CommandContext,\n options: { table: string; contentId: string; data: Record<string, unknown> },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const updated = toResult(\n await ctx.client.PUT(\n \"/projects/{projectName}/tables/{tableName}/{contentId}\",\n {\n params: {\n path: {\n projectName: ctx.projectName,\n tableName: options.table,\n contentId: options.contentId,\n },\n },\n body: options.data,\n },\n ),\n );\n if (Result.isFailure(updated)) return apiErrorFailure(updated.error);\n\n const value = updated.value;\n return Result.succeed({\n json: value,\n text: () => JSON.stringify(value, null, 2),\n });\n}\n\nconst updateArgs = {\n ...contextArgs,\n table: {\n type: \"positional\",\n required: true,\n description: \"Table name\",\n },\n id: {\n type: \"positional\",\n required: true,\n description: \"Content ID\",\n },\n data: {\n type: \"string\",\n required: true,\n description: \"Content fields as a JSON object string or @path/to/file.json\",\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"update\",\n description: \"Update a content\",\n },\n args: updateArgs,\n run: async ({ args }) => {\n const data = await parseDataOption(args.data);\n if (Result.isFailure(data)) return data;\n\n return runWithContext(args, (ctx) =>\n contentUpdateHandler(ctx, {\n table: args.table,\n contentId: args.id,\n data: data.value,\n }),\n );\n },\n});\n"],"mappings":";;;;;;;AAaA,eAAsB,qBACpB,KACA,SACmE;CACnE,MAAM,UAAUA,kCACd,MAAM,IAAI,OAAO,IACf,0DACA;EACE,QAAQ,EACN,MAAM;GACJ,aAAa,IAAI;GACjB,WAAW,QAAQ;GACnB,WAAW,QAAQ;EACrB,EACF;EACA,MAAM,QAAQ;CAChB,CACF,CACF;CACA,IAAIC,uBAAO,UAAU,OAAO,GAAG,OAAOC,yCAAgB,QAAQ,KAAK;CAEnE,MAAM,QAAQ,QAAQ;CACtB,OAAOD,uBAAO,QAAQ;EACpB,MAAM;EACN,YAAY,KAAK,UAAU,OAAO,MAAM,CAAC;CAC3C,CAAC;AACH;AAEA,MAAM,aAAa;CACjB,GAAGE;CACH,OAAO;EACL,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,IAAI;EACF,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,MAAM;EACJ,MAAM;EACN,UAAU;EACV,aAAa;CACf;AACF;AAEA,qBAAeC,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,KAAK,OAAO,EAAE,WAAW;EACvB,MAAM,OAAO,MAAMC,8BAAgB,KAAK,IAAI;EAC5C,IAAIJ,uBAAO,UAAU,IAAI,GAAG,OAAO;EAEnC,OAAOK,wCAAe,OAAO,QAC3B,qBAAqB,KAAK;GACxB,OAAO,KAAK;GACZ,WAAW,KAAK;GAChB,MAAM,KAAK;EACb,CAAC,CACH;CACF;AACF,CAAC"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
const require_cli_main = require('./cli/main.cjs');
|
|
2
|
+
const require_shared = require('./shared-DHRPzzKl.cjs');
|
|
3
|
+
const require_run_with_context = require('./run-with-context-DJNnEigg.cjs');
|
|
4
|
+
const require_detail = require('./detail-8CXNIhKw.cjs');
|
|
5
|
+
const require_parse = require('./parse-BeO2IwfI.cjs');
|
|
6
|
+
const require_array_update = require('./array-update-Dch4e9tI.cjs');
|
|
7
|
+
const require_table_event = require('./table-event-D7PPuS7E.cjs');
|
|
8
|
+
const require_get = require('./get-BHniACk5.cjs');
|
|
9
|
+
let _praha_byethrow = require("@praha/byethrow");
|
|
10
|
+
|
|
11
|
+
//#region src/cli/commands/webhook/update.ts
|
|
12
|
+
function applyHeaderEdits(current, edits) {
|
|
13
|
+
return require_array_update.applyKeyedEdits(current, edits, (header) => header.key);
|
|
14
|
+
}
|
|
15
|
+
async function webhookUpdateHandler(ctx, options) {
|
|
16
|
+
if (options.name === void 0 && options.url === void 0 && options.tableEvents === void 0 && options.customHeaders === void 0) return _praha_byethrow.Result.fail({ message: "Nothing to update. Pass --name, --url, a --table-event option, or a --header option." });
|
|
17
|
+
let currentTableEvents = [];
|
|
18
|
+
let currentHeaders = [];
|
|
19
|
+
if (options.tableEvents?.mode === "edit" || options.customHeaders?.mode === "edit") {
|
|
20
|
+
const current = require_run_with_context.toResult(await ctx.client.GET("/projects/{projectName}/webhooks/{webhookId}", { params: { path: {
|
|
21
|
+
projectName: ctx.projectName,
|
|
22
|
+
webhookId: options.webhookId
|
|
23
|
+
} } }));
|
|
24
|
+
if (_praha_byethrow.Result.isFailure(current)) return require_run_with_context.apiErrorFailure(current.error);
|
|
25
|
+
currentTableEvents = current.value.tableEvents;
|
|
26
|
+
currentHeaders = current.value.customHeaders;
|
|
27
|
+
if (options.tableEvents?.mode === "edit") for (const missing of require_table_event.missingTableEventRemovals(currentTableEvents, options.tableEvents.remove)) require_cli_main.warn(`Subscription "${missing}" is not set; skipped removing it.`);
|
|
28
|
+
if (options.customHeaders?.mode === "edit") {
|
|
29
|
+
for (const key of options.customHeaders.remove) if (!currentHeaders.some((header) => header.key === key)) require_cli_main.warn(`Header "${key}" is not set; skipped removing it.`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const body = {
|
|
33
|
+
...options.name !== void 0 ? { name: options.name } : {},
|
|
34
|
+
...options.url !== void 0 ? { url: options.url } : {},
|
|
35
|
+
...options.tableEvents !== void 0 ? { tableEvents: options.tableEvents.mode === "replace" ? options.tableEvents.items : require_table_event.addTableEvents(require_table_event.removeTableEvents(currentTableEvents, options.tableEvents.remove), options.tableEvents.add) } : {},
|
|
36
|
+
...options.customHeaders !== void 0 ? { customHeaders: options.customHeaders.mode === "replace" ? options.customHeaders.items : applyHeaderEdits(currentHeaders, options.customHeaders) } : {}
|
|
37
|
+
};
|
|
38
|
+
const updated = require_run_with_context.toResult(await ctx.client.PUT("/projects/{projectName}/webhooks/{webhookId}", {
|
|
39
|
+
params: { path: {
|
|
40
|
+
projectName: ctx.projectName,
|
|
41
|
+
webhookId: options.webhookId
|
|
42
|
+
} },
|
|
43
|
+
body
|
|
44
|
+
}));
|
|
45
|
+
if (_praha_byethrow.Result.isFailure(updated)) return require_run_with_context.apiErrorFailure(updated.error);
|
|
46
|
+
const value = updated.value;
|
|
47
|
+
return _praha_byethrow.Result.succeed({
|
|
48
|
+
json: value,
|
|
49
|
+
text: () => require_detail.renderDetail([
|
|
50
|
+
["ID", String(value.id)],
|
|
51
|
+
["Name", value.name],
|
|
52
|
+
["URL", value.url],
|
|
53
|
+
["Table events", require_table_event.formatTableEvents(value.tableEvents)],
|
|
54
|
+
["Custom headers", require_get.formatCustomHeaders(value.customHeaders)],
|
|
55
|
+
["Updated at", value.updatedAt]
|
|
56
|
+
])
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
const updateArgs = {
|
|
60
|
+
...require_shared.contextArgs,
|
|
61
|
+
id: {
|
|
62
|
+
type: "positional",
|
|
63
|
+
required: true,
|
|
64
|
+
description: "Numeric webhook ID"
|
|
65
|
+
},
|
|
66
|
+
name: {
|
|
67
|
+
type: "string",
|
|
68
|
+
description: "New webhook name"
|
|
69
|
+
},
|
|
70
|
+
url: {
|
|
71
|
+
type: "string",
|
|
72
|
+
description: "New URL to notify"
|
|
73
|
+
},
|
|
74
|
+
"table-event": {
|
|
75
|
+
type: "string",
|
|
76
|
+
description: "Replace all subscriptions with <table>:<event>; repeatable"
|
|
77
|
+
},
|
|
78
|
+
"add-table-event": {
|
|
79
|
+
type: "string",
|
|
80
|
+
description: "Add a subscription as <table>:<event>; repeatable"
|
|
81
|
+
},
|
|
82
|
+
"remove-table-event": {
|
|
83
|
+
type: "string",
|
|
84
|
+
description: "Remove a subscription as <table>:<event>; repeatable"
|
|
85
|
+
},
|
|
86
|
+
"clear-table-events": {
|
|
87
|
+
type: "boolean",
|
|
88
|
+
description: "Remove all subscriptions",
|
|
89
|
+
default: false
|
|
90
|
+
},
|
|
91
|
+
header: {
|
|
92
|
+
type: "string",
|
|
93
|
+
description: "Replace all custom headers with <key>:<value>; repeatable"
|
|
94
|
+
},
|
|
95
|
+
"add-header": {
|
|
96
|
+
type: "string",
|
|
97
|
+
description: "Add or overwrite a custom header as <key>:<value>; repeatable"
|
|
98
|
+
},
|
|
99
|
+
"remove-header": {
|
|
100
|
+
type: "string",
|
|
101
|
+
description: "Remove a custom header by key; repeatable"
|
|
102
|
+
},
|
|
103
|
+
"clear-headers": {
|
|
104
|
+
type: "boolean",
|
|
105
|
+
description: "Remove all custom headers",
|
|
106
|
+
default: false
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
var update_default = require_cli_main.defineCommand({
|
|
110
|
+
meta: {
|
|
111
|
+
name: "update",
|
|
112
|
+
description: "Update a webhook"
|
|
113
|
+
},
|
|
114
|
+
args: updateArgs,
|
|
115
|
+
run: async ({ args, rawArgs }) => {
|
|
116
|
+
const webhookId = require_parse.parsePositionalId("webhook ID", args.id);
|
|
117
|
+
if (_praha_byethrow.Result.isFailure(webhookId)) return webhookId;
|
|
118
|
+
const replaceTableEvents = require_table_event.parseTableEvents("table-event", require_parse.collectRepeatableFlag(rawArgs, "table-event"));
|
|
119
|
+
if (_praha_byethrow.Result.isFailure(replaceTableEvents)) return replaceTableEvents;
|
|
120
|
+
const addedTableEvents = require_table_event.parseTableEvents("add-table-event", require_parse.collectRepeatableFlag(rawArgs, "add-table-event"));
|
|
121
|
+
if (_praha_byethrow.Result.isFailure(addedTableEvents)) return addedTableEvents;
|
|
122
|
+
const removedTableEvents = require_table_event.parseTableEvents("remove-table-event", require_parse.collectRepeatableFlag(rawArgs, "remove-table-event"));
|
|
123
|
+
if (_praha_byethrow.Result.isFailure(removedTableEvents)) return removedTableEvents;
|
|
124
|
+
const tableEvents = require_array_update.resolveArrayUpdate({
|
|
125
|
+
replaceFlag: "table-event",
|
|
126
|
+
clearFlag: "clear-table-events",
|
|
127
|
+
editFlags: "--add-table-event / --remove-table-event",
|
|
128
|
+
replace: replaceTableEvents.value,
|
|
129
|
+
add: addedTableEvents.value,
|
|
130
|
+
remove: removedTableEvents.value,
|
|
131
|
+
clear: args["clear-table-events"] === true
|
|
132
|
+
});
|
|
133
|
+
if (_praha_byethrow.Result.isFailure(tableEvents)) return tableEvents;
|
|
134
|
+
const replaceHeaders = require_parse.parseHeaders("header", require_parse.collectRepeatableFlag(rawArgs, "header"));
|
|
135
|
+
if (_praha_byethrow.Result.isFailure(replaceHeaders)) return replaceHeaders;
|
|
136
|
+
const addedHeaders = require_parse.parseHeaders("add-header", require_parse.collectRepeatableFlag(rawArgs, "add-header"));
|
|
137
|
+
if (_praha_byethrow.Result.isFailure(addedHeaders)) return addedHeaders;
|
|
138
|
+
const duplicateAddedKey = require_array_update.findDuplicateKey(addedHeaders.value ?? [], (header) => header.key);
|
|
139
|
+
if (duplicateAddedKey !== void 0) return _praha_byethrow.Result.fail({ message: `Invalid --add-header: key "${duplicateAddedKey}" is specified multiple times.` });
|
|
140
|
+
const removeHeaderValues = require_parse.collectRepeatableFlag(rawArgs, "remove-header");
|
|
141
|
+
const removedHeaderKeys = removeHeaderValues === void 0 ? _praha_byethrow.Result.succeed(void 0) : require_parse.parseRepeatableFlag("remove-header", removeHeaderValues);
|
|
142
|
+
if (_praha_byethrow.Result.isFailure(removedHeaderKeys)) return removedHeaderKeys;
|
|
143
|
+
const customHeaders = require_array_update.resolveArrayUpdate({
|
|
144
|
+
replaceFlag: "header",
|
|
145
|
+
clearFlag: "clear-headers",
|
|
146
|
+
editFlags: "--add-header / --remove-header",
|
|
147
|
+
replace: replaceHeaders.value,
|
|
148
|
+
add: addedHeaders.value,
|
|
149
|
+
remove: removedHeaderKeys.value,
|
|
150
|
+
clear: args["clear-headers"] === true
|
|
151
|
+
});
|
|
152
|
+
if (_praha_byethrow.Result.isFailure(customHeaders)) return customHeaders;
|
|
153
|
+
let url;
|
|
154
|
+
if (typeof args.url === "string") {
|
|
155
|
+
const parsedUrl = require_parse.parseHttpUrl("url", args.url);
|
|
156
|
+
if (_praha_byethrow.Result.isFailure(parsedUrl)) return parsedUrl;
|
|
157
|
+
url = parsedUrl.value;
|
|
158
|
+
}
|
|
159
|
+
return require_run_with_context.runWithContext(args, (ctx) => webhookUpdateHandler(ctx, {
|
|
160
|
+
webhookId: webhookId.value,
|
|
161
|
+
name: typeof args.name === "string" ? args.name : void 0,
|
|
162
|
+
url,
|
|
163
|
+
tableEvents: tableEvents.value,
|
|
164
|
+
customHeaders: customHeaders.value
|
|
165
|
+
}));
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
//#endregion
|
|
170
|
+
exports.default = update_default;
|
|
171
|
+
//# sourceMappingURL=update-ap5Qv1Yl.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-ap5Qv1Yl.cjs","names":["applyKeyedEdits","Result","toResult","apiErrorFailure","missingTableEventRemovals","addTableEvents","removeTableEvents","renderDetail","formatTableEvents","formatCustomHeaders","contextArgs","defineCommand","parsePositionalId","parseTableEvents","collectRepeatableFlag","resolveArrayUpdate","parseHeaders","findDuplicateKey","parseRepeatableFlag","parseHttpUrl","runWithContext"],"sources":["../src/cli/commands/webhook/update.ts"],"sourcesContent":["import type { ArgsDef } from \"citty\";\nimport { Result } from \"@praha/byethrow\";\nimport {\n defineCommand,\n type CommandFailure,\n type CommandOutput,\n} from \"../define-command.js\";\nimport { contextArgs } from \"../shared.js\";\nimport { runWithContext, type CommandContext } from \"../run-with-context.js\";\nimport { apiErrorFailure } from \"../api-errors.js\";\nimport { toResult } from \"../../api/errors.js\";\nimport { renderDetail } from \"../../ui/detail.js\";\nimport {\n collectRepeatableFlag,\n parseHeaders,\n parseHttpUrl,\n parsePositionalId,\n parseRepeatableFlag,\n} from \"../parse.js\";\nimport {\n applyKeyedEdits,\n findDuplicateKey,\n resolveArrayUpdate,\n type ArrayUpdate,\n} from \"../array-update.js\";\nimport { warn } from \"../../ui/output.js\";\nimport { formatCustomHeaders } from \"./get.js\";\nimport {\n addTableEvents,\n formatTableEvents,\n missingTableEventRemovals,\n parseTableEvents,\n removeTableEvents,\n type TableEvent,\n} from \"./table-event.js\";\n\ntype CustomHeader = { key: string; value: string };\n\nexport function applyHeaderEdits(\n current: CustomHeader[],\n edits: { add: CustomHeader[]; remove: string[] },\n): CustomHeader[] {\n return applyKeyedEdits(current, edits, (header) => header.key);\n}\n\nexport async function webhookUpdateHandler(\n ctx: CommandContext,\n options: {\n webhookId: number;\n name?: string;\n url?: string;\n tableEvents: ArrayUpdate<TableEvent, TableEvent>;\n customHeaders: ArrayUpdate<CustomHeader, string>;\n },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n if (\n options.name === undefined &&\n options.url === undefined &&\n options.tableEvents === undefined &&\n options.customHeaders === undefined\n ) {\n return Result.fail({\n message:\n \"Nothing to update. Pass --name, --url, a --table-event option, or a --header option.\",\n });\n }\n\n // API は配列の全置換しか受けないため、要素単位の編集は現状を取得してインメモリで編集してから送る\n let currentTableEvents: TableEvent[] = [];\n let currentHeaders: CustomHeader[] = [];\n if (\n options.tableEvents?.mode === \"edit\" ||\n options.customHeaders?.mode === \"edit\"\n ) {\n const current = toResult(\n await ctx.client.GET(\"/projects/{projectName}/webhooks/{webhookId}\", {\n params: {\n path: { projectName: ctx.projectName, webhookId: options.webhookId },\n },\n }),\n );\n if (Result.isFailure(current)) return apiErrorFailure(current.error);\n currentTableEvents = current.value.tableEvents;\n currentHeaders = current.value.customHeaders;\n\n // 存在しない対象の remove は冪等に無視する (エラーにしない) が、タイポに気づけるよう通知は出す\n if (options.tableEvents?.mode === \"edit\") {\n for (const missing of missingTableEventRemovals(\n currentTableEvents,\n options.tableEvents.remove,\n )) {\n warn(`Subscription \"${missing}\" is not set; skipped removing it.`);\n }\n }\n if (options.customHeaders?.mode === \"edit\") {\n for (const key of options.customHeaders.remove) {\n if (!currentHeaders.some((header) => header.key === key)) {\n warn(`Header \"${key}\" is not set; skipped removing it.`);\n }\n }\n }\n }\n\n const body = {\n ...(options.name !== undefined ? { name: options.name } : {}),\n ...(options.url !== undefined ? { url: options.url } : {}),\n ...(options.tableEvents !== undefined\n ? {\n tableEvents:\n options.tableEvents.mode === \"replace\"\n ? options.tableEvents.items\n : addTableEvents(\n removeTableEvents(\n currentTableEvents,\n options.tableEvents.remove,\n ),\n options.tableEvents.add,\n ),\n }\n : {}),\n ...(options.customHeaders !== undefined\n ? {\n customHeaders:\n options.customHeaders.mode === \"replace\"\n ? options.customHeaders.items\n : applyHeaderEdits(currentHeaders, options.customHeaders),\n }\n : {}),\n };\n\n const updated = toResult(\n await ctx.client.PUT(\"/projects/{projectName}/webhooks/{webhookId}\", {\n params: {\n path: { projectName: ctx.projectName, webhookId: options.webhookId },\n },\n body,\n }),\n );\n if (Result.isFailure(updated)) return apiErrorFailure(updated.error);\n\n const value = updated.value;\n return Result.succeed({\n json: value,\n text: () =>\n renderDetail([\n [\"ID\", String(value.id)],\n [\"Name\", value.name],\n [\"URL\", value.url],\n [\"Table events\", formatTableEvents(value.tableEvents)],\n [\"Custom headers\", formatCustomHeaders(value.customHeaders)],\n [\"Updated at\", value.updatedAt],\n ]),\n });\n}\n\nconst updateArgs = {\n ...contextArgs,\n id: {\n type: \"positional\",\n required: true,\n description: \"Numeric webhook ID\",\n },\n name: {\n type: \"string\",\n description: \"New webhook name\",\n },\n url: {\n type: \"string\",\n description: \"New URL to notify\",\n },\n \"table-event\": {\n type: \"string\",\n description: \"Replace all subscriptions with <table>:<event>; repeatable\",\n },\n \"add-table-event\": {\n type: \"string\",\n description: \"Add a subscription as <table>:<event>; repeatable\",\n },\n \"remove-table-event\": {\n type: \"string\",\n description: \"Remove a subscription as <table>:<event>; repeatable\",\n },\n \"clear-table-events\": {\n type: \"boolean\",\n description: \"Remove all subscriptions\",\n default: false,\n },\n header: {\n type: \"string\",\n description: \"Replace all custom headers with <key>:<value>; repeatable\",\n },\n \"add-header\": {\n type: \"string\",\n description:\n \"Add or overwrite a custom header as <key>:<value>; repeatable\",\n },\n \"remove-header\": {\n type: \"string\",\n description: \"Remove a custom header by key; repeatable\",\n },\n \"clear-headers\": {\n type: \"boolean\",\n description: \"Remove all custom headers\",\n default: false,\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"update\",\n description: \"Update a webhook\",\n },\n args: updateArgs,\n run: async ({ args, rawArgs }) => {\n const webhookId = parsePositionalId(\"webhook ID\", args.id);\n if (Result.isFailure(webhookId)) return webhookId;\n\n const replaceTableEvents = parseTableEvents(\n \"table-event\",\n collectRepeatableFlag(rawArgs, \"table-event\"),\n );\n if (Result.isFailure(replaceTableEvents)) return replaceTableEvents;\n const addedTableEvents = parseTableEvents(\n \"add-table-event\",\n collectRepeatableFlag(rawArgs, \"add-table-event\"),\n );\n if (Result.isFailure(addedTableEvents)) return addedTableEvents;\n const removedTableEvents = parseTableEvents(\n \"remove-table-event\",\n collectRepeatableFlag(rawArgs, \"remove-table-event\"),\n );\n if (Result.isFailure(removedTableEvents)) return removedTableEvents;\n const tableEvents = resolveArrayUpdate({\n replaceFlag: \"table-event\",\n clearFlag: \"clear-table-events\",\n editFlags: \"--add-table-event / --remove-table-event\",\n replace: replaceTableEvents.value,\n add: addedTableEvents.value,\n remove: removedTableEvents.value,\n clear: args[\"clear-table-events\"] === true,\n });\n if (Result.isFailure(tableEvents)) return tableEvents;\n\n const replaceHeaders = parseHeaders(\n \"header\",\n collectRepeatableFlag(rawArgs, \"header\"),\n );\n if (Result.isFailure(replaceHeaders)) return replaceHeaders;\n const addedHeaders = parseHeaders(\n \"add-header\",\n collectRepeatableFlag(rawArgs, \"add-header\"),\n );\n if (Result.isFailure(addedHeaders)) return addedHeaders;\n // add は同一 key を上書きする規則のため、1 回の実行内で同じ key を複数指定されると意図が曖昧になり弾く\n const duplicateAddedKey = findDuplicateKey(\n addedHeaders.value ?? [],\n (header) => header.key,\n );\n if (duplicateAddedKey !== undefined) {\n return Result.fail({\n message: `Invalid --add-header: key \"${duplicateAddedKey}\" is specified multiple times.`,\n });\n }\n const removeHeaderValues = collectRepeatableFlag(rawArgs, \"remove-header\");\n const removedHeaderKeys =\n removeHeaderValues === undefined\n ? Result.succeed(undefined)\n : parseRepeatableFlag(\"remove-header\", removeHeaderValues);\n if (Result.isFailure(removedHeaderKeys)) return removedHeaderKeys;\n const customHeaders = resolveArrayUpdate({\n replaceFlag: \"header\",\n clearFlag: \"clear-headers\",\n editFlags: \"--add-header / --remove-header\",\n replace: replaceHeaders.value,\n add: addedHeaders.value,\n remove: removedHeaderKeys.value,\n clear: args[\"clear-headers\"] === true,\n });\n if (Result.isFailure(customHeaders)) return customHeaders;\n\n let url: string | undefined;\n if (typeof args.url === \"string\") {\n const parsedUrl = parseHttpUrl(\"url\", args.url);\n if (Result.isFailure(parsedUrl)) return parsedUrl;\n url = parsedUrl.value;\n }\n\n return runWithContext(args, (ctx) =>\n webhookUpdateHandler(ctx, {\n webhookId: webhookId.value,\n name: typeof args.name === \"string\" ? args.name : undefined,\n url,\n tableEvents: tableEvents.value,\n customHeaders: customHeaders.value,\n }),\n );\n },\n});\n"],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { t as defineCommand } from "./cli/main.mjs";
|
|
2
|
+
import { r as contextArgs } from "./shared-CZZimGxc.mjs";
|
|
3
|
+
import { a as apiErrorFailure, n as runWithContext, u as toResult } from "./run-with-context-CVhmzAFZ.mjs";
|
|
4
|
+
import { t as renderDetail } from "./detail-DN5jCQ4N.mjs";
|
|
5
|
+
import { n as parseBooleanFlag } from "./parse-CA5fBB3x.mjs";
|
|
6
|
+
import { t as projectNameOverride } from "./project-name-DNMejnzZ.mjs";
|
|
7
|
+
import { Result } from "@praha/byethrow";
|
|
8
|
+
|
|
9
|
+
//#region src/cli/commands/project/update.ts
|
|
10
|
+
async function projectUpdateHandler(ctx, options) {
|
|
11
|
+
const body = {
|
|
12
|
+
...options.displayName !== void 0 ? { displayName: options.displayName } : {},
|
|
13
|
+
...options.cmsUrl !== void 0 ? { cmsUrl: options.cmsUrl } : {},
|
|
14
|
+
...options.deletionProtected !== void 0 ? { isDeletionProtected: options.deletionProtected } : {}
|
|
15
|
+
};
|
|
16
|
+
if (Object.keys(body).length === 0) return Result.fail({ message: "Nothing to update. Pass --display-name, --cms-url, or --deletion-protected." });
|
|
17
|
+
const updated = toResult(await ctx.client.PUT("/projects/{projectName}", {
|
|
18
|
+
params: { path: { projectName: ctx.projectName } },
|
|
19
|
+
body
|
|
20
|
+
}));
|
|
21
|
+
if (Result.isFailure(updated)) return apiErrorFailure(updated.error);
|
|
22
|
+
const value = updated.value;
|
|
23
|
+
return Result.succeed({
|
|
24
|
+
json: value,
|
|
25
|
+
text: () => renderDetail([
|
|
26
|
+
["Updated", value.name],
|
|
27
|
+
["Display name", value.displayName],
|
|
28
|
+
["CMS URL", value.cmsUrl ?? "-"],
|
|
29
|
+
["Deletion protected", String(value.isDeletionProtected)]
|
|
30
|
+
])
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
const updateArgs = {
|
|
34
|
+
...contextArgs,
|
|
35
|
+
name: {
|
|
36
|
+
type: "positional",
|
|
37
|
+
required: false,
|
|
38
|
+
description: "Project name (defaults to the current project context)"
|
|
39
|
+
},
|
|
40
|
+
"display-name": {
|
|
41
|
+
type: "string",
|
|
42
|
+
description: "New display name"
|
|
43
|
+
},
|
|
44
|
+
"cms-url": {
|
|
45
|
+
type: "string",
|
|
46
|
+
description: "New CMS URL"
|
|
47
|
+
},
|
|
48
|
+
"deletion-protected": {
|
|
49
|
+
type: "string",
|
|
50
|
+
description: "Set deletion protection (true/false)",
|
|
51
|
+
valueHint: "true|false"
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
var update_default = defineCommand({
|
|
55
|
+
meta: {
|
|
56
|
+
name: "update",
|
|
57
|
+
description: "Update a project's settings"
|
|
58
|
+
},
|
|
59
|
+
args: updateArgs,
|
|
60
|
+
run: async ({ args }) => {
|
|
61
|
+
const deletionProtected = parseBooleanFlag("deletion-protected", args["deletion-protected"]);
|
|
62
|
+
if (Result.isFailure(deletionProtected)) return deletionProtected;
|
|
63
|
+
return runWithContext(projectNameOverride(args), (ctx) => projectUpdateHandler(ctx, {
|
|
64
|
+
displayName: typeof args["display-name"] === "string" ? args["display-name"] : void 0,
|
|
65
|
+
cmsUrl: typeof args["cms-url"] === "string" ? args["cms-url"] : void 0,
|
|
66
|
+
deletionProtected: deletionProtected.value
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
//#endregion
|
|
72
|
+
export { update_default as default };
|
|
73
|
+
//# sourceMappingURL=update-yscrx6WQ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-yscrx6WQ.mjs","names":[],"sources":["../src/cli/commands/project/update.ts"],"sourcesContent":["import type { ArgsDef } from \"citty\";\nimport { Result } from \"@praha/byethrow\";\nimport type { components } from \"@orizm/internal-shared/api-clients/dev-v2\";\nimport {\n defineCommand,\n type CommandFailure,\n type CommandOutput,\n} from \"../define-command.js\";\nimport { contextArgs } from \"../shared.js\";\nimport { runWithContext, type CommandContext } from \"../run-with-context.js\";\nimport { apiErrorFailure } from \"../api-errors.js\";\nimport { toResult } from \"../../api/errors.js\";\nimport { renderDetail } from \"../../ui/detail.js\";\nimport { parseBooleanFlag } from \"../parse.js\";\nimport { projectNameOverride } from \"./project-name.js\";\n\nexport async function projectUpdateHandler(\n ctx: CommandContext,\n options: {\n displayName?: string;\n cmsUrl?: string;\n deletionProtected?: boolean;\n },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const body: components[\"schemas\"][\"UpdateProjectRequest\"] = {\n ...(options.displayName !== undefined\n ? { displayName: options.displayName }\n : {}),\n ...(options.cmsUrl !== undefined ? { cmsUrl: options.cmsUrl } : {}),\n ...(options.deletionProtected !== undefined\n ? { isDeletionProtected: options.deletionProtected }\n : {}),\n };\n\n if (Object.keys(body).length === 0) {\n return Result.fail({\n message:\n \"Nothing to update. Pass --display-name, --cms-url, or --deletion-protected.\",\n });\n }\n\n const updated = toResult(\n await ctx.client.PUT(\"/projects/{projectName}\", {\n params: { path: { projectName: ctx.projectName } },\n body,\n }),\n );\n if (Result.isFailure(updated)) return apiErrorFailure(updated.error);\n\n const value = updated.value;\n return Result.succeed({\n json: value,\n text: () =>\n renderDetail([\n [\"Updated\", value.name],\n [\"Display name\", value.displayName],\n [\"CMS URL\", value.cmsUrl ?? \"-\"],\n [\"Deletion protected\", String(value.isDeletionProtected)],\n ]),\n });\n}\n\nconst updateArgs = {\n ...contextArgs,\n name: {\n type: \"positional\",\n required: false,\n description: \"Project name (defaults to the current project context)\",\n },\n \"display-name\": {\n type: \"string\",\n description: \"New display name\",\n },\n \"cms-url\": {\n type: \"string\",\n description: \"New CMS URL\",\n },\n // 「未指定 = 変更しない」「true / false = その値へ変更」の 3 状態を扱うため、\n // bare 指定が true になる boolean フラグではなく、値を明示させる文字列で受ける。\n \"deletion-protected\": {\n type: \"string\",\n description: \"Set deletion protection (true/false)\",\n valueHint: \"true|false\",\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"update\",\n description: \"Update a project's settings\",\n },\n args: updateArgs,\n run: async ({ args }) => {\n const deletionProtected = parseBooleanFlag(\n \"deletion-protected\",\n args[\"deletion-protected\"],\n );\n if (Result.isFailure(deletionProtected)) return deletionProtected;\n\n return runWithContext(projectNameOverride(args), (ctx) =>\n projectUpdateHandler(ctx, {\n displayName:\n typeof args[\"display-name\"] === \"string\"\n ? args[\"display-name\"]\n : undefined,\n cmsUrl:\n typeof args[\"cms-url\"] === \"string\" ? args[\"cms-url\"] : undefined,\n deletionProtected: deletionProtected.value,\n }),\n );\n },\n});\n"],"mappings":";;;;;;;;;AAgBA,eAAsB,qBACpB,KACA,SAKmE;CACnE,MAAM,OAAsD;EAC1D,GAAI,QAAQ,gBAAgB,SACxB,EAAE,aAAa,QAAQ,YAAY,IACnC,CAAC;EACL,GAAI,QAAQ,WAAW,SAAY,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;EACjE,GAAI,QAAQ,sBAAsB,SAC9B,EAAE,qBAAqB,QAAQ,kBAAkB,IACjD,CAAC;CACP;CAEA,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,WAAW,GAC/B,OAAO,OAAO,KAAK,EACjB,SACE,8EACJ,CAAC;CAGH,MAAM,UAAU,SACd,MAAM,IAAI,OAAO,IAAI,2BAA2B;EAC9C,QAAQ,EAAE,MAAM,EAAE,aAAa,IAAI,YAAY,EAAE;EACjD;CACF,CAAC,CACH;CACA,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO,gBAAgB,QAAQ,KAAK;CAEnE,MAAM,QAAQ,QAAQ;CACtB,OAAO,OAAO,QAAQ;EACpB,MAAM;EACN,YACE,aAAa;GACX,CAAC,WAAW,MAAM,IAAI;GACtB,CAAC,gBAAgB,MAAM,WAAW;GAClC,CAAC,WAAW,MAAM,UAAU,GAAG;GAC/B,CAAC,sBAAsB,OAAO,MAAM,mBAAmB,CAAC;EAC1D,CAAC;CACL,CAAC;AACH;AAEA,MAAM,aAAa;CACjB,GAAG;CACH,MAAM;EACJ,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,gBAAgB;EACd,MAAM;EACN,aAAa;CACf;CACA,WAAW;EACT,MAAM;EACN,aAAa;CACf;CAGA,sBAAsB;EACpB,MAAM;EACN,aAAa;EACb,WAAW;CACb;AACF;AAEA,qBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,KAAK,OAAO,EAAE,WAAW;EACvB,MAAM,oBAAoB,iBACxB,sBACA,KAAK,qBACP;EACA,IAAI,OAAO,UAAU,iBAAiB,GAAG,OAAO;EAEhD,OAAO,eAAe,oBAAoB,IAAI,IAAI,QAChD,qBAAqB,KAAK;GACxB,aACE,OAAO,KAAK,oBAAoB,WAC5B,KAAK,kBACL;GACN,QACE,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa;GAC1D,mBAAmB,kBAAkB;EACvC,CAAC,CACH;CACF;AACF,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
const require_cli_main = require('./cli/main.cjs');
|
|
2
|
+
const require_shared = require('./shared-DHRPzzKl.cjs');
|
|
3
|
+
const require_run_with_context = require('./run-with-context-DJNnEigg.cjs');
|
|
4
|
+
const require_detail = require('./detail-8CXNIhKw.cjs');
|
|
5
|
+
let _praha_byethrow = require("@praha/byethrow");
|
|
6
|
+
let node_fs_promises = require("node:fs/promises");
|
|
7
|
+
let node_path = require("node:path");
|
|
8
|
+
let mime_types = require("mime-types");
|
|
9
|
+
mime_types = require_cli_main.__toESM(mime_types, 1);
|
|
10
|
+
|
|
11
|
+
//#region src/cli/api/multipart.ts
|
|
12
|
+
function multipartBodySerializer(body) {
|
|
13
|
+
const formData = new FormData();
|
|
14
|
+
for (const [key, value] of Object.entries(body)) {
|
|
15
|
+
if (value === void 0) continue;
|
|
16
|
+
formData.append(key, value);
|
|
17
|
+
}
|
|
18
|
+
return formData;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
//#endregion
|
|
22
|
+
//#region src/cli/commands/bucket/object/mime.ts
|
|
23
|
+
function mimeTypeFromFilename(filename) {
|
|
24
|
+
const mimeType = mime_types.default.lookup(filename);
|
|
25
|
+
return mimeType === false ? void 0 : mimeType;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
//#endregion
|
|
29
|
+
//#region src/cli/commands/bucket/object/upload.ts
|
|
30
|
+
async function bucketObjectUploadHandler(ctx, options) {
|
|
31
|
+
let bytes;
|
|
32
|
+
try {
|
|
33
|
+
bytes = new Uint8Array(await (0, node_fs_promises.readFile)(options.filePath));
|
|
34
|
+
} catch {
|
|
35
|
+
return _praha_byethrow.Result.fail({ message: `Could not read file: ${options.filePath}` });
|
|
36
|
+
}
|
|
37
|
+
const fileName = (0, node_path.basename)(options.filePath);
|
|
38
|
+
const fileField = { file: new File([bytes], fileName, { type: mimeTypeFromFilename(fileName) }) };
|
|
39
|
+
const uploaded = require_run_with_context.toResult(await ctx.client.POST("/projects/{projectName}/buckets/{bucketName}/objects", {
|
|
40
|
+
params: { path: {
|
|
41
|
+
projectName: ctx.projectName,
|
|
42
|
+
bucketName: options.bucket
|
|
43
|
+
} },
|
|
44
|
+
body: {
|
|
45
|
+
...fileField,
|
|
46
|
+
...options.key !== void 0 ? { key: options.key } : {}
|
|
47
|
+
},
|
|
48
|
+
bodySerializer: multipartBodySerializer
|
|
49
|
+
}));
|
|
50
|
+
if (_praha_byethrow.Result.isFailure(uploaded)) return require_run_with_context.apiErrorFailure(uploaded.error);
|
|
51
|
+
const value = uploaded.value;
|
|
52
|
+
return _praha_byethrow.Result.succeed({
|
|
53
|
+
json: value,
|
|
54
|
+
text: () => require_detail.renderDetail([
|
|
55
|
+
["Uploaded", value.key],
|
|
56
|
+
["Original filename", value.originalFilename],
|
|
57
|
+
["Size", String(value.size)],
|
|
58
|
+
["Type", value.type],
|
|
59
|
+
["Public URL", value.publicUrl ?? "-"]
|
|
60
|
+
])
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
const uploadArgs = {
|
|
64
|
+
...require_shared.contextArgs,
|
|
65
|
+
bucket: {
|
|
66
|
+
type: "positional",
|
|
67
|
+
required: true,
|
|
68
|
+
description: "Bucket name"
|
|
69
|
+
},
|
|
70
|
+
file: {
|
|
71
|
+
type: "positional",
|
|
72
|
+
required: true,
|
|
73
|
+
description: "Path to the local file to upload"
|
|
74
|
+
},
|
|
75
|
+
key: {
|
|
76
|
+
type: "string",
|
|
77
|
+
description: "Object key (generated by the server when omitted)"
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
var upload_default = require_cli_main.defineCommand({
|
|
81
|
+
meta: {
|
|
82
|
+
name: "upload",
|
|
83
|
+
description: "Upload a file to a bucket"
|
|
84
|
+
},
|
|
85
|
+
args: uploadArgs,
|
|
86
|
+
run: ({ args }) => require_run_with_context.runWithContext(args, (ctx) => bucketObjectUploadHandler(ctx, {
|
|
87
|
+
bucket: args.bucket,
|
|
88
|
+
filePath: args.file,
|
|
89
|
+
key: typeof args.key === "string" ? args.key : void 0
|
|
90
|
+
}))
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
//#endregion
|
|
94
|
+
exports.default = upload_default;
|
|
95
|
+
//# sourceMappingURL=upload-C43ZXxyb.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-C43ZXxyb.cjs","names":["mimeTypes","Result","toResult","apiErrorFailure","renderDetail","contextArgs","defineCommand","runWithContext"],"sources":["../src/cli/api/multipart.ts","../src/cli/commands/bucket/object/mime.ts","../src/cli/commands/bucket/object/upload.ts"],"sourcesContent":["// openapi-fetch のデフォルト serializer は JSON 前提のため、multipart/form-data はこの serializer を明示指定する。\nexport function multipartBodySerializer(\n body: Record<string, string | File | undefined>,\n): FormData {\n const formData = new FormData();\n for (const [key, value] of Object.entries(body)) {\n if (value === undefined) continue;\n formData.append(key, value);\n }\n return formData;\n}\n","import mimeTypes from \"mime-types\";\n\n// Node で readFile したバイト列を File に包むだけでは type が空になり、サーバーが\n// type を保存できず画像の width/height 抽出(image/ 判定)も働かないため、拡張子から申告する。\nexport function mimeTypeFromFilename(filename: string): string | undefined {\n const mimeType = mimeTypes.lookup(filename);\n return mimeType === false ? undefined : mimeType;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport type { ArgsDef } from \"citty\";\nimport { Result } from \"@praha/byethrow\";\nimport {\n defineCommand,\n type CommandFailure,\n type CommandOutput,\n} from \"../../define-command.js\";\nimport { contextArgs } from \"../../shared.js\";\nimport { runWithContext, type CommandContext } from \"../../run-with-context.js\";\nimport { apiErrorFailure } from \"../../api-errors.js\";\nimport { toResult } from \"../../../api/errors.js\";\nimport { multipartBodySerializer } from \"../../../api/multipart.js\";\nimport { renderDetail } from \"../../../ui/detail.js\";\nimport { mimeTypeFromFilename } from \"./mime.js\";\n\nexport async function bucketObjectUploadHandler(\n ctx: CommandContext,\n options: { bucket: string; filePath: string; key?: string },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n // Buffer のままだと ArrayBufferLike 由来で BlobPart に渡せないため、ArrayBuffer 上にコピーする\n let bytes: Uint8Array<ArrayBuffer>;\n try {\n bytes = new Uint8Array(await readFile(options.filePath));\n } catch {\n return Result.fail({\n message: `Could not read file: ${options.filePath}`,\n });\n }\n // originalFilename をサーバーに伝えるため Blob ではなく File で包む\n const fileName = basename(options.filePath);\n const file = new File([bytes], fileName, {\n type: mimeTypeFromFilename(fileName),\n });\n\n const fileField: { file: string } =\n // @ts-expect-error -- openapi-typescript が format: binary を string として生成するため File を渡せない\n { file };\n const uploaded = toResult(\n await ctx.client.POST(\n \"/projects/{projectName}/buckets/{bucketName}/objects\",\n {\n params: {\n path: { projectName: ctx.projectName, bucketName: options.bucket },\n },\n body: {\n ...fileField,\n ...(options.key !== undefined ? { key: options.key } : {}),\n },\n bodySerializer: multipartBodySerializer,\n },\n ),\n );\n if (Result.isFailure(uploaded)) return apiErrorFailure(uploaded.error);\n\n const value = uploaded.value;\n return Result.succeed({\n json: value,\n text: () =>\n renderDetail([\n [\"Uploaded\", value.key],\n [\"Original filename\", value.originalFilename],\n [\"Size\", String(value.size)],\n [\"Type\", value.type],\n [\"Public URL\", value.publicUrl ?? \"-\"],\n ]),\n });\n}\n\nconst uploadArgs = {\n ...contextArgs,\n bucket: {\n type: \"positional\",\n required: true,\n description: \"Bucket name\",\n },\n file: {\n type: \"positional\",\n required: true,\n description: \"Path to the local file to upload\",\n },\n key: {\n type: \"string\",\n description: \"Object key (generated by the server when omitted)\",\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"upload\",\n description: \"Upload a file to a bucket\",\n },\n args: uploadArgs,\n run: ({ args }) =>\n runWithContext(args, (ctx) =>\n bucketObjectUploadHandler(ctx, {\n bucket: args.bucket,\n filePath: args.file,\n key: typeof args.key === \"string\" ? args.key : undefined,\n }),\n ),\n});\n"],"mappings":";;;;;;;;;;;AACA,SAAgB,wBACd,MACU;CACV,MAAM,WAAW,IAAI,SAAS;CAC9B,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,IAAI,GAAG;EAC/C,IAAI,UAAU,QAAW;EACzB,SAAS,OAAO,KAAK,KAAK;CAC5B;CACA,OAAO;AACT;;;;ACNA,SAAgB,qBAAqB,UAAsC;CACzE,MAAM,WAAWA,mBAAU,OAAO,QAAQ;CAC1C,OAAO,aAAa,QAAQ,SAAY;AAC1C;;;;ACUA,eAAsB,0BACpB,KACA,SACmE;CAEnE,IAAI;CACJ,IAAI;EACF,QAAQ,IAAI,WAAW,qCAAe,QAAQ,QAAQ,CAAC;CACzD,QAAQ;EACN,OAAOC,uBAAO,KAAK,EACjB,SAAS,wBAAwB,QAAQ,WAC3C,CAAC;CACH;CAEA,MAAM,mCAAoB,QAAQ,QAAQ;CAK1C,MAAM,YAEJ,EAAE,UANa,KAAK,CAAC,KAAK,GAAG,UAAU,EACvC,MAAM,qBAAqB,QAAQ,EACrC,CAIO,EAAE;CACT,MAAM,WAAWC,kCACf,MAAM,IAAI,OAAO,KACf,wDACA;EACE,QAAQ,EACN,MAAM;GAAE,aAAa,IAAI;GAAa,YAAY,QAAQ;EAAO,EACnE;EACA,MAAM;GACJ,GAAG;GACH,GAAI,QAAQ,QAAQ,SAAY,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC;EAC1D;EACA,gBAAgB;CAClB,CACF,CACF;CACA,IAAID,uBAAO,UAAU,QAAQ,GAAG,OAAOE,yCAAgB,SAAS,KAAK;CAErE,MAAM,QAAQ,SAAS;CACvB,OAAOF,uBAAO,QAAQ;EACpB,MAAM;EACN,YACEG,4BAAa;GACX,CAAC,YAAY,MAAM,GAAG;GACtB,CAAC,qBAAqB,MAAM,gBAAgB;GAC5C,CAAC,QAAQ,OAAO,MAAM,IAAI,CAAC;GAC3B,CAAC,QAAQ,MAAM,IAAI;GACnB,CAAC,cAAc,MAAM,aAAa,GAAG;EACvC,CAAC;CACL,CAAC;AACH;AAEA,MAAM,aAAa;CACjB,GAAGC;CACH,QAAQ;EACN,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,MAAM;EACJ,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,KAAK;EACH,MAAM;EACN,aAAa;CACf;AACF;AAEA,qBAAeC,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,MAAM,EAAE,WACNC,wCAAe,OAAO,QACpB,0BAA0B,KAAK;EAC7B,QAAQ,KAAK;EACb,UAAU,KAAK;EACf,KAAK,OAAO,KAAK,QAAQ,WAAW,KAAK,MAAM;CACjD,CAAC,CACH;AACJ,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { t as defineCommand } from "./cli/main.mjs";
|
|
2
|
+
import { r as contextArgs } from "./shared-CZZimGxc.mjs";
|
|
3
|
+
import { a as apiErrorFailure, n as runWithContext, u as toResult } from "./run-with-context-CVhmzAFZ.mjs";
|
|
4
|
+
import { t as renderDetail } from "./detail-DN5jCQ4N.mjs";
|
|
5
|
+
import { Result } from "@praha/byethrow";
|
|
6
|
+
import { readFile } from "node:fs/promises";
|
|
7
|
+
import { basename } from "node:path";
|
|
8
|
+
import mimeTypes from "mime-types";
|
|
9
|
+
|
|
10
|
+
//#region src/cli/api/multipart.ts
|
|
11
|
+
function multipartBodySerializer(body) {
|
|
12
|
+
const formData = new FormData();
|
|
13
|
+
for (const [key, value] of Object.entries(body)) {
|
|
14
|
+
if (value === void 0) continue;
|
|
15
|
+
formData.append(key, value);
|
|
16
|
+
}
|
|
17
|
+
return formData;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
//#endregion
|
|
21
|
+
//#region src/cli/commands/bucket/object/mime.ts
|
|
22
|
+
function mimeTypeFromFilename(filename) {
|
|
23
|
+
const mimeType = mimeTypes.lookup(filename);
|
|
24
|
+
return mimeType === false ? void 0 : mimeType;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
//#endregion
|
|
28
|
+
//#region src/cli/commands/bucket/object/upload.ts
|
|
29
|
+
async function bucketObjectUploadHandler(ctx, options) {
|
|
30
|
+
let bytes;
|
|
31
|
+
try {
|
|
32
|
+
bytes = new Uint8Array(await readFile(options.filePath));
|
|
33
|
+
} catch {
|
|
34
|
+
return Result.fail({ message: `Could not read file: ${options.filePath}` });
|
|
35
|
+
}
|
|
36
|
+
const fileName = basename(options.filePath);
|
|
37
|
+
const fileField = { file: new File([bytes], fileName, { type: mimeTypeFromFilename(fileName) }) };
|
|
38
|
+
const uploaded = toResult(await ctx.client.POST("/projects/{projectName}/buckets/{bucketName}/objects", {
|
|
39
|
+
params: { path: {
|
|
40
|
+
projectName: ctx.projectName,
|
|
41
|
+
bucketName: options.bucket
|
|
42
|
+
} },
|
|
43
|
+
body: {
|
|
44
|
+
...fileField,
|
|
45
|
+
...options.key !== void 0 ? { key: options.key } : {}
|
|
46
|
+
},
|
|
47
|
+
bodySerializer: multipartBodySerializer
|
|
48
|
+
}));
|
|
49
|
+
if (Result.isFailure(uploaded)) return apiErrorFailure(uploaded.error);
|
|
50
|
+
const value = uploaded.value;
|
|
51
|
+
return Result.succeed({
|
|
52
|
+
json: value,
|
|
53
|
+
text: () => renderDetail([
|
|
54
|
+
["Uploaded", value.key],
|
|
55
|
+
["Original filename", value.originalFilename],
|
|
56
|
+
["Size", String(value.size)],
|
|
57
|
+
["Type", value.type],
|
|
58
|
+
["Public URL", value.publicUrl ?? "-"]
|
|
59
|
+
])
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
const uploadArgs = {
|
|
63
|
+
...contextArgs,
|
|
64
|
+
bucket: {
|
|
65
|
+
type: "positional",
|
|
66
|
+
required: true,
|
|
67
|
+
description: "Bucket name"
|
|
68
|
+
},
|
|
69
|
+
file: {
|
|
70
|
+
type: "positional",
|
|
71
|
+
required: true,
|
|
72
|
+
description: "Path to the local file to upload"
|
|
73
|
+
},
|
|
74
|
+
key: {
|
|
75
|
+
type: "string",
|
|
76
|
+
description: "Object key (generated by the server when omitted)"
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
var upload_default = defineCommand({
|
|
80
|
+
meta: {
|
|
81
|
+
name: "upload",
|
|
82
|
+
description: "Upload a file to a bucket"
|
|
83
|
+
},
|
|
84
|
+
args: uploadArgs,
|
|
85
|
+
run: ({ args }) => runWithContext(args, (ctx) => bucketObjectUploadHandler(ctx, {
|
|
86
|
+
bucket: args.bucket,
|
|
87
|
+
filePath: args.file,
|
|
88
|
+
key: typeof args.key === "string" ? args.key : void 0
|
|
89
|
+
}))
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
//#endregion
|
|
93
|
+
export { upload_default as default };
|
|
94
|
+
//# sourceMappingURL=upload-DGgJ1TQk.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-DGgJ1TQk.mjs","names":[],"sources":["../src/cli/api/multipart.ts","../src/cli/commands/bucket/object/mime.ts","../src/cli/commands/bucket/object/upload.ts"],"sourcesContent":["// openapi-fetch のデフォルト serializer は JSON 前提のため、multipart/form-data はこの serializer を明示指定する。\nexport function multipartBodySerializer(\n body: Record<string, string | File | undefined>,\n): FormData {\n const formData = new FormData();\n for (const [key, value] of Object.entries(body)) {\n if (value === undefined) continue;\n formData.append(key, value);\n }\n return formData;\n}\n","import mimeTypes from \"mime-types\";\n\n// Node で readFile したバイト列を File に包むだけでは type が空になり、サーバーが\n// type を保存できず画像の width/height 抽出(image/ 判定)も働かないため、拡張子から申告する。\nexport function mimeTypeFromFilename(filename: string): string | undefined {\n const mimeType = mimeTypes.lookup(filename);\n return mimeType === false ? undefined : mimeType;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport type { ArgsDef } from \"citty\";\nimport { Result } from \"@praha/byethrow\";\nimport {\n defineCommand,\n type CommandFailure,\n type CommandOutput,\n} from \"../../define-command.js\";\nimport { contextArgs } from \"../../shared.js\";\nimport { runWithContext, type CommandContext } from \"../../run-with-context.js\";\nimport { apiErrorFailure } from \"../../api-errors.js\";\nimport { toResult } from \"../../../api/errors.js\";\nimport { multipartBodySerializer } from \"../../../api/multipart.js\";\nimport { renderDetail } from \"../../../ui/detail.js\";\nimport { mimeTypeFromFilename } from \"./mime.js\";\n\nexport async function bucketObjectUploadHandler(\n ctx: CommandContext,\n options: { bucket: string; filePath: string; key?: string },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n // Buffer のままだと ArrayBufferLike 由来で BlobPart に渡せないため、ArrayBuffer 上にコピーする\n let bytes: Uint8Array<ArrayBuffer>;\n try {\n bytes = new Uint8Array(await readFile(options.filePath));\n } catch {\n return Result.fail({\n message: `Could not read file: ${options.filePath}`,\n });\n }\n // originalFilename をサーバーに伝えるため Blob ではなく File で包む\n const fileName = basename(options.filePath);\n const file = new File([bytes], fileName, {\n type: mimeTypeFromFilename(fileName),\n });\n\n const fileField: { file: string } =\n // @ts-expect-error -- openapi-typescript が format: binary を string として生成するため File を渡せない\n { file };\n const uploaded = toResult(\n await ctx.client.POST(\n \"/projects/{projectName}/buckets/{bucketName}/objects\",\n {\n params: {\n path: { projectName: ctx.projectName, bucketName: options.bucket },\n },\n body: {\n ...fileField,\n ...(options.key !== undefined ? { key: options.key } : {}),\n },\n bodySerializer: multipartBodySerializer,\n },\n ),\n );\n if (Result.isFailure(uploaded)) return apiErrorFailure(uploaded.error);\n\n const value = uploaded.value;\n return Result.succeed({\n json: value,\n text: () =>\n renderDetail([\n [\"Uploaded\", value.key],\n [\"Original filename\", value.originalFilename],\n [\"Size\", String(value.size)],\n [\"Type\", value.type],\n [\"Public URL\", value.publicUrl ?? \"-\"],\n ]),\n });\n}\n\nconst uploadArgs = {\n ...contextArgs,\n bucket: {\n type: \"positional\",\n required: true,\n description: \"Bucket name\",\n },\n file: {\n type: \"positional\",\n required: true,\n description: \"Path to the local file to upload\",\n },\n key: {\n type: \"string\",\n description: \"Object key (generated by the server when omitted)\",\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"upload\",\n description: \"Upload a file to a bucket\",\n },\n args: uploadArgs,\n run: ({ args }) =>\n runWithContext(args, (ctx) =>\n bucketObjectUploadHandler(ctx, {\n bucket: args.bucket,\n filePath: args.file,\n key: typeof args.key === \"string\" ? args.key : undefined,\n }),\n ),\n});\n"],"mappings":";;;;;;;;;;AACA,SAAgB,wBACd,MACU;CACV,MAAM,WAAW,IAAI,SAAS;CAC9B,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,IAAI,GAAG;EAC/C,IAAI,UAAU,QAAW;EACzB,SAAS,OAAO,KAAK,KAAK;CAC5B;CACA,OAAO;AACT;;;;ACNA,SAAgB,qBAAqB,UAAsC;CACzE,MAAM,WAAW,UAAU,OAAO,QAAQ;CAC1C,OAAO,aAAa,QAAQ,SAAY;AAC1C;;;;ACUA,eAAsB,0BACpB,KACA,SACmE;CAEnE,IAAI;CACJ,IAAI;EACF,QAAQ,IAAI,WAAW,MAAM,SAAS,QAAQ,QAAQ,CAAC;CACzD,QAAQ;EACN,OAAO,OAAO,KAAK,EACjB,SAAS,wBAAwB,QAAQ,WAC3C,CAAC;CACH;CAEA,MAAM,WAAW,SAAS,QAAQ,QAAQ;CAK1C,MAAM,YAEJ,EAAE,UANa,KAAK,CAAC,KAAK,GAAG,UAAU,EACvC,MAAM,qBAAqB,QAAQ,EACrC,CAIO,EAAE;CACT,MAAM,WAAW,SACf,MAAM,IAAI,OAAO,KACf,wDACA;EACE,QAAQ,EACN,MAAM;GAAE,aAAa,IAAI;GAAa,YAAY,QAAQ;EAAO,EACnE;EACA,MAAM;GACJ,GAAG;GACH,GAAI,QAAQ,QAAQ,SAAY,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC;EAC1D;EACA,gBAAgB;CAClB,CACF,CACF;CACA,IAAI,OAAO,UAAU,QAAQ,GAAG,OAAO,gBAAgB,SAAS,KAAK;CAErE,MAAM,QAAQ,SAAS;CACvB,OAAO,OAAO,QAAQ;EACpB,MAAM;EACN,YACE,aAAa;GACX,CAAC,YAAY,MAAM,GAAG;GACtB,CAAC,qBAAqB,MAAM,gBAAgB;GAC5C,CAAC,QAAQ,OAAO,MAAM,IAAI,CAAC;GAC3B,CAAC,QAAQ,MAAM,IAAI;GACnB,CAAC,cAAc,MAAM,aAAa,GAAG;EACvC,CAAC;CACL,CAAC;AACH;AAEA,MAAM,aAAa;CACjB,GAAG;CACH,QAAQ;EACN,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,MAAM;EACJ,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,KAAK;EACH,MAAM;EACN,aAAa;CACf;AACF;AAEA,qBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,MAAM,EAAE,WACN,eAAe,OAAO,QACpB,0BAA0B,KAAK;EAC7B,QAAQ,KAAK;EACb,UAAU,KAAK;EACf,KAAK,OAAO,KAAK,QAAQ,WAAW,KAAK,MAAM;CACjD,CAAC,CACH;AACJ,CAAC"}
|