tinybase 5.0.0-beta.4 → 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 (418) 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-powersync.cjs +1 -0
  32. package/lib/cjs/persisters/persister-powersync.cjs.gz +0 -0
  33. package/lib/cjs/persisters/persister-remote.cjs +1 -1
  34. package/lib/cjs/persisters/persister-remote.cjs.gz +0 -0
  35. package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -1
  36. package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  37. package/lib/cjs/persisters/persister-sqlite3.cjs +1 -1
  38. package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
  39. package/lib/cjs/persisters/persister-sync.cjs +1 -0
  40. package/lib/cjs/persisters/persister-sync.cjs.gz +0 -0
  41. package/lib/cjs/persisters/persister-yjs.cjs +1 -1
  42. package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
  43. package/lib/cjs/persisters.cjs +1 -1
  44. package/lib/cjs/persisters.cjs.gz +0 -0
  45. package/lib/cjs/queries.cjs +1 -1
  46. package/lib/cjs/queries.cjs.gz +0 -0
  47. package/lib/cjs/relationships.cjs +1 -1
  48. package/lib/cjs/relationships.cjs.gz +0 -0
  49. package/lib/cjs/store.cjs +1 -1
  50. package/lib/cjs/store.cjs.gz +0 -0
  51. package/lib/cjs/tinybase.cjs +1 -1
  52. package/lib/cjs/tinybase.cjs.gz +0 -0
  53. package/lib/cjs/tools.cjs +1 -1
  54. package/lib/cjs/tools.cjs.gz +0 -0
  55. package/lib/cjs/ui-react-dom-debug.cjs +1 -1
  56. package/lib/cjs/ui-react-dom-debug.cjs.gz +0 -0
  57. package/lib/cjs/ui-react.cjs +1 -1
  58. package/lib/cjs/ui-react.cjs.gz +0 -0
  59. package/lib/cjs-es6/checkpoints.cjs +1 -1
  60. package/lib/cjs-es6/checkpoints.cjs.gz +0 -0
  61. package/lib/cjs-es6/indexes.cjs +1 -1
  62. package/lib/cjs-es6/indexes.cjs.gz +0 -0
  63. package/lib/cjs-es6/mergeable-store.cjs +1 -1
  64. package/lib/cjs-es6/mergeable-store.cjs.gz +0 -0
  65. package/lib/cjs-es6/metrics.cjs +1 -1
  66. package/lib/cjs-es6/metrics.cjs.gz +0 -0
  67. package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -1
  68. package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
  69. package/lib/cjs-es6/persisters/persister-browser.cjs +1 -1
  70. package/lib/cjs-es6/persisters/persister-browser.cjs.gz +0 -0
  71. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  72. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  73. package/lib/cjs-es6/persisters/persister-electric-sql.cjs +1 -1
  74. package/lib/cjs-es6/persisters/persister-electric-sql.cjs.gz +0 -0
  75. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs +1 -1
  76. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  77. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -1
  78. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
  79. package/lib/cjs-es6/persisters/persister-file.cjs +1 -1
  80. package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
  81. package/lib/cjs-es6/persisters/persister-indexed-db.cjs +1 -1
  82. package/lib/cjs-es6/persisters/persister-indexed-db.cjs.gz +0 -0
  83. package/lib/cjs-es6/persisters/persister-libsql.cjs +1 -0
  84. package/lib/cjs-es6/persisters/persister-libsql.cjs.gz +0 -0
  85. package/lib/cjs-es6/persisters/persister-partykit-client.cjs +1 -1
  86. package/lib/cjs-es6/persisters/persister-partykit-client.cjs.gz +0 -0
  87. package/lib/cjs-es6/persisters/persister-powersync.cjs +1 -0
  88. package/lib/cjs-es6/persisters/persister-powersync.cjs.gz +0 -0
  89. package/lib/cjs-es6/persisters/persister-remote.cjs +1 -1
  90. package/lib/cjs-es6/persisters/persister-remote.cjs.gz +0 -0
  91. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -1
  92. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  93. package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -1
  94. package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
  95. package/lib/cjs-es6/persisters/persister-sync.cjs +1 -0
  96. package/lib/cjs-es6/persisters/persister-sync.cjs.gz +0 -0
  97. package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -1
  98. package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
  99. package/lib/cjs-es6/persisters.cjs +1 -1
  100. package/lib/cjs-es6/persisters.cjs.gz +0 -0
  101. package/lib/cjs-es6/queries.cjs +1 -1
  102. package/lib/cjs-es6/queries.cjs.gz +0 -0
  103. package/lib/cjs-es6/relationships.cjs +1 -1
  104. package/lib/cjs-es6/relationships.cjs.gz +0 -0
  105. package/lib/cjs-es6/store.cjs +1 -1
  106. package/lib/cjs-es6/store.cjs.gz +0 -0
  107. package/lib/cjs-es6/tinybase.cjs +1 -1
  108. package/lib/cjs-es6/tinybase.cjs.gz +0 -0
  109. package/lib/cjs-es6/tools.cjs +1 -1
  110. package/lib/cjs-es6/tools.cjs.gz +0 -0
  111. package/lib/cjs-es6/ui-react-dom-debug.cjs +1 -1
  112. package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
  113. package/lib/cjs-es6/ui-react.cjs +1 -1
  114. package/lib/cjs-es6/ui-react.cjs.gz +0 -0
  115. package/lib/debug/checkpoints.js +3 -1
  116. package/lib/debug/indexes.js +3 -1
  117. package/lib/debug/mergeable-store.js +403 -179
  118. package/lib/debug/metrics.js +3 -1
  119. package/lib/debug/persisters/persister-automerge.js +42 -47
  120. package/lib/debug/persisters/persister-browser.js +42 -47
  121. package/lib/debug/persisters/persister-cr-sqlite-wasm.js +67 -61
  122. package/lib/debug/persisters/persister-electric-sql.js +67 -61
  123. package/lib/debug/persisters/persister-expo-sqlite-next.js +67 -61
  124. package/lib/debug/persisters/persister-expo-sqlite.js +67 -61
  125. package/lib/debug/persisters/persister-file.js +42 -47
  126. package/lib/debug/persisters/persister-indexed-db.js +42 -47
  127. package/lib/debug/persisters/persister-libsql.js +902 -0
  128. package/lib/debug/persisters/persister-partykit-client.js +42 -47
  129. package/lib/debug/persisters/persister-powersync.js +917 -0
  130. package/lib/debug/persisters/persister-remote.js +42 -47
  131. package/lib/debug/persisters/persister-sqlite-wasm.js +67 -61
  132. package/lib/debug/persisters/persister-sqlite3.js +67 -61
  133. package/lib/debug/persisters/persister-sync.js +594 -0
  134. package/lib/debug/persisters/persister-yjs.js +44 -49
  135. package/lib/debug/persisters.js +41 -46
  136. package/lib/debug/queries.js +7 -4
  137. package/lib/debug/relationships.js +3 -1
  138. package/lib/debug/store.js +51 -36
  139. package/lib/debug/tinybase.js +439 -223
  140. package/lib/debug/tools.js +9 -6
  141. package/lib/debug/ui-react-dom.js +88 -80
  142. package/lib/debug/ui-react.js +1 -1
  143. package/lib/es6/checkpoints.js +1 -1
  144. package/lib/es6/checkpoints.js.gz +0 -0
  145. package/lib/es6/indexes.js +1 -1
  146. package/lib/es6/indexes.js.gz +0 -0
  147. package/lib/es6/mergeable-store.js +1 -1
  148. package/lib/es6/mergeable-store.js.gz +0 -0
  149. package/lib/es6/metrics.js +1 -1
  150. package/lib/es6/metrics.js.gz +0 -0
  151. package/lib/es6/persisters/persister-automerge.js +1 -1
  152. package/lib/es6/persisters/persister-automerge.js.gz +0 -0
  153. package/lib/es6/persisters/persister-browser.js +1 -1
  154. package/lib/es6/persisters/persister-browser.js.gz +0 -0
  155. package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  156. package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  157. package/lib/es6/persisters/persister-electric-sql.js +1 -1
  158. package/lib/es6/persisters/persister-electric-sql.js.gz +0 -0
  159. package/lib/es6/persisters/persister-expo-sqlite-next.js +1 -1
  160. package/lib/es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  161. package/lib/es6/persisters/persister-expo-sqlite.js +1 -1
  162. package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
  163. package/lib/es6/persisters/persister-file.js +1 -1
  164. package/lib/es6/persisters/persister-file.js.gz +0 -0
  165. package/lib/es6/persisters/persister-indexed-db.js +1 -1
  166. package/lib/es6/persisters/persister-indexed-db.js.gz +0 -0
  167. package/lib/es6/persisters/persister-libsql.js +1 -0
  168. package/lib/es6/persisters/persister-libsql.js.gz +0 -0
  169. package/lib/es6/persisters/persister-partykit-client.js +1 -1
  170. package/lib/es6/persisters/persister-partykit-client.js.gz +0 -0
  171. package/lib/es6/persisters/persister-powersync.js +1 -0
  172. package/lib/es6/persisters/persister-powersync.js.gz +0 -0
  173. package/lib/es6/persisters/persister-remote.js +1 -1
  174. package/lib/es6/persisters/persister-remote.js.gz +0 -0
  175. package/lib/es6/persisters/persister-sqlite-wasm.js +1 -1
  176. package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  177. package/lib/es6/persisters/persister-sqlite3.js +1 -1
  178. package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
  179. package/lib/es6/persisters/persister-sync.js +1 -0
  180. package/lib/es6/persisters/persister-sync.js.gz +0 -0
  181. package/lib/es6/persisters/persister-yjs.js +1 -1
  182. package/lib/es6/persisters/persister-yjs.js.gz +0 -0
  183. package/lib/es6/persisters.js +1 -1
  184. package/lib/es6/persisters.js.gz +0 -0
  185. package/lib/es6/queries.js +1 -1
  186. package/lib/es6/queries.js.gz +0 -0
  187. package/lib/es6/relationships.js +1 -1
  188. package/lib/es6/relationships.js.gz +0 -0
  189. package/lib/es6/store.js +1 -1
  190. package/lib/es6/store.js.gz +0 -0
  191. package/lib/es6/tinybase.js +1 -1
  192. package/lib/es6/tinybase.js.gz +0 -0
  193. package/lib/es6/tools.js +1 -1
  194. package/lib/es6/tools.js.gz +0 -0
  195. package/lib/es6/ui-react-dom-debug.js +1 -1
  196. package/lib/es6/ui-react-dom-debug.js.gz +0 -0
  197. package/lib/es6/ui-react.js +1 -1
  198. package/lib/es6/ui-react.js.gz +0 -0
  199. package/lib/indexes.js +1 -1
  200. package/lib/indexes.js.gz +0 -0
  201. package/lib/mergeable-store.js +1 -1
  202. package/lib/mergeable-store.js.gz +0 -0
  203. package/lib/metrics.js +1 -1
  204. package/lib/metrics.js.gz +0 -0
  205. package/lib/persisters/persister-automerge.js +1 -1
  206. package/lib/persisters/persister-automerge.js.gz +0 -0
  207. package/lib/persisters/persister-browser.js +1 -1
  208. package/lib/persisters/persister-browser.js.gz +0 -0
  209. package/lib/persisters/persister-cr-sqlite-wasm.js +1 -1
  210. package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  211. package/lib/persisters/persister-electric-sql.js +1 -1
  212. package/lib/persisters/persister-electric-sql.js.gz +0 -0
  213. package/lib/persisters/persister-expo-sqlite-next.js +1 -1
  214. package/lib/persisters/persister-expo-sqlite-next.js.gz +0 -0
  215. package/lib/persisters/persister-expo-sqlite.js +1 -1
  216. package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
  217. package/lib/persisters/persister-file.js +1 -1
  218. package/lib/persisters/persister-file.js.gz +0 -0
  219. package/lib/persisters/persister-indexed-db.js +1 -1
  220. package/lib/persisters/persister-indexed-db.js.gz +0 -0
  221. package/lib/persisters/persister-libsql.js +1 -0
  222. package/lib/persisters/persister-libsql.js.gz +0 -0
  223. package/lib/persisters/persister-partykit-client.js +1 -1
  224. package/lib/persisters/persister-partykit-client.js.gz +0 -0
  225. package/lib/persisters/persister-powersync.js +1 -0
  226. package/lib/persisters/persister-powersync.js.gz +0 -0
  227. package/lib/persisters/persister-remote.js +1 -1
  228. package/lib/persisters/persister-remote.js.gz +0 -0
  229. package/lib/persisters/persister-sqlite-wasm.js +1 -1
  230. package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
  231. package/lib/persisters/persister-sqlite3.js +1 -1
  232. package/lib/persisters/persister-sqlite3.js.gz +0 -0
  233. package/lib/persisters/persister-sync.js +1 -0
  234. package/lib/persisters/persister-sync.js.gz +0 -0
  235. package/lib/persisters/persister-yjs.js +1 -1
  236. package/lib/persisters/persister-yjs.js.gz +0 -0
  237. package/lib/persisters.js +1 -1
  238. package/lib/persisters.js.gz +0 -0
  239. package/lib/queries.js +1 -1
  240. package/lib/queries.js.gz +0 -0
  241. package/lib/relationships.js +1 -1
  242. package/lib/relationships.js.gz +0 -0
  243. package/lib/store.js +1 -1
  244. package/lib/store.js.gz +0 -0
  245. package/lib/tinybase.js +1 -1
  246. package/lib/tinybase.js.gz +0 -0
  247. package/lib/tools.js +1 -1
  248. package/lib/tools.js.gz +0 -0
  249. package/lib/types/checkpoints.d.ts +2 -2
  250. package/lib/types/indexes.d.ts +2 -2
  251. package/lib/types/mergeable-store.d.ts +143 -20
  252. package/lib/types/metrics.d.ts +2 -2
  253. package/lib/types/persisters/persister-automerge.d.ts +3 -0
  254. package/lib/types/persisters/persister-browser.d.ts +9 -2
  255. package/lib/types/persisters/persister-cr-sqlite-wasm.d.ts +3 -0
  256. package/lib/types/persisters/persister-electric-sql.d.ts +3 -0
  257. package/lib/types/persisters/persister-expo-sqlite-next.d.ts +3 -0
  258. package/lib/types/persisters/persister-expo-sqlite.d.ts +3 -0
  259. package/lib/types/persisters/persister-file.d.ts +5 -1
  260. package/lib/types/persisters/persister-indexed-db.d.ts +3 -0
  261. package/lib/types/persisters/persister-libsql.d.ts +142 -0
  262. package/lib/types/persisters/persister-partykit-client.d.ts +3 -0
  263. package/lib/types/persisters/persister-powersync.d.ts +157 -0
  264. package/lib/types/persisters/persister-remote.d.ts +3 -0
  265. package/lib/types/persisters/persister-sqlite-wasm.d.ts +3 -0
  266. package/lib/types/persisters/persister-sqlite3.d.ts +3 -0
  267. package/lib/types/persisters/persister-sync.d.ts +182 -0
  268. package/lib/types/persisters/persister-yjs.d.ts +5 -2
  269. package/lib/types/persisters.d.ts +61 -3
  270. package/lib/types/queries.d.ts +2 -2
  271. package/lib/types/relationships.d.ts +2 -2
  272. package/lib/types/store.d.ts +36 -3
  273. package/lib/types/tinybase.d.ts +9 -9
  274. package/lib/types/tools.d.ts +2 -2
  275. package/lib/types/ui-react.d.ts +8 -8
  276. package/lib/types/with-schemas/checkpoints.d.ts +2 -2
  277. package/lib/types/with-schemas/indexes.d.ts +2 -2
  278. package/lib/types/with-schemas/mergeable-store.d.ts +415 -40
  279. package/lib/types/with-schemas/metrics.d.ts +2 -2
  280. package/lib/types/with-schemas/persisters/persister-automerge.d.ts +4 -1
  281. package/lib/types/with-schemas/persisters/persister-browser.d.ts +13 -6
  282. package/lib/types/with-schemas/persisters/persister-cr-sqlite-wasm.d.ts +4 -1
  283. package/lib/types/with-schemas/persisters/persister-electric-sql.d.ts +4 -1
  284. package/lib/types/with-schemas/persisters/persister-expo-sqlite-next.d.ts +4 -1
  285. package/lib/types/with-schemas/persisters/persister-expo-sqlite.d.ts +4 -1
  286. package/lib/types/with-schemas/persisters/persister-file.d.ts +7 -3
  287. package/lib/types/with-schemas/persisters/persister-indexed-db.d.ts +4 -1
  288. package/lib/types/with-schemas/persisters/persister-libsql.d.ts +155 -0
  289. package/lib/types/with-schemas/persisters/persister-partykit-client.d.ts +4 -1
  290. package/lib/types/with-schemas/persisters/persister-powersync.d.ts +170 -0
  291. package/lib/types/with-schemas/persisters/persister-remote.d.ts +4 -1
  292. package/lib/types/with-schemas/persisters/persister-sqlite-wasm.d.ts +4 -1
  293. package/lib/types/with-schemas/persisters/persister-sqlite3.d.ts +4 -1
  294. package/lib/types/with-schemas/persisters/persister-sync.d.ts +195 -0
  295. package/lib/types/with-schemas/persisters/persister-yjs.d.ts +6 -3
  296. package/lib/types/with-schemas/persisters.d.ts +80 -7
  297. package/lib/types/with-schemas/queries.d.ts +3 -3
  298. package/lib/types/with-schemas/relationships.d.ts +2 -2
  299. package/lib/types/with-schemas/store.d.ts +136 -89
  300. package/lib/types/with-schemas/tinybase.d.ts +9 -9
  301. package/lib/types/with-schemas/tools.d.ts +2 -2
  302. package/lib/types/with-schemas/ui-react.d.ts +8 -8
  303. package/lib/ui-react.js +1 -1
  304. package/lib/ui-react.js.gz +0 -0
  305. package/lib/umd/checkpoints.js +1 -1
  306. package/lib/umd/checkpoints.js.gz +0 -0
  307. package/lib/umd/indexes.js +1 -1
  308. package/lib/umd/indexes.js.gz +0 -0
  309. package/lib/umd/mergeable-store.js +1 -1
  310. package/lib/umd/mergeable-store.js.gz +0 -0
  311. package/lib/umd/metrics.js +1 -1
  312. package/lib/umd/metrics.js.gz +0 -0
  313. package/lib/umd/persisters/persister-automerge.js +1 -1
  314. package/lib/umd/persisters/persister-automerge.js.gz +0 -0
  315. package/lib/umd/persisters/persister-browser.js +1 -1
  316. package/lib/umd/persisters/persister-browser.js.gz +0 -0
  317. package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
  318. package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  319. package/lib/umd/persisters/persister-electric-sql.js +1 -1
  320. package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
  321. package/lib/umd/persisters/persister-expo-sqlite-next.js +1 -1
  322. package/lib/umd/persisters/persister-expo-sqlite-next.js.gz +0 -0
  323. package/lib/umd/persisters/persister-expo-sqlite.js +1 -1
  324. package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
  325. package/lib/umd/persisters/persister-file.js +1 -1
  326. package/lib/umd/persisters/persister-file.js.gz +0 -0
  327. package/lib/umd/persisters/persister-indexed-db.js +1 -1
  328. package/lib/umd/persisters/persister-indexed-db.js.gz +0 -0
  329. package/lib/umd/persisters/persister-libsql.js +1 -0
  330. package/lib/umd/persisters/persister-libsql.js.gz +0 -0
  331. package/lib/umd/persisters/persister-partykit-client.js +1 -1
  332. package/lib/umd/persisters/persister-partykit-client.js.gz +0 -0
  333. package/lib/umd/persisters/persister-powersync.js +1 -0
  334. package/lib/umd/persisters/persister-powersync.js.gz +0 -0
  335. package/lib/umd/persisters/persister-remote.js +1 -1
  336. package/lib/umd/persisters/persister-remote.js.gz +0 -0
  337. package/lib/umd/persisters/persister-sqlite-wasm.js +1 -1
  338. package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
  339. package/lib/umd/persisters/persister-sqlite3.js +1 -1
  340. package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
  341. package/lib/umd/persisters/persister-sync.js +1 -0
  342. package/lib/umd/persisters/persister-sync.js.gz +0 -0
  343. package/lib/umd/persisters/persister-yjs.js +1 -1
  344. package/lib/umd/persisters/persister-yjs.js.gz +0 -0
  345. package/lib/umd/persisters.js +1 -1
  346. package/lib/umd/persisters.js.gz +0 -0
  347. package/lib/umd/queries.js +1 -1
  348. package/lib/umd/queries.js.gz +0 -0
  349. package/lib/umd/relationships.js +1 -1
  350. package/lib/umd/relationships.js.gz +0 -0
  351. package/lib/umd/store.js +1 -1
  352. package/lib/umd/store.js.gz +0 -0
  353. package/lib/umd/tinybase.js +1 -1
  354. package/lib/umd/tinybase.js.gz +0 -0
  355. package/lib/umd/tools.js +1 -1
  356. package/lib/umd/tools.js.gz +0 -0
  357. package/lib/umd/ui-react-dom-debug.js +1 -1
  358. package/lib/umd/ui-react-dom-debug.js.gz +0 -0
  359. package/lib/umd/ui-react.js +1 -1
  360. package/lib/umd/ui-react.js.gz +0 -0
  361. package/lib/umd-es6/checkpoints.js +1 -1
  362. package/lib/umd-es6/checkpoints.js.gz +0 -0
  363. package/lib/umd-es6/indexes.js +1 -1
  364. package/lib/umd-es6/indexes.js.gz +0 -0
  365. package/lib/umd-es6/mergeable-store.js +1 -1
  366. package/lib/umd-es6/mergeable-store.js.gz +0 -0
  367. package/lib/umd-es6/metrics.js +1 -1
  368. package/lib/umd-es6/metrics.js.gz +0 -0
  369. package/lib/umd-es6/persisters/persister-automerge.js +1 -1
  370. package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
  371. package/lib/umd-es6/persisters/persister-browser.js +1 -1
  372. package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
  373. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  374. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  375. package/lib/umd-es6/persisters/persister-electric-sql.js +1 -1
  376. package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
  377. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js +1 -1
  378. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  379. package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -1
  380. package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
  381. package/lib/umd-es6/persisters/persister-file.js +1 -1
  382. package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
  383. package/lib/umd-es6/persisters/persister-indexed-db.js +1 -1
  384. package/lib/umd-es6/persisters/persister-indexed-db.js.gz +0 -0
  385. package/lib/umd-es6/persisters/persister-libsql.js +1 -0
  386. package/lib/umd-es6/persisters/persister-libsql.js.gz +0 -0
  387. package/lib/umd-es6/persisters/persister-partykit-client.js +1 -1
  388. package/lib/umd-es6/persisters/persister-partykit-client.js.gz +0 -0
  389. package/lib/umd-es6/persisters/persister-powersync.js +1 -0
  390. package/lib/umd-es6/persisters/persister-powersync.js.gz +0 -0
  391. package/lib/umd-es6/persisters/persister-remote.js +1 -1
  392. package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
  393. package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -1
  394. package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  395. package/lib/umd-es6/persisters/persister-sqlite3.js +1 -1
  396. package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
  397. package/lib/umd-es6/persisters/persister-sync.js +1 -0
  398. package/lib/umd-es6/persisters/persister-sync.js.gz +0 -0
  399. package/lib/umd-es6/persisters/persister-yjs.js +1 -1
  400. package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
  401. package/lib/umd-es6/persisters.js +1 -1
  402. package/lib/umd-es6/persisters.js.gz +0 -0
  403. package/lib/umd-es6/queries.js +1 -1
  404. package/lib/umd-es6/queries.js.gz +0 -0
  405. package/lib/umd-es6/relationships.js +1 -1
  406. package/lib/umd-es6/relationships.js.gz +0 -0
  407. package/lib/umd-es6/store.js +1 -1
  408. package/lib/umd-es6/store.js.gz +0 -0
  409. package/lib/umd-es6/tinybase.js +1 -1
  410. package/lib/umd-es6/tinybase.js.gz +0 -0
  411. package/lib/umd-es6/tools.js +1 -1
  412. package/lib/umd-es6/tools.js.gz +0 -0
  413. package/lib/umd-es6/ui-react-dom-debug.js +1 -1
  414. package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
  415. package/lib/umd-es6/ui-react.js +1 -1
  416. package/lib/umd-es6/ui-react.js.gz +0 -0
  417. package/package.json +51 -35
  418. package/readme.md +2 -2
@@ -24,8 +24,7 @@ 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
 
30
29
  const mathMax = Math.max;
31
30
  const isFiniteNumber = isFinite;
@@ -34,6 +33,7 @@ const isUndefined = (thing) => thing == void 0;
34
33
  const ifNotUndefined = (value, then, otherwise) =>
35
34
  isUndefined(value) ? otherwise?.() : then(value);
36
35
  const isTypeStringOrBoolean = (type) => type == STRING || type == BOOLEAN;
36
+ const isString = (thing) => getTypeOf(thing) == STRING;
37
37
  const isFunction = (thing) => getTypeOf(thing) == FUNCTION;
38
38
  const isArray = (thing) => Array.isArray(thing);
39
39
  const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
@@ -55,9 +55,7 @@ const arrayShift = (array) => array.shift();
55
55
  const object = Object;
56
56
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
57
57
  const objEntries = object.entries;
58
- const objIds = object.keys;
59
58
  const objFrozen = object.isFrozen;
60
- const objFreeze = object.freeze;
61
59
  const isObject = (obj) =>
62
60
  !isUndefined(obj) &&
63
61
  ifNotUndefined(
@@ -68,6 +66,8 @@ const isObject = (obj) =>
68
66
  /* istanbul ignore next */
69
67
  () => true,
70
68
  );
69
+ const objIds = object.keys;
70
+ const objFreeze = object.freeze;
71
71
  const objNew = (entries = []) => object.fromEntries(entries);
72
72
  const objHas = (obj, id) => id in obj;
73
73
  const objDel = (obj, id) => {
@@ -78,8 +78,33 @@ const objForEach = (obj, cb) =>
78
78
  arrayForEach(objEntries(obj), ([id, value]) => cb(value, id));
79
79
  const objToArray = (obj, cb) =>
80
80
  arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
81
+ const objMap = (obj, cb) =>
82
+ objNew(objToArray(obj, (value, id) => [id, cb(value, id)]));
81
83
  const objSize = (obj) => size(objIds(obj));
82
84
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
85
+ const objEnsure = (obj, id, getDefaultValue) => {
86
+ if (!objHas(obj, id)) {
87
+ obj[id] = getDefaultValue();
88
+ }
89
+ return obj[id];
90
+ };
91
+ const objValidate = (obj, validateChild, onInvalidObj, emptyIsValid = 0) => {
92
+ if (
93
+ isUndefined(obj) ||
94
+ !isObject(obj) ||
95
+ (!emptyIsValid && objIsEmpty(obj)) ||
96
+ objFrozen(obj)
97
+ ) {
98
+ onInvalidObj?.();
99
+ return false;
100
+ }
101
+ objToArray(obj, (child, id) => {
102
+ if (!validateChild(child, id)) {
103
+ objDel(obj, id);
104
+ }
105
+ });
106
+ return emptyIsValid ? true : !objIsEmpty(obj);
107
+ };
83
108
 
84
109
  const collSizeN = (collSizer) => (coll) =>
85
110
  arrayReduce(collValues(coll), (total, coll2) => total + collSizer(coll2), 0);
@@ -103,9 +128,11 @@ const mapMap = (coll, cb) =>
103
128
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
104
129
  const mapSet = (map, key, value) =>
105
130
  isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
106
- const mapEnsure = (map, key, getDefaultValue) => {
131
+ const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
107
132
  if (!collHas(map, key)) {
108
133
  mapSet(map, key, getDefaultValue());
134
+ } else {
135
+ hadExistingValue?.(mapGet(map, key));
109
136
  }
110
137
  return mapGet(map, key);
111
138
  };
@@ -114,24 +141,28 @@ const mapMatch = (map, obj, set, del = mapSet) => {
114
141
  mapForEach(map, (id) => (objHas(obj, id) ? 0 : del(map, id)));
115
142
  return map;
116
143
  };
117
- const mapToObj = (map, mapValue, excludeValue) => {
144
+ const mapToObj = (map, valueMapper, excludeMapValue, excludeObjValue) => {
118
145
  const obj = {};
119
- collForEach(map, (value, id) => {
120
- const mappedValue = mapValue ? mapValue(value, id) : value;
121
- excludeValue?.(mappedValue, value) ? 0 : (obj[id] = mappedValue);
146
+ collForEach(map, (mapValue, id) => {
147
+ if (!excludeMapValue?.(mapValue, id)) {
148
+ const objValue = valueMapper ? valueMapper(mapValue, id) : mapValue;
149
+ excludeObjValue?.(objValue) ? 0 : (obj[id] = objValue);
150
+ }
122
151
  });
123
152
  return obj;
124
153
  };
125
- const mapToObj2 = (map, mapValue, excludeValue) =>
154
+ const mapToObj2 = (map, valueMapper, excludeMapValue) =>
126
155
  mapToObj(
127
156
  map,
128
- (childMap) => mapToObj(childMap, mapValue, excludeValue),
157
+ (childMap) => mapToObj(childMap, valueMapper, excludeMapValue),
158
+ collIsEmpty,
129
159
  objIsEmpty,
130
160
  );
131
- const mapToObj3 = (map, mapValue, excludeValue) =>
161
+ const mapToObj3 = (map, valueMapper, excludeMapValue) =>
132
162
  mapToObj(
133
163
  map,
134
- (childMap) => mapToObj2(childMap, mapValue, excludeValue),
164
+ (childMap) => mapToObj2(childMap, valueMapper, excludeMapValue),
165
+ collIsEmpty,
135
166
  objIsEmpty,
136
167
  );
137
168
  const mapClone = (map, mapValue) => {
@@ -163,36 +194,40 @@ const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
163
194
  },
164
195
  );
165
196
 
166
- const stampNew = (time = EMPTY_STRING, thing) => [time, thing];
167
- const stampNewMap = (time = EMPTY_STRING) => stampNew(time, mapNew());
168
- const stampNewObj = (time) => stampNew(time, objNew());
169
- const mapStamp = ([time, value], mapper) => [time, mapper(value, time)];
170
- const cloneStamp = ([time, value]) => [time, value];
171
- const mapStampMapToObj = (stampedMap, mapper) =>
172
- mapStamp(stampedMap, (map) => mapToObj(map, mapper));
173
- const mergeStamps = (newThingStamps, thingStamps, changes, merge) =>
174
- objForEach(newThingStamps, (newThingStamp, thingId) =>
175
- mergeStamp(
176
- newThingStamp,
177
- mapEnsure(thingStamps, thingId, stampNewMap),
178
- (changes[thingId] = objNew()),
179
- merge,
180
- ),
181
- );
182
- const mergeStamp = ([newTime, newThing], thingStamp, changes, merge) => {
183
- if (newTime > thingStamp[0]) {
184
- thingStamp[0] = newTime;
197
+ const textEncoder = new globalThis.TextEncoder();
198
+ const getHash = (value) => {
199
+ let hash = 2166136261;
200
+ arrayForEach(textEncoder.encode(value), (char) => {
201
+ hash ^= char;
202
+ hash +=
203
+ (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);
204
+ });
205
+ return hash >>> 0;
206
+ };
207
+
208
+ const stampCloneWithHash = ([time, value, hash]) => [time, value, hash];
209
+ const stampClone = ([time, value]) => [time, value];
210
+ const getStampHash = (stamp) => stamp[2];
211
+ const hashIdAndHash = (id, hash) => getHash(id + ':' + hash);
212
+ const stampUpdate = (stamp, hash, time) => {
213
+ stamp[2] = hash >>> 0;
214
+ if (time > stamp[0]) {
215
+ stamp[0] = time;
185
216
  }
186
- merge(newThing, thingStamp[1], changes);
187
217
  };
188
- const mergeLeafStamps = (newLeafStamps, leafStamps, changes) =>
189
- objForEach(newLeafStamps, ([newTime, newLeaf], leafId) => {
190
- const leafStamp = mapEnsure(leafStamps, leafId, stampNew);
191
- if (newTime > leafStamp[0]) {
192
- leafStamp[0] = newTime;
193
- leafStamp[1] = changes[leafId] = newLeaf;
194
- }
195
- });
218
+ const stampNewObj = (time) => [time, objNew()];
219
+ const stampNewMap = (time = EMPTY_STRING) => [time, mapNew(), 0];
220
+ const stampMapToObjWithHash = (
221
+ [time, map, hash],
222
+ mapper = stampCloneWithHash,
223
+ ) => [time, mapToObj(map, mapper), hash];
224
+ const stampValidate = (stamp, validateThing) =>
225
+ isArray(stamp) &&
226
+ size(stamp) == 3 &&
227
+ isString(stamp[0]) &&
228
+ validateThing(stamp[1]) &&
229
+ getTypeOf(stamp[2]) == NUMBER &&
230
+ isFiniteNumber(stamp[2]);
196
231
 
197
232
  const setNew = (entryOrEntries) =>
198
233
  new Set(
@@ -292,12 +327,15 @@ const pairNewMap = () => [mapNew(), mapNew()];
292
327
  const pairClone = (array) => [...array];
293
328
  const pairIsEqual = ([entry1, entry2]) => entry1 === entry2;
294
329
 
295
- const getCellOrValueType = (cell) => {
296
- const type = getTypeOf(cell);
297
- return isTypeStringOrBoolean(type) || (type == NUMBER && isFiniteNumber(cell))
330
+ const getCellOrValueType = (cellOrValue) => {
331
+ const type = getTypeOf(cellOrValue);
332
+ return isTypeStringOrBoolean(type) ||
333
+ (type == NUMBER && isFiniteNumber(cellOrValue))
298
334
  ? type
299
335
  : void 0;
300
336
  };
337
+ const isCellOrValueOrNull = (cellOrValue) =>
338
+ cellOrValue === null || !isUndefined(getCellOrValueType(cellOrValue));
301
339
  const setOrDelCell = (store, tableId, rowId, cellId, cell) =>
302
340
  isUndefined(cell)
303
341
  ? store.delCell(tableId, rowId, cellId, true)
@@ -314,18 +352,6 @@ const jsonParse = JSON.parse;
314
352
  const defaultSorter = (sortKey1, sortKey2) =>
315
353
  (sortKey1 ?? 0) < (sortKey2 ?? 0) ? -1 : 1;
316
354
 
317
- const validate = (obj, validateChild, onInvalidObj) => {
318
- if (isUndefined(obj) || !isObject(obj) || objIsEmpty(obj) || objFrozen(obj)) {
319
- onInvalidObj?.();
320
- return false;
321
- }
322
- objToArray(obj, (child, id2) => {
323
- if (!validateChild(child, id2)) {
324
- objDel(obj, id2);
325
- }
326
- });
327
- return !objIsEmpty(obj);
328
- };
329
355
  const idsChanged = (changedIds, id2, addedOrRemoved) =>
330
356
  mapSet(
331
357
  changedIds,
@@ -385,13 +411,13 @@ const createStore = () => {
385
411
  const [addListener, callListeners, delListenerImpl, callListenerImpl] =
386
412
  getListenerFunctions(() => store);
387
413
  const validateTablesSchema = (tableSchema) =>
388
- validate(tableSchema, (tableSchema2) =>
389
- validate(tableSchema2, validateCellOrValueSchema),
414
+ objValidate(tableSchema, (tableSchema2) =>
415
+ objValidate(tableSchema2, validateCellOrValueSchema),
390
416
  );
391
417
  const validateValuesSchema = (valuesSchema) =>
392
- validate(valuesSchema, validateCellOrValueSchema);
418
+ objValidate(valuesSchema, validateCellOrValueSchema);
393
419
  const validateCellOrValueSchema = (schema) => {
394
- if (!validate(schema, (_child, id2) => arrayHas([TYPE, DEFAULT], id2))) {
420
+ if (!objValidate(schema, (_child, id2) => arrayHas([TYPE, DEFAULT], id2))) {
395
421
  return false;
396
422
  }
397
423
  const type = schema[TYPE];
@@ -404,18 +430,18 @@ const createStore = () => {
404
430
  return true;
405
431
  };
406
432
  const validateTables = (tables) =>
407
- validate(tables, validateTable, cellInvalid);
433
+ objValidate(tables, validateTable, cellInvalid);
408
434
  const validateTable = (table, tableId) =>
409
435
  (!hasTablesSchema ||
410
436
  collHas(tablesSchemaMap, tableId) ||
411
437
  cellInvalid(tableId)) &&
412
- validate(
438
+ objValidate(
413
439
  table,
414
440
  (row, rowId) => validateRow(tableId, rowId, row),
415
441
  () => cellInvalid(tableId),
416
442
  );
417
443
  const validateRow = (tableId, rowId, row, skipDefaults) =>
418
- validate(
444
+ objValidate(
419
445
  skipDefaults ? row : addDefaultsToRow(row, tableId, rowId),
420
446
  (cell, cellId) =>
421
447
  ifNotUndefined(
@@ -442,7 +468,7 @@ const createStore = () => {
442
468
  ? cellInvalid(tableId, rowId, cellId, cell)
443
469
  : cell;
444
470
  const validateValues = (values, skipDefaults) =>
445
- validate(
471
+ objValidate(
446
472
  skipDefaults ? values : addDefaultsToValues(values),
447
473
  (value, valueId) =>
448
474
  ifNotUndefined(
@@ -1285,17 +1311,20 @@ const createStore = () => {
1285
1311
  : mapToObj(
1286
1312
  row,
1287
1313
  ([, newCell]) => newCell,
1288
- (_, changedCell) => pairIsEqual(changedCell),
1314
+ (changedCell) => pairIsEqual(changedCell),
1289
1315
  ),
1316
+ collIsEmpty,
1290
1317
  objIsEmpty,
1291
1318
  ),
1319
+ collIsEmpty,
1292
1320
  objIsEmpty,
1293
1321
  ),
1294
1322
  mapToObj(
1295
1323
  changedValues,
1296
1324
  ([, newValue]) => newValue,
1297
- (_, changedValue) => pairIsEqual(changedValue),
1325
+ (changedValue) => pairIsEqual(changedValue),
1298
1326
  ),
1327
+ 1,
1299
1328
  ];
1300
1329
  const getTransactionLog = () => [
1301
1330
  !collIsEmpty(changedCells),
@@ -1637,12 +1666,6 @@ const SHIFT12 = 2 ** 12;
1637
1666
  const SHIFT6 = 2 ** 6;
1638
1667
  const toB64 = (num) => String.fromCharCode(48 + (num & MASK6));
1639
1668
  const fromB64 = (str, pos) => strCharCodeAt(str, pos) - 48;
1640
- const hash = (value) =>
1641
- arrayReduce(
1642
- strSplit(value),
1643
- (hash2, char) => ((hash2 << 5) + hash2) ^ strCharCodeAt(char),
1644
- 5381,
1645
- ) >>> 0;
1646
1669
  const encodeHlc = (logicalTime42, counter24, clientHash30) =>
1647
1670
  toB64(logicalTime42 / SHIFT36) +
1648
1671
  toB64(logicalTime42 / SHIFT30) +
@@ -1681,17 +1704,20 @@ const decodeHlc = (hlc16) => [
1681
1704
  const getHlcFunctions = (uniqueId) => {
1682
1705
  let logicalTime = 0;
1683
1706
  let lastCounter = -1;
1684
- const uniqueIdHash = hash(uniqueId);
1707
+ const uniqueIdHash = getHash(uniqueId);
1685
1708
  const getHlc = () => {
1686
1709
  seenHlc();
1687
1710
  return encodeHlc(logicalTime, ++lastCounter, uniqueIdHash);
1688
1711
  };
1689
1712
  const seenHlc = (hlc) => {
1690
1713
  const previousLogicalTime = logicalTime;
1691
- const [remoteLogicalTime, remoteCounter] = isUndefined(hlc)
1692
- ? [0, 0]
1693
- : decodeHlc(hlc);
1694
- logicalTime = mathMax(previousLogicalTime, remoteLogicalTime, Date.now());
1714
+ const [remoteLogicalTime, remoteCounter] =
1715
+ isUndefined(hlc) || hlc == '' ? [0, 0] : decodeHlc(hlc);
1716
+ logicalTime = mathMax(
1717
+ previousLogicalTime,
1718
+ remoteLogicalTime,
1719
+ globalThis.HLC_TIME ?? Date.now(),
1720
+ );
1695
1721
  lastCounter =
1696
1722
  logicalTime == previousLogicalTime
1697
1723
  ? logicalTime == remoteLogicalTime
@@ -1722,15 +1748,56 @@ const LISTENER_ARGS = {
1722
1748
  InvalidCell: 3,
1723
1749
  InvalidValue: 1,
1724
1750
  };
1725
- const newContentStamp = (time = EMPTY_STRING) => [
1751
+ const newContentStampMap = (time = EMPTY_STRING) => [
1726
1752
  time,
1727
1753
  [stampNewMap(time), stampNewMap(time)],
1754
+ 0,
1728
1755
  ];
1756
+ const validateMergeableContent = (mergeableContent) =>
1757
+ stampValidate(
1758
+ mergeableContent,
1759
+ (content) =>
1760
+ isArray(content) &&
1761
+ size(content) == 2 &&
1762
+ stampValidate(content[0], (tableStamps) =>
1763
+ objValidate(
1764
+ tableStamps,
1765
+ (tableStamp) =>
1766
+ stampValidate(tableStamp, (rowStamps) =>
1767
+ objValidate(
1768
+ rowStamps,
1769
+ (rowStamp) =>
1770
+ stampValidate(rowStamp, (cellStamps) =>
1771
+ objValidate(
1772
+ cellStamps,
1773
+ (cellStamp) =>
1774
+ stampValidate(cellStamp, isCellOrValueOrNull),
1775
+ void 0,
1776
+ 1,
1777
+ ),
1778
+ ),
1779
+ void 0,
1780
+ 1,
1781
+ ),
1782
+ ),
1783
+ void 0,
1784
+ 1,
1785
+ ),
1786
+ ) &&
1787
+ stampValidate(content[1], (values) =>
1788
+ objValidate(
1789
+ values,
1790
+ (value) => stampValidate(value, isCellOrValueOrNull),
1791
+ void 0,
1792
+ 1,
1793
+ ),
1794
+ ),
1795
+ );
1729
1796
  const createMergeableStore = (id) => {
1730
1797
  let listening = 1;
1731
- let contentStamp = newContentStamp();
1798
+ let contentStampMap = newContentStampMap();
1732
1799
  let transactionTime;
1733
- let finishTransactionMergeableChanges;
1800
+ let transactionMergeableChanges;
1734
1801
  const [getHlc, seenHlc] = getHlcFunctions(id);
1735
1802
  const store = createStore();
1736
1803
  const disableListening = (actions) => {
@@ -1738,137 +1805,294 @@ const createMergeableStore = (id) => {
1738
1805
  listening = 0;
1739
1806
  actions();
1740
1807
  listening = wasListening;
1808
+ return mergeableStore;
1741
1809
  };
1742
- const preFinishTransaction = () => {
1743
- if (listening) {
1744
- finishTransactionMergeableChanges = getTransactionMergeableChanges();
1745
- const [time, [changedTablesStamp, changedValuesStamp]] =
1746
- finishTransactionMergeableChanges;
1747
- const cellsTouched = !objIsEmpty(changedTablesStamp[1]);
1748
- const valuesTouched = !objIsEmpty(changedValuesStamp[1]);
1749
- const [, [tablesStamp, valuesStamp]] = contentStamp;
1750
- if (cellsTouched || valuesTouched) {
1751
- contentStamp[0] = time;
1752
- }
1753
- if (cellsTouched) {
1754
- tablesStamp[0] = time;
1755
- objToArray(changedTablesStamp[1], ([, changedRowStamps], tableId) => {
1756
- const tableStamp = mapEnsure(tablesStamp[1], tableId, stampNewMap);
1757
- tableStamp[0] = time;
1758
- objToArray(changedRowStamps, ([, changedCellStamps], rowId) => {
1759
- const rowStamp = mapEnsure(tableStamp[1], rowId, stampNewMap);
1760
- rowStamp[0] = time;
1761
- objToArray(changedCellStamps, ([, newCell], cellId) =>
1762
- mapSet(rowStamp[1], cellId, stampNew(time, newCell)),
1810
+ const mergeContentOrChanges = (contentOrChanges, hasHashes = 0) => {
1811
+ const tablesChanges = {};
1812
+ const valuesChanges = {};
1813
+ const [
1814
+ contentOrChangesTime,
1815
+ [[tablesTime, tablesObj, incomingTablesHash], values],
1816
+ incomingContentOrChangesHash,
1817
+ ] = contentOrChanges;
1818
+ const [, [tablesStampMap, valuesStampMap]] = contentStampMap;
1819
+ const [oldTablesTime, tableStampMaps, oldTablesHash] = tablesStampMap;
1820
+ if (tablesTime) {
1821
+ let tablesHash = hasHashes
1822
+ ? incomingTablesHash
1823
+ : oldTablesHash ^
1824
+ (tablesTime > oldTablesTime
1825
+ ? (oldTablesTime ? getHash(oldTablesTime) : 0) ^ getHash(tablesTime)
1826
+ : 0);
1827
+ objForEach(
1828
+ tablesObj,
1829
+ ([tableTime, rowsObj, incomingTableHash], tableId) => {
1830
+ const tableStampMap = mapEnsure(tableStampMaps, tableId, stampNewMap);
1831
+ const [oldTableTime, rowStampMaps, oldTableHash] = tableStampMap;
1832
+ let tableHash = hasHashes
1833
+ ? incomingTableHash
1834
+ : oldTableHash ^
1835
+ (tableTime > oldTableTime
1836
+ ? (oldTableTime ? getHash(oldTableTime) : 0) ^
1837
+ getHash(tableTime)
1838
+ : 0);
1839
+ objForEach(rowsObj, (row, rowId) => {
1840
+ const [oldRowHash, rowHash] = mergeCellsOrValues(
1841
+ row,
1842
+ mapEnsure(rowStampMaps, rowId, stampNewMap),
1843
+ objEnsure(
1844
+ objEnsure(tablesChanges, tableId, objNew),
1845
+ rowId,
1846
+ objNew,
1847
+ ),
1848
+ hasHashes,
1763
1849
  );
1850
+ tableHash ^= hasHashes
1851
+ ? 0
1852
+ : (oldRowHash ? hashIdAndHash(rowId, oldRowHash) : 0) ^
1853
+ hashIdAndHash(rowId, rowHash);
1764
1854
  });
1765
- });
1766
- }
1767
- if (valuesTouched) {
1768
- valuesStamp[0] = time;
1769
- objToArray(changedValuesStamp[1], ([, newValue], valueId) =>
1770
- mapSet(valuesStamp[1], valueId, stampNew(time, newValue)),
1771
- );
1772
- }
1855
+ stampUpdate(tableStampMap, tableHash, tableTime);
1856
+ tablesHash ^= hasHashes
1857
+ ? 0
1858
+ : (oldTableHash ? hashIdAndHash(tableId, oldTableHash) : 0) ^
1859
+ hashIdAndHash(tableId, tableStampMap[2]);
1860
+ },
1861
+ );
1862
+ stampUpdate(tablesStampMap, tablesHash, tablesTime);
1773
1863
  }
1864
+ mergeCellsOrValues(values, valuesStampMap, valuesChanges, hasHashes);
1865
+ stampUpdate(
1866
+ contentStampMap,
1867
+ hasHashes
1868
+ ? incomingContentOrChangesHash
1869
+ : tablesStampMap[2] ^ valuesStampMap[2],
1870
+ contentOrChangesTime,
1871
+ );
1872
+ return [tablesChanges, valuesChanges, 1];
1774
1873
  };
1775
- const postFinishTransaction = () =>
1776
- (transactionTime = finishTransactionMergeableChanges = void 0);
1777
- const merge = (mergeableStore2) => {
1778
- const mergeableContent = mergeableStore.getMergeableContent();
1779
- const mergeableContent2 = mergeableStore2.getMergeableContent();
1780
- mergeableStore2.applyMergeableChanges(mergeableContent);
1781
- return applyMergeableChanges(mergeableContent2);
1874
+ const mergeCellsOrValues = (
1875
+ things,
1876
+ thingsStampMap,
1877
+ thingsChanges,
1878
+ hasHashes,
1879
+ ) => {
1880
+ const [thingsTime, thingsObj, incomingThingsHash] = things;
1881
+ const [oldThingsTime, thingStampMaps, oldThingsHash] = thingsStampMap;
1882
+ if (thingsTime) {
1883
+ let thingsHash = hasHashes
1884
+ ? incomingThingsHash
1885
+ : oldThingsHash ^
1886
+ (thingsTime > oldThingsTime
1887
+ ? (oldThingsTime ? getHash(oldThingsTime) : 0) ^ getHash(thingsTime)
1888
+ : 0);
1889
+ objForEach(
1890
+ thingsObj,
1891
+ ([thingTime, thing, incomingThingHash], thingId) => {
1892
+ const thingStampMap = mapEnsure(thingStampMaps, thingId, () => [
1893
+ EMPTY_STRING,
1894
+ void 0,
1895
+ 0,
1896
+ ]);
1897
+ const [oldThingTime, , oldThingHash] = thingStampMap;
1898
+ if (thingTime > oldThingTime) {
1899
+ stampUpdate(
1900
+ thingStampMap,
1901
+ hasHashes
1902
+ ? incomingThingHash
1903
+ : getHash(jsonString(thing ?? null) + ':' + thingTime),
1904
+ thingTime,
1905
+ );
1906
+ thingStampMap[1] = thing;
1907
+ thingsChanges[thingId] = thing;
1908
+ thingsHash ^= hasHashes
1909
+ ? 0
1910
+ : hashIdAndHash(thingId, oldThingHash) ^
1911
+ hashIdAndHash(thingId, thingStampMap[2]);
1912
+ }
1913
+ },
1914
+ );
1915
+ stampUpdate(thingsStampMap, thingsHash, thingsTime);
1916
+ }
1917
+ return [oldThingsHash, thingsStampMap[2]];
1918
+ };
1919
+ const preFinishTransaction = () => {
1920
+ if (listening) {
1921
+ transactionMergeableChanges = getTransactionMergeableChanges();
1922
+ mergeContentOrChanges(transactionMergeableChanges);
1923
+ }
1782
1924
  };
1783
- const getMergeableContent = () =>
1784
- mapStamp(contentStamp, ([tablesStamp, valuesStamp]) => [
1785
- mapStampMapToObj(tablesStamp, (rowsStamp) =>
1786
- mapStampMapToObj(rowsStamp, (cellsStamp) =>
1787
- mapStampMapToObj(cellsStamp, cloneStamp),
1925
+ const postFinishTransaction = () =>
1926
+ (transactionTime = transactionMergeableChanges = void 0);
1927
+ const getId = () => id;
1928
+ const getMergeableContent = () => [
1929
+ contentStampMap[0],
1930
+ [
1931
+ stampMapToObjWithHash(contentStampMap[1][0], (tableStampMap) =>
1932
+ stampMapToObjWithHash(tableStampMap, (rowStampMap) =>
1933
+ stampMapToObjWithHash(rowStampMap),
1788
1934
  ),
1789
1935
  ),
1790
- mapStampMapToObj(valuesStamp, cloneStamp),
1791
- ]);
1792
- const setMergeableContent = (mergeableContent) => {
1793
- disableListening(() =>
1794
- store.transaction(() => {
1795
- store.delTables().delValues();
1796
- contentStamp = newContentStamp();
1797
- }),
1936
+ stampMapToObjWithHash(contentStampMap[1][1]),
1937
+ ],
1938
+ contentStampMap[2],
1939
+ ];
1940
+ const getMergeableContentHashes = () => [
1941
+ contentStampMap[0],
1942
+ [contentStampMap[1][0][2], contentStampMap[1][1][2]],
1943
+ ];
1944
+ const getMergeableTableHashes = () =>
1945
+ mapToObj(contentStampMap[1][0][1], getStampHash);
1946
+ const getMergeableTableIdsDiff = (relativeTo) => {
1947
+ const tableIds = [];
1948
+ mapForEach(contentStampMap[1][0][1], (tableId, [, , hash]) => {
1949
+ if (hash !== relativeTo?.[tableId]) {
1950
+ arrayPush(tableIds, tableId);
1951
+ }
1952
+ });
1953
+ return tableIds;
1954
+ };
1955
+ const getMergeableRowHashes = (tablesDelta) =>
1956
+ objNew(
1957
+ arrayMap(tablesDelta, (tableId) => [
1958
+ tableId,
1959
+ mapToObj(mapGet(contentStampMap[1][0][1], tableId)?.[1], getStampHash),
1960
+ ]),
1798
1961
  );
1799
- applyMergeableChanges(mergeableContent);
1800
- return mergeableStore;
1962
+ const getMergeableRowIdsDiff = (relativeTo) =>
1963
+ objMap(relativeTo, (rowHashes, tableId) => {
1964
+ const rowIds = [];
1965
+ mapForEach(
1966
+ mapGet(contentStampMap[1][0][1], tableId)?.[1],
1967
+ (rowId, [, , hash]) => {
1968
+ if (hash !== rowHashes?.[rowId]) {
1969
+ arrayPush(rowIds, rowId);
1970
+ }
1971
+ },
1972
+ );
1973
+ return rowIds;
1974
+ });
1975
+ const getMergeableCellHashes = (tableDelta) =>
1976
+ objMap(tableDelta, (rowIds, tableId) =>
1977
+ objNew(
1978
+ arrayMap(rowIds, (rowId) => [
1979
+ rowId,
1980
+ mapToObj(
1981
+ mapGet(mapGet(contentStampMap[1][0][1], tableId)?.[1], rowId)?.[1],
1982
+ getStampHash,
1983
+ ),
1984
+ ]),
1985
+ ),
1986
+ );
1987
+ const getMergeableTablesChanges = (relativeTo) => {
1988
+ const [, [[tablesTime, tableStampMaps]]] = contentStampMap;
1989
+ const tables = {};
1990
+ objForEach(relativeTo, (rowCellHashes, tableId) =>
1991
+ ifNotUndefined(
1992
+ mapGet(tableStampMaps, tableId),
1993
+ ([tableTime, rowStampMaps]) => {
1994
+ const table = {};
1995
+ objForEach(rowCellHashes, (cellHashes, rowId) =>
1996
+ ifNotUndefined(
1997
+ mapGet(rowStampMaps, rowId),
1998
+ ([rowTime, cellStampMaps]) => {
1999
+ const row = mapToObj(
2000
+ cellStampMaps,
2001
+ stampClone,
2002
+ ([, , hash], cellId) => hash == cellHashes?.[cellId],
2003
+ );
2004
+ if (!objIsEmpty(row)) {
2005
+ table[rowId] = [rowTime, row];
2006
+ }
2007
+ },
2008
+ ),
2009
+ );
2010
+ if (!objIsEmpty(table)) {
2011
+ tables[tableId] = [tableTime, table];
2012
+ }
2013
+ },
2014
+ ),
2015
+ );
2016
+ return [tablesTime, tables];
1801
2017
  };
2018
+ const getMergeableValuesHashes = () =>
2019
+ mapToObj(contentStampMap[1][1][1], getStampHash);
2020
+ const getMergeableValuesChanges = (relativeTo) => [
2021
+ contentStampMap[1][1][0],
2022
+ mapToObj(
2023
+ contentStampMap[1][1][1],
2024
+ stampClone,
2025
+ ([, , hash], valueId) => hash == relativeTo?.[valueId],
2026
+ ),
2027
+ ];
2028
+ const setMergeableContent = (mergeableContent) =>
2029
+ disableListening(() =>
2030
+ validateMergeableContent(mergeableContent)
2031
+ ? store.transaction(() => {
2032
+ store.delTables().delValues();
2033
+ contentStampMap = newContentStampMap();
2034
+ seenHlc(mergeableContent[0]);
2035
+ store.applyChanges(mergeContentOrChanges(mergeableContent, 1));
2036
+ })
2037
+ : 0,
2038
+ );
1802
2039
  const getTransactionMergeableChanges = () => {
1803
- if (isUndefined(finishTransactionMergeableChanges)) {
2040
+ if (isUndefined(transactionMergeableChanges)) {
1804
2041
  const [, , changedCells, , changedValues] = store.getTransactionLog();
1805
2042
  const time =
1806
2043
  !objIsEmpty(changedCells) || !objIsEmpty(changedValues)
1807
2044
  ? transactionTime ?? (transactionTime = getHlc())
1808
2045
  : EMPTY_STRING;
1809
- const mergeableChanges = stampNew(time, [
1810
- stampNewObj(objIsEmpty(changedCells) ? EMPTY_STRING : time),
1811
- stampNewObj(objIsEmpty(changedValues) ? EMPTY_STRING : time),
1812
- ]);
1813
- const [[, tableStamps], [, valuesStamp]] = mergeableChanges[1];
2046
+ const mergeableChanges = [
2047
+ time,
2048
+ [
2049
+ stampNewObj(objIsEmpty(changedCells) ? EMPTY_STRING : time),
2050
+ stampNewObj(objIsEmpty(changedValues) ? EMPTY_STRING : time),
2051
+ 1,
2052
+ ],
2053
+ ];
2054
+ const [[, tablesObj], [, valuesObj]] = mergeableChanges[1];
1814
2055
  objToArray(changedCells, (changedTable, tableId) => {
1815
- const [, rowStamps] = (tableStamps[tableId] = stampNewObj(time));
2056
+ const [, rowsObj] = (tablesObj[tableId] = stampNewObj(time));
1816
2057
  objToArray(changedTable, (changedRow, rowId) => {
1817
- const [, cellStamps] = (rowStamps[rowId] = stampNewObj(time));
2058
+ const [, cellsObj] = (rowsObj[rowId] = stampNewObj(time));
1818
2059
  objToArray(
1819
2060
  changedRow,
1820
- ([, newCell], cellId) =>
1821
- (cellStamps[cellId] = stampNew(time, newCell)),
2061
+ ([, newCell], cellId) => (cellsObj[cellId] = [time, newCell]),
1822
2062
  );
1823
2063
  });
1824
2064
  });
1825
2065
  objToArray(
1826
2066
  changedValues,
1827
- ([, newValue], valueId) =>
1828
- (valuesStamp[valueId] = stampNew(time, newValue)),
2067
+ ([, newValue], valueId) => (valuesObj[valueId] = [time, newValue]),
1829
2068
  );
1830
2069
  return mergeableChanges;
1831
2070
  }
1832
- return finishTransactionMergeableChanges;
2071
+ return transactionMergeableChanges;
1833
2072
  };
1834
- const applyMergeableChanges = (newContentStamp2) => {
1835
- const changes = [{}, {}];
1836
- seenHlc(newContentStamp2[0]);
1837
- mergeStamp(
1838
- newContentStamp2,
1839
- contentStamp,
1840
- changes,
1841
- (
1842
- [newTablesStamp, newValuesStamp],
1843
- [tablesStamp, valuesStamp],
1844
- [tablesChanges, valuesChanges],
1845
- ) => {
1846
- mergeStamp(
1847
- newTablesStamp,
1848
- tablesStamp,
1849
- tablesChanges,
1850
- (newTableStamps, tableStamps, tableChanges) =>
1851
- mergeStamps(
1852
- newTableStamps,
1853
- tableStamps,
1854
- tableChanges,
1855
- (newRowStamps, rowStamps, rowChanges) =>
1856
- mergeStamps(
1857
- newRowStamps,
1858
- rowStamps,
1859
- rowChanges,
1860
- mergeLeafStamps,
1861
- ),
1862
- ),
1863
- );
1864
- mergeStamp(newValuesStamp, valuesStamp, valuesChanges, mergeLeafStamps);
1865
- },
1866
- );
1867
- disableListening(() => store.applyChanges(changes));
1868
- return mergeableStore;
2073
+ const applyMergeableChanges = (mergeableChanges) =>
2074
+ disableListening(() => {
2075
+ seenHlc(mergeableChanges[0]);
2076
+ store.applyChanges(mergeContentOrChanges(mergeableChanges));
2077
+ });
2078
+ const merge = (mergeableStore2) => {
2079
+ const mergeableChanges = getMergeableContent();
2080
+ const mergeableChanges2 = mergeableStore2.getMergeableContent();
2081
+ mergeableStore2.applyMergeableChanges(mergeableChanges);
2082
+ return applyMergeableChanges(mergeableChanges2);
1869
2083
  };
1870
2084
  const mergeableStore = {
2085
+ getId,
1871
2086
  getMergeableContent,
2087
+ getMergeableContentHashes,
2088
+ getMergeableTableHashes,
2089
+ getMergeableTableIdsDiff,
2090
+ getMergeableRowHashes,
2091
+ getMergeableRowIdsDiff,
2092
+ getMergeableCellHashes,
2093
+ getMergeableTablesChanges,
2094
+ getMergeableValuesHashes,
2095
+ getMergeableValuesChanges,
1872
2096
  setMergeableContent,
1873
2097
  getTransactionMergeableChanges,
1874
2098
  applyMergeableChanges,