tinybase 5.0.0-beta.1 → 5.0.0-beta.11

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 (491) 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 -0
  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-partykit-server.cjs +1 -1
  32. package/lib/cjs/persisters/persister-partykit-server.cjs.gz +0 -0
  33. package/lib/cjs/persisters/persister-powersync.cjs +1 -0
  34. package/lib/cjs/persisters/persister-powersync.cjs.gz +0 -0
  35. package/lib/cjs/persisters/persister-remote.cjs +1 -1
  36. package/lib/cjs/persisters/persister-remote.cjs.gz +0 -0
  37. package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -1
  38. package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  39. package/lib/cjs/persisters/persister-sqlite3.cjs +1 -1
  40. package/lib/cjs/persisters/persister-sqlite3.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/synchronizers/synchronizer-local.cjs +1 -0
  52. package/lib/cjs/synchronizers/synchronizer-local.cjs.gz +0 -0
  53. package/lib/cjs/synchronizers/synchronizer-ws-client.cjs +1 -0
  54. package/lib/cjs/synchronizers/synchronizer-ws-client.cjs.gz +0 -0
  55. package/lib/cjs/synchronizers/synchronizer-ws-server.cjs +1 -0
  56. package/lib/cjs/synchronizers/synchronizer-ws-server.cjs.gz +0 -0
  57. package/lib/cjs/synchronizers.cjs +1 -0
  58. package/lib/cjs/synchronizers.cjs.gz +0 -0
  59. package/lib/cjs/tinybase.cjs +1 -1
  60. package/lib/cjs/tinybase.cjs.gz +0 -0
  61. package/lib/cjs/tools.cjs +1 -1
  62. package/lib/cjs/tools.cjs.gz +0 -0
  63. package/lib/cjs/ui-react-dom-debug.cjs +1 -1
  64. package/lib/cjs/ui-react-dom-debug.cjs.gz +0 -0
  65. package/lib/cjs/ui-react-dom.cjs +1 -1
  66. package/lib/cjs/ui-react-dom.cjs.gz +0 -0
  67. package/lib/cjs/ui-react.cjs +1 -1
  68. package/lib/cjs/ui-react.cjs.gz +0 -0
  69. package/lib/cjs-es6/checkpoints.cjs +1 -1
  70. package/lib/cjs-es6/checkpoints.cjs.gz +0 -0
  71. package/lib/cjs-es6/indexes.cjs +1 -1
  72. package/lib/cjs-es6/indexes.cjs.gz +0 -0
  73. package/lib/cjs-es6/mergeable-store.cjs +1 -0
  74. package/lib/cjs-es6/mergeable-store.cjs.gz +0 -0
  75. package/lib/cjs-es6/metrics.cjs +1 -1
  76. package/lib/cjs-es6/metrics.cjs.gz +0 -0
  77. package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -1
  78. package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
  79. package/lib/cjs-es6/persisters/persister-browser.cjs +1 -1
  80. package/lib/cjs-es6/persisters/persister-browser.cjs.gz +0 -0
  81. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  82. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  83. package/lib/cjs-es6/persisters/persister-electric-sql.cjs +1 -1
  84. package/lib/cjs-es6/persisters/persister-electric-sql.cjs.gz +0 -0
  85. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs +1 -1
  86. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  87. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -1
  88. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
  89. package/lib/cjs-es6/persisters/persister-file.cjs +1 -1
  90. package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
  91. package/lib/cjs-es6/persisters/persister-indexed-db.cjs +1 -1
  92. package/lib/cjs-es6/persisters/persister-indexed-db.cjs.gz +0 -0
  93. package/lib/cjs-es6/persisters/persister-libsql.cjs +1 -0
  94. package/lib/cjs-es6/persisters/persister-libsql.cjs.gz +0 -0
  95. package/lib/cjs-es6/persisters/persister-partykit-client.cjs +1 -1
  96. package/lib/cjs-es6/persisters/persister-partykit-client.cjs.gz +0 -0
  97. package/lib/cjs-es6/persisters/persister-partykit-server.cjs +1 -1
  98. package/lib/cjs-es6/persisters/persister-partykit-server.cjs.gz +0 -0
  99. package/lib/cjs-es6/persisters/persister-powersync.cjs +1 -0
  100. package/lib/cjs-es6/persisters/persister-powersync.cjs.gz +0 -0
  101. package/lib/cjs-es6/persisters/persister-remote.cjs +1 -1
  102. package/lib/cjs-es6/persisters/persister-remote.cjs.gz +0 -0
  103. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -1
  104. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  105. package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -1
  106. package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
  107. package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -1
  108. package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
  109. package/lib/cjs-es6/persisters.cjs +1 -1
  110. package/lib/cjs-es6/persisters.cjs.gz +0 -0
  111. package/lib/cjs-es6/queries.cjs +1 -1
  112. package/lib/cjs-es6/queries.cjs.gz +0 -0
  113. package/lib/cjs-es6/relationships.cjs +1 -1
  114. package/lib/cjs-es6/relationships.cjs.gz +0 -0
  115. package/lib/cjs-es6/store.cjs +1 -1
  116. package/lib/cjs-es6/store.cjs.gz +0 -0
  117. package/lib/cjs-es6/synchronizers/synchronizer-local.cjs +1 -0
  118. package/lib/cjs-es6/synchronizers/synchronizer-local.cjs.gz +0 -0
  119. package/lib/cjs-es6/synchronizers/synchronizer-ws-client.cjs +1 -0
  120. package/lib/cjs-es6/synchronizers/synchronizer-ws-client.cjs.gz +0 -0
  121. package/lib/cjs-es6/synchronizers/synchronizer-ws-server.cjs +1 -0
  122. package/lib/cjs-es6/synchronizers/synchronizer-ws-server.cjs.gz +0 -0
  123. package/lib/cjs-es6/synchronizers.cjs +1 -0
  124. package/lib/cjs-es6/synchronizers.cjs.gz +0 -0
  125. package/lib/cjs-es6/tinybase.cjs +1 -1
  126. package/lib/cjs-es6/tinybase.cjs.gz +0 -0
  127. package/lib/cjs-es6/tools.cjs +1 -1
  128. package/lib/cjs-es6/tools.cjs.gz +0 -0
  129. package/lib/cjs-es6/ui-react-dom-debug.cjs +1 -1
  130. package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
  131. package/lib/cjs-es6/ui-react-dom.cjs +1 -1
  132. package/lib/cjs-es6/ui-react-dom.cjs.gz +0 -0
  133. package/lib/cjs-es6/ui-react.cjs +1 -1
  134. package/lib/cjs-es6/ui-react.cjs.gz +0 -0
  135. package/lib/debug/checkpoints.js +3 -1
  136. package/lib/debug/indexes.js +3 -1
  137. package/lib/debug/mergeable-store.js +2230 -0
  138. package/lib/debug/metrics.js +3 -1
  139. package/lib/debug/persisters/persister-automerge.js +167 -131
  140. package/lib/debug/persisters/persister-browser.js +155 -102
  141. package/lib/debug/persisters/persister-cr-sqlite-wasm.js +225 -152
  142. package/lib/debug/persisters/persister-electric-sql.js +225 -152
  143. package/lib/debug/persisters/persister-expo-sqlite-next.js +225 -152
  144. package/lib/debug/persisters/persister-expo-sqlite.js +225 -152
  145. package/lib/debug/persisters/persister-file.js +149 -101
  146. package/lib/debug/persisters/persister-indexed-db.js +146 -100
  147. package/lib/debug/persisters/persister-libsql.js +924 -0
  148. package/lib/debug/persisters/persister-partykit-client.js +146 -104
  149. package/lib/debug/persisters/persister-partykit-server.js +17 -25
  150. package/lib/debug/persisters/persister-powersync.js +939 -0
  151. package/lib/debug/persisters/persister-remote.js +141 -97
  152. package/lib/debug/persisters/persister-sqlite-wasm.js +225 -152
  153. package/lib/debug/persisters/persister-sqlite3.js +225 -152
  154. package/lib/debug/persisters/persister-yjs.js +164 -127
  155. package/lib/debug/persisters.js +137 -94
  156. package/lib/debug/queries.js +9 -6
  157. package/lib/debug/relationships.js +3 -1
  158. package/lib/debug/store.js +147 -126
  159. package/lib/debug/synchronizers/synchronizer-local.js +571 -0
  160. package/lib/debug/synchronizers/synchronizer-ws-client.js +598 -0
  161. package/lib/debug/synchronizers/synchronizer-ws-server.js +241 -0
  162. package/lib/debug/synchronizers.js +531 -0
  163. package/lib/debug/tinybase.js +1080 -215
  164. package/lib/debug/tools.js +22 -21
  165. package/lib/debug/ui-react-dom.js +336 -258
  166. package/lib/debug/ui-react.js +55 -6
  167. package/lib/es6/checkpoints.js +1 -1
  168. package/lib/es6/checkpoints.js.gz +0 -0
  169. package/lib/es6/indexes.js +1 -1
  170. package/lib/es6/indexes.js.gz +0 -0
  171. package/lib/es6/mergeable-store.js +1 -0
  172. package/lib/es6/mergeable-store.js.gz +0 -0
  173. package/lib/es6/metrics.js +1 -1
  174. package/lib/es6/metrics.js.gz +0 -0
  175. package/lib/es6/persisters/persister-automerge.js +1 -1
  176. package/lib/es6/persisters/persister-automerge.js.gz +0 -0
  177. package/lib/es6/persisters/persister-browser.js +1 -1
  178. package/lib/es6/persisters/persister-browser.js.gz +0 -0
  179. package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  180. package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  181. package/lib/es6/persisters/persister-electric-sql.js +1 -1
  182. package/lib/es6/persisters/persister-electric-sql.js.gz +0 -0
  183. package/lib/es6/persisters/persister-expo-sqlite-next.js +1 -1
  184. package/lib/es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  185. package/lib/es6/persisters/persister-expo-sqlite.js +1 -1
  186. package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
  187. package/lib/es6/persisters/persister-file.js +1 -1
  188. package/lib/es6/persisters/persister-file.js.gz +0 -0
  189. package/lib/es6/persisters/persister-indexed-db.js +1 -1
  190. package/lib/es6/persisters/persister-indexed-db.js.gz +0 -0
  191. package/lib/es6/persisters/persister-libsql.js +1 -0
  192. package/lib/es6/persisters/persister-libsql.js.gz +0 -0
  193. package/lib/es6/persisters/persister-partykit-client.js +1 -1
  194. package/lib/es6/persisters/persister-partykit-client.js.gz +0 -0
  195. package/lib/es6/persisters/persister-partykit-server.js +1 -1
  196. package/lib/es6/persisters/persister-partykit-server.js.gz +0 -0
  197. package/lib/es6/persisters/persister-powersync.js +1 -0
  198. package/lib/es6/persisters/persister-powersync.js.gz +0 -0
  199. package/lib/es6/persisters/persister-remote.js +1 -1
  200. package/lib/es6/persisters/persister-remote.js.gz +0 -0
  201. package/lib/es6/persisters/persister-sqlite-wasm.js +1 -1
  202. package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  203. package/lib/es6/persisters/persister-sqlite3.js +1 -1
  204. package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
  205. package/lib/es6/persisters/persister-yjs.js +1 -1
  206. package/lib/es6/persisters/persister-yjs.js.gz +0 -0
  207. package/lib/es6/persisters.js +1 -1
  208. package/lib/es6/persisters.js.gz +0 -0
  209. package/lib/es6/queries.js +1 -1
  210. package/lib/es6/queries.js.gz +0 -0
  211. package/lib/es6/relationships.js +1 -1
  212. package/lib/es6/relationships.js.gz +0 -0
  213. package/lib/es6/store.js +1 -1
  214. package/lib/es6/store.js.gz +0 -0
  215. package/lib/es6/synchronizers/synchronizer-local.js +1 -0
  216. package/lib/es6/synchronizers/synchronizer-local.js.gz +0 -0
  217. package/lib/es6/synchronizers/synchronizer-ws-client.js +1 -0
  218. package/lib/es6/synchronizers/synchronizer-ws-client.js.gz +0 -0
  219. package/lib/es6/synchronizers/synchronizer-ws-server.js +1 -0
  220. package/lib/es6/synchronizers/synchronizer-ws-server.js.gz +0 -0
  221. package/lib/es6/synchronizers.js +1 -0
  222. package/lib/es6/synchronizers.js.gz +0 -0
  223. package/lib/es6/tinybase.js +1 -1
  224. package/lib/es6/tinybase.js.gz +0 -0
  225. package/lib/es6/tools.js +1 -1
  226. package/lib/es6/tools.js.gz +0 -0
  227. package/lib/es6/ui-react-dom-debug.js +1 -1
  228. package/lib/es6/ui-react-dom-debug.js.gz +0 -0
  229. package/lib/es6/ui-react-dom.js +1 -1
  230. package/lib/es6/ui-react-dom.js.gz +0 -0
  231. package/lib/es6/ui-react.js +1 -1
  232. package/lib/es6/ui-react.js.gz +0 -0
  233. package/lib/indexes.js +1 -1
  234. package/lib/indexes.js.gz +0 -0
  235. package/lib/mergeable-store.js +1 -0
  236. package/lib/mergeable-store.js.gz +0 -0
  237. package/lib/metrics.js +1 -1
  238. package/lib/metrics.js.gz +0 -0
  239. package/lib/persisters/persister-automerge.js +1 -1
  240. package/lib/persisters/persister-automerge.js.gz +0 -0
  241. package/lib/persisters/persister-browser.js +1 -1
  242. package/lib/persisters/persister-browser.js.gz +0 -0
  243. package/lib/persisters/persister-cr-sqlite-wasm.js +1 -1
  244. package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  245. package/lib/persisters/persister-electric-sql.js +1 -1
  246. package/lib/persisters/persister-electric-sql.js.gz +0 -0
  247. package/lib/persisters/persister-expo-sqlite-next.js +1 -1
  248. package/lib/persisters/persister-expo-sqlite-next.js.gz +0 -0
  249. package/lib/persisters/persister-expo-sqlite.js +1 -1
  250. package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
  251. package/lib/persisters/persister-file.js +1 -1
  252. package/lib/persisters/persister-file.js.gz +0 -0
  253. package/lib/persisters/persister-indexed-db.js +1 -1
  254. package/lib/persisters/persister-indexed-db.js.gz +0 -0
  255. package/lib/persisters/persister-libsql.js +1 -0
  256. package/lib/persisters/persister-libsql.js.gz +0 -0
  257. package/lib/persisters/persister-partykit-client.js +1 -1
  258. package/lib/persisters/persister-partykit-client.js.gz +0 -0
  259. package/lib/persisters/persister-partykit-server.js +1 -1
  260. package/lib/persisters/persister-partykit-server.js.gz +0 -0
  261. package/lib/persisters/persister-powersync.js +1 -0
  262. package/lib/persisters/persister-powersync.js.gz +0 -0
  263. package/lib/persisters/persister-remote.js +1 -1
  264. package/lib/persisters/persister-remote.js.gz +0 -0
  265. package/lib/persisters/persister-sqlite-wasm.js +1 -1
  266. package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
  267. package/lib/persisters/persister-sqlite3.js +1 -1
  268. package/lib/persisters/persister-sqlite3.js.gz +0 -0
  269. package/lib/persisters/persister-yjs.js +1 -1
  270. package/lib/persisters/persister-yjs.js.gz +0 -0
  271. package/lib/persisters.js +1 -1
  272. package/lib/persisters.js.gz +0 -0
  273. package/lib/queries.js +1 -1
  274. package/lib/queries.js.gz +0 -0
  275. package/lib/relationships.js +1 -1
  276. package/lib/relationships.js.gz +0 -0
  277. package/lib/store.js +1 -1
  278. package/lib/store.js.gz +0 -0
  279. package/lib/synchronizers/synchronizer-local.js +1 -0
  280. package/lib/synchronizers/synchronizer-local.js.gz +0 -0
  281. package/lib/synchronizers/synchronizer-ws-client.js +1 -0
  282. package/lib/synchronizers/synchronizer-ws-client.js.gz +0 -0
  283. package/lib/synchronizers/synchronizer-ws-server.js +1 -0
  284. package/lib/synchronizers/synchronizer-ws-server.js.gz +0 -0
  285. package/lib/synchronizers.js +1 -0
  286. package/lib/synchronizers.js.gz +0 -0
  287. package/lib/tinybase.js +1 -1
  288. package/lib/tinybase.js.gz +0 -0
  289. package/lib/tools.js +1 -1
  290. package/lib/tools.js.gz +0 -0
  291. package/lib/types/checkpoints.d.ts +2 -2
  292. package/lib/types/indexes.d.ts +2 -2
  293. package/lib/types/mergeable-store.d.ts +214 -0
  294. package/lib/types/metrics.d.ts +2 -2
  295. package/lib/types/persisters/persister-automerge.d.ts +11 -7
  296. package/lib/types/persisters/persister-browser.d.ts +13 -4
  297. package/lib/types/persisters/persister-cr-sqlite-wasm.d.ts +4 -0
  298. package/lib/types/persisters/persister-electric-sql.d.ts +4 -0
  299. package/lib/types/persisters/persister-expo-sqlite-next.d.ts +4 -0
  300. package/lib/types/persisters/persister-expo-sqlite.d.ts +4 -0
  301. package/lib/types/persisters/persister-file.d.ts +7 -2
  302. package/lib/types/persisters/persister-indexed-db.d.ts +4 -0
  303. package/lib/types/persisters/persister-libsql.d.ts +142 -0
  304. package/lib/types/persisters/persister-partykit-client.d.ts +4 -0
  305. package/lib/types/persisters/persister-partykit-server.d.ts +12 -8
  306. package/lib/types/persisters/persister-powersync.d.ts +157 -0
  307. package/lib/types/persisters/persister-remote.d.ts +4 -0
  308. package/lib/types/persisters/persister-sqlite-wasm.d.ts +4 -0
  309. package/lib/types/persisters/persister-sqlite3.d.ts +4 -0
  310. package/lib/types/persisters/persister-yjs.d.ts +6 -2
  311. package/lib/types/persisters.d.ts +162 -59
  312. package/lib/types/queries.d.ts +2 -2
  313. package/lib/types/relationships.d.ts +2 -2
  314. package/lib/types/store.d.ts +275 -187
  315. package/lib/types/synchronizers/synchronizer-local.d.ts +27 -0
  316. package/lib/types/synchronizers/synchronizer-ws-client.d.ts +35 -0
  317. package/lib/types/synchronizers/synchronizer-ws-server.d.ts +57 -0
  318. package/lib/types/synchronizers.d.ts +132 -0
  319. package/lib/types/tinybase.d.ts +10 -8
  320. package/lib/types/tools.d.ts +4 -4
  321. package/lib/types/ui-react.d.ts +160 -9
  322. package/lib/types/with-schemas/checkpoints.d.ts +2 -2
  323. package/lib/types/with-schemas/indexes.d.ts +2 -2
  324. package/lib/types/with-schemas/internal/store.d.ts +4 -0
  325. package/lib/types/with-schemas/mergeable-store.d.ts +492 -0
  326. package/lib/types/with-schemas/metrics.d.ts +2 -2
  327. package/lib/types/with-schemas/persisters/persister-automerge.d.ts +12 -8
  328. package/lib/types/with-schemas/persisters/persister-browser.d.ts +17 -8
  329. package/lib/types/with-schemas/persisters/persister-cr-sqlite-wasm.d.ts +5 -1
  330. package/lib/types/with-schemas/persisters/persister-electric-sql.d.ts +5 -1
  331. package/lib/types/with-schemas/persisters/persister-expo-sqlite-next.d.ts +5 -1
  332. package/lib/types/with-schemas/persisters/persister-expo-sqlite.d.ts +5 -1
  333. package/lib/types/with-schemas/persisters/persister-file.d.ts +9 -4
  334. package/lib/types/with-schemas/persisters/persister-indexed-db.d.ts +5 -1
  335. package/lib/types/with-schemas/persisters/persister-libsql.d.ts +155 -0
  336. package/lib/types/with-schemas/persisters/persister-partykit-client.d.ts +5 -1
  337. package/lib/types/with-schemas/persisters/persister-partykit-server.d.ts +15 -11
  338. package/lib/types/with-schemas/persisters/persister-powersync.d.ts +170 -0
  339. package/lib/types/with-schemas/persisters/persister-remote.d.ts +5 -1
  340. package/lib/types/with-schemas/persisters/persister-sqlite-wasm.d.ts +5 -1
  341. package/lib/types/with-schemas/persisters/persister-sqlite3.d.ts +5 -1
  342. package/lib/types/with-schemas/persisters/persister-yjs.d.ts +7 -3
  343. package/lib/types/with-schemas/persisters.d.ts +193 -121
  344. package/lib/types/with-schemas/queries.d.ts +3 -3
  345. package/lib/types/with-schemas/relationships.d.ts +2 -2
  346. package/lib/types/with-schemas/store.d.ts +483 -345
  347. package/lib/types/with-schemas/synchronizers/synchronizer-local.d.ts +29 -0
  348. package/lib/types/with-schemas/synchronizers/synchronizer-ws-client.d.ts +41 -0
  349. package/lib/types/with-schemas/synchronizers/synchronizer-ws-server.d.ts +57 -0
  350. package/lib/types/with-schemas/synchronizers.d.ts +146 -0
  351. package/lib/types/with-schemas/tinybase.d.ts +9 -8
  352. package/lib/types/with-schemas/tools.d.ts +4 -4
  353. package/lib/types/with-schemas/ui-react.d.ts +177 -9
  354. package/lib/ui-react-dom.js +1 -1
  355. package/lib/ui-react-dom.js.gz +0 -0
  356. package/lib/ui-react.js +1 -1
  357. package/lib/ui-react.js.gz +0 -0
  358. package/lib/umd/checkpoints.js +1 -1
  359. package/lib/umd/checkpoints.js.gz +0 -0
  360. package/lib/umd/indexes.js +1 -1
  361. package/lib/umd/indexes.js.gz +0 -0
  362. package/lib/umd/mergeable-store.js +1 -0
  363. package/lib/umd/mergeable-store.js.gz +0 -0
  364. package/lib/umd/metrics.js +1 -1
  365. package/lib/umd/metrics.js.gz +0 -0
  366. package/lib/umd/persisters/persister-automerge.js +1 -1
  367. package/lib/umd/persisters/persister-automerge.js.gz +0 -0
  368. package/lib/umd/persisters/persister-browser.js +1 -1
  369. package/lib/umd/persisters/persister-browser.js.gz +0 -0
  370. package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
  371. package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  372. package/lib/umd/persisters/persister-electric-sql.js +1 -1
  373. package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
  374. package/lib/umd/persisters/persister-expo-sqlite-next.js +1 -1
  375. package/lib/umd/persisters/persister-expo-sqlite-next.js.gz +0 -0
  376. package/lib/umd/persisters/persister-expo-sqlite.js +1 -1
  377. package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
  378. package/lib/umd/persisters/persister-file.js +1 -1
  379. package/lib/umd/persisters/persister-file.js.gz +0 -0
  380. package/lib/umd/persisters/persister-indexed-db.js +1 -1
  381. package/lib/umd/persisters/persister-indexed-db.js.gz +0 -0
  382. package/lib/umd/persisters/persister-libsql.js +1 -0
  383. package/lib/umd/persisters/persister-libsql.js.gz +0 -0
  384. package/lib/umd/persisters/persister-partykit-client.js +1 -1
  385. package/lib/umd/persisters/persister-partykit-client.js.gz +0 -0
  386. package/lib/umd/persisters/persister-partykit-server.js +1 -1
  387. package/lib/umd/persisters/persister-partykit-server.js.gz +0 -0
  388. package/lib/umd/persisters/persister-powersync.js +1 -0
  389. package/lib/umd/persisters/persister-powersync.js.gz +0 -0
  390. package/lib/umd/persisters/persister-remote.js +1 -1
  391. package/lib/umd/persisters/persister-remote.js.gz +0 -0
  392. package/lib/umd/persisters/persister-sqlite-wasm.js +1 -1
  393. package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
  394. package/lib/umd/persisters/persister-sqlite3.js +1 -1
  395. package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
  396. package/lib/umd/persisters/persister-yjs.js +1 -1
  397. package/lib/umd/persisters/persister-yjs.js.gz +0 -0
  398. package/lib/umd/persisters.js +1 -1
  399. package/lib/umd/persisters.js.gz +0 -0
  400. package/lib/umd/queries.js +1 -1
  401. package/lib/umd/queries.js.gz +0 -0
  402. package/lib/umd/relationships.js +1 -1
  403. package/lib/umd/relationships.js.gz +0 -0
  404. package/lib/umd/store.js +1 -1
  405. package/lib/umd/store.js.gz +0 -0
  406. package/lib/umd/synchronizers/synchronizer-local.js +1 -0
  407. package/lib/umd/synchronizers/synchronizer-local.js.gz +0 -0
  408. package/lib/umd/synchronizers/synchronizer-ws-client.js +1 -0
  409. package/lib/umd/synchronizers/synchronizer-ws-client.js.gz +0 -0
  410. package/lib/umd/synchronizers/synchronizer-ws-server.js +1 -0
  411. package/lib/umd/synchronizers/synchronizer-ws-server.js.gz +0 -0
  412. package/lib/umd/synchronizers.js +1 -0
  413. package/lib/umd/synchronizers.js.gz +0 -0
  414. package/lib/umd/tinybase.js +1 -1
  415. package/lib/umd/tinybase.js.gz +0 -0
  416. package/lib/umd/tools.js +1 -1
  417. package/lib/umd/tools.js.gz +0 -0
  418. package/lib/umd/ui-react-dom-debug.js +1 -1
  419. package/lib/umd/ui-react-dom-debug.js.gz +0 -0
  420. package/lib/umd/ui-react-dom.js +1 -1
  421. package/lib/umd/ui-react-dom.js.gz +0 -0
  422. package/lib/umd/ui-react.js +1 -1
  423. package/lib/umd/ui-react.js.gz +0 -0
  424. package/lib/umd-es6/checkpoints.js +1 -1
  425. package/lib/umd-es6/checkpoints.js.gz +0 -0
  426. package/lib/umd-es6/indexes.js +1 -1
  427. package/lib/umd-es6/indexes.js.gz +0 -0
  428. package/lib/umd-es6/mergeable-store.js +1 -0
  429. package/lib/umd-es6/mergeable-store.js.gz +0 -0
  430. package/lib/umd-es6/metrics.js +1 -1
  431. package/lib/umd-es6/metrics.js.gz +0 -0
  432. package/lib/umd-es6/persisters/persister-automerge.js +1 -1
  433. package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
  434. package/lib/umd-es6/persisters/persister-browser.js +1 -1
  435. package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
  436. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  437. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  438. package/lib/umd-es6/persisters/persister-electric-sql.js +1 -1
  439. package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
  440. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js +1 -1
  441. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  442. package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -1
  443. package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
  444. package/lib/umd-es6/persisters/persister-file.js +1 -1
  445. package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
  446. package/lib/umd-es6/persisters/persister-indexed-db.js +1 -1
  447. package/lib/umd-es6/persisters/persister-indexed-db.js.gz +0 -0
  448. package/lib/umd-es6/persisters/persister-libsql.js +1 -0
  449. package/lib/umd-es6/persisters/persister-libsql.js.gz +0 -0
  450. package/lib/umd-es6/persisters/persister-partykit-client.js +1 -1
  451. package/lib/umd-es6/persisters/persister-partykit-client.js.gz +0 -0
  452. package/lib/umd-es6/persisters/persister-partykit-server.js +1 -1
  453. package/lib/umd-es6/persisters/persister-partykit-server.js.gz +0 -0
  454. package/lib/umd-es6/persisters/persister-powersync.js +1 -0
  455. package/lib/umd-es6/persisters/persister-powersync.js.gz +0 -0
  456. package/lib/umd-es6/persisters/persister-remote.js +1 -1
  457. package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
  458. package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -1
  459. package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  460. package/lib/umd-es6/persisters/persister-sqlite3.js +1 -1
  461. package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
  462. package/lib/umd-es6/persisters/persister-yjs.js +1 -1
  463. package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
  464. package/lib/umd-es6/persisters.js +1 -1
  465. package/lib/umd-es6/persisters.js.gz +0 -0
  466. package/lib/umd-es6/queries.js +1 -1
  467. package/lib/umd-es6/queries.js.gz +0 -0
  468. package/lib/umd-es6/relationships.js +1 -1
  469. package/lib/umd-es6/relationships.js.gz +0 -0
  470. package/lib/umd-es6/store.js +1 -1
  471. package/lib/umd-es6/store.js.gz +0 -0
  472. package/lib/umd-es6/synchronizers/synchronizer-local.js +1 -0
  473. package/lib/umd-es6/synchronizers/synchronizer-local.js.gz +0 -0
  474. package/lib/umd-es6/synchronizers/synchronizer-ws-client.js +1 -0
  475. package/lib/umd-es6/synchronizers/synchronizer-ws-client.js.gz +0 -0
  476. package/lib/umd-es6/synchronizers/synchronizer-ws-server.js +1 -0
  477. package/lib/umd-es6/synchronizers/synchronizer-ws-server.js.gz +0 -0
  478. package/lib/umd-es6/synchronizers.js +1 -0
  479. package/lib/umd-es6/synchronizers.js.gz +0 -0
  480. package/lib/umd-es6/tinybase.js +1 -1
  481. package/lib/umd-es6/tinybase.js.gz +0 -0
  482. package/lib/umd-es6/tools.js +1 -1
  483. package/lib/umd-es6/tools.js.gz +0 -0
  484. package/lib/umd-es6/ui-react-dom-debug.js +1 -1
  485. package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
  486. package/lib/umd-es6/ui-react-dom.js +1 -1
  487. package/lib/umd-es6/ui-react-dom.js.gz +0 -0
  488. package/lib/umd-es6/ui-react.js +1 -1
  489. package/lib/umd-es6/ui-react.js.gz +0 -0
  490. package/package.json +65 -45
  491. package/readme.md +2 -2
@@ -124,9 +124,7 @@ const arrayShift = (array) => array.shift();
124
124
  const object = Object;
125
125
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
126
126
  const objEntries = object.entries;
127
- const objIds = object.keys;
128
127
  const objFrozen = object.isFrozen;
129
- const objFreeze = object.freeze;
130
128
  const isObject = (obj) =>
131
129
  !isUndefined(obj) &&
132
130
  ifNotUndefined(
@@ -137,23 +135,52 @@ const isObject = (obj) =>
137
135
  /* istanbul ignore next */
138
136
  () => true,
139
137
  );
138
+ const objIds = object.keys;
139
+ const objFreeze = object.freeze;
140
140
  const objNew = (entries = []) => object.fromEntries(entries);
141
- const objGet = (obj, id) => ifNotUndefined(obj, (obj2) => obj2[id]);
142
- const objHas = (obj, id) => !isUndefined(objGet(obj, id));
141
+ const objHas = (obj, id) => id in obj;
143
142
  const objDel = (obj, id) => {
144
143
  delete obj[id];
145
144
  return obj;
146
145
  };
147
- const objMap = (obj, cb) =>
146
+ const objToArray = (obj, cb) =>
148
147
  arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
148
+ const objMap = (obj, cb) =>
149
+ objNew(objToArray(obj, (value, id) => [id, cb(value, id)]));
149
150
  const objSize = (obj) => size(objIds(obj));
150
151
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
152
+ const objValidate = (obj, validateChild, onInvalidObj, emptyIsValid = 0) => {
153
+ if (
154
+ isUndefined(obj) ||
155
+ !isObject(obj) ||
156
+ (!emptyIsValid && objIsEmpty(obj)) ||
157
+ objFrozen(obj)
158
+ ) {
159
+ onInvalidObj?.();
160
+ return false;
161
+ }
162
+ objToArray(obj, (child, id) => {
163
+ if (!validateChild(child, id)) {
164
+ objDel(obj, id);
165
+ }
166
+ });
167
+ return emptyIsValid ? true : !objIsEmpty(obj);
168
+ };
151
169
 
152
- const jsonString = (obj) =>
170
+ const UNDEFINED_MARKER = '\uFFFC';
171
+ const jsonStringWithMap = (obj) =>
153
172
  JSON.stringify(obj, (_key, value) =>
154
173
  isInstanceOf(value, Map) ? object.fromEntries([...value]) : value,
155
174
  );
156
175
  const jsonParse = JSON.parse;
176
+ const jsonStringWithUndefined = (obj) =>
177
+ JSON.stringify(obj, (_key, value) =>
178
+ value === void 0 ? UNDEFINED_MARKER : value,
179
+ );
180
+ const jsonParseWithUndefined = (str) =>
181
+ JSON.parse(str, (_key, value) =>
182
+ value === UNDEFINED_MARKER ? void 0 : value,
183
+ );
157
184
 
158
185
  const UNIQUE_ID = 'tinybaseStoreInspector';
159
186
  const TITLE = 'TinyBase Store Inspector';
@@ -164,7 +191,7 @@ const OPEN_CELL = 'open';
164
191
  const POSITION_VALUE = 'position';
165
192
  const OPEN_VALUE = OPEN_CELL;
166
193
  const EDITABLE_CELL = 'editable';
167
- const getUniqueId = (...args) => jsonString(args);
194
+ const getUniqueId = (...args) => jsonStringWithMap(args);
168
195
  const sortedIdsMap = (ids, callback) => arrayMap(arraySort(ids), callback);
169
196
  const useEditable = (uniqueId, s) => [
170
197
  !!useCell(STATE_TABLE, uniqueId, EDITABLE_CELL, s),
@@ -207,7 +234,7 @@ const DONE_SVG = PRE + `<path d='${PENCIL}M20 20l60 60' />` + POST;
207
234
 
208
235
  const SCROLLBAR = '*::-webkit-scrollbar';
209
236
  const APP_STYLESHEET = arrayJoin(
210
- objMap(
237
+ objToArray(
211
238
  {
212
239
  '': 'all:initial;font-family:sans-serif;font-size:0.75rem;position:fixed;z-index:999999',
213
240
  '*': 'all:revert',
@@ -333,9 +360,10 @@ const Details = ({
333
360
  );
334
361
  };
335
362
 
336
- const getCellOrValueType = (cell) => {
337
- const type = getTypeOf(cell);
338
- return isTypeStringOrBoolean(type) || (type == NUMBER && isFiniteNumber(cell))
363
+ const getCellOrValueType = (cellOrValue) => {
364
+ const type = getTypeOf(cellOrValue);
365
+ return isTypeStringOrBoolean(type) ||
366
+ (type == NUMBER && isFiniteNumber(cellOrValue))
339
367
  ? type
340
368
  : void 0;
341
369
  };
@@ -433,21 +461,16 @@ const useSortingAndPagination = (
433
461
  const useCells = (defaultCellIds, customCells, defaultCellComponent) =>
434
462
  useMemo(() => {
435
463
  const cellIds = customCells ?? defaultCellIds;
436
- return objNew(
437
- objMap(
438
- isArray(cellIds)
439
- ? objNew(arrayMap(cellIds, (cellId) => [cellId, cellId]))
440
- : cellIds,
441
- (labelOrCustomCell, cellId) => [
442
- cellId,
443
- {
444
- ...{label: cellId, component: defaultCellComponent},
445
- ...(isString(labelOrCustomCell)
446
- ? {label: labelOrCustomCell}
447
- : labelOrCustomCell),
448
- },
449
- ],
450
- ),
464
+ return objMap(
465
+ isArray(cellIds)
466
+ ? objNew(arrayMap(cellIds, (cellId) => [cellId, cellId]))
467
+ : cellIds,
468
+ (labelOrCustomCell, cellId) => ({
469
+ ...{label: cellId, component: defaultCellComponent},
470
+ ...(isString(labelOrCustomCell)
471
+ ? {label: labelOrCustomCell}
472
+ : labelOrCustomCell),
473
+ }),
451
474
  );
452
475
  }, [customCells, defaultCellComponent, defaultCellIds]);
453
476
  const HtmlTable = ({
@@ -484,7 +507,7 @@ const HtmlTable = ({
484
507
  label: 'Id',
485
508
  onClick: handleSort,
486
509
  }),
487
- objMap(cells, ({label}, cellId) =>
510
+ objToArray(cells, ({label}, cellId) =>
488
511
  /* @__PURE__ */ createElement(HtmlHeaderCell, {
489
512
  key: cellId,
490
513
  cellId,
@@ -505,17 +528,19 @@ const HtmlTable = ({
505
528
  idColumn === false
506
529
  ? null
507
530
  : /* @__PURE__ */ createElement('th', null, rowId),
508
- objMap(cells, ({component: CellView2, getComponentProps}, cellId) =>
509
- /* @__PURE__ */ createElement(
510
- 'td',
511
- {key: cellId},
512
- /* @__PURE__ */ createElement(CellView2, {
513
- ...getProps(getComponentProps, rowId, cellId),
514
- ...cellComponentProps,
515
- rowId,
516
- cellId,
517
- }),
518
- ),
531
+ objToArray(
532
+ cells,
533
+ ({component: CellView2, getComponentProps}, cellId) =>
534
+ /* @__PURE__ */ createElement(
535
+ 'td',
536
+ {key: cellId},
537
+ /* @__PURE__ */ createElement(CellView2, {
538
+ ...getProps(getComponentProps, rowId, cellId),
539
+ ...cellComponentProps,
540
+ rowId,
541
+ cellId,
542
+ }),
543
+ ),
519
544
  ),
520
545
  ),
521
546
  ),
@@ -569,7 +594,7 @@ const RelationshipInHtmlRow = ({
569
594
  /* @__PURE__ */ createElement('th', null, localRowId),
570
595
  /* @__PURE__ */ createElement('th', null, remoteRowId),
571
596
  ),
572
- objMap(
597
+ objToArray(
573
598
  cells,
574
599
  ({component: CellView2, getComponentProps}, compoundCellId) => {
575
600
  const [tableId, cellId] = compoundCellId.split(DOT, 2);
@@ -885,7 +910,7 @@ const RelationshipInHtmlTable = ({
885
910
  '.Id',
886
911
  ),
887
912
  ),
888
- objMap(cells, ({label}, cellId) =>
913
+ objToArray(cells, ({label}, cellId) =>
889
914
  /* @__PURE__ */ createElement('th', {key: cellId}, label),
890
915
  ),
891
916
  ),
@@ -1165,7 +1190,7 @@ const QueryView = ({queries, queriesId, queryId, s}) => {
1165
1190
  STATE_TABLE,
1166
1191
  uniqueId,
1167
1192
  SORT_CELL,
1168
- jsonString,
1193
+ jsonStringWithMap,
1169
1194
  [],
1170
1195
  s,
1171
1196
  );
@@ -1270,7 +1295,7 @@ const TableView = ({tableId, store, storeId, s}) => {
1270
1295
  STATE_TABLE,
1271
1296
  uniqueId,
1272
1297
  SORT_CELL,
1273
- jsonString,
1298
+ jsonStringWithMap,
1274
1299
  [],
1275
1300
  s,
1276
1301
  );
@@ -1531,35 +1556,41 @@ const mapMap = (coll, cb) =>
1531
1556
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
1532
1557
  const mapSet = (map, key, value) =>
1533
1558
  isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
1534
- const mapEnsure = (map, key, getDefaultValue) => {
1559
+ const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
1535
1560
  if (!collHas(map, key)) {
1536
1561
  mapSet(map, key, getDefaultValue());
1562
+ } else {
1563
+ hadExistingValue?.(mapGet(map, key));
1537
1564
  }
1538
1565
  return mapGet(map, key);
1539
1566
  };
1540
1567
  const mapMatch = (map, obj, set, del = mapSet) => {
1541
- objMap(obj, (value, id) => set(map, id, value));
1568
+ objToArray(obj, (value, id) => set(map, id, value));
1542
1569
  mapForEach(map, (id) => (objHas(obj, id) ? 0 : del(map, id)));
1543
1570
  return map;
1544
1571
  };
1545
- const mapToObj = (map, mapValue, excludeValue) => {
1572
+ const mapToObj = (map, valueMapper, excludeMapValue, excludeObjValue) => {
1546
1573
  const obj = {};
1547
- collForEach(map, (value, id) => {
1548
- const mappedValue = mapValue ? mapValue(value, id) : value;
1549
- excludeValue?.(mappedValue, value) ? 0 : (obj[id] = mappedValue);
1574
+ collForEach(map, (mapValue, id) => {
1575
+ if (!excludeMapValue?.(mapValue, id)) {
1576
+ const objValue = valueMapper ? valueMapper(mapValue, id) : mapValue;
1577
+ excludeObjValue?.(objValue) ? 0 : (obj[id] = objValue);
1578
+ }
1550
1579
  });
1551
1580
  return obj;
1552
1581
  };
1553
- const mapToObj2 = (map, mapValue, excludeValue) =>
1582
+ const mapToObj2 = (map, valueMapper, excludeMapValue) =>
1554
1583
  mapToObj(
1555
1584
  map,
1556
- (childMap) => mapToObj(childMap, mapValue, excludeValue),
1585
+ (childMap) => mapToObj(childMap, valueMapper, excludeMapValue),
1586
+ collIsEmpty,
1557
1587
  objIsEmpty,
1558
1588
  );
1559
- const mapToObj3 = (map, mapValue, excludeValue) =>
1589
+ const mapToObj3 = (map, valueMapper, excludeMapValue) =>
1560
1590
  mapToObj(
1561
1591
  map,
1562
- (childMap) => mapToObj2(childMap, mapValue, excludeValue),
1592
+ (childMap) => mapToObj2(childMap, valueMapper, excludeMapValue),
1593
+ collIsEmpty,
1563
1594
  objIsEmpty,
1564
1595
  );
1565
1596
  const mapClone = (map, mapValue) => {
@@ -1593,6 +1624,27 @@ const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
1593
1624
 
1594
1625
  const scheduleRunning = mapNew();
1595
1626
  const scheduleActions = mapNew();
1627
+ const getStoreFunctions = (supportedStoreType = 1, store) =>
1628
+ supportedStoreType > 1 && 'getMergeableContent' in store
1629
+ ? [
1630
+ 1,
1631
+ store.getMergeableContent,
1632
+ store.getTransactionMergeableChanges,
1633
+ ([[changedTables], [changedValues]]) =>
1634
+ !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
1635
+ store.setDefaultContent,
1636
+ ]
1637
+ : supportedStoreType != 2
1638
+ ? [
1639
+ 0,
1640
+ store.getContent,
1641
+ store.getTransactionChanges,
1642
+ ([changedTables, changedValues]) =>
1643
+ !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
1644
+ store.setContent,
1645
+ ]
1646
+ : /* istanbul ignore next */
1647
+ 0;
1596
1648
  const createCustomPersister = (
1597
1649
  store,
1598
1650
  getPersisted,
@@ -1600,18 +1652,25 @@ const createCustomPersister = (
1600
1652
  addPersisterListener,
1601
1653
  delPersisterListener,
1602
1654
  onIgnoredError,
1603
- [getThing, thing] = [],
1655
+ supportedStoreType,
1656
+ extra = {},
1604
1657
  scheduleId = [],
1605
1658
  ) => {
1606
- let listenerId;
1607
1659
  let loadSave = 0;
1608
1660
  let loads = 0;
1609
1661
  let saves = 0;
1610
- let listening = 0;
1611
1662
  let action;
1612
- let listeningHandle;
1663
+ let autoLoadHandle;
1664
+ let autoSaveListenerId;
1613
1665
  mapEnsure(scheduleRunning, scheduleId, () => 0);
1614
1666
  mapEnsure(scheduleActions, scheduleId, () => []);
1667
+ const [
1668
+ isMergeableStore,
1669
+ getContent,
1670
+ getChanges,
1671
+ hasChanges,
1672
+ setDefaultContent,
1673
+ ] = getStoreFunctions(supportedStoreType, store);
1615
1674
  const run = async () => {
1616
1675
  /* istanbul ignore else */
1617
1676
  if (!mapGet(scheduleRunning, scheduleId)) {
@@ -1629,109 +1688,121 @@ const createCustomPersister = (
1629
1688
  mapSet(scheduleRunning, scheduleId, 0);
1630
1689
  }
1631
1690
  };
1632
- const loadLock = async (actions) => {
1691
+ const setContentOrChanges = (contentOrChanges) => {
1692
+ (isMergeableStore && isArray(contentOrChanges?.[0])
1693
+ ? contentOrChanges?.[2] === 1
1694
+ ? store.applyMergeableChanges
1695
+ : store.setMergeableContent
1696
+ : contentOrChanges?.[2] === 1
1697
+ ? store.applyChanges
1698
+ : store.setContent)(contentOrChanges);
1699
+ };
1700
+ const load = async (initialContent) => {
1633
1701
  /* istanbul ignore else */
1634
1702
  if (loadSave != 2) {
1635
1703
  loadSave = 1;
1636
1704
  {
1637
1705
  loads++;
1638
1706
  }
1639
- await persister.schedule(async () => {
1640
- await actions();
1707
+ await schedule(async () => {
1708
+ try {
1709
+ setContentOrChanges(await getPersisted());
1710
+ } catch (error) {
1711
+ onIgnoredError?.(error);
1712
+ if (initialContent) {
1713
+ setDefaultContent(initialContent);
1714
+ }
1715
+ }
1641
1716
  loadSave = 0;
1642
1717
  });
1643
1718
  }
1644
1719
  return persister;
1645
1720
  };
1646
- const persister = {
1647
- load: async (initialTables, initialValues) =>
1648
- await loadLock(async () => {
1649
- try {
1650
- store.setContent(await getPersisted());
1651
- } catch {
1652
- store.setContent([initialTables, initialValues]);
1653
- }
1654
- }),
1655
- startAutoLoad: async (initialTables = {}, initialValues = {}) => {
1656
- persister.stopAutoLoad();
1657
- await persister.load(initialTables, initialValues);
1658
- listening = 1;
1659
- listeningHandle = addPersisterListener(
1660
- async (getContent, getTransactionChanges) => {
1661
- if (getTransactionChanges) {
1662
- const transactionChanges = getTransactionChanges();
1663
- await loadLock(async () =>
1664
- store.setTransactionChanges(transactionChanges),
1665
- );
1666
- } else {
1667
- await loadLock(async () => {
1668
- try {
1669
- store.setContent(getContent?.() ?? (await getPersisted()));
1670
- } catch (error) {
1671
- onIgnoredError?.(error);
1672
- }
1673
- });
1721
+ const startAutoLoad = async (initialContent) => {
1722
+ await stopAutoLoad().load(initialContent);
1723
+ autoLoadHandle = addPersisterListener(async (content, changes) => {
1724
+ if (changes || content) {
1725
+ /* istanbul ignore else */
1726
+ if (loadSave != 2) {
1727
+ loadSave = 1;
1728
+ {
1729
+ loads++;
1674
1730
  }
1675
- },
1676
- );
1677
- return persister;
1678
- },
1679
- stopAutoLoad: () => {
1680
- if (listening) {
1681
- delPersisterListener(listeningHandle);
1682
- listeningHandle = void 0;
1683
- listening = 0;
1731
+ setContentOrChanges(changes ?? content);
1732
+ loadSave = 0;
1733
+ }
1734
+ } else {
1735
+ await load();
1684
1736
  }
1685
- return persister;
1686
- },
1687
- save: async (getTransactionChanges) => {
1688
- /* istanbul ignore else */
1689
- if (loadSave != 1) {
1690
- loadSave = 2;
1691
- {
1692
- saves++;
1737
+ });
1738
+ return persister;
1739
+ };
1740
+ const stopAutoLoad = () => {
1741
+ if (autoLoadHandle) {
1742
+ delPersisterListener(autoLoadHandle);
1743
+ autoLoadHandle = void 0;
1744
+ }
1745
+ return persister;
1746
+ };
1747
+ const isAutoLoading = () => !isUndefined(autoLoadHandle);
1748
+ const save = async (changes) => {
1749
+ /* istanbul ignore else */
1750
+ if (loadSave != 1) {
1751
+ loadSave = 2;
1752
+ {
1753
+ saves++;
1754
+ }
1755
+ await schedule(async () => {
1756
+ try {
1757
+ await setPersisted(getContent, changes);
1758
+ } catch (error) {
1759
+ /* istanbul ignore next */
1760
+ onIgnoredError?.(error);
1693
1761
  }
1694
- await persister.schedule(async () => {
1695
- try {
1696
- await setPersisted(store.getContent, getTransactionChanges);
1697
- } catch (error) {
1698
- /* istanbul ignore next */
1699
- onIgnoredError?.(error);
1700
- }
1701
- loadSave = 0;
1702
- });
1762
+ loadSave = 0;
1763
+ });
1764
+ }
1765
+ return persister;
1766
+ };
1767
+ const startAutoSave = async () => {
1768
+ await stopAutoSave().save();
1769
+ autoSaveListenerId = store.addDidFinishTransactionListener(() => {
1770
+ const changes = getChanges();
1771
+ if (hasChanges(changes)) {
1772
+ save(changes);
1703
1773
  }
1704
- return persister;
1705
- },
1706
- startAutoSave: async () => {
1707
- await persister.stopAutoSave().save();
1708
- listenerId = store.addDidFinishTransactionListener(
1709
- (_store, getTransactionChanges) => {
1710
- const [tableChanges, valueChanges] = getTransactionChanges();
1711
- if (!objIsEmpty(tableChanges) || !objIsEmpty(valueChanges)) {
1712
- persister.save(() => [tableChanges, valueChanges]);
1713
- }
1714
- },
1715
- );
1716
- return persister;
1717
- },
1718
- stopAutoSave: () => {
1719
- ifNotUndefined(listenerId, store.delListener);
1720
- listenerId = void 0;
1721
- return persister;
1722
- },
1723
- schedule: async (...actions) => {
1724
- arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
1725
- await run();
1726
- return persister;
1727
- },
1728
- getStore: () => store,
1729
- destroy: () => persister.stopAutoLoad().stopAutoSave(),
1730
- getStats: () => ({loads, saves}),
1774
+ });
1775
+ return persister;
1776
+ };
1777
+ const stopAutoSave = () => {
1778
+ ifNotUndefined(autoSaveListenerId, store.delListener);
1779
+ autoSaveListenerId = void 0;
1780
+ return persister;
1781
+ };
1782
+ const isAutoSaving = () => !isUndefined(autoSaveListenerId);
1783
+ const schedule = async (...actions) => {
1784
+ arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
1785
+ await run();
1786
+ return persister;
1787
+ };
1788
+ const getStore = () => store;
1789
+ const destroy = () => stopAutoLoad().stopAutoSave();
1790
+ const getStats = () => ({loads, saves});
1791
+ const persister = {
1792
+ load,
1793
+ startAutoLoad,
1794
+ stopAutoLoad,
1795
+ isAutoLoading,
1796
+ save,
1797
+ startAutoSave,
1798
+ stopAutoSave,
1799
+ isAutoSaving,
1800
+ schedule,
1801
+ getStore,
1802
+ destroy,
1803
+ getStats,
1804
+ ...extra,
1731
1805
  };
1732
- if (getThing) {
1733
- persister[getThing] = () => thing;
1734
- }
1735
1806
  return objFreeze(persister);
1736
1807
  };
1737
1808
 
@@ -1743,13 +1814,18 @@ const createStoragePersister = (
1743
1814
  storage,
1744
1815
  onIgnoredError,
1745
1816
  ) => {
1746
- const getPersisted = async () => jsonParse(storage.getItem(storageName));
1817
+ const getPersisted = async () =>
1818
+ jsonParseWithUndefined(storage.getItem(storageName));
1747
1819
  const setPersisted = async (getContent) =>
1748
- storage.setItem(storageName, jsonString(getContent()));
1820
+ storage.setItem(storageName, jsonStringWithUndefined(getContent()));
1749
1821
  const addPersisterListener = (listener) => {
1750
1822
  const storageListener = (event) => {
1751
1823
  if (event.storageArea === storage && event.key === storageName) {
1752
- listener(() => jsonParse(event.newValue));
1824
+ try {
1825
+ listener(jsonParse(event.newValue));
1826
+ } catch {
1827
+ listener();
1828
+ }
1753
1829
  }
1754
1830
  };
1755
1831
  WINDOW.addEventListener(STORAGE, storageListener);
@@ -1764,7 +1840,8 @@ const createStoragePersister = (
1764
1840
  addPersisterListener,
1765
1841
  delPersisterListener,
1766
1842
  onIgnoredError,
1767
- ['getStorageName', storageName],
1843
+ 3,
1844
+ {getStorageName: () => storageName},
1768
1845
  );
1769
1846
  };
1770
1847
  const createSessionPersister = (store, storageName, onIgnoredError) =>
@@ -1871,18 +1948,6 @@ const pairIsEqual = ([entry1, entry2]) => entry1 === entry2;
1871
1948
  const defaultSorter = (sortKey1, sortKey2) =>
1872
1949
  (sortKey1 ?? 0) < (sortKey2 ?? 0) ? -1 : 1;
1873
1950
 
1874
- const validate = (obj, validateChild, onInvalidObj) => {
1875
- if (isUndefined(obj) || !isObject(obj) || objIsEmpty(obj) || objFrozen(obj)) {
1876
- onInvalidObj?.();
1877
- return false;
1878
- }
1879
- objMap(obj, (child, id2) => {
1880
- if (!validateChild(child, id2)) {
1881
- objDel(obj, id2);
1882
- }
1883
- });
1884
- return !objIsEmpty(obj);
1885
- };
1886
1951
  const idsChanged = (changedIds, id2, addedOrRemoved) =>
1887
1952
  mapSet(
1888
1953
  changedIds,
@@ -1892,11 +1957,10 @@ const idsChanged = (changedIds, id2, addedOrRemoved) =>
1892
1957
  const createStore = () => {
1893
1958
  let hasTablesSchema;
1894
1959
  let hasValuesSchema;
1895
- let cellsTouched = false;
1896
- let valuesTouched = false;
1897
1960
  let hadTables = false;
1898
1961
  let hadValues = false;
1899
1962
  let transactions = 0;
1963
+ let internalListeners = [];
1900
1964
  const changedTableIds = mapNew();
1901
1965
  const changedTableCellIds = mapNew();
1902
1966
  const changedRowCount = mapNew();
@@ -1943,13 +2007,13 @@ const createStore = () => {
1943
2007
  const [addListener, callListeners, delListenerImpl, callListenerImpl] =
1944
2008
  getListenerFunctions(() => store);
1945
2009
  const validateTablesSchema = (tableSchema) =>
1946
- validate(tableSchema, (tableSchema2) =>
1947
- validate(tableSchema2, validateCellOrValueSchema),
2010
+ objValidate(tableSchema, (tableSchema2) =>
2011
+ objValidate(tableSchema2, validateCellOrValueSchema),
1948
2012
  );
1949
2013
  const validateValuesSchema = (valuesSchema) =>
1950
- validate(valuesSchema, validateCellOrValueSchema);
2014
+ objValidate(valuesSchema, validateCellOrValueSchema);
1951
2015
  const validateCellOrValueSchema = (schema) => {
1952
- if (!validate(schema, (_child, id2) => arrayHas([TYPE, DEFAULT], id2))) {
2016
+ if (!objValidate(schema, (_child, id2) => arrayHas([TYPE, DEFAULT], id2))) {
1953
2017
  return false;
1954
2018
  }
1955
2019
  const type = schema[TYPE];
@@ -1962,18 +2026,18 @@ const createStore = () => {
1962
2026
  return true;
1963
2027
  };
1964
2028
  const validateTables = (tables) =>
1965
- validate(tables, validateTable, cellInvalid);
2029
+ objValidate(tables, validateTable, cellInvalid);
1966
2030
  const validateTable = (table, tableId) =>
1967
2031
  (!hasTablesSchema ||
1968
2032
  collHas(tablesSchemaMap, tableId) ||
1969
2033
  cellInvalid(tableId)) &&
1970
- validate(
2034
+ objValidate(
1971
2035
  table,
1972
2036
  (row, rowId) => validateRow(tableId, rowId, row),
1973
2037
  () => cellInvalid(tableId),
1974
2038
  );
1975
2039
  const validateRow = (tableId, rowId, row, skipDefaults) =>
1976
- validate(
2040
+ objValidate(
1977
2041
  skipDefaults ? row : addDefaultsToRow(row, tableId, rowId),
1978
2042
  (cell, cellId) =>
1979
2043
  ifNotUndefined(
@@ -2000,7 +2064,7 @@ const createStore = () => {
2000
2064
  ? cellInvalid(tableId, rowId, cellId, cell)
2001
2065
  : cell;
2002
2066
  const validateValues = (values, skipDefaults) =>
2003
- validate(
2067
+ objValidate(
2004
2068
  skipDefaults ? values : addDefaultsToValues(values),
2005
2069
  (value, valueId) =>
2006
2070
  ifNotUndefined(
@@ -2263,16 +2327,20 @@ const createStore = () => {
2263
2327
  addedOrRemoved,
2264
2328
  );
2265
2329
  };
2266
- const cellChanged = (tableId, rowId, cellId, oldCell, newCell) =>
2267
- (mapEnsure(
2330
+ const cellChanged = (tableId, rowId, cellId, oldCell, newCell) => {
2331
+ mapEnsure(
2268
2332
  mapEnsure(mapEnsure(changedCells, tableId, mapNew), rowId, mapNew),
2269
2333
  cellId,
2270
2334
  () => [oldCell, 0],
2271
- )[1] = newCell);
2335
+ )[1] = newCell;
2336
+ internalListeners[3]?.(tableId, rowId, cellId, newCell);
2337
+ };
2272
2338
  const valueIdsChanged = (valueId, addedOrRemoved) =>
2273
2339
  idsChanged(changedValueIds, valueId, addedOrRemoved);
2274
- const valueChanged = (valueId, oldValue, newValue) =>
2275
- (mapEnsure(changedValues, valueId, () => [oldValue, 0])[1] = newValue);
2340
+ const valueChanged = (valueId, oldValue, newValue) => {
2341
+ mapEnsure(changedValues, valueId, () => [oldValue, 0])[1] = newValue;
2342
+ internalListeners[4]?.(valueId, newValue);
2343
+ };
2276
2344
  const cellInvalid = (tableId, rowId, cellId, invalidCell, defaultedCell) => {
2277
2345
  arrayPush(
2278
2346
  mapEnsure(
@@ -2538,44 +2606,6 @@ const createStore = () => {
2538
2606
  transaction(() => actions(...arrayMap(args, id)));
2539
2607
  return store;
2540
2608
  };
2541
- const getTransactionChanges = () => [
2542
- mapToObj(
2543
- changedCells,
2544
- (table, tableId) =>
2545
- mapGet(changedTableIds, tableId) === -1
2546
- ? null
2547
- : mapToObj(
2548
- table,
2549
- (row, rowId) =>
2550
- mapGet(mapGet(changedRowIds, tableId), rowId) === -1
2551
- ? null
2552
- : mapToObj(
2553
- row,
2554
- ([, newCell]) => newCell ?? null,
2555
- (_, changedCell) => pairIsEqual(changedCell),
2556
- ),
2557
- objIsEmpty,
2558
- ),
2559
- objIsEmpty,
2560
- ),
2561
- mapToObj(
2562
- changedValues,
2563
- ([, newValue]) => newValue ?? null,
2564
- (_, changedValue) => pairIsEqual(changedValue),
2565
- ),
2566
- ];
2567
- const getTransactionLog = () => ({
2568
- cellsTouched,
2569
- valuesTouched,
2570
- changedCells: mapToObj3(changedCells, pairClone, pairIsEqual),
2571
- invalidCells: mapToObj3(invalidCells),
2572
- changedValues: mapToObj(changedValues, pairClone, pairIsEqual),
2573
- invalidValues: mapToObj(invalidValues),
2574
- changedTableIds: mapToObj(changedTableIds),
2575
- changedRowIds: mapToObj2(changedRowIds),
2576
- changedCellIds: mapToObj3(changedCellIds),
2577
- changedValueIds: mapToObj(changedValueIds),
2578
- });
2579
2609
  const getContent = () => [getTables(), getValues()];
2580
2610
  const getTables = () => mapToObj3(tablesMap);
2581
2611
  const getTableIds = () => mapKeys(tablesMap);
@@ -2619,12 +2649,13 @@ const createStore = () => {
2619
2649
  collHas(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)), id(cellId));
2620
2650
  const hasValues = () => !collIsEmpty(valuesMap);
2621
2651
  const hasValue = (valueId) => collHas(valuesMap, id(valueId));
2622
- const getTablesJson = () => jsonString(tablesMap);
2623
- const getValuesJson = () => jsonString(valuesMap);
2624
- const getJson = () => jsonString([tablesMap, valuesMap]);
2625
- const getTablesSchemaJson = () => jsonString(tablesSchemaMap);
2626
- const getValuesSchemaJson = () => jsonString(valuesSchemaMap);
2627
- const getSchemaJson = () => jsonString([tablesSchemaMap, valuesSchemaMap]);
2652
+ const getTablesJson = () => jsonStringWithMap(tablesMap);
2653
+ const getValuesJson = () => jsonStringWithMap(valuesMap);
2654
+ const getJson = () => jsonStringWithMap([tablesMap, valuesMap]);
2655
+ const getTablesSchemaJson = () => jsonStringWithMap(tablesSchemaMap);
2656
+ const getValuesSchemaJson = () => jsonStringWithMap(valuesSchemaMap);
2657
+ const getSchemaJson = () =>
2658
+ jsonStringWithMap([tablesSchemaMap, valuesSchemaMap]);
2628
2659
  const setContent = ([tables, values]) =>
2629
2660
  fluentTransaction(() => {
2630
2661
  (objIsEmpty(tables) ? delTables : setTables)(tables);
@@ -2668,7 +2699,7 @@ const createStore = () => {
2668
2699
  (tableId2, rowId2) => {
2669
2700
  if (validateRow(tableId2, rowId2, partialRow, 1)) {
2670
2701
  const table = getOrCreateTable(tableId2);
2671
- objMap(partialRow, (cell, cellId) =>
2702
+ objToArray(partialRow, (cell, cellId) =>
2672
2703
  setCellIntoDefaultRow(tableId2, table, rowId2, cellId, cell),
2673
2704
  );
2674
2705
  }
@@ -2706,7 +2737,7 @@ const createStore = () => {
2706
2737
  const setPartialValues = (partialValues) =>
2707
2738
  fluentTransaction(() =>
2708
2739
  validateValues(partialValues, 1)
2709
- ? objMap(partialValues, (value, valueId) =>
2740
+ ? objToArray(partialValues, (value, valueId) =>
2710
2741
  setValidValue(valueId, value),
2711
2742
  )
2712
2743
  : 0,
@@ -2723,20 +2754,20 @@ const createStore = () => {
2723
2754
  ),
2724
2755
  valueId,
2725
2756
  );
2726
- const setTransactionChanges = (transactionChanges) =>
2757
+ const applyChanges = (changes) =>
2727
2758
  fluentTransaction(() => {
2728
- objMap(transactionChanges[0], (table, tableId) =>
2759
+ objToArray(changes[0], (table, tableId) =>
2729
2760
  isUndefined(table)
2730
2761
  ? delTable(tableId)
2731
- : objMap(table, (row, rowId) =>
2762
+ : objToArray(table, (row, rowId) =>
2732
2763
  isUndefined(row)
2733
2764
  ? delRow(tableId, rowId)
2734
- : objMap(row, (cell, cellId) =>
2765
+ : objToArray(row, (cell, cellId) =>
2735
2766
  setOrDelCell(store, tableId, rowId, cellId, cell),
2736
2767
  ),
2737
2768
  ),
2738
2769
  );
2739
- objMap(transactionChanges[1], (value, valueId) =>
2770
+ objToArray(changes[1], (value, valueId) =>
2740
2771
  setOrDelValue(store, valueId, value),
2741
2772
  );
2742
2773
  });
@@ -2863,31 +2894,66 @@ const createStore = () => {
2863
2894
  transactions++;
2864
2895
  }
2865
2896
  if (transactions == 1) {
2866
- callListeners(
2867
- startTransactionListeners,
2868
- void 0,
2869
- getTransactionChanges,
2870
- getTransactionLog,
2871
- );
2897
+ internalListeners[0]?.();
2898
+ callListeners(startTransactionListeners);
2872
2899
  }
2873
2900
  return store;
2874
2901
  };
2902
+ const getTransactionChanges = () => [
2903
+ mapToObj(
2904
+ changedCells,
2905
+ (table, tableId) =>
2906
+ mapGet(changedTableIds, tableId) === -1
2907
+ ? void 0
2908
+ : mapToObj(
2909
+ table,
2910
+ (row, rowId) =>
2911
+ mapGet(mapGet(changedRowIds, tableId), rowId) === -1
2912
+ ? void 0
2913
+ : mapToObj(
2914
+ row,
2915
+ ([, newCell]) => newCell,
2916
+ (changedCell) => pairIsEqual(changedCell),
2917
+ ),
2918
+ collIsEmpty,
2919
+ objIsEmpty,
2920
+ ),
2921
+ collIsEmpty,
2922
+ objIsEmpty,
2923
+ ),
2924
+ mapToObj(
2925
+ changedValues,
2926
+ ([, newValue]) => newValue,
2927
+ (changedValue) => pairIsEqual(changedValue),
2928
+ ),
2929
+ 1,
2930
+ ];
2931
+ const getTransactionLog = () => [
2932
+ !collIsEmpty(changedCells),
2933
+ !collIsEmpty(changedValues),
2934
+ mapToObj3(changedCells, pairClone, pairIsEqual),
2935
+ mapToObj3(invalidCells),
2936
+ mapToObj(changedValues, pairClone, pairIsEqual),
2937
+ mapToObj(invalidValues),
2938
+ mapToObj(changedTableIds),
2939
+ mapToObj2(changedRowIds),
2940
+ mapToObj3(changedCellIds),
2941
+ mapToObj(changedValueIds),
2942
+ ];
2875
2943
  const finishTransaction = (doRollback) => {
2876
2944
  if (transactions > 0) {
2877
2945
  transactions--;
2878
2946
  if (transactions == 0) {
2879
- cellsTouched = !collIsEmpty(changedCells);
2880
- valuesTouched = !collIsEmpty(changedValues);
2881
2947
  transactions = 1;
2882
2948
  callInvalidCellListeners(1);
2883
- if (cellsTouched) {
2949
+ if (!collIsEmpty(changedCells)) {
2884
2950
  callTabularListenersForChanges(1);
2885
2951
  }
2886
2952
  callInvalidValueListeners(1);
2887
- if (valuesTouched) {
2953
+ if (!collIsEmpty(changedValues)) {
2888
2954
  callValuesListenersForChanges(1);
2889
2955
  }
2890
- if (doRollback?.(getTransactionChanges, getTransactionLog)) {
2956
+ if (doRollback?.(store)) {
2891
2957
  collForEach(changedCells, (table, tableId) =>
2892
2958
  collForEach(table, (row, rowId) =>
2893
2959
  collForEach(row, ([oldCell], cellId) =>
@@ -2895,34 +2961,26 @@ const createStore = () => {
2895
2961
  ),
2896
2962
  ),
2897
2963
  );
2964
+ collClear(changedCells);
2898
2965
  collForEach(changedValues, ([oldValue], valueId) =>
2899
2966
  setOrDelValue(store, valueId, oldValue),
2900
2967
  );
2901
- cellsTouched = valuesTouched = false;
2968
+ collClear(changedValues);
2902
2969
  }
2903
- callListeners(
2904
- finishTransactionListeners[0],
2905
- void 0,
2906
- getTransactionChanges,
2907
- getTransactionLog,
2908
- );
2970
+ callListeners(finishTransactionListeners[0], void 0);
2909
2971
  transactions = -1;
2910
2972
  callInvalidCellListeners(0);
2911
- if (cellsTouched) {
2973
+ if (!collIsEmpty(changedCells)) {
2912
2974
  callTabularListenersForChanges(0);
2913
2975
  }
2914
2976
  callInvalidValueListeners(0);
2915
- if (valuesTouched) {
2977
+ if (!collIsEmpty(changedValues)) {
2916
2978
  callValuesListenersForChanges(0);
2917
2979
  }
2918
- callListeners(
2919
- finishTransactionListeners[1],
2920
- void 0,
2921
- getTransactionChanges,
2922
- getTransactionLog,
2923
- );
2980
+ internalListeners[1]?.();
2981
+ callListeners(finishTransactionListeners[1], void 0);
2982
+ internalListeners[2]?.();
2924
2983
  transactions = 0;
2925
- cellsTouched = valuesTouched = false;
2926
2984
  hadTables = hasTables();
2927
2985
  hadValues = hasValues();
2928
2986
  arrayForEach(
@@ -3047,6 +3105,20 @@ const createStore = () => {
3047
3105
  collSize2(startTransactionListeners) +
3048
3106
  pairCollSize2(finishTransactionListeners),
3049
3107
  });
3108
+ const setInternalListeners = (
3109
+ preStartTransaction,
3110
+ preFinishTransaction,
3111
+ postFinishTransaction,
3112
+ cellChanged2,
3113
+ valueChanged2,
3114
+ ) =>
3115
+ (internalListeners = [
3116
+ preStartTransaction,
3117
+ preFinishTransaction,
3118
+ postFinishTransaction,
3119
+ cellChanged2,
3120
+ valueChanged2,
3121
+ ]);
3050
3122
  const store = {
3051
3123
  getContent,
3052
3124
  getTables,
@@ -3087,7 +3159,7 @@ const createStore = () => {
3087
3159
  setValues,
3088
3160
  setPartialValues,
3089
3161
  setValue,
3090
- setTransactionChanges,
3162
+ applyChanges,
3091
3163
  setTablesJson,
3092
3164
  setValuesJson,
3093
3165
  setJson,
@@ -3105,6 +3177,8 @@ const createStore = () => {
3105
3177
  delSchema,
3106
3178
  transaction,
3107
3179
  startTransaction,
3180
+ getTransactionChanges,
3181
+ getTransactionLog,
3108
3182
  finishTransaction,
3109
3183
  forEachTable,
3110
3184
  forEachTableCell,
@@ -3122,8 +3196,9 @@ const createStore = () => {
3122
3196
  createStore,
3123
3197
  addListener,
3124
3198
  callListeners,
3199
+ setInternalListeners,
3125
3200
  };
3126
- objMap(
3201
+ objToArray(
3127
3202
  {
3128
3203
  [HAS + TABLES]: [0, hasTablesListeners, [], () => [hasTables()]],
3129
3204
  [TABLES]: [0, tablesListeners],
@@ -3204,10 +3279,13 @@ const App = ({position = 'right', open = false}) => {
3204
3279
  (s2) => createSessionPersister(s2, UNIQUE_ID),
3205
3280
  void 0,
3206
3281
  async (persister) => {
3207
- await persister.load(void 0, {
3208
- position: index == -1 ? 1 : index,
3209
- open: !!open,
3210
- });
3282
+ await persister.load([
3283
+ {},
3284
+ {
3285
+ position: index == -1 ? 1 : index,
3286
+ open: !!open,
3287
+ },
3288
+ ]);
3211
3289
  await persister.startAutoSave();
3212
3290
  },
3213
3291
  );