diff --git a/.changeset/orange-crews-rescue.md b/.changeset/orange-crews-rescue.md
new file mode 100644
index 0000000000..e45228711e
--- /dev/null
+++ b/.changeset/orange-crews-rescue.md
@@ -0,0 +1,5 @@
+---
+"svelte": patch
+---
+
+fix: improve handling of object property deletions
diff --git a/packages/svelte/src/internal/client/proxy.js b/packages/svelte/src/internal/client/proxy.js
index 0fff0447c0..b988bb4c55 100644
--- a/packages/svelte/src/internal/client/proxy.js
+++ b/packages/svelte/src/internal/client/proxy.js
@@ -157,7 +157,7 @@ const state_proxy_handler = {
}
if (s !== undefined) set(s, UNINITIALIZED);
- if (prop in target) update(metadata.v);
+ if (boolean) update(metadata.v);
return boolean;
},
diff --git a/packages/svelte/tests/runtime-runes/samples/state-delete-property/_config.js b/packages/svelte/tests/runtime-runes/samples/state-delete-property/_config.js
new file mode 100644
index 0000000000..ebf98bd8d4
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/state-delete-property/_config.js
@@ -0,0 +1,16 @@
+import { test } from '../../test';
+
+export default test({
+ compileOptions: {
+ dev: true
+ },
+
+ html: ``,
+
+ async test({ assert, target }) {
+ const btn = target.querySelector('button');
+
+ await btn?.click();
+ assert.htmlEqual(target.innerHTML, ``);
+ }
+});
diff --git a/packages/svelte/tests/runtime-runes/samples/state-delete-property/main.svelte b/packages/svelte/tests/runtime-runes/samples/state-delete-property/main.svelte
new file mode 100644
index 0000000000..eda330f088
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/state-delete-property/main.svelte
@@ -0,0 +1,28 @@
+
+
+
+
+
diff --git a/packages/svelte/tests/runtime-runes/samples/state-readonly/Component.svelte b/packages/svelte/tests/runtime-runes/samples/state-readonly/Component.svelte
deleted file mode 100644
index 9916a9abe0..0000000000
--- a/packages/svelte/tests/runtime-runes/samples/state-readonly/Component.svelte
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
a,b,c
{"a":1,"b":2,"c":3}
', async test({ assert, target }) { - const btn = target.querySelector('button'); + const [btn, bt2] = target.querySelectorAll('button'); await btn?.click(); - assert.htmlEqual(target.innerHTML, `\n[object Object]`); + assert.htmlEqual( + target.innerHTML, + `a,b,c
{"a":1,"b":2,"c":3}
` + ); + + await bt2?.click(); + assert.htmlEqual( + target.innerHTML, + `a,c
{"a":1,"c":3}
` + ); } }); diff --git a/packages/svelte/tests/runtime-runes/samples/state-readonly/main.svelte b/packages/svelte/tests/runtime-runes/samples/state-readonly/main.svelte index ec6cc9aeba..974742a231 100644 --- a/packages/svelte/tests/runtime-runes/samples/state-readonly/main.svelte +++ b/packages/svelte/tests/runtime-runes/samples/state-readonly/main.svelte @@ -1,12 +1,8 @@ - -{#if state} -{Object.keys(numbers)}
+{JSON.stringify(numbers)}