@eusend_dev/sdk 0.1.1 → 0.3.1
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 +49 -18
- package/dist/index.cjs +58 -15
- package/dist/index.d.cts +33 -4
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +33 -4
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +58 -15
- package/dist/index.mjs.map +1 -1
- package/package.json +11 -1
package/README.md
CHANGED
|
@@ -60,7 +60,33 @@ console.log(data?.id) // em_...
|
|
|
60
60
|
| `trackOpens` | `boolean` | Track open events (default: `true`) |
|
|
61
61
|
| `trackClicks` | `boolean` | Track click events (default: `true`) |
|
|
62
62
|
|
|
63
|
-
At least one of `html`, `text`, or `templateId` is required.
|
|
63
|
+
At least one of `html`, `react`, `text`, or `templateId` is required.
|
|
64
|
+
|
|
65
|
+
### Send with React Email
|
|
66
|
+
|
|
67
|
+
Pass a React Email component via the `react` field. The SDK renders it to HTML locally before sending — the JSX source never travels over the wire.
|
|
68
|
+
|
|
69
|
+
```tsx
|
|
70
|
+
import { Eusend } from '@eusend_dev/sdk'
|
|
71
|
+
import { WelcomeEmail } from './emails/welcome'
|
|
72
|
+
|
|
73
|
+
const client = new Eusend()
|
|
74
|
+
|
|
75
|
+
await client.emails.send({
|
|
76
|
+
from: 'hello@yourdomain.com',
|
|
77
|
+
to: 'user@example.com',
|
|
78
|
+
subject: 'Welcome',
|
|
79
|
+
react: <WelcomeEmail name="Jane" />,
|
|
80
|
+
})
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Requires `react` and `@react-email/render` as peer dependencies:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
npm install react @react-email/render
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
If you prefer to render yourself, pass the resulting HTML via `html` instead — useful when you want one rendered template to serve multiple sends.
|
|
64
90
|
|
|
65
91
|
### Idempotent sends
|
|
66
92
|
|
|
@@ -329,31 +355,22 @@ const { data } = await client.templates.create({
|
|
|
329
355
|
})
|
|
330
356
|
```
|
|
331
357
|
|
|
332
|
-
### Create a template (React)
|
|
358
|
+
### Create a template (React Email)
|
|
333
359
|
|
|
334
|
-
Pass
|
|
360
|
+
Pass a React Email component via `react`. The SDK renders it to HTML locally before submitting — the JSX source never travels over the wire.
|
|
361
|
+
|
|
362
|
+
```tsx
|
|
363
|
+
import { OrderConfirmation } from './emails/order-confirmation'
|
|
335
364
|
|
|
336
|
-
```ts
|
|
337
365
|
const { data } = await client.templates.create({
|
|
338
366
|
name: 'Order confirmation',
|
|
339
367
|
subject: 'Your order {{order_id}} is confirmed',
|
|
340
|
-
|
|
341
|
-
<Html>
|
|
342
|
-
<Head />
|
|
343
|
-
<Preview>Order {{order_id}} confirmed</Preview>
|
|
344
|
-
<Body style={{ backgroundColor: '#f4f4f5', fontFamily: 'system-ui, sans-serif' }}>
|
|
345
|
-
<Container style={{ maxWidth: '520px', margin: '40px auto', backgroundColor: '#fff', borderRadius: '8px' }}>
|
|
346
|
-
<Section style={{ padding: '32px' }}>
|
|
347
|
-
<Heading>Order confirmed ✓</Heading>
|
|
348
|
-
<Text>Hi {{first_name}}, your order <strong>{{order_id}}</strong> is on its way.</Text>
|
|
349
|
-
<Button href="https://yourapp.com/orders/{{order_id}}">View order</Button>
|
|
350
|
-
</Section>
|
|
351
|
-
</Container>
|
|
352
|
-
</Body>
|
|
353
|
-
</Html>`,
|
|
368
|
+
react: <OrderConfirmation />,
|
|
354
369
|
})
|
|
355
370
|
```
|
|
356
371
|
|
|
372
|
+
Use `{{variable}}` placeholders anywhere in your React component; they pass through to the rendered HTML and are substituted at send time when you provide `variables`. If you'd rather render yourself, pass `html` instead.
|
|
373
|
+
|
|
357
374
|
### Send using a template
|
|
358
375
|
|
|
359
376
|
```ts
|
|
@@ -446,6 +463,20 @@ const { data } = await client.broadcasts.create({
|
|
|
446
463
|
})
|
|
447
464
|
```
|
|
448
465
|
|
|
466
|
+
You can also pass a React Email component via `react`, a saved template via `templateId`, or plain HTML. With `react`, the SDK renders to HTML locally before submitting:
|
|
467
|
+
|
|
468
|
+
```tsx
|
|
469
|
+
import { MayNewsletter } from './emails/may-newsletter'
|
|
470
|
+
|
|
471
|
+
await client.broadcasts.create({
|
|
472
|
+
name: 'May newsletter',
|
|
473
|
+
audienceId: 'aud_...',
|
|
474
|
+
from: 'Sivert <hello@yourdomain.com>',
|
|
475
|
+
subject: 'May update',
|
|
476
|
+
react: <MayNewsletter />,
|
|
477
|
+
})
|
|
478
|
+
```
|
|
479
|
+
|
|
449
480
|
`{{first_name}}`, `{{last_name}}`, `{{full_name}}`, and `{{email}}` are automatically available per recipient. Custom variables can be defined on the broadcast and are merged with per-recipient data.
|
|
450
481
|
|
|
451
482
|
### Send a broadcast
|
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,28 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
//#region src/react-render.ts
|
|
3
|
+
let renderPromise = null;
|
|
4
|
+
async function getRender() {
|
|
5
|
+
if (!renderPromise) renderPromise = (async () => {
|
|
6
|
+
try {
|
|
7
|
+
const mod = await import("@react-email/render");
|
|
8
|
+
return (element) => Promise.resolve(mod.render(element));
|
|
9
|
+
} catch {
|
|
10
|
+
throw new Error("Passing `react:` requires `@react-email/render` and `react` to be installed. Run: npm install @react-email/render react");
|
|
11
|
+
}
|
|
12
|
+
})();
|
|
13
|
+
return renderPromise;
|
|
14
|
+
}
|
|
15
|
+
async function renderReactEmail(element) {
|
|
16
|
+
return (await getRender())(element);
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
2
19
|
//#region src/emails.ts
|
|
3
|
-
function
|
|
20
|
+
async function resolveHtml(options) {
|
|
21
|
+
if (options.html) return options.html;
|
|
22
|
+
if (options.react) return renderReactEmail(options.react);
|
|
23
|
+
}
|
|
24
|
+
async function toApiPayload(options) {
|
|
25
|
+
const html = await resolveHtml(options);
|
|
4
26
|
return {
|
|
5
27
|
from: options.from,
|
|
6
28
|
to: options.to,
|
|
@@ -8,7 +30,7 @@ function toApiPayload(options) {
|
|
|
8
30
|
bcc: options.bcc,
|
|
9
31
|
reply_to: options.replyTo,
|
|
10
32
|
subject: options.subject,
|
|
11
|
-
html
|
|
33
|
+
html,
|
|
12
34
|
text: options.text,
|
|
13
35
|
template_id: options.templateId,
|
|
14
36
|
variables: options.variables,
|
|
@@ -24,10 +46,12 @@ var Emails = class {
|
|
|
24
46
|
async send(options, requestOptions) {
|
|
25
47
|
const extraHeaders = {};
|
|
26
48
|
if (requestOptions?.idempotencyKey) extraHeaders["Idempotency-Key"] = requestOptions.idempotencyKey;
|
|
27
|
-
|
|
49
|
+
const payload = await toApiPayload(options);
|
|
50
|
+
return this.client.post("/emails", payload, extraHeaders);
|
|
28
51
|
}
|
|
29
52
|
async batch(emails) {
|
|
30
|
-
|
|
53
|
+
const payloads = await Promise.all(emails.map(toApiPayload));
|
|
54
|
+
return this.client.post("/emails/batch", { emails: payloads });
|
|
31
55
|
}
|
|
32
56
|
async list(options = {}) {
|
|
33
57
|
const params = new URLSearchParams();
|
|
@@ -166,16 +190,29 @@ var Audiences = class {
|
|
|
166
190
|
};
|
|
167
191
|
//#endregion
|
|
168
192
|
//#region src/templates.ts
|
|
193
|
+
async function resolveTemplateHtml(options) {
|
|
194
|
+
if (options.html) return options.html;
|
|
195
|
+
if (options.react) return renderReactEmail(options.react);
|
|
196
|
+
}
|
|
169
197
|
var Templates = class {
|
|
170
198
|
constructor(client) {
|
|
171
199
|
this.client = client;
|
|
172
200
|
}
|
|
173
|
-
create(options) {
|
|
201
|
+
async create(options) {
|
|
202
|
+
const html = await resolveTemplateHtml(options);
|
|
203
|
+
if (!html) return {
|
|
204
|
+
data: null,
|
|
205
|
+
error: {
|
|
206
|
+
message: "Either html or react is required",
|
|
207
|
+
statusCode: null,
|
|
208
|
+
name: "VALIDATION_ERROR"
|
|
209
|
+
},
|
|
210
|
+
headers: null
|
|
211
|
+
};
|
|
174
212
|
return this.client.post("/templates", {
|
|
175
213
|
name: options.name,
|
|
176
214
|
subject: options.subject,
|
|
177
|
-
html
|
|
178
|
-
react_source: options.reactSource
|
|
215
|
+
html
|
|
179
216
|
});
|
|
180
217
|
}
|
|
181
218
|
async list() {
|
|
@@ -190,12 +227,12 @@ var Templates = class {
|
|
|
190
227
|
get(id) {
|
|
191
228
|
return this.client.get(`/templates/${id}`);
|
|
192
229
|
}
|
|
193
|
-
update(id, options) {
|
|
230
|
+
async update(id, options) {
|
|
231
|
+
const html = await resolveTemplateHtml(options);
|
|
194
232
|
return this.client.patch(`/templates/${id}`, {
|
|
195
233
|
name: options.name,
|
|
196
234
|
subject: options.subject,
|
|
197
|
-
html
|
|
198
|
-
react_source: options.reactSource
|
|
235
|
+
html
|
|
199
236
|
});
|
|
200
237
|
}
|
|
201
238
|
delete(id) {
|
|
@@ -238,17 +275,22 @@ var Webhooks = class {
|
|
|
238
275
|
};
|
|
239
276
|
//#endregion
|
|
240
277
|
//#region src/broadcasts.ts
|
|
278
|
+
async function resolveBroadcastHtml(options) {
|
|
279
|
+
if (options.html) return options.html;
|
|
280
|
+
if (options.react) return renderReactEmail(options.react);
|
|
281
|
+
}
|
|
241
282
|
var Broadcasts = class {
|
|
242
283
|
constructor(client) {
|
|
243
284
|
this.client = client;
|
|
244
285
|
}
|
|
245
|
-
create(options) {
|
|
286
|
+
async create(options) {
|
|
287
|
+
const html = await resolveBroadcastHtml(options);
|
|
246
288
|
return this.client.post("/broadcasts", {
|
|
247
289
|
name: options.name,
|
|
248
290
|
audience_id: options.audienceId,
|
|
249
291
|
from: options.from,
|
|
250
292
|
subject: options.subject,
|
|
251
|
-
html
|
|
293
|
+
html,
|
|
252
294
|
template_id: options.templateId,
|
|
253
295
|
template_variables: options.templateVariables
|
|
254
296
|
});
|
|
@@ -265,13 +307,14 @@ var Broadcasts = class {
|
|
|
265
307
|
get(id) {
|
|
266
308
|
return this.client.get(`/broadcasts/${id}`);
|
|
267
309
|
}
|
|
268
|
-
update(id, options) {
|
|
310
|
+
async update(id, options) {
|
|
311
|
+
const html = await resolveBroadcastHtml(options);
|
|
269
312
|
return this.client.patch(`/broadcasts/${id}`, {
|
|
270
313
|
name: options.name,
|
|
271
314
|
audience_id: options.audienceId,
|
|
272
315
|
from: options.from,
|
|
273
316
|
subject: options.subject,
|
|
274
|
-
html
|
|
317
|
+
html,
|
|
275
318
|
template_id: options.templateId,
|
|
276
319
|
template_variables: options.templateVariables,
|
|
277
320
|
scheduled_at: options.scheduledAt
|
|
@@ -290,7 +333,7 @@ var Broadcasts = class {
|
|
|
290
333
|
//#endregion
|
|
291
334
|
//#region src/eusend.ts
|
|
292
335
|
const DEFAULT_BASE_URL = "https://api.eusend.dev";
|
|
293
|
-
const SDK_VERSION = "0.
|
|
336
|
+
const SDK_VERSION = "0.3.1";
|
|
294
337
|
var Eusend = class {
|
|
295
338
|
constructor(key, options) {
|
|
296
339
|
const apiKey = key ?? (typeof process !== "undefined" ? process.env["EUSEND_API_KEY"] : void 0);
|
package/dist/index.d.cts
CHANGED
|
@@ -15,6 +15,13 @@ type EusendResponse<T> = {
|
|
|
15
15
|
headers: Record<string, string> | null;
|
|
16
16
|
};
|
|
17
17
|
//#endregion
|
|
18
|
+
//#region src/react-render.d.ts
|
|
19
|
+
type ReactEmailElement = {
|
|
20
|
+
readonly type: unknown;
|
|
21
|
+
readonly props: unknown;
|
|
22
|
+
readonly key: string | number | null;
|
|
23
|
+
};
|
|
24
|
+
//#endregion
|
|
18
25
|
//#region src/emails.d.ts
|
|
19
26
|
type EmailStatus = 'queued' | 'sending' | 'sent' | 'delivered' | 'bounced' | 'complained' | 'suppressed' | 'failed';
|
|
20
27
|
type EmailEventType = 'sent' | 'delivered' | 'opened' | 'clicked' | 'bounced' | 'complained';
|
|
@@ -27,6 +34,12 @@ interface SendEmailOptions {
|
|
|
27
34
|
subject?: string;
|
|
28
35
|
html?: string;
|
|
29
36
|
text?: string;
|
|
37
|
+
/**
|
|
38
|
+
* A React Email component. The SDK renders it to HTML locally before sending
|
|
39
|
+
* — the JSX source never travels over the wire. Requires `@react-email/render`
|
|
40
|
+
* and `react` as peer dependencies. Ignored when `html` is also provided.
|
|
41
|
+
*/
|
|
42
|
+
react?: ReactEmailElement;
|
|
30
43
|
templateId?: string;
|
|
31
44
|
variables?: Record<string, unknown>;
|
|
32
45
|
headers?: Record<string, string>;
|
|
@@ -233,17 +246,23 @@ declare class Audiences {
|
|
|
233
246
|
}
|
|
234
247
|
//#endregion
|
|
235
248
|
//#region src/templates.d.ts
|
|
236
|
-
interface
|
|
249
|
+
interface TemplateHtmlOrReact {
|
|
250
|
+
/**
|
|
251
|
+
* A React Email component. The SDK renders it to HTML locally before sending.
|
|
252
|
+
* Requires `@react-email/render` and `react` as peer dependencies.
|
|
253
|
+
* Ignored when `html` is also provided.
|
|
254
|
+
*/
|
|
255
|
+
react?: ReactEmailElement;
|
|
256
|
+
}
|
|
257
|
+
interface CreateTemplateOptions extends TemplateHtmlOrReact {
|
|
237
258
|
name: string;
|
|
238
259
|
subject: string;
|
|
239
260
|
html?: string;
|
|
240
|
-
reactSource?: string;
|
|
241
261
|
}
|
|
242
|
-
interface UpdateTemplateOptions {
|
|
262
|
+
interface UpdateTemplateOptions extends TemplateHtmlOrReact {
|
|
243
263
|
name?: string;
|
|
244
264
|
subject?: string;
|
|
245
265
|
html?: string;
|
|
246
|
-
reactSource?: string;
|
|
247
266
|
}
|
|
248
267
|
interface Template {
|
|
249
268
|
id: string;
|
|
@@ -323,6 +342,12 @@ interface CreateBroadcastOptions {
|
|
|
323
342
|
from: string;
|
|
324
343
|
subject: string;
|
|
325
344
|
html?: string;
|
|
345
|
+
/**
|
|
346
|
+
* A React Email component. The SDK renders it to HTML locally before sending —
|
|
347
|
+
* the JSX source never travels over the wire. Requires `@react-email/render`
|
|
348
|
+
* and `react` as peer dependencies. Ignored when `html` is also provided.
|
|
349
|
+
*/
|
|
350
|
+
react?: ReactEmailElement;
|
|
326
351
|
templateId?: string;
|
|
327
352
|
templateVariables?: Record<string, string>;
|
|
328
353
|
}
|
|
@@ -332,6 +357,10 @@ interface UpdateBroadcastOptions {
|
|
|
332
357
|
from?: string;
|
|
333
358
|
subject?: string;
|
|
334
359
|
html?: string;
|
|
360
|
+
/**
|
|
361
|
+
* See `react` on CreateBroadcastOptions. Rendered to HTML locally before sending.
|
|
362
|
+
*/
|
|
363
|
+
react?: ReactEmailElement;
|
|
335
364
|
templateId?: string | null;
|
|
336
365
|
templateVariables?: Record<string, string> | null;
|
|
337
366
|
scheduledAt?: string | null;
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/interfaces.ts","../src/emails.ts","../src/domains.ts","../src/api-keys.ts","../src/audiences.ts","../src/templates.ts","../src/webhooks.ts","../src/broadcasts.ts","../src/eusend.ts"],"mappings":";KAAY,eAAA;AAAA,UAeK,WAAA;EACf,OAAA;EACA,UAAA;EACA,IAAA,EAAM,eAAe;AAAA;AAAA,KAGX,cAAA;EACN,IAAA,EAAM,CAAA;EAAG,KAAA;EAAa,OAAA,EAAS,MAAA;AAAA;EAC/B,IAAA;EAAY,KAAA,EAAO,WAAA;EAAa,OAAA,EAAS,MAAA;AAAA;;;KCpBnC,WAAA;AAAA,KAUA,cAAA;AAAA,UAQK,gBAAA;EACf,IAAA;EACA,EAAA;EACA,EAAA;EACA,GAAA;EACA,OAAA;EACA,OAAA;EACA,IAAA;EACA,IAAA;
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/interfaces.ts","../src/react-render.ts","../src/emails.ts","../src/domains.ts","../src/api-keys.ts","../src/audiences.ts","../src/templates.ts","../src/webhooks.ts","../src/broadcasts.ts","../src/eusend.ts"],"mappings":"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"}
|
package/dist/index.d.mts
CHANGED
|
@@ -15,6 +15,13 @@ type EusendResponse<T> = {
|
|
|
15
15
|
headers: Record<string, string> | null;
|
|
16
16
|
};
|
|
17
17
|
//#endregion
|
|
18
|
+
//#region src/react-render.d.ts
|
|
19
|
+
type ReactEmailElement = {
|
|
20
|
+
readonly type: unknown;
|
|
21
|
+
readonly props: unknown;
|
|
22
|
+
readonly key: string | number | null;
|
|
23
|
+
};
|
|
24
|
+
//#endregion
|
|
18
25
|
//#region src/emails.d.ts
|
|
19
26
|
type EmailStatus = 'queued' | 'sending' | 'sent' | 'delivered' | 'bounced' | 'complained' | 'suppressed' | 'failed';
|
|
20
27
|
type EmailEventType = 'sent' | 'delivered' | 'opened' | 'clicked' | 'bounced' | 'complained';
|
|
@@ -27,6 +34,12 @@ interface SendEmailOptions {
|
|
|
27
34
|
subject?: string;
|
|
28
35
|
html?: string;
|
|
29
36
|
text?: string;
|
|
37
|
+
/**
|
|
38
|
+
* A React Email component. The SDK renders it to HTML locally before sending
|
|
39
|
+
* — the JSX source never travels over the wire. Requires `@react-email/render`
|
|
40
|
+
* and `react` as peer dependencies. Ignored when `html` is also provided.
|
|
41
|
+
*/
|
|
42
|
+
react?: ReactEmailElement;
|
|
30
43
|
templateId?: string;
|
|
31
44
|
variables?: Record<string, unknown>;
|
|
32
45
|
headers?: Record<string, string>;
|
|
@@ -233,17 +246,23 @@ declare class Audiences {
|
|
|
233
246
|
}
|
|
234
247
|
//#endregion
|
|
235
248
|
//#region src/templates.d.ts
|
|
236
|
-
interface
|
|
249
|
+
interface TemplateHtmlOrReact {
|
|
250
|
+
/**
|
|
251
|
+
* A React Email component. The SDK renders it to HTML locally before sending.
|
|
252
|
+
* Requires `@react-email/render` and `react` as peer dependencies.
|
|
253
|
+
* Ignored when `html` is also provided.
|
|
254
|
+
*/
|
|
255
|
+
react?: ReactEmailElement;
|
|
256
|
+
}
|
|
257
|
+
interface CreateTemplateOptions extends TemplateHtmlOrReact {
|
|
237
258
|
name: string;
|
|
238
259
|
subject: string;
|
|
239
260
|
html?: string;
|
|
240
|
-
reactSource?: string;
|
|
241
261
|
}
|
|
242
|
-
interface UpdateTemplateOptions {
|
|
262
|
+
interface UpdateTemplateOptions extends TemplateHtmlOrReact {
|
|
243
263
|
name?: string;
|
|
244
264
|
subject?: string;
|
|
245
265
|
html?: string;
|
|
246
|
-
reactSource?: string;
|
|
247
266
|
}
|
|
248
267
|
interface Template {
|
|
249
268
|
id: string;
|
|
@@ -323,6 +342,12 @@ interface CreateBroadcastOptions {
|
|
|
323
342
|
from: string;
|
|
324
343
|
subject: string;
|
|
325
344
|
html?: string;
|
|
345
|
+
/**
|
|
346
|
+
* A React Email component. The SDK renders it to HTML locally before sending —
|
|
347
|
+
* the JSX source never travels over the wire. Requires `@react-email/render`
|
|
348
|
+
* and `react` as peer dependencies. Ignored when `html` is also provided.
|
|
349
|
+
*/
|
|
350
|
+
react?: ReactEmailElement;
|
|
326
351
|
templateId?: string;
|
|
327
352
|
templateVariables?: Record<string, string>;
|
|
328
353
|
}
|
|
@@ -332,6 +357,10 @@ interface UpdateBroadcastOptions {
|
|
|
332
357
|
from?: string;
|
|
333
358
|
subject?: string;
|
|
334
359
|
html?: string;
|
|
360
|
+
/**
|
|
361
|
+
* See `react` on CreateBroadcastOptions. Rendered to HTML locally before sending.
|
|
362
|
+
*/
|
|
363
|
+
react?: ReactEmailElement;
|
|
335
364
|
templateId?: string | null;
|
|
336
365
|
templateVariables?: Record<string, string> | null;
|
|
337
366
|
scheduledAt?: string | null;
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/interfaces.ts","../src/emails.ts","../src/domains.ts","../src/api-keys.ts","../src/audiences.ts","../src/templates.ts","../src/webhooks.ts","../src/broadcasts.ts","../src/eusend.ts"],"mappings":";KAAY,eAAA;AAAA,UAeK,WAAA;EACf,OAAA;EACA,UAAA;EACA,IAAA,EAAM,eAAe;AAAA;AAAA,KAGX,cAAA;EACN,IAAA,EAAM,CAAA;EAAG,KAAA;EAAa,OAAA,EAAS,MAAA;AAAA;EAC/B,IAAA;EAAY,KAAA,EAAO,WAAA;EAAa,OAAA,EAAS,MAAA;AAAA;;;KCpBnC,WAAA;AAAA,KAUA,cAAA;AAAA,UAQK,gBAAA;EACf,IAAA;EACA,EAAA;EACA,EAAA;EACA,GAAA;EACA,OAAA;EACA,OAAA;EACA,IAAA;EACA,IAAA;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/interfaces.ts","../src/react-render.ts","../src/emails.ts","../src/domains.ts","../src/api-keys.ts","../src/audiences.ts","../src/templates.ts","../src/webhooks.ts","../src/broadcasts.ts","../src/eusend.ts"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
|
+
//#region src/react-render.ts
|
|
2
|
+
let renderPromise = null;
|
|
3
|
+
async function getRender() {
|
|
4
|
+
if (!renderPromise) renderPromise = (async () => {
|
|
5
|
+
try {
|
|
6
|
+
const mod = await import("@react-email/render");
|
|
7
|
+
return (element) => Promise.resolve(mod.render(element));
|
|
8
|
+
} catch {
|
|
9
|
+
throw new Error("Passing `react:` requires `@react-email/render` and `react` to be installed. Run: npm install @react-email/render react");
|
|
10
|
+
}
|
|
11
|
+
})();
|
|
12
|
+
return renderPromise;
|
|
13
|
+
}
|
|
14
|
+
async function renderReactEmail(element) {
|
|
15
|
+
return (await getRender())(element);
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
1
18
|
//#region src/emails.ts
|
|
2
|
-
function
|
|
19
|
+
async function resolveHtml(options) {
|
|
20
|
+
if (options.html) return options.html;
|
|
21
|
+
if (options.react) return renderReactEmail(options.react);
|
|
22
|
+
}
|
|
23
|
+
async function toApiPayload(options) {
|
|
24
|
+
const html = await resolveHtml(options);
|
|
3
25
|
return {
|
|
4
26
|
from: options.from,
|
|
5
27
|
to: options.to,
|
|
@@ -7,7 +29,7 @@ function toApiPayload(options) {
|
|
|
7
29
|
bcc: options.bcc,
|
|
8
30
|
reply_to: options.replyTo,
|
|
9
31
|
subject: options.subject,
|
|
10
|
-
html
|
|
32
|
+
html,
|
|
11
33
|
text: options.text,
|
|
12
34
|
template_id: options.templateId,
|
|
13
35
|
variables: options.variables,
|
|
@@ -23,10 +45,12 @@ var Emails = class {
|
|
|
23
45
|
async send(options, requestOptions) {
|
|
24
46
|
const extraHeaders = {};
|
|
25
47
|
if (requestOptions?.idempotencyKey) extraHeaders["Idempotency-Key"] = requestOptions.idempotencyKey;
|
|
26
|
-
|
|
48
|
+
const payload = await toApiPayload(options);
|
|
49
|
+
return this.client.post("/emails", payload, extraHeaders);
|
|
27
50
|
}
|
|
28
51
|
async batch(emails) {
|
|
29
|
-
|
|
52
|
+
const payloads = await Promise.all(emails.map(toApiPayload));
|
|
53
|
+
return this.client.post("/emails/batch", { emails: payloads });
|
|
30
54
|
}
|
|
31
55
|
async list(options = {}) {
|
|
32
56
|
const params = new URLSearchParams();
|
|
@@ -165,16 +189,29 @@ var Audiences = class {
|
|
|
165
189
|
};
|
|
166
190
|
//#endregion
|
|
167
191
|
//#region src/templates.ts
|
|
192
|
+
async function resolveTemplateHtml(options) {
|
|
193
|
+
if (options.html) return options.html;
|
|
194
|
+
if (options.react) return renderReactEmail(options.react);
|
|
195
|
+
}
|
|
168
196
|
var Templates = class {
|
|
169
197
|
constructor(client) {
|
|
170
198
|
this.client = client;
|
|
171
199
|
}
|
|
172
|
-
create(options) {
|
|
200
|
+
async create(options) {
|
|
201
|
+
const html = await resolveTemplateHtml(options);
|
|
202
|
+
if (!html) return {
|
|
203
|
+
data: null,
|
|
204
|
+
error: {
|
|
205
|
+
message: "Either html or react is required",
|
|
206
|
+
statusCode: null,
|
|
207
|
+
name: "VALIDATION_ERROR"
|
|
208
|
+
},
|
|
209
|
+
headers: null
|
|
210
|
+
};
|
|
173
211
|
return this.client.post("/templates", {
|
|
174
212
|
name: options.name,
|
|
175
213
|
subject: options.subject,
|
|
176
|
-
html
|
|
177
|
-
react_source: options.reactSource
|
|
214
|
+
html
|
|
178
215
|
});
|
|
179
216
|
}
|
|
180
217
|
async list() {
|
|
@@ -189,12 +226,12 @@ var Templates = class {
|
|
|
189
226
|
get(id) {
|
|
190
227
|
return this.client.get(`/templates/${id}`);
|
|
191
228
|
}
|
|
192
|
-
update(id, options) {
|
|
229
|
+
async update(id, options) {
|
|
230
|
+
const html = await resolveTemplateHtml(options);
|
|
193
231
|
return this.client.patch(`/templates/${id}`, {
|
|
194
232
|
name: options.name,
|
|
195
233
|
subject: options.subject,
|
|
196
|
-
html
|
|
197
|
-
react_source: options.reactSource
|
|
234
|
+
html
|
|
198
235
|
});
|
|
199
236
|
}
|
|
200
237
|
delete(id) {
|
|
@@ -237,17 +274,22 @@ var Webhooks = class {
|
|
|
237
274
|
};
|
|
238
275
|
//#endregion
|
|
239
276
|
//#region src/broadcasts.ts
|
|
277
|
+
async function resolveBroadcastHtml(options) {
|
|
278
|
+
if (options.html) return options.html;
|
|
279
|
+
if (options.react) return renderReactEmail(options.react);
|
|
280
|
+
}
|
|
240
281
|
var Broadcasts = class {
|
|
241
282
|
constructor(client) {
|
|
242
283
|
this.client = client;
|
|
243
284
|
}
|
|
244
|
-
create(options) {
|
|
285
|
+
async create(options) {
|
|
286
|
+
const html = await resolveBroadcastHtml(options);
|
|
245
287
|
return this.client.post("/broadcasts", {
|
|
246
288
|
name: options.name,
|
|
247
289
|
audience_id: options.audienceId,
|
|
248
290
|
from: options.from,
|
|
249
291
|
subject: options.subject,
|
|
250
|
-
html
|
|
292
|
+
html,
|
|
251
293
|
template_id: options.templateId,
|
|
252
294
|
template_variables: options.templateVariables
|
|
253
295
|
});
|
|
@@ -264,13 +306,14 @@ var Broadcasts = class {
|
|
|
264
306
|
get(id) {
|
|
265
307
|
return this.client.get(`/broadcasts/${id}`);
|
|
266
308
|
}
|
|
267
|
-
update(id, options) {
|
|
309
|
+
async update(id, options) {
|
|
310
|
+
const html = await resolveBroadcastHtml(options);
|
|
268
311
|
return this.client.patch(`/broadcasts/${id}`, {
|
|
269
312
|
name: options.name,
|
|
270
313
|
audience_id: options.audienceId,
|
|
271
314
|
from: options.from,
|
|
272
315
|
subject: options.subject,
|
|
273
|
-
html
|
|
316
|
+
html,
|
|
274
317
|
template_id: options.templateId,
|
|
275
318
|
template_variables: options.templateVariables,
|
|
276
319
|
scheduled_at: options.scheduledAt
|
|
@@ -289,7 +332,7 @@ var Broadcasts = class {
|
|
|
289
332
|
//#endregion
|
|
290
333
|
//#region src/eusend.ts
|
|
291
334
|
const DEFAULT_BASE_URL = "https://api.eusend.dev";
|
|
292
|
-
const SDK_VERSION = "0.
|
|
335
|
+
const SDK_VERSION = "0.3.1";
|
|
293
336
|
var Eusend = class {
|
|
294
337
|
constructor(key, options) {
|
|
295
338
|
const apiKey = key ?? (typeof process !== "undefined" ? process.env["EUSEND_API_KEY"] : void 0);
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/emails.ts","../src/domains.ts","../src/api-keys.ts","../src/audiences.ts","../src/templates.ts","../src/webhooks.ts","../src/broadcasts.ts","../src/eusend.ts"],"sourcesContent":["import type { Eusend } from './eusend';\r\nimport type { EusendResponse } from './interfaces';\r\n\r\nexport type EmailStatus =\r\n | 'queued'\r\n | 'sending'\r\n | 'sent'\r\n | 'delivered'\r\n | 'bounced'\r\n | 'complained'\r\n | 'suppressed'\r\n | 'failed';\r\n\r\nexport type EmailEventType =\r\n | 'sent'\r\n | 'delivered'\r\n | 'opened'\r\n | 'clicked'\r\n | 'bounced'\r\n | 'complained';\r\n\r\nexport interface SendEmailOptions {\r\n from: string;\r\n to: string | string[];\r\n cc?: string | string[];\r\n bcc?: string | string[];\r\n replyTo?: string | string[];\r\n subject?: string;\r\n html?: string;\r\n text?: string;\r\n templateId?: string;\r\n variables?: Record<string, unknown>;\r\n headers?: Record<string, string>;\r\n trackOpens?: boolean;\r\n trackClicks?: boolean;\r\n}\r\n\r\nexport interface SendEmailRequestOptions {\r\n idempotencyKey?: string;\r\n}\r\n\r\nexport interface SendEmailResponse {\r\n id: string;\r\n}\r\n\r\nexport interface BatchSendResponse {\r\n data: SendEmailResponse[];\r\n}\r\n\r\nexport interface EmailEvent {\r\n id: string;\r\n type: EmailEventType;\r\n metadata: Record<string, unknown>;\r\n createdAt: string;\r\n}\r\n\r\nexport interface Email {\r\n id: string;\r\n from: string;\r\n to: string[];\r\n cc: string[];\r\n bcc: string[];\r\n replyTo: string[];\r\n subject: string;\r\n html: string | null;\r\n text: string | null;\r\n status: EmailStatus;\r\n testMode: boolean;\r\n templateId: string | null;\r\n createdAt: string;\r\n events: EmailEvent[];\r\n}\r\n\r\nexport interface EmailListItem {\r\n id: string;\r\n from: string;\r\n to: string[];\r\n subject: string;\r\n status: EmailStatus;\r\n testMode: boolean;\r\n createdAt: string;\r\n}\r\n\r\nexport interface ListEmailsOptions {\r\n limit?: number;\r\n cursor?: string;\r\n status?: EmailStatus;\r\n from?: string;\r\n to?: string;\r\n}\r\n\r\nexport interface ListEmailsResponse {\r\n data: EmailListItem[];\r\n nextCursor: string | null;\r\n}\r\n\r\nfunction toApiPayload(options: SendEmailOptions) {\r\n return {\r\n from: options.from,\r\n to: options.to,\r\n cc: options.cc,\r\n bcc: options.bcc,\r\n reply_to: options.replyTo,\r\n subject: options.subject,\r\n html: options.html,\r\n text: options.text,\r\n template_id: options.templateId,\r\n variables: options.variables,\r\n headers: options.headers,\r\n track_opens: options.trackOpens,\r\n track_clicks: options.trackClicks,\r\n };\r\n}\r\n\r\nexport class Emails {\r\n constructor(private readonly client: Eusend) {}\r\n\r\n async send(\r\n options: SendEmailOptions,\r\n requestOptions?: SendEmailRequestOptions,\r\n ): Promise<EusendResponse<SendEmailResponse>> {\r\n const extraHeaders: Record<string, string> = {};\r\n if (requestOptions?.idempotencyKey) {\r\n extraHeaders['Idempotency-Key'] = requestOptions.idempotencyKey;\r\n }\r\n return this.client.post<SendEmailResponse>('/emails', toApiPayload(options), extraHeaders);\r\n }\r\n\r\n async batch(\r\n emails: SendEmailOptions[],\r\n ): Promise<EusendResponse<BatchSendResponse>> {\r\n return this.client.post<BatchSendResponse>('/emails/batch', {\r\n emails: emails.map(toApiPayload),\r\n });\r\n }\r\n\r\n async list(options: ListEmailsOptions = {}): Promise<EusendResponse<ListEmailsResponse>> {\r\n const params = new URLSearchParams();\r\n if (options.limit != null) params.set('limit', String(options.limit));\r\n if (options.cursor) params.set('cursor', options.cursor);\r\n if (options.status) params.set('status', options.status);\r\n if (options.from) params.set('from', options.from);\r\n if (options.to) params.set('to', options.to);\r\n const qs = params.toString();\r\n\r\n const res = await this.client.get<{ data: EmailListItem[]; next_cursor: string | null }>(\r\n qs ? `/emails?${qs}` : '/emails',\r\n );\r\n if (res.error) return res;\r\n return {\r\n data: { data: res.data.data, nextCursor: res.data.next_cursor },\r\n error: null,\r\n headers: res.headers,\r\n };\r\n }\r\n\r\n get(id: string): Promise<EusendResponse<Email>> {\r\n return this.client.get<Email>(`/emails/${id}`);\r\n }\r\n}\r\n","import type { Eusend } from './eusend';\r\nimport type { EusendResponse } from './interfaces';\r\n\r\nexport type DomainStatus = 'pending' | 'verified' | 'failed';\r\n\r\nexport interface DnsRecord {\r\n type: string;\r\n name: string;\r\n value: string;\r\n}\r\n\r\nexport interface CreateDomainResponse {\r\n id: string;\r\n name: string;\r\n dkim: DnsRecord;\r\n spf: DnsRecord;\r\n dmarc: DnsRecord;\r\n}\r\n\r\nexport interface DomainListItem {\r\n id: string;\r\n name: string;\r\n status: DomainStatus;\r\n createdAt: string;\r\n}\r\n\r\nexport interface Domain {\r\n id: string;\r\n name: string;\r\n dkimPublicKey: string;\r\n dkimSelector: string;\r\n status: DomainStatus;\r\n createdAt: string;\r\n verifiedAt: string | null;\r\n}\r\n\r\nexport class Domains {\r\n constructor(private readonly client: Eusend) {}\r\n\r\n create(name: string): Promise<EusendResponse<CreateDomainResponse>> {\r\n return this.client.post<CreateDomainResponse>('/domains', { name });\r\n }\r\n\r\n list(): Promise<EusendResponse<DomainListItem[]>> {\r\n return this.client.get<DomainListItem[]>('/domains');\r\n }\r\n\r\n get(id: string): Promise<EusendResponse<Domain>> {\r\n return this.client.get<Domain>(`/domains/${id}`);\r\n }\r\n\r\n delete(id: string): Promise<EusendResponse<{ message: string }>> {\r\n return this.client.delete<{ message: string }>(`/domains/${id}`);\r\n }\r\n\r\n verify(id: string): Promise<EusendResponse<{ message: string }>> {\r\n return this.client.post<{ message: string }>(`/domains/${id}/verify`);\r\n }\r\n}\r\n","import type { Eusend } from './eusend';\r\nimport type { EusendResponse } from './interfaces';\r\n\r\nexport interface CreateApiKeyOptions {\r\n name: string;\r\n testMode?: boolean;\r\n}\r\n\r\nexport interface CreateApiKeyResponse {\r\n id: string;\r\n name: string;\r\n key: string;\r\n prefix: string;\r\n testMode: boolean;\r\n createdAt: string;\r\n}\r\n\r\nexport interface ApiKey {\r\n id: string;\r\n name: string;\r\n prefix: string;\r\n testMode: boolean;\r\n createdAt: string;\r\n lastUsedAt: string | null;\r\n}\r\n\r\ntype CreateApiKeyApiResponse = {\r\n id: string;\r\n name: string;\r\n key: string;\r\n prefix: string;\r\n test_mode: boolean;\r\n created_at: string;\r\n};\r\n\r\nexport class ApiKeys {\r\n constructor(private readonly client: Eusend) {}\r\n\r\n async create(options: CreateApiKeyOptions): Promise<EusendResponse<CreateApiKeyResponse>> {\r\n const res = await this.client.post<CreateApiKeyApiResponse>('/api-keys', {\r\n name: options.name,\r\n test_mode: options.testMode ?? false,\r\n });\r\n if (res.error) return res;\r\n return {\r\n data: {\r\n id: res.data.id,\r\n name: res.data.name,\r\n key: res.data.key,\r\n prefix: res.data.prefix,\r\n testMode: res.data.test_mode,\r\n createdAt: res.data.created_at,\r\n },\r\n error: null,\r\n headers: res.headers,\r\n };\r\n }\r\n\r\n list(): Promise<EusendResponse<ApiKey[]>> {\r\n return this.client.get<ApiKey[]>('/api-keys');\r\n }\r\n\r\n delete(id: string): Promise<EusendResponse<{ message: string }>> {\r\n return this.client.delete<{ message: string }>(`/api-keys/${id}`);\r\n }\r\n}\r\n","import type { Eusend } from './eusend';\r\nimport type { EusendResponse } from './interfaces';\r\n\r\nexport type ContactStatus = 'subscribed' | 'unsubscribed';\r\n\r\nexport interface Audience {\r\n id: string;\r\n name: string;\r\n organizationId: string;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\nexport interface AudienceListItem {\r\n id: string;\r\n name: string;\r\n createdAt: string;\r\n contactCount: number;\r\n}\r\n\r\nexport interface Contact {\r\n id: string;\r\n audienceId: string;\r\n email: string;\r\n firstName: string | null;\r\n lastName: string | null;\r\n status: ContactStatus;\r\n unsubscribedAt: string | null;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\nexport interface CreateContactOptions {\r\n email: string;\r\n firstName?: string;\r\n lastName?: string;\r\n}\r\n\r\nexport interface UpdateContactOptions {\r\n firstName?: string;\r\n lastName?: string;\r\n unsubscribed?: boolean;\r\n}\r\n\r\nexport interface ListContactsOptions {\r\n limit?: number;\r\n cursor?: string;\r\n search?: string;\r\n subscribed?: boolean;\r\n}\r\n\r\nexport interface ListContactsResponse {\r\n data: Contact[];\r\n nextCursor: string | null;\r\n}\r\n\r\nexport interface BatchCreateContactsOptions {\r\n contacts: CreateContactOptions[];\r\n}\r\n\r\nexport class Audiences {\r\n constructor(private readonly client: Eusend) {}\r\n\r\n create(name: string): Promise<EusendResponse<Audience>> {\r\n return this.client.post<Audience>('/audiences', { name });\r\n }\r\n\r\n async list(): Promise<EusendResponse<AudienceListItem[]>> {\r\n const res = await this.client.get<{ data: AudienceListItem[] }>('/audiences');\r\n if (res.error) return res;\r\n return { data: res.data.data, error: null, headers: res.headers };\r\n }\r\n\r\n delete(id: string): Promise<EusendResponse<Record<string, never>>> {\r\n return this.client.delete<Record<string, never>>(`/audiences/${id}`);\r\n }\r\n\r\n createContact(\r\n audienceId: string,\r\n options: CreateContactOptions,\r\n ): Promise<EusendResponse<Contact>> {\r\n return this.client.post<Contact>(`/audiences/${audienceId}/contacts`, {\r\n email: options.email,\r\n first_name: options.firstName,\r\n last_name: options.lastName,\r\n });\r\n }\r\n\r\n async listContacts(\r\n audienceId: string,\r\n options: ListContactsOptions = {},\r\n ): Promise<EusendResponse<ListContactsResponse>> {\r\n const params = new URLSearchParams();\r\n if (options.limit != null) params.set('limit', String(options.limit));\r\n if (options.cursor) params.set('cursor', options.cursor);\r\n if (options.search) params.set('search', options.search);\r\n if (options.subscribed != null) params.set('subscribed', String(options.subscribed));\r\n const qs = params.toString();\r\n return this.client.get<ListContactsResponse>(\r\n qs ? `/audiences/${audienceId}/contacts?${qs}` : `/audiences/${audienceId}/contacts`,\r\n );\r\n }\r\n\r\n getContact(audienceId: string, contactId: string): Promise<EusendResponse<Contact>> {\r\n return this.client.get<Contact>(`/audiences/${audienceId}/contacts/${contactId}`);\r\n }\r\n\r\n updateContact(\r\n audienceId: string,\r\n contactId: string,\r\n options: UpdateContactOptions,\r\n ): Promise<EusendResponse<Contact>> {\r\n return this.client.patch<Contact>(`/audiences/${audienceId}/contacts/${contactId}`, {\r\n first_name: options.firstName,\r\n last_name: options.lastName,\r\n unsubscribed: options.unsubscribed,\r\n });\r\n }\r\n\r\n deleteContact(\r\n audienceId: string,\r\n contactId: string,\r\n ): Promise<EusendResponse<Record<string, never>>> {\r\n return this.client.delete<Record<string, never>>(\r\n `/audiences/${audienceId}/contacts/${contactId}`,\r\n );\r\n }\r\n\r\n batchCreateContacts(\r\n audienceId: string,\r\n options: BatchCreateContactsOptions,\r\n ): Promise<EusendResponse<{ count: number }>> {\r\n return this.client.post<{ count: number }>(`/audiences/${audienceId}/contacts/batch`, {\r\n contacts: options.contacts.map((c) => ({\r\n email: c.email,\r\n first_name: c.firstName,\r\n last_name: c.lastName,\r\n })),\r\n });\r\n }\r\n}\r\n","import type { Eusend } from './eusend';\r\nimport type { EusendResponse } from './interfaces';\r\n\r\nexport interface CreateTemplateOptions {\r\n name: string;\r\n subject: string;\r\n html?: string;\r\n reactSource?: string;\r\n}\r\n\r\nexport interface UpdateTemplateOptions {\r\n name?: string;\r\n subject?: string;\r\n html?: string;\r\n reactSource?: string;\r\n}\r\n\r\nexport interface Template {\r\n id: string;\r\n name: string;\r\n subject: string;\r\n html: string | null;\r\n reactSource: string | null;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\nexport interface TemplateListItem {\r\n id: string;\r\n name: string;\r\n subject: string;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\nexport class Templates {\r\n constructor(private readonly client: Eusend) {}\r\n\r\n create(options: CreateTemplateOptions): Promise<EusendResponse<Template>> {\r\n return this.client.post<Template>('/templates', {\r\n name: options.name,\r\n subject: options.subject,\r\n html: options.html,\r\n react_source: options.reactSource,\r\n });\r\n }\r\n\r\n async list(): Promise<EusendResponse<TemplateListItem[]>> {\r\n const res = await this.client.get<{ data: TemplateListItem[] }>('/templates');\r\n if (res.error) return res;\r\n return { data: res.data.data, error: null, headers: res.headers };\r\n }\r\n\r\n get(id: string): Promise<EusendResponse<Template>> {\r\n return this.client.get<Template>(`/templates/${id}`);\r\n }\r\n\r\n update(id: string, options: UpdateTemplateOptions): Promise<EusendResponse<Template>> {\r\n return this.client.patch<Template>(`/templates/${id}`, {\r\n name: options.name,\r\n subject: options.subject,\r\n html: options.html,\r\n react_source: options.reactSource,\r\n });\r\n }\r\n\r\n delete(id: string): Promise<EusendResponse<Record<string, never>>> {\r\n return this.client.delete<Record<string, never>>(`/templates/${id}`);\r\n }\r\n}\r\n","import type { Eusend } from './eusend';\r\nimport type { EusendResponse } from './interfaces';\r\n\r\nexport type WebhookEvent =\r\n | 'email.sent'\r\n | 'email.delivered'\r\n | 'email.bounced'\r\n | 'email.complained'\r\n | 'email.opened'\r\n | 'email.clicked'\r\n | '*';\r\n\r\nexport interface CreateWebhookOptions {\r\n url: string;\r\n events: WebhookEvent[];\r\n}\r\n\r\nexport interface UpdateWebhookOptions {\r\n url?: string;\r\n events?: WebhookEvent[];\r\n}\r\n\r\nexport interface WebhookDelivery {\r\n id: string;\r\n webhookId: string;\r\n emailId: string | null;\r\n eventType: string;\r\n payload: Record<string, unknown>;\r\n status: 'pending' | 'success' | 'failed';\r\n responseStatus: number | null;\r\n attempts: number;\r\n createdAt: string;\r\n lastAttemptAt: string | null;\r\n}\r\n\r\nexport interface Webhook {\r\n id: string;\r\n url: string;\r\n events: WebhookEvent[];\r\n createdAt: string;\r\n}\r\n\r\nexport interface WebhookWithDeliveries extends Webhook {\r\n deliveries: WebhookDelivery[];\r\n}\r\n\r\nexport interface CreateWebhookResponse extends Webhook {\r\n secret: string;\r\n}\r\n\r\nexport class Webhooks {\r\n constructor(private readonly client: Eusend) {}\r\n\r\n create(options: CreateWebhookOptions): Promise<EusendResponse<CreateWebhookResponse>> {\r\n return this.client.post<CreateWebhookResponse>('/webhooks', {\r\n url: options.url,\r\n events: options.events,\r\n });\r\n }\r\n\r\n async list(): Promise<EusendResponse<Webhook[]>> {\r\n const res = await this.client.get<{ data: Webhook[] }>('/webhooks');\r\n if (res.error) return res;\r\n return { data: res.data.data, error: null, headers: res.headers };\r\n }\r\n\r\n get(id: string): Promise<EusendResponse<WebhookWithDeliveries>> {\r\n return this.client.get<WebhookWithDeliveries>(`/webhooks/${id}`);\r\n }\r\n\r\n update(id: string, options: UpdateWebhookOptions): Promise<EusendResponse<Webhook>> {\r\n return this.client.patch<Webhook>(`/webhooks/${id}`, {\r\n url: options.url,\r\n events: options.events,\r\n });\r\n }\r\n\r\n delete(id: string): Promise<EusendResponse<Record<string, never>>> {\r\n return this.client.delete<Record<string, never>>(`/webhooks/${id}`);\r\n }\r\n}\r\n","import type { Eusend } from './eusend';\r\nimport type { EusendResponse } from './interfaces';\r\n\r\nexport type BroadcastStatus =\r\n | 'draft'\r\n | 'scheduled'\r\n | 'sending'\r\n | 'sent'\r\n | 'paused'\r\n | 'cancelled';\r\n\r\nexport interface CreateBroadcastOptions {\r\n name: string;\r\n audienceId: string;\r\n from: string;\r\n subject: string;\r\n html?: string;\r\n templateId?: string;\r\n templateVariables?: Record<string, string>;\r\n}\r\n\r\nexport interface UpdateBroadcastOptions {\r\n name?: string;\r\n audienceId?: string;\r\n from?: string;\r\n subject?: string;\r\n html?: string;\r\n templateId?: string | null;\r\n templateVariables?: Record<string, string> | null;\r\n scheduledAt?: string | null;\r\n}\r\n\r\nexport interface SendBroadcastOptions {\r\n scheduledAt?: string;\r\n}\r\n\r\nexport interface Broadcast {\r\n id: string;\r\n name: string;\r\n status: BroadcastStatus;\r\n audienceId: string;\r\n fromAddress: string;\r\n subject: string;\r\n html: string | null;\r\n templateId: string | null;\r\n templateVariables: Record<string, string> | null;\r\n scheduledAt: string | null;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\nexport interface BroadcastListItem {\r\n id: string;\r\n name: string;\r\n status: BroadcastStatus;\r\n audienceId: string;\r\n fromAddress: string;\r\n subject: string;\r\n recipientCount: number | null;\r\n sentCount: number | null;\r\n scheduledAt: string | null;\r\n startedAt: string | null;\r\n completedAt: string | null;\r\n createdAt: string;\r\n audienceName: string | null;\r\n}\r\n\r\nexport interface BroadcastDetail extends Broadcast {\r\n recipientCount: number | null;\r\n sentCount: number | null;\r\n startedAt: string | null;\r\n completedAt: string | null;\r\n stats: Record<string, number>;\r\n}\r\n\r\nexport interface SendBroadcastResponse {\r\n id: string;\r\n status: 'sending' | 'scheduled';\r\n scheduledAt: string | null;\r\n}\r\n\r\nexport class Broadcasts {\r\n constructor(private readonly client: Eusend) {}\r\n\r\n create(options: CreateBroadcastOptions): Promise<EusendResponse<Broadcast>> {\r\n return this.client.post<Broadcast>('/broadcasts', {\r\n name: options.name,\r\n audience_id: options.audienceId,\r\n from: options.from,\r\n subject: options.subject,\r\n html: options.html,\r\n template_id: options.templateId,\r\n template_variables: options.templateVariables,\r\n });\r\n }\r\n\r\n async list(): Promise<EusendResponse<BroadcastListItem[]>> {\r\n const res = await this.client.get<{ data: BroadcastListItem[] }>('/broadcasts');\r\n if (res.error) return res;\r\n return { data: res.data.data, error: null, headers: res.headers };\r\n }\r\n\r\n get(id: string): Promise<EusendResponse<BroadcastDetail>> {\r\n return this.client.get<BroadcastDetail>(`/broadcasts/${id}`);\r\n }\r\n\r\n update(id: string, options: UpdateBroadcastOptions): Promise<EusendResponse<Broadcast>> {\r\n return this.client.patch<Broadcast>(`/broadcasts/${id}`, {\r\n name: options.name,\r\n audience_id: options.audienceId,\r\n from: options.from,\r\n subject: options.subject,\r\n html: options.html,\r\n template_id: options.templateId,\r\n template_variables: options.templateVariables,\r\n scheduled_at: options.scheduledAt,\r\n });\r\n }\r\n\r\n send(id: string, options: SendBroadcastOptions = {}): Promise<EusendResponse<SendBroadcastResponse>> {\r\n return this.client.post<SendBroadcastResponse>(`/broadcasts/${id}/send`, {\r\n scheduled_at: options.scheduledAt,\r\n });\r\n }\r\n\r\n cancel(id: string): Promise<EusendResponse<Broadcast>> {\r\n return this.client.post<Broadcast>(`/broadcasts/${id}/cancel`);\r\n }\r\n\r\n delete(id: string): Promise<EusendResponse<Record<string, never>>> {\r\n return this.client.delete<Record<string, never>>(`/broadcasts/${id}`);\r\n }\r\n}\r\n","import type { EusendError, EusendResponse } from './interfaces';\r\nimport { Emails } from './emails';\r\nimport { Domains } from './domains';\r\nimport { ApiKeys } from './api-keys';\r\nimport { Audiences } from './audiences';\r\nimport { Templates } from './templates';\r\nimport { Webhooks } from './webhooks';\r\nimport { Broadcasts } from './broadcasts';\r\n\r\nconst DEFAULT_BASE_URL = 'https://api.eusend.dev';\r\nconst SDK_VERSION = '0.1.1';\r\n\r\nexport interface EusendOptions {\r\n baseUrl?: string;\r\n}\r\n\r\nexport class Eusend {\r\n readonly baseUrl: string;\r\n private readonly apiKey: string;\r\n\r\n readonly emails: Emails;\r\n readonly domains: Domains;\r\n readonly apiKeys: ApiKeys;\r\n readonly audiences: Audiences;\r\n readonly templates: Templates;\r\n readonly webhooks: Webhooks;\r\n readonly broadcasts: Broadcasts;\r\n\r\n constructor(key?: string, options?: EusendOptions) {\r\n const apiKey =\r\n key ?? (typeof process !== 'undefined' ? process.env['EUSEND_API_KEY'] : undefined);\r\n if (!apiKey) {\r\n throw new Error(\r\n 'Missing Eusend API key. Pass it to the constructor or set the EUSEND_API_KEY environment variable.',\r\n );\r\n }\r\n this.apiKey = apiKey;\r\n this.baseUrl = options?.baseUrl ?? DEFAULT_BASE_URL;\r\n\r\n this.emails = new Emails(this);\r\n this.domains = new Domains(this);\r\n this.apiKeys = new ApiKeys(this);\r\n this.audiences = new Audiences(this);\r\n this.templates = new Templates(this);\r\n this.webhooks = new Webhooks(this);\r\n this.broadcasts = new Broadcasts(this);\r\n }\r\n\r\n async fetchRequest<T>(\r\n path: string,\r\n init: RequestInit = {},\r\n extraHeaders: Record<string, string> = {},\r\n ): Promise<EusendResponse<T>> {\r\n const headers: Record<string, string> = {\r\n Authorization: `Bearer ${this.apiKey}`,\r\n 'Content-Type': 'application/json',\r\n 'User-Agent': `eusend-node/${SDK_VERSION}`,\r\n ...extraHeaders,\r\n };\r\n\r\n try {\r\n const res = await fetch(`${this.baseUrl}${path}`, { ...init, headers });\r\n const responseHeaders = Object.fromEntries(res.headers.entries());\r\n\r\n if (!res.ok) {\r\n let error: EusendError;\r\n try {\r\n const json = (await res.json()) as { error?: string; code?: string };\r\n error = {\r\n message: json.error ?? 'Unknown error',\r\n statusCode: res.status,\r\n name: ((json.code as EusendError['name']) ?? 'INTERNAL_ERROR'),\r\n };\r\n } catch {\r\n error = { message: 'Request failed', statusCode: res.status, name: 'INTERNAL_ERROR' };\r\n }\r\n return { data: null, error, headers: responseHeaders };\r\n }\r\n\r\n if (res.status === 204 || res.headers.get('content-length') === '0') {\r\n return { data: {} as T, error: null, headers: responseHeaders };\r\n }\r\n\r\n const data = (await res.json()) as T;\r\n return { data, error: null, headers: responseHeaders };\r\n } catch {\r\n return {\r\n data: null,\r\n error: {\r\n message: 'Network request failed. The request could not be resolved.',\r\n statusCode: null,\r\n name: 'application_error',\r\n },\r\n headers: null,\r\n };\r\n }\r\n }\r\n\r\n get<T>(path: string, extraHeaders?: Record<string, string>): Promise<EusendResponse<T>> {\r\n return this.fetchRequest<T>(path, { method: 'GET' }, extraHeaders);\r\n }\r\n\r\n post<T>(\r\n path: string,\r\n body?: unknown,\r\n extraHeaders?: Record<string, string>,\r\n ): Promise<EusendResponse<T>> {\r\n return this.fetchRequest<T>(\r\n path,\r\n { method: 'POST', body: body != null ? JSON.stringify(body) : undefined },\r\n extraHeaders,\r\n );\r\n }\r\n\r\n patch<T>(path: string, body?: unknown): Promise<EusendResponse<T>> {\r\n return this.fetchRequest<T>(path, {\r\n method: 'PATCH',\r\n body: body != null ? JSON.stringify(body) : undefined,\r\n });\r\n }\r\n\r\n delete<T>(path: string): Promise<EusendResponse<T>> {\r\n return this.fetchRequest<T>(path, { method: 'DELETE' });\r\n }\r\n}\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/react-render.ts","../src/emails.ts","../src/domains.ts","../src/api-keys.ts","../src/audiences.ts","../src/templates.ts","../src/webhooks.ts","../src/broadcasts.ts","../src/eusend.ts"],"sourcesContent":["// Minimal structural type so the SDK doesn't take a hard dependency on `react`.\n// Real React elements assignable to this; users who pass `react:` are expected to\n// have `react` and `@react-email/render` installed (declared as optional peers).\nexport type ReactEmailElement = {\n readonly type: unknown;\n readonly props: unknown;\n readonly key: string | number | null;\n};\n\nlet renderPromise: Promise<(element: ReactEmailElement) => Promise<string>> | null = null;\n\nasync function getRender(): Promise<(element: ReactEmailElement) => Promise<string>> {\n if (!renderPromise) {\n renderPromise = (async () => {\n try {\n const mod = (await import('@react-email/render')) as {\n render: (element: unknown, options?: { plainText?: boolean }) => Promise<string> | string;\n };\n return (element: ReactEmailElement) => Promise.resolve(mod.render(element));\n } catch {\n throw new Error(\n \"Passing `react:` requires `@react-email/render` and `react` to be installed. \" +\n 'Run: npm install @react-email/render react',\n );\n }\n })();\n }\n return renderPromise;\n}\n\nexport async function renderReactEmail(element: ReactEmailElement): Promise<string> {\n const render = await getRender();\n return render(element);\n}\n","import type { Eusend } from './eusend';\r\nimport type { EusendResponse } from './interfaces';\r\nimport { renderReactEmail, type ReactEmailElement } from './react-render';\r\n\r\nexport type EmailStatus =\r\n | 'queued'\r\n | 'sending'\r\n | 'sent'\r\n | 'delivered'\r\n | 'bounced'\r\n | 'complained'\r\n | 'suppressed'\r\n | 'failed';\r\n\r\nexport type EmailEventType =\r\n | 'sent'\r\n | 'delivered'\r\n | 'opened'\r\n | 'clicked'\r\n | 'bounced'\r\n | 'complained';\r\n\r\nexport interface SendEmailOptions {\r\n from: string;\r\n to: string | string[];\r\n cc?: string | string[];\r\n bcc?: string | string[];\r\n replyTo?: string | string[];\r\n subject?: string;\r\n html?: string;\r\n text?: string;\r\n /**\r\n * A React Email component. The SDK renders it to HTML locally before sending\r\n * — the JSX source never travels over the wire. Requires `@react-email/render`\r\n * and `react` as peer dependencies. Ignored when `html` is also provided.\r\n */\r\n react?: ReactEmailElement;\r\n templateId?: string;\r\n variables?: Record<string, unknown>;\r\n headers?: Record<string, string>;\r\n trackOpens?: boolean;\r\n trackClicks?: boolean;\r\n}\r\n\r\nexport interface SendEmailRequestOptions {\r\n idempotencyKey?: string;\r\n}\r\n\r\nexport interface SendEmailResponse {\r\n id: string;\r\n}\r\n\r\nexport interface BatchSendResponse {\r\n data: SendEmailResponse[];\r\n}\r\n\r\nexport interface EmailEvent {\r\n id: string;\r\n type: EmailEventType;\r\n metadata: Record<string, unknown>;\r\n createdAt: string;\r\n}\r\n\r\nexport interface Email {\r\n id: string;\r\n from: string;\r\n to: string[];\r\n cc: string[];\r\n bcc: string[];\r\n replyTo: string[];\r\n subject: string;\r\n html: string | null;\r\n text: string | null;\r\n status: EmailStatus;\r\n testMode: boolean;\r\n templateId: string | null;\r\n createdAt: string;\r\n events: EmailEvent[];\r\n}\r\n\r\nexport interface EmailListItem {\r\n id: string;\r\n from: string;\r\n to: string[];\r\n subject: string;\r\n status: EmailStatus;\r\n testMode: boolean;\r\n createdAt: string;\r\n}\r\n\r\nexport interface ListEmailsOptions {\r\n limit?: number;\r\n cursor?: string;\r\n status?: EmailStatus;\r\n from?: string;\r\n to?: string;\r\n}\r\n\r\nexport interface ListEmailsResponse {\r\n data: EmailListItem[];\r\n nextCursor: string | null;\r\n}\r\n\r\nasync function resolveHtml(options: SendEmailOptions): Promise<string | undefined> {\r\n if (options.html) return options.html;\r\n if (options.react) return renderReactEmail(options.react);\r\n return undefined;\r\n}\r\n\r\nasync function toApiPayload(options: SendEmailOptions) {\r\n const html = await resolveHtml(options);\r\n return {\r\n from: options.from,\r\n to: options.to,\r\n cc: options.cc,\r\n bcc: options.bcc,\r\n reply_to: options.replyTo,\r\n subject: options.subject,\r\n html,\r\n text: options.text,\r\n template_id: options.templateId,\r\n variables: options.variables,\r\n headers: options.headers,\r\n track_opens: options.trackOpens,\r\n track_clicks: options.trackClicks,\r\n };\r\n}\r\n\r\nexport class Emails {\r\n constructor(private readonly client: Eusend) {}\r\n\r\n async send(\r\n options: SendEmailOptions,\r\n requestOptions?: SendEmailRequestOptions,\r\n ): Promise<EusendResponse<SendEmailResponse>> {\r\n const extraHeaders: Record<string, string> = {};\r\n if (requestOptions?.idempotencyKey) {\r\n extraHeaders['Idempotency-Key'] = requestOptions.idempotencyKey;\r\n }\r\n const payload = await toApiPayload(options);\r\n return this.client.post<SendEmailResponse>('/emails', payload, extraHeaders);\r\n }\r\n\r\n async batch(\r\n emails: SendEmailOptions[],\r\n ): Promise<EusendResponse<BatchSendResponse>> {\r\n const payloads = await Promise.all(emails.map(toApiPayload));\r\n return this.client.post<BatchSendResponse>('/emails/batch', {\r\n emails: payloads,\r\n });\r\n }\r\n\r\n async list(options: ListEmailsOptions = {}): Promise<EusendResponse<ListEmailsResponse>> {\r\n const params = new URLSearchParams();\r\n if (options.limit != null) params.set('limit', String(options.limit));\r\n if (options.cursor) params.set('cursor', options.cursor);\r\n if (options.status) params.set('status', options.status);\r\n if (options.from) params.set('from', options.from);\r\n if (options.to) params.set('to', options.to);\r\n const qs = params.toString();\r\n\r\n const res = await this.client.get<{ data: EmailListItem[]; next_cursor: string | null }>(\r\n qs ? `/emails?${qs}` : '/emails',\r\n );\r\n if (res.error) return res;\r\n return {\r\n data: { data: res.data.data, nextCursor: res.data.next_cursor },\r\n error: null,\r\n headers: res.headers,\r\n };\r\n }\r\n\r\n get(id: string): Promise<EusendResponse<Email>> {\r\n return this.client.get<Email>(`/emails/${id}`);\r\n }\r\n}\r\n","import type { Eusend } from './eusend';\r\nimport type { EusendResponse } from './interfaces';\r\n\r\nexport type DomainStatus = 'pending' | 'verified' | 'failed';\r\n\r\nexport interface DnsRecord {\r\n type: string;\r\n name: string;\r\n value: string;\r\n}\r\n\r\nexport interface CreateDomainResponse {\r\n id: string;\r\n name: string;\r\n dkim: DnsRecord;\r\n spf: DnsRecord;\r\n dmarc: DnsRecord;\r\n}\r\n\r\nexport interface DomainListItem {\r\n id: string;\r\n name: string;\r\n status: DomainStatus;\r\n createdAt: string;\r\n}\r\n\r\nexport interface Domain {\r\n id: string;\r\n name: string;\r\n dkimPublicKey: string;\r\n dkimSelector: string;\r\n status: DomainStatus;\r\n createdAt: string;\r\n verifiedAt: string | null;\r\n}\r\n\r\nexport class Domains {\r\n constructor(private readonly client: Eusend) {}\r\n\r\n create(name: string): Promise<EusendResponse<CreateDomainResponse>> {\r\n return this.client.post<CreateDomainResponse>('/domains', { name });\r\n }\r\n\r\n list(): Promise<EusendResponse<DomainListItem[]>> {\r\n return this.client.get<DomainListItem[]>('/domains');\r\n }\r\n\r\n get(id: string): Promise<EusendResponse<Domain>> {\r\n return this.client.get<Domain>(`/domains/${id}`);\r\n }\r\n\r\n delete(id: string): Promise<EusendResponse<{ message: string }>> {\r\n return this.client.delete<{ message: string }>(`/domains/${id}`);\r\n }\r\n\r\n verify(id: string): Promise<EusendResponse<{ message: string }>> {\r\n return this.client.post<{ message: string }>(`/domains/${id}/verify`);\r\n }\r\n}\r\n","import type { Eusend } from './eusend';\r\nimport type { EusendResponse } from './interfaces';\r\n\r\nexport interface CreateApiKeyOptions {\r\n name: string;\r\n testMode?: boolean;\r\n}\r\n\r\nexport interface CreateApiKeyResponse {\r\n id: string;\r\n name: string;\r\n key: string;\r\n prefix: string;\r\n testMode: boolean;\r\n createdAt: string;\r\n}\r\n\r\nexport interface ApiKey {\r\n id: string;\r\n name: string;\r\n prefix: string;\r\n testMode: boolean;\r\n createdAt: string;\r\n lastUsedAt: string | null;\r\n}\r\n\r\ntype CreateApiKeyApiResponse = {\r\n id: string;\r\n name: string;\r\n key: string;\r\n prefix: string;\r\n test_mode: boolean;\r\n created_at: string;\r\n};\r\n\r\nexport class ApiKeys {\r\n constructor(private readonly client: Eusend) {}\r\n\r\n async create(options: CreateApiKeyOptions): Promise<EusendResponse<CreateApiKeyResponse>> {\r\n const res = await this.client.post<CreateApiKeyApiResponse>('/api-keys', {\r\n name: options.name,\r\n test_mode: options.testMode ?? false,\r\n });\r\n if (res.error) return res;\r\n return {\r\n data: {\r\n id: res.data.id,\r\n name: res.data.name,\r\n key: res.data.key,\r\n prefix: res.data.prefix,\r\n testMode: res.data.test_mode,\r\n createdAt: res.data.created_at,\r\n },\r\n error: null,\r\n headers: res.headers,\r\n };\r\n }\r\n\r\n list(): Promise<EusendResponse<ApiKey[]>> {\r\n return this.client.get<ApiKey[]>('/api-keys');\r\n }\r\n\r\n delete(id: string): Promise<EusendResponse<{ message: string }>> {\r\n return this.client.delete<{ message: string }>(`/api-keys/${id}`);\r\n }\r\n}\r\n","import type { Eusend } from './eusend';\r\nimport type { EusendResponse } from './interfaces';\r\n\r\nexport type ContactStatus = 'subscribed' | 'unsubscribed';\r\n\r\nexport interface Audience {\r\n id: string;\r\n name: string;\r\n organizationId: string;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\nexport interface AudienceListItem {\r\n id: string;\r\n name: string;\r\n createdAt: string;\r\n contactCount: number;\r\n}\r\n\r\nexport interface Contact {\r\n id: string;\r\n audienceId: string;\r\n email: string;\r\n firstName: string | null;\r\n lastName: string | null;\r\n status: ContactStatus;\r\n unsubscribedAt: string | null;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\nexport interface CreateContactOptions {\r\n email: string;\r\n firstName?: string;\r\n lastName?: string;\r\n}\r\n\r\nexport interface UpdateContactOptions {\r\n firstName?: string;\r\n lastName?: string;\r\n unsubscribed?: boolean;\r\n}\r\n\r\nexport interface ListContactsOptions {\r\n limit?: number;\r\n cursor?: string;\r\n search?: string;\r\n subscribed?: boolean;\r\n}\r\n\r\nexport interface ListContactsResponse {\r\n data: Contact[];\r\n nextCursor: string | null;\r\n}\r\n\r\nexport interface BatchCreateContactsOptions {\r\n contacts: CreateContactOptions[];\r\n}\r\n\r\nexport class Audiences {\r\n constructor(private readonly client: Eusend) {}\r\n\r\n create(name: string): Promise<EusendResponse<Audience>> {\r\n return this.client.post<Audience>('/audiences', { name });\r\n }\r\n\r\n async list(): Promise<EusendResponse<AudienceListItem[]>> {\r\n const res = await this.client.get<{ data: AudienceListItem[] }>('/audiences');\r\n if (res.error) return res;\r\n return { data: res.data.data, error: null, headers: res.headers };\r\n }\r\n\r\n delete(id: string): Promise<EusendResponse<Record<string, never>>> {\r\n return this.client.delete<Record<string, never>>(`/audiences/${id}`);\r\n }\r\n\r\n createContact(\r\n audienceId: string,\r\n options: CreateContactOptions,\r\n ): Promise<EusendResponse<Contact>> {\r\n return this.client.post<Contact>(`/audiences/${audienceId}/contacts`, {\r\n email: options.email,\r\n first_name: options.firstName,\r\n last_name: options.lastName,\r\n });\r\n }\r\n\r\n async listContacts(\r\n audienceId: string,\r\n options: ListContactsOptions = {},\r\n ): Promise<EusendResponse<ListContactsResponse>> {\r\n const params = new URLSearchParams();\r\n if (options.limit != null) params.set('limit', String(options.limit));\r\n if (options.cursor) params.set('cursor', options.cursor);\r\n if (options.search) params.set('search', options.search);\r\n if (options.subscribed != null) params.set('subscribed', String(options.subscribed));\r\n const qs = params.toString();\r\n return this.client.get<ListContactsResponse>(\r\n qs ? `/audiences/${audienceId}/contacts?${qs}` : `/audiences/${audienceId}/contacts`,\r\n );\r\n }\r\n\r\n getContact(audienceId: string, contactId: string): Promise<EusendResponse<Contact>> {\r\n return this.client.get<Contact>(`/audiences/${audienceId}/contacts/${contactId}`);\r\n }\r\n\r\n updateContact(\r\n audienceId: string,\r\n contactId: string,\r\n options: UpdateContactOptions,\r\n ): Promise<EusendResponse<Contact>> {\r\n return this.client.patch<Contact>(`/audiences/${audienceId}/contacts/${contactId}`, {\r\n first_name: options.firstName,\r\n last_name: options.lastName,\r\n unsubscribed: options.unsubscribed,\r\n });\r\n }\r\n\r\n deleteContact(\r\n audienceId: string,\r\n contactId: string,\r\n ): Promise<EusendResponse<Record<string, never>>> {\r\n return this.client.delete<Record<string, never>>(\r\n `/audiences/${audienceId}/contacts/${contactId}`,\r\n );\r\n }\r\n\r\n batchCreateContacts(\r\n audienceId: string,\r\n options: BatchCreateContactsOptions,\r\n ): Promise<EusendResponse<{ count: number }>> {\r\n return this.client.post<{ count: number }>(`/audiences/${audienceId}/contacts/batch`, {\r\n contacts: options.contacts.map((c) => ({\r\n email: c.email,\r\n first_name: c.firstName,\r\n last_name: c.lastName,\r\n })),\r\n });\r\n }\r\n}\r\n","import type { Eusend } from './eusend';\nimport type { EusendResponse } from './interfaces';\nimport { renderReactEmail, type ReactEmailElement } from './react-render';\n\ninterface TemplateHtmlOrReact {\n /**\n * A React Email component. The SDK renders it to HTML locally before sending.\n * Requires `@react-email/render` and `react` as peer dependencies.\n * Ignored when `html` is also provided.\n */\n react?: ReactEmailElement;\n}\n\nexport interface CreateTemplateOptions extends TemplateHtmlOrReact {\n name: string;\n subject: string;\n html?: string;\n}\n\nexport interface UpdateTemplateOptions extends TemplateHtmlOrReact {\n name?: string;\n subject?: string;\n html?: string;\n}\n\nexport interface Template {\n id: string;\n name: string;\n subject: string;\n html: string | null;\n reactSource: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface TemplateListItem {\n id: string;\n name: string;\n subject: string;\n createdAt: string;\n updatedAt: string;\n}\n\nasync function resolveTemplateHtml(\n options: TemplateHtmlOrReact & { html?: string },\n): Promise<string | undefined> {\n if (options.html) return options.html;\n if (options.react) return renderReactEmail(options.react);\n return undefined;\n}\n\nexport class Templates {\n constructor(private readonly client: Eusend) {}\n\n async create(options: CreateTemplateOptions): Promise<EusendResponse<Template>> {\n const html = await resolveTemplateHtml(options);\n if (!html) {\n return {\n data: null,\n error: {\n message: 'Either html or react is required',\n statusCode: null,\n name: 'VALIDATION_ERROR',\n },\n headers: null,\n };\n }\n return this.client.post<Template>('/templates', {\n name: options.name,\n subject: options.subject,\n html,\n });\n }\n\n async list(): Promise<EusendResponse<TemplateListItem[]>> {\n const res = await this.client.get<{ data: TemplateListItem[] }>('/templates');\n if (res.error) return res;\n return { data: res.data.data, error: null, headers: res.headers };\n }\n\n get(id: string): Promise<EusendResponse<Template>> {\n return this.client.get<Template>(`/templates/${id}`);\n }\n\n async update(id: string, options: UpdateTemplateOptions): Promise<EusendResponse<Template>> {\n const html = await resolveTemplateHtml(options);\n return this.client.patch<Template>(`/templates/${id}`, {\n name: options.name,\n subject: options.subject,\n html,\n });\n }\n\n delete(id: string): Promise<EusendResponse<Record<string, never>>> {\n return this.client.delete<Record<string, never>>(`/templates/${id}`);\n }\n}\n","import type { Eusend } from './eusend';\r\nimport type { EusendResponse } from './interfaces';\r\n\r\nexport type WebhookEvent =\r\n | 'email.sent'\r\n | 'email.delivered'\r\n | 'email.bounced'\r\n | 'email.complained'\r\n | 'email.opened'\r\n | 'email.clicked'\r\n | '*';\r\n\r\nexport interface CreateWebhookOptions {\r\n url: string;\r\n events: WebhookEvent[];\r\n}\r\n\r\nexport interface UpdateWebhookOptions {\r\n url?: string;\r\n events?: WebhookEvent[];\r\n}\r\n\r\nexport interface WebhookDelivery {\r\n id: string;\r\n webhookId: string;\r\n emailId: string | null;\r\n eventType: string;\r\n payload: Record<string, unknown>;\r\n status: 'pending' | 'success' | 'failed';\r\n responseStatus: number | null;\r\n attempts: number;\r\n createdAt: string;\r\n lastAttemptAt: string | null;\r\n}\r\n\r\nexport interface Webhook {\r\n id: string;\r\n url: string;\r\n events: WebhookEvent[];\r\n createdAt: string;\r\n}\r\n\r\nexport interface WebhookWithDeliveries extends Webhook {\r\n deliveries: WebhookDelivery[];\r\n}\r\n\r\nexport interface CreateWebhookResponse extends Webhook {\r\n secret: string;\r\n}\r\n\r\nexport class Webhooks {\r\n constructor(private readonly client: Eusend) {}\r\n\r\n create(options: CreateWebhookOptions): Promise<EusendResponse<CreateWebhookResponse>> {\r\n return this.client.post<CreateWebhookResponse>('/webhooks', {\r\n url: options.url,\r\n events: options.events,\r\n });\r\n }\r\n\r\n async list(): Promise<EusendResponse<Webhook[]>> {\r\n const res = await this.client.get<{ data: Webhook[] }>('/webhooks');\r\n if (res.error) return res;\r\n return { data: res.data.data, error: null, headers: res.headers };\r\n }\r\n\r\n get(id: string): Promise<EusendResponse<WebhookWithDeliveries>> {\r\n return this.client.get<WebhookWithDeliveries>(`/webhooks/${id}`);\r\n }\r\n\r\n update(id: string, options: UpdateWebhookOptions): Promise<EusendResponse<Webhook>> {\r\n return this.client.patch<Webhook>(`/webhooks/${id}`, {\r\n url: options.url,\r\n events: options.events,\r\n });\r\n }\r\n\r\n delete(id: string): Promise<EusendResponse<Record<string, never>>> {\r\n return this.client.delete<Record<string, never>>(`/webhooks/${id}`);\r\n }\r\n}\r\n","import type { Eusend } from './eusend';\r\nimport type { EusendResponse } from './interfaces';\r\nimport { renderReactEmail, type ReactEmailElement } from './react-render';\r\n\r\nexport type BroadcastStatus =\r\n | 'draft'\r\n | 'scheduled'\r\n | 'sending'\r\n | 'sent'\r\n | 'paused'\r\n | 'cancelled';\r\n\r\nexport interface CreateBroadcastOptions {\r\n name: string;\r\n audienceId: string;\r\n from: string;\r\n subject: string;\r\n html?: string;\r\n /**\r\n * A React Email component. The SDK renders it to HTML locally before sending —\r\n * the JSX source never travels over the wire. Requires `@react-email/render`\r\n * and `react` as peer dependencies. Ignored when `html` is also provided.\r\n */\r\n react?: ReactEmailElement;\r\n templateId?: string;\r\n templateVariables?: Record<string, string>;\r\n}\r\n\r\nexport interface UpdateBroadcastOptions {\r\n name?: string;\r\n audienceId?: string;\r\n from?: string;\r\n subject?: string;\r\n html?: string;\r\n /**\r\n * See `react` on CreateBroadcastOptions. Rendered to HTML locally before sending.\r\n */\r\n react?: ReactEmailElement;\r\n templateId?: string | null;\r\n templateVariables?: Record<string, string> | null;\r\n scheduledAt?: string | null;\r\n}\r\n\r\nexport interface SendBroadcastOptions {\r\n scheduledAt?: string;\r\n}\r\n\r\nexport interface Broadcast {\r\n id: string;\r\n name: string;\r\n status: BroadcastStatus;\r\n audienceId: string;\r\n fromAddress: string;\r\n subject: string;\r\n html: string | null;\r\n templateId: string | null;\r\n templateVariables: Record<string, string> | null;\r\n scheduledAt: string | null;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\nexport interface BroadcastListItem {\r\n id: string;\r\n name: string;\r\n status: BroadcastStatus;\r\n audienceId: string;\r\n fromAddress: string;\r\n subject: string;\r\n recipientCount: number | null;\r\n sentCount: number | null;\r\n scheduledAt: string | null;\r\n startedAt: string | null;\r\n completedAt: string | null;\r\n createdAt: string;\r\n audienceName: string | null;\r\n}\r\n\r\nexport interface BroadcastDetail extends Broadcast {\r\n recipientCount: number | null;\r\n sentCount: number | null;\r\n startedAt: string | null;\r\n completedAt: string | null;\r\n stats: Record<string, number>;\r\n}\r\n\r\nexport interface SendBroadcastResponse {\r\n id: string;\r\n status: 'sending' | 'scheduled';\r\n scheduledAt: string | null;\r\n}\r\n\r\nasync function resolveBroadcastHtml(\r\n options: { html?: string; react?: ReactEmailElement },\r\n): Promise<string | undefined> {\r\n if (options.html) return options.html;\r\n if (options.react) return renderReactEmail(options.react);\r\n return undefined;\r\n}\r\n\r\nexport class Broadcasts {\r\n constructor(private readonly client: Eusend) {}\r\n\r\n async create(options: CreateBroadcastOptions): Promise<EusendResponse<Broadcast>> {\r\n const html = await resolveBroadcastHtml(options);\r\n return this.client.post<Broadcast>('/broadcasts', {\r\n name: options.name,\r\n audience_id: options.audienceId,\r\n from: options.from,\r\n subject: options.subject,\r\n html,\r\n template_id: options.templateId,\r\n template_variables: options.templateVariables,\r\n });\r\n }\r\n\r\n async list(): Promise<EusendResponse<BroadcastListItem[]>> {\r\n const res = await this.client.get<{ data: BroadcastListItem[] }>('/broadcasts');\r\n if (res.error) return res;\r\n return { data: res.data.data, error: null, headers: res.headers };\r\n }\r\n\r\n get(id: string): Promise<EusendResponse<BroadcastDetail>> {\r\n return this.client.get<BroadcastDetail>(`/broadcasts/${id}`);\r\n }\r\n\r\n async update(id: string, options: UpdateBroadcastOptions): Promise<EusendResponse<Broadcast>> {\r\n const html = await resolveBroadcastHtml(options);\r\n return this.client.patch<Broadcast>(`/broadcasts/${id}`, {\r\n name: options.name,\r\n audience_id: options.audienceId,\r\n from: options.from,\r\n subject: options.subject,\r\n html,\r\n template_id: options.templateId,\r\n template_variables: options.templateVariables,\r\n scheduled_at: options.scheduledAt,\r\n });\r\n }\r\n\r\n send(id: string, options: SendBroadcastOptions = {}): Promise<EusendResponse<SendBroadcastResponse>> {\r\n return this.client.post<SendBroadcastResponse>(`/broadcasts/${id}/send`, {\r\n scheduled_at: options.scheduledAt,\r\n });\r\n }\r\n\r\n cancel(id: string): Promise<EusendResponse<Broadcast>> {\r\n return this.client.post<Broadcast>(`/broadcasts/${id}/cancel`);\r\n }\r\n\r\n delete(id: string): Promise<EusendResponse<Record<string, never>>> {\r\n return this.client.delete<Record<string, never>>(`/broadcasts/${id}`);\r\n }\r\n}\r\n","import type { EusendError, EusendResponse } from './interfaces';\r\nimport { Emails } from './emails';\r\nimport { Domains } from './domains';\r\nimport { ApiKeys } from './api-keys';\r\nimport { Audiences } from './audiences';\r\nimport { Templates } from './templates';\r\nimport { Webhooks } from './webhooks';\r\nimport { Broadcasts } from './broadcasts';\r\n\r\nconst DEFAULT_BASE_URL = 'https://api.eusend.dev';\r\nconst SDK_VERSION = '0.3.1';\r\n\r\nexport interface EusendOptions {\r\n baseUrl?: string;\r\n}\r\n\r\nexport class Eusend {\r\n readonly baseUrl: string;\r\n private readonly apiKey: string;\r\n\r\n readonly emails: Emails;\r\n readonly domains: Domains;\r\n readonly apiKeys: ApiKeys;\r\n readonly audiences: Audiences;\r\n readonly templates: Templates;\r\n readonly webhooks: Webhooks;\r\n readonly broadcasts: Broadcasts;\r\n\r\n constructor(key?: string, options?: EusendOptions) {\r\n const apiKey =\r\n key ?? (typeof process !== 'undefined' ? process.env['EUSEND_API_KEY'] : undefined);\r\n if (!apiKey) {\r\n throw new Error(\r\n 'Missing Eusend API key. Pass it to the constructor or set the EUSEND_API_KEY environment variable.',\r\n );\r\n }\r\n this.apiKey = apiKey;\r\n this.baseUrl = options?.baseUrl ?? DEFAULT_BASE_URL;\r\n\r\n this.emails = new Emails(this);\r\n this.domains = new Domains(this);\r\n this.apiKeys = new ApiKeys(this);\r\n this.audiences = new Audiences(this);\r\n this.templates = new Templates(this);\r\n this.webhooks = new Webhooks(this);\r\n this.broadcasts = new Broadcasts(this);\r\n }\r\n\r\n async fetchRequest<T>(\r\n path: string,\r\n init: RequestInit = {},\r\n extraHeaders: Record<string, string> = {},\r\n ): Promise<EusendResponse<T>> {\r\n const headers: Record<string, string> = {\r\n Authorization: `Bearer ${this.apiKey}`,\r\n 'Content-Type': 'application/json',\r\n 'User-Agent': `eusend-node/${SDK_VERSION}`,\r\n ...extraHeaders,\r\n };\r\n\r\n try {\r\n const res = await fetch(`${this.baseUrl}${path}`, { ...init, headers });\r\n const responseHeaders = Object.fromEntries(res.headers.entries());\r\n\r\n if (!res.ok) {\r\n let error: EusendError;\r\n try {\r\n const json = (await res.json()) as { error?: string; code?: string };\r\n error = {\r\n message: json.error ?? 'Unknown error',\r\n statusCode: res.status,\r\n name: ((json.code as EusendError['name']) ?? 'INTERNAL_ERROR'),\r\n };\r\n } catch {\r\n error = { message: 'Request failed', statusCode: res.status, name: 'INTERNAL_ERROR' };\r\n }\r\n return { data: null, error, headers: responseHeaders };\r\n }\r\n\r\n if (res.status === 204 || res.headers.get('content-length') === '0') {\r\n return { data: {} as T, error: null, headers: responseHeaders };\r\n }\r\n\r\n const data = (await res.json()) as T;\r\n return { data, error: null, headers: responseHeaders };\r\n } catch {\r\n return {\r\n data: null,\r\n error: {\r\n message: 'Network request failed. The request could not be resolved.',\r\n statusCode: null,\r\n name: 'application_error',\r\n },\r\n headers: null,\r\n };\r\n }\r\n }\r\n\r\n get<T>(path: string, extraHeaders?: Record<string, string>): Promise<EusendResponse<T>> {\r\n return this.fetchRequest<T>(path, { method: 'GET' }, extraHeaders);\r\n }\r\n\r\n post<T>(\r\n path: string,\r\n body?: unknown,\r\n extraHeaders?: Record<string, string>,\r\n ): Promise<EusendResponse<T>> {\r\n return this.fetchRequest<T>(\r\n path,\r\n { method: 'POST', body: body != null ? JSON.stringify(body) : undefined },\r\n extraHeaders,\r\n );\r\n }\r\n\r\n patch<T>(path: string, body?: unknown): Promise<EusendResponse<T>> {\r\n return this.fetchRequest<T>(path, {\r\n method: 'PATCH',\r\n body: body != null ? JSON.stringify(body) : undefined,\r\n });\r\n }\r\n\r\n delete<T>(path: string): Promise<EusendResponse<T>> {\r\n return this.fetchRequest<T>(path, { method: 'DELETE' });\r\n }\r\n}\r\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eusend_dev/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Official Node.js SDK for the Eusend API",
|
|
5
5
|
"author": "Eusend",
|
|
6
6
|
"license": "MIT",
|
|
@@ -25,7 +25,17 @@
|
|
|
25
25
|
"dev": "tsdown src/index.ts --format esm,cjs --dts --watch",
|
|
26
26
|
"typecheck": "tsc --noEmit"
|
|
27
27
|
},
|
|
28
|
+
"peerDependencies": {
|
|
29
|
+
"@react-email/render": ">=1.0.0",
|
|
30
|
+
"react": ">=18.0.0"
|
|
31
|
+
},
|
|
32
|
+
"peerDependenciesMeta": {
|
|
33
|
+
"@react-email/render": { "optional": true },
|
|
34
|
+
"react": { "optional": true }
|
|
35
|
+
},
|
|
28
36
|
"devDependencies": {
|
|
37
|
+
"@react-email/render": "^1.0.0",
|
|
38
|
+
"react": "^18.3.0",
|
|
29
39
|
"tsdown": "^0.22.0",
|
|
30
40
|
"typescript": "^5.8.0"
|
|
31
41
|
},
|