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 @@
+
+
+
+