tinybase 5.4.4 → 5.4.6

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 (458) hide show
  1. package/checkpoints/index.js +6 -6
  2. package/checkpoints/with-schemas/index.js +6 -6
  3. package/cjs/checkpoints/index.cjs +6 -6
  4. package/cjs/checkpoints/with-schemas/index.cjs +6 -6
  5. package/cjs/es6/checkpoints/index.cjs +21 -19
  6. package/cjs/es6/checkpoints/with-schemas/index.cjs +21 -19
  7. package/cjs/es6/index.cjs +90 -75
  8. package/cjs/es6/indexes/index.cjs +20 -18
  9. package/cjs/es6/indexes/with-schemas/index.cjs +20 -18
  10. package/cjs/es6/mergeable-store/index.cjs +61 -46
  11. package/cjs/es6/mergeable-store/with-schemas/index.cjs +61 -46
  12. package/cjs/es6/metrics/index.cjs +30 -28
  13. package/cjs/es6/metrics/with-schemas/index.cjs +30 -28
  14. package/cjs/es6/persisters/index.cjs +81 -75
  15. package/cjs/es6/persisters/persister-automerge/index.cjs +41 -37
  16. package/cjs/es6/persisters/persister-automerge/with-schemas/index.cjs +41 -37
  17. package/cjs/es6/persisters/persister-browser/index.cjs +39 -35
  18. package/cjs/es6/persisters/persister-browser/with-schemas/index.cjs +39 -35
  19. package/cjs/es6/persisters/persister-cr-sqlite-wasm/index.cjs +74 -68
  20. package/cjs/es6/persisters/persister-cr-sqlite-wasm/with-schemas/index.cjs +74 -68
  21. package/cjs/es6/persisters/persister-durable-object-storage/index.cjs +40 -36
  22. package/cjs/es6/persisters/persister-durable-object-storage/with-schemas/index.cjs +40 -36
  23. package/cjs/es6/persisters/persister-electric-sql/index.cjs +74 -68
  24. package/cjs/es6/persisters/persister-electric-sql/with-schemas/index.cjs +74 -68
  25. package/cjs/es6/persisters/persister-expo-sqlite/index.cjs +74 -68
  26. package/cjs/es6/persisters/persister-expo-sqlite/with-schemas/index.cjs +74 -68
  27. package/cjs/es6/persisters/persister-file/index.cjs +40 -36
  28. package/cjs/es6/persisters/persister-file/with-schemas/index.cjs +40 -36
  29. package/cjs/es6/persisters/persister-indexed-db/index.cjs +45 -41
  30. package/cjs/es6/persisters/persister-indexed-db/with-schemas/index.cjs +45 -41
  31. package/cjs/es6/persisters/persister-libsql/index.cjs +74 -68
  32. package/cjs/es6/persisters/persister-libsql/with-schemas/index.cjs +74 -68
  33. package/cjs/es6/persisters/persister-partykit-client/index.cjs +40 -36
  34. package/cjs/es6/persisters/persister-partykit-client/with-schemas/index.cjs +40 -36
  35. package/cjs/es6/persisters/persister-partykit-server/index.cjs +18 -14
  36. package/cjs/es6/persisters/persister-partykit-server/with-schemas/index.cjs +18 -14
  37. package/cjs/es6/persisters/persister-pglite/index.cjs +83 -77
  38. package/cjs/es6/persisters/persister-pglite/with-schemas/index.cjs +83 -77
  39. package/cjs/es6/persisters/persister-postgres/index.cjs +89 -80
  40. package/cjs/es6/persisters/persister-postgres/with-schemas/index.cjs +89 -80
  41. package/cjs/es6/persisters/persister-powersync/index.cjs +81 -74
  42. package/cjs/es6/persisters/persister-powersync/with-schemas/index.cjs +81 -74
  43. package/cjs/es6/persisters/persister-remote/index.cjs +38 -34
  44. package/cjs/es6/persisters/persister-remote/with-schemas/index.cjs +38 -34
  45. package/cjs/es6/persisters/persister-sqlite-wasm/index.cjs +74 -68
  46. package/cjs/es6/persisters/persister-sqlite-wasm/with-schemas/index.cjs +74 -68
  47. package/cjs/es6/persisters/persister-sqlite3/index.cjs +74 -68
  48. package/cjs/es6/persisters/persister-sqlite3/with-schemas/index.cjs +74 -68
  49. package/cjs/es6/persisters/persister-yjs/index.cjs +43 -39
  50. package/cjs/es6/persisters/persister-yjs/with-schemas/index.cjs +43 -39
  51. package/cjs/es6/persisters/with-schemas/index.cjs +81 -75
  52. package/cjs/es6/queries/index.cjs +34 -32
  53. package/cjs/es6/queries/with-schemas/index.cjs +34 -32
  54. package/cjs/es6/relationships/index.cjs +22 -20
  55. package/cjs/es6/relationships/with-schemas/index.cjs +22 -20
  56. package/cjs/es6/store/index.cjs +51 -39
  57. package/cjs/es6/store/with-schemas/index.cjs +51 -39
  58. package/cjs/es6/synchronizers/index.cjs +52 -46
  59. package/cjs/es6/synchronizers/synchronizer-broadcast-channel/index.cjs +52 -46
  60. package/cjs/es6/synchronizers/synchronizer-broadcast-channel/with-schemas/index.cjs +52 -46
  61. package/cjs/es6/synchronizers/synchronizer-local/index.cjs +53 -47
  62. package/cjs/es6/synchronizers/synchronizer-local/with-schemas/index.cjs +53 -47
  63. package/cjs/es6/synchronizers/synchronizer-ws-client/index.cjs +56 -50
  64. package/cjs/es6/synchronizers/synchronizer-ws-client/with-schemas/index.cjs +56 -50
  65. package/cjs/es6/synchronizers/synchronizer-ws-server/index.cjs +72 -62
  66. package/cjs/es6/synchronizers/synchronizer-ws-server/with-schemas/index.cjs +72 -62
  67. package/cjs/es6/synchronizers/synchronizer-ws-server-durable-object/index.cjs +55 -49
  68. package/cjs/es6/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.cjs +55 -49
  69. package/cjs/es6/synchronizers/synchronizer-ws-server-simple/index.cjs +15 -11
  70. package/cjs/es6/synchronizers/synchronizer-ws-server-simple/with-schemas/index.cjs +15 -11
  71. package/cjs/es6/synchronizers/with-schemas/index.cjs +52 -46
  72. package/cjs/es6/tools/index.cjs +27 -20
  73. package/cjs/es6/tools/with-schemas/index.cjs +27 -20
  74. package/cjs/es6/ui-react/index.cjs +49 -35
  75. package/cjs/es6/ui-react/with-schemas/index.cjs +49 -35
  76. package/cjs/es6/ui-react-dom/index.cjs +14 -14
  77. package/cjs/es6/ui-react-dom/with-schemas/index.cjs +14 -14
  78. package/cjs/es6/ui-react-inspector/index.cjs +84 -72
  79. package/cjs/es6/ui-react-inspector/with-schemas/index.cjs +84 -72
  80. package/cjs/es6/with-schemas/index.cjs +90 -75
  81. package/cjs/index.cjs +38 -38
  82. package/cjs/indexes/index.cjs +5 -5
  83. package/cjs/indexes/with-schemas/index.cjs +5 -5
  84. package/cjs/mergeable-store/index.cjs +19 -19
  85. package/cjs/mergeable-store/with-schemas/index.cjs +19 -19
  86. package/cjs/metrics/index.cjs +12 -12
  87. package/cjs/metrics/with-schemas/index.cjs +12 -12
  88. package/cjs/persisters/index.cjs +10 -10
  89. package/cjs/persisters/persister-automerge/index.cjs +8 -8
  90. package/cjs/persisters/persister-automerge/with-schemas/index.cjs +8 -8
  91. package/cjs/persisters/persister-browser/index.cjs +7 -7
  92. package/cjs/persisters/persister-browser/with-schemas/index.cjs +7 -7
  93. package/cjs/persisters/persister-cr-sqlite-wasm/index.cjs +9 -9
  94. package/cjs/persisters/persister-cr-sqlite-wasm/with-schemas/index.cjs +9 -9
  95. package/cjs/persisters/persister-durable-object-storage/index.cjs +7 -7
  96. package/cjs/persisters/persister-durable-object-storage/with-schemas/index.cjs +7 -7
  97. package/cjs/persisters/persister-electric-sql/index.cjs +9 -9
  98. package/cjs/persisters/persister-electric-sql/with-schemas/index.cjs +9 -9
  99. package/cjs/persisters/persister-expo-sqlite/index.cjs +9 -9
  100. package/cjs/persisters/persister-expo-sqlite/with-schemas/index.cjs +9 -9
  101. package/cjs/persisters/persister-file/index.cjs +7 -7
  102. package/cjs/persisters/persister-file/with-schemas/index.cjs +7 -7
  103. package/cjs/persisters/persister-indexed-db/index.cjs +6 -6
  104. package/cjs/persisters/persister-indexed-db/with-schemas/index.cjs +6 -6
  105. package/cjs/persisters/persister-libsql/index.cjs +9 -9
  106. package/cjs/persisters/persister-libsql/with-schemas/index.cjs +9 -9
  107. package/cjs/persisters/persister-partykit-client/index.cjs +7 -7
  108. package/cjs/persisters/persister-partykit-client/with-schemas/index.cjs +7 -7
  109. package/cjs/persisters/persister-partykit-server/index.cjs +2 -2
  110. package/cjs/persisters/persister-partykit-server/with-schemas/index.cjs +2 -2
  111. package/cjs/persisters/persister-pglite/index.cjs +9 -9
  112. package/cjs/persisters/persister-pglite/with-schemas/index.cjs +9 -9
  113. package/cjs/persisters/persister-postgres/index.cjs +9 -9
  114. package/cjs/persisters/persister-postgres/with-schemas/index.cjs +9 -9
  115. package/cjs/persisters/persister-powersync/index.cjs +10 -10
  116. package/cjs/persisters/persister-powersync/with-schemas/index.cjs +10 -10
  117. package/cjs/persisters/persister-remote/index.cjs +5 -5
  118. package/cjs/persisters/persister-remote/with-schemas/index.cjs +5 -5
  119. package/cjs/persisters/persister-sqlite-wasm/index.cjs +9 -9
  120. package/cjs/persisters/persister-sqlite-wasm/with-schemas/index.cjs +9 -9
  121. package/cjs/persisters/persister-sqlite3/index.cjs +9 -9
  122. package/cjs/persisters/persister-sqlite3/with-schemas/index.cjs +9 -9
  123. package/cjs/persisters/persister-yjs/index.cjs +9 -9
  124. package/cjs/persisters/persister-yjs/with-schemas/index.cjs +9 -9
  125. package/cjs/persisters/with-schemas/index.cjs +10 -10
  126. package/cjs/queries/index.cjs +13 -13
  127. package/cjs/queries/with-schemas/index.cjs +13 -13
  128. package/cjs/relationships/index.cjs +5 -5
  129. package/cjs/relationships/with-schemas/index.cjs +5 -5
  130. package/cjs/store/index.cjs +14 -14
  131. package/cjs/store/with-schemas/index.cjs +14 -14
  132. package/cjs/synchronizers/index.cjs +11 -11
  133. package/cjs/synchronizers/synchronizer-broadcast-channel/index.cjs +11 -11
  134. package/cjs/synchronizers/synchronizer-broadcast-channel/with-schemas/index.cjs +11 -11
  135. package/cjs/synchronizers/synchronizer-local/index.cjs +11 -11
  136. package/cjs/synchronizers/synchronizer-local/with-schemas/index.cjs +11 -11
  137. package/cjs/synchronizers/synchronizer-ws-client/index.cjs +13 -13
  138. package/cjs/synchronizers/synchronizer-ws-client/with-schemas/index.cjs +13 -13
  139. package/cjs/synchronizers/synchronizer-ws-server/index.cjs +17 -17
  140. package/cjs/synchronizers/synchronizer-ws-server/with-schemas/index.cjs +17 -17
  141. package/cjs/synchronizers/synchronizer-ws-server-durable-object/index.cjs +14 -14
  142. package/cjs/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.cjs +14 -14
  143. package/cjs/synchronizers/synchronizer-ws-server-simple/index.cjs +1 -1
  144. package/cjs/synchronizers/synchronizer-ws-server-simple/with-schemas/index.cjs +1 -1
  145. package/cjs/synchronizers/with-schemas/index.cjs +11 -11
  146. package/cjs/tools/index.cjs +3 -3
  147. package/cjs/tools/with-schemas/index.cjs +3 -3
  148. package/cjs/ui-react/index.cjs +19 -12
  149. package/cjs/ui-react/with-schemas/index.cjs +19 -12
  150. package/cjs/ui-react-dom/index.cjs +4 -4
  151. package/cjs/ui-react-dom/with-schemas/index.cjs +4 -4
  152. package/cjs/ui-react-inspector/index.cjs +22 -22
  153. package/cjs/ui-react-inspector/with-schemas/index.cjs +22 -22
  154. package/cjs/with-schemas/index.cjs +38 -38
  155. package/es6/checkpoints/index.js +21 -19
  156. package/es6/checkpoints/with-schemas/index.js +21 -19
  157. package/es6/index.js +90 -75
  158. package/es6/indexes/index.js +20 -18
  159. package/es6/indexes/with-schemas/index.js +20 -18
  160. package/es6/mergeable-store/index.js +61 -46
  161. package/es6/mergeable-store/with-schemas/index.js +61 -46
  162. package/es6/metrics/index.js +30 -28
  163. package/es6/metrics/with-schemas/index.js +30 -28
  164. package/es6/persisters/index.js +81 -75
  165. package/es6/persisters/persister-automerge/index.js +41 -37
  166. package/es6/persisters/persister-automerge/with-schemas/index.js +41 -37
  167. package/es6/persisters/persister-browser/index.js +39 -35
  168. package/es6/persisters/persister-browser/with-schemas/index.js +39 -35
  169. package/es6/persisters/persister-cr-sqlite-wasm/index.js +74 -68
  170. package/es6/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +74 -68
  171. package/es6/persisters/persister-durable-object-storage/index.js +40 -36
  172. package/es6/persisters/persister-durable-object-storage/with-schemas/index.js +40 -36
  173. package/es6/persisters/persister-electric-sql/index.js +74 -68
  174. package/es6/persisters/persister-electric-sql/with-schemas/index.js +74 -68
  175. package/es6/persisters/persister-expo-sqlite/index.js +74 -68
  176. package/es6/persisters/persister-expo-sqlite/with-schemas/index.js +74 -68
  177. package/es6/persisters/persister-file/index.js +40 -36
  178. package/es6/persisters/persister-file/with-schemas/index.js +40 -36
  179. package/es6/persisters/persister-indexed-db/index.js +45 -41
  180. package/es6/persisters/persister-indexed-db/with-schemas/index.js +45 -41
  181. package/es6/persisters/persister-libsql/index.js +74 -68
  182. package/es6/persisters/persister-libsql/with-schemas/index.js +74 -68
  183. package/es6/persisters/persister-partykit-client/index.js +40 -36
  184. package/es6/persisters/persister-partykit-client/with-schemas/index.js +40 -36
  185. package/es6/persisters/persister-partykit-server/index.js +18 -14
  186. package/es6/persisters/persister-partykit-server/with-schemas/index.js +18 -14
  187. package/es6/persisters/persister-pglite/index.js +83 -77
  188. package/es6/persisters/persister-pglite/with-schemas/index.js +83 -77
  189. package/es6/persisters/persister-postgres/index.js +89 -80
  190. package/es6/persisters/persister-postgres/with-schemas/index.js +89 -80
  191. package/es6/persisters/persister-powersync/index.js +81 -74
  192. package/es6/persisters/persister-powersync/with-schemas/index.js +81 -74
  193. package/es6/persisters/persister-remote/index.js +38 -34
  194. package/es6/persisters/persister-remote/with-schemas/index.js +38 -34
  195. package/es6/persisters/persister-sqlite-wasm/index.js +74 -68
  196. package/es6/persisters/persister-sqlite-wasm/with-schemas/index.js +74 -68
  197. package/es6/persisters/persister-sqlite3/index.js +74 -68
  198. package/es6/persisters/persister-sqlite3/with-schemas/index.js +74 -68
  199. package/es6/persisters/persister-yjs/index.js +43 -39
  200. package/es6/persisters/persister-yjs/with-schemas/index.js +43 -39
  201. package/es6/persisters/with-schemas/index.js +81 -75
  202. package/es6/queries/index.js +34 -32
  203. package/es6/queries/with-schemas/index.js +34 -32
  204. package/es6/relationships/index.js +22 -20
  205. package/es6/relationships/with-schemas/index.js +22 -20
  206. package/es6/store/index.js +51 -39
  207. package/es6/store/with-schemas/index.js +51 -39
  208. package/es6/synchronizers/index.js +52 -46
  209. package/es6/synchronizers/synchronizer-broadcast-channel/index.js +52 -46
  210. package/es6/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +52 -46
  211. package/es6/synchronizers/synchronizer-local/index.js +53 -47
  212. package/es6/synchronizers/synchronizer-local/with-schemas/index.js +53 -47
  213. package/es6/synchronizers/synchronizer-ws-client/index.js +56 -50
  214. package/es6/synchronizers/synchronizer-ws-client/with-schemas/index.js +56 -50
  215. package/es6/synchronizers/synchronizer-ws-server/index.js +72 -62
  216. package/es6/synchronizers/synchronizer-ws-server/with-schemas/index.js +72 -62
  217. package/es6/synchronizers/synchronizer-ws-server-durable-object/index.js +55 -49
  218. package/es6/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +55 -49
  219. package/es6/synchronizers/synchronizer-ws-server-simple/index.js +15 -11
  220. package/es6/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +15 -11
  221. package/es6/synchronizers/with-schemas/index.js +52 -46
  222. package/es6/tools/index.js +27 -20
  223. package/es6/tools/with-schemas/index.js +27 -20
  224. package/es6/ui-react/index.js +49 -35
  225. package/es6/ui-react/with-schemas/index.js +49 -35
  226. package/es6/ui-react-dom/index.js +18 -14
  227. package/es6/ui-react-dom/with-schemas/index.js +18 -14
  228. package/es6/ui-react-inspector/index.js +88 -72
  229. package/es6/ui-react-inspector/with-schemas/index.js +88 -72
  230. package/es6/with-schemas/index.js +90 -75
  231. package/index.js +38 -38
  232. package/indexes/index.js +5 -5
  233. package/indexes/with-schemas/index.js +5 -5
  234. package/mergeable-store/index.js +19 -19
  235. package/mergeable-store/with-schemas/index.js +19 -19
  236. package/metrics/index.js +12 -12
  237. package/metrics/with-schemas/index.js +12 -12
  238. package/package.json +3 -3
  239. package/persisters/index.js +10 -10
  240. package/persisters/persister-automerge/index.js +8 -8
  241. package/persisters/persister-automerge/with-schemas/index.js +8 -8
  242. package/persisters/persister-browser/index.js +7 -7
  243. package/persisters/persister-browser/with-schemas/index.js +7 -7
  244. package/persisters/persister-cr-sqlite-wasm/index.js +9 -9
  245. package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +9 -9
  246. package/persisters/persister-durable-object-storage/index.js +7 -7
  247. package/persisters/persister-durable-object-storage/with-schemas/index.js +7 -7
  248. package/persisters/persister-electric-sql/index.js +9 -9
  249. package/persisters/persister-electric-sql/with-schemas/index.js +9 -9
  250. package/persisters/persister-expo-sqlite/index.js +9 -9
  251. package/persisters/persister-expo-sqlite/with-schemas/index.js +9 -9
  252. package/persisters/persister-file/index.js +7 -7
  253. package/persisters/persister-file/with-schemas/index.js +7 -7
  254. package/persisters/persister-indexed-db/index.js +6 -6
  255. package/persisters/persister-indexed-db/with-schemas/index.js +6 -6
  256. package/persisters/persister-libsql/index.js +9 -9
  257. package/persisters/persister-libsql/with-schemas/index.js +9 -9
  258. package/persisters/persister-partykit-client/index.js +7 -7
  259. package/persisters/persister-partykit-client/with-schemas/index.js +7 -7
  260. package/persisters/persister-partykit-server/index.js +2 -2
  261. package/persisters/persister-partykit-server/with-schemas/index.js +2 -2
  262. package/persisters/persister-pglite/index.js +9 -9
  263. package/persisters/persister-pglite/with-schemas/index.js +9 -9
  264. package/persisters/persister-postgres/index.js +9 -9
  265. package/persisters/persister-postgres/with-schemas/index.js +9 -9
  266. package/persisters/persister-powersync/index.js +10 -10
  267. package/persisters/persister-powersync/with-schemas/index.js +10 -10
  268. package/persisters/persister-remote/index.js +5 -5
  269. package/persisters/persister-remote/with-schemas/index.js +5 -5
  270. package/persisters/persister-sqlite-wasm/index.js +9 -9
  271. package/persisters/persister-sqlite-wasm/with-schemas/index.js +9 -9
  272. package/persisters/persister-sqlite3/index.js +9 -9
  273. package/persisters/persister-sqlite3/with-schemas/index.js +9 -9
  274. package/persisters/persister-yjs/index.js +9 -9
  275. package/persisters/persister-yjs/with-schemas/index.js +9 -9
  276. package/persisters/with-schemas/index.js +10 -10
  277. package/queries/index.js +13 -13
  278. package/queries/with-schemas/index.js +13 -13
  279. package/readme.md +2 -2
  280. package/relationships/index.js +5 -5
  281. package/relationships/with-schemas/index.js +5 -5
  282. package/store/index.js +14 -14
  283. package/store/with-schemas/index.js +14 -14
  284. package/synchronizers/index.js +11 -11
  285. package/synchronizers/synchronizer-broadcast-channel/index.js +11 -11
  286. package/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +11 -11
  287. package/synchronizers/synchronizer-local/index.js +11 -11
  288. package/synchronizers/synchronizer-local/with-schemas/index.js +11 -11
  289. package/synchronizers/synchronizer-ws-client/index.js +13 -13
  290. package/synchronizers/synchronizer-ws-client/with-schemas/index.js +13 -13
  291. package/synchronizers/synchronizer-ws-server/index.js +17 -17
  292. package/synchronizers/synchronizer-ws-server/with-schemas/index.js +17 -17
  293. package/synchronizers/synchronizer-ws-server-durable-object/index.js +14 -14
  294. package/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +14 -14
  295. package/synchronizers/synchronizer-ws-server-simple/index.js +1 -1
  296. package/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +1 -1
  297. package/synchronizers/with-schemas/index.js +11 -11
  298. package/tools/index.js +3 -3
  299. package/tools/with-schemas/index.js +3 -3
  300. package/ui-react/index.js +19 -12
  301. package/ui-react/with-schemas/index.js +19 -12
  302. package/ui-react-dom/index.js +4 -4
  303. package/ui-react-dom/with-schemas/index.js +4 -4
  304. package/ui-react-inspector/index.js +22 -22
  305. package/ui-react-inspector/with-schemas/index.js +22 -22
  306. package/umd/checkpoints/index.js +14 -9
  307. package/umd/checkpoints/with-schemas/index.js +14 -9
  308. package/umd/es6/checkpoints/index.js +20 -19
  309. package/umd/es6/checkpoints/with-schemas/index.js +20 -19
  310. package/umd/es6/index.js +84 -75
  311. package/umd/es6/indexes/index.js +19 -18
  312. package/umd/es6/indexes/with-schemas/index.js +19 -18
  313. package/umd/es6/mergeable-store/index.js +55 -46
  314. package/umd/es6/mergeable-store/with-schemas/index.js +55 -46
  315. package/umd/es6/metrics/index.js +29 -28
  316. package/umd/es6/metrics/with-schemas/index.js +29 -28
  317. package/umd/es6/persisters/index.js +76 -75
  318. package/umd/es6/persisters/persister-automerge/index.js +38 -37
  319. package/umd/es6/persisters/persister-automerge/with-schemas/index.js +38 -37
  320. package/umd/es6/persisters/persister-browser/index.js +36 -35
  321. package/umd/es6/persisters/persister-browser/with-schemas/index.js +36 -35
  322. package/umd/es6/persisters/persister-cr-sqlite-wasm/index.js +69 -68
  323. package/umd/es6/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +69 -68
  324. package/umd/es6/persisters/persister-durable-object-storage/index.js +37 -36
  325. package/umd/es6/persisters/persister-durable-object-storage/with-schemas/index.js +37 -36
  326. package/umd/es6/persisters/persister-electric-sql/index.js +69 -68
  327. package/umd/es6/persisters/persister-electric-sql/with-schemas/index.js +69 -68
  328. package/umd/es6/persisters/persister-expo-sqlite/index.js +69 -68
  329. package/umd/es6/persisters/persister-expo-sqlite/with-schemas/index.js +69 -68
  330. package/umd/es6/persisters/persister-file/index.js +37 -36
  331. package/umd/es6/persisters/persister-file/with-schemas/index.js +37 -36
  332. package/umd/es6/persisters/persister-indexed-db/index.js +42 -41
  333. package/umd/es6/persisters/persister-indexed-db/with-schemas/index.js +42 -41
  334. package/umd/es6/persisters/persister-libsql/index.js +69 -68
  335. package/umd/es6/persisters/persister-libsql/with-schemas/index.js +69 -68
  336. package/umd/es6/persisters/persister-partykit-client/index.js +37 -36
  337. package/umd/es6/persisters/persister-partykit-client/with-schemas/index.js +37 -36
  338. package/umd/es6/persisters/persister-partykit-server/index.js +15 -14
  339. package/umd/es6/persisters/persister-partykit-server/with-schemas/index.js +15 -14
  340. package/umd/es6/persisters/persister-pglite/index.js +88 -83
  341. package/umd/es6/persisters/persister-pglite/with-schemas/index.js +88 -83
  342. package/umd/es6/persisters/persister-postgres/index.js +91 -86
  343. package/umd/es6/persisters/persister-postgres/with-schemas/index.js +91 -86
  344. package/umd/es6/persisters/persister-powersync/index.js +76 -74
  345. package/umd/es6/persisters/persister-powersync/with-schemas/index.js +76 -74
  346. package/umd/es6/persisters/persister-remote/index.js +35 -34
  347. package/umd/es6/persisters/persister-remote/with-schemas/index.js +35 -34
  348. package/umd/es6/persisters/persister-sqlite-wasm/index.js +69 -68
  349. package/umd/es6/persisters/persister-sqlite-wasm/with-schemas/index.js +69 -68
  350. package/umd/es6/persisters/persister-sqlite3/index.js +69 -68
  351. package/umd/es6/persisters/persister-sqlite3/with-schemas/index.js +69 -68
  352. package/umd/es6/persisters/persister-yjs/index.js +40 -39
  353. package/umd/es6/persisters/persister-yjs/with-schemas/index.js +40 -39
  354. package/umd/es6/persisters/with-schemas/index.js +76 -75
  355. package/umd/es6/queries/index.js +33 -32
  356. package/umd/es6/queries/with-schemas/index.js +33 -32
  357. package/umd/es6/relationships/index.js +21 -20
  358. package/umd/es6/relationships/with-schemas/index.js +21 -20
  359. package/umd/es6/store/index.js +48 -39
  360. package/umd/es6/store/with-schemas/index.js +48 -39
  361. package/umd/es6/synchronizers/index.js +49 -46
  362. package/umd/es6/synchronizers/synchronizer-broadcast-channel/index.js +49 -46
  363. package/umd/es6/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +49 -46
  364. package/umd/es6/synchronizers/synchronizer-local/index.js +50 -47
  365. package/umd/es6/synchronizers/synchronizer-local/with-schemas/index.js +50 -47
  366. package/umd/es6/synchronizers/synchronizer-ws-client/index.js +53 -50
  367. package/umd/es6/synchronizers/synchronizer-ws-client/with-schemas/index.js +53 -50
  368. package/umd/es6/synchronizers/synchronizer-ws-server/index.js +67 -62
  369. package/umd/es6/synchronizers/synchronizer-ws-server/with-schemas/index.js +67 -62
  370. package/umd/es6/synchronizers/synchronizer-ws-server-durable-object/index.js +52 -49
  371. package/umd/es6/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +52 -49
  372. package/umd/es6/synchronizers/synchronizer-ws-server-simple/index.js +12 -11
  373. package/umd/es6/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +12 -11
  374. package/umd/es6/synchronizers/with-schemas/index.js +49 -46
  375. package/umd/es6/tools/index.js +27 -23
  376. package/umd/es6/tools/with-schemas/index.js +27 -23
  377. package/umd/es6/ui-react/index.js +39 -36
  378. package/umd/es6/ui-react/with-schemas/index.js +39 -36
  379. package/umd/es6/ui-react-dom/index.js +14 -14
  380. package/umd/es6/ui-react-dom/with-schemas/index.js +14 -14
  381. package/umd/es6/ui-react-inspector/index.js +81 -72
  382. package/umd/es6/ui-react-inspector/with-schemas/index.js +81 -72
  383. package/umd/es6/with-schemas/index.js +84 -75
  384. package/umd/index.js +46 -41
  385. package/umd/indexes/index.js +13 -8
  386. package/umd/indexes/with-schemas/index.js +13 -8
  387. package/umd/mergeable-store/index.js +27 -22
  388. package/umd/mergeable-store/with-schemas/index.js +27 -22
  389. package/umd/metrics/index.js +20 -15
  390. package/umd/metrics/with-schemas/index.js +20 -15
  391. package/umd/persisters/index.js +18 -13
  392. package/umd/persisters/persister-automerge/index.js +16 -11
  393. package/umd/persisters/persister-automerge/with-schemas/index.js +16 -11
  394. package/umd/persisters/persister-browser/index.js +15 -10
  395. package/umd/persisters/persister-browser/with-schemas/index.js +15 -10
  396. package/umd/persisters/persister-cr-sqlite-wasm/index.js +17 -12
  397. package/umd/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +17 -12
  398. package/umd/persisters/persister-durable-object-storage/index.js +15 -10
  399. package/umd/persisters/persister-durable-object-storage/with-schemas/index.js +15 -10
  400. package/umd/persisters/persister-electric-sql/index.js +17 -12
  401. package/umd/persisters/persister-electric-sql/with-schemas/index.js +17 -12
  402. package/umd/persisters/persister-expo-sqlite/index.js +17 -12
  403. package/umd/persisters/persister-expo-sqlite/with-schemas/index.js +17 -12
  404. package/umd/persisters/persister-file/index.js +15 -10
  405. package/umd/persisters/persister-file/with-schemas/index.js +15 -10
  406. package/umd/persisters/persister-indexed-db/index.js +14 -9
  407. package/umd/persisters/persister-indexed-db/with-schemas/index.js +14 -9
  408. package/umd/persisters/persister-libsql/index.js +17 -12
  409. package/umd/persisters/persister-libsql/with-schemas/index.js +17 -12
  410. package/umd/persisters/persister-partykit-client/index.js +15 -10
  411. package/umd/persisters/persister-partykit-client/with-schemas/index.js +15 -10
  412. package/umd/persisters/persister-partykit-server/index.js +2 -2
  413. package/umd/persisters/persister-partykit-server/with-schemas/index.js +2 -2
  414. package/umd/persisters/persister-pglite/index.js +17 -12
  415. package/umd/persisters/persister-pglite/with-schemas/index.js +17 -12
  416. package/umd/persisters/persister-postgres/index.js +17 -12
  417. package/umd/persisters/persister-postgres/with-schemas/index.js +17 -12
  418. package/umd/persisters/persister-powersync/index.js +18 -13
  419. package/umd/persisters/persister-powersync/with-schemas/index.js +18 -13
  420. package/umd/persisters/persister-remote/index.js +13 -8
  421. package/umd/persisters/persister-remote/with-schemas/index.js +13 -8
  422. package/umd/persisters/persister-sqlite-wasm/index.js +17 -12
  423. package/umd/persisters/persister-sqlite-wasm/with-schemas/index.js +17 -12
  424. package/umd/persisters/persister-sqlite3/index.js +17 -12
  425. package/umd/persisters/persister-sqlite3/with-schemas/index.js +17 -12
  426. package/umd/persisters/persister-yjs/index.js +17 -12
  427. package/umd/persisters/persister-yjs/with-schemas/index.js +17 -12
  428. package/umd/persisters/with-schemas/index.js +18 -13
  429. package/umd/queries/index.js +13 -13
  430. package/umd/queries/with-schemas/index.js +13 -13
  431. package/umd/relationships/index.js +13 -8
  432. package/umd/relationships/with-schemas/index.js +13 -8
  433. package/umd/store/index.js +22 -17
  434. package/umd/store/with-schemas/index.js +22 -17
  435. package/umd/synchronizers/index.js +19 -14
  436. package/umd/synchronizers/synchronizer-broadcast-channel/index.js +19 -14
  437. package/umd/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +19 -14
  438. package/umd/synchronizers/synchronizer-local/index.js +19 -14
  439. package/umd/synchronizers/synchronizer-local/with-schemas/index.js +19 -14
  440. package/umd/synchronizers/synchronizer-ws-client/index.js +21 -16
  441. package/umd/synchronizers/synchronizer-ws-client/with-schemas/index.js +21 -16
  442. package/umd/synchronizers/synchronizer-ws-server/index.js +25 -20
  443. package/umd/synchronizers/synchronizer-ws-server/with-schemas/index.js +25 -20
  444. package/umd/synchronizers/synchronizer-ws-server-durable-object/index.js +22 -17
  445. package/umd/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +22 -17
  446. package/umd/synchronizers/synchronizer-ws-server-simple/index.js +1 -1
  447. package/umd/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +1 -1
  448. package/umd/synchronizers/with-schemas/index.js +19 -14
  449. package/umd/tools/index.js +3 -3
  450. package/umd/tools/with-schemas/index.js +3 -3
  451. package/umd/ui-react/index.js +13 -13
  452. package/umd/ui-react/with-schemas/index.js +13 -13
  453. package/umd/ui-react-dom/index.js +4 -4
  454. package/umd/ui-react-dom/with-schemas/index.js +4 -4
  455. package/umd/ui-react-inspector/index.js +30 -25
  456. package/umd/ui-react-inspector/with-schemas/index.js +30 -25
  457. package/umd/with-schemas/index.js +46 -41
  458. package/with-schemas/index.js +38 -38
package/readme.md CHANGED
@@ -1,4 +1,4 @@
1
- <section id="hero"><h2 id="the-reactive-data-store-for-local-first-apps">The <em>reactive</em> data store for <span>local-first apps</span>.</h2></section><p><a href="https://tinybase.org/guides/releases/#v5-4"><em>NEW!</em> v5.4 release</a></p><p><span id="one-with">&quot;The One With Durable Objects!&quot;</span></p><p><a class="start" href="https://tinybase.org/guides/the-basics/getting-started/">Get started</a></p><p><a href="https://tinybase.org/demos/">Try the demos</a></p><p><a href="https://tinybase.org/api/store/interfaces/store/store/">Read the docs</a></p><hr><section><h2 id="it-s-reactive">It&#x27;s <em>Reactive</em></h2><p>TinyBase lets you <a href="#register-granular-listeners">listen to changes</a> made to any part of your data. This means your app will be fast, since you only spend rendering cycles on things that change. The optional <a href="#call-hooks-to-bind-to-data">bindings to React</a> and <a href="#pre-built-reactive-components">pre-built components</a> let you easily build fully reactive UIs on top of TinyBase. You even get a built-in <a href="#set-checkpoints-for-an-undo-stack">undo stack</a>, and <a href="#an-inspector-for-your-data">developer tools</a>!</p></section><section><h2 id="it-s-database-like">It&#x27;s <em>Database-Like</em></h2><p>Consumer app? Enterprise app? Or even a game? Model <a href="#start-with-a-simple-key-value-store">key-value data</a> and <a href="#level-up-to-use-tabular-data">tabular data</a> with optional typed <a href="#apply-schemas-to-tables-values">schematization</a>, whatever its data structures. There are built-in <a href="#create-indexes-for-fast-lookups">indexing</a>, <a href="#define-metrics-and-aggregations">metric aggregation</a>, and tabular <a href="#model-table-relationships">relationships</a> APIs - and a powerful <a href="#build-complex-queries-with-tinyql">query engine</a> to select, join, filter, and group data (reactively!) without SQL.</p></section><section><h2 id="it-synchronizes">It <em>Synchronizes</em></h2><p>TinyBase has <a href="#synchronize-between-devices">native CRDT</a> support, meaning that you can deterministically <a href="https://tinybase.org/guides/synchronization/">synchronize</a> and merge data across multiple sources, clients, and servers. And although TinyBase is an in-memory data store, you can easily <a href="#persist-to-storage-databases-more">persist</a> your data to file, <a href="https://tinybase.org/api/persister-browser">browser storage</a>, <a href="https://tinybase.org/api/persister-indexed-db">IndexedDB</a>, <a href="https://tinybase.org/guides/persistence/database-persistence/">SQLite or PostgreSQL databases</a>, and <a href="https://tinybase.org/guides/persistence/third-party-crdt-persistence/">more</a>.</p></section><section><h2 id="it-s-built-for-a-local-first-world">It&#x27;s Built For A <em>Local-First</em> World</h2><p>TinyBase works anywhere that JavaScript does, but it&#x27;s especially great for local-first apps: where data is stored locally on the user&#x27;s device and that can be run offline. It&#x27;s tiny by name, tiny by nature: just <a href="#did-we-say-tiny">5.3kB - 11.4kB</a> and with no dependencies - yet <a href="#well-tested-and-documented">100% tested</a>, <a href="https://tinybase.org/guides/the-basics/getting-started/">fully documented</a>, and of course, <a href="https://github.com/tinyplex/tinybase">open source</a>!</p></section><hr><section id="friends"><h2 id="tinybase-works-great-on-its-own-but-also-plays-well-with-friends">TinyBase works great on its own, but also plays well with friends.</h2><div><a href="https://tinybase.org/guides/building-uis/getting-started-with-ui-react"><embed src="https://tinybase.org/react.svg">React</a></div><div><a href="https://tinybase.org/api/persister-indexed-db/functions/creation/createindexeddbpersister"><embed src="https://tinybase.org/indexeddb.svg">IndexedDB</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><embed src="https://tinybase.org/postgresql.svg">PostgreSQL</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><embed src="https://tinybase.org/pglite.svg">PGlite</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><embed src="https://tinybase.org/sqlite.svg">SQLite</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><embed src="https://tinybase.org/expo.svg">Expo SQLite</a></div><div><a href="https://tinybase.org/guides/integrations/cloudflare-durable-objects"><embed src="https://tinybase.org/cloudflare.svg">Cloudflare</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><embed src="https://tinybase.org/electric.svg">ElectricSQL</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><embed src="https://tinybase.org/turso.svg">Turso</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><embed src="https://tinybase.org/powersync.svg">PowerSync</a></div><div><a href="https://tinybase.org/api/persister-partykit-client"><embed src="https://tinybase.org/partykit.svg">PartyKit</a></div><div><a href="https://tinybase.org/api/persister-yjs/functions/creation/createyjspersister"><embed src="https://tinybase.org/yjs.svg">YJS</a></div><div><a href="https://tinybase.org/api/persister-cr-sqlite-wasm"><img src="https://tinybase.org/crsqlite.png"> CR-SQLite</a></div><div><a href="https://tinybase.org/api/persister-automerge"><embed src="https://tinybase.org/automerge.svg">Automerge</a></div><p>(Baffled by all these logos? Check out our <a href="https://tinybase.org/guides/the-basics/architectural-options">architectural options</a> guide to make sense of it all!)</p></section><hr><section id="follow"><a href="https://github.com/tinyplex/tinybase" target="_blank"><img src="https://img.shields.io/github/stars/tinyplex/tinybase?style=for-the-badge&amp;logo=GitHub&amp;logoColor=%23fff&amp;label=GitHub&amp;labelColor=%23d81b60&amp;color=%23333"> </a><a href="https://bsky.app/profile/tinybase.bsky.social"><img src="https://img.shields.io/badge/Bluesky-Follow-blue?style=for-the-badge&amp;logo=bluesky&amp;logoColor=%23fff&amp;color=%23333&amp;labelColor=%230285FF"> </a><a href="https://x.com/tinybasejs" target="_blank"><img src="https://img.shields.io/badge/%2F%20Twitter-Follow-blue?style=for-the-badge&amp;logo=x&amp;logoColor=%23fff&amp;color=%23333&amp;labelColor=%23000"> </a><a href="https://discord.com/invite/mGz3mevwP8" target="_blank"><img src="https://img.shields.io/discord/1027918215323590676?style=for-the-badge&amp;logo=discord&amp;logoColor=%23fff&amp;label=Discord&amp;labelColor=%233131e8&amp;color=%23333"></a><br><a href="https://github.com/tinyplex/tinybase/discussions" target="_blank"><img src="https://img.shields.io/github/discussions/tinyplex/tinybase?style=for-the-badge&amp;logo=GitHub&amp;logoColor=%23fff&amp;label=Ideas&amp;labelColor=%23d81b60&amp;color=%23333"> </a><a href="https://github.com/tinyplex/tinybase/issues" target="_blank"><img src="https://img.shields.io/github/issues/tinyplex/tinybase?style=for-the-badge&amp;logo=GitHub&amp;logoColor=%23fff&amp;label=Issues&amp;labelColor=%23d81b60&amp;color=%23333"> </a><a href="#well-tested-and-documented"><img src="https://img.shields.io/badge/Tests-100%25-green?style=for-the-badge&amp;logo=jest&amp;logoColor=%23fff&amp;color=%23333&amp;labelColor=%2387c305"> </a><a href="https://www.npmjs.com/package/tinybase/v/5.4.3" target="_blank"><img src="https://img.shields.io/npm/v/tinybase?style=for-the-badge&amp;logo=npm&amp;logoColor=%23fff&amp;labelColor=%23bd0005&amp;color=%23333"></a></section><hr><section><h2 id="start-with-a-simple-key-value-store">Start with a simple key-value store.</h2><p>Creating a <a href="https://tinybase.org/api/store/interfaces/store/store/"><code>Store</code></a> requires just a simple call to the <a href="https://tinybase.org/api/store/functions/creation/createstore/"><code>createStore</code></a> function. Once you have one, you can easily set <a href="https://tinybase.org/api/store/type-aliases/store/values/"><code>Values</code></a> in it by unique <a href="https://tinybase.org/api/common/type-aliases/identity/id/"><code>Id</code></a>. And of course you can easily get them back out again.</p><p>Read more about using keyed value data in <a href="https://tinybase.org/guides/the-basics/">The Basics</a> guide.</p></section>
1
+ <section id="hero"><h2 id="the-reactive-data-store-for-local-first-apps">The <em>reactive</em> data store for <span>local-first apps</span>.</h2></section><p><a href="https://tinybase.org/guides/releases/#v5-4"><em>NEW!</em> v5.4 release</a></p><p><span id="one-with">&quot;The One With Durable Objects!&quot;</span></p><p><a class="start" href="https://tinybase.org/guides/the-basics/getting-started/">Get started</a></p><p><a href="https://tinybase.org/demos/">Try the demos</a></p><p><a href="https://tinybase.org/api/store/interfaces/store/store/">Read the docs</a></p><hr><section><h2 id="it-s-reactive">It&#x27;s <em>Reactive</em></h2><p>TinyBase lets you <a href="#register-granular-listeners">listen to changes</a> made to any part of your data. This means your app will be fast, since you only spend rendering cycles on things that change. The optional <a href="#call-hooks-to-bind-to-data">bindings to React</a> and <a href="#pre-built-reactive-components">pre-built components</a> let you easily build fully reactive UIs on top of TinyBase. You even get a built-in <a href="#set-checkpoints-for-an-undo-stack">undo stack</a>, and <a href="#an-inspector-for-your-data">developer tools</a>!</p></section><section><h2 id="it-s-database-like">It&#x27;s <em>Database-Like</em></h2><p>Consumer app? Enterprise app? Or even a game? Model <a href="#start-with-a-simple-key-value-store">key-value data</a> and <a href="#level-up-to-use-tabular-data">tabular data</a> with optional typed <a href="#apply-schemas-to-tables-values">schematization</a>, whatever its data structures. There are built-in <a href="#create-indexes-for-fast-lookups">indexing</a>, <a href="#define-metrics-and-aggregations">metric aggregation</a>, and tabular <a href="#model-table-relationships">relationships</a> APIs - and a powerful <a href="#build-complex-queries-with-tinyql">query engine</a> to select, join, filter, and group data (reactively!) without SQL.</p></section><section><h2 id="it-synchronizes">It <em>Synchronizes</em></h2><p>TinyBase has <a href="#synchronize-between-devices">native CRDT</a> support, meaning that you can deterministically <a href="https://tinybase.org/guides/synchronization/">synchronize</a> and merge data across multiple sources, clients, and servers. And although TinyBase is an in-memory data store, you can easily <a href="#persist-to-storage-databases-more">persist</a> your data to file, <a href="https://tinybase.org/api/persister-browser">browser storage</a>, <a href="https://tinybase.org/api/persister-indexed-db">IndexedDB</a>, <a href="https://tinybase.org/guides/persistence/database-persistence/">SQLite or PostgreSQL databases</a>, and <a href="https://tinybase.org/guides/persistence/third-party-crdt-persistence/">more</a>.</p></section><section><h2 id="it-s-built-for-a-local-first-world">It&#x27;s Built For A <em>Local-First</em> World</h2><p>TinyBase works anywhere that JavaScript does, but it&#x27;s especially great for local-first apps: where data is stored locally on the user&#x27;s device and that can be run offline. It&#x27;s tiny by name, tiny by nature: just <a href="#did-we-say-tiny">5.3kB - 11.4kB</a> and with no dependencies - yet <a href="#well-tested-and-documented">100% tested</a>, <a href="https://tinybase.org/guides/the-basics/getting-started/">fully documented</a>, and of course, <a href="https://github.com/tinyplex/tinybase">open source</a>!</p></section><hr><section id="friends"><h2 id="tinybase-works-great-on-its-own-but-also-plays-well-with-friends">TinyBase works great on its own, but also plays well with friends.</h2><div><a href="https://tinybase.org/guides/building-uis/getting-started-with-ui-react"><img src="https://tinybase.org/react.svg?asImg" width="48"> React</a></div><div><a href="https://tinybase.org/api/persister-indexed-db/functions/creation/createindexeddbpersister"><img src="https://tinybase.org/indexeddb.svg?asImg" width="48"> IndexedDB</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img src="https://tinybase.org/postgresql.svg?asImg" width="48"> PostgreSQL</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img src="https://tinybase.org/pglite.svg?asImg" width="48"> PGlite</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img src="https://tinybase.org/sqlite.svg?asImg" width="48"> SQLite</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img src="https://tinybase.org/expo.svg?asImg" width="48"> Expo SQLite</a></div><div><a href="https://tinybase.org/guides/integrations/cloudflare-durable-objects"><img src="https://tinybase.org/cloudflare.svg?asImg" width="48"> Cloudflare</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img src="https://tinybase.org/electric.svg?asImg" width="48"> ElectricSQL</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img src="https://tinybase.org/turso.svg?asImg" width="48"> Turso</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img src="https://tinybase.org/powersync.svg?asImg" width="48"> PowerSync</a></div><div><a href="https://tinybase.org/api/persister-partykit-client"><img src="https://tinybase.org/partykit.svg?asImg" width="48"> PartyKit</a></div><div><a href="https://tinybase.org/api/persister-yjs/functions/creation/createyjspersister"><img src="https://tinybase.org/yjs.svg?asImg" width="48"> YJS</a></div><div><a href="https://tinybase.org/api/persister-cr-sqlite-wasm"><img src="https://tinybase.org/crsqlite.png" width="48"> CR-SQLite</a></div><div><a href="https://tinybase.org/api/persister-automerge"><img src="https://tinybase.org/automerge.svg?asImg" width="48"> Automerge</a></div><p>(Baffled by all these logos? Check out our <a href="https://tinybase.org/guides/the-basics/architectural-options">architectural options</a> guide to make sense of it all!)</p></section><hr><section id="follow"><a href="https://github.com/tinyplex/tinybase" target="_blank"><img src="https://img.shields.io/github/stars/tinyplex/tinybase?style=for-the-badge&amp;logo=GitHub&amp;logoColor=%23fff&amp;label=GitHub&amp;labelColor=%23d81b60&amp;color=%23333"> </a><a href="https://bsky.app/profile/tinybase.bsky.social"><img src="https://img.shields.io/badge/Bluesky-Follow-blue?style=for-the-badge&amp;logo=bluesky&amp;logoColor=%23fff&amp;color=%23333&amp;labelColor=%230285FF"> </a><a href="https://x.com/tinybasejs" target="_blank"><img src="https://img.shields.io/badge/%2F%20Twitter-Follow-blue?style=for-the-badge&amp;logo=x&amp;logoColor=%23fff&amp;color=%23333&amp;labelColor=%23000"> </a><a href="https://discord.com/invite/mGz3mevwP8" target="_blank"><img src="https://img.shields.io/discord/1027918215323590676?style=for-the-badge&amp;logo=discord&amp;logoColor=%23fff&amp;label=Discord&amp;labelColor=%233131e8&amp;color=%23333"></a><br><a href="https://github.com/tinyplex/tinybase/discussions" target="_blank"><img src="https://img.shields.io/github/discussions/tinyplex/tinybase?style=for-the-badge&amp;logo=GitHub&amp;logoColor=%23fff&amp;label=Ideas&amp;labelColor=%23d81b60&amp;color=%23333"> </a><a href="https://github.com/tinyplex/tinybase/issues" target="_blank"><img src="https://img.shields.io/github/issues/tinyplex/tinybase?style=for-the-badge&amp;logo=GitHub&amp;logoColor=%23fff&amp;label=Issues&amp;labelColor=%23d81b60&amp;color=%23333"> </a><a href="#well-tested-and-documented"><img src="https://img.shields.io/badge/Tests-100%25-green?style=for-the-badge&amp;logo=jest&amp;logoColor=%23fff&amp;color=%23333&amp;labelColor=%2387c305"> </a><a href="https://www.npmjs.com/package/tinybase/v/5.4.5" target="_blank"><img src="https://img.shields.io/npm/v/tinybase?style=for-the-badge&amp;logo=npm&amp;logoColor=%23fff&amp;labelColor=%23bd0005&amp;color=%23333"></a></section><hr><section><h2 id="start-with-a-simple-key-value-store">Start with a simple key-value store.</h2><p>Creating a <a href="https://tinybase.org/api/store/interfaces/store/store/"><code>Store</code></a> requires just a simple call to the <a href="https://tinybase.org/api/store/functions/creation/createstore/"><code>createStore</code></a> function. Once you have one, you can easily set <a href="https://tinybase.org/api/store/type-aliases/store/values/"><code>Values</code></a> in it by unique <a href="https://tinybase.org/api/common/type-aliases/identity/id/"><code>Id</code></a>. And of course you can easily get them back out again.</p><p>Read more about using keyed value data in <a href="https://tinybase.org/guides/the-basics/">The Basics</a> guide.</p></section>
2
2
 
3
3
  ```js
4
4
  import {createStore} from 'tinybase';
@@ -294,4 +294,4 @@ export const createShop: typeof createShopDecl = () => {
294
294
  };
295
295
  ```
296
296
 
297
- <section><h2 id="did-we-say-tiny">Did we say tiny?</h2><p>If you use the basic <a href="https://tinybase.org/api/store/"><code>store</code></a> module alone, you&#x27;ll only add a gzipped <em>5.3kB</em> to your app. Incrementally add the other modules as you need more functionality, or get it all for <em>11.4kB</em>.</p><p>The optional <a href="https://tinybase.org/api/ui-react/"><code>ui-react</code></a> module is just <em>4.9kB</em>, the ui-react-dom components are another <em>2.6kB</em>, and everything is super fast. Life is easy when you have zero dependencies!</p><p>Read more about how TinyBase is structured and packaged in the <a href="https://tinybase.org/guides/how-tinybase-is-built/architecture/">Architecture</a> guide.</p></section><div class="table"><table class="fixed"><tbody><tr><th> </th><th>Minified .js.gz</th><th>Source .js</th></tr><tr><th class="right"><a href="https://tinybase.org/api/store/">tinybase/store</a> (minimal)</th><td>5.3kB</td><td>52.5kB</td></tr><tr><th class="right">tinybase (complete)</th><td>11.4kB</td><td>119.4kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/ui-react/">ui-react</a></th><td>4.9kB</td><td>53.6kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/ui-react-dom/">ui-react-dom</a></th><td>2.6kB</td><td>20.4kB</td></tr></tbody></table></div><section><h2 id="well-tested-and-documented">Well tested and documented.</h2><p>TinyBase has <em>100.0%</em> test coverage, including the code throughout the documentation - even on this page! The guides, demos, and API examples are designed to make it as easy as possible for you to get your TinyBase-powered app up and running.</p><p>Read more about how TinyBase is tested in the Unit <a href="https://tinybase.org/guides/how-tinybase-is-built/testing/">Testing</a> guide.</p></section><div class="table"><table class="fixed"><tbody><tr><th width="30%"> </th><th>Total</th><th>Tested</th><th>Coverage</th></tr><tr><th class="right">Lines</th><td>2,290</td><td>2,290</td><td>100.0%</td></tr><tr><th class="right">Statements</th><td>2,474</td><td>2,474</td><td>100.0%</td></tr><tr><th class="right">Functions</th><td>988</td><td>988</td><td>100.0%</td></tr><tr><th class="right">Branches</th><td>856</td><td>856</td><td>100.0%</td></tr><tr><th class="right">Tests</th><td colspan="3">7,464</td></tr><tr><th class="right">Assertions</th><td colspan="3">33,197</td></tr></tbody></table></div><hr><section id="sponsors"><h2 id="proud-to-be-sponsored-by">Proud to be sponsored by:</h2><a href="https://github.com/cpojer" target="_blank"><img src="https://github.com/cpojer.png?size=48" title="cpojer"></a><a href="https://github.com/expo" target="_blank"><img src="https://github.com/expo.png?size=48" title="expo"></a><a href="https://github.com/beekeeb" target="_blank"><img src="https://github.com/beekeeb.png?size=48" title="beekeeb"></a><a href="https://github.com/cancelself" target="_blank"><img src="https://github.com/cancelself.png?size=48" title="cancelself"></a><a href="https://github.com/WonderPanda" target="_blank"><img src="https://github.com/WonderPanda.png?size=48" title="WonderPanda"></a><a href="https://github.com/arpitBhalla" target="_blank"><img src="https://github.com/arpitBhalla.png?size=48" title="arpitBhalla"></a></section><section id="users"><h2 id="excited-to-be-used-by">Excited to be used by:</h2><a href="https://github.com/Apocalypsor" target="_blank"><img src="https://github.com/Apocalypsor.png?size=48" title="Apocalypsor"></a><a href="https://github.com/brentvatne" target="_blank"><img src="https://github.com/brentvatne.png?size=48" title="brentvatne"></a><a href="https://github.com/byCedric" target="_blank"><img src="https://github.com/byCedric.png?size=48" title="byCedric"></a><a href="https://github.com/circadian-risk" target="_blank"><img src="https://github.com/circadian-risk.png?size=48" title="circadian-risk"></a><a href="https://github.com/cpojer" target="_blank"><img src="https://github.com/cpojer.png?size=48" title="cpojer"></a><a href="https://github.com/cubecull" target="_blank"><img src="https://github.com/cubecull.png?size=48" title="cubecull"></a><a href="https://github.com/erwinkn" target="_blank"><img src="https://github.com/erwinkn.png?size=48" title="erwinkn"></a><a href="https://github.com/expo" target="_blank"><img src="https://github.com/expo.png?size=48" title="expo"></a><a href="https://github.com/ezra-en" target="_blank"><img src="https://github.com/ezra-en.png?size=48" title="ezra-en"></a><a href="https://github.com/fdfontes" target="_blank"><img src="https://github.com/fdfontes.png?size=48" title="fdfontes"></a><a href="https://github.com/feychenie" target="_blank"><img src="https://github.com/feychenie.png?size=48" title="feychenie"></a><a href="https://github.com/flaming-codes" target="_blank"><img src="https://github.com/flaming-codes.png?size=48" title="flaming-codes"></a><a href="https://github.com/fostertheweb" target="_blank"><img src="https://github.com/fostertheweb.png?size=48" title="fostertheweb"></a><a href="https://github.com/generates" target="_blank"><img src="https://github.com/generates.png?size=48" title="generates"></a><a href="https://github.com/Giulio987" target="_blank"><img src="https://github.com/Giulio987.png?size=48" title="Giulio987"></a><a href="https://github.com/itsdevcoffee" target="_blank"><img src="https://github.com/itsdevcoffee.png?size=48" title="itsdevcoffee"></a><a href="https://github.com/jaysc" target="_blank"><img src="https://github.com/jaysc.png?size=48" title="jaysc"></a><a href="https://github.com/jbolda" target="_blank"><img src="https://github.com/jbolda.png?size=48" title="jbolda"></a><a href="https://github.com/Kayoo-asso" target="_blank"><img src="https://github.com/Kayoo-asso.png?size=48" title="Kayoo-asso"></a><a href="https://github.com/kotofurumiya" target="_blank"><img src="https://github.com/kotofurumiya.png?size=48" title="kotofurumiya"></a><a href="https://github.com/Kudo" target="_blank"><img src="https://github.com/Kudo.png?size=48" title="Kudo"></a><a href="https://github.com/learn-anything" target="_blank"><img src="https://github.com/learn-anything.png?size=48" title="learn-anything"></a><a href="https://github.com/lluc" target="_blank"><img src="https://github.com/lluc.png?size=48" title="lluc"></a><a href="https://github.com/marksteve" target="_blank"><img src="https://github.com/marksteve.png?size=48" title="marksteve"></a><a href="https://github.com/miking-the-viking" target="_blank"><img src="https://github.com/miking-the-viking.png?size=48" title="miking-the-viking"></a><a href="https://github.com/mjamesderocher" target="_blank"><img src="https://github.com/mjamesderocher.png?size=48" title="mjamesderocher"></a><a href="https://github.com/mouktardev" target="_blank"><img src="https://github.com/mouktardev.png?size=48" title="mouktardev"></a><a href="https://github.com/nickmessing" target="_blank"><img src="https://github.com/nickmessing.png?size=48" title="nickmessing"></a><a href="https://github.com/nikitavoloboev" target="_blank"><img src="https://github.com/nikitavoloboev.png?size=48" title="nikitavoloboev"></a><a href="https://github.com/nkzw-tech" target="_blank"><img src="https://github.com/nkzw-tech.png?size=48" title="nkzw-tech"></a><a href="https://github.com/palerdot" target="_blank"><img src="https://github.com/palerdot.png?size=48" title="palerdot"></a><a href="https://github.com/PorcoRosso85" target="_blank"><img src="https://github.com/PorcoRosso85.png?size=48" title="PorcoRosso85"></a><a href="https://github.com/primodiumxyz" target="_blank"><img src="https://github.com/primodiumxyz.png?size=48" title="primodiumxyz"></a><a href="https://github.com/shaneosullivan" target="_blank"><img src="https://github.com/shaneosullivan.png?size=48" title="shaneosullivan"></a><a href="https://github.com/sudo-self" target="_blank"><img src="https://github.com/sudo-self.png?size=48" title="sudo-self"></a><a href="https://github.com/SuperSonicHub1" target="_blank"><img src="https://github.com/SuperSonicHub1.png?size=48" title="SuperSonicHub1"></a><a href="https://github.com/threepointone" target="_blank"><img src="https://github.com/threepointone.png?size=48" title="threepointone"></a><a href="https://github.com/uptonking" target="_blank"><img src="https://github.com/uptonking.png?size=48" title="uptonking"></a><a href="https://github.com/ViktorZhurbin" target="_blank"><img src="https://github.com/ViktorZhurbin.png?size=48" title="ViktorZhurbin"></a><a href="https://github.com/WonderPanda" target="_blank"><img src="https://github.com/WonderPanda.png?size=48" title="WonderPanda"></a></section><hr><p><a class="start" href="https://tinybase.org/guides/the-basics/getting-started/">Get started</a></p><p><a href="https://tinybase.org/demos/">Try the demos</a></p><p><a href="https://tinybase.org/api/store/interfaces/store/store/">Read the docs</a></p><hr><section id="about"><h2 id="about">About</h2><p>Modern apps deserve better. Why trade reactive user experiences to be able to use relational data? Or sacrifice features for bundle size? And why does the cloud do all the work <a href="https://localfirstweb.dev/" target="_blank">anyway</a>?</p><p>Building TinyBase was originally an interesting exercise for <a rel="me" href="https://tripleodeon.com">me</a> in API design, minification, and documentation. But now it has taken on a life of its own, and has grown beyond my wildest expectations.</p><p>It could not have been built without these great <a href="https://tinybase.org/guides/how-tinybase-is-built/credits/#giants">projects</a> and <a href="https://tinybase.org/guides/how-tinybase-is-built/credits/#and-friends">friends</a>, and I hope you enjoy using it as much as I do building it!</p></section><section id="story"><h2 id="the-story">The story</h2><a href="https://youtu.be/hXL7OkW-Prk?t=1232" target="_blank"><img src="https://tinybase.org/youtube.webp"></a></section>
297
+ <section><h2 id="did-we-say-tiny">Did we say tiny?</h2><p>If you use the basic <a href="https://tinybase.org/api/store/"><code>store</code></a> module alone, you&#x27;ll only add a gzipped <em>5.3kB</em> to your app. Incrementally add the other modules as you need more functionality, or get it all for <em>11.4kB</em>.</p><p>The optional <a href="https://tinybase.org/api/ui-react/"><code>ui-react</code></a> module is just <em>4.9kB</em>, the ui-react-dom components are another <em>2.6kB</em>, and everything is super fast. Life is easy when you have zero dependencies!</p><p>Read more about how TinyBase is structured and packaged in the <a href="https://tinybase.org/guides/how-tinybase-is-built/architecture/">Architecture</a> guide.</p></section><div class="table"><table class="fixed"><tbody><tr><th> </th><th>Minified .js.gz</th><th>Source .js</th></tr><tr><th class="right"><a href="https://tinybase.org/api/store/">tinybase/store</a> (minimal)</th><td>5.3kB</td><td>52.5kB</td></tr><tr><th class="right">tinybase (complete)</th><td>11.4kB</td><td>119.5kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/ui-react/">ui-react</a></th><td>4.9kB</td><td>53.7kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/ui-react-dom/">ui-react-dom</a></th><td>2.6kB</td><td>20.4kB</td></tr></tbody></table></div><section><h2 id="well-tested-and-documented">Well tested and documented.</h2><p>TinyBase has <em>100.0%</em> test coverage, including the code throughout the documentation - even on this page! The guides, demos, and API examples are designed to make it as easy as possible for you to get your TinyBase-powered app up and running.</p><p>Read more about how TinyBase is tested in the Unit <a href="https://tinybase.org/guides/how-tinybase-is-built/testing/">Testing</a> guide.</p></section><div class="table"><table class="fixed"><tbody><tr><th width="30%"> </th><th>Total</th><th>Tested</th><th>Coverage</th></tr><tr><th class="right">Lines</th><td>2,290</td><td>2,290</td><td>100.0%</td></tr><tr><th class="right">Statements</th><td>2,474</td><td>2,474</td><td>100.0%</td></tr><tr><th class="right">Functions</th><td>988</td><td>988</td><td>100.0%</td></tr><tr><th class="right">Branches</th><td>856</td><td>856</td><td>100.0%</td></tr><tr><th class="right">Tests</th><td colspan="3">7,464</td></tr><tr><th class="right">Assertions</th><td colspan="3">33,206</td></tr></tbody></table></div><hr><section id="sponsors"><h2 id="proud-to-be-sponsored-by">Proud to be sponsored by:</h2><a href="https://github.com/cpojer" target="_blank"><img src="https://github.com/cpojer.png?size=48" title="cpojer" width="48" height="48"></a><a href="https://github.com/expo" target="_blank"><img src="https://github.com/expo.png?size=48" title="expo" width="48" height="48"></a><a href="https://github.com/beekeeb" target="_blank"><img src="https://github.com/beekeeb.png?size=48" title="beekeeb" width="48" height="48"></a><a href="https://github.com/cancelself" target="_blank"><img src="https://github.com/cancelself.png?size=48" title="cancelself" width="48" height="48"></a><a href="https://github.com/WonderPanda" target="_blank"><img src="https://github.com/WonderPanda.png?size=48" title="WonderPanda" width="48" height="48"></a><a href="https://github.com/arpitBhalla" target="_blank"><img src="https://github.com/arpitBhalla.png?size=48" title="arpitBhalla" width="48" height="48"></a></section><section id="users"><h2 id="excited-to-be-used-by">Excited to be used by:</h2><a href="https://github.com/behrends" target="_blank"><img src="https://github.com/behrends.png?size=48" title="behrends" width="48" height="48"></a><a href="https://github.com/betomoedano" target="_blank"><img src="https://github.com/betomoedano.png?size=48" title="betomoedano" width="48" height="48"></a><a href="https://github.com/brentvatne" target="_blank"><img src="https://github.com/brentvatne.png?size=48" title="brentvatne" width="48" height="48"></a><a href="https://github.com/byCedric" target="_blank"><img src="https://github.com/byCedric.png?size=48" title="byCedric" width="48" height="48"></a><a href="https://github.com/circadian-risk" target="_blank"><img src="https://github.com/circadian-risk.png?size=48" title="circadian-risk" width="48" height="48"></a><a href="https://github.com/cpojer" target="_blank"><img src="https://github.com/cpojer.png?size=48" title="cpojer" width="48" height="48"></a><a href="https://github.com/cubecull" target="_blank"><img src="https://github.com/cubecull.png?size=48" title="cubecull" width="48" height="48"></a><a href="https://github.com/erwinkn" target="_blank"><img src="https://github.com/erwinkn.png?size=48" title="erwinkn" width="48" height="48"></a><a href="https://github.com/expo" target="_blank"><img src="https://github.com/expo.png?size=48" title="expo" width="48" height="48"></a><a href="https://github.com/ezra-en" target="_blank"><img src="https://github.com/ezra-en.png?size=48" title="ezra-en" width="48" height="48"></a><a href="https://github.com/feychenie" target="_blank"><img src="https://github.com/feychenie.png?size=48" title="feychenie" width="48" height="48"></a><a href="https://github.com/flaming-codes" target="_blank"><img src="https://github.com/flaming-codes.png?size=48" title="flaming-codes" width="48" height="48"></a><a href="https://github.com/fostertheweb" target="_blank"><img src="https://github.com/fostertheweb.png?size=48" title="fostertheweb" width="48" height="48"></a><a href="https://github.com/Giulio987" target="_blank"><img src="https://github.com/Giulio987.png?size=48" title="Giulio987" width="48" height="48"></a><a href="https://github.com/hi-ogawa" target="_blank"><img src="https://github.com/hi-ogawa.png?size=48" title="hi-ogawa" width="48" height="48"></a><a href="https://github.com/itsdevcoffee" target="_blank"><img src="https://github.com/itsdevcoffee.png?size=48" title="itsdevcoffee" width="48" height="48"></a><a href="https://github.com/jbolda" target="_blank"><img src="https://github.com/jbolda.png?size=48" title="jbolda" width="48" height="48"></a><a href="https://github.com/Kayoo-asso" target="_blank"><img src="https://github.com/Kayoo-asso.png?size=48" title="Kayoo-asso" width="48" height="48"></a><a href="https://github.com/kotofurumiya" target="_blank"><img src="https://github.com/kotofurumiya.png?size=48" title="kotofurumiya" width="48" height="48"></a><a href="https://github.com/Kudo" target="_blank"><img src="https://github.com/Kudo.png?size=48" title="Kudo" width="48" height="48"></a><a href="https://github.com/learn-anything" target="_blank"><img src="https://github.com/learn-anything.png?size=48" title="learn-anything" width="48" height="48"></a><a href="https://github.com/lluc" target="_blank"><img src="https://github.com/lluc.png?size=48" title="lluc" width="48" height="48"></a><a href="https://github.com/marksteve" target="_blank"><img src="https://github.com/marksteve.png?size=48" title="marksteve" width="48" height="48"></a><a href="https://github.com/miking-the-viking" target="_blank"><img src="https://github.com/miking-the-viking.png?size=48" title="miking-the-viking" width="48" height="48"></a><a href="https://github.com/mjamesderocher" target="_blank"><img src="https://github.com/mjamesderocher.png?size=48" title="mjamesderocher" width="48" height="48"></a><a href="https://github.com/mouktardev" target="_blank"><img src="https://github.com/mouktardev.png?size=48" title="mouktardev" width="48" height="48"></a><a href="https://github.com/nickmessing" target="_blank"><img src="https://github.com/nickmessing.png?size=48" title="nickmessing" width="48" height="48"></a><a href="https://github.com/nikitavoloboev" target="_blank"><img src="https://github.com/nikitavoloboev.png?size=48" title="nikitavoloboev" width="48" height="48"></a><a href="https://github.com/nkzw-tech" target="_blank"><img src="https://github.com/nkzw-tech.png?size=48" title="nkzw-tech" width="48" height="48"></a><a href="https://github.com/palerdot" target="_blank"><img src="https://github.com/palerdot.png?size=48" title="palerdot" width="48" height="48"></a><a href="https://github.com/PorcoRosso85" target="_blank"><img src="https://github.com/PorcoRosso85.png?size=48" title="PorcoRosso85" width="48" height="48"></a><a href="https://github.com/primodiumxyz" target="_blank"><img src="https://github.com/primodiumxyz.png?size=48" title="primodiumxyz" width="48" height="48"></a><a href="https://github.com/shaneosullivan" target="_blank"><img src="https://github.com/shaneosullivan.png?size=48" title="shaneosullivan" width="48" height="48"></a><a href="https://github.com/sudo-self" target="_blank"><img src="https://github.com/sudo-self.png?size=48" title="sudo-self" width="48" height="48"></a><a href="https://github.com/SuperSonicHub1" target="_blank"><img src="https://github.com/SuperSonicHub1.png?size=48" title="SuperSonicHub1" width="48" height="48"></a><a href="https://github.com/threepointone" target="_blank"><img src="https://github.com/threepointone.png?size=48" title="threepointone" width="48" height="48"></a><a href="https://github.com/uptonking" target="_blank"><img src="https://github.com/uptonking.png?size=48" title="uptonking" width="48" height="48"></a><a href="https://github.com/ViktorZhurbin" target="_blank"><img src="https://github.com/ViktorZhurbin.png?size=48" title="ViktorZhurbin" width="48" height="48"></a><a href="https://github.com/wilkerlucio" target="_blank"><img src="https://github.com/wilkerlucio.png?size=48" title="wilkerlucio" width="48" height="48"></a><a href="https://github.com/WonderPanda" target="_blank"><img src="https://github.com/WonderPanda.png?size=48" title="WonderPanda" width="48" height="48"></a></section><hr><p><a class="start" href="https://tinybase.org/guides/the-basics/getting-started/">Get started</a></p><p><a href="https://tinybase.org/demos/">Try the demos</a></p><p><a href="https://tinybase.org/api/store/interfaces/store/store/">Read the docs</a></p><hr><section id="about"><h2 id="about">About</h2><p>Modern apps deserve better. Why trade reactive user experiences to be able to use relational data? Or sacrifice features for bundle size? And why does the cloud do all the work <a href="https://localfirstweb.dev/" target="_blank">anyway</a>?</p><p>Building TinyBase was originally an interesting exercise for <a rel="me" href="https://tripleodeon.com">me</a> in API design, minification, and documentation. But now it has taken on a life of its own, and has grown beyond my wildest expectations.</p><p>It could not have been built without these great <a href="https://tinybase.org/guides/how-tinybase-is-built/credits/#giants">projects</a> and <a href="https://tinybase.org/guides/how-tinybase-is-built/credits/#and-friends">friends</a>, and I hope you enjoy using it as much as I do building it!</p></section><section id="story"><h2 id="the-story">The story</h2><a href="https://youtu.be/hXL7OkW-Prk?t=1232" target="_blank"><img src="https://tinybase.org/youtube.webp"></a></section>
@@ -2,7 +2,7 @@ const getTypeOf = (thing) => typeof thing;
2
2
  const EMPTY_STRING = '';
3
3
  const STRING = getTypeOf(EMPTY_STRING);
4
4
 
5
- const isUndefined = (thing) => thing == void 0;
5
+ const isUndefined = (thing) => thing == undefined;
6
6
  const ifNotUndefined = (value, then, otherwise) =>
7
7
  isUndefined(value) ? otherwise?.() : then(value);
8
8
  const isString = (thing) => getTypeOf(thing) == STRING;
@@ -149,7 +149,7 @@ const getDefinableFunctions = (
149
149
  const oldRowValue = mapGet(rowValues, rowId);
150
150
  const newRowValue = hasRow(tableId, rowId)
151
151
  ? validateRowValue(getRowValue(getCell, rowId))
152
- : void 0;
152
+ : undefined;
153
153
  if (
154
154
  !(
155
155
  oldRowValue === newRowValue ||
@@ -164,7 +164,7 @@ const getDefinableFunctions = (
164
164
  const oldSortKey = mapGet(sortKeys, rowId);
165
165
  const newSortKey = hasRow(tableId, rowId)
166
166
  ? getSortKey(getCell, rowId)
167
- : void 0;
167
+ : undefined;
168
168
  if (oldSortKey != newSortKey) {
169
169
  mapSet(changedSortKeys, rowId, newSortKey);
170
170
  }
@@ -307,7 +307,7 @@ const getListenerFunctions = (getThing) => {
307
307
  );
308
308
  const delListener = (id) =>
309
309
  ifNotUndefined(mapGet(allListeners, id), ([, idSetNode, idOrNulls]) => {
310
- visitTree(idSetNode, idOrNulls ?? [EMPTY_STRING], void 0, (idSet) => {
310
+ visitTree(idSetNode, idOrNulls ?? [EMPTY_STRING], undefined, (idSet) => {
311
311
  collDel(idSet, id);
312
312
  return collIsEmpty(idSet) ? 1 : 0;
313
313
  });
@@ -361,7 +361,7 @@ const createRelationships = getCreateFunction((store) => {
361
361
  ] = getDefinableFunctions(
362
362
  store,
363
363
  () => [mapNew(), mapNew(), mapNew(), mapNew()],
364
- (value) => (isUndefined(value) ? void 0 : value + EMPTY_STRING),
364
+ (value) => (isUndefined(value) ? undefined : value + EMPTY_STRING),
365
365
  addListener,
366
366
  callListeners,
367
367
  );
@@ -2,7 +2,7 @@ const getTypeOf = (thing) => typeof thing;
2
2
  const EMPTY_STRING = '';
3
3
  const STRING = getTypeOf(EMPTY_STRING);
4
4
 
5
- const isUndefined = (thing) => thing == void 0;
5
+ const isUndefined = (thing) => thing == undefined;
6
6
  const ifNotUndefined = (value, then, otherwise) =>
7
7
  isUndefined(value) ? otherwise?.() : then(value);
8
8
  const isString = (thing) => getTypeOf(thing) == STRING;
@@ -149,7 +149,7 @@ const getDefinableFunctions = (
149
149
  const oldRowValue = mapGet(rowValues, rowId);
150
150
  const newRowValue = hasRow(tableId, rowId)
151
151
  ? validateRowValue(getRowValue(getCell, rowId))
152
- : void 0;
152
+ : undefined;
153
153
  if (
154
154
  !(
155
155
  oldRowValue === newRowValue ||
@@ -164,7 +164,7 @@ const getDefinableFunctions = (
164
164
  const oldSortKey = mapGet(sortKeys, rowId);
165
165
  const newSortKey = hasRow(tableId, rowId)
166
166
  ? getSortKey(getCell, rowId)
167
- : void 0;
167
+ : undefined;
168
168
  if (oldSortKey != newSortKey) {
169
169
  mapSet(changedSortKeys, rowId, newSortKey);
170
170
  }
@@ -307,7 +307,7 @@ const getListenerFunctions = (getThing) => {
307
307
  );
308
308
  const delListener = (id) =>
309
309
  ifNotUndefined(mapGet(allListeners, id), ([, idSetNode, idOrNulls]) => {
310
- visitTree(idSetNode, idOrNulls ?? [EMPTY_STRING], void 0, (idSet) => {
310
+ visitTree(idSetNode, idOrNulls ?? [EMPTY_STRING], undefined, (idSet) => {
311
311
  collDel(idSet, id);
312
312
  return collIsEmpty(idSet) ? 1 : 0;
313
313
  });
@@ -361,7 +361,7 @@ const createRelationships = getCreateFunction((store) => {
361
361
  ] = getDefinableFunctions(
362
362
  store,
363
363
  () => [mapNew(), mapNew(), mapNew(), mapNew()],
364
- (value) => (isUndefined(value) ? void 0 : value + EMPTY_STRING),
364
+ (value) => (isUndefined(value) ? undefined : value + EMPTY_STRING),
365
365
  addListener,
366
366
  callListeners,
367
367
  );
package/store/index.js CHANGED
@@ -25,7 +25,7 @@ const id = (key) => EMPTY_STRING + key;
25
25
 
26
26
  const isFiniteNumber = isFinite;
27
27
  const isInstanceOf = (thing, cls) => thing instanceof cls;
28
- const isUndefined = (thing) => thing == void 0;
28
+ const isUndefined = (thing) => thing == undefined;
29
29
  const ifNotUndefined = (value, then, otherwise) =>
30
30
  isUndefined(value) ? otherwise?.() : then(value);
31
31
  const isTypeStringOrBoolean = (type) => type == STRING || type == BOOLEAN;
@@ -245,7 +245,7 @@ const getListenerFunctions = (getThing) => {
245
245
  );
246
246
  const delListener = (id) =>
247
247
  ifNotUndefined(mapGet(allListeners, id), ([, idSetNode, idOrNulls]) => {
248
- visitTree(idSetNode, idOrNulls ?? [EMPTY_STRING], void 0, (idSet) => {
248
+ visitTree(idSetNode, idOrNulls ?? [EMPTY_STRING], undefined, (idSet) => {
249
249
  collDel(idSet, id);
250
250
  return collIsEmpty(idSet) ? 1 : 0;
251
251
  });
@@ -286,7 +286,7 @@ const getCellOrValueType = (cellOrValue) => {
286
286
  return isTypeStringOrBoolean(type) ||
287
287
  (type == NUMBER && isFiniteNumber(cellOrValue))
288
288
  ? type
289
- : void 0;
289
+ : undefined;
290
290
  };
291
291
  const setOrDelCell = (store, tableId, rowId, cellId, cell) =>
292
292
  isUndefined(cell)
@@ -309,7 +309,7 @@ const idsChanged = (changedIds, id2, addedOrRemoved) =>
309
309
  mapSet(
310
310
  changedIds,
311
311
  id2,
312
- mapGet(changedIds, id2) == -addedOrRemoved ? void 0 : addedOrRemoved,
312
+ mapGet(changedIds, id2) == -addedOrRemoved ? undefined : addedOrRemoved,
313
313
  );
314
314
  const createStore = () => {
315
315
  let hasTablesSchema;
@@ -783,7 +783,7 @@ const createStore = () => {
783
783
  const callTabularListenersForChanges = (mutator) => {
784
784
  const hasTablesNow = hasTables();
785
785
  if (hasTablesNow != hadTables) {
786
- callListeners(hasTablesListeners[mutator], void 0, hasTablesNow);
786
+ callListeners(hasTablesListeners[mutator], undefined, hasTablesNow);
787
787
  }
788
788
  const emptySortedRowIdListeners = collIsEmpty(
789
789
  sortedRowIdsListeners[mutator],
@@ -922,7 +922,7 @@ const createStore = () => {
922
922
  }
923
923
  });
924
924
  if (tablesChanged) {
925
- callListeners(tablesListeners[mutator], void 0, getCellChange);
925
+ callListeners(tablesListeners[mutator], undefined, getCellChange);
926
926
  }
927
927
  }
928
928
  }
@@ -930,7 +930,7 @@ const createStore = () => {
930
930
  const callValuesListenersForChanges = (mutator) => {
931
931
  const hasValuesNow = hasValues();
932
932
  if (hasValuesNow != hadValues) {
933
- callListeners(hasValuesListeners[mutator], void 0, hasValuesNow);
933
+ callListeners(hasValuesListeners[mutator], undefined, hasValuesNow);
934
934
  }
935
935
  const emptyIdAndHasListeners =
936
936
  collIsEmpty(valueIdsListeners[mutator]) &&
@@ -964,7 +964,7 @@ const createStore = () => {
964
964
  }
965
965
  });
966
966
  if (valuesChanged) {
967
- callListeners(valuesListeners[mutator], void 0, getValueChange);
967
+ callListeners(valuesListeners[mutator], undefined, getValueChange);
968
968
  }
969
969
  }
970
970
  }
@@ -1051,7 +1051,7 @@ const createStore = () => {
1051
1051
  );
1052
1052
  const addRow = (tableId, row, reuseRowIds = true) =>
1053
1053
  transaction(() => {
1054
- let rowId = void 0;
1054
+ let rowId = undefined;
1055
1055
  if (validateRow(tableId, rowId, row)) {
1056
1056
  tableId = id(tableId);
1057
1057
  setValidRow(
@@ -1273,12 +1273,12 @@ const createStore = () => {
1273
1273
  changedCells,
1274
1274
  (table, tableId) =>
1275
1275
  mapGet(changedTableIds, tableId) === -1
1276
- ? void 0
1276
+ ? undefined
1277
1277
  : mapToObj(
1278
1278
  table,
1279
1279
  (row, rowId) =>
1280
1280
  mapGet(mapGet(changedRowIds, tableId), rowId) === -1
1281
- ? void 0
1281
+ ? undefined
1282
1282
  : mapToObj(
1283
1283
  row,
1284
1284
  ([, newCell]) => newCell,
@@ -1336,7 +1336,7 @@ const createStore = () => {
1336
1336
  );
1337
1337
  collClear(changedValues);
1338
1338
  }
1339
- callListeners(finishTransactionListeners[0], void 0);
1339
+ callListeners(finishTransactionListeners[0], undefined);
1340
1340
  transactions = -1;
1341
1341
  callInvalidCellListeners(0);
1342
1342
  if (!collIsEmpty(changedCells)) {
@@ -1347,7 +1347,7 @@ const createStore = () => {
1347
1347
  callValuesListenersForChanges(0);
1348
1348
  }
1349
1349
  internalListeners[1]?.();
1350
- callListeners(finishTransactionListeners[1], void 0);
1350
+ callListeners(finishTransactionListeners[1], undefined);
1351
1351
  internalListeners[2]?.();
1352
1352
  transactions = 0;
1353
1353
  hadTables = hasTables();
@@ -1632,7 +1632,7 @@ const createStore = () => {
1632
1632
  addListener(
1633
1633
  args[argumentCount],
1634
1634
  idSetNode[args[argumentCount + 1] ? 1 : 0],
1635
- argumentCount > 0 ? slice(args, 0, argumentCount) : void 0,
1635
+ argumentCount > 0 ? slice(args, 0, argumentCount) : undefined,
1636
1636
  pathGetters,
1637
1637
  extraArgsGetter,
1638
1638
  );
@@ -25,7 +25,7 @@ const id = (key) => EMPTY_STRING + key;
25
25
 
26
26
  const isFiniteNumber = isFinite;
27
27
  const isInstanceOf = (thing, cls) => thing instanceof cls;
28
- const isUndefined = (thing) => thing == void 0;
28
+ const isUndefined = (thing) => thing == undefined;
29
29
  const ifNotUndefined = (value, then, otherwise) =>
30
30
  isUndefined(value) ? otherwise?.() : then(value);
31
31
  const isTypeStringOrBoolean = (type) => type == STRING || type == BOOLEAN;
@@ -245,7 +245,7 @@ const getListenerFunctions = (getThing) => {
245
245
  );
246
246
  const delListener = (id) =>
247
247
  ifNotUndefined(mapGet(allListeners, id), ([, idSetNode, idOrNulls]) => {
248
- visitTree(idSetNode, idOrNulls ?? [EMPTY_STRING], void 0, (idSet) => {
248
+ visitTree(idSetNode, idOrNulls ?? [EMPTY_STRING], undefined, (idSet) => {
249
249
  collDel(idSet, id);
250
250
  return collIsEmpty(idSet) ? 1 : 0;
251
251
  });
@@ -286,7 +286,7 @@ const getCellOrValueType = (cellOrValue) => {
286
286
  return isTypeStringOrBoolean(type) ||
287
287
  (type == NUMBER && isFiniteNumber(cellOrValue))
288
288
  ? type
289
- : void 0;
289
+ : undefined;
290
290
  };
291
291
  const setOrDelCell = (store, tableId, rowId, cellId, cell) =>
292
292
  isUndefined(cell)
@@ -309,7 +309,7 @@ const idsChanged = (changedIds, id2, addedOrRemoved) =>
309
309
  mapSet(
310
310
  changedIds,
311
311
  id2,
312
- mapGet(changedIds, id2) == -addedOrRemoved ? void 0 : addedOrRemoved,
312
+ mapGet(changedIds, id2) == -addedOrRemoved ? undefined : addedOrRemoved,
313
313
  );
314
314
  const createStore = () => {
315
315
  let hasTablesSchema;
@@ -783,7 +783,7 @@ const createStore = () => {
783
783
  const callTabularListenersForChanges = (mutator) => {
784
784
  const hasTablesNow = hasTables();
785
785
  if (hasTablesNow != hadTables) {
786
- callListeners(hasTablesListeners[mutator], void 0, hasTablesNow);
786
+ callListeners(hasTablesListeners[mutator], undefined, hasTablesNow);
787
787
  }
788
788
  const emptySortedRowIdListeners = collIsEmpty(
789
789
  sortedRowIdsListeners[mutator],
@@ -922,7 +922,7 @@ const createStore = () => {
922
922
  }
923
923
  });
924
924
  if (tablesChanged) {
925
- callListeners(tablesListeners[mutator], void 0, getCellChange);
925
+ callListeners(tablesListeners[mutator], undefined, getCellChange);
926
926
  }
927
927
  }
928
928
  }
@@ -930,7 +930,7 @@ const createStore = () => {
930
930
  const callValuesListenersForChanges = (mutator) => {
931
931
  const hasValuesNow = hasValues();
932
932
  if (hasValuesNow != hadValues) {
933
- callListeners(hasValuesListeners[mutator], void 0, hasValuesNow);
933
+ callListeners(hasValuesListeners[mutator], undefined, hasValuesNow);
934
934
  }
935
935
  const emptyIdAndHasListeners =
936
936
  collIsEmpty(valueIdsListeners[mutator]) &&
@@ -964,7 +964,7 @@ const createStore = () => {
964
964
  }
965
965
  });
966
966
  if (valuesChanged) {
967
- callListeners(valuesListeners[mutator], void 0, getValueChange);
967
+ callListeners(valuesListeners[mutator], undefined, getValueChange);
968
968
  }
969
969
  }
970
970
  }
@@ -1051,7 +1051,7 @@ const createStore = () => {
1051
1051
  );
1052
1052
  const addRow = (tableId, row, reuseRowIds = true) =>
1053
1053
  transaction(() => {
1054
- let rowId = void 0;
1054
+ let rowId = undefined;
1055
1055
  if (validateRow(tableId, rowId, row)) {
1056
1056
  tableId = id(tableId);
1057
1057
  setValidRow(
@@ -1273,12 +1273,12 @@ const createStore = () => {
1273
1273
  changedCells,
1274
1274
  (table, tableId) =>
1275
1275
  mapGet(changedTableIds, tableId) === -1
1276
- ? void 0
1276
+ ? undefined
1277
1277
  : mapToObj(
1278
1278
  table,
1279
1279
  (row, rowId) =>
1280
1280
  mapGet(mapGet(changedRowIds, tableId), rowId) === -1
1281
- ? void 0
1281
+ ? undefined
1282
1282
  : mapToObj(
1283
1283
  row,
1284
1284
  ([, newCell]) => newCell,
@@ -1336,7 +1336,7 @@ const createStore = () => {
1336
1336
  );
1337
1337
  collClear(changedValues);
1338
1338
  }
1339
- callListeners(finishTransactionListeners[0], void 0);
1339
+ callListeners(finishTransactionListeners[0], undefined);
1340
1340
  transactions = -1;
1341
1341
  callInvalidCellListeners(0);
1342
1342
  if (!collIsEmpty(changedCells)) {
@@ -1347,7 +1347,7 @@ const createStore = () => {
1347
1347
  callValuesListenersForChanges(0);
1348
1348
  }
1349
1349
  internalListeners[1]?.();
1350
- callListeners(finishTransactionListeners[1], void 0);
1350
+ callListeners(finishTransactionListeners[1], undefined);
1351
1351
  internalListeners[2]?.();
1352
1352
  transactions = 0;
1353
1353
  hadTables = hasTables();
@@ -1632,7 +1632,7 @@ const createStore = () => {
1632
1632
  addListener(
1633
1633
  args[argumentCount],
1634
1634
  idSetNode[args[argumentCount + 1] ? 1 : 0],
1635
- argumentCount > 0 ? slice(args, 0, argumentCount) : void 0,
1635
+ argumentCount > 0 ? slice(args, 0, argumentCount) : undefined,
1636
1636
  pathGetters,
1637
1637
  extraArgsGetter,
1638
1638
  );
@@ -9,7 +9,7 @@ const startTimeout = (callback, sec = 0) =>
9
9
  setTimeout(callback, sec * THOUSAND);
10
10
  const math = Math;
11
11
  const mathFloor = math.floor;
12
- const isUndefined = (thing) => thing == void 0;
12
+ const isUndefined = (thing) => thing == undefined;
13
13
  const ifNotUndefined = (value, then, otherwise) =>
14
14
  isUndefined(value) ? otherwise?.() : then(value);
15
15
  const isArray = (thing) => Array.isArray(thing);
@@ -166,7 +166,7 @@ const getListenerFunctions = (getThing) => {
166
166
  );
167
167
  const delListener = (id) =>
168
168
  ifNotUndefined(mapGet(allListeners, id), ([, idSetNode, idOrNulls]) => {
169
- visitTree(idSetNode, idOrNulls ?? [EMPTY_STRING], void 0, (idSet) => {
169
+ visitTree(idSetNode, idOrNulls ?? [EMPTY_STRING], undefined, (idSet) => {
170
170
  collDel(idSet, id);
171
171
  return collIsEmpty(idSet) ? 1 : 0;
172
172
  });
@@ -256,7 +256,7 @@ const createCustomPersister = (
256
256
  const setStatus = (newStatus) => {
257
257
  if (newStatus != status) {
258
258
  status = newStatus;
259
- callListeners(statusListeners, void 0, status);
259
+ callListeners(statusListeners, undefined, status);
260
260
  }
261
261
  };
262
262
  const run = async () => {
@@ -337,7 +337,7 @@ const createCustomPersister = (
337
337
  const stopAutoLoad = () => {
338
338
  if (autoLoadHandle) {
339
339
  delPersisterListener(autoLoadHandle);
340
- autoLoadHandle = void 0;
340
+ autoLoadHandle = undefined;
341
341
  }
342
342
  return persister;
343
343
  };
@@ -373,7 +373,7 @@ const createCustomPersister = (
373
373
  const stopAutoSave = () => {
374
374
  if (autoSaveListenerId) {
375
375
  store.delListener(autoSaveListenerId);
376
- autoSaveListenerId = void 0;
376
+ autoSaveListenerId = undefined;
377
377
  }
378
378
  return persister;
379
379
  };
@@ -574,7 +574,7 @@ const createCustomSynchronizer = (
574
574
  const changes = await getChangesFromOtherStore();
575
575
  return changes && (!objIsEmpty(changes[0][0]) || !objIsEmpty(changes[1][0]))
576
576
  ? changes
577
- : void 0;
577
+ : undefined;
578
578
  };
579
579
  const setPersisted = async (_getContent, changes) =>
580
580
  changes
@@ -586,7 +586,7 @@ const createCustomSynchronizer = (
586
586
  store.getMergeableContentHashes(),
587
587
  );
588
588
  const addPersisterListener = (listener) => (persisterListener = listener);
589
- const delPersisterListener = () => (persisterListener = void 0);
589
+ const delPersisterListener = () => (persisterListener = undefined);
590
590
  const startSync = async (initialContent) => {
591
591
  syncing = 1;
592
592
  return await (
@@ -631,14 +631,14 @@ const createCustomSynchronizer = (
631
631
  getChangesFromOtherStore(
632
632
  fromClientId,
633
633
  body,
634
- transactionOrRequestId ?? void 0,
634
+ transactionOrRequestId ?? undefined,
635
635
  )
636
636
  .then((changes) => {
637
- persisterListener?.(void 0, changes);
637
+ persisterListener?.(undefined, changes);
638
638
  })
639
639
  .catch(onIgnoredError);
640
640
  } else if (message == 3 /* ContentDiff */ && isAutoLoading) {
641
- persisterListener?.(void 0, body);
641
+ persisterListener?.(undefined, body);
642
642
  } else {
643
643
  ifNotUndefined(
644
644
  message == 1 /* GetContentHashes */ &&
@@ -652,7 +652,7 @@ const createCustomSynchronizer = (
652
652
  ? store.getMergeableCellDiff(body)
653
653
  : message == 7 /* GetValueDiff */
654
654
  ? store.getMergeableValueDiff(body)
655
- : void 0,
655
+ : undefined,
656
656
  (response) => {
657
657
  sendImpl(
658
658
  fromClientId,
@@ -9,7 +9,7 @@ const startTimeout = (callback, sec = 0) =>
9
9
  setTimeout(callback, sec * THOUSAND);
10
10
  const math = Math;
11
11
  const mathFloor = math.floor;
12
- const isUndefined = (thing) => thing == void 0;
12
+ const isUndefined = (thing) => thing == undefined;
13
13
  const ifNotUndefined = (value, then, otherwise) =>
14
14
  isUndefined(value) ? otherwise?.() : then(value);
15
15
  const isArray = (thing) => Array.isArray(thing);
@@ -166,7 +166,7 @@ const getListenerFunctions = (getThing) => {
166
166
  );
167
167
  const delListener = (id) =>
168
168
  ifNotUndefined(mapGet(allListeners, id), ([, idSetNode, idOrNulls]) => {
169
- visitTree(idSetNode, idOrNulls ?? [EMPTY_STRING], void 0, (idSet) => {
169
+ visitTree(idSetNode, idOrNulls ?? [EMPTY_STRING], undefined, (idSet) => {
170
170
  collDel(idSet, id);
171
171
  return collIsEmpty(idSet) ? 1 : 0;
172
172
  });
@@ -256,7 +256,7 @@ const createCustomPersister = (
256
256
  const setStatus = (newStatus) => {
257
257
  if (newStatus != status) {
258
258
  status = newStatus;
259
- callListeners(statusListeners, void 0, status);
259
+ callListeners(statusListeners, undefined, status);
260
260
  }
261
261
  };
262
262
  const run = async () => {
@@ -337,7 +337,7 @@ const createCustomPersister = (
337
337
  const stopAutoLoad = () => {
338
338
  if (autoLoadHandle) {
339
339
  delPersisterListener(autoLoadHandle);
340
- autoLoadHandle = void 0;
340
+ autoLoadHandle = undefined;
341
341
  }
342
342
  return persister;
343
343
  };
@@ -373,7 +373,7 @@ const createCustomPersister = (
373
373
  const stopAutoSave = () => {
374
374
  if (autoSaveListenerId) {
375
375
  store.delListener(autoSaveListenerId);
376
- autoSaveListenerId = void 0;
376
+ autoSaveListenerId = undefined;
377
377
  }
378
378
  return persister;
379
379
  };
@@ -564,7 +564,7 @@ const createCustomSynchronizer = (
564
564
  const changes = await getChangesFromOtherStore();
565
565
  return changes && (!objIsEmpty(changes[0][0]) || !objIsEmpty(changes[1][0]))
566
566
  ? changes
567
- : void 0;
567
+ : undefined;
568
568
  };
569
569
  const setPersisted = async (_getContent, changes) =>
570
570
  changes
@@ -576,7 +576,7 @@ const createCustomSynchronizer = (
576
576
  store.getMergeableContentHashes(),
577
577
  );
578
578
  const addPersisterListener = (listener) => (persisterListener = listener);
579
- const delPersisterListener = () => (persisterListener = void 0);
579
+ const delPersisterListener = () => (persisterListener = undefined);
580
580
  const startSync = async (initialContent) => {
581
581
  syncing = 1;
582
582
  return await (
@@ -621,14 +621,14 @@ const createCustomSynchronizer = (
621
621
  getChangesFromOtherStore(
622
622
  fromClientId,
623
623
  body,
624
- transactionOrRequestId ?? void 0,
624
+ transactionOrRequestId ?? undefined,
625
625
  )
626
626
  .then((changes) => {
627
- persisterListener?.(void 0, changes);
627
+ persisterListener?.(undefined, changes);
628
628
  })
629
629
  .catch(onIgnoredError);
630
630
  } else if (message == 3 /* ContentDiff */ && isAutoLoading) {
631
- persisterListener?.(void 0, body);
631
+ persisterListener?.(undefined, body);
632
632
  } else {
633
633
  ifNotUndefined(
634
634
  message == 1 /* GetContentHashes */ &&
@@ -642,7 +642,7 @@ const createCustomSynchronizer = (
642
642
  ? store.getMergeableCellDiff(body)
643
643
  : message == 7 /* GetValueDiff */
644
644
  ? store.getMergeableValueDiff(body)
645
- : void 0,
645
+ : undefined,
646
646
  (response) => {
647
647
  sendImpl(
648
648
  fromClientId,