diff --git a/.changeset/eight-news-laugh.md b/.changeset/eight-news-laugh.md new file mode 100644 index 0000000000..e120b19f5e --- /dev/null +++ b/.changeset/eight-news-laugh.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: ensure fork always accesses correct values diff --git a/packages/svelte/src/internal/client/reactivity/batch.js b/packages/svelte/src/internal/client/reactivity/batch.js index 27c90d7708..446bfbff26 100644 --- a/packages/svelte/src/internal/client/reactivity/batch.js +++ b/packages/svelte/src/internal/client/reactivity/batch.js @@ -15,7 +15,8 @@ import { DERIVED, BOUNDARY_EFFECT, EAGER_EFFECT, - HEAD_EFFECT + HEAD_EFFECT, + ERROR_VALUE } from '#client/constants'; import { async_mode_flag } from '../../flags/index.js'; import { deferred, define_property } from '../../shared/utils.js'; @@ -285,12 +286,16 @@ export class Batch { this.previous.set(source, value); } - this.current.set(source, source.v); - batch_values?.set(source, source.v); + // Don't save this as it would mean it's not thrown in the `runtime.js#get` function + if ((source.f & ERROR_VALUE) === 0) { + this.current.set(source, source.v); + batch_values?.set(source, source.v); + } } activate() { current_batch = this; + this.apply(); } deactivate() { @@ -492,7 +497,7 @@ export class Batch { } apply() { - if (!async_mode_flag || batches.size === 1) return; + if (!async_mode_flag || (!this.is_fork && batches.size === 1)) return; // if there are multiple batches, we are 'time travelling' — // we need to override values with the ones in this batch... diff --git a/packages/svelte/tests/runtime-runes/samples/async-fork-if/Child.svelte b/packages/svelte/tests/runtime-runes/samples/async-fork-if/Child.svelte new file mode 100644 index 0000000000..6ef7d03eea --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-fork-if/Child.svelte @@ -0,0 +1,8 @@ + + +{x} diff --git a/packages/svelte/tests/runtime-runes/samples/async-fork-if/_config.js b/packages/svelte/tests/runtime-runes/samples/async-fork-if/_config.js new file mode 100644 index 0000000000..1bc168d9ae --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-fork-if/_config.js @@ -0,0 +1,12 @@ +import { test } from '../../test'; + +export default test({ + async test({ assert, target, logs }) { + const btn = target.querySelector('button'); + + btn?.click(); + await new Promise((r) => setTimeout(r, 2)); + assert.htmlEqual(target.innerHTML, ` universe`); + assert.deepEqual(logs, ['universe', 'universe']); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/async-fork-if/main.svelte b/packages/svelte/tests/runtime-runes/samples/async-fork-if/main.svelte new file mode 100644 index 0000000000..625040ec13 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-fork-if/main.svelte @@ -0,0 +1,17 @@ + + + + +{#if x === 'universe'} + +{/if}