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
@@ -3,10 +3,10 @@ import {readFile, writeFile} from 'fs/promises';
3
3
 
4
4
  const UTF8 = 'utf8';
5
5
 
6
- const isInstanceOf = (thing, cls) => thing instanceof cls;
7
6
  const isUndefined = (thing) => thing == void 0;
8
7
  const ifNotUndefined = (value, then, otherwise) =>
9
8
  isUndefined(value) ? otherwise?.() : then(value);
9
+ const isArray = (thing) => Array.isArray(thing);
10
10
  const size = (arrayOrString) => arrayOrString.length;
11
11
 
12
12
  const arrayPush = (array, ...values) => array.push(...values);
@@ -14,8 +14,6 @@ const arrayShift = (array) => array.shift();
14
14
 
15
15
  const object = Object;
16
16
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
17
- const objIds = object.keys;
18
- const objFreeze = object.freeze;
19
17
  const isObject = (obj) =>
20
18
  !isUndefined(obj) &&
21
19
  ifNotUndefined(
@@ -26,14 +24,20 @@ const isObject = (obj) =>
26
24
  /* istanbul ignore next */
27
25
  () => true,
28
26
  );
27
+ const objIds = object.keys;
28
+ const objFreeze = object.freeze;
29
29
  const objSize = (obj) => size(objIds(obj));
30
30
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
31
31
 
32
- const jsonString = (obj) =>
32
+ const UNDEFINED_MARKER = '\uFFFC';
33
+ const jsonStringWithUndefined = (obj) =>
33
34
  JSON.stringify(obj, (_key, value) =>
34
- isInstanceOf(value, Map) ? object.fromEntries([...value]) : value,
35
+ value === void 0 ? UNDEFINED_MARKER : value,
36
+ );
37
+ const jsonParseWithUndefined = (str) =>
38
+ JSON.parse(str, (_key, value) =>
39
+ value === UNDEFINED_MARKER ? void 0 : value,
35
40
  );
36
- const jsonParse = JSON.parse;
37
41
 
38
42
  const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
39
43
  const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
@@ -42,15 +46,38 @@ const mapNew = (entries) => new Map(entries);
42
46
  const mapGet = (map, key) => map?.get(key);
43
47
  const mapSet = (map, key, value) =>
44
48
  isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
45
- const mapEnsure = (map, key, getDefaultValue) => {
49
+ const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
46
50
  if (!collHas(map, key)) {
47
51
  mapSet(map, key, getDefaultValue());
52
+ } else {
53
+ hadExistingValue?.(mapGet(map, key));
48
54
  }
49
55
  return mapGet(map, key);
50
56
  };
51
57
 
52
58
  const scheduleRunning = mapNew();
53
59
  const scheduleActions = mapNew();
60
+ const getStoreFunctions = (supportedStoreType = 1, store) =>
61
+ supportedStoreType > 1 && 'getMergeableContent' in store
62
+ ? [
63
+ 1,
64
+ store.getMergeableContent,
65
+ store.getTransactionMergeableChanges,
66
+ ([[changedTables], [changedValues]]) =>
67
+ !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
68
+ store.setDefaultContent,
69
+ ]
70
+ : supportedStoreType != 2
71
+ ? [
72
+ 0,
73
+ store.getContent,
74
+ store.getTransactionChanges,
75
+ ([changedTables, changedValues]) =>
76
+ !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
77
+ store.setContent,
78
+ ]
79
+ : /* istanbul ignore next */
80
+ 0;
54
81
  const createCustomPersister = (
55
82
  store,
56
83
  getPersisted,
@@ -58,18 +85,25 @@ const createCustomPersister = (
58
85
  addPersisterListener,
59
86
  delPersisterListener,
60
87
  onIgnoredError,
61
- [getThing, thing] = [],
88
+ supportedStoreType,
89
+ extra = {},
62
90
  scheduleId = [],
63
91
  ) => {
64
- let listenerId;
65
92
  let loadSave = 0;
66
93
  let loads = 0;
67
94
  let saves = 0;
68
- let listening = 0;
69
95
  let action;
70
- let listeningHandle;
96
+ let autoLoadHandle;
97
+ let autoSaveListenerId;
71
98
  mapEnsure(scheduleRunning, scheduleId, () => 0);
72
99
  mapEnsure(scheduleActions, scheduleId, () => []);
100
+ const [
101
+ isMergeableStore,
102
+ getContent,
103
+ getChanges,
104
+ hasChanges,
105
+ setDefaultContent,
106
+ ] = getStoreFunctions(supportedStoreType, store);
73
107
  const run = async () => {
74
108
  /* istanbul ignore else */
75
109
  if (!mapGet(scheduleRunning, scheduleId)) {
@@ -87,116 +121,129 @@ const createCustomPersister = (
87
121
  mapSet(scheduleRunning, scheduleId, 0);
88
122
  }
89
123
  };
90
- const loadLock = async (actions) => {
124
+ const setContentOrChanges = (contentOrChanges) => {
125
+ (isMergeableStore && isArray(contentOrChanges?.[0])
126
+ ? contentOrChanges?.[2] === 1
127
+ ? store.applyMergeableChanges
128
+ : store.setMergeableContent
129
+ : contentOrChanges?.[2] === 1
130
+ ? store.applyChanges
131
+ : store.setContent)(contentOrChanges);
132
+ };
133
+ const load = async (initialContent) => {
91
134
  /* istanbul ignore else */
92
135
  if (loadSave != 2) {
93
136
  loadSave = 1;
94
137
  {
95
138
  loads++;
96
139
  }
97
- await persister.schedule(async () => {
98
- await actions();
140
+ await schedule(async () => {
141
+ try {
142
+ setContentOrChanges(await getPersisted());
143
+ } catch (error) {
144
+ onIgnoredError?.(error);
145
+ if (initialContent) {
146
+ setDefaultContent(initialContent);
147
+ }
148
+ }
99
149
  loadSave = 0;
100
150
  });
101
151
  }
102
152
  return persister;
103
153
  };
104
- const persister = {
105
- load: async (initialTables, initialValues) =>
106
- await loadLock(async () => {
107
- try {
108
- store.setContent(await getPersisted());
109
- } catch {
110
- store.setContent([initialTables, initialValues]);
111
- }
112
- }),
113
- startAutoLoad: async (initialTables = {}, initialValues = {}) => {
114
- persister.stopAutoLoad();
115
- await persister.load(initialTables, initialValues);
116
- listening = 1;
117
- listeningHandle = addPersisterListener(
118
- async (getContent, getTransactionChanges) => {
119
- if (getTransactionChanges) {
120
- const transactionChanges = getTransactionChanges();
121
- await loadLock(async () =>
122
- store.setTransactionChanges(transactionChanges),
123
- );
124
- } else {
125
- await loadLock(async () => {
126
- try {
127
- store.setContent(getContent?.() ?? (await getPersisted()));
128
- } catch (error) {
129
- onIgnoredError?.(error);
130
- }
131
- });
154
+ const startAutoLoad = async (initialContent) => {
155
+ await stopAutoLoad().load(initialContent);
156
+ autoLoadHandle = addPersisterListener(async (content, changes) => {
157
+ if (changes || content) {
158
+ /* istanbul ignore else */
159
+ if (loadSave != 2) {
160
+ loadSave = 1;
161
+ {
162
+ loads++;
132
163
  }
133
- },
134
- );
135
- return persister;
136
- },
137
- stopAutoLoad: () => {
138
- if (listening) {
139
- delPersisterListener(listeningHandle);
140
- listeningHandle = void 0;
141
- listening = 0;
164
+ setContentOrChanges(changes ?? content);
165
+ loadSave = 0;
166
+ }
167
+ } else {
168
+ await load();
169
+ }
170
+ });
171
+ return persister;
172
+ };
173
+ const stopAutoLoad = () => {
174
+ if (autoLoadHandle) {
175
+ delPersisterListener(autoLoadHandle);
176
+ autoLoadHandle = void 0;
177
+ }
178
+ return persister;
179
+ };
180
+ const isAutoLoading = () => !isUndefined(autoLoadHandle);
181
+ const save = async (changes) => {
182
+ /* istanbul ignore else */
183
+ if (loadSave != 1) {
184
+ loadSave = 2;
185
+ {
186
+ saves++;
142
187
  }
143
- return persister;
144
- },
145
- save: async (getTransactionChanges) => {
146
- /* istanbul ignore else */
147
- if (loadSave != 1) {
148
- loadSave = 2;
149
- {
150
- saves++;
188
+ await schedule(async () => {
189
+ try {
190
+ await setPersisted(getContent, changes);
191
+ } catch (error) {
192
+ /* istanbul ignore next */
193
+ onIgnoredError?.(error);
151
194
  }
152
- await persister.schedule(async () => {
153
- try {
154
- await setPersisted(store.getContent, getTransactionChanges);
155
- } catch (error) {
156
- /* istanbul ignore next */
157
- onIgnoredError?.(error);
158
- }
159
- loadSave = 0;
160
- });
195
+ loadSave = 0;
196
+ });
197
+ }
198
+ return persister;
199
+ };
200
+ const startAutoSave = async () => {
201
+ await stopAutoSave().save();
202
+ autoSaveListenerId = store.addDidFinishTransactionListener(() => {
203
+ const changes = getChanges();
204
+ if (hasChanges(changes)) {
205
+ save(changes);
161
206
  }
162
- return persister;
163
- },
164
- startAutoSave: async () => {
165
- await persister.stopAutoSave().save();
166
- listenerId = store.addDidFinishTransactionListener(
167
- (_store, getTransactionChanges) => {
168
- const [tableChanges, valueChanges] = getTransactionChanges();
169
- if (!objIsEmpty(tableChanges) || !objIsEmpty(valueChanges)) {
170
- persister.save(() => [tableChanges, valueChanges]);
171
- }
172
- },
173
- );
174
- return persister;
175
- },
176
- stopAutoSave: () => {
177
- ifNotUndefined(listenerId, store.delListener);
178
- listenerId = void 0;
179
- return persister;
180
- },
181
- schedule: async (...actions) => {
182
- arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
183
- await run();
184
- return persister;
185
- },
186
- getStore: () => store,
187
- destroy: () => persister.stopAutoLoad().stopAutoSave(),
188
- getStats: () => ({loads, saves}),
207
+ });
208
+ return persister;
209
+ };
210
+ const stopAutoSave = () => {
211
+ ifNotUndefined(autoSaveListenerId, store.delListener);
212
+ autoSaveListenerId = void 0;
213
+ return persister;
214
+ };
215
+ const isAutoSaving = () => !isUndefined(autoSaveListenerId);
216
+ const schedule = async (...actions) => {
217
+ arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
218
+ await run();
219
+ return persister;
220
+ };
221
+ const getStore = () => store;
222
+ const destroy = () => stopAutoLoad().stopAutoSave();
223
+ const getStats = () => ({loads, saves});
224
+ const persister = {
225
+ load,
226
+ startAutoLoad,
227
+ stopAutoLoad,
228
+ isAutoLoading,
229
+ save,
230
+ startAutoSave,
231
+ stopAutoSave,
232
+ isAutoSaving,
233
+ schedule,
234
+ getStore,
235
+ destroy,
236
+ getStats,
237
+ ...extra,
189
238
  };
190
- if (getThing) {
191
- persister[getThing] = () => thing;
192
- }
193
239
  return objFreeze(persister);
194
240
  };
195
241
 
196
242
  const createFilePersister = (store, filePath, onIgnoredError) => {
197
- const getPersisted = async () => jsonParse(await readFile(filePath, UTF8));
243
+ const getPersisted = async () =>
244
+ jsonParseWithUndefined(await readFile(filePath, UTF8));
198
245
  const setPersisted = async (getContent) =>
199
- await writeFile(filePath, jsonString(getContent()), UTF8);
246
+ await writeFile(filePath, jsonStringWithUndefined(getContent()), UTF8);
200
247
  const addPersisterListener = (listener) => watch(filePath, () => listener());
201
248
  const delPersisterListener = (watcher) => watcher?.close();
202
249
  return createCustomPersister(
@@ -206,7 +253,8 @@ const createFilePersister = (store, filePath, onIgnoredError) => {
206
253
  addPersisterListener,
207
254
  delPersisterListener,
208
255
  onIgnoredError,
209
- ['getFilePath', filePath],
256
+ 3,
257
+ {getFilePath: () => filePath},
210
258
  );
211
259
  };
212
260
 
@@ -10,6 +10,7 @@ const stopInterval = clearInterval;
10
10
  const isUndefined = (thing) => thing == void 0;
11
11
  const ifNotUndefined = (value, then, otherwise) =>
12
12
  isUndefined(value) ? otherwise?.() : then(value);
13
+ const isArray = (thing) => Array.isArray(thing);
13
14
  const size = (arrayOrString) => arrayOrString.length;
14
15
  const promiseNew = (resolver) => new promise(resolver);
15
16
  const promiseAll = async (promises) => promise.all(promises);
@@ -21,8 +22,6 @@ const arrayShift = (array) => array.shift();
21
22
  const object = Object;
22
23
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
23
24
  const objEntries = object.entries;
24
- const objIds = object.keys;
25
- const objFreeze = object.freeze;
26
25
  const isObject = (obj) =>
27
26
  !isUndefined(obj) &&
28
27
  ifNotUndefined(
@@ -33,10 +32,11 @@ const isObject = (obj) =>
33
32
  /* istanbul ignore next */
34
33
  () => true,
35
34
  );
35
+ const objIds = object.keys;
36
+ const objFreeze = object.freeze;
36
37
  const objNew = (entries = []) => object.fromEntries(entries);
37
- const objGet = (obj, id) => ifNotUndefined(obj, (obj2) => obj2[id]);
38
- const objHas = (obj, id) => !isUndefined(objGet(obj, id));
39
- const objMap = (obj, cb) =>
38
+ const objHas = (obj, id) => id in obj;
39
+ const objToArray = (obj, cb) =>
40
40
  arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
41
41
  const objSize = (obj) => size(objIds(obj));
42
42
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
@@ -48,15 +48,38 @@ const mapNew = (entries) => new Map(entries);
48
48
  const mapGet = (map, key) => map?.get(key);
49
49
  const mapSet = (map, key, value) =>
50
50
  isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
51
- const mapEnsure = (map, key, getDefaultValue) => {
51
+ const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
52
52
  if (!collHas(map, key)) {
53
53
  mapSet(map, key, getDefaultValue());
54
+ } else {
55
+ hadExistingValue?.(mapGet(map, key));
54
56
  }
55
57
  return mapGet(map, key);
56
58
  };
57
59
 
58
60
  const scheduleRunning = mapNew();
59
61
  const scheduleActions = mapNew();
62
+ const getStoreFunctions = (supportedStoreType = 1, store) =>
63
+ supportedStoreType > 1 && 'getMergeableContent' in store
64
+ ? [
65
+ 1,
66
+ store.getMergeableContent,
67
+ store.getTransactionMergeableChanges,
68
+ ([[changedTables], [changedValues]]) =>
69
+ !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
70
+ store.setDefaultContent,
71
+ ]
72
+ : supportedStoreType != 2
73
+ ? [
74
+ 0,
75
+ store.getContent,
76
+ store.getTransactionChanges,
77
+ ([changedTables, changedValues]) =>
78
+ !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
79
+ store.setContent,
80
+ ]
81
+ : /* istanbul ignore next */
82
+ 0;
60
83
  const createCustomPersister = (
61
84
  store,
62
85
  getPersisted,
@@ -64,18 +87,25 @@ const createCustomPersister = (
64
87
  addPersisterListener,
65
88
  delPersisterListener,
66
89
  onIgnoredError,
67
- [getThing, thing] = [],
90
+ supportedStoreType,
91
+ extra = {},
68
92
  scheduleId = [],
69
93
  ) => {
70
- let listenerId;
71
94
  let loadSave = 0;
72
95
  let loads = 0;
73
96
  let saves = 0;
74
- let listening = 0;
75
97
  let action;
76
- let listeningHandle;
98
+ let autoLoadHandle;
99
+ let autoSaveListenerId;
77
100
  mapEnsure(scheduleRunning, scheduleId, () => 0);
78
101
  mapEnsure(scheduleActions, scheduleId, () => []);
102
+ const [
103
+ isMergeableStore,
104
+ getContent,
105
+ getChanges,
106
+ hasChanges,
107
+ setDefaultContent,
108
+ ] = getStoreFunctions(supportedStoreType, store);
79
109
  const run = async () => {
80
110
  /* istanbul ignore else */
81
111
  if (!mapGet(scheduleRunning, scheduleId)) {
@@ -93,109 +123,121 @@ const createCustomPersister = (
93
123
  mapSet(scheduleRunning, scheduleId, 0);
94
124
  }
95
125
  };
96
- const loadLock = async (actions) => {
126
+ const setContentOrChanges = (contentOrChanges) => {
127
+ (isMergeableStore && isArray(contentOrChanges?.[0])
128
+ ? contentOrChanges?.[2] === 1
129
+ ? store.applyMergeableChanges
130
+ : store.setMergeableContent
131
+ : contentOrChanges?.[2] === 1
132
+ ? store.applyChanges
133
+ : store.setContent)(contentOrChanges);
134
+ };
135
+ const load = async (initialContent) => {
97
136
  /* istanbul ignore else */
98
137
  if (loadSave != 2) {
99
138
  loadSave = 1;
100
139
  {
101
140
  loads++;
102
141
  }
103
- await persister.schedule(async () => {
104
- await actions();
142
+ await schedule(async () => {
143
+ try {
144
+ setContentOrChanges(await getPersisted());
145
+ } catch (error) {
146
+ onIgnoredError?.(error);
147
+ if (initialContent) {
148
+ setDefaultContent(initialContent);
149
+ }
150
+ }
105
151
  loadSave = 0;
106
152
  });
107
153
  }
108
154
  return persister;
109
155
  };
110
- const persister = {
111
- load: async (initialTables, initialValues) =>
112
- await loadLock(async () => {
113
- try {
114
- store.setContent(await getPersisted());
115
- } catch {
116
- store.setContent([initialTables, initialValues]);
117
- }
118
- }),
119
- startAutoLoad: async (initialTables = {}, initialValues = {}) => {
120
- persister.stopAutoLoad();
121
- await persister.load(initialTables, initialValues);
122
- listening = 1;
123
- listeningHandle = addPersisterListener(
124
- async (getContent, getTransactionChanges) => {
125
- if (getTransactionChanges) {
126
- const transactionChanges = getTransactionChanges();
127
- await loadLock(async () =>
128
- store.setTransactionChanges(transactionChanges),
129
- );
130
- } else {
131
- await loadLock(async () => {
132
- try {
133
- store.setContent(getContent?.() ?? (await getPersisted()));
134
- } catch (error) {
135
- onIgnoredError?.(error);
136
- }
137
- });
156
+ const startAutoLoad = async (initialContent) => {
157
+ await stopAutoLoad().load(initialContent);
158
+ autoLoadHandle = addPersisterListener(async (content, changes) => {
159
+ if (changes || content) {
160
+ /* istanbul ignore else */
161
+ if (loadSave != 2) {
162
+ loadSave = 1;
163
+ {
164
+ loads++;
138
165
  }
139
- },
140
- );
141
- return persister;
142
- },
143
- stopAutoLoad: () => {
144
- if (listening) {
145
- delPersisterListener(listeningHandle);
146
- listeningHandle = void 0;
147
- listening = 0;
166
+ setContentOrChanges(changes ?? content);
167
+ loadSave = 0;
168
+ }
169
+ } else {
170
+ await load();
171
+ }
172
+ });
173
+ return persister;
174
+ };
175
+ const stopAutoLoad = () => {
176
+ if (autoLoadHandle) {
177
+ delPersisterListener(autoLoadHandle);
178
+ autoLoadHandle = void 0;
179
+ }
180
+ return persister;
181
+ };
182
+ const isAutoLoading = () => !isUndefined(autoLoadHandle);
183
+ const save = async (changes) => {
184
+ /* istanbul ignore else */
185
+ if (loadSave != 1) {
186
+ loadSave = 2;
187
+ {
188
+ saves++;
148
189
  }
149
- return persister;
150
- },
151
- save: async (getTransactionChanges) => {
152
- /* istanbul ignore else */
153
- if (loadSave != 1) {
154
- loadSave = 2;
155
- {
156
- saves++;
190
+ await schedule(async () => {
191
+ try {
192
+ await setPersisted(getContent, changes);
193
+ } catch (error) {
194
+ /* istanbul ignore next */
195
+ onIgnoredError?.(error);
157
196
  }
158
- await persister.schedule(async () => {
159
- try {
160
- await setPersisted(store.getContent, getTransactionChanges);
161
- } catch (error) {
162
- /* istanbul ignore next */
163
- onIgnoredError?.(error);
164
- }
165
- loadSave = 0;
166
- });
197
+ loadSave = 0;
198
+ });
199
+ }
200
+ return persister;
201
+ };
202
+ const startAutoSave = async () => {
203
+ await stopAutoSave().save();
204
+ autoSaveListenerId = store.addDidFinishTransactionListener(() => {
205
+ const changes = getChanges();
206
+ if (hasChanges(changes)) {
207
+ save(changes);
167
208
  }
168
- return persister;
169
- },
170
- startAutoSave: async () => {
171
- await persister.stopAutoSave().save();
172
- listenerId = store.addDidFinishTransactionListener(
173
- (_store, getTransactionChanges) => {
174
- const [tableChanges, valueChanges] = getTransactionChanges();
175
- if (!objIsEmpty(tableChanges) || !objIsEmpty(valueChanges)) {
176
- persister.save(() => [tableChanges, valueChanges]);
177
- }
178
- },
179
- );
180
- return persister;
181
- },
182
- stopAutoSave: () => {
183
- ifNotUndefined(listenerId, store.delListener);
184
- listenerId = void 0;
185
- return persister;
186
- },
187
- schedule: async (...actions) => {
188
- arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
189
- await run();
190
- return persister;
191
- },
192
- getStore: () => store,
193
- destroy: () => persister.stopAutoLoad().stopAutoSave(),
194
- getStats: () => ({loads, saves}),
209
+ });
210
+ return persister;
211
+ };
212
+ const stopAutoSave = () => {
213
+ ifNotUndefined(autoSaveListenerId, store.delListener);
214
+ autoSaveListenerId = void 0;
215
+ return persister;
216
+ };
217
+ const isAutoSaving = () => !isUndefined(autoSaveListenerId);
218
+ const schedule = async (...actions) => {
219
+ arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
220
+ await run();
221
+ return persister;
222
+ };
223
+ const getStore = () => store;
224
+ const destroy = () => stopAutoLoad().stopAutoSave();
225
+ const getStats = () => ({loads, saves});
226
+ const persister = {
227
+ load,
228
+ startAutoLoad,
229
+ stopAutoLoad,
230
+ isAutoLoading,
231
+ save,
232
+ startAutoSave,
233
+ stopAutoSave,
234
+ isAutoSaving,
235
+ schedule,
236
+ getStore,
237
+ destroy,
238
+ getStats,
239
+ ...extra,
195
240
  };
196
- if (getThing) {
197
- persister[getThing] = () => thing;
198
- }
199
241
  return objFreeze(persister);
200
242
  };
201
243
 
@@ -203,7 +245,7 @@ const WINDOW = globalThis.window;
203
245
  const OBJECT_STORE_NAMES = [T, V];
204
246
  const KEY_PATH = {keyPath: 'k'};
205
247
  const objectStoreMatch = async (objectStore, obj) => {
206
- const actions = objMap(obj, (v, k) =>
248
+ const actions = objToArray(obj, (v, k) =>
207
249
  execObjectStore(objectStore, 'put', {k, v}),
208
250
  );
209
251
  arrayMap(await execObjectStore(objectStore, 'getAllKeys'), (id) =>
@@ -227,7 +269,10 @@ const createIndexedDbPersister = (
227
269
  ) => {
228
270
  const forObjectStores = async (forObjectStore, args = [], create = 0) =>
229
271
  promiseNew((resolve, reject) => {
230
- const request = WINDOW.indexedDB.open(dbName, create ? 2 : void 0);
272
+ const request = (WINDOW ? WINDOW.indexedDB : indexedDB).open(
273
+ dbName,
274
+ create ? 2 : void 0,
275
+ );
231
276
  request.onupgradeneeded = () =>
232
277
  create &&
233
278
  arrayMap(OBJECT_STORE_NAMES, (objectStoreName) => {
@@ -286,7 +331,8 @@ const createIndexedDbPersister = (
286
331
  addPersisterListener,
287
332
  delPersisterListener,
288
333
  onIgnoredError,
289
- ['getDbName', dbName],
334
+ 1,
335
+ {getDbName: () => dbName},
290
336
  );
291
337
  };
292
338