From 435a9c1cd033dc4a31af9ba007eb7f5b6e24c488 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Wed, 30 Oct 2024 11:02:18 +0000 Subject: [PATCH] fix: ensure toStore subscription correctly syncs latest value (#14015) * fix: ensure toStore subscription correctly syncs latest value * Update packages/svelte/src/store/index-client.js --------- Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> --- .changeset/shaggy-frogs-fetch.md | 5 +++++ packages/svelte/src/store/index-client.js | 7 +++++-- .../samples/toStore-subscribe/_config.js | 6 ++++++ .../samples/toStore-subscribe/main.svelte | 14 ++++++++++++++ 4 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 .changeset/shaggy-frogs-fetch.md create mode 100644 packages/svelte/tests/runtime-runes/samples/toStore-subscribe/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/toStore-subscribe/main.svelte 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}