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