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
@@ -52,9 +52,11 @@ const mapForEach = (map, cb) =>
52
52
  collForEach(map, (value, key) => cb(key, value));
53
53
  const mapSet = (map, key, value) =>
54
54
  isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
55
- const mapEnsure = (map, key, getDefaultValue) => {
55
+ const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
56
56
  if (!collHas(map, key)) {
57
57
  mapSet(map, key, getDefaultValue());
58
+ } else {
59
+ hadExistingValue?.(mapGet(map, key));
58
60
  }
59
61
  return mapGet(map, key);
60
62
  };
@@ -3,6 +3,7 @@ const TINYBASE = 'tinybase';
3
3
  const isUndefined = (thing) => thing == void 0;
4
4
  const ifNotUndefined = (value, then, otherwise) =>
5
5
  isUndefined(value) ? otherwise?.() : then(value);
6
+ const isArray = (thing) => Array.isArray(thing);
6
7
  const size = (arrayOrString) => arrayOrString.length;
7
8
 
8
9
  const arrayMap = (array, cb) => array.map(cb);
@@ -12,8 +13,6 @@ const arrayShift = (array) => array.shift();
12
13
  const object = Object;
13
14
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
14
15
  const objEntries = object.entries;
15
- const objIds = object.keys;
16
- const objFreeze = object.freeze;
17
16
  const isObject = (obj) =>
18
17
  !isUndefined(obj) &&
19
18
  ifNotUndefined(
@@ -24,13 +23,15 @@ const isObject = (obj) =>
24
23
  /* istanbul ignore next */
25
24
  () => true,
26
25
  );
26
+ const objIds = object.keys;
27
+ const objFreeze = object.freeze;
27
28
  const objGet = (obj, id) => ifNotUndefined(obj, (obj2) => obj2[id]);
28
- const objHas = (obj, id) => !isUndefined(objGet(obj, id));
29
+ const objHas = (obj, id) => id in obj;
29
30
  const objDel = (obj, id) => {
30
31
  delete obj[id];
31
32
  return obj;
32
33
  };
33
- const objMap = (obj, cb) =>
34
+ const objToArray = (obj, cb) =>
34
35
  arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
35
36
  const objSize = (obj) => size(objIds(obj));
36
37
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
@@ -48,15 +49,35 @@ const mapNew = (entries) => new Map(entries);
48
49
  const mapGet = (map, key) => map?.get(key);
49
50
  const mapSet = (map, key, value) =>
50
51
  isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
51
- const mapEnsure = (map, key, getDefaultValue) => {
52
+ const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
52
53
  if (!collHas(map, key)) {
53
54
  mapSet(map, key, getDefaultValue());
55
+ } else {
56
+ hadExistingValue?.(mapGet(map, key));
54
57
  }
55
58
  return mapGet(map, key);
56
59
  };
57
60
 
58
61
  const scheduleRunning = mapNew();
59
62
  const scheduleActions = mapNew();
63
+ const getStoreFunctions = (supportsMergeableStore, store) =>
64
+ !supportsMergeableStore || isUndefined(store.getMergeableContent)
65
+ ? [
66
+ 0,
67
+ store.getContent,
68
+ store.getTransactionChanges,
69
+ ([changedTables, changedValues]) =>
70
+ !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
71
+ store.setContent,
72
+ ]
73
+ : [
74
+ 1,
75
+ store.getMergeableContent,
76
+ store.getTransactionMergeableChanges,
77
+ ([[changedTables], [changedValues]]) =>
78
+ !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
79
+ store.setDefaultContent,
80
+ ];
60
81
  const createCustomPersister = (
61
82
  store,
62
83
  getPersisted,
@@ -64,18 +85,25 @@ const createCustomPersister = (
64
85
  addPersisterListener,
65
86
  delPersisterListener,
66
87
  onIgnoredError,
67
- [getThing, thing] = [],
88
+ supportsMergeableStore,
89
+ extra = {},
68
90
  scheduleId = [],
69
91
  ) => {
70
- let listenerId;
71
92
  let loadSave = 0;
72
93
  let loads = 0;
73
94
  let saves = 0;
74
- let listening = 0;
75
95
  let action;
76
- let listeningHandle;
96
+ let autoLoadHandle;
97
+ let autoSaveListenerId;
77
98
  mapEnsure(scheduleRunning, scheduleId, () => 0);
78
99
  mapEnsure(scheduleActions, scheduleId, () => []);
100
+ const [
101
+ isMergeableStore,
102
+ getContent,
103
+ getChanges,
104
+ hasChanges,
105
+ setDefaultContent,
106
+ ] = getStoreFunctions(supportsMergeableStore, store);
79
107
  const run = async () => {
80
108
  /* istanbul ignore else */
81
109
  if (!mapGet(scheduleRunning, scheduleId)) {
@@ -107,48 +135,54 @@ const createCustomPersister = (
107
135
  }
108
136
  return persister;
109
137
  };
138
+ const setContentOrChanges = (contentOrChanges) => {
139
+ (isMergeableStore && isArray(contentOrChanges?.[0])
140
+ ? contentOrChanges?.[2] === 1
141
+ ? store.applyMergeableChanges
142
+ : store.setMergeableContent
143
+ : contentOrChanges?.[2] === 1
144
+ ? store.applyChanges
145
+ : store.setContent)(contentOrChanges);
146
+ };
110
147
  const persister = {
111
- load: async (initialTables, initialValues) =>
148
+ load: async (initialContent) =>
112
149
  await loadLock(async () => {
113
150
  try {
114
- store.setContent(await getPersisted());
115
- } catch {
116
- store.setContent([initialTables, initialValues]);
151
+ setContentOrChanges(await getPersisted());
152
+ } catch (error) {
153
+ onIgnoredError?.(error);
154
+ if (initialContent) {
155
+ setDefaultContent(initialContent);
156
+ }
117
157
  }
118
158
  }),
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
- }
159
+ startAutoLoad: async (initialContent) => {
160
+ await persister.stopAutoLoad().load(initialContent);
161
+ autoLoadHandle = addPersisterListener(
162
+ async (getContent2, getChanges2) => {
163
+ const changes = getChanges2?.();
164
+ await loadLock(async () => {
165
+ try {
166
+ setContentOrChanges(
167
+ changes ?? getContent2?.() ?? (await getPersisted()),
168
+ );
169
+ } catch (error) {
170
+ onIgnoredError?.(error);
171
+ }
172
+ });
139
173
  },
140
174
  );
141
175
  return persister;
142
176
  },
143
177
  stopAutoLoad: () => {
144
- if (listening) {
145
- delPersisterListener(listeningHandle);
146
- listeningHandle = void 0;
147
- listening = 0;
178
+ if (autoLoadHandle) {
179
+ delPersisterListener(autoLoadHandle);
180
+ autoLoadHandle = void 0;
148
181
  }
149
182
  return persister;
150
183
  },
151
- save: async (getTransactionChanges) => {
184
+ isAutoLoading: () => !isUndefined(autoLoadHandle),
185
+ save: async (getChanges2) => {
152
186
  /* istanbul ignore else */
153
187
  if (loadSave != 1) {
154
188
  loadSave = 2;
@@ -157,7 +191,7 @@ const createCustomPersister = (
157
191
  }
158
192
  await persister.schedule(async () => {
159
193
  try {
160
- await setPersisted(store.getContent, getTransactionChanges);
194
+ await setPersisted(getContent, getChanges2);
161
195
  } catch (error) {
162
196
  /* istanbul ignore next */
163
197
  onIgnoredError?.(error);
@@ -169,21 +203,20 @@ const createCustomPersister = (
169
203
  },
170
204
  startAutoSave: async () => {
171
205
  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
- );
206
+ autoSaveListenerId = store.addDidFinishTransactionListener(() => {
207
+ const changes = getChanges();
208
+ if (hasChanges(changes)) {
209
+ persister.save(() => changes);
210
+ }
211
+ });
180
212
  return persister;
181
213
  },
182
214
  stopAutoSave: () => {
183
- ifNotUndefined(listenerId, store.delListener);
184
- listenerId = void 0;
215
+ ifNotUndefined(autoSaveListenerId, store.delListener);
216
+ autoSaveListenerId = void 0;
185
217
  return persister;
186
218
  },
219
+ isAutoSaving: () => !isUndefined(autoSaveListenerId),
187
220
  schedule: async (...actions) => {
188
221
  arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
189
222
  await run();
@@ -192,10 +225,8 @@ const createCustomPersister = (
192
225
  getStore: () => store,
193
226
  destroy: () => persister.stopAutoLoad().stopAutoSave(),
194
227
  getStats: () => ({loads, saves}),
228
+ ...extra,
195
229
  };
196
- if (getThing) {
197
- persister[getThing] = () => thing;
198
- }
199
230
  return objFreeze(persister);
200
231
  };
201
232
 
@@ -208,56 +239,51 @@ const getDocContent = (doc, docObjName) => [
208
239
  doc[docObjName].t,
209
240
  doc[docObjName].v,
210
241
  ];
211
- const setTransactionChangesToDoc = (
212
- doc,
213
- docObjName,
214
- getContent,
215
- getTransactionChanges,
216
- ) => {
242
+ const applyChangesToDoc = (doc, docObjName, getContent, getChanges) => {
217
243
  ensureDocContent(doc, docObjName);
218
244
  const [docTables, docValues] = getDocContent(doc, docObjName);
219
- const transactionChangesDidFail = () => {
220
- transactionChangesFailed = 1;
245
+ const changesDidFail = () => {
246
+ changesFailed = 1;
221
247
  };
222
- let transactionChangesFailed = 1;
223
- ifNotUndefined(getTransactionChanges?.(), ([cellChanges, valueChanges]) => {
224
- transactionChangesFailed = 0;
225
- objMap(cellChanges, (table, tableId) =>
226
- transactionChangesFailed
248
+ let changesFailed = 1;
249
+ ifNotUndefined(getChanges?.(), ([cellChanges, valueChanges]) => {
250
+ changesFailed = 0;
251
+ objToArray(cellChanges, (table, tableId) =>
252
+ changesFailed
227
253
  ? 0
228
254
  : isUndefined(table)
229
255
  ? objDel(docTables, tableId)
230
256
  : ifNotUndefined(
231
257
  docTables[tableId],
232
258
  (docTable) =>
233
- objMap(table, (row, rowId) =>
234
- transactionChangesFailed
259
+ objToArray(table, (row, rowId) =>
260
+ changesFailed
235
261
  ? 0
236
262
  : isUndefined(row)
237
263
  ? objDel(docTable, rowId)
238
264
  : ifNotUndefined(
239
265
  objGet(docTable, rowId),
240
266
  (docRow) =>
241
- objMap(row, (cell, cellId) =>
267
+ objToArray(row, (cell, cellId) =>
242
268
  isUndefined(cell)
243
269
  ? objDel(docRow, cellId)
244
270
  : (docRow[cellId] = cell),
245
271
  ),
246
- transactionChangesDidFail,
272
+ changesDidFail,
247
273
  ),
248
274
  ),
249
- transactionChangesDidFail,
275
+ changesDidFail,
250
276
  ),
251
277
  );
252
- objMap(valueChanges, (value, valueId) =>
253
- transactionChangesFailed
278
+ objToArray(valueChanges, (value, valueId) =>
279
+ changesFailed
254
280
  ? 0
255
281
  : isUndefined(value)
256
282
  ? objDel(docValues, valueId)
257
283
  : (docValues[valueId] = value),
258
284
  );
259
285
  });
260
- if (transactionChangesFailed) {
286
+ if (changesFailed) {
261
287
  const [tables, values] = getContent();
262
288
  docObjMatch(docTables, void 0, tables, (_, tableId, table) =>
263
289
  docObjMatch(docTables, tableId, table, (docTable, rowId, row) =>
@@ -281,12 +307,12 @@ const docObjMatch = (docObjOrParent, idInParent, obj, set) => {
281
307
  ? docObjOrParent
282
308
  : objEnsure(docObjOrParent, idInParent, () => ({}));
283
309
  let changed;
284
- objMap(obj, (value, id) => {
310
+ objToArray(obj, (value, id) => {
285
311
  if (set(docObj, id, value)) {
286
312
  changed = 1;
287
313
  }
288
314
  });
289
- objMap(docObj, (_, id) => {
315
+ objToArray(docObj, (_, id) => {
290
316
  if (!objHas(obj, id)) {
291
317
  objDel(docObj, id);
292
318
  changed = 1;
@@ -304,18 +330,15 @@ const createAutomergePersister = (
304
330
  onIgnoredError,
305
331
  ) => {
306
332
  docHandle.change((doc) => (doc[docObjName] = {}));
307
- const getPersisted = async () =>
308
- objSize(docHandle.doc[docObjName]) == 2
309
- ? getDocContent(docHandle.doc, docObjName)
333
+ const getPersisted = async () => {
334
+ const doc = await docHandle.doc();
335
+ return objSize(doc[docObjName]) == 2
336
+ ? getDocContent(doc, docObjName)
310
337
  : void 0;
311
- const setPersisted = async (getContent, getTransactionChanges) =>
338
+ };
339
+ const setPersisted = async (getContent, getChanges) =>
312
340
  docHandle.change((doc) =>
313
- setTransactionChangesToDoc(
314
- doc,
315
- docObjName,
316
- getContent,
317
- getTransactionChanges,
318
- ),
341
+ applyChangesToDoc(doc, docObjName, getContent, getChanges),
319
342
  );
320
343
  const addPersisterListener = (listener) => {
321
344
  const observer = ({doc}) => listener(() => getDocContent(doc, docObjName));
@@ -332,7 +355,8 @@ const createAutomergePersister = (
332
355
  addPersisterListener,
333
356
  delPersisterListener,
334
357
  onIgnoredError,
335
- ['getDocHandle', docHandle],
358
+ false,
359
+ {getDocHandle: () => docHandle},
336
360
  );
337
361
  };
338
362
 
@@ -1,7 +1,7 @@
1
- const isInstanceOf = (thing, cls) => thing instanceof cls;
2
1
  const isUndefined = (thing) => thing == void 0;
3
2
  const ifNotUndefined = (value, then, otherwise) =>
4
3
  isUndefined(value) ? otherwise?.() : then(value);
4
+ const isArray = (thing) => Array.isArray(thing);
5
5
  const size = (arrayOrString) => arrayOrString.length;
6
6
 
7
7
  const arrayPush = (array, ...values) => array.push(...values);
@@ -9,8 +9,6 @@ const arrayShift = (array) => array.shift();
9
9
 
10
10
  const object = Object;
11
11
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
12
- const objIds = object.keys;
13
- const objFreeze = object.freeze;
14
12
  const isObject = (obj) =>
15
13
  !isUndefined(obj) &&
16
14
  ifNotUndefined(
@@ -21,14 +19,21 @@ const isObject = (obj) =>
21
19
  /* istanbul ignore next */
22
20
  () => true,
23
21
  );
22
+ const objIds = object.keys;
23
+ const objFreeze = object.freeze;
24
24
  const objSize = (obj) => size(objIds(obj));
25
25
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
26
26
 
27
- const jsonString = (obj) =>
27
+ const UNDEFINED_MARKER = '\uFFFC';
28
+ const jsonParse = JSON.parse;
29
+ const jsonStringWithUndefined = (obj) =>
28
30
  JSON.stringify(obj, (_key, value) =>
29
- isInstanceOf(value, Map) ? object.fromEntries([...value]) : value,
31
+ value === void 0 ? UNDEFINED_MARKER : value,
32
+ );
33
+ const jsonParseWithUndefined = (str) =>
34
+ JSON.parse(str, (_key, value) =>
35
+ value === UNDEFINED_MARKER ? void 0 : value,
30
36
  );
31
- const jsonParse = JSON.parse;
32
37
 
33
38
  const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
34
39
  const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
@@ -37,15 +42,35 @@ const mapNew = (entries) => new Map(entries);
37
42
  const mapGet = (map, key) => map?.get(key);
38
43
  const mapSet = (map, key, value) =>
39
44
  isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
40
- const mapEnsure = (map, key, getDefaultValue) => {
45
+ const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
41
46
  if (!collHas(map, key)) {
42
47
  mapSet(map, key, getDefaultValue());
48
+ } else {
49
+ hadExistingValue?.(mapGet(map, key));
43
50
  }
44
51
  return mapGet(map, key);
45
52
  };
46
53
 
47
54
  const scheduleRunning = mapNew();
48
55
  const scheduleActions = mapNew();
56
+ const getStoreFunctions = (supportsMergeableStore, store) =>
57
+ !supportsMergeableStore || isUndefined(store.getMergeableContent)
58
+ ? [
59
+ 0,
60
+ store.getContent,
61
+ store.getTransactionChanges,
62
+ ([changedTables, changedValues]) =>
63
+ !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
64
+ store.setContent,
65
+ ]
66
+ : [
67
+ 1,
68
+ store.getMergeableContent,
69
+ store.getTransactionMergeableChanges,
70
+ ([[changedTables], [changedValues]]) =>
71
+ !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
72
+ store.setDefaultContent,
73
+ ];
49
74
  const createCustomPersister = (
50
75
  store,
51
76
  getPersisted,
@@ -53,18 +78,25 @@ const createCustomPersister = (
53
78
  addPersisterListener,
54
79
  delPersisterListener,
55
80
  onIgnoredError,
56
- [getThing, thing] = [],
81
+ supportsMergeableStore,
82
+ extra = {},
57
83
  scheduleId = [],
58
84
  ) => {
59
- let listenerId;
60
85
  let loadSave = 0;
61
86
  let loads = 0;
62
87
  let saves = 0;
63
- let listening = 0;
64
88
  let action;
65
- let listeningHandle;
89
+ let autoLoadHandle;
90
+ let autoSaveListenerId;
66
91
  mapEnsure(scheduleRunning, scheduleId, () => 0);
67
92
  mapEnsure(scheduleActions, scheduleId, () => []);
93
+ const [
94
+ isMergeableStore,
95
+ getContent,
96
+ getChanges,
97
+ hasChanges,
98
+ setDefaultContent,
99
+ ] = getStoreFunctions(supportsMergeableStore, store);
68
100
  const run = async () => {
69
101
  /* istanbul ignore else */
70
102
  if (!mapGet(scheduleRunning, scheduleId)) {
@@ -96,48 +128,54 @@ const createCustomPersister = (
96
128
  }
97
129
  return persister;
98
130
  };
131
+ const setContentOrChanges = (contentOrChanges) => {
132
+ (isMergeableStore && isArray(contentOrChanges?.[0])
133
+ ? contentOrChanges?.[2] === 1
134
+ ? store.applyMergeableChanges
135
+ : store.setMergeableContent
136
+ : contentOrChanges?.[2] === 1
137
+ ? store.applyChanges
138
+ : store.setContent)(contentOrChanges);
139
+ };
99
140
  const persister = {
100
- load: async (initialTables, initialValues) =>
141
+ load: async (initialContent) =>
101
142
  await loadLock(async () => {
102
143
  try {
103
- store.setContent(await getPersisted());
104
- } catch {
105
- store.setContent([initialTables, initialValues]);
144
+ setContentOrChanges(await getPersisted());
145
+ } catch (error) {
146
+ onIgnoredError?.(error);
147
+ if (initialContent) {
148
+ setDefaultContent(initialContent);
149
+ }
106
150
  }
107
151
  }),
108
- startAutoLoad: async (initialTables = {}, initialValues = {}) => {
109
- persister.stopAutoLoad();
110
- await persister.load(initialTables, initialValues);
111
- listening = 1;
112
- listeningHandle = addPersisterListener(
113
- async (getContent, getTransactionChanges) => {
114
- if (getTransactionChanges) {
115
- const transactionChanges = getTransactionChanges();
116
- await loadLock(async () =>
117
- store.setTransactionChanges(transactionChanges),
118
- );
119
- } else {
120
- await loadLock(async () => {
121
- try {
122
- store.setContent(getContent?.() ?? (await getPersisted()));
123
- } catch (error) {
124
- onIgnoredError?.(error);
125
- }
126
- });
127
- }
152
+ startAutoLoad: async (initialContent) => {
153
+ await persister.stopAutoLoad().load(initialContent);
154
+ autoLoadHandle = addPersisterListener(
155
+ async (getContent2, getChanges2) => {
156
+ const changes = getChanges2?.();
157
+ await loadLock(async () => {
158
+ try {
159
+ setContentOrChanges(
160
+ changes ?? getContent2?.() ?? (await getPersisted()),
161
+ );
162
+ } catch (error) {
163
+ onIgnoredError?.(error);
164
+ }
165
+ });
128
166
  },
129
167
  );
130
168
  return persister;
131
169
  },
132
170
  stopAutoLoad: () => {
133
- if (listening) {
134
- delPersisterListener(listeningHandle);
135
- listeningHandle = void 0;
136
- listening = 0;
171
+ if (autoLoadHandle) {
172
+ delPersisterListener(autoLoadHandle);
173
+ autoLoadHandle = void 0;
137
174
  }
138
175
  return persister;
139
176
  },
140
- save: async (getTransactionChanges) => {
177
+ isAutoLoading: () => !isUndefined(autoLoadHandle),
178
+ save: async (getChanges2) => {
141
179
  /* istanbul ignore else */
142
180
  if (loadSave != 1) {
143
181
  loadSave = 2;
@@ -146,7 +184,7 @@ const createCustomPersister = (
146
184
  }
147
185
  await persister.schedule(async () => {
148
186
  try {
149
- await setPersisted(store.getContent, getTransactionChanges);
187
+ await setPersisted(getContent, getChanges2);
150
188
  } catch (error) {
151
189
  /* istanbul ignore next */
152
190
  onIgnoredError?.(error);
@@ -158,21 +196,20 @@ const createCustomPersister = (
158
196
  },
159
197
  startAutoSave: async () => {
160
198
  await persister.stopAutoSave().save();
161
- listenerId = store.addDidFinishTransactionListener(
162
- (_store, getTransactionChanges) => {
163
- const [tableChanges, valueChanges] = getTransactionChanges();
164
- if (!objIsEmpty(tableChanges) || !objIsEmpty(valueChanges)) {
165
- persister.save(() => [tableChanges, valueChanges]);
166
- }
167
- },
168
- );
199
+ autoSaveListenerId = store.addDidFinishTransactionListener(() => {
200
+ const changes = getChanges();
201
+ if (hasChanges(changes)) {
202
+ persister.save(() => changes);
203
+ }
204
+ });
169
205
  return persister;
170
206
  },
171
207
  stopAutoSave: () => {
172
- ifNotUndefined(listenerId, store.delListener);
173
- listenerId = void 0;
208
+ ifNotUndefined(autoSaveListenerId, store.delListener);
209
+ autoSaveListenerId = void 0;
174
210
  return persister;
175
211
  },
212
+ isAutoSaving: () => !isUndefined(autoSaveListenerId),
176
213
  schedule: async (...actions) => {
177
214
  arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
178
215
  await run();
@@ -181,10 +218,8 @@ const createCustomPersister = (
181
218
  getStore: () => store,
182
219
  destroy: () => persister.stopAutoLoad().stopAutoSave(),
183
220
  getStats: () => ({loads, saves}),
221
+ ...extra,
184
222
  };
185
- if (getThing) {
186
- persister[getThing] = () => thing;
187
- }
188
223
  return objFreeze(persister);
189
224
  };
190
225
 
@@ -196,9 +231,10 @@ const createStoragePersister = (
196
231
  storage,
197
232
  onIgnoredError,
198
233
  ) => {
199
- const getPersisted = async () => jsonParse(storage.getItem(storageName));
234
+ const getPersisted = async () =>
235
+ jsonParseWithUndefined(storage.getItem(storageName));
200
236
  const setPersisted = async (getContent) =>
201
- storage.setItem(storageName, jsonString(getContent()));
237
+ storage.setItem(storageName, jsonStringWithUndefined(getContent()));
202
238
  const addPersisterListener = (listener) => {
203
239
  const storageListener = (event) => {
204
240
  if (event.storageArea === storage && event.key === storageName) {
@@ -217,7 +253,8 @@ const createStoragePersister = (
217
253
  addPersisterListener,
218
254
  delPersisterListener,
219
255
  onIgnoredError,
220
- ['getStorageName', storageName],
256
+ true,
257
+ {getStorageName: () => storageName},
221
258
  );
222
259
  };
223
260
  const createLocalPersister = (store, storageName, onIgnoredError) =>