@eusend_dev/sdk 0.4.3 → 0.5.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 +1 -1
- package/dist/index.cjs +25 -5
- package/dist/index.d.cts +46 -6
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +46 -6
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +25 -5
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -110,7 +110,7 @@ const { data } = await client.emails.send(
|
|
|
110
110
|
Up to 100 emails in a single request.
|
|
111
111
|
|
|
112
112
|
```ts
|
|
113
|
-
const { data } = await client.
|
|
113
|
+
const { data } = await client.batch.send([
|
|
114
114
|
{
|
|
115
115
|
from: 'you@yourdomain.com',
|
|
116
116
|
to: 'alice@example.com',
|
package/dist/index.cjs
CHANGED
|
@@ -67,10 +67,6 @@ var Emails = class {
|
|
|
67
67
|
const payload = await toApiPayload(options);
|
|
68
68
|
return this.client.post("/emails", payload, extraHeaders);
|
|
69
69
|
}
|
|
70
|
-
async batch(emails) {
|
|
71
|
-
const payloads = await Promise.all(emails.map(toApiPayload));
|
|
72
|
-
return this.client.post("/emails/batch", payloads);
|
|
73
|
-
}
|
|
74
70
|
async list(options = {}) {
|
|
75
71
|
const params = new URLSearchParams();
|
|
76
72
|
if (options.limit != null) params.set("limit", String(options.limit));
|
|
@@ -113,6 +109,29 @@ var Emails = class {
|
|
|
113
109
|
}
|
|
114
110
|
};
|
|
115
111
|
//#endregion
|
|
112
|
+
//#region src/batch.ts
|
|
113
|
+
/**
|
|
114
|
+
* Batch sending — `eusend.batch.send([...])`. The method path mirrors Resend's
|
|
115
|
+
* `resend.batch.send([...])`, so migrating is a mechanical `resend` → `eusend` rename.
|
|
116
|
+
* The HTTP body is a top-level array of email objects (POST /emails/batch), up to 100
|
|
117
|
+
* per request. As with Resend, attachments and `scheduledAt` are not supported on the
|
|
118
|
+
* batch endpoint — send those individually via `emails.send`.
|
|
119
|
+
*
|
|
120
|
+
* The response maps positionally to the input: `data[i]` is `{ id }` when
|
|
121
|
+
* `emails[i]` was queued, or `{ error, code }` when it was not (unverified
|
|
122
|
+
* domain, suppressed recipients, exhausted quota, …) — failed items never fail
|
|
123
|
+
* the whole batch, so branch on the presence of `id` per item.
|
|
124
|
+
*/
|
|
125
|
+
var Batch = class {
|
|
126
|
+
constructor(client) {
|
|
127
|
+
this.client = client;
|
|
128
|
+
}
|
|
129
|
+
async send(emails) {
|
|
130
|
+
const payloads = await Promise.all(emails.map(toApiPayload));
|
|
131
|
+
return this.client.post("/emails/batch", payloads);
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
//#endregion
|
|
116
135
|
//#region src/domains.ts
|
|
117
136
|
var Domains = class {
|
|
118
137
|
constructor(client) {
|
|
@@ -369,7 +388,7 @@ var Broadcasts = class {
|
|
|
369
388
|
//#endregion
|
|
370
389
|
//#region src/eusend.ts
|
|
371
390
|
const DEFAULT_BASE_URL = "https://api.eusend.dev";
|
|
372
|
-
const SDK_VERSION = "0.
|
|
391
|
+
const SDK_VERSION = "0.5.1";
|
|
373
392
|
var Eusend = class {
|
|
374
393
|
constructor(key, options) {
|
|
375
394
|
const apiKey = key ?? (typeof process !== "undefined" ? process.env["EUSEND_API_KEY"] : void 0);
|
|
@@ -377,6 +396,7 @@ var Eusend = class {
|
|
|
377
396
|
this.apiKey = apiKey;
|
|
378
397
|
this.baseUrl = options?.baseUrl ?? DEFAULT_BASE_URL;
|
|
379
398
|
this.emails = new Emails(this);
|
|
399
|
+
this.batch = new Batch(this);
|
|
380
400
|
this.domains = new Domains(this);
|
|
381
401
|
this.apiKeys = new ApiKeys(this);
|
|
382
402
|
this.audiences = new Audiences(this);
|
package/dist/index.d.cts
CHANGED
|
@@ -75,8 +75,11 @@ interface SendEmailOptions {
|
|
|
75
75
|
/** File attachments. Up to 20 per message, 10 MB combined. */
|
|
76
76
|
attachments?: Attachment[];
|
|
77
77
|
/**
|
|
78
|
-
* Schedule the send for a future time
|
|
79
|
-
*
|
|
78
|
+
* Schedule the send for a future time, at most 30 days out. Accepts a `Date`, an
|
|
79
|
+
* ISO 8601 string, or a natural-language time like `"in 1 hour"` or `"tomorrow at
|
|
80
|
+
* 9am"` (parsed server-side, same as Resend). Relative phrasings resolve against the
|
|
81
|
+
* server clock in UTC — pass an offset-qualified ISO string when you need an exact
|
|
82
|
+
* instant. The email is created with status `scheduled`; reschedule it with
|
|
80
83
|
* `emails.update()` or call `emails.cancel()` any time before it sends.
|
|
81
84
|
*/
|
|
82
85
|
scheduledAt?: string | Date;
|
|
@@ -87,8 +90,24 @@ interface SendEmailRequestOptions {
|
|
|
87
90
|
interface SendEmailResponse {
|
|
88
91
|
id: string;
|
|
89
92
|
}
|
|
93
|
+
/**
|
|
94
|
+
* Per-item outcome of a batch send, positionally mapped to the input array:
|
|
95
|
+
* `data[i]` describes `emails[i]`. Items that were queued carry `{ id }`; items
|
|
96
|
+
* that could not be queued carry `{ error, code }` (e.g. an unverified sender
|
|
97
|
+
* domain, all recipients suppressed, or an exhausted send quota). Branch on the
|
|
98
|
+
* presence of `id`.
|
|
99
|
+
*/
|
|
100
|
+
type BatchItemResult = {
|
|
101
|
+
id: string;
|
|
102
|
+
error?: never;
|
|
103
|
+
code?: never;
|
|
104
|
+
} | {
|
|
105
|
+
id?: never;
|
|
106
|
+
error: string;
|
|
107
|
+
code: EusendErrorCode;
|
|
108
|
+
};
|
|
90
109
|
interface BatchSendResponse {
|
|
91
|
-
data:
|
|
110
|
+
data: BatchItemResult[];
|
|
92
111
|
}
|
|
93
112
|
interface EmailEvent {
|
|
94
113
|
id: string;
|
|
@@ -115,7 +134,8 @@ interface Email {
|
|
|
115
134
|
events: EmailEvent[];
|
|
116
135
|
}
|
|
117
136
|
interface UpdateEmailOptions {
|
|
118
|
-
/** The new send time
|
|
137
|
+
/** The new send time, at most 30 days out — a `Date`, an ISO 8601 string, or natural
|
|
138
|
+
* language like `"in 1 hour"` (parsed server-side, same as `emails.send`). */
|
|
119
139
|
scheduledAt: string | Date;
|
|
120
140
|
}
|
|
121
141
|
interface UpdateEmailResponse {
|
|
@@ -151,7 +171,6 @@ declare class Emails {
|
|
|
151
171
|
private readonly client;
|
|
152
172
|
constructor(client: Eusend);
|
|
153
173
|
send(options: SendEmailOptions, requestOptions?: SendEmailRequestOptions): Promise<EusendResponse<SendEmailResponse>>;
|
|
154
|
-
batch(emails: SendEmailOptions[]): Promise<EusendResponse<BatchSendResponse>>;
|
|
155
174
|
list(options?: ListEmailsOptions): Promise<EusendResponse<ListEmailsResponse>>;
|
|
156
175
|
get(id: string): Promise<EusendResponse<Email>>;
|
|
157
176
|
/** Reschedule a scheduled email. Fails once the email has started sending. */
|
|
@@ -160,6 +179,25 @@ declare class Emails {
|
|
|
160
179
|
cancel(id: string): Promise<EusendResponse<CancelEmailResponse>>;
|
|
161
180
|
}
|
|
162
181
|
//#endregion
|
|
182
|
+
//#region src/batch.d.ts
|
|
183
|
+
/**
|
|
184
|
+
* Batch sending — `eusend.batch.send([...])`. The method path mirrors Resend's
|
|
185
|
+
* `resend.batch.send([...])`, so migrating is a mechanical `resend` → `eusend` rename.
|
|
186
|
+
* The HTTP body is a top-level array of email objects (POST /emails/batch), up to 100
|
|
187
|
+
* per request. As with Resend, attachments and `scheduledAt` are not supported on the
|
|
188
|
+
* batch endpoint — send those individually via `emails.send`.
|
|
189
|
+
*
|
|
190
|
+
* The response maps positionally to the input: `data[i]` is `{ id }` when
|
|
191
|
+
* `emails[i]` was queued, or `{ error, code }` when it was not (unverified
|
|
192
|
+
* domain, suppressed recipients, exhausted quota, …) — failed items never fail
|
|
193
|
+
* the whole batch, so branch on the presence of `id` per item.
|
|
194
|
+
*/
|
|
195
|
+
declare class Batch {
|
|
196
|
+
private readonly client;
|
|
197
|
+
constructor(client: Eusend);
|
|
198
|
+
send(emails: SendEmailOptions[]): Promise<EusendResponse<BatchSendResponse>>;
|
|
199
|
+
}
|
|
200
|
+
//#endregion
|
|
163
201
|
//#region src/domains.d.ts
|
|
164
202
|
type DomainStatus = 'pending' | 'verified' | 'failed';
|
|
165
203
|
interface DnsRecord {
|
|
@@ -487,6 +525,8 @@ declare class Eusend {
|
|
|
487
525
|
readonly baseUrl: string;
|
|
488
526
|
private readonly apiKey;
|
|
489
527
|
readonly emails: Emails;
|
|
528
|
+
/** Batch sending — `client.batch.send([...])`. Mirrors Resend's `resend.batch.send()`. */
|
|
529
|
+
readonly batch: Batch;
|
|
490
530
|
readonly domains: Domains;
|
|
491
531
|
readonly apiKeys: ApiKeys;
|
|
492
532
|
readonly audiences: Audiences;
|
|
@@ -501,5 +541,5 @@ declare class Eusend {
|
|
|
501
541
|
delete<T>(path: string): Promise<EusendResponse<T>>;
|
|
502
542
|
}
|
|
503
543
|
//#endregion
|
|
504
|
-
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 };
|
|
544
|
+
export { type ApiKey, type Attachment, type Audience, type AudienceListItem, type BatchCreateContactsOptions, type BatchItemResult, 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 };
|
|
505
545
|
//# 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,KAYA,cAAA;AAAA,UAQK,UAAA;EFJA;EEMf,QAAA;;;;;;EAMA,OAAA,YAAmB,UAAU;EFTR;AAAA;AAGvB;;;EEYE,IAAA;EFXmC;EEanC,WAAA;EFZ6C;;;;EEiB7C,SAAA;AAAA;AAAA,UAGe,gBAAA;EFrBW;;;;EE0B1B,IAAA;EACA,EAAA;EACA,EAAA;EACA,GAAA;EACA,OAAA;EACA,OAAA;EACA,IAAA;EACA,IAAA;EDzDU;;;;;EC+DV,KAAA,GAAQ,iBAAA;EACR,UAAA;EACA,SAAA,GAAY,MAAA;EACZ,OAAA,GAAU,MAAA;EACV,UAAA;EACA,WAAA;;EAEA,WAAA,GAAc,UAAA;EArEO;;;AAAA;AAYvB
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/interfaces.ts","../src/react-render.ts","../src/emails.ts","../src/batch.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
|
@@ -75,8 +75,11 @@ interface SendEmailOptions {
|
|
|
75
75
|
/** File attachments. Up to 20 per message, 10 MB combined. */
|
|
76
76
|
attachments?: Attachment[];
|
|
77
77
|
/**
|
|
78
|
-
* Schedule the send for a future time
|
|
79
|
-
*
|
|
78
|
+
* Schedule the send for a future time, at most 30 days out. Accepts a `Date`, an
|
|
79
|
+
* ISO 8601 string, or a natural-language time like `"in 1 hour"` or `"tomorrow at
|
|
80
|
+
* 9am"` (parsed server-side, same as Resend). Relative phrasings resolve against the
|
|
81
|
+
* server clock in UTC — pass an offset-qualified ISO string when you need an exact
|
|
82
|
+
* instant. The email is created with status `scheduled`; reschedule it with
|
|
80
83
|
* `emails.update()` or call `emails.cancel()` any time before it sends.
|
|
81
84
|
*/
|
|
82
85
|
scheduledAt?: string | Date;
|
|
@@ -87,8 +90,24 @@ interface SendEmailRequestOptions {
|
|
|
87
90
|
interface SendEmailResponse {
|
|
88
91
|
id: string;
|
|
89
92
|
}
|
|
93
|
+
/**
|
|
94
|
+
* Per-item outcome of a batch send, positionally mapped to the input array:
|
|
95
|
+
* `data[i]` describes `emails[i]`. Items that were queued carry `{ id }`; items
|
|
96
|
+
* that could not be queued carry `{ error, code }` (e.g. an unverified sender
|
|
97
|
+
* domain, all recipients suppressed, or an exhausted send quota). Branch on the
|
|
98
|
+
* presence of `id`.
|
|
99
|
+
*/
|
|
100
|
+
type BatchItemResult = {
|
|
101
|
+
id: string;
|
|
102
|
+
error?: never;
|
|
103
|
+
code?: never;
|
|
104
|
+
} | {
|
|
105
|
+
id?: never;
|
|
106
|
+
error: string;
|
|
107
|
+
code: EusendErrorCode;
|
|
108
|
+
};
|
|
90
109
|
interface BatchSendResponse {
|
|
91
|
-
data:
|
|
110
|
+
data: BatchItemResult[];
|
|
92
111
|
}
|
|
93
112
|
interface EmailEvent {
|
|
94
113
|
id: string;
|
|
@@ -115,7 +134,8 @@ interface Email {
|
|
|
115
134
|
events: EmailEvent[];
|
|
116
135
|
}
|
|
117
136
|
interface UpdateEmailOptions {
|
|
118
|
-
/** The new send time
|
|
137
|
+
/** The new send time, at most 30 days out — a `Date`, an ISO 8601 string, or natural
|
|
138
|
+
* language like `"in 1 hour"` (parsed server-side, same as `emails.send`). */
|
|
119
139
|
scheduledAt: string | Date;
|
|
120
140
|
}
|
|
121
141
|
interface UpdateEmailResponse {
|
|
@@ -151,7 +171,6 @@ declare class Emails {
|
|
|
151
171
|
private readonly client;
|
|
152
172
|
constructor(client: Eusend);
|
|
153
173
|
send(options: SendEmailOptions, requestOptions?: SendEmailRequestOptions): Promise<EusendResponse<SendEmailResponse>>;
|
|
154
|
-
batch(emails: SendEmailOptions[]): Promise<EusendResponse<BatchSendResponse>>;
|
|
155
174
|
list(options?: ListEmailsOptions): Promise<EusendResponse<ListEmailsResponse>>;
|
|
156
175
|
get(id: string): Promise<EusendResponse<Email>>;
|
|
157
176
|
/** Reschedule a scheduled email. Fails once the email has started sending. */
|
|
@@ -160,6 +179,25 @@ declare class Emails {
|
|
|
160
179
|
cancel(id: string): Promise<EusendResponse<CancelEmailResponse>>;
|
|
161
180
|
}
|
|
162
181
|
//#endregion
|
|
182
|
+
//#region src/batch.d.ts
|
|
183
|
+
/**
|
|
184
|
+
* Batch sending — `eusend.batch.send([...])`. The method path mirrors Resend's
|
|
185
|
+
* `resend.batch.send([...])`, so migrating is a mechanical `resend` → `eusend` rename.
|
|
186
|
+
* The HTTP body is a top-level array of email objects (POST /emails/batch), up to 100
|
|
187
|
+
* per request. As with Resend, attachments and `scheduledAt` are not supported on the
|
|
188
|
+
* batch endpoint — send those individually via `emails.send`.
|
|
189
|
+
*
|
|
190
|
+
* The response maps positionally to the input: `data[i]` is `{ id }` when
|
|
191
|
+
* `emails[i]` was queued, or `{ error, code }` when it was not (unverified
|
|
192
|
+
* domain, suppressed recipients, exhausted quota, …) — failed items never fail
|
|
193
|
+
* the whole batch, so branch on the presence of `id` per item.
|
|
194
|
+
*/
|
|
195
|
+
declare class Batch {
|
|
196
|
+
private readonly client;
|
|
197
|
+
constructor(client: Eusend);
|
|
198
|
+
send(emails: SendEmailOptions[]): Promise<EusendResponse<BatchSendResponse>>;
|
|
199
|
+
}
|
|
200
|
+
//#endregion
|
|
163
201
|
//#region src/domains.d.ts
|
|
164
202
|
type DomainStatus = 'pending' | 'verified' | 'failed';
|
|
165
203
|
interface DnsRecord {
|
|
@@ -487,6 +525,8 @@ declare class Eusend {
|
|
|
487
525
|
readonly baseUrl: string;
|
|
488
526
|
private readonly apiKey;
|
|
489
527
|
readonly emails: Emails;
|
|
528
|
+
/** Batch sending — `client.batch.send([...])`. Mirrors Resend's `resend.batch.send()`. */
|
|
529
|
+
readonly batch: Batch;
|
|
490
530
|
readonly domains: Domains;
|
|
491
531
|
readonly apiKeys: ApiKeys;
|
|
492
532
|
readonly audiences: Audiences;
|
|
@@ -501,5 +541,5 @@ declare class Eusend {
|
|
|
501
541
|
delete<T>(path: string): Promise<EusendResponse<T>>;
|
|
502
542
|
}
|
|
503
543
|
//#endregion
|
|
504
|
-
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 };
|
|
544
|
+
export { type ApiKey, type Attachment, type Audience, type AudienceListItem, type BatchCreateContactsOptions, type BatchItemResult, 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 };
|
|
505
545
|
//# 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,KAYA,cAAA;AAAA,UAQK,UAAA;EFJA;EEMf,QAAA;;;;;;EAMA,OAAA,YAAmB,UAAU;EFTR;AAAA;AAGvB;;;EEYE,IAAA;EFXmC;EEanC,WAAA;EFZ6C;;;;EEiB7C,SAAA;AAAA;AAAA,UAGe,gBAAA;EFrBW;;;;EE0B1B,IAAA;EACA,EAAA;EACA,EAAA;EACA,GAAA;EACA,OAAA;EACA,OAAA;EACA,IAAA;EACA,IAAA;EDzDU;;;;;EC+DV,KAAA,GAAQ,iBAAA;EACR,UAAA;EACA,SAAA,GAAY,MAAA;EACZ,OAAA,GAAU,MAAA;EACV,UAAA;EACA,WAAA;;EAEA,WAAA,GAAc,UAAA;EArEO;;;AAAA;AAYvB
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/interfaces.ts","../src/react-render.ts","../src/emails.ts","../src/batch.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,KAYA,cAAA;AAAA,UAQK,UAAA;EFJA;EEMf,QAAA;;;;;;EAMA,OAAA,YAAmB,UAAU;EFTR;AAAA;AAGvB;;;EEYE,IAAA;EFXmC;EEanC,WAAA;EFZ6C;;;;EEiB7C,SAAA;AAAA;AAAA,UAGe,gBAAA;EFrBW;;;;EE0B1B,IAAA;EACA,EAAA;EACA,EAAA;EACA,GAAA;EACA,OAAA;EACA,OAAA;EACA,IAAA;EACA,IAAA;EDzDU;;;;;EC+DV,KAAA,GAAQ,iBAAA;EACR,UAAA;EACA,SAAA,GAAY,MAAA;EACZ,OAAA,GAAU,MAAA;EACV,UAAA;EACA,WAAA;;EAEA,WAAA,GAAc,UAAA;EArEO;;;AAAA;AAYvB;;;;EAkEE,WAAA,YAAuB,IAAA;AAAA;AAAA,UAGR,uBAAA;EACf,cAAc;AAAA;AAAA,UAGC,iBAAA;EACf,EAAE;AAAA;;;;;AA7CO;AAGX;;KAoDY,eAAA;EACN,EAAA;EAAY,KAAA;EAAe,IAAA;AAAA;EAC3B,EAAA;EAAY,KAAA;EAAe,IAAA,EAAM,eAAe;AAAA;AAAA,UAErC,iBAAA;EACf,IAAA,EAAM,eAAe;AAAA;AAAA,UAGN,UAAA;EACf,EAAA;EACA,IAAA,EAAM,cAAA;EACN,QAAA,EAAU,MAAM;EAChB,SAAA;AAAA;AAAA,UAGe,KAAA;EACf,EAAA;EACA,IAAA;EACA,EAAA;EACA,EAAA;EACA,GAAA;EACA,OAAA;EACA,OAAA;EACA,IAAA;EACA,IAAA;EACA,MAAA,EAAQ,WAAA;EACR,QAAA;EACA,UAAA;EA1Ce;EA4Cf,WAAA;EACA,SAAA;EACA,MAAA,EAAQ,UAAU;AAAA;AAAA,UAGH,kBAAA;EA7CiB;;EAgDhC,WAAA,WAAsB,IAAI;AAAA;AAAA,UAGX,mBAAA;EACf,EAAA;EACA,MAAA;EACA,WAAA;AAAA;AAAA,UAGe,mBAAA;EACf,EAAA;EACA,MAAM;AAAA;AAAA,UAGS,aAAA;EACf,EAAA;EACA,IAAA;EACA,EAAA;EACA,OAAA;EACA,MAAA,EAAQ,WAAW;EACnB,QAAA;EACA,SAAA;AAAA;AAAA,UAGe,iBAAA;EACf,KAAA;EACA,MAAA;EACA,MAAA,GAAS,WAAW;EACpB,IAAA;EACA,EAAA;AAAA;AAAA,UAGe,kBAAA;EACf,IAAA,EAAM,aAAa;EACnB,UAAA;AAAA;AAAA,cAiDW,MAAA;EAAA,iBACkB,MAAA;cAAA,MAAA,EAAQ,MAAA;EAE/B,IAAA,CACJ,OAAA,EAAS,gBAAA,EACT,cAAA,GAAiB,uBAAA,GAChB,OAAA,CAAQ,cAAA,CAAe,iBAAA;EASpB,IAAA,CAAK,OAAA,GAAS,iBAAA,GAAyB,OAAA,CAAQ,cAAA,CAAe,kBAAA;EAoBpE,GAAA,CAAI,EAAA,WAAa,OAAA,CAAQ,cAAA,CAAe,KAAA;EAnHzB;EAwHT,MAAA,CACJ,EAAA,UACA,OAAA,EAAS,kBAAA,GACR,OAAA,CAAQ,cAAA,CAAe,mBAAA;;EAc1B,MAAA,CAAO,EAAA,WAAa,OAAA,CAAQ,cAAA,CAAe,mBAAA;AAAA;;;;;AFrRlB;AAoB3B;;;;;;;;;cGJa,KAAA;EAAA,iBACkB,MAAA;cAAA,MAAA,EAAQ,MAAA;EAE/B,IAAA,CAAK,MAAA,EAAQ,gBAAA,KAAqB,OAAA,CAAQ,cAAA,CAAe,iBAAA;AAAA;;;KChBrD,YAAA;AAAA,UAEK,SAAA;EACf,IAAA;EACA,IAAA;EACA,KAAA;AAAA;AAAA,UAGe,oBAAA;EACf,EAAA;EACA,IAAA;EACA,IAAA,EAAM,SAAA;EACN,GAAA,EAAK,SAAA;EACL,KAAA,EAAO,SAAA;AAAA;AAAA,UAGQ,cAAA;EACf,EAAA;EACA,IAAA;EACA,MAAA,EAAQ,YAAY;EACpB,SAAA;AAAA;AAAA,UAGe,MAAA;EACf,EAAA;EACA,IAAA;EACA,aAAA;EACA,YAAA;EACA,MAAA,EAAQ,YAAY;EACpB,SAAA;EACA,UAAA;AAAA;AAAA,cAGW,OAAA;EAAA,iBACkB,MAAA;cAAA,MAAA,EAAQ,MAAA;EAErC,MAAA,CAAO,IAAA,WAAe,OAAA,CAAQ,cAAA,CAAe,oBAAA;EAI7C,IAAA,CAAA,GAAQ,OAAA,CAAQ,cAAA,CAAe,cAAA;EAI/B,GAAA,CAAI,EAAA,WAAa,OAAA,CAAQ,cAAA,CAAe,MAAA;EAIxC,MAAA,CAAO,EAAA,WAAa,OAAA,CAAQ,cAAA;IAAiB,OAAA;EAAA;EAI7C,MAAA,CAAO,EAAA,WAAa,OAAA,CAAQ,cAAA;IAAiB,OAAA;EAAA;AAAA;;;UCpD9B,mBAAA;EACf,IAAA;EACA,QAAQ;AAAA;AAAA,UAGO,oBAAA;EACf,EAAA;EACA,IAAA;EACA,GAAA;EACA,MAAA;EACA,QAAA;EACA,SAAA;AAAA;AAAA,UAGe,MAAA;EACf,EAAA;EACA,IAAA;EACA,MAAA;EACA,QAAA;EACA,SAAA;EACA,UAAA;AAAA;AAAA,cAYW,OAAA;EAAA,iBACkB,MAAA;cAAA,MAAA,EAAQ,MAAA;EAE/B,MAAA,CAAO,OAAA,EAAS,mBAAA,GAAsB,OAAA,CAAQ,cAAA,CAAe,oBAAA;EAoBnE,IAAA,CAAA,GAAQ,OAAA,CAAQ,cAAA,CAAe,MAAA;EAI/B,MAAA,CAAO,EAAA,WAAa,OAAA,CAAQ,cAAA;IAAiB,OAAA;EAAA;AAAA;;;KC3DnC,aAAA;AAAA,UAEK,QAAA;EACf,EAAA;EACA,IAAA;EACA,cAAA;EACA,SAAA;EACA,SAAA;AAAA;AAAA,UAGe,gBAAA;EACf,EAAA;EACA,IAAA;EACA,SAAA;EACA,YAAA;AAAA;AAAA,UAGe,OAAA;EACf,EAAA;EACA,UAAA;EACA,KAAA;EACA,SAAA;EACA,QAAA;EACA,MAAA,EAAQ,aAAa;EACrB,cAAA;EACA,SAAA;EACA,SAAA;AAAA;AAAA,UAGe,oBAAA;EACf,KAAA;EACA,SAAA;EACA,QAAA;AAAA;AAAA,UAGe,oBAAA;EACf,SAAA;EACA,QAAA;EACA,YAAA;AAAA;AAAA,UAGe,mBAAA;EACf,KAAA;EACA,MAAA;EACA,MAAA;EACA,UAAA;AAAA;AAAA,UAGe,oBAAA;EACf,IAAA,EAAM,OAAO;EACb,UAAA;AAAA;AAAA,UAGe,0BAAA;EACf,QAAA,EAAU,oBAAoB;AAAA;AAAA,cAGnB,SAAA;EAAA,iBACkB,MAAA;cAAA,MAAA,EAAQ,MAAA;EAErC,MAAA,CAAO,IAAA,WAAe,OAAA,CAAQ,cAAA,CAAe,QAAA;EAIvC,IAAA,CAAA,GAAQ,OAAA,CAAQ,cAAA,CAAe,gBAAA;EAMrC,MAAA,CAAO,EAAA,WAAa,OAAA,CAAQ,cAAA,CAAe,MAAA;EAI3C,aAAA,CACE,UAAA,UACA,OAAA,EAAS,oBAAA,GACR,OAAA,CAAQ,cAAA,CAAe,OAAA;EAQpB,YAAA,CACJ,UAAA,UACA,OAAA,GAAS,mBAAA,GACR,OAAA,CAAQ,cAAA,CAAe,oBAAA;EAY1B,UAAA,CAAW,UAAA,UAAoB,SAAA,WAAoB,OAAA,CAAQ,cAAA,CAAe,OAAA;EAI1E,aAAA,CACE,UAAA,UACA,SAAA,UACA,OAAA,EAAS,oBAAA,GACR,OAAA,CAAQ,cAAA,CAAe,OAAA;EAQ1B,aAAA,CACE,UAAA,UACA,SAAA,WACC,OAAA,CAAQ,cAAA,CAAe,MAAA;EAM1B,mBAAA,CACE,UAAA,UACA,OAAA,EAAS,0BAAA,GACR,OAAA,CAAQ,cAAA;IAAiB,KAAA;EAAA;AAAA;;;UC/HpB,mBAAA;EPJiB;AAAA;AAoB3B;;;EOVE,KAAA,GAAQ,iBAAiB;AAAA;AAAA,UAGV,qBAAA,SAA8B,mBAAmB;EAChE,IAAA;EACA,OAAA;EACA,IAAA;AAAA;AAAA,UAGe,qBAAA,SAA8B,mBAAmB;EAChE,IAAA;EACA,OAAA;EACA,IAAA;AAAA;AAAA,UAGe,QAAA;EACf,EAAA;EACA,IAAA;EACA,OAAA;EACA,IAAA;EACA,WAAA;EACA,SAAA;EACA,SAAA;AAAA;AAAA,UAGe,gBAAA;EACf,EAAA;EACA,IAAA;EACA,OAAA;EACA,SAAA;EACA,SAAA;AAAA;AAAA,cAWW,SAAA;EAAA,iBACkB,MAAA;cAAA,MAAA,EAAQ,MAAA;EAE/B,MAAA,CAAO,OAAA,EAAS,qBAAA,GAAwB,OAAA,CAAQ,cAAA,CAAe,QAAA;EAoB/D,IAAA,CAAA,GAAQ,OAAA,CAAQ,cAAA,CAAe,gBAAA;EAMrC,GAAA,CAAI,EAAA,WAAa,OAAA,CAAQ,cAAA,CAAe,QAAA;EAIlC,MAAA,CAAO,EAAA,UAAY,OAAA,EAAS,qBAAA,GAAwB,OAAA,CAAQ,cAAA,CAAe,QAAA;EASjF,MAAA,CAAO,EAAA,WAAa,OAAA,CAAQ,cAAA,CAAe,MAAA;AAAA;;;KC1FjC,YAAA;AAAA,UASK,oBAAA;EACf,GAAA;EACA,MAAA,EAAQ,YAAY;AAAA;AAAA,UAGL,oBAAA;EACf,GAAA;EACA,MAAA,GAAS,YAAY;AAAA;AAAA,UAGN,eAAA;EACf,EAAA;EACA,SAAA;EACA,OAAA;EACA,SAAA;EACA,OAAA,EAAS,MAAM;EACf,MAAA;EACA,cAAA;EACA,QAAA;EACA,SAAA;EACA,aAAA;AAAA;AAAA,UAGe,OAAA;EACf,EAAA;EACA,GAAA;EACA,MAAA,EAAQ,YAAY;EACpB,SAAA;AAAA;AAAA,UAGe,qBAAA,SAA8B,OAAO;EACpD,UAAA,EAAY,eAAA;AAAA;AAAA,UAGG,qBAAA,SAA8B,OAAO;EACpD,MAAM;AAAA;AAAA,cAGK,QAAA;EAAA,iBACkB,MAAA;cAAA,MAAA,EAAQ,MAAA;EAErC,MAAA,CAAO,OAAA,EAAS,oBAAA,GAAuB,OAAA,CAAQ,cAAA,CAAe,qBAAA;EAOxD,IAAA,CAAA,GAAQ,OAAA,CAAQ,cAAA,CAAe,OAAA;EAMrC,GAAA,CAAI,EAAA,WAAa,OAAA,CAAQ,cAAA,CAAe,qBAAA;EAIxC,MAAA,CAAO,EAAA,UAAY,OAAA,EAAS,oBAAA,GAAuB,OAAA,CAAQ,cAAA,CAAe,OAAA;EAO1E,MAAA,CAAO,EAAA,WAAa,OAAA,CAAQ,cAAA,CAAe,MAAA;AAAA;;;KCzEjC,eAAA;AAAA,UAQK,sBAAA;EACf,IAAA;EACA,UAAA;ETM0B;;;;ESD1B,IAAA;EACA,OAAA;EACA,IAAA;ETEqB;AAAA;AAGvB;;;ESCE,KAAA,GAAQ,iBAAA;EACR,UAAA;EACA,iBAAA,GAAoB,MAAM;AAAA;AAAA,UAGX,sBAAA;EACf,IAAA;EACA,UAAA;EACA,IAAA;EACA,OAAA;EACA,IAAA;ETV0B;;;ESc1B,KAAA,GAAQ,iBAAA;EACR,UAAA;EACA,iBAAA,GAAoB,MAAM;EAC1B,WAAA;AAAA;AAAA,UAGe,oBAAA;EACf,WAAW;AAAA;AAAA,UAGI,SAAA;EACf,EAAA;EACA,IAAA;EACA,MAAA,EAAQ,eAAA;EACR,UAAA;EACA,WAAA;EACA,OAAA;EACA,IAAA;EACA,UAAA;EACA,iBAAA,EAAmB,MAAM;EACzB,WAAA;EACA,SAAA;EACA,SAAA;AAAA;AAAA,UAGe,iBAAA;EACf,EAAA;EACA,IAAA;EACA,MAAA,EAAQ,eAAe;EACvB,UAAA;EACA,WAAA;EACA,OAAA;EACA,cAAA;EACA,SAAA;EACA,WAAA;EACA,SAAA;EACA,WAAA;EACA,SAAA;EACA,YAAA;AAAA;AAAA,UAGe,eAAA,SAAwB,SAAS;EAChD,cAAA;EACA,SAAA;EACA,SAAA;EACA,WAAA;EACA,KAAA,EAAO,MAAA;AAAA;AAAA,UAGQ,qBAAA;EACf,EAAA;EACA,MAAA;EACA,WAAA;AAAA;AAAA,cAWW,UAAA;EAAA,iBACkB,MAAA;cAAA,MAAA,EAAQ,MAAA;EAE/B,MAAA,CAAO,OAAA,EAAS,sBAAA,GAAyB,OAAA,CAAQ,cAAA,CAAe,SAAA;EAahE,IAAA,CAAA,GAAQ,OAAA,CAAQ,cAAA,CAAe,iBAAA;EAMrC,GAAA,CAAI,EAAA,WAAa,OAAA,CAAQ,cAAA,CAAe,eAAA;EAIlC,MAAA,CAAO,EAAA,UAAY,OAAA,EAAS,sBAAA,GAAyB,OAAA,CAAQ,cAAA,CAAe,SAAA;EAclF,IAAA,CAAK,EAAA,UAAY,OAAA,GAAS,oBAAA,GAA4B,OAAA,CAAQ,cAAA,CAAe,qBAAA;EAM7E,MAAA,CAAO,EAAA,WAAa,OAAA,CAAQ,cAAA,CAAe,SAAA;EAI3C,MAAA,CAAO,EAAA,WAAa,OAAA,CAAQ,cAAA,CAAe,MAAA;AAAA;;;UC7I5B,aAAA;EACf,OAAO;AAAA;AAAA,cAGI,MAAA;EAAA,SACF,OAAA;EAAA,iBACQ,MAAA;EAAA,SAER,MAAA,EAAQ,MAAA;EVKP;EAAA,SUHD,KAAA,EAAO,KAAA;EAAA,SACP,OAAA,EAAS,OAAA;EAAA,SACT,OAAA,EAAS,OAAA;EAAA,SACT,SAAA,EAAW,SAAA;EAAA,SACX,SAAA,EAAW,SAAA;EAAA,SACX,QAAA,EAAU,QAAA;EAAA,SACV,UAAA,EAAY,UAAA;cAET,GAAA,WAAc,OAAA,GAAU,aAAA;EAqB9B,YAAA,GAAA,CACJ,IAAA,UACA,IAAA,GAAM,WAAA,EACN,YAAA,GAAc,MAAA,mBACb,OAAA,CAAQ,cAAA,CAAe,CAAA;EA8C1B,GAAA,GAAA,CAAO,IAAA,UAAc,YAAA,GAAe,MAAA,mBAAyB,OAAA,CAAQ,cAAA,CAAe,CAAA;EAIpF,IAAA,GAAA,CACE,IAAA,UACA,IAAA,YACA,YAAA,GAAe,MAAA,mBACd,OAAA,CAAQ,cAAA,CAAe,CAAA;EAQ1B,KAAA,GAAA,CAAS,IAAA,UAAc,IAAA,aAAiB,OAAA,CAAQ,cAAA,CAAe,CAAA;EAO/D,MAAA,GAAA,CAAU,IAAA,WAAe,OAAA,CAAQ,cAAA,CAAe,CAAA;AAAA"}
|
package/dist/index.mjs
CHANGED
|
@@ -66,10 +66,6 @@ var Emails = class {
|
|
|
66
66
|
const payload = await toApiPayload(options);
|
|
67
67
|
return this.client.post("/emails", payload, extraHeaders);
|
|
68
68
|
}
|
|
69
|
-
async batch(emails) {
|
|
70
|
-
const payloads = await Promise.all(emails.map(toApiPayload));
|
|
71
|
-
return this.client.post("/emails/batch", payloads);
|
|
72
|
-
}
|
|
73
69
|
async list(options = {}) {
|
|
74
70
|
const params = new URLSearchParams();
|
|
75
71
|
if (options.limit != null) params.set("limit", String(options.limit));
|
|
@@ -112,6 +108,29 @@ var Emails = class {
|
|
|
112
108
|
}
|
|
113
109
|
};
|
|
114
110
|
//#endregion
|
|
111
|
+
//#region src/batch.ts
|
|
112
|
+
/**
|
|
113
|
+
* Batch sending — `eusend.batch.send([...])`. The method path mirrors Resend's
|
|
114
|
+
* `resend.batch.send([...])`, so migrating is a mechanical `resend` → `eusend` rename.
|
|
115
|
+
* The HTTP body is a top-level array of email objects (POST /emails/batch), up to 100
|
|
116
|
+
* per request. As with Resend, attachments and `scheduledAt` are not supported on the
|
|
117
|
+
* batch endpoint — send those individually via `emails.send`.
|
|
118
|
+
*
|
|
119
|
+
* The response maps positionally to the input: `data[i]` is `{ id }` when
|
|
120
|
+
* `emails[i]` was queued, or `{ error, code }` when it was not (unverified
|
|
121
|
+
* domain, suppressed recipients, exhausted quota, …) — failed items never fail
|
|
122
|
+
* the whole batch, so branch on the presence of `id` per item.
|
|
123
|
+
*/
|
|
124
|
+
var Batch = class {
|
|
125
|
+
constructor(client) {
|
|
126
|
+
this.client = client;
|
|
127
|
+
}
|
|
128
|
+
async send(emails) {
|
|
129
|
+
const payloads = await Promise.all(emails.map(toApiPayload));
|
|
130
|
+
return this.client.post("/emails/batch", payloads);
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
//#endregion
|
|
115
134
|
//#region src/domains.ts
|
|
116
135
|
var Domains = class {
|
|
117
136
|
constructor(client) {
|
|
@@ -368,7 +387,7 @@ var Broadcasts = class {
|
|
|
368
387
|
//#endregion
|
|
369
388
|
//#region src/eusend.ts
|
|
370
389
|
const DEFAULT_BASE_URL = "https://api.eusend.dev";
|
|
371
|
-
const SDK_VERSION = "0.
|
|
390
|
+
const SDK_VERSION = "0.5.1";
|
|
372
391
|
var Eusend = class {
|
|
373
392
|
constructor(key, options) {
|
|
374
393
|
const apiKey = key ?? (typeof process !== "undefined" ? process.env["EUSEND_API_KEY"] : void 0);
|
|
@@ -376,6 +395,7 @@ var Eusend = class {
|
|
|
376
395
|
this.apiKey = apiKey;
|
|
377
396
|
this.baseUrl = options?.baseUrl ?? DEFAULT_BASE_URL;
|
|
378
397
|
this.emails = new Emails(this);
|
|
398
|
+
this.batch = new Batch(this);
|
|
379
399
|
this.domains = new Domains(this);
|
|
380
400
|
this.apiKeys = new ApiKeys(this);
|
|
381
401
|
this.audiences = new Audiences(this);
|
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 | '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. Provide either\n * `content` or `path`, not both.\n */\n content?: string | Uint8Array;\n /**\n * A URL the server fetches at send time to attach the file. Use instead of\n * `content` when the bytes live on a public URL. Provide either `content` or `path`,\n * not both.\n */\n path?: string;\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: a.content === undefined ? undefined : encodeAttachmentContent(a.content),\n path: a.path,\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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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/react-render.ts","../src/emails.ts","../src/batch.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 { EusendErrorCode, 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. Provide either\n * `content` or `path`, not both.\n */\n content?: string | Uint8Array;\n /**\n * A URL the server fetches at send time to attach the file. Use instead of\n * `content` when the bytes live on a public URL. Provide either `content` or `path`,\n * not both.\n */\n path?: string;\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, at most 30 days out. Accepts a `Date`, an\n * ISO 8601 string, or a natural-language time like `\"in 1 hour\"` or `\"tomorrow at\n * 9am\"` (parsed server-side, same as Resend). Relative phrasings resolve against the\n * server clock in UTC — pass an offset-qualified ISO string when you need an exact\n * instant. 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\n/**\n * Per-item outcome of a batch send, positionally mapped to the input array:\n * `data[i]` describes `emails[i]`. Items that were queued carry `{ id }`; items\n * that could not be queued carry `{ error, code }` (e.g. an unverified sender\n * domain, all recipients suppressed, or an exhausted send quota). Branch on the\n * presence of `id`.\n */\nexport type BatchItemResult =\n | { id: string; error?: never; code?: never }\n | { id?: never; error: string; code: EusendErrorCode };\n\nexport interface BatchSendResponse {\n data: BatchItemResult[];\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, at most 30 days out — a `Date`, an ISO 8601 string, or natural\n * language like `\"in 1 hour\"` (parsed server-side, same as `emails.send`). */\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\nexport async 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: a.content === undefined ? undefined : encodeAttachmentContent(a.content),\n path: a.path,\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 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';\nimport { toApiPayload, type SendEmailOptions, type BatchSendResponse } from './emails';\n\n/**\n * Batch sending — `eusend.batch.send([...])`. The method path mirrors Resend's\n * `resend.batch.send([...])`, so migrating is a mechanical `resend` → `eusend` rename.\n * The HTTP body is a top-level array of email objects (POST /emails/batch), up to 100\n * per request. As with Resend, attachments and `scheduledAt` are not supported on the\n * batch endpoint — send those individually via `emails.send`.\n *\n * The response maps positionally to the input: `data[i]` is `{ id }` when\n * `emails[i]` was queued, or `{ error, code }` when it was not (unverified\n * domain, suppressed recipients, exhausted quota, …) — failed items never fail\n * the whole batch, so branch on the presence of `id` per item.\n */\nexport class Batch {\n constructor(private readonly client: Eusend) {}\n\n async send(emails: SendEmailOptions[]): Promise<EusendResponse<BatchSendResponse>> {\n const payloads = await Promise.all(emails.map(toApiPayload));\n return this.client.post<BatchSendResponse>('/emails/batch', payloads);\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 { Batch } from './batch'\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.5.1'\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 /** Batch sending — `client.batch.send([...])`. Mirrors Resend's `resend.batch.send()`. */\n readonly batch: Batch\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.batch = new Batch(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":";AASA,IAAI,gBAAiF;AAErF,eAAe,YAAsE;CACnF,IAAI,CAAC,eACH,iBAAiB,YAAY;EAC3B,IAAI;GACF,MAAM,MAAO,MAAM,OAAO;GAG1B,QAAQ,YAA+B,QAAQ,QAAQ,IAAI,OAAO,OAAO,CAAC;EAC5E,QAAQ;GACN,MAAM,IAAI,MACR,yHAEF;EACF;CACF,GAAG;CAEL,OAAO;AACT;AAEA,eAAsB,iBAAiB,SAA6C;CAElF,QAAO,MADc,UAAU,GACjB,OAAO;AACvB;;;AC6IA,eAAe,YAAY,SAAwD;CACjF,IAAI,QAAQ,MAAM,OAAO,QAAQ;CACjC,IAAI,QAAQ,OAAO,OAAO,iBAAiB,QAAQ,KAAK;AAE1D;AAEA,SAAS,wBAAwB,SAAsC;CAErE,IAAI,OAAO,YAAY,UAAU,OAAO;CACxC,IAAI,OAAO,WAAW,aAAa,OAAO,OAAO,KAAK,OAAO,EAAE,SAAS,QAAQ;CAChF,IAAI,SAAS;CACb,KAAK,MAAM,QAAQ,SAAS,UAAU,OAAO,aAAa,IAAI;CAC9D,OAAO,KAAK,MAAM;AACpB;AAEA,SAAS,YAAY,OAA8B;CACjD,OAAO,iBAAiB,OAAO,MAAM,YAAY,IAAI;AACvD;AAEA,eAAsB,aAAa,SAA2B;CAC5D,MAAM,OAAO,MAAM,YAAY,OAAO;CACtC,OAAO;EACL,MAAM,QAAQ;EACd,IAAI,QAAQ;EACZ,IAAI,QAAQ;EACZ,KAAK,QAAQ;EACb,UAAU,QAAQ;EAClB,SAAS,QAAQ;EACjB;EACA,MAAM,QAAQ;EACd,aAAa,QAAQ;EACrB,WAAW,QAAQ;EACnB,SAAS,QAAQ;EACjB,aAAa,QAAQ;EACrB,cAAc,QAAQ;EACtB,aAAa,QAAQ,aAAa,KAAK,OAAO;GAC5C,UAAU,EAAE;GACZ,SAAS,EAAE,YAAY,KAAA,IAAY,KAAA,IAAY,wBAAwB,EAAE,OAAO;GAChF,MAAM,EAAE;GACR,cAAc,EAAE;GAChB,YAAY,EAAE;EAChB,EAAE;EACF,cAAc,QAAQ,cAAc,YAAY,QAAQ,WAAW,IAAI,KAAA;CACzE;AACF;AAEA,IAAa,SAAb,MAAoB;CAClB,YAAY,QAAiC;EAAhB,KAAA,SAAA;CAAiB;CAE9C,MAAM,KACJ,SACA,gBAC4C;EAC5C,MAAM,eAAuC,CAAC;EAC9C,IAAI,gBAAgB,gBAClB,aAAa,qBAAqB,eAAe;EAEnD,MAAM,UAAU,MAAM,aAAa,OAAO;EAC1C,OAAO,KAAK,OAAO,KAAwB,WAAW,SAAS,YAAY;CAC7E;CAEA,MAAM,KAAK,UAA6B,CAAC,GAAgD;EACvF,MAAM,SAAS,IAAI,gBAAgB;EACnC,IAAI,QAAQ,SAAS,MAAM,OAAO,IAAI,SAAS,OAAO,QAAQ,KAAK,CAAC;EACpE,IAAI,QAAQ,QAAQ,OAAO,IAAI,UAAU,QAAQ,MAAM;EACvD,IAAI,QAAQ,QAAQ,OAAO,IAAI,UAAU,QAAQ,MAAM;EACvD,IAAI,QAAQ,MAAM,OAAO,IAAI,QAAQ,QAAQ,IAAI;EACjD,IAAI,QAAQ,IAAI,OAAO,IAAI,MAAM,QAAQ,EAAE;EAC3C,MAAM,KAAK,OAAO,SAAS;EAE3B,MAAM,MAAM,MAAM,KAAK,OAAO,IAC5B,KAAK,WAAW,OAAO,SACzB;EACA,IAAI,IAAI,OAAO,OAAO;EACtB,OAAO;GACL,MAAM;IAAE,MAAM,IAAI,KAAK;IAAM,YAAY,IAAI,KAAK;GAAY;GAC9D,OAAO;GACP,SAAS,IAAI;EACf;CACF;CAEA,IAAI,IAA4C;EAC9C,OAAO,KAAK,OAAO,IAAW,WAAW,IAAI;CAC/C;;CAGA,MAAM,OACJ,IACA,SAC8C;EAC9C,MAAM,MAAM,MAAM,KAAK,OAAO,MAC5B,WAAW,MACX,EAAE,cAAc,YAAY,QAAQ,WAAW,EAAE,CACnD;EACA,IAAI,IAAI,OAAO,OAAO;EACtB,OAAO;GACL,MAAM;IAAE,IAAI,IAAI,KAAK;IAAI,QAAQ,IAAI,KAAK;IAAQ,aAAa,IAAI,KAAK;GAAa;GACrF,OAAO;GACP,SAAS,IAAI;EACf;CACF;;CAGA,OAAO,IAA0D;EAC/D,OAAO,KAAK,OAAO,KAA0B,WAAW,GAAG,UAAU,KAAA,CAAS;CAChF;AACF;;;;;;;;;;;;;;;ACxQA,IAAa,QAAb,MAAmB;CACjB,YAAY,QAAiC;EAAhB,KAAA,SAAA;CAAiB;CAE9C,MAAM,KAAK,QAAwE;EACjF,MAAM,WAAW,MAAM,QAAQ,IAAI,OAAO,IAAI,YAAY,CAAC;EAC3D,OAAO,KAAK,OAAO,KAAwB,iBAAiB,QAAQ;CACtE;AACF;;;ACaA,IAAa,UAAb,MAAqB;CACnB,YAAY,QAAiC;EAAhB,KAAA,SAAA;CAAiB;CAE9C,OAAO,MAA6D;EAClE,OAAO,KAAK,OAAO,KAA2B,YAAY,EAAE,KAAK,CAAC;CACpE;CAEA,OAAkD;EAChD,OAAO,KAAK,OAAO,IAAsB,UAAU;CACrD;CAEA,IAAI,IAA6C;EAC/C,OAAO,KAAK,OAAO,IAAY,YAAY,IAAI;CACjD;CAEA,OAAO,IAA0D;EAC/D,OAAO,KAAK,OAAO,OAA4B,YAAY,IAAI;CACjE;CAEA,OAAO,IAA0D;EAC/D,OAAO,KAAK,OAAO,KAA0B,YAAY,GAAG,QAAQ;CACtE;AACF;;;ACvBA,IAAa,UAAb,MAAqB;CACnB,YAAY,QAAiC;EAAhB,KAAA,SAAA;CAAiB;CAE9C,MAAM,OAAO,SAA6E;EACxF,MAAM,MAAM,MAAM,KAAK,OAAO,KAA8B,aAAa;GACvE,MAAM,QAAQ;GACd,WAAW,QAAQ,YAAY;EACjC,CAAC;EACD,IAAI,IAAI,OAAO,OAAO;EACtB,OAAO;GACL,MAAM;IACJ,IAAI,IAAI,KAAK;IACb,MAAM,IAAI,KAAK;IACf,KAAK,IAAI,KAAK;IACd,QAAQ,IAAI,KAAK;IACjB,UAAU,IAAI,KAAK;IACnB,WAAW,IAAI,KAAK;GACtB;GACA,OAAO;GACP,SAAS,IAAI;EACf;CACF;CAEA,OAA0C;EACxC,OAAO,KAAK,OAAO,IAAc,WAAW;CAC9C;CAEA,OAAO,IAA0D;EAC/D,OAAO,KAAK,OAAO,OAA4B,aAAa,IAAI;CAClE;AACF;;;ACLA,IAAa,YAAb,MAAuB;CACrB,YAAY,QAAiC;EAAhB,KAAA,SAAA;CAAiB;CAE9C,OAAO,MAAiD;EACtD,OAAO,KAAK,OAAO,KAAe,cAAc,EAAE,KAAK,CAAC;CAC1D;CAEA,MAAM,OAAoD;EACxD,MAAM,MAAM,MAAM,KAAK,OAAO,IAAkC,YAAY;EAC5E,IAAI,IAAI,OAAO,OAAO;EACtB,OAAO;GAAE,MAAM,IAAI,KAAK;GAAM,OAAO;GAAM,SAAS,IAAI;EAAQ;CAClE;CAEA,OAAO,IAA4D;EACjE,OAAO,KAAK,OAAO,OAA8B,cAAc,IAAI;CACrE;CAEA,cACE,YACA,SACkC;EAClC,OAAO,KAAK,OAAO,KAAc,cAAc,WAAW,YAAY;GACpE,OAAO,QAAQ;GACf,YAAY,QAAQ;GACpB,WAAW,QAAQ;EACrB,CAAC;CACH;CAEA,MAAM,aACJ,YACA,UAA+B,CAAC,GACe;EAC/C,MAAM,SAAS,IAAI,gBAAgB;EACnC,IAAI,QAAQ,SAAS,MAAM,OAAO,IAAI,SAAS,OAAO,QAAQ,KAAK,CAAC;EACpE,IAAI,QAAQ,QAAQ,OAAO,IAAI,UAAU,QAAQ,MAAM;EACvD,IAAI,QAAQ,QAAQ,OAAO,IAAI,UAAU,QAAQ,MAAM;EACvD,IAAI,QAAQ,cAAc,MAAM,OAAO,IAAI,cAAc,OAAO,QAAQ,UAAU,CAAC;EACnF,MAAM,KAAK,OAAO,SAAS;EAC3B,OAAO,KAAK,OAAO,IACjB,KAAK,cAAc,WAAW,YAAY,OAAO,cAAc,WAAW,UAC5E;CACF;CAEA,WAAW,YAAoB,WAAqD;EAClF,OAAO,KAAK,OAAO,IAAa,cAAc,WAAW,YAAY,WAAW;CAClF;CAEA,cACE,YACA,WACA,SACkC;EAClC,OAAO,KAAK,OAAO,MAAe,cAAc,WAAW,YAAY,aAAa;GAClF,YAAY,QAAQ;GACpB,WAAW,QAAQ;GACnB,cAAc,QAAQ;EACxB,CAAC;CACH;CAEA,cACE,YACA,WACgD;EAChD,OAAO,KAAK,OAAO,OACjB,cAAc,WAAW,YAAY,WACvC;CACF;CAEA,oBACE,YACA,SAC4C;EAC5C,OAAO,KAAK,OAAO,KAAwB,cAAc,WAAW,kBAAkB,EACpF,UAAU,QAAQ,SAAS,KAAK,OAAO;GACrC,OAAO,EAAE;GACT,YAAY,EAAE;GACd,WAAW,EAAE;EACf,EAAE,EACJ,CAAC;CACH;AACF;;;ACjGA,eAAe,oBACb,SAC6B;CAC7B,IAAI,QAAQ,MAAM,OAAO,QAAQ;CACjC,IAAI,QAAQ,OAAO,OAAO,iBAAiB,QAAQ,KAAK;AAE1D;AAEA,IAAa,YAAb,MAAuB;CACrB,YAAY,QAAiC;EAAhB,KAAA,SAAA;CAAiB;CAE9C,MAAM,OAAO,SAAmE;EAC9E,MAAM,OAAO,MAAM,oBAAoB,OAAO;EAC9C,IAAI,CAAC,MACH,OAAO;GACL,MAAM;GACN,OAAO;IACL,SAAS;IACT,YAAY;IACZ,MAAM;GACR;GACA,SAAS;EACX;EAEF,OAAO,KAAK,OAAO,KAAe,cAAc;GAC9C,MAAM,QAAQ;GACd,SAAS,QAAQ;GACjB;EACF,CAAC;CACH;CAEA,MAAM,OAAoD;EACxD,MAAM,MAAM,MAAM,KAAK,OAAO,IAAkC,YAAY;EAC5E,IAAI,IAAI,OAAO,OAAO;EACtB,OAAO;GAAE,MAAM,IAAI,KAAK;GAAM,OAAO;GAAM,SAAS,IAAI;EAAQ;CAClE;CAEA,IAAI,IAA+C;EACjD,OAAO,KAAK,OAAO,IAAc,cAAc,IAAI;CACrD;CAEA,MAAM,OAAO,IAAY,SAAmE;EAC1F,MAAM,OAAO,MAAM,oBAAoB,OAAO;EAC9C,OAAO,KAAK,OAAO,MAAgB,cAAc,MAAM;GACrD,MAAM,QAAQ;GACd,SAAS,QAAQ;GACjB;EACF,CAAC;CACH;CAEA,OAAO,IAA4D;EACjE,OAAO,KAAK,OAAO,OAA8B,cAAc,IAAI;CACrE;AACF;;;AC9CA,IAAa,WAAb,MAAsB;CACpB,YAAY,QAAiC;EAAhB,KAAA,SAAA;CAAiB;CAE9C,OAAO,SAA+E;EACpF,OAAO,KAAK,OAAO,KAA4B,aAAa;GAC1D,KAAK,QAAQ;GACb,QAAQ,QAAQ;EAClB,CAAC;CACH;CAEA,MAAM,OAA2C;EAC/C,MAAM,MAAM,MAAM,KAAK,OAAO,IAAyB,WAAW;EAClE,IAAI,IAAI,OAAO,OAAO;EACtB,OAAO;GAAE,MAAM,IAAI,KAAK;GAAM,OAAO;GAAM,SAAS,IAAI;EAAQ;CAClE;CAEA,IAAI,IAA4D;EAC9D,OAAO,KAAK,OAAO,IAA2B,aAAa,IAAI;CACjE;CAEA,OAAO,IAAY,SAAiE;EAClF,OAAO,KAAK,OAAO,MAAe,aAAa,MAAM;GACnD,KAAK,QAAQ;GACb,QAAQ,QAAQ;EAClB,CAAC;CACH;CAEA,OAAO,IAA4D;EACjE,OAAO,KAAK,OAAO,OAA8B,aAAa,IAAI;CACpE;AACF;;;ACgBA,eAAe,qBACb,SAC6B;CAC7B,IAAI,QAAQ,MAAM,OAAO,QAAQ;CACjC,IAAI,QAAQ,OAAO,OAAO,iBAAiB,QAAQ,KAAK;AAE1D;AAEA,IAAa,aAAb,MAAwB;CACtB,YAAY,QAAiC;EAAhB,KAAA,SAAA;CAAiB;CAE9C,MAAM,OAAO,SAAqE;EAChF,MAAM,OAAO,MAAM,qBAAqB,OAAO;EAC/C,OAAO,KAAK,OAAO,KAAgB,eAAe;GAChD,MAAM,QAAQ;GACd,aAAa,QAAQ;GACrB,MAAM,QAAQ;GACd,SAAS,QAAQ;GACjB;GACA,aAAa,QAAQ;GACrB,oBAAoB,QAAQ;EAC9B,CAAC;CACH;CAEA,MAAM,OAAqD;EACzD,MAAM,MAAM,MAAM,KAAK,OAAO,IAAmC,aAAa;EAC9E,IAAI,IAAI,OAAO,OAAO;EACtB,OAAO;GAAE,MAAM,IAAI,KAAK;GAAM,OAAO;GAAM,SAAS,IAAI;EAAQ;CAClE;CAEA,IAAI,IAAsD;EACxD,OAAO,KAAK,OAAO,IAAqB,eAAe,IAAI;CAC7D;CAEA,MAAM,OAAO,IAAY,SAAqE;EAC5F,MAAM,OAAO,MAAM,qBAAqB,OAAO;EAC/C,OAAO,KAAK,OAAO,MAAiB,eAAe,MAAM;GACvD,MAAM,QAAQ;GACd,aAAa,QAAQ;GACrB,MAAM,QAAQ;GACd,SAAS,QAAQ;GACjB;GACA,aAAa,QAAQ;GACrB,oBAAoB,QAAQ;GAC5B,cAAc,QAAQ;EACxB,CAAC;CACH;CAEA,KAAK,IAAY,UAAgC,CAAC,GAAmD;EACnG,OAAO,KAAK,OAAO,KAA4B,eAAe,GAAG,QAAQ,EACvE,cAAc,QAAQ,YACxB,CAAC;CACH;CAEA,OAAO,IAAgD;EACrD,OAAO,KAAK,OAAO,KAAgB,eAAe,GAAG,QAAQ;CAC/D;CAEA,OAAO,IAA4D;EACjE,OAAO,KAAK,OAAO,OAA8B,eAAe,IAAI;CACtE;AACF;;;ACnJA,MAAM,mBAAmB;AACzB,MAAM,cAAc;AAMpB,IAAa,SAAb,MAAoB;CAclB,YAAY,KAAc,SAAyB;EACjD,MAAM,SACJ,QAAQ,OAAO,YAAY,cAAc,QAAQ,IAAI,oBAAoB,KAAA;EAC3E,IAAI,CAAC,QACH,MAAM,IAAI,MACR,oGACF;EAEF,KAAK,SAAS;EACd,KAAK,UAAU,SAAS,WAAW;EAEnC,KAAK,SAAS,IAAI,OAAO,IAAI;EAC7B,KAAK,QAAQ,IAAI,MAAM,IAAI;EAC3B,KAAK,UAAU,IAAI,QAAQ,IAAI;EAC/B,KAAK,UAAU,IAAI,QAAQ,IAAI;EAC/B,KAAK,YAAY,IAAI,UAAU,IAAI;EACnC,KAAK,YAAY,IAAI,UAAU,IAAI;EACnC,KAAK,WAAW,IAAI,SAAS,IAAI;EACjC,KAAK,aAAa,IAAI,WAAW,IAAI;CACvC;CAEA,MAAM,aACJ,MACA,OAAoB,CAAC,GACrB,eAAuC,CAAC,GACZ;EAC5B,MAAM,UAAkC;GACtC,eAAe,UAAU,KAAK;GAC9B,gBAAgB;GAChB,cAAc,eAAe;GAC7B,GAAG;EACL;EAEA,IAAI;GACF,MAAM,MAAM,MAAM,MAAM,GAAG,KAAK,UAAU,QAAQ;IAAE,GAAG;IAAM;GAAQ,CAAC;GACtE,MAAM,kBAAkB,OAAO,YAAY,IAAI,QAAQ,QAAQ,CAAC;GAEhE,IAAI,CAAC,IAAI,IAAI;IACX,IAAI;IACJ,IAAI;KACF,MAAM,OAAQ,MAAM,IAAI,KAAK;KAC7B,QAAQ;MACN,SAAS,KAAK,SAAS;MACvB,YAAY,IAAI;MAChB,MAAO,KAAK,QAAgC;KAC9C;IACF,QAAQ;KACN,QAAQ;MAAE,SAAS;MAAkB,YAAY,IAAI;MAAQ,MAAM;KAAiB;IACtF;IACA,OAAO;KAAE,MAAM;KAAM;KAAO,SAAS;IAAgB;GACvD;GAEA,IAAI,IAAI,WAAW,OAAO,IAAI,QAAQ,IAAI,gBAAgB,MAAM,KAC9D,OAAO;IAAE,MAAM,CAAC;IAAQ,OAAO;IAAM,SAAS;GAAgB;GAIhE,OAAO;IAAE,MAAA,MADW,IAAI,KAAK;IACd,OAAO;IAAM,SAAS;GAAgB;EACvD,QAAQ;GACN,OAAO;IACL,MAAM;IACN,OAAO;KACL,SAAS;KACT,YAAY;KACZ,MAAM;IACR;IACA,SAAS;GACX;EACF;CACF;CAEA,IAAO,MAAc,cAAmE;EACtF,OAAO,KAAK,aAAgB,MAAM,EAAE,QAAQ,MAAM,GAAG,YAAY;CACnE;CAEA,KACE,MACA,MACA,cAC4B;EAC5B,OAAO,KAAK,aACV,MACA;GAAE,QAAQ;GAAQ,MAAM,QAAQ,OAAO,KAAK,UAAU,IAAI,IAAI,KAAA;EAAU,GACxE,YACF;CACF;CAEA,MAAS,MAAc,MAA4C;EACjE,OAAO,KAAK,aAAgB,MAAM;GAChC,QAAQ;GACR,MAAM,QAAQ,OAAO,KAAK,UAAU,IAAI,IAAI,KAAA;EAC9C,CAAC;CACH;CAEA,OAAU,MAA0C;EAClD,OAAO,KAAK,aAAgB,MAAM,EAAE,QAAQ,SAAS,CAAC;CACxD;AACF"}
|