tinybase 5.0.0-beta.3 → 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 +247 -139
- package/lib/debug/metrics.js +3 -1
- package/lib/debug/persisters/persister-automerge.js +36 -12
- package/lib/debug/persisters/persister-browser.js +37 -13
- package/lib/debug/persisters/persister-cr-sqlite-wasm.js +36 -12
- package/lib/debug/persisters/persister-electric-sql.js +36 -12
- package/lib/debug/persisters/persister-expo-sqlite-next.js +36 -12
- package/lib/debug/persisters/persister-expo-sqlite.js +36 -12
- package/lib/debug/persisters/persister-file.js +37 -13
- package/lib/debug/persisters/persister-indexed-db.js +36 -12
- package/lib/debug/persisters/persister-libsql.js +898 -0
- package/lib/debug/persisters/persister-partykit-client.js +36 -12
- package/lib/debug/persisters/persister-remote.js +36 -12
- package/lib/debug/persisters/persister-sqlite-wasm.js +36 -12
- package/lib/debug/persisters/persister-sqlite3.js +36 -12
- package/lib/debug/persisters/persister-yjs.js +36 -12
- package/lib/debug/persisters.js +36 -12
- package/lib/debug/queries.js +7 -4
- package/lib/debug/relationships.js +3 -1
- package/lib/debug/store.js +21 -22
- package/lib/debug/tinybase.js +279 -150
- package/lib/debug/tools.js +7 -4
- package/lib/debug/ui-react-dom.js +55 -34
- 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 +78 -11
- package/lib/types/persisters/persister-browser.d.ts +2 -2
- package/lib/types/persisters/persister-file.d.ts +1 -1
- package/lib/types/persisters/persister-libsql.d.ts +139 -0
- package/lib/types/persisters.d.ts +19 -7
- package/lib/types/with-schemas/mergeable-store.d.ts +314 -31
- package/lib/types/with-schemas/persisters/persister-browser.d.ts +2 -2
- package/lib/types/with-schemas/persisters/persister-file.d.ts +1 -1
- package/lib/types/with-schemas/persisters/persister-libsql.d.ts +152 -0
- package/lib/types/with-schemas/persisters.d.ts +14 -6
- 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 +35 -30
- package/readme.md +2 -2
|
@@ -42,15 +42,34 @@ const mapNew = (entries) => new Map(entries);
|
|
|
42
42
|
const mapGet = (map, key) => map?.get(key);
|
|
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
|
};
|
|
51
53
|
|
|
52
54
|
const scheduleRunning = mapNew();
|
|
53
55
|
const scheduleActions = mapNew();
|
|
56
|
+
const isMergeable = (contentOrChanges) => isString(contentOrChanges?.[0]);
|
|
57
|
+
const getStoreFunctions = (supportsMergeableStore, store) =>
|
|
58
|
+
!supportsMergeableStore || isUndefined(store.getMergeableContent)
|
|
59
|
+
? [
|
|
60
|
+
0,
|
|
61
|
+
store.getContent,
|
|
62
|
+
store.getTransactionChanges,
|
|
63
|
+
([changedTables, changedValues]) =>
|
|
64
|
+
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
65
|
+
]
|
|
66
|
+
: [
|
|
67
|
+
1,
|
|
68
|
+
store.getMergeableContent,
|
|
69
|
+
store.getTransactionMergeableChanges,
|
|
70
|
+
([, [[, changedTables], [, changedValues]]]) =>
|
|
71
|
+
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
72
|
+
];
|
|
54
73
|
const createCustomPersister = (
|
|
55
74
|
store,
|
|
56
75
|
getPersisted,
|
|
@@ -71,10 +90,8 @@ const createCustomPersister = (
|
|
|
71
90
|
let listeningHandle;
|
|
72
91
|
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
73
92
|
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
74
|
-
const getContent =
|
|
75
|
-
(supportsMergeableStore
|
|
76
|
-
store.getContent;
|
|
77
|
-
const getChanges = store.getTransactionChanges;
|
|
93
|
+
const [isMergeableStore, getContent, getChanges, hasChanges] =
|
|
94
|
+
getStoreFunctions(supportsMergeableStore, store);
|
|
78
95
|
const run = async () => {
|
|
79
96
|
/* istanbul ignore else */
|
|
80
97
|
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
@@ -111,8 +128,8 @@ const createCustomPersister = (
|
|
|
111
128
|
await loadLock(async () => {
|
|
112
129
|
try {
|
|
113
130
|
const content = await getPersisted();
|
|
114
|
-
(
|
|
115
|
-
? store.
|
|
131
|
+
(isMergeableStore && isMergeable(content)
|
|
132
|
+
? store.setMergeableContent
|
|
116
133
|
: store.setContent)(content);
|
|
117
134
|
} catch {
|
|
118
135
|
store.setContent([initialTables, initialValues]);
|
|
@@ -126,11 +143,18 @@ const createCustomPersister = (
|
|
|
126
143
|
async (getContent2, getChanges2) => {
|
|
127
144
|
if (getChanges2) {
|
|
128
145
|
const changes = getChanges2();
|
|
129
|
-
await loadLock(async () =>
|
|
146
|
+
await loadLock(async () =>
|
|
147
|
+
(isMergeableStore && isMergeable(changes)
|
|
148
|
+
? store.applyMergeableChanges
|
|
149
|
+
: store.applyChanges)(changes),
|
|
150
|
+
);
|
|
130
151
|
} else {
|
|
131
152
|
await loadLock(async () => {
|
|
132
153
|
try {
|
|
133
|
-
|
|
154
|
+
const content = getContent2?.() ?? (await getPersisted());
|
|
155
|
+
(isMergeableStore && isMergeable(content)
|
|
156
|
+
? store.setMergeableContent
|
|
157
|
+
: store.setContent)(content);
|
|
134
158
|
} catch (error) {
|
|
135
159
|
onIgnoredError?.(error);
|
|
136
160
|
}
|
|
@@ -170,9 +194,9 @@ const createCustomPersister = (
|
|
|
170
194
|
startAutoSave: async () => {
|
|
171
195
|
await persister.stopAutoSave().save();
|
|
172
196
|
listenerId = store.addDidFinishTransactionListener(() => {
|
|
173
|
-
const
|
|
174
|
-
if (
|
|
175
|
-
persister.save(() =>
|
|
197
|
+
const changes = getChanges();
|
|
198
|
+
if (hasChanges(changes)) {
|
|
199
|
+
persister.save(() => changes);
|
|
176
200
|
}
|
|
177
201
|
});
|
|
178
202
|
return persister;
|
|
@@ -226,7 +250,7 @@ const createStoragePersister = (
|
|
|
226
250
|
addPersisterListener,
|
|
227
251
|
delPersisterListener,
|
|
228
252
|
onIgnoredError,
|
|
229
|
-
|
|
253
|
+
true,
|
|
230
254
|
['getStorageName', storageName],
|
|
231
255
|
);
|
|
232
256
|
};
|
|
@@ -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
|
};
|
|
@@ -376,6 +378,23 @@ const jsonParse = JSON.parse;
|
|
|
376
378
|
|
|
377
379
|
const scheduleRunning = mapNew();
|
|
378
380
|
const scheduleActions = mapNew();
|
|
381
|
+
const isMergeable = (contentOrChanges) => isString(contentOrChanges?.[0]);
|
|
382
|
+
const getStoreFunctions = (supportsMergeableStore, store) =>
|
|
383
|
+
!supportsMergeableStore || isUndefined(store.getMergeableContent)
|
|
384
|
+
? [
|
|
385
|
+
0,
|
|
386
|
+
store.getContent,
|
|
387
|
+
store.getTransactionChanges,
|
|
388
|
+
([changedTables, changedValues]) =>
|
|
389
|
+
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
390
|
+
]
|
|
391
|
+
: [
|
|
392
|
+
1,
|
|
393
|
+
store.getMergeableContent,
|
|
394
|
+
store.getTransactionMergeableChanges,
|
|
395
|
+
([, [[, changedTables], [, changedValues]]]) =>
|
|
396
|
+
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
397
|
+
];
|
|
379
398
|
const createCustomPersister = (
|
|
380
399
|
store,
|
|
381
400
|
getPersisted,
|
|
@@ -396,10 +415,8 @@ const createCustomPersister = (
|
|
|
396
415
|
let listeningHandle;
|
|
397
416
|
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
398
417
|
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
399
|
-
const getContent =
|
|
400
|
-
(supportsMergeableStore
|
|
401
|
-
store.getContent;
|
|
402
|
-
const getChanges = store.getTransactionChanges;
|
|
418
|
+
const [isMergeableStore, getContent, getChanges, hasChanges] =
|
|
419
|
+
getStoreFunctions(supportsMergeableStore, store);
|
|
403
420
|
const run = async () => {
|
|
404
421
|
/* istanbul ignore else */
|
|
405
422
|
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
@@ -436,8 +453,8 @@ const createCustomPersister = (
|
|
|
436
453
|
await loadLock(async () => {
|
|
437
454
|
try {
|
|
438
455
|
const content = await getPersisted();
|
|
439
|
-
(
|
|
440
|
-
? store.
|
|
456
|
+
(isMergeableStore && isMergeable(content)
|
|
457
|
+
? store.setMergeableContent
|
|
441
458
|
: store.setContent)(content);
|
|
442
459
|
} catch {
|
|
443
460
|
store.setContent([initialTables, initialValues]);
|
|
@@ -451,11 +468,18 @@ const createCustomPersister = (
|
|
|
451
468
|
async (getContent2, getChanges2) => {
|
|
452
469
|
if (getChanges2) {
|
|
453
470
|
const changes = getChanges2();
|
|
454
|
-
await loadLock(async () =>
|
|
471
|
+
await loadLock(async () =>
|
|
472
|
+
(isMergeableStore && isMergeable(changes)
|
|
473
|
+
? store.applyMergeableChanges
|
|
474
|
+
: store.applyChanges)(changes),
|
|
475
|
+
);
|
|
455
476
|
} else {
|
|
456
477
|
await loadLock(async () => {
|
|
457
478
|
try {
|
|
458
|
-
|
|
479
|
+
const content = getContent2?.() ?? (await getPersisted());
|
|
480
|
+
(isMergeableStore && isMergeable(content)
|
|
481
|
+
? store.setMergeableContent
|
|
482
|
+
: store.setContent)(content);
|
|
459
483
|
} catch (error) {
|
|
460
484
|
onIgnoredError?.(error);
|
|
461
485
|
}
|
|
@@ -495,9 +519,9 @@ const createCustomPersister = (
|
|
|
495
519
|
startAutoSave: async () => {
|
|
496
520
|
await persister.stopAutoSave().save();
|
|
497
521
|
listenerId = store.addDidFinishTransactionListener(() => {
|
|
498
|
-
const
|
|
499
|
-
if (
|
|
500
|
-
persister.save(() =>
|
|
522
|
+
const changes = getChanges();
|
|
523
|
+
if (hasChanges(changes)) {
|
|
524
|
+
persister.save(() => changes);
|
|
501
525
|
}
|
|
502
526
|
});
|
|
503
527
|
return persister;
|
|
@@ -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
|
};
|
|
@@ -377,6 +379,23 @@ const jsonParse = JSON.parse;
|
|
|
377
379
|
|
|
378
380
|
const scheduleRunning = mapNew();
|
|
379
381
|
const scheduleActions = mapNew();
|
|
382
|
+
const isMergeable = (contentOrChanges) => isString(contentOrChanges?.[0]);
|
|
383
|
+
const getStoreFunctions = (supportsMergeableStore, store) =>
|
|
384
|
+
!supportsMergeableStore || isUndefined(store.getMergeableContent)
|
|
385
|
+
? [
|
|
386
|
+
0,
|
|
387
|
+
store.getContent,
|
|
388
|
+
store.getTransactionChanges,
|
|
389
|
+
([changedTables, changedValues]) =>
|
|
390
|
+
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
391
|
+
]
|
|
392
|
+
: [
|
|
393
|
+
1,
|
|
394
|
+
store.getMergeableContent,
|
|
395
|
+
store.getTransactionMergeableChanges,
|
|
396
|
+
([, [[, changedTables], [, changedValues]]]) =>
|
|
397
|
+
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
398
|
+
];
|
|
380
399
|
const createCustomPersister = (
|
|
381
400
|
store,
|
|
382
401
|
getPersisted,
|
|
@@ -397,10 +416,8 @@ const createCustomPersister = (
|
|
|
397
416
|
let listeningHandle;
|
|
398
417
|
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
399
418
|
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
400
|
-
const getContent =
|
|
401
|
-
(supportsMergeableStore
|
|
402
|
-
store.getContent;
|
|
403
|
-
const getChanges = store.getTransactionChanges;
|
|
419
|
+
const [isMergeableStore, getContent, getChanges, hasChanges] =
|
|
420
|
+
getStoreFunctions(supportsMergeableStore, store);
|
|
404
421
|
const run = async () => {
|
|
405
422
|
/* istanbul ignore else */
|
|
406
423
|
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
@@ -437,8 +454,8 @@ const createCustomPersister = (
|
|
|
437
454
|
await loadLock(async () => {
|
|
438
455
|
try {
|
|
439
456
|
const content = await getPersisted();
|
|
440
|
-
(
|
|
441
|
-
? store.
|
|
457
|
+
(isMergeableStore && isMergeable(content)
|
|
458
|
+
? store.setMergeableContent
|
|
442
459
|
: store.setContent)(content);
|
|
443
460
|
} catch {
|
|
444
461
|
store.setContent([initialTables, initialValues]);
|
|
@@ -452,11 +469,18 @@ const createCustomPersister = (
|
|
|
452
469
|
async (getContent2, getChanges2) => {
|
|
453
470
|
if (getChanges2) {
|
|
454
471
|
const changes = getChanges2();
|
|
455
|
-
await loadLock(async () =>
|
|
472
|
+
await loadLock(async () =>
|
|
473
|
+
(isMergeableStore && isMergeable(changes)
|
|
474
|
+
? store.applyMergeableChanges
|
|
475
|
+
: store.applyChanges)(changes),
|
|
476
|
+
);
|
|
456
477
|
} else {
|
|
457
478
|
await loadLock(async () => {
|
|
458
479
|
try {
|
|
459
|
-
|
|
480
|
+
const content = getContent2?.() ?? (await getPersisted());
|
|
481
|
+
(isMergeableStore && isMergeable(content)
|
|
482
|
+
? store.setMergeableContent
|
|
483
|
+
: store.setContent)(content);
|
|
460
484
|
} catch (error) {
|
|
461
485
|
onIgnoredError?.(error);
|
|
462
486
|
}
|
|
@@ -496,9 +520,9 @@ const createCustomPersister = (
|
|
|
496
520
|
startAutoSave: async () => {
|
|
497
521
|
await persister.stopAutoSave().save();
|
|
498
522
|
listenerId = store.addDidFinishTransactionListener(() => {
|
|
499
|
-
const
|
|
500
|
-
if (
|
|
501
|
-
persister.save(() =>
|
|
523
|
+
const changes = getChanges();
|
|
524
|
+
if (hasChanges(changes)) {
|
|
525
|
+
persister.save(() => changes);
|
|
502
526
|
}
|
|
503
527
|
});
|
|
504
528
|
return persister;
|
|
@@ -77,9 +77,11 @@ const mapMap = (coll, cb) =>
|
|
|
77
77
|
arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
|
|
78
78
|
const mapSet = (map, key, value) =>
|
|
79
79
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
80
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
80
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
81
81
|
if (!collHas(map, key)) {
|
|
82
82
|
mapSet(map, key, getDefaultValue());
|
|
83
|
+
} else {
|
|
84
|
+
hadExistingValue?.(mapGet(map, key));
|
|
83
85
|
}
|
|
84
86
|
return mapGet(map, key);
|
|
85
87
|
};
|
|
@@ -378,6 +380,23 @@ const jsonParse = JSON.parse;
|
|
|
378
380
|
|
|
379
381
|
const scheduleRunning = mapNew();
|
|
380
382
|
const scheduleActions = mapNew();
|
|
383
|
+
const isMergeable = (contentOrChanges) => isString(contentOrChanges?.[0]);
|
|
384
|
+
const getStoreFunctions = (supportsMergeableStore, store) =>
|
|
385
|
+
!supportsMergeableStore || isUndefined(store.getMergeableContent)
|
|
386
|
+
? [
|
|
387
|
+
0,
|
|
388
|
+
store.getContent,
|
|
389
|
+
store.getTransactionChanges,
|
|
390
|
+
([changedTables, changedValues]) =>
|
|
391
|
+
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
392
|
+
]
|
|
393
|
+
: [
|
|
394
|
+
1,
|
|
395
|
+
store.getMergeableContent,
|
|
396
|
+
store.getTransactionMergeableChanges,
|
|
397
|
+
([, [[, changedTables], [, changedValues]]]) =>
|
|
398
|
+
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
399
|
+
];
|
|
381
400
|
const createCustomPersister = (
|
|
382
401
|
store,
|
|
383
402
|
getPersisted,
|
|
@@ -398,10 +417,8 @@ const createCustomPersister = (
|
|
|
398
417
|
let listeningHandle;
|
|
399
418
|
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
400
419
|
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
401
|
-
const getContent =
|
|
402
|
-
(supportsMergeableStore
|
|
403
|
-
store.getContent;
|
|
404
|
-
const getChanges = store.getTransactionChanges;
|
|
420
|
+
const [isMergeableStore, getContent, getChanges, hasChanges] =
|
|
421
|
+
getStoreFunctions(supportsMergeableStore, store);
|
|
405
422
|
const run = async () => {
|
|
406
423
|
/* istanbul ignore else */
|
|
407
424
|
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
@@ -438,8 +455,8 @@ const createCustomPersister = (
|
|
|
438
455
|
await loadLock(async () => {
|
|
439
456
|
try {
|
|
440
457
|
const content = await getPersisted();
|
|
441
|
-
(
|
|
442
|
-
? store.
|
|
458
|
+
(isMergeableStore && isMergeable(content)
|
|
459
|
+
? store.setMergeableContent
|
|
443
460
|
: store.setContent)(content);
|
|
444
461
|
} catch {
|
|
445
462
|
store.setContent([initialTables, initialValues]);
|
|
@@ -453,11 +470,18 @@ const createCustomPersister = (
|
|
|
453
470
|
async (getContent2, getChanges2) => {
|
|
454
471
|
if (getChanges2) {
|
|
455
472
|
const changes = getChanges2();
|
|
456
|
-
await loadLock(async () =>
|
|
473
|
+
await loadLock(async () =>
|
|
474
|
+
(isMergeableStore && isMergeable(changes)
|
|
475
|
+
? store.applyMergeableChanges
|
|
476
|
+
: store.applyChanges)(changes),
|
|
477
|
+
);
|
|
457
478
|
} else {
|
|
458
479
|
await loadLock(async () => {
|
|
459
480
|
try {
|
|
460
|
-
|
|
481
|
+
const content = getContent2?.() ?? (await getPersisted());
|
|
482
|
+
(isMergeableStore && isMergeable(content)
|
|
483
|
+
? store.setMergeableContent
|
|
484
|
+
: store.setContent)(content);
|
|
461
485
|
} catch (error) {
|
|
462
486
|
onIgnoredError?.(error);
|
|
463
487
|
}
|
|
@@ -497,9 +521,9 @@ const createCustomPersister = (
|
|
|
497
521
|
startAutoSave: async () => {
|
|
498
522
|
await persister.stopAutoSave().save();
|
|
499
523
|
listenerId = store.addDidFinishTransactionListener(() => {
|
|
500
|
-
const
|
|
501
|
-
if (
|
|
502
|
-
persister.save(() =>
|
|
524
|
+
const changes = getChanges();
|
|
525
|
+
if (hasChanges(changes)) {
|
|
526
|
+
persister.save(() => changes);
|
|
503
527
|
}
|
|
504
528
|
});
|
|
505
529
|
return persister;
|
|
@@ -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
|
};
|
|
@@ -376,6 +378,23 @@ const jsonParse = JSON.parse;
|
|
|
376
378
|
|
|
377
379
|
const scheduleRunning = mapNew();
|
|
378
380
|
const scheduleActions = mapNew();
|
|
381
|
+
const isMergeable = (contentOrChanges) => isString(contentOrChanges?.[0]);
|
|
382
|
+
const getStoreFunctions = (supportsMergeableStore, store) =>
|
|
383
|
+
!supportsMergeableStore || isUndefined(store.getMergeableContent)
|
|
384
|
+
? [
|
|
385
|
+
0,
|
|
386
|
+
store.getContent,
|
|
387
|
+
store.getTransactionChanges,
|
|
388
|
+
([changedTables, changedValues]) =>
|
|
389
|
+
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
390
|
+
]
|
|
391
|
+
: [
|
|
392
|
+
1,
|
|
393
|
+
store.getMergeableContent,
|
|
394
|
+
store.getTransactionMergeableChanges,
|
|
395
|
+
([, [[, changedTables], [, changedValues]]]) =>
|
|
396
|
+
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
397
|
+
];
|
|
379
398
|
const createCustomPersister = (
|
|
380
399
|
store,
|
|
381
400
|
getPersisted,
|
|
@@ -396,10 +415,8 @@ const createCustomPersister = (
|
|
|
396
415
|
let listeningHandle;
|
|
397
416
|
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
398
417
|
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
399
|
-
const getContent =
|
|
400
|
-
(supportsMergeableStore
|
|
401
|
-
store.getContent;
|
|
402
|
-
const getChanges = store.getTransactionChanges;
|
|
418
|
+
const [isMergeableStore, getContent, getChanges, hasChanges] =
|
|
419
|
+
getStoreFunctions(supportsMergeableStore, store);
|
|
403
420
|
const run = async () => {
|
|
404
421
|
/* istanbul ignore else */
|
|
405
422
|
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
@@ -436,8 +453,8 @@ const createCustomPersister = (
|
|
|
436
453
|
await loadLock(async () => {
|
|
437
454
|
try {
|
|
438
455
|
const content = await getPersisted();
|
|
439
|
-
(
|
|
440
|
-
? store.
|
|
456
|
+
(isMergeableStore && isMergeable(content)
|
|
457
|
+
? store.setMergeableContent
|
|
441
458
|
: store.setContent)(content);
|
|
442
459
|
} catch {
|
|
443
460
|
store.setContent([initialTables, initialValues]);
|
|
@@ -451,11 +468,18 @@ const createCustomPersister = (
|
|
|
451
468
|
async (getContent2, getChanges2) => {
|
|
452
469
|
if (getChanges2) {
|
|
453
470
|
const changes = getChanges2();
|
|
454
|
-
await loadLock(async () =>
|
|
471
|
+
await loadLock(async () =>
|
|
472
|
+
(isMergeableStore && isMergeable(changes)
|
|
473
|
+
? store.applyMergeableChanges
|
|
474
|
+
: store.applyChanges)(changes),
|
|
475
|
+
);
|
|
455
476
|
} else {
|
|
456
477
|
await loadLock(async () => {
|
|
457
478
|
try {
|
|
458
|
-
|
|
479
|
+
const content = getContent2?.() ?? (await getPersisted());
|
|
480
|
+
(isMergeableStore && isMergeable(content)
|
|
481
|
+
? store.setMergeableContent
|
|
482
|
+
: store.setContent)(content);
|
|
459
483
|
} catch (error) {
|
|
460
484
|
onIgnoredError?.(error);
|
|
461
485
|
}
|
|
@@ -495,9 +519,9 @@ const createCustomPersister = (
|
|
|
495
519
|
startAutoSave: async () => {
|
|
496
520
|
await persister.stopAutoSave().save();
|
|
497
521
|
listenerId = store.addDidFinishTransactionListener(() => {
|
|
498
|
-
const
|
|
499
|
-
if (
|
|
500
|
-
persister.save(() =>
|
|
522
|
+
const changes = getChanges();
|
|
523
|
+
if (hasChanges(changes)) {
|
|
524
|
+
persister.save(() => changes);
|
|
501
525
|
}
|
|
502
526
|
});
|
|
503
527
|
return persister;
|
|
@@ -46,15 +46,34 @@ const mapNew = (entries) => new Map(entries);
|
|
|
46
46
|
const mapGet = (map, key) => map?.get(key);
|
|
47
47
|
const mapSet = (map, key, value) =>
|
|
48
48
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
49
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
49
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
50
50
|
if (!collHas(map, key)) {
|
|
51
51
|
mapSet(map, key, getDefaultValue());
|
|
52
|
+
} else {
|
|
53
|
+
hadExistingValue?.(mapGet(map, key));
|
|
52
54
|
}
|
|
53
55
|
return mapGet(map, key);
|
|
54
56
|
};
|
|
55
57
|
|
|
56
58
|
const scheduleRunning = mapNew();
|
|
57
59
|
const scheduleActions = mapNew();
|
|
60
|
+
const isMergeable = (contentOrChanges) => isString(contentOrChanges?.[0]);
|
|
61
|
+
const getStoreFunctions = (supportsMergeableStore, store) =>
|
|
62
|
+
!supportsMergeableStore || isUndefined(store.getMergeableContent)
|
|
63
|
+
? [
|
|
64
|
+
0,
|
|
65
|
+
store.getContent,
|
|
66
|
+
store.getTransactionChanges,
|
|
67
|
+
([changedTables, changedValues]) =>
|
|
68
|
+
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
69
|
+
]
|
|
70
|
+
: [
|
|
71
|
+
1,
|
|
72
|
+
store.getMergeableContent,
|
|
73
|
+
store.getTransactionMergeableChanges,
|
|
74
|
+
([, [[, changedTables], [, changedValues]]]) =>
|
|
75
|
+
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
76
|
+
];
|
|
58
77
|
const createCustomPersister = (
|
|
59
78
|
store,
|
|
60
79
|
getPersisted,
|
|
@@ -75,10 +94,8 @@ const createCustomPersister = (
|
|
|
75
94
|
let listeningHandle;
|
|
76
95
|
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
77
96
|
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
78
|
-
const getContent =
|
|
79
|
-
(supportsMergeableStore
|
|
80
|
-
store.getContent;
|
|
81
|
-
const getChanges = store.getTransactionChanges;
|
|
97
|
+
const [isMergeableStore, getContent, getChanges, hasChanges] =
|
|
98
|
+
getStoreFunctions(supportsMergeableStore, store);
|
|
82
99
|
const run = async () => {
|
|
83
100
|
/* istanbul ignore else */
|
|
84
101
|
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
@@ -115,8 +132,8 @@ const createCustomPersister = (
|
|
|
115
132
|
await loadLock(async () => {
|
|
116
133
|
try {
|
|
117
134
|
const content = await getPersisted();
|
|
118
|
-
(
|
|
119
|
-
? store.
|
|
135
|
+
(isMergeableStore && isMergeable(content)
|
|
136
|
+
? store.setMergeableContent
|
|
120
137
|
: store.setContent)(content);
|
|
121
138
|
} catch {
|
|
122
139
|
store.setContent([initialTables, initialValues]);
|
|
@@ -130,11 +147,18 @@ const createCustomPersister = (
|
|
|
130
147
|
async (getContent2, getChanges2) => {
|
|
131
148
|
if (getChanges2) {
|
|
132
149
|
const changes = getChanges2();
|
|
133
|
-
await loadLock(async () =>
|
|
150
|
+
await loadLock(async () =>
|
|
151
|
+
(isMergeableStore && isMergeable(changes)
|
|
152
|
+
? store.applyMergeableChanges
|
|
153
|
+
: store.applyChanges)(changes),
|
|
154
|
+
);
|
|
134
155
|
} else {
|
|
135
156
|
await loadLock(async () => {
|
|
136
157
|
try {
|
|
137
|
-
|
|
158
|
+
const content = getContent2?.() ?? (await getPersisted());
|
|
159
|
+
(isMergeableStore && isMergeable(content)
|
|
160
|
+
? store.setMergeableContent
|
|
161
|
+
: store.setContent)(content);
|
|
138
162
|
} catch (error) {
|
|
139
163
|
onIgnoredError?.(error);
|
|
140
164
|
}
|
|
@@ -174,9 +198,9 @@ const createCustomPersister = (
|
|
|
174
198
|
startAutoSave: async () => {
|
|
175
199
|
await persister.stopAutoSave().save();
|
|
176
200
|
listenerId = store.addDidFinishTransactionListener(() => {
|
|
177
|
-
const
|
|
178
|
-
if (
|
|
179
|
-
persister.save(() =>
|
|
201
|
+
const changes = getChanges();
|
|
202
|
+
if (hasChanges(changes)) {
|
|
203
|
+
persister.save(() => changes);
|
|
180
204
|
}
|
|
181
205
|
});
|
|
182
206
|
return persister;
|
|
@@ -214,7 +238,7 @@ const createFilePersister = (store, filePath, onIgnoredError) => {
|
|
|
214
238
|
addPersisterListener,
|
|
215
239
|
delPersisterListener,
|
|
216
240
|
onIgnoredError,
|
|
217
|
-
|
|
241
|
+
true,
|
|
218
242
|
['getFilePath', filePath],
|
|
219
243
|
);
|
|
220
244
|
};
|
|
@@ -51,15 +51,34 @@ const mapNew = (entries) => new Map(entries);
|
|
|
51
51
|
const mapGet = (map, key) => map?.get(key);
|
|
52
52
|
const mapSet = (map, key, value) =>
|
|
53
53
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
54
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
54
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
55
55
|
if (!collHas(map, key)) {
|
|
56
56
|
mapSet(map, key, getDefaultValue());
|
|
57
|
+
} else {
|
|
58
|
+
hadExistingValue?.(mapGet(map, key));
|
|
57
59
|
}
|
|
58
60
|
return mapGet(map, key);
|
|
59
61
|
};
|
|
60
62
|
|
|
61
63
|
const scheduleRunning = mapNew();
|
|
62
64
|
const scheduleActions = mapNew();
|
|
65
|
+
const isMergeable = (contentOrChanges) => isString(contentOrChanges?.[0]);
|
|
66
|
+
const getStoreFunctions = (supportsMergeableStore, store) =>
|
|
67
|
+
!supportsMergeableStore || isUndefined(store.getMergeableContent)
|
|
68
|
+
? [
|
|
69
|
+
0,
|
|
70
|
+
store.getContent,
|
|
71
|
+
store.getTransactionChanges,
|
|
72
|
+
([changedTables, changedValues]) =>
|
|
73
|
+
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
74
|
+
]
|
|
75
|
+
: [
|
|
76
|
+
1,
|
|
77
|
+
store.getMergeableContent,
|
|
78
|
+
store.getTransactionMergeableChanges,
|
|
79
|
+
([, [[, changedTables], [, changedValues]]]) =>
|
|
80
|
+
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
81
|
+
];
|
|
63
82
|
const createCustomPersister = (
|
|
64
83
|
store,
|
|
65
84
|
getPersisted,
|
|
@@ -80,10 +99,8 @@ const createCustomPersister = (
|
|
|
80
99
|
let listeningHandle;
|
|
81
100
|
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
82
101
|
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
83
|
-
const getContent =
|
|
84
|
-
(supportsMergeableStore
|
|
85
|
-
store.getContent;
|
|
86
|
-
const getChanges = store.getTransactionChanges;
|
|
102
|
+
const [isMergeableStore, getContent, getChanges, hasChanges] =
|
|
103
|
+
getStoreFunctions(supportsMergeableStore, store);
|
|
87
104
|
const run = async () => {
|
|
88
105
|
/* istanbul ignore else */
|
|
89
106
|
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
@@ -120,8 +137,8 @@ const createCustomPersister = (
|
|
|
120
137
|
await loadLock(async () => {
|
|
121
138
|
try {
|
|
122
139
|
const content = await getPersisted();
|
|
123
|
-
(
|
|
124
|
-
? store.
|
|
140
|
+
(isMergeableStore && isMergeable(content)
|
|
141
|
+
? store.setMergeableContent
|
|
125
142
|
: store.setContent)(content);
|
|
126
143
|
} catch {
|
|
127
144
|
store.setContent([initialTables, initialValues]);
|
|
@@ -135,11 +152,18 @@ const createCustomPersister = (
|
|
|
135
152
|
async (getContent2, getChanges2) => {
|
|
136
153
|
if (getChanges2) {
|
|
137
154
|
const changes = getChanges2();
|
|
138
|
-
await loadLock(async () =>
|
|
155
|
+
await loadLock(async () =>
|
|
156
|
+
(isMergeableStore && isMergeable(changes)
|
|
157
|
+
? store.applyMergeableChanges
|
|
158
|
+
: store.applyChanges)(changes),
|
|
159
|
+
);
|
|
139
160
|
} else {
|
|
140
161
|
await loadLock(async () => {
|
|
141
162
|
try {
|
|
142
|
-
|
|
163
|
+
const content = getContent2?.() ?? (await getPersisted());
|
|
164
|
+
(isMergeableStore && isMergeable(content)
|
|
165
|
+
? store.setMergeableContent
|
|
166
|
+
: store.setContent)(content);
|
|
143
167
|
} catch (error) {
|
|
144
168
|
onIgnoredError?.(error);
|
|
145
169
|
}
|
|
@@ -179,9 +203,9 @@ const createCustomPersister = (
|
|
|
179
203
|
startAutoSave: async () => {
|
|
180
204
|
await persister.stopAutoSave().save();
|
|
181
205
|
listenerId = store.addDidFinishTransactionListener(() => {
|
|
182
|
-
const
|
|
183
|
-
if (
|
|
184
|
-
persister.save(() =>
|
|
206
|
+
const changes = getChanges();
|
|
207
|
+
if (hasChanges(changes)) {
|
|
208
|
+
persister.save(() => changes);
|
|
185
209
|
}
|
|
186
210
|
});
|
|
187
211
|
return persister;
|