tinybase 7.3.3 → 7.3.4

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 (244) hide show
  1. package/checkpoints/index.js +12 -11
  2. package/checkpoints/with-schemas/index.js +12 -11
  3. package/common/index.js +3 -2
  4. package/common/with-schemas/index.js +3 -2
  5. package/index.js +92 -64
  6. package/indexes/index.js +13 -12
  7. package/indexes/with-schemas/index.js +13 -12
  8. package/mergeable-store/index.js +92 -64
  9. package/mergeable-store/with-schemas/index.js +92 -64
  10. package/metrics/index.js +13 -12
  11. package/metrics/with-schemas/index.js +13 -12
  12. package/min/checkpoints/index.js +1 -1
  13. package/min/checkpoints/index.js.gz +0 -0
  14. package/min/checkpoints/with-schemas/index.js +1 -1
  15. package/min/checkpoints/with-schemas/index.js.gz +0 -0
  16. package/min/common/index.js +1 -1
  17. package/min/common/index.js.gz +0 -0
  18. package/min/common/with-schemas/index.js +1 -1
  19. package/min/common/with-schemas/index.js.gz +0 -0
  20. package/min/index.js +1 -1
  21. package/min/index.js.gz +0 -0
  22. package/min/indexes/index.js +1 -1
  23. package/min/indexes/index.js.gz +0 -0
  24. package/min/indexes/with-schemas/index.js +1 -1
  25. package/min/indexes/with-schemas/index.js.gz +0 -0
  26. package/min/mergeable-store/index.js +1 -1
  27. package/min/mergeable-store/index.js.gz +0 -0
  28. package/min/mergeable-store/with-schemas/index.js +1 -1
  29. package/min/mergeable-store/with-schemas/index.js.gz +0 -0
  30. package/min/metrics/index.js +1 -1
  31. package/min/metrics/index.js.gz +0 -0
  32. package/min/metrics/with-schemas/index.js +1 -1
  33. package/min/metrics/with-schemas/index.js.gz +0 -0
  34. package/min/omni/index.js +1 -1
  35. package/min/omni/index.js.gz +0 -0
  36. package/min/omni/with-schemas/index.js +1 -1
  37. package/min/omni/with-schemas/index.js.gz +0 -0
  38. package/min/persisters/index.js +1 -1
  39. package/min/persisters/index.js.gz +0 -0
  40. package/min/persisters/persister-automerge/index.js +1 -1
  41. package/min/persisters/persister-automerge/index.js.gz +0 -0
  42. package/min/persisters/persister-automerge/with-schemas/index.js +1 -1
  43. package/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
  44. package/min/persisters/persister-browser/index.js +1 -1
  45. package/min/persisters/persister-browser/index.js.gz +0 -0
  46. package/min/persisters/persister-browser/with-schemas/index.js +1 -1
  47. package/min/persisters/persister-browser/with-schemas/index.js.gz +0 -0
  48. package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
  49. package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
  50. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
  51. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
  52. package/min/persisters/persister-durable-object-sql-storage/index.js +1 -1
  53. package/min/persisters/persister-durable-object-sql-storage/index.js.gz +0 -0
  54. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js +1 -1
  55. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js.gz +0 -0
  56. package/min/persisters/persister-durable-object-storage/index.js +1 -1
  57. package/min/persisters/persister-durable-object-storage/index.js.gz +0 -0
  58. package/min/persisters/persister-durable-object-storage/with-schemas/index.js +1 -1
  59. package/min/persisters/persister-durable-object-storage/with-schemas/index.js.gz +0 -0
  60. package/min/persisters/persister-electric-sql/index.js +1 -1
  61. package/min/persisters/persister-electric-sql/index.js.gz +0 -0
  62. package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
  63. package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
  64. package/min/persisters/persister-expo-sqlite/index.js +1 -1
  65. package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
  66. package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
  67. package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
  68. package/min/persisters/persister-file/index.js +1 -1
  69. package/min/persisters/persister-file/index.js.gz +0 -0
  70. package/min/persisters/persister-file/with-schemas/index.js +1 -1
  71. package/min/persisters/persister-file/with-schemas/index.js.gz +0 -0
  72. package/min/persisters/persister-indexed-db/index.js +1 -1
  73. package/min/persisters/persister-indexed-db/index.js.gz +0 -0
  74. package/min/persisters/persister-indexed-db/with-schemas/index.js +1 -1
  75. package/min/persisters/persister-indexed-db/with-schemas/index.js.gz +0 -0
  76. package/min/persisters/persister-libsql/index.js +1 -1
  77. package/min/persisters/persister-libsql/index.js.gz +0 -0
  78. package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
  79. package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
  80. package/min/persisters/persister-partykit-client/index.js +1 -1
  81. package/min/persisters/persister-partykit-client/index.js.gz +0 -0
  82. package/min/persisters/persister-partykit-client/with-schemas/index.js +1 -1
  83. package/min/persisters/persister-partykit-client/with-schemas/index.js.gz +0 -0
  84. package/min/persisters/persister-pglite/index.js +1 -1
  85. package/min/persisters/persister-pglite/index.js.gz +0 -0
  86. package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
  87. package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
  88. package/min/persisters/persister-postgres/index.js +1 -1
  89. package/min/persisters/persister-postgres/index.js.gz +0 -0
  90. package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
  91. package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
  92. package/min/persisters/persister-powersync/index.js +1 -1
  93. package/min/persisters/persister-powersync/index.js.gz +0 -0
  94. package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
  95. package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
  96. package/min/persisters/persister-react-native-mmkv/index.js +1 -1
  97. package/min/persisters/persister-react-native-mmkv/index.js.gz +0 -0
  98. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js +1 -1
  99. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js.gz +0 -0
  100. package/min/persisters/persister-react-native-sqlite/index.js +1 -1
  101. package/min/persisters/persister-react-native-sqlite/index.js.gz +0 -0
  102. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js +1 -1
  103. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js.gz +0 -0
  104. package/min/persisters/persister-remote/index.js +1 -1
  105. package/min/persisters/persister-remote/index.js.gz +0 -0
  106. package/min/persisters/persister-remote/with-schemas/index.js +1 -1
  107. package/min/persisters/persister-remote/with-schemas/index.js.gz +0 -0
  108. package/min/persisters/persister-sqlite-bun/index.js +1 -1
  109. package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
  110. package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -1
  111. package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
  112. package/min/persisters/persister-sqlite-wasm/index.js +1 -1
  113. package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
  114. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
  115. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
  116. package/min/persisters/persister-sqlite3/index.js +1 -1
  117. package/min/persisters/persister-sqlite3/index.js.gz +0 -0
  118. package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
  119. package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
  120. package/min/persisters/persister-yjs/index.js +1 -1
  121. package/min/persisters/persister-yjs/index.js.gz +0 -0
  122. package/min/persisters/persister-yjs/with-schemas/index.js +1 -1
  123. package/min/persisters/persister-yjs/with-schemas/index.js.gz +0 -0
  124. package/min/persisters/with-schemas/index.js +1 -1
  125. package/min/persisters/with-schemas/index.js.gz +0 -0
  126. package/min/queries/index.js +1 -1
  127. package/min/queries/index.js.gz +0 -0
  128. package/min/queries/with-schemas/index.js +1 -1
  129. package/min/queries/with-schemas/index.js.gz +0 -0
  130. package/min/relationships/index.js +1 -1
  131. package/min/relationships/index.js.gz +0 -0
  132. package/min/relationships/with-schemas/index.js +1 -1
  133. package/min/relationships/with-schemas/index.js.gz +0 -0
  134. package/min/store/index.js +1 -1
  135. package/min/store/index.js.gz +0 -0
  136. package/min/store/with-schemas/index.js +1 -1
  137. package/min/store/with-schemas/index.js.gz +0 -0
  138. package/min/synchronizers/index.js +1 -1
  139. package/min/synchronizers/index.js.gz +0 -0
  140. package/min/synchronizers/synchronizer-broadcast-channel/index.js +1 -1
  141. package/min/synchronizers/synchronizer-broadcast-channel/index.js.gz +0 -0
  142. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +1 -1
  143. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js.gz +0 -0
  144. package/min/synchronizers/synchronizer-local/index.js +1 -1
  145. package/min/synchronizers/synchronizer-local/index.js.gz +0 -0
  146. package/min/synchronizers/synchronizer-local/with-schemas/index.js +1 -1
  147. package/min/synchronizers/synchronizer-local/with-schemas/index.js.gz +0 -0
  148. package/min/synchronizers/synchronizer-ws-client/index.js +1 -1
  149. package/min/synchronizers/synchronizer-ws-client/index.js.gz +0 -0
  150. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js +1 -1
  151. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js.gz +0 -0
  152. package/min/synchronizers/synchronizer-ws-server/index.js +1 -1
  153. package/min/synchronizers/synchronizer-ws-server/index.js.gz +0 -0
  154. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js +1 -1
  155. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js.gz +0 -0
  156. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js +1 -1
  157. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js.gz +0 -0
  158. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +1 -1
  159. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js.gz +0 -0
  160. package/min/synchronizers/synchronizer-ws-server-simple/index.js +1 -1
  161. package/min/synchronizers/synchronizer-ws-server-simple/index.js.gz +0 -0
  162. package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +1 -1
  163. package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js.gz +0 -0
  164. package/min/synchronizers/with-schemas/index.js +1 -1
  165. package/min/synchronizers/with-schemas/index.js.gz +0 -0
  166. package/min/ui-react-inspector/index.js +1 -1
  167. package/min/ui-react-inspector/index.js.gz +0 -0
  168. package/min/ui-react-inspector/with-schemas/index.js +1 -1
  169. package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
  170. package/min/with-schemas/index.js +1 -1
  171. package/min/with-schemas/index.js.gz +0 -0
  172. package/omni/index.js +99 -64
  173. package/omni/with-schemas/index.js +99 -64
  174. package/package.json +3 -3
  175. package/persisters/index.js +19 -11
  176. package/persisters/persister-automerge/index.js +17 -9
  177. package/persisters/persister-automerge/with-schemas/index.js +17 -9
  178. package/persisters/persister-browser/index.js +17 -9
  179. package/persisters/persister-browser/with-schemas/index.js +17 -9
  180. package/persisters/persister-cr-sqlite-wasm/index.js +19 -11
  181. package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +19 -11
  182. package/persisters/persister-durable-object-sql-storage/index.js +19 -11
  183. package/persisters/persister-durable-object-sql-storage/with-schemas/index.js +19 -11
  184. package/persisters/persister-durable-object-storage/index.js +19 -11
  185. package/persisters/persister-durable-object-storage/with-schemas/index.js +19 -11
  186. package/persisters/persister-electric-sql/index.js +19 -11
  187. package/persisters/persister-electric-sql/with-schemas/index.js +19 -11
  188. package/persisters/persister-expo-sqlite/index.js +19 -11
  189. package/persisters/persister-expo-sqlite/with-schemas/index.js +19 -11
  190. package/persisters/persister-file/index.js +17 -9
  191. package/persisters/persister-file/with-schemas/index.js +17 -9
  192. package/persisters/persister-indexed-db/index.js +17 -9
  193. package/persisters/persister-indexed-db/with-schemas/index.js +17 -9
  194. package/persisters/persister-libsql/index.js +19 -11
  195. package/persisters/persister-libsql/with-schemas/index.js +19 -11
  196. package/persisters/persister-partykit-client/index.js +17 -9
  197. package/persisters/persister-partykit-client/with-schemas/index.js +17 -9
  198. package/persisters/persister-partykit-server/index.js +2 -2
  199. package/persisters/persister-partykit-server/with-schemas/index.js +2 -2
  200. package/persisters/persister-pglite/index.js +19 -11
  201. package/persisters/persister-pglite/with-schemas/index.js +19 -11
  202. package/persisters/persister-postgres/index.js +19 -11
  203. package/persisters/persister-postgres/with-schemas/index.js +19 -11
  204. package/persisters/persister-powersync/index.js +19 -11
  205. package/persisters/persister-powersync/with-schemas/index.js +19 -11
  206. package/persisters/persister-react-native-mmkv/index.js +17 -9
  207. package/persisters/persister-react-native-mmkv/with-schemas/index.js +17 -9
  208. package/persisters/persister-react-native-sqlite/index.js +19 -11
  209. package/persisters/persister-react-native-sqlite/with-schemas/index.js +19 -11
  210. package/persisters/persister-remote/index.js +17 -9
  211. package/persisters/persister-remote/with-schemas/index.js +17 -9
  212. package/persisters/persister-sqlite-bun/index.js +19 -11
  213. package/persisters/persister-sqlite-bun/with-schemas/index.js +19 -11
  214. package/persisters/persister-sqlite-wasm/index.js +19 -11
  215. package/persisters/persister-sqlite-wasm/with-schemas/index.js +19 -11
  216. package/persisters/persister-sqlite3/index.js +19 -11
  217. package/persisters/persister-sqlite3/with-schemas/index.js +19 -11
  218. package/persisters/persister-yjs/index.js +19 -11
  219. package/persisters/persister-yjs/with-schemas/index.js +19 -11
  220. package/persisters/with-schemas/index.js +19 -11
  221. package/queries/index.js +15 -14
  222. package/queries/with-schemas/index.js +15 -14
  223. package/readme.md +2 -2
  224. package/relationships/index.js +13 -12
  225. package/relationships/with-schemas/index.js +13 -12
  226. package/store/index.js +74 -60
  227. package/store/with-schemas/index.js +74 -60
  228. package/synchronizers/index.js +17 -9
  229. package/synchronizers/synchronizer-broadcast-channel/index.js +17 -9
  230. package/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +17 -9
  231. package/synchronizers/synchronizer-local/index.js +19 -11
  232. package/synchronizers/synchronizer-local/with-schemas/index.js +19 -11
  233. package/synchronizers/synchronizer-ws-client/index.js +17 -9
  234. package/synchronizers/synchronizer-ws-client/with-schemas/index.js +17 -9
  235. package/synchronizers/synchronizer-ws-server/index.js +20 -12
  236. package/synchronizers/synchronizer-ws-server/with-schemas/index.js +20 -12
  237. package/synchronizers/synchronizer-ws-server-durable-object/index.js +17 -9
  238. package/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +17 -9
  239. package/synchronizers/synchronizer-ws-server-simple/index.js +11 -10
  240. package/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +11 -10
  241. package/synchronizers/with-schemas/index.js +17 -9
  242. package/ui-react-inspector/index.js +81 -60
  243. package/ui-react-inspector/with-schemas/index.js +81 -60
  244. package/with-schemas/index.js +92 -64
@@ -92,22 +92,23 @@ const objEnsure = (obj, id, getDefaultValue) => {
92
92
  return obj[id];
93
93
  };
94
94
 
95
- const mapNew = (entries) => new Map(entries);
96
- const mapKeys = (map) => [...(map?.keys() ?? [])];
97
- const mapGet = (map, key) => map?.get(key);
98
- const mapForEach = (map, cb) =>
99
- collForEach(map, (value, key) => cb(key, value));
95
+ const map = Map;
96
+ const mapNew = (entries) => new map(entries);
97
+ const mapKeys = (map2) => [...(map2?.keys() ?? [])];
98
+ const mapGet = (map2, key) => map2?.get(key);
99
+ const mapForEach = (map2, cb) =>
100
+ collForEach(map2, (value, key) => cb(key, value));
100
101
  const mapMap = (coll, cb) =>
101
102
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
102
- const mapSet = (map, key, value) =>
103
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
104
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
105
- if (!collHas(map, key)) {
106
- mapSet(map, key, getDefaultValue());
103
+ const mapSet = (map2, key, value) =>
104
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
105
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
106
+ if (!collHas(map2, key)) {
107
+ mapSet(map2, key, getDefaultValue());
107
108
  } else {
108
- hadExistingValue?.(mapGet(map, key));
109
+ hadExistingValue?.(mapGet(map2, key));
109
110
  }
110
- return mapGet(map, key);
111
+ return mapGet(map2, key);
111
112
  };
112
113
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
113
114
  ifNotUndefined(
@@ -363,6 +364,11 @@ const createCustomPersister = (
363
364
  ? store.applyChanges
364
365
  : store.setContent)(contentOrChanges);
365
366
  };
367
+ const saveAfterMutated = async () => {
368
+ if (isAutoSaving() && store.hadMutated?.()) {
369
+ await save();
370
+ }
371
+ };
366
372
  const load = async (initialContent) => {
367
373
  /* istanbul ignore else */
368
374
  if (status != 2 /* Saving */) {
@@ -387,6 +393,7 @@ const createCustomPersister = (
387
393
  },
388
394
  );
389
395
  setStatus(0 /* Idle */);
396
+ await saveAfterMutated();
390
397
  });
391
398
  }
392
399
  return persister;
@@ -405,6 +412,7 @@ const createCustomPersister = (
405
412
  loads++;
406
413
  setContentOrChanges(changes ?? content);
407
414
  setStatus(0 /* Idle */);
415
+ await saveAfterMutated();
408
416
  }
409
417
  } else {
410
418
  await load();
@@ -92,22 +92,23 @@ const objEnsure = (obj, id, getDefaultValue) => {
92
92
  return obj[id];
93
93
  };
94
94
 
95
- const mapNew = (entries) => new Map(entries);
96
- const mapKeys = (map) => [...(map?.keys() ?? [])];
97
- const mapGet = (map, key) => map?.get(key);
98
- const mapForEach = (map, cb) =>
99
- collForEach(map, (value, key) => cb(key, value));
95
+ const map = Map;
96
+ const mapNew = (entries) => new map(entries);
97
+ const mapKeys = (map2) => [...(map2?.keys() ?? [])];
98
+ const mapGet = (map2, key) => map2?.get(key);
99
+ const mapForEach = (map2, cb) =>
100
+ collForEach(map2, (value, key) => cb(key, value));
100
101
  const mapMap = (coll, cb) =>
101
102
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
102
- const mapSet = (map, key, value) =>
103
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
104
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
105
- if (!collHas(map, key)) {
106
- mapSet(map, key, getDefaultValue());
103
+ const mapSet = (map2, key, value) =>
104
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
105
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
106
+ if (!collHas(map2, key)) {
107
+ mapSet(map2, key, getDefaultValue());
107
108
  } else {
108
- hadExistingValue?.(mapGet(map, key));
109
+ hadExistingValue?.(mapGet(map2, key));
109
110
  }
110
- return mapGet(map, key);
111
+ return mapGet(map2, key);
111
112
  };
112
113
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
113
114
  ifNotUndefined(
@@ -363,6 +364,11 @@ const createCustomPersister = (
363
364
  ? store.applyChanges
364
365
  : store.setContent)(contentOrChanges);
365
366
  };
367
+ const saveAfterMutated = async () => {
368
+ if (isAutoSaving() && store.hadMutated?.()) {
369
+ await save();
370
+ }
371
+ };
366
372
  const load = async (initialContent) => {
367
373
  /* istanbul ignore else */
368
374
  if (status != 2 /* Saving */) {
@@ -387,6 +393,7 @@ const createCustomPersister = (
387
393
  },
388
394
  );
389
395
  setStatus(0 /* Idle */);
396
+ await saveAfterMutated();
390
397
  });
391
398
  }
392
399
  return persister;
@@ -405,6 +412,7 @@ const createCustomPersister = (
405
412
  loads++;
406
413
  setContentOrChanges(changes ?? content);
407
414
  setStatus(0 /* Idle */);
415
+ await saveAfterMutated();
408
416
  }
409
417
  } else {
410
418
  await load();
@@ -119,17 +119,18 @@ const collIsEmpty = (coll) => isUndefined(coll) || collSize(coll) == 0;
119
119
  const collForEach = (coll, cb) => coll?.forEach(cb);
120
120
  const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
121
121
 
122
- const mapNew = (entries) => new Map(entries);
123
- const mapGet = (map, key) => map?.get(key);
124
- const mapSet = (map, key, value) =>
125
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
126
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
127
- if (!collHas(map, key)) {
128
- mapSet(map, key, getDefaultValue());
122
+ const map = Map;
123
+ const mapNew = (entries) => new map(entries);
124
+ const mapGet = (map2, key) => map2?.get(key);
125
+ const mapSet = (map2, key, value) =>
126
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
127
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
128
+ if (!collHas(map2, key)) {
129
+ mapSet(map2, key, getDefaultValue());
129
130
  } else {
130
- hadExistingValue?.(mapGet(map, key));
131
+ hadExistingValue?.(mapGet(map2, key));
131
132
  }
132
- return mapGet(map, key);
133
+ return mapGet(map2, key);
133
134
  };
134
135
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
135
136
  ifNotUndefined(
@@ -353,6 +354,11 @@ const createCustomPersister = (
353
354
  ? store.applyChanges
354
355
  : store.setContent)(contentOrChanges);
355
356
  };
357
+ const saveAfterMutated = async () => {
358
+ if (isAutoSaving() && store.hadMutated?.()) {
359
+ await save();
360
+ }
361
+ };
356
362
  const load = async (initialContent) => {
357
363
  /* istanbul ignore else */
358
364
  if (status != 2 /* Saving */) {
@@ -377,6 +383,7 @@ const createCustomPersister = (
377
383
  },
378
384
  );
379
385
  setStatus(0 /* Idle */);
386
+ await saveAfterMutated();
380
387
  });
381
388
  }
382
389
  return persister;
@@ -395,6 +402,7 @@ const createCustomPersister = (
395
402
  loads++;
396
403
  setContentOrChanges(changes ?? content);
397
404
  setStatus(0 /* Idle */);
405
+ await saveAfterMutated();
398
406
  }
399
407
  } else {
400
408
  await load();
@@ -119,17 +119,18 @@ const collIsEmpty = (coll) => isUndefined(coll) || collSize(coll) == 0;
119
119
  const collForEach = (coll, cb) => coll?.forEach(cb);
120
120
  const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
121
121
 
122
- const mapNew = (entries) => new Map(entries);
123
- const mapGet = (map, key) => map?.get(key);
124
- const mapSet = (map, key, value) =>
125
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
126
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
127
- if (!collHas(map, key)) {
128
- mapSet(map, key, getDefaultValue());
122
+ const map = Map;
123
+ const mapNew = (entries) => new map(entries);
124
+ const mapGet = (map2, key) => map2?.get(key);
125
+ const mapSet = (map2, key, value) =>
126
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
127
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
128
+ if (!collHas(map2, key)) {
129
+ mapSet(map2, key, getDefaultValue());
129
130
  } else {
130
- hadExistingValue?.(mapGet(map, key));
131
+ hadExistingValue?.(mapGet(map2, key));
131
132
  }
132
- return mapGet(map, key);
133
+ return mapGet(map2, key);
133
134
  };
134
135
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
135
136
  ifNotUndefined(
@@ -353,6 +354,11 @@ const createCustomPersister = (
353
354
  ? store.applyChanges
354
355
  : store.setContent)(contentOrChanges);
355
356
  };
357
+ const saveAfterMutated = async () => {
358
+ if (isAutoSaving() && store.hadMutated?.()) {
359
+ await save();
360
+ }
361
+ };
356
362
  const load = async (initialContent) => {
357
363
  /* istanbul ignore else */
358
364
  if (status != 2 /* Saving */) {
@@ -377,6 +383,7 @@ const createCustomPersister = (
377
383
  },
378
384
  );
379
385
  setStatus(0 /* Idle */);
386
+ await saveAfterMutated();
380
387
  });
381
388
  }
382
389
  return persister;
@@ -395,6 +402,7 @@ const createCustomPersister = (
395
402
  loads++;
396
403
  setContentOrChanges(changes ?? content);
397
404
  setStatus(0 /* Idle */);
405
+ await saveAfterMutated();
398
406
  }
399
407
  } else {
400
408
  await load();
@@ -19,17 +19,18 @@ const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
19
19
  const object = Object;
20
20
  const objFreeze = object.freeze;
21
21
 
22
- const mapNew = (entries) => new Map(entries);
23
- const mapGet = (map, key) => map?.get(key);
24
- const mapForEach = (map, cb) =>
25
- collForEach(map, (value, key) => cb(key, value));
26
- const mapSet = (map, key, value) =>
27
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
28
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
29
- if (!collHas(map, key)) {
30
- mapSet(map, key, getDefaultValue());
22
+ const map = Map;
23
+ const mapNew = (entries) => new map(entries);
24
+ const mapGet = (map2, key) => map2?.get(key);
25
+ const mapForEach = (map2, cb) =>
26
+ collForEach(map2, (value, key) => cb(key, value));
27
+ const mapSet = (map2, key, value) =>
28
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
29
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
30
+ if (!collHas(map2, key)) {
31
+ mapSet(map2, key, getDefaultValue());
31
32
  }
32
- return mapGet(map, key);
33
+ return mapGet(map2, key);
33
34
  };
34
35
 
35
36
  const MESSAGE_SEPARATOR = '\n';
@@ -19,17 +19,18 @@ const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
19
19
  const object = Object;
20
20
  const objFreeze = object.freeze;
21
21
 
22
- const mapNew = (entries) => new Map(entries);
23
- const mapGet = (map, key) => map?.get(key);
24
- const mapForEach = (map, cb) =>
25
- collForEach(map, (value, key) => cb(key, value));
26
- const mapSet = (map, key, value) =>
27
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
28
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
29
- if (!collHas(map, key)) {
30
- mapSet(map, key, getDefaultValue());
22
+ const map = Map;
23
+ const mapNew = (entries) => new map(entries);
24
+ const mapGet = (map2, key) => map2?.get(key);
25
+ const mapForEach = (map2, cb) =>
26
+ collForEach(map2, (value, key) => cb(key, value));
27
+ const mapSet = (map2, key, value) =>
28
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
29
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
30
+ if (!collHas(map2, key)) {
31
+ mapSet(map2, key, getDefaultValue());
31
32
  }
32
- return mapGet(map, key);
33
+ return mapGet(map2, key);
33
34
  };
34
35
 
35
36
  const MESSAGE_SEPARATOR = '\n';
@@ -75,17 +75,18 @@ const objEnsure = (obj, id, getDefaultValue) => {
75
75
  return obj[id];
76
76
  };
77
77
 
78
- const mapNew = (entries) => new Map(entries);
79
- const mapGet = (map, key) => map?.get(key);
80
- const mapSet = (map, key, value) =>
81
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
82
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
83
- if (!collHas(map, key)) {
84
- mapSet(map, key, getDefaultValue());
78
+ const map = Map;
79
+ const mapNew = (entries) => new map(entries);
80
+ const mapGet = (map2, key) => map2?.get(key);
81
+ const mapSet = (map2, key, value) =>
82
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
83
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
84
+ if (!collHas(map2, key)) {
85
+ mapSet(map2, key, getDefaultValue());
85
86
  } else {
86
- hadExistingValue?.(mapGet(map, key));
87
+ hadExistingValue?.(mapGet(map2, key));
87
88
  }
88
- return mapGet(map, key);
89
+ return mapGet(map2, key);
89
90
  };
90
91
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
91
92
  ifNotUndefined(
@@ -309,6 +310,11 @@ const createCustomPersister = (
309
310
  ? store.applyChanges
310
311
  : store.setContent)(contentOrChanges);
311
312
  };
313
+ const saveAfterMutated = async () => {
314
+ if (isAutoSaving() && store.hadMutated?.()) {
315
+ await save();
316
+ }
317
+ };
312
318
  const load = async (initialContent) => {
313
319
  /* istanbul ignore else */
314
320
  if (status != 2 /* Saving */) {
@@ -333,6 +339,7 @@ const createCustomPersister = (
333
339
  },
334
340
  );
335
341
  setStatus(0 /* Idle */);
342
+ await saveAfterMutated();
336
343
  });
337
344
  }
338
345
  return persister;
@@ -351,6 +358,7 @@ const createCustomPersister = (
351
358
  loads++;
352
359
  setContentOrChanges(changes ?? content);
353
360
  setStatus(0 /* Idle */);
361
+ await saveAfterMutated();
354
362
  }
355
363
  } else {
356
364
  await load();
@@ -236,31 +236,32 @@ const collClear = (coll) => coll.clear();
236
236
  const collForEach = (coll, cb) => coll?.forEach(cb);
237
237
  const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
238
238
 
239
- const mapNew = (entries) => new Map(entries);
240
- const mapKeys = (map) => [...(map?.keys() ?? [])];
241
- const mapGet = (map, key) => map?.get(key);
242
- const mapForEach = (map, cb) =>
243
- collForEach(map, (value, key) => cb(key, value));
239
+ const map = Map;
240
+ const mapNew = (entries) => new map(entries);
241
+ const mapKeys = (map2) => [...(map2?.keys() ?? [])];
242
+ const mapGet = (map2, key) => map2?.get(key);
243
+ const mapForEach = (map2, cb) =>
244
+ collForEach(map2, (value, key) => cb(key, value));
244
245
  const mapMap = (coll, cb) =>
245
246
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
246
- const mapSet = (map, key, value) =>
247
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
248
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
249
- if (!collHas(map, key)) {
250
- mapSet(map, key, getDefaultValue());
247
+ const mapSet = (map2, key, value) =>
248
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
249
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
250
+ if (!collHas(map2, key)) {
251
+ mapSet(map2, key, getDefaultValue());
251
252
  } else {
252
- hadExistingValue?.(mapGet(map, key));
253
+ hadExistingValue?.(mapGet(map2, key));
253
254
  }
254
- return mapGet(map, key);
255
+ return mapGet(map2, key);
255
256
  };
256
- const mapMatch = (map, obj, set, del = mapSet) => {
257
- objMap(obj, (value, id) => set(map, id, value));
258
- mapForEach(map, (id) => (objHas(obj, id) ? 0 : del(map, id)));
259
- return map;
257
+ const mapMatch = (map2, obj, set, del = mapSet) => {
258
+ objMap(obj, (value, id) => set(map2, id, value));
259
+ mapForEach(map2, (id) => (objHas(obj, id) ? 0 : del(map2, id)));
260
+ return map2;
260
261
  };
261
- const mapToObj = (map, valueMapper, excludeMapValue, excludeObjValue) => {
262
+ const mapToObj = (map2, valueMapper, excludeMapValue, excludeObjValue) => {
262
263
  const obj = {};
263
- collForEach(map, (mapValue, id) => {
264
+ collForEach(map2, (mapValue, id) => {
264
265
  if (!excludeMapValue?.(mapValue, id)) {
265
266
  const objValue = valueMapper ? valueMapper(mapValue, id) : mapValue;
266
267
  if (!excludeObjValue?.(objValue)) {
@@ -270,27 +271,27 @@ const mapToObj = (map, valueMapper, excludeMapValue, excludeObjValue) => {
270
271
  });
271
272
  return obj;
272
273
  };
273
- const mapToObj2 = (map, valueMapper, excludeMapValue) =>
274
+ const mapToObj2 = (map2, valueMapper, excludeMapValue) =>
274
275
  mapToObj(
275
- map,
276
+ map2,
276
277
  (childMap) => mapToObj(childMap, valueMapper, excludeMapValue),
277
278
  collIsEmpty,
278
279
  objIsEmpty,
279
280
  );
280
- const mapToObj3 = (map, valueMapper, excludeMapValue) =>
281
+ const mapToObj3 = (map2, valueMapper, excludeMapValue) =>
281
282
  mapToObj(
282
- map,
283
+ map2,
283
284
  (childMap) => mapToObj2(childMap, valueMapper, excludeMapValue),
284
285
  collIsEmpty,
285
286
  objIsEmpty,
286
287
  );
287
- const mapClone = (map, mapValue) => {
288
- const map2 = mapNew();
289
- collForEach(map, (value, key) => map2.set(key, mapValue?.(value) ?? value));
290
- return map2;
288
+ const mapClone = (map2, mapValue) => {
289
+ const map22 = mapNew();
290
+ collForEach(map2, (value, key) => map22.set(key, mapValue?.(value) ?? value));
291
+ return map22;
291
292
  };
292
- const mapClone2 = (map) => mapClone(map, mapClone);
293
- const mapClone3 = (map) => mapClone(map, mapClone2);
293
+ const mapClone2 = (map2) => mapClone(map2, mapClone);
294
+ const mapClone3 = (map2) => mapClone(map2, mapClone2);
294
295
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
295
296
  ifNotUndefined(
296
297
  (ensureLeaf ? mapEnsure : mapGet)(
@@ -491,6 +492,11 @@ const createCustomPersister = (
491
492
  ? store.applyChanges
492
493
  : store.setContent)(contentOrChanges);
493
494
  };
495
+ const saveAfterMutated = async () => {
496
+ if (isAutoSaving() && store.hadMutated?.()) {
497
+ await save();
498
+ }
499
+ };
494
500
  const load = async (initialContent) => {
495
501
  /* istanbul ignore else */
496
502
  if (status != 2 /* Saving */) {
@@ -515,6 +521,7 @@ const createCustomPersister = (
515
521
  },
516
522
  );
517
523
  setStatus(0 /* Idle */);
524
+ await saveAfterMutated();
518
525
  });
519
526
  }
520
527
  return persister;
@@ -533,6 +540,7 @@ const createCustomPersister = (
533
540
  loads++;
534
541
  setContentOrChanges(changes ?? content);
535
542
  setStatus(0 /* Idle */);
543
+ await saveAfterMutated();
536
544
  }
537
545
  } else {
538
546
  await load();
@@ -732,6 +740,7 @@ const createStore = () => {
732
740
  let hadValues = false;
733
741
  let transactions = 0;
734
742
  let internalListeners = [];
743
+ let mutating = 0;
735
744
  const changedTableIds = mapNew();
736
745
  const changedTableCellIds = mapNew();
737
746
  const changedRowCount = mapNew();
@@ -1136,13 +1145,13 @@ const createStore = () => {
1136
1145
  cellId,
1137
1146
  () => [oldCell, 0],
1138
1147
  )[1] = newCell;
1139
- internalListeners[3]?.(tableId, rowId, cellId, newCell);
1148
+ internalListeners[3]?.(tableId, rowId, cellId, newCell, mutating);
1140
1149
  };
1141
1150
  const valueIdsChanged = (valueId, addedOrRemoved) =>
1142
1151
  idsChanged(changedValueIds, valueId, addedOrRemoved);
1143
1152
  const valueChanged = (valueId, oldValue, newValue) => {
1144
1153
  mapEnsure(changedValues, valueId, () => [oldValue, 0])[1] = newValue;
1145
- internalListeners[4]?.(valueId, newValue);
1154
+ internalListeners[4]?.(valueId, newValue, mutating);
1146
1155
  };
1147
1156
  const cellInvalid = (tableId, rowId, cellId, invalidCell, defaultedCell) => {
1148
1157
  arrayPush(
@@ -1217,14 +1226,11 @@ const createStore = () => {
1217
1226
  }
1218
1227
  };
1219
1228
  const callTabularListenersForChanges = (mutator) => {
1220
- const hasTablesNow = hasTables();
1221
- if (hasTablesNow != hadTables) {
1222
- callListeners(hasTablesListeners[mutator], void 0, hasTablesNow);
1223
- }
1224
- const emptySortedRowIdListeners = collIsEmpty(
1229
+ const hasHasTablesListeners = !collIsEmpty(hasTablesListeners[mutator]);
1230
+ const hasSortedRowIdListeners = !collIsEmpty(
1225
1231
  sortedRowIdsListeners[mutator],
1226
1232
  );
1227
- const emptyIdAndHasListeners =
1233
+ const hasIdOrHasListeners = !(
1228
1234
  collIsEmpty(cellIdsListeners[mutator]) &&
1229
1235
  collIsEmpty(hasCellListeners[mutator]) &&
1230
1236
  collIsEmpty(rowIdsListeners[mutator]) &&
@@ -1232,15 +1238,17 @@ const createStore = () => {
1232
1238
  collIsEmpty(tableCellIdsListeners[mutator]) &&
1233
1239
  collIsEmpty(hasTableCellListeners[mutator]) &&
1234
1240
  collIsEmpty(rowCountListeners[mutator]) &&
1235
- emptySortedRowIdListeners &&
1241
+ !hasSortedRowIdListeners &&
1236
1242
  collIsEmpty(tableIdsListeners[mutator]) &&
1237
- collIsEmpty(hasTableListeners[mutator]);
1238
- const emptyOtherListeners =
1243
+ collIsEmpty(hasTableListeners[mutator])
1244
+ );
1245
+ const hasOtherListeners = !(
1239
1246
  collIsEmpty(cellListeners[mutator]) &&
1240
1247
  collIsEmpty(rowListeners[mutator]) &&
1241
1248
  collIsEmpty(tableListeners[mutator]) &&
1242
- collIsEmpty(tablesListeners[mutator]);
1243
- if (!emptyIdAndHasListeners || !emptyOtherListeners) {
1249
+ collIsEmpty(tablesListeners[mutator])
1250
+ );
1251
+ if (hasHasTablesListeners || hasIdOrHasListeners || hasOtherListeners) {
1244
1252
  const changes = mutator
1245
1253
  ? [
1246
1254
  mapClone(changedTableIds),
@@ -1248,7 +1256,9 @@ const createStore = () => {
1248
1256
  mapClone(changedRowCount),
1249
1257
  mapClone2(changedRowIds),
1250
1258
  mapClone3(changedCellIds),
1251
- mapClone3(changedCells),
1259
+ mapClone(changedCells, (map) =>
1260
+ mapClone(map, (map2) => mapClone(map2, pairClone)),
1261
+ ),
1252
1262
  ]
1253
1263
  : [
1254
1264
  changedTableIds,
@@ -1258,7 +1268,13 @@ const createStore = () => {
1258
1268
  changedCellIds,
1259
1269
  changedCells,
1260
1270
  ];
1261
- if (!emptyIdAndHasListeners) {
1271
+ if (hasHasTablesListeners) {
1272
+ const hasTablesNow = hasTables();
1273
+ if (hasTablesNow != hadTables) {
1274
+ callListeners(hasTablesListeners[mutator], void 0, hasTablesNow);
1275
+ }
1276
+ }
1277
+ if (hasIdOrHasListeners) {
1262
1278
  callIdsAndHasListenersIfChanged(
1263
1279
  changes[0],
1264
1280
  tableIdsListeners[mutator],
@@ -1290,13 +1306,13 @@ const createStore = () => {
1290
1306
  hasRowListeners[mutator],
1291
1307
  [tableId],
1292
1308
  ) &&
1293
- !emptySortedRowIdListeners
1309
+ hasSortedRowIdListeners
1294
1310
  ) {
1295
1311
  callListeners(sortedRowIdsListeners[mutator], [tableId, null]);
1296
1312
  setAdd(calledSortableTableIds, tableId);
1297
1313
  }
1298
1314
  });
1299
- if (!emptySortedRowIdListeners) {
1315
+ if (hasSortedRowIdListeners) {
1300
1316
  collForEach(changes[5], (rows, tableId) => {
1301
1317
  if (!collHas(calledSortableTableIds, tableId)) {
1302
1318
  const sortableCellIds = setNew();
@@ -1327,7 +1343,7 @@ const createStore = () => {
1327
1343
  ),
1328
1344
  );
1329
1345
  }
1330
- if (!emptyOtherListeners) {
1346
+ if (hasOtherListeners) {
1331
1347
  let tablesChanged;
1332
1348
  collForEach(changes[5], (rows, tableId) => {
1333
1349
  let tableChanged;
@@ -1364,28 +1380,31 @@ const createStore = () => {
1364
1380
  }
1365
1381
  };
1366
1382
  const callValuesListenersForChanges = (mutator) => {
1367
- const hasValuesNow = hasValues();
1368
- if (hasValuesNow != hadValues) {
1369
- callListeners(hasValuesListeners[mutator], void 0, hasValuesNow);
1370
- }
1371
- const emptyIdAndHasListeners =
1372
- collIsEmpty(valueIdsListeners[mutator]) &&
1373
- collIsEmpty(hasValueListeners[mutator]);
1374
- const emptyOtherListeners =
1375
- collIsEmpty(valueListeners[mutator]) &&
1376
- collIsEmpty(valuesListeners[mutator]);
1377
- if (!emptyIdAndHasListeners || !emptyOtherListeners) {
1383
+ const hasHasValuesListeners = !collIsEmpty(hasValuesListeners[mutator]);
1384
+ const hasIdOrHasListeners =
1385
+ !collIsEmpty(valueIdsListeners[mutator]) ||
1386
+ !collIsEmpty(hasValueListeners[mutator]);
1387
+ const hasOtherListeners =
1388
+ !collIsEmpty(valueListeners[mutator]) ||
1389
+ !collIsEmpty(valuesListeners[mutator]);
1390
+ if (hasHasValuesListeners || hasIdOrHasListeners || hasOtherListeners) {
1378
1391
  const changes = mutator
1379
- ? [mapClone(changedValueIds), mapClone(changedValues)]
1392
+ ? [mapClone(changedValueIds), mapClone(changedValues, pairClone)]
1380
1393
  : [changedValueIds, changedValues];
1381
- if (!emptyIdAndHasListeners) {
1394
+ if (hasHasValuesListeners) {
1395
+ const hasValuesNow = hasValues();
1396
+ if (hasValuesNow != hadValues) {
1397
+ callListeners(hasValuesListeners[mutator], void 0, hasValuesNow);
1398
+ }
1399
+ }
1400
+ if (hasIdOrHasListeners) {
1382
1401
  callIdsAndHasListenersIfChanged(
1383
1402
  changes[0],
1384
1403
  valueIdsListeners[mutator],
1385
1404
  hasValueListeners[mutator],
1386
1405
  );
1387
1406
  }
1388
- if (!emptyOtherListeners) {
1407
+ if (hasOtherListeners) {
1389
1408
  let valuesChanged;
1390
1409
  collForEach(changes[1], ([oldValue, newValue], valueId) => {
1391
1410
  if (newValue !== oldValue) {
@@ -1782,6 +1801,7 @@ const createStore = () => {
1782
1801
  transactions--;
1783
1802
  if (transactions == 0) {
1784
1803
  transactions = 1;
1804
+ mutating = 1;
1785
1805
  callInvalidCellListeners(1);
1786
1806
  if (!collIsEmpty(changedCells)) {
1787
1807
  callTabularListenersForChanges(1);
@@ -1790,6 +1810,7 @@ const createStore = () => {
1790
1810
  if (!collIsEmpty(changedValues)) {
1791
1811
  callValuesListenersForChanges(1);
1792
1812
  }
1813
+ mutating = 0;
1793
1814
  if (doRollback?.(store)) {
1794
1815
  collForEach(changedCells, (table, tableId) =>
1795
1816
  collForEach(table, (row, rowId) =>