Skip to content

Commit d4dd214

Browse files
LeeWxxdummdidumm
andauthored
fix: keep resolve relative to initial base during prerender (#14533)
* fix: keep resolve relative to initial base during prerender * test: cover resolve helper relative link in prerender * chore: changeset * Update packages/kit/src/runtime/app/paths/internal/server.js * Update packages/kit/src/runtime/app/paths/server.js * Update packages/kit/src/runtime/app/paths/server.js --------- Co-authored-by: Simon H <[email protected]>
1 parent 197ad58 commit d4dd214

File tree

6 files changed

+25
-2
lines changed

6 files changed

+25
-2
lines changed

.changeset/famous-fans-cheer.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: keep resolve relative to initial base during prerender

packages/kit/src/runtime/app/paths/internal/server.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ export const relative = __SVELTEKIT_PATHS_RELATIVE__;
55

66
const initial = { base, assets };
77

8+
/**
9+
* `base` could be overridden during rendering to be relative;
10+
* this one's the original non-relative base path
11+
*/
12+
export const initial_base = initial.base;
13+
814
/**
915
* @param {{ base: string, assets: string }} paths
1016
*/

packages/kit/src/runtime/app/paths/server.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { base, assets, relative } from './internal/server.js';
1+
import { base, assets, relative, initial_base } from './internal/server.js';
22
import { resolve_route } from '../../../utils/routing.js';
33
import { try_get_request_store } from '@sveltejs/kit/internal/server';
44

@@ -16,7 +16,8 @@ export function resolve(id, params) {
1616
const store = try_get_request_store();
1717

1818
if (store && !store.state.prerendering?.fallback) {
19-
const segments = store.event.url.pathname.slice(base.length).split('/').slice(2);
19+
const after_base = store.event.url.pathname.slice(initial_base.length);
20+
const segments = after_base.split('/').slice(2);
2021
const prefix = segments.map(() => '..').join('/') || '.';
2122

2223
return prefix + resolved;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<h1>level 1</h1>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<script>
2+
import { resolve } from '$app/paths';
3+
</script>
4+
5+
<a id="resolved-link" href={resolve('/resolve-relative/lv1')}>go up</a>

packages/kit/test/prerendering/basics/test/tests.spec.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,11 @@ test('prerenders binary data', async () => {
200200
assert.equal(Buffer.compare(read('fetch-image/image.png', null), read('image.png', null)), 0);
201201
});
202202

203+
test('generates relative link for resolve helper during prerender', () => {
204+
const content = read('resolve-relative/lv1/lv2.html');
205+
expect(content).toMatch('href="../../resolve-relative/lv1"');
206+
});
207+
203208
test('fetches data from local endpoint', () => {
204209
const data = JSON.parse(read('origin/__data.json'));
205210

0 commit comments

Comments
 (0)