Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/friendly-cycles-roll.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@sveltejs/kit': patch
---

[fix] invalidate implicit dependencies in server load functions
6 changes: 6 additions & 0 deletions packages/kit/src/runtime/server/page/load_data.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,12 @@ export async function load_server_data({ event, options, state, node, parent })

const result = await node.server.load?.call(null, {
...event,
fetch: (info, init) => {
const url = new URL(info instanceof Request ? info.url : info, event.url);
uses.dependencies.add(url.href);

return event.fetch(info, init);
},
/** @param {string[]} deps */
depends: (...deps) => {
for (const dep of deps) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
/** @type {import('./$types').PageServerLoad} */
export async function load({ fetch }) {
const res = await fetch('/load/invalidation/server-fetch/count.json');
return res.json();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<script>
export let data;
</script>

<p data-testid="count">{data.count}</p>
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { json } from '@sveltejs/kit';

let count = 0;

/** @type {import('./$types').RequestHandler} */
export function GET({ url }) {
if (url.searchParams.has('reset')) count = 0;
return json({ count: count++ });
}
10 changes: 10 additions & 0 deletions packages/kit/test/apps/basics/test/client.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -1022,6 +1022,16 @@ test.describe('Invalidation', () => {
expect(shared).not.toBe(next_shared);
});

test('fetch in server load can be invalidated', async ({ page, app, request }) => {
await request.get('/load/invalidation/server-fetch/count.json?reset');
await page.goto('/load/invalidation/server-fetch');
const selector = '[data-testid="count"]';

expect(await page.textContent(selector)).toBe('1');
await app.invalidate('/load/invalidation/server-fetch/count.json');
expect(await page.textContent(selector)).toBe('2');
});

test('+layout.js is re-run when shared dep is invalidated', async ({ page }) => {
await page.goto('/load/invalidation/depends');
const server = await page.textContent('p.server');
Expand Down
4 changes: 3 additions & 1 deletion packages/kit/test/prerendering/basics/test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,9 @@ test('fetches data from local endpoint', () => {
{
type: 'data',
data: [{ message: 1 }, 'hello'],
uses: {}
uses: {
dependencies: ['http://example.com/origin/message.json']
}
}
]
});
Expand Down