Skip to content

Commit 19823dd

Browse files
authored
fix: correctly resolve no hooks file when a similarly named directory exists (#13188)
fixes #13184
1 parent 089159c commit 19823dd

File tree

3 files changed

+33
-14
lines changed

3 files changed

+33
-14
lines changed

.changeset/empty-mugs-press.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@sveltejs/kit': patch
3+
---
4+
5+
fix: correctly resolve no hooks file when a similarly named directory exists

packages/kit/src/utils/filesystem.js

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -170,22 +170,24 @@ export function resolve_entry(entry) {
170170
if (fs.existsSync(entry)) {
171171
const stats = fs.statSync(entry);
172172
const index = path.join(entry, 'index');
173-
if (stats.isDirectory() && fs.existsSync(index)) {
173+
174+
if (stats.isFile()) {
175+
return entry;
176+
} else if (fs.existsSync(index)) {
174177
return resolve_entry(index);
175178
}
179+
}
176180

177-
return entry;
178-
} else {
179-
const dir = path.dirname(entry);
180-
181-
if (fs.existsSync(dir)) {
182-
const base = path.basename(entry);
183-
const files = fs.readdirSync(dir);
181+
const dir = path.dirname(entry);
184182

185-
const found = files.find((file) => file.replace(/\.(js|ts)$/, '') === base);
183+
if (fs.existsSync(dir)) {
184+
const base = path.basename(entry);
185+
const files = fs.readdirSync(dir);
186+
const found = files.find((file) => {
187+
return file.replace(/\.(js|ts)$/, '') === base && fs.statSync(path.join(dir, file)).isFile();
188+
});
186189

187-
if (found) return path.join(dir, found);
188-
}
190+
if (found) return path.join(dir, found);
189191
}
190192

191193
return null;

packages/kit/src/utils/filesystem.spec.js

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,14 +101,26 @@ test('replaces strings', () => {
101101
});
102102

103103
test('ignores hooks.server folder when resolving hooks', () => {
104-
write('hooks.server/index.js', '');
104+
write(join('hooks.server', 'index.js'), '');
105105

106106
expect(resolve_entry(source_dir + '/hooks')).null;
107107
});
108108

109109
test('ignores hooks folder that has no index file when resolving hooks', () => {
110-
write('hooks/not-index.js', '');
110+
write(join('hooks', 'not-index.js'), '');
111111
write('hooks.js', '');
112112

113-
expect(resolve_entry(source_dir + '/hooks')).toBe(source_dir + '/hooks');
113+
expect(resolve_entry(source_dir + '/hooks')).toBe(join(source_dir, 'hooks.js'));
114+
});
115+
116+
test('ignores hooks folder when resolving universal hooks', () => {
117+
write(join('hooks', 'hooks.server.js'), '');
118+
119+
expect(resolve_entry(source_dir + '/hooks')).null;
120+
});
121+
122+
test('resolves entries that have an extension', () => {
123+
write('hooks.js', '');
124+
125+
expect(resolve_entry(join(source_dir, 'hooks.js'))).toBe(join(source_dir, 'hooks.js'));
114126
});

0 commit comments

Comments
 (0)