From 5ad1b3d0c62ca49ed10da85989e692196502fd3d Mon Sep 17 00:00:00 2001 From: clean99 <53188310+clean99@users.noreply.github.com> Date: Sat, 31 Oct 2026 17:56:25 +0800 Subject: [PATCH] fix(svelte-virtual): preserve options when resubscribing --- .changeset/quick-lists-return.md | 5 ++++ packages/svelte-virtual/src/index.ts | 2 +- packages/svelte-virtual/tests/index.test.ts | 33 +++++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 .changeset/quick-lists-return.md diff --git a/.changeset/quick-lists-return.md b/.changeset/quick-lists-return.md new file mode 100644 index 000000000..0fef67600 --- /dev/null +++ b/.changeset/quick-lists-return.md @@ -0,0 +1,5 @@ +--- +'@tanstack/svelte-virtual': patch +--- + +Preserve updated virtualizer options when a Svelte store is resubscribed. diff --git a/packages/svelte-virtual/src/index.ts b/packages/svelte-virtual/src/index.ts index 18b1a62f0..49eb96cef 100644 --- a/packages/svelte-virtual/src/index.ts +++ b/packages/svelte-virtual/src/index.ts @@ -63,7 +63,7 @@ function createVirtualizerBase< } virtualizerWritable = writable(virtualizer, () => { - setOptions(initialOptions) + setOptions({}) return virtualizer._didMount() }) diff --git a/packages/svelte-virtual/tests/index.test.ts b/packages/svelte-virtual/tests/index.test.ts index 91ebc4259..b0de1eb78 100644 --- a/packages/svelte-virtual/tests/index.test.ts +++ b/packages/svelte-virtual/tests/index.test.ts @@ -95,6 +95,39 @@ describe.each([ } }) + test('preserves updated options when the store is resubscribed', () => { + const onChange = vi.fn() + const nextOnChange = vi.fn() + const store = create({ + count: 100, + estimateSize: () => 40, + getScrollElement: () => null, + onChange, + }) + const unsubscribe = store.subscribe(() => {}) + const virtualizer = get(store) + virtualizer.setOptions({ count: 110, onChange: nextOnChange }) + unsubscribe() + + const subscriber = vi.fn() + const resubscribe = store.subscribe(subscriber) + + try { + expect(virtualizer.options.count).toBe(110) + expect(virtualizer.getTotalSize()).toBe(4400) + onChange.mockClear() + nextOnChange.mockClear() + subscriber.mockClear() + virtualizer.measure() + + expect(onChange).not.toHaveBeenCalled() + expect(nextOnChange).toHaveBeenCalledExactlyOnceWith(virtualizer, false) + expect(subscriber).toHaveBeenCalledExactlyOnceWith(virtualizer) + } finally { + resubscribe() + } + }) + test('updates the store when no onChange was supplied', () => { const subscriber = vi.fn() const store = create({