@cakemail-org/cakemail-cli 1.5.0 → 1.7.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 (58) hide show
  1. package/README.md +312 -12
  2. package/dist/cli.js +27 -10
  3. package/dist/cli.js.map +1 -1
  4. package/dist/client.d.ts +2 -0
  5. package/dist/client.d.ts.map +1 -1
  6. package/dist/client.js +15 -5
  7. package/dist/client.js.map +1 -1
  8. package/dist/commands/campaigns.d.ts.map +1 -1
  9. package/dist/commands/campaigns.js +102 -7
  10. package/dist/commands/campaigns.js.map +1 -1
  11. package/dist/commands/config.d.ts.map +1 -1
  12. package/dist/commands/config.js +63 -4
  13. package/dist/commands/config.js.map +1 -1
  14. package/dist/commands/contacts.d.ts.map +1 -1
  15. package/dist/commands/contacts.js +90 -11
  16. package/dist/commands/contacts.js.map +1 -1
  17. package/dist/commands/interests.d.ts +5 -0
  18. package/dist/commands/interests.d.ts.map +1 -0
  19. package/dist/commands/interests.js +172 -0
  20. package/dist/commands/interests.js.map +1 -0
  21. package/dist/commands/lists.d.ts.map +1 -1
  22. package/dist/commands/lists.js +5 -7
  23. package/dist/commands/lists.js.map +1 -1
  24. package/dist/commands/logs.d.ts +5 -0
  25. package/dist/commands/logs.d.ts.map +1 -0
  26. package/dist/commands/logs.js +237 -0
  27. package/dist/commands/logs.js.map +1 -0
  28. package/dist/commands/senders.d.ts.map +1 -1
  29. package/dist/commands/senders.js +10 -7
  30. package/dist/commands/senders.js.map +1 -1
  31. package/dist/commands/tags.d.ts +5 -0
  32. package/dist/commands/tags.d.ts.map +1 -0
  33. package/dist/commands/tags.js +124 -0
  34. package/dist/commands/tags.js.map +1 -0
  35. package/dist/commands/transactional-templates.d.ts +5 -0
  36. package/dist/commands/transactional-templates.d.ts.map +1 -0
  37. package/dist/commands/transactional-templates.js +354 -0
  38. package/dist/commands/transactional-templates.js.map +1 -0
  39. package/dist/utils/auth.d.ts +8 -1
  40. package/dist/utils/auth.d.ts.map +1 -1
  41. package/dist/utils/auth.js +39 -11
  42. package/dist/utils/auth.js.map +1 -1
  43. package/dist/utils/config-file.d.ts +7 -0
  44. package/dist/utils/config-file.d.ts.map +1 -1
  45. package/dist/utils/config-file.js +15 -0
  46. package/dist/utils/config-file.js.map +1 -1
  47. package/dist/utils/config.d.ts +2 -0
  48. package/dist/utils/config.d.ts.map +1 -1
  49. package/dist/utils/config.js +10 -2
  50. package/dist/utils/config.js.map +1 -1
  51. package/dist/utils/list-defaults.d.ts +33 -0
  52. package/dist/utils/list-defaults.d.ts.map +1 -0
  53. package/dist/utils/list-defaults.js +52 -0
  54. package/dist/utils/list-defaults.js.map +1 -0
  55. package/dist/utils/output.d.ts.map +1 -1
  56. package/dist/utils/output.js +36 -13
  57. package/dist/utils/output.js.map +1 -1
  58. package/package.json +17 -3
@@ -0,0 +1,124 @@
1
+ import { Command } from 'commander';
2
+ import ora from 'ora';
3
+ import { confirmDelete } from '../utils/confirm.js';
4
+ export function createTagsCommand(client, formatter) {
5
+ const tags = new Command('tags')
6
+ .description('Manage contact tags');
7
+ // List tags
8
+ tags
9
+ .command('list')
10
+ .description('List all contact tags')
11
+ .option('-p, --page <number>', 'Page number', '1')
12
+ .option('--per-page <number>', 'Results per page', '50')
13
+ .option('--with-count', 'Include contact count for each tag')
14
+ .action(async (options) => {
15
+ const spinner = ora('Fetching tags...').start();
16
+ try {
17
+ const page = parseInt(options.page);
18
+ const perPage = parseInt(options.perPage);
19
+ const data = await client.sdk.tagsService.listTags({
20
+ page,
21
+ perPage,
22
+ withCount: options.withCount ? true : undefined
23
+ });
24
+ spinner.stop();
25
+ formatter.output(data);
26
+ }
27
+ catch (error) {
28
+ spinner.stop();
29
+ formatter.error(error.message);
30
+ process.exit(1);
31
+ }
32
+ });
33
+ // Show tag
34
+ tags
35
+ .command('show <tag>')
36
+ .description('Show details of a specific tag')
37
+ .action(async (tag) => {
38
+ const spinner = ora(`Fetching tag ${tag}...`).start();
39
+ try {
40
+ const data = await client.sdk.tagsService.showTag({ tag });
41
+ spinner.stop();
42
+ formatter.output(data);
43
+ }
44
+ catch (error) {
45
+ spinner.stop();
46
+ formatter.error(error.message);
47
+ process.exit(1);
48
+ }
49
+ });
50
+ // Create tag
51
+ tags
52
+ .command('create')
53
+ .description('Create a new contact tag')
54
+ .requiredOption('-n, --name <name>', 'Tag name')
55
+ .action(async (options) => {
56
+ const spinner = ora('Creating tag...').start();
57
+ try {
58
+ const data = await client.sdk.tagsService.createTag({
59
+ requestBody: { tag: options.name }
60
+ });
61
+ spinner.stop();
62
+ formatter.success(`Tag "${options.name}" created successfully`);
63
+ formatter.output(data);
64
+ }
65
+ catch (error) {
66
+ spinner.stop();
67
+ formatter.error(error.message);
68
+ process.exit(1);
69
+ }
70
+ });
71
+ // Update tag
72
+ tags
73
+ .command('update <tag>')
74
+ .description('Update a contact tag')
75
+ .requiredOption('-n, --name <name>', 'New tag name')
76
+ .action(async (tag, options) => {
77
+ const spinner = ora(`Updating tag ${tag}...`).start();
78
+ try {
79
+ const data = await client.sdk.tagsService.patchTag({
80
+ tag,
81
+ requestBody: { tag: options.name }
82
+ });
83
+ spinner.stop();
84
+ formatter.success(`Tag updated successfully`);
85
+ formatter.output(data);
86
+ }
87
+ catch (error) {
88
+ spinner.stop();
89
+ formatter.error(error.message);
90
+ process.exit(1);
91
+ }
92
+ });
93
+ // Delete tag
94
+ tags
95
+ .command('delete <tag>')
96
+ .description('Delete a contact tag')
97
+ .option('-f, --force', 'Skip confirmation prompt')
98
+ .action(async (tag, options) => {
99
+ // Interactive confirmation (unless --force is used)
100
+ if (!options.force) {
101
+ const confirmed = await confirmDelete('tag', tag, [
102
+ 'Tag will be removed from all contacts',
103
+ 'This action cannot be undone'
104
+ ]);
105
+ if (!confirmed) {
106
+ formatter.info('Deletion cancelled');
107
+ return;
108
+ }
109
+ }
110
+ const spinner = ora(`Deleting tag ${tag}...`).start();
111
+ try {
112
+ await client.sdk.tagsService.deleteTag({ tag });
113
+ spinner.stop();
114
+ formatter.success(`Tag "${tag}" deleted successfully`);
115
+ }
116
+ catch (error) {
117
+ spinner.stop();
118
+ formatter.error(error.message);
119
+ process.exit(1);
120
+ }
121
+ });
122
+ return tags;
123
+ }
124
+ //# sourceMappingURL=tags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/commands/tags.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 createTransactionalTemplatesCommand(client: CakemailClient, formatter: OutputFormatter): Command;
5
+ //# sourceMappingURL=transactional-templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactional-templates.d.ts","sourceRoot":"","sources":["../../src/commands/transactional-templates.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;AAMrD,wBAAgB,mCAAmC,CACjD,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,eAAe,GACzB,OAAO,CAqXT"}
@@ -0,0 +1,354 @@
1
+ import { Command } from 'commander';
2
+ import ora from 'ora';
3
+ import { displayError, validate } from '../utils/errors.js';
4
+ import { confirmDelete } from '../utils/confirm.js';
5
+ import { autoDetectList } from '../utils/defaults.js';
6
+ export function createTransactionalTemplatesCommand(client, formatter) {
7
+ const templates = new Command('transactional-templates')
8
+ .description('Manage transactional email templates');
9
+ // List transactional templates
10
+ templates
11
+ .command('list [list-id]')
12
+ .description('List transactional email templates (auto-detects if only one list exists)')
13
+ .option('-p, --page <number>', 'Page number')
14
+ .option('--per-page <number>', 'Results per page')
15
+ .option('--with-count', 'Include total count')
16
+ .action(async (listId, options) => {
17
+ // Auto-detect list ID if not provided
18
+ const detectedListId = await autoDetectList(client, formatter, listId, { useCache: true });
19
+ if (!detectedListId) {
20
+ process.exit(1);
21
+ }
22
+ const spinner = ora('Fetching transactional templates...').start();
23
+ try {
24
+ const params = {
25
+ listId: detectedListId
26
+ };
27
+ if (options.page)
28
+ params.page = parseInt(options.page);
29
+ if (options.perPage)
30
+ params.perPage = parseInt(options.perPage);
31
+ if (options.withCount)
32
+ params.withCount = true;
33
+ const data = await client.sdk.transactionalEmailService.listTransactionalEmailTemplates(params);
34
+ spinner.stop();
35
+ formatter.output(data);
36
+ }
37
+ catch (error) {
38
+ spinner.stop();
39
+ displayError(error, {
40
+ command: 'transactional-templates list',
41
+ operation: 'list templates'
42
+ });
43
+ process.exit(1);
44
+ }
45
+ });
46
+ // Show transactional template
47
+ templates
48
+ .command('show [list-id] <template-id>')
49
+ .description('Show transactional email template details (auto-detects if only one list exists)')
50
+ .action(async (listId, templateId) => {
51
+ // Auto-detect list ID if not provided
52
+ const detectedListId = await autoDetectList(client, formatter, listId, { useCache: true });
53
+ if (!detectedListId) {
54
+ process.exit(1);
55
+ }
56
+ const spinner = ora(`Fetching template ${templateId}...`).start();
57
+ try {
58
+ const data = await client.sdk.transactionalEmailService.showTransactionalEmailTemplate({
59
+ listId: detectedListId,
60
+ transactionalEmailTemplateId: parseInt(templateId)
61
+ });
62
+ spinner.stop();
63
+ formatter.output(data);
64
+ }
65
+ catch (error) {
66
+ spinner.stop();
67
+ displayError(error, {
68
+ command: 'transactional-templates show',
69
+ resource: 'template',
70
+ resourceId: templateId,
71
+ operation: 'fetch'
72
+ });
73
+ process.exit(1);
74
+ }
75
+ });
76
+ // Create transactional template
77
+ templates
78
+ .command('create [list-id]')
79
+ .description('Create a transactional email template (auto-detects if only one list exists)')
80
+ .requiredOption('-n, --name <name>', 'Template name')
81
+ .requiredOption('-s, --subject <subject>', 'Email subject')
82
+ .requiredOption('--html <html>', 'HTML content')
83
+ .option('--text <text>', 'Plain text content')
84
+ .option('--sender-id <id>', 'Sender ID')
85
+ .option('--tracking <tracking>', 'Tracking settings (open, click)')
86
+ .action(async (listId, options) => {
87
+ // Auto-detect list ID if not provided
88
+ const detectedListId = await autoDetectList(client, formatter, listId, { useCache: true });
89
+ if (!detectedListId) {
90
+ process.exit(1);
91
+ }
92
+ const spinner = ora('Creating transactional template...').start();
93
+ try {
94
+ const payload = {
95
+ name: options.name,
96
+ subject: options.subject,
97
+ html: options.html
98
+ };
99
+ if (options.text)
100
+ payload.text = options.text;
101
+ if (options.senderId)
102
+ payload.sender_id = parseInt(options.senderId);
103
+ if (options.tracking)
104
+ payload.tracking = options.tracking;
105
+ const data = await client.sdk.transactionalEmailService.createTransactionalEmailTemplate({
106
+ listId: detectedListId,
107
+ requestBody: payload
108
+ });
109
+ spinner.stop();
110
+ formatter.success('Transactional template created successfully');
111
+ formatter.output(data);
112
+ }
113
+ catch (error) {
114
+ spinner.stop();
115
+ displayError(error, {
116
+ command: 'transactional-templates create',
117
+ operation: 'create template'
118
+ });
119
+ process.exit(1);
120
+ }
121
+ });
122
+ // Update transactional template
123
+ templates
124
+ .command('update [list-id] <template-id>')
125
+ .description('Update a transactional email template (auto-detects if only one list exists)')
126
+ .option('-n, --name <name>', 'Template name')
127
+ .option('-s, --subject <subject>', 'Email subject')
128
+ .option('--html <html>', 'HTML content')
129
+ .option('--text <text>', 'Plain text content')
130
+ .option('--sender-id <id>', 'Sender ID')
131
+ .option('--tracking <tracking>', 'Tracking settings')
132
+ .action(async (listId, templateId, options) => {
133
+ // Auto-detect list ID if not provided
134
+ const detectedListId = await autoDetectList(client, formatter, listId, { useCache: true });
135
+ if (!detectedListId) {
136
+ process.exit(1);
137
+ }
138
+ const spinner = ora(`Updating template ${templateId}...`).start();
139
+ try {
140
+ const payload = {};
141
+ if (options.name)
142
+ payload.name = options.name;
143
+ if (options.subject)
144
+ payload.subject = options.subject;
145
+ if (options.html)
146
+ payload.html = options.html;
147
+ if (options.text)
148
+ payload.text = options.text;
149
+ if (options.senderId)
150
+ payload.sender_id = parseInt(options.senderId);
151
+ if (options.tracking)
152
+ payload.tracking = options.tracking;
153
+ const data = await client.sdk.transactionalEmailService.updateTransactionalEmailTemplate({
154
+ listId: detectedListId,
155
+ transactionalEmailTemplateId: parseInt(templateId),
156
+ requestBody: payload
157
+ });
158
+ spinner.stop();
159
+ formatter.success('Template updated successfully');
160
+ formatter.output(data);
161
+ }
162
+ catch (error) {
163
+ spinner.stop();
164
+ displayError(error, {
165
+ command: 'transactional-templates update',
166
+ resource: 'template',
167
+ resourceId: templateId,
168
+ operation: 'update'
169
+ });
170
+ process.exit(1);
171
+ }
172
+ });
173
+ // Delete transactional template
174
+ templates
175
+ .command('delete [list-id] <template-id>')
176
+ .description('Delete a transactional email template (auto-detects if only one list exists)')
177
+ .option('-f, --force', 'Skip confirmation prompt')
178
+ .action(async (listId, templateId, options) => {
179
+ // Auto-detect list ID if not provided
180
+ const detectedListId = await autoDetectList(client, formatter, listId, { useCache: true });
181
+ if (!detectedListId) {
182
+ process.exit(1);
183
+ }
184
+ // Interactive confirmation (unless --force is used)
185
+ if (!options.force) {
186
+ const confirmed = await confirmDelete('transactional template', templateId, [
187
+ 'Template will be permanently deleted',
188
+ 'This action cannot be undone'
189
+ ]);
190
+ if (!confirmed) {
191
+ formatter.info('Deletion cancelled');
192
+ return;
193
+ }
194
+ }
195
+ const spinner = ora(`Deleting template ${templateId}...`).start();
196
+ try {
197
+ await client.sdk.transactionalEmailService.deleteTransactionalEmailTemplate({
198
+ listId: detectedListId,
199
+ transactionalEmailTemplateId: parseInt(templateId)
200
+ });
201
+ spinner.stop();
202
+ formatter.success('Template deleted successfully');
203
+ }
204
+ catch (error) {
205
+ spinner.stop();
206
+ displayError(error, {
207
+ command: 'transactional-templates delete',
208
+ resource: 'template',
209
+ resourceId: templateId,
210
+ operation: 'delete'
211
+ });
212
+ process.exit(1);
213
+ }
214
+ });
215
+ // Send transactional email
216
+ templates
217
+ .command('send [list-id] <template-id>')
218
+ .description('Send a transactional email from template (auto-detects if only one list exists)')
219
+ .option('-c, --contact-id <id>', 'Contact ID to send to')
220
+ .option('-e, --email <email>', 'Email address to send to (alternative to contact-id)')
221
+ .option('--variables <json>', 'Template variables as JSON')
222
+ .action(async (listId, templateId, options) => {
223
+ // Auto-detect list ID if not provided
224
+ const detectedListId = await autoDetectList(client, formatter, listId, { useCache: true });
225
+ if (!detectedListId) {
226
+ process.exit(1);
227
+ }
228
+ // Validate that either contact-id or email is provided
229
+ if (!options.contactId && !options.email) {
230
+ formatter.error('Either --contact-id or --email is required');
231
+ process.exit(1);
232
+ }
233
+ const spinner = ora('Sending transactional email...').start();
234
+ try {
235
+ const payload = {};
236
+ if (options.contactId) {
237
+ payload.contact_id = parseInt(options.contactId);
238
+ }
239
+ else if (options.email) {
240
+ payload.email = options.email;
241
+ }
242
+ if (options.variables) {
243
+ payload.variables = JSON.parse(options.variables);
244
+ }
245
+ const data = await client.sdk.transactionalEmailService.sendTransactionalEmail({
246
+ listId: detectedListId,
247
+ transactionalEmailTemplateId: parseInt(templateId),
248
+ requestBody: payload
249
+ });
250
+ spinner.stop();
251
+ formatter.success('Transactional email sent successfully');
252
+ formatter.output(data);
253
+ }
254
+ catch (error) {
255
+ spinner.stop();
256
+ displayError(error, {
257
+ command: 'transactional-templates send',
258
+ resource: 'template',
259
+ resourceId: templateId,
260
+ operation: 'send email'
261
+ });
262
+ process.exit(1);
263
+ }
264
+ });
265
+ // Send test email
266
+ templates
267
+ .command('test [list-id] <template-id>')
268
+ .description('Send a test transactional email (auto-detects if only one list exists)')
269
+ .requiredOption('-e, --email <email>', 'Email address to send test to')
270
+ .option('--variables <json>', 'Template variables as JSON')
271
+ .action(async (listId, templateId, options) => {
272
+ // Auto-detect list ID if not provided
273
+ const detectedListId = await autoDetectList(client, formatter, listId, { useCache: true });
274
+ if (!detectedListId) {
275
+ process.exit(1);
276
+ }
277
+ // Validate email
278
+ const emailValidation = validate.email(options.email);
279
+ if (!emailValidation.valid) {
280
+ formatter.error(emailValidation.error);
281
+ process.exit(1);
282
+ }
283
+ const spinner = ora('Sending test email...').start();
284
+ try {
285
+ const payload = {
286
+ email: options.email
287
+ };
288
+ if (options.variables) {
289
+ payload.variables = JSON.parse(options.variables);
290
+ }
291
+ const data = await client.sdk.transactionalEmailService.sendTestTransactionalEmail({
292
+ listId: detectedListId,
293
+ transactionalEmailTemplateId: parseInt(templateId),
294
+ requestBody: payload
295
+ });
296
+ spinner.stop();
297
+ formatter.success(`Test email sent to ${options.email}`);
298
+ formatter.output(data);
299
+ }
300
+ catch (error) {
301
+ spinner.stop();
302
+ displayError(error, {
303
+ command: 'transactional-templates test',
304
+ resource: 'template',
305
+ resourceId: templateId,
306
+ operation: 'send test'
307
+ });
308
+ process.exit(1);
309
+ }
310
+ });
311
+ // Render template
312
+ templates
313
+ .command('render [list-id] <template-id>')
314
+ .description('Render a transactional email template (auto-detects if only one list exists)')
315
+ .option('-c, --contact-id <id>', 'Contact ID for personalization')
316
+ .option('--variables <json>', 'Template variables as JSON')
317
+ .action(async (listId, templateId, options) => {
318
+ // Auto-detect list ID if not provided
319
+ const detectedListId = await autoDetectList(client, formatter, listId, { useCache: true });
320
+ if (!detectedListId) {
321
+ process.exit(1);
322
+ }
323
+ const spinner = ora('Rendering template...').start();
324
+ try {
325
+ const payload = {};
326
+ if (options.contactId) {
327
+ payload.contact_id = parseInt(options.contactId);
328
+ }
329
+ if (options.variables) {
330
+ payload.variables = JSON.parse(options.variables);
331
+ }
332
+ const html = await client.sdk.transactionalEmailService.renderTransactionalEmailTemplate({
333
+ listId: detectedListId,
334
+ transactionalEmailTemplateId: parseInt(templateId),
335
+ requestBody: payload
336
+ });
337
+ spinner.stop();
338
+ formatter.success('Template rendered successfully');
339
+ console.log(html);
340
+ }
341
+ catch (error) {
342
+ spinner.stop();
343
+ displayError(error, {
344
+ command: 'transactional-templates render',
345
+ resource: 'template',
346
+ resourceId: templateId,
347
+ operation: 'render'
348
+ });
349
+ process.exit(1);
350
+ }
351
+ });
352
+ return templates;
353
+ }
354
+ //# sourceMappingURL=transactional-templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactional-templates.js","sourceRoot":"","sources":["../../src/commands/transactional-templates.ts"],"names":[],"mappings":"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"}
@@ -13,8 +13,15 @@ export declare function promptForProfile(): Promise<ProfileType>;
13
13
  export declare function promptForCredentials(): Promise<Credentials>;
14
14
  /**
15
15
  * Tests credentials by attempting to authenticate with the API
16
+ * Returns token information if successful
16
17
  */
17
- export declare function testCredentials(email: string, password: string): Promise<boolean>;
18
+ export declare function testCredentials(email: string, password: string): Promise<{
19
+ valid: boolean;
20
+ accessToken?: string;
21
+ refreshToken?: string;
22
+ expiresIn?: number;
23
+ accounts?: number[];
24
+ }>;
18
25
  /**
19
26
  * Saves credentials to .env file in current working directory
20
27
  */
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAwB,MAAM,qBAAqB,CAAC;AAGxE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,WAAW,CAAC,CA2B7D;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,WAAW,CAAC,CAkCjE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAcvF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAkCzF;AAED;;GAEG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,WAAW,CAAC,CAwFtE"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAwB,MAAM,qBAAqB,CAAC;AAGxE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,WAAW,CAAC,CA2B7D;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,WAAW,CAAC,CAkCjE;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9E,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC,CAoCD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAkCzF;AAED;;GAEG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,WAAW,CAAC,CAiGtE"}
@@ -70,6 +70,7 @@ export async function promptForCredentials() {
70
70
  }
71
71
  /**
72
72
  * Tests credentials by attempting to authenticate with the API
73
+ * Returns token information if successful
73
74
  */
74
75
  export async function testCredentials(email, password) {
75
76
  try {
@@ -78,12 +79,32 @@ export async function testCredentials(email, password) {
78
79
  password,
79
80
  baseURL: process.env.CAKEMAIL_API_BASE || 'https://api.cakemail.dev'
80
81
  });
81
- // Test credentials by fetching account info
82
- await sdk.accountService.getSelfAccount();
83
- return true;
82
+ // Get tokens using the TokenService
83
+ const tokenResponse = await sdk.tokenService.createToken({
84
+ formData: {
85
+ grant_type: 'password',
86
+ username: email,
87
+ password: password
88
+ }
89
+ });
90
+ // Handle potential MFA challenge
91
+ if ('challenge' in tokenResponse) {
92
+ // MFA is enabled - for now we'll return false
93
+ // TODO: Implement MFA flow
94
+ console.log(chalk.yellow('⚠ Multi-factor authentication is enabled on this account'));
95
+ console.log(chalk.gray('MFA support is coming soon. Please disable MFA temporarily.'));
96
+ return { valid: false };
97
+ }
98
+ return {
99
+ valid: true,
100
+ accessToken: tokenResponse.access_token,
101
+ refreshToken: tokenResponse.refresh_token,
102
+ expiresIn: tokenResponse.expires_in,
103
+ accounts: tokenResponse.accounts
104
+ };
84
105
  }
85
106
  catch (error) {
86
- return false;
107
+ return { valid: false };
87
108
  }
88
109
  }
89
110
  /**
@@ -123,8 +144,8 @@ export function saveCredentials(email, password, accountId) {
123
144
  export async function authenticateInteractively() {
124
145
  const credentials = await promptForCredentials();
125
146
  console.log(chalk.gray('\nValidating credentials...'));
126
- const isValid = await testCredentials(credentials.email, credentials.password);
127
- if (!isValid) {
147
+ const authResult = await testCredentials(credentials.email, credentials.password);
148
+ if (!authResult.valid) {
128
149
  console.log(chalk.red('✗ Invalid credentials. Please try again.\n'));
129
150
  // Retry
130
151
  return authenticateInteractively();
@@ -174,17 +195,24 @@ export async function authenticateInteractively() {
174
195
  }
175
196
  // Save to config file (preferred) or fallback to .env
176
197
  if (isFirstTimeSetup || configFileExists()) {
177
- // Save to config file
178
- updateConfigFile({
198
+ // Save to config file with tokens
199
+ const configUpdate = {
179
200
  version: '1.0',
180
- profile: selectedProfile || 'balanced',
181
201
  auth: {
182
- method: 'password',
202
+ method: 'token',
203
+ access_token: authResult.accessToken,
204
+ refresh_token: authResult.refreshToken,
205
+ expires_in: authResult.expiresIn,
183
206
  email: credentials.email,
184
207
  base_url: process.env.CAKEMAIL_API_BASE || 'https://api.cakemail.dev'
185
208
  },
186
209
  defaults: accountId ? { account_id: accountId } : undefined
187
- });
210
+ };
211
+ // Only set profile during first-time setup to avoid overwriting user's profile choice
212
+ if (isFirstTimeSetup) {
213
+ configUpdate.profile = selectedProfile || 'balanced';
214
+ }
215
+ updateConfigFile(configUpdate);
188
216
  console.log(chalk.green('✓ Configuration saved to ~/.cakemail/config.json'));
189
217
  }
190
218
  else {