@livestore/livestore 0.0.19 → 0.0.22
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/README.md +29 -22
- package/dist/.tsbuildinfo +1 -1
- package/dist/QueryCache.d.ts +1 -1
- package/dist/QueryCache.d.ts.map +1 -1
- package/dist/QueryCache.js.map +1 -1
- package/dist/__tests__/react/fixture.d.ts +5 -4
- package/dist/__tests__/react/fixture.d.ts.map +1 -1
- package/dist/__tests__/react/fixture.js +3 -5
- package/dist/__tests__/react/fixture.js.map +1 -1
- package/dist/__tests__/react/useComponentState.test.d.ts +2 -0
- package/dist/__tests__/react/useComponentState.test.d.ts.map +1 -0
- package/dist/__tests__/react/useComponentState.test.js +68 -0
- package/dist/__tests__/react/useComponentState.test.js.map +1 -0
- package/dist/__tests__/react/useLQuery.test.d.ts +2 -0
- package/dist/__tests__/react/useLQuery.test.d.ts.map +1 -0
- package/dist/__tests__/react/useLQuery.test.js +38 -0
- package/dist/__tests__/react/useLQuery.test.js.map +1 -0
- package/dist/__tests__/react/useLiveStoreComponent.test.js +4 -9
- package/dist/__tests__/react/useLiveStoreComponent.test.js.map +1 -1
- package/dist/__tests__/react/useQuery.test.d.ts +2 -0
- package/dist/__tests__/react/useQuery.test.d.ts.map +1 -0
- package/dist/__tests__/react/useQuery.test.js +33 -0
- package/dist/__tests__/react/useQuery.test.js.map +1 -0
- package/dist/__tests__/react/utils/extractStackInfoFromStackTrace.test.d.ts +2 -0
- package/dist/__tests__/react/utils/extractStackInfoFromStackTrace.test.d.ts.map +1 -0
- package/dist/__tests__/react/utils/extractStackInfoFromStackTrace.test.js +38 -0
- package/dist/__tests__/react/utils/extractStackInfoFromStackTrace.test.js.map +1 -0
- package/dist/__tests__/react/utils/stack-info.test.d.ts +2 -0
- package/dist/__tests__/react/utils/stack-info.test.d.ts.map +1 -0
- package/dist/__tests__/react/utils/stack-info.test.js +43 -0
- package/dist/__tests__/react/utils/stack-info.test.js.map +1 -0
- package/dist/__tests__/reactive.test.js +179 -93
- package/dist/__tests__/reactive.test.js.map +1 -1
- package/dist/__tests__/reactiveQueries/sql.test.d.ts +2 -0
- package/dist/__tests__/reactiveQueries/sql.test.d.ts.map +1 -0
- package/dist/__tests__/reactiveQueries/sql.test.js +337 -0
- package/dist/__tests__/reactiveQueries/sql.test.js.map +1 -0
- package/dist/inMemoryDatabase.d.ts +4 -3
- package/dist/inMemoryDatabase.d.ts.map +1 -1
- package/dist/inMemoryDatabase.js +3 -2
- package/dist/inMemoryDatabase.js.map +1 -1
- package/dist/index.d.ts +7 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/react/index.d.ts +4 -3
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +3 -2
- package/dist/react/index.js.map +1 -1
- package/dist/react/useComponentState.d.ts +50 -0
- package/dist/react/useComponentState.d.ts.map +1 -0
- package/dist/react/useComponentState.js +240 -0
- package/dist/react/useComponentState.js.map +1 -0
- package/dist/react/useGlobalQuery.d.ts +3 -0
- package/dist/react/useGlobalQuery.d.ts.map +1 -0
- package/dist/react/useGlobalQuery.js +26 -0
- package/dist/react/useGlobalQuery.js.map +1 -0
- package/dist/react/useGraphQL.d.ts +3 -3
- package/dist/react/useGraphQL.d.ts.map +1 -1
- package/dist/react/useGraphQL.js +10 -8
- package/dist/react/useGraphQL.js.map +1 -1
- package/dist/react/useLiveStoreComponent.d.ts +6 -6
- package/dist/react/useLiveStoreComponent.d.ts.map +1 -1
- package/dist/react/useLiveStoreComponent.js +143 -99
- package/dist/react/useLiveStoreComponent.js.map +1 -1
- package/dist/react/useQuery.d.ts +2 -2
- package/dist/react/useQuery.d.ts.map +1 -1
- package/dist/react/useQuery.js +54 -30
- package/dist/react/useQuery.js.map +1 -1
- package/dist/react/useTemporaryQuery.d.ts +8 -0
- package/dist/react/useTemporaryQuery.d.ts.map +1 -0
- package/dist/react/useTemporaryQuery.js +19 -0
- package/dist/react/useTemporaryQuery.js.map +1 -0
- package/dist/react/utils/extractNamesFromStackTrace.d.ts +3 -0
- package/dist/react/utils/extractNamesFromStackTrace.d.ts.map +1 -0
- package/dist/react/utils/extractNamesFromStackTrace.js +40 -0
- package/dist/react/utils/extractNamesFromStackTrace.js.map +1 -0
- package/dist/react/utils/extractStackInfoFromStackTrace.d.ts +7 -0
- package/dist/react/utils/extractStackInfoFromStackTrace.d.ts.map +1 -0
- package/dist/react/utils/extractStackInfoFromStackTrace.js +40 -0
- package/dist/react/utils/extractStackInfoFromStackTrace.js.map +1 -0
- package/dist/react/utils/stack-info.d.ts +11 -0
- package/dist/react/utils/stack-info.d.ts.map +1 -0
- package/dist/react/utils/stack-info.js +49 -0
- package/dist/react/utils/stack-info.js.map +1 -0
- package/dist/reactive.d.ts +51 -67
- package/dist/reactive.d.ts.map +1 -1
- package/dist/reactive.js +138 -220
- package/dist/reactive.js.map +1 -1
- package/dist/reactiveQueries/base-class.d.ts +28 -21
- package/dist/reactiveQueries/base-class.d.ts.map +1 -1
- package/dist/reactiveQueries/base-class.js +22 -18
- package/dist/reactiveQueries/base-class.js.map +1 -1
- package/dist/reactiveQueries/graph.d.ts +10 -0
- package/dist/reactiveQueries/graph.d.ts.map +1 -0
- package/dist/reactiveQueries/graph.js +6 -0
- package/dist/reactiveQueries/graph.js.map +1 -0
- package/dist/reactiveQueries/graphql.d.ts +35 -17
- package/dist/reactiveQueries/graphql.d.ts.map +1 -1
- package/dist/reactiveQueries/graphql.js +86 -10
- package/dist/reactiveQueries/graphql.js.map +1 -1
- package/dist/reactiveQueries/js.d.ts +17 -12
- package/dist/reactiveQueries/js.d.ts.map +1 -1
- package/dist/reactiveQueries/js.js +30 -8
- package/dist/reactiveQueries/js.js.map +1 -1
- package/dist/reactiveQueries/sql.d.ts +28 -18
- package/dist/reactiveQueries/sql.d.ts.map +1 -1
- package/dist/reactiveQueries/sql.js +79 -16
- package/dist/reactiveQueries/sql.js.map +1 -1
- package/dist/store.d.ts +35 -61
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +77 -272
- package/dist/store.js.map +1 -1
- package/package.json +4 -3
- package/src/QueryCache.ts +1 -1
- package/src/__tests__/react/fixture.tsx +10 -8
- package/src/__tests__/react/{useLiveStoreComponent.test.tsx → useComponentState.test.tsx} +9 -20
- package/src/__tests__/react/useQuery.test.tsx +48 -0
- package/src/__tests__/react/utils/stack-info.test.ts +45 -0
- package/src/__tests__/reactive.test.ts +212 -140
- package/src/__tests__/reactiveQueries/sql.test.ts +372 -0
- package/src/inMemoryDatabase.ts +11 -8
- package/src/index.ts +7 -11
- package/src/react/index.ts +4 -7
- package/src/react/{useLiveStoreComponent.ts → useComponentState.ts} +90 -253
- package/src/react/useQuery.ts +74 -40
- package/src/react/useTemporaryQuery.ts +23 -0
- package/src/react/utils/stack-info.ts +63 -0
- package/src/reactive.ts +234 -308
- package/src/reactiveQueries/base-class.ts +59 -42
- package/src/reactiveQueries/graph.ts +15 -0
- package/src/reactiveQueries/graphql.ts +143 -29
- package/src/reactiveQueries/js.ts +57 -20
- package/src/reactiveQueries/sql.ts +136 -36
- package/src/store.ts +121 -426
- package/src/react/useGraphQL.ts +0 -138
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { omit, shouldNeverHappen } from '@livestore/utils';
|
|
2
|
+
import { Schema } from '@livestore/utils/effect';
|
|
3
|
+
import * as otel from '@opentelemetry/api';
|
|
4
|
+
import { SqliteAst, SqliteDsl } from 'effect-db-schema';
|
|
5
|
+
import { isEqual, mapValues } from 'lodash-es';
|
|
6
|
+
import React from 'react';
|
|
7
|
+
import { v4 as uuid } from 'uuid';
|
|
8
|
+
import { labelForKey, tableNameForComponentKey } from '../componentKey.js';
|
|
9
|
+
import { migrateTable } from '../migrations.js';
|
|
10
|
+
import { LiveStoreJSQuery } from '../reactiveQueries/js.js';
|
|
11
|
+
import { LiveStoreSQLQuery } from '../reactiveQueries/sql.js';
|
|
12
|
+
import { SCHEMA_META_TABLE } from '../schema.js';
|
|
13
|
+
import { sql } from '../util.js';
|
|
14
|
+
import { useStore } from './LiveStoreContext.js';
|
|
15
|
+
import { extractStackInfoFromStackTrace, originalStackLimit } from './utils/stack-info.js';
|
|
16
|
+
import { useStateRefWithReactiveInput } from './utils/useStateRefWithReactiveInput.js';
|
|
17
|
+
// type ComponentState = {
|
|
18
|
+
// /** Equivalent to `componentKey.key` */
|
|
19
|
+
// id: string
|
|
20
|
+
// [key: string]: string | number | boolean | null
|
|
21
|
+
// }
|
|
22
|
+
/**
|
|
23
|
+
* This is needed because the `React.useMemo` call below, can sometimes be called multiple times 🤷,
|
|
24
|
+
* so we need to "cache" the fact that we've already started a span for this component.
|
|
25
|
+
* The map entry is being removed again in the `React.useEffect` call below.
|
|
26
|
+
*/
|
|
27
|
+
const spanAlreadyStartedCache = new Map();
|
|
28
|
+
/**
|
|
29
|
+
* Create reactive queries within a component.
|
|
30
|
+
* @param config.queries A function that returns a map of named reactive queries.
|
|
31
|
+
* @param config.componentKey A function that returns a unique key for this component.
|
|
32
|
+
* @param config.reactDeps A list of React-level dependencies that will refresh the queries.
|
|
33
|
+
*/
|
|
34
|
+
export const useComponentState = ({ schema: stateSchema_, componentKey: componentKeyConfig, reactDeps = [], }) => {
|
|
35
|
+
// TODO validate schema to make sure each column has a default value
|
|
36
|
+
// TODO we should clean up the state schema handling to remove this special handling for the `id` column
|
|
37
|
+
const stateSchema = React.useMemo(() => (stateSchema_ ? { ...stateSchema_, columns: omit(stateSchema_.columns, 'id') } : undefined), [stateSchema_]);
|
|
38
|
+
const componentKey = useComponentKey(componentKeyConfig, reactDeps);
|
|
39
|
+
const { store } = useStore();
|
|
40
|
+
const componentKeyLabel = React.useMemo(() => labelForKey(componentKey), [componentKey]);
|
|
41
|
+
const stackInfo = React.useMemo(() => {
|
|
42
|
+
Error.stackTraceLimit = 10;
|
|
43
|
+
// eslint-disable-next-line unicorn/error-message
|
|
44
|
+
const stack = new Error().stack;
|
|
45
|
+
Error.stackTraceLimit = originalStackLimit;
|
|
46
|
+
return extractStackInfoFromStackTrace(stack);
|
|
47
|
+
}, []);
|
|
48
|
+
// The following `React.useMemo` and `React.useEffect` calls are used to start and end a span for the lifetime of this component.
|
|
49
|
+
const { span, otelContext } = React.useMemo(() => {
|
|
50
|
+
const existingSpan = spanAlreadyStartedCache.get(componentKeyLabel);
|
|
51
|
+
if (existingSpan !== undefined)
|
|
52
|
+
return existingSpan;
|
|
53
|
+
const span = store.otel.tracer.startSpan(`LiveStore:useComponentState:${componentKeyLabel}`, { attributes: { stackInfo: JSON.stringify(stackInfo) } }, store.otel.queriesSpanContext);
|
|
54
|
+
const otelContext = otel.trace.setSpan(otel.context.active(), span);
|
|
55
|
+
spanAlreadyStartedCache.set(componentKeyLabel, { span, otelContext });
|
|
56
|
+
return { span, otelContext };
|
|
57
|
+
}, [componentKeyLabel, stackInfo, store.otel.queriesSpanContext, store.otel.tracer]);
|
|
58
|
+
React.useEffect(() => () => {
|
|
59
|
+
spanAlreadyStartedCache.delete(componentKeyLabel);
|
|
60
|
+
span.end();
|
|
61
|
+
}, [componentKeyLabel, span]);
|
|
62
|
+
const defaultComponentState = React.useMemo(() => {
|
|
63
|
+
const defaultState = (stateSchema === undefined ? {} : mapValues(stateSchema.columns, (c) => c.default));
|
|
64
|
+
// @ts-expect-error TODO fix typing
|
|
65
|
+
defaultState.id = componentKeyConfig.id;
|
|
66
|
+
return defaultState;
|
|
67
|
+
}, [componentKeyConfig.id, stateSchema]);
|
|
68
|
+
const componentStateEffectSchema = React.useMemo(() => (stateSchema ? SqliteDsl.structSchemaForTable(stateSchema) : Schema.any), [stateSchema]);
|
|
69
|
+
const state$ = React.useMemo(() => {
|
|
70
|
+
// create state query
|
|
71
|
+
if (stateSchema === undefined) {
|
|
72
|
+
// TODO don't set up a query if there's no state schema (keeps the graph more clean)
|
|
73
|
+
return new LiveStoreJSQuery({
|
|
74
|
+
fn: () => ({}),
|
|
75
|
+
label: 'empty-component-state',
|
|
76
|
+
// otelContext,
|
|
77
|
+
// otelTracer: store.otel.tracer,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
const componentTableName = tableNameForComponentKey(componentKey);
|
|
82
|
+
const whereClause = componentKey._tag === 'singleton' ? '' : `where id = '${componentKey.id}'`;
|
|
83
|
+
// TODO find a better solution for this
|
|
84
|
+
if (store.tableRefs[componentTableName] === undefined) {
|
|
85
|
+
const schemaHash = SqliteAst.hash(stateSchema.ast);
|
|
86
|
+
const res = store.inMemoryDB.select(sql `SELECT schemaHash FROM ${SCHEMA_META_TABLE} WHERE tableName = '${componentTableName}'`);
|
|
87
|
+
if (res.length === 0 || res[0].schemaHash !== schemaHash) {
|
|
88
|
+
migrateTable({ db: store._proxyDb, tableDef: stateSchema.ast, otelContext, schemaHash });
|
|
89
|
+
}
|
|
90
|
+
store.tableRefs[componentTableName] = store.graph.makeRef(null, {
|
|
91
|
+
equal: () => false,
|
|
92
|
+
label: componentTableName,
|
|
93
|
+
meta: { liveStoreRefType: 'table' },
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return (new LiveStoreSQLQuery({
|
|
97
|
+
label: `localState:query:${componentKeyLabel}`,
|
|
98
|
+
genQueryString: () => sql `select * from ${componentTableName} ${whereClause} limit 1`,
|
|
99
|
+
queriedTables: [componentTableName],
|
|
100
|
+
})
|
|
101
|
+
// TODO consider to instead of just returning the default value, to write the default component state to the DB
|
|
102
|
+
.pipe((results) => results.length === 1 ? Schema.parseSync(componentStateEffectSchema)(results[0]) : defaultComponentState));
|
|
103
|
+
}
|
|
104
|
+
}, [
|
|
105
|
+
componentKey,
|
|
106
|
+
componentKeyLabel,
|
|
107
|
+
componentStateEffectSchema,
|
|
108
|
+
defaultComponentState,
|
|
109
|
+
otelContext,
|
|
110
|
+
stateSchema,
|
|
111
|
+
store,
|
|
112
|
+
]);
|
|
113
|
+
// Step 1:
|
|
114
|
+
// Synchronously create state and queries for initial render pass.
|
|
115
|
+
const initialComponentState = React.useMemo(() => state$.run(otelContext, { _tag: 'react', api: 'useComponentState', label: state$.label, stackInfo }), [otelContext, stackInfo, state$]);
|
|
116
|
+
// Now that we've computed the initial state synchronously,
|
|
117
|
+
// we can set up our useState calls w/ a default value populated...
|
|
118
|
+
const [componentStateRef, setComponentState_] = useStateRefWithReactiveInput(initialComponentState);
|
|
119
|
+
const setState = (stateSchema === undefined
|
|
120
|
+
? {}
|
|
121
|
+
: // TODO: do we have a better type for the values that can go in SQLite?
|
|
122
|
+
mapValues(stateSchema.columns, (column, columnName) => (value) => {
|
|
123
|
+
// Don't update the state if it's the same as the value already seen in the component
|
|
124
|
+
// @ts-expect-error TODO fix typing
|
|
125
|
+
if (componentStateRef.current[columnName] === value)
|
|
126
|
+
return;
|
|
127
|
+
const encodedValue = Schema.encodeSync(column.type.codec)(value);
|
|
128
|
+
if (['componentKey', 'columnNames'].includes(columnName)) {
|
|
129
|
+
shouldNeverHappen(`Can't use reserved column name ${columnName}`);
|
|
130
|
+
}
|
|
131
|
+
return store.applyEvent('updateComponentState', {
|
|
132
|
+
componentKey,
|
|
133
|
+
columnNames: [columnName],
|
|
134
|
+
[columnName]: encodedValue,
|
|
135
|
+
});
|
|
136
|
+
}));
|
|
137
|
+
setState.setMany = (columnValues) => {
|
|
138
|
+
// TODO use hashing instead
|
|
139
|
+
// Don't update the state if it's the same as the value already seen in the component
|
|
140
|
+
// @ts-expect-error TODO fix typing
|
|
141
|
+
if (Object.entries(columnValues).every(([columnName, value]) => componentStateRef.current[columnName] === value)) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const columnNames = Object.keys(columnValues);
|
|
145
|
+
return store.applyEvent('updateComponentState', { componentKey, columnNames, ...columnValues });
|
|
146
|
+
};
|
|
147
|
+
// OK, now all the synchronous work is done;
|
|
148
|
+
// time to set up our long-running queries in an effect
|
|
149
|
+
React.useEffect(() => {
|
|
150
|
+
return store.otel.tracer.startActiveSpan('LiveStore:useComponentState:long-running', { attributes: {} }, otelContext, (span) => {
|
|
151
|
+
const unsubs = [];
|
|
152
|
+
const otelContext = otel.trace.setSpan(otel.context.active(), span);
|
|
153
|
+
if (stateSchema !== undefined) {
|
|
154
|
+
insertRowForComponentInstance({ store, componentKey, stateSchema, otelContext });
|
|
155
|
+
}
|
|
156
|
+
state$.activeSubscriptions.add(stackInfo);
|
|
157
|
+
unsubs.push(store.subscribe(state$, (results) => {
|
|
158
|
+
if (isEqual(results, componentStateRef.current) === false) {
|
|
159
|
+
setComponentState_(results);
|
|
160
|
+
}
|
|
161
|
+
}, undefined, { label: `useComponentState:localState:subscribe:${state$.label}`, otelContext }), () => state$.activeSubscriptions.delete(stackInfo));
|
|
162
|
+
return () => {
|
|
163
|
+
for (const unsub of unsubs) {
|
|
164
|
+
unsub();
|
|
165
|
+
}
|
|
166
|
+
span.end();
|
|
167
|
+
};
|
|
168
|
+
});
|
|
169
|
+
}, [
|
|
170
|
+
store,
|
|
171
|
+
stackInfo,
|
|
172
|
+
stateSchema,
|
|
173
|
+
defaultComponentState,
|
|
174
|
+
otelContext,
|
|
175
|
+
componentStateRef,
|
|
176
|
+
state$,
|
|
177
|
+
setComponentState_,
|
|
178
|
+
componentKey,
|
|
179
|
+
]);
|
|
180
|
+
React.useEffect(() => () => state$.destroy(), [state$]);
|
|
181
|
+
const state = componentStateRef.current;
|
|
182
|
+
const useLiveStoreJsonState = (jsonStringKey, parse = (_) => _) => {
|
|
183
|
+
const value = React.useMemo(() => {
|
|
184
|
+
return parse(JSON.parse(state[jsonStringKey]));
|
|
185
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
186
|
+
}, [state[jsonStringKey], parse]);
|
|
187
|
+
const setValue = React.useCallback((newValOrFn) => {
|
|
188
|
+
const newVal = typeof newValOrFn === 'function'
|
|
189
|
+
? // NOTE we're using the ref instead of the value because we want to be sure
|
|
190
|
+
// we're using the latest value when the setter is called
|
|
191
|
+
newValOrFn(parse(JSON.parse(componentStateRef.current[jsonStringKey])))
|
|
192
|
+
: newValOrFn;
|
|
193
|
+
setState[jsonStringKey](JSON.stringify(newVal));
|
|
194
|
+
}, [parse, jsonStringKey]);
|
|
195
|
+
return [value, setValue];
|
|
196
|
+
};
|
|
197
|
+
return {
|
|
198
|
+
state$,
|
|
199
|
+
state,
|
|
200
|
+
setState,
|
|
201
|
+
useLiveStoreJsonState,
|
|
202
|
+
};
|
|
203
|
+
};
|
|
204
|
+
export const useComponentKey = ({ name, id }, deps = []) => React.useMemo(() => {
|
|
205
|
+
switch (id) {
|
|
206
|
+
case 'singleton': {
|
|
207
|
+
return { _tag: 'singleton', componentName: name, id: 'singleton' };
|
|
208
|
+
}
|
|
209
|
+
case '__ephemeral__': {
|
|
210
|
+
return { _tag: 'ephemeral', componentName: name, id: uuid() };
|
|
211
|
+
}
|
|
212
|
+
default: {
|
|
213
|
+
return { _tag: 'custom', componentName: name, id };
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
217
|
+
}, [...deps, id, name]);
|
|
218
|
+
/**
|
|
219
|
+
* Create a row storing the state for a component instance, if none exists yet.
|
|
220
|
+
* Initialized with default values, and keyed on the component key.
|
|
221
|
+
*/
|
|
222
|
+
const insertRowForComponentInstance = ({ store, componentKey, stateSchema, otelContext, }) => {
|
|
223
|
+
const columnNames = ['id', ...Object.keys(stateSchema.columns)];
|
|
224
|
+
const columnValues = columnNames.map((name) => `$${name}`).join(', ');
|
|
225
|
+
const tableName = tableNameForComponentKey(componentKey);
|
|
226
|
+
const insertQuery = sql `insert into ${tableName} (${columnNames.join(', ')}) select ${columnValues} where not exists(select 1 from ${tableName} where id = '${componentKey.id}')`;
|
|
227
|
+
void store.execute(insertQuery, {
|
|
228
|
+
...mapValues(stateSchema.columns, (column) => prepareValueForSql(column.default ?? null)),
|
|
229
|
+
id: componentKey.id,
|
|
230
|
+
}, [tableName], otelContext);
|
|
231
|
+
};
|
|
232
|
+
const prepareValueForSql = (value) => {
|
|
233
|
+
if (typeof value === 'string' || typeof value === 'number' || value === null) {
|
|
234
|
+
return value;
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
return value ? 1 : 0;
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
//# sourceMappingURL=useComponentState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useComponentState.js","sourceRoot":"","sources":["../../src/react/useComponentState.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGlobalQuery.d.ts","sourceRoot":"","sources":["../../src/react/useGlobalQuery.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAGrE,eAAO,MAAM,cAAc,+CAAgD,MAAM,GAAG,CAAC,yBAiCpF,CAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import React, { useEffect, useState } from 'react';
|
|
2
|
+
import { labelForKey } from '../componentKey.js';
|
|
3
|
+
import { useStore } from './LiveStoreContext.js';
|
|
4
|
+
export const useGlobalQuery = (queryDef) => {
|
|
5
|
+
const { store } = useStore();
|
|
6
|
+
const query = React.useMemo(() => queryDef(store), [store, queryDef]);
|
|
7
|
+
// We know the query has a result by the time we use it; so we can synchronously populate a default state
|
|
8
|
+
const [value, setValue] = useState(query.results$.result);
|
|
9
|
+
// Subscribe to future updates for this query
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
return query.store.otel.tracer.startActiveSpan(`LiveStore:useGlobalQuery:${labelForKey(query.componentKey)}:${query.label}`, {}, query.store.otel.queriesSpanContext, (span) => {
|
|
12
|
+
const cancel = query.store.subscribe(query, (v) => {
|
|
13
|
+
// NOTE: we return a reference to the result object within LiveStore;
|
|
14
|
+
// this implies that app code must not mutate the results, or else
|
|
15
|
+
// there may be weird reactivity bugs.
|
|
16
|
+
return setValue(v);
|
|
17
|
+
}, undefined, { label: query.label });
|
|
18
|
+
return () => {
|
|
19
|
+
cancel();
|
|
20
|
+
span.end();
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
}, [query]);
|
|
24
|
+
return value;
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=useGlobalQuery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGlobalQuery.js","sourceRoot":"","sources":["../../src/react/useGlobalQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAElD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAEhD,MAAM,CAAC,MAAM,cAAc,GAAG,CAA2B,QAAkC,EAAkB,EAAE;IAC7G,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,CAAA;IAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAA;IACrE,yGAAyG;IACzG,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAiB,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IAEzE,6CAA6C;IAC7C,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAC5C,4BAA4B,WAAW,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,EAC5E,EAAE,EACF,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,EACnC,CAAC,IAAI,EAAE,EAAE;YACP,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAClC,KAAK,EACL,CAAC,CAAC,EAAE,EAAE;gBACJ,qEAAqE;gBACrE,kEAAkE;gBAClE,sCAAsC;gBACtC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAA;YACpB,CAAC,EACD,SAAS,EACT,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CACvB,CAAA;YACD,OAAO,GAAG,EAAE;gBACV,MAAM,EAAE,CAAA;gBACR,IAAI,CAAC,GAAG,EAAE,CAAA;YACZ,CAAC,CAAA;QACH,CAAC,CACF,CAAA;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;IAEX,OAAO,KAAK,CAAA;AACd,CAAC,CAAA"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';
|
|
2
2
|
import React from 'react';
|
|
3
|
-
import { type ComponentKeyConfig } from './
|
|
4
|
-
export type
|
|
3
|
+
import { type ComponentKeyConfig } from './useComponentState.js';
|
|
4
|
+
export type UseComponentStateProps<TResult extends Record<string, any>, TVariables extends Record<string, any>> = {
|
|
5
5
|
query: DocumentNode<TResult, TVariables>;
|
|
6
6
|
variables: TVariables;
|
|
7
7
|
componentKey: ComponentKeyConfig;
|
|
8
8
|
reactDeps?: React.DependencyList;
|
|
9
9
|
};
|
|
10
10
|
type Variables = Record<string, any>;
|
|
11
|
-
export declare const useGraphQL: <TResult extends Record<string, any>, TVariables extends Variables = {}>({ query, variables, componentKey: componentKeyConfig, reactDeps, }:
|
|
11
|
+
export declare const useGraphQL: <TResult extends Record<string, any>, TVariables extends Variables = {}>({ query: document, variables, componentKey: componentKeyConfig, reactDeps, }: UseComponentStateProps<TResult, TVariables>) => Readonly<TResult>;
|
|
12
12
|
export {};
|
|
13
13
|
//# sourceMappingURL=useGraphQL.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGraphQL.d.ts","sourceRoot":"","sources":["../../src/react/useGraphQL.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useGraphQL.d.ts","sourceRoot":"","sources":["../../src/react/useGraphQL.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,IAAI,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAG1F,OAAO,KAAK,MAAM,OAAO,CAAA;AAKzB,OAAO,EAAE,KAAK,kBAAkB,EAAmB,MAAM,wBAAwB,CAAA;AAGjF,MAAM,MAAM,sBAAsB,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI;IAChH,KAAK,EAAE,YAAY,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;IACxC,SAAS,EAAE,UAAU,CAAA;IACrB,YAAY,EAAE,kBAAkB,CAAA;IAChC,SAAS,CAAC,EAAE,KAAK,CAAC,cAAc,CAAA;CACjC,CAAA;AAED,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AAepC,eAAO,MAAM,UAAU,0NAuGtB,CAAA"}
|
package/dist/react/useGraphQL.js
CHANGED
|
@@ -2,8 +2,9 @@ import * as otel from '@opentelemetry/api';
|
|
|
2
2
|
import { isEqual } from 'lodash-es';
|
|
3
3
|
import React from 'react';
|
|
4
4
|
import { labelForKey } from '../componentKey.js';
|
|
5
|
+
import { queryGraphQL } from '../reactiveQueries/graphql.js';
|
|
5
6
|
import { useStore } from './LiveStoreContext.js';
|
|
6
|
-
import { useComponentKey } from './
|
|
7
|
+
import { useComponentKey } from './useComponentState.js';
|
|
7
8
|
import { useStateRefWithReactiveInput } from './utils/useStateRefWithReactiveInput.js';
|
|
8
9
|
// TODO get rid of the query cache in favour of the new side-effect-free query definition approach https://www.notion.so/schickling/New-query-definition-approach-1097a78ef0e9495bac25f90417374756?pvs=4
|
|
9
10
|
// NOTE we're using a nested map here since we need to resolve 2 levels of object identities (query + variables)
|
|
@@ -16,7 +17,7 @@ import { useStateRefWithReactiveInput } from './utils/useStateRefWithReactiveInp
|
|
|
16
17
|
const spanAlreadyStartedCache = new Map();
|
|
17
18
|
// TODO 1) figure out a way to make `variables` optional if the query doesn't have any variables (probably requires positional args)
|
|
18
19
|
// TODO 2) allow `.pipe` on the resulting query (possibly as a separate optional prop)
|
|
19
|
-
export const useGraphQL = ({ query, variables, componentKey: componentKeyConfig, reactDeps = [], }) => {
|
|
20
|
+
export const useGraphQL = ({ query: document, variables, componentKey: componentKeyConfig, reactDeps = [], }) => {
|
|
20
21
|
const componentKey = useComponentKey(componentKeyConfig, reactDeps);
|
|
21
22
|
const { store } = useStore();
|
|
22
23
|
const componentKeyLabel = React.useMemo(() => labelForKey(componentKey), [componentKey]);
|
|
@@ -34,8 +35,10 @@ export const useGraphQL = ({ query, variables, componentKey: componentKeyConfig,
|
|
|
34
35
|
spanAlreadyStartedCache.delete(componentKeyLabel);
|
|
35
36
|
span.end();
|
|
36
37
|
}, [componentKeyLabel, span]);
|
|
37
|
-
const
|
|
38
|
-
return
|
|
38
|
+
const liveStoreQuery = React.useMemo(() => {
|
|
39
|
+
return queryGraphQL(document, () => variables ?? {}, {
|
|
40
|
+
/* componentKey, */
|
|
41
|
+
});
|
|
39
42
|
// NOTE I had to disable the caching below as still led to many problems
|
|
40
43
|
// We should just implement the new query definition approach instead
|
|
41
44
|
// const queryCacheForQuery = queryCache.get(query)
|
|
@@ -58,10 +61,9 @@ export const useGraphQL = ({ query, variables, componentKey: componentKeyConfig,
|
|
|
58
61
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
59
62
|
[componentKey, store]);
|
|
60
63
|
// TODO get rid of the temporary query workaround
|
|
61
|
-
const initialQueryResults = React.useMemo(() =>
|
|
64
|
+
const initialQueryResults = React.useMemo(() => liveStoreQuery.run(), [liveStoreQuery]);
|
|
62
65
|
const [queryResultsRef, setQueryResults_] = useStateRefWithReactiveInput(initialQueryResults);
|
|
63
66
|
React.useEffect(() => {
|
|
64
|
-
const liveStoreQuery = makeLiveStoreQuery();
|
|
65
67
|
const unsubscribe = store.subscribe(liveStoreQuery, (results) => {
|
|
66
68
|
if (isEqual(results, queryResultsRef.current) === false) {
|
|
67
69
|
setQueryResults_(results);
|
|
@@ -74,12 +76,12 @@ export const useGraphQL = ({ query, variables, componentKey: componentKeyConfig,
|
|
|
74
76
|
// This should probably be improved
|
|
75
77
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
76
78
|
}, [
|
|
77
|
-
|
|
79
|
+
liveStoreQuery,
|
|
78
80
|
// setQueryResults_,
|
|
79
81
|
store,
|
|
80
82
|
]);
|
|
81
83
|
// Very important: remove any queries / other resources associated w/ this component
|
|
82
|
-
React.useEffect(() => () =>
|
|
84
|
+
React.useEffect(() => () => liveStoreQuery.destroy(), [liveStoreQuery]);
|
|
83
85
|
return queryResultsRef.current;
|
|
84
86
|
};
|
|
85
87
|
//# sourceMappingURL=useGraphQL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGraphQL.js","sourceRoot":"","sources":["../../src/react/useGraphQL.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useGraphQL.js","sourceRoot":"","sources":["../../src/react/useGraphQL.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,10 +4,11 @@ import { SqliteDsl } from 'effect-db-schema';
|
|
|
4
4
|
import type { DependencyList } from 'react';
|
|
5
5
|
import React from 'react';
|
|
6
6
|
import type { ComponentKey } from '../componentKey.js';
|
|
7
|
-
import type {
|
|
8
|
-
import type
|
|
9
|
-
import
|
|
10
|
-
import
|
|
7
|
+
import type { GetAtomResult } from '../reactiveQueries/base-class.js';
|
|
8
|
+
import { type LiveStoreGraphQLQuery } from '../reactiveQueries/graphql.js';
|
|
9
|
+
import { LiveStoreJSQuery } from '../reactiveQueries/js.js';
|
|
10
|
+
import { LiveStoreSQLQuery } from '../reactiveQueries/sql.js';
|
|
11
|
+
import type { BaseGraphQLContext, LiveStoreQuery, QueryResult } from '../store.js';
|
|
11
12
|
import type { Bindable } from '../util.js';
|
|
12
13
|
export interface QueryDefinitions {
|
|
13
14
|
[queryName: string]: LiveStoreQuery;
|
|
@@ -22,7 +23,6 @@ type RegisterSubscription = <TQuery extends LiveStoreQuery>(query: TQuery, onNew
|
|
|
22
23
|
type GenQueries<TQueries, TStateResult> = (args: {
|
|
23
24
|
rxSQL: ReactiveSQL;
|
|
24
25
|
rxGraphQL: ReactiveGraphQL;
|
|
25
|
-
rxJS: ReactiveJS;
|
|
26
26
|
state$: LiveStoreJSQuery<TStateResult>;
|
|
27
27
|
/**
|
|
28
28
|
* Registers a subscription.
|
|
@@ -59,7 +59,7 @@ export type GetStateTypeEncoded<TTableDef extends SqliteDsl.TableDefinition<any,
|
|
|
59
59
|
* @param config.componentKey A function that returns a unique key for this component.
|
|
60
60
|
* @param config.reactDeps A list of React-level dependencies that will refresh the queries.
|
|
61
61
|
*/
|
|
62
|
-
export declare const useLiveStoreComponent: <TStateColumns extends ComponentColumns, TQueries extends QueryDefinitions>({ stateSchema: stateSchema_, queries, componentKey: componentKeyConfig, reactDeps, }: UseLiveStoreComponentProps<TQueries, TStateColumns>) => {
|
|
62
|
+
export declare const useLiveStoreComponent: <TStateColumns extends ComponentColumns, TQueries extends QueryDefinitions>({ stateSchema: stateSchema_, queries: queriesDef, componentKey: componentKeyConfig, reactDeps, }: UseLiveStoreComponentProps<TQueries, TStateColumns>) => {
|
|
63
63
|
queryResults: QueryResults<TQueries>;
|
|
64
64
|
state: import("effect-db-schema").PrettifyFlat<import("effect-db-schema").Nullable<Pick<SqliteDsl.FromColumns.RowDecodedAll<TStateColumns>, keyof { [K in keyof TStateColumns as TStateColumns[K] extends SqliteDsl.ColumnDefinition<any, true> ? K : never]: {}; }>> & Omit<SqliteDsl.FromColumns.RowDecodedAll<TStateColumns>, keyof { [K in keyof TStateColumns as TStateColumns[K] extends SqliteDsl.ColumnDefinition<any, true> ? K : never]: {}; }>>;
|
|
65
65
|
setState: Setters<import("effect-db-schema").PrettifyFlat<import("effect-db-schema").Nullable<Pick<SqliteDsl.FromColumns.RowDecodedAll<TStateColumns>, keyof { [K in keyof TStateColumns as TStateColumns[K] extends SqliteDsl.ColumnDefinition<any, true> ? K : never]: {}; }>> & Omit<SqliteDsl.FromColumns.RowDecodedAll<TStateColumns>, keyof { [K in keyof TStateColumns as TStateColumns[K] extends SqliteDsl.ColumnDefinition<any, true> ? K : never]: {}; }>>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLiveStoreComponent.d.ts","sourceRoot":"","sources":["../../src/react/useLiveStoreComponent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,IAAI,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAC1F,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAIlE,OAAO,EAAa,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAGtD,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"useLiveStoreComponent.d.ts","sourceRoot":"","sources":["../../src/react/useLiveStoreComponent.ts"],"names":[],"mappings":"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"}
|