tinybase 4.0.0-beta.4 → 4.0.0-beta.5.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.
- package/lib/cjs/persisters/persister-automerge.cjs +1 -0
- package/lib/cjs/persisters/persister-automerge.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-browser.cjs +1 -0
- package/lib/cjs/persisters/persister-browser.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -0
- package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-file.cjs +1 -0
- package/lib/cjs/persisters/persister-file.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-remote.cjs +1 -0
- package/lib/cjs/persisters/persister-remote.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -0
- package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-sqlite3.cjs +1 -0
- package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-yjs.cjs +1 -0
- package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
- package/lib/cjs/persisters.cjs +1 -1
- package/lib/cjs/persisters.cjs.gz +0 -0
- package/lib/cjs/store.cjs +1 -1
- package/lib/cjs/store.cjs.gz +0 -0
- package/lib/cjs/tinybase.cjs +1 -1
- package/lib/cjs/tinybase.cjs.gz +0 -0
- package/lib/cjs/tools.cjs +1 -1
- package/lib/cjs/tools.cjs.gz +0 -0
- package/lib/cjs/ui-react.cjs +1 -1
- package/lib/cjs/ui-react.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-browser.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-browser.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-file.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-remote.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-remote.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
- package/lib/cjs-es6/persisters.cjs +1 -1
- package/lib/cjs-es6/persisters.cjs.gz +0 -0
- package/lib/cjs-es6/store.cjs +1 -1
- package/lib/cjs-es6/store.cjs.gz +0 -0
- package/lib/cjs-es6/tinybase.cjs +1 -1
- package/lib/cjs-es6/tinybase.cjs.gz +0 -0
- package/lib/cjs-es6/tools.cjs +1 -1
- package/lib/cjs-es6/tools.cjs.gz +0 -0
- package/lib/cjs-es6/ui-react.cjs +1 -1
- package/lib/cjs-es6/ui-react.cjs.gz +0 -0
- package/lib/debug/{persister-automerge.js → persisters/persister-automerge.js} +58 -31
- package/lib/debug/{persister-browser.js → persisters/persister-browser.js} +49 -20
- package/lib/debug/persisters/persister-cr-sqlite-wasm.js +665 -0
- package/lib/debug/{persister-file.js → persisters/persister-file.js} +51 -25
- package/lib/debug/{persister-remote.js → persisters/persister-remote.js} +48 -19
- package/lib/debug/persisters/persister-sqlite-wasm.js +673 -0
- package/lib/debug/persisters/persister-sqlite3.js +676 -0
- package/lib/debug/{persister-yjs.js → persisters/persister-yjs.js} +49 -20
- package/lib/debug/persisters.js +47 -18
- package/lib/debug/store.js +79 -29
- package/lib/debug/tinybase.js +123 -46
- package/lib/debug/tools.js +121 -27
- package/lib/debug/ui-react.js +24 -0
- package/lib/es6/persisters/persister-automerge.js +1 -0
- package/lib/es6/persisters/persister-automerge.js.gz +0 -0
- package/lib/es6/persisters/persister-browser.js +1 -0
- package/lib/es6/persisters/persister-browser.js.gz +0 -0
- package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -0
- package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/es6/persisters/persister-file.js +1 -0
- package/lib/es6/persisters/persister-file.js.gz +0 -0
- package/lib/es6/persisters/persister-remote.js +1 -0
- package/lib/es6/persisters/persister-remote.js.gz +0 -0
- package/lib/es6/persisters/persister-sqlite-wasm.js +1 -0
- package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/es6/persisters/persister-sqlite3.js +1 -0
- package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/es6/persisters/persister-yjs.js +1 -0
- package/lib/es6/persisters/persister-yjs.js.gz +0 -0
- package/lib/es6/persisters.js +1 -1
- package/lib/es6/persisters.js.gz +0 -0
- package/lib/es6/store.js +1 -1
- package/lib/es6/store.js.gz +0 -0
- package/lib/es6/tinybase.js +1 -1
- package/lib/es6/tinybase.js.gz +0 -0
- package/lib/es6/tools.js +1 -1
- package/lib/es6/tools.js.gz +0 -0
- package/lib/es6/ui-react.js +1 -1
- package/lib/es6/ui-react.js.gz +0 -0
- package/lib/persisters/persister-automerge.js +1 -0
- package/lib/persisters/persister-automerge.js.gz +0 -0
- package/lib/persisters/persister-browser.js +1 -0
- package/lib/persisters/persister-browser.js.gz +0 -0
- package/lib/persisters/persister-cr-sqlite-wasm.js +1 -0
- package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/persisters/persister-file.js +1 -0
- package/lib/persisters/persister-file.js.gz +0 -0
- package/lib/persisters/persister-remote.js +1 -0
- package/lib/persisters/persister-remote.js.gz +0 -0
- package/lib/persisters/persister-sqlite-wasm.js +1 -0
- package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/persisters/persister-sqlite3.js +1 -0
- package/lib/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/persisters/persister-yjs.js +1 -0
- package/lib/persisters/persister-yjs.js.gz +0 -0
- package/lib/persisters.js +1 -1
- package/lib/persisters.js.gz +0 -0
- package/lib/store.js +1 -1
- package/lib/store.js.gz +0 -0
- package/lib/tinybase.js +1 -1
- package/lib/tinybase.js.gz +0 -0
- package/lib/tools.js +1 -1
- package/lib/tools.js.gz +0 -0
- package/lib/types/checkpoints.d.ts +0 -27
- package/lib/types/common.d.ts +0 -9
- package/lib/types/indexes.d.ts +0 -26
- package/lib/types/metrics.d.ts +0 -23
- package/lib/types/{persister-automerge.d.ts → persisters/persister-automerge.d.ts} +4 -6
- package/lib/types/{persister-browser.d.ts → persisters/persister-browser.d.ts} +2 -5
- package/lib/types/persisters/persister-cr-sqlite-wasm.d.ts +95 -0
- package/lib/types/{persister-file.d.ts → persisters/persister-file.d.ts} +3 -5
- package/lib/types/{persister-remote.d.ts → persisters/persister-remote.d.ts} +2 -4
- package/lib/types/persisters/persister-sqlite-wasm.d.ts +102 -0
- package/lib/types/persisters/persister-sqlite3.d.ts +109 -0
- package/lib/types/{persister-yjs.d.ts → persisters/persister-yjs.d.ts} +4 -6
- package/lib/types/persisters.d.ts +517 -27
- package/lib/types/queries.d.ts +52 -127
- package/lib/types/relationships.d.ts +0 -26
- package/lib/types/store.d.ts +347 -196
- package/lib/types/tinybase.d.ts +0 -1
- package/lib/types/tools.d.ts +15 -28
- package/lib/types/ui-react.d.ts +196 -181
- package/lib/types/with-schemas/checkpoints.d.ts +5 -32
- package/lib/types/with-schemas/common.d.ts +0 -9
- package/lib/types/with-schemas/indexes.d.ts +9 -35
- package/lib/types/with-schemas/metrics.d.ts +9 -32
- package/lib/types/with-schemas/{persister-automerge.d.ts → persisters/persister-automerge.d.ts} +4 -6
- package/lib/types/with-schemas/{persister-browser.d.ts → persisters/persister-browser.d.ts} +2 -5
- package/lib/types/with-schemas/persisters/persister-cr-sqlite-wasm.d.ts +105 -0
- package/lib/types/with-schemas/{persister-file.d.ts → persisters/persister-file.d.ts} +3 -5
- package/lib/types/with-schemas/{persister-remote.d.ts → persisters/persister-remote.d.ts} +2 -4
- package/lib/types/with-schemas/persisters/persister-sqlite-wasm.d.ts +113 -0
- package/lib/types/with-schemas/persisters/persister-sqlite3.d.ts +119 -0
- package/lib/types/with-schemas/{persister-yjs.d.ts → persisters/persister-yjs.d.ts} +4 -6
- package/lib/types/with-schemas/persisters.d.ts +534 -29
- package/lib/types/with-schemas/queries.d.ts +61 -224
- package/lib/types/with-schemas/relationships.d.ts +9 -35
- package/lib/types/with-schemas/store.d.ts +488 -239
- package/lib/types/with-schemas/tinybase.d.ts +0 -1
- package/lib/types/with-schemas/tools.d.ts +19 -32
- package/lib/types/with-schemas/ui-react.d.ts +221 -186
- package/lib/ui-react.js +1 -1
- package/lib/ui-react.js.gz +0 -0
- package/lib/umd/persisters/persister-automerge.js +1 -0
- package/lib/umd/persisters/persister-automerge.js.gz +0 -0
- package/lib/umd/persisters/persister-browser.js +1 -0
- package/lib/umd/persisters/persister-browser.js.gz +0 -0
- package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -0
- package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/umd/persisters/persister-file.js +1 -0
- package/lib/umd/persisters/persister-file.js.gz +0 -0
- package/lib/umd/persisters/persister-remote.js +1 -0
- package/lib/umd/persisters/persister-remote.js.gz +0 -0
- package/lib/umd/persisters/persister-sqlite-wasm.js +1 -0
- package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/umd/persisters/persister-sqlite3.js +1 -0
- package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/umd/persisters/persister-yjs.js +1 -0
- package/lib/umd/persisters/persister-yjs.js.gz +0 -0
- package/lib/umd/persisters.js +1 -1
- package/lib/umd/persisters.js.gz +0 -0
- package/lib/umd/store.js +1 -1
- package/lib/umd/store.js.gz +0 -0
- package/lib/umd/tinybase.js +1 -1
- package/lib/umd/tinybase.js.gz +0 -0
- package/lib/umd/tools.js +1 -1
- package/lib/umd/tools.js.gz +0 -0
- package/lib/umd/ui-react.js +1 -1
- package/lib/umd/ui-react.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-automerge.js +1 -0
- package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-browser.js +1 -0
- package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -0
- package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-file.js +1 -0
- package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-remote.js +1 -0
- package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -0
- package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-sqlite3.js +1 -0
- package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-yjs.js +1 -0
- package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
- package/lib/umd-es6/persisters.js +1 -1
- package/lib/umd-es6/persisters.js.gz +0 -0
- package/lib/umd-es6/store.js +1 -1
- package/lib/umd-es6/store.js.gz +0 -0
- package/lib/umd-es6/tinybase.js +1 -1
- package/lib/umd-es6/tinybase.js.gz +0 -0
- package/lib/umd-es6/tools.js +1 -1
- package/lib/umd-es6/tools.js.gz +0 -0
- package/lib/umd-es6/ui-react.js +1 -1
- package/lib/umd-es6/ui-react.js.gz +0 -0
- package/package.json +39 -22
- package/readme.md +3 -3
- package/lib/cjs/persister-automerge.cjs +0 -1
- package/lib/cjs/persister-automerge.cjs.gz +0 -0
- package/lib/cjs/persister-browser.cjs +0 -1
- package/lib/cjs/persister-browser.cjs.gz +0 -0
- package/lib/cjs/persister-file.cjs +0 -1
- package/lib/cjs/persister-file.cjs.gz +0 -0
- package/lib/cjs/persister-remote.cjs +0 -1
- package/lib/cjs/persister-remote.cjs.gz +0 -0
- package/lib/cjs/persister-yjs.cjs +0 -1
- package/lib/cjs/persister-yjs.cjs.gz +0 -0
- package/lib/cjs-es6/persister-automerge.cjs +0 -1
- package/lib/cjs-es6/persister-automerge.cjs.gz +0 -0
- package/lib/cjs-es6/persister-browser.cjs +0 -1
- package/lib/cjs-es6/persister-browser.cjs.gz +0 -0
- package/lib/cjs-es6/persister-file.cjs +0 -1
- package/lib/cjs-es6/persister-file.cjs.gz +0 -0
- package/lib/cjs-es6/persister-remote.cjs +0 -1
- package/lib/cjs-es6/persister-remote.cjs.gz +0 -0
- package/lib/cjs-es6/persister-yjs.cjs +0 -1
- package/lib/cjs-es6/persister-yjs.cjs.gz +0 -0
- package/lib/es6/persister-automerge.js +0 -1
- package/lib/es6/persister-automerge.js.gz +0 -0
- package/lib/es6/persister-browser.js +0 -1
- package/lib/es6/persister-browser.js.gz +0 -0
- package/lib/es6/persister-file.js +0 -1
- package/lib/es6/persister-file.js.gz +0 -0
- package/lib/es6/persister-remote.js +0 -1
- package/lib/es6/persister-remote.js.gz +0 -0
- package/lib/es6/persister-yjs.js +0 -1
- package/lib/es6/persister-yjs.js.gz +0 -0
- package/lib/persister-automerge.js +0 -1
- package/lib/persister-automerge.js.gz +0 -0
- package/lib/persister-browser.js +0 -1
- package/lib/persister-browser.js.gz +0 -0
- package/lib/persister-file.js +0 -1
- package/lib/persister-file.js.gz +0 -0
- package/lib/persister-remote.js +0 -1
- package/lib/persister-remote.js.gz +0 -0
- package/lib/persister-yjs.js +0 -1
- package/lib/persister-yjs.js.gz +0 -0
- package/lib/umd/persister-automerge.js +0 -1
- package/lib/umd/persister-automerge.js.gz +0 -0
- package/lib/umd/persister-browser.js +0 -1
- package/lib/umd/persister-browser.js.gz +0 -0
- package/lib/umd/persister-file.js +0 -1
- package/lib/umd/persister-file.js.gz +0 -0
- package/lib/umd/persister-remote.js +0 -1
- package/lib/umd/persister-remote.js.gz +0 -0
- package/lib/umd/persister-yjs.js +0 -1
- package/lib/umd/persister-yjs.js.gz +0 -0
- package/lib/umd-es6/persister-automerge.js +0 -1
- package/lib/umd-es6/persister-automerge.js.gz +0 -0
- package/lib/umd-es6/persister-browser.js +0 -1
- package/lib/umd-es6/persister-browser.js.gz +0 -0
- package/lib/umd-es6/persister-file.js +0 -1
- package/lib/umd-es6/persister-file.js.gz +0 -0
- package/lib/umd-es6/persister-remote.js +0 -1
- package/lib/umd-es6/persister-remote.js.gz +0 -0
- package/lib/umd-es6/persister-yjs.js +0 -1
- package/lib/umd-es6/persister-yjs.js.gz +0 -0
package/lib/debug/tinybase.js
CHANGED
|
@@ -88,10 +88,14 @@ const isObject = (obj) =>
|
|
|
88
88
|
isInstanceOf(obj, object) && obj.constructor == object;
|
|
89
89
|
const objGet = (obj, id) => ifNotUndefined(obj, (obj2) => obj2[id]);
|
|
90
90
|
const objHas = (obj, id) => !isUndefined(objGet(obj, id));
|
|
91
|
-
const objDel = (obj, id) =>
|
|
91
|
+
const objDel = (obj, id) => {
|
|
92
|
+
delete obj[id];
|
|
93
|
+
return obj;
|
|
94
|
+
};
|
|
92
95
|
const objMap = (obj, cb) =>
|
|
93
96
|
arrayMap(object.entries(obj), ([id, value]) => cb(value, id));
|
|
94
|
-
const
|
|
97
|
+
const objSize = (obj) => arrayLength(objIds(obj));
|
|
98
|
+
const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
|
|
95
99
|
|
|
96
100
|
const collSizeN = (collSizer) => (coll) =>
|
|
97
101
|
arrayReduce(collValues(coll), (total, coll2) => total + collSizer(coll2), 0);
|
|
@@ -121,6 +125,11 @@ const mapEnsure = (map, key, getDefaultValue) => {
|
|
|
121
125
|
}
|
|
122
126
|
return mapGet(map, key);
|
|
123
127
|
};
|
|
128
|
+
const mapMatch = (map, obj, set, del = mapSet) => {
|
|
129
|
+
objMap(obj, (value, id) => set(map, id, value));
|
|
130
|
+
mapForEach(map, (id) => (objHas(obj, id) ? 0 : del(map, id)));
|
|
131
|
+
return map;
|
|
132
|
+
};
|
|
124
133
|
const mapToObj = (map, mapValue, excludeValue) => {
|
|
125
134
|
const obj = {};
|
|
126
135
|
collForEach(map, (value, id) => {
|
|
@@ -1029,8 +1038,23 @@ const createCustomPersister = (
|
|
|
1029
1038
|
let loadSave = 0;
|
|
1030
1039
|
let loads = 0;
|
|
1031
1040
|
let saves = 0;
|
|
1032
|
-
let
|
|
1041
|
+
let running = 0;
|
|
1042
|
+
let listening = 0;
|
|
1043
|
+
let action;
|
|
1033
1044
|
let listeningHandle;
|
|
1045
|
+
const scheduledActions = [];
|
|
1046
|
+
const run = async () => {
|
|
1047
|
+
/* istanbul ignore else */
|
|
1048
|
+
if (!running) {
|
|
1049
|
+
running = 1;
|
|
1050
|
+
while (!isUndefined((action = arrayShift(scheduledActions)))) {
|
|
1051
|
+
try {
|
|
1052
|
+
await action();
|
|
1053
|
+
} catch {}
|
|
1054
|
+
}
|
|
1055
|
+
running = 0;
|
|
1056
|
+
}
|
|
1057
|
+
};
|
|
1034
1058
|
const loadLock = async (actions) => {
|
|
1035
1059
|
/* istanbul ignore else */
|
|
1036
1060
|
if (loadSave != 2) {
|
|
@@ -1043,20 +1067,20 @@ const createCustomPersister = (
|
|
|
1043
1067
|
}
|
|
1044
1068
|
};
|
|
1045
1069
|
const persister = {
|
|
1046
|
-
load: async (initialTables
|
|
1070
|
+
load: async (initialTables, initialValues) => {
|
|
1047
1071
|
await loadLock(async () => {
|
|
1048
|
-
let content;
|
|
1049
1072
|
try {
|
|
1050
|
-
|
|
1051
|
-
} catch {
|
|
1052
|
-
|
|
1073
|
+
store.setContent(await getPersisted());
|
|
1074
|
+
} catch {
|
|
1075
|
+
store.setContent([initialTables, initialValues]);
|
|
1076
|
+
}
|
|
1053
1077
|
});
|
|
1054
1078
|
return persister;
|
|
1055
1079
|
},
|
|
1056
1080
|
startAutoLoad: async (initialTables = {}, initialValues = {}) => {
|
|
1057
1081
|
persister.stopAutoLoad();
|
|
1058
1082
|
await persister.load(initialTables, initialValues);
|
|
1059
|
-
listening =
|
|
1083
|
+
listening = 1;
|
|
1060
1084
|
listeningHandle = addPersisterListener(
|
|
1061
1085
|
async (getContent, getTransactionChanges) => {
|
|
1062
1086
|
await loadLock(async () => {
|
|
@@ -1076,27 +1100,33 @@ const createCustomPersister = (
|
|
|
1076
1100
|
if (listening) {
|
|
1077
1101
|
delPersisterListener(listeningHandle);
|
|
1078
1102
|
listeningHandle = void 0;
|
|
1079
|
-
listening =
|
|
1103
|
+
listening = 0;
|
|
1080
1104
|
}
|
|
1081
1105
|
return persister;
|
|
1082
1106
|
},
|
|
1083
1107
|
save: async (getTransactionChanges) => {
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
loadSave
|
|
1087
|
-
|
|
1088
|
-
|
|
1108
|
+
await persister.schedule(async () => {
|
|
1109
|
+
/* istanbul ignore else */
|
|
1110
|
+
if (loadSave != 1) {
|
|
1111
|
+
loadSave = 2;
|
|
1112
|
+
{
|
|
1113
|
+
saves++;
|
|
1114
|
+
}
|
|
1115
|
+
try {
|
|
1116
|
+
await setPersisted(store.getContent, getTransactionChanges);
|
|
1117
|
+
} catch {}
|
|
1118
|
+
loadSave = 0;
|
|
1089
1119
|
}
|
|
1090
|
-
|
|
1091
|
-
loadSave = 0;
|
|
1092
|
-
}
|
|
1120
|
+
});
|
|
1093
1121
|
return persister;
|
|
1094
1122
|
},
|
|
1095
1123
|
startAutoSave: async () => {
|
|
1096
1124
|
await persister.stopAutoSave().save();
|
|
1097
1125
|
listenerId = store.addDidFinishTransactionListener(
|
|
1098
|
-
(_store, getTransactionChanges) =>
|
|
1099
|
-
|
|
1126
|
+
(_store, getTransactionChanges) => {
|
|
1127
|
+
const transactionChanges = getTransactionChanges();
|
|
1128
|
+
persister.save(() => transactionChanges);
|
|
1129
|
+
},
|
|
1100
1130
|
);
|
|
1101
1131
|
return persister;
|
|
1102
1132
|
},
|
|
@@ -1104,6 +1134,11 @@ const createCustomPersister = (
|
|
|
1104
1134
|
ifNotUndefined(listenerId, store.delListener);
|
|
1105
1135
|
return persister;
|
|
1106
1136
|
},
|
|
1137
|
+
schedule: async (...actions) => {
|
|
1138
|
+
arrayPush(scheduledActions, ...actions);
|
|
1139
|
+
await run();
|
|
1140
|
+
return persister;
|
|
1141
|
+
},
|
|
1107
1142
|
getStore: () => store,
|
|
1108
1143
|
destroy: () => persister.stopAutoLoad().stopAutoSave(),
|
|
1109
1144
|
getStats: () => ({loads, saves}),
|
|
@@ -1743,11 +1778,6 @@ const pairNewMap = () => [mapNew(), mapNew()];
|
|
|
1743
1778
|
const pairClone = (array) => [...array];
|
|
1744
1779
|
const pairIsEqual = ([entry1, entry2]) => entry1 === entry2;
|
|
1745
1780
|
|
|
1746
|
-
const mapMatch = (map, obj, set, del = mapSet) => {
|
|
1747
|
-
objMap(obj, (value, id2) => set(map, id2, value));
|
|
1748
|
-
mapForEach(map, (id2) => (objHas(obj, id2) ? 0 : del(map, id2)));
|
|
1749
|
-
return map;
|
|
1750
|
-
};
|
|
1751
1781
|
const validate = (obj, validateChild, onInvalidObj) => {
|
|
1752
1782
|
if (isUndefined(obj) || !isObject(obj) || objIsEmpty(obj) || objFrozen(obj)) {
|
|
1753
1783
|
onInvalidObj?.();
|
|
@@ -1773,6 +1803,7 @@ const createStore = () => {
|
|
|
1773
1803
|
let valuesTouched = false;
|
|
1774
1804
|
let transactions = 0;
|
|
1775
1805
|
const changedTableIds = mapNew();
|
|
1806
|
+
const changedTableCellIds = mapNew();
|
|
1776
1807
|
const changedRowIds = mapNew();
|
|
1777
1808
|
const changedCellIds = mapNew();
|
|
1778
1809
|
const changedCells = mapNew();
|
|
@@ -1786,11 +1817,13 @@ const createStore = () => {
|
|
|
1786
1817
|
const valuesDefaulted = mapNew();
|
|
1787
1818
|
const valuesNonDefaulted = setNew();
|
|
1788
1819
|
const tablePoolFunctions = mapNew();
|
|
1820
|
+
const tableCellIds = mapNew();
|
|
1789
1821
|
const tablesMap = mapNew();
|
|
1790
1822
|
const valuesMap = mapNew();
|
|
1791
1823
|
const tablesListeners = pairNewMap();
|
|
1792
1824
|
const tableIdsListeners = pairNewMap();
|
|
1793
1825
|
const tableListeners = pairNewMap();
|
|
1826
|
+
const tableCellIdsListeners = pairNewMap();
|
|
1794
1827
|
const rowIdsListeners = pairNewMap();
|
|
1795
1828
|
const sortedRowIdsListeners = pairNewMap();
|
|
1796
1829
|
const rowListeners = pairNewMap();
|
|
@@ -1979,6 +2012,8 @@ const createStore = () => {
|
|
|
1979
2012
|
mapMatch(
|
|
1980
2013
|
mapEnsure(tablesMap, tableId, () => {
|
|
1981
2014
|
tableIdsChanged(tableId, 1);
|
|
2015
|
+
mapSet(tablePoolFunctions, tableId, getPoolFunctions());
|
|
2016
|
+
mapSet(tableCellIds, tableId, mapNew());
|
|
1982
2017
|
return mapNew();
|
|
1983
2018
|
}),
|
|
1984
2019
|
table,
|
|
@@ -2039,7 +2074,7 @@ const createStore = () => {
|
|
|
2039
2074
|
}
|
|
2040
2075
|
};
|
|
2041
2076
|
const getNewRowId = (tableId, reuse) => {
|
|
2042
|
-
const [getId] =
|
|
2077
|
+
const [getId] = mapGet(tablePoolFunctions, tableId);
|
|
2043
2078
|
const rowId = getId(reuse);
|
|
2044
2079
|
if (!collHas(mapGet(tablesMap, tableId), rowId)) {
|
|
2045
2080
|
return rowId;
|
|
@@ -2050,11 +2085,7 @@ const createStore = () => {
|
|
|
2050
2085
|
mapGet(tablesMap, tableId) ?? setValidTable(tableId, {});
|
|
2051
2086
|
const delValidTable = (tableId) => setValidTable(tableId, {});
|
|
2052
2087
|
const delValidRow = (tableId, tableMap, rowId) => {
|
|
2053
|
-
const [, releaseId] =
|
|
2054
|
-
tablePoolFunctions,
|
|
2055
|
-
tableId,
|
|
2056
|
-
getPoolFunctions,
|
|
2057
|
-
);
|
|
2088
|
+
const [, releaseId] = mapGet(tablePoolFunctions, tableId);
|
|
2058
2089
|
releaseId(rowId);
|
|
2059
2090
|
setValidRow(tableId, tableMap, rowId, {}, true);
|
|
2060
2091
|
};
|
|
@@ -2078,6 +2109,7 @@ const createStore = () => {
|
|
|
2078
2109
|
tableIdsChanged(tableId, -1);
|
|
2079
2110
|
mapSet(tablesMap, tableId);
|
|
2080
2111
|
mapSet(tablePoolFunctions, tableId);
|
|
2112
|
+
mapSet(tableCellIds, tableId);
|
|
2081
2113
|
}
|
|
2082
2114
|
}
|
|
2083
2115
|
};
|
|
@@ -2098,12 +2130,30 @@ const createStore = () => {
|
|
|
2098
2130
|
rowId,
|
|
2099
2131
|
addedOrRemoved,
|
|
2100
2132
|
);
|
|
2101
|
-
const cellIdsChanged = (tableId, rowId, cellId, addedOrRemoved) =>
|
|
2133
|
+
const cellIdsChanged = (tableId, rowId, cellId, addedOrRemoved) => {
|
|
2134
|
+
const cellIds = mapGet(tableCellIds, tableId);
|
|
2135
|
+
const count = mapGet(cellIds, cellId) ?? 0;
|
|
2136
|
+
if (
|
|
2137
|
+
(count == 0 && addedOrRemoved == 1) ||
|
|
2138
|
+
(count == 1 && addedOrRemoved == -1)
|
|
2139
|
+
) {
|
|
2140
|
+
idsChanged(
|
|
2141
|
+
mapEnsure(changedTableCellIds, tableId, mapNew),
|
|
2142
|
+
cellId,
|
|
2143
|
+
addedOrRemoved,
|
|
2144
|
+
);
|
|
2145
|
+
}
|
|
2146
|
+
mapSet(
|
|
2147
|
+
cellIds,
|
|
2148
|
+
cellId,
|
|
2149
|
+
count != -addedOrRemoved ? count + addedOrRemoved : null,
|
|
2150
|
+
);
|
|
2102
2151
|
idsChanged(
|
|
2103
2152
|
mapEnsure(mapEnsure(changedCellIds, tableId, mapNew), rowId, mapNew),
|
|
2104
2153
|
cellId,
|
|
2105
2154
|
addedOrRemoved,
|
|
2106
2155
|
);
|
|
2156
|
+
};
|
|
2107
2157
|
const cellChanged = (tableId, rowId, cellId, oldCell, newCell) =>
|
|
2108
2158
|
(mapEnsure(
|
|
2109
2159
|
mapEnsure(mapEnsure(changedCells, tableId, mapNew), rowId, mapNew),
|
|
@@ -2174,7 +2224,7 @@ const createStore = () => {
|
|
|
2174
2224
|
: 0;
|
|
2175
2225
|
const callIdsListenersIfChanged = (listeners, changedIds, ids) => {
|
|
2176
2226
|
if (!collIsEmpty(changedIds)) {
|
|
2177
|
-
callListeners(listeners, ids);
|
|
2227
|
+
callListeners(listeners, ids, () => mapToObj(changedIds));
|
|
2178
2228
|
return 1;
|
|
2179
2229
|
}
|
|
2180
2230
|
};
|
|
@@ -2184,6 +2234,7 @@ const createStore = () => {
|
|
|
2184
2234
|
);
|
|
2185
2235
|
const emptyIdListeners =
|
|
2186
2236
|
collIsEmpty(cellIdsListeners[mutator]) &&
|
|
2237
|
+
collIsEmpty(tableCellIdsListeners[mutator]) &&
|
|
2187
2238
|
collIsEmpty(rowIdsListeners[mutator]) &&
|
|
2188
2239
|
emptySortedRowIdListeners &&
|
|
2189
2240
|
collIsEmpty(tableIdsListeners[mutator]);
|
|
@@ -2196,22 +2247,29 @@ const createStore = () => {
|
|
|
2196
2247
|
const changes = mutator
|
|
2197
2248
|
? [
|
|
2198
2249
|
mapClone(changedTableIds),
|
|
2250
|
+
mapClone2(changedTableCellIds),
|
|
2199
2251
|
mapClone2(changedRowIds),
|
|
2200
2252
|
mapClone3(changedCellIds),
|
|
2201
2253
|
mapClone3(changedCells),
|
|
2202
2254
|
]
|
|
2203
|
-
: [
|
|
2255
|
+
: [
|
|
2256
|
+
changedTableIds,
|
|
2257
|
+
changedTableCellIds,
|
|
2258
|
+
changedRowIds,
|
|
2259
|
+
changedCellIds,
|
|
2260
|
+
changedCells,
|
|
2261
|
+
];
|
|
2204
2262
|
if (!emptyIdListeners) {
|
|
2205
|
-
|
|
2206
|
-
|
|
2207
|
-
|
|
2208
|
-
|
|
2209
|
-
|
|
2210
|
-
]
|
|
2263
|
+
callIdsListenersIfChanged(tableIdsListeners[mutator], changes[0]);
|
|
2264
|
+
collForEach(changes[1], (changedIds, tableId) =>
|
|
2265
|
+
callIdsListenersIfChanged(
|
|
2266
|
+
tableCellIdsListeners[mutator],
|
|
2267
|
+
changedIds,
|
|
2268
|
+
[tableId],
|
|
2211
2269
|
),
|
|
2212
2270
|
);
|
|
2213
2271
|
const calledSortableTableIds = setNew();
|
|
2214
|
-
collForEach(changes[
|
|
2272
|
+
collForEach(changes[2], (changedIds, tableId) => {
|
|
2215
2273
|
if (
|
|
2216
2274
|
callIdsListenersIfChanged(rowIdsListeners[mutator], changedIds, [
|
|
2217
2275
|
tableId,
|
|
@@ -2223,7 +2281,7 @@ const createStore = () => {
|
|
|
2223
2281
|
}
|
|
2224
2282
|
});
|
|
2225
2283
|
if (!emptySortedRowIdListeners) {
|
|
2226
|
-
collForEach(changes[
|
|
2284
|
+
collForEach(changes[4], (rows, tableId) => {
|
|
2227
2285
|
if (!collHas(calledSortableTableIds, tableId)) {
|
|
2228
2286
|
const sortableCellIds = setNew();
|
|
2229
2287
|
collForEach(rows, (cells) =>
|
|
@@ -2242,11 +2300,18 @@ const createStore = () => {
|
|
|
2242
2300
|
}
|
|
2243
2301
|
});
|
|
2244
2302
|
}
|
|
2245
|
-
|
|
2303
|
+
collForEach(changes[3], (rowCellIds, tableId) =>
|
|
2304
|
+
collForEach(rowCellIds, (changedIds, rowId) =>
|
|
2305
|
+
callIdsListenersIfChanged(cellIdsListeners[mutator], changedIds, [
|
|
2306
|
+
tableId,
|
|
2307
|
+
rowId,
|
|
2308
|
+
]),
|
|
2309
|
+
),
|
|
2310
|
+
);
|
|
2246
2311
|
}
|
|
2247
2312
|
if (!emptyOtherListeners) {
|
|
2248
2313
|
let tablesChanged;
|
|
2249
|
-
collForEach(changes[
|
|
2314
|
+
collForEach(changes[4], (rows, tableId) => {
|
|
2250
2315
|
let tableChanged;
|
|
2251
2316
|
collForEach(rows, (cells, rowId) => {
|
|
2252
2317
|
let rowChanged;
|
|
@@ -2358,6 +2423,8 @@ const createStore = () => {
|
|
|
2358
2423
|
const getTables = () => mapToObj3(tablesMap);
|
|
2359
2424
|
const getTableIds = () => mapKeys(tablesMap);
|
|
2360
2425
|
const getTable = (tableId) => mapToObj2(mapGet(tablesMap, id(tableId)));
|
|
2426
|
+
const getTableCellIds = (tableId) =>
|
|
2427
|
+
mapKeys(mapGet(tableCellIds, id(tableId)));
|
|
2361
2428
|
const getRowIds = (tableId) => mapKeys(mapGet(tablesMap, id(tableId)));
|
|
2362
2429
|
const getSortedRowIds = (tableId, cellId, descending, offset = 0, limit) =>
|
|
2363
2430
|
arrayMap(
|
|
@@ -2386,6 +2453,8 @@ const createStore = () => {
|
|
|
2386
2453
|
const getValue = (valueId) => mapGet(valuesMap, id(valueId));
|
|
2387
2454
|
const hasTables = () => !collIsEmpty(tablesMap);
|
|
2388
2455
|
const hasTable = (tableId) => collHas(tablesMap, id(tableId));
|
|
2456
|
+
const hasTableCell = (tableId, cellId) =>
|
|
2457
|
+
collHas(mapGet(tableCellIds, id(tableId)), id(cellId));
|
|
2389
2458
|
const hasRow = (tableId, rowId) =>
|
|
2390
2459
|
collHas(mapGet(tablesMap, id(tableId)), id(rowId));
|
|
2391
2460
|
const hasCell = (tableId, rowId, cellId) =>
|
|
@@ -2400,8 +2469,8 @@ const createStore = () => {
|
|
|
2400
2469
|
const getSchemaJson = () => jsonString([tablesSchemaMap, valuesSchemaMap]);
|
|
2401
2470
|
const setContent = ([tables, values]) =>
|
|
2402
2471
|
fluentTransaction(() => {
|
|
2403
|
-
setTables(tables);
|
|
2404
|
-
setValues(values);
|
|
2472
|
+
(objIsEmpty(tables) ? delTables : setTables)(tables);
|
|
2473
|
+
(objIsEmpty(values) ? delValues : setValues)(values);
|
|
2405
2474
|
});
|
|
2406
2475
|
const setTables = (tables) =>
|
|
2407
2476
|
fluentTransaction(() =>
|
|
@@ -2699,6 +2768,7 @@ const createStore = () => {
|
|
|
2699
2768
|
arrayForEach(
|
|
2700
2769
|
[
|
|
2701
2770
|
changedTableIds,
|
|
2771
|
+
changedTableCellIds,
|
|
2702
2772
|
changedRowIds,
|
|
2703
2773
|
changedCellIds,
|
|
2704
2774
|
changedCells,
|
|
@@ -2723,6 +2793,8 @@ const createStore = () => {
|
|
|
2723
2793
|
),
|
|
2724
2794
|
),
|
|
2725
2795
|
);
|
|
2796
|
+
const forEachTableCell = (tableId, tableCellCallback) =>
|
|
2797
|
+
mapForEach(mapGet(tableCellIds, id(tableId)), tableCellCallback);
|
|
2726
2798
|
const forEachRow = (tableId, rowCallback) =>
|
|
2727
2799
|
collForEach(mapGet(tablesMap, id(tableId)), (rowMap, rowId) =>
|
|
2728
2800
|
rowCallback(rowId, (cellCallback) => mapForEach(rowMap, cellCallback)),
|
|
@@ -2790,6 +2862,7 @@ const createStore = () => {
|
|
|
2790
2862
|
const getListenerStats = () => ({
|
|
2791
2863
|
tables: pairCollSize2(tablesListeners),
|
|
2792
2864
|
tableIds: pairCollSize2(tableIdsListeners),
|
|
2865
|
+
tableCellIds: pairCollSize2(tableCellIdsListeners),
|
|
2793
2866
|
table: pairCollSize2(tableListeners),
|
|
2794
2867
|
rowIds: pairCollSize2(rowIdsListeners),
|
|
2795
2868
|
sortedRowIds: pairCollSize2(sortedRowIdsListeners),
|
|
@@ -2810,6 +2883,7 @@ const createStore = () => {
|
|
|
2810
2883
|
getTables,
|
|
2811
2884
|
getTableIds,
|
|
2812
2885
|
getTable,
|
|
2886
|
+
getTableCellIds,
|
|
2813
2887
|
getRowIds,
|
|
2814
2888
|
getSortedRowIds,
|
|
2815
2889
|
getRow,
|
|
@@ -2820,6 +2894,7 @@ const createStore = () => {
|
|
|
2820
2894
|
getValue,
|
|
2821
2895
|
hasTables,
|
|
2822
2896
|
hasTable,
|
|
2897
|
+
hasTableCell,
|
|
2823
2898
|
hasRow,
|
|
2824
2899
|
hasCell,
|
|
2825
2900
|
hasValues,
|
|
@@ -2860,6 +2935,7 @@ const createStore = () => {
|
|
|
2860
2935
|
startTransaction,
|
|
2861
2936
|
finishTransaction,
|
|
2862
2937
|
forEachTable,
|
|
2938
|
+
forEachTableCell,
|
|
2863
2939
|
forEachRow,
|
|
2864
2940
|
forEachCell,
|
|
2865
2941
|
forEachValue,
|
|
@@ -2877,6 +2953,7 @@ const createStore = () => {
|
|
|
2877
2953
|
[TABLES]: [0, tablesListeners],
|
|
2878
2954
|
[TABLE_IDS]: [0, tableIdsListeners],
|
|
2879
2955
|
[TABLE]: [1, tableListeners, [getTableIds]],
|
|
2956
|
+
[TABLE + CELL_IDS]: [1, tableCellIdsListeners, [getTableIds]],
|
|
2880
2957
|
[ROW_IDS]: [1, rowIdsListeners, [getTableIds]],
|
|
2881
2958
|
[ROW]: [2, rowListeners, [getTableIds, getRowIds]],
|
|
2882
2959
|
[CELL_IDS]: [2, cellIdsListeners, [getTableIds, getRowIds]],
|