tinybase 4.0.0-beta.4 → 4.0.0-beta.5.1

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 (269) hide show
  1. package/lib/cjs/persisters/persister-automerge.cjs +1 -0
  2. package/lib/cjs/persisters/persister-automerge.cjs.gz +0 -0
  3. package/lib/cjs/persisters/persister-browser.cjs +1 -0
  4. package/lib/cjs/persisters/persister-browser.cjs.gz +0 -0
  5. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -0
  6. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  7. package/lib/cjs/persisters/persister-file.cjs +1 -0
  8. package/lib/cjs/persisters/persister-file.cjs.gz +0 -0
  9. package/lib/cjs/persisters/persister-remote.cjs +1 -0
  10. package/lib/cjs/persisters/persister-remote.cjs.gz +0 -0
  11. package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -0
  12. package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  13. package/lib/cjs/persisters/persister-sqlite3.cjs +1 -0
  14. package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
  15. package/lib/cjs/persisters/persister-yjs.cjs +1 -0
  16. package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
  17. package/lib/cjs/persisters.cjs +1 -1
  18. package/lib/cjs/persisters.cjs.gz +0 -0
  19. package/lib/cjs/store.cjs +1 -1
  20. package/lib/cjs/store.cjs.gz +0 -0
  21. package/lib/cjs/tinybase.cjs +1 -1
  22. package/lib/cjs/tinybase.cjs.gz +0 -0
  23. package/lib/cjs/tools.cjs +1 -1
  24. package/lib/cjs/tools.cjs.gz +0 -0
  25. package/lib/cjs/ui-react.cjs +1 -1
  26. package/lib/cjs/ui-react.cjs.gz +0 -0
  27. package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -0
  28. package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
  29. package/lib/cjs-es6/persisters/persister-browser.cjs +1 -0
  30. package/lib/cjs-es6/persisters/persister-browser.cjs.gz +0 -0
  31. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -0
  32. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  33. package/lib/cjs-es6/persisters/persister-file.cjs +1 -0
  34. package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
  35. package/lib/cjs-es6/persisters/persister-remote.cjs +1 -0
  36. package/lib/cjs-es6/persisters/persister-remote.cjs.gz +0 -0
  37. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -0
  38. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  39. package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -0
  40. package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
  41. package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -0
  42. package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
  43. package/lib/cjs-es6/persisters.cjs +1 -1
  44. package/lib/cjs-es6/persisters.cjs.gz +0 -0
  45. package/lib/cjs-es6/store.cjs +1 -1
  46. package/lib/cjs-es6/store.cjs.gz +0 -0
  47. package/lib/cjs-es6/tinybase.cjs +1 -1
  48. package/lib/cjs-es6/tinybase.cjs.gz +0 -0
  49. package/lib/cjs-es6/tools.cjs +1 -1
  50. package/lib/cjs-es6/tools.cjs.gz +0 -0
  51. package/lib/cjs-es6/ui-react.cjs +1 -1
  52. package/lib/cjs-es6/ui-react.cjs.gz +0 -0
  53. package/lib/debug/{persister-automerge.js → persisters/persister-automerge.js} +58 -31
  54. package/lib/debug/{persister-browser.js → persisters/persister-browser.js} +49 -20
  55. package/lib/debug/persisters/persister-cr-sqlite-wasm.js +665 -0
  56. package/lib/debug/{persister-file.js → persisters/persister-file.js} +51 -25
  57. package/lib/debug/{persister-remote.js → persisters/persister-remote.js} +48 -19
  58. package/lib/debug/persisters/persister-sqlite-wasm.js +673 -0
  59. package/lib/debug/persisters/persister-sqlite3.js +676 -0
  60. package/lib/debug/{persister-yjs.js → persisters/persister-yjs.js} +49 -20
  61. package/lib/debug/persisters.js +47 -18
  62. package/lib/debug/store.js +79 -29
  63. package/lib/debug/tinybase.js +123 -46
  64. package/lib/debug/tools.js +121 -27
  65. package/lib/debug/ui-react.js +24 -0
  66. package/lib/es6/persisters/persister-automerge.js +1 -0
  67. package/lib/es6/persisters/persister-automerge.js.gz +0 -0
  68. package/lib/es6/persisters/persister-browser.js +1 -0
  69. package/lib/es6/persisters/persister-browser.js.gz +0 -0
  70. package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -0
  71. package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  72. package/lib/es6/persisters/persister-file.js +1 -0
  73. package/lib/es6/persisters/persister-file.js.gz +0 -0
  74. package/lib/es6/persisters/persister-remote.js +1 -0
  75. package/lib/es6/persisters/persister-remote.js.gz +0 -0
  76. package/lib/es6/persisters/persister-sqlite-wasm.js +1 -0
  77. package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  78. package/lib/es6/persisters/persister-sqlite3.js +1 -0
  79. package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
  80. package/lib/es6/persisters/persister-yjs.js +1 -0
  81. package/lib/es6/persisters/persister-yjs.js.gz +0 -0
  82. package/lib/es6/persisters.js +1 -1
  83. package/lib/es6/persisters.js.gz +0 -0
  84. package/lib/es6/store.js +1 -1
  85. package/lib/es6/store.js.gz +0 -0
  86. package/lib/es6/tinybase.js +1 -1
  87. package/lib/es6/tinybase.js.gz +0 -0
  88. package/lib/es6/tools.js +1 -1
  89. package/lib/es6/tools.js.gz +0 -0
  90. package/lib/es6/ui-react.js +1 -1
  91. package/lib/es6/ui-react.js.gz +0 -0
  92. package/lib/persisters/persister-automerge.js +1 -0
  93. package/lib/persisters/persister-automerge.js.gz +0 -0
  94. package/lib/persisters/persister-browser.js +1 -0
  95. package/lib/persisters/persister-browser.js.gz +0 -0
  96. package/lib/persisters/persister-cr-sqlite-wasm.js +1 -0
  97. package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  98. package/lib/persisters/persister-file.js +1 -0
  99. package/lib/persisters/persister-file.js.gz +0 -0
  100. package/lib/persisters/persister-remote.js +1 -0
  101. package/lib/persisters/persister-remote.js.gz +0 -0
  102. package/lib/persisters/persister-sqlite-wasm.js +1 -0
  103. package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
  104. package/lib/persisters/persister-sqlite3.js +1 -0
  105. package/lib/persisters/persister-sqlite3.js.gz +0 -0
  106. package/lib/persisters/persister-yjs.js +1 -0
  107. package/lib/persisters/persister-yjs.js.gz +0 -0
  108. package/lib/persisters.js +1 -1
  109. package/lib/persisters.js.gz +0 -0
  110. package/lib/store.js +1 -1
  111. package/lib/store.js.gz +0 -0
  112. package/lib/tinybase.js +1 -1
  113. package/lib/tinybase.js.gz +0 -0
  114. package/lib/tools.js +1 -1
  115. package/lib/tools.js.gz +0 -0
  116. package/lib/types/checkpoints.d.ts +0 -27
  117. package/lib/types/common.d.ts +0 -9
  118. package/lib/types/indexes.d.ts +0 -26
  119. package/lib/types/metrics.d.ts +0 -23
  120. package/lib/types/{persister-automerge.d.ts → persisters/persister-automerge.d.ts} +4 -6
  121. package/lib/types/{persister-browser.d.ts → persisters/persister-browser.d.ts} +2 -5
  122. package/lib/types/persisters/persister-cr-sqlite-wasm.d.ts +95 -0
  123. package/lib/types/{persister-file.d.ts → persisters/persister-file.d.ts} +3 -5
  124. package/lib/types/{persister-remote.d.ts → persisters/persister-remote.d.ts} +2 -4
  125. package/lib/types/persisters/persister-sqlite-wasm.d.ts +102 -0
  126. package/lib/types/persisters/persister-sqlite3.d.ts +109 -0
  127. package/lib/types/{persister-yjs.d.ts → persisters/persister-yjs.d.ts} +4 -6
  128. package/lib/types/persisters.d.ts +517 -27
  129. package/lib/types/queries.d.ts +52 -127
  130. package/lib/types/relationships.d.ts +0 -26
  131. package/lib/types/store.d.ts +347 -196
  132. package/lib/types/tinybase.d.ts +0 -1
  133. package/lib/types/tools.d.ts +15 -28
  134. package/lib/types/ui-react.d.ts +196 -181
  135. package/lib/types/with-schemas/checkpoints.d.ts +5 -32
  136. package/lib/types/with-schemas/common.d.ts +0 -9
  137. package/lib/types/with-schemas/indexes.d.ts +9 -35
  138. package/lib/types/with-schemas/metrics.d.ts +9 -32
  139. package/lib/types/with-schemas/{persister-automerge.d.ts → persisters/persister-automerge.d.ts} +4 -6
  140. package/lib/types/with-schemas/{persister-browser.d.ts → persisters/persister-browser.d.ts} +2 -5
  141. package/lib/types/with-schemas/persisters/persister-cr-sqlite-wasm.d.ts +105 -0
  142. package/lib/types/with-schemas/{persister-file.d.ts → persisters/persister-file.d.ts} +3 -5
  143. package/lib/types/with-schemas/{persister-remote.d.ts → persisters/persister-remote.d.ts} +2 -4
  144. package/lib/types/with-schemas/persisters/persister-sqlite-wasm.d.ts +113 -0
  145. package/lib/types/with-schemas/persisters/persister-sqlite3.d.ts +119 -0
  146. package/lib/types/with-schemas/{persister-yjs.d.ts → persisters/persister-yjs.d.ts} +4 -6
  147. package/lib/types/with-schemas/persisters.d.ts +534 -29
  148. package/lib/types/with-schemas/queries.d.ts +61 -224
  149. package/lib/types/with-schemas/relationships.d.ts +9 -35
  150. package/lib/types/with-schemas/store.d.ts +488 -239
  151. package/lib/types/with-schemas/tinybase.d.ts +0 -1
  152. package/lib/types/with-schemas/tools.d.ts +19 -32
  153. package/lib/types/with-schemas/ui-react.d.ts +221 -186
  154. package/lib/ui-react.js +1 -1
  155. package/lib/ui-react.js.gz +0 -0
  156. package/lib/umd/persisters/persister-automerge.js +1 -0
  157. package/lib/umd/persisters/persister-automerge.js.gz +0 -0
  158. package/lib/umd/persisters/persister-browser.js +1 -0
  159. package/lib/umd/persisters/persister-browser.js.gz +0 -0
  160. package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -0
  161. package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  162. package/lib/umd/persisters/persister-file.js +1 -0
  163. package/lib/umd/persisters/persister-file.js.gz +0 -0
  164. package/lib/umd/persisters/persister-remote.js +1 -0
  165. package/lib/umd/persisters/persister-remote.js.gz +0 -0
  166. package/lib/umd/persisters/persister-sqlite-wasm.js +1 -0
  167. package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
  168. package/lib/umd/persisters/persister-sqlite3.js +1 -0
  169. package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
  170. package/lib/umd/persisters/persister-yjs.js +1 -0
  171. package/lib/umd/persisters/persister-yjs.js.gz +0 -0
  172. package/lib/umd/persisters.js +1 -1
  173. package/lib/umd/persisters.js.gz +0 -0
  174. package/lib/umd/store.js +1 -1
  175. package/lib/umd/store.js.gz +0 -0
  176. package/lib/umd/tinybase.js +1 -1
  177. package/lib/umd/tinybase.js.gz +0 -0
  178. package/lib/umd/tools.js +1 -1
  179. package/lib/umd/tools.js.gz +0 -0
  180. package/lib/umd/ui-react.js +1 -1
  181. package/lib/umd/ui-react.js.gz +0 -0
  182. package/lib/umd-es6/persisters/persister-automerge.js +1 -0
  183. package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
  184. package/lib/umd-es6/persisters/persister-browser.js +1 -0
  185. package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
  186. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -0
  187. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  188. package/lib/umd-es6/persisters/persister-file.js +1 -0
  189. package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
  190. package/lib/umd-es6/persisters/persister-remote.js +1 -0
  191. package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
  192. package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -0
  193. package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  194. package/lib/umd-es6/persisters/persister-sqlite3.js +1 -0
  195. package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
  196. package/lib/umd-es6/persisters/persister-yjs.js +1 -0
  197. package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
  198. package/lib/umd-es6/persisters.js +1 -1
  199. package/lib/umd-es6/persisters.js.gz +0 -0
  200. package/lib/umd-es6/store.js +1 -1
  201. package/lib/umd-es6/store.js.gz +0 -0
  202. package/lib/umd-es6/tinybase.js +1 -1
  203. package/lib/umd-es6/tinybase.js.gz +0 -0
  204. package/lib/umd-es6/tools.js +1 -1
  205. package/lib/umd-es6/tools.js.gz +0 -0
  206. package/lib/umd-es6/ui-react.js +1 -1
  207. package/lib/umd-es6/ui-react.js.gz +0 -0
  208. package/package.json +39 -22
  209. package/readme.md +3 -3
  210. package/lib/cjs/persister-automerge.cjs +0 -1
  211. package/lib/cjs/persister-automerge.cjs.gz +0 -0
  212. package/lib/cjs/persister-browser.cjs +0 -1
  213. package/lib/cjs/persister-browser.cjs.gz +0 -0
  214. package/lib/cjs/persister-file.cjs +0 -1
  215. package/lib/cjs/persister-file.cjs.gz +0 -0
  216. package/lib/cjs/persister-remote.cjs +0 -1
  217. package/lib/cjs/persister-remote.cjs.gz +0 -0
  218. package/lib/cjs/persister-yjs.cjs +0 -1
  219. package/lib/cjs/persister-yjs.cjs.gz +0 -0
  220. package/lib/cjs-es6/persister-automerge.cjs +0 -1
  221. package/lib/cjs-es6/persister-automerge.cjs.gz +0 -0
  222. package/lib/cjs-es6/persister-browser.cjs +0 -1
  223. package/lib/cjs-es6/persister-browser.cjs.gz +0 -0
  224. package/lib/cjs-es6/persister-file.cjs +0 -1
  225. package/lib/cjs-es6/persister-file.cjs.gz +0 -0
  226. package/lib/cjs-es6/persister-remote.cjs +0 -1
  227. package/lib/cjs-es6/persister-remote.cjs.gz +0 -0
  228. package/lib/cjs-es6/persister-yjs.cjs +0 -1
  229. package/lib/cjs-es6/persister-yjs.cjs.gz +0 -0
  230. package/lib/es6/persister-automerge.js +0 -1
  231. package/lib/es6/persister-automerge.js.gz +0 -0
  232. package/lib/es6/persister-browser.js +0 -1
  233. package/lib/es6/persister-browser.js.gz +0 -0
  234. package/lib/es6/persister-file.js +0 -1
  235. package/lib/es6/persister-file.js.gz +0 -0
  236. package/lib/es6/persister-remote.js +0 -1
  237. package/lib/es6/persister-remote.js.gz +0 -0
  238. package/lib/es6/persister-yjs.js +0 -1
  239. package/lib/es6/persister-yjs.js.gz +0 -0
  240. package/lib/persister-automerge.js +0 -1
  241. package/lib/persister-automerge.js.gz +0 -0
  242. package/lib/persister-browser.js +0 -1
  243. package/lib/persister-browser.js.gz +0 -0
  244. package/lib/persister-file.js +0 -1
  245. package/lib/persister-file.js.gz +0 -0
  246. package/lib/persister-remote.js +0 -1
  247. package/lib/persister-remote.js.gz +0 -0
  248. package/lib/persister-yjs.js +0 -1
  249. package/lib/persister-yjs.js.gz +0 -0
  250. package/lib/umd/persister-automerge.js +0 -1
  251. package/lib/umd/persister-automerge.js.gz +0 -0
  252. package/lib/umd/persister-browser.js +0 -1
  253. package/lib/umd/persister-browser.js.gz +0 -0
  254. package/lib/umd/persister-file.js +0 -1
  255. package/lib/umd/persister-file.js.gz +0 -0
  256. package/lib/umd/persister-remote.js +0 -1
  257. package/lib/umd/persister-remote.js.gz +0 -0
  258. package/lib/umd/persister-yjs.js +0 -1
  259. package/lib/umd/persister-yjs.js.gz +0 -0
  260. package/lib/umd-es6/persister-automerge.js +0 -1
  261. package/lib/umd-es6/persister-automerge.js.gz +0 -0
  262. package/lib/umd-es6/persister-browser.js +0 -1
  263. package/lib/umd-es6/persister-browser.js.gz +0 -0
  264. package/lib/umd-es6/persister-file.js +0 -1
  265. package/lib/umd-es6/persister-file.js.gz +0 -0
  266. package/lib/umd-es6/persister-remote.js +0 -1
  267. package/lib/umd-es6/persister-remote.js.gz +0 -0
  268. package/lib/umd-es6/persister-yjs.js +0 -1
  269. package/lib/umd-es6/persister-yjs.js.gz +0 -0
@@ -88,10 +88,14 @@ const isObject = (obj) =>
88
88
  isInstanceOf(obj, object) && obj.constructor == object;
89
89
  const objGet = (obj, id) => ifNotUndefined(obj, (obj2) => obj2[id]);
90
90
  const objHas = (obj, id) => !isUndefined(objGet(obj, id));
91
- const objDel = (obj, id) => delete obj[id];
91
+ const objDel = (obj, id) => {
92
+ delete obj[id];
93
+ return obj;
94
+ };
92
95
  const objMap = (obj, cb) =>
93
96
  arrayMap(object.entries(obj), ([id, value]) => cb(value, id));
94
- const objIsEmpty = (obj) => isObject(obj) && arrayIsEmpty(objIds(obj));
97
+ const objSize = (obj) => arrayLength(objIds(obj));
98
+ const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
95
99
 
96
100
  const collSizeN = (collSizer) => (coll) =>
97
101
  arrayReduce(collValues(coll), (total, coll2) => total + collSizer(coll2), 0);
@@ -121,6 +125,11 @@ const mapEnsure = (map, key, getDefaultValue) => {
121
125
  }
122
126
  return mapGet(map, key);
123
127
  };
128
+ const mapMatch = (map, obj, set, del = mapSet) => {
129
+ objMap(obj, (value, id) => set(map, id, value));
130
+ mapForEach(map, (id) => (objHas(obj, id) ? 0 : del(map, id)));
131
+ return map;
132
+ };
124
133
  const mapToObj = (map, mapValue, excludeValue) => {
125
134
  const obj = {};
126
135
  collForEach(map, (value, id) => {
@@ -1029,8 +1038,23 @@ const createCustomPersister = (
1029
1038
  let loadSave = 0;
1030
1039
  let loads = 0;
1031
1040
  let saves = 0;
1032
- let listening = false;
1041
+ let running = 0;
1042
+ let listening = 0;
1043
+ let action;
1033
1044
  let listeningHandle;
1045
+ const scheduledActions = [];
1046
+ const run = async () => {
1047
+ /* istanbul ignore else */
1048
+ if (!running) {
1049
+ running = 1;
1050
+ while (!isUndefined((action = arrayShift(scheduledActions)))) {
1051
+ try {
1052
+ await action();
1053
+ } catch {}
1054
+ }
1055
+ running = 0;
1056
+ }
1057
+ };
1034
1058
  const loadLock = async (actions) => {
1035
1059
  /* istanbul ignore else */
1036
1060
  if (loadSave != 2) {
@@ -1043,20 +1067,20 @@ const createCustomPersister = (
1043
1067
  }
1044
1068
  };
1045
1069
  const persister = {
1046
- load: async (initialTables = {}, initialValues = {}) => {
1070
+ load: async (initialTables, initialValues) => {
1047
1071
  await loadLock(async () => {
1048
- let content;
1049
1072
  try {
1050
- content = await getPersisted();
1051
- } catch {}
1052
- store.setContent(content ?? [initialTables, initialValues]);
1073
+ store.setContent(await getPersisted());
1074
+ } catch {
1075
+ store.setContent([initialTables, initialValues]);
1076
+ }
1053
1077
  });
1054
1078
  return persister;
1055
1079
  },
1056
1080
  startAutoLoad: async (initialTables = {}, initialValues = {}) => {
1057
1081
  persister.stopAutoLoad();
1058
1082
  await persister.load(initialTables, initialValues);
1059
- listening = true;
1083
+ listening = 1;
1060
1084
  listeningHandle = addPersisterListener(
1061
1085
  async (getContent, getTransactionChanges) => {
1062
1086
  await loadLock(async () => {
@@ -1076,27 +1100,33 @@ const createCustomPersister = (
1076
1100
  if (listening) {
1077
1101
  delPersisterListener(listeningHandle);
1078
1102
  listeningHandle = void 0;
1079
- listening = false;
1103
+ listening = 0;
1080
1104
  }
1081
1105
  return persister;
1082
1106
  },
1083
1107
  save: async (getTransactionChanges) => {
1084
- /* istanbul ignore else */
1085
- if (loadSave != 1) {
1086
- loadSave = 2;
1087
- {
1088
- saves++;
1108
+ await persister.schedule(async () => {
1109
+ /* istanbul ignore else */
1110
+ if (loadSave != 1) {
1111
+ loadSave = 2;
1112
+ {
1113
+ saves++;
1114
+ }
1115
+ try {
1116
+ await setPersisted(store.getContent, getTransactionChanges);
1117
+ } catch {}
1118
+ loadSave = 0;
1089
1119
  }
1090
- await setPersisted(store.getContent, getTransactionChanges);
1091
- loadSave = 0;
1092
- }
1120
+ });
1093
1121
  return persister;
1094
1122
  },
1095
1123
  startAutoSave: async () => {
1096
1124
  await persister.stopAutoSave().save();
1097
1125
  listenerId = store.addDidFinishTransactionListener(
1098
- (_store, getTransactionChanges) =>
1099
- persister.save(getTransactionChanges),
1126
+ (_store, getTransactionChanges) => {
1127
+ const transactionChanges = getTransactionChanges();
1128
+ persister.save(() => transactionChanges);
1129
+ },
1100
1130
  );
1101
1131
  return persister;
1102
1132
  },
@@ -1104,6 +1134,11 @@ const createCustomPersister = (
1104
1134
  ifNotUndefined(listenerId, store.delListener);
1105
1135
  return persister;
1106
1136
  },
1137
+ schedule: async (...actions) => {
1138
+ arrayPush(scheduledActions, ...actions);
1139
+ await run();
1140
+ return persister;
1141
+ },
1107
1142
  getStore: () => store,
1108
1143
  destroy: () => persister.stopAutoLoad().stopAutoSave(),
1109
1144
  getStats: () => ({loads, saves}),
@@ -1743,11 +1778,6 @@ const pairNewMap = () => [mapNew(), mapNew()];
1743
1778
  const pairClone = (array) => [...array];
1744
1779
  const pairIsEqual = ([entry1, entry2]) => entry1 === entry2;
1745
1780
 
1746
- const mapMatch = (map, obj, set, del = mapSet) => {
1747
- objMap(obj, (value, id2) => set(map, id2, value));
1748
- mapForEach(map, (id2) => (objHas(obj, id2) ? 0 : del(map, id2)));
1749
- return map;
1750
- };
1751
1781
  const validate = (obj, validateChild, onInvalidObj) => {
1752
1782
  if (isUndefined(obj) || !isObject(obj) || objIsEmpty(obj) || objFrozen(obj)) {
1753
1783
  onInvalidObj?.();
@@ -1773,6 +1803,7 @@ const createStore = () => {
1773
1803
  let valuesTouched = false;
1774
1804
  let transactions = 0;
1775
1805
  const changedTableIds = mapNew();
1806
+ const changedTableCellIds = mapNew();
1776
1807
  const changedRowIds = mapNew();
1777
1808
  const changedCellIds = mapNew();
1778
1809
  const changedCells = mapNew();
@@ -1786,11 +1817,13 @@ const createStore = () => {
1786
1817
  const valuesDefaulted = mapNew();
1787
1818
  const valuesNonDefaulted = setNew();
1788
1819
  const tablePoolFunctions = mapNew();
1820
+ const tableCellIds = mapNew();
1789
1821
  const tablesMap = mapNew();
1790
1822
  const valuesMap = mapNew();
1791
1823
  const tablesListeners = pairNewMap();
1792
1824
  const tableIdsListeners = pairNewMap();
1793
1825
  const tableListeners = pairNewMap();
1826
+ const tableCellIdsListeners = pairNewMap();
1794
1827
  const rowIdsListeners = pairNewMap();
1795
1828
  const sortedRowIdsListeners = pairNewMap();
1796
1829
  const rowListeners = pairNewMap();
@@ -1979,6 +2012,8 @@ const createStore = () => {
1979
2012
  mapMatch(
1980
2013
  mapEnsure(tablesMap, tableId, () => {
1981
2014
  tableIdsChanged(tableId, 1);
2015
+ mapSet(tablePoolFunctions, tableId, getPoolFunctions());
2016
+ mapSet(tableCellIds, tableId, mapNew());
1982
2017
  return mapNew();
1983
2018
  }),
1984
2019
  table,
@@ -2039,7 +2074,7 @@ const createStore = () => {
2039
2074
  }
2040
2075
  };
2041
2076
  const getNewRowId = (tableId, reuse) => {
2042
- const [getId] = mapEnsure(tablePoolFunctions, tableId, getPoolFunctions);
2077
+ const [getId] = mapGet(tablePoolFunctions, tableId);
2043
2078
  const rowId = getId(reuse);
2044
2079
  if (!collHas(mapGet(tablesMap, tableId), rowId)) {
2045
2080
  return rowId;
@@ -2050,11 +2085,7 @@ const createStore = () => {
2050
2085
  mapGet(tablesMap, tableId) ?? setValidTable(tableId, {});
2051
2086
  const delValidTable = (tableId) => setValidTable(tableId, {});
2052
2087
  const delValidRow = (tableId, tableMap, rowId) => {
2053
- const [, releaseId] = mapEnsure(
2054
- tablePoolFunctions,
2055
- tableId,
2056
- getPoolFunctions,
2057
- );
2088
+ const [, releaseId] = mapGet(tablePoolFunctions, tableId);
2058
2089
  releaseId(rowId);
2059
2090
  setValidRow(tableId, tableMap, rowId, {}, true);
2060
2091
  };
@@ -2078,6 +2109,7 @@ const createStore = () => {
2078
2109
  tableIdsChanged(tableId, -1);
2079
2110
  mapSet(tablesMap, tableId);
2080
2111
  mapSet(tablePoolFunctions, tableId);
2112
+ mapSet(tableCellIds, tableId);
2081
2113
  }
2082
2114
  }
2083
2115
  };
@@ -2098,12 +2130,30 @@ const createStore = () => {
2098
2130
  rowId,
2099
2131
  addedOrRemoved,
2100
2132
  );
2101
- const cellIdsChanged = (tableId, rowId, cellId, addedOrRemoved) =>
2133
+ const cellIdsChanged = (tableId, rowId, cellId, addedOrRemoved) => {
2134
+ const cellIds = mapGet(tableCellIds, tableId);
2135
+ const count = mapGet(cellIds, cellId) ?? 0;
2136
+ if (
2137
+ (count == 0 && addedOrRemoved == 1) ||
2138
+ (count == 1 && addedOrRemoved == -1)
2139
+ ) {
2140
+ idsChanged(
2141
+ mapEnsure(changedTableCellIds, tableId, mapNew),
2142
+ cellId,
2143
+ addedOrRemoved,
2144
+ );
2145
+ }
2146
+ mapSet(
2147
+ cellIds,
2148
+ cellId,
2149
+ count != -addedOrRemoved ? count + addedOrRemoved : null,
2150
+ );
2102
2151
  idsChanged(
2103
2152
  mapEnsure(mapEnsure(changedCellIds, tableId, mapNew), rowId, mapNew),
2104
2153
  cellId,
2105
2154
  addedOrRemoved,
2106
2155
  );
2156
+ };
2107
2157
  const cellChanged = (tableId, rowId, cellId, oldCell, newCell) =>
2108
2158
  (mapEnsure(
2109
2159
  mapEnsure(mapEnsure(changedCells, tableId, mapNew), rowId, mapNew),
@@ -2174,7 +2224,7 @@ const createStore = () => {
2174
2224
  : 0;
2175
2225
  const callIdsListenersIfChanged = (listeners, changedIds, ids) => {
2176
2226
  if (!collIsEmpty(changedIds)) {
2177
- callListeners(listeners, ids);
2227
+ callListeners(listeners, ids, () => mapToObj(changedIds));
2178
2228
  return 1;
2179
2229
  }
2180
2230
  };
@@ -2184,6 +2234,7 @@ const createStore = () => {
2184
2234
  );
2185
2235
  const emptyIdListeners =
2186
2236
  collIsEmpty(cellIdsListeners[mutator]) &&
2237
+ collIsEmpty(tableCellIdsListeners[mutator]) &&
2187
2238
  collIsEmpty(rowIdsListeners[mutator]) &&
2188
2239
  emptySortedRowIdListeners &&
2189
2240
  collIsEmpty(tableIdsListeners[mutator]);
@@ -2196,22 +2247,29 @@ const createStore = () => {
2196
2247
  const changes = mutator
2197
2248
  ? [
2198
2249
  mapClone(changedTableIds),
2250
+ mapClone2(changedTableCellIds),
2199
2251
  mapClone2(changedRowIds),
2200
2252
  mapClone3(changedCellIds),
2201
2253
  mapClone3(changedCells),
2202
2254
  ]
2203
- : [changedTableIds, changedRowIds, changedCellIds, changedCells];
2255
+ : [
2256
+ changedTableIds,
2257
+ changedTableCellIds,
2258
+ changedRowIds,
2259
+ changedCellIds,
2260
+ changedCells,
2261
+ ];
2204
2262
  if (!emptyIdListeners) {
2205
- collForEach(changes[2], (rowCellIds, tableId) =>
2206
- collForEach(rowCellIds, (changedIds, rowId) =>
2207
- callIdsListenersIfChanged(cellIdsListeners[mutator], changedIds, [
2208
- tableId,
2209
- rowId,
2210
- ]),
2263
+ callIdsListenersIfChanged(tableIdsListeners[mutator], changes[0]);
2264
+ collForEach(changes[1], (changedIds, tableId) =>
2265
+ callIdsListenersIfChanged(
2266
+ tableCellIdsListeners[mutator],
2267
+ changedIds,
2268
+ [tableId],
2211
2269
  ),
2212
2270
  );
2213
2271
  const calledSortableTableIds = setNew();
2214
- collForEach(changes[1], (changedIds, tableId) => {
2272
+ collForEach(changes[2], (changedIds, tableId) => {
2215
2273
  if (
2216
2274
  callIdsListenersIfChanged(rowIdsListeners[mutator], changedIds, [
2217
2275
  tableId,
@@ -2223,7 +2281,7 @@ const createStore = () => {
2223
2281
  }
2224
2282
  });
2225
2283
  if (!emptySortedRowIdListeners) {
2226
- collForEach(changes[3], (rows, tableId) => {
2284
+ collForEach(changes[4], (rows, tableId) => {
2227
2285
  if (!collHas(calledSortableTableIds, tableId)) {
2228
2286
  const sortableCellIds = setNew();
2229
2287
  collForEach(rows, (cells) =>
@@ -2242,11 +2300,18 @@ const createStore = () => {
2242
2300
  }
2243
2301
  });
2244
2302
  }
2245
- callIdsListenersIfChanged(tableIdsListeners[mutator], changes[0]);
2303
+ collForEach(changes[3], (rowCellIds, tableId) =>
2304
+ collForEach(rowCellIds, (changedIds, rowId) =>
2305
+ callIdsListenersIfChanged(cellIdsListeners[mutator], changedIds, [
2306
+ tableId,
2307
+ rowId,
2308
+ ]),
2309
+ ),
2310
+ );
2246
2311
  }
2247
2312
  if (!emptyOtherListeners) {
2248
2313
  let tablesChanged;
2249
- collForEach(changes[3], (rows, tableId) => {
2314
+ collForEach(changes[4], (rows, tableId) => {
2250
2315
  let tableChanged;
2251
2316
  collForEach(rows, (cells, rowId) => {
2252
2317
  let rowChanged;
@@ -2358,6 +2423,8 @@ const createStore = () => {
2358
2423
  const getTables = () => mapToObj3(tablesMap);
2359
2424
  const getTableIds = () => mapKeys(tablesMap);
2360
2425
  const getTable = (tableId) => mapToObj2(mapGet(tablesMap, id(tableId)));
2426
+ const getTableCellIds = (tableId) =>
2427
+ mapKeys(mapGet(tableCellIds, id(tableId)));
2361
2428
  const getRowIds = (tableId) => mapKeys(mapGet(tablesMap, id(tableId)));
2362
2429
  const getSortedRowIds = (tableId, cellId, descending, offset = 0, limit) =>
2363
2430
  arrayMap(
@@ -2386,6 +2453,8 @@ const createStore = () => {
2386
2453
  const getValue = (valueId) => mapGet(valuesMap, id(valueId));
2387
2454
  const hasTables = () => !collIsEmpty(tablesMap);
2388
2455
  const hasTable = (tableId) => collHas(tablesMap, id(tableId));
2456
+ const hasTableCell = (tableId, cellId) =>
2457
+ collHas(mapGet(tableCellIds, id(tableId)), id(cellId));
2389
2458
  const hasRow = (tableId, rowId) =>
2390
2459
  collHas(mapGet(tablesMap, id(tableId)), id(rowId));
2391
2460
  const hasCell = (tableId, rowId, cellId) =>
@@ -2400,8 +2469,8 @@ const createStore = () => {
2400
2469
  const getSchemaJson = () => jsonString([tablesSchemaMap, valuesSchemaMap]);
2401
2470
  const setContent = ([tables, values]) =>
2402
2471
  fluentTransaction(() => {
2403
- setTables(tables);
2404
- setValues(values);
2472
+ (objIsEmpty(tables) ? delTables : setTables)(tables);
2473
+ (objIsEmpty(values) ? delValues : setValues)(values);
2405
2474
  });
2406
2475
  const setTables = (tables) =>
2407
2476
  fluentTransaction(() =>
@@ -2699,6 +2768,7 @@ const createStore = () => {
2699
2768
  arrayForEach(
2700
2769
  [
2701
2770
  changedTableIds,
2771
+ changedTableCellIds,
2702
2772
  changedRowIds,
2703
2773
  changedCellIds,
2704
2774
  changedCells,
@@ -2723,6 +2793,8 @@ const createStore = () => {
2723
2793
  ),
2724
2794
  ),
2725
2795
  );
2796
+ const forEachTableCell = (tableId, tableCellCallback) =>
2797
+ mapForEach(mapGet(tableCellIds, id(tableId)), tableCellCallback);
2726
2798
  const forEachRow = (tableId, rowCallback) =>
2727
2799
  collForEach(mapGet(tablesMap, id(tableId)), (rowMap, rowId) =>
2728
2800
  rowCallback(rowId, (cellCallback) => mapForEach(rowMap, cellCallback)),
@@ -2790,6 +2862,7 @@ const createStore = () => {
2790
2862
  const getListenerStats = () => ({
2791
2863
  tables: pairCollSize2(tablesListeners),
2792
2864
  tableIds: pairCollSize2(tableIdsListeners),
2865
+ tableCellIds: pairCollSize2(tableCellIdsListeners),
2793
2866
  table: pairCollSize2(tableListeners),
2794
2867
  rowIds: pairCollSize2(rowIdsListeners),
2795
2868
  sortedRowIds: pairCollSize2(sortedRowIdsListeners),
@@ -2810,6 +2883,7 @@ const createStore = () => {
2810
2883
  getTables,
2811
2884
  getTableIds,
2812
2885
  getTable,
2886
+ getTableCellIds,
2813
2887
  getRowIds,
2814
2888
  getSortedRowIds,
2815
2889
  getRow,
@@ -2820,6 +2894,7 @@ const createStore = () => {
2820
2894
  getValue,
2821
2895
  hasTables,
2822
2896
  hasTable,
2897
+ hasTableCell,
2823
2898
  hasRow,
2824
2899
  hasCell,
2825
2900
  hasValues,
@@ -2860,6 +2935,7 @@ const createStore = () => {
2860
2935
  startTransaction,
2861
2936
  finishTransaction,
2862
2937
  forEachTable,
2938
+ forEachTableCell,
2863
2939
  forEachRow,
2864
2940
  forEachCell,
2865
2941
  forEachValue,
@@ -2877,6 +2953,7 @@ const createStore = () => {
2877
2953
  [TABLES]: [0, tablesListeners],
2878
2954
  [TABLE_IDS]: [0, tableIdsListeners],
2879
2955
  [TABLE]: [1, tableListeners, [getTableIds]],
2956
+ [TABLE + CELL_IDS]: [1, tableCellIdsListeners, [getTableIds]],
2880
2957
  [ROW_IDS]: [1, rowIdsListeners, [getTableIds]],
2881
2958
  [ROW]: [2, rowListeners, [getTableIds, getRowIds]],
2882
2959
  [CELL_IDS]: [2, cellIdsListeners, [getTableIds, getRowIds]],