tinybase 5.0.0-beta.1 → 5.0.0-beta.3

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 (313) hide show
  1. package/lib/cjs/mergeable-store.cjs +1 -0
  2. package/lib/cjs/mergeable-store.cjs.gz +0 -0
  3. package/lib/cjs/persisters/persister-automerge.cjs +1 -1
  4. package/lib/cjs/persisters/persister-automerge.cjs.gz +0 -0
  5. package/lib/cjs/persisters/persister-browser.cjs +1 -1
  6. package/lib/cjs/persisters/persister-browser.cjs.gz +0 -0
  7. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  8. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  9. package/lib/cjs/persisters/persister-electric-sql.cjs +1 -1
  10. package/lib/cjs/persisters/persister-electric-sql.cjs.gz +0 -0
  11. package/lib/cjs/persisters/persister-expo-sqlite-next.cjs +1 -1
  12. package/lib/cjs/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  13. package/lib/cjs/persisters/persister-expo-sqlite.cjs +1 -1
  14. package/lib/cjs/persisters/persister-expo-sqlite.cjs.gz +0 -0
  15. package/lib/cjs/persisters/persister-file.cjs +1 -1
  16. package/lib/cjs/persisters/persister-file.cjs.gz +0 -0
  17. package/lib/cjs/persisters/persister-indexed-db.cjs +1 -1
  18. package/lib/cjs/persisters/persister-indexed-db.cjs.gz +0 -0
  19. package/lib/cjs/persisters/persister-partykit-client.cjs +1 -1
  20. package/lib/cjs/persisters/persister-partykit-client.cjs.gz +0 -0
  21. package/lib/cjs/persisters/persister-partykit-server.cjs +1 -1
  22. package/lib/cjs/persisters/persister-partykit-server.cjs.gz +0 -0
  23. package/lib/cjs/persisters/persister-remote.cjs +1 -1
  24. package/lib/cjs/persisters/persister-remote.cjs.gz +0 -0
  25. package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -1
  26. package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  27. package/lib/cjs/persisters/persister-sqlite3.cjs +1 -1
  28. package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
  29. package/lib/cjs/persisters/persister-yjs.cjs +1 -1
  30. package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
  31. package/lib/cjs/persisters.cjs +1 -1
  32. package/lib/cjs/persisters.cjs.gz +0 -0
  33. package/lib/cjs/store.cjs +1 -1
  34. package/lib/cjs/store.cjs.gz +0 -0
  35. package/lib/cjs/tinybase.cjs +1 -1
  36. package/lib/cjs/tinybase.cjs.gz +0 -0
  37. package/lib/cjs/tools.cjs +1 -1
  38. package/lib/cjs/tools.cjs.gz +0 -0
  39. package/lib/cjs/ui-react-dom-debug.cjs +1 -1
  40. package/lib/cjs/ui-react-dom-debug.cjs.gz +0 -0
  41. package/lib/cjs/ui-react-dom.cjs +1 -1
  42. package/lib/cjs/ui-react-dom.cjs.gz +0 -0
  43. package/lib/cjs-es6/mergeable-store.cjs +1 -0
  44. package/lib/cjs-es6/mergeable-store.cjs.gz +0 -0
  45. package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -1
  46. package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
  47. package/lib/cjs-es6/persisters/persister-browser.cjs +1 -1
  48. package/lib/cjs-es6/persisters/persister-browser.cjs.gz +0 -0
  49. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  50. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  51. package/lib/cjs-es6/persisters/persister-electric-sql.cjs +1 -1
  52. package/lib/cjs-es6/persisters/persister-electric-sql.cjs.gz +0 -0
  53. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs +1 -1
  54. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  55. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -1
  56. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
  57. package/lib/cjs-es6/persisters/persister-file.cjs +1 -1
  58. package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
  59. package/lib/cjs-es6/persisters/persister-indexed-db.cjs +1 -1
  60. package/lib/cjs-es6/persisters/persister-indexed-db.cjs.gz +0 -0
  61. package/lib/cjs-es6/persisters/persister-partykit-client.cjs +1 -1
  62. package/lib/cjs-es6/persisters/persister-partykit-client.cjs.gz +0 -0
  63. package/lib/cjs-es6/persisters/persister-partykit-server.cjs +1 -1
  64. package/lib/cjs-es6/persisters/persister-partykit-server.cjs.gz +0 -0
  65. package/lib/cjs-es6/persisters/persister-remote.cjs +1 -1
  66. package/lib/cjs-es6/persisters/persister-remote.cjs.gz +0 -0
  67. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -1
  68. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  69. package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -1
  70. package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
  71. package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -1
  72. package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
  73. package/lib/cjs-es6/persisters.cjs +1 -1
  74. package/lib/cjs-es6/persisters.cjs.gz +0 -0
  75. package/lib/cjs-es6/store.cjs +1 -1
  76. package/lib/cjs-es6/store.cjs.gz +0 -0
  77. package/lib/cjs-es6/tinybase.cjs +1 -1
  78. package/lib/cjs-es6/tinybase.cjs.gz +0 -0
  79. package/lib/cjs-es6/tools.cjs +1 -1
  80. package/lib/cjs-es6/tools.cjs.gz +0 -0
  81. package/lib/cjs-es6/ui-react-dom-debug.cjs +1 -1
  82. package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
  83. package/lib/cjs-es6/ui-react-dom.cjs +1 -1
  84. package/lib/cjs-es6/ui-react-dom.cjs.gz +0 -0
  85. package/lib/debug/mergeable-store.js +1863 -0
  86. package/lib/debug/persisters/persister-automerge.js +54 -53
  87. package/lib/debug/persisters/persister-browser.js +28 -18
  88. package/lib/debug/persisters/persister-cr-sqlite-wasm.js +80 -57
  89. package/lib/debug/persisters/persister-electric-sql.js +80 -57
  90. package/lib/debug/persisters/persister-expo-sqlite-next.js +80 -57
  91. package/lib/debug/persisters/persister-expo-sqlite.js +80 -57
  92. package/lib/debug/persisters/persister-file.js +27 -18
  93. package/lib/debug/persisters/persister-indexed-db.js +34 -23
  94. package/lib/debug/persisters/persister-partykit-client.js +26 -23
  95. package/lib/debug/persisters/persister-partykit-server.js +11 -21
  96. package/lib/debug/persisters/persister-remote.js +28 -18
  97. package/lib/debug/persisters/persister-sqlite-wasm.js +80 -57
  98. package/lib/debug/persisters/persister-sqlite3.js +80 -57
  99. package/lib/debug/persisters/persister-yjs.js +50 -48
  100. package/lib/debug/persisters.js +27 -18
  101. package/lib/debug/queries.js +2 -2
  102. package/lib/debug/store.js +63 -71
  103. package/lib/debug/tinybase.js +354 -90
  104. package/lib/debug/tools.js +13 -15
  105. package/lib/debug/ui-react-dom.js +115 -119
  106. package/lib/es6/mergeable-store.js +1 -0
  107. package/lib/es6/mergeable-store.js.gz +0 -0
  108. package/lib/es6/persisters/persister-automerge.js +1 -1
  109. package/lib/es6/persisters/persister-automerge.js.gz +0 -0
  110. package/lib/es6/persisters/persister-browser.js +1 -1
  111. package/lib/es6/persisters/persister-browser.js.gz +0 -0
  112. package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  113. package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  114. package/lib/es6/persisters/persister-electric-sql.js +1 -1
  115. package/lib/es6/persisters/persister-electric-sql.js.gz +0 -0
  116. package/lib/es6/persisters/persister-expo-sqlite-next.js +1 -1
  117. package/lib/es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  118. package/lib/es6/persisters/persister-expo-sqlite.js +1 -1
  119. package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
  120. package/lib/es6/persisters/persister-file.js +1 -1
  121. package/lib/es6/persisters/persister-file.js.gz +0 -0
  122. package/lib/es6/persisters/persister-indexed-db.js +1 -1
  123. package/lib/es6/persisters/persister-indexed-db.js.gz +0 -0
  124. package/lib/es6/persisters/persister-partykit-client.js +1 -1
  125. package/lib/es6/persisters/persister-partykit-client.js.gz +0 -0
  126. package/lib/es6/persisters/persister-partykit-server.js +1 -1
  127. package/lib/es6/persisters/persister-partykit-server.js.gz +0 -0
  128. package/lib/es6/persisters/persister-remote.js +1 -1
  129. package/lib/es6/persisters/persister-remote.js.gz +0 -0
  130. package/lib/es6/persisters/persister-sqlite-wasm.js +1 -1
  131. package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  132. package/lib/es6/persisters/persister-sqlite3.js +1 -1
  133. package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
  134. package/lib/es6/persisters/persister-yjs.js +1 -1
  135. package/lib/es6/persisters/persister-yjs.js.gz +0 -0
  136. package/lib/es6/persisters.js +1 -1
  137. package/lib/es6/persisters.js.gz +0 -0
  138. package/lib/es6/store.js +1 -1
  139. package/lib/es6/store.js.gz +0 -0
  140. package/lib/es6/tinybase.js +1 -1
  141. package/lib/es6/tinybase.js.gz +0 -0
  142. package/lib/es6/tools.js +1 -1
  143. package/lib/es6/tools.js.gz +0 -0
  144. package/lib/es6/ui-react-dom-debug.js +1 -1
  145. package/lib/es6/ui-react-dom-debug.js.gz +0 -0
  146. package/lib/es6/ui-react-dom.js +1 -1
  147. package/lib/es6/ui-react-dom.js.gz +0 -0
  148. package/lib/mergeable-store.js +1 -0
  149. package/lib/mergeable-store.js.gz +0 -0
  150. package/lib/persisters/persister-automerge.js +1 -1
  151. package/lib/persisters/persister-automerge.js.gz +0 -0
  152. package/lib/persisters/persister-browser.js +1 -1
  153. package/lib/persisters/persister-browser.js.gz +0 -0
  154. package/lib/persisters/persister-cr-sqlite-wasm.js +1 -1
  155. package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  156. package/lib/persisters/persister-electric-sql.js +1 -1
  157. package/lib/persisters/persister-electric-sql.js.gz +0 -0
  158. package/lib/persisters/persister-expo-sqlite-next.js +1 -1
  159. package/lib/persisters/persister-expo-sqlite-next.js.gz +0 -0
  160. package/lib/persisters/persister-expo-sqlite.js +1 -1
  161. package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
  162. package/lib/persisters/persister-file.js +1 -1
  163. package/lib/persisters/persister-file.js.gz +0 -0
  164. package/lib/persisters/persister-indexed-db.js +1 -1
  165. package/lib/persisters/persister-indexed-db.js.gz +0 -0
  166. package/lib/persisters/persister-partykit-client.js +1 -1
  167. package/lib/persisters/persister-partykit-client.js.gz +0 -0
  168. package/lib/persisters/persister-partykit-server.js +1 -1
  169. package/lib/persisters/persister-partykit-server.js.gz +0 -0
  170. package/lib/persisters/persister-remote.js +1 -1
  171. package/lib/persisters/persister-remote.js.gz +0 -0
  172. package/lib/persisters/persister-sqlite-wasm.js +1 -1
  173. package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
  174. package/lib/persisters/persister-sqlite3.js +1 -1
  175. package/lib/persisters/persister-sqlite3.js.gz +0 -0
  176. package/lib/persisters/persister-yjs.js +1 -1
  177. package/lib/persisters/persister-yjs.js.gz +0 -0
  178. package/lib/persisters.js +1 -1
  179. package/lib/persisters.js.gz +0 -0
  180. package/lib/store.js +1 -1
  181. package/lib/store.js.gz +0 -0
  182. package/lib/tinybase.js +1 -1
  183. package/lib/tinybase.js.gz +0 -0
  184. package/lib/tools.js +1 -1
  185. package/lib/tools.js.gz +0 -0
  186. package/lib/types/mergeable-store.d.ts +79 -0
  187. package/lib/types/persisters/persister-automerge.d.ts +8 -7
  188. package/lib/types/persisters/persister-browser.d.ts +2 -0
  189. package/lib/types/persisters/persister-cr-sqlite-wasm.d.ts +1 -0
  190. package/lib/types/persisters/persister-electric-sql.d.ts +1 -0
  191. package/lib/types/persisters/persister-expo-sqlite-next.d.ts +1 -0
  192. package/lib/types/persisters/persister-expo-sqlite.d.ts +1 -0
  193. package/lib/types/persisters/persister-file.d.ts +1 -0
  194. package/lib/types/persisters/persister-indexed-db.d.ts +1 -0
  195. package/lib/types/persisters/persister-partykit-client.d.ts +1 -0
  196. package/lib/types/persisters/persister-partykit-server.d.ts +12 -8
  197. package/lib/types/persisters/persister-remote.d.ts +1 -0
  198. package/lib/types/persisters/persister-sqlite-wasm.d.ts +1 -0
  199. package/lib/types/persisters/persister-sqlite3.d.ts +1 -0
  200. package/lib/types/persisters/persister-yjs.d.ts +1 -0
  201. package/lib/types/persisters.d.ts +50 -30
  202. package/lib/types/store.d.ts +241 -186
  203. package/lib/types/tinybase.d.ts +1 -0
  204. package/lib/types/tools.d.ts +2 -2
  205. package/lib/types/ui-react.d.ts +1 -0
  206. package/lib/types/with-schemas/internal/store.d.ts +4 -0
  207. package/lib/types/with-schemas/mergeable-store.d.ts +112 -0
  208. package/lib/types/with-schemas/persisters/persister-automerge.d.ts +8 -7
  209. package/lib/types/with-schemas/persisters/persister-browser.d.ts +2 -0
  210. package/lib/types/with-schemas/persisters/persister-cr-sqlite-wasm.d.ts +1 -0
  211. package/lib/types/with-schemas/persisters/persister-electric-sql.d.ts +1 -0
  212. package/lib/types/with-schemas/persisters/persister-expo-sqlite-next.d.ts +1 -0
  213. package/lib/types/with-schemas/persisters/persister-expo-sqlite.d.ts +1 -0
  214. package/lib/types/with-schemas/persisters/persister-file.d.ts +1 -0
  215. package/lib/types/with-schemas/persisters/persister-indexed-db.d.ts +1 -0
  216. package/lib/types/with-schemas/persisters/persister-partykit-client.d.ts +1 -0
  217. package/lib/types/with-schemas/persisters/persister-partykit-server.d.ts +15 -11
  218. package/lib/types/with-schemas/persisters/persister-remote.d.ts +1 -0
  219. package/lib/types/with-schemas/persisters/persister-sqlite-wasm.d.ts +1 -0
  220. package/lib/types/with-schemas/persisters/persister-sqlite3.d.ts +1 -0
  221. package/lib/types/with-schemas/persisters/persister-yjs.d.ts +1 -0
  222. package/lib/types/with-schemas/persisters.d.ts +81 -45
  223. package/lib/types/with-schemas/store.d.ts +364 -273
  224. package/lib/types/with-schemas/tinybase.d.ts +1 -0
  225. package/lib/types/with-schemas/tools.d.ts +2 -2
  226. package/lib/ui-react-dom.js +1 -1
  227. package/lib/ui-react-dom.js.gz +0 -0
  228. package/lib/umd/mergeable-store.js +1 -0
  229. package/lib/umd/mergeable-store.js.gz +0 -0
  230. package/lib/umd/persisters/persister-automerge.js +1 -1
  231. package/lib/umd/persisters/persister-automerge.js.gz +0 -0
  232. package/lib/umd/persisters/persister-browser.js +1 -1
  233. package/lib/umd/persisters/persister-browser.js.gz +0 -0
  234. package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
  235. package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  236. package/lib/umd/persisters/persister-electric-sql.js +1 -1
  237. package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
  238. package/lib/umd/persisters/persister-expo-sqlite-next.js +1 -1
  239. package/lib/umd/persisters/persister-expo-sqlite-next.js.gz +0 -0
  240. package/lib/umd/persisters/persister-expo-sqlite.js +1 -1
  241. package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
  242. package/lib/umd/persisters/persister-file.js +1 -1
  243. package/lib/umd/persisters/persister-file.js.gz +0 -0
  244. package/lib/umd/persisters/persister-indexed-db.js +1 -1
  245. package/lib/umd/persisters/persister-indexed-db.js.gz +0 -0
  246. package/lib/umd/persisters/persister-partykit-client.js +1 -1
  247. package/lib/umd/persisters/persister-partykit-client.js.gz +0 -0
  248. package/lib/umd/persisters/persister-partykit-server.js +1 -1
  249. package/lib/umd/persisters/persister-partykit-server.js.gz +0 -0
  250. package/lib/umd/persisters/persister-remote.js +1 -1
  251. package/lib/umd/persisters/persister-remote.js.gz +0 -0
  252. package/lib/umd/persisters/persister-sqlite-wasm.js +1 -1
  253. package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
  254. package/lib/umd/persisters/persister-sqlite3.js +1 -1
  255. package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
  256. package/lib/umd/persisters/persister-yjs.js +1 -1
  257. package/lib/umd/persisters/persister-yjs.js.gz +0 -0
  258. package/lib/umd/persisters.js +1 -1
  259. package/lib/umd/persisters.js.gz +0 -0
  260. package/lib/umd/store.js +1 -1
  261. package/lib/umd/store.js.gz +0 -0
  262. package/lib/umd/tinybase.js +1 -1
  263. package/lib/umd/tinybase.js.gz +0 -0
  264. package/lib/umd/tools.js +1 -1
  265. package/lib/umd/tools.js.gz +0 -0
  266. package/lib/umd/ui-react-dom-debug.js +1 -1
  267. package/lib/umd/ui-react-dom-debug.js.gz +0 -0
  268. package/lib/umd/ui-react-dom.js +1 -1
  269. package/lib/umd/ui-react-dom.js.gz +0 -0
  270. package/lib/umd-es6/mergeable-store.js +1 -0
  271. package/lib/umd-es6/mergeable-store.js.gz +0 -0
  272. package/lib/umd-es6/persisters/persister-automerge.js +1 -1
  273. package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
  274. package/lib/umd-es6/persisters/persister-browser.js +1 -1
  275. package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
  276. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  277. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  278. package/lib/umd-es6/persisters/persister-electric-sql.js +1 -1
  279. package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
  280. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js +1 -1
  281. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  282. package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -1
  283. package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
  284. package/lib/umd-es6/persisters/persister-file.js +1 -1
  285. package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
  286. package/lib/umd-es6/persisters/persister-indexed-db.js +1 -1
  287. package/lib/umd-es6/persisters/persister-indexed-db.js.gz +0 -0
  288. package/lib/umd-es6/persisters/persister-partykit-client.js +1 -1
  289. package/lib/umd-es6/persisters/persister-partykit-client.js.gz +0 -0
  290. package/lib/umd-es6/persisters/persister-partykit-server.js +1 -1
  291. package/lib/umd-es6/persisters/persister-partykit-server.js.gz +0 -0
  292. package/lib/umd-es6/persisters/persister-remote.js +1 -1
  293. package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
  294. package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -1
  295. package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  296. package/lib/umd-es6/persisters/persister-sqlite3.js +1 -1
  297. package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
  298. package/lib/umd-es6/persisters/persister-yjs.js +1 -1
  299. package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
  300. package/lib/umd-es6/persisters.js +1 -1
  301. package/lib/umd-es6/persisters.js.gz +0 -0
  302. package/lib/umd-es6/store.js +1 -1
  303. package/lib/umd-es6/store.js.gz +0 -0
  304. package/lib/umd-es6/tinybase.js +1 -1
  305. package/lib/umd-es6/tinybase.js.gz +0 -0
  306. package/lib/umd-es6/tools.js +1 -1
  307. package/lib/umd-es6/tools.js.gz +0 -0
  308. package/lib/umd-es6/ui-react-dom-debug.js +1 -1
  309. package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
  310. package/lib/umd-es6/ui-react-dom.js +1 -1
  311. package/lib/umd-es6/ui-react-dom.js.gz +0 -0
  312. package/package.json +39 -35
  313. package/readme.md +2 -2
@@ -1 +1 @@
1
- var e,l;e=this,l=function(e,l,t){"use strict";const a=e=>typeof e,n=a(""),o=a(!0),r=a(0),i="Value",s="currentTarget",d="value",u=isFinite,c=e=>null==e,{PureComponent:m,Fragment:h,createElement:b,useCallback:p,useLayoutEffect:g,useRef:f,useState:w}=l,y=(e,...l)=>c(e)?{}:e(...l),v=(e,l)=>e.map(l),I=Object,C=I.entries,k=(e=[])=>I.fromEntries(e),x=(e,l)=>v(C(e),(([e,t])=>l(t,e))),T="tinybaseStoreInspector",R="M20 80l5-15l40-40l10 10l-40 40l-15 5m5-15l10 10",O='content:url("',S=O+"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100' stroke-width='4' stroke='white' fill='none'>",N='</svg>")',V=O+"data:image/svg+xml,%3csvg viewBox='0 0 680 680' xmlns='http://www.w3.org/2000/svg' style='width:680px%3bheight:680px'%3e %3cpath stroke='white' stroke-width='80' fill='none' d='M340 617a84 241 90 11.01 0zM131 475a94 254 70 10428-124 114 286 70 01-428 124zm0-140a94 254 70 10428-124 114 286 70 01-428 124zm-12-127a94 254 70 00306 38 90 260 90 01-306-38zm221 3a74 241 90 11.01 0z' /%3e %3cpath fill='%23d81b60' d='M131 475a94 254 70 10428-124 114 286 70 01-428 124zm0-140a94 254 70 10428-124 114 286 70 01-428 124z' /%3e %3cpath d='M249 619a94 240 90 00308-128 114 289 70 01-308 128zM119 208a94 254 70 00306 38 90 260 90 01-306-38zm221 3a74 241 90 11.01 0z' /%3e%3c/svg%3e\")",j=v([[20,20,20,60],[20,20,60,20],[20,60,60,20],[60,20,20,60],[30,30,40,40]],(([e,l,t,a])=>S+`<rect x='20' y='20' width='60' height='60' fill='grey'/><rect x='${e}' y='${l}' width='${t}' height='${a}' fill='white'/>`+N)),z=S+"<path d='M20 20l60 60M20 80l60-60' />"+N,P=S+`<path d='${R}' />`+N,$=S+`<path d='${R}M20 20l60 60' />`+N;var q=Object.defineProperty,M=Object.defineProperties,B=Object.getOwnPropertyDescriptors,E=Object.getOwnPropertySymbols,H=Object.prototype.hasOwnProperty,F=Object.prototype.propertyIsEnumerable,D=(e,l,t)=>l in e?q(e,l,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[l]=t,A=(e,l)=>{for(var t in l||(l={}))H.call(l,t)&&D(e,t,l[t]);if(E)for(var t of E(l))F.call(l,t)&&D(e,t,l[t]);return e},L=(e,l)=>M(e,B(l));const U="*::-webkit-scrollbar";((e,l="")=>{e.join(l)})(x(L(A(L(A(L(A({"":"all:initial;font-family:sans-serif;font-size:0.75rem;position:fixed;z-index:999999","*":"all:revert","*::before":"all:revert","*::after":"all:revert",[U]:"width:0.5rem;height:0.5rem;",[U+"-track"]:"background:#111",[U+"-thumb"]:"background:#999;border:1px solid #111",[U+"-thumb:hover"]:"background:#fff",[U+"-corner"]:"background:#111",img:"width:1rem;height:1rem;background:#111;border:0;vertical-align:text-bottom",">img":"padding:0.25rem;bottom:0;right:0;position:fixed;"+V},k(v(["bottom:0;left:0","top:0;right:0"],((e,l)=>[`>img[data-position='${l}']`,e])))),{main:"display:flex;flex-direction:column;background:#111d;color:#fff;position:fixed;"}),k(v(["bottom:0;left:0;width:35vw;height:100vh","top:0;right:0;width:100vw;height:30vh","bottom:0;left:0;width:100vw;height:30vh","top:0;right:0;width:35vw;height:100vh","top:0;right:0;width:100vw;height:100vh"],((e,l)=>[`main[data-position='${l}']`,e])))),{header:"display:flex;padding:0.25rem;background:#000;align-items:center","header>img:nth-of-type(1)":V,"header>img:nth-of-type(6)":z}),k(v(j,((e,l)=>[`header>img[data-id='${l}']`,e])))),{"header>span":"flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;margin-left:0.25rem",article:"padding:0.25rem 0.25rem 0.25rem 0.5rem;overflow:auto;flex:1",details:"margin-left:0.75rem;width:fit-content;","details img":"display:none","details[open]>summary img":"display:unset;background:none;margin-left:0.25rem","details[open]>summary img.edit":P,"details[open]>summary img.done":$,summary:"margin-left:-0.75rem;line-height:1.25rem;user-select:none;width:fit-content",table:"border-collapse:collapse;table-layout:fixed;margin-bottom:0.5rem","table input":"background:#111;color:unset;padding:0 0.25rem;border:0;font-size:unset;vertical-align:top;margin:0",'table input[type="number"]':"width:4rem","table tbody button":"font-size:0;background:#fff;border-radius:50%;margin:0 0.125rem 0 0;width:0.85rem;color:#111","table button:first-letter":"font-size:0.75rem",thead:"background:#222","th:nth-of-type(1)":"min-width:2rem;","th.sorted":"background:#000","table caption":"text-align:left;white-space:nowrap;line-height:1.25rem",button:"width:1.5rem;border:none;background:none;color:#fff;padding:0","button[disabled]":"color:#777","button.next":"margin-right:0.5rem",[`th,#${T} td`]:"overflow:hidden;text-overflow:ellipsis;padding:0.25rem 0.5rem;max-width:12rem;white-space:nowrap;border-width:1px 0;border-style:solid;border-color:#777;text-align:left","span.warn":"margin:0.25rem;color:#d81b60"}),((e,l)=>e?`#${T} ${l}{${e}}`:"")));const G=(e,l,t,a)=>e==n?l:e==r?t:a;var J=Object.defineProperty,K=Object.defineProperties,Q=Object.getOwnPropertyDescriptors,W=Object.getOwnPropertySymbols,X=Object.prototype.hasOwnProperty,Y=Object.prototype.propertyIsEnumerable,Z=(e,l,t)=>l in e?J(e,l,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[l]=t,_=(e,l)=>{for(var t in l||(l={}))X.call(l,t)&&Z(e,t,l[t]);if(W)for(var t of W(l))Y.call(l,t)&&Z(e,t,l[t]);return e},ee=(e,l)=>K(e,Q(l)),le=(e,l)=>{var t={};for(var a in e)X.call(e,a)&&l.indexOf(a)<0&&(t[a]=e[a]);if(null!=e&&W)for(var a of W(e))l.indexOf(a)<0&&Y.call(e,a)&&(t[a]=e[a]);return t};const{useCallback:te,useMemo:ae,useState:ne}=l,oe="editable",re=(e,l)=>v(t.useTableCellIds(e,l),(l=>e+"."+l)),ie=(e,l,t)=>{const a=te(e,l);return t?a:void 0},se=(...e)=>ae((()=>e),e),de=(e,l)=>ae((()=>({store:e,tableId:l})),[e,l]),ue=(e,l)=>ae((()=>({queries:e,queryId:l})),[e,l]),ce=(e,l=!1,t,a=0,n,o,r,i)=>{const[[s,d,u],c]=ne([e,l,a]),m=te((e=>{c(e),null==i||i(e)}),[i]),h=ie((e=>m([e,e==s&&!d,u])),[m,s,d,u],t),p=te((e=>m([s,d,e])),[m,s,d]),g=!0===r?ye:r;return[[s,d,u],h,ae((()=>!1===r?null:b(g,{offset:u,limit:n,total:o,onChange:p})),[r,g,u,n,o,p])]},me=(e,l,t)=>ae((()=>{const o=null!=l?l:e;return k(x(Array.isArray(o)?k(v(o,(e=>[e,e]))):o,((e,l)=>{return[l,_(_({},{label:l,component:t}),(o=e,a(o)==n?{label:e}:e))];var o})))}),[l,t,e]),he=({className:e,headerRow:l,idColumn:t,params:[a,n,o,r,i,s]})=>b("table",{className:e},s?b("caption",null,s):null,!1===l?null:b("thead",null,b("tr",null,!1===t?null:b(be,{sort:null!=r?r:[],label:"Id",onClick:i}),x(a,(({label:e},l)=>b(be,{key:l,cellId:l,label:e,sort:null!=r?r:[],onClick:i}))))),b("tbody",null,v(o,(e=>b("tr",{key:e},!1===t?null:b("th",null,e),x(a,(({component:l,getComponentProps:t},a)=>b("td",{key:a},b(l,ee(_(_({},y(t,e,a)),n),{rowId:e,cellId:a})))))))))),be=({cellId:e,sort:[l,t],label:a=(null!=e?e:""),onClick:n})=>b("th",{onClick:ie((()=>null==n?void 0:n(e)),[n,e],n),className:c(t)||l!=e?void 0:`sorted ${t?"de":"a"}scending`},c(t)||l!=e?null:(t?"↓":"↑")+" ",a),pe=({localRowId:e,params:[a,n,o,r,i,s,d]})=>{const u=t.useRemoteRowId(i,e,s);return b("tr",null,!1===a?null:b(l.Fragment,null,b("th",null,e),b("th",null,u)),x(n,(({component:l,getComponentProps:t},a)=>{const[n,i]=a.split(".",2),s=n===o?e:n===r?u:null;return c(s)?null:b("td",{key:a},b(l,ee(_({},y(t,s,i)),{store:d,tableId:n,rowId:s,cellId:i})))})))},ge=({thing:e,onThingChange:l,className:t,hasSchema:i,showType:c=!0})=>{const[m,h]=ne(),[p,g]=ne(),[f,w]=ne(),[y,v]=ne(),[I,C]=ne();p!==e&&(h((e=>{const l=a(e);return(e=>e==n||e==o)(l)||l==r&&u(e)?l:void 0})(e)),g(e),w(e+""),v(Number(e)||0),C(!!e));const k=te(((e,t)=>{t(e),g(e),l(e)}),[l]),x=te((()=>{if(!(null==i?void 0:i())){const e=G(m,r,o,n),t=G(e,f,y,I);h(e),g(t),l(t)}}),[i,l,f,y,I,m]);return b("div",{className:t},c?b("button",{className:m,onClick:x},m):null,G(m,b("input",{key:m,value:f,onChange:te((e=>k(e[s][d]+"",w)),[k])}),b("input",{key:m,type:"number",value:y,onChange:te((e=>k(Number(e[s][d]||0),v)),[k])}),b("input",{key:m,type:"checkbox",checked:I,onChange:te((e=>k(!!e[s].checked,C)),[k])})))},fe=({tableId:e,rowId:l,cellId:a,store:n,className:o,showType:r})=>{var i;return b(ge,{thing:t.useCell(e,l,a,n),onThingChange:t.useSetCellCallback(e,l,a,(e=>e),[],n),className:null!=o?o:oe+"Cell",showType:r,hasSchema:null==(i=t.useStoreOrStoreById(n))?void 0:i.hasTablesSchema})},we=({valueId:e,store:l,className:a,showType:n})=>{var o;return b(ge,{thing:t.useValue(e,l),onThingChange:t.useSetValueCallback(e,(e=>e),[],l),className:null!=a?a:oe+i,showType:n,hasSchema:null==(o=t.useStoreOrStoreById(l))?void 0:o.hasValuesSchema})},ye=({onChange:e,total:t,offset:a=0,limit:n=t,singular:o="row",plural:r=o+"s"})=>{(a>t||a<0)&&(a=0,e(0));const i=ie((()=>e(a-n)),[e,a,n],a>0),s=ie((()=>e(a+n)),[e,a,n],a+n<t);return b(l.Fragment,null,t>n&&b(l.Fragment,null,b("button",{className:"previous",disabled:0==a,onClick:i},"←"),b("button",{className:"next",disabled:a+n>=t,onClick:s},"→"),a+1," to ",Math.min(t,a+n)," of "),t," ",1!=t?r:o)},ve=e=>new Map(e);ve(),ve(),e.EditableCellView=fe,e.EditableValueView=we,e.RelationshipInHtmlTable=({relationshipId:e,relationships:a,editable:n,customCells:o,className:r,headerRow:i,idColumn:s=!0})=>{const[d,u,c,m]=((e,l)=>[e,null==e?void 0:e.getStore(),null==e?void 0:e.getLocalTableId(l),null==e?void 0:e.getRemoteTableId(l)])(t.useRelationshipsOrRelationshipsById(a),e),h=me([...re(c,u),...re(m,u)],o,n?fe:t.CellView),p=se(s,h,c,m,e,d,u);return b("table",{className:r},!1===i?null:b("thead",null,b("tr",null,!1===s?null:b(l.Fragment,null,b("th",null,c,".Id"),b("th",null,m,".Id")),x(h,(({label:e},l)=>b("th",{key:l},e))))),b("tbody",null,v(t.useRowIds(c,u),(e=>b(pe,{key:e,localRowId:e,params:p})))))},e.ResultSortedTableInHtmlTable=e=>{var l=e,{queryId:a,cellId:n,descending:o,offset:r,limit:i,queries:s,sortOnClick:d,paginator:u=!1,customCells:c,onChange:m}=l,h=le(l,["queryId","cellId","descending","offset","limit","queries","sortOnClick","paginator","customCells","onChange"]);const[p,g,f]=ce(n,o,d,r,i,t.useResultRowCount(a,s),u,m);return b(he,ee(_({},h),{params:se(me(t.useResultTableCellIds(a,s),c,t.ResultCellView),ue(s,a),t.useResultSortedRowIds(a,...p,i,s),p,g,f)}))},e.ResultTableInHtmlTable=e=>{var l=e,{queryId:a,queries:n,customCells:o}=l,r=le(l,["queryId","queries","customCells"]);return b(he,ee(_({},r),{params:se(me(t.useResultTableCellIds(a,n),o,t.ResultCellView),ue(n,a),t.useResultRowIds(a,n))}))},e.SliceInHtmlTable=e=>{var l=e,{indexId:a,sliceId:n,indexes:o,editable:r,customCells:i}=l,s=le(l,["indexId","sliceId","indexes","editable","customCells"]);const[d,u,c]=((e,l)=>[e,null==e?void 0:e.getStore(),null==e?void 0:e.getTableId(l)])(t.useIndexesOrIndexesById(o),a);return b(he,ee(_({},s),{params:se(me(t.useTableCellIds(c,u),i,r?fe:t.CellView),de(u,c),t.useSliceRowIds(a,n,d))}))},e.SortedTableInHtmlTable=e=>{var l=e,{tableId:a,cellId:n,descending:o,offset:r,limit:i,store:s,editable:d,sortOnClick:u,paginator:c=!1,onChange:m,customCells:h}=l,p=le(l,["tableId","cellId","descending","offset","limit","store","editable","sortOnClick","paginator","onChange","customCells"]);const[g,f,w]=ce(n,o,u,r,i,t.useRowCount(a,s),c,m);return b(he,ee(_({},p),{params:se(me(t.useTableCellIds(a,s),h,d?fe:t.CellView),de(s,a),t.useSortedRowIds(a,...g,i,s),g,f,w)}))},e.SortedTablePaginator=ye,e.StoreInspector=e=>null,e.TableInHtmlTable=e=>{var l=e,{tableId:a,store:n,editable:o,customCells:r}=l,i=le(l,["tableId","store","editable","customCells"]);return b(he,ee(_({},i),{params:se(me(t.useTableCellIds(a,n),r,o?fe:t.CellView),de(n,a),t.useRowIds(a,n))}))},e.ValuesInHtmlTable=({store:e,editable:l=!1,valueComponent:a=(l?we:t.ValueView),getValueComponentProps:n,className:o,headerRow:r,idColumn:s})=>b("table",{className:o},!1===r?null:b("thead",null,b("tr",null,!1===s?null:b("th",null,"Id"),b("th",null,i))),b("tbody",null,v(t.useValueIds(e),(l=>b("tr",{key:l},!1===s?null:b("th",null,l),b("td",null,b(a,ee(_({},y(n,l)),{valueId:l,store:e}))))))))},"object"==typeof exports&&"undefined"!=typeof module?l(exports,require("react"),require("./ui-react")):"function"==typeof define&&define.amd?define(["exports","react","./ui-react"],l):l((e="undefined"!=typeof globalThis?globalThis:e||self).TinyBaseUiReactDom={},e.React,e.TinyBaseUiReact);
1
+ var e,l;e=this,l=function(e,l,t){"use strict";const a=e=>typeof e,n=a(""),o=a(!0),r=a(0),i="Value",s="currentTarget",d="value",u=isFinite,c=e=>null==e,{PureComponent:m,Fragment:h,createElement:b,useCallback:p,useLayoutEffect:g,useRef:f,useState:w}=l,y=(e,...l)=>c(e)?{}:e(...l),v=(e,l)=>e.map(l),I=Object,C=I.entries,k=(e=[])=>I.fromEntries(e),x=(e,l)=>v(C(e),(([e,t])=>l(t,e))),T="tinybaseStoreInspector",R="M20 80l5-15l40-40l10 10l-40 40l-15 5m5-15l10 10",O='content:url("',S=O+"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100' stroke-width='4' stroke='white' fill='none'>",N='</svg>")',V=O+"data:image/svg+xml,%3csvg viewBox='0 0 680 680' xmlns='http://www.w3.org/2000/svg' style='width:680px%3bheight:680px'%3e %3cpath stroke='white' stroke-width='80' fill='none' d='M340 617a84 241 90 11.01 0zM131 475a94 254 70 10428-124 114 286 70 01-428 124zm0-140a94 254 70 10428-124 114 286 70 01-428 124zm-12-127a94 254 70 00306 38 90 260 90 01-306-38zm221 3a74 241 90 11.01 0z' /%3e %3cpath fill='%23d81b60' d='M131 475a94 254 70 10428-124 114 286 70 01-428 124zm0-140a94 254 70 10428-124 114 286 70 01-428 124z' /%3e %3cpath d='M249 619a94 240 90 00308-128 114 289 70 01-308 128zM119 208a94 254 70 00306 38 90 260 90 01-306-38zm221 3a74 241 90 11.01 0z' /%3e%3c/svg%3e\")",j=v([[20,20,20,60],[20,20,60,20],[20,60,60,20],[60,20,20,60],[30,30,40,40]],(([e,l,t,a])=>S+`<rect x='20' y='20' width='60' height='60' fill='grey'/><rect x='${e}' y='${l}' width='${t}' height='${a}' fill='white'/>`+N)),z=S+"<path d='M20 20l60 60M20 80l60-60' />"+N,P=S+`<path d='${R}' />`+N,$=S+`<path d='${R}M20 20l60 60' />`+N;var q=Object.defineProperty,M=Object.defineProperties,B=Object.getOwnPropertyDescriptors,E=Object.getOwnPropertySymbols,H=Object.prototype.hasOwnProperty,F=Object.prototype.propertyIsEnumerable,D=(e,l,t)=>l in e?q(e,l,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[l]=t,A=(e,l)=>{for(var t in l||(l={}))H.call(l,t)&&D(e,t,l[t]);if(E)for(var t of E(l))F.call(l,t)&&D(e,t,l[t]);return e},L=(e,l)=>M(e,B(l));const U="*::-webkit-scrollbar";((e,l="")=>{e.join(l)})(x(L(A(L(A(L(A({"":"all:initial;font-family:sans-serif;font-size:0.75rem;position:fixed;z-index:999999","*":"all:revert","*::before":"all:revert","*::after":"all:revert",[U]:"width:0.5rem;height:0.5rem;",[U+"-track"]:"background:#111",[U+"-thumb"]:"background:#999;border:1px solid #111",[U+"-thumb:hover"]:"background:#fff",[U+"-corner"]:"background:#111",img:"width:1rem;height:1rem;background:#111;border:0;vertical-align:text-bottom",">img":"padding:0.25rem;bottom:0;right:0;position:fixed;"+V},k(v(["bottom:0;left:0","top:0;right:0"],((e,l)=>[`>img[data-position='${l}']`,e])))),{main:"display:flex;flex-direction:column;background:#111d;color:#fff;position:fixed;"}),k(v(["bottom:0;left:0;width:35vw;height:100vh","top:0;right:0;width:100vw;height:30vh","bottom:0;left:0;width:100vw;height:30vh","top:0;right:0;width:35vw;height:100vh","top:0;right:0;width:100vw;height:100vh"],((e,l)=>[`main[data-position='${l}']`,e])))),{header:"display:flex;padding:0.25rem;background:#000;align-items:center","header>img:nth-of-type(1)":V,"header>img:nth-of-type(6)":z}),k(v(j,((e,l)=>[`header>img[data-id='${l}']`,e])))),{"header>span":"flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;margin-left:0.25rem",article:"padding:0.25rem 0.25rem 0.25rem 0.5rem;overflow:auto;flex:1",details:"margin-left:0.75rem;width:fit-content;","details img":"display:none","details[open]>summary img":"display:unset;background:none;margin-left:0.25rem","details[open]>summary img.edit":P,"details[open]>summary img.done":$,summary:"margin-left:-0.75rem;line-height:1.25rem;user-select:none;width:fit-content",table:"border-collapse:collapse;table-layout:fixed;margin-bottom:0.5rem","table input":"background:#111;color:unset;padding:0 0.25rem;border:0;font-size:unset;vertical-align:top;margin:0",'table input[type="number"]':"width:4rem","table tbody button":"font-size:0;background:#fff;border-radius:50%;margin:0 0.125rem 0 0;width:0.85rem;color:#111","table button:first-letter":"font-size:0.75rem",thead:"background:#222","th:nth-of-type(1)":"min-width:2rem;","th.sorted":"background:#000","table caption":"text-align:left;white-space:nowrap;line-height:1.25rem",button:"width:1.5rem;border:none;background:none;color:#fff;padding:0","button[disabled]":"color:#777","button.next":"margin-right:0.5rem",[`th,#${T} td`]:"overflow:hidden;text-overflow:ellipsis;padding:0.25rem 0.5rem;max-width:12rem;white-space:nowrap;border-width:1px 0;border-style:solid;border-color:#777;text-align:left","span.warn":"margin:0.25rem;color:#d81b60"}),((e,l)=>e?`#${T} ${l}{${e}}`:"")));const G=(e,l,t,a)=>e==n?l:e==r?t:a;var J=Object.defineProperty,K=Object.defineProperties,Q=Object.getOwnPropertyDescriptors,W=Object.getOwnPropertySymbols,X=Object.prototype.hasOwnProperty,Y=Object.prototype.propertyIsEnumerable,Z=(e,l,t)=>l in e?J(e,l,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[l]=t,_=(e,l)=>{for(var t in l||(l={}))X.call(l,t)&&Z(e,t,l[t]);if(W)for(var t of W(l))Y.call(l,t)&&Z(e,t,l[t]);return e},ee=(e,l)=>K(e,Q(l)),le=(e,l)=>{var t={};for(var a in e)X.call(e,a)&&l.indexOf(a)<0&&(t[a]=e[a]);if(null!=e&&W)for(var a of W(e))l.indexOf(a)<0&&Y.call(e,a)&&(t[a]=e[a]);return t};const{useCallback:te,useMemo:ae,useState:ne}=l,oe="editable",re=(e,l)=>v(t.useTableCellIds(e,l),(l=>e+"."+l)),ie=(e,l,t)=>{const a=te(e,l);return t?a:void 0},se=(...e)=>ae((()=>e),e),de=(e,l)=>ae((()=>({store:e,tableId:l})),[e,l]),ue=(e,l)=>ae((()=>({queries:e,queryId:l})),[e,l]),ce=(e,l=!1,t,a=0,n,o,r,i)=>{const[[s,d,u],c]=ne([e,l,a]),m=te((e=>{c(e),null==i||i(e)}),[i]),h=ie((e=>m([e,e==s&&!d,u])),[m,s,d,u],t),p=te((e=>m([s,d,e])),[m,s,d]),g=!0===r?ye:r;return[[s,d,u],h,ae((()=>!1===r?null:b(g,{offset:u,limit:n,total:o,onChange:p})),[r,g,u,n,o,p])]},me=(e,l,t)=>ae((()=>{const o=null!=l?l:e;return r=Array.isArray(o)?k(v(o,(e=>[e,e]))):o,i=(e,l)=>_(_({},{label:l,component:t}),a(e)==n?{label:e}:e),k(x(r,((e,l)=>[l,i(e,l)])));var r,i}),[l,t,e]),he=({className:e,headerRow:l,idColumn:t,params:[a,n,o,r,i,s]})=>b("table",{className:e},s?b("caption",null,s):null,!1===l?null:b("thead",null,b("tr",null,!1===t?null:b(be,{sort:null!=r?r:[],label:"Id",onClick:i}),x(a,(({label:e},l)=>b(be,{key:l,cellId:l,label:e,sort:null!=r?r:[],onClick:i}))))),b("tbody",null,v(o,(e=>b("tr",{key:e},!1===t?null:b("th",null,e),x(a,(({component:l,getComponentProps:t},a)=>b("td",{key:a},b(l,ee(_(_({},y(t,e,a)),n),{rowId:e,cellId:a})))))))))),be=({cellId:e,sort:[l,t],label:a=(null!=e?e:""),onClick:n})=>b("th",{onClick:ie((()=>null==n?void 0:n(e)),[n,e],n),className:c(t)||l!=e?void 0:`sorted ${t?"de":"a"}scending`},c(t)||l!=e?null:(t?"↓":"↑")+" ",a),pe=({localRowId:e,params:[a,n,o,r,i,s,d]})=>{const u=t.useRemoteRowId(i,e,s);return b("tr",null,!1===a?null:b(l.Fragment,null,b("th",null,e),b("th",null,u)),x(n,(({component:l,getComponentProps:t},a)=>{const[n,i]=a.split(".",2),s=n===o?e:n===r?u:null;return c(s)?null:b("td",{key:a},b(l,ee(_({},y(t,s,i)),{store:d,tableId:n,rowId:s,cellId:i})))})))},ge=({thing:e,onThingChange:l,className:t,hasSchema:i,showType:c=!0})=>{const[m,h]=ne(),[p,g]=ne(),[f,w]=ne(),[y,v]=ne(),[I,C]=ne();p!==e&&(h((e=>{const l=a(e);return(e=>e==n||e==o)(l)||l==r&&u(e)?l:void 0})(e)),g(e),w(e+""),v(Number(e)||0),C(!!e));const k=te(((e,t)=>{t(e),g(e),l(e)}),[l]),x=te((()=>{if(!(null==i?void 0:i())){const e=G(m,r,o,n),t=G(e,f,y,I);h(e),g(t),l(t)}}),[i,l,f,y,I,m]);return b("div",{className:t},c?b("button",{className:m,onClick:x},m):null,G(m,b("input",{key:m,value:f,onChange:te((e=>k(e[s][d]+"",w)),[k])}),b("input",{key:m,type:"number",value:y,onChange:te((e=>k(Number(e[s][d]||0),v)),[k])}),b("input",{key:m,type:"checkbox",checked:I,onChange:te((e=>k(!!e[s].checked,C)),[k])})))},fe=({tableId:e,rowId:l,cellId:a,store:n,className:o,showType:r})=>{var i;return b(ge,{thing:t.useCell(e,l,a,n),onThingChange:t.useSetCellCallback(e,l,a,(e=>e),[],n),className:null!=o?o:oe+"Cell",showType:r,hasSchema:null==(i=t.useStoreOrStoreById(n))?void 0:i.hasTablesSchema})},we=({valueId:e,store:l,className:a,showType:n})=>{var o;return b(ge,{thing:t.useValue(e,l),onThingChange:t.useSetValueCallback(e,(e=>e),[],l),className:null!=a?a:oe+i,showType:n,hasSchema:null==(o=t.useStoreOrStoreById(l))?void 0:o.hasValuesSchema})},ye=({onChange:e,total:t,offset:a=0,limit:n=t,singular:o="row",plural:r=o+"s"})=>{(a>t||a<0)&&(a=0,e(0));const i=ie((()=>e(a-n)),[e,a,n],a>0),s=ie((()=>e(a+n)),[e,a,n],a+n<t);return b(l.Fragment,null,t>n&&b(l.Fragment,null,b("button",{className:"previous",disabled:0==a,onClick:i},"←"),b("button",{className:"next",disabled:a+n>=t,onClick:s},"→"),a+1," to ",Math.min(t,a+n)," of "),t," ",1!=t?r:o)},ve=e=>new Map(e);ve(),ve(),e.EditableCellView=fe,e.EditableValueView=we,e.RelationshipInHtmlTable=({relationshipId:e,relationships:a,editable:n,customCells:o,className:r,headerRow:i,idColumn:s=!0})=>{const[d,u,c,m]=((e,l)=>[e,null==e?void 0:e.getStore(),null==e?void 0:e.getLocalTableId(l),null==e?void 0:e.getRemoteTableId(l)])(t.useRelationshipsOrRelationshipsById(a),e),h=me([...re(c,u),...re(m,u)],o,n?fe:t.CellView),p=se(s,h,c,m,e,d,u);return b("table",{className:r},!1===i?null:b("thead",null,b("tr",null,!1===s?null:b(l.Fragment,null,b("th",null,c,".Id"),b("th",null,m,".Id")),x(h,(({label:e},l)=>b("th",{key:l},e))))),b("tbody",null,v(t.useRowIds(c,u),(e=>b(pe,{key:e,localRowId:e,params:p})))))},e.ResultSortedTableInHtmlTable=e=>{var l=e,{queryId:a,cellId:n,descending:o,offset:r,limit:i,queries:s,sortOnClick:d,paginator:u=!1,customCells:c,onChange:m}=l,h=le(l,["queryId","cellId","descending","offset","limit","queries","sortOnClick","paginator","customCells","onChange"]);const[p,g,f]=ce(n,o,d,r,i,t.useResultRowCount(a,s),u,m);return b(he,ee(_({},h),{params:se(me(t.useResultTableCellIds(a,s),c,t.ResultCellView),ue(s,a),t.useResultSortedRowIds(a,...p,i,s),p,g,f)}))},e.ResultTableInHtmlTable=e=>{var l=e,{queryId:a,queries:n,customCells:o}=l,r=le(l,["queryId","queries","customCells"]);return b(he,ee(_({},r),{params:se(me(t.useResultTableCellIds(a,n),o,t.ResultCellView),ue(n,a),t.useResultRowIds(a,n))}))},e.SliceInHtmlTable=e=>{var l=e,{indexId:a,sliceId:n,indexes:o,editable:r,customCells:i}=l,s=le(l,["indexId","sliceId","indexes","editable","customCells"]);const[d,u,c]=((e,l)=>[e,null==e?void 0:e.getStore(),null==e?void 0:e.getTableId(l)])(t.useIndexesOrIndexesById(o),a);return b(he,ee(_({},s),{params:se(me(t.useTableCellIds(c,u),i,r?fe:t.CellView),de(u,c),t.useSliceRowIds(a,n,d))}))},e.SortedTableInHtmlTable=e=>{var l=e,{tableId:a,cellId:n,descending:o,offset:r,limit:i,store:s,editable:d,sortOnClick:u,paginator:c=!1,onChange:m,customCells:h}=l,p=le(l,["tableId","cellId","descending","offset","limit","store","editable","sortOnClick","paginator","onChange","customCells"]);const[g,f,w]=ce(n,o,u,r,i,t.useRowCount(a,s),c,m);return b(he,ee(_({},p),{params:se(me(t.useTableCellIds(a,s),h,d?fe:t.CellView),de(s,a),t.useSortedRowIds(a,...g,i,s),g,f,w)}))},e.SortedTablePaginator=ye,e.StoreInspector=e=>null,e.TableInHtmlTable=e=>{var l=e,{tableId:a,store:n,editable:o,customCells:r}=l,i=le(l,["tableId","store","editable","customCells"]);return b(he,ee(_({},i),{params:se(me(t.useTableCellIds(a,n),r,o?fe:t.CellView),de(n,a),t.useRowIds(a,n))}))},e.ValuesInHtmlTable=({store:e,editable:l=!1,valueComponent:a=(l?we:t.ValueView),getValueComponentProps:n,className:o,headerRow:r,idColumn:s})=>b("table",{className:o},!1===r?null:b("thead",null,b("tr",null,!1===s?null:b("th",null,"Id"),b("th",null,i))),b("tbody",null,v(t.useValueIds(e),(l=>b("tr",{key:l},!1===s?null:b("th",null,l),b("td",null,b(a,ee(_({},y(n,l)),{valueId:l,store:e}))))))))},"object"==typeof exports&&"undefined"!=typeof module?l(exports,require("react"),require("./ui-react")):"function"==typeof define&&define.amd?define(["exports","react","./ui-react"],l):l((e="undefined"!=typeof globalThis?globalThis:e||self).TinyBaseUiReactDom={},e.React,e.TinyBaseUiReact);
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tinybase",
3
- "version": "5.0.0-beta.1",
3
+ "version": "5.0.0-beta.3",
4
4
  "author": "jamesgpearce",
5
5
  "repository": "github:tinyplex/tinybase",
6
6
  "license": "MIT",
@@ -215,33 +215,33 @@
215
215
  },
216
216
  "devDependencies": {
217
217
  "@automerge/automerge": "^2.1.10",
218
- "@babel/cli": "^7.23.4",
219
- "@babel/core": "^7.23.7",
220
- "@babel/preset-env": "^7.23.8",
218
+ "@automerge/automerge-repo": "^1.1.1",
219
+ "@babel/cli": "^7.23.9",
220
+ "@babel/core": "^7.23.9",
221
+ "@babel/preset-env": "^7.23.9",
221
222
  "@babel/preset-react": "^7.23.3",
222
223
  "@babel/preset-typescript": "^7.23.3",
223
- "@prettier/sync": "^0.3.0",
224
+ "@prettier/sync": "^0.5.1",
224
225
  "@rollup/plugin-image": "^3.0.3",
225
226
  "@rollup/plugin-replace": "^5.0.5",
226
227
  "@rollup/plugin-terser": "^0.4.4",
227
- "@sqlite.org/sqlite-wasm": "^3.44.2-build3",
228
+ "@sqlite.org/sqlite-wasm": "^3.45.1-build1",
228
229
  "@types/asciichart": "^1.5.8",
229
230
  "@types/expect-puppeteer": "^5.0.6",
230
231
  "@types/http-server": "^0.12.4",
231
- "@types/jest": "^29.5.11",
232
+ "@types/jest": "^29.5.12",
232
233
  "@types/jest-environment-puppeteer": "^5.0.6",
233
234
  "@types/less": "^3.0.6",
234
- "@types/node": "^20.11.5",
235
+ "@types/node": "^20.11.19",
235
236
  "@types/puppeteer": "^5.4.7",
236
- "@types/react": "^18.2.48",
237
- "@types/react-dom": "^18.2.18",
237
+ "@types/react": "^18.2.56",
238
+ "@types/react-dom": "^18.2.19",
238
239
  "@types/react-test-renderer": "^18.0.7",
239
240
  "@types/tmp": "^0.2.6",
240
- "@typescript-eslint/eslint-plugin": "^6.19.0",
241
- "@typescript-eslint/parser": "^6.19.0",
241
+ "@typescript-eslint/eslint-plugin": "^7.0.1",
242
+ "@typescript-eslint/parser": "^7.0.1",
242
243
  "@vlcn.io/crsqlite-wasm": "^0.16.0",
243
244
  "asciichart": "^1.5.25",
244
- "automerge-repo": "^0.1.0",
245
245
  "babel-eslint": "^10.1.0",
246
246
  "babel-jest": "^29.7.0",
247
247
  "babel-plugin-transform-import-meta": "^2.2.1",
@@ -250,12 +250,12 @@
250
250
  "buffer-replace": "^1.0.0",
251
251
  "country-flag-emoji-json": "^2.0.0",
252
252
  "cspell": "^8.3.2",
253
- "electric-sql": "^0.8.2",
254
- "esbuild": "^0.19.11",
253
+ "electric-sql": "^0.9.2",
254
+ "esbuild": "^0.20.0",
255
255
  "eslint": "^8.56.0",
256
256
  "eslint-config-prettier": "^9.1.0",
257
- "eslint-plugin-jest": "^27.6.3",
258
- "eslint-plugin-jsdoc": "^48.0.2",
257
+ "eslint-plugin-jest": "^27.9.0",
258
+ "eslint-plugin-jsdoc": "^48.1.0",
259
259
  "eslint-plugin-react": "7.33.2",
260
260
  "eslint-plugin-react-hooks": "^4.6.0",
261
261
  "expo-sqlite": "^13.2.1",
@@ -267,53 +267,57 @@
267
267
  "jest": "^29.7.0",
268
268
  "jest-environment-jsdom": "^29.7.0",
269
269
  "jest-fetch-mock": "^3.0.3",
270
- "jest-puppeteer": "^9.0.2",
270
+ "jest-puppeteer": "^10.0.1",
271
271
  "less": "^4.2.0",
272
- "partykit": "^0.0.72",
273
- "partysocket": "^0.0.20",
274
- "prettier": "^3.2.4",
275
- "puppeteer": "21.7.0",
272
+ "partykit": "^0.0.91",
273
+ "partysocket": "^0.0.25",
274
+ "prettier": "^3.2.5",
275
+ "puppeteer": "22.1.0",
276
276
  "react": "^18.2.0",
277
277
  "react-dom": "^18.2.0",
278
278
  "react-test-renderer": "^18.2.0",
279
- "rollup": "^4.9.5",
280
- "rollup-plugin-esbuild": "^6.1.0",
279
+ "rollup": "^4.12.0",
280
+ "rollup-plugin-esbuild": "^6.1.1",
281
281
  "rollup-plugin-gzip": "^3.1.1",
282
282
  "rollup-plugin-preserve-shebang": "^1.0.1",
283
283
  "rollup-plugin-prettier": "^4.1.1",
284
284
  "sqlite3": "^5.1.7",
285
285
  "tinybase": "file:./",
286
- "tinydocs": "^0.1.34",
286
+ "tinydocs": "^0.1.36",
287
287
  "tmp": "^0.2.1",
288
288
  "ts-unused-exports": "^10.0.1",
289
289
  "typescript": "5.3.3",
290
290
  "wa-sqlite": "github:rhashimoto/wa-sqlite",
291
- "yjs": "^13.6.10"
291
+ "yjs": "^13.6.12"
292
292
  },
293
293
  "peerDependencies": {
294
- "@sqlite.org/sqlite-wasm": "^3.44.2-build3",
294
+ "@automerge/automerge-repo": "^1.1.1",
295
+ "@sqlite.org/sqlite-wasm": "^3.45.1-build1",
295
296
  "@vlcn.io/crsqlite-wasm": "^0.16.0",
296
- "automerge-repo": "^0.1.0",
297
- "electric-sql": "^0.8.2",
298
- "partykit": "^0.0.72",
299
- "partysocket": "^0.0.20",
300
- "prettier": "^3.2.4",
297
+ "electric-sql": "^0.9.2",
298
+ "expo-sqlite": "^13.2.1",
299
+ "partykit": "^0.0.91",
300
+ "partysocket": "^0.0.25",
301
+ "prettier": "^3.2.5",
301
302
  "react": "^18.2.0",
302
303
  "react-dom": "^18.2.0",
303
304
  "sqlite3": "^5.1.7",
304
- "yjs": "^13.6.10"
305
+ "yjs": "^13.6.12"
305
306
  },
306
307
  "peerDependenciesMeta": {
308
+ "@automerge/automerge-repo": {
309
+ "optional": true
310
+ },
307
311
  "@sqlite.org/sqlite-wasm": {
308
312
  "optional": true
309
313
  },
310
314
  "@vlcn.io/crsqlite-wasm": {
311
315
  "optional": true
312
316
  },
313
- "automerge-repo": {
317
+ "electric-sql": {
314
318
  "optional": true
315
319
  },
316
- "electric-sql": {
320
+ "expo-sqlite": {
317
321
  "optional": true
318
322
  },
319
323
  "partykit": {
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><p id="copy">Build blisteringly fast web apps that work both online and offline. Manage your state locally, synchronize it to the cloud when you need to, or even make it collaborative. But, most importantly... have fun building stuff again!</p></section><p><a href="https://beta.tinybase.org/guides/releases/#v4-6"><em>NEW!</em> v4.6 release</a> <span id="one-with">&quot;The One With ElectricSQL&quot;</span></p><p><a class="start" href="https://beta.tinybase.org/guides/the-basics/getting-started/">Get started</a></p><p><a href="https://beta.tinybase.org/demos/">Try the demos</a></p><p><a href="https://beta.tinybase.org/api/store/interfaces/store/store/">Read the docs</a></p><hr><ul><li>Manage <a href="#start-with-a-simple-key-value-store">key-value data</a>, <a href="#level-up-to-use-tabular-data">tabular data</a> - or both - with optional <a href="#apply-schemas-to-tables-values">schematization</a> to model your app&#x27;s data structures.</li><li><a href="#register-granular-listeners">Flexibly reactive</a> to reconciled updates, so you only spend rendering cycles on things that change.</li><li><a href="#build-complex-queries-with-tinyql">Powerful query engine</a> to select, join, filter, group, sort and paginate data - reactively - and without SQL.</li><li>Built-in <a href="#create-indexes-for-fast-lookups">indexing</a>, <a href="#define-metrics-and-aggregations">metric aggregation</a>, <a href="#model-table-relationships">tabular relationships</a> - and even an <a href="#set-checkpoints-for-an-undo-stack">undo stack</a> for your app state.</li><li>Create <a href="#type-definitions-orm-like-apis">type definitions &amp; ORM-like APIs</a>, from schema or inference. <a href="#an-inspector-for-your-data">Inspect your data</a> (<em>new!</em>) directly in the browser.</li><li>Easily <a href="#persist-to-storage-sqlite-crdts">sync your data</a> to browser <a href="https://beta.tinybase.org/api/persister-browser">storage</a>, <a href="https://beta.tinybase.org/api/persister-indexed-db/">IndexedDB</a>, <a href="https://beta.tinybase.org/guides/schemas-and-persistence/database-persistence/">SQLite</a>, <a href="https://beta.tinybase.org/guides/schemas-and-persistence/synchronizing-data/">CRDTs</a>; and (<em>new!</em>) <a href="https://beta.tinybase.org/api/persister-partykit-client/">PartyKit</a> and <a href="https://electric-sql.com/">ElectricSQL</a>.</li><li>Optional <a href="#call-hooks-to-bind-to-data">bindings to React</a> and (<em>new!</em>) <a href="#pre-built-reactive-components">pre-built components</a> that let you easily build fully reactive user interfaces.</li><li>Tiny by name, tiny by nature: <a href="#did-we-say-tiny">5.0kB - 9.5kB</a>, no dependencies. <a href="#well-tested-and-documented">100% tested</a>, <a href="https://beta.tinybase.org/guides/the-basics/getting-started/">fully documented</a>, and of course, <a href="https://github.com/tinyplex/tinybase">open source</a>!</li></ul><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://beta.tinybase.org/guides/building-uis/getting-started-with-ui-react"><img width="48" src="https://beta.tinybase.org/react.svg"> React</a></div><div><a href="https://beta.tinybase.org/api/persister-partykit-client"><img width="48" src="https://beta.tinybase.org/partykit.svg"> PartyKit</a></div><div><a href="https://beta.tinybase.org/guides/schemas-and-persistence/database-persistence"><img width="48" src="https://beta.tinybase.org/expo.svg">Expo SQLite</a></div><div><a href="https://beta.tinybase.org/guides/schemas-and-persistence/database-persistence"><img width="48" src="https://beta.tinybase.org/electric.svg">ElectricSQL</a></div><div><a href="https://beta.tinybase.org/guides/schemas-and-persistence/database-persistence"><img width="48" src="https://beta.tinybase.org/sqlite.svg"> SQLite</a></div><div><a href="https://beta.tinybase.org/api/persister-indexed-db/functions/creation/createindexeddbpersister"><img width="48" src="https://beta.tinybase.org/indexeddb.svg"> IndexedDB</a></div><div><a href="https://beta.tinybase.org/api/persister-yjs/functions/creation/createyjspersister"><img width="48" src="https://beta.tinybase.org/yjs.svg"> YJS</a></div><div><a href="https://beta.tinybase.org/api/persister-cr-sqlite-wasm"><img width="48" src="https://beta.tinybase.org/crsqlite.png"> CR-SQLite</a></div><div><a href="https://beta.tinybase.org/api/persister-automerge"><img width="48" src="https://beta.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.0.0-beta.1" 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://beta.tinybase.org/api/store/interfaces/store/store/"><code>Store</code></a> requires just a simple call to the <a href="https://beta.tinybase.org/api/store/functions/creation/createstore/"><code>createStore</code></a> function. Once you have one, you can easily set <a href="https://beta.tinybase.org/api/store/type-aliases/store/values/"><code>Values</code></a> in it by unique <a href="https://beta.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://beta.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><p id="copy">Build blisteringly fast web apps that work both online and offline. Manage your state locally, synchronize it to the cloud when you need to, or even make it collaborative. But, most importantly... have fun building stuff again!</p></section><p><a href="https://beta.tinybase.org/guides/releases/#v5-0"><em>NEW!</em> v5.0 release</a> <span id="one-with">&quot;The One You Can Merge&quot;</span></p><p><a class="start" href="https://beta.tinybase.org/guides/the-basics/getting-started/">Get started</a></p><p><a href="https://beta.tinybase.org/demos/">Try the demos</a></p><p><a href="https://beta.tinybase.org/api/store/interfaces/store/store/">Read the docs</a></p><hr><ul><li>Manage <a href="#start-with-a-simple-key-value-store">key-value data</a>, <a href="#level-up-to-use-tabular-data">tabular data</a> - or both - with optional <a href="#apply-schemas-to-tables-values">schematization</a> to model your app&#x27;s data structures.</li><li><a href="#register-granular-listeners">Flexibly reactive</a> to reconciled updates, so you only spend rendering cycles on things that change.</li><li><a href="#build-complex-queries-with-tinyql">Powerful query engine</a> to select, join, filter, group, sort and paginate data - reactively - and without SQL.</li><li>Built-in <a href="#create-indexes-for-fast-lookups">indexing</a>, <a href="#define-metrics-and-aggregations">metric aggregation</a>, <a href="#model-table-relationships">tabular relationships</a> - and even an <a href="#set-checkpoints-for-an-undo-stack">undo stack</a> for your app state.</li><li>Create <a href="#type-definitions-orm-like-apis">type definitions &amp; ORM-like APIs</a>, from schema or inference. <a href="#an-inspector-for-your-data">Inspect your data</a> (<em>new!</em>) directly in the browser.</li><li>Easily <a href="#persist-to-storage-sqlite-crdts">sync your data</a> to browser <a href="https://beta.tinybase.org/api/persister-browser">storage</a>, <a href="https://beta.tinybase.org/api/persister-indexed-db/">IndexedDB</a>, <a href="https://beta.tinybase.org/guides/schemas-and-persistence/database-persistence/">SQLite</a>, <a href="https://beta.tinybase.org/guides/schemas-and-persistence/synchronizing-data/">CRDTs</a>; and (<em>new!</em>) <a href="https://beta.tinybase.org/api/persister-partykit-client/">PartyKit</a> and <a href="https://electric-sql.com/">ElectricSQL</a>.</li><li>Optional <a href="#call-hooks-to-bind-to-data">bindings to React</a> and (<em>new!</em>) <a href="#pre-built-reactive-components">pre-built components</a> that let you easily build fully reactive user interfaces.</li><li>Tiny by name, tiny by nature: <a href="#did-we-say-tiny">5.0kB - 10.5kB</a>, no dependencies. <a href="#well-tested-and-documented">100% tested</a>, <a href="https://beta.tinybase.org/guides/the-basics/getting-started/">fully documented</a>, and of course, <a href="https://github.com/tinyplex/tinybase">open source</a>!</li></ul><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://beta.tinybase.org/guides/building-uis/getting-started-with-ui-react"><img width="48" src="https://beta.tinybase.org/react.svg"> React</a></div><div><a href="https://beta.tinybase.org/api/persister-partykit-client"><img width="48" src="https://beta.tinybase.org/partykit.svg"> PartyKit</a></div><div><a href="https://beta.tinybase.org/guides/schemas-and-persistence/database-persistence"><img width="48" src="https://beta.tinybase.org/expo.svg">Expo SQLite</a></div><div><a href="https://beta.tinybase.org/guides/schemas-and-persistence/database-persistence"><img width="48" src="https://beta.tinybase.org/electric.svg">ElectricSQL</a></div><div><a href="https://beta.tinybase.org/guides/schemas-and-persistence/database-persistence"><img width="48" src="https://beta.tinybase.org/sqlite.svg"> SQLite</a></div><div><a href="https://beta.tinybase.org/api/persister-indexed-db/functions/creation/createindexeddbpersister"><img width="48" src="https://beta.tinybase.org/indexeddb.svg"> IndexedDB</a></div><div><a href="https://beta.tinybase.org/api/persister-yjs/functions/creation/createyjspersister"><img width="48" src="https://beta.tinybase.org/yjs.svg"> YJS</a></div><div><a href="https://beta.tinybase.org/api/persister-cr-sqlite-wasm"><img width="48" src="https://beta.tinybase.org/crsqlite.png"> CR-SQLite</a></div><div><a href="https://beta.tinybase.org/api/persister-automerge"><img width="48" src="https://beta.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.0.0-beta.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://beta.tinybase.org/api/store/interfaces/store/store/"><code>Store</code></a> requires just a simple call to the <a href="https://beta.tinybase.org/api/store/functions/creation/createstore/"><code>createStore</code></a> function. Once you have one, you can easily set <a href="https://beta.tinybase.org/api/store/type-aliases/store/values/"><code>Values</code></a> in it by unique <a href="https://beta.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://beta.tinybase.org/guides/the-basics/">The Basics</a> guide.</p></section>
2
2
 
3
3
  ```js
4
4
  const store = createStore()
@@ -247,4 +247,4 @@ export const createShop: typeof createShopDecl = () => {
247
247
  };
248
248
  ```
249
249
 
250
- <section><h2 id="did-we-say-tiny">Did we say tiny?</h2><p>If you use the basic <a href="https://beta.tinybase.org/api/store/"><code>store</code></a> module alone, you&#x27;ll only add a gzipped <em>5.0kB</em> to your app. Incrementally add the other modules as you need more functionality, or get it all for <em>9.5kB</em>.</p><p>The optional <a href="https://beta.tinybase.org/api/ui-react/"><code>ui-react</code></a> module is just another <em>4.5kB</em>, the auxiliary <a href="https://beta.tinybase.org/api/tools/"><code>tools</code></a> module is <em>11.2kB</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://beta.tinybase.org/guides/how-tinybase-is-built/architecture/">Architecture</a> guide.</p></section><div class="table"><table class="fixed"><tbody><tr><th width="30%"> </th><th>.js.gz</th><th>.js</th><th>debug.js</th><th>.d.ts</th></tr><tr><th class="right"><a href="https://beta.tinybase.org/api/store/">store</a></th><td>5.0kB</td><td>12.0kB</td><td>51.7kB</td><td>252.6kB</td></tr><tr><th class="right"><a href="https://beta.tinybase.org/api/metrics/">metrics</a></th><td>1.8kB</td><td>3.7kB</td><td>15.2kB</td><td>30.9kB</td></tr><tr><th class="right"><a href="https://beta.tinybase.org/api/indexes/">indexes</a></th><td>1.9kB</td><td>3.8kB</td><td>17.1kB</td><td>35.6kB</td></tr><tr><th class="right"><a href="https://beta.tinybase.org/api/relationships/">relationships</a></th><td>1.9kB</td><td>3.8kB</td><td>17.2kB</td><td>44.2kB</td></tr><tr><th class="right"><a href="https://beta.tinybase.org/api/queries/">queries</a></th><td>2.8kB</td><td>5.7kB</td><td>25.7kB</td><td>126.0kB</td></tr><tr><th class="right"><a href="https://beta.tinybase.org/api/checkpoints/">checkpoints</a></th><td>1.6kB</td><td>3.2kB</td><td>13.5kB</td><td>35.1kB</td></tr><tr><th class="right"><a href="https://beta.tinybase.org/api/persisters/">persisters</a></th><td>0.8kB</td><td>1.5kB</td><td>5.3kB</td><td>43.9kB</td></tr><tr><th class="right"><a href="https://beta.tinybase.org/api/common/">common</a></th><td>0.1kB</td><td>0.1kB</td><td>0.1kB</td><td>3.5kB</td></tr><tr><th class="right">tinybase (all)</th><td>9.5kB</td><td>23.3kB</td><td>101.6kB</td><td>0.3kB</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://beta.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>1,994</td><td>1,994</td><td>100.0%</td></tr><tr><th class="right">Statements</th><td>2,154</td><td>2,154</td><td>100.0%</td></tr><tr><th class="right">Functions</th><td>857</td><td>857</td><td>100.0%</td></tr><tr><th class="right">Branches</th><td>740</td><td>740</td><td>100.0%</td></tr><tr><th class="right">Tests</th><td colspan="3">3,890</td></tr><tr><th class="right">Assertions</th><td colspan="3">18,071</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/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/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/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/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/nikitavoloboev" target="_blank"><img title="nikitavoloboev" src="https://github.com/nikitavoloboev.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/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/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://beta.tinybase.org/guides/the-basics/getting-started/">Get started</a></p><p><a href="https://beta.tinybase.org/demos/">Try the demos</a></p><p><a href="https://beta.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://beta.tinybase.org/guides/how-tinybase-is-built/credits/#giants">projects</a> and <a href="https://beta.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://beta.tinybase.org/youtube.webp"></a></section>
250
+ <section><h2 id="did-we-say-tiny">Did we say tiny?</h2><p>If you use the basic <a href="https://beta.tinybase.org/api/store/"><code>store</code></a> module alone, you&#x27;ll only add a gzipped <em>5.0kB</em> to your app. Incrementally add the other modules as you need more functionality, or get it all for <em>10.5kB</em>.</p><p>The optional <a href="https://beta.tinybase.org/api/ui-react/"><code>ui-react</code></a> module is just another <em>4.5kB</em>, the auxiliary <a href="https://beta.tinybase.org/api/tools/"><code>tools</code></a> module is <em>11.1kB</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://beta.tinybase.org/guides/how-tinybase-is-built/architecture/">Architecture</a> guide.</p></section><div class="table"><table class="fixed"><tbody><tr><th width="30%"> </th><th>.js.gz</th><th>.js</th><th>debug.js</th><th>.d.ts</th></tr><tr><th class="right"><a href="https://beta.tinybase.org/api/store/">store</a></th><td>5.0kB</td><td>11.9kB</td><td>51.4kB</td><td>254.6kB</td></tr><tr><th class="right"><a href="https://beta.tinybase.org/api/metrics/">metrics</a></th><td>1.8kB</td><td>3.7kB</td><td>15.2kB</td><td>30.9kB</td></tr><tr><th class="right"><a href="https://beta.tinybase.org/api/indexes/">indexes</a></th><td>1.9kB</td><td>3.8kB</td><td>17.1kB</td><td>35.6kB</td></tr><tr><th class="right"><a href="https://beta.tinybase.org/api/relationships/">relationships</a></th><td>1.9kB</td><td>3.8kB</td><td>17.2kB</td><td>44.2kB</td></tr><tr><th class="right"><a href="https://beta.tinybase.org/api/queries/">queries</a></th><td>2.8kB</td><td>5.7kB</td><td>25.7kB</td><td>126.0kB</td></tr><tr><th class="right"><a href="https://beta.tinybase.org/api/checkpoints/">checkpoints</a></th><td>1.6kB</td><td>3.2kB</td><td>13.5kB</td><td>35.1kB</td></tr><tr><th class="right"><a href="https://beta.tinybase.org/api/mergeable-store/">mergeable-store</a></th><td>6.0kB</td><td>14.4kB</td><td>60.0kB</td><td>1.8kB</td></tr><tr><th class="right"><a href="https://beta.tinybase.org/api/persisters/">persisters</a></th><td>0.9kB</td><td>1.7kB</td><td>5.7kB</td><td>44.7kB</td></tr><tr><th class="right"><a href="https://beta.tinybase.org/api/common/">common</a></th><td>0.1kB</td><td>0.1kB</td><td>0.1kB</td><td>3.5kB</td></tr><tr><th class="right">tinybase (all)</th><td>10.5kB</td><td>25.8kB</td><td>110.2kB</td><td>0.3kB</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://beta.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,123</td><td>2,123</td><td>100.0%</td></tr><tr><th class="right">Statements</th><td>2,298</td><td>2,298</td><td>100.0%</td></tr><tr><th class="right">Functions</th><td>907</td><td>907</td><td>100.0%</td></tr><tr><th class="right">Branches</th><td>778</td><td>778</td><td>100.0%</td></tr><tr><th class="right">Tests</th><td colspan="3">5,801</td></tr><tr><th class="right">Assertions</th><td colspan="3">27,522</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/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/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/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/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/nikitavoloboev" target="_blank"><img title="nikitavoloboev" src="https://github.com/nikitavoloboev.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/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/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://beta.tinybase.org/guides/the-basics/getting-started/">Get started</a></p><p><a href="https://beta.tinybase.org/demos/">Try the demos</a></p><p><a href="https://beta.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://beta.tinybase.org/guides/how-tinybase-is-built/credits/#giants">projects</a> and <a href="https://beta.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://beta.tinybase.org/youtube.webp"></a></section>