tinybase 4.8.16 → 4.8.17

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 (356) hide show
  1. package/lib/checkpoints.js +1 -0
  2. package/lib/checkpoints.js.gz +0 -0
  3. package/lib/cjs/checkpoints.cjs +1 -0
  4. package/lib/cjs/checkpoints.cjs.gz +0 -0
  5. package/lib/cjs/common.cjs +1 -0
  6. package/lib/cjs/common.cjs.gz +0 -0
  7. package/lib/cjs/indexes.cjs +1 -0
  8. package/lib/cjs/indexes.cjs.gz +0 -0
  9. package/lib/cjs/metrics.cjs +1 -0
  10. package/lib/cjs/metrics.cjs.gz +0 -0
  11. package/lib/cjs/persisters/persister-automerge.cjs +1 -0
  12. package/lib/cjs/persisters/persister-automerge.cjs.gz +0 -0
  13. package/lib/cjs/persisters/persister-browser.cjs +1 -0
  14. package/lib/cjs/persisters/persister-browser.cjs.gz +0 -0
  15. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -0
  16. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  17. package/lib/cjs/persisters/persister-electric-sql.cjs +1 -0
  18. package/lib/cjs/persisters/persister-electric-sql.cjs.gz +0 -0
  19. package/lib/cjs/persisters/persister-expo-sqlite-next.cjs +1 -0
  20. package/lib/cjs/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  21. package/lib/cjs/persisters/persister-expo-sqlite.cjs +1 -0
  22. package/lib/cjs/persisters/persister-expo-sqlite.cjs.gz +0 -0
  23. package/lib/cjs/persisters/persister-file.cjs +1 -0
  24. package/lib/cjs/persisters/persister-file.cjs.gz +0 -0
  25. package/lib/cjs/persisters/persister-indexed-db.cjs +1 -0
  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 -0
  30. package/lib/cjs/persisters/persister-partykit-client.cjs.gz +0 -0
  31. package/lib/cjs/persisters/persister-partykit-server.cjs +1 -0
  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 -0
  36. package/lib/cjs/persisters/persister-remote.cjs.gz +0 -0
  37. package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -0
  38. package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  39. package/lib/cjs/persisters/persister-sqlite3.cjs +1 -0
  40. package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
  41. package/lib/cjs/persisters/persister-yjs.cjs +1 -0
  42. package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
  43. package/lib/cjs/persisters.cjs +1 -0
  44. package/lib/cjs/persisters.cjs.gz +0 -0
  45. package/lib/cjs/queries.cjs +1 -0
  46. package/lib/cjs/queries.cjs.gz +0 -0
  47. package/lib/cjs/relationships.cjs +1 -0
  48. package/lib/cjs/relationships.cjs.gz +0 -0
  49. package/lib/cjs/store.cjs +1 -0
  50. package/lib/cjs/store.cjs.gz +0 -0
  51. package/lib/cjs/tinybase.cjs +1 -0
  52. package/lib/cjs/tinybase.cjs.gz +0 -0
  53. package/lib/cjs/tools.cjs +1 -0
  54. package/lib/cjs/tools.cjs.gz +0 -0
  55. package/lib/cjs/ui-react-dom-debug.cjs +1 -0
  56. package/lib/cjs/ui-react-dom-debug.cjs.gz +0 -0
  57. package/lib/cjs/ui-react-dom.cjs +1 -0
  58. package/lib/cjs/ui-react-dom.cjs.gz +0 -0
  59. package/lib/cjs/ui-react.cjs +1 -0
  60. package/lib/cjs/ui-react.cjs.gz +0 -0
  61. package/lib/cjs-es6/checkpoints.cjs +1 -0
  62. package/lib/cjs-es6/checkpoints.cjs.gz +0 -0
  63. package/lib/cjs-es6/common.cjs +1 -0
  64. package/lib/cjs-es6/common.cjs.gz +0 -0
  65. package/lib/cjs-es6/indexes.cjs +1 -0
  66. package/lib/cjs-es6/indexes.cjs.gz +0 -0
  67. package/lib/cjs-es6/metrics.cjs +1 -0
  68. package/lib/cjs-es6/metrics.cjs.gz +0 -0
  69. package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -0
  70. package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
  71. package/lib/cjs-es6/persisters/persister-browser.cjs +1 -0
  72. package/lib/cjs-es6/persisters/persister-browser.cjs.gz +0 -0
  73. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -0
  74. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  75. package/lib/cjs-es6/persisters/persister-electric-sql.cjs +1 -0
  76. package/lib/cjs-es6/persisters/persister-electric-sql.cjs.gz +0 -0
  77. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs +1 -0
  78. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  79. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -0
  80. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
  81. package/lib/cjs-es6/persisters/persister-file.cjs +1 -0
  82. package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
  83. package/lib/cjs-es6/persisters/persister-indexed-db.cjs +1 -0
  84. package/lib/cjs-es6/persisters/persister-indexed-db.cjs.gz +0 -0
  85. package/lib/cjs-es6/persisters/persister-libsql.cjs +1 -0
  86. package/lib/cjs-es6/persisters/persister-libsql.cjs.gz +0 -0
  87. package/lib/cjs-es6/persisters/persister-partykit-client.cjs +1 -0
  88. package/lib/cjs-es6/persisters/persister-partykit-client.cjs.gz +0 -0
  89. package/lib/cjs-es6/persisters/persister-partykit-server.cjs +1 -0
  90. package/lib/cjs-es6/persisters/persister-partykit-server.cjs.gz +0 -0
  91. package/lib/cjs-es6/persisters/persister-powersync.cjs +1 -0
  92. package/lib/cjs-es6/persisters/persister-powersync.cjs.gz +0 -0
  93. package/lib/cjs-es6/persisters/persister-remote.cjs +1 -0
  94. package/lib/cjs-es6/persisters/persister-remote.cjs.gz +0 -0
  95. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -0
  96. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  97. package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -0
  98. package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
  99. package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -0
  100. package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
  101. package/lib/cjs-es6/persisters.cjs +1 -0
  102. package/lib/cjs-es6/persisters.cjs.gz +0 -0
  103. package/lib/cjs-es6/queries.cjs +1 -0
  104. package/lib/cjs-es6/queries.cjs.gz +0 -0
  105. package/lib/cjs-es6/relationships.cjs +1 -0
  106. package/lib/cjs-es6/relationships.cjs.gz +0 -0
  107. package/lib/cjs-es6/store.cjs +1 -0
  108. package/lib/cjs-es6/store.cjs.gz +0 -0
  109. package/lib/cjs-es6/tinybase.cjs +1 -0
  110. package/lib/cjs-es6/tinybase.cjs.gz +0 -0
  111. package/lib/cjs-es6/tools.cjs +1 -0
  112. package/lib/cjs-es6/tools.cjs.gz +0 -0
  113. package/lib/cjs-es6/ui-react-dom-debug.cjs +1 -0
  114. package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
  115. package/lib/cjs-es6/ui-react-dom.cjs +1 -0
  116. package/lib/cjs-es6/ui-react-dom.cjs.gz +0 -0
  117. package/lib/cjs-es6/ui-react.cjs +1 -0
  118. package/lib/cjs-es6/ui-react.cjs.gz +0 -0
  119. package/lib/common.js +1 -0
  120. package/lib/common.js.gz +0 -0
  121. package/lib/debug/checkpoints.js +412 -0
  122. package/lib/debug/common.js +4 -0
  123. package/lib/debug/indexes.js +544 -0
  124. package/lib/debug/metrics.js +516 -0
  125. package/lib/debug/persisters.js +183 -0
  126. package/lib/debug/queries.js +807 -0
  127. package/lib/debug/relationships.js +526 -0
  128. package/lib/debug/store.js +1602 -0
  129. package/lib/es6/checkpoints.js +1 -0
  130. package/lib/es6/checkpoints.js.gz +0 -0
  131. package/lib/es6/common.js +1 -0
  132. package/lib/es6/common.js.gz +0 -0
  133. package/lib/es6/indexes.js +1 -0
  134. package/lib/es6/indexes.js.gz +0 -0
  135. package/lib/es6/metrics.js +1 -0
  136. package/lib/es6/metrics.js.gz +0 -0
  137. package/lib/es6/persisters/persister-automerge.js +1 -0
  138. package/lib/es6/persisters/persister-automerge.js.gz +0 -0
  139. package/lib/es6/persisters/persister-browser.js +1 -0
  140. package/lib/es6/persisters/persister-browser.js.gz +0 -0
  141. package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -0
  142. package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  143. package/lib/es6/persisters/persister-electric-sql.js +1 -0
  144. package/lib/es6/persisters/persister-electric-sql.js.gz +0 -0
  145. package/lib/es6/persisters/persister-expo-sqlite-next.js +1 -0
  146. package/lib/es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  147. package/lib/es6/persisters/persister-expo-sqlite.js +1 -0
  148. package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
  149. package/lib/es6/persisters/persister-file.js +1 -0
  150. package/lib/es6/persisters/persister-file.js.gz +0 -0
  151. package/lib/es6/persisters/persister-indexed-db.js +1 -0
  152. package/lib/es6/persisters/persister-indexed-db.js.gz +0 -0
  153. package/lib/es6/persisters/persister-libsql.js +1 -0
  154. package/lib/es6/persisters/persister-libsql.js.gz +0 -0
  155. package/lib/es6/persisters/persister-partykit-client.js +1 -0
  156. package/lib/es6/persisters/persister-partykit-client.js.gz +0 -0
  157. package/lib/es6/persisters/persister-partykit-server.js +1 -0
  158. package/lib/es6/persisters/persister-partykit-server.js.gz +0 -0
  159. package/lib/es6/persisters/persister-powersync.js +1 -0
  160. package/lib/es6/persisters/persister-powersync.js.gz +0 -0
  161. package/lib/es6/persisters/persister-remote.js +1 -0
  162. package/lib/es6/persisters/persister-remote.js.gz +0 -0
  163. package/lib/es6/persisters/persister-sqlite-wasm.js +1 -0
  164. package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  165. package/lib/es6/persisters/persister-sqlite3.js +1 -0
  166. package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
  167. package/lib/es6/persisters/persister-yjs.js +1 -0
  168. package/lib/es6/persisters/persister-yjs.js.gz +0 -0
  169. package/lib/es6/persisters.js +1 -0
  170. package/lib/es6/persisters.js.gz +0 -0
  171. package/lib/es6/queries.js +1 -0
  172. package/lib/es6/queries.js.gz +0 -0
  173. package/lib/es6/relationships.js +1 -0
  174. package/lib/es6/relationships.js.gz +0 -0
  175. package/lib/es6/store.js +1 -0
  176. package/lib/es6/store.js.gz +0 -0
  177. package/lib/es6/tinybase.js +1 -0
  178. package/lib/es6/tinybase.js.gz +0 -0
  179. package/lib/es6/tools.js +1 -0
  180. package/lib/es6/tools.js.gz +0 -0
  181. package/lib/es6/ui-react-dom-debug.js +1 -0
  182. package/lib/es6/ui-react-dom-debug.js.gz +0 -0
  183. package/lib/es6/ui-react-dom.js +1 -0
  184. package/lib/es6/ui-react-dom.js.gz +0 -0
  185. package/lib/es6/ui-react.js +1 -0
  186. package/lib/es6/ui-react.js.gz +0 -0
  187. package/lib/indexes.js +1 -0
  188. package/lib/indexes.js.gz +0 -0
  189. package/lib/metrics.js +1 -0
  190. package/lib/metrics.js.gz +0 -0
  191. package/lib/persisters/persister-automerge.js +1 -0
  192. package/lib/persisters/persister-automerge.js.gz +0 -0
  193. package/lib/persisters/persister-browser.js +1 -0
  194. package/lib/persisters/persister-browser.js.gz +0 -0
  195. package/lib/persisters/persister-cr-sqlite-wasm.js +1 -0
  196. package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  197. package/lib/persisters/persister-electric-sql.js +1 -0
  198. package/lib/persisters/persister-electric-sql.js.gz +0 -0
  199. package/lib/persisters/persister-expo-sqlite-next.js +1 -0
  200. package/lib/persisters/persister-expo-sqlite-next.js.gz +0 -0
  201. package/lib/persisters/persister-expo-sqlite.js +1 -0
  202. package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
  203. package/lib/persisters/persister-file.js +1 -0
  204. package/lib/persisters/persister-file.js.gz +0 -0
  205. package/lib/persisters/persister-indexed-db.js +1 -0
  206. package/lib/persisters/persister-indexed-db.js.gz +0 -0
  207. package/lib/persisters/persister-libsql.js +1 -0
  208. package/lib/persisters/persister-libsql.js.gz +0 -0
  209. package/lib/persisters/persister-partykit-client.js +1 -0
  210. package/lib/persisters/persister-partykit-client.js.gz +0 -0
  211. package/lib/persisters/persister-partykit-server.js +1 -0
  212. package/lib/persisters/persister-partykit-server.js.gz +0 -0
  213. package/lib/persisters/persister-powersync.js +1 -0
  214. package/lib/persisters/persister-powersync.js.gz +0 -0
  215. package/lib/persisters/persister-remote.js +1 -0
  216. package/lib/persisters/persister-remote.js.gz +0 -0
  217. package/lib/persisters/persister-sqlite-wasm.js +1 -0
  218. package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
  219. package/lib/persisters/persister-sqlite3.js +1 -0
  220. package/lib/persisters/persister-sqlite3.js.gz +0 -0
  221. package/lib/persisters/persister-yjs.js +1 -0
  222. package/lib/persisters/persister-yjs.js.gz +0 -0
  223. package/lib/persisters.js +1 -0
  224. package/lib/persisters.js.gz +0 -0
  225. package/lib/queries.js +1 -0
  226. package/lib/queries.js.gz +0 -0
  227. package/lib/relationships.js +1 -0
  228. package/lib/relationships.js.gz +0 -0
  229. package/lib/store.js +1 -0
  230. package/lib/store.js.gz +0 -0
  231. package/lib/tinybase.js +1 -0
  232. package/lib/tinybase.js.gz +0 -0
  233. package/lib/tools.js +1 -0
  234. package/lib/tools.js.gz +0 -0
  235. package/lib/ui-react-dom.js +1 -0
  236. package/lib/ui-react-dom.js.gz +0 -0
  237. package/lib/ui-react.js +1 -0
  238. package/lib/ui-react.js.gz +0 -0
  239. package/lib/umd/checkpoints.js +1 -0
  240. package/lib/umd/checkpoints.js.gz +0 -0
  241. package/lib/umd/common.js +1 -0
  242. package/lib/umd/common.js.gz +0 -0
  243. package/lib/umd/indexes.js +1 -0
  244. package/lib/umd/indexes.js.gz +0 -0
  245. package/lib/umd/metrics.js +1 -0
  246. package/lib/umd/metrics.js.gz +0 -0
  247. package/lib/umd/persisters/persister-automerge.js +1 -0
  248. package/lib/umd/persisters/persister-automerge.js.gz +0 -0
  249. package/lib/umd/persisters/persister-browser.js +1 -0
  250. package/lib/umd/persisters/persister-browser.js.gz +0 -0
  251. package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -0
  252. package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  253. package/lib/umd/persisters/persister-electric-sql.js +1 -0
  254. package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
  255. package/lib/umd/persisters/persister-expo-sqlite-next.js +1 -0
  256. package/lib/umd/persisters/persister-expo-sqlite-next.js.gz +0 -0
  257. package/lib/umd/persisters/persister-expo-sqlite.js +1 -0
  258. package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
  259. package/lib/umd/persisters/persister-file.js +1 -0
  260. package/lib/umd/persisters/persister-file.js.gz +0 -0
  261. package/lib/umd/persisters/persister-indexed-db.js +1 -0
  262. package/lib/umd/persisters/persister-indexed-db.js.gz +0 -0
  263. package/lib/umd/persisters/persister-libsql.js +1 -0
  264. package/lib/umd/persisters/persister-libsql.js.gz +0 -0
  265. package/lib/umd/persisters/persister-partykit-client.js +1 -0
  266. package/lib/umd/persisters/persister-partykit-client.js.gz +0 -0
  267. package/lib/umd/persisters/persister-partykit-server.js +1 -0
  268. package/lib/umd/persisters/persister-partykit-server.js.gz +0 -0
  269. package/lib/umd/persisters/persister-powersync.js +1 -0
  270. package/lib/umd/persisters/persister-powersync.js.gz +0 -0
  271. package/lib/umd/persisters/persister-remote.js +1 -0
  272. package/lib/umd/persisters/persister-remote.js.gz +0 -0
  273. package/lib/umd/persisters/persister-sqlite-wasm.js +1 -0
  274. package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
  275. package/lib/umd/persisters/persister-sqlite3.js +1 -0
  276. package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
  277. package/lib/umd/persisters/persister-yjs.js +1 -0
  278. package/lib/umd/persisters/persister-yjs.js.gz +0 -0
  279. package/lib/umd/persisters.js +1 -0
  280. package/lib/umd/persisters.js.gz +0 -0
  281. package/lib/umd/queries.js +1 -0
  282. package/lib/umd/queries.js.gz +0 -0
  283. package/lib/umd/relationships.js +1 -0
  284. package/lib/umd/relationships.js.gz +0 -0
  285. package/lib/umd/store.js +1 -0
  286. package/lib/umd/store.js.gz +0 -0
  287. package/lib/umd/tinybase.js +1 -0
  288. package/lib/umd/tinybase.js.gz +0 -0
  289. package/lib/umd/tools.js +1 -0
  290. package/lib/umd/tools.js.gz +0 -0
  291. package/lib/umd/ui-react-dom-debug.js +1 -0
  292. package/lib/umd/ui-react-dom-debug.js.gz +0 -0
  293. package/lib/umd/ui-react-dom.js +1 -0
  294. package/lib/umd/ui-react-dom.js.gz +0 -0
  295. package/lib/umd/ui-react.js +1 -0
  296. package/lib/umd/ui-react.js.gz +0 -0
  297. package/lib/umd-es6/checkpoints.js +1 -0
  298. package/lib/umd-es6/checkpoints.js.gz +0 -0
  299. package/lib/umd-es6/common.js +1 -0
  300. package/lib/umd-es6/common.js.gz +0 -0
  301. package/lib/umd-es6/indexes.js +1 -0
  302. package/lib/umd-es6/indexes.js.gz +0 -0
  303. package/lib/umd-es6/metrics.js +1 -0
  304. package/lib/umd-es6/metrics.js.gz +0 -0
  305. package/lib/umd-es6/persisters/persister-automerge.js +1 -0
  306. package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
  307. package/lib/umd-es6/persisters/persister-browser.js +1 -0
  308. package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
  309. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -0
  310. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  311. package/lib/umd-es6/persisters/persister-electric-sql.js +1 -0
  312. package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
  313. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js +1 -0
  314. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  315. package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -0
  316. package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
  317. package/lib/umd-es6/persisters/persister-file.js +1 -0
  318. package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
  319. package/lib/umd-es6/persisters/persister-indexed-db.js +1 -0
  320. package/lib/umd-es6/persisters/persister-indexed-db.js.gz +0 -0
  321. package/lib/umd-es6/persisters/persister-libsql.js +1 -0
  322. package/lib/umd-es6/persisters/persister-libsql.js.gz +0 -0
  323. package/lib/umd-es6/persisters/persister-partykit-client.js +1 -0
  324. package/lib/umd-es6/persisters/persister-partykit-client.js.gz +0 -0
  325. package/lib/umd-es6/persisters/persister-partykit-server.js +1 -0
  326. package/lib/umd-es6/persisters/persister-partykit-server.js.gz +0 -0
  327. package/lib/umd-es6/persisters/persister-powersync.js +1 -0
  328. package/lib/umd-es6/persisters/persister-powersync.js.gz +0 -0
  329. package/lib/umd-es6/persisters/persister-remote.js +1 -0
  330. package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
  331. package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -0
  332. package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  333. package/lib/umd-es6/persisters/persister-sqlite3.js +1 -0
  334. package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
  335. package/lib/umd-es6/persisters/persister-yjs.js +1 -0
  336. package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
  337. package/lib/umd-es6/persisters.js +1 -0
  338. package/lib/umd-es6/persisters.js.gz +0 -0
  339. package/lib/umd-es6/queries.js +1 -0
  340. package/lib/umd-es6/queries.js.gz +0 -0
  341. package/lib/umd-es6/relationships.js +1 -0
  342. package/lib/umd-es6/relationships.js.gz +0 -0
  343. package/lib/umd-es6/store.js +1 -0
  344. package/lib/umd-es6/store.js.gz +0 -0
  345. package/lib/umd-es6/tinybase.js +1 -0
  346. package/lib/umd-es6/tinybase.js.gz +0 -0
  347. package/lib/umd-es6/tools.js +1 -0
  348. package/lib/umd-es6/tools.js.gz +0 -0
  349. package/lib/umd-es6/ui-react-dom-debug.js +1 -0
  350. package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
  351. package/lib/umd-es6/ui-react-dom.js +1 -0
  352. package/lib/umd-es6/ui-react-dom.js.gz +0 -0
  353. package/lib/umd-es6/ui-react.js +1 -0
  354. package/lib/umd-es6/ui-react.js.gz +0 -0
  355. package/package.json +1 -1
  356. package/readme.md +2 -2
@@ -0,0 +1,1602 @@
1
+ const getTypeOf = (thing) => typeof thing;
2
+ const EMPTY_STRING = '';
3
+ const STRING = getTypeOf(EMPTY_STRING);
4
+ const BOOLEAN = getTypeOf(true);
5
+ const NUMBER = getTypeOf(0);
6
+ const FUNCTION = getTypeOf(getTypeOf);
7
+ const TYPE = 'type';
8
+ const DEFAULT = 'default';
9
+ const LISTENER = 'Listener';
10
+ const ADD = 'add';
11
+ const HAS = 'Has';
12
+ const IDS = 'Ids';
13
+ const TABLE = 'Table';
14
+ const TABLES = TABLE + 's';
15
+ const TABLE_IDS = TABLE + IDS;
16
+ const ROW = 'Row';
17
+ const ROW_COUNT = ROW + 'Count';
18
+ const ROW_IDS = ROW + IDS;
19
+ const CELL = 'Cell';
20
+ const CELL_IDS = CELL + IDS;
21
+ const VALUE = 'Value';
22
+ const VALUES = VALUE + 's';
23
+ const VALUE_IDS = VALUE + IDS;
24
+ const id = (key) => EMPTY_STRING + key;
25
+
26
+ const isFiniteNumber = isFinite;
27
+ const isInstanceOf = (thing, cls) => thing instanceof cls;
28
+ const isUndefined = (thing) => thing == void 0;
29
+ const ifNotUndefined = (value, then, otherwise) =>
30
+ isUndefined(value) ? otherwise?.() : then(value);
31
+ const isTypeStringOrBoolean = (type) => type == STRING || type == BOOLEAN;
32
+ const isFunction = (thing) => getTypeOf(thing) == FUNCTION;
33
+ const isArray = (thing) => Array.isArray(thing);
34
+ const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
35
+ const size = (arrayOrString) => arrayOrString.length;
36
+ const test = (regex, subject) => regex.test(subject);
37
+
38
+ const arrayHas = (array, value) => array.includes(value);
39
+ const arrayEvery = (array, cb) => array.every(cb);
40
+ const arrayIsEqual = (array1, array2) =>
41
+ size(array1) === size(array2) &&
42
+ arrayEvery(array1, (value1, index) => array2[index] === value1);
43
+ const arraySort = (array, sorter) => array.sort(sorter);
44
+ const arrayForEach = (array, cb) => array.forEach(cb);
45
+ const arrayMap = (array, cb) => array.map(cb);
46
+ const arrayReduce = (array, cb, initial) => array.reduce(cb, initial);
47
+ const arrayPush = (array, ...values) => array.push(...values);
48
+ const arrayShift = (array) => array.shift();
49
+
50
+ const object = Object;
51
+ const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
52
+ const objIds = object.keys;
53
+ const objFrozen = object.isFrozen;
54
+ const objFreeze = object.freeze;
55
+ const isObject = (obj) =>
56
+ !isUndefined(obj) &&
57
+ ifNotUndefined(
58
+ getPrototypeOf(obj),
59
+ (objPrototype) =>
60
+ objPrototype == object.prototype ||
61
+ isUndefined(getPrototypeOf(objPrototype)),
62
+ () => true,
63
+ );
64
+ const objGet = (obj, id) => ifNotUndefined(obj, (obj2) => obj2[id]);
65
+ const objHas = (obj, id) => !isUndefined(objGet(obj, id));
66
+ const objDel = (obj, id) => {
67
+ delete obj[id];
68
+ return obj;
69
+ };
70
+ const objMap = (obj, cb) =>
71
+ arrayMap(object.entries(obj), ([id, value]) => cb(value, id));
72
+ const objSize = (obj) => size(objIds(obj));
73
+ const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
74
+
75
+ const collSizeN = (collSizer) => (coll) =>
76
+ arrayReduce(collValues(coll), (total, coll2) => total + collSizer(coll2), 0);
77
+ const collSize = (coll) => coll?.size ?? 0;
78
+ const collSize2 = collSizeN(collSize);
79
+ const collSize3 = collSizeN(collSize2);
80
+ const collSize4 = collSizeN(collSize3);
81
+ const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
82
+ const collIsEmpty = (coll) => isUndefined(coll) || collSize(coll) == 0;
83
+ const collValues = (coll) => [...(coll?.values() ?? [])];
84
+ const collClear = (coll) => coll.clear();
85
+ const collForEach = (coll, cb) => coll?.forEach(cb);
86
+ const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
87
+
88
+ const mapNew = (entries) => new Map(entries);
89
+ const mapKeys = (map) => [...(map?.keys() ?? [])];
90
+ const mapGet = (map, key) => map?.get(key);
91
+ const mapForEach = (map, cb) =>
92
+ collForEach(map, (value, key) => cb(key, value));
93
+ const mapMap = (coll, cb) =>
94
+ arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
95
+ const mapSet = (map, key, value) =>
96
+ isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
97
+ const mapEnsure = (map, key, getDefaultValue) => {
98
+ if (!collHas(map, key)) {
99
+ mapSet(map, key, getDefaultValue());
100
+ }
101
+ return mapGet(map, key);
102
+ };
103
+ const mapMatch = (map, obj, set, del = mapSet) => {
104
+ objMap(obj, (value, id) => set(map, id, value));
105
+ mapForEach(map, (id) => (objHas(obj, id) ? 0 : del(map, id)));
106
+ return map;
107
+ };
108
+ const mapToObj = (map, mapValue, excludeValue) => {
109
+ const obj = {};
110
+ collForEach(map, (value, id) => {
111
+ const mappedValue = mapValue ? mapValue(value, id) : value;
112
+ excludeValue?.(mappedValue, value) ? 0 : (obj[id] = mappedValue);
113
+ });
114
+ return obj;
115
+ };
116
+ const mapToObj2 = (map, mapValue, excludeValue) =>
117
+ mapToObj(
118
+ map,
119
+ (childMap) => mapToObj(childMap, mapValue, excludeValue),
120
+ objIsEmpty,
121
+ );
122
+ const mapToObj3 = (map, mapValue, excludeValue) =>
123
+ mapToObj(
124
+ map,
125
+ (childMap) => mapToObj2(childMap, mapValue, excludeValue),
126
+ objIsEmpty,
127
+ );
128
+ const mapClone = (map, mapValue) => {
129
+ const map2 = mapNew();
130
+ collForEach(map, (value, key) => map2.set(key, mapValue?.(value) ?? value));
131
+ return map2;
132
+ };
133
+ const mapClone2 = (map) => mapClone(map, mapClone);
134
+ const mapClone3 = (map) => mapClone(map, mapClone2);
135
+ const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
136
+ ifNotUndefined(
137
+ (ensureLeaf ? mapEnsure : mapGet)(
138
+ node,
139
+ path[p],
140
+ p > size(path) - 2 ? ensureLeaf : mapNew,
141
+ ),
142
+ (nodeOrLeaf) => {
143
+ if (p > size(path) - 2) {
144
+ if (pruneLeaf?.(nodeOrLeaf)) {
145
+ mapSet(node, path[p]);
146
+ }
147
+ return nodeOrLeaf;
148
+ }
149
+ const leaf = visitTree(nodeOrLeaf, path, ensureLeaf, pruneLeaf, p + 1);
150
+ if (collIsEmpty(nodeOrLeaf)) {
151
+ mapSet(node, path[p]);
152
+ }
153
+ return leaf;
154
+ },
155
+ );
156
+
157
+ const setNew = (entryOrEntries) =>
158
+ new Set(
159
+ isArray(entryOrEntries) || isUndefined(entryOrEntries)
160
+ ? entryOrEntries
161
+ : [entryOrEntries],
162
+ );
163
+ const setAdd = (set, value) => set?.add(value);
164
+
165
+ const INTEGER = /^\d+$/;
166
+ const getPoolFunctions = () => {
167
+ const pool = [];
168
+ let nextId = 0;
169
+ return [
170
+ (reuse) => (reuse ? arrayShift(pool) : null) ?? EMPTY_STRING + nextId++,
171
+ (id) => {
172
+ if (test(INTEGER, id) && size(pool) < 1e3) {
173
+ arrayPush(pool, id);
174
+ }
175
+ },
176
+ ];
177
+ };
178
+
179
+ const getWildcardedLeaves = (deepIdSet, path = [EMPTY_STRING]) => {
180
+ const leaves = [];
181
+ const deep = (node, p) =>
182
+ p == size(path)
183
+ ? arrayPush(leaves, node)
184
+ : path[p] === null
185
+ ? collForEach(node, (node2) => deep(node2, p + 1))
186
+ : arrayForEach([path[p], null], (id) => deep(mapGet(node, id), p + 1));
187
+ deep(deepIdSet, 0);
188
+ return leaves;
189
+ };
190
+ const getListenerFunctions = (getThing) => {
191
+ let thing;
192
+ const [getId, releaseId] = getPoolFunctions();
193
+ const allListeners = mapNew();
194
+ const addListener = (
195
+ listener,
196
+ idSetNode,
197
+ path,
198
+ pathGetters = [],
199
+ extraArgsGetter = () => [],
200
+ ) => {
201
+ thing ??= getThing();
202
+ const id = getId(1);
203
+ mapSet(allListeners, id, [
204
+ listener,
205
+ idSetNode,
206
+ path,
207
+ pathGetters,
208
+ extraArgsGetter,
209
+ ]);
210
+ setAdd(visitTree(idSetNode, path ?? [EMPTY_STRING], setNew), id);
211
+ return id;
212
+ };
213
+ const callListeners = (idSetNode, ids, ...extraArgs) =>
214
+ arrayForEach(getWildcardedLeaves(idSetNode, ids), (set) =>
215
+ collForEach(set, (id) =>
216
+ mapGet(allListeners, id)[0](thing, ...(ids ?? []), ...extraArgs),
217
+ ),
218
+ );
219
+ const delListener = (id) =>
220
+ ifNotUndefined(mapGet(allListeners, id), ([, idSetNode, idOrNulls]) => {
221
+ visitTree(idSetNode, idOrNulls ?? [EMPTY_STRING], void 0, (idSet) => {
222
+ collDel(idSet, id);
223
+ return collIsEmpty(idSet) ? 1 : 0;
224
+ });
225
+ mapSet(allListeners, id);
226
+ releaseId(id);
227
+ return idOrNulls;
228
+ });
229
+ const callListener = (id) =>
230
+ ifNotUndefined(
231
+ mapGet(allListeners, id),
232
+ ([listener, , path = [], pathGetters, extraArgsGetter]) => {
233
+ const callWithIds = (...ids) => {
234
+ const index = size(ids);
235
+ index == size(path)
236
+ ? listener(thing, ...ids, ...extraArgsGetter(ids))
237
+ : isUndefined(path[index])
238
+ ? arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
239
+ callWithIds(...ids, id2),
240
+ )
241
+ : callWithIds(...ids, path[index]);
242
+ };
243
+ callWithIds();
244
+ },
245
+ );
246
+ return [addListener, callListeners, delListener, callListener];
247
+ };
248
+
249
+ const pairNew = (value) => [value, value];
250
+ const pairCollSize2 = (pair, func = collSize2) => func(pair[0]) + func(pair[1]);
251
+ const pairNewMap = () => [mapNew(), mapNew()];
252
+ const pairClone = (array) => [...array];
253
+ const pairIsEqual = ([entry1, entry2]) => entry1 === entry2;
254
+
255
+ const getCellOrValueType = (cell) => {
256
+ const type = getTypeOf(cell);
257
+ return isTypeStringOrBoolean(type) || (type == NUMBER && isFiniteNumber(cell))
258
+ ? type
259
+ : void 0;
260
+ };
261
+ const setOrDelCell = (store, tableId, rowId, cellId, cell) =>
262
+ isUndefined(cell)
263
+ ? store.delCell(tableId, rowId, cellId, true)
264
+ : store.setCell(tableId, rowId, cellId, cell);
265
+ const setOrDelValue = (store, valueId, value) =>
266
+ isUndefined(value) ? store.delValue(valueId) : store.setValue(valueId, value);
267
+
268
+ const jsonString = (obj) =>
269
+ JSON.stringify(obj, (_key, value) =>
270
+ isInstanceOf(value, Map) ? object.fromEntries([...value]) : value,
271
+ );
272
+ const jsonParse = JSON.parse;
273
+
274
+ const defaultSorter = (sortKey1, sortKey2) =>
275
+ (sortKey1 ?? 0) < (sortKey2 ?? 0) ? -1 : 1;
276
+
277
+ const validate = (obj, validateChild, onInvalidObj) => {
278
+ if (isUndefined(obj) || !isObject(obj) || objIsEmpty(obj) || objFrozen(obj)) {
279
+ onInvalidObj?.();
280
+ return false;
281
+ }
282
+ objMap(obj, (child, id2) => {
283
+ if (!validateChild(child, id2)) {
284
+ objDel(obj, id2);
285
+ }
286
+ });
287
+ return !objIsEmpty(obj);
288
+ };
289
+ const idsChanged = (changedIds, id2, addedOrRemoved) =>
290
+ mapSet(
291
+ changedIds,
292
+ id2,
293
+ mapGet(changedIds, id2) == -addedOrRemoved ? void 0 : addedOrRemoved,
294
+ );
295
+ const createStore = () => {
296
+ let hasTablesSchema;
297
+ let hasValuesSchema;
298
+ let cellsTouched = false;
299
+ let valuesTouched = false;
300
+ let hadTables = false;
301
+ let hadValues = false;
302
+ let transactions = 0;
303
+ const changedTableIds = mapNew();
304
+ const changedTableCellIds = mapNew();
305
+ const changedRowCount = mapNew();
306
+ const changedRowIds = mapNew();
307
+ const changedCellIds = mapNew();
308
+ const changedCells = mapNew();
309
+ const changedValueIds = mapNew();
310
+ const changedValues = mapNew();
311
+ const invalidCells = mapNew();
312
+ const invalidValues = mapNew();
313
+ const tablesSchemaMap = mapNew();
314
+ const tablesSchemaRowCache = mapNew();
315
+ const valuesSchemaMap = mapNew();
316
+ const valuesDefaulted = mapNew();
317
+ const valuesNonDefaulted = setNew();
318
+ const tablePoolFunctions = mapNew();
319
+ const tableCellIds = mapNew();
320
+ const tablesMap = mapNew();
321
+ const valuesMap = mapNew();
322
+ const hasTablesListeners = pairNewMap();
323
+ const tablesListeners = pairNewMap();
324
+ const tableIdsListeners = pairNewMap();
325
+ const hasTableListeners = pairNewMap();
326
+ const tableListeners = pairNewMap();
327
+ const tableCellIdsListeners = pairNewMap();
328
+ const hasTableCellListeners = pairNewMap();
329
+ const rowCountListeners = pairNewMap();
330
+ const rowIdsListeners = pairNewMap();
331
+ const sortedRowIdsListeners = pairNewMap();
332
+ const hasRowListeners = pairNewMap();
333
+ const rowListeners = pairNewMap();
334
+ const cellIdsListeners = pairNewMap();
335
+ const hasCellListeners = pairNewMap();
336
+ const cellListeners = pairNewMap();
337
+ const invalidCellListeners = pairNewMap();
338
+ const invalidValueListeners = pairNewMap();
339
+ const hasValuesListeners = pairNewMap();
340
+ const valuesListeners = pairNewMap();
341
+ const valueIdsListeners = pairNewMap();
342
+ const hasValueListeners = pairNewMap();
343
+ const valueListeners = pairNewMap();
344
+ const startTransactionListeners = mapNew();
345
+ const finishTransactionListeners = pairNewMap();
346
+ const [addListener, callListeners, delListenerImpl, callListenerImpl] =
347
+ getListenerFunctions(() => store);
348
+ const validateTablesSchema = (tableSchema) =>
349
+ validate(tableSchema, (tableSchema2) =>
350
+ validate(tableSchema2, validateCellOrValueSchema),
351
+ );
352
+ const validateValuesSchema = (valuesSchema) =>
353
+ validate(valuesSchema, validateCellOrValueSchema);
354
+ const validateCellOrValueSchema = (schema) => {
355
+ if (!validate(schema, (_child, id2) => arrayHas([TYPE, DEFAULT], id2))) {
356
+ return false;
357
+ }
358
+ const type = schema[TYPE];
359
+ if (!isTypeStringOrBoolean(type) && type != NUMBER) {
360
+ return false;
361
+ }
362
+ if (getCellOrValueType(schema[DEFAULT]) != type) {
363
+ objDel(schema, DEFAULT);
364
+ }
365
+ return true;
366
+ };
367
+ const validateTables = (tables) =>
368
+ validate(tables, validateTable, cellInvalid);
369
+ const validateTable = (table, tableId) =>
370
+ (!hasTablesSchema ||
371
+ collHas(tablesSchemaMap, tableId) ||
372
+ cellInvalid(tableId)) &&
373
+ validate(
374
+ table,
375
+ (row, rowId) => validateRow(tableId, rowId, row),
376
+ () => cellInvalid(tableId),
377
+ );
378
+ const validateRow = (tableId, rowId, row, skipDefaults) =>
379
+ validate(
380
+ skipDefaults ? row : addDefaultsToRow(row, tableId, rowId),
381
+ (cell, cellId) =>
382
+ ifNotUndefined(
383
+ getValidatedCell(tableId, rowId, cellId, cell),
384
+ (validCell) => {
385
+ row[cellId] = validCell;
386
+ return true;
387
+ },
388
+ () => false,
389
+ ),
390
+ () => cellInvalid(tableId, rowId),
391
+ );
392
+ const getValidatedCell = (tableId, rowId, cellId, cell) =>
393
+ hasTablesSchema
394
+ ? ifNotUndefined(
395
+ mapGet(mapGet(tablesSchemaMap, tableId), cellId),
396
+ (cellSchema) =>
397
+ getCellOrValueType(cell) != cellSchema[TYPE]
398
+ ? cellInvalid(tableId, rowId, cellId, cell, cellSchema[DEFAULT])
399
+ : cell,
400
+ () => cellInvalid(tableId, rowId, cellId, cell),
401
+ )
402
+ : isUndefined(getCellOrValueType(cell))
403
+ ? cellInvalid(tableId, rowId, cellId, cell)
404
+ : cell;
405
+ const validateValues = (values, skipDefaults) =>
406
+ validate(
407
+ skipDefaults ? values : addDefaultsToValues(values),
408
+ (value, valueId) =>
409
+ ifNotUndefined(
410
+ getValidatedValue(valueId, value),
411
+ (validValue) => {
412
+ values[valueId] = validValue;
413
+ return true;
414
+ },
415
+ () => false,
416
+ ),
417
+ () => valueInvalid(),
418
+ );
419
+ const getValidatedValue = (valueId, value) =>
420
+ hasValuesSchema
421
+ ? ifNotUndefined(
422
+ mapGet(valuesSchemaMap, valueId),
423
+ (valueSchema) =>
424
+ getCellOrValueType(value) != valueSchema[TYPE]
425
+ ? valueInvalid(valueId, value, valueSchema[DEFAULT])
426
+ : value,
427
+ () => valueInvalid(valueId, value),
428
+ )
429
+ : isUndefined(getCellOrValueType(value))
430
+ ? valueInvalid(valueId, value)
431
+ : value;
432
+ const addDefaultsToRow = (row, tableId, rowId) => {
433
+ ifNotUndefined(
434
+ mapGet(tablesSchemaRowCache, tableId),
435
+ ([rowDefaulted, rowNonDefaulted]) => {
436
+ collForEach(rowDefaulted, (cell, cellId) => {
437
+ if (!objHas(row, cellId)) {
438
+ row[cellId] = cell;
439
+ }
440
+ });
441
+ collForEach(rowNonDefaulted, (cellId) => {
442
+ if (!objHas(row, cellId)) {
443
+ cellInvalid(tableId, rowId, cellId);
444
+ }
445
+ });
446
+ },
447
+ );
448
+ return row;
449
+ };
450
+ const addDefaultsToValues = (values) => {
451
+ if (hasValuesSchema) {
452
+ collForEach(valuesDefaulted, (value, valueId) => {
453
+ if (!objHas(values, valueId)) {
454
+ values[valueId] = value;
455
+ }
456
+ });
457
+ collForEach(valuesNonDefaulted, (valueId) => {
458
+ if (!objHas(values, valueId)) {
459
+ valueInvalid(valueId);
460
+ }
461
+ });
462
+ }
463
+ return values;
464
+ };
465
+ const setValidTablesSchema = (tablesSchema) =>
466
+ mapMatch(
467
+ tablesSchemaMap,
468
+ tablesSchema,
469
+ (_tablesSchema, tableId, tableSchema) => {
470
+ const rowDefaulted = mapNew();
471
+ const rowNonDefaulted = setNew();
472
+ mapMatch(
473
+ mapEnsure(tablesSchemaMap, tableId, mapNew),
474
+ tableSchema,
475
+ (tableSchemaMap, cellId, cellSchema) => {
476
+ mapSet(tableSchemaMap, cellId, cellSchema);
477
+ ifNotUndefined(
478
+ cellSchema[DEFAULT],
479
+ (def) => mapSet(rowDefaulted, cellId, def),
480
+ () => setAdd(rowNonDefaulted, cellId),
481
+ );
482
+ },
483
+ );
484
+ mapSet(tablesSchemaRowCache, tableId, [rowDefaulted, rowNonDefaulted]);
485
+ },
486
+ (_tablesSchema, tableId) => {
487
+ mapSet(tablesSchemaMap, tableId);
488
+ mapSet(tablesSchemaRowCache, tableId);
489
+ },
490
+ );
491
+ const setValidValuesSchema = (valuesSchema) =>
492
+ mapMatch(
493
+ valuesSchemaMap,
494
+ valuesSchema,
495
+ (_valuesSchema, valueId, valueSchema) => {
496
+ mapSet(valuesSchemaMap, valueId, valueSchema);
497
+ ifNotUndefined(
498
+ valueSchema[DEFAULT],
499
+ (def) => mapSet(valuesDefaulted, valueId, def),
500
+ () => setAdd(valuesNonDefaulted, valueId),
501
+ );
502
+ },
503
+ (_valuesSchema, valueId) => {
504
+ mapSet(valuesSchemaMap, valueId);
505
+ mapSet(valuesDefaulted, valueId);
506
+ collDel(valuesNonDefaulted, valueId);
507
+ },
508
+ );
509
+ const setOrDelTables = (tables) =>
510
+ objIsEmpty(tables) ? delTables() : setTables(tables);
511
+ const setValidTables = (tables) =>
512
+ mapMatch(
513
+ tablesMap,
514
+ tables,
515
+ (_tables, tableId, table) => setValidTable(tableId, table),
516
+ (_tables, tableId) => delValidTable(tableId),
517
+ );
518
+ const setValidTable = (tableId, table) =>
519
+ mapMatch(
520
+ mapEnsure(tablesMap, tableId, () => {
521
+ tableIdsChanged(tableId, 1);
522
+ mapSet(tablePoolFunctions, tableId, getPoolFunctions());
523
+ mapSet(tableCellIds, tableId, mapNew());
524
+ return mapNew();
525
+ }),
526
+ table,
527
+ (tableMap, rowId, row) => setValidRow(tableId, tableMap, rowId, row),
528
+ (tableMap, rowId) => delValidRow(tableId, tableMap, rowId),
529
+ );
530
+ const setValidRow = (tableId, tableMap, rowId, row, forceDel) =>
531
+ mapMatch(
532
+ mapEnsure(tableMap, rowId, () => {
533
+ rowIdsChanged(tableId, rowId, 1);
534
+ return mapNew();
535
+ }),
536
+ row,
537
+ (rowMap, cellId, cell) =>
538
+ setValidCell(tableId, rowId, rowMap, cellId, cell),
539
+ (rowMap, cellId) =>
540
+ delValidCell(tableId, tableMap, rowId, rowMap, cellId, forceDel),
541
+ );
542
+ const setValidCell = (tableId, rowId, rowMap, cellId, cell) => {
543
+ if (!collHas(rowMap, cellId)) {
544
+ cellIdsChanged(tableId, rowId, cellId, 1);
545
+ }
546
+ const oldCell = mapGet(rowMap, cellId);
547
+ if (cell !== oldCell) {
548
+ cellChanged(tableId, rowId, cellId, oldCell, cell);
549
+ mapSet(rowMap, cellId, cell);
550
+ }
551
+ };
552
+ const setCellIntoDefaultRow = (tableId, tableMap, rowId, cellId, validCell) =>
553
+ ifNotUndefined(
554
+ mapGet(tableMap, rowId),
555
+ (rowMap) => setValidCell(tableId, rowId, rowMap, cellId, validCell),
556
+ () =>
557
+ setValidRow(
558
+ tableId,
559
+ tableMap,
560
+ rowId,
561
+ addDefaultsToRow({[cellId]: validCell}, tableId, rowId),
562
+ ),
563
+ );
564
+ const setOrDelValues = (values) =>
565
+ objIsEmpty(values) ? delValues() : setValues(values);
566
+ const setValidValues = (values) =>
567
+ mapMatch(
568
+ valuesMap,
569
+ values,
570
+ (_valuesMap, valueId, value) => setValidValue(valueId, value),
571
+ (_valuesMap, valueId) => delValidValue(valueId),
572
+ );
573
+ const setValidValue = (valueId, value) => {
574
+ if (!collHas(valuesMap, valueId)) {
575
+ valueIdsChanged(valueId, 1);
576
+ }
577
+ const oldValue = mapGet(valuesMap, valueId);
578
+ if (value !== oldValue) {
579
+ valueChanged(valueId, oldValue, value);
580
+ mapSet(valuesMap, valueId, value);
581
+ }
582
+ };
583
+ const getNewRowId = (tableId, reuse) => {
584
+ const [getId] = mapGet(tablePoolFunctions, tableId);
585
+ const rowId = getId(reuse);
586
+ if (!collHas(mapGet(tablesMap, tableId), rowId)) {
587
+ return rowId;
588
+ }
589
+ return getNewRowId(tableId, reuse);
590
+ };
591
+ const getOrCreateTable = (tableId) =>
592
+ mapGet(tablesMap, tableId) ?? setValidTable(tableId, {});
593
+ const delValidTable = (tableId) => setValidTable(tableId, {});
594
+ const delValidRow = (tableId, tableMap, rowId) => {
595
+ const [, releaseId] = mapGet(tablePoolFunctions, tableId);
596
+ releaseId(rowId);
597
+ setValidRow(tableId, tableMap, rowId, {}, true);
598
+ };
599
+ const delValidCell = (tableId, table, rowId, row, cellId, forceDel) => {
600
+ const defaultCell = mapGet(
601
+ mapGet(tablesSchemaRowCache, tableId)?.[0],
602
+ cellId,
603
+ );
604
+ if (!isUndefined(defaultCell) && !forceDel) {
605
+ return setValidCell(tableId, rowId, row, cellId, defaultCell);
606
+ }
607
+ const delCell2 = (cellId2) => {
608
+ cellChanged(tableId, rowId, cellId2, mapGet(row, cellId2));
609
+ cellIdsChanged(tableId, rowId, cellId2, -1);
610
+ mapSet(row, cellId2);
611
+ };
612
+ isUndefined(defaultCell) ? delCell2(cellId) : mapForEach(row, delCell2);
613
+ if (collIsEmpty(row)) {
614
+ rowIdsChanged(tableId, rowId, -1);
615
+ if (collIsEmpty(mapSet(table, rowId))) {
616
+ tableIdsChanged(tableId, -1);
617
+ mapSet(tablesMap, tableId);
618
+ mapSet(tablePoolFunctions, tableId);
619
+ mapSet(tableCellIds, tableId);
620
+ }
621
+ }
622
+ };
623
+ const delValidValue = (valueId) => {
624
+ const defaultValue = mapGet(valuesDefaulted, valueId);
625
+ if (!isUndefined(defaultValue)) {
626
+ return setValidValue(valueId, defaultValue);
627
+ }
628
+ valueChanged(valueId, mapGet(valuesMap, valueId));
629
+ valueIdsChanged(valueId, -1);
630
+ mapSet(valuesMap, valueId);
631
+ };
632
+ const tableIdsChanged = (tableId, addedOrRemoved) =>
633
+ idsChanged(changedTableIds, tableId, addedOrRemoved);
634
+ const rowIdsChanged = (tableId, rowId, addedOrRemoved) =>
635
+ idsChanged(
636
+ mapEnsure(changedRowIds, tableId, mapNew),
637
+ rowId,
638
+ addedOrRemoved,
639
+ ) &&
640
+ mapSet(
641
+ changedRowCount,
642
+ tableId,
643
+ mapEnsure(changedRowCount, tableId, () => 0) + addedOrRemoved,
644
+ );
645
+ const cellIdsChanged = (tableId, rowId, cellId, addedOrRemoved) => {
646
+ const cellIds = mapGet(tableCellIds, tableId);
647
+ const count = mapGet(cellIds, cellId) ?? 0;
648
+ if (
649
+ (count == 0 && addedOrRemoved == 1) ||
650
+ (count == 1 && addedOrRemoved == -1)
651
+ ) {
652
+ idsChanged(
653
+ mapEnsure(changedTableCellIds, tableId, mapNew),
654
+ cellId,
655
+ addedOrRemoved,
656
+ );
657
+ }
658
+ mapSet(
659
+ cellIds,
660
+ cellId,
661
+ count != -addedOrRemoved ? count + addedOrRemoved : null,
662
+ );
663
+ idsChanged(
664
+ mapEnsure(mapEnsure(changedCellIds, tableId, mapNew), rowId, mapNew),
665
+ cellId,
666
+ addedOrRemoved,
667
+ );
668
+ };
669
+ const cellChanged = (tableId, rowId, cellId, oldCell, newCell) =>
670
+ (mapEnsure(
671
+ mapEnsure(mapEnsure(changedCells, tableId, mapNew), rowId, mapNew),
672
+ cellId,
673
+ () => [oldCell, 0],
674
+ )[1] = newCell);
675
+ const valueIdsChanged = (valueId, addedOrRemoved) =>
676
+ idsChanged(changedValueIds, valueId, addedOrRemoved);
677
+ const valueChanged = (valueId, oldValue, newValue) =>
678
+ (mapEnsure(changedValues, valueId, () => [oldValue, 0])[1] = newValue);
679
+ const cellInvalid = (tableId, rowId, cellId, invalidCell, defaultedCell) => {
680
+ arrayPush(
681
+ mapEnsure(
682
+ mapEnsure(mapEnsure(invalidCells, tableId, mapNew), rowId, mapNew),
683
+ cellId,
684
+ () => [],
685
+ ),
686
+ invalidCell,
687
+ );
688
+ return defaultedCell;
689
+ };
690
+ const valueInvalid = (valueId, invalidValue, defaultedValue) => {
691
+ arrayPush(
692
+ mapEnsure(invalidValues, valueId, () => []),
693
+ invalidValue,
694
+ );
695
+ return defaultedValue;
696
+ };
697
+ const getCellChange = (tableId, rowId, cellId) =>
698
+ ifNotUndefined(
699
+ mapGet(mapGet(mapGet(changedCells, tableId), rowId), cellId),
700
+ ([oldCell, newCell]) => [true, oldCell, newCell],
701
+ () => [false, ...pairNew(getCell(tableId, rowId, cellId))],
702
+ );
703
+ const getValueChange = (valueId) =>
704
+ ifNotUndefined(
705
+ mapGet(changedValues, valueId),
706
+ ([oldValue, newValue]) => [true, oldValue, newValue],
707
+ () => [false, ...pairNew(getValue(valueId))],
708
+ );
709
+ const callInvalidCellListeners = (mutator) =>
710
+ !collIsEmpty(invalidCells) && !collIsEmpty(invalidCellListeners[mutator])
711
+ ? collForEach(
712
+ mutator ? mapClone3(invalidCells) : invalidCells,
713
+ (rows, tableId) =>
714
+ collForEach(rows, (cells, rowId) =>
715
+ collForEach(cells, (invalidCell, cellId) =>
716
+ callListeners(
717
+ invalidCellListeners[mutator],
718
+ [tableId, rowId, cellId],
719
+ invalidCell,
720
+ ),
721
+ ),
722
+ ),
723
+ )
724
+ : 0;
725
+ const callInvalidValueListeners = (mutator) =>
726
+ !collIsEmpty(invalidValues) && !collIsEmpty(invalidValueListeners[mutator])
727
+ ? collForEach(
728
+ mutator ? mapClone(invalidValues) : invalidValues,
729
+ (invalidValue, valueId) =>
730
+ callListeners(
731
+ invalidValueListeners[mutator],
732
+ [valueId],
733
+ invalidValue,
734
+ ),
735
+ )
736
+ : 0;
737
+ const callIdsAndHasListenersIfChanged = (
738
+ changedIds,
739
+ idListeners,
740
+ hasListeners,
741
+ ids,
742
+ ) => {
743
+ if (!collIsEmpty(changedIds)) {
744
+ callListeners(idListeners, ids, () => mapToObj(changedIds));
745
+ mapForEach(changedIds, (changedId, changed) =>
746
+ callListeners(hasListeners, [...(ids ?? []), changedId], changed == 1),
747
+ );
748
+ return 1;
749
+ }
750
+ };
751
+ const callTabularListenersForChanges = (mutator) => {
752
+ const hasTablesNow = hasTables();
753
+ if (hasTablesNow != hadTables) {
754
+ callListeners(hasTablesListeners[mutator], void 0, hasTablesNow);
755
+ }
756
+ const emptySortedRowIdListeners = collIsEmpty(
757
+ sortedRowIdsListeners[mutator],
758
+ );
759
+ const emptyIdAndHasListeners =
760
+ collIsEmpty(cellIdsListeners[mutator]) &&
761
+ collIsEmpty(hasCellListeners[mutator]) &&
762
+ collIsEmpty(rowIdsListeners[mutator]) &&
763
+ collIsEmpty(hasRowListeners[mutator]) &&
764
+ collIsEmpty(tableCellIdsListeners[mutator]) &&
765
+ collIsEmpty(hasTableCellListeners[mutator]) &&
766
+ collIsEmpty(rowCountListeners[mutator]) &&
767
+ emptySortedRowIdListeners &&
768
+ collIsEmpty(tableIdsListeners[mutator]) &&
769
+ collIsEmpty(hasTableListeners[mutator]);
770
+ const emptyOtherListeners =
771
+ collIsEmpty(cellListeners[mutator]) &&
772
+ collIsEmpty(rowListeners[mutator]) &&
773
+ collIsEmpty(tableListeners[mutator]) &&
774
+ collIsEmpty(tablesListeners[mutator]);
775
+ if (!emptyIdAndHasListeners || !emptyOtherListeners) {
776
+ const changes = mutator
777
+ ? [
778
+ mapClone(changedTableIds),
779
+ mapClone2(changedTableCellIds),
780
+ mapClone(changedRowCount),
781
+ mapClone2(changedRowIds),
782
+ mapClone3(changedCellIds),
783
+ mapClone3(changedCells),
784
+ ]
785
+ : [
786
+ changedTableIds,
787
+ changedTableCellIds,
788
+ changedRowCount,
789
+ changedRowIds,
790
+ changedCellIds,
791
+ changedCells,
792
+ ];
793
+ if (!emptyIdAndHasListeners) {
794
+ callIdsAndHasListenersIfChanged(
795
+ changes[0],
796
+ tableIdsListeners[mutator],
797
+ hasTableListeners[mutator],
798
+ );
799
+ collForEach(changes[1], (changedIds, tableId) =>
800
+ callIdsAndHasListenersIfChanged(
801
+ changedIds,
802
+ tableCellIdsListeners[mutator],
803
+ hasTableCellListeners[mutator],
804
+ [tableId],
805
+ ),
806
+ );
807
+ collForEach(changes[2], (changedCount, tableId) => {
808
+ if (changedCount != 0) {
809
+ callListeners(
810
+ rowCountListeners[mutator],
811
+ [tableId],
812
+ getRowCount(tableId),
813
+ );
814
+ }
815
+ });
816
+ const calledSortableTableIds = setNew();
817
+ collForEach(changes[3], (changedIds, tableId) => {
818
+ if (
819
+ callIdsAndHasListenersIfChanged(
820
+ changedIds,
821
+ rowIdsListeners[mutator],
822
+ hasRowListeners[mutator],
823
+ [tableId],
824
+ ) &&
825
+ !emptySortedRowIdListeners
826
+ ) {
827
+ callListeners(sortedRowIdsListeners[mutator], [tableId, null]);
828
+ setAdd(calledSortableTableIds, tableId);
829
+ }
830
+ });
831
+ if (!emptySortedRowIdListeners) {
832
+ collForEach(changes[5], (rows, tableId) => {
833
+ if (!collHas(calledSortableTableIds, tableId)) {
834
+ const sortableCellIds = setNew();
835
+ collForEach(rows, (cells) =>
836
+ collForEach(cells, ([oldCell, newCell], cellId) =>
837
+ newCell !== oldCell
838
+ ? setAdd(sortableCellIds, cellId)
839
+ : collDel(cells, cellId),
840
+ ),
841
+ );
842
+ collForEach(sortableCellIds, (cellId) =>
843
+ callListeners(sortedRowIdsListeners[mutator], [
844
+ tableId,
845
+ cellId,
846
+ ]),
847
+ );
848
+ }
849
+ });
850
+ }
851
+ collForEach(changes[4], (rowCellIds, tableId) =>
852
+ collForEach(rowCellIds, (changedIds, rowId) =>
853
+ callIdsAndHasListenersIfChanged(
854
+ changedIds,
855
+ cellIdsListeners[mutator],
856
+ hasCellListeners[mutator],
857
+ [tableId, rowId],
858
+ ),
859
+ ),
860
+ );
861
+ }
862
+ if (!emptyOtherListeners) {
863
+ let tablesChanged;
864
+ collForEach(changes[5], (rows, tableId) => {
865
+ let tableChanged;
866
+ collForEach(rows, (cells, rowId) => {
867
+ let rowChanged;
868
+ collForEach(cells, ([oldCell, newCell], cellId) => {
869
+ if (newCell !== oldCell) {
870
+ callListeners(
871
+ cellListeners[mutator],
872
+ [tableId, rowId, cellId],
873
+ newCell,
874
+ oldCell,
875
+ getCellChange,
876
+ );
877
+ tablesChanged = tableChanged = rowChanged = 1;
878
+ }
879
+ });
880
+ if (rowChanged) {
881
+ callListeners(
882
+ rowListeners[mutator],
883
+ [tableId, rowId],
884
+ getCellChange,
885
+ );
886
+ }
887
+ });
888
+ if (tableChanged) {
889
+ callListeners(tableListeners[mutator], [tableId], getCellChange);
890
+ }
891
+ });
892
+ if (tablesChanged) {
893
+ callListeners(tablesListeners[mutator], void 0, getCellChange);
894
+ }
895
+ }
896
+ }
897
+ };
898
+ const callValuesListenersForChanges = (mutator) => {
899
+ const hasValuesNow = hasValues();
900
+ if (hasValuesNow != hadValues) {
901
+ callListeners(hasValuesListeners[mutator], void 0, hasValuesNow);
902
+ }
903
+ const emptyIdAndHasListeners =
904
+ collIsEmpty(valueIdsListeners[mutator]) &&
905
+ collIsEmpty(hasValueListeners[mutator]);
906
+ const emptyOtherListeners =
907
+ collIsEmpty(valueListeners[mutator]) &&
908
+ collIsEmpty(valuesListeners[mutator]);
909
+ if (!emptyIdAndHasListeners || !emptyOtherListeners) {
910
+ const changes = mutator
911
+ ? [mapClone(changedValueIds), mapClone(changedValues)]
912
+ : [changedValueIds, changedValues];
913
+ if (!emptyIdAndHasListeners) {
914
+ callIdsAndHasListenersIfChanged(
915
+ changes[0],
916
+ valueIdsListeners[mutator],
917
+ hasValueListeners[mutator],
918
+ );
919
+ }
920
+ if (!emptyOtherListeners) {
921
+ let valuesChanged;
922
+ collForEach(changes[1], ([oldValue, newValue], valueId) => {
923
+ if (newValue !== oldValue) {
924
+ callListeners(
925
+ valueListeners[mutator],
926
+ [valueId],
927
+ newValue,
928
+ oldValue,
929
+ getValueChange,
930
+ );
931
+ valuesChanged = 1;
932
+ }
933
+ });
934
+ if (valuesChanged) {
935
+ callListeners(valuesListeners[mutator], void 0, getValueChange);
936
+ }
937
+ }
938
+ }
939
+ };
940
+ const fluentTransaction = (actions, ...args) => {
941
+ transaction(() => actions(...arrayMap(args, id)));
942
+ return store;
943
+ };
944
+ const getTransactionChanges = () => [
945
+ mapToObj(
946
+ changedCells,
947
+ (table, tableId) =>
948
+ mapGet(changedTableIds, tableId) === -1
949
+ ? null
950
+ : mapToObj(
951
+ table,
952
+ (row, rowId) =>
953
+ mapGet(mapGet(changedRowIds, tableId), rowId) === -1
954
+ ? null
955
+ : mapToObj(
956
+ row,
957
+ ([, newCell]) => newCell ?? null,
958
+ (_, changedCell) => pairIsEqual(changedCell),
959
+ ),
960
+ objIsEmpty,
961
+ ),
962
+ objIsEmpty,
963
+ ),
964
+ mapToObj(
965
+ changedValues,
966
+ ([, newValue]) => newValue ?? null,
967
+ (_, changedValue) => pairIsEqual(changedValue),
968
+ ),
969
+ ];
970
+ const getTransactionLog = () => ({
971
+ cellsTouched,
972
+ valuesTouched,
973
+ changedCells: mapToObj3(changedCells, pairClone, pairIsEqual),
974
+ invalidCells: mapToObj3(invalidCells),
975
+ changedValues: mapToObj(changedValues, pairClone, pairIsEqual),
976
+ invalidValues: mapToObj(invalidValues),
977
+ changedTableIds: mapToObj(changedTableIds),
978
+ changedRowIds: mapToObj2(changedRowIds),
979
+ changedCellIds: mapToObj3(changedCellIds),
980
+ changedValueIds: mapToObj(changedValueIds),
981
+ });
982
+ const getContent = () => [getTables(), getValues()];
983
+ const getTables = () => mapToObj3(tablesMap);
984
+ const getTableIds = () => mapKeys(tablesMap);
985
+ const getTable = (tableId) => mapToObj2(mapGet(tablesMap, id(tableId)));
986
+ const getTableCellIds = (tableId) =>
987
+ mapKeys(mapGet(tableCellIds, id(tableId)));
988
+ const getRowCount = (tableId) => collSize(mapGet(tablesMap, id(tableId)));
989
+ const getRowIds = (tableId) => mapKeys(mapGet(tablesMap, id(tableId)));
990
+ const getSortedRowIds = (tableId, cellId, descending, offset = 0, limit) =>
991
+ arrayMap(
992
+ slice(
993
+ arraySort(
994
+ mapMap(mapGet(tablesMap, id(tableId)), (row, rowId) => [
995
+ isUndefined(cellId) ? rowId : mapGet(row, id(cellId)),
996
+ rowId,
997
+ ]),
998
+ ([cell1], [cell2]) =>
999
+ defaultSorter(cell1, cell2) * (descending ? -1 : 1),
1000
+ ),
1001
+ offset,
1002
+ isUndefined(limit) ? limit : offset + limit,
1003
+ ),
1004
+ ([, rowId]) => rowId,
1005
+ );
1006
+ const getRow = (tableId, rowId) =>
1007
+ mapToObj(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)));
1008
+ const getCellIds = (tableId, rowId) =>
1009
+ mapKeys(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)));
1010
+ const getCell = (tableId, rowId, cellId) =>
1011
+ mapGet(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)), id(cellId));
1012
+ const getValues = () => mapToObj(valuesMap);
1013
+ const getValueIds = () => mapKeys(valuesMap);
1014
+ const getValue = (valueId) => mapGet(valuesMap, id(valueId));
1015
+ const hasTables = () => !collIsEmpty(tablesMap);
1016
+ const hasTable = (tableId) => collHas(tablesMap, id(tableId));
1017
+ const hasTableCell = (tableId, cellId) =>
1018
+ collHas(mapGet(tableCellIds, id(tableId)), id(cellId));
1019
+ const hasRow = (tableId, rowId) =>
1020
+ collHas(mapGet(tablesMap, id(tableId)), id(rowId));
1021
+ const hasCell = (tableId, rowId, cellId) =>
1022
+ collHas(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)), id(cellId));
1023
+ const hasValues = () => !collIsEmpty(valuesMap);
1024
+ const hasValue = (valueId) => collHas(valuesMap, id(valueId));
1025
+ const getTablesJson = () => jsonString(tablesMap);
1026
+ const getValuesJson = () => jsonString(valuesMap);
1027
+ const getJson = () => jsonString([tablesMap, valuesMap]);
1028
+ const getTablesSchemaJson = () => jsonString(tablesSchemaMap);
1029
+ const getValuesSchemaJson = () => jsonString(valuesSchemaMap);
1030
+ const getSchemaJson = () => jsonString([tablesSchemaMap, valuesSchemaMap]);
1031
+ const setContent = ([tables, values]) =>
1032
+ fluentTransaction(() => {
1033
+ (objIsEmpty(tables) ? delTables : setTables)(tables);
1034
+ (objIsEmpty(values) ? delValues : setValues)(values);
1035
+ });
1036
+ const setTables = (tables) =>
1037
+ fluentTransaction(() =>
1038
+ validateTables(tables) ? setValidTables(tables) : 0,
1039
+ );
1040
+ const setTable = (tableId, table) =>
1041
+ fluentTransaction(
1042
+ (tableId2) =>
1043
+ validateTable(table, tableId2) ? setValidTable(tableId2, table) : 0,
1044
+ tableId,
1045
+ );
1046
+ const setRow = (tableId, rowId, row) =>
1047
+ fluentTransaction(
1048
+ (tableId2, rowId2) =>
1049
+ validateRow(tableId2, rowId2, row)
1050
+ ? setValidRow(tableId2, getOrCreateTable(tableId2), rowId2, row)
1051
+ : 0,
1052
+ tableId,
1053
+ rowId,
1054
+ );
1055
+ const addRow = (tableId, row, reuseRowIds = true) =>
1056
+ transaction(() => {
1057
+ let rowId = void 0;
1058
+ if (validateRow(tableId, rowId, row)) {
1059
+ tableId = id(tableId);
1060
+ setValidRow(
1061
+ tableId,
1062
+ getOrCreateTable(tableId),
1063
+ (rowId = getNewRowId(tableId, reuseRowIds ? 1 : 0)),
1064
+ row,
1065
+ );
1066
+ }
1067
+ return rowId;
1068
+ });
1069
+ const setPartialRow = (tableId, rowId, partialRow) =>
1070
+ fluentTransaction(
1071
+ (tableId2, rowId2) => {
1072
+ if (validateRow(tableId2, rowId2, partialRow, 1)) {
1073
+ const table = getOrCreateTable(tableId2);
1074
+ objMap(partialRow, (cell, cellId) =>
1075
+ setCellIntoDefaultRow(tableId2, table, rowId2, cellId, cell),
1076
+ );
1077
+ }
1078
+ },
1079
+ tableId,
1080
+ rowId,
1081
+ );
1082
+ const setCell = (tableId, rowId, cellId, cell) =>
1083
+ fluentTransaction(
1084
+ (tableId2, rowId2, cellId2) =>
1085
+ ifNotUndefined(
1086
+ getValidatedCell(
1087
+ tableId2,
1088
+ rowId2,
1089
+ cellId2,
1090
+ isFunction(cell) ? cell(getCell(tableId2, rowId2, cellId2)) : cell,
1091
+ ),
1092
+ (validCell) =>
1093
+ setCellIntoDefaultRow(
1094
+ tableId2,
1095
+ getOrCreateTable(tableId2),
1096
+ rowId2,
1097
+ cellId2,
1098
+ validCell,
1099
+ ),
1100
+ ),
1101
+ tableId,
1102
+ rowId,
1103
+ cellId,
1104
+ );
1105
+ const setValues = (values) =>
1106
+ fluentTransaction(() =>
1107
+ validateValues(values) ? setValidValues(values) : 0,
1108
+ );
1109
+ const setPartialValues = (partialValues) =>
1110
+ fluentTransaction(() =>
1111
+ validateValues(partialValues, 1)
1112
+ ? objMap(partialValues, (value, valueId) =>
1113
+ setValidValue(valueId, value),
1114
+ )
1115
+ : 0,
1116
+ );
1117
+ const setValue = (valueId, value) =>
1118
+ fluentTransaction(
1119
+ (valueId2) =>
1120
+ ifNotUndefined(
1121
+ getValidatedValue(
1122
+ valueId2,
1123
+ isFunction(value) ? value(getValue(valueId2)) : value,
1124
+ ),
1125
+ (validValue) => setValidValue(valueId2, validValue),
1126
+ ),
1127
+ valueId,
1128
+ );
1129
+ const setTransactionChanges = (transactionChanges) =>
1130
+ fluentTransaction(() => {
1131
+ objMap(transactionChanges[0], (table, tableId) =>
1132
+ isUndefined(table)
1133
+ ? delTable(tableId)
1134
+ : objMap(table, (row, rowId) =>
1135
+ isUndefined(row)
1136
+ ? delRow(tableId, rowId)
1137
+ : objMap(row, (cell, cellId) =>
1138
+ setOrDelCell(store, tableId, rowId, cellId, cell),
1139
+ ),
1140
+ ),
1141
+ );
1142
+ objMap(transactionChanges[1], (value, valueId) =>
1143
+ setOrDelValue(store, valueId, value),
1144
+ );
1145
+ });
1146
+ const setTablesJson = (tablesJson) => {
1147
+ try {
1148
+ setOrDelTables(jsonParse(tablesJson));
1149
+ } catch {}
1150
+ return store;
1151
+ };
1152
+ const setValuesJson = (valuesJson) => {
1153
+ try {
1154
+ setOrDelValues(jsonParse(valuesJson));
1155
+ } catch {}
1156
+ return store;
1157
+ };
1158
+ const setJson = (tablesAndValuesJson) =>
1159
+ fluentTransaction(() => {
1160
+ try {
1161
+ const [tables, values] = jsonParse(tablesAndValuesJson);
1162
+ setOrDelTables(tables);
1163
+ setOrDelValues(values);
1164
+ } catch {
1165
+ setTablesJson(tablesAndValuesJson);
1166
+ }
1167
+ });
1168
+ const setTablesSchema = (tablesSchema) =>
1169
+ fluentTransaction(() => {
1170
+ if ((hasTablesSchema = validateTablesSchema(tablesSchema))) {
1171
+ setValidTablesSchema(tablesSchema);
1172
+ if (!collIsEmpty(tablesMap)) {
1173
+ const tables = getTables();
1174
+ delTables();
1175
+ setTables(tables);
1176
+ }
1177
+ }
1178
+ });
1179
+ const setValuesSchema = (valuesSchema) =>
1180
+ fluentTransaction(() => {
1181
+ if ((hasValuesSchema = validateValuesSchema(valuesSchema))) {
1182
+ const values = getValues();
1183
+ delValuesSchema();
1184
+ delValues();
1185
+ hasValuesSchema = true;
1186
+ setValidValuesSchema(valuesSchema);
1187
+ setValues(values);
1188
+ }
1189
+ });
1190
+ const setSchema = (tablesSchema, valuesSchema) =>
1191
+ fluentTransaction(() => {
1192
+ setTablesSchema(tablesSchema);
1193
+ setValuesSchema(valuesSchema);
1194
+ });
1195
+ const delTables = () => fluentTransaction(() => setValidTables({}));
1196
+ const delTable = (tableId) =>
1197
+ fluentTransaction(
1198
+ (tableId2) =>
1199
+ collHas(tablesMap, tableId2) ? delValidTable(tableId2) : 0,
1200
+ tableId,
1201
+ );
1202
+ const delRow = (tableId, rowId) =>
1203
+ fluentTransaction(
1204
+ (tableId2, rowId2) =>
1205
+ ifNotUndefined(mapGet(tablesMap, tableId2), (tableMap) =>
1206
+ collHas(tableMap, rowId2)
1207
+ ? delValidRow(tableId2, tableMap, rowId2)
1208
+ : 0,
1209
+ ),
1210
+ tableId,
1211
+ rowId,
1212
+ );
1213
+ const delCell = (tableId, rowId, cellId, forceDel) =>
1214
+ fluentTransaction(
1215
+ (tableId2, rowId2, cellId2) =>
1216
+ ifNotUndefined(mapGet(tablesMap, tableId2), (tableMap) =>
1217
+ ifNotUndefined(mapGet(tableMap, rowId2), (rowMap) =>
1218
+ collHas(rowMap, cellId2)
1219
+ ? delValidCell(
1220
+ tableId2,
1221
+ tableMap,
1222
+ rowId2,
1223
+ rowMap,
1224
+ cellId2,
1225
+ forceDel,
1226
+ )
1227
+ : 0,
1228
+ ),
1229
+ ),
1230
+ tableId,
1231
+ rowId,
1232
+ cellId,
1233
+ );
1234
+ const delValues = () => fluentTransaction(() => setValidValues({}));
1235
+ const delValue = (valueId) =>
1236
+ fluentTransaction(
1237
+ (valueId2) =>
1238
+ collHas(valuesMap, valueId2) ? delValidValue(valueId2) : 0,
1239
+ valueId,
1240
+ );
1241
+ const delTablesSchema = () =>
1242
+ fluentTransaction(() => {
1243
+ setValidTablesSchema({});
1244
+ hasTablesSchema = false;
1245
+ });
1246
+ const delValuesSchema = () =>
1247
+ fluentTransaction(() => {
1248
+ setValidValuesSchema({});
1249
+ hasValuesSchema = false;
1250
+ });
1251
+ const delSchema = () =>
1252
+ fluentTransaction(() => {
1253
+ delTablesSchema();
1254
+ delValuesSchema();
1255
+ });
1256
+ const transaction = (actions, doRollback) => {
1257
+ if (transactions != -1) {
1258
+ startTransaction();
1259
+ const result = actions();
1260
+ finishTransaction(doRollback);
1261
+ return result;
1262
+ }
1263
+ };
1264
+ const startTransaction = () => {
1265
+ if (transactions != -1) {
1266
+ transactions++;
1267
+ }
1268
+ if (transactions == 1) {
1269
+ callListeners(
1270
+ startTransactionListeners,
1271
+ void 0,
1272
+ getTransactionChanges,
1273
+ getTransactionLog,
1274
+ );
1275
+ }
1276
+ return store;
1277
+ };
1278
+ const finishTransaction = (doRollback) => {
1279
+ if (transactions > 0) {
1280
+ transactions--;
1281
+ if (transactions == 0) {
1282
+ cellsTouched = !collIsEmpty(changedCells);
1283
+ valuesTouched = !collIsEmpty(changedValues);
1284
+ transactions = 1;
1285
+ callInvalidCellListeners(1);
1286
+ if (cellsTouched) {
1287
+ callTabularListenersForChanges(1);
1288
+ }
1289
+ callInvalidValueListeners(1);
1290
+ if (valuesTouched) {
1291
+ callValuesListenersForChanges(1);
1292
+ }
1293
+ if (doRollback?.(getTransactionChanges, getTransactionLog)) {
1294
+ collForEach(changedCells, (table, tableId) =>
1295
+ collForEach(table, (row, rowId) =>
1296
+ collForEach(row, ([oldCell], cellId) =>
1297
+ setOrDelCell(store, tableId, rowId, cellId, oldCell),
1298
+ ),
1299
+ ),
1300
+ );
1301
+ collForEach(changedValues, ([oldValue], valueId) =>
1302
+ setOrDelValue(store, valueId, oldValue),
1303
+ );
1304
+ cellsTouched = valuesTouched = false;
1305
+ }
1306
+ callListeners(
1307
+ finishTransactionListeners[0],
1308
+ void 0,
1309
+ getTransactionChanges,
1310
+ getTransactionLog,
1311
+ );
1312
+ transactions = -1;
1313
+ callInvalidCellListeners(0);
1314
+ if (cellsTouched) {
1315
+ callTabularListenersForChanges(0);
1316
+ }
1317
+ callInvalidValueListeners(0);
1318
+ if (valuesTouched) {
1319
+ callValuesListenersForChanges(0);
1320
+ }
1321
+ callListeners(
1322
+ finishTransactionListeners[1],
1323
+ void 0,
1324
+ getTransactionChanges,
1325
+ getTransactionLog,
1326
+ );
1327
+ transactions = 0;
1328
+ cellsTouched = valuesTouched = false;
1329
+ hadTables = hasTables();
1330
+ hadValues = hasValues();
1331
+ arrayForEach(
1332
+ [
1333
+ changedTableIds,
1334
+ changedTableCellIds,
1335
+ changedRowCount,
1336
+ changedRowIds,
1337
+ changedCellIds,
1338
+ changedCells,
1339
+ invalidCells,
1340
+ changedValueIds,
1341
+ changedValues,
1342
+ invalidValues,
1343
+ ],
1344
+ collClear,
1345
+ );
1346
+ }
1347
+ }
1348
+ return store;
1349
+ };
1350
+ const forEachTable = (tableCallback) =>
1351
+ collForEach(tablesMap, (tableMap, tableId) =>
1352
+ tableCallback(tableId, (rowCallback) =>
1353
+ collForEach(tableMap, (rowMap, rowId) =>
1354
+ rowCallback(rowId, (cellCallback) =>
1355
+ mapForEach(rowMap, cellCallback),
1356
+ ),
1357
+ ),
1358
+ ),
1359
+ );
1360
+ const forEachTableCell = (tableId, tableCellCallback) =>
1361
+ mapForEach(mapGet(tableCellIds, id(tableId)), tableCellCallback);
1362
+ const forEachRow = (tableId, rowCallback) =>
1363
+ collForEach(mapGet(tablesMap, id(tableId)), (rowMap, rowId) =>
1364
+ rowCallback(rowId, (cellCallback) => mapForEach(rowMap, cellCallback)),
1365
+ );
1366
+ const forEachCell = (tableId, rowId, cellCallback) =>
1367
+ mapForEach(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)), cellCallback);
1368
+ const forEachValue = (valueCallback) => mapForEach(valuesMap, valueCallback);
1369
+ const addSortedRowIdsListener = (
1370
+ tableId,
1371
+ cellId,
1372
+ descending,
1373
+ offset,
1374
+ limit,
1375
+ listener,
1376
+ mutator,
1377
+ ) => {
1378
+ let sortedRowIds = getSortedRowIds(
1379
+ tableId,
1380
+ cellId,
1381
+ descending,
1382
+ offset,
1383
+ limit,
1384
+ );
1385
+ return addListener(
1386
+ () => {
1387
+ const newSortedRowIds = getSortedRowIds(
1388
+ tableId,
1389
+ cellId,
1390
+ descending,
1391
+ offset,
1392
+ limit,
1393
+ );
1394
+ if (!arrayIsEqual(newSortedRowIds, sortedRowIds)) {
1395
+ sortedRowIds = newSortedRowIds;
1396
+ listener(
1397
+ store,
1398
+ tableId,
1399
+ cellId,
1400
+ descending,
1401
+ offset,
1402
+ limit,
1403
+ sortedRowIds,
1404
+ );
1405
+ }
1406
+ },
1407
+ sortedRowIdsListeners[mutator ? 1 : 0],
1408
+ [tableId, cellId],
1409
+ [getTableIds],
1410
+ );
1411
+ };
1412
+ const addStartTransactionListener = (listener) =>
1413
+ addListener(listener, startTransactionListeners);
1414
+ const addWillFinishTransactionListener = (listener) =>
1415
+ addListener(listener, finishTransactionListeners[0]);
1416
+ const addDidFinishTransactionListener = (listener) =>
1417
+ addListener(listener, finishTransactionListeners[1]);
1418
+ const callListener = (listenerId) => {
1419
+ callListenerImpl(listenerId);
1420
+ return store;
1421
+ };
1422
+ const delListener = (listenerId) => {
1423
+ delListenerImpl(listenerId);
1424
+ return store;
1425
+ };
1426
+ const getListenerStats = () => ({
1427
+ hasTables: pairCollSize2(hasTablesListeners),
1428
+ tables: pairCollSize2(tablesListeners),
1429
+ tableIds: pairCollSize2(tableIdsListeners),
1430
+ hasTable: pairCollSize2(hasTableListeners),
1431
+ table: pairCollSize2(tableListeners),
1432
+ tableCellIds: pairCollSize2(tableCellIdsListeners),
1433
+ hasTableCell: pairCollSize2(hasTableCellListeners, collSize3),
1434
+ rowCount: pairCollSize2(rowCountListeners),
1435
+ rowIds: pairCollSize2(rowIdsListeners),
1436
+ sortedRowIds: pairCollSize2(sortedRowIdsListeners),
1437
+ hasRow: pairCollSize2(hasRowListeners, collSize3),
1438
+ row: pairCollSize2(rowListeners, collSize3),
1439
+ cellIds: pairCollSize2(cellIdsListeners, collSize3),
1440
+ hasCell: pairCollSize2(hasCellListeners, collSize4),
1441
+ cell: pairCollSize2(cellListeners, collSize4),
1442
+ invalidCell: pairCollSize2(invalidCellListeners, collSize4),
1443
+ hasValues: pairCollSize2(hasValuesListeners),
1444
+ values: pairCollSize2(valuesListeners),
1445
+ valueIds: pairCollSize2(valueIdsListeners),
1446
+ hasValue: pairCollSize2(hasValueListeners),
1447
+ value: pairCollSize2(valueListeners),
1448
+ invalidValue: pairCollSize2(invalidValueListeners),
1449
+ transaction:
1450
+ collSize2(startTransactionListeners) +
1451
+ pairCollSize2(finishTransactionListeners),
1452
+ });
1453
+ const store = {
1454
+ getContent,
1455
+ getTables,
1456
+ getTableIds,
1457
+ getTable,
1458
+ getTableCellIds,
1459
+ getRowCount,
1460
+ getRowIds,
1461
+ getSortedRowIds,
1462
+ getRow,
1463
+ getCellIds,
1464
+ getCell,
1465
+ getValues,
1466
+ getValueIds,
1467
+ getValue,
1468
+ hasTables,
1469
+ hasTable,
1470
+ hasTableCell,
1471
+ hasRow,
1472
+ hasCell,
1473
+ hasValues,
1474
+ hasValue,
1475
+ getTablesJson,
1476
+ getValuesJson,
1477
+ getJson,
1478
+ getTablesSchemaJson,
1479
+ getValuesSchemaJson,
1480
+ getSchemaJson,
1481
+ hasTablesSchema: () => hasTablesSchema,
1482
+ hasValuesSchema: () => hasValuesSchema,
1483
+ setContent,
1484
+ setTables,
1485
+ setTable,
1486
+ setRow,
1487
+ addRow,
1488
+ setPartialRow,
1489
+ setCell,
1490
+ setValues,
1491
+ setPartialValues,
1492
+ setValue,
1493
+ setTransactionChanges,
1494
+ setTablesJson,
1495
+ setValuesJson,
1496
+ setJson,
1497
+ setTablesSchema,
1498
+ setValuesSchema,
1499
+ setSchema,
1500
+ delTables,
1501
+ delTable,
1502
+ delRow,
1503
+ delCell,
1504
+ delValues,
1505
+ delValue,
1506
+ delTablesSchema,
1507
+ delValuesSchema,
1508
+ delSchema,
1509
+ transaction,
1510
+ startTransaction,
1511
+ finishTransaction,
1512
+ forEachTable,
1513
+ forEachTableCell,
1514
+ forEachRow,
1515
+ forEachCell,
1516
+ forEachValue,
1517
+ addSortedRowIdsListener,
1518
+ addStartTransactionListener,
1519
+ addWillFinishTransactionListener,
1520
+ addDidFinishTransactionListener,
1521
+ callListener,
1522
+ delListener,
1523
+ getListenerStats,
1524
+ // only used internally by other modules
1525
+ createStore,
1526
+ addListener,
1527
+ callListeners,
1528
+ };
1529
+ objMap(
1530
+ {
1531
+ [HAS + TABLES]: [0, hasTablesListeners, [], () => [hasTables()]],
1532
+ [TABLES]: [0, tablesListeners],
1533
+ [TABLE_IDS]: [0, tableIdsListeners],
1534
+ [HAS + TABLE]: [
1535
+ 1,
1536
+ hasTableListeners,
1537
+ [getTableIds],
1538
+ (ids) => [hasTable(...ids)],
1539
+ ],
1540
+ [TABLE]: [1, tableListeners, [getTableIds]],
1541
+ [TABLE + CELL_IDS]: [1, tableCellIdsListeners, [getTableIds]],
1542
+ [HAS + TABLE + CELL]: [
1543
+ 2,
1544
+ hasTableCellListeners,
1545
+ [getTableIds, getTableCellIds],
1546
+ (ids) => [hasTableCell(...ids)],
1547
+ ],
1548
+ [ROW_COUNT]: [1, rowCountListeners, [getTableIds]],
1549
+ [ROW_IDS]: [1, rowIdsListeners, [getTableIds]],
1550
+ [HAS + ROW]: [
1551
+ 2,
1552
+ hasRowListeners,
1553
+ [getTableIds, getRowIds],
1554
+ (ids) => [hasRow(...ids)],
1555
+ ],
1556
+ [ROW]: [2, rowListeners, [getTableIds, getRowIds]],
1557
+ [CELL_IDS]: [2, cellIdsListeners, [getTableIds, getRowIds]],
1558
+ [HAS + CELL]: [
1559
+ 3,
1560
+ hasCellListeners,
1561
+ [getTableIds, getRowIds, getCellIds],
1562
+ (ids) => [hasCell(...ids)],
1563
+ ],
1564
+ [CELL]: [
1565
+ 3,
1566
+ cellListeners,
1567
+ [getTableIds, getRowIds, getCellIds],
1568
+ (ids) => pairNew(getCell(...ids)),
1569
+ ],
1570
+ InvalidCell: [3, invalidCellListeners],
1571
+ [HAS + VALUES]: [0, hasValuesListeners, [], () => [hasValues()]],
1572
+ [VALUES]: [0, valuesListeners],
1573
+ [VALUE_IDS]: [0, valueIdsListeners],
1574
+ [HAS + VALUE]: [
1575
+ 1,
1576
+ hasValueListeners,
1577
+ [getValueIds],
1578
+ (ids) => [hasValue(...ids)],
1579
+ ],
1580
+ [VALUE]: [
1581
+ 1,
1582
+ valueListeners,
1583
+ [getValueIds],
1584
+ (ids) => pairNew(getValue(ids[0])),
1585
+ ],
1586
+ InvalidValue: [1, invalidValueListeners],
1587
+ },
1588
+ ([argumentCount, idSetNode, pathGetters, extraArgsGetter], listenable) => {
1589
+ store[ADD + listenable + LISTENER] = (...args) =>
1590
+ addListener(
1591
+ args[argumentCount],
1592
+ idSetNode[args[argumentCount + 1] ? 1 : 0],
1593
+ argumentCount > 0 ? slice(args, 0, argumentCount) : void 0,
1594
+ pathGetters,
1595
+ extraArgsGetter,
1596
+ );
1597
+ },
1598
+ );
1599
+ return objFreeze(store);
1600
+ };
1601
+
1602
+ export {createStore};