tinybase 9.0.0-beta.0 → 9.0.0-beta.1

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 (219) hide show
  1. package/@types/mergeable-store/index.d.ts +4 -4
  2. package/@types/mergeable-store/with-schemas/index.d.ts +41 -17
  3. package/@types/persisters/index.d.ts +2 -1
  4. package/@types/persisters/with-schemas/index.d.ts +16 -10
  5. package/@types/queries/index.d.ts +4 -0
  6. package/@types/queries/with-schemas/index.d.ts +4 -0
  7. package/index.js +46 -6
  8. package/mergeable-store/index.js +46 -6
  9. package/mergeable-store/with-schemas/index.js +46 -6
  10. package/min/index.js +1 -1
  11. package/min/index.js.gz +0 -0
  12. package/min/mergeable-store/index.js +1 -1
  13. package/min/mergeable-store/index.js.gz +0 -0
  14. package/min/mergeable-store/with-schemas/index.js +1 -1
  15. package/min/mergeable-store/with-schemas/index.js.gz +0 -0
  16. package/min/omni/index.js +1 -1
  17. package/min/omni/index.js.gz +0 -0
  18. package/min/omni/with-schemas/index.js +1 -1
  19. package/min/omni/with-schemas/index.js.gz +0 -0
  20. package/min/persisters/index.js +1 -1
  21. package/min/persisters/index.js.gz +0 -0
  22. package/min/persisters/persister-automerge/index.js +1 -1
  23. package/min/persisters/persister-automerge/index.js.gz +0 -0
  24. package/min/persisters/persister-automerge/with-schemas/index.js +1 -1
  25. package/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
  26. package/min/persisters/persister-browser/index.js +1 -1
  27. package/min/persisters/persister-browser/index.js.gz +0 -0
  28. package/min/persisters/persister-browser/with-schemas/index.js +1 -1
  29. package/min/persisters/persister-browser/with-schemas/index.js.gz +0 -0
  30. package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
  31. package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
  32. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
  33. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
  34. package/min/persisters/persister-durable-object-sql-storage/index.js +1 -1
  35. package/min/persisters/persister-durable-object-sql-storage/index.js.gz +0 -0
  36. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js +1 -1
  37. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js.gz +0 -0
  38. package/min/persisters/persister-durable-object-storage/index.js +1 -1
  39. package/min/persisters/persister-durable-object-storage/index.js.gz +0 -0
  40. package/min/persisters/persister-durable-object-storage/with-schemas/index.js +1 -1
  41. package/min/persisters/persister-durable-object-storage/with-schemas/index.js.gz +0 -0
  42. package/min/persisters/persister-electric-sql/index.js +1 -1
  43. package/min/persisters/persister-electric-sql/index.js.gz +0 -0
  44. package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
  45. package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
  46. package/min/persisters/persister-expo-sqlite/index.js +1 -1
  47. package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
  48. package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
  49. package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
  50. package/min/persisters/persister-file/index.js +1 -1
  51. package/min/persisters/persister-file/index.js.gz +0 -0
  52. package/min/persisters/persister-file/with-schemas/index.js +1 -1
  53. package/min/persisters/persister-file/with-schemas/index.js.gz +0 -0
  54. package/min/persisters/persister-indexed-db/index.js +1 -1
  55. package/min/persisters/persister-indexed-db/index.js.gz +0 -0
  56. package/min/persisters/persister-indexed-db/with-schemas/index.js +1 -1
  57. package/min/persisters/persister-indexed-db/with-schemas/index.js.gz +0 -0
  58. package/min/persisters/persister-libsql/index.js +1 -1
  59. package/min/persisters/persister-libsql/index.js.gz +0 -0
  60. package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
  61. package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
  62. package/min/persisters/persister-partykit-client/index.js +1 -1
  63. package/min/persisters/persister-partykit-client/index.js.gz +0 -0
  64. package/min/persisters/persister-partykit-client/with-schemas/index.js +1 -1
  65. package/min/persisters/persister-partykit-client/with-schemas/index.js.gz +0 -0
  66. package/min/persisters/persister-pglite/index.js +1 -1
  67. package/min/persisters/persister-pglite/index.js.gz +0 -0
  68. package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
  69. package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
  70. package/min/persisters/persister-postgres/index.js +1 -1
  71. package/min/persisters/persister-postgres/index.js.gz +0 -0
  72. package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
  73. package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
  74. package/min/persisters/persister-powersync/index.js +1 -1
  75. package/min/persisters/persister-powersync/index.js.gz +0 -0
  76. package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
  77. package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
  78. package/min/persisters/persister-react-native-mmkv/index.js +1 -1
  79. package/min/persisters/persister-react-native-mmkv/index.js.gz +0 -0
  80. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js +1 -1
  81. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js.gz +0 -0
  82. package/min/persisters/persister-react-native-sqlite/index.js +1 -1
  83. package/min/persisters/persister-react-native-sqlite/index.js.gz +0 -0
  84. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js +1 -1
  85. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js.gz +0 -0
  86. package/min/persisters/persister-remote/index.js +1 -1
  87. package/min/persisters/persister-remote/index.js.gz +0 -0
  88. package/min/persisters/persister-remote/with-schemas/index.js +1 -1
  89. package/min/persisters/persister-remote/with-schemas/index.js.gz +0 -0
  90. package/min/persisters/persister-sqlite-bun/index.js +1 -1
  91. package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
  92. package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -1
  93. package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
  94. package/min/persisters/persister-sqlite-wasm/index.js +1 -1
  95. package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
  96. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
  97. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
  98. package/min/persisters/persister-sqlite3/index.js +1 -1
  99. package/min/persisters/persister-sqlite3/index.js.gz +0 -0
  100. package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
  101. package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
  102. package/min/persisters/persister-yjs/index.js +1 -1
  103. package/min/persisters/persister-yjs/index.js.gz +0 -0
  104. package/min/persisters/persister-yjs/with-schemas/index.js +1 -1
  105. package/min/persisters/persister-yjs/with-schemas/index.js.gz +0 -0
  106. package/min/persisters/with-schemas/index.js +1 -1
  107. package/min/persisters/with-schemas/index.js.gz +0 -0
  108. package/min/store/index.js +1 -1
  109. package/min/store/index.js.gz +0 -0
  110. package/min/store/with-schemas/index.js +1 -1
  111. package/min/store/with-schemas/index.js.gz +0 -0
  112. package/min/synchronizers/index.js +1 -1
  113. package/min/synchronizers/index.js.gz +0 -0
  114. package/min/synchronizers/synchronizer-broadcast-channel/index.js +1 -1
  115. package/min/synchronizers/synchronizer-broadcast-channel/index.js.gz +0 -0
  116. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +1 -1
  117. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js.gz +0 -0
  118. package/min/synchronizers/synchronizer-local/index.js +1 -1
  119. package/min/synchronizers/synchronizer-local/index.js.gz +0 -0
  120. package/min/synchronizers/synchronizer-local/with-schemas/index.js +1 -1
  121. package/min/synchronizers/synchronizer-local/with-schemas/index.js.gz +0 -0
  122. package/min/synchronizers/synchronizer-ws-client/index.js +1 -1
  123. package/min/synchronizers/synchronizer-ws-client/index.js.gz +0 -0
  124. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js +1 -1
  125. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js.gz +0 -0
  126. package/min/synchronizers/synchronizer-ws-server/index.js +1 -1
  127. package/min/synchronizers/synchronizer-ws-server/index.js.gz +0 -0
  128. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js +1 -1
  129. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js.gz +0 -0
  130. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js +1 -1
  131. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js.gz +0 -0
  132. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +1 -1
  133. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js.gz +0 -0
  134. package/min/synchronizers/with-schemas/index.js +1 -1
  135. package/min/synchronizers/with-schemas/index.js.gz +0 -0
  136. package/min/ui-react-inspector/index.js +1 -1
  137. package/min/ui-react-inspector/index.js.gz +0 -0
  138. package/min/ui-react-inspector/with-schemas/index.js +1 -1
  139. package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
  140. package/min/ui-solid-inspector/index.js +1 -1
  141. package/min/ui-solid-inspector/index.js.gz +0 -0
  142. package/min/ui-solid-inspector/with-schemas/index.js +1 -1
  143. package/min/ui-solid-inspector/with-schemas/index.js.gz +0 -0
  144. package/min/ui-svelte-inspector/index.js +1 -1
  145. package/min/ui-svelte-inspector/index.js.gz +0 -0
  146. package/min/ui-svelte-inspector/with-schemas/index.js +1 -1
  147. package/min/ui-svelte-inspector/with-schemas/index.js.gz +0 -0
  148. package/min/with-schemas/index.js +1 -1
  149. package/min/with-schemas/index.js.gz +0 -0
  150. package/omni/index.js +53 -14
  151. package/omni/with-schemas/index.js +53 -14
  152. package/package.json +3 -3
  153. package/persisters/index.js +4 -3
  154. package/persisters/persister-automerge/index.js +4 -3
  155. package/persisters/persister-automerge/with-schemas/index.js +4 -3
  156. package/persisters/persister-browser/index.js +4 -3
  157. package/persisters/persister-browser/with-schemas/index.js +4 -3
  158. package/persisters/persister-cr-sqlite-wasm/index.js +4 -3
  159. package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +4 -3
  160. package/persisters/persister-durable-object-sql-storage/index.js +4 -3
  161. package/persisters/persister-durable-object-sql-storage/with-schemas/index.js +4 -3
  162. package/persisters/persister-durable-object-storage/index.js +4 -3
  163. package/persisters/persister-durable-object-storage/with-schemas/index.js +4 -3
  164. package/persisters/persister-electric-sql/index.js +4 -3
  165. package/persisters/persister-electric-sql/with-schemas/index.js +4 -3
  166. package/persisters/persister-expo-sqlite/index.js +4 -3
  167. package/persisters/persister-expo-sqlite/with-schemas/index.js +4 -3
  168. package/persisters/persister-file/index.js +4 -3
  169. package/persisters/persister-file/with-schemas/index.js +4 -3
  170. package/persisters/persister-indexed-db/index.js +4 -3
  171. package/persisters/persister-indexed-db/with-schemas/index.js +4 -3
  172. package/persisters/persister-libsql/index.js +4 -3
  173. package/persisters/persister-libsql/with-schemas/index.js +4 -3
  174. package/persisters/persister-partykit-client/index.js +4 -3
  175. package/persisters/persister-partykit-client/with-schemas/index.js +4 -3
  176. package/persisters/persister-pglite/index.js +4 -3
  177. package/persisters/persister-pglite/with-schemas/index.js +4 -3
  178. package/persisters/persister-postgres/index.js +4 -3
  179. package/persisters/persister-postgres/with-schemas/index.js +4 -3
  180. package/persisters/persister-powersync/index.js +4 -3
  181. package/persisters/persister-powersync/with-schemas/index.js +4 -3
  182. package/persisters/persister-react-native-mmkv/index.js +4 -3
  183. package/persisters/persister-react-native-mmkv/with-schemas/index.js +4 -3
  184. package/persisters/persister-react-native-sqlite/index.js +4 -3
  185. package/persisters/persister-react-native-sqlite/with-schemas/index.js +4 -3
  186. package/persisters/persister-remote/index.js +4 -3
  187. package/persisters/persister-remote/with-schemas/index.js +4 -3
  188. package/persisters/persister-sqlite-bun/index.js +4 -3
  189. package/persisters/persister-sqlite-bun/with-schemas/index.js +4 -3
  190. package/persisters/persister-sqlite-wasm/index.js +4 -3
  191. package/persisters/persister-sqlite-wasm/with-schemas/index.js +4 -3
  192. package/persisters/persister-sqlite3/index.js +4 -3
  193. package/persisters/persister-sqlite3/with-schemas/index.js +4 -3
  194. package/persisters/persister-yjs/index.js +4 -3
  195. package/persisters/persister-yjs/with-schemas/index.js +4 -3
  196. package/persisters/with-schemas/index.js +4 -3
  197. package/readme.md +3 -3
  198. package/releases.md +16 -1
  199. package/store/index.js +33 -2
  200. package/store/with-schemas/index.js +33 -2
  201. package/synchronizers/index.js +4 -3
  202. package/synchronizers/synchronizer-broadcast-channel/index.js +4 -3
  203. package/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +4 -3
  204. package/synchronizers/synchronizer-local/index.js +4 -3
  205. package/synchronizers/synchronizer-local/with-schemas/index.js +4 -3
  206. package/synchronizers/synchronizer-ws-client/index.js +4 -3
  207. package/synchronizers/synchronizer-ws-client/with-schemas/index.js +4 -3
  208. package/synchronizers/synchronizer-ws-server/index.js +7 -8
  209. package/synchronizers/synchronizer-ws-server/with-schemas/index.js +7 -8
  210. package/synchronizers/synchronizer-ws-server-durable-object/index.js +3 -3
  211. package/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +3 -3
  212. package/synchronizers/with-schemas/index.js +4 -3
  213. package/ui-react-inspector/index.js +36 -5
  214. package/ui-react-inspector/with-schemas/index.js +36 -5
  215. package/ui-solid-inspector/index.js +36 -5
  216. package/ui-solid-inspector/with-schemas/index.js +36 -5
  217. package/ui-svelte-inspector/index.js +36 -5
  218. package/ui-svelte-inspector/with-schemas/index.js +36 -5
  219. package/with-schemas/index.js +46 -6
@@ -1097,19 +1097,19 @@ export interface MergeableStore extends Store {
1097
1097
  * {
1098
1098
  * fido: [
1099
1099
  * {
1100
- * sold: [false, 'Nn1JUF----2FnHIC', 2603026204],
1100
+ * sold: [false, '', 3177411910],
1101
1101
  * species: ['dog', 'Nn1JUF----1FnHIC', 2817056260],
1102
1102
  * },
1103
1103
  * '',
1104
- * 2859424112,
1104
+ * 3078067457,
1105
1105
  * ],
1106
1106
  * },
1107
1107
  * '',
1108
- * 1640515891,
1108
+ * 1137907280,
1109
1109
  * ],
1110
1110
  * },
1111
1111
  * '',
1112
- * 2077041985,
1112
+ * 401719767,
1113
1113
  * ],
1114
1114
  * [{}, '', 0],
1115
1115
  * ];
@@ -91,12 +91,14 @@ export type ContentHashes = [tablesHash: Hash, valuesHash: Hash];
91
91
  export type TablesStamp<
92
92
  Schema extends OptionalTablesSchema,
93
93
  Hashed extends boolean = false,
94
+ WhenSet extends boolean = false,
94
95
  > = Stamp<
95
96
  {
96
97
  [TableId in TableIdFromSchema<Schema>]?: TableStamp<
97
98
  Schema,
98
99
  TableId,
99
- Hashed
100
+ Hashed,
101
+ WhenSet
100
102
  >;
101
103
  },
102
104
  Hashed
@@ -146,7 +148,8 @@ export type TableStamp<
146
148
  Schema extends OptionalTablesSchema,
147
149
  TableId extends TableIdFromSchema<Schema>,
148
150
  Hashed extends boolean = false,
149
- > = Stamp<{[rowId: Id]: RowStamp<Schema, TableId, Hashed>}, Hashed>;
151
+ WhenSet extends boolean = false,
152
+ > = Stamp<{[rowId: Id]: RowStamp<Schema, TableId, Hashed, WhenSet>}, Hashed>;
150
153
 
151
154
  /**
152
155
  * The RowHashes type is used to quickly compare the content of two sets of Row
@@ -192,13 +195,15 @@ export type RowStamp<
192
195
  Schema extends OptionalTablesSchema,
193
196
  TableId extends TableIdFromSchema<Schema>,
194
197
  Hashed extends boolean = false,
198
+ WhenSet extends boolean = false,
195
199
  > = Stamp<
196
200
  {
197
201
  [CellId in CellIdFromSchema<Schema, TableId>]?: CellStamp<
198
202
  Schema,
199
203
  TableId,
200
204
  CellId,
201
- Hashed
205
+ Hashed,
206
+ WhenSet
202
207
  >;
203
208
  },
204
209
  Hashed
@@ -251,7 +256,13 @@ export type CellStamp<
251
256
  TableId extends TableIdFromSchema<Schema>,
252
257
  CellId extends CellIdFromSchema<Schema, TableId>,
253
258
  Hashed extends boolean = false,
254
- > = Stamp<CellOrUndefined<Schema, TableId, CellId>, Hashed>;
259
+ WhenSet extends boolean = false,
260
+ > = Stamp<
261
+ WhenSet extends true
262
+ ? CellOrUndefined<Schema, TableId, CellId>
263
+ : CellOrUndefined<Schema, TableId, CellId>,
264
+ Hashed
265
+ >;
255
266
 
256
267
  /**
257
268
  * The ValuesStamp type is used as metadata to decide how to merge two different
@@ -274,12 +285,14 @@ export type CellStamp<
274
285
  export type ValuesStamp<
275
286
  Schema extends OptionalValuesSchema,
276
287
  Hashed extends boolean = false,
288
+ WhenSet extends boolean = false,
277
289
  > = Stamp<
278
290
  {
279
291
  [ValueId in ValueIdFromSchema<Schema>]?: ValueStamp<
280
292
  Schema,
281
293
  ValueId,
282
- Hashed
294
+ Hashed,
295
+ WhenSet
283
296
  >;
284
297
  },
285
298
  Hashed
@@ -329,7 +342,13 @@ export type ValueStamp<
329
342
  Schema extends OptionalValuesSchema,
330
343
  ValueId extends ValueIdFromSchema<Schema>,
331
344
  Hashed extends boolean = false,
332
- > = Stamp<ValueOrUndefined<Schema, ValueId>, Hashed>;
345
+ WhenSet extends boolean = false,
346
+ > = Stamp<
347
+ WhenSet extends true
348
+ ? ValueOrUndefined<Schema, ValueId>
349
+ : ValueOrUndefined<Schema, ValueId>,
350
+ Hashed
351
+ >;
333
352
 
334
353
  /**
335
354
  * The MergeableContent type represents the content of a MergeableStore and the
@@ -352,9 +371,12 @@ export type ValueStamp<
352
371
  * @category Mergeable
353
372
  * @since v5.0.0
354
373
  */
355
- export type MergeableContent<Schemas extends OptionalSchemas> = [
356
- mergeableTables: TablesStamp<Schemas[0], true>,
357
- mergeableValues: ValuesStamp<Schemas[1], true>,
374
+ export type MergeableContent<
375
+ Schemas extends OptionalSchemas,
376
+ WhenSet extends boolean = false,
377
+ > = [
378
+ mergeableTables: TablesStamp<Schemas[0], true, WhenSet>,
379
+ mergeableValues: ValuesStamp<Schemas[1], true, WhenSet>,
358
380
  ];
359
381
 
360
382
  /**
@@ -384,9 +406,10 @@ export type MergeableContent<Schemas extends OptionalSchemas> = [
384
406
  export type MergeableChanges<
385
407
  Schemas extends OptionalSchemas,
386
408
  Hashed extends boolean = false,
409
+ WhenSet extends boolean = false,
387
410
  > = [
388
- mergeableTables: TablesStamp<Schemas[0], Hashed>,
389
- mergeableValues: ValuesStamp<Schemas[1], Hashed>,
411
+ mergeableTables: TablesStamp<Schemas[0], Hashed, WhenSet>,
412
+ mergeableValues: ValuesStamp<Schemas[1], Hashed, WhenSet>,
390
413
  isChanges: 1,
391
414
  ];
392
415
 
@@ -1017,7 +1040,7 @@ export interface MergeableStore<
1017
1040
  * @since v5.0.0
1018
1041
  */
1019
1042
  setMergeableContent(
1020
- mergeableContent: MergeableContent<Schemas>,
1043
+ mergeableContent: MergeableContent<Schemas, true>,
1021
1044
  ): MergeableStore<Schemas>;
1022
1045
 
1023
1046
  /**
@@ -1161,7 +1184,8 @@ export interface MergeableStore<
1161
1184
  * @since v5.0.0
1162
1185
  */
1163
1186
  applyMergeableChanges(
1164
- mergeableChanges: MergeableChanges<Schemas> | MergeableContent<Schemas>,
1187
+ mergeableChanges:
1188
+ MergeableChanges<Schemas, false, true> | MergeableContent<Schemas, true>,
1165
1189
  ): MergeableStore<Schemas>;
1166
1190
 
1167
1191
  /**
@@ -1590,19 +1614,19 @@ export interface MergeableStore<
1590
1614
  * {
1591
1615
  * fido: [
1592
1616
  * {
1593
- * sold: [false, 'Nn1JUF----2FnHIC', 2603026204],
1617
+ * sold: [false, '', 3177411910],
1594
1618
  * species: ['dog', 'Nn1JUF----1FnHIC', 2817056260],
1595
1619
  * },
1596
1620
  * '',
1597
- * 2859424112,
1621
+ * 3078067457,
1598
1622
  * ],
1599
1623
  * },
1600
1624
  * '',
1601
- * 1640515891,
1625
+ * 1137907280,
1602
1626
  * ],
1603
1627
  * },
1604
1628
  * '',
1605
- * 2077041985,
1629
+ * 401719767,
1606
1630
  * ],
1607
1631
  * [{}, '', 0],
1608
1632
  * ];
@@ -1760,7 +1760,8 @@ export type DatabaseChangeListener = (tableName: string) => void;
1760
1760
  * `stopListeningToPersisted` has been renamed `delPersisterListener`.
1761
1761
  * @param store The Store to persist.
1762
1762
  * @param getPersisted An asynchronous function which will fetch content from
1763
- * the persistence layer (or `undefined` if not present).
1763
+ * the persistence layer. If it returns `undefined`, the load will use the
1764
+ * provided initial content if present, and otherwise leave the Store unchanged.
1764
1765
  * @param setPersisted An asynchronous function which will send content to the
1765
1766
  * persistence layer. Since v4.0, it receives functions for getting the Store
1766
1767
  * content and information about the changes made during a transaction. Since
@@ -202,11 +202,12 @@ export type PersistedStore<
202
202
  export type PersistedContent<
203
203
  Schemas extends OptionalSchemas,
204
204
  Persist extends Persists = Persists.StoreOnly,
205
+ WhenSet extends boolean = false,
205
206
  > = Persist extends Persists.StoreOrMergeableStore
206
- ? Content<Schemas> | MergeableContent<Schemas>
207
+ ? Content<Schemas, WhenSet> | MergeableContent<Schemas, WhenSet>
207
208
  : Persist extends Persists.MergeableStoreOnly
208
- ? MergeableContent<Schemas>
209
- : Content<Schemas>;
209
+ ? MergeableContent<Schemas, WhenSet>
210
+ : Content<Schemas, WhenSet>;
210
211
 
211
212
  /**
212
213
  * The PersistedChanges type is a generic representation of changes made to the
@@ -235,10 +236,11 @@ export type PersistedContent<
235
236
  export type PersistedChanges<
236
237
  Schemas extends OptionalSchemas,
237
238
  Persist extends Persists = Persists.StoreOnly,
239
+ WhenSet extends boolean = false,
238
240
  > = Persist extends Persists.StoreOrMergeableStore
239
- ? Changes<Schemas> | MergeableChanges<Schemas>
241
+ ? Changes<Schemas> | MergeableChanges<Schemas, false, WhenSet>
240
242
  : Persist extends Persists.MergeableStoreOnly
241
- ? MergeableChanges<Schemas>
243
+ ? MergeableChanges<Schemas, false, WhenSet>
242
244
  : Changes<Schemas>;
243
245
 
244
246
  /**
@@ -275,9 +277,10 @@ export type PersistedChanges<
275
277
  export type PersisterListener<
276
278
  Schemas extends OptionalSchemas,
277
279
  Persist extends Persists = Persists.StoreOnly,
280
+ WhenSet extends boolean = false,
278
281
  > = (
279
- content?: PersistedContent<Schemas, Persist>,
280
- changes?: PersistedChanges<Schemas, Persist>,
282
+ content?: PersistedContent<Schemas, Persist, WhenSet>,
283
+ changes?: PersistedChanges<Schemas, Persist, WhenSet>,
281
284
  ) => void;
282
285
 
283
286
  /**
@@ -1916,7 +1919,8 @@ export type DatabaseChangeListener = (tableName: string) => void;
1916
1919
  * `stopListeningToPersisted` has been renamed `delPersisterListener`.
1917
1920
  * @param store The Store to persist.
1918
1921
  * @param getPersisted An asynchronous function which will fetch content from
1919
- * the persistence layer (or `undefined` if not present).
1922
+ * the persistence layer. If it returns `undefined`, the load will use the
1923
+ * provided initial content if present, and otherwise leave the Store unchanged.
1920
1924
  * @param setPersisted An asynchronous function which will send content to the
1921
1925
  * persistence layer. Since v4.0, it receives functions for getting the Store
1922
1926
  * content and information about the changes made during a transaction. Since
@@ -2052,13 +2056,15 @@ export function createCustomPersister<
2052
2056
  Persist extends Persists = Persists.StoreOnly,
2053
2057
  >(
2054
2058
  store: PersistedStore<Schemas, Persist>,
2055
- getPersisted: () => Promise<PersistedContent<Schemas, Persist> | undefined>,
2059
+ getPersisted: () => Promise<
2060
+ PersistedContent<Schemas, Persist, true> | undefined
2061
+ >,
2056
2062
  setPersisted: (
2057
2063
  getContent: () => PersistedContent<Schemas, Persist>,
2058
2064
  changes?: PersistedChanges<Schemas, Persist>,
2059
2065
  ) => Promise<void>,
2060
2066
  addPersisterListener: (
2061
- listener: PersisterListener<Schemas, Persist>,
2067
+ listener: PersisterListener<Schemas, Persist, true>,
2062
2068
  ) => ListenerHandle | Promise<ListenerHandle>,
2063
2069
  delPersisterListener: (
2064
2070
  listenerHandle: ListenerHandle,
@@ -855,6 +855,10 @@ export type Param = (paramId: Id) => ParamValue | undefined;
855
855
  * The Select function is provided to the third `query` parameter of the
856
856
  * setQueryDefinition method. A query definition must call the Select function
857
857
  * at least once, otherwise it will be meaningless and return no data.
858
+ *
859
+ * A Row will only appear in the ResultTable if at least one Select clause
860
+ * produces a defined value for it. If all selected Cells or calculated values
861
+ * resolve to `undefined`, no ResultRow is created for that Row.
858
862
  * @example
859
863
  * This example shows a query that selects two Cells from the main query Table.
860
864
  *
@@ -991,6 +991,10 @@ export type Param = (paramId: Id) => ParamValue | undefined;
991
991
  * The Select function is provided to the third `query` parameter of the
992
992
  * setQueryDefinition method. A query definition must call the Select function
993
993
  * at least once, otherwise it will be meaningless and return no data.
994
+ *
995
+ * A Row will only appear in the ResultTable if at least one Select clause
996
+ * produces a defined value for it. If all selected Cells or calculated values
997
+ * resolve to `undefined`, no ResultRow is created for that Row.
994
998
  * @example
995
999
  * This example shows a query that selects two Cells from the main query Table.
996
1000
  *
package/index.js CHANGED
@@ -1225,8 +1225,10 @@ const createStore = () => {
1225
1225
  const changedRowIds = mapNew();
1226
1226
  const changedCellIds = mapNew();
1227
1227
  const changedCells = mapNew();
1228
+ const defaultedCells = mapNew();
1228
1229
  const changedValueIds = mapNew();
1229
1230
  const changedValues = mapNew();
1231
+ const defaultedValues = setNew();
1230
1232
  const invalidCells = mapNew();
1231
1233
  const invalidValues = mapNew();
1232
1234
  const tablesSchemaMap = mapNew();
@@ -1400,6 +1402,16 @@ const createStore = () => {
1400
1402
  collForEach(rowDefaulted, (cell, cellId) => {
1401
1403
  if (!objHas(row, cellId)) {
1402
1404
  row[cellId] = cell;
1405
+ ifNotUndefined(rowId, (rowId2) =>
1406
+ setAdd(
1407
+ mapEnsure(
1408
+ mapEnsure(defaultedCells, tableId, mapNew),
1409
+ rowId2,
1410
+ setNew,
1411
+ ),
1412
+ cellId,
1413
+ ),
1414
+ );
1403
1415
  }
1404
1416
  });
1405
1417
  collForEach(rowNonDefaulted, (cellId) => {
@@ -1416,6 +1428,7 @@ const createStore = () => {
1416
1428
  collForEach(valuesDefaulted, (value, valueId) => {
1417
1429
  if (!objHas(values, valueId)) {
1418
1430
  values[valueId] = value;
1431
+ setAdd(defaultedValues, valueId);
1419
1432
  }
1420
1433
  });
1421
1434
  collForEach(valuesNonDefaulted, (valueId) => {
@@ -1819,18 +1832,34 @@ const createStore = () => {
1819
1832
  );
1820
1833
  };
1821
1834
  const cellChanged = (tableId, rowId, cellId, oldCell, newCell) => {
1835
+ const defaulted =
1836
+ collHas(mapGet(mapGet(defaultedCells, tableId), rowId), cellId) &&
1837
+ isUndefined(oldCell)
1838
+ ? 1
1839
+ : 0;
1822
1840
  mapEnsure(
1823
1841
  mapEnsure(mapEnsure(changedCells, tableId, mapNew), rowId, mapNew),
1824
1842
  cellId,
1825
1843
  () => [oldCell, 0],
1826
1844
  )[1] = newCell;
1827
- internalListeners[3]?.(tableId, rowId, cellId, newCell, mutating);
1845
+ internalListeners[3]?.(
1846
+ tableId,
1847
+ rowId,
1848
+ cellId,
1849
+ newCell,
1850
+ mutating,
1851
+ defaulted,
1852
+ );
1853
+ collDel(mapGet(mapGet(defaultedCells, tableId), rowId), cellId);
1828
1854
  };
1829
1855
  const valueIdsChanged = (valueId, addedOrRemoved) =>
1830
1856
  idsChanged(changedValueIds, valueId, addedOrRemoved);
1831
1857
  const valueChanged = (valueId, oldValue, newValue) => {
1858
+ const defaulted =
1859
+ collHas(defaultedValues, valueId) && isUndefined(oldValue) ? 1 : 0;
1832
1860
  mapEnsure(changedValues, valueId, () => [oldValue, 0])[1] = newValue;
1833
- internalListeners[4]?.(valueId, newValue, mutating);
1861
+ internalListeners[4]?.(valueId, newValue, mutating, defaulted);
1862
+ collDel(defaultedValues, valueId);
1834
1863
  };
1835
1864
  const cellInvalid = (tableId, rowId, cellId, invalidCell, defaultedCell) => {
1836
1865
  arrayPush(
@@ -2618,9 +2647,11 @@ const createStore = () => {
2618
2647
  changedRowIds,
2619
2648
  changedCellIds,
2620
2649
  changedCells,
2650
+ defaultedCells,
2621
2651
  invalidCells,
2622
2652
  changedValueIds,
2623
2653
  changedValues,
2654
+ defaultedValues,
2624
2655
  invalidValues,
2625
2656
  ],
2626
2657
  collClear,
@@ -3125,7 +3156,14 @@ const createMergeableStore = (uniqueId, getNow) => {
3125
3156
  collClear(touchedCells);
3126
3157
  collClear(touchedValues);
3127
3158
  };
3128
- const cellChanged = (tableId, rowId, cellId, newCell, mutating) => {
3159
+ const cellChanged = (
3160
+ tableId,
3161
+ rowId,
3162
+ cellId,
3163
+ newCell,
3164
+ mutating,
3165
+ defaulted,
3166
+ ) => {
3129
3167
  setAdd(
3130
3168
  mapEnsure(mapEnsure(touchedCells, tableId, mapNew), rowId, setNew),
3131
3169
  cellId,
@@ -3143,7 +3181,9 @@ const createMergeableStore = (uniqueId, getNow) => {
3143
3181
  {
3144
3182
  [cellId]: [
3145
3183
  newCell,
3146
- defaultingContent ? EMPTY_STRING : getNextHlc(),
3184
+ defaultingContent || defaulted
3185
+ ? EMPTY_STRING
3186
+ : getNextHlc(),
3147
3187
  ],
3148
3188
  },
3149
3189
  ],
@@ -3156,7 +3196,7 @@ const createMergeableStore = (uniqueId, getNow) => {
3156
3196
  ]);
3157
3197
  }
3158
3198
  };
3159
- const valueChanged = (valueId, newValue, mutating) => {
3199
+ const valueChanged = (valueId, newValue, mutating, defaulted) => {
3160
3200
  setAdd(touchedValues, valueId);
3161
3201
  if (listeningToRawStoreChanges || mutating) {
3162
3202
  if (mutating) {
@@ -3168,7 +3208,7 @@ const createMergeableStore = (uniqueId, getNow) => {
3168
3208
  {
3169
3209
  [valueId]: [
3170
3210
  newValue,
3171
- defaultingContent ? EMPTY_STRING : getNextHlc(),
3211
+ defaultingContent || defaulted ? EMPTY_STRING : getNextHlc(),
3172
3212
  ],
3173
3213
  },
3174
3214
  ],
@@ -557,8 +557,10 @@ const createStore = () => {
557
557
  const changedRowIds = mapNew();
558
558
  const changedCellIds = mapNew();
559
559
  const changedCells = mapNew();
560
+ const defaultedCells = mapNew();
560
561
  const changedValueIds = mapNew();
561
562
  const changedValues = mapNew();
563
+ const defaultedValues = setNew();
562
564
  const invalidCells = mapNew();
563
565
  const invalidValues = mapNew();
564
566
  const tablesSchemaMap = mapNew();
@@ -732,6 +734,16 @@ const createStore = () => {
732
734
  collForEach(rowDefaulted, (cell, cellId) => {
733
735
  if (!objHas(row, cellId)) {
734
736
  row[cellId] = cell;
737
+ ifNotUndefined(rowId, (rowId2) =>
738
+ setAdd(
739
+ mapEnsure(
740
+ mapEnsure(defaultedCells, tableId, mapNew),
741
+ rowId2,
742
+ setNew,
743
+ ),
744
+ cellId,
745
+ ),
746
+ );
735
747
  }
736
748
  });
737
749
  collForEach(rowNonDefaulted, (cellId) => {
@@ -748,6 +760,7 @@ const createStore = () => {
748
760
  collForEach(valuesDefaulted, (value, valueId) => {
749
761
  if (!objHas(values, valueId)) {
750
762
  values[valueId] = value;
763
+ setAdd(defaultedValues, valueId);
751
764
  }
752
765
  });
753
766
  collForEach(valuesNonDefaulted, (valueId) => {
@@ -1151,18 +1164,34 @@ const createStore = () => {
1151
1164
  );
1152
1165
  };
1153
1166
  const cellChanged = (tableId, rowId, cellId, oldCell, newCell) => {
1167
+ const defaulted =
1168
+ collHas(mapGet(mapGet(defaultedCells, tableId), rowId), cellId) &&
1169
+ isUndefined(oldCell)
1170
+ ? 1
1171
+ : 0;
1154
1172
  mapEnsure(
1155
1173
  mapEnsure(mapEnsure(changedCells, tableId, mapNew), rowId, mapNew),
1156
1174
  cellId,
1157
1175
  () => [oldCell, 0],
1158
1176
  )[1] = newCell;
1159
- internalListeners[3]?.(tableId, rowId, cellId, newCell, mutating);
1177
+ internalListeners[3]?.(
1178
+ tableId,
1179
+ rowId,
1180
+ cellId,
1181
+ newCell,
1182
+ mutating,
1183
+ defaulted,
1184
+ );
1185
+ collDel(mapGet(mapGet(defaultedCells, tableId), rowId), cellId);
1160
1186
  };
1161
1187
  const valueIdsChanged = (valueId, addedOrRemoved) =>
1162
1188
  idsChanged(changedValueIds, valueId, addedOrRemoved);
1163
1189
  const valueChanged = (valueId, oldValue, newValue) => {
1190
+ const defaulted =
1191
+ collHas(defaultedValues, valueId) && isUndefined(oldValue) ? 1 : 0;
1164
1192
  mapEnsure(changedValues, valueId, () => [oldValue, 0])[1] = newValue;
1165
- internalListeners[4]?.(valueId, newValue, mutating);
1193
+ internalListeners[4]?.(valueId, newValue, mutating, defaulted);
1194
+ collDel(defaultedValues, valueId);
1166
1195
  };
1167
1196
  const cellInvalid = (tableId, rowId, cellId, invalidCell, defaultedCell) => {
1168
1197
  arrayPush(
@@ -1950,9 +1979,11 @@ const createStore = () => {
1950
1979
  changedRowIds,
1951
1980
  changedCellIds,
1952
1981
  changedCells,
1982
+ defaultedCells,
1953
1983
  invalidCells,
1954
1984
  changedValueIds,
1955
1985
  changedValues,
1986
+ defaultedValues,
1956
1987
  invalidValues,
1957
1988
  ],
1958
1989
  collClear,
@@ -2457,7 +2488,14 @@ const createMergeableStore = (uniqueId, getNow) => {
2457
2488
  collClear(touchedCells);
2458
2489
  collClear(touchedValues);
2459
2490
  };
2460
- const cellChanged = (tableId, rowId, cellId, newCell, mutating) => {
2491
+ const cellChanged = (
2492
+ tableId,
2493
+ rowId,
2494
+ cellId,
2495
+ newCell,
2496
+ mutating,
2497
+ defaulted,
2498
+ ) => {
2461
2499
  setAdd(
2462
2500
  mapEnsure(mapEnsure(touchedCells, tableId, mapNew), rowId, setNew),
2463
2501
  cellId,
@@ -2475,7 +2513,9 @@ const createMergeableStore = (uniqueId, getNow) => {
2475
2513
  {
2476
2514
  [cellId]: [
2477
2515
  newCell,
2478
- defaultingContent ? EMPTY_STRING : getNextHlc(),
2516
+ defaultingContent || defaulted
2517
+ ? EMPTY_STRING
2518
+ : getNextHlc(),
2479
2519
  ],
2480
2520
  },
2481
2521
  ],
@@ -2488,7 +2528,7 @@ const createMergeableStore = (uniqueId, getNow) => {
2488
2528
  ]);
2489
2529
  }
2490
2530
  };
2491
- const valueChanged = (valueId, newValue, mutating) => {
2531
+ const valueChanged = (valueId, newValue, mutating, defaulted) => {
2492
2532
  setAdd(touchedValues, valueId);
2493
2533
  if (listeningToRawStoreChanges || mutating) {
2494
2534
  if (mutating) {
@@ -2500,7 +2540,7 @@ const createMergeableStore = (uniqueId, getNow) => {
2500
2540
  {
2501
2541
  [valueId]: [
2502
2542
  newValue,
2503
- defaultingContent ? EMPTY_STRING : getNextHlc(),
2543
+ defaultingContent || defaulted ? EMPTY_STRING : getNextHlc(),
2504
2544
  ],
2505
2545
  },
2506
2546
  ],
@@ -557,8 +557,10 @@ const createStore = () => {
557
557
  const changedRowIds = mapNew();
558
558
  const changedCellIds = mapNew();
559
559
  const changedCells = mapNew();
560
+ const defaultedCells = mapNew();
560
561
  const changedValueIds = mapNew();
561
562
  const changedValues = mapNew();
563
+ const defaultedValues = setNew();
562
564
  const invalidCells = mapNew();
563
565
  const invalidValues = mapNew();
564
566
  const tablesSchemaMap = mapNew();
@@ -732,6 +734,16 @@ const createStore = () => {
732
734
  collForEach(rowDefaulted, (cell, cellId) => {
733
735
  if (!objHas(row, cellId)) {
734
736
  row[cellId] = cell;
737
+ ifNotUndefined(rowId, (rowId2) =>
738
+ setAdd(
739
+ mapEnsure(
740
+ mapEnsure(defaultedCells, tableId, mapNew),
741
+ rowId2,
742
+ setNew,
743
+ ),
744
+ cellId,
745
+ ),
746
+ );
735
747
  }
736
748
  });
737
749
  collForEach(rowNonDefaulted, (cellId) => {
@@ -748,6 +760,7 @@ const createStore = () => {
748
760
  collForEach(valuesDefaulted, (value, valueId) => {
749
761
  if (!objHas(values, valueId)) {
750
762
  values[valueId] = value;
763
+ setAdd(defaultedValues, valueId);
751
764
  }
752
765
  });
753
766
  collForEach(valuesNonDefaulted, (valueId) => {
@@ -1151,18 +1164,34 @@ const createStore = () => {
1151
1164
  );
1152
1165
  };
1153
1166
  const cellChanged = (tableId, rowId, cellId, oldCell, newCell) => {
1167
+ const defaulted =
1168
+ collHas(mapGet(mapGet(defaultedCells, tableId), rowId), cellId) &&
1169
+ isUndefined(oldCell)
1170
+ ? 1
1171
+ : 0;
1154
1172
  mapEnsure(
1155
1173
  mapEnsure(mapEnsure(changedCells, tableId, mapNew), rowId, mapNew),
1156
1174
  cellId,
1157
1175
  () => [oldCell, 0],
1158
1176
  )[1] = newCell;
1159
- internalListeners[3]?.(tableId, rowId, cellId, newCell, mutating);
1177
+ internalListeners[3]?.(
1178
+ tableId,
1179
+ rowId,
1180
+ cellId,
1181
+ newCell,
1182
+ mutating,
1183
+ defaulted,
1184
+ );
1185
+ collDel(mapGet(mapGet(defaultedCells, tableId), rowId), cellId);
1160
1186
  };
1161
1187
  const valueIdsChanged = (valueId, addedOrRemoved) =>
1162
1188
  idsChanged(changedValueIds, valueId, addedOrRemoved);
1163
1189
  const valueChanged = (valueId, oldValue, newValue) => {
1190
+ const defaulted =
1191
+ collHas(defaultedValues, valueId) && isUndefined(oldValue) ? 1 : 0;
1164
1192
  mapEnsure(changedValues, valueId, () => [oldValue, 0])[1] = newValue;
1165
- internalListeners[4]?.(valueId, newValue, mutating);
1193
+ internalListeners[4]?.(valueId, newValue, mutating, defaulted);
1194
+ collDel(defaultedValues, valueId);
1166
1195
  };
1167
1196
  const cellInvalid = (tableId, rowId, cellId, invalidCell, defaultedCell) => {
1168
1197
  arrayPush(
@@ -1950,9 +1979,11 @@ const createStore = () => {
1950
1979
  changedRowIds,
1951
1980
  changedCellIds,
1952
1981
  changedCells,
1982
+ defaultedCells,
1953
1983
  invalidCells,
1954
1984
  changedValueIds,
1955
1985
  changedValues,
1986
+ defaultedValues,
1956
1987
  invalidValues,
1957
1988
  ],
1958
1989
  collClear,
@@ -2457,7 +2488,14 @@ const createMergeableStore = (uniqueId, getNow) => {
2457
2488
  collClear(touchedCells);
2458
2489
  collClear(touchedValues);
2459
2490
  };
2460
- const cellChanged = (tableId, rowId, cellId, newCell, mutating) => {
2491
+ const cellChanged = (
2492
+ tableId,
2493
+ rowId,
2494
+ cellId,
2495
+ newCell,
2496
+ mutating,
2497
+ defaulted,
2498
+ ) => {
2461
2499
  setAdd(
2462
2500
  mapEnsure(mapEnsure(touchedCells, tableId, mapNew), rowId, setNew),
2463
2501
  cellId,
@@ -2475,7 +2513,9 @@ const createMergeableStore = (uniqueId, getNow) => {
2475
2513
  {
2476
2514
  [cellId]: [
2477
2515
  newCell,
2478
- defaultingContent ? EMPTY_STRING : getNextHlc(),
2516
+ defaultingContent || defaulted
2517
+ ? EMPTY_STRING
2518
+ : getNextHlc(),
2479
2519
  ],
2480
2520
  },
2481
2521
  ],
@@ -2488,7 +2528,7 @@ const createMergeableStore = (uniqueId, getNow) => {
2488
2528
  ]);
2489
2529
  }
2490
2530
  };
2491
- const valueChanged = (valueId, newValue, mutating) => {
2531
+ const valueChanged = (valueId, newValue, mutating, defaulted) => {
2492
2532
  setAdd(touchedValues, valueId);
2493
2533
  if (listeningToRawStoreChanges || mutating) {
2494
2534
  if (mutating) {
@@ -2500,7 +2540,7 @@ const createMergeableStore = (uniqueId, getNow) => {
2500
2540
  {
2501
2541
  [valueId]: [
2502
2542
  newValue,
2503
- defaultingContent ? EMPTY_STRING : getNextHlc(),
2543
+ defaultingContent || defaulted ? EMPTY_STRING : getNextHlc(),
2504
2544
  ],
2505
2545
  },
2506
2546
  ],