@tanstack/db 0.5.24 → 0.5.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist/cjs/collection/change-events.cjs +1 -1
  2. package/dist/cjs/collection/change-events.cjs.map +1 -1
  3. package/dist/cjs/collection/changes.cjs +6 -1
  4. package/dist/cjs/collection/changes.cjs.map +1 -1
  5. package/dist/cjs/collection/lifecycle.cjs +11 -0
  6. package/dist/cjs/collection/lifecycle.cjs.map +1 -1
  7. package/dist/cjs/collection/subscription.cjs +18 -5
  8. package/dist/cjs/collection/subscription.cjs.map +1 -1
  9. package/dist/cjs/collection/subscription.d.cts +7 -1
  10. package/dist/cjs/indexes/base-index.cjs.map +1 -1
  11. package/dist/cjs/indexes/base-index.d.cts +10 -6
  12. package/dist/cjs/indexes/btree-index.cjs +64 -24
  13. package/dist/cjs/indexes/btree-index.cjs.map +1 -1
  14. package/dist/cjs/indexes/btree-index.d.cts +31 -9
  15. package/dist/cjs/indexes/reverse-index.cjs +6 -0
  16. package/dist/cjs/indexes/reverse-index.cjs.map +1 -1
  17. package/dist/cjs/indexes/reverse-index.d.cts +4 -2
  18. package/dist/cjs/query/live/collection-config-builder.cjs +4 -1
  19. package/dist/cjs/query/live/collection-config-builder.cjs.map +1 -1
  20. package/dist/cjs/query/live/collection-subscriber.cjs +111 -30
  21. package/dist/cjs/query/live/collection-subscriber.cjs.map +1 -1
  22. package/dist/cjs/query/live/collection-subscriber.d.cts +5 -0
  23. package/dist/cjs/types.d.cts +16 -0
  24. package/dist/cjs/utils/comparison.cjs +16 -0
  25. package/dist/cjs/utils/comparison.cjs.map +1 -1
  26. package/dist/cjs/utils/comparison.d.cts +21 -0
  27. package/dist/esm/collection/change-events.js +1 -1
  28. package/dist/esm/collection/change-events.js.map +1 -1
  29. package/dist/esm/collection/changes.js +6 -1
  30. package/dist/esm/collection/changes.js.map +1 -1
  31. package/dist/esm/collection/lifecycle.js +11 -0
  32. package/dist/esm/collection/lifecycle.js.map +1 -1
  33. package/dist/esm/collection/subscription.d.ts +7 -1
  34. package/dist/esm/collection/subscription.js +18 -5
  35. package/dist/esm/collection/subscription.js.map +1 -1
  36. package/dist/esm/indexes/base-index.d.ts +10 -6
  37. package/dist/esm/indexes/base-index.js.map +1 -1
  38. package/dist/esm/indexes/btree-index.d.ts +31 -9
  39. package/dist/esm/indexes/btree-index.js +65 -25
  40. package/dist/esm/indexes/btree-index.js.map +1 -1
  41. package/dist/esm/indexes/reverse-index.d.ts +4 -2
  42. package/dist/esm/indexes/reverse-index.js +6 -0
  43. package/dist/esm/indexes/reverse-index.js.map +1 -1
  44. package/dist/esm/query/live/collection-config-builder.js +4 -1
  45. package/dist/esm/query/live/collection-config-builder.js.map +1 -1
  46. package/dist/esm/query/live/collection-subscriber.d.ts +5 -0
  47. package/dist/esm/query/live/collection-subscriber.js +112 -31
  48. package/dist/esm/query/live/collection-subscriber.js.map +1 -1
  49. package/dist/esm/types.d.ts +16 -0
  50. package/dist/esm/utils/comparison.d.ts +21 -0
  51. package/dist/esm/utils/comparison.js +16 -0
  52. package/dist/esm/utils/comparison.js.map +1 -1
  53. package/package.json +1 -1
  54. package/src/collection/change-events.ts +1 -1
  55. package/src/collection/changes.ts +6 -1
  56. package/src/collection/lifecycle.ts +14 -0
  57. package/src/collection/subscription.ts +38 -10
  58. package/src/indexes/base-index.ts +19 -6
  59. package/src/indexes/btree-index.ts +101 -30
  60. package/src/indexes/reverse-index.ts +13 -2
  61. package/src/query/live/collection-config-builder.ts +4 -5
  62. package/src/query/live/collection-subscriber.ts +173 -50
  63. package/src/types.ts +16 -0
  64. package/src/utils/comparison.ts +34 -0
package/src/types.ts CHANGED
@@ -809,6 +809,22 @@ export interface SubscribeChangesOptions<
809
809
  * @internal
810
810
  */
811
811
  onStatusChange?: (event: SubscriptionStatusChangeEvent) => void
812
+ /**
813
+ * Optional orderBy to include in loadSubset for query-specific cache keys.
814
+ * @internal
815
+ */
816
+ orderBy?: OrderBy
817
+ /**
818
+ * Optional limit to include in loadSubset for query-specific cache keys.
819
+ * @internal
820
+ */
821
+ limit?: number
822
+ /**
823
+ * Callback that receives the loadSubset result (Promise or true) from requestSnapshot.
824
+ * Allows the caller to directly track the loading promise for isReady status.
825
+ * @internal
826
+ */
827
+ onLoadSubsetResult?: (result: Promise<void> | true) => void
812
828
  }
813
829
 
814
830
  export interface SubscribeChangesSnapshotOptions<
@@ -134,10 +134,20 @@ function areUint8ArraysEqual(a: Uint8Array, b: Uint8Array): boolean {
134
134
  */
135
135
  const UINT8ARRAY_NORMALIZE_THRESHOLD = 128
136
136
 
137
+ /**
138
+ * Sentinel value representing undefined in normalized form.
139
+ * This allows distinguishing between "start from beginning" (undefined parameter)
140
+ * and "start from the key undefined" (actual undefined value in the tree).
141
+ */
142
+ export const UNDEFINED_SENTINEL = `__TS_DB_BTREE_UNDEFINED_VALUE__`
143
+
137
144
  /**
138
145
  * Normalize a value for comparison and Map key usage
139
146
  * Converts values that can't be directly compared or used as Map keys
140
147
  * into comparable primitive representations
148
+ *
149
+ * Note: This does NOT convert undefined to a sentinel. Use normalizeForBTree
150
+ * for BTree index operations that need to distinguish undefined values.
141
151
  */
142
152
  export function normalizeValue(value: any): any {
143
153
  if (value instanceof Date) {
@@ -164,6 +174,30 @@ export function normalizeValue(value: any): any {
164
174
  return value
165
175
  }
166
176
 
177
+ /**
178
+ * Normalize a value for BTree index usage.
179
+ * Extends normalizeValue to also convert undefined to a sentinel value.
180
+ * This is needed because the BTree does not properly support `undefined` as a key
181
+ * (it interprets undefined as "start from beginning" in nextHigherPair/nextLowerPair).
182
+ */
183
+ export function normalizeForBTree(value: any): any {
184
+ if (value === undefined) {
185
+ return UNDEFINED_SENTINEL
186
+ }
187
+ return normalizeValue(value)
188
+ }
189
+
190
+ /**
191
+ * Converts the `UNDEFINED_SENTINEL` back to `undefined`.
192
+ * Needed such that the sentinel is converted back to `undefined` before comparison.
193
+ */
194
+ export function denormalizeUndefined(value: any): any {
195
+ if (value === UNDEFINED_SENTINEL) {
196
+ return undefined
197
+ }
198
+ return value
199
+ }
200
+
167
201
  /**
168
202
  * Compare two values for equality, with special handling for Uint8Arrays and Buffers
169
203
  */