Skip to content

Commit cfad2ce

Browse files
vcapretzbukinoshita
authored andcommittedNov 18, 2024··
feat: Use dynamic import for @react-email/render (#438)
1 parent fa34907 commit cfad2ce

File tree

4 files changed

+48
-27
lines changed

4 files changed

+48
-27
lines changed
 

‎package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "resend",
3-
"version": "4.0.0",
3+
"version": "4.0.1-alpha.0",
44
"description": "Node.js library for the Resend API",
55
"main": "./dist/index.js",
66
"module": "./dist/index.mjs",
@@ -42,7 +42,7 @@
4242
},
4343
"homepage": "https://github.com/resendlabs/resend-node#readme",
4444
"dependencies": {
45-
"@react-email/render": "0.0.17"
45+
"@react-email/render": "1.0.1"
4646
},
4747
"devDependencies": {
4848
"@biomejs/biome": "1.9.4",

‎pnpm-lock.yaml

+17-17
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎src/batch/batch.ts

+14-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { renderAsync } from '@react-email/render';
21
import type * as React from 'react';
32
import type { Resend } from '../resend';
43
import type {
@@ -9,6 +8,7 @@ import type {
98
} from './interfaces/create-batch-options.interface';
109

1110
export class Batch {
11+
private renderAsync?: (component: React.ReactElement) => Promise<string>;
1212
constructor(private readonly resend: Resend) {}
1313

1414
async send(
@@ -24,9 +24,19 @@ export class Batch {
2424
): Promise<CreateBatchResponse> {
2525
for (const email of payload) {
2626
if (email.react) {
27-
email.html = await renderAsync(email.react as React.ReactElement);
28-
// biome-ignore lint/performance/noDelete: <explanation>
29-
delete email.react;
27+
if (!this.renderAsync) {
28+
try {
29+
const { renderAsync } = await import('@react-email/render');
30+
this.renderAsync = renderAsync;
31+
} catch (error) {
32+
throw new Error(
33+
'Failed to render React component. Make sure to install `@react-email/render`',
34+
);
35+
}
36+
}
37+
38+
email.html = await this.renderAsync(email.react as React.ReactElement);
39+
email.react = undefined;
3040
}
3141
}
3242

‎src/emails/emails.ts

+15-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { renderAsync } from '@react-email/render';
21
import type * as React from 'react';
32
import type { Resend } from '../resend';
43
import type {
@@ -22,6 +21,7 @@ import type {
2221
} from './interfaces/update-email-options.interface';
2322

2423
export class Emails {
24+
private renderAsync?: (component: React.ReactElement) => Promise<string>;
2525
constructor(private readonly resend: Resend) {}
2626

2727
async send(
@@ -36,9 +36,20 @@ export class Emails {
3636
options: CreateEmailRequestOptions = {},
3737
): Promise<CreateEmailResponse> {
3838
if (payload.react) {
39-
payload.html = await renderAsync(payload.react as React.ReactElement);
40-
// biome-ignore lint/performance/noDelete: <explanation>
41-
delete payload.react;
39+
if (!this.renderAsync) {
40+
try {
41+
const { renderAsync } = await import('@react-email/render');
42+
this.renderAsync = renderAsync;
43+
} catch (error) {
44+
throw new Error(
45+
'Failed to render React component. Make sure to install `@react-email/render`',
46+
);
47+
}
48+
}
49+
50+
payload.html = await this.renderAsync(
51+
payload.react as React.ReactElement,
52+
);
4253
}
4354

4455
const data = await this.resend.post<CreateEmailResponseSuccess>(

0 commit comments

Comments
 (0)
Please sign in to comment.