@eusend_dev/sdk 0.4.1 → 0.4.2
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/dist/index.cjs +23 -1
- package/dist/index.d.cts +27 -2
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +27 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +23 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -28,6 +28,9 @@ function encodeAttachmentContent(content) {
|
|
|
28
28
|
for (const byte of content) binary += String.fromCharCode(byte);
|
|
29
29
|
return btoa(binary);
|
|
30
30
|
}
|
|
31
|
+
function toIsoString(value) {
|
|
32
|
+
return value instanceof Date ? value.toISOString() : value;
|
|
33
|
+
}
|
|
31
34
|
async function toApiPayload(options) {
|
|
32
35
|
const html = await resolveHtml(options);
|
|
33
36
|
return {
|
|
@@ -49,7 +52,8 @@ async function toApiPayload(options) {
|
|
|
49
52
|
content: encodeAttachmentContent(a.content),
|
|
50
53
|
content_type: a.contentType,
|
|
51
54
|
content_id: a.contentId
|
|
52
|
-
}))
|
|
55
|
+
})),
|
|
56
|
+
scheduled_at: options.scheduledAt ? toIsoString(options.scheduledAt) : void 0
|
|
53
57
|
};
|
|
54
58
|
}
|
|
55
59
|
var Emails = class {
|
|
@@ -88,6 +92,24 @@ var Emails = class {
|
|
|
88
92
|
get(id) {
|
|
89
93
|
return this.client.get(`/emails/${id}`);
|
|
90
94
|
}
|
|
95
|
+
/** Reschedule a scheduled email. Fails once the email has started sending. */
|
|
96
|
+
async update(id, options) {
|
|
97
|
+
const res = await this.client.patch(`/emails/${id}`, { scheduled_at: toIsoString(options.scheduledAt) });
|
|
98
|
+
if (res.error) return res;
|
|
99
|
+
return {
|
|
100
|
+
data: {
|
|
101
|
+
id: res.data.id,
|
|
102
|
+
status: res.data.status,
|
|
103
|
+
scheduledAt: res.data.scheduled_at
|
|
104
|
+
},
|
|
105
|
+
error: null,
|
|
106
|
+
headers: res.headers
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/** Cancel a scheduled email. Fails once the email has started sending. */
|
|
110
|
+
cancel(id) {
|
|
111
|
+
return this.client.post(`/emails/${id}/cancel`, void 0);
|
|
112
|
+
}
|
|
91
113
|
};
|
|
92
114
|
//#endregion
|
|
93
115
|
//#region src/domains.ts
|
package/dist/index.d.cts
CHANGED
|
@@ -23,7 +23,7 @@ type ReactEmailElement = {
|
|
|
23
23
|
};
|
|
24
24
|
//#endregion
|
|
25
25
|
//#region src/emails.d.ts
|
|
26
|
-
type EmailStatus = 'queued' | 'sending' | 'sent' | 'delivered' | 'bounced' | 'complained' | 'suppressed' | 'failed';
|
|
26
|
+
type EmailStatus = 'queued' | 'scheduled' | 'canceled' | 'sending' | 'sent' | 'delivered' | 'bounced' | 'complained' | 'suppressed' | 'failed';
|
|
27
27
|
type EmailEventType = 'sent' | 'delivered' | 'opened' | 'clicked' | 'bounced' | 'complained';
|
|
28
28
|
interface Attachment {
|
|
29
29
|
/** Name the recipient sees for the file, e.g. `invoice.pdf`. */
|
|
@@ -67,6 +67,12 @@ interface SendEmailOptions {
|
|
|
67
67
|
trackClicks?: boolean;
|
|
68
68
|
/** File attachments. Up to 20 per message, 10 MB combined. */
|
|
69
69
|
attachments?: Attachment[];
|
|
70
|
+
/**
|
|
71
|
+
* Schedule the send for a future time — an ISO 8601 string or a `Date`, at most
|
|
72
|
+
* 30 days out. The email is created with status `scheduled`; reschedule it with
|
|
73
|
+
* `emails.update()` or call `emails.cancel()` any time before it sends.
|
|
74
|
+
*/
|
|
75
|
+
scheduledAt?: string | Date;
|
|
70
76
|
}
|
|
71
77
|
interface SendEmailRequestOptions {
|
|
72
78
|
idempotencyKey?: string;
|
|
@@ -96,9 +102,24 @@ interface Email {
|
|
|
96
102
|
status: EmailStatus;
|
|
97
103
|
testMode: boolean;
|
|
98
104
|
templateId: string | null;
|
|
105
|
+
/** Set only for scheduled sends. */
|
|
106
|
+
scheduledAt: string | null;
|
|
99
107
|
createdAt: string;
|
|
100
108
|
events: EmailEvent[];
|
|
101
109
|
}
|
|
110
|
+
interface UpdateEmailOptions {
|
|
111
|
+
/** The new send time — an ISO 8601 string or a `Date`, at most 30 days out. */
|
|
112
|
+
scheduledAt: string | Date;
|
|
113
|
+
}
|
|
114
|
+
interface UpdateEmailResponse {
|
|
115
|
+
id: string;
|
|
116
|
+
status: 'scheduled';
|
|
117
|
+
scheduledAt: string;
|
|
118
|
+
}
|
|
119
|
+
interface CancelEmailResponse {
|
|
120
|
+
id: string;
|
|
121
|
+
status: 'canceled';
|
|
122
|
+
}
|
|
102
123
|
interface EmailListItem {
|
|
103
124
|
id: string;
|
|
104
125
|
from: string;
|
|
@@ -126,6 +147,10 @@ declare class Emails {
|
|
|
126
147
|
batch(emails: SendEmailOptions[]): Promise<EusendResponse<BatchSendResponse>>;
|
|
127
148
|
list(options?: ListEmailsOptions): Promise<EusendResponse<ListEmailsResponse>>;
|
|
128
149
|
get(id: string): Promise<EusendResponse<Email>>;
|
|
150
|
+
/** Reschedule a scheduled email. Fails once the email has started sending. */
|
|
151
|
+
update(id: string, options: UpdateEmailOptions): Promise<EusendResponse<UpdateEmailResponse>>;
|
|
152
|
+
/** Cancel a scheduled email. Fails once the email has started sending. */
|
|
153
|
+
cancel(id: string): Promise<EusendResponse<CancelEmailResponse>>;
|
|
129
154
|
}
|
|
130
155
|
//#endregion
|
|
131
156
|
//#region src/domains.d.ts
|
|
@@ -469,5 +494,5 @@ declare class Eusend {
|
|
|
469
494
|
delete<T>(path: string): Promise<EusendResponse<T>>;
|
|
470
495
|
}
|
|
471
496
|
//#endregion
|
|
472
|
-
export { type ApiKey, type Attachment, type Audience, type AudienceListItem, type BatchCreateContactsOptions, type BatchSendResponse, type Broadcast, type BroadcastDetail, type BroadcastListItem, type BroadcastStatus, type Contact, type ContactStatus, type CreateApiKeyOptions, type CreateApiKeyResponse, type CreateBroadcastOptions, type CreateContactOptions, type CreateDomainResponse, type CreateTemplateOptions, type CreateWebhookOptions, type CreateWebhookResponse, type DnsRecord, type Domain, type DomainListItem, type DomainStatus, type Email, type EmailEvent, type EmailEventType, type EmailListItem, type EmailStatus, Eusend, type EusendError, type EusendErrorCode, type EusendOptions, type EusendResponse, type ListContactsOptions, type ListContactsResponse, type ListEmailsOptions, type ListEmailsResponse, type SendBroadcastOptions, type SendBroadcastResponse, type SendEmailOptions, type SendEmailRequestOptions, type SendEmailResponse, type Template, type TemplateListItem, type UpdateBroadcastOptions, type UpdateContactOptions, type UpdateTemplateOptions, type UpdateWebhookOptions, type Webhook, type WebhookDelivery, type WebhookEvent, type WebhookWithDeliveries };
|
|
497
|
+
export { type ApiKey, type Attachment, type Audience, type AudienceListItem, type BatchCreateContactsOptions, type BatchSendResponse, type Broadcast, type BroadcastDetail, type BroadcastListItem, type BroadcastStatus, type CancelEmailResponse, type Contact, type ContactStatus, type CreateApiKeyOptions, type CreateApiKeyResponse, type CreateBroadcastOptions, type CreateContactOptions, type CreateDomainResponse, type CreateTemplateOptions, type CreateWebhookOptions, type CreateWebhookResponse, type DnsRecord, type Domain, type DomainListItem, type DomainStatus, type Email, type EmailEvent, type EmailEventType, type EmailListItem, type EmailStatus, Eusend, type EusendError, type EusendErrorCode, type EusendOptions, type EusendResponse, type ListContactsOptions, type ListContactsResponse, type ListEmailsOptions, type ListEmailsResponse, type SendBroadcastOptions, type SendBroadcastResponse, type SendEmailOptions, type SendEmailRequestOptions, type SendEmailResponse, type Template, type TemplateListItem, type UpdateBroadcastOptions, type UpdateContactOptions, type UpdateEmailOptions, type UpdateEmailResponse, type UpdateTemplateOptions, type UpdateWebhookOptions, type Webhook, type WebhookDelivery, type WebhookEvent, type WebhookWithDeliveries };
|
|
473
498
|
//# sourceMappingURL=index.d.cts.map
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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":";KAAY,eAAA;AAAA,UAoBK,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;;;KCzBnC,iBAAA;EAAA,SACD,IAAA;EAAA,SACA,KAAA;EAAA,SACA,GAAA;AAAA;;;KCFC,WAAA;AAAA,
|
|
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
|
@@ -23,7 +23,7 @@ type ReactEmailElement = {
|
|
|
23
23
|
};
|
|
24
24
|
//#endregion
|
|
25
25
|
//#region src/emails.d.ts
|
|
26
|
-
type EmailStatus = 'queued' | 'sending' | 'sent' | 'delivered' | 'bounced' | 'complained' | 'suppressed' | 'failed';
|
|
26
|
+
type EmailStatus = 'queued' | 'scheduled' | 'canceled' | 'sending' | 'sent' | 'delivered' | 'bounced' | 'complained' | 'suppressed' | 'failed';
|
|
27
27
|
type EmailEventType = 'sent' | 'delivered' | 'opened' | 'clicked' | 'bounced' | 'complained';
|
|
28
28
|
interface Attachment {
|
|
29
29
|
/** Name the recipient sees for the file, e.g. `invoice.pdf`. */
|
|
@@ -67,6 +67,12 @@ interface SendEmailOptions {
|
|
|
67
67
|
trackClicks?: boolean;
|
|
68
68
|
/** File attachments. Up to 20 per message, 10 MB combined. */
|
|
69
69
|
attachments?: Attachment[];
|
|
70
|
+
/**
|
|
71
|
+
* Schedule the send for a future time — an ISO 8601 string or a `Date`, at most
|
|
72
|
+
* 30 days out. The email is created with status `scheduled`; reschedule it with
|
|
73
|
+
* `emails.update()` or call `emails.cancel()` any time before it sends.
|
|
74
|
+
*/
|
|
75
|
+
scheduledAt?: string | Date;
|
|
70
76
|
}
|
|
71
77
|
interface SendEmailRequestOptions {
|
|
72
78
|
idempotencyKey?: string;
|
|
@@ -96,9 +102,24 @@ interface Email {
|
|
|
96
102
|
status: EmailStatus;
|
|
97
103
|
testMode: boolean;
|
|
98
104
|
templateId: string | null;
|
|
105
|
+
/** Set only for scheduled sends. */
|
|
106
|
+
scheduledAt: string | null;
|
|
99
107
|
createdAt: string;
|
|
100
108
|
events: EmailEvent[];
|
|
101
109
|
}
|
|
110
|
+
interface UpdateEmailOptions {
|
|
111
|
+
/** The new send time — an ISO 8601 string or a `Date`, at most 30 days out. */
|
|
112
|
+
scheduledAt: string | Date;
|
|
113
|
+
}
|
|
114
|
+
interface UpdateEmailResponse {
|
|
115
|
+
id: string;
|
|
116
|
+
status: 'scheduled';
|
|
117
|
+
scheduledAt: string;
|
|
118
|
+
}
|
|
119
|
+
interface CancelEmailResponse {
|
|
120
|
+
id: string;
|
|
121
|
+
status: 'canceled';
|
|
122
|
+
}
|
|
102
123
|
interface EmailListItem {
|
|
103
124
|
id: string;
|
|
104
125
|
from: string;
|
|
@@ -126,6 +147,10 @@ declare class Emails {
|
|
|
126
147
|
batch(emails: SendEmailOptions[]): Promise<EusendResponse<BatchSendResponse>>;
|
|
127
148
|
list(options?: ListEmailsOptions): Promise<EusendResponse<ListEmailsResponse>>;
|
|
128
149
|
get(id: string): Promise<EusendResponse<Email>>;
|
|
150
|
+
/** Reschedule a scheduled email. Fails once the email has started sending. */
|
|
151
|
+
update(id: string, options: UpdateEmailOptions): Promise<EusendResponse<UpdateEmailResponse>>;
|
|
152
|
+
/** Cancel a scheduled email. Fails once the email has started sending. */
|
|
153
|
+
cancel(id: string): Promise<EusendResponse<CancelEmailResponse>>;
|
|
129
154
|
}
|
|
130
155
|
//#endregion
|
|
131
156
|
//#region src/domains.d.ts
|
|
@@ -469,5 +494,5 @@ declare class Eusend {
|
|
|
469
494
|
delete<T>(path: string): Promise<EusendResponse<T>>;
|
|
470
495
|
}
|
|
471
496
|
//#endregion
|
|
472
|
-
export { type ApiKey, type Attachment, type Audience, type AudienceListItem, type BatchCreateContactsOptions, type BatchSendResponse, type Broadcast, type BroadcastDetail, type BroadcastListItem, type BroadcastStatus, type Contact, type ContactStatus, type CreateApiKeyOptions, type CreateApiKeyResponse, type CreateBroadcastOptions, type CreateContactOptions, type CreateDomainResponse, type CreateTemplateOptions, type CreateWebhookOptions, type CreateWebhookResponse, type DnsRecord, type Domain, type DomainListItem, type DomainStatus, type Email, type EmailEvent, type EmailEventType, type EmailListItem, type EmailStatus, Eusend, type EusendError, type EusendErrorCode, type EusendOptions, type EusendResponse, type ListContactsOptions, type ListContactsResponse, type ListEmailsOptions, type ListEmailsResponse, type SendBroadcastOptions, type SendBroadcastResponse, type SendEmailOptions, type SendEmailRequestOptions, type SendEmailResponse, type Template, type TemplateListItem, type UpdateBroadcastOptions, type UpdateContactOptions, type UpdateTemplateOptions, type UpdateWebhookOptions, type Webhook, type WebhookDelivery, type WebhookEvent, type WebhookWithDeliveries };
|
|
497
|
+
export { type ApiKey, type Attachment, type Audience, type AudienceListItem, type BatchCreateContactsOptions, type BatchSendResponse, type Broadcast, type BroadcastDetail, type BroadcastListItem, type BroadcastStatus, type CancelEmailResponse, type Contact, type ContactStatus, type CreateApiKeyOptions, type CreateApiKeyResponse, type CreateBroadcastOptions, type CreateContactOptions, type CreateDomainResponse, type CreateTemplateOptions, type CreateWebhookOptions, type CreateWebhookResponse, type DnsRecord, type Domain, type DomainListItem, type DomainStatus, type Email, type EmailEvent, type EmailEventType, type EmailListItem, type EmailStatus, Eusend, type EusendError, type EusendErrorCode, type EusendOptions, type EusendResponse, type ListContactsOptions, type ListContactsResponse, type ListEmailsOptions, type ListEmailsResponse, type SendBroadcastOptions, type SendBroadcastResponse, type SendEmailOptions, type SendEmailRequestOptions, type SendEmailResponse, type Template, type TemplateListItem, type UpdateBroadcastOptions, type UpdateContactOptions, type UpdateEmailOptions, type UpdateEmailResponse, type UpdateTemplateOptions, type UpdateWebhookOptions, type Webhook, type WebhookDelivery, type WebhookEvent, type WebhookWithDeliveries };
|
|
473
498
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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":";KAAY,eAAA;AAAA,UAoBK,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;;;KCzBnC,iBAAA;EAAA,SACD,IAAA;EAAA,SACA,KAAA;EAAA,SACA,GAAA;AAAA;;;KCFC,WAAA;AAAA,
|
|
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
|
@@ -27,6 +27,9 @@ function encodeAttachmentContent(content) {
|
|
|
27
27
|
for (const byte of content) binary += String.fromCharCode(byte);
|
|
28
28
|
return btoa(binary);
|
|
29
29
|
}
|
|
30
|
+
function toIsoString(value) {
|
|
31
|
+
return value instanceof Date ? value.toISOString() : value;
|
|
32
|
+
}
|
|
30
33
|
async function toApiPayload(options) {
|
|
31
34
|
const html = await resolveHtml(options);
|
|
32
35
|
return {
|
|
@@ -48,7 +51,8 @@ async function toApiPayload(options) {
|
|
|
48
51
|
content: encodeAttachmentContent(a.content),
|
|
49
52
|
content_type: a.contentType,
|
|
50
53
|
content_id: a.contentId
|
|
51
|
-
}))
|
|
54
|
+
})),
|
|
55
|
+
scheduled_at: options.scheduledAt ? toIsoString(options.scheduledAt) : void 0
|
|
52
56
|
};
|
|
53
57
|
}
|
|
54
58
|
var Emails = class {
|
|
@@ -87,6 +91,24 @@ var Emails = class {
|
|
|
87
91
|
get(id) {
|
|
88
92
|
return this.client.get(`/emails/${id}`);
|
|
89
93
|
}
|
|
94
|
+
/** Reschedule a scheduled email. Fails once the email has started sending. */
|
|
95
|
+
async update(id, options) {
|
|
96
|
+
const res = await this.client.patch(`/emails/${id}`, { scheduled_at: toIsoString(options.scheduledAt) });
|
|
97
|
+
if (res.error) return res;
|
|
98
|
+
return {
|
|
99
|
+
data: {
|
|
100
|
+
id: res.data.id,
|
|
101
|
+
status: res.data.status,
|
|
102
|
+
scheduledAt: res.data.scheduled_at
|
|
103
|
+
},
|
|
104
|
+
error: null,
|
|
105
|
+
headers: res.headers
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/** Cancel a scheduled email. Fails once the email has started sending. */
|
|
109
|
+
cancel(id) {
|
|
110
|
+
return this.client.post(`/emails/${id}/cancel`, void 0);
|
|
111
|
+
}
|
|
90
112
|
};
|
|
91
113
|
//#endregion
|
|
92
114
|
//#region src/domains.ts
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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';\nimport type { EusendResponse } from './interfaces';\nimport { renderReactEmail, type ReactEmailElement } from './react-render';\n\nexport type EmailStatus =\n | 'queued'\n | 'sending'\n | 'sent'\n | 'delivered'\n | 'bounced'\n | 'complained'\n | 'suppressed'\n | 'failed';\n\nexport type EmailEventType =\n | 'sent'\n | 'delivered'\n | 'opened'\n | 'clicked'\n | 'bounced'\n | 'complained';\n\nexport interface Attachment {\n /** Name the recipient sees for the file, e.g. `invoice.pdf`. */\n filename: string;\n /**\n * File contents. A base64-encoded string (sent as-is) or raw bytes\n * (`Uint8Array`/`Buffer`), which the SDK base64-encodes for you.\n */\n content: string | Uint8Array;\n /** MIME type, e.g. `application/pdf`. Inferred from the filename when omitted. */\n contentType?: string;\n /**\n * Content-ID for an inline attachment. Set it to reference the file from your\n * HTML with `<img src=\"cid:<contentId>\">` instead of showing it as a download.\n */\n contentId?: string;\n}\n\nexport interface SendEmailOptions {\n /**\n * Sender address. Accepts a bare email (`onboarding@eusend.dev`) or a display-name\n * form (`Acme <onboarding@eusend.dev>`). The domain must be verified on your account.\n */\n from: string;\n to: string | string[];\n cc?: string | string[];\n bcc?: string | string[];\n replyTo?: string | string[];\n subject?: string;\n html?: string;\n text?: string;\n /**\n * A React Email component. The SDK renders it to HTML locally before sending\n * — the JSX source never travels over the wire. Requires `@react-email/render`\n * and `react` as peer dependencies. Ignored when `html` is also provided.\n */\n react?: ReactEmailElement;\n templateId?: string;\n variables?: Record<string, unknown>;\n headers?: Record<string, string>;\n trackOpens?: boolean;\n trackClicks?: boolean;\n /** File attachments. Up to 20 per message, 10 MB combined. */\n attachments?: Attachment[];\n}\n\nexport interface SendEmailRequestOptions {\n idempotencyKey?: string;\n}\n\nexport interface SendEmailResponse {\n id: string;\n}\n\nexport interface BatchSendResponse {\n data: SendEmailResponse[];\n}\n\nexport interface EmailEvent {\n id: string;\n type: EmailEventType;\n metadata: Record<string, unknown>;\n createdAt: string;\n}\n\nexport interface Email {\n id: string;\n from: string;\n to: string[];\n cc: string[];\n bcc: string[];\n replyTo: string[];\n subject: string;\n html: string | null;\n text: string | null;\n status: EmailStatus;\n testMode: boolean;\n templateId: string | null;\n createdAt: string;\n events: EmailEvent[];\n}\n\nexport interface EmailListItem {\n id: string;\n from: string;\n to: string[];\n subject: string;\n status: EmailStatus;\n testMode: boolean;\n createdAt: string;\n}\n\nexport interface ListEmailsOptions {\n limit?: number;\n cursor?: string;\n status?: EmailStatus;\n from?: string;\n to?: string;\n}\n\nexport interface ListEmailsResponse {\n data: EmailListItem[];\n nextCursor: string | null;\n}\n\nasync function resolveHtml(options: SendEmailOptions): Promise<string | undefined> {\n if (options.html) return options.html;\n if (options.react) return renderReactEmail(options.react);\n return undefined;\n}\n\nfunction encodeAttachmentContent(content: string | Uint8Array): string {\n // A string is assumed to already be base64. Raw bytes are encoded here.\n if (typeof content === 'string') return content;\n if (typeof Buffer !== 'undefined') return Buffer.from(content).toString('base64');\n let binary = '';\n for (const byte of content) binary += String.fromCharCode(byte);\n return btoa(binary);\n}\n\nasync function toApiPayload(options: SendEmailOptions) {\n const html = await resolveHtml(options);\n return {\n from: options.from,\n to: options.to,\n cc: options.cc,\n bcc: options.bcc,\n reply_to: options.replyTo,\n subject: options.subject,\n html,\n text: options.text,\n template_id: options.templateId,\n variables: options.variables,\n headers: options.headers,\n track_opens: options.trackOpens,\n track_clicks: options.trackClicks,\n attachments: options.attachments?.map((a) => ({\n filename: a.filename,\n content: encodeAttachmentContent(a.content),\n content_type: a.contentType,\n content_id: a.contentId,\n })),\n };\n}\n\nexport class Emails {\n constructor(private readonly client: Eusend) {}\n\n async send(\n options: SendEmailOptions,\n requestOptions?: SendEmailRequestOptions,\n ): Promise<EusendResponse<SendEmailResponse>> {\n const extraHeaders: Record<string, string> = {};\n if (requestOptions?.idempotencyKey) {\n extraHeaders['Idempotency-Key'] = requestOptions.idempotencyKey;\n }\n const payload = await toApiPayload(options);\n return this.client.post<SendEmailResponse>('/emails', payload, extraHeaders);\n }\n\n async batch(\n emails: SendEmailOptions[],\n ): Promise<EusendResponse<BatchSendResponse>> {\n const payloads = await Promise.all(emails.map(toApiPayload));\n // Resend-compatible: the request body is a top-level array of email objects.\n return this.client.post<BatchSendResponse>('/emails/batch', payloads);\n }\n\n async list(options: ListEmailsOptions = {}): Promise<EusendResponse<ListEmailsResponse>> {\n const params = new URLSearchParams();\n if (options.limit != null) params.set('limit', String(options.limit));\n if (options.cursor) params.set('cursor', options.cursor);\n if (options.status) params.set('status', options.status);\n if (options.from) params.set('from', options.from);\n if (options.to) params.set('to', options.to);\n const qs = params.toString();\n\n const res = await this.client.get<{ data: EmailListItem[]; next_cursor: string | null }>(\n qs ? `/emails?${qs}` : '/emails',\n );\n if (res.error) return res;\n return {\n data: { data: res.data.data, nextCursor: res.data.next_cursor },\n error: null,\n headers: res.headers,\n };\n }\n\n get(id: string): Promise<EusendResponse<Email>> {\n return this.client.get<Email>(`/emails/${id}`);\n }\n}\n","import type { Eusend } from './eusend';\nimport type { EusendResponse } from './interfaces';\n\nexport type DomainStatus = 'pending' | 'verified' | 'failed';\n\nexport interface DnsRecord {\n type: string;\n name: string;\n value: string;\n}\n\nexport interface CreateDomainResponse {\n id: string;\n name: string;\n dkim: DnsRecord;\n spf: DnsRecord;\n dmarc: DnsRecord;\n}\n\nexport interface DomainListItem {\n id: string;\n name: string;\n status: DomainStatus;\n createdAt: string;\n}\n\nexport interface Domain {\n id: string;\n name: string;\n dkimPublicKey: string;\n dkimSelector: string;\n status: DomainStatus;\n createdAt: string;\n verifiedAt: string | null;\n}\n\nexport class Domains {\n constructor(private readonly client: Eusend) {}\n\n create(name: string): Promise<EusendResponse<CreateDomainResponse>> {\n return this.client.post<CreateDomainResponse>('/domains', { name });\n }\n\n list(): Promise<EusendResponse<DomainListItem[]>> {\n return this.client.get<DomainListItem[]>('/domains');\n }\n\n get(id: string): Promise<EusendResponse<Domain>> {\n return this.client.get<Domain>(`/domains/${id}`);\n }\n\n delete(id: string): Promise<EusendResponse<{ message: string }>> {\n return this.client.delete<{ message: string }>(`/domains/${id}`);\n }\n\n verify(id: string): Promise<EusendResponse<{ message: string }>> {\n return this.client.post<{ message: string }>(`/domains/${id}/verify`);\n }\n}\n","import type { Eusend } from './eusend';\nimport type { EusendResponse } from './interfaces';\n\nexport interface CreateApiKeyOptions {\n name: string;\n testMode?: boolean;\n}\n\nexport interface CreateApiKeyResponse {\n id: string;\n name: string;\n key: string;\n prefix: string;\n testMode: boolean;\n createdAt: string;\n}\n\nexport interface ApiKey {\n id: string;\n name: string;\n prefix: string;\n testMode: boolean;\n createdAt: string;\n lastUsedAt: string | null;\n}\n\ntype CreateApiKeyApiResponse = {\n id: string;\n name: string;\n key: string;\n prefix: string;\n test_mode: boolean;\n created_at: string;\n};\n\nexport class ApiKeys {\n constructor(private readonly client: Eusend) {}\n\n async create(options: CreateApiKeyOptions): Promise<EusendResponse<CreateApiKeyResponse>> {\n const res = await this.client.post<CreateApiKeyApiResponse>('/api-keys', {\n name: options.name,\n test_mode: options.testMode ?? false,\n });\n if (res.error) return res;\n return {\n data: {\n id: res.data.id,\n name: res.data.name,\n key: res.data.key,\n prefix: res.data.prefix,\n testMode: res.data.test_mode,\n createdAt: res.data.created_at,\n },\n error: null,\n headers: res.headers,\n };\n }\n\n list(): Promise<EusendResponse<ApiKey[]>> {\n return this.client.get<ApiKey[]>('/api-keys');\n }\n\n delete(id: string): Promise<EusendResponse<{ message: string }>> {\n return this.client.delete<{ message: string }>(`/api-keys/${id}`);\n }\n}\n","import type { Eusend } from './eusend';\nimport type { EusendResponse } from './interfaces';\n\nexport type ContactStatus = 'subscribed' | 'unsubscribed';\n\nexport interface Audience {\n id: string;\n name: string;\n organizationId: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface AudienceListItem {\n id: string;\n name: string;\n createdAt: string;\n contactCount: number;\n}\n\nexport interface Contact {\n id: string;\n audienceId: string;\n email: string;\n firstName: string | null;\n lastName: string | null;\n status: ContactStatus;\n unsubscribedAt: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateContactOptions {\n email: string;\n firstName?: string;\n lastName?: string;\n}\n\nexport interface UpdateContactOptions {\n firstName?: string;\n lastName?: string;\n unsubscribed?: boolean;\n}\n\nexport interface ListContactsOptions {\n limit?: number;\n cursor?: string;\n search?: string;\n subscribed?: boolean;\n}\n\nexport interface ListContactsResponse {\n data: Contact[];\n nextCursor: string | null;\n}\n\nexport interface BatchCreateContactsOptions {\n contacts: CreateContactOptions[];\n}\n\nexport class Audiences {\n constructor(private readonly client: Eusend) {}\n\n create(name: string): Promise<EusendResponse<Audience>> {\n return this.client.post<Audience>('/audiences', { name });\n }\n\n async list(): Promise<EusendResponse<AudienceListItem[]>> {\n const res = await this.client.get<{ data: AudienceListItem[] }>('/audiences');\n if (res.error) return res;\n return { data: res.data.data, error: null, headers: res.headers };\n }\n\n delete(id: string): Promise<EusendResponse<Record<string, never>>> {\n return this.client.delete<Record<string, never>>(`/audiences/${id}`);\n }\n\n createContact(\n audienceId: string,\n options: CreateContactOptions,\n ): Promise<EusendResponse<Contact>> {\n return this.client.post<Contact>(`/audiences/${audienceId}/contacts`, {\n email: options.email,\n first_name: options.firstName,\n last_name: options.lastName,\n });\n }\n\n async listContacts(\n audienceId: string,\n options: ListContactsOptions = {},\n ): Promise<EusendResponse<ListContactsResponse>> {\n const params = new URLSearchParams();\n if (options.limit != null) params.set('limit', String(options.limit));\n if (options.cursor) params.set('cursor', options.cursor);\n if (options.search) params.set('search', options.search);\n if (options.subscribed != null) params.set('subscribed', String(options.subscribed));\n const qs = params.toString();\n return this.client.get<ListContactsResponse>(\n qs ? `/audiences/${audienceId}/contacts?${qs}` : `/audiences/${audienceId}/contacts`,\n );\n }\n\n getContact(audienceId: string, contactId: string): Promise<EusendResponse<Contact>> {\n return this.client.get<Contact>(`/audiences/${audienceId}/contacts/${contactId}`);\n }\n\n updateContact(\n audienceId: string,\n contactId: string,\n options: UpdateContactOptions,\n ): Promise<EusendResponse<Contact>> {\n return this.client.patch<Contact>(`/audiences/${audienceId}/contacts/${contactId}`, {\n first_name: options.firstName,\n last_name: options.lastName,\n unsubscribed: options.unsubscribed,\n });\n }\n\n deleteContact(\n audienceId: string,\n contactId: string,\n ): Promise<EusendResponse<Record<string, never>>> {\n return this.client.delete<Record<string, never>>(\n `/audiences/${audienceId}/contacts/${contactId}`,\n );\n }\n\n batchCreateContacts(\n audienceId: string,\n options: BatchCreateContactsOptions,\n ): Promise<EusendResponse<{ count: number }>> {\n return this.client.post<{ count: number }>(`/audiences/${audienceId}/contacts/batch`, {\n contacts: options.contacts.map((c) => ({\n email: c.email,\n first_name: c.firstName,\n last_name: c.lastName,\n })),\n });\n }\n}\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';\nimport type { EusendResponse } from './interfaces';\n\nexport type WebhookEvent =\n | 'email.sent'\n | 'email.delivered'\n | 'email.bounced'\n | 'email.complained'\n | 'email.opened'\n | 'email.clicked'\n | '*';\n\nexport interface CreateWebhookOptions {\n url: string;\n events: WebhookEvent[];\n}\n\nexport interface UpdateWebhookOptions {\n url?: string;\n events?: WebhookEvent[];\n}\n\nexport interface WebhookDelivery {\n id: string;\n webhookId: string;\n emailId: string | null;\n eventType: string;\n payload: Record<string, unknown>;\n status: 'pending' | 'success' | 'failed';\n responseStatus: number | null;\n attempts: number;\n createdAt: string;\n lastAttemptAt: string | null;\n}\n\nexport interface Webhook {\n id: string;\n url: string;\n events: WebhookEvent[];\n createdAt: string;\n}\n\nexport interface WebhookWithDeliveries extends Webhook {\n deliveries: WebhookDelivery[];\n}\n\nexport interface CreateWebhookResponse extends Webhook {\n secret: string;\n}\n\nexport class Webhooks {\n constructor(private readonly client: Eusend) {}\n\n create(options: CreateWebhookOptions): Promise<EusendResponse<CreateWebhookResponse>> {\n return this.client.post<CreateWebhookResponse>('/webhooks', {\n url: options.url,\n events: options.events,\n });\n }\n\n async list(): Promise<EusendResponse<Webhook[]>> {\n const res = await this.client.get<{ data: Webhook[] }>('/webhooks');\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<WebhookWithDeliveries>> {\n return this.client.get<WebhookWithDeliveries>(`/webhooks/${id}`);\n }\n\n update(id: string, options: UpdateWebhookOptions): Promise<EusendResponse<Webhook>> {\n return this.client.patch<Webhook>(`/webhooks/${id}`, {\n url: options.url,\n events: options.events,\n });\n }\n\n delete(id: string): Promise<EusendResponse<Record<string, never>>> {\n return this.client.delete<Record<string, never>>(`/webhooks/${id}`);\n }\n}\n","import type { Eusend } from './eusend';\nimport type { EusendResponse } from './interfaces';\nimport { renderReactEmail, type ReactEmailElement } from './react-render';\n\nexport type BroadcastStatus =\n | 'draft'\n | 'scheduled'\n | 'sending'\n | 'sent'\n | 'paused'\n | 'cancelled';\n\nexport interface CreateBroadcastOptions {\n name: string;\n audienceId: string;\n /**\n * Sender address. Accepts a bare email (`onboarding@eusend.dev`) or a display-name\n * form (`Acme <onboarding@eusend.dev>`). The domain must be verified on your account.\n */\n from: string;\n subject: string;\n html?: string;\n /**\n * A React Email component. The SDK renders it to HTML locally before sending —\n * the JSX source never travels over the wire. Requires `@react-email/render`\n * and `react` as peer dependencies. Ignored when `html` is also provided.\n */\n react?: ReactEmailElement;\n templateId?: string;\n templateVariables?: Record<string, string>;\n}\n\nexport interface UpdateBroadcastOptions {\n name?: string;\n audienceId?: string;\n from?: string;\n subject?: string;\n html?: string;\n /**\n * See `react` on CreateBroadcastOptions. Rendered to HTML locally before sending.\n */\n react?: ReactEmailElement;\n templateId?: string | null;\n templateVariables?: Record<string, string> | null;\n scheduledAt?: string | null;\n}\n\nexport interface SendBroadcastOptions {\n scheduledAt?: string;\n}\n\nexport interface Broadcast {\n id: string;\n name: string;\n status: BroadcastStatus;\n audienceId: string;\n fromAddress: string;\n subject: string;\n html: string | null;\n templateId: string | null;\n templateVariables: Record<string, string> | null;\n scheduledAt: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface BroadcastListItem {\n id: string;\n name: string;\n status: BroadcastStatus;\n audienceId: string;\n fromAddress: string;\n subject: string;\n recipientCount: number | null;\n sentCount: number | null;\n scheduledAt: string | null;\n startedAt: string | null;\n completedAt: string | null;\n createdAt: string;\n audienceName: string | null;\n}\n\nexport interface BroadcastDetail extends Broadcast {\n recipientCount: number | null;\n sentCount: number | null;\n startedAt: string | null;\n completedAt: string | null;\n stats: Record<string, number>;\n}\n\nexport interface SendBroadcastResponse {\n id: string;\n status: 'sending' | 'scheduled';\n scheduledAt: string | null;\n}\n\nasync function resolveBroadcastHtml(\n options: { html?: string; react?: ReactEmailElement },\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 Broadcasts {\n constructor(private readonly client: Eusend) {}\n\n async create(options: CreateBroadcastOptions): Promise<EusendResponse<Broadcast>> {\n const html = await resolveBroadcastHtml(options);\n return this.client.post<Broadcast>('/broadcasts', {\n name: options.name,\n audience_id: options.audienceId,\n from: options.from,\n subject: options.subject,\n html,\n template_id: options.templateId,\n template_variables: options.templateVariables,\n });\n }\n\n async list(): Promise<EusendResponse<BroadcastListItem[]>> {\n const res = await this.client.get<{ data: BroadcastListItem[] }>('/broadcasts');\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<BroadcastDetail>> {\n return this.client.get<BroadcastDetail>(`/broadcasts/${id}`);\n }\n\n async update(id: string, options: UpdateBroadcastOptions): Promise<EusendResponse<Broadcast>> {\n const html = await resolveBroadcastHtml(options);\n return this.client.patch<Broadcast>(`/broadcasts/${id}`, {\n name: options.name,\n audience_id: options.audienceId,\n from: options.from,\n subject: options.subject,\n html,\n template_id: options.templateId,\n template_variables: options.templateVariables,\n scheduled_at: options.scheduledAt,\n });\n }\n\n send(id: string, options: SendBroadcastOptions = {}): Promise<EusendResponse<SendBroadcastResponse>> {\n return this.client.post<SendBroadcastResponse>(`/broadcasts/${id}/send`, {\n scheduled_at: options.scheduledAt,\n });\n }\n\n cancel(id: string): Promise<EusendResponse<Broadcast>> {\n return this.client.post<Broadcast>(`/broadcasts/${id}/cancel`);\n }\n\n delete(id: string): Promise<EusendResponse<Record<string, never>>> {\n return this.client.delete<Record<string, never>>(`/broadcasts/${id}`);\n }\n}\n","import type { EusendError, EusendResponse } from './interfaces'\nimport { Emails } from './emails'\nimport { Domains } from './domains'\nimport { ApiKeys } from './api-keys'\nimport { Audiences } from './audiences'\nimport { Templates } from './templates'\nimport { Webhooks } from './webhooks'\nimport { Broadcasts } from './broadcasts'\n\nconst DEFAULT_BASE_URL = 'https://api.eusend.dev'\nconst SDK_VERSION = '0.3.7'\n\nexport interface EusendOptions {\n baseUrl?: string\n}\n\nexport class Eusend {\n readonly baseUrl: string\n private readonly apiKey: string\n\n readonly emails: Emails\n readonly domains: Domains\n readonly apiKeys: ApiKeys\n readonly audiences: Audiences\n readonly templates: Templates\n readonly webhooks: Webhooks\n readonly broadcasts: Broadcasts\n\n constructor(key?: string, options?: EusendOptions) {\n const apiKey =\n key ?? (typeof process !== 'undefined' ? process.env['EUSEND_API_KEY'] : undefined)\n if (!apiKey) {\n throw new Error(\n 'Missing Eusend API key. Pass it to the constructor or set the EUSEND_API_KEY environment variable.',\n )\n }\n this.apiKey = apiKey\n this.baseUrl = options?.baseUrl ?? DEFAULT_BASE_URL\n\n this.emails = new Emails(this)\n this.domains = new Domains(this)\n this.apiKeys = new ApiKeys(this)\n this.audiences = new Audiences(this)\n this.templates = new Templates(this)\n this.webhooks = new Webhooks(this)\n this.broadcasts = new Broadcasts(this)\n }\n\n async fetchRequest<T>(\n path: string,\n init: RequestInit = {},\n extraHeaders: Record<string, string> = {},\n ): Promise<EusendResponse<T>> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': `eusend-node/${SDK_VERSION}`,\n ...extraHeaders,\n }\n\n try {\n const res = await fetch(`${this.baseUrl}${path}`, { ...init, headers })\n const responseHeaders = Object.fromEntries(res.headers.entries())\n\n if (!res.ok) {\n let error: EusendError\n try {\n const json = (await res.json()) as { error?: string; code?: string }\n error = {\n message: json.error ?? 'Unknown error',\n statusCode: res.status,\n name: (json.code as EusendError['name']) ?? 'INTERNAL_ERROR',\n }\n } catch {\n error = { message: 'Request failed', statusCode: res.status, name: 'INTERNAL_ERROR' }\n }\n return { data: null, error, headers: responseHeaders }\n }\n\n if (res.status === 204 || res.headers.get('content-length') === '0') {\n return { data: {} as T, error: null, headers: responseHeaders }\n }\n\n const data = (await res.json()) as T\n return { data, error: null, headers: responseHeaders }\n } catch {\n return {\n data: null,\n error: {\n message: 'Network request failed. The request could not be resolved.',\n statusCode: null,\n name: 'application_error',\n },\n headers: null,\n }\n }\n }\n\n get<T>(path: string, extraHeaders?: Record<string, string>): Promise<EusendResponse<T>> {\n return this.fetchRequest<T>(path, { method: 'GET' }, extraHeaders)\n }\n\n post<T>(\n path: string,\n body?: unknown,\n extraHeaders?: Record<string, string>,\n ): Promise<EusendResponse<T>> {\n return this.fetchRequest<T>(\n path,\n { method: 'POST', body: body != null ? JSON.stringify(body) : undefined },\n extraHeaders,\n )\n }\n\n patch<T>(path: string, body?: unknown): Promise<EusendResponse<T>> {\n return this.fetchRequest<T>(path, {\n method: 'PATCH',\n body: body != null ? JSON.stringify(body) : undefined,\n })\n }\n\n delete<T>(path: string): Promise<EusendResponse<T>> {\n return this.fetchRequest<T>(path, { method: 'DELETE' })\n }\n}\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';\nimport type { EusendResponse } from './interfaces';\nimport { renderReactEmail, type ReactEmailElement } from './react-render';\n\nexport type EmailStatus =\n | 'queued'\n | 'scheduled'\n | 'canceled'\n | 'sending'\n | 'sent'\n | 'delivered'\n | 'bounced'\n | 'complained'\n | 'suppressed'\n | 'failed';\n\nexport type EmailEventType =\n | 'sent'\n | 'delivered'\n | 'opened'\n | 'clicked'\n | 'bounced'\n | 'complained';\n\nexport interface Attachment {\n /** Name the recipient sees for the file, e.g. `invoice.pdf`. */\n filename: string;\n /**\n * File contents. A base64-encoded string (sent as-is) or raw bytes\n * (`Uint8Array`/`Buffer`), which the SDK base64-encodes for you.\n */\n content: string | Uint8Array;\n /** MIME type, e.g. `application/pdf`. Inferred from the filename when omitted. */\n contentType?: string;\n /**\n * Content-ID for an inline attachment. Set it to reference the file from your\n * HTML with `<img src=\"cid:<contentId>\">` instead of showing it as a download.\n */\n contentId?: string;\n}\n\nexport interface SendEmailOptions {\n /**\n * Sender address. Accepts a bare email (`onboarding@eusend.dev`) or a display-name\n * form (`Acme <onboarding@eusend.dev>`). The domain must be verified on your account.\n */\n from: string;\n to: string | string[];\n cc?: string | string[];\n bcc?: string | string[];\n replyTo?: string | string[];\n subject?: string;\n html?: string;\n text?: string;\n /**\n * A React Email component. The SDK renders it to HTML locally before sending\n * — the JSX source never travels over the wire. Requires `@react-email/render`\n * and `react` as peer dependencies. Ignored when `html` is also provided.\n */\n react?: ReactEmailElement;\n templateId?: string;\n variables?: Record<string, unknown>;\n headers?: Record<string, string>;\n trackOpens?: boolean;\n trackClicks?: boolean;\n /** File attachments. Up to 20 per message, 10 MB combined. */\n attachments?: Attachment[];\n /**\n * Schedule the send for a future time — an ISO 8601 string or a `Date`, at most\n * 30 days out. The email is created with status `scheduled`; reschedule it with\n * `emails.update()` or call `emails.cancel()` any time before it sends.\n */\n scheduledAt?: string | Date;\n}\n\nexport interface SendEmailRequestOptions {\n idempotencyKey?: string;\n}\n\nexport interface SendEmailResponse {\n id: string;\n}\n\nexport interface BatchSendResponse {\n data: SendEmailResponse[];\n}\n\nexport interface EmailEvent {\n id: string;\n type: EmailEventType;\n metadata: Record<string, unknown>;\n createdAt: string;\n}\n\nexport interface Email {\n id: string;\n from: string;\n to: string[];\n cc: string[];\n bcc: string[];\n replyTo: string[];\n subject: string;\n html: string | null;\n text: string | null;\n status: EmailStatus;\n testMode: boolean;\n templateId: string | null;\n /** Set only for scheduled sends. */\n scheduledAt: string | null;\n createdAt: string;\n events: EmailEvent[];\n}\n\nexport interface UpdateEmailOptions {\n /** The new send time — an ISO 8601 string or a `Date`, at most 30 days out. */\n scheduledAt: string | Date;\n}\n\nexport interface UpdateEmailResponse {\n id: string;\n status: 'scheduled';\n scheduledAt: string;\n}\n\nexport interface CancelEmailResponse {\n id: string;\n status: 'canceled';\n}\n\nexport interface EmailListItem {\n id: string;\n from: string;\n to: string[];\n subject: string;\n status: EmailStatus;\n testMode: boolean;\n createdAt: string;\n}\n\nexport interface ListEmailsOptions {\n limit?: number;\n cursor?: string;\n status?: EmailStatus;\n from?: string;\n to?: string;\n}\n\nexport interface ListEmailsResponse {\n data: EmailListItem[];\n nextCursor: string | null;\n}\n\nasync function resolveHtml(options: SendEmailOptions): Promise<string | undefined> {\n if (options.html) return options.html;\n if (options.react) return renderReactEmail(options.react);\n return undefined;\n}\n\nfunction encodeAttachmentContent(content: string | Uint8Array): string {\n // A string is assumed to already be base64. Raw bytes are encoded here.\n if (typeof content === 'string') return content;\n if (typeof Buffer !== 'undefined') return Buffer.from(content).toString('base64');\n let binary = '';\n for (const byte of content) binary += String.fromCharCode(byte);\n return btoa(binary);\n}\n\nfunction toIsoString(value: string | Date): string {\n return value instanceof Date ? value.toISOString() : value;\n}\n\nasync function toApiPayload(options: SendEmailOptions) {\n const html = await resolveHtml(options);\n return {\n from: options.from,\n to: options.to,\n cc: options.cc,\n bcc: options.bcc,\n reply_to: options.replyTo,\n subject: options.subject,\n html,\n text: options.text,\n template_id: options.templateId,\n variables: options.variables,\n headers: options.headers,\n track_opens: options.trackOpens,\n track_clicks: options.trackClicks,\n attachments: options.attachments?.map((a) => ({\n filename: a.filename,\n content: encodeAttachmentContent(a.content),\n content_type: a.contentType,\n content_id: a.contentId,\n })),\n scheduled_at: options.scheduledAt ? toIsoString(options.scheduledAt) : undefined,\n };\n}\n\nexport class Emails {\n constructor(private readonly client: Eusend) {}\n\n async send(\n options: SendEmailOptions,\n requestOptions?: SendEmailRequestOptions,\n ): Promise<EusendResponse<SendEmailResponse>> {\n const extraHeaders: Record<string, string> = {};\n if (requestOptions?.idempotencyKey) {\n extraHeaders['Idempotency-Key'] = requestOptions.idempotencyKey;\n }\n const payload = await toApiPayload(options);\n return this.client.post<SendEmailResponse>('/emails', payload, extraHeaders);\n }\n\n async batch(\n emails: SendEmailOptions[],\n ): Promise<EusendResponse<BatchSendResponse>> {\n const payloads = await Promise.all(emails.map(toApiPayload));\n // Resend-compatible: the request body is a top-level array of email objects.\n return this.client.post<BatchSendResponse>('/emails/batch', payloads);\n }\n\n async list(options: ListEmailsOptions = {}): Promise<EusendResponse<ListEmailsResponse>> {\n const params = new URLSearchParams();\n if (options.limit != null) params.set('limit', String(options.limit));\n if (options.cursor) params.set('cursor', options.cursor);\n if (options.status) params.set('status', options.status);\n if (options.from) params.set('from', options.from);\n if (options.to) params.set('to', options.to);\n const qs = params.toString();\n\n const res = await this.client.get<{ data: EmailListItem[]; next_cursor: string | null }>(\n qs ? `/emails?${qs}` : '/emails',\n );\n if (res.error) return res;\n return {\n data: { data: res.data.data, nextCursor: res.data.next_cursor },\n error: null,\n headers: res.headers,\n };\n }\n\n get(id: string): Promise<EusendResponse<Email>> {\n return this.client.get<Email>(`/emails/${id}`);\n }\n\n /** Reschedule a scheduled email. Fails once the email has started sending. */\n async update(\n id: string,\n options: UpdateEmailOptions,\n ): Promise<EusendResponse<UpdateEmailResponse>> {\n const res = await this.client.patch<{ id: string; status: 'scheduled'; scheduled_at: string }>(\n `/emails/${id}`,\n { scheduled_at: toIsoString(options.scheduledAt) },\n );\n if (res.error) return res;\n return {\n data: { id: res.data.id, status: res.data.status, scheduledAt: res.data.scheduled_at },\n error: null,\n headers: res.headers,\n };\n }\n\n /** Cancel a scheduled email. Fails once the email has started sending. */\n cancel(id: string): Promise<EusendResponse<CancelEmailResponse>> {\n return this.client.post<CancelEmailResponse>(`/emails/${id}/cancel`, undefined);\n }\n}\n","import type { Eusend } from './eusend';\nimport type { EusendResponse } from './interfaces';\n\nexport type DomainStatus = 'pending' | 'verified' | 'failed';\n\nexport interface DnsRecord {\n type: string;\n name: string;\n value: string;\n}\n\nexport interface CreateDomainResponse {\n id: string;\n name: string;\n dkim: DnsRecord;\n spf: DnsRecord;\n dmarc: DnsRecord;\n}\n\nexport interface DomainListItem {\n id: string;\n name: string;\n status: DomainStatus;\n createdAt: string;\n}\n\nexport interface Domain {\n id: string;\n name: string;\n dkimPublicKey: string;\n dkimSelector: string;\n status: DomainStatus;\n createdAt: string;\n verifiedAt: string | null;\n}\n\nexport class Domains {\n constructor(private readonly client: Eusend) {}\n\n create(name: string): Promise<EusendResponse<CreateDomainResponse>> {\n return this.client.post<CreateDomainResponse>('/domains', { name });\n }\n\n list(): Promise<EusendResponse<DomainListItem[]>> {\n return this.client.get<DomainListItem[]>('/domains');\n }\n\n get(id: string): Promise<EusendResponse<Domain>> {\n return this.client.get<Domain>(`/domains/${id}`);\n }\n\n delete(id: string): Promise<EusendResponse<{ message: string }>> {\n return this.client.delete<{ message: string }>(`/domains/${id}`);\n }\n\n verify(id: string): Promise<EusendResponse<{ message: string }>> {\n return this.client.post<{ message: string }>(`/domains/${id}/verify`);\n }\n}\n","import type { Eusend } from './eusend';\nimport type { EusendResponse } from './interfaces';\n\nexport interface CreateApiKeyOptions {\n name: string;\n testMode?: boolean;\n}\n\nexport interface CreateApiKeyResponse {\n id: string;\n name: string;\n key: string;\n prefix: string;\n testMode: boolean;\n createdAt: string;\n}\n\nexport interface ApiKey {\n id: string;\n name: string;\n prefix: string;\n testMode: boolean;\n createdAt: string;\n lastUsedAt: string | null;\n}\n\ntype CreateApiKeyApiResponse = {\n id: string;\n name: string;\n key: string;\n prefix: string;\n test_mode: boolean;\n created_at: string;\n};\n\nexport class ApiKeys {\n constructor(private readonly client: Eusend) {}\n\n async create(options: CreateApiKeyOptions): Promise<EusendResponse<CreateApiKeyResponse>> {\n const res = await this.client.post<CreateApiKeyApiResponse>('/api-keys', {\n name: options.name,\n test_mode: options.testMode ?? false,\n });\n if (res.error) return res;\n return {\n data: {\n id: res.data.id,\n name: res.data.name,\n key: res.data.key,\n prefix: res.data.prefix,\n testMode: res.data.test_mode,\n createdAt: res.data.created_at,\n },\n error: null,\n headers: res.headers,\n };\n }\n\n list(): Promise<EusendResponse<ApiKey[]>> {\n return this.client.get<ApiKey[]>('/api-keys');\n }\n\n delete(id: string): Promise<EusendResponse<{ message: string }>> {\n return this.client.delete<{ message: string }>(`/api-keys/${id}`);\n }\n}\n","import type { Eusend } from './eusend';\nimport type { EusendResponse } from './interfaces';\n\nexport type ContactStatus = 'subscribed' | 'unsubscribed';\n\nexport interface Audience {\n id: string;\n name: string;\n organizationId: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface AudienceListItem {\n id: string;\n name: string;\n createdAt: string;\n contactCount: number;\n}\n\nexport interface Contact {\n id: string;\n audienceId: string;\n email: string;\n firstName: string | null;\n lastName: string | null;\n status: ContactStatus;\n unsubscribedAt: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateContactOptions {\n email: string;\n firstName?: string;\n lastName?: string;\n}\n\nexport interface UpdateContactOptions {\n firstName?: string;\n lastName?: string;\n unsubscribed?: boolean;\n}\n\nexport interface ListContactsOptions {\n limit?: number;\n cursor?: string;\n search?: string;\n subscribed?: boolean;\n}\n\nexport interface ListContactsResponse {\n data: Contact[];\n nextCursor: string | null;\n}\n\nexport interface BatchCreateContactsOptions {\n contacts: CreateContactOptions[];\n}\n\nexport class Audiences {\n constructor(private readonly client: Eusend) {}\n\n create(name: string): Promise<EusendResponse<Audience>> {\n return this.client.post<Audience>('/audiences', { name });\n }\n\n async list(): Promise<EusendResponse<AudienceListItem[]>> {\n const res = await this.client.get<{ data: AudienceListItem[] }>('/audiences');\n if (res.error) return res;\n return { data: res.data.data, error: null, headers: res.headers };\n }\n\n delete(id: string): Promise<EusendResponse<Record<string, never>>> {\n return this.client.delete<Record<string, never>>(`/audiences/${id}`);\n }\n\n createContact(\n audienceId: string,\n options: CreateContactOptions,\n ): Promise<EusendResponse<Contact>> {\n return this.client.post<Contact>(`/audiences/${audienceId}/contacts`, {\n email: options.email,\n first_name: options.firstName,\n last_name: options.lastName,\n });\n }\n\n async listContacts(\n audienceId: string,\n options: ListContactsOptions = {},\n ): Promise<EusendResponse<ListContactsResponse>> {\n const params = new URLSearchParams();\n if (options.limit != null) params.set('limit', String(options.limit));\n if (options.cursor) params.set('cursor', options.cursor);\n if (options.search) params.set('search', options.search);\n if (options.subscribed != null) params.set('subscribed', String(options.subscribed));\n const qs = params.toString();\n return this.client.get<ListContactsResponse>(\n qs ? `/audiences/${audienceId}/contacts?${qs}` : `/audiences/${audienceId}/contacts`,\n );\n }\n\n getContact(audienceId: string, contactId: string): Promise<EusendResponse<Contact>> {\n return this.client.get<Contact>(`/audiences/${audienceId}/contacts/${contactId}`);\n }\n\n updateContact(\n audienceId: string,\n contactId: string,\n options: UpdateContactOptions,\n ): Promise<EusendResponse<Contact>> {\n return this.client.patch<Contact>(`/audiences/${audienceId}/contacts/${contactId}`, {\n first_name: options.firstName,\n last_name: options.lastName,\n unsubscribed: options.unsubscribed,\n });\n }\n\n deleteContact(\n audienceId: string,\n contactId: string,\n ): Promise<EusendResponse<Record<string, never>>> {\n return this.client.delete<Record<string, never>>(\n `/audiences/${audienceId}/contacts/${contactId}`,\n );\n }\n\n batchCreateContacts(\n audienceId: string,\n options: BatchCreateContactsOptions,\n ): Promise<EusendResponse<{ count: number }>> {\n return this.client.post<{ count: number }>(`/audiences/${audienceId}/contacts/batch`, {\n contacts: options.contacts.map((c) => ({\n email: c.email,\n first_name: c.firstName,\n last_name: c.lastName,\n })),\n });\n }\n}\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';\nimport type { EusendResponse } from './interfaces';\n\nexport type WebhookEvent =\n | 'email.sent'\n | 'email.delivered'\n | 'email.bounced'\n | 'email.complained'\n | 'email.opened'\n | 'email.clicked'\n | '*';\n\nexport interface CreateWebhookOptions {\n url: string;\n events: WebhookEvent[];\n}\n\nexport interface UpdateWebhookOptions {\n url?: string;\n events?: WebhookEvent[];\n}\n\nexport interface WebhookDelivery {\n id: string;\n webhookId: string;\n emailId: string | null;\n eventType: string;\n payload: Record<string, unknown>;\n status: 'pending' | 'success' | 'failed';\n responseStatus: number | null;\n attempts: number;\n createdAt: string;\n lastAttemptAt: string | null;\n}\n\nexport interface Webhook {\n id: string;\n url: string;\n events: WebhookEvent[];\n createdAt: string;\n}\n\nexport interface WebhookWithDeliveries extends Webhook {\n deliveries: WebhookDelivery[];\n}\n\nexport interface CreateWebhookResponse extends Webhook {\n secret: string;\n}\n\nexport class Webhooks {\n constructor(private readonly client: Eusend) {}\n\n create(options: CreateWebhookOptions): Promise<EusendResponse<CreateWebhookResponse>> {\n return this.client.post<CreateWebhookResponse>('/webhooks', {\n url: options.url,\n events: options.events,\n });\n }\n\n async list(): Promise<EusendResponse<Webhook[]>> {\n const res = await this.client.get<{ data: Webhook[] }>('/webhooks');\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<WebhookWithDeliveries>> {\n return this.client.get<WebhookWithDeliveries>(`/webhooks/${id}`);\n }\n\n update(id: string, options: UpdateWebhookOptions): Promise<EusendResponse<Webhook>> {\n return this.client.patch<Webhook>(`/webhooks/${id}`, {\n url: options.url,\n events: options.events,\n });\n }\n\n delete(id: string): Promise<EusendResponse<Record<string, never>>> {\n return this.client.delete<Record<string, never>>(`/webhooks/${id}`);\n }\n}\n","import type { Eusend } from './eusend';\nimport type { EusendResponse } from './interfaces';\nimport { renderReactEmail, type ReactEmailElement } from './react-render';\n\nexport type BroadcastStatus =\n | 'draft'\n | 'scheduled'\n | 'sending'\n | 'sent'\n | 'paused'\n | 'cancelled';\n\nexport interface CreateBroadcastOptions {\n name: string;\n audienceId: string;\n /**\n * Sender address. Accepts a bare email (`onboarding@eusend.dev`) or a display-name\n * form (`Acme <onboarding@eusend.dev>`). The domain must be verified on your account.\n */\n from: string;\n subject: string;\n html?: string;\n /**\n * A React Email component. The SDK renders it to HTML locally before sending —\n * the JSX source never travels over the wire. Requires `@react-email/render`\n * and `react` as peer dependencies. Ignored when `html` is also provided.\n */\n react?: ReactEmailElement;\n templateId?: string;\n templateVariables?: Record<string, string>;\n}\n\nexport interface UpdateBroadcastOptions {\n name?: string;\n audienceId?: string;\n from?: string;\n subject?: string;\n html?: string;\n /**\n * See `react` on CreateBroadcastOptions. Rendered to HTML locally before sending.\n */\n react?: ReactEmailElement;\n templateId?: string | null;\n templateVariables?: Record<string, string> | null;\n scheduledAt?: string | null;\n}\n\nexport interface SendBroadcastOptions {\n scheduledAt?: string;\n}\n\nexport interface Broadcast {\n id: string;\n name: string;\n status: BroadcastStatus;\n audienceId: string;\n fromAddress: string;\n subject: string;\n html: string | null;\n templateId: string | null;\n templateVariables: Record<string, string> | null;\n scheduledAt: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface BroadcastListItem {\n id: string;\n name: string;\n status: BroadcastStatus;\n audienceId: string;\n fromAddress: string;\n subject: string;\n recipientCount: number | null;\n sentCount: number | null;\n scheduledAt: string | null;\n startedAt: string | null;\n completedAt: string | null;\n createdAt: string;\n audienceName: string | null;\n}\n\nexport interface BroadcastDetail extends Broadcast {\n recipientCount: number | null;\n sentCount: number | null;\n startedAt: string | null;\n completedAt: string | null;\n stats: Record<string, number>;\n}\n\nexport interface SendBroadcastResponse {\n id: string;\n status: 'sending' | 'scheduled';\n scheduledAt: string | null;\n}\n\nasync function resolveBroadcastHtml(\n options: { html?: string; react?: ReactEmailElement },\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 Broadcasts {\n constructor(private readonly client: Eusend) {}\n\n async create(options: CreateBroadcastOptions): Promise<EusendResponse<Broadcast>> {\n const html = await resolveBroadcastHtml(options);\n return this.client.post<Broadcast>('/broadcasts', {\n name: options.name,\n audience_id: options.audienceId,\n from: options.from,\n subject: options.subject,\n html,\n template_id: options.templateId,\n template_variables: options.templateVariables,\n });\n }\n\n async list(): Promise<EusendResponse<BroadcastListItem[]>> {\n const res = await this.client.get<{ data: BroadcastListItem[] }>('/broadcasts');\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<BroadcastDetail>> {\n return this.client.get<BroadcastDetail>(`/broadcasts/${id}`);\n }\n\n async update(id: string, options: UpdateBroadcastOptions): Promise<EusendResponse<Broadcast>> {\n const html = await resolveBroadcastHtml(options);\n return this.client.patch<Broadcast>(`/broadcasts/${id}`, {\n name: options.name,\n audience_id: options.audienceId,\n from: options.from,\n subject: options.subject,\n html,\n template_id: options.templateId,\n template_variables: options.templateVariables,\n scheduled_at: options.scheduledAt,\n });\n }\n\n send(id: string, options: SendBroadcastOptions = {}): Promise<EusendResponse<SendBroadcastResponse>> {\n return this.client.post<SendBroadcastResponse>(`/broadcasts/${id}/send`, {\n scheduled_at: options.scheduledAt,\n });\n }\n\n cancel(id: string): Promise<EusendResponse<Broadcast>> {\n return this.client.post<Broadcast>(`/broadcasts/${id}/cancel`);\n }\n\n delete(id: string): Promise<EusendResponse<Record<string, never>>> {\n return this.client.delete<Record<string, never>>(`/broadcasts/${id}`);\n }\n}\n","import type { EusendError, EusendResponse } from './interfaces'\nimport { Emails } from './emails'\nimport { Domains } from './domains'\nimport { ApiKeys } from './api-keys'\nimport { Audiences } from './audiences'\nimport { Templates } from './templates'\nimport { Webhooks } from './webhooks'\nimport { Broadcasts } from './broadcasts'\n\nconst DEFAULT_BASE_URL = 'https://api.eusend.dev'\nconst SDK_VERSION = '0.3.7'\n\nexport interface EusendOptions {\n baseUrl?: string\n}\n\nexport class Eusend {\n readonly baseUrl: string\n private readonly apiKey: string\n\n readonly emails: Emails\n readonly domains: Domains\n readonly apiKeys: ApiKeys\n readonly audiences: Audiences\n readonly templates: Templates\n readonly webhooks: Webhooks\n readonly broadcasts: Broadcasts\n\n constructor(key?: string, options?: EusendOptions) {\n const apiKey =\n key ?? (typeof process !== 'undefined' ? process.env['EUSEND_API_KEY'] : undefined)\n if (!apiKey) {\n throw new Error(\n 'Missing Eusend API key. Pass it to the constructor or set the EUSEND_API_KEY environment variable.',\n )\n }\n this.apiKey = apiKey\n this.baseUrl = options?.baseUrl ?? DEFAULT_BASE_URL\n\n this.emails = new Emails(this)\n this.domains = new Domains(this)\n this.apiKeys = new ApiKeys(this)\n this.audiences = new Audiences(this)\n this.templates = new Templates(this)\n this.webhooks = new Webhooks(this)\n this.broadcasts = new Broadcasts(this)\n }\n\n async fetchRequest<T>(\n path: string,\n init: RequestInit = {},\n extraHeaders: Record<string, string> = {},\n ): Promise<EusendResponse<T>> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': `eusend-node/${SDK_VERSION}`,\n ...extraHeaders,\n }\n\n try {\n const res = await fetch(`${this.baseUrl}${path}`, { ...init, headers })\n const responseHeaders = Object.fromEntries(res.headers.entries())\n\n if (!res.ok) {\n let error: EusendError\n try {\n const json = (await res.json()) as { error?: string; code?: string }\n error = {\n message: json.error ?? 'Unknown error',\n statusCode: res.status,\n name: (json.code as EusendError['name']) ?? 'INTERNAL_ERROR',\n }\n } catch {\n error = { message: 'Request failed', statusCode: res.status, name: 'INTERNAL_ERROR' }\n }\n return { data: null, error, headers: responseHeaders }\n }\n\n if (res.status === 204 || res.headers.get('content-length') === '0') {\n return { data: {} as T, error: null, headers: responseHeaders }\n }\n\n const data = (await res.json()) as T\n return { data, error: null, headers: responseHeaders }\n } catch {\n return {\n data: null,\n error: {\n message: 'Network request failed. The request could not be resolved.',\n statusCode: null,\n name: 'application_error',\n },\n headers: null,\n }\n }\n }\n\n get<T>(path: string, extraHeaders?: Record<string, string>): Promise<EusendResponse<T>> {\n return this.fetchRequest<T>(path, { method: 'GET' }, extraHeaders)\n }\n\n post<T>(\n path: string,\n body?: unknown,\n extraHeaders?: Record<string, string>,\n ): Promise<EusendResponse<T>> {\n return this.fetchRequest<T>(\n path,\n { method: 'POST', body: body != null ? JSON.stringify(body) : undefined },\n extraHeaders,\n )\n }\n\n patch<T>(path: string, body?: unknown): Promise<EusendResponse<T>> {\n return this.fetchRequest<T>(path, {\n method: 'PATCH',\n body: body != null ? JSON.stringify(body) : undefined,\n })\n }\n\n delete<T>(path: string): Promise<EusendResponse<T>> {\n return this.fetchRequest<T>(path, { method: 'DELETE' })\n }\n}\n"],"mappings":"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"}
|