From 05a5aae220da152b955517204624dfd25d265ce3 Mon Sep 17 00:00:00 2001 From: frankfmy Date: Thu, 5 Feb 2026 23:56:56 +0100 Subject: [PATCH] fix: preserve $page.state when calling invalidate or invalidateAll The _invalidate function defaulted to reset_page_state=true, which caused $page.state (shallow routing state) to be cleared whenever invalidate() or invalidateAll() was called. This was unexpected since these functions are meant to re-run load functions, not affect navigation state. Changed the default to false, matching the behavior already used by refreshAll(). Added a test verifying state persistence across invalidation. Fixes #11783 --- .changeset/fix-page-state-invalidate.md | 5 +++++ packages/kit/src/runtime/client/client.js | 2 +- packages/kit/test/apps/basics/test/client.test.js | 15 +++++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 .changeset/fix-page-state-invalidate.md diff --git a/.changeset/fix-page-state-invalidate.md b/.changeset/fix-page-state-invalidate.md new file mode 100644 index 000000000000..437de6fc8b16 --- /dev/null +++ b/.changeset/fix-page-state-invalidate.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: preserve `$page.state` when calling `invalidate` or `invalidateAll` diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index c410814399ee..a640455301d7 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -372,7 +372,7 @@ export async function start(_app, _target, hydrate) { _start_router(); } -async function _invalidate(include_load_functions = true, reset_page_state = true) { +async function _invalidate(include_load_functions = true, reset_page_state = false) { // Accept all invalidations as they come, don't swallow any while another invalidation // is running because subsequent invalidations may make earlier ones outdated, // but batch multiple synchronous invalidations. diff --git a/packages/kit/test/apps/basics/test/client.test.js b/packages/kit/test/apps/basics/test/client.test.js index e8727c3e8bf6..95792b961e2e 100644 --- a/packages/kit/test/apps/basics/test/client.test.js +++ b/packages/kit/test/apps/basics/test/client.test.js @@ -1615,6 +1615,21 @@ test.describe('Shallow routing', () => { await expect(page.locator('span')).not.toHaveText(now); }); + test('Preserves page state when invalidating', async ({ page }) => { + await page.goto('/shallow-routing/push-state'); + await expect(page.locator('p')).toHaveText('active: false'); + + await page.locator('[data-id="one"]').click(); + await expect(page.locator('p')).toHaveText('active: true'); + + const now = /** @type {string} */ (await page.locator('span').textContent()); + + await page.locator('[data-id="invalidate"]').click(); + await expect(page.locator('span')).not.toHaveText(now); + // page.state should be preserved after invalidation (#11783) + await expect(page.locator('p')).toHaveText('active: true'); + }); + test('Does not navigate when going back to shallow route', async ({ baseURL, page }) => { await page.goto('/shallow-routing/push-state'); await page.locator('[data-id="two"]').click();