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(',')}