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
@@ -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) =>
@@ -208,31 +208,32 @@ const objValidate = (obj, validateChild, onInvalidObj, emptyIsValid = 0) => {
208
208
  return emptyIsValid ? true : !objIsEmpty(obj);
209
209
  };
210
210
 
211
- const mapNew = (entries) => new Map(entries);
212
- const mapKeys = (map) => [...(map?.keys() ?? [])];
213
- const mapGet = (map, key) => map?.get(key);
214
- const mapForEach = (map, cb) =>
215
- collForEach(map, (value, key) => cb(key, value));
211
+ const map = Map;
212
+ const mapNew = (entries) => new map(entries);
213
+ const mapKeys = (map2) => [...(map2?.keys() ?? [])];
214
+ const mapGet = (map2, key) => map2?.get(key);
215
+ const mapForEach = (map2, cb) =>
216
+ collForEach(map2, (value, key) => cb(key, value));
216
217
  const mapMap = (coll, cb) =>
217
218
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
218
- const mapSet = (map, key, value) =>
219
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
220
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
221
- if (!collHas(map, key)) {
222
- mapSet(map, key, getDefaultValue());
219
+ const mapSet = (map2, key, value) =>
220
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
221
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
222
+ if (!collHas(map2, key)) {
223
+ mapSet(map2, key, getDefaultValue());
223
224
  } else {
224
- hadExistingValue?.(mapGet(map, key));
225
+ hadExistingValue?.(mapGet(map2, key));
225
226
  }
226
- return mapGet(map, key);
227
+ return mapGet(map2, key);
227
228
  };
228
- const mapMatch = (map, obj, set, del = mapSet) => {
229
- objMap(obj, (value, id) => set(map, id, value));
230
- mapForEach(map, (id) => (objHas(obj, id) ? 0 : del(map, id)));
231
- return map;
229
+ const mapMatch = (map2, obj, set, del = mapSet) => {
230
+ objMap(obj, (value, id) => set(map2, id, value));
231
+ mapForEach(map2, (id) => (objHas(obj, id) ? 0 : del(map2, id)));
232
+ return map2;
232
233
  };
233
- const mapToObj = (map, valueMapper, excludeMapValue, excludeObjValue) => {
234
+ const mapToObj = (map2, valueMapper, excludeMapValue, excludeObjValue) => {
234
235
  const obj = {};
235
- collForEach(map, (mapValue, id) => {
236
+ collForEach(map2, (mapValue, id) => {
236
237
  if (!excludeMapValue?.(mapValue, id)) {
237
238
  const objValue = valueMapper ? valueMapper(mapValue, id) : mapValue;
238
239
  if (!excludeObjValue?.(objValue)) {
@@ -242,27 +243,27 @@ const mapToObj = (map, valueMapper, excludeMapValue, excludeObjValue) => {
242
243
  });
243
244
  return obj;
244
245
  };
245
- const mapToObj2 = (map, valueMapper, excludeMapValue) =>
246
+ const mapToObj2 = (map2, valueMapper, excludeMapValue) =>
246
247
  mapToObj(
247
- map,
248
+ map2,
248
249
  (childMap) => mapToObj(childMap, valueMapper, excludeMapValue),
249
250
  collIsEmpty,
250
251
  objIsEmpty,
251
252
  );
252
- const mapToObj3 = (map, valueMapper, excludeMapValue) =>
253
+ const mapToObj3 = (map2, valueMapper, excludeMapValue) =>
253
254
  mapToObj(
254
- map,
255
+ map2,
255
256
  (childMap) => mapToObj2(childMap, valueMapper, excludeMapValue),
256
257
  collIsEmpty,
257
258
  objIsEmpty,
258
259
  );
259
- const mapClone = (map, mapValue) => {
260
- const map2 = mapNew();
261
- collForEach(map, (value, key) => map2.set(key, mapValue?.(value) ?? value));
262
- return map2;
260
+ const mapClone = (map2, mapValue) => {
261
+ const map22 = mapNew();
262
+ collForEach(map2, (value, key) => map22.set(key, mapValue?.(value) ?? value));
263
+ return map22;
263
264
  };
264
- const mapClone2 = (map) => mapClone(map, mapClone);
265
- const mapClone3 = (map) => mapClone(map, mapClone2);
265
+ const mapClone2 = (map2) => mapClone(map2, mapClone);
266
+ const mapClone3 = (map2) => mapClone(map2, mapClone2);
266
267
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
267
268
  ifNotUndefined(
268
269
  (ensureLeaf ? mapEnsure : mapGet)(
@@ -1218,6 +1219,7 @@ const createStore = () => {
1218
1219
  let hadValues = false;
1219
1220
  let transactions = 0;
1220
1221
  let internalListeners = [];
1222
+ let mutating = 0;
1221
1223
  const changedTableIds = mapNew();
1222
1224
  const changedTableCellIds = mapNew();
1223
1225
  const changedRowCount = mapNew();
@@ -1622,13 +1624,13 @@ const createStore = () => {
1622
1624
  cellId,
1623
1625
  () => [oldCell, 0],
1624
1626
  )[1] = newCell;
1625
- internalListeners[3]?.(tableId, rowId, cellId, newCell);
1627
+ internalListeners[3]?.(tableId, rowId, cellId, newCell, mutating);
1626
1628
  };
1627
1629
  const valueIdsChanged = (valueId, addedOrRemoved) =>
1628
1630
  idsChanged(changedValueIds, valueId, addedOrRemoved);
1629
1631
  const valueChanged = (valueId, oldValue, newValue) => {
1630
1632
  mapEnsure(changedValues, valueId, () => [oldValue, 0])[1] = newValue;
1631
- internalListeners[4]?.(valueId, newValue);
1633
+ internalListeners[4]?.(valueId, newValue, mutating);
1632
1634
  };
1633
1635
  const cellInvalid = (tableId, rowId, cellId, invalidCell, defaultedCell) => {
1634
1636
  arrayPush(
@@ -1703,14 +1705,11 @@ const createStore = () => {
1703
1705
  }
1704
1706
  };
1705
1707
  const callTabularListenersForChanges = (mutator) => {
1706
- const hasTablesNow = hasTables();
1707
- if (hasTablesNow != hadTables) {
1708
- callListeners(hasTablesListeners[mutator], void 0, hasTablesNow);
1709
- }
1710
- const emptySortedRowIdListeners = collIsEmpty(
1708
+ const hasHasTablesListeners = !collIsEmpty(hasTablesListeners[mutator]);
1709
+ const hasSortedRowIdListeners = !collIsEmpty(
1711
1710
  sortedRowIdsListeners[mutator],
1712
1711
  );
1713
- const emptyIdAndHasListeners =
1712
+ const hasIdOrHasListeners = !(
1714
1713
  collIsEmpty(cellIdsListeners[mutator]) &&
1715
1714
  collIsEmpty(hasCellListeners[mutator]) &&
1716
1715
  collIsEmpty(rowIdsListeners[mutator]) &&
@@ -1718,15 +1717,17 @@ const createStore = () => {
1718
1717
  collIsEmpty(tableCellIdsListeners[mutator]) &&
1719
1718
  collIsEmpty(hasTableCellListeners[mutator]) &&
1720
1719
  collIsEmpty(rowCountListeners[mutator]) &&
1721
- emptySortedRowIdListeners &&
1720
+ !hasSortedRowIdListeners &&
1722
1721
  collIsEmpty(tableIdsListeners[mutator]) &&
1723
- collIsEmpty(hasTableListeners[mutator]);
1724
- const emptyOtherListeners =
1722
+ collIsEmpty(hasTableListeners[mutator])
1723
+ );
1724
+ const hasOtherListeners = !(
1725
1725
  collIsEmpty(cellListeners[mutator]) &&
1726
1726
  collIsEmpty(rowListeners[mutator]) &&
1727
1727
  collIsEmpty(tableListeners[mutator]) &&
1728
- collIsEmpty(tablesListeners[mutator]);
1729
- if (!emptyIdAndHasListeners || !emptyOtherListeners) {
1728
+ collIsEmpty(tablesListeners[mutator])
1729
+ );
1730
+ if (hasHasTablesListeners || hasIdOrHasListeners || hasOtherListeners) {
1730
1731
  const changes = mutator
1731
1732
  ? [
1732
1733
  mapClone(changedTableIds),
@@ -1734,7 +1735,9 @@ const createStore = () => {
1734
1735
  mapClone(changedRowCount),
1735
1736
  mapClone2(changedRowIds),
1736
1737
  mapClone3(changedCellIds),
1737
- mapClone3(changedCells),
1738
+ mapClone(changedCells, (map) =>
1739
+ mapClone(map, (map2) => mapClone(map2, pairClone)),
1740
+ ),
1738
1741
  ]
1739
1742
  : [
1740
1743
  changedTableIds,
@@ -1744,7 +1747,13 @@ const createStore = () => {
1744
1747
  changedCellIds,
1745
1748
  changedCells,
1746
1749
  ];
1747
- if (!emptyIdAndHasListeners) {
1750
+ if (hasHasTablesListeners) {
1751
+ const hasTablesNow = hasTables();
1752
+ if (hasTablesNow != hadTables) {
1753
+ callListeners(hasTablesListeners[mutator], void 0, hasTablesNow);
1754
+ }
1755
+ }
1756
+ if (hasIdOrHasListeners) {
1748
1757
  callIdsAndHasListenersIfChanged(
1749
1758
  changes[0],
1750
1759
  tableIdsListeners[mutator],
@@ -1776,13 +1785,13 @@ const createStore = () => {
1776
1785
  hasRowListeners[mutator],
1777
1786
  [tableId],
1778
1787
  ) &&
1779
- !emptySortedRowIdListeners
1788
+ hasSortedRowIdListeners
1780
1789
  ) {
1781
1790
  callListeners(sortedRowIdsListeners[mutator], [tableId, null]);
1782
1791
  setAdd(calledSortableTableIds, tableId);
1783
1792
  }
1784
1793
  });
1785
- if (!emptySortedRowIdListeners) {
1794
+ if (hasSortedRowIdListeners) {
1786
1795
  collForEach(changes[5], (rows, tableId) => {
1787
1796
  if (!collHas(calledSortableTableIds, tableId)) {
1788
1797
  const sortableCellIds = setNew();
@@ -1813,7 +1822,7 @@ const createStore = () => {
1813
1822
  ),
1814
1823
  );
1815
1824
  }
1816
- if (!emptyOtherListeners) {
1825
+ if (hasOtherListeners) {
1817
1826
  let tablesChanged;
1818
1827
  collForEach(changes[5], (rows, tableId) => {
1819
1828
  let tableChanged;
@@ -1850,28 +1859,31 @@ const createStore = () => {
1850
1859
  }
1851
1860
  };
1852
1861
  const callValuesListenersForChanges = (mutator) => {
1853
- const hasValuesNow = hasValues();
1854
- if (hasValuesNow != hadValues) {
1855
- callListeners(hasValuesListeners[mutator], void 0, hasValuesNow);
1856
- }
1857
- const emptyIdAndHasListeners =
1858
- collIsEmpty(valueIdsListeners[mutator]) &&
1859
- collIsEmpty(hasValueListeners[mutator]);
1860
- const emptyOtherListeners =
1861
- collIsEmpty(valueListeners[mutator]) &&
1862
- collIsEmpty(valuesListeners[mutator]);
1863
- if (!emptyIdAndHasListeners || !emptyOtherListeners) {
1862
+ const hasHasValuesListeners = !collIsEmpty(hasValuesListeners[mutator]);
1863
+ const hasIdOrHasListeners =
1864
+ !collIsEmpty(valueIdsListeners[mutator]) ||
1865
+ !collIsEmpty(hasValueListeners[mutator]);
1866
+ const hasOtherListeners =
1867
+ !collIsEmpty(valueListeners[mutator]) ||
1868
+ !collIsEmpty(valuesListeners[mutator]);
1869
+ if (hasHasValuesListeners || hasIdOrHasListeners || hasOtherListeners) {
1864
1870
  const changes = mutator
1865
- ? [mapClone(changedValueIds), mapClone(changedValues)]
1871
+ ? [mapClone(changedValueIds), mapClone(changedValues, pairClone)]
1866
1872
  : [changedValueIds, changedValues];
1867
- if (!emptyIdAndHasListeners) {
1873
+ if (hasHasValuesListeners) {
1874
+ const hasValuesNow = hasValues();
1875
+ if (hasValuesNow != hadValues) {
1876
+ callListeners(hasValuesListeners[mutator], void 0, hasValuesNow);
1877
+ }
1878
+ }
1879
+ if (hasIdOrHasListeners) {
1868
1880
  callIdsAndHasListenersIfChanged(
1869
1881
  changes[0],
1870
1882
  valueIdsListeners[mutator],
1871
1883
  hasValueListeners[mutator],
1872
1884
  );
1873
1885
  }
1874
- if (!emptyOtherListeners) {
1886
+ if (hasOtherListeners) {
1875
1887
  let valuesChanged;
1876
1888
  collForEach(changes[1], ([oldValue, newValue], valueId) => {
1877
1889
  if (newValue !== oldValue) {
@@ -2268,6 +2280,7 @@ const createStore = () => {
2268
2280
  transactions--;
2269
2281
  if (transactions == 0) {
2270
2282
  transactions = 1;
2283
+ mutating = 1;
2271
2284
  callInvalidCellListeners(1);
2272
2285
  if (!collIsEmpty(changedCells)) {
2273
2286
  callTabularListenersForChanges(1);
@@ -2276,6 +2289,7 @@ const createStore = () => {
2276
2289
  if (!collIsEmpty(changedValues)) {
2277
2290
  callValuesListenersForChanges(1);
2278
2291
  }
2292
+ mutating = 0;
2279
2293
  if (doRollback?.(store)) {
2280
2294
  collForEach(changedCells, (table, tableId) =>
2281
2295
  collForEach(table, (row, rowId) =>
@@ -2642,6 +2656,7 @@ const createMergeableStore = (uniqueId, getNow) => {
2642
2656
  let listeningToRawStoreChanges = 1;
2643
2657
  let contentStampMap = newContentStampMap();
2644
2658
  let defaultingContent = 0;
2659
+ let mutated = 0;
2645
2660
  const touchedCells = mapNew();
2646
2661
  const touchedValues = setNew();
2647
2662
  const [getNextHlc, seenHlc] = getHlcFunctions(uniqueId, getNow);
@@ -2768,12 +2783,15 @@ const createMergeableStore = (uniqueId, getNow) => {
2768
2783
  collClear(touchedCells);
2769
2784
  collClear(touchedValues);
2770
2785
  };
2771
- const cellChanged = (tableId, rowId, cellId, newCell) => {
2786
+ const cellChanged = (tableId, rowId, cellId, newCell, mutating) => {
2772
2787
  setAdd(
2773
2788
  mapEnsure(mapEnsure(touchedCells, tableId, mapNew), rowId, setNew),
2774
2789
  cellId,
2775
2790
  );
2776
- if (listeningToRawStoreChanges) {
2791
+ if (listeningToRawStoreChanges || mutating) {
2792
+ if (mutating) {
2793
+ mutated = 1;
2794
+ }
2777
2795
  mergeContentOrChanges([
2778
2796
  [
2779
2797
  {
@@ -2796,9 +2814,12 @@ const createMergeableStore = (uniqueId, getNow) => {
2796
2814
  ]);
2797
2815
  }
2798
2816
  };
2799
- const valueChanged = (valueId, newValue) => {
2817
+ const valueChanged = (valueId, newValue, mutating) => {
2800
2818
  setAdd(touchedValues, valueId);
2801
- if (listeningToRawStoreChanges) {
2819
+ if (listeningToRawStoreChanges || mutating) {
2820
+ if (mutating) {
2821
+ mutated = 1;
2822
+ }
2802
2823
  mergeContentOrChanges([
2803
2824
  [{}],
2804
2825
  [
@@ -3016,6 +3037,11 @@ const createMergeableStore = (uniqueId, getNow) => {
3016
3037
  mergeableStore2.applyMergeableChanges(mergeableChanges);
3017
3038
  return applyMergeableChanges(mergeableChanges2);
3018
3039
  };
3040
+ const hadMutated = () => {
3041
+ const result = mutated;
3042
+ mutated = 0;
3043
+ return result;
3044
+ };
3019
3045
  const mergeableStore = {
3020
3046
  getMergeableContent,
3021
3047
  getMergeableContentHashes,
@@ -3032,6 +3058,8 @@ const createMergeableStore = (uniqueId, getNow) => {
3032
3058
  getTransactionMergeableChanges,
3033
3059
  applyMergeableChanges,
3034
3060
  merge,
3061
+ // only used internally by other modules
3062
+ hadMutated,
3035
3063
  };
3036
3064
  store.setInternalListeners(
3037
3065
  preStartTransaction,