diff --git a/.changeset/release-deleted-sync-keys.md b/.changeset/release-deleted-sync-keys.md new file mode 100644 index 0000000000..01c5f368b8 --- /dev/null +++ b/.changeset/release-deleted-sync-keys.md @@ -0,0 +1,5 @@ +--- +'@tanstack/db': patch +--- + +Release synced key tracking when rows are deleted. diff --git a/packages/db/src/collection/state.ts b/packages/db/src/collection/state.ts index 3783422013..338479750b 100644 --- a/packages/db/src/collection/state.ts +++ b/packages/db/src/collection/state.ts @@ -1061,6 +1061,7 @@ export class CollectionStateManager< break } case `delete`: + this.syncedKeys.delete(key) this.syncedData.delete(key) this.syncedMetadata.delete(key) // Clean up origin and pending tracking for deleted rows diff --git a/packages/db/tests/collection.test.ts b/packages/db/tests/collection.test.ts index 3ff8ede815..511f6b161a 100644 --- a/packages/db/tests/collection.test.ts +++ b/packages/db/tests/collection.test.ts @@ -1656,6 +1656,40 @@ describe(`Collection`, () => { }) }) + it(`should remove deleted keys from synced key tracking`, async () => { + const collection = createCollection( + mockSyncCollectionOptionsNoInitialState<{ + id: number + value: string + }>({ + id: `sync-key-delete-test`, + getKey: (item) => item.id, + startSync: true, + }), + ) + + collection.utils.begin() + collection.utils.write({ + type: `insert`, + value: { id: 1, value: `one` }, + }) + collection.utils.write({ + type: `insert`, + value: { id: 2, value: `two` }, + }) + collection.utils.commit() + collection.utils.markReady() + + await collection.stateWhenReady() + expect(collection._state.syncedKeys).toEqual(new Set([1, 2])) + + collection.utils.begin() + collection.utils.write({ type: `delete`, key: 1 }) + collection.utils.commit() + + expect(collection._state.syncedKeys).toEqual(new Set([2])) + }) + it(`should delete row metadata when sync deletes the row`, async () => { let testSyncFunctions: any = null