Skip to content

Commit b0a6ac9

Browse files
committed
fix: reset invalid resources after successful invalidation
1 parent ac6c3cb commit b0a6ac9

File tree

4 files changed

+30
-3
lines changed

4 files changed

+30
-3
lines changed

.changeset/old-rockets-film.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: reset invalid resources after a successful invalidation

packages/kit/src/runtime/client/client.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ export function create_client(app, target) {
8282
default_error_loader();
8383

8484
const container = __SVELTEKIT_EMBEDDED__ ? target : document.documentElement;
85+
8586
/** @type {Array<((url: URL) => boolean)>} */
8687
const invalidated = [];
8788

@@ -165,13 +166,13 @@ export function create_client(app, target) {
165166
// Accept all invalidations as they come, don't swallow any while another invalidation
166167
// is running because subsequent invalidations may make earlier ones outdated,
167168
// but batch multiple synchronous invalidations.
168-
pending_invalidate = pending_invalidate || Promise.resolve();
169-
await pending_invalidate;
169+
await (pending_invalidate ||= Promise.resolve());
170170
if (!pending_invalidate) return;
171171
pending_invalidate = null;
172172

173173
const url = new URL(location.href);
174174
const intent = get_navigation_intent(url, true);
175+
175176
// Clear preload, it might be affected by the invalidation.
176177
// Also solves an edge case where a preload is triggered, the navigation for it
177178
// was then triggered and is still running while the invalidation kicks in,
@@ -184,14 +185,16 @@ export function create_client(app, target) {
184185

185186
if (navigation_result) {
186187
if (navigation_result.type === 'redirect') {
187-
return goto(new URL(navigation_result.location, url).href, {}, 1, nav_token);
188+
await goto(new URL(navigation_result.location, url).href, {}, 1, nav_token);
188189
} else {
189190
if (navigation_result.props.page !== undefined) {
190191
page = navigation_result.props.page;
191192
}
192193
root.$set(navigation_result.props);
193194
}
194195
}
196+
197+
invalidated.length = 0;
195198
}
196199

197200
/** @param {number} index */

packages/kit/test/apps/basics/src/routes/load/invalidation/depends/+page.svelte

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,12 @@
2222
>
2323
invalidate server
2424
</button>
25+
26+
<p class="neither">neither</p>
27+
<button
28+
type="button"
29+
class="neither"
30+
on:click={() => (window.promise = invalidate('invalidate-depends:neither'))}
31+
>
32+
invalidate neither
33+
</button>

packages/kit/test/apps/basics/test/client.test.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,11 @@ test.describe('Invalidation', () => {
504504
const next_shared = await page.textContent('p.shared');
505505
expect(server).not.toBe(next_server);
506506
expect(shared).not.toBe(next_shared);
507+
508+
await page.click('button.neither');
509+
await page.evaluate(() => window.promise);
510+
expect(await page.textContent('p.server')).toBe(next_server);
511+
expect(await page.textContent('p.shared')).toBe(next_shared);
507512
});
508513

509514
test('fetch in server load cannot be invalidated', async ({ page, app, request }) => {
@@ -531,6 +536,11 @@ test.describe('Invalidation', () => {
531536
const next_shared = await page.textContent('p.shared');
532537
expect(server).toBe(next_server);
533538
expect(shared).not.toBe(next_shared);
539+
540+
await page.click('button.neither');
541+
await page.evaluate(() => window.promise);
542+
expect(await page.textContent('p.server')).toBe(next_server);
543+
expect(await page.textContent('p.shared')).toBe(next_shared);
534544
});
535545

536546
test('Parameter use is tracked even for routes that do not use the parameters', async ({

0 commit comments

Comments
 (0)