From 94efa638415ec68b7965d3d3bbcab3828a8cd112 Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Fri, 18 Apr 2025 16:10:28 +0200 Subject: [PATCH 1/3] fix: `update_version` after `delete` if `source` is `undefined` and `prop` in `target` --- .changeset/great-colts-film.md | 5 +++++ packages/svelte/src/internal/client/proxy.js | 1 + .../samples/delete-proxy-key/_config.js | 17 +++++++++++++++++ .../samples/delete-proxy-key/main.svelte | 12 ++++++++++++ svelte-renderer-api | 1 + 5 files changed, 36 insertions(+) create mode 100644 .changeset/great-colts-film.md create mode 100644 packages/svelte/tests/runtime-runes/samples/delete-proxy-key/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/delete-proxy-key/main.svelte create mode 160000 svelte-renderer-api diff --git a/.changeset/great-colts-film.md b/.changeset/great-colts-film.md new file mode 100644 index 000000000000..273509c107e8 --- /dev/null +++ b/.changeset/great-colts-film.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: `update_version` after `delete` if `source` is `undefined` and `prop` in `target` diff --git a/packages/svelte/src/internal/client/proxy.js b/packages/svelte/src/internal/client/proxy.js index d690790e3a78..fd5706eaf270 100644 --- a/packages/svelte/src/internal/client/proxy.js +++ b/packages/svelte/src/internal/client/proxy.js @@ -100,6 +100,7 @@ export function proxy(value) { prop, with_parent(() => source(UNINITIALIZED, stack)) ); + update_version(version); } } else { // When working with arrays, we need to also ensure we update the length when removing diff --git a/packages/svelte/tests/runtime-runes/samples/delete-proxy-key/_config.js b/packages/svelte/tests/runtime-runes/samples/delete-proxy-key/_config.js new file mode 100644 index 000000000000..0149502e9ec9 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/delete-proxy-key/_config.js @@ -0,0 +1,17 @@ +import { ok, test } from '../../test'; +import { flushSync } from 'svelte'; + +export default test({ + html: `

test

`, + + async test({ assert, target, instance }) { + const btn = target.querySelector('button'); + let p = target.querySelector('p'); + assert.equal(p?.innerHTML, 'test'); + flushSync(() => { + btn?.click(); + }); + p = target.querySelector('p'); + assert.equal(p, undefined); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/delete-proxy-key/main.svelte b/packages/svelte/tests/runtime-runes/samples/delete-proxy-key/main.svelte new file mode 100644 index 000000000000..458c25d5a651 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/delete-proxy-key/main.svelte @@ -0,0 +1,12 @@ + + + +{#each keys as key} +

{key}

+{/each} \ No newline at end of file diff --git a/svelte-renderer-api b/svelte-renderer-api new file mode 160000 index 000000000000..97817a95d6fa --- /dev/null +++ b/svelte-renderer-api @@ -0,0 +1 @@ +Subproject commit 97817a95d6fa2d3f72c03f04a1e0882a7650cd16 From 3e432d36fd2bc0537884e9967afeb659d68be8e9 Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Fri, 18 Apr 2025 16:16:01 +0200 Subject: [PATCH 2/3] chore: remove submodule --- svelte-renderer-api | 1 - 1 file changed, 1 deletion(-) delete mode 160000 svelte-renderer-api diff --git a/svelte-renderer-api b/svelte-renderer-api deleted file mode 160000 index 97817a95d6fa..000000000000 --- a/svelte-renderer-api +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 97817a95d6fa2d3f72c03f04a1e0882a7650cd16 From 57c73350364c87e5168d5214846b0f7a4144cdcf Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 18 Apr 2025 11:46:42 -0400 Subject: [PATCH 3/3] tweak test --- .../samples/delete-proxy-key/_config.js | 16 ++++++---------- .../samples/delete-proxy-key/main.svelte | 9 +++++---- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/packages/svelte/tests/runtime-runes/samples/delete-proxy-key/_config.js b/packages/svelte/tests/runtime-runes/samples/delete-proxy-key/_config.js index 0149502e9ec9..23141a01cd86 100644 --- a/packages/svelte/tests/runtime-runes/samples/delete-proxy-key/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/delete-proxy-key/_config.js @@ -1,17 +1,13 @@ -import { ok, test } from '../../test'; +import { test } from '../../test'; import { flushSync } from 'svelte'; export default test({ - html: `

test

`, + html: `

test

`, - async test({ assert, target, instance }) { + async test({ assert, target }) { const btn = target.querySelector('button'); - let p = target.querySelector('p'); - assert.equal(p?.innerHTML, 'test'); - flushSync(() => { - btn?.click(); - }); - p = target.querySelector('p'); - assert.equal(p, undefined); + + flushSync(() => btn?.click()); + assert.htmlEqual(target.innerHTML, ''); } }); diff --git a/packages/svelte/tests/runtime-runes/samples/delete-proxy-key/main.svelte b/packages/svelte/tests/runtime-runes/samples/delete-proxy-key/main.svelte index 458c25d5a651..d3c519c401c8 100644 --- a/packages/svelte/tests/runtime-runes/samples/delete-proxy-key/main.svelte +++ b/packages/svelte/tests/runtime-runes/samples/delete-proxy-key/main.svelte @@ -4,9 +4,10 @@ let keys = $derived(Object.keys(obj)); - + + {#each keys as key}

{key}

-{/each} \ No newline at end of file +{/each}