tinybase 5.0.0-beta.5 → 5.0.0-beta.6

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 (353) 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-sync.cjs +1 -0
  32. package/lib/cjs/persisters/persister-sync.cjs.gz +0 -0
  33. package/lib/cjs/persisters/persister-yjs.cjs +1 -1
  34. package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
  35. package/lib/cjs/persisters.cjs +1 -1
  36. package/lib/cjs/persisters.cjs.gz +0 -0
  37. package/lib/cjs/store.cjs +1 -1
  38. package/lib/cjs/store.cjs.gz +0 -0
  39. package/lib/cjs/tinybase.cjs +1 -1
  40. package/lib/cjs/tinybase.cjs.gz +0 -0
  41. package/lib/cjs/tools.cjs +1 -1
  42. package/lib/cjs/tools.cjs.gz +0 -0
  43. package/lib/cjs/ui-react-dom-debug.cjs +1 -1
  44. package/lib/cjs/ui-react-dom-debug.cjs.gz +0 -0
  45. package/lib/cjs/ui-react.cjs +1 -1
  46. package/lib/cjs/ui-react.cjs.gz +0 -0
  47. package/lib/cjs-es6/mergeable-store.cjs +1 -1
  48. package/lib/cjs-es6/mergeable-store.cjs.gz +0 -0
  49. package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -1
  50. package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
  51. package/lib/cjs-es6/persisters/persister-browser.cjs +1 -1
  52. package/lib/cjs-es6/persisters/persister-browser.cjs.gz +0 -0
  53. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  54. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  55. package/lib/cjs-es6/persisters/persister-electric-sql.cjs +1 -1
  56. package/lib/cjs-es6/persisters/persister-electric-sql.cjs.gz +0 -0
  57. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs +1 -1
  58. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  59. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -1
  60. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
  61. package/lib/cjs-es6/persisters/persister-file.cjs +1 -1
  62. package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
  63. package/lib/cjs-es6/persisters/persister-indexed-db.cjs +1 -1
  64. package/lib/cjs-es6/persisters/persister-indexed-db.cjs.gz +0 -0
  65. package/lib/cjs-es6/persisters/persister-libsql.cjs +1 -1
  66. package/lib/cjs-es6/persisters/persister-libsql.cjs.gz +0 -0
  67. package/lib/cjs-es6/persisters/persister-partykit-client.cjs +1 -1
  68. package/lib/cjs-es6/persisters/persister-partykit-client.cjs.gz +0 -0
  69. package/lib/cjs-es6/persisters/persister-powersync.cjs +1 -0
  70. package/lib/cjs-es6/persisters/persister-powersync.cjs.gz +0 -0
  71. package/lib/cjs-es6/persisters/persister-remote.cjs +1 -1
  72. package/lib/cjs-es6/persisters/persister-remote.cjs.gz +0 -0
  73. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -1
  74. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  75. package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -1
  76. package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
  77. package/lib/cjs-es6/persisters/persister-sync.cjs +1 -0
  78. package/lib/cjs-es6/persisters/persister-sync.cjs.gz +0 -0
  79. package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -1
  80. package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
  81. package/lib/cjs-es6/persisters.cjs +1 -1
  82. package/lib/cjs-es6/persisters.cjs.gz +0 -0
  83. package/lib/cjs-es6/store.cjs +1 -1
  84. package/lib/cjs-es6/store.cjs.gz +0 -0
  85. package/lib/cjs-es6/tinybase.cjs +1 -1
  86. package/lib/cjs-es6/tinybase.cjs.gz +0 -0
  87. package/lib/cjs-es6/tools.cjs +1 -1
  88. package/lib/cjs-es6/tools.cjs.gz +0 -0
  89. package/lib/cjs-es6/ui-react-dom-debug.cjs +1 -1
  90. package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
  91. package/lib/cjs-es6/ui-react.cjs +1 -1
  92. package/lib/cjs-es6/ui-react.cjs.gz +0 -0
  93. package/lib/debug/mergeable-store.js +287 -130
  94. package/lib/debug/persisters/persister-automerge.js +39 -46
  95. package/lib/debug/persisters/persister-browser.js +39 -46
  96. package/lib/debug/persisters/persister-cr-sqlite-wasm.js +64 -60
  97. package/lib/debug/persisters/persister-electric-sql.js +64 -60
  98. package/lib/debug/persisters/persister-expo-sqlite-next.js +64 -60
  99. package/lib/debug/persisters/persister-expo-sqlite.js +64 -60
  100. package/lib/debug/persisters/persister-file.js +39 -46
  101. package/lib/debug/persisters/persister-indexed-db.js +39 -46
  102. package/lib/debug/persisters/persister-libsql.js +64 -60
  103. package/lib/debug/persisters/persister-partykit-client.js +39 -46
  104. package/lib/debug/persisters/persister-powersync.js +917 -0
  105. package/lib/debug/persisters/persister-remote.js +39 -46
  106. package/lib/debug/persisters/persister-sqlite-wasm.js +64 -60
  107. package/lib/debug/persisters/persister-sqlite3.js +64 -60
  108. package/lib/debug/persisters/persister-sync.js +594 -0
  109. package/lib/debug/persisters/persister-yjs.js +41 -48
  110. package/lib/debug/persisters.js +38 -45
  111. package/lib/debug/store.js +44 -32
  112. package/lib/debug/tinybase.js +322 -173
  113. package/lib/debug/tools.js +2 -2
  114. package/lib/debug/ui-react-dom.js +81 -76
  115. package/lib/debug/ui-react.js +1 -1
  116. package/lib/es6/mergeable-store.js +1 -1
  117. package/lib/es6/mergeable-store.js.gz +0 -0
  118. package/lib/es6/persisters/persister-automerge.js +1 -1
  119. package/lib/es6/persisters/persister-automerge.js.gz +0 -0
  120. package/lib/es6/persisters/persister-browser.js +1 -1
  121. package/lib/es6/persisters/persister-browser.js.gz +0 -0
  122. package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  123. package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  124. package/lib/es6/persisters/persister-electric-sql.js +1 -1
  125. package/lib/es6/persisters/persister-electric-sql.js.gz +0 -0
  126. package/lib/es6/persisters/persister-expo-sqlite-next.js +1 -1
  127. package/lib/es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  128. package/lib/es6/persisters/persister-expo-sqlite.js +1 -1
  129. package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
  130. package/lib/es6/persisters/persister-file.js +1 -1
  131. package/lib/es6/persisters/persister-file.js.gz +0 -0
  132. package/lib/es6/persisters/persister-indexed-db.js +1 -1
  133. package/lib/es6/persisters/persister-indexed-db.js.gz +0 -0
  134. package/lib/es6/persisters/persister-libsql.js +1 -1
  135. package/lib/es6/persisters/persister-libsql.js.gz +0 -0
  136. package/lib/es6/persisters/persister-partykit-client.js +1 -1
  137. package/lib/es6/persisters/persister-partykit-client.js.gz +0 -0
  138. package/lib/es6/persisters/persister-powersync.js +1 -0
  139. package/lib/es6/persisters/persister-powersync.js.gz +0 -0
  140. package/lib/es6/persisters/persister-remote.js +1 -1
  141. package/lib/es6/persisters/persister-remote.js.gz +0 -0
  142. package/lib/es6/persisters/persister-sqlite-wasm.js +1 -1
  143. package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  144. package/lib/es6/persisters/persister-sqlite3.js +1 -1
  145. package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
  146. package/lib/es6/persisters/persister-sync.js +1 -0
  147. package/lib/es6/persisters/persister-sync.js.gz +0 -0
  148. package/lib/es6/persisters/persister-yjs.js +1 -1
  149. package/lib/es6/persisters/persister-yjs.js.gz +0 -0
  150. package/lib/es6/persisters.js +1 -1
  151. package/lib/es6/persisters.js.gz +0 -0
  152. package/lib/es6/store.js +1 -1
  153. package/lib/es6/store.js.gz +0 -0
  154. package/lib/es6/tinybase.js +1 -1
  155. package/lib/es6/tinybase.js.gz +0 -0
  156. package/lib/es6/tools.js +1 -1
  157. package/lib/es6/tools.js.gz +0 -0
  158. package/lib/es6/ui-react-dom-debug.js +1 -1
  159. package/lib/es6/ui-react-dom-debug.js.gz +0 -0
  160. package/lib/es6/ui-react.js +1 -1
  161. package/lib/es6/ui-react.js.gz +0 -0
  162. package/lib/mergeable-store.js +1 -1
  163. package/lib/mergeable-store.js.gz +0 -0
  164. package/lib/persisters/persister-automerge.js +1 -1
  165. package/lib/persisters/persister-automerge.js.gz +0 -0
  166. package/lib/persisters/persister-browser.js +1 -1
  167. package/lib/persisters/persister-browser.js.gz +0 -0
  168. package/lib/persisters/persister-cr-sqlite-wasm.js +1 -1
  169. package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  170. package/lib/persisters/persister-electric-sql.js +1 -1
  171. package/lib/persisters/persister-electric-sql.js.gz +0 -0
  172. package/lib/persisters/persister-expo-sqlite-next.js +1 -1
  173. package/lib/persisters/persister-expo-sqlite-next.js.gz +0 -0
  174. package/lib/persisters/persister-expo-sqlite.js +1 -1
  175. package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
  176. package/lib/persisters/persister-file.js +1 -1
  177. package/lib/persisters/persister-file.js.gz +0 -0
  178. package/lib/persisters/persister-indexed-db.js +1 -1
  179. package/lib/persisters/persister-indexed-db.js.gz +0 -0
  180. package/lib/persisters/persister-libsql.js +1 -1
  181. package/lib/persisters/persister-libsql.js.gz +0 -0
  182. package/lib/persisters/persister-partykit-client.js +1 -1
  183. package/lib/persisters/persister-partykit-client.js.gz +0 -0
  184. package/lib/persisters/persister-powersync.js +1 -0
  185. package/lib/persisters/persister-powersync.js.gz +0 -0
  186. package/lib/persisters/persister-remote.js +1 -1
  187. package/lib/persisters/persister-remote.js.gz +0 -0
  188. package/lib/persisters/persister-sqlite-wasm.js +1 -1
  189. package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
  190. package/lib/persisters/persister-sqlite3.js +1 -1
  191. package/lib/persisters/persister-sqlite3.js.gz +0 -0
  192. package/lib/persisters/persister-sync.js +1 -0
  193. package/lib/persisters/persister-sync.js.gz +0 -0
  194. package/lib/persisters/persister-yjs.js +1 -1
  195. package/lib/persisters/persister-yjs.js.gz +0 -0
  196. package/lib/persisters.js +1 -1
  197. package/lib/persisters.js.gz +0 -0
  198. package/lib/store.js +1 -1
  199. package/lib/store.js.gz +0 -0
  200. package/lib/tinybase.js +1 -1
  201. package/lib/tinybase.js.gz +0 -0
  202. package/lib/tools.js +1 -1
  203. package/lib/tools.js.gz +0 -0
  204. package/lib/types/checkpoints.d.ts +2 -2
  205. package/lib/types/indexes.d.ts +2 -2
  206. package/lib/types/mergeable-store.d.ts +121 -59
  207. package/lib/types/metrics.d.ts +2 -2
  208. package/lib/types/persisters/persister-automerge.d.ts +3 -0
  209. package/lib/types/persisters/persister-browser.d.ts +9 -2
  210. package/lib/types/persisters/persister-cr-sqlite-wasm.d.ts +3 -0
  211. package/lib/types/persisters/persister-electric-sql.d.ts +3 -0
  212. package/lib/types/persisters/persister-expo-sqlite-next.d.ts +3 -0
  213. package/lib/types/persisters/persister-expo-sqlite.d.ts +3 -0
  214. package/lib/types/persisters/persister-file.d.ts +5 -1
  215. package/lib/types/persisters/persister-indexed-db.d.ts +3 -0
  216. package/lib/types/persisters/persister-libsql.d.ts +3 -0
  217. package/lib/types/persisters/persister-partykit-client.d.ts +3 -0
  218. package/lib/types/persisters/persister-powersync.d.ts +157 -0
  219. package/lib/types/persisters/persister-remote.d.ts +3 -0
  220. package/lib/types/persisters/persister-sqlite-wasm.d.ts +3 -0
  221. package/lib/types/persisters/persister-sqlite3.d.ts +3 -0
  222. package/lib/types/persisters/persister-sync.d.ts +182 -0
  223. package/lib/types/persisters/persister-yjs.d.ts +5 -2
  224. package/lib/types/persisters.d.ts +60 -3
  225. package/lib/types/queries.d.ts +2 -2
  226. package/lib/types/relationships.d.ts +2 -2
  227. package/lib/types/store.d.ts +36 -3
  228. package/lib/types/tinybase.d.ts +9 -9
  229. package/lib/types/tools.d.ts +2 -2
  230. package/lib/types/ui-react.d.ts +8 -8
  231. package/lib/types/with-schemas/checkpoints.d.ts +2 -2
  232. package/lib/types/with-schemas/indexes.d.ts +2 -2
  233. package/lib/types/with-schemas/mergeable-store.d.ts +185 -87
  234. package/lib/types/with-schemas/metrics.d.ts +2 -2
  235. package/lib/types/with-schemas/persisters/persister-automerge.d.ts +4 -1
  236. package/lib/types/with-schemas/persisters/persister-browser.d.ts +13 -6
  237. package/lib/types/with-schemas/persisters/persister-cr-sqlite-wasm.d.ts +4 -1
  238. package/lib/types/with-schemas/persisters/persister-electric-sql.d.ts +4 -1
  239. package/lib/types/with-schemas/persisters/persister-expo-sqlite-next.d.ts +4 -1
  240. package/lib/types/with-schemas/persisters/persister-expo-sqlite.d.ts +4 -1
  241. package/lib/types/with-schemas/persisters/persister-file.d.ts +7 -3
  242. package/lib/types/with-schemas/persisters/persister-indexed-db.d.ts +4 -1
  243. package/lib/types/with-schemas/persisters/persister-libsql.d.ts +4 -1
  244. package/lib/types/with-schemas/persisters/persister-partykit-client.d.ts +4 -1
  245. package/lib/types/with-schemas/persisters/persister-powersync.d.ts +170 -0
  246. package/lib/types/with-schemas/persisters/persister-remote.d.ts +4 -1
  247. package/lib/types/with-schemas/persisters/persister-sqlite-wasm.d.ts +4 -1
  248. package/lib/types/with-schemas/persisters/persister-sqlite3.d.ts +4 -1
  249. package/lib/types/with-schemas/persisters/persister-sync.d.ts +195 -0
  250. package/lib/types/with-schemas/persisters/persister-yjs.d.ts +6 -3
  251. package/lib/types/with-schemas/persisters.d.ts +79 -7
  252. package/lib/types/with-schemas/queries.d.ts +3 -3
  253. package/lib/types/with-schemas/relationships.d.ts +2 -2
  254. package/lib/types/with-schemas/store.d.ts +100 -3
  255. package/lib/types/with-schemas/tinybase.d.ts +9 -9
  256. package/lib/types/with-schemas/tools.d.ts +2 -2
  257. package/lib/types/with-schemas/ui-react.d.ts +8 -8
  258. package/lib/ui-react.js +1 -1
  259. package/lib/ui-react.js.gz +0 -0
  260. package/lib/umd/mergeable-store.js +1 -1
  261. package/lib/umd/mergeable-store.js.gz +0 -0
  262. package/lib/umd/persisters/persister-automerge.js +1 -1
  263. package/lib/umd/persisters/persister-automerge.js.gz +0 -0
  264. package/lib/umd/persisters/persister-browser.js +1 -1
  265. package/lib/umd/persisters/persister-browser.js.gz +0 -0
  266. package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
  267. package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  268. package/lib/umd/persisters/persister-electric-sql.js +1 -1
  269. package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
  270. package/lib/umd/persisters/persister-expo-sqlite-next.js +1 -1
  271. package/lib/umd/persisters/persister-expo-sqlite-next.js.gz +0 -0
  272. package/lib/umd/persisters/persister-expo-sqlite.js +1 -1
  273. package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
  274. package/lib/umd/persisters/persister-file.js +1 -1
  275. package/lib/umd/persisters/persister-file.js.gz +0 -0
  276. package/lib/umd/persisters/persister-indexed-db.js +1 -1
  277. package/lib/umd/persisters/persister-indexed-db.js.gz +0 -0
  278. package/lib/umd/persisters/persister-libsql.js +1 -1
  279. package/lib/umd/persisters/persister-libsql.js.gz +0 -0
  280. package/lib/umd/persisters/persister-partykit-client.js +1 -1
  281. package/lib/umd/persisters/persister-partykit-client.js.gz +0 -0
  282. package/lib/umd/persisters/persister-powersync.js +1 -0
  283. package/lib/umd/persisters/persister-powersync.js.gz +0 -0
  284. package/lib/umd/persisters/persister-remote.js +1 -1
  285. package/lib/umd/persisters/persister-remote.js.gz +0 -0
  286. package/lib/umd/persisters/persister-sqlite-wasm.js +1 -1
  287. package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
  288. package/lib/umd/persisters/persister-sqlite3.js +1 -1
  289. package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
  290. package/lib/umd/persisters/persister-sync.js +1 -0
  291. package/lib/umd/persisters/persister-sync.js.gz +0 -0
  292. package/lib/umd/persisters/persister-yjs.js +1 -1
  293. package/lib/umd/persisters/persister-yjs.js.gz +0 -0
  294. package/lib/umd/persisters.js +1 -1
  295. package/lib/umd/persisters.js.gz +0 -0
  296. package/lib/umd/store.js +1 -1
  297. package/lib/umd/store.js.gz +0 -0
  298. package/lib/umd/tinybase.js +1 -1
  299. package/lib/umd/tinybase.js.gz +0 -0
  300. package/lib/umd/tools.js +1 -1
  301. package/lib/umd/tools.js.gz +0 -0
  302. package/lib/umd/ui-react-dom-debug.js +1 -1
  303. package/lib/umd/ui-react-dom-debug.js.gz +0 -0
  304. package/lib/umd/ui-react.js +1 -1
  305. package/lib/umd/ui-react.js.gz +0 -0
  306. package/lib/umd-es6/mergeable-store.js +1 -1
  307. package/lib/umd-es6/mergeable-store.js.gz +0 -0
  308. package/lib/umd-es6/persisters/persister-automerge.js +1 -1
  309. package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
  310. package/lib/umd-es6/persisters/persister-browser.js +1 -1
  311. package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
  312. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  313. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  314. package/lib/umd-es6/persisters/persister-electric-sql.js +1 -1
  315. package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
  316. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js +1 -1
  317. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  318. package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -1
  319. package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
  320. package/lib/umd-es6/persisters/persister-file.js +1 -1
  321. package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
  322. package/lib/umd-es6/persisters/persister-indexed-db.js +1 -1
  323. package/lib/umd-es6/persisters/persister-indexed-db.js.gz +0 -0
  324. package/lib/umd-es6/persisters/persister-libsql.js +1 -1
  325. package/lib/umd-es6/persisters/persister-libsql.js.gz +0 -0
  326. package/lib/umd-es6/persisters/persister-partykit-client.js +1 -1
  327. package/lib/umd-es6/persisters/persister-partykit-client.js.gz +0 -0
  328. package/lib/umd-es6/persisters/persister-powersync.js +1 -0
  329. package/lib/umd-es6/persisters/persister-powersync.js.gz +0 -0
  330. package/lib/umd-es6/persisters/persister-remote.js +1 -1
  331. package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
  332. package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -1
  333. package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  334. package/lib/umd-es6/persisters/persister-sqlite3.js +1 -1
  335. package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
  336. package/lib/umd-es6/persisters/persister-sync.js +1 -0
  337. package/lib/umd-es6/persisters/persister-sync.js.gz +0 -0
  338. package/lib/umd-es6/persisters/persister-yjs.js +1 -1
  339. package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
  340. package/lib/umd-es6/persisters.js +1 -1
  341. package/lib/umd-es6/persisters.js.gz +0 -0
  342. package/lib/umd-es6/store.js +1 -1
  343. package/lib/umd-es6/store.js.gz +0 -0
  344. package/lib/umd-es6/tinybase.js +1 -1
  345. package/lib/umd-es6/tinybase.js.gz +0 -0
  346. package/lib/umd-es6/tools.js +1 -1
  347. package/lib/umd-es6/tools.js.gz +0 -0
  348. package/lib/umd-es6/ui-react-dom-debug.js +1 -1
  349. package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
  350. package/lib/umd-es6/ui-react.js +1 -1
  351. package/lib/umd-es6/ui-react.js.gz +0 -0
  352. package/package.json +37 -26
  353. 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};