tinybase 5.0.0-beta.3 → 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 (336) 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 +247 -139
  106. package/lib/debug/metrics.js +3 -1
  107. package/lib/debug/persisters/persister-automerge.js +36 -12
  108. package/lib/debug/persisters/persister-browser.js +37 -13
  109. package/lib/debug/persisters/persister-cr-sqlite-wasm.js +36 -12
  110. package/lib/debug/persisters/persister-electric-sql.js +36 -12
  111. package/lib/debug/persisters/persister-expo-sqlite-next.js +36 -12
  112. package/lib/debug/persisters/persister-expo-sqlite.js +36 -12
  113. package/lib/debug/persisters/persister-file.js +37 -13
  114. package/lib/debug/persisters/persister-indexed-db.js +36 -12
  115. package/lib/debug/persisters/persister-libsql.js +898 -0
  116. package/lib/debug/persisters/persister-partykit-client.js +36 -12
  117. package/lib/debug/persisters/persister-remote.js +36 -12
  118. package/lib/debug/persisters/persister-sqlite-wasm.js +36 -12
  119. package/lib/debug/persisters/persister-sqlite3.js +36 -12
  120. package/lib/debug/persisters/persister-yjs.js +36 -12
  121. package/lib/debug/persisters.js +36 -12
  122. package/lib/debug/queries.js +7 -4
  123. package/lib/debug/relationships.js +3 -1
  124. package/lib/debug/store.js +21 -22
  125. package/lib/debug/tinybase.js +279 -150
  126. package/lib/debug/tools.js +7 -4
  127. package/lib/debug/ui-react-dom.js +55 -34
  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 +78 -11
  225. package/lib/types/persisters/persister-browser.d.ts +2 -2
  226. package/lib/types/persisters/persister-file.d.ts +1 -1
  227. package/lib/types/persisters/persister-libsql.d.ts +139 -0
  228. package/lib/types/persisters.d.ts +19 -7
  229. package/lib/types/with-schemas/mergeable-store.d.ts +314 -31
  230. package/lib/types/with-schemas/persisters/persister-browser.d.ts +2 -2
  231. package/lib/types/with-schemas/persisters/persister-file.d.ts +1 -1
  232. package/lib/types/with-schemas/persisters/persister-libsql.d.ts +152 -0
  233. package/lib/types/with-schemas/persisters.d.ts +14 -6
  234. package/lib/types/with-schemas/store.d.ts +37 -87
  235. package/lib/umd/checkpoints.js +1 -1
  236. package/lib/umd/checkpoints.js.gz +0 -0
  237. package/lib/umd/indexes.js +1 -1
  238. package/lib/umd/indexes.js.gz +0 -0
  239. package/lib/umd/mergeable-store.js +1 -1
  240. package/lib/umd/mergeable-store.js.gz +0 -0
  241. package/lib/umd/metrics.js +1 -1
  242. package/lib/umd/metrics.js.gz +0 -0
  243. package/lib/umd/persisters/persister-automerge.js +1 -1
  244. package/lib/umd/persisters/persister-automerge.js.gz +0 -0
  245. package/lib/umd/persisters/persister-browser.js +1 -1
  246. package/lib/umd/persisters/persister-browser.js.gz +0 -0
  247. package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
  248. package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  249. package/lib/umd/persisters/persister-electric-sql.js +1 -1
  250. package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
  251. package/lib/umd/persisters/persister-expo-sqlite-next.js +1 -1
  252. package/lib/umd/persisters/persister-expo-sqlite-next.js.gz +0 -0
  253. package/lib/umd/persisters/persister-expo-sqlite.js +1 -1
  254. package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
  255. package/lib/umd/persisters/persister-file.js +1 -1
  256. package/lib/umd/persisters/persister-file.js.gz +0 -0
  257. package/lib/umd/persisters/persister-indexed-db.js +1 -1
  258. package/lib/umd/persisters/persister-indexed-db.js.gz +0 -0
  259. package/lib/umd/persisters/persister-libsql.js +1 -0
  260. package/lib/umd/persisters/persister-libsql.js.gz +0 -0
  261. package/lib/umd/persisters/persister-partykit-client.js +1 -1
  262. package/lib/umd/persisters/persister-partykit-client.js.gz +0 -0
  263. package/lib/umd/persisters/persister-remote.js +1 -1
  264. package/lib/umd/persisters/persister-remote.js.gz +0 -0
  265. package/lib/umd/persisters/persister-sqlite-wasm.js +1 -1
  266. package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
  267. package/lib/umd/persisters/persister-sqlite3.js +1 -1
  268. package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
  269. package/lib/umd/persisters/persister-yjs.js +1 -1
  270. package/lib/umd/persisters/persister-yjs.js.gz +0 -0
  271. package/lib/umd/persisters.js +1 -1
  272. package/lib/umd/persisters.js.gz +0 -0
  273. package/lib/umd/queries.js +1 -1
  274. package/lib/umd/queries.js.gz +0 -0
  275. package/lib/umd/relationships.js +1 -1
  276. package/lib/umd/relationships.js.gz +0 -0
  277. package/lib/umd/store.js +1 -1
  278. package/lib/umd/store.js.gz +0 -0
  279. package/lib/umd/tinybase.js +1 -1
  280. package/lib/umd/tinybase.js.gz +0 -0
  281. package/lib/umd/tools.js +1 -1
  282. package/lib/umd/tools.js.gz +0 -0
  283. package/lib/umd/ui-react-dom-debug.js +1 -1
  284. package/lib/umd/ui-react-dom-debug.js.gz +0 -0
  285. package/lib/umd-es6/checkpoints.js +1 -1
  286. package/lib/umd-es6/checkpoints.js.gz +0 -0
  287. package/lib/umd-es6/indexes.js +1 -1
  288. package/lib/umd-es6/indexes.js.gz +0 -0
  289. package/lib/umd-es6/mergeable-store.js +1 -1
  290. package/lib/umd-es6/mergeable-store.js.gz +0 -0
  291. package/lib/umd-es6/metrics.js +1 -1
  292. package/lib/umd-es6/metrics.js.gz +0 -0
  293. package/lib/umd-es6/persisters/persister-automerge.js +1 -1
  294. package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
  295. package/lib/umd-es6/persisters/persister-browser.js +1 -1
  296. package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
  297. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  298. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  299. package/lib/umd-es6/persisters/persister-electric-sql.js +1 -1
  300. package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
  301. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js +1 -1
  302. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  303. package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -1
  304. package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
  305. package/lib/umd-es6/persisters/persister-file.js +1 -1
  306. package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
  307. package/lib/umd-es6/persisters/persister-indexed-db.js +1 -1
  308. package/lib/umd-es6/persisters/persister-indexed-db.js.gz +0 -0
  309. package/lib/umd-es6/persisters/persister-libsql.js +1 -0
  310. package/lib/umd-es6/persisters/persister-libsql.js.gz +0 -0
  311. package/lib/umd-es6/persisters/persister-partykit-client.js +1 -1
  312. package/lib/umd-es6/persisters/persister-partykit-client.js.gz +0 -0
  313. package/lib/umd-es6/persisters/persister-remote.js +1 -1
  314. package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
  315. package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -1
  316. package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  317. package/lib/umd-es6/persisters/persister-sqlite3.js +1 -1
  318. package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
  319. package/lib/umd-es6/persisters/persister-yjs.js +1 -1
  320. package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
  321. package/lib/umd-es6/persisters.js +1 -1
  322. package/lib/umd-es6/persisters.js.gz +0 -0
  323. package/lib/umd-es6/queries.js +1 -1
  324. package/lib/umd-es6/queries.js.gz +0 -0
  325. package/lib/umd-es6/relationships.js +1 -1
  326. package/lib/umd-es6/relationships.js.gz +0 -0
  327. package/lib/umd-es6/store.js +1 -1
  328. package/lib/umd-es6/store.js.gz +0 -0
  329. package/lib/umd-es6/tinybase.js +1 -1
  330. package/lib/umd-es6/tinybase.js.gz +0 -0
  331. package/lib/umd-es6/tools.js +1 -1
  332. package/lib/umd-es6/tools.js.gz +0 -0
  333. package/lib/umd-es6/ui-react-dom-debug.js +1 -1
  334. package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
  335. package/package.json +35 -30
  336. package/readme.md +2 -2
@@ -24,9 +24,9 @@ const VALUE_IDS = VALUE + IDS;
24
24
  const id = (key) => EMPTY_STRING + key;
25
25
  const strStartsWith = (str, prefix) => str.startsWith(prefix);
26
26
  const strEndsWith = (str, suffix) => str.endsWith(suffix);
27
- const strSplit = (str, separator = '', limit) => str.split(separator, limit);
28
- const strCharCodeAt = (str, position = 0) => str.charCodeAt(position);
27
+ const strCharCodeAt = (str, position) => str.charCodeAt(position);
29
28
 
29
+ const mathMax = Math.max;
30
30
  const isFiniteNumber = isFinite;
31
31
  const isInstanceOf = (thing, cls) => thing instanceof cls;
32
32
  const isUndefined = (thing) => thing == void 0;
@@ -79,6 +79,12 @@ const objToArray = (obj, cb) =>
79
79
  arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
80
80
  const objSize = (obj) => size(objIds(obj));
81
81
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
82
+ const objEnsure = (obj, id, getDefaultValue) => {
83
+ if (!objHas(obj, id)) {
84
+ obj[id] = getDefaultValue();
85
+ }
86
+ return obj[id];
87
+ };
82
88
 
83
89
  const collSizeN = (collSizer) => (coll) =>
84
90
  arrayReduce(collValues(coll), (total, coll2) => total + collSizer(coll2), 0);
@@ -102,9 +108,11 @@ const mapMap = (coll, cb) =>
102
108
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
103
109
  const mapSet = (map, key, value) =>
104
110
  isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
105
- const mapEnsure = (map, key, getDefaultValue) => {
111
+ const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
106
112
  if (!collHas(map, key)) {
107
113
  mapSet(map, key, getDefaultValue());
114
+ } else {
115
+ hadExistingValue?.(mapGet(map, key));
108
116
  }
109
117
  return mapGet(map, key);
110
118
  };
@@ -162,34 +170,36 @@ const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
162
170
  },
163
171
  );
164
172
 
165
- const stampNew = () => [EMPTY_STRING, void 0];
166
- const stampNewMap = () => [EMPTY_STRING, mapNew()];
167
- const mapStamp = ([stamp, value], mapper) => [stamp, mapper(value, stamp)];
168
- const mapStampMapToObj = (stampedMap, mapper) =>
169
- mapStamp(stampedMap, (map) => mapToObj(map, mapper));
170
- const mergeStamps = (newThingStamps, thingStamps, changes, merge) =>
171
- objForEach(newThingStamps, (newThingStamp, thingId) =>
172
- mergeStamp(
173
- newThingStamp,
174
- mapEnsure(thingStamps, thingId, stampNewMap),
175
- (changes[thingId] = objNew()),
176
- merge,
177
- ),
178
- );
179
- const mergeStamp = ([newTime, newThing], thingStamp, changes, merge) => {
180
- if (newTime > thingStamp[0]) {
181
- thingStamp[0] = newTime;
173
+ const textEncoder = new globalThis.TextEncoder();
174
+ const getHash = (value) => {
175
+ let hash = 2166136261;
176
+ arrayForEach(textEncoder.encode(value), (char) => {
177
+ hash ^= char;
178
+ hash +=
179
+ (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);
180
+ });
181
+ return hash >>> 0;
182
+ };
183
+
184
+ const cloneHashStamp = ([time, value, hash]) => [time, value, hash];
185
+ const stampNew = (time, thing) => [time, thing];
186
+ const hashIdAndHash = (id, hash) => getHash(id + ':' + hash);
187
+ const updateHashStamp = (hashStamp, hash, time) => {
188
+ hashStamp[2] = hash >>> 0;
189
+ if (time > hashStamp[0]) {
190
+ hashStamp[0] = time;
182
191
  }
183
- merge(newThing, thingStamp[1], changes);
184
192
  };
185
- const mergeLeafStamps = (newLeafStamps, leafStamps, changes) =>
186
- objForEach(newLeafStamps, ([newTime, newLeaf], leafId) => {
187
- const leafStamp = mapEnsure(leafStamps, leafId, stampNew);
188
- if (newTime > leafStamp[0]) {
189
- leafStamp[0] = newTime;
190
- leafStamp[1] = changes[leafId] = newLeaf;
191
- }
192
- });
193
+ const stampNewObj = (time) => stampNew(time, objNew());
194
+ const hashStampNewMap = (time = EMPTY_STRING) => [time, mapNew(), 0];
195
+ const hashStampNewThing = () => [EMPTY_STRING, void 0, 0];
196
+ const hashStampMap = ([time, value, hash], mapper) => [
197
+ time,
198
+ mapper(value, time),
199
+ hash,
200
+ ];
201
+ const hashStampMapToObj = (hashStamp, mapper = cloneHashStamp) =>
202
+ hashStampMap(hashStamp, (map) => mapToObj(map, mapper));
193
203
 
194
204
  const setNew = (entryOrEntries) =>
195
205
  new Set(
@@ -289,9 +299,10 @@ const pairNewMap = () => [mapNew(), mapNew()];
289
299
  const pairClone = (array) => [...array];
290
300
  const pairIsEqual = ([entry1, entry2]) => entry1 === entry2;
291
301
 
292
- const getCellOrValueType = (cell) => {
293
- const type = getTypeOf(cell);
294
- return isTypeStringOrBoolean(type) || (type == NUMBER && isFiniteNumber(cell))
302
+ const getCellOrValueType = (cellOrValue) => {
303
+ const type = getTypeOf(cellOrValue);
304
+ return isTypeStringOrBoolean(type) ||
305
+ (type == NUMBER && isFiniteNumber(cellOrValue))
295
306
  ? type
296
307
  : void 0;
297
308
  };
@@ -332,12 +343,10 @@ const idsChanged = (changedIds, id2, addedOrRemoved) =>
332
343
  const createStore = () => {
333
344
  let hasTablesSchema;
334
345
  let hasValuesSchema;
335
- let cellsTouched = false;
336
- let valuesTouched = false;
337
346
  let hadTables = false;
338
347
  let hadValues = false;
339
348
  let transactions = 0;
340
- let postTransactionListener;
349
+ let internalListeners = [];
341
350
  const changedTableIds = mapNew();
342
351
  const changedTableCellIds = mapNew();
343
352
  const changedRowCount = mapNew();
@@ -1297,8 +1306,8 @@ const createStore = () => {
1297
1306
  ),
1298
1307
  ];
1299
1308
  const getTransactionLog = () => [
1300
- cellsTouched,
1301
- valuesTouched,
1309
+ !collIsEmpty(changedCells),
1310
+ !collIsEmpty(changedValues),
1302
1311
  mapToObj3(changedCells, pairClone, pairIsEqual),
1303
1312
  mapToObj3(invalidCells),
1304
1313
  mapToObj(changedValues, pairClone, pairIsEqual),
@@ -1312,15 +1321,13 @@ const createStore = () => {
1312
1321
  if (transactions > 0) {
1313
1322
  transactions--;
1314
1323
  if (transactions == 0) {
1315
- cellsTouched = !collIsEmpty(changedCells);
1316
- valuesTouched = !collIsEmpty(changedValues);
1317
1324
  transactions = 1;
1318
1325
  callInvalidCellListeners(1);
1319
- if (cellsTouched) {
1326
+ if (!collIsEmpty(changedCells)) {
1320
1327
  callTabularListenersForChanges(1);
1321
1328
  }
1322
1329
  callInvalidValueListeners(1);
1323
- if (valuesTouched) {
1330
+ if (!collIsEmpty(changedValues)) {
1324
1331
  callValuesListenersForChanges(1);
1325
1332
  }
1326
1333
  if (doRollback?.(store)) {
@@ -1331,25 +1338,26 @@ const createStore = () => {
1331
1338
  ),
1332
1339
  ),
1333
1340
  );
1341
+ collClear(changedCells);
1334
1342
  collForEach(changedValues, ([oldValue], valueId) =>
1335
1343
  setOrDelValue(store, valueId, oldValue),
1336
1344
  );
1337
- cellsTouched = valuesTouched = false;
1345
+ collClear(changedValues);
1338
1346
  }
1339
1347
  callListeners(finishTransactionListeners[0], void 0);
1340
1348
  transactions = -1;
1341
1349
  callInvalidCellListeners(0);
1342
- if (cellsTouched) {
1350
+ if (!collIsEmpty(changedCells)) {
1343
1351
  callTabularListenersForChanges(0);
1344
1352
  }
1345
1353
  callInvalidValueListeners(0);
1346
- if (valuesTouched) {
1354
+ if (!collIsEmpty(changedValues)) {
1347
1355
  callValuesListenersForChanges(0);
1348
1356
  }
1349
- postTransactionListener?.(store);
1357
+ internalListeners[0]?.(store);
1350
1358
  callListeners(finishTransactionListeners[1], void 0);
1359
+ internalListeners[1]?.(store);
1351
1360
  transactions = 0;
1352
- cellsTouched = valuesTouched = false;
1353
1361
  hadTables = hasTables();
1354
1362
  hadValues = hasValues();
1355
1363
  arrayForEach(
@@ -1474,9 +1482,8 @@ const createStore = () => {
1474
1482
  collSize2(startTransactionListeners) +
1475
1483
  pairCollSize2(finishTransactionListeners),
1476
1484
  });
1477
- const addPostTransactionListener = (listener) => {
1478
- postTransactionListener = listener;
1479
- };
1485
+ const setInternalListeners = (preFinishTransaction, postFinishTransaction) =>
1486
+ (internalListeners = [preFinishTransaction, postFinishTransaction]);
1480
1487
  const store = {
1481
1488
  getContent,
1482
1489
  getTables,
@@ -1554,7 +1561,7 @@ const createStore = () => {
1554
1561
  createStore,
1555
1562
  addListener,
1556
1563
  callListeners,
1557
- addPostTransactionListener,
1564
+ setInternalListeners,
1558
1565
  };
1559
1566
  objToArray(
1560
1567
  {
@@ -1638,12 +1645,6 @@ const SHIFT12 = 2 ** 12;
1638
1645
  const SHIFT6 = 2 ** 6;
1639
1646
  const toB64 = (num) => String.fromCharCode(48 + (num & MASK6));
1640
1647
  const fromB64 = (str, pos) => strCharCodeAt(str, pos) - 48;
1641
- const hash = (value) =>
1642
- arrayReduce(
1643
- strSplit(value),
1644
- (hash2, char) => ((hash2 << 5) + hash2) ^ strCharCodeAt(char),
1645
- 5381,
1646
- ) >>> 0;
1647
1648
  const encodeHlc = (logicalTime42, counter24, clientHash30) =>
1648
1649
  toB64(logicalTime42 / SHIFT36) +
1649
1650
  toB64(logicalTime42 / SHIFT30) +
@@ -1681,23 +1682,23 @@ const decodeHlc = (hlc16) => [
1681
1682
  ];
1682
1683
  const getHlcFunctions = (uniqueId) => {
1683
1684
  let logicalTime = 0;
1684
- let counter = 0;
1685
- const uniqueIdHash = hash(uniqueId);
1685
+ let lastCounter = -1;
1686
+ const uniqueIdHash = getHash(uniqueId);
1686
1687
  const getHlc = () => {
1687
1688
  seenHlc();
1688
- return encodeHlc(logicalTime, ++counter, uniqueIdHash);
1689
+ return encodeHlc(logicalTime, ++lastCounter, uniqueIdHash);
1689
1690
  };
1690
1691
  const seenHlc = (hlc) => {
1691
1692
  const previousLogicalTime = logicalTime;
1692
1693
  const [remoteLogicalTime, remoteCounter] = isUndefined(hlc)
1693
1694
  ? [0, 0]
1694
1695
  : decodeHlc(hlc);
1695
- logicalTime = Math.max(previousLogicalTime, remoteLogicalTime, Date.now());
1696
- counter =
1696
+ logicalTime = mathMax(previousLogicalTime, remoteLogicalTime, Date.now());
1697
+ lastCounter =
1697
1698
  logicalTime == previousLogicalTime
1698
1699
  ? logicalTime == remoteLogicalTime
1699
- ? Math.max(counter, remoteCounter)
1700
- : counter
1700
+ ? mathMax(lastCounter, remoteCounter)
1701
+ : lastCounter
1701
1702
  : logicalTime == remoteLogicalTime
1702
1703
  ? remoteCounter
1703
1704
  : -1;
@@ -1723,10 +1724,16 @@ const LISTENER_ARGS = {
1723
1724
  InvalidCell: 3,
1724
1725
  InvalidValue: 1,
1725
1726
  };
1726
- const newContentStamp = () => [EMPTY_STRING, [stampNewMap(), stampNewMap()]];
1727
+ const newContentHsm = (time = EMPTY_STRING) => [
1728
+ time,
1729
+ [hashStampNewMap(time), hashStampNewMap(time)],
1730
+ 0,
1731
+ ];
1727
1732
  const createMergeableStore = (id) => {
1728
1733
  let listening = 1;
1729
- let contentStamp = newContentStamp();
1734
+ let contentHsm = newContentHsm();
1735
+ let transactionTime;
1736
+ let transactionMergeableChanges;
1730
1737
  const [getHlc, seenHlc] = getHlcFunctions(id);
1731
1738
  const store = createStore();
1732
1739
  const disableListening = (actions) => {
@@ -1735,105 +1742,206 @@ const createMergeableStore = (id) => {
1735
1742
  actions();
1736
1743
  listening = wasListening;
1737
1744
  };
1738
- const postTransactionListener = () => {
1739
- if (listening) {
1740
- const stamp = getHlc();
1741
- const [cellsTouched, valuesTouched, changedCells, , changedValues] =
1742
- store.getTransactionLog();
1743
- const [tablesStamp, valuesStamp] = contentStamp[1];
1744
- contentStamp[0] = stamp;
1745
- if (cellsTouched) {
1746
- tablesStamp[0] = stamp;
1747
- objToArray(changedCells, (changedTable, tableId) => {
1748
- const tableStamp = mapEnsure(tablesStamp[1], tableId, stampNew);
1749
- const rowsStamp = (tableStamp[1] ??= mapNew());
1750
- tableStamp[0] = stamp;
1751
- objToArray(changedTable, (changedRow, rowId) => {
1752
- const rowStamp = mapEnsure(rowsStamp, rowId, stampNew);
1753
- const cellsStamp = (rowStamp[1] ??= mapNew());
1754
- rowStamp[0] = stamp;
1755
- objToArray(changedRow, ([, newCell], cellId) =>
1756
- mapSet(cellsStamp, cellId, [stamp, newCell]),
1745
+ const mergeContentOrChanges = (contentOrChanges, hasHashes = 0) => {
1746
+ const tablesChanges = {};
1747
+ const valuesChanges = {};
1748
+ const [
1749
+ contentOrChangesTime,
1750
+ [[tablesTime, tablesObj, incomingTablesHash], values],
1751
+ incomingContentOrChangesHash,
1752
+ ] = contentOrChanges;
1753
+ const [, [tablesHsm, valuesHsm]] = contentHsm;
1754
+ const [oldTablesTime, tableHsms, oldTablesHash] = tablesHsm;
1755
+ if (tablesTime) {
1756
+ let tablesHash = hasHashes
1757
+ ? incomingTablesHash
1758
+ : oldTablesHash ^
1759
+ (tablesTime > oldTablesTime
1760
+ ? (oldTablesTime ? getHash(oldTablesTime) : 0) ^ getHash(tablesTime)
1761
+ : 0);
1762
+ objForEach(
1763
+ tablesObj,
1764
+ ([tableTime, rowsObj, incomingTableHash], tableId) => {
1765
+ const tableHsm = mapEnsure(tableHsms, tableId, hashStampNewMap);
1766
+ const [oldTableTime, rowHsms, oldTableHash] = tableHsm;
1767
+ let tableHash = hasHashes
1768
+ ? incomingTableHash
1769
+ : oldTableHash ^
1770
+ (tableTime > oldTableTime
1771
+ ? (oldTableTime ? getHash(oldTableTime) : 0) ^
1772
+ getHash(tableTime)
1773
+ : 0);
1774
+ objForEach(rowsObj, (row, rowId) => {
1775
+ const [oldRowHash, rowHash] = mergeCellsOrValues(
1776
+ row,
1777
+ mapEnsure(rowHsms, rowId, hashStampNewMap),
1778
+ objEnsure(
1779
+ objEnsure(tablesChanges, tableId, objNew),
1780
+ rowId,
1781
+ objNew,
1782
+ ),
1783
+ hasHashes,
1757
1784
  );
1785
+ tableHash ^= hasHashes
1786
+ ? 0
1787
+ : (oldRowHash ? hashIdAndHash(rowId, oldRowHash) : 0) ^
1788
+ hashIdAndHash(rowId, rowHash);
1758
1789
  });
1759
- });
1760
- }
1761
- if (valuesTouched) {
1762
- valuesStamp[0] = stamp;
1763
- objToArray(changedValues, ([, newValue], valueId) => {
1764
- mapSet(valuesStamp[1], valueId, [stamp, newValue]);
1765
- });
1766
- }
1790
+ updateHashStamp(tableHsm, tableHash, tableTime);
1791
+ tablesHash ^= hasHashes
1792
+ ? 0
1793
+ : (oldTableHash ? hashIdAndHash(tableId, oldTableHash) : 0) ^
1794
+ hashIdAndHash(tableId, tableHsm[2]);
1795
+ },
1796
+ );
1797
+ updateHashStamp(tablesHsm, tablesHash, tablesTime);
1767
1798
  }
1799
+ mergeCellsOrValues(values, valuesHsm, valuesChanges, hasHashes);
1800
+ updateHashStamp(
1801
+ contentHsm,
1802
+ hasHashes ? incomingContentOrChangesHash : tablesHsm[2] ^ valuesHsm[2],
1803
+ contentOrChangesTime,
1804
+ );
1805
+ return [tablesChanges, valuesChanges];
1768
1806
  };
1769
- const merge = (mergeableStore2) => {
1770
- const mergeableContent = mergeableStore.getMergeableContent();
1771
- const mergeableContent2 = mergeableStore2.getMergeableContent();
1772
- mergeableStore2.applyMergeableChanges(mergeableContent);
1773
- return applyMergeableChanges(mergeableContent2);
1807
+ const mergeCellsOrValues = (things, thingsHsm, thingsChanges, hasHashes) => {
1808
+ const [thingsTime, thingsObj, incomingThingsHash] = things;
1809
+ const [oldThingsTime, thingHsms, oldThingsHash] = thingsHsm;
1810
+ if (thingsTime) {
1811
+ let thingsHash = hasHashes
1812
+ ? incomingThingsHash
1813
+ : oldThingsHash ^
1814
+ (thingsTime > oldThingsTime
1815
+ ? (oldThingsTime ? getHash(oldThingsTime) : 0) ^ getHash(thingsTime)
1816
+ : 0);
1817
+ objForEach(
1818
+ thingsObj,
1819
+ ([thingTime, thing, incomingThingHash], thingId) => {
1820
+ const thingHsm = mapEnsure(thingHsms, thingId, hashStampNewThing);
1821
+ const [oldThingTime, , oldThingHash] = thingHsm;
1822
+ if (thingTime > oldThingTime) {
1823
+ updateHashStamp(
1824
+ thingHsm,
1825
+ hasHashes
1826
+ ? incomingThingHash
1827
+ : getHash(jsonString(thing ?? null) + ':' + thingTime),
1828
+ thingTime,
1829
+ );
1830
+ thingHsm[1] = thing;
1831
+ thingsChanges[thingId] = thing;
1832
+ thingsHash ^= hasHashes
1833
+ ? 0
1834
+ : hashIdAndHash(thingId, oldThingHash) ^
1835
+ hashIdAndHash(thingId, thingHsm[2]);
1836
+ }
1837
+ },
1838
+ );
1839
+ updateHashStamp(thingsHsm, thingsHash, thingsTime);
1840
+ }
1841
+ return [oldThingsHash, thingsHsm[2]];
1842
+ };
1843
+ const preFinishTransaction = () => {
1844
+ if (listening) {
1845
+ transactionMergeableChanges = getTransactionMergeableChanges();
1846
+ mergeContentOrChanges(transactionMergeableChanges);
1847
+ }
1774
1848
  };
1849
+ const postFinishTransaction = () =>
1850
+ (transactionTime = transactionMergeableChanges = void 0);
1775
1851
  const getMergeableContent = () =>
1776
- mapStamp(contentStamp, ([tablesStamp, valuesStamp]) => [
1777
- mapStampMapToObj(tablesStamp, (rowsStamp) =>
1778
- mapStampMapToObj(rowsStamp, (cellsStamp) =>
1779
- mapStampMapToObj(cellsStamp, pairClone),
1780
- ),
1852
+ hashStampMap(contentHsm, ([tables, values]) => [
1853
+ hashStampMapToObj(tables, (table) =>
1854
+ hashStampMapToObj(table, (row) => hashStampMapToObj(row)),
1781
1855
  ),
1782
- mapStampMapToObj(valuesStamp, pairClone),
1856
+ hashStampMapToObj(values),
1783
1857
  ]);
1784
1858
  const setMergeableContent = (mergeableContent) => {
1785
1859
  disableListening(() =>
1786
1860
  store.transaction(() => {
1787
1861
  store.delTables().delValues();
1788
- contentStamp = newContentStamp();
1862
+ contentHsm = newContentHsm();
1789
1863
  }),
1790
1864
  );
1791
- applyMergeableChanges(mergeableContent);
1865
+ seenHlc(mergeableContent[0]);
1866
+ disableListening(() =>
1867
+ store.applyChanges(mergeContentOrChanges(mergeableContent, 1)),
1868
+ );
1792
1869
  return mergeableStore;
1793
1870
  };
1794
- const applyMergeableChanges = (newContentStamp2) => {
1795
- const changes = [{}, {}];
1796
- seenHlc(newContentStamp2[0]);
1797
- mergeStamp(
1798
- newContentStamp2,
1799
- contentStamp,
1800
- changes,
1801
- (
1802
- [newTablesStamp, newValuesStamp],
1803
- [tablesStamp, valuesStamp],
1804
- [tablesChanges, valuesChanges],
1805
- ) => {
1806
- mergeStamp(
1807
- newTablesStamp,
1808
- tablesStamp,
1809
- tablesChanges,
1810
- (newTableStamps, tableStamps, tableChanges) =>
1811
- mergeStamps(
1812
- newTableStamps,
1813
- tableStamps,
1814
- tableChanges,
1815
- (newRowStamps, rowStamps, rowChanges) =>
1816
- mergeStamps(
1817
- newRowStamps,
1818
- rowStamps,
1819
- rowChanges,
1820
- mergeLeafStamps,
1821
- ),
1822
- ),
1823
- );
1824
- mergeStamp(newValuesStamp, valuesStamp, valuesChanges, mergeLeafStamps);
1825
- },
1871
+ const getTransactionMergeableChanges = () => {
1872
+ if (isUndefined(transactionMergeableChanges)) {
1873
+ const [, , changedCells, , changedValues] = store.getTransactionLog();
1874
+ const time =
1875
+ !objIsEmpty(changedCells) || !objIsEmpty(changedValues)
1876
+ ? transactionTime ?? (transactionTime = getHlc())
1877
+ : EMPTY_STRING;
1878
+ const mergeableChanges = stampNew(time, [
1879
+ stampNewObj(objIsEmpty(changedCells) ? EMPTY_STRING : time),
1880
+ stampNewObj(objIsEmpty(changedValues) ? EMPTY_STRING : time),
1881
+ ]);
1882
+ const [[, tablesObj], [, valuesObj]] = mergeableChanges[1];
1883
+ objToArray(changedCells, (changedTable, tableId) => {
1884
+ const [, rowsObj] = (tablesObj[tableId] = stampNewObj(time));
1885
+ objToArray(changedTable, (changedRow, rowId) => {
1886
+ const [, cellsObj] = (rowsObj[rowId] = stampNewObj(time));
1887
+ objToArray(
1888
+ changedRow,
1889
+ ([, newCell], cellId) =>
1890
+ (cellsObj[cellId] = stampNew(time, newCell)),
1891
+ );
1892
+ });
1893
+ });
1894
+ objToArray(
1895
+ changedValues,
1896
+ ([, newValue], valueId) =>
1897
+ (valuesObj[valueId] = stampNew(time, newValue)),
1898
+ );
1899
+ return mergeableChanges;
1900
+ }
1901
+ return transactionMergeableChanges;
1902
+ };
1903
+ const applyMergeableChanges = (mergeableChanges) => {
1904
+ seenHlc(mergeableChanges[0]);
1905
+ disableListening(() =>
1906
+ store.applyChanges(mergeContentOrChanges(mergeableChanges)),
1826
1907
  );
1827
- disableListening(() => store.applyChanges(changes));
1828
1908
  return mergeableStore;
1829
1909
  };
1910
+ const merge = (mergeableStore2) => {
1911
+ const mergeableChanges = getMergeableContent();
1912
+ const mergeableChanges2 = mergeableStore2.getMergeableContent();
1913
+ mergeableStore2.applyMergeableChanges(mergeableChanges);
1914
+ return applyMergeableChanges(mergeableChanges2);
1915
+ };
1916
+ const getContentHash = () => contentHsm[2];
1917
+ const getTablesHash = () => contentHsm[1][0][2];
1918
+ const getTableHash = (tableId) =>
1919
+ mapGet(contentHsm[1][0][1], tableId)?.[2] ?? 0;
1920
+ const getRowHash = (tableId, rowId) =>
1921
+ mapGet(mapGet(contentHsm[1][0][1], tableId)?.[1], rowId)?.[2] ?? 0;
1922
+ const getCellHash = (tableId, rowId, cellId) =>
1923
+ mapGet(
1924
+ mapGet(mapGet(contentHsm[1][0][1], tableId)?.[1], rowId)?.[1],
1925
+ cellId,
1926
+ )?.[2] ?? 0;
1927
+ const getValuesHash = () => contentHsm[1][1][2];
1928
+ const getValueHash = (valueId) =>
1929
+ mapGet(contentHsm[1][1][1], valueId)?.[2] ?? 0;
1830
1930
  const mergeableStore = {
1831
1931
  getMergeableContent,
1832
1932
  setMergeableContent,
1933
+ getTransactionMergeableChanges,
1833
1934
  applyMergeableChanges,
1834
1935
  merge,
1936
+ getContentHash,
1937
+ getTablesHash,
1938
+ getTableHash,
1939
+ getRowHash,
1940
+ getCellHash,
1941
+ getValuesHash,
1942
+ getValueHash,
1835
1943
  };
1836
- store.addPostTransactionListener(postTransactionListener);
1944
+ store.setInternalListeners(preFinishTransaction, postFinishTransaction);
1837
1945
  objToArray(
1838
1946
  store,
1839
1947
  (method, name) =>
@@ -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
  };
@@ -52,15 +52,34 @@ const mapNew = (entries) => new Map(entries);
52
52
  const mapGet = (map, key) => map?.get(key);
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
  };
61
63
 
62
64
  const scheduleRunning = mapNew();
63
65
  const scheduleActions = mapNew();
66
+ const isMergeable = (contentOrChanges) => isString(contentOrChanges?.[0]);
67
+ const getStoreFunctions = (supportsMergeableStore, store) =>
68
+ !supportsMergeableStore || isUndefined(store.getMergeableContent)
69
+ ? [
70
+ 0,
71
+ store.getContent,
72
+ store.getTransactionChanges,
73
+ ([changedTables, changedValues]) =>
74
+ !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
75
+ ]
76
+ : [
77
+ 1,
78
+ store.getMergeableContent,
79
+ store.getTransactionMergeableChanges,
80
+ ([, [[, changedTables], [, changedValues]]]) =>
81
+ !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
82
+ ];
64
83
  const createCustomPersister = (
65
84
  store,
66
85
  getPersisted,
@@ -81,10 +100,8 @@ const createCustomPersister = (
81
100
  let listeningHandle;
82
101
  mapEnsure(scheduleRunning, scheduleId, () => 0);
83
102
  mapEnsure(scheduleActions, scheduleId, () => []);
84
- const getContent =
85
- (supportsMergeableStore ? store.getMergeableContent : null) ??
86
- store.getContent;
87
- const getChanges = store.getTransactionChanges;
103
+ const [isMergeableStore, getContent, getChanges, hasChanges] =
104
+ getStoreFunctions(supportsMergeableStore, store);
88
105
  const run = async () => {
89
106
  /* istanbul ignore else */
90
107
  if (!mapGet(scheduleRunning, scheduleId)) {
@@ -121,8 +138,8 @@ const createCustomPersister = (
121
138
  await loadLock(async () => {
122
139
  try {
123
140
  const content = await getPersisted();
124
- (supportsMergeableStore && isString(content[0])
125
- ? store.applyMergeableChanges
141
+ (isMergeableStore && isMergeable(content)
142
+ ? store.setMergeableContent
126
143
  : store.setContent)(content);
127
144
  } catch {
128
145
  store.setContent([initialTables, initialValues]);
@@ -136,11 +153,18 @@ const createCustomPersister = (
136
153
  async (getContent2, getChanges2) => {
137
154
  if (getChanges2) {
138
155
  const changes = getChanges2();
139
- await loadLock(async () => store.applyChanges(changes));
156
+ await loadLock(async () =>
157
+ (isMergeableStore && isMergeable(changes)
158
+ ? store.applyMergeableChanges
159
+ : store.applyChanges)(changes),
160
+ );
140
161
  } else {
141
162
  await loadLock(async () => {
142
163
  try {
143
- store.setContent(getContent2?.() ?? (await getPersisted()));
164
+ const content = getContent2?.() ?? (await getPersisted());
165
+ (isMergeableStore && isMergeable(content)
166
+ ? store.setMergeableContent
167
+ : store.setContent)(content);
144
168
  } catch (error) {
145
169
  onIgnoredError?.(error);
146
170
  }
@@ -180,9 +204,9 @@ const createCustomPersister = (
180
204
  startAutoSave: async () => {
181
205
  await persister.stopAutoSave().save();
182
206
  listenerId = store.addDidFinishTransactionListener(() => {
183
- const [tableChanges, valueChanges] = getChanges();
184
- if (!objIsEmpty(tableChanges) || !objIsEmpty(valueChanges)) {
185
- persister.save(() => [tableChanges, valueChanges]);
207
+ const changes = getChanges();
208
+ if (hasChanges(changes)) {
209
+ persister.save(() => changes);
186
210
  }
187
211
  });
188
212
  return persister;