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 @@ - - - - diff --git a/packages/svelte/tests/runtime-runes/samples/state-readonly/Component2.svelte b/packages/svelte/tests/runtime-runes/samples/state-readonly/Component2.svelte deleted file mode 100644 index 88575acd3c..0000000000 --- a/packages/svelte/tests/runtime-runes/samples/state-readonly/Component2.svelte +++ /dev/null @@ -1,5 +0,0 @@ - - -{state} diff --git a/packages/svelte/tests/runtime-runes/samples/state-readonly/_config.js b/packages/svelte/tests/runtime-runes/samples/state-readonly/_config.js index a1f7effeae..dab129d80e 100644 --- a/packages/svelte/tests/runtime-runes/samples/state-readonly/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/state-readonly/_config.js @@ -1,13 +1,20 @@ import { test } from '../../test'; export default test({ - compileOptions: { - dev: true - }, + html: '

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} - -{/if} + + +

{Object.keys(numbers)}

+

{JSON.stringify(numbers)}