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

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