tinybase 4.8.16 → 4.8.17
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 -0
- package/lib/checkpoints.js.gz +0 -0
- package/lib/cjs/checkpoints.cjs +1 -0
- package/lib/cjs/checkpoints.cjs.gz +0 -0
- package/lib/cjs/common.cjs +1 -0
- package/lib/cjs/common.cjs.gz +0 -0
- package/lib/cjs/indexes.cjs +1 -0
- package/lib/cjs/indexes.cjs.gz +0 -0
- package/lib/cjs/metrics.cjs +1 -0
- package/lib/cjs/metrics.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-automerge.cjs +1 -0
- package/lib/cjs/persisters/persister-automerge.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-browser.cjs +1 -0
- package/lib/cjs/persisters/persister-browser.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -0
- package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-electric-sql.cjs +1 -0
- package/lib/cjs/persisters/persister-electric-sql.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-expo-sqlite-next.cjs +1 -0
- package/lib/cjs/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-expo-sqlite.cjs +1 -0
- package/lib/cjs/persisters/persister-expo-sqlite.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-file.cjs +1 -0
- package/lib/cjs/persisters/persister-file.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-indexed-db.cjs +1 -0
- 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 -0
- package/lib/cjs/persisters/persister-partykit-client.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-partykit-server.cjs +1 -0
- package/lib/cjs/persisters/persister-partykit-server.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 -0
- package/lib/cjs/persisters/persister-remote.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -0
- package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-sqlite3.cjs +1 -0
- package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-yjs.cjs +1 -0
- package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
- package/lib/cjs/persisters.cjs +1 -0
- package/lib/cjs/persisters.cjs.gz +0 -0
- package/lib/cjs/queries.cjs +1 -0
- package/lib/cjs/queries.cjs.gz +0 -0
- package/lib/cjs/relationships.cjs +1 -0
- package/lib/cjs/relationships.cjs.gz +0 -0
- package/lib/cjs/store.cjs +1 -0
- package/lib/cjs/store.cjs.gz +0 -0
- package/lib/cjs/tinybase.cjs +1 -0
- package/lib/cjs/tinybase.cjs.gz +0 -0
- package/lib/cjs/tools.cjs +1 -0
- package/lib/cjs/tools.cjs.gz +0 -0
- package/lib/cjs/ui-react-dom-debug.cjs +1 -0
- package/lib/cjs/ui-react-dom-debug.cjs.gz +0 -0
- package/lib/cjs/ui-react-dom.cjs +1 -0
- package/lib/cjs/ui-react-dom.cjs.gz +0 -0
- package/lib/cjs/ui-react.cjs +1 -0
- package/lib/cjs/ui-react.cjs.gz +0 -0
- package/lib/cjs-es6/checkpoints.cjs +1 -0
- package/lib/cjs-es6/checkpoints.cjs.gz +0 -0
- package/lib/cjs-es6/common.cjs +1 -0
- package/lib/cjs-es6/common.cjs.gz +0 -0
- package/lib/cjs-es6/indexes.cjs +1 -0
- package/lib/cjs-es6/indexes.cjs.gz +0 -0
- package/lib/cjs-es6/metrics.cjs +1 -0
- package/lib/cjs-es6/metrics.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-browser.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-browser.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-electric-sql.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-electric-sql.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-file.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-indexed-db.cjs +1 -0
- 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 -0
- package/lib/cjs-es6/persisters/persister-partykit-client.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-partykit-server.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-partykit-server.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 -0
- package/lib/cjs-es6/persisters/persister-remote.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
- package/lib/cjs-es6/persisters.cjs +1 -0
- package/lib/cjs-es6/persisters.cjs.gz +0 -0
- package/lib/cjs-es6/queries.cjs +1 -0
- package/lib/cjs-es6/queries.cjs.gz +0 -0
- package/lib/cjs-es6/relationships.cjs +1 -0
- package/lib/cjs-es6/relationships.cjs.gz +0 -0
- package/lib/cjs-es6/store.cjs +1 -0
- package/lib/cjs-es6/store.cjs.gz +0 -0
- package/lib/cjs-es6/tinybase.cjs +1 -0
- package/lib/cjs-es6/tinybase.cjs.gz +0 -0
- package/lib/cjs-es6/tools.cjs +1 -0
- package/lib/cjs-es6/tools.cjs.gz +0 -0
- package/lib/cjs-es6/ui-react-dom-debug.cjs +1 -0
- package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
- package/lib/cjs-es6/ui-react-dom.cjs +1 -0
- package/lib/cjs-es6/ui-react-dom.cjs.gz +0 -0
- package/lib/cjs-es6/ui-react.cjs +1 -0
- package/lib/cjs-es6/ui-react.cjs.gz +0 -0
- package/lib/common.js +1 -0
- package/lib/common.js.gz +0 -0
- package/lib/debug/checkpoints.js +412 -0
- package/lib/debug/common.js +4 -0
- package/lib/debug/indexes.js +544 -0
- package/lib/debug/metrics.js +516 -0
- package/lib/debug/persisters.js +183 -0
- package/lib/debug/queries.js +807 -0
- package/lib/debug/relationships.js +526 -0
- package/lib/debug/store.js +1602 -0
- package/lib/es6/checkpoints.js +1 -0
- package/lib/es6/checkpoints.js.gz +0 -0
- package/lib/es6/common.js +1 -0
- package/lib/es6/common.js.gz +0 -0
- package/lib/es6/indexes.js +1 -0
- package/lib/es6/indexes.js.gz +0 -0
- package/lib/es6/metrics.js +1 -0
- package/lib/es6/metrics.js.gz +0 -0
- package/lib/es6/persisters/persister-automerge.js +1 -0
- package/lib/es6/persisters/persister-automerge.js.gz +0 -0
- package/lib/es6/persisters/persister-browser.js +1 -0
- package/lib/es6/persisters/persister-browser.js.gz +0 -0
- package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -0
- package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/es6/persisters/persister-electric-sql.js +1 -0
- package/lib/es6/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/es6/persisters/persister-expo-sqlite-next.js +1 -0
- package/lib/es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
- package/lib/es6/persisters/persister-expo-sqlite.js +1 -0
- package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/es6/persisters/persister-file.js +1 -0
- package/lib/es6/persisters/persister-file.js.gz +0 -0
- package/lib/es6/persisters/persister-indexed-db.js +1 -0
- 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 -0
- package/lib/es6/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/es6/persisters/persister-partykit-server.js +1 -0
- package/lib/es6/persisters/persister-partykit-server.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 -0
- package/lib/es6/persisters/persister-remote.js.gz +0 -0
- package/lib/es6/persisters/persister-sqlite-wasm.js +1 -0
- package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/es6/persisters/persister-sqlite3.js +1 -0
- package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/es6/persisters/persister-yjs.js +1 -0
- package/lib/es6/persisters/persister-yjs.js.gz +0 -0
- package/lib/es6/persisters.js +1 -0
- package/lib/es6/persisters.js.gz +0 -0
- package/lib/es6/queries.js +1 -0
- package/lib/es6/queries.js.gz +0 -0
- package/lib/es6/relationships.js +1 -0
- package/lib/es6/relationships.js.gz +0 -0
- package/lib/es6/store.js +1 -0
- package/lib/es6/store.js.gz +0 -0
- package/lib/es6/tinybase.js +1 -0
- package/lib/es6/tinybase.js.gz +0 -0
- package/lib/es6/tools.js +1 -0
- package/lib/es6/tools.js.gz +0 -0
- package/lib/es6/ui-react-dom-debug.js +1 -0
- package/lib/es6/ui-react-dom-debug.js.gz +0 -0
- package/lib/es6/ui-react-dom.js +1 -0
- package/lib/es6/ui-react-dom.js.gz +0 -0
- package/lib/es6/ui-react.js +1 -0
- package/lib/es6/ui-react.js.gz +0 -0
- package/lib/indexes.js +1 -0
- package/lib/indexes.js.gz +0 -0
- package/lib/metrics.js +1 -0
- package/lib/metrics.js.gz +0 -0
- package/lib/persisters/persister-automerge.js +1 -0
- package/lib/persisters/persister-automerge.js.gz +0 -0
- package/lib/persisters/persister-browser.js +1 -0
- package/lib/persisters/persister-browser.js.gz +0 -0
- package/lib/persisters/persister-cr-sqlite-wasm.js +1 -0
- package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/persisters/persister-electric-sql.js +1 -0
- package/lib/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/persisters/persister-expo-sqlite-next.js +1 -0
- package/lib/persisters/persister-expo-sqlite-next.js.gz +0 -0
- package/lib/persisters/persister-expo-sqlite.js +1 -0
- package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/persisters/persister-file.js +1 -0
- package/lib/persisters/persister-file.js.gz +0 -0
- package/lib/persisters/persister-indexed-db.js +1 -0
- 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 -0
- package/lib/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/persisters/persister-partykit-server.js +1 -0
- package/lib/persisters/persister-partykit-server.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 -0
- package/lib/persisters/persister-remote.js.gz +0 -0
- package/lib/persisters/persister-sqlite-wasm.js +1 -0
- package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/persisters/persister-sqlite3.js +1 -0
- package/lib/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/persisters/persister-yjs.js +1 -0
- package/lib/persisters/persister-yjs.js.gz +0 -0
- package/lib/persisters.js +1 -0
- package/lib/persisters.js.gz +0 -0
- package/lib/queries.js +1 -0
- package/lib/queries.js.gz +0 -0
- package/lib/relationships.js +1 -0
- package/lib/relationships.js.gz +0 -0
- package/lib/store.js +1 -0
- package/lib/store.js.gz +0 -0
- package/lib/tinybase.js +1 -0
- package/lib/tinybase.js.gz +0 -0
- package/lib/tools.js +1 -0
- package/lib/tools.js.gz +0 -0
- package/lib/ui-react-dom.js +1 -0
- package/lib/ui-react-dom.js.gz +0 -0
- package/lib/ui-react.js +1 -0
- package/lib/ui-react.js.gz +0 -0
- package/lib/umd/checkpoints.js +1 -0
- package/lib/umd/checkpoints.js.gz +0 -0
- package/lib/umd/common.js +1 -0
- package/lib/umd/common.js.gz +0 -0
- package/lib/umd/indexes.js +1 -0
- package/lib/umd/indexes.js.gz +0 -0
- package/lib/umd/metrics.js +1 -0
- package/lib/umd/metrics.js.gz +0 -0
- package/lib/umd/persisters/persister-automerge.js +1 -0
- package/lib/umd/persisters/persister-automerge.js.gz +0 -0
- package/lib/umd/persisters/persister-browser.js +1 -0
- package/lib/umd/persisters/persister-browser.js.gz +0 -0
- package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -0
- package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/umd/persisters/persister-electric-sql.js +1 -0
- package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/umd/persisters/persister-expo-sqlite-next.js +1 -0
- package/lib/umd/persisters/persister-expo-sqlite-next.js.gz +0 -0
- package/lib/umd/persisters/persister-expo-sqlite.js +1 -0
- package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/umd/persisters/persister-file.js +1 -0
- package/lib/umd/persisters/persister-file.js.gz +0 -0
- package/lib/umd/persisters/persister-indexed-db.js +1 -0
- 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 -0
- package/lib/umd/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/umd/persisters/persister-partykit-server.js +1 -0
- package/lib/umd/persisters/persister-partykit-server.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 -0
- package/lib/umd/persisters/persister-remote.js.gz +0 -0
- package/lib/umd/persisters/persister-sqlite-wasm.js +1 -0
- package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/umd/persisters/persister-sqlite3.js +1 -0
- package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/umd/persisters/persister-yjs.js +1 -0
- package/lib/umd/persisters/persister-yjs.js.gz +0 -0
- package/lib/umd/persisters.js +1 -0
- package/lib/umd/persisters.js.gz +0 -0
- package/lib/umd/queries.js +1 -0
- package/lib/umd/queries.js.gz +0 -0
- package/lib/umd/relationships.js +1 -0
- package/lib/umd/relationships.js.gz +0 -0
- package/lib/umd/store.js +1 -0
- package/lib/umd/store.js.gz +0 -0
- package/lib/umd/tinybase.js +1 -0
- package/lib/umd/tinybase.js.gz +0 -0
- package/lib/umd/tools.js +1 -0
- package/lib/umd/tools.js.gz +0 -0
- package/lib/umd/ui-react-dom-debug.js +1 -0
- package/lib/umd/ui-react-dom-debug.js.gz +0 -0
- package/lib/umd/ui-react-dom.js +1 -0
- package/lib/umd/ui-react-dom.js.gz +0 -0
- package/lib/umd/ui-react.js +1 -0
- package/lib/umd/ui-react.js.gz +0 -0
- package/lib/umd-es6/checkpoints.js +1 -0
- package/lib/umd-es6/checkpoints.js.gz +0 -0
- package/lib/umd-es6/common.js +1 -0
- package/lib/umd-es6/common.js.gz +0 -0
- package/lib/umd-es6/indexes.js +1 -0
- package/lib/umd-es6/indexes.js.gz +0 -0
- package/lib/umd-es6/metrics.js +1 -0
- package/lib/umd-es6/metrics.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-automerge.js +1 -0
- package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-browser.js +1 -0
- package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -0
- package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-electric-sql.js +1 -0
- package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-expo-sqlite-next.js +1 -0
- package/lib/umd-es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -0
- package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-file.js +1 -0
- package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-indexed-db.js +1 -0
- 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 -0
- package/lib/umd-es6/persisters/persister-partykit-client.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-partykit-server.js +1 -0
- package/lib/umd-es6/persisters/persister-partykit-server.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 -0
- package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -0
- package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-sqlite3.js +1 -0
- package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-yjs.js +1 -0
- package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
- package/lib/umd-es6/persisters.js +1 -0
- package/lib/umd-es6/persisters.js.gz +0 -0
- package/lib/umd-es6/queries.js +1 -0
- package/lib/umd-es6/queries.js.gz +0 -0
- package/lib/umd-es6/relationships.js +1 -0
- package/lib/umd-es6/relationships.js.gz +0 -0
- package/lib/umd-es6/store.js +1 -0
- package/lib/umd-es6/store.js.gz +0 -0
- package/lib/umd-es6/tinybase.js +1 -0
- package/lib/umd-es6/tinybase.js.gz +0 -0
- package/lib/umd-es6/tools.js +1 -0
- package/lib/umd-es6/tools.js.gz +0 -0
- package/lib/umd-es6/ui-react-dom-debug.js +1 -0
- package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
- package/lib/umd-es6/ui-react-dom.js +1 -0
- package/lib/umd-es6/ui-react-dom.js.gz +0 -0
- package/lib/umd-es6/ui-react.js +1 -0
- package/lib/umd-es6/ui-react.js.gz +0 -0
- package/package.json +1 -1
- package/readme.md +2 -2
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
const EMPTY_STRING = '';
|
|
2
|
+
|
|
3
|
+
const isUndefined = (thing) => thing == void 0;
|
|
4
|
+
const ifNotUndefined = (value, then, otherwise) =>
|
|
5
|
+
isUndefined(value) ? otherwise?.() : then(value);
|
|
6
|
+
const isArray = (thing) => Array.isArray(thing);
|
|
7
|
+
const size = (arrayOrString) => arrayOrString.length;
|
|
8
|
+
const test = (regex, subject) => regex.test(subject);
|
|
9
|
+
|
|
10
|
+
const arrayHas = (array, value) => array.includes(value);
|
|
11
|
+
const arrayForEach = (array, cb) => array.forEach(cb);
|
|
12
|
+
const arrayIsEmpty = (array) => size(array) == 0;
|
|
13
|
+
const arrayReduce = (array, cb, initial) => array.reduce(cb, initial);
|
|
14
|
+
const arrayClear = (array, to) => array.splice(0, to);
|
|
15
|
+
const arrayPush = (array, ...values) => array.push(...values);
|
|
16
|
+
const arrayPop = (array) => array.pop();
|
|
17
|
+
const arrayUnshift = (array, ...values) => array.unshift(...values);
|
|
18
|
+
const arrayShift = (array) => array.shift();
|
|
19
|
+
|
|
20
|
+
const object = Object;
|
|
21
|
+
const objFreeze = object.freeze;
|
|
22
|
+
|
|
23
|
+
const collSizeN = (collSizer) => (coll) =>
|
|
24
|
+
arrayReduce(collValues(coll), (total, coll2) => total + collSizer(coll2), 0);
|
|
25
|
+
const collSize = (coll) => coll?.size ?? 0;
|
|
26
|
+
const collSize2 = collSizeN(collSize);
|
|
27
|
+
const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
|
|
28
|
+
const collIsEmpty = (coll) => isUndefined(coll) || collSize(coll) == 0;
|
|
29
|
+
const collValues = (coll) => [...(coll?.values() ?? [])];
|
|
30
|
+
const collForEach = (coll, cb) => coll?.forEach(cb);
|
|
31
|
+
const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
|
|
32
|
+
|
|
33
|
+
const mapNew = (entries) => new Map(entries);
|
|
34
|
+
const mapGet = (map, key) => map?.get(key);
|
|
35
|
+
const mapForEach = (map, cb) =>
|
|
36
|
+
collForEach(map, (value, key) => cb(key, value));
|
|
37
|
+
const mapSet = (map, key, value) =>
|
|
38
|
+
isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
|
|
39
|
+
const mapEnsure = (map, key, getDefaultValue) => {
|
|
40
|
+
if (!collHas(map, key)) {
|
|
41
|
+
mapSet(map, key, getDefaultValue());
|
|
42
|
+
}
|
|
43
|
+
return mapGet(map, key);
|
|
44
|
+
};
|
|
45
|
+
const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
|
|
46
|
+
ifNotUndefined(
|
|
47
|
+
(ensureLeaf ? mapEnsure : mapGet)(
|
|
48
|
+
node,
|
|
49
|
+
path[p],
|
|
50
|
+
p > size(path) - 2 ? ensureLeaf : mapNew,
|
|
51
|
+
),
|
|
52
|
+
(nodeOrLeaf) => {
|
|
53
|
+
if (p > size(path) - 2) {
|
|
54
|
+
if (pruneLeaf?.(nodeOrLeaf)) {
|
|
55
|
+
mapSet(node, path[p]);
|
|
56
|
+
}
|
|
57
|
+
return nodeOrLeaf;
|
|
58
|
+
}
|
|
59
|
+
const leaf = visitTree(nodeOrLeaf, path, ensureLeaf, pruneLeaf, p + 1);
|
|
60
|
+
if (collIsEmpty(nodeOrLeaf)) {
|
|
61
|
+
mapSet(node, path[p]);
|
|
62
|
+
}
|
|
63
|
+
return leaf;
|
|
64
|
+
},
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
const setOrDelCell = (store, tableId, rowId, cellId, cell) =>
|
|
68
|
+
isUndefined(cell)
|
|
69
|
+
? store.delCell(tableId, rowId, cellId, true)
|
|
70
|
+
: store.setCell(tableId, rowId, cellId, cell);
|
|
71
|
+
const setOrDelValue = (store, valueId, value) =>
|
|
72
|
+
isUndefined(value) ? store.delValue(valueId) : store.setValue(valueId, value);
|
|
73
|
+
|
|
74
|
+
const setNew = (entryOrEntries) =>
|
|
75
|
+
new Set(
|
|
76
|
+
isArray(entryOrEntries) || isUndefined(entryOrEntries)
|
|
77
|
+
? entryOrEntries
|
|
78
|
+
: [entryOrEntries],
|
|
79
|
+
);
|
|
80
|
+
const setAdd = (set, value) => set?.add(value);
|
|
81
|
+
|
|
82
|
+
const getCreateFunction = (getFunction) => {
|
|
83
|
+
const getFunctionsByStore = /* @__PURE__ */ new WeakMap();
|
|
84
|
+
return (store) => {
|
|
85
|
+
if (!getFunctionsByStore.has(store)) {
|
|
86
|
+
getFunctionsByStore.set(store, getFunction(store));
|
|
87
|
+
}
|
|
88
|
+
return getFunctionsByStore.get(store);
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
const INTEGER = /^\d+$/;
|
|
93
|
+
const getPoolFunctions = () => {
|
|
94
|
+
const pool = [];
|
|
95
|
+
let nextId = 0;
|
|
96
|
+
return [
|
|
97
|
+
(reuse) => (reuse ? arrayShift(pool) : null) ?? EMPTY_STRING + nextId++,
|
|
98
|
+
(id) => {
|
|
99
|
+
if (test(INTEGER, id) && size(pool) < 1e3) {
|
|
100
|
+
arrayPush(pool, id);
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
];
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const getWildcardedLeaves = (deepIdSet, path = [EMPTY_STRING]) => {
|
|
107
|
+
const leaves = [];
|
|
108
|
+
const deep = (node, p) =>
|
|
109
|
+
p == size(path)
|
|
110
|
+
? arrayPush(leaves, node)
|
|
111
|
+
: path[p] === null
|
|
112
|
+
? collForEach(node, (node2) => deep(node2, p + 1))
|
|
113
|
+
: arrayForEach([path[p], null], (id) => deep(mapGet(node, id), p + 1));
|
|
114
|
+
deep(deepIdSet, 0);
|
|
115
|
+
return leaves;
|
|
116
|
+
};
|
|
117
|
+
const getListenerFunctions = (getThing) => {
|
|
118
|
+
let thing;
|
|
119
|
+
const [getId, releaseId] = getPoolFunctions();
|
|
120
|
+
const allListeners = mapNew();
|
|
121
|
+
const addListener = (
|
|
122
|
+
listener,
|
|
123
|
+
idSetNode,
|
|
124
|
+
path,
|
|
125
|
+
pathGetters = [],
|
|
126
|
+
extraArgsGetter = () => [],
|
|
127
|
+
) => {
|
|
128
|
+
thing ??= getThing();
|
|
129
|
+
const id = getId(1);
|
|
130
|
+
mapSet(allListeners, id, [
|
|
131
|
+
listener,
|
|
132
|
+
idSetNode,
|
|
133
|
+
path,
|
|
134
|
+
pathGetters,
|
|
135
|
+
extraArgsGetter,
|
|
136
|
+
]);
|
|
137
|
+
setAdd(visitTree(idSetNode, path ?? [EMPTY_STRING], setNew), id);
|
|
138
|
+
return id;
|
|
139
|
+
};
|
|
140
|
+
const callListeners = (idSetNode, ids, ...extraArgs) =>
|
|
141
|
+
arrayForEach(getWildcardedLeaves(idSetNode, ids), (set) =>
|
|
142
|
+
collForEach(set, (id) =>
|
|
143
|
+
mapGet(allListeners, id)[0](thing, ...(ids ?? []), ...extraArgs),
|
|
144
|
+
),
|
|
145
|
+
);
|
|
146
|
+
const delListener = (id) =>
|
|
147
|
+
ifNotUndefined(mapGet(allListeners, id), ([, idSetNode, idOrNulls]) => {
|
|
148
|
+
visitTree(idSetNode, idOrNulls ?? [EMPTY_STRING], void 0, (idSet) => {
|
|
149
|
+
collDel(idSet, id);
|
|
150
|
+
return collIsEmpty(idSet) ? 1 : 0;
|
|
151
|
+
});
|
|
152
|
+
mapSet(allListeners, id);
|
|
153
|
+
releaseId(id);
|
|
154
|
+
return idOrNulls;
|
|
155
|
+
});
|
|
156
|
+
const callListener = (id) =>
|
|
157
|
+
ifNotUndefined(
|
|
158
|
+
mapGet(allListeners, id),
|
|
159
|
+
([listener, , path = [], pathGetters, extraArgsGetter]) => {
|
|
160
|
+
const callWithIds = (...ids) => {
|
|
161
|
+
const index = size(ids);
|
|
162
|
+
index == size(path)
|
|
163
|
+
? listener(thing, ...ids, ...extraArgsGetter(ids))
|
|
164
|
+
: isUndefined(path[index])
|
|
165
|
+
? arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
|
|
166
|
+
callWithIds(...ids, id2),
|
|
167
|
+
)
|
|
168
|
+
: callWithIds(...ids, path[index]);
|
|
169
|
+
};
|
|
170
|
+
callWithIds();
|
|
171
|
+
},
|
|
172
|
+
);
|
|
173
|
+
return [addListener, callListeners, delListener, callListener];
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
const createCheckpoints = getCreateFunction((store) => {
|
|
177
|
+
let backwardIdsSize = 100;
|
|
178
|
+
let currentId;
|
|
179
|
+
let cellsDelta = mapNew();
|
|
180
|
+
let valuesDelta = mapNew();
|
|
181
|
+
let listening = 1;
|
|
182
|
+
let nextCheckpointId;
|
|
183
|
+
let checkpointsChanged;
|
|
184
|
+
const checkpointIdsListeners = mapNew();
|
|
185
|
+
const checkpointListeners = mapNew();
|
|
186
|
+
const [addListener, callListeners, delListenerImpl] = getListenerFunctions(
|
|
187
|
+
() => checkpoints,
|
|
188
|
+
);
|
|
189
|
+
const deltas = mapNew();
|
|
190
|
+
const labels = mapNew();
|
|
191
|
+
const backwardIds = [];
|
|
192
|
+
const forwardIds = [];
|
|
193
|
+
const updateStore = (oldOrNew, checkpointId) => {
|
|
194
|
+
listening = 0;
|
|
195
|
+
store.transaction(() => {
|
|
196
|
+
const [cellsDelta2, valuesDelta2] = mapGet(deltas, checkpointId);
|
|
197
|
+
collForEach(cellsDelta2, (table, tableId) =>
|
|
198
|
+
collForEach(table, (row, rowId) =>
|
|
199
|
+
collForEach(row, (oldNew, cellId) =>
|
|
200
|
+
setOrDelCell(store, tableId, rowId, cellId, oldNew[oldOrNew]),
|
|
201
|
+
),
|
|
202
|
+
),
|
|
203
|
+
);
|
|
204
|
+
collForEach(valuesDelta2, (oldNew, valueId) =>
|
|
205
|
+
setOrDelValue(store, valueId, oldNew[oldOrNew]),
|
|
206
|
+
);
|
|
207
|
+
});
|
|
208
|
+
listening = 1;
|
|
209
|
+
};
|
|
210
|
+
const clearCheckpointId = (checkpointId) => {
|
|
211
|
+
mapSet(deltas, checkpointId);
|
|
212
|
+
mapSet(labels, checkpointId);
|
|
213
|
+
callListeners(checkpointListeners, [checkpointId]);
|
|
214
|
+
};
|
|
215
|
+
const clearCheckpointIds = (checkpointIds, to) =>
|
|
216
|
+
arrayForEach(
|
|
217
|
+
arrayClear(checkpointIds, to ?? size(checkpointIds)),
|
|
218
|
+
clearCheckpointId,
|
|
219
|
+
);
|
|
220
|
+
const trimBackwardsIds = () =>
|
|
221
|
+
clearCheckpointIds(backwardIds, size(backwardIds) - backwardIdsSize);
|
|
222
|
+
const storeChanged = () =>
|
|
223
|
+
ifNotUndefined(currentId, () => {
|
|
224
|
+
arrayPush(backwardIds, currentId);
|
|
225
|
+
trimBackwardsIds();
|
|
226
|
+
clearCheckpointIds(forwardIds);
|
|
227
|
+
currentId = void 0;
|
|
228
|
+
checkpointsChanged = 1;
|
|
229
|
+
});
|
|
230
|
+
const storeUnchanged = () => {
|
|
231
|
+
currentId = arrayPop(backwardIds);
|
|
232
|
+
checkpointsChanged = 1;
|
|
233
|
+
};
|
|
234
|
+
const cellListenerId = store.addCellListener(
|
|
235
|
+
null,
|
|
236
|
+
null,
|
|
237
|
+
null,
|
|
238
|
+
(_store, tableId, rowId, cellId, newCell, oldCell) => {
|
|
239
|
+
if (listening) {
|
|
240
|
+
storeChanged();
|
|
241
|
+
const table = mapEnsure(cellsDelta, tableId, mapNew);
|
|
242
|
+
const row = mapEnsure(table, rowId, mapNew);
|
|
243
|
+
const oldNew = mapEnsure(row, cellId, () => [oldCell, void 0]);
|
|
244
|
+
oldNew[1] = newCell;
|
|
245
|
+
if (
|
|
246
|
+
oldNew[0] === newCell &&
|
|
247
|
+
collIsEmpty(mapSet(row, cellId)) &&
|
|
248
|
+
collIsEmpty(mapSet(table, rowId)) &&
|
|
249
|
+
collIsEmpty(mapSet(cellsDelta, tableId))
|
|
250
|
+
) {
|
|
251
|
+
storeUnchanged();
|
|
252
|
+
}
|
|
253
|
+
callListenersIfChanged();
|
|
254
|
+
}
|
|
255
|
+
},
|
|
256
|
+
);
|
|
257
|
+
const valueListenerId = store.addValueListener(
|
|
258
|
+
null,
|
|
259
|
+
(_store, valueId, newValue, oldValue) => {
|
|
260
|
+
if (listening) {
|
|
261
|
+
storeChanged();
|
|
262
|
+
const oldNew = mapEnsure(valuesDelta, valueId, () => [
|
|
263
|
+
oldValue,
|
|
264
|
+
void 0,
|
|
265
|
+
]);
|
|
266
|
+
oldNew[1] = newValue;
|
|
267
|
+
if (
|
|
268
|
+
oldNew[0] === newValue &&
|
|
269
|
+
collIsEmpty(mapSet(valuesDelta, valueId))
|
|
270
|
+
) {
|
|
271
|
+
storeUnchanged();
|
|
272
|
+
}
|
|
273
|
+
callListenersIfChanged();
|
|
274
|
+
}
|
|
275
|
+
},
|
|
276
|
+
);
|
|
277
|
+
const addCheckpointImpl = (label = EMPTY_STRING) => {
|
|
278
|
+
if (isUndefined(currentId)) {
|
|
279
|
+
currentId = EMPTY_STRING + nextCheckpointId++;
|
|
280
|
+
mapSet(deltas, currentId, [cellsDelta, valuesDelta]);
|
|
281
|
+
setCheckpoint(currentId, label);
|
|
282
|
+
cellsDelta = mapNew();
|
|
283
|
+
valuesDelta = mapNew();
|
|
284
|
+
checkpointsChanged = 1;
|
|
285
|
+
}
|
|
286
|
+
return currentId;
|
|
287
|
+
};
|
|
288
|
+
const goBackwardImpl = () => {
|
|
289
|
+
if (!arrayIsEmpty(backwardIds)) {
|
|
290
|
+
arrayUnshift(forwardIds, addCheckpointImpl());
|
|
291
|
+
updateStore(0, currentId);
|
|
292
|
+
currentId = arrayPop(backwardIds);
|
|
293
|
+
checkpointsChanged = 1;
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
const goForwardImpl = () => {
|
|
297
|
+
if (!arrayIsEmpty(forwardIds)) {
|
|
298
|
+
arrayPush(backwardIds, currentId);
|
|
299
|
+
currentId = arrayShift(forwardIds);
|
|
300
|
+
updateStore(1, currentId);
|
|
301
|
+
checkpointsChanged = 1;
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
const callListenersIfChanged = () => {
|
|
305
|
+
if (checkpointsChanged) {
|
|
306
|
+
callListeners(checkpointIdsListeners);
|
|
307
|
+
checkpointsChanged = 0;
|
|
308
|
+
}
|
|
309
|
+
};
|
|
310
|
+
const setSize = (size2) => {
|
|
311
|
+
backwardIdsSize = size2;
|
|
312
|
+
trimBackwardsIds();
|
|
313
|
+
return checkpoints;
|
|
314
|
+
};
|
|
315
|
+
const addCheckpoint = (label) => {
|
|
316
|
+
const id = addCheckpointImpl(label);
|
|
317
|
+
callListenersIfChanged();
|
|
318
|
+
return id;
|
|
319
|
+
};
|
|
320
|
+
const setCheckpoint = (checkpointId, label) => {
|
|
321
|
+
if (hasCheckpoint(checkpointId) && mapGet(labels, checkpointId) !== label) {
|
|
322
|
+
mapSet(labels, checkpointId, label);
|
|
323
|
+
callListeners(checkpointListeners, [checkpointId]);
|
|
324
|
+
}
|
|
325
|
+
return checkpoints;
|
|
326
|
+
};
|
|
327
|
+
const getStore = () => store;
|
|
328
|
+
const getCheckpointIds = () => [[...backwardIds], currentId, [...forwardIds]];
|
|
329
|
+
const forEachCheckpoint = (checkpointCallback) =>
|
|
330
|
+
mapForEach(labels, checkpointCallback);
|
|
331
|
+
const hasCheckpoint = (checkpointId) => collHas(deltas, checkpointId);
|
|
332
|
+
const getCheckpoint = (checkpointId) => mapGet(labels, checkpointId);
|
|
333
|
+
const goBackward = () => {
|
|
334
|
+
goBackwardImpl();
|
|
335
|
+
callListenersIfChanged();
|
|
336
|
+
return checkpoints;
|
|
337
|
+
};
|
|
338
|
+
const goForward = () => {
|
|
339
|
+
goForwardImpl();
|
|
340
|
+
callListenersIfChanged();
|
|
341
|
+
return checkpoints;
|
|
342
|
+
};
|
|
343
|
+
const goTo = (checkpointId) => {
|
|
344
|
+
const action = arrayHas(backwardIds, checkpointId)
|
|
345
|
+
? goBackwardImpl
|
|
346
|
+
: arrayHas(forwardIds, checkpointId)
|
|
347
|
+
? goForwardImpl
|
|
348
|
+
: null;
|
|
349
|
+
while (!isUndefined(action) && checkpointId != currentId) {
|
|
350
|
+
action();
|
|
351
|
+
}
|
|
352
|
+
callListenersIfChanged();
|
|
353
|
+
return checkpoints;
|
|
354
|
+
};
|
|
355
|
+
const addCheckpointIdsListener = (listener) =>
|
|
356
|
+
addListener(listener, checkpointIdsListeners);
|
|
357
|
+
const addCheckpointListener = (checkpointId, listener) =>
|
|
358
|
+
addListener(listener, checkpointListeners, [checkpointId]);
|
|
359
|
+
const delListener = (listenerId) => {
|
|
360
|
+
delListenerImpl(listenerId);
|
|
361
|
+
return checkpoints;
|
|
362
|
+
};
|
|
363
|
+
const clear = () => {
|
|
364
|
+
clearCheckpointIds(backwardIds);
|
|
365
|
+
clearCheckpointIds(forwardIds);
|
|
366
|
+
if (!isUndefined(currentId)) {
|
|
367
|
+
clearCheckpointId(currentId);
|
|
368
|
+
}
|
|
369
|
+
currentId = void 0;
|
|
370
|
+
nextCheckpointId = 0;
|
|
371
|
+
addCheckpoint();
|
|
372
|
+
return checkpoints;
|
|
373
|
+
};
|
|
374
|
+
const clearForward = () => {
|
|
375
|
+
if (!arrayIsEmpty(forwardIds)) {
|
|
376
|
+
clearCheckpointIds(forwardIds);
|
|
377
|
+
callListeners(checkpointIdsListeners);
|
|
378
|
+
}
|
|
379
|
+
return checkpoints;
|
|
380
|
+
};
|
|
381
|
+
const destroy = () => {
|
|
382
|
+
store.delListener(cellListenerId);
|
|
383
|
+
store.delListener(valueListenerId);
|
|
384
|
+
};
|
|
385
|
+
const getListenerStats = () => ({
|
|
386
|
+
checkpointIds: collSize2(checkpointIdsListeners),
|
|
387
|
+
checkpoint: collSize2(checkpointListeners),
|
|
388
|
+
});
|
|
389
|
+
const checkpoints = {
|
|
390
|
+
setSize,
|
|
391
|
+
addCheckpoint,
|
|
392
|
+
setCheckpoint,
|
|
393
|
+
getStore,
|
|
394
|
+
getCheckpointIds,
|
|
395
|
+
forEachCheckpoint,
|
|
396
|
+
hasCheckpoint,
|
|
397
|
+
getCheckpoint,
|
|
398
|
+
goBackward,
|
|
399
|
+
goForward,
|
|
400
|
+
goTo,
|
|
401
|
+
addCheckpointIdsListener,
|
|
402
|
+
addCheckpointListener,
|
|
403
|
+
delListener,
|
|
404
|
+
clear,
|
|
405
|
+
clearForward,
|
|
406
|
+
destroy,
|
|
407
|
+
getListenerStats,
|
|
408
|
+
};
|
|
409
|
+
return objFreeze(checkpoints.clear());
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
export {createCheckpoints};
|