tinybase 5.0.0-beta.1 → 5.0.0-beta.11

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 (491) hide show
  1. package/lib/checkpoints.js +1 -1
  2. package/lib/checkpoints.js.gz +0 -0
  3. package/lib/cjs/checkpoints.cjs +1 -1
  4. package/lib/cjs/checkpoints.cjs.gz +0 -0
  5. package/lib/cjs/indexes.cjs +1 -1
  6. package/lib/cjs/indexes.cjs.gz +0 -0
  7. package/lib/cjs/mergeable-store.cjs +1 -0
  8. package/lib/cjs/mergeable-store.cjs.gz +0 -0
  9. package/lib/cjs/metrics.cjs +1 -1
  10. package/lib/cjs/metrics.cjs.gz +0 -0
  11. package/lib/cjs/persisters/persister-automerge.cjs +1 -1
  12. package/lib/cjs/persisters/persister-automerge.cjs.gz +0 -0
  13. package/lib/cjs/persisters/persister-browser.cjs +1 -1
  14. package/lib/cjs/persisters/persister-browser.cjs.gz +0 -0
  15. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  16. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  17. package/lib/cjs/persisters/persister-electric-sql.cjs +1 -1
  18. package/lib/cjs/persisters/persister-electric-sql.cjs.gz +0 -0
  19. package/lib/cjs/persisters/persister-expo-sqlite-next.cjs +1 -1
  20. package/lib/cjs/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  21. package/lib/cjs/persisters/persister-expo-sqlite.cjs +1 -1
  22. package/lib/cjs/persisters/persister-expo-sqlite.cjs.gz +0 -0
  23. package/lib/cjs/persisters/persister-file.cjs +1 -1
  24. package/lib/cjs/persisters/persister-file.cjs.gz +0 -0
  25. package/lib/cjs/persisters/persister-indexed-db.cjs +1 -1
  26. package/lib/cjs/persisters/persister-indexed-db.cjs.gz +0 -0
  27. package/lib/cjs/persisters/persister-libsql.cjs +1 -0
  28. package/lib/cjs/persisters/persister-libsql.cjs.gz +0 -0
  29. package/lib/cjs/persisters/persister-partykit-client.cjs +1 -1
  30. package/lib/cjs/persisters/persister-partykit-client.cjs.gz +0 -0
  31. package/lib/cjs/persisters/persister-partykit-server.cjs +1 -1
  32. package/lib/cjs/persisters/persister-partykit-server.cjs.gz +0 -0
  33. package/lib/cjs/persisters/persister-powersync.cjs +1 -0
  34. package/lib/cjs/persisters/persister-powersync.cjs.gz +0 -0
  35. package/lib/cjs/persisters/persister-remote.cjs +1 -1
  36. package/lib/cjs/persisters/persister-remote.cjs.gz +0 -0
  37. package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -1
  38. package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  39. package/lib/cjs/persisters/persister-sqlite3.cjs +1 -1
  40. package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
  41. package/lib/cjs/persisters/persister-yjs.cjs +1 -1
  42. package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
  43. package/lib/cjs/persisters.cjs +1 -1
  44. package/lib/cjs/persisters.cjs.gz +0 -0
  45. package/lib/cjs/queries.cjs +1 -1
  46. package/lib/cjs/queries.cjs.gz +0 -0
  47. package/lib/cjs/relationships.cjs +1 -1
  48. package/lib/cjs/relationships.cjs.gz +0 -0
  49. package/lib/cjs/store.cjs +1 -1
  50. package/lib/cjs/store.cjs.gz +0 -0
  51. package/lib/cjs/synchronizers/synchronizer-local.cjs +1 -0
  52. package/lib/cjs/synchronizers/synchronizer-local.cjs.gz +0 -0
  53. package/lib/cjs/synchronizers/synchronizer-ws-client.cjs +1 -0
  54. package/lib/cjs/synchronizers/synchronizer-ws-client.cjs.gz +0 -0
  55. package/lib/cjs/synchronizers/synchronizer-ws-server.cjs +1 -0
  56. package/lib/cjs/synchronizers/synchronizer-ws-server.cjs.gz +0 -0
  57. package/lib/cjs/synchronizers.cjs +1 -0
  58. package/lib/cjs/synchronizers.cjs.gz +0 -0
  59. package/lib/cjs/tinybase.cjs +1 -1
  60. package/lib/cjs/tinybase.cjs.gz +0 -0
  61. package/lib/cjs/tools.cjs +1 -1
  62. package/lib/cjs/tools.cjs.gz +0 -0
  63. package/lib/cjs/ui-react-dom-debug.cjs +1 -1
  64. package/lib/cjs/ui-react-dom-debug.cjs.gz +0 -0
  65. package/lib/cjs/ui-react-dom.cjs +1 -1
  66. package/lib/cjs/ui-react-dom.cjs.gz +0 -0
  67. package/lib/cjs/ui-react.cjs +1 -1
  68. package/lib/cjs/ui-react.cjs.gz +0 -0
  69. package/lib/cjs-es6/checkpoints.cjs +1 -1
  70. package/lib/cjs-es6/checkpoints.cjs.gz +0 -0
  71. package/lib/cjs-es6/indexes.cjs +1 -1
  72. package/lib/cjs-es6/indexes.cjs.gz +0 -0
  73. package/lib/cjs-es6/mergeable-store.cjs +1 -0
  74. package/lib/cjs-es6/mergeable-store.cjs.gz +0 -0
  75. package/lib/cjs-es6/metrics.cjs +1 -1
  76. package/lib/cjs-es6/metrics.cjs.gz +0 -0
  77. package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -1
  78. package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
  79. package/lib/cjs-es6/persisters/persister-browser.cjs +1 -1
  80. package/lib/cjs-es6/persisters/persister-browser.cjs.gz +0 -0
  81. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  82. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  83. package/lib/cjs-es6/persisters/persister-electric-sql.cjs +1 -1
  84. package/lib/cjs-es6/persisters/persister-electric-sql.cjs.gz +0 -0
  85. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs +1 -1
  86. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  87. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -1
  88. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
  89. package/lib/cjs-es6/persisters/persister-file.cjs +1 -1
  90. package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
  91. package/lib/cjs-es6/persisters/persister-indexed-db.cjs +1 -1
  92. package/lib/cjs-es6/persisters/persister-indexed-db.cjs.gz +0 -0
  93. package/lib/cjs-es6/persisters/persister-libsql.cjs +1 -0
  94. package/lib/cjs-es6/persisters/persister-libsql.cjs.gz +0 -0
  95. package/lib/cjs-es6/persisters/persister-partykit-client.cjs +1 -1
  96. package/lib/cjs-es6/persisters/persister-partykit-client.cjs.gz +0 -0
  97. package/lib/cjs-es6/persisters/persister-partykit-server.cjs +1 -1
  98. package/lib/cjs-es6/persisters/persister-partykit-server.cjs.gz +0 -0
  99. package/lib/cjs-es6/persisters/persister-powersync.cjs +1 -0
  100. package/lib/cjs-es6/persisters/persister-powersync.cjs.gz +0 -0
  101. package/lib/cjs-es6/persisters/persister-remote.cjs +1 -1
  102. package/lib/cjs-es6/persisters/persister-remote.cjs.gz +0 -0
  103. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -1
  104. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  105. package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -1
  106. package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
  107. package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -1
  108. package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
  109. package/lib/cjs-es6/persisters.cjs +1 -1
  110. package/lib/cjs-es6/persisters.cjs.gz +0 -0
  111. package/lib/cjs-es6/queries.cjs +1 -1
  112. package/lib/cjs-es6/queries.cjs.gz +0 -0
  113. package/lib/cjs-es6/relationships.cjs +1 -1
  114. package/lib/cjs-es6/relationships.cjs.gz +0 -0
  115. package/lib/cjs-es6/store.cjs +1 -1
  116. package/lib/cjs-es6/store.cjs.gz +0 -0
  117. package/lib/cjs-es6/synchronizers/synchronizer-local.cjs +1 -0
  118. package/lib/cjs-es6/synchronizers/synchronizer-local.cjs.gz +0 -0
  119. package/lib/cjs-es6/synchronizers/synchronizer-ws-client.cjs +1 -0
  120. package/lib/cjs-es6/synchronizers/synchronizer-ws-client.cjs.gz +0 -0
  121. package/lib/cjs-es6/synchronizers/synchronizer-ws-server.cjs +1 -0
  122. package/lib/cjs-es6/synchronizers/synchronizer-ws-server.cjs.gz +0 -0
  123. package/lib/cjs-es6/synchronizers.cjs +1 -0
  124. package/lib/cjs-es6/synchronizers.cjs.gz +0 -0
  125. package/lib/cjs-es6/tinybase.cjs +1 -1
  126. package/lib/cjs-es6/tinybase.cjs.gz +0 -0
  127. package/lib/cjs-es6/tools.cjs +1 -1
  128. package/lib/cjs-es6/tools.cjs.gz +0 -0
  129. package/lib/cjs-es6/ui-react-dom-debug.cjs +1 -1
  130. package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
  131. package/lib/cjs-es6/ui-react-dom.cjs +1 -1
  132. package/lib/cjs-es6/ui-react-dom.cjs.gz +0 -0
  133. package/lib/cjs-es6/ui-react.cjs +1 -1
  134. package/lib/cjs-es6/ui-react.cjs.gz +0 -0
  135. package/lib/debug/checkpoints.js +3 -1
  136. package/lib/debug/indexes.js +3 -1
  137. package/lib/debug/mergeable-store.js +2230 -0
  138. package/lib/debug/metrics.js +3 -1
  139. package/lib/debug/persisters/persister-automerge.js +167 -131
  140. package/lib/debug/persisters/persister-browser.js +155 -102
  141. package/lib/debug/persisters/persister-cr-sqlite-wasm.js +225 -152
  142. package/lib/debug/persisters/persister-electric-sql.js +225 -152
  143. package/lib/debug/persisters/persister-expo-sqlite-next.js +225 -152
  144. package/lib/debug/persisters/persister-expo-sqlite.js +225 -152
  145. package/lib/debug/persisters/persister-file.js +149 -101
  146. package/lib/debug/persisters/persister-indexed-db.js +146 -100
  147. package/lib/debug/persisters/persister-libsql.js +924 -0
  148. package/lib/debug/persisters/persister-partykit-client.js +146 -104
  149. package/lib/debug/persisters/persister-partykit-server.js +17 -25
  150. package/lib/debug/persisters/persister-powersync.js +939 -0
  151. package/lib/debug/persisters/persister-remote.js +141 -97
  152. package/lib/debug/persisters/persister-sqlite-wasm.js +225 -152
  153. package/lib/debug/persisters/persister-sqlite3.js +225 -152
  154. package/lib/debug/persisters/persister-yjs.js +164 -127
  155. package/lib/debug/persisters.js +137 -94
  156. package/lib/debug/queries.js +9 -6
  157. package/lib/debug/relationships.js +3 -1
  158. package/lib/debug/store.js +147 -126
  159. package/lib/debug/synchronizers/synchronizer-local.js +571 -0
  160. package/lib/debug/synchronizers/synchronizer-ws-client.js +598 -0
  161. package/lib/debug/synchronizers/synchronizer-ws-server.js +241 -0
  162. package/lib/debug/synchronizers.js +531 -0
  163. package/lib/debug/tinybase.js +1080 -215
  164. package/lib/debug/tools.js +22 -21
  165. package/lib/debug/ui-react-dom.js +336 -258
  166. package/lib/debug/ui-react.js +55 -6
  167. package/lib/es6/checkpoints.js +1 -1
  168. package/lib/es6/checkpoints.js.gz +0 -0
  169. package/lib/es6/indexes.js +1 -1
  170. package/lib/es6/indexes.js.gz +0 -0
  171. package/lib/es6/mergeable-store.js +1 -0
  172. package/lib/es6/mergeable-store.js.gz +0 -0
  173. package/lib/es6/metrics.js +1 -1
  174. package/lib/es6/metrics.js.gz +0 -0
  175. package/lib/es6/persisters/persister-automerge.js +1 -1
  176. package/lib/es6/persisters/persister-automerge.js.gz +0 -0
  177. package/lib/es6/persisters/persister-browser.js +1 -1
  178. package/lib/es6/persisters/persister-browser.js.gz +0 -0
  179. package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  180. package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  181. package/lib/es6/persisters/persister-electric-sql.js +1 -1
  182. package/lib/es6/persisters/persister-electric-sql.js.gz +0 -0
  183. package/lib/es6/persisters/persister-expo-sqlite-next.js +1 -1
  184. package/lib/es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  185. package/lib/es6/persisters/persister-expo-sqlite.js +1 -1
  186. package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
  187. package/lib/es6/persisters/persister-file.js +1 -1
  188. package/lib/es6/persisters/persister-file.js.gz +0 -0
  189. package/lib/es6/persisters/persister-indexed-db.js +1 -1
  190. package/lib/es6/persisters/persister-indexed-db.js.gz +0 -0
  191. package/lib/es6/persisters/persister-libsql.js +1 -0
  192. package/lib/es6/persisters/persister-libsql.js.gz +0 -0
  193. package/lib/es6/persisters/persister-partykit-client.js +1 -1
  194. package/lib/es6/persisters/persister-partykit-client.js.gz +0 -0
  195. package/lib/es6/persisters/persister-partykit-server.js +1 -1
  196. package/lib/es6/persisters/persister-partykit-server.js.gz +0 -0
  197. package/lib/es6/persisters/persister-powersync.js +1 -0
  198. package/lib/es6/persisters/persister-powersync.js.gz +0 -0
  199. package/lib/es6/persisters/persister-remote.js +1 -1
  200. package/lib/es6/persisters/persister-remote.js.gz +0 -0
  201. package/lib/es6/persisters/persister-sqlite-wasm.js +1 -1
  202. package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  203. package/lib/es6/persisters/persister-sqlite3.js +1 -1
  204. package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
  205. package/lib/es6/persisters/persister-yjs.js +1 -1
  206. package/lib/es6/persisters/persister-yjs.js.gz +0 -0
  207. package/lib/es6/persisters.js +1 -1
  208. package/lib/es6/persisters.js.gz +0 -0
  209. package/lib/es6/queries.js +1 -1
  210. package/lib/es6/queries.js.gz +0 -0
  211. package/lib/es6/relationships.js +1 -1
  212. package/lib/es6/relationships.js.gz +0 -0
  213. package/lib/es6/store.js +1 -1
  214. package/lib/es6/store.js.gz +0 -0
  215. package/lib/es6/synchronizers/synchronizer-local.js +1 -0
  216. package/lib/es6/synchronizers/synchronizer-local.js.gz +0 -0
  217. package/lib/es6/synchronizers/synchronizer-ws-client.js +1 -0
  218. package/lib/es6/synchronizers/synchronizer-ws-client.js.gz +0 -0
  219. package/lib/es6/synchronizers/synchronizer-ws-server.js +1 -0
  220. package/lib/es6/synchronizers/synchronizer-ws-server.js.gz +0 -0
  221. package/lib/es6/synchronizers.js +1 -0
  222. package/lib/es6/synchronizers.js.gz +0 -0
  223. package/lib/es6/tinybase.js +1 -1
  224. package/lib/es6/tinybase.js.gz +0 -0
  225. package/lib/es6/tools.js +1 -1
  226. package/lib/es6/tools.js.gz +0 -0
  227. package/lib/es6/ui-react-dom-debug.js +1 -1
  228. package/lib/es6/ui-react-dom-debug.js.gz +0 -0
  229. package/lib/es6/ui-react-dom.js +1 -1
  230. package/lib/es6/ui-react-dom.js.gz +0 -0
  231. package/lib/es6/ui-react.js +1 -1
  232. package/lib/es6/ui-react.js.gz +0 -0
  233. package/lib/indexes.js +1 -1
  234. package/lib/indexes.js.gz +0 -0
  235. package/lib/mergeable-store.js +1 -0
  236. package/lib/mergeable-store.js.gz +0 -0
  237. package/lib/metrics.js +1 -1
  238. package/lib/metrics.js.gz +0 -0
  239. package/lib/persisters/persister-automerge.js +1 -1
  240. package/lib/persisters/persister-automerge.js.gz +0 -0
  241. package/lib/persisters/persister-browser.js +1 -1
  242. package/lib/persisters/persister-browser.js.gz +0 -0
  243. package/lib/persisters/persister-cr-sqlite-wasm.js +1 -1
  244. package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  245. package/lib/persisters/persister-electric-sql.js +1 -1
  246. package/lib/persisters/persister-electric-sql.js.gz +0 -0
  247. package/lib/persisters/persister-expo-sqlite-next.js +1 -1
  248. package/lib/persisters/persister-expo-sqlite-next.js.gz +0 -0
  249. package/lib/persisters/persister-expo-sqlite.js +1 -1
  250. package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
  251. package/lib/persisters/persister-file.js +1 -1
  252. package/lib/persisters/persister-file.js.gz +0 -0
  253. package/lib/persisters/persister-indexed-db.js +1 -1
  254. package/lib/persisters/persister-indexed-db.js.gz +0 -0
  255. package/lib/persisters/persister-libsql.js +1 -0
  256. package/lib/persisters/persister-libsql.js.gz +0 -0
  257. package/lib/persisters/persister-partykit-client.js +1 -1
  258. package/lib/persisters/persister-partykit-client.js.gz +0 -0
  259. package/lib/persisters/persister-partykit-server.js +1 -1
  260. package/lib/persisters/persister-partykit-server.js.gz +0 -0
  261. package/lib/persisters/persister-powersync.js +1 -0
  262. package/lib/persisters/persister-powersync.js.gz +0 -0
  263. package/lib/persisters/persister-remote.js +1 -1
  264. package/lib/persisters/persister-remote.js.gz +0 -0
  265. package/lib/persisters/persister-sqlite-wasm.js +1 -1
  266. package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
  267. package/lib/persisters/persister-sqlite3.js +1 -1
  268. package/lib/persisters/persister-sqlite3.js.gz +0 -0
  269. package/lib/persisters/persister-yjs.js +1 -1
  270. package/lib/persisters/persister-yjs.js.gz +0 -0
  271. package/lib/persisters.js +1 -1
  272. package/lib/persisters.js.gz +0 -0
  273. package/lib/queries.js +1 -1
  274. package/lib/queries.js.gz +0 -0
  275. package/lib/relationships.js +1 -1
  276. package/lib/relationships.js.gz +0 -0
  277. package/lib/store.js +1 -1
  278. package/lib/store.js.gz +0 -0
  279. package/lib/synchronizers/synchronizer-local.js +1 -0
  280. package/lib/synchronizers/synchronizer-local.js.gz +0 -0
  281. package/lib/synchronizers/synchronizer-ws-client.js +1 -0
  282. package/lib/synchronizers/synchronizer-ws-client.js.gz +0 -0
  283. package/lib/synchronizers/synchronizer-ws-server.js +1 -0
  284. package/lib/synchronizers/synchronizer-ws-server.js.gz +0 -0
  285. package/lib/synchronizers.js +1 -0
  286. package/lib/synchronizers.js.gz +0 -0
  287. package/lib/tinybase.js +1 -1
  288. package/lib/tinybase.js.gz +0 -0
  289. package/lib/tools.js +1 -1
  290. package/lib/tools.js.gz +0 -0
  291. package/lib/types/checkpoints.d.ts +2 -2
  292. package/lib/types/indexes.d.ts +2 -2
  293. package/lib/types/mergeable-store.d.ts +214 -0
  294. package/lib/types/metrics.d.ts +2 -2
  295. package/lib/types/persisters/persister-automerge.d.ts +11 -7
  296. package/lib/types/persisters/persister-browser.d.ts +13 -4
  297. package/lib/types/persisters/persister-cr-sqlite-wasm.d.ts +4 -0
  298. package/lib/types/persisters/persister-electric-sql.d.ts +4 -0
  299. package/lib/types/persisters/persister-expo-sqlite-next.d.ts +4 -0
  300. package/lib/types/persisters/persister-expo-sqlite.d.ts +4 -0
  301. package/lib/types/persisters/persister-file.d.ts +7 -2
  302. package/lib/types/persisters/persister-indexed-db.d.ts +4 -0
  303. package/lib/types/persisters/persister-libsql.d.ts +142 -0
  304. package/lib/types/persisters/persister-partykit-client.d.ts +4 -0
  305. package/lib/types/persisters/persister-partykit-server.d.ts +12 -8
  306. package/lib/types/persisters/persister-powersync.d.ts +157 -0
  307. package/lib/types/persisters/persister-remote.d.ts +4 -0
  308. package/lib/types/persisters/persister-sqlite-wasm.d.ts +4 -0
  309. package/lib/types/persisters/persister-sqlite3.d.ts +4 -0
  310. package/lib/types/persisters/persister-yjs.d.ts +6 -2
  311. package/lib/types/persisters.d.ts +162 -59
  312. package/lib/types/queries.d.ts +2 -2
  313. package/lib/types/relationships.d.ts +2 -2
  314. package/lib/types/store.d.ts +275 -187
  315. package/lib/types/synchronizers/synchronizer-local.d.ts +27 -0
  316. package/lib/types/synchronizers/synchronizer-ws-client.d.ts +35 -0
  317. package/lib/types/synchronizers/synchronizer-ws-server.d.ts +57 -0
  318. package/lib/types/synchronizers.d.ts +132 -0
  319. package/lib/types/tinybase.d.ts +10 -8
  320. package/lib/types/tools.d.ts +4 -4
  321. package/lib/types/ui-react.d.ts +160 -9
  322. package/lib/types/with-schemas/checkpoints.d.ts +2 -2
  323. package/lib/types/with-schemas/indexes.d.ts +2 -2
  324. package/lib/types/with-schemas/internal/store.d.ts +4 -0
  325. package/lib/types/with-schemas/mergeable-store.d.ts +492 -0
  326. package/lib/types/with-schemas/metrics.d.ts +2 -2
  327. package/lib/types/with-schemas/persisters/persister-automerge.d.ts +12 -8
  328. package/lib/types/with-schemas/persisters/persister-browser.d.ts +17 -8
  329. package/lib/types/with-schemas/persisters/persister-cr-sqlite-wasm.d.ts +5 -1
  330. package/lib/types/with-schemas/persisters/persister-electric-sql.d.ts +5 -1
  331. package/lib/types/with-schemas/persisters/persister-expo-sqlite-next.d.ts +5 -1
  332. package/lib/types/with-schemas/persisters/persister-expo-sqlite.d.ts +5 -1
  333. package/lib/types/with-schemas/persisters/persister-file.d.ts +9 -4
  334. package/lib/types/with-schemas/persisters/persister-indexed-db.d.ts +5 -1
  335. package/lib/types/with-schemas/persisters/persister-libsql.d.ts +155 -0
  336. package/lib/types/with-schemas/persisters/persister-partykit-client.d.ts +5 -1
  337. package/lib/types/with-schemas/persisters/persister-partykit-server.d.ts +15 -11
  338. package/lib/types/with-schemas/persisters/persister-powersync.d.ts +170 -0
  339. package/lib/types/with-schemas/persisters/persister-remote.d.ts +5 -1
  340. package/lib/types/with-schemas/persisters/persister-sqlite-wasm.d.ts +5 -1
  341. package/lib/types/with-schemas/persisters/persister-sqlite3.d.ts +5 -1
  342. package/lib/types/with-schemas/persisters/persister-yjs.d.ts +7 -3
  343. package/lib/types/with-schemas/persisters.d.ts +193 -121
  344. package/lib/types/with-schemas/queries.d.ts +3 -3
  345. package/lib/types/with-schemas/relationships.d.ts +2 -2
  346. package/lib/types/with-schemas/store.d.ts +483 -345
  347. package/lib/types/with-schemas/synchronizers/synchronizer-local.d.ts +29 -0
  348. package/lib/types/with-schemas/synchronizers/synchronizer-ws-client.d.ts +41 -0
  349. package/lib/types/with-schemas/synchronizers/synchronizer-ws-server.d.ts +57 -0
  350. package/lib/types/with-schemas/synchronizers.d.ts +146 -0
  351. package/lib/types/with-schemas/tinybase.d.ts +9 -8
  352. package/lib/types/with-schemas/tools.d.ts +4 -4
  353. package/lib/types/with-schemas/ui-react.d.ts +177 -9
  354. package/lib/ui-react-dom.js +1 -1
  355. package/lib/ui-react-dom.js.gz +0 -0
  356. package/lib/ui-react.js +1 -1
  357. package/lib/ui-react.js.gz +0 -0
  358. package/lib/umd/checkpoints.js +1 -1
  359. package/lib/umd/checkpoints.js.gz +0 -0
  360. package/lib/umd/indexes.js +1 -1
  361. package/lib/umd/indexes.js.gz +0 -0
  362. package/lib/umd/mergeable-store.js +1 -0
  363. package/lib/umd/mergeable-store.js.gz +0 -0
  364. package/lib/umd/metrics.js +1 -1
  365. package/lib/umd/metrics.js.gz +0 -0
  366. package/lib/umd/persisters/persister-automerge.js +1 -1
  367. package/lib/umd/persisters/persister-automerge.js.gz +0 -0
  368. package/lib/umd/persisters/persister-browser.js +1 -1
  369. package/lib/umd/persisters/persister-browser.js.gz +0 -0
  370. package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
  371. package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  372. package/lib/umd/persisters/persister-electric-sql.js +1 -1
  373. package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
  374. package/lib/umd/persisters/persister-expo-sqlite-next.js +1 -1
  375. package/lib/umd/persisters/persister-expo-sqlite-next.js.gz +0 -0
  376. package/lib/umd/persisters/persister-expo-sqlite.js +1 -1
  377. package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
  378. package/lib/umd/persisters/persister-file.js +1 -1
  379. package/lib/umd/persisters/persister-file.js.gz +0 -0
  380. package/lib/umd/persisters/persister-indexed-db.js +1 -1
  381. package/lib/umd/persisters/persister-indexed-db.js.gz +0 -0
  382. package/lib/umd/persisters/persister-libsql.js +1 -0
  383. package/lib/umd/persisters/persister-libsql.js.gz +0 -0
  384. package/lib/umd/persisters/persister-partykit-client.js +1 -1
  385. package/lib/umd/persisters/persister-partykit-client.js.gz +0 -0
  386. package/lib/umd/persisters/persister-partykit-server.js +1 -1
  387. package/lib/umd/persisters/persister-partykit-server.js.gz +0 -0
  388. package/lib/umd/persisters/persister-powersync.js +1 -0
  389. package/lib/umd/persisters/persister-powersync.js.gz +0 -0
  390. package/lib/umd/persisters/persister-remote.js +1 -1
  391. package/lib/umd/persisters/persister-remote.js.gz +0 -0
  392. package/lib/umd/persisters/persister-sqlite-wasm.js +1 -1
  393. package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
  394. package/lib/umd/persisters/persister-sqlite3.js +1 -1
  395. package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
  396. package/lib/umd/persisters/persister-yjs.js +1 -1
  397. package/lib/umd/persisters/persister-yjs.js.gz +0 -0
  398. package/lib/umd/persisters.js +1 -1
  399. package/lib/umd/persisters.js.gz +0 -0
  400. package/lib/umd/queries.js +1 -1
  401. package/lib/umd/queries.js.gz +0 -0
  402. package/lib/umd/relationships.js +1 -1
  403. package/lib/umd/relationships.js.gz +0 -0
  404. package/lib/umd/store.js +1 -1
  405. package/lib/umd/store.js.gz +0 -0
  406. package/lib/umd/synchronizers/synchronizer-local.js +1 -0
  407. package/lib/umd/synchronizers/synchronizer-local.js.gz +0 -0
  408. package/lib/umd/synchronizers/synchronizer-ws-client.js +1 -0
  409. package/lib/umd/synchronizers/synchronizer-ws-client.js.gz +0 -0
  410. package/lib/umd/synchronizers/synchronizer-ws-server.js +1 -0
  411. package/lib/umd/synchronizers/synchronizer-ws-server.js.gz +0 -0
  412. package/lib/umd/synchronizers.js +1 -0
  413. package/lib/umd/synchronizers.js.gz +0 -0
  414. package/lib/umd/tinybase.js +1 -1
  415. package/lib/umd/tinybase.js.gz +0 -0
  416. package/lib/umd/tools.js +1 -1
  417. package/lib/umd/tools.js.gz +0 -0
  418. package/lib/umd/ui-react-dom-debug.js +1 -1
  419. package/lib/umd/ui-react-dom-debug.js.gz +0 -0
  420. package/lib/umd/ui-react-dom.js +1 -1
  421. package/lib/umd/ui-react-dom.js.gz +0 -0
  422. package/lib/umd/ui-react.js +1 -1
  423. package/lib/umd/ui-react.js.gz +0 -0
  424. package/lib/umd-es6/checkpoints.js +1 -1
  425. package/lib/umd-es6/checkpoints.js.gz +0 -0
  426. package/lib/umd-es6/indexes.js +1 -1
  427. package/lib/umd-es6/indexes.js.gz +0 -0
  428. package/lib/umd-es6/mergeable-store.js +1 -0
  429. package/lib/umd-es6/mergeable-store.js.gz +0 -0
  430. package/lib/umd-es6/metrics.js +1 -1
  431. package/lib/umd-es6/metrics.js.gz +0 -0
  432. package/lib/umd-es6/persisters/persister-automerge.js +1 -1
  433. package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
  434. package/lib/umd-es6/persisters/persister-browser.js +1 -1
  435. package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
  436. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  437. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  438. package/lib/umd-es6/persisters/persister-electric-sql.js +1 -1
  439. package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
  440. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js +1 -1
  441. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  442. package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -1
  443. package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
  444. package/lib/umd-es6/persisters/persister-file.js +1 -1
  445. package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
  446. package/lib/umd-es6/persisters/persister-indexed-db.js +1 -1
  447. package/lib/umd-es6/persisters/persister-indexed-db.js.gz +0 -0
  448. package/lib/umd-es6/persisters/persister-libsql.js +1 -0
  449. package/lib/umd-es6/persisters/persister-libsql.js.gz +0 -0
  450. package/lib/umd-es6/persisters/persister-partykit-client.js +1 -1
  451. package/lib/umd-es6/persisters/persister-partykit-client.js.gz +0 -0
  452. package/lib/umd-es6/persisters/persister-partykit-server.js +1 -1
  453. package/lib/umd-es6/persisters/persister-partykit-server.js.gz +0 -0
  454. package/lib/umd-es6/persisters/persister-powersync.js +1 -0
  455. package/lib/umd-es6/persisters/persister-powersync.js.gz +0 -0
  456. package/lib/umd-es6/persisters/persister-remote.js +1 -1
  457. package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
  458. package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -1
  459. package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  460. package/lib/umd-es6/persisters/persister-sqlite3.js +1 -1
  461. package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
  462. package/lib/umd-es6/persisters/persister-yjs.js +1 -1
  463. package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
  464. package/lib/umd-es6/persisters.js +1 -1
  465. package/lib/umd-es6/persisters.js.gz +0 -0
  466. package/lib/umd-es6/queries.js +1 -1
  467. package/lib/umd-es6/queries.js.gz +0 -0
  468. package/lib/umd-es6/relationships.js +1 -1
  469. package/lib/umd-es6/relationships.js.gz +0 -0
  470. package/lib/umd-es6/store.js +1 -1
  471. package/lib/umd-es6/store.js.gz +0 -0
  472. package/lib/umd-es6/synchronizers/synchronizer-local.js +1 -0
  473. package/lib/umd-es6/synchronizers/synchronizer-local.js.gz +0 -0
  474. package/lib/umd-es6/synchronizers/synchronizer-ws-client.js +1 -0
  475. package/lib/umd-es6/synchronizers/synchronizer-ws-client.js.gz +0 -0
  476. package/lib/umd-es6/synchronizers/synchronizer-ws-server.js +1 -0
  477. package/lib/umd-es6/synchronizers/synchronizer-ws-server.js.gz +0 -0
  478. package/lib/umd-es6/synchronizers.js +1 -0
  479. package/lib/umd-es6/synchronizers.js.gz +0 -0
  480. package/lib/umd-es6/tinybase.js +1 -1
  481. package/lib/umd-es6/tinybase.js.gz +0 -0
  482. package/lib/umd-es6/tools.js +1 -1
  483. package/lib/umd-es6/tools.js.gz +0 -0
  484. package/lib/umd-es6/ui-react-dom-debug.js +1 -1
  485. package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
  486. package/lib/umd-es6/ui-react-dom.js +1 -1
  487. package/lib/umd-es6/ui-react-dom.js.gz +0 -0
  488. package/lib/umd-es6/ui-react.js +1 -1
  489. package/lib/umd-es6/ui-react.js.gz +0 -0
  490. package/package.json +65 -45
  491. package/readme.md +2 -2
@@ -0,0 +1,924 @@
1
+ const getTypeOf = (thing) => typeof thing;
2
+ const TINYBASE = 'tinybase';
3
+ const EMPTY_STRING = '';
4
+ const COMMA = ',';
5
+ const STRING = getTypeOf(EMPTY_STRING);
6
+ const strRepeat = (str, count) => str.repeat(count);
7
+
8
+ const promise = Promise;
9
+ const startInterval = (callback, sec, immediate) => {
10
+ immediate && callback();
11
+ return setInterval(callback, sec * 1e3);
12
+ };
13
+ const stopInterval = clearInterval;
14
+ const isInstanceOf = (thing, cls) => thing instanceof cls;
15
+ const isUndefined = (thing) => thing == void 0;
16
+ const ifNotUndefined = (value, then, otherwise) =>
17
+ isUndefined(value) ? otherwise?.() : then(value);
18
+ const isString = (thing) => getTypeOf(thing) == STRING;
19
+ const isArray = (thing) => Array.isArray(thing);
20
+ const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
21
+ const size = (arrayOrString) => arrayOrString.length;
22
+ const promiseAll = async (promises) => promise.all(promises);
23
+
24
+ const SINGLE_ROW_ID = '_';
25
+ const DEFAULT_ROW_ID_COLUMN_NAME = '_id';
26
+ const escapeId = (str) => `"${str.replace(/"/g, '""')}"`;
27
+ const SELECT = 'SELECT';
28
+
29
+ const arrayJoin = (array, sep = EMPTY_STRING) => array.join(sep);
30
+ const arrayMap = (array, cb) => array.map(cb);
31
+ const arrayIsEmpty = (array) => size(array) == 0;
32
+ const arrayFilter = (array, cb) => array.filter(cb);
33
+ const arrayPush = (array, ...values) => array.push(...values);
34
+ const arrayShift = (array) => array.shift();
35
+
36
+ const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
37
+ const collValues = (coll) => [...(coll?.values() ?? [])];
38
+ const collForEach = (coll, cb) => coll?.forEach(cb);
39
+ const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
40
+
41
+ const object = Object;
42
+ const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
43
+ const objEntries = object.entries;
44
+ const isObject = (obj) =>
45
+ !isUndefined(obj) &&
46
+ ifNotUndefined(
47
+ getPrototypeOf(obj),
48
+ (objPrototype) =>
49
+ objPrototype == object.prototype ||
50
+ isUndefined(getPrototypeOf(objPrototype)),
51
+ /* istanbul ignore next */
52
+ () => true,
53
+ );
54
+ const objIds = object.keys;
55
+ const objFreeze = object.freeze;
56
+ const objNew = (entries = []) => object.fromEntries(entries);
57
+ const objMerge = (...objs) => object.assign({}, ...objs);
58
+ const objHas = (obj, id) => id in obj;
59
+ const objDel = (obj, id) => {
60
+ delete obj[id];
61
+ return obj;
62
+ };
63
+ const objToArray = (obj, cb) =>
64
+ arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
65
+ const objValues = (obj) => object.values(obj);
66
+ const objSize = (obj) => size(objIds(obj));
67
+ const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
68
+
69
+ const mapNew = (entries) => new Map(entries);
70
+ const mapKeys = (map) => [...(map?.keys() ?? [])];
71
+ const mapGet = (map, key) => map?.get(key);
72
+ const mapForEach = (map, cb) =>
73
+ collForEach(map, (value, key) => cb(key, value));
74
+ const mapMap = (coll, cb) =>
75
+ arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
76
+ const mapSet = (map, key, value) =>
77
+ isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
78
+ const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
79
+ if (!collHas(map, key)) {
80
+ mapSet(map, key, getDefaultValue());
81
+ } else {
82
+ hadExistingValue?.(mapGet(map, key));
83
+ }
84
+ return mapGet(map, key);
85
+ };
86
+ const mapMatch = (map, obj, set, del = mapSet) => {
87
+ objToArray(obj, (value, id) => set(map, id, value));
88
+ mapForEach(map, (id) => (objHas(obj, id) ? 0 : del(map, id)));
89
+ return map;
90
+ };
91
+
92
+ const setNew = (entryOrEntries) =>
93
+ new Set(
94
+ isArray(entryOrEntries) || isUndefined(entryOrEntries)
95
+ ? entryOrEntries
96
+ : [entryOrEntries],
97
+ );
98
+ const setAdd = (set, value) => set?.add(value);
99
+
100
+ const TABLE = 'TABLE';
101
+ const ALTER_TABLE = 'ALTER ' + TABLE;
102
+ const DELETE_FROM = 'DELETE FROM';
103
+ const SELECT_STAR_FROM = SELECT + '*FROM';
104
+ const FROM_PRAGMA_TABLE = 'FROM pragma_table_';
105
+ const WHERE = 'WHERE';
106
+ const getCommandFunctions = (
107
+ cmd,
108
+ managedTableNames,
109
+ onIgnoredError,
110
+ useOnConflict,
111
+ ) => {
112
+ const schemaMap = mapNew();
113
+ const canSelect = (tableName, rowIdColumnName) =>
114
+ !isUndefined(mapGet(mapGet(schemaMap, tableName), rowIdColumnName));
115
+ const refreshSchema = async () =>
116
+ mapMatch(
117
+ schemaMap,
118
+ objNew(
119
+ await promiseAll(
120
+ arrayMap(
121
+ await cmd(
122
+ 'SELECT name ' +
123
+ FROM_PRAGMA_TABLE +
124
+ `list WHERE schema='main'AND(type='table'OR type='view')AND name IN(` +
125
+ getPlaceholders(managedTableNames) +
126
+ `)ORDER BY name`,
127
+ managedTableNames,
128
+ ),
129
+ async ({name: tableName}) => [
130
+ tableName,
131
+ objNew(
132
+ arrayMap(
133
+ await cmd(
134
+ SELECT + ' name,type ' + FROM_PRAGMA_TABLE + 'info(?)',
135
+ [tableName],
136
+ ),
137
+ ({name: columnName, type}) => [columnName, type],
138
+ ),
139
+ ),
140
+ ],
141
+ ),
142
+ ),
143
+ ),
144
+ (_, tableName, tableSchema) =>
145
+ mapSet(
146
+ schemaMap,
147
+ tableName,
148
+ mapMatch(
149
+ mapEnsure(schemaMap, tableName, mapNew),
150
+ tableSchema,
151
+ (tableSchemaMap, columnName, value) => {
152
+ if (value != mapGet(tableSchemaMap, columnName)) {
153
+ mapSet(tableSchemaMap, columnName, value);
154
+ }
155
+ },
156
+ (tableSchema2, columnName) => mapSet(tableSchema2, columnName),
157
+ ),
158
+ ),
159
+ (_, name) => mapSet(schemaMap, name),
160
+ );
161
+ const loadTable = async (tableName, rowIdColumnName) =>
162
+ canSelect(tableName, rowIdColumnName)
163
+ ? objNew(
164
+ arrayFilter(
165
+ arrayMap(
166
+ await cmd(SELECT_STAR_FROM + escapeId(tableName)),
167
+ (row) => [
168
+ row[rowIdColumnName],
169
+ objDel({...row}, rowIdColumnName),
170
+ ],
171
+ ),
172
+ ([rowId, row]) => !isUndefined(rowId) && !objIsEmpty(row),
173
+ ),
174
+ )
175
+ : {};
176
+ const saveTable = async (
177
+ tableName,
178
+ rowIdColumnName,
179
+ content,
180
+ deleteEmptyColumns,
181
+ deleteEmptyTable,
182
+ partial = false,
183
+ ) => {
184
+ const tableCellOrValueIds = setNew();
185
+ objToArray(content ?? {}, (contentRow) =>
186
+ arrayMap(objIds(contentRow ?? {}), (cellOrValueId) =>
187
+ setAdd(tableCellOrValueIds, cellOrValueId),
188
+ ),
189
+ );
190
+ const tableColumnNames = collValues(tableCellOrValueIds);
191
+ if (
192
+ !partial &&
193
+ deleteEmptyTable &&
194
+ arrayIsEmpty(tableColumnNames) &&
195
+ collHas(schemaMap, tableName)
196
+ ) {
197
+ await cmd('DROP ' + TABLE + escapeId(tableName));
198
+ mapSet(schemaMap, tableName);
199
+ return;
200
+ }
201
+ if (!arrayIsEmpty(tableColumnNames) && !collHas(schemaMap, tableName)) {
202
+ await cmd(
203
+ `CREATE ` +
204
+ TABLE +
205
+ escapeId(tableName) +
206
+ '(' +
207
+ escapeId(rowIdColumnName) +
208
+ ` PRIMARY KEY ON CONFLICT REPLACE${arrayJoin(
209
+ arrayMap(tableColumnNames, (cellId) => COMMA + escapeId(cellId)),
210
+ )});`,
211
+ );
212
+ mapSet(
213
+ schemaMap,
214
+ tableName,
215
+ mapNew([
216
+ [rowIdColumnName, EMPTY_STRING],
217
+ ...arrayMap(tableColumnNames, (columnName) => [
218
+ columnName,
219
+ EMPTY_STRING,
220
+ ]),
221
+ ]),
222
+ );
223
+ } else {
224
+ const tableSchemaMap = mapGet(schemaMap, tableName);
225
+ const columnNamesAccountedFor = setNew(mapKeys(tableSchemaMap));
226
+ await promiseAll([
227
+ ...arrayMap(tableColumnNames, async (columnName) => {
228
+ if (!collDel(columnNamesAccountedFor, columnName)) {
229
+ await cmd(
230
+ ALTER_TABLE + escapeId(tableName) + 'ADD' + escapeId(columnName),
231
+ );
232
+ mapSet(tableSchemaMap, columnName, EMPTY_STRING);
233
+ }
234
+ }),
235
+ ...(!partial && deleteEmptyColumns
236
+ ? arrayMap(
237
+ collValues(columnNamesAccountedFor),
238
+ async (columnName) => {
239
+ if (columnName != rowIdColumnName) {
240
+ await cmd(
241
+ ALTER_TABLE +
242
+ escapeId(tableName) +
243
+ 'DROP' +
244
+ escapeId(columnName),
245
+ );
246
+ mapSet(tableSchemaMap, columnName);
247
+ }
248
+ },
249
+ )
250
+ : []),
251
+ ]);
252
+ }
253
+ if (partial) {
254
+ if (isUndefined(content)) {
255
+ await cmd(DELETE_FROM + escapeId(tableName) + WHERE + ' 1');
256
+ } else {
257
+ await promiseAll(
258
+ objToArray(content, async (row, rowId) => {
259
+ if (isUndefined(row)) {
260
+ await cmd(
261
+ DELETE_FROM +
262
+ escapeId(tableName) +
263
+ WHERE +
264
+ escapeId(rowIdColumnName) +
265
+ '=?',
266
+ [rowId],
267
+ );
268
+ } else if (!arrayIsEmpty(tableColumnNames)) {
269
+ await upsert(
270
+ cmd,
271
+ tableName,
272
+ rowIdColumnName,
273
+ objIds(row),
274
+ [rowId, ...objValues(row)],
275
+ useOnConflict,
276
+ );
277
+ }
278
+ }),
279
+ );
280
+ }
281
+ } else {
282
+ if (!arrayIsEmpty(tableColumnNames)) {
283
+ const changingColumnNames = arrayFilter(
284
+ mapKeys(mapGet(schemaMap, tableName)),
285
+ (columnName) => columnName != rowIdColumnName,
286
+ );
287
+ const args = [];
288
+ const deleteRowIds = [];
289
+ objToArray(content ?? {}, (row, rowId) => {
290
+ arrayPush(
291
+ args,
292
+ rowId,
293
+ ...arrayMap(changingColumnNames, (cellId) => row?.[cellId]),
294
+ );
295
+ arrayPush(deleteRowIds, rowId);
296
+ });
297
+ await upsert(
298
+ cmd,
299
+ tableName,
300
+ rowIdColumnName,
301
+ changingColumnNames,
302
+ args,
303
+ useOnConflict,
304
+ );
305
+ await cmd(
306
+ DELETE_FROM +
307
+ escapeId(tableName) +
308
+ WHERE +
309
+ escapeId(rowIdColumnName) +
310
+ 'NOT IN(' +
311
+ getPlaceholders(deleteRowIds) +
312
+ ')',
313
+ deleteRowIds,
314
+ );
315
+ } else if (collHas(schemaMap, tableName)) {
316
+ await cmd(DELETE_FROM + escapeId(tableName) + WHERE + ' 1');
317
+ }
318
+ }
319
+ };
320
+ const transaction = async (actions) => {
321
+ let result;
322
+ await cmd('BEGIN');
323
+ try {
324
+ result = await actions();
325
+ } catch (error) {
326
+ onIgnoredError?.(error);
327
+ }
328
+ await cmd('END');
329
+ return result;
330
+ };
331
+ return [refreshSchema, loadTable, saveTable, transaction];
332
+ };
333
+ const upsert = async (
334
+ cmd,
335
+ tableName,
336
+ rowIdColumnName,
337
+ changingColumnNames,
338
+ args,
339
+ useOnConflict = true,
340
+ ) =>
341
+ await cmd(
342
+ 'INSERT ' +
343
+ (useOnConflict ? EMPTY_STRING : 'OR REPLACE ') +
344
+ 'INTO' +
345
+ escapeId(tableName) +
346
+ '(' +
347
+ escapeId(rowIdColumnName) +
348
+ arrayJoin(
349
+ arrayMap(
350
+ changingColumnNames,
351
+ (columnName) => COMMA + escapeId(columnName),
352
+ ),
353
+ ) +
354
+ ')VALUES' +
355
+ slice(
356
+ strRepeat(
357
+ `,(?${strRepeat(',?', size(changingColumnNames))})`,
358
+ size(args) / (size(changingColumnNames) + 1),
359
+ ),
360
+ 1,
361
+ ) +
362
+ (useOnConflict
363
+ ? 'ON CONFLICT(' +
364
+ escapeId(rowIdColumnName) +
365
+ ')DO UPDATE SET' +
366
+ arrayJoin(
367
+ arrayMap(
368
+ changingColumnNames,
369
+ (columnName) =>
370
+ escapeId(columnName) + '=excluded.' + escapeId(columnName),
371
+ ),
372
+ COMMA,
373
+ )
374
+ : EMPTY_STRING),
375
+ arrayMap(args, (arg) => arg ?? null),
376
+ );
377
+ const getPlaceholders = (array) =>
378
+ arrayJoin(
379
+ arrayMap(array, () => '?'),
380
+ COMMA,
381
+ );
382
+
383
+ const jsonStringWithMap = (obj) =>
384
+ JSON.stringify(obj, (_key, value) =>
385
+ isInstanceOf(value, Map) ? object.fromEntries([...value]) : value,
386
+ );
387
+ const jsonParse = JSON.parse;
388
+
389
+ const scheduleRunning = mapNew();
390
+ const scheduleActions = mapNew();
391
+ const getStoreFunctions = (supportedStoreType = 1, store) =>
392
+ supportedStoreType > 1 && 'getMergeableContent' in store
393
+ ? [
394
+ 1,
395
+ store.getMergeableContent,
396
+ store.getTransactionMergeableChanges,
397
+ ([[changedTables], [changedValues]]) =>
398
+ !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
399
+ store.setDefaultContent,
400
+ ]
401
+ : supportedStoreType != 2
402
+ ? [
403
+ 0,
404
+ store.getContent,
405
+ store.getTransactionChanges,
406
+ ([changedTables, changedValues]) =>
407
+ !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
408
+ store.setContent,
409
+ ]
410
+ : /* istanbul ignore next */
411
+ 0;
412
+ const createCustomPersister = (
413
+ store,
414
+ getPersisted,
415
+ setPersisted,
416
+ addPersisterListener,
417
+ delPersisterListener,
418
+ onIgnoredError,
419
+ supportedStoreType,
420
+ extra = {},
421
+ scheduleId = [],
422
+ ) => {
423
+ let loadSave = 0;
424
+ let loads = 0;
425
+ let saves = 0;
426
+ let action;
427
+ let autoLoadHandle;
428
+ let autoSaveListenerId;
429
+ mapEnsure(scheduleRunning, scheduleId, () => 0);
430
+ mapEnsure(scheduleActions, scheduleId, () => []);
431
+ const [
432
+ isMergeableStore,
433
+ getContent,
434
+ getChanges,
435
+ hasChanges,
436
+ setDefaultContent,
437
+ ] = getStoreFunctions(supportedStoreType, store);
438
+ const run = async () => {
439
+ /* istanbul ignore else */
440
+ if (!mapGet(scheduleRunning, scheduleId)) {
441
+ mapSet(scheduleRunning, scheduleId, 1);
442
+ while (
443
+ !isUndefined((action = arrayShift(mapGet(scheduleActions, scheduleId))))
444
+ ) {
445
+ try {
446
+ await action();
447
+ } catch (error) {
448
+ /* istanbul ignore next */
449
+ onIgnoredError?.(error);
450
+ }
451
+ }
452
+ mapSet(scheduleRunning, scheduleId, 0);
453
+ }
454
+ };
455
+ const setContentOrChanges = (contentOrChanges) => {
456
+ (isMergeableStore && isArray(contentOrChanges?.[0])
457
+ ? contentOrChanges?.[2] === 1
458
+ ? store.applyMergeableChanges
459
+ : store.setMergeableContent
460
+ : contentOrChanges?.[2] === 1
461
+ ? store.applyChanges
462
+ : store.setContent)(contentOrChanges);
463
+ };
464
+ const load = async (initialContent) => {
465
+ /* istanbul ignore else */
466
+ if (loadSave != 2) {
467
+ loadSave = 1;
468
+ {
469
+ loads++;
470
+ }
471
+ await schedule(async () => {
472
+ try {
473
+ setContentOrChanges(await getPersisted());
474
+ } catch (error) {
475
+ onIgnoredError?.(error);
476
+ if (initialContent) {
477
+ setDefaultContent(initialContent);
478
+ }
479
+ }
480
+ loadSave = 0;
481
+ });
482
+ }
483
+ return persister;
484
+ };
485
+ const startAutoLoad = async (initialContent) => {
486
+ await stopAutoLoad().load(initialContent);
487
+ autoLoadHandle = addPersisterListener(async (content, changes) => {
488
+ if (changes || content) {
489
+ /* istanbul ignore else */
490
+ if (loadSave != 2) {
491
+ loadSave = 1;
492
+ {
493
+ loads++;
494
+ }
495
+ setContentOrChanges(changes ?? content);
496
+ loadSave = 0;
497
+ }
498
+ } else {
499
+ await load();
500
+ }
501
+ });
502
+ return persister;
503
+ };
504
+ const stopAutoLoad = () => {
505
+ if (autoLoadHandle) {
506
+ delPersisterListener(autoLoadHandle);
507
+ autoLoadHandle = void 0;
508
+ }
509
+ return persister;
510
+ };
511
+ const isAutoLoading = () => !isUndefined(autoLoadHandle);
512
+ const save = async (changes) => {
513
+ /* istanbul ignore else */
514
+ if (loadSave != 1) {
515
+ loadSave = 2;
516
+ {
517
+ saves++;
518
+ }
519
+ await schedule(async () => {
520
+ try {
521
+ await setPersisted(getContent, changes);
522
+ } catch (error) {
523
+ /* istanbul ignore next */
524
+ onIgnoredError?.(error);
525
+ }
526
+ loadSave = 0;
527
+ });
528
+ }
529
+ return persister;
530
+ };
531
+ const startAutoSave = async () => {
532
+ await stopAutoSave().save();
533
+ autoSaveListenerId = store.addDidFinishTransactionListener(() => {
534
+ const changes = getChanges();
535
+ if (hasChanges(changes)) {
536
+ save(changes);
537
+ }
538
+ });
539
+ return persister;
540
+ };
541
+ const stopAutoSave = () => {
542
+ ifNotUndefined(autoSaveListenerId, store.delListener);
543
+ autoSaveListenerId = void 0;
544
+ return persister;
545
+ };
546
+ const isAutoSaving = () => !isUndefined(autoSaveListenerId);
547
+ const schedule = async (...actions) => {
548
+ arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
549
+ await run();
550
+ return persister;
551
+ };
552
+ const getStore = () => store;
553
+ const destroy = () => stopAutoLoad().stopAutoSave();
554
+ const getStats = () => ({loads, saves});
555
+ const persister = {
556
+ load,
557
+ startAutoLoad,
558
+ stopAutoLoad,
559
+ isAutoLoading,
560
+ save,
561
+ startAutoSave,
562
+ stopAutoSave,
563
+ isAutoSaving,
564
+ schedule,
565
+ getStore,
566
+ destroy,
567
+ getStats,
568
+ ...extra,
569
+ };
570
+ return objFreeze(persister);
571
+ };
572
+
573
+ const STORE_COLUMN = 'store';
574
+ const createJsonSqlitePersister = (
575
+ store,
576
+ cmd,
577
+ addPersisterListener,
578
+ delPersisterListener,
579
+ onIgnoredError,
580
+ [storeTableName],
581
+ managedTableNames,
582
+ db,
583
+ getThing,
584
+ useOnConflict,
585
+ ) => {
586
+ const [refreshSchema, loadTable, saveTable, transaction] =
587
+ getCommandFunctions(cmd, managedTableNames, onIgnoredError, useOnConflict);
588
+ const getPersisted = async () =>
589
+ await transaction(async () => {
590
+ await refreshSchema();
591
+ return jsonParse(
592
+ (await loadTable(storeTableName, DEFAULT_ROW_ID_COLUMN_NAME))[
593
+ SINGLE_ROW_ID
594
+ ]?.[STORE_COLUMN] ?? 'null',
595
+ );
596
+ });
597
+ const setPersisted = async (getContent) =>
598
+ await transaction(async () => {
599
+ await refreshSchema();
600
+ await saveTable(
601
+ storeTableName,
602
+ DEFAULT_ROW_ID_COLUMN_NAME,
603
+ {
604
+ [SINGLE_ROW_ID]: {
605
+ [STORE_COLUMN]: jsonStringWithMap(getContent() ?? null),
606
+ },
607
+ },
608
+ true,
609
+ true,
610
+ );
611
+ });
612
+ const persister = createCustomPersister(
613
+ store,
614
+ getPersisted,
615
+ setPersisted,
616
+ addPersisterListener,
617
+ delPersisterListener,
618
+ onIgnoredError,
619
+ 1,
620
+ {[getThing]: () => db},
621
+ db,
622
+ );
623
+ return persister;
624
+ };
625
+
626
+ const createTabularSqlitePersister = (
627
+ store,
628
+ cmd,
629
+ addPersisterListener,
630
+ delPersisterListener,
631
+ onIgnoredError,
632
+ [
633
+ tablesLoadConfig,
634
+ tablesSaveConfig,
635
+ [valuesLoad, valuesSave, valuesTableName],
636
+ ],
637
+ managedTableNames,
638
+ db,
639
+ getThing,
640
+ useOnConflict,
641
+ ) => {
642
+ const [refreshSchema, loadTable, saveTable, transaction] =
643
+ getCommandFunctions(cmd, managedTableNames, onIgnoredError, useOnConflict);
644
+ const saveTables = async (tables, partial) =>
645
+ await promiseAll(
646
+ mapMap(
647
+ tablesSaveConfig,
648
+ async (
649
+ [tableName, rowIdColumnName, deleteEmptyColumns, deleteEmptyTable],
650
+ tableId,
651
+ ) => {
652
+ if (!partial || objHas(tables, tableId)) {
653
+ await saveTable(
654
+ tableName,
655
+ rowIdColumnName,
656
+ tables[tableId],
657
+ deleteEmptyColumns,
658
+ deleteEmptyTable,
659
+ partial,
660
+ );
661
+ }
662
+ },
663
+ ),
664
+ );
665
+ const saveValues = async (values, partial) =>
666
+ valuesSave
667
+ ? await saveTable(
668
+ valuesTableName,
669
+ DEFAULT_ROW_ID_COLUMN_NAME,
670
+ {[SINGLE_ROW_ID]: values},
671
+ true,
672
+ true,
673
+ partial,
674
+ )
675
+ : null;
676
+ const loadTables = async () =>
677
+ objNew(
678
+ arrayFilter(
679
+ await promiseAll(
680
+ mapMap(
681
+ tablesLoadConfig,
682
+ async ([tableId, rowIdColumnName], tableName) => [
683
+ tableId,
684
+ await loadTable(tableName, rowIdColumnName),
685
+ ],
686
+ ),
687
+ ),
688
+ (pair) => !objIsEmpty(pair[1]),
689
+ ),
690
+ );
691
+ const loadValues = async () =>
692
+ valuesLoad
693
+ ? (await loadTable(valuesTableName, DEFAULT_ROW_ID_COLUMN_NAME))[
694
+ SINGLE_ROW_ID
695
+ ]
696
+ : {};
697
+ const getPersisted = async () =>
698
+ await transaction(async () => {
699
+ await refreshSchema();
700
+ const tables = await loadTables();
701
+ const values = await loadValues();
702
+ return !objIsEmpty(tables) || !isUndefined(values)
703
+ ? [tables, values]
704
+ : void 0;
705
+ });
706
+ const setPersisted = async (getContent, changes) =>
707
+ await transaction(async () => {
708
+ await refreshSchema();
709
+ if (!isUndefined(changes)) {
710
+ await saveTables(changes[0], true);
711
+ await saveValues(changes[1], true);
712
+ } else {
713
+ const [tables, values] = getContent();
714
+ await saveTables(tables);
715
+ await saveValues(values);
716
+ }
717
+ });
718
+ const persister = createCustomPersister(
719
+ store,
720
+ getPersisted,
721
+ setPersisted,
722
+ addPersisterListener,
723
+ delPersisterListener,
724
+ onIgnoredError,
725
+ 1,
726
+ {[getThing]: () => db},
727
+ db,
728
+ );
729
+ return persister;
730
+ };
731
+
732
+ const JSON$1 = 'json';
733
+ const AUTO_LOAD_INTERVAL_SECONDS = 'autoLoadIntervalSeconds';
734
+ const STORE_TABLE_NAME = 'storeTableName';
735
+ const ROW_ID_COLUMN_NAME = 'rowIdColumnName';
736
+ const TABLE_ID = 'tableId';
737
+ const TABLE_NAME = 'tableName';
738
+ const DELETE_EMPTY_COLUMNS = 'deleteEmptyColumns';
739
+ const DELETE_EMPTY_TABLE = 'deleteEmptyTable';
740
+ const DEFAULT_CONFIG = {
741
+ mode: JSON$1,
742
+ [AUTO_LOAD_INTERVAL_SECONDS]: 1,
743
+ };
744
+ const DEFAULT_TABULAR_VALUES_CONFIG = {
745
+ load: 0,
746
+ save: 0,
747
+ [TABLE_NAME]: TINYBASE + '_values',
748
+ };
749
+ const getDefaultedConfig = (configOrStoreTableName) =>
750
+ objMerge(
751
+ DEFAULT_CONFIG,
752
+ isString(configOrStoreTableName)
753
+ ? {[STORE_TABLE_NAME]: configOrStoreTableName}
754
+ : configOrStoreTableName ?? {},
755
+ );
756
+ const getDefaultedTabularConfigMap = (
757
+ configsObj,
758
+ defaultObj,
759
+ tableField,
760
+ filter,
761
+ ) => {
762
+ const configMap = mapNew();
763
+ objToArray(configsObj, (configObj, id) => {
764
+ const defaultedConfig = slice(
765
+ objValues(
766
+ objMerge(
767
+ defaultObj,
768
+ isString(configObj) ? {[tableField]: configObj} : configObj,
769
+ ),
770
+ ),
771
+ 0,
772
+ objSize(defaultObj),
773
+ );
774
+ if (!isUndefined(defaultedConfig[0]) && !filter(id, defaultedConfig[0])) {
775
+ mapSet(configMap, id, defaultedConfig);
776
+ }
777
+ });
778
+ return configMap;
779
+ };
780
+ const getConfigStructures = (configOrStoreTableName) => {
781
+ const config = getDefaultedConfig(configOrStoreTableName);
782
+ const autoLoadIntervalSeconds = config[AUTO_LOAD_INTERVAL_SECONDS];
783
+ if (config.mode == JSON$1) {
784
+ const {storeTableName = TINYBASE} = config;
785
+ return [
786
+ 1,
787
+ autoLoadIntervalSeconds,
788
+ [storeTableName],
789
+ setNew(storeTableName),
790
+ ];
791
+ }
792
+ const {tables: {load = {}, save = {}} = {}, values = {}} = config;
793
+ const valuesConfig = slice(
794
+ objValues(objMerge(DEFAULT_TABULAR_VALUES_CONFIG, values)),
795
+ 0,
796
+ objSize(DEFAULT_TABULAR_VALUES_CONFIG),
797
+ );
798
+ const valuesTable = valuesConfig[2];
799
+ const managedTableNames = setNew(valuesTable);
800
+ const tabularConfig = [
801
+ getDefaultedTabularConfigMap(
802
+ load,
803
+ {[TABLE_ID]: null, [ROW_ID_COLUMN_NAME]: DEFAULT_ROW_ID_COLUMN_NAME},
804
+ TABLE_ID,
805
+ (tableName) =>
806
+ setAdd(managedTableNames, tableName) && tableName == valuesTable,
807
+ ),
808
+ getDefaultedTabularConfigMap(
809
+ save,
810
+ {
811
+ [TABLE_NAME]: null,
812
+ [ROW_ID_COLUMN_NAME]: DEFAULT_ROW_ID_COLUMN_NAME,
813
+ [DELETE_EMPTY_COLUMNS]: 0,
814
+ [DELETE_EMPTY_TABLE]: 0,
815
+ },
816
+ TABLE_NAME,
817
+ (_, tableName) =>
818
+ setAdd(managedTableNames, tableName) && tableName == valuesTable,
819
+ ),
820
+ valuesConfig,
821
+ ];
822
+ return [0, autoLoadIntervalSeconds, tabularConfig, managedTableNames];
823
+ };
824
+
825
+ const PRAGMA = 'pragma ';
826
+ const DATA_VERSION = 'data_version';
827
+ const SCHEMA_VERSION = 'schema_version';
828
+ const createSqlitePersister = (
829
+ store,
830
+ configOrStoreTableName,
831
+ cmd,
832
+ addUpdateListener,
833
+ delUpdateListener,
834
+ onSqlCommand,
835
+ onIgnoredError,
836
+ db,
837
+ getThing = 'getDb',
838
+ useOnConflict,
839
+ ) => {
840
+ let dataVersion;
841
+ let schemaVersion;
842
+ let totalChanges;
843
+ const CHANGES_COLUMN = 'c';
844
+ const [
845
+ isJson,
846
+ autoLoadIntervalSeconds,
847
+ defaultedConfig,
848
+ managedTableNamesSet,
849
+ ] = getConfigStructures(configOrStoreTableName);
850
+ const addPersisterListener = (listener) => [
851
+ startInterval(
852
+ async () => {
853
+ try {
854
+ const newDataVersion = (await cmd(PRAGMA + DATA_VERSION))[0][
855
+ DATA_VERSION
856
+ ];
857
+ const newSchemaVersion = (await cmd(PRAGMA + SCHEMA_VERSION))[0][
858
+ SCHEMA_VERSION
859
+ ];
860
+ const newTotalChanges = (
861
+ await cmd(SELECT + ' TOTAL_CHANGES() ' + CHANGES_COLUMN)
862
+ )[0][CHANGES_COLUMN];
863
+ if (
864
+ newDataVersion != (dataVersion ??= newDataVersion) ||
865
+ newSchemaVersion != (schemaVersion ??= newSchemaVersion) ||
866
+ newTotalChanges != (totalChanges ??= newTotalChanges)
867
+ ) {
868
+ listener();
869
+ dataVersion = newDataVersion;
870
+ schemaVersion = newSchemaVersion;
871
+ }
872
+ } catch {}
873
+ },
874
+ autoLoadIntervalSeconds,
875
+ 1,
876
+ ),
877
+ addUpdateListener((tableName) =>
878
+ managedTableNamesSet.has(tableName) ? listener() : 0,
879
+ ),
880
+ ];
881
+ const delPersisterListener = ([interval, listeningHandle]) => {
882
+ stopInterval(interval);
883
+ dataVersion = schemaVersion = null;
884
+ delUpdateListener(listeningHandle);
885
+ };
886
+ return (isJson ? createJsonSqlitePersister : createTabularSqlitePersister)(
887
+ store,
888
+ onSqlCommand
889
+ ? async (sql, args) => {
890
+ onSqlCommand(sql, args);
891
+ return await cmd(sql, args);
892
+ }
893
+ : cmd,
894
+ addPersisterListener,
895
+ delPersisterListener,
896
+ onIgnoredError,
897
+ defaultedConfig,
898
+ collValues(managedTableNamesSet),
899
+ db,
900
+ getThing,
901
+ useOnConflict,
902
+ );
903
+ };
904
+
905
+ const createLibSqlPersister = (
906
+ store,
907
+ client,
908
+ configOrStoreTableName,
909
+ onSqlCommand,
910
+ onIgnoredError,
911
+ ) =>
912
+ createSqlitePersister(
913
+ store,
914
+ configOrStoreTableName,
915
+ async (sql, args = []) => (await client.execute({sql, args})).rows,
916
+ () => () => 0,
917
+ (unsubscribeFunction) => unsubscribeFunction(),
918
+ onSqlCommand,
919
+ onIgnoredError,
920
+ client,
921
+ 'getClient',
922
+ );
923
+
924
+ export {createLibSqlPersister};