tinybase 8.0.0-beta.1 → 8.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/_internal/store/with-schemas/index.d.ts +2 -2
- package/@types/common/index.d.ts +22 -0
- package/@types/common/with-schemas/index.d.ts +22 -0
- package/@types/middleware/index.d.ts +151 -29
- package/@types/middleware/with-schemas/index.d.ts +174 -29
- package/@types/store/index.d.ts +132 -79
- package/@types/store/with-schemas/index.d.ts +137 -81
- package/checkpoints/index.js +2 -8
- package/checkpoints/with-schemas/index.js +2 -8
- package/index.js +272 -143
- package/mergeable-store/index.js +271 -156
- package/mergeable-store/with-schemas/index.js +271 -156
- package/middleware/index.js +40 -1
- package/middleware/with-schemas/index.js +40 -1
- 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/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/middleware/index.js +1 -1
- package/min/middleware/index.js.gz +0 -0
- package/min/middleware/with-schemas/index.js +1 -1
- package/min/middleware/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-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 -1
- package/min/persisters/persister-react-native-mmkv/index.js.gz +0 -0
- package/min/persisters/persister-react-native-mmkv/with-schemas/index.js +1 -1
- package/min/persisters/persister-react-native-mmkv/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-react-native-sqlite/index.js +1 -1
- package/min/persisters/persister-react-native-sqlite/index.js.gz +0 -0
- package/min/persisters/persister-react-native-sqlite/with-schemas/index.js +1 -1
- 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/schematizers/index.js +1 -1
- package/min/schematizers/index.js.gz +0 -0
- package/min/schematizers/schematizer-arktype/index.js +1 -1
- package/min/schematizers/schematizer-arktype/index.js.gz +0 -0
- package/min/schematizers/schematizer-arktype/with-schemas/index.js +1 -1
- package/min/schematizers/schematizer-arktype/with-schemas/index.js.gz +0 -0
- package/min/schematizers/schematizer-effect/index.js +1 -1
- package/min/schematizers/schematizer-effect/index.js.gz +0 -0
- package/min/schematizers/schematizer-effect/with-schemas/index.js +1 -1
- package/min/schematizers/schematizer-effect/with-schemas/index.js.gz +0 -0
- package/min/schematizers/schematizer-typebox/index.js +1 -1
- package/min/schematizers/schematizer-typebox/index.js.gz +0 -0
- package/min/schematizers/schematizer-typebox/with-schemas/index.js +1 -1
- package/min/schematizers/schematizer-typebox/with-schemas/index.js.gz +0 -0
- package/min/schematizers/schematizer-valibot/index.js +1 -1
- package/min/schematizers/schematizer-valibot/index.js.gz +0 -0
- package/min/schematizers/schematizer-valibot/with-schemas/index.js +1 -1
- package/min/schematizers/schematizer-valibot/with-schemas/index.js.gz +0 -0
- package/min/schematizers/schematizer-yup/index.js +1 -1
- package/min/schematizers/schematizer-yup/index.js.gz +0 -0
- package/min/schematizers/schematizer-yup/with-schemas/index.js +1 -1
- package/min/schematizers/schematizer-yup/with-schemas/index.js.gz +0 -0
- package/min/schematizers/schematizer-zod/index.js +1 -1
- package/min/schematizers/schematizer-zod/index.js.gz +0 -0
- package/min/schematizers/schematizer-zod/with-schemas/index.js +1 -1
- package/min/schematizers/schematizer-zod/with-schemas/index.js.gz +0 -0
- package/min/schematizers/with-schemas/index.js +1 -1
- package/min/schematizers/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/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 +356 -154
- package/omni/with-schemas/index.js +356 -154
- package/package.json +7 -7
- package/persisters/index.js +5 -5
- package/persisters/persister-automerge/index.js +5 -5
- package/persisters/persister-automerge/with-schemas/index.js +5 -5
- package/persisters/persister-browser/index.js +5 -5
- package/persisters/persister-browser/with-schemas/index.js +5 -5
- package/persisters/persister-cr-sqlite-wasm/index.js +5 -5
- package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +5 -5
- package/persisters/persister-durable-object-sql-storage/index.js +5 -5
- package/persisters/persister-durable-object-sql-storage/with-schemas/index.js +5 -5
- package/persisters/persister-durable-object-storage/index.js +5 -5
- package/persisters/persister-durable-object-storage/with-schemas/index.js +5 -5
- package/persisters/persister-electric-sql/index.js +5 -5
- package/persisters/persister-electric-sql/with-schemas/index.js +5 -5
- package/persisters/persister-expo-sqlite/index.js +5 -5
- package/persisters/persister-expo-sqlite/with-schemas/index.js +5 -5
- package/persisters/persister-file/index.js +5 -5
- package/persisters/persister-file/with-schemas/index.js +5 -5
- package/persisters/persister-indexed-db/index.js +5 -5
- package/persisters/persister-indexed-db/with-schemas/index.js +5 -5
- package/persisters/persister-libsql/index.js +5 -5
- package/persisters/persister-libsql/with-schemas/index.js +5 -5
- package/persisters/persister-partykit-client/index.js +5 -5
- package/persisters/persister-partykit-client/with-schemas/index.js +5 -5
- package/persisters/persister-pglite/index.js +5 -5
- package/persisters/persister-pglite/with-schemas/index.js +5 -5
- package/persisters/persister-postgres/index.js +5 -5
- package/persisters/persister-postgres/with-schemas/index.js +5 -5
- package/persisters/persister-powersync/index.js +5 -5
- package/persisters/persister-powersync/with-schemas/index.js +5 -5
- package/persisters/persister-react-native-mmkv/index.js +5 -5
- package/persisters/persister-react-native-mmkv/with-schemas/index.js +5 -5
- package/persisters/persister-react-native-sqlite/index.js +5 -5
- package/persisters/persister-react-native-sqlite/with-schemas/index.js +5 -5
- package/persisters/persister-remote/index.js +5 -5
- package/persisters/persister-remote/with-schemas/index.js +5 -5
- package/persisters/persister-sqlite-bun/index.js +5 -5
- package/persisters/persister-sqlite-bun/with-schemas/index.js +5 -5
- package/persisters/persister-sqlite-wasm/index.js +5 -5
- package/persisters/persister-sqlite-wasm/with-schemas/index.js +5 -5
- package/persisters/persister-sqlite3/index.js +5 -5
- package/persisters/persister-sqlite3/with-schemas/index.js +5 -5
- package/persisters/persister-yjs/index.js +5 -5
- package/persisters/persister-yjs/with-schemas/index.js +5 -5
- package/persisters/with-schemas/index.js +5 -5
- package/queries/index.js +11 -4
- package/queries/with-schemas/index.js +11 -4
- package/readme.md +3 -3
- package/releases.md +19 -3
- package/schematizers/index.js +9 -1
- package/schematizers/schematizer-arktype/index.js +16 -1
- package/schematizers/schematizer-arktype/with-schemas/index.js +16 -1
- package/schematizers/schematizer-effect/index.js +15 -2
- package/schematizers/schematizer-effect/with-schemas/index.js +15 -2
- package/schematizers/schematizer-typebox/index.js +9 -1
- package/schematizers/schematizer-typebox/with-schemas/index.js +9 -1
- package/schematizers/schematizer-valibot/index.js +17 -2
- package/schematizers/schematizer-valibot/with-schemas/index.js +17 -2
- package/schematizers/schematizer-yup/index.js +9 -1
- package/schematizers/schematizer-yup/with-schemas/index.js +9 -1
- package/schematizers/schematizer-zod/index.js +13 -2
- package/schematizers/schematizer-zod/with-schemas/index.js +13 -2
- package/schematizers/with-schemas/index.js +9 -1
- package/store/index.js +195 -104
- package/store/with-schemas/index.js +195 -104
- package/synchronizers/index.js +5 -5
- package/synchronizers/synchronizer-broadcast-channel/index.js +5 -5
- package/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +5 -5
- package/synchronizers/synchronizer-local/index.js +5 -5
- package/synchronizers/synchronizer-local/with-schemas/index.js +5 -5
- package/synchronizers/synchronizer-ws-client/index.js +5 -5
- package/synchronizers/synchronizer-ws-client/with-schemas/index.js +5 -5
- package/synchronizers/synchronizer-ws-server/index.js +5 -5
- package/synchronizers/synchronizer-ws-server/with-schemas/index.js +5 -5
- package/synchronizers/synchronizer-ws-server-durable-object/index.js +5 -5
- package/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +5 -5
- package/synchronizers/with-schemas/index.js +5 -5
- package/ui-react/index.js +6 -0
- package/ui-react/with-schemas/index.js +6 -0
- package/ui-react-dom/index.js +91 -6
- package/ui-react-dom/with-schemas/index.js +91 -6
- package/ui-react-inspector/index.js +248 -84
- package/ui-react-inspector/with-schemas/index.js +248 -84
- package/with-schemas/index.js +272 -143
|
@@ -48,7 +48,7 @@ export type CellIsDefaultedFromSchema<
|
|
|
48
48
|
Then,
|
|
49
49
|
Else,
|
|
50
50
|
> = Schema[TableId][CellId] extends {
|
|
51
|
-
default:
|
|
51
|
+
default: infer _;
|
|
52
52
|
}
|
|
53
53
|
? Then
|
|
54
54
|
: Else;
|
|
@@ -83,7 +83,7 @@ export type ValueIsDefaultedFromSchema<
|
|
|
83
83
|
Then,
|
|
84
84
|
Else,
|
|
85
85
|
> = Schema[ValueId] extends {
|
|
86
|
-
default:
|
|
86
|
+
default: infer _;
|
|
87
87
|
}
|
|
88
88
|
? Then
|
|
89
89
|
: Else;
|
package/@types/common/index.d.ts
CHANGED
|
@@ -16,6 +16,28 @@ import type {CellOrUndefined, ValueOrUndefined} from '../store/index.d.ts';
|
|
|
16
16
|
*/
|
|
17
17
|
export type Json = string;
|
|
18
18
|
|
|
19
|
+
/**
|
|
20
|
+
* The AnyObject type is a simple alias for a plain object with string keys and
|
|
21
|
+
* unknown values.
|
|
22
|
+
*
|
|
23
|
+
* It is used to indicate that the value should be considered to be a plain
|
|
24
|
+
* JavaScript object, as can be stored in a Cell or Value with the `object`
|
|
25
|
+
* schema type.
|
|
26
|
+
* @category General
|
|
27
|
+
* @since v8.0.0
|
|
28
|
+
*/
|
|
29
|
+
export type AnyObject = {[key: string]: unknown};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* The AnyArray type is a simple alias for an array with unknown values.
|
|
33
|
+
*
|
|
34
|
+
* It is used to indicate that the value should be considered to be a JavaScript
|
|
35
|
+
* array, as can be stored in a Cell or Value with the `array` schema type.
|
|
36
|
+
* @category General
|
|
37
|
+
* @since v8.0.0
|
|
38
|
+
*/
|
|
39
|
+
export type AnyArray = unknown[] | readonly unknown[];
|
|
40
|
+
|
|
19
41
|
/**
|
|
20
42
|
* The Ids type is a simple alias for an array of strings, but is used to
|
|
21
43
|
* indicate that the strings should be considered to be the keys of objects
|
|
@@ -28,6 +28,28 @@ import type {
|
|
|
28
28
|
*/
|
|
29
29
|
export type Json = string;
|
|
30
30
|
|
|
31
|
+
/**
|
|
32
|
+
* The AnyObject type is a simple alias for a plain object with string keys and
|
|
33
|
+
* unknown values.
|
|
34
|
+
*
|
|
35
|
+
* It is used to indicate that the value should be considered to be a plain
|
|
36
|
+
* JavaScript object, as can be stored in a Cell or Value with the `object`
|
|
37
|
+
* schema type.
|
|
38
|
+
* @category General
|
|
39
|
+
* @since v8.0.0
|
|
40
|
+
*/
|
|
41
|
+
export type AnyObject = {[key: string]: unknown};
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* The AnyArray type is a simple alias for an array with unknown values.
|
|
45
|
+
*
|
|
46
|
+
* It is used to indicate that the value should be considered to be a JavaScript
|
|
47
|
+
* array, as can be stored in a Cell or Value with the `array` schema type.
|
|
48
|
+
* @category General
|
|
49
|
+
* @since v8.0.0
|
|
50
|
+
*/
|
|
51
|
+
export type AnyArray = unknown[] | readonly unknown[];
|
|
52
|
+
|
|
31
53
|
/**
|
|
32
54
|
* The Ids type is a simple alias for an array of strings, but is used to
|
|
33
55
|
* indicate that the strings should be considered to be the keys of objects
|
|
@@ -28,17 +28,17 @@ import type {
|
|
|
28
28
|
* The WillSetContentCallback type describes a function that is called before
|
|
29
29
|
* Content is set in the Store.
|
|
30
30
|
*
|
|
31
|
-
* The callback receives the Content (a [Tables, Values] tuple) that is about
|
|
32
|
-
*
|
|
33
|
-
*
|
|
31
|
+
* The callback receives the Content (a [Tables, Values] tuple) that is about to
|
|
32
|
+
* be set. It can return the Content (possibly transformed) to allow the write,
|
|
33
|
+
* or `undefined` to prevent the Content from being set.
|
|
34
34
|
*
|
|
35
35
|
* Multiple WillSetContentCallback functions can be registered and they will be
|
|
36
36
|
* called sequentially, the Content being updated successively. If any callback
|
|
37
37
|
* returns `undefined`, the chain short-circuits and the Content will not be
|
|
38
38
|
* set.
|
|
39
39
|
* @param content The Content about to be set.
|
|
40
|
-
* @returns The Content to use (possibly transformed), or `undefined` to
|
|
41
|
-
*
|
|
40
|
+
* @returns The Content to use (possibly transformed), or `undefined` to prevent
|
|
41
|
+
* the write.
|
|
42
42
|
* @category Callback
|
|
43
43
|
* @since v8.0.0
|
|
44
44
|
*/
|
|
@@ -54,8 +54,7 @@ export type WillSetContentCallback = (content: Content) => Content | undefined;
|
|
|
54
54
|
*
|
|
55
55
|
* Multiple WillSetTablesCallback functions can be registered and they will be
|
|
56
56
|
* called sequentially, the Tables being updated successively. If any callback
|
|
57
|
-
* returns `undefined`, the chain short-circuits and the Tables will not be
|
|
58
|
-
* set.
|
|
57
|
+
* returns `undefined`, the chain short-circuits and the Tables will not be set.
|
|
59
58
|
* @param tables The Tables object about to be set.
|
|
60
59
|
* @returns The Tables to use (possibly transformed), or `undefined` to prevent
|
|
61
60
|
* the write.
|
|
@@ -216,11 +215,11 @@ export type WillDelTablesCallback = () => boolean;
|
|
|
216
215
|
export type WillDelTableCallback = (tableId: Id) => boolean;
|
|
217
216
|
|
|
218
217
|
/**
|
|
219
|
-
* The WillDelRowCallback type describes a function that is called before a
|
|
220
|
-
*
|
|
218
|
+
* The WillDelRowCallback type describes a function that is called before a Row
|
|
219
|
+
* is deleted from the Store.
|
|
221
220
|
*
|
|
222
|
-
* The callback receives the table Id and row Id of the Row about to be
|
|
223
|
-
*
|
|
221
|
+
* The callback receives the table Id and row Id of the Row about to be deleted.
|
|
222
|
+
* It returns `true` to allow the deletion, or `false` to prevent it.
|
|
224
223
|
*
|
|
225
224
|
* Multiple WillDelRowCallback functions can be registered and they will be
|
|
226
225
|
* called sequentially. If any callback returns `false`, the chain
|
|
@@ -303,8 +302,8 @@ export type WillDelValueCallback = (valueId: Id) => boolean;
|
|
|
303
302
|
* callback returns `undefined`, the chain short-circuits and the Changes will
|
|
304
303
|
* not be applied.
|
|
305
304
|
* @param changes The Changes about to be applied.
|
|
306
|
-
* @returns The Changes to use (possibly transformed), or `undefined` to
|
|
307
|
-
*
|
|
305
|
+
* @returns The Changes to use (possibly transformed), or `undefined` to prevent
|
|
306
|
+
* the write.
|
|
308
307
|
* @category Callback
|
|
309
308
|
* @since v8.0.0
|
|
310
309
|
*/
|
|
@@ -312,6 +311,49 @@ export type WillApplyChangesCallback = (
|
|
|
312
311
|
changes: Changes,
|
|
313
312
|
) => Changes | undefined;
|
|
314
313
|
|
|
314
|
+
/**
|
|
315
|
+
* The DidSetRowCallback type describes a function called after a Row is changed
|
|
316
|
+
* during a transaction, and after mutator listeners have fired.
|
|
317
|
+
*
|
|
318
|
+
* Unlike the `willSet*` callbacks, which intercept writes as they happen,
|
|
319
|
+
* `didSetRow` fires once per touched Row after all cell writes in the
|
|
320
|
+
* transaction have completed. This means multiple cell changes to the same Row
|
|
321
|
+
* within a single transaction result in just one `didSetRow` call, with the
|
|
322
|
+
* full before-transaction and after-transaction Row states.
|
|
323
|
+
*
|
|
324
|
+
* The callback receives the Table Id, Row Id, the Row as it was at the start of
|
|
325
|
+
* the transaction (`oldRow`), and the Row as it is now (`newRow`). It must
|
|
326
|
+
* return a Row:
|
|
327
|
+
*
|
|
328
|
+
* - `newRow` to accept the changes.
|
|
329
|
+
* - a different `Row` to replace the final state.
|
|
330
|
+
* - `oldRow` to revert all changes to the Row.
|
|
331
|
+
* - an empty object to delete the Row.
|
|
332
|
+
*
|
|
333
|
+
* Multiple DidSetRowCallback functions can be registered for the same table and
|
|
334
|
+
* they will be called sequentially, each receiving the Row returned by the
|
|
335
|
+
* previous callback. The chain never short-circuits: all registered callbacks
|
|
336
|
+
* always run.
|
|
337
|
+
*
|
|
338
|
+
* Note that `addDidSetRowCallback` is table-scoped: you must specify the table
|
|
339
|
+
* Id when registering. Callbacks are only invoked for rows in the specified
|
|
340
|
+
* table, keeping overhead to zero for other tables.
|
|
341
|
+
* @param tableId The Id of the Table containing the changed Row.
|
|
342
|
+
* @param rowId The Id of the Row that was changed.
|
|
343
|
+
* @param oldRow The Row as it was at the start of the transaction.
|
|
344
|
+
* @param newRow The Row as it is now, after all cell writes including those
|
|
345
|
+
* made by mutating listeners.
|
|
346
|
+
* @returns The Row to use as the final state.
|
|
347
|
+
* @category Callback
|
|
348
|
+
* @since v8.0.0
|
|
349
|
+
*/
|
|
350
|
+
export type DidSetRowCallback = (
|
|
351
|
+
tableId: Id,
|
|
352
|
+
rowId: Id,
|
|
353
|
+
oldRow: Row,
|
|
354
|
+
newRow: Row,
|
|
355
|
+
) => Row;
|
|
356
|
+
|
|
315
357
|
/**
|
|
316
358
|
* A Middleware object lets you intercept and validate writes to a Store.
|
|
317
359
|
*
|
|
@@ -360,14 +402,13 @@ export interface Middleware {
|
|
|
360
402
|
getStore(): Store;
|
|
361
403
|
|
|
362
404
|
/**
|
|
363
|
-
* The addWillSetContentCallback method registers a
|
|
364
|
-
*
|
|
365
|
-
* Store.
|
|
405
|
+
* The addWillSetContentCallback method registers a WillSetContentCallback
|
|
406
|
+
* that will be called before Content is set in the Store.
|
|
366
407
|
*
|
|
367
|
-
* The callback can transform the Content or return `undefined` to prevent
|
|
368
|
-
*
|
|
369
|
-
* sequentially, each receiving the (possibly transformed) Content from
|
|
370
|
-
*
|
|
408
|
+
* The callback can transform the Content or return `undefined` to prevent the
|
|
409
|
+
* write. Multiple callbacks can be registered and they are called
|
|
410
|
+
* sequentially, each receiving the (possibly transformed) Content from the
|
|
411
|
+
* previous callback.
|
|
371
412
|
* @param callback The WillSetContentCallback to register.
|
|
372
413
|
* @returns A reference to the Middleware object, for chaining.
|
|
373
414
|
* @example
|
|
@@ -756,9 +797,9 @@ export interface Middleware {
|
|
|
756
797
|
* The addWillDelTablesCallback method registers a WillDelTablesCallback that
|
|
757
798
|
* will be called before all Tables are deleted from the Store.
|
|
758
799
|
*
|
|
759
|
-
* The callback returns `true` to allow the deletion or `false` to prevent
|
|
760
|
-
*
|
|
761
|
-
*
|
|
800
|
+
* The callback returns `true` to allow the deletion or `false` to prevent it.
|
|
801
|
+
* Multiple callbacks can be registered and they are called sequentially. If
|
|
802
|
+
* any callback returns `false`, the deletion is prevented.
|
|
762
803
|
* @param callback The WillDelTablesCallback to register.
|
|
763
804
|
* @returns A reference to the Middleware object, for chaining.
|
|
764
805
|
* @example
|
|
@@ -790,9 +831,9 @@ export interface Middleware {
|
|
|
790
831
|
* The addWillDelTableCallback method registers a WillDelTableCallback that
|
|
791
832
|
* will be called before any Table is deleted from the Store.
|
|
792
833
|
*
|
|
793
|
-
* The callback returns `true` to allow the deletion or `false` to prevent
|
|
794
|
-
*
|
|
795
|
-
*
|
|
834
|
+
* The callback returns `true` to allow the deletion or `false` to prevent it.
|
|
835
|
+
* Multiple callbacks can be registered and they are called sequentially. If
|
|
836
|
+
* any callback returns `false`, the deletion is prevented.
|
|
796
837
|
* @param callback The WillDelTableCallback to register.
|
|
797
838
|
* @returns A reference to the Middleware object, for chaining.
|
|
798
839
|
* @example
|
|
@@ -957,9 +998,9 @@ export interface Middleware {
|
|
|
957
998
|
addWillDelValueCallback(callback: WillDelValueCallback): Middleware;
|
|
958
999
|
|
|
959
1000
|
/**
|
|
960
|
-
* The addWillApplyChangesCallback method registers a
|
|
961
|
-
*
|
|
962
|
-
*
|
|
1001
|
+
* The addWillApplyChangesCallback method registers a WillApplyChangesCallback
|
|
1002
|
+
* that will be called before Changes are applied to the Store via the
|
|
1003
|
+
* applyChanges method.
|
|
963
1004
|
*
|
|
964
1005
|
* This callback receives the Changes object and can return it (to allow),
|
|
965
1006
|
* return a modified Changes object (to transform), or return `undefined` (to
|
|
@@ -1003,6 +1044,87 @@ export interface Middleware {
|
|
|
1003
1044
|
*/
|
|
1004
1045
|
addWillApplyChangesCallback(callback: WillApplyChangesCallback): Middleware;
|
|
1005
1046
|
|
|
1047
|
+
/**
|
|
1048
|
+
* The addDidSetRowCallback method registers a DidSetRowCallback for a
|
|
1049
|
+
* specific table that will be called after any Row in that table is changed
|
|
1050
|
+
* during a transaction, after mutator listeners have fired.
|
|
1051
|
+
*
|
|
1052
|
+
* Unlike `willSetRow`, which fires synchronously during each write, this
|
|
1053
|
+
* callback fires once per changed Row after all cell writes in the
|
|
1054
|
+
* transaction have landed. Multiple cell changes to the same Row within a
|
|
1055
|
+
* transaction produce a single callback with the full before/after Row
|
|
1056
|
+
* states.
|
|
1057
|
+
*
|
|
1058
|
+
* The callback receives `oldRow` (the Row at the start of the transaction)
|
|
1059
|
+
* and `newRow` (the Row after all writes). Return `newRow` to accept, a
|
|
1060
|
+
* different `Row` to replace, `oldRow` to revert, or an empty object to
|
|
1061
|
+
* delete.
|
|
1062
|
+
* @param tableId The Id of the Table to watch.
|
|
1063
|
+
* @param callback The DidSetRowCallback to register.
|
|
1064
|
+
* @returns A reference to the Middleware object, for chaining.
|
|
1065
|
+
* @example
|
|
1066
|
+
* This example registers a callback that validates the 'pets' table,
|
|
1067
|
+
* reverting any row that ends up without a required 'species' cell.
|
|
1068
|
+
*
|
|
1069
|
+
* ```js
|
|
1070
|
+
* import {createMiddleware, createStore} from 'tinybase';
|
|
1071
|
+
*
|
|
1072
|
+
* const store = createStore();
|
|
1073
|
+
* const middleware = createMiddleware(store);
|
|
1074
|
+
*
|
|
1075
|
+
* middleware.addDidSetRowCallback(
|
|
1076
|
+
* 'pets',
|
|
1077
|
+
* (_tableId, _rowId, oldRow, newRow) =>
|
|
1078
|
+
* 'species' in newRow ? newRow : oldRow,
|
|
1079
|
+
* );
|
|
1080
|
+
*
|
|
1081
|
+
* store.setRow('pets', 'fido', {species: 'dog', name: 'Fido'});
|
|
1082
|
+
* console.log(store.getRow('pets', 'fido'));
|
|
1083
|
+
* // -> {species: 'dog', name: 'Fido'}
|
|
1084
|
+
*
|
|
1085
|
+
* store.setRow('pets', 'nemo', {name: 'Nemo'});
|
|
1086
|
+
* console.log(store.getRow('pets', 'nemo'));
|
|
1087
|
+
* // -> {}
|
|
1088
|
+
*
|
|
1089
|
+
* middleware.destroy();
|
|
1090
|
+
* ```
|
|
1091
|
+
* @example
|
|
1092
|
+
* This example shows that multiple cell changes in one transaction result in
|
|
1093
|
+
* a single didSetRow callback with the full before/after row states.
|
|
1094
|
+
*
|
|
1095
|
+
* ```js
|
|
1096
|
+
* import {createMiddleware, createStore} from 'tinybase';
|
|
1097
|
+
*
|
|
1098
|
+
* const store = createStore();
|
|
1099
|
+
* const middleware = createMiddleware(store);
|
|
1100
|
+
*
|
|
1101
|
+
* const seen = [];
|
|
1102
|
+
* middleware.addDidSetRowCallback(
|
|
1103
|
+
* 'pets',
|
|
1104
|
+
* (_tableId, rowId, oldRow, newRow) => {
|
|
1105
|
+
* seen.push({rowId, oldRow: {...oldRow}, newRow: {...newRow}});
|
|
1106
|
+
* return newRow;
|
|
1107
|
+
* },
|
|
1108
|
+
* );
|
|
1109
|
+
*
|
|
1110
|
+
* store.transaction(() => {
|
|
1111
|
+
* store.setCell('pets', 'fido', 'name', 'Fido');
|
|
1112
|
+
* store.setCell('pets', 'fido', 'species', 'dog');
|
|
1113
|
+
* });
|
|
1114
|
+
* console.log(seen.length);
|
|
1115
|
+
* // -> 1
|
|
1116
|
+
* console.log(seen[0].rowId);
|
|
1117
|
+
* // -> 'fido'
|
|
1118
|
+
* console.log(seen[0].newRow);
|
|
1119
|
+
* // -> {name: 'Fido', species: 'dog'}
|
|
1120
|
+
*
|
|
1121
|
+
* middleware.destroy();
|
|
1122
|
+
* ```
|
|
1123
|
+
* @category Configuration
|
|
1124
|
+
* @since v8.0.0
|
|
1125
|
+
*/
|
|
1126
|
+
addDidSetRowCallback(tableId: Id, callback: DidSetRowCallback): Middleware;
|
|
1127
|
+
|
|
1006
1128
|
/**
|
|
1007
1129
|
* The destroy method should be called when this Middleware object is no
|
|
1008
1130
|
* longer used. It removes all hooks and listeners from the Store, and
|
|
@@ -40,17 +40,17 @@ import type {
|
|
|
40
40
|
* (content: Content) => Content | undefined;
|
|
41
41
|
* ```
|
|
42
42
|
*
|
|
43
|
-
* The callback receives the Content (a [Tables, Values] tuple) that is about
|
|
44
|
-
*
|
|
45
|
-
*
|
|
43
|
+
* The callback receives the Content (a [Tables, Values] tuple) that is about to
|
|
44
|
+
* be set. It can return the Content (possibly transformed) to allow the write,
|
|
45
|
+
* or `undefined` to prevent the Content from being set.
|
|
46
46
|
*
|
|
47
47
|
* Multiple WillSetContentCallback functions can be registered and they will be
|
|
48
48
|
* called sequentially, the Content being updated successively. If any callback
|
|
49
49
|
* returns `undefined`, the chain short-circuits and the Content will not be
|
|
50
50
|
* set.
|
|
51
51
|
* @param content The Content about to be set.
|
|
52
|
-
* @returns The Content to use (possibly transformed), or `undefined` to
|
|
53
|
-
*
|
|
52
|
+
* @returns The Content to use (possibly transformed), or `undefined` to prevent
|
|
53
|
+
* the write.
|
|
54
54
|
* @category Callback
|
|
55
55
|
* @since v8.0.0
|
|
56
56
|
*/
|
|
@@ -74,8 +74,7 @@ export type WillSetContentCallback<Schemas extends OptionalSchemas> = (
|
|
|
74
74
|
*
|
|
75
75
|
* Multiple WillSetTablesCallback functions can be registered and they will be
|
|
76
76
|
* called sequentially, the Tables being updated successively. If any callback
|
|
77
|
-
* returns `undefined`, the chain short-circuits and the Tables will not be
|
|
78
|
-
* set.
|
|
77
|
+
* returns `undefined`, the chain short-circuits and the Tables will not be set.
|
|
79
78
|
* @param tables The Tables object about to be set.
|
|
80
79
|
* @returns The Tables to use (possibly transformed), or `undefined` to prevent
|
|
81
80
|
* the write.
|
|
@@ -328,8 +327,8 @@ export type WillDelTableCallback<
|
|
|
328
327
|
> = (...params: Params | [tableId: never]) => boolean;
|
|
329
328
|
|
|
330
329
|
/**
|
|
331
|
-
* The WillDelRowCallback type describes a function that is called before a
|
|
332
|
-
*
|
|
330
|
+
* The WillDelRowCallback type describes a function that is called before a Row
|
|
331
|
+
* is deleted from the Store.
|
|
333
332
|
*
|
|
334
333
|
* This has schema-based typing. The following is a simplified representation:
|
|
335
334
|
*
|
|
@@ -337,8 +336,8 @@ export type WillDelTableCallback<
|
|
|
337
336
|
* (tableId: Id, rowId: Id) => boolean;
|
|
338
337
|
* ```
|
|
339
338
|
*
|
|
340
|
-
* The callback receives the table Id and row Id of the Row about to be
|
|
341
|
-
*
|
|
339
|
+
* The callback receives the table Id and row Id of the Row about to be deleted.
|
|
340
|
+
* It returns `true` to allow the deletion, or `false` to prevent it.
|
|
342
341
|
*
|
|
343
342
|
* Multiple WillDelRowCallback functions can be registered and they will be
|
|
344
343
|
* called sequentially. If any callback returns `false`, the chain
|
|
@@ -468,8 +467,8 @@ export type WillDelValueCallback<
|
|
|
468
467
|
* callback returns `undefined`, the chain short-circuits and the Changes will
|
|
469
468
|
* not be applied.
|
|
470
469
|
* @param changes The Changes about to be applied.
|
|
471
|
-
* @returns The Changes to use (possibly transformed), or `undefined` to
|
|
472
|
-
*
|
|
470
|
+
* @returns The Changes to use (possibly transformed), or `undefined` to prevent
|
|
471
|
+
* the write.
|
|
473
472
|
* @category Callback
|
|
474
473
|
* @since v8.0.0
|
|
475
474
|
*/
|
|
@@ -477,6 +476,63 @@ export type WillApplyChangesCallback<Schemas extends OptionalSchemas> = (
|
|
|
477
476
|
changes: Changes<Schemas>,
|
|
478
477
|
) => Changes<Schemas> | undefined;
|
|
479
478
|
|
|
479
|
+
/**
|
|
480
|
+
* The DidSetRowCallback type describes a function called after a Row is changed
|
|
481
|
+
* during a transaction, and after mutator listeners have fired.
|
|
482
|
+
*
|
|
483
|
+
* This has schema-based typing. The following is a simplified representation:
|
|
484
|
+
*
|
|
485
|
+
* ```ts override
|
|
486
|
+
* (
|
|
487
|
+
* tableId: Id,
|
|
488
|
+
* rowId: Id,
|
|
489
|
+
* oldRow: Row,
|
|
490
|
+
* newRow: Row,
|
|
491
|
+
* ) => Row;
|
|
492
|
+
* ```
|
|
493
|
+
*
|
|
494
|
+
* Unlike the `willSet*` callbacks, which intercept writes as they happen,
|
|
495
|
+
* `didSetRow` fires once per touched Row after all cell writes in the
|
|
496
|
+
* transaction have completed. This means multiple cell changes to the same Row
|
|
497
|
+
* within a single transaction result in just one `didSetRow` call, with the
|
|
498
|
+
* full before-transaction and after-transaction Row states.
|
|
499
|
+
*
|
|
500
|
+
* The callback receives the Table Id, Row Id, the Row as it was at the start of
|
|
501
|
+
* the transaction (`oldRow`), and the Row as it is now (`newRow`). It must
|
|
502
|
+
* return a Row:
|
|
503
|
+
*
|
|
504
|
+
* - `newRow` to accept the changes.
|
|
505
|
+
* - a different `Row` to replace the final state.
|
|
506
|
+
* - `oldRow` to revert all changes to the Row.
|
|
507
|
+
* - an empty object to delete the Row.
|
|
508
|
+
*
|
|
509
|
+
* Multiple DidSetRowCallback functions can be registered for the same table and
|
|
510
|
+
* they will be called sequentially, each receiving the Row returned by the
|
|
511
|
+
* previous callback. The chain never short-circuits: all registered callbacks
|
|
512
|
+
* always run.
|
|
513
|
+
*
|
|
514
|
+
* Note that `addDidSetRowCallback` is table-scoped: you must specify the table
|
|
515
|
+
* Id when registering. Callbacks are only invoked for rows in the specified
|
|
516
|
+
* table, keeping overhead to zero for other tables.
|
|
517
|
+
* @param tableId The Id of the Table containing the changed Row.
|
|
518
|
+
* @param rowId The Id of the Row that was changed.
|
|
519
|
+
* @param oldRow The Row as it was at the start of the transaction.
|
|
520
|
+
* @param newRow The Row as it is now, after all cell writes including those
|
|
521
|
+
* made by mutating listeners.
|
|
522
|
+
* @returns The Row to use as the final state.
|
|
523
|
+
* @category Callback
|
|
524
|
+
* @since v8.0.0
|
|
525
|
+
*/
|
|
526
|
+
export type DidSetRowCallback<
|
|
527
|
+
Schema extends OptionalTablesSchema,
|
|
528
|
+
TableId extends TableIdFromSchema<Schema>,
|
|
529
|
+
> = (
|
|
530
|
+
tableId: TableId,
|
|
531
|
+
rowId: Id,
|
|
532
|
+
oldRow: Row<Schema, TableId>,
|
|
533
|
+
newRow: Row<Schema, TableId>,
|
|
534
|
+
) => Row<Schema, TableId>;
|
|
535
|
+
|
|
480
536
|
/**
|
|
481
537
|
* A Middleware object lets you intercept and validate writes to a Store.
|
|
482
538
|
*
|
|
@@ -531,9 +587,8 @@ export interface Middleware<in out Schemas extends OptionalSchemas> {
|
|
|
531
587
|
getStore(): Store<Schemas>;
|
|
532
588
|
|
|
533
589
|
/**
|
|
534
|
-
* The addWillSetContentCallback method registers a
|
|
535
|
-
*
|
|
536
|
-
* Store.
|
|
590
|
+
* The addWillSetContentCallback method registers a WillSetContentCallback
|
|
591
|
+
* that will be called before Content is set in the Store.
|
|
537
592
|
*
|
|
538
593
|
* This has schema-based typing. The following is a simplified representation:
|
|
539
594
|
*
|
|
@@ -541,10 +596,10 @@ export interface Middleware<in out Schemas extends OptionalSchemas> {
|
|
|
541
596
|
* addWillSetContentCallback(callback: WillSetContentCallback): Middleware;
|
|
542
597
|
* ```
|
|
543
598
|
*
|
|
544
|
-
* The callback can transform the Content or return `undefined` to prevent
|
|
545
|
-
*
|
|
546
|
-
* sequentially, each receiving the (possibly transformed) Content from
|
|
547
|
-
*
|
|
599
|
+
* The callback can transform the Content or return `undefined` to prevent the
|
|
600
|
+
* write. Multiple callbacks can be registered and they are called
|
|
601
|
+
* sequentially, each receiving the (possibly transformed) Content from the
|
|
602
|
+
* previous callback.
|
|
548
603
|
* @param callback The WillSetContentCallback to register.
|
|
549
604
|
* @returns A reference to the Middleware object, for chaining.
|
|
550
605
|
* @example
|
|
@@ -989,9 +1044,9 @@ export interface Middleware<in out Schemas extends OptionalSchemas> {
|
|
|
989
1044
|
* addWillDelTablesCallback(callback: WillDelTablesCallback): Middleware;
|
|
990
1045
|
* ```
|
|
991
1046
|
*
|
|
992
|
-
* The callback returns `true` to allow the deletion or `false` to prevent
|
|
993
|
-
*
|
|
994
|
-
*
|
|
1047
|
+
* The callback returns `true` to allow the deletion or `false` to prevent it.
|
|
1048
|
+
* Multiple callbacks can be registered and they are called sequentially. If
|
|
1049
|
+
* any callback returns `false`, the deletion is prevented.
|
|
995
1050
|
* @param callback The WillDelTablesCallback to register.
|
|
996
1051
|
* @returns A reference to the Middleware object, for chaining.
|
|
997
1052
|
* @example
|
|
@@ -1031,9 +1086,9 @@ export interface Middleware<in out Schemas extends OptionalSchemas> {
|
|
|
1031
1086
|
* addWillDelTableCallback(callback: WillDelTableCallback): Middleware;
|
|
1032
1087
|
* ```
|
|
1033
1088
|
*
|
|
1034
|
-
* The callback returns `true` to allow the deletion or `false` to prevent
|
|
1035
|
-
*
|
|
1036
|
-
*
|
|
1089
|
+
* The callback returns `true` to allow the deletion or `false` to prevent it.
|
|
1090
|
+
* Multiple callbacks can be registered and they are called sequentially. If
|
|
1091
|
+
* any callback returns `false`, the deletion is prevented.
|
|
1037
1092
|
* @param callback The WillDelTableCallback to register.
|
|
1038
1093
|
* @returns A reference to the Middleware object, for chaining.
|
|
1039
1094
|
* @example
|
|
@@ -1232,9 +1287,9 @@ export interface Middleware<in out Schemas extends OptionalSchemas> {
|
|
|
1232
1287
|
): Middleware<Schemas>;
|
|
1233
1288
|
|
|
1234
1289
|
/**
|
|
1235
|
-
* The addWillApplyChangesCallback method registers a
|
|
1236
|
-
*
|
|
1237
|
-
*
|
|
1290
|
+
* The addWillApplyChangesCallback method registers a WillApplyChangesCallback
|
|
1291
|
+
* that will be called before Changes are applied to the Store via the
|
|
1292
|
+
* applyChanges method.
|
|
1238
1293
|
*
|
|
1239
1294
|
* This has schema-based typing. The following is a simplified representation:
|
|
1240
1295
|
*
|
|
@@ -1286,6 +1341,96 @@ export interface Middleware<in out Schemas extends OptionalSchemas> {
|
|
|
1286
1341
|
callback: WillApplyChangesCallback<Schemas>,
|
|
1287
1342
|
): Middleware<Schemas>;
|
|
1288
1343
|
|
|
1344
|
+
/**
|
|
1345
|
+
* The addDidSetRowCallback method registers a DidSetRowCallback for a
|
|
1346
|
+
* specific table that will be called after any Row in that table is changed
|
|
1347
|
+
* during a transaction, after mutator listeners have fired.
|
|
1348
|
+
*
|
|
1349
|
+
* This has schema-based typing. The following is a simplified representation:
|
|
1350
|
+
*
|
|
1351
|
+
* ```ts override
|
|
1352
|
+
* addDidSetRowCallback(tableId: Id, callback: DidSetRowCallback): Middleware;
|
|
1353
|
+
* ```
|
|
1354
|
+
*
|
|
1355
|
+
* Unlike `willSetRow`, which fires synchronously during each write, this
|
|
1356
|
+
* callback fires once per changed Row after all cell writes in the
|
|
1357
|
+
* transaction have landed. Multiple cell changes to the same Row within a
|
|
1358
|
+
* transaction produce a single callback with the full before/after Row
|
|
1359
|
+
* states.
|
|
1360
|
+
*
|
|
1361
|
+
* The callback receives `oldRow` (the Row at the start of the transaction)
|
|
1362
|
+
* and `newRow` (the Row after all writes). Return `newRow` to accept, a
|
|
1363
|
+
* different `Row` to replace, `oldRow` to revert, or an empty object to
|
|
1364
|
+
* delete.
|
|
1365
|
+
* @param tableId The Id of the Table to watch.
|
|
1366
|
+
* @param callback The DidSetRowCallback to register.
|
|
1367
|
+
* @returns A reference to the Middleware object, for chaining.
|
|
1368
|
+
* @example
|
|
1369
|
+
* This example registers a callback that validates the 'pets' table,
|
|
1370
|
+
* reverting any row that ends up without a required 'species' cell.
|
|
1371
|
+
*
|
|
1372
|
+
* ```js
|
|
1373
|
+
* import {createMiddleware, createStore} from 'tinybase';
|
|
1374
|
+
*
|
|
1375
|
+
* const store = createStore();
|
|
1376
|
+
* const middleware = createMiddleware(store);
|
|
1377
|
+
*
|
|
1378
|
+
* middleware.addDidSetRowCallback(
|
|
1379
|
+
* 'pets',
|
|
1380
|
+
* (_tableId, _rowId, oldRow, newRow) =>
|
|
1381
|
+
* 'species' in newRow ? newRow : oldRow,
|
|
1382
|
+
* );
|
|
1383
|
+
*
|
|
1384
|
+
* store.setRow('pets', 'fido', {species: 'dog', name: 'Fido'});
|
|
1385
|
+
* console.log(store.getRow('pets', 'fido'));
|
|
1386
|
+
* // -> {species: 'dog', name: 'Fido'}
|
|
1387
|
+
*
|
|
1388
|
+
* store.setRow('pets', 'nemo', {name: 'Nemo'});
|
|
1389
|
+
* console.log(store.getRow('pets', 'nemo'));
|
|
1390
|
+
* // -> {}
|
|
1391
|
+
*
|
|
1392
|
+
* middleware.destroy();
|
|
1393
|
+
* ```
|
|
1394
|
+
* @example
|
|
1395
|
+
* This example shows that multiple cell changes in one transaction result in
|
|
1396
|
+
* a single didSetRow callback with the full before/after row states.
|
|
1397
|
+
*
|
|
1398
|
+
* ```js
|
|
1399
|
+
* import {createMiddleware, createStore} from 'tinybase';
|
|
1400
|
+
*
|
|
1401
|
+
* const store = createStore();
|
|
1402
|
+
* const middleware = createMiddleware(store);
|
|
1403
|
+
*
|
|
1404
|
+
* const seen = [];
|
|
1405
|
+
* middleware.addDidSetRowCallback(
|
|
1406
|
+
* 'pets',
|
|
1407
|
+
* (_tableId, rowId, oldRow, newRow) => {
|
|
1408
|
+
* seen.push({rowId, oldRow: {...oldRow}, newRow: {...newRow}});
|
|
1409
|
+
* return newRow;
|
|
1410
|
+
* },
|
|
1411
|
+
* );
|
|
1412
|
+
*
|
|
1413
|
+
* store.transaction(() => {
|
|
1414
|
+
* store.setCell('pets', 'fido', 'name', 'Fido');
|
|
1415
|
+
* store.setCell('pets', 'fido', 'species', 'dog');
|
|
1416
|
+
* });
|
|
1417
|
+
* console.log(seen.length);
|
|
1418
|
+
* // -> 1
|
|
1419
|
+
* console.log(seen[0].rowId);
|
|
1420
|
+
* // -> 'fido'
|
|
1421
|
+
* console.log(seen[0].newRow);
|
|
1422
|
+
* // -> {name: 'Fido', species: 'dog'}
|
|
1423
|
+
*
|
|
1424
|
+
* middleware.destroy();
|
|
1425
|
+
* ```
|
|
1426
|
+
* @category Configuration
|
|
1427
|
+
* @since v8.0.0
|
|
1428
|
+
*/
|
|
1429
|
+
addDidSetRowCallback<TableId extends TableIdFromSchema<Schemas[0]>>(
|
|
1430
|
+
tableId: TableId,
|
|
1431
|
+
callback: DidSetRowCallback<Schemas[0], TableId>,
|
|
1432
|
+
): Middleware<Schemas>;
|
|
1433
|
+
|
|
1289
1434
|
/**
|
|
1290
1435
|
* The destroy method should be called when this Middleware object is no
|
|
1291
1436
|
* longer used. It removes all hooks and listeners from the Store, and
|