tinybase 5.0.0-beta.4 → 5.0.0-beta.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/checkpoints.js +1 -1
- package/lib/checkpoints.js.gz +0 -0
- package/lib/cjs/checkpoints.cjs +1 -1
- package/lib/cjs/checkpoints.cjs.gz +0 -0
- package/lib/cjs/indexes.cjs +1 -1
- package/lib/cjs/indexes.cjs.gz +0 -0
- package/lib/cjs/mergeable-store.cjs +1 -1
- package/lib/cjs/mergeable-store.cjs.gz +0 -0
- package/lib/cjs/metrics.cjs +1 -1
- package/lib/cjs/metrics.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-automerge.cjs +1 -1
- package/lib/cjs/persisters/persister-automerge.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-browser.cjs +1 -1
- package/lib/cjs/persisters/persister-browser.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -1
- package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-electric-sql.cjs +1 -1
- package/lib/cjs/persisters/persister-electric-sql.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-expo-sqlite-next.cjs +1 -1
- package/lib/cjs/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-expo-sqlite.cjs +1 -1
- package/lib/cjs/persisters/persister-expo-sqlite.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-file.cjs +1 -1
- package/lib/cjs/persisters/persister-file.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-indexed-db.cjs +1 -1
- package/lib/cjs/persisters/persister-indexed-db.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-libsql.cjs +1 -0
- package/lib/cjs/persisters/persister-libsql.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-partykit-client.cjs +1 -1
- package/lib/cjs/persisters/persister-partykit-client.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-powersync.cjs +1 -0
- 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-sync.cjs +1 -0
- package/lib/cjs/persisters/persister-sync.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-yjs.cjs +1 -1
- package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
- package/lib/cjs/persisters.cjs +1 -1
- package/lib/cjs/persisters.cjs.gz +0 -0
- package/lib/cjs/queries.cjs +1 -1
- package/lib/cjs/queries.cjs.gz +0 -0
- package/lib/cjs/relationships.cjs +1 -1
- package/lib/cjs/relationships.cjs.gz +0 -0
- package/lib/cjs/store.cjs +1 -1
- package/lib/cjs/store.cjs.gz +0 -0
- package/lib/cjs/tinybase.cjs +1 -1
- package/lib/cjs/tinybase.cjs.gz +0 -0
- package/lib/cjs/tools.cjs +1 -1
- package/lib/cjs/tools.cjs.gz +0 -0
- package/lib/cjs/ui-react-dom-debug.cjs +1 -1
- package/lib/cjs/ui-react-dom-debug.cjs.gz +0 -0
- package/lib/cjs/ui-react.cjs +1 -1
- package/lib/cjs/ui-react.cjs.gz +0 -0
- package/lib/cjs-es6/checkpoints.cjs +1 -1
- package/lib/cjs-es6/checkpoints.cjs.gz +0 -0
- package/lib/cjs-es6/indexes.cjs +1 -1
- package/lib/cjs-es6/indexes.cjs.gz +0 -0
- package/lib/cjs-es6/mergeable-store.cjs +1 -1
- package/lib/cjs-es6/mergeable-store.cjs.gz +0 -0
- package/lib/cjs-es6/metrics.cjs +1 -1
- package/lib/cjs-es6/metrics.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-browser.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-browser.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-electric-sql.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-electric-sql.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-file.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-indexed-db.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-indexed-db.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-libsql.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-libsql.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-partykit-client.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-partykit-client.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-powersync.cjs +1 -0
- 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-sync.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-sync.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
- package/lib/cjs-es6/persisters.cjs +1 -1
- package/lib/cjs-es6/persisters.cjs.gz +0 -0
- package/lib/cjs-es6/queries.cjs +1 -1
- package/lib/cjs-es6/queries.cjs.gz +0 -0
- package/lib/cjs-es6/relationships.cjs +1 -1
- package/lib/cjs-es6/relationships.cjs.gz +0 -0
- package/lib/cjs-es6/store.cjs +1 -1
- package/lib/cjs-es6/store.cjs.gz +0 -0
- package/lib/cjs-es6/tinybase.cjs +1 -1
- package/lib/cjs-es6/tinybase.cjs.gz +0 -0
- package/lib/cjs-es6/tools.cjs +1 -1
- package/lib/cjs-es6/tools.cjs.gz +0 -0
- package/lib/cjs-es6/ui-react-dom-debug.cjs +1 -1
- package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
- package/lib/cjs-es6/ui-react.cjs +1 -1
- package/lib/cjs-es6/ui-react.cjs.gz +0 -0
- package/lib/debug/checkpoints.js +3 -1
- package/lib/debug/indexes.js +3 -1
- package/lib/debug/mergeable-store.js +403 -179
- package/lib/debug/metrics.js +3 -1
- package/lib/debug/persisters/persister-automerge.js +42 -47
- package/lib/debug/persisters/persister-browser.js +42 -47
- package/lib/debug/persisters/persister-cr-sqlite-wasm.js +67 -61
- package/lib/debug/persisters/persister-electric-sql.js +67 -61
- package/lib/debug/persisters/persister-expo-sqlite-next.js +67 -61
- package/lib/debug/persisters/persister-expo-sqlite.js +67 -61
- package/lib/debug/persisters/persister-file.js +42 -47
- package/lib/debug/persisters/persister-indexed-db.js +42 -47
- package/lib/debug/persisters/persister-libsql.js +902 -0
- package/lib/debug/persisters/persister-partykit-client.js +42 -47
- package/lib/debug/persisters/persister-powersync.js +917 -0
- package/lib/debug/persisters/persister-remote.js +42 -47
- package/lib/debug/persisters/persister-sqlite-wasm.js +67 -61
- package/lib/debug/persisters/persister-sqlite3.js +67 -61
- package/lib/debug/persisters/persister-sync.js +594 -0
- package/lib/debug/persisters/persister-yjs.js +44 -49
- package/lib/debug/persisters.js +41 -46
- package/lib/debug/queries.js +7 -4
- package/lib/debug/relationships.js +3 -1
- package/lib/debug/store.js +51 -36
- package/lib/debug/tinybase.js +439 -223
- package/lib/debug/tools.js +9 -6
- package/lib/debug/ui-react-dom.js +88 -80
- package/lib/debug/ui-react.js +1 -1
- package/lib/es6/checkpoints.js +1 -1
- package/lib/es6/checkpoints.js.gz +0 -0
- package/lib/es6/indexes.js +1 -1
- package/lib/es6/indexes.js.gz +0 -0
- package/lib/es6/mergeable-store.js +1 -1
- package/lib/es6/mergeable-store.js.gz +0 -0
- package/lib/es6/metrics.js +1 -1
- package/lib/es6/metrics.js.gz +0 -0
- package/lib/es6/persisters/persister-automerge.js +1 -1
- package/lib/es6/persisters/persister-automerge.js.gz +0 -0
- package/lib/es6/persisters/persister-browser.js +1 -1
- package/lib/es6/persisters/persister-browser.js.gz +0 -0
- package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -1
- package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/es6/persisters/persister-electric-sql.js +1 -1
- package/lib/es6/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/es6/persisters/persister-expo-sqlite-next.js +1 -1
- package/lib/es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
- package/lib/es6/persisters/persister-expo-sqlite.js +1 -1
- package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/es6/persisters/persister-file.js +1 -1
- package/lib/es6/persisters/persister-file.js.gz +0 -0
- package/lib/es6/persisters/persister-indexed-db.js +1 -1
- package/lib/es6/persisters/persister-indexed-db.js.gz +0 -0
- package/lib/es6/persisters/persister-libsql.js +1 -0
- package/lib/es6/persisters/persister-libsql.js.gz +0 -0
- package/lib/es6/persisters/persister-partykit-client.js +1 -1
- package/lib/es6/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/es6/persisters/persister-powersync.js +1 -0
- 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-sync.js +1 -0
- package/lib/es6/persisters/persister-sync.js.gz +0 -0
- package/lib/es6/persisters/persister-yjs.js +1 -1
- package/lib/es6/persisters/persister-yjs.js.gz +0 -0
- package/lib/es6/persisters.js +1 -1
- package/lib/es6/persisters.js.gz +0 -0
- package/lib/es6/queries.js +1 -1
- package/lib/es6/queries.js.gz +0 -0
- package/lib/es6/relationships.js +1 -1
- package/lib/es6/relationships.js.gz +0 -0
- package/lib/es6/store.js +1 -1
- package/lib/es6/store.js.gz +0 -0
- package/lib/es6/tinybase.js +1 -1
- package/lib/es6/tinybase.js.gz +0 -0
- package/lib/es6/tools.js +1 -1
- package/lib/es6/tools.js.gz +0 -0
- package/lib/es6/ui-react-dom-debug.js +1 -1
- package/lib/es6/ui-react-dom-debug.js.gz +0 -0
- package/lib/es6/ui-react.js +1 -1
- package/lib/es6/ui-react.js.gz +0 -0
- package/lib/indexes.js +1 -1
- package/lib/indexes.js.gz +0 -0
- package/lib/mergeable-store.js +1 -1
- package/lib/mergeable-store.js.gz +0 -0
- package/lib/metrics.js +1 -1
- package/lib/metrics.js.gz +0 -0
- package/lib/persisters/persister-automerge.js +1 -1
- package/lib/persisters/persister-automerge.js.gz +0 -0
- package/lib/persisters/persister-browser.js +1 -1
- package/lib/persisters/persister-browser.js.gz +0 -0
- package/lib/persisters/persister-cr-sqlite-wasm.js +1 -1
- package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/persisters/persister-electric-sql.js +1 -1
- package/lib/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/persisters/persister-expo-sqlite-next.js +1 -1
- package/lib/persisters/persister-expo-sqlite-next.js.gz +0 -0
- package/lib/persisters/persister-expo-sqlite.js +1 -1
- package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/persisters/persister-file.js +1 -1
- package/lib/persisters/persister-file.js.gz +0 -0
- package/lib/persisters/persister-indexed-db.js +1 -1
- package/lib/persisters/persister-indexed-db.js.gz +0 -0
- package/lib/persisters/persister-libsql.js +1 -0
- package/lib/persisters/persister-libsql.js.gz +0 -0
- package/lib/persisters/persister-partykit-client.js +1 -1
- package/lib/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/persisters/persister-powersync.js +1 -0
- 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-sync.js +1 -0
- package/lib/persisters/persister-sync.js.gz +0 -0
- package/lib/persisters/persister-yjs.js +1 -1
- package/lib/persisters/persister-yjs.js.gz +0 -0
- package/lib/persisters.js +1 -1
- package/lib/persisters.js.gz +0 -0
- package/lib/queries.js +1 -1
- package/lib/queries.js.gz +0 -0
- package/lib/relationships.js +1 -1
- package/lib/relationships.js.gz +0 -0
- package/lib/store.js +1 -1
- package/lib/store.js.gz +0 -0
- package/lib/tinybase.js +1 -1
- package/lib/tinybase.js.gz +0 -0
- package/lib/tools.js +1 -1
- package/lib/tools.js.gz +0 -0
- package/lib/types/checkpoints.d.ts +2 -2
- package/lib/types/indexes.d.ts +2 -2
- package/lib/types/mergeable-store.d.ts +143 -20
- package/lib/types/metrics.d.ts +2 -2
- package/lib/types/persisters/persister-automerge.d.ts +3 -0
- package/lib/types/persisters/persister-browser.d.ts +9 -2
- package/lib/types/persisters/persister-cr-sqlite-wasm.d.ts +3 -0
- package/lib/types/persisters/persister-electric-sql.d.ts +3 -0
- package/lib/types/persisters/persister-expo-sqlite-next.d.ts +3 -0
- package/lib/types/persisters/persister-expo-sqlite.d.ts +3 -0
- package/lib/types/persisters/persister-file.d.ts +5 -1
- package/lib/types/persisters/persister-indexed-db.d.ts +3 -0
- package/lib/types/persisters/persister-libsql.d.ts +142 -0
- package/lib/types/persisters/persister-partykit-client.d.ts +3 -0
- package/lib/types/persisters/persister-powersync.d.ts +157 -0
- package/lib/types/persisters/persister-remote.d.ts +3 -0
- package/lib/types/persisters/persister-sqlite-wasm.d.ts +3 -0
- package/lib/types/persisters/persister-sqlite3.d.ts +3 -0
- package/lib/types/persisters/persister-sync.d.ts +182 -0
- package/lib/types/persisters/persister-yjs.d.ts +5 -2
- package/lib/types/persisters.d.ts +61 -3
- package/lib/types/queries.d.ts +2 -2
- package/lib/types/relationships.d.ts +2 -2
- package/lib/types/store.d.ts +36 -3
- package/lib/types/tinybase.d.ts +9 -9
- package/lib/types/tools.d.ts +2 -2
- package/lib/types/ui-react.d.ts +8 -8
- package/lib/types/with-schemas/checkpoints.d.ts +2 -2
- package/lib/types/with-schemas/indexes.d.ts +2 -2
- package/lib/types/with-schemas/mergeable-store.d.ts +415 -40
- package/lib/types/with-schemas/metrics.d.ts +2 -2
- package/lib/types/with-schemas/persisters/persister-automerge.d.ts +4 -1
- package/lib/types/with-schemas/persisters/persister-browser.d.ts +13 -6
- package/lib/types/with-schemas/persisters/persister-cr-sqlite-wasm.d.ts +4 -1
- package/lib/types/with-schemas/persisters/persister-electric-sql.d.ts +4 -1
- package/lib/types/with-schemas/persisters/persister-expo-sqlite-next.d.ts +4 -1
- package/lib/types/with-schemas/persisters/persister-expo-sqlite.d.ts +4 -1
- package/lib/types/with-schemas/persisters/persister-file.d.ts +7 -3
- package/lib/types/with-schemas/persisters/persister-indexed-db.d.ts +4 -1
- package/lib/types/with-schemas/persisters/persister-libsql.d.ts +155 -0
- package/lib/types/with-schemas/persisters/persister-partykit-client.d.ts +4 -1
- package/lib/types/with-schemas/persisters/persister-powersync.d.ts +170 -0
- package/lib/types/with-schemas/persisters/persister-remote.d.ts +4 -1
- package/lib/types/with-schemas/persisters/persister-sqlite-wasm.d.ts +4 -1
- package/lib/types/with-schemas/persisters/persister-sqlite3.d.ts +4 -1
- package/lib/types/with-schemas/persisters/persister-sync.d.ts +195 -0
- package/lib/types/with-schemas/persisters/persister-yjs.d.ts +6 -3
- package/lib/types/with-schemas/persisters.d.ts +80 -7
- package/lib/types/with-schemas/queries.d.ts +3 -3
- package/lib/types/with-schemas/relationships.d.ts +2 -2
- package/lib/types/with-schemas/store.d.ts +136 -89
- package/lib/types/with-schemas/tinybase.d.ts +9 -9
- package/lib/types/with-schemas/tools.d.ts +2 -2
- package/lib/types/with-schemas/ui-react.d.ts +8 -8
- package/lib/ui-react.js +1 -1
- package/lib/ui-react.js.gz +0 -0
- package/lib/umd/checkpoints.js +1 -1
- package/lib/umd/checkpoints.js.gz +0 -0
- package/lib/umd/indexes.js +1 -1
- package/lib/umd/indexes.js.gz +0 -0
- package/lib/umd/mergeable-store.js +1 -1
- package/lib/umd/mergeable-store.js.gz +0 -0
- package/lib/umd/metrics.js +1 -1
- package/lib/umd/metrics.js.gz +0 -0
- package/lib/umd/persisters/persister-automerge.js +1 -1
- package/lib/umd/persisters/persister-automerge.js.gz +0 -0
- package/lib/umd/persisters/persister-browser.js +1 -1
- package/lib/umd/persisters/persister-browser.js.gz +0 -0
- package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
- package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/umd/persisters/persister-electric-sql.js +1 -1
- package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/umd/persisters/persister-expo-sqlite-next.js +1 -1
- package/lib/umd/persisters/persister-expo-sqlite-next.js.gz +0 -0
- package/lib/umd/persisters/persister-expo-sqlite.js +1 -1
- package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/umd/persisters/persister-file.js +1 -1
- package/lib/umd/persisters/persister-file.js.gz +0 -0
- package/lib/umd/persisters/persister-indexed-db.js +1 -1
- package/lib/umd/persisters/persister-indexed-db.js.gz +0 -0
- package/lib/umd/persisters/persister-libsql.js +1 -0
- package/lib/umd/persisters/persister-libsql.js.gz +0 -0
- package/lib/umd/persisters/persister-partykit-client.js +1 -1
- package/lib/umd/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/umd/persisters/persister-powersync.js +1 -0
- 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-sync.js +1 -0
- package/lib/umd/persisters/persister-sync.js.gz +0 -0
- package/lib/umd/persisters/persister-yjs.js +1 -1
- package/lib/umd/persisters/persister-yjs.js.gz +0 -0
- package/lib/umd/persisters.js +1 -1
- package/lib/umd/persisters.js.gz +0 -0
- package/lib/umd/queries.js +1 -1
- package/lib/umd/queries.js.gz +0 -0
- package/lib/umd/relationships.js +1 -1
- package/lib/umd/relationships.js.gz +0 -0
- package/lib/umd/store.js +1 -1
- package/lib/umd/store.js.gz +0 -0
- package/lib/umd/tinybase.js +1 -1
- package/lib/umd/tinybase.js.gz +0 -0
- package/lib/umd/tools.js +1 -1
- package/lib/umd/tools.js.gz +0 -0
- package/lib/umd/ui-react-dom-debug.js +1 -1
- package/lib/umd/ui-react-dom-debug.js.gz +0 -0
- package/lib/umd/ui-react.js +1 -1
- package/lib/umd/ui-react.js.gz +0 -0
- package/lib/umd-es6/checkpoints.js +1 -1
- package/lib/umd-es6/checkpoints.js.gz +0 -0
- package/lib/umd-es6/indexes.js +1 -1
- package/lib/umd-es6/indexes.js.gz +0 -0
- package/lib/umd-es6/mergeable-store.js +1 -1
- package/lib/umd-es6/mergeable-store.js.gz +0 -0
- package/lib/umd-es6/metrics.js +1 -1
- package/lib/umd-es6/metrics.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-automerge.js +1 -1
- package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-browser.js +1 -1
- package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
- package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-electric-sql.js +1 -1
- package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-expo-sqlite-next.js +1 -1
- package/lib/umd-es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -1
- package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-file.js +1 -1
- package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-indexed-db.js +1 -1
- package/lib/umd-es6/persisters/persister-indexed-db.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-libsql.js +1 -0
- package/lib/umd-es6/persisters/persister-libsql.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-partykit-client.js +1 -1
- package/lib/umd-es6/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-powersync.js +1 -0
- 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-sync.js +1 -0
- package/lib/umd-es6/persisters/persister-sync.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-yjs.js +1 -1
- package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
- package/lib/umd-es6/persisters.js +1 -1
- package/lib/umd-es6/persisters.js.gz +0 -0
- package/lib/umd-es6/queries.js +1 -1
- package/lib/umd-es6/queries.js.gz +0 -0
- package/lib/umd-es6/relationships.js +1 -1
- package/lib/umd-es6/relationships.js.gz +0 -0
- package/lib/umd-es6/store.js +1 -1
- package/lib/umd-es6/store.js.gz +0 -0
- package/lib/umd-es6/tinybase.js +1 -1
- package/lib/umd-es6/tinybase.js.gz +0 -0
- package/lib/umd-es6/tools.js +1 -1
- package/lib/umd-es6/tools.js.gz +0 -0
- package/lib/umd-es6/ui-react-dom-debug.js +1 -1
- package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
- package/lib/umd-es6/ui-react.js +1 -1
- package/lib/umd-es6/ui-react.js.gz +0 -0
- package/package.json +51 -35
- package/readme.md +2 -2
|
@@ -24,8 +24,7 @@ const VALUE_IDS = VALUE + IDS;
|
|
|
24
24
|
const id = (key) => EMPTY_STRING + key;
|
|
25
25
|
const strStartsWith = (str, prefix) => str.startsWith(prefix);
|
|
26
26
|
const strEndsWith = (str, suffix) => str.endsWith(suffix);
|
|
27
|
-
const
|
|
28
|
-
const strCharCodeAt = (str, position = 0) => str.charCodeAt(position);
|
|
27
|
+
const strCharCodeAt = (str, position) => str.charCodeAt(position);
|
|
29
28
|
|
|
30
29
|
const mathMax = Math.max;
|
|
31
30
|
const isFiniteNumber = isFinite;
|
|
@@ -34,6 +33,7 @@ const isUndefined = (thing) => thing == void 0;
|
|
|
34
33
|
const ifNotUndefined = (value, then, otherwise) =>
|
|
35
34
|
isUndefined(value) ? otherwise?.() : then(value);
|
|
36
35
|
const isTypeStringOrBoolean = (type) => type == STRING || type == BOOLEAN;
|
|
36
|
+
const isString = (thing) => getTypeOf(thing) == STRING;
|
|
37
37
|
const isFunction = (thing) => getTypeOf(thing) == FUNCTION;
|
|
38
38
|
const isArray = (thing) => Array.isArray(thing);
|
|
39
39
|
const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
|
|
@@ -55,9 +55,7 @@ const arrayShift = (array) => array.shift();
|
|
|
55
55
|
const object = Object;
|
|
56
56
|
const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
|
|
57
57
|
const objEntries = object.entries;
|
|
58
|
-
const objIds = object.keys;
|
|
59
58
|
const objFrozen = object.isFrozen;
|
|
60
|
-
const objFreeze = object.freeze;
|
|
61
59
|
const isObject = (obj) =>
|
|
62
60
|
!isUndefined(obj) &&
|
|
63
61
|
ifNotUndefined(
|
|
@@ -68,6 +66,8 @@ const isObject = (obj) =>
|
|
|
68
66
|
/* istanbul ignore next */
|
|
69
67
|
() => true,
|
|
70
68
|
);
|
|
69
|
+
const objIds = object.keys;
|
|
70
|
+
const objFreeze = object.freeze;
|
|
71
71
|
const objNew = (entries = []) => object.fromEntries(entries);
|
|
72
72
|
const objHas = (obj, id) => id in obj;
|
|
73
73
|
const objDel = (obj, id) => {
|
|
@@ -78,8 +78,33 @@ const objForEach = (obj, cb) =>
|
|
|
78
78
|
arrayForEach(objEntries(obj), ([id, value]) => cb(value, id));
|
|
79
79
|
const objToArray = (obj, cb) =>
|
|
80
80
|
arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
|
|
81
|
+
const objMap = (obj, cb) =>
|
|
82
|
+
objNew(objToArray(obj, (value, id) => [id, cb(value, id)]));
|
|
81
83
|
const objSize = (obj) => size(objIds(obj));
|
|
82
84
|
const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
|
|
85
|
+
const objEnsure = (obj, id, getDefaultValue) => {
|
|
86
|
+
if (!objHas(obj, id)) {
|
|
87
|
+
obj[id] = getDefaultValue();
|
|
88
|
+
}
|
|
89
|
+
return obj[id];
|
|
90
|
+
};
|
|
91
|
+
const objValidate = (obj, validateChild, onInvalidObj, emptyIsValid = 0) => {
|
|
92
|
+
if (
|
|
93
|
+
isUndefined(obj) ||
|
|
94
|
+
!isObject(obj) ||
|
|
95
|
+
(!emptyIsValid && objIsEmpty(obj)) ||
|
|
96
|
+
objFrozen(obj)
|
|
97
|
+
) {
|
|
98
|
+
onInvalidObj?.();
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
objToArray(obj, (child, id) => {
|
|
102
|
+
if (!validateChild(child, id)) {
|
|
103
|
+
objDel(obj, id);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
return emptyIsValid ? true : !objIsEmpty(obj);
|
|
107
|
+
};
|
|
83
108
|
|
|
84
109
|
const collSizeN = (collSizer) => (coll) =>
|
|
85
110
|
arrayReduce(collValues(coll), (total, coll2) => total + collSizer(coll2), 0);
|
|
@@ -103,9 +128,11 @@ const mapMap = (coll, cb) =>
|
|
|
103
128
|
arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
|
|
104
129
|
const mapSet = (map, key, value) =>
|
|
105
130
|
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
106
|
-
const mapEnsure = (map, key, getDefaultValue) => {
|
|
131
|
+
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
107
132
|
if (!collHas(map, key)) {
|
|
108
133
|
mapSet(map, key, getDefaultValue());
|
|
134
|
+
} else {
|
|
135
|
+
hadExistingValue?.(mapGet(map, key));
|
|
109
136
|
}
|
|
110
137
|
return mapGet(map, key);
|
|
111
138
|
};
|
|
@@ -114,24 +141,28 @@ const mapMatch = (map, obj, set, del = mapSet) => {
|
|
|
114
141
|
mapForEach(map, (id) => (objHas(obj, id) ? 0 : del(map, id)));
|
|
115
142
|
return map;
|
|
116
143
|
};
|
|
117
|
-
const mapToObj = (map,
|
|
144
|
+
const mapToObj = (map, valueMapper, excludeMapValue, excludeObjValue) => {
|
|
118
145
|
const obj = {};
|
|
119
|
-
collForEach(map, (
|
|
120
|
-
|
|
121
|
-
|
|
146
|
+
collForEach(map, (mapValue, id) => {
|
|
147
|
+
if (!excludeMapValue?.(mapValue, id)) {
|
|
148
|
+
const objValue = valueMapper ? valueMapper(mapValue, id) : mapValue;
|
|
149
|
+
excludeObjValue?.(objValue) ? 0 : (obj[id] = objValue);
|
|
150
|
+
}
|
|
122
151
|
});
|
|
123
152
|
return obj;
|
|
124
153
|
};
|
|
125
|
-
const mapToObj2 = (map,
|
|
154
|
+
const mapToObj2 = (map, valueMapper, excludeMapValue) =>
|
|
126
155
|
mapToObj(
|
|
127
156
|
map,
|
|
128
|
-
(childMap) => mapToObj(childMap,
|
|
157
|
+
(childMap) => mapToObj(childMap, valueMapper, excludeMapValue),
|
|
158
|
+
collIsEmpty,
|
|
129
159
|
objIsEmpty,
|
|
130
160
|
);
|
|
131
|
-
const mapToObj3 = (map,
|
|
161
|
+
const mapToObj3 = (map, valueMapper, excludeMapValue) =>
|
|
132
162
|
mapToObj(
|
|
133
163
|
map,
|
|
134
|
-
(childMap) => mapToObj2(childMap,
|
|
164
|
+
(childMap) => mapToObj2(childMap, valueMapper, excludeMapValue),
|
|
165
|
+
collIsEmpty,
|
|
135
166
|
objIsEmpty,
|
|
136
167
|
);
|
|
137
168
|
const mapClone = (map, mapValue) => {
|
|
@@ -163,36 +194,40 @@ const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
|
|
|
163
194
|
},
|
|
164
195
|
);
|
|
165
196
|
|
|
166
|
-
const
|
|
167
|
-
const
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
if (
|
|
184
|
-
|
|
197
|
+
const textEncoder = new globalThis.TextEncoder();
|
|
198
|
+
const getHash = (value) => {
|
|
199
|
+
let hash = 2166136261;
|
|
200
|
+
arrayForEach(textEncoder.encode(value), (char) => {
|
|
201
|
+
hash ^= char;
|
|
202
|
+
hash +=
|
|
203
|
+
(hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);
|
|
204
|
+
});
|
|
205
|
+
return hash >>> 0;
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
const stampCloneWithHash = ([time, value, hash]) => [time, value, hash];
|
|
209
|
+
const stampClone = ([time, value]) => [time, value];
|
|
210
|
+
const getStampHash = (stamp) => stamp[2];
|
|
211
|
+
const hashIdAndHash = (id, hash) => getHash(id + ':' + hash);
|
|
212
|
+
const stampUpdate = (stamp, hash, time) => {
|
|
213
|
+
stamp[2] = hash >>> 0;
|
|
214
|
+
if (time > stamp[0]) {
|
|
215
|
+
stamp[0] = time;
|
|
185
216
|
}
|
|
186
|
-
merge(newThing, thingStamp[1], changes);
|
|
187
217
|
};
|
|
188
|
-
const
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
218
|
+
const stampNewObj = (time) => [time, objNew()];
|
|
219
|
+
const stampNewMap = (time = EMPTY_STRING) => [time, mapNew(), 0];
|
|
220
|
+
const stampMapToObjWithHash = (
|
|
221
|
+
[time, map, hash],
|
|
222
|
+
mapper = stampCloneWithHash,
|
|
223
|
+
) => [time, mapToObj(map, mapper), hash];
|
|
224
|
+
const stampValidate = (stamp, validateThing) =>
|
|
225
|
+
isArray(stamp) &&
|
|
226
|
+
size(stamp) == 3 &&
|
|
227
|
+
isString(stamp[0]) &&
|
|
228
|
+
validateThing(stamp[1]) &&
|
|
229
|
+
getTypeOf(stamp[2]) == NUMBER &&
|
|
230
|
+
isFiniteNumber(stamp[2]);
|
|
196
231
|
|
|
197
232
|
const setNew = (entryOrEntries) =>
|
|
198
233
|
new Set(
|
|
@@ -292,12 +327,15 @@ const pairNewMap = () => [mapNew(), mapNew()];
|
|
|
292
327
|
const pairClone = (array) => [...array];
|
|
293
328
|
const pairIsEqual = ([entry1, entry2]) => entry1 === entry2;
|
|
294
329
|
|
|
295
|
-
const getCellOrValueType = (
|
|
296
|
-
const type = getTypeOf(
|
|
297
|
-
return isTypeStringOrBoolean(type) ||
|
|
330
|
+
const getCellOrValueType = (cellOrValue) => {
|
|
331
|
+
const type = getTypeOf(cellOrValue);
|
|
332
|
+
return isTypeStringOrBoolean(type) ||
|
|
333
|
+
(type == NUMBER && isFiniteNumber(cellOrValue))
|
|
298
334
|
? type
|
|
299
335
|
: void 0;
|
|
300
336
|
};
|
|
337
|
+
const isCellOrValueOrNull = (cellOrValue) =>
|
|
338
|
+
cellOrValue === null || !isUndefined(getCellOrValueType(cellOrValue));
|
|
301
339
|
const setOrDelCell = (store, tableId, rowId, cellId, cell) =>
|
|
302
340
|
isUndefined(cell)
|
|
303
341
|
? store.delCell(tableId, rowId, cellId, true)
|
|
@@ -314,18 +352,6 @@ const jsonParse = JSON.parse;
|
|
|
314
352
|
const defaultSorter = (sortKey1, sortKey2) =>
|
|
315
353
|
(sortKey1 ?? 0) < (sortKey2 ?? 0) ? -1 : 1;
|
|
316
354
|
|
|
317
|
-
const validate = (obj, validateChild, onInvalidObj) => {
|
|
318
|
-
if (isUndefined(obj) || !isObject(obj) || objIsEmpty(obj) || objFrozen(obj)) {
|
|
319
|
-
onInvalidObj?.();
|
|
320
|
-
return false;
|
|
321
|
-
}
|
|
322
|
-
objToArray(obj, (child, id2) => {
|
|
323
|
-
if (!validateChild(child, id2)) {
|
|
324
|
-
objDel(obj, id2);
|
|
325
|
-
}
|
|
326
|
-
});
|
|
327
|
-
return !objIsEmpty(obj);
|
|
328
|
-
};
|
|
329
355
|
const idsChanged = (changedIds, id2, addedOrRemoved) =>
|
|
330
356
|
mapSet(
|
|
331
357
|
changedIds,
|
|
@@ -385,13 +411,13 @@ const createStore = () => {
|
|
|
385
411
|
const [addListener, callListeners, delListenerImpl, callListenerImpl] =
|
|
386
412
|
getListenerFunctions(() => store);
|
|
387
413
|
const validateTablesSchema = (tableSchema) =>
|
|
388
|
-
|
|
389
|
-
|
|
414
|
+
objValidate(tableSchema, (tableSchema2) =>
|
|
415
|
+
objValidate(tableSchema2, validateCellOrValueSchema),
|
|
390
416
|
);
|
|
391
417
|
const validateValuesSchema = (valuesSchema) =>
|
|
392
|
-
|
|
418
|
+
objValidate(valuesSchema, validateCellOrValueSchema);
|
|
393
419
|
const validateCellOrValueSchema = (schema) => {
|
|
394
|
-
if (!
|
|
420
|
+
if (!objValidate(schema, (_child, id2) => arrayHas([TYPE, DEFAULT], id2))) {
|
|
395
421
|
return false;
|
|
396
422
|
}
|
|
397
423
|
const type = schema[TYPE];
|
|
@@ -404,18 +430,18 @@ const createStore = () => {
|
|
|
404
430
|
return true;
|
|
405
431
|
};
|
|
406
432
|
const validateTables = (tables) =>
|
|
407
|
-
|
|
433
|
+
objValidate(tables, validateTable, cellInvalid);
|
|
408
434
|
const validateTable = (table, tableId) =>
|
|
409
435
|
(!hasTablesSchema ||
|
|
410
436
|
collHas(tablesSchemaMap, tableId) ||
|
|
411
437
|
cellInvalid(tableId)) &&
|
|
412
|
-
|
|
438
|
+
objValidate(
|
|
413
439
|
table,
|
|
414
440
|
(row, rowId) => validateRow(tableId, rowId, row),
|
|
415
441
|
() => cellInvalid(tableId),
|
|
416
442
|
);
|
|
417
443
|
const validateRow = (tableId, rowId, row, skipDefaults) =>
|
|
418
|
-
|
|
444
|
+
objValidate(
|
|
419
445
|
skipDefaults ? row : addDefaultsToRow(row, tableId, rowId),
|
|
420
446
|
(cell, cellId) =>
|
|
421
447
|
ifNotUndefined(
|
|
@@ -442,7 +468,7 @@ const createStore = () => {
|
|
|
442
468
|
? cellInvalid(tableId, rowId, cellId, cell)
|
|
443
469
|
: cell;
|
|
444
470
|
const validateValues = (values, skipDefaults) =>
|
|
445
|
-
|
|
471
|
+
objValidate(
|
|
446
472
|
skipDefaults ? values : addDefaultsToValues(values),
|
|
447
473
|
(value, valueId) =>
|
|
448
474
|
ifNotUndefined(
|
|
@@ -1285,17 +1311,20 @@ const createStore = () => {
|
|
|
1285
1311
|
: mapToObj(
|
|
1286
1312
|
row,
|
|
1287
1313
|
([, newCell]) => newCell,
|
|
1288
|
-
(
|
|
1314
|
+
(changedCell) => pairIsEqual(changedCell),
|
|
1289
1315
|
),
|
|
1316
|
+
collIsEmpty,
|
|
1290
1317
|
objIsEmpty,
|
|
1291
1318
|
),
|
|
1319
|
+
collIsEmpty,
|
|
1292
1320
|
objIsEmpty,
|
|
1293
1321
|
),
|
|
1294
1322
|
mapToObj(
|
|
1295
1323
|
changedValues,
|
|
1296
1324
|
([, newValue]) => newValue,
|
|
1297
|
-
(
|
|
1325
|
+
(changedValue) => pairIsEqual(changedValue),
|
|
1298
1326
|
),
|
|
1327
|
+
1,
|
|
1299
1328
|
];
|
|
1300
1329
|
const getTransactionLog = () => [
|
|
1301
1330
|
!collIsEmpty(changedCells),
|
|
@@ -1637,12 +1666,6 @@ const SHIFT12 = 2 ** 12;
|
|
|
1637
1666
|
const SHIFT6 = 2 ** 6;
|
|
1638
1667
|
const toB64 = (num) => String.fromCharCode(48 + (num & MASK6));
|
|
1639
1668
|
const fromB64 = (str, pos) => strCharCodeAt(str, pos) - 48;
|
|
1640
|
-
const hash = (value) =>
|
|
1641
|
-
arrayReduce(
|
|
1642
|
-
strSplit(value),
|
|
1643
|
-
(hash2, char) => ((hash2 << 5) + hash2) ^ strCharCodeAt(char),
|
|
1644
|
-
5381,
|
|
1645
|
-
) >>> 0;
|
|
1646
1669
|
const encodeHlc = (logicalTime42, counter24, clientHash30) =>
|
|
1647
1670
|
toB64(logicalTime42 / SHIFT36) +
|
|
1648
1671
|
toB64(logicalTime42 / SHIFT30) +
|
|
@@ -1681,17 +1704,20 @@ const decodeHlc = (hlc16) => [
|
|
|
1681
1704
|
const getHlcFunctions = (uniqueId) => {
|
|
1682
1705
|
let logicalTime = 0;
|
|
1683
1706
|
let lastCounter = -1;
|
|
1684
|
-
const uniqueIdHash =
|
|
1707
|
+
const uniqueIdHash = getHash(uniqueId);
|
|
1685
1708
|
const getHlc = () => {
|
|
1686
1709
|
seenHlc();
|
|
1687
1710
|
return encodeHlc(logicalTime, ++lastCounter, uniqueIdHash);
|
|
1688
1711
|
};
|
|
1689
1712
|
const seenHlc = (hlc) => {
|
|
1690
1713
|
const previousLogicalTime = logicalTime;
|
|
1691
|
-
const [remoteLogicalTime, remoteCounter] =
|
|
1692
|
-
? [0, 0]
|
|
1693
|
-
|
|
1694
|
-
|
|
1714
|
+
const [remoteLogicalTime, remoteCounter] =
|
|
1715
|
+
isUndefined(hlc) || hlc == '' ? [0, 0] : decodeHlc(hlc);
|
|
1716
|
+
logicalTime = mathMax(
|
|
1717
|
+
previousLogicalTime,
|
|
1718
|
+
remoteLogicalTime,
|
|
1719
|
+
globalThis.HLC_TIME ?? Date.now(),
|
|
1720
|
+
);
|
|
1695
1721
|
lastCounter =
|
|
1696
1722
|
logicalTime == previousLogicalTime
|
|
1697
1723
|
? logicalTime == remoteLogicalTime
|
|
@@ -1722,15 +1748,56 @@ const LISTENER_ARGS = {
|
|
|
1722
1748
|
InvalidCell: 3,
|
|
1723
1749
|
InvalidValue: 1,
|
|
1724
1750
|
};
|
|
1725
|
-
const
|
|
1751
|
+
const newContentStampMap = (time = EMPTY_STRING) => [
|
|
1726
1752
|
time,
|
|
1727
1753
|
[stampNewMap(time), stampNewMap(time)],
|
|
1754
|
+
0,
|
|
1728
1755
|
];
|
|
1756
|
+
const validateMergeableContent = (mergeableContent) =>
|
|
1757
|
+
stampValidate(
|
|
1758
|
+
mergeableContent,
|
|
1759
|
+
(content) =>
|
|
1760
|
+
isArray(content) &&
|
|
1761
|
+
size(content) == 2 &&
|
|
1762
|
+
stampValidate(content[0], (tableStamps) =>
|
|
1763
|
+
objValidate(
|
|
1764
|
+
tableStamps,
|
|
1765
|
+
(tableStamp) =>
|
|
1766
|
+
stampValidate(tableStamp, (rowStamps) =>
|
|
1767
|
+
objValidate(
|
|
1768
|
+
rowStamps,
|
|
1769
|
+
(rowStamp) =>
|
|
1770
|
+
stampValidate(rowStamp, (cellStamps) =>
|
|
1771
|
+
objValidate(
|
|
1772
|
+
cellStamps,
|
|
1773
|
+
(cellStamp) =>
|
|
1774
|
+
stampValidate(cellStamp, isCellOrValueOrNull),
|
|
1775
|
+
void 0,
|
|
1776
|
+
1,
|
|
1777
|
+
),
|
|
1778
|
+
),
|
|
1779
|
+
void 0,
|
|
1780
|
+
1,
|
|
1781
|
+
),
|
|
1782
|
+
),
|
|
1783
|
+
void 0,
|
|
1784
|
+
1,
|
|
1785
|
+
),
|
|
1786
|
+
) &&
|
|
1787
|
+
stampValidate(content[1], (values) =>
|
|
1788
|
+
objValidate(
|
|
1789
|
+
values,
|
|
1790
|
+
(value) => stampValidate(value, isCellOrValueOrNull),
|
|
1791
|
+
void 0,
|
|
1792
|
+
1,
|
|
1793
|
+
),
|
|
1794
|
+
),
|
|
1795
|
+
);
|
|
1729
1796
|
const createMergeableStore = (id) => {
|
|
1730
1797
|
let listening = 1;
|
|
1731
|
-
let
|
|
1798
|
+
let contentStampMap = newContentStampMap();
|
|
1732
1799
|
let transactionTime;
|
|
1733
|
-
let
|
|
1800
|
+
let transactionMergeableChanges;
|
|
1734
1801
|
const [getHlc, seenHlc] = getHlcFunctions(id);
|
|
1735
1802
|
const store = createStore();
|
|
1736
1803
|
const disableListening = (actions) => {
|
|
@@ -1738,137 +1805,294 @@ const createMergeableStore = (id) => {
|
|
|
1738
1805
|
listening = 0;
|
|
1739
1806
|
actions();
|
|
1740
1807
|
listening = wasListening;
|
|
1808
|
+
return mergeableStore;
|
|
1741
1809
|
};
|
|
1742
|
-
const
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1810
|
+
const mergeContentOrChanges = (contentOrChanges, hasHashes = 0) => {
|
|
1811
|
+
const tablesChanges = {};
|
|
1812
|
+
const valuesChanges = {};
|
|
1813
|
+
const [
|
|
1814
|
+
contentOrChangesTime,
|
|
1815
|
+
[[tablesTime, tablesObj, incomingTablesHash], values],
|
|
1816
|
+
incomingContentOrChangesHash,
|
|
1817
|
+
] = contentOrChanges;
|
|
1818
|
+
const [, [tablesStampMap, valuesStampMap]] = contentStampMap;
|
|
1819
|
+
const [oldTablesTime, tableStampMaps, oldTablesHash] = tablesStampMap;
|
|
1820
|
+
if (tablesTime) {
|
|
1821
|
+
let tablesHash = hasHashes
|
|
1822
|
+
? incomingTablesHash
|
|
1823
|
+
: oldTablesHash ^
|
|
1824
|
+
(tablesTime > oldTablesTime
|
|
1825
|
+
? (oldTablesTime ? getHash(oldTablesTime) : 0) ^ getHash(tablesTime)
|
|
1826
|
+
: 0);
|
|
1827
|
+
objForEach(
|
|
1828
|
+
tablesObj,
|
|
1829
|
+
([tableTime, rowsObj, incomingTableHash], tableId) => {
|
|
1830
|
+
const tableStampMap = mapEnsure(tableStampMaps, tableId, stampNewMap);
|
|
1831
|
+
const [oldTableTime, rowStampMaps, oldTableHash] = tableStampMap;
|
|
1832
|
+
let tableHash = hasHashes
|
|
1833
|
+
? incomingTableHash
|
|
1834
|
+
: oldTableHash ^
|
|
1835
|
+
(tableTime > oldTableTime
|
|
1836
|
+
? (oldTableTime ? getHash(oldTableTime) : 0) ^
|
|
1837
|
+
getHash(tableTime)
|
|
1838
|
+
: 0);
|
|
1839
|
+
objForEach(rowsObj, (row, rowId) => {
|
|
1840
|
+
const [oldRowHash, rowHash] = mergeCellsOrValues(
|
|
1841
|
+
row,
|
|
1842
|
+
mapEnsure(rowStampMaps, rowId, stampNewMap),
|
|
1843
|
+
objEnsure(
|
|
1844
|
+
objEnsure(tablesChanges, tableId, objNew),
|
|
1845
|
+
rowId,
|
|
1846
|
+
objNew,
|
|
1847
|
+
),
|
|
1848
|
+
hasHashes,
|
|
1763
1849
|
);
|
|
1850
|
+
tableHash ^= hasHashes
|
|
1851
|
+
? 0
|
|
1852
|
+
: (oldRowHash ? hashIdAndHash(rowId, oldRowHash) : 0) ^
|
|
1853
|
+
hashIdAndHash(rowId, rowHash);
|
|
1764
1854
|
});
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1855
|
+
stampUpdate(tableStampMap, tableHash, tableTime);
|
|
1856
|
+
tablesHash ^= hasHashes
|
|
1857
|
+
? 0
|
|
1858
|
+
: (oldTableHash ? hashIdAndHash(tableId, oldTableHash) : 0) ^
|
|
1859
|
+
hashIdAndHash(tableId, tableStampMap[2]);
|
|
1860
|
+
},
|
|
1861
|
+
);
|
|
1862
|
+
stampUpdate(tablesStampMap, tablesHash, tablesTime);
|
|
1773
1863
|
}
|
|
1864
|
+
mergeCellsOrValues(values, valuesStampMap, valuesChanges, hasHashes);
|
|
1865
|
+
stampUpdate(
|
|
1866
|
+
contentStampMap,
|
|
1867
|
+
hasHashes
|
|
1868
|
+
? incomingContentOrChangesHash
|
|
1869
|
+
: tablesStampMap[2] ^ valuesStampMap[2],
|
|
1870
|
+
contentOrChangesTime,
|
|
1871
|
+
);
|
|
1872
|
+
return [tablesChanges, valuesChanges, 1];
|
|
1774
1873
|
};
|
|
1775
|
-
const
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
|
|
1874
|
+
const mergeCellsOrValues = (
|
|
1875
|
+
things,
|
|
1876
|
+
thingsStampMap,
|
|
1877
|
+
thingsChanges,
|
|
1878
|
+
hasHashes,
|
|
1879
|
+
) => {
|
|
1880
|
+
const [thingsTime, thingsObj, incomingThingsHash] = things;
|
|
1881
|
+
const [oldThingsTime, thingStampMaps, oldThingsHash] = thingsStampMap;
|
|
1882
|
+
if (thingsTime) {
|
|
1883
|
+
let thingsHash = hasHashes
|
|
1884
|
+
? incomingThingsHash
|
|
1885
|
+
: oldThingsHash ^
|
|
1886
|
+
(thingsTime > oldThingsTime
|
|
1887
|
+
? (oldThingsTime ? getHash(oldThingsTime) : 0) ^ getHash(thingsTime)
|
|
1888
|
+
: 0);
|
|
1889
|
+
objForEach(
|
|
1890
|
+
thingsObj,
|
|
1891
|
+
([thingTime, thing, incomingThingHash], thingId) => {
|
|
1892
|
+
const thingStampMap = mapEnsure(thingStampMaps, thingId, () => [
|
|
1893
|
+
EMPTY_STRING,
|
|
1894
|
+
void 0,
|
|
1895
|
+
0,
|
|
1896
|
+
]);
|
|
1897
|
+
const [oldThingTime, , oldThingHash] = thingStampMap;
|
|
1898
|
+
if (thingTime > oldThingTime) {
|
|
1899
|
+
stampUpdate(
|
|
1900
|
+
thingStampMap,
|
|
1901
|
+
hasHashes
|
|
1902
|
+
? incomingThingHash
|
|
1903
|
+
: getHash(jsonString(thing ?? null) + ':' + thingTime),
|
|
1904
|
+
thingTime,
|
|
1905
|
+
);
|
|
1906
|
+
thingStampMap[1] = thing;
|
|
1907
|
+
thingsChanges[thingId] = thing;
|
|
1908
|
+
thingsHash ^= hasHashes
|
|
1909
|
+
? 0
|
|
1910
|
+
: hashIdAndHash(thingId, oldThingHash) ^
|
|
1911
|
+
hashIdAndHash(thingId, thingStampMap[2]);
|
|
1912
|
+
}
|
|
1913
|
+
},
|
|
1914
|
+
);
|
|
1915
|
+
stampUpdate(thingsStampMap, thingsHash, thingsTime);
|
|
1916
|
+
}
|
|
1917
|
+
return [oldThingsHash, thingsStampMap[2]];
|
|
1918
|
+
};
|
|
1919
|
+
const preFinishTransaction = () => {
|
|
1920
|
+
if (listening) {
|
|
1921
|
+
transactionMergeableChanges = getTransactionMergeableChanges();
|
|
1922
|
+
mergeContentOrChanges(transactionMergeableChanges);
|
|
1923
|
+
}
|
|
1782
1924
|
};
|
|
1783
|
-
const
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
1787
|
-
|
|
1925
|
+
const postFinishTransaction = () =>
|
|
1926
|
+
(transactionTime = transactionMergeableChanges = void 0);
|
|
1927
|
+
const getId = () => id;
|
|
1928
|
+
const getMergeableContent = () => [
|
|
1929
|
+
contentStampMap[0],
|
|
1930
|
+
[
|
|
1931
|
+
stampMapToObjWithHash(contentStampMap[1][0], (tableStampMap) =>
|
|
1932
|
+
stampMapToObjWithHash(tableStampMap, (rowStampMap) =>
|
|
1933
|
+
stampMapToObjWithHash(rowStampMap),
|
|
1788
1934
|
),
|
|
1789
1935
|
),
|
|
1790
|
-
|
|
1791
|
-
]
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
|
|
1936
|
+
stampMapToObjWithHash(contentStampMap[1][1]),
|
|
1937
|
+
],
|
|
1938
|
+
contentStampMap[2],
|
|
1939
|
+
];
|
|
1940
|
+
const getMergeableContentHashes = () => [
|
|
1941
|
+
contentStampMap[0],
|
|
1942
|
+
[contentStampMap[1][0][2], contentStampMap[1][1][2]],
|
|
1943
|
+
];
|
|
1944
|
+
const getMergeableTableHashes = () =>
|
|
1945
|
+
mapToObj(contentStampMap[1][0][1], getStampHash);
|
|
1946
|
+
const getMergeableTableIdsDiff = (relativeTo) => {
|
|
1947
|
+
const tableIds = [];
|
|
1948
|
+
mapForEach(contentStampMap[1][0][1], (tableId, [, , hash]) => {
|
|
1949
|
+
if (hash !== relativeTo?.[tableId]) {
|
|
1950
|
+
arrayPush(tableIds, tableId);
|
|
1951
|
+
}
|
|
1952
|
+
});
|
|
1953
|
+
return tableIds;
|
|
1954
|
+
};
|
|
1955
|
+
const getMergeableRowHashes = (tablesDelta) =>
|
|
1956
|
+
objNew(
|
|
1957
|
+
arrayMap(tablesDelta, (tableId) => [
|
|
1958
|
+
tableId,
|
|
1959
|
+
mapToObj(mapGet(contentStampMap[1][0][1], tableId)?.[1], getStampHash),
|
|
1960
|
+
]),
|
|
1798
1961
|
);
|
|
1799
|
-
|
|
1800
|
-
|
|
1962
|
+
const getMergeableRowIdsDiff = (relativeTo) =>
|
|
1963
|
+
objMap(relativeTo, (rowHashes, tableId) => {
|
|
1964
|
+
const rowIds = [];
|
|
1965
|
+
mapForEach(
|
|
1966
|
+
mapGet(contentStampMap[1][0][1], tableId)?.[1],
|
|
1967
|
+
(rowId, [, , hash]) => {
|
|
1968
|
+
if (hash !== rowHashes?.[rowId]) {
|
|
1969
|
+
arrayPush(rowIds, rowId);
|
|
1970
|
+
}
|
|
1971
|
+
},
|
|
1972
|
+
);
|
|
1973
|
+
return rowIds;
|
|
1974
|
+
});
|
|
1975
|
+
const getMergeableCellHashes = (tableDelta) =>
|
|
1976
|
+
objMap(tableDelta, (rowIds, tableId) =>
|
|
1977
|
+
objNew(
|
|
1978
|
+
arrayMap(rowIds, (rowId) => [
|
|
1979
|
+
rowId,
|
|
1980
|
+
mapToObj(
|
|
1981
|
+
mapGet(mapGet(contentStampMap[1][0][1], tableId)?.[1], rowId)?.[1],
|
|
1982
|
+
getStampHash,
|
|
1983
|
+
),
|
|
1984
|
+
]),
|
|
1985
|
+
),
|
|
1986
|
+
);
|
|
1987
|
+
const getMergeableTablesChanges = (relativeTo) => {
|
|
1988
|
+
const [, [[tablesTime, tableStampMaps]]] = contentStampMap;
|
|
1989
|
+
const tables = {};
|
|
1990
|
+
objForEach(relativeTo, (rowCellHashes, tableId) =>
|
|
1991
|
+
ifNotUndefined(
|
|
1992
|
+
mapGet(tableStampMaps, tableId),
|
|
1993
|
+
([tableTime, rowStampMaps]) => {
|
|
1994
|
+
const table = {};
|
|
1995
|
+
objForEach(rowCellHashes, (cellHashes, rowId) =>
|
|
1996
|
+
ifNotUndefined(
|
|
1997
|
+
mapGet(rowStampMaps, rowId),
|
|
1998
|
+
([rowTime, cellStampMaps]) => {
|
|
1999
|
+
const row = mapToObj(
|
|
2000
|
+
cellStampMaps,
|
|
2001
|
+
stampClone,
|
|
2002
|
+
([, , hash], cellId) => hash == cellHashes?.[cellId],
|
|
2003
|
+
);
|
|
2004
|
+
if (!objIsEmpty(row)) {
|
|
2005
|
+
table[rowId] = [rowTime, row];
|
|
2006
|
+
}
|
|
2007
|
+
},
|
|
2008
|
+
),
|
|
2009
|
+
);
|
|
2010
|
+
if (!objIsEmpty(table)) {
|
|
2011
|
+
tables[tableId] = [tableTime, table];
|
|
2012
|
+
}
|
|
2013
|
+
},
|
|
2014
|
+
),
|
|
2015
|
+
);
|
|
2016
|
+
return [tablesTime, tables];
|
|
1801
2017
|
};
|
|
2018
|
+
const getMergeableValuesHashes = () =>
|
|
2019
|
+
mapToObj(contentStampMap[1][1][1], getStampHash);
|
|
2020
|
+
const getMergeableValuesChanges = (relativeTo) => [
|
|
2021
|
+
contentStampMap[1][1][0],
|
|
2022
|
+
mapToObj(
|
|
2023
|
+
contentStampMap[1][1][1],
|
|
2024
|
+
stampClone,
|
|
2025
|
+
([, , hash], valueId) => hash == relativeTo?.[valueId],
|
|
2026
|
+
),
|
|
2027
|
+
];
|
|
2028
|
+
const setMergeableContent = (mergeableContent) =>
|
|
2029
|
+
disableListening(() =>
|
|
2030
|
+
validateMergeableContent(mergeableContent)
|
|
2031
|
+
? store.transaction(() => {
|
|
2032
|
+
store.delTables().delValues();
|
|
2033
|
+
contentStampMap = newContentStampMap();
|
|
2034
|
+
seenHlc(mergeableContent[0]);
|
|
2035
|
+
store.applyChanges(mergeContentOrChanges(mergeableContent, 1));
|
|
2036
|
+
})
|
|
2037
|
+
: 0,
|
|
2038
|
+
);
|
|
1802
2039
|
const getTransactionMergeableChanges = () => {
|
|
1803
|
-
if (isUndefined(
|
|
2040
|
+
if (isUndefined(transactionMergeableChanges)) {
|
|
1804
2041
|
const [, , changedCells, , changedValues] = store.getTransactionLog();
|
|
1805
2042
|
const time =
|
|
1806
2043
|
!objIsEmpty(changedCells) || !objIsEmpty(changedValues)
|
|
1807
2044
|
? transactionTime ?? (transactionTime = getHlc())
|
|
1808
2045
|
: EMPTY_STRING;
|
|
1809
|
-
const mergeableChanges =
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
|
|
2046
|
+
const mergeableChanges = [
|
|
2047
|
+
time,
|
|
2048
|
+
[
|
|
2049
|
+
stampNewObj(objIsEmpty(changedCells) ? EMPTY_STRING : time),
|
|
2050
|
+
stampNewObj(objIsEmpty(changedValues) ? EMPTY_STRING : time),
|
|
2051
|
+
1,
|
|
2052
|
+
],
|
|
2053
|
+
];
|
|
2054
|
+
const [[, tablesObj], [, valuesObj]] = mergeableChanges[1];
|
|
1814
2055
|
objToArray(changedCells, (changedTable, tableId) => {
|
|
1815
|
-
const [,
|
|
2056
|
+
const [, rowsObj] = (tablesObj[tableId] = stampNewObj(time));
|
|
1816
2057
|
objToArray(changedTable, (changedRow, rowId) => {
|
|
1817
|
-
const [,
|
|
2058
|
+
const [, cellsObj] = (rowsObj[rowId] = stampNewObj(time));
|
|
1818
2059
|
objToArray(
|
|
1819
2060
|
changedRow,
|
|
1820
|
-
([, newCell], cellId) =>
|
|
1821
|
-
(cellStamps[cellId] = stampNew(time, newCell)),
|
|
2061
|
+
([, newCell], cellId) => (cellsObj[cellId] = [time, newCell]),
|
|
1822
2062
|
);
|
|
1823
2063
|
});
|
|
1824
2064
|
});
|
|
1825
2065
|
objToArray(
|
|
1826
2066
|
changedValues,
|
|
1827
|
-
([, newValue], valueId) =>
|
|
1828
|
-
(valuesStamp[valueId] = stampNew(time, newValue)),
|
|
2067
|
+
([, newValue], valueId) => (valuesObj[valueId] = [time, newValue]),
|
|
1829
2068
|
);
|
|
1830
2069
|
return mergeableChanges;
|
|
1831
2070
|
}
|
|
1832
|
-
return
|
|
2071
|
+
return transactionMergeableChanges;
|
|
1833
2072
|
};
|
|
1834
|
-
const applyMergeableChanges = (
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
[tablesChanges, valuesChanges],
|
|
1845
|
-
) => {
|
|
1846
|
-
mergeStamp(
|
|
1847
|
-
newTablesStamp,
|
|
1848
|
-
tablesStamp,
|
|
1849
|
-
tablesChanges,
|
|
1850
|
-
(newTableStamps, tableStamps, tableChanges) =>
|
|
1851
|
-
mergeStamps(
|
|
1852
|
-
newTableStamps,
|
|
1853
|
-
tableStamps,
|
|
1854
|
-
tableChanges,
|
|
1855
|
-
(newRowStamps, rowStamps, rowChanges) =>
|
|
1856
|
-
mergeStamps(
|
|
1857
|
-
newRowStamps,
|
|
1858
|
-
rowStamps,
|
|
1859
|
-
rowChanges,
|
|
1860
|
-
mergeLeafStamps,
|
|
1861
|
-
),
|
|
1862
|
-
),
|
|
1863
|
-
);
|
|
1864
|
-
mergeStamp(newValuesStamp, valuesStamp, valuesChanges, mergeLeafStamps);
|
|
1865
|
-
},
|
|
1866
|
-
);
|
|
1867
|
-
disableListening(() => store.applyChanges(changes));
|
|
1868
|
-
return mergeableStore;
|
|
2073
|
+
const applyMergeableChanges = (mergeableChanges) =>
|
|
2074
|
+
disableListening(() => {
|
|
2075
|
+
seenHlc(mergeableChanges[0]);
|
|
2076
|
+
store.applyChanges(mergeContentOrChanges(mergeableChanges));
|
|
2077
|
+
});
|
|
2078
|
+
const merge = (mergeableStore2) => {
|
|
2079
|
+
const mergeableChanges = getMergeableContent();
|
|
2080
|
+
const mergeableChanges2 = mergeableStore2.getMergeableContent();
|
|
2081
|
+
mergeableStore2.applyMergeableChanges(mergeableChanges);
|
|
2082
|
+
return applyMergeableChanges(mergeableChanges2);
|
|
1869
2083
|
};
|
|
1870
2084
|
const mergeableStore = {
|
|
2085
|
+
getId,
|
|
1871
2086
|
getMergeableContent,
|
|
2087
|
+
getMergeableContentHashes,
|
|
2088
|
+
getMergeableTableHashes,
|
|
2089
|
+
getMergeableTableIdsDiff,
|
|
2090
|
+
getMergeableRowHashes,
|
|
2091
|
+
getMergeableRowIdsDiff,
|
|
2092
|
+
getMergeableCellHashes,
|
|
2093
|
+
getMergeableTablesChanges,
|
|
2094
|
+
getMergeableValuesHashes,
|
|
2095
|
+
getMergeableValuesChanges,
|
|
1872
2096
|
setMergeableContent,
|
|
1873
2097
|
getTransactionMergeableChanges,
|
|
1874
2098
|
applyMergeableChanges,
|