@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,17 @@
1
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
2
+ export default class WhatsappConnect extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ number: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
7
+ json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
8
+ quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
9
+ };
10
+ run(): Promise<void>;
11
+ /**
12
+ * Poll the signup until it goes terminal (active / failed / expired).
13
+ * Mirrors the numbers-buy hosted-action poll: a human is completing a
14
+ * browser step (the Facebook sign-in) while we wait.
15
+ */
16
+ private pollSignup;
17
+ }
@@ -0,0 +1,166 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { Flags } from "@oclif/core";
4
+ import open from "open";
5
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
6
+ import { apiClient, NotFoundError } from "../../lib/api-client.js";
7
+ import { getConfigDir } from "../../lib/config.js";
8
+ import { json, success, warn, error, colors, spinner, isJsonMode, } from "../../lib/output.js";
9
+ import { attachLoginKeypressHandler } from "../../lib/keypress.js";
10
+ const SIGNUP_POLL_INTERVAL = 5000; // 5 seconds
11
+ const SIGNUP_MAX_ATTEMPTS = 240; // ~20 minutes
12
+ function sleep(ms) {
13
+ return new Promise((resolve) => setTimeout(resolve, ms));
14
+ }
15
+ /**
16
+ * Remember the most recent signup so `sendly whatsapp status` works with no
17
+ * argument. Best effort — the id is also printed, so losing this is harmless.
18
+ */
19
+ function rememberSignup(id, phoneNumber) {
20
+ try {
21
+ fs.writeFileSync(path.join(getConfigDir(), "whatsapp-signup.json"), JSON.stringify({ id, phoneNumber, createdAt: new Date().toISOString() }), { mode: 0o600 });
22
+ }
23
+ catch {
24
+ // non-fatal
25
+ }
26
+ }
27
+ export default class WhatsappConnect extends AuthenticatedCommand {
28
+ static description = "Connect one of your numbers to WhatsApp. Prints a secure link a person must open and sign in with Facebook to finish; the command then waits until the sender is active. One-time $19 connection fee — no monthly fee.";
29
+ static examples = [
30
+ "<%= config.bin %> whatsapp connect --number +15551234567",
31
+ "<%= config.bin %> whatsapp connect --number +15551234567 --json",
32
+ ];
33
+ static flags = {
34
+ ...AuthenticatedCommand.baseFlags,
35
+ number: Flags.string({
36
+ char: "n",
37
+ description: "Number on your workspace to connect (E.164 format)",
38
+ required: true,
39
+ }),
40
+ };
41
+ async run() {
42
+ const { flags } = await this.parse(WhatsappConnect);
43
+ const startSpinner = spinner("Starting WhatsApp connection...");
44
+ if (!isJsonMode()) {
45
+ startSpinner.start();
46
+ }
47
+ let response;
48
+ try {
49
+ response = await apiClient.post("/api/v1/whatsapp/signup", { phoneNumber: flags.number });
50
+ startSpinner.stop();
51
+ }
52
+ catch (err) {
53
+ startSpinner.stop();
54
+ if (err instanceof NotFoundError && err.message === "Resource not found") {
55
+ error("WhatsApp isn't available on your workspace yet.", {
56
+ hint: "WhatsApp is rolling out gradually — contact support@sendly.live for early access.",
57
+ });
58
+ this.exit(1);
59
+ }
60
+ throw err;
61
+ }
62
+ rememberSignup(response.id, flags.number);
63
+ if (isJsonMode()) {
64
+ // Non-interactive: surface the link so the caller can hand it to a
65
+ // person, then poll with `sendly whatsapp status <id>`.
66
+ json(response);
67
+ return;
68
+ }
69
+ console.log();
70
+ console.log(colors.bold("Finish connecting on the web"));
71
+ console.log();
72
+ console.log("Open this link and sign in with Facebook to finish connecting your number to WhatsApp:");
73
+ console.log(colors.bold(colors.primary(` ${response.connectUrl}`)));
74
+ console.log();
75
+ console.log(colors.dim(`Signup id: ${response.id}`));
76
+ console.log();
77
+ try {
78
+ await open(response.connectUrl);
79
+ console.log(colors.dim("Browser opened automatically"));
80
+ }
81
+ catch {
82
+ console.log(colors.dim("Please open the URL manually"));
83
+ }
84
+ const keypressCleanup = attachLoginKeypressHandler(response.connectUrl);
85
+ console.log();
86
+ const final = await this.pollSignup(response.id);
87
+ keypressCleanup();
88
+ if (final === "timeout") {
89
+ warn("We stopped waiting. Finish the Facebook sign-in in your browser, then check `sendly whatsapp status`.");
90
+ return;
91
+ }
92
+ if (final === "gone") {
93
+ warn("This connection attempt is no longer available. Re-run `sendly whatsapp connect` to start over.");
94
+ return;
95
+ }
96
+ if (final.status === "active") {
97
+ success("WhatsApp sender connected", {
98
+ number: final.phoneNumber,
99
+ "business account": final.businessAccountId ?? "—",
100
+ });
101
+ console.log();
102
+ console.log(colors.dim(`Send with: ${colors.code(`sendly whatsapp send --from ${final.phoneNumber} --to +15551230000 --text "Hello!"`)}`));
103
+ return;
104
+ }
105
+ if (final.status === "expired") {
106
+ error("The connect link expired before signup finished.", {
107
+ hint: "Run `sendly whatsapp connect` again to get a fresh link.",
108
+ });
109
+ this.exit(1);
110
+ }
111
+ // failed
112
+ error("WhatsApp connection failed.", {
113
+ ...(final.failureReasons?.length && {
114
+ reasons: final.failureReasons.join("; "),
115
+ }),
116
+ hint: "Re-run `sendly whatsapp connect` to try again.",
117
+ });
118
+ this.exit(1);
119
+ }
120
+ /**
121
+ * Poll the signup until it goes terminal (active / failed / expired).
122
+ * Mirrors the numbers-buy hosted-action poll: a human is completing a
123
+ * browser step (the Facebook sign-in) while we wait.
124
+ */
125
+ async pollSignup(id) {
126
+ const spin = spinner("Waiting for you to finish signing in with Facebook...");
127
+ spin.start();
128
+ let attempts = 0;
129
+ while (attempts < SIGNUP_MAX_ATTEMPTS) {
130
+ await sleep(SIGNUP_POLL_INTERVAL);
131
+ attempts++;
132
+ let status;
133
+ try {
134
+ status = await apiClient.get(`/api/v1/whatsapp/signup/${encodeURIComponent(id)}`);
135
+ }
136
+ catch (err) {
137
+ if (err instanceof NotFoundError) {
138
+ spin.fail("Connection attempt no longer exists");
139
+ return "gone";
140
+ }
141
+ // Transient error — keep polling.
142
+ continue;
143
+ }
144
+ if (status.status === "registering") {
145
+ spin.text =
146
+ "Facebook sign-in complete — activating your number on WhatsApp...";
147
+ }
148
+ if (status.status === "active") {
149
+ spin.succeed("Connected");
150
+ return status;
151
+ }
152
+ if (status.status === "failed") {
153
+ spin.fail("Connection failed");
154
+ return status;
155
+ }
156
+ if (status.status === "expired") {
157
+ spin.fail("Connect link expired");
158
+ return status;
159
+ }
160
+ // initiated / registering — keep polling
161
+ }
162
+ spin.stop();
163
+ return "timeout";
164
+ }
165
+ }
166
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy93aGF0c2FwcC9jb25uZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6QixPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNwQyxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxFQUNMLElBQUksRUFDSixPQUFPLEVBRVAsSUFBSSxFQUNKLEtBQUssRUFDTCxNQUFNLEVBQ04sT0FBTyxFQUNQLFVBQVUsR0FDWCxNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBaUJuRSxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxDQUFDLFlBQVk7QUFDL0MsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUMsQ0FBQyxjQUFjO0FBRS9DLFNBQVMsS0FBSyxDQUFDLEVBQVU7SUFDdkIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLGNBQWMsQ0FBQyxFQUFVLEVBQUUsV0FBbUI7SUFDckQsSUFBSSxDQUFDO1FBQ0gsRUFBRSxDQUFDLGFBQWEsQ0FDZCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLHNCQUFzQixDQUFD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QUM7b0JBQ2pELE9BQU8sTUFBTSxDQUFDO2dCQUNoQixDQUFDO2dCQUNELGtDQUFrQztnQkFDbEMsU0FBUztZQUNYLENBQUM7WUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssYUFBYSxFQUFFLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxJQUFJO29CQUNQLG1FQUFtRSxDQUFDO1lBQ3hFLENBQUM7WUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzFCLE9BQU8sTUFBTSxDQUFDO1lBQ2hCLENBQUM7WUFDRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztnQkFDL0IsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQztZQUNELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO2dCQUNsQyxPQUFPLE1BQU0sQ0FBQztZQUNoQixDQUFDO1lBQ0QseUNBQXlDO1FBQzNDLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDWixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBGbGFncyB9IGZyb20gXCJAb2NsaWYvY29yZVwiO1xuaW1wb3J0IG9wZW4gZnJvbSBcIm9wZW5cIjtcbmltcG9ydCB7IEF1dGhlbnRpY2F0ZWRDb21tYW5kIH0gZnJvbSBcIi4uLy4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGFwaUNsaWVudCwgTm90Rm91bmRFcnJvciB9IGZyb20gXCIuLi8uLi9saWIvYXBpLWNsaWVudC5qc1wiO1xuaW1wb3J0IHsgZ2V0Q29uZmlnRGlyIH0gZnJvbSBcIi4uLy4uL2xpYi9jb25maWcuanNcIjtcbmltcG9ydCB7XG4gIGpzb24sXG4gIHN1Y2Nlc3MsXG4gIGluZm8sXG4gIHdhcm4sXG4gIGVycm9yLFxuICBjb2xvcnMsXG4gIHNwaW5uZXIsXG4gIGlzSnNvbk1vZGUsXG59IGZyb20gXCIuLi8uLi9saWIvb3V0cHV0LmpzXCI7XG5pbXBvcnQgeyBhdHRhY2hMb2dpbktleXByZXNzSGFuZGxlciB9IGZyb20gXCIuLi8uLi9saWIva2V5cHJlc3MuanNcIjtcblxuaW50ZXJmYWNlIFNpZ251cFN0YXJ0UmVzcG9uc2Uge1xuICBpZDogc3RyaW5nO1xuICBjb25uZWN0VXJsOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgU2lnbnVwU3RhdHVzUmVzcG9uc2Uge1xuICBpZDogc3RyaW5nO1xuICBzdGF0dXM6IHN0cmluZztcbiAgcGhvbmVOdW1iZXI6IHN0cmluZztcbiAgYnVzaW5lc3NBY2NvdW50SWQ6IHN0cmluZyB8IG51bGw7XG4gIGZhaWx1cmVSZWFzb25zOiBzdHJpbmdbXSB8IG51bGw7XG4gIHVwZGF0ZWRBdDogc3RyaW5nO1xufVxuXG5jb25zdCBTSUdOVVBfUE9MTF9JTlRFUlZBTCA9IDUwMDA7IC8vIDUgc2Vjb25kc1xuY29uc3QgU0lHTlVQX01BWF9BVFRFTVBUUyA9IDI0MDsgLy8gfjIwIG1pbnV0ZXNcblxuZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxuLyoqXG4gKiBSZW1lbWJlciB0aGUgbW9zdCByZWNlbnQgc2lnbnVwIHNvIGBzZW5kbHkgd2hhdHNhcHAgc3RhdHVzYCB3b3JrcyB3aXRoIG5vXG4gKiBhcmd1bWVudC4gQmVzdCBlZmZvcnQg4oCUIHRoZSBpZCBpcyBhbHNvIHByaW50ZWQsIHNvIGxvc2luZyB0aGlzIGlzIGhhcm1sZXNzLlxuICovXG5mdW5jdGlvbiByZW1lbWJlclNpZ251cChpZDogc3RyaW5nLCBwaG9uZU51bWJlcjogc3RyaW5nKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgIHBhdGguam9pbihnZXRDb25maWdEaXIoKSwgXCJ3aGF0c2FwcC1zaWdudXAuanNvblwiKSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHsgaWQsIHBob25lTnVtYmVyLCBjcmVhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KSxcbiAgICAgIHsgbW9kZTogMG82MDAgfSxcbiAgICApO1xuICB9IGNhdGNoIHtcbiAgICAvLyBub24tZmF0YWxcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXaGF0c2FwcENvbm5lY3QgZXh0ZW5kcyBBdXRoZW50aWNhdGVkQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9XG4gICAgXCJDb25uZWN0IG9uZSBvZiB5b3VyIG51bWJlcnMgdG8gV2hhdHNBcHAuIFByaW50cyBhIHNlY3VyZSBsaW5rIGEgcGVyc29uIG11c3Qgb3BlbiBhbmQgc2lnbiBpbiB3aXRoIEZhY2Vib29rIHRvIGZpbmlzaDsgdGhlIGNvbW1hbmQgdGhlbiB3YWl0cyB1bnRpbCB0aGUgc2VuZGVyIGlzIGFjdGl2ZS4gT25lLXRpbWUgJDE5IGNvbm5lY3Rpb24gZmVlIOKAlCBubyBtb250aGx5IGZlZS5cIjtcblxuICBzdGF0aWMgZXhhbXBsZXMgPSBbXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiB3aGF0c2FwcCBjb25uZWN0IC0tbnVtYmVyICsxNTU1MTIzNDU2N1wiLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gd2hhdHNhcHAgY29ubmVjdCAtLW51bWJlciArMTU1NTEyMzQ1NjcgLS1qc29uXCIsXG4gIF07XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIC4uLkF1dGhlbnRpY2F0ZWRDb21tYW5kLmJhc2VGbGFncyxcbiAgICBudW1iZXI6IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcIm5cIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIk51bWJlciBvbiB5b3VyIHdvcmtzcGFjZSB0byBjb25uZWN0IChFLjE2NCBmb3JtYXQpXCIsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KSxcbiAgfTtcblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBmbGFncyB9ID0gYXdhaXQgdGhpcy5wYXJzZShXaGF0c2FwcENvbm5lY3QpO1xuXG4gICAgY29uc3Qgc3RhcnRTcGlubmVyID0gc3Bpbm5lcihcIlN0YXJ0aW5nIFdoYXRzQXBwIGNvbm5lY3Rpb24uLi5cIik7XG4gICAgaWYgKCFpc0pzb25Nb2RlKCkpIHtcbiAgICAgIHN0YXJ0U3Bpbm5lci5zdGFydCgpO1xuICAgIH1cblxuICAgIGxldCByZXNwb25zZTogU2lnbnVwU3RhcnRSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBhcGlDbGllbnQucG9zdDxTaWdudXBTdGFydFJlc3BvbnNlPihcbiAgICAgICAgXCIvYXBpL3YxL3doYXRzYXBwL3NpZ251cFwiLFxuICAgICAgICB7IHBob25lTnVtYmVyOiBmbGFncy5udW1iZXIgfSxcbiAgICAgICk7XG4gICAgICBzdGFydFNwaW5uZXIuc3RvcCgpO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBzdGFydFNwaW5uZXIuc3RvcCgpO1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdEZvdW5kRXJyb3IgJiYgZXJyLm1lc3NhZ2UgPT09IFwiUmVzb3VyY2Ugbm90IGZvdW5kXCIpIHtcbiAgICAgICAgZXJyb3IoXCJXaGF0c0FwcCBpc24ndCBhdmFpbGFibGUgb24geW91ciB3b3Jrc3BhY2UgeWV0LlwiLCB7XG4gICAgICAgICAgaGludDogXCJXaGF0c0FwcCBpcyByb2xsaW5nIG91dCBncmFkdWFsbHkg4oCUIGNvbnRhY3Qgc3VwcG9ydEBzZW5kbHkubGl2ZSBmb3IgZWFybHkgYWNjZXNzLlwiLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIHJlbWVtYmVyU2lnbnVwKHJlc3BvbnNlLmlkLCBmbGFncy5udW1iZXIpO1xuXG4gICAgaWYgKGlzSnNvbk1vZGUoKSkge1xuICAgICAgLy8gTm9uLWludGVyYWN0aXZlOiBzdXJmYWNlIHRoZSBsaW5rIHNvIHRoZSBjYWxsZXIgY2FuIGhhbmQgaXQgdG8gYVxuICAgICAgLy8gcGVyc29uLCB0aGVuIHBvbGwgd2l0aCBgc2VuZGx5IHdoYXRzYXBwIHN0YXR1cyA8aWQ+YC5cbiAgICAgIGpzb24ocmVzcG9uc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coY29sb3JzLmJvbGQoXCJGaW5pc2ggY29ubmVjdGluZyBvbiB0aGUgd2ViXCIpKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgXCJPcGVuIHRoaXMgbGluayBhbmQgc2lnbiBpbiB3aXRoIEZhY2Vib29rIHRvIGZpbmlzaCBjb25uZWN0aW5nIHlvdXIgbnVtYmVyIHRvIFdoYXRzQXBwOlwiLFxuICAgICk7XG4gICAgY29uc29sZS5sb2coY29sb3JzLmJvbGQoY29sb3JzLnByaW1hcnkoYCAgJHtyZXNwb25zZS5jb25uZWN0VXJsfWApKSk7XG4gICAgY29uc29sZS5sb2coKTtcbiAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKGBTaWdudXAgaWQ6ICR7cmVzcG9uc2UuaWR9YCkpO1xuICAgIGNvbnNvbGUubG9nKCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgb3BlbihyZXNwb25zZS5jb25uZWN0VXJsKTtcbiAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oXCJCcm93c2VyIG9wZW5lZCBhdXRvbWF0aWNhbGx5XCIpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oXCJQbGVhc2Ugb3BlbiB0aGUgVVJMIG1hbnVhbGx5XCIpKTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXlwcmVzc0NsZWFudXAgPSBhdHRhY2hMb2dpbktleXByZXNzSGFuZGxlcihyZXNwb25zZS5jb25uZWN0VXJsKTtcbiAgICBjb25zb2xlLmxvZygpO1xuXG4gICAgY29uc3QgZmluYWwgPSBhd2FpdCB0aGlzLnBvbGxTaWdudXAocmVzcG9uc2UuaWQpO1xuICAgIGtleXByZXNzQ2xlYW51cCgpO1xuXG4gICAgaWYgKGZpbmFsID09PSBcInRpbWVvdXRcIikge1xuICAgICAgd2FybihcbiAgICAgICAgXCJXZSBzdG9wcGVkIHdhaXRpbmcuIEZpbmlzaCB0aGUgRmFjZWJvb2sgc2lnbi1pbiBpbiB5b3VyIGJyb3dzZXIsIHRoZW4gY2hlY2sgYHNlbmRseSB3aGF0c2FwcCBzdGF0dXNgLlwiLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZmluYWwgPT09IFwiZ29uZVwiKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBcIlRoaXMgY29ubmVjdGlvbiBhdHRlbXB0IGlzIG5vIGxvbmdlciBhdmFpbGFibGUuIFJlLXJ1biBgc2VuZGx5IHdoYXRzYXBwIGNvbm5lY3RgIHRvIHN0YXJ0IG92ZXIuXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmaW5hbC5zdGF0dXMgPT09IFwiYWN0aXZlXCIpIHtcbiAgICAgIHN1Y2Nlc3MoXCJXaGF0c0FwcCBzZW5kZXIgY29ubmVjdGVkXCIsIHtcbiAgICAgICAgbnVtYmVyOiBmaW5hbC5waG9uZU51bWJlcixcbiAgICAgICAgXCJidXNpbmVzcyBhY2NvdW50XCI6IGZpbmFsLmJ1c2luZXNzQWNjb3VudElkID8/IFwi4oCUXCIsXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY29sb3JzLmRpbShcbiAgICAgICAgICBgU2VuZCB3aXRoOiAke2NvbG9ycy5jb2RlKGBzZW5kbHkgd2hhdHNhcHAgc2VuZCAtLWZyb20gJHtmaW5hbC5waG9uZU51bWJlcn0gLS10byArMTU1NTEyMzAwMDAgLS10ZXh0IFwiSGVsbG8hXCJgKX1gLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZmluYWwuc3RhdHVzID09PSBcImV4cGlyZWRcIikge1xuICAgICAgZXJyb3IoXCJUaGUgY29ubmVjdCBsaW5rIGV4cGlyZWQgYmVmb3JlIHNpZ251cCBmaW5pc2hlZC5cIiwge1xuICAgICAgICBoaW50OiBcIlJ1biBgc2VuZGx5IHdoYXRzYXBwIGNvbm5lY3RgIGFnYWluIHRvIGdldCBhIGZyZXNoIGxpbmsuXCIsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBmYWlsZWRcbiAgICBlcnJvcihcIldoYXRzQXBwIGNvbm5lY3Rpb24gZmFpbGVkLlwiLCB7XG4gICAgICAuLi4oZmluYWwuZmFpbHVyZVJlYXNvbnM/Lmxlbmd0aCAmJiB7XG4gICAgICAgIHJlYXNvbnM6IGZpbmFsLmZhaWx1cmVSZWFzb25zLmpvaW4oXCI7IFwiKSxcbiAgICAgIH0pLFxuICAgICAgaGludDogXCJSZS1ydW4gYHNlbmRseSB3aGF0c2FwcCBjb25uZWN0YCB0byB0cnkgYWdhaW4uXCIsXG4gICAgfSk7XG4gICAgdGhpcy5leGl0KDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvbGwgdGhlIHNpZ251cCB1bnRpbCBpdCBnb2VzIHRlcm1pbmFsIChhY3RpdmUgLyBmYWlsZWQgLyBleHBpcmVkKS5cbiAgICogTWlycm9ycyB0aGUgbnVtYmVycy1idXkgaG9zdGVkLWFjdGlvbiBwb2xsOiBhIGh1bWFuIGlzIGNvbXBsZXRpbmcgYVxuICAgKiBicm93c2VyIHN0ZXAgKHRoZSBGYWNlYm9vayBzaWduLWluKSB3aGlsZSB3ZSB3YWl0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwb2xsU2lnbnVwKFxuICAgIGlkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8U2lnbnVwU3RhdHVzUmVzcG9uc2UgfCBcInRpbWVvdXRcIiB8IFwiZ29uZVwiPiB7XG4gICAgY29uc3Qgc3BpbiA9IHNwaW5uZXIoXCJXYWl0aW5nIGZvciB5b3UgdG8gZmluaXNoIHNpZ25pbmcgaW4gd2l0aCBGYWNlYm9vay4uLlwiKTtcbiAgICBzcGluLnN0YXJ0KCk7XG5cbiAgICBsZXQgYXR0ZW1wdHMgPSAwO1xuICAgIHdoaWxlIChhdHRlbXB0cyA8IFNJR05VUF9NQVhfQVRURU1QVFMpIHtcbiAgICAgIGF3YWl0IHNsZWVwKFNJR05VUF9QT0xMX0lOVEVSVkFMKTtcbiAgICAgIGF0dGVtcHRzKys7XG5cbiAgICAgIGxldCBzdGF0dXM6IFNpZ251cFN0YXR1c1Jlc3BvbnNlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RhdHVzID0gYXdhaXQgYXBpQ2xpZW50LmdldDxTaWdudXBTdGF0dXNSZXNwb25zZT4oXG4gICAgICAgICAgYC9hcGkvdjEvd2hhdHNhcHAvc2lnbnVwLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX1gLFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBOb3RGb3VuZEVycm9yKSB7XG4gICAgICAgICAgc3Bpbi5mYWlsKFwiQ29ubmVjdGlvbiBhdHRlbXB0IG5vIGxvbmdlciBleGlzdHNcIik7XG4gICAgICAgICAgcmV0dXJuIFwiZ29uZVwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRyYW5zaWVudCBlcnJvciDigJQga2VlcCBwb2xsaW5nLlxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXR1cy5zdGF0dXMgPT09IFwicmVnaXN0ZXJpbmdcIikge1xuICAgICAgICBzcGluLnRleHQgPVxuICAgICAgICAgIFwiRmFjZWJvb2sgc2lnbi1pbiBjb21wbGV0ZSDigJQgYWN0aXZhdGluZyB5b3VyIG51bWJlciBvbiBXaGF0c0FwcC4uLlwiO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdHVzLnN0YXR1cyA9PT0gXCJhY3RpdmVcIikge1xuICAgICAgICBzcGluLnN1Y2NlZWQoXCJDb25uZWN0ZWRcIik7XG4gICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdHVzLnN0YXR1cyA9PT0gXCJmYWlsZWRcIikge1xuICAgICAgICBzcGluLmZhaWwoXCJDb25uZWN0aW9uIGZhaWxlZFwiKTtcbiAgICAgICAgcmV0dXJuIHN0YXR1cztcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0dXMuc3RhdHVzID09PSBcImV4cGlyZWRcIikge1xuICAgICAgICBzcGluLmZhaWwoXCJDb25uZWN0IGxpbmsgZXhwaXJlZFwiKTtcbiAgICAgICAgcmV0dXJuIHN0YXR1cztcbiAgICAgIH1cbiAgICAgIC8vIGluaXRpYXRlZCAvIHJlZ2lzdGVyaW5nIOKAlCBrZWVwIHBvbGxpbmdcbiAgICB9XG5cbiAgICBzcGluLnN0b3AoKTtcbiAgICByZXR1cm4gXCJ0aW1lb3V0XCI7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,13 @@
1
+ import { AuthenticatedCommand } from "../../../lib/base-command.js";
2
+ export default class WhatsappProfileGet extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ number: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
10
+ quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
11
+ };
12
+ run(): Promise<void>;
13
+ }
@@ -0,0 +1,67 @@
1
+ import { Args } from "@oclif/core";
2
+ import { AuthenticatedCommand } from "../../../lib/base-command.js";
3
+ import { apiClient, NotFoundError } from "../../../lib/api-client.js";
4
+ import { success, error, json, colors, spinner, isJsonMode, } from "../../../lib/output.js";
5
+ export default class WhatsappProfileGet extends AuthenticatedCommand {
6
+ static description = "Show the WhatsApp business profile customers see for one of your connected numbers";
7
+ static examples = [
8
+ "<%= config.bin %> whatsapp profile get +15551234567",
9
+ "<%= config.bin %> whatsapp profile get +15551234567 --json",
10
+ ];
11
+ static args = {
12
+ number: Args.string({
13
+ description: "WhatsApp-connected sender number (E.164 format)",
14
+ required: true,
15
+ }),
16
+ };
17
+ static flags = {
18
+ ...AuthenticatedCommand.baseFlags,
19
+ };
20
+ async run() {
21
+ const { args } = await this.parse(WhatsappProfileGet);
22
+ const profileSpinner = spinner("Fetching WhatsApp profile...");
23
+ if (!isJsonMode()) {
24
+ profileSpinner.start();
25
+ }
26
+ let response;
27
+ try {
28
+ response = await apiClient.get(`/api/v1/whatsapp/senders/${encodeURIComponent(args.number)}/profile`);
29
+ profileSpinner.stop();
30
+ }
31
+ catch (err) {
32
+ profileSpinner.stop();
33
+ if (err instanceof NotFoundError &&
34
+ err.message.includes("connected to WhatsApp")) {
35
+ error(err.message, {
36
+ hint: `Connect it first: sendly whatsapp connect --number ${args.number}`,
37
+ });
38
+ this.exit(1);
39
+ }
40
+ if (err instanceof NotFoundError) {
41
+ error("WhatsApp isn't available on your workspace yet.", {
42
+ hint: "WhatsApp is rolling out gradually — contact support@sendly.live for early access.",
43
+ });
44
+ this.exit(1);
45
+ }
46
+ throw err;
47
+ }
48
+ if (isJsonMode()) {
49
+ json(response);
50
+ return;
51
+ }
52
+ success("WhatsApp sender profile", {
53
+ Number: response.phoneNumber,
54
+ "Display name": response.displayName ?? colors.dim("—"),
55
+ About: response.about ?? colors.dim("—"),
56
+ Description: response.description ?? colors.dim("—"),
57
+ Category: response.category ?? colors.dim("—"),
58
+ Email: response.email ?? colors.dim("—"),
59
+ Website: response.website ?? colors.dim("—"),
60
+ Address: response.address ?? colors.dim("—"),
61
+ Photo: response.profilePhotoUrl ?? colors.dim("—"),
62
+ });
63
+ console.log();
64
+ console.log(colors.dim(`Update it with: ${colors.code(`sendly whatsapp profile update ${response.phoneNumber} --about "..."`)}`));
65
+ }
66
+ }
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3doYXRzYXBwL3Byb2ZpbGUvZ2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbkMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RSxPQUFPLEVBQ0wsT0FBTyxFQUNQLEtBQUssRUFDTCxJQUFJLEVBQ0osTUFBTSxFQUNOLE9BQU8sRUFDUCxVQUFVLEdBQ1gsTUFBTSx3QkFBd0IsQ0FBQztBQWNoQyxNQUFNLENBQUMsT0FBTyxPQUFPLGtCQUFtQixTQUFRLG9CQUFvQjtJQUNsRSxNQUFNLENBQUMsV0FBVyxHQUNoQixvRkFBb0YsQ0FBQztJQUV2RixNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLHFEQUFxRDtRQUNyRCw0REFBNEQ7S0FDN0QsQ0FBQztJQUVGLE1BQU0sQ0FBQyxJQUFJLEdBQUc7UUFDWixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNsQixXQUFXLEVBQUUsaURBQWlEO1lBQzlELFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQztLQUNILENBQUM7SUFFRixNQUFNLENBQUMsS0FBSyxHQUFHO1FBQ2IsR0FBRyxvQkFBb0IsQ0FBQyxTQUFTO0tBQ2xDLENBQUM7SUFFRixLQUFLLENBQUMsR0FBRztRQUNQLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUV0RCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUNsQixjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekIsQ0FBQztRQUVELElBQUksUUFBK0IsQ0FBQztRQUNwQyxJQUFJLENBQUM7WUFDSCxRQUFRLEdBQUcsTUFBTSxTQUFTLENBQUMsR0FBRyxDQUM1Qiw0QkFBNEIsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQ3RFLENBQUM7WUFDRixjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDeEIsQ0FBQztRQUFDLE9BQU8sR0FBUSxFQUFFLENBQUM7WUFDbEIsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3RCLElBQ0UsR0FBRyxZQUFZLGFBQWE7Z0JBQzVCLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLEVBQzdDLENBQUM7Z0JBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUU7b0JBQ2pCLElBQUksRUFBRSxzREFBc0QsSUFBSSxDQUFDLE1BQU0sRUFBRTtpQkFDMUUsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixDQUFDO1lBQ0QsSUFBSSxHQUFHLFlBQVksYUFBYSxFQUFFLENBQUM7Z0JBQ2pDLEtBQUssQ0FBQyxpREFBaUQsRUFBRTtvQkFDdkQsSUFBSSxFQUFFLG1GQUFtRjtpQkFDMUYsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixDQUFDO1lBQ0QsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDO1FBRUQsSUFBSSxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNmLE9BQU87UUFDVCxDQUFDO1FBRUQsT0FBTyxDQUFDLHlCQUF5QixFQUFFO1lBQ2pDLE1BQU0sRUFBRSxRQUFRLENBQUMsV0FBVztZQUM1QixjQUFjLEVBQUUsUUFBUSxDQUFDLFdBQVcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUN2RCxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUN4QyxXQUFXLEVBQUUsUUFBUSxDQUFDLFdBQVcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUNwRCxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUM5QyxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUN4QyxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUM1QyxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUM1QyxLQUFLLEVBQUUsUUFBUSxDQUFDLGVBQWUsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztTQUNuRCxDQUFDLENBQUM7UUFFSCxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDZCxPQUFPLENBQUMsR0FBRyxDQUNULE1BQU0sQ0FBQyxHQUFHLENBQ1IsbUJBQW1CLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLFFBQVEsQ0FBQyxXQUFXLGdCQUFnQixDQUFDLEVBQUUsQ0FDekcsQ0FDRixDQUFDO0lBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFyZ3MgfSBmcm9tIFwiQG9jbGlmL2NvcmVcIjtcbmltcG9ydCB7IEF1dGhlbnRpY2F0ZWRDb21tYW5kIH0gZnJvbSBcIi4uLy4uLy4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGFwaUNsaWVudCwgTm90Rm91bmRFcnJvciB9IGZyb20gXCIuLi8uLi8uLi9saWIvYXBpLWNsaWVudC5qc1wiO1xuaW1wb3J0IHtcbiAgc3VjY2VzcyxcbiAgZXJyb3IsXG4gIGpzb24sXG4gIGNvbG9ycyxcbiAgc3Bpbm5lcixcbiAgaXNKc29uTW9kZSxcbn0gZnJvbSBcIi4uLy4uLy4uL2xpYi9vdXRwdXQuanNcIjtcblxuaW50ZXJmYWNlIFdoYXRzYXBwU2VuZGVyUHJvZmlsZSB7XG4gIHBob25lTnVtYmVyOiBzdHJpbmc7XG4gIGRpc3BsYXlOYW1lOiBzdHJpbmcgfCBudWxsO1xuICBwcm9maWxlUGhvdG9Vcmw6IHN0cmluZyB8IG51bGw7XG4gIGNhdGVnb3J5OiBzdHJpbmcgfCBudWxsO1xuICBhYm91dDogc3RyaW5nIHwgbnVsbDtcbiAgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gIGVtYWlsOiBzdHJpbmcgfCBudWxsO1xuICB3ZWJzaXRlOiBzdHJpbmcgfCBudWxsO1xuICBhZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXaGF0c2FwcFByb2ZpbGVHZXQgZXh0ZW5kcyBBdXRoZW50aWNhdGVkQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9XG4gICAgXCJTaG93IHRoZSBXaGF0c0FwcCBidXNpbmVzcyBwcm9maWxlIGN1c3RvbWVycyBzZWUgZm9yIG9uZSBvZiB5b3VyIGNvbm5lY3RlZCBudW1iZXJzXCI7XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gd2hhdHNhcHAgcHJvZmlsZSBnZXQgKzE1NTUxMjM0NTY3XCIsXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiB3aGF0c2FwcCBwcm9maWxlIGdldCArMTU1NTEyMzQ1NjcgLS1qc29uXCIsXG4gIF07XG5cbiAgc3RhdGljIGFyZ3MgPSB7XG4gICAgbnVtYmVyOiBBcmdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJXaGF0c0FwcC1jb25uZWN0ZWQgc2VuZGVyIG51bWJlciAoRS4xNjQgZm9ybWF0KVwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSksXG4gIH07XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIC4uLkF1dGhlbnRpY2F0ZWRDb21tYW5kLmJhc2VGbGFncyxcbiAgfTtcblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBhcmdzIH0gPSBhd2FpdCB0aGlzLnBhcnNlKFdoYXRzYXBwUHJvZmlsZUdldCk7XG5cbiAgICBjb25zdCBwcm9maWxlU3Bpbm5lciA9IHNwaW5uZXIoXCJGZXRjaGluZyBXaGF0c0FwcCBwcm9maWxlLi4uXCIpO1xuICAgIGlmICghaXNKc29uTW9kZSgpKSB7XG4gICAgICBwcm9maWxlU3Bpbm5lci5zdGFydCgpO1xuICAgIH1cblxuICAgIGxldCByZXNwb25zZTogV2hhdHNhcHBTZW5kZXJQcm9maWxlO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IGFwaUNsaWVudC5nZXQ8V2hhdHNhcHBTZW5kZXJQcm9maWxlPihcbiAgICAgICAgYC9hcGkvdjEvd2hhdHNhcHAvc2VuZGVycy8ke2VuY29kZVVSSUNvbXBvbmVudChhcmdzLm51bWJlcil9L3Byb2ZpbGVgLFxuICAgICAgKTtcbiAgICAgIHByb2ZpbGVTcGlubmVyLnN0b3AoKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgcHJvZmlsZVNwaW5uZXIuc3RvcCgpO1xuICAgICAgaWYgKFxuICAgICAgICBlcnIgaW5zdGFuY2VvZiBOb3RGb3VuZEVycm9yICYmXG4gICAgICAgIGVyci5tZXNzYWdlLmluY2x1ZGVzKFwiY29ubmVjdGVkIHRvIFdoYXRzQXBwXCIpXG4gICAgICApIHtcbiAgICAgICAgZXJyb3IoZXJyLm1lc3NhZ2UsIHtcbiAgICAgICAgICBoaW50OiBgQ29ubmVjdCBpdCBmaXJzdDogc2VuZGx5IHdoYXRzYXBwIGNvbm5lY3QgLS1udW1iZXIgJHthcmdzLm51bWJlcn1gLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgZXJyb3IoXCJXaGF0c0FwcCBpc24ndCBhdmFpbGFibGUgb24geW91ciB3b3Jrc3BhY2UgeWV0LlwiLCB7XG4gICAgICAgICAgaGludDogXCJXaGF0c0FwcCBpcyByb2xsaW5nIG91dCBncmFkdWFsbHkg4oCUIGNvbnRhY3Qgc3VwcG9ydEBzZW5kbHkubGl2ZSBmb3IgZWFybHkgYWNjZXNzLlwiLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5leGl0KDEpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgIGpzb24ocmVzcG9uc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1Y2Nlc3MoXCJXaGF0c0FwcCBzZW5kZXIgcHJvZmlsZVwiLCB7XG4gICAgICBOdW1iZXI6IHJlc3BvbnNlLnBob25lTnVtYmVyLFxuICAgICAgXCJEaXNwbGF5IG5hbWVcIjogcmVzcG9uc2UuZGlzcGxheU5hbWUgPz8gY29sb3JzLmRpbShcIuKAlFwiKSxcbiAgICAgIEFib3V0OiByZXNwb25zZS5hYm91dCA/PyBjb2xvcnMuZGltKFwi4oCUXCIpLFxuICAgICAgRGVzY3JpcHRpb246IHJlc3BvbnNlLmRlc2NyaXB0aW9uID8/IGNvbG9ycy5kaW0oXCLigJRcIiksXG4gICAgICBDYXRlZ29yeTogcmVzcG9uc2UuY2F0ZWdvcnkgPz8gY29sb3JzLmRpbShcIuKAlFwiKSxcbiAgICAgIEVtYWlsOiByZXNwb25zZS5lbWFpbCA/PyBjb2xvcnMuZGltKFwi4oCUXCIpLFxuICAgICAgV2Vic2l0ZTogcmVzcG9uc2Uud2Vic2l0ZSA/PyBjb2xvcnMuZGltKFwi4oCUXCIpLFxuICAgICAgQWRkcmVzczogcmVzcG9uc2UuYWRkcmVzcyA/PyBjb2xvcnMuZGltKFwi4oCUXCIpLFxuICAgICAgUGhvdG86IHJlc3BvbnNlLnByb2ZpbGVQaG90b1VybCA/PyBjb2xvcnMuZGltKFwi4oCUXCIpLFxuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGNvbG9ycy5kaW0oXG4gICAgICAgIGBVcGRhdGUgaXQgd2l0aDogJHtjb2xvcnMuY29kZShgc2VuZGx5IHdoYXRzYXBwIHByb2ZpbGUgdXBkYXRlICR7cmVzcG9uc2UucGhvbmVOdW1iZXJ9IC0tYWJvdXQgXCIuLi5cImApfWAsXG4gICAgICApLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,20 @@
1
+ import { AuthenticatedCommand } from "../../../lib/base-command.js";
2
+ export default class WhatsappProfileUpdate extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ number: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ "display-name": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
10
+ about: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
11
+ description: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
12
+ category: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
13
+ email: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
14
+ website: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
15
+ address: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
16
+ json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
17
+ quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
18
+ };
19
+ run(): Promise<void>;
20
+ }
@@ -0,0 +1,109 @@
1
+ import { Args, Flags } from "@oclif/core";
2
+ import { AuthenticatedCommand } from "../../../lib/base-command.js";
3
+ import { apiClient, NotFoundError } from "../../../lib/api-client.js";
4
+ import { success, error, json, colors, spinner, isJsonMode, } from "../../../lib/output.js";
5
+ export default class WhatsappProfileUpdate extends AuthenticatedCommand {
6
+ static description = "Update the WhatsApp business profile customers see for one of your connected numbers";
7
+ static examples = [
8
+ '<%= config.bin %> whatsapp profile update +15551234567 --about "Family-run bakery in Austin"',
9
+ '<%= config.bin %> whatsapp profile update +15551234567 --website https://example.com --email hello@example.com',
10
+ ];
11
+ static args = {
12
+ number: Args.string({
13
+ description: "WhatsApp-connected sender number (E.164 format)",
14
+ required: true,
15
+ }),
16
+ };
17
+ static flags = {
18
+ ...AuthenticatedCommand.baseFlags,
19
+ "display-name": Flags.string({
20
+ description: "Business name shown to customers",
21
+ }),
22
+ about: Flags.string({
23
+ description: "Short about line (max 139 characters)",
24
+ }),
25
+ description: Flags.string({
26
+ description: "Longer business description (max 512 characters)",
27
+ }),
28
+ category: Flags.string({
29
+ description: "Business category",
30
+ }),
31
+ email: Flags.string({
32
+ description: "Contact email shown on the profile",
33
+ }),
34
+ website: Flags.string({
35
+ description: "Website URL shown on the profile",
36
+ }),
37
+ address: Flags.string({
38
+ description: "Business address shown on the profile",
39
+ }),
40
+ };
41
+ async run() {
42
+ const { args, flags } = await this.parse(WhatsappProfileUpdate);
43
+ if (flags["display-name"] === undefined &&
44
+ flags.about === undefined &&
45
+ flags.description === undefined &&
46
+ flags.category === undefined &&
47
+ flags.email === undefined &&
48
+ flags.website === undefined &&
49
+ flags.address === undefined) {
50
+ error("Nothing to update", {
51
+ hint: "Pass at least one of --display-name, --about, --description, --category, --email, --website, --address",
52
+ });
53
+ this.exit(1);
54
+ }
55
+ const updateSpinner = spinner("Updating WhatsApp profile...");
56
+ if (!isJsonMode()) {
57
+ updateSpinner.start();
58
+ }
59
+ try {
60
+ const response = await apiClient.patch(`/api/v1/whatsapp/senders/${encodeURIComponent(args.number)}/profile`, {
61
+ ...(flags["display-name"] !== undefined && {
62
+ displayName: flags["display-name"],
63
+ }),
64
+ ...(flags.about !== undefined && { about: flags.about }),
65
+ ...(flags.description !== undefined && {
66
+ description: flags.description,
67
+ }),
68
+ ...(flags.category !== undefined && { category: flags.category }),
69
+ ...(flags.email !== undefined && { email: flags.email }),
70
+ ...(flags.website !== undefined && { website: flags.website }),
71
+ ...(flags.address !== undefined && { address: flags.address }),
72
+ });
73
+ updateSpinner.stop();
74
+ if (isJsonMode()) {
75
+ json(response);
76
+ return;
77
+ }
78
+ success("WhatsApp sender profile updated", {
79
+ Number: response.phoneNumber,
80
+ "Display name": response.displayName ?? colors.dim("—"),
81
+ About: response.about ?? colors.dim("—"),
82
+ Description: response.description ?? colors.dim("—"),
83
+ Category: response.category ?? colors.dim("—"),
84
+ Email: response.email ?? colors.dim("—"),
85
+ Website: response.website ?? colors.dim("—"),
86
+ Address: response.address ?? colors.dim("—"),
87
+ });
88
+ }
89
+ catch (err) {
90
+ updateSpinner.stop();
91
+ if (err instanceof NotFoundError &&
92
+ err.message.includes("connected to WhatsApp")) {
93
+ error(err.message, {
94
+ hint: `Connect it first: sendly whatsapp connect --number ${args.number}`,
95
+ });
96
+ }
97
+ else if (err instanceof NotFoundError) {
98
+ error("WhatsApp isn't available on your workspace yet.", {
99
+ hint: "WhatsApp is rolling out gradually — contact support@sendly.live for early access.",
100
+ });
101
+ }
102
+ else {
103
+ throw err;
104
+ }
105
+ this.exit(1);
106
+ }
107
+ }
108
+ }
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3doYXRzYXBwL3Byb2ZpbGUvdXBkYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEUsT0FBTyxFQUNMLE9BQU8sRUFDUCxLQUFLLEVBQ0wsSUFBSSxFQUNKLE1BQU0sRUFDTixPQUFPLEVBQ1AsVUFBVSxHQUNYLE1BQU0sd0JBQXdCLENBQUM7QUFjaEMsTUFBTSxDQUFDLE9BQU8sT0FBTyxxQkFBc0IsU0FBUSxvQkFBb0I7SUFDckUsTUFBTSxDQUFDLFdBQVcsR0FDaEIsc0ZBQXNGLENBQUM7SUFFekYsTUFBTSxDQUFDLFFBQVEsR0FBRztRQUNoQiw4RkFBOEY7UUFDOUYsZ0hBQWdIO0tBQ2pILENBQUM7SUFFRixNQUFNLENBQUMsSUFBSSxHQUFHO1FBQ1osTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDbEIsV0FBVyxFQUFFLGlEQUFpRDtZQUM5RCxRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUM7S0FDSCxDQUFDO0lBRUYsTUFBTSxDQUFDLEtBQUssR0FBRztRQUNiLEdBQUcsb0JBQW9CLENBQUMsU0FBUztRQUNqQyxjQUFjLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUMzQixXQUFXLEVBQUUsa0NBQWtDO1NBQ2hELENBQUM7UUFDRixLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNsQixXQUFXLEVBQUUsdUNBQXVDO1NBQ3JELENBQUM7UUFDRixXQUFXLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUN4QixXQUFXLEVBQUUsa0RBQWtEO1NB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QUM7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcmdzLCBGbGFncyB9IGZyb20gXCJAb2NsaWYvY29yZVwiO1xuaW1wb3J0IHsgQXV0aGVudGljYXRlZENvbW1hbmQgfSBmcm9tIFwiLi4vLi4vLi4vbGliL2Jhc2UtY29tbWFuZC5qc1wiO1xuaW1wb3J0IHsgYXBpQ2xpZW50LCBOb3RGb3VuZEVycm9yIH0gZnJvbSBcIi4uLy4uLy4uL2xpYi9hcGktY2xpZW50LmpzXCI7XG5pbXBvcnQge1xuICBzdWNjZXNzLFxuICBlcnJvcixcbiAganNvbixcbiAgY29sb3JzLFxuICBzcGlubmVyLFxuICBpc0pzb25Nb2RlLFxufSBmcm9tIFwiLi4vLi4vLi4vbGliL291dHB1dC5qc1wiO1xuXG5pbnRlcmZhY2UgV2hhdHNhcHBTZW5kZXJQcm9maWxlIHtcbiAgcGhvbmVOdW1iZXI6IHN0cmluZztcbiAgZGlzcGxheU5hbWU6IHN0cmluZyB8IG51bGw7XG4gIHByb2ZpbGVQaG90b1VybDogc3RyaW5nIHwgbnVsbDtcbiAgY2F0ZWdvcnk6IHN0cmluZyB8IG51bGw7XG4gIGFib3V0OiBzdHJpbmcgfCBudWxsO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgZW1haWw6IHN0cmluZyB8IG51bGw7XG4gIHdlYnNpdGU6IHN0cmluZyB8IG51bGw7XG4gIGFkZHJlc3M6IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdoYXRzYXBwUHJvZmlsZVVwZGF0ZSBleHRlbmRzIEF1dGhlbnRpY2F0ZWRDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID1cbiAgICBcIlVwZGF0ZSB0aGUgV2hhdHNBcHAgYnVzaW5lc3MgcHJvZmlsZSBjdXN0b21lcnMgc2VlIGZvciBvbmUgb2YgeW91ciBjb25uZWN0ZWQgbnVtYmVyc1wiO1xuXG4gIHN0YXRpYyBleGFtcGxlcyA9IFtcbiAgICAnPCU9IGNvbmZpZy5iaW4gJT4gd2hhdHNhcHAgcHJvZmlsZSB1cGRhdGUgKzE1NTUxMjM0NTY3IC0tYWJvdXQgXCJGYW1pbHktcnVuIGJha2VyeSBpbiBBdXN0aW5cIicsXG4gICAgJzwlPSBjb25maWcuYmluICU+IHdoYXRzYXBwIHByb2ZpbGUgdXBkYXRlICsxNTU1MTIzNDU2NyAtLXdlYnNpdGUgaHR0cHM6Ly9leGFtcGxlLmNvbSAtLWVtYWlsIGhlbGxvQGV4YW1wbGUuY29tJyxcbiAgXTtcblxuICBzdGF0aWMgYXJncyA9IHtcbiAgICBudW1iZXI6IEFyZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIldoYXRzQXBwLWNvbm5lY3RlZCBzZW5kZXIgbnVtYmVyIChFLjE2NCBmb3JtYXQpXCIsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KSxcbiAgfTtcblxuICBzdGF0aWMgZmxhZ3MgPSB7XG4gICAgLi4uQXV0aGVudGljYXRlZENvbW1hbmQuYmFzZUZsYWdzLFxuICAgIFwiZGlzcGxheS1uYW1lXCI6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJCdXNpbmVzcyBuYW1lIHNob3duIHRvIGN1c3RvbWVyc1wiLFxuICAgIH0pLFxuICAgIGFib3V0OiBGbGFncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246IFwiU2hvcnQgYWJvdXQgbGluZSAobWF4IDEzOSBjaGFyYWN0ZXJzKVwiLFxuICAgIH0pLFxuICAgIGRlc2NyaXB0aW9uOiBGbGFncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246IFwiTG9uZ2VyIGJ1c2luZXNzIGRlc2NyaXB0aW9uIChtYXggNTEyIGNoYXJhY3RlcnMpXCIsXG4gICAgfSksXG4gICAgY2F0ZWdvcnk6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJCdXNpbmVzcyBjYXRlZ29yeVwiLFxuICAgIH0pLFxuICAgIGVtYWlsOiBGbGFncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246IFwiQ29udGFjdCBlbWFpbCBzaG93biBvbiB0aGUgcHJvZmlsZVwiLFxuICAgIH0pLFxuICAgIHdlYnNpdGU6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJXZWJzaXRlIFVSTCBzaG93biBvbiB0aGUgcHJvZmlsZVwiLFxuICAgIH0pLFxuICAgIGFkZHJlc3M6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJCdXNpbmVzcyBhZGRyZXNzIHNob3duIG9uIHRoZSBwcm9maWxlXCIsXG4gICAgfSksXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgYXJncywgZmxhZ3MgfSA9IGF3YWl0IHRoaXMucGFyc2UoV2hhdHNhcHBQcm9maWxlVXBkYXRlKTtcblxuICAgIGlmIChcbiAgICAgIGZsYWdzW1wiZGlzcGxheS1uYW1lXCJdID09PSB1bmRlZmluZWQgJiZcbiAgICAgIGZsYWdzLmFib3V0ID09PSB1bmRlZmluZWQgJiZcbiAgICAgIGZsYWdzLmRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQgJiZcbiAgICAgIGZsYWdzLmNhdGVnb3J5ID09PSB1bmRlZmluZWQgJiZcbiAgICAgIGZsYWdzLmVtYWlsID09PSB1bmRlZmluZWQgJiZcbiAgICAgIGZsYWdzLndlYnNpdGUgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgZmxhZ3MuYWRkcmVzcyA9PT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBlcnJvcihcIk5vdGhpbmcgdG8gdXBkYXRlXCIsIHtcbiAgICAgICAgaGludDogXCJQYXNzIGF0IGxlYXN0IG9uZSBvZiAtLWRpc3BsYXktbmFtZSwgLS1hYm91dCwgLS1kZXNjcmlwdGlvbiwgLS1jYXRlZ29yeSwgLS1lbWFpbCwgLS13ZWJzaXRlLCAtLWFkZHJlc3NcIixcbiAgICAgIH0pO1xuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZVNwaW5uZXIgPSBzcGlubmVyKFwiVXBkYXRpbmcgV2hhdHNBcHAgcHJvZmlsZS4uLlwiKTtcbiAgICBpZiAoIWlzSnNvbk1vZGUoKSkge1xuICAgICAgdXBkYXRlU3Bpbm5lci5zdGFydCgpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGFwaUNsaWVudC5wYXRjaDxXaGF0c2FwcFNlbmRlclByb2ZpbGU+KFxuICAgICAgICBgL2FwaS92MS93aGF0c2FwcC9zZW5kZXJzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3MubnVtYmVyKX0vcHJvZmlsZWAsXG4gICAgICAgIHtcbiAgICAgICAgICAuLi4oZmxhZ3NbXCJkaXNwbGF5LW5hbWVcIl0gIT09IHVuZGVmaW5lZCAmJiB7XG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogZmxhZ3NbXCJkaXNwbGF5LW5hbWVcIl0sXG4gICAgICAgICAgfSksXG4gICAgICAgICAgLi4uKGZsYWdzLmFib3V0ICE9PSB1bmRlZmluZWQgJiYgeyBhYm91dDogZmxhZ3MuYWJvdXQgfSksXG4gICAgICAgICAgLi4uKGZsYWdzLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IGZsYWdzLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIC4uLihmbGFncy5jYXRlZ29yeSAhPT0gdW5kZWZpbmVkICYmIHsgY2F0ZWdvcnk6IGZsYWdzLmNhdGVnb3J5IH0pLFxuICAgICAgICAgIC4uLihmbGFncy5lbWFpbCAhPT0gdW5kZWZpbmVkICYmIHsgZW1haWw6IGZsYWdzLmVtYWlsIH0pLFxuICAgICAgICAgIC4uLihmbGFncy53ZWJzaXRlICE9PSB1bmRlZmluZWQgJiYgeyB3ZWJzaXRlOiBmbGFncy53ZWJzaXRlIH0pLFxuICAgICAgICAgIC4uLihmbGFncy5hZGRyZXNzICE9PSB1bmRlZmluZWQgJiYgeyBhZGRyZXNzOiBmbGFncy5hZGRyZXNzIH0pLFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgdXBkYXRlU3Bpbm5lci5zdG9wKCk7XG5cbiAgICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgICAganNvbihyZXNwb25zZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc3VjY2VzcyhcIldoYXRzQXBwIHNlbmRlciBwcm9maWxlIHVwZGF0ZWRcIiwge1xuICAgICAgICBOdW1iZXI6IHJlc3BvbnNlLnBob25lTnVtYmVyLFxuICAgICAgICBcIkRpc3BsYXkgbmFtZVwiOiByZXNwb25zZS5kaXNwbGF5TmFtZSA/PyBjb2xvcnMuZGltKFwi4oCUXCIpLFxuICAgICAgICBBYm91dDogcmVzcG9uc2UuYWJvdXQgPz8gY29sb3JzLmRpbShcIuKAlFwiKSxcbiAgICAgICAgRGVzY3JpcHRpb246IHJlc3BvbnNlLmRlc2NyaXB0aW9uID8/IGNvbG9ycy5kaW0oXCLigJRcIiksXG4gICAgICAgIENhdGVnb3J5OiByZXNwb25zZS5jYXRlZ29yeSA/PyBjb2xvcnMuZGltKFwi4oCUXCIpLFxuICAgICAgICBFbWFpbDogcmVzcG9uc2UuZW1haWwgPz8gY29sb3JzLmRpbShcIuKAlFwiKSxcbiAgICAgICAgV2Vic2l0ZTogcmVzcG9uc2Uud2Vic2l0ZSA/PyBjb2xvcnMuZGltKFwi4oCUXCIpLFxuICAgICAgICBBZGRyZXNzOiByZXNwb25zZS5hZGRyZXNzID8/IGNvbG9ycy5kaW0oXCLigJRcIiksXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgdXBkYXRlU3Bpbm5lci5zdG9wKCk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgZXJyIGluc3RhbmNlb2YgTm90Rm91bmRFcnJvciAmJlxuICAgICAgICBlcnIubWVzc2FnZS5pbmNsdWRlcyhcImNvbm5lY3RlZCB0byBXaGF0c0FwcFwiKVxuICAgICAgKSB7XG4gICAgICAgIGVycm9yKGVyci5tZXNzYWdlLCB7XG4gICAgICAgICAgaGludDogYENvbm5lY3QgaXQgZmlyc3Q6IHNlbmRseSB3aGF0c2FwcCBjb25uZWN0IC0tbnVtYmVyICR7YXJncy5udW1iZXJ9YCxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGVyciBpbnN0YW5jZW9mIE5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgZXJyb3IoXCJXaGF0c0FwcCBpc24ndCBhdmFpbGFibGUgb24geW91ciB3b3Jrc3BhY2UgeWV0LlwiLCB7XG4gICAgICAgICAgaGludDogXCJXaGF0c0FwcCBpcyByb2xsaW5nIG91dCBncmFkdWFsbHkg4oCUIGNvbnRhY3Qgc3VwcG9ydEBzZW5kbHkubGl2ZSBmb3IgZWFybHkgYWNjZXNzLlwiLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,17 @@
1
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
2
+ export default class WhatsappSend extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ to: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
7
+ from: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, 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
+ template: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
10
+ language: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
11
+ var: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string[] | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
12
+ "idempotency-key": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
13
+ json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
14
+ quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
15
+ };
16
+ run(): Promise<void>;
17
+ }