tinybase 7.0.0-beta.1 → 7.0.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/@types/common/index.d.ts +1 -1
- package/@types/mergeable-store/index.d.ts +2 -1
- package/@types/mergeable-store/with-schemas/index.d.ts +5 -3
- package/@types/omni/index.d.ts +2 -0
- package/@types/omni/with-schemas/index.d.ts +2 -0
- package/@types/persisters/index.d.ts +4 -0
- package/@types/persisters/persister-automerge/index.d.ts +4 -6
- package/@types/persisters/persister-automerge/with-schemas/index.d.ts +7 -8
- package/@types/persisters/persister-browser/index.d.ts +97 -6
- package/@types/persisters/persister-browser/with-schemas/index.d.ts +113 -6
- package/@types/persisters/persister-cr-sqlite-wasm/index.d.ts +4 -0
- package/@types/persisters/persister-cr-sqlite-wasm/with-schemas/index.d.ts +7 -2
- package/@types/persisters/persister-durable-object-sql-storage/index.d.ts +6 -2
- package/@types/persisters/persister-durable-object-sql-storage/with-schemas/index.d.ts +5 -0
- package/@types/persisters/persister-durable-object-storage/index.d.ts +1 -2
- package/@types/persisters/persister-durable-object-storage/with-schemas/index.d.ts +3 -2
- package/@types/persisters/persister-electric-sql/index.d.ts +4 -0
- package/@types/persisters/persister-electric-sql/with-schemas/index.d.ts +7 -2
- package/@types/persisters/persister-expo-sqlite/index.d.ts +5 -2
- package/@types/persisters/persister-expo-sqlite/with-schemas/index.d.ts +7 -2
- package/@types/persisters/persister-file/index.d.ts +1 -2
- package/@types/persisters/persister-file/with-schemas/index.d.ts +3 -2
- package/@types/persisters/persister-indexed-db/with-schemas/index.d.ts +3 -2
- package/@types/persisters/persister-libsql/index.d.ts +4 -0
- package/@types/persisters/persister-libsql/with-schemas/index.d.ts +7 -2
- package/@types/persisters/persister-partykit-client/with-schemas/index.d.ts +3 -2
- package/@types/persisters/persister-pglite/index.d.ts +7 -3
- package/@types/persisters/persister-pglite/with-schemas/index.d.ts +9 -3
- package/@types/persisters/persister-postgres/index.d.ts +5 -2
- package/@types/persisters/persister-postgres/with-schemas/index.d.ts +7 -2
- package/@types/persisters/persister-powersync/index.d.ts +4 -0
- package/@types/persisters/persister-powersync/with-schemas/index.d.ts +7 -2
- package/@types/persisters/persister-react-native-mmkv/index.d.ts +117 -0
- package/@types/persisters/persister-react-native-mmkv/with-schemas/index.d.ts +133 -0
- package/@types/persisters/persister-react-native-sqlite/index.d.ts +184 -0
- package/@types/persisters/persister-react-native-sqlite/with-schemas/index.d.ts +207 -0
- package/@types/persisters/persister-remote/with-schemas/index.d.ts +3 -2
- package/@types/persisters/persister-sqlite-bun/index.d.ts +5 -2
- package/@types/persisters/persister-sqlite-bun/with-schemas/index.d.ts +7 -2
- package/@types/persisters/persister-sqlite-wasm/index.d.ts +6 -2
- package/@types/persisters/persister-sqlite-wasm/with-schemas/index.d.ts +8 -2
- package/@types/persisters/persister-sqlite3/index.d.ts +5 -2
- package/@types/persisters/persister-sqlite3/with-schemas/index.d.ts +7 -2
- package/@types/persisters/persister-yjs/with-schemas/index.d.ts +3 -2
- package/@types/persisters/with-schemas/index.d.ts +4 -0
- package/@types/queries/index.d.ts +1 -1
- package/@types/queries/with-schemas/index.d.ts +4 -8
- package/@types/store/index.d.ts +34 -19
- package/@types/store/with-schemas/index.d.ts +28 -13
- package/@types/synchronizers/index.d.ts +1 -0
- package/@types/synchronizers/synchronizer-broadcast-channel/with-schemas/index.d.ts +3 -2
- package/@types/synchronizers/synchronizer-local/with-schemas/index.d.ts +3 -2
- package/@types/synchronizers/synchronizer-ws-client/index.d.ts +4 -2
- package/@types/synchronizers/synchronizer-ws-client/with-schemas/index.d.ts +1 -0
- package/@types/synchronizers/synchronizer-ws-server/index.d.ts +7 -7
- package/@types/synchronizers/synchronizer-ws-server/with-schemas/index.d.ts +7 -7
- package/@types/synchronizers/synchronizer-ws-server-durable-object/index.d.ts +1 -0
- package/@types/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.d.ts +1 -0
- package/@types/synchronizers/synchronizer-ws-server-simple/index.d.ts +1 -1
- package/@types/synchronizers/synchronizer-ws-server-simple/with-schemas/index.d.ts +1 -1
- package/@types/synchronizers/with-schemas/index.d.ts +4 -2
- package/@types/ui-react/index.d.ts +6 -1
- package/@types/ui-react/with-schemas/index.d.ts +6 -1
- package/@types/ui-react-dom/index.d.ts +153 -20
- package/@types/ui-react-dom/with-schemas/index.d.ts +72 -20
- package/@types/ui-react-inspector/index.d.ts +8 -0
- package/@types/ui-react-inspector/with-schemas/index.d.ts +27 -1925
- package/agents.md +343 -0
- package/checkpoints/index.js +11 -6
- package/checkpoints/with-schemas/index.js +11 -6
- package/common/index.js +8 -4
- package/common/with-schemas/index.js +8 -4
- package/index.js +63 -31
- package/indexes/index.js +10 -5
- package/indexes/with-schemas/index.js +10 -5
- package/mergeable-store/index.js +54 -22
- package/mergeable-store/with-schemas/index.js +54 -22
- package/metrics/index.js +10 -5
- package/metrics/with-schemas/index.js +10 -5
- package/min/checkpoints/index.js +1 -1
- package/min/checkpoints/index.js.gz +0 -0
- package/min/checkpoints/with-schemas/index.js +1 -1
- package/min/checkpoints/with-schemas/index.js.gz +0 -0
- package/min/common/index.js +1 -1
- package/min/common/index.js.gz +0 -0
- package/min/common/with-schemas/index.js +1 -1
- package/min/common/with-schemas/index.js.gz +0 -0
- package/min/index.js +1 -1
- package/min/index.js.gz +0 -0
- package/min/indexes/index.js +1 -1
- package/min/indexes/index.js.gz +0 -0
- package/min/indexes/with-schemas/index.js +1 -1
- package/min/indexes/with-schemas/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/metrics/index.js +1 -1
- package/min/metrics/index.js.gz +0 -0
- package/min/metrics/with-schemas/index.js +1 -1
- package/min/metrics/with-schemas/index.js.gz +0 -0
- package/min/omni/index.js +1 -1
- package/min/omni/index.js.gz +0 -0
- package/min/omni/with-schemas/index.js +1 -1
- package/min/omni/with-schemas/index.js.gz +0 -0
- package/min/persisters/index.js +1 -1
- package/min/persisters/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/persisters/persister-browser/index.js +1 -1
- package/min/persisters/persister-browser/index.js.gz +0 -0
- package/min/persisters/persister-browser/with-schemas/index.js +1 -1
- package/min/persisters/persister-browser/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
- package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
- package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
- package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-durable-object-sql-storage/index.js +1 -1
- package/min/persisters/persister-durable-object-sql-storage/index.js.gz +0 -0
- package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js +1 -1
- package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-durable-object-storage/index.js +1 -1
- package/min/persisters/persister-durable-object-storage/index.js.gz +0 -0
- package/min/persisters/persister-durable-object-storage/with-schemas/index.js +1 -1
- package/min/persisters/persister-durable-object-storage/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-electric-sql/index.js +1 -1
- package/min/persisters/persister-electric-sql/index.js.gz +0 -0
- package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
- package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-expo-sqlite/index.js +1 -1
- package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
- package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
- package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-file/index.js +1 -1
- package/min/persisters/persister-file/index.js.gz +0 -0
- package/min/persisters/persister-file/with-schemas/index.js +1 -1
- package/min/persisters/persister-file/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-indexed-db/index.js +1 -1
- package/min/persisters/persister-indexed-db/index.js.gz +0 -0
- package/min/persisters/persister-indexed-db/with-schemas/index.js +1 -1
- package/min/persisters/persister-indexed-db/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-libsql/index.js +1 -1
- package/min/persisters/persister-libsql/index.js.gz +0 -0
- package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
- package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-partykit-client/index.js +1 -1
- package/min/persisters/persister-partykit-client/index.js.gz +0 -0
- package/min/persisters/persister-partykit-client/with-schemas/index.js +1 -1
- package/min/persisters/persister-partykit-client/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-partykit-server/index.js +1 -1
- package/min/persisters/persister-partykit-server/index.js.gz +0 -0
- package/min/persisters/persister-partykit-server/with-schemas/index.js +1 -1
- package/min/persisters/persister-partykit-server/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-pglite/index.js +1 -1
- package/min/persisters/persister-pglite/index.js.gz +0 -0
- package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
- package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-postgres/index.js +1 -1
- package/min/persisters/persister-postgres/index.js.gz +0 -0
- package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
- package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-powersync/index.js +1 -1
- package/min/persisters/persister-powersync/index.js.gz +0 -0
- package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
- package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-react-native-mmkv/index.js +1 -0
- package/min/persisters/persister-react-native-mmkv/index.js.gz +0 -0
- package/min/persisters/persister-react-native-mmkv/with-schemas/index.js +1 -0
- package/min/persisters/persister-react-native-mmkv/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-react-native-sqlite/index.js +1 -0
- package/min/persisters/persister-react-native-sqlite/index.js.gz +0 -0
- package/min/persisters/persister-react-native-sqlite/with-schemas/index.js +1 -0
- package/min/persisters/persister-react-native-sqlite/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-remote/index.js +1 -1
- package/min/persisters/persister-remote/index.js.gz +0 -0
- package/min/persisters/persister-remote/with-schemas/index.js +1 -1
- package/min/persisters/persister-remote/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-bun/index.js +1 -1
- package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -1
- package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-wasm/index.js +1 -1
- package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
- package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-sqlite3/index.js +1 -1
- package/min/persisters/persister-sqlite3/index.js.gz +0 -0
- package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
- package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-yjs/index.js +1 -1
- package/min/persisters/persister-yjs/index.js.gz +0 -0
- package/min/persisters/persister-yjs/with-schemas/index.js +1 -1
- package/min/persisters/persister-yjs/with-schemas/index.js.gz +0 -0
- package/min/persisters/with-schemas/index.js +1 -1
- package/min/persisters/with-schemas/index.js.gz +0 -0
- package/min/queries/index.js +1 -1
- package/min/queries/index.js.gz +0 -0
- package/min/queries/with-schemas/index.js +1 -1
- package/min/queries/with-schemas/index.js.gz +0 -0
- package/min/relationships/index.js +1 -1
- package/min/relationships/index.js.gz +0 -0
- package/min/relationships/with-schemas/index.js +1 -1
- package/min/relationships/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/synchronizers/index.js +1 -1
- package/min/synchronizers/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-broadcast-channel/index.js +1 -1
- package/min/synchronizers/synchronizer-broadcast-channel/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-local/index.js +1 -1
- package/min/synchronizers/synchronizer-local/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-local/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-local/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-client/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-client/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-durable-object/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-durable-object/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-simple/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-simple/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/with-schemas/index.js +1 -1
- package/min/synchronizers/with-schemas/index.js.gz +0 -0
- package/min/ui-react/index.js +1 -1
- package/min/ui-react/index.js.gz +0 -0
- package/min/ui-react/with-schemas/index.js +1 -1
- package/min/ui-react/with-schemas/index.js.gz +0 -0
- package/min/ui-react-dom/index.js +1 -1
- package/min/ui-react-dom/index.js.gz +0 -0
- package/min/ui-react-dom/with-schemas/index.js +1 -1
- package/min/ui-react-dom/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/omni/index.js +2178 -1203
- package/omni/with-schemas/index.js +2178 -1203
- package/package.json +91 -11
- package/persisters/index.js +16 -10
- package/persisters/persister-automerge/index.js +15 -9
- package/persisters/persister-automerge/with-schemas/index.js +15 -9
- package/persisters/persister-browser/index.js +41 -9
- package/persisters/persister-browser/with-schemas/index.js +41 -9
- package/persisters/persister-cr-sqlite-wasm/index.js +16 -10
- package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +16 -10
- package/persisters/persister-durable-object-sql-storage/index.js +16 -10
- package/persisters/persister-durable-object-sql-storage/with-schemas/index.js +16 -10
- package/persisters/persister-durable-object-storage/index.js +14 -8
- package/persisters/persister-durable-object-storage/with-schemas/index.js +14 -8
- package/persisters/persister-electric-sql/index.js +16 -10
- package/persisters/persister-electric-sql/with-schemas/index.js +16 -10
- package/persisters/persister-expo-sqlite/index.js +16 -10
- package/persisters/persister-expo-sqlite/with-schemas/index.js +16 -10
- package/persisters/persister-file/index.js +14 -8
- package/persisters/persister-file/with-schemas/index.js +14 -8
- package/persisters/persister-indexed-db/index.js +14 -8
- package/persisters/persister-indexed-db/with-schemas/index.js +14 -8
- package/persisters/persister-libsql/index.js +16 -10
- package/persisters/persister-libsql/with-schemas/index.js +16 -10
- package/persisters/persister-partykit-client/index.js +14 -8
- package/persisters/persister-partykit-client/with-schemas/index.js +14 -8
- package/persisters/persister-partykit-server/index.js +7 -3
- package/persisters/persister-partykit-server/with-schemas/index.js +7 -3
- package/persisters/persister-pglite/index.js +15 -9
- package/persisters/persister-pglite/with-schemas/index.js +15 -9
- package/persisters/persister-postgres/index.js +15 -9
- package/persisters/persister-postgres/with-schemas/index.js +15 -9
- package/persisters/persister-powersync/index.js +16 -10
- package/persisters/persister-powersync/with-schemas/index.js +16 -10
- package/persisters/persister-react-native-mmkv/index.js +465 -0
- package/persisters/persister-react-native-mmkv/with-schemas/index.js +465 -0
- package/persisters/persister-react-native-sqlite/index.js +1195 -0
- package/persisters/persister-react-native-sqlite/with-schemas/index.js +1195 -0
- package/persisters/persister-remote/index.js +16 -10
- package/persisters/persister-remote/with-schemas/index.js +16 -10
- package/persisters/persister-sqlite-bun/index.js +16 -10
- package/persisters/persister-sqlite-bun/with-schemas/index.js +16 -10
- package/persisters/persister-sqlite-wasm/index.js +16 -10
- package/persisters/persister-sqlite-wasm/with-schemas/index.js +16 -10
- package/persisters/persister-sqlite3/index.js +16 -10
- package/persisters/persister-sqlite3/with-schemas/index.js +16 -10
- package/persisters/persister-yjs/index.js +20 -12
- package/persisters/persister-yjs/with-schemas/index.js +20 -12
- package/persisters/with-schemas/index.js +16 -10
- package/queries/index.js +20 -12
- package/queries/with-schemas/index.js +20 -12
- package/readme.md +13 -13
- package/relationships/index.js +10 -5
- package/relationships/with-schemas/index.js +10 -5
- package/releases.md +179 -41
- package/store/index.js +50 -18
- package/store/with-schemas/index.js +50 -18
- package/synchronizers/index.js +16 -10
- package/synchronizers/synchronizer-broadcast-channel/index.js +17 -11
- package/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +17 -11
- package/synchronizers/synchronizer-local/index.js +17 -11
- package/synchronizers/synchronizer-local/with-schemas/index.js +17 -11
- package/synchronizers/synchronizer-ws-client/index.js +16 -10
- package/synchronizers/synchronizer-ws-client/with-schemas/index.js +16 -10
- package/synchronizers/synchronizer-ws-server/index.js +16 -10
- package/synchronizers/synchronizer-ws-server/with-schemas/index.js +16 -10
- package/synchronizers/synchronizer-ws-server-durable-object/index.js +16 -10
- package/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +16 -10
- package/synchronizers/synchronizer-ws-server-simple/index.js +8 -4
- package/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +8 -4
- package/synchronizers/with-schemas/index.js +16 -10
- package/ui-react/index.js +408 -374
- package/ui-react/with-schemas/index.js +408 -374
- package/ui-react-dom/index.js +883 -437
- package/ui-react-dom/with-schemas/index.js +883 -437
- package/ui-react-inspector/index.js +1761 -556
- package/ui-react-inspector/with-schemas/index.js +1761 -556
- package/with-schemas/index.js +63 -31
package/agents.md
ADDED
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
# Agents Guide
|
|
2
|
+
|
|
3
|
+
This file follows the [agents.md](https://agents.md/) specification for AI agent
|
|
4
|
+
context. If you're a human reading this, it provides a comprehensive overview of
|
|
5
|
+
the TinyBase project for AI assistants working with the codebase.
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
**TinyBase** is a reactive data store and sync engine for local-first
|
|
10
|
+
applications. It is a TypeScript library that provides a reactive, in-memory
|
|
11
|
+
data store with a powerful synchronization engine. It's designed for building
|
|
12
|
+
local-first applications that work offline and sync across devices. The library
|
|
13
|
+
is exceptionally small (5.3kB-11.7kB), has zero runtime dependencies, and
|
|
14
|
+
maintains 100% test coverage.
|
|
15
|
+
|
|
16
|
+
- **Website**: https://tinybase.org
|
|
17
|
+
- **Repository**: https://github.com/tinyplex/tinybase
|
|
18
|
+
- **Documentation**: https://tinybase.org/api/
|
|
19
|
+
- **License**: MIT
|
|
20
|
+
- **Author**: James Pearce (@jamesgpearce)
|
|
21
|
+
|
|
22
|
+
## Core Concepts
|
|
23
|
+
|
|
24
|
+
### Data Store
|
|
25
|
+
|
|
26
|
+
TinyBase provides two types of data structures:
|
|
27
|
+
|
|
28
|
+
- **Tables**: Tabular data organized as Table → Row → Cell (similar to
|
|
29
|
+
relational databases)
|
|
30
|
+
- **Values**: Simple key-value pairs for application state
|
|
31
|
+
|
|
32
|
+
Both can coexist in the same Store and support optional schemas with type
|
|
33
|
+
enforcement.
|
|
34
|
+
|
|
35
|
+
### Reactivity
|
|
36
|
+
|
|
37
|
+
The library implements a fine-grained reactive system where you can listen to
|
|
38
|
+
changes at any level:
|
|
39
|
+
|
|
40
|
+
- Entire store changes
|
|
41
|
+
- Table/value additions or removals
|
|
42
|
+
- Row changes within a table
|
|
43
|
+
- Individual cell or value changes
|
|
44
|
+
|
|
45
|
+
Listeners fire automatically when data changes, enabling efficient UI updates
|
|
46
|
+
that only re-render affected components.
|
|
47
|
+
|
|
48
|
+
### Synchronization
|
|
49
|
+
|
|
50
|
+
TinyBase includes native CRDT (Conflict-free Replicated Data Type) support via
|
|
51
|
+
the MergeableStore, allowing deterministic synchronization across multiple
|
|
52
|
+
clients and servers using Hybrid Logical Clocks for causality tracking.
|
|
53
|
+
|
|
54
|
+
## Key Features
|
|
55
|
+
|
|
56
|
+
### Data Management
|
|
57
|
+
|
|
58
|
+
- **Schemas**: Optional TypeScript-inferred schemas for type safety
|
|
59
|
+
- **Indexes**: Fast lookups by cell values with slice-based grouping
|
|
60
|
+
- **Queries**: SQL-like query engine (select, join, filter, group) without
|
|
61
|
+
actual SQL
|
|
62
|
+
- **Relationships**: Define foreign-key relationships between tables
|
|
63
|
+
- **Metrics**: Built-in aggregations (sum, avg, min, max)
|
|
64
|
+
- **Checkpoints**: Undo/redo functionality with branching support
|
|
65
|
+
|
|
66
|
+
### Persistence
|
|
67
|
+
|
|
68
|
+
Multiple storage backends supported via Persisters:
|
|
69
|
+
|
|
70
|
+
- **Browser**: LocalStorage, SessionStorage, IndexedDB, OPFS
|
|
71
|
+
- **Databases**: SQLite (Bun, WASM, sqlite3), PostgreSQL, PGlite, Turso (libSQL)
|
|
72
|
+
- **Third-party**: ElectricSQL, PowerSync, CR-SQLite
|
|
73
|
+
- **Cloud**: PartyKit, Cloudflare Durable Objects
|
|
74
|
+
- **Files**: Node.js file system
|
|
75
|
+
- **CRDT**: Yjs, Automerge integration
|
|
76
|
+
- **React Native**: MMKV, SQLite
|
|
77
|
+
|
|
78
|
+
### Synchronization
|
|
79
|
+
|
|
80
|
+
Synchronizers enable real-time data sync:
|
|
81
|
+
|
|
82
|
+
- WebSocket (client and server)
|
|
83
|
+
- BroadcastChannel (same-origin tabs)
|
|
84
|
+
- Local (in-memory for testing)
|
|
85
|
+
- Custom transports (extensible)
|
|
86
|
+
|
|
87
|
+
### React Integration
|
|
88
|
+
|
|
89
|
+
Optional `ui-react` module provides:
|
|
90
|
+
|
|
91
|
+
- **Hooks**: `useCell`, `useRow`, `useTable`, `useTables`, `useValue`, etc.
|
|
92
|
+
- **Components**: Pre-built reactive views for data rendering
|
|
93
|
+
- **Context**: Multi-store support with ID-based contexts
|
|
94
|
+
- **DOM Components**: `ui-react-dom` with interactive tables
|
|
95
|
+
- **Inspector**: Developer tools overlay for debugging
|
|
96
|
+
|
|
97
|
+
## Architecture
|
|
98
|
+
|
|
99
|
+
### Modular Design
|
|
100
|
+
|
|
101
|
+
TinyBase uses a modular architecture where each feature is an independent module
|
|
102
|
+
that can be imported separately:
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
tinybase # Core store module
|
|
106
|
+
tinybase/indexes # Indexing
|
|
107
|
+
tinybase/queries # Query engine
|
|
108
|
+
tinybase/relationships # Relationships
|
|
109
|
+
tinybase/metrics # Aggregations
|
|
110
|
+
tinybase/checkpoints # Undo/redo
|
|
111
|
+
tinybase/mergeable-store # CRDT support
|
|
112
|
+
tinybase/persisters/persister-* # Storage backends
|
|
113
|
+
tinybase/synchronizers/synchronizer-* # Sync transports
|
|
114
|
+
tinybase/ui-react # React hooks
|
|
115
|
+
tinybase/ui-react-dom # React DOM components
|
|
116
|
+
tinybase/ui-react-inspector # DevTools
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Type System
|
|
120
|
+
|
|
121
|
+
Strong TypeScript support with:
|
|
122
|
+
|
|
123
|
+
- Generic types that infer from schemas
|
|
124
|
+
- Conditional types for schema-aware APIs
|
|
125
|
+
- Mapped types for compile-time validation
|
|
126
|
+
- Type-safe hooks and components
|
|
127
|
+
|
|
128
|
+
### Build System
|
|
129
|
+
|
|
130
|
+
- **Gulp**: Build orchestration
|
|
131
|
+
- **TypeScript**: Source language with strict mode
|
|
132
|
+
- **Rollup**: Bundling (implied)
|
|
133
|
+
- **ESM**: Primary module format
|
|
134
|
+
- **Tree-shaking**: Aggressive optimization for minimal bundles
|
|
135
|
+
|
|
136
|
+
## Development
|
|
137
|
+
|
|
138
|
+
### Prerequisites
|
|
139
|
+
|
|
140
|
+
- Node.js >= 23.10.0
|
|
141
|
+
- npm >= 10.9.2
|
|
142
|
+
|
|
143
|
+
### Setup
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
git clone https://github.com/tinyplex/tinybase.git
|
|
147
|
+
cd tinybase
|
|
148
|
+
npm install
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Common Commands
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
npm run compileAndTestUnit # Compile and run unit tests
|
|
155
|
+
npm run testUnitFast # Quick test iteration
|
|
156
|
+
npm run lint # Run ESLint
|
|
157
|
+
npm run spell # Spell check
|
|
158
|
+
npm run preCommit # Full pre-commit check
|
|
159
|
+
npm run compileDocs # Generate API documentation
|
|
160
|
+
npm run serveDocs # Preview documentation locally
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Testing
|
|
164
|
+
|
|
165
|
+
- **Framework**: Vitest
|
|
166
|
+
- **Coverage**: 100% required (enforced)
|
|
167
|
+
- **Types**: Unit, performance, end-to-end, production
|
|
168
|
+
- **Environment**: happy-dom (unit), puppeteer (e2e)
|
|
169
|
+
|
|
170
|
+
### Code Style
|
|
171
|
+
|
|
172
|
+
- **ESLint**: Enforced with strict rules
|
|
173
|
+
- **Prettier**: Automatic formatting
|
|
174
|
+
- **Max line length**: 80 characters
|
|
175
|
+
- **Quotes**: Single quotes (template literals allowed)
|
|
176
|
+
- **Semicolons**: Required
|
|
177
|
+
- **Object spacing**: No spaces in braces `{key: value}`
|
|
178
|
+
|
|
179
|
+
## Project Structure
|
|
180
|
+
|
|
181
|
+
```
|
|
182
|
+
tinybase/
|
|
183
|
+
├── src/ # Source code
|
|
184
|
+
│ ├── @types/ # TypeScript declarations
|
|
185
|
+
│ ├── store/ # Core store implementation
|
|
186
|
+
│ ├── indexes/ # Indexing module
|
|
187
|
+
│ ├── queries/ # Query engine
|
|
188
|
+
│ ├── relationships/ # Relationships module
|
|
189
|
+
│ ├── metrics/ # Metrics module
|
|
190
|
+
│ ├── checkpoints/ # Checkpoints module
|
|
191
|
+
│ ├── mergeable-store/ # CRDT implementation
|
|
192
|
+
│ ├── persisters/ # Storage backends
|
|
193
|
+
│ ├── synchronizers/ # Sync transports
|
|
194
|
+
│ ├── ui-react/ # React hooks
|
|
195
|
+
│ ├── ui-react-dom/ # React DOM components
|
|
196
|
+
│ ├── ui-react-inspector/ # DevTools
|
|
197
|
+
│ └── common/ # Shared utilities
|
|
198
|
+
├── test/ # Tests
|
|
199
|
+
│ ├── unit/ # Unit tests
|
|
200
|
+
│ ├── perf/ # Performance tests
|
|
201
|
+
│ ├── e2e/ # End-to-end tests
|
|
202
|
+
│ └── prod/ # Production build tests
|
|
203
|
+
├── docs/ # Generated documentation
|
|
204
|
+
├── dist/ # Build output
|
|
205
|
+
├── site/ # Documentation site source
|
|
206
|
+
├── gulpfile.mjs # Build configuration
|
|
207
|
+
├── vitest.config.ts # Test configuration
|
|
208
|
+
├── eslint.config.js # Linting rules
|
|
209
|
+
└── tsconfig.json # TypeScript config
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## Contributing
|
|
213
|
+
|
|
214
|
+
Contributions are welcome! This is a spare-time project, so response times may
|
|
215
|
+
vary.
|
|
216
|
+
|
|
217
|
+
**Requirements**:
|
|
218
|
+
|
|
219
|
+
1. Follow the Prettier and ESLint configurations
|
|
220
|
+
2. Maintain 100% test coverage
|
|
221
|
+
3. Update documentation for API changes
|
|
222
|
+
4. Add examples for new features
|
|
223
|
+
|
|
224
|
+
**Process**:
|
|
225
|
+
|
|
226
|
+
1. Fork the repository
|
|
227
|
+
2. Create a feature branch
|
|
228
|
+
3. Make your changes with tests
|
|
229
|
+
4. Run `npm run preCommit` to verify
|
|
230
|
+
5. Submit a pull request
|
|
231
|
+
|
|
232
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for details.
|
|
233
|
+
|
|
234
|
+
## Community
|
|
235
|
+
|
|
236
|
+
- **Discord**: https://discord.com/invite/mGz3mevwP8
|
|
237
|
+
- **Discussions**: https://github.com/tinyplex/tinybase/discussions
|
|
238
|
+
- **Issues**: https://github.com/tinyplex/tinybase/issues
|
|
239
|
+
- **Bluesky**: https://bsky.app/profile/tinybase.bsky.social
|
|
240
|
+
- **Twitter/X**: https://x.com/tinybasejs
|
|
241
|
+
|
|
242
|
+
## Use Cases
|
|
243
|
+
|
|
244
|
+
TinyBase is ideal for:
|
|
245
|
+
|
|
246
|
+
- **Local-first applications**: Apps that work offline and sync later
|
|
247
|
+
- **Real-time collaboration**: Multi-user applications with CRDT sync
|
|
248
|
+
- **Reactive UIs**: Applications requiring fine-grained reactivity
|
|
249
|
+
- **Mobile apps**: React Native apps with local storage
|
|
250
|
+
- **Edge computing**: Cloudflare Workers, Durable Objects
|
|
251
|
+
- **Progressive Web Apps**: Offline-capable web applications
|
|
252
|
+
- **Games**: Real-time state management with undo/redo
|
|
253
|
+
- **Data dashboards**: Reactive data visualization
|
|
254
|
+
|
|
255
|
+
## Performance
|
|
256
|
+
|
|
257
|
+
- Tiny bundle sizes (5.3kB - 11.7kB depending on features)
|
|
258
|
+
- Zero runtime dependencies
|
|
259
|
+
- Efficient change detection and listener notification
|
|
260
|
+
- Memory pooling for ID generation
|
|
261
|
+
- Tree-shakeable modular design
|
|
262
|
+
- Optimized for bundle size and runtime performance
|
|
263
|
+
|
|
264
|
+
## Related Projects
|
|
265
|
+
|
|
266
|
+
- **Synclets**: Generic synchronization library (https://synclets.org)
|
|
267
|
+
- **TinyWidgets**: Widget toolkit built on TinyBase (https://tinywidgets.org)
|
|
268
|
+
- **TinyTick**: Reactive ticker tape component (https://tinytick.org)
|
|
269
|
+
|
|
270
|
+
## License
|
|
271
|
+
|
|
272
|
+
MIT License - see [LICENSE](LICENSE) file for details.
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
**Note for AI Agents**: TinyBase uses unique patterns including utility function
|
|
277
|
+
wrappers (e.g., `arrayForEach`, `mapGet`, `objHas`) instead of native methods
|
|
278
|
+
for consistency and tree-shaking. Always use factory functions (`createStore`,
|
|
279
|
+
`createIndexes`, etc.) with builder pattern chaining. Maintain 100% test
|
|
280
|
+
coverage and follow the strict 80-character line length. See
|
|
281
|
+
`.github/copilot-instructions.md` for detailed coding patterns.
|
|
282
|
+
|
|
283
|
+
## Documentation System
|
|
284
|
+
|
|
285
|
+
TinyBase has a sophisticated documentation system that generates the website
|
|
286
|
+
from source code and markdown files.
|
|
287
|
+
|
|
288
|
+
### Documentation Structure
|
|
289
|
+
|
|
290
|
+
1. **Type Definitions (`src/@types/*/`)**: TypeScript `.d.ts` files contain the
|
|
291
|
+
API type definitions. **Never add comments directly to `.d.ts` files**.
|
|
292
|
+
|
|
293
|
+
2. **Documentation Files (`src/@types/*/docs.js`)**: Companion `docs.js` files
|
|
294
|
+
sit alongside `.d.ts` files. Use `///` convention to document types and
|
|
295
|
+
functions. These are stitched together at build time to generate
|
|
296
|
+
documentation.
|
|
297
|
+
|
|
298
|
+
3. **Guide Files (`site/guides/*/*.md`)**: Markdown files in the `site/guides/`
|
|
299
|
+
directory, organized by topic (basics, schemas, persistence, etc.). These are
|
|
300
|
+
source files for guides on the website.
|
|
301
|
+
|
|
302
|
+
4. **Generated Files**: `/releases.md` and `/readme.md` in the root are
|
|
303
|
+
**GENERATED** from `/site/guides/16_releases.md` and `/site/home/index.md`.
|
|
304
|
+
**Never edit the generated files directly**.
|
|
305
|
+
|
|
306
|
+
### Documentation Testing
|
|
307
|
+
|
|
308
|
+
TinyBase has automated tests that validate all inline code examples in
|
|
309
|
+
documentation:
|
|
310
|
+
|
|
311
|
+
```bash
|
|
312
|
+
npx vitest run ./test/unit/documentation.test.ts --retry=0
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
**How it works**:
|
|
316
|
+
|
|
317
|
+
- Extracts all code blocks from markdown files and `docs.js` files
|
|
318
|
+
- Concatenates all examples from each file together
|
|
319
|
+
- Parses and executes them to ensure they work
|
|
320
|
+
- This means examples in the same file share scope
|
|
321
|
+
|
|
322
|
+
**Critical constraints**:
|
|
323
|
+
|
|
324
|
+
- Don't redeclare variables across examples in the same file
|
|
325
|
+
- First example can declare `const store = createStore()`, subsequent examples
|
|
326
|
+
reuse it
|
|
327
|
+
- Include necessary imports in examples that use them
|
|
328
|
+
- Avoid async operations in examples unless necessary
|
|
329
|
+
- Keep examples simple and focused
|
|
330
|
+
|
|
331
|
+
**Common pitfalls**:
|
|
332
|
+
|
|
333
|
+
- ❌ Declaring `const store` multiple times in the same file
|
|
334
|
+
- ❌ Using undefined functions (forgot import statement)
|
|
335
|
+
- ✅ First example: `const store = createStore()`
|
|
336
|
+
- ✅ Later examples: `store.setCell(...)` (reuses existing store)
|
|
337
|
+
|
|
338
|
+
### Adding New Documentation
|
|
339
|
+
|
|
340
|
+
1. **API Documentation**: Edit `docs.js` file next to the type definition
|
|
341
|
+
2. **Guide Content**: Edit markdown files in `/site/guides/`
|
|
342
|
+
3. **Release Notes**: Edit `/site/guides/16_releases.md` (not `/releases.md`)
|
|
343
|
+
4. **Always run documentation tests** after changes to verify examples work
|
package/checkpoints/index.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
const EMPTY_STRING = '';
|
|
2
2
|
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
const getIfNotFunction =
|
|
4
|
+
(predicate = isNullish) =>
|
|
5
|
+
(value, then, otherwise) =>
|
|
6
|
+
predicate(value) ? otherwise?.() : then(value);
|
|
7
|
+
const isNullish = (thing) => thing == null;
|
|
8
|
+
const isUndefined = (thing) => thing === void 0;
|
|
9
|
+
const isNull = (thing) => thing === null;
|
|
10
|
+
const ifNotUndefined = getIfNotFunction(isUndefined);
|
|
6
11
|
const isArray = (thing) => Array.isArray(thing);
|
|
7
12
|
const size = (arrayOrString) => arrayOrString.length;
|
|
8
13
|
const test = (regex, subject) => regex.test(subject);
|
|
@@ -42,7 +47,7 @@ const mapGet = (map, key) => map?.get(key);
|
|
|
42
47
|
const mapForEach = (map, cb) =>
|
|
43
48
|
collForEach(map, (value, key) => cb(key, value));
|
|
44
49
|
const mapSet = (map, key, value) =>
|
|
45
|
-
|
|
50
|
+
value === void 0 ? (collDel(map, key), map) : map?.set(key, value);
|
|
46
51
|
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
47
52
|
if (!collHas(map, key)) {
|
|
48
53
|
mapSet(map, key, getDefaultValue());
|
|
@@ -165,7 +170,7 @@ const getListenerFunctions = (getThing) => {
|
|
|
165
170
|
const index = size(ids);
|
|
166
171
|
if (index == size(path)) {
|
|
167
172
|
listener(thing, ...ids, ...extraArgsGetter(ids));
|
|
168
|
-
} else if (
|
|
173
|
+
} else if (isNull(path[index])) {
|
|
169
174
|
arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
|
|
170
175
|
callWithIds(...ids, id2),
|
|
171
176
|
);
|
|
@@ -318,7 +323,7 @@ const createCheckpoints = getCreateFunction(
|
|
|
318
323
|
? goBackwardImpl
|
|
319
324
|
: arrayHas(forwardIds, checkpointId)
|
|
320
325
|
? goForwardImpl
|
|
321
|
-
:
|
|
326
|
+
: void 0;
|
|
322
327
|
while (!isUndefined(action) && checkpointId != currentId) {
|
|
323
328
|
action();
|
|
324
329
|
}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
const EMPTY_STRING = '';
|
|
2
2
|
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
const getIfNotFunction =
|
|
4
|
+
(predicate = isNullish) =>
|
|
5
|
+
(value, then, otherwise) =>
|
|
6
|
+
predicate(value) ? otherwise?.() : then(value);
|
|
7
|
+
const isNullish = (thing) => thing == null;
|
|
8
|
+
const isUndefined = (thing) => thing === void 0;
|
|
9
|
+
const isNull = (thing) => thing === null;
|
|
10
|
+
const ifNotUndefined = getIfNotFunction(isUndefined);
|
|
6
11
|
const isArray = (thing) => Array.isArray(thing);
|
|
7
12
|
const size = (arrayOrString) => arrayOrString.length;
|
|
8
13
|
const test = (regex, subject) => regex.test(subject);
|
|
@@ -42,7 +47,7 @@ const mapGet = (map, key) => map?.get(key);
|
|
|
42
47
|
const mapForEach = (map, cb) =>
|
|
43
48
|
collForEach(map, (value, key) => cb(key, value));
|
|
44
49
|
const mapSet = (map, key, value) =>
|
|
45
|
-
|
|
50
|
+
value === void 0 ? (collDel(map, key), map) : map?.set(key, value);
|
|
46
51
|
const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
|
|
47
52
|
if (!collHas(map, key)) {
|
|
48
53
|
mapSet(map, key, getDefaultValue());
|
|
@@ -165,7 +170,7 @@ const getListenerFunctions = (getThing) => {
|
|
|
165
170
|
const index = size(ids);
|
|
166
171
|
if (index == size(path)) {
|
|
167
172
|
listener(thing, ...ids, ...extraArgsGetter(ids));
|
|
168
|
-
} else if (
|
|
173
|
+
} else if (isNull(path[index])) {
|
|
169
174
|
arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
|
|
170
175
|
callWithIds(...ids, id2),
|
|
171
176
|
);
|
|
@@ -318,7 +323,7 @@ const createCheckpoints = getCreateFunction(
|
|
|
318
323
|
? goBackwardImpl
|
|
319
324
|
: arrayHas(forwardIds, checkpointId)
|
|
320
325
|
? goForwardImpl
|
|
321
|
-
:
|
|
326
|
+
: void 0;
|
|
322
327
|
while (!isUndefined(action) && checkpointId != currentId) {
|
|
323
328
|
action();
|
|
324
329
|
}
|
package/common/index.js
CHANGED
|
@@ -2,14 +2,18 @@ const EMPTY_STRING = '';
|
|
|
2
2
|
const strSplit = (str, separator = EMPTY_STRING, limit) =>
|
|
3
3
|
str.split(separator, limit);
|
|
4
4
|
|
|
5
|
+
const getIfNotFunction =
|
|
6
|
+
(predicate = isNullish) =>
|
|
7
|
+
(value, then, otherwise) =>
|
|
8
|
+
predicate(value) ? otherwise?.() : then(value);
|
|
5
9
|
const GLOBAL = globalThis;
|
|
6
10
|
const math = Math;
|
|
7
11
|
const mathMax = math.max;
|
|
8
12
|
const mathFloor = math.floor;
|
|
9
13
|
const isInstanceOf = (thing, cls) => thing instanceof cls;
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
|
|
14
|
+
const isNullish = (thing) => thing == null;
|
|
15
|
+
const isUndefined = (thing) => thing === void 0;
|
|
16
|
+
const ifNotUndefined = getIfNotFunction(isUndefined);
|
|
13
17
|
|
|
14
18
|
const arrayForEach = (array, cb) => array.forEach(cb);
|
|
15
19
|
const arrayMap = (array, cb) => array.map(cb);
|
|
@@ -38,7 +42,7 @@ const getUniqueId = (length = 16) =>
|
|
|
38
42
|
arrayReduce(
|
|
39
43
|
getRandomValues(new Uint8Array(length)),
|
|
40
44
|
(uniqueId, number) => uniqueId + encode(number),
|
|
41
|
-
|
|
45
|
+
EMPTY_STRING,
|
|
42
46
|
);
|
|
43
47
|
|
|
44
48
|
const jsonString = JSON.stringify;
|
|
@@ -2,14 +2,18 @@ const EMPTY_STRING = '';
|
|
|
2
2
|
const strSplit = (str, separator = EMPTY_STRING, limit) =>
|
|
3
3
|
str.split(separator, limit);
|
|
4
4
|
|
|
5
|
+
const getIfNotFunction =
|
|
6
|
+
(predicate = isNullish) =>
|
|
7
|
+
(value, then, otherwise) =>
|
|
8
|
+
predicate(value) ? otherwise?.() : then(value);
|
|
5
9
|
const GLOBAL = globalThis;
|
|
6
10
|
const math = Math;
|
|
7
11
|
const mathMax = math.max;
|
|
8
12
|
const mathFloor = math.floor;
|
|
9
13
|
const isInstanceOf = (thing, cls) => thing instanceof cls;
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
|
|
14
|
+
const isNullish = (thing) => thing == null;
|
|
15
|
+
const isUndefined = (thing) => thing === void 0;
|
|
16
|
+
const ifNotUndefined = getIfNotFunction(isUndefined);
|
|
13
17
|
|
|
14
18
|
const arrayForEach = (array, cb) => array.forEach(cb);
|
|
15
19
|
const arrayMap = (array, cb) => array.map(cb);
|
|
@@ -38,7 +42,7 @@ const getUniqueId = (length = 16) =>
|
|
|
38
42
|
arrayReduce(
|
|
39
43
|
getRandomValues(new Uint8Array(length)),
|
|
40
44
|
(uniqueId, number) => uniqueId + encode(number),
|
|
41
|
-
|
|
45
|
+
EMPTY_STRING,
|
|
42
46
|
);
|
|
43
47
|
|
|
44
48
|
const jsonString = JSON.stringify;
|