From 692dcacdd58498decd43ad260047d8818b98c1f1 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Tue, 30 Jan 2024 16:42:59 +0000 Subject: [PATCH] fix: improve handling of unowned derived signals --- .changeset/slimy-laws-explode.md | 5 +++++ packages/svelte/src/internal/client/runtime.js | 10 ++++++++-- .../samples/derived-unowned-2/Component.svelte | 12 ++++++++++++ .../samples/derived-unowned-2/_config.js | 15 +++++++++++++++ .../samples/derived-unowned-2/main.svelte | 17 +++++++++++++++++ 5 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 .changeset/slimy-laws-explode.md create mode 100644 packages/svelte/tests/runtime-runes/samples/derived-unowned-2/Component.svelte create mode 100644 packages/svelte/tests/runtime-runes/samples/derived-unowned-2/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/derived-unowned-2/main.svelte diff --git a/.changeset/slimy-laws-explode.md b/.changeset/slimy-laws-explode.md new file mode 100644 index 000000000000..b3548bd11f4f --- /dev/null +++ b/.changeset/slimy-laws-explode.md @@ -0,0 +1,5 @@ +--- +"svelte": patch +--- + +fix: improve handling of unowned derived signals diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index e0d5d1087182..41bc9416f090 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -623,8 +623,14 @@ function process_microtask() { export function schedule_effect(signal, sync) { const flags = signal.f; if (sync) { - execute_effect(signal); - set_signal_status(signal, CLEAN); + const previously_flushing_effect = is_flushing_effect; + try { + is_flushing_effect = true; + execute_effect(signal); + set_signal_status(signal, CLEAN); + } finally { + is_flushing_effect = previously_flushing_effect; + } } else { if (current_scheduler_mode === FLUSH_MICROTASK) { if (!is_micro_task_queued) { diff --git a/packages/svelte/tests/runtime-runes/samples/derived-unowned-2/Component.svelte b/packages/svelte/tests/runtime-runes/samples/derived-unowned-2/Component.svelte new file mode 100644 index 000000000000..8c64dca9a94e --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/derived-unowned-2/Component.svelte @@ -0,0 +1,12 @@ + diff --git a/packages/svelte/tests/runtime-runes/samples/derived-unowned-2/_config.js b/packages/svelte/tests/runtime-runes/samples/derived-unowned-2/_config.js new file mode 100644 index 000000000000..c9d17a200a4c --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/derived-unowned-2/_config.js @@ -0,0 +1,15 @@ +import { test } from '../../test'; + +export default test({ + html: '
d2: 3
d3: 3
d4: 3
', + skip_if_hydrate: 'permanent', + + async test({ assert, target }) { + await Promise.resolve(); + await Promise.resolve(); + assert.htmlEqual( + target.innerHTML, + '
d2: 3,4,5
d3: 3,4,5
d4: 3,4,5
' + ); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/derived-unowned-2/main.svelte b/packages/svelte/tests/runtime-runes/samples/derived-unowned-2/main.svelte new file mode 100644 index 000000000000..6db51236bcbd --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/derived-unowned-2/main.svelte @@ -0,0 +1,17 @@ + + +
d2: {d2.join(',')}
+
d3: {d3.join(',')}
+
d4: {d3.join(',')}