tinybase 4.4.0-beta.0 → 4.4.0-beta.2

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 (347) 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/metrics.cjs +1 -1
  8. package/lib/cjs/metrics.cjs.gz +0 -0
  9. package/lib/cjs/persisters/persister-automerge.cjs +1 -1
  10. package/lib/cjs/persisters/persister-automerge.cjs.gz +0 -0
  11. package/lib/cjs/persisters/persister-browser.cjs +1 -1
  12. package/lib/cjs/persisters/persister-browser.cjs.gz +0 -0
  13. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  14. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  15. package/lib/cjs/persisters/persister-expo-sqlite.cjs +1 -1
  16. package/lib/cjs/persisters/persister-expo-sqlite.cjs.gz +0 -0
  17. package/lib/cjs/persisters/persister-file.cjs +1 -1
  18. package/lib/cjs/persisters/persister-file.cjs.gz +0 -0
  19. package/lib/cjs/persisters/persister-indexed-db.cjs +1 -1
  20. package/lib/cjs/persisters/persister-indexed-db.cjs.gz +0 -0
  21. package/lib/cjs/persisters/persister-partykit-client.cjs +1 -1
  22. package/lib/cjs/persisters/persister-partykit-client.cjs.gz +0 -0
  23. package/lib/cjs/persisters/persister-partykit-server.cjs +1 -1
  24. package/lib/cjs/persisters/persister-partykit-server.cjs.gz +0 -0
  25. package/lib/cjs/persisters/persister-remote.cjs +1 -1
  26. package/lib/cjs/persisters/persister-remote.cjs.gz +0 -0
  27. package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -1
  28. package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  29. package/lib/cjs/persisters/persister-sqlite3.cjs +1 -1
  30. package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
  31. package/lib/cjs/persisters/persister-yjs.cjs +1 -1
  32. package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
  33. package/lib/cjs/persisters.cjs +1 -1
  34. package/lib/cjs/persisters.cjs.gz +0 -0
  35. package/lib/cjs/queries.cjs +1 -1
  36. package/lib/cjs/queries.cjs.gz +0 -0
  37. package/lib/cjs/relationships.cjs +1 -1
  38. package/lib/cjs/relationships.cjs.gz +0 -0
  39. package/lib/cjs/store.cjs +1 -1
  40. package/lib/cjs/store.cjs.gz +0 -0
  41. package/lib/cjs/tinybase.cjs +1 -1
  42. package/lib/cjs/tinybase.cjs.gz +0 -0
  43. package/lib/cjs/tools.cjs +1 -1
  44. package/lib/cjs/tools.cjs.gz +0 -0
  45. package/lib/cjs/ui-react-dom-debug.cjs +1 -1
  46. package/lib/cjs/ui-react-dom-debug.cjs.gz +0 -0
  47. package/lib/cjs/ui-react-dom.cjs +1 -1
  48. package/lib/cjs/ui-react-dom.cjs.gz +0 -0
  49. package/lib/cjs/ui-react.cjs +1 -1
  50. package/lib/cjs/ui-react.cjs.gz +0 -0
  51. package/lib/cjs-es6/checkpoints.cjs +1 -1
  52. package/lib/cjs-es6/checkpoints.cjs.gz +0 -0
  53. package/lib/cjs-es6/indexes.cjs +1 -1
  54. package/lib/cjs-es6/indexes.cjs.gz +0 -0
  55. package/lib/cjs-es6/metrics.cjs +1 -1
  56. package/lib/cjs-es6/metrics.cjs.gz +0 -0
  57. package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -1
  58. package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
  59. package/lib/cjs-es6/persisters/persister-browser.cjs +1 -1
  60. package/lib/cjs-es6/persisters/persister-browser.cjs.gz +0 -0
  61. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  62. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  63. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -1
  64. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
  65. package/lib/cjs-es6/persisters/persister-file.cjs +1 -1
  66. package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
  67. package/lib/cjs-es6/persisters/persister-indexed-db.cjs +1 -1
  68. package/lib/cjs-es6/persisters/persister-indexed-db.cjs.gz +0 -0
  69. package/lib/cjs-es6/persisters/persister-partykit-client.cjs +1 -1
  70. package/lib/cjs-es6/persisters/persister-partykit-client.cjs.gz +0 -0
  71. package/lib/cjs-es6/persisters/persister-partykit-server.cjs +1 -1
  72. package/lib/cjs-es6/persisters/persister-partykit-server.cjs.gz +0 -0
  73. package/lib/cjs-es6/persisters/persister-remote.cjs +1 -1
  74. package/lib/cjs-es6/persisters/persister-remote.cjs.gz +0 -0
  75. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -1
  76. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  77. package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -1
  78. package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
  79. package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -1
  80. package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
  81. package/lib/cjs-es6/persisters.cjs +1 -1
  82. package/lib/cjs-es6/persisters.cjs.gz +0 -0
  83. package/lib/cjs-es6/queries.cjs +1 -1
  84. package/lib/cjs-es6/queries.cjs.gz +0 -0
  85. package/lib/cjs-es6/relationships.cjs +1 -1
  86. package/lib/cjs-es6/relationships.cjs.gz +0 -0
  87. package/lib/cjs-es6/store.cjs +1 -1
  88. package/lib/cjs-es6/store.cjs.gz +0 -0
  89. package/lib/cjs-es6/tinybase.cjs +1 -1
  90. package/lib/cjs-es6/tinybase.cjs.gz +0 -0
  91. package/lib/cjs-es6/tools.cjs +1 -1
  92. package/lib/cjs-es6/tools.cjs.gz +0 -0
  93. package/lib/cjs-es6/ui-react-dom-debug.cjs +1 -1
  94. package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
  95. package/lib/cjs-es6/ui-react-dom.cjs +1 -1
  96. package/lib/cjs-es6/ui-react-dom.cjs.gz +0 -0
  97. package/lib/cjs-es6/ui-react.cjs +1 -1
  98. package/lib/cjs-es6/ui-react.cjs.gz +0 -0
  99. package/lib/debug/checkpoints.js +12 -12
  100. package/lib/debug/indexes.js +9 -9
  101. package/lib/debug/metrics.js +9 -9
  102. package/lib/debug/persisters/persister-automerge.js +21 -8
  103. package/lib/debug/persisters/persister-browser.js +17 -3
  104. package/lib/debug/persisters/persister-cr-sqlite-wasm.js +27 -12
  105. package/lib/debug/persisters/persister-expo-sqlite.js +27 -12
  106. package/lib/debug/persisters/persister-file.js +17 -3
  107. package/lib/debug/persisters/persister-indexed-db.js +21 -8
  108. package/lib/debug/persisters/persister-partykit-client.js +54 -20
  109. package/lib/debug/persisters/persister-partykit-server.js +173 -77
  110. package/lib/debug/persisters/persister-remote.js +17 -3
  111. package/lib/debug/persisters/persister-sqlite-wasm.js +27 -12
  112. package/lib/debug/persisters/persister-sqlite3.js +28 -13
  113. package/lib/debug/persisters/persister-yjs.js +23 -10
  114. package/lib/debug/persisters.js +16 -4
  115. package/lib/debug/queries.js +16 -15
  116. package/lib/debug/relationships.js +9 -9
  117. package/lib/debug/store.js +130 -35
  118. package/lib/debug/tinybase.js +142 -41
  119. package/lib/debug/tools.js +17 -9
  120. package/lib/debug/ui-react-dom.js +262 -150
  121. package/lib/debug/ui-react.js +288 -67
  122. package/lib/es6/checkpoints.js +1 -1
  123. package/lib/es6/checkpoints.js.gz +0 -0
  124. package/lib/es6/indexes.js +1 -1
  125. package/lib/es6/indexes.js.gz +0 -0
  126. package/lib/es6/metrics.js +1 -1
  127. package/lib/es6/metrics.js.gz +0 -0
  128. package/lib/es6/persisters/persister-automerge.js +1 -1
  129. package/lib/es6/persisters/persister-automerge.js.gz +0 -0
  130. package/lib/es6/persisters/persister-browser.js +1 -1
  131. package/lib/es6/persisters/persister-browser.js.gz +0 -0
  132. package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  133. package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  134. package/lib/es6/persisters/persister-expo-sqlite.js +1 -1
  135. package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
  136. package/lib/es6/persisters/persister-file.js +1 -1
  137. package/lib/es6/persisters/persister-file.js.gz +0 -0
  138. package/lib/es6/persisters/persister-indexed-db.js +1 -1
  139. package/lib/es6/persisters/persister-indexed-db.js.gz +0 -0
  140. package/lib/es6/persisters/persister-partykit-client.js +1 -1
  141. package/lib/es6/persisters/persister-partykit-client.js.gz +0 -0
  142. package/lib/es6/persisters/persister-partykit-server.js +1 -1
  143. package/lib/es6/persisters/persister-partykit-server.js.gz +0 -0
  144. package/lib/es6/persisters/persister-remote.js +1 -1
  145. package/lib/es6/persisters/persister-remote.js.gz +0 -0
  146. package/lib/es6/persisters/persister-sqlite-wasm.js +1 -1
  147. package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  148. package/lib/es6/persisters/persister-sqlite3.js +1 -1
  149. package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
  150. package/lib/es6/persisters/persister-yjs.js +1 -1
  151. package/lib/es6/persisters/persister-yjs.js.gz +0 -0
  152. package/lib/es6/persisters.js +1 -1
  153. package/lib/es6/persisters.js.gz +0 -0
  154. package/lib/es6/queries.js +1 -1
  155. package/lib/es6/queries.js.gz +0 -0
  156. package/lib/es6/relationships.js +1 -1
  157. package/lib/es6/relationships.js.gz +0 -0
  158. package/lib/es6/store.js +1 -1
  159. package/lib/es6/store.js.gz +0 -0
  160. package/lib/es6/tinybase.js +1 -1
  161. package/lib/es6/tinybase.js.gz +0 -0
  162. package/lib/es6/tools.js +1 -1
  163. package/lib/es6/tools.js.gz +0 -0
  164. package/lib/es6/ui-react-dom-debug.js +1 -1
  165. package/lib/es6/ui-react-dom-debug.js.gz +0 -0
  166. package/lib/es6/ui-react-dom.js +1 -1
  167. package/lib/es6/ui-react-dom.js.gz +0 -0
  168. package/lib/es6/ui-react.js +1 -1
  169. package/lib/es6/ui-react.js.gz +0 -0
  170. package/lib/indexes.js +1 -1
  171. package/lib/indexes.js.gz +0 -0
  172. package/lib/metrics.js +1 -1
  173. package/lib/metrics.js.gz +0 -0
  174. package/lib/persisters/persister-automerge.js +1 -1
  175. package/lib/persisters/persister-automerge.js.gz +0 -0
  176. package/lib/persisters/persister-browser.js +1 -1
  177. package/lib/persisters/persister-browser.js.gz +0 -0
  178. package/lib/persisters/persister-cr-sqlite-wasm.js +1 -1
  179. package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  180. package/lib/persisters/persister-expo-sqlite.js +1 -1
  181. package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
  182. package/lib/persisters/persister-file.js +1 -1
  183. package/lib/persisters/persister-file.js.gz +0 -0
  184. package/lib/persisters/persister-indexed-db.js +1 -1
  185. package/lib/persisters/persister-indexed-db.js.gz +0 -0
  186. package/lib/persisters/persister-partykit-client.js +1 -1
  187. package/lib/persisters/persister-partykit-client.js.gz +0 -0
  188. package/lib/persisters/persister-partykit-server.js +1 -1
  189. package/lib/persisters/persister-partykit-server.js.gz +0 -0
  190. package/lib/persisters/persister-remote.js +1 -1
  191. package/lib/persisters/persister-remote.js.gz +0 -0
  192. package/lib/persisters/persister-sqlite-wasm.js +1 -1
  193. package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
  194. package/lib/persisters/persister-sqlite3.js +1 -1
  195. package/lib/persisters/persister-sqlite3.js.gz +0 -0
  196. package/lib/persisters/persister-yjs.js +1 -1
  197. package/lib/persisters/persister-yjs.js.gz +0 -0
  198. package/lib/persisters.js +1 -1
  199. package/lib/persisters.js.gz +0 -0
  200. package/lib/queries.js +1 -1
  201. package/lib/queries.js.gz +0 -0
  202. package/lib/relationships.js +1 -1
  203. package/lib/relationships.js.gz +0 -0
  204. package/lib/store.js +1 -1
  205. package/lib/store.js.gz +0 -0
  206. package/lib/tinybase.js +1 -1
  207. package/lib/tinybase.js.gz +0 -0
  208. package/lib/tools.js +1 -1
  209. package/lib/tools.js.gz +0 -0
  210. package/lib/types/persisters/persister-automerge.d.ts +36 -3
  211. package/lib/types/persisters/persister-browser.d.ts +71 -8
  212. package/lib/types/persisters/persister-cr-sqlite-wasm.d.ts +42 -8
  213. package/lib/types/persisters/persister-expo-sqlite.d.ts +40 -7
  214. package/lib/types/persisters/persister-file.d.ts +34 -3
  215. package/lib/types/persisters/persister-indexed-db.d.ts +40 -9
  216. package/lib/types/persisters/persister-partykit-client.d.ts +99 -13
  217. package/lib/types/persisters/persister-partykit-server.d.ts +414 -9
  218. package/lib/types/persisters/persister-remote.d.ts +40 -4
  219. package/lib/types/persisters/persister-sqlite-wasm.d.ts +46 -7
  220. package/lib/types/persisters/persister-sqlite3.d.ts +40 -7
  221. package/lib/types/persisters/persister-yjs.d.ts +37 -5
  222. package/lib/types/persisters.d.ts +10 -10
  223. package/lib/types/queries.d.ts +24 -0
  224. package/lib/types/store.d.ts +912 -32
  225. package/lib/types/tools.d.ts +4 -6
  226. package/lib/types/ui-react-dom.d.ts +13 -2
  227. package/lib/types/ui-react.d.ts +1176 -44
  228. package/lib/types/with-schemas/persisters/persister-automerge.d.ts +38 -4
  229. package/lib/types/with-schemas/persisters/persister-browser.d.ts +75 -10
  230. package/lib/types/with-schemas/persisters/persister-cr-sqlite-wasm.d.ts +44 -9
  231. package/lib/types/with-schemas/persisters/persister-expo-sqlite.d.ts +42 -8
  232. package/lib/types/with-schemas/persisters/persister-file.d.ts +36 -4
  233. package/lib/types/with-schemas/persisters/persister-indexed-db.d.ts +42 -10
  234. package/lib/types/with-schemas/persisters/persister-partykit-client.d.ts +102 -15
  235. package/lib/types/with-schemas/persisters/persister-partykit-server.d.ts +447 -9
  236. package/lib/types/with-schemas/persisters/persister-remote.d.ts +42 -5
  237. package/lib/types/with-schemas/persisters/persister-sqlite-wasm.d.ts +48 -8
  238. package/lib/types/with-schemas/persisters/persister-sqlite3.d.ts +41 -7
  239. package/lib/types/with-schemas/persisters/persister-yjs.d.ts +39 -6
  240. package/lib/types/with-schemas/persisters.d.ts +10 -10
  241. package/lib/types/with-schemas/queries.d.ts +24 -0
  242. package/lib/types/with-schemas/store.d.ts +1180 -36
  243. package/lib/types/with-schemas/tools.d.ts +4 -6
  244. package/lib/types/with-schemas/ui-react-dom.d.ts +21 -4
  245. package/lib/types/with-schemas/ui-react.d.ts +1382 -71
  246. package/lib/ui-react-dom.js +1 -1
  247. package/lib/ui-react-dom.js.gz +0 -0
  248. package/lib/ui-react.js +1 -1
  249. package/lib/ui-react.js.gz +0 -0
  250. package/lib/umd/checkpoints.js +1 -1
  251. package/lib/umd/checkpoints.js.gz +0 -0
  252. package/lib/umd/indexes.js +1 -1
  253. package/lib/umd/indexes.js.gz +0 -0
  254. package/lib/umd/metrics.js +1 -1
  255. package/lib/umd/metrics.js.gz +0 -0
  256. package/lib/umd/persisters/persister-automerge.js +1 -1
  257. package/lib/umd/persisters/persister-automerge.js.gz +0 -0
  258. package/lib/umd/persisters/persister-browser.js +1 -1
  259. package/lib/umd/persisters/persister-browser.js.gz +0 -0
  260. package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
  261. package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  262. package/lib/umd/persisters/persister-expo-sqlite.js +1 -1
  263. package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
  264. package/lib/umd/persisters/persister-file.js +1 -1
  265. package/lib/umd/persisters/persister-file.js.gz +0 -0
  266. package/lib/umd/persisters/persister-indexed-db.js +1 -1
  267. package/lib/umd/persisters/persister-indexed-db.js.gz +0 -0
  268. package/lib/umd/persisters/persister-partykit-client.js +1 -1
  269. package/lib/umd/persisters/persister-partykit-client.js.gz +0 -0
  270. package/lib/umd/persisters/persister-partykit-server.js +1 -1
  271. package/lib/umd/persisters/persister-partykit-server.js.gz +0 -0
  272. package/lib/umd/persisters/persister-remote.js +1 -1
  273. package/lib/umd/persisters/persister-remote.js.gz +0 -0
  274. package/lib/umd/persisters/persister-sqlite-wasm.js +1 -1
  275. package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
  276. package/lib/umd/persisters/persister-sqlite3.js +1 -1
  277. package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
  278. package/lib/umd/persisters/persister-yjs.js +1 -1
  279. package/lib/umd/persisters/persister-yjs.js.gz +0 -0
  280. package/lib/umd/persisters.js +1 -1
  281. package/lib/umd/persisters.js.gz +0 -0
  282. package/lib/umd/queries.js +1 -1
  283. package/lib/umd/queries.js.gz +0 -0
  284. package/lib/umd/relationships.js +1 -1
  285. package/lib/umd/relationships.js.gz +0 -0
  286. package/lib/umd/store.js +1 -1
  287. package/lib/umd/store.js.gz +0 -0
  288. package/lib/umd/tinybase.js +1 -1
  289. package/lib/umd/tinybase.js.gz +0 -0
  290. package/lib/umd/tools.js +1 -1
  291. package/lib/umd/tools.js.gz +0 -0
  292. package/lib/umd/ui-react-dom-debug.js +1 -1
  293. package/lib/umd/ui-react-dom-debug.js.gz +0 -0
  294. package/lib/umd/ui-react-dom.js +1 -1
  295. package/lib/umd/ui-react-dom.js.gz +0 -0
  296. package/lib/umd/ui-react.js +1 -1
  297. package/lib/umd/ui-react.js.gz +0 -0
  298. package/lib/umd-es6/checkpoints.js +1 -1
  299. package/lib/umd-es6/checkpoints.js.gz +0 -0
  300. package/lib/umd-es6/indexes.js +1 -1
  301. package/lib/umd-es6/indexes.js.gz +0 -0
  302. package/lib/umd-es6/metrics.js +1 -1
  303. package/lib/umd-es6/metrics.js.gz +0 -0
  304. package/lib/umd-es6/persisters/persister-automerge.js +1 -1
  305. package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
  306. package/lib/umd-es6/persisters/persister-browser.js +1 -1
  307. package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
  308. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  309. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  310. package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -1
  311. package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
  312. package/lib/umd-es6/persisters/persister-file.js +1 -1
  313. package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
  314. package/lib/umd-es6/persisters/persister-indexed-db.js +1 -1
  315. package/lib/umd-es6/persisters/persister-indexed-db.js.gz +0 -0
  316. package/lib/umd-es6/persisters/persister-partykit-client.js +1 -1
  317. package/lib/umd-es6/persisters/persister-partykit-client.js.gz +0 -0
  318. package/lib/umd-es6/persisters/persister-partykit-server.js +1 -1
  319. package/lib/umd-es6/persisters/persister-partykit-server.js.gz +0 -0
  320. package/lib/umd-es6/persisters/persister-remote.js +1 -1
  321. package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
  322. package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -1
  323. package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  324. package/lib/umd-es6/persisters/persister-sqlite3.js +1 -1
  325. package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
  326. package/lib/umd-es6/persisters/persister-yjs.js +1 -1
  327. package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
  328. package/lib/umd-es6/persisters.js +1 -1
  329. package/lib/umd-es6/persisters.js.gz +0 -0
  330. package/lib/umd-es6/queries.js +1 -1
  331. package/lib/umd-es6/queries.js.gz +0 -0
  332. package/lib/umd-es6/relationships.js +1 -1
  333. package/lib/umd-es6/relationships.js.gz +0 -0
  334. package/lib/umd-es6/store.js +1 -1
  335. package/lib/umd-es6/store.js.gz +0 -0
  336. package/lib/umd-es6/tinybase.js +1 -1
  337. package/lib/umd-es6/tinybase.js.gz +0 -0
  338. package/lib/umd-es6/tools.js +1 -1
  339. package/lib/umd-es6/tools.js.gz +0 -0
  340. package/lib/umd-es6/ui-react-dom-debug.js +1 -1
  341. package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
  342. package/lib/umd-es6/ui-react-dom.js +1 -1
  343. package/lib/umd-es6/ui-react-dom.js.gz +0 -0
  344. package/lib/umd-es6/ui-react.js +1 -1
  345. package/lib/umd-es6/ui-react.js.gz +0 -0
  346. package/package.json +42 -40
  347. package/readme.md +2 -2
@@ -53,6 +53,7 @@ const TYPE = 'type';
53
53
  const DEFAULT = 'default';
54
54
  const LISTENER = 'Listener';
55
55
  const ADD = 'add';
56
+ const HAS = 'Has';
56
57
  const IDS = 'Ids';
57
58
  const TABLE = 'Table';
58
59
  const TABLES = TABLE + 's';
@@ -80,6 +81,7 @@ const isString = (thing) => getTypeOf(thing) == STRING;
80
81
  const isFunction = (thing) => getTypeOf(thing) == FUNCTION;
81
82
  const isArray = (thing) => Array.isArray(thing);
82
83
  const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
84
+ const size = (arrayOrString) => arrayOrString.length;
83
85
  const test = (regex, subject) => regex.test(subject);
84
86
 
85
87
  const {
@@ -108,24 +110,31 @@ const getIndexStoreTableId = (indexes, indexId) => [
108
110
  const arrayHas = (array, value) => array.includes(value);
109
111
  const arrayEvery = (array, cb) => array.every(cb);
110
112
  const arrayIsEqual = (array1, array2) =>
111
- arrayLength(array1) === arrayLength(array2) &&
113
+ size(array1) === size(array2) &&
112
114
  arrayEvery(array1, (value1, index) => array2[index] === value1);
113
115
  const arraySort = (array, sorter) => array.sort(sorter);
114
116
  const arrayForEach = (array, cb) => array.forEach(cb);
115
117
  const arrayJoin = (array, sep = EMPTY_STRING) => array.join(sep);
116
118
  const arrayMap = (array, cb) => array.map(cb);
117
- const arrayLength = (array) => array.length;
118
- const arrayIsEmpty = (array) => arrayLength(array) == 0;
119
+ const arrayIsEmpty = (array) => size(array) == 0;
119
120
  const arrayReduce = (array, cb, initial) => array.reduce(cb, initial);
120
121
  const arrayPush = (array, ...values) => array.push(...values);
121
122
  const arrayShift = (array) => array.shift();
122
123
 
123
124
  const object = Object;
125
+ const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
124
126
  const objIds = object.keys;
125
127
  const objFrozen = object.isFrozen;
126
128
  const objFreeze = object.freeze;
127
129
  const isObject = (obj) =>
128
- isInstanceOf(obj, object) && obj.constructor == object;
130
+ !isUndefined(obj) &&
131
+ ifNotUndefined(
132
+ getPrototypeOf(obj),
133
+ (objPrototype) =>
134
+ objPrototype == object.prototype ||
135
+ isUndefined(getPrototypeOf(objPrototype)),
136
+ () => true,
137
+ );
129
138
  const objNew = (entries = []) => object.fromEntries(entries);
130
139
  const objGet = (obj, id) => ifNotUndefined(obj, (obj2) => obj2[id]);
131
140
  const objHas = (obj, id) => !isUndefined(objGet(obj, id));
@@ -135,7 +144,7 @@ const objDel = (obj, id) => {
135
144
  };
136
145
  const objMap = (obj, cb) =>
137
146
  arrayMap(object.entries(obj), ([id, value]) => cb(value, id));
138
- const objSize = (obj) => arrayLength(objIds(obj));
147
+ const objSize = (obj) => size(objIds(obj));
139
148
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
140
149
 
141
150
  const jsonString = (obj) =>
@@ -195,89 +204,85 @@ const EDIT_SVG = PRE + `<path d='${PENCIL}' />` + POST;
195
204
  const DONE_SVG = PRE + `<path d='${PENCIL}M20 20l60 60' />` + POST;
196
205
 
197
206
  const SCROLLBAR = '*::-webkit-scrollbar';
198
- const APP_STYLESHEET = `#${UNIQUE_ID}{
199
- all:initial;font-family:sans-serif;font-size:0.75rem;position:fixed;z-index:999999;
200
- ${arrayJoin(
201
- objMap(
202
- {
203
- '*': 'all:revert',
204
- '*::before': 'all:revert',
205
- '*::after': 'all:revert',
206
- [SCROLLBAR]: 'width:0.5rem;height:0.5rem;',
207
- [SCROLLBAR + '-track']: 'background:#111',
208
- [SCROLLBAR + '-thumb']: 'background:#999;border:1px solid #111',
209
- [SCROLLBAR + '-thumb:hover']: 'background:#fff',
210
- [SCROLLBAR + '-corner']: 'background:#111',
211
- img: 'width:1rem;height:1rem;background:#111;border:0;vertical-align:text-bottom',
212
- // Nub
213
- '>img': 'padding:0.25rem;bottom:0;right:0;position:fixed;' + LOGO_SVG,
214
- ...objNew(
215
- arrayMap(['bottom:0;left:0', 'top:0;right:0'], (css, p) => [
216
- `>img[data-position='${p}']`,
217
- css,
218
- ]),
219
- ),
220
- // Panel
221
- main: 'display:flex;flex-direction:column;background:#111d;color:#fff;position:fixed;',
222
- ...objNew(
223
- arrayMap(
224
- [
225
- 'bottom:0;left:0;width:35vw;height:100vh',
226
- 'top:0;right:0;width:100vw;height:30vh',
227
- 'bottom:0;left:0;width:100vw;height:30vh',
228
- 'top:0;right:0;width:35vw;height:100vh',
229
- 'top:0;right:0;width:100vw;height:100vh',
230
- ],
231
- (css, p) => [`main[data-position='${p}']`, css],
232
- ),
233
- ),
234
- // Header
235
- header:
236
- 'display:flex;padding:0.25rem;background:#000;align-items:center',
237
- 'header>img:nth-of-type(1)': LOGO_SVG,
238
- 'header>img:nth-of-type(6)': CLOSE_SVG,
239
- ...objNew(
240
- arrayMap(POSITIONS_SVG, (SVG, p) => [
241
- `header>img[data-id='${p}']`,
242
- SVG,
243
- ]),
207
+ const APP_STYLESHEET = arrayJoin(
208
+ objMap(
209
+ {
210
+ '': 'all:initial;font-family:sans-serif;font-size:0.75rem;position:fixed;z-index:999999',
211
+ '*': 'all:revert',
212
+ '*::before': 'all:revert',
213
+ '*::after': 'all:revert',
214
+ [SCROLLBAR]: 'width:0.5rem;height:0.5rem;',
215
+ [SCROLLBAR + '-track']: 'background:#111',
216
+ [SCROLLBAR + '-thumb']: 'background:#999;border:1px solid #111',
217
+ [SCROLLBAR + '-thumb:hover']: 'background:#fff',
218
+ [SCROLLBAR + '-corner']: 'background:#111',
219
+ img: 'width:1rem;height:1rem;background:#111;border:0;vertical-align:text-bottom',
220
+ // Nub
221
+ '>img': 'padding:0.25rem;bottom:0;right:0;position:fixed;' + LOGO_SVG,
222
+ ...objNew(
223
+ arrayMap(['bottom:0;left:0', 'top:0;right:0'], (css, p) => [
224
+ `>img[data-position='${p}']`,
225
+ css,
226
+ ]),
227
+ ),
228
+ // Panel
229
+ main: 'display:flex;flex-direction:column;background:#111d;color:#fff;position:fixed;',
230
+ ...objNew(
231
+ arrayMap(
232
+ [
233
+ 'bottom:0;left:0;width:35vw;height:100vh',
234
+ 'top:0;right:0;width:100vw;height:30vh',
235
+ 'bottom:0;left:0;width:100vw;height:30vh',
236
+ 'top:0;right:0;width:35vw;height:100vh',
237
+ 'top:0;right:0;width:100vw;height:100vh',
238
+ ],
239
+ (css, p) => [`main[data-position='${p}']`, css],
244
240
  ),
245
- 'header>span':
246
- 'flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;margin-left:0.25rem',
247
- // Body
248
- article: 'padding:0.25rem 0.25rem 0.25rem 0.5rem;overflow:auto;flex:1',
249
- details: 'margin-left:0.75rem;width:fit-content;',
250
- 'details img': 'display:none',
251
- 'details[open]>summary img':
252
- 'display:unset;background:none;margin-left:0.25rem',
253
- 'details[open]>summary img.edit': EDIT_SVG,
254
- 'details[open]>summary img.done': DONE_SVG,
255
- summary:
256
- 'margin-left:-0.75rem;line-height:1.25rem;user-select:none;width:fit-content',
257
- // tables
258
- table:
259
- 'border-collapse:collapse;table-layout:fixed;margin-bottom:0.5rem',
260
- 'table input':
261
- 'background:#111;color:unset;padding:0 0.25rem;border:0;font-size:unset;vertical-align:top;margin:0',
262
- 'table input[type="number"]': 'width:4rem',
263
- 'table tbody button':
264
- 'font-size:0;background:#fff;border-radius:50%;margin:0 0.125rem 0 0;width:0.85rem;color:#111',
265
- 'table button:first-letter': 'font-size:0.75rem',
266
- thead: 'background:#222',
267
- 'th:nth-of-type(1)': 'min-width:2rem;',
268
- 'th.sorted': 'background:#000',
269
- 'table caption':
270
- 'text-align:left;white-space:nowrap;line-height:1.25rem',
271
- button: 'width:1.5rem;border:none;background:none;color:#fff;padding:0',
272
- 'button[disabled]': 'color:#777',
273
- 'button.next': 'margin-right:0.5rem',
274
- [`th,td`]:
275
- 'overflow:hidden;text-overflow:ellipsis;padding:0.25rem 0.5rem;max-width:12rem;white-space:nowrap;border-width:1px 0;border-style:solid;border-color:#777;text-align:left',
276
- 'span.warn': 'margin:0.25rem;color:#d81b60',
277
- },
278
- (style, selector) => (style ? `& ${selector}{${style}}` : ''),
279
- ),
280
- )}`;
241
+ ),
242
+ // Header
243
+ header: 'display:flex;padding:0.25rem;background:#000;align-items:center',
244
+ 'header>img:nth-of-type(1)': LOGO_SVG,
245
+ 'header>img:nth-of-type(6)': CLOSE_SVG,
246
+ ...objNew(
247
+ arrayMap(POSITIONS_SVG, (SVG, p) => [
248
+ `header>img[data-id='${p}']`,
249
+ SVG,
250
+ ]),
251
+ ),
252
+ 'header>span':
253
+ 'flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;margin-left:0.25rem',
254
+ // Body
255
+ article: 'padding:0.25rem 0.25rem 0.25rem 0.5rem;overflow:auto;flex:1',
256
+ details: 'margin-left:0.75rem;width:fit-content;',
257
+ 'details img': 'display:none',
258
+ 'details[open]>summary img':
259
+ 'display:unset;background:none;margin-left:0.25rem',
260
+ 'details[open]>summary img.edit': EDIT_SVG,
261
+ 'details[open]>summary img.done': DONE_SVG,
262
+ summary:
263
+ 'margin-left:-0.75rem;line-height:1.25rem;user-select:none;width:fit-content',
264
+ // tables
265
+ table: 'border-collapse:collapse;table-layout:fixed;margin-bottom:0.5rem',
266
+ 'table input':
267
+ 'background:#111;color:unset;padding:0 0.25rem;border:0;font-size:unset;vertical-align:top;margin:0',
268
+ 'table input[type="number"]': 'width:4rem',
269
+ 'table tbody button':
270
+ 'font-size:0;background:#fff;border-radius:50%;margin:0 0.125rem 0 0;width:0.85rem;color:#111',
271
+ 'table button:first-letter': 'font-size:0.75rem',
272
+ thead: 'background:#222',
273
+ 'th:nth-of-type(1)': 'min-width:2rem;',
274
+ 'th.sorted': 'background:#000',
275
+ 'table caption': 'text-align:left;white-space:nowrap;line-height:1.25rem',
276
+ button: 'width:1.5rem;border:none;background:none;color:#fff;padding:0',
277
+ 'button[disabled]': 'color:#777',
278
+ 'button.next': 'margin-right:0.5rem',
279
+ [`th,#${UNIQUE_ID} td`]:
280
+ 'overflow:hidden;text-overflow:ellipsis;padding:0.25rem 0.5rem;max-width:12rem;white-space:nowrap;border-width:1px 0;border-style:solid;border-color:#777;text-align:left',
281
+ 'span.warn': 'margin:0.25rem;color:#d81b60',
282
+ },
283
+ (style, selector) => (style ? `#${UNIQUE_ID} ${selector}{${style}}` : ''),
284
+ ),
285
+ );
281
286
 
282
287
  const Nub = ({s}) => {
283
288
  const position = useValue(POSITION_VALUE, s) ?? 1;
@@ -589,7 +594,13 @@ const RelationshipInHtmlRow = ({
589
594
  ),
590
595
  );
591
596
  };
592
- const EditableThing = ({thing, onThingChange, className, hasSchema}) => {
597
+ const EditableThing = ({
598
+ thing,
599
+ onThingChange,
600
+ className,
601
+ hasSchema,
602
+ showType = true,
603
+ }) => {
593
604
  const [thingType, setThingType] = useState();
594
605
  const [currentThing, setCurrentThing] = useState();
595
606
  const [stringThing, setStringThing] = useState();
@@ -610,37 +621,37 @@ const EditableThing = ({thing, onThingChange, className, hasSchema}) => {
610
621
  },
611
622
  [onThingChange],
612
623
  );
624
+ const handleTypeChange = useCallback(() => {
625
+ if (!hasSchema?.()) {
626
+ const nextType = getTypeCase(thingType, NUMBER, BOOLEAN, STRING);
627
+ const thing2 = getTypeCase(
628
+ nextType,
629
+ stringThing,
630
+ numberThing,
631
+ booleanThing,
632
+ );
633
+ setThingType(nextType);
634
+ setCurrentThing(thing2);
635
+ onThingChange(thing2);
636
+ }
637
+ }, [
638
+ hasSchema,
639
+ onThingChange,
640
+ stringThing,
641
+ numberThing,
642
+ booleanThing,
643
+ thingType,
644
+ ]);
613
645
  return /* @__PURE__ */ createElement(
614
646
  'div',
615
647
  {className},
616
- /* @__PURE__ */ createElement(
617
- 'button',
618
- {
619
- className: thingType,
620
- onClick: useCallback(() => {
621
- if (!hasSchema?.()) {
622
- const nextType = getTypeCase(thingType, NUMBER, BOOLEAN, STRING);
623
- const thing2 = getTypeCase(
624
- nextType,
625
- stringThing,
626
- numberThing,
627
- booleanThing,
628
- );
629
- setThingType(nextType);
630
- setCurrentThing(thing2);
631
- onThingChange(thing2);
632
- }
633
- }, [
634
- hasSchema,
635
- onThingChange,
636
- stringThing,
637
- numberThing,
638
- booleanThing,
648
+ showType
649
+ ? /* @__PURE__ */ createElement(
650
+ 'button',
651
+ {className: thingType, onClick: handleTypeChange},
639
652
  thingType,
640
- ]),
641
- },
642
- thingType,
643
- ),
653
+ )
654
+ : null,
644
655
  getTypeCase(
645
656
  thingType,
646
657
  /* @__PURE__ */ createElement('input', {
@@ -943,7 +954,14 @@ const ResultSortedTableInHtmlTable = ({
943
954
  ),
944
955
  });
945
956
  };
946
- const EditableCellView = ({tableId, rowId, cellId, store, className}) =>
957
+ const EditableCellView = ({
958
+ tableId,
959
+ rowId,
960
+ cellId,
961
+ store,
962
+ className,
963
+ showType,
964
+ }) =>
947
965
  /* @__PURE__ */ createElement(EditableThing, {
948
966
  thing: useCell(tableId, rowId, cellId, store),
949
967
  onThingChange: useSetCellCallback(
@@ -955,13 +973,15 @@ const EditableCellView = ({tableId, rowId, cellId, store, className}) =>
955
973
  store,
956
974
  ),
957
975
  className: className ?? EDITABLE + CELL,
976
+ showType,
958
977
  hasSchema: useStoreOrStoreById(store)?.hasTablesSchema,
959
978
  });
960
- const EditableValueView = ({valueId, store, className}) =>
979
+ const EditableValueView = ({valueId, store, className, showType}) =>
961
980
  /* @__PURE__ */ createElement(EditableThing, {
962
981
  thing: useValue(valueId, store),
963
982
  onThingChange: useSetValueCallback(valueId, (value) => value, [], store),
964
983
  className: className ?? EDITABLE + VALUE,
984
+ showType,
965
985
  hasSchema: useStoreOrStoreById(store)?.hasValuesSchema,
966
986
  });
967
987
  const SortedTablePaginator = ({
@@ -1426,8 +1446,8 @@ class ErrorBoundary extends PureComponent {
1426
1446
  console.error(error, info.componentStack);
1427
1447
  this.state = {e: 0};
1428
1448
  }
1429
- static {
1430
- this.getDerivedStateFromError = () => ({e: 1});
1449
+ static getDerivedStateFromError() {
1450
+ return {e: 1};
1431
1451
  }
1432
1452
  render() {
1433
1453
  return this.state.e
@@ -1552,10 +1572,10 @@ const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
1552
1572
  (ensureLeaf ? mapEnsure : mapGet)(
1553
1573
  node,
1554
1574
  path[p],
1555
- p > arrayLength(path) - 2 ? ensureLeaf : mapNew,
1575
+ p > size(path) - 2 ? ensureLeaf : mapNew,
1556
1576
  ),
1557
1577
  (nodeOrLeaf) => {
1558
- if (p > arrayLength(path) - 2) {
1578
+ if (p > size(path) - 2) {
1559
1579
  if (pruneLeaf?.(nodeOrLeaf)) {
1560
1580
  mapSet(node, path[p]);
1561
1581
  }
@@ -1578,6 +1598,7 @@ const createCustomPersister = (
1578
1598
  addPersisterListener,
1579
1599
  delPersisterListener,
1580
1600
  onIgnoredError,
1601
+ [getThing, thing] = [],
1581
1602
  scheduleId = [],
1582
1603
  ) => {
1583
1604
  let listenerId;
@@ -1694,6 +1715,7 @@ const createCustomPersister = (
1694
1715
  },
1695
1716
  stopAutoSave: () => {
1696
1717
  ifNotUndefined(listenerId, store.delListener);
1718
+ listenerId = void 0;
1697
1719
  return persister;
1698
1720
  },
1699
1721
  schedule: async (...actions) => {
@@ -1705,6 +1727,9 @@ const createCustomPersister = (
1705
1727
  destroy: () => persister.stopAutoLoad().stopAutoSave(),
1706
1728
  getStats: () => ({loads, saves}),
1707
1729
  };
1730
+ if (getThing) {
1731
+ persister[getThing] = () => thing;
1732
+ }
1708
1733
  return objFreeze(persister);
1709
1734
  };
1710
1735
 
@@ -1737,6 +1762,7 @@ const createStoragePersister = (
1737
1762
  addPersisterListener,
1738
1763
  delPersisterListener,
1739
1764
  onIgnoredError,
1765
+ ['getStorageName', storageName],
1740
1766
  );
1741
1767
  };
1742
1768
  const createSessionPersister = (store, storageName, onIgnoredError) =>
@@ -1757,7 +1783,7 @@ const getPoolFunctions = () => {
1757
1783
  return [
1758
1784
  (reuse) => (reuse ? arrayShift(pool) : null) ?? EMPTY_STRING + nextId++,
1759
1785
  (id) => {
1760
- if (test(INTEGER, id) && arrayLength(pool) < 1e3) {
1786
+ if (test(INTEGER, id) && size(pool) < 1e3) {
1761
1787
  arrayPush(pool, id);
1762
1788
  }
1763
1789
  },
@@ -1767,7 +1793,7 @@ const getPoolFunctions = () => {
1767
1793
  const getWildcardedLeaves = (deepIdSet, path = [EMPTY_STRING]) => {
1768
1794
  const leaves = [];
1769
1795
  const deep = (node, p) =>
1770
- p == arrayLength(path)
1796
+ p == size(path)
1771
1797
  ? arrayPush(leaves, node)
1772
1798
  : path[p] === null
1773
1799
  ? collForEach(node, (node2) => deep(node2, p + 1))
@@ -1819,8 +1845,8 @@ const getListenerFunctions = (getThing) => {
1819
1845
  mapGet(allListeners, id),
1820
1846
  ([listener, , path = [], pathGetters, extraArgsGetter]) => {
1821
1847
  const callWithIds = (...ids) => {
1822
- const index = arrayLength(ids);
1823
- index == arrayLength(path)
1848
+ const index = size(ids);
1849
+ index == size(path)
1824
1850
  ? listener(thing, ...ids, ...extraArgsGetter(ids))
1825
1851
  : isUndefined(path[index])
1826
1852
  ? arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
@@ -1866,6 +1892,8 @@ const createStore = () => {
1866
1892
  let hasValuesSchema;
1867
1893
  let cellsTouched = false;
1868
1894
  let valuesTouched = false;
1895
+ let hadTables = false;
1896
+ let hadValues = false;
1869
1897
  let transactions = 0;
1870
1898
  const changedTableIds = mapNew();
1871
1899
  const changedTableCellIds = mapNew();
@@ -1886,20 +1914,27 @@ const createStore = () => {
1886
1914
  const tableCellIds = mapNew();
1887
1915
  const tablesMap = mapNew();
1888
1916
  const valuesMap = mapNew();
1917
+ const hasTablesListeners = pairNewMap();
1889
1918
  const tablesListeners = pairNewMap();
1890
1919
  const tableIdsListeners = pairNewMap();
1920
+ const hasTableListeners = pairNewMap();
1891
1921
  const tableListeners = pairNewMap();
1892
1922
  const tableCellIdsListeners = pairNewMap();
1923
+ const hasTableCellListeners = pairNewMap();
1893
1924
  const rowCountListeners = pairNewMap();
1894
1925
  const rowIdsListeners = pairNewMap();
1895
1926
  const sortedRowIdsListeners = pairNewMap();
1927
+ const hasRowListeners = pairNewMap();
1896
1928
  const rowListeners = pairNewMap();
1897
1929
  const cellIdsListeners = pairNewMap();
1930
+ const hasCellListeners = pairNewMap();
1898
1931
  const cellListeners = pairNewMap();
1899
1932
  const invalidCellListeners = pairNewMap();
1900
1933
  const invalidValueListeners = pairNewMap();
1934
+ const hasValuesListeners = pairNewMap();
1901
1935
  const valuesListeners = pairNewMap();
1902
1936
  const valueIdsListeners = pairNewMap();
1937
+ const hasValueListeners = pairNewMap();
1903
1938
  const valueListeners = pairNewMap();
1904
1939
  const startTransactionListeners = mapNew();
1905
1940
  const finishTransactionListeners = pairNewMap();
@@ -2294,29 +2329,45 @@ const createStore = () => {
2294
2329
  ),
2295
2330
  )
2296
2331
  : 0;
2297
- const callIdsListenersIfChanged = (listeners, changedIds, ids) => {
2332
+ const callIdsAndHasListenersIfChanged = (
2333
+ changedIds,
2334
+ idListeners,
2335
+ hasListeners,
2336
+ ids,
2337
+ ) => {
2298
2338
  if (!collIsEmpty(changedIds)) {
2299
- callListeners(listeners, ids, () => mapToObj(changedIds));
2339
+ callListeners(idListeners, ids, () => mapToObj(changedIds));
2340
+ mapForEach(changedIds, (changedId, changed) =>
2341
+ callListeners(hasListeners, [...(ids ?? []), changedId], changed == 1),
2342
+ );
2300
2343
  return 1;
2301
2344
  }
2302
2345
  };
2303
2346
  const callTabularListenersForChanges = (mutator) => {
2347
+ const hasTablesNow = hasTables();
2348
+ if (hasTablesNow != hadTables) {
2349
+ callListeners(hasTablesListeners[mutator], void 0, hasTablesNow);
2350
+ }
2304
2351
  const emptySortedRowIdListeners = collIsEmpty(
2305
2352
  sortedRowIdsListeners[mutator],
2306
2353
  );
2307
- const emptyIdListeners =
2354
+ const emptyIdAndHasListeners =
2308
2355
  collIsEmpty(cellIdsListeners[mutator]) &&
2356
+ collIsEmpty(hasCellListeners[mutator]) &&
2357
+ collIsEmpty(rowIdsListeners[mutator]) &&
2358
+ collIsEmpty(hasRowListeners[mutator]) &&
2309
2359
  collIsEmpty(tableCellIdsListeners[mutator]) &&
2360
+ collIsEmpty(hasTableCellListeners[mutator]) &&
2310
2361
  collIsEmpty(rowCountListeners[mutator]) &&
2311
- collIsEmpty(rowIdsListeners[mutator]) &&
2312
2362
  emptySortedRowIdListeners &&
2313
- collIsEmpty(tableIdsListeners[mutator]);
2363
+ collIsEmpty(tableIdsListeners[mutator]) &&
2364
+ collIsEmpty(hasTableListeners[mutator]);
2314
2365
  const emptyOtherListeners =
2315
2366
  collIsEmpty(cellListeners[mutator]) &&
2316
2367
  collIsEmpty(rowListeners[mutator]) &&
2317
2368
  collIsEmpty(tableListeners[mutator]) &&
2318
2369
  collIsEmpty(tablesListeners[mutator]);
2319
- if (!emptyIdListeners || !emptyOtherListeners) {
2370
+ if (!emptyIdAndHasListeners || !emptyOtherListeners) {
2320
2371
  const changes = mutator
2321
2372
  ? [
2322
2373
  mapClone(changedTableIds),
@@ -2334,12 +2385,17 @@ const createStore = () => {
2334
2385
  changedCellIds,
2335
2386
  changedCells,
2336
2387
  ];
2337
- if (!emptyIdListeners) {
2338
- callIdsListenersIfChanged(tableIdsListeners[mutator], changes[0]);
2388
+ if (!emptyIdAndHasListeners) {
2389
+ callIdsAndHasListenersIfChanged(
2390
+ changes[0],
2391
+ tableIdsListeners[mutator],
2392
+ hasTableListeners[mutator],
2393
+ );
2339
2394
  collForEach(changes[1], (changedIds, tableId) =>
2340
- callIdsListenersIfChanged(
2341
- tableCellIdsListeners[mutator],
2395
+ callIdsAndHasListenersIfChanged(
2342
2396
  changedIds,
2397
+ tableCellIdsListeners[mutator],
2398
+ hasTableCellListeners[mutator],
2343
2399
  [tableId],
2344
2400
  ),
2345
2401
  );
@@ -2355,9 +2411,12 @@ const createStore = () => {
2355
2411
  const calledSortableTableIds = setNew();
2356
2412
  collForEach(changes[3], (changedIds, tableId) => {
2357
2413
  if (
2358
- callIdsListenersIfChanged(rowIdsListeners[mutator], changedIds, [
2359
- tableId,
2360
- ]) &&
2414
+ callIdsAndHasListenersIfChanged(
2415
+ changedIds,
2416
+ rowIdsListeners[mutator],
2417
+ hasRowListeners[mutator],
2418
+ [tableId],
2419
+ ) &&
2361
2420
  !emptySortedRowIdListeners
2362
2421
  ) {
2363
2422
  callListeners(sortedRowIdsListeners[mutator], [tableId, null]);
@@ -2386,10 +2445,12 @@ const createStore = () => {
2386
2445
  }
2387
2446
  collForEach(changes[4], (rowCellIds, tableId) =>
2388
2447
  collForEach(rowCellIds, (changedIds, rowId) =>
2389
- callIdsListenersIfChanged(cellIdsListeners[mutator], changedIds, [
2390
- tableId,
2391
- rowId,
2392
- ]),
2448
+ callIdsAndHasListenersIfChanged(
2449
+ changedIds,
2450
+ cellIdsListeners[mutator],
2451
+ hasCellListeners[mutator],
2452
+ [tableId, rowId],
2453
+ ),
2393
2454
  ),
2394
2455
  );
2395
2456
  }
@@ -2429,17 +2490,27 @@ const createStore = () => {
2429
2490
  }
2430
2491
  }
2431
2492
  };
2432
- const callKeyedValuesListenersForChanges = (mutator) => {
2433
- const emptyIdListeners = collIsEmpty(valueIdsListeners[mutator]);
2493
+ const callValuesListenersForChanges = (mutator) => {
2494
+ const hasValuesNow = hasValues();
2495
+ if (hasValuesNow != hadValues) {
2496
+ callListeners(hasValuesListeners[mutator], void 0, hasValuesNow);
2497
+ }
2498
+ const emptyIdAndHasListeners =
2499
+ collIsEmpty(valueIdsListeners[mutator]) &&
2500
+ collIsEmpty(hasValueListeners[mutator]);
2434
2501
  const emptyOtherListeners =
2435
2502
  collIsEmpty(valueListeners[mutator]) &&
2436
2503
  collIsEmpty(valuesListeners[mutator]);
2437
- if (!emptyIdListeners || !emptyOtherListeners) {
2504
+ if (!emptyIdAndHasListeners || !emptyOtherListeners) {
2438
2505
  const changes = mutator
2439
2506
  ? [mapClone(changedValueIds), mapClone(changedValues)]
2440
2507
  : [changedValueIds, changedValues];
2441
- if (!emptyIdListeners) {
2442
- callIdsListenersIfChanged(valueIdsListeners[mutator], changes[0]);
2508
+ if (!emptyIdAndHasListeners) {
2509
+ callIdsAndHasListenersIfChanged(
2510
+ changes[0],
2511
+ valueIdsListeners[mutator],
2512
+ hasValueListeners[mutator],
2513
+ );
2443
2514
  }
2444
2515
  if (!emptyOtherListeners) {
2445
2516
  let valuesChanged;
@@ -2812,7 +2883,7 @@ const createStore = () => {
2812
2883
  }
2813
2884
  callInvalidValueListeners(1);
2814
2885
  if (valuesTouched) {
2815
- callKeyedValuesListenersForChanges(1);
2886
+ callValuesListenersForChanges(1);
2816
2887
  }
2817
2888
  if (doRollback?.(getTransactionChanges, getTransactionLog)) {
2818
2889
  collForEach(changedCells, (table, tableId) =>
@@ -2840,7 +2911,7 @@ const createStore = () => {
2840
2911
  }
2841
2912
  callInvalidValueListeners(0);
2842
2913
  if (valuesTouched) {
2843
- callKeyedValuesListenersForChanges(0);
2914
+ callValuesListenersForChanges(0);
2844
2915
  }
2845
2916
  callListeners(
2846
2917
  finishTransactionListeners[1],
@@ -2850,6 +2921,8 @@ const createStore = () => {
2850
2921
  );
2851
2922
  transactions = 0;
2852
2923
  cellsTouched = valuesTouched = false;
2924
+ hadTables = hasTables();
2925
+ hadValues = hasValues();
2853
2926
  arrayForEach(
2854
2927
  [
2855
2928
  changedTableIds,
@@ -2946,19 +3019,26 @@ const createStore = () => {
2946
3019
  return store;
2947
3020
  };
2948
3021
  const getListenerStats = () => ({
3022
+ hasTables: pairCollSize2(hasTablesListeners),
2949
3023
  tables: pairCollSize2(tablesListeners),
2950
3024
  tableIds: pairCollSize2(tableIdsListeners),
2951
- tableCellIds: pairCollSize2(tableCellIdsListeners),
3025
+ hasTable: pairCollSize2(hasTableListeners),
2952
3026
  table: pairCollSize2(tableListeners),
3027
+ tableCellIds: pairCollSize2(tableCellIdsListeners),
3028
+ hasTableCell: pairCollSize2(hasTableCellListeners, collSize3),
2953
3029
  rowCount: pairCollSize2(rowCountListeners),
2954
3030
  rowIds: pairCollSize2(rowIdsListeners),
2955
3031
  sortedRowIds: pairCollSize2(sortedRowIdsListeners),
3032
+ hasRow: pairCollSize2(hasRowListeners, collSize3),
2956
3033
  row: pairCollSize2(rowListeners, collSize3),
2957
3034
  cellIds: pairCollSize2(cellIdsListeners, collSize3),
3035
+ hasCell: pairCollSize2(hasCellListeners, collSize4),
2958
3036
  cell: pairCollSize2(cellListeners, collSize4),
2959
3037
  invalidCell: pairCollSize2(invalidCellListeners, collSize4),
3038
+ hasValues: pairCollSize2(hasValuesListeners),
2960
3039
  values: pairCollSize2(valuesListeners),
2961
3040
  valueIds: pairCollSize2(valueIdsListeners),
3041
+ hasValue: pairCollSize2(hasValueListeners),
2962
3042
  value: pairCollSize2(valueListeners),
2963
3043
  invalidValue: pairCollSize2(invalidValueListeners),
2964
3044
  transaction:
@@ -3043,14 +3123,39 @@ const createStore = () => {
3043
3123
  };
3044
3124
  objMap(
3045
3125
  {
3126
+ [HAS + TABLES]: [0, hasTablesListeners, [], () => [hasTables()]],
3046
3127
  [TABLES]: [0, tablesListeners],
3047
3128
  [TABLE_IDS]: [0, tableIdsListeners],
3129
+ [HAS + TABLE]: [
3130
+ 1,
3131
+ hasTableListeners,
3132
+ [getTableIds],
3133
+ (ids) => [hasTable(...ids)],
3134
+ ],
3048
3135
  [TABLE]: [1, tableListeners, [getTableIds]],
3049
3136
  [TABLE + CELL_IDS]: [1, tableCellIdsListeners, [getTableIds]],
3137
+ [HAS + TABLE + CELL]: [
3138
+ 2,
3139
+ hasTableCellListeners,
3140
+ [getTableIds, getTableCellIds],
3141
+ (ids) => [hasTableCell(...ids)],
3142
+ ],
3050
3143
  [ROW_COUNT]: [1, rowCountListeners, [getTableIds]],
3051
3144
  [ROW_IDS]: [1, rowIdsListeners, [getTableIds]],
3145
+ [HAS + ROW]: [
3146
+ 2,
3147
+ hasRowListeners,
3148
+ [getTableIds, getRowIds],
3149
+ (ids) => [hasRow(...ids)],
3150
+ ],
3052
3151
  [ROW]: [2, rowListeners, [getTableIds, getRowIds]],
3053
3152
  [CELL_IDS]: [2, cellIdsListeners, [getTableIds, getRowIds]],
3153
+ [HAS + CELL]: [
3154
+ 3,
3155
+ hasCellListeners,
3156
+ [getTableIds, getRowIds, getCellIds],
3157
+ (ids) => [hasCell(...ids)],
3158
+ ],
3054
3159
  [CELL]: [
3055
3160
  3,
3056
3161
  cellListeners,
@@ -3058,8 +3163,15 @@ const createStore = () => {
3058
3163
  (ids) => pairNew(getCell(...ids)),
3059
3164
  ],
3060
3165
  InvalidCell: [3, invalidCellListeners],
3166
+ [HAS + VALUES]: [0, hasValuesListeners, [], () => [hasValues()]],
3061
3167
  [VALUES]: [0, valuesListeners],
3062
3168
  [VALUE_IDS]: [0, valueIdsListeners],
3169
+ [HAS + VALUE]: [
3170
+ 1,
3171
+ hasValueListeners,
3172
+ [getValueIds],
3173
+ (ids) => [hasValue(...ids)],
3174
+ ],
3063
3175
  [VALUE]: [
3064
3176
  1,
3065
3177
  valueListeners,