tinybase 5.0.0-beta.0 → 5.0.0-beta.10

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 (493) hide show
  1. package/bin/cli.js +1 -1
  2. package/lib/checkpoints.js +1 -1
  3. package/lib/checkpoints.js.gz +0 -0
  4. package/lib/cjs/checkpoints.cjs +1 -1
  5. package/lib/cjs/checkpoints.cjs.gz +0 -0
  6. package/lib/cjs/indexes.cjs +1 -1
  7. package/lib/cjs/indexes.cjs.gz +0 -0
  8. package/lib/cjs/mergeable-store.cjs +1 -0
  9. package/lib/cjs/mergeable-store.cjs.gz +0 -0
  10. package/lib/cjs/metrics.cjs +1 -1
  11. package/lib/cjs/metrics.cjs.gz +0 -0
  12. package/lib/cjs/persisters/persister-automerge.cjs +1 -1
  13. package/lib/cjs/persisters/persister-automerge.cjs.gz +0 -0
  14. package/lib/cjs/persisters/persister-browser.cjs +1 -1
  15. package/lib/cjs/persisters/persister-browser.cjs.gz +0 -0
  16. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  17. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  18. package/lib/cjs/persisters/persister-electric-sql.cjs +1 -1
  19. package/lib/cjs/persisters/persister-electric-sql.cjs.gz +0 -0
  20. package/lib/cjs/persisters/persister-expo-sqlite-next.cjs +1 -1
  21. package/lib/cjs/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  22. package/lib/cjs/persisters/persister-expo-sqlite.cjs +1 -1
  23. package/lib/cjs/persisters/persister-expo-sqlite.cjs.gz +0 -0
  24. package/lib/cjs/persisters/persister-file.cjs +1 -1
  25. package/lib/cjs/persisters/persister-file.cjs.gz +0 -0
  26. package/lib/cjs/persisters/persister-indexed-db.cjs +1 -1
  27. package/lib/cjs/persisters/persister-indexed-db.cjs.gz +0 -0
  28. package/lib/cjs/persisters/persister-libsql.cjs +1 -0
  29. package/lib/cjs/persisters/persister-libsql.cjs.gz +0 -0
  30. package/lib/cjs/persisters/persister-partykit-client.cjs +1 -1
  31. package/lib/cjs/persisters/persister-partykit-client.cjs.gz +0 -0
  32. package/lib/cjs/persisters/persister-partykit-server.cjs +1 -1
  33. package/lib/cjs/persisters/persister-partykit-server.cjs.gz +0 -0
  34. package/lib/cjs/persisters/persister-powersync.cjs +1 -0
  35. package/lib/cjs/persisters/persister-powersync.cjs.gz +0 -0
  36. package/lib/cjs/persisters/persister-remote.cjs +1 -1
  37. package/lib/cjs/persisters/persister-remote.cjs.gz +0 -0
  38. package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -1
  39. package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  40. package/lib/cjs/persisters/persister-sqlite3.cjs +1 -1
  41. package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
  42. package/lib/cjs/persisters/persister-yjs.cjs +1 -1
  43. package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
  44. package/lib/cjs/persisters.cjs +1 -1
  45. package/lib/cjs/persisters.cjs.gz +0 -0
  46. package/lib/cjs/queries.cjs +1 -1
  47. package/lib/cjs/queries.cjs.gz +0 -0
  48. package/lib/cjs/relationships.cjs +1 -1
  49. package/lib/cjs/relationships.cjs.gz +0 -0
  50. package/lib/cjs/store.cjs +1 -1
  51. package/lib/cjs/store.cjs.gz +0 -0
  52. package/lib/cjs/synchronizers/synchronizer-local.cjs +1 -0
  53. package/lib/cjs/synchronizers/synchronizer-local.cjs.gz +0 -0
  54. package/lib/cjs/synchronizers/synchronizer-ws-client.cjs +1 -0
  55. package/lib/cjs/synchronizers/synchronizer-ws-client.cjs.gz +0 -0
  56. package/lib/cjs/synchronizers/synchronizer-ws-server.cjs +1 -0
  57. package/lib/cjs/synchronizers/synchronizer-ws-server.cjs.gz +0 -0
  58. package/lib/cjs/synchronizers.cjs +1 -0
  59. package/lib/cjs/synchronizers.cjs.gz +0 -0
  60. package/lib/cjs/tinybase.cjs +1 -1
  61. package/lib/cjs/tinybase.cjs.gz +0 -0
  62. package/lib/cjs/tools.cjs +1 -1
  63. package/lib/cjs/tools.cjs.gz +0 -0
  64. package/lib/cjs/ui-react-dom-debug.cjs +1 -1
  65. package/lib/cjs/ui-react-dom-debug.cjs.gz +0 -0
  66. package/lib/cjs/ui-react-dom.cjs +1 -1
  67. package/lib/cjs/ui-react-dom.cjs.gz +0 -0
  68. package/lib/cjs/ui-react.cjs +1 -1
  69. package/lib/cjs/ui-react.cjs.gz +0 -0
  70. package/lib/cjs-es6/checkpoints.cjs +1 -1
  71. package/lib/cjs-es6/checkpoints.cjs.gz +0 -0
  72. package/lib/cjs-es6/indexes.cjs +1 -1
  73. package/lib/cjs-es6/indexes.cjs.gz +0 -0
  74. package/lib/cjs-es6/mergeable-store.cjs +1 -0
  75. package/lib/cjs-es6/mergeable-store.cjs.gz +0 -0
  76. package/lib/cjs-es6/metrics.cjs +1 -1
  77. package/lib/cjs-es6/metrics.cjs.gz +0 -0
  78. package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -1
  79. package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
  80. package/lib/cjs-es6/persisters/persister-browser.cjs +1 -1
  81. package/lib/cjs-es6/persisters/persister-browser.cjs.gz +0 -0
  82. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  83. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  84. package/lib/cjs-es6/persisters/persister-electric-sql.cjs +1 -1
  85. package/lib/cjs-es6/persisters/persister-electric-sql.cjs.gz +0 -0
  86. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs +1 -1
  87. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  88. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -1
  89. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
  90. package/lib/cjs-es6/persisters/persister-file.cjs +1 -1
  91. package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
  92. package/lib/cjs-es6/persisters/persister-indexed-db.cjs +1 -1
  93. package/lib/cjs-es6/persisters/persister-indexed-db.cjs.gz +0 -0
  94. package/lib/cjs-es6/persisters/persister-libsql.cjs +1 -0
  95. package/lib/cjs-es6/persisters/persister-libsql.cjs.gz +0 -0
  96. package/lib/cjs-es6/persisters/persister-partykit-client.cjs +1 -1
  97. package/lib/cjs-es6/persisters/persister-partykit-client.cjs.gz +0 -0
  98. package/lib/cjs-es6/persisters/persister-partykit-server.cjs +1 -1
  99. package/lib/cjs-es6/persisters/persister-partykit-server.cjs.gz +0 -0
  100. package/lib/cjs-es6/persisters/persister-powersync.cjs +1 -0
  101. package/lib/cjs-es6/persisters/persister-powersync.cjs.gz +0 -0
  102. package/lib/cjs-es6/persisters/persister-remote.cjs +1 -1
  103. package/lib/cjs-es6/persisters/persister-remote.cjs.gz +0 -0
  104. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -1
  105. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  106. package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -1
  107. package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
  108. package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -1
  109. package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
  110. package/lib/cjs-es6/persisters.cjs +1 -1
  111. package/lib/cjs-es6/persisters.cjs.gz +0 -0
  112. package/lib/cjs-es6/queries.cjs +1 -1
  113. package/lib/cjs-es6/queries.cjs.gz +0 -0
  114. package/lib/cjs-es6/relationships.cjs +1 -1
  115. package/lib/cjs-es6/relationships.cjs.gz +0 -0
  116. package/lib/cjs-es6/store.cjs +1 -1
  117. package/lib/cjs-es6/store.cjs.gz +0 -0
  118. package/lib/cjs-es6/synchronizers/synchronizer-local.cjs +1 -0
  119. package/lib/cjs-es6/synchronizers/synchronizer-local.cjs.gz +0 -0
  120. package/lib/cjs-es6/synchronizers/synchronizer-ws-client.cjs +1 -0
  121. package/lib/cjs-es6/synchronizers/synchronizer-ws-client.cjs.gz +0 -0
  122. package/lib/cjs-es6/synchronizers/synchronizer-ws-server.cjs +1 -0
  123. package/lib/cjs-es6/synchronizers/synchronizer-ws-server.cjs.gz +0 -0
  124. package/lib/cjs-es6/synchronizers.cjs +1 -0
  125. package/lib/cjs-es6/synchronizers.cjs.gz +0 -0
  126. package/lib/cjs-es6/tinybase.cjs +1 -1
  127. package/lib/cjs-es6/tinybase.cjs.gz +0 -0
  128. package/lib/cjs-es6/tools.cjs +1 -1
  129. package/lib/cjs-es6/tools.cjs.gz +0 -0
  130. package/lib/cjs-es6/ui-react-dom-debug.cjs +1 -1
  131. package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
  132. package/lib/cjs-es6/ui-react-dom.cjs +1 -1
  133. package/lib/cjs-es6/ui-react-dom.cjs.gz +0 -0
  134. package/lib/cjs-es6/ui-react.cjs +1 -1
  135. package/lib/cjs-es6/ui-react.cjs.gz +0 -0
  136. package/lib/debug/checkpoints.js +254 -235
  137. package/lib/debug/indexes.js +10 -6
  138. package/lib/debug/mergeable-store.js +2230 -0
  139. package/lib/debug/metrics.js +10 -6
  140. package/lib/debug/persisters/persister-automerge.js +113 -87
  141. package/lib/debug/persisters/persister-browser.js +95 -57
  142. package/lib/debug/persisters/persister-cr-sqlite-wasm.js +175 -109
  143. package/lib/debug/persisters/persister-electric-sql.js +176 -109
  144. package/lib/debug/persisters/persister-expo-sqlite-next.js +176 -110
  145. package/lib/debug/persisters/persister-expo-sqlite.js +175 -109
  146. package/lib/debug/persisters/persister-file.js +94 -57
  147. package/lib/debug/persisters/persister-indexed-db.js +94 -57
  148. package/lib/debug/persisters/persister-libsql.js +913 -0
  149. package/lib/debug/persisters/persister-partykit-client.js +90 -59
  150. package/lib/debug/persisters/persister-partykit-server.js +19 -26
  151. package/lib/debug/persisters/persister-powersync.js +928 -0
  152. package/lib/debug/persisters/persister-remote.js +86 -53
  153. package/lib/debug/persisters/persister-sqlite-wasm.js +175 -109
  154. package/lib/debug/persisters/persister-sqlite3.js +175 -109
  155. package/lib/debug/persisters/persister-yjs.js +111 -84
  156. package/lib/debug/persisters.js +82 -50
  157. package/lib/debug/queries.js +18 -12
  158. package/lib/debug/relationships.js +10 -6
  159. package/lib/debug/store.js +150 -127
  160. package/lib/debug/synchronizers/synchronizer-local.js +559 -0
  161. package/lib/debug/synchronizers/synchronizer-ws-client.js +586 -0
  162. package/lib/debug/synchronizers/synchronizer-ws-server.js +96 -0
  163. package/lib/debug/synchronizers.js +519 -0
  164. package/lib/debug/tinybase.js +1281 -409
  165. package/lib/debug/tools.js +41 -64
  166. package/lib/debug/ui-react-dom.js +277 -213
  167. package/lib/debug/ui-react.js +213 -198
  168. package/lib/es6/checkpoints.js +1 -1
  169. package/lib/es6/checkpoints.js.gz +0 -0
  170. package/lib/es6/indexes.js +1 -1
  171. package/lib/es6/indexes.js.gz +0 -0
  172. package/lib/es6/mergeable-store.js +1 -0
  173. package/lib/es6/mergeable-store.js.gz +0 -0
  174. package/lib/es6/metrics.js +1 -1
  175. package/lib/es6/metrics.js.gz +0 -0
  176. package/lib/es6/persisters/persister-automerge.js +1 -1
  177. package/lib/es6/persisters/persister-automerge.js.gz +0 -0
  178. package/lib/es6/persisters/persister-browser.js +1 -1
  179. package/lib/es6/persisters/persister-browser.js.gz +0 -0
  180. package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  181. package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  182. package/lib/es6/persisters/persister-electric-sql.js +1 -1
  183. package/lib/es6/persisters/persister-electric-sql.js.gz +0 -0
  184. package/lib/es6/persisters/persister-expo-sqlite-next.js +1 -1
  185. package/lib/es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  186. package/lib/es6/persisters/persister-expo-sqlite.js +1 -1
  187. package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
  188. package/lib/es6/persisters/persister-file.js +1 -1
  189. package/lib/es6/persisters/persister-file.js.gz +0 -0
  190. package/lib/es6/persisters/persister-indexed-db.js +1 -1
  191. package/lib/es6/persisters/persister-indexed-db.js.gz +0 -0
  192. package/lib/es6/persisters/persister-libsql.js +1 -0
  193. package/lib/es6/persisters/persister-libsql.js.gz +0 -0
  194. package/lib/es6/persisters/persister-partykit-client.js +1 -1
  195. package/lib/es6/persisters/persister-partykit-client.js.gz +0 -0
  196. package/lib/es6/persisters/persister-partykit-server.js +1 -1
  197. package/lib/es6/persisters/persister-partykit-server.js.gz +0 -0
  198. package/lib/es6/persisters/persister-powersync.js +1 -0
  199. package/lib/es6/persisters/persister-powersync.js.gz +0 -0
  200. package/lib/es6/persisters/persister-remote.js +1 -1
  201. package/lib/es6/persisters/persister-remote.js.gz +0 -0
  202. package/lib/es6/persisters/persister-sqlite-wasm.js +1 -1
  203. package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  204. package/lib/es6/persisters/persister-sqlite3.js +1 -1
  205. package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
  206. package/lib/es6/persisters/persister-yjs.js +1 -1
  207. package/lib/es6/persisters/persister-yjs.js.gz +0 -0
  208. package/lib/es6/persisters.js +1 -1
  209. package/lib/es6/persisters.js.gz +0 -0
  210. package/lib/es6/queries.js +1 -1
  211. package/lib/es6/queries.js.gz +0 -0
  212. package/lib/es6/relationships.js +1 -1
  213. package/lib/es6/relationships.js.gz +0 -0
  214. package/lib/es6/store.js +1 -1
  215. package/lib/es6/store.js.gz +0 -0
  216. package/lib/es6/synchronizers/synchronizer-local.js +1 -0
  217. package/lib/es6/synchronizers/synchronizer-local.js.gz +0 -0
  218. package/lib/es6/synchronizers/synchronizer-ws-client.js +1 -0
  219. package/lib/es6/synchronizers/synchronizer-ws-client.js.gz +0 -0
  220. package/lib/es6/synchronizers/synchronizer-ws-server.js +1 -0
  221. package/lib/es6/synchronizers/synchronizer-ws-server.js.gz +0 -0
  222. package/lib/es6/synchronizers.js +1 -0
  223. package/lib/es6/synchronizers.js.gz +0 -0
  224. package/lib/es6/tinybase.js +1 -1
  225. package/lib/es6/tinybase.js.gz +0 -0
  226. package/lib/es6/tools.js +1 -1
  227. package/lib/es6/tools.js.gz +0 -0
  228. package/lib/es6/ui-react-dom-debug.js +1 -1
  229. package/lib/es6/ui-react-dom-debug.js.gz +0 -0
  230. package/lib/es6/ui-react-dom.js +1 -1
  231. package/lib/es6/ui-react-dom.js.gz +0 -0
  232. package/lib/es6/ui-react.js +1 -1
  233. package/lib/es6/ui-react.js.gz +0 -0
  234. package/lib/indexes.js +1 -1
  235. package/lib/indexes.js.gz +0 -0
  236. package/lib/mergeable-store.js +1 -0
  237. package/lib/mergeable-store.js.gz +0 -0
  238. package/lib/metrics.js +1 -1
  239. package/lib/metrics.js.gz +0 -0
  240. package/lib/persisters/persister-automerge.js +1 -1
  241. package/lib/persisters/persister-automerge.js.gz +0 -0
  242. package/lib/persisters/persister-browser.js +1 -1
  243. package/lib/persisters/persister-browser.js.gz +0 -0
  244. package/lib/persisters/persister-cr-sqlite-wasm.js +1 -1
  245. package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  246. package/lib/persisters/persister-electric-sql.js +1 -1
  247. package/lib/persisters/persister-electric-sql.js.gz +0 -0
  248. package/lib/persisters/persister-expo-sqlite-next.js +1 -1
  249. package/lib/persisters/persister-expo-sqlite-next.js.gz +0 -0
  250. package/lib/persisters/persister-expo-sqlite.js +1 -1
  251. package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
  252. package/lib/persisters/persister-file.js +1 -1
  253. package/lib/persisters/persister-file.js.gz +0 -0
  254. package/lib/persisters/persister-indexed-db.js +1 -1
  255. package/lib/persisters/persister-indexed-db.js.gz +0 -0
  256. package/lib/persisters/persister-libsql.js +1 -0
  257. package/lib/persisters/persister-libsql.js.gz +0 -0
  258. package/lib/persisters/persister-partykit-client.js +1 -1
  259. package/lib/persisters/persister-partykit-client.js.gz +0 -0
  260. package/lib/persisters/persister-partykit-server.js +1 -1
  261. package/lib/persisters/persister-partykit-server.js.gz +0 -0
  262. package/lib/persisters/persister-powersync.js +1 -0
  263. package/lib/persisters/persister-powersync.js.gz +0 -0
  264. package/lib/persisters/persister-remote.js +1 -1
  265. package/lib/persisters/persister-remote.js.gz +0 -0
  266. package/lib/persisters/persister-sqlite-wasm.js +1 -1
  267. package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
  268. package/lib/persisters/persister-sqlite3.js +1 -1
  269. package/lib/persisters/persister-sqlite3.js.gz +0 -0
  270. package/lib/persisters/persister-yjs.js +1 -1
  271. package/lib/persisters/persister-yjs.js.gz +0 -0
  272. package/lib/persisters.js +1 -1
  273. package/lib/persisters.js.gz +0 -0
  274. package/lib/queries.js +1 -1
  275. package/lib/queries.js.gz +0 -0
  276. package/lib/relationships.js +1 -1
  277. package/lib/relationships.js.gz +0 -0
  278. package/lib/store.js +1 -1
  279. package/lib/store.js.gz +0 -0
  280. package/lib/synchronizers/synchronizer-local.js +1 -0
  281. package/lib/synchronizers/synchronizer-local.js.gz +0 -0
  282. package/lib/synchronizers/synchronizer-ws-client.js +1 -0
  283. package/lib/synchronizers/synchronizer-ws-client.js.gz +0 -0
  284. package/lib/synchronizers/synchronizer-ws-server.js +1 -0
  285. package/lib/synchronizers/synchronizer-ws-server.js.gz +0 -0
  286. package/lib/synchronizers.js +1 -0
  287. package/lib/synchronizers.js.gz +0 -0
  288. package/lib/tinybase.js +1 -1
  289. package/lib/tinybase.js.gz +0 -0
  290. package/lib/tools.js +1 -1
  291. package/lib/tools.js.gz +0 -0
  292. package/lib/types/checkpoints.d.ts +2 -2
  293. package/lib/types/indexes.d.ts +2 -2
  294. package/lib/types/mergeable-store.d.ts +214 -0
  295. package/lib/types/metrics.d.ts +2 -2
  296. package/lib/types/persisters/persister-automerge.d.ts +11 -7
  297. package/lib/types/persisters/persister-browser.d.ts +13 -4
  298. package/lib/types/persisters/persister-cr-sqlite-wasm.d.ts +4 -0
  299. package/lib/types/persisters/persister-electric-sql.d.ts +4 -0
  300. package/lib/types/persisters/persister-expo-sqlite-next.d.ts +7 -3
  301. package/lib/types/persisters/persister-expo-sqlite.d.ts +4 -0
  302. package/lib/types/persisters/persister-file.d.ts +7 -2
  303. package/lib/types/persisters/persister-indexed-db.d.ts +4 -0
  304. package/lib/types/persisters/persister-libsql.d.ts +142 -0
  305. package/lib/types/persisters/persister-partykit-client.d.ts +4 -0
  306. package/lib/types/persisters/persister-partykit-server.d.ts +12 -8
  307. package/lib/types/persisters/persister-powersync.d.ts +157 -0
  308. package/lib/types/persisters/persister-remote.d.ts +4 -0
  309. package/lib/types/persisters/persister-sqlite-wasm.d.ts +4 -0
  310. package/lib/types/persisters/persister-sqlite3.d.ts +4 -0
  311. package/lib/types/persisters/persister-yjs.d.ts +6 -2
  312. package/lib/types/persisters.d.ts +125 -48
  313. package/lib/types/queries.d.ts +2 -2
  314. package/lib/types/relationships.d.ts +2 -2
  315. package/lib/types/store.d.ts +275 -187
  316. package/lib/types/synchronizers/synchronizer-local.d.ts +27 -0
  317. package/lib/types/synchronizers/synchronizer-ws-client.d.ts +35 -0
  318. package/lib/types/synchronizers/synchronizer-ws-server.d.ts +36 -0
  319. package/lib/types/synchronizers.d.ts +132 -0
  320. package/lib/types/tinybase.d.ts +10 -8
  321. package/lib/types/tools.d.ts +4 -4
  322. package/lib/types/ui-react.d.ts +235 -95
  323. package/lib/types/with-schemas/checkpoints.d.ts +2 -2
  324. package/lib/types/with-schemas/indexes.d.ts +2 -2
  325. package/lib/types/with-schemas/internal/queries.d.ts +4 -3
  326. package/lib/types/with-schemas/internal/store.d.ts +8 -3
  327. package/lib/types/with-schemas/mergeable-store.d.ts +492 -0
  328. package/lib/types/with-schemas/metrics.d.ts +2 -2
  329. package/lib/types/with-schemas/persisters/persister-automerge.d.ts +12 -8
  330. package/lib/types/with-schemas/persisters/persister-browser.d.ts +17 -8
  331. package/lib/types/with-schemas/persisters/persister-cr-sqlite-wasm.d.ts +5 -1
  332. package/lib/types/with-schemas/persisters/persister-electric-sql.d.ts +5 -1
  333. package/lib/types/with-schemas/persisters/persister-expo-sqlite-next.d.ts +8 -4
  334. package/lib/types/with-schemas/persisters/persister-expo-sqlite.d.ts +5 -1
  335. package/lib/types/with-schemas/persisters/persister-file.d.ts +9 -4
  336. package/lib/types/with-schemas/persisters/persister-indexed-db.d.ts +5 -1
  337. package/lib/types/with-schemas/persisters/persister-libsql.d.ts +155 -0
  338. package/lib/types/with-schemas/persisters/persister-partykit-client.d.ts +5 -1
  339. package/lib/types/with-schemas/persisters/persister-partykit-server.d.ts +15 -11
  340. package/lib/types/with-schemas/persisters/persister-powersync.d.ts +170 -0
  341. package/lib/types/with-schemas/persisters/persister-remote.d.ts +5 -1
  342. package/lib/types/with-schemas/persisters/persister-sqlite-wasm.d.ts +5 -1
  343. package/lib/types/with-schemas/persisters/persister-sqlite3.d.ts +5 -1
  344. package/lib/types/with-schemas/persisters/persister-yjs.d.ts +7 -3
  345. package/lib/types/with-schemas/persisters.d.ts +161 -101
  346. package/lib/types/with-schemas/queries.d.ts +3 -3
  347. package/lib/types/with-schemas/relationships.d.ts +2 -2
  348. package/lib/types/with-schemas/store.d.ts +483 -345
  349. package/lib/types/with-schemas/synchronizers/synchronizer-local.d.ts +29 -0
  350. package/lib/types/with-schemas/synchronizers/synchronizer-ws-client.d.ts +41 -0
  351. package/lib/types/with-schemas/synchronizers/synchronizer-ws-server.d.ts +36 -0
  352. package/lib/types/with-schemas/synchronizers.d.ts +146 -0
  353. package/lib/types/with-schemas/tinybase.d.ts +9 -8
  354. package/lib/types/with-schemas/tools.d.ts +4 -4
  355. package/lib/types/with-schemas/ui-react.d.ts +259 -102
  356. package/lib/ui-react-dom.js +1 -1
  357. package/lib/ui-react-dom.js.gz +0 -0
  358. package/lib/ui-react.js +1 -1
  359. package/lib/ui-react.js.gz +0 -0
  360. package/lib/umd/checkpoints.js +1 -1
  361. package/lib/umd/checkpoints.js.gz +0 -0
  362. package/lib/umd/indexes.js +1 -1
  363. package/lib/umd/indexes.js.gz +0 -0
  364. package/lib/umd/mergeable-store.js +1 -0
  365. package/lib/umd/mergeable-store.js.gz +0 -0
  366. package/lib/umd/metrics.js +1 -1
  367. package/lib/umd/metrics.js.gz +0 -0
  368. package/lib/umd/persisters/persister-automerge.js +1 -1
  369. package/lib/umd/persisters/persister-automerge.js.gz +0 -0
  370. package/lib/umd/persisters/persister-browser.js +1 -1
  371. package/lib/umd/persisters/persister-browser.js.gz +0 -0
  372. package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
  373. package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  374. package/lib/umd/persisters/persister-electric-sql.js +1 -1
  375. package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
  376. package/lib/umd/persisters/persister-expo-sqlite-next.js +1 -1
  377. package/lib/umd/persisters/persister-expo-sqlite-next.js.gz +0 -0
  378. package/lib/umd/persisters/persister-expo-sqlite.js +1 -1
  379. package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
  380. package/lib/umd/persisters/persister-file.js +1 -1
  381. package/lib/umd/persisters/persister-file.js.gz +0 -0
  382. package/lib/umd/persisters/persister-indexed-db.js +1 -1
  383. package/lib/umd/persisters/persister-indexed-db.js.gz +0 -0
  384. package/lib/umd/persisters/persister-libsql.js +1 -0
  385. package/lib/umd/persisters/persister-libsql.js.gz +0 -0
  386. package/lib/umd/persisters/persister-partykit-client.js +1 -1
  387. package/lib/umd/persisters/persister-partykit-client.js.gz +0 -0
  388. package/lib/umd/persisters/persister-partykit-server.js +1 -1
  389. package/lib/umd/persisters/persister-partykit-server.js.gz +0 -0
  390. package/lib/umd/persisters/persister-powersync.js +1 -0
  391. package/lib/umd/persisters/persister-powersync.js.gz +0 -0
  392. package/lib/umd/persisters/persister-remote.js +1 -1
  393. package/lib/umd/persisters/persister-remote.js.gz +0 -0
  394. package/lib/umd/persisters/persister-sqlite-wasm.js +1 -1
  395. package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
  396. package/lib/umd/persisters/persister-sqlite3.js +1 -1
  397. package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
  398. package/lib/umd/persisters/persister-yjs.js +1 -1
  399. package/lib/umd/persisters/persister-yjs.js.gz +0 -0
  400. package/lib/umd/persisters.js +1 -1
  401. package/lib/umd/persisters.js.gz +0 -0
  402. package/lib/umd/queries.js +1 -1
  403. package/lib/umd/queries.js.gz +0 -0
  404. package/lib/umd/relationships.js +1 -1
  405. package/lib/umd/relationships.js.gz +0 -0
  406. package/lib/umd/store.js +1 -1
  407. package/lib/umd/store.js.gz +0 -0
  408. package/lib/umd/synchronizers/synchronizer-local.js +1 -0
  409. package/lib/umd/synchronizers/synchronizer-local.js.gz +0 -0
  410. package/lib/umd/synchronizers/synchronizer-ws-client.js +1 -0
  411. package/lib/umd/synchronizers/synchronizer-ws-client.js.gz +0 -0
  412. package/lib/umd/synchronizers/synchronizer-ws-server.js +1 -0
  413. package/lib/umd/synchronizers/synchronizer-ws-server.js.gz +0 -0
  414. package/lib/umd/synchronizers.js +1 -0
  415. package/lib/umd/synchronizers.js.gz +0 -0
  416. package/lib/umd/tinybase.js +1 -1
  417. package/lib/umd/tinybase.js.gz +0 -0
  418. package/lib/umd/tools.js +1 -1
  419. package/lib/umd/tools.js.gz +0 -0
  420. package/lib/umd/ui-react-dom-debug.js +1 -1
  421. package/lib/umd/ui-react-dom-debug.js.gz +0 -0
  422. package/lib/umd/ui-react-dom.js +1 -1
  423. package/lib/umd/ui-react-dom.js.gz +0 -0
  424. package/lib/umd/ui-react.js +1 -1
  425. package/lib/umd/ui-react.js.gz +0 -0
  426. package/lib/umd-es6/checkpoints.js +1 -1
  427. package/lib/umd-es6/checkpoints.js.gz +0 -0
  428. package/lib/umd-es6/indexes.js +1 -1
  429. package/lib/umd-es6/indexes.js.gz +0 -0
  430. package/lib/umd-es6/mergeable-store.js +1 -0
  431. package/lib/umd-es6/mergeable-store.js.gz +0 -0
  432. package/lib/umd-es6/metrics.js +1 -1
  433. package/lib/umd-es6/metrics.js.gz +0 -0
  434. package/lib/umd-es6/persisters/persister-automerge.js +1 -1
  435. package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
  436. package/lib/umd-es6/persisters/persister-browser.js +1 -1
  437. package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
  438. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  439. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  440. package/lib/umd-es6/persisters/persister-electric-sql.js +1 -1
  441. package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
  442. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js +1 -1
  443. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  444. package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -1
  445. package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
  446. package/lib/umd-es6/persisters/persister-file.js +1 -1
  447. package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
  448. package/lib/umd-es6/persisters/persister-indexed-db.js +1 -1
  449. package/lib/umd-es6/persisters/persister-indexed-db.js.gz +0 -0
  450. package/lib/umd-es6/persisters/persister-libsql.js +1 -0
  451. package/lib/umd-es6/persisters/persister-libsql.js.gz +0 -0
  452. package/lib/umd-es6/persisters/persister-partykit-client.js +1 -1
  453. package/lib/umd-es6/persisters/persister-partykit-client.js.gz +0 -0
  454. package/lib/umd-es6/persisters/persister-partykit-server.js +1 -1
  455. package/lib/umd-es6/persisters/persister-partykit-server.js.gz +0 -0
  456. package/lib/umd-es6/persisters/persister-powersync.js +1 -0
  457. package/lib/umd-es6/persisters/persister-powersync.js.gz +0 -0
  458. package/lib/umd-es6/persisters/persister-remote.js +1 -1
  459. package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
  460. package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -1
  461. package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  462. package/lib/umd-es6/persisters/persister-sqlite3.js +1 -1
  463. package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
  464. package/lib/umd-es6/persisters/persister-yjs.js +1 -1
  465. package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
  466. package/lib/umd-es6/persisters.js +1 -1
  467. package/lib/umd-es6/persisters.js.gz +0 -0
  468. package/lib/umd-es6/queries.js +1 -1
  469. package/lib/umd-es6/queries.js.gz +0 -0
  470. package/lib/umd-es6/relationships.js +1 -1
  471. package/lib/umd-es6/relationships.js.gz +0 -0
  472. package/lib/umd-es6/store.js +1 -1
  473. package/lib/umd-es6/store.js.gz +0 -0
  474. package/lib/umd-es6/synchronizers/synchronizer-local.js +1 -0
  475. package/lib/umd-es6/synchronizers/synchronizer-local.js.gz +0 -0
  476. package/lib/umd-es6/synchronizers/synchronizer-ws-client.js +1 -0
  477. package/lib/umd-es6/synchronizers/synchronizer-ws-client.js.gz +0 -0
  478. package/lib/umd-es6/synchronizers/synchronizer-ws-server.js +1 -0
  479. package/lib/umd-es6/synchronizers/synchronizer-ws-server.js.gz +0 -0
  480. package/lib/umd-es6/synchronizers.js +1 -0
  481. package/lib/umd-es6/synchronizers.js.gz +0 -0
  482. package/lib/umd-es6/tinybase.js +1 -1
  483. package/lib/umd-es6/tinybase.js.gz +0 -0
  484. package/lib/umd-es6/tools.js +1 -1
  485. package/lib/umd-es6/tools.js.gz +0 -0
  486. package/lib/umd-es6/ui-react-dom-debug.js +1 -1
  487. package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
  488. package/lib/umd-es6/ui-react-dom.js +1 -1
  489. package/lib/umd-es6/ui-react-dom.js.gz +0 -0
  490. package/lib/umd-es6/ui-react.js +1 -1
  491. package/lib/umd-es6/ui-react.js.gz +0 -0
  492. package/package.json +68 -48
  493. package/readme.md +2 -2
@@ -42,9 +42,11 @@ const mapForEach = (map, cb) =>
42
42
  collForEach(map, (value, key) => cb(key, value));
43
43
  const mapSet = (map, key, value) =>
44
44
  isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
45
- const mapEnsure = (map, key, getDefaultValue) => {
45
+ const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
46
46
  if (!collHas(map, key)) {
47
47
  mapSet(map, key, getDefaultValue());
48
+ } else {
49
+ hadExistingValue?.(mapGet(map, key));
48
50
  }
49
51
  return mapGet(map, key);
50
52
  };
@@ -238,13 +240,15 @@ const getRowCellFunction = (getRowCell, defaultCellValue) =>
238
240
  isString(getRowCell)
239
241
  ? (getCell) => getCell(getRowCell)
240
242
  : getRowCell ?? (() => defaultCellValue ?? EMPTY_STRING);
241
- const getCreateFunction = (getFunction) => {
242
- const getFunctionsByStore = /* @__PURE__ */ new WeakMap();
243
+ const getCreateFunction = (getFunction, initFunction) => {
244
+ const thingsByStore = /* @__PURE__ */ new WeakMap();
243
245
  return (store) => {
244
- if (!getFunctionsByStore.has(store)) {
245
- getFunctionsByStore.set(store, getFunction(store));
246
+ if (!thingsByStore.has(store)) {
247
+ thingsByStore.set(store, getFunction(store));
246
248
  }
247
- return getFunctionsByStore.get(store);
249
+ const thing = thingsByStore.get(store);
250
+ initFunction?.(thing);
251
+ return thing;
248
252
  };
249
253
  };
250
254
 
@@ -49,9 +49,8 @@ const arrayShift = (array) => array.shift();
49
49
 
50
50
  const object = Object;
51
51
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
52
- const objIds = object.keys;
52
+ const objEntries = object.entries;
53
53
  const objFrozen = object.isFrozen;
54
- const objFreeze = object.freeze;
55
54
  const isObject = (obj) =>
56
55
  !isUndefined(obj) &&
57
56
  ifNotUndefined(
@@ -59,18 +58,37 @@ const isObject = (obj) =>
59
58
  (objPrototype) =>
60
59
  objPrototype == object.prototype ||
61
60
  isUndefined(getPrototypeOf(objPrototype)),
61
+ /* istanbul ignore next */
62
62
  () => true,
63
63
  );
64
- const objGet = (obj, id) => ifNotUndefined(obj, (obj2) => obj2[id]);
65
- const objHas = (obj, id) => !isUndefined(objGet(obj, id));
64
+ const objIds = object.keys;
65
+ const objFreeze = object.freeze;
66
+ const objHas = (obj, id) => id in obj;
66
67
  const objDel = (obj, id) => {
67
68
  delete obj[id];
68
69
  return obj;
69
70
  };
70
- const objMap = (obj, cb) =>
71
- arrayMap(object.entries(obj), ([id, value]) => cb(value, id));
71
+ const objToArray = (obj, cb) =>
72
+ arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
72
73
  const objSize = (obj) => size(objIds(obj));
73
74
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
75
+ const objValidate = (obj, validateChild, onInvalidObj, emptyIsValid = 0) => {
76
+ if (
77
+ isUndefined(obj) ||
78
+ !isObject(obj) ||
79
+ (!emptyIsValid && objIsEmpty(obj)) ||
80
+ objFrozen(obj)
81
+ ) {
82
+ onInvalidObj?.();
83
+ return false;
84
+ }
85
+ objToArray(obj, (child, id) => {
86
+ if (!validateChild(child, id)) {
87
+ objDel(obj, id);
88
+ }
89
+ });
90
+ return emptyIsValid ? true : !objIsEmpty(obj);
91
+ };
74
92
 
75
93
  const collSizeN = (collSizer) => (coll) =>
76
94
  arrayReduce(collValues(coll), (total, coll2) => total + collSizer(coll2), 0);
@@ -94,35 +112,41 @@ const mapMap = (coll, cb) =>
94
112
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
95
113
  const mapSet = (map, key, value) =>
96
114
  isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
97
- const mapEnsure = (map, key, getDefaultValue) => {
115
+ const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
98
116
  if (!collHas(map, key)) {
99
117
  mapSet(map, key, getDefaultValue());
118
+ } else {
119
+ hadExistingValue?.(mapGet(map, key));
100
120
  }
101
121
  return mapGet(map, key);
102
122
  };
103
123
  const mapMatch = (map, obj, set, del = mapSet) => {
104
- objMap(obj, (value, id) => set(map, id, value));
124
+ objToArray(obj, (value, id) => set(map, id, value));
105
125
  mapForEach(map, (id) => (objHas(obj, id) ? 0 : del(map, id)));
106
126
  return map;
107
127
  };
108
- const mapToObj = (map, mapValue, excludeValue) => {
128
+ const mapToObj = (map, valueMapper, excludeMapValue, excludeObjValue) => {
109
129
  const obj = {};
110
- collForEach(map, (value, id) => {
111
- const mappedValue = mapValue ? mapValue(value, id) : value;
112
- excludeValue?.(mappedValue, value) ? 0 : (obj[id] = mappedValue);
130
+ collForEach(map, (mapValue, id) => {
131
+ if (!excludeMapValue?.(mapValue, id)) {
132
+ const objValue = valueMapper ? valueMapper(mapValue, id) : mapValue;
133
+ excludeObjValue?.(objValue) ? 0 : (obj[id] = objValue);
134
+ }
113
135
  });
114
136
  return obj;
115
137
  };
116
- const mapToObj2 = (map, mapValue, excludeValue) =>
138
+ const mapToObj2 = (map, valueMapper, excludeMapValue) =>
117
139
  mapToObj(
118
140
  map,
119
- (childMap) => mapToObj(childMap, mapValue, excludeValue),
141
+ (childMap) => mapToObj(childMap, valueMapper, excludeMapValue),
142
+ collIsEmpty,
120
143
  objIsEmpty,
121
144
  );
122
- const mapToObj3 = (map, mapValue, excludeValue) =>
145
+ const mapToObj3 = (map, valueMapper, excludeMapValue) =>
123
146
  mapToObj(
124
147
  map,
125
- (childMap) => mapToObj2(childMap, mapValue, excludeValue),
148
+ (childMap) => mapToObj2(childMap, valueMapper, excludeMapValue),
149
+ collIsEmpty,
126
150
  objIsEmpty,
127
151
  );
128
152
  const mapClone = (map, mapValue) => {
@@ -252,9 +276,10 @@ const pairNewMap = () => [mapNew(), mapNew()];
252
276
  const pairClone = (array) => [...array];
253
277
  const pairIsEqual = ([entry1, entry2]) => entry1 === entry2;
254
278
 
255
- const getCellOrValueType = (cell) => {
256
- const type = getTypeOf(cell);
257
- return isTypeStringOrBoolean(type) || (type == NUMBER && isFiniteNumber(cell))
279
+ const getCellOrValueType = (cellOrValue) => {
280
+ const type = getTypeOf(cellOrValue);
281
+ return isTypeStringOrBoolean(type) ||
282
+ (type == NUMBER && isFiniteNumber(cellOrValue))
258
283
  ? type
259
284
  : void 0;
260
285
  };
@@ -265,7 +290,7 @@ const setOrDelCell = (store, tableId, rowId, cellId, cell) =>
265
290
  const setOrDelValue = (store, valueId, value) =>
266
291
  isUndefined(value) ? store.delValue(valueId) : store.setValue(valueId, value);
267
292
 
268
- const jsonString = (obj) =>
293
+ const jsonStringWithMap = (obj) =>
269
294
  JSON.stringify(obj, (_key, value) =>
270
295
  isInstanceOf(value, Map) ? object.fromEntries([...value]) : value,
271
296
  );
@@ -274,18 +299,6 @@ const jsonParse = JSON.parse;
274
299
  const defaultSorter = (sortKey1, sortKey2) =>
275
300
  (sortKey1 ?? 0) < (sortKey2 ?? 0) ? -1 : 1;
276
301
 
277
- const validate = (obj, validateChild, onInvalidObj) => {
278
- if (isUndefined(obj) || !isObject(obj) || objIsEmpty(obj) || objFrozen(obj)) {
279
- onInvalidObj?.();
280
- return false;
281
- }
282
- objMap(obj, (child, id2) => {
283
- if (!validateChild(child, id2)) {
284
- objDel(obj, id2);
285
- }
286
- });
287
- return !objIsEmpty(obj);
288
- };
289
302
  const idsChanged = (changedIds, id2, addedOrRemoved) =>
290
303
  mapSet(
291
304
  changedIds,
@@ -295,11 +308,10 @@ const idsChanged = (changedIds, id2, addedOrRemoved) =>
295
308
  const createStore = () => {
296
309
  let hasTablesSchema;
297
310
  let hasValuesSchema;
298
- let cellsTouched = false;
299
- let valuesTouched = false;
300
311
  let hadTables = false;
301
312
  let hadValues = false;
302
313
  let transactions = 0;
314
+ let internalListeners = [];
303
315
  const changedTableIds = mapNew();
304
316
  const changedTableCellIds = mapNew();
305
317
  const changedRowCount = mapNew();
@@ -346,13 +358,13 @@ const createStore = () => {
346
358
  const [addListener, callListeners, delListenerImpl, callListenerImpl] =
347
359
  getListenerFunctions(() => store);
348
360
  const validateTablesSchema = (tableSchema) =>
349
- validate(tableSchema, (tableSchema2) =>
350
- validate(tableSchema2, validateCellOrValueSchema),
361
+ objValidate(tableSchema, (tableSchema2) =>
362
+ objValidate(tableSchema2, validateCellOrValueSchema),
351
363
  );
352
364
  const validateValuesSchema = (valuesSchema) =>
353
- validate(valuesSchema, validateCellOrValueSchema);
365
+ objValidate(valuesSchema, validateCellOrValueSchema);
354
366
  const validateCellOrValueSchema = (schema) => {
355
- if (!validate(schema, (_child, id2) => arrayHas([TYPE, DEFAULT], id2))) {
367
+ if (!objValidate(schema, (_child, id2) => arrayHas([TYPE, DEFAULT], id2))) {
356
368
  return false;
357
369
  }
358
370
  const type = schema[TYPE];
@@ -365,18 +377,18 @@ const createStore = () => {
365
377
  return true;
366
378
  };
367
379
  const validateTables = (tables) =>
368
- validate(tables, validateTable, cellInvalid);
380
+ objValidate(tables, validateTable, cellInvalid);
369
381
  const validateTable = (table, tableId) =>
370
382
  (!hasTablesSchema ||
371
383
  collHas(tablesSchemaMap, tableId) ||
372
384
  cellInvalid(tableId)) &&
373
- validate(
385
+ objValidate(
374
386
  table,
375
387
  (row, rowId) => validateRow(tableId, rowId, row),
376
388
  () => cellInvalid(tableId),
377
389
  );
378
390
  const validateRow = (tableId, rowId, row, skipDefaults) =>
379
- validate(
391
+ objValidate(
380
392
  skipDefaults ? row : addDefaultsToRow(row, tableId, rowId),
381
393
  (cell, cellId) =>
382
394
  ifNotUndefined(
@@ -403,7 +415,7 @@ const createStore = () => {
403
415
  ? cellInvalid(tableId, rowId, cellId, cell)
404
416
  : cell;
405
417
  const validateValues = (values, skipDefaults) =>
406
- validate(
418
+ objValidate(
407
419
  skipDefaults ? values : addDefaultsToValues(values),
408
420
  (value, valueId) =>
409
421
  ifNotUndefined(
@@ -666,16 +678,20 @@ const createStore = () => {
666
678
  addedOrRemoved,
667
679
  );
668
680
  };
669
- const cellChanged = (tableId, rowId, cellId, oldCell, newCell) =>
670
- (mapEnsure(
681
+ const cellChanged = (tableId, rowId, cellId, oldCell, newCell) => {
682
+ mapEnsure(
671
683
  mapEnsure(mapEnsure(changedCells, tableId, mapNew), rowId, mapNew),
672
684
  cellId,
673
685
  () => [oldCell, 0],
674
- )[1] = newCell);
686
+ )[1] = newCell;
687
+ internalListeners[3]?.(tableId, rowId, cellId, newCell);
688
+ };
675
689
  const valueIdsChanged = (valueId, addedOrRemoved) =>
676
690
  idsChanged(changedValueIds, valueId, addedOrRemoved);
677
- const valueChanged = (valueId, oldValue, newValue) =>
678
- (mapEnsure(changedValues, valueId, () => [oldValue, 0])[1] = newValue);
691
+ const valueChanged = (valueId, oldValue, newValue) => {
692
+ mapEnsure(changedValues, valueId, () => [oldValue, 0])[1] = newValue;
693
+ internalListeners[4]?.(valueId, newValue);
694
+ };
679
695
  const cellInvalid = (tableId, rowId, cellId, invalidCell, defaultedCell) => {
680
696
  arrayPush(
681
697
  mapEnsure(
@@ -941,44 +957,6 @@ const createStore = () => {
941
957
  transaction(() => actions(...arrayMap(args, id)));
942
958
  return store;
943
959
  };
944
- const getTransactionChanges = () => [
945
- mapToObj(
946
- changedCells,
947
- (table, tableId) =>
948
- mapGet(changedTableIds, tableId) === -1
949
- ? null
950
- : mapToObj(
951
- table,
952
- (row, rowId) =>
953
- mapGet(mapGet(changedRowIds, tableId), rowId) === -1
954
- ? null
955
- : mapToObj(
956
- row,
957
- ([, newCell]) => newCell ?? null,
958
- (_, changedCell) => pairIsEqual(changedCell),
959
- ),
960
- objIsEmpty,
961
- ),
962
- objIsEmpty,
963
- ),
964
- mapToObj(
965
- changedValues,
966
- ([, newValue]) => newValue ?? null,
967
- (_, changedValue) => pairIsEqual(changedValue),
968
- ),
969
- ];
970
- const getTransactionLog = () => ({
971
- cellsTouched,
972
- valuesTouched,
973
- changedCells: mapToObj3(changedCells, pairClone, pairIsEqual),
974
- invalidCells: mapToObj3(invalidCells),
975
- changedValues: mapToObj(changedValues, pairClone, pairIsEqual),
976
- invalidValues: mapToObj(invalidValues),
977
- changedTableIds: mapToObj(changedTableIds),
978
- changedRowIds: mapToObj2(changedRowIds),
979
- changedCellIds: mapToObj3(changedCellIds),
980
- changedValueIds: mapToObj(changedValueIds),
981
- });
982
960
  const getContent = () => [getTables(), getValues()];
983
961
  const getTables = () => mapToObj3(tablesMap);
984
962
  const getTableIds = () => mapKeys(tablesMap);
@@ -1022,12 +1000,13 @@ const createStore = () => {
1022
1000
  collHas(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)), id(cellId));
1023
1001
  const hasValues = () => !collIsEmpty(valuesMap);
1024
1002
  const hasValue = (valueId) => collHas(valuesMap, id(valueId));
1025
- const getTablesJson = () => jsonString(tablesMap);
1026
- const getValuesJson = () => jsonString(valuesMap);
1027
- const getJson = () => jsonString([tablesMap, valuesMap]);
1028
- const getTablesSchemaJson = () => jsonString(tablesSchemaMap);
1029
- const getValuesSchemaJson = () => jsonString(valuesSchemaMap);
1030
- const getSchemaJson = () => jsonString([tablesSchemaMap, valuesSchemaMap]);
1003
+ const getTablesJson = () => jsonStringWithMap(tablesMap);
1004
+ const getValuesJson = () => jsonStringWithMap(valuesMap);
1005
+ const getJson = () => jsonStringWithMap([tablesMap, valuesMap]);
1006
+ const getTablesSchemaJson = () => jsonStringWithMap(tablesSchemaMap);
1007
+ const getValuesSchemaJson = () => jsonStringWithMap(valuesSchemaMap);
1008
+ const getSchemaJson = () =>
1009
+ jsonStringWithMap([tablesSchemaMap, valuesSchemaMap]);
1031
1010
  const setContent = ([tables, values]) =>
1032
1011
  fluentTransaction(() => {
1033
1012
  (objIsEmpty(tables) ? delTables : setTables)(tables);
@@ -1071,7 +1050,7 @@ const createStore = () => {
1071
1050
  (tableId2, rowId2) => {
1072
1051
  if (validateRow(tableId2, rowId2, partialRow, 1)) {
1073
1052
  const table = getOrCreateTable(tableId2);
1074
- objMap(partialRow, (cell, cellId) =>
1053
+ objToArray(partialRow, (cell, cellId) =>
1075
1054
  setCellIntoDefaultRow(tableId2, table, rowId2, cellId, cell),
1076
1055
  );
1077
1056
  }
@@ -1109,7 +1088,7 @@ const createStore = () => {
1109
1088
  const setPartialValues = (partialValues) =>
1110
1089
  fluentTransaction(() =>
1111
1090
  validateValues(partialValues, 1)
1112
- ? objMap(partialValues, (value, valueId) =>
1091
+ ? objToArray(partialValues, (value, valueId) =>
1113
1092
  setValidValue(valueId, value),
1114
1093
  )
1115
1094
  : 0,
@@ -1126,20 +1105,20 @@ const createStore = () => {
1126
1105
  ),
1127
1106
  valueId,
1128
1107
  );
1129
- const setTransactionChanges = (transactionChanges) =>
1108
+ const applyChanges = (changes) =>
1130
1109
  fluentTransaction(() => {
1131
- objMap(transactionChanges[0], (table, tableId) =>
1110
+ objToArray(changes[0], (table, tableId) =>
1132
1111
  isUndefined(table)
1133
1112
  ? delTable(tableId)
1134
- : objMap(table, (row, rowId) =>
1113
+ : objToArray(table, (row, rowId) =>
1135
1114
  isUndefined(row)
1136
1115
  ? delRow(tableId, rowId)
1137
- : objMap(row, (cell, cellId) =>
1116
+ : objToArray(row, (cell, cellId) =>
1138
1117
  setOrDelCell(store, tableId, rowId, cellId, cell),
1139
1118
  ),
1140
1119
  ),
1141
1120
  );
1142
- objMap(transactionChanges[1], (value, valueId) =>
1121
+ objToArray(changes[1], (value, valueId) =>
1143
1122
  setOrDelValue(store, valueId, value),
1144
1123
  );
1145
1124
  });
@@ -1266,31 +1245,66 @@ const createStore = () => {
1266
1245
  transactions++;
1267
1246
  }
1268
1247
  if (transactions == 1) {
1269
- callListeners(
1270
- startTransactionListeners,
1271
- void 0,
1272
- getTransactionChanges,
1273
- getTransactionLog,
1274
- );
1248
+ internalListeners[0]?.();
1249
+ callListeners(startTransactionListeners, void 0);
1275
1250
  }
1276
1251
  return store;
1277
1252
  };
1253
+ const getTransactionChanges = () => [
1254
+ mapToObj(
1255
+ changedCells,
1256
+ (table, tableId) =>
1257
+ mapGet(changedTableIds, tableId) === -1
1258
+ ? void 0
1259
+ : mapToObj(
1260
+ table,
1261
+ (row, rowId) =>
1262
+ mapGet(mapGet(changedRowIds, tableId), rowId) === -1
1263
+ ? void 0
1264
+ : mapToObj(
1265
+ row,
1266
+ ([, newCell]) => newCell,
1267
+ (changedCell) => pairIsEqual(changedCell),
1268
+ ),
1269
+ collIsEmpty,
1270
+ objIsEmpty,
1271
+ ),
1272
+ collIsEmpty,
1273
+ objIsEmpty,
1274
+ ),
1275
+ mapToObj(
1276
+ changedValues,
1277
+ ([, newValue]) => newValue,
1278
+ (changedValue) => pairIsEqual(changedValue),
1279
+ ),
1280
+ 1,
1281
+ ];
1282
+ const getTransactionLog = () => [
1283
+ !collIsEmpty(changedCells),
1284
+ !collIsEmpty(changedValues),
1285
+ mapToObj3(changedCells, pairClone, pairIsEqual),
1286
+ mapToObj3(invalidCells),
1287
+ mapToObj(changedValues, pairClone, pairIsEqual),
1288
+ mapToObj(invalidValues),
1289
+ mapToObj(changedTableIds),
1290
+ mapToObj2(changedRowIds),
1291
+ mapToObj3(changedCellIds),
1292
+ mapToObj(changedValueIds),
1293
+ ];
1278
1294
  const finishTransaction = (doRollback) => {
1279
1295
  if (transactions > 0) {
1280
1296
  transactions--;
1281
1297
  if (transactions == 0) {
1282
- cellsTouched = !collIsEmpty(changedCells);
1283
- valuesTouched = !collIsEmpty(changedValues);
1284
1298
  transactions = 1;
1285
1299
  callInvalidCellListeners(1);
1286
- if (cellsTouched) {
1300
+ if (!collIsEmpty(changedCells)) {
1287
1301
  callTabularListenersForChanges(1);
1288
1302
  }
1289
1303
  callInvalidValueListeners(1);
1290
- if (valuesTouched) {
1304
+ if (!collIsEmpty(changedValues)) {
1291
1305
  callValuesListenersForChanges(1);
1292
1306
  }
1293
- if (doRollback?.(getTransactionChanges, getTransactionLog)) {
1307
+ if (doRollback?.(store)) {
1294
1308
  collForEach(changedCells, (table, tableId) =>
1295
1309
  collForEach(table, (row, rowId) =>
1296
1310
  collForEach(row, ([oldCell], cellId) =>
@@ -1298,34 +1312,26 @@ const createStore = () => {
1298
1312
  ),
1299
1313
  ),
1300
1314
  );
1315
+ collClear(changedCells);
1301
1316
  collForEach(changedValues, ([oldValue], valueId) =>
1302
1317
  setOrDelValue(store, valueId, oldValue),
1303
1318
  );
1304
- cellsTouched = valuesTouched = false;
1319
+ collClear(changedValues);
1305
1320
  }
1306
- callListeners(
1307
- finishTransactionListeners[0],
1308
- void 0,
1309
- getTransactionChanges,
1310
- getTransactionLog,
1311
- );
1321
+ callListeners(finishTransactionListeners[0], void 0);
1312
1322
  transactions = -1;
1313
1323
  callInvalidCellListeners(0);
1314
- if (cellsTouched) {
1324
+ if (!collIsEmpty(changedCells)) {
1315
1325
  callTabularListenersForChanges(0);
1316
1326
  }
1317
1327
  callInvalidValueListeners(0);
1318
- if (valuesTouched) {
1328
+ if (!collIsEmpty(changedValues)) {
1319
1329
  callValuesListenersForChanges(0);
1320
1330
  }
1321
- callListeners(
1322
- finishTransactionListeners[1],
1323
- void 0,
1324
- getTransactionChanges,
1325
- getTransactionLog,
1326
- );
1331
+ internalListeners[1]?.();
1332
+ callListeners(finishTransactionListeners[1], void 0);
1333
+ internalListeners[2]?.();
1327
1334
  transactions = 0;
1328
- cellsTouched = valuesTouched = false;
1329
1335
  hadTables = hasTables();
1330
1336
  hadValues = hasValues();
1331
1337
  arrayForEach(
@@ -1450,6 +1456,20 @@ const createStore = () => {
1450
1456
  collSize2(startTransactionListeners) +
1451
1457
  pairCollSize2(finishTransactionListeners),
1452
1458
  });
1459
+ const setInternalListeners = (
1460
+ preStartTransaction,
1461
+ preFinishTransaction,
1462
+ postFinishTransaction,
1463
+ cellChanged2,
1464
+ valueChanged2,
1465
+ ) =>
1466
+ (internalListeners = [
1467
+ preStartTransaction,
1468
+ preFinishTransaction,
1469
+ postFinishTransaction,
1470
+ cellChanged2,
1471
+ valueChanged2,
1472
+ ]);
1453
1473
  const store = {
1454
1474
  getContent,
1455
1475
  getTables,
@@ -1490,7 +1510,7 @@ const createStore = () => {
1490
1510
  setValues,
1491
1511
  setPartialValues,
1492
1512
  setValue,
1493
- setTransactionChanges,
1513
+ applyChanges,
1494
1514
  setTablesJson,
1495
1515
  setValuesJson,
1496
1516
  setJson,
@@ -1508,6 +1528,8 @@ const createStore = () => {
1508
1528
  delSchema,
1509
1529
  transaction,
1510
1530
  startTransaction,
1531
+ getTransactionChanges,
1532
+ getTransactionLog,
1511
1533
  finishTransaction,
1512
1534
  forEachTable,
1513
1535
  forEachTableCell,
@@ -1525,8 +1547,9 @@ const createStore = () => {
1525
1547
  createStore,
1526
1548
  addListener,
1527
1549
  callListeners,
1550
+ setInternalListeners,
1528
1551
  };
1529
- objMap(
1552
+ objToArray(
1530
1553
  {
1531
1554
  [HAS + TABLES]: [0, hasTablesListeners, [], () => [hasTables()]],
1532
1555
  [TABLES]: [0, tablesListeners],