@livestore/livestore 0.0.46-dev.4 → 0.0.47-dev.0
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 +10 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/__tests__/react/fixture.d.ts +28 -12
- package/dist/__tests__/react/fixture.d.ts.map +1 -1
- package/dist/__tests__/react/fixture.js +27 -3
- package/dist/__tests__/react/fixture.js.map +1 -1
- package/dist/__tests__/react/utils/otel.d.ts +10 -0
- package/dist/__tests__/react/utils/otel.d.ts.map +1 -0
- package/dist/__tests__/react/utils/otel.js +42 -0
- package/dist/__tests__/react/utils/otel.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/react/LiveStoreProvider.js +39 -6
- package/dist/react/LiveStoreProvider.js.map +1 -1
- package/dist/react/LiveStoreProvider.test.d.ts +2 -0
- package/dist/react/LiveStoreProvider.test.d.ts.map +1 -0
- package/dist/react/LiveStoreProvider.test.js +40 -0
- package/dist/react/LiveStoreProvider.test.js.map +1 -0
- package/dist/react/components/LiveList.d.ts +21 -0
- package/dist/react/components/LiveList.d.ts.map +1 -0
- package/dist/react/components/LiveList.js +31 -0
- package/dist/react/components/LiveList.js.map +1 -0
- package/dist/react/index.d.ts +1 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +1 -1
- package/dist/react/index.js.map +1 -1
- package/dist/react/useAtom.d.ts +1 -1
- package/dist/react/useAtom.d.ts.map +1 -1
- package/dist/react/useAtom.js +6 -1
- package/dist/react/useAtom.js.map +1 -1
- package/dist/react/useQuery.d.ts +4 -1
- package/dist/react/useQuery.d.ts.map +1 -1
- package/dist/react/useQuery.js +24 -19
- package/dist/react/useQuery.js.map +1 -1
- package/dist/react/useQuery.test.js +11 -11
- package/dist/react/useQuery.test.js.map +1 -1
- package/dist/react/useRow.d.ts.map +1 -1
- package/dist/react/useRow.js +14 -69
- package/dist/react/useRow.js.map +1 -1
- package/dist/react/useRow.test.js +440 -28
- package/dist/react/useRow.test.js.map +1 -1
- package/dist/react/useTemporaryQuery.d.ts +15 -3
- package/dist/react/useTemporaryQuery.d.ts.map +1 -1
- package/dist/react/useTemporaryQuery.js +60 -27
- package/dist/react/useTemporaryQuery.js.map +1 -1
- package/dist/react/useTemporaryQuery.test.js +10 -9
- package/dist/react/useTemporaryQuery.test.js.map +1 -1
- package/dist/reactive.d.ts +23 -5
- package/dist/reactive.d.ts.map +1 -1
- package/dist/reactive.js +44 -11
- package/dist/reactive.js.map +1 -1
- package/dist/reactive.test.js +1 -1
- package/dist/reactive.test.js.map +1 -1
- package/dist/reactiveQueries/base-class.d.ts +1 -1
- package/dist/reactiveQueries/base-class.d.ts.map +1 -1
- package/dist/reactiveQueries/base-class.js.map +1 -1
- package/dist/reactiveQueries/graphql.d.ts +2 -2
- package/dist/reactiveQueries/graphql.d.ts.map +1 -1
- package/dist/reactiveQueries/graphql.js +21 -11
- package/dist/reactiveQueries/graphql.js.map +1 -1
- package/dist/reactiveQueries/sql.d.ts +1 -1
- package/dist/reactiveQueries/sql.d.ts.map +1 -1
- package/dist/reactiveQueries/sql.js +15 -11
- package/dist/reactiveQueries/sql.js.map +1 -1
- package/dist/reactiveQueries/sql.test.js +1 -40
- package/dist/reactiveQueries/sql.test.js.map +1 -1
- package/dist/row-query.d.ts.map +1 -1
- package/dist/row-query.js +3 -1
- package/dist/row-query.js.map +1 -1
- package/dist/store.d.ts +7 -5
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +50 -38
- package/dist/store.js.map +1 -1
- package/package.json +11 -13
- package/src/__tests__/react/fixture.tsx +35 -2
- package/src/__tests__/react/utils/otel.ts +61 -0
- package/src/index.ts +12 -1
- package/src/react/LiveStoreProvider.test.tsx +63 -0
- package/src/react/LiveStoreProvider.tsx +42 -7
- package/src/react/components/LiveList.tsx +84 -0
- package/src/react/index.ts +1 -1
- package/src/react/useAtom.ts +6 -2
- package/src/react/useQuery.test.tsx +11 -11
- package/src/react/useQuery.ts +29 -22
- package/src/react/useRow.test.tsx +502 -30
- package/src/react/useRow.ts +19 -107
- package/src/react/useTemporaryQuery.test.tsx +17 -16
- package/src/react/useTemporaryQuery.ts +96 -28
- package/src/reactive.test.ts +1 -1
- package/src/reactive.ts +76 -15
- package/src/reactiveQueries/base-class.ts +2 -1
- package/src/reactiveQueries/graphql.ts +26 -16
- package/src/reactiveQueries/sql.test.ts +1 -54
- package/src/reactiveQueries/sql.ts +20 -14
- package/src/row-query.ts +3 -1
- package/src/store.ts +71 -49
- package/tsconfig.json +0 -1
- package/dist/react/components/DiffableList.d.ts +0 -20
- package/dist/react/components/DiffableList.d.ts.map +0 -1
- package/dist/react/components/DiffableList.js +0 -113
- package/dist/react/components/DiffableList.js.map +0 -1
- package/dist/react/utils/useCleanup.d.ts +0 -7
- package/dist/react/utils/useCleanup.d.ts.map +0 -1
- package/dist/react/utils/useCleanup.js +0 -19
- package/dist/react/utils/useCleanup.js.map +0 -1
- package/src/react/components/DiffableList.tsx +0 -192
- package/src/react/utils/useCleanup.ts +0 -25
package/src/react/useQuery.ts
CHANGED
|
@@ -7,6 +7,11 @@ import { useStore } from './LiveStoreContext.js'
|
|
|
7
7
|
import { extractStackInfoFromStackTrace, originalStackLimit } from './utils/stack-info.js'
|
|
8
8
|
import { useStateRefWithReactiveInput } from './utils/useStateRefWithReactiveInput.js'
|
|
9
9
|
|
|
10
|
+
/**
|
|
11
|
+
* NOTE Some folks have suggested to use `React.useSyncExternalStore`, however, it's not doing anything special
|
|
12
|
+
* for what's needed here, so we handle everything manually.
|
|
13
|
+
*/
|
|
14
|
+
|
|
10
15
|
/**
|
|
11
16
|
* This is needed because the `React.useMemo` call below, can sometimes be called multiple times 🤷,
|
|
12
17
|
* so we need to "cache" the fact that we've already started a span for this component.
|
|
@@ -16,13 +21,16 @@ const spanAlreadyStartedCache = new Map<LiveQueryAny, { span: otel.Span; otelCon
|
|
|
16
21
|
|
|
17
22
|
export const useQuery = <TQuery extends LiveQueryAny>(query: TQuery): GetResult<TQuery> => useQueryRef(query).current
|
|
18
23
|
|
|
24
|
+
/**
|
|
25
|
+
*
|
|
26
|
+
*/
|
|
19
27
|
export const useQueryRef = <TQuery extends LiveQueryAny>(
|
|
20
|
-
query
|
|
28
|
+
query$: TQuery,
|
|
21
29
|
parentOtelContext?: otel.Context,
|
|
22
30
|
): React.MutableRefObject<GetResult<TQuery>> => {
|
|
23
31
|
const { store } = useStore()
|
|
24
32
|
|
|
25
|
-
React.useDebugValue(`LiveStore:useQuery:${query
|
|
33
|
+
React.useDebugValue(`LiveStore:useQuery:${query$.id}:${query$.label}`)
|
|
26
34
|
|
|
27
35
|
const stackInfo = React.useMemo(() => {
|
|
28
36
|
Error.stackTraceLimit = 10
|
|
@@ -34,31 +42,31 @@ export const useQueryRef = <TQuery extends LiveQueryAny>(
|
|
|
34
42
|
|
|
35
43
|
// The following `React.useMemo` and `React.useEffect` calls are used to start and end a span for the lifetime of this component.
|
|
36
44
|
const { span, otelContext } = React.useMemo(() => {
|
|
37
|
-
const existingSpan = spanAlreadyStartedCache.get(query)
|
|
45
|
+
const existingSpan = spanAlreadyStartedCache.get(query$)
|
|
38
46
|
if (existingSpan !== undefined) return existingSpan
|
|
39
47
|
|
|
40
48
|
const span = store.otel.tracer.startSpan(
|
|
41
|
-
`LiveStore:useQuery:${query
|
|
42
|
-
{ attributes: { label: query
|
|
49
|
+
`LiveStore:useQuery:${query$.label}`,
|
|
50
|
+
{ attributes: { label: query$.label, stackInfo: JSON.stringify(stackInfo) } },
|
|
43
51
|
parentOtelContext ?? store.otel.queriesSpanContext,
|
|
44
52
|
)
|
|
45
53
|
|
|
46
54
|
const otelContext = otel.trace.setSpan(otel.context.active(), span)
|
|
47
55
|
|
|
48
|
-
spanAlreadyStartedCache.set(query
|
|
56
|
+
spanAlreadyStartedCache.set(query$, { span, otelContext })
|
|
49
57
|
|
|
50
58
|
return { span, otelContext }
|
|
51
|
-
}, [parentOtelContext, query
|
|
59
|
+
}, [parentOtelContext, query$, stackInfo, store.otel.queriesSpanContext, store.otel.tracer])
|
|
52
60
|
|
|
53
61
|
const initialResult = React.useMemo(
|
|
54
62
|
() =>
|
|
55
|
-
query
|
|
63
|
+
query$.run(otelContext, {
|
|
56
64
|
_tag: 'react',
|
|
57
65
|
api: 'useQuery',
|
|
58
|
-
label: query
|
|
66
|
+
label: query$.label,
|
|
59
67
|
stackInfo,
|
|
60
68
|
}),
|
|
61
|
-
[otelContext, query
|
|
69
|
+
[otelContext, query$, stackInfo],
|
|
62
70
|
)
|
|
63
71
|
|
|
64
72
|
// We know the query has a result by the time we use it; so we can synchronously populate a default state
|
|
@@ -66,17 +74,18 @@ export const useQueryRef = <TQuery extends LiveQueryAny>(
|
|
|
66
74
|
|
|
67
75
|
React.useEffect(
|
|
68
76
|
() => () => {
|
|
69
|
-
spanAlreadyStartedCache.delete(query)
|
|
77
|
+
spanAlreadyStartedCache.delete(query$)
|
|
70
78
|
span.end()
|
|
71
79
|
},
|
|
72
|
-
[query
|
|
80
|
+
[query$, span],
|
|
73
81
|
)
|
|
74
82
|
|
|
75
83
|
// Subscribe to future updates for this query
|
|
76
84
|
React.useEffect(() => {
|
|
77
|
-
query
|
|
78
|
-
|
|
79
|
-
|
|
85
|
+
query$.activeSubscriptions.add(stackInfo)
|
|
86
|
+
|
|
87
|
+
return store.subscribe(
|
|
88
|
+
query$,
|
|
80
89
|
(newValue) => {
|
|
81
90
|
// NOTE: we return a reference to the result object within LiveStore;
|
|
82
91
|
// this implies that app code must not mutate the results, or else
|
|
@@ -85,14 +94,12 @@ export const useQueryRef = <TQuery extends LiveQueryAny>(
|
|
|
85
94
|
setValue(newValue)
|
|
86
95
|
}
|
|
87
96
|
},
|
|
88
|
-
|
|
89
|
-
|
|
97
|
+
() => {
|
|
98
|
+
query$.activeSubscriptions.delete(stackInfo)
|
|
99
|
+
},
|
|
100
|
+
{ label: query$.label, otelContext },
|
|
90
101
|
)
|
|
91
|
-
|
|
92
|
-
query.activeSubscriptions.delete(stackInfo)
|
|
93
|
-
unsubFromStore()
|
|
94
|
-
}
|
|
95
|
-
}, [stackInfo, query, setValue, store, valueRef, otelContext, span])
|
|
102
|
+
}, [stackInfo, query$, setValue, store, valueRef, otelContext, span])
|
|
96
103
|
|
|
97
104
|
return valueRef
|
|
98
105
|
}
|