@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.
- package/README.md +312 -12
- package/dist/cli.js +27 -10
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +2 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +15 -5
- package/dist/client.js.map +1 -1
- package/dist/commands/campaigns.d.ts.map +1 -1
- package/dist/commands/campaigns.js +102 -7
- package/dist/commands/campaigns.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +63 -4
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/contacts.d.ts.map +1 -1
- package/dist/commands/contacts.js +90 -11
- package/dist/commands/contacts.js.map +1 -1
- package/dist/commands/interests.d.ts +5 -0
- package/dist/commands/interests.d.ts.map +1 -0
- package/dist/commands/interests.js +172 -0
- package/dist/commands/interests.js.map +1 -0
- package/dist/commands/lists.d.ts.map +1 -1
- package/dist/commands/lists.js +5 -7
- package/dist/commands/lists.js.map +1 -1
- package/dist/commands/logs.d.ts +5 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +237 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/senders.d.ts.map +1 -1
- package/dist/commands/senders.js +10 -7
- package/dist/commands/senders.js.map +1 -1
- package/dist/commands/tags.d.ts +5 -0
- package/dist/commands/tags.d.ts.map +1 -0
- package/dist/commands/tags.js +124 -0
- package/dist/commands/tags.js.map +1 -0
- package/dist/commands/transactional-templates.d.ts +5 -0
- package/dist/commands/transactional-templates.d.ts.map +1 -0
- package/dist/commands/transactional-templates.js +354 -0
- package/dist/commands/transactional-templates.js.map +1 -0
- package/dist/utils/auth.d.ts +8 -1
- package/dist/utils/auth.d.ts.map +1 -1
- package/dist/utils/auth.js +39 -11
- package/dist/utils/auth.js.map +1 -1
- package/dist/utils/config-file.d.ts +7 -0
- package/dist/utils/config-file.d.ts.map +1 -1
- package/dist/utils/config-file.js +15 -0
- package/dist/utils/config-file.js.map +1 -1
- package/dist/utils/config.d.ts +2 -0
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +10 -2
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/list-defaults.d.ts +33 -0
- package/dist/utils/list-defaults.d.ts.map +1 -0
- package/dist/utils/list-defaults.js +52 -0
- package/dist/utils/list-defaults.js.map +1 -0
- package/dist/utils/output.d.ts.map +1 -1
- package/dist/utils/output.js +36 -13
- package/dist/utils/output.js.map +1 -1
- 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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"}
|
package/dist/utils/auth.d.ts
CHANGED
|
@@ -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<
|
|
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
|
*/
|
package/dist/utils/auth.d.ts.map
CHANGED
|
@@ -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
|
|
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"}
|
package/dist/utils/auth.js
CHANGED
|
@@ -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
|
-
//
|
|
82
|
-
await sdk.
|
|
83
|
-
|
|
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
|
|
127
|
-
if (!
|
|
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
|
-
|
|
198
|
+
// Save to config file with tokens
|
|
199
|
+
const configUpdate = {
|
|
179
200
|
version: '1.0',
|
|
180
|
-
profile: selectedProfile || 'balanced',
|
|
181
201
|
auth: {
|
|
182
|
-
method: '
|
|
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 {
|