@livestore/react 0.3.0-dev.27 → 0.3.0-dev.29
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/dist/.tsbuildinfo +1 -1
- package/dist/LiveStoreContext.d.ts +10 -6
- package/dist/LiveStoreContext.d.ts.map +1 -1
- package/dist/LiveStoreContext.js +0 -14
- package/dist/LiveStoreContext.js.map +1 -1
- package/dist/LiveStoreProvider.d.ts +2 -2
- package/dist/LiveStoreProvider.d.ts.map +1 -1
- package/dist/LiveStoreProvider.js +5 -1
- package/dist/LiveStoreProvider.js.map +1 -1
- package/dist/LiveStoreProvider.test.js +6 -5
- package/dist/LiveStoreProvider.test.js.map +1 -1
- package/dist/__tests__/fixture.d.ts +115 -546
- package/dist/__tests__/fixture.d.ts.map +1 -1
- package/dist/__tests__/fixture.js +64 -22
- package/dist/__tests__/fixture.js.map +1 -1
- package/dist/mod.d.ts +4 -4
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +4 -4
- package/dist/mod.js.map +1 -1
- package/dist/useClientDocument.d.ts +61 -0
- package/dist/useClientDocument.d.ts.map +1 -0
- package/dist/useClientDocument.js +79 -0
- package/dist/useClientDocument.js.map +1 -0
- package/dist/useClientDocument.test.d.ts +2 -0
- package/dist/useClientDocument.test.d.ts.map +1 -0
- package/dist/{useRow.test.js → useClientDocument.test.js} +44 -48
- package/dist/useClientDocument.test.js.map +1 -0
- package/dist/useQuery.d.ts +1 -3
- package/dist/useQuery.d.ts.map +1 -1
- package/dist/useQuery.js +6 -3
- package/dist/useQuery.js.map +1 -1
- package/dist/useQuery.test.js +16 -17
- package/dist/useQuery.test.js.map +1 -1
- package/dist/useStore.d.ts +9 -0
- package/dist/useStore.d.ts.map +1 -0
- package/dist/useStore.js +28 -0
- package/dist/useStore.js.map +1 -0
- package/package.json +11 -11
- package/src/LiveStoreContext.ts +10 -19
- package/src/LiveStoreProvider.test.tsx +6 -5
- package/src/LiveStoreProvider.tsx +7 -4
- package/src/__snapshots__/{useRow.test.tsx.snap → useClientDocument.test.tsx.snap} +62 -46
- package/src/__snapshots__/useQuery.test.tsx.snap +8 -8
- package/src/__tests__/fixture.tsx +69 -39
- package/src/mod.ts +5 -5
- package/src/{useRow.test.tsx → useClientDocument.test.tsx} +51 -55
- package/src/useClientDocument.ts +157 -0
- package/src/useQuery.test.tsx +18 -19
- package/src/useQuery.ts +9 -8
- package/src/useStore.ts +36 -0
- package/tmp/pack.tgz +0 -0
- package/dist/useAtom.d.ts +0 -8
- package/dist/useAtom.d.ts.map +0 -1
- package/dist/useAtom.js +0 -42
- package/dist/useAtom.js.map +0 -1
- package/dist/useRow.d.ts +0 -64
- package/dist/useRow.d.ts.map +0 -1
- package/dist/useRow.js +0 -108
- package/dist/useRow.js.map +0 -1
- package/dist/useRow.test.d.ts +0 -2
- package/dist/useRow.test.d.ts.map +0 -1
- package/dist/useRow.test.js.map +0 -1
- package/src/useAtom.ts +0 -66
- package/src/useRow.ts +0 -210
package/dist/useAtom.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { QueryInfo } from '@livestore/common';
|
|
2
|
-
import type { Store } from '@livestore/livestore';
|
|
3
|
-
import type { LiveQueries } from '@livestore/livestore/internal';
|
|
4
|
-
import type { Dispatch, SetStateAction } from './useRow.js';
|
|
5
|
-
export declare const useAtom: <TQuery extends LiveQueries.LiveQueryDef<any, QueryInfo.Row | QueryInfo.Col>>(queryDef: TQuery, options?: {
|
|
6
|
-
store?: Store;
|
|
7
|
-
}) => [value: LiveQueries.GetResult<TQuery>, setValue: Dispatch<SetStateAction<Partial<LiveQueries.GetResult<TQuery>>>>];
|
|
8
|
-
//# sourceMappingURL=useAtom.d.ts.map
|
package/dist/useAtom.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useAtom.d.ts","sourceRoot":"","sources":["../src/useAtom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA4B,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAE5E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAMhE,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE3D,eAAO,MAAM,OAAO,GAElB,MAAM,SAAS,WAAW,CAAC,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,EAE3E,UAAU,MAAM,EAChB,UAAU;IACR,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,KACA,CACD,KAAK,EAAE,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,EACpC,QAAQ,EAAE,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CA4C3E,CAAA"}
|
package/dist/useAtom.js
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { shouldNeverHappen } from '@livestore/utils';
|
|
2
|
-
import React from 'react';
|
|
3
|
-
import { useStore } from './LiveStoreContext.js';
|
|
4
|
-
import { useQueryRef } from './useQuery.js';
|
|
5
|
-
export const useAtom = (queryDef, options) => {
|
|
6
|
-
const queryRef = useQueryRef(queryDef, { store: options?.store });
|
|
7
|
-
const query$ = queryRef.queryRcRef.value;
|
|
8
|
-
// @ts-expect-error runtime check
|
|
9
|
-
if (query$.queryInfo._tag === 'None') {
|
|
10
|
-
shouldNeverHappen(`Can't useAtom with a query that has no queryInfo`, queryDef);
|
|
11
|
-
}
|
|
12
|
-
const { store } = useStore();
|
|
13
|
-
// TODO make API equivalent to useRow
|
|
14
|
-
const setValue = React.useMemo(() => (newValueOrFn) => {
|
|
15
|
-
const newValue = typeof newValueOrFn === 'function' ? newValueOrFn(queryRef.valueRef.current) : newValueOrFn;
|
|
16
|
-
const table = query$.queryInfo.table;
|
|
17
|
-
if (query$.queryInfo._tag === 'Row') {
|
|
18
|
-
if (table.options.isSingleton && table.options.isSingleColumn) {
|
|
19
|
-
store.commit(table.update(newValue));
|
|
20
|
-
}
|
|
21
|
-
else if (table.options.isSingleColumn) {
|
|
22
|
-
store.commit(table.update({ where: { id: query$.queryInfo.id }, values: { value: newValue } }));
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
store.commit(table.update({ where: { id: query$.queryInfo.id }, values: newValue }));
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
if (table.options.isSingleton && table.options.isSingleColumn) {
|
|
30
|
-
store.commit(table.update({ [query$.queryInfo.column]: newValue }));
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
store.commit(table.update({
|
|
34
|
-
where: { id: query$.queryInfo.id },
|
|
35
|
-
values: { [query$.queryInfo.column]: newValue },
|
|
36
|
-
}));
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}, [query$.queryInfo, queryRef.valueRef, store]);
|
|
40
|
-
return [queryRef.valueRef.current, setValue];
|
|
41
|
-
};
|
|
42
|
-
//# sourceMappingURL=useAtom.js.map
|
package/dist/useAtom.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useAtom.js","sourceRoot":"","sources":["../src/useAtom.ts"],"names":[],"mappings":"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"}
|
package/dist/useRow.d.ts
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import type { QueryInfo, RowQuery } from '@livestore/common';
|
|
2
|
-
import { SessionIdSymbol } from '@livestore/common';
|
|
3
|
-
import { DbSchema } from '@livestore/common/schema';
|
|
4
|
-
import type { LiveQuery, Store } from '@livestore/livestore';
|
|
5
|
-
export type UseRowResult<TTableDef extends DbSchema.TableDefBase> = [
|
|
6
|
-
row: RowQuery.Result<TTableDef>,
|
|
7
|
-
setRow: StateSetters<TTableDef>,
|
|
8
|
-
query$: LiveQuery<RowQuery.Result<TTableDef>, QueryInfo>
|
|
9
|
-
];
|
|
10
|
-
/**
|
|
11
|
-
* Similar to `React.useState` but returns a tuple of `[row, setRow, query$]` for a given table where ...
|
|
12
|
-
*
|
|
13
|
-
* - `row` is the current value of the row (fully decoded according to the table schema)
|
|
14
|
-
* - `setRow` is a function that can be used to update the row (values will be encoded according to the table schema)
|
|
15
|
-
* - `query$` is a `LiveQuery` that e.g. can be used to subscribe to changes to the row
|
|
16
|
-
*
|
|
17
|
-
* `useRow` only works with for tables with client-only derived mutations,
|
|
18
|
-
* i.e. requires the following table options to be set:
|
|
19
|
-
* ```ts
|
|
20
|
-
* const myTable = DbSchema.table('myTable', {
|
|
21
|
-
* // fields ...
|
|
22
|
-
* }, { deriveMutations: { clientOnly: true } })
|
|
23
|
-
* ```
|
|
24
|
-
*
|
|
25
|
-
* If the table is a singleton table, `useRow` can be called without an `id` argument. Otherwise, the `id` argument is required.
|
|
26
|
-
*/
|
|
27
|
-
export declare const useRow: {
|
|
28
|
-
<TTableDef extends DbSchema.TableDef<DbSchema.DefaultSqliteTableDef, DbSchema.TableOptions & {
|
|
29
|
-
isSingleton: true;
|
|
30
|
-
deriveMutations: {
|
|
31
|
-
enabled: true;
|
|
32
|
-
clientOnly: true;
|
|
33
|
-
};
|
|
34
|
-
}>>(table: TTableDef, options?: {
|
|
35
|
-
store?: Store;
|
|
36
|
-
}): UseRowResult<TTableDef>;
|
|
37
|
-
<TTableDef extends DbSchema.TableDef<DbSchema.DefaultSqliteTableDef, DbSchema.TableOptions & {
|
|
38
|
-
isSingleton: false;
|
|
39
|
-
requiredInsertColumnNames: 'id';
|
|
40
|
-
deriveMutations: {
|
|
41
|
-
enabled: true;
|
|
42
|
-
clientOnly: true;
|
|
43
|
-
};
|
|
44
|
-
}>>(table: TTableDef, id: string | SessionIdSymbol | number, options?: Partial<RowQuery.RequiredColumnsOptions<TTableDef>> & {
|
|
45
|
-
store?: Store;
|
|
46
|
-
}): UseRowResult<TTableDef>;
|
|
47
|
-
<TTableDef extends DbSchema.TableDef<DbSchema.DefaultSqliteTableDef, DbSchema.TableOptions & {
|
|
48
|
-
isSingleton: false;
|
|
49
|
-
deriveMutations: {
|
|
50
|
-
enabled: true;
|
|
51
|
-
clientOnly: true;
|
|
52
|
-
};
|
|
53
|
-
}>>(table: TTableDef, id: string | SessionIdSymbol | number, options: RowQuery.RequiredColumnsOptions<TTableDef> & {
|
|
54
|
-
store?: Store;
|
|
55
|
-
}): UseRowResult<TTableDef>;
|
|
56
|
-
};
|
|
57
|
-
export type Dispatch<A> = (action: A) => void;
|
|
58
|
-
export type SetStateAction<S> = S | ((previousValue: S) => S);
|
|
59
|
-
export type StateSetters<TTableDef extends DbSchema.TableDefBase> = TTableDef['options']['isSingleColumn'] extends true ? Dispatch<SetStateAction<RowQuery.Result<TTableDef>>> : {
|
|
60
|
-
[K in keyof RowQuery.Result<TTableDef>]: Dispatch<SetStateAction<RowQuery.Result<TTableDef>[K]>>;
|
|
61
|
-
} & {
|
|
62
|
-
setMany: Dispatch<SetStateAction<Partial<RowQuery.Result<TTableDef>>>>;
|
|
63
|
-
};
|
|
64
|
-
//# sourceMappingURL=useRow.d.ts.map
|
package/dist/useRow.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useRow.d.ts","sourceRoot":"","sources":["../src/useRow.ts"],"names":[],"mappings":"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"}
|
package/dist/useRow.js
DELETED
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import { SessionIdSymbol } from '@livestore/common';
|
|
2
|
-
import { DbSchema } from '@livestore/common/schema';
|
|
3
|
-
import { queryDb } from '@livestore/livestore';
|
|
4
|
-
import { shouldNeverHappen } from '@livestore/utils';
|
|
5
|
-
import { ReadonlyRecord } from '@livestore/utils/effect';
|
|
6
|
-
import React from 'react';
|
|
7
|
-
import { useStore } from './LiveStoreContext.js';
|
|
8
|
-
import { useQueryRef } from './useQuery.js';
|
|
9
|
-
/**
|
|
10
|
-
* Similar to `React.useState` but returns a tuple of `[row, setRow, query$]` for a given table where ...
|
|
11
|
-
*
|
|
12
|
-
* - `row` is the current value of the row (fully decoded according to the table schema)
|
|
13
|
-
* - `setRow` is a function that can be used to update the row (values will be encoded according to the table schema)
|
|
14
|
-
* - `query$` is a `LiveQuery` that e.g. can be used to subscribe to changes to the row
|
|
15
|
-
*
|
|
16
|
-
* `useRow` only works with for tables with client-only derived mutations,
|
|
17
|
-
* i.e. requires the following table options to be set:
|
|
18
|
-
* ```ts
|
|
19
|
-
* const myTable = DbSchema.table('myTable', {
|
|
20
|
-
* // fields ...
|
|
21
|
-
* }, { deriveMutations: { clientOnly: true } })
|
|
22
|
-
* ```
|
|
23
|
-
*
|
|
24
|
-
* If the table is a singleton table, `useRow` can be called without an `id` argument. Otherwise, the `id` argument is required.
|
|
25
|
-
*/
|
|
26
|
-
export const useRow = (table, idOrOptions, options_) => {
|
|
27
|
-
const sqliteTableDef = table.sqliteDef;
|
|
28
|
-
const id = typeof idOrOptions === 'string' || idOrOptions === SessionIdSymbol || typeof idOrOptions === 'number'
|
|
29
|
-
? idOrOptions
|
|
30
|
-
: undefined;
|
|
31
|
-
const options = typeof idOrOptions === 'string' || idOrOptions === SessionIdSymbol || typeof idOrOptions === 'number'
|
|
32
|
-
? options_
|
|
33
|
-
: idOrOptions;
|
|
34
|
-
const { insertValues } = options ?? {};
|
|
35
|
-
React.useMemo(() => validateTableOptions(table), [table]);
|
|
36
|
-
const tableName = table.sqliteDef.name;
|
|
37
|
-
const { store } = useStore({ store: options?.store });
|
|
38
|
-
if (store.schema.tables.has(table.sqliteDef.name) === false &&
|
|
39
|
-
table.sqliteDef.name.startsWith('__livestore') === false) {
|
|
40
|
-
shouldNeverHappen(`Table "${table.sqliteDef.name}" not found in schema`);
|
|
41
|
-
}
|
|
42
|
-
// console.debug('useRow', tableName, id)
|
|
43
|
-
const idVal = id === SessionIdSymbol ? 'session' : id;
|
|
44
|
-
const rowQuery = table.query.row;
|
|
45
|
-
const queryDef = React.useMemo(() => DbSchema.tableIsSingleton(table)
|
|
46
|
-
? queryDb(rowQuery(), {})
|
|
47
|
-
: queryDb(rowQuery(id, { insertValues: insertValues }), { deps: idVal }), [id, insertValues, rowQuery, table, idVal]);
|
|
48
|
-
const queryRef = useQueryRef(queryDef, {
|
|
49
|
-
otelSpanName: `LiveStore:useRow:${tableName}${idVal === undefined ? '' : `:${idVal}`}`,
|
|
50
|
-
store: options?.store,
|
|
51
|
-
});
|
|
52
|
-
const setState = React.useMemo(() => {
|
|
53
|
-
if (table.options.isSingleColumn) {
|
|
54
|
-
return (newValueOrFn) => {
|
|
55
|
-
const newValue = typeof newValueOrFn === 'function' ? newValueOrFn(queryRef.valueRef.current) : newValueOrFn;
|
|
56
|
-
if (queryRef.valueRef.current === newValue)
|
|
57
|
-
return;
|
|
58
|
-
// NOTE we need to account for the short-hand syntax for single-column+singleton tables
|
|
59
|
-
if (table.options.isSingleton) {
|
|
60
|
-
store.commit(table.update(newValue));
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
store.commit(table.update({ where: { id }, values: { value: newValue } }));
|
|
64
|
-
}
|
|
65
|
-
// store.commit(updateMutationForQueryInfo(query$.queryInfo!, { value: newValue }))
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
const setState = // TODO: do we have a better type for the values that can go in SQLite?
|
|
70
|
-
ReadonlyRecord.map(sqliteTableDef.columns, (column, columnName) => (newValueOrFn) => {
|
|
71
|
-
const newValue =
|
|
72
|
-
// @ts-expect-error TODO fix typing
|
|
73
|
-
typeof newValueOrFn === 'function' ? newValueOrFn(queryRef.valueRef.current[columnName]) : newValueOrFn;
|
|
74
|
-
// Don't update the state if it's the same as the value already seen in the component
|
|
75
|
-
// @ts-expect-error TODO fix typing
|
|
76
|
-
if (queryRef.valueRef.current[columnName] === newValue)
|
|
77
|
-
return;
|
|
78
|
-
store.commit(table.update({ where: { id: id ?? 'singleton' }, values: { [columnName]: newValue } }));
|
|
79
|
-
// store.commit(updateMutationForQueryInfo(query$.queryInfo!, { [columnName]: newValue }))
|
|
80
|
-
});
|
|
81
|
-
setState.setMany = (columnValuesOrFn) => {
|
|
82
|
-
const columnValues =
|
|
83
|
-
// @ts-expect-error TODO fix typing
|
|
84
|
-
typeof columnValuesOrFn === 'function' ? columnValuesOrFn(queryRef.valueRef.current) : columnValuesOrFn;
|
|
85
|
-
// TODO use hashing instead
|
|
86
|
-
// Don't update the state if it's the same as the value already seen in the component
|
|
87
|
-
if (
|
|
88
|
-
// @ts-expect-error TODO fix typing
|
|
89
|
-
Object.entries(columnValues).every(([columnName, value]) => queryRef.valueRef.current[columnName] === value)) {
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
store.commit(table.update({ where: { id: id ?? 'singleton' }, values: columnValues }));
|
|
93
|
-
// store.commit(updateMutationForQueryInfo(query$.queryInfo!, columnValues))
|
|
94
|
-
};
|
|
95
|
-
return setState;
|
|
96
|
-
}
|
|
97
|
-
}, [id, queryRef.valueRef, sqliteTableDef.columns, store, table]);
|
|
98
|
-
return [queryRef.valueRef.current, setState, queryRef.queryRcRef.value];
|
|
99
|
-
};
|
|
100
|
-
const validateTableOptions = (table) => {
|
|
101
|
-
if (table.options.deriveMutations.clientOnly === false) {
|
|
102
|
-
return shouldNeverHappen(`useRow called on table "${table.sqliteDef.name}" which does not have 'deriveMutations: { clientOnly: true }' set`);
|
|
103
|
-
}
|
|
104
|
-
if (table.options.deriveMutations.enabled === false) {
|
|
105
|
-
return shouldNeverHappen(`useRow called on table "${table.sqliteDef.name}" which does not have 'deriveMutations: { clientOnly: true }' set`);
|
|
106
|
-
}
|
|
107
|
-
};
|
|
108
|
-
//# sourceMappingURL=useRow.js.map
|
package/dist/useRow.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useRow.js","sourceRoot":"","sources":["../src/useRow.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEnD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAEnD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAQ3C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,MAAM,GAyCf,CAMF,KAAgB,EAChB,WAAmE,EACnE,QAAkF,EACzD,EAAE;IAC3B,MAAM,cAAc,GAAG,KAAK,CAAC,SAAS,CAAA;IACtC,MAAM,EAAE,GACN,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,eAAe,IAAI,OAAO,WAAW,KAAK,QAAQ;QACnG,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,SAAS,CAAA;IACf,MAAM,OAAO,GACX,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,eAAe,IAAI,OAAO,WAAW,KAAK,QAAQ;QACnG,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,WAAW,CAAA;IACjB,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,IAAI,EAAE,CAAA;IAItC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;IAEzD,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAA;IAEtC,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;IAErD,IACE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,KAAK;QACvD,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,KAAK,EACxD,CAAC;QACD,iBAAiB,CAAC,UAAU,KAAK,CAAC,SAAS,CAAC,IAAI,uBAAuB,CAAC,CAAA;IAC1E,CAAC;IAED,yCAAyC;IAEzC,MAAM,KAAK,GAAG,EAAE,KAAK,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAA;IACrD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAU,CAAA;IAGvC,MAAM,QAAQ,GAAa,KAAK,CAAC,OAAO,CACtC,GAAG,EAAE,CACH,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC;QAC9B,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC;QACzB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAG,EAAE,EAAE,YAAY,EAAE,YAAa,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,KAAM,EAAE,CAAC,EAC/E,CAAC,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAC3C,CAAA;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,EAAE;QACrC,YAAY,EAAE,oBAAoB,SAAS,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,EAAE;QACtF,KAAK,EAAE,OAAO,EAAE,KAAK;KACtB,CAAC,CAAA;IAEF,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAA0B,GAAG,EAAE;QAC3D,IAAI,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;YACjC,OAAO,CAAC,YAAwC,EAAE,EAAE;gBAClD,MAAM,QAAQ,GAAG,OAAO,YAAY,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,CAAA;gBAC5G,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,KAAK,QAAQ;oBAAE,OAAM;gBAElD,uFAAuF;gBACvF,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;oBAC9B,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;gBACtC,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAA;gBAC5E,CAAC;gBACD,mFAAmF;YACrF,CAAC,CAAA;QACH,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,uEAAuE;aACtF,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,YAAiB,EAAE,EAAE;gBACvF,MAAM,QAAQ;gBACZ,mCAAmC;gBACnC,OAAO,YAAY,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAA;gBAEzG,qFAAqF;gBACrF,mCAAmC;gBACnC,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,QAAQ;oBAAE,OAAM;gBAE9D,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,WAAW,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAA;gBACpG,0FAA0F;YAC5F,CAAC,CAAC,CAAA;YAEJ,QAAQ,CAAC,OAAO,GAAG,CAAC,gBAA0C,EAAE,EAAE;gBAChE,MAAM,YAAY;gBAChB,mCAAmC;gBACnC,OAAO,gBAAgB,KAAK,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAA;gBAEzG,2BAA2B;gBAC3B,qFAAqF;gBACrF;gBACE,mCAAmC;gBACnC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,KAAK,CAAC,EAC5G,CAAC;oBACD,OAAM;gBACR,CAAC;gBAED,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,WAAW,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,CAAA;gBACtF,4EAA4E;YAC9E,CAAC,CAAA;YAED,OAAO,QAAe,CAAA;QACxB,CAAC;IACH,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAA;IAEjE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;AACzE,CAAC,CAAA;AAaD,MAAM,oBAAoB,GAAG,CAAC,KAAkC,EAAE,EAAE;IAClE,IAAI,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;QACvD,OAAO,iBAAiB,CACtB,2BAA2B,KAAK,CAAC,SAAS,CAAC,IAAI,mEAAmE,CACnH,CAAA;IACH,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QACpD,OAAO,iBAAiB,CACtB,2BAA2B,KAAK,CAAC,SAAS,CAAC,IAAI,mEAAmE,CACnH,CAAA;IACH,CAAC;AACH,CAAC,CAAA"}
|
package/dist/useRow.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useRow.test.d.ts","sourceRoot":"","sources":["../src/useRow.test.tsx"],"names":[],"mappings":""}
|
package/dist/useRow.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useRow.test.js","sourceRoot":"","sources":["../src/useRow.test.tsx"],"names":[],"mappings":"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"}
|
package/src/useAtom.ts
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import type { DerivedMutationHelperFns, QueryInfo } from '@livestore/common'
|
|
2
|
-
import type { DbSchema, SqliteDsl } from '@livestore/common/schema'
|
|
3
|
-
import type { Store } from '@livestore/livestore'
|
|
4
|
-
import type { LiveQueries } from '@livestore/livestore/internal'
|
|
5
|
-
import { shouldNeverHappen } from '@livestore/utils'
|
|
6
|
-
import React from 'react'
|
|
7
|
-
|
|
8
|
-
import { useStore } from './LiveStoreContext.js'
|
|
9
|
-
import { useQueryRef } from './useQuery.js'
|
|
10
|
-
import type { Dispatch, SetStateAction } from './useRow.js'
|
|
11
|
-
|
|
12
|
-
export const useAtom = <
|
|
13
|
-
// TODO also support colJsonValue
|
|
14
|
-
TQuery extends LiveQueries.LiveQueryDef<any, QueryInfo.Row | QueryInfo.Col>,
|
|
15
|
-
>(
|
|
16
|
-
queryDef: TQuery,
|
|
17
|
-
options?: {
|
|
18
|
-
store?: Store
|
|
19
|
-
},
|
|
20
|
-
): [
|
|
21
|
-
value: LiveQueries.GetResult<TQuery>,
|
|
22
|
-
setValue: Dispatch<SetStateAction<Partial<LiveQueries.GetResult<TQuery>>>>,
|
|
23
|
-
] => {
|
|
24
|
-
const queryRef = useQueryRef(queryDef, { store: options?.store })
|
|
25
|
-
const query$ = queryRef.queryRcRef.value
|
|
26
|
-
|
|
27
|
-
// @ts-expect-error runtime check
|
|
28
|
-
if (query$.queryInfo._tag === 'None') {
|
|
29
|
-
shouldNeverHappen(`Can't useAtom with a query that has no queryInfo`, queryDef)
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const { store } = useStore()
|
|
33
|
-
|
|
34
|
-
// TODO make API equivalent to useRow
|
|
35
|
-
const setValue = React.useMemo<Dispatch<SetStateAction<Partial<LiveQueries.GetResult<TQuery>>>>>(
|
|
36
|
-
() => (newValueOrFn: any) => {
|
|
37
|
-
const newValue = typeof newValueOrFn === 'function' ? newValueOrFn(queryRef.valueRef.current) : newValueOrFn
|
|
38
|
-
const table = query$.queryInfo.table as DbSchema.TableDef &
|
|
39
|
-
DerivedMutationHelperFns<SqliteDsl.Columns, DbSchema.TableOptions>
|
|
40
|
-
|
|
41
|
-
if (query$.queryInfo._tag === 'Row') {
|
|
42
|
-
if (table.options.isSingleton && table.options.isSingleColumn) {
|
|
43
|
-
store.commit(table.update(newValue))
|
|
44
|
-
} else if (table.options.isSingleColumn) {
|
|
45
|
-
store.commit(table.update({ where: { id: query$.queryInfo.id }, values: { value: newValue } }))
|
|
46
|
-
} else {
|
|
47
|
-
store.commit(table.update({ where: { id: query$.queryInfo.id }, values: newValue }))
|
|
48
|
-
}
|
|
49
|
-
} else {
|
|
50
|
-
if (table.options.isSingleton && table.options.isSingleColumn) {
|
|
51
|
-
store.commit(table.update({ [query$.queryInfo.column]: newValue }))
|
|
52
|
-
} else {
|
|
53
|
-
store.commit(
|
|
54
|
-
table.update({
|
|
55
|
-
where: { id: query$.queryInfo.id },
|
|
56
|
-
values: { [query$.queryInfo.column]: newValue },
|
|
57
|
-
}),
|
|
58
|
-
)
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
},
|
|
62
|
-
[query$.queryInfo, queryRef.valueRef, store],
|
|
63
|
-
)
|
|
64
|
-
|
|
65
|
-
return [queryRef.valueRef.current, setValue]
|
|
66
|
-
}
|
package/src/useRow.ts
DELETED
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
import type { QueryInfo, RowQuery } from '@livestore/common'
|
|
2
|
-
import { SessionIdSymbol } from '@livestore/common'
|
|
3
|
-
import type { SqliteDsl } from '@livestore/common/schema'
|
|
4
|
-
import { DbSchema } from '@livestore/common/schema'
|
|
5
|
-
import type { LiveQuery, LiveQueryDef, Store } from '@livestore/livestore'
|
|
6
|
-
import { queryDb } from '@livestore/livestore'
|
|
7
|
-
import { shouldNeverHappen } from '@livestore/utils'
|
|
8
|
-
import { ReadonlyRecord } from '@livestore/utils/effect'
|
|
9
|
-
import React from 'react'
|
|
10
|
-
|
|
11
|
-
import { useStore } from './LiveStoreContext.js'
|
|
12
|
-
import { useQueryRef } from './useQuery.js'
|
|
13
|
-
|
|
14
|
-
export type UseRowResult<TTableDef extends DbSchema.TableDefBase> = [
|
|
15
|
-
row: RowQuery.Result<TTableDef>,
|
|
16
|
-
setRow: StateSetters<TTableDef>,
|
|
17
|
-
query$: LiveQuery<RowQuery.Result<TTableDef>, QueryInfo>,
|
|
18
|
-
]
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Similar to `React.useState` but returns a tuple of `[row, setRow, query$]` for a given table where ...
|
|
22
|
-
*
|
|
23
|
-
* - `row` is the current value of the row (fully decoded according to the table schema)
|
|
24
|
-
* - `setRow` is a function that can be used to update the row (values will be encoded according to the table schema)
|
|
25
|
-
* - `query$` is a `LiveQuery` that e.g. can be used to subscribe to changes to the row
|
|
26
|
-
*
|
|
27
|
-
* `useRow` only works with for tables with client-only derived mutations,
|
|
28
|
-
* i.e. requires the following table options to be set:
|
|
29
|
-
* ```ts
|
|
30
|
-
* const myTable = DbSchema.table('myTable', {
|
|
31
|
-
* // fields ...
|
|
32
|
-
* }, { deriveMutations: { clientOnly: true } })
|
|
33
|
-
* ```
|
|
34
|
-
*
|
|
35
|
-
* If the table is a singleton table, `useRow` can be called without an `id` argument. Otherwise, the `id` argument is required.
|
|
36
|
-
*/
|
|
37
|
-
export const useRow: {
|
|
38
|
-
// isSingleton: true
|
|
39
|
-
<
|
|
40
|
-
TTableDef extends DbSchema.TableDef<
|
|
41
|
-
DbSchema.DefaultSqliteTableDef,
|
|
42
|
-
DbSchema.TableOptions & { isSingleton: true; deriveMutations: { enabled: true; clientOnly: true } }
|
|
43
|
-
>,
|
|
44
|
-
>(
|
|
45
|
-
table: TTableDef,
|
|
46
|
-
options?: { store?: Store },
|
|
47
|
-
): UseRowResult<TTableDef>
|
|
48
|
-
|
|
49
|
-
// isSingleton: false with requiredInsertColumnNames: 'id'
|
|
50
|
-
<
|
|
51
|
-
TTableDef extends DbSchema.TableDef<
|
|
52
|
-
DbSchema.DefaultSqliteTableDef,
|
|
53
|
-
DbSchema.TableOptions & {
|
|
54
|
-
isSingleton: false
|
|
55
|
-
requiredInsertColumnNames: 'id'
|
|
56
|
-
deriveMutations: { enabled: true; clientOnly: true }
|
|
57
|
-
}
|
|
58
|
-
>,
|
|
59
|
-
>(
|
|
60
|
-
table: TTableDef,
|
|
61
|
-
// TODO adjust so it works with arbitrary primary keys or unique constraints
|
|
62
|
-
id: string | SessionIdSymbol | number,
|
|
63
|
-
options?: Partial<RowQuery.RequiredColumnsOptions<TTableDef>> & { store?: Store },
|
|
64
|
-
): UseRowResult<TTableDef>
|
|
65
|
-
|
|
66
|
-
// isSingleton: false
|
|
67
|
-
<
|
|
68
|
-
TTableDef extends DbSchema.TableDef<
|
|
69
|
-
DbSchema.DefaultSqliteTableDef,
|
|
70
|
-
DbSchema.TableOptions & { isSingleton: false; deriveMutations: { enabled: true; clientOnly: true } }
|
|
71
|
-
>,
|
|
72
|
-
>(
|
|
73
|
-
table: TTableDef,
|
|
74
|
-
// TODO adjust so it works with arbitrary primary keys or unique constraints
|
|
75
|
-
id: string | SessionIdSymbol | number,
|
|
76
|
-
options: RowQuery.RequiredColumnsOptions<TTableDef> & { store?: Store },
|
|
77
|
-
): UseRowResult<TTableDef>
|
|
78
|
-
} = <
|
|
79
|
-
TTableDef extends DbSchema.TableDef<
|
|
80
|
-
DbSchema.DefaultSqliteTableDefConstrained,
|
|
81
|
-
DbSchema.TableOptions & { deriveMutations: { enabled: true; clientOnly: true } }
|
|
82
|
-
>,
|
|
83
|
-
>(
|
|
84
|
-
table: TTableDef,
|
|
85
|
-
idOrOptions?: string | SessionIdSymbol | number | { store?: Store },
|
|
86
|
-
options_?: Partial<RowQuery.RequiredColumnsOptions<TTableDef>> & { store?: Store },
|
|
87
|
-
): UseRowResult<TTableDef> => {
|
|
88
|
-
const sqliteTableDef = table.sqliteDef
|
|
89
|
-
const id =
|
|
90
|
-
typeof idOrOptions === 'string' || idOrOptions === SessionIdSymbol || typeof idOrOptions === 'number'
|
|
91
|
-
? idOrOptions
|
|
92
|
-
: undefined
|
|
93
|
-
const options: (Partial<RowQuery.RequiredColumnsOptions<TTableDef>> & { store?: Store }) | undefined =
|
|
94
|
-
typeof idOrOptions === 'string' || idOrOptions === SessionIdSymbol || typeof idOrOptions === 'number'
|
|
95
|
-
? options_
|
|
96
|
-
: idOrOptions
|
|
97
|
-
const { insertValues } = options ?? {}
|
|
98
|
-
|
|
99
|
-
type TComponentState = SqliteDsl.FromColumns.RowDecoded<TTableDef['sqliteDef']['columns']>
|
|
100
|
-
|
|
101
|
-
React.useMemo(() => validateTableOptions(table), [table])
|
|
102
|
-
|
|
103
|
-
const tableName = table.sqliteDef.name
|
|
104
|
-
|
|
105
|
-
const { store } = useStore({ store: options?.store })
|
|
106
|
-
|
|
107
|
-
if (
|
|
108
|
-
store.schema.tables.has(table.sqliteDef.name) === false &&
|
|
109
|
-
table.sqliteDef.name.startsWith('__livestore') === false
|
|
110
|
-
) {
|
|
111
|
-
shouldNeverHappen(`Table "${table.sqliteDef.name}" not found in schema`)
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// console.debug('useRow', tableName, id)
|
|
115
|
-
|
|
116
|
-
const idVal = id === SessionIdSymbol ? 'session' : id
|
|
117
|
-
const rowQuery = table.query.row as any
|
|
118
|
-
|
|
119
|
-
type QueryDef = LiveQueryDef<RowQuery.Result<TTableDef>, QueryInfo.Row>
|
|
120
|
-
const queryDef: QueryDef = React.useMemo(
|
|
121
|
-
() =>
|
|
122
|
-
DbSchema.tableIsSingleton(table)
|
|
123
|
-
? queryDb(rowQuery(), {})
|
|
124
|
-
: queryDb(rowQuery(id!, { insertValues: insertValues! }), { deps: idVal! }),
|
|
125
|
-
[id, insertValues, rowQuery, table, idVal],
|
|
126
|
-
)
|
|
127
|
-
|
|
128
|
-
const queryRef = useQueryRef(queryDef, {
|
|
129
|
-
otelSpanName: `LiveStore:useRow:${tableName}${idVal === undefined ? '' : `:${idVal}`}`,
|
|
130
|
-
store: options?.store,
|
|
131
|
-
})
|
|
132
|
-
|
|
133
|
-
const setState = React.useMemo<StateSetters<TTableDef>>(() => {
|
|
134
|
-
if (table.options.isSingleColumn) {
|
|
135
|
-
return (newValueOrFn: RowQuery.Result<TTableDef>) => {
|
|
136
|
-
const newValue = typeof newValueOrFn === 'function' ? newValueOrFn(queryRef.valueRef.current) : newValueOrFn
|
|
137
|
-
if (queryRef.valueRef.current === newValue) return
|
|
138
|
-
|
|
139
|
-
// NOTE we need to account for the short-hand syntax for single-column+singleton tables
|
|
140
|
-
if (table.options.isSingleton) {
|
|
141
|
-
store.commit(table.update(newValue))
|
|
142
|
-
} else {
|
|
143
|
-
store.commit(table.update({ where: { id }, values: { value: newValue } }))
|
|
144
|
-
}
|
|
145
|
-
// store.commit(updateMutationForQueryInfo(query$.queryInfo!, { value: newValue }))
|
|
146
|
-
}
|
|
147
|
-
} else {
|
|
148
|
-
const setState = // TODO: do we have a better type for the values that can go in SQLite?
|
|
149
|
-
ReadonlyRecord.map(sqliteTableDef.columns, (column, columnName) => (newValueOrFn: any) => {
|
|
150
|
-
const newValue =
|
|
151
|
-
// @ts-expect-error TODO fix typing
|
|
152
|
-
typeof newValueOrFn === 'function' ? newValueOrFn(queryRef.valueRef.current[columnName]) : newValueOrFn
|
|
153
|
-
|
|
154
|
-
// Don't update the state if it's the same as the value already seen in the component
|
|
155
|
-
// @ts-expect-error TODO fix typing
|
|
156
|
-
if (queryRef.valueRef.current[columnName] === newValue) return
|
|
157
|
-
|
|
158
|
-
store.commit(table.update({ where: { id: id ?? 'singleton' }, values: { [columnName]: newValue } }))
|
|
159
|
-
// store.commit(updateMutationForQueryInfo(query$.queryInfo!, { [columnName]: newValue }))
|
|
160
|
-
})
|
|
161
|
-
|
|
162
|
-
setState.setMany = (columnValuesOrFn: Partial<TComponentState>) => {
|
|
163
|
-
const columnValues =
|
|
164
|
-
// @ts-expect-error TODO fix typing
|
|
165
|
-
typeof columnValuesOrFn === 'function' ? columnValuesOrFn(queryRef.valueRef.current) : columnValuesOrFn
|
|
166
|
-
|
|
167
|
-
// TODO use hashing instead
|
|
168
|
-
// Don't update the state if it's the same as the value already seen in the component
|
|
169
|
-
if (
|
|
170
|
-
// @ts-expect-error TODO fix typing
|
|
171
|
-
Object.entries(columnValues).every(([columnName, value]) => queryRef.valueRef.current[columnName] === value)
|
|
172
|
-
) {
|
|
173
|
-
return
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
store.commit(table.update({ where: { id: id ?? 'singleton' }, values: columnValues }))
|
|
177
|
-
// store.commit(updateMutationForQueryInfo(query$.queryInfo!, columnValues))
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
return setState as any
|
|
181
|
-
}
|
|
182
|
-
}, [id, queryRef.valueRef, sqliteTableDef.columns, store, table])
|
|
183
|
-
|
|
184
|
-
return [queryRef.valueRef.current, setState, queryRef.queryRcRef.value]
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
export type Dispatch<A> = (action: A) => void
|
|
188
|
-
export type SetStateAction<S> = S | ((previousValue: S) => S)
|
|
189
|
-
|
|
190
|
-
export type StateSetters<TTableDef extends DbSchema.TableDefBase> = TTableDef['options']['isSingleColumn'] extends true
|
|
191
|
-
? Dispatch<SetStateAction<RowQuery.Result<TTableDef>>>
|
|
192
|
-
: {
|
|
193
|
-
[K in keyof RowQuery.Result<TTableDef>]: Dispatch<SetStateAction<RowQuery.Result<TTableDef>[K]>>
|
|
194
|
-
} & {
|
|
195
|
-
setMany: Dispatch<SetStateAction<Partial<RowQuery.Result<TTableDef>>>>
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
const validateTableOptions = (table: DbSchema.TableDef<any, any>) => {
|
|
199
|
-
if (table.options.deriveMutations.clientOnly === false) {
|
|
200
|
-
return shouldNeverHappen(
|
|
201
|
-
`useRow called on table "${table.sqliteDef.name}" which does not have 'deriveMutations: { clientOnly: true }' set`,
|
|
202
|
-
)
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
if (table.options.deriveMutations.enabled === false) {
|
|
206
|
-
return shouldNeverHappen(
|
|
207
|
-
`useRow called on table "${table.sqliteDef.name}" which does not have 'deriveMutations: { clientOnly: true }' set`,
|
|
208
|
-
)
|
|
209
|
-
}
|
|
210
|
-
}
|