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
@@ -135,21 +135,22 @@ const objValues = (obj) => object.values(obj);
135
135
  const objSize = (obj) => size(objIds(obj));
136
136
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
137
137
 
138
- const mapNew = (entries) => new Map(entries);
139
- const mapGet = (map, key) => map?.get(key);
140
- const mapForEach = (map, cb) =>
141
- collForEach(map, (value, key) => cb(key, value));
138
+ const map = Map;
139
+ const mapNew = (entries) => new map(entries);
140
+ const mapGet = (map2, key) => map2?.get(key);
141
+ const mapForEach = (map2, cb) =>
142
+ collForEach(map2, (value, key) => cb(key, value));
142
143
  const mapMap = (coll, cb) =>
143
144
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
144
- const mapSet = (map, key, value) =>
145
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
146
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
147
- if (!collHas(map, key)) {
148
- mapSet(map, key, getDefaultValue());
145
+ const mapSet = (map2, key, value) =>
146
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
147
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
148
+ if (!collHas(map2, key)) {
149
+ mapSet(map2, key, getDefaultValue());
149
150
  } else {
150
- hadExistingValue?.(mapGet(map, key));
151
+ hadExistingValue?.(mapGet(map2, key));
151
152
  }
152
- return mapGet(map, key);
153
+ return mapGet(map2, key);
153
154
  };
154
155
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
155
156
  ifNotUndefined(
@@ -304,7 +305,16 @@ const jsonParse = JSON.parse;
304
305
  const jsonStringWithUndefined = (obj) =>
305
306
  jsonString(obj, (_key, value) => (isUndefined(value) ? UNDEFINED : value));
306
307
  const jsonParseWithUndefined = (str) =>
307
- jsonParse(str, (_key, value) => (value === UNDEFINED ? void 0 : value));
308
+ // JSON.parse reviver removes properties with undefined values
309
+ replaceUndefinedString(jsonParse(str));
310
+ const replaceUndefinedString = (obj) =>
311
+ obj === UNDEFINED
312
+ ? void 0
313
+ : isArray(obj)
314
+ ? arrayMap(obj, replaceUndefinedString)
315
+ : isObject(obj)
316
+ ? objMap(obj, replaceUndefinedString)
317
+ : obj;
308
318
 
309
319
  const INTEGER = /^\d+$/;
310
320
  const getPoolFunctions = () => {
@@ -476,6 +486,11 @@ const createCustomPersister = (
476
486
  ? store.applyChanges
477
487
  : store.setContent)(contentOrChanges);
478
488
  };
489
+ const saveAfterMutated = async () => {
490
+ if (isAutoSaving() && store.hadMutated?.()) {
491
+ await save();
492
+ }
493
+ };
479
494
  const load = async (initialContent) => {
480
495
  /* istanbul ignore else */
481
496
  if (status != 2 /* Saving */) {
@@ -500,6 +515,7 @@ const createCustomPersister = (
500
515
  },
501
516
  );
502
517
  setStatus(0 /* Idle */);
518
+ await saveAfterMutated();
503
519
  });
504
520
  }
505
521
  return persister;
@@ -518,6 +534,7 @@ const createCustomPersister = (
518
534
  loads++;
519
535
  setContentOrChanges(changes ?? content);
520
536
  setStatus(0 /* Idle */);
537
+ await saveAfterMutated();
521
538
  }
522
539
  } else {
523
540
  await load();
@@ -135,21 +135,22 @@ const objValues = (obj) => object.values(obj);
135
135
  const objSize = (obj) => size(objIds(obj));
136
136
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
137
137
 
138
- const mapNew = (entries) => new Map(entries);
139
- const mapGet = (map, key) => map?.get(key);
140
- const mapForEach = (map, cb) =>
141
- collForEach(map, (value, key) => cb(key, value));
138
+ const map = Map;
139
+ const mapNew = (entries) => new map(entries);
140
+ const mapGet = (map2, key) => map2?.get(key);
141
+ const mapForEach = (map2, cb) =>
142
+ collForEach(map2, (value, key) => cb(key, value));
142
143
  const mapMap = (coll, cb) =>
143
144
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
144
- const mapSet = (map, key, value) =>
145
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
146
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
147
- if (!collHas(map, key)) {
148
- mapSet(map, key, getDefaultValue());
145
+ const mapSet = (map2, key, value) =>
146
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
147
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
148
+ if (!collHas(map2, key)) {
149
+ mapSet(map2, key, getDefaultValue());
149
150
  } else {
150
- hadExistingValue?.(mapGet(map, key));
151
+ hadExistingValue?.(mapGet(map2, key));
151
152
  }
152
- return mapGet(map, key);
153
+ return mapGet(map2, key);
153
154
  };
154
155
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
155
156
  ifNotUndefined(
@@ -304,7 +305,16 @@ const jsonParse = JSON.parse;
304
305
  const jsonStringWithUndefined = (obj) =>
305
306
  jsonString(obj, (_key, value) => (isUndefined(value) ? UNDEFINED : value));
306
307
  const jsonParseWithUndefined = (str) =>
307
- jsonParse(str, (_key, value) => (value === UNDEFINED ? void 0 : value));
308
+ // JSON.parse reviver removes properties with undefined values
309
+ replaceUndefinedString(jsonParse(str));
310
+ const replaceUndefinedString = (obj) =>
311
+ obj === UNDEFINED
312
+ ? void 0
313
+ : isArray(obj)
314
+ ? arrayMap(obj, replaceUndefinedString)
315
+ : isObject(obj)
316
+ ? objMap(obj, replaceUndefinedString)
317
+ : obj;
308
318
 
309
319
  const INTEGER = /^\d+$/;
310
320
  const getPoolFunctions = () => {
@@ -476,6 +486,11 @@ const createCustomPersister = (
476
486
  ? store.applyChanges
477
487
  : store.setContent)(contentOrChanges);
478
488
  };
489
+ const saveAfterMutated = async () => {
490
+ if (isAutoSaving() && store.hadMutated?.()) {
491
+ await save();
492
+ }
493
+ };
479
494
  const load = async (initialContent) => {
480
495
  /* istanbul ignore else */
481
496
  if (status != 2 /* Saving */) {
@@ -500,6 +515,7 @@ const createCustomPersister = (
500
515
  },
501
516
  );
502
517
  setStatus(0 /* Idle */);
518
+ await saveAfterMutated();
503
519
  });
504
520
  }
505
521
  return persister;
@@ -518,6 +534,7 @@ const createCustomPersister = (
518
534
  loads++;
519
535
  setContentOrChanges(changes ?? content);
520
536
  setStatus(0 /* Idle */);
537
+ await saveAfterMutated();
521
538
  }
522
539
  } else {
523
540
  await load();
@@ -2,6 +2,7 @@ const getTypeOf = (thing) => typeof thing;
2
2
  const EMPTY_STRING = '';
3
3
  const STRING = getTypeOf(EMPTY_STRING);
4
4
  const MESSAGE = 'message';
5
+ const UNDEFINED = '\uFFFC';
5
6
  const strStartsWith = (str, prefix) => str.startsWith(prefix);
6
7
 
7
8
  const getIfNotFunction = (predicate) => (value, then, otherwise) =>
@@ -30,12 +31,14 @@ const tryCatch = async (action, then1, then2) => {
30
31
  };
31
32
 
32
33
  const arrayForEach = (array, cb) => array.forEach(cb);
34
+ const arrayMap = (array, cb) => array.map(cb);
33
35
  const arrayClear = (array, to) => array.splice(0, to);
34
36
  const arrayPush = (array, ...values) => array.push(...values);
35
37
  const arrayShift = (array) => array.shift();
36
38
 
37
39
  const object = Object;
38
40
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
41
+ const objEntries = object.entries;
39
42
  const isObject = (obj) =>
40
43
  !isNullish(obj) &&
41
44
  ifNotNullish(
@@ -49,6 +52,11 @@ const isObject = (obj) =>
49
52
  );
50
53
  const objIds = object.keys;
51
54
  const objFreeze = object.freeze;
55
+ const objNew = (entries = []) => object.fromEntries(entries);
56
+ const objToArray = (obj, cb) =>
57
+ arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
58
+ const objMap = (obj, cb) =>
59
+ objNew(objToArray(obj, (value, id) => [id, cb(value, id)]));
52
60
  const objSize = (obj) => size(objIds(obj));
53
61
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
54
62
 
@@ -58,6 +66,19 @@ const jsonStringWithMap = (obj) =>
58
66
  jsonString(obj, (_key, value) =>
59
67
  isInstanceOf(value, Map) ? object.fromEntries([...value]) : value,
60
68
  );
69
+ const jsonStringWithUndefined = (obj) =>
70
+ jsonString(obj, (_key, value) => (isUndefined(value) ? UNDEFINED : value));
71
+ const jsonParseWithUndefined = (str) =>
72
+ // JSON.parse reviver removes properties with undefined values
73
+ replaceUndefinedString(jsonParse(str));
74
+ const replaceUndefinedString = (obj) =>
75
+ obj === UNDEFINED
76
+ ? void 0
77
+ : isArray(obj)
78
+ ? arrayMap(obj, replaceUndefinedString)
79
+ : isObject(obj)
80
+ ? objMap(obj, replaceUndefinedString)
81
+ : obj;
61
82
 
62
83
  const collSize = (coll) => coll?.size ?? 0;
63
84
  const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
@@ -65,17 +86,18 @@ const collIsEmpty = (coll) => isUndefined(coll) || collSize(coll) == 0;
65
86
  const collForEach = (coll, cb) => coll?.forEach(cb);
66
87
  const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
67
88
 
68
- const mapNew = (entries) => new Map(entries);
69
- const mapGet = (map, key) => map?.get(key);
70
- const mapSet = (map, key, value) =>
71
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
72
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
73
- if (!collHas(map, key)) {
74
- mapSet(map, key, getDefaultValue());
89
+ const map = Map;
90
+ const mapNew = (entries) => new map(entries);
91
+ const mapGet = (map2, key) => map2?.get(key);
92
+ const mapSet = (map2, key, value) =>
93
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
94
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
95
+ if (!collHas(map2, key)) {
96
+ mapSet(map2, key, getDefaultValue());
75
97
  } else {
76
- hadExistingValue?.(mapGet(map, key));
98
+ hadExistingValue?.(mapGet(map2, key));
77
99
  }
78
- return mapGet(map, key);
100
+ return mapGet(map2, key);
79
101
  };
80
102
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
81
103
  ifNotUndefined(
@@ -277,6 +299,11 @@ const createCustomPersister = (
277
299
  ? store.applyChanges
278
300
  : store.setContent)(contentOrChanges);
279
301
  };
302
+ const saveAfterMutated = async () => {
303
+ if (isAutoSaving() && store.hadMutated?.()) {
304
+ await save();
305
+ }
306
+ };
280
307
  const load = async (initialContent) => {
281
308
  /* istanbul ignore else */
282
309
  if (status != 2 /* Saving */) {
@@ -301,6 +328,7 @@ const createCustomPersister = (
301
328
  },
302
329
  );
303
330
  setStatus(0 /* Idle */);
331
+ await saveAfterMutated();
304
332
  });
305
333
  }
306
334
  return persister;
@@ -319,6 +347,7 @@ const createCustomPersister = (
319
347
  loads++;
320
348
  setContentOrChanges(changes ?? content);
321
349
  setStatus(0 /* Idle */);
350
+ await saveAfterMutated();
322
351
  }
323
352
  } else {
324
353
  await load();
@@ -435,13 +464,17 @@ const SET_CHANGES = 's';
435
464
  const STORE_PATH = '/store';
436
465
  const PUT = 'PUT';
437
466
  const construct = (prefix, type, payload) =>
438
- prefix + type + (isString(payload) ? payload : jsonStringWithMap(payload));
467
+ prefix +
468
+ type +
469
+ (isString(payload) ? payload : jsonStringWithUndefined(payload));
439
470
  const deconstruct = (prefix, message, stringified) => {
440
471
  const prefixSize = size(prefix);
441
472
  return strStartsWith(message, prefix)
442
473
  ? [
443
474
  message[prefixSize],
444
- (stringified ? jsonParse : String)(slice(message, prefixSize + 1)),
475
+ (stringified ? jsonParseWithUndefined : String)(
476
+ slice(message, prefixSize + 1),
477
+ ),
445
478
  ]
446
479
  : void 0;
447
480
  };
@@ -2,6 +2,7 @@ const getTypeOf = (thing) => typeof thing;
2
2
  const EMPTY_STRING = '';
3
3
  const STRING = getTypeOf(EMPTY_STRING);
4
4
  const MESSAGE = 'message';
5
+ const UNDEFINED = '\uFFFC';
5
6
  const strStartsWith = (str, prefix) => str.startsWith(prefix);
6
7
 
7
8
  const getIfNotFunction = (predicate) => (value, then, otherwise) =>
@@ -30,12 +31,14 @@ const tryCatch = async (action, then1, then2) => {
30
31
  };
31
32
 
32
33
  const arrayForEach = (array, cb) => array.forEach(cb);
34
+ const arrayMap = (array, cb) => array.map(cb);
33
35
  const arrayClear = (array, to) => array.splice(0, to);
34
36
  const arrayPush = (array, ...values) => array.push(...values);
35
37
  const arrayShift = (array) => array.shift();
36
38
 
37
39
  const object = Object;
38
40
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
41
+ const objEntries = object.entries;
39
42
  const isObject = (obj) =>
40
43
  !isNullish(obj) &&
41
44
  ifNotNullish(
@@ -49,6 +52,11 @@ const isObject = (obj) =>
49
52
  );
50
53
  const objIds = object.keys;
51
54
  const objFreeze = object.freeze;
55
+ const objNew = (entries = []) => object.fromEntries(entries);
56
+ const objToArray = (obj, cb) =>
57
+ arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
58
+ const objMap = (obj, cb) =>
59
+ objNew(objToArray(obj, (value, id) => [id, cb(value, id)]));
52
60
  const objSize = (obj) => size(objIds(obj));
53
61
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
54
62
 
@@ -58,6 +66,19 @@ const jsonStringWithMap = (obj) =>
58
66
  jsonString(obj, (_key, value) =>
59
67
  isInstanceOf(value, Map) ? object.fromEntries([...value]) : value,
60
68
  );
69
+ const jsonStringWithUndefined = (obj) =>
70
+ jsonString(obj, (_key, value) => (isUndefined(value) ? UNDEFINED : value));
71
+ const jsonParseWithUndefined = (str) =>
72
+ // JSON.parse reviver removes properties with undefined values
73
+ replaceUndefinedString(jsonParse(str));
74
+ const replaceUndefinedString = (obj) =>
75
+ obj === UNDEFINED
76
+ ? void 0
77
+ : isArray(obj)
78
+ ? arrayMap(obj, replaceUndefinedString)
79
+ : isObject(obj)
80
+ ? objMap(obj, replaceUndefinedString)
81
+ : obj;
61
82
 
62
83
  const collSize = (coll) => coll?.size ?? 0;
63
84
  const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
@@ -65,17 +86,18 @@ const collIsEmpty = (coll) => isUndefined(coll) || collSize(coll) == 0;
65
86
  const collForEach = (coll, cb) => coll?.forEach(cb);
66
87
  const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
67
88
 
68
- const mapNew = (entries) => new Map(entries);
69
- const mapGet = (map, key) => map?.get(key);
70
- const mapSet = (map, key, value) =>
71
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
72
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
73
- if (!collHas(map, key)) {
74
- mapSet(map, key, getDefaultValue());
89
+ const map = Map;
90
+ const mapNew = (entries) => new map(entries);
91
+ const mapGet = (map2, key) => map2?.get(key);
92
+ const mapSet = (map2, key, value) =>
93
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
94
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
95
+ if (!collHas(map2, key)) {
96
+ mapSet(map2, key, getDefaultValue());
75
97
  } else {
76
- hadExistingValue?.(mapGet(map, key));
98
+ hadExistingValue?.(mapGet(map2, key));
77
99
  }
78
- return mapGet(map, key);
100
+ return mapGet(map2, key);
79
101
  };
80
102
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
81
103
  ifNotUndefined(
@@ -277,6 +299,11 @@ const createCustomPersister = (
277
299
  ? store.applyChanges
278
300
  : store.setContent)(contentOrChanges);
279
301
  };
302
+ const saveAfterMutated = async () => {
303
+ if (isAutoSaving() && store.hadMutated?.()) {
304
+ await save();
305
+ }
306
+ };
280
307
  const load = async (initialContent) => {
281
308
  /* istanbul ignore else */
282
309
  if (status != 2 /* Saving */) {
@@ -301,6 +328,7 @@ const createCustomPersister = (
301
328
  },
302
329
  );
303
330
  setStatus(0 /* Idle */);
331
+ await saveAfterMutated();
304
332
  });
305
333
  }
306
334
  return persister;
@@ -319,6 +347,7 @@ const createCustomPersister = (
319
347
  loads++;
320
348
  setContentOrChanges(changes ?? content);
321
349
  setStatus(0 /* Idle */);
350
+ await saveAfterMutated();
322
351
  }
323
352
  } else {
324
353
  await load();
@@ -435,13 +464,17 @@ const SET_CHANGES = 's';
435
464
  const STORE_PATH = '/store';
436
465
  const PUT = 'PUT';
437
466
  const construct = (prefix, type, payload) =>
438
- prefix + type + (isString(payload) ? payload : jsonStringWithMap(payload));
467
+ prefix +
468
+ type +
469
+ (isString(payload) ? payload : jsonStringWithUndefined(payload));
439
470
  const deconstruct = (prefix, message, stringified) => {
440
471
  const prefixSize = size(prefix);
441
472
  return strStartsWith(message, prefix)
442
473
  ? [
443
474
  message[prefixSize],
444
- (stringified ? jsonParse : String)(slice(message, prefixSize + 1)),
475
+ (stringified ? jsonParseWithUndefined : String)(
476
+ slice(message, prefixSize + 1),
477
+ ),
445
478
  ]
446
479
  : void 0;
447
480
  };
@@ -3,15 +3,19 @@ const EMPTY_STRING = '';
3
3
  const STRING = getTypeOf(EMPTY_STRING);
4
4
  const T = 't';
5
5
  const V = 'v';
6
+ const UNDEFINED = '\uFFFC';
6
7
  const strStartsWith = (str, prefix) => str.startsWith(prefix);
7
8
 
8
9
  const promise = Promise;
9
10
  const getIfNotFunction = (predicate) => (value, then, otherwise) =>
10
11
  predicate(value) ? otherwise?.() : then(value);
11
12
  const isInstanceOf = (thing, cls) => thing instanceof cls;
13
+ const isNullish = (thing) => thing == null;
12
14
  const isUndefined = (thing) => thing === void 0;
15
+ const ifNotNullish = getIfNotFunction(isNullish);
13
16
  const ifNotUndefined = getIfNotFunction(isUndefined);
14
17
  const isString = (thing) => getTypeOf(thing) == STRING;
18
+ const isArray = (thing) => Array.isArray(thing);
15
19
  const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
16
20
  const size = (arrayOrString) => arrayOrString.length;
17
21
  const promiseAll = async (promises) => promise.all(promises);
@@ -23,11 +27,25 @@ const arrayPush = (array, ...values) => array.push(...values);
23
27
  const arrayUnshift = (array, ...values) => array.unshift(...values);
24
28
 
25
29
  const object = Object;
30
+ const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
26
31
  const objEntries = object.entries;
32
+ const isObject = (obj) =>
33
+ !isNullish(obj) &&
34
+ ifNotNullish(
35
+ getPrototypeOf(obj),
36
+ (objPrototype) =>
37
+ objPrototype == object.prototype ||
38
+ isNullish(getPrototypeOf(objPrototype)),
39
+
40
+ /* istanbul ignore next */
41
+ () => true,
42
+ );
27
43
  const objNew = (entries = []) => object.fromEntries(entries);
28
44
  const objHas = (obj, id) => id in obj;
29
45
  const objToArray = (obj, cb) =>
30
46
  arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
47
+ const objMap = (obj, cb) =>
48
+ objNew(objToArray(obj, (value, id) => [id, cb(value, id)]));
31
49
  const objEnsure = (obj, id, getDefaultValue) => {
32
50
  if (!objHas(obj, id)) {
33
51
  obj[id] = getDefaultValue();
@@ -41,23 +59,40 @@ const jsonStringWithMap = (obj) =>
41
59
  jsonString(obj, (_key, value) =>
42
60
  isInstanceOf(value, Map) ? object.fromEntries([...value]) : value,
43
61
  );
62
+ const jsonStringWithUndefined = (obj) =>
63
+ jsonString(obj, (_key, value) => (isUndefined(value) ? UNDEFINED : value));
64
+ const jsonParseWithUndefined = (str) =>
65
+ // JSON.parse reviver removes properties with undefined values
66
+ replaceUndefinedString(jsonParse(str));
67
+ const replaceUndefinedString = (obj) =>
68
+ obj === UNDEFINED
69
+ ? void 0
70
+ : isArray(obj)
71
+ ? arrayMap(obj, replaceUndefinedString)
72
+ : isObject(obj)
73
+ ? objMap(obj, replaceUndefinedString)
74
+ : obj;
44
75
 
45
76
  const collForEach = (coll, cb) => coll?.forEach(cb);
46
77
 
47
- const mapForEach = (map, cb) =>
48
- collForEach(map, (value, key) => cb(key, value));
78
+ const mapForEach = (map2, cb) =>
79
+ collForEach(map2, (value, key) => cb(key, value));
49
80
 
50
81
  const SET_CHANGES = 's';
51
82
  const STORE_PATH = '/store';
52
83
  const PUT = 'PUT';
53
84
  const construct = (prefix, type, payload) =>
54
- prefix + type + (isString(payload) ? payload : jsonStringWithMap(payload));
85
+ prefix +
86
+ type +
87
+ (isString(payload) ? payload : jsonStringWithUndefined(payload));
55
88
  const deconstruct = (prefix, message, stringified) => {
56
89
  const prefixSize = size(prefix);
57
90
  return strStartsWith(message, prefix)
58
91
  ? [
59
92
  message[prefixSize],
60
- (stringified ? jsonParse : String)(slice(message, prefixSize + 1)),
93
+ (stringified ? jsonParseWithUndefined : String)(
94
+ slice(message, prefixSize + 1),
95
+ ),
61
96
  ]
62
97
  : void 0;
63
98
  };
@@ -3,15 +3,19 @@ const EMPTY_STRING = '';
3
3
  const STRING = getTypeOf(EMPTY_STRING);
4
4
  const T = 't';
5
5
  const V = 'v';
6
+ const UNDEFINED = '\uFFFC';
6
7
  const strStartsWith = (str, prefix) => str.startsWith(prefix);
7
8
 
8
9
  const promise = Promise;
9
10
  const getIfNotFunction = (predicate) => (value, then, otherwise) =>
10
11
  predicate(value) ? otherwise?.() : then(value);
11
12
  const isInstanceOf = (thing, cls) => thing instanceof cls;
13
+ const isNullish = (thing) => thing == null;
12
14
  const isUndefined = (thing) => thing === void 0;
15
+ const ifNotNullish = getIfNotFunction(isNullish);
13
16
  const ifNotUndefined = getIfNotFunction(isUndefined);
14
17
  const isString = (thing) => getTypeOf(thing) == STRING;
18
+ const isArray = (thing) => Array.isArray(thing);
15
19
  const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
16
20
  const size = (arrayOrString) => arrayOrString.length;
17
21
  const promiseAll = async (promises) => promise.all(promises);
@@ -23,11 +27,25 @@ const arrayPush = (array, ...values) => array.push(...values);
23
27
  const arrayUnshift = (array, ...values) => array.unshift(...values);
24
28
 
25
29
  const object = Object;
30
+ const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
26
31
  const objEntries = object.entries;
32
+ const isObject = (obj) =>
33
+ !isNullish(obj) &&
34
+ ifNotNullish(
35
+ getPrototypeOf(obj),
36
+ (objPrototype) =>
37
+ objPrototype == object.prototype ||
38
+ isNullish(getPrototypeOf(objPrototype)),
39
+
40
+ /* istanbul ignore next */
41
+ () => true,
42
+ );
27
43
  const objNew = (entries = []) => object.fromEntries(entries);
28
44
  const objHas = (obj, id) => id in obj;
29
45
  const objToArray = (obj, cb) =>
30
46
  arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
47
+ const objMap = (obj, cb) =>
48
+ objNew(objToArray(obj, (value, id) => [id, cb(value, id)]));
31
49
  const objEnsure = (obj, id, getDefaultValue) => {
32
50
  if (!objHas(obj, id)) {
33
51
  obj[id] = getDefaultValue();
@@ -41,23 +59,40 @@ const jsonStringWithMap = (obj) =>
41
59
  jsonString(obj, (_key, value) =>
42
60
  isInstanceOf(value, Map) ? object.fromEntries([...value]) : value,
43
61
  );
62
+ const jsonStringWithUndefined = (obj) =>
63
+ jsonString(obj, (_key, value) => (isUndefined(value) ? UNDEFINED : value));
64
+ const jsonParseWithUndefined = (str) =>
65
+ // JSON.parse reviver removes properties with undefined values
66
+ replaceUndefinedString(jsonParse(str));
67
+ const replaceUndefinedString = (obj) =>
68
+ obj === UNDEFINED
69
+ ? void 0
70
+ : isArray(obj)
71
+ ? arrayMap(obj, replaceUndefinedString)
72
+ : isObject(obj)
73
+ ? objMap(obj, replaceUndefinedString)
74
+ : obj;
44
75
 
45
76
  const collForEach = (coll, cb) => coll?.forEach(cb);
46
77
 
47
- const mapForEach = (map, cb) =>
48
- collForEach(map, (value, key) => cb(key, value));
78
+ const mapForEach = (map2, cb) =>
79
+ collForEach(map2, (value, key) => cb(key, value));
49
80
 
50
81
  const SET_CHANGES = 's';
51
82
  const STORE_PATH = '/store';
52
83
  const PUT = 'PUT';
53
84
  const construct = (prefix, type, payload) =>
54
- prefix + type + (isString(payload) ? payload : jsonStringWithMap(payload));
85
+ prefix +
86
+ type +
87
+ (isString(payload) ? payload : jsonStringWithUndefined(payload));
55
88
  const deconstruct = (prefix, message, stringified) => {
56
89
  const prefixSize = size(prefix);
57
90
  return strStartsWith(message, prefix)
58
91
  ? [
59
92
  message[prefixSize],
60
- (stringified ? jsonParse : String)(slice(message, prefixSize + 1)),
93
+ (stringified ? jsonParseWithUndefined : String)(
94
+ slice(message, prefixSize + 1),
95
+ ),
61
96
  ]
62
97
  : void 0;
63
98
  };
@@ -93,7 +93,16 @@ const jsonParse = JSON.parse;
93
93
  const jsonStringWithUndefined = (obj) =>
94
94
  jsonString(obj, (_key, value) => (isUndefined(value) ? UNDEFINED : value));
95
95
  const jsonParseWithUndefined = (str) =>
96
- jsonParse(str, (_key, value) => (value === UNDEFINED ? void 0 : value));
96
+ // JSON.parse reviver removes properties with undefined values
97
+ replaceUndefinedString(jsonParse(str));
98
+ const replaceUndefinedString = (obj) =>
99
+ obj === UNDEFINED
100
+ ? void 0
101
+ : isArray(obj)
102
+ ? arrayMap(obj, replaceUndefinedString)
103
+ : isObject(obj)
104
+ ? objMap(obj, replaceUndefinedString)
105
+ : obj;
97
106
 
98
107
  const textEncoder = /* @__PURE__ */ new GLOBAL.TextEncoder();
99
108
  const getHash = (string) => {
@@ -106,21 +115,22 @@ const getHash = (string) => {
106
115
  return hash >>> 0;
107
116
  };
108
117
 
109
- const mapNew = (entries) => new Map(entries);
110
- const mapGet = (map, key) => map?.get(key);
111
- const mapForEach = (map, cb) =>
112
- collForEach(map, (value, key) => cb(key, value));
118
+ const map = Map;
119
+ const mapNew = (entries) => new map(entries);
120
+ const mapGet = (map2, key) => map2?.get(key);
121
+ const mapForEach = (map2, cb) =>
122
+ collForEach(map2, (value, key) => cb(key, value));
113
123
  const mapMap = (coll, cb) =>
114
124
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
115
- const mapSet = (map, key, value) =>
116
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
117
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
118
- if (!collHas(map, key)) {
119
- mapSet(map, key, getDefaultValue());
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());
120
130
  } else {
121
- hadExistingValue?.(mapGet(map, key));
131
+ hadExistingValue?.(mapGet(map2, key));
122
132
  }
123
- return mapGet(map, key);
133
+ return mapGet(map2, key);
124
134
  };
125
135
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
126
136
  ifNotUndefined(
@@ -481,6 +491,11 @@ const createCustomPersister = (
481
491
  ? store.applyChanges
482
492
  : store.setContent)(contentOrChanges);
483
493
  };
494
+ const saveAfterMutated = async () => {
495
+ if (isAutoSaving() && store.hadMutated?.()) {
496
+ await save();
497
+ }
498
+ };
484
499
  const load = async (initialContent) => {
485
500
  /* istanbul ignore else */
486
501
  if (status != 2 /* Saving */) {
@@ -505,6 +520,7 @@ const createCustomPersister = (
505
520
  },
506
521
  );
507
522
  setStatus(0 /* Idle */);
523
+ await saveAfterMutated();
508
524
  });
509
525
  }
510
526
  return persister;
@@ -523,6 +539,7 @@ const createCustomPersister = (
523
539
  loads++;
524
540
  setContentOrChanges(changes ?? content);
525
541
  setStatus(0 /* Idle */);
542
+ await saveAfterMutated();
526
543
  }
527
544
  } else {
528
545
  await load();