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
@@ -26,12 +26,14 @@ const tryCatch = async (action, then1, then2) => {
26
26
  };
27
27
 
28
28
  const arrayForEach = (array, cb) => array.forEach(cb);
29
+ const arrayMap = (array, cb) => array.map(cb);
29
30
  const arrayClear = (array, to) => array.splice(0, to);
30
31
  const arrayPush = (array, ...values) => array.push(...values);
31
32
  const arrayShift = (array) => array.shift();
32
33
 
33
34
  const object = Object;
34
35
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
36
+ const objEntries = object.entries;
35
37
  const isObject = (obj) =>
36
38
  !isNullish(obj) &&
37
39
  ifNotNullish(
@@ -45,6 +47,11 @@ const isObject = (obj) =>
45
47
  );
46
48
  const objIds = object.keys;
47
49
  const objFreeze = object.freeze;
50
+ const objNew = (entries = []) => object.fromEntries(entries);
51
+ const objToArray = (obj, cb) =>
52
+ arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
53
+ const objMap = (obj, cb) =>
54
+ objNew(objToArray(obj, (value, id) => [id, cb(value, id)]));
48
55
  const objSize = (obj) => size(objIds(obj));
49
56
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
50
57
 
@@ -53,7 +60,16 @@ const jsonParse = JSON.parse;
53
60
  const jsonStringWithUndefined = (obj) =>
54
61
  jsonString(obj, (_key, value) => (isUndefined(value) ? UNDEFINED : value));
55
62
  const jsonParseWithUndefined = (str) =>
56
- jsonParse(str, (_key, value) => (value === UNDEFINED ? void 0 : value));
63
+ // JSON.parse reviver removes properties with undefined values
64
+ replaceUndefinedString(jsonParse(str));
65
+ const replaceUndefinedString = (obj) =>
66
+ obj === UNDEFINED
67
+ ? void 0
68
+ : isArray(obj)
69
+ ? arrayMap(obj, replaceUndefinedString)
70
+ : isObject(obj)
71
+ ? objMap(obj, replaceUndefinedString)
72
+ : obj;
57
73
 
58
74
  const collSize = (coll) => coll?.size ?? 0;
59
75
  const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
@@ -61,17 +77,18 @@ const collIsEmpty = (coll) => isUndefined(coll) || collSize(coll) == 0;
61
77
  const collForEach = (coll, cb) => coll?.forEach(cb);
62
78
  const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
63
79
 
64
- const mapNew = (entries) => new Map(entries);
65
- const mapGet = (map, key) => map?.get(key);
66
- const mapSet = (map, key, value) =>
67
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
68
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
69
- if (!collHas(map, key)) {
70
- mapSet(map, key, getDefaultValue());
80
+ const map = Map;
81
+ const mapNew = (entries) => new map(entries);
82
+ const mapGet = (map2, key) => map2?.get(key);
83
+ const mapSet = (map2, key, value) =>
84
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
85
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
86
+ if (!collHas(map2, key)) {
87
+ mapSet(map2, key, getDefaultValue());
71
88
  } else {
72
- hadExistingValue?.(mapGet(map, key));
89
+ hadExistingValue?.(mapGet(map2, key));
73
90
  }
74
- return mapGet(map, key);
91
+ return mapGet(map2, key);
75
92
  };
76
93
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
77
94
  ifNotUndefined(
@@ -273,6 +290,11 @@ const createCustomPersister = (
273
290
  ? store.applyChanges
274
291
  : store.setContent)(contentOrChanges);
275
292
  };
293
+ const saveAfterMutated = async () => {
294
+ if (isAutoSaving() && store.hadMutated?.()) {
295
+ await save();
296
+ }
297
+ };
276
298
  const load = async (initialContent) => {
277
299
  /* istanbul ignore else */
278
300
  if (status != 2 /* Saving */) {
@@ -297,6 +319,7 @@ const createCustomPersister = (
297
319
  },
298
320
  );
299
321
  setStatus(0 /* Idle */);
322
+ await saveAfterMutated();
300
323
  });
301
324
  }
302
325
  return persister;
@@ -315,6 +338,7 @@ const createCustomPersister = (
315
338
  loads++;
316
339
  setContentOrChanges(changes ?? content);
317
340
  setStatus(0 /* Idle */);
341
+ await saveAfterMutated();
318
342
  }
319
343
  } else {
320
344
  await load();
@@ -26,12 +26,14 @@ const tryCatch = async (action, then1, then2) => {
26
26
  };
27
27
 
28
28
  const arrayForEach = (array, cb) => array.forEach(cb);
29
+ const arrayMap = (array, cb) => array.map(cb);
29
30
  const arrayClear = (array, to) => array.splice(0, to);
30
31
  const arrayPush = (array, ...values) => array.push(...values);
31
32
  const arrayShift = (array) => array.shift();
32
33
 
33
34
  const object = Object;
34
35
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
36
+ const objEntries = object.entries;
35
37
  const isObject = (obj) =>
36
38
  !isNullish(obj) &&
37
39
  ifNotNullish(
@@ -45,6 +47,11 @@ const isObject = (obj) =>
45
47
  );
46
48
  const objIds = object.keys;
47
49
  const objFreeze = object.freeze;
50
+ const objNew = (entries = []) => object.fromEntries(entries);
51
+ const objToArray = (obj, cb) =>
52
+ arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
53
+ const objMap = (obj, cb) =>
54
+ objNew(objToArray(obj, (value, id) => [id, cb(value, id)]));
48
55
  const objSize = (obj) => size(objIds(obj));
49
56
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
50
57
 
@@ -53,7 +60,16 @@ const jsonParse = JSON.parse;
53
60
  const jsonStringWithUndefined = (obj) =>
54
61
  jsonString(obj, (_key, value) => (isUndefined(value) ? UNDEFINED : value));
55
62
  const jsonParseWithUndefined = (str) =>
56
- jsonParse(str, (_key, value) => (value === UNDEFINED ? void 0 : value));
63
+ // JSON.parse reviver removes properties with undefined values
64
+ replaceUndefinedString(jsonParse(str));
65
+ const replaceUndefinedString = (obj) =>
66
+ obj === UNDEFINED
67
+ ? void 0
68
+ : isArray(obj)
69
+ ? arrayMap(obj, replaceUndefinedString)
70
+ : isObject(obj)
71
+ ? objMap(obj, replaceUndefinedString)
72
+ : obj;
57
73
 
58
74
  const collSize = (coll) => coll?.size ?? 0;
59
75
  const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
@@ -61,17 +77,18 @@ const collIsEmpty = (coll) => isUndefined(coll) || collSize(coll) == 0;
61
77
  const collForEach = (coll, cb) => coll?.forEach(cb);
62
78
  const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
63
79
 
64
- const mapNew = (entries) => new Map(entries);
65
- const mapGet = (map, key) => map?.get(key);
66
- const mapSet = (map, key, value) =>
67
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
68
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
69
- if (!collHas(map, key)) {
70
- mapSet(map, key, getDefaultValue());
80
+ const map = Map;
81
+ const mapNew = (entries) => new map(entries);
82
+ const mapGet = (map2, key) => map2?.get(key);
83
+ const mapSet = (map2, key, value) =>
84
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
85
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
86
+ if (!collHas(map2, key)) {
87
+ mapSet(map2, key, getDefaultValue());
71
88
  } else {
72
- hadExistingValue?.(mapGet(map, key));
89
+ hadExistingValue?.(mapGet(map2, key));
73
90
  }
74
- return mapGet(map, key);
91
+ return mapGet(map2, key);
75
92
  };
76
93
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
77
94
  ifNotUndefined(
@@ -273,6 +290,11 @@ const createCustomPersister = (
273
290
  ? store.applyChanges
274
291
  : store.setContent)(contentOrChanges);
275
292
  };
293
+ const saveAfterMutated = async () => {
294
+ if (isAutoSaving() && store.hadMutated?.()) {
295
+ await save();
296
+ }
297
+ };
276
298
  const load = async (initialContent) => {
277
299
  /* istanbul ignore else */
278
300
  if (status != 2 /* Saving */) {
@@ -297,6 +319,7 @@ const createCustomPersister = (
297
319
  },
298
320
  );
299
321
  setStatus(0 /* Idle */);
322
+ await saveAfterMutated();
300
323
  });
301
324
  }
302
325
  return persister;
@@ -315,6 +338,7 @@ const createCustomPersister = (
315
338
  loads++;
316
339
  setContentOrChanges(changes ?? content);
317
340
  setStatus(0 /* Idle */);
341
+ await saveAfterMutated();
318
342
  }
319
343
  } else {
320
344
  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();
@@ -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();
@@ -99,7 +99,16 @@ const jsonParse = JSON.parse;
99
99
  const jsonStringWithUndefined = (obj) =>
100
100
  jsonString(obj, (_key, value) => (isUndefined(value) ? UNDEFINED : value));
101
101
  const jsonParseWithUndefined = (str) =>
102
- jsonParse(str, (_key, value) => (value === UNDEFINED ? void 0 : value));
102
+ // JSON.parse reviver removes properties with undefined values
103
+ replaceUndefinedString(jsonParse(str));
104
+ const replaceUndefinedString = (obj) =>
105
+ obj === UNDEFINED
106
+ ? void 0
107
+ : isArray(obj)
108
+ ? arrayMap(obj, replaceUndefinedString)
109
+ : isObject(obj)
110
+ ? objMap(obj, replaceUndefinedString)
111
+ : obj;
103
112
 
104
113
  const collSize = (coll) => coll?.size ?? 0;
105
114
  const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
@@ -109,21 +118,22 @@ const collClear = (coll) => coll.clear();
109
118
  const collForEach = (coll, cb) => coll?.forEach(cb);
110
119
  const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
111
120
 
112
- const mapNew = (entries) => new Map(entries);
113
- const mapGet = (map, key) => map?.get(key);
114
- const mapForEach = (map, cb) =>
115
- collForEach(map, (value, key) => cb(key, value));
121
+ const map = Map;
122
+ const mapNew = (entries) => new map(entries);
123
+ const mapGet = (map2, key) => map2?.get(key);
124
+ const mapForEach = (map2, cb) =>
125
+ collForEach(map2, (value, key) => cb(key, value));
116
126
  const mapMap = (coll, cb) =>
117
127
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
118
- const mapSet = (map, key, value) =>
119
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
120
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
121
- if (!collHas(map, key)) {
122
- mapSet(map, key, getDefaultValue());
128
+ const mapSet = (map2, key, value) =>
129
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
130
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
131
+ if (!collHas(map2, key)) {
132
+ mapSet(map2, key, getDefaultValue());
123
133
  } else {
124
- hadExistingValue?.(mapGet(map, key));
134
+ hadExistingValue?.(mapGet(map2, key));
125
135
  }
126
- return mapGet(map, key);
136
+ return mapGet(map2, key);
127
137
  };
128
138
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
129
139
  ifNotUndefined(
@@ -333,6 +343,11 @@ const createCustomPersister = (
333
343
  ? store.applyChanges
334
344
  : store.setContent)(contentOrChanges);
335
345
  };
346
+ const saveAfterMutated = async () => {
347
+ if (isAutoSaving() && store.hadMutated?.()) {
348
+ await save();
349
+ }
350
+ };
336
351
  const load = async (initialContent) => {
337
352
  /* istanbul ignore else */
338
353
  if (status != 2 /* Saving */) {
@@ -357,6 +372,7 @@ const createCustomPersister = (
357
372
  },
358
373
  );
359
374
  setStatus(0 /* Idle */);
375
+ await saveAfterMutated();
360
376
  });
361
377
  }
362
378
  return persister;
@@ -375,6 +391,7 @@ const createCustomPersister = (
375
391
  loads++;
376
392
  setContentOrChanges(changes ?? content);
377
393
  setStatus(0 /* Idle */);
394
+ await saveAfterMutated();
378
395
  }
379
396
  } else {
380
397
  await load();
@@ -99,7 +99,16 @@ const jsonParse = JSON.parse;
99
99
  const jsonStringWithUndefined = (obj) =>
100
100
  jsonString(obj, (_key, value) => (isUndefined(value) ? UNDEFINED : value));
101
101
  const jsonParseWithUndefined = (str) =>
102
- jsonParse(str, (_key, value) => (value === UNDEFINED ? void 0 : value));
102
+ // JSON.parse reviver removes properties with undefined values
103
+ replaceUndefinedString(jsonParse(str));
104
+ const replaceUndefinedString = (obj) =>
105
+ obj === UNDEFINED
106
+ ? void 0
107
+ : isArray(obj)
108
+ ? arrayMap(obj, replaceUndefinedString)
109
+ : isObject(obj)
110
+ ? objMap(obj, replaceUndefinedString)
111
+ : obj;
103
112
 
104
113
  const collSize = (coll) => coll?.size ?? 0;
105
114
  const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
@@ -109,21 +118,22 @@ const collClear = (coll) => coll.clear();
109
118
  const collForEach = (coll, cb) => coll?.forEach(cb);
110
119
  const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
111
120
 
112
- const mapNew = (entries) => new Map(entries);
113
- const mapGet = (map, key) => map?.get(key);
114
- const mapForEach = (map, cb) =>
115
- collForEach(map, (value, key) => cb(key, value));
121
+ const map = Map;
122
+ const mapNew = (entries) => new map(entries);
123
+ const mapGet = (map2, key) => map2?.get(key);
124
+ const mapForEach = (map2, cb) =>
125
+ collForEach(map2, (value, key) => cb(key, value));
116
126
  const mapMap = (coll, cb) =>
117
127
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
118
- const mapSet = (map, key, value) =>
119
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
120
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
121
- if (!collHas(map, key)) {
122
- mapSet(map, key, getDefaultValue());
128
+ const mapSet = (map2, key, value) =>
129
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
130
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
131
+ if (!collHas(map2, key)) {
132
+ mapSet(map2, key, getDefaultValue());
123
133
  } else {
124
- hadExistingValue?.(mapGet(map, key));
134
+ hadExistingValue?.(mapGet(map2, key));
125
135
  }
126
- return mapGet(map, key);
136
+ return mapGet(map2, key);
127
137
  };
128
138
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
129
139
  ifNotUndefined(
@@ -333,6 +343,11 @@ const createCustomPersister = (
333
343
  ? store.applyChanges
334
344
  : store.setContent)(contentOrChanges);
335
345
  };
346
+ const saveAfterMutated = async () => {
347
+ if (isAutoSaving() && store.hadMutated?.()) {
348
+ await save();
349
+ }
350
+ };
336
351
  const load = async (initialContent) => {
337
352
  /* istanbul ignore else */
338
353
  if (status != 2 /* Saving */) {
@@ -357,6 +372,7 @@ const createCustomPersister = (
357
372
  },
358
373
  );
359
374
  setStatus(0 /* Idle */);
375
+ await saveAfterMutated();
360
376
  });
361
377
  }
362
378
  return persister;
@@ -375,6 +391,7 @@ const createCustomPersister = (
375
391
  loads++;
376
392
  setContentOrChanges(changes ?? content);
377
393
  setStatus(0 /* Idle */);
394
+ await saveAfterMutated();
378
395
  }
379
396
  } else {
380
397
  await load();
@@ -71,21 +71,22 @@ const collIsEmpty = (coll) => isUndefined(coll) || collSize(coll) == 0;
71
71
  const collForEach = (coll, cb) => coll?.forEach(cb);
72
72
  const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
73
73
 
74
- const mapNew = (entries) => new Map(entries);
75
- const mapGet = (map, key) => map?.get(key);
76
- const mapSet = (map, key, value) =>
77
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
78
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
79
- if (!collHas(map, key)) {
80
- mapSet(map, key, getDefaultValue());
74
+ const map = Map;
75
+ const mapNew = (entries) => new map(entries);
76
+ const mapGet = (map2, key) => map2?.get(key);
77
+ const mapSet = (map2, key, value) =>
78
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
79
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
80
+ if (!collHas(map2, key)) {
81
+ mapSet(map2, key, getDefaultValue());
81
82
  } else {
82
- hadExistingValue?.(mapGet(map, key));
83
+ hadExistingValue?.(mapGet(map2, key));
83
84
  }
84
- return mapGet(map, key);
85
+ return mapGet(map2, key);
85
86
  };
86
- const mapToObj = (map, valueMapper, excludeMapValue, excludeObjValue) => {
87
+ const mapToObj = (map2, valueMapper, excludeMapValue, excludeObjValue) => {
87
88
  const obj = {};
88
- collForEach(map, (mapValue, id) => {
89
+ collForEach(map2, (mapValue, id) => {
89
90
  {
90
91
  const objValue = mapValue;
91
92
  {
@@ -303,6 +304,11 @@ const createCustomPersister = (
303
304
  ? store.applyChanges
304
305
  : store.setContent)(contentOrChanges);
305
306
  };
307
+ const saveAfterMutated = async () => {
308
+ if (isAutoSaving() && store.hadMutated?.()) {
309
+ await save();
310
+ }
311
+ };
306
312
  const load = async (initialContent) => {
307
313
  /* istanbul ignore else */
308
314
  if (status != 2 /* Saving */) {
@@ -327,6 +333,7 @@ const createCustomPersister = (
327
333
  },
328
334
  );
329
335
  setStatus(0 /* Idle */);
336
+ await saveAfterMutated();
330
337
  });
331
338
  }
332
339
  return persister;
@@ -345,6 +352,7 @@ const createCustomPersister = (
345
352
  loads++;
346
353
  setContentOrChanges(changes ?? content);
347
354
  setStatus(0 /* Idle */);
355
+ await saveAfterMutated();
348
356
  }
349
357
  } else {
350
358
  await load();
@@ -71,21 +71,22 @@ const collIsEmpty = (coll) => isUndefined(coll) || collSize(coll) == 0;
71
71
  const collForEach = (coll, cb) => coll?.forEach(cb);
72
72
  const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
73
73
 
74
- const mapNew = (entries) => new Map(entries);
75
- const mapGet = (map, key) => map?.get(key);
76
- const mapSet = (map, key, value) =>
77
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
78
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
79
- if (!collHas(map, key)) {
80
- mapSet(map, key, getDefaultValue());
74
+ const map = Map;
75
+ const mapNew = (entries) => new map(entries);
76
+ const mapGet = (map2, key) => map2?.get(key);
77
+ const mapSet = (map2, key, value) =>
78
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
79
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
80
+ if (!collHas(map2, key)) {
81
+ mapSet(map2, key, getDefaultValue());
81
82
  } else {
82
- hadExistingValue?.(mapGet(map, key));
83
+ hadExistingValue?.(mapGet(map2, key));
83
84
  }
84
- return mapGet(map, key);
85
+ return mapGet(map2, key);
85
86
  };
86
- const mapToObj = (map, valueMapper, excludeMapValue, excludeObjValue) => {
87
+ const mapToObj = (map2, valueMapper, excludeMapValue, excludeObjValue) => {
87
88
  const obj = {};
88
- collForEach(map, (mapValue, id) => {
89
+ collForEach(map2, (mapValue, id) => {
89
90
  {
90
91
  const objValue = mapValue;
91
92
  {
@@ -303,6 +304,11 @@ const createCustomPersister = (
303
304
  ? store.applyChanges
304
305
  : store.setContent)(contentOrChanges);
305
306
  };
307
+ const saveAfterMutated = async () => {
308
+ if (isAutoSaving() && store.hadMutated?.()) {
309
+ await save();
310
+ }
311
+ };
306
312
  const load = async (initialContent) => {
307
313
  /* istanbul ignore else */
308
314
  if (status != 2 /* Saving */) {
@@ -327,6 +333,7 @@ const createCustomPersister = (
327
333
  },
328
334
  );
329
335
  setStatus(0 /* Idle */);
336
+ await saveAfterMutated();
330
337
  });
331
338
  }
332
339
  return persister;
@@ -345,6 +352,7 @@ const createCustomPersister = (
345
352
  loads++;
346
353
  setContentOrChanges(changes ?? content);
347
354
  setStatus(0 /* Idle */);
355
+ await saveAfterMutated();
348
356
  }
349
357
  } else {
350
358
  await load();