tinybase 5.0.0-beta.1 → 5.0.0-beta.3

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 (313) hide show
  1. package/lib/cjs/mergeable-store.cjs +1 -0
  2. package/lib/cjs/mergeable-store.cjs.gz +0 -0
  3. package/lib/cjs/persisters/persister-automerge.cjs +1 -1
  4. package/lib/cjs/persisters/persister-automerge.cjs.gz +0 -0
  5. package/lib/cjs/persisters/persister-browser.cjs +1 -1
  6. package/lib/cjs/persisters/persister-browser.cjs.gz +0 -0
  7. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  8. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  9. package/lib/cjs/persisters/persister-electric-sql.cjs +1 -1
  10. package/lib/cjs/persisters/persister-electric-sql.cjs.gz +0 -0
  11. package/lib/cjs/persisters/persister-expo-sqlite-next.cjs +1 -1
  12. package/lib/cjs/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  13. package/lib/cjs/persisters/persister-expo-sqlite.cjs +1 -1
  14. package/lib/cjs/persisters/persister-expo-sqlite.cjs.gz +0 -0
  15. package/lib/cjs/persisters/persister-file.cjs +1 -1
  16. package/lib/cjs/persisters/persister-file.cjs.gz +0 -0
  17. package/lib/cjs/persisters/persister-indexed-db.cjs +1 -1
  18. package/lib/cjs/persisters/persister-indexed-db.cjs.gz +0 -0
  19. package/lib/cjs/persisters/persister-partykit-client.cjs +1 -1
  20. package/lib/cjs/persisters/persister-partykit-client.cjs.gz +0 -0
  21. package/lib/cjs/persisters/persister-partykit-server.cjs +1 -1
  22. package/lib/cjs/persisters/persister-partykit-server.cjs.gz +0 -0
  23. package/lib/cjs/persisters/persister-remote.cjs +1 -1
  24. package/lib/cjs/persisters/persister-remote.cjs.gz +0 -0
  25. package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -1
  26. package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  27. package/lib/cjs/persisters/persister-sqlite3.cjs +1 -1
  28. package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
  29. package/lib/cjs/persisters/persister-yjs.cjs +1 -1
  30. package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
  31. package/lib/cjs/persisters.cjs +1 -1
  32. package/lib/cjs/persisters.cjs.gz +0 -0
  33. package/lib/cjs/store.cjs +1 -1
  34. package/lib/cjs/store.cjs.gz +0 -0
  35. package/lib/cjs/tinybase.cjs +1 -1
  36. package/lib/cjs/tinybase.cjs.gz +0 -0
  37. package/lib/cjs/tools.cjs +1 -1
  38. package/lib/cjs/tools.cjs.gz +0 -0
  39. package/lib/cjs/ui-react-dom-debug.cjs +1 -1
  40. package/lib/cjs/ui-react-dom-debug.cjs.gz +0 -0
  41. package/lib/cjs/ui-react-dom.cjs +1 -1
  42. package/lib/cjs/ui-react-dom.cjs.gz +0 -0
  43. package/lib/cjs-es6/mergeable-store.cjs +1 -0
  44. package/lib/cjs-es6/mergeable-store.cjs.gz +0 -0
  45. package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -1
  46. package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
  47. package/lib/cjs-es6/persisters/persister-browser.cjs +1 -1
  48. package/lib/cjs-es6/persisters/persister-browser.cjs.gz +0 -0
  49. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  50. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  51. package/lib/cjs-es6/persisters/persister-electric-sql.cjs +1 -1
  52. package/lib/cjs-es6/persisters/persister-electric-sql.cjs.gz +0 -0
  53. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs +1 -1
  54. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  55. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -1
  56. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
  57. package/lib/cjs-es6/persisters/persister-file.cjs +1 -1
  58. package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
  59. package/lib/cjs-es6/persisters/persister-indexed-db.cjs +1 -1
  60. package/lib/cjs-es6/persisters/persister-indexed-db.cjs.gz +0 -0
  61. package/lib/cjs-es6/persisters/persister-partykit-client.cjs +1 -1
  62. package/lib/cjs-es6/persisters/persister-partykit-client.cjs.gz +0 -0
  63. package/lib/cjs-es6/persisters/persister-partykit-server.cjs +1 -1
  64. package/lib/cjs-es6/persisters/persister-partykit-server.cjs.gz +0 -0
  65. package/lib/cjs-es6/persisters/persister-remote.cjs +1 -1
  66. package/lib/cjs-es6/persisters/persister-remote.cjs.gz +0 -0
  67. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -1
  68. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  69. package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -1
  70. package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
  71. package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -1
  72. package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
  73. package/lib/cjs-es6/persisters.cjs +1 -1
  74. package/lib/cjs-es6/persisters.cjs.gz +0 -0
  75. package/lib/cjs-es6/store.cjs +1 -1
  76. package/lib/cjs-es6/store.cjs.gz +0 -0
  77. package/lib/cjs-es6/tinybase.cjs +1 -1
  78. package/lib/cjs-es6/tinybase.cjs.gz +0 -0
  79. package/lib/cjs-es6/tools.cjs +1 -1
  80. package/lib/cjs-es6/tools.cjs.gz +0 -0
  81. package/lib/cjs-es6/ui-react-dom-debug.cjs +1 -1
  82. package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
  83. package/lib/cjs-es6/ui-react-dom.cjs +1 -1
  84. package/lib/cjs-es6/ui-react-dom.cjs.gz +0 -0
  85. package/lib/debug/mergeable-store.js +1863 -0
  86. package/lib/debug/persisters/persister-automerge.js +54 -53
  87. package/lib/debug/persisters/persister-browser.js +28 -18
  88. package/lib/debug/persisters/persister-cr-sqlite-wasm.js +80 -57
  89. package/lib/debug/persisters/persister-electric-sql.js +80 -57
  90. package/lib/debug/persisters/persister-expo-sqlite-next.js +80 -57
  91. package/lib/debug/persisters/persister-expo-sqlite.js +80 -57
  92. package/lib/debug/persisters/persister-file.js +27 -18
  93. package/lib/debug/persisters/persister-indexed-db.js +34 -23
  94. package/lib/debug/persisters/persister-partykit-client.js +26 -23
  95. package/lib/debug/persisters/persister-partykit-server.js +11 -21
  96. package/lib/debug/persisters/persister-remote.js +28 -18
  97. package/lib/debug/persisters/persister-sqlite-wasm.js +80 -57
  98. package/lib/debug/persisters/persister-sqlite3.js +80 -57
  99. package/lib/debug/persisters/persister-yjs.js +50 -48
  100. package/lib/debug/persisters.js +27 -18
  101. package/lib/debug/queries.js +2 -2
  102. package/lib/debug/store.js +63 -71
  103. package/lib/debug/tinybase.js +354 -90
  104. package/lib/debug/tools.js +13 -15
  105. package/lib/debug/ui-react-dom.js +115 -119
  106. package/lib/es6/mergeable-store.js +1 -0
  107. package/lib/es6/mergeable-store.js.gz +0 -0
  108. package/lib/es6/persisters/persister-automerge.js +1 -1
  109. package/lib/es6/persisters/persister-automerge.js.gz +0 -0
  110. package/lib/es6/persisters/persister-browser.js +1 -1
  111. package/lib/es6/persisters/persister-browser.js.gz +0 -0
  112. package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  113. package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  114. package/lib/es6/persisters/persister-electric-sql.js +1 -1
  115. package/lib/es6/persisters/persister-electric-sql.js.gz +0 -0
  116. package/lib/es6/persisters/persister-expo-sqlite-next.js +1 -1
  117. package/lib/es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  118. package/lib/es6/persisters/persister-expo-sqlite.js +1 -1
  119. package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
  120. package/lib/es6/persisters/persister-file.js +1 -1
  121. package/lib/es6/persisters/persister-file.js.gz +0 -0
  122. package/lib/es6/persisters/persister-indexed-db.js +1 -1
  123. package/lib/es6/persisters/persister-indexed-db.js.gz +0 -0
  124. package/lib/es6/persisters/persister-partykit-client.js +1 -1
  125. package/lib/es6/persisters/persister-partykit-client.js.gz +0 -0
  126. package/lib/es6/persisters/persister-partykit-server.js +1 -1
  127. package/lib/es6/persisters/persister-partykit-server.js.gz +0 -0
  128. package/lib/es6/persisters/persister-remote.js +1 -1
  129. package/lib/es6/persisters/persister-remote.js.gz +0 -0
  130. package/lib/es6/persisters/persister-sqlite-wasm.js +1 -1
  131. package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  132. package/lib/es6/persisters/persister-sqlite3.js +1 -1
  133. package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
  134. package/lib/es6/persisters/persister-yjs.js +1 -1
  135. package/lib/es6/persisters/persister-yjs.js.gz +0 -0
  136. package/lib/es6/persisters.js +1 -1
  137. package/lib/es6/persisters.js.gz +0 -0
  138. package/lib/es6/store.js +1 -1
  139. package/lib/es6/store.js.gz +0 -0
  140. package/lib/es6/tinybase.js +1 -1
  141. package/lib/es6/tinybase.js.gz +0 -0
  142. package/lib/es6/tools.js +1 -1
  143. package/lib/es6/tools.js.gz +0 -0
  144. package/lib/es6/ui-react-dom-debug.js +1 -1
  145. package/lib/es6/ui-react-dom-debug.js.gz +0 -0
  146. package/lib/es6/ui-react-dom.js +1 -1
  147. package/lib/es6/ui-react-dom.js.gz +0 -0
  148. package/lib/mergeable-store.js +1 -0
  149. package/lib/mergeable-store.js.gz +0 -0
  150. package/lib/persisters/persister-automerge.js +1 -1
  151. package/lib/persisters/persister-automerge.js.gz +0 -0
  152. package/lib/persisters/persister-browser.js +1 -1
  153. package/lib/persisters/persister-browser.js.gz +0 -0
  154. package/lib/persisters/persister-cr-sqlite-wasm.js +1 -1
  155. package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  156. package/lib/persisters/persister-electric-sql.js +1 -1
  157. package/lib/persisters/persister-electric-sql.js.gz +0 -0
  158. package/lib/persisters/persister-expo-sqlite-next.js +1 -1
  159. package/lib/persisters/persister-expo-sqlite-next.js.gz +0 -0
  160. package/lib/persisters/persister-expo-sqlite.js +1 -1
  161. package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
  162. package/lib/persisters/persister-file.js +1 -1
  163. package/lib/persisters/persister-file.js.gz +0 -0
  164. package/lib/persisters/persister-indexed-db.js +1 -1
  165. package/lib/persisters/persister-indexed-db.js.gz +0 -0
  166. package/lib/persisters/persister-partykit-client.js +1 -1
  167. package/lib/persisters/persister-partykit-client.js.gz +0 -0
  168. package/lib/persisters/persister-partykit-server.js +1 -1
  169. package/lib/persisters/persister-partykit-server.js.gz +0 -0
  170. package/lib/persisters/persister-remote.js +1 -1
  171. package/lib/persisters/persister-remote.js.gz +0 -0
  172. package/lib/persisters/persister-sqlite-wasm.js +1 -1
  173. package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
  174. package/lib/persisters/persister-sqlite3.js +1 -1
  175. package/lib/persisters/persister-sqlite3.js.gz +0 -0
  176. package/lib/persisters/persister-yjs.js +1 -1
  177. package/lib/persisters/persister-yjs.js.gz +0 -0
  178. package/lib/persisters.js +1 -1
  179. package/lib/persisters.js.gz +0 -0
  180. package/lib/store.js +1 -1
  181. package/lib/store.js.gz +0 -0
  182. package/lib/tinybase.js +1 -1
  183. package/lib/tinybase.js.gz +0 -0
  184. package/lib/tools.js +1 -1
  185. package/lib/tools.js.gz +0 -0
  186. package/lib/types/mergeable-store.d.ts +79 -0
  187. package/lib/types/persisters/persister-automerge.d.ts +8 -7
  188. package/lib/types/persisters/persister-browser.d.ts +2 -0
  189. package/lib/types/persisters/persister-cr-sqlite-wasm.d.ts +1 -0
  190. package/lib/types/persisters/persister-electric-sql.d.ts +1 -0
  191. package/lib/types/persisters/persister-expo-sqlite-next.d.ts +1 -0
  192. package/lib/types/persisters/persister-expo-sqlite.d.ts +1 -0
  193. package/lib/types/persisters/persister-file.d.ts +1 -0
  194. package/lib/types/persisters/persister-indexed-db.d.ts +1 -0
  195. package/lib/types/persisters/persister-partykit-client.d.ts +1 -0
  196. package/lib/types/persisters/persister-partykit-server.d.ts +12 -8
  197. package/lib/types/persisters/persister-remote.d.ts +1 -0
  198. package/lib/types/persisters/persister-sqlite-wasm.d.ts +1 -0
  199. package/lib/types/persisters/persister-sqlite3.d.ts +1 -0
  200. package/lib/types/persisters/persister-yjs.d.ts +1 -0
  201. package/lib/types/persisters.d.ts +50 -30
  202. package/lib/types/store.d.ts +241 -186
  203. package/lib/types/tinybase.d.ts +1 -0
  204. package/lib/types/tools.d.ts +2 -2
  205. package/lib/types/ui-react.d.ts +1 -0
  206. package/lib/types/with-schemas/internal/store.d.ts +4 -0
  207. package/lib/types/with-schemas/mergeable-store.d.ts +112 -0
  208. package/lib/types/with-schemas/persisters/persister-automerge.d.ts +8 -7
  209. package/lib/types/with-schemas/persisters/persister-browser.d.ts +2 -0
  210. package/lib/types/with-schemas/persisters/persister-cr-sqlite-wasm.d.ts +1 -0
  211. package/lib/types/with-schemas/persisters/persister-electric-sql.d.ts +1 -0
  212. package/lib/types/with-schemas/persisters/persister-expo-sqlite-next.d.ts +1 -0
  213. package/lib/types/with-schemas/persisters/persister-expo-sqlite.d.ts +1 -0
  214. package/lib/types/with-schemas/persisters/persister-file.d.ts +1 -0
  215. package/lib/types/with-schemas/persisters/persister-indexed-db.d.ts +1 -0
  216. package/lib/types/with-schemas/persisters/persister-partykit-client.d.ts +1 -0
  217. package/lib/types/with-schemas/persisters/persister-partykit-server.d.ts +15 -11
  218. package/lib/types/with-schemas/persisters/persister-remote.d.ts +1 -0
  219. package/lib/types/with-schemas/persisters/persister-sqlite-wasm.d.ts +1 -0
  220. package/lib/types/with-schemas/persisters/persister-sqlite3.d.ts +1 -0
  221. package/lib/types/with-schemas/persisters/persister-yjs.d.ts +1 -0
  222. package/lib/types/with-schemas/persisters.d.ts +81 -45
  223. package/lib/types/with-schemas/store.d.ts +364 -273
  224. package/lib/types/with-schemas/tinybase.d.ts +1 -0
  225. package/lib/types/with-schemas/tools.d.ts +2 -2
  226. package/lib/ui-react-dom.js +1 -1
  227. package/lib/ui-react-dom.js.gz +0 -0
  228. package/lib/umd/mergeable-store.js +1 -0
  229. package/lib/umd/mergeable-store.js.gz +0 -0
  230. package/lib/umd/persisters/persister-automerge.js +1 -1
  231. package/lib/umd/persisters/persister-automerge.js.gz +0 -0
  232. package/lib/umd/persisters/persister-browser.js +1 -1
  233. package/lib/umd/persisters/persister-browser.js.gz +0 -0
  234. package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
  235. package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  236. package/lib/umd/persisters/persister-electric-sql.js +1 -1
  237. package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
  238. package/lib/umd/persisters/persister-expo-sqlite-next.js +1 -1
  239. package/lib/umd/persisters/persister-expo-sqlite-next.js.gz +0 -0
  240. package/lib/umd/persisters/persister-expo-sqlite.js +1 -1
  241. package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
  242. package/lib/umd/persisters/persister-file.js +1 -1
  243. package/lib/umd/persisters/persister-file.js.gz +0 -0
  244. package/lib/umd/persisters/persister-indexed-db.js +1 -1
  245. package/lib/umd/persisters/persister-indexed-db.js.gz +0 -0
  246. package/lib/umd/persisters/persister-partykit-client.js +1 -1
  247. package/lib/umd/persisters/persister-partykit-client.js.gz +0 -0
  248. package/lib/umd/persisters/persister-partykit-server.js +1 -1
  249. package/lib/umd/persisters/persister-partykit-server.js.gz +0 -0
  250. package/lib/umd/persisters/persister-remote.js +1 -1
  251. package/lib/umd/persisters/persister-remote.js.gz +0 -0
  252. package/lib/umd/persisters/persister-sqlite-wasm.js +1 -1
  253. package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
  254. package/lib/umd/persisters/persister-sqlite3.js +1 -1
  255. package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
  256. package/lib/umd/persisters/persister-yjs.js +1 -1
  257. package/lib/umd/persisters/persister-yjs.js.gz +0 -0
  258. package/lib/umd/persisters.js +1 -1
  259. package/lib/umd/persisters.js.gz +0 -0
  260. package/lib/umd/store.js +1 -1
  261. package/lib/umd/store.js.gz +0 -0
  262. package/lib/umd/tinybase.js +1 -1
  263. package/lib/umd/tinybase.js.gz +0 -0
  264. package/lib/umd/tools.js +1 -1
  265. package/lib/umd/tools.js.gz +0 -0
  266. package/lib/umd/ui-react-dom-debug.js +1 -1
  267. package/lib/umd/ui-react-dom-debug.js.gz +0 -0
  268. package/lib/umd/ui-react-dom.js +1 -1
  269. package/lib/umd/ui-react-dom.js.gz +0 -0
  270. package/lib/umd-es6/mergeable-store.js +1 -0
  271. package/lib/umd-es6/mergeable-store.js.gz +0 -0
  272. package/lib/umd-es6/persisters/persister-automerge.js +1 -1
  273. package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
  274. package/lib/umd-es6/persisters/persister-browser.js +1 -1
  275. package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
  276. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  277. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  278. package/lib/umd-es6/persisters/persister-electric-sql.js +1 -1
  279. package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
  280. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js +1 -1
  281. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  282. package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -1
  283. package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
  284. package/lib/umd-es6/persisters/persister-file.js +1 -1
  285. package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
  286. package/lib/umd-es6/persisters/persister-indexed-db.js +1 -1
  287. package/lib/umd-es6/persisters/persister-indexed-db.js.gz +0 -0
  288. package/lib/umd-es6/persisters/persister-partykit-client.js +1 -1
  289. package/lib/umd-es6/persisters/persister-partykit-client.js.gz +0 -0
  290. package/lib/umd-es6/persisters/persister-partykit-server.js +1 -1
  291. package/lib/umd-es6/persisters/persister-partykit-server.js.gz +0 -0
  292. package/lib/umd-es6/persisters/persister-remote.js +1 -1
  293. package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
  294. package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -1
  295. package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  296. package/lib/umd-es6/persisters/persister-sqlite3.js +1 -1
  297. package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
  298. package/lib/umd-es6/persisters/persister-yjs.js +1 -1
  299. package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
  300. package/lib/umd-es6/persisters.js +1 -1
  301. package/lib/umd-es6/persisters.js.gz +0 -0
  302. package/lib/umd-es6/store.js +1 -1
  303. package/lib/umd-es6/store.js.gz +0 -0
  304. package/lib/umd-es6/tinybase.js +1 -1
  305. package/lib/umd-es6/tinybase.js.gz +0 -0
  306. package/lib/umd-es6/tools.js +1 -1
  307. package/lib/umd-es6/tools.js.gz +0 -0
  308. package/lib/umd-es6/ui-react-dom-debug.js +1 -1
  309. package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
  310. package/lib/umd-es6/ui-react-dom.js +1 -1
  311. package/lib/umd-es6/ui-react-dom.js.gz +0 -0
  312. package/package.json +39 -35
  313. package/readme.md +2 -2
@@ -29,6 +29,10 @@ const VALUE = 'Value';
29
29
  const VALUES = VALUE + 's';
30
30
  const VALUE_IDS = VALUE + IDS;
31
31
  const id = (key) => EMPTY_STRING + key;
32
+ const strStartsWith = (str, prefix) => str.startsWith(prefix);
33
+ const strEndsWith = (str, suffix) => str.endsWith(suffix);
34
+ const strSplit = (str, separator = '', limit) => str.split(separator, limit);
35
+ const strCharCodeAt = (str, position = 0) => str.charCodeAt(position);
32
36
 
33
37
  const mathMax = Math.max;
34
38
  const mathMin = Math.min;
@@ -84,13 +88,15 @@ const isObject = (obj) =>
84
88
  /* istanbul ignore next */
85
89
  () => true,
86
90
  );
87
- const objGet = (obj, id) => ifNotUndefined(obj, (obj2) => obj2[id]);
88
- const objHas = (obj, id) => !isUndefined(objGet(obj, id));
91
+ const objNew = (entries = []) => object.fromEntries(entries);
92
+ const objHas = (obj, id) => id in obj;
89
93
  const objDel = (obj, id) => {
90
94
  delete obj[id];
91
95
  return obj;
92
96
  };
93
- const objMap = (obj, cb) =>
97
+ const objForEach = (obj, cb) =>
98
+ arrayForEach(objEntries(obj), ([id, value]) => cb(value, id));
99
+ const objToArray = (obj, cb) =>
94
100
  arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
95
101
  const objSize = (obj) => size(objIds(obj));
96
102
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
@@ -124,7 +130,7 @@ const mapEnsure = (map, key, getDefaultValue) => {
124
130
  return mapGet(map, key);
125
131
  };
126
132
  const mapMatch = (map, obj, set, del = mapSet) => {
127
- objMap(obj, (value, id) => set(map, id, value));
133
+ objToArray(obj, (value, id) => set(map, id, value));
128
134
  mapForEach(map, (id) => (objHas(obj, id) ? 0 : del(map, id)));
129
135
  return map;
130
136
  };
@@ -1086,6 +1092,7 @@ const createCustomPersister = (
1086
1092
  addPersisterListener,
1087
1093
  delPersisterListener,
1088
1094
  onIgnoredError,
1095
+ supportsMergeableStore,
1089
1096
  [getThing, thing] = [],
1090
1097
  scheduleId = [],
1091
1098
  ) => {
@@ -1098,6 +1105,10 @@ const createCustomPersister = (
1098
1105
  let listeningHandle;
1099
1106
  mapEnsure(scheduleRunning, scheduleId, () => 0);
1100
1107
  mapEnsure(scheduleActions, scheduleId, () => []);
1108
+ const getContent =
1109
+ (supportsMergeableStore ? store.getMergeableContent : null) ??
1110
+ store.getContent;
1111
+ const getChanges = store.getTransactionChanges;
1101
1112
  const run = async () => {
1102
1113
  /* istanbul ignore else */
1103
1114
  if (!mapGet(scheduleRunning, scheduleId)) {
@@ -1133,7 +1144,10 @@ const createCustomPersister = (
1133
1144
  load: async (initialTables, initialValues) =>
1134
1145
  await loadLock(async () => {
1135
1146
  try {
1136
- store.setContent(await getPersisted());
1147
+ const content = await getPersisted();
1148
+ (supportsMergeableStore && isString(content[0])
1149
+ ? store.applyMergeableChanges
1150
+ : store.setContent)(content);
1137
1151
  } catch {
1138
1152
  store.setContent([initialTables, initialValues]);
1139
1153
  }
@@ -1143,16 +1157,14 @@ const createCustomPersister = (
1143
1157
  await persister.load(initialTables, initialValues);
1144
1158
  listening = 1;
1145
1159
  listeningHandle = addPersisterListener(
1146
- async (getContent, getTransactionChanges) => {
1147
- if (getTransactionChanges) {
1148
- const transactionChanges = getTransactionChanges();
1149
- await loadLock(async () =>
1150
- store.setTransactionChanges(transactionChanges),
1151
- );
1160
+ async (getContent2, getChanges2) => {
1161
+ if (getChanges2) {
1162
+ const changes = getChanges2();
1163
+ await loadLock(async () => store.applyChanges(changes));
1152
1164
  } else {
1153
1165
  await loadLock(async () => {
1154
1166
  try {
1155
- store.setContent(getContent?.() ?? (await getPersisted()));
1167
+ store.setContent(getContent2?.() ?? (await getPersisted()));
1156
1168
  } catch (error) {
1157
1169
  onIgnoredError?.(error);
1158
1170
  }
@@ -1170,7 +1182,7 @@ const createCustomPersister = (
1170
1182
  }
1171
1183
  return persister;
1172
1184
  },
1173
- save: async (getTransactionChanges) => {
1185
+ save: async (getChanges2) => {
1174
1186
  /* istanbul ignore else */
1175
1187
  if (loadSave != 1) {
1176
1188
  loadSave = 2;
@@ -1179,7 +1191,7 @@ const createCustomPersister = (
1179
1191
  }
1180
1192
  await persister.schedule(async () => {
1181
1193
  try {
1182
- await setPersisted(store.getContent, getTransactionChanges);
1194
+ await setPersisted(getContent, getChanges2);
1183
1195
  } catch (error) {
1184
1196
  /* istanbul ignore next */
1185
1197
  onIgnoredError?.(error);
@@ -1191,14 +1203,12 @@ const createCustomPersister = (
1191
1203
  },
1192
1204
  startAutoSave: async () => {
1193
1205
  await persister.stopAutoSave().save();
1194
- listenerId = store.addDidFinishTransactionListener(
1195
- (_store, getTransactionChanges) => {
1196
- const [tableChanges, valueChanges] = getTransactionChanges();
1197
- if (!objIsEmpty(tableChanges) || !objIsEmpty(valueChanges)) {
1198
- persister.save(() => [tableChanges, valueChanges]);
1199
- }
1200
- },
1201
- );
1206
+ listenerId = store.addDidFinishTransactionListener(() => {
1207
+ const [tableChanges, valueChanges] = getChanges();
1208
+ if (!objIsEmpty(tableChanges) || !objIsEmpty(valueChanges)) {
1209
+ persister.save(() => [tableChanges, valueChanges]);
1210
+ }
1211
+ });
1202
1212
  return persister;
1203
1213
  },
1204
1214
  stopAutoSave: () => {
@@ -1648,7 +1658,7 @@ const createQueries = getCreateFunction((store) => {
1648
1658
  destroy,
1649
1659
  getListenerStats,
1650
1660
  };
1651
- objMap(
1661
+ objToArray(
1652
1662
  {
1653
1663
  [TABLE]: [1, 1],
1654
1664
  [TABLE + CELL_IDS]: [0, 1],
@@ -1869,6 +1879,35 @@ const createRelationships = getCreateFunction((store) => {
1869
1879
  return objFreeze(relationships);
1870
1880
  });
1871
1881
 
1882
+ const stampNew = () => [EMPTY_STRING, void 0];
1883
+ const stampNewMap = () => [EMPTY_STRING, mapNew()];
1884
+ const mapStamp = ([stamp, value], mapper) => [stamp, mapper(value, stamp)];
1885
+ const mapStampMapToObj = (stampedMap, mapper) =>
1886
+ mapStamp(stampedMap, (map) => mapToObj(map, mapper));
1887
+ const mergeStamps = (newThingStamps, thingStamps, changes, merge) =>
1888
+ objForEach(newThingStamps, (newThingStamp, thingId) =>
1889
+ mergeStamp(
1890
+ newThingStamp,
1891
+ mapEnsure(thingStamps, thingId, stampNewMap),
1892
+ (changes[thingId] = objNew()),
1893
+ merge,
1894
+ ),
1895
+ );
1896
+ const mergeStamp = ([newTime, newThing], thingStamp, changes, merge) => {
1897
+ if (newTime > thingStamp[0]) {
1898
+ thingStamp[0] = newTime;
1899
+ }
1900
+ merge(newThing, thingStamp[1], changes);
1901
+ };
1902
+ const mergeLeafStamps = (newLeafStamps, leafStamps, changes) =>
1903
+ objForEach(newLeafStamps, ([newTime, newLeaf], leafId) => {
1904
+ const leafStamp = mapEnsure(leafStamps, leafId, stampNew);
1905
+ if (newTime > leafStamp[0]) {
1906
+ leafStamp[0] = newTime;
1907
+ leafStamp[1] = changes[leafId] = newLeaf;
1908
+ }
1909
+ });
1910
+
1872
1911
  const pairNew = (value) => [value, value];
1873
1912
  const pairCollSize2 = (pair, func = collSize2) => func(pair[0]) + func(pair[1]);
1874
1913
  const pairNewMap = () => [mapNew(), mapNew()];
@@ -1886,7 +1925,7 @@ const validate = (obj, validateChild, onInvalidObj) => {
1886
1925
  onInvalidObj?.();
1887
1926
  return false;
1888
1927
  }
1889
- objMap(obj, (child, id2) => {
1928
+ objToArray(obj, (child, id2) => {
1890
1929
  if (!validateChild(child, id2)) {
1891
1930
  objDel(obj, id2);
1892
1931
  }
@@ -1907,6 +1946,7 @@ const createStore = () => {
1907
1946
  let hadTables = false;
1908
1947
  let hadValues = false;
1909
1948
  let transactions = 0;
1949
+ let postTransactionListener;
1910
1950
  const changedTableIds = mapNew();
1911
1951
  const changedTableCellIds = mapNew();
1912
1952
  const changedRowCount = mapNew();
@@ -2548,44 +2588,6 @@ const createStore = () => {
2548
2588
  transaction(() => actions(...arrayMap(args, id)));
2549
2589
  return store;
2550
2590
  };
2551
- const getTransactionChanges = () => [
2552
- mapToObj(
2553
- changedCells,
2554
- (table, tableId) =>
2555
- mapGet(changedTableIds, tableId) === -1
2556
- ? null
2557
- : mapToObj(
2558
- table,
2559
- (row, rowId) =>
2560
- mapGet(mapGet(changedRowIds, tableId), rowId) === -1
2561
- ? null
2562
- : mapToObj(
2563
- row,
2564
- ([, newCell]) => newCell ?? null,
2565
- (_, changedCell) => pairIsEqual(changedCell),
2566
- ),
2567
- objIsEmpty,
2568
- ),
2569
- objIsEmpty,
2570
- ),
2571
- mapToObj(
2572
- changedValues,
2573
- ([, newValue]) => newValue ?? null,
2574
- (_, changedValue) => pairIsEqual(changedValue),
2575
- ),
2576
- ];
2577
- const getTransactionLog = () => ({
2578
- cellsTouched,
2579
- valuesTouched,
2580
- changedCells: mapToObj3(changedCells, pairClone, pairIsEqual),
2581
- invalidCells: mapToObj3(invalidCells),
2582
- changedValues: mapToObj(changedValues, pairClone, pairIsEqual),
2583
- invalidValues: mapToObj(invalidValues),
2584
- changedTableIds: mapToObj(changedTableIds),
2585
- changedRowIds: mapToObj2(changedRowIds),
2586
- changedCellIds: mapToObj3(changedCellIds),
2587
- changedValueIds: mapToObj(changedValueIds),
2588
- });
2589
2591
  const getContent = () => [getTables(), getValues()];
2590
2592
  const getTables = () => mapToObj3(tablesMap);
2591
2593
  const getTableIds = () => mapKeys(tablesMap);
@@ -2678,7 +2680,7 @@ const createStore = () => {
2678
2680
  (tableId2, rowId2) => {
2679
2681
  if (validateRow(tableId2, rowId2, partialRow, 1)) {
2680
2682
  const table = getOrCreateTable(tableId2);
2681
- objMap(partialRow, (cell, cellId) =>
2683
+ objToArray(partialRow, (cell, cellId) =>
2682
2684
  setCellIntoDefaultRow(tableId2, table, rowId2, cellId, cell),
2683
2685
  );
2684
2686
  }
@@ -2716,7 +2718,7 @@ const createStore = () => {
2716
2718
  const setPartialValues = (partialValues) =>
2717
2719
  fluentTransaction(() =>
2718
2720
  validateValues(partialValues, 1)
2719
- ? objMap(partialValues, (value, valueId) =>
2721
+ ? objToArray(partialValues, (value, valueId) =>
2720
2722
  setValidValue(valueId, value),
2721
2723
  )
2722
2724
  : 0,
@@ -2733,20 +2735,20 @@ const createStore = () => {
2733
2735
  ),
2734
2736
  valueId,
2735
2737
  );
2736
- const setTransactionChanges = (transactionChanges) =>
2738
+ const applyChanges = (changes) =>
2737
2739
  fluentTransaction(() => {
2738
- objMap(transactionChanges[0], (table, tableId) =>
2740
+ objToArray(changes[0], (table, tableId) =>
2739
2741
  isUndefined(table)
2740
2742
  ? delTable(tableId)
2741
- : objMap(table, (row, rowId) =>
2743
+ : objToArray(table, (row, rowId) =>
2742
2744
  isUndefined(row)
2743
2745
  ? delRow(tableId, rowId)
2744
- : objMap(row, (cell, cellId) =>
2746
+ : objToArray(row, (cell, cellId) =>
2745
2747
  setOrDelCell(store, tableId, rowId, cellId, cell),
2746
2748
  ),
2747
2749
  ),
2748
2750
  );
2749
- objMap(transactionChanges[1], (value, valueId) =>
2751
+ objToArray(changes[1], (value, valueId) =>
2750
2752
  setOrDelValue(store, valueId, value),
2751
2753
  );
2752
2754
  });
@@ -2873,15 +2875,48 @@ const createStore = () => {
2873
2875
  transactions++;
2874
2876
  }
2875
2877
  if (transactions == 1) {
2876
- callListeners(
2877
- startTransactionListeners,
2878
- void 0,
2879
- getTransactionChanges,
2880
- getTransactionLog,
2881
- );
2878
+ callListeners(startTransactionListeners, void 0);
2882
2879
  }
2883
2880
  return store;
2884
2881
  };
2882
+ const getTransactionChanges = () => [
2883
+ mapToObj(
2884
+ changedCells,
2885
+ (table, tableId) =>
2886
+ mapGet(changedTableIds, tableId) === -1
2887
+ ? void 0
2888
+ : mapToObj(
2889
+ table,
2890
+ (row, rowId) =>
2891
+ mapGet(mapGet(changedRowIds, tableId), rowId) === -1
2892
+ ? void 0
2893
+ : mapToObj(
2894
+ row,
2895
+ ([, newCell]) => newCell,
2896
+ (_, changedCell) => pairIsEqual(changedCell),
2897
+ ),
2898
+ objIsEmpty,
2899
+ ),
2900
+ objIsEmpty,
2901
+ ),
2902
+ mapToObj(
2903
+ changedValues,
2904
+ ([, newValue]) => newValue,
2905
+ (_, changedValue) => pairIsEqual(changedValue),
2906
+ ),
2907
+ ];
2908
+ const getTransactionLog = () => [
2909
+ cellsTouched,
2910
+ valuesTouched,
2911
+ mapToObj3(changedCells, pairClone, pairIsEqual),
2912
+ mapToObj3(invalidCells),
2913
+ mapToObj(changedValues, pairClone, pairIsEqual),
2914
+ mapToObj(invalidValues),
2915
+ mapToObj(changedTableIds),
2916
+ mapToObj2(changedRowIds),
2917
+ mapToObj3(changedCellIds),
2918
+ mapToObj(changedValueIds),
2919
+ ];
2885
2920
  const finishTransaction = (doRollback) => {
2886
2921
  if (transactions > 0) {
2887
2922
  transactions--;
@@ -2897,7 +2932,7 @@ const createStore = () => {
2897
2932
  if (valuesTouched) {
2898
2933
  callValuesListenersForChanges(1);
2899
2934
  }
2900
- if (doRollback?.(getTransactionChanges, getTransactionLog)) {
2935
+ if (doRollback?.(store)) {
2901
2936
  collForEach(changedCells, (table, tableId) =>
2902
2937
  collForEach(table, (row, rowId) =>
2903
2938
  collForEach(row, ([oldCell], cellId) =>
@@ -2910,12 +2945,7 @@ const createStore = () => {
2910
2945
  );
2911
2946
  cellsTouched = valuesTouched = false;
2912
2947
  }
2913
- callListeners(
2914
- finishTransactionListeners[0],
2915
- void 0,
2916
- getTransactionChanges,
2917
- getTransactionLog,
2918
- );
2948
+ callListeners(finishTransactionListeners[0], void 0);
2919
2949
  transactions = -1;
2920
2950
  callInvalidCellListeners(0);
2921
2951
  if (cellsTouched) {
@@ -2925,12 +2955,8 @@ const createStore = () => {
2925
2955
  if (valuesTouched) {
2926
2956
  callValuesListenersForChanges(0);
2927
2957
  }
2928
- callListeners(
2929
- finishTransactionListeners[1],
2930
- void 0,
2931
- getTransactionChanges,
2932
- getTransactionLog,
2933
- );
2958
+ postTransactionListener?.(store);
2959
+ callListeners(finishTransactionListeners[1], void 0);
2934
2960
  transactions = 0;
2935
2961
  cellsTouched = valuesTouched = false;
2936
2962
  hadTables = hasTables();
@@ -3057,6 +3083,9 @@ const createStore = () => {
3057
3083
  collSize2(startTransactionListeners) +
3058
3084
  pairCollSize2(finishTransactionListeners),
3059
3085
  });
3086
+ const addPostTransactionListener = (listener) => {
3087
+ postTransactionListener = listener;
3088
+ };
3060
3089
  const store = {
3061
3090
  getContent,
3062
3091
  getTables,
@@ -3097,7 +3126,7 @@ const createStore = () => {
3097
3126
  setValues,
3098
3127
  setPartialValues,
3099
3128
  setValue,
3100
- setTransactionChanges,
3129
+ applyChanges,
3101
3130
  setTablesJson,
3102
3131
  setValuesJson,
3103
3132
  setJson,
@@ -3115,6 +3144,8 @@ const createStore = () => {
3115
3144
  delSchema,
3116
3145
  transaction,
3117
3146
  startTransaction,
3147
+ getTransactionChanges,
3148
+ getTransactionLog,
3118
3149
  finishTransaction,
3119
3150
  forEachTable,
3120
3151
  forEachTableCell,
@@ -3132,8 +3163,9 @@ const createStore = () => {
3132
3163
  createStore,
3133
3164
  addListener,
3134
3165
  callListeners,
3166
+ addPostTransactionListener,
3135
3167
  };
3136
- objMap(
3168
+ objToArray(
3137
3169
  {
3138
3170
  [HAS + TABLES]: [0, hasTablesListeners, [], () => [hasTables()]],
3139
3171
  [TABLES]: [0, tablesListeners],
@@ -3206,10 +3238,242 @@ const createStore = () => {
3206
3238
  return objFreeze(store);
3207
3239
  };
3208
3240
 
3241
+ const MASK6 = 63;
3242
+ const SHIFT36 = 2 ** 36;
3243
+ const SHIFT30 = 2 ** 30;
3244
+ const SHIFT24 = 2 ** 24;
3245
+ const SHIFT18 = 2 ** 18;
3246
+ const SHIFT12 = 2 ** 12;
3247
+ const SHIFT6 = 2 ** 6;
3248
+ const toB64 = (num) => String.fromCharCode(48 + (num & MASK6));
3249
+ const fromB64 = (str, pos) => strCharCodeAt(str, pos) - 48;
3250
+ const hash = (value) =>
3251
+ arrayReduce(
3252
+ strSplit(value),
3253
+ (hash2, char) => ((hash2 << 5) + hash2) ^ strCharCodeAt(char),
3254
+ 5381,
3255
+ ) >>> 0;
3256
+ const encodeHlc = (logicalTime42, counter24, clientHash30) =>
3257
+ toB64(logicalTime42 / SHIFT36) +
3258
+ toB64(logicalTime42 / SHIFT30) +
3259
+ toB64(logicalTime42 / SHIFT24) +
3260
+ toB64(logicalTime42 / SHIFT18) +
3261
+ toB64(logicalTime42 / SHIFT12) +
3262
+ toB64(logicalTime42 / SHIFT6) +
3263
+ toB64(logicalTime42) +
3264
+ toB64(counter24 / SHIFT18) +
3265
+ toB64(counter24 / SHIFT12) +
3266
+ toB64(counter24 / SHIFT6) +
3267
+ toB64(counter24) +
3268
+ toB64(clientHash30 / SHIFT24) +
3269
+ toB64(clientHash30 / SHIFT18) +
3270
+ toB64(clientHash30 / SHIFT12) +
3271
+ toB64(clientHash30 / SHIFT6) +
3272
+ toB64(clientHash30);
3273
+ const decodeHlc = (hlc16) => [
3274
+ fromB64(hlc16, 0) * SHIFT36 +
3275
+ fromB64(hlc16, 1) * SHIFT30 +
3276
+ fromB64(hlc16, 2) * SHIFT24 +
3277
+ fromB64(hlc16, 3) * SHIFT18 +
3278
+ fromB64(hlc16, 4) * SHIFT12 +
3279
+ fromB64(hlc16, 5) * SHIFT6 +
3280
+ fromB64(hlc16, 6),
3281
+ fromB64(hlc16, 7) * SHIFT18 +
3282
+ fromB64(hlc16, 8) * SHIFT12 +
3283
+ fromB64(hlc16, 9) * SHIFT6 +
3284
+ fromB64(hlc16, 10),
3285
+ fromB64(hlc16, 11) * SHIFT24 +
3286
+ fromB64(hlc16, 12) * SHIFT18 +
3287
+ fromB64(hlc16, 13) * SHIFT12 +
3288
+ fromB64(hlc16, 14) * SHIFT6 +
3289
+ fromB64(hlc16, 15),
3290
+ ];
3291
+ const getHlcFunctions = (uniqueId) => {
3292
+ let logicalTime = 0;
3293
+ let counter = 0;
3294
+ const uniqueIdHash = hash(uniqueId);
3295
+ const getHlc = () => {
3296
+ seenHlc();
3297
+ return encodeHlc(logicalTime, ++counter, uniqueIdHash);
3298
+ };
3299
+ const seenHlc = (hlc) => {
3300
+ const previousLogicalTime = logicalTime;
3301
+ const [remoteLogicalTime, remoteCounter] = isUndefined(hlc)
3302
+ ? [0, 0]
3303
+ : decodeHlc(hlc);
3304
+ logicalTime = Math.max(previousLogicalTime, remoteLogicalTime, Date.now());
3305
+ counter =
3306
+ logicalTime == previousLogicalTime
3307
+ ? logicalTime == remoteLogicalTime
3308
+ ? Math.max(counter, remoteCounter)
3309
+ : counter
3310
+ : logicalTime == remoteLogicalTime
3311
+ ? remoteCounter
3312
+ : -1;
3313
+ };
3314
+ return [getHlc, seenHlc];
3315
+ };
3316
+
3317
+ const LISTENER_ARGS = {
3318
+ HasTable: 1,
3319
+ Table: 1,
3320
+ TableCellIds: 1,
3321
+ HasTableCell: 2,
3322
+ RowCount: 1,
3323
+ RowIds: 1,
3324
+ SortedRowIds: 5,
3325
+ HasRow: 2,
3326
+ Row: 2,
3327
+ CellIds: 2,
3328
+ HasCell: 3,
3329
+ Cell: 3,
3330
+ HasValue: 1,
3331
+ Value: 1,
3332
+ InvalidCell: 3,
3333
+ InvalidValue: 1,
3334
+ };
3335
+ const newContentStamp = () => [EMPTY_STRING, [stampNewMap(), stampNewMap()]];
3336
+ const createMergeableStore = (id) => {
3337
+ let listening = 1;
3338
+ let contentStamp = newContentStamp();
3339
+ const [getHlc, seenHlc] = getHlcFunctions(id);
3340
+ const store = createStore();
3341
+ const disableListening = (actions) => {
3342
+ const wasListening = listening;
3343
+ listening = 0;
3344
+ actions();
3345
+ listening = wasListening;
3346
+ };
3347
+ const postTransactionListener = () => {
3348
+ if (listening) {
3349
+ const stamp = getHlc();
3350
+ const [cellsTouched, valuesTouched, changedCells, , changedValues] =
3351
+ store.getTransactionLog();
3352
+ const [tablesStamp, valuesStamp] = contentStamp[1];
3353
+ contentStamp[0] = stamp;
3354
+ if (cellsTouched) {
3355
+ tablesStamp[0] = stamp;
3356
+ objToArray(changedCells, (changedTable, tableId) => {
3357
+ const tableStamp = mapEnsure(tablesStamp[1], tableId, stampNew);
3358
+ const rowsStamp = (tableStamp[1] ??= mapNew());
3359
+ tableStamp[0] = stamp;
3360
+ objToArray(changedTable, (changedRow, rowId) => {
3361
+ const rowStamp = mapEnsure(rowsStamp, rowId, stampNew);
3362
+ const cellsStamp = (rowStamp[1] ??= mapNew());
3363
+ rowStamp[0] = stamp;
3364
+ objToArray(changedRow, ([, newCell], cellId) =>
3365
+ mapSet(cellsStamp, cellId, [stamp, newCell]),
3366
+ );
3367
+ });
3368
+ });
3369
+ }
3370
+ if (valuesTouched) {
3371
+ valuesStamp[0] = stamp;
3372
+ objToArray(changedValues, ([, newValue], valueId) => {
3373
+ mapSet(valuesStamp[1], valueId, [stamp, newValue]);
3374
+ });
3375
+ }
3376
+ }
3377
+ };
3378
+ const merge = (mergeableStore2) => {
3379
+ const mergeableContent = mergeableStore.getMergeableContent();
3380
+ const mergeableContent2 = mergeableStore2.getMergeableContent();
3381
+ mergeableStore2.applyMergeableChanges(mergeableContent);
3382
+ return applyMergeableChanges(mergeableContent2);
3383
+ };
3384
+ const getMergeableContent = () =>
3385
+ mapStamp(contentStamp, ([tablesStamp, valuesStamp]) => [
3386
+ mapStampMapToObj(tablesStamp, (rowsStamp) =>
3387
+ mapStampMapToObj(rowsStamp, (cellsStamp) =>
3388
+ mapStampMapToObj(cellsStamp, pairClone),
3389
+ ),
3390
+ ),
3391
+ mapStampMapToObj(valuesStamp, pairClone),
3392
+ ]);
3393
+ const setMergeableContent = (mergeableContent) => {
3394
+ disableListening(() =>
3395
+ store.transaction(() => {
3396
+ store.delTables().delValues();
3397
+ contentStamp = newContentStamp();
3398
+ }),
3399
+ );
3400
+ applyMergeableChanges(mergeableContent);
3401
+ return mergeableStore;
3402
+ };
3403
+ const applyMergeableChanges = (newContentStamp2) => {
3404
+ const changes = [{}, {}];
3405
+ seenHlc(newContentStamp2[0]);
3406
+ mergeStamp(
3407
+ newContentStamp2,
3408
+ contentStamp,
3409
+ changes,
3410
+ (
3411
+ [newTablesStamp, newValuesStamp],
3412
+ [tablesStamp, valuesStamp],
3413
+ [tablesChanges, valuesChanges],
3414
+ ) => {
3415
+ mergeStamp(
3416
+ newTablesStamp,
3417
+ tablesStamp,
3418
+ tablesChanges,
3419
+ (newTableStamps, tableStamps, tableChanges) =>
3420
+ mergeStamps(
3421
+ newTableStamps,
3422
+ tableStamps,
3423
+ tableChanges,
3424
+ (newRowStamps, rowStamps, rowChanges) =>
3425
+ mergeStamps(
3426
+ newRowStamps,
3427
+ rowStamps,
3428
+ rowChanges,
3429
+ mergeLeafStamps,
3430
+ ),
3431
+ ),
3432
+ );
3433
+ mergeStamp(newValuesStamp, valuesStamp, valuesChanges, mergeLeafStamps);
3434
+ },
3435
+ );
3436
+ disableListening(() => store.applyChanges(changes));
3437
+ return mergeableStore;
3438
+ };
3439
+ const mergeableStore = {
3440
+ getMergeableContent,
3441
+ setMergeableContent,
3442
+ applyMergeableChanges,
3443
+ merge,
3444
+ };
3445
+ store.addPostTransactionListener(postTransactionListener);
3446
+ objToArray(
3447
+ store,
3448
+ (method, name) =>
3449
+ (mergeableStore[name] = // fluent methods
3450
+ strStartsWith(name, 'set') ||
3451
+ strStartsWith(name, 'del') ||
3452
+ strStartsWith(name, 'apply') ||
3453
+ strEndsWith(name, 'Transaction') ||
3454
+ name == 'callListener'
3455
+ ? (...args) => {
3456
+ method(...args);
3457
+ return mergeableStore;
3458
+ }
3459
+ : strStartsWith(name, 'add') && strEndsWith(name, 'Listener')
3460
+ ? (...args) => {
3461
+ const listenerArg = LISTENER_ARGS[slice(name, 3, -8)] ?? 0;
3462
+ const listener = args[listenerArg];
3463
+ args[listenerArg] = (_store, ...args2) =>
3464
+ listener(mergeableStore, ...args2);
3465
+ return method(...args);
3466
+ }
3467
+ : method),
3468
+ );
3469
+ return objFreeze(mergeableStore);
3470
+ };
3471
+
3209
3472
  export {
3210
3473
  createCheckpoints,
3211
3474
  createCustomPersister,
3212
3475
  createIndexes,
3476
+ createMergeableStore,
3213
3477
  createMetrics,
3214
3478
  createQueries,
3215
3479
  createRelationships,