From 34b13ac3e4a8c7919eb8d044a7c31d2d16f72678 Mon Sep 17 00:00:00 2001 From: Xia Chao Date: Fri, 11 Sep 2026 18:35:15 +0800 Subject: [PATCH] fix: keep `$state.eager` when used as a variable initializer (#18809) fixes #18808 If you write `let x = $state.eager(...)`, the client compiler used to delete that line and then still read `x`. The page crashed with `x is not defined`. Server rendering kept the binding. Using `$state.eager(...)` directly in the markup already worked. This puts the `let` / `const` form on the same path as `$state.snapshot`. Added a runtime-runes sample that fails without this change. Co-authored-by: Xia Chao <236466140+bun-unsafe@users.noreply.github.com> --- .changeset/state-eager-let-declaration.md | 5 +++++ .../3-transform/client/visitors/VariableDeclaration.js | 1 + .../samples/state-eager-declaration/_config.js | 5 +++++ .../samples/state-eager-declaration/main.svelte | 7 +++++++ 4 files changed, 18 insertions(+) create mode 100644 .changeset/state-eager-let-declaration.md create mode 100644 packages/svelte/tests/runtime-runes/samples/state-eager-declaration/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/state-eager-declaration/main.svelte diff --git a/.changeset/state-eager-let-declaration.md b/.changeset/state-eager-let-declaration.md new file mode 100644 index 0000000000..6939094109 --- /dev/null +++ b/.changeset/state-eager-let-declaration.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: keep `$state.eager` when used as a variable initializer diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/VariableDeclaration.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/VariableDeclaration.js index 246feaccf6..0ad52dc457 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/VariableDeclaration.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/VariableDeclaration.js @@ -35,6 +35,7 @@ export function VariableDeclaration(node, context) { rune === '$inspect' || rune === '$inspect.trace' || rune === '$state.snapshot' || + rune === '$state.eager' || rune === '$host' ) { declarations.push(/** @type {VariableDeclarator} */ (context.visit(declarator))); diff --git a/packages/svelte/tests/runtime-runes/samples/state-eager-declaration/_config.js b/packages/svelte/tests/runtime-runes/samples/state-eager-declaration/_config.js new file mode 100644 index 0000000000..61811ad0d6 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/state-eager-declaration/_config.js @@ -0,0 +1,5 @@ +import { test } from '../../test'; + +export default test({ + html: `

20

` +}); diff --git a/packages/svelte/tests/runtime-runes/samples/state-eager-declaration/main.svelte b/packages/svelte/tests/runtime-runes/samples/state-eager-declaration/main.svelte new file mode 100644 index 0000000000..ed5e175c55 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/state-eager-declaration/main.svelte @@ -0,0 +1,7 @@ + + +

{x}