From d798dfee0d20743c0d60680bbe984f0398594c8e Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Tue, 24 Feb 2026 22:57:38 +0100 Subject: [PATCH] fix: set server context after async transformError This will get the tests in https://github.com/sveltejs/kit/pull/15308 green, right now they fail because page state cannot be found because context not available --- .changeset/gentle-emus-walk.md | 5 +++++ .../svelte/src/internal/server/renderer.js | 1 + .../samples/async-error-boundary-3/_config.js | 16 ++++++++++++++++ .../async-error-boundary-3/child.svelte | 14 ++++++++++++++ .../async-error-boundary-3/main.svelte | 19 +++++++++++++++++++ 5 files changed, 55 insertions(+) create mode 100644 .changeset/gentle-emus-walk.md create mode 100644 packages/svelte/tests/runtime-runes/samples/async-error-boundary-3/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/async-error-boundary-3/child.svelte create mode 100644 packages/svelte/tests/runtime-runes/samples/async-error-boundary-3/main.svelte diff --git a/.changeset/gentle-emus-walk.md b/.changeset/gentle-emus-walk.md new file mode 100644 index 0000000000..760b952856 --- /dev/null +++ b/.changeset/gentle-emus-walk.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: set server context after async transformError diff --git a/packages/svelte/src/internal/server/renderer.js b/packages/svelte/src/internal/server/renderer.js index 9f71d53f6d..c6966090dc 100644 --- a/packages/svelte/src/internal/server/renderer.js +++ b/packages/svelte/src/internal/server/renderer.js @@ -293,6 +293,7 @@ export class Renderer { } child.promise = /** @type {Promise} */ (result).then((transformed) => { + set_ssr_context(parent_context); child.#out.push(``); failed_snippet(child, transformed, noop); child.#out.push(BLOCK_CLOSE); diff --git a/packages/svelte/tests/runtime-runes/samples/async-error-boundary-3/_config.js b/packages/svelte/tests/runtime-runes/samples/async-error-boundary-3/_config.js new file mode 100644 index 0000000000..02daf60bc6 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-error-boundary-3/_config.js @@ -0,0 +1,16 @@ +import { tick } from 'svelte'; +import { test } from '../../test'; + +export default test({ + solo: true, + mode: ['hydrate', 'async-server', 'client'], + ssrHtml: '

caught: error (hello)

', + transformError: () => { + return Promise.resolve('error'); + }, + + async test({ assert, target }) { + await tick(); + assert.htmlEqual(target.innerHTML, '

caught: error (hello)

'); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/async-error-boundary-3/child.svelte b/packages/svelte/tests/runtime-runes/samples/async-error-boundary-3/child.svelte new file mode 100644 index 0000000000..90d4c14cfc --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-error-boundary-3/child.svelte @@ -0,0 +1,14 @@ + + +{#if error} +

caught: {await error} ({context})

+{:else} + {(() => { + throw 'catch me'; + })()} +{/if} diff --git a/packages/svelte/tests/runtime-runes/samples/async-error-boundary-3/main.svelte b/packages/svelte/tests/runtime-runes/samples/async-error-boundary-3/main.svelte new file mode 100644 index 0000000000..a467f7500f --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-error-boundary-3/main.svelte @@ -0,0 +1,19 @@ + + + + + + {#snippet failed(error)} + + {/snippet} + + +