diff --git a/packages/svelte/src/internal/client/dom/blocks/boundary.js b/packages/svelte/src/internal/client/dom/blocks/boundary.js index a5d1ff4646..99c73d35e9 100644 --- a/packages/svelte/src/internal/client/dom/blocks/boundary.js +++ b/packages/svelte/src/internal/client/dom/blocks/boundary.js @@ -171,7 +171,7 @@ export function boundary(node, props, children) { for (var [signal, entry] of forks) { if (signal.v !== entry.v) { if ((signal.f & (DERIVED | ASYNC_DERIVED)) === 0) { - mark_reactions(signal, DIRTY, true); + mark_reactions(signal, DIRTY, undefined, true); signal.wv = increment_write_version(); } } diff --git a/packages/svelte/src/internal/client/reactivity/sources.js b/packages/svelte/src/internal/client/reactivity/sources.js index 549be19ce2..8588d607af 100644 --- a/packages/svelte/src/internal/client/reactivity/sources.js +++ b/packages/svelte/src/internal/client/reactivity/sources.js @@ -261,9 +261,10 @@ export function update_pre(source, d = 1) { /** * @param {Value} signal * @param {number} status should be DIRTY or MAYBE_DIRTY + * @param {Value} [parent] * @returns {void} */ -export function mark_reactions(signal, status, only_boundary = false) { +export function mark_reactions(signal, status, parent, only_boundary = false) { var reactions = signal.reactions; if (reactions === null) return; @@ -281,9 +282,10 @@ export function mark_reactions(signal, status, only_boundary = false) { if (!runes && reaction === active_effect) continue; if (only_boundary) { + var effect = /** @type {Effect} */ (reaction); if ((flags & DERIVED) === 0) { - var boundary = get_boundary(/** @type {Effect} */ (reaction)); - if (!boundary || (reaction.f & ASYNC_DERIVED) !== 0) { + var boundary = get_boundary(effect); + if (!boundary || ((reaction.f & ASYNC_DERIVED) !== 0 && !(signal.v instanceof Promise))) { continue; } } @@ -292,7 +294,7 @@ export function mark_reactions(signal, status, only_boundary = false) { if (boundary) { // @ts-ignore var forks = boundary.fn.forks; - if (reaction.deps?.every((d) => forks.has(d))) { + if (reaction.deps?.every((d) => forks.has(d)) || forks.has(parent)) { continue; } } @@ -309,7 +311,7 @@ export function mark_reactions(signal, status, only_boundary = false) { // If the signal a) was previously clean or b) is an unowned derived, then mark it if ((flags & (CLEAN | UNOWNED)) !== 0) { if ((flags & DERIVED) !== 0) { - mark_reactions(/** @type {Derived} */ (reaction), MAYBE_DIRTY, only_boundary); + mark_reactions(/** @type {Derived} */ (reaction), MAYBE_DIRTY, signal, only_boundary); } else { schedule_effect(/** @type {Effect} */ (reaction)); } diff --git a/packages/svelte/tests/runtime-runes/samples/async-derived-module/_config.js b/packages/svelte/tests/runtime-runes/samples/async-derived-module/_config.js index 4631243cb2..b14516e270 100644 --- a/packages/svelte/tests/runtime-runes/samples/async-derived-module/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/async-derived-module/_config.js @@ -30,6 +30,7 @@ export default test({ await tick(); assert.htmlEqual(target.innerHTML, '
42
'); + // This runs fine locally, but fails in CI by overfiring some effects? component.num = 2; await Promise.resolve(); await Promise.resolve(); diff --git a/packages/svelte/tests/runtime-runes/samples/async-derived/_config.js b/packages/svelte/tests/runtime-runes/samples/async-derived/_config.js index dbe76c573b..9398d012fe 100644 --- a/packages/svelte/tests/runtime-runes/samples/async-derived/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/async-derived/_config.js @@ -28,6 +28,7 @@ export default test({ flushSync(); assert.htmlEqual(target.innerHTML, '42
'); + // This runs fine locally, but fails in CI by overfiring some effects? component.num = 2; await Promise.resolve(); await Promise.resolve();