diff --git a/packages/kit/src/core/sync/write_root.js b/packages/kit/src/core/sync/write_root.js
index 2c264870aa29..2cecb4c63c45 100644
--- a/packages/kit/src/core/sync/write_root.js
+++ b/packages/kit/src/core/sync/write_root.js
@@ -25,13 +25,19 @@ export function write_root(manifest_data, output) {
+ on page {await layout_redirect(page.url.pathname)} (== {page.url.pathname}) +
+ +{@render children()} diff --git a/packages/kit/test/apps/async/src/routes/remote/prerender/redirect/+page.svelte b/packages/kit/test/apps/async/src/routes/remote/prerender/redirect/+page.svelte new file mode 100644 index 000000000000..9d65b32980e5 --- /dev/null +++ b/packages/kit/test/apps/async/src/routes/remote/prerender/redirect/+page.svelte @@ -0,0 +1 @@ +should never see this
diff --git a/packages/kit/test/apps/async/src/routes/remote/prerender/redirect/redirect.remote.js b/packages/kit/test/apps/async/src/routes/remote/prerender/redirect/redirect.remote.js new file mode 100644 index 000000000000..b1e41bbcf1f5 --- /dev/null +++ b/packages/kit/test/apps/async/src/routes/remote/prerender/redirect/redirect.remote.js @@ -0,0 +1,10 @@ +import { prerender } from '$app/server'; +import { redirect } from '@sveltejs/kit'; + +export const layout_redirect = prerender('unchecked', (path) => { + if (path !== '/remote/prerender/redirect/redirected') { + redirect(307, '/remote/prerender/redirect/redirected'); + } + + return path; +}); diff --git a/packages/kit/test/apps/async/src/routes/remote/prerender/redirect/redirected/+page.svelte b/packages/kit/test/apps/async/src/routes/remote/prerender/redirect/redirected/+page.svelte new file mode 100644 index 000000000000..a0164f2662b3 --- /dev/null +++ b/packages/kit/test/apps/async/src/routes/remote/prerender/redirect/redirected/+page.svelte @@ -0,0 +1 @@ +redirected
diff --git a/packages/kit/test/apps/async/src/routes/remote/query-redirect/+page.svelte b/packages/kit/test/apps/async/src/routes/remote/query-redirect/+page.svelte index 2de32fc5bff9..6d6417111595 100644 --- a/packages/kit/test/apps/async/src/routes/remote/query-redirect/+page.svelte +++ b/packages/kit/test/apps/async/src/routes/remote/query-redirect/+page.svelte @@ -1,5 +1,4 @@ - -from page -from page +from layout diff --git a/packages/kit/test/apps/async/test/client.test.js b/packages/kit/test/apps/async/test/client.test.js index 208876495c8a..d94374129ce7 100644 --- a/packages/kit/test/apps/async/test/client.test.js +++ b/packages/kit/test/apps/async/test/client.test.js @@ -22,6 +22,38 @@ test.describe('remote functions', () => { await expect(page.locator('p')).toHaveText('foobaz'); }); + test('prerender preload does not eagerly navigate redirects', async ({ page }) => { + await page.goto('/remote/prerender'); + await page.locator('a[href="/remote/prerender/redirect"]').hover(); + await Promise.all([page.waitForTimeout(100), page.waitForLoadState('networkidle')]); + + await expect(page).toHaveURL('/remote/prerender'); + + await page.click('a[href="/remote/prerender/redirect"]'); + await expect(page.locator('#redirected')).toHaveText('redirected'); + await expect(page.locator('#layout-prerender-query')).toHaveText( + 'on page /remote/prerender/redirect/redirected (== /remote/prerender/redirect/redirected)' + ); + }); + + test('query preload does not eagerly navigate redirects', async ({ page }) => { + await page.goto('/remote/query-redirect'); + + await page.locator('a[href="/remote/query-redirect/from-page"]').hover(); + await Promise.all([page.waitForTimeout(100), page.waitForLoadState('networkidle')]); + await expect(page).toHaveURL('/remote/query-redirect'); + + await page.locator('a[href="/remote/query-redirect/from-common-layout"]').hover(); + await Promise.all([page.waitForTimeout(100), page.waitForLoadState('networkidle')]); + await expect(page).toHaveURL('/remote/query-redirect'); + + await page.click('a[href="/remote/query-redirect/from-common-layout"]'); + await expect(page.locator('#redirected')).toHaveText('redirected'); + await expect(page.locator('#layout-query')).toHaveText( + 'on page /remote/query-redirect/from-common-layout/redirected (== /remote/query-redirect/from-common-layout/redirected)' + ); + }); + test('remote query responses are not cacheable', async ({ page }) => { // the query is kicked off during SSR but fetched by the client after // hydration, so we can observe the response headers on the wire