From b3084bc555f6aee1aa3e995d0b03cd0d25bfd93c Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Sat, 6 Apr 2024 14:02:04 +0100 Subject: [PATCH 1/3] fix: improve handled of unowned derived signals --- packages/svelte/src/internal/client/runtime.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 28428c1fb78a..c1b8ee3e441a 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -194,9 +194,21 @@ export function check_dirtiness(reaction) { // is also dirty. var version = dependency.version; - if (is_unowned && version > /** @type {import('#client').Derived} */ (reaction).version) { - /** @type {import('#client').Derived} */ (reaction).version = version; - return true; + if (is_unowned) { + if (version > /** @type {import('#client').Derived} */ (reaction).version) { + /** @type {import('#client').Derived} */ (reaction).version = version; + return true; + } else if (!current_skip_reaction && !dependency?.reactions?.includes(reaction)) { + // If we are working with an unowned signal as part of an effect (due to !current_skip_reaction) + // and the version hasn't changed, we still need to check that this reaction + // if linked to the dependency source – otherwise future updates will not be caught. + var reactions = dependency.reactions; + if (reactions === null) { + dependency.reactions = [reaction]; + } else { + reactions.push(reaction); + } + } } } } From d0bd660b835bfa3a5feadad537049594273015f5 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Sat, 6 Apr 2024 14:02:18 +0100 Subject: [PATCH 2/3] fix: improve handled of unowned derived signals --- .changeset/rich-garlics-laugh.md | 5 +++ .../samples/derived-unowned-5/_config.js | 15 ++++++++ .../samples/derived-unowned-5/main.svelte | 34 +++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 .changeset/rich-garlics-laugh.md create mode 100644 packages/svelte/tests/runtime-runes/samples/derived-unowned-5/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/derived-unowned-5/main.svelte diff --git a/.changeset/rich-garlics-laugh.md b/.changeset/rich-garlics-laugh.md new file mode 100644 index 000000000000..c9230dfb8019 --- /dev/null +++ b/.changeset/rich-garlics-laugh.md @@ -0,0 +1,5 @@ +--- +"svelte": patch +--- + +fix: improve handled of unowned derived signals diff --git a/packages/svelte/tests/runtime-runes/samples/derived-unowned-5/_config.js b/packages/svelte/tests/runtime-runes/samples/derived-unowned-5/_config.js new file mode 100644 index 000000000000..65a389124cd3 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/derived-unowned-5/_config.js @@ -0,0 +1,15 @@ +import { test } from '../../test'; + +export default test({ + async test({ assert, target }) { + // The test has a bunch of queueMicrotasks + await Promise.resolve(); + await Promise.resolve(); + await Promise.resolve(); + + assert.htmlEqual( + target.innerHTML, + `
Zeeba Neighba
` + ); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/derived-unowned-5/main.svelte b/packages/svelte/tests/runtime-runes/samples/derived-unowned-5/main.svelte new file mode 100644 index 000000000000..388986946166 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/derived-unowned-5/main.svelte @@ -0,0 +1,34 @@ + + + + +
{model.thing?.name}
From b53e5ca1f6f1f938357c035ad96adcedd90741e2 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Sat, 6 Apr 2024 14:04:46 +0100 Subject: [PATCH 3/3] lint --- .../tests/runtime-runes/samples/derived-unowned-5/_config.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/svelte/tests/runtime-runes/samples/derived-unowned-5/_config.js b/packages/svelte/tests/runtime-runes/samples/derived-unowned-5/_config.js index 65a389124cd3..20c3cc112e31 100644 --- a/packages/svelte/tests/runtime-runes/samples/derived-unowned-5/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/derived-unowned-5/_config.js @@ -7,9 +7,6 @@ export default test({ await Promise.resolve(); await Promise.resolve(); - assert.htmlEqual( - target.innerHTML, - `
Zeeba Neighba
` - ); + assert.htmlEqual(target.innerHTML, `
Zeeba Neighba
`); } });