diff --git a/.changeset/fix-query-collection-remount-cache.md b/.changeset/fix-query-collection-remount-cache.md deleted file mode 100644 index aca6956f6..000000000 --- a/.changeset/fix-query-collection-remount-cache.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -"@tanstack/query-db-collection": patch -"@tanstack/db": patch ---- - -Fix data loss on component remount by implementing reference counting for QueryObserver lifecycle - -**What changed vs main:** - -Previously, when live query subscriptions unsubscribed, there was no tracking of which rows were still needed by other active queries. This caused data loss during remounts. - -This PR adds reference counting infrastructure to properly manage QueryObserver lifecycle: - -1. Pass same predicates to `unloadSubset` that were passed to `loadSubset` -2. Use them to compute the queryKey (via `generateQueryKeyFromOptions`) -3. Use existing machinery (`queryToRows` map) to find rows that query loaded -4. Decrement the ref count -5. GC rows where count reaches 0 (no longer referenced by any active query) - -**Impact:** - -- Navigation back to previously loaded pages shows cached data immediately -- No unnecessary refetches during quick remounts (< gcTime) -- Multiple live queries with identical predicates correctly share QueryObservers -- Proper row-level cleanup when last subscriber leaves -- TanStack Query's cache lifecycle (gcTime) is fully respected -- No data leakage from in-flight requests when unsubscribing diff --git a/examples/react/offline-transactions/package.json b/examples/react/offline-transactions/package.json index de5587e34..8f008ff29 100644 --- a/examples/react/offline-transactions/package.json +++ b/examples/react/offline-transactions/package.json @@ -10,8 +10,8 @@ }, "dependencies": { "@tanstack/offline-transactions": ">=1.0.0", - "@tanstack/query-db-collection": ">=1.0.3", - "@tanstack/react-db": ">=0.1.48", + "@tanstack/query-db-collection": ">=1.0.4", + "@tanstack/react-db": ">=0.1.49", "@tanstack/react-query": "^5.90.10", "@tanstack/react-router": "^1.136.8", "@tanstack/react-router-devtools": "^1.136.8", diff --git a/examples/react/projects/package.json b/examples/react/projects/package.json index c9ba79516..4824b6914 100644 --- a/examples/react/projects/package.json +++ b/examples/react/projects/package.json @@ -17,8 +17,8 @@ "dependencies": { "@tailwindcss/vite": "^4.1.17", "@tanstack/query-core": "^5.90.10", - "@tanstack/query-db-collection": ">=1.0.3", - "@tanstack/react-db": ">=0.1.48", + "@tanstack/query-db-collection": ">=1.0.4", + "@tanstack/react-db": ">=0.1.49", "@tanstack/react-router": "^1.136.8", "@tanstack/react-router-devtools": "^1.136.8", "@tanstack/react-router-with-query": "^1.130.17", diff --git a/packages/angular-db/CHANGELOG.md b/packages/angular-db/CHANGELOG.md index 5455fec1d..b2e09d0a4 100644 --- a/packages/angular-db/CHANGELOG.md +++ b/packages/angular-db/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/angular-db +## 0.1.31 + +### Patch Changes + +- Updated dependencies [[`077fc1a`](https://github.com/TanStack/db/commit/077fc1a418ca090d7533115888c09f3f609e36b2)]: + - @tanstack/db@0.5.5 + ## 0.1.30 ### Patch Changes diff --git a/packages/angular-db/package.json b/packages/angular-db/package.json index da750a930..e9e844229 100644 --- a/packages/angular-db/package.json +++ b/packages/angular-db/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/angular-db", "description": "Angular integration for @tanstack/db", - "version": "0.1.30", + "version": "0.1.31", "author": "Ethan McDaniel", "license": "MIT", "repository": { diff --git a/packages/db-collection-e2e/CHANGELOG.md b/packages/db-collection-e2e/CHANGELOG.md index 980513f6e..0f4ddd1f2 100644 --- a/packages/db-collection-e2e/CHANGELOG.md +++ b/packages/db-collection-e2e/CHANGELOG.md @@ -1,5 +1,14 @@ # @tanstack/db-collection-e2e +## 0.0.7 + +### Patch Changes + +- Updated dependencies [[`077fc1a`](https://github.com/TanStack/db/commit/077fc1a418ca090d7533115888c09f3f609e36b2)]: + - @tanstack/query-db-collection@1.0.4 + - @tanstack/db@0.5.5 + - @tanstack/electric-db-collection@0.2.5 + ## 0.0.6 ### Patch Changes diff --git a/packages/db-collection-e2e/package.json b/packages/db-collection-e2e/package.json index 72ae84cbf..ca83958b3 100644 --- a/packages/db-collection-e2e/package.json +++ b/packages/db-collection-e2e/package.json @@ -1,6 +1,6 @@ { "name": "@tanstack/db-collection-e2e", - "version": "0.0.6", + "version": "0.0.7", "private": true, "description": "End-to-end test suite for TanStack DB collections", "type": "module", diff --git a/packages/db/CHANGELOG.md b/packages/db/CHANGELOG.md index 7ac598645..fd2909f57 100644 --- a/packages/db/CHANGELOG.md +++ b/packages/db/CHANGELOG.md @@ -1,5 +1,30 @@ # @tanstack/db +## 0.5.5 + +### Patch Changes + +- Fix data loss on component remount by implementing reference counting for QueryObserver lifecycle ([#870](https://github.com/TanStack/db/pull/870)) + + **What changed vs main:** + + Previously, when live query subscriptions unsubscribed, there was no tracking of which rows were still needed by other active queries. This caused data loss during remounts. + + This PR adds reference counting infrastructure to properly manage QueryObserver lifecycle: + 1. Pass same predicates to `unloadSubset` that were passed to `loadSubset` + 2. Use them to compute the queryKey (via `generateQueryKeyFromOptions`) + 3. Use existing machinery (`queryToRows` map) to find rows that query loaded + 4. Decrement the ref count + 5. GC rows where count reaches 0 (no longer referenced by any active query) + + **Impact:** + - Navigation back to previously loaded pages shows cached data immediately + - No unnecessary refetches during quick remounts (< gcTime) + - Multiple live queries with identical predicates correctly share QueryObservers + - Proper row-level cleanup when last subscriber leaves + - TanStack Query's cache lifecycle (gcTime) is fully respected + - No data leakage from in-flight requests when unsubscribing + ## 0.5.4 ### Patch Changes diff --git a/packages/db/package.json b/packages/db/package.json index 2af278553..50d081ea2 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/db", "description": "A reactive client store for building super fast apps on sync", - "version": "0.5.4", + "version": "0.5.5", "dependencies": { "@standard-schema/spec": "^1.0.0", "@tanstack/db-ivm": "workspace:*", diff --git a/packages/electric-db-collection/CHANGELOG.md b/packages/electric-db-collection/CHANGELOG.md index 011f2e290..a017d292a 100644 --- a/packages/electric-db-collection/CHANGELOG.md +++ b/packages/electric-db-collection/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/electric-db-collection +## 0.2.5 + +### Patch Changes + +- Updated dependencies [[`077fc1a`](https://github.com/TanStack/db/commit/077fc1a418ca090d7533115888c09f3f609e36b2)]: + - @tanstack/db@0.5.5 + ## 0.2.4 ### Patch Changes diff --git a/packages/electric-db-collection/package.json b/packages/electric-db-collection/package.json index d7efd86e9..67c6573cc 100644 --- a/packages/electric-db-collection/package.json +++ b/packages/electric-db-collection/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/electric-db-collection", "description": "ElectricSQL collection for TanStack DB", - "version": "0.2.4", + "version": "0.2.5", "dependencies": { "@electric-sql/client": "^1.1.5", "@standard-schema/spec": "^1.0.0", diff --git a/packages/powersync-db-collection/CHANGELOG.md b/packages/powersync-db-collection/CHANGELOG.md index 53ca33a87..4e24deb79 100644 --- a/packages/powersync-db-collection/CHANGELOG.md +++ b/packages/powersync-db-collection/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/powersync-db-collection +## 0.1.9 + +### Patch Changes + +- Updated dependencies [[`077fc1a`](https://github.com/TanStack/db/commit/077fc1a418ca090d7533115888c09f3f609e36b2)]: + - @tanstack/db@0.5.5 + ## 0.1.8 ### Patch Changes diff --git a/packages/powersync-db-collection/package.json b/packages/powersync-db-collection/package.json index 0c2fc5d6f..f4fb2fd9a 100644 --- a/packages/powersync-db-collection/package.json +++ b/packages/powersync-db-collection/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/powersync-db-collection", "description": "PowerSync collection for TanStack DB", - "version": "0.1.8", + "version": "0.1.9", "dependencies": { "@standard-schema/spec": "^1.0.0", "@tanstack/db": "workspace:*", diff --git a/packages/query-db-collection/CHANGELOG.md b/packages/query-db-collection/CHANGELOG.md index 759b4b202..a0711b919 100644 --- a/packages/query-db-collection/CHANGELOG.md +++ b/packages/query-db-collection/CHANGELOG.md @@ -1,5 +1,33 @@ # @tanstack/query-db-collection +## 1.0.4 + +### Patch Changes + +- Fix data loss on component remount by implementing reference counting for QueryObserver lifecycle ([#870](https://github.com/TanStack/db/pull/870)) + + **What changed vs main:** + + Previously, when live query subscriptions unsubscribed, there was no tracking of which rows were still needed by other active queries. This caused data loss during remounts. + + This PR adds reference counting infrastructure to properly manage QueryObserver lifecycle: + 1. Pass same predicates to `unloadSubset` that were passed to `loadSubset` + 2. Use them to compute the queryKey (via `generateQueryKeyFromOptions`) + 3. Use existing machinery (`queryToRows` map) to find rows that query loaded + 4. Decrement the ref count + 5. GC rows where count reaches 0 (no longer referenced by any active query) + + **Impact:** + - Navigation back to previously loaded pages shows cached data immediately + - No unnecessary refetches during quick remounts (< gcTime) + - Multiple live queries with identical predicates correctly share QueryObservers + - Proper row-level cleanup when last subscriber leaves + - TanStack Query's cache lifecycle (gcTime) is fully respected + - No data leakage from in-flight requests when unsubscribing + +- Updated dependencies [[`077fc1a`](https://github.com/TanStack/db/commit/077fc1a418ca090d7533115888c09f3f609e36b2)]: + - @tanstack/db@0.5.5 + ## 1.0.3 ### Patch Changes diff --git a/packages/query-db-collection/package.json b/packages/query-db-collection/package.json index 3daf592bb..f25347ca1 100644 --- a/packages/query-db-collection/package.json +++ b/packages/query-db-collection/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/query-db-collection", "description": "TanStack Query collection for TanStack DB", - "version": "1.0.3", + "version": "1.0.4", "dependencies": { "@standard-schema/spec": "^1.0.0" }, diff --git a/packages/react-db/CHANGELOG.md b/packages/react-db/CHANGELOG.md index b15896760..feeea5506 100644 --- a/packages/react-db/CHANGELOG.md +++ b/packages/react-db/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/react-db +## 0.1.49 + +### Patch Changes + +- Updated dependencies [[`077fc1a`](https://github.com/TanStack/db/commit/077fc1a418ca090d7533115888c09f3f609e36b2)]: + - @tanstack/db@0.5.5 + ## 0.1.48 ### Patch Changes diff --git a/packages/react-db/package.json b/packages/react-db/package.json index bf7853629..c00cf5dd7 100644 --- a/packages/react-db/package.json +++ b/packages/react-db/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/react-db", "description": "React integration for @tanstack/db", - "version": "0.1.48", + "version": "0.1.49", "author": "Kyle Mathews", "license": "MIT", "repository": { diff --git a/packages/rxdb-db-collection/CHANGELOG.md b/packages/rxdb-db-collection/CHANGELOG.md index 88b787eb9..6c579e8a3 100644 --- a/packages/rxdb-db-collection/CHANGELOG.md +++ b/packages/rxdb-db-collection/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/rxdb-db-collection +## 0.1.37 + +### Patch Changes + +- Updated dependencies [[`077fc1a`](https://github.com/TanStack/db/commit/077fc1a418ca090d7533115888c09f3f609e36b2)]: + - @tanstack/db@0.5.5 + ## 0.1.36 ### Patch Changes diff --git a/packages/rxdb-db-collection/package.json b/packages/rxdb-db-collection/package.json index 7d7c62fe5..e39a2b4b8 100644 --- a/packages/rxdb-db-collection/package.json +++ b/packages/rxdb-db-collection/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/rxdb-db-collection", "description": "RxDB collection for TanStack DB", - "version": "0.1.36", + "version": "0.1.37", "dependencies": { "rxdb": "16.20.0", "@standard-schema/spec": "^1.0.0", diff --git a/packages/solid-db/CHANGELOG.md b/packages/solid-db/CHANGELOG.md index cb632303a..f281cdc75 100644 --- a/packages/solid-db/CHANGELOG.md +++ b/packages/solid-db/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/react-db +## 0.1.48 + +### Patch Changes + +- Updated dependencies [[`077fc1a`](https://github.com/TanStack/db/commit/077fc1a418ca090d7533115888c09f3f609e36b2)]: + - @tanstack/db@0.5.5 + ## 0.1.47 ### Patch Changes diff --git a/packages/solid-db/package.json b/packages/solid-db/package.json index 0fc28fcf8..8d9564673 100644 --- a/packages/solid-db/package.json +++ b/packages/solid-db/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/solid-db", "description": "Solid integration for @tanstack/db", - "version": "0.1.47", + "version": "0.1.48", "author": "Kyle Mathews", "license": "MIT", "repository": { diff --git a/packages/svelte-db/CHANGELOG.md b/packages/svelte-db/CHANGELOG.md index 4c0173a77..54617d2e8 100644 --- a/packages/svelte-db/CHANGELOG.md +++ b/packages/svelte-db/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/svelte-db +## 0.1.48 + +### Patch Changes + +- Updated dependencies [[`077fc1a`](https://github.com/TanStack/db/commit/077fc1a418ca090d7533115888c09f3f609e36b2)]: + - @tanstack/db@0.5.5 + ## 0.1.47 ### Patch Changes diff --git a/packages/svelte-db/package.json b/packages/svelte-db/package.json index eee26515d..d08ebb6ea 100644 --- a/packages/svelte-db/package.json +++ b/packages/svelte-db/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/svelte-db", "description": "Svelte integration for @tanstack/db", - "version": "0.1.47", + "version": "0.1.48", "dependencies": { "@tanstack/db": "workspace:*" }, diff --git a/packages/trailbase-db-collection/CHANGELOG.md b/packages/trailbase-db-collection/CHANGELOG.md index 09c7c5601..ff173dcfc 100644 --- a/packages/trailbase-db-collection/CHANGELOG.md +++ b/packages/trailbase-db-collection/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/trailbase-db-collection +## 0.1.49 + +### Patch Changes + +- Updated dependencies [[`077fc1a`](https://github.com/TanStack/db/commit/077fc1a418ca090d7533115888c09f3f609e36b2)]: + - @tanstack/db@0.5.5 + ## 0.1.48 ### Patch Changes diff --git a/packages/trailbase-db-collection/package.json b/packages/trailbase-db-collection/package.json index eabe0a5b5..5f92fe6ae 100644 --- a/packages/trailbase-db-collection/package.json +++ b/packages/trailbase-db-collection/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/trailbase-db-collection", "description": "TrailBase collection for TanStack DB", - "version": "0.1.48", + "version": "0.1.49", "dependencies": { "@standard-schema/spec": "^1.0.0", "@tanstack/db": "workspace:*", diff --git a/packages/vue-db/CHANGELOG.md b/packages/vue-db/CHANGELOG.md index dcff4aedd..d4ca4022f 100644 --- a/packages/vue-db/CHANGELOG.md +++ b/packages/vue-db/CHANGELOG.md @@ -1,5 +1,12 @@ # @tanstack/vue-db +## 0.0.81 + +### Patch Changes + +- Updated dependencies [[`077fc1a`](https://github.com/TanStack/db/commit/077fc1a418ca090d7533115888c09f3f609e36b2)]: + - @tanstack/db@0.5.5 + ## 0.0.80 ### Patch Changes diff --git a/packages/vue-db/package.json b/packages/vue-db/package.json index 9a2888be3..03adf7ed4 100644 --- a/packages/vue-db/package.json +++ b/packages/vue-db/package.json @@ -1,7 +1,7 @@ { "name": "@tanstack/vue-db", "description": "Vue integration for @tanstack/db", - "version": "0.0.80", + "version": "0.0.81", "author": "Kyle Mathews", "license": "MIT", "repository": {