tinybase 8.0.0-beta.2 → 8.0.0-beta.4

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 (282) hide show
  1. package/@types/_internal/store/with-schemas/index.d.ts +2 -2
  2. package/@types/common/index.d.ts +22 -0
  3. package/@types/common/with-schemas/index.d.ts +22 -0
  4. package/@types/middleware/index.d.ts +44 -119
  5. package/@types/middleware/with-schemas/index.d.ts +44 -142
  6. package/@types/store/index.d.ts +132 -79
  7. package/@types/store/with-schemas/index.d.ts +137 -81
  8. package/@types/ui-react-dom/index.d.ts +6 -4
  9. package/@types/ui-react-dom/with-schemas/index.d.ts +6 -4
  10. package/checkpoints/index.js +2 -8
  11. package/checkpoints/with-schemas/index.js +2 -8
  12. package/index.js +311 -209
  13. package/mergeable-store/index.js +330 -201
  14. package/mergeable-store/with-schemas/index.js +330 -201
  15. package/middleware/index.js +2 -40
  16. package/middleware/with-schemas/index.js +2 -40
  17. package/min/checkpoints/index.js +1 -1
  18. package/min/checkpoints/index.js.gz +0 -0
  19. package/min/checkpoints/with-schemas/index.js +1 -1
  20. package/min/checkpoints/with-schemas/index.js.gz +0 -0
  21. package/min/index.js +1 -1
  22. package/min/index.js.gz +0 -0
  23. package/min/mergeable-store/index.js +1 -1
  24. package/min/mergeable-store/index.js.gz +0 -0
  25. package/min/mergeable-store/with-schemas/index.js +1 -1
  26. package/min/mergeable-store/with-schemas/index.js.gz +0 -0
  27. package/min/middleware/index.js +1 -1
  28. package/min/middleware/index.js.gz +0 -0
  29. package/min/middleware/with-schemas/index.js +1 -1
  30. package/min/middleware/with-schemas/index.js.gz +0 -0
  31. package/min/omni/index.js +1 -1
  32. package/min/omni/index.js.gz +0 -0
  33. package/min/omni/with-schemas/index.js +1 -1
  34. package/min/omni/with-schemas/index.js.gz +0 -0
  35. package/min/persisters/index.js +1 -1
  36. package/min/persisters/index.js.gz +0 -0
  37. package/min/persisters/persister-automerge/index.js +1 -1
  38. package/min/persisters/persister-automerge/index.js.gz +0 -0
  39. package/min/persisters/persister-automerge/with-schemas/index.js +1 -1
  40. package/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
  41. package/min/persisters/persister-browser/index.js +1 -1
  42. package/min/persisters/persister-browser/index.js.gz +0 -0
  43. package/min/persisters/persister-browser/with-schemas/index.js +1 -1
  44. package/min/persisters/persister-browser/with-schemas/index.js.gz +0 -0
  45. package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
  46. package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
  47. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
  48. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
  49. package/min/persisters/persister-durable-object-sql-storage/index.js +1 -1
  50. package/min/persisters/persister-durable-object-sql-storage/index.js.gz +0 -0
  51. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js +1 -1
  52. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js.gz +0 -0
  53. package/min/persisters/persister-durable-object-storage/index.js +1 -1
  54. package/min/persisters/persister-durable-object-storage/index.js.gz +0 -0
  55. package/min/persisters/persister-durable-object-storage/with-schemas/index.js +1 -1
  56. package/min/persisters/persister-durable-object-storage/with-schemas/index.js.gz +0 -0
  57. package/min/persisters/persister-electric-sql/index.js +1 -1
  58. package/min/persisters/persister-electric-sql/index.js.gz +0 -0
  59. package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
  60. package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
  61. package/min/persisters/persister-expo-sqlite/index.js +1 -1
  62. package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
  63. package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
  64. package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
  65. package/min/persisters/persister-file/index.js +1 -1
  66. package/min/persisters/persister-file/index.js.gz +0 -0
  67. package/min/persisters/persister-file/with-schemas/index.js +1 -1
  68. package/min/persisters/persister-file/with-schemas/index.js.gz +0 -0
  69. package/min/persisters/persister-indexed-db/index.js +1 -1
  70. package/min/persisters/persister-indexed-db/index.js.gz +0 -0
  71. package/min/persisters/persister-indexed-db/with-schemas/index.js +1 -1
  72. package/min/persisters/persister-indexed-db/with-schemas/index.js.gz +0 -0
  73. package/min/persisters/persister-libsql/index.js +1 -1
  74. package/min/persisters/persister-libsql/index.js.gz +0 -0
  75. package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
  76. package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
  77. package/min/persisters/persister-partykit-client/index.js +1 -1
  78. package/min/persisters/persister-partykit-client/index.js.gz +0 -0
  79. package/min/persisters/persister-partykit-client/with-schemas/index.js +1 -1
  80. package/min/persisters/persister-partykit-client/with-schemas/index.js.gz +0 -0
  81. package/min/persisters/persister-pglite/index.js +1 -1
  82. package/min/persisters/persister-pglite/index.js.gz +0 -0
  83. package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
  84. package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
  85. package/min/persisters/persister-postgres/index.js +1 -1
  86. package/min/persisters/persister-postgres/index.js.gz +0 -0
  87. package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
  88. package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
  89. package/min/persisters/persister-powersync/index.js +1 -1
  90. package/min/persisters/persister-powersync/index.js.gz +0 -0
  91. package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
  92. package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
  93. package/min/persisters/persister-react-native-mmkv/index.js +1 -1
  94. package/min/persisters/persister-react-native-mmkv/index.js.gz +0 -0
  95. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js +1 -1
  96. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js.gz +0 -0
  97. package/min/persisters/persister-react-native-sqlite/index.js +1 -1
  98. package/min/persisters/persister-react-native-sqlite/index.js.gz +0 -0
  99. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js +1 -1
  100. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js.gz +0 -0
  101. package/min/persisters/persister-remote/index.js +1 -1
  102. package/min/persisters/persister-remote/index.js.gz +0 -0
  103. package/min/persisters/persister-remote/with-schemas/index.js +1 -1
  104. package/min/persisters/persister-remote/with-schemas/index.js.gz +0 -0
  105. package/min/persisters/persister-sqlite-bun/index.js +1 -1
  106. package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
  107. package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -1
  108. package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
  109. package/min/persisters/persister-sqlite-wasm/index.js +1 -1
  110. package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
  111. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
  112. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
  113. package/min/persisters/persister-sqlite3/index.js +1 -1
  114. package/min/persisters/persister-sqlite3/index.js.gz +0 -0
  115. package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
  116. package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
  117. package/min/persisters/persister-yjs/index.js +1 -1
  118. package/min/persisters/persister-yjs/index.js.gz +0 -0
  119. package/min/persisters/persister-yjs/with-schemas/index.js +1 -1
  120. package/min/persisters/persister-yjs/with-schemas/index.js.gz +0 -0
  121. package/min/persisters/with-schemas/index.js +1 -1
  122. package/min/persisters/with-schemas/index.js.gz +0 -0
  123. package/min/queries/index.js +1 -1
  124. package/min/queries/index.js.gz +0 -0
  125. package/min/queries/with-schemas/index.js +1 -1
  126. package/min/queries/with-schemas/index.js.gz +0 -0
  127. package/min/schematizers/index.js +1 -1
  128. package/min/schematizers/index.js.gz +0 -0
  129. package/min/schematizers/schematizer-arktype/index.js +1 -1
  130. package/min/schematizers/schematizer-arktype/index.js.gz +0 -0
  131. package/min/schematizers/schematizer-arktype/with-schemas/index.js +1 -1
  132. package/min/schematizers/schematizer-arktype/with-schemas/index.js.gz +0 -0
  133. package/min/schematizers/schematizer-effect/index.js +1 -1
  134. package/min/schematizers/schematizer-effect/index.js.gz +0 -0
  135. package/min/schematizers/schematizer-effect/with-schemas/index.js +1 -1
  136. package/min/schematizers/schematizer-effect/with-schemas/index.js.gz +0 -0
  137. package/min/schematizers/schematizer-typebox/index.js +1 -1
  138. package/min/schematizers/schematizer-typebox/index.js.gz +0 -0
  139. package/min/schematizers/schematizer-typebox/with-schemas/index.js +1 -1
  140. package/min/schematizers/schematizer-typebox/with-schemas/index.js.gz +0 -0
  141. package/min/schematizers/schematizer-valibot/index.js +1 -1
  142. package/min/schematizers/schematizer-valibot/index.js.gz +0 -0
  143. package/min/schematizers/schematizer-valibot/with-schemas/index.js +1 -1
  144. package/min/schematizers/schematizer-valibot/with-schemas/index.js.gz +0 -0
  145. package/min/schematizers/schematizer-yup/index.js +1 -1
  146. package/min/schematizers/schematizer-yup/index.js.gz +0 -0
  147. package/min/schematizers/schematizer-yup/with-schemas/index.js +1 -1
  148. package/min/schematizers/schematizer-yup/with-schemas/index.js.gz +0 -0
  149. package/min/schematizers/schematizer-zod/index.js +1 -1
  150. package/min/schematizers/schematizer-zod/index.js.gz +0 -0
  151. package/min/schematizers/schematizer-zod/with-schemas/index.js +1 -1
  152. package/min/schematizers/schematizer-zod/with-schemas/index.js.gz +0 -0
  153. package/min/schematizers/with-schemas/index.js +1 -1
  154. package/min/schematizers/with-schemas/index.js.gz +0 -0
  155. package/min/store/index.js +1 -1
  156. package/min/store/index.js.gz +0 -0
  157. package/min/store/with-schemas/index.js +1 -1
  158. package/min/store/with-schemas/index.js.gz +0 -0
  159. package/min/synchronizers/index.js +1 -1
  160. package/min/synchronizers/index.js.gz +0 -0
  161. package/min/synchronizers/synchronizer-broadcast-channel/index.js +1 -1
  162. package/min/synchronizers/synchronizer-broadcast-channel/index.js.gz +0 -0
  163. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +1 -1
  164. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js.gz +0 -0
  165. package/min/synchronizers/synchronizer-local/index.js +1 -1
  166. package/min/synchronizers/synchronizer-local/index.js.gz +0 -0
  167. package/min/synchronizers/synchronizer-local/with-schemas/index.js +1 -1
  168. package/min/synchronizers/synchronizer-local/with-schemas/index.js.gz +0 -0
  169. package/min/synchronizers/synchronizer-ws-client/index.js +1 -1
  170. package/min/synchronizers/synchronizer-ws-client/index.js.gz +0 -0
  171. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js +1 -1
  172. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js.gz +0 -0
  173. package/min/synchronizers/synchronizer-ws-server/index.js +1 -1
  174. package/min/synchronizers/synchronizer-ws-server/index.js.gz +0 -0
  175. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js +1 -1
  176. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js.gz +0 -0
  177. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js +1 -1
  178. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js.gz +0 -0
  179. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +1 -1
  180. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js.gz +0 -0
  181. package/min/synchronizers/with-schemas/index.js +1 -1
  182. package/min/synchronizers/with-schemas/index.js.gz +0 -0
  183. package/min/ui-react/index.js +1 -1
  184. package/min/ui-react/index.js.gz +0 -0
  185. package/min/ui-react/with-schemas/index.js +1 -1
  186. package/min/ui-react/with-schemas/index.js.gz +0 -0
  187. package/min/ui-react-dom/index.js +1 -1
  188. package/min/ui-react-dom/index.js.gz +0 -0
  189. package/min/ui-react-dom/with-schemas/index.js +1 -1
  190. package/min/ui-react-dom/with-schemas/index.js.gz +0 -0
  191. package/min/ui-react-inspector/index.js +1 -1
  192. package/min/ui-react-inspector/index.js.gz +0 -0
  193. package/min/ui-react-inspector/with-schemas/index.js +1 -1
  194. package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
  195. package/min/with-schemas/index.js +1 -1
  196. package/min/with-schemas/index.js.gz +0 -0
  197. package/omni/index.js +418 -219
  198. package/omni/with-schemas/index.js +418 -219
  199. package/package.json +10 -10
  200. package/persisters/index.js +5 -5
  201. package/persisters/persister-automerge/index.js +5 -5
  202. package/persisters/persister-automerge/with-schemas/index.js +5 -5
  203. package/persisters/persister-browser/index.js +5 -5
  204. package/persisters/persister-browser/with-schemas/index.js +5 -5
  205. package/persisters/persister-cr-sqlite-wasm/index.js +5 -5
  206. package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +5 -5
  207. package/persisters/persister-durable-object-sql-storage/index.js +5 -5
  208. package/persisters/persister-durable-object-sql-storage/with-schemas/index.js +5 -5
  209. package/persisters/persister-durable-object-storage/index.js +5 -5
  210. package/persisters/persister-durable-object-storage/with-schemas/index.js +5 -5
  211. package/persisters/persister-electric-sql/index.js +5 -5
  212. package/persisters/persister-electric-sql/with-schemas/index.js +5 -5
  213. package/persisters/persister-expo-sqlite/index.js +5 -5
  214. package/persisters/persister-expo-sqlite/with-schemas/index.js +5 -5
  215. package/persisters/persister-file/index.js +5 -5
  216. package/persisters/persister-file/with-schemas/index.js +5 -5
  217. package/persisters/persister-indexed-db/index.js +5 -5
  218. package/persisters/persister-indexed-db/with-schemas/index.js +5 -5
  219. package/persisters/persister-libsql/index.js +5 -5
  220. package/persisters/persister-libsql/with-schemas/index.js +5 -5
  221. package/persisters/persister-partykit-client/index.js +5 -5
  222. package/persisters/persister-partykit-client/with-schemas/index.js +5 -5
  223. package/persisters/persister-pglite/index.js +5 -5
  224. package/persisters/persister-pglite/with-schemas/index.js +5 -5
  225. package/persisters/persister-postgres/index.js +5 -5
  226. package/persisters/persister-postgres/with-schemas/index.js +5 -5
  227. package/persisters/persister-powersync/index.js +5 -5
  228. package/persisters/persister-powersync/with-schemas/index.js +5 -5
  229. package/persisters/persister-react-native-mmkv/index.js +5 -5
  230. package/persisters/persister-react-native-mmkv/with-schemas/index.js +5 -5
  231. package/persisters/persister-react-native-sqlite/index.js +5 -5
  232. package/persisters/persister-react-native-sqlite/with-schemas/index.js +5 -5
  233. package/persisters/persister-remote/index.js +5 -5
  234. package/persisters/persister-remote/with-schemas/index.js +5 -5
  235. package/persisters/persister-sqlite-bun/index.js +5 -5
  236. package/persisters/persister-sqlite-bun/with-schemas/index.js +5 -5
  237. package/persisters/persister-sqlite-wasm/index.js +5 -5
  238. package/persisters/persister-sqlite-wasm/with-schemas/index.js +5 -5
  239. package/persisters/persister-sqlite3/index.js +5 -5
  240. package/persisters/persister-sqlite3/with-schemas/index.js +5 -5
  241. package/persisters/persister-yjs/index.js +5 -5
  242. package/persisters/persister-yjs/with-schemas/index.js +5 -5
  243. package/persisters/with-schemas/index.js +5 -5
  244. package/queries/index.js +11 -4
  245. package/queries/with-schemas/index.js +11 -4
  246. package/readme.md +3 -3
  247. package/releases.md +38 -3
  248. package/schematizers/index.js +9 -1
  249. package/schematizers/schematizer-arktype/index.js +16 -1
  250. package/schematizers/schematizer-arktype/with-schemas/index.js +16 -1
  251. package/schematizers/schematizer-effect/index.js +15 -2
  252. package/schematizers/schematizer-effect/with-schemas/index.js +15 -2
  253. package/schematizers/schematizer-typebox/index.js +9 -1
  254. package/schematizers/schematizer-typebox/with-schemas/index.js +9 -1
  255. package/schematizers/schematizer-valibot/index.js +17 -2
  256. package/schematizers/schematizer-valibot/with-schemas/index.js +17 -2
  257. package/schematizers/schematizer-yup/index.js +9 -1
  258. package/schematizers/schematizer-yup/with-schemas/index.js +9 -1
  259. package/schematizers/schematizer-zod/index.js +13 -2
  260. package/schematizers/schematizer-zod/with-schemas/index.js +13 -2
  261. package/schematizers/with-schemas/index.js +9 -1
  262. package/store/index.js +254 -149
  263. package/store/with-schemas/index.js +254 -149
  264. package/synchronizers/index.js +5 -5
  265. package/synchronizers/synchronizer-broadcast-channel/index.js +5 -5
  266. package/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +5 -5
  267. package/synchronizers/synchronizer-local/index.js +5 -5
  268. package/synchronizers/synchronizer-local/with-schemas/index.js +5 -5
  269. package/synchronizers/synchronizer-ws-client/index.js +5 -5
  270. package/synchronizers/synchronizer-ws-client/with-schemas/index.js +5 -5
  271. package/synchronizers/synchronizer-ws-server/index.js +5 -5
  272. package/synchronizers/synchronizer-ws-server/with-schemas/index.js +5 -5
  273. package/synchronizers/synchronizer-ws-server-durable-object/index.js +5 -5
  274. package/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +5 -5
  275. package/synchronizers/with-schemas/index.js +5 -5
  276. package/ui-react/index.js +6 -0
  277. package/ui-react/with-schemas/index.js +6 -0
  278. package/ui-react-dom/index.js +113 -6
  279. package/ui-react-dom/with-schemas/index.js +113 -6
  280. package/ui-react-inspector/index.js +329 -129
  281. package/ui-react-inspector/with-schemas/index.js +329 -129
  282. package/with-schemas/index.js +311 -209
@@ -48,7 +48,7 @@ export type CellIsDefaultedFromSchema<
48
48
  Then,
49
49
  Else,
50
50
  > = Schema[TableId][CellId] extends {
51
- default: string | number | boolean;
51
+ default: infer _;
52
52
  }
53
53
  ? Then
54
54
  : Else;
@@ -83,7 +83,7 @@ export type ValueIsDefaultedFromSchema<
83
83
  Then,
84
84
  Else,
85
85
  > = Schema[ValueId] extends {
86
- default: string | number | boolean;
86
+ default: infer _;
87
87
  }
88
88
  ? Then
89
89
  : Else;
@@ -16,6 +16,28 @@ import type {CellOrUndefined, ValueOrUndefined} from '../store/index.d.ts';
16
16
  */
17
17
  export type Json = string;
18
18
 
19
+ /**
20
+ * The AnyObject type is a simple alias for a plain object with string keys and
21
+ * unknown values.
22
+ *
23
+ * It is used to indicate that the value should be considered to be a plain
24
+ * JavaScript object, as can be stored in a Cell or Value with the `object`
25
+ * schema type.
26
+ * @category General
27
+ * @since v8.0.0
28
+ */
29
+ export type AnyObject = {[key: string]: unknown};
30
+
31
+ /**
32
+ * The AnyArray type is a simple alias for an array with unknown values.
33
+ *
34
+ * It is used to indicate that the value should be considered to be a JavaScript
35
+ * array, as can be stored in a Cell or Value with the `array` schema type.
36
+ * @category General
37
+ * @since v8.0.0
38
+ */
39
+ export type AnyArray = unknown[] | readonly unknown[];
40
+
19
41
  /**
20
42
  * The Ids type is a simple alias for an array of strings, but is used to
21
43
  * indicate that the strings should be considered to be the keys of objects
@@ -28,6 +28,28 @@ import type {
28
28
  */
29
29
  export type Json = string;
30
30
 
31
+ /**
32
+ * The AnyObject type is a simple alias for a plain object with string keys and
33
+ * unknown values.
34
+ *
35
+ * It is used to indicate that the value should be considered to be a plain
36
+ * JavaScript object, as can be stored in a Cell or Value with the `object`
37
+ * schema type.
38
+ * @category General
39
+ * @since v8.0.0
40
+ */
41
+ export type AnyObject = {[key: string]: unknown};
42
+
43
+ /**
44
+ * The AnyArray type is a simple alias for an array with unknown values.
45
+ *
46
+ * It is used to indicate that the value should be considered to be a JavaScript
47
+ * array, as can be stored in a Cell or Value with the `array` schema type.
48
+ * @category General
49
+ * @since v8.0.0
50
+ */
51
+ export type AnyArray = unknown[] | readonly unknown[];
52
+
31
53
  /**
32
54
  * The Ids type is a simple alias for an array of strings, but is used to
33
55
  * indicate that the strings should be considered to be the keys of objects
@@ -97,6 +97,15 @@ export type WillSetTableCallback = (
97
97
  * Multiple WillSetRowCallback functions can be registered and they will be
98
98
  * called sequentially, the Row being updated successively. If any callback
99
99
  * returns `undefined`, the chain short-circuits and the Row will not be set.
100
+ *
101
+ * This callback fires both when setRow is called with a whole Row, and when
102
+ * setCell is called for a single Cell. When fired from setCell, the Row passed
103
+ * to the callback is a prospective row containing the existing Cell values
104
+ * merged with the new Cell value. The entire returned Row is then applied as
105
+ * though setRow had been called with it: cells present in the returned Row are
106
+ * written (each also passing through willSetCell), and cells absent from the
107
+ * returned Row that were present in the existing Row will be deleted. Return
108
+ * `undefined` to cancel the operation entirely.
100
109
  * @param tableId The Id of the Table being written to.
101
110
  * @param rowId The Id of the Row being set.
102
111
  * @param row The Row object about to be set.
@@ -311,49 +320,6 @@ export type WillApplyChangesCallback = (
311
320
  changes: Changes,
312
321
  ) => Changes | undefined;
313
322
 
314
- /**
315
- * The DidSetRowCallback type describes a function called after a Row is changed
316
- * during a transaction, and after mutator listeners have fired.
317
- *
318
- * Unlike the `willSet*` callbacks, which intercept writes as they happen,
319
- * `didSetRow` fires once per touched Row after all cell writes in the
320
- * transaction have completed. This means multiple cell changes to the same Row
321
- * within a single transaction result in just one `didSetRow` call, with the
322
- * full before-transaction and after-transaction Row states.
323
- *
324
- * The callback receives the Table Id, Row Id, the Row as it was at the start of
325
- * the transaction (`oldRow`), and the Row as it is now (`newRow`). It must
326
- * return a Row:
327
- *
328
- * - `newRow` to accept the changes.
329
- * - a different `Row` to replace the final state.
330
- * - `oldRow` to revert all changes to the Row.
331
- * - an empty object to delete the Row.
332
- *
333
- * Multiple DidSetRowCallback functions can be registered for the same table and
334
- * they will be called sequentially, each receiving the Row returned by the
335
- * previous callback. The chain never short-circuits: all registered callbacks
336
- * always run.
337
- *
338
- * Note that `addDidSetRowCallback` is table-scoped: you must specify the table
339
- * Id when registering. Callbacks are only invoked for rows in the specified
340
- * table, keeping overhead to zero for other tables.
341
- * @param tableId The Id of the Table containing the changed Row.
342
- * @param rowId The Id of the Row that was changed.
343
- * @param oldRow The Row as it was at the start of the transaction.
344
- * @param newRow The Row as it is now, after all cell writes including those
345
- * made by mutating listeners.
346
- * @returns The Row to use as the final state.
347
- * @category Callback
348
- * @since v8.0.0
349
- */
350
- export type DidSetRowCallback = (
351
- tableId: Id,
352
- rowId: Id,
353
- oldRow: Row,
354
- newRow: Row,
355
- ) => Row;
356
-
357
323
  /**
358
324
  * A Middleware object lets you intercept and validate writes to a Store.
359
325
  *
@@ -585,6 +551,15 @@ export interface Middleware {
585
551
  * write. Multiple callbacks can be registered and they are called
586
552
  * sequentially, each receiving the (possibly transformed) row from the
587
553
  * previous callback.
554
+ *
555
+ * This callback fires both when a whole Row is set with the setRow method,
556
+ * _and_ when a single Cell is set with the setCell method. When called from
557
+ * setCell, the callback receives a prospective row consisting of the existing
558
+ * Cell values merged with the new Cell value. The entire returned Row is then
559
+ * applied as though setRow had been called: all cells in the returned Row are
560
+ * written (each also passing through willSetCell), and any cells absent from
561
+ * the returned Row that existed before will be deleted. Return `undefined` to
562
+ * cancel the operation entirely.
588
563
  * @param callback The WillSetRowCallback to register.
589
564
  * @returns A reference to the Middleware object, for chaining.
590
565
  * @example
@@ -634,6 +609,32 @@ export interface Middleware {
634
609
  *
635
610
  * middleware.destroy();
636
611
  * ```
612
+ * @example
613
+ * This example shows the callback firing when setCell is called,
614
+ * automatically stamping an 'updated' timestamp onto the row each time any
615
+ * cell in it is written.
616
+ *
617
+ * ```js
618
+ * import {createMiddleware, createStore} from 'tinybase';
619
+ *
620
+ * const store = createStore();
621
+ * const middleware = createMiddleware(store);
622
+ *
623
+ * store.setRow('pets', 'fido', {species: 'dog'});
624
+ *
625
+ * middleware.addWillSetRowCallback((_tableId, _rowId, row) => ({
626
+ * ...row,
627
+ * updated: Date.now(),
628
+ * }));
629
+ *
630
+ * store.setCell('pets', 'fido', 'legs', 4);
631
+ * console.log(store.getCell('pets', 'fido', 'legs'));
632
+ * // -> 4
633
+ * console.log(typeof store.getCell('pets', 'fido', 'updated'));
634
+ * // -> 'number'
635
+ *
636
+ * middleware.destroy();
637
+ * ```
637
638
  * @category Configuration
638
639
  * @since v8.0.0
639
640
  */
@@ -1044,82 +1045,6 @@ export interface Middleware {
1044
1045
  */
1045
1046
  addWillApplyChangesCallback(callback: WillApplyChangesCallback): Middleware;
1046
1047
 
1047
- /**
1048
- * The addDidSetRowCallback method registers a DidSetRowCallback for a
1049
- * specific table that will be called after any Row in that table is changed
1050
- * during a transaction, after mutator listeners have fired.
1051
- *
1052
- * Unlike `willSetRow`, which fires synchronously during each write, this
1053
- * callback fires once per changed Row after all cell writes in the
1054
- * transaction have landed. Multiple cell changes to the same Row within a
1055
- * transaction produce a single callback with the full before/after Row
1056
- * states.
1057
- *
1058
- * The callback receives `oldRow` (the Row at the start of the transaction)
1059
- * and `newRow` (the Row after all writes). Return `newRow` to accept, a
1060
- * different `Row` to replace, `oldRow` to revert, or an empty object to
1061
- * delete.
1062
- * @param tableId The Id of the Table to watch.
1063
- * @param callback The DidSetRowCallback to register.
1064
- * @returns A reference to the Middleware object, for chaining.
1065
- * @example
1066
- * This example registers a callback that validates the 'pets' table,
1067
- * reverting any row that ends up without a required 'species' cell.
1068
- *
1069
- * ```js
1070
- * import {createMiddleware, createStore} from 'tinybase';
1071
- *
1072
- * const store = createStore();
1073
- * const middleware = createMiddleware(store);
1074
- *
1075
- * middleware.addDidSetRowCallback('pets', (_tableId, _rowId, oldRow, newRow) =>
1076
- * 'species' in newRow ? newRow : oldRow,
1077
- * );
1078
- *
1079
- * store.setRow('pets', 'fido', {species: 'dog', name: 'Fido'});
1080
- * console.log(store.getRow('pets', 'fido'));
1081
- * // -> {species: 'dog', name: 'Fido'}
1082
- *
1083
- * store.setRow('pets', 'nemo', {name: 'Nemo'});
1084
- * console.log(store.getRow('pets', 'nemo'));
1085
- * // -> {}
1086
- *
1087
- * middleware.destroy();
1088
- * ```
1089
- * @example
1090
- * This example shows that multiple cell changes in one transaction result in
1091
- * a single didSetRow callback with the full before/after row states.
1092
- *
1093
- * ```js
1094
- * import {createMiddleware, createStore} from 'tinybase';
1095
- *
1096
- * const store = createStore();
1097
- * const middleware = createMiddleware(store);
1098
- *
1099
- * const seen = [];
1100
- * middleware.addDidSetRowCallback('pets', (_tableId, rowId, oldRow, newRow) => {
1101
- * seen.push({rowId, oldRow: {...oldRow}, newRow: {...newRow}});
1102
- * return newRow;
1103
- * });
1104
- *
1105
- * store.transaction(() => {
1106
- * store.setCell('pets', 'fido', 'name', 'Fido');
1107
- * store.setCell('pets', 'fido', 'species', 'dog');
1108
- * });
1109
- * console.log(seen.length);
1110
- * // -> 1
1111
- * console.log(seen[0].rowId);
1112
- * // -> 'fido'
1113
- * console.log(seen[0].newRow);
1114
- * // -> {name: 'Fido', species: 'dog'}
1115
- *
1116
- * middleware.destroy();
1117
- * ```
1118
- * @category Configuration
1119
- * @since v8.0.0
1120
- */
1121
- addDidSetRowCallback(tableId: Id, callback: DidSetRowCallback): Middleware;
1122
-
1123
1048
  /**
1124
1049
  * The destroy method should be called when this Middleware object is no
1125
1050
  * longer used. It removes all hooks and listeners from the Store, and
@@ -144,6 +144,15 @@ export type WillSetTableCallback<
144
144
  * Multiple WillSetRowCallback functions can be registered and they will be
145
145
  * called sequentially, the Row being updated successively. If any callback
146
146
  * returns `undefined`, the chain short-circuits and the Row will not be set.
147
+ *
148
+ * This callback fires both when setRow is called with a whole Row, and when
149
+ * setCell is called for a single Cell. When fired from setCell, the Row passed
150
+ * to the callback is a prospective row containing the existing Cell values
151
+ * merged with the new Cell value. The entire returned Row is then applied as
152
+ * though setRow had been called with it: cells present in the returned Row are
153
+ * written (each also passing through willSetCell), and cells absent from the
154
+ * returned Row that were present in the existing Row will be deleted. Return
155
+ * `undefined` to cancel the operation entirely.
147
156
  * @param tableId The Id of the Table being written to.
148
157
  * @param rowId The Id of the Row being set.
149
158
  * @param row The Row object about to be set.
@@ -476,63 +485,6 @@ export type WillApplyChangesCallback<Schemas extends OptionalSchemas> = (
476
485
  changes: Changes<Schemas>,
477
486
  ) => Changes<Schemas> | undefined;
478
487
 
479
- /**
480
- * The DidSetRowCallback type describes a function called after a Row is changed
481
- * during a transaction, and after mutator listeners have fired.
482
- *
483
- * This has schema-based typing. The following is a simplified representation:
484
- *
485
- * ```ts override
486
- * (
487
- * tableId: Id,
488
- * rowId: Id,
489
- * oldRow: Row,
490
- * newRow: Row,
491
- * ) => Row;
492
- * ```
493
- *
494
- * Unlike the `willSet*` callbacks, which intercept writes as they happen,
495
- * `didSetRow` fires once per touched Row after all cell writes in the
496
- * transaction have completed. This means multiple cell changes to the same Row
497
- * within a single transaction result in just one `didSetRow` call, with the
498
- * full before-transaction and after-transaction Row states.
499
- *
500
- * The callback receives the Table Id, Row Id, the Row as it was at the start of
501
- * the transaction (`oldRow`), and the Row as it is now (`newRow`). It must
502
- * return a Row:
503
- *
504
- * - `newRow` to accept the changes.
505
- * - a different `Row` to replace the final state.
506
- * - `oldRow` to revert all changes to the Row.
507
- * - an empty object to delete the Row.
508
- *
509
- * Multiple DidSetRowCallback functions can be registered for the same table and
510
- * they will be called sequentially, each receiving the Row returned by the
511
- * previous callback. The chain never short-circuits: all registered callbacks
512
- * always run.
513
- *
514
- * Note that `addDidSetRowCallback` is table-scoped: you must specify the table
515
- * Id when registering. Callbacks are only invoked for rows in the specified
516
- * table, keeping overhead to zero for other tables.
517
- * @param tableId The Id of the Table containing the changed Row.
518
- * @param rowId The Id of the Row that was changed.
519
- * @param oldRow The Row as it was at the start of the transaction.
520
- * @param newRow The Row as it is now, after all cell writes including those
521
- * made by mutating listeners.
522
- * @returns The Row to use as the final state.
523
- * @category Callback
524
- * @since v8.0.0
525
- */
526
- export type DidSetRowCallback<
527
- Schema extends OptionalTablesSchema,
528
- TableId extends TableIdFromSchema<Schema>,
529
- > = (
530
- tableId: TableId,
531
- rowId: Id,
532
- oldRow: Row<Schema, TableId>,
533
- newRow: Row<Schema, TableId>,
534
- ) => Row<Schema, TableId>;
535
-
536
488
  /**
537
489
  * A Middleware object lets you intercept and validate writes to a Store.
538
490
  *
@@ -800,6 +752,15 @@ export interface Middleware<in out Schemas extends OptionalSchemas> {
800
752
  * write. Multiple callbacks can be registered and they are called
801
753
  * sequentially, each receiving the (possibly transformed) row from the
802
754
  * previous callback.
755
+ *
756
+ * This callback fires both when a whole Row is set with the setRow method,
757
+ * _and_ when a single Cell is set with the setCell method. When called from
758
+ * setCell, the callback receives a prospective row consisting of the existing
759
+ * Cell values merged with the new Cell value. The entire returned Row is then
760
+ * applied as though setRow had been called: all cells in the returned Row are
761
+ * written (each also passing through willSetCell), and any cells absent from
762
+ * the returned Row that existed before will be deleted. Return `undefined` to
763
+ * cancel the operation entirely.
803
764
  * @param callback The WillSetRowCallback to register.
804
765
  * @returns A reference to the Middleware object, for chaining.
805
766
  * @example
@@ -849,6 +810,32 @@ export interface Middleware<in out Schemas extends OptionalSchemas> {
849
810
  *
850
811
  * middleware.destroy();
851
812
  * ```
813
+ * @example
814
+ * This example shows the callback firing when setCell is called,
815
+ * automatically stamping an 'updated' timestamp onto the row each time any
816
+ * cell in it is written.
817
+ *
818
+ * ```js
819
+ * import {createMiddleware, createStore} from 'tinybase';
820
+ *
821
+ * const store = createStore();
822
+ * const middleware = createMiddleware(store);
823
+ *
824
+ * store.setRow('pets', 'fido', {species: 'dog'});
825
+ *
826
+ * middleware.addWillSetRowCallback((_tableId, _rowId, row) => ({
827
+ * ...row,
828
+ * updated: Date.now(),
829
+ * }));
830
+ *
831
+ * store.setCell('pets', 'fido', 'legs', 4);
832
+ * console.log(store.getCell('pets', 'fido', 'legs'));
833
+ * // -> 4
834
+ * console.log(typeof store.getCell('pets', 'fido', 'updated'));
835
+ * // -> 'number'
836
+ *
837
+ * middleware.destroy();
838
+ * ```
852
839
  * @category Configuration
853
840
  * @since v8.0.0
854
841
  */
@@ -1341,91 +1328,6 @@ export interface Middleware<in out Schemas extends OptionalSchemas> {
1341
1328
  callback: WillApplyChangesCallback<Schemas>,
1342
1329
  ): Middleware<Schemas>;
1343
1330
 
1344
- /**
1345
- * The addDidSetRowCallback method registers a DidSetRowCallback for a
1346
- * specific table that will be called after any Row in that table is changed
1347
- * during a transaction, after mutator listeners have fired.
1348
- *
1349
- * This has schema-based typing. The following is a simplified representation:
1350
- *
1351
- * ```ts override
1352
- * addDidSetRowCallback(tableId: Id, callback: DidSetRowCallback): Middleware;
1353
- * ```
1354
- *
1355
- * Unlike `willSetRow`, which fires synchronously during each write, this
1356
- * callback fires once per changed Row after all cell writes in the
1357
- * transaction have landed. Multiple cell changes to the same Row within a
1358
- * transaction produce a single callback with the full before/after Row
1359
- * states.
1360
- *
1361
- * The callback receives `oldRow` (the Row at the start of the transaction)
1362
- * and `newRow` (the Row after all writes). Return `newRow` to accept, a
1363
- * different `Row` to replace, `oldRow` to revert, or an empty object to
1364
- * delete.
1365
- * @param tableId The Id of the Table to watch.
1366
- * @param callback The DidSetRowCallback to register.
1367
- * @returns A reference to the Middleware object, for chaining.
1368
- * @example
1369
- * This example registers a callback that validates the 'pets' table,
1370
- * reverting any row that ends up without a required 'species' cell.
1371
- *
1372
- * ```js
1373
- * import {createMiddleware, createStore} from 'tinybase';
1374
- *
1375
- * const store = createStore();
1376
- * const middleware = createMiddleware(store);
1377
- *
1378
- * middleware.addDidSetRowCallback('pets', (_tableId, _rowId, oldRow, newRow) =>
1379
- * 'species' in newRow ? newRow : oldRow,
1380
- * );
1381
- *
1382
- * store.setRow('pets', 'fido', {species: 'dog', name: 'Fido'});
1383
- * console.log(store.getRow('pets', 'fido'));
1384
- * // -> {species: 'dog', name: 'Fido'}
1385
- *
1386
- * store.setRow('pets', 'nemo', {name: 'Nemo'});
1387
- * console.log(store.getRow('pets', 'nemo'));
1388
- * // -> {}
1389
- *
1390
- * middleware.destroy();
1391
- * ```
1392
- * @example
1393
- * This example shows that multiple cell changes in one transaction result in
1394
- * a single didSetRow callback with the full before/after row states.
1395
- *
1396
- * ```js
1397
- * import {createMiddleware, createStore} from 'tinybase';
1398
- *
1399
- * const store = createStore();
1400
- * const middleware = createMiddleware(store);
1401
- *
1402
- * const seen = [];
1403
- * middleware.addDidSetRowCallback('pets', (_tableId, rowId, oldRow, newRow) => {
1404
- * seen.push({rowId, oldRow: {...oldRow}, newRow: {...newRow}});
1405
- * return newRow;
1406
- * });
1407
- *
1408
- * store.transaction(() => {
1409
- * store.setCell('pets', 'fido', 'name', 'Fido');
1410
- * store.setCell('pets', 'fido', 'species', 'dog');
1411
- * });
1412
- * console.log(seen.length);
1413
- * // -> 1
1414
- * console.log(seen[0].rowId);
1415
- * // -> 'fido'
1416
- * console.log(seen[0].newRow);
1417
- * // -> {name: 'Fido', species: 'dog'}
1418
- *
1419
- * middleware.destroy();
1420
- * ```
1421
- * @category Configuration
1422
- * @since v8.0.0
1423
- */
1424
- addDidSetRowCallback<TableId extends TableIdFromSchema<Schemas[0]>>(
1425
- tableId: TableId,
1426
- callback: DidSetRowCallback<Schemas[0], TableId>,
1427
- ): Middleware<Schemas>;
1428
-
1429
1331
  /**
1430
1332
  * The destroy method should be called when this Middleware object is no
1431
1333
  * longer used. It removes all hooks and listeners from the Store, and