tinybase 5.0.0-beta.5 → 5.0.0-beta.7

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