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.
- package/checkpoints/index.js +12 -11
- package/checkpoints/with-schemas/index.js +12 -11
- package/common/index.js +3 -2
- package/common/with-schemas/index.js +3 -2
- package/index.js +92 -64
- package/indexes/index.js +13 -12
- package/indexes/with-schemas/index.js +13 -12
- package/mergeable-store/index.js +92 -64
- package/mergeable-store/with-schemas/index.js +92 -64
- package/metrics/index.js +13 -12
- package/metrics/with-schemas/index.js +13 -12
- package/min/checkpoints/index.js +1 -1
- package/min/checkpoints/index.js.gz +0 -0
- package/min/checkpoints/with-schemas/index.js +1 -1
- package/min/checkpoints/with-schemas/index.js.gz +0 -0
- package/min/common/index.js +1 -1
- package/min/common/index.js.gz +0 -0
- package/min/common/with-schemas/index.js +1 -1
- package/min/common/with-schemas/index.js.gz +0 -0
- package/min/index.js +1 -1
- package/min/index.js.gz +0 -0
- package/min/indexes/index.js +1 -1
- package/min/indexes/index.js.gz +0 -0
- package/min/indexes/with-schemas/index.js +1 -1
- package/min/indexes/with-schemas/index.js.gz +0 -0
- package/min/mergeable-store/index.js +1 -1
- package/min/mergeable-store/index.js.gz +0 -0
- package/min/mergeable-store/with-schemas/index.js +1 -1
- package/min/mergeable-store/with-schemas/index.js.gz +0 -0
- package/min/metrics/index.js +1 -1
- package/min/metrics/index.js.gz +0 -0
- package/min/metrics/with-schemas/index.js +1 -1
- package/min/metrics/with-schemas/index.js.gz +0 -0
- package/min/omni/index.js +1 -1
- package/min/omni/index.js.gz +0 -0
- package/min/omni/with-schemas/index.js +1 -1
- package/min/omni/with-schemas/index.js.gz +0 -0
- package/min/persisters/index.js +1 -1
- package/min/persisters/index.js.gz +0 -0
- package/min/persisters/persister-automerge/index.js +1 -1
- package/min/persisters/persister-automerge/index.js.gz +0 -0
- package/min/persisters/persister-automerge/with-schemas/index.js +1 -1
- package/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-browser/index.js +1 -1
- package/min/persisters/persister-browser/index.js.gz +0 -0
- package/min/persisters/persister-browser/with-schemas/index.js +1 -1
- package/min/persisters/persister-browser/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
- package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
- package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
- package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-durable-object-sql-storage/index.js +1 -1
- package/min/persisters/persister-durable-object-sql-storage/index.js.gz +0 -0
- package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js +1 -1
- package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-durable-object-storage/index.js +1 -1
- package/min/persisters/persister-durable-object-storage/index.js.gz +0 -0
- package/min/persisters/persister-durable-object-storage/with-schemas/index.js +1 -1
- package/min/persisters/persister-durable-object-storage/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-electric-sql/index.js +1 -1
- package/min/persisters/persister-electric-sql/index.js.gz +0 -0
- package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
- package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-expo-sqlite/index.js +1 -1
- package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
- package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
- package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-file/index.js +1 -1
- package/min/persisters/persister-file/index.js.gz +0 -0
- package/min/persisters/persister-file/with-schemas/index.js +1 -1
- package/min/persisters/persister-file/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-indexed-db/index.js +1 -1
- package/min/persisters/persister-indexed-db/index.js.gz +0 -0
- package/min/persisters/persister-indexed-db/with-schemas/index.js +1 -1
- package/min/persisters/persister-indexed-db/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-libsql/index.js +1 -1
- package/min/persisters/persister-libsql/index.js.gz +0 -0
- package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
- package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-partykit-client/index.js +1 -1
- package/min/persisters/persister-partykit-client/index.js.gz +0 -0
- package/min/persisters/persister-partykit-client/with-schemas/index.js +1 -1
- package/min/persisters/persister-partykit-client/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-partykit-server/index.js +1 -1
- package/min/persisters/persister-partykit-server/index.js.gz +0 -0
- package/min/persisters/persister-partykit-server/with-schemas/index.js +1 -1
- package/min/persisters/persister-partykit-server/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-pglite/index.js +1 -1
- package/min/persisters/persister-pglite/index.js.gz +0 -0
- package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
- package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-postgres/index.js +1 -1
- package/min/persisters/persister-postgres/index.js.gz +0 -0
- package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
- package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-powersync/index.js +1 -1
- package/min/persisters/persister-powersync/index.js.gz +0 -0
- package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
- package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-react-native-mmkv/index.js +1 -1
- package/min/persisters/persister-react-native-mmkv/index.js.gz +0 -0
- package/min/persisters/persister-react-native-mmkv/with-schemas/index.js +1 -1
- package/min/persisters/persister-react-native-mmkv/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-react-native-sqlite/index.js +1 -1
- package/min/persisters/persister-react-native-sqlite/index.js.gz +0 -0
- package/min/persisters/persister-react-native-sqlite/with-schemas/index.js +1 -1
- package/min/persisters/persister-react-native-sqlite/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-remote/index.js +1 -1
- package/min/persisters/persister-remote/index.js.gz +0 -0
- package/min/persisters/persister-remote/with-schemas/index.js +1 -1
- package/min/persisters/persister-remote/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-bun/index.js +1 -1
- package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -1
- package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-wasm/index.js +1 -1
- package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
- package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-sqlite3/index.js +1 -1
- package/min/persisters/persister-sqlite3/index.js.gz +0 -0
- package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
- package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-yjs/index.js +1 -1
- package/min/persisters/persister-yjs/index.js.gz +0 -0
- package/min/persisters/persister-yjs/with-schemas/index.js +1 -1
- package/min/persisters/persister-yjs/with-schemas/index.js.gz +0 -0
- package/min/persisters/with-schemas/index.js +1 -1
- package/min/persisters/with-schemas/index.js.gz +0 -0
- package/min/queries/index.js +1 -1
- package/min/queries/index.js.gz +0 -0
- package/min/queries/with-schemas/index.js +1 -1
- package/min/queries/with-schemas/index.js.gz +0 -0
- package/min/relationships/index.js +1 -1
- package/min/relationships/index.js.gz +0 -0
- package/min/relationships/with-schemas/index.js +1 -1
- package/min/relationships/with-schemas/index.js.gz +0 -0
- package/min/store/index.js +1 -1
- package/min/store/index.js.gz +0 -0
- package/min/store/with-schemas/index.js +1 -1
- package/min/store/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/index.js +1 -1
- package/min/synchronizers/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-broadcast-channel/index.js +1 -1
- package/min/synchronizers/synchronizer-broadcast-channel/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-local/index.js +1 -1
- package/min/synchronizers/synchronizer-local/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-local/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-local/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-client/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-client/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-durable-object/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-durable-object/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-simple/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-simple/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/with-schemas/index.js +1 -1
- package/min/synchronizers/with-schemas/index.js.gz +0 -0
- package/min/ui-react-inspector/index.js +1 -1
- package/min/ui-react-inspector/index.js.gz +0 -0
- package/min/ui-react-inspector/with-schemas/index.js +1 -1
- package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
- package/min/with-schemas/index.js +1 -1
- package/min/with-schemas/index.js.gz +0 -0
- package/omni/index.js +115 -67
- package/omni/with-schemas/index.js +115 -67
- package/package.json +13 -13
- package/persisters/index.js +29 -12
- package/persisters/persister-automerge/index.js +17 -9
- package/persisters/persister-automerge/with-schemas/index.js +17 -9
- package/persisters/persister-browser/index.js +34 -10
- package/persisters/persister-browser/with-schemas/index.js +34 -10
- package/persisters/persister-cr-sqlite-wasm/index.js +29 -12
- package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +29 -12
- package/persisters/persister-durable-object-sql-storage/index.js +29 -12
- package/persisters/persister-durable-object-sql-storage/with-schemas/index.js +29 -12
- package/persisters/persister-durable-object-storage/index.js +19 -11
- package/persisters/persister-durable-object-storage/with-schemas/index.js +19 -11
- package/persisters/persister-electric-sql/index.js +29 -12
- package/persisters/persister-electric-sql/with-schemas/index.js +29 -12
- package/persisters/persister-expo-sqlite/index.js +29 -12
- package/persisters/persister-expo-sqlite/with-schemas/index.js +29 -12
- package/persisters/persister-file/index.js +34 -10
- package/persisters/persister-file/with-schemas/index.js +34 -10
- package/persisters/persister-indexed-db/index.js +17 -9
- package/persisters/persister-indexed-db/with-schemas/index.js +17 -9
- package/persisters/persister-libsql/index.js +29 -12
- package/persisters/persister-libsql/with-schemas/index.js +29 -12
- package/persisters/persister-partykit-client/index.js +44 -11
- package/persisters/persister-partykit-client/with-schemas/index.js +44 -11
- package/persisters/persister-partykit-server/index.js +39 -4
- package/persisters/persister-partykit-server/with-schemas/index.js +39 -4
- package/persisters/persister-pglite/index.js +29 -12
- package/persisters/persister-pglite/with-schemas/index.js +29 -12
- package/persisters/persister-postgres/index.js +29 -12
- package/persisters/persister-postgres/with-schemas/index.js +29 -12
- package/persisters/persister-powersync/index.js +29 -12
- package/persisters/persister-powersync/with-schemas/index.js +29 -12
- package/persisters/persister-react-native-mmkv/index.js +17 -9
- package/persisters/persister-react-native-mmkv/with-schemas/index.js +17 -9
- package/persisters/persister-react-native-sqlite/index.js +29 -12
- package/persisters/persister-react-native-sqlite/with-schemas/index.js +29 -12
- package/persisters/persister-remote/index.js +17 -9
- package/persisters/persister-remote/with-schemas/index.js +17 -9
- package/persisters/persister-sqlite-bun/index.js +29 -12
- package/persisters/persister-sqlite-bun/with-schemas/index.js +29 -12
- package/persisters/persister-sqlite-wasm/index.js +29 -12
- package/persisters/persister-sqlite-wasm/with-schemas/index.js +29 -12
- package/persisters/persister-sqlite3/index.js +29 -12
- package/persisters/persister-sqlite3/with-schemas/index.js +29 -12
- package/persisters/persister-yjs/index.js +19 -11
- package/persisters/persister-yjs/with-schemas/index.js +19 -11
- package/persisters/with-schemas/index.js +29 -12
- package/queries/index.js +15 -14
- package/queries/with-schemas/index.js +15 -14
- package/readme.md +10 -2
- package/relationships/index.js +13 -12
- package/relationships/with-schemas/index.js +13 -12
- package/releases.md +1 -1
- package/store/index.js +74 -60
- package/store/with-schemas/index.js +74 -60
- package/synchronizers/index.js +17 -9
- package/synchronizers/synchronizer-broadcast-channel/index.js +17 -9
- package/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +17 -9
- package/synchronizers/synchronizer-local/index.js +19 -11
- package/synchronizers/synchronizer-local/with-schemas/index.js +19 -11
- package/synchronizers/synchronizer-ws-client/index.js +31 -10
- package/synchronizers/synchronizer-ws-client/with-schemas/index.js +31 -10
- package/synchronizers/synchronizer-ws-server/index.js +34 -13
- package/synchronizers/synchronizer-ws-server/with-schemas/index.js +34 -13
- package/synchronizers/synchronizer-ws-server-durable-object/index.js +31 -10
- package/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +31 -10
- package/synchronizers/synchronizer-ws-server-simple/index.js +11 -10
- package/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +11 -10
- package/synchronizers/with-schemas/index.js +17 -9
- package/ui-react-inspector/index.js +91 -61
- package/ui-react-inspector/with-schemas/index.js +91 -61
- package/with-schemas/index.js +92 -64
|
@@ -67,6 +67,10 @@ const objNew = (entries = []) => object.fromEntries(entries);
|
|
|
67
67
|
const objHas = (obj, id) => id in obj;
|
|
68
68
|
const objForEach = (obj, cb) =>
|
|
69
69
|
arrayForEach(objEntries(obj), ([id, value]) => cb(value, id));
|
|
70
|
+
const objToArray = (obj, cb) =>
|
|
71
|
+
arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
|
|
72
|
+
const objMap = (obj, cb) =>
|
|
73
|
+
objNew(objToArray(obj, (value, id) => [id, cb(value, id)]));
|
|
70
74
|
const objValues = (obj) => object.values(obj);
|
|
71
75
|
const objSize = (obj) => size(objIds(obj));
|
|
72
76
|
const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
|
|
@@ -82,7 +86,16 @@ const jsonParse = JSON.parse;
|
|
|
82
86
|
const jsonStringWithUndefined = (obj) =>
|
|
83
87
|
jsonString(obj, (_key, value) => (isUndefined(value) ? UNDEFINED : value));
|
|
84
88
|
const jsonParseWithUndefined = (str) =>
|
|
85
|
-
|
|
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
|
|
110
|
-
const
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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(
|
|
131
|
+
hadExistingValue?.(mapGet(map2, key));
|
|
118
132
|
}
|
|
119
|
-
return mapGet(
|
|
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
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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(
|
|
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
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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(
|
|
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
|
|
79
|
-
const
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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(
|
|
87
|
+
hadExistingValue?.(mapGet(map2, key));
|
|
87
88
|
}
|
|
88
|
-
return mapGet(
|
|
89
|
+
return mapGet(map2, key);
|
|
89
90
|
};
|
|
90
91
|
const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
|
|
91
92
|
ifNotUndefined(
|
|
@@ -309,6 +310,11 @@ const createCustomPersister = (
|
|
|
309
310
|
? store.applyChanges
|
|
310
311
|
: store.setContent)(contentOrChanges);
|
|
311
312
|
};
|
|
313
|
+
const saveAfterMutated = async () => {
|
|
314
|
+
if (isAutoSaving() && store.hadMutated?.()) {
|
|
315
|
+
await save();
|
|
316
|
+
}
|
|
317
|
+
};
|
|
312
318
|
const load = async (initialContent) => {
|
|
313
319
|
/* istanbul ignore else */
|
|
314
320
|
if (status != 2 /* Saving */) {
|
|
@@ -333,6 +339,7 @@ const createCustomPersister = (
|
|
|
333
339
|
},
|
|
334
340
|
);
|
|
335
341
|
setStatus(0 /* Idle */);
|
|
342
|
+
await saveAfterMutated();
|
|
336
343
|
});
|
|
337
344
|
}
|
|
338
345
|
return persister;
|
|
@@ -351,6 +358,7 @@ const createCustomPersister = (
|
|
|
351
358
|
loads++;
|
|
352
359
|
setContentOrChanges(changes ?? content);
|
|
353
360
|
setStatus(0 /* Idle */);
|
|
361
|
+
await saveAfterMutated();
|
|
354
362
|
}
|
|
355
363
|
} else {
|
|
356
364
|
await load();
|
|
@@ -212,7 +212,16 @@ const jsonStringWithMap = (obj) =>
|
|
|
212
212
|
const jsonStringWithUndefined = (obj) =>
|
|
213
213
|
jsonString(obj, (_key, value) => (isUndefined(value) ? UNDEFINED : value));
|
|
214
214
|
const jsonParseWithUndefined = (str) =>
|
|
215
|
-
|
|
215
|
+
// JSON.parse reviver removes properties with undefined values
|
|
216
|
+
replaceUndefinedString(jsonParse(str));
|
|
217
|
+
const replaceUndefinedString = (obj) =>
|
|
218
|
+
obj === UNDEFINED
|
|
219
|
+
? void 0
|
|
220
|
+
: isArray(obj)
|
|
221
|
+
? arrayMap(obj, replaceUndefinedString)
|
|
222
|
+
: isObject(obj)
|
|
223
|
+
? objMap(obj, replaceUndefinedString)
|
|
224
|
+
: obj;
|
|
216
225
|
|
|
217
226
|
const collSizeN = (collSizer) => (coll) =>
|
|
218
227
|
arrayReduce(collValues(coll), (total, coll2) => total + collSizer(coll2), 0);
|
|
@@ -227,31 +236,32 @@ const collClear = (coll) => coll.clear();
|
|
|
227
236
|
const collForEach = (coll, cb) => coll?.forEach(cb);
|
|
228
237
|
const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
|
|
229
238
|
|
|
230
|
-
const
|
|
231
|
-
const
|
|
232
|
-
const
|
|
233
|
-
const
|
|
234
|
-
|
|
239
|
+
const map = Map;
|
|
240
|
+
const mapNew = (entries) => new map(entries);
|
|
241
|
+
const mapKeys = (map2) => [...(map2?.keys() ?? [])];
|
|
242
|
+
const mapGet = (map2, key) => map2?.get(key);
|
|
243
|
+
const mapForEach = (map2, cb) =>
|
|
244
|
+
collForEach(map2, (value, key) => cb(key, value));
|
|
235
245
|
const mapMap = (coll, cb) =>
|
|
236
246
|
arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
|
|
237
|
-
const mapSet = (
|
|
238
|
-
isUndefined(value) ? (collDel(
|
|
239
|
-
const mapEnsure = (
|
|
240
|
-
if (!collHas(
|
|
241
|
-
mapSet(
|
|
247
|
+
const mapSet = (map2, key, value) =>
|
|
248
|
+
isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
|
|
249
|
+
const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
|
|
250
|
+
if (!collHas(map2, key)) {
|
|
251
|
+
mapSet(map2, key, getDefaultValue());
|
|
242
252
|
} else {
|
|
243
|
-
hadExistingValue?.(mapGet(
|
|
253
|
+
hadExistingValue?.(mapGet(map2, key));
|
|
244
254
|
}
|
|
245
|
-
return mapGet(
|
|
255
|
+
return mapGet(map2, key);
|
|
246
256
|
};
|
|
247
|
-
const mapMatch = (
|
|
248
|
-
objMap(obj, (value, id) => set(
|
|
249
|
-
mapForEach(
|
|
250
|
-
return
|
|
257
|
+
const mapMatch = (map2, obj, set, del = mapSet) => {
|
|
258
|
+
objMap(obj, (value, id) => set(map2, id, value));
|
|
259
|
+
mapForEach(map2, (id) => (objHas(obj, id) ? 0 : del(map2, id)));
|
|
260
|
+
return map2;
|
|
251
261
|
};
|
|
252
|
-
const mapToObj = (
|
|
262
|
+
const mapToObj = (map2, valueMapper, excludeMapValue, excludeObjValue) => {
|
|
253
263
|
const obj = {};
|
|
254
|
-
collForEach(
|
|
264
|
+
collForEach(map2, (mapValue, id) => {
|
|
255
265
|
if (!excludeMapValue?.(mapValue, id)) {
|
|
256
266
|
const objValue = valueMapper ? valueMapper(mapValue, id) : mapValue;
|
|
257
267
|
if (!excludeObjValue?.(objValue)) {
|
|
@@ -261,27 +271,27 @@ const mapToObj = (map, valueMapper, excludeMapValue, excludeObjValue) => {
|
|
|
261
271
|
});
|
|
262
272
|
return obj;
|
|
263
273
|
};
|
|
264
|
-
const mapToObj2 = (
|
|
274
|
+
const mapToObj2 = (map2, valueMapper, excludeMapValue) =>
|
|
265
275
|
mapToObj(
|
|
266
|
-
|
|
276
|
+
map2,
|
|
267
277
|
(childMap) => mapToObj(childMap, valueMapper, excludeMapValue),
|
|
268
278
|
collIsEmpty,
|
|
269
279
|
objIsEmpty,
|
|
270
280
|
);
|
|
271
|
-
const mapToObj3 = (
|
|
281
|
+
const mapToObj3 = (map2, valueMapper, excludeMapValue) =>
|
|
272
282
|
mapToObj(
|
|
273
|
-
|
|
283
|
+
map2,
|
|
274
284
|
(childMap) => mapToObj2(childMap, valueMapper, excludeMapValue),
|
|
275
285
|
collIsEmpty,
|
|
276
286
|
objIsEmpty,
|
|
277
287
|
);
|
|
278
|
-
const mapClone = (
|
|
279
|
-
const
|
|
280
|
-
collForEach(
|
|
281
|
-
return
|
|
288
|
+
const mapClone = (map2, mapValue) => {
|
|
289
|
+
const map22 = mapNew();
|
|
290
|
+
collForEach(map2, (value, key) => map22.set(key, mapValue?.(value) ?? value));
|
|
291
|
+
return map22;
|
|
282
292
|
};
|
|
283
|
-
const mapClone2 = (
|
|
284
|
-
const mapClone3 = (
|
|
293
|
+
const mapClone2 = (map2) => mapClone(map2, mapClone);
|
|
294
|
+
const mapClone3 = (map2) => mapClone(map2, mapClone2);
|
|
285
295
|
const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
|
|
286
296
|
ifNotUndefined(
|
|
287
297
|
(ensureLeaf ? mapEnsure : mapGet)(
|
|
@@ -482,6 +492,11 @@ const createCustomPersister = (
|
|
|
482
492
|
? store.applyChanges
|
|
483
493
|
: store.setContent)(contentOrChanges);
|
|
484
494
|
};
|
|
495
|
+
const saveAfterMutated = async () => {
|
|
496
|
+
if (isAutoSaving() && store.hadMutated?.()) {
|
|
497
|
+
await save();
|
|
498
|
+
}
|
|
499
|
+
};
|
|
485
500
|
const load = async (initialContent) => {
|
|
486
501
|
/* istanbul ignore else */
|
|
487
502
|
if (status != 2 /* Saving */) {
|
|
@@ -506,6 +521,7 @@ const createCustomPersister = (
|
|
|
506
521
|
},
|
|
507
522
|
);
|
|
508
523
|
setStatus(0 /* Idle */);
|
|
524
|
+
await saveAfterMutated();
|
|
509
525
|
});
|
|
510
526
|
}
|
|
511
527
|
return persister;
|
|
@@ -524,6 +540,7 @@ const createCustomPersister = (
|
|
|
524
540
|
loads++;
|
|
525
541
|
setContentOrChanges(changes ?? content);
|
|
526
542
|
setStatus(0 /* Idle */);
|
|
543
|
+
await saveAfterMutated();
|
|
527
544
|
}
|
|
528
545
|
} else {
|
|
529
546
|
await load();
|
|
@@ -723,6 +740,7 @@ const createStore = () => {
|
|
|
723
740
|
let hadValues = false;
|
|
724
741
|
let transactions = 0;
|
|
725
742
|
let internalListeners = [];
|
|
743
|
+
let mutating = 0;
|
|
726
744
|
const changedTableIds = mapNew();
|
|
727
745
|
const changedTableCellIds = mapNew();
|
|
728
746
|
const changedRowCount = mapNew();
|
|
@@ -1127,13 +1145,13 @@ const createStore = () => {
|
|
|
1127
1145
|
cellId,
|
|
1128
1146
|
() => [oldCell, 0],
|
|
1129
1147
|
)[1] = newCell;
|
|
1130
|
-
internalListeners[3]?.(tableId, rowId, cellId, newCell);
|
|
1148
|
+
internalListeners[3]?.(tableId, rowId, cellId, newCell, mutating);
|
|
1131
1149
|
};
|
|
1132
1150
|
const valueIdsChanged = (valueId, addedOrRemoved) =>
|
|
1133
1151
|
idsChanged(changedValueIds, valueId, addedOrRemoved);
|
|
1134
1152
|
const valueChanged = (valueId, oldValue, newValue) => {
|
|
1135
1153
|
mapEnsure(changedValues, valueId, () => [oldValue, 0])[1] = newValue;
|
|
1136
|
-
internalListeners[4]?.(valueId, newValue);
|
|
1154
|
+
internalListeners[4]?.(valueId, newValue, mutating);
|
|
1137
1155
|
};
|
|
1138
1156
|
const cellInvalid = (tableId, rowId, cellId, invalidCell, defaultedCell) => {
|
|
1139
1157
|
arrayPush(
|
|
@@ -1208,14 +1226,11 @@ const createStore = () => {
|
|
|
1208
1226
|
}
|
|
1209
1227
|
};
|
|
1210
1228
|
const callTabularListenersForChanges = (mutator) => {
|
|
1211
|
-
const
|
|
1212
|
-
|
|
1213
|
-
callListeners(hasTablesListeners[mutator], void 0, hasTablesNow);
|
|
1214
|
-
}
|
|
1215
|
-
const emptySortedRowIdListeners = collIsEmpty(
|
|
1229
|
+
const hasHasTablesListeners = !collIsEmpty(hasTablesListeners[mutator]);
|
|
1230
|
+
const hasSortedRowIdListeners = !collIsEmpty(
|
|
1216
1231
|
sortedRowIdsListeners[mutator],
|
|
1217
1232
|
);
|
|
1218
|
-
const
|
|
1233
|
+
const hasIdOrHasListeners = !(
|
|
1219
1234
|
collIsEmpty(cellIdsListeners[mutator]) &&
|
|
1220
1235
|
collIsEmpty(hasCellListeners[mutator]) &&
|
|
1221
1236
|
collIsEmpty(rowIdsListeners[mutator]) &&
|
|
@@ -1223,15 +1238,17 @@ const createStore = () => {
|
|
|
1223
1238
|
collIsEmpty(tableCellIdsListeners[mutator]) &&
|
|
1224
1239
|
collIsEmpty(hasTableCellListeners[mutator]) &&
|
|
1225
1240
|
collIsEmpty(rowCountListeners[mutator]) &&
|
|
1226
|
-
|
|
1241
|
+
!hasSortedRowIdListeners &&
|
|
1227
1242
|
collIsEmpty(tableIdsListeners[mutator]) &&
|
|
1228
|
-
collIsEmpty(hasTableListeners[mutator])
|
|
1229
|
-
|
|
1243
|
+
collIsEmpty(hasTableListeners[mutator])
|
|
1244
|
+
);
|
|
1245
|
+
const hasOtherListeners = !(
|
|
1230
1246
|
collIsEmpty(cellListeners[mutator]) &&
|
|
1231
1247
|
collIsEmpty(rowListeners[mutator]) &&
|
|
1232
1248
|
collIsEmpty(tableListeners[mutator]) &&
|
|
1233
|
-
collIsEmpty(tablesListeners[mutator])
|
|
1234
|
-
|
|
1249
|
+
collIsEmpty(tablesListeners[mutator])
|
|
1250
|
+
);
|
|
1251
|
+
if (hasHasTablesListeners || hasIdOrHasListeners || hasOtherListeners) {
|
|
1235
1252
|
const changes = mutator
|
|
1236
1253
|
? [
|
|
1237
1254
|
mapClone(changedTableIds),
|
|
@@ -1239,7 +1256,9 @@ const createStore = () => {
|
|
|
1239
1256
|
mapClone(changedRowCount),
|
|
1240
1257
|
mapClone2(changedRowIds),
|
|
1241
1258
|
mapClone3(changedCellIds),
|
|
1242
|
-
|
|
1259
|
+
mapClone(changedCells, (map) =>
|
|
1260
|
+
mapClone(map, (map2) => mapClone(map2, pairClone)),
|
|
1261
|
+
),
|
|
1243
1262
|
]
|
|
1244
1263
|
: [
|
|
1245
1264
|
changedTableIds,
|
|
@@ -1249,7 +1268,13 @@ const createStore = () => {
|
|
|
1249
1268
|
changedCellIds,
|
|
1250
1269
|
changedCells,
|
|
1251
1270
|
];
|
|
1252
|
-
if (
|
|
1271
|
+
if (hasHasTablesListeners) {
|
|
1272
|
+
const hasTablesNow = hasTables();
|
|
1273
|
+
if (hasTablesNow != hadTables) {
|
|
1274
|
+
callListeners(hasTablesListeners[mutator], void 0, hasTablesNow);
|
|
1275
|
+
}
|
|
1276
|
+
}
|
|
1277
|
+
if (hasIdOrHasListeners) {
|
|
1253
1278
|
callIdsAndHasListenersIfChanged(
|
|
1254
1279
|
changes[0],
|
|
1255
1280
|
tableIdsListeners[mutator],
|
|
@@ -1281,13 +1306,13 @@ const createStore = () => {
|
|
|
1281
1306
|
hasRowListeners[mutator],
|
|
1282
1307
|
[tableId],
|
|
1283
1308
|
) &&
|
|
1284
|
-
|
|
1309
|
+
hasSortedRowIdListeners
|
|
1285
1310
|
) {
|
|
1286
1311
|
callListeners(sortedRowIdsListeners[mutator], [tableId, null]);
|
|
1287
1312
|
setAdd(calledSortableTableIds, tableId);
|
|
1288
1313
|
}
|
|
1289
1314
|
});
|
|
1290
|
-
if (
|
|
1315
|
+
if (hasSortedRowIdListeners) {
|
|
1291
1316
|
collForEach(changes[5], (rows, tableId) => {
|
|
1292
1317
|
if (!collHas(calledSortableTableIds, tableId)) {
|
|
1293
1318
|
const sortableCellIds = setNew();
|
|
@@ -1318,7 +1343,7 @@ const createStore = () => {
|
|
|
1318
1343
|
),
|
|
1319
1344
|
);
|
|
1320
1345
|
}
|
|
1321
|
-
if (
|
|
1346
|
+
if (hasOtherListeners) {
|
|
1322
1347
|
let tablesChanged;
|
|
1323
1348
|
collForEach(changes[5], (rows, tableId) => {
|
|
1324
1349
|
let tableChanged;
|
|
@@ -1355,28 +1380,31 @@ const createStore = () => {
|
|
|
1355
1380
|
}
|
|
1356
1381
|
};
|
|
1357
1382
|
const callValuesListenersForChanges = (mutator) => {
|
|
1358
|
-
const
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
const
|
|
1363
|
-
collIsEmpty(
|
|
1364
|
-
collIsEmpty(
|
|
1365
|
-
|
|
1366
|
-
collIsEmpty(valueListeners[mutator]) &&
|
|
1367
|
-
collIsEmpty(valuesListeners[mutator]);
|
|
1368
|
-
if (!emptyIdAndHasListeners || !emptyOtherListeners) {
|
|
1383
|
+
const hasHasValuesListeners = !collIsEmpty(hasValuesListeners[mutator]);
|
|
1384
|
+
const hasIdOrHasListeners =
|
|
1385
|
+
!collIsEmpty(valueIdsListeners[mutator]) ||
|
|
1386
|
+
!collIsEmpty(hasValueListeners[mutator]);
|
|
1387
|
+
const hasOtherListeners =
|
|
1388
|
+
!collIsEmpty(valueListeners[mutator]) ||
|
|
1389
|
+
!collIsEmpty(valuesListeners[mutator]);
|
|
1390
|
+
if (hasHasValuesListeners || hasIdOrHasListeners || hasOtherListeners) {
|
|
1369
1391
|
const changes = mutator
|
|
1370
|
-
? [mapClone(changedValueIds), mapClone(changedValues)]
|
|
1392
|
+
? [mapClone(changedValueIds), mapClone(changedValues, pairClone)]
|
|
1371
1393
|
: [changedValueIds, changedValues];
|
|
1372
|
-
if (
|
|
1394
|
+
if (hasHasValuesListeners) {
|
|
1395
|
+
const hasValuesNow = hasValues();
|
|
1396
|
+
if (hasValuesNow != hadValues) {
|
|
1397
|
+
callListeners(hasValuesListeners[mutator], void 0, hasValuesNow);
|
|
1398
|
+
}
|
|
1399
|
+
}
|
|
1400
|
+
if (hasIdOrHasListeners) {
|
|
1373
1401
|
callIdsAndHasListenersIfChanged(
|
|
1374
1402
|
changes[0],
|
|
1375
1403
|
valueIdsListeners[mutator],
|
|
1376
1404
|
hasValueListeners[mutator],
|
|
1377
1405
|
);
|
|
1378
1406
|
}
|
|
1379
|
-
if (
|
|
1407
|
+
if (hasOtherListeners) {
|
|
1380
1408
|
let valuesChanged;
|
|
1381
1409
|
collForEach(changes[1], ([oldValue, newValue], valueId) => {
|
|
1382
1410
|
if (newValue !== oldValue) {
|
|
@@ -1773,6 +1801,7 @@ const createStore = () => {
|
|
|
1773
1801
|
transactions--;
|
|
1774
1802
|
if (transactions == 0) {
|
|
1775
1803
|
transactions = 1;
|
|
1804
|
+
mutating = 1;
|
|
1776
1805
|
callInvalidCellListeners(1);
|
|
1777
1806
|
if (!collIsEmpty(changedCells)) {
|
|
1778
1807
|
callTabularListenersForChanges(1);
|
|
@@ -1781,6 +1810,7 @@ const createStore = () => {
|
|
|
1781
1810
|
if (!collIsEmpty(changedValues)) {
|
|
1782
1811
|
callValuesListenersForChanges(1);
|
|
1783
1812
|
}
|
|
1813
|
+
mutating = 0;
|
|
1784
1814
|
if (doRollback?.(store)) {
|
|
1785
1815
|
collForEach(changedCells, (table, tableId) =>
|
|
1786
1816
|
collForEach(table, (row, rowId) =>
|