diff --git a/.changeset/strong-berries-fry.md b/.changeset/strong-berries-fry.md new file mode 100644 index 000000000000..60dbb290a854 --- /dev/null +++ b/.changeset/strong-berries-fry.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: store forked derived values diff --git a/packages/svelte/src/internal/client/reactivity/batch.js b/packages/svelte/src/internal/client/reactivity/batch.js index 22526df7c1f2..8f63922ab26e 100644 --- a/packages/svelte/src/internal/client/reactivity/batch.js +++ b/packages/svelte/src/internal/client/reactivity/batch.js @@ -958,12 +958,15 @@ export function fork(fn) { var batch = Batch.ensure(); batch.is_fork = true; + batch_values = new Map(); var committed = false; var settled = batch.settled(); flushSync(fn); + batch_values = null; + // revert state changes for (var [source, value] of batch.previous) { source.v = value; diff --git a/packages/svelte/src/internal/client/reactivity/deriveds.js b/packages/svelte/src/internal/client/reactivity/deriveds.js index 39e02be7649e..3bf38bf0b2a4 100644 --- a/packages/svelte/src/internal/client/reactivity/deriveds.js +++ b/packages/svelte/src/internal/client/reactivity/deriveds.js @@ -378,7 +378,7 @@ export function update_derived(derived) { if (batch_values !== null) { // only cache the value if we're in a tracking context, otherwise we won't // clear the cache in `mark_reactions` when dependencies are updated - if (effect_tracking()) { + if (effect_tracking() || current_batch?.is_fork) { batch_values.set(derived, value); } } else { diff --git a/packages/svelte/tests/runtime-runes/samples/fork-derived-value-immediate/_config.js b/packages/svelte/tests/runtime-runes/samples/fork-derived-value-immediate/_config.js new file mode 100644 index 000000000000..52478687e50e --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/fork-derived-value-immediate/_config.js @@ -0,0 +1,15 @@ +import { flushSync } from 'svelte'; +import { test } from '../../test'; + +export default test({ + skip_no_async: true, + async test({ assert, target, logs }) { + const fork = target.querySelector('button'); + + flushSync(() => { + fork?.click(); + }); + + assert.deepEqual(logs, [1]); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/fork-derived-value-immediate/main.svelte b/packages/svelte/tests/runtime-runes/samples/fork-derived-value-immediate/main.svelte new file mode 100644 index 000000000000..fe3fa26195ce --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/fork-derived-value-immediate/main.svelte @@ -0,0 +1,13 @@ + + +