tinybase 5.0.0-beta.4 → 5.0.0-beta.5
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/checkpoints.js +1 -1
- package/lib/checkpoints.js.gz +0 -0
- package/lib/cjs/checkpoints.cjs +1 -1
- package/lib/cjs/checkpoints.cjs.gz +0 -0
- package/lib/cjs/indexes.cjs +1 -1
- package/lib/cjs/indexes.cjs.gz +0 -0
- package/lib/cjs/mergeable-store.cjs +1 -1
- package/lib/cjs/mergeable-store.cjs.gz +0 -0
- package/lib/cjs/metrics.cjs +1 -1
- package/lib/cjs/metrics.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-automerge.cjs +1 -1
- package/lib/cjs/persisters/persister-automerge.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-browser.cjs +1 -1
- package/lib/cjs/persisters/persister-browser.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -1
- package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-electric-sql.cjs +1 -1
- package/lib/cjs/persisters/persister-electric-sql.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-expo-sqlite-next.cjs +1 -1
- package/lib/cjs/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-expo-sqlite.cjs +1 -1
- package/lib/cjs/persisters/persister-expo-sqlite.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-file.cjs +1 -1
- package/lib/cjs/persisters/persister-file.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-indexed-db.cjs +1 -1
- package/lib/cjs/persisters/persister-indexed-db.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-libsql.cjs +1 -0
- package/lib/cjs/persisters/persister-libsql.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-partykit-client.cjs +1 -1
- package/lib/cjs/persisters/persister-partykit-client.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-remote.cjs +1 -1
- package/lib/cjs/persisters/persister-remote.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -1
- package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-sqlite3.cjs +1 -1
- package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-yjs.cjs +1 -1
- 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/queries.cjs +1 -1
- package/lib/cjs/queries.cjs.gz +0 -0
- package/lib/cjs/relationships.cjs +1 -1
- package/lib/cjs/relationships.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-dom-debug.cjs +1 -1
- package/lib/cjs/ui-react-dom-debug.cjs.gz +0 -0
- package/lib/cjs-es6/checkpoints.cjs +1 -1
- package/lib/cjs-es6/checkpoints.cjs.gz +0 -0
- package/lib/cjs-es6/indexes.cjs +1 -1
- package/lib/cjs-es6/indexes.cjs.gz +0 -0
- package/lib/cjs-es6/mergeable-store.cjs +1 -1
- package/lib/cjs-es6/mergeable-store.cjs.gz +0 -0
- package/lib/cjs-es6/metrics.cjs +1 -1
- package/lib/cjs-es6/metrics.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-browser.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-browser.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-electric-sql.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-electric-sql.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-file.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-indexed-db.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-indexed-db.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-libsql.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-libsql.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-partykit-client.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-partykit-client.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-remote.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-remote.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -1
- 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/queries.cjs +1 -1
- package/lib/cjs-es6/queries.cjs.gz +0 -0
- package/lib/cjs-es6/relationships.cjs +1 -1
- package/lib/cjs-es6/relationships.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-dom-debug.cjs +1 -1
- package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
- package/lib/debug/checkpoints.js +3 -1
- package/lib/debug/indexes.js +3 -1
- package/lib/debug/mergeable-store.js +196 -129
- package/lib/debug/metrics.js +3 -1
- package/lib/debug/persisters/persister-automerge.js +3 -1
- package/lib/debug/persisters/persister-browser.js +3 -1
- package/lib/debug/persisters/persister-cr-sqlite-wasm.js +3 -1
- package/lib/debug/persisters/persister-electric-sql.js +3 -1
- package/lib/debug/persisters/persister-expo-sqlite-next.js +3 -1
- package/lib/debug/persisters/persister-expo-sqlite.js +3 -1
- package/lib/debug/persisters/persister-file.js +3 -1
- package/lib/debug/persisters/persister-indexed-db.js +3 -1
- package/lib/debug/persisters/persister-libsql.js +898 -0
- package/lib/debug/persisters/persister-partykit-client.js +3 -1
- package/lib/debug/persisters/persister-remote.js +3 -1
- package/lib/debug/persisters/persister-sqlite-wasm.js +3 -1
- package/lib/debug/persisters/persister-sqlite3.js +3 -1
- package/lib/debug/persisters/persister-yjs.js +3 -1
- package/lib/debug/persisters.js +3 -1
- package/lib/debug/queries.js +7 -4
- package/lib/debug/relationships.js +3 -1
- package/lib/debug/store.js +7 -4
- package/lib/debug/tinybase.js +197 -130
- package/lib/debug/tools.js +7 -4
- package/lib/debug/ui-react-dom.js +7 -4
- package/lib/es6/checkpoints.js +1 -1
- package/lib/es6/checkpoints.js.gz +0 -0
- package/lib/es6/indexes.js +1 -1
- package/lib/es6/indexes.js.gz +0 -0
- package/lib/es6/mergeable-store.js +1 -1
- package/lib/es6/mergeable-store.js.gz +0 -0
- package/lib/es6/metrics.js +1 -1
- package/lib/es6/metrics.js.gz +0 -0
- package/lib/es6/persisters/persister-automerge.js +1 -1
- package/lib/es6/persisters/persister-automerge.js.gz +0 -0
- package/lib/es6/persisters/persister-browser.js +1 -1
- package/lib/es6/persisters/persister-browser.js.gz +0 -0
- package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -1
- package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/es6/persisters/persister-electric-sql.js +1 -1
- package/lib/es6/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/es6/persisters/persister-expo-sqlite-next.js +1 -1
- package/lib/es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
- package/lib/es6/persisters/persister-expo-sqlite.js +1 -1
- package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/es6/persisters/persister-file.js +1 -1
- package/lib/es6/persisters/persister-file.js.gz +0 -0
- package/lib/es6/persisters/persister-indexed-db.js +1 -1
- package/lib/es6/persisters/persister-indexed-db.js.gz +0 -0
- package/lib/es6/persisters/persister-libsql.js +1 -0
- package/lib/es6/persisters/persister-libsql.js.gz +0 -0
- package/lib/es6/persisters/persister-partykit-client.js +1 -1
- package/lib/es6/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/es6/persisters/persister-remote.js +1 -1
- package/lib/es6/persisters/persister-remote.js.gz +0 -0
- package/lib/es6/persisters/persister-sqlite-wasm.js +1 -1
- package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/es6/persisters/persister-sqlite3.js +1 -1
- package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/es6/persisters/persister-yjs.js +1 -1
- 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/queries.js +1 -1
- package/lib/es6/queries.js.gz +0 -0
- package/lib/es6/relationships.js +1 -1
- package/lib/es6/relationships.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-dom-debug.js +1 -1
- package/lib/es6/ui-react-dom-debug.js.gz +0 -0
- package/lib/indexes.js +1 -1
- package/lib/indexes.js.gz +0 -0
- package/lib/mergeable-store.js +1 -1
- package/lib/mergeable-store.js.gz +0 -0
- package/lib/metrics.js +1 -1
- package/lib/metrics.js.gz +0 -0
- package/lib/persisters/persister-automerge.js +1 -1
- package/lib/persisters/persister-automerge.js.gz +0 -0
- package/lib/persisters/persister-browser.js +1 -1
- package/lib/persisters/persister-browser.js.gz +0 -0
- package/lib/persisters/persister-cr-sqlite-wasm.js +1 -1
- package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/persisters/persister-electric-sql.js +1 -1
- package/lib/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/persisters/persister-expo-sqlite-next.js +1 -1
- package/lib/persisters/persister-expo-sqlite-next.js.gz +0 -0
- package/lib/persisters/persister-expo-sqlite.js +1 -1
- package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/persisters/persister-file.js +1 -1
- package/lib/persisters/persister-file.js.gz +0 -0
- package/lib/persisters/persister-indexed-db.js +1 -1
- package/lib/persisters/persister-indexed-db.js.gz +0 -0
- package/lib/persisters/persister-libsql.js +1 -0
- package/lib/persisters/persister-libsql.js.gz +0 -0
- package/lib/persisters/persister-partykit-client.js +1 -1
- package/lib/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/persisters/persister-remote.js +1 -1
- package/lib/persisters/persister-remote.js.gz +0 -0
- package/lib/persisters/persister-sqlite-wasm.js +1 -1
- package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/persisters/persister-sqlite3.js +1 -1
- package/lib/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/persisters/persister-yjs.js +1 -1
- package/lib/persisters/persister-yjs.js.gz +0 -0
- package/lib/persisters.js +1 -1
- package/lib/persisters.js.gz +0 -0
- package/lib/queries.js +1 -1
- package/lib/queries.js.gz +0 -0
- package/lib/relationships.js +1 -1
- package/lib/relationships.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/mergeable-store.d.ts +72 -11
- package/lib/types/persisters/persister-libsql.d.ts +139 -0
- package/lib/types/persisters.d.ts +1 -0
- package/lib/types/with-schemas/mergeable-store.d.ts +308 -31
- package/lib/types/with-schemas/persisters/persister-libsql.d.ts +152 -0
- package/lib/types/with-schemas/persisters.d.ts +1 -0
- package/lib/types/with-schemas/store.d.ts +37 -87
- package/lib/umd/checkpoints.js +1 -1
- package/lib/umd/checkpoints.js.gz +0 -0
- package/lib/umd/indexes.js +1 -1
- package/lib/umd/indexes.js.gz +0 -0
- package/lib/umd/mergeable-store.js +1 -1
- package/lib/umd/mergeable-store.js.gz +0 -0
- package/lib/umd/metrics.js +1 -1
- package/lib/umd/metrics.js.gz +0 -0
- package/lib/umd/persisters/persister-automerge.js +1 -1
- package/lib/umd/persisters/persister-automerge.js.gz +0 -0
- package/lib/umd/persisters/persister-browser.js +1 -1
- package/lib/umd/persisters/persister-browser.js.gz +0 -0
- package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
- package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/umd/persisters/persister-electric-sql.js +1 -1
- package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/umd/persisters/persister-expo-sqlite-next.js +1 -1
- package/lib/umd/persisters/persister-expo-sqlite-next.js.gz +0 -0
- package/lib/umd/persisters/persister-expo-sqlite.js +1 -1
- package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/umd/persisters/persister-file.js +1 -1
- package/lib/umd/persisters/persister-file.js.gz +0 -0
- package/lib/umd/persisters/persister-indexed-db.js +1 -1
- package/lib/umd/persisters/persister-indexed-db.js.gz +0 -0
- package/lib/umd/persisters/persister-libsql.js +1 -0
- package/lib/umd/persisters/persister-libsql.js.gz +0 -0
- package/lib/umd/persisters/persister-partykit-client.js +1 -1
- package/lib/umd/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/umd/persisters/persister-remote.js +1 -1
- package/lib/umd/persisters/persister-remote.js.gz +0 -0
- package/lib/umd/persisters/persister-sqlite-wasm.js +1 -1
- package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/umd/persisters/persister-sqlite3.js +1 -1
- package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/umd/persisters/persister-yjs.js +1 -1
- 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/queries.js +1 -1
- package/lib/umd/queries.js.gz +0 -0
- package/lib/umd/relationships.js +1 -1
- package/lib/umd/relationships.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-dom-debug.js +1 -1
- package/lib/umd/ui-react-dom-debug.js.gz +0 -0
- package/lib/umd-es6/checkpoints.js +1 -1
- package/lib/umd-es6/checkpoints.js.gz +0 -0
- package/lib/umd-es6/indexes.js +1 -1
- package/lib/umd-es6/indexes.js.gz +0 -0
- package/lib/umd-es6/mergeable-store.js +1 -1
- package/lib/umd-es6/mergeable-store.js.gz +0 -0
- package/lib/umd-es6/metrics.js +1 -1
- package/lib/umd-es6/metrics.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-automerge.js +1 -1
- package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-browser.js +1 -1
- package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
- package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-electric-sql.js +1 -1
- package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-expo-sqlite-next.js +1 -1
- package/lib/umd-es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -1
- package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-file.js +1 -1
- package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-indexed-db.js +1 -1
- package/lib/umd-es6/persisters/persister-indexed-db.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-libsql.js +1 -0
- package/lib/umd-es6/persisters/persister-libsql.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-partykit-client.js +1 -1
- package/lib/umd-es6/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-remote.js +1 -1
- package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -1
- package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-sqlite3.js +1 -1
- package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-yjs.js +1 -1
- 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/queries.js +1 -1
- package/lib/umd-es6/queries.js.gz +0 -0
- package/lib/umd-es6/relationships.js +1 -1
- package/lib/umd-es6/relationships.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-dom-debug.js +1 -1
- package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
- package/package.json +34 -29
- package/readme.md +2 -2
|
@@ -59,9 +59,11 @@ const mapNew = (entries) => new Map(entries);
|
|
|
59
59
|
const mapGet = (map, key) => map?.get(key);
|
|
60
60
|
const mapSet = (map, key, value) =>
|
|
61
61
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
62
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
62
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
63
63
|
if (!collHas(map, key)) {
|
|
64
64
|
mapSet(map, key, getDefaultValue());
|
|
65
|
+
} else {
|
|
66
|
+
hadExistingValue?.(mapGet(map, key));
|
|
65
67
|
}
|
|
66
68
|
return mapGet(map, key);
|
|
67
69
|
};
|
|
@@ -47,9 +47,11 @@ const mapNew = (entries) => new Map(entries);
|
|
|
47
47
|
const mapGet = (map, key) => map?.get(key);
|
|
48
48
|
const mapSet = (map, key, value) =>
|
|
49
49
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
50
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
50
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
51
51
|
if (!collHas(map, key)) {
|
|
52
52
|
mapSet(map, key, getDefaultValue());
|
|
53
|
+
} else {
|
|
54
|
+
hadExistingValue?.(mapGet(map, key));
|
|
53
55
|
}
|
|
54
56
|
return mapGet(map, key);
|
|
55
57
|
};
|
|
@@ -75,9 +75,11 @@ const mapMap = (coll, cb) =>
|
|
|
75
75
|
arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
|
|
76
76
|
const mapSet = (map, key, value) =>
|
|
77
77
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
78
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
78
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
79
79
|
if (!collHas(map, key)) {
|
|
80
80
|
mapSet(map, key, getDefaultValue());
|
|
81
|
+
} else {
|
|
82
|
+
hadExistingValue?.(mapGet(map, key));
|
|
81
83
|
}
|
|
82
84
|
return mapGet(map, key);
|
|
83
85
|
};
|
|
@@ -76,9 +76,11 @@ const mapMap = (coll, cb) =>
|
|
|
76
76
|
arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
|
|
77
77
|
const mapSet = (map, key, value) =>
|
|
78
78
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
79
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
79
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
80
80
|
if (!collHas(map, key)) {
|
|
81
81
|
mapSet(map, key, getDefaultValue());
|
|
82
|
+
} else {
|
|
83
|
+
hadExistingValue?.(mapGet(map, key));
|
|
82
84
|
}
|
|
83
85
|
return mapGet(map, key);
|
|
84
86
|
};
|
|
@@ -57,9 +57,11 @@ const mapForEach = (map, cb) =>
|
|
|
57
57
|
collForEach(map, (value, key) => cb(key, value));
|
|
58
58
|
const mapSet = (map, key, value) =>
|
|
59
59
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
60
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
60
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
61
61
|
if (!collHas(map, key)) {
|
|
62
62
|
mapSet(map, key, getDefaultValue());
|
|
63
|
+
} else {
|
|
64
|
+
hadExistingValue?.(mapGet(map, key));
|
|
63
65
|
}
|
|
64
66
|
return mapGet(map, key);
|
|
65
67
|
};
|
package/lib/debug/persisters.js
CHANGED
|
@@ -35,9 +35,11 @@ const mapNew = (entries) => new Map(entries);
|
|
|
35
35
|
const mapGet = (map, key) => map?.get(key);
|
|
36
36
|
const mapSet = (map, key, value) =>
|
|
37
37
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
38
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
38
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
39
39
|
if (!collHas(map, key)) {
|
|
40
40
|
mapSet(map, key, getDefaultValue());
|
|
41
|
+
} else {
|
|
42
|
+
hadExistingValue?.(mapGet(map, key));
|
|
41
43
|
}
|
|
42
44
|
return mapGet(map, key);
|
|
43
45
|
};
|
package/lib/debug/queries.js
CHANGED
|
@@ -66,9 +66,11 @@ const mapForEach = (map, cb) =>
|
|
|
66
66
|
collForEach(map, (value, key) => cb(key, value));
|
|
67
67
|
const mapSet = (map, key, value) =>
|
|
68
68
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
69
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
69
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
70
70
|
if (!collHas(map, key)) {
|
|
71
71
|
mapSet(map, key, getDefaultValue());
|
|
72
|
+
} else {
|
|
73
|
+
hadExistingValue?.(mapGet(map, key));
|
|
72
74
|
}
|
|
73
75
|
return mapGet(map, key);
|
|
74
76
|
};
|
|
@@ -171,9 +173,10 @@ const getAggregateValue = (
|
|
|
171
173
|
: aggregateValue;
|
|
172
174
|
};
|
|
173
175
|
|
|
174
|
-
const getCellOrValueType = (
|
|
175
|
-
const type = getTypeOf(
|
|
176
|
-
return isTypeStringOrBoolean(type) ||
|
|
176
|
+
const getCellOrValueType = (cellOrValue) => {
|
|
177
|
+
const type = getTypeOf(cellOrValue);
|
|
178
|
+
return isTypeStringOrBoolean(type) ||
|
|
179
|
+
(type == NUMBER && isFiniteNumber(cellOrValue))
|
|
177
180
|
? type
|
|
178
181
|
: void 0;
|
|
179
182
|
};
|
|
@@ -42,9 +42,11 @@ const mapForEach = (map, cb) =>
|
|
|
42
42
|
collForEach(map, (value, key) => cb(key, value));
|
|
43
43
|
const mapSet = (map, key, value) =>
|
|
44
44
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
45
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
45
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
46
46
|
if (!collHas(map, key)) {
|
|
47
47
|
mapSet(map, key, getDefaultValue());
|
|
48
|
+
} else {
|
|
49
|
+
hadExistingValue?.(mapGet(map, key));
|
|
48
50
|
}
|
|
49
51
|
return mapGet(map, key);
|
|
50
52
|
};
|
package/lib/debug/store.js
CHANGED
|
@@ -95,9 +95,11 @@ const mapMap = (coll, cb) =>
|
|
|
95
95
|
arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
|
|
96
96
|
const mapSet = (map, key, value) =>
|
|
97
97
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
98
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
98
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
99
99
|
if (!collHas(map, key)) {
|
|
100
100
|
mapSet(map, key, getDefaultValue());
|
|
101
|
+
} else {
|
|
102
|
+
hadExistingValue?.(mapGet(map, key));
|
|
101
103
|
}
|
|
102
104
|
return mapGet(map, key);
|
|
103
105
|
};
|
|
@@ -253,9 +255,10 @@ const pairNewMap = () => [mapNew(), mapNew()];
|
|
|
253
255
|
const pairClone = (array) => [...array];
|
|
254
256
|
const pairIsEqual = ([entry1, entry2]) => entry1 === entry2;
|
|
255
257
|
|
|
256
|
-
const getCellOrValueType = (
|
|
257
|
-
const type = getTypeOf(
|
|
258
|
-
return isTypeStringOrBoolean(type) ||
|
|
258
|
+
const getCellOrValueType = (cellOrValue) => {
|
|
259
|
+
const type = getTypeOf(cellOrValue);
|
|
260
|
+
return isTypeStringOrBoolean(type) ||
|
|
261
|
+
(type == NUMBER && isFiniteNumber(cellOrValue))
|
|
259
262
|
? type
|
|
260
263
|
: void 0;
|
|
261
264
|
};
|
package/lib/debug/tinybase.js
CHANGED
|
@@ -31,8 +31,7 @@ const VALUE_IDS = VALUE + IDS;
|
|
|
31
31
|
const id = (key) => EMPTY_STRING + key;
|
|
32
32
|
const strStartsWith = (str, prefix) => str.startsWith(prefix);
|
|
33
33
|
const strEndsWith = (str, suffix) => str.endsWith(suffix);
|
|
34
|
-
const
|
|
35
|
-
const strCharCodeAt = (str, position = 0) => str.charCodeAt(position);
|
|
34
|
+
const strCharCodeAt = (str, position) => str.charCodeAt(position);
|
|
36
35
|
|
|
37
36
|
const mathMax = Math.max;
|
|
38
37
|
const mathMin = Math.min;
|
|
@@ -100,6 +99,12 @@ const objToArray = (obj, cb) =>
|
|
|
100
99
|
arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
|
|
101
100
|
const objSize = (obj) => size(objIds(obj));
|
|
102
101
|
const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
|
|
102
|
+
const objEnsure = (obj, id, getDefaultValue) => {
|
|
103
|
+
if (!objHas(obj, id)) {
|
|
104
|
+
obj[id] = getDefaultValue();
|
|
105
|
+
}
|
|
106
|
+
return obj[id];
|
|
107
|
+
};
|
|
103
108
|
|
|
104
109
|
const collSizeN = (collSizer) => (coll) =>
|
|
105
110
|
arrayReduce(collValues(coll), (total, coll2) => total + collSizer(coll2), 0);
|
|
@@ -123,9 +128,11 @@ const mapMap = (coll, cb) =>
|
|
|
123
128
|
arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
|
|
124
129
|
const mapSet = (map, key, value) =>
|
|
125
130
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
126
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
131
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
127
132
|
if (!collHas(map, key)) {
|
|
128
133
|
mapSet(map, key, getDefaultValue());
|
|
134
|
+
} else {
|
|
135
|
+
hadExistingValue?.(mapGet(map, key));
|
|
129
136
|
}
|
|
130
137
|
return mapGet(map, key);
|
|
131
138
|
};
|
|
@@ -183,9 +190,10 @@ const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
|
|
|
183
190
|
},
|
|
184
191
|
);
|
|
185
192
|
|
|
186
|
-
const getCellOrValueType = (
|
|
187
|
-
const type = getTypeOf(
|
|
188
|
-
return isTypeStringOrBoolean(type) ||
|
|
193
|
+
const getCellOrValueType = (cellOrValue) => {
|
|
194
|
+
const type = getTypeOf(cellOrValue);
|
|
195
|
+
return isTypeStringOrBoolean(type) ||
|
|
196
|
+
(type == NUMBER && isFiniteNumber(cellOrValue))
|
|
189
197
|
? type
|
|
190
198
|
: void 0;
|
|
191
199
|
};
|
|
@@ -1901,36 +1909,36 @@ const createRelationships = getCreateFunction((store) => {
|
|
|
1901
1909
|
return objFreeze(relationships);
|
|
1902
1910
|
});
|
|
1903
1911
|
|
|
1904
|
-
const
|
|
1905
|
-
const
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
1914
|
-
|
|
1915
|
-
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
|
|
1921
|
-
|
|
1922
|
-
thingStamp[0] = newTime;
|
|
1912
|
+
const textEncoder = new globalThis.TextEncoder();
|
|
1913
|
+
const getHash = (value) => {
|
|
1914
|
+
let hash = 2166136261;
|
|
1915
|
+
arrayForEach(textEncoder.encode(value), (char) => {
|
|
1916
|
+
hash ^= char;
|
|
1917
|
+
hash +=
|
|
1918
|
+
(hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);
|
|
1919
|
+
});
|
|
1920
|
+
return hash >>> 0;
|
|
1921
|
+
};
|
|
1922
|
+
|
|
1923
|
+
const cloneHashStamp = ([time, value, hash]) => [time, value, hash];
|
|
1924
|
+
const stampNew = (time, thing) => [time, thing];
|
|
1925
|
+
const hashIdAndHash = (id, hash) => getHash(id + ':' + hash);
|
|
1926
|
+
const updateHashStamp = (hashStamp, hash, time) => {
|
|
1927
|
+
hashStamp[2] = hash >>> 0;
|
|
1928
|
+
if (time > hashStamp[0]) {
|
|
1929
|
+
hashStamp[0] = time;
|
|
1923
1930
|
}
|
|
1924
|
-
merge(newThing, thingStamp[1], changes);
|
|
1925
1931
|
};
|
|
1926
|
-
const
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1932
|
+
const stampNewObj = (time) => stampNew(time, objNew());
|
|
1933
|
+
const hashStampNewMap = (time = EMPTY_STRING) => [time, mapNew(), 0];
|
|
1934
|
+
const hashStampNewThing = () => [EMPTY_STRING, void 0, 0];
|
|
1935
|
+
const hashStampMap = ([time, value, hash], mapper) => [
|
|
1936
|
+
time,
|
|
1937
|
+
mapper(value, time),
|
|
1938
|
+
hash,
|
|
1939
|
+
];
|
|
1940
|
+
const hashStampMapToObj = (hashStamp, mapper = cloneHashStamp) =>
|
|
1941
|
+
hashStampMap(hashStamp, (map) => mapToObj(map, mapper));
|
|
1934
1942
|
|
|
1935
1943
|
const pairNew = (value) => [value, value];
|
|
1936
1944
|
const pairCollSize2 = (pair, func = collSize2) => func(pair[0]) + func(pair[1]);
|
|
@@ -3267,12 +3275,6 @@ const SHIFT12 = 2 ** 12;
|
|
|
3267
3275
|
const SHIFT6 = 2 ** 6;
|
|
3268
3276
|
const toB64 = (num) => String.fromCharCode(48 + (num & MASK6));
|
|
3269
3277
|
const fromB64 = (str, pos) => strCharCodeAt(str, pos) - 48;
|
|
3270
|
-
const hash = (value) =>
|
|
3271
|
-
arrayReduce(
|
|
3272
|
-
strSplit(value),
|
|
3273
|
-
(hash2, char) => ((hash2 << 5) + hash2) ^ strCharCodeAt(char),
|
|
3274
|
-
5381,
|
|
3275
|
-
) >>> 0;
|
|
3276
3278
|
const encodeHlc = (logicalTime42, counter24, clientHash30) =>
|
|
3277
3279
|
toB64(logicalTime42 / SHIFT36) +
|
|
3278
3280
|
toB64(logicalTime42 / SHIFT30) +
|
|
@@ -3311,7 +3313,7 @@ const decodeHlc = (hlc16) => [
|
|
|
3311
3313
|
const getHlcFunctions = (uniqueId) => {
|
|
3312
3314
|
let logicalTime = 0;
|
|
3313
3315
|
let lastCounter = -1;
|
|
3314
|
-
const uniqueIdHash =
|
|
3316
|
+
const uniqueIdHash = getHash(uniqueId);
|
|
3315
3317
|
const getHlc = () => {
|
|
3316
3318
|
seenHlc();
|
|
3317
3319
|
return encodeHlc(logicalTime, ++lastCounter, uniqueIdHash);
|
|
@@ -3352,15 +3354,16 @@ const LISTENER_ARGS = {
|
|
|
3352
3354
|
InvalidCell: 3,
|
|
3353
3355
|
InvalidValue: 1,
|
|
3354
3356
|
};
|
|
3355
|
-
const
|
|
3357
|
+
const newContentHsm = (time = EMPTY_STRING) => [
|
|
3356
3358
|
time,
|
|
3357
|
-
[
|
|
3359
|
+
[hashStampNewMap(time), hashStampNewMap(time)],
|
|
3360
|
+
0,
|
|
3358
3361
|
];
|
|
3359
3362
|
const createMergeableStore = (id) => {
|
|
3360
3363
|
let listening = 1;
|
|
3361
|
-
let
|
|
3364
|
+
let contentHsm = newContentHsm();
|
|
3362
3365
|
let transactionTime;
|
|
3363
|
-
let
|
|
3366
|
+
let transactionMergeableChanges;
|
|
3364
3367
|
const [getHlc, seenHlc] = getHlcFunctions(id);
|
|
3365
3368
|
const store = createStore();
|
|
3366
3369
|
const disableListening = (actions) => {
|
|
@@ -3369,68 +3372,134 @@ const createMergeableStore = (id) => {
|
|
|
3369
3372
|
actions();
|
|
3370
3373
|
listening = wasListening;
|
|
3371
3374
|
};
|
|
3372
|
-
const
|
|
3373
|
-
|
|
3374
|
-
|
|
3375
|
-
|
|
3376
|
-
|
|
3377
|
-
|
|
3378
|
-
|
|
3379
|
-
|
|
3380
|
-
|
|
3381
|
-
|
|
3382
|
-
|
|
3383
|
-
|
|
3384
|
-
|
|
3385
|
-
|
|
3386
|
-
|
|
3387
|
-
|
|
3388
|
-
|
|
3389
|
-
|
|
3390
|
-
|
|
3391
|
-
|
|
3392
|
-
|
|
3375
|
+
const mergeContentOrChanges = (contentOrChanges, hasHashes = 0) => {
|
|
3376
|
+
const tablesChanges = {};
|
|
3377
|
+
const valuesChanges = {};
|
|
3378
|
+
const [
|
|
3379
|
+
contentOrChangesTime,
|
|
3380
|
+
[[tablesTime, tablesObj, incomingTablesHash], values],
|
|
3381
|
+
incomingContentOrChangesHash,
|
|
3382
|
+
] = contentOrChanges;
|
|
3383
|
+
const [, [tablesHsm, valuesHsm]] = contentHsm;
|
|
3384
|
+
const [oldTablesTime, tableHsms, oldTablesHash] = tablesHsm;
|
|
3385
|
+
if (tablesTime) {
|
|
3386
|
+
let tablesHash = hasHashes
|
|
3387
|
+
? incomingTablesHash
|
|
3388
|
+
: oldTablesHash ^
|
|
3389
|
+
(tablesTime > oldTablesTime
|
|
3390
|
+
? (oldTablesTime ? getHash(oldTablesTime) : 0) ^ getHash(tablesTime)
|
|
3391
|
+
: 0);
|
|
3392
|
+
objForEach(
|
|
3393
|
+
tablesObj,
|
|
3394
|
+
([tableTime, rowsObj, incomingTableHash], tableId) => {
|
|
3395
|
+
const tableHsm = mapEnsure(tableHsms, tableId, hashStampNewMap);
|
|
3396
|
+
const [oldTableTime, rowHsms, oldTableHash] = tableHsm;
|
|
3397
|
+
let tableHash = hasHashes
|
|
3398
|
+
? incomingTableHash
|
|
3399
|
+
: oldTableHash ^
|
|
3400
|
+
(tableTime > oldTableTime
|
|
3401
|
+
? (oldTableTime ? getHash(oldTableTime) : 0) ^
|
|
3402
|
+
getHash(tableTime)
|
|
3403
|
+
: 0);
|
|
3404
|
+
objForEach(rowsObj, (row, rowId) => {
|
|
3405
|
+
const [oldRowHash, rowHash] = mergeCellsOrValues(
|
|
3406
|
+
row,
|
|
3407
|
+
mapEnsure(rowHsms, rowId, hashStampNewMap),
|
|
3408
|
+
objEnsure(
|
|
3409
|
+
objEnsure(tablesChanges, tableId, objNew),
|
|
3410
|
+
rowId,
|
|
3411
|
+
objNew,
|
|
3412
|
+
),
|
|
3413
|
+
hasHashes,
|
|
3393
3414
|
);
|
|
3415
|
+
tableHash ^= hasHashes
|
|
3416
|
+
? 0
|
|
3417
|
+
: (oldRowHash ? hashIdAndHash(rowId, oldRowHash) : 0) ^
|
|
3418
|
+
hashIdAndHash(rowId, rowHash);
|
|
3394
3419
|
});
|
|
3395
|
-
|
|
3396
|
-
|
|
3397
|
-
|
|
3398
|
-
|
|
3399
|
-
|
|
3400
|
-
|
|
3401
|
-
|
|
3402
|
-
|
|
3420
|
+
updateHashStamp(tableHsm, tableHash, tableTime);
|
|
3421
|
+
tablesHash ^= hasHashes
|
|
3422
|
+
? 0
|
|
3423
|
+
: (oldTableHash ? hashIdAndHash(tableId, oldTableHash) : 0) ^
|
|
3424
|
+
hashIdAndHash(tableId, tableHsm[2]);
|
|
3425
|
+
},
|
|
3426
|
+
);
|
|
3427
|
+
updateHashStamp(tablesHsm, tablesHash, tablesTime);
|
|
3428
|
+
}
|
|
3429
|
+
mergeCellsOrValues(values, valuesHsm, valuesChanges, hasHashes);
|
|
3430
|
+
updateHashStamp(
|
|
3431
|
+
contentHsm,
|
|
3432
|
+
hasHashes ? incomingContentOrChangesHash : tablesHsm[2] ^ valuesHsm[2],
|
|
3433
|
+
contentOrChangesTime,
|
|
3434
|
+
);
|
|
3435
|
+
return [tablesChanges, valuesChanges];
|
|
3436
|
+
};
|
|
3437
|
+
const mergeCellsOrValues = (things, thingsHsm, thingsChanges, hasHashes) => {
|
|
3438
|
+
const [thingsTime, thingsObj, incomingThingsHash] = things;
|
|
3439
|
+
const [oldThingsTime, thingHsms, oldThingsHash] = thingsHsm;
|
|
3440
|
+
if (thingsTime) {
|
|
3441
|
+
let thingsHash = hasHashes
|
|
3442
|
+
? incomingThingsHash
|
|
3443
|
+
: oldThingsHash ^
|
|
3444
|
+
(thingsTime > oldThingsTime
|
|
3445
|
+
? (oldThingsTime ? getHash(oldThingsTime) : 0) ^ getHash(thingsTime)
|
|
3446
|
+
: 0);
|
|
3447
|
+
objForEach(
|
|
3448
|
+
thingsObj,
|
|
3449
|
+
([thingTime, thing, incomingThingHash], thingId) => {
|
|
3450
|
+
const thingHsm = mapEnsure(thingHsms, thingId, hashStampNewThing);
|
|
3451
|
+
const [oldThingTime, , oldThingHash] = thingHsm;
|
|
3452
|
+
if (thingTime > oldThingTime) {
|
|
3453
|
+
updateHashStamp(
|
|
3454
|
+
thingHsm,
|
|
3455
|
+
hasHashes
|
|
3456
|
+
? incomingThingHash
|
|
3457
|
+
: getHash(jsonString(thing ?? null) + ':' + thingTime),
|
|
3458
|
+
thingTime,
|
|
3459
|
+
);
|
|
3460
|
+
thingHsm[1] = thing;
|
|
3461
|
+
thingsChanges[thingId] = thing;
|
|
3462
|
+
thingsHash ^= hasHashes
|
|
3463
|
+
? 0
|
|
3464
|
+
: hashIdAndHash(thingId, oldThingHash) ^
|
|
3465
|
+
hashIdAndHash(thingId, thingHsm[2]);
|
|
3466
|
+
}
|
|
3467
|
+
},
|
|
3468
|
+
);
|
|
3469
|
+
updateHashStamp(thingsHsm, thingsHash, thingsTime);
|
|
3403
3470
|
}
|
|
3471
|
+
return [oldThingsHash, thingsHsm[2]];
|
|
3404
3472
|
};
|
|
3405
|
-
const
|
|
3406
|
-
(
|
|
3407
|
-
|
|
3408
|
-
|
|
3409
|
-
|
|
3410
|
-
mergeableStore2.applyMergeableChanges(mergeableContent);
|
|
3411
|
-
return applyMergeableChanges(mergeableContent2);
|
|
3473
|
+
const preFinishTransaction = () => {
|
|
3474
|
+
if (listening) {
|
|
3475
|
+
transactionMergeableChanges = getTransactionMergeableChanges();
|
|
3476
|
+
mergeContentOrChanges(transactionMergeableChanges);
|
|
3477
|
+
}
|
|
3412
3478
|
};
|
|
3479
|
+
const postFinishTransaction = () =>
|
|
3480
|
+
(transactionTime = transactionMergeableChanges = void 0);
|
|
3413
3481
|
const getMergeableContent = () =>
|
|
3414
|
-
|
|
3415
|
-
|
|
3416
|
-
|
|
3417
|
-
mapStampMapToObj(cellsStamp, cloneStamp),
|
|
3418
|
-
),
|
|
3482
|
+
hashStampMap(contentHsm, ([tables, values]) => [
|
|
3483
|
+
hashStampMapToObj(tables, (table) =>
|
|
3484
|
+
hashStampMapToObj(table, (row) => hashStampMapToObj(row)),
|
|
3419
3485
|
),
|
|
3420
|
-
|
|
3486
|
+
hashStampMapToObj(values),
|
|
3421
3487
|
]);
|
|
3422
3488
|
const setMergeableContent = (mergeableContent) => {
|
|
3423
3489
|
disableListening(() =>
|
|
3424
3490
|
store.transaction(() => {
|
|
3425
3491
|
store.delTables().delValues();
|
|
3426
|
-
|
|
3492
|
+
contentHsm = newContentHsm();
|
|
3427
3493
|
}),
|
|
3428
3494
|
);
|
|
3429
|
-
|
|
3495
|
+
seenHlc(mergeableContent[0]);
|
|
3496
|
+
disableListening(() =>
|
|
3497
|
+
store.applyChanges(mergeContentOrChanges(mergeableContent, 1)),
|
|
3498
|
+
);
|
|
3430
3499
|
return mergeableStore;
|
|
3431
3500
|
};
|
|
3432
3501
|
const getTransactionMergeableChanges = () => {
|
|
3433
|
-
if (isUndefined(
|
|
3502
|
+
if (isUndefined(transactionMergeableChanges)) {
|
|
3434
3503
|
const [, , changedCells, , changedValues] = store.getTransactionLog();
|
|
3435
3504
|
const time =
|
|
3436
3505
|
!objIsEmpty(changedCells) || !objIsEmpty(changedValues)
|
|
@@ -3440,69 +3509,67 @@ const createMergeableStore = (id) => {
|
|
|
3440
3509
|
stampNewObj(objIsEmpty(changedCells) ? EMPTY_STRING : time),
|
|
3441
3510
|
stampNewObj(objIsEmpty(changedValues) ? EMPTY_STRING : time),
|
|
3442
3511
|
]);
|
|
3443
|
-
const [[,
|
|
3512
|
+
const [[, tablesObj], [, valuesObj]] = mergeableChanges[1];
|
|
3444
3513
|
objToArray(changedCells, (changedTable, tableId) => {
|
|
3445
|
-
const [,
|
|
3514
|
+
const [, rowsObj] = (tablesObj[tableId] = stampNewObj(time));
|
|
3446
3515
|
objToArray(changedTable, (changedRow, rowId) => {
|
|
3447
|
-
const [,
|
|
3516
|
+
const [, cellsObj] = (rowsObj[rowId] = stampNewObj(time));
|
|
3448
3517
|
objToArray(
|
|
3449
3518
|
changedRow,
|
|
3450
3519
|
([, newCell], cellId) =>
|
|
3451
|
-
(
|
|
3520
|
+
(cellsObj[cellId] = stampNew(time, newCell)),
|
|
3452
3521
|
);
|
|
3453
3522
|
});
|
|
3454
3523
|
});
|
|
3455
3524
|
objToArray(
|
|
3456
3525
|
changedValues,
|
|
3457
3526
|
([, newValue], valueId) =>
|
|
3458
|
-
(
|
|
3527
|
+
(valuesObj[valueId] = stampNew(time, newValue)),
|
|
3459
3528
|
);
|
|
3460
3529
|
return mergeableChanges;
|
|
3461
3530
|
}
|
|
3462
|
-
return
|
|
3463
|
-
};
|
|
3464
|
-
const applyMergeableChanges = (
|
|
3465
|
-
|
|
3466
|
-
|
|
3467
|
-
|
|
3468
|
-
newContentStamp2,
|
|
3469
|
-
contentStamp,
|
|
3470
|
-
changes,
|
|
3471
|
-
(
|
|
3472
|
-
[newTablesStamp, newValuesStamp],
|
|
3473
|
-
[tablesStamp, valuesStamp],
|
|
3474
|
-
[tablesChanges, valuesChanges],
|
|
3475
|
-
) => {
|
|
3476
|
-
mergeStamp(
|
|
3477
|
-
newTablesStamp,
|
|
3478
|
-
tablesStamp,
|
|
3479
|
-
tablesChanges,
|
|
3480
|
-
(newTableStamps, tableStamps, tableChanges) =>
|
|
3481
|
-
mergeStamps(
|
|
3482
|
-
newTableStamps,
|
|
3483
|
-
tableStamps,
|
|
3484
|
-
tableChanges,
|
|
3485
|
-
(newRowStamps, rowStamps, rowChanges) =>
|
|
3486
|
-
mergeStamps(
|
|
3487
|
-
newRowStamps,
|
|
3488
|
-
rowStamps,
|
|
3489
|
-
rowChanges,
|
|
3490
|
-
mergeLeafStamps,
|
|
3491
|
-
),
|
|
3492
|
-
),
|
|
3493
|
-
);
|
|
3494
|
-
mergeStamp(newValuesStamp, valuesStamp, valuesChanges, mergeLeafStamps);
|
|
3495
|
-
},
|
|
3531
|
+
return transactionMergeableChanges;
|
|
3532
|
+
};
|
|
3533
|
+
const applyMergeableChanges = (mergeableChanges) => {
|
|
3534
|
+
seenHlc(mergeableChanges[0]);
|
|
3535
|
+
disableListening(() =>
|
|
3536
|
+
store.applyChanges(mergeContentOrChanges(mergeableChanges)),
|
|
3496
3537
|
);
|
|
3497
|
-
disableListening(() => store.applyChanges(changes));
|
|
3498
3538
|
return mergeableStore;
|
|
3499
3539
|
};
|
|
3540
|
+
const merge = (mergeableStore2) => {
|
|
3541
|
+
const mergeableChanges = getMergeableContent();
|
|
3542
|
+
const mergeableChanges2 = mergeableStore2.getMergeableContent();
|
|
3543
|
+
mergeableStore2.applyMergeableChanges(mergeableChanges);
|
|
3544
|
+
return applyMergeableChanges(mergeableChanges2);
|
|
3545
|
+
};
|
|
3546
|
+
const getContentHash = () => contentHsm[2];
|
|
3547
|
+
const getTablesHash = () => contentHsm[1][0][2];
|
|
3548
|
+
const getTableHash = (tableId) =>
|
|
3549
|
+
mapGet(contentHsm[1][0][1], tableId)?.[2] ?? 0;
|
|
3550
|
+
const getRowHash = (tableId, rowId) =>
|
|
3551
|
+
mapGet(mapGet(contentHsm[1][0][1], tableId)?.[1], rowId)?.[2] ?? 0;
|
|
3552
|
+
const getCellHash = (tableId, rowId, cellId) =>
|
|
3553
|
+
mapGet(
|
|
3554
|
+
mapGet(mapGet(contentHsm[1][0][1], tableId)?.[1], rowId)?.[1],
|
|
3555
|
+
cellId,
|
|
3556
|
+
)?.[2] ?? 0;
|
|
3557
|
+
const getValuesHash = () => contentHsm[1][1][2];
|
|
3558
|
+
const getValueHash = (valueId) =>
|
|
3559
|
+
mapGet(contentHsm[1][1][1], valueId)?.[2] ?? 0;
|
|
3500
3560
|
const mergeableStore = {
|
|
3501
3561
|
getMergeableContent,
|
|
3502
3562
|
setMergeableContent,
|
|
3503
3563
|
getTransactionMergeableChanges,
|
|
3504
3564
|
applyMergeableChanges,
|
|
3505
3565
|
merge,
|
|
3566
|
+
getContentHash,
|
|
3567
|
+
getTablesHash,
|
|
3568
|
+
getTableHash,
|
|
3569
|
+
getRowHash,
|
|
3570
|
+
getCellHash,
|
|
3571
|
+
getValuesHash,
|
|
3572
|
+
getValueHash,
|
|
3506
3573
|
};
|
|
3507
3574
|
store.setInternalListeners(preFinishTransaction, postFinishTransaction);
|
|
3508
3575
|
objToArray(
|
package/lib/debug/tools.js
CHANGED
|
@@ -36,9 +36,10 @@ const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
|
|
|
36
36
|
const size = (arrayOrString) => arrayOrString.length;
|
|
37
37
|
const promiseAll = async (promises) => promise.all(promises);
|
|
38
38
|
|
|
39
|
-
const getCellOrValueType = (
|
|
40
|
-
const type = getTypeOf(
|
|
41
|
-
return isTypeStringOrBoolean(type) ||
|
|
39
|
+
const getCellOrValueType = (cellOrValue) => {
|
|
40
|
+
const type = getTypeOf(cellOrValue);
|
|
41
|
+
return isTypeStringOrBoolean(type) ||
|
|
42
|
+
(type == NUMBER && isFiniteNumber(cellOrValue))
|
|
42
43
|
? type
|
|
43
44
|
: void 0;
|
|
44
45
|
};
|
|
@@ -87,9 +88,11 @@ const mapMap = (coll, cb) =>
|
|
|
87
88
|
arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
|
|
88
89
|
const mapSet = (map, key, value) =>
|
|
89
90
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
90
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
91
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
91
92
|
if (!collHas(map, key)) {
|
|
92
93
|
mapSet(map, key, getDefaultValue());
|
|
94
|
+
} else {
|
|
95
|
+
hadExistingValue?.(mapGet(map, key));
|
|
93
96
|
}
|
|
94
97
|
return mapGet(map, key);
|
|
95
98
|
};
|
|
@@ -334,9 +334,10 @@ const Details = ({
|
|
|
334
334
|
);
|
|
335
335
|
};
|
|
336
336
|
|
|
337
|
-
const getCellOrValueType = (
|
|
338
|
-
const type = getTypeOf(
|
|
339
|
-
return isTypeStringOrBoolean(type) ||
|
|
337
|
+
const getCellOrValueType = (cellOrValue) => {
|
|
338
|
+
const type = getTypeOf(cellOrValue);
|
|
339
|
+
return isTypeStringOrBoolean(type) ||
|
|
340
|
+
(type == NUMBER && isFiniteNumber(cellOrValue))
|
|
340
341
|
? type
|
|
341
342
|
: void 0;
|
|
342
343
|
};
|
|
@@ -1529,9 +1530,11 @@ const mapMap = (coll, cb) =>
|
|
|
1529
1530
|
arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
|
|
1530
1531
|
const mapSet = (map, key, value) =>
|
|
1531
1532
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
1532
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
1533
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
1533
1534
|
if (!collHas(map, key)) {
|
|
1534
1535
|
mapSet(map, key, getDefaultValue());
|
|
1536
|
+
} else {
|
|
1537
|
+
hadExistingValue?.(mapGet(map, key));
|
|
1535
1538
|
}
|
|
1536
1539
|
return mapGet(map, key);
|
|
1537
1540
|
};
|