tinybase 5.0.0-beta.5 → 5.0.0-beta.6

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 (353) hide show
  1. package/lib/cjs/mergeable-store.cjs +1 -1
  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-libsql.cjs +1 -1
  20. package/lib/cjs/persisters/persister-libsql.cjs.gz +0 -0
  21. package/lib/cjs/persisters/persister-partykit-client.cjs +1 -1
  22. package/lib/cjs/persisters/persister-partykit-client.cjs.gz +0 -0
  23. package/lib/cjs/persisters/persister-powersync.cjs +1 -0
  24. package/lib/cjs/persisters/persister-powersync.cjs.gz +0 -0
  25. package/lib/cjs/persisters/persister-remote.cjs +1 -1
  26. package/lib/cjs/persisters/persister-remote.cjs.gz +0 -0
  27. package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -1
  28. package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  29. package/lib/cjs/persisters/persister-sqlite3.cjs +1 -1
  30. package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
  31. package/lib/cjs/persisters/persister-sync.cjs +1 -0
  32. package/lib/cjs/persisters/persister-sync.cjs.gz +0 -0
  33. package/lib/cjs/persisters/persister-yjs.cjs +1 -1
  34. package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
  35. package/lib/cjs/persisters.cjs +1 -1
  36. package/lib/cjs/persisters.cjs.gz +0 -0
  37. package/lib/cjs/store.cjs +1 -1
  38. package/lib/cjs/store.cjs.gz +0 -0
  39. package/lib/cjs/tinybase.cjs +1 -1
  40. package/lib/cjs/tinybase.cjs.gz +0 -0
  41. package/lib/cjs/tools.cjs +1 -1
  42. package/lib/cjs/tools.cjs.gz +0 -0
  43. package/lib/cjs/ui-react-dom-debug.cjs +1 -1
  44. package/lib/cjs/ui-react-dom-debug.cjs.gz +0 -0
  45. package/lib/cjs/ui-react.cjs +1 -1
  46. package/lib/cjs/ui-react.cjs.gz +0 -0
  47. package/lib/cjs-es6/mergeable-store.cjs +1 -1
  48. package/lib/cjs-es6/mergeable-store.cjs.gz +0 -0
  49. package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -1
  50. package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
  51. package/lib/cjs-es6/persisters/persister-browser.cjs +1 -1
  52. package/lib/cjs-es6/persisters/persister-browser.cjs.gz +0 -0
  53. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  54. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  55. package/lib/cjs-es6/persisters/persister-electric-sql.cjs +1 -1
  56. package/lib/cjs-es6/persisters/persister-electric-sql.cjs.gz +0 -0
  57. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs +1 -1
  58. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  59. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -1
  60. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
  61. package/lib/cjs-es6/persisters/persister-file.cjs +1 -1
  62. package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
  63. package/lib/cjs-es6/persisters/persister-indexed-db.cjs +1 -1
  64. package/lib/cjs-es6/persisters/persister-indexed-db.cjs.gz +0 -0
  65. package/lib/cjs-es6/persisters/persister-libsql.cjs +1 -1
  66. package/lib/cjs-es6/persisters/persister-libsql.cjs.gz +0 -0
  67. package/lib/cjs-es6/persisters/persister-partykit-client.cjs +1 -1
  68. package/lib/cjs-es6/persisters/persister-partykit-client.cjs.gz +0 -0
  69. package/lib/cjs-es6/persisters/persister-powersync.cjs +1 -0
  70. package/lib/cjs-es6/persisters/persister-powersync.cjs.gz +0 -0
  71. package/lib/cjs-es6/persisters/persister-remote.cjs +1 -1
  72. package/lib/cjs-es6/persisters/persister-remote.cjs.gz +0 -0
  73. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -1
  74. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  75. package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -1
  76. package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
  77. package/lib/cjs-es6/persisters/persister-sync.cjs +1 -0
  78. package/lib/cjs-es6/persisters/persister-sync.cjs.gz +0 -0
  79. package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -1
  80. package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
  81. package/lib/cjs-es6/persisters.cjs +1 -1
  82. package/lib/cjs-es6/persisters.cjs.gz +0 -0
  83. package/lib/cjs-es6/store.cjs +1 -1
  84. package/lib/cjs-es6/store.cjs.gz +0 -0
  85. package/lib/cjs-es6/tinybase.cjs +1 -1
  86. package/lib/cjs-es6/tinybase.cjs.gz +0 -0
  87. package/lib/cjs-es6/tools.cjs +1 -1
  88. package/lib/cjs-es6/tools.cjs.gz +0 -0
  89. package/lib/cjs-es6/ui-react-dom-debug.cjs +1 -1
  90. package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
  91. package/lib/cjs-es6/ui-react.cjs +1 -1
  92. package/lib/cjs-es6/ui-react.cjs.gz +0 -0
  93. package/lib/debug/mergeable-store.js +287 -130
  94. package/lib/debug/persisters/persister-automerge.js +39 -46
  95. package/lib/debug/persisters/persister-browser.js +39 -46
  96. package/lib/debug/persisters/persister-cr-sqlite-wasm.js +64 -60
  97. package/lib/debug/persisters/persister-electric-sql.js +64 -60
  98. package/lib/debug/persisters/persister-expo-sqlite-next.js +64 -60
  99. package/lib/debug/persisters/persister-expo-sqlite.js +64 -60
  100. package/lib/debug/persisters/persister-file.js +39 -46
  101. package/lib/debug/persisters/persister-indexed-db.js +39 -46
  102. package/lib/debug/persisters/persister-libsql.js +64 -60
  103. package/lib/debug/persisters/persister-partykit-client.js +39 -46
  104. package/lib/debug/persisters/persister-powersync.js +917 -0
  105. package/lib/debug/persisters/persister-remote.js +39 -46
  106. package/lib/debug/persisters/persister-sqlite-wasm.js +64 -60
  107. package/lib/debug/persisters/persister-sqlite3.js +64 -60
  108. package/lib/debug/persisters/persister-sync.js +594 -0
  109. package/lib/debug/persisters/persister-yjs.js +41 -48
  110. package/lib/debug/persisters.js +38 -45
  111. package/lib/debug/store.js +44 -32
  112. package/lib/debug/tinybase.js +322 -173
  113. package/lib/debug/tools.js +2 -2
  114. package/lib/debug/ui-react-dom.js +81 -76
  115. package/lib/debug/ui-react.js +1 -1
  116. package/lib/es6/mergeable-store.js +1 -1
  117. package/lib/es6/mergeable-store.js.gz +0 -0
  118. package/lib/es6/persisters/persister-automerge.js +1 -1
  119. package/lib/es6/persisters/persister-automerge.js.gz +0 -0
  120. package/lib/es6/persisters/persister-browser.js +1 -1
  121. package/lib/es6/persisters/persister-browser.js.gz +0 -0
  122. package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  123. package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  124. package/lib/es6/persisters/persister-electric-sql.js +1 -1
  125. package/lib/es6/persisters/persister-electric-sql.js.gz +0 -0
  126. package/lib/es6/persisters/persister-expo-sqlite-next.js +1 -1
  127. package/lib/es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  128. package/lib/es6/persisters/persister-expo-sqlite.js +1 -1
  129. package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
  130. package/lib/es6/persisters/persister-file.js +1 -1
  131. package/lib/es6/persisters/persister-file.js.gz +0 -0
  132. package/lib/es6/persisters/persister-indexed-db.js +1 -1
  133. package/lib/es6/persisters/persister-indexed-db.js.gz +0 -0
  134. package/lib/es6/persisters/persister-libsql.js +1 -1
  135. package/lib/es6/persisters/persister-libsql.js.gz +0 -0
  136. package/lib/es6/persisters/persister-partykit-client.js +1 -1
  137. package/lib/es6/persisters/persister-partykit-client.js.gz +0 -0
  138. package/lib/es6/persisters/persister-powersync.js +1 -0
  139. package/lib/es6/persisters/persister-powersync.js.gz +0 -0
  140. package/lib/es6/persisters/persister-remote.js +1 -1
  141. package/lib/es6/persisters/persister-remote.js.gz +0 -0
  142. package/lib/es6/persisters/persister-sqlite-wasm.js +1 -1
  143. package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  144. package/lib/es6/persisters/persister-sqlite3.js +1 -1
  145. package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
  146. package/lib/es6/persisters/persister-sync.js +1 -0
  147. package/lib/es6/persisters/persister-sync.js.gz +0 -0
  148. package/lib/es6/persisters/persister-yjs.js +1 -1
  149. package/lib/es6/persisters/persister-yjs.js.gz +0 -0
  150. package/lib/es6/persisters.js +1 -1
  151. package/lib/es6/persisters.js.gz +0 -0
  152. package/lib/es6/store.js +1 -1
  153. package/lib/es6/store.js.gz +0 -0
  154. package/lib/es6/tinybase.js +1 -1
  155. package/lib/es6/tinybase.js.gz +0 -0
  156. package/lib/es6/tools.js +1 -1
  157. package/lib/es6/tools.js.gz +0 -0
  158. package/lib/es6/ui-react-dom-debug.js +1 -1
  159. package/lib/es6/ui-react-dom-debug.js.gz +0 -0
  160. package/lib/es6/ui-react.js +1 -1
  161. package/lib/es6/ui-react.js.gz +0 -0
  162. package/lib/mergeable-store.js +1 -1
  163. package/lib/mergeable-store.js.gz +0 -0
  164. package/lib/persisters/persister-automerge.js +1 -1
  165. package/lib/persisters/persister-automerge.js.gz +0 -0
  166. package/lib/persisters/persister-browser.js +1 -1
  167. package/lib/persisters/persister-browser.js.gz +0 -0
  168. package/lib/persisters/persister-cr-sqlite-wasm.js +1 -1
  169. package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  170. package/lib/persisters/persister-electric-sql.js +1 -1
  171. package/lib/persisters/persister-electric-sql.js.gz +0 -0
  172. package/lib/persisters/persister-expo-sqlite-next.js +1 -1
  173. package/lib/persisters/persister-expo-sqlite-next.js.gz +0 -0
  174. package/lib/persisters/persister-expo-sqlite.js +1 -1
  175. package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
  176. package/lib/persisters/persister-file.js +1 -1
  177. package/lib/persisters/persister-file.js.gz +0 -0
  178. package/lib/persisters/persister-indexed-db.js +1 -1
  179. package/lib/persisters/persister-indexed-db.js.gz +0 -0
  180. package/lib/persisters/persister-libsql.js +1 -1
  181. package/lib/persisters/persister-libsql.js.gz +0 -0
  182. package/lib/persisters/persister-partykit-client.js +1 -1
  183. package/lib/persisters/persister-partykit-client.js.gz +0 -0
  184. package/lib/persisters/persister-powersync.js +1 -0
  185. package/lib/persisters/persister-powersync.js.gz +0 -0
  186. package/lib/persisters/persister-remote.js +1 -1
  187. package/lib/persisters/persister-remote.js.gz +0 -0
  188. package/lib/persisters/persister-sqlite-wasm.js +1 -1
  189. package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
  190. package/lib/persisters/persister-sqlite3.js +1 -1
  191. package/lib/persisters/persister-sqlite3.js.gz +0 -0
  192. package/lib/persisters/persister-sync.js +1 -0
  193. package/lib/persisters/persister-sync.js.gz +0 -0
  194. package/lib/persisters/persister-yjs.js +1 -1
  195. package/lib/persisters/persister-yjs.js.gz +0 -0
  196. package/lib/persisters.js +1 -1
  197. package/lib/persisters.js.gz +0 -0
  198. package/lib/store.js +1 -1
  199. package/lib/store.js.gz +0 -0
  200. package/lib/tinybase.js +1 -1
  201. package/lib/tinybase.js.gz +0 -0
  202. package/lib/tools.js +1 -1
  203. package/lib/tools.js.gz +0 -0
  204. package/lib/types/checkpoints.d.ts +2 -2
  205. package/lib/types/indexes.d.ts +2 -2
  206. package/lib/types/mergeable-store.d.ts +121 -59
  207. package/lib/types/metrics.d.ts +2 -2
  208. package/lib/types/persisters/persister-automerge.d.ts +3 -0
  209. package/lib/types/persisters/persister-browser.d.ts +9 -2
  210. package/lib/types/persisters/persister-cr-sqlite-wasm.d.ts +3 -0
  211. package/lib/types/persisters/persister-electric-sql.d.ts +3 -0
  212. package/lib/types/persisters/persister-expo-sqlite-next.d.ts +3 -0
  213. package/lib/types/persisters/persister-expo-sqlite.d.ts +3 -0
  214. package/lib/types/persisters/persister-file.d.ts +5 -1
  215. package/lib/types/persisters/persister-indexed-db.d.ts +3 -0
  216. package/lib/types/persisters/persister-libsql.d.ts +3 -0
  217. package/lib/types/persisters/persister-partykit-client.d.ts +3 -0
  218. package/lib/types/persisters/persister-powersync.d.ts +157 -0
  219. package/lib/types/persisters/persister-remote.d.ts +3 -0
  220. package/lib/types/persisters/persister-sqlite-wasm.d.ts +3 -0
  221. package/lib/types/persisters/persister-sqlite3.d.ts +3 -0
  222. package/lib/types/persisters/persister-sync.d.ts +182 -0
  223. package/lib/types/persisters/persister-yjs.d.ts +5 -2
  224. package/lib/types/persisters.d.ts +60 -3
  225. package/lib/types/queries.d.ts +2 -2
  226. package/lib/types/relationships.d.ts +2 -2
  227. package/lib/types/store.d.ts +36 -3
  228. package/lib/types/tinybase.d.ts +9 -9
  229. package/lib/types/tools.d.ts +2 -2
  230. package/lib/types/ui-react.d.ts +8 -8
  231. package/lib/types/with-schemas/checkpoints.d.ts +2 -2
  232. package/lib/types/with-schemas/indexes.d.ts +2 -2
  233. package/lib/types/with-schemas/mergeable-store.d.ts +185 -87
  234. package/lib/types/with-schemas/metrics.d.ts +2 -2
  235. package/lib/types/with-schemas/persisters/persister-automerge.d.ts +4 -1
  236. package/lib/types/with-schemas/persisters/persister-browser.d.ts +13 -6
  237. package/lib/types/with-schemas/persisters/persister-cr-sqlite-wasm.d.ts +4 -1
  238. package/lib/types/with-schemas/persisters/persister-electric-sql.d.ts +4 -1
  239. package/lib/types/with-schemas/persisters/persister-expo-sqlite-next.d.ts +4 -1
  240. package/lib/types/with-schemas/persisters/persister-expo-sqlite.d.ts +4 -1
  241. package/lib/types/with-schemas/persisters/persister-file.d.ts +7 -3
  242. package/lib/types/with-schemas/persisters/persister-indexed-db.d.ts +4 -1
  243. package/lib/types/with-schemas/persisters/persister-libsql.d.ts +4 -1
  244. package/lib/types/with-schemas/persisters/persister-partykit-client.d.ts +4 -1
  245. package/lib/types/with-schemas/persisters/persister-powersync.d.ts +170 -0
  246. package/lib/types/with-schemas/persisters/persister-remote.d.ts +4 -1
  247. package/lib/types/with-schemas/persisters/persister-sqlite-wasm.d.ts +4 -1
  248. package/lib/types/with-schemas/persisters/persister-sqlite3.d.ts +4 -1
  249. package/lib/types/with-schemas/persisters/persister-sync.d.ts +195 -0
  250. package/lib/types/with-schemas/persisters/persister-yjs.d.ts +6 -3
  251. package/lib/types/with-schemas/persisters.d.ts +79 -7
  252. package/lib/types/with-schemas/queries.d.ts +3 -3
  253. package/lib/types/with-schemas/relationships.d.ts +2 -2
  254. package/lib/types/with-schemas/store.d.ts +100 -3
  255. package/lib/types/with-schemas/tinybase.d.ts +9 -9
  256. package/lib/types/with-schemas/tools.d.ts +2 -2
  257. package/lib/types/with-schemas/ui-react.d.ts +8 -8
  258. package/lib/ui-react.js +1 -1
  259. package/lib/ui-react.js.gz +0 -0
  260. package/lib/umd/mergeable-store.js +1 -1
  261. package/lib/umd/mergeable-store.js.gz +0 -0
  262. package/lib/umd/persisters/persister-automerge.js +1 -1
  263. package/lib/umd/persisters/persister-automerge.js.gz +0 -0
  264. package/lib/umd/persisters/persister-browser.js +1 -1
  265. package/lib/umd/persisters/persister-browser.js.gz +0 -0
  266. package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
  267. package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  268. package/lib/umd/persisters/persister-electric-sql.js +1 -1
  269. package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
  270. package/lib/umd/persisters/persister-expo-sqlite-next.js +1 -1
  271. package/lib/umd/persisters/persister-expo-sqlite-next.js.gz +0 -0
  272. package/lib/umd/persisters/persister-expo-sqlite.js +1 -1
  273. package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
  274. package/lib/umd/persisters/persister-file.js +1 -1
  275. package/lib/umd/persisters/persister-file.js.gz +0 -0
  276. package/lib/umd/persisters/persister-indexed-db.js +1 -1
  277. package/lib/umd/persisters/persister-indexed-db.js.gz +0 -0
  278. package/lib/umd/persisters/persister-libsql.js +1 -1
  279. package/lib/umd/persisters/persister-libsql.js.gz +0 -0
  280. package/lib/umd/persisters/persister-partykit-client.js +1 -1
  281. package/lib/umd/persisters/persister-partykit-client.js.gz +0 -0
  282. package/lib/umd/persisters/persister-powersync.js +1 -0
  283. package/lib/umd/persisters/persister-powersync.js.gz +0 -0
  284. package/lib/umd/persisters/persister-remote.js +1 -1
  285. package/lib/umd/persisters/persister-remote.js.gz +0 -0
  286. package/lib/umd/persisters/persister-sqlite-wasm.js +1 -1
  287. package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
  288. package/lib/umd/persisters/persister-sqlite3.js +1 -1
  289. package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
  290. package/lib/umd/persisters/persister-sync.js +1 -0
  291. package/lib/umd/persisters/persister-sync.js.gz +0 -0
  292. package/lib/umd/persisters/persister-yjs.js +1 -1
  293. package/lib/umd/persisters/persister-yjs.js.gz +0 -0
  294. package/lib/umd/persisters.js +1 -1
  295. package/lib/umd/persisters.js.gz +0 -0
  296. package/lib/umd/store.js +1 -1
  297. package/lib/umd/store.js.gz +0 -0
  298. package/lib/umd/tinybase.js +1 -1
  299. package/lib/umd/tinybase.js.gz +0 -0
  300. package/lib/umd/tools.js +1 -1
  301. package/lib/umd/tools.js.gz +0 -0
  302. package/lib/umd/ui-react-dom-debug.js +1 -1
  303. package/lib/umd/ui-react-dom-debug.js.gz +0 -0
  304. package/lib/umd/ui-react.js +1 -1
  305. package/lib/umd/ui-react.js.gz +0 -0
  306. package/lib/umd-es6/mergeable-store.js +1 -1
  307. package/lib/umd-es6/mergeable-store.js.gz +0 -0
  308. package/lib/umd-es6/persisters/persister-automerge.js +1 -1
  309. package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
  310. package/lib/umd-es6/persisters/persister-browser.js +1 -1
  311. package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
  312. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  313. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  314. package/lib/umd-es6/persisters/persister-electric-sql.js +1 -1
  315. package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
  316. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js +1 -1
  317. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  318. package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -1
  319. package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
  320. package/lib/umd-es6/persisters/persister-file.js +1 -1
  321. package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
  322. package/lib/umd-es6/persisters/persister-indexed-db.js +1 -1
  323. package/lib/umd-es6/persisters/persister-indexed-db.js.gz +0 -0
  324. package/lib/umd-es6/persisters/persister-libsql.js +1 -1
  325. package/lib/umd-es6/persisters/persister-libsql.js.gz +0 -0
  326. package/lib/umd-es6/persisters/persister-partykit-client.js +1 -1
  327. package/lib/umd-es6/persisters/persister-partykit-client.js.gz +0 -0
  328. package/lib/umd-es6/persisters/persister-powersync.js +1 -0
  329. package/lib/umd-es6/persisters/persister-powersync.js.gz +0 -0
  330. package/lib/umd-es6/persisters/persister-remote.js +1 -1
  331. package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
  332. package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -1
  333. package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  334. package/lib/umd-es6/persisters/persister-sqlite3.js +1 -1
  335. package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
  336. package/lib/umd-es6/persisters/persister-sync.js +1 -0
  337. package/lib/umd-es6/persisters/persister-sync.js.gz +0 -0
  338. package/lib/umd-es6/persisters/persister-yjs.js +1 -1
  339. package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
  340. package/lib/umd-es6/persisters.js +1 -1
  341. package/lib/umd-es6/persisters.js.gz +0 -0
  342. package/lib/umd-es6/store.js +1 -1
  343. package/lib/umd-es6/store.js.gz +0 -0
  344. package/lib/umd-es6/tinybase.js +1 -1
  345. package/lib/umd-es6/tinybase.js.gz +0 -0
  346. package/lib/umd-es6/tools.js +1 -1
  347. package/lib/umd-es6/tools.js.gz +0 -0
  348. package/lib/umd-es6/ui-react-dom-debug.js +1 -1
  349. package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
  350. package/lib/umd-es6/ui-react.js +1 -1
  351. package/lib/umd-es6/ui-react.js.gz +0 -0
  352. package/package.json +37 -26
  353. package/readme.md +2 -2
@@ -74,9 +74,7 @@ const arrayShift = (array) => array.shift();
74
74
  const object = Object;
75
75
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
76
76
  const objEntries = object.entries;
77
- const objIds = object.keys;
78
77
  const objFrozen = object.isFrozen;
79
- const objFreeze = object.freeze;
80
78
  const isObject = (obj) =>
81
79
  !isUndefined(obj) &&
82
80
  ifNotUndefined(
@@ -87,6 +85,8 @@ const isObject = (obj) =>
87
85
  /* istanbul ignore next */
88
86
  () => true,
89
87
  );
88
+ const objIds = object.keys;
89
+ const objFreeze = object.freeze;
90
90
  const objNew = (entries = []) => object.fromEntries(entries);
91
91
  const objHas = (obj, id) => id in obj;
92
92
  const objDel = (obj, id) => {
@@ -97,6 +97,8 @@ const objForEach = (obj, cb) =>
97
97
  arrayForEach(objEntries(obj), ([id, value]) => cb(value, id));
98
98
  const objToArray = (obj, cb) =>
99
99
  arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
100
+ const objMap = (obj, cb) =>
101
+ objNew(objToArray(obj, (value, id) => [id, cb(value, id)]));
100
102
  const objSize = (obj) => size(objIds(obj));
101
103
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
102
104
  const objEnsure = (obj, id, getDefaultValue) => {
@@ -105,6 +107,23 @@ const objEnsure = (obj, id, getDefaultValue) => {
105
107
  }
106
108
  return obj[id];
107
109
  };
110
+ const objValidate = (obj, validateChild, onInvalidObj, emptyIsValid = 0) => {
111
+ if (
112
+ isUndefined(obj) ||
113
+ !isObject(obj) ||
114
+ (!emptyIsValid && objIsEmpty(obj)) ||
115
+ objFrozen(obj)
116
+ ) {
117
+ onInvalidObj?.();
118
+ return false;
119
+ }
120
+ objToArray(obj, (child, id) => {
121
+ if (!validateChild(child, id)) {
122
+ objDel(obj, id);
123
+ }
124
+ });
125
+ return emptyIsValid ? true : !objIsEmpty(obj);
126
+ };
108
127
 
109
128
  const collSizeN = (collSizer) => (coll) =>
110
129
  arrayReduce(collValues(coll), (total, coll2) => total + collSizer(coll2), 0);
@@ -141,24 +160,28 @@ const mapMatch = (map, obj, set, del = mapSet) => {
141
160
  mapForEach(map, (id) => (objHas(obj, id) ? 0 : del(map, id)));
142
161
  return map;
143
162
  };
144
- const mapToObj = (map, mapValue, excludeValue) => {
163
+ const mapToObj = (map, valueMapper, excludeMapValue, excludeObjValue) => {
145
164
  const obj = {};
146
- collForEach(map, (value, id) => {
147
- const mappedValue = mapValue ? mapValue(value, id) : value;
148
- excludeValue?.(mappedValue, value) ? 0 : (obj[id] = mappedValue);
165
+ collForEach(map, (mapValue, id) => {
166
+ if (!excludeMapValue?.(mapValue, id)) {
167
+ const objValue = valueMapper ? valueMapper(mapValue, id) : mapValue;
168
+ excludeObjValue?.(objValue) ? 0 : (obj[id] = objValue);
169
+ }
149
170
  });
150
171
  return obj;
151
172
  };
152
- const mapToObj2 = (map, mapValue, excludeValue) =>
173
+ const mapToObj2 = (map, valueMapper, excludeMapValue) =>
153
174
  mapToObj(
154
175
  map,
155
- (childMap) => mapToObj(childMap, mapValue, excludeValue),
176
+ (childMap) => mapToObj(childMap, valueMapper, excludeMapValue),
177
+ collIsEmpty,
156
178
  objIsEmpty,
157
179
  );
158
- const mapToObj3 = (map, mapValue, excludeValue) =>
180
+ const mapToObj3 = (map, valueMapper, excludeMapValue) =>
159
181
  mapToObj(
160
182
  map,
161
- (childMap) => mapToObj2(childMap, mapValue, excludeValue),
183
+ (childMap) => mapToObj2(childMap, valueMapper, excludeMapValue),
184
+ collIsEmpty,
162
185
  objIsEmpty,
163
186
  );
164
187
  const mapClone = (map, mapValue) => {
@@ -197,6 +220,8 @@ const getCellOrValueType = (cellOrValue) => {
197
220
  ? type
198
221
  : void 0;
199
222
  };
223
+ const isCellOrValueOrNull = (cellOrValue) =>
224
+ cellOrValue === null || !isUndefined(getCellOrValueType(cellOrValue));
200
225
  const setOrDelCell = (store, tableId, rowId, cellId, cell) =>
201
226
  isUndefined(cell)
202
227
  ? store.delCell(tableId, rowId, cellId, true)
@@ -1093,7 +1118,6 @@ const createMetrics = getCreateFunction((store) => {
1093
1118
 
1094
1119
  const scheduleRunning = mapNew();
1095
1120
  const scheduleActions = mapNew();
1096
- const isMergeable = (contentOrChanges) => isString(contentOrChanges?.[0]);
1097
1121
  const getStoreFunctions = (supportsMergeableStore, store) =>
1098
1122
  !supportsMergeableStore || isUndefined(store.getMergeableContent)
1099
1123
  ? [
@@ -1118,16 +1142,15 @@ const createCustomPersister = (
1118
1142
  delPersisterListener,
1119
1143
  onIgnoredError,
1120
1144
  supportsMergeableStore,
1121
- [getThing, thing] = [],
1145
+ extra = {},
1122
1146
  scheduleId = [],
1123
1147
  ) => {
1124
- let listenerId;
1125
1148
  let loadSave = 0;
1126
1149
  let loads = 0;
1127
1150
  let saves = 0;
1128
- let listening = 0;
1129
1151
  let action;
1130
- let listeningHandle;
1152
+ let autoLoadHandle;
1153
+ let autoSaveListenerId;
1131
1154
  mapEnsure(scheduleRunning, scheduleId, () => 0);
1132
1155
  mapEnsure(scheduleActions, scheduleId, () => []);
1133
1156
  const [isMergeableStore, getContent, getChanges, hasChanges] =
@@ -1163,55 +1186,51 @@ const createCustomPersister = (
1163
1186
  }
1164
1187
  return persister;
1165
1188
  };
1189
+ const setContentOrChanges = (contentOrChanges) => {
1190
+ (isMergeableStore && isString(contentOrChanges?.[0])
1191
+ ? contentOrChanges?.[1][2] === 1
1192
+ ? store.applyMergeableChanges
1193
+ : store.setMergeableContent
1194
+ : contentOrChanges?.[2] === 1
1195
+ ? store.applyChanges
1196
+ : store.setContent)(contentOrChanges);
1197
+ };
1166
1198
  const persister = {
1167
1199
  load: async (initialTables, initialValues) =>
1168
1200
  await loadLock(async () => {
1169
1201
  try {
1170
- const content = await getPersisted();
1171
- (isMergeableStore && isMergeable(content)
1172
- ? store.setMergeableContent
1173
- : store.setContent)(content);
1174
- } catch {
1202
+ setContentOrChanges(await getPersisted());
1203
+ } catch (error) {
1204
+ onIgnoredError?.(error);
1175
1205
  store.setContent([initialTables, initialValues]);
1176
1206
  }
1177
1207
  }),
1178
1208
  startAutoLoad: async (initialTables = {}, initialValues = {}) => {
1179
- persister.stopAutoLoad();
1180
- await persister.load(initialTables, initialValues);
1181
- listening = 1;
1182
- listeningHandle = addPersisterListener(
1209
+ await persister.stopAutoLoad().load(initialTables, initialValues);
1210
+ autoLoadHandle = addPersisterListener(
1183
1211
  async (getContent2, getChanges2) => {
1184
- if (getChanges2) {
1185
- const changes = getChanges2();
1186
- await loadLock(async () =>
1187
- (isMergeableStore && isMergeable(changes)
1188
- ? store.applyMergeableChanges
1189
- : store.applyChanges)(changes),
1190
- );
1191
- } else {
1192
- await loadLock(async () => {
1193
- try {
1194
- const content = getContent2?.() ?? (await getPersisted());
1195
- (isMergeableStore && isMergeable(content)
1196
- ? store.setMergeableContent
1197
- : store.setContent)(content);
1198
- } catch (error) {
1199
- onIgnoredError?.(error);
1200
- }
1201
- });
1202
- }
1212
+ const changes = getChanges2?.();
1213
+ await loadLock(async () => {
1214
+ try {
1215
+ setContentOrChanges(
1216
+ changes ?? getContent2?.() ?? (await getPersisted()),
1217
+ );
1218
+ } catch (error) {
1219
+ onIgnoredError?.(error);
1220
+ }
1221
+ });
1203
1222
  },
1204
1223
  );
1205
1224
  return persister;
1206
1225
  },
1207
1226
  stopAutoLoad: () => {
1208
- if (listening) {
1209
- delPersisterListener(listeningHandle);
1210
- listeningHandle = void 0;
1211
- listening = 0;
1227
+ if (autoLoadHandle) {
1228
+ delPersisterListener(autoLoadHandle);
1229
+ autoLoadHandle = void 0;
1212
1230
  }
1213
1231
  return persister;
1214
1232
  },
1233
+ isAutoLoading: () => !isUndefined(autoLoadHandle),
1215
1234
  save: async (getChanges2) => {
1216
1235
  /* istanbul ignore else */
1217
1236
  if (loadSave != 1) {
@@ -1233,7 +1252,7 @@ const createCustomPersister = (
1233
1252
  },
1234
1253
  startAutoSave: async () => {
1235
1254
  await persister.stopAutoSave().save();
1236
- listenerId = store.addDidFinishTransactionListener(() => {
1255
+ autoSaveListenerId = store.addDidFinishTransactionListener(() => {
1237
1256
  const changes = getChanges();
1238
1257
  if (hasChanges(changes)) {
1239
1258
  persister.save(() => changes);
@@ -1242,10 +1261,11 @@ const createCustomPersister = (
1242
1261
  return persister;
1243
1262
  },
1244
1263
  stopAutoSave: () => {
1245
- ifNotUndefined(listenerId, store.delListener);
1246
- listenerId = void 0;
1264
+ ifNotUndefined(autoSaveListenerId, store.delListener);
1265
+ autoSaveListenerId = void 0;
1247
1266
  return persister;
1248
1267
  },
1268
+ isAutoSaving: () => !isUndefined(autoSaveListenerId),
1249
1269
  schedule: async (...actions) => {
1250
1270
  arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
1251
1271
  await run();
@@ -1254,10 +1274,8 @@ const createCustomPersister = (
1254
1274
  getStore: () => store,
1255
1275
  destroy: () => persister.stopAutoLoad().stopAutoSave(),
1256
1276
  getStats: () => ({loads, saves}),
1277
+ ...extra,
1257
1278
  };
1258
- if (getThing) {
1259
- persister[getThing] = () => thing;
1260
- }
1261
1279
  return objFreeze(persister);
1262
1280
  };
1263
1281
 
@@ -1920,25 +1938,29 @@ const getHash = (value) => {
1920
1938
  return hash >>> 0;
1921
1939
  };
1922
1940
 
1923
- const cloneHashStamp = ([time, value, hash]) => [time, value, hash];
1924
- const stampNew = (time, thing) => [time, thing];
1941
+ const stampCloneWithHash = ([time, value, hash]) => [time, value, hash];
1942
+ const stampClone = ([time, value]) => [time, value];
1943
+ const getStampHash = (stamp) => stamp[2];
1925
1944
  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;
1945
+ const stampUpdate = (stamp, hash, time) => {
1946
+ stamp[2] = hash >>> 0;
1947
+ if (time > stamp[0]) {
1948
+ stamp[0] = time;
1930
1949
  }
1931
1950
  };
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));
1951
+ const stampNewObj = (time) => [time, objNew()];
1952
+ const stampNewMap = (time = EMPTY_STRING) => [time, mapNew(), 0];
1953
+ const stampMapToObjWithHash = (
1954
+ [time, map, hash],
1955
+ mapper = stampCloneWithHash,
1956
+ ) => [time, mapToObj(map, mapper), hash];
1957
+ const stampValidate = (stamp, validateThing) =>
1958
+ isArray(stamp) &&
1959
+ size(stamp) == 3 &&
1960
+ isString(stamp[0]) &&
1961
+ validateThing(stamp[1]) &&
1962
+ getTypeOf(stamp[2]) == NUMBER &&
1963
+ isFiniteNumber(stamp[2]);
1942
1964
 
1943
1965
  const pairNew = (value) => [value, value];
1944
1966
  const pairCollSize2 = (pair, func = collSize2) => func(pair[0]) + func(pair[1]);
@@ -1952,18 +1974,6 @@ const jsonString = (obj) =>
1952
1974
  );
1953
1975
  const jsonParse = JSON.parse;
1954
1976
 
1955
- const validate = (obj, validateChild, onInvalidObj) => {
1956
- if (isUndefined(obj) || !isObject(obj) || objIsEmpty(obj) || objFrozen(obj)) {
1957
- onInvalidObj?.();
1958
- return false;
1959
- }
1960
- objToArray(obj, (child, id2) => {
1961
- if (!validateChild(child, id2)) {
1962
- objDel(obj, id2);
1963
- }
1964
- });
1965
- return !objIsEmpty(obj);
1966
- };
1967
1977
  const idsChanged = (changedIds, id2, addedOrRemoved) =>
1968
1978
  mapSet(
1969
1979
  changedIds,
@@ -2023,13 +2033,13 @@ const createStore = () => {
2023
2033
  const [addListener, callListeners, delListenerImpl, callListenerImpl] =
2024
2034
  getListenerFunctions(() => store);
2025
2035
  const validateTablesSchema = (tableSchema) =>
2026
- validate(tableSchema, (tableSchema2) =>
2027
- validate(tableSchema2, validateCellOrValueSchema),
2036
+ objValidate(tableSchema, (tableSchema2) =>
2037
+ objValidate(tableSchema2, validateCellOrValueSchema),
2028
2038
  );
2029
2039
  const validateValuesSchema = (valuesSchema) =>
2030
- validate(valuesSchema, validateCellOrValueSchema);
2040
+ objValidate(valuesSchema, validateCellOrValueSchema);
2031
2041
  const validateCellOrValueSchema = (schema) => {
2032
- if (!validate(schema, (_child, id2) => arrayHas([TYPE, DEFAULT], id2))) {
2042
+ if (!objValidate(schema, (_child, id2) => arrayHas([TYPE, DEFAULT], id2))) {
2033
2043
  return false;
2034
2044
  }
2035
2045
  const type = schema[TYPE];
@@ -2042,18 +2052,18 @@ const createStore = () => {
2042
2052
  return true;
2043
2053
  };
2044
2054
  const validateTables = (tables) =>
2045
- validate(tables, validateTable, cellInvalid);
2055
+ objValidate(tables, validateTable, cellInvalid);
2046
2056
  const validateTable = (table, tableId) =>
2047
2057
  (!hasTablesSchema ||
2048
2058
  collHas(tablesSchemaMap, tableId) ||
2049
2059
  cellInvalid(tableId)) &&
2050
- validate(
2060
+ objValidate(
2051
2061
  table,
2052
2062
  (row, rowId) => validateRow(tableId, rowId, row),
2053
2063
  () => cellInvalid(tableId),
2054
2064
  );
2055
2065
  const validateRow = (tableId, rowId, row, skipDefaults) =>
2056
- validate(
2066
+ objValidate(
2057
2067
  skipDefaults ? row : addDefaultsToRow(row, tableId, rowId),
2058
2068
  (cell, cellId) =>
2059
2069
  ifNotUndefined(
@@ -2080,7 +2090,7 @@ const createStore = () => {
2080
2090
  ? cellInvalid(tableId, rowId, cellId, cell)
2081
2091
  : cell;
2082
2092
  const validateValues = (values, skipDefaults) =>
2083
- validate(
2093
+ objValidate(
2084
2094
  skipDefaults ? values : addDefaultsToValues(values),
2085
2095
  (value, valueId) =>
2086
2096
  ifNotUndefined(
@@ -2923,17 +2933,20 @@ const createStore = () => {
2923
2933
  : mapToObj(
2924
2934
  row,
2925
2935
  ([, newCell]) => newCell,
2926
- (_, changedCell) => pairIsEqual(changedCell),
2936
+ (changedCell) => pairIsEqual(changedCell),
2927
2937
  ),
2938
+ collIsEmpty,
2928
2939
  objIsEmpty,
2929
2940
  ),
2941
+ collIsEmpty,
2930
2942
  objIsEmpty,
2931
2943
  ),
2932
2944
  mapToObj(
2933
2945
  changedValues,
2934
2946
  ([, newValue]) => newValue,
2935
- (_, changedValue) => pairIsEqual(changedValue),
2947
+ (changedValue) => pairIsEqual(changedValue),
2936
2948
  ),
2949
+ 1,
2937
2950
  ];
2938
2951
  const getTransactionLog = () => [
2939
2952
  !collIsEmpty(changedCells),
@@ -3320,10 +3333,13 @@ const getHlcFunctions = (uniqueId) => {
3320
3333
  };
3321
3334
  const seenHlc = (hlc) => {
3322
3335
  const previousLogicalTime = logicalTime;
3323
- const [remoteLogicalTime, remoteCounter] = isUndefined(hlc)
3324
- ? [0, 0]
3325
- : decodeHlc(hlc);
3326
- logicalTime = mathMax(previousLogicalTime, remoteLogicalTime, Date.now());
3336
+ const [remoteLogicalTime, remoteCounter] =
3337
+ isUndefined(hlc) || hlc == '' ? [0, 0] : decodeHlc(hlc);
3338
+ logicalTime = mathMax(
3339
+ previousLogicalTime,
3340
+ remoteLogicalTime,
3341
+ globalThis.HLC_TIME ?? Date.now(),
3342
+ );
3327
3343
  lastCounter =
3328
3344
  logicalTime == previousLogicalTime
3329
3345
  ? logicalTime == remoteLogicalTime
@@ -3354,14 +3370,54 @@ const LISTENER_ARGS = {
3354
3370
  InvalidCell: 3,
3355
3371
  InvalidValue: 1,
3356
3372
  };
3357
- const newContentHsm = (time = EMPTY_STRING) => [
3373
+ const newContentStampMap = (time = EMPTY_STRING) => [
3358
3374
  time,
3359
- [hashStampNewMap(time), hashStampNewMap(time)],
3375
+ [stampNewMap(time), stampNewMap(time)],
3360
3376
  0,
3361
3377
  ];
3378
+ const validateMergeableContent = (mergeableContent) =>
3379
+ stampValidate(
3380
+ mergeableContent,
3381
+ (content) =>
3382
+ isArray(content) &&
3383
+ size(content) == 2 &&
3384
+ stampValidate(content[0], (tableStamps) =>
3385
+ objValidate(
3386
+ tableStamps,
3387
+ (tableStamp) =>
3388
+ stampValidate(tableStamp, (rowStamps) =>
3389
+ objValidate(
3390
+ rowStamps,
3391
+ (rowStamp) =>
3392
+ stampValidate(rowStamp, (cellStamps) =>
3393
+ objValidate(
3394
+ cellStamps,
3395
+ (cellStamp) =>
3396
+ stampValidate(cellStamp, isCellOrValueOrNull),
3397
+ void 0,
3398
+ 1,
3399
+ ),
3400
+ ),
3401
+ void 0,
3402
+ 1,
3403
+ ),
3404
+ ),
3405
+ void 0,
3406
+ 1,
3407
+ ),
3408
+ ) &&
3409
+ stampValidate(content[1], (values) =>
3410
+ objValidate(
3411
+ values,
3412
+ (value) => stampValidate(value, isCellOrValueOrNull),
3413
+ void 0,
3414
+ 1,
3415
+ ),
3416
+ ),
3417
+ );
3362
3418
  const createMergeableStore = (id) => {
3363
3419
  let listening = 1;
3364
- let contentHsm = newContentHsm();
3420
+ let contentStampMap = newContentStampMap();
3365
3421
  let transactionTime;
3366
3422
  let transactionMergeableChanges;
3367
3423
  const [getHlc, seenHlc] = getHlcFunctions(id);
@@ -3371,6 +3427,7 @@ const createMergeableStore = (id) => {
3371
3427
  listening = 0;
3372
3428
  actions();
3373
3429
  listening = wasListening;
3430
+ return mergeableStore;
3374
3431
  };
3375
3432
  const mergeContentOrChanges = (contentOrChanges, hasHashes = 0) => {
3376
3433
  const tablesChanges = {};
@@ -3380,8 +3437,8 @@ const createMergeableStore = (id) => {
3380
3437
  [[tablesTime, tablesObj, incomingTablesHash], values],
3381
3438
  incomingContentOrChangesHash,
3382
3439
  ] = contentOrChanges;
3383
- const [, [tablesHsm, valuesHsm]] = contentHsm;
3384
- const [oldTablesTime, tableHsms, oldTablesHash] = tablesHsm;
3440
+ const [, [tablesStampMap, valuesStampMap]] = contentStampMap;
3441
+ const [oldTablesTime, tableStampMaps, oldTablesHash] = tablesStampMap;
3385
3442
  if (tablesTime) {
3386
3443
  let tablesHash = hasHashes
3387
3444
  ? incomingTablesHash
@@ -3392,8 +3449,8 @@ const createMergeableStore = (id) => {
3392
3449
  objForEach(
3393
3450
  tablesObj,
3394
3451
  ([tableTime, rowsObj, incomingTableHash], tableId) => {
3395
- const tableHsm = mapEnsure(tableHsms, tableId, hashStampNewMap);
3396
- const [oldTableTime, rowHsms, oldTableHash] = tableHsm;
3452
+ const tableStampMap = mapEnsure(tableStampMaps, tableId, stampNewMap);
3453
+ const [oldTableTime, rowStampMaps, oldTableHash] = tableStampMap;
3397
3454
  let tableHash = hasHashes
3398
3455
  ? incomingTableHash
3399
3456
  : oldTableHash ^
@@ -3404,7 +3461,7 @@ const createMergeableStore = (id) => {
3404
3461
  objForEach(rowsObj, (row, rowId) => {
3405
3462
  const [oldRowHash, rowHash] = mergeCellsOrValues(
3406
3463
  row,
3407
- mapEnsure(rowHsms, rowId, hashStampNewMap),
3464
+ mapEnsure(rowStampMaps, rowId, stampNewMap),
3408
3465
  objEnsure(
3409
3466
  objEnsure(tablesChanges, tableId, objNew),
3410
3467
  rowId,
@@ -3417,26 +3474,33 @@ const createMergeableStore = (id) => {
3417
3474
  : (oldRowHash ? hashIdAndHash(rowId, oldRowHash) : 0) ^
3418
3475
  hashIdAndHash(rowId, rowHash);
3419
3476
  });
3420
- updateHashStamp(tableHsm, tableHash, tableTime);
3477
+ stampUpdate(tableStampMap, tableHash, tableTime);
3421
3478
  tablesHash ^= hasHashes
3422
3479
  ? 0
3423
3480
  : (oldTableHash ? hashIdAndHash(tableId, oldTableHash) : 0) ^
3424
- hashIdAndHash(tableId, tableHsm[2]);
3481
+ hashIdAndHash(tableId, tableStampMap[2]);
3425
3482
  },
3426
3483
  );
3427
- updateHashStamp(tablesHsm, tablesHash, tablesTime);
3484
+ stampUpdate(tablesStampMap, tablesHash, tablesTime);
3428
3485
  }
3429
- mergeCellsOrValues(values, valuesHsm, valuesChanges, hasHashes);
3430
- updateHashStamp(
3431
- contentHsm,
3432
- hasHashes ? incomingContentOrChangesHash : tablesHsm[2] ^ valuesHsm[2],
3486
+ mergeCellsOrValues(values, valuesStampMap, valuesChanges, hasHashes);
3487
+ stampUpdate(
3488
+ contentStampMap,
3489
+ hasHashes
3490
+ ? incomingContentOrChangesHash
3491
+ : tablesStampMap[2] ^ valuesStampMap[2],
3433
3492
  contentOrChangesTime,
3434
3493
  );
3435
- return [tablesChanges, valuesChanges];
3494
+ return [tablesChanges, valuesChanges, 1];
3436
3495
  };
3437
- const mergeCellsOrValues = (things, thingsHsm, thingsChanges, hasHashes) => {
3496
+ const mergeCellsOrValues = (
3497
+ things,
3498
+ thingsStampMap,
3499
+ thingsChanges,
3500
+ hasHashes,
3501
+ ) => {
3438
3502
  const [thingsTime, thingsObj, incomingThingsHash] = things;
3439
- const [oldThingsTime, thingHsms, oldThingsHash] = thingsHsm;
3503
+ const [oldThingsTime, thingStampMaps, oldThingsHash] = thingsStampMap;
3440
3504
  if (thingsTime) {
3441
3505
  let thingsHash = hasHashes
3442
3506
  ? incomingThingsHash
@@ -3447,28 +3511,32 @@ const createMergeableStore = (id) => {
3447
3511
  objForEach(
3448
3512
  thingsObj,
3449
3513
  ([thingTime, thing, incomingThingHash], thingId) => {
3450
- const thingHsm = mapEnsure(thingHsms, thingId, hashStampNewThing);
3451
- const [oldThingTime, , oldThingHash] = thingHsm;
3514
+ const thingStampMap = mapEnsure(thingStampMaps, thingId, () => [
3515
+ EMPTY_STRING,
3516
+ void 0,
3517
+ 0,
3518
+ ]);
3519
+ const [oldThingTime, , oldThingHash] = thingStampMap;
3452
3520
  if (thingTime > oldThingTime) {
3453
- updateHashStamp(
3454
- thingHsm,
3521
+ stampUpdate(
3522
+ thingStampMap,
3455
3523
  hasHashes
3456
3524
  ? incomingThingHash
3457
3525
  : getHash(jsonString(thing ?? null) + ':' + thingTime),
3458
3526
  thingTime,
3459
3527
  );
3460
- thingHsm[1] = thing;
3528
+ thingStampMap[1] = thing;
3461
3529
  thingsChanges[thingId] = thing;
3462
3530
  thingsHash ^= hasHashes
3463
3531
  ? 0
3464
3532
  : hashIdAndHash(thingId, oldThingHash) ^
3465
- hashIdAndHash(thingId, thingHsm[2]);
3533
+ hashIdAndHash(thingId, thingStampMap[2]);
3466
3534
  }
3467
3535
  },
3468
3536
  );
3469
- updateHashStamp(thingsHsm, thingsHash, thingsTime);
3537
+ stampUpdate(thingsStampMap, thingsHash, thingsTime);
3470
3538
  }
3471
- return [oldThingsHash, thingsHsm[2]];
3539
+ return [oldThingsHash, thingsStampMap[2]];
3472
3540
  };
3473
3541
  const preFinishTransaction = () => {
3474
3542
  if (listening) {
@@ -3478,26 +3546,118 @@ const createMergeableStore = (id) => {
3478
3546
  };
3479
3547
  const postFinishTransaction = () =>
3480
3548
  (transactionTime = transactionMergeableChanges = void 0);
3481
- const getMergeableContent = () =>
3482
- hashStampMap(contentHsm, ([tables, values]) => [
3483
- hashStampMapToObj(tables, (table) =>
3484
- hashStampMapToObj(table, (row) => hashStampMapToObj(row)),
3549
+ const getId = () => id;
3550
+ const getMergeableContent = () => [
3551
+ contentStampMap[0],
3552
+ [
3553
+ stampMapToObjWithHash(contentStampMap[1][0], (tableStampMap) =>
3554
+ stampMapToObjWithHash(tableStampMap, (rowStampMap) =>
3555
+ stampMapToObjWithHash(rowStampMap),
3556
+ ),
3485
3557
  ),
3486
- hashStampMapToObj(values),
3487
- ]);
3488
- const setMergeableContent = (mergeableContent) => {
3489
- disableListening(() =>
3490
- store.transaction(() => {
3491
- store.delTables().delValues();
3492
- contentHsm = newContentHsm();
3493
- }),
3558
+ stampMapToObjWithHash(contentStampMap[1][1]),
3559
+ ],
3560
+ contentStampMap[2],
3561
+ ];
3562
+ const getMergeableContentHashes = () => [
3563
+ contentStampMap[0],
3564
+ [contentStampMap[1][0][2], contentStampMap[1][1][2]],
3565
+ ];
3566
+ const getMergeableTableHashes = () =>
3567
+ mapToObj(contentStampMap[1][0][1], getStampHash);
3568
+ const getMergeableTableIdsDiff = (relativeTo) => {
3569
+ const tableIds = [];
3570
+ mapForEach(contentStampMap[1][0][1], (tableId, [, , hash]) => {
3571
+ if (hash !== relativeTo?.[tableId]) {
3572
+ arrayPush(tableIds, tableId);
3573
+ }
3574
+ });
3575
+ return tableIds;
3576
+ };
3577
+ const getMergeableRowHashes = (tablesDelta) =>
3578
+ objNew(
3579
+ arrayMap(tablesDelta, (tableId) => [
3580
+ tableId,
3581
+ mapToObj(mapGet(contentStampMap[1][0][1], tableId)?.[1], getStampHash),
3582
+ ]),
3494
3583
  );
3495
- seenHlc(mergeableContent[0]);
3496
- disableListening(() =>
3497
- store.applyChanges(mergeContentOrChanges(mergeableContent, 1)),
3584
+ const getMergeableRowIdsDiff = (relativeTo) =>
3585
+ objMap(relativeTo, (rowHashes, tableId) => {
3586
+ const rowIds = [];
3587
+ mapForEach(
3588
+ mapGet(contentStampMap[1][0][1], tableId)?.[1],
3589
+ (rowId, [, , hash]) => {
3590
+ if (hash !== rowHashes?.[rowId]) {
3591
+ arrayPush(rowIds, rowId);
3592
+ }
3593
+ },
3594
+ );
3595
+ return rowIds;
3596
+ });
3597
+ const getMergeableCellHashes = (tableDelta) =>
3598
+ objMap(tableDelta, (rowIds, tableId) =>
3599
+ objNew(
3600
+ arrayMap(rowIds, (rowId) => [
3601
+ rowId,
3602
+ mapToObj(
3603
+ mapGet(mapGet(contentStampMap[1][0][1], tableId)?.[1], rowId)?.[1],
3604
+ getStampHash,
3605
+ ),
3606
+ ]),
3607
+ ),
3498
3608
  );
3499
- return mergeableStore;
3609
+ const getMergeableTablesChanges = (relativeTo) => {
3610
+ const [, [[tablesTime, tableStampMaps]]] = contentStampMap;
3611
+ const tables = {};
3612
+ objForEach(relativeTo, (rowCellHashes, tableId) =>
3613
+ ifNotUndefined(
3614
+ mapGet(tableStampMaps, tableId),
3615
+ ([tableTime, rowStampMaps]) => {
3616
+ const table = {};
3617
+ objForEach(rowCellHashes, (cellHashes, rowId) =>
3618
+ ifNotUndefined(
3619
+ mapGet(rowStampMaps, rowId),
3620
+ ([rowTime, cellStampMaps]) => {
3621
+ const row = mapToObj(
3622
+ cellStampMaps,
3623
+ stampClone,
3624
+ ([, , hash], cellId) => hash == cellHashes?.[cellId],
3625
+ );
3626
+ if (!objIsEmpty(row)) {
3627
+ table[rowId] = [rowTime, row];
3628
+ }
3629
+ },
3630
+ ),
3631
+ );
3632
+ if (!objIsEmpty(table)) {
3633
+ tables[tableId] = [tableTime, table];
3634
+ }
3635
+ },
3636
+ ),
3637
+ );
3638
+ return [tablesTime, tables];
3500
3639
  };
3640
+ const getMergeableValuesHashes = () =>
3641
+ mapToObj(contentStampMap[1][1][1], getStampHash);
3642
+ const getMergeableValuesChanges = (relativeTo) => [
3643
+ contentStampMap[1][1][0],
3644
+ mapToObj(
3645
+ contentStampMap[1][1][1],
3646
+ stampClone,
3647
+ ([, , hash], valueId) => hash == relativeTo?.[valueId],
3648
+ ),
3649
+ ];
3650
+ const setMergeableContent = (mergeableContent) =>
3651
+ disableListening(() =>
3652
+ validateMergeableContent(mergeableContent)
3653
+ ? store.transaction(() => {
3654
+ store.delTables().delValues();
3655
+ contentStampMap = newContentStampMap();
3656
+ seenHlc(mergeableContent[0]);
3657
+ store.applyChanges(mergeContentOrChanges(mergeableContent, 1));
3658
+ })
3659
+ : 0,
3660
+ );
3501
3661
  const getTransactionMergeableChanges = () => {
3502
3662
  if (isUndefined(transactionMergeableChanges)) {
3503
3663
  const [, , changedCells, , changedValues] = store.getTransactionLog();
@@ -3505,10 +3665,14 @@ const createMergeableStore = (id) => {
3505
3665
  !objIsEmpty(changedCells) || !objIsEmpty(changedValues)
3506
3666
  ? transactionTime ?? (transactionTime = getHlc())
3507
3667
  : EMPTY_STRING;
3508
- const mergeableChanges = stampNew(time, [
3509
- stampNewObj(objIsEmpty(changedCells) ? EMPTY_STRING : time),
3510
- stampNewObj(objIsEmpty(changedValues) ? EMPTY_STRING : time),
3511
- ]);
3668
+ const mergeableChanges = [
3669
+ time,
3670
+ [
3671
+ stampNewObj(objIsEmpty(changedCells) ? EMPTY_STRING : time),
3672
+ stampNewObj(objIsEmpty(changedValues) ? EMPTY_STRING : time),
3673
+ 1,
3674
+ ],
3675
+ ];
3512
3676
  const [[, tablesObj], [, valuesObj]] = mergeableChanges[1];
3513
3677
  objToArray(changedCells, (changedTable, tableId) => {
3514
3678
  const [, rowsObj] = (tablesObj[tableId] = stampNewObj(time));
@@ -3516,60 +3680,45 @@ const createMergeableStore = (id) => {
3516
3680
  const [, cellsObj] = (rowsObj[rowId] = stampNewObj(time));
3517
3681
  objToArray(
3518
3682
  changedRow,
3519
- ([, newCell], cellId) =>
3520
- (cellsObj[cellId] = stampNew(time, newCell)),
3683
+ ([, newCell], cellId) => (cellsObj[cellId] = [time, newCell]),
3521
3684
  );
3522
3685
  });
3523
3686
  });
3524
3687
  objToArray(
3525
3688
  changedValues,
3526
- ([, newValue], valueId) =>
3527
- (valuesObj[valueId] = stampNew(time, newValue)),
3689
+ ([, newValue], valueId) => (valuesObj[valueId] = [time, newValue]),
3528
3690
  );
3529
3691
  return mergeableChanges;
3530
3692
  }
3531
3693
  return transactionMergeableChanges;
3532
3694
  };
3533
- const applyMergeableChanges = (mergeableChanges) => {
3534
- seenHlc(mergeableChanges[0]);
3535
- disableListening(() =>
3536
- store.applyChanges(mergeContentOrChanges(mergeableChanges)),
3537
- );
3538
- return mergeableStore;
3539
- };
3695
+ const applyMergeableChanges = (mergeableChanges) =>
3696
+ disableListening(() => {
3697
+ seenHlc(mergeableChanges[0]);
3698
+ store.applyChanges(mergeContentOrChanges(mergeableChanges));
3699
+ });
3540
3700
  const merge = (mergeableStore2) => {
3541
3701
  const mergeableChanges = getMergeableContent();
3542
3702
  const mergeableChanges2 = mergeableStore2.getMergeableContent();
3543
3703
  mergeableStore2.applyMergeableChanges(mergeableChanges);
3544
3704
  return applyMergeableChanges(mergeableChanges2);
3545
3705
  };
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;
3560
3706
  const mergeableStore = {
3707
+ getId,
3561
3708
  getMergeableContent,
3709
+ getMergeableContentHashes,
3710
+ getMergeableTableHashes,
3711
+ getMergeableTableIdsDiff,
3712
+ getMergeableRowHashes,
3713
+ getMergeableRowIdsDiff,
3714
+ getMergeableCellHashes,
3715
+ getMergeableTablesChanges,
3716
+ getMergeableValuesHashes,
3717
+ getMergeableValuesChanges,
3562
3718
  setMergeableContent,
3563
3719
  getTransactionMergeableChanges,
3564
3720
  applyMergeableChanges,
3565
3721
  merge,
3566
- getContentHash,
3567
- getTablesHash,
3568
- getTableHash,
3569
- getRowHash,
3570
- getCellHash,
3571
- getValuesHash,
3572
- getValueHash,
3573
3722
  };
3574
3723
  store.setInternalListeners(preFinishTransaction, postFinishTransaction);
3575
3724
  objToArray(