diff --git a/.changeset/little-hotels-poke.md b/.changeset/little-hotels-poke.md new file mode 100644 index 0000000000..50b60e2142 --- /dev/null +++ b/.changeset/little-hotels-poke.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: internally wrap store subscribe in untrack diff --git a/packages/svelte/src/store/utils.js b/packages/svelte/src/store/utils.js index d48036ea67..db2a62c68c 100644 --- a/packages/svelte/src/store/utils.js +++ b/packages/svelte/src/store/utils.js @@ -1,4 +1,5 @@ /** @import { Readable } from './public' */ +import { untrack } from '../index-client.js'; import { noop } from '../internal/shared/utils.js'; /** @@ -20,10 +21,13 @@ export function subscribe_to_store(store, run, invalidate) { } // Svelte store takes a private second argument - const unsub = store.subscribe( - run, - // @ts-expect-error - invalidate + // StartStopNotifier could mutate state, and we want to silence the corresponding validation error + const unsub = untrack(() => + store.subscribe( + run, + // @ts-expect-error + invalidate + ) ); // Also support RxJS diff --git a/packages/svelte/tests/runtime-runes/samples/store-unsubscribe-not-referenced-after/main.svelte b/packages/svelte/tests/runtime-runes/samples/store-unsubscribe-not-referenced-after/main.svelte index e097c639f0..5f8b19f4c7 100644 --- a/packages/svelte/tests/runtime-runes/samples/store-unsubscribe-not-referenced-after/main.svelte +++ b/packages/svelte/tests/runtime-runes/samples/store-unsubscribe-not-referenced-after/main.svelte @@ -1,5 +1,4 @@