Skip to content

Commit 7a3bd9d

Browse files
committed
fix(preview-server): hot reloading with collapsed directories (#2284)
1 parent 6fbb852 commit 7a3bd9d

File tree

3 files changed

+43
-9
lines changed

3 files changed

+43
-9
lines changed

.changeset/petite-boxes-find.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@react-email/preview-server": patch
3+
---
4+
5+
fix hot reloading with collapsed directories

packages/preview-server/src/utils/contains-email-template.spec.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,13 @@ describe('containsEmailTemplate()', () => {
5151
},
5252
],
5353
},
54+
{
55+
absolutePath: '/fake/path/emails/first/second',
56+
directoryName: 'first/second',
57+
relativePath: 'first/second',
58+
emailFilenames: ['email'],
59+
subDirectories: [],
60+
},
5461
{
5562
absolutePath: '/fake/path/emails/newsletters',
5663
directoryName: 'newsletters',
@@ -104,6 +111,11 @@ describe('containsEmailTemplate()', () => {
104111
},
105112
],
106113
};
114+
115+
it('should work with collapsed email directory', () => {
116+
expect(containsEmailTemplate('first/second/email', directory)).toBe(true);
117+
});
118+
107119
it('should work with email inside a single sub directory', () => {
108120
expect(containsEmailTemplate('welcome/koala-welcome', directory)).toBe(
109121
true,

packages/preview-server/src/utils/contains-email-template.ts

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,37 @@ export const containsEmailTemplate = (
1414
relativeEmailPath: string,
1515
directory: EmailsDirectory,
1616
) => {
17-
const remainingSegments = relativeEmailPath
17+
const emailPathSegments = relativeEmailPath
1818
.replace(directory.relativePath, '')
1919
.split('/')
2020
.filter(Boolean);
21-
if (remainingSegments.length === 1) {
22-
const emailFilename = removeFilenameExtension(remainingSegments[0]!);
21+
22+
return containsEmailPathSegments(emailPathSegments, directory);
23+
};
24+
25+
const containsEmailPathSegments = (
26+
relativeEmailSegments: string[],
27+
directory: EmailsDirectory,
28+
) => {
29+
if (relativeEmailSegments.length === 1) {
30+
const emailFilename = removeFilenameExtension(relativeEmailSegments[0]!);
2331
return directory.emailFilenames.includes(emailFilename);
2432
}
25-
const subDirectory = directory.subDirectories.find(
26-
(sub) => sub.directoryName === remainingSegments[0],
27-
);
28-
if (subDirectory === undefined) {
29-
return false;
33+
34+
const remainingPath = relativeEmailSegments.join('/');
35+
36+
for (const subDirectory of directory.subDirectories) {
37+
if (remainingPath.startsWith(subDirectory.directoryName)) {
38+
const matchedSegments = subDirectory.directoryName
39+
.split('/')
40+
.filter(Boolean).length;
41+
42+
return containsEmailPathSegments(
43+
relativeEmailSegments.slice(matchedSegments),
44+
subDirectory,
45+
);
46+
}
3047
}
3148

32-
return containsEmailTemplate(relativeEmailPath, subDirectory);
49+
return false;
3350
};

0 commit comments

Comments
 (0)