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();
@@ -137,21 +137,22 @@ const objValues = (obj) => object.values(obj);
137
137
  const objSize = (obj) => size(objIds(obj));
138
138
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
139
139
 
140
- const mapNew = (entries) => new Map(entries);
141
- const mapGet = (map, key) => map?.get(key);
142
- const mapForEach = (map, cb) =>
143
- collForEach(map, (value, key) => cb(key, value));
140
+ const map = Map;
141
+ const mapNew = (entries) => new map(entries);
142
+ const mapGet = (map2, key) => map2?.get(key);
143
+ const mapForEach = (map2, cb) =>
144
+ collForEach(map2, (value, key) => cb(key, value));
144
145
  const mapMap = (coll, cb) =>
145
146
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
146
- const mapSet = (map, key, value) =>
147
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
148
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
149
- if (!collHas(map, key)) {
150
- mapSet(map, key, getDefaultValue());
147
+ const mapSet = (map2, key, value) =>
148
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
149
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
150
+ if (!collHas(map2, key)) {
151
+ mapSet(map2, key, getDefaultValue());
151
152
  } else {
152
- hadExistingValue?.(mapGet(map, key));
153
+ hadExistingValue?.(mapGet(map2, key));
153
154
  }
154
- return mapGet(map, key);
155
+ return mapGet(map2, key);
155
156
  };
156
157
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
157
158
  ifNotUndefined(
@@ -306,7 +307,16 @@ const jsonParse = JSON.parse;
306
307
  const jsonStringWithUndefined = (obj) =>
307
308
  jsonString(obj, (_key, value) => (isUndefined(value) ? UNDEFINED : value));
308
309
  const jsonParseWithUndefined = (str) =>
309
- jsonParse(str, (_key, value) => (value === UNDEFINED ? void 0 : value));
310
+ // JSON.parse reviver removes properties with undefined values
311
+ replaceUndefinedString(jsonParse(str));
312
+ const replaceUndefinedString = (obj) =>
313
+ obj === UNDEFINED
314
+ ? void 0
315
+ : isArray(obj)
316
+ ? arrayMap(obj, replaceUndefinedString)
317
+ : isObject(obj)
318
+ ? objMap(obj, replaceUndefinedString)
319
+ : obj;
310
320
 
311
321
  const INTEGER = /^\d+$/;
312
322
  const getPoolFunctions = () => {
@@ -478,6 +488,11 @@ const createCustomPersister = (
478
488
  ? store.applyChanges
479
489
  : store.setContent)(contentOrChanges);
480
490
  };
491
+ const saveAfterMutated = async () => {
492
+ if (isAutoSaving() && store.hadMutated?.()) {
493
+ await save();
494
+ }
495
+ };
481
496
  const load = async (initialContent) => {
482
497
  /* istanbul ignore else */
483
498
  if (status != 2 /* Saving */) {
@@ -502,6 +517,7 @@ const createCustomPersister = (
502
517
  },
503
518
  );
504
519
  setStatus(0 /* Idle */);
520
+ await saveAfterMutated();
505
521
  });
506
522
  }
507
523
  return persister;
@@ -520,6 +536,7 @@ const createCustomPersister = (
520
536
  loads++;
521
537
  setContentOrChanges(changes ?? content);
522
538
  setStatus(0 /* Idle */);
539
+ await saveAfterMutated();
523
540
  }
524
541
  } else {
525
542
  await load();
@@ -137,21 +137,22 @@ const objValues = (obj) => object.values(obj);
137
137
  const objSize = (obj) => size(objIds(obj));
138
138
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
139
139
 
140
- const mapNew = (entries) => new Map(entries);
141
- const mapGet = (map, key) => map?.get(key);
142
- const mapForEach = (map, cb) =>
143
- collForEach(map, (value, key) => cb(key, value));
140
+ const map = Map;
141
+ const mapNew = (entries) => new map(entries);
142
+ const mapGet = (map2, key) => map2?.get(key);
143
+ const mapForEach = (map2, cb) =>
144
+ collForEach(map2, (value, key) => cb(key, value));
144
145
  const mapMap = (coll, cb) =>
145
146
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
146
- const mapSet = (map, key, value) =>
147
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
148
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
149
- if (!collHas(map, key)) {
150
- mapSet(map, key, getDefaultValue());
147
+ const mapSet = (map2, key, value) =>
148
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
149
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
150
+ if (!collHas(map2, key)) {
151
+ mapSet(map2, key, getDefaultValue());
151
152
  } else {
152
- hadExistingValue?.(mapGet(map, key));
153
+ hadExistingValue?.(mapGet(map2, key));
153
154
  }
154
- return mapGet(map, key);
155
+ return mapGet(map2, key);
155
156
  };
156
157
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
157
158
  ifNotUndefined(
@@ -306,7 +307,16 @@ const jsonParse = JSON.parse;
306
307
  const jsonStringWithUndefined = (obj) =>
307
308
  jsonString(obj, (_key, value) => (isUndefined(value) ? UNDEFINED : value));
308
309
  const jsonParseWithUndefined = (str) =>
309
- jsonParse(str, (_key, value) => (value === UNDEFINED ? void 0 : value));
310
+ // JSON.parse reviver removes properties with undefined values
311
+ replaceUndefinedString(jsonParse(str));
312
+ const replaceUndefinedString = (obj) =>
313
+ obj === UNDEFINED
314
+ ? void 0
315
+ : isArray(obj)
316
+ ? arrayMap(obj, replaceUndefinedString)
317
+ : isObject(obj)
318
+ ? objMap(obj, replaceUndefinedString)
319
+ : obj;
310
320
 
311
321
  const INTEGER = /^\d+$/;
312
322
  const getPoolFunctions = () => {
@@ -478,6 +488,11 @@ const createCustomPersister = (
478
488
  ? store.applyChanges
479
489
  : store.setContent)(contentOrChanges);
480
490
  };
491
+ const saveAfterMutated = async () => {
492
+ if (isAutoSaving() && store.hadMutated?.()) {
493
+ await save();
494
+ }
495
+ };
481
496
  const load = async (initialContent) => {
482
497
  /* istanbul ignore else */
483
498
  if (status != 2 /* Saving */) {
@@ -502,6 +517,7 @@ const createCustomPersister = (
502
517
  },
503
518
  );
504
519
  setStatus(0 /* Idle */);
520
+ await saveAfterMutated();
505
521
  });
506
522
  }
507
523
  return persister;
@@ -520,6 +536,7 @@ const createCustomPersister = (
520
536
  loads++;
521
537
  setContentOrChanges(changes ?? content);
522
538
  setStatus(0 /* Idle */);
539
+ await saveAfterMutated();
523
540
  }
524
541
  } else {
525
542
  await load();
@@ -28,12 +28,14 @@ const tryCatch = async (action, then1, then2) => {
28
28
  };
29
29
 
30
30
  const arrayForEach = (array, cb) => array.forEach(cb);
31
+ const arrayMap = (array, cb) => array.map(cb);
31
32
  const arrayClear = (array, to) => array.splice(0, to);
32
33
  const arrayPush = (array, ...values) => array.push(...values);
33
34
  const arrayShift = (array) => array.shift();
34
35
 
35
36
  const object = Object;
36
37
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
38
+ const objEntries = object.entries;
37
39
  const isObject = (obj) =>
38
40
  !isNullish(obj) &&
39
41
  ifNotNullish(
@@ -47,6 +49,11 @@ const isObject = (obj) =>
47
49
  );
48
50
  const objIds = object.keys;
49
51
  const objFreeze = object.freeze;
52
+ const objNew = (entries = []) => object.fromEntries(entries);
53
+ const objToArray = (obj, cb) =>
54
+ arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
55
+ const objMap = (obj, cb) =>
56
+ objNew(objToArray(obj, (value, id) => [id, cb(value, id)]));
50
57
  const objSize = (obj) => size(objIds(obj));
51
58
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
52
59
 
@@ -55,7 +62,16 @@ const jsonParse = JSON.parse;
55
62
  const jsonStringWithUndefined = (obj) =>
56
63
  jsonString(obj, (_key, value) => (isUndefined(value) ? UNDEFINED : value));
57
64
  const jsonParseWithUndefined = (str) =>
58
- jsonParse(str, (_key, value) => (value === UNDEFINED ? void 0 : value));
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;
59
75
 
60
76
  const collSize = (coll) => coll?.size ?? 0;
61
77
  const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
@@ -63,17 +79,18 @@ const collIsEmpty = (coll) => isUndefined(coll) || collSize(coll) == 0;
63
79
  const collForEach = (coll, cb) => coll?.forEach(cb);
64
80
  const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
65
81
 
66
- const mapNew = (entries) => new Map(entries);
67
- const mapGet = (map, key) => map?.get(key);
68
- const mapSet = (map, key, value) =>
69
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
70
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
71
- if (!collHas(map, key)) {
72
- mapSet(map, key, getDefaultValue());
82
+ const map = Map;
83
+ const mapNew = (entries) => new map(entries);
84
+ const mapGet = (map2, key) => map2?.get(key);
85
+ const mapSet = (map2, key, value) =>
86
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
87
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
88
+ if (!collHas(map2, key)) {
89
+ mapSet(map2, key, getDefaultValue());
73
90
  } else {
74
- hadExistingValue?.(mapGet(map, key));
91
+ hadExistingValue?.(mapGet(map2, key));
75
92
  }
76
- return mapGet(map, key);
93
+ return mapGet(map2, key);
77
94
  };
78
95
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
79
96
  ifNotUndefined(
@@ -275,6 +292,11 @@ const createCustomPersister = (
275
292
  ? store.applyChanges
276
293
  : store.setContent)(contentOrChanges);
277
294
  };
295
+ const saveAfterMutated = async () => {
296
+ if (isAutoSaving() && store.hadMutated?.()) {
297
+ await save();
298
+ }
299
+ };
278
300
  const load = async (initialContent) => {
279
301
  /* istanbul ignore else */
280
302
  if (status != 2 /* Saving */) {
@@ -299,6 +321,7 @@ const createCustomPersister = (
299
321
  },
300
322
  );
301
323
  setStatus(0 /* Idle */);
324
+ await saveAfterMutated();
302
325
  });
303
326
  }
304
327
  return persister;
@@ -317,6 +340,7 @@ const createCustomPersister = (
317
340
  loads++;
318
341
  setContentOrChanges(changes ?? content);
319
342
  setStatus(0 /* Idle */);
343
+ await saveAfterMutated();
320
344
  }
321
345
  } else {
322
346
  await load();
@@ -28,12 +28,14 @@ const tryCatch = async (action, then1, then2) => {
28
28
  };
29
29
 
30
30
  const arrayForEach = (array, cb) => array.forEach(cb);
31
+ const arrayMap = (array, cb) => array.map(cb);
31
32
  const arrayClear = (array, to) => array.splice(0, to);
32
33
  const arrayPush = (array, ...values) => array.push(...values);
33
34
  const arrayShift = (array) => array.shift();
34
35
 
35
36
  const object = Object;
36
37
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
38
+ const objEntries = object.entries;
37
39
  const isObject = (obj) =>
38
40
  !isNullish(obj) &&
39
41
  ifNotNullish(
@@ -47,6 +49,11 @@ const isObject = (obj) =>
47
49
  );
48
50
  const objIds = object.keys;
49
51
  const objFreeze = object.freeze;
52
+ const objNew = (entries = []) => object.fromEntries(entries);
53
+ const objToArray = (obj, cb) =>
54
+ arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
55
+ const objMap = (obj, cb) =>
56
+ objNew(objToArray(obj, (value, id) => [id, cb(value, id)]));
50
57
  const objSize = (obj) => size(objIds(obj));
51
58
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
52
59
 
@@ -55,7 +62,16 @@ const jsonParse = JSON.parse;
55
62
  const jsonStringWithUndefined = (obj) =>
56
63
  jsonString(obj, (_key, value) => (isUndefined(value) ? UNDEFINED : value));
57
64
  const jsonParseWithUndefined = (str) =>
58
- jsonParse(str, (_key, value) => (value === UNDEFINED ? void 0 : value));
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;
59
75
 
60
76
  const collSize = (coll) => coll?.size ?? 0;
61
77
  const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
@@ -63,17 +79,18 @@ const collIsEmpty = (coll) => isUndefined(coll) || collSize(coll) == 0;
63
79
  const collForEach = (coll, cb) => coll?.forEach(cb);
64
80
  const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
65
81
 
66
- const mapNew = (entries) => new Map(entries);
67
- const mapGet = (map, key) => map?.get(key);
68
- const mapSet = (map, key, value) =>
69
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
70
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
71
- if (!collHas(map, key)) {
72
- mapSet(map, key, getDefaultValue());
82
+ const map = Map;
83
+ const mapNew = (entries) => new map(entries);
84
+ const mapGet = (map2, key) => map2?.get(key);
85
+ const mapSet = (map2, key, value) =>
86
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
87
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
88
+ if (!collHas(map2, key)) {
89
+ mapSet(map2, key, getDefaultValue());
73
90
  } else {
74
- hadExistingValue?.(mapGet(map, key));
91
+ hadExistingValue?.(mapGet(map2, key));
75
92
  }
76
- return mapGet(map, key);
93
+ return mapGet(map2, key);
77
94
  };
78
95
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
79
96
  ifNotUndefined(
@@ -275,6 +292,11 @@ const createCustomPersister = (
275
292
  ? store.applyChanges
276
293
  : store.setContent)(contentOrChanges);
277
294
  };
295
+ const saveAfterMutated = async () => {
296
+ if (isAutoSaving() && store.hadMutated?.()) {
297
+ await save();
298
+ }
299
+ };
278
300
  const load = async (initialContent) => {
279
301
  /* istanbul ignore else */
280
302
  if (status != 2 /* Saving */) {
@@ -299,6 +321,7 @@ const createCustomPersister = (
299
321
  },
300
322
  );
301
323
  setStatus(0 /* Idle */);
324
+ await saveAfterMutated();
302
325
  });
303
326
  }
304
327
  return persister;
@@ -317,6 +340,7 @@ const createCustomPersister = (
317
340
  loads++;
318
341
  setContentOrChanges(changes ?? content);
319
342
  setStatus(0 /* Idle */);
343
+ await saveAfterMutated();
320
344
  }
321
345
  } else {
322
346
  await load();
@@ -69,17 +69,18 @@ const collIsEmpty = (coll) => isUndefined(coll) || collSize(coll) == 0;
69
69
  const collForEach = (coll, cb) => coll?.forEach(cb);
70
70
  const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
71
71
 
72
- const mapNew = (entries) => new Map(entries);
73
- const mapGet = (map, key) => map?.get(key);
74
- const mapSet = (map, key, value) =>
75
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
76
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
77
- if (!collHas(map, key)) {
78
- mapSet(map, key, getDefaultValue());
72
+ const map = Map;
73
+ const mapNew = (entries) => new map(entries);
74
+ const mapGet = (map2, key) => map2?.get(key);
75
+ const mapSet = (map2, key, value) =>
76
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
77
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
78
+ if (!collHas(map2, key)) {
79
+ mapSet(map2, key, getDefaultValue());
79
80
  } else {
80
- hadExistingValue?.(mapGet(map, key));
81
+ hadExistingValue?.(mapGet(map2, key));
81
82
  }
82
- return mapGet(map, key);
83
+ return mapGet(map2, key);
83
84
  };
84
85
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
85
86
  ifNotUndefined(
@@ -281,6 +282,11 @@ const createCustomPersister = (
281
282
  ? store.applyChanges
282
283
  : store.setContent)(contentOrChanges);
283
284
  };
285
+ const saveAfterMutated = async () => {
286
+ if (isAutoSaving() && store.hadMutated?.()) {
287
+ await save();
288
+ }
289
+ };
284
290
  const load = async (initialContent) => {
285
291
  /* istanbul ignore else */
286
292
  if (status != 2 /* Saving */) {
@@ -305,6 +311,7 @@ const createCustomPersister = (
305
311
  },
306
312
  );
307
313
  setStatus(0 /* Idle */);
314
+ await saveAfterMutated();
308
315
  });
309
316
  }
310
317
  return persister;
@@ -323,6 +330,7 @@ const createCustomPersister = (
323
330
  loads++;
324
331
  setContentOrChanges(changes ?? content);
325
332
  setStatus(0 /* Idle */);
333
+ await saveAfterMutated();
326
334
  }
327
335
  } else {
328
336
  await load();
@@ -69,17 +69,18 @@ const collIsEmpty = (coll) => isUndefined(coll) || collSize(coll) == 0;
69
69
  const collForEach = (coll, cb) => coll?.forEach(cb);
70
70
  const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
71
71
 
72
- const mapNew = (entries) => new Map(entries);
73
- const mapGet = (map, key) => map?.get(key);
74
- const mapSet = (map, key, value) =>
75
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
76
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
77
- if (!collHas(map, key)) {
78
- mapSet(map, key, getDefaultValue());
72
+ const map = Map;
73
+ const mapNew = (entries) => new map(entries);
74
+ const mapGet = (map2, key) => map2?.get(key);
75
+ const mapSet = (map2, key, value) =>
76
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
77
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
78
+ if (!collHas(map2, key)) {
79
+ mapSet(map2, key, getDefaultValue());
79
80
  } else {
80
- hadExistingValue?.(mapGet(map, key));
81
+ hadExistingValue?.(mapGet(map2, key));
81
82
  }
82
- return mapGet(map, key);
83
+ return mapGet(map2, key);
83
84
  };
84
85
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
85
86
  ifNotUndefined(
@@ -281,6 +282,11 @@ const createCustomPersister = (
281
282
  ? store.applyChanges
282
283
  : store.setContent)(contentOrChanges);
283
284
  };
285
+ const saveAfterMutated = async () => {
286
+ if (isAutoSaving() && store.hadMutated?.()) {
287
+ await save();
288
+ }
289
+ };
284
290
  const load = async (initialContent) => {
285
291
  /* istanbul ignore else */
286
292
  if (status != 2 /* Saving */) {
@@ -305,6 +311,7 @@ const createCustomPersister = (
305
311
  },
306
312
  );
307
313
  setStatus(0 /* Idle */);
314
+ await saveAfterMutated();
308
315
  });
309
316
  }
310
317
  return persister;
@@ -323,6 +330,7 @@ const createCustomPersister = (
323
330
  loads++;
324
331
  setContentOrChanges(changes ?? content);
325
332
  setStatus(0 /* Idle */);
333
+ await saveAfterMutated();
326
334
  }
327
335
  } else {
328
336
  await load();