From aaf562e731efeddf157d8c175c8edf1b75341a79 Mon Sep 17 00:00:00 2001 From: Simon Meyer Date: Fri, 17 Apr 2026 15:42:51 +0200 Subject: [PATCH 1/2] fix(async-queuer): use nullish check in #tick to handle falsy queue items --- packages/pacer/src/async-queuer.ts | 2 +- packages/pacer/tests/async-queuer.test.ts | 66 +++++++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/packages/pacer/src/async-queuer.ts b/packages/pacer/src/async-queuer.ts index 22925a170..c17d41059 100644 --- a/packages/pacer/src/async-queuer.ts +++ b/packages/pacer/src/async-queuer.ts @@ -437,7 +437,7 @@ export class AsyncQueuer { this.store.state.items.length > 0 ) { const nextItem = this.peekNextItem() - if (!nextItem) { + if (nextItem === undefined) { break } activeItems.push(nextItem) diff --git a/packages/pacer/tests/async-queuer.test.ts b/packages/pacer/tests/async-queuer.test.ts index 5497797bc..0bc835cd5 100644 --- a/packages/pacer/tests/async-queuer.test.ts +++ b/packages/pacer/tests/async-queuer.test.ts @@ -1095,4 +1095,70 @@ describe('AsyncQueuer', () => { expect(asyncQueuer.getAbortSignal()).toBeNull() }) }) + + describe('falsy item handling', () => { + it('should process items with value 0', async () => { + const processed: Array = [] + const asyncQueuer = new AsyncQueuer( + async (item) => { + processed.push(item) + return item + }, + { started: false }, + ) + + asyncQueuer.addItem(0) + asyncQueuer.addItem(1) + asyncQueuer.addItem(2) + asyncQueuer.start() + + await vi.advanceTimersByTimeAsync(100) + + expect(processed).toEqual([0, 1, 2]) + expect(asyncQueuer.store.state.successCount).toBe(3) + }) + + it('should process items with value "" (empty string)', async () => { + const processed: Array = [] + const asyncQueuer = new AsyncQueuer( + async (item) => { + processed.push(item) + return item + }, + { started: false }, + ) + + asyncQueuer.addItem('') + asyncQueuer.addItem('hello') + asyncQueuer.addItem('') + asyncQueuer.start() + + await vi.advanceTimersByTimeAsync(100) + + expect(processed).toEqual(['', 'hello', '']) + expect(asyncQueuer.store.state.successCount).toBe(3) + }) + + it('should process items with value false', async () => { + const processed: Array = [] + const asyncQueuer = new AsyncQueuer( + async (item) => { + processed.push(item) + return item + }, + { started: false }, + ) + + asyncQueuer.addItem(false) + asyncQueuer.addItem(true) + asyncQueuer.addItem(false) + asyncQueuer.start() + + await vi.advanceTimersByTimeAsync(100) + + expect(processed).toEqual([false, true, false]) + expect(asyncQueuer.store.state.successCount).toBe(3) + }) + + }) }) From b2e8e24954253e0c87f35aaca7b0d2f794160e2f Mon Sep 17 00:00:00 2001 From: Simon Meyer Date: Fri, 17 Apr 2026 15:59:00 +0200 Subject: [PATCH 2/2] chore: add changeset --- .changeset/young-planes-clap.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/young-planes-clap.md diff --git a/.changeset/young-planes-clap.md b/.changeset/young-planes-clap.md new file mode 100644 index 000000000..ca8f78490 --- /dev/null +++ b/.changeset/young-planes-clap.md @@ -0,0 +1,5 @@ +--- +'@tanstack/pacer': patch +--- + +fix(async-queuer): Fix falsy item handling in AsyncQueuer#tick — items like 0, "", and false are no longer silently dropped from the processing loop.