@sendly/cli 2.2.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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/dist/lib/auth.js +8 -1
- package/dist/lib/onboarding.d.ts +43 -0
- package/dist/lib/onboarding.js +158 -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
|
+
}
|