tinybase 5.0.0-beta.4 → 5.0.0-beta.5

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 (332) hide show
  1. package/lib/checkpoints.js +1 -1
  2. package/lib/checkpoints.js.gz +0 -0
  3. package/lib/cjs/checkpoints.cjs +1 -1
  4. package/lib/cjs/checkpoints.cjs.gz +0 -0
  5. package/lib/cjs/indexes.cjs +1 -1
  6. package/lib/cjs/indexes.cjs.gz +0 -0
  7. package/lib/cjs/mergeable-store.cjs +1 -1
  8. package/lib/cjs/mergeable-store.cjs.gz +0 -0
  9. package/lib/cjs/metrics.cjs +1 -1
  10. package/lib/cjs/metrics.cjs.gz +0 -0
  11. package/lib/cjs/persisters/persister-automerge.cjs +1 -1
  12. package/lib/cjs/persisters/persister-automerge.cjs.gz +0 -0
  13. package/lib/cjs/persisters/persister-browser.cjs +1 -1
  14. package/lib/cjs/persisters/persister-browser.cjs.gz +0 -0
  15. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  16. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  17. package/lib/cjs/persisters/persister-electric-sql.cjs +1 -1
  18. package/lib/cjs/persisters/persister-electric-sql.cjs.gz +0 -0
  19. package/lib/cjs/persisters/persister-expo-sqlite-next.cjs +1 -1
  20. package/lib/cjs/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  21. package/lib/cjs/persisters/persister-expo-sqlite.cjs +1 -1
  22. package/lib/cjs/persisters/persister-expo-sqlite.cjs.gz +0 -0
  23. package/lib/cjs/persisters/persister-file.cjs +1 -1
  24. package/lib/cjs/persisters/persister-file.cjs.gz +0 -0
  25. package/lib/cjs/persisters/persister-indexed-db.cjs +1 -1
  26. package/lib/cjs/persisters/persister-indexed-db.cjs.gz +0 -0
  27. package/lib/cjs/persisters/persister-libsql.cjs +1 -0
  28. package/lib/cjs/persisters/persister-libsql.cjs.gz +0 -0
  29. package/lib/cjs/persisters/persister-partykit-client.cjs +1 -1
  30. package/lib/cjs/persisters/persister-partykit-client.cjs.gz +0 -0
  31. package/lib/cjs/persisters/persister-remote.cjs +1 -1
  32. package/lib/cjs/persisters/persister-remote.cjs.gz +0 -0
  33. package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -1
  34. package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  35. package/lib/cjs/persisters/persister-sqlite3.cjs +1 -1
  36. package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
  37. package/lib/cjs/persisters/persister-yjs.cjs +1 -1
  38. package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
  39. package/lib/cjs/persisters.cjs +1 -1
  40. package/lib/cjs/persisters.cjs.gz +0 -0
  41. package/lib/cjs/queries.cjs +1 -1
  42. package/lib/cjs/queries.cjs.gz +0 -0
  43. package/lib/cjs/relationships.cjs +1 -1
  44. package/lib/cjs/relationships.cjs.gz +0 -0
  45. package/lib/cjs/store.cjs +1 -1
  46. package/lib/cjs/store.cjs.gz +0 -0
  47. package/lib/cjs/tinybase.cjs +1 -1
  48. package/lib/cjs/tinybase.cjs.gz +0 -0
  49. package/lib/cjs/tools.cjs +1 -1
  50. package/lib/cjs/tools.cjs.gz +0 -0
  51. package/lib/cjs/ui-react-dom-debug.cjs +1 -1
  52. package/lib/cjs/ui-react-dom-debug.cjs.gz +0 -0
  53. package/lib/cjs-es6/checkpoints.cjs +1 -1
  54. package/lib/cjs-es6/checkpoints.cjs.gz +0 -0
  55. package/lib/cjs-es6/indexes.cjs +1 -1
  56. package/lib/cjs-es6/indexes.cjs.gz +0 -0
  57. package/lib/cjs-es6/mergeable-store.cjs +1 -1
  58. package/lib/cjs-es6/mergeable-store.cjs.gz +0 -0
  59. package/lib/cjs-es6/metrics.cjs +1 -1
  60. package/lib/cjs-es6/metrics.cjs.gz +0 -0
  61. package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -1
  62. package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
  63. package/lib/cjs-es6/persisters/persister-browser.cjs +1 -1
  64. package/lib/cjs-es6/persisters/persister-browser.cjs.gz +0 -0
  65. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  66. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  67. package/lib/cjs-es6/persisters/persister-electric-sql.cjs +1 -1
  68. package/lib/cjs-es6/persisters/persister-electric-sql.cjs.gz +0 -0
  69. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs +1 -1
  70. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  71. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -1
  72. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
  73. package/lib/cjs-es6/persisters/persister-file.cjs +1 -1
  74. package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
  75. package/lib/cjs-es6/persisters/persister-indexed-db.cjs +1 -1
  76. package/lib/cjs-es6/persisters/persister-indexed-db.cjs.gz +0 -0
  77. package/lib/cjs-es6/persisters/persister-libsql.cjs +1 -0
  78. package/lib/cjs-es6/persisters/persister-libsql.cjs.gz +0 -0
  79. package/lib/cjs-es6/persisters/persister-partykit-client.cjs +1 -1
  80. package/lib/cjs-es6/persisters/persister-partykit-client.cjs.gz +0 -0
  81. package/lib/cjs-es6/persisters/persister-remote.cjs +1 -1
  82. package/lib/cjs-es6/persisters/persister-remote.cjs.gz +0 -0
  83. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -1
  84. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  85. package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -1
  86. package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
  87. package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -1
  88. package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
  89. package/lib/cjs-es6/persisters.cjs +1 -1
  90. package/lib/cjs-es6/persisters.cjs.gz +0 -0
  91. package/lib/cjs-es6/queries.cjs +1 -1
  92. package/lib/cjs-es6/queries.cjs.gz +0 -0
  93. package/lib/cjs-es6/relationships.cjs +1 -1
  94. package/lib/cjs-es6/relationships.cjs.gz +0 -0
  95. package/lib/cjs-es6/store.cjs +1 -1
  96. package/lib/cjs-es6/store.cjs.gz +0 -0
  97. package/lib/cjs-es6/tinybase.cjs +1 -1
  98. package/lib/cjs-es6/tinybase.cjs.gz +0 -0
  99. package/lib/cjs-es6/tools.cjs +1 -1
  100. package/lib/cjs-es6/tools.cjs.gz +0 -0
  101. package/lib/cjs-es6/ui-react-dom-debug.cjs +1 -1
  102. package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
  103. package/lib/debug/checkpoints.js +3 -1
  104. package/lib/debug/indexes.js +3 -1
  105. package/lib/debug/mergeable-store.js +196 -129
  106. package/lib/debug/metrics.js +3 -1
  107. package/lib/debug/persisters/persister-automerge.js +3 -1
  108. package/lib/debug/persisters/persister-browser.js +3 -1
  109. package/lib/debug/persisters/persister-cr-sqlite-wasm.js +3 -1
  110. package/lib/debug/persisters/persister-electric-sql.js +3 -1
  111. package/lib/debug/persisters/persister-expo-sqlite-next.js +3 -1
  112. package/lib/debug/persisters/persister-expo-sqlite.js +3 -1
  113. package/lib/debug/persisters/persister-file.js +3 -1
  114. package/lib/debug/persisters/persister-indexed-db.js +3 -1
  115. package/lib/debug/persisters/persister-libsql.js +898 -0
  116. package/lib/debug/persisters/persister-partykit-client.js +3 -1
  117. package/lib/debug/persisters/persister-remote.js +3 -1
  118. package/lib/debug/persisters/persister-sqlite-wasm.js +3 -1
  119. package/lib/debug/persisters/persister-sqlite3.js +3 -1
  120. package/lib/debug/persisters/persister-yjs.js +3 -1
  121. package/lib/debug/persisters.js +3 -1
  122. package/lib/debug/queries.js +7 -4
  123. package/lib/debug/relationships.js +3 -1
  124. package/lib/debug/store.js +7 -4
  125. package/lib/debug/tinybase.js +197 -130
  126. package/lib/debug/tools.js +7 -4
  127. package/lib/debug/ui-react-dom.js +7 -4
  128. package/lib/es6/checkpoints.js +1 -1
  129. package/lib/es6/checkpoints.js.gz +0 -0
  130. package/lib/es6/indexes.js +1 -1
  131. package/lib/es6/indexes.js.gz +0 -0
  132. package/lib/es6/mergeable-store.js +1 -1
  133. package/lib/es6/mergeable-store.js.gz +0 -0
  134. package/lib/es6/metrics.js +1 -1
  135. package/lib/es6/metrics.js.gz +0 -0
  136. package/lib/es6/persisters/persister-automerge.js +1 -1
  137. package/lib/es6/persisters/persister-automerge.js.gz +0 -0
  138. package/lib/es6/persisters/persister-browser.js +1 -1
  139. package/lib/es6/persisters/persister-browser.js.gz +0 -0
  140. package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  141. package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  142. package/lib/es6/persisters/persister-electric-sql.js +1 -1
  143. package/lib/es6/persisters/persister-electric-sql.js.gz +0 -0
  144. package/lib/es6/persisters/persister-expo-sqlite-next.js +1 -1
  145. package/lib/es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  146. package/lib/es6/persisters/persister-expo-sqlite.js +1 -1
  147. package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
  148. package/lib/es6/persisters/persister-file.js +1 -1
  149. package/lib/es6/persisters/persister-file.js.gz +0 -0
  150. package/lib/es6/persisters/persister-indexed-db.js +1 -1
  151. package/lib/es6/persisters/persister-indexed-db.js.gz +0 -0
  152. package/lib/es6/persisters/persister-libsql.js +1 -0
  153. package/lib/es6/persisters/persister-libsql.js.gz +0 -0
  154. package/lib/es6/persisters/persister-partykit-client.js +1 -1
  155. package/lib/es6/persisters/persister-partykit-client.js.gz +0 -0
  156. package/lib/es6/persisters/persister-remote.js +1 -1
  157. package/lib/es6/persisters/persister-remote.js.gz +0 -0
  158. package/lib/es6/persisters/persister-sqlite-wasm.js +1 -1
  159. package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  160. package/lib/es6/persisters/persister-sqlite3.js +1 -1
  161. package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
  162. package/lib/es6/persisters/persister-yjs.js +1 -1
  163. package/lib/es6/persisters/persister-yjs.js.gz +0 -0
  164. package/lib/es6/persisters.js +1 -1
  165. package/lib/es6/persisters.js.gz +0 -0
  166. package/lib/es6/queries.js +1 -1
  167. package/lib/es6/queries.js.gz +0 -0
  168. package/lib/es6/relationships.js +1 -1
  169. package/lib/es6/relationships.js.gz +0 -0
  170. package/lib/es6/store.js +1 -1
  171. package/lib/es6/store.js.gz +0 -0
  172. package/lib/es6/tinybase.js +1 -1
  173. package/lib/es6/tinybase.js.gz +0 -0
  174. package/lib/es6/tools.js +1 -1
  175. package/lib/es6/tools.js.gz +0 -0
  176. package/lib/es6/ui-react-dom-debug.js +1 -1
  177. package/lib/es6/ui-react-dom-debug.js.gz +0 -0
  178. package/lib/indexes.js +1 -1
  179. package/lib/indexes.js.gz +0 -0
  180. package/lib/mergeable-store.js +1 -1
  181. package/lib/mergeable-store.js.gz +0 -0
  182. package/lib/metrics.js +1 -1
  183. package/lib/metrics.js.gz +0 -0
  184. package/lib/persisters/persister-automerge.js +1 -1
  185. package/lib/persisters/persister-automerge.js.gz +0 -0
  186. package/lib/persisters/persister-browser.js +1 -1
  187. package/lib/persisters/persister-browser.js.gz +0 -0
  188. package/lib/persisters/persister-cr-sqlite-wasm.js +1 -1
  189. package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  190. package/lib/persisters/persister-electric-sql.js +1 -1
  191. package/lib/persisters/persister-electric-sql.js.gz +0 -0
  192. package/lib/persisters/persister-expo-sqlite-next.js +1 -1
  193. package/lib/persisters/persister-expo-sqlite-next.js.gz +0 -0
  194. package/lib/persisters/persister-expo-sqlite.js +1 -1
  195. package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
  196. package/lib/persisters/persister-file.js +1 -1
  197. package/lib/persisters/persister-file.js.gz +0 -0
  198. package/lib/persisters/persister-indexed-db.js +1 -1
  199. package/lib/persisters/persister-indexed-db.js.gz +0 -0
  200. package/lib/persisters/persister-libsql.js +1 -0
  201. package/lib/persisters/persister-libsql.js.gz +0 -0
  202. package/lib/persisters/persister-partykit-client.js +1 -1
  203. package/lib/persisters/persister-partykit-client.js.gz +0 -0
  204. package/lib/persisters/persister-remote.js +1 -1
  205. package/lib/persisters/persister-remote.js.gz +0 -0
  206. package/lib/persisters/persister-sqlite-wasm.js +1 -1
  207. package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
  208. package/lib/persisters/persister-sqlite3.js +1 -1
  209. package/lib/persisters/persister-sqlite3.js.gz +0 -0
  210. package/lib/persisters/persister-yjs.js +1 -1
  211. package/lib/persisters/persister-yjs.js.gz +0 -0
  212. package/lib/persisters.js +1 -1
  213. package/lib/persisters.js.gz +0 -0
  214. package/lib/queries.js +1 -1
  215. package/lib/queries.js.gz +0 -0
  216. package/lib/relationships.js +1 -1
  217. package/lib/relationships.js.gz +0 -0
  218. package/lib/store.js +1 -1
  219. package/lib/store.js.gz +0 -0
  220. package/lib/tinybase.js +1 -1
  221. package/lib/tinybase.js.gz +0 -0
  222. package/lib/tools.js +1 -1
  223. package/lib/tools.js.gz +0 -0
  224. package/lib/types/mergeable-store.d.ts +72 -11
  225. package/lib/types/persisters/persister-libsql.d.ts +139 -0
  226. package/lib/types/persisters.d.ts +1 -0
  227. package/lib/types/with-schemas/mergeable-store.d.ts +308 -31
  228. package/lib/types/with-schemas/persisters/persister-libsql.d.ts +152 -0
  229. package/lib/types/with-schemas/persisters.d.ts +1 -0
  230. package/lib/types/with-schemas/store.d.ts +37 -87
  231. package/lib/umd/checkpoints.js +1 -1
  232. package/lib/umd/checkpoints.js.gz +0 -0
  233. package/lib/umd/indexes.js +1 -1
  234. package/lib/umd/indexes.js.gz +0 -0
  235. package/lib/umd/mergeable-store.js +1 -1
  236. package/lib/umd/mergeable-store.js.gz +0 -0
  237. package/lib/umd/metrics.js +1 -1
  238. package/lib/umd/metrics.js.gz +0 -0
  239. package/lib/umd/persisters/persister-automerge.js +1 -1
  240. package/lib/umd/persisters/persister-automerge.js.gz +0 -0
  241. package/lib/umd/persisters/persister-browser.js +1 -1
  242. package/lib/umd/persisters/persister-browser.js.gz +0 -0
  243. package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
  244. package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  245. package/lib/umd/persisters/persister-electric-sql.js +1 -1
  246. package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
  247. package/lib/umd/persisters/persister-expo-sqlite-next.js +1 -1
  248. package/lib/umd/persisters/persister-expo-sqlite-next.js.gz +0 -0
  249. package/lib/umd/persisters/persister-expo-sqlite.js +1 -1
  250. package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
  251. package/lib/umd/persisters/persister-file.js +1 -1
  252. package/lib/umd/persisters/persister-file.js.gz +0 -0
  253. package/lib/umd/persisters/persister-indexed-db.js +1 -1
  254. package/lib/umd/persisters/persister-indexed-db.js.gz +0 -0
  255. package/lib/umd/persisters/persister-libsql.js +1 -0
  256. package/lib/umd/persisters/persister-libsql.js.gz +0 -0
  257. package/lib/umd/persisters/persister-partykit-client.js +1 -1
  258. package/lib/umd/persisters/persister-partykit-client.js.gz +0 -0
  259. package/lib/umd/persisters/persister-remote.js +1 -1
  260. package/lib/umd/persisters/persister-remote.js.gz +0 -0
  261. package/lib/umd/persisters/persister-sqlite-wasm.js +1 -1
  262. package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
  263. package/lib/umd/persisters/persister-sqlite3.js +1 -1
  264. package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
  265. package/lib/umd/persisters/persister-yjs.js +1 -1
  266. package/lib/umd/persisters/persister-yjs.js.gz +0 -0
  267. package/lib/umd/persisters.js +1 -1
  268. package/lib/umd/persisters.js.gz +0 -0
  269. package/lib/umd/queries.js +1 -1
  270. package/lib/umd/queries.js.gz +0 -0
  271. package/lib/umd/relationships.js +1 -1
  272. package/lib/umd/relationships.js.gz +0 -0
  273. package/lib/umd/store.js +1 -1
  274. package/lib/umd/store.js.gz +0 -0
  275. package/lib/umd/tinybase.js +1 -1
  276. package/lib/umd/tinybase.js.gz +0 -0
  277. package/lib/umd/tools.js +1 -1
  278. package/lib/umd/tools.js.gz +0 -0
  279. package/lib/umd/ui-react-dom-debug.js +1 -1
  280. package/lib/umd/ui-react-dom-debug.js.gz +0 -0
  281. package/lib/umd-es6/checkpoints.js +1 -1
  282. package/lib/umd-es6/checkpoints.js.gz +0 -0
  283. package/lib/umd-es6/indexes.js +1 -1
  284. package/lib/umd-es6/indexes.js.gz +0 -0
  285. package/lib/umd-es6/mergeable-store.js +1 -1
  286. package/lib/umd-es6/mergeable-store.js.gz +0 -0
  287. package/lib/umd-es6/metrics.js +1 -1
  288. package/lib/umd-es6/metrics.js.gz +0 -0
  289. package/lib/umd-es6/persisters/persister-automerge.js +1 -1
  290. package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
  291. package/lib/umd-es6/persisters/persister-browser.js +1 -1
  292. package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
  293. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  294. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  295. package/lib/umd-es6/persisters/persister-electric-sql.js +1 -1
  296. package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
  297. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js +1 -1
  298. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  299. package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -1
  300. package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
  301. package/lib/umd-es6/persisters/persister-file.js +1 -1
  302. package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
  303. package/lib/umd-es6/persisters/persister-indexed-db.js +1 -1
  304. package/lib/umd-es6/persisters/persister-indexed-db.js.gz +0 -0
  305. package/lib/umd-es6/persisters/persister-libsql.js +1 -0
  306. package/lib/umd-es6/persisters/persister-libsql.js.gz +0 -0
  307. package/lib/umd-es6/persisters/persister-partykit-client.js +1 -1
  308. package/lib/umd-es6/persisters/persister-partykit-client.js.gz +0 -0
  309. package/lib/umd-es6/persisters/persister-remote.js +1 -1
  310. package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
  311. package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -1
  312. package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  313. package/lib/umd-es6/persisters/persister-sqlite3.js +1 -1
  314. package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
  315. package/lib/umd-es6/persisters/persister-yjs.js +1 -1
  316. package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
  317. package/lib/umd-es6/persisters.js +1 -1
  318. package/lib/umd-es6/persisters.js.gz +0 -0
  319. package/lib/umd-es6/queries.js +1 -1
  320. package/lib/umd-es6/queries.js.gz +0 -0
  321. package/lib/umd-es6/relationships.js +1 -1
  322. package/lib/umd-es6/relationships.js.gz +0 -0
  323. package/lib/umd-es6/store.js +1 -1
  324. package/lib/umd-es6/store.js.gz +0 -0
  325. package/lib/umd-es6/tinybase.js +1 -1
  326. package/lib/umd-es6/tinybase.js.gz +0 -0
  327. package/lib/umd-es6/tools.js +1 -1
  328. package/lib/umd-es6/tools.js.gz +0 -0
  329. package/lib/umd-es6/ui-react-dom-debug.js +1 -1
  330. package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
  331. package/package.json +34 -29
  332. package/readme.md +2 -2
@@ -59,9 +59,11 @@ const mapNew = (entries) => new Map(entries);
59
59
  const mapGet = (map, key) => map?.get(key);
60
60
  const mapSet = (map, key, value) =>
61
61
  isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
62
- const mapEnsure = (map, key, getDefaultValue) => {
62
+ const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
63
63
  if (!collHas(map, key)) {
64
64
  mapSet(map, key, getDefaultValue());
65
+ } else {
66
+ hadExistingValue?.(mapGet(map, key));
65
67
  }
66
68
  return mapGet(map, key);
67
69
  };
@@ -47,9 +47,11 @@ const mapNew = (entries) => new Map(entries);
47
47
  const mapGet = (map, key) => map?.get(key);
48
48
  const mapSet = (map, key, value) =>
49
49
  isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
50
- const mapEnsure = (map, key, getDefaultValue) => {
50
+ const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
51
51
  if (!collHas(map, key)) {
52
52
  mapSet(map, key, getDefaultValue());
53
+ } else {
54
+ hadExistingValue?.(mapGet(map, key));
53
55
  }
54
56
  return mapGet(map, key);
55
57
  };
@@ -75,9 +75,11 @@ const mapMap = (coll, cb) =>
75
75
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
76
76
  const mapSet = (map, key, value) =>
77
77
  isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
78
- const mapEnsure = (map, key, getDefaultValue) => {
78
+ const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
79
79
  if (!collHas(map, key)) {
80
80
  mapSet(map, key, getDefaultValue());
81
+ } else {
82
+ hadExistingValue?.(mapGet(map, key));
81
83
  }
82
84
  return mapGet(map, key);
83
85
  };
@@ -76,9 +76,11 @@ const mapMap = (coll, cb) =>
76
76
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
77
77
  const mapSet = (map, key, value) =>
78
78
  isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
79
- const mapEnsure = (map, key, getDefaultValue) => {
79
+ const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
80
80
  if (!collHas(map, key)) {
81
81
  mapSet(map, key, getDefaultValue());
82
+ } else {
83
+ hadExistingValue?.(mapGet(map, key));
82
84
  }
83
85
  return mapGet(map, key);
84
86
  };
@@ -57,9 +57,11 @@ const mapForEach = (map, cb) =>
57
57
  collForEach(map, (value, key) => cb(key, value));
58
58
  const mapSet = (map, key, value) =>
59
59
  isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
60
- const mapEnsure = (map, key, getDefaultValue) => {
60
+ const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
61
61
  if (!collHas(map, key)) {
62
62
  mapSet(map, key, getDefaultValue());
63
+ } else {
64
+ hadExistingValue?.(mapGet(map, key));
63
65
  }
64
66
  return mapGet(map, key);
65
67
  };
@@ -35,9 +35,11 @@ const mapNew = (entries) => new Map(entries);
35
35
  const mapGet = (map, key) => map?.get(key);
36
36
  const mapSet = (map, key, value) =>
37
37
  isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
38
- const mapEnsure = (map, key, getDefaultValue) => {
38
+ const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
39
39
  if (!collHas(map, key)) {
40
40
  mapSet(map, key, getDefaultValue());
41
+ } else {
42
+ hadExistingValue?.(mapGet(map, key));
41
43
  }
42
44
  return mapGet(map, key);
43
45
  };
@@ -66,9 +66,11 @@ const mapForEach = (map, cb) =>
66
66
  collForEach(map, (value, key) => cb(key, value));
67
67
  const mapSet = (map, key, value) =>
68
68
  isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
69
- const mapEnsure = (map, key, getDefaultValue) => {
69
+ const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
70
70
  if (!collHas(map, key)) {
71
71
  mapSet(map, key, getDefaultValue());
72
+ } else {
73
+ hadExistingValue?.(mapGet(map, key));
72
74
  }
73
75
  return mapGet(map, key);
74
76
  };
@@ -171,9 +173,10 @@ const getAggregateValue = (
171
173
  : aggregateValue;
172
174
  };
173
175
 
174
- const getCellOrValueType = (cell) => {
175
- const type = getTypeOf(cell);
176
- return isTypeStringOrBoolean(type) || (type == NUMBER && isFiniteNumber(cell))
176
+ const getCellOrValueType = (cellOrValue) => {
177
+ const type = getTypeOf(cellOrValue);
178
+ return isTypeStringOrBoolean(type) ||
179
+ (type == NUMBER && isFiniteNumber(cellOrValue))
177
180
  ? type
178
181
  : void 0;
179
182
  };
@@ -42,9 +42,11 @@ const mapForEach = (map, cb) =>
42
42
  collForEach(map, (value, key) => cb(key, value));
43
43
  const mapSet = (map, key, value) =>
44
44
  isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
45
- const mapEnsure = (map, key, getDefaultValue) => {
45
+ const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
46
46
  if (!collHas(map, key)) {
47
47
  mapSet(map, key, getDefaultValue());
48
+ } else {
49
+ hadExistingValue?.(mapGet(map, key));
48
50
  }
49
51
  return mapGet(map, key);
50
52
  };
@@ -95,9 +95,11 @@ const mapMap = (coll, cb) =>
95
95
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
96
96
  const mapSet = (map, key, value) =>
97
97
  isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
98
- const mapEnsure = (map, key, getDefaultValue) => {
98
+ const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
99
99
  if (!collHas(map, key)) {
100
100
  mapSet(map, key, getDefaultValue());
101
+ } else {
102
+ hadExistingValue?.(mapGet(map, key));
101
103
  }
102
104
  return mapGet(map, key);
103
105
  };
@@ -253,9 +255,10 @@ const pairNewMap = () => [mapNew(), mapNew()];
253
255
  const pairClone = (array) => [...array];
254
256
  const pairIsEqual = ([entry1, entry2]) => entry1 === entry2;
255
257
 
256
- const getCellOrValueType = (cell) => {
257
- const type = getTypeOf(cell);
258
- return isTypeStringOrBoolean(type) || (type == NUMBER && isFiniteNumber(cell))
258
+ const getCellOrValueType = (cellOrValue) => {
259
+ const type = getTypeOf(cellOrValue);
260
+ return isTypeStringOrBoolean(type) ||
261
+ (type == NUMBER && isFiniteNumber(cellOrValue))
259
262
  ? type
260
263
  : void 0;
261
264
  };
@@ -31,8 +31,7 @@ const VALUE_IDS = VALUE + IDS;
31
31
  const id = (key) => EMPTY_STRING + key;
32
32
  const strStartsWith = (str, prefix) => str.startsWith(prefix);
33
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);
34
+ const strCharCodeAt = (str, position) => str.charCodeAt(position);
36
35
 
37
36
  const mathMax = Math.max;
38
37
  const mathMin = Math.min;
@@ -100,6 +99,12 @@ const objToArray = (obj, cb) =>
100
99
  arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
101
100
  const objSize = (obj) => size(objIds(obj));
102
101
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
102
+ const objEnsure = (obj, id, getDefaultValue) => {
103
+ if (!objHas(obj, id)) {
104
+ obj[id] = getDefaultValue();
105
+ }
106
+ return obj[id];
107
+ };
103
108
 
104
109
  const collSizeN = (collSizer) => (coll) =>
105
110
  arrayReduce(collValues(coll), (total, coll2) => total + collSizer(coll2), 0);
@@ -123,9 +128,11 @@ const mapMap = (coll, cb) =>
123
128
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
124
129
  const mapSet = (map, key, value) =>
125
130
  isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
126
- const mapEnsure = (map, key, getDefaultValue) => {
131
+ const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
127
132
  if (!collHas(map, key)) {
128
133
  mapSet(map, key, getDefaultValue());
134
+ } else {
135
+ hadExistingValue?.(mapGet(map, key));
129
136
  }
130
137
  return mapGet(map, key);
131
138
  };
@@ -183,9 +190,10 @@ const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
183
190
  },
184
191
  );
185
192
 
186
- const getCellOrValueType = (cell) => {
187
- const type = getTypeOf(cell);
188
- return isTypeStringOrBoolean(type) || (type == NUMBER && isFiniteNumber(cell))
193
+ const getCellOrValueType = (cellOrValue) => {
194
+ const type = getTypeOf(cellOrValue);
195
+ return isTypeStringOrBoolean(type) ||
196
+ (type == NUMBER && isFiniteNumber(cellOrValue))
189
197
  ? type
190
198
  : void 0;
191
199
  };
@@ -1901,36 +1909,36 @@ const createRelationships = getCreateFunction((store) => {
1901
1909
  return objFreeze(relationships);
1902
1910
  });
1903
1911
 
1904
- const stampNew = (time = EMPTY_STRING, thing) => [time, thing];
1905
- const stampNewMap = (time = EMPTY_STRING) => stampNew(time, mapNew());
1906
- const stampNewObj = (time) => stampNew(time, objNew());
1907
- const mapStamp = ([time, value], mapper) => [time, mapper(value, time)];
1908
- const cloneStamp = ([time, value]) => [time, value];
1909
- const mapStampMapToObj = (stampedMap, mapper) =>
1910
- mapStamp(stampedMap, (map) => mapToObj(map, mapper));
1911
- const mergeStamps = (newThingStamps, thingStamps, changes, merge) =>
1912
- objForEach(newThingStamps, (newThingStamp, thingId) =>
1913
- mergeStamp(
1914
- newThingStamp,
1915
- mapEnsure(thingStamps, thingId, stampNewMap),
1916
- (changes[thingId] = objNew()),
1917
- merge,
1918
- ),
1919
- );
1920
- const mergeStamp = ([newTime, newThing], thingStamp, changes, merge) => {
1921
- if (newTime > thingStamp[0]) {
1922
- thingStamp[0] = newTime;
1912
+ const textEncoder = new globalThis.TextEncoder();
1913
+ const getHash = (value) => {
1914
+ let hash = 2166136261;
1915
+ arrayForEach(textEncoder.encode(value), (char) => {
1916
+ hash ^= char;
1917
+ hash +=
1918
+ (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);
1919
+ });
1920
+ return hash >>> 0;
1921
+ };
1922
+
1923
+ const cloneHashStamp = ([time, value, hash]) => [time, value, hash];
1924
+ const stampNew = (time, thing) => [time, thing];
1925
+ const hashIdAndHash = (id, hash) => getHash(id + ':' + hash);
1926
+ const updateHashStamp = (hashStamp, hash, time) => {
1927
+ hashStamp[2] = hash >>> 0;
1928
+ if (time > hashStamp[0]) {
1929
+ hashStamp[0] = time;
1923
1930
  }
1924
- merge(newThing, thingStamp[1], changes);
1925
1931
  };
1926
- const mergeLeafStamps = (newLeafStamps, leafStamps, changes) =>
1927
- objForEach(newLeafStamps, ([newTime, newLeaf], leafId) => {
1928
- const leafStamp = mapEnsure(leafStamps, leafId, stampNew);
1929
- if (newTime > leafStamp[0]) {
1930
- leafStamp[0] = newTime;
1931
- leafStamp[1] = changes[leafId] = newLeaf;
1932
- }
1933
- });
1932
+ const stampNewObj = (time) => stampNew(time, objNew());
1933
+ const hashStampNewMap = (time = EMPTY_STRING) => [time, mapNew(), 0];
1934
+ const hashStampNewThing = () => [EMPTY_STRING, void 0, 0];
1935
+ const hashStampMap = ([time, value, hash], mapper) => [
1936
+ time,
1937
+ mapper(value, time),
1938
+ hash,
1939
+ ];
1940
+ const hashStampMapToObj = (hashStamp, mapper = cloneHashStamp) =>
1941
+ hashStampMap(hashStamp, (map) => mapToObj(map, mapper));
1934
1942
 
1935
1943
  const pairNew = (value) => [value, value];
1936
1944
  const pairCollSize2 = (pair, func = collSize2) => func(pair[0]) + func(pair[1]);
@@ -3267,12 +3275,6 @@ const SHIFT12 = 2 ** 12;
3267
3275
  const SHIFT6 = 2 ** 6;
3268
3276
  const toB64 = (num) => String.fromCharCode(48 + (num & MASK6));
3269
3277
  const fromB64 = (str, pos) => strCharCodeAt(str, pos) - 48;
3270
- const hash = (value) =>
3271
- arrayReduce(
3272
- strSplit(value),
3273
- (hash2, char) => ((hash2 << 5) + hash2) ^ strCharCodeAt(char),
3274
- 5381,
3275
- ) >>> 0;
3276
3278
  const encodeHlc = (logicalTime42, counter24, clientHash30) =>
3277
3279
  toB64(logicalTime42 / SHIFT36) +
3278
3280
  toB64(logicalTime42 / SHIFT30) +
@@ -3311,7 +3313,7 @@ const decodeHlc = (hlc16) => [
3311
3313
  const getHlcFunctions = (uniqueId) => {
3312
3314
  let logicalTime = 0;
3313
3315
  let lastCounter = -1;
3314
- const uniqueIdHash = hash(uniqueId);
3316
+ const uniqueIdHash = getHash(uniqueId);
3315
3317
  const getHlc = () => {
3316
3318
  seenHlc();
3317
3319
  return encodeHlc(logicalTime, ++lastCounter, uniqueIdHash);
@@ -3352,15 +3354,16 @@ const LISTENER_ARGS = {
3352
3354
  InvalidCell: 3,
3353
3355
  InvalidValue: 1,
3354
3356
  };
3355
- const newContentStamp = (time = EMPTY_STRING) => [
3357
+ const newContentHsm = (time = EMPTY_STRING) => [
3356
3358
  time,
3357
- [stampNewMap(time), stampNewMap(time)],
3359
+ [hashStampNewMap(time), hashStampNewMap(time)],
3360
+ 0,
3358
3361
  ];
3359
3362
  const createMergeableStore = (id) => {
3360
3363
  let listening = 1;
3361
- let contentStamp = newContentStamp();
3364
+ let contentHsm = newContentHsm();
3362
3365
  let transactionTime;
3363
- let finishTransactionMergeableChanges;
3366
+ let transactionMergeableChanges;
3364
3367
  const [getHlc, seenHlc] = getHlcFunctions(id);
3365
3368
  const store = createStore();
3366
3369
  const disableListening = (actions) => {
@@ -3369,68 +3372,134 @@ const createMergeableStore = (id) => {
3369
3372
  actions();
3370
3373
  listening = wasListening;
3371
3374
  };
3372
- const preFinishTransaction = () => {
3373
- if (listening) {
3374
- finishTransactionMergeableChanges = getTransactionMergeableChanges();
3375
- const [time, [changedTablesStamp, changedValuesStamp]] =
3376
- finishTransactionMergeableChanges;
3377
- const cellsTouched = !objIsEmpty(changedTablesStamp[1]);
3378
- const valuesTouched = !objIsEmpty(changedValuesStamp[1]);
3379
- const [, [tablesStamp, valuesStamp]] = contentStamp;
3380
- if (cellsTouched || valuesTouched) {
3381
- contentStamp[0] = time;
3382
- }
3383
- if (cellsTouched) {
3384
- tablesStamp[0] = time;
3385
- objToArray(changedTablesStamp[1], ([, changedRowStamps], tableId) => {
3386
- const tableStamp = mapEnsure(tablesStamp[1], tableId, stampNewMap);
3387
- tableStamp[0] = time;
3388
- objToArray(changedRowStamps, ([, changedCellStamps], rowId) => {
3389
- const rowStamp = mapEnsure(tableStamp[1], rowId, stampNewMap);
3390
- rowStamp[0] = time;
3391
- objToArray(changedCellStamps, ([, newCell], cellId) =>
3392
- mapSet(rowStamp[1], cellId, stampNew(time, newCell)),
3375
+ const mergeContentOrChanges = (contentOrChanges, hasHashes = 0) => {
3376
+ const tablesChanges = {};
3377
+ const valuesChanges = {};
3378
+ const [
3379
+ contentOrChangesTime,
3380
+ [[tablesTime, tablesObj, incomingTablesHash], values],
3381
+ incomingContentOrChangesHash,
3382
+ ] = contentOrChanges;
3383
+ const [, [tablesHsm, valuesHsm]] = contentHsm;
3384
+ const [oldTablesTime, tableHsms, oldTablesHash] = tablesHsm;
3385
+ if (tablesTime) {
3386
+ let tablesHash = hasHashes
3387
+ ? incomingTablesHash
3388
+ : oldTablesHash ^
3389
+ (tablesTime > oldTablesTime
3390
+ ? (oldTablesTime ? getHash(oldTablesTime) : 0) ^ getHash(tablesTime)
3391
+ : 0);
3392
+ objForEach(
3393
+ tablesObj,
3394
+ ([tableTime, rowsObj, incomingTableHash], tableId) => {
3395
+ const tableHsm = mapEnsure(tableHsms, tableId, hashStampNewMap);
3396
+ const [oldTableTime, rowHsms, oldTableHash] = tableHsm;
3397
+ let tableHash = hasHashes
3398
+ ? incomingTableHash
3399
+ : oldTableHash ^
3400
+ (tableTime > oldTableTime
3401
+ ? (oldTableTime ? getHash(oldTableTime) : 0) ^
3402
+ getHash(tableTime)
3403
+ : 0);
3404
+ objForEach(rowsObj, (row, rowId) => {
3405
+ const [oldRowHash, rowHash] = mergeCellsOrValues(
3406
+ row,
3407
+ mapEnsure(rowHsms, rowId, hashStampNewMap),
3408
+ objEnsure(
3409
+ objEnsure(tablesChanges, tableId, objNew),
3410
+ rowId,
3411
+ objNew,
3412
+ ),
3413
+ hasHashes,
3393
3414
  );
3415
+ tableHash ^= hasHashes
3416
+ ? 0
3417
+ : (oldRowHash ? hashIdAndHash(rowId, oldRowHash) : 0) ^
3418
+ hashIdAndHash(rowId, rowHash);
3394
3419
  });
3395
- });
3396
- }
3397
- if (valuesTouched) {
3398
- valuesStamp[0] = time;
3399
- objToArray(changedValuesStamp[1], ([, newValue], valueId) =>
3400
- mapSet(valuesStamp[1], valueId, stampNew(time, newValue)),
3401
- );
3402
- }
3420
+ updateHashStamp(tableHsm, tableHash, tableTime);
3421
+ tablesHash ^= hasHashes
3422
+ ? 0
3423
+ : (oldTableHash ? hashIdAndHash(tableId, oldTableHash) : 0) ^
3424
+ hashIdAndHash(tableId, tableHsm[2]);
3425
+ },
3426
+ );
3427
+ updateHashStamp(tablesHsm, tablesHash, tablesTime);
3428
+ }
3429
+ mergeCellsOrValues(values, valuesHsm, valuesChanges, hasHashes);
3430
+ updateHashStamp(
3431
+ contentHsm,
3432
+ hasHashes ? incomingContentOrChangesHash : tablesHsm[2] ^ valuesHsm[2],
3433
+ contentOrChangesTime,
3434
+ );
3435
+ return [tablesChanges, valuesChanges];
3436
+ };
3437
+ const mergeCellsOrValues = (things, thingsHsm, thingsChanges, hasHashes) => {
3438
+ const [thingsTime, thingsObj, incomingThingsHash] = things;
3439
+ const [oldThingsTime, thingHsms, oldThingsHash] = thingsHsm;
3440
+ if (thingsTime) {
3441
+ let thingsHash = hasHashes
3442
+ ? incomingThingsHash
3443
+ : oldThingsHash ^
3444
+ (thingsTime > oldThingsTime
3445
+ ? (oldThingsTime ? getHash(oldThingsTime) : 0) ^ getHash(thingsTime)
3446
+ : 0);
3447
+ objForEach(
3448
+ thingsObj,
3449
+ ([thingTime, thing, incomingThingHash], thingId) => {
3450
+ const thingHsm = mapEnsure(thingHsms, thingId, hashStampNewThing);
3451
+ const [oldThingTime, , oldThingHash] = thingHsm;
3452
+ if (thingTime > oldThingTime) {
3453
+ updateHashStamp(
3454
+ thingHsm,
3455
+ hasHashes
3456
+ ? incomingThingHash
3457
+ : getHash(jsonString(thing ?? null) + ':' + thingTime),
3458
+ thingTime,
3459
+ );
3460
+ thingHsm[1] = thing;
3461
+ thingsChanges[thingId] = thing;
3462
+ thingsHash ^= hasHashes
3463
+ ? 0
3464
+ : hashIdAndHash(thingId, oldThingHash) ^
3465
+ hashIdAndHash(thingId, thingHsm[2]);
3466
+ }
3467
+ },
3468
+ );
3469
+ updateHashStamp(thingsHsm, thingsHash, thingsTime);
3403
3470
  }
3471
+ return [oldThingsHash, thingsHsm[2]];
3404
3472
  };
3405
- const postFinishTransaction = () =>
3406
- (transactionTime = finishTransactionMergeableChanges = void 0);
3407
- const merge = (mergeableStore2) => {
3408
- const mergeableContent = mergeableStore.getMergeableContent();
3409
- const mergeableContent2 = mergeableStore2.getMergeableContent();
3410
- mergeableStore2.applyMergeableChanges(mergeableContent);
3411
- return applyMergeableChanges(mergeableContent2);
3473
+ const preFinishTransaction = () => {
3474
+ if (listening) {
3475
+ transactionMergeableChanges = getTransactionMergeableChanges();
3476
+ mergeContentOrChanges(transactionMergeableChanges);
3477
+ }
3412
3478
  };
3479
+ const postFinishTransaction = () =>
3480
+ (transactionTime = transactionMergeableChanges = void 0);
3413
3481
  const getMergeableContent = () =>
3414
- mapStamp(contentStamp, ([tablesStamp, valuesStamp]) => [
3415
- mapStampMapToObj(tablesStamp, (rowsStamp) =>
3416
- mapStampMapToObj(rowsStamp, (cellsStamp) =>
3417
- mapStampMapToObj(cellsStamp, cloneStamp),
3418
- ),
3482
+ hashStampMap(contentHsm, ([tables, values]) => [
3483
+ hashStampMapToObj(tables, (table) =>
3484
+ hashStampMapToObj(table, (row) => hashStampMapToObj(row)),
3419
3485
  ),
3420
- mapStampMapToObj(valuesStamp, cloneStamp),
3486
+ hashStampMapToObj(values),
3421
3487
  ]);
3422
3488
  const setMergeableContent = (mergeableContent) => {
3423
3489
  disableListening(() =>
3424
3490
  store.transaction(() => {
3425
3491
  store.delTables().delValues();
3426
- contentStamp = newContentStamp();
3492
+ contentHsm = newContentHsm();
3427
3493
  }),
3428
3494
  );
3429
- applyMergeableChanges(mergeableContent);
3495
+ seenHlc(mergeableContent[0]);
3496
+ disableListening(() =>
3497
+ store.applyChanges(mergeContentOrChanges(mergeableContent, 1)),
3498
+ );
3430
3499
  return mergeableStore;
3431
3500
  };
3432
3501
  const getTransactionMergeableChanges = () => {
3433
- if (isUndefined(finishTransactionMergeableChanges)) {
3502
+ if (isUndefined(transactionMergeableChanges)) {
3434
3503
  const [, , changedCells, , changedValues] = store.getTransactionLog();
3435
3504
  const time =
3436
3505
  !objIsEmpty(changedCells) || !objIsEmpty(changedValues)
@@ -3440,69 +3509,67 @@ const createMergeableStore = (id) => {
3440
3509
  stampNewObj(objIsEmpty(changedCells) ? EMPTY_STRING : time),
3441
3510
  stampNewObj(objIsEmpty(changedValues) ? EMPTY_STRING : time),
3442
3511
  ]);
3443
- const [[, tableStamps], [, valuesStamp]] = mergeableChanges[1];
3512
+ const [[, tablesObj], [, valuesObj]] = mergeableChanges[1];
3444
3513
  objToArray(changedCells, (changedTable, tableId) => {
3445
- const [, rowStamps] = (tableStamps[tableId] = stampNewObj(time));
3514
+ const [, rowsObj] = (tablesObj[tableId] = stampNewObj(time));
3446
3515
  objToArray(changedTable, (changedRow, rowId) => {
3447
- const [, cellStamps] = (rowStamps[rowId] = stampNewObj(time));
3516
+ const [, cellsObj] = (rowsObj[rowId] = stampNewObj(time));
3448
3517
  objToArray(
3449
3518
  changedRow,
3450
3519
  ([, newCell], cellId) =>
3451
- (cellStamps[cellId] = stampNew(time, newCell)),
3520
+ (cellsObj[cellId] = stampNew(time, newCell)),
3452
3521
  );
3453
3522
  });
3454
3523
  });
3455
3524
  objToArray(
3456
3525
  changedValues,
3457
3526
  ([, newValue], valueId) =>
3458
- (valuesStamp[valueId] = stampNew(time, newValue)),
3527
+ (valuesObj[valueId] = stampNew(time, newValue)),
3459
3528
  );
3460
3529
  return mergeableChanges;
3461
3530
  }
3462
- return finishTransactionMergeableChanges;
3463
- };
3464
- const applyMergeableChanges = (newContentStamp2) => {
3465
- const changes = [{}, {}];
3466
- seenHlc(newContentStamp2[0]);
3467
- mergeStamp(
3468
- newContentStamp2,
3469
- contentStamp,
3470
- changes,
3471
- (
3472
- [newTablesStamp, newValuesStamp],
3473
- [tablesStamp, valuesStamp],
3474
- [tablesChanges, valuesChanges],
3475
- ) => {
3476
- mergeStamp(
3477
- newTablesStamp,
3478
- tablesStamp,
3479
- tablesChanges,
3480
- (newTableStamps, tableStamps, tableChanges) =>
3481
- mergeStamps(
3482
- newTableStamps,
3483
- tableStamps,
3484
- tableChanges,
3485
- (newRowStamps, rowStamps, rowChanges) =>
3486
- mergeStamps(
3487
- newRowStamps,
3488
- rowStamps,
3489
- rowChanges,
3490
- mergeLeafStamps,
3491
- ),
3492
- ),
3493
- );
3494
- mergeStamp(newValuesStamp, valuesStamp, valuesChanges, mergeLeafStamps);
3495
- },
3531
+ return transactionMergeableChanges;
3532
+ };
3533
+ const applyMergeableChanges = (mergeableChanges) => {
3534
+ seenHlc(mergeableChanges[0]);
3535
+ disableListening(() =>
3536
+ store.applyChanges(mergeContentOrChanges(mergeableChanges)),
3496
3537
  );
3497
- disableListening(() => store.applyChanges(changes));
3498
3538
  return mergeableStore;
3499
3539
  };
3540
+ const merge = (mergeableStore2) => {
3541
+ const mergeableChanges = getMergeableContent();
3542
+ const mergeableChanges2 = mergeableStore2.getMergeableContent();
3543
+ mergeableStore2.applyMergeableChanges(mergeableChanges);
3544
+ return applyMergeableChanges(mergeableChanges2);
3545
+ };
3546
+ const getContentHash = () => contentHsm[2];
3547
+ const getTablesHash = () => contentHsm[1][0][2];
3548
+ const getTableHash = (tableId) =>
3549
+ mapGet(contentHsm[1][0][1], tableId)?.[2] ?? 0;
3550
+ const getRowHash = (tableId, rowId) =>
3551
+ mapGet(mapGet(contentHsm[1][0][1], tableId)?.[1], rowId)?.[2] ?? 0;
3552
+ const getCellHash = (tableId, rowId, cellId) =>
3553
+ mapGet(
3554
+ mapGet(mapGet(contentHsm[1][0][1], tableId)?.[1], rowId)?.[1],
3555
+ cellId,
3556
+ )?.[2] ?? 0;
3557
+ const getValuesHash = () => contentHsm[1][1][2];
3558
+ const getValueHash = (valueId) =>
3559
+ mapGet(contentHsm[1][1][1], valueId)?.[2] ?? 0;
3500
3560
  const mergeableStore = {
3501
3561
  getMergeableContent,
3502
3562
  setMergeableContent,
3503
3563
  getTransactionMergeableChanges,
3504
3564
  applyMergeableChanges,
3505
3565
  merge,
3566
+ getContentHash,
3567
+ getTablesHash,
3568
+ getTableHash,
3569
+ getRowHash,
3570
+ getCellHash,
3571
+ getValuesHash,
3572
+ getValueHash,
3506
3573
  };
3507
3574
  store.setInternalListeners(preFinishTransaction, postFinishTransaction);
3508
3575
  objToArray(
@@ -36,9 +36,10 @@ const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
36
36
  const size = (arrayOrString) => arrayOrString.length;
37
37
  const promiseAll = async (promises) => promise.all(promises);
38
38
 
39
- const getCellOrValueType = (cell) => {
40
- const type = getTypeOf(cell);
41
- return isTypeStringOrBoolean(type) || (type == NUMBER && isFiniteNumber(cell))
39
+ const getCellOrValueType = (cellOrValue) => {
40
+ const type = getTypeOf(cellOrValue);
41
+ return isTypeStringOrBoolean(type) ||
42
+ (type == NUMBER && isFiniteNumber(cellOrValue))
42
43
  ? type
43
44
  : void 0;
44
45
  };
@@ -87,9 +88,11 @@ const mapMap = (coll, cb) =>
87
88
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
88
89
  const mapSet = (map, key, value) =>
89
90
  isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
90
- const mapEnsure = (map, key, getDefaultValue) => {
91
+ const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
91
92
  if (!collHas(map, key)) {
92
93
  mapSet(map, key, getDefaultValue());
94
+ } else {
95
+ hadExistingValue?.(mapGet(map, key));
93
96
  }
94
97
  return mapGet(map, key);
95
98
  };
@@ -334,9 +334,10 @@ const Details = ({
334
334
  );
335
335
  };
336
336
 
337
- const getCellOrValueType = (cell) => {
338
- const type = getTypeOf(cell);
339
- return isTypeStringOrBoolean(type) || (type == NUMBER && isFiniteNumber(cell))
337
+ const getCellOrValueType = (cellOrValue) => {
338
+ const type = getTypeOf(cellOrValue);
339
+ return isTypeStringOrBoolean(type) ||
340
+ (type == NUMBER && isFiniteNumber(cellOrValue))
340
341
  ? type
341
342
  : void 0;
342
343
  };
@@ -1529,9 +1530,11 @@ const mapMap = (coll, cb) =>
1529
1530
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
1530
1531
  const mapSet = (map, key, value) =>
1531
1532
  isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
1532
- const mapEnsure = (map, key, getDefaultValue) => {
1533
+ const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
1533
1534
  if (!collHas(map, key)) {
1534
1535
  mapSet(map, key, getDefaultValue());
1536
+ } else {
1537
+ hadExistingValue?.(mapGet(map, key));
1535
1538
  }
1536
1539
  return mapGet(map, key);
1537
1540
  };