tinybase 5.1.3 → 5.1.5
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/@types/common/index.d.cts +34 -2
- package/@types/common/index.d.ts +34 -2
- package/@types/common/with-schemas/index.d.cts +34 -2
- package/@types/common/with-schemas/index.d.ts +34 -2
- package/@types/synchronizers/synchronizer-local/index.d.cts +1 -0
- package/@types/synchronizers/synchronizer-local/index.d.ts +1 -0
- package/@types/synchronizers/synchronizer-local/with-schemas/index.d.cts +1 -0
- package/@types/synchronizers/synchronizer-local/with-schemas/index.d.ts +1 -0
- package/checkpoints/index.js +9 -7
- package/checkpoints/with-schemas/index.js +9 -7
- package/cjs/checkpoints/index.cjs +9 -7
- package/cjs/checkpoints/with-schemas/index.cjs +9 -7
- package/cjs/es6/checkpoints/index.cjs +15 -13
- package/cjs/es6/checkpoints/with-schemas/index.cjs +15 -13
- package/cjs/es6/index.cjs +28 -20
- package/cjs/es6/indexes/index.cjs +15 -13
- package/cjs/es6/indexes/with-schemas/index.cjs +15 -13
- package/cjs/es6/mergeable-store/index.cjs +23 -17
- package/cjs/es6/mergeable-store/with-schemas/index.cjs +23 -17
- package/cjs/es6/metrics/index.cjs +15 -13
- package/cjs/es6/metrics/with-schemas/index.cjs +15 -13
- package/cjs/es6/min/index.cjs +1 -1
- package/cjs/es6/min/index.cjs.gz +0 -0
- package/cjs/es6/min/mergeable-store/index.cjs +1 -1
- package/cjs/es6/min/mergeable-store/index.cjs.gz +0 -0
- package/cjs/es6/min/mergeable-store/with-schemas/index.cjs +1 -1
- package/cjs/es6/min/mergeable-store/with-schemas/index.cjs.gz +0 -0
- package/cjs/es6/min/persisters/persister-automerge/index.cjs +1 -1
- package/cjs/es6/min/persisters/persister-automerge/index.cjs.gz +0 -0
- package/cjs/es6/min/persisters/persister-automerge/with-schemas/index.cjs +1 -1
- package/cjs/es6/min/persisters/persister-automerge/with-schemas/index.cjs.gz +0 -0
- package/cjs/es6/min/store/index.cjs +1 -1
- package/cjs/es6/min/store/index.cjs.gz +0 -0
- package/cjs/es6/min/store/with-schemas/index.cjs +1 -1
- package/cjs/es6/min/store/with-schemas/index.cjs.gz +0 -0
- package/cjs/es6/min/ui-react-inspector/index.cjs +1 -1
- package/cjs/es6/min/ui-react-inspector/index.cjs.gz +0 -0
- package/cjs/es6/min/ui-react-inspector/with-schemas/index.cjs +1 -1
- package/cjs/es6/min/ui-react-inspector/with-schemas/index.cjs.gz +0 -0
- package/cjs/es6/min/with-schemas/index.cjs +1 -1
- package/cjs/es6/min/with-schemas/index.cjs.gz +0 -0
- package/cjs/es6/persisters/index.cjs +5 -3
- package/cjs/es6/persisters/persister-automerge/index.cjs +7 -4
- package/cjs/es6/persisters/persister-automerge/with-schemas/index.cjs +7 -4
- package/cjs/es6/persisters/persister-browser/index.cjs +5 -3
- package/cjs/es6/persisters/persister-browser/with-schemas/index.cjs +5 -3
- package/cjs/es6/persisters/persister-cr-sqlite-wasm/index.cjs +8 -4
- package/cjs/es6/persisters/persister-cr-sqlite-wasm/with-schemas/index.cjs +8 -4
- package/cjs/es6/persisters/persister-electric-sql/index.cjs +8 -4
- package/cjs/es6/persisters/persister-electric-sql/with-schemas/index.cjs +8 -4
- package/cjs/es6/persisters/persister-expo-sqlite/index.cjs +8 -4
- package/cjs/es6/persisters/persister-expo-sqlite/with-schemas/index.cjs +8 -4
- package/cjs/es6/persisters/persister-file/index.cjs +5 -3
- package/cjs/es6/persisters/persister-file/with-schemas/index.cjs +5 -3
- package/cjs/es6/persisters/persister-indexed-db/index.cjs +5 -3
- package/cjs/es6/persisters/persister-indexed-db/with-schemas/index.cjs +5 -3
- package/cjs/es6/persisters/persister-libsql/index.cjs +8 -4
- package/cjs/es6/persisters/persister-libsql/with-schemas/index.cjs +8 -4
- package/cjs/es6/persisters/persister-partykit-client/index.cjs +5 -3
- package/cjs/es6/persisters/persister-partykit-client/with-schemas/index.cjs +5 -3
- package/cjs/es6/persisters/persister-partykit-server/index.cjs +36 -22
- package/cjs/es6/persisters/persister-partykit-server/with-schemas/index.cjs +36 -22
- package/cjs/es6/persisters/persister-powersync/index.cjs +8 -4
- package/cjs/es6/persisters/persister-powersync/with-schemas/index.cjs +8 -4
- package/cjs/es6/persisters/persister-remote/index.cjs +5 -3
- package/cjs/es6/persisters/persister-remote/with-schemas/index.cjs +5 -3
- package/cjs/es6/persisters/persister-sqlite-wasm/index.cjs +8 -4
- package/cjs/es6/persisters/persister-sqlite-wasm/with-schemas/index.cjs +8 -4
- package/cjs/es6/persisters/persister-sqlite3/index.cjs +8 -4
- package/cjs/es6/persisters/persister-sqlite3/with-schemas/index.cjs +8 -4
- package/cjs/es6/persisters/persister-yjs/index.cjs +5 -3
- package/cjs/es6/persisters/persister-yjs/with-schemas/index.cjs +5 -3
- package/cjs/es6/persisters/with-schemas/index.cjs +5 -3
- package/cjs/es6/relationships/index.cjs +15 -13
- package/cjs/es6/relationships/with-schemas/index.cjs +15 -13
- package/cjs/es6/store/index.cjs +23 -17
- package/cjs/es6/store/with-schemas/index.cjs +23 -17
- package/cjs/es6/synchronizers/index.cjs +5 -3
- package/cjs/es6/synchronizers/synchronizer-broadcast-channel/index.cjs +5 -3
- package/cjs/es6/synchronizers/synchronizer-broadcast-channel/with-schemas/index.cjs +5 -3
- package/cjs/es6/synchronizers/synchronizer-local/index.cjs +5 -3
- package/cjs/es6/synchronizers/synchronizer-local/with-schemas/index.cjs +5 -3
- package/cjs/es6/synchronizers/synchronizer-ws-client/index.cjs +8 -6
- package/cjs/es6/synchronizers/synchronizer-ws-client/with-schemas/index.cjs +8 -6
- package/cjs/es6/synchronizers/synchronizer-ws-server/index.cjs +39 -33
- package/cjs/es6/synchronizers/synchronizer-ws-server/with-schemas/index.cjs +39 -33
- package/cjs/es6/synchronizers/with-schemas/index.cjs +5 -3
- package/cjs/es6/ui-react-inspector/index.cjs +30 -21
- package/cjs/es6/ui-react-inspector/with-schemas/index.cjs +30 -21
- package/cjs/es6/with-schemas/index.cjs +28 -20
- package/cjs/index.cjs +22 -12
- package/cjs/indexes/index.cjs +9 -7
- package/cjs/indexes/with-schemas/index.cjs +9 -7
- package/cjs/mergeable-store/index.cjs +17 -9
- package/cjs/mergeable-store/with-schemas/index.cjs +17 -9
- package/cjs/metrics/index.cjs +9 -7
- package/cjs/metrics/with-schemas/index.cjs +9 -7
- package/cjs/min/index.cjs +1 -1
- package/cjs/min/index.cjs.gz +0 -0
- package/cjs/min/mergeable-store/index.cjs +1 -1
- package/cjs/min/mergeable-store/index.cjs.gz +0 -0
- package/cjs/min/mergeable-store/with-schemas/index.cjs +1 -1
- package/cjs/min/mergeable-store/with-schemas/index.cjs.gz +0 -0
- package/cjs/min/persisters/persister-automerge/index.cjs +1 -1
- package/cjs/min/persisters/persister-automerge/index.cjs.gz +0 -0
- package/cjs/min/persisters/persister-automerge/with-schemas/index.cjs +1 -1
- package/cjs/min/persisters/persister-automerge/with-schemas/index.cjs.gz +0 -0
- package/cjs/min/store/index.cjs +1 -1
- package/cjs/min/store/index.cjs.gz +0 -0
- package/cjs/min/store/with-schemas/index.cjs +1 -1
- package/cjs/min/store/with-schemas/index.cjs.gz +0 -0
- package/cjs/min/tools/index.cjs +1 -1
- package/cjs/min/tools/index.cjs.gz +0 -0
- package/cjs/min/tools/with-schemas/index.cjs +1 -1
- package/cjs/min/tools/with-schemas/index.cjs.gz +0 -0
- package/cjs/min/ui-react-inspector/index.cjs +1 -1
- package/cjs/min/ui-react-inspector/index.cjs.gz +0 -0
- package/cjs/min/ui-react-inspector/with-schemas/index.cjs +1 -1
- package/cjs/min/ui-react-inspector/with-schemas/index.cjs.gz +0 -0
- package/cjs/min/with-schemas/index.cjs +1 -1
- package/cjs/min/with-schemas/index.cjs.gz +0 -0
- package/cjs/persisters/index.cjs +5 -3
- package/cjs/persisters/persister-automerge/index.cjs +7 -4
- package/cjs/persisters/persister-automerge/with-schemas/index.cjs +7 -4
- package/cjs/persisters/persister-browser/index.cjs +5 -3
- package/cjs/persisters/persister-browser/with-schemas/index.cjs +5 -3
- package/cjs/persisters/persister-cr-sqlite-wasm/index.cjs +8 -4
- package/cjs/persisters/persister-cr-sqlite-wasm/with-schemas/index.cjs +8 -4
- package/cjs/persisters/persister-electric-sql/index.cjs +8 -4
- package/cjs/persisters/persister-electric-sql/with-schemas/index.cjs +8 -4
- package/cjs/persisters/persister-expo-sqlite/index.cjs +8 -4
- package/cjs/persisters/persister-expo-sqlite/with-schemas/index.cjs +8 -4
- package/cjs/persisters/persister-file/index.cjs +5 -3
- package/cjs/persisters/persister-file/with-schemas/index.cjs +5 -3
- package/cjs/persisters/persister-indexed-db/index.cjs +5 -3
- package/cjs/persisters/persister-indexed-db/with-schemas/index.cjs +5 -3
- package/cjs/persisters/persister-libsql/index.cjs +8 -4
- package/cjs/persisters/persister-libsql/with-schemas/index.cjs +8 -4
- package/cjs/persisters/persister-partykit-client/index.cjs +5 -3
- package/cjs/persisters/persister-partykit-client/with-schemas/index.cjs +5 -3
- package/cjs/persisters/persister-partykit-server/index.cjs +36 -25
- package/cjs/persisters/persister-partykit-server/with-schemas/index.cjs +36 -25
- package/cjs/persisters/persister-powersync/index.cjs +8 -4
- package/cjs/persisters/persister-powersync/with-schemas/index.cjs +8 -4
- package/cjs/persisters/persister-remote/index.cjs +5 -3
- package/cjs/persisters/persister-remote/with-schemas/index.cjs +5 -3
- package/cjs/persisters/persister-sqlite-wasm/index.cjs +8 -4
- package/cjs/persisters/persister-sqlite-wasm/with-schemas/index.cjs +8 -4
- package/cjs/persisters/persister-sqlite3/index.cjs +8 -4
- package/cjs/persisters/persister-sqlite3/with-schemas/index.cjs +8 -4
- package/cjs/persisters/persister-yjs/index.cjs +5 -3
- package/cjs/persisters/persister-yjs/with-schemas/index.cjs +5 -3
- package/cjs/persisters/with-schemas/index.cjs +5 -3
- package/cjs/relationships/index.cjs +9 -7
- package/cjs/relationships/with-schemas/index.cjs +9 -7
- package/cjs/store/index.cjs +17 -9
- package/cjs/store/with-schemas/index.cjs +17 -9
- package/cjs/synchronizers/index.cjs +5 -3
- package/cjs/synchronizers/synchronizer-broadcast-channel/index.cjs +5 -3
- package/cjs/synchronizers/synchronizer-broadcast-channel/with-schemas/index.cjs +5 -3
- package/cjs/synchronizers/synchronizer-local/index.cjs +5 -3
- package/cjs/synchronizers/synchronizer-local/with-schemas/index.cjs +5 -3
- package/cjs/synchronizers/synchronizer-ws-client/index.cjs +8 -6
- package/cjs/synchronizers/synchronizer-ws-client/with-schemas/index.cjs +8 -6
- package/cjs/synchronizers/synchronizer-ws-server/index.cjs +28 -22
- package/cjs/synchronizers/synchronizer-ws-server/with-schemas/index.cjs +28 -22
- package/cjs/synchronizers/with-schemas/index.cjs +5 -3
- package/cjs/tools/index.cjs +1 -1
- package/cjs/tools/with-schemas/index.cjs +1 -1
- package/cjs/ui-react-inspector/index.cjs +24 -13
- package/cjs/ui-react-inspector/with-schemas/index.cjs +24 -13
- package/cjs/with-schemas/index.cjs +22 -12
- package/es6/checkpoints/index.js +15 -13
- package/es6/checkpoints/with-schemas/index.js +15 -13
- package/es6/index.js +28 -20
- package/es6/indexes/index.js +15 -13
- package/es6/indexes/with-schemas/index.js +15 -13
- package/es6/mergeable-store/index.js +23 -17
- package/es6/mergeable-store/with-schemas/index.js +23 -17
- package/es6/metrics/index.js +15 -13
- package/es6/metrics/with-schemas/index.js +15 -13
- package/es6/min/index.js +1 -1
- package/es6/min/index.js.gz +0 -0
- package/es6/min/mergeable-store/index.js +1 -1
- package/es6/min/mergeable-store/index.js.gz +0 -0
- package/es6/min/mergeable-store/with-schemas/index.js +1 -1
- package/es6/min/mergeable-store/with-schemas/index.js.gz +0 -0
- package/es6/min/persisters/persister-automerge/index.js +1 -1
- package/es6/min/persisters/persister-automerge/index.js.gz +0 -0
- package/es6/min/persisters/persister-automerge/with-schemas/index.js +1 -1
- package/es6/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
- package/es6/min/store/index.js +1 -1
- package/es6/min/store/index.js.gz +0 -0
- package/es6/min/store/with-schemas/index.js +1 -1
- package/es6/min/store/with-schemas/index.js.gz +0 -0
- package/es6/min/ui-react-inspector/index.js +1 -1
- package/es6/min/ui-react-inspector/index.js.gz +0 -0
- package/es6/min/ui-react-inspector/with-schemas/index.js +1 -1
- package/es6/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
- package/es6/min/with-schemas/index.js +1 -1
- package/es6/min/with-schemas/index.js.gz +0 -0
- package/es6/persisters/index.js +5 -3
- package/es6/persisters/persister-automerge/index.js +7 -4
- package/es6/persisters/persister-automerge/with-schemas/index.js +7 -4
- package/es6/persisters/persister-browser/index.js +5 -3
- package/es6/persisters/persister-browser/with-schemas/index.js +5 -3
- package/es6/persisters/persister-cr-sqlite-wasm/index.js +8 -4
- package/es6/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +8 -4
- package/es6/persisters/persister-electric-sql/index.js +8 -4
- package/es6/persisters/persister-electric-sql/with-schemas/index.js +8 -4
- package/es6/persisters/persister-expo-sqlite/index.js +8 -4
- package/es6/persisters/persister-expo-sqlite/with-schemas/index.js +8 -4
- package/es6/persisters/persister-file/index.js +5 -3
- package/es6/persisters/persister-file/with-schemas/index.js +5 -3
- package/es6/persisters/persister-indexed-db/index.js +5 -3
- package/es6/persisters/persister-indexed-db/with-schemas/index.js +5 -3
- package/es6/persisters/persister-libsql/index.js +8 -4
- package/es6/persisters/persister-libsql/with-schemas/index.js +8 -4
- package/es6/persisters/persister-partykit-client/index.js +5 -3
- package/es6/persisters/persister-partykit-client/with-schemas/index.js +5 -3
- package/es6/persisters/persister-partykit-server/index.js +36 -22
- package/es6/persisters/persister-partykit-server/with-schemas/index.js +36 -22
- package/es6/persisters/persister-powersync/index.js +8 -4
- package/es6/persisters/persister-powersync/with-schemas/index.js +8 -4
- package/es6/persisters/persister-remote/index.js +5 -3
- package/es6/persisters/persister-remote/with-schemas/index.js +5 -3
- package/es6/persisters/persister-sqlite-wasm/index.js +8 -4
- package/es6/persisters/persister-sqlite-wasm/with-schemas/index.js +8 -4
- package/es6/persisters/persister-sqlite3/index.js +8 -4
- package/es6/persisters/persister-sqlite3/with-schemas/index.js +8 -4
- package/es6/persisters/persister-yjs/index.js +5 -3
- package/es6/persisters/persister-yjs/with-schemas/index.js +5 -3
- package/es6/persisters/with-schemas/index.js +5 -3
- package/es6/relationships/index.js +15 -13
- package/es6/relationships/with-schemas/index.js +15 -13
- package/es6/store/index.js +23 -17
- package/es6/store/with-schemas/index.js +23 -17
- package/es6/synchronizers/index.js +5 -3
- package/es6/synchronizers/synchronizer-broadcast-channel/index.js +5 -3
- package/es6/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +5 -3
- package/es6/synchronizers/synchronizer-local/index.js +5 -3
- package/es6/synchronizers/synchronizer-local/with-schemas/index.js +5 -3
- package/es6/synchronizers/synchronizer-ws-client/index.js +8 -6
- package/es6/synchronizers/synchronizer-ws-client/with-schemas/index.js +8 -6
- package/es6/synchronizers/synchronizer-ws-server/index.js +39 -33
- package/es6/synchronizers/synchronizer-ws-server/with-schemas/index.js +39 -33
- package/es6/synchronizers/with-schemas/index.js +5 -3
- package/es6/ui-react-inspector/index.js +30 -21
- package/es6/ui-react-inspector/with-schemas/index.js +30 -21
- package/es6/with-schemas/index.js +28 -20
- package/index.js +22 -12
- package/indexes/index.js +9 -7
- package/indexes/with-schemas/index.js +9 -7
- package/mergeable-store/index.js +17 -9
- package/mergeable-store/with-schemas/index.js +17 -9
- package/metrics/index.js +9 -7
- package/metrics/with-schemas/index.js +9 -7
- package/min/index.js +1 -1
- package/min/index.js.gz +0 -0
- package/min/mergeable-store/index.js +1 -1
- package/min/mergeable-store/index.js.gz +0 -0
- package/min/mergeable-store/with-schemas/index.js +1 -1
- package/min/mergeable-store/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-automerge/index.js +1 -1
- package/min/persisters/persister-automerge/index.js.gz +0 -0
- package/min/persisters/persister-automerge/with-schemas/index.js +1 -1
- package/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
- package/min/store/index.js +1 -1
- package/min/store/index.js.gz +0 -0
- package/min/store/with-schemas/index.js +1 -1
- package/min/store/with-schemas/index.js.gz +0 -0
- package/min/tools/index.js +1 -1
- package/min/tools/index.js.gz +0 -0
- package/min/tools/with-schemas/index.js +1 -1
- package/min/tools/with-schemas/index.js.gz +0 -0
- package/min/ui-react-inspector/index.js +1 -1
- package/min/ui-react-inspector/index.js.gz +0 -0
- package/min/ui-react-inspector/with-schemas/index.js +1 -1
- package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
- package/min/with-schemas/index.js +1 -1
- package/min/with-schemas/index.js.gz +0 -0
- package/package.json +3 -3
- package/persisters/index.js +5 -3
- package/persisters/persister-automerge/index.js +7 -4
- package/persisters/persister-automerge/with-schemas/index.js +7 -4
- package/persisters/persister-browser/index.js +5 -3
- package/persisters/persister-browser/with-schemas/index.js +5 -3
- package/persisters/persister-cr-sqlite-wasm/index.js +8 -4
- package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +8 -4
- package/persisters/persister-electric-sql/index.js +8 -4
- package/persisters/persister-electric-sql/with-schemas/index.js +8 -4
- package/persisters/persister-expo-sqlite/index.js +8 -4
- package/persisters/persister-expo-sqlite/with-schemas/index.js +8 -4
- package/persisters/persister-file/index.js +5 -3
- package/persisters/persister-file/with-schemas/index.js +5 -3
- package/persisters/persister-indexed-db/index.js +5 -3
- package/persisters/persister-indexed-db/with-schemas/index.js +5 -3
- package/persisters/persister-libsql/index.js +8 -4
- package/persisters/persister-libsql/with-schemas/index.js +8 -4
- package/persisters/persister-partykit-client/index.js +5 -3
- package/persisters/persister-partykit-client/with-schemas/index.js +5 -3
- package/persisters/persister-partykit-server/index.js +36 -25
- package/persisters/persister-partykit-server/with-schemas/index.js +36 -25
- package/persisters/persister-powersync/index.js +8 -4
- package/persisters/persister-powersync/with-schemas/index.js +8 -4
- package/persisters/persister-remote/index.js +5 -3
- package/persisters/persister-remote/with-schemas/index.js +5 -3
- package/persisters/persister-sqlite-wasm/index.js +8 -4
- package/persisters/persister-sqlite-wasm/with-schemas/index.js +8 -4
- package/persisters/persister-sqlite3/index.js +8 -4
- package/persisters/persister-sqlite3/with-schemas/index.js +8 -4
- package/persisters/persister-yjs/index.js +5 -3
- package/persisters/persister-yjs/with-schemas/index.js +5 -3
- package/persisters/with-schemas/index.js +5 -3
- package/readme.md +2 -2
- package/relationships/index.js +9 -7
- package/relationships/with-schemas/index.js +9 -7
- package/store/index.js +17 -9
- package/store/with-schemas/index.js +17 -9
- package/synchronizers/index.js +5 -3
- package/synchronizers/synchronizer-broadcast-channel/index.js +5 -3
- package/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +5 -3
- package/synchronizers/synchronizer-local/index.js +5 -3
- package/synchronizers/synchronizer-local/with-schemas/index.js +5 -3
- package/synchronizers/synchronizer-ws-client/index.js +8 -6
- package/synchronizers/synchronizer-ws-client/with-schemas/index.js +8 -6
- package/synchronizers/synchronizer-ws-server/index.js +28 -22
- package/synchronizers/synchronizer-ws-server/with-schemas/index.js +28 -22
- package/synchronizers/with-schemas/index.js +5 -3
- package/tools/index.js +1 -1
- package/tools/with-schemas/index.js +1 -1
- package/ui-react-inspector/index.js +24 -13
- package/ui-react-inspector/with-schemas/index.js +24 -13
- package/umd/checkpoints/index.js +9 -7
- package/umd/checkpoints/with-schemas/index.js +9 -7
- package/umd/es6/checkpoints/index.js +15 -13
- package/umd/es6/checkpoints/with-schemas/index.js +15 -13
- package/umd/es6/index.js +28 -20
- package/umd/es6/indexes/index.js +15 -13
- package/umd/es6/indexes/with-schemas/index.js +15 -13
- package/umd/es6/mergeable-store/index.js +23 -17
- package/umd/es6/mergeable-store/with-schemas/index.js +23 -17
- package/umd/es6/metrics/index.js +15 -13
- package/umd/es6/metrics/with-schemas/index.js +15 -13
- package/umd/es6/min/index.js +1 -1
- package/umd/es6/min/index.js.gz +0 -0
- package/umd/es6/min/mergeable-store/index.js +1 -1
- package/umd/es6/min/mergeable-store/index.js.gz +0 -0
- package/umd/es6/min/mergeable-store/with-schemas/index.js +1 -1
- package/umd/es6/min/mergeable-store/with-schemas/index.js.gz +0 -0
- package/umd/es6/min/persisters/persister-automerge/index.js +1 -1
- package/umd/es6/min/persisters/persister-automerge/index.js.gz +0 -0
- package/umd/es6/min/persisters/persister-automerge/with-schemas/index.js +1 -1
- package/umd/es6/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
- package/umd/es6/min/store/index.js +1 -1
- package/umd/es6/min/store/index.js.gz +0 -0
- package/umd/es6/min/store/with-schemas/index.js +1 -1
- package/umd/es6/min/store/with-schemas/index.js.gz +0 -0
- package/umd/es6/min/ui-react-inspector/index.js +1 -1
- package/umd/es6/min/ui-react-inspector/index.js.gz +0 -0
- package/umd/es6/min/ui-react-inspector/with-schemas/index.js +1 -1
- package/umd/es6/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
- package/umd/es6/min/with-schemas/index.js +1 -1
- package/umd/es6/min/with-schemas/index.js.gz +0 -0
- package/umd/es6/persisters/index.js +5 -3
- package/umd/es6/persisters/persister-automerge/index.js +7 -4
- package/umd/es6/persisters/persister-automerge/with-schemas/index.js +7 -4
- package/umd/es6/persisters/persister-browser/index.js +5 -3
- package/umd/es6/persisters/persister-browser/with-schemas/index.js +5 -3
- package/umd/es6/persisters/persister-cr-sqlite-wasm/index.js +8 -4
- package/umd/es6/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +8 -4
- package/umd/es6/persisters/persister-electric-sql/index.js +8 -4
- package/umd/es6/persisters/persister-electric-sql/with-schemas/index.js +8 -4
- package/umd/es6/persisters/persister-expo-sqlite/index.js +8 -4
- package/umd/es6/persisters/persister-expo-sqlite/with-schemas/index.js +8 -4
- package/umd/es6/persisters/persister-file/index.js +5 -3
- package/umd/es6/persisters/persister-file/with-schemas/index.js +5 -3
- package/umd/es6/persisters/persister-indexed-db/index.js +5 -3
- package/umd/es6/persisters/persister-indexed-db/with-schemas/index.js +5 -3
- package/umd/es6/persisters/persister-libsql/index.js +8 -4
- package/umd/es6/persisters/persister-libsql/with-schemas/index.js +8 -4
- package/umd/es6/persisters/persister-partykit-client/index.js +5 -3
- package/umd/es6/persisters/persister-partykit-client/with-schemas/index.js +5 -3
- package/umd/es6/persisters/persister-partykit-server/index.js +36 -22
- package/umd/es6/persisters/persister-partykit-server/with-schemas/index.js +36 -22
- package/umd/es6/persisters/persister-powersync/index.js +8 -4
- package/umd/es6/persisters/persister-powersync/with-schemas/index.js +8 -4
- package/umd/es6/persisters/persister-remote/index.js +5 -3
- package/umd/es6/persisters/persister-remote/with-schemas/index.js +5 -3
- package/umd/es6/persisters/persister-sqlite-wasm/index.js +8 -4
- package/umd/es6/persisters/persister-sqlite-wasm/with-schemas/index.js +8 -4
- package/umd/es6/persisters/persister-sqlite3/index.js +8 -4
- package/umd/es6/persisters/persister-sqlite3/with-schemas/index.js +8 -4
- package/umd/es6/persisters/persister-yjs/index.js +5 -3
- package/umd/es6/persisters/persister-yjs/with-schemas/index.js +5 -3
- package/umd/es6/persisters/with-schemas/index.js +5 -3
- package/umd/es6/relationships/index.js +15 -13
- package/umd/es6/relationships/with-schemas/index.js +15 -13
- package/umd/es6/store/index.js +23 -17
- package/umd/es6/store/with-schemas/index.js +23 -17
- package/umd/es6/synchronizers/index.js +5 -3
- package/umd/es6/synchronizers/synchronizer-broadcast-channel/index.js +5 -3
- package/umd/es6/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +5 -3
- package/umd/es6/synchronizers/synchronizer-local/index.js +5 -3
- package/umd/es6/synchronizers/synchronizer-local/with-schemas/index.js +5 -3
- package/umd/es6/synchronizers/synchronizer-ws-client/index.js +8 -6
- package/umd/es6/synchronizers/synchronizer-ws-client/with-schemas/index.js +8 -6
- package/umd/es6/synchronizers/synchronizer-ws-server/index.js +39 -33
- package/umd/es6/synchronizers/synchronizer-ws-server/with-schemas/index.js +39 -33
- package/umd/es6/synchronizers/with-schemas/index.js +5 -3
- package/umd/es6/ui-react-inspector/index.js +30 -21
- package/umd/es6/ui-react-inspector/with-schemas/index.js +30 -21
- package/umd/es6/with-schemas/index.js +28 -20
- package/umd/index.js +22 -12
- package/umd/indexes/index.js +9 -7
- package/umd/indexes/with-schemas/index.js +9 -7
- package/umd/mergeable-store/index.js +17 -9
- package/umd/mergeable-store/with-schemas/index.js +17 -9
- package/umd/metrics/index.js +9 -7
- package/umd/metrics/with-schemas/index.js +9 -7
- package/umd/min/index.js +1 -1
- package/umd/min/index.js.gz +0 -0
- package/umd/min/mergeable-store/index.js +1 -1
- package/umd/min/mergeable-store/index.js.gz +0 -0
- package/umd/min/mergeable-store/with-schemas/index.js +1 -1
- package/umd/min/mergeable-store/with-schemas/index.js.gz +0 -0
- package/umd/min/persisters/persister-automerge/index.js +1 -1
- package/umd/min/persisters/persister-automerge/index.js.gz +0 -0
- package/umd/min/persisters/persister-automerge/with-schemas/index.js +1 -1
- package/umd/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
- package/umd/min/store/index.js +1 -1
- package/umd/min/store/index.js.gz +0 -0
- package/umd/min/store/with-schemas/index.js +1 -1
- package/umd/min/store/with-schemas/index.js.gz +0 -0
- package/umd/min/tools/index.js +1 -1
- package/umd/min/tools/index.js.gz +0 -0
- package/umd/min/tools/with-schemas/index.js +1 -1
- package/umd/min/tools/with-schemas/index.js.gz +0 -0
- package/umd/min/ui-react-inspector/index.js +1 -1
- package/umd/min/ui-react-inspector/index.js.gz +0 -0
- package/umd/min/ui-react-inspector/with-schemas/index.js +1 -1
- package/umd/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
- package/umd/min/with-schemas/index.js +1 -1
- package/umd/min/with-schemas/index.js.gz +0 -0
- package/umd/persisters/index.js +5 -3
- package/umd/persisters/persister-automerge/index.js +7 -4
- package/umd/persisters/persister-automerge/with-schemas/index.js +7 -4
- package/umd/persisters/persister-browser/index.js +5 -3
- package/umd/persisters/persister-browser/with-schemas/index.js +5 -3
- package/umd/persisters/persister-cr-sqlite-wasm/index.js +8 -4
- package/umd/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +8 -4
- package/umd/persisters/persister-electric-sql/index.js +8 -4
- package/umd/persisters/persister-electric-sql/with-schemas/index.js +8 -4
- package/umd/persisters/persister-expo-sqlite/index.js +8 -4
- package/umd/persisters/persister-expo-sqlite/with-schemas/index.js +8 -4
- package/umd/persisters/persister-file/index.js +5 -3
- package/umd/persisters/persister-file/with-schemas/index.js +5 -3
- package/umd/persisters/persister-indexed-db/index.js +5 -3
- package/umd/persisters/persister-indexed-db/with-schemas/index.js +5 -3
- package/umd/persisters/persister-libsql/index.js +8 -4
- package/umd/persisters/persister-libsql/with-schemas/index.js +8 -4
- package/umd/persisters/persister-partykit-client/index.js +5 -3
- package/umd/persisters/persister-partykit-client/with-schemas/index.js +5 -3
- package/umd/persisters/persister-partykit-server/index.js +36 -25
- package/umd/persisters/persister-partykit-server/with-schemas/index.js +36 -25
- package/umd/persisters/persister-powersync/index.js +8 -4
- package/umd/persisters/persister-powersync/with-schemas/index.js +8 -4
- package/umd/persisters/persister-remote/index.js +5 -3
- package/umd/persisters/persister-remote/with-schemas/index.js +5 -3
- package/umd/persisters/persister-sqlite-wasm/index.js +8 -4
- package/umd/persisters/persister-sqlite-wasm/with-schemas/index.js +8 -4
- package/umd/persisters/persister-sqlite3/index.js +8 -4
- package/umd/persisters/persister-sqlite3/with-schemas/index.js +8 -4
- package/umd/persisters/persister-yjs/index.js +5 -3
- package/umd/persisters/persister-yjs/with-schemas/index.js +5 -3
- package/umd/persisters/with-schemas/index.js +5 -3
- package/umd/relationships/index.js +9 -7
- package/umd/relationships/with-schemas/index.js +9 -7
- package/umd/store/index.js +17 -9
- package/umd/store/with-schemas/index.js +17 -9
- package/umd/synchronizers/index.js +5 -3
- package/umd/synchronizers/synchronizer-broadcast-channel/index.js +5 -3
- package/umd/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +5 -3
- package/umd/synchronizers/synchronizer-local/index.js +5 -3
- package/umd/synchronizers/synchronizer-local/with-schemas/index.js +5 -3
- package/umd/synchronizers/synchronizer-ws-client/index.js +8 -6
- package/umd/synchronizers/synchronizer-ws-client/with-schemas/index.js +8 -6
- package/umd/synchronizers/synchronizer-ws-server/index.js +28 -22
- package/umd/synchronizers/synchronizer-ws-server/with-schemas/index.js +28 -22
- package/umd/synchronizers/with-schemas/index.js +5 -3
- package/umd/tools/index.js +1 -1
- package/umd/tools/with-schemas/index.js +1 -1
- package/umd/ui-react-inspector/index.js +24 -13
- package/umd/ui-react-inspector/with-schemas/index.js +24 -13
- package/umd/with-schemas/index.js +22 -12
- package/with-schemas/index.js +22 -12
|
@@ -8,7 +8,9 @@ const strRepeat = (str, count) => str.repeat(count);
|
|
|
8
8
|
|
|
9
9
|
const promise = Promise;
|
|
10
10
|
const startInterval = (callback, sec, immediate) => {
|
|
11
|
-
|
|
11
|
+
{
|
|
12
|
+
callback();
|
|
13
|
+
}
|
|
12
14
|
return setInterval(callback, sec * 1e3);
|
|
13
15
|
};
|
|
14
16
|
const stopInterval = clearInterval;
|
|
@@ -471,9 +473,11 @@ const createCustomPersister = (
|
|
|
471
473
|
await schedule(async () => {
|
|
472
474
|
try {
|
|
473
475
|
const content = await getPersisted();
|
|
474
|
-
isArray(content)
|
|
475
|
-
|
|
476
|
-
|
|
476
|
+
if (isArray(content)) {
|
|
477
|
+
setContentOrChanges(content);
|
|
478
|
+
} else {
|
|
479
|
+
errorNew(`Content is not an array ${content}`);
|
|
480
|
+
}
|
|
477
481
|
} catch (error) {
|
|
478
482
|
onIgnoredError?.(error);
|
|
479
483
|
if (initialContent) {
|
|
@@ -148,9 +148,11 @@ const createCustomPersister = (
|
|
|
148
148
|
await schedule(async () => {
|
|
149
149
|
try {
|
|
150
150
|
const content = await getPersisted();
|
|
151
|
-
isArray(content)
|
|
152
|
-
|
|
153
|
-
|
|
151
|
+
if (isArray(content)) {
|
|
152
|
+
setContentOrChanges(content);
|
|
153
|
+
} else {
|
|
154
|
+
errorNew(`Content is not an array ${content}`);
|
|
155
|
+
}
|
|
154
156
|
} catch (error) {
|
|
155
157
|
onIgnoredError?.(error);
|
|
156
158
|
if (initialContent) {
|
|
@@ -148,9 +148,11 @@ const createCustomPersister = (
|
|
|
148
148
|
await schedule(async () => {
|
|
149
149
|
try {
|
|
150
150
|
const content = await getPersisted();
|
|
151
|
-
isArray(content)
|
|
152
|
-
|
|
153
|
-
|
|
151
|
+
if (isArray(content)) {
|
|
152
|
+
setContentOrChanges(content);
|
|
153
|
+
} else {
|
|
154
|
+
errorNew(`Content is not an array ${content}`);
|
|
155
|
+
}
|
|
154
156
|
} catch (error) {
|
|
155
157
|
onIgnoredError?.(error);
|
|
156
158
|
if (initialContent) {
|
|
@@ -130,9 +130,11 @@ const createCustomPersister = (
|
|
|
130
130
|
await schedule(async () => {
|
|
131
131
|
try {
|
|
132
132
|
const content = await getPersisted();
|
|
133
|
-
isArray(content)
|
|
134
|
-
|
|
135
|
-
|
|
133
|
+
if (isArray(content)) {
|
|
134
|
+
setContentOrChanges(content);
|
|
135
|
+
} else {
|
|
136
|
+
errorNew(`Content is not an array ${content}`);
|
|
137
|
+
}
|
|
136
138
|
} catch (error) {
|
|
137
139
|
onIgnoredError?.(error);
|
|
138
140
|
if (initialContent) {
|
package/readme.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<section id="hero"><h2 id="the-reactive-data-store-for-local-first-apps">The <em>reactive</em> data store for <span>local-first apps</span>.</h2></section><p><a href="https://tinybase.org/guides/releases/#v5-1"><em>NEW!</em> v5.1 release</a></p><p><span id="one-with">"The One You Can Sync... with a server!"</span></p><p><a class="start" href="https://tinybase.org/guides/the-basics/getting-started/">Get started</a></p><p><a href="https://tinybase.org/demos/">Try the demos</a></p><p><a href="https://tinybase.org/api/store/interfaces/store/store/">Read the docs</a></p><hr><section><h2 id="it-s-reactive">It's <em>Reactive</em></h2><p>TinyBase lets you <a href="#register-granular-listeners">listen to changes</a> made to any part of your data. This means your app will be fast, since you only spend rendering cycles on things that change. The optional <a href="#call-hooks-to-bind-to-data">bindings to React</a> and <a href="#pre-built-reactive-components">pre-built components</a> let you easily build fully reactive UIs on top of TinyBase. You even get a built-in <a href="#set-checkpoints-for-an-undo-stack">undo stack</a>, and <a href="#an-inspector-for-your-data">developer tools</a>!</p></section><section><h2 id="it-s-database-like">It's <em>Database-Like</em></h2><p>Consumer app? Enterprise app? Or even a game? Model <a href="#start-with-a-simple-key-value-store">key-value data</a> and <a href="#level-up-to-use-tabular-data">tabular data</a> with optional typed <a href="#apply-schemas-to-tables-values">schematization</a>, whatever its data structures. There are built-in <a href="#create-indexes-for-fast-lookups">indexing</a>, <a href="#define-metrics-and-aggregations">metric aggregation</a>, and tabular <a href="#model-table-relationships">relationships</a> APIs - and a powerful <a href="#build-complex-queries-with-tinyql">query engine</a> to select, join, filter, and group data (reactively!) without SQL.</p></section><section><h2 id="it-synchronizes">It <em>Synchronizes</em></h2><p>TinyBase has <a href="#synchronize-between-devices">native CRDT</a> support, meaning that you can deterministically <a href="https://tinybase.org/guides/synchronization/">synchronize</a> and merge data across multiple sources, clients, and servers. And although TinyBase is an in-memory data store, but you can easily <a href="#persist-to-storage-sqlite-more">persist</a> your data to file, <a href="https://tinybase.org/api/persister-browser">browser storage</a>, <a href="https://tinybase.org/api/persister-indexed-db">IndexedDB</a>, <a href="https://tinybase.org/guides/persistence/database-persistence/">SQLite databases</a>, and <a href="https://tinybase.org/guides/persistence/third-party-crdt-persistence/">more</a>.</p></section><section><h2 id="it-s-built-for-a-local-first-world">It's Built For A <em>Local-First</em> World</h2><p>TinyBase works anywhere that JavaScript does, but it's especially great for local-first apps: where data is stored locally on the user's device and that can be run offline. It's tiny by name, tiny by nature: just <a href="#did-we-say-tiny">5.3kB - 12.7kB</a> and with no dependencies - yet <a href="#well-tested-and-documented">100% tested</a>, <a href="https://tinybase.org/guides/the-basics/getting-started/">fully documented</a>, and of course, <a href="https://github.com/tinyplex/tinybase">open source</a>!</p></section><hr><section id="friends"><h2 id="tinybase-works-great-on-its-own-but-also-plays-well-with-friends">TinyBase works great on its own, but also plays well with friends!</h2><div><a href="https://tinybase.org/guides/building-uis/getting-started-with-ui-react"><img width="48" src="https://tinybase.org/react.svg"> React</a></div><div><a href="https://tinybase.org/api/persister-partykit-client"><img width="48" src="https://tinybase.org/partykit.svg"> PartyKit</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img width="48" src="https://tinybase.org/expo.svg">Expo SQLite</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img width="48" src="https://tinybase.org/electric.svg">ElectricSQL</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img width="48" src="https://tinybase.org/sqlite.svg"> SQLite</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img width="48" src="https://tinybase.org/turso.svg">Turso</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img width="48" src="https://tinybase.org/powersync.svg">PowerSync</a></div><div><a href="https://tinybase.org/api/persister-indexed-db/functions/creation/createindexeddbpersister"><img width="48" src="https://tinybase.org/indexeddb.svg"> IndexedDB</a></div><div><a href="https://tinybase.org/api/persister-yjs/functions/creation/createyjspersister"><img width="48" src="https://tinybase.org/yjs.svg"> YJS</a></div><div><a href="https://tinybase.org/api/persister-cr-sqlite-wasm"><img width="48" src="https://tinybase.org/crsqlite.png"> CR-SQLite</a></div><div><a href="https://tinybase.org/api/persister-automerge"><img width="48" src="https://tinybase.org/automerge.svg"> Automerge</a></div></section><hr><section id="follow"><a href="https://github.com/tinyplex/tinybase" target="_blank"><img src="https://img.shields.io/github/stars/tinyplex/tinybase?style=for-the-badge&logo=GitHub&logoColor=%23fff&label=GitHub&labelColor=%23d81b60&color=%23333"> </a><a href="https://discord.com/invite/mGz3mevwP8" target="_blank"><img src="https://img.shields.io/discord/1027918215323590676?style=for-the-badge&logo=discord&logoColor=%23fff&label=Discord&labelColor=%233131e8&color=%23333"> </a><a href="https://twitter.com/tinybasejs" target="_blank"><img src="https://img.shields.io/twitter/follow/tinybasejs?style=for-the-badge&logo=x&logoColor=%23fff&label=Twitter&labelColor=%23333&color=%23333"></a><br><a href="https://github.com/tinyplex/tinybase/discussions" target="_blank"><img src="https://img.shields.io/github/discussions/tinyplex/tinybase?style=for-the-badge&logo=GitHub&logoColor=%23fff&label=Ideas&labelColor=%23d81b60&color=%23333"> </a><a href="https://github.com/tinyplex/tinybase/issues" target="_blank"><img src="https://img.shields.io/github/issues/tinyplex/tinybase?style=for-the-badge&logo=GitHub&logoColor=%23fff&label=Issues&labelColor=%23d81b60&color=%23333"> </a><a href="#well-tested-and-documented"><img src="https://img.shields.io/badge/Tests-100%25-green?style=for-the-badge&logo=jest&logoColor=%23fff&color=%23333&labelColor=%2387c305"> </a><a href="https://www.npmjs.com/package/tinybase/v/5.1.
|
|
1
|
+
<section id="hero"><h2 id="the-reactive-data-store-for-local-first-apps">The <em>reactive</em> data store for <span>local-first apps</span>.</h2></section><p><a href="https://tinybase.org/guides/releases/#v5-1"><em>NEW!</em> v5.1 release</a></p><p><span id="one-with">"The One You Can Sync... with a server!"</span></p><p><a class="start" href="https://tinybase.org/guides/the-basics/getting-started/">Get started</a></p><p><a href="https://tinybase.org/demos/">Try the demos</a></p><p><a href="https://tinybase.org/api/store/interfaces/store/store/">Read the docs</a></p><hr><section><h2 id="it-s-reactive">It's <em>Reactive</em></h2><p>TinyBase lets you <a href="#register-granular-listeners">listen to changes</a> made to any part of your data. This means your app will be fast, since you only spend rendering cycles on things that change. The optional <a href="#call-hooks-to-bind-to-data">bindings to React</a> and <a href="#pre-built-reactive-components">pre-built components</a> let you easily build fully reactive UIs on top of TinyBase. You even get a built-in <a href="#set-checkpoints-for-an-undo-stack">undo stack</a>, and <a href="#an-inspector-for-your-data">developer tools</a>!</p></section><section><h2 id="it-s-database-like">It's <em>Database-Like</em></h2><p>Consumer app? Enterprise app? Or even a game? Model <a href="#start-with-a-simple-key-value-store">key-value data</a> and <a href="#level-up-to-use-tabular-data">tabular data</a> with optional typed <a href="#apply-schemas-to-tables-values">schematization</a>, whatever its data structures. There are built-in <a href="#create-indexes-for-fast-lookups">indexing</a>, <a href="#define-metrics-and-aggregations">metric aggregation</a>, and tabular <a href="#model-table-relationships">relationships</a> APIs - and a powerful <a href="#build-complex-queries-with-tinyql">query engine</a> to select, join, filter, and group data (reactively!) without SQL.</p></section><section><h2 id="it-synchronizes">It <em>Synchronizes</em></h2><p>TinyBase has <a href="#synchronize-between-devices">native CRDT</a> support, meaning that you can deterministically <a href="https://tinybase.org/guides/synchronization/">synchronize</a> and merge data across multiple sources, clients, and servers. And although TinyBase is an in-memory data store, but you can easily <a href="#persist-to-storage-sqlite-more">persist</a> your data to file, <a href="https://tinybase.org/api/persister-browser">browser storage</a>, <a href="https://tinybase.org/api/persister-indexed-db">IndexedDB</a>, <a href="https://tinybase.org/guides/persistence/database-persistence/">SQLite databases</a>, and <a href="https://tinybase.org/guides/persistence/third-party-crdt-persistence/">more</a>.</p></section><section><h2 id="it-s-built-for-a-local-first-world">It's Built For A <em>Local-First</em> World</h2><p>TinyBase works anywhere that JavaScript does, but it's especially great for local-first apps: where data is stored locally on the user's device and that can be run offline. It's tiny by name, tiny by nature: just <a href="#did-we-say-tiny">5.3kB - 12.7kB</a> and with no dependencies - yet <a href="#well-tested-and-documented">100% tested</a>, <a href="https://tinybase.org/guides/the-basics/getting-started/">fully documented</a>, and of course, <a href="https://github.com/tinyplex/tinybase">open source</a>!</p></section><hr><section id="friends"><h2 id="tinybase-works-great-on-its-own-but-also-plays-well-with-friends">TinyBase works great on its own, but also plays well with friends!</h2><div><a href="https://tinybase.org/guides/building-uis/getting-started-with-ui-react"><img width="48" src="https://tinybase.org/react.svg"> React</a></div><div><a href="https://tinybase.org/api/persister-partykit-client"><img width="48" src="https://tinybase.org/partykit.svg"> PartyKit</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img width="48" src="https://tinybase.org/expo.svg">Expo SQLite</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img width="48" src="https://tinybase.org/electric.svg">ElectricSQL</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img width="48" src="https://tinybase.org/sqlite.svg"> SQLite</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img width="48" src="https://tinybase.org/turso.svg">Turso</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img width="48" src="https://tinybase.org/powersync.svg">PowerSync</a></div><div><a href="https://tinybase.org/api/persister-indexed-db/functions/creation/createindexeddbpersister"><img width="48" src="https://tinybase.org/indexeddb.svg"> IndexedDB</a></div><div><a href="https://tinybase.org/api/persister-yjs/functions/creation/createyjspersister"><img width="48" src="https://tinybase.org/yjs.svg"> YJS</a></div><div><a href="https://tinybase.org/api/persister-cr-sqlite-wasm"><img width="48" src="https://tinybase.org/crsqlite.png"> CR-SQLite</a></div><div><a href="https://tinybase.org/api/persister-automerge"><img width="48" src="https://tinybase.org/automerge.svg"> Automerge</a></div></section><hr><section id="follow"><a href="https://github.com/tinyplex/tinybase" target="_blank"><img src="https://img.shields.io/github/stars/tinyplex/tinybase?style=for-the-badge&logo=GitHub&logoColor=%23fff&label=GitHub&labelColor=%23d81b60&color=%23333"> </a><a href="https://discord.com/invite/mGz3mevwP8" target="_blank"><img src="https://img.shields.io/discord/1027918215323590676?style=for-the-badge&logo=discord&logoColor=%23fff&label=Discord&labelColor=%233131e8&color=%23333"> </a><a href="https://twitter.com/tinybasejs" target="_blank"><img src="https://img.shields.io/twitter/follow/tinybasejs?style=for-the-badge&logo=x&logoColor=%23fff&label=Twitter&labelColor=%23333&color=%23333"></a><br><a href="https://github.com/tinyplex/tinybase/discussions" target="_blank"><img src="https://img.shields.io/github/discussions/tinyplex/tinybase?style=for-the-badge&logo=GitHub&logoColor=%23fff&label=Ideas&labelColor=%23d81b60&color=%23333"> </a><a href="https://github.com/tinyplex/tinybase/issues" target="_blank"><img src="https://img.shields.io/github/issues/tinyplex/tinybase?style=for-the-badge&logo=GitHub&logoColor=%23fff&label=Issues&labelColor=%23d81b60&color=%23333"> </a><a href="#well-tested-and-documented"><img src="https://img.shields.io/badge/Tests-100%25-green?style=for-the-badge&logo=jest&logoColor=%23fff&color=%23333&labelColor=%2387c305"> </a><a href="https://www.npmjs.com/package/tinybase/v/5.1.5" target="_blank"><img src="https://img.shields.io/npm/v/tinybase?style=for-the-badge&logo=npm&logoColor=%23fff&labelColor=%23bd0005&color=%23333"></a></section><hr><section><h2 id="start-with-a-simple-key-value-store">Start with a simple key-value store.</h2><p>Creating a <a href="https://tinybase.org/api/store/interfaces/store/store/"><code>Store</code></a> requires just a simple call to the <a href="https://tinybase.org/api/store/functions/creation/createstore/"><code>createStore</code></a> function. Once you have one, you can easily set <a href="https://tinybase.org/api/store/type-aliases/store/values/"><code>Values</code></a> in it by unique <a href="https://tinybase.org/api/common/type-aliases/identity/id/"><code>Id</code></a>. And of course you can easily get them back out again.</p><p>Read more about using keyed value data in <a href="https://tinybase.org/guides/the-basics/">The Basics</a> guide.</p></section>
|
|
2
2
|
|
|
3
3
|
```js
|
|
4
4
|
import {createStore} from 'tinybase';
|
|
@@ -292,4 +292,4 @@ export const createShop: typeof createShopDecl = () => {
|
|
|
292
292
|
};
|
|
293
293
|
```
|
|
294
294
|
|
|
295
|
-
<section><h2 id="did-we-say-tiny">Did we say tiny?</h2><p>If you use the basic <a href="https://tinybase.org/api/store/"><code>store</code></a> module alone, you'll only add a gzipped <em>5.3kB</em> to your app. Incrementally add the other modules as you need more functionality, or get it all for <em>12.7kB</em>.</p><p>The optional <a href="https://tinybase.org/api/ui-react/"><code>ui-react</code></a> module is just <em>4.6kB</em>, the ui-react-dom components are another <em>2.5kB</em>, and everything is super fast. Life's easy when you have zero dependencies!</p><p>Read more about how TinyBase is structured and packaged in the <a href="https://tinybase.org/guides/how-tinybase-is-built/architecture/">Architecture</a> guide.</p></section><div class="table"><table class="fixed"><tbody><tr><th> </th><th>Minified .js.gz</th><th>Source .js</th></tr><tr><th class="right"><a href="https://tinybase.org/api/store/">tinybase/store</a> (minimal)</th><td>5.3kB</td><td>52.5kB</td></tr><tr><th class="right">tinybase (complete)</th><td>12.7kB</td><td>130.8kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/ui-react/">ui-react</a></th><td>4.6kB</td><td>48.3kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/ui-react-dom/">ui-react-dom</a></th><td>2.5kB</td><td>20.4kB</td></tr></tbody></table></div><section><h2 id="well-tested-and-documented">Well tested and documented.</h2><p>TinyBase has <em>100.0%</em> test coverage, including the code throughout the documentation - even on this page! The guides, demos, and API examples are designed to make it as easy as possible for you to get your TinyBase-powered app up and running.</p><p>Read more about how TinyBase is tested in the Unit <a href="https://tinybase.org/guides/how-tinybase-is-built/testing/">Testing</a> guide.</p></section><div class="table"><table class="fixed"><tbody><tr><th width="30%"> </th><th>Total</th><th>Tested</th><th>Coverage</th></tr><tr><th class="right">Lines</th><td>2,380</td><td>2,380</td><td>100.0%</td></tr><tr><th class="right">Statements</th><td>2,567</td><td>2,567</td><td>100.0%</td></tr><tr><th class="right">Functions</th><td>1,006</td><td>1,006</td><td>100.0%</td></tr><tr><th class="right">Branches</th><td>951</td><td>951</td><td>100.0%</td></tr><tr><th class="right">Tests</th><td colspan="3">6,851</td></tr><tr><th class="right">Assertions</th><td colspan="3">32,075</td></tr></tbody></table></div><hr><section id="sponsors"><h2 id="proud-to-be-sponsored-by">Proud to be sponsored by:</h2><a href="https://github.com/cpojer" target="_blank"><img title="cpojer" src="https://github.com/cpojer.png?size=48" width="48" height="48"></a><a href="https://github.com/expo" target="_blank"><img title="expo" src="https://github.com/expo.png?size=48" width="48" height="48"></a><a href="https://github.com/beekeeb" target="_blank"><img title="beekeeb" src="https://github.com/beekeeb.png?size=48" width="48" height="48"></a><a href="https://github.com/cancelself" target="_blank"><img title="cancelself" src="https://github.com/cancelself.png?size=48" width="48" height="48"></a><a href="https://github.com/WonderPanda" target="_blank"><img title="WonderPanda" src="https://github.com/WonderPanda.png?size=48" width="48" height="48"></a><a href="https://github.com/arpitBhalla" target="_blank"><img title="arpitBhalla" src="https://github.com/arpitBhalla.png?size=48" width="48" height="48"></a></section><section id="users"><h2 id="excited-to-be-used-by">Excited to be used by:</h2><a href="https://github.com/Apocalypsor" target="_blank"><img title="Apocalypsor" src="https://github.com/Apocalypsor.png?size=48" width="48" height="48"></a><a href="https://github.com/brentvatne" target="_blank"><img title="brentvatne" src="https://github.com/brentvatne.png?size=48" width="48" height="48"></a><a href="https://github.com/byCedric" target="_blank"><img title="byCedric" src="https://github.com/byCedric.png?size=48" width="48" height="48"></a><a href="https://github.com/circadian-risk" target="_blank"><img title="circadian-risk" src="https://github.com/circadian-risk.png?size=48" width="48" height="48"></a><a href="https://github.com/cpojer" target="_blank"><img title="cpojer" src="https://github.com/cpojer.png?size=48" width="48" height="48"></a><a href="https://github.com/cubecull" target="_blank"><img title="cubecull" src="https://github.com/cubecull.png?size=48" width="48" height="48"></a><a href="https://github.com/erwinkn" target="_blank"><img title="erwinkn" src="https://github.com/erwinkn.png?size=48" width="48" height="48"></a><a href="https://github.com/expo" target="_blank"><img title="expo" src="https://github.com/expo.png?size=48" width="48" height="48"></a><a href="https://github.com/ezra-en" target="_blank"><img title="ezra-en" src="https://github.com/ezra-en.png?size=48" width="48" height="48"></a><a href="https://github.com/fdfontes" target="_blank"><img title="fdfontes" src="https://github.com/fdfontes.png?size=48" width="48" height="48"></a><a href="https://github.com/feychenie" target="_blank"><img title="feychenie" src="https://github.com/feychenie.png?size=48" width="48" height="48"></a><a href="https://github.com/flaming-codes" target="_blank"><img title="flaming-codes" src="https://github.com/flaming-codes.png?size=48" width="48" height="48"></a><a href="https://github.com/fostertheweb" target="_blank"><img title="fostertheweb" src="https://github.com/fostertheweb.png?size=48" width="48" height="48"></a><a href="https://github.com/generates" target="_blank"><img title="generates" src="https://github.com/generates.png?size=48" width="48" height="48"></a><a href="https://github.com/Giulio987" target="_blank"><img title="Giulio987" src="https://github.com/Giulio987.png?size=48" width="48" height="48"></a><a href="https://github.com/itsdevcoffee" target="_blank"><img title="itsdevcoffee" src="https://github.com/itsdevcoffee.png?size=48" width="48" height="48"></a><a href="https://github.com/jaysc" target="_blank"><img title="jaysc" src="https://github.com/jaysc.png?size=48" width="48" height="48"></a><a href="https://github.com/jbolda" target="_blank"><img title="jbolda" src="https://github.com/jbolda.png?size=48" width="48" height="48"></a><a href="https://github.com/Kayoo-asso" target="_blank"><img title="Kayoo-asso" src="https://github.com/Kayoo-asso.png?size=48" width="48" height="48"></a><a href="https://github.com/kotofurumiya" target="_blank"><img title="kotofurumiya" src="https://github.com/kotofurumiya.png?size=48" width="48" height="48"></a><a href="https://github.com/Kudo" target="_blank"><img title="Kudo" src="https://github.com/Kudo.png?size=48" width="48" height="48"></a><a href="https://github.com/learn-anything" target="_blank"><img title="learn-anything" src="https://github.com/learn-anything.png?size=48" width="48" height="48"></a><a href="https://github.com/lluc" target="_blank"><img title="lluc" src="https://github.com/lluc.png?size=48" width="48" height="48"></a><a href="https://github.com/marksteve" target="_blank"><img title="marksteve" src="https://github.com/marksteve.png?size=48" width="48" height="48"></a><a href="https://github.com/miking-the-viking" target="_blank"><img title="miking-the-viking" src="https://github.com/miking-the-viking.png?size=48" width="48" height="48"></a><a href="https://github.com/mjamesderocher" target="_blank"><img title="mjamesderocher" src="https://github.com/mjamesderocher.png?size=48" width="48" height="48"></a><a href="https://github.com/mouktardev" target="_blank"><img title="mouktardev" src="https://github.com/mouktardev.png?size=48" width="48" height="48"></a><a href="https://github.com/nickmessing" target="_blank"><img title="nickmessing" src="https://github.com/nickmessing.png?size=48" width="48" height="48"></a><a href="https://github.com/nikitavoloboev" target="_blank"><img title="nikitavoloboev" src="https://github.com/nikitavoloboev.png?size=48" width="48" height="48"></a><a href="https://github.com/nkzw-tech" target="_blank"><img title="nkzw-tech" src="https://github.com/nkzw-tech.png?size=48" width="48" height="48"></a><a href="https://github.com/palerdot" target="_blank"><img title="palerdot" src="https://github.com/palerdot.png?size=48" width="48" height="48"></a><a href="https://github.com/PorcoRosso85" target="_blank"><img title="PorcoRosso85" src="https://github.com/PorcoRosso85.png?size=48" width="48" height="48"></a><a href="https://github.com/primodiumxyz" target="_blank"><img title="primodiumxyz" src="https://github.com/primodiumxyz.png?size=48" width="48" height="48"></a><a href="https://github.com/shaneosullivan" target="_blank"><img title="shaneosullivan" src="https://github.com/shaneosullivan.png?size=48" width="48" height="48"></a><a href="https://github.com/sudo-self" target="_blank"><img title="sudo-self" src="https://github.com/sudo-self.png?size=48" width="48" height="48"></a><a href="https://github.com/SuperSonicHub1" target="_blank"><img title="SuperSonicHub1" src="https://github.com/SuperSonicHub1.png?size=48" width="48" height="48"></a><a href="https://github.com/threepointone" target="_blank"><img title="threepointone" src="https://github.com/threepointone.png?size=48" width="48" height="48"></a><a href="https://github.com/uptonking" target="_blank"><img title="uptonking" src="https://github.com/uptonking.png?size=48" width="48" height="48"></a><a href="https://github.com/ViktorZhurbin" target="_blank"><img title="ViktorZhurbin" src="https://github.com/ViktorZhurbin.png?size=48" width="48" height="48"></a><a href="https://github.com/WonderPanda" target="_blank"><img title="WonderPanda" src="https://github.com/WonderPanda.png?size=48" width="48" height="48"></a></section><hr><p><a class="start" href="https://tinybase.org/guides/the-basics/getting-started/">Get started</a></p><p><a href="https://tinybase.org/demos/">Try the demos</a></p><p><a href="https://tinybase.org/api/store/interfaces/store/store/">Read the docs</a></p><hr><section id="about"><h2 id="about">About</h2><p>Modern apps deserve better. Why trade reactive user experiences to be able to use relational data? Or sacrifice features for bundle size? And why does the cloud do all the work <a href="https://localfirstweb.dev/" target="_blank">anyway</a>?</p><p>Building TinyBase was originally an interesting exercise for <a rel="me" href="https://tripleodeon.com">me</a> in API design, minification, and documentation. But now it has taken on a life of its own, and has grown beyond my wildest expectations.</p><p>It could not have been built without these great <a href="https://tinybase.org/guides/how-tinybase-is-built/credits/#giants">projects</a> and <a href="https://tinybase.org/guides/how-tinybase-is-built/credits/#and-friends">friends</a>, and I hope you enjoy using it as much as I do building it!</p></section><section id="story"><h2 id="the-story">The story</h2><a href="https://youtu.be/hXL7OkW-Prk?t=1232" target="_blank"><img src="https://tinybase.org/youtube.webp"></a></section>
|
|
295
|
+
<section><h2 id="did-we-say-tiny">Did we say tiny?</h2><p>If you use the basic <a href="https://tinybase.org/api/store/"><code>store</code></a> module alone, you'll only add a gzipped <em>5.3kB</em> to your app. Incrementally add the other modules as you need more functionality, or get it all for <em>12.7kB</em>.</p><p>The optional <a href="https://tinybase.org/api/ui-react/"><code>ui-react</code></a> module is just <em>4.6kB</em>, the ui-react-dom components are another <em>2.5kB</em>, and everything is super fast. Life's easy when you have zero dependencies!</p><p>Read more about how TinyBase is structured and packaged in the <a href="https://tinybase.org/guides/how-tinybase-is-built/architecture/">Architecture</a> guide.</p></section><div class="table"><table class="fixed"><tbody><tr><th> </th><th>Minified .js.gz</th><th>Source .js</th></tr><tr><th class="right"><a href="https://tinybase.org/api/store/">tinybase/store</a> (minimal)</th><td>5.3kB</td><td>52.5kB</td></tr><tr><th class="right">tinybase (complete)</th><td>12.7kB</td><td>130.9kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/ui-react/">ui-react</a></th><td>4.6kB</td><td>48.3kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/ui-react-dom/">ui-react-dom</a></th><td>2.5kB</td><td>20.4kB</td></tr></tbody></table></div><section><h2 id="well-tested-and-documented">Well tested and documented.</h2><p>TinyBase has <em>100.0%</em> test coverage, including the code throughout the documentation - even on this page! The guides, demos, and API examples are designed to make it as easy as possible for you to get your TinyBase-powered app up and running.</p><p>Read more about how TinyBase is tested in the Unit <a href="https://tinybase.org/guides/how-tinybase-is-built/testing/">Testing</a> guide.</p></section><div class="table"><table class="fixed"><tbody><tr><th width="30%"> </th><th>Total</th><th>Tested</th><th>Coverage</th></tr><tr><th class="right">Lines</th><td>2,389</td><td>2,389</td><td>100.0%</td></tr><tr><th class="right">Statements</th><td>2,576</td><td>2,576</td><td>100.0%</td></tr><tr><th class="right">Functions</th><td>1,006</td><td>1,006</td><td>100.0%</td></tr><tr><th class="right">Branches</th><td>951</td><td>951</td><td>100.0%</td></tr><tr><th class="right">Tests</th><td colspan="3">6,853</td></tr><tr><th class="right">Assertions</th><td colspan="3">32,079</td></tr></tbody></table></div><hr><section id="sponsors"><h2 id="proud-to-be-sponsored-by">Proud to be sponsored by:</h2><a href="https://github.com/cpojer" target="_blank"><img title="cpojer" src="https://github.com/cpojer.png?size=48" width="48" height="48"></a><a href="https://github.com/expo" target="_blank"><img title="expo" src="https://github.com/expo.png?size=48" width="48" height="48"></a><a href="https://github.com/beekeeb" target="_blank"><img title="beekeeb" src="https://github.com/beekeeb.png?size=48" width="48" height="48"></a><a href="https://github.com/cancelself" target="_blank"><img title="cancelself" src="https://github.com/cancelself.png?size=48" width="48" height="48"></a><a href="https://github.com/WonderPanda" target="_blank"><img title="WonderPanda" src="https://github.com/WonderPanda.png?size=48" width="48" height="48"></a><a href="https://github.com/arpitBhalla" target="_blank"><img title="arpitBhalla" src="https://github.com/arpitBhalla.png?size=48" width="48" height="48"></a></section><section id="users"><h2 id="excited-to-be-used-by">Excited to be used by:</h2><a href="https://github.com/Apocalypsor" target="_blank"><img title="Apocalypsor" src="https://github.com/Apocalypsor.png?size=48" width="48" height="48"></a><a href="https://github.com/brentvatne" target="_blank"><img title="brentvatne" src="https://github.com/brentvatne.png?size=48" width="48" height="48"></a><a href="https://github.com/byCedric" target="_blank"><img title="byCedric" src="https://github.com/byCedric.png?size=48" width="48" height="48"></a><a href="https://github.com/circadian-risk" target="_blank"><img title="circadian-risk" src="https://github.com/circadian-risk.png?size=48" width="48" height="48"></a><a href="https://github.com/cpojer" target="_blank"><img title="cpojer" src="https://github.com/cpojer.png?size=48" width="48" height="48"></a><a href="https://github.com/cubecull" target="_blank"><img title="cubecull" src="https://github.com/cubecull.png?size=48" width="48" height="48"></a><a href="https://github.com/erwinkn" target="_blank"><img title="erwinkn" src="https://github.com/erwinkn.png?size=48" width="48" height="48"></a><a href="https://github.com/expo" target="_blank"><img title="expo" src="https://github.com/expo.png?size=48" width="48" height="48"></a><a href="https://github.com/ezra-en" target="_blank"><img title="ezra-en" src="https://github.com/ezra-en.png?size=48" width="48" height="48"></a><a href="https://github.com/fdfontes" target="_blank"><img title="fdfontes" src="https://github.com/fdfontes.png?size=48" width="48" height="48"></a><a href="https://github.com/feychenie" target="_blank"><img title="feychenie" src="https://github.com/feychenie.png?size=48" width="48" height="48"></a><a href="https://github.com/flaming-codes" target="_blank"><img title="flaming-codes" src="https://github.com/flaming-codes.png?size=48" width="48" height="48"></a><a href="https://github.com/fostertheweb" target="_blank"><img title="fostertheweb" src="https://github.com/fostertheweb.png?size=48" width="48" height="48"></a><a href="https://github.com/generates" target="_blank"><img title="generates" src="https://github.com/generates.png?size=48" width="48" height="48"></a><a href="https://github.com/Giulio987" target="_blank"><img title="Giulio987" src="https://github.com/Giulio987.png?size=48" width="48" height="48"></a><a href="https://github.com/itsdevcoffee" target="_blank"><img title="itsdevcoffee" src="https://github.com/itsdevcoffee.png?size=48" width="48" height="48"></a><a href="https://github.com/jaysc" target="_blank"><img title="jaysc" src="https://github.com/jaysc.png?size=48" width="48" height="48"></a><a href="https://github.com/jbolda" target="_blank"><img title="jbolda" src="https://github.com/jbolda.png?size=48" width="48" height="48"></a><a href="https://github.com/Kayoo-asso" target="_blank"><img title="Kayoo-asso" src="https://github.com/Kayoo-asso.png?size=48" width="48" height="48"></a><a href="https://github.com/kotofurumiya" target="_blank"><img title="kotofurumiya" src="https://github.com/kotofurumiya.png?size=48" width="48" height="48"></a><a href="https://github.com/Kudo" target="_blank"><img title="Kudo" src="https://github.com/Kudo.png?size=48" width="48" height="48"></a><a href="https://github.com/learn-anything" target="_blank"><img title="learn-anything" src="https://github.com/learn-anything.png?size=48" width="48" height="48"></a><a href="https://github.com/lluc" target="_blank"><img title="lluc" src="https://github.com/lluc.png?size=48" width="48" height="48"></a><a href="https://github.com/marksteve" target="_blank"><img title="marksteve" src="https://github.com/marksteve.png?size=48" width="48" height="48"></a><a href="https://github.com/miking-the-viking" target="_blank"><img title="miking-the-viking" src="https://github.com/miking-the-viking.png?size=48" width="48" height="48"></a><a href="https://github.com/mjamesderocher" target="_blank"><img title="mjamesderocher" src="https://github.com/mjamesderocher.png?size=48" width="48" height="48"></a><a href="https://github.com/mouktardev" target="_blank"><img title="mouktardev" src="https://github.com/mouktardev.png?size=48" width="48" height="48"></a><a href="https://github.com/nickmessing" target="_blank"><img title="nickmessing" src="https://github.com/nickmessing.png?size=48" width="48" height="48"></a><a href="https://github.com/nikitavoloboev" target="_blank"><img title="nikitavoloboev" src="https://github.com/nikitavoloboev.png?size=48" width="48" height="48"></a><a href="https://github.com/nkzw-tech" target="_blank"><img title="nkzw-tech" src="https://github.com/nkzw-tech.png?size=48" width="48" height="48"></a><a href="https://github.com/palerdot" target="_blank"><img title="palerdot" src="https://github.com/palerdot.png?size=48" width="48" height="48"></a><a href="https://github.com/PorcoRosso85" target="_blank"><img title="PorcoRosso85" src="https://github.com/PorcoRosso85.png?size=48" width="48" height="48"></a><a href="https://github.com/primodiumxyz" target="_blank"><img title="primodiumxyz" src="https://github.com/primodiumxyz.png?size=48" width="48" height="48"></a><a href="https://github.com/shaneosullivan" target="_blank"><img title="shaneosullivan" src="https://github.com/shaneosullivan.png?size=48" width="48" height="48"></a><a href="https://github.com/sudo-self" target="_blank"><img title="sudo-self" src="https://github.com/sudo-self.png?size=48" width="48" height="48"></a><a href="https://github.com/SuperSonicHub1" target="_blank"><img title="SuperSonicHub1" src="https://github.com/SuperSonicHub1.png?size=48" width="48" height="48"></a><a href="https://github.com/threepointone" target="_blank"><img title="threepointone" src="https://github.com/threepointone.png?size=48" width="48" height="48"></a><a href="https://github.com/uptonking" target="_blank"><img title="uptonking" src="https://github.com/uptonking.png?size=48" width="48" height="48"></a><a href="https://github.com/ViktorZhurbin" target="_blank"><img title="ViktorZhurbin" src="https://github.com/ViktorZhurbin.png?size=48" width="48" height="48"></a><a href="https://github.com/WonderPanda" target="_blank"><img title="WonderPanda" src="https://github.com/WonderPanda.png?size=48" width="48" height="48"></a></section><hr><p><a class="start" href="https://tinybase.org/guides/the-basics/getting-started/">Get started</a></p><p><a href="https://tinybase.org/demos/">Try the demos</a></p><p><a href="https://tinybase.org/api/store/interfaces/store/store/">Read the docs</a></p><hr><section id="about"><h2 id="about">About</h2><p>Modern apps deserve better. Why trade reactive user experiences to be able to use relational data? Or sacrifice features for bundle size? And why does the cloud do all the work <a href="https://localfirstweb.dev/" target="_blank">anyway</a>?</p><p>Building TinyBase was originally an interesting exercise for <a rel="me" href="https://tripleodeon.com">me</a> in API design, minification, and documentation. But now it has taken on a life of its own, and has grown beyond my wildest expectations.</p><p>It could not have been built without these great <a href="https://tinybase.org/guides/how-tinybase-is-built/credits/#giants">projects</a> and <a href="https://tinybase.org/guides/how-tinybase-is-built/credits/#and-friends">friends</a>, and I hope you enjoy using it as much as I do building it!</p></section><section id="story"><h2 id="the-story">The story</h2><a href="https://youtu.be/hXL7OkW-Prk?t=1232" target="_blank"><img src="https://tinybase.org/youtube.webp"></a></section>
|
package/relationships/index.js
CHANGED
|
@@ -321,13 +321,15 @@ const getListenerFunctions = (getThing) => {
|
|
|
321
321
|
([listener, , path = [], pathGetters, extraArgsGetter]) => {
|
|
322
322
|
const callWithIds = (...ids) => {
|
|
323
323
|
const index = size(ids);
|
|
324
|
-
index == size(path)
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
324
|
+
if (index == size(path)) {
|
|
325
|
+
listener(thing, ...ids, ...extraArgsGetter(ids));
|
|
326
|
+
} else if (isUndefined(path[index])) {
|
|
327
|
+
arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
|
|
328
|
+
callWithIds(...ids, id2),
|
|
329
|
+
);
|
|
330
|
+
} else {
|
|
331
|
+
callWithIds(...ids, path[index]);
|
|
332
|
+
}
|
|
331
333
|
};
|
|
332
334
|
callWithIds();
|
|
333
335
|
},
|
|
@@ -321,13 +321,15 @@ const getListenerFunctions = (getThing) => {
|
|
|
321
321
|
([listener, , path = [], pathGetters, extraArgsGetter]) => {
|
|
322
322
|
const callWithIds = (...ids) => {
|
|
323
323
|
const index = size(ids);
|
|
324
|
-
index == size(path)
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
324
|
+
if (index == size(path)) {
|
|
325
|
+
listener(thing, ...ids, ...extraArgsGetter(ids));
|
|
326
|
+
} else if (isUndefined(path[index])) {
|
|
327
|
+
arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
|
|
328
|
+
callWithIds(...ids, id2),
|
|
329
|
+
);
|
|
330
|
+
} else {
|
|
331
|
+
callWithIds(...ids, path[index]);
|
|
332
|
+
}
|
|
331
333
|
};
|
|
332
334
|
callWithIds();
|
|
333
335
|
},
|
package/store/index.js
CHANGED
|
@@ -131,7 +131,9 @@ const mapToObj = (map, valueMapper, excludeMapValue, excludeObjValue) => {
|
|
|
131
131
|
collForEach(map, (mapValue, id) => {
|
|
132
132
|
if (!excludeMapValue?.(mapValue, id)) {
|
|
133
133
|
const objValue = valueMapper ? valueMapper(mapValue, id) : mapValue;
|
|
134
|
-
excludeObjValue?.(objValue)
|
|
134
|
+
if (!excludeObjValue?.(objValue)) {
|
|
135
|
+
obj[id] = objValue;
|
|
136
|
+
}
|
|
135
137
|
}
|
|
136
138
|
});
|
|
137
139
|
return obj;
|
|
@@ -257,13 +259,15 @@ const getListenerFunctions = (getThing) => {
|
|
|
257
259
|
([listener, , path = [], pathGetters, extraArgsGetter]) => {
|
|
258
260
|
const callWithIds = (...ids) => {
|
|
259
261
|
const index = size(ids);
|
|
260
|
-
index == size(path)
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
262
|
+
if (index == size(path)) {
|
|
263
|
+
listener(thing, ...ids, ...extraArgsGetter(ids));
|
|
264
|
+
} else if (isUndefined(path[index])) {
|
|
265
|
+
arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
|
|
266
|
+
callWithIds(...ids, id2),
|
|
267
|
+
);
|
|
268
|
+
} else {
|
|
269
|
+
callWithIds(...ids, path[index]);
|
|
270
|
+
}
|
|
267
271
|
};
|
|
268
272
|
callWithIds();
|
|
269
273
|
},
|
|
@@ -634,7 +638,11 @@ const createStore = () => {
|
|
|
634
638
|
cellIdsChanged(tableId, rowId, cellId2, -1);
|
|
635
639
|
mapSet(row, cellId2);
|
|
636
640
|
};
|
|
637
|
-
isUndefined(defaultCell)
|
|
641
|
+
if (isUndefined(defaultCell)) {
|
|
642
|
+
delCell2(cellId);
|
|
643
|
+
} else {
|
|
644
|
+
mapForEach(row, delCell2);
|
|
645
|
+
}
|
|
638
646
|
if (collIsEmpty(row)) {
|
|
639
647
|
rowIdsChanged(tableId, rowId, -1);
|
|
640
648
|
if (collIsEmpty(mapSet(table, rowId))) {
|
|
@@ -131,7 +131,9 @@ const mapToObj = (map, valueMapper, excludeMapValue, excludeObjValue) => {
|
|
|
131
131
|
collForEach(map, (mapValue, id) => {
|
|
132
132
|
if (!excludeMapValue?.(mapValue, id)) {
|
|
133
133
|
const objValue = valueMapper ? valueMapper(mapValue, id) : mapValue;
|
|
134
|
-
excludeObjValue?.(objValue)
|
|
134
|
+
if (!excludeObjValue?.(objValue)) {
|
|
135
|
+
obj[id] = objValue;
|
|
136
|
+
}
|
|
135
137
|
}
|
|
136
138
|
});
|
|
137
139
|
return obj;
|
|
@@ -257,13 +259,15 @@ const getListenerFunctions = (getThing) => {
|
|
|
257
259
|
([listener, , path = [], pathGetters, extraArgsGetter]) => {
|
|
258
260
|
const callWithIds = (...ids) => {
|
|
259
261
|
const index = size(ids);
|
|
260
|
-
index == size(path)
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
262
|
+
if (index == size(path)) {
|
|
263
|
+
listener(thing, ...ids, ...extraArgsGetter(ids));
|
|
264
|
+
} else if (isUndefined(path[index])) {
|
|
265
|
+
arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
|
|
266
|
+
callWithIds(...ids, id2),
|
|
267
|
+
);
|
|
268
|
+
} else {
|
|
269
|
+
callWithIds(...ids, path[index]);
|
|
270
|
+
}
|
|
267
271
|
};
|
|
268
272
|
callWithIds();
|
|
269
273
|
},
|
|
@@ -634,7 +638,11 @@ const createStore = () => {
|
|
|
634
638
|
cellIdsChanged(tableId, rowId, cellId2, -1);
|
|
635
639
|
mapSet(row, cellId2);
|
|
636
640
|
};
|
|
637
|
-
isUndefined(defaultCell)
|
|
641
|
+
if (isUndefined(defaultCell)) {
|
|
642
|
+
delCell2(cellId);
|
|
643
|
+
} else {
|
|
644
|
+
mapForEach(row, delCell2);
|
|
645
|
+
}
|
|
638
646
|
if (collIsEmpty(row)) {
|
|
639
647
|
rowIdsChanged(tableId, rowId, -1);
|
|
640
648
|
if (collIsEmpty(mapSet(table, rowId))) {
|
package/synchronizers/index.js
CHANGED
|
@@ -153,9 +153,11 @@ const createCustomPersister = (
|
|
|
153
153
|
await schedule(async () => {
|
|
154
154
|
try {
|
|
155
155
|
const content = await getPersisted();
|
|
156
|
-
isArray(content)
|
|
157
|
-
|
|
158
|
-
|
|
156
|
+
if (isArray(content)) {
|
|
157
|
+
setContentOrChanges(content);
|
|
158
|
+
} else {
|
|
159
|
+
errorNew(`Content is not an array ${content}`);
|
|
160
|
+
}
|
|
159
161
|
} catch (error) {
|
|
160
162
|
onIgnoredError?.(error);
|
|
161
163
|
if (initialContent) {
|
|
@@ -153,9 +153,11 @@ const createCustomPersister = (
|
|
|
153
153
|
await schedule(async () => {
|
|
154
154
|
try {
|
|
155
155
|
const content = await getPersisted();
|
|
156
|
-
isArray(content)
|
|
157
|
-
|
|
158
|
-
|
|
156
|
+
if (isArray(content)) {
|
|
157
|
+
setContentOrChanges(content);
|
|
158
|
+
} else {
|
|
159
|
+
errorNew(`Content is not an array ${content}`);
|
|
160
|
+
}
|
|
159
161
|
} catch (error) {
|
|
160
162
|
onIgnoredError?.(error);
|
|
161
163
|
if (initialContent) {
|
|
@@ -153,9 +153,11 @@ const createCustomPersister = (
|
|
|
153
153
|
await schedule(async () => {
|
|
154
154
|
try {
|
|
155
155
|
const content = await getPersisted();
|
|
156
|
-
isArray(content)
|
|
157
|
-
|
|
158
|
-
|
|
156
|
+
if (isArray(content)) {
|
|
157
|
+
setContentOrChanges(content);
|
|
158
|
+
} else {
|
|
159
|
+
errorNew(`Content is not an array ${content}`);
|
|
160
|
+
}
|
|
159
161
|
} catch (error) {
|
|
160
162
|
onIgnoredError?.(error);
|
|
161
163
|
if (initialContent) {
|
|
@@ -156,9 +156,11 @@ const createCustomPersister = (
|
|
|
156
156
|
await schedule(async () => {
|
|
157
157
|
try {
|
|
158
158
|
const content = await getPersisted();
|
|
159
|
-
isArray(content)
|
|
160
|
-
|
|
161
|
-
|
|
159
|
+
if (isArray(content)) {
|
|
160
|
+
setContentOrChanges(content);
|
|
161
|
+
} else {
|
|
162
|
+
errorNew(`Content is not an array ${content}`);
|
|
163
|
+
}
|
|
162
164
|
} catch (error) {
|
|
163
165
|
onIgnoredError?.(error);
|
|
164
166
|
if (initialContent) {
|
|
@@ -156,9 +156,11 @@ const createCustomPersister = (
|
|
|
156
156
|
await schedule(async () => {
|
|
157
157
|
try {
|
|
158
158
|
const content = await getPersisted();
|
|
159
|
-
isArray(content)
|
|
160
|
-
|
|
161
|
-
|
|
159
|
+
if (isArray(content)) {
|
|
160
|
+
setContentOrChanges(content);
|
|
161
|
+
} else {
|
|
162
|
+
errorNew(`Content is not an array ${content}`);
|
|
163
|
+
}
|
|
162
164
|
} catch (error) {
|
|
163
165
|
onIgnoredError?.(error);
|
|
164
166
|
if (initialContent) {
|
|
@@ -61,9 +61,9 @@ const jsonParseWithUndefined = (str) =>
|
|
|
61
61
|
const MESSAGE_SEPARATOR = '\n';
|
|
62
62
|
const ifPayloadValid = (payload, then) => {
|
|
63
63
|
const splitAt = payload.indexOf(MESSAGE_SEPARATOR);
|
|
64
|
-
splitAt !== -1
|
|
65
|
-
|
|
66
|
-
|
|
64
|
+
if (splitAt !== -1) {
|
|
65
|
+
then(slice(payload, 0, splitAt), slice(payload, splitAt + 1));
|
|
66
|
+
}
|
|
67
67
|
};
|
|
68
68
|
const receivePayload = (payload, receive) =>
|
|
69
69
|
ifPayloadValid(payload, (fromClientId, remainder) =>
|
|
@@ -177,9 +177,11 @@ const createCustomPersister = (
|
|
|
177
177
|
await schedule(async () => {
|
|
178
178
|
try {
|
|
179
179
|
const content = await getPersisted();
|
|
180
|
-
isArray(content)
|
|
181
|
-
|
|
182
|
-
|
|
180
|
+
if (isArray(content)) {
|
|
181
|
+
setContentOrChanges(content);
|
|
182
|
+
} else {
|
|
183
|
+
errorNew(`Content is not an array ${content}`);
|
|
184
|
+
}
|
|
183
185
|
} catch (error) {
|
|
184
186
|
onIgnoredError?.(error);
|
|
185
187
|
if (initialContent) {
|
|
@@ -61,9 +61,9 @@ const jsonParseWithUndefined = (str) =>
|
|
|
61
61
|
const MESSAGE_SEPARATOR = '\n';
|
|
62
62
|
const ifPayloadValid = (payload, then) => {
|
|
63
63
|
const splitAt = payload.indexOf(MESSAGE_SEPARATOR);
|
|
64
|
-
splitAt !== -1
|
|
65
|
-
|
|
66
|
-
|
|
64
|
+
if (splitAt !== -1) {
|
|
65
|
+
then(slice(payload, 0, splitAt), slice(payload, splitAt + 1));
|
|
66
|
+
}
|
|
67
67
|
};
|
|
68
68
|
const receivePayload = (payload, receive) =>
|
|
69
69
|
ifPayloadValid(payload, (fromClientId, remainder) =>
|
|
@@ -177,9 +177,11 @@ const createCustomPersister = (
|
|
|
177
177
|
await schedule(async () => {
|
|
178
178
|
try {
|
|
179
179
|
const content = await getPersisted();
|
|
180
|
-
isArray(content)
|
|
181
|
-
|
|
182
|
-
|
|
180
|
+
if (isArray(content)) {
|
|
181
|
+
setContentOrChanges(content);
|
|
182
|
+
} else {
|
|
183
|
+
errorNew(`Content is not an array ${content}`);
|
|
184
|
+
}
|
|
183
185
|
} catch (error) {
|
|
184
186
|
onIgnoredError?.(error);
|
|
185
187
|
if (initialContent) {
|
|
@@ -110,9 +110,9 @@ const jsonParseWithUndefined = (str) =>
|
|
|
110
110
|
const MESSAGE_SEPARATOR = '\n';
|
|
111
111
|
const ifPayloadValid = (payload, then) => {
|
|
112
112
|
const splitAt = payload.indexOf(MESSAGE_SEPARATOR);
|
|
113
|
-
splitAt !== -1
|
|
114
|
-
|
|
115
|
-
|
|
113
|
+
if (splitAt !== -1) {
|
|
114
|
+
then(slice(payload, 0, splitAt), slice(payload, splitAt + 1));
|
|
115
|
+
}
|
|
116
116
|
};
|
|
117
117
|
const receivePayload = (payload, receive) =>
|
|
118
118
|
ifPayloadValid(payload, (fromClientId, remainder) =>
|
|
@@ -209,9 +209,11 @@ const createCustomPersister = (
|
|
|
209
209
|
await schedule(async () => {
|
|
210
210
|
try {
|
|
211
211
|
const content = await getPersisted();
|
|
212
|
-
isArray(content)
|
|
213
|
-
|
|
214
|
-
|
|
212
|
+
if (isArray(content)) {
|
|
213
|
+
setContentOrChanges(content);
|
|
214
|
+
} else {
|
|
215
|
+
errorNew(`Content is not an array ${content}`);
|
|
216
|
+
}
|
|
215
217
|
} catch (error) {
|
|
216
218
|
if (initialContent) {
|
|
217
219
|
setDefaultContent(initialContent);
|
|
@@ -591,13 +593,15 @@ const getListenerFunctions = (getThing) => {
|
|
|
591
593
|
([listener, , path = [], pathGetters, extraArgsGetter]) => {
|
|
592
594
|
const callWithIds = (...ids) => {
|
|
593
595
|
const index = size(ids);
|
|
594
|
-
index == size(path)
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
596
|
+
if (index == size(path)) {
|
|
597
|
+
listener(thing, ...ids, ...extraArgsGetter(ids));
|
|
598
|
+
} else if (isUndefined(path[index])) {
|
|
599
|
+
arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
|
|
600
|
+
callWithIds(...ids, id2),
|
|
601
|
+
);
|
|
602
|
+
} else {
|
|
603
|
+
callWithIds(...ids, path[index]);
|
|
604
|
+
}
|
|
601
605
|
};
|
|
602
606
|
callWithIds();
|
|
603
607
|
},
|
|
@@ -659,18 +663,18 @@ const createWsServer = (webSocketServer, createPersisterForPath) => {
|
|
|
659
663
|
ifPayloadValid(payload, (toClientId, remainder) => {
|
|
660
664
|
const forwardedPayload = createRawPayload(clientId, remainder);
|
|
661
665
|
if (toClientId === EMPTY_STRING) {
|
|
662
|
-
clientId !== SERVER_CLIENT_ID
|
|
663
|
-
|
|
664
|
-
|
|
666
|
+
if (clientId !== SERVER_CLIENT_ID) {
|
|
667
|
+
serverClient[3 /* Send */]?.(forwardedPayload);
|
|
668
|
+
}
|
|
665
669
|
mapForEach(clients, (otherClientId, otherWebSocket) =>
|
|
666
670
|
otherClientId !== clientId
|
|
667
671
|
? otherWebSocket.send(forwardedPayload)
|
|
668
672
|
: 0,
|
|
669
673
|
);
|
|
674
|
+
} else if (toClientId === SERVER_CLIENT_ID) {
|
|
675
|
+
serverClient[3 /* Send */]?.(forwardedPayload);
|
|
670
676
|
} else {
|
|
671
|
-
toClientId
|
|
672
|
-
? serverClient[3 /* Send */]?.(forwardedPayload)
|
|
673
|
-
: mapGet(clients, toClientId)?.send(forwardedPayload);
|
|
677
|
+
mapGet(clients, toClientId)?.send(forwardedPayload);
|
|
674
678
|
}
|
|
675
679
|
});
|
|
676
680
|
webSocketServer.on('connection', (webSocket, request) =>
|
|
@@ -693,9 +697,11 @@ const createWsServer = (webSocketServer, createPersisterForPath) => {
|
|
|
693
697
|
callListeners(clientIdListeners, [pathId], clientId, 1);
|
|
694
698
|
webSocket.on('message', (data) => {
|
|
695
699
|
const payload = data.toString(UTF8);
|
|
696
|
-
serverClient[0 /* State */] == 0 /* Ready */
|
|
697
|
-
|
|
698
|
-
|
|
700
|
+
if (serverClient[0 /* State */] == 0 /* Ready */) {
|
|
701
|
+
messageHandler(payload);
|
|
702
|
+
} else {
|
|
703
|
+
arrayPush(serverClient[4 /* Buffer */], payload);
|
|
704
|
+
}
|
|
699
705
|
});
|
|
700
706
|
if (serverClient[0 /* State */] == 1 /* Configured */) {
|
|
701
707
|
await startServerClient(serverClient);
|