@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":"delete-XWJRhBFs.mjs","names":[],"sources":["../src/cli/commands/key/management/delete.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 { confirmDeletion } from \"../../confirm-delete.js\";\nimport { parsePositionalId } from \"../../parse.js\";\n\nexport async function keyManagementDeleteHandler(\n ctx: CommandContext,\n options: { id: number; yes: boolean },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const confirmed = await confirmDeletion(\n `management key ${options.id}`,\n options.yes,\n );\n if (Result.isFailure(confirmed)) return confirmed;\n\n const deleted = toResult(\n await ctx.client.DELETE(\n \"/projects/{projectName}/management-keys/{projectManagementKeyId}\",\n {\n params: {\n path: {\n projectName: ctx.projectName,\n projectManagementKeyId: options.id,\n },\n },\n },\n ),\n );\n if (Result.isFailure(deleted)) return apiErrorFailure(deleted.error);\n\n return Result.succeed({\n json: { deleted: true, id: options.id },\n text: () => `Deleted management key ${options.id}.`,\n });\n}\n\nconst deleteArgs = {\n ...contextArgs,\n id: {\n type: \"positional\",\n required: true,\n description: \"Numeric management key ID\",\n },\n yes: {\n type: \"boolean\",\n description: \"Skip the confirmation prompt\",\n default: false,\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"delete\",\n description: \"Delete a management key\",\n },\n args: deleteArgs,\n run: async ({ args }) => {\n const id = parsePositionalId(\"management key ID\", args.id);\n if (Result.isFailure(id)) return id;\n\n return runWithContext(args, (ctx) =>\n keyManagementDeleteHandler(ctx, { id: id.value, yes: args.yes === true }),\n );\n },\n});\n"],"mappings":";;;;;;;;AAcA,eAAsB,2BACpB,KACA,SACmE;CACnE,MAAM,YAAY,MAAM,gBACtB,kBAAkB,QAAQ,MAC1B,QAAQ,GACV;CACA,IAAI,OAAO,UAAU,SAAS,GAAG,OAAO;CAExC,MAAM,UAAU,SACd,MAAM,IAAI,OAAO,OACf,oEACA,EACE,QAAQ,EACN,MAAM;EACJ,aAAa,IAAI;EACjB,wBAAwB,QAAQ;CAClC,EACF,EACF,CACF,CACF;CACA,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO,gBAAgB,QAAQ,KAAK;CAEnE,OAAO,OAAO,QAAQ;EACpB,MAAM;GAAE,SAAS;GAAM,IAAI,QAAQ;EAAG;EACtC,YAAY,0BAA0B,QAAQ,GAAG;CACnD,CAAC;AACH;AAEA,MAAM,aAAa;CACjB,GAAG;CACH,IAAI;EACF,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,KAAK;EACH,MAAM;EACN,aAAa;EACb,SAAS;CACX;AACF;AAEA,qBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,KAAK,OAAO,EAAE,WAAW;EACvB,MAAM,KAAK,kBAAkB,qBAAqB,KAAK,EAAE;EACzD,IAAI,OAAO,UAAU,EAAE,GAAG,OAAO;EAEjC,OAAO,eAAe,OAAO,QAC3B,2BAA2B,KAAK;GAAE,IAAI,GAAG;GAAO,KAAK,KAAK,QAAQ;EAAK,CAAC,CAC1E;CACF;AACF,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
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 confirmDeletion } from "./confirm-delete-CsWkW69-.mjs";
|
|
5
|
+
import { u as parsePositionalId } from "./parse-DA0k5AHa.mjs";
|
|
6
|
+
import { Result } from "@praha/byethrow";
|
|
7
|
+
|
|
8
|
+
//#region src/cli/commands/key/consumer/delete.ts
|
|
9
|
+
async function keyConsumerDeleteHandler(ctx, options) {
|
|
10
|
+
const confirmed = await confirmDeletion(`consumer key ${options.id}`, options.yes);
|
|
11
|
+
if (Result.isFailure(confirmed)) return confirmed;
|
|
12
|
+
const deleted = toResult(await ctx.client.DELETE("/projects/{projectName}/consumer-keys/{projectConsumerKeyId}", { params: { path: {
|
|
13
|
+
projectName: ctx.projectName,
|
|
14
|
+
projectConsumerKeyId: options.id
|
|
15
|
+
} } }));
|
|
16
|
+
if (Result.isFailure(deleted)) return apiErrorFailure(deleted.error);
|
|
17
|
+
return Result.succeed({
|
|
18
|
+
json: {
|
|
19
|
+
deleted: true,
|
|
20
|
+
id: options.id
|
|
21
|
+
},
|
|
22
|
+
text: () => `Deleted consumer key ${options.id}.`
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
const deleteArgs = {
|
|
26
|
+
...contextArgs,
|
|
27
|
+
id: {
|
|
28
|
+
type: "positional",
|
|
29
|
+
required: true,
|
|
30
|
+
description: "Numeric consumer key ID"
|
|
31
|
+
},
|
|
32
|
+
yes: {
|
|
33
|
+
type: "boolean",
|
|
34
|
+
description: "Skip the confirmation prompt",
|
|
35
|
+
default: false
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var delete_default = defineCommand({
|
|
39
|
+
meta: {
|
|
40
|
+
name: "delete",
|
|
41
|
+
description: "Delete a consumer key"
|
|
42
|
+
},
|
|
43
|
+
args: deleteArgs,
|
|
44
|
+
run: async ({ args }) => {
|
|
45
|
+
const id = parsePositionalId("consumer key ID", args.id);
|
|
46
|
+
if (Result.isFailure(id)) return id;
|
|
47
|
+
return runWithContext(args, (ctx) => keyConsumerDeleteHandler(ctx, {
|
|
48
|
+
id: id.value,
|
|
49
|
+
yes: args.yes === true
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
//#endregion
|
|
55
|
+
export { delete_default as default };
|
|
56
|
+
//# sourceMappingURL=delete-YYh_0khQ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-YYh_0khQ.mjs","names":[],"sources":["../src/cli/commands/key/consumer/delete.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 { confirmDeletion } from \"../../confirm-delete.js\";\nimport { parsePositionalId } from \"../../parse.js\";\n\nexport async function keyConsumerDeleteHandler(\n ctx: CommandContext,\n options: { id: number; yes: boolean },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const confirmed = await confirmDeletion(\n `consumer key ${options.id}`,\n options.yes,\n );\n if (Result.isFailure(confirmed)) return confirmed;\n\n const deleted = toResult(\n await ctx.client.DELETE(\n \"/projects/{projectName}/consumer-keys/{projectConsumerKeyId}\",\n {\n params: {\n path: {\n projectName: ctx.projectName,\n projectConsumerKeyId: options.id,\n },\n },\n },\n ),\n );\n if (Result.isFailure(deleted)) return apiErrorFailure(deleted.error);\n\n return Result.succeed({\n json: { deleted: true, id: options.id },\n text: () => `Deleted consumer key ${options.id}.`,\n });\n}\n\nconst deleteArgs = {\n ...contextArgs,\n id: {\n type: \"positional\",\n required: true,\n description: \"Numeric consumer key ID\",\n },\n yes: {\n type: \"boolean\",\n description: \"Skip the confirmation prompt\",\n default: false,\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"delete\",\n description: \"Delete a consumer key\",\n },\n args: deleteArgs,\n run: async ({ args }) => {\n const id = parsePositionalId(\"consumer key ID\", args.id);\n if (Result.isFailure(id)) return id;\n\n return runWithContext(args, (ctx) =>\n keyConsumerDeleteHandler(ctx, { id: id.value, yes: args.yes === true }),\n );\n },\n});\n"],"mappings":";;;;;;;;AAcA,eAAsB,yBACpB,KACA,SACmE;CACnE,MAAM,YAAY,MAAM,gBACtB,gBAAgB,QAAQ,MACxB,QAAQ,GACV;CACA,IAAI,OAAO,UAAU,SAAS,GAAG,OAAO;CAExC,MAAM,UAAU,SACd,MAAM,IAAI,OAAO,OACf,gEACA,EACE,QAAQ,EACN,MAAM;EACJ,aAAa,IAAI;EACjB,sBAAsB,QAAQ;CAChC,EACF,EACF,CACF,CACF;CACA,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO,gBAAgB,QAAQ,KAAK;CAEnE,OAAO,OAAO,QAAQ;EACpB,MAAM;GAAE,SAAS;GAAM,IAAI,QAAQ;EAAG;EACtC,YAAY,wBAAwB,QAAQ,GAAG;CACjD,CAAC;AACH;AAEA,MAAM,aAAa;CACjB,GAAG;CACH,IAAI;EACF,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,KAAK;EACH,MAAM;EACN,aAAa;EACb,SAAS;CACX;AACF;AAEA,qBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,KAAK,OAAO,EAAE,WAAW;EACvB,MAAM,KAAK,kBAAkB,mBAAmB,KAAK,EAAE;EACvD,IAAI,OAAO,UAAU,EAAE,GAAG,OAAO;EAEjC,OAAO,eAAe,OAAO,QAC3B,yBAAyB,KAAK;GAAE,IAAI,GAAG;GAAO,KAAK,KAAK,QAAQ;EAAK,CAAC,CACxE;CACF;AACF,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
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 confirmDeletion } from "./confirm-delete-CsWkW69-.mjs";
|
|
5
|
+
import { u as parsePositionalId } from "./parse-DA0k5AHa.mjs";
|
|
6
|
+
import { Result } from "@praha/byethrow";
|
|
7
|
+
|
|
8
|
+
//#region src/cli/commands/webhook/delete.ts
|
|
9
|
+
async function webhookDeleteHandler(ctx, options) {
|
|
10
|
+
const confirmed = await confirmDeletion(`webhook ${options.webhookId}`, options.yes);
|
|
11
|
+
if (Result.isFailure(confirmed)) return confirmed;
|
|
12
|
+
const deleted = toResult(await ctx.client.DELETE("/projects/{projectName}/webhooks/{webhookId}", { params: { path: {
|
|
13
|
+
projectName: ctx.projectName,
|
|
14
|
+
webhookId: options.webhookId
|
|
15
|
+
} } }));
|
|
16
|
+
if (Result.isFailure(deleted)) return apiErrorFailure(deleted.error);
|
|
17
|
+
return Result.succeed({
|
|
18
|
+
json: {
|
|
19
|
+
deleted: true,
|
|
20
|
+
id: options.webhookId
|
|
21
|
+
},
|
|
22
|
+
text: () => `Deleted webhook ${options.webhookId}.`
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
const deleteArgs = {
|
|
26
|
+
...contextArgs,
|
|
27
|
+
id: {
|
|
28
|
+
type: "positional",
|
|
29
|
+
required: true,
|
|
30
|
+
description: "Numeric webhook ID"
|
|
31
|
+
},
|
|
32
|
+
yes: {
|
|
33
|
+
type: "boolean",
|
|
34
|
+
description: "Skip the confirmation prompt",
|
|
35
|
+
default: false
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var delete_default = defineCommand({
|
|
39
|
+
meta: {
|
|
40
|
+
name: "delete",
|
|
41
|
+
description: "Delete a webhook"
|
|
42
|
+
},
|
|
43
|
+
args: deleteArgs,
|
|
44
|
+
run: async ({ args }) => {
|
|
45
|
+
const webhookId = parsePositionalId("webhook ID", args.id);
|
|
46
|
+
if (Result.isFailure(webhookId)) return webhookId;
|
|
47
|
+
return runWithContext(args, (ctx) => webhookDeleteHandler(ctx, {
|
|
48
|
+
webhookId: webhookId.value,
|
|
49
|
+
yes: args.yes === true
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
//#endregion
|
|
55
|
+
export { delete_default as default };
|
|
56
|
+
//# sourceMappingURL=delete-ZIifaG0i.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-ZIifaG0i.mjs","names":[],"sources":["../src/cli/commands/webhook/delete.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 { confirmDeletion } from \"../confirm-delete.js\";\nimport { parsePositionalId } from \"../parse.js\";\n\nexport async function webhookDeleteHandler(\n ctx: CommandContext,\n options: { webhookId: number; yes: boolean },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const confirmed = await confirmDeletion(\n `webhook ${options.webhookId}`,\n options.yes,\n );\n if (Result.isFailure(confirmed)) return confirmed;\n\n const deleted = toResult(\n await ctx.client.DELETE(\"/projects/{projectName}/webhooks/{webhookId}\", {\n params: {\n path: { projectName: ctx.projectName, webhookId: options.webhookId },\n },\n }),\n );\n if (Result.isFailure(deleted)) return apiErrorFailure(deleted.error);\n\n return Result.succeed({\n json: { deleted: true, id: options.webhookId },\n text: () => `Deleted webhook ${options.webhookId}.`,\n });\n}\n\nconst deleteArgs = {\n ...contextArgs,\n id: {\n type: \"positional\",\n required: true,\n description: \"Numeric webhook ID\",\n },\n yes: {\n type: \"boolean\",\n description: \"Skip the confirmation prompt\",\n default: false,\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"delete\",\n description: \"Delete a webhook\",\n },\n args: deleteArgs,\n run: async ({ args }) => {\n const webhookId = parsePositionalId(\"webhook ID\", args.id);\n if (Result.isFailure(webhookId)) return webhookId;\n\n return runWithContext(args, (ctx) =>\n webhookDeleteHandler(ctx, {\n webhookId: webhookId.value,\n yes: args.yes === true,\n }),\n );\n },\n});\n"],"mappings":";;;;;;;;AAcA,eAAsB,qBACpB,KACA,SACmE;CACnE,MAAM,YAAY,MAAM,gBACtB,WAAW,QAAQ,aACnB,QAAQ,GACV;CACA,IAAI,OAAO,UAAU,SAAS,GAAG,OAAO;CAExC,MAAM,UAAU,SACd,MAAM,IAAI,OAAO,OAAO,gDAAgD,EACtE,QAAQ,EACN,MAAM;EAAE,aAAa,IAAI;EAAa,WAAW,QAAQ;CAAU,EACrE,EACF,CAAC,CACH;CACA,IAAI,OAAO,UAAU,OAAO,GAAG,OAAO,gBAAgB,QAAQ,KAAK;CAEnE,OAAO,OAAO,QAAQ;EACpB,MAAM;GAAE,SAAS;GAAM,IAAI,QAAQ;EAAU;EAC7C,YAAY,mBAAmB,QAAQ,UAAU;CACnD,CAAC;AACH;AAEA,MAAM,aAAa;CACjB,GAAG;CACH,IAAI;EACF,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,KAAK;EACH,MAAM;EACN,aAAa;EACb,SAAS;CACX;AACF;AAEA,qBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,KAAK,OAAO,EAAE,WAAW;EACvB,MAAM,YAAY,kBAAkB,cAAc,KAAK,EAAE;EACzD,IAAI,OAAO,UAAU,SAAS,GAAG,OAAO;EAExC,OAAO,eAAe,OAAO,QAC3B,qBAAqB,KAAK;GACxB,WAAW,UAAU;GACrB,KAAK,KAAK,QAAQ;EACpB,CAAC,CACH;CACF;AACF,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/cli/ui/detail.ts
|
|
3
|
+
function renderDetail(entries) {
|
|
4
|
+
if (entries.length === 0) return "";
|
|
5
|
+
const width = Math.max(...entries.map(([label]) => label.length));
|
|
6
|
+
return entries.map(([label, value]) => `${label.padEnd(width)} ${value}`).join("\n");
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
//#endregion
|
|
10
|
+
Object.defineProperty(exports, 'renderDetail', {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: function () {
|
|
13
|
+
return renderDetail;
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
//# sourceMappingURL=detail-8CXNIhKw.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detail-8CXNIhKw.cjs","names":[],"sources":["../src/cli/ui/detail.ts"],"sourcesContent":["// get 系コマンドの単一リソース表示。ラベル幅を揃えた key/value の縦並び。\nexport function renderDetail(\n entries: [label: string, value: string][],\n): string {\n if (entries.length === 0) return \"\";\n const width = Math.max(...entries.map(([label]) => label.length));\n return entries\n .map(([label, value]) => `${label.padEnd(width)} ${value}`)\n .join(\"\\n\");\n}\n"],"mappings":";;AACA,SAAgB,aACd,SACQ;CACR,IAAI,QAAQ,WAAW,GAAG,OAAO;CACjC,MAAM,QAAQ,KAAK,IAAI,GAAG,QAAQ,KAAK,CAAC,WAAW,MAAM,MAAM,CAAC;CAChE,OAAO,QACJ,KAAK,CAAC,OAAO,WAAW,GAAG,MAAM,OAAO,KAAK,EAAE,IAAI,OAAO,CAAC,CAC3D,KAAK,IAAI;AACd"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
//#region src/cli/ui/detail.ts
|
|
2
|
+
function renderDetail(entries) {
|
|
3
|
+
if (entries.length === 0) return "";
|
|
4
|
+
const width = Math.max(...entries.map(([label]) => label.length));
|
|
5
|
+
return entries.map(([label, value]) => `${label.padEnd(width)} ${value}`).join("\n");
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
//#endregion
|
|
9
|
+
export { renderDetail as t };
|
|
10
|
+
//# sourceMappingURL=detail-DN5jCQ4N.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detail-DN5jCQ4N.mjs","names":[],"sources":["../src/cli/ui/detail.ts"],"sourcesContent":["// get 系コマンドの単一リソース表示。ラベル幅を揃えた key/value の縦並び。\nexport function renderDetail(\n entries: [label: string, value: string][],\n): string {\n if (entries.length === 0) return \"\";\n const width = Math.max(...entries.map(([label]) => label.length));\n return entries\n .map(([label, value]) => `${label.padEnd(width)} ${value}`)\n .join(\"\\n\");\n}\n"],"mappings":";AACA,SAAgB,aACd,SACQ;CACR,IAAI,QAAQ,WAAW,GAAG,OAAO;CACjC,MAAM,QAAQ,KAAK,IAAI,GAAG,QAAQ,KAAK,CAAC,WAAW,MAAM,MAAM,CAAC;CAChE,OAAO,QACJ,KAAK,CAAC,OAAO,WAAW,GAAG,MAAM,OAAO,KAAK,EAAE,IAAI,OAAO,CAAC,CAC3D,KAAK,IAAI;AACd"}
|
|
@@ -0,0 +1,68 @@
|
|
|
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 { Result } from "@praha/byethrow";
|
|
5
|
+
import { writeFile } from "node:fs/promises";
|
|
6
|
+
|
|
7
|
+
//#region src/cli/commands/bucket/object/download.ts
|
|
8
|
+
async function bucketObjectDownloadHandler(ctx, options) {
|
|
9
|
+
const output = options.output;
|
|
10
|
+
if (options.jsonMode && output === void 0) return Result.fail({ message: "--json requires --output for binary downloads." });
|
|
11
|
+
if (output === void 0 && options.stdoutIsTTY) return Result.fail({ message: "Refusing to write binary output to a terminal. Pass --output <file>, or pipe/redirect stdout." });
|
|
12
|
+
const object = toResult(await ctx.client.GET("/projects/{projectName}/buckets/{bucketName}/objects/{objectKey}", { params: { path: {
|
|
13
|
+
projectName: ctx.projectName,
|
|
14
|
+
bucketName: options.bucket,
|
|
15
|
+
objectKey: options.key
|
|
16
|
+
} } }));
|
|
17
|
+
if (Result.isFailure(object)) return apiErrorFailure(object.error);
|
|
18
|
+
const response = await globalThis.fetch(object.value.protectedUrl);
|
|
19
|
+
if (!response.ok) throw new Error(`Failed to download object ${options.key}: HTTP ${response.status}`);
|
|
20
|
+
const bytes = new Uint8Array(await response.arrayBuffer());
|
|
21
|
+
if (output !== void 0) {
|
|
22
|
+
await writeFile(output, bytes);
|
|
23
|
+
return Result.succeed({
|
|
24
|
+
json: {
|
|
25
|
+
...object.value,
|
|
26
|
+
savedTo: output
|
|
27
|
+
},
|
|
28
|
+
text: () => `Downloaded ${options.key} (${bytes.byteLength} bytes) to ${output}.`
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
process.stdout.write(bytes);
|
|
32
|
+
return Result.succeed(void 0);
|
|
33
|
+
}
|
|
34
|
+
const downloadArgs = {
|
|
35
|
+
...contextArgs,
|
|
36
|
+
bucket: {
|
|
37
|
+
type: "positional",
|
|
38
|
+
required: true,
|
|
39
|
+
description: "Bucket name"
|
|
40
|
+
},
|
|
41
|
+
key: {
|
|
42
|
+
type: "positional",
|
|
43
|
+
required: true,
|
|
44
|
+
description: "Object key"
|
|
45
|
+
},
|
|
46
|
+
output: {
|
|
47
|
+
type: "string",
|
|
48
|
+
description: "Output file path (writes bytes to stdout when omitted)"
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
var download_default = defineCommand({
|
|
52
|
+
meta: {
|
|
53
|
+
name: "download",
|
|
54
|
+
description: "Download a bucket object"
|
|
55
|
+
},
|
|
56
|
+
args: downloadArgs,
|
|
57
|
+
run: ({ args }) => runWithContext(args, (ctx) => bucketObjectDownloadHandler(ctx, {
|
|
58
|
+
bucket: args.bucket,
|
|
59
|
+
key: args.key,
|
|
60
|
+
output: typeof args.output === "string" ? args.output : void 0,
|
|
61
|
+
jsonMode: args.json === true,
|
|
62
|
+
stdoutIsTTY: process.stdout.isTTY === true
|
|
63
|
+
}))
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
//#endregion
|
|
67
|
+
export { download_default as default };
|
|
68
|
+
//# sourceMappingURL=download-oFGzg30E.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"download-oFGzg30E.mjs","names":[],"sources":["../src/cli/commands/bucket/object/download.ts"],"sourcesContent":["import { writeFile } from \"node:fs/promises\";\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\";\n\nexport async function bucketObjectDownloadHandler(\n ctx: CommandContext,\n options: {\n bucket: string;\n key: string;\n output?: string;\n jsonMode: boolean;\n stdoutIsTTY: boolean;\n },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const output = options.output;\n // --output なしのバイナリ stdout と --json の JSON stdout は両立しない\n if (options.jsonMode && output === undefined) {\n return Result.fail({\n message: \"--json requires --output for binary downloads.\",\n });\n }\n // 生バイナリを対話端末に書くと制御シーケンスで端末が壊れ、信用できない内容なら攻撃面にもなる。\n if (output === undefined && options.stdoutIsTTY) {\n return Result.fail({\n message:\n \"Refusing to write binary output to a terminal. Pass --output <file>, or pipe/redirect stdout.\",\n });\n }\n\n const object = toResult(\n await ctx.client.GET(\n \"/projects/{projectName}/buckets/{bucketName}/objects/{objectKey}\",\n {\n params: {\n path: {\n projectName: ctx.projectName,\n bucketName: options.bucket,\n objectKey: options.key,\n },\n },\n },\n ),\n );\n if (Result.isFailure(object)) return apiErrorFailure(object.error);\n\n // protectedUrl は署名クエリで認可されるため、認証ヘッダを付けず素の fetch で取得する\n const response = await globalThis.fetch(object.value.protectedUrl);\n if (!response.ok) {\n throw new Error(\n `Failed to download object ${options.key}: HTTP ${response.status}`,\n );\n }\n const bytes = new Uint8Array(await response.arrayBuffer());\n\n if (output !== undefined) {\n await writeFile(output, bytes);\n return Result.succeed({\n json: { ...object.value, savedTo: output },\n text: () =>\n `Downloaded ${options.key} (${bytes.byteLength} bytes) to ${output}.`,\n });\n }\n\n // バイナリは writeOutput(文字列前提の共通出口)を通すと壊れるため、ここだけ直接 stdout に書く\n process.stdout.write(bytes);\n return Result.succeed(undefined);\n}\n\nconst downloadArgs = {\n ...contextArgs,\n bucket: {\n type: \"positional\",\n required: true,\n description: \"Bucket name\",\n },\n key: {\n type: \"positional\",\n required: true,\n description: \"Object key\",\n },\n output: {\n type: \"string\",\n description: \"Output file path (writes bytes to stdout when omitted)\",\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"download\",\n description: \"Download a bucket object\",\n },\n args: downloadArgs,\n run: ({ args }) =>\n runWithContext(args, (ctx) =>\n bucketObjectDownloadHandler(ctx, {\n bucket: args.bucket,\n key: args.key,\n output: typeof args.output === \"string\" ? args.output : undefined,\n jsonMode: args.json === true,\n stdoutIsTTY: process.stdout.isTTY === true,\n }),\n ),\n});\n"],"mappings":";;;;;;;AAaA,eAAsB,4BACpB,KACA,SAOmE;CACnE,MAAM,SAAS,QAAQ;CAEvB,IAAI,QAAQ,YAAY,WAAW,QACjC,OAAO,OAAO,KAAK,EACjB,SAAS,iDACX,CAAC;CAGH,IAAI,WAAW,UAAa,QAAQ,aAClC,OAAO,OAAO,KAAK,EACjB,SACE,gGACJ,CAAC;CAGH,MAAM,SAAS,SACb,MAAM,IAAI,OAAO,IACf,oEACA,EACE,QAAQ,EACN,MAAM;EACJ,aAAa,IAAI;EACjB,YAAY,QAAQ;EACpB,WAAW,QAAQ;CACrB,EACF,EACF,CACF,CACF;CACA,IAAI,OAAO,UAAU,MAAM,GAAG,OAAO,gBAAgB,OAAO,KAAK;CAGjE,MAAM,WAAW,MAAM,WAAW,MAAM,OAAO,MAAM,YAAY;CACjE,IAAI,CAAC,SAAS,IACZ,MAAM,IAAI,MACR,6BAA6B,QAAQ,IAAI,SAAS,SAAS,QAC7D;CAEF,MAAM,QAAQ,IAAI,WAAW,MAAM,SAAS,YAAY,CAAC;CAEzD,IAAI,WAAW,QAAW;EACxB,MAAM,UAAU,QAAQ,KAAK;EAC7B,OAAO,OAAO,QAAQ;GACpB,MAAM;IAAE,GAAG,OAAO;IAAO,SAAS;GAAO;GACzC,YACE,cAAc,QAAQ,IAAI,IAAI,MAAM,WAAW,aAAa,OAAO;EACvE,CAAC;CACH;CAGA,QAAQ,OAAO,MAAM,KAAK;CAC1B,OAAO,OAAO,QAAQ,MAAS;AACjC;AAEA,MAAM,eAAe;CACnB,GAAG;CACH,QAAQ;EACN,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,KAAK;EACH,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,QAAQ;EACN,MAAM;EACN,aAAa;CACf;AACF;AAEA,uBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,MAAM,EAAE,WACN,eAAe,OAAO,QACpB,4BAA4B,KAAK;EAC/B,QAAQ,KAAK;EACb,KAAK,KAAK;EACV,QAAQ,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS;EACxD,UAAU,KAAK,SAAS;EACxB,aAAa,QAAQ,OAAO,UAAU;CACxC,CAAC,CACH;AACJ,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
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
|
+
let _praha_byethrow = require("@praha/byethrow");
|
|
5
|
+
let node_fs_promises = require("node:fs/promises");
|
|
6
|
+
|
|
7
|
+
//#region src/cli/commands/bucket/object/download.ts
|
|
8
|
+
async function bucketObjectDownloadHandler(ctx, options) {
|
|
9
|
+
const output = options.output;
|
|
10
|
+
if (options.jsonMode && output === void 0) return _praha_byethrow.Result.fail({ message: "--json requires --output for binary downloads." });
|
|
11
|
+
if (output === void 0 && options.stdoutIsTTY) return _praha_byethrow.Result.fail({ message: "Refusing to write binary output to a terminal. Pass --output <file>, or pipe/redirect stdout." });
|
|
12
|
+
const object = require_run_with_context.toResult(await ctx.client.GET("/projects/{projectName}/buckets/{bucketName}/objects/{objectKey}", { params: { path: {
|
|
13
|
+
projectName: ctx.projectName,
|
|
14
|
+
bucketName: options.bucket,
|
|
15
|
+
objectKey: options.key
|
|
16
|
+
} } }));
|
|
17
|
+
if (_praha_byethrow.Result.isFailure(object)) return require_run_with_context.apiErrorFailure(object.error);
|
|
18
|
+
const response = await globalThis.fetch(object.value.protectedUrl);
|
|
19
|
+
if (!response.ok) throw new Error(`Failed to download object ${options.key}: HTTP ${response.status}`);
|
|
20
|
+
const bytes = new Uint8Array(await response.arrayBuffer());
|
|
21
|
+
if (output !== void 0) {
|
|
22
|
+
await (0, node_fs_promises.writeFile)(output, bytes);
|
|
23
|
+
return _praha_byethrow.Result.succeed({
|
|
24
|
+
json: {
|
|
25
|
+
...object.value,
|
|
26
|
+
savedTo: output
|
|
27
|
+
},
|
|
28
|
+
text: () => `Downloaded ${options.key} (${bytes.byteLength} bytes) to ${output}.`
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
process.stdout.write(bytes);
|
|
32
|
+
return _praha_byethrow.Result.succeed(void 0);
|
|
33
|
+
}
|
|
34
|
+
const downloadArgs = {
|
|
35
|
+
...require_shared.contextArgs,
|
|
36
|
+
bucket: {
|
|
37
|
+
type: "positional",
|
|
38
|
+
required: true,
|
|
39
|
+
description: "Bucket name"
|
|
40
|
+
},
|
|
41
|
+
key: {
|
|
42
|
+
type: "positional",
|
|
43
|
+
required: true,
|
|
44
|
+
description: "Object key"
|
|
45
|
+
},
|
|
46
|
+
output: {
|
|
47
|
+
type: "string",
|
|
48
|
+
description: "Output file path (writes bytes to stdout when omitted)"
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
var download_default = require_cli_main.defineCommand({
|
|
52
|
+
meta: {
|
|
53
|
+
name: "download",
|
|
54
|
+
description: "Download a bucket object"
|
|
55
|
+
},
|
|
56
|
+
args: downloadArgs,
|
|
57
|
+
run: ({ args }) => require_run_with_context.runWithContext(args, (ctx) => bucketObjectDownloadHandler(ctx, {
|
|
58
|
+
bucket: args.bucket,
|
|
59
|
+
key: args.key,
|
|
60
|
+
output: typeof args.output === "string" ? args.output : void 0,
|
|
61
|
+
jsonMode: args.json === true,
|
|
62
|
+
stdoutIsTTY: process.stdout.isTTY === true
|
|
63
|
+
}))
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
//#endregion
|
|
67
|
+
exports.default = download_default;
|
|
68
|
+
//# sourceMappingURL=download-ogGbb3FU.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"download-ogGbb3FU.cjs","names":["Result","toResult","apiErrorFailure","contextArgs","defineCommand","runWithContext"],"sources":["../src/cli/commands/bucket/object/download.ts"],"sourcesContent":["import { writeFile } from \"node:fs/promises\";\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\";\n\nexport async function bucketObjectDownloadHandler(\n ctx: CommandContext,\n options: {\n bucket: string;\n key: string;\n output?: string;\n jsonMode: boolean;\n stdoutIsTTY: boolean;\n },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const output = options.output;\n // --output なしのバイナリ stdout と --json の JSON stdout は両立しない\n if (options.jsonMode && output === undefined) {\n return Result.fail({\n message: \"--json requires --output for binary downloads.\",\n });\n }\n // 生バイナリを対話端末に書くと制御シーケンスで端末が壊れ、信用できない内容なら攻撃面にもなる。\n if (output === undefined && options.stdoutIsTTY) {\n return Result.fail({\n message:\n \"Refusing to write binary output to a terminal. Pass --output <file>, or pipe/redirect stdout.\",\n });\n }\n\n const object = toResult(\n await ctx.client.GET(\n \"/projects/{projectName}/buckets/{bucketName}/objects/{objectKey}\",\n {\n params: {\n path: {\n projectName: ctx.projectName,\n bucketName: options.bucket,\n objectKey: options.key,\n },\n },\n },\n ),\n );\n if (Result.isFailure(object)) return apiErrorFailure(object.error);\n\n // protectedUrl は署名クエリで認可されるため、認証ヘッダを付けず素の fetch で取得する\n const response = await globalThis.fetch(object.value.protectedUrl);\n if (!response.ok) {\n throw new Error(\n `Failed to download object ${options.key}: HTTP ${response.status}`,\n );\n }\n const bytes = new Uint8Array(await response.arrayBuffer());\n\n if (output !== undefined) {\n await writeFile(output, bytes);\n return Result.succeed({\n json: { ...object.value, savedTo: output },\n text: () =>\n `Downloaded ${options.key} (${bytes.byteLength} bytes) to ${output}.`,\n });\n }\n\n // バイナリは writeOutput(文字列前提の共通出口)を通すと壊れるため、ここだけ直接 stdout に書く\n process.stdout.write(bytes);\n return Result.succeed(undefined);\n}\n\nconst downloadArgs = {\n ...contextArgs,\n bucket: {\n type: \"positional\",\n required: true,\n description: \"Bucket name\",\n },\n key: {\n type: \"positional\",\n required: true,\n description: \"Object key\",\n },\n output: {\n type: \"string\",\n description: \"Output file path (writes bytes to stdout when omitted)\",\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"download\",\n description: \"Download a bucket object\",\n },\n args: downloadArgs,\n run: ({ args }) =>\n runWithContext(args, (ctx) =>\n bucketObjectDownloadHandler(ctx, {\n bucket: args.bucket,\n key: args.key,\n output: typeof args.output === \"string\" ? args.output : undefined,\n jsonMode: args.json === true,\n stdoutIsTTY: process.stdout.isTTY === true,\n }),\n ),\n});\n"],"mappings":";;;;;;;AAaA,eAAsB,4BACpB,KACA,SAOmE;CACnE,MAAM,SAAS,QAAQ;CAEvB,IAAI,QAAQ,YAAY,WAAW,QACjC,OAAOA,uBAAO,KAAK,EACjB,SAAS,iDACX,CAAC;CAGH,IAAI,WAAW,UAAa,QAAQ,aAClC,OAAOA,uBAAO,KAAK,EACjB,SACE,gGACJ,CAAC;CAGH,MAAM,SAASC,kCACb,MAAM,IAAI,OAAO,IACf,oEACA,EACE,QAAQ,EACN,MAAM;EACJ,aAAa,IAAI;EACjB,YAAY,QAAQ;EACpB,WAAW,QAAQ;CACrB,EACF,EACF,CACF,CACF;CACA,IAAID,uBAAO,UAAU,MAAM,GAAG,OAAOE,yCAAgB,OAAO,KAAK;CAGjE,MAAM,WAAW,MAAM,WAAW,MAAM,OAAO,MAAM,YAAY;CACjE,IAAI,CAAC,SAAS,IACZ,MAAM,IAAI,MACR,6BAA6B,QAAQ,IAAI,SAAS,SAAS,QAC7D;CAEF,MAAM,QAAQ,IAAI,WAAW,MAAM,SAAS,YAAY,CAAC;CAEzD,IAAI,WAAW,QAAW;EACxB,sCAAgB,QAAQ,KAAK;EAC7B,OAAOF,uBAAO,QAAQ;GACpB,MAAM;IAAE,GAAG,OAAO;IAAO,SAAS;GAAO;GACzC,YACE,cAAc,QAAQ,IAAI,IAAI,MAAM,WAAW,aAAa,OAAO;EACvE,CAAC;CACH;CAGA,QAAQ,OAAO,MAAM,KAAK;CAC1B,OAAOA,uBAAO,QAAQ,MAAS;AACjC;AAEA,MAAM,eAAe;CACnB,GAAGG;CACH,QAAQ;EACN,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,KAAK;EACH,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,QAAQ;EACN,MAAM;EACN,aAAa;CACf;AACF;AAEA,uBAAeC,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,MAAM,EAAE,WACNC,wCAAe,OAAO,QACpB,4BAA4B,KAAK;EAC/B,QAAQ,KAAK;EACb,KAAK,KAAK;EACV,QAAQ,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS;EACxD,UAAU,KAAK,SAAS;EACxB,aAAa,QAAQ,OAAO,UAAU;CACxC,CAAC,CACH;AACJ,CAAC"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
const require_cli_main = require('./cli/main.cjs');
|
|
2
|
+
const require_shared = require('./shared-DHRPzzKl.cjs');
|
|
3
|
+
const require_config_loader = require('./config-loader-D8x32gEU.cjs');
|
|
4
|
+
let _praha_byethrow = require("@praha/byethrow");
|
|
5
|
+
let node_fs_promises = require("node:fs/promises");
|
|
6
|
+
let node_path = require("node:path");
|
|
7
|
+
node_path = require_cli_main.__toESM(node_path, 1);
|
|
8
|
+
|
|
9
|
+
//#region src/cli/erd.ts
|
|
10
|
+
const RELATION = {
|
|
11
|
+
ONE_TO_MANY: "||--o{",
|
|
12
|
+
ONE_TO_ONE: "||--||"
|
|
13
|
+
};
|
|
14
|
+
function convertToInput(config) {
|
|
15
|
+
const tables = [];
|
|
16
|
+
const relations = [];
|
|
17
|
+
for (const table of config.tables) {
|
|
18
|
+
const modules = [];
|
|
19
|
+
const erdTable = {
|
|
20
|
+
name: table.name,
|
|
21
|
+
columns: []
|
|
22
|
+
};
|
|
23
|
+
for (const column of table.columns) {
|
|
24
|
+
erdTable.columns.push({
|
|
25
|
+
name: column.name,
|
|
26
|
+
type: column.type,
|
|
27
|
+
isForeignKey: column.type === "reference"
|
|
28
|
+
});
|
|
29
|
+
if (column.type === "reference") relations.push({
|
|
30
|
+
from: column.tableName,
|
|
31
|
+
to: table.name,
|
|
32
|
+
type: RELATION.ONE_TO_MANY,
|
|
33
|
+
comment: "reference"
|
|
34
|
+
});
|
|
35
|
+
if (column.type === "module" || column.type === "module-array") {
|
|
36
|
+
const module = config.tableModules.find((m) => m.name === column.moduleName);
|
|
37
|
+
if (!module) continue;
|
|
38
|
+
const moduleTableName = `${table.name}_${column.name}_${column.moduleName}`;
|
|
39
|
+
modules.push({
|
|
40
|
+
name: moduleTableName,
|
|
41
|
+
columns: module.columns.map((c) => ({
|
|
42
|
+
name: c.name,
|
|
43
|
+
type: c.type,
|
|
44
|
+
isForeignKey: c.type === "reference"
|
|
45
|
+
}))
|
|
46
|
+
});
|
|
47
|
+
relations.push({
|
|
48
|
+
from: table.name,
|
|
49
|
+
to: moduleTableName,
|
|
50
|
+
type: column.type === "module" ? RELATION.ONE_TO_ONE : RELATION.ONE_TO_MANY,
|
|
51
|
+
comment: column.type === "module" ? "module" : "module-array"
|
|
52
|
+
});
|
|
53
|
+
for (const moduleColumn of module.columns) if (moduleColumn.type === "reference") relations.push({
|
|
54
|
+
from: moduleTableName,
|
|
55
|
+
to: moduleColumn.tableName,
|
|
56
|
+
type: RELATION.ONE_TO_MANY,
|
|
57
|
+
comment: "reference"
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
tables.push(erdTable);
|
|
62
|
+
tables.push(...modules);
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
tables,
|
|
66
|
+
relations
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function renderMermaid(input) {
|
|
70
|
+
return `generated by @orizm/cli
|
|
71
|
+
|
|
72
|
+
\`\`\`mermaid
|
|
73
|
+
erDiagram
|
|
74
|
+
${input.tables.map((table) => {
|
|
75
|
+
const columns = [" id string PK", ...table.columns.map((col) => ` ${col.name} ${col.type}${col.isForeignKey ? " FK" : ""}`)].join("\n");
|
|
76
|
+
return ` ${table.name} {\n${columns}\n }`;
|
|
77
|
+
}).join("\n")}
|
|
78
|
+
|
|
79
|
+
${input.relations.map((rel) => ` ${rel.from} ${rel.type} ${rel.to} : ${rel.comment}`).join("\n")}
|
|
80
|
+
\`\`\``;
|
|
81
|
+
}
|
|
82
|
+
function generateErd(config) {
|
|
83
|
+
return renderMermaid(convertToInput(config));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
//#endregion
|
|
87
|
+
//#region src/cli/commands/schema/erd.ts
|
|
88
|
+
var erd_default = require_cli_main.defineCommand({
|
|
89
|
+
meta: {
|
|
90
|
+
name: "erd",
|
|
91
|
+
description: "Generate an ERD in Mermaid format from orizm.config.ts"
|
|
92
|
+
},
|
|
93
|
+
args: {
|
|
94
|
+
...require_shared.globalArgs,
|
|
95
|
+
"config-file": require_shared.configFileArg,
|
|
96
|
+
output: {
|
|
97
|
+
type: "string",
|
|
98
|
+
alias: "o",
|
|
99
|
+
description: "Output file path (defaults to stdout)"
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
run: async ({ args }) => {
|
|
103
|
+
const loaded = await require_config_loader.loadConfig(args["config-file"] ?? "orizm.config.ts");
|
|
104
|
+
if (_praha_byethrow.Result.isFailure(loaded)) return require_config_loader.configLoadFailure(loaded.error);
|
|
105
|
+
const mermaid = generateErd(loaded.value);
|
|
106
|
+
if (args.output != null && args.output !== "") {
|
|
107
|
+
const output = args.output;
|
|
108
|
+
await (0, node_fs_promises.mkdir)(node_path.default.dirname(output), { recursive: true });
|
|
109
|
+
await (0, node_fs_promises.writeFile)(output, mermaid + "\n", "utf-8");
|
|
110
|
+
return _praha_byethrow.Result.succeed({
|
|
111
|
+
json: { output },
|
|
112
|
+
text: () => `ERD written to ${output}`
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
return _praha_byethrow.Result.succeed({
|
|
116
|
+
json: { erd: mermaid },
|
|
117
|
+
text: () => mermaid
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
//#endregion
|
|
123
|
+
exports.default = erd_default;
|
|
124
|
+
//# sourceMappingURL=erd-lKC5NB2l.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"erd-lKC5NB2l.cjs","names":["defineCommand","globalArgs","configFileArg","loadConfig","Result","configLoadFailure","path"],"sources":["../src/cli/erd.ts","../src/cli/commands/schema/erd.ts"],"sourcesContent":["import { CommonOrizmConfig } from \"./types.js\";\n\ntype TableInput = {\n name: string;\n columns: ColumnInput[];\n};\n\ntype ColumnInput = {\n name: string;\n type: string;\n isForeignKey: boolean;\n};\n\ntype RelationInput = {\n from: string;\n to: string;\n type: string;\n comment: string;\n};\n\ntype TemplateInput = {\n tables: TableInput[];\n relations: RelationInput[];\n};\n\nconst RELATION = {\n ONE_TO_MANY: \"||--o{\",\n ONE_TO_ONE: \"||--||\",\n} as const;\n\nfunction convertToInput(config: CommonOrizmConfig): TemplateInput {\n const tables: TableInput[] = [];\n const relations: RelationInput[] = [];\n\n for (const table of config.tables) {\n const modules: TableInput[] = [];\n const erdTable: TableInput = { name: table.name, columns: [] };\n\n for (const column of table.columns) {\n erdTable.columns.push({\n name: column.name,\n type: column.type,\n isForeignKey: column.type === \"reference\",\n });\n\n if (column.type === \"reference\") {\n relations.push({\n from: column.tableName,\n to: table.name,\n type: RELATION.ONE_TO_MANY,\n comment: \"reference\",\n });\n }\n\n if (column.type === \"module\" || column.type === \"module-array\") {\n const module = config.tableModules.find(\n (m) => m.name === column.moduleName,\n );\n if (!module) {\n continue;\n }\n\n const moduleTableName = `${table.name}_${column.name}_${column.moduleName}`;\n modules.push({\n name: moduleTableName,\n columns: module.columns.map((c) => ({\n name: c.name,\n type: c.type,\n isForeignKey: c.type === \"reference\",\n })),\n });\n\n relations.push({\n from: table.name,\n to: moduleTableName,\n type:\n column.type === \"module\"\n ? RELATION.ONE_TO_ONE\n : RELATION.ONE_TO_MANY,\n comment: column.type === \"module\" ? \"module\" : \"module-array\",\n });\n\n for (const moduleColumn of module.columns) {\n if (moduleColumn.type === \"reference\") {\n relations.push({\n from: moduleTableName,\n to: moduleColumn.tableName,\n type: RELATION.ONE_TO_MANY,\n comment: \"reference\",\n });\n }\n }\n }\n }\n\n tables.push(erdTable);\n tables.push(...modules);\n }\n\n return { tables, relations };\n}\n\nfunction renderMermaid(input: TemplateInput): string {\n const tables = input.tables\n .map((table) => {\n const columns = [\n \" id string PK\",\n ...table.columns.map(\n (col) =>\n ` ${col.name} ${col.type}${col.isForeignKey ? \" FK\" : \"\"}`,\n ),\n ].join(\"\\n\");\n return ` ${table.name} {\\n${columns}\\n }`;\n })\n .join(\"\\n\");\n\n const relations = input.relations\n .map((rel) => ` ${rel.from} ${rel.type} ${rel.to} : ${rel.comment}`)\n .join(\"\\n\");\n\n return `generated by @orizm/cli\n\n\\`\\`\\`mermaid\nerDiagram\n${tables}\n\n${relations}\n\\`\\`\\``;\n}\n\nexport function generateErd(config: CommonOrizmConfig): string {\n return renderMermaid(convertToInput(config));\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Result } from \"@praha/byethrow\";\nimport { defineCommand } from \"../define-command.js\";\nimport { globalArgs, configFileArg, DEFAULT_CONFIG_FILE } from \"../shared.js\";\nimport { configLoadFailure } from \"../config-errors.js\";\nimport { loadConfig } from \"../../config-loader.js\";\nimport { generateErd } from \"../../erd.js\";\n\nexport default defineCommand({\n meta: {\n name: \"erd\",\n description: \"Generate an ERD in Mermaid format from orizm.config.ts\",\n },\n args: {\n ...globalArgs,\n \"config-file\": configFileArg,\n output: {\n type: \"string\",\n alias: \"o\",\n description: \"Output file path (defaults to stdout)\",\n },\n },\n run: async ({ args }) => {\n const loaded = await loadConfig(args[\"config-file\"] ?? DEFAULT_CONFIG_FILE);\n if (Result.isFailure(loaded)) return configLoadFailure(loaded.error);\n\n const mermaid = generateErd(loaded.value);\n\n if (args.output != null && args.output !== \"\") {\n const output = args.output;\n await mkdir(path.dirname(output), { recursive: true });\n await writeFile(output, mermaid + \"\\n\", \"utf-8\");\n return Result.succeed({\n json: { output },\n text: () => `ERD written to ${output}`,\n });\n }\n\n return Result.succeed({ json: { erd: mermaid }, text: () => mermaid });\n },\n});\n"],"mappings":";;;;;;;;;AAyBA,MAAM,WAAW;CACf,aAAa;CACb,YAAY;AACd;AAEA,SAAS,eAAe,QAA0C;CAChE,MAAM,SAAuB,CAAC;CAC9B,MAAM,YAA6B,CAAC;CAEpC,KAAK,MAAM,SAAS,OAAO,QAAQ;EACjC,MAAM,UAAwB,CAAC;EAC/B,MAAM,WAAuB;GAAE,MAAM,MAAM;GAAM,SAAS,CAAC;EAAE;EAE7D,KAAK,MAAM,UAAU,MAAM,SAAS;GAClC,SAAS,QAAQ,KAAK;IACpB,MAAM,OAAO;IACb,MAAM,OAAO;IACb,cAAc,OAAO,SAAS;GAChC,CAAC;GAED,IAAI,OAAO,SAAS,aAClB,UAAU,KAAK;IACb,MAAM,OAAO;IACb,IAAI,MAAM;IACV,MAAM,SAAS;IACf,SAAS;GACX,CAAC;GAGH,IAAI,OAAO,SAAS,YAAY,OAAO,SAAS,gBAAgB;IAC9D,MAAM,SAAS,OAAO,aAAa,MAChC,MAAM,EAAE,SAAS,OAAO,UAC3B;IACA,IAAI,CAAC,QACH;IAGF,MAAM,kBAAkB,GAAG,MAAM,KAAK,GAAG,OAAO,KAAK,GAAG,OAAO;IAC/D,QAAQ,KAAK;KACX,MAAM;KACN,SAAS,OAAO,QAAQ,KAAK,OAAO;MAClC,MAAM,EAAE;MACR,MAAM,EAAE;MACR,cAAc,EAAE,SAAS;KAC3B,EAAE;IACJ,CAAC;IAED,UAAU,KAAK;KACb,MAAM,MAAM;KACZ,IAAI;KACJ,MACE,OAAO,SAAS,WACZ,SAAS,aACT,SAAS;KACf,SAAS,OAAO,SAAS,WAAW,WAAW;IACjD,CAAC;IAED,KAAK,MAAM,gBAAgB,OAAO,SAChC,IAAI,aAAa,SAAS,aACxB,UAAU,KAAK;KACb,MAAM;KACN,IAAI,aAAa;KACjB,MAAM,SAAS;KACf,SAAS;IACX,CAAC;GAGP;EACF;EAEA,OAAO,KAAK,QAAQ;EACpB,OAAO,KAAK,GAAG,OAAO;CACxB;CAEA,OAAO;EAAE;EAAQ;CAAU;AAC7B;AAEA,SAAS,cAAc,OAA8B;CAkBnD,OAAO;;;;EAjBQ,MAAM,OAClB,KAAK,UAAU;EACd,MAAM,UAAU,CACd,wBACA,GAAG,MAAM,QAAQ,KACd,QACC,WAAW,IAAI,KAAK,GAAG,IAAI,OAAO,IAAI,eAAe,QAAQ,IACjE,CACF,CAAC,CAAC,KAAK,IAAI;EACX,OAAO,OAAO,MAAM,KAAK,MAAM,QAAQ;CACzC,CAAC,CAAC,CACD,KAAK,IAUH,EAAE;;EARW,MAAM,UACrB,KAAK,QAAQ,OAAO,IAAI,KAAK,GAAG,IAAI,KAAK,GAAG,IAAI,GAAG,KAAK,IAAI,SAAS,CAAC,CACtE,KAAK,IAQA,EAAE;;AAEZ;AAEA,SAAgB,YAAY,QAAmC;CAC7D,OAAO,cAAc,eAAe,MAAM,CAAC;AAC7C;;;;AC3HA,kBAAeA,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;EACJ,GAAGC;EACH,eAAeC;EACf,QAAQ;GACN,MAAM;GACN,OAAO;GACP,aAAa;EACf;CACF;CACA,KAAK,OAAO,EAAE,WAAW;EACvB,MAAM,SAAS,MAAMC,iCAAW,KAAK,mCAAqC;EAC1E,IAAIC,uBAAO,UAAU,MAAM,GAAG,OAAOC,wCAAkB,OAAO,KAAK;EAEnE,MAAM,UAAU,YAAY,OAAO,KAAK;EAExC,IAAI,KAAK,UAAU,QAAQ,KAAK,WAAW,IAAI;GAC7C,MAAM,SAAS,KAAK;GACpB,kCAAYC,kBAAK,QAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;GACrD,sCAAgB,QAAQ,UAAU,MAAM,OAAO;GAC/C,OAAOF,uBAAO,QAAQ;IACpB,MAAM,EAAE,OAAO;IACf,YAAY,kBAAkB;GAChC,CAAC;EACH;EAEA,OAAOA,uBAAO,QAAQ;GAAE,MAAM,EAAE,KAAK,QAAQ;GAAG,YAAY;EAAQ,CAAC;CACvE;AACF,CAAC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { t as defineCommand } from "./cli/main.mjs";
|
|
2
|
+
import { i as globalArgs, n as configFileArg, t as DEFAULT_CONFIG_FILE } from "./shared-CZZimGxc.mjs";
|
|
3
|
+
import { n as configLoadFailure, t as loadConfig } from "./config-loader-BEgS869e.mjs";
|
|
4
|
+
import { Result } from "@praha/byethrow";
|
|
5
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
|
|
8
|
+
//#region src/cli/erd.ts
|
|
9
|
+
const RELATION = {
|
|
10
|
+
ONE_TO_MANY: "||--o{",
|
|
11
|
+
ONE_TO_ONE: "||--||"
|
|
12
|
+
};
|
|
13
|
+
function convertToInput(config) {
|
|
14
|
+
const tables = [];
|
|
15
|
+
const relations = [];
|
|
16
|
+
for (const table of config.tables) {
|
|
17
|
+
const modules = [];
|
|
18
|
+
const erdTable = {
|
|
19
|
+
name: table.name,
|
|
20
|
+
columns: []
|
|
21
|
+
};
|
|
22
|
+
for (const column of table.columns) {
|
|
23
|
+
erdTable.columns.push({
|
|
24
|
+
name: column.name,
|
|
25
|
+
type: column.type,
|
|
26
|
+
isForeignKey: column.type === "reference"
|
|
27
|
+
});
|
|
28
|
+
if (column.type === "reference") relations.push({
|
|
29
|
+
from: column.tableName,
|
|
30
|
+
to: table.name,
|
|
31
|
+
type: RELATION.ONE_TO_MANY,
|
|
32
|
+
comment: "reference"
|
|
33
|
+
});
|
|
34
|
+
if (column.type === "module" || column.type === "module-array") {
|
|
35
|
+
const module = config.tableModules.find((m) => m.name === column.moduleName);
|
|
36
|
+
if (!module) continue;
|
|
37
|
+
const moduleTableName = `${table.name}_${column.name}_${column.moduleName}`;
|
|
38
|
+
modules.push({
|
|
39
|
+
name: moduleTableName,
|
|
40
|
+
columns: module.columns.map((c) => ({
|
|
41
|
+
name: c.name,
|
|
42
|
+
type: c.type,
|
|
43
|
+
isForeignKey: c.type === "reference"
|
|
44
|
+
}))
|
|
45
|
+
});
|
|
46
|
+
relations.push({
|
|
47
|
+
from: table.name,
|
|
48
|
+
to: moduleTableName,
|
|
49
|
+
type: column.type === "module" ? RELATION.ONE_TO_ONE : RELATION.ONE_TO_MANY,
|
|
50
|
+
comment: column.type === "module" ? "module" : "module-array"
|
|
51
|
+
});
|
|
52
|
+
for (const moduleColumn of module.columns) if (moduleColumn.type === "reference") relations.push({
|
|
53
|
+
from: moduleTableName,
|
|
54
|
+
to: moduleColumn.tableName,
|
|
55
|
+
type: RELATION.ONE_TO_MANY,
|
|
56
|
+
comment: "reference"
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
tables.push(erdTable);
|
|
61
|
+
tables.push(...modules);
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
tables,
|
|
65
|
+
relations
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function renderMermaid(input) {
|
|
69
|
+
return `generated by @orizm/cli
|
|
70
|
+
|
|
71
|
+
\`\`\`mermaid
|
|
72
|
+
erDiagram
|
|
73
|
+
${input.tables.map((table) => {
|
|
74
|
+
const columns = [" id string PK", ...table.columns.map((col) => ` ${col.name} ${col.type}${col.isForeignKey ? " FK" : ""}`)].join("\n");
|
|
75
|
+
return ` ${table.name} {\n${columns}\n }`;
|
|
76
|
+
}).join("\n")}
|
|
77
|
+
|
|
78
|
+
${input.relations.map((rel) => ` ${rel.from} ${rel.type} ${rel.to} : ${rel.comment}`).join("\n")}
|
|
79
|
+
\`\`\``;
|
|
80
|
+
}
|
|
81
|
+
function generateErd(config) {
|
|
82
|
+
return renderMermaid(convertToInput(config));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
//#endregion
|
|
86
|
+
//#region src/cli/commands/schema/erd.ts
|
|
87
|
+
var erd_default = defineCommand({
|
|
88
|
+
meta: {
|
|
89
|
+
name: "erd",
|
|
90
|
+
description: "Generate an ERD in Mermaid format from orizm.config.ts"
|
|
91
|
+
},
|
|
92
|
+
args: {
|
|
93
|
+
...globalArgs,
|
|
94
|
+
"config-file": configFileArg,
|
|
95
|
+
output: {
|
|
96
|
+
type: "string",
|
|
97
|
+
alias: "o",
|
|
98
|
+
description: "Output file path (defaults to stdout)"
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
run: async ({ args }) => {
|
|
102
|
+
const loaded = await loadConfig(args["config-file"] ?? "orizm.config.ts");
|
|
103
|
+
if (Result.isFailure(loaded)) return configLoadFailure(loaded.error);
|
|
104
|
+
const mermaid = generateErd(loaded.value);
|
|
105
|
+
if (args.output != null && args.output !== "") {
|
|
106
|
+
const output = args.output;
|
|
107
|
+
await mkdir(path.dirname(output), { recursive: true });
|
|
108
|
+
await writeFile(output, mermaid + "\n", "utf-8");
|
|
109
|
+
return Result.succeed({
|
|
110
|
+
json: { output },
|
|
111
|
+
text: () => `ERD written to ${output}`
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
return Result.succeed({
|
|
115
|
+
json: { erd: mermaid },
|
|
116
|
+
text: () => mermaid
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
//#endregion
|
|
122
|
+
export { erd_default as default };
|
|
123
|
+
//# sourceMappingURL=erd-zDoF6I_y.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"erd-zDoF6I_y.mjs","names":[],"sources":["../src/cli/erd.ts","../src/cli/commands/schema/erd.ts"],"sourcesContent":["import { CommonOrizmConfig } from \"./types.js\";\n\ntype TableInput = {\n name: string;\n columns: ColumnInput[];\n};\n\ntype ColumnInput = {\n name: string;\n type: string;\n isForeignKey: boolean;\n};\n\ntype RelationInput = {\n from: string;\n to: string;\n type: string;\n comment: string;\n};\n\ntype TemplateInput = {\n tables: TableInput[];\n relations: RelationInput[];\n};\n\nconst RELATION = {\n ONE_TO_MANY: \"||--o{\",\n ONE_TO_ONE: \"||--||\",\n} as const;\n\nfunction convertToInput(config: CommonOrizmConfig): TemplateInput {\n const tables: TableInput[] = [];\n const relations: RelationInput[] = [];\n\n for (const table of config.tables) {\n const modules: TableInput[] = [];\n const erdTable: TableInput = { name: table.name, columns: [] };\n\n for (const column of table.columns) {\n erdTable.columns.push({\n name: column.name,\n type: column.type,\n isForeignKey: column.type === \"reference\",\n });\n\n if (column.type === \"reference\") {\n relations.push({\n from: column.tableName,\n to: table.name,\n type: RELATION.ONE_TO_MANY,\n comment: \"reference\",\n });\n }\n\n if (column.type === \"module\" || column.type === \"module-array\") {\n const module = config.tableModules.find(\n (m) => m.name === column.moduleName,\n );\n if (!module) {\n continue;\n }\n\n const moduleTableName = `${table.name}_${column.name}_${column.moduleName}`;\n modules.push({\n name: moduleTableName,\n columns: module.columns.map((c) => ({\n name: c.name,\n type: c.type,\n isForeignKey: c.type === \"reference\",\n })),\n });\n\n relations.push({\n from: table.name,\n to: moduleTableName,\n type:\n column.type === \"module\"\n ? RELATION.ONE_TO_ONE\n : RELATION.ONE_TO_MANY,\n comment: column.type === \"module\" ? \"module\" : \"module-array\",\n });\n\n for (const moduleColumn of module.columns) {\n if (moduleColumn.type === \"reference\") {\n relations.push({\n from: moduleTableName,\n to: moduleColumn.tableName,\n type: RELATION.ONE_TO_MANY,\n comment: \"reference\",\n });\n }\n }\n }\n }\n\n tables.push(erdTable);\n tables.push(...modules);\n }\n\n return { tables, relations };\n}\n\nfunction renderMermaid(input: TemplateInput): string {\n const tables = input.tables\n .map((table) => {\n const columns = [\n \" id string PK\",\n ...table.columns.map(\n (col) =>\n ` ${col.name} ${col.type}${col.isForeignKey ? \" FK\" : \"\"}`,\n ),\n ].join(\"\\n\");\n return ` ${table.name} {\\n${columns}\\n }`;\n })\n .join(\"\\n\");\n\n const relations = input.relations\n .map((rel) => ` ${rel.from} ${rel.type} ${rel.to} : ${rel.comment}`)\n .join(\"\\n\");\n\n return `generated by @orizm/cli\n\n\\`\\`\\`mermaid\nerDiagram\n${tables}\n\n${relations}\n\\`\\`\\``;\n}\n\nexport function generateErd(config: CommonOrizmConfig): string {\n return renderMermaid(convertToInput(config));\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Result } from \"@praha/byethrow\";\nimport { defineCommand } from \"../define-command.js\";\nimport { globalArgs, configFileArg, DEFAULT_CONFIG_FILE } from \"../shared.js\";\nimport { configLoadFailure } from \"../config-errors.js\";\nimport { loadConfig } from \"../../config-loader.js\";\nimport { generateErd } from \"../../erd.js\";\n\nexport default defineCommand({\n meta: {\n name: \"erd\",\n description: \"Generate an ERD in Mermaid format from orizm.config.ts\",\n },\n args: {\n ...globalArgs,\n \"config-file\": configFileArg,\n output: {\n type: \"string\",\n alias: \"o\",\n description: \"Output file path (defaults to stdout)\",\n },\n },\n run: async ({ args }) => {\n const loaded = await loadConfig(args[\"config-file\"] ?? DEFAULT_CONFIG_FILE);\n if (Result.isFailure(loaded)) return configLoadFailure(loaded.error);\n\n const mermaid = generateErd(loaded.value);\n\n if (args.output != null && args.output !== \"\") {\n const output = args.output;\n await mkdir(path.dirname(output), { recursive: true });\n await writeFile(output, mermaid + \"\\n\", \"utf-8\");\n return Result.succeed({\n json: { output },\n text: () => `ERD written to ${output}`,\n });\n }\n\n return Result.succeed({ json: { erd: mermaid }, text: () => mermaid });\n },\n});\n"],"mappings":"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"}
|