@cakemail-org/cakemail-cli 1.2.0 → 1.5.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 (88) hide show
  1. package/README.md +140 -0
  2. package/dist/cli.js +48 -6
  3. package/dist/cli.js.map +1 -1
  4. package/dist/client.js +0 -2
  5. package/dist/client.js.map +1 -1
  6. package/dist/commands/account.d.ts +5 -0
  7. package/dist/commands/account.d.ts.map +1 -0
  8. package/dist/commands/account.js +231 -0
  9. package/dist/commands/account.js.map +1 -0
  10. package/dist/commands/attributes.d.ts +5 -0
  11. package/dist/commands/attributes.d.ts.map +1 -0
  12. package/dist/commands/attributes.js +126 -0
  13. package/dist/commands/attributes.js.map +1 -0
  14. package/dist/commands/campaigns.d.ts.map +1 -1
  15. package/dist/commands/campaigns.js +153 -19
  16. package/dist/commands/campaigns.js.map +1 -1
  17. package/dist/commands/config.d.ts +8 -0
  18. package/dist/commands/config.d.ts.map +1 -0
  19. package/dist/commands/config.js +235 -0
  20. package/dist/commands/config.js.map +1 -0
  21. package/dist/commands/contacts.d.ts.map +1 -1
  22. package/dist/commands/contacts.js +436 -14
  23. package/dist/commands/contacts.js.map +1 -1
  24. package/dist/commands/emails.d.ts.map +1 -1
  25. package/dist/commands/emails.js +53 -0
  26. package/dist/commands/emails.js.map +1 -1
  27. package/dist/commands/lists.d.ts.map +1 -1
  28. package/dist/commands/lists.js +282 -11
  29. package/dist/commands/lists.js.map +1 -1
  30. package/dist/commands/reports.d.ts +5 -0
  31. package/dist/commands/reports.d.ts.map +1 -0
  32. package/dist/commands/reports.js +334 -0
  33. package/dist/commands/reports.js.map +1 -0
  34. package/dist/commands/segments.d.ts +5 -0
  35. package/dist/commands/segments.d.ts.map +1 -0
  36. package/dist/commands/segments.js +203 -0
  37. package/dist/commands/segments.js.map +1 -0
  38. package/dist/commands/senders.d.ts.map +1 -1
  39. package/dist/commands/senders.js +36 -5
  40. package/dist/commands/senders.js.map +1 -1
  41. package/dist/commands/suppressed.d.ts +5 -0
  42. package/dist/commands/suppressed.d.ts.map +1 -0
  43. package/dist/commands/suppressed.js +193 -0
  44. package/dist/commands/suppressed.js.map +1 -0
  45. package/dist/commands/templates.d.ts.map +1 -1
  46. package/dist/commands/templates.js +11 -3
  47. package/dist/commands/templates.js.map +1 -1
  48. package/dist/types/profile.d.ts +92 -0
  49. package/dist/types/profile.d.ts.map +1 -0
  50. package/dist/types/profile.js +119 -0
  51. package/dist/types/profile.js.map +1 -0
  52. package/dist/utils/auth.d.ts +26 -0
  53. package/dist/utils/auth.d.ts.map +1 -0
  54. package/dist/utils/auth.js +198 -0
  55. package/dist/utils/auth.js.map +1 -0
  56. package/dist/utils/config-file.d.ts +92 -0
  57. package/dist/utils/config-file.d.ts.map +1 -0
  58. package/dist/utils/config-file.js +244 -0
  59. package/dist/utils/config-file.js.map +1 -0
  60. package/dist/utils/config.d.ts +11 -2
  61. package/dist/utils/config.d.ts.map +1 -1
  62. package/dist/utils/config.js +74 -8
  63. package/dist/utils/config.js.map +1 -1
  64. package/dist/utils/confirm.d.ts +38 -0
  65. package/dist/utils/confirm.d.ts.map +1 -0
  66. package/dist/utils/confirm.js +124 -0
  67. package/dist/utils/confirm.js.map +1 -0
  68. package/dist/utils/defaults.d.ts +39 -0
  69. package/dist/utils/defaults.d.ts.map +1 -0
  70. package/dist/utils/defaults.js +195 -0
  71. package/dist/utils/defaults.js.map +1 -0
  72. package/dist/utils/errors.d.ts +67 -0
  73. package/dist/utils/errors.d.ts.map +1 -0
  74. package/dist/utils/errors.js +395 -0
  75. package/dist/utils/errors.js.map +1 -0
  76. package/dist/utils/interactive.d.ts +97 -0
  77. package/dist/utils/interactive.d.ts.map +1 -0
  78. package/dist/utils/interactive.js +265 -0
  79. package/dist/utils/interactive.js.map +1 -0
  80. package/dist/utils/output.d.ts +72 -2
  81. package/dist/utils/output.d.ts.map +1 -1
  82. package/dist/utils/output.js +383 -37
  83. package/dist/utils/output.js.map +1 -1
  84. package/dist/utils/progress.d.ts +139 -0
  85. package/dist/utils/progress.d.ts.map +1 -0
  86. package/dist/utils/progress.js +216 -0
  87. package/dist/utils/progress.js.map +1 -0
  88. package/package.json +3 -1
@@ -1,22 +1,37 @@
1
1
  import { Command } from 'commander';
2
2
  import ora from 'ora';
3
+ import { pollUntilComplete, BatchProgress } from '../utils/progress.js';
4
+ import { displayError, validate } from '../utils/errors.js';
5
+ import { confirmDelete } from '../utils/confirm.js';
6
+ import { autoDetectList } from '../utils/defaults.js';
3
7
  export function createContactsCommand(client, formatter) {
4
8
  const contacts = new Command('contacts')
5
9
  .description('Manage contacts in lists');
6
10
  // List contacts
7
11
  contacts
8
- .command('list <list-id>')
9
- .description('List contacts in a list')
12
+ .command('list [list-id]')
13
+ .description('List contacts in a list (auto-detects if only one list exists)')
10
14
  .option('-l, --limit <number>', 'Limit number of results')
11
15
  .option('-p, --page <number>', 'Page number')
12
16
  .option('-q, --query <query>', 'Search query')
13
17
  .option('--sort <sort>', 'Sort by field: +email, -subscribed_on, +status, etc.')
14
18
  .option('--filter <filter>', 'Filter (e.g., "status==active;email==user@example.com")')
15
19
  .action(async (listId, options) => {
20
+ // Auto-detect list ID if not provided
21
+ const detectedListId = await autoDetectList(client, formatter, listId, { useCache: true });
22
+ if (!detectedListId) {
23
+ process.exit(1);
24
+ }
25
+ // Validate list ID
26
+ const validation = validate.id(detectedListId, 'List ID');
27
+ if (!validation.valid) {
28
+ formatter.error(validation.error);
29
+ process.exit(1);
30
+ }
16
31
  const spinner = ora('Fetching contacts...').start();
17
32
  try {
18
33
  const params = {
19
- list_id: parseInt(listId),
34
+ list_id: detectedListId,
20
35
  };
21
36
  if (options.limit)
22
37
  params.per_page = parseInt(options.limit);
@@ -34,7 +49,12 @@ export function createContactsCommand(client, formatter) {
34
49
  }
35
50
  catch (error) {
36
51
  spinner.stop();
37
- formatter.error(error.message);
52
+ displayError(error, {
53
+ command: 'contacts list',
54
+ resource: 'list',
55
+ resourceId: detectedListId,
56
+ operation: 'fetch contacts'
57
+ });
38
58
  process.exit(1);
39
59
  }
40
60
  });
@@ -43,6 +63,17 @@ export function createContactsCommand(client, formatter) {
43
63
  .command('get <list-id> <contact-id>')
44
64
  .description('Get contact details')
45
65
  .action(async (listId, contactId) => {
66
+ // Validate IDs
67
+ const listValidation = validate.id(listId, 'List ID');
68
+ if (!listValidation.valid) {
69
+ formatter.error(listValidation.error);
70
+ process.exit(1);
71
+ }
72
+ const contactValidation = validate.id(contactId, 'Contact ID');
73
+ if (!contactValidation.valid) {
74
+ formatter.error(contactValidation.error);
75
+ process.exit(1);
76
+ }
46
77
  const spinner = ora(`Fetching contact ${contactId}...`).start();
47
78
  try {
48
79
  const data = await client.sdk.contacts.get(parseInt(contactId));
@@ -51,24 +82,54 @@ export function createContactsCommand(client, formatter) {
51
82
  }
52
83
  catch (error) {
53
84
  spinner.stop();
54
- formatter.error(error.message);
85
+ displayError(error, {
86
+ command: 'contacts get',
87
+ resource: 'contact',
88
+ resourceId: contactId,
89
+ operation: 'fetch'
90
+ });
55
91
  process.exit(1);
56
92
  }
57
93
  });
58
94
  // Add contact
59
95
  contacts
60
- .command('add <list-id>')
61
- .description('Add a contact to a list')
96
+ .command('add [list-id]')
97
+ .description('Add a contact to a list (auto-detects if only one list exists)')
62
98
  .requiredOption('-e, --email <email>', 'Contact email')
63
99
  .option('-f, --first-name <name>', 'First name')
64
100
  .option('-l, --last-name <name>', 'Last name')
65
101
  .option('-d, --data <json>', 'Custom attributes as JSON')
66
102
  .action(async (listId, options) => {
103
+ // Auto-detect list ID if not provided
104
+ const detectedListId = await autoDetectList(client, formatter, listId, { useCache: true });
105
+ if (!detectedListId) {
106
+ process.exit(1);
107
+ }
108
+ // Validate list ID
109
+ const listValidation = validate.id(detectedListId, 'List ID');
110
+ if (!listValidation.valid) {
111
+ formatter.error(listValidation.error);
112
+ process.exit(1);
113
+ }
114
+ // Validate email
115
+ const emailValidation = validate.email(options.email);
116
+ if (!emailValidation.valid) {
117
+ formatter.error(emailValidation.error);
118
+ process.exit(1);
119
+ }
120
+ // Validate JSON if provided
121
+ if (options.data) {
122
+ const jsonValidation = validate.json(options.data, 'Custom attributes');
123
+ if (!jsonValidation.valid) {
124
+ formatter.error(jsonValidation.error);
125
+ process.exit(1);
126
+ }
127
+ }
67
128
  const spinner = ora('Adding contact...').start();
68
129
  try {
69
130
  const payload = {
70
131
  email: options.email,
71
- list_ids: [parseInt(listId)],
132
+ list_ids: [detectedListId],
72
133
  };
73
134
  if (options.firstName)
74
135
  payload.first_name = options.firstName;
@@ -84,7 +145,12 @@ export function createContactsCommand(client, formatter) {
84
145
  }
85
146
  catch (error) {
86
147
  spinner.stop();
87
- formatter.error(error.message);
148
+ displayError(error, {
149
+ command: 'contacts add',
150
+ resource: 'list',
151
+ resourceId: detectedListId.toString(),
152
+ operation: 'add contact'
153
+ });
88
154
  process.exit(1);
89
155
  }
90
156
  });
@@ -97,6 +163,33 @@ export function createContactsCommand(client, formatter) {
97
163
  .option('-l, --last-name <name>', 'Last name')
98
164
  .option('-d, --data <json>', 'Custom attributes as JSON')
99
165
  .action(async (listId, contactId, options) => {
166
+ // Validate IDs
167
+ const listValidation = validate.id(listId, 'List ID');
168
+ if (!listValidation.valid) {
169
+ formatter.error(listValidation.error);
170
+ process.exit(1);
171
+ }
172
+ const contactValidation = validate.id(contactId, 'Contact ID');
173
+ if (!contactValidation.valid) {
174
+ formatter.error(contactValidation.error);
175
+ process.exit(1);
176
+ }
177
+ // Validate email if provided
178
+ if (options.email) {
179
+ const emailValidation = validate.email(options.email);
180
+ if (!emailValidation.valid) {
181
+ formatter.error(emailValidation.error);
182
+ process.exit(1);
183
+ }
184
+ }
185
+ // Validate JSON if provided
186
+ if (options.data) {
187
+ const jsonValidation = validate.json(options.data, 'Custom attributes');
188
+ if (!jsonValidation.valid) {
189
+ formatter.error(jsonValidation.error);
190
+ process.exit(1);
191
+ }
192
+ }
100
193
  const spinner = ora('Updating contact...').start();
101
194
  try {
102
195
  const payload = {};
@@ -116,7 +209,12 @@ export function createContactsCommand(client, formatter) {
116
209
  }
117
210
  catch (error) {
118
211
  spinner.stop();
119
- formatter.error(error.message);
212
+ displayError(error, {
213
+ command: 'contacts update',
214
+ resource: 'contact',
215
+ resourceId: contactId,
216
+ operation: 'update'
217
+ });
120
218
  process.exit(1);
121
219
  }
122
220
  });
@@ -124,12 +222,30 @@ export function createContactsCommand(client, formatter) {
124
222
  contacts
125
223
  .command('delete <list-id> <contact-id>')
126
224
  .description('Delete a contact')
127
- .option('-f, --force', 'Skip confirmation')
225
+ .option('-f, --force', 'Skip confirmation prompt')
128
226
  .action(async (listId, contactId, options) => {
129
- if (!options.force) {
130
- formatter.info('Use --force to confirm deletion');
227
+ // Validate IDs
228
+ const listValidation = validate.id(listId, 'List ID');
229
+ if (!listValidation.valid) {
230
+ formatter.error(listValidation.error);
131
231
  process.exit(1);
132
232
  }
233
+ const contactValidation = validate.id(contactId, 'Contact ID');
234
+ if (!contactValidation.valid) {
235
+ formatter.error(contactValidation.error);
236
+ process.exit(1);
237
+ }
238
+ // Interactive confirmation (unless --force is used)
239
+ if (!options.force) {
240
+ const confirmed = await confirmDelete('contact', contactId, [
241
+ 'Contact will be permanently deleted from this list',
242
+ 'Contact history and data will be lost'
243
+ ]);
244
+ if (!confirmed) {
245
+ formatter.info('Deletion cancelled');
246
+ return;
247
+ }
248
+ }
133
249
  const spinner = ora(`Deleting contact ${contactId}...`).start();
134
250
  try {
135
251
  await client.sdk.contacts.delete(parseInt(contactId));
@@ -138,7 +254,12 @@ export function createContactsCommand(client, formatter) {
138
254
  }
139
255
  catch (error) {
140
256
  spinner.stop();
141
- formatter.error(error.message);
257
+ displayError(error, {
258
+ command: 'contacts delete',
259
+ resource: 'contact',
260
+ resourceId: contactId,
261
+ operation: 'delete'
262
+ });
142
263
  process.exit(1);
143
264
  }
144
265
  });
@@ -147,6 +268,17 @@ export function createContactsCommand(client, formatter) {
147
268
  .command('unsubscribe <list-id> <contact-id>')
148
269
  .description('Unsubscribe a contact from a list')
149
270
  .action(async (listId, contactId) => {
271
+ // Validate IDs
272
+ const listValidation = validate.id(listId, 'List ID');
273
+ if (!listValidation.valid) {
274
+ formatter.error(listValidation.error);
275
+ process.exit(1);
276
+ }
277
+ const contactValidation = validate.id(contactId, 'Contact ID');
278
+ if (!contactValidation.valid) {
279
+ formatter.error(contactValidation.error);
280
+ process.exit(1);
281
+ }
150
282
  const spinner = ora(`Unsubscribing contact ${contactId}...`).start();
151
283
  try {
152
284
  await client.sdk.contacts.unsubscribe(parseInt(contactId), parseInt(listId));
@@ -155,6 +287,296 @@ export function createContactsCommand(client, formatter) {
155
287
  }
156
288
  catch (error) {
157
289
  spinner.stop();
290
+ displayError(error, {
291
+ command: 'contacts unsubscribe',
292
+ resource: 'contact',
293
+ resourceId: contactId,
294
+ operation: 'unsubscribe'
295
+ });
296
+ process.exit(1);
297
+ }
298
+ });
299
+ // Import contacts - TODO: Implement CSV/JSON parsing
300
+ // The SDK expects structured ImportContactData[], not raw file content
301
+ // Need to add CSV/JSON parser and convert to proper format
302
+ // contacts
303
+ // .command('import <list-id>')
304
+ // .description('Import contacts from a file')
305
+ // .requiredOption('-f, --file <path>', 'CSV or JSON file path')
306
+ // .option('--update-existing', 'Update existing contacts')
307
+ // .action(async (listId, options) => {
308
+ // // TODO: Parse CSV/JSON file and convert to ImportContactData[]
309
+ // });
310
+ // Export contacts
311
+ contacts
312
+ .command('export [list-id]')
313
+ .description('Create and download a contacts export (auto-detects if only one list exists)')
314
+ .option('--status <status>', 'Filter by status (subscribed, unsubscribed, etc.)')
315
+ .option('--no-wait', 'Create export without waiting for completion')
316
+ .action(async (listId, options) => {
317
+ // Auto-detect list ID if not provided
318
+ const detectedListId = await autoDetectList(client, formatter, listId, { useCache: true });
319
+ if (!detectedListId) {
320
+ process.exit(1);
321
+ }
322
+ try {
323
+ const params = {
324
+ listId: detectedListId
325
+ };
326
+ if (options.status)
327
+ params.filter = `status==${options.status}`;
328
+ // Create the export
329
+ const spinner = ora('Creating contacts export...').start();
330
+ const exportResponse = await client.sdk.contactService.exportContacts(params);
331
+ spinner.succeed('Export job created');
332
+ const exportId = exportResponse.data?.id;
333
+ if (!exportId) {
334
+ formatter.error('Export ID not returned');
335
+ process.exit(1);
336
+ }
337
+ // If --no-wait flag is set, just show the export ID
338
+ if (options.wait === false) {
339
+ formatter.info(`Export ID: ${exportId}`);
340
+ formatter.info(`Check status with: cakemail contacts export-get ${detectedListId} ${exportId}`);
341
+ formatter.output(exportResponse);
342
+ return;
343
+ }
344
+ // Poll until export is ready
345
+ const result = await pollUntilComplete(async () => {
346
+ const status = await client.sdk.contactService.getContactsExport({
347
+ listId: detectedListId,
348
+ exportId: exportId
349
+ });
350
+ const exportStatus = status.data?.status;
351
+ const complete = exportStatus === 'ready' || exportStatus === 'failed';
352
+ return {
353
+ complete,
354
+ status: exportStatus === 'ready'
355
+ ? 'Export ready'
356
+ : `Export ${exportStatus || 'processing'}...`,
357
+ data: status
358
+ };
359
+ }, 'Waiting for export to complete...', { checkInterval: 2000, maxAttempts: 60 });
360
+ if (result.data?.status === 'ready') {
361
+ formatter.info(`Export completed. Download with: cakemail contacts export-download ${detectedListId} ${exportId}`);
362
+ formatter.output(result);
363
+ }
364
+ else {
365
+ formatter.error('Export failed');
366
+ formatter.output(result);
367
+ process.exit(1);
368
+ }
369
+ }
370
+ catch (error) {
371
+ formatter.error(error.message);
372
+ process.exit(1);
373
+ }
374
+ });
375
+ // List exports
376
+ contacts
377
+ .command('exports [list-id]')
378
+ .description('List contact exports for a list (auto-detects if only one list exists)')
379
+ .option('-l, --limit <number>', 'Limit number of results')
380
+ .option('-p, --page <number>', 'Page number')
381
+ .action(async (listId, options) => {
382
+ // Auto-detect list ID if not provided
383
+ const detectedListId = await autoDetectList(client, formatter, listId, { useCache: true });
384
+ if (!detectedListId) {
385
+ process.exit(1);
386
+ }
387
+ const spinner = ora('Fetching exports...').start();
388
+ try {
389
+ const params = {
390
+ listId: detectedListId
391
+ };
392
+ if (options.limit)
393
+ params.per_page = parseInt(options.limit);
394
+ if (options.page)
395
+ params.page = parseInt(options.page);
396
+ const data = await client.sdk.contactService.listContactsExports(params);
397
+ spinner.stop();
398
+ formatter.output(data);
399
+ }
400
+ catch (error) {
401
+ spinner.stop();
402
+ formatter.error(error.message);
403
+ process.exit(1);
404
+ }
405
+ });
406
+ // Get export
407
+ contacts
408
+ .command('export-get <list-id> <export-id>')
409
+ .description('Get a contacts export status')
410
+ .action(async (listId, exportId) => {
411
+ const spinner = ora(`Fetching export ${exportId}...`).start();
412
+ try {
413
+ const data = await client.sdk.contactService.getContactsExport({
414
+ listId: parseInt(listId),
415
+ exportId: exportId
416
+ });
417
+ spinner.stop();
418
+ formatter.output(data);
419
+ }
420
+ catch (error) {
421
+ spinner.stop();
422
+ formatter.error(error.message);
423
+ process.exit(1);
424
+ }
425
+ });
426
+ // Download export
427
+ contacts
428
+ .command('export-download <list-id> <export-id>')
429
+ .description('Download a contacts export')
430
+ .action(async (listId, exportId) => {
431
+ const spinner = ora(`Downloading export ${exportId}...`).start();
432
+ try {
433
+ const data = await client.sdk.contactService.downloadContactsExport({
434
+ listId: parseInt(listId),
435
+ exportId: exportId
436
+ });
437
+ spinner.stop();
438
+ formatter.success('Export downloaded');
439
+ formatter.output(data);
440
+ }
441
+ catch (error) {
442
+ spinner.stop();
443
+ formatter.error(error.message);
444
+ process.exit(1);
445
+ }
446
+ });
447
+ // Delete export
448
+ contacts
449
+ .command('export-delete <list-id> <export-id>')
450
+ .description('Delete a contacts export')
451
+ .option('-f, --force', 'Skip confirmation prompt')
452
+ .action(async (listId, exportId, options) => {
453
+ // Interactive confirmation (unless --force is used)
454
+ if (!options.force) {
455
+ const confirmed = await confirmDelete('contacts export', exportId, [
456
+ 'Export file will be permanently deleted'
457
+ ]);
458
+ if (!confirmed) {
459
+ formatter.info('Deletion cancelled');
460
+ return;
461
+ }
462
+ }
463
+ const spinner = ora(`Deleting export ${exportId}...`).start();
464
+ try {
465
+ await client.sdk.contactService.deleteContactsExport({
466
+ listId: parseInt(listId),
467
+ exportId: exportId
468
+ });
469
+ spinner.stop();
470
+ formatter.success(`Export ${exportId} deleted`);
471
+ }
472
+ catch (error) {
473
+ spinner.stop();
474
+ formatter.error(error.message);
475
+ process.exit(1);
476
+ }
477
+ });
478
+ // Tag single contact
479
+ contacts
480
+ .command('tag <list-id> <contact-id>')
481
+ .description('Tag a contact')
482
+ .requiredOption('-t, --tags <tags>', 'Comma-separated tags')
483
+ .action(async (listId, contactId, options) => {
484
+ const spinner = ora(`Tagging contact ${contactId}...`).start();
485
+ try {
486
+ const tags = options.tags.split(',').map((t) => t.trim());
487
+ await client.sdk.contactService.tagContact({
488
+ listId: parseInt(listId),
489
+ contactId: parseInt(contactId),
490
+ requestBody: { tags }
491
+ });
492
+ spinner.stop();
493
+ formatter.success(`Contact ${contactId} tagged`);
494
+ }
495
+ catch (error) {
496
+ spinner.stop();
497
+ formatter.error(error.message);
498
+ process.exit(1);
499
+ }
500
+ });
501
+ // Untag single contact
502
+ contacts
503
+ .command('untag <list-id> <contact-id>')
504
+ .description('Remove tags from a contact')
505
+ .requiredOption('-t, --tags <tags>', 'Comma-separated tags to remove')
506
+ .action(async (listId, contactId, options) => {
507
+ const spinner = ora(`Untagging contact ${contactId}...`).start();
508
+ try {
509
+ const tags = options.tags.split(',').map((t) => t.trim());
510
+ await client.sdk.contactService.untagContact({
511
+ listId: parseInt(listId),
512
+ contactId: parseInt(contactId),
513
+ requestBody: { tags }
514
+ });
515
+ spinner.stop();
516
+ formatter.success(`Tags removed from contact ${contactId}`);
517
+ }
518
+ catch (error) {
519
+ spinner.stop();
520
+ formatter.error(error.message);
521
+ process.exit(1);
522
+ }
523
+ });
524
+ // Tag multiple contacts
525
+ contacts
526
+ .command('tag-bulk <list-id>')
527
+ .description('Tag multiple contacts')
528
+ .requiredOption('-c, --contacts <ids>', 'Comma-separated contact IDs')
529
+ .requiredOption('-t, --tags <tags>', 'Comma-separated tags')
530
+ .action(async (listId, options) => {
531
+ try {
532
+ const contactIds = options.contacts.split(',').map((id) => parseInt(id.trim()));
533
+ const tags = options.tags.split(',').map((t) => t.trim());
534
+ const progress = new BatchProgress({
535
+ total: contactIds.length,
536
+ current: 0,
537
+ operation: `Tagging ${contactIds.length} contact${contactIds.length > 1 ? 's' : ''}`
538
+ });
539
+ await client.sdk.contactService.tagMultipleContacts({
540
+ listId: parseInt(listId),
541
+ requestBody: {
542
+ contact_ids: contactIds,
543
+ tags
544
+ }
545
+ });
546
+ progress.increment(contactIds.length);
547
+ progress.complete(`Successfully tagged ${contactIds.length} contact${contactIds.length > 1 ? 's' : ''}`);
548
+ }
549
+ catch (error) {
550
+ formatter.error(error.message);
551
+ process.exit(1);
552
+ }
553
+ });
554
+ // Untag multiple contacts
555
+ contacts
556
+ .command('untag-bulk <list-id>')
557
+ .description('Remove tags from multiple contacts')
558
+ .requiredOption('-c, --contacts <ids>', 'Comma-separated contact IDs')
559
+ .requiredOption('-t, --tags <tags>', 'Comma-separated tags to remove')
560
+ .action(async (listId, options) => {
561
+ try {
562
+ const contactIds = options.contacts.split(',').map((id) => parseInt(id.trim()));
563
+ const tags = options.tags.split(',').map((t) => t.trim());
564
+ const progress = new BatchProgress({
565
+ total: contactIds.length,
566
+ current: 0,
567
+ operation: `Untagging ${contactIds.length} contact${contactIds.length > 1 ? 's' : ''}`
568
+ });
569
+ await client.sdk.contactService.untagMultipleContacts({
570
+ listId: parseInt(listId),
571
+ requestBody: {
572
+ contact_ids: contactIds,
573
+ tags
574
+ }
575
+ });
576
+ progress.increment(contactIds.length);
577
+ progress.complete(`Successfully untagged ${contactIds.length} contact${contactIds.length > 1 ? 's' : ''}`);
578
+ }
579
+ catch (error) {
158
580
  formatter.error(error.message);
159
581
  process.exit(1);
160
582
  }
@@ -1 +1 @@
1
- {"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../src/commands/contacts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../src/commands/contacts.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"emails.d.ts","sourceRoot":"","sources":["../../src/commands/emails.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAIrD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,GAAG,OAAO,CA8I/F"}
1
+ {"version":3,"file":"emails.d.ts","sourceRoot":"","sources":["../../src/commands/emails.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAIrD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,GAAG,OAAO,CA8L/F"}
@@ -135,6 +135,59 @@ export function createEmailsCommand(client, formatter) {
135
135
  process.exit(1);
136
136
  }
137
137
  });
138
+ // Email API logs
139
+ emails
140
+ .command('logs')
141
+ .description('Get Email API activity logs')
142
+ .option('--from <date>', 'Start date (YYYY-MM-DD)')
143
+ .option('--to <date>', 'End date (YYYY-MM-DD)')
144
+ .option('--tag <tag>', 'Filter by tag')
145
+ .option('--status <status>', 'Filter by status (delivered, bounced, etc.)')
146
+ .option('-l, --limit <number>', 'Limit number of results')
147
+ .option('-p, --page <number>', 'Page number')
148
+ .action(async (options) => {
149
+ const spinner = ora('Fetching Email API logs...').start();
150
+ try {
151
+ const params = {};
152
+ if (options.from)
153
+ params.from = options.from;
154
+ if (options.to)
155
+ params.to = options.to;
156
+ if (options.tag)
157
+ params.tag = options.tag;
158
+ if (options.status)
159
+ params.status = options.status;
160
+ if (options.limit)
161
+ params.perPage = parseInt(options.limit);
162
+ if (options.page)
163
+ params.page = parseInt(options.page);
164
+ const data = await client.sdk.emailApiService.getEmailApiLogs(params);
165
+ spinner.stop();
166
+ formatter.output(data);
167
+ }
168
+ catch (error) {
169
+ spinner.stop();
170
+ formatter.error(error.message);
171
+ process.exit(1);
172
+ }
173
+ });
174
+ // List email tags
175
+ emails
176
+ .command('tags')
177
+ .description('List all email tags')
178
+ .action(async () => {
179
+ const spinner = ora('Fetching email tags...').start();
180
+ try {
181
+ const data = await client.sdk.emailApiService.listEmailTags({});
182
+ spinner.stop();
183
+ formatter.output(data);
184
+ }
185
+ catch (error) {
186
+ spinner.stop();
187
+ formatter.error(error.message);
188
+ process.exit(1);
189
+ }
190
+ });
138
191
  return emails;
139
192
  }
140
193
  //# sourceMappingURL=emails.js.map