@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
@@ -0,0 +1,334 @@
1
+ import { Command } from 'commander';
2
+ import ora from 'ora';
3
+ import { pollUntilComplete } from '../utils/progress.js';
4
+ import { displayError, validate } from '../utils/errors.js';
5
+ import { confirmDelete } from '../utils/confirm.js';
6
+ export function createReportsCommand(client, formatter) {
7
+ const reports = new Command('reports')
8
+ .description('View analytics and reports');
9
+ // Campaign report
10
+ reports
11
+ .command('campaign <id>')
12
+ .description('Get campaign analytics and statistics')
13
+ .action(async (id) => {
14
+ // Validate ID
15
+ const validation = validate.id(id, 'Campaign ID');
16
+ if (!validation.valid) {
17
+ formatter.error(validation.error);
18
+ process.exit(1);
19
+ }
20
+ const spinner = ora(`Fetching campaign ${id} report...`).start();
21
+ try {
22
+ const data = await client.sdk.reportService.getCampaignStats({ campaignId: parseInt(id) });
23
+ spinner.stop();
24
+ formatter.output(data);
25
+ }
26
+ catch (error) {
27
+ spinner.stop();
28
+ displayError(error, {
29
+ command: 'reports campaign',
30
+ resource: 'campaign',
31
+ resourceId: id,
32
+ operation: 'fetch report'
33
+ });
34
+ process.exit(1);
35
+ }
36
+ });
37
+ // Campaign links report
38
+ reports
39
+ .command('campaign-links <id>')
40
+ .description('Get campaign link click analytics')
41
+ .action(async (id) => {
42
+ // Validate ID
43
+ const validation = validate.id(id, 'Campaign ID');
44
+ if (!validation.valid) {
45
+ formatter.error(validation.error);
46
+ process.exit(1);
47
+ }
48
+ const spinner = ora(`Fetching link analytics for campaign ${id}...`).start();
49
+ try {
50
+ const data = await client.sdk.reportService.getCampaignLinksStats({ campaignId: parseInt(id) });
51
+ spinner.stop();
52
+ formatter.output(data);
53
+ }
54
+ catch (error) {
55
+ spinner.stop();
56
+ displayError(error, {
57
+ command: 'reports campaign-links',
58
+ resource: 'campaign',
59
+ resourceId: id,
60
+ operation: 'fetch link analytics'
61
+ });
62
+ process.exit(1);
63
+ }
64
+ });
65
+ // List report
66
+ reports
67
+ .command('list <id>')
68
+ .description('Get list analytics and statistics')
69
+ .action(async (id) => {
70
+ // Validate ID
71
+ const validation = validate.id(id, 'List ID');
72
+ if (!validation.valid) {
73
+ formatter.error(validation.error);
74
+ process.exit(1);
75
+ }
76
+ const spinner = ora(`Fetching list ${id} report...`).start();
77
+ try {
78
+ const data = await client.sdk.reportService.getListStats({ listId: parseInt(id) });
79
+ spinner.stop();
80
+ formatter.output(data);
81
+ }
82
+ catch (error) {
83
+ spinner.stop();
84
+ displayError(error, {
85
+ command: 'reports list',
86
+ resource: 'list',
87
+ resourceId: id,
88
+ operation: 'fetch report'
89
+ });
90
+ process.exit(1);
91
+ }
92
+ });
93
+ // Account report
94
+ reports
95
+ .command('account')
96
+ .description('Get account-wide analytics and statistics')
97
+ .action(async () => {
98
+ const spinner = ora('Fetching account report...').start();
99
+ try {
100
+ const data = await client.sdk.reportService.getSelfAccountStats({});
101
+ spinner.stop();
102
+ formatter.output(data);
103
+ }
104
+ catch (error) {
105
+ spinner.stop();
106
+ formatter.error(error.message);
107
+ process.exit(1);
108
+ }
109
+ });
110
+ // Email API stats
111
+ reports
112
+ .command('emails')
113
+ .description('Get Email API statistics')
114
+ .option('--from <date>', 'Start date (YYYY-MM-DD)')
115
+ .option('--to <date>', 'End date (YYYY-MM-DD)')
116
+ .action(async (options) => {
117
+ const spinner = ora('Fetching email statistics...').start();
118
+ try {
119
+ const params = {};
120
+ if (options.from)
121
+ params.from = options.from;
122
+ if (options.to)
123
+ params.to = options.to;
124
+ const data = await client.sdk.emailApiService.getEmailApiStats(params);
125
+ spinner.stop();
126
+ formatter.output(data);
127
+ }
128
+ catch (error) {
129
+ spinner.stop();
130
+ formatter.error(error.message);
131
+ process.exit(1);
132
+ }
133
+ });
134
+ // Email API summary
135
+ reports
136
+ .command('emails-summary')
137
+ .description('Get Email API activity summary')
138
+ .option('--from <date>', 'Start date (YYYY-MM-DD)')
139
+ .option('--to <date>', 'End date (YYYY-MM-DD)')
140
+ .action(async (options) => {
141
+ const spinner = ora('Fetching email activity summary...').start();
142
+ try {
143
+ const params = {};
144
+ if (options.from)
145
+ params.from = options.from;
146
+ if (options.to)
147
+ params.to = options.to;
148
+ const data = await client.sdk.emailApiService.getEmailApiSummary(params);
149
+ spinner.stop();
150
+ formatter.output(data);
151
+ }
152
+ catch (error) {
153
+ spinner.stop();
154
+ formatter.error(error.message);
155
+ process.exit(1);
156
+ }
157
+ });
158
+ // Transactional email stats
159
+ reports
160
+ .command('transactional-emails')
161
+ .description('Get transactional email statistics')
162
+ .option('--from <date>', 'Start date (YYYY-MM-DD)')
163
+ .option('--to <date>', 'End date (YYYY-MM-DD)')
164
+ .action(async (options) => {
165
+ const spinner = ora('Fetching transactional email statistics...').start();
166
+ try {
167
+ const params = {};
168
+ if (options.from)
169
+ params.from = options.from;
170
+ if (options.to)
171
+ params.to = options.to;
172
+ const data = await client.sdk.transactionalEmailService.getEmailsStats(params);
173
+ spinner.stop();
174
+ formatter.output(data);
175
+ }
176
+ catch (error) {
177
+ spinner.stop();
178
+ formatter.error(error.message);
179
+ process.exit(1);
180
+ }
181
+ });
182
+ // List campaigns exports
183
+ reports
184
+ .command('campaigns-exports')
185
+ .description('List campaign report exports')
186
+ .option('-l, --limit <number>', 'Limit number of results')
187
+ .option('-p, --page <number>', 'Page number')
188
+ .action(async (options) => {
189
+ const spinner = ora('Fetching campaign report exports...').start();
190
+ try {
191
+ const params = {};
192
+ if (options.limit)
193
+ params.per_page = parseInt(options.limit);
194
+ if (options.page)
195
+ params.page = parseInt(options.page);
196
+ const data = await client.sdk.reportService.listCampaignsReportsExports(params);
197
+ spinner.stop();
198
+ formatter.output(data);
199
+ }
200
+ catch (error) {
201
+ spinner.stop();
202
+ formatter.error(error.message);
203
+ process.exit(1);
204
+ }
205
+ });
206
+ // Create campaigns export
207
+ reports
208
+ .command('export-campaigns')
209
+ .description('Create and download a campaigns report export')
210
+ .option('--from <date>', 'Start date (YYYY-MM-DD)')
211
+ .option('--to <date>', 'End date (YYYY-MM-DD)')
212
+ .option('--status <status>', 'Filter by status')
213
+ .option('--no-wait', 'Create export without waiting for completion')
214
+ .action(async (options) => {
215
+ try {
216
+ const params = {};
217
+ if (options.from)
218
+ params.from = options.from;
219
+ if (options.to)
220
+ params.to = options.to;
221
+ if (options.status)
222
+ params.status = options.status;
223
+ // Create the export
224
+ const spinner = ora('Creating campaign report export...').start();
225
+ const exportResponse = await client.sdk.reportService.createCampaignsReportsExport({ requestBody: params });
226
+ spinner.succeed('Export job created');
227
+ const exportId = exportResponse.data?.id;
228
+ if (!exportId) {
229
+ formatter.error('Export ID not returned');
230
+ process.exit(1);
231
+ }
232
+ // If --no-wait flag is set, just show the export ID
233
+ if (options.wait === false) {
234
+ formatter.info(`Export ID: ${exportId}`);
235
+ formatter.info(`Check status with: cakemail reports campaigns-export ${exportId}`);
236
+ formatter.output(exportResponse);
237
+ return;
238
+ }
239
+ // Poll until export is ready
240
+ const result = await pollUntilComplete(async () => {
241
+ const status = await client.sdk.reportService.getCampaignsReportsExport({
242
+ exportId: exportId
243
+ });
244
+ const exportStatus = status.data?.status;
245
+ const complete = exportStatus === 'ready' || exportStatus === 'error';
246
+ return {
247
+ complete,
248
+ status: exportStatus === 'ready'
249
+ ? 'Export ready'
250
+ : `Export ${exportStatus || 'processing'}...`,
251
+ data: status
252
+ };
253
+ }, 'Waiting for export to complete...', { checkInterval: 2000, maxAttempts: 60 });
254
+ if (result.data?.status === 'ready') {
255
+ formatter.info(`Export completed. Download with: cakemail reports download-campaigns-export ${exportId}`);
256
+ formatter.output(result);
257
+ }
258
+ else {
259
+ formatter.error('Export failed');
260
+ formatter.output(result);
261
+ process.exit(1);
262
+ }
263
+ }
264
+ catch (error) {
265
+ formatter.error(error.message);
266
+ process.exit(1);
267
+ }
268
+ });
269
+ // Get campaigns export
270
+ reports
271
+ .command('campaigns-export <id>')
272
+ .description('Get a campaigns report export status')
273
+ .action(async (id) => {
274
+ const spinner = ora(`Fetching export ${id}...`).start();
275
+ try {
276
+ const data = await client.sdk.reportService.getCampaignsReportsExport({ exportId: id });
277
+ spinner.stop();
278
+ formatter.output(data);
279
+ }
280
+ catch (error) {
281
+ spinner.stop();
282
+ formatter.error(error.message);
283
+ process.exit(1);
284
+ }
285
+ });
286
+ // Download campaigns export
287
+ reports
288
+ .command('download-campaigns-export <id>')
289
+ .description('Download a campaigns report export')
290
+ .action(async (id) => {
291
+ const spinner = ora(`Downloading export ${id}...`).start();
292
+ try {
293
+ const data = await client.sdk.reportService.downloadCampaignsReportsExport({ exportId: id });
294
+ spinner.stop();
295
+ formatter.success('Export downloaded');
296
+ formatter.output(data);
297
+ }
298
+ catch (error) {
299
+ spinner.stop();
300
+ formatter.error(error.message);
301
+ process.exit(1);
302
+ }
303
+ });
304
+ // Delete campaigns export
305
+ reports
306
+ .command('delete-campaigns-export <id>')
307
+ .description('Delete a campaigns report export')
308
+ .option('-f, --force', 'Skip confirmation prompt')
309
+ .action(async (id, options) => {
310
+ // Interactive confirmation (unless --force is used)
311
+ if (!options.force) {
312
+ const confirmed = await confirmDelete('campaigns report export', id, [
313
+ 'Export file will be permanently deleted'
314
+ ]);
315
+ if (!confirmed) {
316
+ formatter.info('Deletion cancelled');
317
+ return;
318
+ }
319
+ }
320
+ const spinner = ora(`Deleting export ${id}...`).start();
321
+ try {
322
+ await client.sdk.reportService.deleteCampaignsReportsExport({ exportId: id });
323
+ spinner.stop();
324
+ formatter.success(`Export ${id} deleted`);
325
+ }
326
+ catch (error) {
327
+ spinner.stop();
328
+ formatter.error(error.message);
329
+ process.exit(1);
330
+ }
331
+ });
332
+ return reports;
333
+ }
334
+ //# sourceMappingURL=reports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reports.js","sourceRoot":"","sources":["../../src/commands/reports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Command } from 'commander';
2
+ import { CakemailClient } from '../client.js';
3
+ import { OutputFormatter } from '../utils/output.js';
4
+ export declare function createSegmentsCommand(client: CakemailClient, formatter: OutputFormatter): Command;
5
+ //# sourceMappingURL=segments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segments.d.ts","sourceRoot":"","sources":["../../src/commands/segments.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;AAKrD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,GAAG,OAAO,CAmNjG"}
@@ -0,0 +1,203 @@
1
+ import { Command } from 'commander';
2
+ import ora from 'ora';
3
+ import { confirmDelete } from '../utils/confirm.js';
4
+ import { autoDetectList } from '../utils/defaults.js';
5
+ export function createSegmentsCommand(client, formatter) {
6
+ const segments = new Command('segments')
7
+ .description('Manage contact segments');
8
+ // List segments
9
+ segments
10
+ .command('list [list-id]')
11
+ .description('List all segments in a list (auto-detects if only one list exists)')
12
+ .option('-l, --limit <number>', 'Limit number of results')
13
+ .option('-p, --page <number>', 'Page number')
14
+ .action(async (listId, options) => {
15
+ // Auto-detect list ID if not provided
16
+ const detectedListId = await autoDetectList(client, formatter, listId, { useCache: true });
17
+ if (!detectedListId) {
18
+ process.exit(1);
19
+ }
20
+ const spinner = ora('Fetching segments...').start();
21
+ try {
22
+ const params = {
23
+ listId: detectedListId
24
+ };
25
+ if (options.limit)
26
+ params.per_page = parseInt(options.limit);
27
+ if (options.page)
28
+ params.page = parseInt(options.page);
29
+ const data = await client.sdk.segmentService.listSegments(params);
30
+ spinner.stop();
31
+ formatter.output(data);
32
+ }
33
+ catch (error) {
34
+ spinner.stop();
35
+ formatter.error(error.message);
36
+ process.exit(1);
37
+ }
38
+ });
39
+ // Get segment
40
+ segments
41
+ .command('get [list-id] <segment-id>')
42
+ .description('Get segment details (auto-detects if only one list exists)')
43
+ .action(async (listId, segmentId) => {
44
+ // Auto-detect list ID if not provided
45
+ const detectedListId = await autoDetectList(client, formatter, listId, { useCache: true });
46
+ if (!detectedListId) {
47
+ process.exit(1);
48
+ }
49
+ const spinner = ora(`Fetching segment ${segmentId}...`).start();
50
+ try {
51
+ const data = await client.sdk.segmentService.getSegment({
52
+ listId: detectedListId,
53
+ segmentId: parseInt(segmentId)
54
+ });
55
+ spinner.stop();
56
+ formatter.output(data);
57
+ }
58
+ catch (error) {
59
+ spinner.stop();
60
+ formatter.error(error.message);
61
+ process.exit(1);
62
+ }
63
+ });
64
+ // Create segment
65
+ segments
66
+ .command('create [list-id]')
67
+ .description('Create a new segment (auto-detects if only one list exists)')
68
+ .requiredOption('-n, --name <name>', 'Segment name')
69
+ .option('-c, --conditions <json>', 'Segment conditions as JSON')
70
+ .action(async (listId, options) => {
71
+ // Auto-detect list ID if not provided
72
+ const detectedListId = await autoDetectList(client, formatter, listId, { useCache: true });
73
+ if (!detectedListId) {
74
+ process.exit(1);
75
+ }
76
+ const spinner = ora('Creating segment...').start();
77
+ try {
78
+ const payload = {
79
+ name: options.name
80
+ };
81
+ if (options.conditions) {
82
+ payload.conditions = JSON.parse(options.conditions);
83
+ }
84
+ const data = await client.sdk.segmentService.createSegment({
85
+ listId: detectedListId,
86
+ requestBody: payload
87
+ });
88
+ spinner.stop();
89
+ formatter.success(`Segment created: ${data.id}`);
90
+ formatter.output(data);
91
+ }
92
+ catch (error) {
93
+ spinner.stop();
94
+ formatter.error(error.message);
95
+ process.exit(1);
96
+ }
97
+ });
98
+ // Update segment
99
+ segments
100
+ .command('update [list-id] <segment-id>')
101
+ .description('Update a segment (auto-detects if only one list exists)')
102
+ .option('-n, --name <name>', 'Segment name')
103
+ .option('-c, --conditions <json>', 'Segment conditions as JSON')
104
+ .action(async (listId, segmentId, options) => {
105
+ // Auto-detect list ID if not provided
106
+ const detectedListId = await autoDetectList(client, formatter, listId, { useCache: true });
107
+ if (!detectedListId) {
108
+ process.exit(1);
109
+ }
110
+ const spinner = ora(`Updating segment ${segmentId}...`).start();
111
+ try {
112
+ const payload = {};
113
+ if (options.name)
114
+ payload.name = options.name;
115
+ if (options.conditions) {
116
+ payload.conditions = JSON.parse(options.conditions);
117
+ }
118
+ const data = await client.sdk.segmentService.patchSegment({
119
+ listId: detectedListId,
120
+ segmentId: parseInt(segmentId),
121
+ requestBody: payload
122
+ });
123
+ spinner.stop();
124
+ formatter.success(`Segment ${segmentId} updated`);
125
+ formatter.output(data);
126
+ }
127
+ catch (error) {
128
+ spinner.stop();
129
+ formatter.error(error.message);
130
+ process.exit(1);
131
+ }
132
+ });
133
+ // Delete segment
134
+ segments
135
+ .command('delete [list-id] <segment-id>')
136
+ .description('Delete a segment (auto-detects if only one list exists)')
137
+ .option('-f, --force', 'Skip confirmation prompt')
138
+ .action(async (listId, segmentId, options) => {
139
+ // Auto-detect list ID if not provided
140
+ const detectedListId = await autoDetectList(client, formatter, listId, { useCache: true });
141
+ if (!detectedListId) {
142
+ process.exit(1);
143
+ }
144
+ // Interactive confirmation (unless --force is used)
145
+ if (!options.force) {
146
+ const confirmed = await confirmDelete('segment', segmentId, [
147
+ 'Segment will be permanently deleted'
148
+ ]);
149
+ if (!confirmed) {
150
+ formatter.info('Deletion cancelled');
151
+ return;
152
+ }
153
+ }
154
+ const spinner = ora(`Deleting segment ${segmentId}...`).start();
155
+ try {
156
+ await client.sdk.segmentService.deleteSegment({
157
+ listId: detectedListId,
158
+ segmentId: parseInt(segmentId)
159
+ });
160
+ spinner.stop();
161
+ formatter.success(`Segment ${segmentId} deleted`);
162
+ }
163
+ catch (error) {
164
+ spinner.stop();
165
+ formatter.error(error.message);
166
+ process.exit(1);
167
+ }
168
+ });
169
+ // List segment contacts
170
+ segments
171
+ .command('contacts [list-id] <segment-id>')
172
+ .description('List contacts in a segment (auto-detects if only one list exists)')
173
+ .option('-l, --limit <number>', 'Limit number of results')
174
+ .option('-p, --page <number>', 'Page number')
175
+ .action(async (listId, segmentId, options) => {
176
+ // Auto-detect list ID if not provided
177
+ const detectedListId = await autoDetectList(client, formatter, listId, { useCache: true });
178
+ if (!detectedListId) {
179
+ process.exit(1);
180
+ }
181
+ const spinner = ora('Fetching segment contacts...').start();
182
+ try {
183
+ const params = {
184
+ listId: detectedListId,
185
+ segmentId: parseInt(segmentId)
186
+ };
187
+ if (options.limit)
188
+ params.per_page = parseInt(options.limit);
189
+ if (options.page)
190
+ params.page = parseInt(options.page);
191
+ const data = await client.sdk.contactService.listContactsOfSegment(params);
192
+ spinner.stop();
193
+ formatter.output(data);
194
+ }
195
+ catch (error) {
196
+ spinner.stop();
197
+ formatter.error(error.message);
198
+ process.exit(1);
199
+ }
200
+ });
201
+ return segments;
202
+ }
203
+ //# sourceMappingURL=segments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segments.js","sourceRoot":"","sources":["../../src/commands/segments.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"senders.d.ts","sourceRoot":"","sources":["../../src/commands/senders.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;AAGrD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,GAAG,OAAO,CAmKhG"}
1
+ {"version":3,"file":"senders.d.ts","sourceRoot":"","sources":["../../src/commands/senders.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;AAKrD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,GAAG,OAAO,CAmMhG"}
@@ -1,5 +1,7 @@
1
1
  import { Command } from 'commander';
2
2
  import ora from 'ora';
3
+ import { displayError, validate } from '../utils/errors.js';
4
+ import { confirmDelete } from '../utils/confirm.js';
3
5
  export function createSendersCommand(client, formatter) {
4
6
  const senders = new Command('senders')
5
7
  .description('Manage email senders');
@@ -55,6 +57,12 @@ export function createSendersCommand(client, formatter) {
55
57
  .requiredOption('-n, --name <name>', 'Sender name')
56
58
  .requiredOption('-e, --email <email>', 'Sender email')
57
59
  .action(async (options) => {
60
+ // Validate email
61
+ const emailValidation = validate.email(options.email);
62
+ if (!emailValidation.valid) {
63
+ formatter.error(emailValidation.error);
64
+ process.exit(1);
65
+ }
58
66
  const spinner = ora('Creating sender...').start();
59
67
  try {
60
68
  const data = await client.sdk.senderService.createSender({
@@ -70,7 +78,11 @@ export function createSendersCommand(client, formatter) {
70
78
  }
71
79
  catch (error) {
72
80
  spinner.stop();
73
- formatter.error(error.message);
81
+ displayError(error, {
82
+ command: 'senders create',
83
+ resource: 'sender',
84
+ operation: 'create'
85
+ });
74
86
  process.exit(1);
75
87
  }
76
88
  });
@@ -81,6 +93,14 @@ export function createSendersCommand(client, formatter) {
81
93
  .option('-n, --name <name>', 'Sender name')
82
94
  .option('-e, --email <email>', 'Sender email')
83
95
  .action(async (id, options) => {
96
+ // Validate email if provided
97
+ if (options.email) {
98
+ const emailValidation = validate.email(options.email);
99
+ if (!emailValidation.valid) {
100
+ formatter.error(emailValidation.error);
101
+ process.exit(1);
102
+ }
103
+ }
84
104
  const spinner = ora(`Updating sender ${id}...`).start();
85
105
  try {
86
106
  const payload = {};
@@ -98,7 +118,12 @@ export function createSendersCommand(client, formatter) {
98
118
  }
99
119
  catch (error) {
100
120
  spinner.stop();
101
- formatter.error(error.message);
121
+ displayError(error, {
122
+ command: 'senders update',
123
+ resource: 'sender',
124
+ resourceId: id,
125
+ operation: 'update'
126
+ });
102
127
  process.exit(1);
103
128
  }
104
129
  });
@@ -106,11 +131,17 @@ export function createSendersCommand(client, formatter) {
106
131
  senders
107
132
  .command('delete <id>')
108
133
  .description('Delete a sender')
109
- .option('-f, --force', 'Skip confirmation')
134
+ .option('-f, --force', 'Skip confirmation prompt')
110
135
  .action(async (id, options) => {
136
+ // Interactive confirmation (unless --force is used)
111
137
  if (!options.force) {
112
- formatter.info('Use --force to confirm deletion');
113
- process.exit(1);
138
+ const confirmed = await confirmDelete('sender', id, [
139
+ 'Sender will be permanently deleted'
140
+ ]);
141
+ if (!confirmed) {
142
+ formatter.info('Deletion cancelled');
143
+ return;
144
+ }
114
145
  }
115
146
  const spinner = ora(`Deleting sender ${id}...`).start();
116
147
  try {