From 319c81513dc9818a23016db3b58600b654f7dbad Mon Sep 17 00:00:00 2001 From: Chew Tee Ming Date: Wed, 18 Dec 2024 16:19:06 +0800 Subject: [PATCH 1/7] fix, test, and changeset --- .changeset/empty-mugs-press.md | 5 +++++ packages/kit/src/utils/filesystem.js | 24 ++++++++++++----------- packages/kit/src/utils/filesystem.spec.js | 14 ++++++++++++- 3 files changed, 31 insertions(+), 12 deletions(-) create mode 100644 .changeset/empty-mugs-press.md diff --git a/.changeset/empty-mugs-press.md b/.changeset/empty-mugs-press.md new file mode 100644 index 000000000000..c26949bf5bb0 --- /dev/null +++ b/.changeset/empty-mugs-press.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: correctly resolve no hooks file when a similarly named directory exists diff --git a/packages/kit/src/utils/filesystem.js b/packages/kit/src/utils/filesystem.js index 58bcce22c7e3..bec2af30855a 100644 --- a/packages/kit/src/utils/filesystem.js +++ b/packages/kit/src/utils/filesystem.js @@ -170,22 +170,24 @@ export function resolve_entry(entry) { if (fs.existsSync(entry)) { const stats = fs.statSync(entry); const index = path.join(entry, 'index'); - if (stats.isDirectory() && fs.existsSync(index)) { + + if (stats.isFile()) { + return entry; + } else if (fs.existsSync(index)) { return resolve_entry(index); } + } - return entry; - } else { - const dir = path.dirname(entry); - - if (fs.existsSync(dir)) { - const base = path.basename(entry); - const files = fs.readdirSync(dir); + const dir = path.dirname(entry); - const found = files.find((file) => file.replace(/\.(js|ts)$/, '') === base); + if (fs.existsSync(dir)) { + const base = path.basename(entry); + const files = fs.readdirSync(dir, { withFileTypes: true }); + const found = files.find((file) => { + return file.isFile() && file.name.replace(/\.(js|ts)$/, '') === base; + }); - if (found) return path.join(dir, found); - } + if (found) return path.join(dir, found.name); } return null; diff --git a/packages/kit/src/utils/filesystem.spec.js b/packages/kit/src/utils/filesystem.spec.js index e9ccf8d832a9..58b7c02021e4 100644 --- a/packages/kit/src/utils/filesystem.spec.js +++ b/packages/kit/src/utils/filesystem.spec.js @@ -110,5 +110,17 @@ test('ignores hooks folder that has no index file when resolving hooks', () => { write('hooks/not-index.js', ''); write('hooks.js', ''); - expect(resolve_entry(source_dir + '/hooks')).toBe(source_dir + '/hooks'); + expect(resolve_entry(source_dir + '/hooks')).toBe(source_dir + '/hooks.js'); +}); + +test('ignores hooks folder when resolving universal hooks', () => { + write('hooks/hooks.server.js', ''); + + expect(resolve_entry(source_dir + '/hooks')).null; +}); + +test('resolves entries that have an extension', () => { + write('hooks.js', ''); + + expect(resolve_entry(source_dir + '/hooks.js')).toBe(source_dir + '/hooks.js'); }); From 8fa6619fa5d5f112d9085af13afc65984e37dd83 Mon Sep 17 00:00:00 2001 From: Chew Tee Ming Date: Wed, 18 Dec 2024 16:45:08 +0800 Subject: [PATCH 2/7] try to fix windows test backslach issue --- packages/kit/src/utils/filesystem.spec.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/kit/src/utils/filesystem.spec.js b/packages/kit/src/utils/filesystem.spec.js index 58b7c02021e4..bd63913100b3 100644 --- a/packages/kit/src/utils/filesystem.spec.js +++ b/packages/kit/src/utils/filesystem.spec.js @@ -1,6 +1,6 @@ import { mkdtempSync, writeFileSync, readdirSync, mkdirSync, readFileSync } from 'node:fs'; import { tmpdir } from 'node:os'; -import { dirname, join } from 'node:path'; +import path, { dirname, join } from 'node:path'; import { assert, expect, beforeEach, test } from 'vitest'; import { copy, mkdirp, resolve_entry } from './filesystem.js'; @@ -110,7 +110,7 @@ test('ignores hooks folder that has no index file when resolving hooks', () => { write('hooks/not-index.js', ''); write('hooks.js', ''); - expect(resolve_entry(source_dir + '/hooks')).toBe(source_dir + '/hooks.js'); + expect(resolve_entry(source_dir + '/hooks')).toBe(path.join(source_dir, 'hooks.js')); }); test('ignores hooks folder when resolving universal hooks', () => { @@ -122,5 +122,5 @@ test('ignores hooks folder when resolving universal hooks', () => { test('resolves entries that have an extension', () => { write('hooks.js', ''); - expect(resolve_entry(source_dir + '/hooks.js')).toBe(source_dir + '/hooks.js'); + expect(resolve_entry(source_dir + '/hooks.js')).toBe(path.join(source_dir, 'hooks.js')); }); From c9a2007af642c48edf8807db05d4197bbb83bc85 Mon Sep 17 00:00:00 2001 From: Chew Tee Ming Date: Wed, 18 Dec 2024 16:52:38 +0800 Subject: [PATCH 3/7] windows --- packages/kit/src/utils/filesystem.spec.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/kit/src/utils/filesystem.spec.js b/packages/kit/src/utils/filesystem.spec.js index bd63913100b3..d871d3b1ce72 100644 --- a/packages/kit/src/utils/filesystem.spec.js +++ b/packages/kit/src/utils/filesystem.spec.js @@ -1,6 +1,6 @@ import { mkdtempSync, writeFileSync, readdirSync, mkdirSync, readFileSync } from 'node:fs'; import { tmpdir } from 'node:os'; -import path, { dirname, join } from 'node:path'; +import { dirname, join } from 'node:path'; import { assert, expect, beforeEach, test } from 'vitest'; import { copy, mkdirp, resolve_entry } from './filesystem.js'; @@ -101,20 +101,20 @@ test('replaces strings', () => { }); test('ignores hooks.server folder when resolving hooks', () => { - write('hooks.server/index.js', ''); + write(join('hooks.server', 'index.js'), ''); expect(resolve_entry(source_dir + '/hooks')).null; }); test('ignores hooks folder that has no index file when resolving hooks', () => { - write('hooks/not-index.js', ''); + write(join('hooks', 'not-index.js'), ''); write('hooks.js', ''); - expect(resolve_entry(source_dir + '/hooks')).toBe(path.join(source_dir, 'hooks.js')); + expect(resolve_entry(source_dir + '/hooks')).toBe(join(source_dir, 'hooks.js')); }); test('ignores hooks folder when resolving universal hooks', () => { - write('hooks/hooks.server.js', ''); + write(join('hooks', 'hooks.server.js'), ''); expect(resolve_entry(source_dir + '/hooks')).null; }); @@ -122,5 +122,5 @@ test('ignores hooks folder when resolving universal hooks', () => { test('resolves entries that have an extension', () => { write('hooks.js', ''); - expect(resolve_entry(source_dir + '/hooks.js')).toBe(path.join(source_dir, 'hooks.js')); + expect(resolve_entry(source_dir + '/hooks.js')).toBe(join(source_dir, '/hooks.js')); }); From 0807d84883d1f5c5c8474ce17b4a127d74d90754 Mon Sep 17 00:00:00 2001 From: Chew Tee Ming Date: Wed, 18 Dec 2024 16:58:07 +0800 Subject: [PATCH 4/7] give up --- packages/kit/src/utils/filesystem.spec.js | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/packages/kit/src/utils/filesystem.spec.js b/packages/kit/src/utils/filesystem.spec.js index d871d3b1ce72..1b9cec35258c 100644 --- a/packages/kit/src/utils/filesystem.spec.js +++ b/packages/kit/src/utils/filesystem.spec.js @@ -101,26 +101,20 @@ test('replaces strings', () => { }); test('ignores hooks.server folder when resolving hooks', () => { - write(join('hooks.server', 'index.js'), ''); + write('hooks.server/index.js', ''); expect(resolve_entry(source_dir + '/hooks')).null; }); test('ignores hooks folder that has no index file when resolving hooks', () => { - write(join('hooks', 'not-index.js'), ''); + write('hooks/not-index.js', ''); write('hooks.js', ''); - expect(resolve_entry(source_dir + '/hooks')).toBe(join(source_dir, 'hooks.js')); + expect(resolve_entry(source_dir + '/hooks')).toBe(source_dir + '/hooks.js'); }); test('ignores hooks folder when resolving universal hooks', () => { - write(join('hooks', 'hooks.server.js'), ''); + write('hooks/hooks.server.js', ''); expect(resolve_entry(source_dir + '/hooks')).null; }); - -test('resolves entries that have an extension', () => { - write('hooks.js', ''); - - expect(resolve_entry(source_dir + '/hooks.js')).toBe(join(source_dir, '/hooks.js')); -}); From 11dbae01a67b43bcbe2bfab07b2f6fd517441ae3 Mon Sep 17 00:00:00 2001 From: Chew Tee Ming Date: Wed, 18 Dec 2024 17:06:04 +0800 Subject: [PATCH 5/7] try this? --- packages/kit/src/utils/filesystem.js | 6 +++--- packages/kit/src/utils/filesystem.spec.js | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/kit/src/utils/filesystem.js b/packages/kit/src/utils/filesystem.js index bec2af30855a..4a2c5e502cb0 100644 --- a/packages/kit/src/utils/filesystem.js +++ b/packages/kit/src/utils/filesystem.js @@ -182,12 +182,12 @@ export function resolve_entry(entry) { if (fs.existsSync(dir)) { const base = path.basename(entry); - const files = fs.readdirSync(dir, { withFileTypes: true }); + const files = fs.readdirSync(dir); const found = files.find((file) => { - return file.isFile() && file.name.replace(/\.(js|ts)$/, '') === base; + return file.replace(/\.(js|ts)$/, '') === base && fs.statSync(path.join(dir, file)).isFile(); }); - if (found) return path.join(dir, found.name); + if (found) return path.join(dir, found); } return null; diff --git a/packages/kit/src/utils/filesystem.spec.js b/packages/kit/src/utils/filesystem.spec.js index 1b9cec35258c..58b7c02021e4 100644 --- a/packages/kit/src/utils/filesystem.spec.js +++ b/packages/kit/src/utils/filesystem.spec.js @@ -118,3 +118,9 @@ test('ignores hooks folder when resolving universal hooks', () => { expect(resolve_entry(source_dir + '/hooks')).null; }); + +test('resolves entries that have an extension', () => { + write('hooks.js', ''); + + expect(resolve_entry(source_dir + '/hooks.js')).toBe(source_dir + '/hooks.js'); +}); From 4f4b2d7f8de658a01f468aa89f84cb3a1e4505e4 Mon Sep 17 00:00:00 2001 From: Chew Tee Ming Date: Wed, 18 Dec 2024 17:10:40 +0800 Subject: [PATCH 6/7] one last step? --- packages/kit/src/utils/filesystem.spec.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/kit/src/utils/filesystem.spec.js b/packages/kit/src/utils/filesystem.spec.js index 58b7c02021e4..2532d2f60aed 100644 --- a/packages/kit/src/utils/filesystem.spec.js +++ b/packages/kit/src/utils/filesystem.spec.js @@ -101,20 +101,20 @@ test('replaces strings', () => { }); test('ignores hooks.server folder when resolving hooks', () => { - write('hooks.server/index.js', ''); + write(join('hooks.server', 'index.js'), ''); expect(resolve_entry(source_dir + '/hooks')).null; }); test('ignores hooks folder that has no index file when resolving hooks', () => { - write('hooks/not-index.js', ''); + write(join('hooks', 'not-index.js'), ''); write('hooks.js', ''); - expect(resolve_entry(source_dir + '/hooks')).toBe(source_dir + '/hooks.js'); + expect(resolve_entry(source_dir + '/hooks')).toBe(join(source_dir, '/hooks.js')); }); test('ignores hooks folder when resolving universal hooks', () => { - write('hooks/hooks.server.js', ''); + write(join('hooks', 'hooks.server.js'), ''); expect(resolve_entry(source_dir + '/hooks')).null; }); @@ -122,5 +122,5 @@ test('ignores hooks folder when resolving universal hooks', () => { test('resolves entries that have an extension', () => { write('hooks.js', ''); - expect(resolve_entry(source_dir + '/hooks.js')).toBe(source_dir + '/hooks.js'); + expect(resolve_entry(source_dir + '/hooks.js')).toBe(join(source_dir, '/hooks.js')); }); From 3d1d493376639cdc8e5dc7650ddd40515a7456cb Mon Sep 17 00:00:00 2001 From: Chew Tee Ming Date: Wed, 18 Dec 2024 17:23:56 +0800 Subject: [PATCH 7/7] last one --- packages/kit/src/utils/filesystem.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/kit/src/utils/filesystem.spec.js b/packages/kit/src/utils/filesystem.spec.js index 2532d2f60aed..84d58d406097 100644 --- a/packages/kit/src/utils/filesystem.spec.js +++ b/packages/kit/src/utils/filesystem.spec.js @@ -110,7 +110,7 @@ test('ignores hooks folder that has no index file when resolving hooks', () => { write(join('hooks', 'not-index.js'), ''); write('hooks.js', ''); - expect(resolve_entry(source_dir + '/hooks')).toBe(join(source_dir, '/hooks.js')); + expect(resolve_entry(source_dir + '/hooks')).toBe(join(source_dir, 'hooks.js')); }); test('ignores hooks folder when resolving universal hooks', () => { @@ -122,5 +122,5 @@ test('ignores hooks folder when resolving universal hooks', () => { test('resolves entries that have an extension', () => { write('hooks.js', ''); - expect(resolve_entry(source_dir + '/hooks.js')).toBe(join(source_dir, '/hooks.js')); + expect(resolve_entry(join(source_dir, 'hooks.js'))).toBe(join(source_dir, 'hooks.js')); });