From 4e417e1ee2b5ae32cbf61e4b5dc1e8e643e89a9e Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 26 Feb 2025 16:35:58 -0500 Subject: [PATCH] fix --- .../src/internal/client/reactivity/forks.js | 2 -- .../src/internal/client/reactivity/sources.js | 5 ++- .../svelte/src/internal/client/runtime.js | 32 +++++++++++-------- .../samples/async-error/_config.js | 6 +++- .../samples/async-error/main.svelte | 2 +- 5 files changed, 28 insertions(+), 19 deletions(-) diff --git a/packages/svelte/src/internal/client/reactivity/forks.js b/packages/svelte/src/internal/client/reactivity/forks.js index 413815132d..9c92f27f4f 100644 --- a/packages/svelte/src/internal/client/reactivity/forks.js +++ b/packages/svelte/src/internal/client/reactivity/forks.js @@ -1,8 +1,6 @@ /** @import { Effect, Source } from '#client' */ import { noop } from '../../shared/utils.js'; -import { DIRTY } from '../constants.js'; import { flushSync } from '../runtime.js'; -import { internal_set, mark_reactions } from './sources.js'; /** @type {Set} */ const forks = new Set(); diff --git a/packages/svelte/src/internal/client/reactivity/sources.js b/packages/svelte/src/internal/client/reactivity/sources.js index 4bdd99260c..85736d001b 100644 --- a/packages/svelte/src/internal/client/reactivity/sources.js +++ b/packages/svelte/src/internal/client/reactivity/sources.js @@ -14,7 +14,8 @@ import { derived_sources, set_derived_sources, check_dirtiness, - untracking + untracking, + queue_flush } from '../runtime.js'; import { equals, safe_equals } from './equality.js'; import { @@ -221,6 +222,8 @@ export function internal_set(source, value) { inspect_effects.clear(); } + + queue_flush(); } return value; diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 4ec4a11be9..eef109b8a3 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -742,6 +742,24 @@ function flush_queued_effects(effects) { * @returns {void} */ export function schedule_effect(signal) { + queue_flush(); + + var effect = (last_scheduled_effect = signal); + + while (effect.parent !== null) { + effect = effect.parent; + var flags = effect.f; + + if ((flags & (ROOT_EFFECT | BRANCH_EFFECT)) !== 0) { + if ((flags & CLEAN) === 0) return; + effect.f ^= CLEAN; + } + } + + queued_root_effects.push(effect); +} + +export function queue_flush() { if (!is_flushing) { is_flushing = true; queueMicrotask(() => { @@ -757,20 +775,6 @@ export function schedule_effect(signal) { remove_active_fork(); }); } - - var effect = (last_scheduled_effect = signal); - - while (effect.parent !== null) { - effect = effect.parent; - var flags = effect.f; - - if ((flags & (ROOT_EFFECT | BRANCH_EFFECT)) !== 0) { - if ((flags & CLEAN) === 0) return; - effect.f ^= CLEAN; - } - } - - queued_root_effects.push(effect); } /** diff --git a/packages/svelte/tests/runtime-runes/samples/async-error/_config.js b/packages/svelte/tests/runtime-runes/samples/async-error/_config.js index 87e7764b3b..8f6975f6fb 100644 --- a/packages/svelte/tests/runtime-runes/samples/async-error/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/async-error/_config.js @@ -13,10 +13,14 @@ export default test({ flushSync(); assert.htmlEqual( target.innerHTML, - '

oops!

' + '

oops!

' ); flushSync(() => button2.click()); + + const reset = /** @type {HTMLButtonElement} */ (target.querySelector('[data-id="reset"]')); + flushSync(() => reset.click()); + assert.htmlEqual( target.innerHTML, '

pending

' diff --git a/packages/svelte/tests/runtime-runes/samples/async-error/main.svelte b/packages/svelte/tests/runtime-runes/samples/async-error/main.svelte index 547255c4c4..9af5bbaa16 100644 --- a/packages/svelte/tests/runtime-runes/samples/async-error/main.svelte +++ b/packages/svelte/tests/runtime-runes/samples/async-error/main.svelte @@ -15,6 +15,6 @@ {#snippet failed(error, reset)}

{error.message}

- + {/snippet}