tinybase 7.3.2 → 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 (249) 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-partykit-server/index.js +1 -1
  85. package/min/persisters/persister-partykit-server/index.js.gz +0 -0
  86. package/min/persisters/persister-partykit-server/with-schemas/index.js +1 -1
  87. package/min/persisters/persister-partykit-server/with-schemas/index.js.gz +0 -0
  88. package/min/persisters/persister-pglite/index.js +1 -1
  89. package/min/persisters/persister-pglite/index.js.gz +0 -0
  90. package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
  91. package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
  92. package/min/persisters/persister-postgres/index.js +1 -1
  93. package/min/persisters/persister-postgres/index.js.gz +0 -0
  94. package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
  95. package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
  96. package/min/persisters/persister-powersync/index.js +1 -1
  97. package/min/persisters/persister-powersync/index.js.gz +0 -0
  98. package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
  99. package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
  100. package/min/persisters/persister-react-native-mmkv/index.js +1 -1
  101. package/min/persisters/persister-react-native-mmkv/index.js.gz +0 -0
  102. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js +1 -1
  103. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js.gz +0 -0
  104. package/min/persisters/persister-react-native-sqlite/index.js +1 -1
  105. package/min/persisters/persister-react-native-sqlite/index.js.gz +0 -0
  106. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js +1 -1
  107. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js.gz +0 -0
  108. package/min/persisters/persister-remote/index.js +1 -1
  109. package/min/persisters/persister-remote/index.js.gz +0 -0
  110. package/min/persisters/persister-remote/with-schemas/index.js +1 -1
  111. package/min/persisters/persister-remote/with-schemas/index.js.gz +0 -0
  112. package/min/persisters/persister-sqlite-bun/index.js +1 -1
  113. package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
  114. package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -1
  115. package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
  116. package/min/persisters/persister-sqlite-wasm/index.js +1 -1
  117. package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
  118. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
  119. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
  120. package/min/persisters/persister-sqlite3/index.js +1 -1
  121. package/min/persisters/persister-sqlite3/index.js.gz +0 -0
  122. package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
  123. package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
  124. package/min/persisters/persister-yjs/index.js +1 -1
  125. package/min/persisters/persister-yjs/index.js.gz +0 -0
  126. package/min/persisters/persister-yjs/with-schemas/index.js +1 -1
  127. package/min/persisters/persister-yjs/with-schemas/index.js.gz +0 -0
  128. package/min/persisters/with-schemas/index.js +1 -1
  129. package/min/persisters/with-schemas/index.js.gz +0 -0
  130. package/min/queries/index.js +1 -1
  131. package/min/queries/index.js.gz +0 -0
  132. package/min/queries/with-schemas/index.js +1 -1
  133. package/min/queries/with-schemas/index.js.gz +0 -0
  134. package/min/relationships/index.js +1 -1
  135. package/min/relationships/index.js.gz +0 -0
  136. package/min/relationships/with-schemas/index.js +1 -1
  137. package/min/relationships/with-schemas/index.js.gz +0 -0
  138. package/min/store/index.js +1 -1
  139. package/min/store/index.js.gz +0 -0
  140. package/min/store/with-schemas/index.js +1 -1
  141. package/min/store/with-schemas/index.js.gz +0 -0
  142. package/min/synchronizers/index.js +1 -1
  143. package/min/synchronizers/index.js.gz +0 -0
  144. package/min/synchronizers/synchronizer-broadcast-channel/index.js +1 -1
  145. package/min/synchronizers/synchronizer-broadcast-channel/index.js.gz +0 -0
  146. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +1 -1
  147. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js.gz +0 -0
  148. package/min/synchronizers/synchronizer-local/index.js +1 -1
  149. package/min/synchronizers/synchronizer-local/index.js.gz +0 -0
  150. package/min/synchronizers/synchronizer-local/with-schemas/index.js +1 -1
  151. package/min/synchronizers/synchronizer-local/with-schemas/index.js.gz +0 -0
  152. package/min/synchronizers/synchronizer-ws-client/index.js +1 -1
  153. package/min/synchronizers/synchronizer-ws-client/index.js.gz +0 -0
  154. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js +1 -1
  155. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js.gz +0 -0
  156. package/min/synchronizers/synchronizer-ws-server/index.js +1 -1
  157. package/min/synchronizers/synchronizer-ws-server/index.js.gz +0 -0
  158. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js +1 -1
  159. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js.gz +0 -0
  160. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js +1 -1
  161. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js.gz +0 -0
  162. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +1 -1
  163. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js.gz +0 -0
  164. package/min/synchronizers/synchronizer-ws-server-simple/index.js +1 -1
  165. package/min/synchronizers/synchronizer-ws-server-simple/index.js.gz +0 -0
  166. package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +1 -1
  167. package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js.gz +0 -0
  168. package/min/synchronizers/with-schemas/index.js +1 -1
  169. package/min/synchronizers/with-schemas/index.js.gz +0 -0
  170. package/min/ui-react-inspector/index.js +1 -1
  171. package/min/ui-react-inspector/index.js.gz +0 -0
  172. package/min/ui-react-inspector/with-schemas/index.js +1 -1
  173. package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
  174. package/min/with-schemas/index.js +1 -1
  175. package/min/with-schemas/index.js.gz +0 -0
  176. package/omni/index.js +115 -67
  177. package/omni/with-schemas/index.js +115 -67
  178. package/package.json +13 -13
  179. package/persisters/index.js +29 -12
  180. package/persisters/persister-automerge/index.js +17 -9
  181. package/persisters/persister-automerge/with-schemas/index.js +17 -9
  182. package/persisters/persister-browser/index.js +34 -10
  183. package/persisters/persister-browser/with-schemas/index.js +34 -10
  184. package/persisters/persister-cr-sqlite-wasm/index.js +29 -12
  185. package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +29 -12
  186. package/persisters/persister-durable-object-sql-storage/index.js +29 -12
  187. package/persisters/persister-durable-object-sql-storage/with-schemas/index.js +29 -12
  188. package/persisters/persister-durable-object-storage/index.js +19 -11
  189. package/persisters/persister-durable-object-storage/with-schemas/index.js +19 -11
  190. package/persisters/persister-electric-sql/index.js +29 -12
  191. package/persisters/persister-electric-sql/with-schemas/index.js +29 -12
  192. package/persisters/persister-expo-sqlite/index.js +29 -12
  193. package/persisters/persister-expo-sqlite/with-schemas/index.js +29 -12
  194. package/persisters/persister-file/index.js +34 -10
  195. package/persisters/persister-file/with-schemas/index.js +34 -10
  196. package/persisters/persister-indexed-db/index.js +17 -9
  197. package/persisters/persister-indexed-db/with-schemas/index.js +17 -9
  198. package/persisters/persister-libsql/index.js +29 -12
  199. package/persisters/persister-libsql/with-schemas/index.js +29 -12
  200. package/persisters/persister-partykit-client/index.js +44 -11
  201. package/persisters/persister-partykit-client/with-schemas/index.js +44 -11
  202. package/persisters/persister-partykit-server/index.js +39 -4
  203. package/persisters/persister-partykit-server/with-schemas/index.js +39 -4
  204. package/persisters/persister-pglite/index.js +29 -12
  205. package/persisters/persister-pglite/with-schemas/index.js +29 -12
  206. package/persisters/persister-postgres/index.js +29 -12
  207. package/persisters/persister-postgres/with-schemas/index.js +29 -12
  208. package/persisters/persister-powersync/index.js +29 -12
  209. package/persisters/persister-powersync/with-schemas/index.js +29 -12
  210. package/persisters/persister-react-native-mmkv/index.js +17 -9
  211. package/persisters/persister-react-native-mmkv/with-schemas/index.js +17 -9
  212. package/persisters/persister-react-native-sqlite/index.js +29 -12
  213. package/persisters/persister-react-native-sqlite/with-schemas/index.js +29 -12
  214. package/persisters/persister-remote/index.js +17 -9
  215. package/persisters/persister-remote/with-schemas/index.js +17 -9
  216. package/persisters/persister-sqlite-bun/index.js +29 -12
  217. package/persisters/persister-sqlite-bun/with-schemas/index.js +29 -12
  218. package/persisters/persister-sqlite-wasm/index.js +29 -12
  219. package/persisters/persister-sqlite-wasm/with-schemas/index.js +29 -12
  220. package/persisters/persister-sqlite3/index.js +29 -12
  221. package/persisters/persister-sqlite3/with-schemas/index.js +29 -12
  222. package/persisters/persister-yjs/index.js +19 -11
  223. package/persisters/persister-yjs/with-schemas/index.js +19 -11
  224. package/persisters/with-schemas/index.js +29 -12
  225. package/queries/index.js +15 -14
  226. package/queries/with-schemas/index.js +15 -14
  227. package/readme.md +10 -2
  228. package/relationships/index.js +13 -12
  229. package/relationships/with-schemas/index.js +13 -12
  230. package/releases.md +1 -1
  231. package/store/index.js +74 -60
  232. package/store/with-schemas/index.js +74 -60
  233. package/synchronizers/index.js +17 -9
  234. package/synchronizers/synchronizer-broadcast-channel/index.js +17 -9
  235. package/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +17 -9
  236. package/synchronizers/synchronizer-local/index.js +19 -11
  237. package/synchronizers/synchronizer-local/with-schemas/index.js +19 -11
  238. package/synchronizers/synchronizer-ws-client/index.js +31 -10
  239. package/synchronizers/synchronizer-ws-client/with-schemas/index.js +31 -10
  240. package/synchronizers/synchronizer-ws-server/index.js +34 -13
  241. package/synchronizers/synchronizer-ws-server/with-schemas/index.js +34 -13
  242. package/synchronizers/synchronizer-ws-server-durable-object/index.js +31 -10
  243. package/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +31 -10
  244. package/synchronizers/synchronizer-ws-server-simple/index.js +11 -10
  245. package/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +11 -10
  246. package/synchronizers/with-schemas/index.js +17 -9
  247. package/ui-react-inspector/index.js +91 -61
  248. package/ui-react-inspector/with-schemas/index.js +91 -61
  249. package/with-schemas/index.js +92 -64
@@ -67,6 +67,10 @@ const objNew = (entries = []) => object.fromEntries(entries);
67
67
  const objHas = (obj, id) => id in obj;
68
68
  const objForEach = (obj, cb) =>
69
69
  arrayForEach(objEntries(obj), ([id, value]) => cb(value, id));
70
+ const objToArray = (obj, cb) =>
71
+ arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
72
+ const objMap = (obj, cb) =>
73
+ objNew(objToArray(obj, (value, id) => [id, cb(value, id)]));
70
74
  const objValues = (obj) => object.values(obj);
71
75
  const objSize = (obj) => size(objIds(obj));
72
76
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
@@ -82,7 +86,16 @@ const jsonParse = JSON.parse;
82
86
  const jsonStringWithUndefined = (obj) =>
83
87
  jsonString(obj, (_key, value) => (isUndefined(value) ? UNDEFINED : value));
84
88
  const jsonParseWithUndefined = (str) =>
85
- jsonParse(str, (_key, value) => (value === UNDEFINED ? void 0 : value));
89
+ // JSON.parse reviver removes properties with undefined values
90
+ replaceUndefinedString(jsonParse(str));
91
+ const replaceUndefinedString = (obj) =>
92
+ obj === UNDEFINED
93
+ ? void 0
94
+ : isArray(obj)
95
+ ? arrayMap(obj, replaceUndefinedString)
96
+ : isObject(obj)
97
+ ? objMap(obj, replaceUndefinedString)
98
+ : obj;
86
99
 
87
100
  const MESSAGE_SEPARATOR = '\n';
88
101
  const ifPayloadValid = (payload, then) => {
@@ -106,17 +119,18 @@ const collIsEmpty = (coll) => isUndefined(coll) || collSize(coll) == 0;
106
119
  const collForEach = (coll, cb) => coll?.forEach(cb);
107
120
  const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
108
121
 
109
- const mapNew = (entries) => new Map(entries);
110
- const mapGet = (map, key) => map?.get(key);
111
- const mapSet = (map, key, value) =>
112
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
113
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
114
- if (!collHas(map, key)) {
115
- 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());
116
130
  } else {
117
- hadExistingValue?.(mapGet(map, key));
131
+ hadExistingValue?.(mapGet(map2, key));
118
132
  }
119
- return mapGet(map, key);
133
+ return mapGet(map2, key);
120
134
  };
121
135
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
122
136
  ifNotUndefined(
@@ -340,6 +354,11 @@ const createCustomPersister = (
340
354
  ? store.applyChanges
341
355
  : store.setContent)(contentOrChanges);
342
356
  };
357
+ const saveAfterMutated = async () => {
358
+ if (isAutoSaving() && store.hadMutated?.()) {
359
+ await save();
360
+ }
361
+ };
343
362
  const load = async (initialContent) => {
344
363
  /* istanbul ignore else */
345
364
  if (status != 2 /* Saving */) {
@@ -364,6 +383,7 @@ const createCustomPersister = (
364
383
  },
365
384
  );
366
385
  setStatus(0 /* Idle */);
386
+ await saveAfterMutated();
367
387
  });
368
388
  }
369
389
  return persister;
@@ -382,6 +402,7 @@ const createCustomPersister = (
382
402
  loads++;
383
403
  setContentOrChanges(changes ?? content);
384
404
  setStatus(0 /* Idle */);
405
+ await saveAfterMutated();
385
406
  }
386
407
  } else {
387
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();
@@ -212,7 +212,16 @@ const jsonStringWithMap = (obj) =>
212
212
  const jsonStringWithUndefined = (obj) =>
213
213
  jsonString(obj, (_key, value) => (isUndefined(value) ? UNDEFINED : value));
214
214
  const jsonParseWithUndefined = (str) =>
215
- jsonParse(str, (_key, value) => (value === UNDEFINED ? void 0 : value));
215
+ // JSON.parse reviver removes properties with undefined values
216
+ replaceUndefinedString(jsonParse(str));
217
+ const replaceUndefinedString = (obj) =>
218
+ obj === UNDEFINED
219
+ ? void 0
220
+ : isArray(obj)
221
+ ? arrayMap(obj, replaceUndefinedString)
222
+ : isObject(obj)
223
+ ? objMap(obj, replaceUndefinedString)
224
+ : obj;
216
225
 
217
226
  const collSizeN = (collSizer) => (coll) =>
218
227
  arrayReduce(collValues(coll), (total, coll2) => total + collSizer(coll2), 0);
@@ -227,31 +236,32 @@ const collClear = (coll) => coll.clear();
227
236
  const collForEach = (coll, cb) => coll?.forEach(cb);
228
237
  const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
229
238
 
230
- const mapNew = (entries) => new Map(entries);
231
- const mapKeys = (map) => [...(map?.keys() ?? [])];
232
- const mapGet = (map, key) => map?.get(key);
233
- const mapForEach = (map, cb) =>
234
- 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));
235
245
  const mapMap = (coll, cb) =>
236
246
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
237
- const mapSet = (map, key, value) =>
238
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
239
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
240
- if (!collHas(map, key)) {
241
- 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());
242
252
  } else {
243
- hadExistingValue?.(mapGet(map, key));
253
+ hadExistingValue?.(mapGet(map2, key));
244
254
  }
245
- return mapGet(map, key);
255
+ return mapGet(map2, key);
246
256
  };
247
- const mapMatch = (map, obj, set, del = mapSet) => {
248
- objMap(obj, (value, id) => set(map, id, value));
249
- mapForEach(map, (id) => (objHas(obj, id) ? 0 : del(map, id)));
250
- 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;
251
261
  };
252
- const mapToObj = (map, valueMapper, excludeMapValue, excludeObjValue) => {
262
+ const mapToObj = (map2, valueMapper, excludeMapValue, excludeObjValue) => {
253
263
  const obj = {};
254
- collForEach(map, (mapValue, id) => {
264
+ collForEach(map2, (mapValue, id) => {
255
265
  if (!excludeMapValue?.(mapValue, id)) {
256
266
  const objValue = valueMapper ? valueMapper(mapValue, id) : mapValue;
257
267
  if (!excludeObjValue?.(objValue)) {
@@ -261,27 +271,27 @@ const mapToObj = (map, valueMapper, excludeMapValue, excludeObjValue) => {
261
271
  });
262
272
  return obj;
263
273
  };
264
- const mapToObj2 = (map, valueMapper, excludeMapValue) =>
274
+ const mapToObj2 = (map2, valueMapper, excludeMapValue) =>
265
275
  mapToObj(
266
- map,
276
+ map2,
267
277
  (childMap) => mapToObj(childMap, valueMapper, excludeMapValue),
268
278
  collIsEmpty,
269
279
  objIsEmpty,
270
280
  );
271
- const mapToObj3 = (map, valueMapper, excludeMapValue) =>
281
+ const mapToObj3 = (map2, valueMapper, excludeMapValue) =>
272
282
  mapToObj(
273
- map,
283
+ map2,
274
284
  (childMap) => mapToObj2(childMap, valueMapper, excludeMapValue),
275
285
  collIsEmpty,
276
286
  objIsEmpty,
277
287
  );
278
- const mapClone = (map, mapValue) => {
279
- const map2 = mapNew();
280
- collForEach(map, (value, key) => map2.set(key, mapValue?.(value) ?? value));
281
- 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;
282
292
  };
283
- const mapClone2 = (map) => mapClone(map, mapClone);
284
- const mapClone3 = (map) => mapClone(map, mapClone2);
293
+ const mapClone2 = (map2) => mapClone(map2, mapClone);
294
+ const mapClone3 = (map2) => mapClone(map2, mapClone2);
285
295
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
286
296
  ifNotUndefined(
287
297
  (ensureLeaf ? mapEnsure : mapGet)(
@@ -482,6 +492,11 @@ const createCustomPersister = (
482
492
  ? store.applyChanges
483
493
  : store.setContent)(contentOrChanges);
484
494
  };
495
+ const saveAfterMutated = async () => {
496
+ if (isAutoSaving() && store.hadMutated?.()) {
497
+ await save();
498
+ }
499
+ };
485
500
  const load = async (initialContent) => {
486
501
  /* istanbul ignore else */
487
502
  if (status != 2 /* Saving */) {
@@ -506,6 +521,7 @@ const createCustomPersister = (
506
521
  },
507
522
  );
508
523
  setStatus(0 /* Idle */);
524
+ await saveAfterMutated();
509
525
  });
510
526
  }
511
527
  return persister;
@@ -524,6 +540,7 @@ const createCustomPersister = (
524
540
  loads++;
525
541
  setContentOrChanges(changes ?? content);
526
542
  setStatus(0 /* Idle */);
543
+ await saveAfterMutated();
527
544
  }
528
545
  } else {
529
546
  await load();
@@ -723,6 +740,7 @@ const createStore = () => {
723
740
  let hadValues = false;
724
741
  let transactions = 0;
725
742
  let internalListeners = [];
743
+ let mutating = 0;
726
744
  const changedTableIds = mapNew();
727
745
  const changedTableCellIds = mapNew();
728
746
  const changedRowCount = mapNew();
@@ -1127,13 +1145,13 @@ const createStore = () => {
1127
1145
  cellId,
1128
1146
  () => [oldCell, 0],
1129
1147
  )[1] = newCell;
1130
- internalListeners[3]?.(tableId, rowId, cellId, newCell);
1148
+ internalListeners[3]?.(tableId, rowId, cellId, newCell, mutating);
1131
1149
  };
1132
1150
  const valueIdsChanged = (valueId, addedOrRemoved) =>
1133
1151
  idsChanged(changedValueIds, valueId, addedOrRemoved);
1134
1152
  const valueChanged = (valueId, oldValue, newValue) => {
1135
1153
  mapEnsure(changedValues, valueId, () => [oldValue, 0])[1] = newValue;
1136
- internalListeners[4]?.(valueId, newValue);
1154
+ internalListeners[4]?.(valueId, newValue, mutating);
1137
1155
  };
1138
1156
  const cellInvalid = (tableId, rowId, cellId, invalidCell, defaultedCell) => {
1139
1157
  arrayPush(
@@ -1208,14 +1226,11 @@ const createStore = () => {
1208
1226
  }
1209
1227
  };
1210
1228
  const callTabularListenersForChanges = (mutator) => {
1211
- const hasTablesNow = hasTables();
1212
- if (hasTablesNow != hadTables) {
1213
- callListeners(hasTablesListeners[mutator], void 0, hasTablesNow);
1214
- }
1215
- const emptySortedRowIdListeners = collIsEmpty(
1229
+ const hasHasTablesListeners = !collIsEmpty(hasTablesListeners[mutator]);
1230
+ const hasSortedRowIdListeners = !collIsEmpty(
1216
1231
  sortedRowIdsListeners[mutator],
1217
1232
  );
1218
- const emptyIdAndHasListeners =
1233
+ const hasIdOrHasListeners = !(
1219
1234
  collIsEmpty(cellIdsListeners[mutator]) &&
1220
1235
  collIsEmpty(hasCellListeners[mutator]) &&
1221
1236
  collIsEmpty(rowIdsListeners[mutator]) &&
@@ -1223,15 +1238,17 @@ const createStore = () => {
1223
1238
  collIsEmpty(tableCellIdsListeners[mutator]) &&
1224
1239
  collIsEmpty(hasTableCellListeners[mutator]) &&
1225
1240
  collIsEmpty(rowCountListeners[mutator]) &&
1226
- emptySortedRowIdListeners &&
1241
+ !hasSortedRowIdListeners &&
1227
1242
  collIsEmpty(tableIdsListeners[mutator]) &&
1228
- collIsEmpty(hasTableListeners[mutator]);
1229
- const emptyOtherListeners =
1243
+ collIsEmpty(hasTableListeners[mutator])
1244
+ );
1245
+ const hasOtherListeners = !(
1230
1246
  collIsEmpty(cellListeners[mutator]) &&
1231
1247
  collIsEmpty(rowListeners[mutator]) &&
1232
1248
  collIsEmpty(tableListeners[mutator]) &&
1233
- collIsEmpty(tablesListeners[mutator]);
1234
- if (!emptyIdAndHasListeners || !emptyOtherListeners) {
1249
+ collIsEmpty(tablesListeners[mutator])
1250
+ );
1251
+ if (hasHasTablesListeners || hasIdOrHasListeners || hasOtherListeners) {
1235
1252
  const changes = mutator
1236
1253
  ? [
1237
1254
  mapClone(changedTableIds),
@@ -1239,7 +1256,9 @@ const createStore = () => {
1239
1256
  mapClone(changedRowCount),
1240
1257
  mapClone2(changedRowIds),
1241
1258
  mapClone3(changedCellIds),
1242
- mapClone3(changedCells),
1259
+ mapClone(changedCells, (map) =>
1260
+ mapClone(map, (map2) => mapClone(map2, pairClone)),
1261
+ ),
1243
1262
  ]
1244
1263
  : [
1245
1264
  changedTableIds,
@@ -1249,7 +1268,13 @@ const createStore = () => {
1249
1268
  changedCellIds,
1250
1269
  changedCells,
1251
1270
  ];
1252
- 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) {
1253
1278
  callIdsAndHasListenersIfChanged(
1254
1279
  changes[0],
1255
1280
  tableIdsListeners[mutator],
@@ -1281,13 +1306,13 @@ const createStore = () => {
1281
1306
  hasRowListeners[mutator],
1282
1307
  [tableId],
1283
1308
  ) &&
1284
- !emptySortedRowIdListeners
1309
+ hasSortedRowIdListeners
1285
1310
  ) {
1286
1311
  callListeners(sortedRowIdsListeners[mutator], [tableId, null]);
1287
1312
  setAdd(calledSortableTableIds, tableId);
1288
1313
  }
1289
1314
  });
1290
- if (!emptySortedRowIdListeners) {
1315
+ if (hasSortedRowIdListeners) {
1291
1316
  collForEach(changes[5], (rows, tableId) => {
1292
1317
  if (!collHas(calledSortableTableIds, tableId)) {
1293
1318
  const sortableCellIds = setNew();
@@ -1318,7 +1343,7 @@ const createStore = () => {
1318
1343
  ),
1319
1344
  );
1320
1345
  }
1321
- if (!emptyOtherListeners) {
1346
+ if (hasOtherListeners) {
1322
1347
  let tablesChanged;
1323
1348
  collForEach(changes[5], (rows, tableId) => {
1324
1349
  let tableChanged;
@@ -1355,28 +1380,31 @@ const createStore = () => {
1355
1380
  }
1356
1381
  };
1357
1382
  const callValuesListenersForChanges = (mutator) => {
1358
- const hasValuesNow = hasValues();
1359
- if (hasValuesNow != hadValues) {
1360
- callListeners(hasValuesListeners[mutator], void 0, hasValuesNow);
1361
- }
1362
- const emptyIdAndHasListeners =
1363
- collIsEmpty(valueIdsListeners[mutator]) &&
1364
- collIsEmpty(hasValueListeners[mutator]);
1365
- const emptyOtherListeners =
1366
- collIsEmpty(valueListeners[mutator]) &&
1367
- collIsEmpty(valuesListeners[mutator]);
1368
- 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) {
1369
1391
  const changes = mutator
1370
- ? [mapClone(changedValueIds), mapClone(changedValues)]
1392
+ ? [mapClone(changedValueIds), mapClone(changedValues, pairClone)]
1371
1393
  : [changedValueIds, changedValues];
1372
- 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) {
1373
1401
  callIdsAndHasListenersIfChanged(
1374
1402
  changes[0],
1375
1403
  valueIdsListeners[mutator],
1376
1404
  hasValueListeners[mutator],
1377
1405
  );
1378
1406
  }
1379
- if (!emptyOtherListeners) {
1407
+ if (hasOtherListeners) {
1380
1408
  let valuesChanged;
1381
1409
  collForEach(changes[1], ([oldValue, newValue], valueId) => {
1382
1410
  if (newValue !== oldValue) {
@@ -1773,6 +1801,7 @@ const createStore = () => {
1773
1801
  transactions--;
1774
1802
  if (transactions == 0) {
1775
1803
  transactions = 1;
1804
+ mutating = 1;
1776
1805
  callInvalidCellListeners(1);
1777
1806
  if (!collIsEmpty(changedCells)) {
1778
1807
  callTabularListenersForChanges(1);
@@ -1781,6 +1810,7 @@ const createStore = () => {
1781
1810
  if (!collIsEmpty(changedValues)) {
1782
1811
  callValuesListenersForChanges(1);
1783
1812
  }
1813
+ mutating = 0;
1784
1814
  if (doRollback?.(store)) {
1785
1815
  collForEach(changedCells, (table, tableId) =>
1786
1816
  collForEach(table, (row, rowId) =>