Skip to content

Commit b57f866

Browse files
authored
fix(react-email): Hot reloading with directories two or more levels deep (#2247)
1 parent 5848bcd commit b57f866

File tree

3 files changed

+44
-22
lines changed

3 files changed

+44
-22
lines changed

.changeset/itchy-moles-give.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"react-email": patch
3+
---
4+
5+
fix hot reloading with directories at least two levels deep
Lines changed: 38 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import path from 'node:path';
21
import {
32
containsEmailTemplate,
43
removeFilenameExtension,
54
} from './contains-email-template';
5+
import type { EmailsDirectory } from './get-emails-directory-metadata';
66

7-
describe('removeFilenameExtension()', async () => {
7+
describe('removeFilenameExtension()', () => {
88
it('should work with a single .', () => {
99
expect(removeFilenameExtension('email-template.tsx')).toBe(
1010
'email-template',
@@ -22,19 +22,15 @@ describe('removeFilenameExtension()', async () => {
2222
});
2323
});
2424

25-
test('containsEmailTemplate()', async () => {
26-
const emailsDirectoryPath = path.resolve(
27-
__dirname,
28-
'../../../../apps/demo/emails',
29-
);
30-
const directory = {
31-
absolutePath: emailsDirectoryPath,
25+
describe('containsEmailTemplate()', () => {
26+
const directory: EmailsDirectory = {
27+
absolutePath: '/fake/path/emails',
3228
directoryName: 'emails',
3329
relativePath: '',
3430
emailFilenames: [],
3531
subDirectories: [
3632
{
37-
absolutePath: `${emailsDirectoryPath}/magic-links`,
33+
absolutePath: '/fake/path/emails/magic-links',
3834
directoryName: 'magic-links',
3935
relativePath: 'magic-links',
4036
emailFilenames: [
@@ -45,10 +41,18 @@ test('containsEmailTemplate()', async () => {
4541
'raycast-magic-link',
4642
'slack-confirm',
4743
],
48-
subDirectories: [],
44+
subDirectories: [
45+
{
46+
absolutePath: '/fake/path/emails/magic-links/resend',
47+
directoryName: 'resend',
48+
emailFilenames: ['verify-email'],
49+
relativePath: 'magic-links/resend',
50+
subDirectories: [],
51+
},
52+
],
4953
},
5054
{
51-
absolutePath: `${emailsDirectoryPath}/newsletters`,
55+
absolutePath: '/fake/path/emails/newsletters',
5256
directoryName: 'newsletters',
5357
relativePath: 'newsletters',
5458
emailFilenames: [
@@ -59,7 +63,7 @@ test('containsEmailTemplate()', async () => {
5963
subDirectories: [],
6064
},
6165
{
62-
absolutePath: `${emailsDirectoryPath}/notifications`,
66+
absolutePath: '/fake/path/emails/notifications',
6367
directoryName: 'notifications',
6468
relativePath: 'notifications',
6569
emailFilenames: [
@@ -71,37 +75,50 @@ test('containsEmailTemplate()', async () => {
7175
subDirectories: [],
7276
},
7377
{
74-
absolutePath: `${emailsDirectoryPath}/receipts`,
78+
absolutePath: '/fake/path/emails/receipts',
7579
directoryName: 'receipts',
7680
relativePath: 'receipts',
7781
emailFilenames: ['apple-receipt', 'nike-receipt'],
7882
subDirectories: [],
7983
},
8084
{
81-
absolutePath: `${emailsDirectoryPath}/reset-password`,
85+
absolutePath: '/fake/path/emails/reset-password',
8286
directoryName: 'reset-password',
8387
relativePath: 'reset-password',
8488
emailFilenames: ['dropbox-reset-password', 'twitch-reset-password'],
8589
subDirectories: [],
8690
},
8791
{
88-
absolutePath: `${emailsDirectoryPath}/reviews`,
92+
absolutePath: '/fake/path/emails/reviews',
8993
directoryName: 'reviews',
9094
relativePath: 'reviews',
9195
emailFilenames: ['airbnb-review', 'amazon-review'],
9296
subDirectories: [],
9397
},
9498
{
95-
absolutePath: `${emailsDirectoryPath}/welcome`,
99+
absolutePath: '/fake/path/emails/welcome',
96100
directoryName: 'welcome',
97101
relativePath: 'welcome',
98102
emailFilenames: ['koala-welcome', 'netlify-welcome', 'stripe-welcome'],
99103
subDirectories: [],
100104
},
101105
],
102106
};
103-
expect(containsEmailTemplate('welcome/koala-welcome', directory)).toBe(true);
104-
expect(containsEmailTemplate('welcome/missing-template', directory)).toBe(
105-
false,
106-
);
107+
it('should work with email inside a single sub directory', () => {
108+
expect(containsEmailTemplate('welcome/koala-welcome', directory)).toBe(
109+
true,
110+
);
111+
expect(containsEmailTemplate('welcome/missing-template', directory)).toBe(
112+
false,
113+
);
114+
});
115+
116+
it('should work with email inside a second sub directory', () => {
117+
expect(
118+
containsEmailTemplate('magic-links/resend/verify-email', directory),
119+
).toBe(true);
120+
expect(
121+
containsEmailTemplate('magic-links/resend/missing-template', directory),
122+
).toBe(false);
123+
});
107124
});

packages/react-email/src/utils/contains-email-template.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export const containsEmailTemplate = (
2323
return directory.emailFilenames.includes(emailFilename);
2424
}
2525
const subDirectory = directory.subDirectories.find(
26-
(sub) => sub.relativePath === remainingSegments[0],
26+
(sub) => sub.directoryName === remainingSegments[0],
2727
);
2828
if (subDirectory === undefined) {
2929
return false;

0 commit comments

Comments
 (0)