@livestore/livestore 0.0.21 → 0.0.23
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 +14 -4
- package/dist/.tsbuildinfo +1 -1
- package/dist/__tests__/react/fixture.d.ts.map +1 -1
- package/dist/__tests__/react/fixture.js +0 -2
- package/dist/__tests__/react/fixture.js.map +1 -1
- package/dist/__tests__/react/useQuery.test.js +1 -1
- package/dist/__tests__/react/useQuery.test.js.map +1 -1
- 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 +13 -1
- package/dist/__tests__/reactive.test.js.map +1 -1
- package/dist/__tests__/reactiveQueries/sql.test.js +3 -3
- package/dist/__tests__/reactiveQueries/sql.test.js.map +1 -1
- package/dist/inMemoryDatabase.d.ts +2 -1
- package/dist/inMemoryDatabase.d.ts.map +1 -1
- package/dist/inMemoryDatabase.js +3 -2
- package/dist/inMemoryDatabase.js.map +1 -1
- package/dist/react/index.d.ts +1 -0
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +1 -0
- package/dist/react/index.js.map +1 -1
- package/dist/react/useComponentState.d.ts.map +1 -1
- package/dist/react/useComponentState.js +19 -27
- package/dist/react/useComponentState.js.map +1 -1
- package/dist/react/useQuery.d.ts.map +1 -1
- package/dist/react/useQuery.js +46 -26
- package/dist/react/useQuery.js.map +1 -1
- package/dist/react/useTemporaryQuery.d.ts.map +1 -1
- package/dist/react/useTemporaryQuery.js +2 -0
- package/dist/react/useTemporaryQuery.js.map +1 -1
- 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 +33 -43
- package/dist/reactive.d.ts.map +1 -1
- package/dist/reactive.js +66 -255
- package/dist/reactive.js.map +1 -1
- package/dist/reactiveQueries/base-class.d.ts +15 -13
- package/dist/reactiveQueries/base-class.d.ts.map +1 -1
- package/dist/reactiveQueries/base-class.js +5 -8
- package/dist/reactiveQueries/base-class.js.map +1 -1
- package/dist/reactiveQueries/graphql.d.ts +4 -3
- package/dist/reactiveQueries/graphql.d.ts.map +1 -1
- package/dist/reactiveQueries/graphql.js +29 -34
- package/dist/reactiveQueries/graphql.js.map +1 -1
- package/dist/reactiveQueries/js.d.ts +2 -1
- package/dist/reactiveQueries/js.d.ts.map +1 -1
- package/dist/reactiveQueries/js.js +8 -9
- package/dist/reactiveQueries/js.js.map +1 -1
- package/dist/reactiveQueries/sql.d.ts +11 -5
- package/dist/reactiveQueries/sql.d.ts.map +1 -1
- package/dist/reactiveQueries/sql.js +31 -34
- package/dist/reactiveQueries/sql.js.map +1 -1
- package/dist/store.d.ts +26 -12
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +41 -255
- package/dist/store.js.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/react/fixture.tsx +0 -3
- package/src/__tests__/react/useQuery.test.tsx +1 -1
- package/src/__tests__/react/utils/{extractStackInfoFromStackTrace.test.ts → stack-info.test.ts} +25 -20
- package/src/__tests__/reactive.test.ts +20 -1
- package/src/__tests__/reactiveQueries/sql.test.ts +3 -3
- package/src/inMemoryDatabase.ts +9 -6
- package/src/react/index.ts +1 -0
- package/src/react/useComponentState.ts +25 -30
- package/src/react/useQuery.ts +66 -34
- package/src/react/useTemporaryQuery.ts +2 -0
- package/src/react/utils/{extractStackInfoFromStackTrace.ts → stack-info.ts} +21 -5
- package/src/reactive.ts +148 -339
- package/src/reactiveQueries/base-class.ts +23 -22
- package/src/reactiveQueries/graphql.ts +34 -36
- package/src/reactiveQueries/js.ts +14 -10
- package/src/reactiveQueries/sql.ts +55 -48
- package/src/store.ts +70 -305
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { assertNever, shouldNeverHappen } from '@livestore/utils';
|
|
2
2
|
import * as otel from '@opentelemetry/api';
|
|
3
3
|
import * as graphql from 'graphql';
|
|
4
|
+
import { getDurationMsFromSpan } from '../otel.js';
|
|
4
5
|
import { LiveStoreQueryBase, makeGetAtomResult } from './base-class.js';
|
|
5
6
|
import { dbGraph } from './graph.js';
|
|
6
7
|
import { LiveStoreJSQuery } from './js.js';
|
|
7
8
|
export const queryGraphQL = (document, genVariableValues, { label } = {}) => new LiveStoreGraphQLQuery({ document, genVariableValues, label });
|
|
8
9
|
export class LiveStoreGraphQLQuery extends LiveStoreQueryBase {
|
|
9
|
-
constructor({ document, label, genVariableValues,
|
|
10
|
-
}) {
|
|
10
|
+
constructor({ document, label, genVariableValues, }) {
|
|
11
11
|
super();
|
|
12
12
|
this._tag = 'graphql';
|
|
13
13
|
/**
|
|
@@ -23,35 +23,34 @@ export class LiveStoreGraphQLQuery extends LiveStoreQueryBase {
|
|
|
23
23
|
onDestroy: () => this.destroy(),
|
|
24
24
|
});
|
|
25
25
|
this.queryOnce = ({ document, otelContext, otelTracer, variableValues, store, }) => {
|
|
26
|
-
// const schema = this.schema
|
|
27
|
-
// const context = this.context
|
|
28
26
|
const schema = store.graphQLSchema ?? shouldNeverHappen("Can't run a GraphQL query on a store without GraphQL schema");
|
|
29
27
|
const context = store.graphQLContext ?? shouldNeverHappen("Can't run a GraphQL query on a store without GraphQL context");
|
|
30
28
|
const operationName = graphql.getOperationAST(document)?.name?.value;
|
|
31
29
|
return otelTracer.startActiveSpan(`executeGraphQLQuery: ${operationName}`, {}, otelContext, (span) => {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
console.error(`graphql error (${operationName})`, res.errors);
|
|
49
|
-
}
|
|
50
|
-
return { result: res.data, queriedTables: Array.from(context.queriedTables.values()) };
|
|
51
|
-
}
|
|
52
|
-
finally {
|
|
53
|
-
span.end();
|
|
30
|
+
span.setAttribute('graphql.variables', JSON.stringify(variableValues));
|
|
31
|
+
span.setAttribute('graphql.query', graphql.print(document));
|
|
32
|
+
context.queriedTables.clear();
|
|
33
|
+
context.otelContext = otel.trace.setSpan(otel.context.active(), span);
|
|
34
|
+
const res = graphql.executeSync({
|
|
35
|
+
document,
|
|
36
|
+
contextValue: context,
|
|
37
|
+
schema: schema,
|
|
38
|
+
variableValues,
|
|
39
|
+
});
|
|
40
|
+
// TODO track number of nested SQL queries via Otel + debug info
|
|
41
|
+
if (res.errors) {
|
|
42
|
+
span.setStatus({ code: otel.SpanStatusCode.ERROR, message: 'GraphQL error' });
|
|
43
|
+
span.setAttribute('graphql.error', res.errors.join('\n'));
|
|
44
|
+
span.setAttribute('graphql.error-detail', JSON.stringify(res.errors));
|
|
45
|
+
console.error(`graphql error (${operationName})`, res.errors);
|
|
54
46
|
}
|
|
47
|
+
span.end();
|
|
48
|
+
const durationMs = getDurationMsFromSpan(span);
|
|
49
|
+
return {
|
|
50
|
+
result: res.data,
|
|
51
|
+
queriedTables: Array.from(context.queriedTables.values()),
|
|
52
|
+
durationMs,
|
|
53
|
+
};
|
|
55
54
|
});
|
|
56
55
|
};
|
|
57
56
|
this.destroy = () => {
|
|
@@ -61,11 +60,8 @@ export class LiveStoreGraphQLQuery extends LiveStoreQueryBase {
|
|
|
61
60
|
const labelWithDefault = label ?? graphql.getOperationAST(document)?.name?.value ?? 'graphql';
|
|
62
61
|
this.label = labelWithDefault;
|
|
63
62
|
this.document = document;
|
|
64
|
-
// if (context === undefined) {
|
|
65
|
-
// return shouldNeverHappen("Can't run a GraphQL query on a store without GraphQL context")
|
|
66
|
-
// }
|
|
67
63
|
// TODO don't even create a thunk if variables are static
|
|
68
|
-
const variableValues$ = dbGraph.makeThunk((get,
|
|
64
|
+
const variableValues$ = dbGraph.makeThunk((get, _setDebugInfo, { rootOtelContext }, otelContext) => {
|
|
69
65
|
if (typeof genVariableValues === 'function') {
|
|
70
66
|
return genVariableValues(makeGetAtomResult(get, otelContext ?? rootOtelContext));
|
|
71
67
|
}
|
|
@@ -74,11 +70,10 @@ export class LiveStoreGraphQLQuery extends LiveStoreQueryBase {
|
|
|
74
70
|
}
|
|
75
71
|
}, { label: `${labelWithDefault}:variableValues`, meta: { liveStoreThunkType: 'graphqlVariableValues' } });
|
|
76
72
|
this.variableValues$ = variableValues$;
|
|
77
|
-
// const resultsLabel = `${labelWithDefault}:results` + (this.temporaryQueries ? ':temp' : '')
|
|
78
73
|
const resultsLabel = `${labelWithDefault}:results`;
|
|
79
|
-
this.results$ = dbGraph.makeThunk((get,
|
|
74
|
+
this.results$ = dbGraph.makeThunk((get, setDebugInfo, { store, otelTracer, rootOtelContext }, otelContext) => {
|
|
80
75
|
const variableValues = get(variableValues$);
|
|
81
|
-
const { result, queriedTables } = this.queryOnce({
|
|
76
|
+
const { result, queriedTables, durationMs } = this.queryOnce({
|
|
82
77
|
document,
|
|
83
78
|
variableValues,
|
|
84
79
|
otelContext: otelContext ?? rootOtelContext,
|
|
@@ -91,7 +86,7 @@ export class LiveStoreGraphQLQuery extends LiveStoreQueryBase {
|
|
|
91
86
|
assertNever(tableRef !== undefined, `No table ref found for ${tableName}`);
|
|
92
87
|
get(tableRef);
|
|
93
88
|
}
|
|
94
|
-
|
|
89
|
+
setDebugInfo({ _tag: 'graphql', label: resultsLabel, query: graphql.print(document), durationMs });
|
|
95
90
|
return result;
|
|
96
91
|
}, { label: resultsLabel, meta: { liveStoreThunkType: 'graphqlResults' } });
|
|
97
92
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphql.js","sourceRoot":"","sources":["../../src/reactiveQueries/graphql.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACjE,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC1C,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"graphql.js","sourceRoot":"","sources":["../../src/reactiveQueries/graphql.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Thunk } from '../reactive.js';
|
|
2
|
+
import type { RefreshReason } from '../store.js';
|
|
2
3
|
import { type GetAtomResult, LiveStoreQueryBase } from './base-class.js';
|
|
3
4
|
import type { DbContext } from './graph.js';
|
|
4
5
|
export declare const queryJS: <TResult>(fn: (get: GetAtomResult) => TResult, options: {
|
|
@@ -7,7 +8,7 @@ export declare const queryJS: <TResult>(fn: (get: GetAtomResult) => TResult, opt
|
|
|
7
8
|
export declare class LiveStoreJSQuery<TResult> extends LiveStoreQueryBase<TResult> {
|
|
8
9
|
_tag: 'js';
|
|
9
10
|
/** A reactive thunk representing the query results */
|
|
10
|
-
results$: Thunk<TResult, DbContext>;
|
|
11
|
+
results$: Thunk<TResult, DbContext, RefreshReason>;
|
|
11
12
|
label: string;
|
|
12
13
|
/** Currently only used for "nested destruction" of piped queries */
|
|
13
14
|
private onDestroy;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"js.d.ts","sourceRoot":"","sources":["../../src/reactiveQueries/js.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"js.d.ts","sourceRoot":"","sources":["../../src/reactiveQueries/js.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,KAAK,aAAa,EAAE,kBAAkB,EAAqB,MAAM,iBAAiB,CAAA;AAC3F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAG3C,eAAO,MAAM,OAAO,sBAAuB,aAAa,uBAAuB;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,8BACnC,CAAA;AAE7D,qBAAa,gBAAgB,CAAC,OAAO,CAAE,SAAQ,kBAAkB,CAAC,OAAO,CAAC;IACxE,IAAI,EAAE,IAAI,CAAO;IAEjB,sDAAsD;IACtD,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,aAAa,CAAC,CAAA;IAElD,KAAK,EAAE,MAAM,CAAA;IAEb,oEAAoE;IACpE,OAAO,CAAC,SAAS,CAA0B;gBAE/B,EACV,EAAE,EACF,KAAK,EACL,SAAS,GACV,EAAE;QACD,KAAK,EAAE,MAAM,CAAA;QACb,EAAE,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAA;QACnC,oEAAoE;QACpE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;KACvB;IA0BD,IAAI,mBAAoB,OAAO,OAAO,aAAa,+BAQ/C;IAEJ,OAAO,aAGN;CACF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as otel from '@opentelemetry/api';
|
|
2
|
+
import { getDurationMsFromSpan } from '../otel.js';
|
|
2
3
|
import { LiveStoreQueryBase, makeGetAtomResult } from './base-class.js';
|
|
3
4
|
import { dbGraph } from './graph.js';
|
|
4
5
|
export const queryJS = (fn, options) => new LiveStoreJSQuery({ fn, label: options.label });
|
|
@@ -21,15 +22,13 @@ export class LiveStoreJSQuery extends LiveStoreQueryBase {
|
|
|
21
22
|
this.onDestroy = onDestroy;
|
|
22
23
|
this.label = label;
|
|
23
24
|
const queryLabel = `${label}:results`;
|
|
24
|
-
this.results$ = dbGraph.makeThunk((get,
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
span.end();
|
|
32
|
-
}
|
|
25
|
+
this.results$ = dbGraph.makeThunk((get, setDebugInfo, { otelTracer, rootOtelContext }, otelContext) => otelTracer.startActiveSpan(`js:${label}`, {}, otelContext ?? rootOtelContext, (span) => {
|
|
26
|
+
const otelContext = otel.trace.setSpan(otel.context.active(), span);
|
|
27
|
+
const res = fn(makeGetAtomResult(get, otelContext));
|
|
28
|
+
span.end();
|
|
29
|
+
const durationMs = getDurationMsFromSpan(span);
|
|
30
|
+
setDebugInfo({ _tag: 'js', label, query: fn.toString(), durationMs });
|
|
31
|
+
return res;
|
|
33
32
|
}), { label: queryLabel, meta: { liveStoreThunkType: 'jsResults' } });
|
|
34
33
|
}
|
|
35
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"js.js","sourceRoot":"","sources":["../../src/reactiveQueries/js.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"js.js","sourceRoot":"","sources":["../../src/reactiveQueries/js.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAGlD,OAAO,EAAsB,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAE3F,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEpC,MAAM,CAAC,MAAM,OAAO,GAAG,CAAU,EAAmC,EAAE,OAA0B,EAAE,EAAE,CAClG,IAAI,gBAAgB,CAAU,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAA;AAE7D,MAAM,OAAO,gBAA0B,SAAQ,kBAA2B;IAWxE,YAAY,EACV,EAAE,EACF,KAAK,EACL,SAAS,GAMV;QACC,KAAK,EAAE,CAAA;QApBT,SAAI,GAAS,IAAI,CAAA;QA6CjB,SAAI,GAAG,CAAI,EAA8C,EAAuB,EAAE,CAChF,IAAI,gBAAgB,CAAC;YACnB,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE;gBACV,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;gBAClC,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;YACzB,CAAC;YACD,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,KAAK;YACzB,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE;SAChC,CAAC,CAAA;QAEJ,YAAO,GAAG,GAAG,EAAE;YACb,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC9B,IAAI,CAAC,SAAS,EAAE,EAAE,CAAA;QACpB,CAAC,CAAA;QApCC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAElB,MAAM,UAAU,GAAG,GAAG,KAAK,UAAU,CAAA;QAErC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,SAAS,CAC/B,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,EAAE,WAAW,EAAE,EAAE,CAClE,UAAU,CAAC,eAAe,CAAC,MAAM,KAAK,EAAE,EAAE,EAAE,EAAE,WAAW,IAAI,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE;YACrF,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,CAAA;YACnE,MAAM,GAAG,GAAG,EAAE,CAAC,iBAAiB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAA;YAEnD,IAAI,CAAC,GAAG,EAAE,CAAA;YAEV,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAA;YAE9C,YAAY,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,CAAA;YAErE,OAAO,GAAG,CAAA;QACZ,CAAC,CAAC,EACJ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,kBAAkB,EAAE,WAAW,EAAE,EAAE,CACjE,CAAA;IACH,CAAC;CAgBF"}
|
|
@@ -1,24 +1,30 @@
|
|
|
1
1
|
import type { Thunk } from '../reactive.js';
|
|
2
|
+
import type { RefreshReason } from '../store.js';
|
|
2
3
|
import type { Bindable } from '../util.js';
|
|
3
4
|
import { type GetAtomResult, LiveStoreQueryBase } from './base-class.js';
|
|
4
5
|
import type { DbContext } from './graph.js';
|
|
5
6
|
import { LiveStoreJSQuery } from './js.js';
|
|
6
|
-
export declare const querySQL: <Row>(query: string | ((get: GetAtomResult) => string), options
|
|
7
|
-
|
|
7
|
+
export declare const querySQL: <Row>(query: string | ((get: GetAtomResult) => string), options?: {
|
|
8
|
+
/**
|
|
9
|
+
* Can be provided explicitly to slightly speed up initial query performance
|
|
10
|
+
*
|
|
11
|
+
* NOTE In the future we want to do this automatically at build time
|
|
12
|
+
*/
|
|
13
|
+
queriedTables?: ReadonlyArray<string>;
|
|
8
14
|
bindValues?: Bindable;
|
|
9
15
|
label?: string;
|
|
10
16
|
}) => LiveStoreSQLQuery<Row>;
|
|
11
17
|
export declare class LiveStoreSQLQuery<Row> extends LiveStoreQueryBase<ReadonlyArray<Row>> {
|
|
12
18
|
_tag: 'sql';
|
|
13
19
|
/** A reactive thunk representing the query text */
|
|
14
|
-
queryString$: Thunk<string, DbContext>;
|
|
20
|
+
queryString$: Thunk<string, DbContext, RefreshReason>;
|
|
15
21
|
/** A reactive thunk representing the query results */
|
|
16
|
-
results$: Thunk<ReadonlyArray<Row>, DbContext>;
|
|
22
|
+
results$: Thunk<ReadonlyArray<Row>, DbContext, RefreshReason>;
|
|
17
23
|
label: string;
|
|
18
24
|
constructor({ genQueryString, queriedTables, bindValues, label: label_, }: {
|
|
19
25
|
label?: string;
|
|
20
26
|
genQueryString: string | ((get: GetAtomResult) => string);
|
|
21
|
-
queriedTables
|
|
27
|
+
queriedTables?: ReadonlyArray<string>;
|
|
22
28
|
bindValues?: Bindable;
|
|
23
29
|
});
|
|
24
30
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/reactiveQueries/sql.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/reactiveQueries/sql.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE1C,OAAO,EAAE,KAAK,aAAa,EAAE,kBAAkB,EAAqB,MAAM,iBAAiB,CAAA;AAC3F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE1C,eAAO,MAAM,QAAQ,+BACI,aAAa,KAAK,MAAM,aACrC;IACR;;;;OAIG;IACH,aAAa,CAAC,EAAE,cAAc,MAAM,CAAC,CAAA;IACrC,UAAU,CAAC,EAAE,QAAQ,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,2BAOC,CAAA;AAGJ,qBAAa,iBAAiB,CAAC,GAAG,CAAE,SAAQ,kBAAkB,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAChF,IAAI,EAAE,KAAK,CAAQ;IAEnB,mDAAmD;IACnD,YAAY,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC,CAAA;IAErD,sDAAsD;IACtD,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,aAAa,CAAC,CAAA;IAE7D,KAAK,EAAE,MAAM,CAAA;gBAED,EACV,cAAc,EACd,aAAa,EACb,UAAU,EACV,KAAK,EAAE,MAAM,GACd,EAAE;QACD,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,cAAc,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,aAAa,KAAK,MAAM,CAAC,CAAA;QACzD,aAAa,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;QACrC,UAAU,CAAC,EAAE,QAAQ,CAAA;KACtB;IA2ED;;;OAGG;IACH,IAAI,mBAAoB,cAAc,GAAG,CAAC,OAAO,aAAa,+BAQ1D;IAEJ,gCAAgC;IAChC,WAAW,UAAW;QAAE,YAAY,CAAC,EAAE,GAAG,CAAA;KAAE,wCAaxC;IAEJ,OAAO,aAGN;CACF"}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { shouldNeverHappen } from '@livestore/utils';
|
|
2
2
|
import * as otel from '@opentelemetry/api';
|
|
3
|
+
import { getDurationMsFromSpan } from '../otel.js';
|
|
3
4
|
import { prepareBindValues } from '../util.js';
|
|
4
5
|
import { LiveStoreQueryBase, makeGetAtomResult } from './base-class.js';
|
|
5
6
|
import { dbGraph } from './graph.js';
|
|
6
7
|
import { LiveStoreJSQuery } from './js.js';
|
|
7
8
|
export const querySQL = (query, options) => new LiveStoreSQLQuery({
|
|
8
|
-
label: options
|
|
9
|
+
label: options?.label,
|
|
9
10
|
genQueryString: query,
|
|
10
|
-
queriedTables: options
|
|
11
|
-
bindValues: options
|
|
11
|
+
queriedTables: options?.queriedTables,
|
|
12
|
+
bindValues: options?.bindValues,
|
|
12
13
|
});
|
|
13
14
|
/* An object encapsulating a reactive SQL query */
|
|
14
15
|
export class LiveStoreSQLQuery extends LiveStoreQueryBase {
|
|
@@ -46,11 +47,14 @@ export class LiveStoreSQLQuery extends LiveStoreQueryBase {
|
|
|
46
47
|
dbGraph.destroy(this.results$);
|
|
47
48
|
};
|
|
48
49
|
const label = label_ ?? genQueryString.toString();
|
|
50
|
+
this.label = `sql(${label})`;
|
|
49
51
|
// TODO don't even create a thunk if query string is static
|
|
50
|
-
const queryString$ = dbGraph.makeThunk((get,
|
|
52
|
+
const queryString$ = dbGraph.makeThunk((get, setDebugInfo, { rootOtelContext }, otelContext) => {
|
|
51
53
|
if (typeof genQueryString === 'function') {
|
|
54
|
+
const startMs = performance.now();
|
|
52
55
|
const queryString = genQueryString(makeGetAtomResult(get, otelContext ?? rootOtelContext));
|
|
53
|
-
|
|
56
|
+
const durationMs = performance.now() - startMs;
|
|
57
|
+
setDebugInfo({ _tag: 'js', label: `${label}:queryString`, query: queryString, durationMs });
|
|
54
58
|
return queryString;
|
|
55
59
|
}
|
|
56
60
|
else {
|
|
@@ -58,40 +62,33 @@ export class LiveStoreSQLQuery extends LiveStoreQueryBase {
|
|
|
58
62
|
}
|
|
59
63
|
}, { label: `${label}:queryString`, meta: { liveStoreThunkType: 'sqlQueryString' } });
|
|
60
64
|
this.queryString$ = queryString$;
|
|
61
|
-
// TODO come up with different way to handle labels
|
|
62
|
-
// label = label ?? `sql(${queryString$.computeResult()})`
|
|
63
|
-
this.label = `sql(${label})`;
|
|
64
|
-
// span.updateName(`querySQL:${label}`)
|
|
65
65
|
const queryLabel = `${label}:results`;
|
|
66
|
-
|
|
67
|
-
const results$ = dbGraph.makeThunk((get,
|
|
66
|
+
const queriedTablesRef = { current: queriedTables };
|
|
67
|
+
const results$ = dbGraph.makeThunk((get, setDebugInfo, { store, otelTracer, rootOtelContext }, otelContext) => otelTracer.startActiveSpan('sql:...', // NOTE span name will be overridden further down
|
|
68
68
|
{}, otelContext ?? rootOtelContext, (span) => {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
const tableRef = store.tableRefs[tableName] ?? shouldNeverHappen(`No table ref found for ${tableName}`);
|
|
74
|
-
get(tableRef, otelContext);
|
|
75
|
-
}
|
|
76
|
-
const sqlString = get(queryString$, otelContext);
|
|
77
|
-
span.setAttribute('sql.query', sqlString);
|
|
78
|
-
span.updateName(`sql:${sqlString.slice(0, 50)}`);
|
|
79
|
-
const results = store.inMemoryDB.select(sqlString, {
|
|
80
|
-
queriedTables,
|
|
81
|
-
bindValues: bindValues ? prepareBindValues(bindValues, sqlString) : undefined,
|
|
82
|
-
otelContext,
|
|
83
|
-
});
|
|
84
|
-
span.setAttribute('sql.rowsCount', results.length);
|
|
85
|
-
addDebugInfo({ _tag: 'sql', label: label ?? '', query: sqlString });
|
|
86
|
-
return results;
|
|
69
|
+
const otelContext = otel.trace.setSpan(otel.context.active(), span);
|
|
70
|
+
const sqlString = get(queryString$, otelContext);
|
|
71
|
+
if (queriedTablesRef.current === undefined) {
|
|
72
|
+
queriedTablesRef.current = store.inMemoryDB.getTablesUsed(sqlString);
|
|
87
73
|
}
|
|
88
|
-
|
|
89
|
-
|
|
74
|
+
// Establish a reactive dependency on the tables used in the query
|
|
75
|
+
for (const tableName of queriedTablesRef.current) {
|
|
76
|
+
const tableRef = store.tableRefs[tableName] ?? shouldNeverHappen(`No table ref found for ${tableName}`);
|
|
77
|
+
get(tableRef, otelContext);
|
|
90
78
|
}
|
|
79
|
+
span.setAttribute('sql.query', sqlString);
|
|
80
|
+
span.updateName(`sql:${sqlString.slice(0, 50)}`);
|
|
81
|
+
const results = store.inMemoryDB.select(sqlString, {
|
|
82
|
+
queriedTables,
|
|
83
|
+
bindValues: bindValues ? prepareBindValues(bindValues, sqlString) : undefined,
|
|
84
|
+
otelContext,
|
|
85
|
+
});
|
|
86
|
+
span.setAttribute('sql.rowsCount', results.length);
|
|
87
|
+
span.end();
|
|
88
|
+
const durationMs = getDurationMsFromSpan(span);
|
|
89
|
+
setDebugInfo({ _tag: 'sql', label, query: sqlString, durationMs });
|
|
90
|
+
return results;
|
|
91
91
|
}), { label: queryLabel });
|
|
92
|
-
// this.queryString$ = queryString$
|
|
93
|
-
// this.results$ = results$
|
|
94
|
-
// this.payload = payload
|
|
95
92
|
this.results$ = results$;
|
|
96
93
|
}
|
|
97
94
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/reactiveQueries/sql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/reactiveQueries/sql.ts"],"names":[],"mappings":"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"}
|
package/dist/store.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import * as otel from '@opentelemetry/api';
|
|
2
2
|
import type { GraphQLSchema } from 'graphql';
|
|
3
3
|
import type * as Sqlite from 'sqlite-esm';
|
|
4
|
-
import type { ComponentKey } from './componentKey.js';
|
|
5
4
|
import type { LiveStoreEvent } from './events.js';
|
|
6
5
|
import { InMemoryDatabase } from './inMemoryDatabase.js';
|
|
6
|
+
import type { StackInfo } from './react/utils/stack-info.js';
|
|
7
7
|
import type { ReactiveGraph, Ref } from './reactive.js';
|
|
8
8
|
import type { ILiveStoreQuery } from './reactiveQueries/base-class.js';
|
|
9
9
|
import { type DbContext } from './reactiveQueries/graph.js';
|
|
@@ -20,7 +20,6 @@ export type BaseGraphQLContext = {
|
|
|
20
20
|
otelContext?: otel.Context;
|
|
21
21
|
};
|
|
22
22
|
export type QueryResult<TQuery> = TQuery extends LiveStoreSQLQuery<infer R> ? ReadonlyArray<Readonly<R>> : TQuery extends LiveStoreJSQuery<infer S> ? Readonly<S> : TQuery extends LiveStoreGraphQLQuery<infer Result, any, any> ? Readonly<Result> : never;
|
|
23
|
-
export declare const globalComponentKey: ComponentKey;
|
|
24
23
|
export type GraphQLOptions<TContext> = {
|
|
25
24
|
schema: GraphQLSchema;
|
|
26
25
|
makeContext: (db: InMemoryDatabase, tracer: otel.Tracer) => TContext;
|
|
@@ -54,6 +53,14 @@ export type RefreshReason = {
|
|
|
54
53
|
} | {
|
|
55
54
|
_tag: 'makeThunk';
|
|
56
55
|
label?: string;
|
|
56
|
+
} | {
|
|
57
|
+
_tag: 'react';
|
|
58
|
+
api: string;
|
|
59
|
+
label?: string;
|
|
60
|
+
stackInfo?: StackInfo;
|
|
61
|
+
} | {
|
|
62
|
+
_tag: 'manual';
|
|
63
|
+
label?: string;
|
|
57
64
|
} | {
|
|
58
65
|
_tag: 'unknown';
|
|
59
66
|
};
|
|
@@ -61,6 +68,7 @@ export type QueryDebugInfo = {
|
|
|
61
68
|
_tag: 'graphql' | 'sql' | 'js' | 'unknown';
|
|
62
69
|
label: string;
|
|
63
70
|
query: string;
|
|
71
|
+
durationMs: number;
|
|
64
72
|
};
|
|
65
73
|
export type StoreOtel = {
|
|
66
74
|
tracer: otel.Tracer;
|
|
@@ -80,25 +88,21 @@ export declare class Store<TGraphQLContext extends BaseGraphQLContext = BaseGrap
|
|
|
80
88
|
* This only works in combination with `equal: () => false` which will always trigger a refresh.
|
|
81
89
|
*/
|
|
82
90
|
tableRefs: {
|
|
83
|
-
[key: string]: Ref<null>;
|
|
91
|
+
[key: string]: Ref<null, DbContext, RefreshReason>;
|
|
84
92
|
};
|
|
85
|
-
|
|
93
|
+
/** RC-based set to see which queries are currently subscribed to */
|
|
94
|
+
activeQueries: ReferenceCountedSet<LiveStoreQuery>;
|
|
86
95
|
storage?: Storage;
|
|
87
|
-
temporaryQueries: Set<LiveStoreQuery> | undefined;
|
|
88
96
|
private constructor();
|
|
89
97
|
static createStore: <TGraphQLContext_1 extends BaseGraphQLContext>(storeOptions: StoreOptions<TGraphQLContext_1>, parentSpan: otel.Span) => Store<TGraphQLContext_1>;
|
|
90
|
-
/**
|
|
91
|
-
* Creates a reactive LiveStore SQL query
|
|
92
|
-
*
|
|
93
|
-
* NOTE The query is actually running (even if no one has subscribed to it yet) and will be kept up to date.
|
|
94
|
-
*/
|
|
95
98
|
/**
|
|
96
99
|
* Subscribe to the results of a query
|
|
97
100
|
* Returns a function to cancel the subscription.
|
|
98
101
|
*/
|
|
99
|
-
subscribe: <TResult>(query: ILiveStoreQuery<TResult>, onNewValue: (value: TResult) => void,
|
|
102
|
+
subscribe: <TResult>(query: ILiveStoreQuery<TResult>, onNewValue: (value: TResult) => void, onUnsubsubscribe?: () => void, options?: {
|
|
100
103
|
label?: string;
|
|
101
104
|
otelContext?: otel.Context;
|
|
105
|
+
skipInitialRun?: boolean;
|
|
102
106
|
} | undefined) => (() => void);
|
|
103
107
|
/**
|
|
104
108
|
* Destroys the entire store, including all queries and subscriptions.
|
|
@@ -144,7 +148,7 @@ export declare class Store<TGraphQLContext extends BaseGraphQLContext = BaseGrap
|
|
|
144
148
|
* This should only be used for framework-internal purposes;
|
|
145
149
|
* all app writes should go through applyEvent.
|
|
146
150
|
*/
|
|
147
|
-
execute: (query: string, params?: ParamsObject, writeTables?: string[]) => void;
|
|
151
|
+
execute: (query: string, params?: ParamsObject, writeTables?: string[], otelContext?: otel.Context) => void;
|
|
148
152
|
}
|
|
149
153
|
/** Create a new LiveStore Store */
|
|
150
154
|
export declare const createStore: <TGraphQLContext extends BaseGraphQLContext>({ schema, loadStorage, graphQLOptions, otelTracer, otelRootSpanContext, boot, sqlite3, }: {
|
|
@@ -156,4 +160,14 @@ export declare const createStore: <TGraphQLContext extends BaseGraphQLContext>({
|
|
|
156
160
|
boot?: ((db: InMemoryDatabase, parentSpan: otel.Span) => unknown | Promise<unknown>) | undefined;
|
|
157
161
|
sqlite3: Sqlite.Sqlite3Static;
|
|
158
162
|
}) => Promise<Store<TGraphQLContext>>;
|
|
163
|
+
declare class ReferenceCountedSet<T> {
|
|
164
|
+
private map;
|
|
165
|
+
constructor();
|
|
166
|
+
add: (key: T) => void;
|
|
167
|
+
remove: (key: T) => void;
|
|
168
|
+
has: (key: T) => boolean;
|
|
169
|
+
get size(): number;
|
|
170
|
+
[Symbol.iterator](): Generator<T, void, unknown>;
|
|
171
|
+
}
|
|
172
|
+
export {};
|
|
159
173
|
//# sourceMappingURL=store.d.ts.map
|
package/dist/store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5C,OAAO,KAAK,KAAK,MAAM,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5C,OAAO,KAAK,KAAK,MAAM,MAAM,YAAY,CAAA;AAKzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAGxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,eAAe,CAAA;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACtE,OAAO,EAAE,KAAK,SAAS,EAAW,MAAM,4BAA4B,CAAA;AACpE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,KAAK,EAAoB,aAAa,EAAE,MAAM,EAAqB,MAAM,aAAa,CAAA;AAE7F,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAG7C,MAAM,MAAM,cAAc,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,IAChE,iBAAiB,CAAC,OAAO,CAAC,GAC1B,gBAAgB,CAAC,OAAO,CAAC,GACzB,qBAAqB,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;AAE5C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC1B,gEAAgE;IAChE,WAAW,CAAC,EAAE,IAAI,CAAC,OAAO,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,WAAW,CAAC,MAAM,IAAI,MAAM,SAAS,iBAAiB,CAAC,MAAM,CAAC,CAAC,GACvE,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAC1B,MAAM,SAAS,gBAAgB,CAAC,MAAM,CAAC,CAAC,GACxC,QAAQ,CAAC,CAAC,CAAC,GACX,MAAM,SAAS,qBAAqB,CAAC,MAAM,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,GAC5D,QAAQ,CAAC,MAAM,CAAC,GAChB,KAAK,CAAA;AAET,MAAM,MAAM,cAAc,CAAC,QAAQ,IAAI;IACrC,MAAM,EAAE,aAAa,CAAA;IACrB,WAAW,EAAE,CAAC,EAAE,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAA;CACrE,CAAA;AAED,MAAM,MAAM,YAAY,CAAC,eAAe,SAAS,kBAAkB,IAAI;IACrE,EAAE,EAAE,gBAAgB,CAAA;IACpB,4FAA4F;IAC5F,OAAO,EAAE,gBAAgB,CAAA;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,cAAc,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAA;IAChD,UAAU,EAAE,IAAI,CAAC,MAAM,CAAA;IACvB,mBAAmB,EAAE,IAAI,CAAC,OAAO,CAAA;CAClC,CAAA;AAED,MAAM,MAAM,aAAa,GACrB;IACE,IAAI,EAAE,YAAY,CAAA;IAClB,iCAAiC;IAGjC,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;IAEjC,mDAAmD;IACnD,WAAW,EAAE,MAAM,EAAE,CAAA;CACtB,GACD;IACE,IAAI,EAAE,aAAa,CAAA;IACnB,kCAAkC;IAGlC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE,CAAA;IAEpC,mDAAmD;IACnD,WAAW,EAAE,MAAM,EAAE,CAAA;CACtB;AACH,sFAAsF;GACpF;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IACE,IAAI,EAAE,WAAW,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,GACD;IACE,IAAI,EAAE,OAAO,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB,GACD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAA;AAEvB,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,SAAS,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,CAAA;IAC1C,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;IACnB,sBAAsB,EAAE,IAAI,CAAC,OAAO,CAAA;IACpC,kBAAkB,EAAE,IAAI,CAAC,OAAO,CAAA;CACjC,CAAA;AAED,qBAAa,KAAK,CAAC,eAAe,SAAS,kBAAkB,GAAG,kBAAkB;IAChF,KAAK,EAAE,aAAa,CAAC,aAAa,EAAE,cAAc,EAAE,SAAS,CAAC,CAAA;IAC9D,UAAU,EAAE,gBAAgB,CAAA;IAE5B,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,cAAc,CAAC,EAAE,eAAe,CAAA;IAChC,IAAI,EAAE,SAAS,CAAA;IACf;;;OAGG;IACH,SAAS,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,aAAa,CAAC,CAAA;KAAE,CAAA;IAEjE,oEAAoE;IACpE,aAAa,EAAE,mBAAmB,CAAC,cAAc,CAAC,CAAA;IAClD,OAAO,CAAC,EAAE,OAAO,CAAA;IAEjB,OAAO;IAoDP,MAAM,CAAC,WAAW,4GAEJ,KAAK,IAAI,8BAUtB;IAED;;;OAGG;IACH,SAAS,6EAEyB,IAAI,qBACjB,MAAM,IAAI,YACnB;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,KAAK,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,KAC7F,CAAC,MAAM,IAAI,CAAC,CA8BZ;IAEH;;;;OAIG;IACH,OAAO,aAON;IAGD,UAAU,2EAGE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,KAClC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAsDxB;IAED;;;;OAIG;IACH,WAAW,WAED,SAAS;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE,CAAC,YACxC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,KAClD;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAgFxB;IAED;;;OAGG;IACH,aAAa,aAAc;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,UAa5C;IAED;;;;;OAKG;IACH,OAAO,CAAC,wBAAwB,CAgF/B;IAED;;;;OAIG;IACH,OAAO,UAAW,MAAM,WAAU,YAAY,gBAAqB,MAAM,EAAE,gBAAgB,KAAK,OAAO,UAOtG;CACF;AAED,mCAAmC;AACnC,eAAO,MAAM,WAAW;YASd,MAAM;iBACD,MAAM,WAAW,GAAG,QAAQ,WAAW,CAAC;;;;iBAIzC,gBAAgB,cAAc,KAAK,IAAI,KAAK,OAAO,GAAG,QAAQ,OAAO,CAAC;aACzE,OAAO,aAAa;qCAkF9B,CAAA;AAiBD,cAAM,mBAAmB,CAAC,CAAC;IACzB,OAAO,CAAC,GAAG,CAAgB;;IAM3B,GAAG,QAAS,CAAC,UAGZ;IAED,MAAM,QAAS,CAAC,UAOf;IAED,GAAG,QAAS,CAAC,aAEZ;IAED,IAAI,IAAI,WAEP;IAEA,CAAC,MAAM,CAAC,QAAQ,CAAC;CAKnB"}
|