diff --git a/.changeset/shaggy-frogs-fetch.md b/.changeset/shaggy-frogs-fetch.md new file mode 100644 index 0000000000..7dc7b8b920 --- /dev/null +++ b/.changeset/shaggy-frogs-fetch.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: ensure toStore subscription correctly syncs latest value diff --git a/packages/svelte/src/store/index-client.js b/packages/svelte/src/store/index-client.js index 98f6cf5ac1..f2f1dfc4eb 100644 --- a/packages/svelte/src/store/index-client.js +++ b/packages/svelte/src/store/index-client.js @@ -42,8 +42,11 @@ export { derived, get, readable, readonly, writable } from './shared/index.js'; * @returns {Writable | Readable} */ export function toStore(get, set) { - const store = writable(get(), (set) => { - let ran = false; + let init_value = get(); + const store = writable(init_value, (set) => { + // If the value has changed before we call subscribe, then + // we need to treat the value as already having run + let ran = init_value !== get(); // TODO do we need a different implementation on the server? const teardown = effect_root(() => { diff --git a/packages/svelte/tests/runtime-runes/samples/toStore-subscribe/_config.js b/packages/svelte/tests/runtime-runes/samples/toStore-subscribe/_config.js new file mode 100644 index 0000000000..471fed7e09 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/toStore-subscribe/_config.js @@ -0,0 +1,6 @@ +import { test } from '../../test'; + +export default test({ + html: `1`, + mode: ['client', 'hydrate'] +}); diff --git a/packages/svelte/tests/runtime-runes/samples/toStore-subscribe/main.svelte b/packages/svelte/tests/runtime-runes/samples/toStore-subscribe/main.svelte new file mode 100644 index 0000000000..61e0cbe5b6 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/toStore-subscribe/main.svelte @@ -0,0 +1,14 @@ + + +{$store}