tinybase 5.0.0-beta.1 → 5.0.0-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (491) hide show
  1. package/lib/checkpoints.js +1 -1
  2. package/lib/checkpoints.js.gz +0 -0
  3. package/lib/cjs/checkpoints.cjs +1 -1
  4. package/lib/cjs/checkpoints.cjs.gz +0 -0
  5. package/lib/cjs/indexes.cjs +1 -1
  6. package/lib/cjs/indexes.cjs.gz +0 -0
  7. package/lib/cjs/mergeable-store.cjs +1 -0
  8. package/lib/cjs/mergeable-store.cjs.gz +0 -0
  9. package/lib/cjs/metrics.cjs +1 -1
  10. package/lib/cjs/metrics.cjs.gz +0 -0
  11. package/lib/cjs/persisters/persister-automerge.cjs +1 -1
  12. package/lib/cjs/persisters/persister-automerge.cjs.gz +0 -0
  13. package/lib/cjs/persisters/persister-browser.cjs +1 -1
  14. package/lib/cjs/persisters/persister-browser.cjs.gz +0 -0
  15. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  16. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  17. package/lib/cjs/persisters/persister-electric-sql.cjs +1 -1
  18. package/lib/cjs/persisters/persister-electric-sql.cjs.gz +0 -0
  19. package/lib/cjs/persisters/persister-expo-sqlite-next.cjs +1 -1
  20. package/lib/cjs/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  21. package/lib/cjs/persisters/persister-expo-sqlite.cjs +1 -1
  22. package/lib/cjs/persisters/persister-expo-sqlite.cjs.gz +0 -0
  23. package/lib/cjs/persisters/persister-file.cjs +1 -1
  24. package/lib/cjs/persisters/persister-file.cjs.gz +0 -0
  25. package/lib/cjs/persisters/persister-indexed-db.cjs +1 -1
  26. package/lib/cjs/persisters/persister-indexed-db.cjs.gz +0 -0
  27. package/lib/cjs/persisters/persister-libsql.cjs +1 -0
  28. package/lib/cjs/persisters/persister-libsql.cjs.gz +0 -0
  29. package/lib/cjs/persisters/persister-partykit-client.cjs +1 -1
  30. package/lib/cjs/persisters/persister-partykit-client.cjs.gz +0 -0
  31. package/lib/cjs/persisters/persister-partykit-server.cjs +1 -1
  32. package/lib/cjs/persisters/persister-partykit-server.cjs.gz +0 -0
  33. package/lib/cjs/persisters/persister-powersync.cjs +1 -0
  34. package/lib/cjs/persisters/persister-powersync.cjs.gz +0 -0
  35. package/lib/cjs/persisters/persister-remote.cjs +1 -1
  36. package/lib/cjs/persisters/persister-remote.cjs.gz +0 -0
  37. package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -1
  38. package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  39. package/lib/cjs/persisters/persister-sqlite3.cjs +1 -1
  40. package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
  41. package/lib/cjs/persisters/persister-yjs.cjs +1 -1
  42. package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
  43. package/lib/cjs/persisters.cjs +1 -1
  44. package/lib/cjs/persisters.cjs.gz +0 -0
  45. package/lib/cjs/queries.cjs +1 -1
  46. package/lib/cjs/queries.cjs.gz +0 -0
  47. package/lib/cjs/relationships.cjs +1 -1
  48. package/lib/cjs/relationships.cjs.gz +0 -0
  49. package/lib/cjs/store.cjs +1 -1
  50. package/lib/cjs/store.cjs.gz +0 -0
  51. package/lib/cjs/synchronizers/synchronizer-local.cjs +1 -0
  52. package/lib/cjs/synchronizers/synchronizer-local.cjs.gz +0 -0
  53. package/lib/cjs/synchronizers/synchronizer-ws-client.cjs +1 -0
  54. package/lib/cjs/synchronizers/synchronizer-ws-client.cjs.gz +0 -0
  55. package/lib/cjs/synchronizers/synchronizer-ws-server.cjs +1 -0
  56. package/lib/cjs/synchronizers/synchronizer-ws-server.cjs.gz +0 -0
  57. package/lib/cjs/synchronizers.cjs +1 -0
  58. package/lib/cjs/synchronizers.cjs.gz +0 -0
  59. package/lib/cjs/tinybase.cjs +1 -1
  60. package/lib/cjs/tinybase.cjs.gz +0 -0
  61. package/lib/cjs/tools.cjs +1 -1
  62. package/lib/cjs/tools.cjs.gz +0 -0
  63. package/lib/cjs/ui-react-dom-debug.cjs +1 -1
  64. package/lib/cjs/ui-react-dom-debug.cjs.gz +0 -0
  65. package/lib/cjs/ui-react-dom.cjs +1 -1
  66. package/lib/cjs/ui-react-dom.cjs.gz +0 -0
  67. package/lib/cjs/ui-react.cjs +1 -1
  68. package/lib/cjs/ui-react.cjs.gz +0 -0
  69. package/lib/cjs-es6/checkpoints.cjs +1 -1
  70. package/lib/cjs-es6/checkpoints.cjs.gz +0 -0
  71. package/lib/cjs-es6/indexes.cjs +1 -1
  72. package/lib/cjs-es6/indexes.cjs.gz +0 -0
  73. package/lib/cjs-es6/mergeable-store.cjs +1 -0
  74. package/lib/cjs-es6/mergeable-store.cjs.gz +0 -0
  75. package/lib/cjs-es6/metrics.cjs +1 -1
  76. package/lib/cjs-es6/metrics.cjs.gz +0 -0
  77. package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -1
  78. package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
  79. package/lib/cjs-es6/persisters/persister-browser.cjs +1 -1
  80. package/lib/cjs-es6/persisters/persister-browser.cjs.gz +0 -0
  81. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  82. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  83. package/lib/cjs-es6/persisters/persister-electric-sql.cjs +1 -1
  84. package/lib/cjs-es6/persisters/persister-electric-sql.cjs.gz +0 -0
  85. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs +1 -1
  86. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  87. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -1
  88. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
  89. package/lib/cjs-es6/persisters/persister-file.cjs +1 -1
  90. package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
  91. package/lib/cjs-es6/persisters/persister-indexed-db.cjs +1 -1
  92. package/lib/cjs-es6/persisters/persister-indexed-db.cjs.gz +0 -0
  93. package/lib/cjs-es6/persisters/persister-libsql.cjs +1 -0
  94. package/lib/cjs-es6/persisters/persister-libsql.cjs.gz +0 -0
  95. package/lib/cjs-es6/persisters/persister-partykit-client.cjs +1 -1
  96. package/lib/cjs-es6/persisters/persister-partykit-client.cjs.gz +0 -0
  97. package/lib/cjs-es6/persisters/persister-partykit-server.cjs +1 -1
  98. package/lib/cjs-es6/persisters/persister-partykit-server.cjs.gz +0 -0
  99. package/lib/cjs-es6/persisters/persister-powersync.cjs +1 -0
  100. package/lib/cjs-es6/persisters/persister-powersync.cjs.gz +0 -0
  101. package/lib/cjs-es6/persisters/persister-remote.cjs +1 -1
  102. package/lib/cjs-es6/persisters/persister-remote.cjs.gz +0 -0
  103. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -1
  104. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  105. package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -1
  106. package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
  107. package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -1
  108. package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
  109. package/lib/cjs-es6/persisters.cjs +1 -1
  110. package/lib/cjs-es6/persisters.cjs.gz +0 -0
  111. package/lib/cjs-es6/queries.cjs +1 -1
  112. package/lib/cjs-es6/queries.cjs.gz +0 -0
  113. package/lib/cjs-es6/relationships.cjs +1 -1
  114. package/lib/cjs-es6/relationships.cjs.gz +0 -0
  115. package/lib/cjs-es6/store.cjs +1 -1
  116. package/lib/cjs-es6/store.cjs.gz +0 -0
  117. package/lib/cjs-es6/synchronizers/synchronizer-local.cjs +1 -0
  118. package/lib/cjs-es6/synchronizers/synchronizer-local.cjs.gz +0 -0
  119. package/lib/cjs-es6/synchronizers/synchronizer-ws-client.cjs +1 -0
  120. package/lib/cjs-es6/synchronizers/synchronizer-ws-client.cjs.gz +0 -0
  121. package/lib/cjs-es6/synchronizers/synchronizer-ws-server.cjs +1 -0
  122. package/lib/cjs-es6/synchronizers/synchronizer-ws-server.cjs.gz +0 -0
  123. package/lib/cjs-es6/synchronizers.cjs +1 -0
  124. package/lib/cjs-es6/synchronizers.cjs.gz +0 -0
  125. package/lib/cjs-es6/tinybase.cjs +1 -1
  126. package/lib/cjs-es6/tinybase.cjs.gz +0 -0
  127. package/lib/cjs-es6/tools.cjs +1 -1
  128. package/lib/cjs-es6/tools.cjs.gz +0 -0
  129. package/lib/cjs-es6/ui-react-dom-debug.cjs +1 -1
  130. package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
  131. package/lib/cjs-es6/ui-react-dom.cjs +1 -1
  132. package/lib/cjs-es6/ui-react-dom.cjs.gz +0 -0
  133. package/lib/cjs-es6/ui-react.cjs +1 -1
  134. package/lib/cjs-es6/ui-react.cjs.gz +0 -0
  135. package/lib/debug/checkpoints.js +3 -1
  136. package/lib/debug/indexes.js +3 -1
  137. package/lib/debug/mergeable-store.js +2230 -0
  138. package/lib/debug/metrics.js +3 -1
  139. package/lib/debug/persisters/persister-automerge.js +110 -86
  140. package/lib/debug/persisters/persister-browser.js +94 -57
  141. package/lib/debug/persisters/persister-cr-sqlite-wasm.js +168 -106
  142. package/lib/debug/persisters/persister-electric-sql.js +168 -106
  143. package/lib/debug/persisters/persister-expo-sqlite-next.js +168 -106
  144. package/lib/debug/persisters/persister-expo-sqlite.js +168 -106
  145. package/lib/debug/persisters/persister-file.js +93 -57
  146. package/lib/debug/persisters/persister-indexed-db.js +90 -56
  147. package/lib/debug/persisters/persister-libsql.js +913 -0
  148. package/lib/debug/persisters/persister-partykit-client.js +89 -59
  149. package/lib/debug/persisters/persister-partykit-server.js +17 -25
  150. package/lib/debug/persisters/persister-powersync.js +928 -0
  151. package/lib/debug/persisters/persister-remote.js +85 -53
  152. package/lib/debug/persisters/persister-sqlite-wasm.js +168 -106
  153. package/lib/debug/persisters/persister-sqlite3.js +168 -106
  154. package/lib/debug/persisters/persister-yjs.js +108 -83
  155. package/lib/debug/persisters.js +81 -50
  156. package/lib/debug/queries.js +9 -6
  157. package/lib/debug/relationships.js +3 -1
  158. package/lib/debug/store.js +147 -126
  159. package/lib/debug/synchronizers/synchronizer-local.js +559 -0
  160. package/lib/debug/synchronizers/synchronizer-ws-client.js +586 -0
  161. package/lib/debug/synchronizers/synchronizer-ws-server.js +96 -0
  162. package/lib/debug/synchronizers.js +519 -0
  163. package/lib/debug/tinybase.js +1027 -174
  164. package/lib/debug/tools.js +22 -21
  165. package/lib/debug/ui-react-dom.js +275 -213
  166. package/lib/debug/ui-react.js +55 -6
  167. package/lib/es6/checkpoints.js +1 -1
  168. package/lib/es6/checkpoints.js.gz +0 -0
  169. package/lib/es6/indexes.js +1 -1
  170. package/lib/es6/indexes.js.gz +0 -0
  171. package/lib/es6/mergeable-store.js +1 -0
  172. package/lib/es6/mergeable-store.js.gz +0 -0
  173. package/lib/es6/metrics.js +1 -1
  174. package/lib/es6/metrics.js.gz +0 -0
  175. package/lib/es6/persisters/persister-automerge.js +1 -1
  176. package/lib/es6/persisters/persister-automerge.js.gz +0 -0
  177. package/lib/es6/persisters/persister-browser.js +1 -1
  178. package/lib/es6/persisters/persister-browser.js.gz +0 -0
  179. package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  180. package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  181. package/lib/es6/persisters/persister-electric-sql.js +1 -1
  182. package/lib/es6/persisters/persister-electric-sql.js.gz +0 -0
  183. package/lib/es6/persisters/persister-expo-sqlite-next.js +1 -1
  184. package/lib/es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  185. package/lib/es6/persisters/persister-expo-sqlite.js +1 -1
  186. package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
  187. package/lib/es6/persisters/persister-file.js +1 -1
  188. package/lib/es6/persisters/persister-file.js.gz +0 -0
  189. package/lib/es6/persisters/persister-indexed-db.js +1 -1
  190. package/lib/es6/persisters/persister-indexed-db.js.gz +0 -0
  191. package/lib/es6/persisters/persister-libsql.js +1 -0
  192. package/lib/es6/persisters/persister-libsql.js.gz +0 -0
  193. package/lib/es6/persisters/persister-partykit-client.js +1 -1
  194. package/lib/es6/persisters/persister-partykit-client.js.gz +0 -0
  195. package/lib/es6/persisters/persister-partykit-server.js +1 -1
  196. package/lib/es6/persisters/persister-partykit-server.js.gz +0 -0
  197. package/lib/es6/persisters/persister-powersync.js +1 -0
  198. package/lib/es6/persisters/persister-powersync.js.gz +0 -0
  199. package/lib/es6/persisters/persister-remote.js +1 -1
  200. package/lib/es6/persisters/persister-remote.js.gz +0 -0
  201. package/lib/es6/persisters/persister-sqlite-wasm.js +1 -1
  202. package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  203. package/lib/es6/persisters/persister-sqlite3.js +1 -1
  204. package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
  205. package/lib/es6/persisters/persister-yjs.js +1 -1
  206. package/lib/es6/persisters/persister-yjs.js.gz +0 -0
  207. package/lib/es6/persisters.js +1 -1
  208. package/lib/es6/persisters.js.gz +0 -0
  209. package/lib/es6/queries.js +1 -1
  210. package/lib/es6/queries.js.gz +0 -0
  211. package/lib/es6/relationships.js +1 -1
  212. package/lib/es6/relationships.js.gz +0 -0
  213. package/lib/es6/store.js +1 -1
  214. package/lib/es6/store.js.gz +0 -0
  215. package/lib/es6/synchronizers/synchronizer-local.js +1 -0
  216. package/lib/es6/synchronizers/synchronizer-local.js.gz +0 -0
  217. package/lib/es6/synchronizers/synchronizer-ws-client.js +1 -0
  218. package/lib/es6/synchronizers/synchronizer-ws-client.js.gz +0 -0
  219. package/lib/es6/synchronizers/synchronizer-ws-server.js +1 -0
  220. package/lib/es6/synchronizers/synchronizer-ws-server.js.gz +0 -0
  221. package/lib/es6/synchronizers.js +1 -0
  222. package/lib/es6/synchronizers.js.gz +0 -0
  223. package/lib/es6/tinybase.js +1 -1
  224. package/lib/es6/tinybase.js.gz +0 -0
  225. package/lib/es6/tools.js +1 -1
  226. package/lib/es6/tools.js.gz +0 -0
  227. package/lib/es6/ui-react-dom-debug.js +1 -1
  228. package/lib/es6/ui-react-dom-debug.js.gz +0 -0
  229. package/lib/es6/ui-react-dom.js +1 -1
  230. package/lib/es6/ui-react-dom.js.gz +0 -0
  231. package/lib/es6/ui-react.js +1 -1
  232. package/lib/es6/ui-react.js.gz +0 -0
  233. package/lib/indexes.js +1 -1
  234. package/lib/indexes.js.gz +0 -0
  235. package/lib/mergeable-store.js +1 -0
  236. package/lib/mergeable-store.js.gz +0 -0
  237. package/lib/metrics.js +1 -1
  238. package/lib/metrics.js.gz +0 -0
  239. package/lib/persisters/persister-automerge.js +1 -1
  240. package/lib/persisters/persister-automerge.js.gz +0 -0
  241. package/lib/persisters/persister-browser.js +1 -1
  242. package/lib/persisters/persister-browser.js.gz +0 -0
  243. package/lib/persisters/persister-cr-sqlite-wasm.js +1 -1
  244. package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  245. package/lib/persisters/persister-electric-sql.js +1 -1
  246. package/lib/persisters/persister-electric-sql.js.gz +0 -0
  247. package/lib/persisters/persister-expo-sqlite-next.js +1 -1
  248. package/lib/persisters/persister-expo-sqlite-next.js.gz +0 -0
  249. package/lib/persisters/persister-expo-sqlite.js +1 -1
  250. package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
  251. package/lib/persisters/persister-file.js +1 -1
  252. package/lib/persisters/persister-file.js.gz +0 -0
  253. package/lib/persisters/persister-indexed-db.js +1 -1
  254. package/lib/persisters/persister-indexed-db.js.gz +0 -0
  255. package/lib/persisters/persister-libsql.js +1 -0
  256. package/lib/persisters/persister-libsql.js.gz +0 -0
  257. package/lib/persisters/persister-partykit-client.js +1 -1
  258. package/lib/persisters/persister-partykit-client.js.gz +0 -0
  259. package/lib/persisters/persister-partykit-server.js +1 -1
  260. package/lib/persisters/persister-partykit-server.js.gz +0 -0
  261. package/lib/persisters/persister-powersync.js +1 -0
  262. package/lib/persisters/persister-powersync.js.gz +0 -0
  263. package/lib/persisters/persister-remote.js +1 -1
  264. package/lib/persisters/persister-remote.js.gz +0 -0
  265. package/lib/persisters/persister-sqlite-wasm.js +1 -1
  266. package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
  267. package/lib/persisters/persister-sqlite3.js +1 -1
  268. package/lib/persisters/persister-sqlite3.js.gz +0 -0
  269. package/lib/persisters/persister-yjs.js +1 -1
  270. package/lib/persisters/persister-yjs.js.gz +0 -0
  271. package/lib/persisters.js +1 -1
  272. package/lib/persisters.js.gz +0 -0
  273. package/lib/queries.js +1 -1
  274. package/lib/queries.js.gz +0 -0
  275. package/lib/relationships.js +1 -1
  276. package/lib/relationships.js.gz +0 -0
  277. package/lib/store.js +1 -1
  278. package/lib/store.js.gz +0 -0
  279. package/lib/synchronizers/synchronizer-local.js +1 -0
  280. package/lib/synchronizers/synchronizer-local.js.gz +0 -0
  281. package/lib/synchronizers/synchronizer-ws-client.js +1 -0
  282. package/lib/synchronizers/synchronizer-ws-client.js.gz +0 -0
  283. package/lib/synchronizers/synchronizer-ws-server.js +1 -0
  284. package/lib/synchronizers/synchronizer-ws-server.js.gz +0 -0
  285. package/lib/synchronizers.js +1 -0
  286. package/lib/synchronizers.js.gz +0 -0
  287. package/lib/tinybase.js +1 -1
  288. package/lib/tinybase.js.gz +0 -0
  289. package/lib/tools.js +1 -1
  290. package/lib/tools.js.gz +0 -0
  291. package/lib/types/checkpoints.d.ts +2 -2
  292. package/lib/types/indexes.d.ts +2 -2
  293. package/lib/types/mergeable-store.d.ts +214 -0
  294. package/lib/types/metrics.d.ts +2 -2
  295. package/lib/types/persisters/persister-automerge.d.ts +11 -7
  296. package/lib/types/persisters/persister-browser.d.ts +13 -4
  297. package/lib/types/persisters/persister-cr-sqlite-wasm.d.ts +4 -0
  298. package/lib/types/persisters/persister-electric-sql.d.ts +4 -0
  299. package/lib/types/persisters/persister-expo-sqlite-next.d.ts +4 -0
  300. package/lib/types/persisters/persister-expo-sqlite.d.ts +4 -0
  301. package/lib/types/persisters/persister-file.d.ts +7 -2
  302. package/lib/types/persisters/persister-indexed-db.d.ts +4 -0
  303. package/lib/types/persisters/persister-libsql.d.ts +142 -0
  304. package/lib/types/persisters/persister-partykit-client.d.ts +4 -0
  305. package/lib/types/persisters/persister-partykit-server.d.ts +12 -8
  306. package/lib/types/persisters/persister-powersync.d.ts +157 -0
  307. package/lib/types/persisters/persister-remote.d.ts +4 -0
  308. package/lib/types/persisters/persister-sqlite-wasm.d.ts +4 -0
  309. package/lib/types/persisters/persister-sqlite3.d.ts +4 -0
  310. package/lib/types/persisters/persister-yjs.d.ts +6 -2
  311. package/lib/types/persisters.d.ts +125 -48
  312. package/lib/types/queries.d.ts +2 -2
  313. package/lib/types/relationships.d.ts +2 -2
  314. package/lib/types/store.d.ts +275 -187
  315. package/lib/types/synchronizers/synchronizer-local.d.ts +27 -0
  316. package/lib/types/synchronizers/synchronizer-ws-client.d.ts +35 -0
  317. package/lib/types/synchronizers/synchronizer-ws-server.d.ts +36 -0
  318. package/lib/types/synchronizers.d.ts +132 -0
  319. package/lib/types/tinybase.d.ts +10 -8
  320. package/lib/types/tools.d.ts +4 -4
  321. package/lib/types/ui-react.d.ts +160 -9
  322. package/lib/types/with-schemas/checkpoints.d.ts +2 -2
  323. package/lib/types/with-schemas/indexes.d.ts +2 -2
  324. package/lib/types/with-schemas/internal/store.d.ts +4 -0
  325. package/lib/types/with-schemas/mergeable-store.d.ts +492 -0
  326. package/lib/types/with-schemas/metrics.d.ts +2 -2
  327. package/lib/types/with-schemas/persisters/persister-automerge.d.ts +12 -8
  328. package/lib/types/with-schemas/persisters/persister-browser.d.ts +17 -8
  329. package/lib/types/with-schemas/persisters/persister-cr-sqlite-wasm.d.ts +5 -1
  330. package/lib/types/with-schemas/persisters/persister-electric-sql.d.ts +5 -1
  331. package/lib/types/with-schemas/persisters/persister-expo-sqlite-next.d.ts +5 -1
  332. package/lib/types/with-schemas/persisters/persister-expo-sqlite.d.ts +5 -1
  333. package/lib/types/with-schemas/persisters/persister-file.d.ts +9 -4
  334. package/lib/types/with-schemas/persisters/persister-indexed-db.d.ts +5 -1
  335. package/lib/types/with-schemas/persisters/persister-libsql.d.ts +155 -0
  336. package/lib/types/with-schemas/persisters/persister-partykit-client.d.ts +5 -1
  337. package/lib/types/with-schemas/persisters/persister-partykit-server.d.ts +15 -11
  338. package/lib/types/with-schemas/persisters/persister-powersync.d.ts +170 -0
  339. package/lib/types/with-schemas/persisters/persister-remote.d.ts +5 -1
  340. package/lib/types/with-schemas/persisters/persister-sqlite-wasm.d.ts +5 -1
  341. package/lib/types/with-schemas/persisters/persister-sqlite3.d.ts +5 -1
  342. package/lib/types/with-schemas/persisters/persister-yjs.d.ts +7 -3
  343. package/lib/types/with-schemas/persisters.d.ts +161 -101
  344. package/lib/types/with-schemas/queries.d.ts +3 -3
  345. package/lib/types/with-schemas/relationships.d.ts +2 -2
  346. package/lib/types/with-schemas/store.d.ts +483 -345
  347. package/lib/types/with-schemas/synchronizers/synchronizer-local.d.ts +29 -0
  348. package/lib/types/with-schemas/synchronizers/synchronizer-ws-client.d.ts +41 -0
  349. package/lib/types/with-schemas/synchronizers/synchronizer-ws-server.d.ts +36 -0
  350. package/lib/types/with-schemas/synchronizers.d.ts +146 -0
  351. package/lib/types/with-schemas/tinybase.d.ts +9 -8
  352. package/lib/types/with-schemas/tools.d.ts +4 -4
  353. package/lib/types/with-schemas/ui-react.d.ts +177 -9
  354. package/lib/ui-react-dom.js +1 -1
  355. package/lib/ui-react-dom.js.gz +0 -0
  356. package/lib/ui-react.js +1 -1
  357. package/lib/ui-react.js.gz +0 -0
  358. package/lib/umd/checkpoints.js +1 -1
  359. package/lib/umd/checkpoints.js.gz +0 -0
  360. package/lib/umd/indexes.js +1 -1
  361. package/lib/umd/indexes.js.gz +0 -0
  362. package/lib/umd/mergeable-store.js +1 -0
  363. package/lib/umd/mergeable-store.js.gz +0 -0
  364. package/lib/umd/metrics.js +1 -1
  365. package/lib/umd/metrics.js.gz +0 -0
  366. package/lib/umd/persisters/persister-automerge.js +1 -1
  367. package/lib/umd/persisters/persister-automerge.js.gz +0 -0
  368. package/lib/umd/persisters/persister-browser.js +1 -1
  369. package/lib/umd/persisters/persister-browser.js.gz +0 -0
  370. package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
  371. package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  372. package/lib/umd/persisters/persister-electric-sql.js +1 -1
  373. package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
  374. package/lib/umd/persisters/persister-expo-sqlite-next.js +1 -1
  375. package/lib/umd/persisters/persister-expo-sqlite-next.js.gz +0 -0
  376. package/lib/umd/persisters/persister-expo-sqlite.js +1 -1
  377. package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
  378. package/lib/umd/persisters/persister-file.js +1 -1
  379. package/lib/umd/persisters/persister-file.js.gz +0 -0
  380. package/lib/umd/persisters/persister-indexed-db.js +1 -1
  381. package/lib/umd/persisters/persister-indexed-db.js.gz +0 -0
  382. package/lib/umd/persisters/persister-libsql.js +1 -0
  383. package/lib/umd/persisters/persister-libsql.js.gz +0 -0
  384. package/lib/umd/persisters/persister-partykit-client.js +1 -1
  385. package/lib/umd/persisters/persister-partykit-client.js.gz +0 -0
  386. package/lib/umd/persisters/persister-partykit-server.js +1 -1
  387. package/lib/umd/persisters/persister-partykit-server.js.gz +0 -0
  388. package/lib/umd/persisters/persister-powersync.js +1 -0
  389. package/lib/umd/persisters/persister-powersync.js.gz +0 -0
  390. package/lib/umd/persisters/persister-remote.js +1 -1
  391. package/lib/umd/persisters/persister-remote.js.gz +0 -0
  392. package/lib/umd/persisters/persister-sqlite-wasm.js +1 -1
  393. package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
  394. package/lib/umd/persisters/persister-sqlite3.js +1 -1
  395. package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
  396. package/lib/umd/persisters/persister-yjs.js +1 -1
  397. package/lib/umd/persisters/persister-yjs.js.gz +0 -0
  398. package/lib/umd/persisters.js +1 -1
  399. package/lib/umd/persisters.js.gz +0 -0
  400. package/lib/umd/queries.js +1 -1
  401. package/lib/umd/queries.js.gz +0 -0
  402. package/lib/umd/relationships.js +1 -1
  403. package/lib/umd/relationships.js.gz +0 -0
  404. package/lib/umd/store.js +1 -1
  405. package/lib/umd/store.js.gz +0 -0
  406. package/lib/umd/synchronizers/synchronizer-local.js +1 -0
  407. package/lib/umd/synchronizers/synchronizer-local.js.gz +0 -0
  408. package/lib/umd/synchronizers/synchronizer-ws-client.js +1 -0
  409. package/lib/umd/synchronizers/synchronizer-ws-client.js.gz +0 -0
  410. package/lib/umd/synchronizers/synchronizer-ws-server.js +1 -0
  411. package/lib/umd/synchronizers/synchronizer-ws-server.js.gz +0 -0
  412. package/lib/umd/synchronizers.js +1 -0
  413. package/lib/umd/synchronizers.js.gz +0 -0
  414. package/lib/umd/tinybase.js +1 -1
  415. package/lib/umd/tinybase.js.gz +0 -0
  416. package/lib/umd/tools.js +1 -1
  417. package/lib/umd/tools.js.gz +0 -0
  418. package/lib/umd/ui-react-dom-debug.js +1 -1
  419. package/lib/umd/ui-react-dom-debug.js.gz +0 -0
  420. package/lib/umd/ui-react-dom.js +1 -1
  421. package/lib/umd/ui-react-dom.js.gz +0 -0
  422. package/lib/umd/ui-react.js +1 -1
  423. package/lib/umd/ui-react.js.gz +0 -0
  424. package/lib/umd-es6/checkpoints.js +1 -1
  425. package/lib/umd-es6/checkpoints.js.gz +0 -0
  426. package/lib/umd-es6/indexes.js +1 -1
  427. package/lib/umd-es6/indexes.js.gz +0 -0
  428. package/lib/umd-es6/mergeable-store.js +1 -0
  429. package/lib/umd-es6/mergeable-store.js.gz +0 -0
  430. package/lib/umd-es6/metrics.js +1 -1
  431. package/lib/umd-es6/metrics.js.gz +0 -0
  432. package/lib/umd-es6/persisters/persister-automerge.js +1 -1
  433. package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
  434. package/lib/umd-es6/persisters/persister-browser.js +1 -1
  435. package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
  436. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  437. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  438. package/lib/umd-es6/persisters/persister-electric-sql.js +1 -1
  439. package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
  440. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js +1 -1
  441. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  442. package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -1
  443. package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
  444. package/lib/umd-es6/persisters/persister-file.js +1 -1
  445. package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
  446. package/lib/umd-es6/persisters/persister-indexed-db.js +1 -1
  447. package/lib/umd-es6/persisters/persister-indexed-db.js.gz +0 -0
  448. package/lib/umd-es6/persisters/persister-libsql.js +1 -0
  449. package/lib/umd-es6/persisters/persister-libsql.js.gz +0 -0
  450. package/lib/umd-es6/persisters/persister-partykit-client.js +1 -1
  451. package/lib/umd-es6/persisters/persister-partykit-client.js.gz +0 -0
  452. package/lib/umd-es6/persisters/persister-partykit-server.js +1 -1
  453. package/lib/umd-es6/persisters/persister-partykit-server.js.gz +0 -0
  454. package/lib/umd-es6/persisters/persister-powersync.js +1 -0
  455. package/lib/umd-es6/persisters/persister-powersync.js.gz +0 -0
  456. package/lib/umd-es6/persisters/persister-remote.js +1 -1
  457. package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
  458. package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -1
  459. package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  460. package/lib/umd-es6/persisters/persister-sqlite3.js +1 -1
  461. package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
  462. package/lib/umd-es6/persisters/persister-yjs.js +1 -1
  463. package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
  464. package/lib/umd-es6/persisters.js +1 -1
  465. package/lib/umd-es6/persisters.js.gz +0 -0
  466. package/lib/umd-es6/queries.js +1 -1
  467. package/lib/umd-es6/queries.js.gz +0 -0
  468. package/lib/umd-es6/relationships.js +1 -1
  469. package/lib/umd-es6/relationships.js.gz +0 -0
  470. package/lib/umd-es6/store.js +1 -1
  471. package/lib/umd-es6/store.js.gz +0 -0
  472. package/lib/umd-es6/synchronizers/synchronizer-local.js +1 -0
  473. package/lib/umd-es6/synchronizers/synchronizer-local.js.gz +0 -0
  474. package/lib/umd-es6/synchronizers/synchronizer-ws-client.js +1 -0
  475. package/lib/umd-es6/synchronizers/synchronizer-ws-client.js.gz +0 -0
  476. package/lib/umd-es6/synchronizers/synchronizer-ws-server.js +1 -0
  477. package/lib/umd-es6/synchronizers/synchronizer-ws-server.js.gz +0 -0
  478. package/lib/umd-es6/synchronizers.js +1 -0
  479. package/lib/umd-es6/synchronizers.js.gz +0 -0
  480. package/lib/umd-es6/tinybase.js +1 -1
  481. package/lib/umd-es6/tinybase.js.gz +0 -0
  482. package/lib/umd-es6/tools.js +1 -1
  483. package/lib/umd-es6/tools.js.gz +0 -0
  484. package/lib/umd-es6/ui-react-dom-debug.js +1 -1
  485. package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
  486. package/lib/umd-es6/ui-react-dom.js +1 -1
  487. package/lib/umd-es6/ui-react-dom.js.gz +0 -0
  488. package/lib/umd-es6/ui-react.js +1 -1
  489. package/lib/umd-es6/ui-react.js.gz +0 -0
  490. package/package.json +65 -45
  491. package/readme.md +2 -2
@@ -3,10 +3,10 @@ import {readFile, writeFile} from 'fs/promises';
3
3
 
4
4
  const UTF8 = 'utf8';
5
5
 
6
- const isInstanceOf = (thing, cls) => thing instanceof cls;
7
6
  const isUndefined = (thing) => thing == void 0;
8
7
  const ifNotUndefined = (value, then, otherwise) =>
9
8
  isUndefined(value) ? otherwise?.() : then(value);
9
+ const isArray = (thing) => Array.isArray(thing);
10
10
  const size = (arrayOrString) => arrayOrString.length;
11
11
 
12
12
  const arrayPush = (array, ...values) => array.push(...values);
@@ -14,8 +14,6 @@ const arrayShift = (array) => array.shift();
14
14
 
15
15
  const object = Object;
16
16
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
17
- const objIds = object.keys;
18
- const objFreeze = object.freeze;
19
17
  const isObject = (obj) =>
20
18
  !isUndefined(obj) &&
21
19
  ifNotUndefined(
@@ -26,14 +24,20 @@ const isObject = (obj) =>
26
24
  /* istanbul ignore next */
27
25
  () => true,
28
26
  );
27
+ const objIds = object.keys;
28
+ const objFreeze = object.freeze;
29
29
  const objSize = (obj) => size(objIds(obj));
30
30
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
31
31
 
32
- const jsonString = (obj) =>
32
+ const UNDEFINED_MARKER = '\uFFFC';
33
+ const jsonStringWithUndefined = (obj) =>
33
34
  JSON.stringify(obj, (_key, value) =>
34
- isInstanceOf(value, Map) ? object.fromEntries([...value]) : value,
35
+ value === void 0 ? UNDEFINED_MARKER : value,
36
+ );
37
+ const jsonParseWithUndefined = (str) =>
38
+ JSON.parse(str, (_key, value) =>
39
+ value === UNDEFINED_MARKER ? void 0 : value,
35
40
  );
36
- const jsonParse = JSON.parse;
37
41
 
38
42
  const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
39
43
  const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
@@ -42,15 +46,35 @@ const mapNew = (entries) => new Map(entries);
42
46
  const mapGet = (map, key) => map?.get(key);
43
47
  const mapSet = (map, key, value) =>
44
48
  isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
45
- const mapEnsure = (map, key, getDefaultValue) => {
49
+ const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
46
50
  if (!collHas(map, key)) {
47
51
  mapSet(map, key, getDefaultValue());
52
+ } else {
53
+ hadExistingValue?.(mapGet(map, key));
48
54
  }
49
55
  return mapGet(map, key);
50
56
  };
51
57
 
52
58
  const scheduleRunning = mapNew();
53
59
  const scheduleActions = mapNew();
60
+ const getStoreFunctions = (supportsMergeableStore, store) =>
61
+ !supportsMergeableStore || isUndefined(store.getMergeableContent)
62
+ ? [
63
+ 0,
64
+ store.getContent,
65
+ store.getTransactionChanges,
66
+ ([changedTables, changedValues]) =>
67
+ !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
68
+ store.setContent,
69
+ ]
70
+ : [
71
+ 1,
72
+ store.getMergeableContent,
73
+ store.getTransactionMergeableChanges,
74
+ ([[changedTables], [changedValues]]) =>
75
+ !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
76
+ store.setDefaultContent,
77
+ ];
54
78
  const createCustomPersister = (
55
79
  store,
56
80
  getPersisted,
@@ -58,18 +82,25 @@ const createCustomPersister = (
58
82
  addPersisterListener,
59
83
  delPersisterListener,
60
84
  onIgnoredError,
61
- [getThing, thing] = [],
85
+ supportsMergeableStore,
86
+ extra = {},
62
87
  scheduleId = [],
63
88
  ) => {
64
- let listenerId;
65
89
  let loadSave = 0;
66
90
  let loads = 0;
67
91
  let saves = 0;
68
- let listening = 0;
69
92
  let action;
70
- let listeningHandle;
93
+ let autoLoadHandle;
94
+ let autoSaveListenerId;
71
95
  mapEnsure(scheduleRunning, scheduleId, () => 0);
72
96
  mapEnsure(scheduleActions, scheduleId, () => []);
97
+ const [
98
+ isMergeableStore,
99
+ getContent,
100
+ getChanges,
101
+ hasChanges,
102
+ setDefaultContent,
103
+ ] = getStoreFunctions(supportsMergeableStore, store);
73
104
  const run = async () => {
74
105
  /* istanbul ignore else */
75
106
  if (!mapGet(scheduleRunning, scheduleId)) {
@@ -101,48 +132,54 @@ const createCustomPersister = (
101
132
  }
102
133
  return persister;
103
134
  };
135
+ const setContentOrChanges = (contentOrChanges) => {
136
+ (isMergeableStore && isArray(contentOrChanges?.[0])
137
+ ? contentOrChanges?.[2] === 1
138
+ ? store.applyMergeableChanges
139
+ : store.setMergeableContent
140
+ : contentOrChanges?.[2] === 1
141
+ ? store.applyChanges
142
+ : store.setContent)(contentOrChanges);
143
+ };
104
144
  const persister = {
105
- load: async (initialTables, initialValues) =>
145
+ load: async (initialContent) =>
106
146
  await loadLock(async () => {
107
147
  try {
108
- store.setContent(await getPersisted());
109
- } catch {
110
- store.setContent([initialTables, initialValues]);
148
+ setContentOrChanges(await getPersisted());
149
+ } catch (error) {
150
+ onIgnoredError?.(error);
151
+ if (initialContent) {
152
+ setDefaultContent(initialContent);
153
+ }
111
154
  }
112
155
  }),
113
- startAutoLoad: async (initialTables = {}, initialValues = {}) => {
114
- persister.stopAutoLoad();
115
- await persister.load(initialTables, initialValues);
116
- listening = 1;
117
- listeningHandle = addPersisterListener(
118
- async (getContent, getTransactionChanges) => {
119
- if (getTransactionChanges) {
120
- const transactionChanges = getTransactionChanges();
121
- await loadLock(async () =>
122
- store.setTransactionChanges(transactionChanges),
123
- );
124
- } else {
125
- await loadLock(async () => {
126
- try {
127
- store.setContent(getContent?.() ?? (await getPersisted()));
128
- } catch (error) {
129
- onIgnoredError?.(error);
130
- }
131
- });
132
- }
156
+ startAutoLoad: async (initialContent) => {
157
+ await persister.stopAutoLoad().load(initialContent);
158
+ autoLoadHandle = addPersisterListener(
159
+ async (getContent2, getChanges2) => {
160
+ const changes = getChanges2?.();
161
+ await loadLock(async () => {
162
+ try {
163
+ setContentOrChanges(
164
+ changes ?? getContent2?.() ?? (await getPersisted()),
165
+ );
166
+ } catch (error) {
167
+ onIgnoredError?.(error);
168
+ }
169
+ });
133
170
  },
134
171
  );
135
172
  return persister;
136
173
  },
137
174
  stopAutoLoad: () => {
138
- if (listening) {
139
- delPersisterListener(listeningHandle);
140
- listeningHandle = void 0;
141
- listening = 0;
175
+ if (autoLoadHandle) {
176
+ delPersisterListener(autoLoadHandle);
177
+ autoLoadHandle = void 0;
142
178
  }
143
179
  return persister;
144
180
  },
145
- save: async (getTransactionChanges) => {
181
+ isAutoLoading: () => !isUndefined(autoLoadHandle),
182
+ save: async (getChanges2) => {
146
183
  /* istanbul ignore else */
147
184
  if (loadSave != 1) {
148
185
  loadSave = 2;
@@ -151,7 +188,7 @@ const createCustomPersister = (
151
188
  }
152
189
  await persister.schedule(async () => {
153
190
  try {
154
- await setPersisted(store.getContent, getTransactionChanges);
191
+ await setPersisted(getContent, getChanges2);
155
192
  } catch (error) {
156
193
  /* istanbul ignore next */
157
194
  onIgnoredError?.(error);
@@ -163,21 +200,20 @@ const createCustomPersister = (
163
200
  },
164
201
  startAutoSave: async () => {
165
202
  await persister.stopAutoSave().save();
166
- listenerId = store.addDidFinishTransactionListener(
167
- (_store, getTransactionChanges) => {
168
- const [tableChanges, valueChanges] = getTransactionChanges();
169
- if (!objIsEmpty(tableChanges) || !objIsEmpty(valueChanges)) {
170
- persister.save(() => [tableChanges, valueChanges]);
171
- }
172
- },
173
- );
203
+ autoSaveListenerId = store.addDidFinishTransactionListener(() => {
204
+ const changes = getChanges();
205
+ if (hasChanges(changes)) {
206
+ persister.save(() => changes);
207
+ }
208
+ });
174
209
  return persister;
175
210
  },
176
211
  stopAutoSave: () => {
177
- ifNotUndefined(listenerId, store.delListener);
178
- listenerId = void 0;
212
+ ifNotUndefined(autoSaveListenerId, store.delListener);
213
+ autoSaveListenerId = void 0;
179
214
  return persister;
180
215
  },
216
+ isAutoSaving: () => !isUndefined(autoSaveListenerId),
181
217
  schedule: async (...actions) => {
182
218
  arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
183
219
  await run();
@@ -186,17 +222,16 @@ const createCustomPersister = (
186
222
  getStore: () => store,
187
223
  destroy: () => persister.stopAutoLoad().stopAutoSave(),
188
224
  getStats: () => ({loads, saves}),
225
+ ...extra,
189
226
  };
190
- if (getThing) {
191
- persister[getThing] = () => thing;
192
- }
193
227
  return objFreeze(persister);
194
228
  };
195
229
 
196
230
  const createFilePersister = (store, filePath, onIgnoredError) => {
197
- const getPersisted = async () => jsonParse(await readFile(filePath, UTF8));
231
+ const getPersisted = async () =>
232
+ jsonParseWithUndefined(await readFile(filePath, UTF8));
198
233
  const setPersisted = async (getContent) =>
199
- await writeFile(filePath, jsonString(getContent()), UTF8);
234
+ await writeFile(filePath, jsonStringWithUndefined(getContent()), UTF8);
200
235
  const addPersisterListener = (listener) => watch(filePath, () => listener());
201
236
  const delPersisterListener = (watcher) => watcher?.close();
202
237
  return createCustomPersister(
@@ -206,7 +241,8 @@ const createFilePersister = (store, filePath, onIgnoredError) => {
206
241
  addPersisterListener,
207
242
  delPersisterListener,
208
243
  onIgnoredError,
209
- ['getFilePath', filePath],
244
+ true,
245
+ {getFilePath: () => filePath},
210
246
  );
211
247
  };
212
248
 
@@ -10,6 +10,7 @@ const stopInterval = clearInterval;
10
10
  const isUndefined = (thing) => thing == void 0;
11
11
  const ifNotUndefined = (value, then, otherwise) =>
12
12
  isUndefined(value) ? otherwise?.() : then(value);
13
+ const isArray = (thing) => Array.isArray(thing);
13
14
  const size = (arrayOrString) => arrayOrString.length;
14
15
  const promiseNew = (resolver) => new promise(resolver);
15
16
  const promiseAll = async (promises) => promise.all(promises);
@@ -21,8 +22,6 @@ const arrayShift = (array) => array.shift();
21
22
  const object = Object;
22
23
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
23
24
  const objEntries = object.entries;
24
- const objIds = object.keys;
25
- const objFreeze = object.freeze;
26
25
  const isObject = (obj) =>
27
26
  !isUndefined(obj) &&
28
27
  ifNotUndefined(
@@ -33,10 +32,11 @@ const isObject = (obj) =>
33
32
  /* istanbul ignore next */
34
33
  () => true,
35
34
  );
35
+ const objIds = object.keys;
36
+ const objFreeze = object.freeze;
36
37
  const objNew = (entries = []) => object.fromEntries(entries);
37
- const objGet = (obj, id) => ifNotUndefined(obj, (obj2) => obj2[id]);
38
- const objHas = (obj, id) => !isUndefined(objGet(obj, id));
39
- const objMap = (obj, cb) =>
38
+ const objHas = (obj, id) => id in obj;
39
+ const objToArray = (obj, cb) =>
40
40
  arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
41
41
  const objSize = (obj) => size(objIds(obj));
42
42
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
@@ -48,15 +48,35 @@ const mapNew = (entries) => new Map(entries);
48
48
  const mapGet = (map, key) => map?.get(key);
49
49
  const mapSet = (map, key, value) =>
50
50
  isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
51
- const mapEnsure = (map, key, getDefaultValue) => {
51
+ const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
52
52
  if (!collHas(map, key)) {
53
53
  mapSet(map, key, getDefaultValue());
54
+ } else {
55
+ hadExistingValue?.(mapGet(map, key));
54
56
  }
55
57
  return mapGet(map, key);
56
58
  };
57
59
 
58
60
  const scheduleRunning = mapNew();
59
61
  const scheduleActions = mapNew();
62
+ const getStoreFunctions = (supportsMergeableStore, store) =>
63
+ !supportsMergeableStore || isUndefined(store.getMergeableContent)
64
+ ? [
65
+ 0,
66
+ store.getContent,
67
+ store.getTransactionChanges,
68
+ ([changedTables, changedValues]) =>
69
+ !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
70
+ store.setContent,
71
+ ]
72
+ : [
73
+ 1,
74
+ store.getMergeableContent,
75
+ store.getTransactionMergeableChanges,
76
+ ([[changedTables], [changedValues]]) =>
77
+ !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
78
+ store.setDefaultContent,
79
+ ];
60
80
  const createCustomPersister = (
61
81
  store,
62
82
  getPersisted,
@@ -64,18 +84,25 @@ const createCustomPersister = (
64
84
  addPersisterListener,
65
85
  delPersisterListener,
66
86
  onIgnoredError,
67
- [getThing, thing] = [],
87
+ supportsMergeableStore,
88
+ extra = {},
68
89
  scheduleId = [],
69
90
  ) => {
70
- let listenerId;
71
91
  let loadSave = 0;
72
92
  let loads = 0;
73
93
  let saves = 0;
74
- let listening = 0;
75
94
  let action;
76
- let listeningHandle;
95
+ let autoLoadHandle;
96
+ let autoSaveListenerId;
77
97
  mapEnsure(scheduleRunning, scheduleId, () => 0);
78
98
  mapEnsure(scheduleActions, scheduleId, () => []);
99
+ const [
100
+ isMergeableStore,
101
+ getContent,
102
+ getChanges,
103
+ hasChanges,
104
+ setDefaultContent,
105
+ ] = getStoreFunctions(supportsMergeableStore, store);
79
106
  const run = async () => {
80
107
  /* istanbul ignore else */
81
108
  if (!mapGet(scheduleRunning, scheduleId)) {
@@ -107,48 +134,54 @@ const createCustomPersister = (
107
134
  }
108
135
  return persister;
109
136
  };
137
+ const setContentOrChanges = (contentOrChanges) => {
138
+ (isMergeableStore && isArray(contentOrChanges?.[0])
139
+ ? contentOrChanges?.[2] === 1
140
+ ? store.applyMergeableChanges
141
+ : store.setMergeableContent
142
+ : contentOrChanges?.[2] === 1
143
+ ? store.applyChanges
144
+ : store.setContent)(contentOrChanges);
145
+ };
110
146
  const persister = {
111
- load: async (initialTables, initialValues) =>
147
+ load: async (initialContent) =>
112
148
  await loadLock(async () => {
113
149
  try {
114
- store.setContent(await getPersisted());
115
- } catch {
116
- store.setContent([initialTables, initialValues]);
150
+ setContentOrChanges(await getPersisted());
151
+ } catch (error) {
152
+ onIgnoredError?.(error);
153
+ if (initialContent) {
154
+ setDefaultContent(initialContent);
155
+ }
117
156
  }
118
157
  }),
119
- startAutoLoad: async (initialTables = {}, initialValues = {}) => {
120
- persister.stopAutoLoad();
121
- await persister.load(initialTables, initialValues);
122
- listening = 1;
123
- listeningHandle = addPersisterListener(
124
- async (getContent, getTransactionChanges) => {
125
- if (getTransactionChanges) {
126
- const transactionChanges = getTransactionChanges();
127
- await loadLock(async () =>
128
- store.setTransactionChanges(transactionChanges),
129
- );
130
- } else {
131
- await loadLock(async () => {
132
- try {
133
- store.setContent(getContent?.() ?? (await getPersisted()));
134
- } catch (error) {
135
- onIgnoredError?.(error);
136
- }
137
- });
138
- }
158
+ startAutoLoad: async (initialContent) => {
159
+ await persister.stopAutoLoad().load(initialContent);
160
+ autoLoadHandle = addPersisterListener(
161
+ async (getContent2, getChanges2) => {
162
+ const changes = getChanges2?.();
163
+ await loadLock(async () => {
164
+ try {
165
+ setContentOrChanges(
166
+ changes ?? getContent2?.() ?? (await getPersisted()),
167
+ );
168
+ } catch (error) {
169
+ onIgnoredError?.(error);
170
+ }
171
+ });
139
172
  },
140
173
  );
141
174
  return persister;
142
175
  },
143
176
  stopAutoLoad: () => {
144
- if (listening) {
145
- delPersisterListener(listeningHandle);
146
- listeningHandle = void 0;
147
- listening = 0;
177
+ if (autoLoadHandle) {
178
+ delPersisterListener(autoLoadHandle);
179
+ autoLoadHandle = void 0;
148
180
  }
149
181
  return persister;
150
182
  },
151
- save: async (getTransactionChanges) => {
183
+ isAutoLoading: () => !isUndefined(autoLoadHandle),
184
+ save: async (getChanges2) => {
152
185
  /* istanbul ignore else */
153
186
  if (loadSave != 1) {
154
187
  loadSave = 2;
@@ -157,7 +190,7 @@ const createCustomPersister = (
157
190
  }
158
191
  await persister.schedule(async () => {
159
192
  try {
160
- await setPersisted(store.getContent, getTransactionChanges);
193
+ await setPersisted(getContent, getChanges2);
161
194
  } catch (error) {
162
195
  /* istanbul ignore next */
163
196
  onIgnoredError?.(error);
@@ -169,21 +202,20 @@ const createCustomPersister = (
169
202
  },
170
203
  startAutoSave: async () => {
171
204
  await persister.stopAutoSave().save();
172
- listenerId = store.addDidFinishTransactionListener(
173
- (_store, getTransactionChanges) => {
174
- const [tableChanges, valueChanges] = getTransactionChanges();
175
- if (!objIsEmpty(tableChanges) || !objIsEmpty(valueChanges)) {
176
- persister.save(() => [tableChanges, valueChanges]);
177
- }
178
- },
179
- );
205
+ autoSaveListenerId = store.addDidFinishTransactionListener(() => {
206
+ const changes = getChanges();
207
+ if (hasChanges(changes)) {
208
+ persister.save(() => changes);
209
+ }
210
+ });
180
211
  return persister;
181
212
  },
182
213
  stopAutoSave: () => {
183
- ifNotUndefined(listenerId, store.delListener);
184
- listenerId = void 0;
214
+ ifNotUndefined(autoSaveListenerId, store.delListener);
215
+ autoSaveListenerId = void 0;
185
216
  return persister;
186
217
  },
218
+ isAutoSaving: () => !isUndefined(autoSaveListenerId),
187
219
  schedule: async (...actions) => {
188
220
  arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
189
221
  await run();
@@ -192,10 +224,8 @@ const createCustomPersister = (
192
224
  getStore: () => store,
193
225
  destroy: () => persister.stopAutoLoad().stopAutoSave(),
194
226
  getStats: () => ({loads, saves}),
227
+ ...extra,
195
228
  };
196
- if (getThing) {
197
- persister[getThing] = () => thing;
198
- }
199
229
  return objFreeze(persister);
200
230
  };
201
231
 
@@ -203,7 +233,7 @@ const WINDOW = globalThis.window;
203
233
  const OBJECT_STORE_NAMES = [T, V];
204
234
  const KEY_PATH = {keyPath: 'k'};
205
235
  const objectStoreMatch = async (objectStore, obj) => {
206
- const actions = objMap(obj, (v, k) =>
236
+ const actions = objToArray(obj, (v, k) =>
207
237
  execObjectStore(objectStore, 'put', {k, v}),
208
238
  );
209
239
  arrayMap(await execObjectStore(objectStore, 'getAllKeys'), (id) =>
@@ -227,7 +257,10 @@ const createIndexedDbPersister = (
227
257
  ) => {
228
258
  const forObjectStores = async (forObjectStore, args = [], create = 0) =>
229
259
  promiseNew((resolve, reject) => {
230
- const request = WINDOW.indexedDB.open(dbName, create ? 2 : void 0);
260
+ const request = (WINDOW ? WINDOW.indexedDB : indexedDB).open(
261
+ dbName,
262
+ create ? 2 : void 0,
263
+ );
231
264
  request.onupgradeneeded = () =>
232
265
  create &&
233
266
  arrayMap(OBJECT_STORE_NAMES, (objectStoreName) => {
@@ -286,7 +319,8 @@ const createIndexedDbPersister = (
286
319
  addPersisterListener,
287
320
  delPersisterListener,
288
321
  onIgnoredError,
289
- ['getDbName', dbName],
322
+ false,
323
+ {getDbName: () => dbName},
290
324
  );
291
325
  };
292
326