tinybase 5.0.0-beta.0 → 5.0.0-beta.10

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