@sendly/cli 3.37.1 → 3.38.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 (64) hide show
  1. package/README.md +178 -0
  2. package/dist/commands/business-upgrade/resubmit.js +3 -3
  3. package/dist/commands/business-upgrade/start.js +3 -3
  4. package/dist/commands/config/list.js +14 -2
  5. package/dist/commands/config/set.js +16 -3
  6. package/dist/commands/countries.js +2 -2
  7. package/dist/commands/credits/index.d.ts +1 -0
  8. package/dist/commands/credits/index.js +4 -0
  9. package/dist/commands/doctor.d.ts +12 -0
  10. package/dist/commands/doctor.js +51 -8
  11. package/dist/commands/enterprise/upload-verification-document.js +3 -3
  12. package/dist/commands/enterprise/verification/resubmit.js +2 -2
  13. package/dist/commands/enterprise/verification/submit.js +2 -2
  14. package/dist/commands/events/listen.js +3 -3
  15. package/dist/commands/numbers/buy.js +19 -4
  16. package/dist/commands/rcs/agents.d.ts +10 -0
  17. package/dist/commands/rcs/agents.js +89 -0
  18. package/dist/commands/rcs/capability.d.ts +12 -0
  19. package/dist/commands/rcs/capability.js +85 -0
  20. package/dist/commands/rcs/send.d.ts +21 -0
  21. package/dist/commands/rcs/send.js +240 -0
  22. package/dist/commands/send.d.ts +1 -0
  23. package/dist/commands/send.js +5 -2
  24. package/dist/commands/sms/batch.d.ts +1 -0
  25. package/dist/commands/sms/batch.js +11 -1
  26. package/dist/commands/sms/group.d.ts +1 -0
  27. package/dist/commands/sms/group.js +5 -2
  28. package/dist/commands/sms/schedule.d.ts +1 -0
  29. package/dist/commands/sms/schedule.js +5 -2
  30. package/dist/commands/sms/send.d.ts +1 -0
  31. package/dist/commands/sms/send.js +5 -2
  32. package/dist/commands/whatsapp/connect.d.ts +17 -0
  33. package/dist/commands/whatsapp/connect.js +166 -0
  34. package/dist/commands/whatsapp/profile/get.d.ts +13 -0
  35. package/dist/commands/whatsapp/profile/get.js +67 -0
  36. package/dist/commands/whatsapp/profile/update.d.ts +20 -0
  37. package/dist/commands/whatsapp/profile/update.js +109 -0
  38. package/dist/commands/whatsapp/send.d.ts +17 -0
  39. package/dist/commands/whatsapp/send.js +151 -0
  40. package/dist/commands/whatsapp/senders.d.ts +10 -0
  41. package/dist/commands/whatsapp/senders.js +74 -0
  42. package/dist/commands/whatsapp/status.d.ts +13 -0
  43. package/dist/commands/whatsapp/status.js +92 -0
  44. package/dist/commands/whatsapp/templates/create.d.ts +19 -0
  45. package/dist/commands/whatsapp/templates/create.js +205 -0
  46. package/dist/commands/whatsapp/templates/delete.d.ts +14 -0
  47. package/dist/commands/whatsapp/templates/delete.js +69 -0
  48. package/dist/commands/whatsapp/templates/list.d.ts +10 -0
  49. package/dist/commands/whatsapp/templates/list.js +77 -0
  50. package/dist/commands/whatsapp/templates/update.d.ts +18 -0
  51. package/dist/commands/whatsapp/templates/update.js +160 -0
  52. package/dist/commands/whoami.js +32 -6
  53. package/dist/hooks/command-not-found.js +46 -61
  54. package/dist/lib/api-client.d.ts +9 -1
  55. package/dist/lib/api-client.js +78 -9
  56. package/dist/lib/auth.js +10 -6
  57. package/dist/lib/base-command.js +9 -1
  58. package/dist/lib/config.d.ts +50 -1
  59. package/dist/lib/config.js +144 -7
  60. package/dist/lib/help.d.ts +10 -0
  61. package/dist/lib/help.js +23 -0
  62. package/dist/lib/onboarding.js +3 -3
  63. package/oclif.manifest.json +1707 -736
  64. package/package.json +8 -1
@@ -0,0 +1,151 @@
1
+ import { Flags } from "@oclif/core";
2
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
3
+ import { apiClient, ApiError, AuthenticationError, NotFoundError, } from "../../lib/api-client.js";
4
+ import { success, error, json, colors, spinner, isJsonMode, formatStatus, formatCredits, } from "../../lib/output.js";
5
+ /** Parse repeatable n=value pairs into a template-variables record. */
6
+ function parseVariables(raw) {
7
+ if (!raw || raw.length === 0)
8
+ return undefined;
9
+ const out = {};
10
+ for (const item of raw) {
11
+ const idx = item.indexOf("=");
12
+ if (idx <= 0) {
13
+ return `Invalid --var "${item}" — use n=value (e.g. 1=TinyFat)`;
14
+ }
15
+ out[item.slice(0, idx).trim()] = item.slice(idx + 1);
16
+ }
17
+ return out;
18
+ }
19
+ export default class WhatsappSend extends AuthenticatedCommand {
20
+ static description = "Send a WhatsApp message — free-form text inside the 24-hour reply window, or an approved template any time";
21
+ static examples = [
22
+ '<%= config.bin %> whatsapp send --to +15551234567 --from +15559876543 --text "Your table is ready!"',
23
+ "<%= config.bin %> whatsapp send --to +447700900123 --from +15559876543 --template order_shipped --language en_US --var 1=TinyFat --var 2=4821",
24
+ '<%= config.bin %> whatsapp send --to +15551234567 --from +15559876543 --text "Hello!" --json',
25
+ ];
26
+ static flags = {
27
+ ...AuthenticatedCommand.baseFlags,
28
+ to: Flags.string({
29
+ char: "t",
30
+ description: "Recipient phone number (E.164 format)",
31
+ required: true,
32
+ }),
33
+ from: Flags.string({
34
+ char: "f",
35
+ description: "Your WhatsApp-connected sender number (E.164 format)",
36
+ required: true,
37
+ }),
38
+ text: Flags.string({
39
+ char: "m",
40
+ description: "Free-form message text (only inside the 24-hour reply window)",
41
+ exclusive: ["template", "language", "var"],
42
+ }),
43
+ template: Flags.string({
44
+ description: "Approved template name (reaches contacts any time)",
45
+ }),
46
+ language: Flags.string({
47
+ char: "l",
48
+ description: "Template language code (e.g. en_US); required with --template",
49
+ dependsOn: ["template"],
50
+ }),
51
+ var: Flags.string({
52
+ description: "Template variable as n=value (e.g. --var 1=TinyFat). Repeatable.",
53
+ multiple: true,
54
+ dependsOn: ["template"],
55
+ }),
56
+ "idempotency-key": Flags.string({
57
+ description: "Idempotency key (1-255 printable ASCII characters). Re-running with the same key within 24 hours returns the original result instead of sending again.",
58
+ }),
59
+ };
60
+ async run() {
61
+ const { flags } = await this.parse(WhatsappSend);
62
+ if (!flags.text && !flags.template) {
63
+ error("Provide either --text or --template", {
64
+ hint: 'Free-form: --text "Hello!" · Template: --template order_shipped --language en_US',
65
+ });
66
+ this.exit(1);
67
+ }
68
+ if (flags.template && !flags.language) {
69
+ error("Missing --language for the template", {
70
+ hint: "Templates are per-language — e.g. --language en_US",
71
+ });
72
+ this.exit(1);
73
+ }
74
+ const variables = parseVariables(flags.var);
75
+ if (typeof variables === "string") {
76
+ error(variables);
77
+ this.exit(1);
78
+ }
79
+ const sendSpinner = spinner("Sending WhatsApp message...");
80
+ if (!isJsonMode()) {
81
+ sendSpinner.start();
82
+ }
83
+ try {
84
+ const response = await apiClient.post("/api/v1/messages", {
85
+ channel: "whatsapp",
86
+ to: flags.to,
87
+ from: flags.from,
88
+ ...(flags.text
89
+ ? { text: flags.text }
90
+ : {
91
+ template: {
92
+ name: flags.template,
93
+ language: flags.language,
94
+ ...(variables && { variables }),
95
+ },
96
+ }),
97
+ }, true, { idempotencyKey: flags["idempotency-key"] });
98
+ sendSpinner.stop();
99
+ if (isJsonMode()) {
100
+ json(response);
101
+ return;
102
+ }
103
+ success("WhatsApp message queued", {
104
+ "Message ID": colors.code(response.id),
105
+ To: response.to,
106
+ From: response.from,
107
+ Kind: response.whatsapp?.kind ?? (flags.text ? "text" : "template"),
108
+ ...(response.whatsapp?.template && {
109
+ Template: `${response.whatsapp.template.name} (${response.whatsapp.template.language}, ${response.whatsapp.template.category})`,
110
+ }),
111
+ Status: formatStatus(response.status),
112
+ Credits: formatCredits(response.creditsUsed),
113
+ });
114
+ }
115
+ catch (err) {
116
+ sendSpinner.stop();
117
+ if (err instanceof ApiError && err.code === "whatsapp_window_closed") {
118
+ error(err.message, {
119
+ hint: "outside the 24-hour reply window — send an approved template instead",
120
+ });
121
+ console.error(colors.dim(` e.g. ${colors.code(`sendly whatsapp send --to ${flags.to} --from ${flags.from} --template <name> --language en_US`)}`));
122
+ }
123
+ else if (err instanceof ApiError &&
124
+ err.code === "whatsapp_template_not_approved") {
125
+ error(err.message, {
126
+ hint: "Check its review status with `sendly whatsapp templates list`",
127
+ });
128
+ }
129
+ else if (err instanceof NotFoundError) {
130
+ error(err.message, {
131
+ hint: "Run `sendly whatsapp templates list` to see your templates and their exact names/languages",
132
+ });
133
+ }
134
+ else if (err instanceof AuthenticationError &&
135
+ err.message?.includes("connected to WhatsApp")) {
136
+ error(err.message, {
137
+ hint: `Connect it first: sendly whatsapp connect --number ${flags.from}`,
138
+ });
139
+ }
140
+ else if (err instanceof AuthenticationError &&
141
+ /whatsapp/i.test(err.message ?? "")) {
142
+ error(err.message);
143
+ }
144
+ else {
145
+ throw err;
146
+ }
147
+ this.exit(1);
148
+ }
149
+ }
150
+ }
151
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy93aGF0c2FwcC9zZW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUNMLFNBQVMsRUFDVCxRQUFRLEVBQ1IsbUJBQW1CLEVBQ25CLGFBQWEsR0FDZCxNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFDTCxPQUFPLEVBQ1AsS0FBSyxFQUNMLElBQUksRUFDSixNQUFNLEVBQ04sT0FBTyxFQUNQLFVBQVUsRUFDVixZQUFZLEVBQ1osYUFBYSxHQUNkLE1BQU0scUJBQXFCLENBQUM7QUFxQjdCLHVFQUF1RTtBQUN2RSxTQUFTLGNBQWMsQ0FDckIsR0FBeUI7SUFFekIsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMvQyxNQUFNLEdBQUcsR0FBMkIsRUFBRSxDQUFDO0lBQ3ZDLEtBQUssTUFBTSxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7UUFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNiLE9BQU8sa0JBQWtCLElBQUksa0NBQWtDLENBQUM7UUFDbEUsQ0FBQztRQUNELEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxNQUFNLENBQUMsT0FBTyxPQUFPLFlBQWEsU0FBUSxvQkFBb0I7SUFDNUQsTUFBTSxDQUFDLFdBQVcsR0FDaEIsNEdBQTRHLENBQUM7SUFFL0csTUFBTSxDQUFDLFFBQVEsR0FBRztRQUNoQixxR0FBcUc7UUFDckcsK0lBQStJO1FBQy9JLDhGQUE4RjtLQUMvRixDQUFDO0lBRUYsTUFBTSxDQUFDLEtBQUssR0FBRztRQUNiLEdBQUcsb0JBQW9CLENBQUMsU0FBUztRQUNqQyxFQUFFLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNmLElBQUksRUFBRSxHQUFHO1lBQ1QsV0FBVyxFQUFFLHVDQUF1QztZQUNwRCxRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUM7UUFDRixJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNqQixJQUFJLEVBQUUsR0FBRztZQUNULFdBQVcsRUFBRSxzREFBc0Q7WUFDbkUsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDO1FBQ0YsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDakIsSUFBSSxFQUFFLEdBQUc7WUFDVCxXQUFXLEVBQ1QsK0RBQStEO1lBQ2pFLFNBQVMsRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDO1NBQzNDLENBQUM7UUFDRixRQUFRLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNyQixXQUFXLEVBQUUsb0RBQW9EO1NBQ2xFLENBQUM7UUFDRixRQUFRLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNyQixJQUFJLEVBQUUsR0FBRztZQUNULFdBQVcsRUFBRSwrREFBK0Q7WUFDNUUsU0FBUyxFQUFFLENBQUMsVUFBVSxDQUFDO1NBQ3hCLENBQUM7UUFDRixHQUFHLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNoQixXQUFXLEVBQ1Qsa0VBQWtFO1lBQ3BFLFFBQVEsRUFBRSxJQUFJO1lBQ2QsU0FBUyxFQUFFLENBQUMsVUFBVSxDQUFDO1NBQ3hCLENBQUM7UUFDRixpQkFBaUIsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQzlCLFdBQVcsRUFDVCx3SkFBd0o7U0FDM0osQ0FBQztLQUNILENBQUM7SUFFRixLQUFLLENBQUMsR0FBRztRQUNQLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFakQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkMsS0FBSyxDQUFDLHFDQUFxQyxFQUFFO2dCQUMzQyxJQUFJLEVBQUUsa0ZBQWtGO2FBQ3pGLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZixDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3RDLEtBQUssQ0FBQyxxQ0FBcUMsRUFBRTtnQkFDM0MsSUFBSSxFQUFFLG9EQUFvRDthQUMzRCxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2YsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUMsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNsQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUNsQixXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEIsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sU0FBUyxDQUFDLElBQUksQ0FDbkMsa0JBQWtCLEVBQ2xCO2dCQUNFLE9BQU8sRUFBRSxVQUFVO2dCQUNuQixFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUU7Z0JBQ1osSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO2dCQUNoQixHQUFHLENBQUMsS0FBSyxDQUFDLElBQUk7b0JBQ1osQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUU7b0JBQ3RCLENBQUMsQ0FBQzt3QkFDRSxRQUFRLEVBQUU7NEJBQ1IsSUFBSSxFQUFFLEtBQUssQ0FBQyxRQUFROzRCQUNwQixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7NEJBQ3hCLEdBQUcsQ0FBQyxTQUFTLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzt5QkFDaEM7cUJBQ0YsQ0FBQzthQUNQLEVBQ0QsSUFBSSxFQUNKLEVBQUUsY0FBYyxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQzdDLENBQUM7WUFFRixXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFbkIsSUFBSSxVQUFVLEVBQUUsRUFBRSxDQUFDO2dCQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2YsT0FBTztZQUNULENBQUM7WUFFRCxPQUFPLENBQUMseUJBQXlCLEVBQUU7Z0JBQ2pDLFlBQVksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RDLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRTtnQkFDZixJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7Z0JBQ25CLElBQUksRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO2dCQUNuRSxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxRQUFRLElBQUk7b0JBQ2pDLFFBQVEsRUFBRSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHO2lCQUNoSSxDQUFDO2dCQUNGLE1BQU0sRUFBRSxZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztnQkFDckMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO2FBQzdDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxPQUFPLEdBQVEsRUFBRSxDQUFDO1lBQ2xCLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVuQixJQUFJLEdBQUcsWUFBWSxRQUFRLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyx3QkFBd0IsRUFBRSxDQUFDO2dCQUNyRSxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRTtvQkFDakIsSUFBSSxFQUFFLHNFQUFzRTtpQkFDN0UsQ0FBQyxDQUFDO2dCQUNILE9BQU8sQ0FBQyxLQUFLLENBQ1gsTUFBTSxDQUFDLEdBQUcsQ0FDUixVQUFVLE1BQU0sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEtBQUssQ0FBQyxFQUFFLFdBQVcsS0FBSyxDQUFDLElBQUkscUNBQXFDLENBQUMsRUFBRSxDQUN6SCxDQUNGLENBQUM7WUFDSixDQUFDO2lCQUFNLElBQ0wsR0FBRyxZQUFZLFFBQVE7Z0JBQ3ZCLEdBQUcsQ0FBQyxJQUFJLEtBQUssZ0NBQWdDLEVBQzdDLENBQUM7Z0JBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUU7b0JBQ2pCLElBQUksRUFBRSwrREFBK0Q7aUJBQ3RFLENBQUMsQ0FBQztZQUNMLENBQUM7aUJBQU0sSUFBSSxHQUFHLFlBQVksYUFBYSxFQUFFLENBQUM7Z0JBQ3hDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFO29CQUNqQixJQUFJLEVBQUUsNEZBQTRGO2lCQUNuRyxDQUFDLENBQUM7WUFDTCxDQUFDO2lCQUFNLElBQ0wsR0FBRyxZQUFZLG1CQUFtQjtnQkFDbEMsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsdUJBQXVCLENBQUMsRUFDOUMsQ0FBQztnQkFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRTtvQkFDakIsSUFBSSxFQUFFLHNEQUFzRCxLQUFLLENBQUMsSUFBSSxFQUFFO2lCQUN6RSxDQUFDLENBQUM7WUFDTCxDQUFDO2lCQUFNLElBQ0wsR0FBRyxZQUFZLG1CQUFtQjtnQkFDbEMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxFQUNuQyxDQUFDO2dCQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sR0FBRyxDQUFDO1lBQ1osQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZsYWdzIH0gZnJvbSBcIkBvY2xpZi9jb3JlXCI7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGVkQ29tbWFuZCB9IGZyb20gXCIuLi8uLi9saWIvYmFzZS1jb21tYW5kLmpzXCI7XG5pbXBvcnQge1xuICBhcGlDbGllbnQsXG4gIEFwaUVycm9yLFxuICBBdXRoZW50aWNhdGlvbkVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxufSBmcm9tIFwiLi4vLi4vbGliL2FwaS1jbGllbnQuanNcIjtcbmltcG9ydCB7XG4gIHN1Y2Nlc3MsXG4gIGVycm9yLFxuICBqc29uLFxuICBjb2xvcnMsXG4gIHNwaW5uZXIsXG4gIGlzSnNvbk1vZGUsXG4gIGZvcm1hdFN0YXR1cyxcbiAgZm9ybWF0Q3JlZGl0cyxcbn0gZnJvbSBcIi4uLy4uL2xpYi9vdXRwdXQuanNcIjtcblxuaW50ZXJmYWNlIFdoYXRzYXBwU2VuZFJlc3BvbnNlIHtcbiAgaWQ6IHN0cmluZztcbiAgY2hhbm5lbDogc3RyaW5nO1xuICBtZXNzYWdlX2Zvcm1hdDogc3RyaW5nO1xuICB0bzogc3RyaW5nO1xuICBmcm9tOiBzdHJpbmc7XG4gIHRleHQ6IHN0cmluZyB8IG51bGw7XG4gIHN0YXR1czogc3RyaW5nO1xuICBzZWdtZW50czogbnVtYmVyO1xuICBjcmVkaXRzVXNlZDogbnVtYmVyO1xuICB3aGF0c2FwcDoge1xuICAgIGtpbmQ6IHN0cmluZztcbiAgICB0ZW1wbGF0ZT86IHsgbmFtZTogc3RyaW5nOyBsYW5ndWFnZTogc3RyaW5nOyBjYXRlZ29yeTogc3RyaW5nIH07XG4gICAgbWVzc2FnZUlkOiBzdHJpbmcgfCBudWxsO1xuICB9O1xuICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKiogUGFyc2UgcmVwZWF0YWJsZSBuPXZhbHVlIHBhaXJzIGludG8gYSB0ZW1wbGF0ZS12YXJpYWJsZXMgcmVjb3JkLiAqL1xuZnVuY3Rpb24gcGFyc2VWYXJpYWJsZXMoXG4gIHJhdzogc3RyaW5nW10gfCB1bmRlZmluZWQsXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFyYXcgfHwgcmF3Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgaXRlbSBvZiByYXcpIHtcbiAgICBjb25zdCBpZHggPSBpdGVtLmluZGV4T2YoXCI9XCIpO1xuICAgIGlmIChpZHggPD0gMCkge1xuICAgICAgcmV0dXJuIGBJbnZhbGlkIC0tdmFyIFwiJHtpdGVtfVwiIOKAlCB1c2Ugbj12YWx1ZSAoZS5nLiAxPVRpbnlGYXQpYDtcbiAgICB9XG4gICAgb3V0W2l0ZW0uc2xpY2UoMCwgaWR4KS50cmltKCldID0gaXRlbS5zbGljZShpZHggKyAxKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXaGF0c2FwcFNlbmQgZXh0ZW5kcyBBdXRoZW50aWNhdGVkQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9XG4gICAgXCJTZW5kIGEgV2hhdHNBcHAgbWVzc2FnZSDigJQgZnJlZS1mb3JtIHRleHQgaW5zaWRlIHRoZSAyNC1ob3VyIHJlcGx5IHdpbmRvdywgb3IgYW4gYXBwcm92ZWQgdGVtcGxhdGUgYW55IHRpbWVcIjtcblxuICBzdGF0aWMgZXhhbXBsZXMgPSBbXG4gICAgJzwlPSBjb25maWcuYmluICU+IHdoYXRzYXBwIHNlbmQgLS10byArMTU1NTEyMzQ1NjcgLS1mcm9tICsxNTU1OTg3NjU0MyAtLXRleHQgXCJZb3VyIHRhYmxlIGlzIHJlYWR5IVwiJyxcbiAgICBcIjwlPSBjb25maWcuYmluICU+IHdoYXRzYXBwIHNlbmQgLS10byArNDQ3NzAwOTAwMTIzIC0tZnJvbSArMTU1NTk4NzY1NDMgLS10ZW1wbGF0ZSBvcmRlcl9zaGlwcGVkIC0tbGFuZ3VhZ2UgZW5fVVMgLS12YXIgMT1UaW55RmF0IC0tdmFyIDI9NDgyMVwiLFxuICAgICc8JT0gY29uZmlnLmJpbiAlPiB3aGF0c2FwcCBzZW5kIC0tdG8gKzE1NTUxMjM0NTY3IC0tZnJvbSArMTU1NTk4NzY1NDMgLS10ZXh0IFwiSGVsbG8hXCIgLS1qc29uJyxcbiAgXTtcblxuICBzdGF0aWMgZmxhZ3MgPSB7XG4gICAgLi4uQXV0aGVudGljYXRlZENvbW1hbmQuYmFzZUZsYWdzLFxuICAgIHRvOiBGbGFncy5zdHJpbmcoe1xuICAgICAgY2hhcjogXCJ0XCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJSZWNpcGllbnQgcGhvbmUgbnVtYmVyIChFLjE2NCBmb3JtYXQpXCIsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KSxcbiAgICBmcm9tOiBGbGFncy5zdHJpbmcoe1xuICAgICAgY2hhcjogXCJmXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJZb3VyIFdoYXRzQXBwLWNvbm5lY3RlZCBzZW5kZXIgbnVtYmVyIChFLjE2NCBmb3JtYXQpXCIsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KSxcbiAgICB0ZXh0OiBGbGFncy5zdHJpbmcoe1xuICAgICAgY2hhcjogXCJtXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJGcmVlLWZvcm0gbWVzc2FnZSB0ZXh0IChvbmx5IGluc2lkZSB0aGUgMjQtaG91ciByZXBseSB3aW5kb3cpXCIsXG4gICAgICBleGNsdXNpdmU6IFtcInRlbXBsYXRlXCIsIFwibGFuZ3VhZ2VcIiwgXCJ2YXJcIl0sXG4gICAgfSksXG4gICAgdGVtcGxhdGU6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJBcHByb3ZlZCB0ZW1wbGF0ZSBuYW1lIChyZWFjaGVzIGNvbnRhY3RzIGFueSB0aW1lKVwiLFxuICAgIH0pLFxuICAgIGxhbmd1YWdlOiBGbGFncy5zdHJpbmcoe1xuICAgICAgY2hhcjogXCJsXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUZW1wbGF0ZSBsYW5ndWFnZSBjb2RlIChlLmcuIGVuX1VTKTsgcmVxdWlyZWQgd2l0aCAtLXRlbXBsYXRlXCIsXG4gICAgICBkZXBlbmRzT246IFtcInRlbXBsYXRlXCJdLFxuICAgIH0pLFxuICAgIHZhcjogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlRlbXBsYXRlIHZhcmlhYmxlIGFzIG49dmFsdWUgKGUuZy4gLS12YXIgMT1UaW55RmF0KS4gUmVwZWF0YWJsZS5cIixcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgZGVwZW5kc09uOiBbXCJ0ZW1wbGF0ZVwiXSxcbiAgICB9KSxcbiAgICBcImlkZW1wb3RlbmN5LWtleVwiOiBGbGFncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiSWRlbXBvdGVuY3kga2V5ICgxLTI1NSBwcmludGFibGUgQVNDSUkgY2hhcmFjdGVycykuIFJlLXJ1bm5pbmcgd2l0aCB0aGUgc2FtZSBrZXkgd2l0aGluIDI0IGhvdXJzIHJldHVybnMgdGhlIG9yaWdpbmFsIHJlc3VsdCBpbnN0ZWFkIG9mIHNlbmRpbmcgYWdhaW4uXCIsXG4gICAgfSksXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZmxhZ3MgfSA9IGF3YWl0IHRoaXMucGFyc2UoV2hhdHNhcHBTZW5kKTtcblxuICAgIGlmICghZmxhZ3MudGV4dCAmJiAhZmxhZ3MudGVtcGxhdGUpIHtcbiAgICAgIGVycm9yKFwiUHJvdmlkZSBlaXRoZXIgLS10ZXh0IG9yIC0tdGVtcGxhdGVcIiwge1xuICAgICAgICBoaW50OiAnRnJlZS1mb3JtOiAtLXRleHQgXCJIZWxsbyFcIiDCtyBUZW1wbGF0ZTogLS10ZW1wbGF0ZSBvcmRlcl9zaGlwcGVkIC0tbGFuZ3VhZ2UgZW5fVVMnLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmV4aXQoMSk7XG4gICAgfVxuICAgIGlmIChmbGFncy50ZW1wbGF0ZSAmJiAhZmxhZ3MubGFuZ3VhZ2UpIHtcbiAgICAgIGVycm9yKFwiTWlzc2luZyAtLWxhbmd1YWdlIGZvciB0aGUgdGVtcGxhdGVcIiwge1xuICAgICAgICBoaW50OiBcIlRlbXBsYXRlcyBhcmUgcGVyLWxhbmd1YWdlIOKAlCBlLmcuIC0tbGFuZ3VhZ2UgZW5fVVNcIixcbiAgICAgIH0pO1xuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhcmlhYmxlcyA9IHBhcnNlVmFyaWFibGVzKGZsYWdzLnZhcik7XG4gICAgaWYgKHR5cGVvZiB2YXJpYWJsZXMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGVycm9yKHZhcmlhYmxlcyk7XG4gICAgICB0aGlzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VuZFNwaW5uZXIgPSBzcGlubmVyKFwiU2VuZGluZyBXaGF0c0FwcCBtZXNzYWdlLi4uXCIpO1xuICAgIGlmICghaXNKc29uTW9kZSgpKSB7XG4gICAgICBzZW5kU3Bpbm5lci5zdGFydCgpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGFwaUNsaWVudC5wb3N0PFdoYXRzYXBwU2VuZFJlc3BvbnNlPihcbiAgICAgICAgXCIvYXBpL3YxL21lc3NhZ2VzXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBjaGFubmVsOiBcIndoYXRzYXBwXCIsXG4gICAgICAgICAgdG86IGZsYWdzLnRvLFxuICAgICAgICAgIGZyb206IGZsYWdzLmZyb20sXG4gICAgICAgICAgLi4uKGZsYWdzLnRleHRcbiAgICAgICAgICAgID8geyB0ZXh0OiBmbGFncy50ZXh0IH1cbiAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBmbGFncy50ZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiBmbGFncy5sYW5ndWFnZSxcbiAgICAgICAgICAgICAgICAgIC4uLih2YXJpYWJsZXMgJiYgeyB2YXJpYWJsZXMgfSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICAgIHRydWUsXG4gICAgICAgIHsgaWRlbXBvdGVuY3lLZXk6IGZsYWdzW1wiaWRlbXBvdGVuY3kta2V5XCJdIH0sXG4gICAgICApO1xuXG4gICAgICBzZW5kU3Bpbm5lci5zdG9wKCk7XG5cbiAgICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgICAganNvbihyZXNwb25zZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc3VjY2VzcyhcIldoYXRzQXBwIG1lc3NhZ2UgcXVldWVkXCIsIHtcbiAgICAgICAgXCJNZXNzYWdlIElEXCI6IGNvbG9ycy5jb2RlKHJlc3BvbnNlLmlkKSxcbiAgICAgICAgVG86IHJlc3BvbnNlLnRvLFxuICAgICAgICBGcm9tOiByZXNwb25zZS5mcm9tLFxuICAgICAgICBLaW5kOiByZXNwb25zZS53aGF0c2FwcD8ua2luZCA/PyAoZmxhZ3MudGV4dCA/IFwidGV4dFwiIDogXCJ0ZW1wbGF0ZVwiKSxcbiAgICAgICAgLi4uKHJlc3BvbnNlLndoYXRzYXBwPy50ZW1wbGF0ZSAmJiB7XG4gICAgICAgICAgVGVtcGxhdGU6IGAke3Jlc3BvbnNlLndoYXRzYXBwLnRlbXBsYXRlLm5hbWV9ICgke3Jlc3BvbnNlLndoYXRzYXBwLnRlbXBsYXRlLmxhbmd1YWdlfSwgJHtyZXNwb25zZS53aGF0c2FwcC50ZW1wbGF0ZS5jYXRlZ29yeX0pYCxcbiAgICAgICAgfSksXG4gICAgICAgIFN0YXR1czogZm9ybWF0U3RhdHVzKHJlc3BvbnNlLnN0YXR1cyksXG4gICAgICAgIENyZWRpdHM6IGZvcm1hdENyZWRpdHMocmVzcG9uc2UuY3JlZGl0c1VzZWQpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIHNlbmRTcGlubmVyLnN0b3AoKTtcblxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEFwaUVycm9yICYmIGVyci5jb2RlID09PSBcIndoYXRzYXBwX3dpbmRvd19jbG9zZWRcIikge1xuICAgICAgICBlcnJvcihlcnIubWVzc2FnZSwge1xuICAgICAgICAgIGhpbnQ6IFwib3V0c2lkZSB0aGUgMjQtaG91ciByZXBseSB3aW5kb3cg4oCUIHNlbmQgYW4gYXBwcm92ZWQgdGVtcGxhdGUgaW5zdGVhZFwiLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBjb2xvcnMuZGltKFxuICAgICAgICAgICAgYCAgZS5nLiAke2NvbG9ycy5jb2RlKGBzZW5kbHkgd2hhdHNhcHAgc2VuZCAtLXRvICR7ZmxhZ3MudG99IC0tZnJvbSAke2ZsYWdzLmZyb219IC0tdGVtcGxhdGUgPG5hbWU+IC0tbGFuZ3VhZ2UgZW5fVVNgKX1gLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBlcnIgaW5zdGFuY2VvZiBBcGlFcnJvciAmJlxuICAgICAgICBlcnIuY29kZSA9PT0gXCJ3aGF0c2FwcF90ZW1wbGF0ZV9ub3RfYXBwcm92ZWRcIlxuICAgICAgKSB7XG4gICAgICAgIGVycm9yKGVyci5tZXNzYWdlLCB7XG4gICAgICAgICAgaGludDogXCJDaGVjayBpdHMgcmV2aWV3IHN0YXR1cyB3aXRoIGBzZW5kbHkgd2hhdHNhcHAgdGVtcGxhdGVzIGxpc3RgXCIsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChlcnIgaW5zdGFuY2VvZiBOb3RGb3VuZEVycm9yKSB7XG4gICAgICAgIGVycm9yKGVyci5tZXNzYWdlLCB7XG4gICAgICAgICAgaGludDogXCJSdW4gYHNlbmRseSB3aGF0c2FwcCB0ZW1wbGF0ZXMgbGlzdGAgdG8gc2VlIHlvdXIgdGVtcGxhdGVzIGFuZCB0aGVpciBleGFjdCBuYW1lcy9sYW5ndWFnZXNcIixcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBlcnIgaW5zdGFuY2VvZiBBdXRoZW50aWNhdGlvbkVycm9yICYmXG4gICAgICAgIGVyci5tZXNzYWdlPy5pbmNsdWRlcyhcImNvbm5lY3RlZCB0byBXaGF0c0FwcFwiKVxuICAgICAgKSB7XG4gICAgICAgIGVycm9yKGVyci5tZXNzYWdlLCB7XG4gICAgICAgICAgaGludDogYENvbm5lY3QgaXQgZmlyc3Q6IHNlbmRseSB3aGF0c2FwcCBjb25uZWN0IC0tbnVtYmVyICR7ZmxhZ3MuZnJvbX1gLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGVyciBpbnN0YW5jZW9mIEF1dGhlbnRpY2F0aW9uRXJyb3IgJiZcbiAgICAgICAgL3doYXRzYXBwL2kudGVzdChlcnIubWVzc2FnZSA/PyBcIlwiKVxuICAgICAgKSB7XG4gICAgICAgIGVycm9yKGVyci5tZXNzYWdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,10 @@
1
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
2
+ export default class WhatsappSenders extends AuthenticatedCommand {
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,74 @@
1
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
2
+ import { apiClient } from "../../lib/api-client.js";
3
+ import { json, info, table, colors, spinner, isJsonMode, formatRelativeTime, } from "../../lib/output.js";
4
+ function formatSenderStatus(status) {
5
+ switch (String(status).toLowerCase()) {
6
+ case "active":
7
+ return colors.success(status);
8
+ case "suspended":
9
+ return colors.error(status);
10
+ case "pending":
11
+ return colors.warning(status);
12
+ default:
13
+ return status;
14
+ }
15
+ }
16
+ export default class WhatsappSenders extends AuthenticatedCommand {
17
+ static description = "List the numbers connected to WhatsApp on your workspace";
18
+ static examples = [
19
+ "<%= config.bin %> whatsapp senders",
20
+ "<%= config.bin %> whatsapp senders --json",
21
+ ];
22
+ static flags = {
23
+ ...AuthenticatedCommand.baseFlags,
24
+ };
25
+ async run() {
26
+ await this.parse(WhatsappSenders);
27
+ const listSpinner = spinner("Fetching WhatsApp senders...");
28
+ if (!isJsonMode()) {
29
+ listSpinner.start();
30
+ }
31
+ const response = await apiClient
32
+ .get("/api/v1/whatsapp/senders")
33
+ .finally(() => listSpinner.stop());
34
+ if (isJsonMode()) {
35
+ json(response);
36
+ return;
37
+ }
38
+ const senders = response.senders ?? [];
39
+ if (senders.length === 0) {
40
+ info("No WhatsApp senders yet");
41
+ console.log(colors.dim(`Connect a number with: ${colors.code("sendly whatsapp connect --number +15551234567")}`));
42
+ return;
43
+ }
44
+ table(senders, [
45
+ { header: "Number", key: "phoneNumber" },
46
+ {
47
+ header: "Display name",
48
+ key: "displayName",
49
+ formatter: (v) => (v ? String(v) : colors.dim("—")),
50
+ },
51
+ {
52
+ header: "Status",
53
+ key: "status",
54
+ formatter: (v) => formatSenderStatus(String(v)),
55
+ },
56
+ {
57
+ header: "Quality",
58
+ key: "qualityRating",
59
+ formatter: (v) => (v ? String(v) : colors.dim("—")),
60
+ },
61
+ {
62
+ header: "Connected",
63
+ key: "createdAt",
64
+ formatter: (v) => formatRelativeTime(String(v)),
65
+ },
66
+ ]);
67
+ const pending = senders.filter((s) => String(s.status).toLowerCase() === "pending");
68
+ if (pending.length > 0) {
69
+ console.log();
70
+ console.log(colors.dim(`Pending senders are still connecting — someone needs to finish the Facebook sign-in. Check progress with ${colors.code("sendly whatsapp status")}.`));
71
+ }
72
+ }
73
+ }
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy93aGF0c2FwcC9zZW5kZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsSUFBSSxFQUNKLElBQUksRUFDSixLQUFLLEVBQ0wsTUFBTSxFQUNOLE9BQU8sRUFDUCxVQUFVLEVBQ1Ysa0JBQWtCLEdBQ25CLE1BQU0scUJBQXFCLENBQUM7QUFjN0IsU0FBUyxrQkFBa0IsQ0FBQyxNQUFjO0lBQ3hDLFFBQVEsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7UUFDckMsS0FBSyxRQUFRO1lBQ1gsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLEtBQUssV0FBVztZQUNkLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QixLQUFLLFNBQVM7WUFDWixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEM7WUFDRSxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxPQUFPLE9BQU8sZUFBZ0IsU0FBUSxvQkFBb0I7SUFDL0QsTUFBTSxDQUFDLFdBQVcsR0FBRywwREFBMEQsQ0FBQztJQUVoRixNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLG9DQUFvQztRQUNwQywyQ0FBMkM7S0FDNUMsQ0FBQztJQUVGLE1BQU0sQ0FBQyxLQUFLLEdBQUc7UUFDYixHQUFHLG9CQUFvQixDQUFDLFNBQVM7S0FDbEMsQ0FBQztJQUVGLEtBQUssQ0FBQyxHQUFHO1FBQ1AsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRWxDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ2xCLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN0QixDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxTQUFTO2FBQzdCLEdBQUcsQ0FBc0IsMEJBQTBCLENBQUM7YUFDcEQsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXJDLElBQUksVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDZixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ3ZDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztZQUNoQyxPQUFPLENBQUMsR0FBRyxDQUNULE1BQU0sQ0FBQyxHQUFHLENBQ1IsMEJBQTBCLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0NBQStDLENBQUMsRUFBRSxDQUN6RixDQUNGLENBQUM7WUFDRixPQUFPO1FBQ1QsQ0FBQztRQUVELEtBQUssQ0FBQyxPQUFPLEVBQUU7WUFDYixFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRTtZQUN4QztnQkFDRSxNQUFNLEVBQUUsY0FBYztnQkFDdEIsR0FBRyxFQUFFLGFBQWE7Z0JBQ2xCLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNwRDtZQUNEO2dCQUNFLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixHQUFHLEVBQUUsUUFBUTtnQkFDYixTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNoRDtZQUNEO2dCQUNFLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixHQUFHLEVBQUUsZUFBZTtnQkFDcEIsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3BEO1lBQ0Q7Z0JBQ0UsTUFBTSxFQUFFLFdBQVc7Z0JBQ25CLEdBQUcsRUFBRSxXQUFXO2dCQUNoQixTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNoRDtTQUNGLENBQUMsQ0FBQztRQUVILE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQzVCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLFNBQVMsQ0FDcEQsQ0FBQztRQUNGLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDZCxPQUFPLENBQUMsR0FBRyxDQUNULE1BQU0sQ0FBQyxHQUFHLENBQ1IsNEdBQTRHLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUNySixDQUNGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF1dGhlbnRpY2F0ZWRDb21tYW5kIH0gZnJvbSBcIi4uLy4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGFwaUNsaWVudCB9IGZyb20gXCIuLi8uLi9saWIvYXBpLWNsaWVudC5qc1wiO1xuaW1wb3J0IHtcbiAganNvbixcbiAgaW5mbyxcbiAgdGFibGUsXG4gIGNvbG9ycyxcbiAgc3Bpbm5lcixcbiAgaXNKc29uTW9kZSxcbiAgZm9ybWF0UmVsYXRpdmVUaW1lLFxufSBmcm9tIFwiLi4vLi4vbGliL291dHB1dC5qc1wiO1xuXG5pbnRlcmZhY2UgV2hhdHNhcHBTZW5kZXIge1xuICBwaG9uZU51bWJlcjogc3RyaW5nO1xuICBkaXNwbGF5TmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIHF1YWxpdHlSYXRpbmc6IHN0cmluZyB8IG51bGw7XG4gIGNyZWF0ZWRBdDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgTGlzdFNlbmRlcnNSZXNwb25zZSB7XG4gIHNlbmRlcnM6IFdoYXRzYXBwU2VuZGVyW107XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFNlbmRlclN0YXR1cyhzdGF0dXM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHN3aXRjaCAoU3RyaW5nKHN0YXR1cykudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgXCJhY3RpdmVcIjpcbiAgICAgIHJldHVybiBjb2xvcnMuc3VjY2VzcyhzdGF0dXMpO1xuICAgIGNhc2UgXCJzdXNwZW5kZWRcIjpcbiAgICAgIHJldHVybiBjb2xvcnMuZXJyb3Ioc3RhdHVzKTtcbiAgICBjYXNlIFwicGVuZGluZ1wiOlxuICAgICAgcmV0dXJuIGNvbG9ycy53YXJuaW5nKHN0YXR1cyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzdGF0dXM7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2hhdHNhcHBTZW5kZXJzIGV4dGVuZHMgQXV0aGVudGljYXRlZENvbW1hbmQge1xuICBzdGF0aWMgZGVzY3JpcHRpb24gPSBcIkxpc3QgdGhlIG51bWJlcnMgY29ubmVjdGVkIHRvIFdoYXRzQXBwIG9uIHlvdXIgd29ya3NwYWNlXCI7XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gd2hhdHNhcHAgc2VuZGVyc1wiLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gd2hhdHNhcHAgc2VuZGVycyAtLWpzb25cIixcbiAgXTtcblxuICBzdGF0aWMgZmxhZ3MgPSB7XG4gICAgLi4uQXV0aGVudGljYXRlZENvbW1hbmQuYmFzZUZsYWdzLFxuICB9O1xuXG4gIGFzeW5jIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnBhcnNlKFdoYXRzYXBwU2VuZGVycyk7XG5cbiAgICBjb25zdCBsaXN0U3Bpbm5lciA9IHNwaW5uZXIoXCJGZXRjaGluZyBXaGF0c0FwcCBzZW5kZXJzLi4uXCIpO1xuICAgIGlmICghaXNKc29uTW9kZSgpKSB7XG4gICAgICBsaXN0U3Bpbm5lci5zdGFydCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXBpQ2xpZW50XG4gICAgICAuZ2V0PExpc3RTZW5kZXJzUmVzcG9uc2U+KFwiL2FwaS92MS93aGF0c2FwcC9zZW5kZXJzXCIpXG4gICAgICAuZmluYWxseSgoKSA9PiBsaXN0U3Bpbm5lci5zdG9wKCkpO1xuXG4gICAgaWYgKGlzSnNvbk1vZGUoKSkge1xuICAgICAganNvbihyZXNwb25zZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VuZGVycyA9IHJlc3BvbnNlLnNlbmRlcnMgPz8gW107XG4gICAgaWYgKHNlbmRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBpbmZvKFwiTm8gV2hhdHNBcHAgc2VuZGVycyB5ZXRcIik7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY29sb3JzLmRpbShcbiAgICAgICAgICBgQ29ubmVjdCBhIG51bWJlciB3aXRoOiAke2NvbG9ycy5jb2RlKFwic2VuZGx5IHdoYXRzYXBwIGNvbm5lY3QgLS1udW1iZXIgKzE1NTUxMjM0NTY3XCIpfWAsXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRhYmxlKHNlbmRlcnMsIFtcbiAgICAgIHsgaGVhZGVyOiBcIk51bWJlclwiLCBrZXk6IFwicGhvbmVOdW1iZXJcIiB9LFxuICAgICAge1xuICAgICAgICBoZWFkZXI6IFwiRGlzcGxheSBuYW1lXCIsXG4gICAgICAgIGtleTogXCJkaXNwbGF5TmFtZVwiLFxuICAgICAgICBmb3JtYXR0ZXI6ICh2KSA9PiAodiA/IFN0cmluZyh2KSA6IGNvbG9ycy5kaW0oXCLigJRcIikpLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyOiBcIlN0YXR1c1wiLFxuICAgICAgICBrZXk6IFwic3RhdHVzXCIsXG4gICAgICAgIGZvcm1hdHRlcjogKHYpID0+IGZvcm1hdFNlbmRlclN0YXR1cyhTdHJpbmcodikpLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyOiBcIlF1YWxpdHlcIixcbiAgICAgICAga2V5OiBcInF1YWxpdHlSYXRpbmdcIixcbiAgICAgICAgZm9ybWF0dGVyOiAodikgPT4gKHYgPyBTdHJpbmcodikgOiBjb2xvcnMuZGltKFwi4oCUXCIpKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGhlYWRlcjogXCJDb25uZWN0ZWRcIixcbiAgICAgICAga2V5OiBcImNyZWF0ZWRBdFwiLFxuICAgICAgICBmb3JtYXR0ZXI6ICh2KSA9PiBmb3JtYXRSZWxhdGl2ZVRpbWUoU3RyaW5nKHYpKSxcbiAgICAgIH0sXG4gICAgXSk7XG5cbiAgICBjb25zdCBwZW5kaW5nID0gc2VuZGVycy5maWx0ZXIoXG4gICAgICAocykgPT4gU3RyaW5nKHMuc3RhdHVzKS50b0xvd2VyQ2FzZSgpID09PSBcInBlbmRpbmdcIixcbiAgICApO1xuICAgIGlmIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY29sb3JzLmRpbShcbiAgICAgICAgICBgUGVuZGluZyBzZW5kZXJzIGFyZSBzdGlsbCBjb25uZWN0aW5nIOKAlCBzb21lb25lIG5lZWRzIHRvIGZpbmlzaCB0aGUgRmFjZWJvb2sgc2lnbi1pbi4gQ2hlY2sgcHJvZ3Jlc3Mgd2l0aCAke2NvbG9ycy5jb2RlKFwic2VuZGx5IHdoYXRzYXBwIHN0YXR1c1wiKX0uYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,13 @@
1
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
2
+ export default class WhatsappStatus extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/lib/interfaces/parser.js").Arg<string | undefined, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
10
+ quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
11
+ };
12
+ run(): Promise<void>;
13
+ }
@@ -0,0 +1,92 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { Args } from "@oclif/core";
4
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
5
+ import { apiClient, NotFoundError } from "../../lib/api-client.js";
6
+ import { getConfigDir } from "../../lib/config.js";
7
+ import { success, error, json, colors, spinner, isJsonMode, } from "../../lib/output.js";
8
+ /** Read the signup id remembered by `sendly whatsapp connect`. */
9
+ function lastSignupId() {
10
+ try {
11
+ const raw = fs.readFileSync(path.join(getConfigDir(), "whatsapp-signup.json"), "utf8");
12
+ const parsed = JSON.parse(raw);
13
+ return parsed.id || undefined;
14
+ }
15
+ catch {
16
+ return undefined;
17
+ }
18
+ }
19
+ export default class WhatsappStatus extends AuthenticatedCommand {
20
+ static description = "Show the status of a WhatsApp connection (defaults to your most recent one)";
21
+ static examples = [
22
+ "<%= config.bin %> whatsapp status",
23
+ "<%= config.bin %> whatsapp status 3f6a1c9e-0000-0000-0000-000000000000",
24
+ "<%= config.bin %> whatsapp status --json",
25
+ ];
26
+ static args = {
27
+ id: Args.string({
28
+ description: "Signup id (from `whatsapp connect`); omit for the latest",
29
+ required: false,
30
+ }),
31
+ };
32
+ static flags = {
33
+ ...AuthenticatedCommand.baseFlags,
34
+ };
35
+ async run() {
36
+ const { args } = await this.parse(WhatsappStatus);
37
+ const id = args.id || lastSignupId();
38
+ if (!id) {
39
+ error("No WhatsApp connection found on this machine.", {
40
+ hint: "Run `sendly whatsapp connect --number <phone>` first, or pass a signup id.",
41
+ });
42
+ this.exit(1);
43
+ }
44
+ const statusSpinner = spinner("Fetching WhatsApp status...");
45
+ if (!isJsonMode()) {
46
+ statusSpinner.start();
47
+ }
48
+ let response;
49
+ try {
50
+ response = await apiClient.get(`/api/v1/whatsapp/signup/${encodeURIComponent(id)}`);
51
+ statusSpinner.stop();
52
+ }
53
+ catch (err) {
54
+ statusSpinner.stop();
55
+ if (err instanceof NotFoundError) {
56
+ error("WhatsApp connection not found.", {
57
+ hint: "Check the signup id, or start one with `sendly whatsapp connect`.",
58
+ });
59
+ this.exit(1);
60
+ }
61
+ throw err;
62
+ }
63
+ if (isJsonMode()) {
64
+ json(response);
65
+ return;
66
+ }
67
+ const statusColor = response.status === "active"
68
+ ? colors.success
69
+ : response.status === "failed" || response.status === "expired"
70
+ ? colors.error
71
+ : colors.warning;
72
+ success("WhatsApp connection status", {
73
+ "Signup ID": colors.code(response.id),
74
+ Number: response.phoneNumber,
75
+ Status: statusColor(response.status),
76
+ "Business account": response.businessAccountId ?? colors.dim("—"),
77
+ ...(response.failureReasons?.length && {
78
+ Reasons: response.failureReasons.join("; "),
79
+ }),
80
+ Updated: new Date(response.updatedAt).toLocaleString(),
81
+ });
82
+ if (response.status === "initiated" || response.status === "registering") {
83
+ console.log();
84
+ console.log(colors.dim("Still connecting. If you closed the browser, re-run `sendly whatsapp connect` to get the link again — someone needs to open it and sign in with Facebook to finish."));
85
+ }
86
+ else if (response.status === "active") {
87
+ console.log();
88
+ console.log(colors.dim(`Send with: ${colors.code(`sendly whatsapp send --from ${response.phoneNumber} --to +15551230000 --text "Hello!"`)}`));
89
+ }
90
+ }
91
+ }
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3doYXRzYXBwL3N0YXR1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekIsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbkMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxFQUNMLE9BQU8sRUFDUCxLQUFLLEVBQ0wsSUFBSSxFQUNKLE1BQU0sRUFDTixPQUFPLEVBQ1AsVUFBVSxHQUNYLE1BQU0scUJBQXFCLENBQUM7QUFXN0Isa0VBQWtFO0FBQ2xFLFNBQVMsWUFBWTtJQUNuQixJQUFJLENBQUM7UUFDSCxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLHNCQUFzQixDQUFDLEVBQ2pELE1BQU0sQ0FDUCxDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQW9CLENBQUM7UUFDbEQsT0FBTyxNQUFNLENBQUMsRUFBRSxJQUFJLFNBQVMsQ0FBQztJQUNoQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLENBQUMsT0FBTyxPQUFPLGNBQWUsU0FBUSxvQkFBb0I7SUFDOUQsTUFBTSxDQUFDLFdBQVcsR0FDaEIsNkVBQTZFLENBQUM7SUFFaEYsTUFBTSxDQUFDLFFBQVEsR0FBRztRQUNoQixtQ0FBbUM7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SyxXQUFXLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxhQUFhLEVBQUUsQ0FBQztZQUN6RSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDZCxPQUFPLENBQUMsR0FBRyxDQUNULE1BQU0sQ0FBQyxHQUFHLENBQ1IscUtBQXFLLENBQ3RLLENBQ0YsQ0FBQztRQUNKLENBQUM7YUFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDeEMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FDVCxNQUFNLENBQUMsR0FBRyxDQUNSLGNBQWMsTUFBTSxDQUFDLElBQUksQ0FBQywrQkFBK0IsUUFBUSxDQUFDLFdBQVcsb0NBQW9DLENBQUMsRUFBRSxDQUNySCxDQUNGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQXJncyB9IGZyb20gXCJAb2NsaWYvY29yZVwiO1xuaW1wb3J0IHsgQXV0aGVudGljYXRlZENvbW1hbmQgfSBmcm9tIFwiLi4vLi4vbGliL2Jhc2UtY29tbWFuZC5qc1wiO1xuaW1wb3J0IHsgYXBpQ2xpZW50LCBOb3RGb3VuZEVycm9yIH0gZnJvbSBcIi4uLy4uL2xpYi9hcGktY2xpZW50LmpzXCI7XG5pbXBvcnQgeyBnZXRDb25maWdEaXIgfSBmcm9tIFwiLi4vLi4vbGliL2NvbmZpZy5qc1wiO1xuaW1wb3J0IHtcbiAgc3VjY2VzcyxcbiAgZXJyb3IsXG4gIGpzb24sXG4gIGNvbG9ycyxcbiAgc3Bpbm5lcixcbiAgaXNKc29uTW9kZSxcbn0gZnJvbSBcIi4uLy4uL2xpYi9vdXRwdXQuanNcIjtcblxuaW50ZXJmYWNlIFNpZ251cFN0YXR1c1Jlc3BvbnNlIHtcbiAgaWQ6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIHBob25lTnVtYmVyOiBzdHJpbmc7XG4gIGJ1c2luZXNzQWNjb3VudElkOiBzdHJpbmcgfCBudWxsO1xuICBmYWlsdXJlUmVhc29uczogc3RyaW5nW10gfCBudWxsO1xuICB1cGRhdGVkQXQ6IHN0cmluZztcbn1cblxuLyoqIFJlYWQgdGhlIHNpZ251cCBpZCByZW1lbWJlcmVkIGJ5IGBzZW5kbHkgd2hhdHNhcHAgY29ubmVjdGAuICovXG5mdW5jdGlvbiBsYXN0U2lnbnVwSWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByYXcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICBwYXRoLmpvaW4oZ2V0Q29uZmlnRGlyKCksIFwid2hhdHNhcHAtc2lnbnVwLmpzb25cIiksXG4gICAgICBcInV0ZjhcIixcbiAgICApO1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KSBhcyB7IGlkPzogc3RyaW5nIH07XG4gICAgcmV0dXJuIHBhcnNlZC5pZCB8fCB1bmRlZmluZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2hhdHNhcHBTdGF0dXMgZXh0ZW5kcyBBdXRoZW50aWNhdGVkQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9XG4gICAgXCJTaG93IHRoZSBzdGF0dXMgb2YgYSBXaGF0c0FwcCBjb25uZWN0aW9uIChkZWZhdWx0cyB0byB5b3VyIG1vc3QgcmVjZW50IG9uZSlcIjtcblxuICBzdGF0aWMgZXhhbXBsZXMgPSBbXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiB3aGF0c2FwcCBzdGF0dXNcIixcbiAgICBcIjwlPSBjb25maWcuYmluICU+IHdoYXRzYXBwIHN0YXR1cyAzZjZhMWM5ZS0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIixcbiAgICBcIjwlPSBjb25maWcuYmluICU+IHdoYXRzYXBwIHN0YXR1cyAtLWpzb25cIixcbiAgXTtcblxuICBzdGF0aWMgYXJncyA9IHtcbiAgICBpZDogQXJncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246IFwiU2lnbnVwIGlkIChmcm9tIGB3aGF0c2FwcCBjb25uZWN0YCk7IG9taXQgZm9yIHRoZSBsYXRlc3RcIixcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICB9KSxcbiAgfTtcblxuICBzdGF0aWMgZmxhZ3MgPSB7XG4gICAgLi4uQXV0aGVudGljYXRlZENvbW1hbmQuYmFzZUZsYWdzLFxuICB9O1xuXG4gIGFzeW5jIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGFyZ3MgfSA9IGF3YWl0IHRoaXMucGFyc2UoV2hhdHNhcHBTdGF0dXMpO1xuXG4gICAgY29uc3QgaWQgPSBhcmdzLmlkIHx8IGxhc3RTaWdudXBJZCgpO1xuICAgIGlmICghaWQpIHtcbiAgICAgIGVycm9yKFwiTm8gV2hhdHNBcHAgY29ubmVjdGlvbiBmb3VuZCBvbiB0aGlzIG1hY2hpbmUuXCIsIHtcbiAgICAgICAgaGludDogXCJSdW4gYHNlbmRseSB3aGF0c2FwcCBjb25uZWN0IC0tbnVtYmVyIDxwaG9uZT5gIGZpcnN0LCBvciBwYXNzIGEgc2lnbnVwIGlkLlwiLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdHVzU3Bpbm5lciA9IHNwaW5uZXIoXCJGZXRjaGluZyBXaGF0c0FwcCBzdGF0dXMuLi5cIik7XG4gICAgaWYgKCFpc0pzb25Nb2RlKCkpIHtcbiAgICAgIHN0YXR1c1NwaW5uZXIuc3RhcnQoKTtcbiAgICB9XG5cbiAgICBsZXQgcmVzcG9uc2U6IFNpZ251cFN0YXR1c1Jlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IGFwaUNsaWVudC5nZXQ8U2lnbnVwU3RhdHVzUmVzcG9uc2U+KFxuICAgICAgICBgL2FwaS92MS93aGF0c2FwcC9zaWdudXAvJHtlbmNvZGVVUklDb21wb25lbnQoaWQhKX1gLFxuICAgICAgKTtcbiAgICAgIHN0YXR1c1NwaW5uZXIuc3RvcCgpO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBzdGF0dXNTcGlubmVyLnN0b3AoKTtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBOb3RGb3VuZEVycm9yKSB7XG4gICAgICAgIGVycm9yKFwiV2hhdHNBcHAgY29ubmVjdGlvbiBub3QgZm91bmQuXCIsIHtcbiAgICAgICAgICBoaW50OiBcIkNoZWNrIHRoZSBzaWdudXAgaWQsIG9yIHN0YXJ0IG9uZSB3aXRoIGBzZW5kbHkgd2hhdHNhcHAgY29ubmVjdGAuXCIsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgaWYgKGlzSnNvbk1vZGUoKSkge1xuICAgICAganNvbihyZXNwb25zZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdHVzQ29sb3IgPVxuICAgICAgcmVzcG9uc2Uuc3RhdHVzID09PSBcImFjdGl2ZVwiXG4gICAgICAgID8gY29sb3JzLnN1Y2Nlc3NcbiAgICAgICAgOiByZXNwb25zZS5zdGF0dXMgPT09IFwiZmFpbGVkXCIgfHwgcmVzcG9uc2Uuc3RhdHVzID09PSBcImV4cGlyZWRcIlxuICAgICAgICAgID8gY29sb3JzLmVycm9yXG4gICAgICAgICAgOiBjb2xvcnMud2FybmluZztcblxuICAgIHN1Y2Nlc3MoXCJXaGF0c0FwcCBjb25uZWN0aW9uIHN0YXR1c1wiLCB7XG4gICAgICBcIlNpZ251cCBJRFwiOiBjb2xvcnMuY29kZShyZXNwb25zZS5pZCksXG4gICAgICBOdW1iZXI6IHJlc3BvbnNlLnBob25lTnVtYmVyLFxuICAgICAgU3RhdHVzOiBzdGF0dXNDb2xvcihyZXNwb25zZS5zdGF0dXMpLFxuICAgICAgXCJCdXNpbmVzcyBhY2NvdW50XCI6IHJlc3BvbnNlLmJ1c2luZXNzQWNjb3VudElkID8/IGNvbG9ycy5kaW0oXCLigJRcIiksXG4gICAgICAuLi4ocmVzcG9uc2UuZmFpbHVyZVJlYXNvbnM/Lmxlbmd0aCAmJiB7XG4gICAgICAgIFJlYXNvbnM6IHJlc3BvbnNlLmZhaWx1cmVSZWFzb25zLmpvaW4oXCI7IFwiKSxcbiAgICAgIH0pLFxuICAgICAgVXBkYXRlZDogbmV3IERhdGUocmVzcG9uc2UudXBkYXRlZEF0KS50b0xvY2FsZVN0cmluZygpLFxuICAgIH0pO1xuXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gXCJpbml0aWF0ZWRcIiB8fCByZXNwb25zZS5zdGF0dXMgPT09IFwicmVnaXN0ZXJpbmdcIikge1xuICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjb2xvcnMuZGltKFxuICAgICAgICAgIFwiU3RpbGwgY29ubmVjdGluZy4gSWYgeW91IGNsb3NlZCB0aGUgYnJvd3NlciwgcmUtcnVuIGBzZW5kbHkgd2hhdHNhcHAgY29ubmVjdGAgdG8gZ2V0IHRoZSBsaW5rIGFnYWluIOKAlCBzb21lb25lIG5lZWRzIHRvIG9wZW4gaXQgYW5kIHNpZ24gaW4gd2l0aCBGYWNlYm9vayB0byBmaW5pc2guXCIsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSBcImFjdGl2ZVwiKSB7XG4gICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNvbG9ycy5kaW0oXG4gICAgICAgICAgYFNlbmQgd2l0aDogJHtjb2xvcnMuY29kZShgc2VuZGx5IHdoYXRzYXBwIHNlbmQgLS1mcm9tICR7cmVzcG9uc2UucGhvbmVOdW1iZXJ9IC0tdG8gKzE1NTUxMjMwMDAwIC0tdGV4dCBcIkhlbGxvIVwiYCl9YCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,19 @@
1
+ import { AuthenticatedCommand } from "../../../lib/base-command.js";
2
+ export default class WhatsappTemplatesCreate extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ sender: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
7
+ name: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
8
+ language: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
9
+ category: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
10
+ body: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
11
+ footer: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
12
+ header: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
13
+ button: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string[] | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
14
+ example: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string[] | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
15
+ json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
16
+ quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
17
+ };
18
+ run(): Promise<void>;
19
+ }