@sendly/cli 3.35.0 → 3.37.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 (71) hide show
  1. package/README.md +204 -1
  2. package/dist/commands/10dlc/assignments/list.d.ts +10 -0
  3. package/dist/commands/10dlc/assignments/list.js +67 -0
  4. package/dist/commands/10dlc/brands/create.d.ts +25 -0
  5. package/dist/commands/10dlc/brands/create.js +89 -0
  6. package/dist/commands/10dlc/brands/get.d.ts +13 -0
  7. package/dist/commands/10dlc/brands/get.js +63 -0
  8. package/dist/commands/10dlc/brands/list.d.ts +10 -0
  9. package/dist/commands/10dlc/brands/list.js +63 -0
  10. package/dist/commands/10dlc/campaigns/assign.d.ts +14 -0
  11. package/dist/commands/10dlc/campaigns/assign.js +64 -0
  12. package/dist/commands/10dlc/campaigns/create.d.ts +24 -0
  13. package/dist/commands/10dlc/campaigns/create.js +118 -0
  14. package/dist/commands/10dlc/campaigns/get.d.ts +13 -0
  15. package/dist/commands/10dlc/campaigns/get.js +84 -0
  16. package/dist/commands/10dlc/campaigns/list.d.ts +10 -0
  17. package/dist/commands/10dlc/campaigns/list.js +70 -0
  18. package/dist/commands/10dlc/qualify.d.ts +14 -0
  19. package/dist/commands/10dlc/qualify.js +56 -0
  20. package/dist/commands/business-upgrade/cancel.d.ts +12 -0
  21. package/dist/commands/business-upgrade/cancel.js +47 -0
  22. package/dist/commands/business-upgrade/disposition.d.ts +13 -0
  23. package/dist/commands/business-upgrade/disposition.js +44 -0
  24. package/dist/commands/business-upgrade/preflight.d.ts +16 -0
  25. package/dist/commands/business-upgrade/preflight.js +82 -0
  26. package/dist/commands/business-upgrade/resubmit.d.ts +24 -0
  27. package/dist/commands/business-upgrade/resubmit.js +109 -0
  28. package/dist/commands/business-upgrade/start.d.ts +38 -0
  29. package/dist/commands/business-upgrade/start.js +142 -0
  30. package/dist/commands/business-upgrade/status.d.ts +11 -0
  31. package/dist/commands/business-upgrade/status.js +38 -0
  32. package/dist/commands/enterprise/verification/get.d.ts +13 -0
  33. package/dist/commands/enterprise/verification/get.js +78 -0
  34. package/dist/commands/enterprise/verification/resubmit.d.ts +41 -0
  35. package/dist/commands/enterprise/verification/resubmit.js +87 -0
  36. package/dist/commands/enterprise/verification/submit.d.ts +77 -0
  37. package/dist/commands/enterprise/verification/submit.js +212 -0
  38. package/dist/commands/keys/rotate.js +7 -12
  39. package/dist/commands/links/create.d.ts +24 -0
  40. package/dist/commands/links/create.js +71 -0
  41. package/dist/commands/links/disable.d.ts +21 -0
  42. package/dist/commands/links/disable.js +55 -0
  43. package/dist/commands/links/list.d.ts +19 -0
  44. package/dist/commands/links/list.js +85 -0
  45. package/dist/commands/numbers/buy.d.ts +31 -0
  46. package/dist/commands/numbers/buy.js +266 -0
  47. package/dist/commands/numbers/get.d.ts +20 -0
  48. package/dist/commands/numbers/get.js +52 -0
  49. package/dist/commands/numbers/list.d.ts +10 -0
  50. package/dist/commands/numbers/list.js +70 -0
  51. package/dist/commands/numbers/release.d.ts +23 -0
  52. package/dist/commands/numbers/release.js +67 -0
  53. package/dist/commands/numbers/search.d.ts +13 -0
  54. package/dist/commands/numbers/search.js +78 -0
  55. package/dist/commands/numbers/update.d.ts +25 -0
  56. package/dist/commands/numbers/update.js +70 -0
  57. package/dist/commands/sms/group.d.ts +25 -0
  58. package/dist/commands/sms/group.js +164 -0
  59. package/dist/commands/sms/upload-media.d.ts +1 -1
  60. package/dist/commands/sms/upload-media.js +4 -4
  61. package/dist/commands/templates/enhance.js +3 -3
  62. package/dist/commands/upgrade.d.ts +1 -16
  63. package/dist/commands/upgrade.js +131 -38
  64. package/dist/lib/auth.js +2 -94
  65. package/dist/lib/config.js +31 -2
  66. package/dist/lib/detect-install-path.d.ts +11 -7
  67. package/dist/lib/detect-install-path.js +25 -9
  68. package/dist/lib/keypress.d.ts +26 -0
  69. package/dist/lib/keypress.js +103 -0
  70. package/oclif.manifest.json +5005 -2698
  71. package/package.json +22 -1
package/README.md CHANGED
@@ -85,7 +85,10 @@ sendly logout
85
85
  ```bash
86
86
  sendly sms send --to "+15551234567" --text "Hello!"
87
87
 
88
- # With sender ID (international)
88
+ # Send from a number you own (E.164) — see Numbers Commands below
89
+ sendly sms send --to "+15551234567" --text "Hello!" --from "+447111111111"
90
+
91
+ # Or an alphanumeric sender ID (international)
89
92
  sendly sms send --to "+447700900000" --text "Hello!" --from "MyBrand"
90
93
  ```
91
94
 
@@ -129,6 +132,23 @@ sendly sms batch --file messages.json --dry-run
129
132
  # - Credit balance check
130
133
  ```
131
134
 
135
+ #### Send a Group MMS
136
+
137
+ Send to 2-8 recipients (US & Canada only) in a single group thread — everyone
138
+ sees the group and replies fan out to all participants. Group messaging is an
139
+ A2P 10DLC capability, so the sending number must be an MMS-enabled,
140
+ 10DLC-registered number you own (omit `--from` to use your default sender).
141
+
142
+ ```bash
143
+ sendly sms group --to "+14155551234,+14155555678" --text "Team sync at noon?"
144
+
145
+ # Attach media
146
+ sendly sms group --to "+14155551234,+14155555678" --media-url https://example.com/flyer.jpg
147
+
148
+ # Marketing (applies quiet-hours rules; group MMS defaults to transactional)
149
+ sendly sms group --to "+14155551234,+14155555678" --text "Sale!" --type marketing
150
+ ```
151
+
132
152
  #### Schedule a Message
133
153
 
134
154
  ```bash
@@ -147,6 +167,138 @@ sendly sms scheduled
147
167
  sendly sms cancel sched_abc123
148
168
  ```
149
169
 
170
+ ### Numbers Commands
171
+
172
+ Buy international phone numbers and send from them. (US & Canada use toll-free
173
+ verification instead — they can't be bought.)
174
+
175
+ #### Search Available Numbers
176
+
177
+ ```bash
178
+ sendly numbers search --country GB --type mobile
179
+ ```
180
+
181
+ #### Buy a Number
182
+
183
+ ```bash
184
+ sendly numbers buy --country GB --type mobile
185
+ ```
186
+
187
+ The buy is asynchronous: the number starts as `provisioning` and becomes
188
+ `active` once the carrier confirms it. Some countries need documents or
189
+ business details first — you'll get a hosted link to complete them. See
190
+ [How to buy a number](https://sendly.live/docs/how-to/buy-a-number).
191
+
192
+ #### List Your Numbers
193
+
194
+ ```bash
195
+ sendly numbers list
196
+ ```
197
+
198
+ Pass the `phoneNumber` of any `active` number as `--from` on a send to send
199
+ from it (see [Send from a number you own](https://sendly.live/docs/how-to/send-from-owned-number)):
200
+
201
+ ```bash
202
+ sendly sms send --to "+15551234567" --text "Hi!" --from "+447111111111"
203
+ ```
204
+
205
+ #### Show a Number
206
+
207
+ ```bash
208
+ sendly numbers get num_abc123
209
+ ```
210
+
211
+ Includes whether it's your workspace default sender and any scheduled release.
212
+
213
+ #### Update a Number
214
+
215
+ Make a number your default sender, or cancel a scheduled release. At least one
216
+ of `--default` / `--keep` is required:
217
+
218
+ ```bash
219
+ # Make this number the workspace default sender (must be active)
220
+ sendly numbers update num_abc123 --default
221
+
222
+ # Cancel a scheduled release and keep the number
223
+ sendly numbers update num_abc123 --keep
224
+ ```
225
+
226
+ #### Release a Number
227
+
228
+ ```bash
229
+ sendly numbers release num_abc123
230
+ ```
231
+
232
+ Paid purchases are scheduled to release at the end of the billing period (undo
233
+ with `sendly numbers update <id> --keep`); everything else releases immediately.
234
+ Add `--yes` to skip the confirmation prompt.
235
+
236
+ ### 10DLC Commands
237
+
238
+ Register your brand and messaging campaigns for carrier review so you can
239
+ send from US local (10-digit) numbers. The flow is brand → qualify →
240
+ campaign → assign number. Requires a live API key.
241
+
242
+ #### Register a Brand
243
+
244
+ ```bash
245
+ sendly 10dlc brands create --legal-name "Acme Inc" --ein "12-3456789" --website https://acme.com
246
+ ```
247
+
248
+ #### Check Brand Status
249
+
250
+ Carrier review starts as `pending` and becomes `verified` (or `failed`).
251
+ Running `get` refreshes the status:
252
+
253
+ ```bash
254
+ sendly 10dlc brands list
255
+ sendly 10dlc brands get <brandId>
256
+ ```
257
+
258
+ #### Qualify a Use Case
259
+
260
+ Pre-check that a use case is accepted for your brand before creating a
261
+ campaign:
262
+
263
+ ```bash
264
+ sendly 10dlc qualify <brandId> MIXED
265
+ ```
266
+
267
+ #### Create a Campaign
268
+
269
+ Once the brand is `verified`:
270
+
271
+ ```bash
272
+ sendly 10dlc campaigns create \
273
+ --brand <brandId> \
274
+ --use-case MIXED \
275
+ --description "Order updates and promotions" \
276
+ --message-flow "Customers opt in at checkout" \
277
+ --sample "Your order has shipped!" \
278
+ --sample "20% off this weekend"
279
+ ```
280
+
281
+ Poll until the campaign is `active`:
282
+
283
+ ```bash
284
+ sendly 10dlc campaigns get <campaignId>
285
+ ```
286
+
287
+ #### Assign a Number
288
+
289
+ Attach a US local number you own to the active campaign to make it sendable:
290
+
291
+ ```bash
292
+ sendly 10dlc campaigns assign <campaignId> --number "+15551234567"
293
+ sendly 10dlc assignments list
294
+ ```
295
+
296
+ Then send from it:
297
+
298
+ ```bash
299
+ sendly sms send --to "+15559876543" --text "Hi!" --from "+15551234567"
300
+ ```
301
+
150
302
  ### API Key Commands
151
303
 
152
304
  #### List API Keys
@@ -167,6 +319,21 @@ sendly keys create --name "Production Key" --type live
167
319
  sendly keys revoke key_abc123
168
320
  ```
169
321
 
322
+ #### Rotate a Key
323
+
324
+ Generate a replacement key while keeping the old one valid for a grace period
325
+ (24-168 hours, default 24), so you can roll deployments over before the old key
326
+ expires:
327
+
328
+ ```bash
329
+ sendly keys rotate key_abc123
330
+
331
+ # Keep the old key alive for 48 hours
332
+ sendly keys rotate key_abc123 --grace-period 48 --yes
333
+ ```
334
+
335
+ The new `sk_…` secret is shown once — store it immediately.
336
+
170
337
  ### Credit Commands
171
338
 
172
339
  #### Check Balance
@@ -369,6 +536,42 @@ sendly templates delete tpl_abc123 --force
369
536
  sendly templates presets
370
537
  ```
371
538
 
539
+ ### Link Commands (URL Shortening)
540
+
541
+ Mint branded, owned-domain short links for your destination URLs. Branded short
542
+ links improve deliverability (carriers filter public shorteners) and give you
543
+ per-link click analytics. URL shortening is gated behind the `url_shortener`
544
+ rollout flag — until it's enabled for your account these commands return
545
+ `not_enabled`.
546
+
547
+ #### Create a Short Link
548
+
549
+ ```bash
550
+ sendly links create https://example.com/spring-sale
551
+ ```
552
+
553
+ #### List Your Short Links
554
+
555
+ Newest first, with click counts:
556
+
557
+ ```bash
558
+ sendly links list
559
+
560
+ # Paginate
561
+ sendly links list --limit 20 --offset 20
562
+ ```
563
+
564
+ #### Disable / Re-enable a Short Link
565
+
566
+ The per-link kill switch — a disabled link's redirect returns 404:
567
+
568
+ ```bash
569
+ sendly links disable Ab3xY7
570
+
571
+ # Re-enable
572
+ sendly links disable Ab3xY7 --enable
573
+ ```
574
+
372
575
  ### Logs Commands
373
576
 
374
577
  #### Tail Logs
@@ -0,0 +1,10 @@
1
+ import { AuthenticatedCommand } from "../../../lib/base-command.js";
2
+ export default class TendlcAssignmentsList 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,67 @@
1
+ import { AuthenticatedCommand } from "../../../lib/base-command.js";
2
+ import { apiClient } from "../../../lib/api-client.js";
3
+ import { table, json, info, formatRelativeTime, colors, isJsonMode, } from "../../../lib/output.js";
4
+ function formatAssignmentStatus(status) {
5
+ switch (status) {
6
+ case "Active":
7
+ return colors.success(status);
8
+ case "Under review":
9
+ return colors.warning(status);
10
+ case "Action needed":
11
+ return colors.error(status);
12
+ default:
13
+ return status;
14
+ }
15
+ }
16
+ export default class TendlcAssignmentsList extends AuthenticatedCommand {
17
+ static description = "List number-to-campaign assignments";
18
+ static examples = [
19
+ "<%= config.bin %> 10dlc assignments list",
20
+ "<%= config.bin %> 10dlc assignments list --json",
21
+ ];
22
+ static flags = {
23
+ ...AuthenticatedCommand.baseFlags,
24
+ };
25
+ async run() {
26
+ await this.parse(TendlcAssignmentsList);
27
+ const response = await apiClient.get("/api/v1/tendlc/assignments");
28
+ if (isJsonMode()) {
29
+ json(response);
30
+ return;
31
+ }
32
+ if (!response.data || response.data.length === 0) {
33
+ info("No numbers assigned yet. Assign one with: sendly 10dlc campaigns assign <campaignId> --number <number>");
34
+ return;
35
+ }
36
+ console.log();
37
+ console.log(colors.dim(`Showing ${response.data.length} assignments`));
38
+ console.log();
39
+ table(response.data, [
40
+ {
41
+ header: "Number",
42
+ key: "phoneNumber",
43
+ width: 18,
44
+ formatter: (v) => colors.code(String(v)),
45
+ },
46
+ {
47
+ header: "Campaign",
48
+ key: "campaignId",
49
+ width: 38,
50
+ formatter: (v) => colors.dim(String(v)),
51
+ },
52
+ {
53
+ header: "Status",
54
+ key: "status",
55
+ width: 14,
56
+ formatter: (v) => formatAssignmentStatus(String(v)),
57
+ },
58
+ {
59
+ header: "Assigned",
60
+ key: "assignedAt",
61
+ width: 12,
62
+ formatter: (v) => (v ? formatRelativeTime(String(v)) : "-"),
63
+ },
64
+ ]);
65
+ }
66
+ }
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21tYW5kcy8xMGRsYy9hc3NpZ25tZW50cy9saXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RCxPQUFPLEVBQ0wsS0FBSyxFQUNMLElBQUksRUFDSixJQUFJLEVBQ0osa0JBQWtCLEVBQ2xCLE1BQU0sRUFDTixVQUFVLEdBQ1gsTUFBTSx3QkFBd0IsQ0FBQztBQWNoQyxTQUFTLHNCQUFzQixDQUFDLE1BQWM7SUFDNUMsUUFBUSxNQUFNLEVBQUUsQ0FBQztRQUNmLEtBQUssUUFBUTtZQUNYLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoQyxLQUFLLGNBQWM7WUFDakIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLEtBQUssZUFBZTtZQUNsQixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUI7WUFDRSxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxPQUFPLE9BQU8scUJBQXNCLFNBQVEsb0JBQW9CO0lBQ3JFLE1BQU0sQ0FBQyxXQUFXLEdBQUcscUNBQXFDLENBQUM7SUFFM0QsTUFBTSxDQUFDLFFBQVEsR0FBRztRQUNoQiwwQ0FBMEM7UUFDMUMsaURBQWlEO0tBQ2xELENBQUM7SUFFRixNQUFNLENBQUMsS0FBSyxHQUFHO1FBQ2IsR0FBRyxvQkFBb0IsQ0FBQyxTQUFTO0tBQ2xDLENBQUM7SUFFRixLQUFLLENBQUMsR0FBRztRQUNQLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRXhDLE1BQU0sUUFBUSxHQUFHLE1BQU0sU0FBUyxDQUFDLEdBQUcsQ0FDbEMsNEJBQTRCLENBQzdCLENBQUM7UUFFRixJQUFJLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2YsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQ0Ysd0dBQXdHLENBQ3pHLENBQUM7WUFDRixPQUFPO1FBQ1QsQ0FBQztRQUVELE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUVkLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFO1lBQ25CO2dCQUNFLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixHQUFHLEVBQUUsYUFBYTtnQkFDbEIsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN6QztZQUNEO2dCQUNFLE1BQU0sRUFBRSxVQUFVO2dCQUNsQixHQUFHLEVBQUUsWUFBWTtnQkFDakIsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN4QztZQUNEO2dCQUNFLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixHQUFHLEVBQUUsUUFBUTtnQkFDYixLQUFLLEVBQUUsRUFBRTtnQkFDVCxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNwRDtZQUNEO2dCQUNFLE1BQU0sRUFBRSxVQUFVO2dCQUNsQixHQUFHLEVBQUUsWUFBWTtnQkFDakIsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQzthQUM1RDtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdXRoZW50aWNhdGVkQ29tbWFuZCB9IGZyb20gXCIuLi8uLi8uLi9saWIvYmFzZS1jb21tYW5kLmpzXCI7XG5pbXBvcnQgeyBhcGlDbGllbnQgfSBmcm9tIFwiLi4vLi4vLi4vbGliL2FwaS1jbGllbnQuanNcIjtcbmltcG9ydCB7XG4gIHRhYmxlLFxuICBqc29uLFxuICBpbmZvLFxuICBmb3JtYXRSZWxhdGl2ZVRpbWUsXG4gIGNvbG9ycyxcbiAgaXNKc29uTW9kZSxcbn0gZnJvbSBcIi4uLy4uLy4uL2xpYi9vdXRwdXQuanNcIjtcblxuaW50ZXJmYWNlIEFzc2lnbm1lbnQge1xuICBpZDogc3RyaW5nO1xuICBjYW1wYWlnbklkOiBzdHJpbmc7XG4gIHBob25lTnVtYmVyOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICBhc3NpZ25lZEF0OiBzdHJpbmcgfCBudWxsO1xufVxuXG5pbnRlcmZhY2UgTGlzdEFzc2lnbm1lbnRzUmVzcG9uc2Uge1xuICBkYXRhOiBBc3NpZ25tZW50W107XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEFzc2lnbm1lbnRTdGF0dXMoc3RhdHVzOiBzdHJpbmcpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHN0YXR1cykge1xuICAgIGNhc2UgXCJBY3RpdmVcIjpcbiAgICAgIHJldHVybiBjb2xvcnMuc3VjY2VzcyhzdGF0dXMpO1xuICAgIGNhc2UgXCJVbmRlciByZXZpZXdcIjpcbiAgICAgIHJldHVybiBjb2xvcnMud2FybmluZyhzdGF0dXMpO1xuICAgIGNhc2UgXCJBY3Rpb24gbmVlZGVkXCI6XG4gICAgICByZXR1cm4gY29sb3JzLmVycm9yKHN0YXR1cyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzdGF0dXM7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVuZGxjQXNzaWdubWVudHNMaXN0IGV4dGVuZHMgQXV0aGVudGljYXRlZENvbW1hbmQge1xuICBzdGF0aWMgZGVzY3JpcHRpb24gPSBcIkxpc3QgbnVtYmVyLXRvLWNhbXBhaWduIGFzc2lnbm1lbnRzXCI7XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gMTBkbGMgYXNzaWdubWVudHMgbGlzdFwiLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gMTBkbGMgYXNzaWdubWVudHMgbGlzdCAtLWpzb25cIixcbiAgXTtcblxuICBzdGF0aWMgZmxhZ3MgPSB7XG4gICAgLi4uQXV0aGVudGljYXRlZENvbW1hbmQuYmFzZUZsYWdzLFxuICB9O1xuXG4gIGFzeW5jIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnBhcnNlKFRlbmRsY0Fzc2lnbm1lbnRzTGlzdCk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGFwaUNsaWVudC5nZXQ8TGlzdEFzc2lnbm1lbnRzUmVzcG9uc2U+KFxuICAgICAgXCIvYXBpL3YxL3RlbmRsYy9hc3NpZ25tZW50c1wiLFxuICAgICk7XG5cbiAgICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgICBqc29uKHJlc3BvbnNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLmRhdGEgfHwgcmVzcG9uc2UuZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIGluZm8oXG4gICAgICAgIFwiTm8gbnVtYmVycyBhc3NpZ25lZCB5ZXQuIEFzc2lnbiBvbmUgd2l0aDogc2VuZGx5IDEwZGxjIGNhbXBhaWducyBhc3NpZ24gPGNhbXBhaWduSWQ+IC0tbnVtYmVyIDxudW1iZXI+XCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coY29sb3JzLmRpbShgU2hvd2luZyAke3Jlc3BvbnNlLmRhdGEubGVuZ3RofSBhc3NpZ25tZW50c2ApKTtcbiAgICBjb25zb2xlLmxvZygpO1xuXG4gICAgdGFibGUocmVzcG9uc2UuZGF0YSwgW1xuICAgICAge1xuICAgICAgICBoZWFkZXI6IFwiTnVtYmVyXCIsXG4gICAgICAgIGtleTogXCJwaG9uZU51bWJlclwiLFxuICAgICAgICB3aWR0aDogMTgsXG4gICAgICAgIGZvcm1hdHRlcjogKHYpID0+IGNvbG9ycy5jb2RlKFN0cmluZyh2KSksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBoZWFkZXI6IFwiQ2FtcGFpZ25cIixcbiAgICAgICAga2V5OiBcImNhbXBhaWduSWRcIixcbiAgICAgICAgd2lkdGg6IDM4LFxuICAgICAgICBmb3JtYXR0ZXI6ICh2KSA9PiBjb2xvcnMuZGltKFN0cmluZyh2KSksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBoZWFkZXI6IFwiU3RhdHVzXCIsXG4gICAgICAgIGtleTogXCJzdGF0dXNcIixcbiAgICAgICAgd2lkdGg6IDE0LFxuICAgICAgICBmb3JtYXR0ZXI6ICh2KSA9PiBmb3JtYXRBc3NpZ25tZW50U3RhdHVzKFN0cmluZyh2KSksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBoZWFkZXI6IFwiQXNzaWduZWRcIixcbiAgICAgICAga2V5OiBcImFzc2lnbmVkQXRcIixcbiAgICAgICAgd2lkdGg6IDEyLFxuICAgICAgICBmb3JtYXR0ZXI6ICh2KSA9PiAodiA/IGZvcm1hdFJlbGF0aXZlVGltZShTdHJpbmcodikpIDogXCItXCIpLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,25 @@
1
+ import { AuthenticatedCommand } from "../../../lib/base-command.js";
2
+ export default class TendlcBrandsCreate extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ "legal-name": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
7
+ dba: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
8
+ ein: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
9
+ "entity-type": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
10
+ vertical: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
11
+ website: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
12
+ email: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
13
+ phone: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
14
+ "mobile-phone": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
15
+ street: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
16
+ city: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
17
+ state: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
18
+ "postal-code": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
19
+ country: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
20
+ "verification-id": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
21
+ json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
22
+ quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
23
+ };
24
+ run(): Promise<void>;
25
+ }
@@ -0,0 +1,89 @@
1
+ import { Flags } from "@oclif/core";
2
+ import { AuthenticatedCommand } from "../../../lib/base-command.js";
3
+ import { apiClient } from "../../../lib/api-client.js";
4
+ import { json, success, colors, isJsonMode, keyValue, } from "../../../lib/output.js";
5
+ const TEXT_FIELDS = {
6
+ dba: "dba",
7
+ ein: "ein",
8
+ vertical: "vertical",
9
+ website: "website",
10
+ email: "email",
11
+ phone: "phone",
12
+ "mobile-phone": "mobilePhone",
13
+ street: "street",
14
+ city: "city",
15
+ state: "state",
16
+ "postal-code": "postalCode",
17
+ country: "country",
18
+ "verification-id": "verificationId",
19
+ };
20
+ export default class TendlcBrandsCreate extends AuthenticatedCommand {
21
+ static description = "Register a brand for carrier review (step 1 of enabling local-number texting)";
22
+ static examples = [
23
+ '<%= config.bin %> 10dlc brands create --legal-name "Acme Inc" --ein "12-3456789" --website https://acme.com',
24
+ '<%= config.bin %> 10dlc brands create --legal-name "Jane Doe" --entity-type SOLE_PROPRIETOR --email jane@example.com',
25
+ ];
26
+ static flags = {
27
+ ...AuthenticatedCommand.baseFlags,
28
+ "legal-name": Flags.string({
29
+ description: "Legal business name",
30
+ required: true,
31
+ }),
32
+ dba: Flags.string({ description: "DBA / trading name" }),
33
+ ein: Flags.string({ description: "EIN / tax ID" }),
34
+ "entity-type": Flags.string({
35
+ description: "Entity type (e.g. PRIVATE_PROFIT, SOLE_PROPRIETOR)",
36
+ default: "PRIVATE_PROFIT",
37
+ }),
38
+ vertical: Flags.string({
39
+ description: "Industry vertical (e.g. TECHNOLOGY, RETAIL)",
40
+ }),
41
+ website: Flags.string({ description: "Business website URL" }),
42
+ email: Flags.string({ description: "Business contact email" }),
43
+ phone: Flags.string({ description: "Business phone number" }),
44
+ "mobile-phone": Flags.string({
45
+ description: "Contact mobile number (sole proprietors)",
46
+ }),
47
+ street: Flags.string({ description: "Street address" }),
48
+ city: Flags.string({ description: "City" }),
49
+ state: Flags.string({ description: "State / region" }),
50
+ "postal-code": Flags.string({ description: "ZIP / postal code" }),
51
+ country: Flags.string({
52
+ description: "Country code (e.g. US)",
53
+ default: "US",
54
+ }),
55
+ "verification-id": Flags.string({
56
+ description: "Verification ID to prefill business details from",
57
+ }),
58
+ };
59
+ async run() {
60
+ const { flags } = await this.parse(TendlcBrandsCreate);
61
+ const body = {
62
+ legalName: flags["legal-name"],
63
+ entityType: flags["entity-type"],
64
+ };
65
+ for (const [flagKey, wireKey] of Object.entries(TEXT_FIELDS)) {
66
+ const v = flags[flagKey];
67
+ if (typeof v === "string" && v.length > 0)
68
+ body[wireKey] = v;
69
+ }
70
+ const response = await apiClient.post("/api/v1/tendlc/brands", body);
71
+ if (isJsonMode()) {
72
+ json(response);
73
+ return;
74
+ }
75
+ const brand = response.data;
76
+ success(`Brand submitted for carrier review: ${brand.id}`);
77
+ console.log();
78
+ keyValue([
79
+ ["Legal name", brand.legalName],
80
+ ["Entity type", brand.entityType],
81
+ ["Status", colors.warning(brand.status)],
82
+ ]);
83
+ console.log();
84
+ console.log(colors.dim("Next steps:"));
85
+ console.log(` Check status: ${colors.code(`sendly 10dlc brands get ${brand.id}`)}`);
86
+ console.log(` Once verified: ${colors.code(`sendly 10dlc qualify ${brand.id} MIXED`)}`);
87
+ }
88
+ }
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbW1hbmRzLzEwZGxjL2JyYW5kcy9jcmVhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNwQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUNMLElBQUksRUFDSixPQUFPLEVBQ1AsTUFBTSxFQUNOLFVBQVUsRUFDVixRQUFRLEdBQ1QsTUFBTSx3QkFBd0IsQ0FBQztBQWVoQyxNQUFNLFdBQVcsR0FBMkI7SUFDMUMsR0FBRyxFQUFFLEtBQUs7SUFDVixHQUFHLEVBQUUsS0FBSztJQUNWLFFBQVEsRUFBRSxVQUFVO0lBQ3BCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLEtBQUssRUFBRSxPQUFPO0lBQ2QsS0FBSyxFQUFFLE9BQU87SUFDZCxjQUFjLEVBQUUsYUFBYTtJQUM3QixNQUFNLEVBQUUsUUFBUTtJQUNoQixJQUFJLEVBQUUsTUFBTTtJQUNaLEtBQUssRUFBRSxPQUFPO0lBQ2QsYUFBYSxFQUFFLFlBQVk7SUFDM0IsT0FBTyxFQUFFLFNBQVM7SUFDbEIsaUJBQWlCLEVBQUUsZ0JBQWdCO0NBQ3BDLENBQUM7QUFFRixNQUFNLENBQUMsT0FBTyxPQUFPLGtCQUFtQixTQUFRLG9CQUFvQjtJQUNsRSxNQUFNLENBQUMsV0FBVyxHQUNoQiwrRUFBK0UsQ0FBQztJQUVsRixNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLDZHQUE2RztRQUM3RyxzSEFBc0g7S0FDdkgsQ0FBQztJQUVGLE1BQU0sQ0FBQyxLQUFLLEdBQUc7UUFDYixHQUFHLG9CQUFvQixDQUFDLFNBQVM7UUFDakMsWUFBWSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDekIsV0FBVyxFQUFFLHFC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S0FBSyxDQUFDLFNBQVMsQ0FBQztZQUMvQixDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDO1lBQ2pDLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3pDLENBQUMsQ0FBQztRQUVILE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sQ0FBQyxHQUFHLENBQ1Qsb0JBQW9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQ3pFLENBQUM7UUFDRixPQUFPLENBQUMsR0FBRyxDQUNULG9CQUFvQixNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixLQUFLLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUM1RSxDQUFDO0lBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZsYWdzIH0gZnJvbSBcIkBvY2xpZi9jb3JlXCI7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGVkQ29tbWFuZCB9IGZyb20gXCIuLi8uLi8uLi9saWIvYmFzZS1jb21tYW5kLmpzXCI7XG5pbXBvcnQgeyBhcGlDbGllbnQgfSBmcm9tIFwiLi4vLi4vLi4vbGliL2FwaS1jbGllbnQuanNcIjtcbmltcG9ydCB7XG4gIGpzb24sXG4gIHN1Y2Nlc3MsXG4gIGNvbG9ycyxcbiAgaXNKc29uTW9kZSxcbiAga2V5VmFsdWUsXG59IGZyb20gXCIuLi8uLi8uLi9saWIvb3V0cHV0LmpzXCI7XG5cbmludGVyZmFjZSBCcmFuZCB7XG4gIGlkOiBzdHJpbmc7XG4gIGxlZ2FsTmFtZTogc3RyaW5nO1xuICBkYmE6IHN0cmluZyB8IG51bGw7XG4gIGVudGl0eVR5cGU6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIGNyZWF0ZWRBdDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ3JlYXRlQnJhbmRSZXNwb25zZSB7XG4gIGRhdGE6IEJyYW5kO1xufVxuXG5jb25zdCBURVhUX0ZJRUxEUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgZGJhOiBcImRiYVwiLFxuICBlaW46IFwiZWluXCIsXG4gIHZlcnRpY2FsOiBcInZlcnRpY2FsXCIsXG4gIHdlYnNpdGU6IFwid2Vic2l0ZVwiLFxuICBlbWFpbDogXCJlbWFpbFwiLFxuICBwaG9uZTogXCJwaG9uZVwiLFxuICBcIm1vYmlsZS1waG9uZVwiOiBcIm1vYmlsZVBob25lXCIsXG4gIHN0cmVldDogXCJzdHJlZXRcIixcbiAgY2l0eTogXCJjaXR5XCIsXG4gIHN0YXRlOiBcInN0YXRlXCIsXG4gIFwicG9zdGFsLWNvZGVcIjogXCJwb3N0YWxDb2RlXCIsXG4gIGNvdW50cnk6IFwiY291bnRyeVwiLFxuICBcInZlcmlmaWNhdGlvbi1pZFwiOiBcInZlcmlmaWNhdGlvbklkXCIsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZW5kbGNCcmFuZHNDcmVhdGUgZXh0ZW5kcyBBdXRoZW50aWNhdGVkQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9XG4gICAgXCJSZWdpc3RlciBhIGJyYW5kIGZvciBjYXJyaWVyIHJldmlldyAoc3RlcCAxIG9mIGVuYWJsaW5nIGxvY2FsLW51bWJlciB0ZXh0aW5nKVwiO1xuXG4gIHN0YXRpYyBleGFtcGxlcyA9IFtcbiAgICAnPCU9IGNvbmZpZy5iaW4gJT4gMTBkbGMgYnJhbmRzIGNyZWF0ZSAtLWxlZ2FsLW5hbWUgXCJBY21lIEluY1wiIC0tZWluIFwiMTItMzQ1Njc4OVwiIC0td2Vic2l0ZSBodHRwczovL2FjbWUuY29tJyxcbiAgICAnPCU9IGNvbmZpZy5iaW4gJT4gMTBkbGMgYnJhbmRzIGNyZWF0ZSAtLWxlZ2FsLW5hbWUgXCJKYW5lIERvZVwiIC0tZW50aXR5LXR5cGUgU09MRV9QUk9QUklFVE9SIC0tZW1haWwgamFuZUBleGFtcGxlLmNvbScsXG4gIF07XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIC4uLkF1dGhlbnRpY2F0ZWRDb21tYW5kLmJhc2VGbGFncyxcbiAgICBcImxlZ2FsLW5hbWVcIjogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkxlZ2FsIGJ1c2luZXNzIG5hbWVcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pLFxuICAgIGRiYTogRmxhZ3Muc3RyaW5nKHsgZGVzY3JpcHRpb246IFwiREJBIC8gdHJhZGluZyBuYW1lXCIgfSksXG4gICAgZWluOiBGbGFncy5zdHJpbmcoeyBkZXNjcmlwdGlvbjogXCJFSU4gLyB0YXggSURcIiB9KSxcbiAgICBcImVudGl0eS10eXBlXCI6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJFbnRpdHkgdHlwZSAoZS5nLiBQUklWQVRFX1BST0ZJVCwgU09MRV9QUk9QUklFVE9SKVwiLFxuICAgICAgZGVmYXVsdDogXCJQUklWQVRFX1BST0ZJVFwiLFxuICAgIH0pLFxuICAgIHZlcnRpY2FsOiBGbGFncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246IFwiSW5kdXN0cnkgdmVydGljYWwgKGUuZy4gVEVDSE5PTE9HWSwgUkVUQUlMKVwiLFxuICAgIH0pLFxuICAgIHdlYnNpdGU6IEZsYWdzLnN0cmluZyh7IGRlc2NyaXB0aW9uOiBcIkJ1c2luZXNzIHdlYnNpdGUgVVJMXCIgfSksXG4gICAgZW1haWw6IEZsYWdzLnN0cmluZyh7IGRlc2NyaXB0aW9uOiBcIkJ1c2luZXNzIGNvbnRhY3QgZW1haWxcIiB9KSxcbiAgICBwaG9uZTogRmxhZ3Muc3RyaW5nKHsgZGVzY3JpcHRpb246IFwiQnVzaW5lc3MgcGhvbmUgbnVtYmVyXCIgfSksXG4gICAgXCJtb2JpbGUtcGhvbmVcIjogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkNvbnRhY3QgbW9iaWxlIG51bWJlciAoc29sZSBwcm9wcmlldG9ycylcIixcbiAgICB9KSxcbiAgICBzdHJlZXQ6IEZsYWdzLnN0cmluZyh7IGRlc2NyaXB0aW9uOiBcIlN0cmVldCBhZGRyZXNzXCIgfSksXG4gICAgY2l0eTogRmxhZ3Muc3RyaW5nKHsgZGVzY3JpcHRpb246IFwiQ2l0eVwiIH0pLFxuICAgIHN0YXRlOiBGbGFncy5zdHJpbmcoeyBkZXNjcmlwdGlvbjogXCJTdGF0ZSAvIHJlZ2lvblwiIH0pLFxuICAgIFwicG9zdGFsLWNvZGVcIjogRmxhZ3Muc3RyaW5nKHsgZGVzY3JpcHRpb246IFwiWklQIC8gcG9zdGFsIGNvZGVcIiB9KSxcbiAgICBjb3VudHJ5OiBGbGFncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246IFwiQ291bnRyeSBjb2RlIChlLmcuIFVTKVwiLFxuICAgICAgZGVmYXVsdDogXCJVU1wiLFxuICAgIH0pLFxuICAgIFwidmVyaWZpY2F0aW9uLWlkXCI6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJWZXJpZmljYXRpb24gSUQgdG8gcHJlZmlsbCBidXNpbmVzcyBkZXRhaWxzIGZyb21cIixcbiAgICB9KSxcbiAgfTtcblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBmbGFncyB9ID0gYXdhaXQgdGhpcy5wYXJzZShUZW5kbGNCcmFuZHNDcmVhdGUpO1xuXG4gICAgY29uc3QgYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICBsZWdhbE5hbWU6IGZsYWdzW1wibGVnYWwtbmFtZVwiXSxcbiAgICAgIGVudGl0eVR5cGU6IGZsYWdzW1wiZW50aXR5LXR5cGVcIl0sXG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgW2ZsYWdLZXksIHdpcmVLZXldIG9mIE9iamVjdC5lbnRyaWVzKFRFWFRfRklFTERTKSkge1xuICAgICAgY29uc3QgdiA9IGZsYWdzW2ZsYWdLZXkgYXMga2V5b2YgdHlwZW9mIGZsYWdzXTtcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIiAmJiB2Lmxlbmd0aCA+IDApIGJvZHlbd2lyZUtleV0gPSB2O1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXBpQ2xpZW50LnBvc3Q8Q3JlYXRlQnJhbmRSZXNwb25zZT4oXG4gICAgICBcIi9hcGkvdjEvdGVuZGxjL2JyYW5kc1wiLFxuICAgICAgYm9keSxcbiAgICApO1xuXG4gICAgaWYgKGlzSnNvbk1vZGUoKSkge1xuICAgICAganNvbihyZXNwb25zZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYnJhbmQgPSByZXNwb25zZS5kYXRhO1xuXG4gICAgc3VjY2VzcyhgQnJhbmQgc3VibWl0dGVkIGZvciBjYXJyaWVyIHJldmlldzogJHticmFuZC5pZH1gKTtcbiAgICBjb25zb2xlLmxvZygpO1xuXG4gICAga2V5VmFsdWUoW1xuICAgICAgW1wiTGVnYWwgbmFtZVwiLCBicmFuZC5sZWdhbE5hbWVdLFxuICAgICAgW1wiRW50aXR5IHR5cGVcIiwgYnJhbmQuZW50aXR5VHlwZV0sXG4gICAgICBbXCJTdGF0dXNcIiwgY29sb3JzLndhcm5pbmcoYnJhbmQuc3RhdHVzKV0sXG4gICAgXSk7XG5cbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oXCJOZXh0IHN0ZXBzOlwiKSk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgICBDaGVjayBzdGF0dXM6ICAke2NvbG9ycy5jb2RlKGBzZW5kbHkgMTBkbGMgYnJhbmRzIGdldCAke2JyYW5kLmlkfWApfWAsXG4gICAgKTtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGAgIE9uY2UgdmVyaWZpZWQ6ICR7Y29sb3JzLmNvZGUoYHNlbmRseSAxMGRsYyBxdWFsaWZ5ICR7YnJhbmQuaWR9IE1JWEVEYCl9YCxcbiAgICApO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,13 @@
1
+ import { AuthenticatedCommand } from "../../../lib/base-command.js";
2
+ export default class TendlcBrandsGet extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
10
+ quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
11
+ };
12
+ run(): Promise<void>;
13
+ }
@@ -0,0 +1,63 @@
1
+ import { Args } from "@oclif/core";
2
+ import { AuthenticatedCommand } from "../../../lib/base-command.js";
3
+ import { apiClient } from "../../../lib/api-client.js";
4
+ import { json, colors, formatStatus, isJsonMode, keyValue, } from "../../../lib/output.js";
5
+ export default class TendlcBrandsGet extends AuthenticatedCommand {
6
+ static description = "Get brand details with the latest carrier-review status (run again to refresh)";
7
+ static examples = [
8
+ "<%= config.bin %> 10dlc brands get brd_xxx",
9
+ "<%= config.bin %> 10dlc brands get brd_xxx --json",
10
+ ];
11
+ static args = {
12
+ id: Args.string({
13
+ description: "Brand ID",
14
+ required: true,
15
+ }),
16
+ };
17
+ static flags = {
18
+ ...AuthenticatedCommand.baseFlags,
19
+ };
20
+ async run() {
21
+ const { args } = await this.parse(TendlcBrandsGet);
22
+ const response = await apiClient.get(`/api/v1/tendlc/brands/${args.id}`);
23
+ if (isJsonMode()) {
24
+ json(response);
25
+ return;
26
+ }
27
+ const brand = response.data;
28
+ console.log();
29
+ console.log(colors.bold(`Brand: ${brand.legalName}`));
30
+ console.log();
31
+ keyValue([
32
+ ["ID", brand.id],
33
+ ["Status", formatStatus(brand.status)],
34
+ ["Entity type", brand.entityType],
35
+ ...(brand.dba ? [["DBA", brand.dba]] : []),
36
+ ...(brand.ein ? [["EIN", brand.ein]] : []),
37
+ ...(brand.vertical
38
+ ? [["Vertical", brand.vertical]]
39
+ : []),
40
+ ...(brand.website
41
+ ? [["Website", brand.website]]
42
+ : []),
43
+ ...(brand.identityStatus
44
+ ? [["Identity", brand.identityStatus]]
45
+ : []),
46
+ ["Created", new Date(brand.createdAt).toLocaleString()],
47
+ ["Updated", new Date(brand.updatedAt).toLocaleString()],
48
+ ]);
49
+ if (brand.failureReasons && brand.failureReasons.length > 0) {
50
+ console.log();
51
+ console.log(colors.error("Failure reasons:"));
52
+ brand.failureReasons.forEach((r) => console.log(` - ${r}`));
53
+ }
54
+ console.log();
55
+ if (brand.status === "pending") {
56
+ console.log(colors.dim("Carrier review is in progress — run this command again to refresh."));
57
+ }
58
+ else if (brand.status === "verified") {
59
+ console.log(colors.dim(`Create a campaign with: sendly 10dlc campaigns create --brand ${brand.id} ...`));
60
+ }
61
+ }
62
+ }
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbW1hbmRzLzEwZGxjL2JyYW5kcy9nZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNuQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUNMLElBQUksRUFDSixNQUFNLEVBQ04sWUFBWSxFQUNaLFVBQVUsRUFDVixRQUFRLEdBQ1QsTUFBTSx3QkFBd0IsQ0FBQztBQXFCaEMsTUFBTSxDQUFDLE9BQU8sT0FBTyxlQUFnQixTQUFRLG9CQUFvQjtJQUMvRCxNQUFNLENBQUMsV0FBVyxHQUNoQixnRkFBZ0YsQ0FBQztJQUVuRixNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLDRDQUE0QztRQUM1QyxtREFBbUQ7S0FDcEQsQ0FBQztJQUVGLE1BQU0sQ0FBQyxJQUFJLEdBQUc7UUFDWixFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNkLFdBQVcsRUFBRSxVQUFVO1lBQ3ZCLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQztLQUNILENBQUM7SUFFRixNQUFNLENBQUMsS0FBSyxHQUFHO1FBQ2IsR0FBRyxvQkFBb0IsQ0FBQyxTQUFTO0tBQ2xDLENBQUM7SUFFRixLQUFLLENBQUMsR0FBRztRQUNQLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFbkQsTUFBTSxRQUFRLEdBQUcsTUFBTSxTQUFTLENBQUMsR0FBRyxDQUNsQyx5QkFBeUIsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUNuQyxDQUFDO1FBRUYsSUFBSSxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNmLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztRQUU1QixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RELE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUVkLFFBQVEsQ0FBQztZQUNQLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDaEIsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0QyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDO1lBQ2pDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzlELEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzlELEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUTtnQkFDaEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBcUIsQ0FBQztnQkFDcEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNQLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTztnQkFDZixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFxQixDQUFDO2dCQUNsRCxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1AsR0FBRyxDQUFDLEtBQUssQ0FBQyxjQUFjO2dCQUN0QixDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFxQixDQUFDO2dCQUMxRCxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1AsQ0FBQyxTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZELENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN4RCxDQUFDLENBQUM7UUFFSCxJQUFJLEtBQUssQ0FBQyxjQUFjLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDNUQsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztZQUM5QyxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBRUQsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2QsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQ1QsTUFBTSxDQUFDLEdBQUcsQ0FDUixvRUFBb0UsQ0FDckUsQ0FDRixDQUFDO1FBQ0osQ0FBQzthQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUN2QyxPQUFPLENBQUMsR0FBRyxDQUNULE1BQU0sQ0FBQyxHQUFHLENBQ1IsaUVBQWlFLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FDaEYsQ0FDRixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcmdzIH0gZnJvbSBcIkBvY2xpZi9jb3JlXCI7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGVkQ29tbWFuZCB9IGZyb20gXCIuLi8uLi8uLi9saWIvYmFzZS1jb21tYW5kLmpzXCI7XG5pbXBvcnQgeyBhcGlDbGllbnQgfSBmcm9tIFwiLi4vLi4vLi4vbGliL2FwaS1jbGllbnQuanNcIjtcbmltcG9ydCB7XG4gIGpzb24sXG4gIGNvbG9ycyxcbiAgZm9ybWF0U3RhdHVzLFxuICBpc0pzb25Nb2RlLFxuICBrZXlWYWx1ZSxcbn0gZnJvbSBcIi4uLy4uLy4uL2xpYi9vdXRwdXQuanNcIjtcblxuaW50ZXJmYWNlIEJyYW5kIHtcbiAgaWQ6IHN0cmluZztcbiAgbGVnYWxOYW1lOiBzdHJpbmc7XG4gIGRiYTogc3RyaW5nIHwgbnVsbDtcbiAgZW50aXR5VHlwZTogc3RyaW5nO1xuICBlaW46IHN0cmluZyB8IG51bGw7XG4gIHZlcnRpY2FsOiBzdHJpbmcgfCBudWxsO1xuICB3ZWJzaXRlOiBzdHJpbmcgfCBudWxsO1xuICBzdGF0dXM6IHN0cmluZztcbiAgaWRlbnRpdHlTdGF0dXM6IHN0cmluZyB8IG51bGw7XG4gIGZhaWx1cmVSZWFzb25zOiBzdHJpbmdbXSB8IG51bGw7XG4gIGNyZWF0ZWRBdDogc3RyaW5nO1xuICB1cGRhdGVkQXQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEdldEJyYW5kUmVzcG9uc2Uge1xuICBkYXRhOiBCcmFuZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVuZGxjQnJhbmRzR2V0IGV4dGVuZHMgQXV0aGVudGljYXRlZENvbW1hbmQge1xuICBzdGF0aWMgZGVzY3JpcHRpb24gPVxuICAgIFwiR2V0IGJyYW5kIGRldGFpbHMgd2l0aCB0aGUgbGF0ZXN0IGNhcnJpZXItcmV2aWV3IHN0YXR1cyAocnVuIGFnYWluIHRvIHJlZnJlc2gpXCI7XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gMTBkbGMgYnJhbmRzIGdldCBicmRfeHh4XCIsXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiAxMGRsYyBicmFuZHMgZ2V0IGJyZF94eHggLS1qc29uXCIsXG4gIF07XG5cbiAgc3RhdGljIGFyZ3MgPSB7XG4gICAgaWQ6IEFyZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkJyYW5kIElEXCIsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KSxcbiAgfTtcblxuICBzdGF0aWMgZmxhZ3MgPSB7XG4gICAgLi4uQXV0aGVudGljYXRlZENvbW1hbmQuYmFzZUZsYWdzLFxuICB9O1xuXG4gIGFzeW5jIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGFyZ3MgfSA9IGF3YWl0IHRoaXMucGFyc2UoVGVuZGxjQnJhbmRzR2V0KTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXBpQ2xpZW50LmdldDxHZXRCcmFuZFJlc3BvbnNlPihcbiAgICAgIGAvYXBpL3YxL3RlbmRsYy9icmFuZHMvJHthcmdzLmlkfWAsXG4gICAgKTtcblxuICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgIGpzb24ocmVzcG9uc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJyYW5kID0gcmVzcG9uc2UuZGF0YTtcblxuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coY29sb3JzLmJvbGQoYEJyYW5kOiAke2JyYW5kLmxlZ2FsTmFtZX1gKSk7XG4gICAgY29uc29sZS5sb2coKTtcblxuICAgIGtleVZhbHVlKFtcbiAgICAgIFtcIklEXCIsIGJyYW5kLmlkXSxcbiAgICAgIFtcIlN0YXR1c1wiLCBmb3JtYXRTdGF0dXMoYnJhbmQuc3RhdHVzKV0sXG4gICAgICBbXCJFbnRpdHkgdHlwZVwiLCBicmFuZC5lbnRpdHlUeXBlXSxcbiAgICAgIC4uLihicmFuZC5kYmEgPyBbW1wiREJBXCIsIGJyYW5kLmRiYV0gYXMgW3N0cmluZywgc3RyaW5nXV0gOiBbXSksXG4gICAgICAuLi4oYnJhbmQuZWluID8gW1tcIkVJTlwiLCBicmFuZC5laW5dIGFzIFtzdHJpbmcsIHN0cmluZ11dIDogW10pLFxuICAgICAgLi4uKGJyYW5kLnZlcnRpY2FsXG4gICAgICAgID8gW1tcIlZlcnRpY2FsXCIsIGJyYW5kLnZlcnRpY2FsXSBhcyBbc3RyaW5nLCBzdHJpbmddXVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLihicmFuZC53ZWJzaXRlXG4gICAgICAgID8gW1tcIldlYnNpdGVcIiwgYnJhbmQud2Vic2l0ZV0gYXMgW3N0cmluZywgc3RyaW5nXV1cbiAgICAgICAgOiBbXSksXG4gICAgICAuLi4oYnJhbmQuaWRlbnRpdHlTdGF0dXNcbiAgICAgICAgPyBbW1wiSWRlbnRpdHlcIiwgYnJhbmQuaWRlbnRpdHlTdGF0dXNdIGFzIFtzdHJpbmcsIHN0cmluZ11dXG4gICAgICAgIDogW10pLFxuICAgICAgW1wiQ3JlYXRlZFwiLCBuZXcgRGF0ZShicmFuZC5jcmVhdGVkQXQpLnRvTG9jYWxlU3RyaW5nKCldLFxuICAgICAgW1wiVXBkYXRlZFwiLCBuZXcgRGF0ZShicmFuZC51cGRhdGVkQXQpLnRvTG9jYWxlU3RyaW5nKCldLFxuICAgIF0pO1xuXG4gICAgaWYgKGJyYW5kLmZhaWx1cmVSZWFzb25zICYmIGJyYW5kLmZhaWx1cmVSZWFzb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICBjb25zb2xlLmxvZyhjb2xvcnMuZXJyb3IoXCJGYWlsdXJlIHJlYXNvbnM6XCIpKTtcbiAgICAgIGJyYW5kLmZhaWx1cmVSZWFzb25zLmZvckVhY2goKHIpID0+IGNvbnNvbGUubG9nKGAgIC0gJHtyfWApKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGlmIChicmFuZC5zdGF0dXMgPT09IFwicGVuZGluZ1wiKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY29sb3JzLmRpbShcbiAgICAgICAgICBcIkNhcnJpZXIgcmV2aWV3IGlzIGluIHByb2dyZXNzIOKAlCBydW4gdGhpcyBjb21tYW5kIGFnYWluIHRvIHJlZnJlc2guXCIsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoYnJhbmQuc3RhdHVzID09PSBcInZlcmlmaWVkXCIpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjb2xvcnMuZGltKFxuICAgICAgICAgIGBDcmVhdGUgYSBjYW1wYWlnbiB3aXRoOiBzZW5kbHkgMTBkbGMgY2FtcGFpZ25zIGNyZWF0ZSAtLWJyYW5kICR7YnJhbmQuaWR9IC4uLmAsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,10 @@
1
+ import { AuthenticatedCommand } from "../../../lib/base-command.js";
2
+ export default class TendlcBrandsList 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,63 @@
1
+ import { AuthenticatedCommand } from "../../../lib/base-command.js";
2
+ import { apiClient } from "../../../lib/api-client.js";
3
+ import { table, json, info, formatStatus, formatRelativeTime, colors, isJsonMode, } from "../../../lib/output.js";
4
+ export default class TendlcBrandsList extends AuthenticatedCommand {
5
+ static description = "List the brands registered for carrier review";
6
+ static examples = [
7
+ "<%= config.bin %> 10dlc brands list",
8
+ "<%= config.bin %> 10dlc brands list --json",
9
+ ];
10
+ static flags = {
11
+ ...AuthenticatedCommand.baseFlags,
12
+ };
13
+ async run() {
14
+ await this.parse(TendlcBrandsList);
15
+ const response = await apiClient.get("/api/v1/tendlc/brands");
16
+ if (isJsonMode()) {
17
+ json(response);
18
+ return;
19
+ }
20
+ if (!response.data || response.data.length === 0) {
21
+ info('No brands registered yet. Register one with: sendly 10dlc brands create --legal-name "Acme Inc"');
22
+ return;
23
+ }
24
+ console.log();
25
+ console.log(colors.dim(`Showing ${response.data.length} brands`));
26
+ console.log();
27
+ table(response.data, [
28
+ {
29
+ header: "ID",
30
+ key: "id",
31
+ width: 38,
32
+ formatter: (v) => colors.dim(String(v)),
33
+ },
34
+ {
35
+ header: "Legal name",
36
+ key: "legalName",
37
+ width: 24,
38
+ formatter: (v) => {
39
+ const name = String(v);
40
+ return name.length > 22 ? name.slice(0, 22) + "..." : name;
41
+ },
42
+ },
43
+ {
44
+ header: "Entity",
45
+ key: "entityType",
46
+ width: 18,
47
+ },
48
+ {
49
+ header: "Status",
50
+ key: "status",
51
+ width: 11,
52
+ formatter: (v) => formatStatus(String(v)),
53
+ },
54
+ {
55
+ header: "Created",
56
+ key: "createdAt",
57
+ width: 12,
58
+ formatter: (v) => formatRelativeTime(String(v)),
59
+ },
60
+ ]);
61
+ }
62
+ }
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21tYW5kcy8xMGRsYy9icmFuZHMvbGlzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUNMLEtBQUssRUFDTCxJQUFJLEVBQ0osSUFBSSxFQUNKLFlBQVksRUFDWixrQkFBa0IsRUFDbEIsTUFBTSxFQUNOLFVBQVUsR0FDWCxNQUFNLHdCQUF3QixDQUFDO0FBcUJoQyxNQUFNLENBQUMsT0FBTyxPQUFPLGdCQUFpQixTQUFRLG9CQUFvQjtJQUNoRSxNQUFNLENBQUMsV0FBVyxHQUFHLCtDQUErQyxDQUFDO0lBRXJFLE1BQU0sQ0FBQyxRQUFRLEdBQUc7UUFDaEIscUNBQXFDO1FBQ3JDLDRDQUE0QztLQUM3QyxDQUFDO0lBRUYsTUFBTSxDQUFDLEtBQUssR0FBRztRQUNiLEdBQUcsb0JBQW9CLENBQUMsU0FBUztLQUNsQyxDQUFDO0lBRUYsS0FBSyxDQUFDLEdBQUc7UUFDUCxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUVuQyxNQUFNLFFBQVEsR0FBRyxNQUFNLFNBQVMsQ0FBQyxHQUFHLENBQ2xDLHVCQUF1QixDQUN4QixDQUFDO1FBRUYsSUFBSSxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNmLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUNGLGlHQUFpRyxDQUNsRyxDQUFDO1lBQ0YsT0FBTztRQUNULENBQUM7UUFFRCxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sU0FBUyxDQUFDLENBQUMsQ0FBQztRQUNsRSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFZCxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtZQUNuQjtnQkFDRSxNQUFNLEVBQUUsSUFBSTtnQkFDWixHQUFHLEVBQUUsSUFBSTtnQkFDVCxLQUFLLEVBQUUsRUFBRTtnQkFDVCxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3hDO1lBQ0Q7Z0JBQ0UsTUFBTSxFQUFFLFlBQVk7Z0JBQ3BCLEdBQUcsRUFBRSxXQUFXO2dCQUNoQixLQUFLLEVBQUUsRUFBRTtnQkFDVCxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtvQkFDZixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3ZCLE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUM3RCxDQUFDO2FBQ0Y7WUFDRDtnQkFDRSxNQUFNLEVBQUUsUUFBUTtnQkFDaEIsR0FBRyxFQUFFLFlBQVk7Z0JBQ2pCLEtBQUssRUFBRSxFQUFFO2FBQ1Y7WUFDRDtnQkFDRSxNQUFNLEVBQUUsUUFBUTtnQkFDaEIsR0FBRyxFQUFFLFFBQVE7Z0JBQ2IsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzFDO1lBQ0Q7Z0JBQ0UsTUFBTSxFQUFFLFNBQVM7Z0JBQ2pCLEdBQUcsRUFBRSxXQUFXO2dCQUNoQixLQUFLLEVBQUUsRUFBRTtnQkFDVCxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNoRDtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdXRoZW50aWNhdGVkQ29tbWFuZCB9IGZyb20gXCIuLi8uLi8uLi9saWIvYmFzZS1jb21tYW5kLmpzXCI7XG5pbXBvcnQgeyBhcGlDbGllbnQgfSBmcm9tIFwiLi4vLi4vLi4vbGliL2FwaS1jbGllbnQuanNcIjtcbmltcG9ydCB7XG4gIHRhYmxlLFxuICBqc29uLFxuICBpbmZvLFxuICBmb3JtYXRTdGF0dXMsXG4gIGZvcm1hdFJlbGF0aXZlVGltZSxcbiAgY29sb3JzLFxuICBpc0pzb25Nb2RlLFxufSBmcm9tIFwiLi4vLi4vLi4vbGliL291dHB1dC5qc1wiO1xuXG5pbnRlcmZhY2UgQnJhbmQge1xuICBpZDogc3RyaW5nO1xuICBsZWdhbE5hbWU6IHN0cmluZztcbiAgZGJhOiBzdHJpbmcgfCBudWxsO1xuICBlbnRpdHlUeXBlOiBzdHJpbmc7XG4gIGVpbjogc3RyaW5nIHwgbnVsbDtcbiAgdmVydGljYWw6IHN0cmluZyB8IG51bGw7XG4gIHdlYnNpdGU6IHN0cmluZyB8IG51bGw7XG4gIHN0YXR1czogc3RyaW5nO1xuICBpZGVudGl0eVN0YXR1czogc3RyaW5nIHwgbnVsbDtcbiAgZmFpbHVyZVJlYXNvbnM6IHN0cmluZ1tdIHwgbnVsbDtcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gIHVwZGF0ZWRBdDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgTGlzdEJyYW5kc1Jlc3BvbnNlIHtcbiAgZGF0YTogQnJhbmRbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVuZGxjQnJhbmRzTGlzdCBleHRlbmRzIEF1dGhlbnRpY2F0ZWRDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID0gXCJMaXN0IHRoZSBicmFuZHMgcmVnaXN0ZXJlZCBmb3IgY2FycmllciByZXZpZXdcIjtcblxuICBzdGF0aWMgZXhhbXBsZXMgPSBbXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiAxMGRsYyBicmFuZHMgbGlzdFwiLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gMTBkbGMgYnJhbmRzIGxpc3QgLS1qc29uXCIsXG4gIF07XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIC4uLkF1dGhlbnRpY2F0ZWRDb21tYW5kLmJhc2VGbGFncyxcbiAgfTtcblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5wYXJzZShUZW5kbGNCcmFuZHNMaXN0KTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXBpQ2xpZW50LmdldDxMaXN0QnJhbmRzUmVzcG9uc2U+KFxuICAgICAgXCIvYXBpL3YxL3RlbmRsYy9icmFuZHNcIixcbiAgICApO1xuXG4gICAgaWYgKGlzSnNvbk1vZGUoKSkge1xuICAgICAganNvbihyZXNwb25zZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFyZXNwb25zZS5kYXRhIHx8IHJlc3BvbnNlLmRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICBpbmZvKFxuICAgICAgICAnTm8gYnJhbmRzIHJlZ2lzdGVyZWQgeWV0LiBSZWdpc3RlciBvbmUgd2l0aDogc2VuZGx5IDEwZGxjIGJyYW5kcyBjcmVhdGUgLS1sZWdhbC1uYW1lIFwiQWNtZSBJbmNcIicsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coY29sb3JzLmRpbShgU2hvd2luZyAke3Jlc3BvbnNlLmRhdGEubGVuZ3RofSBicmFuZHNgKSk7XG4gICAgY29uc29sZS5sb2coKTtcblxuICAgIHRhYmxlKHJlc3BvbnNlLmRhdGEsIFtcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyOiBcIklEXCIsXG4gICAgICAgIGtleTogXCJpZFwiLFxuICAgICAgICB3aWR0aDogMzgsXG4gICAgICAgIGZvcm1hdHRlcjogKHYpID0+IGNvbG9ycy5kaW0oU3RyaW5nKHYpKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGhlYWRlcjogXCJMZWdhbCBuYW1lXCIsXG4gICAgICAgIGtleTogXCJsZWdhbE5hbWVcIixcbiAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgICBmb3JtYXR0ZXI6ICh2KSA9PiB7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IFN0cmluZyh2KTtcbiAgICAgICAgICByZXR1cm4gbmFtZS5sZW5ndGggPiAyMiA/IG5hbWUuc2xpY2UoMCwgMjIpICsgXCIuLi5cIiA6IG5hbWU7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBoZWFkZXI6IFwiRW50aXR5XCIsXG4gICAgICAgIGtleTogXCJlbnRpdHlUeXBlXCIsXG4gICAgICAgIHdpZHRoOiAxOCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGhlYWRlcjogXCJTdGF0dXNcIixcbiAgICAgICAga2V5OiBcInN0YXR1c1wiLFxuICAgICAgICB3aWR0aDogMTEsXG4gICAgICAgIGZvcm1hdHRlcjogKHYpID0+IGZvcm1hdFN0YXR1cyhTdHJpbmcodikpLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyOiBcIkNyZWF0ZWRcIixcbiAgICAgICAga2V5OiBcImNyZWF0ZWRBdFwiLFxuICAgICAgICB3aWR0aDogMTIsXG4gICAgICAgIGZvcm1hdHRlcjogKHYpID0+IGZvcm1hdFJlbGF0aXZlVGltZShTdHJpbmcodikpLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,14 @@
1
+ import { AuthenticatedCommand } from "../../../lib/base-command.js";
2
+ export default class TendlcCampaignsAssign extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ number: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
10
+ json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
11
+ quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
12
+ };
13
+ run(): Promise<void>;
14
+ }