@orizm/cli 3.0.1 → 3.1.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/dist/cli/main.cjs CHANGED
@@ -35,7 +35,7 @@ let valibot = require("valibot");
35
35
  valibot = __toESM(valibot, 1);
36
36
 
37
37
  //#region package.json
38
- var version$1 = "3.0.1";
38
+ var version$1 = "3.1.0";
39
39
 
40
40
  //#endregion
41
41
  //#region src/cli/version.ts
@@ -210,7 +210,7 @@ const main = defineCommand({
210
210
  schema: () => Promise.resolve().then(() => require("../schema-B3iRqvYK.cjs")).then((m) => m.default),
211
211
  key: () => Promise.resolve().then(() => require("../key-DQr7qRL2.cjs")).then((m) => m.default),
212
212
  "project-user": () => Promise.resolve().then(() => require("../project-user-Dm0qR-sh.cjs")).then((m) => m.default),
213
- webhook: () => Promise.resolve().then(() => require("../webhook-CVFmch5W.cjs")).then((m) => m.default),
213
+ webhook: () => Promise.resolve().then(() => require("../webhook-CbL4QaR5.cjs")).then((m) => m.default),
214
214
  content: () => Promise.resolve().then(() => require("../content-DMjSwor1.cjs")).then((m) => m.default),
215
215
  bucket: () => Promise.resolve().then(() => require("../bucket-mg5QQORh.cjs")).then((m) => m.default)
216
216
  }
package/dist/cli/main.mjs CHANGED
@@ -6,7 +6,7 @@ import { colors } from "consola/utils";
6
6
  import * as v from "valibot";
7
7
 
8
8
  //#region package.json
9
- var version$1 = "3.0.1";
9
+ var version$1 = "3.1.0";
10
10
 
11
11
  //#endregion
12
12
  //#region src/cli/version.ts
@@ -181,7 +181,7 @@ const main = defineCommand$1({
181
181
  schema: () => import("../schema-exG250MU.mjs").then((m) => m.default),
182
182
  key: () => import("../key-C71Ffll9.mjs").then((m) => m.default),
183
183
  "project-user": () => import("../project-user-Cp7i6orv.mjs").then((m) => m.default),
184
- webhook: () => import("../webhook-Cy850dNs.mjs").then((m) => m.default),
184
+ webhook: () => import("../webhook-CpZ1-Ho5.mjs").then((m) => m.default),
185
185
  content: () => import("../content-BOb6NC8M.mjs").then((m) => m.default),
186
186
  bucket: () => import("../bucket-DqW-WEYb.mjs").then((m) => m.default)
187
187
  }
@@ -4,7 +4,7 @@ const require_run_with_context = require('./run-with-context-DJNnEigg.cjs');
4
4
  const require_detail = require('./detail-8CXNIhKw.cjs');
5
5
  const require_parse = require('./parse-C8oHgQXx.cjs');
6
6
  const require_table_event = require('./table-event-DXkCK29f.cjs');
7
- const require_get = require('./get-BiPEF_m-.cjs');
7
+ const require_get = require('./get-DwtzBjGV.cjs');
8
8
  let _praha_byethrow = require("@praha/byethrow");
9
9
 
10
10
  //#region src/cli/commands/webhook/create.ts
@@ -78,4 +78,4 @@ var create_default = require_cli_main.defineCommand({
78
78
 
79
79
  //#endregion
80
80
  exports.default = create_default;
81
- //# sourceMappingURL=create-BvERyMKa.cjs.map
81
+ //# sourceMappingURL=create-CCsn7yp5.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-BvERyMKa.cjs","names":["toResult","Result","apiErrorFailure","renderDetail","formatTableEvents","formatCustomHeaders","contextArgs","defineCommand","parseHttpUrl","parseTableEvents","collectRepeatableFlag","parseHeaders","runWithContext"],"sources":["../src/cli/commands/webhook/create.ts"],"sourcesContent":["import type { ArgsDef } from \"citty\";\nimport { Result } from \"@praha/byethrow\";\nimport {\n defineCommand,\n type CommandFailure,\n type CommandOutput,\n} from \"../define-command.js\";\nimport { contextArgs } from \"../shared.js\";\nimport { runWithContext, type CommandContext } from \"../run-with-context.js\";\nimport { apiErrorFailure } from \"../api-errors.js\";\nimport { toResult } from \"../../api/errors.js\";\nimport { renderDetail } from \"../../ui/detail.js\";\nimport { collectRepeatableFlag, parseHeaders, parseHttpUrl } from \"../parse.js\";\nimport { formatCustomHeaders } from \"./get.js\";\nimport {\n formatTableEvents,\n parseTableEvents,\n type TableEvent,\n} from \"./table-event.js\";\n\nexport async function webhookCreateHandler(\n ctx: CommandContext,\n options: {\n name: string;\n url: string;\n tableEvents?: TableEvent[];\n customHeaders?: { key: string; value: string }[];\n },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const created = toResult(\n await ctx.client.POST(\"/projects/{projectName}/webhooks\", {\n params: { path: { projectName: ctx.projectName } },\n body: {\n name: options.name,\n url: options.url,\n ...(options.tableEvents !== undefined\n ? { tableEvents: options.tableEvents }\n : {}),\n ...(options.customHeaders !== undefined\n ? { customHeaders: options.customHeaders }\n : {}),\n },\n }),\n );\n if (Result.isFailure(created)) return apiErrorFailure(created.error);\n\n const value = created.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 ]),\n });\n}\n\nconst createArgs = {\n ...contextArgs,\n name: {\n type: \"string\",\n required: true,\n description: \"Webhook name\",\n },\n url: {\n type: \"string\",\n required: true,\n description: \"URL to notify\",\n },\n \"table-event\": {\n type: \"string\",\n description:\n \"Subscription as <table>:<event> (content.create, content.update, content.delete); repeatable\",\n },\n header: {\n type: \"string\",\n description: \"Custom header as <key>:<value>; repeatable\",\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"create\",\n description: \"Create a webhook\",\n },\n args: createArgs,\n run: async ({ args, rawArgs }) => {\n if (typeof args.name !== \"string\" || args.name === \"\") {\n return Result.fail({ message: \"Missing --name.\" });\n }\n const url = parseHttpUrl(\"url\", args.url);\n if (Result.isFailure(url)) return url;\n const tableEvents = parseTableEvents(\n \"table-event\",\n collectRepeatableFlag(rawArgs, \"table-event\"),\n );\n if (Result.isFailure(tableEvents)) return tableEvents;\n const customHeaders = parseHeaders(\n \"header\",\n collectRepeatableFlag(rawArgs, \"header\"),\n );\n if (Result.isFailure(customHeaders)) return customHeaders;\n\n const name = args.name;\n return runWithContext(args, (ctx) =>\n webhookCreateHandler(ctx, {\n name,\n url: url.value,\n tableEvents: tableEvents.value,\n customHeaders: customHeaders.value,\n }),\n );\n },\n});\n"],"mappings":";;;;;;;;;;AAoBA,eAAsB,qBACpB,KACA,SAMmE;CACnE,MAAM,UAAUA,kCACd,MAAM,IAAI,OAAO,KAAK,oCAAoC;EACxD,QAAQ,EAAE,MAAM,EAAE,aAAa,IAAI,YAAY,EAAE;EACjD,MAAM;GACJ,MAAM,QAAQ;GACd,KAAK,QAAQ;GACb,GAAI,QAAQ,gBAAgB,SACxB,EAAE,aAAa,QAAQ,YAAY,IACnC,CAAC;GACL,GAAI,QAAQ,kBAAkB,SAC1B,EAAE,eAAe,QAAQ,cAAc,IACvC,CAAC;EACP;CACF,CAAC,CACH;CACA,IAAIC,uBAAO,UAAU,OAAO,GAAG,OAAOC,yCAAgB,QAAQ,KAAK;CAEnE,MAAM,QAAQ,QAAQ;CACtB,OAAOD,uBAAO,QAAQ;EACpB,MAAM;EACN,YACEE,4BAAa;GACX,CAAC,MAAM,OAAO,MAAM,EAAE,CAAC;GACvB,CAAC,QAAQ,MAAM,IAAI;GACnB,CAAC,OAAO,MAAM,GAAG;GACjB,CAAC,gBAAgBC,sCAAkB,MAAM,WAAW,CAAC;GACrD,CAAC,kBAAkBC,gCAAoB,MAAM,aAAa,CAAC;EAC7D,CAAC;CACL,CAAC;AACH;AAEA,MAAM,aAAa;CACjB,GAAGC;CACH,MAAM;EACJ,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,KAAK;EACH,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,eAAe;EACb,MAAM;EACN,aACE;CACJ;CACA,QAAQ;EACN,MAAM;EACN,aAAa;CACf;AACF;AAEA,qBAAeC,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,KAAK,OAAO,EAAE,MAAM,cAAc;EAChC,IAAI,OAAO,KAAK,SAAS,YAAY,KAAK,SAAS,IACjD,OAAON,uBAAO,KAAK,EAAE,SAAS,kBAAkB,CAAC;EAEnD,MAAM,MAAMO,2BAAa,OAAO,KAAK,GAAG;EACxC,IAAIP,uBAAO,UAAU,GAAG,GAAG,OAAO;EAClC,MAAM,cAAcQ,qCAClB,eACAC,oCAAsB,SAAS,aAAa,CAC9C;EACA,IAAIT,uBAAO,UAAU,WAAW,GAAG,OAAO;EAC1C,MAAM,gBAAgBU,2BACpB,UACAD,oCAAsB,SAAS,QAAQ,CACzC;EACA,IAAIT,uBAAO,UAAU,aAAa,GAAG,OAAO;EAE5C,MAAM,OAAO,KAAK;EAClB,OAAOW,wCAAe,OAAO,QAC3B,qBAAqB,KAAK;GACxB;GACA,KAAK,IAAI;GACT,aAAa,YAAY;GACzB,eAAe,cAAc;EAC/B,CAAC,CACH;CACF;AACF,CAAC"}
1
+ {"version":3,"file":"create-CCsn7yp5.cjs","names":["toResult","Result","apiErrorFailure","renderDetail","formatTableEvents","formatCustomHeaders","contextArgs","defineCommand","parseHttpUrl","parseTableEvents","collectRepeatableFlag","parseHeaders","runWithContext"],"sources":["../src/cli/commands/webhook/create.ts"],"sourcesContent":["import type { ArgsDef } from \"citty\";\nimport { Result } from \"@praha/byethrow\";\nimport {\n defineCommand,\n type CommandFailure,\n type CommandOutput,\n} from \"../define-command.js\";\nimport { contextArgs } from \"../shared.js\";\nimport { runWithContext, type CommandContext } from \"../run-with-context.js\";\nimport { apiErrorFailure } from \"../api-errors.js\";\nimport { toResult } from \"../../api/errors.js\";\nimport { renderDetail } from \"../../ui/detail.js\";\nimport { collectRepeatableFlag, parseHeaders, parseHttpUrl } from \"../parse.js\";\nimport { formatCustomHeaders } from \"./get.js\";\nimport {\n formatTableEvents,\n parseTableEvents,\n type TableEvent,\n} from \"./table-event.js\";\n\nexport async function webhookCreateHandler(\n ctx: CommandContext,\n options: {\n name: string;\n url: string;\n tableEvents?: TableEvent[];\n customHeaders?: { key: string; value: string }[];\n },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const created = toResult(\n await ctx.client.POST(\"/projects/{projectName}/webhooks\", {\n params: { path: { projectName: ctx.projectName } },\n body: {\n name: options.name,\n url: options.url,\n ...(options.tableEvents !== undefined\n ? { tableEvents: options.tableEvents }\n : {}),\n ...(options.customHeaders !== undefined\n ? { customHeaders: options.customHeaders }\n : {}),\n },\n }),\n );\n if (Result.isFailure(created)) return apiErrorFailure(created.error);\n\n const value = created.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 ]),\n });\n}\n\nconst createArgs = {\n ...contextArgs,\n name: {\n type: \"string\",\n required: true,\n description: \"Webhook name\",\n },\n url: {\n type: \"string\",\n required: true,\n description: \"URL to notify\",\n },\n \"table-event\": {\n type: \"string\",\n description:\n \"Subscription as <table>:<event> (content.create, content.update, content.delete); repeatable\",\n },\n header: {\n type: \"string\",\n description: \"Custom header as <key>:<value>; repeatable\",\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"create\",\n description: \"Create a webhook\",\n },\n args: createArgs,\n run: async ({ args, rawArgs }) => {\n if (typeof args.name !== \"string\" || args.name === \"\") {\n return Result.fail({ message: \"Missing --name.\" });\n }\n const url = parseHttpUrl(\"url\", args.url);\n if (Result.isFailure(url)) return url;\n const tableEvents = parseTableEvents(\n \"table-event\",\n collectRepeatableFlag(rawArgs, \"table-event\"),\n );\n if (Result.isFailure(tableEvents)) return tableEvents;\n const customHeaders = parseHeaders(\n \"header\",\n collectRepeatableFlag(rawArgs, \"header\"),\n );\n if (Result.isFailure(customHeaders)) return customHeaders;\n\n const name = args.name;\n return runWithContext(args, (ctx) =>\n webhookCreateHandler(ctx, {\n name,\n url: url.value,\n tableEvents: tableEvents.value,\n customHeaders: customHeaders.value,\n }),\n );\n },\n});\n"],"mappings":";;;;;;;;;;AAoBA,eAAsB,qBACpB,KACA,SAMmE;CACnE,MAAM,UAAUA,kCACd,MAAM,IAAI,OAAO,KAAK,oCAAoC;EACxD,QAAQ,EAAE,MAAM,EAAE,aAAa,IAAI,YAAY,EAAE;EACjD,MAAM;GACJ,MAAM,QAAQ;GACd,KAAK,QAAQ;GACb,GAAI,QAAQ,gBAAgB,SACxB,EAAE,aAAa,QAAQ,YAAY,IACnC,CAAC;GACL,GAAI,QAAQ,kBAAkB,SAC1B,EAAE,eAAe,QAAQ,cAAc,IACvC,CAAC;EACP;CACF,CAAC,CACH;CACA,IAAIC,uBAAO,UAAU,OAAO,GAAG,OAAOC,yCAAgB,QAAQ,KAAK;CAEnE,MAAM,QAAQ,QAAQ;CACtB,OAAOD,uBAAO,QAAQ;EACpB,MAAM;EACN,YACEE,4BAAa;GACX,CAAC,MAAM,OAAO,MAAM,EAAE,CAAC;GACvB,CAAC,QAAQ,MAAM,IAAI;GACnB,CAAC,OAAO,MAAM,GAAG;GACjB,CAAC,gBAAgBC,sCAAkB,MAAM,WAAW,CAAC;GACrD,CAAC,kBAAkBC,gCAAoB,MAAM,aAAa,CAAC;EAC7D,CAAC;CACL,CAAC;AACH;AAEA,MAAM,aAAa;CACjB,GAAGC;CACH,MAAM;EACJ,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,KAAK;EACH,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,eAAe;EACb,MAAM;EACN,aACE;CACJ;CACA,QAAQ;EACN,MAAM;EACN,aAAa;CACf;AACF;AAEA,qBAAeC,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,KAAK,OAAO,EAAE,MAAM,cAAc;EAChC,IAAI,OAAO,KAAK,SAAS,YAAY,KAAK,SAAS,IACjD,OAAON,uBAAO,KAAK,EAAE,SAAS,kBAAkB,CAAC;EAEnD,MAAM,MAAMO,2BAAa,OAAO,KAAK,GAAG;EACxC,IAAIP,uBAAO,UAAU,GAAG,GAAG,OAAO;EAClC,MAAM,cAAcQ,qCAClB,eACAC,oCAAsB,SAAS,aAAa,CAC9C;EACA,IAAIT,uBAAO,UAAU,WAAW,GAAG,OAAO;EAC1C,MAAM,gBAAgBU,2BACpB,UACAD,oCAAsB,SAAS,QAAQ,CACzC;EACA,IAAIT,uBAAO,UAAU,aAAa,GAAG,OAAO;EAE5C,MAAM,OAAO,KAAK;EAClB,OAAOW,wCAAe,OAAO,QAC3B,qBAAqB,KAAK;GACxB;GACA,KAAK,IAAI;GACT,aAAa,YAAY;GACzB,eAAe,cAAc;EAC/B,CAAC,CACH;CACF;AACF,CAAC"}
@@ -4,7 +4,7 @@ import { a as apiErrorFailure, n as runWithContext, u as toResult } from "./run-
4
4
  import { t as renderDetail } from "./detail-DN5jCQ4N.mjs";
5
5
  import { a as parseHttpUrl, i as parseHeaders, t as collectRepeatableFlag } from "./parse-DA0k5AHa.mjs";
6
6
  import { i as parseTableEvents, n as formatTableEvents } from "./table-event-C7gORNlb.mjs";
7
- import { formatCustomHeaders } from "./get-RpxdnCKR.mjs";
7
+ import { formatCustomHeaders } from "./get-B6vBaq_D.mjs";
8
8
  import { Result } from "@praha/byethrow";
9
9
 
10
10
  //#region src/cli/commands/webhook/create.ts
@@ -78,4 +78,4 @@ var create_default = defineCommand({
78
78
 
79
79
  //#endregion
80
80
  export { create_default as default };
81
- //# sourceMappingURL=create-Dups0gV2.mjs.map
81
+ //# sourceMappingURL=create-D5suBd3J.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-Dups0gV2.mjs","names":[],"sources":["../src/cli/commands/webhook/create.ts"],"sourcesContent":["import type { ArgsDef } from \"citty\";\nimport { Result } from \"@praha/byethrow\";\nimport {\n defineCommand,\n type CommandFailure,\n type CommandOutput,\n} from \"../define-command.js\";\nimport { contextArgs } from \"../shared.js\";\nimport { runWithContext, type CommandContext } from \"../run-with-context.js\";\nimport { apiErrorFailure } from \"../api-errors.js\";\nimport { toResult } from \"../../api/errors.js\";\nimport { renderDetail } from \"../../ui/detail.js\";\nimport { collectRepeatableFlag, parseHeaders, parseHttpUrl } from \"../parse.js\";\nimport { formatCustomHeaders } from \"./get.js\";\nimport {\n formatTableEvents,\n parseTableEvents,\n type TableEvent,\n} from \"./table-event.js\";\n\nexport async function webhookCreateHandler(\n ctx: CommandContext,\n options: {\n name: string;\n url: string;\n tableEvents?: TableEvent[];\n customHeaders?: { key: string; value: string }[];\n },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const created = toResult(\n await ctx.client.POST(\"/projects/{projectName}/webhooks\", {\n params: { path: { projectName: ctx.projectName } },\n body: {\n name: options.name,\n url: options.url,\n ...(options.tableEvents !== undefined\n ? { tableEvents: options.tableEvents }\n : {}),\n ...(options.customHeaders !== undefined\n ? { customHeaders: options.customHeaders }\n : {}),\n },\n }),\n );\n if (Result.isFailure(created)) return apiErrorFailure(created.error);\n\n const value = created.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 ]),\n });\n}\n\nconst createArgs = {\n ...contextArgs,\n name: {\n type: \"string\",\n required: true,\n description: \"Webhook name\",\n },\n url: {\n type: \"string\",\n required: true,\n description: \"URL to notify\",\n },\n \"table-event\": {\n type: \"string\",\n description:\n \"Subscription as <table>:<event> (content.create, content.update, content.delete); repeatable\",\n },\n header: {\n type: \"string\",\n description: \"Custom header as <key>:<value>; repeatable\",\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"create\",\n description: \"Create a webhook\",\n },\n args: createArgs,\n run: async ({ args, rawArgs }) => {\n if (typeof args.name !== \"string\" || args.name === \"\") {\n return Result.fail({ message: \"Missing --name.\" });\n }\n const url = parseHttpUrl(\"url\", args.url);\n if (Result.isFailure(url)) return url;\n const tableEvents = parseTableEvents(\n \"table-event\",\n collectRepeatableFlag(rawArgs, \"table-event\"),\n );\n if (Result.isFailure(tableEvents)) return tableEvents;\n const customHeaders = parseHeaders(\n \"header\",\n collectRepeatableFlag(rawArgs, \"header\"),\n );\n if (Result.isFailure(customHeaders)) return customHeaders;\n\n const name = args.name;\n return runWithContext(args, (ctx) =>\n webhookCreateHandler(ctx, {\n name,\n url: url.value,\n tableEvents: tableEvents.value,\n customHeaders: customHeaders.value,\n }),\n );\n },\n});\n"],"mappings":";;;;;;;;;;AAoBA,eAAsB,qBACpB,KACA,SAMmE;CACnE,MAAM,UAAU,SACd,MAAM,IAAI,OAAO,KAAK,oCAAoC;EACxD,QAAQ,EAAE,MAAM,EAAE,aAAa,IAAI,YAAY,EAAE;EACjD,MAAM;GACJ,MAAM,QAAQ;GACd,KAAK,QAAQ;GACb,GAAI,QAAQ,gBAAgB,SACxB,EAAE,aAAa,QAAQ,YAAY,IACnC,CAAC;GACL,GAAI,QAAQ,kBAAkB,SAC1B,EAAE,eAAe,QAAQ,cAAc,IACvC,CAAC;EACP;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;EAC7D,CAAC;CACL,CAAC;AACH;AAEA,MAAM,aAAa;CACjB,GAAG;CACH,MAAM;EACJ,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,KAAK;EACH,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,eAAe;EACb,MAAM;EACN,aACE;CACJ;CACA,QAAQ;EACN,MAAM;EACN,aAAa;CACf;AACF;AAEA,qBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,KAAK,OAAO,EAAE,MAAM,cAAc;EAChC,IAAI,OAAO,KAAK,SAAS,YAAY,KAAK,SAAS,IACjD,OAAO,OAAO,KAAK,EAAE,SAAS,kBAAkB,CAAC;EAEnD,MAAM,MAAM,aAAa,OAAO,KAAK,GAAG;EACxC,IAAI,OAAO,UAAU,GAAG,GAAG,OAAO;EAClC,MAAM,cAAc,iBAClB,eACA,sBAAsB,SAAS,aAAa,CAC9C;EACA,IAAI,OAAO,UAAU,WAAW,GAAG,OAAO;EAC1C,MAAM,gBAAgB,aACpB,UACA,sBAAsB,SAAS,QAAQ,CACzC;EACA,IAAI,OAAO,UAAU,aAAa,GAAG,OAAO;EAE5C,MAAM,OAAO,KAAK;EAClB,OAAO,eAAe,OAAO,QAC3B,qBAAqB,KAAK;GACxB;GACA,KAAK,IAAI;GACT,aAAa,YAAY;GACzB,eAAe,cAAc;EAC/B,CAAC,CACH;CACF;AACF,CAAC"}
1
+ {"version":3,"file":"create-D5suBd3J.mjs","names":[],"sources":["../src/cli/commands/webhook/create.ts"],"sourcesContent":["import type { ArgsDef } from \"citty\";\nimport { Result } from \"@praha/byethrow\";\nimport {\n defineCommand,\n type CommandFailure,\n type CommandOutput,\n} from \"../define-command.js\";\nimport { contextArgs } from \"../shared.js\";\nimport { runWithContext, type CommandContext } from \"../run-with-context.js\";\nimport { apiErrorFailure } from \"../api-errors.js\";\nimport { toResult } from \"../../api/errors.js\";\nimport { renderDetail } from \"../../ui/detail.js\";\nimport { collectRepeatableFlag, parseHeaders, parseHttpUrl } from \"../parse.js\";\nimport { formatCustomHeaders } from \"./get.js\";\nimport {\n formatTableEvents,\n parseTableEvents,\n type TableEvent,\n} from \"./table-event.js\";\n\nexport async function webhookCreateHandler(\n ctx: CommandContext,\n options: {\n name: string;\n url: string;\n tableEvents?: TableEvent[];\n customHeaders?: { key: string; value: string }[];\n },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const created = toResult(\n await ctx.client.POST(\"/projects/{projectName}/webhooks\", {\n params: { path: { projectName: ctx.projectName } },\n body: {\n name: options.name,\n url: options.url,\n ...(options.tableEvents !== undefined\n ? { tableEvents: options.tableEvents }\n : {}),\n ...(options.customHeaders !== undefined\n ? { customHeaders: options.customHeaders }\n : {}),\n },\n }),\n );\n if (Result.isFailure(created)) return apiErrorFailure(created.error);\n\n const value = created.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 ]),\n });\n}\n\nconst createArgs = {\n ...contextArgs,\n name: {\n type: \"string\",\n required: true,\n description: \"Webhook name\",\n },\n url: {\n type: \"string\",\n required: true,\n description: \"URL to notify\",\n },\n \"table-event\": {\n type: \"string\",\n description:\n \"Subscription as <table>:<event> (content.create, content.update, content.delete); repeatable\",\n },\n header: {\n type: \"string\",\n description: \"Custom header as <key>:<value>; repeatable\",\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"create\",\n description: \"Create a webhook\",\n },\n args: createArgs,\n run: async ({ args, rawArgs }) => {\n if (typeof args.name !== \"string\" || args.name === \"\") {\n return Result.fail({ message: \"Missing --name.\" });\n }\n const url = parseHttpUrl(\"url\", args.url);\n if (Result.isFailure(url)) return url;\n const tableEvents = parseTableEvents(\n \"table-event\",\n collectRepeatableFlag(rawArgs, \"table-event\"),\n );\n if (Result.isFailure(tableEvents)) return tableEvents;\n const customHeaders = parseHeaders(\n \"header\",\n collectRepeatableFlag(rawArgs, \"header\"),\n );\n if (Result.isFailure(customHeaders)) return customHeaders;\n\n const name = args.name;\n return runWithContext(args, (ctx) =>\n webhookCreateHandler(ctx, {\n name,\n url: url.value,\n tableEvents: tableEvents.value,\n customHeaders: customHeaders.value,\n }),\n );\n },\n});\n"],"mappings":";;;;;;;;;;AAoBA,eAAsB,qBACpB,KACA,SAMmE;CACnE,MAAM,UAAU,SACd,MAAM,IAAI,OAAO,KAAK,oCAAoC;EACxD,QAAQ,EAAE,MAAM,EAAE,aAAa,IAAI,YAAY,EAAE;EACjD,MAAM;GACJ,MAAM,QAAQ;GACd,KAAK,QAAQ;GACb,GAAI,QAAQ,gBAAgB,SACxB,EAAE,aAAa,QAAQ,YAAY,IACnC,CAAC;GACL,GAAI,QAAQ,kBAAkB,SAC1B,EAAE,eAAe,QAAQ,cAAc,IACvC,CAAC;EACP;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;EAC7D,CAAC;CACL,CAAC;AACH;AAEA,MAAM,aAAa;CACjB,GAAG;CACH,MAAM;EACJ,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,KAAK;EACH,MAAM;EACN,UAAU;EACV,aAAa;CACf;CACA,eAAe;EACb,MAAM;EACN,aACE;CACJ;CACA,QAAQ;EACN,MAAM;EACN,aAAa;CACf;AACF;AAEA,qBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,KAAK,OAAO,EAAE,MAAM,cAAc;EAChC,IAAI,OAAO,KAAK,SAAS,YAAY,KAAK,SAAS,IACjD,OAAO,OAAO,KAAK,EAAE,SAAS,kBAAkB,CAAC;EAEnD,MAAM,MAAM,aAAa,OAAO,KAAK,GAAG;EACxC,IAAI,OAAO,UAAU,GAAG,GAAG,OAAO;EAClC,MAAM,cAAc,iBAClB,eACA,sBAAsB,SAAS,aAAa,CAC9C;EACA,IAAI,OAAO,UAAU,WAAW,GAAG,OAAO;EAC1C,MAAM,gBAAgB,aACpB,UACA,sBAAsB,SAAS,QAAQ,CACzC;EACA,IAAI,OAAO,UAAU,aAAa,GAAG,OAAO;EAE5C,MAAM,OAAO,KAAK;EAClB,OAAO,eAAe,OAAO,QAC3B,qBAAqB,KAAK;GACxB;GACA,KAAK,IAAI;GACT,aAAa,YAAY;GACzB,eAAe,cAAc;EAC/B,CAAC,CACH;CACF;AACF,CAAC"}
@@ -25,6 +25,7 @@ async function webhookGetHandler(ctx, options) {
25
25
  ["URL", value.url],
26
26
  ["Table events", formatTableEvents(value.tableEvents)],
27
27
  ["Custom headers", formatCustomHeaders(value.customHeaders)],
28
+ ["JWKS URL", value.jwksUrl],
28
29
  ["Created at", value.createdAt],
29
30
  ["Updated at", value.updatedAt]
30
31
  ])
@@ -53,4 +54,4 @@ var get_default = defineCommand({
53
54
 
54
55
  //#endregion
55
56
  export { get_default as default, formatCustomHeaders };
56
- //# sourceMappingURL=get-RpxdnCKR.mjs.map
57
+ //# sourceMappingURL=get-B6vBaq_D.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-B6vBaq_D.mjs","names":[],"sources":["../src/cli/commands/webhook/get.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 { parsePositionalId } from \"../parse.js\";\nimport { formatTableEvents } from \"./table-event.js\";\n\nexport function formatCustomHeaders(\n customHeaders: { key: string; value: string }[],\n): string {\n return customHeaders\n .map((header) => `${header.key}:${header.value}`)\n .join(\", \");\n}\n\nexport async function webhookGetHandler(\n ctx: CommandContext,\n options: { webhookId: number },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const webhook = 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(webhook)) return apiErrorFailure(webhook.error);\n\n const value = webhook.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 [\"JWKS URL\", value.jwksUrl],\n [\"Created at\", value.createdAt],\n [\"Updated at\", value.updatedAt],\n ]),\n });\n}\n\nconst getArgs = {\n ...contextArgs,\n id: {\n type: \"positional\",\n required: true,\n description: \"Numeric webhook ID\",\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"get\",\n description: \"Show a webhook\",\n },\n args: getArgs,\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 webhookGetHandler(ctx, { webhookId: webhookId.value }),\n );\n },\n});\n"],"mappings":";;;;;;;;;AAeA,SAAgB,oBACd,eACQ;CACR,OAAO,cACJ,KAAK,WAAW,GAAG,OAAO,IAAI,GAAG,OAAO,OAAO,CAAC,CAChD,KAAK,IAAI;AACd;AAEA,eAAsB,kBACpB,KACA,SACmE;CACnE,MAAM,UAAU,SACd,MAAM,IAAI,OAAO,IAAI,gDAAgD,EACnE,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,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,YAAY,MAAM,OAAO;GAC1B,CAAC,cAAc,MAAM,SAAS;GAC9B,CAAC,cAAc,MAAM,SAAS;EAChC,CAAC;CACL,CAAC;AACH;AAEA,MAAM,UAAU;CACd,GAAG;CACH,IAAI;EACF,MAAM;EACN,UAAU;EACV,aAAa;CACf;AACF;AAEA,kBAAe,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,kBAAkB,KAAK,EAAE,WAAW,UAAU,MAAM,CAAC,CACvD;CACF;AACF,CAAC"}
@@ -25,6 +25,7 @@ async function webhookGetHandler(ctx, options) {
25
25
  ["URL", value.url],
26
26
  ["Table events", require_table_event.formatTableEvents(value.tableEvents)],
27
27
  ["Custom headers", formatCustomHeaders(value.customHeaders)],
28
+ ["JWKS URL", value.jwksUrl],
28
29
  ["Created at", value.createdAt],
29
30
  ["Updated at", value.updatedAt]
30
31
  ])
@@ -54,4 +55,4 @@ var get_default = require_cli_main.defineCommand({
54
55
  //#endregion
55
56
  exports.default = get_default;
56
57
  exports.formatCustomHeaders = formatCustomHeaders;
57
- //# sourceMappingURL=get-BiPEF_m-.cjs.map
58
+ //# sourceMappingURL=get-DwtzBjGV.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-DwtzBjGV.cjs","names":["toResult","Result","apiErrorFailure","renderDetail","formatTableEvents","contextArgs","defineCommand","parsePositionalId","runWithContext"],"sources":["../src/cli/commands/webhook/get.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 { parsePositionalId } from \"../parse.js\";\nimport { formatTableEvents } from \"./table-event.js\";\n\nexport function formatCustomHeaders(\n customHeaders: { key: string; value: string }[],\n): string {\n return customHeaders\n .map((header) => `${header.key}:${header.value}`)\n .join(\", \");\n}\n\nexport async function webhookGetHandler(\n ctx: CommandContext,\n options: { webhookId: number },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const webhook = 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(webhook)) return apiErrorFailure(webhook.error);\n\n const value = webhook.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 [\"JWKS URL\", value.jwksUrl],\n [\"Created at\", value.createdAt],\n [\"Updated at\", value.updatedAt],\n ]),\n });\n}\n\nconst getArgs = {\n ...contextArgs,\n id: {\n type: \"positional\",\n required: true,\n description: \"Numeric webhook ID\",\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"get\",\n description: \"Show a webhook\",\n },\n args: getArgs,\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 webhookGetHandler(ctx, { webhookId: webhookId.value }),\n );\n },\n});\n"],"mappings":";;;;;;;;;AAeA,SAAgB,oBACd,eACQ;CACR,OAAO,cACJ,KAAK,WAAW,GAAG,OAAO,IAAI,GAAG,OAAO,OAAO,CAAC,CAChD,KAAK,IAAI;AACd;AAEA,eAAsB,kBACpB,KACA,SACmE;CACnE,MAAM,UAAUA,kCACd,MAAM,IAAI,OAAO,IAAI,gDAAgD,EACnE,QAAQ,EACN,MAAM;EAAE,aAAa,IAAI;EAAa,WAAW,QAAQ;CAAU,EACrE,EACF,CAAC,CACH;CACA,IAAIC,uBAAO,UAAU,OAAO,GAAG,OAAOC,yCAAgB,QAAQ,KAAK;CAEnE,MAAM,QAAQ,QAAQ;CACtB,OAAOD,uBAAO,QAAQ;EACpB,MAAM;EACN,YACEE,4BAAa;GACX,CAAC,MAAM,OAAO,MAAM,EAAE,CAAC;GACvB,CAAC,QAAQ,MAAM,IAAI;GACnB,CAAC,OAAO,MAAM,GAAG;GACjB,CAAC,gBAAgBC,sCAAkB,MAAM,WAAW,CAAC;GACrD,CAAC,kBAAkB,oBAAoB,MAAM,aAAa,CAAC;GAC3D,CAAC,YAAY,MAAM,OAAO;GAC1B,CAAC,cAAc,MAAM,SAAS;GAC9B,CAAC,cAAc,MAAM,SAAS;EAChC,CAAC;CACL,CAAC;AACH;AAEA,MAAM,UAAU;CACd,GAAGC;CACH,IAAI;EACF,MAAM;EACN,UAAU;EACV,aAAa;CACf;AACF;AAEA,kBAAeC,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,KAAK,OAAO,EAAE,WAAW;EACvB,MAAM,YAAYC,gCAAkB,cAAc,KAAK,EAAE;EACzD,IAAIN,uBAAO,UAAU,SAAS,GAAG,OAAO;EAExC,OAAOO,wCAAe,OAAO,QAC3B,kBAAkB,KAAK,EAAE,WAAW,UAAU,MAAM,CAAC,CACvD;CACF;AACF,CAAC"}
@@ -5,7 +5,7 @@ const require_detail = require('./detail-8CXNIhKw.cjs');
5
5
  const require_parse = require('./parse-C8oHgQXx.cjs');
6
6
  const require_array_update = require('./array-update-Dch4e9tI.cjs');
7
7
  const require_table_event = require('./table-event-DXkCK29f.cjs');
8
- const require_get = require('./get-BiPEF_m-.cjs');
8
+ const require_get = require('./get-DwtzBjGV.cjs');
9
9
  let _praha_byethrow = require("@praha/byethrow");
10
10
 
11
11
  //#region src/cli/commands/webhook/update.ts
@@ -168,4 +168,4 @@ var update_default = require_cli_main.defineCommand({
168
168
 
169
169
  //#endregion
170
170
  exports.default = update_default;
171
- //# sourceMappingURL=update-BXhSosHG.cjs.map
171
+ //# sourceMappingURL=update-CJgEmSWJ.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"update-BXhSosHG.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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"}
1
+ {"version":3,"file":"update-CJgEmSWJ.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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"}
@@ -5,7 +5,7 @@ import { t as renderDetail } from "./detail-DN5jCQ4N.mjs";
5
5
  import { a as parseHttpUrl, f as parseRepeatableFlag, i as parseHeaders, t as collectRepeatableFlag, u as parsePositionalId } from "./parse-DA0k5AHa.mjs";
6
6
  import { n as findDuplicateKey, r as resolveArrayUpdate, t as applyKeyedEdits } from "./array-update-CMFUoQEe.mjs";
7
7
  import { a as removeTableEvents, i as parseTableEvents, n as formatTableEvents, r as missingTableEventRemovals, t as addTableEvents } from "./table-event-C7gORNlb.mjs";
8
- import { formatCustomHeaders } from "./get-RpxdnCKR.mjs";
8
+ import { formatCustomHeaders } from "./get-B6vBaq_D.mjs";
9
9
  import { Result } from "@praha/byethrow";
10
10
 
11
11
  //#region src/cli/commands/webhook/update.ts
@@ -168,4 +168,4 @@ var update_default = defineCommand({
168
168
 
169
169
  //#endregion
170
170
  export { update_default as default };
171
- //# sourceMappingURL=update-CuPRoVw3.mjs.map
171
+ //# sourceMappingURL=update-Dyo4vuZs.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"update-CuPRoVw3.mjs","names":[],"sources":["../src/cli/commands/webhook/update.ts"],"sourcesContent":["import type { ArgsDef } from \"citty\";\nimport { Result } from \"@praha/byethrow\";\nimport {\n defineCommand,\n type CommandFailure,\n type CommandOutput,\n} from \"../define-command.js\";\nimport { contextArgs } from \"../shared.js\";\nimport { runWithContext, type CommandContext } from \"../run-with-context.js\";\nimport { apiErrorFailure } from \"../api-errors.js\";\nimport { toResult } from \"../../api/errors.js\";\nimport { renderDetail } from \"../../ui/detail.js\";\nimport {\n collectRepeatableFlag,\n parseHeaders,\n parseHttpUrl,\n parsePositionalId,\n parseRepeatableFlag,\n} from \"../parse.js\";\nimport {\n applyKeyedEdits,\n findDuplicateKey,\n resolveArrayUpdate,\n type ArrayUpdate,\n} from \"../array-update.js\";\nimport { warn } from \"../../ui/output.js\";\nimport { formatCustomHeaders } from \"./get.js\";\nimport {\n addTableEvents,\n formatTableEvents,\n missingTableEventRemovals,\n parseTableEvents,\n removeTableEvents,\n type TableEvent,\n} from \"./table-event.js\";\n\ntype CustomHeader = { key: string; value: string };\n\nexport function applyHeaderEdits(\n current: CustomHeader[],\n edits: { add: CustomHeader[]; remove: string[] },\n): CustomHeader[] {\n return applyKeyedEdits(current, edits, (header) => header.key);\n}\n\nexport async function webhookUpdateHandler(\n ctx: CommandContext,\n options: {\n webhookId: number;\n name?: string;\n url?: string;\n tableEvents: ArrayUpdate<TableEvent, TableEvent>;\n customHeaders: ArrayUpdate<CustomHeader, string>;\n },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n if (\n options.name === undefined &&\n options.url === undefined &&\n options.tableEvents === undefined &&\n options.customHeaders === undefined\n ) {\n return Result.fail({\n message:\n \"Nothing to update. Pass --name, --url, a --table-event option, or a --header option.\",\n });\n }\n\n // API は配列の全置換しか受けないため、要素単位の編集は現状を取得してインメモリで編集してから送る\n let currentTableEvents: TableEvent[] = [];\n let currentHeaders: CustomHeader[] = [];\n if (\n options.tableEvents?.mode === \"edit\" ||\n options.customHeaders?.mode === \"edit\"\n ) {\n const current = toResult(\n await ctx.client.GET(\"/projects/{projectName}/webhooks/{webhookId}\", {\n params: {\n path: { projectName: ctx.projectName, webhookId: options.webhookId },\n },\n }),\n );\n if (Result.isFailure(current)) return apiErrorFailure(current.error);\n currentTableEvents = current.value.tableEvents;\n currentHeaders = current.value.customHeaders;\n\n // 存在しない対象の remove は冪等に無視する (エラーにしない) が、タイポに気づけるよう通知は出す\n if (options.tableEvents?.mode === \"edit\") {\n for (const missing of missingTableEventRemovals(\n currentTableEvents,\n options.tableEvents.remove,\n )) {\n warn(`Subscription \"${missing}\" is not set; skipped removing it.`);\n }\n }\n if (options.customHeaders?.mode === \"edit\") {\n for (const key of options.customHeaders.remove) {\n if (!currentHeaders.some((header) => header.key === key)) {\n warn(`Header \"${key}\" is not set; skipped removing it.`);\n }\n }\n }\n }\n\n const body = {\n ...(options.name !== undefined ? { name: options.name } : {}),\n ...(options.url !== undefined ? { url: options.url } : {}),\n ...(options.tableEvents !== undefined\n ? {\n tableEvents:\n options.tableEvents.mode === \"replace\"\n ? options.tableEvents.items\n : addTableEvents(\n removeTableEvents(\n currentTableEvents,\n options.tableEvents.remove,\n ),\n options.tableEvents.add,\n ),\n }\n : {}),\n ...(options.customHeaders !== undefined\n ? {\n customHeaders:\n options.customHeaders.mode === \"replace\"\n ? options.customHeaders.items\n : applyHeaderEdits(currentHeaders, options.customHeaders),\n }\n : {}),\n };\n\n const updated = toResult(\n await ctx.client.PUT(\"/projects/{projectName}/webhooks/{webhookId}\", {\n params: {\n path: { projectName: ctx.projectName, webhookId: options.webhookId },\n },\n body,\n }),\n );\n if (Result.isFailure(updated)) return apiErrorFailure(updated.error);\n\n const value = updated.value;\n return Result.succeed({\n json: value,\n text: () =>\n renderDetail([\n [\"ID\", String(value.id)],\n [\"Name\", value.name],\n [\"URL\", value.url],\n [\"Table events\", formatTableEvents(value.tableEvents)],\n [\"Custom headers\", formatCustomHeaders(value.customHeaders)],\n [\"Updated at\", value.updatedAt],\n ]),\n });\n}\n\nconst updateArgs = {\n ...contextArgs,\n id: {\n type: \"positional\",\n required: true,\n description: \"Numeric webhook ID\",\n },\n name: {\n type: \"string\",\n description: \"New webhook name\",\n },\n url: {\n type: \"string\",\n description: \"New URL to notify\",\n },\n \"table-event\": {\n type: \"string\",\n description: \"Replace all subscriptions with <table>:<event>; repeatable\",\n },\n \"add-table-event\": {\n type: \"string\",\n description: \"Add a subscription as <table>:<event>; repeatable\",\n },\n \"remove-table-event\": {\n type: \"string\",\n description: \"Remove a subscription as <table>:<event>; repeatable\",\n },\n \"clear-table-events\": {\n type: \"boolean\",\n description: \"Remove all subscriptions\",\n default: false,\n },\n header: {\n type: \"string\",\n description: \"Replace all custom headers with <key>:<value>; repeatable\",\n },\n \"add-header\": {\n type: \"string\",\n description:\n \"Add or overwrite a custom header as <key>:<value>; repeatable\",\n },\n \"remove-header\": {\n type: \"string\",\n description: \"Remove a custom header by key; repeatable\",\n },\n \"clear-headers\": {\n type: \"boolean\",\n description: \"Remove all custom headers\",\n default: false,\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"update\",\n description: \"Update a webhook\",\n },\n args: updateArgs,\n run: async ({ args, rawArgs }) => {\n const webhookId = parsePositionalId(\"webhook ID\", args.id);\n if (Result.isFailure(webhookId)) return webhookId;\n\n const replaceTableEvents = parseTableEvents(\n \"table-event\",\n collectRepeatableFlag(rawArgs, \"table-event\"),\n );\n if (Result.isFailure(replaceTableEvents)) return replaceTableEvents;\n const addedTableEvents = parseTableEvents(\n \"add-table-event\",\n collectRepeatableFlag(rawArgs, \"add-table-event\"),\n );\n if (Result.isFailure(addedTableEvents)) return addedTableEvents;\n const removedTableEvents = parseTableEvents(\n \"remove-table-event\",\n collectRepeatableFlag(rawArgs, \"remove-table-event\"),\n );\n if (Result.isFailure(removedTableEvents)) return removedTableEvents;\n const tableEvents = resolveArrayUpdate({\n replaceFlag: \"table-event\",\n clearFlag: \"clear-table-events\",\n editFlags: \"--add-table-event / --remove-table-event\",\n replace: replaceTableEvents.value,\n add: addedTableEvents.value,\n remove: removedTableEvents.value,\n clear: args[\"clear-table-events\"] === true,\n });\n if (Result.isFailure(tableEvents)) return tableEvents;\n\n const replaceHeaders = parseHeaders(\n \"header\",\n collectRepeatableFlag(rawArgs, \"header\"),\n );\n if (Result.isFailure(replaceHeaders)) return replaceHeaders;\n const addedHeaders = parseHeaders(\n \"add-header\",\n collectRepeatableFlag(rawArgs, \"add-header\"),\n );\n if (Result.isFailure(addedHeaders)) return addedHeaders;\n // add は同一 key を上書きする規則のため、1 回の実行内で同じ key を複数指定されると意図が曖昧になり弾く\n const duplicateAddedKey = findDuplicateKey(\n addedHeaders.value ?? [],\n (header) => header.key,\n );\n if (duplicateAddedKey !== undefined) {\n return Result.fail({\n message: `Invalid --add-header: key \"${duplicateAddedKey}\" is specified multiple times.`,\n });\n }\n const removeHeaderValues = collectRepeatableFlag(rawArgs, \"remove-header\");\n const removedHeaderKeys =\n removeHeaderValues === undefined\n ? Result.succeed(undefined)\n : parseRepeatableFlag(\"remove-header\", removeHeaderValues);\n if (Result.isFailure(removedHeaderKeys)) return removedHeaderKeys;\n const customHeaders = resolveArrayUpdate({\n replaceFlag: \"header\",\n clearFlag: \"clear-headers\",\n editFlags: \"--add-header / --remove-header\",\n replace: replaceHeaders.value,\n add: addedHeaders.value,\n remove: removedHeaderKeys.value,\n clear: args[\"clear-headers\"] === true,\n });\n if (Result.isFailure(customHeaders)) return customHeaders;\n\n let url: string | undefined;\n if (typeof args.url === \"string\") {\n const parsedUrl = parseHttpUrl(\"url\", args.url);\n if (Result.isFailure(parsedUrl)) return parsedUrl;\n url = parsedUrl.value;\n }\n\n return runWithContext(args, (ctx) =>\n webhookUpdateHandler(ctx, {\n webhookId: webhookId.value,\n name: typeof args.name === \"string\" ? args.name : undefined,\n url,\n tableEvents: tableEvents.value,\n customHeaders: customHeaders.value,\n }),\n );\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"update-Dyo4vuZs.mjs","names":[],"sources":["../src/cli/commands/webhook/update.ts"],"sourcesContent":["import type { ArgsDef } from \"citty\";\nimport { Result } from \"@praha/byethrow\";\nimport {\n defineCommand,\n type CommandFailure,\n type CommandOutput,\n} from \"../define-command.js\";\nimport { contextArgs } from \"../shared.js\";\nimport { runWithContext, type CommandContext } from \"../run-with-context.js\";\nimport { apiErrorFailure } from \"../api-errors.js\";\nimport { toResult } from \"../../api/errors.js\";\nimport { renderDetail } from \"../../ui/detail.js\";\nimport {\n collectRepeatableFlag,\n parseHeaders,\n parseHttpUrl,\n parsePositionalId,\n parseRepeatableFlag,\n} from \"../parse.js\";\nimport {\n applyKeyedEdits,\n findDuplicateKey,\n resolveArrayUpdate,\n type ArrayUpdate,\n} from \"../array-update.js\";\nimport { warn } from \"../../ui/output.js\";\nimport { formatCustomHeaders } from \"./get.js\";\nimport {\n addTableEvents,\n formatTableEvents,\n missingTableEventRemovals,\n parseTableEvents,\n removeTableEvents,\n type TableEvent,\n} from \"./table-event.js\";\n\ntype CustomHeader = { key: string; value: string };\n\nexport function applyHeaderEdits(\n current: CustomHeader[],\n edits: { add: CustomHeader[]; remove: string[] },\n): CustomHeader[] {\n return applyKeyedEdits(current, edits, (header) => header.key);\n}\n\nexport async function webhookUpdateHandler(\n ctx: CommandContext,\n options: {\n webhookId: number;\n name?: string;\n url?: string;\n tableEvents: ArrayUpdate<TableEvent, TableEvent>;\n customHeaders: ArrayUpdate<CustomHeader, string>;\n },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n if (\n options.name === undefined &&\n options.url === undefined &&\n options.tableEvents === undefined &&\n options.customHeaders === undefined\n ) {\n return Result.fail({\n message:\n \"Nothing to update. Pass --name, --url, a --table-event option, or a --header option.\",\n });\n }\n\n // API は配列の全置換しか受けないため、要素単位の編集は現状を取得してインメモリで編集してから送る\n let currentTableEvents: TableEvent[] = [];\n let currentHeaders: CustomHeader[] = [];\n if (\n options.tableEvents?.mode === \"edit\" ||\n options.customHeaders?.mode === \"edit\"\n ) {\n const current = toResult(\n await ctx.client.GET(\"/projects/{projectName}/webhooks/{webhookId}\", {\n params: {\n path: { projectName: ctx.projectName, webhookId: options.webhookId },\n },\n }),\n );\n if (Result.isFailure(current)) return apiErrorFailure(current.error);\n currentTableEvents = current.value.tableEvents;\n currentHeaders = current.value.customHeaders;\n\n // 存在しない対象の remove は冪等に無視する (エラーにしない) が、タイポに気づけるよう通知は出す\n if (options.tableEvents?.mode === \"edit\") {\n for (const missing of missingTableEventRemovals(\n currentTableEvents,\n options.tableEvents.remove,\n )) {\n warn(`Subscription \"${missing}\" is not set; skipped removing it.`);\n }\n }\n if (options.customHeaders?.mode === \"edit\") {\n for (const key of options.customHeaders.remove) {\n if (!currentHeaders.some((header) => header.key === key)) {\n warn(`Header \"${key}\" is not set; skipped removing it.`);\n }\n }\n }\n }\n\n const body = {\n ...(options.name !== undefined ? { name: options.name } : {}),\n ...(options.url !== undefined ? { url: options.url } : {}),\n ...(options.tableEvents !== undefined\n ? {\n tableEvents:\n options.tableEvents.mode === \"replace\"\n ? options.tableEvents.items\n : addTableEvents(\n removeTableEvents(\n currentTableEvents,\n options.tableEvents.remove,\n ),\n options.tableEvents.add,\n ),\n }\n : {}),\n ...(options.customHeaders !== undefined\n ? {\n customHeaders:\n options.customHeaders.mode === \"replace\"\n ? options.customHeaders.items\n : applyHeaderEdits(currentHeaders, options.customHeaders),\n }\n : {}),\n };\n\n const updated = toResult(\n await ctx.client.PUT(\"/projects/{projectName}/webhooks/{webhookId}\", {\n params: {\n path: { projectName: ctx.projectName, webhookId: options.webhookId },\n },\n body,\n }),\n );\n if (Result.isFailure(updated)) return apiErrorFailure(updated.error);\n\n const value = updated.value;\n return Result.succeed({\n json: value,\n text: () =>\n renderDetail([\n [\"ID\", String(value.id)],\n [\"Name\", value.name],\n [\"URL\", value.url],\n [\"Table events\", formatTableEvents(value.tableEvents)],\n [\"Custom headers\", formatCustomHeaders(value.customHeaders)],\n [\"Updated at\", value.updatedAt],\n ]),\n });\n}\n\nconst updateArgs = {\n ...contextArgs,\n id: {\n type: \"positional\",\n required: true,\n description: \"Numeric webhook ID\",\n },\n name: {\n type: \"string\",\n description: \"New webhook name\",\n },\n url: {\n type: \"string\",\n description: \"New URL to notify\",\n },\n \"table-event\": {\n type: \"string\",\n description: \"Replace all subscriptions with <table>:<event>; repeatable\",\n },\n \"add-table-event\": {\n type: \"string\",\n description: \"Add a subscription as <table>:<event>; repeatable\",\n },\n \"remove-table-event\": {\n type: \"string\",\n description: \"Remove a subscription as <table>:<event>; repeatable\",\n },\n \"clear-table-events\": {\n type: \"boolean\",\n description: \"Remove all subscriptions\",\n default: false,\n },\n header: {\n type: \"string\",\n description: \"Replace all custom headers with <key>:<value>; repeatable\",\n },\n \"add-header\": {\n type: \"string\",\n description:\n \"Add or overwrite a custom header as <key>:<value>; repeatable\",\n },\n \"remove-header\": {\n type: \"string\",\n description: \"Remove a custom header by key; repeatable\",\n },\n \"clear-headers\": {\n type: \"boolean\",\n description: \"Remove all custom headers\",\n default: false,\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"update\",\n description: \"Update a webhook\",\n },\n args: updateArgs,\n run: async ({ args, rawArgs }) => {\n const webhookId = parsePositionalId(\"webhook ID\", args.id);\n if (Result.isFailure(webhookId)) return webhookId;\n\n const replaceTableEvents = parseTableEvents(\n \"table-event\",\n collectRepeatableFlag(rawArgs, \"table-event\"),\n );\n if (Result.isFailure(replaceTableEvents)) return replaceTableEvents;\n const addedTableEvents = parseTableEvents(\n \"add-table-event\",\n collectRepeatableFlag(rawArgs, \"add-table-event\"),\n );\n if (Result.isFailure(addedTableEvents)) return addedTableEvents;\n const removedTableEvents = parseTableEvents(\n \"remove-table-event\",\n collectRepeatableFlag(rawArgs, \"remove-table-event\"),\n );\n if (Result.isFailure(removedTableEvents)) return removedTableEvents;\n const tableEvents = resolveArrayUpdate({\n replaceFlag: \"table-event\",\n clearFlag: \"clear-table-events\",\n editFlags: \"--add-table-event / --remove-table-event\",\n replace: replaceTableEvents.value,\n add: addedTableEvents.value,\n remove: removedTableEvents.value,\n clear: args[\"clear-table-events\"] === true,\n });\n if (Result.isFailure(tableEvents)) return tableEvents;\n\n const replaceHeaders = parseHeaders(\n \"header\",\n collectRepeatableFlag(rawArgs, \"header\"),\n );\n if (Result.isFailure(replaceHeaders)) return replaceHeaders;\n const addedHeaders = parseHeaders(\n \"add-header\",\n collectRepeatableFlag(rawArgs, \"add-header\"),\n );\n if (Result.isFailure(addedHeaders)) return addedHeaders;\n // add は同一 key を上書きする規則のため、1 回の実行内で同じ key を複数指定されると意図が曖昧になり弾く\n const duplicateAddedKey = findDuplicateKey(\n addedHeaders.value ?? [],\n (header) => header.key,\n );\n if (duplicateAddedKey !== undefined) {\n return Result.fail({\n message: `Invalid --add-header: key \"${duplicateAddedKey}\" is specified multiple times.`,\n });\n }\n const removeHeaderValues = collectRepeatableFlag(rawArgs, \"remove-header\");\n const removedHeaderKeys =\n removeHeaderValues === undefined\n ? Result.succeed(undefined)\n : parseRepeatableFlag(\"remove-header\", removeHeaderValues);\n if (Result.isFailure(removedHeaderKeys)) return removedHeaderKeys;\n const customHeaders = resolveArrayUpdate({\n replaceFlag: \"header\",\n clearFlag: \"clear-headers\",\n editFlags: \"--add-header / --remove-header\",\n replace: replaceHeaders.value,\n add: addedHeaders.value,\n remove: removedHeaderKeys.value,\n clear: args[\"clear-headers\"] === true,\n });\n if (Result.isFailure(customHeaders)) return customHeaders;\n\n let url: string | undefined;\n if (typeof args.url === \"string\") {\n const parsedUrl = parseHttpUrl(\"url\", args.url);\n if (Result.isFailure(parsedUrl)) return parsedUrl;\n url = parsedUrl.value;\n }\n\n return runWithContext(args, (ctx) =>\n webhookUpdateHandler(ctx, {\n webhookId: webhookId.value,\n name: typeof args.name === \"string\" ? args.name : undefined,\n url,\n tableEvents: tableEvents.value,\n customHeaders: customHeaders.value,\n }),\n );\n },\n});\n"],"mappings":"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"}
@@ -8,13 +8,13 @@ var webhook_default = require_cli_main.defineCommand({
8
8
  },
9
9
  subCommands: {
10
10
  list: () => Promise.resolve().then(() => require("./list-BHvURTWd.cjs")).then((m) => m.default),
11
- get: () => Promise.resolve().then(() => require("./get-BiPEF_m-.cjs")).then((m) => m.default),
12
- create: () => Promise.resolve().then(() => require("./create-BvERyMKa.cjs")).then((m) => m.default),
13
- update: () => Promise.resolve().then(() => require("./update-BXhSosHG.cjs")).then((m) => m.default),
11
+ get: () => Promise.resolve().then(() => require("./get-DwtzBjGV.cjs")).then((m) => m.default),
12
+ create: () => Promise.resolve().then(() => require("./create-CCsn7yp5.cjs")).then((m) => m.default),
13
+ update: () => Promise.resolve().then(() => require("./update-CJgEmSWJ.cjs")).then((m) => m.default),
14
14
  delete: () => Promise.resolve().then(() => require("./delete-DVrafka1.cjs")).then((m) => m.default)
15
15
  }
16
16
  });
17
17
 
18
18
  //#endregion
19
19
  exports.default = webhook_default;
20
- //# sourceMappingURL=webhook-CVFmch5W.cjs.map
20
+ //# sourceMappingURL=webhook-CbL4QaR5.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-CVFmch5W.cjs","names":["defineCommand"],"sources":["../src/cli/commands/webhook/index.ts"],"sourcesContent":["import { defineCommand } from \"../define-command.js\";\n\nexport default defineCommand({\n meta: {\n name: \"webhook\",\n description: \"Manage project webhooks\",\n },\n subCommands: {\n list: () => import(\"./list.js\").then((m) => m.default),\n get: () => import(\"./get.js\").then((m) => m.default),\n create: () => import(\"./create.js\").then((m) => m.default),\n update: () => import(\"./update.js\").then((m) => m.default),\n delete: () => import(\"./delete.js\").then((m) => m.default),\n },\n});\n"],"mappings":";;;AAEA,sBAAeA,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,aAAa;EACX,iDAAY,wBAAoB,MAAM,MAAM,EAAE,OAAO;EACrD,gDAAW,uBAAmB,MAAM,MAAM,EAAE,OAAO;EACnD,mDAAc,0BAAsB,MAAM,MAAM,EAAE,OAAO;EACzD,mDAAc,0BAAsB,MAAM,MAAM,EAAE,OAAO;EACzD,mDAAc,0BAAsB,MAAM,MAAM,EAAE,OAAO;CAC3D;AACF,CAAC"}
1
+ {"version":3,"file":"webhook-CbL4QaR5.cjs","names":["defineCommand"],"sources":["../src/cli/commands/webhook/index.ts"],"sourcesContent":["import { defineCommand } from \"../define-command.js\";\n\nexport default defineCommand({\n meta: {\n name: \"webhook\",\n description: \"Manage project webhooks\",\n },\n subCommands: {\n list: () => import(\"./list.js\").then((m) => m.default),\n get: () => import(\"./get.js\").then((m) => m.default),\n create: () => import(\"./create.js\").then((m) => m.default),\n update: () => import(\"./update.js\").then((m) => m.default),\n delete: () => import(\"./delete.js\").then((m) => m.default),\n },\n});\n"],"mappings":";;;AAEA,sBAAeA,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,aAAa;EACX,iDAAY,wBAAoB,MAAM,MAAM,EAAE,OAAO;EACrD,gDAAW,uBAAmB,MAAM,MAAM,EAAE,OAAO;EACnD,mDAAc,0BAAsB,MAAM,MAAM,EAAE,OAAO;EACzD,mDAAc,0BAAsB,MAAM,MAAM,EAAE,OAAO;EACzD,mDAAc,0BAAsB,MAAM,MAAM,EAAE,OAAO;CAC3D;AACF,CAAC"}
@@ -8,13 +8,13 @@ var webhook_default = defineCommand({
8
8
  },
9
9
  subCommands: {
10
10
  list: () => import("./list-BsYYq9wT.mjs").then((m) => m.default),
11
- get: () => import("./get-RpxdnCKR.mjs").then((m) => m.default),
12
- create: () => import("./create-Dups0gV2.mjs").then((m) => m.default),
13
- update: () => import("./update-CuPRoVw3.mjs").then((m) => m.default),
11
+ get: () => import("./get-B6vBaq_D.mjs").then((m) => m.default),
12
+ create: () => import("./create-D5suBd3J.mjs").then((m) => m.default),
13
+ update: () => import("./update-Dyo4vuZs.mjs").then((m) => m.default),
14
14
  delete: () => import("./delete-ZIifaG0i.mjs").then((m) => m.default)
15
15
  }
16
16
  });
17
17
 
18
18
  //#endregion
19
19
  export { webhook_default as default };
20
- //# sourceMappingURL=webhook-Cy850dNs.mjs.map
20
+ //# sourceMappingURL=webhook-CpZ1-Ho5.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-Cy850dNs.mjs","names":[],"sources":["../src/cli/commands/webhook/index.ts"],"sourcesContent":["import { defineCommand } from \"../define-command.js\";\n\nexport default defineCommand({\n meta: {\n name: \"webhook\",\n description: \"Manage project webhooks\",\n },\n subCommands: {\n list: () => import(\"./list.js\").then((m) => m.default),\n get: () => import(\"./get.js\").then((m) => m.default),\n create: () => import(\"./create.js\").then((m) => m.default),\n update: () => import(\"./update.js\").then((m) => m.default),\n delete: () => import(\"./delete.js\").then((m) => m.default),\n },\n});\n"],"mappings":";;;AAEA,sBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,aAAa;EACX,YAAY,OAAO,sBAAY,CAAC,MAAM,MAAM,EAAE,OAAO;EACrD,WAAW,OAAO,qBAAW,CAAC,MAAM,MAAM,EAAE,OAAO;EACnD,cAAc,OAAO,wBAAc,CAAC,MAAM,MAAM,EAAE,OAAO;EACzD,cAAc,OAAO,wBAAc,CAAC,MAAM,MAAM,EAAE,OAAO;EACzD,cAAc,OAAO,wBAAc,CAAC,MAAM,MAAM,EAAE,OAAO;CAC3D;AACF,CAAC"}
1
+ {"version":3,"file":"webhook-CpZ1-Ho5.mjs","names":[],"sources":["../src/cli/commands/webhook/index.ts"],"sourcesContent":["import { defineCommand } from \"../define-command.js\";\n\nexport default defineCommand({\n meta: {\n name: \"webhook\",\n description: \"Manage project webhooks\",\n },\n subCommands: {\n list: () => import(\"./list.js\").then((m) => m.default),\n get: () => import(\"./get.js\").then((m) => m.default),\n create: () => import(\"./create.js\").then((m) => m.default),\n update: () => import(\"./update.js\").then((m) => m.default),\n delete: () => import(\"./delete.js\").then((m) => m.default),\n },\n});\n"],"mappings":";;;AAEA,sBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,aAAa;EACX,YAAY,OAAO,sBAAY,CAAC,MAAM,MAAM,EAAE,OAAO;EACrD,WAAW,OAAO,qBAAW,CAAC,MAAM,MAAM,EAAE,OAAO;EACnD,cAAc,OAAO,wBAAc,CAAC,MAAM,MAAM,EAAE,OAAO;EACzD,cAAc,OAAO,wBAAc,CAAC,MAAM,MAAM,EAAE,OAAO;EACzD,cAAc,OAAO,wBAAc,CAAC,MAAM,MAAM,EAAE,OAAO;CAC3D;AACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orizm/cli",
3
- "version": "3.0.1",
3
+ "version": "3.1.0",
4
4
  "description": "Orizm CLI",
5
5
  "type": "module",
6
6
  "repository": {
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-BiPEF_m-.cjs","names":["toResult","Result","apiErrorFailure","renderDetail","formatTableEvents","contextArgs","defineCommand","parsePositionalId","runWithContext"],"sources":["../src/cli/commands/webhook/get.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 { parsePositionalId } from \"../parse.js\";\nimport { formatTableEvents } from \"./table-event.js\";\n\nexport function formatCustomHeaders(\n customHeaders: { key: string; value: string }[],\n): string {\n return customHeaders\n .map((header) => `${header.key}:${header.value}`)\n .join(\", \");\n}\n\nexport async function webhookGetHandler(\n ctx: CommandContext,\n options: { webhookId: number },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const webhook = 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(webhook)) return apiErrorFailure(webhook.error);\n\n const value = webhook.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 [\"Created at\", value.createdAt],\n [\"Updated at\", value.updatedAt],\n ]),\n });\n}\n\nconst getArgs = {\n ...contextArgs,\n id: {\n type: \"positional\",\n required: true,\n description: \"Numeric webhook ID\",\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"get\",\n description: \"Show a webhook\",\n },\n args: getArgs,\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 webhookGetHandler(ctx, { webhookId: webhookId.value }),\n );\n },\n});\n"],"mappings":";;;;;;;;;AAeA,SAAgB,oBACd,eACQ;CACR,OAAO,cACJ,KAAK,WAAW,GAAG,OAAO,IAAI,GAAG,OAAO,OAAO,CAAC,CAChD,KAAK,IAAI;AACd;AAEA,eAAsB,kBACpB,KACA,SACmE;CACnE,MAAM,UAAUA,kCACd,MAAM,IAAI,OAAO,IAAI,gDAAgD,EACnE,QAAQ,EACN,MAAM;EAAE,aAAa,IAAI;EAAa,WAAW,QAAQ;CAAU,EACrE,EACF,CAAC,CACH;CACA,IAAIC,uBAAO,UAAU,OAAO,GAAG,OAAOC,yCAAgB,QAAQ,KAAK;CAEnE,MAAM,QAAQ,QAAQ;CACtB,OAAOD,uBAAO,QAAQ;EACpB,MAAM;EACN,YACEE,4BAAa;GACX,CAAC,MAAM,OAAO,MAAM,EAAE,CAAC;GACvB,CAAC,QAAQ,MAAM,IAAI;GACnB,CAAC,OAAO,MAAM,GAAG;GACjB,CAAC,gBAAgBC,sCAAkB,MAAM,WAAW,CAAC;GACrD,CAAC,kBAAkB,oBAAoB,MAAM,aAAa,CAAC;GAC3D,CAAC,cAAc,MAAM,SAAS;GAC9B,CAAC,cAAc,MAAM,SAAS;EAChC,CAAC;CACL,CAAC;AACH;AAEA,MAAM,UAAU;CACd,GAAGC;CACH,IAAI;EACF,MAAM;EACN,UAAU;EACV,aAAa;CACf;AACF;AAEA,kBAAeC,+BAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,KAAK,OAAO,EAAE,WAAW;EACvB,MAAM,YAAYC,gCAAkB,cAAc,KAAK,EAAE;EACzD,IAAIN,uBAAO,UAAU,SAAS,GAAG,OAAO;EAExC,OAAOO,wCAAe,OAAO,QAC3B,kBAAkB,KAAK,EAAE,WAAW,UAAU,MAAM,CAAC,CACvD;CACF;AACF,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-RpxdnCKR.mjs","names":[],"sources":["../src/cli/commands/webhook/get.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 { parsePositionalId } from \"../parse.js\";\nimport { formatTableEvents } from \"./table-event.js\";\n\nexport function formatCustomHeaders(\n customHeaders: { key: string; value: string }[],\n): string {\n return customHeaders\n .map((header) => `${header.key}:${header.value}`)\n .join(\", \");\n}\n\nexport async function webhookGetHandler(\n ctx: CommandContext,\n options: { webhookId: number },\n): Promise<Result.Result<CommandOutput | undefined, CommandFailure>> {\n const webhook = 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(webhook)) return apiErrorFailure(webhook.error);\n\n const value = webhook.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 [\"Created at\", value.createdAt],\n [\"Updated at\", value.updatedAt],\n ]),\n });\n}\n\nconst getArgs = {\n ...contextArgs,\n id: {\n type: \"positional\",\n required: true,\n description: \"Numeric webhook ID\",\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"get\",\n description: \"Show a webhook\",\n },\n args: getArgs,\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 webhookGetHandler(ctx, { webhookId: webhookId.value }),\n );\n },\n});\n"],"mappings":";;;;;;;;;AAeA,SAAgB,oBACd,eACQ;CACR,OAAO,cACJ,KAAK,WAAW,GAAG,OAAO,IAAI,GAAG,OAAO,OAAO,CAAC,CAChD,KAAK,IAAI;AACd;AAEA,eAAsB,kBACpB,KACA,SACmE;CACnE,MAAM,UAAU,SACd,MAAM,IAAI,OAAO,IAAI,gDAAgD,EACnE,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,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;GAC9B,CAAC,cAAc,MAAM,SAAS;EAChC,CAAC;CACL,CAAC;AACH;AAEA,MAAM,UAAU;CACd,GAAG;CACH,IAAI;EACF,MAAM;EACN,UAAU;EACV,aAAa;CACf;AACF;AAEA,kBAAe,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,kBAAkB,KAAK,EAAE,WAAW,UAAU,MAAM,CAAC,CACvD;CACF;AACF,CAAC"}