@cakemail-org/cakemail-cli 1.2.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/LICENSE +21 -0
- package/README.md +460 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +66 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +27 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +41 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/campaigns.d.ts +5 -0
- package/dist/commands/campaigns.d.ts.map +1 -0
- package/dist/commands/campaigns.js +334 -0
- package/dist/commands/campaigns.js.map +1 -0
- package/dist/commands/contacts.d.ts +5 -0
- package/dist/commands/contacts.d.ts.map +1 -0
- package/dist/commands/contacts.js +164 -0
- package/dist/commands/contacts.js.map +1 -0
- package/dist/commands/emails.d.ts +5 -0
- package/dist/commands/emails.d.ts.map +1 -0
- package/dist/commands/emails.js +140 -0
- package/dist/commands/emails.js.map +1 -0
- package/dist/commands/lists.d.ts +5 -0
- package/dist/commands/lists.d.ts.map +1 -0
- package/dist/commands/lists.js +102 -0
- package/dist/commands/lists.js.map +1 -0
- package/dist/commands/senders.d.ts +5 -0
- package/dist/commands/senders.d.ts.map +1 -0
- package/dist/commands/senders.js +168 -0
- package/dist/commands/senders.js.map +1 -0
- package/dist/commands/templates.d.ts +5 -0
- package/dist/commands/templates.d.ts.map +1 -0
- package/dist/commands/templates.js +198 -0
- package/dist/commands/templates.js.map +1 -0
- package/dist/commands/webhooks.d.ts +5 -0
- package/dist/commands/webhooks.d.ts.map +1 -0
- package/dist/commands/webhooks.js +144 -0
- package/dist/commands/webhooks.js.map +1 -0
- package/dist/utils/config.d.ts +7 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +21 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/output.d.ts +16 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +197 -0
- package/dist/utils/output.js.map +1 -0
- package/package.json +57 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 François Lane
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,460 @@
|
|
|
1
|
+
# Cakemail CLI
|
|
2
|
+
|
|
3
|
+
Official command-line interface for the Cakemail API.
|
|
4
|
+
|
|
5
|
+
Built on top of the official [@cakemail-org/cakemail-sdk](https://www.npmjs.com/package/@cakemail-org/cakemail-sdk) with 100% API coverage (232 operations).
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
### via Homebrew (macOS/Linux)
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
brew tap cakemail/cakemail
|
|
13
|
+
brew install cakemail-cli
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
### via npm
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install -g @cakemail-org/cakemail-cli
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### via npx (no installation)
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npx @cakemail-org/cakemail-cli --help
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Configuration
|
|
29
|
+
|
|
30
|
+
Set your Cakemail credentials using environment variables:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# Option 1: Use access token
|
|
34
|
+
export CAKEMAIL_ACCESS_TOKEN=your_access_token
|
|
35
|
+
|
|
36
|
+
# Option 2: Use email/password
|
|
37
|
+
export CAKEMAIL_EMAIL=your@email.com
|
|
38
|
+
export CAKEMAIL_PASSWORD=your_password
|
|
39
|
+
|
|
40
|
+
# Optional: Set default output format
|
|
41
|
+
export CAKEMAIL_OUTPUT_FORMAT=compact # json, table, or compact
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Or create a `.env` file in your project directory:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
# Authentication (choose one method)
|
|
48
|
+
CAKEMAIL_EMAIL=your@email.com
|
|
49
|
+
CAKEMAIL_PASSWORD=your_password
|
|
50
|
+
# OR
|
|
51
|
+
# CAKEMAIL_ACCESS_TOKEN=your_access_token
|
|
52
|
+
|
|
53
|
+
# Optional: Default output format (json, table, compact)
|
|
54
|
+
CAKEMAIL_OUTPUT_FORMAT=compact
|
|
55
|
+
|
|
56
|
+
# Optional: API base URL (defaults to https://api.cakemail.dev)
|
|
57
|
+
# CAKEMAIL_API_BASE=https://api.cakemail.dev
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Usage
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
cakemail [options] <command>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Global Options
|
|
67
|
+
|
|
68
|
+
- `-f, --format <format>` - Output format: `json`, `table`, or `compact` (default: `json`)
|
|
69
|
+
- `--access-token <token>` - Override access token from environment
|
|
70
|
+
- `--email <email>` - Override email from environment
|
|
71
|
+
- `--password <password>` - Override password from environment
|
|
72
|
+
|
|
73
|
+
### Output Formats
|
|
74
|
+
|
|
75
|
+
The CLI supports three output formats. You can set a default in your `.env` file with `CAKEMAIL_OUTPUT_FORMAT` or override it per-command with the `-f` flag.
|
|
76
|
+
|
|
77
|
+
**Priority:** CLI flag (`-f`) > Environment variable (`CAKEMAIL_OUTPUT_FORMAT`) > Default (`json`)
|
|
78
|
+
|
|
79
|
+
**JSON** (default) - Full structured data output:
|
|
80
|
+
```bash
|
|
81
|
+
cakemail campaigns list
|
|
82
|
+
cakemail -f json campaigns list
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**Table** - Formatted table view with key fields:
|
|
86
|
+
```bash
|
|
87
|
+
cakemail -f table campaigns list
|
|
88
|
+
cakemail -f table templates list
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Compact** - One-line summary per item:
|
|
92
|
+
```bash
|
|
93
|
+
cakemail -f compact lists list
|
|
94
|
+
cakemail -f compact contacts list 123
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
**Set a default format:**
|
|
98
|
+
```bash
|
|
99
|
+
# In your .env file
|
|
100
|
+
CAKEMAIL_OUTPUT_FORMAT=compact
|
|
101
|
+
|
|
102
|
+
# Now all commands use compact by default
|
|
103
|
+
cakemail campaigns list # Uses compact
|
|
104
|
+
cakemail -f json campaigns list # Override to JSON
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Commands
|
|
108
|
+
|
|
109
|
+
#### Email API v2
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
# Send an email with HTML content
|
|
113
|
+
cakemail emails send -t recipient@example.com -s "Subject" --html "<h1>Hello</h1>"
|
|
114
|
+
|
|
115
|
+
# Send an email with HTML file
|
|
116
|
+
cakemail emails send -t recipient@example.com -s "Subject" --html-file email.html
|
|
117
|
+
|
|
118
|
+
# Send an email using a template
|
|
119
|
+
cakemail emails send -t recipient@example.com -s "Subject" --template-id 123 --params '{"name":"John"}'
|
|
120
|
+
|
|
121
|
+
# Send with custom sender
|
|
122
|
+
cakemail emails send \
|
|
123
|
+
-t recipient@example.com \
|
|
124
|
+
-s "Subject" \
|
|
125
|
+
--html "<p>Content</p>" \
|
|
126
|
+
--from-email sender@example.com \
|
|
127
|
+
--from-name "John Doe" \
|
|
128
|
+
--reply-to reply@example.com
|
|
129
|
+
|
|
130
|
+
# Send with tracking and tags
|
|
131
|
+
cakemail emails send \
|
|
132
|
+
-t recipient@example.com \
|
|
133
|
+
-s "Subject" \
|
|
134
|
+
--html "<p>Content</p>" \
|
|
135
|
+
--tracking \
|
|
136
|
+
--tags "newsletter,promo"
|
|
137
|
+
|
|
138
|
+
# Get email details
|
|
139
|
+
cakemail emails get <email-id>
|
|
140
|
+
|
|
141
|
+
# Render email HTML
|
|
142
|
+
cakemail emails render <email-id>
|
|
143
|
+
cakemail emails render <email-id> --as-submitted --tracking
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
#### Templates
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
# List all templates
|
|
150
|
+
cakemail templates list [options]
|
|
151
|
+
-l, --limit <number> Limit results
|
|
152
|
+
-p, --page <number> Page number
|
|
153
|
+
-f, --filter <filter> Filter (e.g., "name==Newsletter")
|
|
154
|
+
-s, --sort <sort> Sort (e.g., "+name", "-created_on")
|
|
155
|
+
|
|
156
|
+
# Get template details
|
|
157
|
+
cakemail templates get <id>
|
|
158
|
+
|
|
159
|
+
# Create a template
|
|
160
|
+
cakemail templates create -n "My Template" --html-file template.html
|
|
161
|
+
-n, --name <name> Template name (required)
|
|
162
|
+
--html <html> HTML content
|
|
163
|
+
--html-file <path> Path to HTML file
|
|
164
|
+
--text <text> Plain text content
|
|
165
|
+
--text-file <path> Path to text file
|
|
166
|
+
--subject <subject> Default email subject
|
|
167
|
+
--tags <tags> Comma-separated tags
|
|
168
|
+
|
|
169
|
+
# Update a template
|
|
170
|
+
cakemail templates update <id> [options]
|
|
171
|
+
-n, --name <name> Template name
|
|
172
|
+
--html <html> HTML content
|
|
173
|
+
--html-file <path> Path to HTML file
|
|
174
|
+
--text <text> Plain text content
|
|
175
|
+
--text-file <path> Path to text file
|
|
176
|
+
--subject <subject> Default email subject
|
|
177
|
+
--tags <tags> Comma-separated tags
|
|
178
|
+
|
|
179
|
+
# Render a template
|
|
180
|
+
cakemail templates render <id>
|
|
181
|
+
|
|
182
|
+
# Delete template
|
|
183
|
+
cakemail templates delete <id> --force
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
#### Campaigns
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
# List all campaigns
|
|
190
|
+
cakemail campaigns list [options]
|
|
191
|
+
-s, --status <status> Filter by status
|
|
192
|
+
-l, --limit <number> Limit results
|
|
193
|
+
-p, --page <number> Page number
|
|
194
|
+
--sort <sort> Sort (e.g., "+name", "-created_on", "+scheduled_for")
|
|
195
|
+
--filter <filter> Filter (e.g., "status==delivered;name==Newsletter")
|
|
196
|
+
|
|
197
|
+
# Get campaign details
|
|
198
|
+
cakemail campaigns get <id>
|
|
199
|
+
|
|
200
|
+
# Create a campaign
|
|
201
|
+
cakemail campaigns create -n "My Campaign" -l <list-id> [options]
|
|
202
|
+
-n, --name <name> Campaign name (required)
|
|
203
|
+
-l, --list-id <id> List ID (required)
|
|
204
|
+
-s, --sender-id <id> Sender ID
|
|
205
|
+
-t, --template-id <id> Template ID
|
|
206
|
+
--subject <subject> Email subject
|
|
207
|
+
|
|
208
|
+
# Update a campaign
|
|
209
|
+
cakemail campaigns update <id> [options]
|
|
210
|
+
-n, --name <name> Campaign name
|
|
211
|
+
-l, --list-id <id> List ID
|
|
212
|
+
-s, --sender-id <id> Sender ID
|
|
213
|
+
-t, --template-id <id> Template ID
|
|
214
|
+
--subject <subject> Email subject
|
|
215
|
+
|
|
216
|
+
# Schedule a campaign
|
|
217
|
+
cakemail campaigns schedule <id> -d <datetime>
|
|
218
|
+
-d, --date <datetime> Schedule datetime (ISO 8601)
|
|
219
|
+
|
|
220
|
+
# Reschedule a campaign
|
|
221
|
+
cakemail campaigns reschedule <id> -d <datetime>
|
|
222
|
+
-d, --date <datetime> New schedule datetime (ISO 8601)
|
|
223
|
+
|
|
224
|
+
# Unschedule a campaign
|
|
225
|
+
cakemail campaigns unschedule <id>
|
|
226
|
+
|
|
227
|
+
# Send test email
|
|
228
|
+
cakemail campaigns test <id> -e <email>
|
|
229
|
+
-e, --email <email> Recipient email
|
|
230
|
+
|
|
231
|
+
# Archive/Unarchive campaign
|
|
232
|
+
cakemail campaigns archive <id>
|
|
233
|
+
cakemail campaigns unarchive <id>
|
|
234
|
+
|
|
235
|
+
# Cancel a scheduled campaign
|
|
236
|
+
cakemail campaigns cancel <id>
|
|
237
|
+
|
|
238
|
+
# Suspend/Resume campaign
|
|
239
|
+
cakemail campaigns suspend <id>
|
|
240
|
+
cakemail campaigns resume <id>
|
|
241
|
+
|
|
242
|
+
# List campaign links
|
|
243
|
+
cakemail campaigns links <id> [options]
|
|
244
|
+
-l, --limit <number> Limit results
|
|
245
|
+
-p, --page <number> Page number
|
|
246
|
+
|
|
247
|
+
# Delete campaign
|
|
248
|
+
cakemail campaigns delete <id> --force
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
#### Lists
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
# List all contact lists
|
|
255
|
+
cakemail lists list [options]
|
|
256
|
+
-l, --limit <number> Limit results
|
|
257
|
+
-p, --page <number> Page number
|
|
258
|
+
--sort <sort> Sort (e.g., "+name", "-created_on")
|
|
259
|
+
--filter <filter> Filter (e.g., "status==active;name==Newsletter")
|
|
260
|
+
|
|
261
|
+
# Get list details
|
|
262
|
+
cakemail lists get <id>
|
|
263
|
+
|
|
264
|
+
# Create a list
|
|
265
|
+
cakemail lists create -n "My List" [options]
|
|
266
|
+
-n, --name <name> List name (required)
|
|
267
|
+
-l, --language <lang> Language code (e.g., en, fr)
|
|
268
|
+
|
|
269
|
+
# Delete list
|
|
270
|
+
cakemail lists delete <id> --force
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
#### Contacts
|
|
274
|
+
|
|
275
|
+
```bash
|
|
276
|
+
# List contacts in a list
|
|
277
|
+
cakemail contacts list <list-id> [options]
|
|
278
|
+
-l, --limit <number> Limit results
|
|
279
|
+
-p, --page <number> Page number
|
|
280
|
+
-q, --query <query> Search query
|
|
281
|
+
--sort <sort> Sort (e.g., "+email", "-subscribed_on", "+status")
|
|
282
|
+
--filter <filter> Filter (e.g., "status==active;email==user@example.com")
|
|
283
|
+
|
|
284
|
+
# Get contact details
|
|
285
|
+
cakemail contacts get <list-id> <contact-id>
|
|
286
|
+
|
|
287
|
+
# Add a contact
|
|
288
|
+
cakemail contacts add <list-id> -e <email> [options]
|
|
289
|
+
-e, --email <email> Contact email (required)
|
|
290
|
+
-f, --first-name <name> First name
|
|
291
|
+
-l, --last-name <name> Last name
|
|
292
|
+
-d, --data <json> Custom attributes as JSON
|
|
293
|
+
|
|
294
|
+
# Update contact
|
|
295
|
+
cakemail contacts update <list-id> <contact-id> [options]
|
|
296
|
+
-e, --email <email> Contact email
|
|
297
|
+
-f, --first-name <name> First name
|
|
298
|
+
-l, --last-name <name> Last name
|
|
299
|
+
-d, --data <json> Custom attributes as JSON
|
|
300
|
+
|
|
301
|
+
# Delete contact
|
|
302
|
+
cakemail contacts delete <list-id> <contact-id> --force
|
|
303
|
+
|
|
304
|
+
# Unsubscribe contact
|
|
305
|
+
cakemail contacts unsubscribe <list-id> <contact-id>
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
#### Senders
|
|
309
|
+
|
|
310
|
+
```bash
|
|
311
|
+
# List all senders
|
|
312
|
+
cakemail senders list [options]
|
|
313
|
+
-l, --limit <number> Limit results
|
|
314
|
+
-p, --page <number> Page number
|
|
315
|
+
--sort <sort> Sort (e.g., "+name", "+email", "-confirmed")
|
|
316
|
+
--filter <filter> Filter (e.g., "confirmed==true;email==sender@example.com")
|
|
317
|
+
|
|
318
|
+
# Get sender details
|
|
319
|
+
cakemail senders get <id>
|
|
320
|
+
|
|
321
|
+
# Create a sender
|
|
322
|
+
cakemail senders create -n "John Doe" -e "john@example.com"
|
|
323
|
+
-n, --name <name> Sender name (required)
|
|
324
|
+
-e, --email <email> Sender email (required)
|
|
325
|
+
|
|
326
|
+
# Update a sender
|
|
327
|
+
cakemail senders update <id> [options]
|
|
328
|
+
-n, --name <name> Sender name
|
|
329
|
+
-e, --email <email> Sender email
|
|
330
|
+
|
|
331
|
+
# Confirm sender (using confirmation ID from email)
|
|
332
|
+
cakemail senders confirm <confirmation-id>
|
|
333
|
+
|
|
334
|
+
# Resend confirmation email
|
|
335
|
+
cakemail senders resend-confirmation <id>
|
|
336
|
+
|
|
337
|
+
# Delete sender
|
|
338
|
+
cakemail senders delete <id> --force
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
#### Webhooks
|
|
342
|
+
|
|
343
|
+
```bash
|
|
344
|
+
# List all webhooks
|
|
345
|
+
cakemail webhooks list [options]
|
|
346
|
+
-l, --limit <number> Limit results
|
|
347
|
+
-p, --page <number> Page number
|
|
348
|
+
|
|
349
|
+
# Get webhook details
|
|
350
|
+
cakemail webhooks get <id>
|
|
351
|
+
|
|
352
|
+
# Create a webhook
|
|
353
|
+
cakemail webhooks create -u <url> -e <events> [options]
|
|
354
|
+
-u, --url <url> Webhook URL (required)
|
|
355
|
+
-e, --events <events> Comma-separated events (required)
|
|
356
|
+
-n, --name <name> Webhook name
|
|
357
|
+
-s, --secret <secret> Webhook secret for verification
|
|
358
|
+
|
|
359
|
+
# Update a webhook
|
|
360
|
+
cakemail webhooks update <id> [options]
|
|
361
|
+
-u, --url <url> Webhook URL
|
|
362
|
+
-e, --events <events> Comma-separated events
|
|
363
|
+
-n, --name <name> Webhook name
|
|
364
|
+
-s, --secret <secret> Webhook secret
|
|
365
|
+
|
|
366
|
+
# Archive a webhook
|
|
367
|
+
cakemail webhooks archive <id>
|
|
368
|
+
|
|
369
|
+
# Unarchive a webhook
|
|
370
|
+
cakemail webhooks unarchive <id>
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
## Examples
|
|
374
|
+
|
|
375
|
+
```bash
|
|
376
|
+
# Create a template
|
|
377
|
+
cakemail templates create \
|
|
378
|
+
-n "Newsletter Template" \
|
|
379
|
+
--html-file templates/newsletter.html \
|
|
380
|
+
--subject "Weekly Newsletter" \
|
|
381
|
+
--tags "newsletter,weekly"
|
|
382
|
+
|
|
383
|
+
# Send a transactional email
|
|
384
|
+
cakemail emails send \
|
|
385
|
+
-t customer@example.com \
|
|
386
|
+
-s "Order Confirmation" \
|
|
387
|
+
--html-file templates/order-confirmation.html \
|
|
388
|
+
--from-email orders@myshop.com \
|
|
389
|
+
--from-name "My Shop" \
|
|
390
|
+
--tracking \
|
|
391
|
+
--tags "transactional,order"
|
|
392
|
+
|
|
393
|
+
# Manage campaign lifecycle
|
|
394
|
+
cakemail campaigns schedule 123 -d "2025-10-15T10:00:00Z"
|
|
395
|
+
cakemail campaigns suspend 123
|
|
396
|
+
cakemail campaigns resume 123
|
|
397
|
+
cakemail campaigns cancel 123
|
|
398
|
+
|
|
399
|
+
# List campaigns in table format
|
|
400
|
+
cakemail -f table campaigns list
|
|
401
|
+
|
|
402
|
+
# List campaigns in compact format
|
|
403
|
+
cakemail -f compact campaigns list
|
|
404
|
+
|
|
405
|
+
# Sort and filter campaigns
|
|
406
|
+
cakemail campaigns list --sort "-created_on" --filter "status==delivered"
|
|
407
|
+
cakemail campaigns list --sort "+name"
|
|
408
|
+
|
|
409
|
+
# Sort and filter lists
|
|
410
|
+
cakemail lists list --sort "+name" --filter "status==active"
|
|
411
|
+
|
|
412
|
+
# Sort and filter contacts
|
|
413
|
+
cakemail contacts list 123 --sort "-subscribed_on" --filter "status==active"
|
|
414
|
+
|
|
415
|
+
# Sort and filter senders
|
|
416
|
+
cakemail senders list --sort "+email" --filter "confirmed==true"
|
|
417
|
+
|
|
418
|
+
# Create a new list
|
|
419
|
+
cakemail lists create -n "Newsletter Subscribers" -l en
|
|
420
|
+
|
|
421
|
+
# Add a contact with custom attributes
|
|
422
|
+
cakemail contacts add 123 -e "user@example.com" -f "John" -l "Doe" -d '{"company":"Acme"}'
|
|
423
|
+
|
|
424
|
+
# Schedule a campaign
|
|
425
|
+
cakemail campaigns schedule 456 -d "2025-10-15T10:00:00Z"
|
|
426
|
+
|
|
427
|
+
# Send a test campaign
|
|
428
|
+
cakemail campaigns test 456 -e "test@example.com"
|
|
429
|
+
|
|
430
|
+
# Create a webhook for email events
|
|
431
|
+
cakemail webhooks create \
|
|
432
|
+
-u "https://example.com/webhook" \
|
|
433
|
+
-e "email.sent,email.opened,email.clicked" \
|
|
434
|
+
-n "My Webhook" \
|
|
435
|
+
-s "my_secret_key"
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
## Development
|
|
439
|
+
|
|
440
|
+
```bash
|
|
441
|
+
# Install dependencies
|
|
442
|
+
npm install
|
|
443
|
+
|
|
444
|
+
# Build
|
|
445
|
+
npm run build
|
|
446
|
+
|
|
447
|
+
# Run locally
|
|
448
|
+
npm start -- campaigns list
|
|
449
|
+
|
|
450
|
+
# or use node directly
|
|
451
|
+
node dist/cli.js campaigns list
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
## License
|
|
455
|
+
|
|
456
|
+
MIT
|
|
457
|
+
|
|
458
|
+
## Support
|
|
459
|
+
|
|
460
|
+
For issues and questions, please visit: https://github.com/cakemail/cli/issues
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { CakemailClient } from './client.js';
|
|
4
|
+
import { OutputFormatter } from './utils/output.js';
|
|
5
|
+
import { getConfig } from './utils/config.js';
|
|
6
|
+
import { createCampaignsCommand } from './commands/campaigns.js';
|
|
7
|
+
import { createListsCommand } from './commands/lists.js';
|
|
8
|
+
import { createContactsCommand } from './commands/contacts.js';
|
|
9
|
+
import { createSendersCommand } from './commands/senders.js';
|
|
10
|
+
import { createWebhooksCommand } from './commands/webhooks.js';
|
|
11
|
+
import { createEmailsCommand } from './commands/emails.js';
|
|
12
|
+
import { createTemplatesCommand } from './commands/templates.js';
|
|
13
|
+
import chalk from 'chalk';
|
|
14
|
+
async function main() {
|
|
15
|
+
const program = new Command();
|
|
16
|
+
program
|
|
17
|
+
.name('cakemail')
|
|
18
|
+
.description('Official Cakemail CLI - Command-line interface for the Cakemail API')
|
|
19
|
+
.version('1.2.0')
|
|
20
|
+
.option('-f, --format <format>', 'Output format (json|table|compact)')
|
|
21
|
+
.option('--access-token <token>', 'Cakemail access token (overrides env)')
|
|
22
|
+
.option('--email <email>', 'Cakemail account email (overrides env)')
|
|
23
|
+
.option('--password <password>', 'Cakemail account password (overrides env)');
|
|
24
|
+
try {
|
|
25
|
+
// Get config (don't require credentials for help/version)
|
|
26
|
+
const config = getConfig(false);
|
|
27
|
+
// Create client and formatter with lazy format evaluation
|
|
28
|
+
// Client will fail on first API call if credentials are missing
|
|
29
|
+
const client = new CakemailClient(config);
|
|
30
|
+
const formatter = new OutputFormatter(() => {
|
|
31
|
+
const opts = program.opts();
|
|
32
|
+
// Override config with CLI options
|
|
33
|
+
if (opts.accessToken)
|
|
34
|
+
config.accessToken = opts.accessToken;
|
|
35
|
+
if (opts.email)
|
|
36
|
+
config.email = opts.email;
|
|
37
|
+
if (opts.password)
|
|
38
|
+
config.password = opts.password;
|
|
39
|
+
// Priority: CLI flag > env var > default
|
|
40
|
+
return opts.format || config.outputFormat || 'json';
|
|
41
|
+
});
|
|
42
|
+
// Add commands
|
|
43
|
+
program.addCommand(createCampaignsCommand(client, formatter));
|
|
44
|
+
program.addCommand(createListsCommand(client, formatter));
|
|
45
|
+
program.addCommand(createContactsCommand(client, formatter));
|
|
46
|
+
program.addCommand(createSendersCommand(client, formatter));
|
|
47
|
+
program.addCommand(createWebhooksCommand(client, formatter));
|
|
48
|
+
program.addCommand(createEmailsCommand(client, formatter));
|
|
49
|
+
program.addCommand(createTemplatesCommand(client, formatter));
|
|
50
|
+
// Parse
|
|
51
|
+
await program.parseAsync(process.argv);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
console.error(chalk.red('Error:'), error.message);
|
|
55
|
+
if (error.message.includes('Missing credentials')) {
|
|
56
|
+
console.error(chalk.yellow('\nTip:'), 'Set credentials in environment variables or .env file:');
|
|
57
|
+
console.error(' CAKEMAIL_ACCESS_TOKEN=your_access_token');
|
|
58
|
+
console.error(' or');
|
|
59
|
+
console.error(' CAKEMAIL_EMAIL=your@email.com');
|
|
60
|
+
console.error(' CAKEMAIL_PASSWORD=your_password');
|
|
61
|
+
}
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
main();
|
|
66
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { CakemailClient as SDK } from '@cakemail-org/cakemail-sdk';
|
|
2
|
+
export interface CakemailConfig {
|
|
3
|
+
accessToken?: string;
|
|
4
|
+
email?: string;
|
|
5
|
+
password?: string;
|
|
6
|
+
baseURL?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Wrapper around the official Cakemail SDK
|
|
10
|
+
* Provides backward compatibility with our CLI while using the SDK
|
|
11
|
+
*/
|
|
12
|
+
export declare class CakemailClient {
|
|
13
|
+
sdk: SDK;
|
|
14
|
+
private config;
|
|
15
|
+
constructor(config: CakemailConfig);
|
|
16
|
+
/**
|
|
17
|
+
* Legacy method for backward compatibility with our commands
|
|
18
|
+
* Routes to appropriate SDK resource methods
|
|
19
|
+
*/
|
|
20
|
+
get<T = any>(url: string, config?: {
|
|
21
|
+
params?: any;
|
|
22
|
+
}): Promise<T>;
|
|
23
|
+
post<T = any>(url: string, data?: any): Promise<T>;
|
|
24
|
+
patch<T = any>(url: string, data?: any): Promise<T>;
|
|
25
|
+
delete<T = any>(url: string): Promise<T>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,IAAI,GAAG,EAAwB,MAAM,4BAA4B,CAAC;AAEzF,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,qBAAa,cAAc;IAClB,GAAG,EAAE,GAAG,CAAC;IAChB,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,EAAE,cAAc;IAiBlC;;;OAGG;IACG,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,GAAG,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,CAAC;IAMhE,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;IAIlD,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;IAInD,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CAG/C"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { CakemailClient as SDK } from '@cakemail-org/cakemail-sdk';
|
|
2
|
+
/**
|
|
3
|
+
* Wrapper around the official Cakemail SDK
|
|
4
|
+
* Provides backward compatibility with our CLI while using the SDK
|
|
5
|
+
*/
|
|
6
|
+
export class CakemailClient {
|
|
7
|
+
sdk;
|
|
8
|
+
config;
|
|
9
|
+
constructor(config) {
|
|
10
|
+
this.config = config;
|
|
11
|
+
// The SDK requires email and password
|
|
12
|
+
if (!config.email || !config.password) {
|
|
13
|
+
throw new Error('Email and password are required for SDK authentication');
|
|
14
|
+
}
|
|
15
|
+
const sdkConfig = {
|
|
16
|
+
email: config.email,
|
|
17
|
+
password: config.password,
|
|
18
|
+
baseURL: config.baseURL || process.env.CAKEMAIL_API_BASE || 'https://api.cakemail.dev',
|
|
19
|
+
};
|
|
20
|
+
this.sdk = new SDK(sdkConfig);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Legacy method for backward compatibility with our commands
|
|
24
|
+
* Routes to appropriate SDK resource methods
|
|
25
|
+
*/
|
|
26
|
+
async get(url, config) {
|
|
27
|
+
// The SDK handles all requests through resources
|
|
28
|
+
// This is for backward compatibility - we'll migrate commands to use SDK resources directly
|
|
29
|
+
throw new Error('Direct HTTP methods deprecated - use SDK resources (client.sdk.campaigns, client.sdk.lists, etc.)');
|
|
30
|
+
}
|
|
31
|
+
async post(url, data) {
|
|
32
|
+
throw new Error('Direct HTTP methods deprecated - use SDK resources (client.sdk.campaigns, client.sdk.lists, etc.)');
|
|
33
|
+
}
|
|
34
|
+
async patch(url, data) {
|
|
35
|
+
throw new Error('Direct HTTP methods deprecated - use SDK resources (client.sdk.campaigns, client.sdk.lists, etc.)');
|
|
36
|
+
}
|
|
37
|
+
async delete(url) {
|
|
38
|
+
throw new Error('Direct HTTP methods deprecated - use SDK resources (client.sdk.campaigns, client.sdk.lists, etc.)');
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,IAAI,GAAG,EAAwB,MAAM,4BAA4B,CAAC;AASzF;;;GAGG;AACH,MAAM,OAAO,cAAc;IAClB,GAAG,CAAM;IACR,MAAM,CAAiB;IAE/B,YAAY,MAAsB;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,sCAAsC;QACtC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,SAAS,GAAyB;YACtC,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,0BAA0B;SACvF,CAAC;QAEF,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,GAAG,CAAU,GAAW,EAAE,MAAyB;QACvD,iDAAiD;QACjD,4FAA4F;QAC5F,MAAM,IAAI,KAAK,CAAC,mGAAmG,CAAC,CAAC;IACvH,CAAC;IAED,KAAK,CAAC,IAAI,CAAU,GAAW,EAAE,IAAU;QACzC,MAAM,IAAI,KAAK,CAAC,mGAAmG,CAAC,CAAC;IACvH,CAAC;IAED,KAAK,CAAC,KAAK,CAAU,GAAW,EAAE,IAAU;QAC1C,MAAM,IAAI,KAAK,CAAC,mGAAmG,CAAC,CAAC;IACvH,CAAC;IAED,KAAK,CAAC,MAAM,CAAU,GAAW;QAC/B,MAAM,IAAI,KAAK,CAAC,mGAAmG,CAAC,CAAC;IACvH,CAAC;CACF"}
|
|
@@ -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 createCampaignsCommand(client: CakemailClient, formatter: OutputFormatter): Command;
|
|
5
|
+
//# sourceMappingURL=campaigns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"campaigns.d.ts","sourceRoot":"","sources":["../../src/commands/campaigns.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,sBAAsB,CAAC,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe,GAAG,OAAO,CAkUlG"}
|