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
|
@@ -56,13 +56,12 @@ const isObject = (obj) =>
|
|
|
56
56
|
);
|
|
57
57
|
const objNew = (entries = []) => object.fromEntries(entries);
|
|
58
58
|
const objMerge = (...objs) => object.assign({}, ...objs);
|
|
59
|
-
const
|
|
60
|
-
const objHas = (obj, id) => !isUndefined(objGet(obj, id));
|
|
59
|
+
const objHas = (obj, id) => id in obj;
|
|
61
60
|
const objDel = (obj, id) => {
|
|
62
61
|
delete obj[id];
|
|
63
62
|
return obj;
|
|
64
63
|
};
|
|
65
|
-
const
|
|
64
|
+
const objToArray = (obj, cb) =>
|
|
66
65
|
arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
|
|
67
66
|
const objValues = (obj) => object.values(obj);
|
|
68
67
|
const objSize = (obj) => size(objIds(obj));
|
|
@@ -84,7 +83,7 @@ const mapEnsure = (map, key, getDefaultValue) => {
|
|
|
84
83
|
return mapGet(map, key);
|
|
85
84
|
};
|
|
86
85
|
const mapMatch = (map, obj, set, del = mapSet) => {
|
|
87
|
-
|
|
86
|
+
objToArray(obj, (value, id) => set(map, id, value));
|
|
88
87
|
mapForEach(map, (id) => (objHas(obj, id) ? 0 : del(map, id)));
|
|
89
88
|
return map;
|
|
90
89
|
};
|
|
@@ -100,7 +99,12 @@ const setAdd = (set, value) => set?.add(value);
|
|
|
100
99
|
const SELECT_STAR_FROM = SELECT + '*FROM';
|
|
101
100
|
const FROM_PRAGMA_TABLE = 'FROM pragma_table_';
|
|
102
101
|
const WHERE = 'WHERE';
|
|
103
|
-
const getCommandFunctions = (
|
|
102
|
+
const getCommandFunctions = (
|
|
103
|
+
cmd,
|
|
104
|
+
managedTableNames,
|
|
105
|
+
onIgnoredError,
|
|
106
|
+
useOnConflict,
|
|
107
|
+
) => {
|
|
104
108
|
const schemaMap = mapNew();
|
|
105
109
|
const canSelect = (tableName, rowIdColumnName) =>
|
|
106
110
|
!isUndefined(mapGet(mapGet(schemaMap, tableName), rowIdColumnName));
|
|
@@ -113,7 +117,7 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
|
|
|
113
117
|
await cmd(
|
|
114
118
|
'SELECT name ' +
|
|
115
119
|
FROM_PRAGMA_TABLE +
|
|
116
|
-
`list WHERE schema='main'AND
|
|
120
|
+
`list WHERE schema='main'AND(type='table'OR type='view')AND name IN(` +
|
|
117
121
|
getPlaceholders(managedTableNames) +
|
|
118
122
|
`)ORDER BY name`,
|
|
119
123
|
managedTableNames,
|
|
@@ -168,16 +172,18 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
|
|
|
168
172
|
const saveTable = async (
|
|
169
173
|
tableName,
|
|
170
174
|
rowIdColumnName,
|
|
171
|
-
|
|
175
|
+
content,
|
|
172
176
|
deleteEmptyColumns,
|
|
173
177
|
deleteEmptyTable,
|
|
174
178
|
partial = false,
|
|
175
179
|
) => {
|
|
176
|
-
const
|
|
177
|
-
|
|
178
|
-
arrayMap(objIds(
|
|
180
|
+
const tableCellOrValueIds = setNew();
|
|
181
|
+
objToArray(content ?? {}, (contentRow) =>
|
|
182
|
+
arrayMap(objIds(contentRow ?? {}), (cellOrValueId) =>
|
|
183
|
+
setAdd(tableCellOrValueIds, cellOrValueId),
|
|
184
|
+
),
|
|
179
185
|
);
|
|
180
|
-
const tableColumnNames = collValues(
|
|
186
|
+
const tableColumnNames = collValues(tableCellOrValueIds);
|
|
181
187
|
if (
|
|
182
188
|
!partial &&
|
|
183
189
|
deleteEmptyTable &&
|
|
@@ -235,11 +241,11 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
|
|
|
235
241
|
]);
|
|
236
242
|
}
|
|
237
243
|
if (partial) {
|
|
238
|
-
if (isUndefined(
|
|
244
|
+
if (isUndefined(content)) {
|
|
239
245
|
await cmd('DELETE FROM' + escapeId(tableName) + 'WHERE 1');
|
|
240
246
|
} else {
|
|
241
247
|
await promiseAll(
|
|
242
|
-
|
|
248
|
+
objToArray(content, async (row, rowId) => {
|
|
243
249
|
if (isUndefined(row)) {
|
|
244
250
|
await cmd(
|
|
245
251
|
'DELETE FROM' +
|
|
@@ -250,10 +256,14 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
|
|
|
250
256
|
[rowId],
|
|
251
257
|
);
|
|
252
258
|
} else if (!arrayIsEmpty(tableColumnNames)) {
|
|
253
|
-
await upsert(
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
259
|
+
await upsert(
|
|
260
|
+
cmd,
|
|
261
|
+
tableName,
|
|
262
|
+
rowIdColumnName,
|
|
263
|
+
objIds(row),
|
|
264
|
+
[rowId, ...objValues(row)],
|
|
265
|
+
useOnConflict,
|
|
266
|
+
);
|
|
257
267
|
}
|
|
258
268
|
}),
|
|
259
269
|
);
|
|
@@ -266,7 +276,7 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
|
|
|
266
276
|
);
|
|
267
277
|
const args = [];
|
|
268
278
|
const deleteRowIds = [];
|
|
269
|
-
|
|
279
|
+
objToArray(content ?? {}, (row, rowId) => {
|
|
270
280
|
arrayPush(
|
|
271
281
|
args,
|
|
272
282
|
rowId,
|
|
@@ -315,9 +325,12 @@ const upsert = async (
|
|
|
315
325
|
rowIdColumnName,
|
|
316
326
|
changingColumnNames,
|
|
317
327
|
args,
|
|
328
|
+
useOnConflict = true,
|
|
318
329
|
) =>
|
|
319
330
|
await cmd(
|
|
320
|
-
'INSERT
|
|
331
|
+
'INSERT ' +
|
|
332
|
+
(useOnConflict ? EMPTY_STRING : 'OR REPLACE ') +
|
|
333
|
+
'INTO' +
|
|
321
334
|
escapeId(tableName) +
|
|
322
335
|
'(' +
|
|
323
336
|
escapeId(rowIdColumnName) +
|
|
@@ -335,18 +348,20 @@ const upsert = async (
|
|
|
335
348
|
),
|
|
336
349
|
1,
|
|
337
350
|
) +
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
351
|
+
(useOnConflict
|
|
352
|
+
? 'ON CONFLICT(' +
|
|
353
|
+
escapeId(rowIdColumnName) +
|
|
354
|
+
')DO UPDATE SET' +
|
|
355
|
+
arrayJoin(
|
|
356
|
+
arrayMap(
|
|
357
|
+
changingColumnNames,
|
|
358
|
+
(columnName) =>
|
|
359
|
+
escapeId(columnName) + '=excluded.' + escapeId(columnName),
|
|
360
|
+
),
|
|
361
|
+
COMMA,
|
|
362
|
+
)
|
|
363
|
+
: EMPTY_STRING),
|
|
364
|
+
arrayMap(args, (arg) => arg ?? null),
|
|
350
365
|
);
|
|
351
366
|
const getPlaceholders = (array) =>
|
|
352
367
|
arrayJoin(
|
|
@@ -369,6 +384,7 @@ const createCustomPersister = (
|
|
|
369
384
|
addPersisterListener,
|
|
370
385
|
delPersisterListener,
|
|
371
386
|
onIgnoredError,
|
|
387
|
+
supportsMergeableStore,
|
|
372
388
|
[getThing, thing] = [],
|
|
373
389
|
scheduleId = [],
|
|
374
390
|
) => {
|
|
@@ -381,6 +397,10 @@ const createCustomPersister = (
|
|
|
381
397
|
let listeningHandle;
|
|
382
398
|
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
383
399
|
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
400
|
+
const getContent =
|
|
401
|
+
(supportsMergeableStore ? store.getMergeableContent : null) ??
|
|
402
|
+
store.getContent;
|
|
403
|
+
const getChanges = store.getTransactionChanges;
|
|
384
404
|
const run = async () => {
|
|
385
405
|
/* istanbul ignore else */
|
|
386
406
|
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
@@ -416,7 +436,10 @@ const createCustomPersister = (
|
|
|
416
436
|
load: async (initialTables, initialValues) =>
|
|
417
437
|
await loadLock(async () => {
|
|
418
438
|
try {
|
|
419
|
-
|
|
439
|
+
const content = await getPersisted();
|
|
440
|
+
(supportsMergeableStore && isString(content[0])
|
|
441
|
+
? store.applyMergeableChanges
|
|
442
|
+
: store.setContent)(content);
|
|
420
443
|
} catch {
|
|
421
444
|
store.setContent([initialTables, initialValues]);
|
|
422
445
|
}
|
|
@@ -426,16 +449,14 @@ const createCustomPersister = (
|
|
|
426
449
|
await persister.load(initialTables, initialValues);
|
|
427
450
|
listening = 1;
|
|
428
451
|
listeningHandle = addPersisterListener(
|
|
429
|
-
async (
|
|
430
|
-
if (
|
|
431
|
-
const
|
|
432
|
-
await loadLock(async () =>
|
|
433
|
-
store.setTransactionChanges(transactionChanges),
|
|
434
|
-
);
|
|
452
|
+
async (getContent2, getChanges2) => {
|
|
453
|
+
if (getChanges2) {
|
|
454
|
+
const changes = getChanges2();
|
|
455
|
+
await loadLock(async () => store.applyChanges(changes));
|
|
435
456
|
} else {
|
|
436
457
|
await loadLock(async () => {
|
|
437
458
|
try {
|
|
438
|
-
store.setContent(
|
|
459
|
+
store.setContent(getContent2?.() ?? (await getPersisted()));
|
|
439
460
|
} catch (error) {
|
|
440
461
|
onIgnoredError?.(error);
|
|
441
462
|
}
|
|
@@ -453,7 +474,7 @@ const createCustomPersister = (
|
|
|
453
474
|
}
|
|
454
475
|
return persister;
|
|
455
476
|
},
|
|
456
|
-
save: async (
|
|
477
|
+
save: async (getChanges2) => {
|
|
457
478
|
/* istanbul ignore else */
|
|
458
479
|
if (loadSave != 1) {
|
|
459
480
|
loadSave = 2;
|
|
@@ -462,7 +483,7 @@ const createCustomPersister = (
|
|
|
462
483
|
}
|
|
463
484
|
await persister.schedule(async () => {
|
|
464
485
|
try {
|
|
465
|
-
await setPersisted(
|
|
486
|
+
await setPersisted(getContent, getChanges2);
|
|
466
487
|
} catch (error) {
|
|
467
488
|
/* istanbul ignore next */
|
|
468
489
|
onIgnoredError?.(error);
|
|
@@ -474,14 +495,12 @@ const createCustomPersister = (
|
|
|
474
495
|
},
|
|
475
496
|
startAutoSave: async () => {
|
|
476
497
|
await persister.stopAutoSave().save();
|
|
477
|
-
listenerId = store.addDidFinishTransactionListener(
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
},
|
|
484
|
-
);
|
|
498
|
+
listenerId = store.addDidFinishTransactionListener(() => {
|
|
499
|
+
const [tableChanges, valueChanges] = getChanges();
|
|
500
|
+
if (!objIsEmpty(tableChanges) || !objIsEmpty(valueChanges)) {
|
|
501
|
+
persister.save(() => [tableChanges, valueChanges]);
|
|
502
|
+
}
|
|
503
|
+
});
|
|
485
504
|
return persister;
|
|
486
505
|
},
|
|
487
506
|
stopAutoSave: () => {
|
|
@@ -547,6 +566,7 @@ const createJsonSqlitePersister = (
|
|
|
547
566
|
addPersisterListener,
|
|
548
567
|
delPersisterListener,
|
|
549
568
|
onIgnoredError,
|
|
569
|
+
false,
|
|
550
570
|
[getThing, db],
|
|
551
571
|
db,
|
|
552
572
|
);
|
|
@@ -567,9 +587,10 @@ const createTabularSqlitePersister = (
|
|
|
567
587
|
managedTableNames,
|
|
568
588
|
db,
|
|
569
589
|
getThing,
|
|
590
|
+
useOnConflict,
|
|
570
591
|
) => {
|
|
571
592
|
const [refreshSchema, loadTable, saveTable, transaction] =
|
|
572
|
-
getCommandFunctions(cmd, managedTableNames, onIgnoredError);
|
|
593
|
+
getCommandFunctions(cmd, managedTableNames, onIgnoredError, useOnConflict);
|
|
573
594
|
const saveTables = async (tables, partial) =>
|
|
574
595
|
await promiseAll(
|
|
575
596
|
mapMap(
|
|
@@ -578,12 +599,11 @@ const createTabularSqlitePersister = (
|
|
|
578
599
|
[tableName, rowIdColumnName, deleteEmptyColumns, deleteEmptyTable],
|
|
579
600
|
tableId,
|
|
580
601
|
) => {
|
|
581
|
-
|
|
582
|
-
if (!partial || table !== void 0) {
|
|
602
|
+
if (!partial || objHas(tables, tableId)) {
|
|
583
603
|
await saveTable(
|
|
584
604
|
tableName,
|
|
585
605
|
rowIdColumnName,
|
|
586
|
-
|
|
606
|
+
tables[tableId],
|
|
587
607
|
deleteEmptyColumns,
|
|
588
608
|
deleteEmptyTable,
|
|
589
609
|
partial,
|
|
@@ -633,11 +653,11 @@ const createTabularSqlitePersister = (
|
|
|
633
653
|
? [tables, values]
|
|
634
654
|
: void 0;
|
|
635
655
|
});
|
|
636
|
-
const setPersisted = async (getContent,
|
|
656
|
+
const setPersisted = async (getContent, getChanges) =>
|
|
637
657
|
await transaction(async () => {
|
|
638
658
|
await refreshSchema();
|
|
639
|
-
if (!isUndefined(
|
|
640
|
-
const [tableChanges, valueChanges] =
|
|
659
|
+
if (!isUndefined(getChanges)) {
|
|
660
|
+
const [tableChanges, valueChanges] = getChanges();
|
|
641
661
|
await saveTables(tableChanges, true);
|
|
642
662
|
await saveValues(valueChanges, true);
|
|
643
663
|
} else {
|
|
@@ -653,6 +673,7 @@ const createTabularSqlitePersister = (
|
|
|
653
673
|
addPersisterListener,
|
|
654
674
|
delPersisterListener,
|
|
655
675
|
onIgnoredError,
|
|
676
|
+
false,
|
|
656
677
|
[getThing, db],
|
|
657
678
|
db,
|
|
658
679
|
);
|
|
@@ -690,7 +711,7 @@ const getDefaultedTabularConfigMap = (
|
|
|
690
711
|
filter,
|
|
691
712
|
) => {
|
|
692
713
|
const configMap = mapNew();
|
|
693
|
-
|
|
714
|
+
objToArray(configsObj, (configObj, id) => {
|
|
694
715
|
const defaultedConfig = slice(
|
|
695
716
|
objValues(
|
|
696
717
|
objMerge(
|
|
@@ -765,6 +786,7 @@ const createSqlitePersister = (
|
|
|
765
786
|
onIgnoredError,
|
|
766
787
|
db,
|
|
767
788
|
getThing = 'getDb',
|
|
789
|
+
useOnConflict,
|
|
768
790
|
) => {
|
|
769
791
|
let dataVersion;
|
|
770
792
|
let schemaVersion;
|
|
@@ -827,6 +849,7 @@ const createSqlitePersister = (
|
|
|
827
849
|
collValues(managedTableNamesSet),
|
|
828
850
|
db,
|
|
829
851
|
getThing,
|
|
852
|
+
useOnConflict,
|
|
830
853
|
);
|
|
831
854
|
};
|
|
832
855
|
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import {Map as Map$1} from 'yjs';
|
|
2
2
|
|
|
3
|
+
const getTypeOf = (thing) => typeof thing;
|
|
3
4
|
const TINYBASE = 'tinybase';
|
|
5
|
+
const EMPTY_STRING = '';
|
|
6
|
+
const STRING = getTypeOf(EMPTY_STRING);
|
|
4
7
|
const T = 't';
|
|
5
8
|
const V = 'v';
|
|
6
9
|
|
|
7
10
|
const isUndefined = (thing) => thing == void 0;
|
|
8
11
|
const ifNotUndefined = (value, then, otherwise) =>
|
|
9
12
|
isUndefined(value) ? otherwise?.() : then(value);
|
|
13
|
+
const isString = (thing) => getTypeOf(thing) == STRING;
|
|
10
14
|
const size = (arrayOrString) => arrayOrString.length;
|
|
11
15
|
|
|
12
16
|
const arrayForEach = (array, cb) => array.forEach(cb);
|
|
@@ -31,9 +35,8 @@ const isObject = (obj) =>
|
|
|
31
35
|
() => true,
|
|
32
36
|
);
|
|
33
37
|
const objNew = (entries = []) => object.fromEntries(entries);
|
|
34
|
-
const
|
|
35
|
-
const
|
|
36
|
-
const objMap = (obj, cb) =>
|
|
38
|
+
const objHas = (obj, id) => id in obj;
|
|
39
|
+
const objToArray = (obj, cb) =>
|
|
37
40
|
arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
|
|
38
41
|
const objSize = (obj) => size(objIds(obj));
|
|
39
42
|
const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
|
|
@@ -70,6 +73,7 @@ const createCustomPersister = (
|
|
|
70
73
|
addPersisterListener,
|
|
71
74
|
delPersisterListener,
|
|
72
75
|
onIgnoredError,
|
|
76
|
+
supportsMergeableStore,
|
|
73
77
|
[getThing, thing] = [],
|
|
74
78
|
scheduleId = [],
|
|
75
79
|
) => {
|
|
@@ -82,6 +86,10 @@ const createCustomPersister = (
|
|
|
82
86
|
let listeningHandle;
|
|
83
87
|
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
84
88
|
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
89
|
+
const getContent =
|
|
90
|
+
(supportsMergeableStore ? store.getMergeableContent : null) ??
|
|
91
|
+
store.getContent;
|
|
92
|
+
const getChanges = store.getTransactionChanges;
|
|
85
93
|
const run = async () => {
|
|
86
94
|
/* istanbul ignore else */
|
|
87
95
|
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
@@ -117,7 +125,10 @@ const createCustomPersister = (
|
|
|
117
125
|
load: async (initialTables, initialValues) =>
|
|
118
126
|
await loadLock(async () => {
|
|
119
127
|
try {
|
|
120
|
-
|
|
128
|
+
const content = await getPersisted();
|
|
129
|
+
(supportsMergeableStore && isString(content[0])
|
|
130
|
+
? store.applyMergeableChanges
|
|
131
|
+
: store.setContent)(content);
|
|
121
132
|
} catch {
|
|
122
133
|
store.setContent([initialTables, initialValues]);
|
|
123
134
|
}
|
|
@@ -127,16 +138,14 @@ const createCustomPersister = (
|
|
|
127
138
|
await persister.load(initialTables, initialValues);
|
|
128
139
|
listening = 1;
|
|
129
140
|
listeningHandle = addPersisterListener(
|
|
130
|
-
async (
|
|
131
|
-
if (
|
|
132
|
-
const
|
|
133
|
-
await loadLock(async () =>
|
|
134
|
-
store.setTransactionChanges(transactionChanges),
|
|
135
|
-
);
|
|
141
|
+
async (getContent2, getChanges2) => {
|
|
142
|
+
if (getChanges2) {
|
|
143
|
+
const changes = getChanges2();
|
|
144
|
+
await loadLock(async () => store.applyChanges(changes));
|
|
136
145
|
} else {
|
|
137
146
|
await loadLock(async () => {
|
|
138
147
|
try {
|
|
139
|
-
store.setContent(
|
|
148
|
+
store.setContent(getContent2?.() ?? (await getPersisted()));
|
|
140
149
|
} catch (error) {
|
|
141
150
|
onIgnoredError?.(error);
|
|
142
151
|
}
|
|
@@ -154,7 +163,7 @@ const createCustomPersister = (
|
|
|
154
163
|
}
|
|
155
164
|
return persister;
|
|
156
165
|
},
|
|
157
|
-
save: async (
|
|
166
|
+
save: async (getChanges2) => {
|
|
158
167
|
/* istanbul ignore else */
|
|
159
168
|
if (loadSave != 1) {
|
|
160
169
|
loadSave = 2;
|
|
@@ -163,7 +172,7 @@ const createCustomPersister = (
|
|
|
163
172
|
}
|
|
164
173
|
await persister.schedule(async () => {
|
|
165
174
|
try {
|
|
166
|
-
await setPersisted(
|
|
175
|
+
await setPersisted(getContent, getChanges2);
|
|
167
176
|
} catch (error) {
|
|
168
177
|
/* istanbul ignore next */
|
|
169
178
|
onIgnoredError?.(error);
|
|
@@ -175,14 +184,12 @@ const createCustomPersister = (
|
|
|
175
184
|
},
|
|
176
185
|
startAutoSave: async () => {
|
|
177
186
|
await persister.stopAutoSave().save();
|
|
178
|
-
listenerId = store.addDidFinishTransactionListener(
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
},
|
|
185
|
-
);
|
|
187
|
+
listenerId = store.addDidFinishTransactionListener(() => {
|
|
188
|
+
const [tableChanges, valueChanges] = getChanges();
|
|
189
|
+
if (!objIsEmpty(tableChanges) || !objIsEmpty(valueChanges)) {
|
|
190
|
+
persister.save(() => [tableChanges, valueChanges]);
|
|
191
|
+
}
|
|
192
|
+
});
|
|
186
193
|
return persister;
|
|
187
194
|
},
|
|
188
195
|
stopAutoSave: () => {
|
|
@@ -207,7 +214,7 @@ const createCustomPersister = (
|
|
|
207
214
|
|
|
208
215
|
const DELETE = 'delete';
|
|
209
216
|
const getYContent = (yContent) => [yContent.get(T), yContent.get(V)];
|
|
210
|
-
const
|
|
217
|
+
const getChangesFromYDoc = (yContent, events) => {
|
|
211
218
|
if (size(events) == 1 && arrayIsEmpty(events[0].path)) {
|
|
212
219
|
return [yContent.get(T).toJSON(), yContent.get(V).toJSON()];
|
|
213
220
|
}
|
|
@@ -257,58 +264,54 @@ const getTransactionChangesFromYDoc = (yContent, events) => {
|
|
|
257
264
|
);
|
|
258
265
|
return [tables, values];
|
|
259
266
|
};
|
|
260
|
-
const
|
|
261
|
-
yContent,
|
|
262
|
-
getContent,
|
|
263
|
-
getTransactionChanges,
|
|
264
|
-
) => {
|
|
267
|
+
const applyChangesToYDoc = (yContent, getContent, getChanges) => {
|
|
265
268
|
if (!yContent.size) {
|
|
266
269
|
yContent.set(T, new Map$1());
|
|
267
270
|
yContent.set(V, new Map$1());
|
|
268
271
|
}
|
|
269
272
|
const [yTables, yValues] = getYContent(yContent);
|
|
270
|
-
const
|
|
271
|
-
|
|
273
|
+
const changesDidFail = () => {
|
|
274
|
+
changesFailed = 1;
|
|
272
275
|
};
|
|
273
|
-
let
|
|
274
|
-
ifNotUndefined(
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
276
|
+
let changesFailed = 1;
|
|
277
|
+
ifNotUndefined(getChanges?.(), ([cellChanges, valueChanges]) => {
|
|
278
|
+
changesFailed = 0;
|
|
279
|
+
objToArray(cellChanges, (table, tableId) =>
|
|
280
|
+
changesFailed
|
|
278
281
|
? 0
|
|
279
282
|
: isUndefined(table)
|
|
280
283
|
? yTables.delete(tableId)
|
|
281
284
|
: ifNotUndefined(
|
|
282
285
|
yTables.get(tableId),
|
|
283
286
|
(yTable) =>
|
|
284
|
-
|
|
285
|
-
|
|
287
|
+
objToArray(table, (row, rowId) =>
|
|
288
|
+
changesFailed
|
|
286
289
|
? 0
|
|
287
290
|
: isUndefined(row)
|
|
288
291
|
? yTable.delete(rowId)
|
|
289
292
|
: ifNotUndefined(
|
|
290
293
|
yTable.get(rowId),
|
|
291
294
|
(yRow) =>
|
|
292
|
-
|
|
295
|
+
objToArray(row, (cell, cellId) =>
|
|
293
296
|
isUndefined(cell)
|
|
294
297
|
? yRow.delete(cellId)
|
|
295
298
|
: yRow.set(cellId, cell),
|
|
296
299
|
),
|
|
297
|
-
|
|
300
|
+
changesDidFail,
|
|
298
301
|
),
|
|
299
302
|
),
|
|
300
|
-
|
|
303
|
+
changesDidFail,
|
|
301
304
|
),
|
|
302
305
|
);
|
|
303
|
-
|
|
304
|
-
|
|
306
|
+
objToArray(valueChanges, (value, valueId) =>
|
|
307
|
+
changesFailed
|
|
305
308
|
? 0
|
|
306
309
|
: isUndefined(value)
|
|
307
310
|
? yValues.delete(valueId)
|
|
308
311
|
: yValues.set(valueId, value),
|
|
309
312
|
);
|
|
310
313
|
});
|
|
311
|
-
if (
|
|
314
|
+
if (changesFailed) {
|
|
312
315
|
const [tables, values] = getContent();
|
|
313
316
|
yMapMatch(yTables, void 0, tables, (_, tableId, table) =>
|
|
314
317
|
yMapMatch(yTables, tableId, table, (yTable, rowId, row) =>
|
|
@@ -332,7 +335,7 @@ const yMapMatch = (yMapOrParent, idInParent, obj, set) => {
|
|
|
332
335
|
? yMapOrParent
|
|
333
336
|
: yMapOrParent.get(idInParent) ?? yMapOrParent.set(idInParent, new Map$1());
|
|
334
337
|
let changed;
|
|
335
|
-
|
|
338
|
+
objToArray(obj, (value, id) => {
|
|
336
339
|
if (set(yMap, id, value)) {
|
|
337
340
|
changed = 1;
|
|
338
341
|
}
|
|
@@ -359,13 +362,11 @@ const createYjsPersister = (
|
|
|
359
362
|
yContent.size
|
|
360
363
|
? [yContent.get(T).toJSON(), yContent.get(V).toJSON()]
|
|
361
364
|
: void 0;
|
|
362
|
-
const setPersisted = async (getContent,
|
|
363
|
-
yDoc.transact(() =>
|
|
364
|
-
setTransactionChangesToYDoc(yContent, getContent, getTransactionChanges),
|
|
365
|
-
);
|
|
365
|
+
const setPersisted = async (getContent, getChanges) =>
|
|
366
|
+
yDoc.transact(() => applyChangesToYDoc(yContent, getContent, getChanges));
|
|
366
367
|
const addPersisterListener = (listener) => {
|
|
367
368
|
const observer = (events) =>
|
|
368
|
-
listener(void 0, () =>
|
|
369
|
+
listener(void 0, () => getChangesFromYDoc(yContent, events));
|
|
369
370
|
yContent.observeDeep(observer);
|
|
370
371
|
return observer;
|
|
371
372
|
};
|
|
@@ -379,6 +380,7 @@ const createYjsPersister = (
|
|
|
379
380
|
addPersisterListener,
|
|
380
381
|
delPersisterListener,
|
|
381
382
|
onIgnoredError,
|
|
383
|
+
false,
|
|
382
384
|
['getYDoc', yDoc],
|
|
383
385
|
);
|
|
384
386
|
};
|
package/lib/debug/persisters.js
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
|
+
const getTypeOf = (thing) => typeof thing;
|
|
2
|
+
const EMPTY_STRING = '';
|
|
3
|
+
const STRING = getTypeOf(EMPTY_STRING);
|
|
4
|
+
|
|
1
5
|
const isUndefined = (thing) => thing == void 0;
|
|
2
6
|
const ifNotUndefined = (value, then, otherwise) =>
|
|
3
7
|
isUndefined(value) ? otherwise?.() : then(value);
|
|
8
|
+
const isString = (thing) => getTypeOf(thing) == STRING;
|
|
4
9
|
const size = (arrayOrString) => arrayOrString.length;
|
|
5
10
|
|
|
6
11
|
const arrayPush = (array, ...values) => array.push(...values);
|
|
@@ -46,6 +51,7 @@ const createCustomPersister = (
|
|
|
46
51
|
addPersisterListener,
|
|
47
52
|
delPersisterListener,
|
|
48
53
|
onIgnoredError,
|
|
54
|
+
supportsMergeableStore,
|
|
49
55
|
[getThing, thing] = [],
|
|
50
56
|
scheduleId = [],
|
|
51
57
|
) => {
|
|
@@ -58,6 +64,10 @@ const createCustomPersister = (
|
|
|
58
64
|
let listeningHandle;
|
|
59
65
|
mapEnsure(scheduleRunning, scheduleId, () => 0);
|
|
60
66
|
mapEnsure(scheduleActions, scheduleId, () => []);
|
|
67
|
+
const getContent =
|
|
68
|
+
(supportsMergeableStore ? store.getMergeableContent : null) ??
|
|
69
|
+
store.getContent;
|
|
70
|
+
const getChanges = store.getTransactionChanges;
|
|
61
71
|
const run = async () => {
|
|
62
72
|
/* istanbul ignore else */
|
|
63
73
|
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
@@ -93,7 +103,10 @@ const createCustomPersister = (
|
|
|
93
103
|
load: async (initialTables, initialValues) =>
|
|
94
104
|
await loadLock(async () => {
|
|
95
105
|
try {
|
|
96
|
-
|
|
106
|
+
const content = await getPersisted();
|
|
107
|
+
(supportsMergeableStore && isString(content[0])
|
|
108
|
+
? store.applyMergeableChanges
|
|
109
|
+
: store.setContent)(content);
|
|
97
110
|
} catch {
|
|
98
111
|
store.setContent([initialTables, initialValues]);
|
|
99
112
|
}
|
|
@@ -103,16 +116,14 @@ const createCustomPersister = (
|
|
|
103
116
|
await persister.load(initialTables, initialValues);
|
|
104
117
|
listening = 1;
|
|
105
118
|
listeningHandle = addPersisterListener(
|
|
106
|
-
async (
|
|
107
|
-
if (
|
|
108
|
-
const
|
|
109
|
-
await loadLock(async () =>
|
|
110
|
-
store.setTransactionChanges(transactionChanges),
|
|
111
|
-
);
|
|
119
|
+
async (getContent2, getChanges2) => {
|
|
120
|
+
if (getChanges2) {
|
|
121
|
+
const changes = getChanges2();
|
|
122
|
+
await loadLock(async () => store.applyChanges(changes));
|
|
112
123
|
} else {
|
|
113
124
|
await loadLock(async () => {
|
|
114
125
|
try {
|
|
115
|
-
store.setContent(
|
|
126
|
+
store.setContent(getContent2?.() ?? (await getPersisted()));
|
|
116
127
|
} catch (error) {
|
|
117
128
|
onIgnoredError?.(error);
|
|
118
129
|
}
|
|
@@ -130,7 +141,7 @@ const createCustomPersister = (
|
|
|
130
141
|
}
|
|
131
142
|
return persister;
|
|
132
143
|
},
|
|
133
|
-
save: async (
|
|
144
|
+
save: async (getChanges2) => {
|
|
134
145
|
/* istanbul ignore else */
|
|
135
146
|
if (loadSave != 1) {
|
|
136
147
|
loadSave = 2;
|
|
@@ -139,7 +150,7 @@ const createCustomPersister = (
|
|
|
139
150
|
}
|
|
140
151
|
await persister.schedule(async () => {
|
|
141
152
|
try {
|
|
142
|
-
await setPersisted(
|
|
153
|
+
await setPersisted(getContent, getChanges2);
|
|
143
154
|
} catch (error) {
|
|
144
155
|
/* istanbul ignore next */
|
|
145
156
|
onIgnoredError?.(error);
|
|
@@ -151,14 +162,12 @@ const createCustomPersister = (
|
|
|
151
162
|
},
|
|
152
163
|
startAutoSave: async () => {
|
|
153
164
|
await persister.stopAutoSave().save();
|
|
154
|
-
listenerId = store.addDidFinishTransactionListener(
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
},
|
|
161
|
-
);
|
|
165
|
+
listenerId = store.addDidFinishTransactionListener(() => {
|
|
166
|
+
const [tableChanges, valueChanges] = getChanges();
|
|
167
|
+
if (!objIsEmpty(tableChanges) || !objIsEmpty(valueChanges)) {
|
|
168
|
+
persister.save(() => [tableChanges, valueChanges]);
|
|
169
|
+
}
|
|
170
|
+
});
|
|
162
171
|
return persister;
|
|
163
172
|
},
|
|
164
173
|
stopAutoSave: () => {
|
package/lib/debug/queries.js
CHANGED
|
@@ -48,7 +48,7 @@ const arrayPush = (array, ...values) => array.push(...values);
|
|
|
48
48
|
const object = Object;
|
|
49
49
|
const objEntries = object.entries;
|
|
50
50
|
const objFreeze = object.freeze;
|
|
51
|
-
const
|
|
51
|
+
const objToArray = (obj, cb) =>
|
|
52
52
|
arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
|
|
53
53
|
|
|
54
54
|
const collSize = (coll) => coll?.size ?? 0;
|
|
@@ -777,7 +777,7 @@ const createQueries = getCreateFunction((store) => {
|
|
|
777
777
|
destroy,
|
|
778
778
|
getListenerStats,
|
|
779
779
|
};
|
|
780
|
-
|
|
780
|
+
objToArray(
|
|
781
781
|
{
|
|
782
782
|
[TABLE]: [1, 1],
|
|
783
783
|
[TABLE + CELL_IDS]: [0, 1],
|