tinybase 8.0.0-beta.0 → 8.0.0-beta.2
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/@types/index.d.ts +1 -0
- package/@types/mergeable-store/with-schemas/index.d.ts +1 -1
- package/@types/middleware/index.d.ts +1181 -0
- package/@types/middleware/with-schemas/index.d.ts +1495 -0
- package/@types/omni/index.d.ts +1 -0
- package/@types/omni/with-schemas/index.d.ts +1 -0
- package/@types/store/index.d.ts +0 -1
- package/@types/with-schemas/index.d.ts +1 -0
- package/agents.md +33 -11
- package/checkpoints/index.js +20 -20
- package/checkpoints/with-schemas/index.js +20 -20
- package/common/index.js +3 -2
- package/common/with-schemas/index.js +3 -2
- package/index.js +632 -215
- package/indexes/index.js +13 -12
- package/indexes/with-schemas/index.js +13 -12
- package/mergeable-store/index.js +498 -197
- package/mergeable-store/with-schemas/index.js +498 -197
- package/metrics/index.js +13 -12
- package/metrics/with-schemas/index.js +13 -12
- package/middleware/index.js +169 -0
- package/middleware/with-schemas/index.js +169 -0
- 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/middleware/index.js +1 -0
- package/min/middleware/index.js.gz +0 -0
- package/min/middleware/with-schemas/index.js +1 -0
- package/min/middleware/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 +667 -232
- package/omni/with-schemas/index.js +667 -232
- package/package.json +55 -19
- 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 +24 -17
- package/persisters/persister-durable-object-storage/with-schemas/index.js +24 -17
- 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 +16 -20
- package/queries/with-schemas/index.js +16 -20
- package/readme.md +21 -13
- package/relationships/index.js +13 -12
- package/relationships/with-schemas/index.js +13 -12
- package/releases.md +59 -43
- package/store/index.js +479 -192
- package/store/with-schemas/index.js +479 -192
- 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 +475 -193
- package/ui-react-inspector/with-schemas/index.js +475 -193
- package/with-schemas/index.js +632 -215
package/with-schemas/index.js
CHANGED
|
@@ -64,6 +64,7 @@ const size = (arrayOrString) => arrayOrString.length;
|
|
|
64
64
|
const test = (regex, subject) => regex.test(subject);
|
|
65
65
|
const getUndefined = () => void 0;
|
|
66
66
|
const noop = () => {};
|
|
67
|
+
const structuredClone = GLOBAL.structuredClone;
|
|
67
68
|
const tryCatch = async (action, then1, then2) => {
|
|
68
69
|
try {
|
|
69
70
|
return await action();
|
|
@@ -99,25 +100,6 @@ const arrayPop = (array) => array.pop();
|
|
|
99
100
|
const arrayUnshift = (array, ...values) => array.unshift(...values);
|
|
100
101
|
const arrayShift = (array) => array.shift();
|
|
101
102
|
|
|
102
|
-
const getCellOrValueType = (cellOrValue) => {
|
|
103
|
-
if (isNull(cellOrValue)) {
|
|
104
|
-
return NULL;
|
|
105
|
-
}
|
|
106
|
-
const type = getTypeOf(cellOrValue);
|
|
107
|
-
return isTypeStringOrBoolean(type) ||
|
|
108
|
-
(type == NUMBER && isFiniteNumber(cellOrValue))
|
|
109
|
-
? type
|
|
110
|
-
: void 0;
|
|
111
|
-
};
|
|
112
|
-
const isCellOrValueOrUndefined = (cellOrValue) =>
|
|
113
|
-
isUndefined(cellOrValue) || !isUndefined(getCellOrValueType(cellOrValue));
|
|
114
|
-
const setOrDelCell = (store, tableId, rowId, cellId, cell) =>
|
|
115
|
-
isUndefined(cell)
|
|
116
|
-
? store.delCell(tableId, rowId, cellId, true)
|
|
117
|
-
: store.setCell(tableId, rowId, cellId, cell);
|
|
118
|
-
const setOrDelValue = (store, valueId, value) =>
|
|
119
|
-
isUndefined(value) ? store.delValue(valueId) : store.setValue(valueId, value);
|
|
120
|
-
|
|
121
103
|
const collSizeN = (collSizer) => (coll) =>
|
|
122
104
|
arrayReduce(collValues(coll), (total, coll2) => total + collSizer(coll2), 0);
|
|
123
105
|
const collSize = (coll) => coll?.size ?? 0;
|
|
@@ -149,6 +131,7 @@ const isObject = (obj) =>
|
|
|
149
131
|
const objIds = object.keys;
|
|
150
132
|
const objFreeze = object.freeze;
|
|
151
133
|
const objNew = (entries = []) => object.fromEntries(entries);
|
|
134
|
+
const objMerge = (...objs) => object.assign({}, ...objs);
|
|
152
135
|
const objGet = (obj, id) => ifNotUndefined(obj, (obj2) => obj2[id]);
|
|
153
136
|
const objHas = (obj, id) => id in obj;
|
|
154
137
|
const objDel = (obj, id) => {
|
|
@@ -208,31 +191,32 @@ const objValidate = (obj, validateChild, onInvalidObj, emptyIsValid = 0) => {
|
|
|
208
191
|
return emptyIsValid ? true : !objIsEmpty(obj);
|
|
209
192
|
};
|
|
210
193
|
|
|
211
|
-
const
|
|
212
|
-
const
|
|
213
|
-
const
|
|
214
|
-
const
|
|
215
|
-
|
|
194
|
+
const map = Map;
|
|
195
|
+
const mapNew = (entries) => new map(entries);
|
|
196
|
+
const mapKeys = (map2) => [...(map2?.keys() ?? [])];
|
|
197
|
+
const mapGet = (map2, key) => map2?.get(key);
|
|
198
|
+
const mapForEach = (map2, cb) =>
|
|
199
|
+
collForEach(map2, (value, key) => cb(key, value));
|
|
216
200
|
const mapMap = (coll, cb) =>
|
|
217
201
|
arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
|
|
218
|
-
const mapSet = (
|
|
219
|
-
isUndefined(value) ? (collDel(
|
|
220
|
-
const mapEnsure = (
|
|
221
|
-
if (!collHas(
|
|
222
|
-
mapSet(
|
|
202
|
+
const mapSet = (map2, key, value) =>
|
|
203
|
+
isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
|
|
204
|
+
const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
|
|
205
|
+
if (!collHas(map2, key)) {
|
|
206
|
+
mapSet(map2, key, getDefaultValue());
|
|
223
207
|
} else {
|
|
224
|
-
hadExistingValue?.(mapGet(
|
|
208
|
+
hadExistingValue?.(mapGet(map2, key));
|
|
225
209
|
}
|
|
226
|
-
return mapGet(
|
|
210
|
+
return mapGet(map2, key);
|
|
227
211
|
};
|
|
228
|
-
const mapMatch = (
|
|
229
|
-
objMap(obj, (value, id) => set(
|
|
230
|
-
mapForEach(
|
|
231
|
-
return
|
|
212
|
+
const mapMatch = (map2, obj, set, del = mapSet) => {
|
|
213
|
+
objMap(obj, (value, id) => set(map2, id, value));
|
|
214
|
+
mapForEach(map2, (id) => (objHas(obj, id) ? 0 : del(map2, id)));
|
|
215
|
+
return map2;
|
|
232
216
|
};
|
|
233
|
-
const mapToObj = (
|
|
217
|
+
const mapToObj = (map2, valueMapper, excludeMapValue, excludeObjValue) => {
|
|
234
218
|
const obj = {};
|
|
235
|
-
collForEach(
|
|
219
|
+
collForEach(map2, (mapValue, id) => {
|
|
236
220
|
if (!excludeMapValue?.(mapValue, id)) {
|
|
237
221
|
const objValue = valueMapper ? valueMapper(mapValue, id) : mapValue;
|
|
238
222
|
if (!excludeObjValue?.(objValue)) {
|
|
@@ -242,27 +226,27 @@ const mapToObj = (map, valueMapper, excludeMapValue, excludeObjValue) => {
|
|
|
242
226
|
});
|
|
243
227
|
return obj;
|
|
244
228
|
};
|
|
245
|
-
const mapToObj2 = (
|
|
229
|
+
const mapToObj2 = (map2, valueMapper, excludeMapValue) =>
|
|
246
230
|
mapToObj(
|
|
247
|
-
|
|
231
|
+
map2,
|
|
248
232
|
(childMap) => mapToObj(childMap, valueMapper, excludeMapValue),
|
|
249
233
|
collIsEmpty,
|
|
250
234
|
objIsEmpty,
|
|
251
235
|
);
|
|
252
|
-
const mapToObj3 = (
|
|
236
|
+
const mapToObj3 = (map2, valueMapper, excludeMapValue) =>
|
|
253
237
|
mapToObj(
|
|
254
|
-
|
|
238
|
+
map2,
|
|
255
239
|
(childMap) => mapToObj2(childMap, valueMapper, excludeMapValue),
|
|
256
240
|
collIsEmpty,
|
|
257
241
|
objIsEmpty,
|
|
258
242
|
);
|
|
259
|
-
const mapClone = (
|
|
260
|
-
const
|
|
261
|
-
collForEach(
|
|
262
|
-
return
|
|
243
|
+
const mapClone = (map2, mapValue) => {
|
|
244
|
+
const map22 = mapNew();
|
|
245
|
+
collForEach(map2, (value, key) => map22.set(key, mapValue?.(value) ?? value));
|
|
246
|
+
return map22;
|
|
263
247
|
};
|
|
264
|
-
const mapClone2 = (
|
|
265
|
-
const mapClone3 = (
|
|
248
|
+
const mapClone2 = (map2) => mapClone(map2, mapClone);
|
|
249
|
+
const mapClone3 = (map2) => mapClone(map2, mapClone2);
|
|
266
250
|
const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
|
|
267
251
|
ifNotUndefined(
|
|
268
252
|
(ensureLeaf ? mapEnsure : mapGet)(
|
|
@@ -576,12 +560,18 @@ const createCheckpoints = getCreateFunction(
|
|
|
576
560
|
collForEach(cellsDelta2, (table, tableId) =>
|
|
577
561
|
collForEach(table, (row, rowId) =>
|
|
578
562
|
collForEach(row, (oldNew, cellId) =>
|
|
579
|
-
setOrDelCell(
|
|
563
|
+
store.setOrDelCell(
|
|
564
|
+
tableId,
|
|
565
|
+
rowId,
|
|
566
|
+
cellId,
|
|
567
|
+
oldNew[oldOrNew],
|
|
568
|
+
true,
|
|
569
|
+
),
|
|
580
570
|
),
|
|
581
571
|
),
|
|
582
572
|
);
|
|
583
573
|
collForEach(valuesDelta2, (oldNew, valueId) =>
|
|
584
|
-
setOrDelValue(
|
|
574
|
+
store.setOrDelValue(valueId, oldNew[oldOrNew], true),
|
|
585
575
|
);
|
|
586
576
|
});
|
|
587
577
|
listening = 1;
|
|
@@ -1167,6 +1157,19 @@ const createIndexes = getCreateFunction((store) => {
|
|
|
1167
1157
|
return objFreeze(indexes);
|
|
1168
1158
|
});
|
|
1169
1159
|
|
|
1160
|
+
const getCellOrValueType = (cellOrValue) => {
|
|
1161
|
+
if (isNull(cellOrValue)) {
|
|
1162
|
+
return NULL;
|
|
1163
|
+
}
|
|
1164
|
+
const type = getTypeOf(cellOrValue);
|
|
1165
|
+
return isTypeStringOrBoolean(type) ||
|
|
1166
|
+
(type == NUMBER && isFiniteNumber(cellOrValue))
|
|
1167
|
+
? type
|
|
1168
|
+
: void 0;
|
|
1169
|
+
};
|
|
1170
|
+
const isCellOrValueOrUndefined = (cellOrValue) =>
|
|
1171
|
+
isUndefined(cellOrValue) || !isUndefined(getCellOrValueType(cellOrValue));
|
|
1172
|
+
|
|
1170
1173
|
const stampClone = ([value, hlc]) => stampNew(value, hlc);
|
|
1171
1174
|
const stampCloneWithHash = ([value, hlc, hash]) => [value, hlc, hash];
|
|
1172
1175
|
const stampNew = (value, hlc) => (hlc ? [value, hlc] : [value]);
|
|
@@ -1211,13 +1214,17 @@ const idsChanged = (changedIds, id2, addedOrRemoved) =>
|
|
|
1211
1214
|
id2,
|
|
1212
1215
|
mapGet(changedIds, id2) == -addedOrRemoved ? void 0 : addedOrRemoved,
|
|
1213
1216
|
);
|
|
1217
|
+
const contentOrChangesIsEqual = ([tables1, values1], [tables2, values2]) =>
|
|
1218
|
+
objIsEqual(tables1, tables2) && objIsEqual(values1, values2);
|
|
1214
1219
|
const createStore = () => {
|
|
1215
1220
|
let hasTablesSchema;
|
|
1216
1221
|
let hasValuesSchema;
|
|
1217
1222
|
let hadTables = false;
|
|
1218
1223
|
let hadValues = false;
|
|
1219
1224
|
let transactions = 0;
|
|
1225
|
+
let middleware = [];
|
|
1220
1226
|
let internalListeners = [];
|
|
1227
|
+
let mutating = 0;
|
|
1221
1228
|
const changedTableIds = mapNew();
|
|
1222
1229
|
const changedTableCellIds = mapNew();
|
|
1223
1230
|
const changedRowCount = mapNew();
|
|
@@ -1263,6 +1270,19 @@ const createStore = () => {
|
|
|
1263
1270
|
const finishTransactionListeners = pairNewMap();
|
|
1264
1271
|
const [addListener, callListeners, delListenerImpl, callListenerImpl] =
|
|
1265
1272
|
getListenerFunctions(() => store);
|
|
1273
|
+
const whileMutating = (action) => {
|
|
1274
|
+
const wasMutating = mutating;
|
|
1275
|
+
mutating = 1;
|
|
1276
|
+
const result = action();
|
|
1277
|
+
mutating = wasMutating;
|
|
1278
|
+
return result;
|
|
1279
|
+
};
|
|
1280
|
+
const ifTransformed = (snapshot, getResult, then, isEqual = Object.is) =>
|
|
1281
|
+
ifNotUndefined(getResult(), (result) =>
|
|
1282
|
+
snapshot === result || isEqual(snapshot, result)
|
|
1283
|
+
? then(result)
|
|
1284
|
+
: whileMutating(() => then(result)),
|
|
1285
|
+
);
|
|
1266
1286
|
const validateTablesSchema = (tableSchema) =>
|
|
1267
1287
|
objValidate(tableSchema, (tableSchema2) =>
|
|
1268
1288
|
objValidate(tableSchema2, validateCellOrValueSchema),
|
|
@@ -1450,82 +1470,194 @@ const createStore = () => {
|
|
|
1450
1470
|
);
|
|
1451
1471
|
const setOrDelTables = (tables) =>
|
|
1452
1472
|
objIsEmpty(tables) ? delTables() : setTables(tables);
|
|
1453
|
-
const
|
|
1454
|
-
(
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
const
|
|
1458
|
-
|
|
1459
|
-
|
|
1473
|
+
const setOrDelCell = (tableId, rowId, cellId, cell, skipMiddleware) =>
|
|
1474
|
+
isUndefined(cell)
|
|
1475
|
+
? delCell(tableId, rowId, cellId, true, skipMiddleware)
|
|
1476
|
+
: setCell(tableId, rowId, cellId, cell, skipMiddleware);
|
|
1477
|
+
const setOrDelValues = (values) =>
|
|
1478
|
+
objIsEmpty(values) ? delValues() : setValues(values);
|
|
1479
|
+
const setOrDelValue = (valueId, value, skipMiddleware) =>
|
|
1480
|
+
isUndefined(value)
|
|
1481
|
+
? delValue(valueId, skipMiddleware)
|
|
1482
|
+
: setValue(valueId, value, skipMiddleware);
|
|
1483
|
+
const setValidContent = (content) =>
|
|
1484
|
+
ifTransformed(
|
|
1485
|
+
content,
|
|
1486
|
+
() =>
|
|
1487
|
+
ifNotUndefined(
|
|
1488
|
+
middleware[0],
|
|
1489
|
+
(willSetContent) =>
|
|
1490
|
+
whileMutating(() => willSetContent(structuredClone(content))),
|
|
1491
|
+
() => content,
|
|
1492
|
+
),
|
|
1493
|
+
([tables, values]) => {
|
|
1494
|
+
(objIsEmpty(tables) ? delTables : setTables)(tables);
|
|
1495
|
+
(objIsEmpty(values) ? delValues : setValues)(values);
|
|
1496
|
+
},
|
|
1497
|
+
contentOrChangesIsEqual,
|
|
1498
|
+
);
|
|
1499
|
+
const setValidTables = (tables, forceDel) =>
|
|
1500
|
+
ifTransformed(
|
|
1460
1501
|
tables,
|
|
1461
|
-
(
|
|
1462
|
-
|
|
1502
|
+
() =>
|
|
1503
|
+
forceDel
|
|
1504
|
+
? tables
|
|
1505
|
+
: ifNotUndefined(
|
|
1506
|
+
middleware[1],
|
|
1507
|
+
(willSetTables) =>
|
|
1508
|
+
whileMutating(() => willSetTables(structuredClone(tables))),
|
|
1509
|
+
() => tables,
|
|
1510
|
+
),
|
|
1511
|
+
(validTables) =>
|
|
1512
|
+
mapMatch(
|
|
1513
|
+
tablesMap,
|
|
1514
|
+
validTables,
|
|
1515
|
+
(_tables, tableId, table) => setValidTable(tableId, table),
|
|
1516
|
+
(_tables, tableId) => delValidTable(tableId),
|
|
1517
|
+
),
|
|
1518
|
+
objIsEqual,
|
|
1463
1519
|
);
|
|
1464
|
-
const setValidTable = (tableId, table) =>
|
|
1465
|
-
|
|
1466
|
-
mapEnsure(tablesMap, tableId, () => {
|
|
1467
|
-
tableIdsChanged(tableId, 1);
|
|
1468
|
-
mapSet(tablePoolFunctions, tableId, getPoolFunctions());
|
|
1469
|
-
mapSet(tableCellIds, tableId, mapNew());
|
|
1470
|
-
return mapNew();
|
|
1471
|
-
}),
|
|
1520
|
+
const setValidTable = (tableId, table, forceDel) =>
|
|
1521
|
+
ifTransformed(
|
|
1472
1522
|
table,
|
|
1473
|
-
(
|
|
1474
|
-
|
|
1523
|
+
() =>
|
|
1524
|
+
forceDel
|
|
1525
|
+
? table
|
|
1526
|
+
: ifNotUndefined(
|
|
1527
|
+
middleware[2],
|
|
1528
|
+
(willSetTable) =>
|
|
1529
|
+
whileMutating(() =>
|
|
1530
|
+
willSetTable(tableId, structuredClone(table)),
|
|
1531
|
+
),
|
|
1532
|
+
() => table,
|
|
1533
|
+
),
|
|
1534
|
+
(validTable) =>
|
|
1535
|
+
mapMatch(
|
|
1536
|
+
mapEnsure(tablesMap, tableId, () => {
|
|
1537
|
+
tableIdsChanged(tableId, 1);
|
|
1538
|
+
mapSet(tablePoolFunctions, tableId, getPoolFunctions());
|
|
1539
|
+
mapSet(tableCellIds, tableId, mapNew());
|
|
1540
|
+
return mapNew();
|
|
1541
|
+
}),
|
|
1542
|
+
validTable,
|
|
1543
|
+
(tableMap, rowId, row) => setValidRow(tableId, tableMap, rowId, row),
|
|
1544
|
+
(tableMap, rowId) => delValidRow(tableId, tableMap, rowId),
|
|
1545
|
+
),
|
|
1546
|
+
objIsEqual,
|
|
1475
1547
|
);
|
|
1476
1548
|
const setValidRow = (tableId, tableMap, rowId, row, forceDel) =>
|
|
1477
|
-
|
|
1478
|
-
mapEnsure(tableMap, rowId, () => {
|
|
1479
|
-
rowIdsChanged(tableId, rowId, 1);
|
|
1480
|
-
return mapNew();
|
|
1481
|
-
}),
|
|
1549
|
+
ifTransformed(
|
|
1482
1550
|
row,
|
|
1483
|
-
(
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1551
|
+
() =>
|
|
1552
|
+
forceDel
|
|
1553
|
+
? row
|
|
1554
|
+
: ifNotUndefined(
|
|
1555
|
+
middleware[3],
|
|
1556
|
+
(willSetRow) =>
|
|
1557
|
+
whileMutating(() =>
|
|
1558
|
+
willSetRow(tableId, rowId, structuredClone(row)),
|
|
1559
|
+
),
|
|
1560
|
+
() => row,
|
|
1561
|
+
),
|
|
1562
|
+
(validRow) =>
|
|
1563
|
+
mapMatch(
|
|
1564
|
+
mapEnsure(tableMap, rowId, () => {
|
|
1565
|
+
rowIdsChanged(tableId, rowId, 1);
|
|
1566
|
+
return mapNew();
|
|
1567
|
+
}),
|
|
1568
|
+
validRow,
|
|
1569
|
+
(rowMap, cellId, cell) =>
|
|
1570
|
+
setValidCell(tableId, rowId, rowMap, cellId, cell),
|
|
1571
|
+
(rowMap, cellId) =>
|
|
1572
|
+
delValidCell(tableId, tableMap, rowId, rowMap, cellId, forceDel),
|
|
1573
|
+
),
|
|
1574
|
+
objIsEqual,
|
|
1575
|
+
);
|
|
1576
|
+
const setValidCell = (tableId, rowId, rowMap, cellId, cell, skipMiddleware) =>
|
|
1577
|
+
ifTransformed(
|
|
1578
|
+
cell,
|
|
1579
|
+
() =>
|
|
1580
|
+
ifNotUndefined(
|
|
1581
|
+
skipMiddleware ? void 0 : middleware[4],
|
|
1582
|
+
(willSetCell) =>
|
|
1583
|
+
whileMutating(() => willSetCell(tableId, rowId, cellId, cell)),
|
|
1584
|
+
() => cell,
|
|
1585
|
+
),
|
|
1586
|
+
(cell2) => {
|
|
1587
|
+
if (!collHas(rowMap, cellId)) {
|
|
1588
|
+
cellIdsChanged(tableId, rowId, cellId, 1);
|
|
1589
|
+
}
|
|
1590
|
+
const oldCell = mapGet(rowMap, cellId);
|
|
1591
|
+
if (cell2 !== oldCell) {
|
|
1592
|
+
cellChanged(tableId, rowId, cellId, oldCell, cell2);
|
|
1593
|
+
mapSet(rowMap, cellId, cell2);
|
|
1594
|
+
}
|
|
1595
|
+
},
|
|
1596
|
+
);
|
|
1597
|
+
const setCellIntoNewRow = (
|
|
1598
|
+
tableId,
|
|
1599
|
+
tableMap,
|
|
1600
|
+
rowId,
|
|
1601
|
+
cellId,
|
|
1602
|
+
validCell,
|
|
1603
|
+
skipMiddleware,
|
|
1604
|
+
) =>
|
|
1499
1605
|
ifNotUndefined(
|
|
1500
1606
|
mapGet(tableMap, rowId),
|
|
1501
|
-
(rowMap) =>
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1607
|
+
(rowMap) =>
|
|
1608
|
+
setValidCell(tableId, rowId, rowMap, cellId, validCell, skipMiddleware),
|
|
1609
|
+
() => {
|
|
1610
|
+
const rowMap = mapNew();
|
|
1611
|
+
mapSet(tableMap, rowId, rowMap);
|
|
1612
|
+
rowIdsChanged(tableId, rowId, 1);
|
|
1613
|
+
objMap(
|
|
1507
1614
|
addDefaultsToRow({[cellId]: validCell}, tableId, rowId),
|
|
1508
|
-
|
|
1615
|
+
(cell, cellId2) =>
|
|
1616
|
+
setValidCell(tableId, rowId, rowMap, cellId2, cell, skipMiddleware),
|
|
1617
|
+
);
|
|
1618
|
+
},
|
|
1509
1619
|
);
|
|
1510
|
-
const
|
|
1511
|
-
|
|
1512
|
-
const setValidValues = (values) =>
|
|
1513
|
-
mapMatch(
|
|
1514
|
-
valuesMap,
|
|
1620
|
+
const setValidValues = (values, forceDel) =>
|
|
1621
|
+
ifTransformed(
|
|
1515
1622
|
values,
|
|
1516
|
-
(
|
|
1517
|
-
|
|
1623
|
+
() =>
|
|
1624
|
+
forceDel
|
|
1625
|
+
? values
|
|
1626
|
+
: ifNotUndefined(
|
|
1627
|
+
middleware[5],
|
|
1628
|
+
(willSetValues) =>
|
|
1629
|
+
whileMutating(() => willSetValues(structuredClone(values))),
|
|
1630
|
+
() => values,
|
|
1631
|
+
),
|
|
1632
|
+
(validValues) =>
|
|
1633
|
+
mapMatch(
|
|
1634
|
+
valuesMap,
|
|
1635
|
+
validValues,
|
|
1636
|
+
(_valuesMap, valueId, value) => setValidValue(valueId, value),
|
|
1637
|
+
(_valuesMap, valueId) => delValidValue(valueId),
|
|
1638
|
+
),
|
|
1639
|
+
objIsEqual,
|
|
1640
|
+
);
|
|
1641
|
+
const setValidValue = (valueId, value, skipMiddleware) =>
|
|
1642
|
+
ifTransformed(
|
|
1643
|
+
value,
|
|
1644
|
+
() =>
|
|
1645
|
+
ifNotUndefined(
|
|
1646
|
+
skipMiddleware ? void 0 : middleware[6],
|
|
1647
|
+
(willSetValue) => whileMutating(() => willSetValue(valueId, value)),
|
|
1648
|
+
() => value,
|
|
1649
|
+
),
|
|
1650
|
+
(value2) => {
|
|
1651
|
+
if (!collHas(valuesMap, valueId)) {
|
|
1652
|
+
valueIdsChanged(valueId, 1);
|
|
1653
|
+
}
|
|
1654
|
+
const oldValue = mapGet(valuesMap, valueId);
|
|
1655
|
+
if (value2 !== oldValue) {
|
|
1656
|
+
valueChanged(valueId, oldValue, value2);
|
|
1657
|
+
mapSet(valuesMap, valueId, value2);
|
|
1658
|
+
}
|
|
1659
|
+
},
|
|
1518
1660
|
);
|
|
1519
|
-
const setValidValue = (valueId, value) => {
|
|
1520
|
-
if (!collHas(valuesMap, valueId)) {
|
|
1521
|
-
valueIdsChanged(valueId, 1);
|
|
1522
|
-
}
|
|
1523
|
-
const oldValue = mapGet(valuesMap, valueId);
|
|
1524
|
-
if (value !== oldValue) {
|
|
1525
|
-
valueChanged(valueId, oldValue, value);
|
|
1526
|
-
mapSet(valuesMap, valueId, value);
|
|
1527
|
-
}
|
|
1528
|
-
};
|
|
1529
1661
|
const getNewRowId = (tableId, reuse) => {
|
|
1530
1662
|
const [getId] = mapGet(tablePoolFunctions, tableId);
|
|
1531
1663
|
let rowId;
|
|
@@ -1535,14 +1667,34 @@ const createStore = () => {
|
|
|
1535
1667
|
return rowId;
|
|
1536
1668
|
};
|
|
1537
1669
|
const getOrCreateTable = (tableId) =>
|
|
1538
|
-
|
|
1539
|
-
|
|
1670
|
+
mapEnsure(tablesMap, tableId, () => {
|
|
1671
|
+
tableIdsChanged(tableId, 1);
|
|
1672
|
+
mapSet(tablePoolFunctions, tableId, getPoolFunctions());
|
|
1673
|
+
mapSet(tableCellIds, tableId, mapNew());
|
|
1674
|
+
return mapNew();
|
|
1675
|
+
});
|
|
1676
|
+
const delValidTable = (tableId) => {
|
|
1677
|
+
if (whileMutating(() => middleware[8]?.(tableId)) ?? true) {
|
|
1678
|
+
return setValidTable(tableId, {}, true);
|
|
1679
|
+
}
|
|
1680
|
+
return mapGet(tablesMap, tableId);
|
|
1681
|
+
};
|
|
1540
1682
|
const delValidRow = (tableId, tableMap, rowId) => {
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1683
|
+
if (whileMutating(() => middleware[9]?.(tableId, rowId)) ?? true) {
|
|
1684
|
+
const [, releaseId] = mapGet(tablePoolFunctions, tableId);
|
|
1685
|
+
releaseId(rowId);
|
|
1686
|
+
setValidRow(tableId, tableMap, rowId, {}, true);
|
|
1687
|
+
}
|
|
1544
1688
|
};
|
|
1545
|
-
const delValidCell = (
|
|
1689
|
+
const delValidCell = (
|
|
1690
|
+
tableId,
|
|
1691
|
+
table,
|
|
1692
|
+
rowId,
|
|
1693
|
+
row,
|
|
1694
|
+
cellId,
|
|
1695
|
+
forceDel,
|
|
1696
|
+
skipMiddleware,
|
|
1697
|
+
) => {
|
|
1546
1698
|
const defaultCell = mapGet(
|
|
1547
1699
|
mapGet(tablesSchemaRowCache, tableId)?.[0],
|
|
1548
1700
|
cellId,
|
|
@@ -1550,34 +1702,44 @@ const createStore = () => {
|
|
|
1550
1702
|
if (!isUndefined(defaultCell) && !forceDel) {
|
|
1551
1703
|
return setValidCell(tableId, rowId, row, cellId, defaultCell);
|
|
1552
1704
|
}
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
mapSet(
|
|
1705
|
+
if (
|
|
1706
|
+
skipMiddleware ||
|
|
1707
|
+
(whileMutating(() => middleware[10]?.(tableId, rowId, cellId)) ?? true)
|
|
1708
|
+
) {
|
|
1709
|
+
const delCell2 = (cellId2) => {
|
|
1710
|
+
cellChanged(tableId, rowId, cellId2, mapGet(row, cellId2));
|
|
1711
|
+
cellIdsChanged(tableId, rowId, cellId2, -1);
|
|
1712
|
+
mapSet(row, cellId2);
|
|
1713
|
+
};
|
|
1714
|
+
if (isUndefined(defaultCell)) {
|
|
1715
|
+
delCell2(cellId);
|
|
1716
|
+
} else {
|
|
1717
|
+
mapForEach(row, delCell2);
|
|
1718
|
+
}
|
|
1719
|
+
if (collIsEmpty(row)) {
|
|
1720
|
+
rowIdsChanged(tableId, rowId, -1);
|
|
1721
|
+
if (collIsEmpty(mapSet(table, rowId))) {
|
|
1722
|
+
tableIdsChanged(tableId, -1);
|
|
1723
|
+
mapSet(tablesMap, tableId);
|
|
1724
|
+
mapSet(tablePoolFunctions, tableId);
|
|
1725
|
+
mapSet(tableCellIds, tableId);
|
|
1726
|
+
}
|
|
1570
1727
|
}
|
|
1571
1728
|
}
|
|
1572
1729
|
};
|
|
1573
|
-
const delValidValue = (valueId) => {
|
|
1730
|
+
const delValidValue = (valueId, skipMiddleware) => {
|
|
1574
1731
|
const defaultValue = mapGet(valuesDefaulted, valueId);
|
|
1575
1732
|
if (!isUndefined(defaultValue)) {
|
|
1576
1733
|
return setValidValue(valueId, defaultValue);
|
|
1577
1734
|
}
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1735
|
+
if (
|
|
1736
|
+
skipMiddleware ||
|
|
1737
|
+
(whileMutating(() => middleware[12]?.(valueId)) ?? true)
|
|
1738
|
+
) {
|
|
1739
|
+
valueChanged(valueId, mapGet(valuesMap, valueId));
|
|
1740
|
+
valueIdsChanged(valueId, -1);
|
|
1741
|
+
mapSet(valuesMap, valueId);
|
|
1742
|
+
}
|
|
1581
1743
|
};
|
|
1582
1744
|
const tableIdsChanged = (tableId, addedOrRemoved) =>
|
|
1583
1745
|
idsChanged(changedTableIds, tableId, addedOrRemoved);
|
|
@@ -1622,13 +1784,13 @@ const createStore = () => {
|
|
|
1622
1784
|
cellId,
|
|
1623
1785
|
() => [oldCell, 0],
|
|
1624
1786
|
)[1] = newCell;
|
|
1625
|
-
internalListeners[3]?.(tableId, rowId, cellId, newCell);
|
|
1787
|
+
internalListeners[3]?.(tableId, rowId, cellId, newCell, mutating);
|
|
1626
1788
|
};
|
|
1627
1789
|
const valueIdsChanged = (valueId, addedOrRemoved) =>
|
|
1628
1790
|
idsChanged(changedValueIds, valueId, addedOrRemoved);
|
|
1629
1791
|
const valueChanged = (valueId, oldValue, newValue) => {
|
|
1630
1792
|
mapEnsure(changedValues, valueId, () => [oldValue, 0])[1] = newValue;
|
|
1631
|
-
internalListeners[4]?.(valueId, newValue);
|
|
1793
|
+
internalListeners[4]?.(valueId, newValue, mutating);
|
|
1632
1794
|
};
|
|
1633
1795
|
const cellInvalid = (tableId, rowId, cellId, invalidCell, defaultedCell) => {
|
|
1634
1796
|
arrayPush(
|
|
@@ -1702,15 +1864,16 @@ const createStore = () => {
|
|
|
1702
1864
|
return 1;
|
|
1703
1865
|
}
|
|
1704
1866
|
};
|
|
1867
|
+
const clonedChangedCells = (changedCells2) =>
|
|
1868
|
+
mapClone(changedCells2, (map) =>
|
|
1869
|
+
mapClone(map, (map2) => mapClone(map2, pairClone)),
|
|
1870
|
+
);
|
|
1705
1871
|
const callTabularListenersForChanges = (mutator) => {
|
|
1706
|
-
const
|
|
1707
|
-
|
|
1708
|
-
callListeners(hasTablesListeners[mutator], void 0, hasTablesNow);
|
|
1709
|
-
}
|
|
1710
|
-
const emptySortedRowIdListeners = collIsEmpty(
|
|
1872
|
+
const hasHasTablesListeners = !collIsEmpty(hasTablesListeners[mutator]);
|
|
1873
|
+
const hasSortedRowIdListeners = !collIsEmpty(
|
|
1711
1874
|
sortedRowIdsListeners[mutator],
|
|
1712
1875
|
);
|
|
1713
|
-
const
|
|
1876
|
+
const hasIdOrHasListeners = !(
|
|
1714
1877
|
collIsEmpty(cellIdsListeners[mutator]) &&
|
|
1715
1878
|
collIsEmpty(hasCellListeners[mutator]) &&
|
|
1716
1879
|
collIsEmpty(rowIdsListeners[mutator]) &&
|
|
@@ -1718,15 +1881,17 @@ const createStore = () => {
|
|
|
1718
1881
|
collIsEmpty(tableCellIdsListeners[mutator]) &&
|
|
1719
1882
|
collIsEmpty(hasTableCellListeners[mutator]) &&
|
|
1720
1883
|
collIsEmpty(rowCountListeners[mutator]) &&
|
|
1721
|
-
|
|
1884
|
+
!hasSortedRowIdListeners &&
|
|
1722
1885
|
collIsEmpty(tableIdsListeners[mutator]) &&
|
|
1723
|
-
collIsEmpty(hasTableListeners[mutator])
|
|
1724
|
-
|
|
1886
|
+
collIsEmpty(hasTableListeners[mutator])
|
|
1887
|
+
);
|
|
1888
|
+
const hasOtherListeners = !(
|
|
1725
1889
|
collIsEmpty(cellListeners[mutator]) &&
|
|
1726
1890
|
collIsEmpty(rowListeners[mutator]) &&
|
|
1727
1891
|
collIsEmpty(tableListeners[mutator]) &&
|
|
1728
|
-
collIsEmpty(tablesListeners[mutator])
|
|
1729
|
-
|
|
1892
|
+
collIsEmpty(tablesListeners[mutator])
|
|
1893
|
+
);
|
|
1894
|
+
if (hasHasTablesListeners || hasIdOrHasListeners || hasOtherListeners) {
|
|
1730
1895
|
const changes = mutator
|
|
1731
1896
|
? [
|
|
1732
1897
|
mapClone(changedTableIds),
|
|
@@ -1734,7 +1899,7 @@ const createStore = () => {
|
|
|
1734
1899
|
mapClone(changedRowCount),
|
|
1735
1900
|
mapClone2(changedRowIds),
|
|
1736
1901
|
mapClone3(changedCellIds),
|
|
1737
|
-
|
|
1902
|
+
clonedChangedCells(changedCells),
|
|
1738
1903
|
]
|
|
1739
1904
|
: [
|
|
1740
1905
|
changedTableIds,
|
|
@@ -1744,7 +1909,13 @@ const createStore = () => {
|
|
|
1744
1909
|
changedCellIds,
|
|
1745
1910
|
changedCells,
|
|
1746
1911
|
];
|
|
1747
|
-
if (
|
|
1912
|
+
if (hasHasTablesListeners) {
|
|
1913
|
+
const hasTablesNow = hasTables();
|
|
1914
|
+
if (hasTablesNow != hadTables) {
|
|
1915
|
+
callListeners(hasTablesListeners[mutator], void 0, hasTablesNow);
|
|
1916
|
+
}
|
|
1917
|
+
}
|
|
1918
|
+
if (hasIdOrHasListeners) {
|
|
1748
1919
|
callIdsAndHasListenersIfChanged(
|
|
1749
1920
|
changes[0],
|
|
1750
1921
|
tableIdsListeners[mutator],
|
|
@@ -1776,13 +1947,13 @@ const createStore = () => {
|
|
|
1776
1947
|
hasRowListeners[mutator],
|
|
1777
1948
|
[tableId],
|
|
1778
1949
|
) &&
|
|
1779
|
-
|
|
1950
|
+
hasSortedRowIdListeners
|
|
1780
1951
|
) {
|
|
1781
1952
|
callListeners(sortedRowIdsListeners[mutator], [tableId, null]);
|
|
1782
1953
|
setAdd(calledSortableTableIds, tableId);
|
|
1783
1954
|
}
|
|
1784
1955
|
});
|
|
1785
|
-
if (
|
|
1956
|
+
if (hasSortedRowIdListeners) {
|
|
1786
1957
|
collForEach(changes[5], (rows, tableId) => {
|
|
1787
1958
|
if (!collHas(calledSortableTableIds, tableId)) {
|
|
1788
1959
|
const sortableCellIds = setNew();
|
|
@@ -1813,7 +1984,7 @@ const createStore = () => {
|
|
|
1813
1984
|
),
|
|
1814
1985
|
);
|
|
1815
1986
|
}
|
|
1816
|
-
if (
|
|
1987
|
+
if (hasOtherListeners) {
|
|
1817
1988
|
let tablesChanged;
|
|
1818
1989
|
collForEach(changes[5], (rows, tableId) => {
|
|
1819
1990
|
let tableChanged;
|
|
@@ -1850,28 +2021,31 @@ const createStore = () => {
|
|
|
1850
2021
|
}
|
|
1851
2022
|
};
|
|
1852
2023
|
const callValuesListenersForChanges = (mutator) => {
|
|
1853
|
-
const
|
|
1854
|
-
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
const
|
|
1858
|
-
collIsEmpty(
|
|
1859
|
-
collIsEmpty(
|
|
1860
|
-
|
|
1861
|
-
collIsEmpty(valueListeners[mutator]) &&
|
|
1862
|
-
collIsEmpty(valuesListeners[mutator]);
|
|
1863
|
-
if (!emptyIdAndHasListeners || !emptyOtherListeners) {
|
|
2024
|
+
const hasHasValuesListeners = !collIsEmpty(hasValuesListeners[mutator]);
|
|
2025
|
+
const hasIdOrHasListeners =
|
|
2026
|
+
!collIsEmpty(valueIdsListeners[mutator]) ||
|
|
2027
|
+
!collIsEmpty(hasValueListeners[mutator]);
|
|
2028
|
+
const hasOtherListeners =
|
|
2029
|
+
!collIsEmpty(valueListeners[mutator]) ||
|
|
2030
|
+
!collIsEmpty(valuesListeners[mutator]);
|
|
2031
|
+
if (hasHasValuesListeners || hasIdOrHasListeners || hasOtherListeners) {
|
|
1864
2032
|
const changes = mutator
|
|
1865
|
-
? [mapClone(changedValueIds), mapClone(changedValues)]
|
|
2033
|
+
? [mapClone(changedValueIds), mapClone(changedValues, pairClone)]
|
|
1866
2034
|
: [changedValueIds, changedValues];
|
|
1867
|
-
if (
|
|
2035
|
+
if (hasHasValuesListeners) {
|
|
2036
|
+
const hasValuesNow = hasValues();
|
|
2037
|
+
if (hasValuesNow != hadValues) {
|
|
2038
|
+
callListeners(hasValuesListeners[mutator], void 0, hasValuesNow);
|
|
2039
|
+
}
|
|
2040
|
+
}
|
|
2041
|
+
if (hasIdOrHasListeners) {
|
|
1868
2042
|
callIdsAndHasListenersIfChanged(
|
|
1869
2043
|
changes[0],
|
|
1870
2044
|
valueIdsListeners[mutator],
|
|
1871
2045
|
hasValueListeners[mutator],
|
|
1872
2046
|
);
|
|
1873
2047
|
}
|
|
1874
|
-
if (
|
|
2048
|
+
if (hasOtherListeners) {
|
|
1875
2049
|
let valuesChanged;
|
|
1876
2050
|
collForEach(changes[1], ([oldValue, newValue], valueId) => {
|
|
1877
2051
|
if (newValue !== oldValue) {
|
|
@@ -2026,14 +2200,14 @@ const createStore = () => {
|
|
|
2026
2200
|
if (validateRow(tableId2, rowId2, partialRow, 1)) {
|
|
2027
2201
|
const table = getOrCreateTable(tableId2);
|
|
2028
2202
|
objMap(partialRow, (cell, cellId) =>
|
|
2029
|
-
|
|
2203
|
+
setCellIntoNewRow(tableId2, table, rowId2, cellId, cell),
|
|
2030
2204
|
);
|
|
2031
2205
|
}
|
|
2032
2206
|
},
|
|
2033
2207
|
tableId,
|
|
2034
2208
|
rowId,
|
|
2035
2209
|
);
|
|
2036
|
-
const setCell = (tableId, rowId, cellId, cell) =>
|
|
2210
|
+
const setCell = (tableId, rowId, cellId, cell, skipMiddleware) =>
|
|
2037
2211
|
fluentTransaction(
|
|
2038
2212
|
(tableId2, rowId2, cellId2) =>
|
|
2039
2213
|
ifNotUndefined(
|
|
@@ -2044,12 +2218,13 @@ const createStore = () => {
|
|
|
2044
2218
|
isFunction(cell) ? cell(getCell(tableId2, rowId2, cellId2)) : cell,
|
|
2045
2219
|
),
|
|
2046
2220
|
(validCell) =>
|
|
2047
|
-
|
|
2221
|
+
setCellIntoNewRow(
|
|
2048
2222
|
tableId2,
|
|
2049
2223
|
getOrCreateTable(tableId2),
|
|
2050
2224
|
rowId2,
|
|
2051
2225
|
cellId2,
|
|
2052
2226
|
validCell,
|
|
2227
|
+
skipMiddleware,
|
|
2053
2228
|
),
|
|
2054
2229
|
),
|
|
2055
2230
|
tableId,
|
|
@@ -2068,7 +2243,7 @@ const createStore = () => {
|
|
|
2068
2243
|
)
|
|
2069
2244
|
: 0,
|
|
2070
2245
|
);
|
|
2071
|
-
const setValue = (valueId, value) =>
|
|
2246
|
+
const setValue = (valueId, value, skipMiddleware) =>
|
|
2072
2247
|
fluentTransaction(
|
|
2073
2248
|
(valueId2) =>
|
|
2074
2249
|
ifNotUndefined(
|
|
@@ -2076,27 +2251,40 @@ const createStore = () => {
|
|
|
2076
2251
|
valueId2,
|
|
2077
2252
|
isFunction(value) ? value(getValue(valueId2)) : value,
|
|
2078
2253
|
),
|
|
2079
|
-
(validValue) => setValidValue(valueId2, validValue),
|
|
2254
|
+
(validValue) => setValidValue(valueId2, validValue, skipMiddleware),
|
|
2080
2255
|
),
|
|
2081
2256
|
valueId,
|
|
2082
2257
|
);
|
|
2083
2258
|
const applyChanges = (changes) =>
|
|
2084
|
-
fluentTransaction(() =>
|
|
2085
|
-
|
|
2086
|
-
|
|
2087
|
-
|
|
2088
|
-
|
|
2089
|
-
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2259
|
+
fluentTransaction(() =>
|
|
2260
|
+
ifTransformed(
|
|
2261
|
+
changes,
|
|
2262
|
+
() =>
|
|
2263
|
+
ifNotUndefined(
|
|
2264
|
+
middleware[13],
|
|
2265
|
+
(willApplyChanges) =>
|
|
2266
|
+
whileMutating(() => willApplyChanges(structuredClone(changes))),
|
|
2267
|
+
() => changes,
|
|
2268
|
+
),
|
|
2269
|
+
(changes2) => {
|
|
2270
|
+
objMap(changes2[0], (table, tableId) =>
|
|
2271
|
+
isUndefined(table)
|
|
2272
|
+
? delTable(tableId)
|
|
2273
|
+
: objMap(table, (row, rowId) =>
|
|
2274
|
+
isUndefined(row)
|
|
2275
|
+
? delRow(tableId, rowId)
|
|
2276
|
+
: objMap(row, (cell, cellId) =>
|
|
2277
|
+
setOrDelCell(tableId, rowId, cellId, cell),
|
|
2278
|
+
),
|
|
2279
|
+
),
|
|
2280
|
+
);
|
|
2281
|
+
objMap(changes2[1], (value, valueId) =>
|
|
2282
|
+
setOrDelValue(valueId, value),
|
|
2283
|
+
);
|
|
2284
|
+
},
|
|
2285
|
+
contentOrChangesIsEqual,
|
|
2286
|
+
),
|
|
2287
|
+
);
|
|
2100
2288
|
const setTablesJson = (tablesJson) => {
|
|
2101
2289
|
tryCatch(() => setOrDelTables(jsonParse(tablesJson)));
|
|
2102
2290
|
return store;
|
|
@@ -2143,7 +2331,12 @@ const createStore = () => {
|
|
|
2143
2331
|
setTablesSchema(tablesSchema);
|
|
2144
2332
|
setValuesSchema(valuesSchema);
|
|
2145
2333
|
});
|
|
2146
|
-
const delTables = () =>
|
|
2334
|
+
const delTables = () =>
|
|
2335
|
+
fluentTransaction(() =>
|
|
2336
|
+
(whileMutating(() => middleware[7]?.()) ?? true)
|
|
2337
|
+
? setValidTables({}, true)
|
|
2338
|
+
: 0,
|
|
2339
|
+
);
|
|
2147
2340
|
const delTable = (tableId) =>
|
|
2148
2341
|
fluentTransaction(
|
|
2149
2342
|
(tableId2) =>
|
|
@@ -2161,7 +2354,7 @@ const createStore = () => {
|
|
|
2161
2354
|
tableId,
|
|
2162
2355
|
rowId,
|
|
2163
2356
|
);
|
|
2164
|
-
const delCell = (tableId, rowId, cellId, forceDel) =>
|
|
2357
|
+
const delCell = (tableId, rowId, cellId, forceDel, skipMiddleware) =>
|
|
2165
2358
|
fluentTransaction(
|
|
2166
2359
|
(tableId2, rowId2, cellId2) =>
|
|
2167
2360
|
ifNotUndefined(mapGet(tablesMap, tableId2), (tableMap) =>
|
|
@@ -2174,6 +2367,7 @@ const createStore = () => {
|
|
|
2174
2367
|
rowMap,
|
|
2175
2368
|
cellId2,
|
|
2176
2369
|
forceDel,
|
|
2370
|
+
skipMiddleware,
|
|
2177
2371
|
)
|
|
2178
2372
|
: 0,
|
|
2179
2373
|
),
|
|
@@ -2182,11 +2376,18 @@ const createStore = () => {
|
|
|
2182
2376
|
rowId,
|
|
2183
2377
|
cellId,
|
|
2184
2378
|
);
|
|
2185
|
-
const delValues = () =>
|
|
2186
|
-
|
|
2379
|
+
const delValues = () =>
|
|
2380
|
+
fluentTransaction(() =>
|
|
2381
|
+
(whileMutating(() => middleware[11]?.()) ?? true)
|
|
2382
|
+
? setValidValues({}, true)
|
|
2383
|
+
: 0,
|
|
2384
|
+
);
|
|
2385
|
+
const delValue = (valueId, skipMiddleware) =>
|
|
2187
2386
|
fluentTransaction(
|
|
2188
2387
|
(valueId2) =>
|
|
2189
|
-
collHas(valuesMap, valueId2)
|
|
2388
|
+
collHas(valuesMap, valueId2)
|
|
2389
|
+
? delValidValue(valueId2, skipMiddleware)
|
|
2390
|
+
: 0,
|
|
2190
2391
|
valueId,
|
|
2191
2392
|
);
|
|
2192
2393
|
const delTablesSchema = () =>
|
|
@@ -2263,30 +2464,64 @@ const createStore = () => {
|
|
|
2263
2464
|
mapToObj3(changedCellIds),
|
|
2264
2465
|
mapToObj(changedValueIds),
|
|
2265
2466
|
];
|
|
2467
|
+
const doDidSetRows = () => {
|
|
2468
|
+
if (middleware[14]) {
|
|
2469
|
+
const changedCells2 = clonedChangedCells(changedCells);
|
|
2470
|
+
collForEach(changedCells2, (rows, tableId) =>
|
|
2471
|
+
collForEach(rows, (cells, rowId) => {
|
|
2472
|
+
if (
|
|
2473
|
+
!arrayEvery(
|
|
2474
|
+
collValues(cells),
|
|
2475
|
+
([oldCell, newCell]) => oldCell === newCell,
|
|
2476
|
+
)
|
|
2477
|
+
) {
|
|
2478
|
+
const newRow = getRow(tableId, rowId);
|
|
2479
|
+
const oldRow = objMerge(newRow);
|
|
2480
|
+
collForEach(cells, ([oldCell], cellId) =>
|
|
2481
|
+
isUndefined(oldCell)
|
|
2482
|
+
? objDel(oldRow, cellId)
|
|
2483
|
+
: (oldRow[cellId] = oldCell),
|
|
2484
|
+
);
|
|
2485
|
+
const didSetRow = middleware[14](tableId, rowId, oldRow, newRow);
|
|
2486
|
+
if (!objIsEqual(didSetRow, newRow)) {
|
|
2487
|
+
const setOrDelRow = objMap(newRow, () => void 0);
|
|
2488
|
+
objMap(didSetRow, (cell, cellId) => (setOrDelRow[cellId] = cell));
|
|
2489
|
+
objMap(setOrDelRow, (cell, cellId) =>
|
|
2490
|
+
setOrDelCell(tableId, rowId, cellId, cell, true),
|
|
2491
|
+
);
|
|
2492
|
+
}
|
|
2493
|
+
}
|
|
2494
|
+
}),
|
|
2495
|
+
);
|
|
2496
|
+
}
|
|
2497
|
+
};
|
|
2266
2498
|
const finishTransaction = (doRollback) => {
|
|
2267
2499
|
if (transactions > 0) {
|
|
2268
2500
|
transactions--;
|
|
2269
2501
|
if (transactions == 0) {
|
|
2270
2502
|
transactions = 1;
|
|
2271
|
-
|
|
2272
|
-
|
|
2273
|
-
|
|
2274
|
-
|
|
2275
|
-
|
|
2276
|
-
|
|
2277
|
-
|
|
2278
|
-
|
|
2503
|
+
whileMutating(() => {
|
|
2504
|
+
callInvalidCellListeners(1);
|
|
2505
|
+
if (!collIsEmpty(changedCells)) {
|
|
2506
|
+
callTabularListenersForChanges(1);
|
|
2507
|
+
doDidSetRows();
|
|
2508
|
+
}
|
|
2509
|
+
callInvalidValueListeners(1);
|
|
2510
|
+
if (!collIsEmpty(changedValues)) {
|
|
2511
|
+
callValuesListenersForChanges(1);
|
|
2512
|
+
}
|
|
2513
|
+
});
|
|
2279
2514
|
if (doRollback?.(store)) {
|
|
2280
2515
|
collForEach(changedCells, (table, tableId) =>
|
|
2281
2516
|
collForEach(table, (row, rowId) =>
|
|
2282
2517
|
collForEach(row, ([oldCell], cellId) =>
|
|
2283
|
-
setOrDelCell(
|
|
2518
|
+
setOrDelCell(tableId, rowId, cellId, oldCell, true),
|
|
2284
2519
|
),
|
|
2285
2520
|
),
|
|
2286
2521
|
);
|
|
2287
2522
|
collClear(changedCells);
|
|
2288
2523
|
collForEach(changedValues, ([oldValue], valueId) =>
|
|
2289
|
-
setOrDelValue(
|
|
2524
|
+
setOrDelValue(valueId, oldValue, true),
|
|
2290
2525
|
);
|
|
2291
2526
|
collClear(changedValues);
|
|
2292
2527
|
}
|
|
@@ -2413,6 +2648,40 @@ const createStore = () => {
|
|
|
2413
2648
|
collSize2(startTransactionListeners) +
|
|
2414
2649
|
pairCollSize2(finishTransactionListeners),
|
|
2415
2650
|
});
|
|
2651
|
+
const setMiddleware = (
|
|
2652
|
+
willSetContent,
|
|
2653
|
+
willSetTables,
|
|
2654
|
+
willSetTable,
|
|
2655
|
+
willSetRow,
|
|
2656
|
+
willSetCell,
|
|
2657
|
+
willSetValues,
|
|
2658
|
+
willSetValue,
|
|
2659
|
+
willDelTables,
|
|
2660
|
+
willDelTable,
|
|
2661
|
+
willDelRow,
|
|
2662
|
+
willDelCell,
|
|
2663
|
+
willDelValues,
|
|
2664
|
+
willDelValue,
|
|
2665
|
+
willApplyChanges,
|
|
2666
|
+
didSetRow,
|
|
2667
|
+
) =>
|
|
2668
|
+
(middleware = [
|
|
2669
|
+
willSetContent,
|
|
2670
|
+
willSetTables,
|
|
2671
|
+
willSetTable,
|
|
2672
|
+
willSetRow,
|
|
2673
|
+
willSetCell,
|
|
2674
|
+
willSetValues,
|
|
2675
|
+
willSetValue,
|
|
2676
|
+
willDelTables,
|
|
2677
|
+
willDelTable,
|
|
2678
|
+
willDelRow,
|
|
2679
|
+
willDelCell,
|
|
2680
|
+
willDelValues,
|
|
2681
|
+
willDelValue,
|
|
2682
|
+
willApplyChanges,
|
|
2683
|
+
didSetRow,
|
|
2684
|
+
]);
|
|
2416
2685
|
const setInternalListeners = (
|
|
2417
2686
|
preStartTransaction,
|
|
2418
2687
|
preFinishTransaction,
|
|
@@ -2506,6 +2775,9 @@ const createStore = () => {
|
|
|
2506
2775
|
addListener,
|
|
2507
2776
|
callListeners,
|
|
2508
2777
|
setInternalListeners,
|
|
2778
|
+
setMiddleware,
|
|
2779
|
+
setOrDelCell,
|
|
2780
|
+
setOrDelValue,
|
|
2509
2781
|
};
|
|
2510
2782
|
objMap(
|
|
2511
2783
|
{
|
|
@@ -2642,6 +2914,7 @@ const createMergeableStore = (uniqueId, getNow) => {
|
|
|
2642
2914
|
let listeningToRawStoreChanges = 1;
|
|
2643
2915
|
let contentStampMap = newContentStampMap();
|
|
2644
2916
|
let defaultingContent = 0;
|
|
2917
|
+
let mutated = 0;
|
|
2645
2918
|
const touchedCells = mapNew();
|
|
2646
2919
|
const touchedValues = setNew();
|
|
2647
2920
|
const [getNextHlc, seenHlc] = getHlcFunctions(uniqueId, getNow);
|
|
@@ -2768,12 +3041,15 @@ const createMergeableStore = (uniqueId, getNow) => {
|
|
|
2768
3041
|
collClear(touchedCells);
|
|
2769
3042
|
collClear(touchedValues);
|
|
2770
3043
|
};
|
|
2771
|
-
const cellChanged = (tableId, rowId, cellId, newCell) => {
|
|
3044
|
+
const cellChanged = (tableId, rowId, cellId, newCell, mutating) => {
|
|
2772
3045
|
setAdd(
|
|
2773
3046
|
mapEnsure(mapEnsure(touchedCells, tableId, mapNew), rowId, setNew),
|
|
2774
3047
|
cellId,
|
|
2775
3048
|
);
|
|
2776
|
-
if (listeningToRawStoreChanges) {
|
|
3049
|
+
if (listeningToRawStoreChanges || mutating) {
|
|
3050
|
+
if (mutating) {
|
|
3051
|
+
mutated = 1;
|
|
3052
|
+
}
|
|
2777
3053
|
mergeContentOrChanges([
|
|
2778
3054
|
[
|
|
2779
3055
|
{
|
|
@@ -2796,9 +3072,12 @@ const createMergeableStore = (uniqueId, getNow) => {
|
|
|
2796
3072
|
]);
|
|
2797
3073
|
}
|
|
2798
3074
|
};
|
|
2799
|
-
const valueChanged = (valueId, newValue) => {
|
|
3075
|
+
const valueChanged = (valueId, newValue, mutating) => {
|
|
2800
3076
|
setAdd(touchedValues, valueId);
|
|
2801
|
-
if (listeningToRawStoreChanges) {
|
|
3077
|
+
if (listeningToRawStoreChanges || mutating) {
|
|
3078
|
+
if (mutating) {
|
|
3079
|
+
mutated = 1;
|
|
3080
|
+
}
|
|
2802
3081
|
mergeContentOrChanges([
|
|
2803
3082
|
[{}],
|
|
2804
3083
|
[
|
|
@@ -3016,6 +3295,11 @@ const createMergeableStore = (uniqueId, getNow) => {
|
|
|
3016
3295
|
mergeableStore2.applyMergeableChanges(mergeableChanges);
|
|
3017
3296
|
return applyMergeableChanges(mergeableChanges2);
|
|
3018
3297
|
};
|
|
3298
|
+
const hadMutated = () => {
|
|
3299
|
+
const result = mutated;
|
|
3300
|
+
mutated = 0;
|
|
3301
|
+
return result;
|
|
3302
|
+
};
|
|
3019
3303
|
const mergeableStore = {
|
|
3020
3304
|
getMergeableContent,
|
|
3021
3305
|
getMergeableContentHashes,
|
|
@@ -3032,6 +3316,8 @@ const createMergeableStore = (uniqueId, getNow) => {
|
|
|
3032
3316
|
getTransactionMergeableChanges,
|
|
3033
3317
|
applyMergeableChanges,
|
|
3034
3318
|
merge,
|
|
3319
|
+
// only used internally by other modules
|
|
3320
|
+
hadMutated,
|
|
3035
3321
|
};
|
|
3036
3322
|
store.setInternalListeners(
|
|
3037
3323
|
preStartTransaction,
|
|
@@ -3048,7 +3334,8 @@ const createMergeableStore = (uniqueId, getNow) => {
|
|
|
3048
3334
|
strStartsWith(name, DEL) ||
|
|
3049
3335
|
strStartsWith(name, 'apply') ||
|
|
3050
3336
|
strEndsWith(name, TRANSACTION) ||
|
|
3051
|
-
name == 'call' + LISTENER
|
|
3337
|
+
name == 'call' + LISTENER ||
|
|
3338
|
+
name == 'use'
|
|
3052
3339
|
? (...args) => {
|
|
3053
3340
|
method(...args);
|
|
3054
3341
|
return mergeableStore;
|
|
@@ -3241,6 +3528,136 @@ const createMetrics = getCreateFunction((store) => {
|
|
|
3241
3528
|
return objFreeze(metrics);
|
|
3242
3529
|
});
|
|
3243
3530
|
|
|
3531
|
+
const reduceCallbacks = (callbacks, thing, ...ids) =>
|
|
3532
|
+
arrayReduce(
|
|
3533
|
+
callbacks,
|
|
3534
|
+
(current, callback) =>
|
|
3535
|
+
isUndefined(current) ? current : callback(...ids, current),
|
|
3536
|
+
thing,
|
|
3537
|
+
);
|
|
3538
|
+
const everyCallback = (callbacks, ...ids) =>
|
|
3539
|
+
arrayEvery(callbacks, (callback) => callback(...ids));
|
|
3540
|
+
const createMiddleware = getCreateFunction((store) => {
|
|
3541
|
+
const fluent = (actions) => {
|
|
3542
|
+
actions();
|
|
3543
|
+
return middleware;
|
|
3544
|
+
};
|
|
3545
|
+
const addCallback = (callbacks) => (callback) =>
|
|
3546
|
+
fluent(() => arrayPush(callbacks, callback));
|
|
3547
|
+
const willSetContentCallbacks = [];
|
|
3548
|
+
const willSetTablesCallbacks = [];
|
|
3549
|
+
const willSetTableCallbacks = [];
|
|
3550
|
+
const willSetRowCallbacks = [];
|
|
3551
|
+
const willSetCellCallbacks = [];
|
|
3552
|
+
const willSetValuesCallbacks = [];
|
|
3553
|
+
const willSetValueCallbacks = [];
|
|
3554
|
+
const willDelTablesCallbacks = [];
|
|
3555
|
+
const willDelTableCallbacks = [];
|
|
3556
|
+
const willDelRowCallbacks = [];
|
|
3557
|
+
const willDelCellCallbacks = [];
|
|
3558
|
+
const willDelValuesCallbacks = [];
|
|
3559
|
+
const willDelValueCallbacks = [];
|
|
3560
|
+
const willApplyChangesCallbacks = [];
|
|
3561
|
+
const didSetRowCallbacksMap = mapNew();
|
|
3562
|
+
const willSetContent = (content) =>
|
|
3563
|
+
reduceCallbacks(willSetContentCallbacks, content);
|
|
3564
|
+
const willSetTables = (tables) =>
|
|
3565
|
+
reduceCallbacks(willSetTablesCallbacks, tables);
|
|
3566
|
+
const willSetTable = (tableId, table) =>
|
|
3567
|
+
reduceCallbacks(willSetTableCallbacks, table, tableId);
|
|
3568
|
+
const willSetRow = (tableId, rowId, row) =>
|
|
3569
|
+
reduceCallbacks(willSetRowCallbacks, row, tableId, rowId);
|
|
3570
|
+
const willSetCell = (tableId, rowId, cellId, cell) =>
|
|
3571
|
+
reduceCallbacks(willSetCellCallbacks, cell, tableId, rowId, cellId);
|
|
3572
|
+
const willSetValues = (values) =>
|
|
3573
|
+
reduceCallbacks(willSetValuesCallbacks, values);
|
|
3574
|
+
const willSetValue = (valueId, value) =>
|
|
3575
|
+
reduceCallbacks(willSetValueCallbacks, value, valueId);
|
|
3576
|
+
const willDelTables = () => everyCallback(willDelTablesCallbacks);
|
|
3577
|
+
const willDelTable = (tableId) =>
|
|
3578
|
+
everyCallback(willDelTableCallbacks, tableId);
|
|
3579
|
+
const willDelRow = (tableId, rowId) =>
|
|
3580
|
+
everyCallback(willDelRowCallbacks, tableId, rowId);
|
|
3581
|
+
const willDelCell = (tableId, rowId, cellId) =>
|
|
3582
|
+
everyCallback(willDelCellCallbacks, tableId, rowId, cellId);
|
|
3583
|
+
const willDelValues = () => everyCallback(willDelValuesCallbacks);
|
|
3584
|
+
const willDelValue = (valueId) =>
|
|
3585
|
+
everyCallback(willDelValueCallbacks, valueId);
|
|
3586
|
+
const willApplyChanges = (changes) =>
|
|
3587
|
+
reduceCallbacks(willApplyChangesCallbacks, changes);
|
|
3588
|
+
const didSetRow = (tableId, rowId, oldRow, newRow) =>
|
|
3589
|
+
ifNotUndefined(
|
|
3590
|
+
mapGet(didSetRowCallbacksMap, tableId),
|
|
3591
|
+
(callbacks) =>
|
|
3592
|
+
arrayReduce(
|
|
3593
|
+
callbacks,
|
|
3594
|
+
(current, callback) => callback(tableId, rowId, oldRow, current),
|
|
3595
|
+
newRow,
|
|
3596
|
+
),
|
|
3597
|
+
() => newRow,
|
|
3598
|
+
);
|
|
3599
|
+
const getStore = () => store;
|
|
3600
|
+
const addWillSetContentCallback = addCallback(willSetContentCallbacks);
|
|
3601
|
+
const addWillSetTablesCallback = addCallback(willSetTablesCallbacks);
|
|
3602
|
+
const addWillSetTableCallback = addCallback(willSetTableCallbacks);
|
|
3603
|
+
const addWillSetRowCallback = addCallback(willSetRowCallbacks);
|
|
3604
|
+
const addWillSetCellCallback = addCallback(willSetCellCallbacks);
|
|
3605
|
+
const addWillSetValuesCallback = addCallback(willSetValuesCallbacks);
|
|
3606
|
+
const addWillSetValueCallback = addCallback(willSetValueCallbacks);
|
|
3607
|
+
const addWillDelTablesCallback = addCallback(willDelTablesCallbacks);
|
|
3608
|
+
const addWillDelTableCallback = addCallback(willDelTableCallbacks);
|
|
3609
|
+
const addWillDelRowCallback = addCallback(willDelRowCallbacks);
|
|
3610
|
+
const addWillDelCellCallback = addCallback(willDelCellCallbacks);
|
|
3611
|
+
const addWillDelValuesCallback = addCallback(willDelValuesCallbacks);
|
|
3612
|
+
const addWillDelValueCallback = addCallback(willDelValueCallbacks);
|
|
3613
|
+
const addWillApplyChangesCallback = addCallback(willApplyChangesCallbacks);
|
|
3614
|
+
const addDidSetRowCallback = (tableId, callback) =>
|
|
3615
|
+
fluent(() =>
|
|
3616
|
+
arrayPush(
|
|
3617
|
+
mapEnsure(didSetRowCallbacksMap, tableId, () => []),
|
|
3618
|
+
callback,
|
|
3619
|
+
),
|
|
3620
|
+
);
|
|
3621
|
+
const destroy = () => {};
|
|
3622
|
+
const middleware = objFreeze({
|
|
3623
|
+
getStore,
|
|
3624
|
+
addWillSetContentCallback,
|
|
3625
|
+
addWillSetTablesCallback,
|
|
3626
|
+
addWillSetTableCallback,
|
|
3627
|
+
addWillSetRowCallback,
|
|
3628
|
+
addWillSetCellCallback,
|
|
3629
|
+
addWillSetValuesCallback,
|
|
3630
|
+
addWillSetValueCallback,
|
|
3631
|
+
addWillDelTablesCallback,
|
|
3632
|
+
addWillDelTableCallback,
|
|
3633
|
+
addWillDelRowCallback,
|
|
3634
|
+
addWillDelCellCallback,
|
|
3635
|
+
addWillDelValuesCallback,
|
|
3636
|
+
addWillDelValueCallback,
|
|
3637
|
+
addWillApplyChangesCallback,
|
|
3638
|
+
addDidSetRowCallback,
|
|
3639
|
+
destroy,
|
|
3640
|
+
});
|
|
3641
|
+
store.setMiddleware(
|
|
3642
|
+
willSetContent,
|
|
3643
|
+
willSetTables,
|
|
3644
|
+
willSetTable,
|
|
3645
|
+
willSetRow,
|
|
3646
|
+
willSetCell,
|
|
3647
|
+
willSetValues,
|
|
3648
|
+
willSetValue,
|
|
3649
|
+
willDelTables,
|
|
3650
|
+
willDelTable,
|
|
3651
|
+
willDelRow,
|
|
3652
|
+
willDelCell,
|
|
3653
|
+
willDelValues,
|
|
3654
|
+
willDelValue,
|
|
3655
|
+
willApplyChanges,
|
|
3656
|
+
didSetRow,
|
|
3657
|
+
);
|
|
3658
|
+
return middleware;
|
|
3659
|
+
});
|
|
3660
|
+
|
|
3244
3661
|
const createQueries = getCreateFunction((store) => {
|
|
3245
3662
|
const createStore = store.createStore;
|
|
3246
3663
|
const preStore = createStore();
|
|
@@ -3569,8 +3986,7 @@ const createQueries = getCreateFunction((store) => {
|
|
|
3569
3986
|
selectJoinWhereStore.transaction(() =>
|
|
3570
3987
|
arrayEvery(wheres, (where2) => where2(getTableCell))
|
|
3571
3988
|
? mapForEach(selects, (asCellId, tableCellGetter) =>
|
|
3572
|
-
setOrDelCell(
|
|
3573
|
-
selectJoinWhereStore,
|
|
3989
|
+
selectJoinWhereStore.setOrDelCell(
|
|
3574
3990
|
queryId,
|
|
3575
3991
|
rootRowId,
|
|
3576
3992
|
asCellId,
|
|
@@ -3975,6 +4391,7 @@ export {
|
|
|
3975
4391
|
createIndexes,
|
|
3976
4392
|
createMergeableStore,
|
|
3977
4393
|
createMetrics,
|
|
4394
|
+
createMiddleware,
|
|
3978
4395
|
createQueries,
|
|
3979
4396
|
createRelationships,
|
|
3980
4397
|
createStore,
|