From 5c8af36996d82a4866c968ef78cfc7b6ae18963c Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Sat, 16 Dec 2023 23:17:37 +0800 Subject: [PATCH 1/7] check base before setting trailing slash to always --- .changeset/lovely-plums-move.md | 5 +++++ packages/kit/src/runtime/client/client.js | 2 +- packages/kit/test/apps/basics/src/routes/+page.svelte | 2 ++ .../apps/basics/test/cross-platform/client.test.js | 10 ++++++++++ 4 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 .changeset/lovely-plums-move.md diff --git a/.changeset/lovely-plums-move.md b/.changeset/lovely-plums-move.md new file mode 100644 index 000000000000..60a8735ec26f --- /dev/null +++ b/.changeset/lovely-plums-move.md @@ -0,0 +1,5 @@ +--- +"@sveltejs/kit": patch +--- + +fix: correctly trailing slash redirect when navigating from the root page diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 6db0ec702efc..f77e7d6c118c 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -663,7 +663,7 @@ export function create_client(app, target) { // if `paths.base === '/a/b/c`, then the root route is `/a/b/c/`, // regardless of the `trailingSlash` route option slash: - url.pathname === base || url.pathname === base + '/' + base && (url.pathname === base || url.pathname === base + '/') ? 'always' : node.universal?.trailingSlash ?? server_data_node?.slash }; diff --git a/packages/kit/test/apps/basics/src/routes/+page.svelte b/packages/kit/test/apps/basics/src/routes/+page.svelte index a63bddab544e..3d47a253bc0c 100644 --- a/packages/kit/test/apps/basics/src/routes/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/+page.svelte @@ -6,3 +6,5 @@

the answer is {data.answer}

+ +trailing slash diff --git a/packages/kit/test/apps/basics/test/cross-platform/client.test.js b/packages/kit/test/apps/basics/test/cross-platform/client.test.js index f32a42d80bf2..6136722fefb8 100644 --- a/packages/kit/test/apps/basics/test/cross-platform/client.test.js +++ b/packages/kit/test/apps/basics/test/cross-platform/client.test.js @@ -742,6 +742,16 @@ test.describe('Routing', () => { expect(new URL(page.url()).pathname).toBe('/routing/trailing-slash/ignore/'); await expect(page.locator('p')).toHaveText('/routing/trailing-slash/ignore/'); }); + + test('trailing slash redirect never is preserved when navigating from root page', async ({ + page, + clicknav + }) => { + await page.goto('/'); + await clicknav('a[href="/routing/trailing-slash/never/"]'); + expect(new URL(page.url()).pathname).toBe('/routing/trailing-slash/never'); + await expect(page.locator('p')).toHaveText('/routing/trailing-slash/never'); + }); }); test.describe('Shadow DOM', () => { From 86b6d7ee1948e15c59a264263bb586790a993b28 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Sat, 16 Dec 2023 17:05:28 -0800 Subject: [PATCH 2/7] Update .changeset/lovely-plums-move.md --- .changeset/lovely-plums-move.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/lovely-plums-move.md b/.changeset/lovely-plums-move.md index 60a8735ec26f..e9e96dc55ad9 100644 --- a/.changeset/lovely-plums-move.md +++ b/.changeset/lovely-plums-move.md @@ -2,4 +2,4 @@ "@sveltejs/kit": patch --- -fix: correctly trailing slash redirect when navigating from the root page +fix: correctly handle trailing slash redirect when navigating from the root page From 6041a785e6de0aebb927db90c41c6807772c791c Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Sat, 16 Dec 2023 17:05:35 -0800 Subject: [PATCH 3/7] Update packages/kit/src/runtime/client/client.js --- packages/kit/src/runtime/client/client.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index f77e7d6c118c..1c5e86cd19a6 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -660,8 +660,8 @@ export function create_client(app, target) { server: server_data_node, universal: node.universal?.load ? { type: 'data', data, uses } : null, data: data ?? server_data_node?.data ?? null, - // if `paths.base === '/a/b/c`, then the root route is `/a/b/c/`, - // regardless of the `trailingSlash` route option + // if `paths.base === '/a/b/c`, then the root route is always `/a/b/c/`, regardless of + // the `trailingSlash` route option, so that relative paths to JS and CSS work slash: base && (url.pathname === base || url.pathname === base + '/') ? 'always' From 149db6a2ad6d1a27566be3d4431c9e9b04da8130 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Sat, 16 Dec 2023 17:06:58 -0800 Subject: [PATCH 4/7] Update packages/kit/test/apps/basics/test/cross-platform/client.test.js --- .../kit/test/apps/basics/test/cross-platform/client.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/test/apps/basics/test/cross-platform/client.test.js b/packages/kit/test/apps/basics/test/cross-platform/client.test.js index 6136722fefb8..be094e00f703 100644 --- a/packages/kit/test/apps/basics/test/cross-platform/client.test.js +++ b/packages/kit/test/apps/basics/test/cross-platform/client.test.js @@ -743,7 +743,7 @@ test.describe('Routing', () => { await expect(page.locator('p')).toHaveText('/routing/trailing-slash/ignore/'); }); - test('trailing slash redirect never is preserved when navigating from root page', async ({ + test('trailing slash redirect not is preserved when navigating from root page', async ({ page, clicknav }) => { From 2a1a439d480436ebcf4a2e7248753b657a62a9db Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Sat, 16 Dec 2023 17:09:32 -0800 Subject: [PATCH 5/7] Update packages/kit/test/apps/basics/test/cross-platform/client.test.js --- .../kit/test/apps/basics/test/cross-platform/client.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/test/apps/basics/test/cross-platform/client.test.js b/packages/kit/test/apps/basics/test/cross-platform/client.test.js index be094e00f703..e3a4c5694c6b 100644 --- a/packages/kit/test/apps/basics/test/cross-platform/client.test.js +++ b/packages/kit/test/apps/basics/test/cross-platform/client.test.js @@ -743,7 +743,7 @@ test.describe('Routing', () => { await expect(page.locator('p')).toHaveText('/routing/trailing-slash/ignore/'); }); - test('trailing slash redirect not is preserved when navigating from root page', async ({ + test('trailing slash redirect works when navigating from root page', async ({ page, clicknav }) => { From 40621b9a519cf3a153e1a425efcdafb009a1f391 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Sat, 16 Dec 2023 17:09:51 -0800 Subject: [PATCH 6/7] Update packages/kit/test/apps/basics/src/routes/+page.svelte --- packages/kit/test/apps/basics/src/routes/+page.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/test/apps/basics/src/routes/+page.svelte b/packages/kit/test/apps/basics/src/routes/+page.svelte index 3d47a253bc0c..dd4b65a4cf04 100644 --- a/packages/kit/test/apps/basics/src/routes/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/+page.svelte @@ -7,4 +7,4 @@

the answer is {data.answer}

-trailing slash +URL with trailing slash that should redirect to remove it From 56e3d4b41f790f57f2250ef31195c774b8915821 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Sat, 16 Dec 2023 17:56:15 -0800 Subject: [PATCH 7/7] format --- packages/kit/test/apps/basics/src/routes/+page.svelte | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/kit/test/apps/basics/src/routes/+page.svelte b/packages/kit/test/apps/basics/src/routes/+page.svelte index dd4b65a4cf04..f4e941a22080 100644 --- a/packages/kit/test/apps/basics/src/routes/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/+page.svelte @@ -7,4 +7,6 @@

the answer is {data.answer}

-URL with trailing slash that should redirect to remove it +URL with trailing slash that should redirect to remove it