@sendly/cli 2.2.0 → 2.3.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/commands/webhooks/create.d.ts +13 -0
- package/dist/commands/webhooks/create.js +56 -0
- package/dist/commands/webhooks/delete.d.ts +14 -0
- package/dist/commands/webhooks/delete.js +64 -0
- package/dist/commands/webhooks/deliveries.d.ts +15 -0
- package/dist/commands/webhooks/deliveries.js +137 -0
- package/dist/commands/webhooks/get.d.ts +13 -0
- package/dist/commands/webhooks/get.js +57 -0
- package/dist/commands/webhooks/list.js +2 -2
- package/dist/commands/webhooks/rotate-secret.d.ts +14 -0
- package/dist/commands/webhooks/rotate-secret.js +87 -0
- package/dist/commands/webhooks/test.d.ts +13 -0
- package/dist/commands/webhooks/test.js +73 -0
- package/dist/commands/webhooks/update.d.ts +17 -0
- package/dist/commands/webhooks/update.js +104 -0
- package/oclif.manifest.json +397 -1
- package/package.json +1 -1
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
2
|
+
export default class WebhooksCreate extends AuthenticatedCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
url: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
7
|
+
events: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
8
|
+
description: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
9
|
+
json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
10
|
+
quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
11
|
+
};
|
|
12
|
+
run(): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Flags } from "@oclif/core";
|
|
2
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
3
|
+
import { apiClient } from "../../lib/api-client.js";
|
|
4
|
+
import { success, warn, json, colors, codeBlock, isJsonMode, } from "../../lib/output.js";
|
|
5
|
+
export default class WebhooksCreate extends AuthenticatedCommand {
|
|
6
|
+
static description = "Create a webhook";
|
|
7
|
+
static examples = [
|
|
8
|
+
'<%= config.bin %> webhooks create --url https://myapp.com/webhook --events message.delivered',
|
|
9
|
+
'<%= config.bin %> webhooks create --url https://myapp.com/webhook --events message.delivered,message.failed --description "Production webhook"',
|
|
10
|
+
'<%= config.bin %> webhooks create --url https://webhook.site/abc123 --events message.sent --json',
|
|
11
|
+
];
|
|
12
|
+
static flags = {
|
|
13
|
+
...AuthenticatedCommand.baseFlags,
|
|
14
|
+
url: Flags.string({
|
|
15
|
+
char: "u",
|
|
16
|
+
description: "Webhook URL (must be HTTPS)",
|
|
17
|
+
required: true,
|
|
18
|
+
}),
|
|
19
|
+
events: Flags.string({
|
|
20
|
+
char: "e",
|
|
21
|
+
description: "Comma-separated list of events to listen for",
|
|
22
|
+
required: true,
|
|
23
|
+
}),
|
|
24
|
+
description: Flags.string({
|
|
25
|
+
char: "d",
|
|
26
|
+
description: "Description for the webhook",
|
|
27
|
+
}),
|
|
28
|
+
};
|
|
29
|
+
async run() {
|
|
30
|
+
const { flags } = await this.parse(WebhooksCreate);
|
|
31
|
+
const events = flags.events.split(",").map(e => e.trim());
|
|
32
|
+
const response = await apiClient.post("/api/v1/webhooks", {
|
|
33
|
+
url: flags.url,
|
|
34
|
+
events,
|
|
35
|
+
...(flags.description && { description: flags.description }),
|
|
36
|
+
});
|
|
37
|
+
if (isJsonMode()) {
|
|
38
|
+
json(response);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
success("Webhook created", {
|
|
42
|
+
ID: response.id,
|
|
43
|
+
URL: response.url,
|
|
44
|
+
Events: response.events.join(", "),
|
|
45
|
+
...(response.description && { Description: response.description }),
|
|
46
|
+
Status: response.isActive ? colors.success("active") : colors.warning("inactive"),
|
|
47
|
+
});
|
|
48
|
+
console.log();
|
|
49
|
+
warn("Copy your webhook secret now. You won't be able to see it again!");
|
|
50
|
+
codeBlock(response.secret);
|
|
51
|
+
console.log();
|
|
52
|
+
console.log(colors.dim("Use this secret to verify webhook signatures in your application."));
|
|
53
|
+
console.log(colors.dim("See the docs for signature verification examples."));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3dlYmhvb2tzL2NyZWF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsT0FBTyxFQUNQLElBQUksRUFDSixJQUFJLEVBQ0osTUFBTSxFQUNOLFNBQVMsRUFDVCxVQUFVLEdBQ1gsTUFBTSxxQkFBcUIsQ0FBQztBQWE3QixNQUFNLENBQUMsT0FBTyxPQUFPLGNBQWUsU0FBUSxvQkFBb0I7SUFDOUQsTUFBTSxDQUFDLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQztJQUV4QyxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLDhGQUE4RjtRQUM5RixnSkFBZ0o7UUFDaEosa0dBQWtHO0tBQ25HLENBQUM7SUFFRixNQUFNLENBQUMsS0FBSyxHQUFHO1FBQ2IsR0FBRyxvQkFBb0IsQ0FBQyxTQUFTO1FBQ2pDLEdBQUcsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ2hCLElBQUksRUFBRSxHQUFHO1lBQ1QsV0FBVyxFQUFFLDZCQUE2QjtZQUMxQyxRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUM7UUFDRixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNuQixJQUFJLEVBQUUsR0FBRztZQUNULFdBQVcsRUFBRSw4Q0FBOEM7WUFDM0QsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDO1FBQ0YsV0FBVyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDeEIsSUFBSSxFQUFFLEdBQUc7WUFDVCxXQUFXLEVBQUUsNkJBQTZCO1NBQzNDLENBQUM7S0FDSCxDQUFDO0lBRUYsS0FBSyxDQUFDLEdBQUc7UUFDUCxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRW5ELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRTFELE1BQU0sUUFBUSxHQUFHLE1BQU0sU0FBUyxDQUFDLElBQUksQ0FBd0Isa0JBQWtCLEVBQUU7WUFDL0UsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO1lBQ2QsTUFBTTtZQUNOLEdBQUcsQ0FBQyxLQUFLLENBQUMsV0FBVyxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUM3RCxDQUFDLENBQUM7UUFFSCxJQUFJLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2YsT0FBTztRQUNULENBQUM7UUFFRCxPQUFPLENBQUMsaUJBQWlCLEVBQUU7WUFDekIsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFO1lBQ2YsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHO1lBQ2pCLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDbEMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLElBQUksRUFBRSxXQUFXLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2xFLE1BQU0sRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztTQUNsRixDQUFDLENBQUM7UUFFSCxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsa0VBQWtFLENBQUMsQ0FBQztRQUN6RSxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTNCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDLENBQUM7UUFDN0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLG1EQUFtRCxDQUFDLENBQUMsQ0FBQztJQUMvRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmxhZ3MgfSBmcm9tIFwiQG9jbGlmL2NvcmVcIjtcbmltcG9ydCB7IEF1dGhlbnRpY2F0ZWRDb21tYW5kIH0gZnJvbSBcIi4uLy4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGFwaUNsaWVudCB9IGZyb20gXCIuLi8uLi9saWIvYXBpLWNsaWVudC5qc1wiO1xuaW1wb3J0IHtcbiAgc3VjY2VzcyxcbiAgd2FybixcbiAganNvbixcbiAgY29sb3JzLFxuICBjb2RlQmxvY2ssXG4gIGlzSnNvbk1vZGUsXG59IGZyb20gXCIuLi8uLi9saWIvb3V0cHV0LmpzXCI7XG5cbmludGVyZmFjZSBDcmVhdGVXZWJob29rUmVzcG9uc2Uge1xuICBpZDogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgZXZlbnRzOiBzdHJpbmdbXTtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHNlY3JldDogc3RyaW5nOyAvLyBPbmx5IHJldHVybmVkIG9uIGNyZWF0aW9uXG4gIHNlY3JldFZlcnNpb246IG51bWJlcjtcbiAgaXNBY3RpdmU6IGJvb2xlYW47XG4gIGNyZWF0ZWRBdDogc3RyaW5nO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXZWJob29rc0NyZWF0ZSBleHRlbmRzIEF1dGhlbnRpY2F0ZWRDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID0gXCJDcmVhdGUgYSB3ZWJob29rXCI7XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgICc8JT0gY29uZmlnLmJpbiAlPiB3ZWJob29rcyBjcmVhdGUgLS11cmwgaHR0cHM6Ly9teWFwcC5jb20vd2ViaG9vayAtLWV2ZW50cyBtZXNzYWdlLmRlbGl2ZXJlZCcsXG4gICAgJzwlPSBjb25maWcuYmluICU+IHdlYmhvb2tzIGNyZWF0ZSAtLXVybCBodHRwczovL215YXBwLmNvbS93ZWJob29rIC0tZXZlbnRzIG1lc3NhZ2UuZGVsaXZlcmVkLG1lc3NhZ2UuZmFpbGVkIC0tZGVzY3JpcHRpb24gXCJQcm9kdWN0aW9uIHdlYmhvb2tcIicsXG4gICAgJzwlPSBjb25maWcuYmluICU+IHdlYmhvb2tzIGNyZWF0ZSAtLXVybCBodHRwczovL3dlYmhvb2suc2l0ZS9hYmMxMjMgLS1ldmVudHMgbWVzc2FnZS5zZW50IC0tanNvbicsXG4gIF07XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIC4uLkF1dGhlbnRpY2F0ZWRDb21tYW5kLmJhc2VGbGFncyxcbiAgICB1cmw6IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcInVcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIldlYmhvb2sgVVJMIChtdXN0IGJlIEhUVFBTKVwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSksXG4gICAgZXZlbnRzOiBGbGFncy5zdHJpbmcoe1xuICAgICAgY2hhcjogXCJlXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBldmVudHMgdG8gbGlzdGVuIGZvclwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSksXG4gICAgZGVzY3JpcHRpb246IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcImRcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkRlc2NyaXB0aW9uIGZvciB0aGUgd2ViaG9va1wiLFxuICAgIH0pLFxuICB9O1xuXG4gIGFzeW5jIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGZsYWdzIH0gPSBhd2FpdCB0aGlzLnBhcnNlKFdlYmhvb2tzQ3JlYXRlKTtcblxuICAgIGNvbnN0IGV2ZW50cyA9IGZsYWdzLmV2ZW50cy5zcGxpdChcIixcIikubWFwKGUgPT4gZS50cmltKCkpO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhcGlDbGllbnQucG9zdDxDcmVhdGVXZWJob29rUmVzcG9uc2U+KFwiL2FwaS92MS93ZWJob29rc1wiLCB7XG4gICAgICB1cmw6IGZsYWdzLnVybCxcbiAgICAgIGV2ZW50cyxcbiAgICAgIC4uLihmbGFncy5kZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uOiBmbGFncy5kZXNjcmlwdGlvbiB9KSxcbiAgICB9KTtcblxuICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgIGpzb24ocmVzcG9uc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1Y2Nlc3MoXCJXZWJob29rIGNyZWF0ZWRcIiwge1xuICAgICAgSUQ6IHJlc3BvbnNlLmlkLFxuICAgICAgVVJMOiByZXNwb25zZS51cmwsXG4gICAgICBFdmVudHM6IHJlc3BvbnNlLmV2ZW50cy5qb2luKFwiLCBcIiksXG4gICAgICAuLi4ocmVzcG9uc2UuZGVzY3JpcHRpb24gJiYgeyBEZXNjcmlwdGlvbjogcmVzcG9uc2UuZGVzY3JpcHRpb24gfSksXG4gICAgICBTdGF0dXM6IHJlc3BvbnNlLmlzQWN0aXZlID8gY29sb3JzLnN1Y2Nlc3MoXCJhY3RpdmVcIikgOiBjb2xvcnMud2FybmluZyhcImluYWN0aXZlXCIpLFxuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coKTtcbiAgICB3YXJuKFwiQ29weSB5b3VyIHdlYmhvb2sgc2VjcmV0IG5vdy4gWW91IHdvbid0IGJlIGFibGUgdG8gc2VlIGl0IGFnYWluIVwiKTtcbiAgICBjb2RlQmxvY2socmVzcG9uc2Uuc2VjcmV0KTtcblxuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coY29sb3JzLmRpbShcIlVzZSB0aGlzIHNlY3JldCB0byB2ZXJpZnkgd2ViaG9vayBzaWduYXR1cmVzIGluIHlvdXIgYXBwbGljYXRpb24uXCIpKTtcbiAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwiU2VlIHRoZSBkb2NzIGZvciBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGV4YW1wbGVzLlwiKSk7XG4gIH1cbn0iXX0=
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
2
|
+
export default class WebhooksDelete extends AuthenticatedCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
id: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
yes: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
10
|
+
json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
11
|
+
quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
12
|
+
};
|
|
13
|
+
run(): Promise<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Args, Flags } from "@oclif/core";
|
|
2
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
3
|
+
import { apiClient } from "../../lib/api-client.js";
|
|
4
|
+
import { success, error, json, colors, isJsonMode } from "../../lib/output.js";
|
|
5
|
+
import inquirer from "inquirer";
|
|
6
|
+
export default class WebhooksDelete extends AuthenticatedCommand {
|
|
7
|
+
static description = "Delete a webhook";
|
|
8
|
+
static examples = [
|
|
9
|
+
"<%= config.bin %> webhooks delete whk_abc123",
|
|
10
|
+
"<%= config.bin %> webhooks delete whk_abc123 --yes",
|
|
11
|
+
"<%= config.bin %> webhooks delete whk_abc123 --json",
|
|
12
|
+
];
|
|
13
|
+
static args = {
|
|
14
|
+
id: Args.string({
|
|
15
|
+
description: "Webhook ID to delete",
|
|
16
|
+
required: true,
|
|
17
|
+
}),
|
|
18
|
+
};
|
|
19
|
+
static flags = {
|
|
20
|
+
...AuthenticatedCommand.baseFlags,
|
|
21
|
+
yes: Flags.boolean({
|
|
22
|
+
char: "y",
|
|
23
|
+
description: "Skip confirmation prompt",
|
|
24
|
+
default: false,
|
|
25
|
+
}),
|
|
26
|
+
};
|
|
27
|
+
async run() {
|
|
28
|
+
const { args, flags } = await this.parse(WebhooksDelete);
|
|
29
|
+
// Get webhook details for confirmation
|
|
30
|
+
let webhook;
|
|
31
|
+
try {
|
|
32
|
+
webhook = await apiClient.get(`/api/v1/webhooks/${args.id}`);
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
error(`Webhook not found: ${args.id}`);
|
|
36
|
+
this.exit(1);
|
|
37
|
+
}
|
|
38
|
+
// Confirm deletion
|
|
39
|
+
if (!flags.yes && !isJsonMode()) {
|
|
40
|
+
const { confirm } = await inquirer.prompt([
|
|
41
|
+
{
|
|
42
|
+
type: "confirm",
|
|
43
|
+
name: "confirm",
|
|
44
|
+
message: `Are you sure you want to delete webhook ${colors.code(args.id)} (${colors.dim(webhook.url)})? This cannot be undone.`,
|
|
45
|
+
default: false,
|
|
46
|
+
},
|
|
47
|
+
]);
|
|
48
|
+
if (!confirm) {
|
|
49
|
+
error("Deletion cancelled");
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
await apiClient.delete(`/api/v1/webhooks/${args.id}`);
|
|
54
|
+
if (isJsonMode()) {
|
|
55
|
+
json({ success: true, webhookId: args.id, deleted: true });
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
success("Webhook deleted", {
|
|
59
|
+
ID: args.id,
|
|
60
|
+
URL: webhook.url,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3dlYmhvb2tzL2RlbGV0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMxQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMvRSxPQUFPLFFBQVEsTUFBTSxVQUFVLENBQUM7QUFFaEMsTUFBTSxDQUFDLE9BQU8sT0FBTyxjQUFlLFNBQVEsb0JBQW9CO0lBQzlELE1BQU0sQ0FBQyxXQUFXLEdBQUcsa0JBQWtCLENBQUM7SUFFeEMsTUFBTSxDQUFDLFFBQVEsR0FBRztRQUNoQiw4Q0FBOEM7UUFDOUMsb0RBQW9EO1FBQ3BELHFEQUFxRDtLQUN0RCxDQUFDO0lBRUYsTUFBTSxDQUFDLElBQUksR0FBRztRQUNaLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ2QsV0FBVyxFQUFFLHNCQUFzQjtZQUNuQyxRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUM7S0FDSCxDQUFDO0lBRUYsTUFBTSxDQUFDLEtBQUssR0FBRztRQUNiLEdBQUcsb0JBQW9CLENBQUMsU0FBUztRQUNqQyxHQUFHLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUNqQixJQUFJLEVBQUUsR0FBRztZQUNULFdBQVcsRUFBRSwwQkFBMEI7WUFDdkMsT0FBTyxFQUFFLEtBQUs7U0FDZixDQUFDO0tBQ0gsQ0FBQztJQUVGLEtBQUssQ0FBQyxHQUFHO1FBQ1AsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFekQsdUNBQXVDO1FBQ3ZDLElBQUksT0FBTyxDQUFDO1FBQ1osSUFBSSxDQUFDO1lBQ0gsT0FBTyxHQUFHLE1BQU0sU0FBUyxDQUFDLEdBQUcsQ0FBOEIsb0JBQW9CLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVGLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsS0FBSyxDQUFDLHNCQUFzQixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2YsQ0FBQztRQUVELG1CQUFtQjtRQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDaEMsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQztnQkFDeEM7b0JBQ0UsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsT0FBTyxFQUFFLDJDQUEyQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCO29CQUMvSCxPQUFPLEVBQUUsS0FBSztpQkFDZjthQUNGLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDYixLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztnQkFDNUIsT0FBTztZQUNULENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxTQUFTLENBQUMsTUFBTSxDQUFDLG9CQUFvQixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUV0RCxJQUFJLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMzRCxPQUFPO1FBQ1QsQ0FBQztRQUVELE9BQU8sQ0FBQyxpQkFBaUIsRUFBRTtZQUN6QixFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDWCxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7U0FDakIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFyZ3MsIEZsYWdzIH0gZnJvbSBcIkBvY2xpZi9jb3JlXCI7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGVkQ29tbWFuZCB9IGZyb20gXCIuLi8uLi9saWIvYmFzZS1jb21tYW5kLmpzXCI7XG5pbXBvcnQgeyBhcGlDbGllbnQgfSBmcm9tIFwiLi4vLi4vbGliL2FwaS1jbGllbnQuanNcIjtcbmltcG9ydCB7IHN1Y2Nlc3MsIGVycm9yLCBqc29uLCBjb2xvcnMsIGlzSnNvbk1vZGUgfSBmcm9tIFwiLi4vLi4vbGliL291dHB1dC5qc1wiO1xuaW1wb3J0IGlucXVpcmVyIGZyb20gXCJpbnF1aXJlclwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXZWJob29rc0RlbGV0ZSBleHRlbmRzIEF1dGhlbnRpY2F0ZWRDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID0gXCJEZWxldGUgYSB3ZWJob29rXCI7XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gd2ViaG9va3MgZGVsZXRlIHdoa19hYmMxMjNcIixcbiAgICBcIjwlPSBjb25maWcuYmluICU+IHdlYmhvb2tzIGRlbGV0ZSB3aGtfYWJjMTIzIC0teWVzXCIsXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiB3ZWJob29rcyBkZWxldGUgd2hrX2FiYzEyMyAtLWpzb25cIixcbiAgXTtcblxuICBzdGF0aWMgYXJncyA9IHtcbiAgICBpZDogQXJncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246IFwiV2ViaG9vayBJRCB0byBkZWxldGVcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pLFxuICB9O1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5BdXRoZW50aWNhdGVkQ29tbWFuZC5iYXNlRmxhZ3MsXG4gICAgeWVzOiBGbGFncy5ib29sZWFuKHtcbiAgICAgIGNoYXI6IFwieVwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiU2tpcCBjb25maXJtYXRpb24gcHJvbXB0XCIsXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB9KSxcbiAgfTtcblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBhcmdzLCBmbGFncyB9ID0gYXdhaXQgdGhpcy5wYXJzZShXZWJob29rc0RlbGV0ZSk7XG5cbiAgICAvLyBHZXQgd2ViaG9vayBkZXRhaWxzIGZvciBjb25maXJtYXRpb25cbiAgICBsZXQgd2ViaG9vaztcbiAgICB0cnkge1xuICAgICAgd2ViaG9vayA9IGF3YWl0IGFwaUNsaWVudC5nZXQ8eyBpZDogc3RyaW5nOyB1cmw6IHN0cmluZyB9PihgL2FwaS92MS93ZWJob29rcy8ke2FyZ3MuaWR9YCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBlcnJvcihgV2ViaG9vayBub3QgZm91bmQ6ICR7YXJncy5pZH1gKTtcbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBDb25maXJtIGRlbGV0aW9uXG4gICAgaWYgKCFmbGFncy55ZXMgJiYgIWlzSnNvbk1vZGUoKSkge1xuICAgICAgY29uc3QgeyBjb25maXJtIH0gPSBhd2FpdCBpbnF1aXJlci5wcm9tcHQoW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJjb25maXJtXCIsXG4gICAgICAgICAgbmFtZTogXCJjb25maXJtXCIsXG4gICAgICAgICAgbWVzc2FnZTogYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgd2ViaG9vayAke2NvbG9ycy5jb2RlKGFyZ3MuaWQpfSAoJHtjb2xvcnMuZGltKHdlYmhvb2sudXJsKX0pPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuYCxcbiAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuXG4gICAgICBpZiAoIWNvbmZpcm0pIHtcbiAgICAgICAgZXJyb3IoXCJEZWxldGlvbiBjYW5jZWxsZWRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBhcGlDbGllbnQuZGVsZXRlKGAvYXBpL3YxL3dlYmhvb2tzLyR7YXJncy5pZH1gKTtcblxuICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgIGpzb24oeyBzdWNjZXNzOiB0cnVlLCB3ZWJob29rSWQ6IGFyZ3MuaWQsIGRlbGV0ZWQ6IHRydWUgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VjY2VzcyhcIldlYmhvb2sgZGVsZXRlZFwiLCB7XG4gICAgICBJRDogYXJncy5pZCxcbiAgICAgIFVSTDogd2ViaG9vay51cmwsXG4gICAgfSk7XG4gIH1cbn0iXX0=
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
2
|
+
export default class WebhooksDeliveries extends AuthenticatedCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
id: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
limit: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<number, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
10
|
+
"failed-only": import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
11
|
+
json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
12
|
+
quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
13
|
+
};
|
|
14
|
+
run(): Promise<void>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { Args, Flags } from "@oclif/core";
|
|
2
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
3
|
+
import { apiClient } from "../../lib/api-client.js";
|
|
4
|
+
import { table, json, info, colors, formatDate, isJsonMode, } from "../../lib/output.js";
|
|
5
|
+
export default class WebhooksDeliveries extends AuthenticatedCommand {
|
|
6
|
+
static description = "View webhook delivery history";
|
|
7
|
+
static examples = [
|
|
8
|
+
"<%= config.bin %> webhooks deliveries whk_abc123",
|
|
9
|
+
"<%= config.bin %> webhooks deliveries whk_abc123 --limit 20",
|
|
10
|
+
"<%= config.bin %> webhooks deliveries whk_abc123 --failed-only",
|
|
11
|
+
"<%= config.bin %> webhooks deliveries whk_abc123 --json",
|
|
12
|
+
];
|
|
13
|
+
static args = {
|
|
14
|
+
id: Args.string({
|
|
15
|
+
description: "Webhook ID",
|
|
16
|
+
required: true,
|
|
17
|
+
}),
|
|
18
|
+
};
|
|
19
|
+
static flags = {
|
|
20
|
+
...AuthenticatedCommand.baseFlags,
|
|
21
|
+
limit: Flags.integer({
|
|
22
|
+
char: "l",
|
|
23
|
+
description: "Number of deliveries to show",
|
|
24
|
+
default: 10,
|
|
25
|
+
}),
|
|
26
|
+
"failed-only": Flags.boolean({
|
|
27
|
+
description: "Show only failed deliveries",
|
|
28
|
+
default: false,
|
|
29
|
+
}),
|
|
30
|
+
};
|
|
31
|
+
async run() {
|
|
32
|
+
const { args, flags } = await this.parse(WebhooksDeliveries);
|
|
33
|
+
const params = new URLSearchParams({
|
|
34
|
+
limit: String(flags.limit),
|
|
35
|
+
...(flags["failed-only"] && { status: "failed" }),
|
|
36
|
+
});
|
|
37
|
+
const deliveries = await apiClient.get(`/api/v1/webhooks/${args.id}/deliveries?${params.toString()}`);
|
|
38
|
+
if (isJsonMode()) {
|
|
39
|
+
json(deliveries);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (deliveries.length === 0) {
|
|
43
|
+
info(flags["failed-only"] ? "No failed deliveries found" : "No deliveries found");
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
console.log();
|
|
47
|
+
console.log(colors.dim(`Showing ${deliveries.length} deliveries for webhook ${args.id}`));
|
|
48
|
+
console.log();
|
|
49
|
+
// Add computed fields for better display
|
|
50
|
+
const deliveriesWithComputed = deliveries.map(d => ({
|
|
51
|
+
...d,
|
|
52
|
+
attemptDisplay: `${d.attemptNumber}/${d.maxAttempts}`,
|
|
53
|
+
}));
|
|
54
|
+
table(deliveriesWithComputed, [
|
|
55
|
+
{
|
|
56
|
+
header: "Delivery ID",
|
|
57
|
+
key: "id",
|
|
58
|
+
width: 18,
|
|
59
|
+
formatter: (v) => colors.dim(String(v).slice(0, 15) + "..."),
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
header: "Event",
|
|
63
|
+
key: "eventType",
|
|
64
|
+
width: 15,
|
|
65
|
+
formatter: (v) => String(v).replace("message.", ""),
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
header: "Status",
|
|
69
|
+
key: "status",
|
|
70
|
+
width: 12,
|
|
71
|
+
formatter: (v) => {
|
|
72
|
+
switch (v) {
|
|
73
|
+
case "delivered":
|
|
74
|
+
return colors.success("delivered");
|
|
75
|
+
case "failed":
|
|
76
|
+
return colors.error("failed");
|
|
77
|
+
case "pending":
|
|
78
|
+
return colors.warning("pending");
|
|
79
|
+
case "cancelled":
|
|
80
|
+
return colors.dim("cancelled");
|
|
81
|
+
default:
|
|
82
|
+
return String(v);
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
header: "Attempt",
|
|
88
|
+
key: "attemptDisplay",
|
|
89
|
+
width: 10,
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
header: "Status Code",
|
|
93
|
+
key: "responseStatusCode",
|
|
94
|
+
width: 12,
|
|
95
|
+
formatter: (v) => {
|
|
96
|
+
if (!v)
|
|
97
|
+
return colors.dim("-");
|
|
98
|
+
const code = Number(v);
|
|
99
|
+
return code >= 200 && code < 300
|
|
100
|
+
? colors.success(String(code))
|
|
101
|
+
: colors.error(String(code));
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
header: "Response Time",
|
|
106
|
+
key: "responseTime",
|
|
107
|
+
width: 14,
|
|
108
|
+
formatter: (v) => v ? `${v}ms` : colors.dim("-"),
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
header: "Created",
|
|
112
|
+
key: "createdAt",
|
|
113
|
+
width: 16,
|
|
114
|
+
formatter: (v) => formatDate(String(v)),
|
|
115
|
+
},
|
|
116
|
+
]);
|
|
117
|
+
// Show failed delivery details
|
|
118
|
+
const failed = deliveries.filter(d => d.status === "failed" && d.errorMessage);
|
|
119
|
+
if (failed.length > 0 && !flags["failed-only"]) {
|
|
120
|
+
console.log();
|
|
121
|
+
console.log(colors.error("Failed deliveries:"));
|
|
122
|
+
failed.forEach(delivery => {
|
|
123
|
+
console.log(colors.dim(` ${delivery.id.slice(0, 15)}...:`), delivery.errorMessage || "Unknown error");
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
// Show pending retries
|
|
127
|
+
const pending = deliveries.filter(d => d.status === "pending" && d.nextRetryAt);
|
|
128
|
+
if (pending.length > 0) {
|
|
129
|
+
console.log();
|
|
130
|
+
console.log(colors.warning("Pending retries:"));
|
|
131
|
+
pending.forEach(delivery => {
|
|
132
|
+
console.log(colors.dim(` ${delivery.id.slice(0, 15)}...:`), `Next retry at ${formatDate(delivery.nextRetryAt)}`);
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsaXZlcmllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy93ZWJob29rcy9kZWxpdmVyaWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsS0FBSyxFQUNMLElBQUksRUFDSixJQUFJLEVBQ0osTUFBTSxFQUNOLFVBQVUsRUFDVixVQUFVLEdBQ1gsTUFBTSxxQkFBcUIsQ0FBQztBQWlCN0IsTUFBTSxDQUFDLE9BQU8sT0FBTyxrQkFBbUIsU0FBUSxvQkFBb0I7SUFDbEUsTUFBTSxDQUFDLFdBQVcsR0FBRywrQkFBK0IsQ0FBQztJQUVyRCxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLGtEQUFrRDtRQUNsRCw2REFBNkQ7UUFDN0QsZ0VBQWdFO1FBQ2hFLHlEQUF5RDtLQUMxRCxDQUFDO0lBRUYsTUFBTSxDQUFDLElBQUksR0FBRztRQUNaLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ2QsV0FBVyxFQUFFLFlBQVk7WUFDekIsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDO0tBQ0gsQ0FBQztJQUVGLE1BQU0sQ0FBQyxLQUFLLEdBQUc7UUFDYixHQUFHLG9CQUFvQixDQUFDLFNBQVM7UUFDakMsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDbkIsSUFBSSxFQUFFLEdBQUc7WUFDVCxXQUFXLEVBQUUsOEJBQThCO1lBQzNDLE9BQU8sRUFBRSxFQUFFO1NBQ1osQ0FBQztRQUNGLGFBQWEsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQzNCLFdBQVcsRUFBRSw2QkFBNkI7WUFDMUMsT0FBTyxFQUFFLEtBQUs7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QUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxpQkFBaUIsVUFBVSxDQUFDLFFBQVEsQ0FBQyxXQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckgsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFyZ3MsIEZsYWdzIH0gZnJvbSBcIkBvY2xpZi9jb3JlXCI7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGVkQ29tbWFuZCB9IGZyb20gXCIuLi8uLi9saWIvYmFzZS1jb21tYW5kLmpzXCI7XG5pbXBvcnQgeyBhcGlDbGllbnQgfSBmcm9tIFwiLi4vLi4vbGliL2FwaS1jbGllbnQuanNcIjtcbmltcG9ydCB7XG4gIHRhYmxlLFxuICBqc29uLFxuICBpbmZvLFxuICBjb2xvcnMsXG4gIGZvcm1hdERhdGUsXG4gIGlzSnNvbk1vZGUsXG59IGZyb20gXCIuLi8uLi9saWIvb3V0cHV0LmpzXCI7XG5cbmludGVyZmFjZSBXZWJob29rRGVsaXZlcnkge1xuICBpZDogc3RyaW5nO1xuICBldmVudFR5cGU6IHN0cmluZztcbiAgYXR0ZW1wdE51bWJlcjogbnVtYmVyO1xuICBtYXhBdHRlbXB0czogbnVtYmVyO1xuICBzdGF0dXM6IFwicGVuZGluZ1wiIHwgXCJkZWxpdmVyZWRcIiB8IFwiZmFpbGVkXCIgfCBcImNhbmNlbGxlZFwiO1xuICByZXNwb25zZVN0YXR1c0NvZGU/OiBudW1iZXI7XG4gIHJlc3BvbnNlVGltZT86IG51bWJlcjtcbiAgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xuICBlcnJvckNvZGU/OiBzdHJpbmc7XG4gIG5leHRSZXRyeUF0Pzogc3RyaW5nO1xuICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgZGVsaXZlcmVkQXQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdlYmhvb2tzRGVsaXZlcmllcyBleHRlbmRzIEF1dGhlbnRpY2F0ZWRDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID0gXCJWaWV3IHdlYmhvb2sgZGVsaXZlcnkgaGlzdG9yeVwiO1xuXG4gIHN0YXRpYyBleGFtcGxlcyA9IFtcbiAgICBcIjwlPSBjb25maWcuYmluICU+IHdlYmhvb2tzIGRlbGl2ZXJpZXMgd2hrX2FiYzEyM1wiLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gd2ViaG9va3MgZGVsaXZlcmllcyB3aGtfYWJjMTIzIC0tbGltaXQgMjBcIixcbiAgICBcIjwlPSBjb25maWcuYmluICU+IHdlYmhvb2tzIGRlbGl2ZXJpZXMgd2hrX2FiYzEyMyAtLWZhaWxlZC1vbmx5XCIsXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiB3ZWJob29rcyBkZWxpdmVyaWVzIHdoa19hYmMxMjMgLS1qc29uXCIsXG4gIF07XG5cbiAgc3RhdGljIGFyZ3MgPSB7XG4gICAgaWQ6IEFyZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIldlYmhvb2sgSURcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pLFxuICB9O1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5BdXRoZW50aWNhdGVkQ29tbWFuZC5iYXNlRmxhZ3MsXG4gICAgbGltaXQ6IEZsYWdzLmludGVnZXIoe1xuICAgICAgY2hhcjogXCJsXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJOdW1iZXIgb2YgZGVsaXZlcmllcyB0byBzaG93XCIsXG4gICAgICBkZWZhdWx0OiAxMCxcbiAgICB9KSxcbiAgICBcImZhaWxlZC1vbmx5XCI6IEZsYWdzLmJvb2xlYW4oe1xuICAgICAgZGVzY3JpcHRpb246IFwiU2hvdyBvbmx5IGZhaWxlZCBkZWxpdmVyaWVzXCIsXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB9KSxcbiAgfTtcblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBhcmdzLCBmbGFncyB9ID0gYXdhaXQgdGhpcy5wYXJzZShXZWJob29rc0RlbGl2ZXJpZXMpO1xuXG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICBsaW1pdDogU3RyaW5nKGZsYWdzLmxpbWl0KSxcbiAgICAgIC4uLihmbGFnc1tcImZhaWxlZC1vbmx5XCJdICYmIHsgc3RhdHVzOiBcImZhaWxlZFwiIH0pLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZGVsaXZlcmllcyA9IGF3YWl0IGFwaUNsaWVudC5nZXQ8V2ViaG9va0RlbGl2ZXJ5W10+KFxuICAgICAgYC9hcGkvdjEvd2ViaG9va3MvJHthcmdzLmlkfS9kZWxpdmVyaWVzPyR7cGFyYW1zLnRvU3RyaW5nKCl9YFxuICAgICk7XG5cbiAgICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgICBqc29uKGRlbGl2ZXJpZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkZWxpdmVyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaW5mbyhmbGFnc1tcImZhaWxlZC1vbmx5XCJdID8gXCJObyBmYWlsZWQgZGVsaXZlcmllcyBmb3VuZFwiIDogXCJObyBkZWxpdmVyaWVzIGZvdW5kXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coY29sb3JzLmRpbShgU2hvd2luZyAke2RlbGl2ZXJpZXMubGVuZ3RofSBkZWxpdmVyaWVzIGZvciB3ZWJob29rICR7YXJncy5pZH1gKSk7XG4gICAgY29uc29sZS5sb2coKTtcblxuICAgIC8vIEFkZCBjb21wdXRlZCBmaWVsZHMgZm9yIGJldHRlciBkaXNwbGF5XG4gICAgY29uc3QgZGVsaXZlcmllc1dpdGhDb21wdXRlZCA9IGRlbGl2ZXJpZXMubWFwKGQgPT4gKHtcbiAgICAgIC4uLmQsXG4gICAgICBhdHRlbXB0RGlzcGxheTogYCR7ZC5hdHRlbXB0TnVtYmVyfS8ke2QubWF4QXR0ZW1wdHN9YCxcbiAgICB9KSk7XG5cbiAgICB0YWJsZShkZWxpdmVyaWVzV2l0aENvbXB1dGVkLCBbXG4gICAgICB7XG4gICAgICAgIGhlYWRlcjogXCJEZWxpdmVyeSBJRFwiLFxuICAgICAgICBrZXk6IFwiaWRcIixcbiAgICAgICAgd2lkdGg6IDE4LFxuICAgICAgICBmb3JtYXR0ZXI6ICh2KSA9PiBjb2xvcnMuZGltKFN0cmluZyh2KS5zbGljZSgwLCAxNSkgKyBcIi4uLlwiKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGhlYWRlcjogXCJFdmVudFwiLFxuICAgICAgICBrZXk6IFwiZXZlbnRUeXBlXCIsXG4gICAgICAgIHdpZHRoOiAxNSxcbiAgICAgICAgZm9ybWF0dGVyOiAodikgPT4gU3RyaW5nKHYpLnJlcGxhY2UoXCJtZXNzYWdlLlwiLCBcIlwiKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGhlYWRlcjogXCJTdGF0dXNcIixcbiAgICAgICAga2V5OiBcInN0YXR1c1wiLFxuICAgICAgICB3aWR0aDogMTIsXG4gICAgICAgIGZvcm1hdHRlcjogKHYpID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKHYpIHtcbiAgICAgICAgICAgIGNhc2UgXCJkZWxpdmVyZWRcIjpcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbG9ycy5zdWNjZXNzKFwiZGVsaXZlcmVkXCIpO1xuICAgICAgICAgICAgY2FzZSBcImZhaWxlZFwiOlxuICAgICAgICAgICAgICByZXR1cm4gY29sb3JzLmVycm9yKFwiZmFpbGVkXCIpO1xuICAgICAgICAgICAgY2FzZSBcInBlbmRpbmdcIjpcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbG9ycy53YXJuaW5nKFwicGVuZGluZ1wiKTtcbiAgICAgICAgICAgIGNhc2UgXCJjYW5jZWxsZWRcIjpcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbG9ycy5kaW0oXCJjYW5jZWxsZWRcIik7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGhlYWRlcjogXCJBdHRlbXB0XCIsXG4gICAgICAgIGtleTogXCJhdHRlbXB0RGlzcGxheVwiLFxuICAgICAgICB3aWR0aDogMTAsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBoZWFkZXI6IFwiU3RhdHVzIENvZGVcIixcbiAgICAgICAga2V5OiBcInJlc3BvbnNlU3RhdHVzQ29kZVwiLFxuICAgICAgICB3aWR0aDogMTIsXG4gICAgICAgIGZvcm1hdHRlcjogKHYpID0+IHtcbiAgICAgICAgICBpZiAoIXYpIHJldHVybiBjb2xvcnMuZGltKFwiLVwiKTtcbiAgICAgICAgICBjb25zdCBjb2RlID0gTnVtYmVyKHYpO1xuICAgICAgICAgIHJldHVybiBjb2RlID49IDIwMCAmJiBjb2RlIDwgMzAwIFxuICAgICAgICAgICAgPyBjb2xvcnMuc3VjY2VzcyhTdHJpbmcoY29kZSkpXG4gICAgICAgICAgICA6IGNvbG9ycy5lcnJvcihTdHJpbmcoY29kZSkpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyOiBcIlJlc3BvbnNlIFRpbWVcIixcbiAgICAgICAga2V5OiBcInJlc3BvbnNlVGltZVwiLFxuICAgICAgICB3aWR0aDogMTQsXG4gICAgICAgIGZvcm1hdHRlcjogKHYpID0+IHYgPyBgJHt2fW1zYCA6IGNvbG9ycy5kaW0oXCItXCIpLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyOiBcIkNyZWF0ZWRcIixcbiAgICAgICAga2V5OiBcImNyZWF0ZWRBdFwiLFxuICAgICAgICB3aWR0aDogMTYsXG4gICAgICAgIGZvcm1hdHRlcjogKHYpID0+IGZvcm1hdERhdGUoU3RyaW5nKHYpKSxcbiAgICAgIH0sXG4gICAgXSk7XG5cbiAgICAvLyBTaG93IGZhaWxlZCBkZWxpdmVyeSBkZXRhaWxzXG4gICAgY29uc3QgZmFpbGVkID0gZGVsaXZlcmllcy5maWx0ZXIoZCA9PiBkLnN0YXR1cyA9PT0gXCJmYWlsZWRcIiAmJiBkLmVycm9yTWVzc2FnZSk7XG4gICAgaWYgKGZhaWxlZC5sZW5ndGggPiAwICYmICFmbGFnc1tcImZhaWxlZC1vbmx5XCJdKSB7XG4gICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgY29uc29sZS5sb2coY29sb3JzLmVycm9yKFwiRmFpbGVkIGRlbGl2ZXJpZXM6XCIpKTtcbiAgICAgIGZhaWxlZC5mb3JFYWNoKGRlbGl2ZXJ5ID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coY29sb3JzLmRpbShgICAke2RlbGl2ZXJ5LmlkLnNsaWNlKDAsIDE1KX0uLi46YCksIGRlbGl2ZXJ5LmVycm9yTWVzc2FnZSB8fCBcIlVua25vd24gZXJyb3JcIik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTaG93IHBlbmRpbmcgcmV0cmllc1xuICAgIGNvbnN0IHBlbmRpbmcgPSBkZWxpdmVyaWVzLmZpbHRlcihkID0+IGQuc3RhdHVzID09PSBcInBlbmRpbmdcIiAmJiBkLm5leHRSZXRyeUF0KTtcbiAgICBpZiAocGVuZGluZy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgY29uc29sZS5sb2coY29sb3JzLndhcm5pbmcoXCJQZW5kaW5nIHJldHJpZXM6XCIpKTtcbiAgICAgIHBlbmRpbmcuZm9yRWFjaChkZWxpdmVyeSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oYCAgJHtkZWxpdmVyeS5pZC5zbGljZSgwLCAxNSl9Li4uOmApLCBgTmV4dCByZXRyeSBhdCAke2Zvcm1hdERhdGUoZGVsaXZlcnkubmV4dFJldHJ5QXQhKX1gKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufSJdfQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
2
|
+
export default class WebhooksGet extends AuthenticatedCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
id: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
10
|
+
quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
11
|
+
};
|
|
12
|
+
run(): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Args } from "@oclif/core";
|
|
2
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
3
|
+
import { apiClient } from "../../lib/api-client.js";
|
|
4
|
+
import { keyValue, json, header, formatDate, colors, isJsonMode, } from "../../lib/output.js";
|
|
5
|
+
export default class WebhooksGet extends AuthenticatedCommand {
|
|
6
|
+
static description = "Get webhook details";
|
|
7
|
+
static examples = [
|
|
8
|
+
"<%= config.bin %> webhooks get whk_abc123",
|
|
9
|
+
"<%= config.bin %> webhooks get whk_abc123 --json",
|
|
10
|
+
];
|
|
11
|
+
static args = {
|
|
12
|
+
id: Args.string({
|
|
13
|
+
description: "Webhook ID",
|
|
14
|
+
required: true,
|
|
15
|
+
}),
|
|
16
|
+
};
|
|
17
|
+
static flags = {
|
|
18
|
+
...AuthenticatedCommand.baseFlags,
|
|
19
|
+
};
|
|
20
|
+
async run() {
|
|
21
|
+
const { args } = await this.parse(WebhooksGet);
|
|
22
|
+
const webhook = await apiClient.get(`/api/v1/webhooks/${args.id}`);
|
|
23
|
+
if (isJsonMode()) {
|
|
24
|
+
json(webhook);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
header(`Webhook ${webhook.id}`);
|
|
28
|
+
console.log();
|
|
29
|
+
keyValue({
|
|
30
|
+
"ID": webhook.id,
|
|
31
|
+
"URL": webhook.url,
|
|
32
|
+
"Events": webhook.events.join(", "),
|
|
33
|
+
...(webhook.description ? { "Description": webhook.description } : {}),
|
|
34
|
+
"Status": webhook.isActive ? colors.success("active") : colors.warning("inactive"),
|
|
35
|
+
"Circuit State": webhook.circuitState === "closed"
|
|
36
|
+
? colors.success("closed")
|
|
37
|
+
: webhook.circuitState === "open"
|
|
38
|
+
? colors.error("open")
|
|
39
|
+
: colors.warning("half_open"),
|
|
40
|
+
"Failure Count": String(webhook.failureCount),
|
|
41
|
+
"Secret Version": String(webhook.secretVersion),
|
|
42
|
+
"Created": formatDate(webhook.createdAt),
|
|
43
|
+
"Updated": formatDate(webhook.updatedAt),
|
|
44
|
+
});
|
|
45
|
+
if (webhook.failureCount > 0) {
|
|
46
|
+
console.log();
|
|
47
|
+
console.log(colors.warning(`⚠ This webhook has failed ${webhook.failureCount} times recently.`));
|
|
48
|
+
console.log(colors.dim("Check delivery history with:"), colors.code(`sendly webhooks deliveries ${webhook.id}`));
|
|
49
|
+
}
|
|
50
|
+
if (webhook.circuitState === "open") {
|
|
51
|
+
console.log();
|
|
52
|
+
console.log(colors.error("⚠ Circuit breaker is OPEN - webhook deliveries are paused."));
|
|
53
|
+
console.log(colors.dim("Test your endpoint and the circuit will auto-recover."));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3dlYmhvb2tzL2dldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsUUFBUSxFQUNSLElBQUksRUFDSixNQUFNLEVBQ04sVUFBVSxFQUNWLE1BQU0sRUFFTixVQUFVLEdBQ1gsTUFBTSxxQkFBcUIsQ0FBQztBQWU3QixNQUFNLENBQUMsT0FBTyxPQUFPLFdBQVksU0FBUSxvQkFBb0I7SUFDM0QsTUFBTSxDQUFDLFdBQVcsR0FBRyxxQkFBcUIsQ0FBQztJQUUzQyxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLDJDQUEyQztRQUMzQyxrREFBa0Q7S0FDbkQsQ0FBQztJQUVGLE1BQU0sQ0FBQyxJQUFJLEdBQUc7UUFDWixFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNkLFdBQVcsRUFBRSxZQUFZO1lBQ3pCLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQztLQUNILENBQUM7SUFFRixNQUFNLENBQUMsS0FBSyxHQUFHO1FBQ2IsR0FBRyxvQkFBb0IsQ0FBQyxTQUFTO0tBQ2xDLENBQUM7SUFFRixLQUFLLENBQUMsR0FBRztRQUNQLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFL0MsTUFBTSxPQUFPLEdBQUcsTUFBTSxTQUFTLENBQUMsR0FBRyxDQUFVLG9CQUFvQixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUU1RSxJQUFJLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2QsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLENBQUMsV0FBVyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNoQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFZCxRQUFRLENBQUM7WUFDUCxJQUFJLEVBQUUsT0FBTyxDQUFDLEVBQUU7WUFDaEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxHQUFHO1lBQ2xCLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDbkMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3RFLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztZQUNsRixlQUFlLEVBQUUsT0FBTyxDQUFDLFlBQVksS0FBSyxRQUFRO2dCQUNoRCxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7Z0JBQzFCLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxLQUFLLE1BQU07b0JBQy9CLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztvQkFDdEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1lBQ2pDLGVBQWUsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztZQUM3QyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztZQUMvQyxTQUFTLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7WUFDeEMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1NBQ3pDLENBQUMsQ0FBQztRQUVILElBQUksT0FBTyxDQUFDLFlBQVksR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM3QixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsNkJBQTZCLE9BQU8sQ0FBQyxZQUFZLGtCQUFrQixDQUFDLENBQUMsQ0FBQztZQUNqRyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLDhCQUE4QixPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25ILENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxZQUFZLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDcEMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDREQUE0RCxDQUFDLENBQUMsQ0FBQztZQUN4RixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsdURBQXVELENBQUMsQ0FBQyxDQUFDO1FBQ25GLENBQUM7SUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXJncyB9IGZyb20gXCJAb2NsaWYvY29yZVwiO1xuaW1wb3J0IHsgQXV0aGVudGljYXRlZENvbW1hbmQgfSBmcm9tIFwiLi4vLi4vbGliL2Jhc2UtY29tbWFuZC5qc1wiO1xuaW1wb3J0IHsgYXBpQ2xpZW50IH0gZnJvbSBcIi4uLy4uL2xpYi9hcGktY2xpZW50LmpzXCI7XG5pbXBvcnQge1xuICBrZXlWYWx1ZSxcbiAganNvbixcbiAgaGVhZGVyLFxuICBmb3JtYXREYXRlLFxuICBjb2xvcnMsXG4gIGRpdmlkZXIsXG4gIGlzSnNvbk1vZGUsXG59IGZyb20gXCIuLi8uLi9saWIvb3V0cHV0LmpzXCI7XG5cbmludGVyZmFjZSBXZWJob29rIHtcbiAgaWQ6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIGV2ZW50czogc3RyaW5nW107XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBpc0FjdGl2ZTogYm9vbGVhbjtcbiAgZmFpbHVyZUNvdW50OiBudW1iZXI7XG4gIGNpcmN1aXRTdGF0ZTogXCJjbG9zZWRcIiB8IFwib3BlblwiIHwgXCJoYWxmX29wZW5cIjtcbiAgc2VjcmV0VmVyc2lvbjogbnVtYmVyO1xuICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgdXBkYXRlZEF0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdlYmhvb2tzR2V0IGV4dGVuZHMgQXV0aGVudGljYXRlZENvbW1hbmQge1xuICBzdGF0aWMgZGVzY3JpcHRpb24gPSBcIkdldCB3ZWJob29rIGRldGFpbHNcIjtcblxuICBzdGF0aWMgZXhhbXBsZXMgPSBbXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiB3ZWJob29rcyBnZXQgd2hrX2FiYzEyM1wiLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gd2ViaG9va3MgZ2V0IHdoa19hYmMxMjMgLS1qc29uXCIsXG4gIF07XG5cbiAgc3RhdGljIGFyZ3MgPSB7XG4gICAgaWQ6IEFyZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIldlYmhvb2sgSURcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pLFxuICB9O1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5BdXRoZW50aWNhdGVkQ29tbWFuZC5iYXNlRmxhZ3MsXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgYXJncyB9ID0gYXdhaXQgdGhpcy5wYXJzZShXZWJob29rc0dldCk7XG5cbiAgICBjb25zdCB3ZWJob29rID0gYXdhaXQgYXBpQ2xpZW50LmdldDxXZWJob29rPihgL2FwaS92MS93ZWJob29rcy8ke2FyZ3MuaWR9YCk7XG5cbiAgICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgICBqc29uKHdlYmhvb2spO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGhlYWRlcihgV2ViaG9vayAke3dlYmhvb2suaWR9YCk7XG4gICAgY29uc29sZS5sb2coKTtcblxuICAgIGtleVZhbHVlKHtcbiAgICAgIFwiSURcIjogd2ViaG9vay5pZCxcbiAgICAgIFwiVVJMXCI6IHdlYmhvb2sudXJsLFxuICAgICAgXCJFdmVudHNcIjogd2ViaG9vay5ldmVudHMuam9pbihcIiwgXCIpLFxuICAgICAgLi4uKHdlYmhvb2suZGVzY3JpcHRpb24gPyB7IFwiRGVzY3JpcHRpb25cIjogd2ViaG9vay5kZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgXCJTdGF0dXNcIjogd2ViaG9vay5pc0FjdGl2ZSA/IGNvbG9ycy5zdWNjZXNzKFwiYWN0aXZlXCIpIDogY29sb3JzLndhcm5pbmcoXCJpbmFjdGl2ZVwiKSxcbiAgICAgIFwiQ2lyY3VpdCBTdGF0ZVwiOiB3ZWJob29rLmNpcmN1aXRTdGF0ZSA9PT0gXCJjbG9zZWRcIiBcbiAgICAgICAgPyBjb2xvcnMuc3VjY2VzcyhcImNsb3NlZFwiKVxuICAgICAgICA6IHdlYmhvb2suY2lyY3VpdFN0YXRlID09PSBcIm9wZW5cIiBcbiAgICAgICAgICA/IGNvbG9ycy5lcnJvcihcIm9wZW5cIilcbiAgICAgICAgICA6IGNvbG9ycy53YXJuaW5nKFwiaGFsZl9vcGVuXCIpLFxuICAgICAgXCJGYWlsdXJlIENvdW50XCI6IFN0cmluZyh3ZWJob29rLmZhaWx1cmVDb3VudCksXG4gICAgICBcIlNlY3JldCBWZXJzaW9uXCI6IFN0cmluZyh3ZWJob29rLnNlY3JldFZlcnNpb24pLFxuICAgICAgXCJDcmVhdGVkXCI6IGZvcm1hdERhdGUod2ViaG9vay5jcmVhdGVkQXQpLFxuICAgICAgXCJVcGRhdGVkXCI6IGZvcm1hdERhdGUod2ViaG9vay51cGRhdGVkQXQpLFxuICAgIH0pO1xuXG4gICAgaWYgKHdlYmhvb2suZmFpbHVyZUNvdW50ID4gMCkge1xuICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy53YXJuaW5nKGDimqAgVGhpcyB3ZWJob29rIGhhcyBmYWlsZWQgJHt3ZWJob29rLmZhaWx1cmVDb3VudH0gdGltZXMgcmVjZW50bHkuYCkpO1xuICAgICAgY29uc29sZS5sb2coY29sb3JzLmRpbShcIkNoZWNrIGRlbGl2ZXJ5IGhpc3Rvcnkgd2l0aDpcIiksIGNvbG9ycy5jb2RlKGBzZW5kbHkgd2ViaG9va3MgZGVsaXZlcmllcyAke3dlYmhvb2suaWR9YCkpO1xuICAgIH1cblxuICAgIGlmICh3ZWJob29rLmNpcmN1aXRTdGF0ZSA9PT0gXCJvcGVuXCIpIHtcbiAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICBjb25zb2xlLmxvZyhjb2xvcnMuZXJyb3IoXCLimqAgQ2lyY3VpdCBicmVha2VyIGlzIE9QRU4gLSB3ZWJob29rIGRlbGl2ZXJpZXMgYXJlIHBhdXNlZC5cIikpO1xuICAgICAgY29uc29sZS5sb2coY29sb3JzLmRpbShcIlRlc3QgeW91ciBlbmRwb2ludCBhbmQgdGhlIGNpcmN1aXQgd2lsbCBhdXRvLXJlY292ZXIuXCIpKTtcbiAgICB9XG4gIH1cbn0iXX0=
|
|
@@ -11,7 +11,7 @@ export default class WebhooksList extends AuthenticatedCommand {
|
|
|
11
11
|
...AuthenticatedCommand.baseFlags,
|
|
12
12
|
};
|
|
13
13
|
async run() {
|
|
14
|
-
const webhooks = await apiClient.get("/api/webhooks");
|
|
14
|
+
const webhooks = await apiClient.get("/api/v1/webhooks");
|
|
15
15
|
if (isJsonMode()) {
|
|
16
16
|
json(webhooks);
|
|
17
17
|
return;
|
|
@@ -77,4 +77,4 @@ export default class WebhooksList extends AuthenticatedCommand {
|
|
|
77
77
|
]);
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy93ZWJob29rcy9saXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsS0FBSyxFQUNMLElBQUksRUFDSixJQUFJLEVBRUosTUFBTSxFQUNOLFVBQVUsR0FDWCxNQUFNLHFCQUFxQixDQUFDO0FBYTdCLE1BQU0sQ0FBQyxPQUFPLE9BQU8sWUFBYSxTQUFRLG9CQUFvQjtJQUM1RCxNQUFNLENBQUMsV0FBVyxHQUFHLDBCQUEwQixDQUFDO0lBRWhELE1BQU0sQ0FBQyxRQUFRLEdBQUc7UUFDaEIsaUNBQWlDO1FBQ2pDLHdDQUF3QztLQUN6QyxDQUFDO0lBRUYsTUFBTSxDQUFDLEtBQUssR0FBRztRQUNiLEdBQUcsb0JBQW9CLENBQUMsU0FBUztLQUNsQyxDQUFDO0lBRUYsS0FBSyxDQUFDLEdBQUc7UUFDUCxNQUFNLFFBQVEsR0FBRyxNQUFNLFNBQVMsQ0FBQyxHQUFHLENBQVksa0JBQWtCLENBQUMsQ0FBQztRQUVwRSxJQUFJLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2YsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7WUFDL0IsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxRSxPQUFPLENBQUMsR0FBRyxDQUNULDBCQUEwQixNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEVBQUUsQ0FDbEUsQ0FBQztZQUNGLE9BQU87UUFDVCxDQUFDO1FBRUQsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRWQsS0FBSyxDQUFDLFFBQVEsRUFBRTtZQUNkO2dCQUNFLE1BQU0sRUFBRSxJQUFJO2dCQUNaLEdBQUcsRUFBRSxJQUFJO2dCQUNULEtBQUssRUFBRSxFQUFFO2dCQUNULFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7YUFDN0Q7WUFDRDtnQkFDRSxNQUFNLEVBQUUsS0FBSztnQkFDYixHQUFHLEVBQUUsS0FBSztnQkFDVixLQUFLLEVBQUUsRUFBRTtnQkFDVCxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtvQkFDZixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3RCLE9BQU8sR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUMxRCxDQUFDO2FBQ0Y7WUFDRDtnQkFDRSxNQUFNLEVBQUUsUUFBUTtnQkFDaEIsR0FBRyxFQUFFLFFBQVE7Z0JBQ2IsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ2YsTUFBTSxNQUFNLEdBQUcsQ0FBYSxDQUFDO29CQUM3QixPQUFPLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQzt3QkFDdEIsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sU0FBUzt3QkFDM0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDbEQsQ0FBQzthQUNGO1lBQ0Q7Z0JBQ0UsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLEdBQUcsRUFBRSxVQUFVO2dCQUNmLEtBQUssRUFBRSxFQUFFO2dCQUNULFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ2YsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQzthQUMxRDtZQUNEO2dCQUNFLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixHQUFHLEVBQUUsY0FBYztnQkFDbkIsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ2YsUUFBUSxDQUFDLEVBQUUsQ0FBQzt3QkFDVixLQUFLLFFBQVE7NEJBQ1gsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUNsQyxLQUFLLE1BQU07NEJBQ1QsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUM5QixLQUFLLFdBQVc7NEJBQ2QsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO3dCQUNyQzs0QkFDRSxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDckIsQ0FBQztnQkFDSCxDQUFDO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXV0aGVudGljYXRlZENvbW1hbmQgfSBmcm9tIFwiLi4vLi4vbGliL2Jhc2UtY29tbWFuZC5qc1wiO1xuaW1wb3J0IHsgYXBpQ2xpZW50IH0gZnJvbSBcIi4uLy4uL2xpYi9hcGktY2xpZW50LmpzXCI7XG5pbXBvcnQge1xuICB0YWJsZSxcbiAganNvbixcbiAgaW5mbyxcbiAgZm9ybWF0U3RhdHVzLFxuICBjb2xvcnMsXG4gIGlzSnNvbk1vZGUsXG59IGZyb20gXCIuLi8uLi9saWIvb3V0cHV0LmpzXCI7XG5cbmludGVyZmFjZSBXZWJob29rIHtcbiAgaWQ6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBldmVudHM6IHN0cmluZ1tdO1xuICBpc0FjdGl2ZTogYm9vbGVhbjtcbiAgZmFpbHVyZUNvdW50OiBudW1iZXI7XG4gIGNpcmN1aXRTdGF0ZTogXCJjbG9zZWRcIiB8IFwib3BlblwiIHwgXCJoYWxmX29wZW5cIjtcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdlYmhvb2tzTGlzdCBleHRlbmRzIEF1dGhlbnRpY2F0ZWRDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID0gXCJMaXN0IGNvbmZpZ3VyZWQgd2ViaG9va3NcIjtcblxuICBzdGF0aWMgZXhhbXBsZXMgPSBbXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiB3ZWJob29rcyBsaXN0XCIsXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiB3ZWJob29rcyBsaXN0IC0tanNvblwiLFxuICBdO1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5BdXRoZW50aWNhdGVkQ29tbWFuZC5iYXNlRmxhZ3MsXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHdlYmhvb2tzID0gYXdhaXQgYXBpQ2xpZW50LmdldDxXZWJob29rW10+KFwiL2FwaS92MS93ZWJob29rc1wiKTtcblxuICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgIGpzb24od2ViaG9va3MpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh3ZWJob29rcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGluZm8oXCJObyB3ZWJob29rcyBjb25maWd1cmVkXCIpO1xuICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgIGNvbnNvbGUubG9nKGAgIENyZWF0ZSBvbmUgd2l0aCAke2NvbG9ycy5jb2RlKFwic2VuZGx5IHdlYmhvb2tzIGNyZWF0ZVwiKX1gKTtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgICBPciB0ZXN0IGxvY2FsbHkgd2l0aCAke2NvbG9ycy5jb2RlKFwic2VuZGx5IHdlYmhvb2tzIGxpc3RlblwiKX1gLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygpO1xuXG4gICAgdGFibGUod2ViaG9va3MsIFtcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyOiBcIklEXCIsXG4gICAgICAgIGtleTogXCJpZFwiLFxuICAgICAgICB3aWR0aDogMTgsXG4gICAgICAgIGZvcm1hdHRlcjogKHYpID0+IGNvbG9ycy5kaW0oU3RyaW5nKHYpLnNsaWNlKDAsIDE1KSArIFwiLi4uXCIpLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyOiBcIlVSTFwiLFxuICAgICAgICBrZXk6IFwidXJsXCIsXG4gICAgICAgIHdpZHRoOiAzNSxcbiAgICAgICAgZm9ybWF0dGVyOiAodikgPT4ge1xuICAgICAgICAgIGNvbnN0IHVybCA9IFN0cmluZyh2KTtcbiAgICAgICAgICByZXR1cm4gdXJsLmxlbmd0aCA+IDMyID8gdXJsLnNsaWNlKDAsIDMyKSArIFwiLi4uXCIgOiB1cmw7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBoZWFkZXI6IFwiRXZlbnRzXCIsXG4gICAgICAgIGtleTogXCJldmVudHNcIixcbiAgICAgICAgd2lkdGg6IDE1LFxuICAgICAgICBmb3JtYXR0ZXI6ICh2KSA9PiB7XG4gICAgICAgICAgY29uc3QgZXZlbnRzID0gdiBhcyBzdHJpbmdbXTtcbiAgICAgICAgICByZXR1cm4gZXZlbnRzLmxlbmd0aCA+IDJcbiAgICAgICAgICAgID8gYCR7ZXZlbnRzLmxlbmd0aH0gZXZlbnRzYFxuICAgICAgICAgICAgOiBldmVudHMuam9pbihcIiwgXCIpLnJlcGxhY2UoL21lc3NhZ2VcXC4vZywgXCJcIik7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBoZWFkZXI6IFwiU3RhdHVzXCIsXG4gICAgICAgIGtleTogXCJpc0FjdGl2ZVwiLFxuICAgICAgICB3aWR0aDogMTAsXG4gICAgICAgIGZvcm1hdHRlcjogKHYpID0+XG4gICAgICAgICAgdiA/IGNvbG9ycy5zdWNjZXNzKFwiYWN0aXZlXCIpIDogY29sb3JzLmVycm9yKFwiZGlzYWJsZWRcIiksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBoZWFkZXI6IFwiQ2lyY3VpdFwiLFxuICAgICAgICBrZXk6IFwiY2lyY3VpdFN0YXRlXCIsXG4gICAgICAgIHdpZHRoOiAxMCxcbiAgICAgICAgZm9ybWF0dGVyOiAodikgPT4ge1xuICAgICAgICAgIHN3aXRjaCAodikge1xuICAgICAgICAgICAgY2FzZSBcImNsb3NlZFwiOlxuICAgICAgICAgICAgICByZXR1cm4gY29sb3JzLnN1Y2Nlc3MoXCJjbG9zZWRcIik7XG4gICAgICAgICAgICBjYXNlIFwib3BlblwiOlxuICAgICAgICAgICAgICByZXR1cm4gY29sb3JzLmVycm9yKFwib3BlblwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJoYWxmX29wZW5cIjpcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbG9ycy53YXJuaW5nKFwiaGFsZl9vcGVuXCIpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0pO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
2
|
+
export default class WebhooksRotateSecret extends AuthenticatedCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
id: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
yes: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
10
|
+
json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
11
|
+
quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
12
|
+
};
|
|
13
|
+
run(): Promise<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { Args, Flags } from "@oclif/core";
|
|
2
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
3
|
+
import { apiClient } from "../../lib/api-client.js";
|
|
4
|
+
import { success, warn, error, json, colors, codeBlock, isJsonMode, } from "../../lib/output.js";
|
|
5
|
+
import inquirer from "inquirer";
|
|
6
|
+
export default class WebhooksRotateSecret extends AuthenticatedCommand {
|
|
7
|
+
static description = "Rotate webhook secret";
|
|
8
|
+
static examples = [
|
|
9
|
+
"<%= config.bin %> webhooks rotate-secret whk_abc123",
|
|
10
|
+
"<%= config.bin %> webhooks rotate-secret whk_abc123 --yes",
|
|
11
|
+
"<%= config.bin %> webhooks rotate-secret whk_abc123 --json",
|
|
12
|
+
];
|
|
13
|
+
static args = {
|
|
14
|
+
id: Args.string({
|
|
15
|
+
description: "Webhook ID",
|
|
16
|
+
required: true,
|
|
17
|
+
}),
|
|
18
|
+
};
|
|
19
|
+
static flags = {
|
|
20
|
+
...AuthenticatedCommand.baseFlags,
|
|
21
|
+
yes: Flags.boolean({
|
|
22
|
+
char: "y",
|
|
23
|
+
description: "Skip confirmation prompt",
|
|
24
|
+
default: false,
|
|
25
|
+
}),
|
|
26
|
+
};
|
|
27
|
+
async run() {
|
|
28
|
+
const { args, flags } = await this.parse(WebhooksRotateSecret);
|
|
29
|
+
// Get webhook details for confirmation
|
|
30
|
+
let webhook;
|
|
31
|
+
try {
|
|
32
|
+
webhook = await apiClient.get(`/api/v1/webhooks/${args.id}`);
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
error(`Webhook not found: ${args.id}`);
|
|
36
|
+
this.exit(1);
|
|
37
|
+
}
|
|
38
|
+
// Confirm rotation
|
|
39
|
+
if (!flags.yes && !isJsonMode()) {
|
|
40
|
+
console.log();
|
|
41
|
+
console.log(colors.warning("⚠ This will rotate the webhook secret and invalidate the old one after 24 hours."));
|
|
42
|
+
console.log(colors.dim("Make sure to update your application with the new secret."));
|
|
43
|
+
console.log();
|
|
44
|
+
const { confirm } = await inquirer.prompt([
|
|
45
|
+
{
|
|
46
|
+
type: "confirm",
|
|
47
|
+
name: "confirm",
|
|
48
|
+
message: `Rotate secret for webhook ${colors.code(args.id)} (${colors.dim(webhook.url)})?`,
|
|
49
|
+
default: false,
|
|
50
|
+
},
|
|
51
|
+
]);
|
|
52
|
+
if (!confirm) {
|
|
53
|
+
error("Secret rotation cancelled");
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
const result = await apiClient.post(`/api/v1/webhooks/${args.id}/rotate-secret`);
|
|
59
|
+
if (isJsonMode()) {
|
|
60
|
+
json(result);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
success("Webhook secret rotated", {
|
|
64
|
+
"Webhook ID": result.id,
|
|
65
|
+
"Secret Version": `${webhook.secretVersion} → ${result.newSecretVersion}`,
|
|
66
|
+
"Grace Period": `${result.gracePeriodHours} hours`,
|
|
67
|
+
"Rotated At": result.rotatedAt,
|
|
68
|
+
});
|
|
69
|
+
console.log();
|
|
70
|
+
warn("Copy your new webhook secret now. The old secret will expire in 24 hours!");
|
|
71
|
+
codeBlock(result.newSecret);
|
|
72
|
+
console.log();
|
|
73
|
+
console.log(colors.dim("Update your application with this new secret for webhook signature verification."));
|
|
74
|
+
console.log(colors.dim(`The old secret will remain valid for ${result.gracePeriodHours} hours to allow for graceful migration.`));
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
if (err instanceof Error) {
|
|
78
|
+
error(`Failed to rotate secret: ${err.message}`);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
error(`Failed to rotate secret: ${String(err)}`);
|
|
82
|
+
}
|
|
83
|
+
this.exit(1);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm90YXRlLXNlY3JldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy93ZWJob29rcy9yb3RhdGUtc2VjcmV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsT0FBTyxFQUNQLElBQUksRUFDSixLQUFLLEVBQ0wsSUFBSSxFQUNKLE1BQU0sRUFDTixTQUFTLEVBQ1QsVUFBVSxHQUNYLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxRQUFRLE1BQU0sVUFBVSxDQUFDO0FBVWhDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sb0JBQXFCLFNBQVEsb0JBQW9CO0lBQ3BFLE1BQU0sQ0FBQyxXQUFXLEdBQUcsdUJBQXVCLENBQUM7SUFFN0MsTUFBTSxDQUFDLFFBQVEsR0FBRztRQUNoQixxREFBcUQ7UUFDckQsMkRBQTJEO1FBQzNELDREQUE0RDtLQUM3RCxDQUFDO0lBRUYsTUFBTSxDQUFDLElBQUksR0FBRztRQUNaLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ2QsV0FBVyxFQUFFLFlBQVk7WUFDekIsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDO0tBQ0gsQ0FBQztJQUVGLE1BQU0sQ0FBQyxLQUFLLEdBQUc7UUFDYixHQUFHLG9CQUFvQixDQUFDLFNBQVM7UUFDakMsR0FBRyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDakIsSUFBSSxFQUFFLEdBQUc7WUFDVCxXQUFXLEVBQUUsMEJBQTBCO1lBQ3ZDLE9BQU8sRUFBRSxLQUFLO1NBQ2YsQ0FBQztLQUNILENBQUM7SUFFRixLQUFLLENBQUMsR0FBRztRQUNQLE1BQU0sRUFBRSxJ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QUNOLEtBQUssQ0FBQyw0QkFBNEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNuRCxDQUFDO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXJncywgRmxhZ3MgfSBmcm9tIFwiQG9jbGlmL2NvcmVcIjtcbmltcG9ydCB7IEF1dGhlbnRpY2F0ZWRDb21tYW5kIH0gZnJvbSBcIi4uLy4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGFwaUNsaWVudCB9IGZyb20gXCIuLi8uLi9saWIvYXBpLWNsaWVudC5qc1wiO1xuaW1wb3J0IHtcbiAgc3VjY2VzcyxcbiAgd2FybixcbiAgZXJyb3IsXG4gIGpzb24sXG4gIGNvbG9ycyxcbiAgY29kZUJsb2NrLFxuICBpc0pzb25Nb2RlLFxufSBmcm9tIFwiLi4vLi4vbGliL291dHB1dC5qc1wiO1xuaW1wb3J0IGlucXVpcmVyIGZyb20gXCJpbnF1aXJlclwiO1xuXG5pbnRlcmZhY2UgUm90YXRlU2VjcmV0UmVzcG9uc2Uge1xuICBpZDogc3RyaW5nO1xuICBuZXdTZWNyZXQ6IHN0cmluZztcbiAgbmV3U2VjcmV0VmVyc2lvbjogbnVtYmVyO1xuICBncmFjZVBlcmlvZEhvdXJzOiBudW1iZXI7XG4gIHJvdGF0ZWRBdDogc3RyaW5nO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXZWJob29rc1JvdGF0ZVNlY3JldCBleHRlbmRzIEF1dGhlbnRpY2F0ZWRDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID0gXCJSb3RhdGUgd2ViaG9vayBzZWNyZXRcIjtcblxuICBzdGF0aWMgZXhhbXBsZXMgPSBbXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiB3ZWJob29rcyByb3RhdGUtc2VjcmV0IHdoa19hYmMxMjNcIixcbiAgICBcIjwlPSBjb25maWcuYmluICU+IHdlYmhvb2tzIHJvdGF0ZS1zZWNyZXQgd2hrX2FiYzEyMyAtLXllc1wiLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gd2ViaG9va3Mgcm90YXRlLXNlY3JldCB3aGtfYWJjMTIzIC0tanNvblwiLFxuICBdO1xuXG4gIHN0YXRpYyBhcmdzID0ge1xuICAgIGlkOiBBcmdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJXZWJob29rIElEXCIsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KSxcbiAgfTtcblxuICBzdGF0aWMgZmxhZ3MgPSB7XG4gICAgLi4uQXV0aGVudGljYXRlZENvbW1hbmQuYmFzZUZsYWdzLFxuICAgIHllczogRmxhZ3MuYm9vbGVhbih7XG4gICAgICBjaGFyOiBcInlcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlNraXAgY29uZmlybWF0aW9uIHByb21wdFwiLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgfSksXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgYXJncywgZmxhZ3MgfSA9IGF3YWl0IHRoaXMucGFyc2UoV2ViaG9va3NSb3RhdGVTZWNyZXQpO1xuXG4gICAgLy8gR2V0IHdlYmhvb2sgZGV0YWlscyBmb3IgY29uZmlybWF0aW9uXG4gICAgbGV0IHdlYmhvb2s7XG4gICAgdHJ5IHtcbiAgICAgIHdlYmhvb2sgPSBhd2FpdCBhcGlDbGllbnQuZ2V0PHsgaWQ6IHN0cmluZzsgdXJsOiBzdHJpbmc7IHNlY3JldFZlcnNpb246IG51bWJlciB9PihcbiAgICAgICAgYC9hcGkvdjEvd2ViaG9va3MvJHthcmdzLmlkfWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBlcnJvcihgV2ViaG9vayBub3QgZm91bmQ6ICR7YXJncy5pZH1gKTtcbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBDb25maXJtIHJvdGF0aW9uXG4gICAgaWYgKCFmbGFncy55ZXMgJiYgIWlzSnNvbk1vZGUoKSkge1xuICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy53YXJuaW5nKFwi4pqgIFRoaXMgd2lsbCByb3RhdGUgdGhlIHdlYmhvb2sgc2VjcmV0IGFuZCBpbnZhbGlkYXRlIHRoZSBvbGQgb25lIGFmdGVyIDI0IGhvdXJzLlwiKSk7XG4gICAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwiTWFrZSBzdXJlIHRvIHVwZGF0ZSB5b3VyIGFwcGxpY2F0aW9uIHdpdGggdGhlIG5ldyBzZWNyZXQuXCIpKTtcbiAgICAgIGNvbnNvbGUubG9nKCk7XG5cbiAgICAgIGNvbnN0IHsgY29uZmlybSB9ID0gYXdhaXQgaW5xdWlyZXIucHJvbXB0KFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwiY29uZmlybVwiLFxuICAgICAgICAgIG5hbWU6IFwiY29uZmlybVwiLFxuICAgICAgICAgIG1lc3NhZ2U6IGBSb3RhdGUgc2VjcmV0IGZvciB3ZWJob29rICR7Y29sb3JzLmNvZGUoYXJncy5pZCl9ICgke2NvbG9ycy5kaW0od2ViaG9vay51cmwpfSk/YCxcbiAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuXG4gICAgICBpZiAoIWNvbmZpcm0pIHtcbiAgICAgICAgZXJyb3IoXCJTZWNyZXQgcm90YXRpb24gY2FuY2VsbGVkXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFwaUNsaWVudC5wb3N0PFJvdGF0ZVNlY3JldFJlc3BvbnNlPihcbiAgICAgICAgYC9hcGkvdjEvd2ViaG9va3MvJHthcmdzLmlkfS9yb3RhdGUtc2VjcmV0YFxuICAgICAgKTtcblxuICAgICAgaWYgKGlzSnNvbk1vZGUoKSkge1xuICAgICAgICBqc29uKHJlc3VsdCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc3VjY2VzcyhcIldlYmhvb2sgc2VjcmV0IHJvdGF0ZWRcIiwge1xuICAgICAgICBcIldlYmhvb2sgSURcIjogcmVzdWx0LmlkLFxuICAgICAgICBcIlNlY3JldCBWZXJzaW9uXCI6IGAke3dlYmhvb2suc2VjcmV0VmVyc2lvbn0g4oaSICR7cmVzdWx0Lm5ld1NlY3JldFZlcnNpb259YCxcbiAgICAgICAgXCJHcmFjZSBQZXJpb2RcIjogYCR7cmVzdWx0LmdyYWNlUGVyaW9kSG91cnN9IGhvdXJzYCxcbiAgICAgICAgXCJSb3RhdGVkIEF0XCI6IHJlc3VsdC5yb3RhdGVkQXQsXG4gICAgICB9KTtcblxuICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgIHdhcm4oXCJDb3B5IHlvdXIgbmV3IHdlYmhvb2sgc2VjcmV0IG5vdy4gVGhlIG9sZCBzZWNyZXQgd2lsbCBleHBpcmUgaW4gMjQgaG91cnMhXCIpO1xuICAgICAgY29kZUJsb2NrKHJlc3VsdC5uZXdTZWNyZXQpO1xuXG4gICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgY29uc29sZS5sb2coY29sb3JzLmRpbShcIlVwZGF0ZSB5b3VyIGFwcGxpY2F0aW9uIHdpdGggdGhpcyBuZXcgc2VjcmV0IGZvciB3ZWJob29rIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24uXCIpKTtcbiAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oYFRoZSBvbGQgc2VjcmV0IHdpbGwgcmVtYWluIHZhbGlkIGZvciAke3Jlc3VsdC5ncmFjZVBlcmlvZEhvdXJzfSBob3VycyB0byBhbGxvdyBmb3IgZ3JhY2VmdWwgbWlncmF0aW9uLmApKTtcblxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGVycm9yKGBGYWlsZWQgdG8gcm90YXRlIHNlY3JldDogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKGBGYWlsZWQgdG8gcm90YXRlIHNlY3JldDogJHtTdHJpbmcoZXJyKX1gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG4gIH1cbn0iXX0=
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
2
|
+
export default class WebhooksTest extends AuthenticatedCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
id: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
10
|
+
quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
11
|
+
};
|
|
12
|
+
run(): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Args } from "@oclif/core";
|
|
2
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
3
|
+
import { apiClient } from "../../lib/api-client.js";
|
|
4
|
+
import { success, error, spinner, json, colors, isJsonMode, } from "../../lib/output.js";
|
|
5
|
+
export default class WebhooksTest extends AuthenticatedCommand {
|
|
6
|
+
static description = "Send a test event to a webhook";
|
|
7
|
+
static examples = [
|
|
8
|
+
"<%= config.bin %> webhooks test whk_abc123",
|
|
9
|
+
"<%= config.bin %> webhooks test whk_abc123 --json",
|
|
10
|
+
];
|
|
11
|
+
static args = {
|
|
12
|
+
id: Args.string({
|
|
13
|
+
description: "Webhook ID to test",
|
|
14
|
+
required: true,
|
|
15
|
+
}),
|
|
16
|
+
};
|
|
17
|
+
static flags = {
|
|
18
|
+
...AuthenticatedCommand.baseFlags,
|
|
19
|
+
};
|
|
20
|
+
async run() {
|
|
21
|
+
const { args } = await this.parse(WebhooksTest);
|
|
22
|
+
const testSpinner = spinner("Sending test event...");
|
|
23
|
+
testSpinner.start();
|
|
24
|
+
try {
|
|
25
|
+
const result = await apiClient.post(`/api/v1/webhooks/${args.id}/test`);
|
|
26
|
+
testSpinner.stop();
|
|
27
|
+
if (isJsonMode()) {
|
|
28
|
+
json(result);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (result.status === "delivered") {
|
|
32
|
+
success("Test event delivered", {
|
|
33
|
+
"Delivery ID": result.deliveryId,
|
|
34
|
+
"Webhook URL": result.webhookUrl,
|
|
35
|
+
"Event Type": result.eventType,
|
|
36
|
+
"Response Time": `${result.responseTime}ms`,
|
|
37
|
+
"Status Code": String(result.statusCode),
|
|
38
|
+
"Delivered At": result.deliveredAt,
|
|
39
|
+
});
|
|
40
|
+
if (result.responseBody) {
|
|
41
|
+
console.log();
|
|
42
|
+
console.log(colors.dim("Response Body:"));
|
|
43
|
+
console.log(result.responseBody.substring(0, 200) + (result.responseBody.length > 200 ? "..." : ""));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
error("Test event failed", {
|
|
48
|
+
"Delivery ID": result.deliveryId,
|
|
49
|
+
"Webhook URL": result.webhookUrl,
|
|
50
|
+
"Status": result.status,
|
|
51
|
+
"Error": result.error || "Unknown error",
|
|
52
|
+
...(result.statusCode && { "Status Code": String(result.statusCode) }),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
testSpinner.stop();
|
|
58
|
+
if (err instanceof Error && err.message.includes("404")) {
|
|
59
|
+
error(`Webhook not found: ${args.id}`);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
if (err instanceof Error) {
|
|
63
|
+
error(`Failed to send test event: ${err.message}`);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
error(`Failed to send test event: ${String(err)}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
this.exit(1);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy93ZWJob29rcy90ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbkMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFDTCxPQUFPLEVBQ1AsS0FBSyxFQUNMLE9BQU8sRUFDUCxJQUFJLEVBQ0osTUFBTSxFQUVOLFVBQVUsR0FDWCxNQUFNLHFCQUFxQixDQUFDO0FBZTdCLE1BQU0sQ0FBQyxPQUFPLE9BQU8sWUFBYSxTQUFRLG9CQUFvQjtJQUM1RCxNQUFNLENBQUMsV0FBVyxHQUFHLGdDQUFnQyxDQUFDO0lBRXRELE1BQU0sQ0FBQyxRQUFRLEdBQUc7UUFDaEIsNENBQTRDO1FBQzVDLG1EQUFtRDtLQUNwRCxDQUFDO0lBRUYsTUFBTSxDQUFDLElBQUksR0FBRztRQUNaLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ2QsV0FBVyxFQUFFLG9CQUFvQjtZQUNqQyxRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUM7S0FDSCxDQUFDO0lBRUYsTUFBTSxDQUFDLEtBQUssR0FBRztRQUNiLEdBQUcsb0JBQW9CLENBQUMsU0FBUztLQUNsQyxDQUFDO0lBRUYsS0FBSyxDQUFDLEdBQUc7UUFDUCxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRWhELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3JELFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUVwQixJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxJQUFJLENBQXNCLG9CQUFvQixJQUFJLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUU3RixXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFbkIsSUFBSSxVQUFVLEVBQUUsRUFBRSxDQUFDO2dCQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2IsT0FBTztZQUNULENBQUM7WUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7Z0JBQ2xDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRTtvQkFDOUIsYUFBYSxFQUFFLE1BQU0sQ0FBQyxVQUFVO29CQUNoQyxhQUFhLEVBQUUsTUFBTSxDQUFDLFVBQVU7b0JBQ2hDLFlBQVksRUFBRSxNQUFNLENBQUMsU0FBUztvQkFDOUIsZUFBZSxFQUFFLEdBQUcsTUFBTSxDQUFDLFlBQVksSUFBSTtvQkFDM0MsYUFBYSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO29CQUN4QyxjQUFjLEVBQUUsTUFBTSxDQUFDLFdBQVc7aUJBQ25DLENBQUMsQ0FBQztnQkFFSCxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDeEIsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO29CQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7b0JBQzFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZHLENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sS0FBSyxDQUFDLG1CQUFtQixFQUFFO29CQUN6QixhQUFhLEVBQUUsTUFBTSxDQUFDLFVBQVU7b0JBQ2hDLGFBQWEsRUFBRSxNQUFNLENBQUMsVUFBVTtvQkFDaEMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNO29CQUN2QixPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssSUFBSSxlQUFlO29CQUN4QyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxFQUFFLGFBQWEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7aUJBQ3ZFLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVuQixJQUFJLEdBQUcsWUFBWSxLQUFLLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDeEQsS0FBSyxDQUFDLHNCQUFzQixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN6QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxHQUFHLFlBQVksS0FBSyxFQUFFLENBQUM7b0JBQ3pCLEtBQUssQ0FBQyw4QkFBOEIsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ3JELENBQUM7cUJBQU0sQ0FBQztvQkFDTixLQUFLLENBQUMsOEJBQThCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3JELENBQUM7WUFDSCxDQUFDO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXJncyB9IGZyb20gXCJAb2NsaWYvY29yZVwiO1xuaW1wb3J0IHsgQXV0aGVudGljYXRlZENvbW1hbmQgfSBmcm9tIFwiLi4vLi4vbGliL2Jhc2UtY29tbWFuZC5qc1wiO1xuaW1wb3J0IHsgYXBpQ2xpZW50IH0gZnJvbSBcIi4uLy4uL2xpYi9hcGktY2xpZW50LmpzXCI7XG5pbXBvcnQge1xuICBzdWNjZXNzLFxuICBlcnJvcixcbiAgc3Bpbm5lcixcbiAganNvbixcbiAgY29sb3JzLFxuICBrZXlWYWx1ZSxcbiAgaXNKc29uTW9kZSxcbn0gZnJvbSBcIi4uLy4uL2xpYi9vdXRwdXQuanNcIjtcblxuaW50ZXJmYWNlIFRlc3RXZWJob29rUmVzcG9uc2Uge1xuICBpZDogc3RyaW5nO1xuICBkZWxpdmVyeUlkOiBzdHJpbmc7XG4gIHdlYmhvb2tVcmw6IHN0cmluZztcbiAgZXZlbnRUeXBlOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICByZXNwb25zZVRpbWU6IG51bWJlcjtcbiAgc3RhdHVzQ29kZT86IG51bWJlcjtcbiAgcmVzcG9uc2VCb2R5Pzogc3RyaW5nO1xuICBlcnJvcj86IHN0cmluZztcbiAgZGVsaXZlcmVkQXQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2ViaG9va3NUZXN0IGV4dGVuZHMgQXV0aGVudGljYXRlZENvbW1hbmQge1xuICBzdGF0aWMgZGVzY3JpcHRpb24gPSBcIlNlbmQgYSB0ZXN0IGV2ZW50IHRvIGEgd2ViaG9va1wiO1xuXG4gIHN0YXRpYyBleGFtcGxlcyA9IFtcbiAgICBcIjwlPSBjb25maWcuYmluICU+IHdlYmhvb2tzIHRlc3Qgd2hrX2FiYzEyM1wiLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gd2ViaG9va3MgdGVzdCB3aGtfYWJjMTIzIC0tanNvblwiLFxuICBdO1xuXG4gIHN0YXRpYyBhcmdzID0ge1xuICAgIGlkOiBBcmdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJXZWJob29rIElEIHRvIHRlc3RcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pLFxuICB9O1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5BdXRoZW50aWNhdGVkQ29tbWFuZC5iYXNlRmxhZ3MsXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgYXJncyB9ID0gYXdhaXQgdGhpcy5wYXJzZShXZWJob29rc1Rlc3QpO1xuXG4gICAgY29uc3QgdGVzdFNwaW5uZXIgPSBzcGlubmVyKFwiU2VuZGluZyB0ZXN0IGV2ZW50Li4uXCIpO1xuICAgIHRlc3RTcGlubmVyLnN0YXJ0KCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXBpQ2xpZW50LnBvc3Q8VGVzdFdlYmhvb2tSZXNwb25zZT4oYC9hcGkvdjEvd2ViaG9va3MvJHthcmdzLmlkfS90ZXN0YCk7XG4gICAgICBcbiAgICAgIHRlc3RTcGlubmVyLnN0b3AoKTtcblxuICAgICAgaWYgKGlzSnNvbk1vZGUoKSkge1xuICAgICAgICBqc29uKHJlc3VsdCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwiZGVsaXZlcmVkXCIpIHtcbiAgICAgICAgc3VjY2VzcyhcIlRlc3QgZXZlbnQgZGVsaXZlcmVkXCIsIHtcbiAgICAgICAgICBcIkRlbGl2ZXJ5IElEXCI6IHJlc3VsdC5kZWxpdmVyeUlkLFxuICAgICAgICAgIFwiV2ViaG9vayBVUkxcIjogcmVzdWx0LndlYmhvb2tVcmwsXG4gICAgICAgICAgXCJFdmVudCBUeXBlXCI6IHJlc3VsdC5ldmVudFR5cGUsXG4gICAgICAgICAgXCJSZXNwb25zZSBUaW1lXCI6IGAke3Jlc3VsdC5yZXNwb25zZVRpbWV9bXNgLFxuICAgICAgICAgIFwiU3RhdHVzIENvZGVcIjogU3RyaW5nKHJlc3VsdC5zdGF0dXNDb2RlKSxcbiAgICAgICAgICBcIkRlbGl2ZXJlZCBBdFwiOiByZXN1bHQuZGVsaXZlcmVkQXQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQucmVzcG9uc2VCb2R5KSB7XG4gICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwiUmVzcG9uc2UgQm9keTpcIikpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC5yZXNwb25zZUJvZHkuc3Vic3RyaW5nKDAsIDIwMCkgKyAocmVzdWx0LnJlc3BvbnNlQm9keS5sZW5ndGggPiAyMDAgPyBcIi4uLlwiIDogXCJcIikpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcihcIlRlc3QgZXZlbnQgZmFpbGVkXCIsIHtcbiAgICAgICAgICBcIkRlbGl2ZXJ5IElEXCI6IHJlc3VsdC5kZWxpdmVyeUlkLFxuICAgICAgICAgIFwiV2ViaG9vayBVUkxcIjogcmVzdWx0LndlYmhvb2tVcmwsXG4gICAgICAgICAgXCJTdGF0dXNcIjogcmVzdWx0LnN0YXR1cyxcbiAgICAgICAgICBcIkVycm9yXCI6IHJlc3VsdC5lcnJvciB8fCBcIlVua25vd24gZXJyb3JcIixcbiAgICAgICAgICAuLi4ocmVzdWx0LnN0YXR1c0NvZGUgJiYgeyBcIlN0YXR1cyBDb2RlXCI6IFN0cmluZyhyZXN1bHQuc3RhdHVzQ29kZSkgfSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGVzdFNwaW5uZXIuc3RvcCgpO1xuICAgICAgXG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyLm1lc3NhZ2UuaW5jbHVkZXMoXCI0MDRcIikpIHtcbiAgICAgICAgZXJyb3IoYFdlYmhvb2sgbm90IGZvdW5kOiAke2FyZ3MuaWR9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBlcnJvcihgRmFpbGVkIHRvIHNlbmQgdGVzdCBldmVudDogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvcihgRmFpbGVkIHRvIHNlbmQgdGVzdCBldmVudDogJHtTdHJpbmcoZXJyKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH1cbiAgfVxufSJdfQ==
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
2
|
+
export default class WebhooksUpdate extends AuthenticatedCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
id: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
url: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
10
|
+
events: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
11
|
+
description: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
12
|
+
active: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
13
|
+
json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
14
|
+
quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
15
|
+
};
|
|
16
|
+
run(): Promise<void>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { Args, Flags } from "@oclif/core";
|
|
2
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
3
|
+
import { apiClient } from "../../lib/api-client.js";
|
|
4
|
+
import { success, error, json, colors, isJsonMode, } from "../../lib/output.js";
|
|
5
|
+
export default class WebhooksUpdate extends AuthenticatedCommand {
|
|
6
|
+
static description = "Update a webhook";
|
|
7
|
+
static examples = [
|
|
8
|
+
'<%= config.bin %> webhooks update whk_abc123 --url https://newdomain.com/webhook',
|
|
9
|
+
'<%= config.bin %> webhooks update whk_abc123 --events message.delivered,message.failed',
|
|
10
|
+
'<%= config.bin %> webhooks update whk_abc123 --description "Updated production webhook"',
|
|
11
|
+
'<%= config.bin %> webhooks update whk_abc123 --active false',
|
|
12
|
+
'<%= config.bin %> webhooks update whk_abc123 --url https://newdomain.com/webhook --events message.sent --json',
|
|
13
|
+
];
|
|
14
|
+
static args = {
|
|
15
|
+
id: Args.string({
|
|
16
|
+
description: "Webhook ID to update",
|
|
17
|
+
required: true,
|
|
18
|
+
}),
|
|
19
|
+
};
|
|
20
|
+
static flags = {
|
|
21
|
+
...AuthenticatedCommand.baseFlags,
|
|
22
|
+
url: Flags.string({
|
|
23
|
+
char: "u",
|
|
24
|
+
description: "Update webhook URL (must be HTTPS)",
|
|
25
|
+
}),
|
|
26
|
+
events: Flags.string({
|
|
27
|
+
char: "e",
|
|
28
|
+
description: "Update events list (comma-separated)",
|
|
29
|
+
}),
|
|
30
|
+
description: Flags.string({
|
|
31
|
+
char: "d",
|
|
32
|
+
description: "Update description",
|
|
33
|
+
}),
|
|
34
|
+
active: Flags.boolean({
|
|
35
|
+
char: "a",
|
|
36
|
+
description: "Enable or disable the webhook",
|
|
37
|
+
allowNo: true,
|
|
38
|
+
}),
|
|
39
|
+
};
|
|
40
|
+
async run() {
|
|
41
|
+
const { args, flags } = await this.parse(WebhooksUpdate);
|
|
42
|
+
// Check if any update flags were provided
|
|
43
|
+
const hasUpdates = !!(flags.url || flags.events || flags.description || flags.active !== undefined);
|
|
44
|
+
if (!hasUpdates) {
|
|
45
|
+
error("No updates specified. Use --url, --events, --description, or --active flags.");
|
|
46
|
+
this.exit(1);
|
|
47
|
+
}
|
|
48
|
+
// Build update payload
|
|
49
|
+
const updateData = {};
|
|
50
|
+
if (flags.url) {
|
|
51
|
+
updateData.url = flags.url;
|
|
52
|
+
}
|
|
53
|
+
if (flags.events) {
|
|
54
|
+
updateData.events = flags.events.split(",").map(e => e.trim());
|
|
55
|
+
}
|
|
56
|
+
if (flags.description !== undefined) {
|
|
57
|
+
updateData.description = flags.description;
|
|
58
|
+
}
|
|
59
|
+
if (flags.active !== undefined) {
|
|
60
|
+
updateData.isActive = flags.active;
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
const webhook = await apiClient.patch(`/api/v1/webhooks/${args.id}`, updateData);
|
|
64
|
+
if (isJsonMode()) {
|
|
65
|
+
json(webhook);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
success("Webhook updated", {
|
|
69
|
+
ID: webhook.id,
|
|
70
|
+
URL: webhook.url,
|
|
71
|
+
Events: webhook.events.join(", "),
|
|
72
|
+
...(webhook.description && { Description: webhook.description }),
|
|
73
|
+
Status: webhook.isActive ? colors.success("active") : colors.warning("inactive"),
|
|
74
|
+
"Updated At": webhook.updatedAt,
|
|
75
|
+
});
|
|
76
|
+
// Show what changed
|
|
77
|
+
console.log();
|
|
78
|
+
console.log(colors.dim("Updated fields:"));
|
|
79
|
+
if (flags.url)
|
|
80
|
+
console.log(colors.dim(" • URL"));
|
|
81
|
+
if (flags.events)
|
|
82
|
+
console.log(colors.dim(" • Events"));
|
|
83
|
+
if (flags.description !== undefined)
|
|
84
|
+
console.log(colors.dim(" • Description"));
|
|
85
|
+
if (flags.active !== undefined)
|
|
86
|
+
console.log(colors.dim(" • Active status"));
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
if (err instanceof Error && err.message.includes("404")) {
|
|
90
|
+
error(`Webhook not found: ${args.id}`);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
if (err instanceof Error) {
|
|
94
|
+
error(`Failed to update webhook: ${err.message}`);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
error(`Failed to update webhook: ${String(err)}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
this.exit(1);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3dlYmhvb2tzL3VwZGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMxQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUNMLE9BQU8sRUFDUCxLQUFLLEVBQ0wsSUFBSSxFQUNKLE1BQU0sRUFDTixVQUFVLEdBQ1gsTUFBTSxxQkFBcUIsQ0FBQztBQVc3QixNQUFNLENBQUMsT0FBTyxPQUFPLGNBQWUsU0FBUSxvQkFBb0I7SUFDOUQsTUFBTSxDQUFDLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQztJQUV4QyxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLGtGQUFrRjtRQUNsRix3RkFBd0Y7UUFDeEYseUZBQXlGO1FBQ3pGLDZEQUE2RDtRQUM3RCwrR0FBK0c7S0FDaEgsQ0FBQztJQUVGLE1BQU0sQ0FBQyxJQUFJLEdBQUc7UUFDWixFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNkLFdBQVcsRUFBRSxzQkFBc0I7WUFDbkMsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDO0tBQ0gsQ0FBQztJQUVGLE1BQU0sQ0FBQyxLQUFLLEdBQUc7UUFDYixHQUFHLG9CQUFvQixDQUFDLFNBQVM7UUFDakMsR0FBRyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDaEIsSUFBSSxFQUFFLEdBQUc7WUFDVCxXQUFXLEVBQUUsb0NBQW9DO1NBQ2xELENBQUM7UUFDRixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNuQixJQUFJLEVBQUUsR0FBRztZQUNULFdBQVcsRUFBRSxzQ0FBc0M7U0FDcEQsQ0FBQztRQUNGLFdBQVcsRUFBRSxL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Q0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2xELElBQUksS0FBSyxDQUFDLE1BQU07Z0JBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDeEQsSUFBSSxLQUFLLENBQUMsV0FBVyxLQUFLLFNBQVM7Z0JBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztZQUNoRixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUztnQkFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1FBRS9FLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsSUFBSSxHQUFHLFlBQVksS0FBSyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3hELEtBQUssQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDekMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksR0FBRyxZQUFZLEtBQUssRUFBRSxDQUFDO29CQUN6QixLQUFLLENBQUMsNkJBQTZCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUNwRCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sS0FBSyxDQUFDLDZCQUE2QixNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNwRCxDQUFDO1lBQ0gsQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFyZ3MsIEZsYWdzIH0gZnJvbSBcIkBvY2xpZi9jb3JlXCI7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGVkQ29tbWFuZCB9IGZyb20gXCIuLi8uLi9saWIvYmFzZS1jb21tYW5kLmpzXCI7XG5pbXBvcnQgeyBhcGlDbGllbnQgfSBmcm9tIFwiLi4vLi4vbGliL2FwaS1jbGllbnQuanNcIjtcbmltcG9ydCB7XG4gIHN1Y2Nlc3MsXG4gIGVycm9yLFxuICBqc29uLFxuICBjb2xvcnMsXG4gIGlzSnNvbk1vZGUsXG59IGZyb20gXCIuLi8uLi9saWIvb3V0cHV0LmpzXCI7XG5cbmludGVyZmFjZSBVcGRhdGVXZWJob29rUmVzcG9uc2Uge1xuICBpZDogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgZXZlbnRzOiBzdHJpbmdbXTtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGlzQWN0aXZlOiBib29sZWFuO1xuICB1cGRhdGVkQXQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2ViaG9va3NVcGRhdGUgZXh0ZW5kcyBBdXRoZW50aWNhdGVkQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9IFwiVXBkYXRlIGEgd2ViaG9va1wiO1xuXG4gIHN0YXRpYyBleGFtcGxlcyA9IFtcbiAgICAnPCU9IGNvbmZpZy5iaW4gJT4gd2ViaG9va3MgdXBkYXRlIHdoa19hYmMxMjMgLS11cmwgaHR0cHM6Ly9uZXdkb21haW4uY29tL3dlYmhvb2snLFxuICAgICc8JT0gY29uZmlnLmJpbiAlPiB3ZWJob29rcyB1cGRhdGUgd2hrX2FiYzEyMyAtLWV2ZW50cyBtZXNzYWdlLmRlbGl2ZXJlZCxtZXNzYWdlLmZhaWxlZCcsXG4gICAgJzwlPSBjb25maWcuYmluICU+IHdlYmhvb2tzIHVwZGF0ZSB3aGtfYWJjMTIzIC0tZGVzY3JpcHRpb24gXCJVcGRhdGVkIHByb2R1Y3Rpb24gd2ViaG9va1wiJyxcbiAgICAnPCU9IGNvbmZpZy5iaW4gJT4gd2ViaG9va3MgdXBkYXRlIHdoa19hYmMxMjMgLS1hY3RpdmUgZmFsc2UnLFxuICAgICc8JT0gY29uZmlnLmJpbiAlPiB3ZWJob29rcyB1cGRhdGUgd2hrX2FiYzEyMyAtLXVybCBodHRwczovL25ld2RvbWFpbi5jb20vd2ViaG9vayAtLWV2ZW50cyBtZXNzYWdlLnNlbnQgLS1qc29uJyxcbiAgXTtcblxuICBzdGF0aWMgYXJncyA9IHtcbiAgICBpZDogQXJncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246IFwiV2ViaG9vayBJRCB0byB1cGRhdGVcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pLFxuICB9O1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5BdXRoZW50aWNhdGVkQ29tbWFuZC5iYXNlRmxhZ3MsXG4gICAgdXJsOiBGbGFncy5zdHJpbmcoe1xuICAgICAgY2hhcjogXCJ1XCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJVcGRhdGUgd2ViaG9vayBVUkwgKG11c3QgYmUgSFRUUFMpXCIsXG4gICAgfSksXG4gICAgZXZlbnRzOiBGbGFncy5zdHJpbmcoe1xuICAgICAgY2hhcjogXCJlXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJVcGRhdGUgZXZlbnRzIGxpc3QgKGNvbW1hLXNlcGFyYXRlZClcIixcbiAgICB9KSxcbiAgICBkZXNjcmlwdGlvbjogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGNoYXI6IFwiZFwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiVXBkYXRlIGRlc2NyaXB0aW9uXCIsXG4gICAgfSksXG4gICAgYWN0aXZlOiBGbGFncy5ib29sZWFuKHtcbiAgICAgIGNoYXI6IFwiYVwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiRW5hYmxlIG9yIGRpc2FibGUgdGhlIHdlYmhvb2tcIixcbiAgICAgIGFsbG93Tm86IHRydWUsXG4gICAgfSksXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgYXJncywgZmxhZ3MgfSA9IGF3YWl0IHRoaXMucGFyc2UoV2ViaG9va3NVcGRhdGUpO1xuXG4gICAgLy8gQ2hlY2sgaWYgYW55IHVwZGF0ZSBmbGFncyB3ZXJlIHByb3ZpZGVkXG4gICAgY29uc3QgaGFzVXBkYXRlcyA9ICEhKGZsYWdzLnVybCB8fCBmbGFncy5ldmVudHMgfHwgZmxhZ3MuZGVzY3JpcHRpb24gfHwgZmxhZ3MuYWN0aXZlICE9PSB1bmRlZmluZWQpO1xuICAgIFxuICAgIGlmICghaGFzVXBkYXRlcykge1xuICAgICAgZXJyb3IoXCJObyB1cGRhdGVzIHNwZWNpZmllZC4gVXNlIC0tdXJsLCAtLWV2ZW50cywgLS1kZXNjcmlwdGlvbiwgb3IgLS1hY3RpdmUgZmxhZ3MuXCIpO1xuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIHVwZGF0ZSBwYXlsb2FkXG4gICAgY29uc3QgdXBkYXRlRGF0YTogYW55ID0ge307XG4gICAgXG4gICAgaWYgKGZsYWdzLnVybCkge1xuICAgICAgdXBkYXRlRGF0YS51cmwgPSBmbGFncy51cmw7XG4gICAgfVxuICAgIFxuICAgIGlmIChmbGFncy5ldmVudHMpIHtcbiAgICAgIHVwZGF0ZURhdGEuZXZlbnRzID0gZmxhZ3MuZXZlbnRzLnNwbGl0KFwiLFwiKS5tYXAoZSA9PiBlLnRyaW0oKSk7XG4gICAgfVxuICAgIFxuICAgIGlmIChmbGFncy5kZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1cGRhdGVEYXRhLmRlc2NyaXB0aW9uID0gZmxhZ3MuZGVzY3JpcHRpb247XG4gICAgfVxuICAgIFxuICAgIGlmIChmbGFncy5hY3RpdmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdXBkYXRlRGF0YS5pc0FjdGl2ZSA9IGZsYWdzLmFjdGl2ZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2ViaG9vayA9IGF3YWl0IGFwaUNsaWVudC5wYXRjaDxVcGRhdGVXZWJob29rUmVzcG9uc2U+KFxuICAgICAgICBgL2FwaS92MS93ZWJob29rcy8ke2FyZ3MuaWR9YCxcbiAgICAgICAgdXBkYXRlRGF0YVxuICAgICAgKTtcblxuICAgICAgaWYgKGlzSnNvbk1vZGUoKSkge1xuICAgICAgICBqc29uKHdlYmhvb2spO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHN1Y2Nlc3MoXCJXZWJob29rIHVwZGF0ZWRcIiwge1xuICAgICAgICBJRDogd2ViaG9vay5pZCxcbiAgICAgICAgVVJMOiB3ZWJob29rLnVybCxcbiAgICAgICAgRXZlbnRzOiB3ZWJob29rLmV2ZW50cy5qb2luKFwiLCBcIiksXG4gICAgICAgIC4uLih3ZWJob29rLmRlc2NyaXB0aW9uICYmIHsgRGVzY3JpcHRpb246IHdlYmhvb2suZGVzY3JpcHRpb24gfSksXG4gICAgICAgIFN0YXR1czogd2ViaG9vay5pc0FjdGl2ZSA/IGNvbG9ycy5zdWNjZXNzKFwiYWN0aXZlXCIpIDogY29sb3JzLndhcm5pbmcoXCJpbmFjdGl2ZVwiKSxcbiAgICAgICAgXCJVcGRhdGVkIEF0XCI6IHdlYmhvb2sudXBkYXRlZEF0LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNob3cgd2hhdCBjaGFuZ2VkXG4gICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgY29uc29sZS5sb2coY29sb3JzLmRpbShcIlVwZGF0ZWQgZmllbGRzOlwiKSk7XG4gICAgICBpZiAoZmxhZ3MudXJsKSBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwiICDigKIgVVJMXCIpKTtcbiAgICAgIGlmIChmbGFncy5ldmVudHMpIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oXCIgIOKAoiBFdmVudHNcIikpO1xuICAgICAgaWYgKGZsYWdzLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oXCIgIOKAoiBEZXNjcmlwdGlvblwiKSk7XG4gICAgICBpZiAoZmxhZ3MuYWN0aXZlICE9PSB1bmRlZmluZWQpIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oXCIgIOKAoiBBY3RpdmUgc3RhdHVzXCIpKTtcblxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yICYmIGVyci5tZXNzYWdlLmluY2x1ZGVzKFwiNDA0XCIpKSB7XG4gICAgICAgIGVycm9yKGBXZWJob29rIG5vdCBmb3VuZDogJHthcmdzLmlkfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgZXJyb3IoYEZhaWxlZCB0byB1cGRhdGUgd2ViaG9vazogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvcihgRmFpbGVkIHRvIHVwZGF0ZSB3ZWJob29rOiAke1N0cmluZyhlcnIpfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmV4aXQoMSk7XG4gICAgfVxuICB9XG59Il19
|
package/oclif.manifest.json
CHANGED
|
@@ -1039,6 +1039,228 @@
|
|
|
1039
1039
|
"send.js"
|
|
1040
1040
|
]
|
|
1041
1041
|
},
|
|
1042
|
+
"webhooks:create": {
|
|
1043
|
+
"aliases": [],
|
|
1044
|
+
"args": {},
|
|
1045
|
+
"description": "Create a webhook",
|
|
1046
|
+
"examples": [
|
|
1047
|
+
"<%= config.bin %> webhooks create --url https://myapp.com/webhook --events message.delivered",
|
|
1048
|
+
"<%= config.bin %> webhooks create --url https://myapp.com/webhook --events message.delivered,message.failed --description \"Production webhook\"",
|
|
1049
|
+
"<%= config.bin %> webhooks create --url https://webhook.site/abc123 --events message.sent --json"
|
|
1050
|
+
],
|
|
1051
|
+
"flags": {
|
|
1052
|
+
"json": {
|
|
1053
|
+
"description": "Output in JSON format",
|
|
1054
|
+
"name": "json",
|
|
1055
|
+
"allowNo": false,
|
|
1056
|
+
"type": "boolean"
|
|
1057
|
+
},
|
|
1058
|
+
"quiet": {
|
|
1059
|
+
"char": "q",
|
|
1060
|
+
"description": "Minimal output",
|
|
1061
|
+
"name": "quiet",
|
|
1062
|
+
"allowNo": false,
|
|
1063
|
+
"type": "boolean"
|
|
1064
|
+
},
|
|
1065
|
+
"url": {
|
|
1066
|
+
"char": "u",
|
|
1067
|
+
"description": "Webhook URL (must be HTTPS)",
|
|
1068
|
+
"name": "url",
|
|
1069
|
+
"required": true,
|
|
1070
|
+
"hasDynamicHelp": false,
|
|
1071
|
+
"multiple": false,
|
|
1072
|
+
"type": "option"
|
|
1073
|
+
},
|
|
1074
|
+
"events": {
|
|
1075
|
+
"char": "e",
|
|
1076
|
+
"description": "Comma-separated list of events to listen for",
|
|
1077
|
+
"name": "events",
|
|
1078
|
+
"required": true,
|
|
1079
|
+
"hasDynamicHelp": false,
|
|
1080
|
+
"multiple": false,
|
|
1081
|
+
"type": "option"
|
|
1082
|
+
},
|
|
1083
|
+
"description": {
|
|
1084
|
+
"char": "d",
|
|
1085
|
+
"description": "Description for the webhook",
|
|
1086
|
+
"name": "description",
|
|
1087
|
+
"hasDynamicHelp": false,
|
|
1088
|
+
"multiple": false,
|
|
1089
|
+
"type": "option"
|
|
1090
|
+
}
|
|
1091
|
+
},
|
|
1092
|
+
"hasDynamicHelp": false,
|
|
1093
|
+
"hiddenAliases": [],
|
|
1094
|
+
"id": "webhooks:create",
|
|
1095
|
+
"pluginAlias": "@sendly/cli",
|
|
1096
|
+
"pluginName": "@sendly/cli",
|
|
1097
|
+
"pluginType": "core",
|
|
1098
|
+
"strict": true,
|
|
1099
|
+
"isESM": true,
|
|
1100
|
+
"relativePath": [
|
|
1101
|
+
"dist",
|
|
1102
|
+
"commands",
|
|
1103
|
+
"webhooks",
|
|
1104
|
+
"create.js"
|
|
1105
|
+
]
|
|
1106
|
+
},
|
|
1107
|
+
"webhooks:delete": {
|
|
1108
|
+
"aliases": [],
|
|
1109
|
+
"args": {
|
|
1110
|
+
"id": {
|
|
1111
|
+
"description": "Webhook ID to delete",
|
|
1112
|
+
"name": "id",
|
|
1113
|
+
"required": true
|
|
1114
|
+
}
|
|
1115
|
+
},
|
|
1116
|
+
"description": "Delete a webhook",
|
|
1117
|
+
"examples": [
|
|
1118
|
+
"<%= config.bin %> webhooks delete whk_abc123",
|
|
1119
|
+
"<%= config.bin %> webhooks delete whk_abc123 --yes",
|
|
1120
|
+
"<%= config.bin %> webhooks delete whk_abc123 --json"
|
|
1121
|
+
],
|
|
1122
|
+
"flags": {
|
|
1123
|
+
"json": {
|
|
1124
|
+
"description": "Output in JSON format",
|
|
1125
|
+
"name": "json",
|
|
1126
|
+
"allowNo": false,
|
|
1127
|
+
"type": "boolean"
|
|
1128
|
+
},
|
|
1129
|
+
"quiet": {
|
|
1130
|
+
"char": "q",
|
|
1131
|
+
"description": "Minimal output",
|
|
1132
|
+
"name": "quiet",
|
|
1133
|
+
"allowNo": false,
|
|
1134
|
+
"type": "boolean"
|
|
1135
|
+
},
|
|
1136
|
+
"yes": {
|
|
1137
|
+
"char": "y",
|
|
1138
|
+
"description": "Skip confirmation prompt",
|
|
1139
|
+
"name": "yes",
|
|
1140
|
+
"allowNo": false,
|
|
1141
|
+
"type": "boolean"
|
|
1142
|
+
}
|
|
1143
|
+
},
|
|
1144
|
+
"hasDynamicHelp": false,
|
|
1145
|
+
"hiddenAliases": [],
|
|
1146
|
+
"id": "webhooks:delete",
|
|
1147
|
+
"pluginAlias": "@sendly/cli",
|
|
1148
|
+
"pluginName": "@sendly/cli",
|
|
1149
|
+
"pluginType": "core",
|
|
1150
|
+
"strict": true,
|
|
1151
|
+
"isESM": true,
|
|
1152
|
+
"relativePath": [
|
|
1153
|
+
"dist",
|
|
1154
|
+
"commands",
|
|
1155
|
+
"webhooks",
|
|
1156
|
+
"delete.js"
|
|
1157
|
+
]
|
|
1158
|
+
},
|
|
1159
|
+
"webhooks:deliveries": {
|
|
1160
|
+
"aliases": [],
|
|
1161
|
+
"args": {
|
|
1162
|
+
"id": {
|
|
1163
|
+
"description": "Webhook ID",
|
|
1164
|
+
"name": "id",
|
|
1165
|
+
"required": true
|
|
1166
|
+
}
|
|
1167
|
+
},
|
|
1168
|
+
"description": "View webhook delivery history",
|
|
1169
|
+
"examples": [
|
|
1170
|
+
"<%= config.bin %> webhooks deliveries whk_abc123",
|
|
1171
|
+
"<%= config.bin %> webhooks deliveries whk_abc123 --limit 20",
|
|
1172
|
+
"<%= config.bin %> webhooks deliveries whk_abc123 --failed-only",
|
|
1173
|
+
"<%= config.bin %> webhooks deliveries whk_abc123 --json"
|
|
1174
|
+
],
|
|
1175
|
+
"flags": {
|
|
1176
|
+
"json": {
|
|
1177
|
+
"description": "Output in JSON format",
|
|
1178
|
+
"name": "json",
|
|
1179
|
+
"allowNo": false,
|
|
1180
|
+
"type": "boolean"
|
|
1181
|
+
},
|
|
1182
|
+
"quiet": {
|
|
1183
|
+
"char": "q",
|
|
1184
|
+
"description": "Minimal output",
|
|
1185
|
+
"name": "quiet",
|
|
1186
|
+
"allowNo": false,
|
|
1187
|
+
"type": "boolean"
|
|
1188
|
+
},
|
|
1189
|
+
"limit": {
|
|
1190
|
+
"char": "l",
|
|
1191
|
+
"description": "Number of deliveries to show",
|
|
1192
|
+
"name": "limit",
|
|
1193
|
+
"default": 10,
|
|
1194
|
+
"hasDynamicHelp": false,
|
|
1195
|
+
"multiple": false,
|
|
1196
|
+
"type": "option"
|
|
1197
|
+
},
|
|
1198
|
+
"failed-only": {
|
|
1199
|
+
"description": "Show only failed deliveries",
|
|
1200
|
+
"name": "failed-only",
|
|
1201
|
+
"allowNo": false,
|
|
1202
|
+
"type": "boolean"
|
|
1203
|
+
}
|
|
1204
|
+
},
|
|
1205
|
+
"hasDynamicHelp": false,
|
|
1206
|
+
"hiddenAliases": [],
|
|
1207
|
+
"id": "webhooks:deliveries",
|
|
1208
|
+
"pluginAlias": "@sendly/cli",
|
|
1209
|
+
"pluginName": "@sendly/cli",
|
|
1210
|
+
"pluginType": "core",
|
|
1211
|
+
"strict": true,
|
|
1212
|
+
"isESM": true,
|
|
1213
|
+
"relativePath": [
|
|
1214
|
+
"dist",
|
|
1215
|
+
"commands",
|
|
1216
|
+
"webhooks",
|
|
1217
|
+
"deliveries.js"
|
|
1218
|
+
]
|
|
1219
|
+
},
|
|
1220
|
+
"webhooks:get": {
|
|
1221
|
+
"aliases": [],
|
|
1222
|
+
"args": {
|
|
1223
|
+
"id": {
|
|
1224
|
+
"description": "Webhook ID",
|
|
1225
|
+
"name": "id",
|
|
1226
|
+
"required": true
|
|
1227
|
+
}
|
|
1228
|
+
},
|
|
1229
|
+
"description": "Get webhook details",
|
|
1230
|
+
"examples": [
|
|
1231
|
+
"<%= config.bin %> webhooks get whk_abc123",
|
|
1232
|
+
"<%= config.bin %> webhooks get whk_abc123 --json"
|
|
1233
|
+
],
|
|
1234
|
+
"flags": {
|
|
1235
|
+
"json": {
|
|
1236
|
+
"description": "Output in JSON format",
|
|
1237
|
+
"name": "json",
|
|
1238
|
+
"allowNo": false,
|
|
1239
|
+
"type": "boolean"
|
|
1240
|
+
},
|
|
1241
|
+
"quiet": {
|
|
1242
|
+
"char": "q",
|
|
1243
|
+
"description": "Minimal output",
|
|
1244
|
+
"name": "quiet",
|
|
1245
|
+
"allowNo": false,
|
|
1246
|
+
"type": "boolean"
|
|
1247
|
+
}
|
|
1248
|
+
},
|
|
1249
|
+
"hasDynamicHelp": false,
|
|
1250
|
+
"hiddenAliases": [],
|
|
1251
|
+
"id": "webhooks:get",
|
|
1252
|
+
"pluginAlias": "@sendly/cli",
|
|
1253
|
+
"pluginName": "@sendly/cli",
|
|
1254
|
+
"pluginType": "core",
|
|
1255
|
+
"strict": true,
|
|
1256
|
+
"isESM": true,
|
|
1257
|
+
"relativePath": [
|
|
1258
|
+
"dist",
|
|
1259
|
+
"commands",
|
|
1260
|
+
"webhooks",
|
|
1261
|
+
"get.js"
|
|
1262
|
+
]
|
|
1263
|
+
},
|
|
1042
1264
|
"webhooks:list": {
|
|
1043
1265
|
"aliases": [],
|
|
1044
1266
|
"args": {},
|
|
@@ -1141,7 +1363,181 @@
|
|
|
1141
1363
|
"webhooks",
|
|
1142
1364
|
"listen.js"
|
|
1143
1365
|
]
|
|
1366
|
+
},
|
|
1367
|
+
"webhooks:rotate-secret": {
|
|
1368
|
+
"aliases": [],
|
|
1369
|
+
"args": {
|
|
1370
|
+
"id": {
|
|
1371
|
+
"description": "Webhook ID",
|
|
1372
|
+
"name": "id",
|
|
1373
|
+
"required": true
|
|
1374
|
+
}
|
|
1375
|
+
},
|
|
1376
|
+
"description": "Rotate webhook secret",
|
|
1377
|
+
"examples": [
|
|
1378
|
+
"<%= config.bin %> webhooks rotate-secret whk_abc123",
|
|
1379
|
+
"<%= config.bin %> webhooks rotate-secret whk_abc123 --yes",
|
|
1380
|
+
"<%= config.bin %> webhooks rotate-secret whk_abc123 --json"
|
|
1381
|
+
],
|
|
1382
|
+
"flags": {
|
|
1383
|
+
"json": {
|
|
1384
|
+
"description": "Output in JSON format",
|
|
1385
|
+
"name": "json",
|
|
1386
|
+
"allowNo": false,
|
|
1387
|
+
"type": "boolean"
|
|
1388
|
+
},
|
|
1389
|
+
"quiet": {
|
|
1390
|
+
"char": "q",
|
|
1391
|
+
"description": "Minimal output",
|
|
1392
|
+
"name": "quiet",
|
|
1393
|
+
"allowNo": false,
|
|
1394
|
+
"type": "boolean"
|
|
1395
|
+
},
|
|
1396
|
+
"yes": {
|
|
1397
|
+
"char": "y",
|
|
1398
|
+
"description": "Skip confirmation prompt",
|
|
1399
|
+
"name": "yes",
|
|
1400
|
+
"allowNo": false,
|
|
1401
|
+
"type": "boolean"
|
|
1402
|
+
}
|
|
1403
|
+
},
|
|
1404
|
+
"hasDynamicHelp": false,
|
|
1405
|
+
"hiddenAliases": [],
|
|
1406
|
+
"id": "webhooks:rotate-secret",
|
|
1407
|
+
"pluginAlias": "@sendly/cli",
|
|
1408
|
+
"pluginName": "@sendly/cli",
|
|
1409
|
+
"pluginType": "core",
|
|
1410
|
+
"strict": true,
|
|
1411
|
+
"isESM": true,
|
|
1412
|
+
"relativePath": [
|
|
1413
|
+
"dist",
|
|
1414
|
+
"commands",
|
|
1415
|
+
"webhooks",
|
|
1416
|
+
"rotate-secret.js"
|
|
1417
|
+
]
|
|
1418
|
+
},
|
|
1419
|
+
"webhooks:test": {
|
|
1420
|
+
"aliases": [],
|
|
1421
|
+
"args": {
|
|
1422
|
+
"id": {
|
|
1423
|
+
"description": "Webhook ID to test",
|
|
1424
|
+
"name": "id",
|
|
1425
|
+
"required": true
|
|
1426
|
+
}
|
|
1427
|
+
},
|
|
1428
|
+
"description": "Send a test event to a webhook",
|
|
1429
|
+
"examples": [
|
|
1430
|
+
"<%= config.bin %> webhooks test whk_abc123",
|
|
1431
|
+
"<%= config.bin %> webhooks test whk_abc123 --json"
|
|
1432
|
+
],
|
|
1433
|
+
"flags": {
|
|
1434
|
+
"json": {
|
|
1435
|
+
"description": "Output in JSON format",
|
|
1436
|
+
"name": "json",
|
|
1437
|
+
"allowNo": false,
|
|
1438
|
+
"type": "boolean"
|
|
1439
|
+
},
|
|
1440
|
+
"quiet": {
|
|
1441
|
+
"char": "q",
|
|
1442
|
+
"description": "Minimal output",
|
|
1443
|
+
"name": "quiet",
|
|
1444
|
+
"allowNo": false,
|
|
1445
|
+
"type": "boolean"
|
|
1446
|
+
}
|
|
1447
|
+
},
|
|
1448
|
+
"hasDynamicHelp": false,
|
|
1449
|
+
"hiddenAliases": [],
|
|
1450
|
+
"id": "webhooks:test",
|
|
1451
|
+
"pluginAlias": "@sendly/cli",
|
|
1452
|
+
"pluginName": "@sendly/cli",
|
|
1453
|
+
"pluginType": "core",
|
|
1454
|
+
"strict": true,
|
|
1455
|
+
"isESM": true,
|
|
1456
|
+
"relativePath": [
|
|
1457
|
+
"dist",
|
|
1458
|
+
"commands",
|
|
1459
|
+
"webhooks",
|
|
1460
|
+
"test.js"
|
|
1461
|
+
]
|
|
1462
|
+
},
|
|
1463
|
+
"webhooks:update": {
|
|
1464
|
+
"aliases": [],
|
|
1465
|
+
"args": {
|
|
1466
|
+
"id": {
|
|
1467
|
+
"description": "Webhook ID to update",
|
|
1468
|
+
"name": "id",
|
|
1469
|
+
"required": true
|
|
1470
|
+
}
|
|
1471
|
+
},
|
|
1472
|
+
"description": "Update a webhook",
|
|
1473
|
+
"examples": [
|
|
1474
|
+
"<%= config.bin %> webhooks update whk_abc123 --url https://newdomain.com/webhook",
|
|
1475
|
+
"<%= config.bin %> webhooks update whk_abc123 --events message.delivered,message.failed",
|
|
1476
|
+
"<%= config.bin %> webhooks update whk_abc123 --description \"Updated production webhook\"",
|
|
1477
|
+
"<%= config.bin %> webhooks update whk_abc123 --active false",
|
|
1478
|
+
"<%= config.bin %> webhooks update whk_abc123 --url https://newdomain.com/webhook --events message.sent --json"
|
|
1479
|
+
],
|
|
1480
|
+
"flags": {
|
|
1481
|
+
"json": {
|
|
1482
|
+
"description": "Output in JSON format",
|
|
1483
|
+
"name": "json",
|
|
1484
|
+
"allowNo": false,
|
|
1485
|
+
"type": "boolean"
|
|
1486
|
+
},
|
|
1487
|
+
"quiet": {
|
|
1488
|
+
"char": "q",
|
|
1489
|
+
"description": "Minimal output",
|
|
1490
|
+
"name": "quiet",
|
|
1491
|
+
"allowNo": false,
|
|
1492
|
+
"type": "boolean"
|
|
1493
|
+
},
|
|
1494
|
+
"url": {
|
|
1495
|
+
"char": "u",
|
|
1496
|
+
"description": "Update webhook URL (must be HTTPS)",
|
|
1497
|
+
"name": "url",
|
|
1498
|
+
"hasDynamicHelp": false,
|
|
1499
|
+
"multiple": false,
|
|
1500
|
+
"type": "option"
|
|
1501
|
+
},
|
|
1502
|
+
"events": {
|
|
1503
|
+
"char": "e",
|
|
1504
|
+
"description": "Update events list (comma-separated)",
|
|
1505
|
+
"name": "events",
|
|
1506
|
+
"hasDynamicHelp": false,
|
|
1507
|
+
"multiple": false,
|
|
1508
|
+
"type": "option"
|
|
1509
|
+
},
|
|
1510
|
+
"description": {
|
|
1511
|
+
"char": "d",
|
|
1512
|
+
"description": "Update description",
|
|
1513
|
+
"name": "description",
|
|
1514
|
+
"hasDynamicHelp": false,
|
|
1515
|
+
"multiple": false,
|
|
1516
|
+
"type": "option"
|
|
1517
|
+
},
|
|
1518
|
+
"active": {
|
|
1519
|
+
"char": "a",
|
|
1520
|
+
"description": "Enable or disable the webhook",
|
|
1521
|
+
"name": "active",
|
|
1522
|
+
"allowNo": true,
|
|
1523
|
+
"type": "boolean"
|
|
1524
|
+
}
|
|
1525
|
+
},
|
|
1526
|
+
"hasDynamicHelp": false,
|
|
1527
|
+
"hiddenAliases": [],
|
|
1528
|
+
"id": "webhooks:update",
|
|
1529
|
+
"pluginAlias": "@sendly/cli",
|
|
1530
|
+
"pluginName": "@sendly/cli",
|
|
1531
|
+
"pluginType": "core",
|
|
1532
|
+
"strict": true,
|
|
1533
|
+
"isESM": true,
|
|
1534
|
+
"relativePath": [
|
|
1535
|
+
"dist",
|
|
1536
|
+
"commands",
|
|
1537
|
+
"webhooks",
|
|
1538
|
+
"update.js"
|
|
1539
|
+
]
|
|
1144
1540
|
}
|
|
1145
1541
|
},
|
|
1146
|
-
"version": "2.
|
|
1542
|
+
"version": "2.3.0"
|
|
1147
1543
|
}
|