diff --git a/packages/svelte/src/compiler/phases/2-analyze/validation.js b/packages/svelte/src/compiler/phases/2-analyze/validation.js index 40244f97d0..f64b0268ab 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/validation.js +++ b/packages/svelte/src/compiler/phases/2-analyze/validation.js @@ -854,6 +854,13 @@ function validate_assignment(node, argument, state) { let left = /** @type {import('estree').Expression | import('estree').Super} */ (argument); + if (left.type === 'Identifier') { + const binding = state.scope.get(left.name); + if (binding?.kind === 'derived') { + error(node, 'invalid-derived-assignment'); + } + } + /** @type {import('estree').Expression | import('estree').PrivateIdentifier | null} */ let property = null; @@ -862,13 +869,6 @@ function validate_assignment(node, argument, state) { left = left.object; } - if (left.type === 'Identifier') { - const binding = state.scope.get(left.name); - if (binding?.kind === 'derived') { - error(node, 'invalid-derived-assignment'); - } - } - if (left.type === 'ThisExpression' && property?.type === 'PrivateIdentifier') { if (state.private_derived_state.includes(property.name)) { error(node, 'invalid-derived-assignment'); diff --git a/packages/svelte/tests/compiler-errors/samples/runes-no-derived-assignment/main.svelte b/packages/svelte/tests/compiler-errors/samples/runes-no-derived-assignment/main.svelte index f89cc7b6ba..3bf836f6c5 100644 --- a/packages/svelte/tests/compiler-errors/samples/runes-no-derived-assignment/main.svelte +++ b/packages/svelte/tests/compiler-errors/samples/runes-no-derived-assignment/main.svelte @@ -1,5 +1,5 @@ diff --git a/packages/svelte/tests/compiler-errors/samples/runes-no-derived-update/main.svelte b/packages/svelte/tests/compiler-errors/samples/runes-no-derived-update/main.svelte index a4aca48089..d266c95bb8 100644 --- a/packages/svelte/tests/compiler-errors/samples/runes-no-derived-update/main.svelte +++ b/packages/svelte/tests/compiler-errors/samples/runes-no-derived-update/main.svelte @@ -1,5 +1,5 @@ diff --git a/packages/svelte/tests/runtime-runes/samples/derived-proxy/_config.js b/packages/svelte/tests/runtime-runes/samples/derived-proxy/_config.js new file mode 100644 index 0000000000..32340d018a --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/derived-proxy/_config.js @@ -0,0 +1,15 @@ +import { test } from '../../test'; + +export default test({ + html: ``, + + async test({ assert, target }) { + const [btn1, btn2] = target.querySelectorAll('button'); + + await btn1?.click(); + assert.htmlEqual(target.innerHTML, ``); + + await btn2?.click(); + assert.htmlEqual(target.innerHTML, ``); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/derived-proxy/main.svelte b/packages/svelte/tests/runtime-runes/samples/derived-proxy/main.svelte new file mode 100644 index 0000000000..ddbc56aa7b --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/derived-proxy/main.svelte @@ -0,0 +1,7 @@ + + + +