tinybase 5.1.3 → 5.1.5

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 (496) hide show
  1. package/@types/common/index.d.cts +34 -2
  2. package/@types/common/index.d.ts +34 -2
  3. package/@types/common/with-schemas/index.d.cts +34 -2
  4. package/@types/common/with-schemas/index.d.ts +34 -2
  5. package/@types/synchronizers/synchronizer-local/index.d.cts +1 -0
  6. package/@types/synchronizers/synchronizer-local/index.d.ts +1 -0
  7. package/@types/synchronizers/synchronizer-local/with-schemas/index.d.cts +1 -0
  8. package/@types/synchronizers/synchronizer-local/with-schemas/index.d.ts +1 -0
  9. package/checkpoints/index.js +9 -7
  10. package/checkpoints/with-schemas/index.js +9 -7
  11. package/cjs/checkpoints/index.cjs +9 -7
  12. package/cjs/checkpoints/with-schemas/index.cjs +9 -7
  13. package/cjs/es6/checkpoints/index.cjs +15 -13
  14. package/cjs/es6/checkpoints/with-schemas/index.cjs +15 -13
  15. package/cjs/es6/index.cjs +28 -20
  16. package/cjs/es6/indexes/index.cjs +15 -13
  17. package/cjs/es6/indexes/with-schemas/index.cjs +15 -13
  18. package/cjs/es6/mergeable-store/index.cjs +23 -17
  19. package/cjs/es6/mergeable-store/with-schemas/index.cjs +23 -17
  20. package/cjs/es6/metrics/index.cjs +15 -13
  21. package/cjs/es6/metrics/with-schemas/index.cjs +15 -13
  22. package/cjs/es6/min/index.cjs +1 -1
  23. package/cjs/es6/min/index.cjs.gz +0 -0
  24. package/cjs/es6/min/mergeable-store/index.cjs +1 -1
  25. package/cjs/es6/min/mergeable-store/index.cjs.gz +0 -0
  26. package/cjs/es6/min/mergeable-store/with-schemas/index.cjs +1 -1
  27. package/cjs/es6/min/mergeable-store/with-schemas/index.cjs.gz +0 -0
  28. package/cjs/es6/min/persisters/persister-automerge/index.cjs +1 -1
  29. package/cjs/es6/min/persisters/persister-automerge/index.cjs.gz +0 -0
  30. package/cjs/es6/min/persisters/persister-automerge/with-schemas/index.cjs +1 -1
  31. package/cjs/es6/min/persisters/persister-automerge/with-schemas/index.cjs.gz +0 -0
  32. package/cjs/es6/min/store/index.cjs +1 -1
  33. package/cjs/es6/min/store/index.cjs.gz +0 -0
  34. package/cjs/es6/min/store/with-schemas/index.cjs +1 -1
  35. package/cjs/es6/min/store/with-schemas/index.cjs.gz +0 -0
  36. package/cjs/es6/min/ui-react-inspector/index.cjs +1 -1
  37. package/cjs/es6/min/ui-react-inspector/index.cjs.gz +0 -0
  38. package/cjs/es6/min/ui-react-inspector/with-schemas/index.cjs +1 -1
  39. package/cjs/es6/min/ui-react-inspector/with-schemas/index.cjs.gz +0 -0
  40. package/cjs/es6/min/with-schemas/index.cjs +1 -1
  41. package/cjs/es6/min/with-schemas/index.cjs.gz +0 -0
  42. package/cjs/es6/persisters/index.cjs +5 -3
  43. package/cjs/es6/persisters/persister-automerge/index.cjs +7 -4
  44. package/cjs/es6/persisters/persister-automerge/with-schemas/index.cjs +7 -4
  45. package/cjs/es6/persisters/persister-browser/index.cjs +5 -3
  46. package/cjs/es6/persisters/persister-browser/with-schemas/index.cjs +5 -3
  47. package/cjs/es6/persisters/persister-cr-sqlite-wasm/index.cjs +8 -4
  48. package/cjs/es6/persisters/persister-cr-sqlite-wasm/with-schemas/index.cjs +8 -4
  49. package/cjs/es6/persisters/persister-electric-sql/index.cjs +8 -4
  50. package/cjs/es6/persisters/persister-electric-sql/with-schemas/index.cjs +8 -4
  51. package/cjs/es6/persisters/persister-expo-sqlite/index.cjs +8 -4
  52. package/cjs/es6/persisters/persister-expo-sqlite/with-schemas/index.cjs +8 -4
  53. package/cjs/es6/persisters/persister-file/index.cjs +5 -3
  54. package/cjs/es6/persisters/persister-file/with-schemas/index.cjs +5 -3
  55. package/cjs/es6/persisters/persister-indexed-db/index.cjs +5 -3
  56. package/cjs/es6/persisters/persister-indexed-db/with-schemas/index.cjs +5 -3
  57. package/cjs/es6/persisters/persister-libsql/index.cjs +8 -4
  58. package/cjs/es6/persisters/persister-libsql/with-schemas/index.cjs +8 -4
  59. package/cjs/es6/persisters/persister-partykit-client/index.cjs +5 -3
  60. package/cjs/es6/persisters/persister-partykit-client/with-schemas/index.cjs +5 -3
  61. package/cjs/es6/persisters/persister-partykit-server/index.cjs +36 -22
  62. package/cjs/es6/persisters/persister-partykit-server/with-schemas/index.cjs +36 -22
  63. package/cjs/es6/persisters/persister-powersync/index.cjs +8 -4
  64. package/cjs/es6/persisters/persister-powersync/with-schemas/index.cjs +8 -4
  65. package/cjs/es6/persisters/persister-remote/index.cjs +5 -3
  66. package/cjs/es6/persisters/persister-remote/with-schemas/index.cjs +5 -3
  67. package/cjs/es6/persisters/persister-sqlite-wasm/index.cjs +8 -4
  68. package/cjs/es6/persisters/persister-sqlite-wasm/with-schemas/index.cjs +8 -4
  69. package/cjs/es6/persisters/persister-sqlite3/index.cjs +8 -4
  70. package/cjs/es6/persisters/persister-sqlite3/with-schemas/index.cjs +8 -4
  71. package/cjs/es6/persisters/persister-yjs/index.cjs +5 -3
  72. package/cjs/es6/persisters/persister-yjs/with-schemas/index.cjs +5 -3
  73. package/cjs/es6/persisters/with-schemas/index.cjs +5 -3
  74. package/cjs/es6/relationships/index.cjs +15 -13
  75. package/cjs/es6/relationships/with-schemas/index.cjs +15 -13
  76. package/cjs/es6/store/index.cjs +23 -17
  77. package/cjs/es6/store/with-schemas/index.cjs +23 -17
  78. package/cjs/es6/synchronizers/index.cjs +5 -3
  79. package/cjs/es6/synchronizers/synchronizer-broadcast-channel/index.cjs +5 -3
  80. package/cjs/es6/synchronizers/synchronizer-broadcast-channel/with-schemas/index.cjs +5 -3
  81. package/cjs/es6/synchronizers/synchronizer-local/index.cjs +5 -3
  82. package/cjs/es6/synchronizers/synchronizer-local/with-schemas/index.cjs +5 -3
  83. package/cjs/es6/synchronizers/synchronizer-ws-client/index.cjs +8 -6
  84. package/cjs/es6/synchronizers/synchronizer-ws-client/with-schemas/index.cjs +8 -6
  85. package/cjs/es6/synchronizers/synchronizer-ws-server/index.cjs +39 -33
  86. package/cjs/es6/synchronizers/synchronizer-ws-server/with-schemas/index.cjs +39 -33
  87. package/cjs/es6/synchronizers/with-schemas/index.cjs +5 -3
  88. package/cjs/es6/ui-react-inspector/index.cjs +30 -21
  89. package/cjs/es6/ui-react-inspector/with-schemas/index.cjs +30 -21
  90. package/cjs/es6/with-schemas/index.cjs +28 -20
  91. package/cjs/index.cjs +22 -12
  92. package/cjs/indexes/index.cjs +9 -7
  93. package/cjs/indexes/with-schemas/index.cjs +9 -7
  94. package/cjs/mergeable-store/index.cjs +17 -9
  95. package/cjs/mergeable-store/with-schemas/index.cjs +17 -9
  96. package/cjs/metrics/index.cjs +9 -7
  97. package/cjs/metrics/with-schemas/index.cjs +9 -7
  98. package/cjs/min/index.cjs +1 -1
  99. package/cjs/min/index.cjs.gz +0 -0
  100. package/cjs/min/mergeable-store/index.cjs +1 -1
  101. package/cjs/min/mergeable-store/index.cjs.gz +0 -0
  102. package/cjs/min/mergeable-store/with-schemas/index.cjs +1 -1
  103. package/cjs/min/mergeable-store/with-schemas/index.cjs.gz +0 -0
  104. package/cjs/min/persisters/persister-automerge/index.cjs +1 -1
  105. package/cjs/min/persisters/persister-automerge/index.cjs.gz +0 -0
  106. package/cjs/min/persisters/persister-automerge/with-schemas/index.cjs +1 -1
  107. package/cjs/min/persisters/persister-automerge/with-schemas/index.cjs.gz +0 -0
  108. package/cjs/min/store/index.cjs +1 -1
  109. package/cjs/min/store/index.cjs.gz +0 -0
  110. package/cjs/min/store/with-schemas/index.cjs +1 -1
  111. package/cjs/min/store/with-schemas/index.cjs.gz +0 -0
  112. package/cjs/min/tools/index.cjs +1 -1
  113. package/cjs/min/tools/index.cjs.gz +0 -0
  114. package/cjs/min/tools/with-schemas/index.cjs +1 -1
  115. package/cjs/min/tools/with-schemas/index.cjs.gz +0 -0
  116. package/cjs/min/ui-react-inspector/index.cjs +1 -1
  117. package/cjs/min/ui-react-inspector/index.cjs.gz +0 -0
  118. package/cjs/min/ui-react-inspector/with-schemas/index.cjs +1 -1
  119. package/cjs/min/ui-react-inspector/with-schemas/index.cjs.gz +0 -0
  120. package/cjs/min/with-schemas/index.cjs +1 -1
  121. package/cjs/min/with-schemas/index.cjs.gz +0 -0
  122. package/cjs/persisters/index.cjs +5 -3
  123. package/cjs/persisters/persister-automerge/index.cjs +7 -4
  124. package/cjs/persisters/persister-automerge/with-schemas/index.cjs +7 -4
  125. package/cjs/persisters/persister-browser/index.cjs +5 -3
  126. package/cjs/persisters/persister-browser/with-schemas/index.cjs +5 -3
  127. package/cjs/persisters/persister-cr-sqlite-wasm/index.cjs +8 -4
  128. package/cjs/persisters/persister-cr-sqlite-wasm/with-schemas/index.cjs +8 -4
  129. package/cjs/persisters/persister-electric-sql/index.cjs +8 -4
  130. package/cjs/persisters/persister-electric-sql/with-schemas/index.cjs +8 -4
  131. package/cjs/persisters/persister-expo-sqlite/index.cjs +8 -4
  132. package/cjs/persisters/persister-expo-sqlite/with-schemas/index.cjs +8 -4
  133. package/cjs/persisters/persister-file/index.cjs +5 -3
  134. package/cjs/persisters/persister-file/with-schemas/index.cjs +5 -3
  135. package/cjs/persisters/persister-indexed-db/index.cjs +5 -3
  136. package/cjs/persisters/persister-indexed-db/with-schemas/index.cjs +5 -3
  137. package/cjs/persisters/persister-libsql/index.cjs +8 -4
  138. package/cjs/persisters/persister-libsql/with-schemas/index.cjs +8 -4
  139. package/cjs/persisters/persister-partykit-client/index.cjs +5 -3
  140. package/cjs/persisters/persister-partykit-client/with-schemas/index.cjs +5 -3
  141. package/cjs/persisters/persister-partykit-server/index.cjs +36 -25
  142. package/cjs/persisters/persister-partykit-server/with-schemas/index.cjs +36 -25
  143. package/cjs/persisters/persister-powersync/index.cjs +8 -4
  144. package/cjs/persisters/persister-powersync/with-schemas/index.cjs +8 -4
  145. package/cjs/persisters/persister-remote/index.cjs +5 -3
  146. package/cjs/persisters/persister-remote/with-schemas/index.cjs +5 -3
  147. package/cjs/persisters/persister-sqlite-wasm/index.cjs +8 -4
  148. package/cjs/persisters/persister-sqlite-wasm/with-schemas/index.cjs +8 -4
  149. package/cjs/persisters/persister-sqlite3/index.cjs +8 -4
  150. package/cjs/persisters/persister-sqlite3/with-schemas/index.cjs +8 -4
  151. package/cjs/persisters/persister-yjs/index.cjs +5 -3
  152. package/cjs/persisters/persister-yjs/with-schemas/index.cjs +5 -3
  153. package/cjs/persisters/with-schemas/index.cjs +5 -3
  154. package/cjs/relationships/index.cjs +9 -7
  155. package/cjs/relationships/with-schemas/index.cjs +9 -7
  156. package/cjs/store/index.cjs +17 -9
  157. package/cjs/store/with-schemas/index.cjs +17 -9
  158. package/cjs/synchronizers/index.cjs +5 -3
  159. package/cjs/synchronizers/synchronizer-broadcast-channel/index.cjs +5 -3
  160. package/cjs/synchronizers/synchronizer-broadcast-channel/with-schemas/index.cjs +5 -3
  161. package/cjs/synchronizers/synchronizer-local/index.cjs +5 -3
  162. package/cjs/synchronizers/synchronizer-local/with-schemas/index.cjs +5 -3
  163. package/cjs/synchronizers/synchronizer-ws-client/index.cjs +8 -6
  164. package/cjs/synchronizers/synchronizer-ws-client/with-schemas/index.cjs +8 -6
  165. package/cjs/synchronizers/synchronizer-ws-server/index.cjs +28 -22
  166. package/cjs/synchronizers/synchronizer-ws-server/with-schemas/index.cjs +28 -22
  167. package/cjs/synchronizers/with-schemas/index.cjs +5 -3
  168. package/cjs/tools/index.cjs +1 -1
  169. package/cjs/tools/with-schemas/index.cjs +1 -1
  170. package/cjs/ui-react-inspector/index.cjs +24 -13
  171. package/cjs/ui-react-inspector/with-schemas/index.cjs +24 -13
  172. package/cjs/with-schemas/index.cjs +22 -12
  173. package/es6/checkpoints/index.js +15 -13
  174. package/es6/checkpoints/with-schemas/index.js +15 -13
  175. package/es6/index.js +28 -20
  176. package/es6/indexes/index.js +15 -13
  177. package/es6/indexes/with-schemas/index.js +15 -13
  178. package/es6/mergeable-store/index.js +23 -17
  179. package/es6/mergeable-store/with-schemas/index.js +23 -17
  180. package/es6/metrics/index.js +15 -13
  181. package/es6/metrics/with-schemas/index.js +15 -13
  182. package/es6/min/index.js +1 -1
  183. package/es6/min/index.js.gz +0 -0
  184. package/es6/min/mergeable-store/index.js +1 -1
  185. package/es6/min/mergeable-store/index.js.gz +0 -0
  186. package/es6/min/mergeable-store/with-schemas/index.js +1 -1
  187. package/es6/min/mergeable-store/with-schemas/index.js.gz +0 -0
  188. package/es6/min/persisters/persister-automerge/index.js +1 -1
  189. package/es6/min/persisters/persister-automerge/index.js.gz +0 -0
  190. package/es6/min/persisters/persister-automerge/with-schemas/index.js +1 -1
  191. package/es6/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
  192. package/es6/min/store/index.js +1 -1
  193. package/es6/min/store/index.js.gz +0 -0
  194. package/es6/min/store/with-schemas/index.js +1 -1
  195. package/es6/min/store/with-schemas/index.js.gz +0 -0
  196. package/es6/min/ui-react-inspector/index.js +1 -1
  197. package/es6/min/ui-react-inspector/index.js.gz +0 -0
  198. package/es6/min/ui-react-inspector/with-schemas/index.js +1 -1
  199. package/es6/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
  200. package/es6/min/with-schemas/index.js +1 -1
  201. package/es6/min/with-schemas/index.js.gz +0 -0
  202. package/es6/persisters/index.js +5 -3
  203. package/es6/persisters/persister-automerge/index.js +7 -4
  204. package/es6/persisters/persister-automerge/with-schemas/index.js +7 -4
  205. package/es6/persisters/persister-browser/index.js +5 -3
  206. package/es6/persisters/persister-browser/with-schemas/index.js +5 -3
  207. package/es6/persisters/persister-cr-sqlite-wasm/index.js +8 -4
  208. package/es6/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +8 -4
  209. package/es6/persisters/persister-electric-sql/index.js +8 -4
  210. package/es6/persisters/persister-electric-sql/with-schemas/index.js +8 -4
  211. package/es6/persisters/persister-expo-sqlite/index.js +8 -4
  212. package/es6/persisters/persister-expo-sqlite/with-schemas/index.js +8 -4
  213. package/es6/persisters/persister-file/index.js +5 -3
  214. package/es6/persisters/persister-file/with-schemas/index.js +5 -3
  215. package/es6/persisters/persister-indexed-db/index.js +5 -3
  216. package/es6/persisters/persister-indexed-db/with-schemas/index.js +5 -3
  217. package/es6/persisters/persister-libsql/index.js +8 -4
  218. package/es6/persisters/persister-libsql/with-schemas/index.js +8 -4
  219. package/es6/persisters/persister-partykit-client/index.js +5 -3
  220. package/es6/persisters/persister-partykit-client/with-schemas/index.js +5 -3
  221. package/es6/persisters/persister-partykit-server/index.js +36 -22
  222. package/es6/persisters/persister-partykit-server/with-schemas/index.js +36 -22
  223. package/es6/persisters/persister-powersync/index.js +8 -4
  224. package/es6/persisters/persister-powersync/with-schemas/index.js +8 -4
  225. package/es6/persisters/persister-remote/index.js +5 -3
  226. package/es6/persisters/persister-remote/with-schemas/index.js +5 -3
  227. package/es6/persisters/persister-sqlite-wasm/index.js +8 -4
  228. package/es6/persisters/persister-sqlite-wasm/with-schemas/index.js +8 -4
  229. package/es6/persisters/persister-sqlite3/index.js +8 -4
  230. package/es6/persisters/persister-sqlite3/with-schemas/index.js +8 -4
  231. package/es6/persisters/persister-yjs/index.js +5 -3
  232. package/es6/persisters/persister-yjs/with-schemas/index.js +5 -3
  233. package/es6/persisters/with-schemas/index.js +5 -3
  234. package/es6/relationships/index.js +15 -13
  235. package/es6/relationships/with-schemas/index.js +15 -13
  236. package/es6/store/index.js +23 -17
  237. package/es6/store/with-schemas/index.js +23 -17
  238. package/es6/synchronizers/index.js +5 -3
  239. package/es6/synchronizers/synchronizer-broadcast-channel/index.js +5 -3
  240. package/es6/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +5 -3
  241. package/es6/synchronizers/synchronizer-local/index.js +5 -3
  242. package/es6/synchronizers/synchronizer-local/with-schemas/index.js +5 -3
  243. package/es6/synchronizers/synchronizer-ws-client/index.js +8 -6
  244. package/es6/synchronizers/synchronizer-ws-client/with-schemas/index.js +8 -6
  245. package/es6/synchronizers/synchronizer-ws-server/index.js +39 -33
  246. package/es6/synchronizers/synchronizer-ws-server/with-schemas/index.js +39 -33
  247. package/es6/synchronizers/with-schemas/index.js +5 -3
  248. package/es6/ui-react-inspector/index.js +30 -21
  249. package/es6/ui-react-inspector/with-schemas/index.js +30 -21
  250. package/es6/with-schemas/index.js +28 -20
  251. package/index.js +22 -12
  252. package/indexes/index.js +9 -7
  253. package/indexes/with-schemas/index.js +9 -7
  254. package/mergeable-store/index.js +17 -9
  255. package/mergeable-store/with-schemas/index.js +17 -9
  256. package/metrics/index.js +9 -7
  257. package/metrics/with-schemas/index.js +9 -7
  258. package/min/index.js +1 -1
  259. package/min/index.js.gz +0 -0
  260. package/min/mergeable-store/index.js +1 -1
  261. package/min/mergeable-store/index.js.gz +0 -0
  262. package/min/mergeable-store/with-schemas/index.js +1 -1
  263. package/min/mergeable-store/with-schemas/index.js.gz +0 -0
  264. package/min/persisters/persister-automerge/index.js +1 -1
  265. package/min/persisters/persister-automerge/index.js.gz +0 -0
  266. package/min/persisters/persister-automerge/with-schemas/index.js +1 -1
  267. package/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
  268. package/min/store/index.js +1 -1
  269. package/min/store/index.js.gz +0 -0
  270. package/min/store/with-schemas/index.js +1 -1
  271. package/min/store/with-schemas/index.js.gz +0 -0
  272. package/min/tools/index.js +1 -1
  273. package/min/tools/index.js.gz +0 -0
  274. package/min/tools/with-schemas/index.js +1 -1
  275. package/min/tools/with-schemas/index.js.gz +0 -0
  276. package/min/ui-react-inspector/index.js +1 -1
  277. package/min/ui-react-inspector/index.js.gz +0 -0
  278. package/min/ui-react-inspector/with-schemas/index.js +1 -1
  279. package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
  280. package/min/with-schemas/index.js +1 -1
  281. package/min/with-schemas/index.js.gz +0 -0
  282. package/package.json +3 -3
  283. package/persisters/index.js +5 -3
  284. package/persisters/persister-automerge/index.js +7 -4
  285. package/persisters/persister-automerge/with-schemas/index.js +7 -4
  286. package/persisters/persister-browser/index.js +5 -3
  287. package/persisters/persister-browser/with-schemas/index.js +5 -3
  288. package/persisters/persister-cr-sqlite-wasm/index.js +8 -4
  289. package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +8 -4
  290. package/persisters/persister-electric-sql/index.js +8 -4
  291. package/persisters/persister-electric-sql/with-schemas/index.js +8 -4
  292. package/persisters/persister-expo-sqlite/index.js +8 -4
  293. package/persisters/persister-expo-sqlite/with-schemas/index.js +8 -4
  294. package/persisters/persister-file/index.js +5 -3
  295. package/persisters/persister-file/with-schemas/index.js +5 -3
  296. package/persisters/persister-indexed-db/index.js +5 -3
  297. package/persisters/persister-indexed-db/with-schemas/index.js +5 -3
  298. package/persisters/persister-libsql/index.js +8 -4
  299. package/persisters/persister-libsql/with-schemas/index.js +8 -4
  300. package/persisters/persister-partykit-client/index.js +5 -3
  301. package/persisters/persister-partykit-client/with-schemas/index.js +5 -3
  302. package/persisters/persister-partykit-server/index.js +36 -25
  303. package/persisters/persister-partykit-server/with-schemas/index.js +36 -25
  304. package/persisters/persister-powersync/index.js +8 -4
  305. package/persisters/persister-powersync/with-schemas/index.js +8 -4
  306. package/persisters/persister-remote/index.js +5 -3
  307. package/persisters/persister-remote/with-schemas/index.js +5 -3
  308. package/persisters/persister-sqlite-wasm/index.js +8 -4
  309. package/persisters/persister-sqlite-wasm/with-schemas/index.js +8 -4
  310. package/persisters/persister-sqlite3/index.js +8 -4
  311. package/persisters/persister-sqlite3/with-schemas/index.js +8 -4
  312. package/persisters/persister-yjs/index.js +5 -3
  313. package/persisters/persister-yjs/with-schemas/index.js +5 -3
  314. package/persisters/with-schemas/index.js +5 -3
  315. package/readme.md +2 -2
  316. package/relationships/index.js +9 -7
  317. package/relationships/with-schemas/index.js +9 -7
  318. package/store/index.js +17 -9
  319. package/store/with-schemas/index.js +17 -9
  320. package/synchronizers/index.js +5 -3
  321. package/synchronizers/synchronizer-broadcast-channel/index.js +5 -3
  322. package/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +5 -3
  323. package/synchronizers/synchronizer-local/index.js +5 -3
  324. package/synchronizers/synchronizer-local/with-schemas/index.js +5 -3
  325. package/synchronizers/synchronizer-ws-client/index.js +8 -6
  326. package/synchronizers/synchronizer-ws-client/with-schemas/index.js +8 -6
  327. package/synchronizers/synchronizer-ws-server/index.js +28 -22
  328. package/synchronizers/synchronizer-ws-server/with-schemas/index.js +28 -22
  329. package/synchronizers/with-schemas/index.js +5 -3
  330. package/tools/index.js +1 -1
  331. package/tools/with-schemas/index.js +1 -1
  332. package/ui-react-inspector/index.js +24 -13
  333. package/ui-react-inspector/with-schemas/index.js +24 -13
  334. package/umd/checkpoints/index.js +9 -7
  335. package/umd/checkpoints/with-schemas/index.js +9 -7
  336. package/umd/es6/checkpoints/index.js +15 -13
  337. package/umd/es6/checkpoints/with-schemas/index.js +15 -13
  338. package/umd/es6/index.js +28 -20
  339. package/umd/es6/indexes/index.js +15 -13
  340. package/umd/es6/indexes/with-schemas/index.js +15 -13
  341. package/umd/es6/mergeable-store/index.js +23 -17
  342. package/umd/es6/mergeable-store/with-schemas/index.js +23 -17
  343. package/umd/es6/metrics/index.js +15 -13
  344. package/umd/es6/metrics/with-schemas/index.js +15 -13
  345. package/umd/es6/min/index.js +1 -1
  346. package/umd/es6/min/index.js.gz +0 -0
  347. package/umd/es6/min/mergeable-store/index.js +1 -1
  348. package/umd/es6/min/mergeable-store/index.js.gz +0 -0
  349. package/umd/es6/min/mergeable-store/with-schemas/index.js +1 -1
  350. package/umd/es6/min/mergeable-store/with-schemas/index.js.gz +0 -0
  351. package/umd/es6/min/persisters/persister-automerge/index.js +1 -1
  352. package/umd/es6/min/persisters/persister-automerge/index.js.gz +0 -0
  353. package/umd/es6/min/persisters/persister-automerge/with-schemas/index.js +1 -1
  354. package/umd/es6/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
  355. package/umd/es6/min/store/index.js +1 -1
  356. package/umd/es6/min/store/index.js.gz +0 -0
  357. package/umd/es6/min/store/with-schemas/index.js +1 -1
  358. package/umd/es6/min/store/with-schemas/index.js.gz +0 -0
  359. package/umd/es6/min/ui-react-inspector/index.js +1 -1
  360. package/umd/es6/min/ui-react-inspector/index.js.gz +0 -0
  361. package/umd/es6/min/ui-react-inspector/with-schemas/index.js +1 -1
  362. package/umd/es6/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
  363. package/umd/es6/min/with-schemas/index.js +1 -1
  364. package/umd/es6/min/with-schemas/index.js.gz +0 -0
  365. package/umd/es6/persisters/index.js +5 -3
  366. package/umd/es6/persisters/persister-automerge/index.js +7 -4
  367. package/umd/es6/persisters/persister-automerge/with-schemas/index.js +7 -4
  368. package/umd/es6/persisters/persister-browser/index.js +5 -3
  369. package/umd/es6/persisters/persister-browser/with-schemas/index.js +5 -3
  370. package/umd/es6/persisters/persister-cr-sqlite-wasm/index.js +8 -4
  371. package/umd/es6/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +8 -4
  372. package/umd/es6/persisters/persister-electric-sql/index.js +8 -4
  373. package/umd/es6/persisters/persister-electric-sql/with-schemas/index.js +8 -4
  374. package/umd/es6/persisters/persister-expo-sqlite/index.js +8 -4
  375. package/umd/es6/persisters/persister-expo-sqlite/with-schemas/index.js +8 -4
  376. package/umd/es6/persisters/persister-file/index.js +5 -3
  377. package/umd/es6/persisters/persister-file/with-schemas/index.js +5 -3
  378. package/umd/es6/persisters/persister-indexed-db/index.js +5 -3
  379. package/umd/es6/persisters/persister-indexed-db/with-schemas/index.js +5 -3
  380. package/umd/es6/persisters/persister-libsql/index.js +8 -4
  381. package/umd/es6/persisters/persister-libsql/with-schemas/index.js +8 -4
  382. package/umd/es6/persisters/persister-partykit-client/index.js +5 -3
  383. package/umd/es6/persisters/persister-partykit-client/with-schemas/index.js +5 -3
  384. package/umd/es6/persisters/persister-partykit-server/index.js +36 -22
  385. package/umd/es6/persisters/persister-partykit-server/with-schemas/index.js +36 -22
  386. package/umd/es6/persisters/persister-powersync/index.js +8 -4
  387. package/umd/es6/persisters/persister-powersync/with-schemas/index.js +8 -4
  388. package/umd/es6/persisters/persister-remote/index.js +5 -3
  389. package/umd/es6/persisters/persister-remote/with-schemas/index.js +5 -3
  390. package/umd/es6/persisters/persister-sqlite-wasm/index.js +8 -4
  391. package/umd/es6/persisters/persister-sqlite-wasm/with-schemas/index.js +8 -4
  392. package/umd/es6/persisters/persister-sqlite3/index.js +8 -4
  393. package/umd/es6/persisters/persister-sqlite3/with-schemas/index.js +8 -4
  394. package/umd/es6/persisters/persister-yjs/index.js +5 -3
  395. package/umd/es6/persisters/persister-yjs/with-schemas/index.js +5 -3
  396. package/umd/es6/persisters/with-schemas/index.js +5 -3
  397. package/umd/es6/relationships/index.js +15 -13
  398. package/umd/es6/relationships/with-schemas/index.js +15 -13
  399. package/umd/es6/store/index.js +23 -17
  400. package/umd/es6/store/with-schemas/index.js +23 -17
  401. package/umd/es6/synchronizers/index.js +5 -3
  402. package/umd/es6/synchronizers/synchronizer-broadcast-channel/index.js +5 -3
  403. package/umd/es6/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +5 -3
  404. package/umd/es6/synchronizers/synchronizer-local/index.js +5 -3
  405. package/umd/es6/synchronizers/synchronizer-local/with-schemas/index.js +5 -3
  406. package/umd/es6/synchronizers/synchronizer-ws-client/index.js +8 -6
  407. package/umd/es6/synchronizers/synchronizer-ws-client/with-schemas/index.js +8 -6
  408. package/umd/es6/synchronizers/synchronizer-ws-server/index.js +39 -33
  409. package/umd/es6/synchronizers/synchronizer-ws-server/with-schemas/index.js +39 -33
  410. package/umd/es6/synchronizers/with-schemas/index.js +5 -3
  411. package/umd/es6/ui-react-inspector/index.js +30 -21
  412. package/umd/es6/ui-react-inspector/with-schemas/index.js +30 -21
  413. package/umd/es6/with-schemas/index.js +28 -20
  414. package/umd/index.js +22 -12
  415. package/umd/indexes/index.js +9 -7
  416. package/umd/indexes/with-schemas/index.js +9 -7
  417. package/umd/mergeable-store/index.js +17 -9
  418. package/umd/mergeable-store/with-schemas/index.js +17 -9
  419. package/umd/metrics/index.js +9 -7
  420. package/umd/metrics/with-schemas/index.js +9 -7
  421. package/umd/min/index.js +1 -1
  422. package/umd/min/index.js.gz +0 -0
  423. package/umd/min/mergeable-store/index.js +1 -1
  424. package/umd/min/mergeable-store/index.js.gz +0 -0
  425. package/umd/min/mergeable-store/with-schemas/index.js +1 -1
  426. package/umd/min/mergeable-store/with-schemas/index.js.gz +0 -0
  427. package/umd/min/persisters/persister-automerge/index.js +1 -1
  428. package/umd/min/persisters/persister-automerge/index.js.gz +0 -0
  429. package/umd/min/persisters/persister-automerge/with-schemas/index.js +1 -1
  430. package/umd/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
  431. package/umd/min/store/index.js +1 -1
  432. package/umd/min/store/index.js.gz +0 -0
  433. package/umd/min/store/with-schemas/index.js +1 -1
  434. package/umd/min/store/with-schemas/index.js.gz +0 -0
  435. package/umd/min/tools/index.js +1 -1
  436. package/umd/min/tools/index.js.gz +0 -0
  437. package/umd/min/tools/with-schemas/index.js +1 -1
  438. package/umd/min/tools/with-schemas/index.js.gz +0 -0
  439. package/umd/min/ui-react-inspector/index.js +1 -1
  440. package/umd/min/ui-react-inspector/index.js.gz +0 -0
  441. package/umd/min/ui-react-inspector/with-schemas/index.js +1 -1
  442. package/umd/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
  443. package/umd/min/with-schemas/index.js +1 -1
  444. package/umd/min/with-schemas/index.js.gz +0 -0
  445. package/umd/persisters/index.js +5 -3
  446. package/umd/persisters/persister-automerge/index.js +7 -4
  447. package/umd/persisters/persister-automerge/with-schemas/index.js +7 -4
  448. package/umd/persisters/persister-browser/index.js +5 -3
  449. package/umd/persisters/persister-browser/with-schemas/index.js +5 -3
  450. package/umd/persisters/persister-cr-sqlite-wasm/index.js +8 -4
  451. package/umd/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +8 -4
  452. package/umd/persisters/persister-electric-sql/index.js +8 -4
  453. package/umd/persisters/persister-electric-sql/with-schemas/index.js +8 -4
  454. package/umd/persisters/persister-expo-sqlite/index.js +8 -4
  455. package/umd/persisters/persister-expo-sqlite/with-schemas/index.js +8 -4
  456. package/umd/persisters/persister-file/index.js +5 -3
  457. package/umd/persisters/persister-file/with-schemas/index.js +5 -3
  458. package/umd/persisters/persister-indexed-db/index.js +5 -3
  459. package/umd/persisters/persister-indexed-db/with-schemas/index.js +5 -3
  460. package/umd/persisters/persister-libsql/index.js +8 -4
  461. package/umd/persisters/persister-libsql/with-schemas/index.js +8 -4
  462. package/umd/persisters/persister-partykit-client/index.js +5 -3
  463. package/umd/persisters/persister-partykit-client/with-schemas/index.js +5 -3
  464. package/umd/persisters/persister-partykit-server/index.js +36 -25
  465. package/umd/persisters/persister-partykit-server/with-schemas/index.js +36 -25
  466. package/umd/persisters/persister-powersync/index.js +8 -4
  467. package/umd/persisters/persister-powersync/with-schemas/index.js +8 -4
  468. package/umd/persisters/persister-remote/index.js +5 -3
  469. package/umd/persisters/persister-remote/with-schemas/index.js +5 -3
  470. package/umd/persisters/persister-sqlite-wasm/index.js +8 -4
  471. package/umd/persisters/persister-sqlite-wasm/with-schemas/index.js +8 -4
  472. package/umd/persisters/persister-sqlite3/index.js +8 -4
  473. package/umd/persisters/persister-sqlite3/with-schemas/index.js +8 -4
  474. package/umd/persisters/persister-yjs/index.js +5 -3
  475. package/umd/persisters/persister-yjs/with-schemas/index.js +5 -3
  476. package/umd/persisters/with-schemas/index.js +5 -3
  477. package/umd/relationships/index.js +9 -7
  478. package/umd/relationships/with-schemas/index.js +9 -7
  479. package/umd/store/index.js +17 -9
  480. package/umd/store/with-schemas/index.js +17 -9
  481. package/umd/synchronizers/index.js +5 -3
  482. package/umd/synchronizers/synchronizer-broadcast-channel/index.js +5 -3
  483. package/umd/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +5 -3
  484. package/umd/synchronizers/synchronizer-local/index.js +5 -3
  485. package/umd/synchronizers/synchronizer-local/with-schemas/index.js +5 -3
  486. package/umd/synchronizers/synchronizer-ws-client/index.js +8 -6
  487. package/umd/synchronizers/synchronizer-ws-client/with-schemas/index.js +8 -6
  488. package/umd/synchronizers/synchronizer-ws-server/index.js +28 -22
  489. package/umd/synchronizers/synchronizer-ws-server/with-schemas/index.js +28 -22
  490. package/umd/synchronizers/with-schemas/index.js +5 -3
  491. package/umd/tools/index.js +1 -1
  492. package/umd/tools/with-schemas/index.js +1 -1
  493. package/umd/ui-react-inspector/index.js +24 -13
  494. package/umd/ui-react-inspector/with-schemas/index.js +24 -13
  495. package/umd/with-schemas/index.js +22 -12
  496. package/with-schemas/index.js +22 -12
@@ -8,7 +8,9 @@ const strRepeat = (str, count) => str.repeat(count);
8
8
 
9
9
  const promise = Promise;
10
10
  const startInterval = (callback, sec, immediate) => {
11
- callback();
11
+ {
12
+ callback();
13
+ }
12
14
  return setInterval(callback, sec * 1e3);
13
15
  };
14
16
  const stopInterval = clearInterval;
@@ -471,9 +473,11 @@ const createCustomPersister = (
471
473
  await schedule(async () => {
472
474
  try {
473
475
  const content = await getPersisted();
474
- isArray(content)
475
- ? setContentOrChanges(content)
476
- : errorNew(`Content is not an array ${content}`);
476
+ if (isArray(content)) {
477
+ setContentOrChanges(content);
478
+ } else {
479
+ errorNew(`Content is not an array ${content}`);
480
+ }
477
481
  } catch (error) {
478
482
  onIgnoredError?.(error);
479
483
  if (initialContent) {
@@ -148,9 +148,11 @@ const createCustomPersister = (
148
148
  await schedule(async () => {
149
149
  try {
150
150
  const content = await getPersisted();
151
- isArray(content)
152
- ? setContentOrChanges(content)
153
- : errorNew(`Content is not an array ${content}`);
151
+ if (isArray(content)) {
152
+ setContentOrChanges(content);
153
+ } else {
154
+ errorNew(`Content is not an array ${content}`);
155
+ }
154
156
  } catch (error) {
155
157
  onIgnoredError?.(error);
156
158
  if (initialContent) {
@@ -148,9 +148,11 @@ const createCustomPersister = (
148
148
  await schedule(async () => {
149
149
  try {
150
150
  const content = await getPersisted();
151
- isArray(content)
152
- ? setContentOrChanges(content)
153
- : errorNew(`Content is not an array ${content}`);
151
+ if (isArray(content)) {
152
+ setContentOrChanges(content);
153
+ } else {
154
+ errorNew(`Content is not an array ${content}`);
155
+ }
154
156
  } catch (error) {
155
157
  onIgnoredError?.(error);
156
158
  if (initialContent) {
@@ -130,9 +130,11 @@ const createCustomPersister = (
130
130
  await schedule(async () => {
131
131
  try {
132
132
  const content = await getPersisted();
133
- isArray(content)
134
- ? setContentOrChanges(content)
135
- : errorNew(`Content is not an array ${content}`);
133
+ if (isArray(content)) {
134
+ setContentOrChanges(content);
135
+ } else {
136
+ errorNew(`Content is not an array ${content}`);
137
+ }
136
138
  } catch (error) {
137
139
  onIgnoredError?.(error);
138
140
  if (initialContent) {
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-1"><em>NEW!</em> v5.1 release</a></p><p><span id="one-with">&quot;The One You Can Sync... with a server!&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, but you can easily <a href="#persist-to-storage-sqlite-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 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 - 12.7kB</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 width="48" src="https://tinybase.org/react.svg"> React</a></div><div><a href="https://tinybase.org/api/persister-partykit-client"><img width="48" src="https://tinybase.org/partykit.svg"> PartyKit</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img width="48" src="https://tinybase.org/expo.svg">Expo SQLite</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img width="48" src="https://tinybase.org/electric.svg">ElectricSQL</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img width="48" src="https://tinybase.org/sqlite.svg"> SQLite</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img width="48" src="https://tinybase.org/turso.svg">Turso</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img width="48" src="https://tinybase.org/powersync.svg">PowerSync</a></div><div><a href="https://tinybase.org/api/persister-indexed-db/functions/creation/createindexeddbpersister"><img width="48" src="https://tinybase.org/indexeddb.svg"> IndexedDB</a></div><div><a href="https://tinybase.org/api/persister-yjs/functions/creation/createyjspersister"><img width="48" src="https://tinybase.org/yjs.svg"> YJS</a></div><div><a href="https://tinybase.org/api/persister-cr-sqlite-wasm"><img width="48" src="https://tinybase.org/crsqlite.png"> CR-SQLite</a></div><div><a href="https://tinybase.org/api/persister-automerge"><img width="48" src="https://tinybase.org/automerge.svg"> Automerge</a></div></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://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><a href="https://twitter.com/tinybasejs" target="_blank"><img src="https://img.shields.io/twitter/follow/tinybasejs?style=for-the-badge&amp;logo=x&amp;logoColor=%23fff&amp;label=Twitter&amp;labelColor=%23333&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.1.2" 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-1"><em>NEW!</em> v5.1 release</a></p><p><span id="one-with">&quot;The One You Can Sync... with a server!&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, but you can easily <a href="#persist-to-storage-sqlite-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 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 - 12.7kB</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 width="48" src="https://tinybase.org/react.svg"> React</a></div><div><a href="https://tinybase.org/api/persister-partykit-client"><img width="48" src="https://tinybase.org/partykit.svg"> PartyKit</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img width="48" src="https://tinybase.org/expo.svg">Expo SQLite</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img width="48" src="https://tinybase.org/electric.svg">ElectricSQL</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img width="48" src="https://tinybase.org/sqlite.svg"> SQLite</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img width="48" src="https://tinybase.org/turso.svg">Turso</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img width="48" src="https://tinybase.org/powersync.svg">PowerSync</a></div><div><a href="https://tinybase.org/api/persister-indexed-db/functions/creation/createindexeddbpersister"><img width="48" src="https://tinybase.org/indexeddb.svg"> IndexedDB</a></div><div><a href="https://tinybase.org/api/persister-yjs/functions/creation/createyjspersister"><img width="48" src="https://tinybase.org/yjs.svg"> YJS</a></div><div><a href="https://tinybase.org/api/persister-cr-sqlite-wasm"><img width="48" src="https://tinybase.org/crsqlite.png"> CR-SQLite</a></div><div><a href="https://tinybase.org/api/persister-automerge"><img width="48" src="https://tinybase.org/automerge.svg"> Automerge</a></div></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://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><a href="https://twitter.com/tinybasejs" target="_blank"><img src="https://img.shields.io/twitter/follow/tinybasejs?style=for-the-badge&amp;logo=x&amp;logoColor=%23fff&amp;label=Twitter&amp;labelColor=%23333&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.1.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';
@@ -292,4 +292,4 @@ export const createShop: typeof createShopDecl = () => {
292
292
  };
293
293
  ```
294
294
 
295
- <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>12.7kB</em>.</p><p>The optional <a href="https://tinybase.org/api/ui-react/"><code>ui-react</code></a> module is just <em>4.6kB</em>, the ui-react-dom components are another <em>2.5kB</em>, and everything is super fast. Life&#x27;s 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>12.7kB</td><td>130.8kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/ui-react/">ui-react</a></th><td>4.6kB</td><td>48.3kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/ui-react-dom/">ui-react-dom</a></th><td>2.5kB</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,380</td><td>2,380</td><td>100.0%</td></tr><tr><th class="right">Statements</th><td>2,567</td><td>2,567</td><td>100.0%</td></tr><tr><th class="right">Functions</th><td>1,006</td><td>1,006</td><td>100.0%</td></tr><tr><th class="right">Branches</th><td>951</td><td>951</td><td>100.0%</td></tr><tr><th class="right">Tests</th><td colspan="3">6,851</td></tr><tr><th class="right">Assertions</th><td colspan="3">32,075</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 title="cpojer" src="https://github.com/cpojer.png?size=48" width="48" height="48"></a><a href="https://github.com/expo" target="_blank"><img title="expo" src="https://github.com/expo.png?size=48" width="48" height="48"></a><a href="https://github.com/beekeeb" target="_blank"><img title="beekeeb" src="https://github.com/beekeeb.png?size=48" width="48" height="48"></a><a href="https://github.com/cancelself" target="_blank"><img title="cancelself" src="https://github.com/cancelself.png?size=48" width="48" height="48"></a><a href="https://github.com/WonderPanda" target="_blank"><img title="WonderPanda" src="https://github.com/WonderPanda.png?size=48" width="48" height="48"></a><a href="https://github.com/arpitBhalla" target="_blank"><img title="arpitBhalla" src="https://github.com/arpitBhalla.png?size=48" 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/Apocalypsor" target="_blank"><img title="Apocalypsor" src="https://github.com/Apocalypsor.png?size=48" width="48" height="48"></a><a href="https://github.com/brentvatne" target="_blank"><img title="brentvatne" src="https://github.com/brentvatne.png?size=48" width="48" height="48"></a><a href="https://github.com/byCedric" target="_blank"><img title="byCedric" src="https://github.com/byCedric.png?size=48" width="48" height="48"></a><a href="https://github.com/circadian-risk" target="_blank"><img title="circadian-risk" src="https://github.com/circadian-risk.png?size=48" width="48" height="48"></a><a href="https://github.com/cpojer" target="_blank"><img title="cpojer" src="https://github.com/cpojer.png?size=48" width="48" height="48"></a><a href="https://github.com/cubecull" target="_blank"><img title="cubecull" src="https://github.com/cubecull.png?size=48" width="48" height="48"></a><a href="https://github.com/erwinkn" target="_blank"><img title="erwinkn" src="https://github.com/erwinkn.png?size=48" width="48" height="48"></a><a href="https://github.com/expo" target="_blank"><img title="expo" src="https://github.com/expo.png?size=48" width="48" height="48"></a><a href="https://github.com/ezra-en" target="_blank"><img title="ezra-en" src="https://github.com/ezra-en.png?size=48" width="48" height="48"></a><a href="https://github.com/fdfontes" target="_blank"><img title="fdfontes" src="https://github.com/fdfontes.png?size=48" width="48" height="48"></a><a href="https://github.com/feychenie" target="_blank"><img title="feychenie" src="https://github.com/feychenie.png?size=48" width="48" height="48"></a><a href="https://github.com/flaming-codes" target="_blank"><img title="flaming-codes" src="https://github.com/flaming-codes.png?size=48" width="48" height="48"></a><a href="https://github.com/fostertheweb" target="_blank"><img title="fostertheweb" src="https://github.com/fostertheweb.png?size=48" width="48" height="48"></a><a href="https://github.com/generates" target="_blank"><img title="generates" src="https://github.com/generates.png?size=48" width="48" height="48"></a><a href="https://github.com/Giulio987" target="_blank"><img title="Giulio987" src="https://github.com/Giulio987.png?size=48" width="48" height="48"></a><a href="https://github.com/itsdevcoffee" target="_blank"><img title="itsdevcoffee" src="https://github.com/itsdevcoffee.png?size=48" width="48" height="48"></a><a href="https://github.com/jaysc" target="_blank"><img title="jaysc" src="https://github.com/jaysc.png?size=48" width="48" height="48"></a><a href="https://github.com/jbolda" target="_blank"><img title="jbolda" src="https://github.com/jbolda.png?size=48" width="48" height="48"></a><a href="https://github.com/Kayoo-asso" target="_blank"><img title="Kayoo-asso" src="https://github.com/Kayoo-asso.png?size=48" width="48" height="48"></a><a href="https://github.com/kotofurumiya" target="_blank"><img title="kotofurumiya" src="https://github.com/kotofurumiya.png?size=48" width="48" height="48"></a><a href="https://github.com/Kudo" target="_blank"><img title="Kudo" src="https://github.com/Kudo.png?size=48" width="48" height="48"></a><a href="https://github.com/learn-anything" target="_blank"><img title="learn-anything" src="https://github.com/learn-anything.png?size=48" width="48" height="48"></a><a href="https://github.com/lluc" target="_blank"><img title="lluc" src="https://github.com/lluc.png?size=48" width="48" height="48"></a><a href="https://github.com/marksteve" target="_blank"><img title="marksteve" src="https://github.com/marksteve.png?size=48" width="48" height="48"></a><a href="https://github.com/miking-the-viking" target="_blank"><img title="miking-the-viking" src="https://github.com/miking-the-viking.png?size=48" width="48" height="48"></a><a href="https://github.com/mjamesderocher" target="_blank"><img title="mjamesderocher" src="https://github.com/mjamesderocher.png?size=48" width="48" height="48"></a><a href="https://github.com/mouktardev" target="_blank"><img title="mouktardev" src="https://github.com/mouktardev.png?size=48" width="48" height="48"></a><a href="https://github.com/nickmessing" target="_blank"><img title="nickmessing" src="https://github.com/nickmessing.png?size=48" width="48" height="48"></a><a href="https://github.com/nikitavoloboev" target="_blank"><img title="nikitavoloboev" src="https://github.com/nikitavoloboev.png?size=48" width="48" height="48"></a><a href="https://github.com/nkzw-tech" target="_blank"><img title="nkzw-tech" src="https://github.com/nkzw-tech.png?size=48" width="48" height="48"></a><a href="https://github.com/palerdot" target="_blank"><img title="palerdot" src="https://github.com/palerdot.png?size=48" width="48" height="48"></a><a href="https://github.com/PorcoRosso85" target="_blank"><img title="PorcoRosso85" src="https://github.com/PorcoRosso85.png?size=48" width="48" height="48"></a><a href="https://github.com/primodiumxyz" target="_blank"><img title="primodiumxyz" src="https://github.com/primodiumxyz.png?size=48" width="48" height="48"></a><a href="https://github.com/shaneosullivan" target="_blank"><img title="shaneosullivan" src="https://github.com/shaneosullivan.png?size=48" width="48" height="48"></a><a href="https://github.com/sudo-self" target="_blank"><img title="sudo-self" src="https://github.com/sudo-self.png?size=48" width="48" height="48"></a><a href="https://github.com/SuperSonicHub1" target="_blank"><img title="SuperSonicHub1" src="https://github.com/SuperSonicHub1.png?size=48" width="48" height="48"></a><a href="https://github.com/threepointone" target="_blank"><img title="threepointone" src="https://github.com/threepointone.png?size=48" width="48" height="48"></a><a href="https://github.com/uptonking" target="_blank"><img title="uptonking" src="https://github.com/uptonking.png?size=48" width="48" height="48"></a><a href="https://github.com/ViktorZhurbin" target="_blank"><img title="ViktorZhurbin" src="https://github.com/ViktorZhurbin.png?size=48" width="48" height="48"></a><a href="https://github.com/WonderPanda" target="_blank"><img title="WonderPanda" src="https://github.com/WonderPanda.png?size=48" 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>
295
+ <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>12.7kB</em>.</p><p>The optional <a href="https://tinybase.org/api/ui-react/"><code>ui-react</code></a> module is just <em>4.6kB</em>, the ui-react-dom components are another <em>2.5kB</em>, and everything is super fast. Life&#x27;s 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>12.7kB</td><td>130.9kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/ui-react/">ui-react</a></th><td>4.6kB</td><td>48.3kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/ui-react-dom/">ui-react-dom</a></th><td>2.5kB</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,389</td><td>2,389</td><td>100.0%</td></tr><tr><th class="right">Statements</th><td>2,576</td><td>2,576</td><td>100.0%</td></tr><tr><th class="right">Functions</th><td>1,006</td><td>1,006</td><td>100.0%</td></tr><tr><th class="right">Branches</th><td>951</td><td>951</td><td>100.0%</td></tr><tr><th class="right">Tests</th><td colspan="3">6,853</td></tr><tr><th class="right">Assertions</th><td colspan="3">32,079</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 title="cpojer" src="https://github.com/cpojer.png?size=48" width="48" height="48"></a><a href="https://github.com/expo" target="_blank"><img title="expo" src="https://github.com/expo.png?size=48" width="48" height="48"></a><a href="https://github.com/beekeeb" target="_blank"><img title="beekeeb" src="https://github.com/beekeeb.png?size=48" width="48" height="48"></a><a href="https://github.com/cancelself" target="_blank"><img title="cancelself" src="https://github.com/cancelself.png?size=48" width="48" height="48"></a><a href="https://github.com/WonderPanda" target="_blank"><img title="WonderPanda" src="https://github.com/WonderPanda.png?size=48" width="48" height="48"></a><a href="https://github.com/arpitBhalla" target="_blank"><img title="arpitBhalla" src="https://github.com/arpitBhalla.png?size=48" 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/Apocalypsor" target="_blank"><img title="Apocalypsor" src="https://github.com/Apocalypsor.png?size=48" width="48" height="48"></a><a href="https://github.com/brentvatne" target="_blank"><img title="brentvatne" src="https://github.com/brentvatne.png?size=48" width="48" height="48"></a><a href="https://github.com/byCedric" target="_blank"><img title="byCedric" src="https://github.com/byCedric.png?size=48" width="48" height="48"></a><a href="https://github.com/circadian-risk" target="_blank"><img title="circadian-risk" src="https://github.com/circadian-risk.png?size=48" width="48" height="48"></a><a href="https://github.com/cpojer" target="_blank"><img title="cpojer" src="https://github.com/cpojer.png?size=48" width="48" height="48"></a><a href="https://github.com/cubecull" target="_blank"><img title="cubecull" src="https://github.com/cubecull.png?size=48" width="48" height="48"></a><a href="https://github.com/erwinkn" target="_blank"><img title="erwinkn" src="https://github.com/erwinkn.png?size=48" width="48" height="48"></a><a href="https://github.com/expo" target="_blank"><img title="expo" src="https://github.com/expo.png?size=48" width="48" height="48"></a><a href="https://github.com/ezra-en" target="_blank"><img title="ezra-en" src="https://github.com/ezra-en.png?size=48" width="48" height="48"></a><a href="https://github.com/fdfontes" target="_blank"><img title="fdfontes" src="https://github.com/fdfontes.png?size=48" width="48" height="48"></a><a href="https://github.com/feychenie" target="_blank"><img title="feychenie" src="https://github.com/feychenie.png?size=48" width="48" height="48"></a><a href="https://github.com/flaming-codes" target="_blank"><img title="flaming-codes" src="https://github.com/flaming-codes.png?size=48" width="48" height="48"></a><a href="https://github.com/fostertheweb" target="_blank"><img title="fostertheweb" src="https://github.com/fostertheweb.png?size=48" width="48" height="48"></a><a href="https://github.com/generates" target="_blank"><img title="generates" src="https://github.com/generates.png?size=48" width="48" height="48"></a><a href="https://github.com/Giulio987" target="_blank"><img title="Giulio987" src="https://github.com/Giulio987.png?size=48" width="48" height="48"></a><a href="https://github.com/itsdevcoffee" target="_blank"><img title="itsdevcoffee" src="https://github.com/itsdevcoffee.png?size=48" width="48" height="48"></a><a href="https://github.com/jaysc" target="_blank"><img title="jaysc" src="https://github.com/jaysc.png?size=48" width="48" height="48"></a><a href="https://github.com/jbolda" target="_blank"><img title="jbolda" src="https://github.com/jbolda.png?size=48" width="48" height="48"></a><a href="https://github.com/Kayoo-asso" target="_blank"><img title="Kayoo-asso" src="https://github.com/Kayoo-asso.png?size=48" width="48" height="48"></a><a href="https://github.com/kotofurumiya" target="_blank"><img title="kotofurumiya" src="https://github.com/kotofurumiya.png?size=48" width="48" height="48"></a><a href="https://github.com/Kudo" target="_blank"><img title="Kudo" src="https://github.com/Kudo.png?size=48" width="48" height="48"></a><a href="https://github.com/learn-anything" target="_blank"><img title="learn-anything" src="https://github.com/learn-anything.png?size=48" width="48" height="48"></a><a href="https://github.com/lluc" target="_blank"><img title="lluc" src="https://github.com/lluc.png?size=48" width="48" height="48"></a><a href="https://github.com/marksteve" target="_blank"><img title="marksteve" src="https://github.com/marksteve.png?size=48" width="48" height="48"></a><a href="https://github.com/miking-the-viking" target="_blank"><img title="miking-the-viking" src="https://github.com/miking-the-viking.png?size=48" width="48" height="48"></a><a href="https://github.com/mjamesderocher" target="_blank"><img title="mjamesderocher" src="https://github.com/mjamesderocher.png?size=48" width="48" height="48"></a><a href="https://github.com/mouktardev" target="_blank"><img title="mouktardev" src="https://github.com/mouktardev.png?size=48" width="48" height="48"></a><a href="https://github.com/nickmessing" target="_blank"><img title="nickmessing" src="https://github.com/nickmessing.png?size=48" width="48" height="48"></a><a href="https://github.com/nikitavoloboev" target="_blank"><img title="nikitavoloboev" src="https://github.com/nikitavoloboev.png?size=48" width="48" height="48"></a><a href="https://github.com/nkzw-tech" target="_blank"><img title="nkzw-tech" src="https://github.com/nkzw-tech.png?size=48" width="48" height="48"></a><a href="https://github.com/palerdot" target="_blank"><img title="palerdot" src="https://github.com/palerdot.png?size=48" width="48" height="48"></a><a href="https://github.com/PorcoRosso85" target="_blank"><img title="PorcoRosso85" src="https://github.com/PorcoRosso85.png?size=48" width="48" height="48"></a><a href="https://github.com/primodiumxyz" target="_blank"><img title="primodiumxyz" src="https://github.com/primodiumxyz.png?size=48" width="48" height="48"></a><a href="https://github.com/shaneosullivan" target="_blank"><img title="shaneosullivan" src="https://github.com/shaneosullivan.png?size=48" width="48" height="48"></a><a href="https://github.com/sudo-self" target="_blank"><img title="sudo-self" src="https://github.com/sudo-self.png?size=48" width="48" height="48"></a><a href="https://github.com/SuperSonicHub1" target="_blank"><img title="SuperSonicHub1" src="https://github.com/SuperSonicHub1.png?size=48" width="48" height="48"></a><a href="https://github.com/threepointone" target="_blank"><img title="threepointone" src="https://github.com/threepointone.png?size=48" width="48" height="48"></a><a href="https://github.com/uptonking" target="_blank"><img title="uptonking" src="https://github.com/uptonking.png?size=48" width="48" height="48"></a><a href="https://github.com/ViktorZhurbin" target="_blank"><img title="ViktorZhurbin" src="https://github.com/ViktorZhurbin.png?size=48" width="48" height="48"></a><a href="https://github.com/WonderPanda" target="_blank"><img title="WonderPanda" src="https://github.com/WonderPanda.png?size=48" 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>
@@ -321,13 +321,15 @@ const getListenerFunctions = (getThing) => {
321
321
  ([listener, , path = [], pathGetters, extraArgsGetter]) => {
322
322
  const callWithIds = (...ids) => {
323
323
  const index = size(ids);
324
- index == size(path)
325
- ? listener(thing, ...ids, ...extraArgsGetter(ids))
326
- : isUndefined(path[index])
327
- ? arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
328
- callWithIds(...ids, id2),
329
- )
330
- : callWithIds(...ids, path[index]);
324
+ if (index == size(path)) {
325
+ listener(thing, ...ids, ...extraArgsGetter(ids));
326
+ } else if (isUndefined(path[index])) {
327
+ arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
328
+ callWithIds(...ids, id2),
329
+ );
330
+ } else {
331
+ callWithIds(...ids, path[index]);
332
+ }
331
333
  };
332
334
  callWithIds();
333
335
  },
@@ -321,13 +321,15 @@ const getListenerFunctions = (getThing) => {
321
321
  ([listener, , path = [], pathGetters, extraArgsGetter]) => {
322
322
  const callWithIds = (...ids) => {
323
323
  const index = size(ids);
324
- index == size(path)
325
- ? listener(thing, ...ids, ...extraArgsGetter(ids))
326
- : isUndefined(path[index])
327
- ? arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
328
- callWithIds(...ids, id2),
329
- )
330
- : callWithIds(...ids, path[index]);
324
+ if (index == size(path)) {
325
+ listener(thing, ...ids, ...extraArgsGetter(ids));
326
+ } else if (isUndefined(path[index])) {
327
+ arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
328
+ callWithIds(...ids, id2),
329
+ );
330
+ } else {
331
+ callWithIds(...ids, path[index]);
332
+ }
331
333
  };
332
334
  callWithIds();
333
335
  },
package/store/index.js CHANGED
@@ -131,7 +131,9 @@ const mapToObj = (map, valueMapper, excludeMapValue, excludeObjValue) => {
131
131
  collForEach(map, (mapValue, id) => {
132
132
  if (!excludeMapValue?.(mapValue, id)) {
133
133
  const objValue = valueMapper ? valueMapper(mapValue, id) : mapValue;
134
- excludeObjValue?.(objValue) ? 0 : (obj[id] = objValue);
134
+ if (!excludeObjValue?.(objValue)) {
135
+ obj[id] = objValue;
136
+ }
135
137
  }
136
138
  });
137
139
  return obj;
@@ -257,13 +259,15 @@ const getListenerFunctions = (getThing) => {
257
259
  ([listener, , path = [], pathGetters, extraArgsGetter]) => {
258
260
  const callWithIds = (...ids) => {
259
261
  const index = size(ids);
260
- index == size(path)
261
- ? listener(thing, ...ids, ...extraArgsGetter(ids))
262
- : isUndefined(path[index])
263
- ? arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
264
- callWithIds(...ids, id2),
265
- )
266
- : callWithIds(...ids, path[index]);
262
+ if (index == size(path)) {
263
+ listener(thing, ...ids, ...extraArgsGetter(ids));
264
+ } else if (isUndefined(path[index])) {
265
+ arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
266
+ callWithIds(...ids, id2),
267
+ );
268
+ } else {
269
+ callWithIds(...ids, path[index]);
270
+ }
267
271
  };
268
272
  callWithIds();
269
273
  },
@@ -634,7 +638,11 @@ const createStore = () => {
634
638
  cellIdsChanged(tableId, rowId, cellId2, -1);
635
639
  mapSet(row, cellId2);
636
640
  };
637
- isUndefined(defaultCell) ? delCell2(cellId) : mapForEach(row, delCell2);
641
+ if (isUndefined(defaultCell)) {
642
+ delCell2(cellId);
643
+ } else {
644
+ mapForEach(row, delCell2);
645
+ }
638
646
  if (collIsEmpty(row)) {
639
647
  rowIdsChanged(tableId, rowId, -1);
640
648
  if (collIsEmpty(mapSet(table, rowId))) {
@@ -131,7 +131,9 @@ const mapToObj = (map, valueMapper, excludeMapValue, excludeObjValue) => {
131
131
  collForEach(map, (mapValue, id) => {
132
132
  if (!excludeMapValue?.(mapValue, id)) {
133
133
  const objValue = valueMapper ? valueMapper(mapValue, id) : mapValue;
134
- excludeObjValue?.(objValue) ? 0 : (obj[id] = objValue);
134
+ if (!excludeObjValue?.(objValue)) {
135
+ obj[id] = objValue;
136
+ }
135
137
  }
136
138
  });
137
139
  return obj;
@@ -257,13 +259,15 @@ const getListenerFunctions = (getThing) => {
257
259
  ([listener, , path = [], pathGetters, extraArgsGetter]) => {
258
260
  const callWithIds = (...ids) => {
259
261
  const index = size(ids);
260
- index == size(path)
261
- ? listener(thing, ...ids, ...extraArgsGetter(ids))
262
- : isUndefined(path[index])
263
- ? arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
264
- callWithIds(...ids, id2),
265
- )
266
- : callWithIds(...ids, path[index]);
262
+ if (index == size(path)) {
263
+ listener(thing, ...ids, ...extraArgsGetter(ids));
264
+ } else if (isUndefined(path[index])) {
265
+ arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
266
+ callWithIds(...ids, id2),
267
+ );
268
+ } else {
269
+ callWithIds(...ids, path[index]);
270
+ }
267
271
  };
268
272
  callWithIds();
269
273
  },
@@ -634,7 +638,11 @@ const createStore = () => {
634
638
  cellIdsChanged(tableId, rowId, cellId2, -1);
635
639
  mapSet(row, cellId2);
636
640
  };
637
- isUndefined(defaultCell) ? delCell2(cellId) : mapForEach(row, delCell2);
641
+ if (isUndefined(defaultCell)) {
642
+ delCell2(cellId);
643
+ } else {
644
+ mapForEach(row, delCell2);
645
+ }
638
646
  if (collIsEmpty(row)) {
639
647
  rowIdsChanged(tableId, rowId, -1);
640
648
  if (collIsEmpty(mapSet(table, rowId))) {
@@ -153,9 +153,11 @@ const createCustomPersister = (
153
153
  await schedule(async () => {
154
154
  try {
155
155
  const content = await getPersisted();
156
- isArray(content)
157
- ? setContentOrChanges(content)
158
- : errorNew(`Content is not an array ${content}`);
156
+ if (isArray(content)) {
157
+ setContentOrChanges(content);
158
+ } else {
159
+ errorNew(`Content is not an array ${content}`);
160
+ }
159
161
  } catch (error) {
160
162
  onIgnoredError?.(error);
161
163
  if (initialContent) {
@@ -153,9 +153,11 @@ const createCustomPersister = (
153
153
  await schedule(async () => {
154
154
  try {
155
155
  const content = await getPersisted();
156
- isArray(content)
157
- ? setContentOrChanges(content)
158
- : errorNew(`Content is not an array ${content}`);
156
+ if (isArray(content)) {
157
+ setContentOrChanges(content);
158
+ } else {
159
+ errorNew(`Content is not an array ${content}`);
160
+ }
159
161
  } catch (error) {
160
162
  onIgnoredError?.(error);
161
163
  if (initialContent) {
@@ -153,9 +153,11 @@ const createCustomPersister = (
153
153
  await schedule(async () => {
154
154
  try {
155
155
  const content = await getPersisted();
156
- isArray(content)
157
- ? setContentOrChanges(content)
158
- : errorNew(`Content is not an array ${content}`);
156
+ if (isArray(content)) {
157
+ setContentOrChanges(content);
158
+ } else {
159
+ errorNew(`Content is not an array ${content}`);
160
+ }
159
161
  } catch (error) {
160
162
  onIgnoredError?.(error);
161
163
  if (initialContent) {
@@ -156,9 +156,11 @@ const createCustomPersister = (
156
156
  await schedule(async () => {
157
157
  try {
158
158
  const content = await getPersisted();
159
- isArray(content)
160
- ? setContentOrChanges(content)
161
- : errorNew(`Content is not an array ${content}`);
159
+ if (isArray(content)) {
160
+ setContentOrChanges(content);
161
+ } else {
162
+ errorNew(`Content is not an array ${content}`);
163
+ }
162
164
  } catch (error) {
163
165
  onIgnoredError?.(error);
164
166
  if (initialContent) {
@@ -156,9 +156,11 @@ const createCustomPersister = (
156
156
  await schedule(async () => {
157
157
  try {
158
158
  const content = await getPersisted();
159
- isArray(content)
160
- ? setContentOrChanges(content)
161
- : errorNew(`Content is not an array ${content}`);
159
+ if (isArray(content)) {
160
+ setContentOrChanges(content);
161
+ } else {
162
+ errorNew(`Content is not an array ${content}`);
163
+ }
162
164
  } catch (error) {
163
165
  onIgnoredError?.(error);
164
166
  if (initialContent) {
@@ -61,9 +61,9 @@ const jsonParseWithUndefined = (str) =>
61
61
  const MESSAGE_SEPARATOR = '\n';
62
62
  const ifPayloadValid = (payload, then) => {
63
63
  const splitAt = payload.indexOf(MESSAGE_SEPARATOR);
64
- splitAt !== -1
65
- ? then(slice(payload, 0, splitAt), slice(payload, splitAt + 1))
66
- : 0;
64
+ if (splitAt !== -1) {
65
+ then(slice(payload, 0, splitAt), slice(payload, splitAt + 1));
66
+ }
67
67
  };
68
68
  const receivePayload = (payload, receive) =>
69
69
  ifPayloadValid(payload, (fromClientId, remainder) =>
@@ -177,9 +177,11 @@ const createCustomPersister = (
177
177
  await schedule(async () => {
178
178
  try {
179
179
  const content = await getPersisted();
180
- isArray(content)
181
- ? setContentOrChanges(content)
182
- : errorNew(`Content is not an array ${content}`);
180
+ if (isArray(content)) {
181
+ setContentOrChanges(content);
182
+ } else {
183
+ errorNew(`Content is not an array ${content}`);
184
+ }
183
185
  } catch (error) {
184
186
  onIgnoredError?.(error);
185
187
  if (initialContent) {
@@ -61,9 +61,9 @@ const jsonParseWithUndefined = (str) =>
61
61
  const MESSAGE_SEPARATOR = '\n';
62
62
  const ifPayloadValid = (payload, then) => {
63
63
  const splitAt = payload.indexOf(MESSAGE_SEPARATOR);
64
- splitAt !== -1
65
- ? then(slice(payload, 0, splitAt), slice(payload, splitAt + 1))
66
- : 0;
64
+ if (splitAt !== -1) {
65
+ then(slice(payload, 0, splitAt), slice(payload, splitAt + 1));
66
+ }
67
67
  };
68
68
  const receivePayload = (payload, receive) =>
69
69
  ifPayloadValid(payload, (fromClientId, remainder) =>
@@ -177,9 +177,11 @@ const createCustomPersister = (
177
177
  await schedule(async () => {
178
178
  try {
179
179
  const content = await getPersisted();
180
- isArray(content)
181
- ? setContentOrChanges(content)
182
- : errorNew(`Content is not an array ${content}`);
180
+ if (isArray(content)) {
181
+ setContentOrChanges(content);
182
+ } else {
183
+ errorNew(`Content is not an array ${content}`);
184
+ }
183
185
  } catch (error) {
184
186
  onIgnoredError?.(error);
185
187
  if (initialContent) {
@@ -110,9 +110,9 @@ const jsonParseWithUndefined = (str) =>
110
110
  const MESSAGE_SEPARATOR = '\n';
111
111
  const ifPayloadValid = (payload, then) => {
112
112
  const splitAt = payload.indexOf(MESSAGE_SEPARATOR);
113
- splitAt !== -1
114
- ? then(slice(payload, 0, splitAt), slice(payload, splitAt + 1))
115
- : 0;
113
+ if (splitAt !== -1) {
114
+ then(slice(payload, 0, splitAt), slice(payload, splitAt + 1));
115
+ }
116
116
  };
117
117
  const receivePayload = (payload, receive) =>
118
118
  ifPayloadValid(payload, (fromClientId, remainder) =>
@@ -209,9 +209,11 @@ const createCustomPersister = (
209
209
  await schedule(async () => {
210
210
  try {
211
211
  const content = await getPersisted();
212
- isArray(content)
213
- ? setContentOrChanges(content)
214
- : errorNew(`Content is not an array ${content}`);
212
+ if (isArray(content)) {
213
+ setContentOrChanges(content);
214
+ } else {
215
+ errorNew(`Content is not an array ${content}`);
216
+ }
215
217
  } catch (error) {
216
218
  if (initialContent) {
217
219
  setDefaultContent(initialContent);
@@ -591,13 +593,15 @@ const getListenerFunctions = (getThing) => {
591
593
  ([listener, , path = [], pathGetters, extraArgsGetter]) => {
592
594
  const callWithIds = (...ids) => {
593
595
  const index = size(ids);
594
- index == size(path)
595
- ? listener(thing, ...ids, ...extraArgsGetter(ids))
596
- : isUndefined(path[index])
597
- ? arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
598
- callWithIds(...ids, id2),
599
- )
600
- : callWithIds(...ids, path[index]);
596
+ if (index == size(path)) {
597
+ listener(thing, ...ids, ...extraArgsGetter(ids));
598
+ } else if (isUndefined(path[index])) {
599
+ arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
600
+ callWithIds(...ids, id2),
601
+ );
602
+ } else {
603
+ callWithIds(...ids, path[index]);
604
+ }
601
605
  };
602
606
  callWithIds();
603
607
  },
@@ -659,18 +663,18 @@ const createWsServer = (webSocketServer, createPersisterForPath) => {
659
663
  ifPayloadValid(payload, (toClientId, remainder) => {
660
664
  const forwardedPayload = createRawPayload(clientId, remainder);
661
665
  if (toClientId === EMPTY_STRING) {
662
- clientId !== SERVER_CLIENT_ID
663
- ? serverClient[3 /* Send */]?.(forwardedPayload)
664
- : 0;
666
+ if (clientId !== SERVER_CLIENT_ID) {
667
+ serverClient[3 /* Send */]?.(forwardedPayload);
668
+ }
665
669
  mapForEach(clients, (otherClientId, otherWebSocket) =>
666
670
  otherClientId !== clientId
667
671
  ? otherWebSocket.send(forwardedPayload)
668
672
  : 0,
669
673
  );
674
+ } else if (toClientId === SERVER_CLIENT_ID) {
675
+ serverClient[3 /* Send */]?.(forwardedPayload);
670
676
  } else {
671
- toClientId === SERVER_CLIENT_ID
672
- ? serverClient[3 /* Send */]?.(forwardedPayload)
673
- : mapGet(clients, toClientId)?.send(forwardedPayload);
677
+ mapGet(clients, toClientId)?.send(forwardedPayload);
674
678
  }
675
679
  });
676
680
  webSocketServer.on('connection', (webSocket, request) =>
@@ -693,9 +697,11 @@ const createWsServer = (webSocketServer, createPersisterForPath) => {
693
697
  callListeners(clientIdListeners, [pathId], clientId, 1);
694
698
  webSocket.on('message', (data) => {
695
699
  const payload = data.toString(UTF8);
696
- serverClient[0 /* State */] == 0 /* Ready */
697
- ? messageHandler(payload)
698
- : arrayPush(serverClient[4 /* Buffer */], payload);
700
+ if (serverClient[0 /* State */] == 0 /* Ready */) {
701
+ messageHandler(payload);
702
+ } else {
703
+ arrayPush(serverClient[4 /* Buffer */], payload);
704
+ }
699
705
  });
700
706
  if (serverClient[0 /* State */] == 1 /* Configured */) {
701
707
  await startServerClient(serverClient);