tinybase 5.0.0-beta.10 → 5.0.0-beta.11
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 -1
- 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-libsql.cjs +1 -1
- 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-powersync.cjs +1 -1
- package/lib/cjs/persisters/persister-powersync.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/synchronizers/synchronizer-local.cjs +1 -1
- package/lib/cjs/synchronizers/synchronizer-local.cjs.gz +0 -0
- package/lib/cjs/synchronizers/synchronizer-ws-client.cjs +1 -1
- package/lib/cjs/synchronizers/synchronizer-ws-client.cjs.gz +0 -0
- package/lib/cjs/synchronizers/synchronizer-ws-server.cjs +1 -1
- package/lib/cjs/synchronizers/synchronizer-ws-server.cjs.gz +0 -0
- package/lib/cjs/synchronizers.cjs +1 -1
- package/lib/cjs/synchronizers.cjs.gz +0 -0
- package/lib/cjs/tinybase.cjs +1 -1
- package/lib/cjs/tinybase.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/mergeable-store.cjs +1 -1
- 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-libsql.cjs +1 -1
- 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-powersync.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-powersync.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/synchronizers/synchronizer-local.cjs +1 -1
- package/lib/cjs-es6/synchronizers/synchronizer-local.cjs.gz +0 -0
- package/lib/cjs-es6/synchronizers/synchronizer-ws-client.cjs +1 -1
- package/lib/cjs-es6/synchronizers/synchronizer-ws-client.cjs.gz +0 -0
- package/lib/cjs-es6/synchronizers/synchronizer-ws-server.cjs +1 -1
- package/lib/cjs-es6/synchronizers/synchronizer-ws-server.cjs.gz +0 -0
- package/lib/cjs-es6/synchronizers.cjs +1 -1
- package/lib/cjs-es6/synchronizers.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/ui-react-dom-debug.cjs +1 -1
- package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
- package/lib/debug/mergeable-store.js +1 -1
- package/lib/debug/persisters/persister-automerge.js +113 -101
- package/lib/debug/persisters/persister-browser.js +113 -97
- package/lib/debug/persisters/persister-cr-sqlite-wasm.js +113 -102
- package/lib/debug/persisters/persister-electric-sql.js +113 -102
- package/lib/debug/persisters/persister-expo-sqlite-next.js +113 -102
- package/lib/debug/persisters/persister-expo-sqlite.js +113 -102
- package/lib/debug/persisters/persister-file.js +108 -96
- package/lib/debug/persisters/persister-indexed-db.js +108 -96
- package/lib/debug/persisters/persister-libsql.js +113 -102
- package/lib/debug/persisters/persister-partykit-client.js +112 -100
- package/lib/debug/persisters/persister-powersync.js +113 -102
- package/lib/debug/persisters/persister-remote.js +108 -96
- package/lib/debug/persisters/persister-sqlite-wasm.js +113 -102
- package/lib/debug/persisters/persister-sqlite3.js +113 -102
- package/lib/debug/persisters/persister-yjs.js +113 -101
- package/lib/debug/persisters.js +107 -95
- package/lib/debug/store.js +1 -1
- package/lib/debug/synchronizers/synchronizer-local.js +114 -102
- package/lib/debug/synchronizers/synchronizer-ws-client.js +113 -101
- package/lib/debug/synchronizers/synchronizer-ws-server.js +151 -6
- package/lib/debug/synchronizers.js +113 -101
- package/lib/debug/tinybase.js +114 -102
- package/lib/debug/ui-react-dom.js +114 -98
- package/lib/es6/mergeable-store.js +1 -1
- 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-libsql.js +1 -1
- 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-powersync.js +1 -1
- package/lib/es6/persisters/persister-powersync.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/synchronizers/synchronizer-local.js +1 -1
- package/lib/es6/synchronizers/synchronizer-local.js.gz +0 -0
- package/lib/es6/synchronizers/synchronizer-ws-client.js +1 -1
- package/lib/es6/synchronizers/synchronizer-ws-client.js.gz +0 -0
- package/lib/es6/synchronizers/synchronizer-ws-server.js +1 -1
- package/lib/es6/synchronizers/synchronizer-ws-server.js.gz +0 -0
- package/lib/es6/synchronizers.js +1 -1
- package/lib/es6/synchronizers.js.gz +0 -0
- package/lib/es6/tinybase.js +1 -1
- package/lib/es6/tinybase.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/mergeable-store.js +1 -1
- 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-libsql.js +1 -1
- 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-powersync.js +1 -1
- package/lib/persisters/persister-powersync.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/synchronizers/synchronizer-local.js +1 -1
- package/lib/synchronizers/synchronizer-local.js.gz +0 -0
- package/lib/synchronizers/synchronizer-ws-client.js +1 -1
- package/lib/synchronizers/synchronizer-ws-client.js.gz +0 -0
- package/lib/synchronizers/synchronizer-ws-server.js +1 -1
- package/lib/synchronizers/synchronizer-ws-server.js.gz +0 -0
- package/lib/synchronizers.js +1 -1
- package/lib/synchronizers.js.gz +0 -0
- package/lib/tinybase.js +1 -1
- package/lib/tinybase.js.gz +0 -0
- package/lib/types/persisters/persister-browser.d.ts +2 -2
- package/lib/types/persisters/persister-file.d.ts +1 -1
- package/lib/types/persisters.d.ts +73 -47
- package/lib/types/synchronizers/synchronizer-ws-server.d.ts +24 -3
- package/lib/types/synchronizers.d.ts +1 -1
- 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.d.ts +99 -87
- package/lib/types/with-schemas/synchronizers/synchronizer-ws-server.d.ts +24 -3
- package/lib/types/with-schemas/synchronizers.d.ts +1 -1
- package/lib/umd/mergeable-store.js +1 -1
- 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-libsql.js +1 -1
- 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-powersync.js +1 -1
- package/lib/umd/persisters/persister-powersync.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/synchronizers/synchronizer-local.js +1 -1
- package/lib/umd/synchronizers/synchronizer-local.js.gz +0 -0
- package/lib/umd/synchronizers/synchronizer-ws-client.js +1 -1
- package/lib/umd/synchronizers/synchronizer-ws-client.js.gz +0 -0
- package/lib/umd/synchronizers/synchronizer-ws-server.js +1 -1
- package/lib/umd/synchronizers/synchronizer-ws-server.js.gz +0 -0
- package/lib/umd/synchronizers.js +1 -1
- package/lib/umd/synchronizers.js.gz +0 -0
- package/lib/umd/tinybase.js +1 -1
- package/lib/umd/tinybase.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/mergeable-store.js +1 -1
- 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-libsql.js +1 -1
- 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-powersync.js +1 -1
- package/lib/umd-es6/persisters/persister-powersync.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/synchronizers/synchronizer-local.js +1 -1
- package/lib/umd-es6/synchronizers/synchronizer-local.js.gz +0 -0
- package/lib/umd-es6/synchronizers/synchronizer-ws-client.js +1 -1
- package/lib/umd-es6/synchronizers/synchronizer-ws-client.js.gz +0 -0
- package/lib/umd-es6/synchronizers/synchronizer-ws-server.js +1 -1
- package/lib/umd-es6/synchronizers/synchronizer-ws-server.js.gz +0 -0
- package/lib/umd-es6/synchronizers.js +1 -1
- package/lib/umd-es6/synchronizers.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/ui-react-dom-debug.js +1 -1
- package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
- package/package.json +1 -1
- package/readme.md +2 -2
|
@@ -388,24 +388,27 @@ const jsonParse = JSON.parse;
|
|
|
388
388
|
|
|
389
389
|
const scheduleRunning = mapNew();
|
|
390
390
|
const scheduleActions = mapNew();
|
|
391
|
-
const getStoreFunctions = (
|
|
392
|
-
|
|
391
|
+
const getStoreFunctions = (supportedStoreType = 1, store) =>
|
|
392
|
+
supportedStoreType > 1 && 'getMergeableContent' in store
|
|
393
393
|
? [
|
|
394
|
-
0,
|
|
395
|
-
store.getContent,
|
|
396
|
-
store.getTransactionChanges,
|
|
397
|
-
([changedTables, changedValues]) =>
|
|
398
|
-
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
399
|
-
store.setContent,
|
|
400
|
-
]
|
|
401
|
-
: [
|
|
402
394
|
1,
|
|
403
395
|
store.getMergeableContent,
|
|
404
396
|
store.getTransactionMergeableChanges,
|
|
405
397
|
([[changedTables], [changedValues]]) =>
|
|
406
398
|
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
407
399
|
store.setDefaultContent,
|
|
408
|
-
]
|
|
400
|
+
]
|
|
401
|
+
: supportedStoreType != 2
|
|
402
|
+
? [
|
|
403
|
+
0,
|
|
404
|
+
store.getContent,
|
|
405
|
+
store.getTransactionChanges,
|
|
406
|
+
([changedTables, changedValues]) =>
|
|
407
|
+
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
408
|
+
store.setContent,
|
|
409
|
+
]
|
|
410
|
+
: /* istanbul ignore next */
|
|
411
|
+
0;
|
|
409
412
|
const createCustomPersister = (
|
|
410
413
|
store,
|
|
411
414
|
getPersisted,
|
|
@@ -413,7 +416,7 @@ const createCustomPersister = (
|
|
|
413
416
|
addPersisterListener,
|
|
414
417
|
delPersisterListener,
|
|
415
418
|
onIgnoredError,
|
|
416
|
-
|
|
419
|
+
supportedStoreType,
|
|
417
420
|
extra = {},
|
|
418
421
|
scheduleId = [],
|
|
419
422
|
) => {
|
|
@@ -431,7 +434,7 @@ const createCustomPersister = (
|
|
|
431
434
|
getChanges,
|
|
432
435
|
hasChanges,
|
|
433
436
|
setDefaultContent,
|
|
434
|
-
] = getStoreFunctions(
|
|
437
|
+
] = getStoreFunctions(supportedStoreType, store);
|
|
435
438
|
const run = async () => {
|
|
436
439
|
/* istanbul ignore else */
|
|
437
440
|
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
@@ -449,20 +452,6 @@ const createCustomPersister = (
|
|
|
449
452
|
mapSet(scheduleRunning, scheduleId, 0);
|
|
450
453
|
}
|
|
451
454
|
};
|
|
452
|
-
const loadLock = async (actions) => {
|
|
453
|
-
/* istanbul ignore else */
|
|
454
|
-
if (loadSave != 2) {
|
|
455
|
-
loadSave = 1;
|
|
456
|
-
{
|
|
457
|
-
loads++;
|
|
458
|
-
}
|
|
459
|
-
await persister.schedule(async () => {
|
|
460
|
-
await actions();
|
|
461
|
-
loadSave = 0;
|
|
462
|
-
});
|
|
463
|
-
}
|
|
464
|
-
return persister;
|
|
465
|
-
};
|
|
466
455
|
const setContentOrChanges = (contentOrChanges) => {
|
|
467
456
|
(isMergeableStore && isArray(contentOrChanges?.[0])
|
|
468
457
|
? contentOrChanges?.[2] === 1
|
|
@@ -472,9 +461,14 @@ const createCustomPersister = (
|
|
|
472
461
|
? store.applyChanges
|
|
473
462
|
: store.setContent)(contentOrChanges);
|
|
474
463
|
};
|
|
475
|
-
const
|
|
476
|
-
|
|
477
|
-
|
|
464
|
+
const load = async (initialContent) => {
|
|
465
|
+
/* istanbul ignore else */
|
|
466
|
+
if (loadSave != 2) {
|
|
467
|
+
loadSave = 1;
|
|
468
|
+
{
|
|
469
|
+
loads++;
|
|
470
|
+
}
|
|
471
|
+
await schedule(async () => {
|
|
478
472
|
try {
|
|
479
473
|
setContentOrChanges(await getPersisted());
|
|
480
474
|
} catch (error) {
|
|
@@ -483,76 +477,94 @@ const createCustomPersister = (
|
|
|
483
477
|
setDefaultContent(initialContent);
|
|
484
478
|
}
|
|
485
479
|
}
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
});
|
|
501
|
-
},
|
|
502
|
-
);
|
|
503
|
-
return persister;
|
|
504
|
-
},
|
|
505
|
-
stopAutoLoad: () => {
|
|
506
|
-
if (autoLoadHandle) {
|
|
507
|
-
delPersisterListener(autoLoadHandle);
|
|
508
|
-
autoLoadHandle = void 0;
|
|
509
|
-
}
|
|
510
|
-
return persister;
|
|
511
|
-
},
|
|
512
|
-
isAutoLoading: () => !isUndefined(autoLoadHandle),
|
|
513
|
-
save: async (getChanges2) => {
|
|
514
|
-
/* istanbul ignore else */
|
|
515
|
-
if (loadSave != 1) {
|
|
516
|
-
loadSave = 2;
|
|
517
|
-
{
|
|
518
|
-
saves++;
|
|
519
|
-
}
|
|
520
|
-
await persister.schedule(async () => {
|
|
521
|
-
try {
|
|
522
|
-
await setPersisted(getContent, getChanges2);
|
|
523
|
-
} catch (error) {
|
|
524
|
-
/* istanbul ignore next */
|
|
525
|
-
onIgnoredError?.(error);
|
|
480
|
+
loadSave = 0;
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
return persister;
|
|
484
|
+
};
|
|
485
|
+
const startAutoLoad = async (initialContent) => {
|
|
486
|
+
await stopAutoLoad().load(initialContent);
|
|
487
|
+
autoLoadHandle = addPersisterListener(async (content, changes) => {
|
|
488
|
+
if (changes || content) {
|
|
489
|
+
/* istanbul ignore else */
|
|
490
|
+
if (loadSave != 2) {
|
|
491
|
+
loadSave = 1;
|
|
492
|
+
{
|
|
493
|
+
loads++;
|
|
526
494
|
}
|
|
495
|
+
setContentOrChanges(changes ?? content);
|
|
527
496
|
loadSave = 0;
|
|
528
|
-
}
|
|
497
|
+
}
|
|
498
|
+
} else {
|
|
499
|
+
await load();
|
|
500
|
+
}
|
|
501
|
+
});
|
|
502
|
+
return persister;
|
|
503
|
+
};
|
|
504
|
+
const stopAutoLoad = () => {
|
|
505
|
+
if (autoLoadHandle) {
|
|
506
|
+
delPersisterListener(autoLoadHandle);
|
|
507
|
+
autoLoadHandle = void 0;
|
|
508
|
+
}
|
|
509
|
+
return persister;
|
|
510
|
+
};
|
|
511
|
+
const isAutoLoading = () => !isUndefined(autoLoadHandle);
|
|
512
|
+
const save = async (changes) => {
|
|
513
|
+
/* istanbul ignore else */
|
|
514
|
+
if (loadSave != 1) {
|
|
515
|
+
loadSave = 2;
|
|
516
|
+
{
|
|
517
|
+
saves++;
|
|
529
518
|
}
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
if (hasChanges(changes)) {
|
|
537
|
-
persister.save(() => changes);
|
|
519
|
+
await schedule(async () => {
|
|
520
|
+
try {
|
|
521
|
+
await setPersisted(getContent, changes);
|
|
522
|
+
} catch (error) {
|
|
523
|
+
/* istanbul ignore next */
|
|
524
|
+
onIgnoredError?.(error);
|
|
538
525
|
}
|
|
526
|
+
loadSave = 0;
|
|
539
527
|
});
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
528
|
+
}
|
|
529
|
+
return persister;
|
|
530
|
+
};
|
|
531
|
+
const startAutoSave = async () => {
|
|
532
|
+
await stopAutoSave().save();
|
|
533
|
+
autoSaveListenerId = store.addDidFinishTransactionListener(() => {
|
|
534
|
+
const changes = getChanges();
|
|
535
|
+
if (hasChanges(changes)) {
|
|
536
|
+
save(changes);
|
|
537
|
+
}
|
|
538
|
+
});
|
|
539
|
+
return persister;
|
|
540
|
+
};
|
|
541
|
+
const stopAutoSave = () => {
|
|
542
|
+
ifNotUndefined(autoSaveListenerId, store.delListener);
|
|
543
|
+
autoSaveListenerId = void 0;
|
|
544
|
+
return persister;
|
|
545
|
+
};
|
|
546
|
+
const isAutoSaving = () => !isUndefined(autoSaveListenerId);
|
|
547
|
+
const schedule = async (...actions) => {
|
|
548
|
+
arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
|
|
549
|
+
await run();
|
|
550
|
+
return persister;
|
|
551
|
+
};
|
|
552
|
+
const getStore = () => store;
|
|
553
|
+
const destroy = () => stopAutoLoad().stopAutoSave();
|
|
554
|
+
const getStats = () => ({loads, saves});
|
|
555
|
+
const persister = {
|
|
556
|
+
load,
|
|
557
|
+
startAutoLoad,
|
|
558
|
+
stopAutoLoad,
|
|
559
|
+
isAutoLoading,
|
|
560
|
+
save,
|
|
561
|
+
startAutoSave,
|
|
562
|
+
stopAutoSave,
|
|
563
|
+
isAutoSaving,
|
|
564
|
+
schedule,
|
|
565
|
+
getStore,
|
|
566
|
+
destroy,
|
|
567
|
+
getStats,
|
|
556
568
|
...extra,
|
|
557
569
|
};
|
|
558
570
|
return objFreeze(persister);
|
|
@@ -604,7 +616,7 @@ const createJsonSqlitePersister = (
|
|
|
604
616
|
addPersisterListener,
|
|
605
617
|
delPersisterListener,
|
|
606
618
|
onIgnoredError,
|
|
607
|
-
|
|
619
|
+
1,
|
|
608
620
|
{[getThing]: () => db},
|
|
609
621
|
db,
|
|
610
622
|
);
|
|
@@ -691,13 +703,12 @@ const createTabularSqlitePersister = (
|
|
|
691
703
|
? [tables, values]
|
|
692
704
|
: void 0;
|
|
693
705
|
});
|
|
694
|
-
const setPersisted = async (getContent,
|
|
706
|
+
const setPersisted = async (getContent, changes) =>
|
|
695
707
|
await transaction(async () => {
|
|
696
708
|
await refreshSchema();
|
|
697
|
-
if (!isUndefined(
|
|
698
|
-
|
|
699
|
-
await
|
|
700
|
-
await saveValues(valueChanges, true);
|
|
709
|
+
if (!isUndefined(changes)) {
|
|
710
|
+
await saveTables(changes[0], true);
|
|
711
|
+
await saveValues(changes[1], true);
|
|
701
712
|
} else {
|
|
702
713
|
const [tables, values] = getContent();
|
|
703
714
|
await saveTables(tables);
|
|
@@ -711,7 +722,7 @@ const createTabularSqlitePersister = (
|
|
|
711
722
|
addPersisterListener,
|
|
712
723
|
delPersisterListener,
|
|
713
724
|
onIgnoredError,
|
|
714
|
-
|
|
725
|
+
1,
|
|
715
726
|
{[getThing]: () => db},
|
|
716
727
|
db,
|
|
717
728
|
);
|
|
@@ -389,24 +389,27 @@ const jsonParse = JSON.parse;
|
|
|
389
389
|
|
|
390
390
|
const scheduleRunning = mapNew();
|
|
391
391
|
const scheduleActions = mapNew();
|
|
392
|
-
const getStoreFunctions = (
|
|
393
|
-
|
|
392
|
+
const getStoreFunctions = (supportedStoreType = 1, store) =>
|
|
393
|
+
supportedStoreType > 1 && 'getMergeableContent' in store
|
|
394
394
|
? [
|
|
395
|
-
0,
|
|
396
|
-
store.getContent,
|
|
397
|
-
store.getTransactionChanges,
|
|
398
|
-
([changedTables, changedValues]) =>
|
|
399
|
-
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
400
|
-
store.setContent,
|
|
401
|
-
]
|
|
402
|
-
: [
|
|
403
395
|
1,
|
|
404
396
|
store.getMergeableContent,
|
|
405
397
|
store.getTransactionMergeableChanges,
|
|
406
398
|
([[changedTables], [changedValues]]) =>
|
|
407
399
|
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
408
400
|
store.setDefaultContent,
|
|
409
|
-
]
|
|
401
|
+
]
|
|
402
|
+
: supportedStoreType != 2
|
|
403
|
+
? [
|
|
404
|
+
0,
|
|
405
|
+
store.getContent,
|
|
406
|
+
store.getTransactionChanges,
|
|
407
|
+
([changedTables, changedValues]) =>
|
|
408
|
+
!objIsEmpty(changedTables) || !objIsEmpty(changedValues),
|
|
409
|
+
store.setContent,
|
|
410
|
+
]
|
|
411
|
+
: /* istanbul ignore next */
|
|
412
|
+
0;
|
|
410
413
|
const createCustomPersister = (
|
|
411
414
|
store,
|
|
412
415
|
getPersisted,
|
|
@@ -414,7 +417,7 @@ const createCustomPersister = (
|
|
|
414
417
|
addPersisterListener,
|
|
415
418
|
delPersisterListener,
|
|
416
419
|
onIgnoredError,
|
|
417
|
-
|
|
420
|
+
supportedStoreType,
|
|
418
421
|
extra = {},
|
|
419
422
|
scheduleId = [],
|
|
420
423
|
) => {
|
|
@@ -432,7 +435,7 @@ const createCustomPersister = (
|
|
|
432
435
|
getChanges,
|
|
433
436
|
hasChanges,
|
|
434
437
|
setDefaultContent,
|
|
435
|
-
] = getStoreFunctions(
|
|
438
|
+
] = getStoreFunctions(supportedStoreType, store);
|
|
436
439
|
const run = async () => {
|
|
437
440
|
/* istanbul ignore else */
|
|
438
441
|
if (!mapGet(scheduleRunning, scheduleId)) {
|
|
@@ -450,20 +453,6 @@ const createCustomPersister = (
|
|
|
450
453
|
mapSet(scheduleRunning, scheduleId, 0);
|
|
451
454
|
}
|
|
452
455
|
};
|
|
453
|
-
const loadLock = async (actions) => {
|
|
454
|
-
/* istanbul ignore else */
|
|
455
|
-
if (loadSave != 2) {
|
|
456
|
-
loadSave = 1;
|
|
457
|
-
{
|
|
458
|
-
loads++;
|
|
459
|
-
}
|
|
460
|
-
await persister.schedule(async () => {
|
|
461
|
-
await actions();
|
|
462
|
-
loadSave = 0;
|
|
463
|
-
});
|
|
464
|
-
}
|
|
465
|
-
return persister;
|
|
466
|
-
};
|
|
467
456
|
const setContentOrChanges = (contentOrChanges) => {
|
|
468
457
|
(isMergeableStore && isArray(contentOrChanges?.[0])
|
|
469
458
|
? contentOrChanges?.[2] === 1
|
|
@@ -473,9 +462,14 @@ const createCustomPersister = (
|
|
|
473
462
|
? store.applyChanges
|
|
474
463
|
: store.setContent)(contentOrChanges);
|
|
475
464
|
};
|
|
476
|
-
const
|
|
477
|
-
|
|
478
|
-
|
|
465
|
+
const load = async (initialContent) => {
|
|
466
|
+
/* istanbul ignore else */
|
|
467
|
+
if (loadSave != 2) {
|
|
468
|
+
loadSave = 1;
|
|
469
|
+
{
|
|
470
|
+
loads++;
|
|
471
|
+
}
|
|
472
|
+
await schedule(async () => {
|
|
479
473
|
try {
|
|
480
474
|
setContentOrChanges(await getPersisted());
|
|
481
475
|
} catch (error) {
|
|
@@ -484,76 +478,94 @@ const createCustomPersister = (
|
|
|
484
478
|
setDefaultContent(initialContent);
|
|
485
479
|
}
|
|
486
480
|
}
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
});
|
|
502
|
-
},
|
|
503
|
-
);
|
|
504
|
-
return persister;
|
|
505
|
-
},
|
|
506
|
-
stopAutoLoad: () => {
|
|
507
|
-
if (autoLoadHandle) {
|
|
508
|
-
delPersisterListener(autoLoadHandle);
|
|
509
|
-
autoLoadHandle = void 0;
|
|
510
|
-
}
|
|
511
|
-
return persister;
|
|
512
|
-
},
|
|
513
|
-
isAutoLoading: () => !isUndefined(autoLoadHandle),
|
|
514
|
-
save: async (getChanges2) => {
|
|
515
|
-
/* istanbul ignore else */
|
|
516
|
-
if (loadSave != 1) {
|
|
517
|
-
loadSave = 2;
|
|
518
|
-
{
|
|
519
|
-
saves++;
|
|
520
|
-
}
|
|
521
|
-
await persister.schedule(async () => {
|
|
522
|
-
try {
|
|
523
|
-
await setPersisted(getContent, getChanges2);
|
|
524
|
-
} catch (error) {
|
|
525
|
-
/* istanbul ignore next */
|
|
526
|
-
onIgnoredError?.(error);
|
|
481
|
+
loadSave = 0;
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
return persister;
|
|
485
|
+
};
|
|
486
|
+
const startAutoLoad = async (initialContent) => {
|
|
487
|
+
await stopAutoLoad().load(initialContent);
|
|
488
|
+
autoLoadHandle = addPersisterListener(async (content, changes) => {
|
|
489
|
+
if (changes || content) {
|
|
490
|
+
/* istanbul ignore else */
|
|
491
|
+
if (loadSave != 2) {
|
|
492
|
+
loadSave = 1;
|
|
493
|
+
{
|
|
494
|
+
loads++;
|
|
527
495
|
}
|
|
496
|
+
setContentOrChanges(changes ?? content);
|
|
528
497
|
loadSave = 0;
|
|
529
|
-
}
|
|
498
|
+
}
|
|
499
|
+
} else {
|
|
500
|
+
await load();
|
|
501
|
+
}
|
|
502
|
+
});
|
|
503
|
+
return persister;
|
|
504
|
+
};
|
|
505
|
+
const stopAutoLoad = () => {
|
|
506
|
+
if (autoLoadHandle) {
|
|
507
|
+
delPersisterListener(autoLoadHandle);
|
|
508
|
+
autoLoadHandle = void 0;
|
|
509
|
+
}
|
|
510
|
+
return persister;
|
|
511
|
+
};
|
|
512
|
+
const isAutoLoading = () => !isUndefined(autoLoadHandle);
|
|
513
|
+
const save = async (changes) => {
|
|
514
|
+
/* istanbul ignore else */
|
|
515
|
+
if (loadSave != 1) {
|
|
516
|
+
loadSave = 2;
|
|
517
|
+
{
|
|
518
|
+
saves++;
|
|
530
519
|
}
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
if (hasChanges(changes)) {
|
|
538
|
-
persister.save(() => changes);
|
|
520
|
+
await schedule(async () => {
|
|
521
|
+
try {
|
|
522
|
+
await setPersisted(getContent, changes);
|
|
523
|
+
} catch (error) {
|
|
524
|
+
/* istanbul ignore next */
|
|
525
|
+
onIgnoredError?.(error);
|
|
539
526
|
}
|
|
527
|
+
loadSave = 0;
|
|
540
528
|
});
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
529
|
+
}
|
|
530
|
+
return persister;
|
|
531
|
+
};
|
|
532
|
+
const startAutoSave = async () => {
|
|
533
|
+
await stopAutoSave().save();
|
|
534
|
+
autoSaveListenerId = store.addDidFinishTransactionListener(() => {
|
|
535
|
+
const changes = getChanges();
|
|
536
|
+
if (hasChanges(changes)) {
|
|
537
|
+
save(changes);
|
|
538
|
+
}
|
|
539
|
+
});
|
|
540
|
+
return persister;
|
|
541
|
+
};
|
|
542
|
+
const stopAutoSave = () => {
|
|
543
|
+
ifNotUndefined(autoSaveListenerId, store.delListener);
|
|
544
|
+
autoSaveListenerId = void 0;
|
|
545
|
+
return persister;
|
|
546
|
+
};
|
|
547
|
+
const isAutoSaving = () => !isUndefined(autoSaveListenerId);
|
|
548
|
+
const schedule = async (...actions) => {
|
|
549
|
+
arrayPush(mapGet(scheduleActions, scheduleId), ...actions);
|
|
550
|
+
await run();
|
|
551
|
+
return persister;
|
|
552
|
+
};
|
|
553
|
+
const getStore = () => store;
|
|
554
|
+
const destroy = () => stopAutoLoad().stopAutoSave();
|
|
555
|
+
const getStats = () => ({loads, saves});
|
|
556
|
+
const persister = {
|
|
557
|
+
load,
|
|
558
|
+
startAutoLoad,
|
|
559
|
+
stopAutoLoad,
|
|
560
|
+
isAutoLoading,
|
|
561
|
+
save,
|
|
562
|
+
startAutoSave,
|
|
563
|
+
stopAutoSave,
|
|
564
|
+
isAutoSaving,
|
|
565
|
+
schedule,
|
|
566
|
+
getStore,
|
|
567
|
+
destroy,
|
|
568
|
+
getStats,
|
|
557
569
|
...extra,
|
|
558
570
|
};
|
|
559
571
|
return objFreeze(persister);
|
|
@@ -605,7 +617,7 @@ const createJsonSqlitePersister = (
|
|
|
605
617
|
addPersisterListener,
|
|
606
618
|
delPersisterListener,
|
|
607
619
|
onIgnoredError,
|
|
608
|
-
|
|
620
|
+
1,
|
|
609
621
|
{[getThing]: () => db},
|
|
610
622
|
db,
|
|
611
623
|
);
|
|
@@ -692,13 +704,12 @@ const createTabularSqlitePersister = (
|
|
|
692
704
|
? [tables, values]
|
|
693
705
|
: void 0;
|
|
694
706
|
});
|
|
695
|
-
const setPersisted = async (getContent,
|
|
707
|
+
const setPersisted = async (getContent, changes) =>
|
|
696
708
|
await transaction(async () => {
|
|
697
709
|
await refreshSchema();
|
|
698
|
-
if (!isUndefined(
|
|
699
|
-
|
|
700
|
-
await
|
|
701
|
-
await saveValues(valueChanges, true);
|
|
710
|
+
if (!isUndefined(changes)) {
|
|
711
|
+
await saveTables(changes[0], true);
|
|
712
|
+
await saveValues(changes[1], true);
|
|
702
713
|
} else {
|
|
703
714
|
const [tables, values] = getContent();
|
|
704
715
|
await saveTables(tables);
|
|
@@ -712,7 +723,7 @@ const createTabularSqlitePersister = (
|
|
|
712
723
|
addPersisterListener,
|
|
713
724
|
delPersisterListener,
|
|
714
725
|
onIgnoredError,
|
|
715
|
-
|
|
726
|
+
1,
|
|
716
727
|
{[getThing]: () => db},
|
|
717
728
|
db,
|
|
718
729
|
);
|