@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.
Files changed (60) hide show
  1. package/README.md +323 -0
  2. package/bin/run.js +5 -0
  3. package/dist/commands/config/get.d.ts +13 -0
  4. package/dist/commands/config/get.js +38 -0
  5. package/dist/commands/config/list.d.ts +10 -0
  6. package/dist/commands/config/list.js +45 -0
  7. package/dist/commands/config/set.d.ts +14 -0
  8. package/dist/commands/config/set.js +67 -0
  9. package/dist/commands/credits/balance.d.ts +10 -0
  10. package/dist/commands/credits/balance.js +38 -0
  11. package/dist/commands/credits/history.d.ts +11 -0
  12. package/dist/commands/credits/history.js +88 -0
  13. package/dist/commands/doctor.d.ts +23 -0
  14. package/dist/commands/doctor.js +336 -0
  15. package/dist/commands/keys/create.d.ts +12 -0
  16. package/dist/commands/keys/create.js +47 -0
  17. package/dist/commands/keys/list.d.ts +10 -0
  18. package/dist/commands/keys/list.js +65 -0
  19. package/dist/commands/keys/revoke.d.ts +15 -0
  20. package/dist/commands/keys/revoke.js +68 -0
  21. package/dist/commands/login.d.ts +12 -0
  22. package/dist/commands/login.js +114 -0
  23. package/dist/commands/logout.d.ts +10 -0
  24. package/dist/commands/logout.js +20 -0
  25. package/dist/commands/logs/tail.d.ts +17 -0
  26. package/dist/commands/logs/tail.js +183 -0
  27. package/dist/commands/sms/batch.d.ts +16 -0
  28. package/dist/commands/sms/batch.js +163 -0
  29. package/dist/commands/sms/cancel.d.ts +13 -0
  30. package/dist/commands/sms/cancel.js +46 -0
  31. package/dist/commands/sms/get.d.ts +13 -0
  32. package/dist/commands/sms/get.js +51 -0
  33. package/dist/commands/sms/list.d.ts +12 -0
  34. package/dist/commands/sms/list.js +79 -0
  35. package/dist/commands/sms/schedule.d.ts +14 -0
  36. package/dist/commands/sms/schedule.js +91 -0
  37. package/dist/commands/sms/scheduled.d.ts +12 -0
  38. package/dist/commands/sms/scheduled.js +82 -0
  39. package/dist/commands/sms/send.d.ts +13 -0
  40. package/dist/commands/sms/send.js +70 -0
  41. package/dist/commands/webhooks/list.d.ts +10 -0
  42. package/dist/commands/webhooks/list.js +80 -0
  43. package/dist/commands/webhooks/listen.d.ts +20 -0
  44. package/dist/commands/webhooks/listen.js +202 -0
  45. package/dist/commands/whoami.d.ts +10 -0
  46. package/dist/commands/whoami.js +51 -0
  47. package/dist/index.d.ts +26 -0
  48. package/dist/index.js +27 -0
  49. package/dist/lib/api-client.d.ts +52 -0
  50. package/dist/lib/api-client.js +129 -0
  51. package/dist/lib/auth.d.ts +52 -0
  52. package/dist/lib/auth.js +171 -0
  53. package/dist/lib/base-command.d.ts +17 -0
  54. package/dist/lib/base-command.js +60 -0
  55. package/dist/lib/config.d.ts +54 -0
  56. package/dist/lib/config.js +182 -0
  57. package/dist/lib/output.d.ts +43 -0
  58. package/dist/lib/output.js +222 -0
  59. package/oclif.manifest.json +1147 -0
  60. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvbG9naW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNwQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBVSxJQUFJLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbkQsT0FBTyxRQUFRLE1BQU0sVUFBVSxDQUFDO0FBRWhDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sS0FBTSxTQUFRLFdBQVc7SUFDNUMsTUFBTSxDQUFDLFdBQVcsR0FBRywwQkFBMEIsQ0FBQztJQUVoRCxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLHlCQUF5QjtRQUN6QixrREFBa0Q7S0FDbkQsQ0FBQztJQUVGLE1BQU0sQ0FBQyxLQUFLLEdBQUc7UUFDYixHQUFHLFdBQVcsQ0FBQyxTQUFTO1FBQ3hCLFNBQVMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ3RCLElBQUksRUFBRSxHQUFHO1lBQ1QsV0FBVyxFQUFFLG1DQUFtQztTQUNqRCxDQUFDO1FBQ0YsV0FBVyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDekIsSUFBSSxFQUFFLEdBQUc7WUFDVCxXQUFXLEVBQUUsd0JBQXdCO1lBQ3JDLE9BQU8sRUFBRSxLQUFLO1NBQ2YsQ0FBQztLQUNILENBQUM7SUFFRixLQUFLLENBQUMsR0FBRztRQUNQLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFMUMsNkJBQTZCO1FBQzdCLElBQUks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QUM7b0JBQ2IsS0FBSyxDQUFFLEdBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDZixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCwwQkFBMEI7UUFDMUIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxZQUFZLEVBQUUsQ0FBQztZQUNwQyxPQUFPLENBQUMsd0JBQXdCLEVBQUU7Z0JBQ2hDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSzthQUNwQixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLEtBQUssQ0FBRSxHQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmxhZ3MgfSBmcm9tIFwiQG9jbGlmL2NvcmVcIjtcbmltcG9ydCB7IEJhc2VDb21tYW5kIH0gZnJvbSBcIi4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGJyb3dzZXJMb2dpbiwgYXBpS2V5TG9naW4gfSBmcm9tIFwiLi4vbGliL2F1dGguanNcIjtcbmltcG9ydCB7IHN1Y2Nlc3MsIGVycm9yLCBjb2xvcnMsIGluZm8gfSBmcm9tIFwiLi4vbGliL291dHB1dC5qc1wiO1xuaW1wb3J0IHsgaXNBdXRoZW50aWNhdGVkIH0gZnJvbSBcIi4uL2xpYi9jb25maWcuanNcIjtcbmltcG9ydCBpbnF1aXJlciBmcm9tIFwiaW5xdWlyZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9naW4gZXh0ZW5kcyBCYXNlQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9IFwiQXV0aGVudGljYXRlIHdpdGggU2VuZGx5XCI7XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gbG9naW5cIixcbiAgICBcIjwlPSBjb25maWcuYmluICU+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
+ }