From 89c6e9baca27d4aed308c2a4ccb5d26040d2cdd8 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Tue, 2 Sep 2025 17:39:40 +0200 Subject: [PATCH 1/4] fix: fail prerendering when remote function fails fixes #14242 --- .changeset/shaggy-ghosts-decide.md | 5 +++++ packages/kit/src/runtime/server/remote.js | 8 +++++++- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 .changeset/shaggy-ghosts-decide.md diff --git a/.changeset/shaggy-ghosts-decide.md b/.changeset/shaggy-ghosts-decide.md new file mode 100644 index 000000000000..b7cb1243ecdc --- /dev/null +++ b/.changeset/shaggy-ghosts-decide.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: fail prerendering when remote function fails diff --git a/packages/kit/src/runtime/server/remote.js b/packages/kit/src/runtime/server/remote.js index a09031d17a61..12c86ee2429d 100644 --- a/packages/kit/src/runtime/server/remote.js +++ b/packages/kit/src/runtime/server/remote.js @@ -131,13 +131,19 @@ async function handle_remote_call_internal(event, state, options, manifest, id) }); } + const status = + error instanceof HttpError || error instanceof SvelteKitError ? error.status : 500; + return json( /** @type {RemoteFunctionResponse} */ ({ type: 'error', error: await handle_error_and_jsonify(event, state, options, error), - status: error instanceof HttpError || error instanceof SvelteKitError ? error.status : 500 + status }), { + // By setting a non-200 during prerendering we fail the prerender process (unless handleHttpError handles it). + // Errors at runtime will be passed to the client and are handled there + status: state.prerendering ? status : undefined, headers: { 'cache-control': 'private, no-store' } From 2d6a9d774650096a3d06933b0f29cc62fd9b918c Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 11 Sep 2025 11:39:27 -0400 Subject: [PATCH 2/4] new test app --- pnpm-lock.yaml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e7d4fd2ab037..896b9f149521 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -816,6 +816,30 @@ importers: specifier: 'catalog:' version: 6.3.5(@types/node@18.19.119)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) + packages/kit/test/build-errors/apps/prerender-remote-function-error: + devDependencies: + '@sveltejs/adapter-auto': + specifier: workspace:^ + version: link:../../../../../adapter-auto + '@sveltejs/kit': + specifier: workspace:^ + version: link:../../../.. + '@sveltejs/vite-plugin-svelte': + specifier: 'catalog:' + version: 6.0.0-next.3(svelte@5.38.5)(vite@6.3.5(@types/node@18.19.119)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) + svelte: + specifier: ^5.38.5 + version: 5.38.5 + svelte-check: + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.3)(svelte@5.38.5)(typescript@5.8.3) + typescript: + specifier: ^5.5.4 + version: 5.8.3 + vite: + specifier: 'catalog:' + version: 6.3.5(@types/node@18.19.119)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) + packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment: devDependencies: '@sveltejs/adapter-auto': From afdf98c0d85fd02da587c5eacce350c34d71f2e7 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 11 Sep 2025 11:39:51 -0400 Subject: [PATCH 3/4] add test --- .../package.json | 22 +++++++++++++++++ .../src/app.html | 12 +++++++++ .../src/routes/+layout.js | 1 + .../src/routes/+page.svelte | 7 ++++++ .../src/routes/data.remote.ts | 5 ++++ .../static/favicon.png | Bin 0 -> 1571 bytes .../svelte.config.js | 14 +++++++++++ .../tsconfig.json | 8 ++++++ .../vite.config.js | 23 ++++++++++++++++++ .../kit/test/build-errors/prerender.spec.js | 12 +++++++++ 10 files changed, 104 insertions(+) create mode 100644 packages/kit/test/build-errors/apps/prerender-remote-function-error/package.json create mode 100644 packages/kit/test/build-errors/apps/prerender-remote-function-error/src/app.html create mode 100644 packages/kit/test/build-errors/apps/prerender-remote-function-error/src/routes/+layout.js create mode 100644 packages/kit/test/build-errors/apps/prerender-remote-function-error/src/routes/+page.svelte create mode 100644 packages/kit/test/build-errors/apps/prerender-remote-function-error/src/routes/data.remote.ts create mode 100644 packages/kit/test/build-errors/apps/prerender-remote-function-error/static/favicon.png create mode 100644 packages/kit/test/build-errors/apps/prerender-remote-function-error/svelte.config.js create mode 100644 packages/kit/test/build-errors/apps/prerender-remote-function-error/tsconfig.json create mode 100644 packages/kit/test/build-errors/apps/prerender-remote-function-error/vite.config.js diff --git a/packages/kit/test/build-errors/apps/prerender-remote-function-error/package.json b/packages/kit/test/build-errors/apps/prerender-remote-function-error/package.json new file mode 100644 index 000000000000..cf1d0aa90198 --- /dev/null +++ b/packages/kit/test/build-errors/apps/prerender-remote-function-error/package.json @@ -0,0 +1,22 @@ +{ + "name": "prerenderable-remote-function-error", + "private": true, + "version": "0.0.1", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "prepare": "svelte-kit sync", + "check": "svelte-kit sync && tsc && svelte-check" + }, + "devDependencies": { + "@sveltejs/adapter-auto": "workspace:^", + "@sveltejs/kit": "workspace:^", + "@sveltejs/vite-plugin-svelte": "catalog:", + "svelte": "^5.38.5", + "svelte-check": "^4.1.1", + "typescript": "^5.5.4", + "vite": "catalog:" + }, + "type": "module" +} diff --git a/packages/kit/test/build-errors/apps/prerender-remote-function-error/src/app.html b/packages/kit/test/build-errors/apps/prerender-remote-function-error/src/app.html new file mode 100644 index 000000000000..866ddd01e176 --- /dev/null +++ b/packages/kit/test/build-errors/apps/prerender-remote-function-error/src/app.html @@ -0,0 +1,12 @@ + + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/packages/kit/test/build-errors/apps/prerender-remote-function-error/src/routes/+layout.js b/packages/kit/test/build-errors/apps/prerender-remote-function-error/src/routes/+layout.js new file mode 100644 index 000000000000..189f71e2e1b3 --- /dev/null +++ b/packages/kit/test/build-errors/apps/prerender-remote-function-error/src/routes/+layout.js @@ -0,0 +1 @@ +export const prerender = true; diff --git a/packages/kit/test/build-errors/apps/prerender-remote-function-error/src/routes/+page.svelte b/packages/kit/test/build-errors/apps/prerender-remote-function-error/src/routes/+page.svelte new file mode 100644 index 000000000000..25e7015aefb5 --- /dev/null +++ b/packages/kit/test/build-errors/apps/prerender-remote-function-error/src/routes/+page.svelte @@ -0,0 +1,7 @@ + + +{#await throws() then value} + {value} +{/await} diff --git a/packages/kit/test/build-errors/apps/prerender-remote-function-error/src/routes/data.remote.ts b/packages/kit/test/build-errors/apps/prerender-remote-function-error/src/routes/data.remote.ts new file mode 100644 index 000000000000..23270e9ac3d7 --- /dev/null +++ b/packages/kit/test/build-errors/apps/prerender-remote-function-error/src/routes/data.remote.ts @@ -0,0 +1,5 @@ +import { prerender } from '$app/server'; + +export const throws = prerender(() => { + throw new Error('remote function blew up'); +}); diff --git a/packages/kit/test/build-errors/apps/prerender-remote-function-error/static/favicon.png b/packages/kit/test/build-errors/apps/prerender-remote-function-error/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..825b9e65af7c104cfb07089bb28659393b4f2097 GIT binary patch literal 1571 zcmV+;2Hg3HP)Px)-AP12RCwC$UE6KzI1p6{F2N z1VK2vi|pOpn{~#djwYcWXTI_im_u^TJgMZ4JMOsSj!0ma>B?-(Hr@X&W@|R-$}W@Z zgj#$x=!~7LGqHW?IO8+*oE1MyDp!G=L0#^lUx?;!fXv@l^6SvTnf^ac{5OurzC#ZMYc20lI%HhX816AYVs1T3heS1*WaWH z%;x>)-J}YB5#CLzU@GBR6sXYrD>Vw(Fmt#|JP;+}<#6b63Ike{Fuo!?M{yEffez;| zp!PfsuaC)>h>-AdbnwN13g*1LowNjT5?+lFVd#9$!8Z9HA|$*6dQ8EHLu}U|obW6f z2%uGv?vr=KNq7YYa2Roj;|zooo<)lf=&2yxM@e`kM$CmCR#x>gI>I|*Ubr({5Y^rb zghxQU22N}F51}^yfDSt786oMTc!W&V;d?76)9KXX1 z+6Okem(d}YXmmOiZq$!IPk5t8nnS{%?+vDFz3BevmFNgpIod~R{>@#@5x9zJKEHLHv!gHeK~n)Ld!M8DB|Kfe%~123&Hz1Z(86nU7*G5chmyDe ziV7$pB7pJ=96hpxHv9rCR29%bLOXlKU<_13_M8x)6;P8E1Kz6G<&P?$P^%c!M5`2` zfY2zg;VK5~^>TJGQzc+33-n~gKt{{of8GzUkWmU110IgI0DLxRIM>0US|TsM=L|@F z0Bun8U!cRB7-2apz=y-7*UxOxz@Z0)@QM)9wSGki1AZ38ceG7Q72z5`i;i=J`ILzL z@iUO?SBBG-0cQuo+an4TsLy-g-x;8P4UVwk|D8{W@U1Zi z!M)+jqy@nQ$p?5tsHp-6J304Q={v-B>66$P0IDx&YT(`IcZ~bZfmn11#rXd7<5s}y zBi9eim&zQc0Dk|2>$bs0PnLmDfMP5lcXRY&cvJ=zKxI^f0%-d$tD!`LBf9^jMSYUA zI8U?CWdY@}cRq6{5~y+)#h1!*-HcGW@+gZ4B};0OnC~`xQOyH19z*TA!!BJ%9s0V3F?CAJ{hTd#*tf+ur-W9MOURF-@B77_-OshsY}6 zOXRY=5%C^*26z?l)1=$bz30!so5tfABdSYzO+H=CpV~aaUefmjvfZ3Ttu9W&W3Iu6 zROlh0MFA5h;my}8lB0tAV-Rvc2Zs_CCSJnx@d`**$idgy-iMob4dJWWw|21b4NB=LfsYp0Aeh{Ov)yztQi;eL4y5 zMi>8^SzKqk8~k?UiQK^^-5d8c%bV?$F8%X~czyiaKCI2=UH { `Error: The entries export from /[slug]/[notSpecific] generated entry /whatever/specific, which was matched by /[slug]/specific - see the \`handleEntryGeneratorMismatch\` option in https://svelte.dev/docs/kit/configuration#prerender for more info.${EOL}To suppress or handle this error, implement \`handleEntryGeneratorMismatch\` in https://svelte.dev/docs/kit/configuration#prerender` ); }); + +test('an error in a `prerender` function should fail the build', { timeout }, () => { + assert.throws( + () => + execSync('pnpm build', { + cwd: path.join(process.cwd(), 'apps/prerender-remote-function-error'), + stdio: 'pipe', + timeout + }), + /remote function blew up/ + ); +}); From 71e9c01262aa59fbd89e5ed9f8d4aab63968c653 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 11 Sep 2025 11:44:31 -0400 Subject: [PATCH 4/4] repair lockfile --- pnpm-lock.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d8f1e8e508b1..7741f57fcb27 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -826,7 +826,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: 'catalog:' - version: 6.0.0-next.3(svelte@5.38.5)(vite@6.3.5(@types/node@18.19.119)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) + version: 6.0.0-next.3(svelte@5.38.5)(vite@6.3.6(@types/node@18.19.119)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) svelte: specifier: ^5.38.5 version: 5.38.5 @@ -838,7 +838,7 @@ importers: version: 5.8.3 vite: specifier: 'catalog:' - version: 6.3.5(@types/node@18.19.119)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) + version: 6.3.6(@types/node@18.19.119)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment: devDependencies: