diff --git a/.changeset/nervous-dolls-clean.md b/.changeset/nervous-dolls-clean.md new file mode 100644 index 0000000000..5b31bdd3c7 --- /dev/null +++ b/.changeset/nervous-dolls-clean.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: avoid double-calling a derived reference when destructuring `$derived` of another `$derived` during server-side rendering diff --git a/packages/svelte/src/compiler/phases/3-transform/server/visitors/VariableDeclaration.js b/packages/svelte/src/compiler/phases/3-transform/server/visitors/VariableDeclaration.js index 2c7b14afa5..108f65a884 100644 --- a/packages/svelte/src/compiler/phases/3-transform/server/visitors/VariableDeclaration.js +++ b/packages/svelte/src/compiler/phases/3-transform/server/visitors/VariableDeclaration.js @@ -102,9 +102,11 @@ export function VariableDeclaration(node, context) { } else { const call = /** @type {CallExpression} */ (declarator.init); - let rhs = value; + // - cannot be a SpreadElement because refused during analysis + // - use args[0] rather than value to avoid visiting twice (above in const value = ... and below in for-ofs) + let rhs = /** @type {Expression} */ (call.arguments[0]); - if (rune !== '$derived' || call.arguments[0].type !== 'Identifier') { + if (rune === '$derived.by' || call.arguments[0].type !== 'Identifier') { const id = b.id(context.state.scope.generate('$$d')); rhs = b.call(id); diff --git a/packages/svelte/tests/runtime-runes/samples/derived-destructured-from-derived/_config.js b/packages/svelte/tests/runtime-runes/samples/derived-destructured-from-derived/_config.js new file mode 100644 index 0000000000..a36c2adf7d --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/derived-destructured-from-derived/_config.js @@ -0,0 +1,5 @@ +import { test } from '../../test'; + +export default test({ + html: `` +}); diff --git a/packages/svelte/tests/runtime-runes/samples/derived-destructured-from-derived/main.svelte b/packages/svelte/tests/runtime-runes/samples/derived-destructured-from-derived/main.svelte new file mode 100644 index 0000000000..b1882243f4 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/derived-destructured-from-derived/main.svelte @@ -0,0 +1,8 @@ + + + +