From 684cdba2538bd7cfc695fcd8516ecbd21b3c08b5 Mon Sep 17 00:00:00 2001 From: Artyom Alekseevich <47069814+FrankFMY@users.noreply.github.com> Date: Wed, 11 Feb 2026 21:53:23 +0100 Subject: [PATCH] fix: resolve effect_update_depth_exceeded with select bind:value in legacy mode (#17645) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Fixes #13768 `` elements, and call `invalidate_inner_signals` inline at the mutation point in `AssignmentExpression` — only when the binding is actually mutated, avoiding the read-write cycle. Based on the approach outlined in #16200. ## Changes - **`scope.js`**: Add `legacy_indirect_bindings` field to `Binding` class - **`RegularElement.js` (analyze)**: For `` with derived state in legacy mode diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js index c7b40109a3..bc65bd65db 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js @@ -16,6 +16,8 @@ import { regex_starts_with_newline } from '../../patterns.js'; import { check_element } from './shared/a11y/index.js'; import { validate_element } from './shared/element.js'; import { mark_subtree_dynamic } from './shared/fragment.js'; +import { object } from '../../../utils/ast.js'; +import { runes } from '../../../state.js'; /** * @param {AST.RegularElement} node @@ -64,6 +66,34 @@ export function RegularElement(node, context) { } } + // Special case: ` + + + + + `, + + async test({ assert, target, window, variant }) { + assert.htmlEqual( + target.innerHTML, + ` + + ` + ); + + const [select] = target.querySelectorAll('select'); + const options = target.querySelectorAll('option'); + + assert.equal(select.value, ''); + + const change = new window.Event('change'); + + // Select "UK" + options[2].selected = true; + await select.dispatchEvent(change); + + assert.equal(select.value, 'uk'); + } +}); diff --git a/packages/svelte/tests/runtime-legacy/samples/binding-select-reactive-derived/main.svelte b/packages/svelte/tests/runtime-legacy/samples/binding-select-reactive-derived/main.svelte new file mode 100644 index 0000000000..57342347f5 --- /dev/null +++ b/packages/svelte/tests/runtime-legacy/samples/binding-select-reactive-derived/main.svelte @@ -0,0 +1,21 @@ + + +