From 2ad85da38c83531c6ec093105f8e5ca3bdc81a84 Mon Sep 17 00:00:00 2001 From: LeeWxx Date: Fri, 26 Sep 2025 00:26:33 +0900 Subject: [PATCH 1/6] fix: keep resolve relative to initial base during prerender --- packages/kit/src/runtime/app/paths/internal/server.js | 2 ++ packages/kit/src/runtime/app/paths/server.js | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/kit/src/runtime/app/paths/internal/server.js b/packages/kit/src/runtime/app/paths/internal/server.js index a7eaf2381191..81a88bc009bc 100644 --- a/packages/kit/src/runtime/app/paths/internal/server.js +++ b/packages/kit/src/runtime/app/paths/internal/server.js @@ -5,6 +5,8 @@ export const relative = __SVELTEKIT_PATHS_RELATIVE__; const initial = { base, assets }; +export const initial_base = initial.base; + /** * @param {{ base: string, assets: string }} paths */ diff --git a/packages/kit/src/runtime/app/paths/server.js b/packages/kit/src/runtime/app/paths/server.js index fe2b9510400e..dfc07db5a549 100644 --- a/packages/kit/src/runtime/app/paths/server.js +++ b/packages/kit/src/runtime/app/paths/server.js @@ -1,4 +1,4 @@ -import { base, assets, relative } from './internal/server.js'; +import { base, assets, relative, initial_base } from './internal/server.js'; import { resolve_route } from '../../../utils/routing.js'; import { get_request_store } from '@sveltejs/kit/internal/server'; @@ -19,7 +19,8 @@ export function resolve(id, params) { return resolved; } - const segments = event.url.pathname.slice(base.length).split('/').slice(2); + const after_base = event.url.pathname.slice(initial_base.length); + const segments = after_base.split('/').slice(2); const prefix = segments.map(() => '..').join('/') || '.'; return prefix + resolved; From 3465730149e99ac2e463888fc6ddf194c55ac01a Mon Sep 17 00:00:00 2001 From: LeeWxx Date: Fri, 26 Sep 2025 00:27:03 +0900 Subject: [PATCH 2/6] test: cover resolve helper relative link in prerender --- .../basics/src/routes/resolve-relative/lv1/+page.svelte | 1 + .../basics/src/routes/resolve-relative/lv1/lv2/+page.svelte | 5 +++++ packages/kit/test/prerendering/basics/test/tests.spec.js | 5 +++++ 3 files changed, 11 insertions(+) create mode 100644 packages/kit/test/prerendering/basics/src/routes/resolve-relative/lv1/+page.svelte create mode 100644 packages/kit/test/prerendering/basics/src/routes/resolve-relative/lv1/lv2/+page.svelte diff --git a/packages/kit/test/prerendering/basics/src/routes/resolve-relative/lv1/+page.svelte b/packages/kit/test/prerendering/basics/src/routes/resolve-relative/lv1/+page.svelte new file mode 100644 index 000000000000..ed1715de0f3d --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/resolve-relative/lv1/+page.svelte @@ -0,0 +1 @@ +

level 1

diff --git a/packages/kit/test/prerendering/basics/src/routes/resolve-relative/lv1/lv2/+page.svelte b/packages/kit/test/prerendering/basics/src/routes/resolve-relative/lv1/lv2/+page.svelte new file mode 100644 index 000000000000..09ff8400035c --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/resolve-relative/lv1/lv2/+page.svelte @@ -0,0 +1,5 @@ + + +go up diff --git a/packages/kit/test/prerendering/basics/test/tests.spec.js b/packages/kit/test/prerendering/basics/test/tests.spec.js index a1182929a9ac..e3972a1d369d 100644 --- a/packages/kit/test/prerendering/basics/test/tests.spec.js +++ b/packages/kit/test/prerendering/basics/test/tests.spec.js @@ -200,6 +200,11 @@ test('prerenders binary data', async () => { assert.equal(Buffer.compare(read('fetch-image/image.png', null), read('image.png', null)), 0); }); +test('generates relative link for resolve helper during prerender', () => { + const content = read('resolve-relative/lv1/lv2.html'); + expect(content).toMatch('href="../../resolve-relative/lv1"'); +}); + test('fetches data from local endpoint', () => { const data = JSON.parse(read('origin/__data.json')); From cebdb1555cc752557467b5e98fe5ef137943e78e Mon Sep 17 00:00:00 2001 From: LeeWxx Date: Fri, 26 Sep 2025 00:29:41 +0900 Subject: [PATCH 3/6] chore: changeset --- .changeset/famous-fans-cheer.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/famous-fans-cheer.md diff --git a/.changeset/famous-fans-cheer.md b/.changeset/famous-fans-cheer.md new file mode 100644 index 000000000000..36cc241962a4 --- /dev/null +++ b/.changeset/famous-fans-cheer.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: keep resolve relative to initial base during prerender From 1e86459b0fd961215cd5d84413fc2f7f7ca12bc3 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Fri, 26 Sep 2025 15:46:12 +0200 Subject: [PATCH 4/6] Update packages/kit/src/runtime/app/paths/internal/server.js --- packages/kit/src/runtime/app/paths/internal/server.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/kit/src/runtime/app/paths/internal/server.js b/packages/kit/src/runtime/app/paths/internal/server.js index 81a88bc009bc..cd71e77db073 100644 --- a/packages/kit/src/runtime/app/paths/internal/server.js +++ b/packages/kit/src/runtime/app/paths/internal/server.js @@ -5,6 +5,10 @@ export const relative = __SVELTEKIT_PATHS_RELATIVE__; const initial = { base, assets }; +/** + * `base` could be overridden during rendering to be relative; + * this one's the original non-relative base path + */ export const initial_base = initial.base; /** From 54bf8573cc5c71685de0a497eb6b4fdcf8b1ea8e Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Fri, 26 Sep 2025 15:49:47 +0200 Subject: [PATCH 5/6] Update packages/kit/src/runtime/app/paths/server.js --- packages/kit/src/runtime/app/paths/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/src/runtime/app/paths/server.js b/packages/kit/src/runtime/app/paths/server.js index f996e73f8b0f..72b1c4640a0b 100644 --- a/packages/kit/src/runtime/app/paths/server.js +++ b/packages/kit/src/runtime/app/paths/server.js @@ -16,7 +16,7 @@ export function resolve(id, params) { const store = try_get_request_store(); if (store && !store.state.prerendering?.fallback) { - const after_base = event.url.pathname.slice(initial_base.length); + const after_base = event.url.pathname.slice(initial_base.length); const segments = after_base.split('/').slice(2); const prefix = segments.map(() => '..').join('/') || '.'; From 5c7dfe8eb80c83d91aa199b33b12e9b506a41b86 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Fri, 26 Sep 2025 17:25:58 +0200 Subject: [PATCH 6/6] Update packages/kit/src/runtime/app/paths/server.js --- packages/kit/src/runtime/app/paths/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/src/runtime/app/paths/server.js b/packages/kit/src/runtime/app/paths/server.js index 72b1c4640a0b..abee8466006e 100644 --- a/packages/kit/src/runtime/app/paths/server.js +++ b/packages/kit/src/runtime/app/paths/server.js @@ -16,7 +16,7 @@ export function resolve(id, params) { const store = try_get_request_store(); if (store && !store.state.prerendering?.fallback) { - const after_base = event.url.pathname.slice(initial_base.length); + const after_base = store.event.url.pathname.slice(initial_base.length); const segments = after_base.split('/').slice(2); const prefix = segments.map(() => '..').join('/') || '.';