@sendly/cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +323 -0
- package/bin/run.js +5 -0
- package/dist/commands/config/get.d.ts +13 -0
- package/dist/commands/config/get.js +38 -0
- package/dist/commands/config/list.d.ts +10 -0
- package/dist/commands/config/list.js +45 -0
- package/dist/commands/config/set.d.ts +14 -0
- package/dist/commands/config/set.js +67 -0
- package/dist/commands/credits/balance.d.ts +10 -0
- package/dist/commands/credits/balance.js +38 -0
- package/dist/commands/credits/history.d.ts +11 -0
- package/dist/commands/credits/history.js +88 -0
- package/dist/commands/doctor.d.ts +23 -0
- package/dist/commands/doctor.js +336 -0
- package/dist/commands/keys/create.d.ts +12 -0
- package/dist/commands/keys/create.js +47 -0
- package/dist/commands/keys/list.d.ts +10 -0
- package/dist/commands/keys/list.js +65 -0
- package/dist/commands/keys/revoke.d.ts +15 -0
- package/dist/commands/keys/revoke.js +68 -0
- package/dist/commands/login.d.ts +12 -0
- package/dist/commands/login.js +114 -0
- package/dist/commands/logout.d.ts +10 -0
- package/dist/commands/logout.js +20 -0
- package/dist/commands/logs/tail.d.ts +17 -0
- package/dist/commands/logs/tail.js +183 -0
- package/dist/commands/sms/batch.d.ts +16 -0
- package/dist/commands/sms/batch.js +163 -0
- package/dist/commands/sms/cancel.d.ts +13 -0
- package/dist/commands/sms/cancel.js +46 -0
- package/dist/commands/sms/get.d.ts +13 -0
- package/dist/commands/sms/get.js +51 -0
- package/dist/commands/sms/list.d.ts +12 -0
- package/dist/commands/sms/list.js +79 -0
- package/dist/commands/sms/schedule.d.ts +14 -0
- package/dist/commands/sms/schedule.js +91 -0
- package/dist/commands/sms/scheduled.d.ts +12 -0
- package/dist/commands/sms/scheduled.js +82 -0
- package/dist/commands/sms/send.d.ts +13 -0
- package/dist/commands/sms/send.js +70 -0
- package/dist/commands/webhooks/list.d.ts +10 -0
- package/dist/commands/webhooks/list.js +80 -0
- package/dist/commands/webhooks/listen.d.ts +20 -0
- package/dist/commands/webhooks/listen.js +202 -0
- package/dist/commands/whoami.d.ts +10 -0
- package/dist/commands/whoami.js +51 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.js +27 -0
- package/dist/lib/api-client.d.ts +52 -0
- package/dist/lib/api-client.js +129 -0
- package/dist/lib/auth.d.ts +52 -0
- package/dist/lib/auth.js +171 -0
- package/dist/lib/base-command.d.ts +17 -0
- package/dist/lib/base-command.js +60 -0
- package/dist/lib/config.d.ts +54 -0
- package/dist/lib/config.js +182 -0
- package/dist/lib/output.d.ts +43 -0
- package/dist/lib/output.js +222 -0
- package/oclif.manifest.json +1147 -0
- package/package.json +98 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
2
|
+
import { apiClient } from "../../lib/api-client.js";
|
|
3
|
+
import { table, json, info, formatRelativeTime, colors, isJsonMode, } from "../../lib/output.js";
|
|
4
|
+
export default class KeysList extends AuthenticatedCommand {
|
|
5
|
+
static description = "List your API keys";
|
|
6
|
+
static examples = [
|
|
7
|
+
"<%= config.bin %> keys list",
|
|
8
|
+
"<%= config.bin %> keys list --json",
|
|
9
|
+
];
|
|
10
|
+
static flags = {
|
|
11
|
+
...AuthenticatedCommand.baseFlags,
|
|
12
|
+
};
|
|
13
|
+
async run() {
|
|
14
|
+
const keys = await apiClient.get("/api/keys");
|
|
15
|
+
if (isJsonMode()) {
|
|
16
|
+
json(keys);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
if (keys.length === 0) {
|
|
20
|
+
info("No API keys found");
|
|
21
|
+
console.log();
|
|
22
|
+
console.log(` Create one with ${colors.code("sendly keys create")}`);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
console.log();
|
|
26
|
+
table(keys, [
|
|
27
|
+
{
|
|
28
|
+
header: "Name",
|
|
29
|
+
key: "name",
|
|
30
|
+
width: 20,
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
header: "Key ID",
|
|
34
|
+
key: "keyId",
|
|
35
|
+
width: 18,
|
|
36
|
+
formatter: (v) => colors.dim(String(v)),
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
header: "Prefix",
|
|
40
|
+
key: "keyPrefix",
|
|
41
|
+
width: 16,
|
|
42
|
+
formatter: (v) => colors.code(String(v) + "..."),
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
header: "Type",
|
|
46
|
+
key: "type",
|
|
47
|
+
width: 8,
|
|
48
|
+
formatter: (v) => v === "test" ? colors.warning("test") : colors.success("live"),
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
header: "Status",
|
|
52
|
+
key: "isActive",
|
|
53
|
+
width: 10,
|
|
54
|
+
formatter: (v) => v ? colors.success("active") : colors.error("revoked"),
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
header: "Last Used",
|
|
58
|
+
key: "lastUsedAt",
|
|
59
|
+
width: 12,
|
|
60
|
+
formatter: (v) => (v ? formatRelativeTime(String(v)) : colors.dim("never")),
|
|
61
|
+
},
|
|
62
|
+
]);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9rZXlzL2xpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFDTCxLQUFLLEVBQ0wsSUFBSSxFQUNKLElBQUksRUFFSixrQkFBa0IsRUFDbEIsTUFBTSxFQUNOLFVBQVUsR0FDWCxNQUFNLHFCQUFxQixDQUFDO0FBYzdCLE1BQU0sQ0FBQyxPQUFPLE9BQU8sUUFBUyxTQUFRLG9CQUFvQjtJQUN4RCxNQUFNLENBQUMsV0FBVyxHQUFHLG9CQUFvQixDQUFDO0lBRTFDLE1BQU0sQ0FBQyxRQUFRLEdBQUc7UUFDaEIsNkJBQTZCO1FBQzdCLG9DQUFvQztLQUNyQyxDQUFDO0lBRUYsTUFBTSxDQUFDLEtBQUssR0FBRztRQUNiLEdBQUcsb0JBQW9CLENBQUMsU0FBUztLQUNsQyxDQUFDO0lBRUYsS0FBSyxDQUFDLEdBQUc7UUFDUCxNQUFNLElBQUksR0FBRyxNQUFNLFNBQVMsQ0FBQyxHQUFHLENBQVcsV0FBVyxDQUFDLENBQUM7UUFFeEQsSUFBSSxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNYLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQzFCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEUsT0FBTztRQUNULENBQUM7UUFFRCxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFZCxLQUFLLENBQUMsSUFBSSxFQUFFO1lBQ1Y7Z0JBQ0UsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsR0FBRyxFQUFFLE1BQU07Z0JBQ1gsS0FBSyxFQUFFLEVBQUU7YUFDVjtZQUNEO2dCQUNFLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixHQUFHLEVBQUUsT0FBTztnQkFDWixLQUFLLEVBQUUsRUFBRTtnQkFDVCxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3hDO1lBQ0Q7Z0JBQ0UsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLEdBQUcsRUFBRSxXQUFXO2dCQUNoQixLQUFLLEVBQUUsRUFBRTtnQkFDVCxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQzthQUNqRDtZQUNEO2dCQUNFLE1BQU0sRUFBRSxNQUFNO2dCQUNkLEdBQUcsRUFBRSxNQUFNO2dCQUNYLEtBQUssRUFBRSxDQUFDO2dCQUNSLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ2YsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7YUFDakU7WUFDRDtnQkFDRSxNQUFNLEVBQUUsUUFBUTtnQkFDaEIsR0FBRyxFQUFFLFVBQVU7Z0JBQ2YsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDZixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO2FBQ3pEO1lBQ0Q7Z0JBQ0UsTUFBTSxFQUFFLFdBQVc7Z0JBQ25CLEdBQUcsRUFBRSxZQUFZO2dCQUNqQixLQUFLLEVBQUUsRUFBRTtnQkFDVCxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUM1RTtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdXRoZW50aWNhdGVkQ29tbWFuZCB9IGZyb20gXCIuLi8uLi9saWIvYmFzZS1jb21tYW5kLmpzXCI7XG5pbXBvcnQgeyBhcGlDbGllbnQgfSBmcm9tIFwiLi4vLi4vbGliL2FwaS1jbGllbnQuanNcIjtcbmltcG9ydCB7XG4gIHRhYmxlLFxuICBqc29uLFxuICBpbmZvLFxuICBmb3JtYXRTdGF0dXMsXG4gIGZvcm1hdFJlbGF0aXZlVGltZSxcbiAgY29sb3JzLFxuICBpc0pzb25Nb2RlLFxufSBmcm9tIFwiLi4vLi4vbGliL291dHB1dC5qc1wiO1xuXG5pbnRlcmZhY2UgQXBpS2V5IHtcbiAgaWQ6IHN0cmluZztcbiAga2V5SWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBrZXlQcmVmaXg6IHN0cmluZztcbiAgdHlwZTogXCJ0ZXN0XCIgfCBcImxpdmVcIjtcbiAgaXNBY3RpdmU6IGJvb2xlYW47XG4gIGxhc3RVc2VkQXQ/OiBzdHJpbmc7XG4gIGNyZWF0ZWRBdDogc3RyaW5nO1xuICByZXZva2VkQXQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEtleXNMaXN0IGV4dGVuZHMgQXV0aGVudGljYXRlZENvbW1hbmQge1xuICBzdGF0aWMgZGVzY3JpcHRpb24gPSBcIkxpc3QgeW91ciBBUEkga2V5c1wiO1xuXG4gIHN0YXRpYyBleGFtcGxlcyA9IFtcbiAgICBcIjwlPSBjb25maWcuYmluICU+IGtleXMgbGlzdFwiLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4ga2V5cyBsaXN0IC0tanNvblwiLFxuICBdO1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5BdXRoZW50aWNhdGVkQ29tbWFuZC5iYXNlRmxhZ3MsXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGtleXMgPSBhd2FpdCBhcGlDbGllbnQuZ2V0PEFwaUtleVtdPihcIi9hcGkva2V5c1wiKTtcblxuICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgIGpzb24oa2V5cyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBpbmZvKFwiTm8gQVBJIGtleXMgZm91bmRcIik7XG4gICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgY29uc29sZS5sb2coYCAgQ3JlYXRlIG9uZSB3aXRoICR7Y29sb3JzLmNvZGUoXCJzZW5kbHkga2V5cyBjcmVhdGVcIil9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coKTtcblxuICAgIHRhYmxlKGtleXMsIFtcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyOiBcIk5hbWVcIixcbiAgICAgICAga2V5OiBcIm5hbWVcIixcbiAgICAgICAgd2lkdGg6IDIwLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyOiBcIktleSBJRFwiLFxuICAgICAgICBrZXk6IFwia2V5SWRcIixcbiAgICAgICAgd2lkdGg6IDE4LFxuICAgICAgICBmb3JtYXR0ZXI6ICh2KSA9PiBjb2xvcnMuZGltKFN0cmluZyh2KSksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBoZWFkZXI6IFwiUHJlZml4XCIsXG4gICAgICAgIGtleTogXCJrZXlQcmVmaXhcIixcbiAgICAgICAgd2lkdGg6IDE2LFxuICAgICAgICBmb3JtYXR0ZXI6ICh2KSA9PiBjb2xvcnMuY29kZShTdHJpbmcodikgKyBcIi4uLlwiKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGhlYWRlcjogXCJUeXBlXCIsXG4gICAgICAgIGtleTogXCJ0eXBlXCIsXG4gICAgICAgIHdpZHRoOiA4LFxuICAgICAgICBmb3JtYXR0ZXI6ICh2KSA9PlxuICAgICAgICAgIHYgPT09IFwidGVzdFwiID8gY29sb3JzLndhcm5pbmcoXCJ0ZXN0XCIpIDogY29sb3JzLnN1Y2Nlc3MoXCJsaXZlXCIpLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyOiBcIlN0YXR1c1wiLFxuICAgICAgICBrZXk6IFwiaXNBY3RpdmVcIixcbiAgICAgICAgd2lkdGg6IDEwLFxuICAgICAgICBmb3JtYXR0ZXI6ICh2KSA9PlxuICAgICAgICAgIHYgPyBjb2xvcnMuc3VjY2VzcyhcImFjdGl2ZVwiKSA6IGNvbG9ycy5lcnJvcihcInJldm9rZWRcIiksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBoZWFkZXI6IFwiTGFzdCBVc2VkXCIsXG4gICAgICAgIGtleTogXCJsYXN0VXNlZEF0XCIsXG4gICAgICAgIHdpZHRoOiAxMixcbiAgICAgICAgZm9ybWF0dGVyOiAodikgPT4gKHYgPyBmb3JtYXRSZWxhdGl2ZVRpbWUoU3RyaW5nKHYpKSA6IGNvbG9ycy5kaW0oXCJuZXZlclwiKSksXG4gICAgICB9LFxuICAgIF0pO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
2
|
+
export default class KeysRevoke extends AuthenticatedCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
keyId: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
reason: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
10
|
+
yes: 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,68 @@
|
|
|
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 KeysRevoke extends AuthenticatedCommand {
|
|
7
|
+
static description = "Revoke an API key";
|
|
8
|
+
static examples = [
|
|
9
|
+
"<%= config.bin %> keys revoke key_abc123",
|
|
10
|
+
'<%= config.bin %> keys revoke key_abc123 --reason "Compromised"',
|
|
11
|
+
"<%= config.bin %> keys revoke key_abc123 --yes",
|
|
12
|
+
];
|
|
13
|
+
static args = {
|
|
14
|
+
keyId: Args.string({
|
|
15
|
+
description: "Key ID to revoke (e.g., key_abc123)",
|
|
16
|
+
required: true,
|
|
17
|
+
}),
|
|
18
|
+
};
|
|
19
|
+
static flags = {
|
|
20
|
+
...AuthenticatedCommand.baseFlags,
|
|
21
|
+
reason: Flags.string({
|
|
22
|
+
char: "r",
|
|
23
|
+
description: "Reason for revoking the key",
|
|
24
|
+
}),
|
|
25
|
+
yes: Flags.boolean({
|
|
26
|
+
char: "y",
|
|
27
|
+
description: "Skip confirmation prompt",
|
|
28
|
+
default: false,
|
|
29
|
+
}),
|
|
30
|
+
};
|
|
31
|
+
async run() {
|
|
32
|
+
const { args, flags } = await this.parse(KeysRevoke);
|
|
33
|
+
// Confirm revocation
|
|
34
|
+
if (!flags.yes) {
|
|
35
|
+
const { confirm } = await inquirer.prompt([
|
|
36
|
+
{
|
|
37
|
+
type: "confirm",
|
|
38
|
+
name: "confirm",
|
|
39
|
+
message: `Are you sure you want to revoke ${colors.code(args.keyId)}? This cannot be undone.`,
|
|
40
|
+
default: false,
|
|
41
|
+
},
|
|
42
|
+
]);
|
|
43
|
+
if (!confirm) {
|
|
44
|
+
error("Revocation cancelled");
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Find the key by keyId to get its internal id
|
|
49
|
+
const keys = await apiClient.get("/api/keys");
|
|
50
|
+
const key = keys.find((k) => k.keyId === args.keyId);
|
|
51
|
+
if (!key) {
|
|
52
|
+
error(`Key not found: ${args.keyId}`);
|
|
53
|
+
this.exit(1);
|
|
54
|
+
}
|
|
55
|
+
await apiClient.patch(`/api/keys/${key.id}/revoke`, {
|
|
56
|
+
reason: flags.reason || "Revoked via CLI",
|
|
57
|
+
});
|
|
58
|
+
if (isJsonMode()) {
|
|
59
|
+
json({ success: true, keyId: args.keyId, revoked: true });
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
success("API key revoked", {
|
|
63
|
+
"Key ID": args.keyId,
|
|
64
|
+
Reason: flags.reason || "Revoked via CLI",
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2b2tlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2tleXMvcmV2b2tlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQy9FLE9BQU8sUUFBUSxNQUFNLFVBQVUsQ0FBQztBQUVoQyxNQUFNLENBQUMsT0FBTyxPQUFPLFVBQVcsU0FBUSxvQkFBb0I7SUFDMUQsTUFBTSxDQUFDLFdBQVcsR0FBRyxtQkFBbUIsQ0FBQztJQUV6QyxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLDBDQUEwQztRQUMxQyxpRUFBaUU7UUFDakUsZ0RBQWdEO0tBQ2pELENBQUM7SUFFRixNQUFNLENBQUMsSUFBSSxHQUFHO1FBQ1osS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDakIsV0FBVyxFQUFFLHFDQUFxQztZQUNsRCxRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUM7S0FDSCxDQUFDO0lBRUYsTUFBTSxDQUFDLEtBQUssR0FBRztRQUNiLEdBQUcsb0JBQW9CLENBQUMsU0FBUztRQUNqQyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNuQixJQUFJLEVBQUUsR0FBRztZQUNULFdBQVcsRUFBRSw2QkFBNkI7U0FDM0MsQ0FBQztRQUNGLEdBQUcsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ2pCLElBQUksRUFBRSxHQUFHO1lBQ1QsV0FBVyxFQUFFLDBCQUEwQjtZQUN2QyxPQUFPLEVBQUUsS0FBSztTQUNmLENBQUM7S0FDSCxDQUFDO0lBRUYsS0FBSyxDQUFDLEdBQUc7UUFDUCxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVyRCxxQkFBcUI7UUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNmLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQ3hDO29CQUNFLElBQUksRUFBRSxTQUFTO29CQUNmLElBQUksRUFBRSxTQUFTO29CQUNmLE9BQU8sRUFBRSxtQ0FBbUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLDBCQUEwQjtvQkFDN0YsT0FBTyxFQUFFLEtBQUs7aUJBQ2Y7YUFDRixDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2IsS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7Z0JBQzlCLE9BQU87WUFDVCxDQUFDO1FBQ0gsQ0FBQztRQUVELCtDQUErQztRQUMvQyxNQUFNLElBQUksR0FBRyxNQUFNLFNBQVMsQ0FBQyxHQUFHLENBQzlCLFdBQVcsQ0FDWixDQUFDO1FBQ0YsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckQsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1QsS0FBSyxDQUFDLGtCQUFrQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2YsQ0FBQztRQUVELE1BQU0sU0FBUyxDQUFDLEtBQUssQ0FBQyxhQUFhLEdBQUcsQ0FBQyxFQUFFLFNBQVMsRUFBRTtZQUNsRCxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sSUFBSSxpQkFBaUI7U0FDMUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDMUQsT0FBTztRQUNULENBQUM7UUFFRCxPQUFPLENBQUMsaUJBQWlCLEVBQUU7WUFDekIsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ3BCLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxJQUFJLGlCQUFpQjtTQUMxQyxDQUFDLENBQUM7SUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXJncywgRmxhZ3MgfSBmcm9tIFwiQG9jbGlmL2NvcmVcIjtcbmltcG9ydCB7IEF1dGhlbnRpY2F0ZWRDb21tYW5kIH0gZnJvbSBcIi4uLy4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGFwaUNsaWVudCB9IGZyb20gXCIuLi8uLi9saWIvYXBpLWNsaWVudC5qc1wiO1xuaW1wb3J0IHsgc3VjY2VzcywgZXJyb3IsIGpzb24sIGNvbG9ycywgaXNKc29uTW9kZSB9IGZyb20gXCIuLi8uLi9saWIvb3V0cHV0LmpzXCI7XG5pbXBvcnQgaW5xdWlyZXIgZnJvbSBcImlucXVpcmVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEtleXNSZXZva2UgZXh0ZW5kcyBBdXRoZW50aWNhdGVkQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9IFwiUmV2b2tlIGFuIEFQSSBrZXlcIjtcblxuICBzdGF0aWMgZXhhbXBsZXMgPSBbXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiBrZXlzIHJldm9rZSBrZXlfYWJjMTIzXCIsXG4gICAgJzwlPSBjb25maWcuYmluICU+IGtleXMgcmV2b2tlIGtleV9hYmMxMjMgLS1yZWFzb24gXCJDb21wcm9taXNlZFwiJyxcbiAgICBcIjwlPSBjb25maWcuYmluICU+IGtleXMgcmV2b2tlIGtleV9hYmMxMjMgLS15ZXNcIixcbiAgXTtcblxuICBzdGF0aWMgYXJncyA9IHtcbiAgICBrZXlJZDogQXJncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246IFwiS2V5IElEIHRvIHJldm9rZSAoZS5nLiwga2V5X2FiYzEyMylcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pLFxuICB9O1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5BdXRoZW50aWNhdGVkQ29tbWFuZC5iYXNlRmxhZ3MsXG4gICAgcmVhc29uOiBGbGFncy5zdHJpbmcoe1xuICAgICAgY2hhcjogXCJyXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJSZWFzb24gZm9yIHJldm9raW5nIHRoZSBrZXlcIixcbiAgICB9KSxcbiAgICB5ZXM6IEZsYWdzLmJvb2xlYW4oe1xuICAgICAgY2hhcjogXCJ5XCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJTa2lwIGNvbmZpcm1hdGlvbiBwcm9tcHRcIixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIH0pLFxuICB9O1xuXG4gIGFzeW5jIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGFyZ3MsIGZsYWdzIH0gPSBhd2FpdCB0aGlzLnBhcnNlKEtleXNSZXZva2UpO1xuXG4gICAgLy8gQ29uZmlybSByZXZvY2F0aW9uXG4gICAgaWYgKCFmbGFncy55ZXMpIHtcbiAgICAgIGNvbnN0IHsgY29uZmlybSB9ID0gYXdhaXQgaW5xdWlyZXIucHJvbXB0KFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwiY29uZmlybVwiLFxuICAgICAgICAgIG5hbWU6IFwiY29uZmlybVwiLFxuICAgICAgICAgIG1lc3NhZ2U6IGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmV2b2tlICR7Y29sb3JzLmNvZGUoYXJncy5rZXlJZCl9PyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuYCxcbiAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuXG4gICAgICBpZiAoIWNvbmZpcm0pIHtcbiAgICAgICAgZXJyb3IoXCJSZXZvY2F0aW9uIGNhbmNlbGxlZFwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZpbmQgdGhlIGtleSBieSBrZXlJZCB0byBnZXQgaXRzIGludGVybmFsIGlkXG4gICAgY29uc3Qga2V5cyA9IGF3YWl0IGFwaUNsaWVudC5nZXQ8QXJyYXk8eyBpZDogc3RyaW5nOyBrZXlJZDogc3RyaW5nIH0+PihcbiAgICAgIFwiL2FwaS9rZXlzXCJcbiAgICApO1xuICAgIGNvbnN0IGtleSA9IGtleXMuZmluZCgoaykgPT4gay5rZXlJZCA9PT0gYXJncy5rZXlJZCk7XG5cbiAgICBpZiAoIWtleSkge1xuICAgICAgZXJyb3IoYEtleSBub3QgZm91bmQ6ICR7YXJncy5rZXlJZH1gKTtcbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBhd2FpdCBhcGlDbGllbnQucGF0Y2goYC9hcGkva2V5cy8ke2tleS5pZH0vcmV2b2tlYCwge1xuICAgICAgcmVhc29uOiBmbGFncy5yZWFzb24gfHwgXCJSZXZva2VkIHZpYSBDTElcIixcbiAgICB9KTtcblxuICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgIGpzb24oeyBzdWNjZXNzOiB0cnVlLCBrZXlJZDogYXJncy5rZXlJZCwgcmV2b2tlZDogdHJ1ZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzdWNjZXNzKFwiQVBJIGtleSByZXZva2VkXCIsIHtcbiAgICAgIFwiS2V5IElEXCI6IGFyZ3Mua2V5SWQsXG4gICAgICBSZWFzb246IGZsYWdzLnJlYXNvbiB8fCBcIlJldm9rZWQgdmlhIENMSVwiLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BaseCommand } from "../lib/base-command.js";
|
|
2
|
+
export default class Login extends BaseCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
"api-key": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
7
|
+
interactive: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
8
|
+
json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
9
|
+
quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
10
|
+
};
|
|
11
|
+
run(): Promise<void>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { Flags } from "@oclif/core";
|
|
2
|
+
import { BaseCommand } from "../lib/base-command.js";
|
|
3
|
+
import { browserLogin, apiKeyLogin } from "../lib/auth.js";
|
|
4
|
+
import { success, error, info } from "../lib/output.js";
|
|
5
|
+
import { isAuthenticated } from "../lib/config.js";
|
|
6
|
+
import inquirer from "inquirer";
|
|
7
|
+
export default class Login extends BaseCommand {
|
|
8
|
+
static description = "Authenticate with Sendly";
|
|
9
|
+
static examples = [
|
|
10
|
+
"<%= config.bin %> login",
|
|
11
|
+
"<%= config.bin %> login --api-key sk_test_v1_xxx",
|
|
12
|
+
];
|
|
13
|
+
static flags = {
|
|
14
|
+
...BaseCommand.baseFlags,
|
|
15
|
+
"api-key": Flags.string({
|
|
16
|
+
char: "k",
|
|
17
|
+
description: "API key to use for authentication",
|
|
18
|
+
}),
|
|
19
|
+
interactive: Flags.boolean({
|
|
20
|
+
char: "i",
|
|
21
|
+
description: "Force interactive mode",
|
|
22
|
+
default: false,
|
|
23
|
+
}),
|
|
24
|
+
};
|
|
25
|
+
async run() {
|
|
26
|
+
const { flags } = await this.parse(Login);
|
|
27
|
+
// Check if already logged in
|
|
28
|
+
if (isAuthenticated() && !flags["api-key"]) {
|
|
29
|
+
const { confirm } = await inquirer.prompt([
|
|
30
|
+
{
|
|
31
|
+
type: "confirm",
|
|
32
|
+
name: "confirm",
|
|
33
|
+
message: "You are already logged in. Do you want to re-authenticate?",
|
|
34
|
+
default: false,
|
|
35
|
+
},
|
|
36
|
+
]);
|
|
37
|
+
if (!confirm) {
|
|
38
|
+
info("Login cancelled");
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// API key login
|
|
43
|
+
if (flags["api-key"]) {
|
|
44
|
+
try {
|
|
45
|
+
await apiKeyLogin(flags["api-key"]);
|
|
46
|
+
const keyType = flags["api-key"].startsWith("sk_test_") ? "test" : "live";
|
|
47
|
+
success("Logged in with API key", {
|
|
48
|
+
environment: keyType,
|
|
49
|
+
});
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
error(err.message);
|
|
54
|
+
this.exit(1);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Interactive mode - ask user what they want
|
|
58
|
+
if (flags.interactive || process.stdin.isTTY) {
|
|
59
|
+
const { method } = await inquirer.prompt([
|
|
60
|
+
{
|
|
61
|
+
type: "list",
|
|
62
|
+
name: "method",
|
|
63
|
+
message: "How would you like to authenticate?",
|
|
64
|
+
choices: [
|
|
65
|
+
{ name: "Login with browser (recommended)", value: "browser" },
|
|
66
|
+
{ name: "Enter API key", value: "apikey" },
|
|
67
|
+
],
|
|
68
|
+
},
|
|
69
|
+
]);
|
|
70
|
+
if (method === "apikey") {
|
|
71
|
+
const { apiKey } = await inquirer.prompt([
|
|
72
|
+
{
|
|
73
|
+
type: "password",
|
|
74
|
+
name: "apiKey",
|
|
75
|
+
message: "Enter your API key:",
|
|
76
|
+
mask: "*",
|
|
77
|
+
validate: (input) => {
|
|
78
|
+
if (!input)
|
|
79
|
+
return "API key is required";
|
|
80
|
+
if (!/^sk_(test|live)_v1_/.test(input)) {
|
|
81
|
+
return "Invalid API key format. Expected sk_test_v1_xxx or sk_live_v1_xxx";
|
|
82
|
+
}
|
|
83
|
+
return true;
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
]);
|
|
87
|
+
try {
|
|
88
|
+
await apiKeyLogin(apiKey);
|
|
89
|
+
const keyType = apiKey.startsWith("sk_test_") ? "test" : "live";
|
|
90
|
+
success("Logged in with API key", {
|
|
91
|
+
environment: keyType,
|
|
92
|
+
});
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
error(err.message);
|
|
97
|
+
this.exit(1);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Browser login (default)
|
|
102
|
+
try {
|
|
103
|
+
const result = await browserLogin();
|
|
104
|
+
success("Logged in successfully", {
|
|
105
|
+
email: result.email,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
error(err.message);
|
|
110
|
+
this.exit(1);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvbG9naW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNwQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBVSxJQUFJLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbkQsT0FBTyxRQUFRLE1BQU0sVUFBVSxDQUFDO0FBRWhDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sS0FBTSxTQUFRLFdBQVc7SUFDNUMsTUFBTSxDQUFDLFdBQVcsR0FBRywwQkFBMEIsQ0FBQztJQUVoRCxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLHlCQUF5QjtRQUN6QixrREFBa0Q7S0FDbkQsQ0FBQztJQUVGLE1BQU0sQ0FBQyxLQUFLLEdBQUc7UUFDYixHQUFHLFdBQVcsQ0FBQyxTQUFTO1FBQ3hCLFNBQVMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ3RCLElBQUksRUFBRSxHQUFHO1lBQ1QsV0FBVyxFQUFFLG1DQUFtQztTQUNqRCxDQUFDO1FBQ0YsV0FBVyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDekIsSUFBSSxFQUFFLEdBQUc7WUFDVCxXQUFXLEVBQUUsd0JBQXdCO1lBQ3JDLE9BQU8sRUFBRSxLQUFLO1NBQ2YsQ0FBQztLQUNILENBQUM7SUFFRixLQUFLLENBQUMsR0FBRztRQUNQLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFMUMsNkJBQTZCO1FBQzdCLElBQUksZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUMzQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUN4QztvQkFDRSxJQUFJLEVBQUUsU0FBUztvQkFDZixJQUFJLEVBQUUsU0FBUztvQkFDZixPQUFPLEVBQUUsNERBQTREO29CQUNyRSxPQUFPLEVBQUUsS0FBSztpQkFDZjthQUNGLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFDeEIsT0FBTztZQUNULENBQUM7UUFDSCxDQUFDO1FBRUQsZ0JBQWdCO1FBQ2hCLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDO2dCQUNILE1BQU0sV0FBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUNwQyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFDMUUsT0FBTyxDQUFDLHdCQUF3QixFQUFFO29CQUNoQyxXQUFXLEVBQUUsT0FBTztpQkFDckIsQ0FBQyxDQUFDO2dCQUNILE9BQU87WUFDVCxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixLQUFLLENBQUUsR0FBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUM7UUFFRCw2Q0FBNkM7UUFDN0MsSUFBSSxLQUFLLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDN0MsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQztnQkFDdkM7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLFFBQVE7b0JBQ2QsT0FBTyxFQUFFLHFDQUFxQztvQkFDOUMsT0FBTyxFQUFFO3dCQUNQLEVBQUUsSUFBSSxFQUFFLGtDQUFrQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7d0JBQzlELEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFO3FCQUMzQztpQkFDRjthQUNGLENBQUMsQ0FBQztZQUVILElBQUksTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUN4QixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxRQUFRLENBQUMsTUFBTSxDQUFDO29CQUN2Qzt3QkFDRSxJQUFJLEVBQUUsVUFBVTt3QkFDaEIsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsT0FBTyxFQUFFLHFCQUFxQjt3QkFDOUIsSUFBSSxFQUFFLEdBQUc7d0JBQ1QsUUFBUSxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUU7NEJBQzFCLElBQUksQ0FBQyxLQUFLO2dDQUFFLE9BQU8scUJBQXFCLENBQUM7NEJBQ3pDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQ0FDdkMsT0FBTyxtRUFBbUUsQ0FBQzs0QkFDN0UsQ0FBQzs0QkFDRCxPQUFPLElBQUksQ0FBQzt3QkFDZCxDQUFDO3FCQUNGO2lCQUNGLENBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUM7b0JBQ0gsTUFBTSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQzFCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO29CQUNoRSxPQUFPLENBQUMsd0JBQXdCLEVBQUU7d0JBQ2hDLFdBQVcsRUFBRSxPQUFPO3FCQUNyQixDQUFDLENBQUM7b0JBQ0gsT0FBTztnQkFDVCxDQUFDO2dCQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7b0JBQ2IsS0FBSyxDQUFFLEdBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDZixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCwwQkFBMEI7UUFDMUIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxZQUFZLEVBQUUsQ0FBQztZQUNwQyxPQUFPLENBQUMsd0JBQXdCLEVBQUU7Z0JBQ2hDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSzthQUNwQixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLEtBQUssQ0FBRSxHQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmxhZ3MgfSBmcm9tIFwiQG9jbGlmL2NvcmVcIjtcbmltcG9ydCB7IEJhc2VDb21tYW5kIH0gZnJvbSBcIi4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGJyb3dzZXJMb2dpbiwgYXBpS2V5TG9naW4gfSBmcm9tIFwiLi4vbGliL2F1dGguanNcIjtcbmltcG9ydCB7IHN1Y2Nlc3MsIGVycm9yLCBjb2xvcnMsIGluZm8gfSBmcm9tIFwiLi4vbGliL291dHB1dC5qc1wiO1xuaW1wb3J0IHsgaXNBdXRoZW50aWNhdGVkIH0gZnJvbSBcIi4uL2xpYi9jb25maWcuanNcIjtcbmltcG9ydCBpbnF1aXJlciBmcm9tIFwiaW5xdWlyZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9naW4gZXh0ZW5kcyBCYXNlQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9IFwiQXV0aGVudGljYXRlIHdpdGggU2VuZGx5XCI7XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gbG9naW5cIixcbiAgICBcIjwlPSBjb25maWcuYmluICU+IGxvZ2luIC0tYXBpLWtleSBza190ZXN0X3YxX3h4eFwiLFxuICBdO1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5CYXNlQ29tbWFuZC5iYXNlRmxhZ3MsXG4gICAgXCJhcGkta2V5XCI6IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcImtcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkFQSSBrZXkgdG8gdXNlIGZvciBhdXRoZW50aWNhdGlvblwiLFxuICAgIH0pLFxuICAgIGludGVyYWN0aXZlOiBGbGFncy5ib29sZWFuKHtcbiAgICAgIGNoYXI6IFwiaVwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiRm9yY2UgaW50ZXJhY3RpdmUgbW9kZVwiLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgfSksXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZmxhZ3MgfSA9IGF3YWl0IHRoaXMucGFyc2UoTG9naW4pO1xuXG4gICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBsb2dnZWQgaW5cbiAgICBpZiAoaXNBdXRoZW50aWNhdGVkKCkgJiYgIWZsYWdzW1wiYXBpLWtleVwiXSkge1xuICAgICAgY29uc3QgeyBjb25maXJtIH0gPSBhd2FpdCBpbnF1aXJlci5wcm9tcHQoW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJjb25maXJtXCIsXG4gICAgICAgICAgbmFtZTogXCJjb25maXJtXCIsXG4gICAgICAgICAgbWVzc2FnZTogXCJZb3UgYXJlIGFscmVhZHkgbG9nZ2VkIGluLiBEbyB5b3Ugd2FudCB0byByZS1hdXRoZW50aWNhdGU/XCIsXG4gICAgICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICBdKTtcblxuICAgICAgaWYgKCFjb25maXJtKSB7XG4gICAgICAgIGluZm8oXCJMb2dpbiBjYW5jZWxsZWRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBUEkga2V5IGxvZ2luXG4gICAgaWYgKGZsYWdzW1wiYXBpLWtleVwiXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgYXBpS2V5TG9naW4oZmxhZ3NbXCJhcGkta2V5XCJdKTtcbiAgICAgICAgY29uc3Qga2V5VHlwZSA9IGZsYWdzW1wiYXBpLWtleVwiXS5zdGFydHNXaXRoKFwic2tfdGVzdF9cIikgPyBcInRlc3RcIiA6IFwibGl2ZVwiO1xuICAgICAgICBzdWNjZXNzKFwiTG9nZ2VkIGluIHdpdGggQVBJIGtleVwiLCB7XG4gICAgICAgICAgZW52aXJvbm1lbnQ6IGtleVR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgZXJyb3IoKGVyciBhcyBFcnJvcikubWVzc2FnZSk7XG4gICAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbnRlcmFjdGl2ZSBtb2RlIC0gYXNrIHVzZXIgd2hhdCB0aGV5IHdhbnRcbiAgICBpZiAoZmxhZ3MuaW50ZXJhY3RpdmUgfHwgcHJvY2Vzcy5zdGRpbi5pc1RUWSkge1xuICAgICAgY29uc3QgeyBtZXRob2QgfSA9IGF3YWl0IGlucXVpcmVyLnByb21wdChbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgICBuYW1lOiBcIm1ldGhvZFwiLFxuICAgICAgICAgIG1lc3NhZ2U6IFwiSG93IHdvdWxkIHlvdSBsaWtlIHRvIGF1dGhlbnRpY2F0ZT9cIixcbiAgICAgICAgICBjaG9pY2VzOiBbXG4gICAgICAgICAgICB7IG5hbWU6IFwiTG9naW4gd2l0aCBicm93c2VyIChyZWNvbW1lbmRlZClcIiwgdmFsdWU6IFwiYnJvd3NlclwiIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFwiRW50ZXIgQVBJIGtleVwiLCB2YWx1ZTogXCJhcGlrZXlcIiB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdKTtcblxuICAgICAgaWYgKG1ldGhvZCA9PT0gXCJhcGlrZXlcIikge1xuICAgICAgICBjb25zdCB7IGFwaUtleSB9ID0gYXdhaXQgaW5xdWlyZXIucHJvbXB0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInBhc3N3b3JkXCIsXG4gICAgICAgICAgICBuYW1lOiBcImFwaUtleVwiLFxuICAgICAgICAgICAgbWVzc2FnZTogXCJFbnRlciB5b3VyIEFQSSBrZXk6XCIsXG4gICAgICAgICAgICBtYXNrOiBcIipcIixcbiAgICAgICAgICAgIHZhbGlkYXRlOiAoaW5wdXQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICBpZiAoIWlucHV0KSByZXR1cm4gXCJBUEkga2V5IGlzIHJlcXVpcmVkXCI7XG4gICAgICAgICAgICAgIGlmICghL15za18odGVzdHxsaXZlKV92MV8vLnRlc3QoaW5wdXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiSW52YWxpZCBBUEkga2V5IGZvcm1hdC4gRXhwZWN0ZWQgc2tfdGVzdF92MV94eHggb3Igc2tfbGl2ZV92MV94eHhcIjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBhcGlLZXlMb2dpbihhcGlLZXkpO1xuICAgICAgICAgIGNvbnN0IGtleVR5cGUgPSBhcGlLZXkuc3RhcnRzV2l0aChcInNrX3Rlc3RfXCIpID8gXCJ0ZXN0XCIgOiBcImxpdmVcIjtcbiAgICAgICAgICBzdWNjZXNzKFwiTG9nZ2VkIGluIHdpdGggQVBJIGtleVwiLCB7XG4gICAgICAgICAgICBlbnZpcm9ubWVudDoga2V5VHlwZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGVycm9yKChlcnIgYXMgRXJyb3IpLm1lc3NhZ2UpO1xuICAgICAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJyb3dzZXIgbG9naW4gKGRlZmF1bHQpXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJyb3dzZXJMb2dpbigpO1xuICAgICAgc3VjY2VzcyhcIkxvZ2dlZCBpbiBzdWNjZXNzZnVsbHlcIiwge1xuICAgICAgICBlbWFpbDogcmVzdWx0LmVtYWlsLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBlcnJvcigoZXJyIGFzIEVycm9yKS5tZXNzYWdlKTtcbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BaseCommand } from "../lib/base-command.js";
|
|
2
|
+
export default class Logout extends BaseCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
7
|
+
quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
8
|
+
};
|
|
9
|
+
run(): Promise<void>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { BaseCommand } from "../lib/base-command.js";
|
|
2
|
+
import { logout } from "../lib/auth.js";
|
|
3
|
+
import { success, info } from "../lib/output.js";
|
|
4
|
+
import { isAuthenticated } from "../lib/config.js";
|
|
5
|
+
export default class Logout extends BaseCommand {
|
|
6
|
+
static description = "Log out of Sendly";
|
|
7
|
+
static examples = ["<%= config.bin %> logout"];
|
|
8
|
+
static flags = {
|
|
9
|
+
...BaseCommand.baseFlags,
|
|
10
|
+
};
|
|
11
|
+
async run() {
|
|
12
|
+
if (!isAuthenticated()) {
|
|
13
|
+
info("Not currently logged in");
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
logout();
|
|
17
|
+
success("Logged out successfully");
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nb3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2xvZ291dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRW5ELE1BQU0sQ0FBQyxPQUFPLE9BQU8sTUFBTyxTQUFRLFdBQVc7SUFDN0MsTUFBTSxDQUFDLFdBQVcsR0FBRyxtQkFBbUIsQ0FBQztJQUV6QyxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUUvQyxNQUFNLENBQUMsS0FBSyxHQUFHO1FBQ2IsR0FBRyxXQUFXLENBQUMsU0FBUztLQUN6QixDQUFDO0lBRUYsS0FBSyxDQUFDLEdBQUc7UUFDUCxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztZQUNoQyxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sRUFBRSxDQUFDO1FBQ1QsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VDb21tYW5kIH0gZnJvbSBcIi4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGxvZ291dCB9IGZyb20gXCIuLi9saWIvYXV0aC5qc1wiO1xuaW1wb3J0IHsgc3VjY2VzcywgaW5mbyB9IGZyb20gXCIuLi9saWIvb3V0cHV0LmpzXCI7XG5pbXBvcnQgeyBpc0F1dGhlbnRpY2F0ZWQgfSBmcm9tIFwiLi4vbGliL2NvbmZpZy5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb2dvdXQgZXh0ZW5kcyBCYXNlQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9IFwiTG9nIG91dCBvZiBTZW5kbHlcIjtcblxuICBzdGF0aWMgZXhhbXBsZXMgPSBbXCI8JT0gY29uZmlnLmJpbiAlPiBsb2dvdXRcIl07XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIC4uLkJhc2VDb21tYW5kLmJhc2VGbGFncyxcbiAgfTtcblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFpc0F1dGhlbnRpY2F0ZWQoKSkge1xuICAgICAgaW5mbyhcIk5vdCBjdXJyZW50bHkgbG9nZ2VkIGluXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZ291dCgpO1xuICAgIHN1Y2Nlc3MoXCJMb2dnZWQgb3V0IHN1Y2Nlc3NmdWxseVwiKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
2
|
+
export default class LogsTail extends AuthenticatedCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
status: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
7
|
+
since: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
8
|
+
type: 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
|
+
private fetchAndDisplayLogs;
|
|
14
|
+
private displayLog;
|
|
15
|
+
private getTypeLabel;
|
|
16
|
+
private parseSince;
|
|
17
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { Flags } from "@oclif/core";
|
|
2
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
3
|
+
import { apiClient } from "../../lib/api-client.js";
|
|
4
|
+
import { colors, info, } from "../../lib/output.js";
|
|
5
|
+
export default class LogsTail extends AuthenticatedCommand {
|
|
6
|
+
static description = "Tail logs in real-time (like stripe logs tail)";
|
|
7
|
+
static examples = [
|
|
8
|
+
"<%= config.bin %> logs tail",
|
|
9
|
+
"<%= config.bin %> logs tail --status failed",
|
|
10
|
+
"<%= config.bin %> logs tail --since 1h",
|
|
11
|
+
];
|
|
12
|
+
static flags = {
|
|
13
|
+
...AuthenticatedCommand.baseFlags,
|
|
14
|
+
status: Flags.string({
|
|
15
|
+
char: "s",
|
|
16
|
+
description: "Filter by status (sent, delivered, failed)",
|
|
17
|
+
}),
|
|
18
|
+
since: Flags.string({
|
|
19
|
+
description: "Show logs since (e.g., 1h, 30m, 1d)",
|
|
20
|
+
default: "1h",
|
|
21
|
+
}),
|
|
22
|
+
type: Flags.string({
|
|
23
|
+
char: "t",
|
|
24
|
+
description: "Filter by type (message, api_call, webhook)",
|
|
25
|
+
}),
|
|
26
|
+
};
|
|
27
|
+
async run() {
|
|
28
|
+
const { flags } = await this.parse(LogsTail);
|
|
29
|
+
console.log();
|
|
30
|
+
console.log(colors.bold(colors.primary("Sendly Logs")));
|
|
31
|
+
console.log(colors.dim("─".repeat(60)));
|
|
32
|
+
console.log();
|
|
33
|
+
console.log(colors.dim("Streaming logs in real-time. Press Ctrl+C to stop."));
|
|
34
|
+
console.log();
|
|
35
|
+
const since = this.parseSince(flags.since);
|
|
36
|
+
// Initial fetch of recent logs
|
|
37
|
+
await this.fetchAndDisplayLogs(since, flags.status, flags.type);
|
|
38
|
+
// Poll for new logs
|
|
39
|
+
let lastTimestamp = new Date().toISOString();
|
|
40
|
+
const pollInterval = setInterval(async () => {
|
|
41
|
+
try {
|
|
42
|
+
const logs = await apiClient.get("/api/logs", {
|
|
43
|
+
since: lastTimestamp,
|
|
44
|
+
status: flags.status,
|
|
45
|
+
type: flags.type,
|
|
46
|
+
limit: 50,
|
|
47
|
+
});
|
|
48
|
+
for (const log of logs) {
|
|
49
|
+
this.displayLog(log);
|
|
50
|
+
lastTimestamp = log.timestamp;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Ignore polling errors
|
|
55
|
+
}
|
|
56
|
+
}, 2000);
|
|
57
|
+
// Handle graceful shutdown
|
|
58
|
+
process.on("SIGINT", () => {
|
|
59
|
+
clearInterval(pollInterval);
|
|
60
|
+
console.log();
|
|
61
|
+
info("Log streaming stopped");
|
|
62
|
+
process.exit(0);
|
|
63
|
+
});
|
|
64
|
+
// Keep process alive
|
|
65
|
+
await new Promise(() => { });
|
|
66
|
+
}
|
|
67
|
+
async fetchAndDisplayLogs(since, status, type) {
|
|
68
|
+
try {
|
|
69
|
+
const logs = await apiClient.get("/api/logs", {
|
|
70
|
+
since: since.toISOString(),
|
|
71
|
+
status,
|
|
72
|
+
type,
|
|
73
|
+
limit: 50,
|
|
74
|
+
});
|
|
75
|
+
if (logs.length === 0) {
|
|
76
|
+
info("No recent logs found");
|
|
77
|
+
console.log();
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
// Display logs in reverse chronological order
|
|
81
|
+
for (const log of logs.reverse()) {
|
|
82
|
+
this.displayLog(log);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
// If endpoint doesn't exist, show friendly message
|
|
87
|
+
info("Fetching message history...");
|
|
88
|
+
// Fallback to messages endpoint
|
|
89
|
+
try {
|
|
90
|
+
const messages = await apiClient.get("/api/v1/messages", {
|
|
91
|
+
limit: 20,
|
|
92
|
+
});
|
|
93
|
+
for (const msg of messages.data.reverse()) {
|
|
94
|
+
this.displayLog({
|
|
95
|
+
id: msg.id,
|
|
96
|
+
type: "message",
|
|
97
|
+
status: msg.status,
|
|
98
|
+
to: msg.to,
|
|
99
|
+
messageId: msg.id,
|
|
100
|
+
timestamp: msg.createdAt,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
info("No logs available");
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
displayLog(log) {
|
|
110
|
+
const timestamp = new Date(log.timestamp).toLocaleTimeString();
|
|
111
|
+
let icon = "•";
|
|
112
|
+
let statusColor = colors.dim;
|
|
113
|
+
switch (log.status) {
|
|
114
|
+
case "delivered":
|
|
115
|
+
case "success":
|
|
116
|
+
icon = "✓";
|
|
117
|
+
statusColor = colors.success;
|
|
118
|
+
break;
|
|
119
|
+
case "failed":
|
|
120
|
+
case "error":
|
|
121
|
+
icon = "✗";
|
|
122
|
+
statusColor = colors.error;
|
|
123
|
+
break;
|
|
124
|
+
case "queued":
|
|
125
|
+
case "pending":
|
|
126
|
+
icon = "○";
|
|
127
|
+
statusColor = colors.warning;
|
|
128
|
+
break;
|
|
129
|
+
case "sent":
|
|
130
|
+
icon = "→";
|
|
131
|
+
statusColor = colors.info;
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
const typeLabel = this.getTypeLabel(log.type);
|
|
135
|
+
console.log(`${colors.dim(timestamp)} ${statusColor(icon)} ${typeLabel} ${statusColor(log.status)}`);
|
|
136
|
+
// Additional details
|
|
137
|
+
if (log.to) {
|
|
138
|
+
console.log(` ${colors.dim("to:")} ${log.to}`);
|
|
139
|
+
}
|
|
140
|
+
if (log.endpoint) {
|
|
141
|
+
console.log(` ${colors.dim("endpoint:")} ${log.method || "GET"} ${log.endpoint}`);
|
|
142
|
+
}
|
|
143
|
+
if (log.messageId) {
|
|
144
|
+
console.log(` ${colors.dim("id:")} ${log.messageId}`);
|
|
145
|
+
}
|
|
146
|
+
if (log.error) {
|
|
147
|
+
console.log(` ${colors.error("error:")} ${log.error}`);
|
|
148
|
+
}
|
|
149
|
+
console.log();
|
|
150
|
+
}
|
|
151
|
+
getTypeLabel(type) {
|
|
152
|
+
switch (type) {
|
|
153
|
+
case "message":
|
|
154
|
+
return colors.primary("[SMS]");
|
|
155
|
+
case "api_call":
|
|
156
|
+
return colors.code("[API]");
|
|
157
|
+
case "webhook":
|
|
158
|
+
return colors.warning("[HOOK]");
|
|
159
|
+
default:
|
|
160
|
+
return colors.dim(`[${type.toUpperCase()}]`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
parseSince(since) {
|
|
164
|
+
const match = since.match(/^(\d+)([hdm])$/);
|
|
165
|
+
if (!match) {
|
|
166
|
+
return new Date(Date.now() - 60 * 60 * 1000); // Default 1 hour
|
|
167
|
+
}
|
|
168
|
+
const value = parseInt(match[1], 10);
|
|
169
|
+
const unit = match[2];
|
|
170
|
+
const now = Date.now();
|
|
171
|
+
switch (unit) {
|
|
172
|
+
case "h":
|
|
173
|
+
return new Date(now - value * 60 * 60 * 1000);
|
|
174
|
+
case "d":
|
|
175
|
+
return new Date(now - value * 24 * 60 * 60 * 1000);
|
|
176
|
+
case "m":
|
|
177
|
+
return new Date(now - value * 60 * 1000);
|
|
178
|
+
default:
|
|
179
|
+
return new Date(now - 60 * 60 * 1000);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9sb2dzL3RhaWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNwQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUNMLE1BQU0sRUFFTixJQUFJLEdBR0wsTUFBTSxxQkFBcUIsQ0FBQztBQWdCN0IsTUFBTSxDQUFDLE9BQU8sT0FBTyxRQUFTLFNBQVEsb0JBQW9CO0lBQ3hELE1BQU0sQ0FBQyxXQUFXLEdBQUcsZ0RBQWdELENBQUM7SUFFdEUsTUFBTSxDQUFDLFFBQVEsR0FBRztRQUNoQiw2QkFBNkI7UUFDN0IsNkNBQTZDO1FBQzdDLHdDQUF3QztLQUN6QyxDQUFDO0lBRUYsTUFBTSxDQUFDLEtBQUssR0FBRztRQUNiLEdBQUcsb0JBQW9CLENBQUMsU0FBUztRQUNqQyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNuQixJQUFJLEVBQUUsR0FBRztZQUNULFdBQVcsRUFBRSw0Q0FBNEM7U0FDMUQsQ0FBQztRQUNGLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ2xCLFdBQVcsRUFBRSxxQ0FBcUM7WUFDbEQsT0FBTyxFQUFFLElBQUk7U0FDZCxDQUFDO1FBQ0YsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDakIsSUFBSSxFQUFFLEdBQUc7WUFDVCxXQUFXLEVBQUUsNkNBQTZDO1NBQzNELENBQUM7S0FDSCxDQUFDO0lBRUYsS0FBSyxDQUFDLEdBQUc7UUFDUCxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTdDLE9BQU8sQ0FBQyxHQUFHLEVB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SyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXRCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN2QixRQUFRLElBQUksRUFBRSxDQUFDO1lBQ2IsS0FBSyxHQUFHO2dCQUNOLE9BQU8sSUFBSSxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ2hELEtBQUssR0FBRztnQkFDTixPQUFPLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDckQsS0FBSyxHQUFHO2dCQUNOLE9BQU8sSUFBSSxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDM0M7Z0JBQ0UsT0FBTyxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUMxQyxDQUFDO0lBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZsYWdzIH0gZnJvbSBcIkBvY2xpZi9jb3JlXCI7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGVkQ29tbWFuZCB9IGZyb20gXCIuLi8uLi9saWIvYmFzZS1jb21tYW5kLmpzXCI7XG5pbXBvcnQgeyBhcGlDbGllbnQgfSBmcm9tIFwiLi4vLi4vbGliL2FwaS1jbGllbnQuanNcIjtcbmltcG9ydCB7XG4gIGNvbG9ycyxcbiAgZm9ybWF0UmVsYXRpdmVUaW1lLFxuICBpbmZvLFxuICBqc29uIGFzIGpzb25PdXRwdXQsXG4gIGlzSnNvbk1vZGUsXG59IGZyb20gXCIuLi8uLi9saWIvb3V0cHV0LmpzXCI7XG5pbXBvcnQgeyBnZXRDb25maWdWYWx1ZSB9IGZyb20gXCIuLi8uLi9saWIvY29uZmlnLmpzXCI7XG5cbmludGVyZmFjZSBMb2dFbnRyeSB7XG4gIGlkOiBzdHJpbmc7XG4gIHR5cGU6IFwibWVzc2FnZVwiIHwgXCJhcGlfY2FsbFwiIHwgXCJ3ZWJob29rXCI7XG4gIHN0YXR1czogc3RyaW5nO1xuICBlbmRwb2ludD86IHN0cmluZztcbiAgbWV0aG9kPzogc3RyaW5nO1xuICBzdGF0dXNDb2RlPzogbnVtYmVyO1xuICB0bz86IHN0cmluZztcbiAgbWVzc2FnZUlkPzogc3RyaW5nO1xuICBlcnJvcj86IHN0cmluZztcbiAgdGltZXN0YW1wOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvZ3NUYWlsIGV4dGVuZHMgQXV0aGVudGljYXRlZENvbW1hbmQge1xuICBzdGF0aWMgZGVzY3JpcHRpb24gPSBcIlRhaWwgbG9ncyBpbiByZWFsLXRpbWUgKGxpa2Ugc3RyaXBlIGxvZ3MgdGFpbClcIjtcblxuICBzdGF0aWMgZXhhbXBsZXMgPSBbXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiBsb2dzIHRhaWxcIixcbiAgICBcIjwlPSBjb25maWcuYmluICU+IGxvZ3MgdGFpbCAtLXN0YXR1cyBmYWlsZWRcIixcbiAgICBcIjwlPSBjb25maWcuYmluICU+IGxvZ3MgdGFpbCAtLXNpbmNlIDFoXCIsXG4gIF07XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIC4uLkF1dGhlbnRpY2F0ZWRDb21tYW5kLmJhc2VGbGFncyxcbiAgICBzdGF0dXM6IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcInNcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkZpbHRlciBieSBzdGF0dXMgKHNlbnQsIGRlbGl2ZXJlZCwgZmFpbGVkKVwiLFxuICAgIH0pLFxuICAgIHNpbmNlOiBGbGFncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246IFwiU2hvdyBsb2dzIHNpbmNlIChlLmcuLCAxaCwgMzBtLCAxZClcIixcbiAgICAgIGRlZmF1bHQ6IFwiMWhcIixcbiAgICB9KSxcbiAgICB0eXBlOiBGbGFncy5zdHJpbmcoe1xuICAgICAgY2hhcjogXCJ0XCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJGaWx0ZXIgYnkgdHlwZSAobWVzc2FnZSwgYXBpX2NhbGwsIHdlYmhvb2spXCIsXG4gICAgfSksXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZmxhZ3MgfSA9IGF3YWl0IHRoaXMucGFyc2UoTG9nc1RhaWwpO1xuXG4gICAgY29uc29sZS5sb2coKTtcbiAgICBjb25zb2xlLmxvZyhjb2xvcnMuYm9sZChjb2xvcnMucHJpbWFyeShcIlNlbmRseSBMb2dzXCIpKSk7XG4gICAgY29uc29sZS5sb2coY29sb3JzLmRpbShcIuKUgFwiLnJlcGVhdCg2MCkpKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oXCJTdHJlYW1pbmcgbG9ncyBpbiByZWFsLXRpbWUuIFByZXNzIEN0cmwrQyB0byBzdG9wLlwiKSk7XG4gICAgY29uc29sZS5sb2coKTtcblxuICAgIGNvbnN0IHNpbmNlID0gdGhpcy5wYXJzZVNpbmNlKGZsYWdzLnNpbmNlKTtcblxuICAgIC8vIEluaXRpYWwgZmV0Y2ggb2YgcmVjZW50IGxvZ3NcbiAgICBhd2FpdCB0aGlzLmZldGNoQW5kRGlzcGxheUxvZ3Moc2luY2UsIGZsYWdzLnN0YXR1cywgZmxhZ3MudHlwZSk7XG5cbiAgICAvLyBQb2xsIGZvciBuZXcgbG9nc1xuICAgIGxldCBsYXN0VGltZXN0YW1wID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuXG4gICAgY29uc3QgcG9sbEludGVydmFsID0gc2V0SW50ZXJ2YWwoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbG9ncyA9IGF3YWl0IGFwaUNsaWVudC5nZXQ8TG9nRW50cnlbXT4oXCIvYXBpL2xvZ3NcIiwge1xuICAgICAgICAgIHNpbmNlOiBsYXN0VGltZXN0YW1wLFxuICAgICAgICAgIHN0YXR1czogZmxhZ3Muc3RhdHVzLFxuICAgICAgICAgIHR5cGU6IGZsYWdzLnR5cGUsXG4gICAgICAgICAgbGltaXQ6IDUwLFxuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGxvZyBvZiBsb2dzKSB7XG4gICAgICAgICAgdGhpcy5kaXNwbGF5TG9nKGxvZyk7XG4gICAgICAgICAgbGFzdFRpbWVzdGFtcCA9IGxvZy50aW1lc3RhbXA7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBJZ25vcmUgcG9sbGluZyBlcnJvcnNcbiAgICAgIH1cbiAgICB9LCAyMDAwKTtcblxuICAgIC8vIEhhbmRsZSBncmFjZWZ1bCBzaHV0ZG93blxuICAgIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgKCkgPT4ge1xuICAgICAgY2xlYXJJbnRlcnZhbChwb2xsSW50ZXJ2YWwpO1xuICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgIGluZm8oXCJMb2cgc3RyZWFtaW5nIHN0b3BwZWRcIik7XG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfSk7XG5cbiAgICAvLyBLZWVwIHByb2Nlc3MgYWxpdmVcbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgoKSA9PiB7fSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoQW5kRGlzcGxheUxvZ3MoXG4gICAgc2luY2U6IERhdGUsXG4gICAgc3RhdHVzPzogc3RyaW5nLFxuICAgIHR5cGU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGxvZ3MgPSBhd2FpdCBhcGlDbGllbnQuZ2V0PExvZ0VudHJ5W10+KFwiL2FwaS9sb2dzXCIsIHtcbiAgICAgICAgc2luY2U6IHNpbmNlLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHN0YXR1cyxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgbGltaXQ6IDUwLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChsb2dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBpbmZvKFwiTm8gcmVjZW50IGxvZ3MgZm91bmRcIik7XG4gICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gRGlzcGxheSBsb2dzIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlclxuICAgICAgZm9yIChjb25zdCBsb2cgb2YgbG9ncy5yZXZlcnNlKCkpIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5TG9nKGxvZyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBJZiBlbmRwb2ludCBkb2Vzbid0IGV4aXN0LCBzaG93IGZyaWVuZGx5IG1lc3NhZ2VcbiAgICAgIGluZm8oXCJGZXRjaGluZyBtZXNzYWdlIGhpc3RvcnkuLi5cIik7XG5cbiAgICAgIC8vIEZhbGxiYWNrIHRvIG1lc3NhZ2VzIGVuZHBvaW50XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBtZXNzYWdlcyA9IGF3YWl0IGFwaUNsaWVudC5nZXQ8eyBkYXRhOiBhbnlbXSB9PihcIi9hcGkvdjEvbWVzc2FnZXNcIiwge1xuICAgICAgICAgIGxpbWl0OiAyMCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBtc2cgb2YgbWVzc2FnZXMuZGF0YS5yZXZlcnNlKCkpIHtcbiAgICAgICAgICB0aGlzLmRpc3BsYXlMb2coe1xuICAgICAgICAgICAgaWQ6IG1zZy5pZCxcbiAgICAgICAgICAgIHR5cGU6IFwibWVzc2FnZVwiLFxuICAgICAgICAgICAgc3RhdHVzOiBtc2cuc3RhdHVzLFxuICAgICAgICAgICAgdG86IG1zZy50byxcbiAgICAgICAgICAgIG1lc3NhZ2VJZDogbXNnLmlkLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBtc2cuY3JlYXRlZEF0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgaW5mbyhcIk5vIGxvZ3MgYXZhaWxhYmxlXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGlzcGxheUxvZyhsb2c6IExvZ0VudHJ5KTogdm9pZCB7XG4gICAgY29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUobG9nLnRpbWVzdGFtcCkudG9Mb2NhbGVUaW1lU3RyaW5nKCk7XG5cbiAgICBsZXQgaWNvbiA9IFwi4oCiXCI7XG4gICAgbGV0IHN0YXR1c0NvbG9yID0gY29sb3JzLmRpbTtcblxuICAgIHN3aXRjaCAobG9nLnN0YXR1cykge1xuICAgICAgY2FzZSBcImRlbGl2ZXJlZFwiOlxuICAgICAgY2FzZSBcInN1Y2Nlc3NcIjpcbiAgICAgICAgaWNvbiA9IFwi4pyTXCI7XG4gICAgICAgIHN0YXR1c0NvbG9yID0gY29sb3JzLnN1Y2Nlc3M7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImZhaWxlZFwiOlxuICAgICAgY2FzZSBcImVycm9yXCI6XG4gICAgICAgIGljb24gPSBcIuKcl1wiO1xuICAgICAgICBzdGF0dXNDb2xvciA9IGNvbG9ycy5lcnJvcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwicXVldWVkXCI6XG4gICAgICBjYXNlIFwicGVuZGluZ1wiOlxuICAgICAgICBpY29uID0gXCLil4tcIjtcbiAgICAgICAgc3RhdHVzQ29sb3IgPSBjb2xvcnMud2FybmluZztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwic2VudFwiOlxuICAgICAgICBpY29uID0gXCLihpJcIjtcbiAgICAgICAgc3RhdHVzQ29sb3IgPSBjb2xvcnMuaW5mbztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY29uc3QgdHlwZUxhYmVsID0gdGhpcy5nZXRUeXBlTGFiZWwobG9nLnR5cGUpO1xuXG4gICAgY29uc29sZS5sb2coXG4gICAgICBgJHtjb2xvcnMuZGltKHRpbWVzdGFtcCl9ICR7c3RhdHVzQ29sb3IoaWNvbil9ICR7dHlwZUxhYmVsfSAke3N0YXR1c0NvbG9yKGxvZy5zdGF0dXMpfWBcbiAgICApO1xuXG4gICAgLy8gQWRkaXRpb25hbCBkZXRhaWxzXG4gICAgaWYgKGxvZy50bykge1xuICAgICAgY29uc29sZS5sb2coYCAgJHtjb2xvcnMuZGltKFwidG86XCIpfSAke2xvZy50b31gKTtcbiAgICB9XG4gICAgaWYgKGxvZy5lbmRwb2ludCkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGAgICR7Y29sb3JzLmRpbShcImVuZHBvaW50OlwiKX0gJHtsb2cubWV0aG9kIHx8IFwiR0VUXCJ9ICR7bG9nLmVuZHBvaW50fWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChsb2cubWVzc2FnZUlkKSB7XG4gICAgICBjb25zb2xlLmxvZyhgICAke2NvbG9ycy5kaW0oXCJpZDpcIil9ICR7bG9nLm1lc3NhZ2VJZH1gKTtcbiAgICB9XG4gICAgaWYgKGxvZy5lcnJvcikge1xuICAgICAgY29uc29sZS5sb2coYCAgJHtjb2xvcnMuZXJyb3IoXCJlcnJvcjpcIil9ICR7bG9nLmVycm9yfWApO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUeXBlTGFiZWwodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgIHJldHVybiBjb2xvcnMucHJpbWFyeShcIltTTVNdXCIpO1xuICAgICAgY2FzZSBcImFwaV9jYWxsXCI6XG4gICAgICAgIHJldHVybiBjb2xvcnMuY29kZShcIltBUEldXCIpO1xuICAgICAgY2FzZSBcIndlYmhvb2tcIjpcbiAgICAgICAgcmV0dXJuIGNvbG9ycy53YXJuaW5nKFwiW0hPT0tdXCIpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGNvbG9ycy5kaW0oYFske3R5cGUudG9VcHBlckNhc2UoKX1dYCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVNpbmNlKHNpbmNlOiBzdHJpbmcpOiBEYXRlIHtcbiAgICBjb25zdCBtYXRjaCA9IHNpbmNlLm1hdGNoKC9eKFxcZCspKFtoZG1dKSQvKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5ub3coKSAtIDYwICogNjAgKiAxMDAwKTsgLy8gRGVmYXVsdCAxIGhvdXJcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlSW50KG1hdGNoWzFdLCAxMCk7XG4gICAgY29uc3QgdW5pdCA9IG1hdGNoWzJdO1xuXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBzd2l0Y2ggKHVuaXQpIHtcbiAgICAgIGNhc2UgXCJoXCI6XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShub3cgLSB2YWx1ZSAqIDYwICogNjAgKiAxMDAwKTtcbiAgICAgIGNhc2UgXCJkXCI6XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShub3cgLSB2YWx1ZSAqIDI0ICogNjAgKiA2MCAqIDEwMDApO1xuICAgICAgY2FzZSBcIm1cIjpcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKG5vdyAtIHZhbHVlICogNjAgKiAxMDAwKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShub3cgLSA2MCAqIDYwICogMTAwMCk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../lib/base-command.js";
|
|
2
|
+
export default class SmsBatch extends AuthenticatedCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
file: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
7
|
+
to: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
8
|
+
text: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
9
|
+
from: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
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
|
+
private parseMessagesFromFile;
|
|
15
|
+
private parseMessagesFromFlags;
|
|
16
|
+
}
|