@livestore/livestore 0.0.46-dev.4 → 0.0.46
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 +18 -2
- 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 +51 -0
- package/dist/react/LiveStoreProvider.test.js.map +1 -0
- package/dist/react/components/DiffableList copy.d.ts +19 -0
- package/dist/react/components/DiffableList copy.d.ts.map +1 -0
- package/dist/react/components/DiffableList copy.js +62 -0
- package/dist/react/components/DiffableList copy.js.map +1 -0
- package/dist/react/components/DiffableList.d.ts +2 -9
- package/dist/react/components/DiffableList.d.ts.map +1 -1
- package/dist/react/components/DiffableList.js +10 -102
- package/dist/react/components/DiffableList.js.map +1 -1
- package/dist/react/components/DiffableList2.d.ts +20 -0
- package/dist/react/components/DiffableList2.d.ts.map +1 -0
- package/dist/react/components/DiffableList2.js +119 -0
- package/dist/react/components/DiffableList2.js.map +1 -0
- package/dist/react/components/DiffableList3.d.ts +19 -0
- package/dist/react/components/DiffableList3.d.ts.map +1 -0
- package/dist/react/components/DiffableList3.js +62 -0
- package/dist/react/components/DiffableList3.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.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/useRowOld.d.ts +40 -0
- package/dist/react/useRowOld.d.ts.map +1 -0
- package/dist/react/useRowOld.js +134 -0
- package/dist/react/useRowOld.js.map +1 -0
- 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 +16 -10
- 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/store.d.ts +2 -2
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +10 -7
- package/dist/store.js.map +1 -1
- package/package.json +6 -8
- 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 +82 -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 +1 -1
- 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 +21 -15
- package/src/reactiveQueries/sql.test.ts +1 -54
- package/src/reactiveQueries/sql.ts +20 -14
- package/src/store.ts +12 -8
- package/tsconfig.json +0 -1
- package/src/react/components/DiffableList.tsx +0 -192
- package/src/react/utils/useCleanup.ts +0 -25
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { DbSchema } from '@livestore/common/schema';
|
|
2
|
+
import * as otel from '@opentelemetry/api';
|
|
3
|
+
import { mapValues } from 'lodash-es';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import { mutationForQueryInfo } from '../query-info.js';
|
|
6
|
+
import { rowQuery } from '../row-query.js';
|
|
7
|
+
import { useStore } from './LiveStoreContext.js';
|
|
8
|
+
import { useQueryRef } from './useQuery.js';
|
|
9
|
+
import { useCleanup } from './utils/useCleanup.js';
|
|
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
|
+
* If the table is a singleton table, `useRow` can be called without an `id` argument. Otherwise, the `id` argument is required.
|
|
18
|
+
*/
|
|
19
|
+
export const useRow = (table, idOrOptions, options_) => {
|
|
20
|
+
const sqliteTableDef = table.sqliteDef;
|
|
21
|
+
const id = typeof idOrOptions === 'string' ? idOrOptions : undefined;
|
|
22
|
+
const options = typeof idOrOptions === 'string' ? options_ : idOrOptions;
|
|
23
|
+
const { defaultValues, dbGraph } = options ?? {};
|
|
24
|
+
const { store } = useStore();
|
|
25
|
+
console.debug('useRow', table.sqliteDef.name, id);
|
|
26
|
+
// NOTE It's important to run the cleanup before the `useMemo` below for React Strict / HMR mode to work correctly
|
|
27
|
+
useCleanup(React.useCallback(() => {
|
|
28
|
+
const cachedItem = rcCache.get(table, id ?? 'singleton');
|
|
29
|
+
cachedItem.rc--;
|
|
30
|
+
if (cachedItem.rc === 0) {
|
|
31
|
+
rcCache.delete(cachedItem.query$);
|
|
32
|
+
console.log('useRow cleanup', cachedItem.query$.label);
|
|
33
|
+
cachedItem.query$.destroy();
|
|
34
|
+
cachedItem.span.end();
|
|
35
|
+
}
|
|
36
|
+
}, [table, id]));
|
|
37
|
+
const { query$, otelContext } = React.useMemo(() => {
|
|
38
|
+
const cachedItem = rcCache.get(table, id ?? 'singleton');
|
|
39
|
+
if (cachedItem !== undefined) {
|
|
40
|
+
cachedItem.rc++;
|
|
41
|
+
cachedItem.span.addEvent('new-subscriber');
|
|
42
|
+
return {
|
|
43
|
+
query$: cachedItem.query$,
|
|
44
|
+
otelContext: cachedItem.otelContext,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const span = store.otel.tracer.startSpan(`LiveStore:useRow:${table.sqliteDef.name}${id === undefined ? '' : `:${id}`}`, { attributes: { id } }, store.otel.queriesSpanContext);
|
|
48
|
+
const otelContext = otel.trace.setSpan(otel.context.active(), span);
|
|
49
|
+
const query$ = DbSchema.tableIsSingleton(table)
|
|
50
|
+
? rowQuery(table, { otelContext, dbGraph })
|
|
51
|
+
: rowQuery(table, id, {
|
|
52
|
+
otelContext,
|
|
53
|
+
defaultValues: defaultValues,
|
|
54
|
+
dbGraph,
|
|
55
|
+
});
|
|
56
|
+
rcCache.set(table, id ?? 'singleton', query$, otelContext, span);
|
|
57
|
+
return { query$, otelContext };
|
|
58
|
+
}, [table, id, store, defaultValues, dbGraph]);
|
|
59
|
+
const query$Ref = useQueryRef(query$, otelContext);
|
|
60
|
+
const setState = React.useMemo(() => {
|
|
61
|
+
if (table.isSingleColumn) {
|
|
62
|
+
return (newValueOrFn) => {
|
|
63
|
+
const newValue = typeof newValueOrFn === 'function' ? newValueOrFn(query$Ref.current) : newValueOrFn;
|
|
64
|
+
if (query$Ref.current === newValue)
|
|
65
|
+
return;
|
|
66
|
+
store.mutate(mutationForQueryInfo(query$.queryInfo, { value: newValue }));
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
const setState = // TODO: do we have a better type for the values that can go in SQLite?
|
|
71
|
+
mapValues(sqliteTableDef.columns, (column, columnName) => (newValueOrFn) => {
|
|
72
|
+
const newValue =
|
|
73
|
+
// @ts-expect-error TODO fix typing
|
|
74
|
+
typeof newValueOrFn === 'function' ? newValueOrFn(query$Ref.current[columnName]) : newValueOrFn;
|
|
75
|
+
// Don't update the state if it's the same as the value already seen in the component
|
|
76
|
+
// @ts-expect-error TODO fix typing
|
|
77
|
+
if (query$Ref.current[columnName] === newValue)
|
|
78
|
+
return;
|
|
79
|
+
store.mutate(mutationForQueryInfo(query$.queryInfo, { [columnName]: newValue }));
|
|
80
|
+
});
|
|
81
|
+
setState.setMany = (columnValuesOrFn) => {
|
|
82
|
+
const columnValues =
|
|
83
|
+
// @ts-expect-error TODO fix typing
|
|
84
|
+
typeof columnValuesOrFn === 'function' ? columnValuesOrFn(query$Ref.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]) => query$Ref.current[columnName] === value)) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
store.mutate(mutationForQueryInfo(query$.queryInfo, columnValues));
|
|
93
|
+
};
|
|
94
|
+
return setState;
|
|
95
|
+
}
|
|
96
|
+
}, [query$.queryInfo, query$Ref, sqliteTableDef.columns, store, table.isSingleColumn]);
|
|
97
|
+
return [query$Ref.current, setState, query$];
|
|
98
|
+
};
|
|
99
|
+
/** Reference counted cache for `query$` and otel context */
|
|
100
|
+
class RCCache {
|
|
101
|
+
cache = new Map();
|
|
102
|
+
reverseCache = new Map();
|
|
103
|
+
get = (table, id) => {
|
|
104
|
+
const queries = this.cache.get(table);
|
|
105
|
+
if (queries === undefined)
|
|
106
|
+
return undefined;
|
|
107
|
+
return queries.get(id);
|
|
108
|
+
};
|
|
109
|
+
set = (table, id, query$, otelContext, span) => {
|
|
110
|
+
let queries = this.cache.get(table);
|
|
111
|
+
if (queries === undefined) {
|
|
112
|
+
queries = new Map();
|
|
113
|
+
this.cache.set(table, queries);
|
|
114
|
+
}
|
|
115
|
+
queries.set(id, { query$, otelContext, span, rc: 1 });
|
|
116
|
+
this.reverseCache.set(query$, [table, id]);
|
|
117
|
+
};
|
|
118
|
+
delete = (query$) => {
|
|
119
|
+
const item = this.reverseCache.get(query$);
|
|
120
|
+
if (item === undefined)
|
|
121
|
+
return;
|
|
122
|
+
const [table, id] = item;
|
|
123
|
+
const queries = this.cache.get(table);
|
|
124
|
+
if (queries === undefined)
|
|
125
|
+
return;
|
|
126
|
+
queries.delete(id);
|
|
127
|
+
if (queries.size === 0) {
|
|
128
|
+
this.cache.delete(table);
|
|
129
|
+
}
|
|
130
|
+
this.reverseCache.delete(query$);
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
const rcCache = new RCCache();
|
|
134
|
+
//# sourceMappingURL=useRowOld.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRowOld.js","sourceRoot":"","sources":["../../src/react/useRowOld.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,22 @@
|
|
|
1
|
+
import * as otel from '@opentelemetry/api';
|
|
1
2
|
import React from 'react';
|
|
3
|
+
import type { QueryInfo } from '../query-info.js';
|
|
2
4
|
import type { LiveQuery } from '../reactiveQueries/base-class.js';
|
|
5
|
+
export type DepKey = string | number | ReadonlyArray<string | number>;
|
|
3
6
|
/**
|
|
4
7
|
* Creates a query, subscribes and destroys it when the component unmounts.
|
|
5
8
|
*
|
|
6
|
-
*
|
|
9
|
+
* The `key` is used to determine whether the a new query should be created or if the existing one should be reused.
|
|
7
10
|
*/
|
|
8
|
-
export declare const useTemporaryQuery: <TResult>(makeQuery: () => LiveQuery<TResult
|
|
9
|
-
export declare const useTemporaryQueryRef: <TResult>(makeQuery: () => LiveQuery<TResult
|
|
11
|
+
export declare const useTemporaryQuery: <TResult>(makeQuery: () => LiveQuery<TResult>, key: DepKey) => TResult;
|
|
12
|
+
export declare const useTemporaryQueryRef: <TResult>(makeQuery: () => LiveQuery<TResult>, key: DepKey) => React.MutableRefObject<TResult>;
|
|
13
|
+
export declare const useMakeTemporaryQuery: <TResult, TQueryInfo extends QueryInfo>(makeQuery: (otelContext: otel.Context) => LiveQuery<TResult, TQueryInfo>, key: DepKey, options?: {
|
|
14
|
+
otel?: {
|
|
15
|
+
spanName?: string;
|
|
16
|
+
attributes?: otel.Attributes;
|
|
17
|
+
};
|
|
18
|
+
}) => {
|
|
19
|
+
query$: LiveQuery<TResult, TQueryInfo>;
|
|
20
|
+
otelContext: otel.Context;
|
|
21
|
+
};
|
|
10
22
|
//# sourceMappingURL=useTemporaryQuery.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTemporaryQuery.d.ts","sourceRoot":"","sources":["../../src/react/useTemporaryQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAA;
|
|
1
|
+
{"version":3,"file":"useTemporaryQuery.d.ts","sourceRoot":"","sources":["../../src/react/useTemporaryQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC1C,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAA;AAkBjE,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,CAAA;AAErE;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,uBAAwB,MAAM,UAAU,OAAO,CAAC,OAAO,MAAM,KAAG,OAChD,CAAA;AAE9C,eAAO,MAAM,oBAAoB,uBACpB,MAAM,UAAU,OAAO,CAAC,OAC9B,MAAM,KACV,MAAM,gBAAgB,CAAC,OAAO,CAIhC,CAAA;AAED,eAAO,MAAM,qBAAqB,mEACP,KAAK,OAAO,KAAK,UAAU,OAAO,EAAE,UAAU,CAAC,OACnE,MAAM,YACD;IACR,IAAI,CAAC,EAAE;QACL,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,UAAU,CAAC,EAAE,KAAK,UAAU,CAAA;KAC7B,CAAA;CACF;YACU,UAAU,OAAO,EAAE,UAAU,CAAC;iBAAe,KAAK,OAAO;CAsErE,CAAA"}
|
|
@@ -1,37 +1,70 @@
|
|
|
1
|
+
import * as otel from '@opentelemetry/api';
|
|
1
2
|
import React from 'react';
|
|
3
|
+
import { useStore } from './LiveStoreContext.js';
|
|
2
4
|
import { useQueryRef } from './useQuery.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const queryCache = new Map();
|
|
5
|
+
// NOTE Given `useMemo` will be called multiple times (e.g. when using React Strict mode or Fast Refresh),
|
|
6
|
+
// we are using this cache to avoid starting multiple queries/spans for the same component.
|
|
7
|
+
// This is somewhat against some recommended React best practices, but it should be fine in our case below.
|
|
8
|
+
// Please definitely open an issue if you see or run into any problems with this approach!
|
|
9
|
+
const cache = new Map();
|
|
9
10
|
/**
|
|
10
11
|
* Creates a query, subscribes and destroys it when the component unmounts.
|
|
11
12
|
*
|
|
12
|
-
*
|
|
13
|
+
* The `key` is used to determine whether the a new query should be created or if the existing one should be reused.
|
|
13
14
|
*/
|
|
14
|
-
export const useTemporaryQuery = (makeQuery) => useTemporaryQueryRef(makeQuery).current;
|
|
15
|
-
export const useTemporaryQueryRef = (makeQuery) => {
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
15
|
+
export const useTemporaryQuery = (makeQuery, key) => useTemporaryQueryRef(makeQuery, key).current;
|
|
16
|
+
export const useTemporaryQueryRef = (makeQuery, key) => {
|
|
17
|
+
const { query$ } = useMakeTemporaryQuery(makeQuery, key);
|
|
18
|
+
return useQueryRef(query$);
|
|
19
|
+
};
|
|
20
|
+
export const useMakeTemporaryQuery = (makeQuery, key, options) => {
|
|
21
|
+
const { store } = useStore();
|
|
22
|
+
const fullKey = React.useMemo(
|
|
23
|
+
// NOTE We're using the `makeQuery` function body string to make sure the key is unique across the app
|
|
24
|
+
// TODO we should figure out whether this could cause some problems and/or if there's a better way to do this
|
|
25
|
+
() => (Array.isArray(key) ? key.join('-') : key) + '-' + store.graph.id + '-' + makeQuery.toString(), [key, makeQuery, store.graph.id]);
|
|
26
|
+
const fullKeyRef = React.useRef();
|
|
27
|
+
const { query$, otelContext } = React.useMemo(() => {
|
|
28
|
+
if (fullKeyRef.current !== undefined && fullKeyRef.current !== fullKey) {
|
|
29
|
+
// console.debug('fullKey changed, destroying previous', fullKeyRef.current.split('-')[0]!, fullKey.split('-')[0]!)
|
|
30
|
+
const cachedItem = cache.get(fullKeyRef.current);
|
|
31
|
+
if (cachedItem !== undefined) {
|
|
32
|
+
cachedItem.rc--;
|
|
33
|
+
if (cachedItem.rc === 0) {
|
|
34
|
+
cachedItem.query$.destroy();
|
|
35
|
+
cachedItem.span.end();
|
|
36
|
+
cache.delete(fullKeyRef.current);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
22
39
|
}
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
useCleanup(React.useCallback(() => {
|
|
28
|
-
const cachedItem = queryCache.get(makeQuery);
|
|
29
|
-
cachedItem.reactIds.delete(reactId);
|
|
30
|
-
if (cachedItem.reactIds.size === 0) {
|
|
31
|
-
cachedItem.query$.destroy();
|
|
32
|
-
queryCache.delete(makeQuery);
|
|
40
|
+
const cachedItem = cache.get(fullKey);
|
|
41
|
+
if (cachedItem !== undefined) {
|
|
42
|
+
cachedItem.rc++;
|
|
43
|
+
return cachedItem;
|
|
33
44
|
}
|
|
34
|
-
|
|
35
|
-
|
|
45
|
+
const spanName = options?.otel?.spanName ?? `LiveStore:useTemporaryQuery:${key}`;
|
|
46
|
+
const span = store.otel.tracer.startSpan(spanName, { attributes: options?.otel?.attributes }, store.otel.queriesSpanContext);
|
|
47
|
+
const otelContext = otel.trace.setSpan(otel.context.active(), span);
|
|
48
|
+
const query$ = makeQuery(otelContext);
|
|
49
|
+
cache.set(fullKey, { rc: 1, query$, span, otelContext });
|
|
50
|
+
return { query$, otelContext };
|
|
51
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
52
|
+
}, [fullKey]);
|
|
53
|
+
fullKeyRef.current = fullKey;
|
|
54
|
+
React.useEffect(() => {
|
|
55
|
+
return () => {
|
|
56
|
+
const cachedItem = cache.get(fullKey);
|
|
57
|
+
// NOTE in case the fullKey changed then the query was already destroyed in the useMemo above
|
|
58
|
+
if (cachedItem === undefined)
|
|
59
|
+
return;
|
|
60
|
+
cachedItem.rc--;
|
|
61
|
+
if (cachedItem.rc === 0) {
|
|
62
|
+
cachedItem.query$.destroy();
|
|
63
|
+
cachedItem.span.end();
|
|
64
|
+
cache.delete(fullKey);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
}, [fullKey]);
|
|
68
|
+
return { query$, otelContext };
|
|
36
69
|
};
|
|
37
70
|
//# sourceMappingURL=useTemporaryQuery.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTemporaryQuery.js","sourceRoot":"","sources":["../../src/react/useTemporaryQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"useTemporaryQuery.js","sourceRoot":"","sources":["../../src/react/useTemporaryQuery.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,33 +1,34 @@
|
|
|
1
1
|
import { renderHook } from '@testing-library/react';
|
|
2
|
-
import React from 'react';
|
|
3
2
|
import { describe, expect, it } from 'vitest';
|
|
4
3
|
import { makeTodoMvc, parseTodos } from '../__tests__/react/fixture.js';
|
|
5
4
|
import { querySQL } from '../reactiveQueries/sql.js';
|
|
6
5
|
import * as LiveStoreReact from './index.js';
|
|
7
6
|
describe('useTemporaryQuery', () => {
|
|
8
7
|
it('simple', async () => {
|
|
9
|
-
|
|
10
|
-
const
|
|
8
|
+
const { wrapper, store, cud, makeRenderCount } = await makeTodoMvc();
|
|
9
|
+
const renderCount = makeRenderCount();
|
|
11
10
|
store.mutate(cud.todos.insert({ id: 't1', text: 'buy milk', completed: false }), cud.todos.insert({ id: 't2', text: 'buy bread', completed: false }));
|
|
12
11
|
const queryMap = new Map();
|
|
13
|
-
const { rerender, result } = renderHook((id) => {
|
|
14
|
-
renderCount
|
|
15
|
-
return LiveStoreReact.useTemporaryQuery(
|
|
12
|
+
const { rerender, result, unmount } = renderHook((id) => {
|
|
13
|
+
renderCount.inc();
|
|
14
|
+
return LiveStoreReact.useTemporaryQuery(() => {
|
|
16
15
|
const query$ = querySQL(`select * from todos where id = '${id}'`, { map: parseTodos });
|
|
17
16
|
queryMap.set(id, query$);
|
|
18
17
|
return query$;
|
|
19
|
-
},
|
|
18
|
+
}, id);
|
|
20
19
|
}, { wrapper, initialProps: 't1' });
|
|
21
20
|
expect(result.current.length).toBe(1);
|
|
22
21
|
expect(result.current[0].text).toBe('buy milk');
|
|
23
|
-
expect(renderCount).toBe(1);
|
|
22
|
+
expect(renderCount.val).toBe(1);
|
|
24
23
|
expect(queryMap.get('t1').runs).toBe(1);
|
|
25
24
|
rerender('t2');
|
|
26
25
|
expect(result.current.length).toBe(1);
|
|
27
26
|
expect(result.current[0].text).toBe('buy bread');
|
|
28
|
-
expect(renderCount).toBe(2);
|
|
27
|
+
expect(renderCount.val).toBe(2);
|
|
29
28
|
expect(queryMap.get('t1').runs).toBe(1);
|
|
30
29
|
expect(queryMap.get('t2').runs).toBe(1);
|
|
30
|
+
unmount();
|
|
31
|
+
expect(queryMap.get('t2').runs).toBe(1);
|
|
31
32
|
});
|
|
32
33
|
});
|
|
33
34
|
//# sourceMappingURL=useTemporaryQuery.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTemporaryQuery.test.js","sourceRoot":"","sources":["../../src/react/useTemporaryQuery.test.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,
|
|
1
|
+
{"version":3,"file":"useTemporaryQuery.test.js","sourceRoot":"","sources":["../../src/react/useTemporaryQuery.test.tsx"],"names":[],"mappings":"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"}
|
package/dist/reactive.d.ts
CHANGED
|
@@ -46,6 +46,7 @@ export type Effect = {
|
|
|
46
46
|
invocations: number;
|
|
47
47
|
};
|
|
48
48
|
export type Node<T, TContext, TDebugRefreshReason extends DebugRefreshReason> = Atom<T, TContext, TDebugRefreshReason> | Effect;
|
|
49
|
+
export declare const isThunk: <T, TContext, TDebugRefreshReason extends DebugRefreshReason<string>>(obj: unknown) => obj is Thunk<T, TContext, TDebugRefreshReason>;
|
|
49
50
|
export type DebugThunkInfo<T extends string = string> = {
|
|
50
51
|
_tag: T;
|
|
51
52
|
durationMs: number;
|
|
@@ -84,14 +85,29 @@ export type RefreshDebugInfo<TDebugRefreshReason extends DebugRefreshReason, TDe
|
|
|
84
85
|
completedTimestamp: number;
|
|
85
86
|
graphSnapshot: ReactiveGraphSnapshot;
|
|
86
87
|
};
|
|
87
|
-
export type
|
|
88
|
+
export type EncodedOption<A> = {
|
|
89
|
+
_tag: 'Some';
|
|
90
|
+
value?: A;
|
|
91
|
+
} | {
|
|
92
|
+
_tag: 'None';
|
|
93
|
+
};
|
|
94
|
+
export type SerializedAtom = SerializedRef | SerializedThunk;
|
|
95
|
+
export type SerializedRef = Readonly<PrettifyFlat<Pick<Ref<unknown, unknown, any>, '_tag' | 'id' | 'label' | 'meta' | 'isDirty' | 'isDestroyed' | 'refreshes'> & {
|
|
96
|
+
/** Is `None` if `getSnapshot` was called with `includeResults: false` which is the default */
|
|
97
|
+
previousResult: EncodedOption<string>;
|
|
98
|
+
sub: ReadonlyArray<string>;
|
|
99
|
+
super: ReadonlyArray<string>;
|
|
100
|
+
}>>;
|
|
101
|
+
export type SerializedThunk = Readonly<PrettifyFlat<Pick<Thunk<unknown, unknown, any>, '_tag' | 'id' | 'label' | 'meta' | 'isDirty' | 'isDestroyed' | 'recomputations'> & {
|
|
102
|
+
/** Is `None` if `getSnapshot` was called with `includeResults: false` which is the default */
|
|
103
|
+
previousResult: EncodedOption<string>;
|
|
88
104
|
sub: ReadonlyArray<string>;
|
|
89
105
|
super: ReadonlyArray<string>;
|
|
90
106
|
}>>;
|
|
91
|
-
export type SerializedEffect = Readonly<PrettifyFlat<Pick<Effect, '_tag' | 'id' | 'label'> & {
|
|
107
|
+
export type SerializedEffect = Readonly<PrettifyFlat<Pick<Effect, '_tag' | 'id' | 'label' | 'invocations' | 'isDestroyed'> & {
|
|
92
108
|
sub: ReadonlyArray<string>;
|
|
93
109
|
}>>;
|
|
94
|
-
type ReactiveGraphSnapshot = {
|
|
110
|
+
export type ReactiveGraphSnapshot = {
|
|
95
111
|
readonly atoms: ReadonlyArray<SerializedAtom>;
|
|
96
112
|
readonly effects: ReadonlyArray<SerializedEffect>;
|
|
97
113
|
/** IDs of deferred effects */
|
|
@@ -138,11 +154,13 @@ export declare class ReactiveGraph<TDebugRefreshReason extends DebugRefreshReaso
|
|
|
138
154
|
debugRefreshReason?: TDebugRefreshReason;
|
|
139
155
|
otelContext?: otel.Context;
|
|
140
156
|
}) => void;
|
|
157
|
+
runRefreshCallbacks: () => void;
|
|
141
158
|
addEdge(superComp: Thunk<any, TContext, TDebugRefreshReason> | Effect, subComp: Atom<any, TContext, TDebugRefreshReason>): void;
|
|
142
159
|
removeEdge(superComp: Thunk<any, TContext, TDebugRefreshReason> | Effect, subComp: Atom<any, TContext, TDebugRefreshReason>): void;
|
|
143
|
-
getSnapshot: (
|
|
160
|
+
getSnapshot: (opts?: {
|
|
161
|
+
includeResults: boolean;
|
|
162
|
+
}) => ReactiveGraphSnapshot;
|
|
144
163
|
subscribeToRefresh: (cb: () => void) => () => void;
|
|
145
164
|
}
|
|
146
165
|
export declare const throwContextNotSetError: (graph: ReactiveGraph<any, any, any>) => never;
|
|
147
|
-
export {};
|
|
148
166
|
//# sourceMappingURL=reactive.d.ts.map
|
package/dist/reactive.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactive.d.ts","sourceRoot":"","sources":["../src/reactive.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"reactive.d.ts","sourceRoot":"","sources":["../src/reactive.ts"],"names":[],"mappings":"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"}
|
package/dist/reactive.js
CHANGED
|
@@ -4,10 +4,15 @@ import { isEqual } from 'lodash-es';
|
|
|
4
4
|
import { BoundArray } from './utils/bounded-collections.js';
|
|
5
5
|
// import { getDurationMsFromSpan } from './otel.js'
|
|
6
6
|
export const NOT_REFRESHED_YET = Symbol.for('NOT_REFRESHED_YET');
|
|
7
|
+
export const isThunk = (obj) => {
|
|
8
|
+
return typeof obj === 'object' && obj !== null && '_tag' in obj && obj._tag === 'thunk';
|
|
9
|
+
};
|
|
7
10
|
const unknownRefreshReason = () => {
|
|
8
11
|
// debugger
|
|
9
12
|
return { _tag: 'unknown' };
|
|
10
13
|
};
|
|
14
|
+
const encodedOptionSome = (value) => ({ _tag: 'Some', value });
|
|
15
|
+
const encodedOptionNone = () => ({ _tag: 'None' });
|
|
11
16
|
let nodeIdCounter = 0;
|
|
12
17
|
const uniqueNodeId = () => `node-${++nodeIdCounter}`;
|
|
13
18
|
let refreshInfoIdCounter = 0;
|
|
@@ -71,7 +76,7 @@ export class ReactiveGraph {
|
|
|
71
76
|
const result = getResult(getAtom, setDebugInfo, this.context ?? throwContextNotSetError(this), otelContext);
|
|
72
77
|
const resultChanged = thunk.equal(thunk.previousResult, result) === false;
|
|
73
78
|
const debugInfoForAtom = {
|
|
74
|
-
atom: serializeAtom(thunk),
|
|
79
|
+
atom: serializeAtom(thunk, false),
|
|
75
80
|
resultChanged,
|
|
76
81
|
debugInfo: debugInfo ?? unknownRefreshReason(),
|
|
77
82
|
};
|
|
@@ -90,7 +95,7 @@ export class ReactiveGraph {
|
|
|
90
95
|
refreshedAtoms,
|
|
91
96
|
durationMs,
|
|
92
97
|
completedTimestamp: Date.now(),
|
|
93
|
-
graphSnapshot: this.getSnapshot(),
|
|
98
|
+
graphSnapshot: this.getSnapshot({ includeResults: false }),
|
|
94
99
|
});
|
|
95
100
|
}
|
|
96
101
|
return result;
|
|
@@ -205,12 +210,10 @@ export class ReactiveGraph {
|
|
|
205
210
|
refreshedAtoms,
|
|
206
211
|
durationMs,
|
|
207
212
|
completedTimestamp: Date.now(),
|
|
208
|
-
graphSnapshot: this.getSnapshot(),
|
|
213
|
+
graphSnapshot: this.getSnapshot({ includeResults: false }),
|
|
209
214
|
};
|
|
210
215
|
this.debugRefreshInfos.push(refreshDebugInfo);
|
|
211
|
-
|
|
212
|
-
cb();
|
|
213
|
-
}
|
|
216
|
+
this.runRefreshCallbacks();
|
|
214
217
|
});
|
|
215
218
|
};
|
|
216
219
|
runDeferredEffects = (options) => {
|
|
@@ -228,9 +231,15 @@ export class ReactiveGraph {
|
|
|
228
231
|
});
|
|
229
232
|
}
|
|
230
233
|
};
|
|
234
|
+
runRefreshCallbacks = () => {
|
|
235
|
+
for (const cb of this.refreshCallbacks) {
|
|
236
|
+
cb();
|
|
237
|
+
}
|
|
238
|
+
};
|
|
231
239
|
addEdge(superComp, subComp) {
|
|
232
240
|
superComp.sub.add(subComp);
|
|
233
241
|
subComp.super.add(superComp);
|
|
242
|
+
this.runRefreshCallbacks();
|
|
234
243
|
}
|
|
235
244
|
removeEdge(superComp, subComp) {
|
|
236
245
|
superComp.sub.delete(subComp);
|
|
@@ -240,12 +249,14 @@ export class ReactiveGraph {
|
|
|
240
249
|
this.deferredEffects.set(effect, new Set());
|
|
241
250
|
}
|
|
242
251
|
subComp.super.delete(superComp);
|
|
252
|
+
this.runRefreshCallbacks();
|
|
243
253
|
}
|
|
244
254
|
// NOTE This function is performance-optimized (i.e. not using `Array.from`)
|
|
245
|
-
getSnapshot = () => {
|
|
255
|
+
getSnapshot = (opts) => {
|
|
256
|
+
const { includeResults = false } = opts ?? {};
|
|
246
257
|
const atoms = [];
|
|
247
258
|
for (const atom of this.atoms) {
|
|
248
|
-
atoms.push(serializeAtom(atom));
|
|
259
|
+
atoms.push(serializeAtom(atom, includeResults));
|
|
249
260
|
}
|
|
250
261
|
const effects = [];
|
|
251
262
|
for (const effect of this.effects) {
|
|
@@ -267,7 +278,7 @@ export class ReactiveGraph {
|
|
|
267
278
|
const compute = (atom, otelContext) => {
|
|
268
279
|
// const __getResult = atom._tag === 'thunk' ? atom.__getResult.toString() : ''
|
|
269
280
|
if (atom.isDestroyed) {
|
|
270
|
-
shouldNeverHappen(`LiveStore Error: Attempted to compute destroyed atom`);
|
|
281
|
+
shouldNeverHappen(`LiveStore Error: Attempted to compute destroyed ${atom._tag} (${atom.id}): ${atom.label ?? ''}`);
|
|
271
282
|
}
|
|
272
283
|
if (atom.isDirty) {
|
|
273
284
|
// console.log('atom is dirty', atom.id, atom.label ?? '', atom._tag, __getResult)
|
|
@@ -296,7 +307,7 @@ export const throwContextNotSetError = (graph) => {
|
|
|
296
307
|
throw new Error(`LiveStore Error: \`context\` not set on ReactiveGraph (${graph.id})`);
|
|
297
308
|
};
|
|
298
309
|
// NOTE This function is performance-optimized (i.e. not using `pick` and `Array.from`)
|
|
299
|
-
const serializeAtom = (atom) => {
|
|
310
|
+
const serializeAtom = (atom, includeResult) => {
|
|
300
311
|
const sub = [];
|
|
301
312
|
for (const a of atom.sub) {
|
|
302
313
|
sub.push(a.id);
|
|
@@ -305,14 +316,34 @@ const serializeAtom = (atom) => {
|
|
|
305
316
|
for (const a of atom.super) {
|
|
306
317
|
super_.push(a.id);
|
|
307
318
|
}
|
|
319
|
+
const previousResult = includeResult
|
|
320
|
+
? encodedOptionSome(JSON.stringify(atom.previousResult))
|
|
321
|
+
: encodedOptionNone();
|
|
322
|
+
if (atom._tag === 'ref') {
|
|
323
|
+
return {
|
|
324
|
+
_tag: atom._tag,
|
|
325
|
+
id: atom.id,
|
|
326
|
+
label: atom.label,
|
|
327
|
+
meta: atom.meta,
|
|
328
|
+
isDirty: atom.isDirty,
|
|
329
|
+
sub,
|
|
330
|
+
super: super_,
|
|
331
|
+
isDestroyed: atom.isDestroyed,
|
|
332
|
+
refreshes: atom.refreshes,
|
|
333
|
+
previousResult,
|
|
334
|
+
};
|
|
335
|
+
}
|
|
308
336
|
return {
|
|
309
|
-
_tag:
|
|
337
|
+
_tag: 'thunk',
|
|
310
338
|
id: atom.id,
|
|
311
339
|
label: atom.label,
|
|
312
340
|
meta: atom.meta,
|
|
313
341
|
isDirty: atom.isDirty,
|
|
314
342
|
sub,
|
|
315
343
|
super: super_,
|
|
344
|
+
isDestroyed: atom.isDestroyed,
|
|
345
|
+
recomputations: atom.recomputations,
|
|
346
|
+
previousResult,
|
|
316
347
|
};
|
|
317
348
|
};
|
|
318
349
|
// NOTE This function is performance-optimized (i.e. not using `pick` and `Array.from`)
|
|
@@ -326,6 +357,8 @@ const serializeEffect = (effect) => {
|
|
|
326
357
|
id: effect.id,
|
|
327
358
|
label: effect.label,
|
|
328
359
|
sub,
|
|
360
|
+
invocations: effect.invocations,
|
|
361
|
+
isDestroyed: effect.isDestroyed,
|
|
329
362
|
};
|
|
330
363
|
};
|
|
331
364
|
//# sourceMappingURL=reactive.js.map
|