tinybase 5.0.0-beta.1 → 5.0.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/mergeable-store.cjs +1 -0
- package/lib/cjs/mergeable-store.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-partykit-client.cjs +1 -1
- package/lib/cjs/persisters/persister-partykit-client.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-partykit-server.cjs +1 -1
- package/lib/cjs/persisters/persister-partykit-server.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/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/ui-react-dom.cjs +1 -1
- package/lib/cjs/ui-react-dom.cjs.gz +0 -0
- package/lib/cjs-es6/mergeable-store.cjs +1 -0
- package/lib/cjs-es6/mergeable-store.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-partykit-client.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-partykit-client.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-partykit-server.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-partykit-server.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/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/cjs-es6/ui-react-dom.cjs +1 -1
- package/lib/cjs-es6/ui-react-dom.cjs.gz +0 -0
- package/lib/debug/mergeable-store.js +1863 -0
- package/lib/debug/persisters/persister-automerge.js +54 -53
- package/lib/debug/persisters/persister-browser.js +28 -18
- package/lib/debug/persisters/persister-cr-sqlite-wasm.js +80 -57
- package/lib/debug/persisters/persister-electric-sql.js +80 -57
- package/lib/debug/persisters/persister-expo-sqlite-next.js +80 -57
- package/lib/debug/persisters/persister-expo-sqlite.js +80 -57
- package/lib/debug/persisters/persister-file.js +27 -18
- package/lib/debug/persisters/persister-indexed-db.js +34 -23
- package/lib/debug/persisters/persister-partykit-client.js +26 -23
- package/lib/debug/persisters/persister-partykit-server.js +11 -21
- package/lib/debug/persisters/persister-remote.js +28 -18
- package/lib/debug/persisters/persister-sqlite-wasm.js +80 -57
- package/lib/debug/persisters/persister-sqlite3.js +80 -57
- package/lib/debug/persisters/persister-yjs.js +50 -48
- package/lib/debug/persisters.js +27 -18
- package/lib/debug/queries.js +2 -2
- package/lib/debug/store.js +63 -71
- package/lib/debug/tinybase.js +354 -90
- package/lib/debug/tools.js +13 -15
- package/lib/debug/ui-react-dom.js +115 -119
- package/lib/es6/mergeable-store.js +1 -0
- package/lib/es6/mergeable-store.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-partykit-client.js +1 -1
- package/lib/es6/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/es6/persisters/persister-partykit-server.js +1 -1
- package/lib/es6/persisters/persister-partykit-server.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/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/es6/ui-react-dom.js +1 -1
- package/lib/es6/ui-react-dom.js.gz +0 -0
- package/lib/mergeable-store.js +1 -0
- package/lib/mergeable-store.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-partykit-client.js +1 -1
- package/lib/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/persisters/persister-partykit-server.js +1 -1
- package/lib/persisters/persister-partykit-server.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/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 +79 -0
- package/lib/types/persisters/persister-automerge.d.ts +8 -7
- package/lib/types/persisters/persister-browser.d.ts +2 -0
- package/lib/types/persisters/persister-cr-sqlite-wasm.d.ts +1 -0
- package/lib/types/persisters/persister-electric-sql.d.ts +1 -0
- package/lib/types/persisters/persister-expo-sqlite-next.d.ts +1 -0
- package/lib/types/persisters/persister-expo-sqlite.d.ts +1 -0
- package/lib/types/persisters/persister-file.d.ts +1 -0
- package/lib/types/persisters/persister-indexed-db.d.ts +1 -0
- package/lib/types/persisters/persister-partykit-client.d.ts +1 -0
- package/lib/types/persisters/persister-partykit-server.d.ts +12 -8
- package/lib/types/persisters/persister-remote.d.ts +1 -0
- package/lib/types/persisters/persister-sqlite-wasm.d.ts +1 -0
- package/lib/types/persisters/persister-sqlite3.d.ts +1 -0
- package/lib/types/persisters/persister-yjs.d.ts +1 -0
- package/lib/types/persisters.d.ts +50 -30
- package/lib/types/store.d.ts +241 -186
- package/lib/types/tinybase.d.ts +1 -0
- package/lib/types/tools.d.ts +2 -2
- package/lib/types/ui-react.d.ts +1 -0
- package/lib/types/with-schemas/internal/store.d.ts +4 -0
- package/lib/types/with-schemas/mergeable-store.d.ts +112 -0
- package/lib/types/with-schemas/persisters/persister-automerge.d.ts +8 -7
- package/lib/types/with-schemas/persisters/persister-browser.d.ts +2 -0
- package/lib/types/with-schemas/persisters/persister-cr-sqlite-wasm.d.ts +1 -0
- package/lib/types/with-schemas/persisters/persister-electric-sql.d.ts +1 -0
- package/lib/types/with-schemas/persisters/persister-expo-sqlite-next.d.ts +1 -0
- package/lib/types/with-schemas/persisters/persister-expo-sqlite.d.ts +1 -0
- package/lib/types/with-schemas/persisters/persister-file.d.ts +1 -0
- package/lib/types/with-schemas/persisters/persister-indexed-db.d.ts +1 -0
- package/lib/types/with-schemas/persisters/persister-partykit-client.d.ts +1 -0
- package/lib/types/with-schemas/persisters/persister-partykit-server.d.ts +15 -11
- package/lib/types/with-schemas/persisters/persister-remote.d.ts +1 -0
- package/lib/types/with-schemas/persisters/persister-sqlite-wasm.d.ts +1 -0
- package/lib/types/with-schemas/persisters/persister-sqlite3.d.ts +1 -0
- package/lib/types/with-schemas/persisters/persister-yjs.d.ts +1 -0
- package/lib/types/with-schemas/persisters.d.ts +81 -45
- package/lib/types/with-schemas/store.d.ts +364 -273
- package/lib/types/with-schemas/tinybase.d.ts +1 -0
- package/lib/types/with-schemas/tools.d.ts +2 -2
- package/lib/ui-react-dom.js +1 -1
- package/lib/ui-react-dom.js.gz +0 -0
- package/lib/umd/mergeable-store.js +1 -0
- package/lib/umd/mergeable-store.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-partykit-client.js +1 -1
- package/lib/umd/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/umd/persisters/persister-partykit-server.js +1 -1
- package/lib/umd/persisters/persister-partykit-server.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/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/ui-react-dom.js +1 -1
- package/lib/umd/ui-react-dom.js.gz +0 -0
- package/lib/umd-es6/mergeable-store.js +1 -0
- package/lib/umd-es6/mergeable-store.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-partykit-client.js +1 -1
- package/lib/umd-es6/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-partykit-server.js +1 -1
- package/lib/umd-es6/persisters/persister-partykit-server.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/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/lib/umd-es6/ui-react-dom.js +1 -1
- package/lib/umd-es6/ui-react-dom.js.gz +0 -0
- package/package.json +39 -35
- package/readme.md +2 -2
|
@@ -1,8 +1,12 @@
|
|
|
1
|
+
const getTypeOf = (thing) => typeof thing;
|
|
1
2
|
const TINYBASE = 'tinybase';
|
|
3
|
+
const EMPTY_STRING = '';
|
|
4
|
+
const STRING = getTypeOf(EMPTY_STRING);
|
|
2
5
|
|
|
3
6
|
const isUndefined = (thing) => thing == void 0;
|
|
4
7
|
const ifNotUndefined = (value, then, otherwise) =>
|
|
5
8
|
isUndefined(value) ? otherwise?.() : then(value);
|
|
9
|
+
const isString = (thing) => getTypeOf(thing) == STRING;
|
|
6
10
|
const size = (arrayOrString) => arrayOrString.length;
|
|
7
11
|
|
|
8
12
|
const arrayMap = (array, cb) => array.map(cb);
|
|
@@ -25,12 +29,12 @@ const isObject = (obj) =>
|
|
|
25
29
|
() => true,
|
|
26
30
|
);
|
|
27
31
|
const objGet = (obj, id) => ifNotUndefined(obj, (obj2) => obj2[id]);
|
|
28
|
-
const objHas = (obj, id) =>
|
|
32
|
+
const objHas = (obj, id) => id in obj;
|
|
29
33
|
const objDel = (obj, id) => {
|
|
30
34
|
delete obj[id];
|
|
31
35
|
return obj;
|
|
32
36
|
};
|
|
33
|
-
const
|
|
37
|
+
const objToArray = (obj, cb) =>
|
|
34
38
|
arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
|
|
35
39
|
const objSize = (obj) => size(objIds(obj));
|
|
36
40
|
const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
|
|
@@ -64,6 +68,7 @@ const createCustomPersister = (
|
|
|
64
68
|
addPersisterListener,
|
|
65
69
|
delPersisterListener,
|
|
66
70
|
onIgnoredError,
|
|
71
|
+
supportsMergeableStore,
|
|
67
72
|
[getThing, thing] = [],
|
|
68
73
|
scheduleId = [],
|
|
69
74
|
) => {
|
|
@@ -76,6 +81,10 @@ const createCustomPersister = (
|
|
|
76
81
|
let listeningHandle;
|
|
77
82
|
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
78
83
|
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
84
|
+
const getContent =
|
|
85
|
+
(supportsMergeableStore ? store.getMergeableContent : null) ??
|
|
86
|
+
store.getContent;
|
|
87
|
+
const getChanges = store.getTransactionChanges;
|
|
79
88
|
const run = async () => {
|
|
80
89
|
/* istanbul ignore else */
|
|
81
90
|
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
@@ -111,7 +120,10 @@ const createCustomPersister = (
|
|
|
111
120
|
load: async (initialTables, initialValues) =>
|
|
112
121
|
await loadLock(async () => {
|
|
113
122
|
try {
|
|
114
|
-
|
|
123
|
+
const content = await getPersisted();
|
|
124
|
+
(supportsMergeableStore && isString(content[0])
|
|
125
|
+
? store.applyMergeableChanges
|
|
126
|
+
: store.setContent)(content);
|
|
115
127
|
} catch {
|
|
116
128
|
store.setContent([initialTables, initialValues]);
|
|
117
129
|
}
|
|
@@ -121,16 +133,14 @@ const createCustomPersister = (
|
|
|
121
133
|
await persister.load(initialTables, initialValues);
|
|
122
134
|
listening = 1;
|
|
123
135
|
listeningHandle = addPersisterListener(
|
|
124
|
-
async (
|
|
125
|
-
if (
|
|
126
|
-
const
|
|
127
|
-
await loadLock(async () =>
|
|
128
|
-
store.setTransactionChanges(transactionChanges),
|
|
129
|
-
);
|
|
136
|
+
async (getContent2, getChanges2) => {
|
|
137
|
+
if (getChanges2) {
|
|
138
|
+
const changes = getChanges2();
|
|
139
|
+
await loadLock(async () => store.applyChanges(changes));
|
|
130
140
|
} else {
|
|
131
141
|
await loadLock(async () => {
|
|
132
142
|
try {
|
|
133
|
-
store.setContent(
|
|
143
|
+
store.setContent(getContent2?.() ?? (await getPersisted()));
|
|
134
144
|
} catch (error) {
|
|
135
145
|
onIgnoredError?.(error);
|
|
136
146
|
}
|
|
@@ -148,7 +158,7 @@ const createCustomPersister = (
|
|
|
148
158
|
}
|
|
149
159
|
return persister;
|
|
150
160
|
},
|
|
151
|
-
save: async (
|
|
161
|
+
save: async (getChanges2) => {
|
|
152
162
|
/* istanbul ignore else */
|
|
153
163
|
if (loadSave != 1) {
|
|
154
164
|
loadSave = 2;
|
|
@@ -157,7 +167,7 @@ const createCustomPersister = (
|
|
|
157
167
|
}
|
|
158
168
|
await persister.schedule(async () => {
|
|
159
169
|
try {
|
|
160
|
-
await setPersisted(
|
|
170
|
+
await setPersisted(getContent, getChanges2);
|
|
161
171
|
} catch (error) {
|
|
162
172
|
/* istanbul ignore next */
|
|
163
173
|
onIgnoredError?.(error);
|
|
@@ -169,14 +179,12 @@ const createCustomPersister = (
|
|
|
169
179
|
},
|
|
170
180
|
startAutoSave: async () => {
|
|
171
181
|
await persister.stopAutoSave().save();
|
|
172
|
-
listenerId = store.addDidFinishTransactionListener(
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
},
|
|
179
|
-
);
|
|
182
|
+
listenerId = store.addDidFinishTransactionListener(() => {
|
|
183
|
+
const [tableChanges, valueChanges] = getChanges();
|
|
184
|
+
if (!objIsEmpty(tableChanges) || !objIsEmpty(valueChanges)) {
|
|
185
|
+
persister.save(() => [tableChanges, valueChanges]);
|
|
186
|
+
}
|
|
187
|
+
});
|
|
180
188
|
return persister;
|
|
181
189
|
},
|
|
182
190
|
stopAutoSave: () => {
|
|
@@ -208,56 +216,51 @@ const getDocContent = (doc, docObjName) => [
|
|
|
208
216
|
doc[docObjName].t,
|
|
209
217
|
doc[docObjName].v,
|
|
210
218
|
];
|
|
211
|
-
const
|
|
212
|
-
doc,
|
|
213
|
-
docObjName,
|
|
214
|
-
getContent,
|
|
215
|
-
getTransactionChanges,
|
|
216
|
-
) => {
|
|
219
|
+
const applyChangesToDoc = (doc, docObjName, getContent, getChanges) => {
|
|
217
220
|
ensureDocContent(doc, docObjName);
|
|
218
221
|
const [docTables, docValues] = getDocContent(doc, docObjName);
|
|
219
|
-
const
|
|
220
|
-
|
|
222
|
+
const changesDidFail = () => {
|
|
223
|
+
changesFailed = 1;
|
|
221
224
|
};
|
|
222
|
-
let
|
|
223
|
-
ifNotUndefined(
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
225
|
+
let changesFailed = 1;
|
|
226
|
+
ifNotUndefined(getChanges?.(), ([cellChanges, valueChanges]) => {
|
|
227
|
+
changesFailed = 0;
|
|
228
|
+
objToArray(cellChanges, (table, tableId) =>
|
|
229
|
+
changesFailed
|
|
227
230
|
? 0
|
|
228
231
|
: isUndefined(table)
|
|
229
232
|
? objDel(docTables, tableId)
|
|
230
233
|
: ifNotUndefined(
|
|
231
234
|
docTables[tableId],
|
|
232
235
|
(docTable) =>
|
|
233
|
-
|
|
234
|
-
|
|
236
|
+
objToArray(table, (row, rowId) =>
|
|
237
|
+
changesFailed
|
|
235
238
|
? 0
|
|
236
239
|
: isUndefined(row)
|
|
237
240
|
? objDel(docTable, rowId)
|
|
238
241
|
: ifNotUndefined(
|
|
239
242
|
objGet(docTable, rowId),
|
|
240
243
|
(docRow) =>
|
|
241
|
-
|
|
244
|
+
objToArray(row, (cell, cellId) =>
|
|
242
245
|
isUndefined(cell)
|
|
243
246
|
? objDel(docRow, cellId)
|
|
244
247
|
: (docRow[cellId] = cell),
|
|
245
248
|
),
|
|
246
|
-
|
|
249
|
+
changesDidFail,
|
|
247
250
|
),
|
|
248
251
|
),
|
|
249
|
-
|
|
252
|
+
changesDidFail,
|
|
250
253
|
),
|
|
251
254
|
);
|
|
252
|
-
|
|
253
|
-
|
|
255
|
+
objToArray(valueChanges, (value, valueId) =>
|
|
256
|
+
changesFailed
|
|
254
257
|
? 0
|
|
255
258
|
: isUndefined(value)
|
|
256
259
|
? objDel(docValues, valueId)
|
|
257
260
|
: (docValues[valueId] = value),
|
|
258
261
|
);
|
|
259
262
|
});
|
|
260
|
-
if (
|
|
263
|
+
if (changesFailed) {
|
|
261
264
|
const [tables, values] = getContent();
|
|
262
265
|
docObjMatch(docTables, void 0, tables, (_, tableId, table) =>
|
|
263
266
|
docObjMatch(docTables, tableId, table, (docTable, rowId, row) =>
|
|
@@ -281,12 +284,12 @@ const docObjMatch = (docObjOrParent, idInParent, obj, set) => {
|
|
|
281
284
|
? docObjOrParent
|
|
282
285
|
: objEnsure(docObjOrParent, idInParent, () => ({}));
|
|
283
286
|
let changed;
|
|
284
|
-
|
|
287
|
+
objToArray(obj, (value, id) => {
|
|
285
288
|
if (set(docObj, id, value)) {
|
|
286
289
|
changed = 1;
|
|
287
290
|
}
|
|
288
291
|
});
|
|
289
|
-
|
|
292
|
+
objToArray(docObj, (_, id) => {
|
|
290
293
|
if (!objHas(obj, id)) {
|
|
291
294
|
objDel(docObj, id);
|
|
292
295
|
changed = 1;
|
|
@@ -304,18 +307,15 @@ const createAutomergePersister = (
|
|
|
304
307
|
onIgnoredError,
|
|
305
308
|
) => {
|
|
306
309
|
docHandle.change((doc) => (doc[docObjName] = {}));
|
|
307
|
-
const getPersisted = async () =>
|
|
308
|
-
|
|
309
|
-
|
|
310
|
+
const getPersisted = async () => {
|
|
311
|
+
const doc = await docHandle.doc();
|
|
312
|
+
return objSize(doc[docObjName]) == 2
|
|
313
|
+
? getDocContent(doc, docObjName)
|
|
310
314
|
: void 0;
|
|
311
|
-
|
|
315
|
+
};
|
|
316
|
+
const setPersisted = async (getContent, getChanges) =>
|
|
312
317
|
docHandle.change((doc) =>
|
|
313
|
-
|
|
314
|
-
doc,
|
|
315
|
-
docObjName,
|
|
316
|
-
getContent,
|
|
317
|
-
getTransactionChanges,
|
|
318
|
-
),
|
|
318
|
+
applyChangesToDoc(doc, docObjName, getContent, getChanges),
|
|
319
319
|
);
|
|
320
320
|
const addPersisterListener = (listener) => {
|
|
321
321
|
const observer = ({doc}) => listener(() => getDocContent(doc, docObjName));
|
|
@@ -332,6 +332,7 @@ const createAutomergePersister = (
|
|
|
332
332
|
addPersisterListener,
|
|
333
333
|
delPersisterListener,
|
|
334
334
|
onIgnoredError,
|
|
335
|
+
false,
|
|
335
336
|
['getDocHandle', docHandle],
|
|
336
337
|
);
|
|
337
338
|
};
|
|
@@ -1,7 +1,12 @@
|
|
|
1
|
+
const getTypeOf = (thing) => typeof thing;
|
|
2
|
+
const EMPTY_STRING = '';
|
|
3
|
+
const STRING = getTypeOf(EMPTY_STRING);
|
|
4
|
+
|
|
1
5
|
const isInstanceOf = (thing, cls) => thing instanceof cls;
|
|
2
6
|
const isUndefined = (thing) => thing == void 0;
|
|
3
7
|
const ifNotUndefined = (value, then, otherwise) =>
|
|
4
8
|
isUndefined(value) ? otherwise?.() : then(value);
|
|
9
|
+
const isString = (thing) => getTypeOf(thing) == STRING;
|
|
5
10
|
const size = (arrayOrString) => arrayOrString.length;
|
|
6
11
|
|
|
7
12
|
const arrayPush = (array, ...values) => array.push(...values);
|
|
@@ -53,6 +58,7 @@ const createCustomPersister = (
|
|
|
53
58
|
addPersisterListener,
|
|
54
59
|
delPersisterListener,
|
|
55
60
|
onIgnoredError,
|
|
61
|
+
supportsMergeableStore,
|
|
56
62
|
[getThing, thing] = [],
|
|
57
63
|
scheduleId = [],
|
|
58
64
|
) => {
|
|
@@ -65,6 +71,10 @@ const createCustomPersister = (
|
|
|
65
71
|
let listeningHandle;
|
|
66
72
|
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
67
73
|
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
74
|
+
const getContent =
|
|
75
|
+
(supportsMergeableStore ? store.getMergeableContent : null) ??
|
|
76
|
+
store.getContent;
|
|
77
|
+
const getChanges = store.getTransactionChanges;
|
|
68
78
|
const run = async () => {
|
|
69
79
|
/* istanbul ignore else */
|
|
70
80
|
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
@@ -100,7 +110,10 @@ const createCustomPersister = (
|
|
|
100
110
|
load: async (initialTables, initialValues) =>
|
|
101
111
|
await loadLock(async () => {
|
|
102
112
|
try {
|
|
103
|
-
|
|
113
|
+
const content = await getPersisted();
|
|
114
|
+
(supportsMergeableStore && isString(content[0])
|
|
115
|
+
? store.applyMergeableChanges
|
|
116
|
+
: store.setContent)(content);
|
|
104
117
|
} catch {
|
|
105
118
|
store.setContent([initialTables, initialValues]);
|
|
106
119
|
}
|
|
@@ -110,16 +123,14 @@ const createCustomPersister = (
|
|
|
110
123
|
await persister.load(initialTables, initialValues);
|
|
111
124
|
listening = 1;
|
|
112
125
|
listeningHandle = addPersisterListener(
|
|
113
|
-
async (
|
|
114
|
-
if (
|
|
115
|
-
const
|
|
116
|
-
await loadLock(async () =>
|
|
117
|
-
store.setTransactionChanges(transactionChanges),
|
|
118
|
-
);
|
|
126
|
+
async (getContent2, getChanges2) => {
|
|
127
|
+
if (getChanges2) {
|
|
128
|
+
const changes = getChanges2();
|
|
129
|
+
await loadLock(async () => store.applyChanges(changes));
|
|
119
130
|
} else {
|
|
120
131
|
await loadLock(async () => {
|
|
121
132
|
try {
|
|
122
|
-
store.setContent(
|
|
133
|
+
store.setContent(getContent2?.() ?? (await getPersisted()));
|
|
123
134
|
} catch (error) {
|
|
124
135
|
onIgnoredError?.(error);
|
|
125
136
|
}
|
|
@@ -137,7 +148,7 @@ const createCustomPersister = (
|
|
|
137
148
|
}
|
|
138
149
|
return persister;
|
|
139
150
|
},
|
|
140
|
-
save: async (
|
|
151
|
+
save: async (getChanges2) => {
|
|
141
152
|
/* istanbul ignore else */
|
|
142
153
|
if (loadSave != 1) {
|
|
143
154
|
loadSave = 2;
|
|
@@ -146,7 +157,7 @@ const createCustomPersister = (
|
|
|
146
157
|
}
|
|
147
158
|
await persister.schedule(async () => {
|
|
148
159
|
try {
|
|
149
|
-
await setPersisted(
|
|
160
|
+
await setPersisted(getContent, getChanges2);
|
|
150
161
|
} catch (error) {
|
|
151
162
|
/* istanbul ignore next */
|
|
152
163
|
onIgnoredError?.(error);
|
|
@@ -158,14 +169,12 @@ const createCustomPersister = (
|
|
|
158
169
|
},
|
|
159
170
|
startAutoSave: async () => {
|
|
160
171
|
await persister.stopAutoSave().save();
|
|
161
|
-
listenerId = store.addDidFinishTransactionListener(
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
},
|
|
168
|
-
);
|
|
172
|
+
listenerId = store.addDidFinishTransactionListener(() => {
|
|
173
|
+
const [tableChanges, valueChanges] = getChanges();
|
|
174
|
+
if (!objIsEmpty(tableChanges) || !objIsEmpty(valueChanges)) {
|
|
175
|
+
persister.save(() => [tableChanges, valueChanges]);
|
|
176
|
+
}
|
|
177
|
+
});
|
|
169
178
|
return persister;
|
|
170
179
|
},
|
|
171
180
|
stopAutoSave: () => {
|
|
@@ -217,6 +226,7 @@ const createStoragePersister = (
|
|
|
217
226
|
addPersisterListener,
|
|
218
227
|
delPersisterListener,
|
|
219
228
|
onIgnoredError,
|
|
229
|
+
false,
|
|
220
230
|
['getStorageName', storageName],
|
|
221
231
|
);
|
|
222
232
|
};
|
|
@@ -55,13 +55,12 @@ const isObject = (obj) =>
|
|
|
55
55
|
);
|
|
56
56
|
const objNew = (entries = []) => object.fromEntries(entries);
|
|
57
57
|
const objMerge = (...objs) => object.assign({}, ...objs);
|
|
58
|
-
const
|
|
59
|
-
const objHas = (obj, id) => !isUndefined(objGet(obj, id));
|
|
58
|
+
const objHas = (obj, id) => id in obj;
|
|
60
59
|
const objDel = (obj, id) => {
|
|
61
60
|
delete obj[id];
|
|
62
61
|
return obj;
|
|
63
62
|
};
|
|
64
|
-
const
|
|
63
|
+
const objToArray = (obj, cb) =>
|
|
65
64
|
arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
|
|
66
65
|
const objValues = (obj) => object.values(obj);
|
|
67
66
|
const objSize = (obj) => size(objIds(obj));
|
|
@@ -83,7 +82,7 @@ const mapEnsure = (map, key, getDefaultValue) => {
|
|
|
83
82
|
return mapGet(map, key);
|
|
84
83
|
};
|
|
85
84
|
const mapMatch = (map, obj, set, del = mapSet) => {
|
|
86
|
-
|
|
85
|
+
objToArray(obj, (value, id) => set(map, id, value));
|
|
87
86
|
mapForEach(map, (id) => (objHas(obj, id) ? 0 : del(map, id)));
|
|
88
87
|
return map;
|
|
89
88
|
};
|
|
@@ -99,7 +98,12 @@ const setAdd = (set, value) => set?.add(value);
|
|
|
99
98
|
const SELECT_STAR_FROM = SELECT + '*FROM';
|
|
100
99
|
const FROM_PRAGMA_TABLE = 'FROM pragma_table_';
|
|
101
100
|
const WHERE = 'WHERE';
|
|
102
|
-
const getCommandFunctions = (
|
|
101
|
+
const getCommandFunctions = (
|
|
102
|
+
cmd,
|
|
103
|
+
managedTableNames,
|
|
104
|
+
onIgnoredError,
|
|
105
|
+
useOnConflict,
|
|
106
|
+
) => {
|
|
103
107
|
const schemaMap = mapNew();
|
|
104
108
|
const canSelect = (tableName, rowIdColumnName) =>
|
|
105
109
|
!isUndefined(mapGet(mapGet(schemaMap, tableName), rowIdColumnName));
|
|
@@ -112,7 +116,7 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
|
|
|
112
116
|
await cmd(
|
|
113
117
|
'SELECT name ' +
|
|
114
118
|
FROM_PRAGMA_TABLE +
|
|
115
|
-
`list WHERE schema='main'AND
|
|
119
|
+
`list WHERE schema='main'AND(type='table'OR type='view')AND name IN(` +
|
|
116
120
|
getPlaceholders(managedTableNames) +
|
|
117
121
|
`)ORDER BY name`,
|
|
118
122
|
managedTableNames,
|
|
@@ -167,16 +171,18 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
|
|
|
167
171
|
const saveTable = async (
|
|
168
172
|
tableName,
|
|
169
173
|
rowIdColumnName,
|
|
170
|
-
|
|
174
|
+
content,
|
|
171
175
|
deleteEmptyColumns,
|
|
172
176
|
deleteEmptyTable,
|
|
173
177
|
partial = false,
|
|
174
178
|
) => {
|
|
175
|
-
const
|
|
176
|
-
|
|
177
|
-
arrayMap(objIds(
|
|
179
|
+
const tableCellOrValueIds = setNew();
|
|
180
|
+
objToArray(content ?? {}, (contentRow) =>
|
|
181
|
+
arrayMap(objIds(contentRow ?? {}), (cellOrValueId) =>
|
|
182
|
+
setAdd(tableCellOrValueIds, cellOrValueId),
|
|
183
|
+
),
|
|
178
184
|
);
|
|
179
|
-
const tableColumnNames = collValues(
|
|
185
|
+
const tableColumnNames = collValues(tableCellOrValueIds);
|
|
180
186
|
if (
|
|
181
187
|
!partial &&
|
|
182
188
|
deleteEmptyTable &&
|
|
@@ -234,11 +240,11 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
|
|
|
234
240
|
]);
|
|
235
241
|
}
|
|
236
242
|
if (partial) {
|
|
237
|
-
if (isUndefined(
|
|
243
|
+
if (isUndefined(content)) {
|
|
238
244
|
await cmd('DELETE FROM' + escapeId(tableName) + 'WHERE 1');
|
|
239
245
|
} else {
|
|
240
246
|
await promiseAll(
|
|
241
|
-
|
|
247
|
+
objToArray(content, async (row, rowId) => {
|
|
242
248
|
if (isUndefined(row)) {
|
|
243
249
|
await cmd(
|
|
244
250
|
'DELETE FROM' +
|
|
@@ -249,10 +255,14 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
|
|
|
249
255
|
[rowId],
|
|
250
256
|
);
|
|
251
257
|
} else if (!arrayIsEmpty(tableColumnNames)) {
|
|
252
|
-
await upsert(
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
258
|
+
await upsert(
|
|
259
|
+
cmd,
|
|
260
|
+
tableName,
|
|
261
|
+
rowIdColumnName,
|
|
262
|
+
objIds(row),
|
|
263
|
+
[rowId, ...objValues(row)],
|
|
264
|
+
useOnConflict,
|
|
265
|
+
);
|
|
256
266
|
}
|
|
257
267
|
}),
|
|
258
268
|
);
|
|
@@ -265,7 +275,7 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
|
|
|
265
275
|
);
|
|
266
276
|
const args = [];
|
|
267
277
|
const deleteRowIds = [];
|
|
268
|
-
|
|
278
|
+
objToArray(content ?? {}, (row, rowId) => {
|
|
269
279
|
arrayPush(
|
|
270
280
|
args,
|
|
271
281
|
rowId,
|
|
@@ -314,9 +324,12 @@ const upsert = async (
|
|
|
314
324
|
rowIdColumnName,
|
|
315
325
|
changingColumnNames,
|
|
316
326
|
args,
|
|
327
|
+
useOnConflict = true,
|
|
317
328
|
) =>
|
|
318
329
|
await cmd(
|
|
319
|
-
'INSERT
|
|
330
|
+
'INSERT ' +
|
|
331
|
+
(useOnConflict ? EMPTY_STRING : 'OR REPLACE ') +
|
|
332
|
+
'INTO' +
|
|
320
333
|
escapeId(tableName) +
|
|
321
334
|
'(' +
|
|
322
335
|
escapeId(rowIdColumnName) +
|
|
@@ -334,18 +347,20 @@ const upsert = async (
|
|
|
334
347
|
),
|
|
335
348
|
1,
|
|
336
349
|
) +
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
350
|
+
(useOnConflict
|
|
351
|
+
? 'ON CONFLICT(' +
|
|
352
|
+
escapeId(rowIdColumnName) +
|
|
353
|
+
')DO UPDATE SET' +
|
|
354
|
+
arrayJoin(
|
|
355
|
+
arrayMap(
|
|
356
|
+
changingColumnNames,
|
|
357
|
+
(columnName) =>
|
|
358
|
+
escapeId(columnName) + '=excluded.' + escapeId(columnName),
|
|
359
|
+
),
|
|
360
|
+
COMMA,
|
|
361
|
+
)
|
|
362
|
+
: EMPTY_STRING),
|
|
363
|
+
arrayMap(args, (arg) => arg ?? null),
|
|
349
364
|
);
|
|
350
365
|
const getPlaceholders = (array) =>
|
|
351
366
|
arrayJoin(
|
|
@@ -368,6 +383,7 @@ const createCustomPersister = (
|
|
|
368
383
|
addPersisterListener,
|
|
369
384
|
delPersisterListener,
|
|
370
385
|
onIgnoredError,
|
|
386
|
+
supportsMergeableStore,
|
|
371
387
|
[getThing, thing] = [],
|
|
372
388
|
scheduleId = [],
|
|
373
389
|
) => {
|
|
@@ -380,6 +396,10 @@ const createCustomPersister = (
|
|
|
380
396
|
let listeningHandle;
|
|
381
397
|
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
382
398
|
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
399
|
+
const getContent =
|
|
400
|
+
(supportsMergeableStore ? store.getMergeableContent : null) ??
|
|
401
|
+
store.getContent;
|
|
402
|
+
const getChanges = store.getTransactionChanges;
|
|
383
403
|
const run = async () => {
|
|
384
404
|
/* istanbul ignore else */
|
|
385
405
|
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
@@ -415,7 +435,10 @@ const createCustomPersister = (
|
|
|
415
435
|
load: async (initialTables, initialValues) =>
|
|
416
436
|
await loadLock(async () => {
|
|
417
437
|
try {
|
|
418
|
-
|
|
438
|
+
const content = await getPersisted();
|
|
439
|
+
(supportsMergeableStore && isString(content[0])
|
|
440
|
+
? store.applyMergeableChanges
|
|
441
|
+
: store.setContent)(content);
|
|
419
442
|
} catch {
|
|
420
443
|
store.setContent([initialTables, initialValues]);
|
|
421
444
|
}
|
|
@@ -425,16 +448,14 @@ const createCustomPersister = (
|
|
|
425
448
|
await persister.load(initialTables, initialValues);
|
|
426
449
|
listening = 1;
|
|
427
450
|
listeningHandle = addPersisterListener(
|
|
428
|
-
async (
|
|
429
|
-
if (
|
|
430
|
-
const
|
|
431
|
-
await loadLock(async () =>
|
|
432
|
-
store.setTransactionChanges(transactionChanges),
|
|
433
|
-
);
|
|
451
|
+
async (getContent2, getChanges2) => {
|
|
452
|
+
if (getChanges2) {
|
|
453
|
+
const changes = getChanges2();
|
|
454
|
+
await loadLock(async () => store.applyChanges(changes));
|
|
434
455
|
} else {
|
|
435
456
|
await loadLock(async () => {
|
|
436
457
|
try {
|
|
437
|
-
store.setContent(
|
|
458
|
+
store.setContent(getContent2?.() ?? (await getPersisted()));
|
|
438
459
|
} catch (error) {
|
|
439
460
|
onIgnoredError?.(error);
|
|
440
461
|
}
|
|
@@ -452,7 +473,7 @@ const createCustomPersister = (
|
|
|
452
473
|
}
|
|
453
474
|
return persister;
|
|
454
475
|
},
|
|
455
|
-
save: async (
|
|
476
|
+
save: async (getChanges2) => {
|
|
456
477
|
/* istanbul ignore else */
|
|
457
478
|
if (loadSave != 1) {
|
|
458
479
|
loadSave = 2;
|
|
@@ -461,7 +482,7 @@ const createCustomPersister = (
|
|
|
461
482
|
}
|
|
462
483
|
await persister.schedule(async () => {
|
|
463
484
|
try {
|
|
464
|
-
await setPersisted(
|
|
485
|
+
await setPersisted(getContent, getChanges2);
|
|
465
486
|
} catch (error) {
|
|
466
487
|
/* istanbul ignore next */
|
|
467
488
|
onIgnoredError?.(error);
|
|
@@ -473,14 +494,12 @@ const createCustomPersister = (
|
|
|
473
494
|
},
|
|
474
495
|
startAutoSave: async () => {
|
|
475
496
|
await persister.stopAutoSave().save();
|
|
476
|
-
listenerId = store.addDidFinishTransactionListener(
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
},
|
|
483
|
-
);
|
|
497
|
+
listenerId = store.addDidFinishTransactionListener(() => {
|
|
498
|
+
const [tableChanges, valueChanges] = getChanges();
|
|
499
|
+
if (!objIsEmpty(tableChanges) || !objIsEmpty(valueChanges)) {
|
|
500
|
+
persister.save(() => [tableChanges, valueChanges]);
|
|
501
|
+
}
|
|
502
|
+
});
|
|
484
503
|
return persister;
|
|
485
504
|
},
|
|
486
505
|
stopAutoSave: () => {
|
|
@@ -546,6 +565,7 @@ const createJsonSqlitePersister = (
|
|
|
546
565
|
addPersisterListener,
|
|
547
566
|
delPersisterListener,
|
|
548
567
|
onIgnoredError,
|
|
568
|
+
false,
|
|
549
569
|
[getThing, db],
|
|
550
570
|
db,
|
|
551
571
|
);
|
|
@@ -566,9 +586,10 @@ const createTabularSqlitePersister = (
|
|
|
566
586
|
managedTableNames,
|
|
567
587
|
db,
|
|
568
588
|
getThing,
|
|
589
|
+
useOnConflict,
|
|
569
590
|
) => {
|
|
570
591
|
const [refreshSchema, loadTable, saveTable, transaction] =
|
|
571
|
-
getCommandFunctions(cmd, managedTableNames, onIgnoredError);
|
|
592
|
+
getCommandFunctions(cmd, managedTableNames, onIgnoredError, useOnConflict);
|
|
572
593
|
const saveTables = async (tables, partial) =>
|
|
573
594
|
await promiseAll(
|
|
574
595
|
mapMap(
|
|
@@ -577,12 +598,11 @@ const createTabularSqlitePersister = (
|
|
|
577
598
|
[tableName, rowIdColumnName, deleteEmptyColumns, deleteEmptyTable],
|
|
578
599
|
tableId,
|
|
579
600
|
) => {
|
|
580
|
-
|
|
581
|
-
if (!partial || table !== void 0) {
|
|
601
|
+
if (!partial || objHas(tables, tableId)) {
|
|
582
602
|
await saveTable(
|
|
583
603
|
tableName,
|
|
584
604
|
rowIdColumnName,
|
|
585
|
-
|
|
605
|
+
tables[tableId],
|
|
586
606
|
deleteEmptyColumns,
|
|
587
607
|
deleteEmptyTable,
|
|
588
608
|
partial,
|
|
@@ -632,11 +652,11 @@ const createTabularSqlitePersister = (
|
|
|
632
652
|
? [tables, values]
|
|
633
653
|
: void 0;
|
|
634
654
|
});
|
|
635
|
-
const setPersisted = async (getContent,
|
|
655
|
+
const setPersisted = async (getContent, getChanges) =>
|
|
636
656
|
await transaction(async () => {
|
|
637
657
|
await refreshSchema();
|
|
638
|
-
if (!isUndefined(
|
|
639
|
-
const [tableChanges, valueChanges] =
|
|
658
|
+
if (!isUndefined(getChanges)) {
|
|
659
|
+
const [tableChanges, valueChanges] = getChanges();
|
|
640
660
|
await saveTables(tableChanges, true);
|
|
641
661
|
await saveValues(valueChanges, true);
|
|
642
662
|
} else {
|
|
@@ -652,6 +672,7 @@ const createTabularSqlitePersister = (
|
|
|
652
672
|
addPersisterListener,
|
|
653
673
|
delPersisterListener,
|
|
654
674
|
onIgnoredError,
|
|
675
|
+
false,
|
|
655
676
|
[getThing, db],
|
|
656
677
|
db,
|
|
657
678
|
);
|
|
@@ -689,7 +710,7 @@ const getDefaultedTabularConfigMap = (
|
|
|
689
710
|
filter,
|
|
690
711
|
) => {
|
|
691
712
|
const configMap = mapNew();
|
|
692
|
-
|
|
713
|
+
objToArray(configsObj, (configObj, id) => {
|
|
693
714
|
const defaultedConfig = slice(
|
|
694
715
|
objValues(
|
|
695
716
|
objMerge(
|
|
@@ -764,6 +785,7 @@ const createSqlitePersister = (
|
|
|
764
785
|
onIgnoredError,
|
|
765
786
|
db,
|
|
766
787
|
getThing = 'getDb',
|
|
788
|
+
useOnConflict,
|
|
767
789
|
) => {
|
|
768
790
|
let dataVersion;
|
|
769
791
|
let schemaVersion;
|
|
@@ -826,6 +848,7 @@ const createSqlitePersister = (
|
|
|
826
848
|
collValues(managedTableNamesSet),
|
|
827
849
|
db,
|
|
828
850
|
getThing,
|
|
851
|
+
useOnConflict,
|
|
829
852
|
);
|
|
830
853
|
};
|
|
831
854
|
|