tinybase 8.0.0-beta.0 → 8.0.0-beta.1

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 (264) hide show
  1. package/@types/index.d.ts +1 -0
  2. package/@types/mergeable-store/with-schemas/index.d.ts +1 -1
  3. package/@types/middleware/index.d.ts +1064 -0
  4. package/@types/middleware/with-schemas/index.d.ts +1355 -0
  5. package/@types/omni/index.d.ts +1 -0
  6. package/@types/omni/with-schemas/index.d.ts +1 -0
  7. package/@types/store/index.d.ts +0 -1
  8. package/@types/with-schemas/index.d.ts +1 -0
  9. package/agents.md +33 -11
  10. package/checkpoints/index.js +20 -20
  11. package/checkpoints/with-schemas/index.js +20 -20
  12. package/common/index.js +3 -2
  13. package/common/with-schemas/index.js +3 -2
  14. package/index.js +574 -215
  15. package/indexes/index.js +13 -12
  16. package/indexes/with-schemas/index.js +13 -12
  17. package/mergeable-store/index.js +461 -197
  18. package/mergeable-store/with-schemas/index.js +461 -197
  19. package/metrics/index.js +13 -12
  20. package/metrics/with-schemas/index.js +13 -12
  21. package/middleware/index.js +130 -0
  22. package/middleware/with-schemas/index.js +130 -0
  23. package/min/checkpoints/index.js +1 -1
  24. package/min/checkpoints/index.js.gz +0 -0
  25. package/min/checkpoints/with-schemas/index.js +1 -1
  26. package/min/checkpoints/with-schemas/index.js.gz +0 -0
  27. package/min/common/index.js +1 -1
  28. package/min/common/index.js.gz +0 -0
  29. package/min/common/with-schemas/index.js +1 -1
  30. package/min/common/with-schemas/index.js.gz +0 -0
  31. package/min/index.js +1 -1
  32. package/min/index.js.gz +0 -0
  33. package/min/indexes/index.js +1 -1
  34. package/min/indexes/index.js.gz +0 -0
  35. package/min/indexes/with-schemas/index.js +1 -1
  36. package/min/indexes/with-schemas/index.js.gz +0 -0
  37. package/min/mergeable-store/index.js +1 -1
  38. package/min/mergeable-store/index.js.gz +0 -0
  39. package/min/mergeable-store/with-schemas/index.js +1 -1
  40. package/min/mergeable-store/with-schemas/index.js.gz +0 -0
  41. package/min/metrics/index.js +1 -1
  42. package/min/metrics/index.js.gz +0 -0
  43. package/min/metrics/with-schemas/index.js +1 -1
  44. package/min/metrics/with-schemas/index.js.gz +0 -0
  45. package/min/middleware/index.js +1 -0
  46. package/min/middleware/index.js.gz +0 -0
  47. package/min/middleware/with-schemas/index.js +1 -0
  48. package/min/middleware/with-schemas/index.js.gz +0 -0
  49. package/min/omni/index.js +1 -1
  50. package/min/omni/index.js.gz +0 -0
  51. package/min/omni/with-schemas/index.js +1 -1
  52. package/min/omni/with-schemas/index.js.gz +0 -0
  53. package/min/persisters/index.js +1 -1
  54. package/min/persisters/index.js.gz +0 -0
  55. package/min/persisters/persister-automerge/index.js +1 -1
  56. package/min/persisters/persister-automerge/index.js.gz +0 -0
  57. package/min/persisters/persister-automerge/with-schemas/index.js +1 -1
  58. package/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
  59. package/min/persisters/persister-browser/index.js +1 -1
  60. package/min/persisters/persister-browser/index.js.gz +0 -0
  61. package/min/persisters/persister-browser/with-schemas/index.js +1 -1
  62. package/min/persisters/persister-browser/with-schemas/index.js.gz +0 -0
  63. package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
  64. package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
  65. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
  66. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
  67. package/min/persisters/persister-durable-object-sql-storage/index.js +1 -1
  68. package/min/persisters/persister-durable-object-sql-storage/index.js.gz +0 -0
  69. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js +1 -1
  70. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js.gz +0 -0
  71. package/min/persisters/persister-durable-object-storage/index.js +1 -1
  72. package/min/persisters/persister-durable-object-storage/index.js.gz +0 -0
  73. package/min/persisters/persister-durable-object-storage/with-schemas/index.js +1 -1
  74. package/min/persisters/persister-durable-object-storage/with-schemas/index.js.gz +0 -0
  75. package/min/persisters/persister-electric-sql/index.js +1 -1
  76. package/min/persisters/persister-electric-sql/index.js.gz +0 -0
  77. package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
  78. package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
  79. package/min/persisters/persister-expo-sqlite/index.js +1 -1
  80. package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
  81. package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
  82. package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
  83. package/min/persisters/persister-file/index.js +1 -1
  84. package/min/persisters/persister-file/index.js.gz +0 -0
  85. package/min/persisters/persister-file/with-schemas/index.js +1 -1
  86. package/min/persisters/persister-file/with-schemas/index.js.gz +0 -0
  87. package/min/persisters/persister-indexed-db/index.js +1 -1
  88. package/min/persisters/persister-indexed-db/index.js.gz +0 -0
  89. package/min/persisters/persister-indexed-db/with-schemas/index.js +1 -1
  90. package/min/persisters/persister-indexed-db/with-schemas/index.js.gz +0 -0
  91. package/min/persisters/persister-libsql/index.js +1 -1
  92. package/min/persisters/persister-libsql/index.js.gz +0 -0
  93. package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
  94. package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
  95. package/min/persisters/persister-partykit-client/index.js +1 -1
  96. package/min/persisters/persister-partykit-client/index.js.gz +0 -0
  97. package/min/persisters/persister-partykit-client/with-schemas/index.js +1 -1
  98. package/min/persisters/persister-partykit-client/with-schemas/index.js.gz +0 -0
  99. package/min/persisters/persister-partykit-server/index.js +1 -1
  100. package/min/persisters/persister-partykit-server/index.js.gz +0 -0
  101. package/min/persisters/persister-partykit-server/with-schemas/index.js +1 -1
  102. package/min/persisters/persister-partykit-server/with-schemas/index.js.gz +0 -0
  103. package/min/persisters/persister-pglite/index.js +1 -1
  104. package/min/persisters/persister-pglite/index.js.gz +0 -0
  105. package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
  106. package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
  107. package/min/persisters/persister-postgres/index.js +1 -1
  108. package/min/persisters/persister-postgres/index.js.gz +0 -0
  109. package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
  110. package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
  111. package/min/persisters/persister-powersync/index.js +1 -1
  112. package/min/persisters/persister-powersync/index.js.gz +0 -0
  113. package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
  114. package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
  115. package/min/persisters/persister-react-native-mmkv/index.js +1 -1
  116. package/min/persisters/persister-react-native-mmkv/index.js.gz +0 -0
  117. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js +1 -1
  118. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js.gz +0 -0
  119. package/min/persisters/persister-react-native-sqlite/index.js +1 -1
  120. package/min/persisters/persister-react-native-sqlite/index.js.gz +0 -0
  121. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js +1 -1
  122. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js.gz +0 -0
  123. package/min/persisters/persister-remote/index.js +1 -1
  124. package/min/persisters/persister-remote/index.js.gz +0 -0
  125. package/min/persisters/persister-remote/with-schemas/index.js +1 -1
  126. package/min/persisters/persister-remote/with-schemas/index.js.gz +0 -0
  127. package/min/persisters/persister-sqlite-bun/index.js +1 -1
  128. package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
  129. package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -1
  130. package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
  131. package/min/persisters/persister-sqlite-wasm/index.js +1 -1
  132. package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
  133. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
  134. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
  135. package/min/persisters/persister-sqlite3/index.js +1 -1
  136. package/min/persisters/persister-sqlite3/index.js.gz +0 -0
  137. package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
  138. package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
  139. package/min/persisters/persister-yjs/index.js +1 -1
  140. package/min/persisters/persister-yjs/index.js.gz +0 -0
  141. package/min/persisters/persister-yjs/with-schemas/index.js +1 -1
  142. package/min/persisters/persister-yjs/with-schemas/index.js.gz +0 -0
  143. package/min/persisters/with-schemas/index.js +1 -1
  144. package/min/persisters/with-schemas/index.js.gz +0 -0
  145. package/min/queries/index.js +1 -1
  146. package/min/queries/index.js.gz +0 -0
  147. package/min/queries/with-schemas/index.js +1 -1
  148. package/min/queries/with-schemas/index.js.gz +0 -0
  149. package/min/relationships/index.js +1 -1
  150. package/min/relationships/index.js.gz +0 -0
  151. package/min/relationships/with-schemas/index.js +1 -1
  152. package/min/relationships/with-schemas/index.js.gz +0 -0
  153. package/min/store/index.js +1 -1
  154. package/min/store/index.js.gz +0 -0
  155. package/min/store/with-schemas/index.js +1 -1
  156. package/min/store/with-schemas/index.js.gz +0 -0
  157. package/min/synchronizers/index.js +1 -1
  158. package/min/synchronizers/index.js.gz +0 -0
  159. package/min/synchronizers/synchronizer-broadcast-channel/index.js +1 -1
  160. package/min/synchronizers/synchronizer-broadcast-channel/index.js.gz +0 -0
  161. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +1 -1
  162. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js.gz +0 -0
  163. package/min/synchronizers/synchronizer-local/index.js +1 -1
  164. package/min/synchronizers/synchronizer-local/index.js.gz +0 -0
  165. package/min/synchronizers/synchronizer-local/with-schemas/index.js +1 -1
  166. package/min/synchronizers/synchronizer-local/with-schemas/index.js.gz +0 -0
  167. package/min/synchronizers/synchronizer-ws-client/index.js +1 -1
  168. package/min/synchronizers/synchronizer-ws-client/index.js.gz +0 -0
  169. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js +1 -1
  170. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js.gz +0 -0
  171. package/min/synchronizers/synchronizer-ws-server/index.js +1 -1
  172. package/min/synchronizers/synchronizer-ws-server/index.js.gz +0 -0
  173. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js +1 -1
  174. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js.gz +0 -0
  175. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js +1 -1
  176. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js.gz +0 -0
  177. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +1 -1
  178. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js.gz +0 -0
  179. package/min/synchronizers/synchronizer-ws-server-simple/index.js +1 -1
  180. package/min/synchronizers/synchronizer-ws-server-simple/index.js.gz +0 -0
  181. package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +1 -1
  182. package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js.gz +0 -0
  183. package/min/synchronizers/with-schemas/index.js +1 -1
  184. package/min/synchronizers/with-schemas/index.js.gz +0 -0
  185. package/min/ui-react-inspector/index.js +1 -1
  186. package/min/ui-react-inspector/index.js.gz +0 -0
  187. package/min/ui-react-inspector/with-schemas/index.js +1 -1
  188. package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
  189. package/min/with-schemas/index.js +1 -1
  190. package/min/with-schemas/index.js.gz +0 -0
  191. package/omni/index.js +610 -232
  192. package/omni/with-schemas/index.js +610 -232
  193. package/package.json +55 -19
  194. package/persisters/index.js +29 -12
  195. package/persisters/persister-automerge/index.js +17 -9
  196. package/persisters/persister-automerge/with-schemas/index.js +17 -9
  197. package/persisters/persister-browser/index.js +34 -10
  198. package/persisters/persister-browser/with-schemas/index.js +34 -10
  199. package/persisters/persister-cr-sqlite-wasm/index.js +29 -12
  200. package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +29 -12
  201. package/persisters/persister-durable-object-sql-storage/index.js +29 -12
  202. package/persisters/persister-durable-object-sql-storage/with-schemas/index.js +29 -12
  203. package/persisters/persister-durable-object-storage/index.js +24 -17
  204. package/persisters/persister-durable-object-storage/with-schemas/index.js +24 -17
  205. package/persisters/persister-electric-sql/index.js +29 -12
  206. package/persisters/persister-electric-sql/with-schemas/index.js +29 -12
  207. package/persisters/persister-expo-sqlite/index.js +29 -12
  208. package/persisters/persister-expo-sqlite/with-schemas/index.js +29 -12
  209. package/persisters/persister-file/index.js +34 -10
  210. package/persisters/persister-file/with-schemas/index.js +34 -10
  211. package/persisters/persister-indexed-db/index.js +17 -9
  212. package/persisters/persister-indexed-db/with-schemas/index.js +17 -9
  213. package/persisters/persister-libsql/index.js +29 -12
  214. package/persisters/persister-libsql/with-schemas/index.js +29 -12
  215. package/persisters/persister-partykit-client/index.js +44 -11
  216. package/persisters/persister-partykit-client/with-schemas/index.js +44 -11
  217. package/persisters/persister-partykit-server/index.js +39 -4
  218. package/persisters/persister-partykit-server/with-schemas/index.js +39 -4
  219. package/persisters/persister-pglite/index.js +29 -12
  220. package/persisters/persister-pglite/with-schemas/index.js +29 -12
  221. package/persisters/persister-postgres/index.js +29 -12
  222. package/persisters/persister-postgres/with-schemas/index.js +29 -12
  223. package/persisters/persister-powersync/index.js +29 -12
  224. package/persisters/persister-powersync/with-schemas/index.js +29 -12
  225. package/persisters/persister-react-native-mmkv/index.js +17 -9
  226. package/persisters/persister-react-native-mmkv/with-schemas/index.js +17 -9
  227. package/persisters/persister-react-native-sqlite/index.js +29 -12
  228. package/persisters/persister-react-native-sqlite/with-schemas/index.js +29 -12
  229. package/persisters/persister-remote/index.js +17 -9
  230. package/persisters/persister-remote/with-schemas/index.js +17 -9
  231. package/persisters/persister-sqlite-bun/index.js +29 -12
  232. package/persisters/persister-sqlite-bun/with-schemas/index.js +29 -12
  233. package/persisters/persister-sqlite-wasm/index.js +29 -12
  234. package/persisters/persister-sqlite-wasm/with-schemas/index.js +29 -12
  235. package/persisters/persister-sqlite3/index.js +29 -12
  236. package/persisters/persister-sqlite3/with-schemas/index.js +29 -12
  237. package/persisters/persister-yjs/index.js +19 -11
  238. package/persisters/persister-yjs/with-schemas/index.js +19 -11
  239. package/persisters/with-schemas/index.js +29 -12
  240. package/queries/index.js +16 -20
  241. package/queries/with-schemas/index.js +16 -20
  242. package/readme.md +21 -13
  243. package/relationships/index.js +13 -12
  244. package/relationships/with-schemas/index.js +13 -12
  245. package/releases.md +41 -41
  246. package/store/index.js +442 -192
  247. package/store/with-schemas/index.js +442 -192
  248. package/synchronizers/index.js +17 -9
  249. package/synchronizers/synchronizer-broadcast-channel/index.js +17 -9
  250. package/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +17 -9
  251. package/synchronizers/synchronizer-local/index.js +19 -11
  252. package/synchronizers/synchronizer-local/with-schemas/index.js +19 -11
  253. package/synchronizers/synchronizer-ws-client/index.js +31 -10
  254. package/synchronizers/synchronizer-ws-client/with-schemas/index.js +31 -10
  255. package/synchronizers/synchronizer-ws-server/index.js +34 -13
  256. package/synchronizers/synchronizer-ws-server/with-schemas/index.js +34 -13
  257. package/synchronizers/synchronizer-ws-server-durable-object/index.js +31 -10
  258. package/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +31 -10
  259. package/synchronizers/synchronizer-ws-server-simple/index.js +11 -10
  260. package/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +11 -10
  261. package/synchronizers/with-schemas/index.js +17 -9
  262. package/ui-react-inspector/index.js +438 -193
  263. package/ui-react-inspector/with-schemas/index.js +438 -193
  264. package/with-schemas/index.js +574 -215
@@ -67,6 +67,10 @@ const objNew = (entries = []) => object.fromEntries(entries);
67
67
  const objHas = (obj, id) => id in obj;
68
68
  const objForEach = (obj, cb) =>
69
69
  arrayForEach(objEntries(obj), ([id, value]) => cb(value, id));
70
+ const objToArray = (obj, cb) =>
71
+ arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
72
+ const objMap = (obj, cb) =>
73
+ objNew(objToArray(obj, (value, id) => [id, cb(value, id)]));
70
74
  const objValues = (obj) => object.values(obj);
71
75
  const objSize = (obj) => size(objIds(obj));
72
76
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
@@ -82,7 +86,16 @@ const jsonParse = JSON.parse;
82
86
  const jsonStringWithUndefined = (obj) =>
83
87
  jsonString(obj, (_key, value) => (isUndefined(value) ? UNDEFINED : value));
84
88
  const jsonParseWithUndefined = (str) =>
85
- jsonParse(str, (_key, value) => (value === UNDEFINED ? void 0 : value));
89
+ // JSON.parse reviver removes properties with undefined values
90
+ replaceUndefinedString(jsonParse(str));
91
+ const replaceUndefinedString = (obj) =>
92
+ obj === UNDEFINED
93
+ ? void 0
94
+ : isArray(obj)
95
+ ? arrayMap(obj, replaceUndefinedString)
96
+ : isObject(obj)
97
+ ? objMap(obj, replaceUndefinedString)
98
+ : obj;
86
99
 
87
100
  const MESSAGE_SEPARATOR = '\n';
88
101
  const ifPayloadValid = (payload, then) => {
@@ -106,17 +119,18 @@ const collIsEmpty = (coll) => isUndefined(coll) || collSize(coll) == 0;
106
119
  const collForEach = (coll, cb) => coll?.forEach(cb);
107
120
  const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
108
121
 
109
- const mapNew = (entries) => new Map(entries);
110
- const mapGet = (map, key) => map?.get(key);
111
- const mapSet = (map, key, value) =>
112
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
113
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
114
- if (!collHas(map, key)) {
115
- mapSet(map, key, getDefaultValue());
122
+ const map = Map;
123
+ const mapNew = (entries) => new map(entries);
124
+ const mapGet = (map2, key) => map2?.get(key);
125
+ const mapSet = (map2, key, value) =>
126
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
127
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
128
+ if (!collHas(map2, key)) {
129
+ mapSet(map2, key, getDefaultValue());
116
130
  } else {
117
- hadExistingValue?.(mapGet(map, key));
131
+ hadExistingValue?.(mapGet(map2, key));
118
132
  }
119
- return mapGet(map, key);
133
+ return mapGet(map2, key);
120
134
  };
121
135
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
122
136
  ifNotUndefined(
@@ -340,6 +354,11 @@ const createCustomPersister = (
340
354
  ? store.applyChanges
341
355
  : store.setContent)(contentOrChanges);
342
356
  };
357
+ const saveAfterMutated = async () => {
358
+ if (isAutoSaving() && store.hadMutated?.()) {
359
+ await save();
360
+ }
361
+ };
343
362
  const load = async (initialContent) => {
344
363
  /* istanbul ignore else */
345
364
  if (status != 2 /* Saving */) {
@@ -364,6 +383,7 @@ const createCustomPersister = (
364
383
  },
365
384
  );
366
385
  setStatus(0 /* Idle */);
386
+ await saveAfterMutated();
367
387
  });
368
388
  }
369
389
  return persister;
@@ -382,6 +402,7 @@ const createCustomPersister = (
382
402
  loads++;
383
403
  setContentOrChanges(changes ?? content);
384
404
  setStatus(0 /* Idle */);
405
+ await saveAfterMutated();
385
406
  }
386
407
  } else {
387
408
  await load();
@@ -67,6 +67,10 @@ const objNew = (entries = []) => object.fromEntries(entries);
67
67
  const objHas = (obj, id) => id in obj;
68
68
  const objForEach = (obj, cb) =>
69
69
  arrayForEach(objEntries(obj), ([id, value]) => cb(value, id));
70
+ const objToArray = (obj, cb) =>
71
+ arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
72
+ const objMap = (obj, cb) =>
73
+ objNew(objToArray(obj, (value, id) => [id, cb(value, id)]));
70
74
  const objValues = (obj) => object.values(obj);
71
75
  const objSize = (obj) => size(objIds(obj));
72
76
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
@@ -82,7 +86,16 @@ const jsonParse = JSON.parse;
82
86
  const jsonStringWithUndefined = (obj) =>
83
87
  jsonString(obj, (_key, value) => (isUndefined(value) ? UNDEFINED : value));
84
88
  const jsonParseWithUndefined = (str) =>
85
- jsonParse(str, (_key, value) => (value === UNDEFINED ? void 0 : value));
89
+ // JSON.parse reviver removes properties with undefined values
90
+ replaceUndefinedString(jsonParse(str));
91
+ const replaceUndefinedString = (obj) =>
92
+ obj === UNDEFINED
93
+ ? void 0
94
+ : isArray(obj)
95
+ ? arrayMap(obj, replaceUndefinedString)
96
+ : isObject(obj)
97
+ ? objMap(obj, replaceUndefinedString)
98
+ : obj;
86
99
 
87
100
  const MESSAGE_SEPARATOR = '\n';
88
101
  const ifPayloadValid = (payload, then) => {
@@ -106,17 +119,18 @@ const collIsEmpty = (coll) => isUndefined(coll) || collSize(coll) == 0;
106
119
  const collForEach = (coll, cb) => coll?.forEach(cb);
107
120
  const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
108
121
 
109
- const mapNew = (entries) => new Map(entries);
110
- const mapGet = (map, key) => map?.get(key);
111
- const mapSet = (map, key, value) =>
112
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
113
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
114
- if (!collHas(map, key)) {
115
- mapSet(map, key, getDefaultValue());
122
+ const map = Map;
123
+ const mapNew = (entries) => new map(entries);
124
+ const mapGet = (map2, key) => map2?.get(key);
125
+ const mapSet = (map2, key, value) =>
126
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
127
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
128
+ if (!collHas(map2, key)) {
129
+ mapSet(map2, key, getDefaultValue());
116
130
  } else {
117
- hadExistingValue?.(mapGet(map, key));
131
+ hadExistingValue?.(mapGet(map2, key));
118
132
  }
119
- return mapGet(map, key);
133
+ return mapGet(map2, key);
120
134
  };
121
135
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
122
136
  ifNotUndefined(
@@ -340,6 +354,11 @@ const createCustomPersister = (
340
354
  ? store.applyChanges
341
355
  : store.setContent)(contentOrChanges);
342
356
  };
357
+ const saveAfterMutated = async () => {
358
+ if (isAutoSaving() && store.hadMutated?.()) {
359
+ await save();
360
+ }
361
+ };
343
362
  const load = async (initialContent) => {
344
363
  /* istanbul ignore else */
345
364
  if (status != 2 /* Saving */) {
@@ -364,6 +383,7 @@ const createCustomPersister = (
364
383
  },
365
384
  );
366
385
  setStatus(0 /* Idle */);
386
+ await saveAfterMutated();
367
387
  });
368
388
  }
369
389
  return persister;
@@ -382,6 +402,7 @@ const createCustomPersister = (
382
402
  loads++;
383
403
  setContentOrChanges(changes ?? content);
384
404
  setStatus(0 /* Idle */);
405
+ await saveAfterMutated();
385
406
  }
386
407
  } else {
387
408
  await load();
@@ -19,17 +19,18 @@ const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
19
19
  const object = Object;
20
20
  const objFreeze = object.freeze;
21
21
 
22
- const mapNew = (entries) => new Map(entries);
23
- const mapGet = (map, key) => map?.get(key);
24
- const mapForEach = (map, cb) =>
25
- collForEach(map, (value, key) => cb(key, value));
26
- const mapSet = (map, key, value) =>
27
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
28
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
29
- if (!collHas(map, key)) {
30
- mapSet(map, key, getDefaultValue());
22
+ const map = Map;
23
+ const mapNew = (entries) => new map(entries);
24
+ const mapGet = (map2, key) => map2?.get(key);
25
+ const mapForEach = (map2, cb) =>
26
+ collForEach(map2, (value, key) => cb(key, value));
27
+ const mapSet = (map2, key, value) =>
28
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
29
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
30
+ if (!collHas(map2, key)) {
31
+ mapSet(map2, key, getDefaultValue());
31
32
  }
32
- return mapGet(map, key);
33
+ return mapGet(map2, key);
33
34
  };
34
35
 
35
36
  const MESSAGE_SEPARATOR = '\n';
@@ -19,17 +19,18 @@ const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
19
19
  const object = Object;
20
20
  const objFreeze = object.freeze;
21
21
 
22
- const mapNew = (entries) => new Map(entries);
23
- const mapGet = (map, key) => map?.get(key);
24
- const mapForEach = (map, cb) =>
25
- collForEach(map, (value, key) => cb(key, value));
26
- const mapSet = (map, key, value) =>
27
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
28
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
29
- if (!collHas(map, key)) {
30
- mapSet(map, key, getDefaultValue());
22
+ const map = Map;
23
+ const mapNew = (entries) => new map(entries);
24
+ const mapGet = (map2, key) => map2?.get(key);
25
+ const mapForEach = (map2, cb) =>
26
+ collForEach(map2, (value, key) => cb(key, value));
27
+ const mapSet = (map2, key, value) =>
28
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
29
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
30
+ if (!collHas(map2, key)) {
31
+ mapSet(map2, key, getDefaultValue());
31
32
  }
32
- return mapGet(map, key);
33
+ return mapGet(map2, key);
33
34
  };
34
35
 
35
36
  const MESSAGE_SEPARATOR = '\n';
@@ -75,17 +75,18 @@ const objEnsure = (obj, id, getDefaultValue) => {
75
75
  return obj[id];
76
76
  };
77
77
 
78
- const mapNew = (entries) => new Map(entries);
79
- const mapGet = (map, key) => map?.get(key);
80
- const mapSet = (map, key, value) =>
81
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
82
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
83
- if (!collHas(map, key)) {
84
- mapSet(map, key, getDefaultValue());
78
+ const map = Map;
79
+ const mapNew = (entries) => new map(entries);
80
+ const mapGet = (map2, key) => map2?.get(key);
81
+ const mapSet = (map2, key, value) =>
82
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
83
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
84
+ if (!collHas(map2, key)) {
85
+ mapSet(map2, key, getDefaultValue());
85
86
  } else {
86
- hadExistingValue?.(mapGet(map, key));
87
+ hadExistingValue?.(mapGet(map2, key));
87
88
  }
88
- return mapGet(map, key);
89
+ return mapGet(map2, key);
89
90
  };
90
91
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
91
92
  ifNotUndefined(
@@ -309,6 +310,11 @@ const createCustomPersister = (
309
310
  ? store.applyChanges
310
311
  : store.setContent)(contentOrChanges);
311
312
  };
313
+ const saveAfterMutated = async () => {
314
+ if (isAutoSaving() && store.hadMutated?.()) {
315
+ await save();
316
+ }
317
+ };
312
318
  const load = async (initialContent) => {
313
319
  /* istanbul ignore else */
314
320
  if (status != 2 /* Saving */) {
@@ -333,6 +339,7 @@ const createCustomPersister = (
333
339
  },
334
340
  );
335
341
  setStatus(0 /* Idle */);
342
+ await saveAfterMutated();
336
343
  });
337
344
  }
338
345
  return persister;
@@ -351,6 +358,7 @@ const createCustomPersister = (
351
358
  loads++;
352
359
  setContentOrChanges(changes ?? content);
353
360
  setStatus(0 /* Idle */);
361
+ await saveAfterMutated();
354
362
  }
355
363
  } else {
356
364
  await load();