diff --git a/.changeset/cyan-dancers-tap.md b/.changeset/cyan-dancers-tap.md new file mode 100644 index 000000000000..8e30367161af --- /dev/null +++ b/.changeset/cyan-dancers-tap.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: correctly resolve index file entrypoints such as `src/service-worker/index.js` diff --git a/packages/kit/src/utils/filesystem.js b/packages/kit/src/utils/filesystem.js index 4a2c5e502cb0..af490f13701d 100644 --- a/packages/kit/src/utils/filesystem.js +++ b/packages/kit/src/utils/filesystem.js @@ -169,11 +169,12 @@ export function from_fs(str) { export function resolve_entry(entry) { if (fs.existsSync(entry)) { const stats = fs.statSync(entry); - const index = path.join(entry, 'index'); - if (stats.isFile()) { return entry; - } else if (fs.existsSync(index)) { + } + + const index = path.join(entry, 'index'); + if (fs.existsSync(index + '.js') || fs.existsSync(index + '.ts')) { return resolve_entry(index); } } diff --git a/packages/kit/src/utils/filesystem.spec.js b/packages/kit/src/utils/filesystem.spec.js index 84d58d406097..86e0322f02ff 100644 --- a/packages/kit/src/utils/filesystem.spec.js +++ b/packages/kit/src/utils/filesystem.spec.js @@ -100,27 +100,35 @@ test('replaces strings', () => { ); }); -test('ignores hooks.server folder when resolving hooks', () => { - write(join('hooks.server', 'index.js'), ''); +test('resolves index files', () => { + write(join('service-worker', 'index.js'), ''); - expect(resolve_entry(source_dir + '/hooks')).null; + expect(resolve_entry(source_dir + '/service-worker')).toBe( + join(source_dir, 'service-worker', 'index.js') + ); +}); + +test('resolves entries that have an extension', () => { + write('hooks.js', ''); + + expect(resolve_entry(join(source_dir, 'hooks.js'))).toBe(join(source_dir, 'hooks.js')); }); -test('ignores hooks folder that has no index file when resolving hooks', () => { +test('resolves universal hooks file when hooks folder exists', () => { write(join('hooks', 'not-index.js'), ''); write('hooks.js', ''); expect(resolve_entry(source_dir + '/hooks')).toBe(join(source_dir, 'hooks.js')); }); -test('ignores hooks folder when resolving universal hooks', () => { - write(join('hooks', 'hooks.server.js'), ''); +test('ignores hooks.server folder when resolving universal hooks file', () => { + write(join('hooks.server', 'index.js'), ''); expect(resolve_entry(source_dir + '/hooks')).null; }); -test('resolves entries that have an extension', () => { - write('hooks.js', ''); +test('ignores hooks folder when resolving universal hooks file', () => { + write(join('hooks', 'hooks.server.js'), ''); - expect(resolve_entry(join(source_dir, 'hooks.js'))).toBe(join(source_dir, 'hooks.js')); + expect(resolve_entry(source_dir + '/hooks')).null; });