From 38cdd9c508a51b3f9d117aaec920166fa2178cb7 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 25 Aug 2022 13:01:44 -0400 Subject: [PATCH] correctly determine whether a route uses server data - fixes #6269 --- .changeset/modern-files-watch.md | 5 +++++ .../src/core/sync/write_client_manifest.js | 8 ++------ .../invalidation/forced/+layout.server.js | 7 +++++++ .../load/invalidation/forced/+layout.svelte | 1 + .../load/invalidation/forced/+page.server.js | 7 +++++++ .../load/invalidation/forced/+page.svelte | 10 ++++++++++ .../load/invalidation/forced/reset/+server.js | 7 +++++++ .../routes/load/invalidation/forced/state.js | 9 +++++++++ .../kit/test/apps/basics/test/client.test.js | 20 +++++++++++++++++++ 9 files changed, 68 insertions(+), 6 deletions(-) create mode 100644 .changeset/modern-files-watch.md create mode 100644 packages/kit/test/apps/basics/src/routes/load/invalidation/forced/+layout.server.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/invalidation/forced/+layout.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/invalidation/forced/+page.server.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/invalidation/forced/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/invalidation/forced/reset/+server.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/invalidation/forced/state.js diff --git a/.changeset/modern-files-watch.md b/.changeset/modern-files-watch.md new file mode 100644 index 000000000000..54320d9f9f63 --- /dev/null +++ b/.changeset/modern-files-watch.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +Correctly determine whether route uses server data diff --git a/packages/kit/src/core/sync/write_client_manifest.js b/packages/kit/src/core/sync/write_client_manifest.js index 99bc0eccd24b..25456c6c68df 100644 --- a/packages/kit/src/core/sync/write_client_manifest.js +++ b/packages/kit/src/core/sync/write_client_manifest.js @@ -53,17 +53,13 @@ export function write_client_manifest(manifest_data, output) { while (layouts.at(-1) === '') layouts.pop(); while (errors.at(-1) === '') errors.pop(); - /** @type {import('types').RouteData | null} */ - let current_route = route; - /** @type {import('types').PageNode | null} */ let current_node = route.leaf; let uses_server_data = false; - while (current_route && !uses_server_data) { + while (current_node && !uses_server_data) { uses_server_data = !!current_node?.server; - current_route = current_route.parent; - current_node = current_route?.layout ?? null; + current_node = current_node?.parent ?? null; } // encode whether or not the route uses the server data diff --git a/packages/kit/test/apps/basics/src/routes/load/invalidation/forced/+layout.server.js b/packages/kit/test/apps/basics/src/routes/load/invalidation/forced/+layout.server.js new file mode 100644 index 000000000000..a01c1cf417a6 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/invalidation/forced/+layout.server.js @@ -0,0 +1,7 @@ +import { increment } from './state'; + +export const load = () => { + return { + a: increment() + }; +}; diff --git a/packages/kit/test/apps/basics/src/routes/load/invalidation/forced/+layout.svelte b/packages/kit/test/apps/basics/src/routes/load/invalidation/forced/+layout.svelte new file mode 100644 index 000000000000..4fa864ce7aa9 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/invalidation/forced/+layout.svelte @@ -0,0 +1 @@ + diff --git a/packages/kit/test/apps/basics/src/routes/load/invalidation/forced/+page.server.js b/packages/kit/test/apps/basics/src/routes/load/invalidation/forced/+page.server.js new file mode 100644 index 000000000000..f5fcaef56aa6 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/invalidation/forced/+page.server.js @@ -0,0 +1,7 @@ +import { increment } from './state'; + +export const load = () => { + return { + b: increment() + }; +}; diff --git a/packages/kit/test/apps/basics/src/routes/load/invalidation/forced/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/invalidation/forced/+page.svelte new file mode 100644 index 000000000000..0f544b39fd62 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/invalidation/forced/+page.svelte @@ -0,0 +1,10 @@ + + +

a: {data.a}, b: {data.b}

+ + diff --git a/packages/kit/test/apps/basics/src/routes/load/invalidation/forced/reset/+server.js b/packages/kit/test/apps/basics/src/routes/load/invalidation/forced/reset/+server.js new file mode 100644 index 000000000000..448545fd5f90 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/invalidation/forced/reset/+server.js @@ -0,0 +1,7 @@ +import { reset } from '../state.js'; + +/** @type {import('./$types').RequestHandler} */ +export function GET() { + reset(); + return new Response('ok'); +} diff --git a/packages/kit/test/apps/basics/src/routes/load/invalidation/forced/state.js b/packages/kit/test/apps/basics/src/routes/load/invalidation/forced/state.js new file mode 100644 index 000000000000..10436c57304a --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/invalidation/forced/state.js @@ -0,0 +1,9 @@ +let count = 0; + +export function increment() { + return count++; +} + +export function reset() { + count = 0; +} diff --git a/packages/kit/test/apps/basics/test/client.test.js b/packages/kit/test/apps/basics/test/client.test.js index a3b202ea1f16..cbb3fb4de5aa 100644 --- a/packages/kit/test/apps/basics/test/client.test.js +++ b/packages/kit/test/apps/basics/test/client.test.js @@ -640,4 +640,24 @@ test.describe.serial('Invalidation', () => { await clicknav('[href="?a=3"]'); expect(await page.textContent('h1')).toBe('3'); }); + + test('server-only load functions are re-run following forced invalidation', async ({ + page, + request + }) => { + await request.get('/load/invalidation/forced/reset'); + + await page.goto('/load/invalidation/forced'); + expect(await page.textContent('h1')).toBe('a: 0, b: 1'); + + await page.click('button'); + await page.waitForLoadState('networkidle'); + await page.waitForTimeout(0); // apparently necessary + expect(await page.textContent('h1')).toBe('a: 2, b: 3'); + + await page.click('button'); + await page.waitForLoadState('networkidle'); + await page.waitForTimeout(0); + expect(await page.textContent('h1')).toBe('a: 4, b: 5'); + }); });