From 26e574f27f6866383044a85da9d6845944bd0fe2 Mon Sep 17 00:00:00 2001
From: Simon H <5968653+dummdidumm@users.noreply.github.com>
Date: Mon, 14 Apr 2025 14:57:37 +0200
Subject: [PATCH] fix: ignore mutation validation for props that are not
proxies in more cases (#15759)
This fixes an off-by-one error - we did not bail if the top level of the prop wasn't a state already. Fixes #15727
---
.changeset/modern-ducks-reflect.md | 5 +++++
.../src/internal/client/dev/ownership.js | 7 ++++---
.../samples/non-local-mutation-ok/_config.js | 18 ++++++++++++++++
.../non-local-mutation-ok/child.svelte | 8 +++++++
.../samples/non-local-mutation-ok/main.svelte | 21 +++++++++++++++++++
5 files changed, 56 insertions(+), 3 deletions(-)
create mode 100644 .changeset/modern-ducks-reflect.md
create mode 100644 packages/svelte/tests/runtime-runes/samples/non-local-mutation-ok/_config.js
create mode 100644 packages/svelte/tests/runtime-runes/samples/non-local-mutation-ok/child.svelte
create mode 100644 packages/svelte/tests/runtime-runes/samples/non-local-mutation-ok/main.svelte
diff --git a/.changeset/modern-ducks-reflect.md b/.changeset/modern-ducks-reflect.md
new file mode 100644
index 0000000000..dfbb9a18cc
--- /dev/null
+++ b/.changeset/modern-ducks-reflect.md
@@ -0,0 +1,5 @@
+---
+'svelte': patch
+---
+
+fix: ignore mutation validation for props that are not proxies in more cases
diff --git a/packages/svelte/src/internal/client/dev/ownership.js b/packages/svelte/src/internal/client/dev/ownership.js
index 108c7adf92..5a8af6d522 100644
--- a/packages/svelte/src/internal/client/dev/ownership.js
+++ b/packages/svelte/src/internal/client/dev/ownership.js
@@ -31,13 +31,14 @@ export function create_ownership_validator(props) {
return result;
}
- let value = props[name];
+ /** @type {any} */
+ let value = props;
- for (let i = 1; i < path.length - 1; i++) {
+ for (let i = 0; i < path.length - 1; i++) {
+ value = value[path[i]];
if (!value?.[STATE_SYMBOL]) {
return result;
}
- value = value[path[i]];
}
const location = sanitize_location(`${component[FILENAME]}:${line}:${column}`);
diff --git a/packages/svelte/tests/runtime-runes/samples/non-local-mutation-ok/_config.js b/packages/svelte/tests/runtime-runes/samples/non-local-mutation-ok/_config.js
new file mode 100644
index 0000000000..437385e185
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/non-local-mutation-ok/_config.js
@@ -0,0 +1,18 @@
+import { flushSync } from 'svelte';
+import { test } from '../../test';
+
+export default test({
+ compileOptions: {
+ dev: true
+ },
+
+ test({ assert, target, warnings }) {
+ const btn = target.querySelector('button');
+ btn?.click();
+ flushSync();
+
+ assert.deepEqual(warnings, []);
+ },
+
+ warnings: []
+});
diff --git a/packages/svelte/tests/runtime-runes/samples/non-local-mutation-ok/child.svelte b/packages/svelte/tests/runtime-runes/samples/non-local-mutation-ok/child.svelte
new file mode 100644
index 0000000000..0243a6c7d1
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/non-local-mutation-ok/child.svelte
@@ -0,0 +1,8 @@
+
+
+
diff --git a/packages/svelte/tests/runtime-runes/samples/non-local-mutation-ok/main.svelte b/packages/svelte/tests/runtime-runes/samples/non-local-mutation-ok/main.svelte
new file mode 100644
index 0000000000..8685664ab1
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/non-local-mutation-ok/main.svelte
@@ -0,0 +1,21 @@
+
+
+