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}