@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.
Files changed (136) hide show
  1. package/README.md +29 -22
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/QueryCache.d.ts +1 -1
  4. package/dist/QueryCache.d.ts.map +1 -1
  5. package/dist/QueryCache.js.map +1 -1
  6. package/dist/__tests__/react/fixture.d.ts +5 -4
  7. package/dist/__tests__/react/fixture.d.ts.map +1 -1
  8. package/dist/__tests__/react/fixture.js +3 -5
  9. package/dist/__tests__/react/fixture.js.map +1 -1
  10. package/dist/__tests__/react/useComponentState.test.d.ts +2 -0
  11. package/dist/__tests__/react/useComponentState.test.d.ts.map +1 -0
  12. package/dist/__tests__/react/useComponentState.test.js +68 -0
  13. package/dist/__tests__/react/useComponentState.test.js.map +1 -0
  14. package/dist/__tests__/react/useLQuery.test.d.ts +2 -0
  15. package/dist/__tests__/react/useLQuery.test.d.ts.map +1 -0
  16. package/dist/__tests__/react/useLQuery.test.js +38 -0
  17. package/dist/__tests__/react/useLQuery.test.js.map +1 -0
  18. package/dist/__tests__/react/useLiveStoreComponent.test.js +4 -9
  19. package/dist/__tests__/react/useLiveStoreComponent.test.js.map +1 -1
  20. package/dist/__tests__/react/useQuery.test.d.ts +2 -0
  21. package/dist/__tests__/react/useQuery.test.d.ts.map +1 -0
  22. package/dist/__tests__/react/useQuery.test.js +33 -0
  23. package/dist/__tests__/react/useQuery.test.js.map +1 -0
  24. package/dist/__tests__/react/utils/extractStackInfoFromStackTrace.test.d.ts +2 -0
  25. package/dist/__tests__/react/utils/extractStackInfoFromStackTrace.test.d.ts.map +1 -0
  26. package/dist/__tests__/react/utils/extractStackInfoFromStackTrace.test.js +38 -0
  27. package/dist/__tests__/react/utils/extractStackInfoFromStackTrace.test.js.map +1 -0
  28. package/dist/__tests__/react/utils/stack-info.test.d.ts +2 -0
  29. package/dist/__tests__/react/utils/stack-info.test.d.ts.map +1 -0
  30. package/dist/__tests__/react/utils/stack-info.test.js +43 -0
  31. package/dist/__tests__/react/utils/stack-info.test.js.map +1 -0
  32. package/dist/__tests__/reactive.test.js +179 -93
  33. package/dist/__tests__/reactive.test.js.map +1 -1
  34. package/dist/__tests__/reactiveQueries/sql.test.d.ts +2 -0
  35. package/dist/__tests__/reactiveQueries/sql.test.d.ts.map +1 -0
  36. package/dist/__tests__/reactiveQueries/sql.test.js +337 -0
  37. package/dist/__tests__/reactiveQueries/sql.test.js.map +1 -0
  38. package/dist/inMemoryDatabase.d.ts +4 -3
  39. package/dist/inMemoryDatabase.d.ts.map +1 -1
  40. package/dist/inMemoryDatabase.js +3 -2
  41. package/dist/inMemoryDatabase.js.map +1 -1
  42. package/dist/index.d.ts +7 -5
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +4 -0
  45. package/dist/index.js.map +1 -1
  46. package/dist/react/index.d.ts +4 -3
  47. package/dist/react/index.d.ts.map +1 -1
  48. package/dist/react/index.js +3 -2
  49. package/dist/react/index.js.map +1 -1
  50. package/dist/react/useComponentState.d.ts +50 -0
  51. package/dist/react/useComponentState.d.ts.map +1 -0
  52. package/dist/react/useComponentState.js +240 -0
  53. package/dist/react/useComponentState.js.map +1 -0
  54. package/dist/react/useGlobalQuery.d.ts +3 -0
  55. package/dist/react/useGlobalQuery.d.ts.map +1 -0
  56. package/dist/react/useGlobalQuery.js +26 -0
  57. package/dist/react/useGlobalQuery.js.map +1 -0
  58. package/dist/react/useGraphQL.d.ts +3 -3
  59. package/dist/react/useGraphQL.d.ts.map +1 -1
  60. package/dist/react/useGraphQL.js +10 -8
  61. package/dist/react/useGraphQL.js.map +1 -1
  62. package/dist/react/useLiveStoreComponent.d.ts +6 -6
  63. package/dist/react/useLiveStoreComponent.d.ts.map +1 -1
  64. package/dist/react/useLiveStoreComponent.js +143 -99
  65. package/dist/react/useLiveStoreComponent.js.map +1 -1
  66. package/dist/react/useQuery.d.ts +2 -2
  67. package/dist/react/useQuery.d.ts.map +1 -1
  68. package/dist/react/useQuery.js +54 -30
  69. package/dist/react/useQuery.js.map +1 -1
  70. package/dist/react/useTemporaryQuery.d.ts +8 -0
  71. package/dist/react/useTemporaryQuery.d.ts.map +1 -0
  72. package/dist/react/useTemporaryQuery.js +19 -0
  73. package/dist/react/useTemporaryQuery.js.map +1 -0
  74. package/dist/react/utils/extractNamesFromStackTrace.d.ts +3 -0
  75. package/dist/react/utils/extractNamesFromStackTrace.d.ts.map +1 -0
  76. package/dist/react/utils/extractNamesFromStackTrace.js +40 -0
  77. package/dist/react/utils/extractNamesFromStackTrace.js.map +1 -0
  78. package/dist/react/utils/extractStackInfoFromStackTrace.d.ts +7 -0
  79. package/dist/react/utils/extractStackInfoFromStackTrace.d.ts.map +1 -0
  80. package/dist/react/utils/extractStackInfoFromStackTrace.js +40 -0
  81. package/dist/react/utils/extractStackInfoFromStackTrace.js.map +1 -0
  82. package/dist/react/utils/stack-info.d.ts +11 -0
  83. package/dist/react/utils/stack-info.d.ts.map +1 -0
  84. package/dist/react/utils/stack-info.js +49 -0
  85. package/dist/react/utils/stack-info.js.map +1 -0
  86. package/dist/reactive.d.ts +51 -67
  87. package/dist/reactive.d.ts.map +1 -1
  88. package/dist/reactive.js +138 -220
  89. package/dist/reactive.js.map +1 -1
  90. package/dist/reactiveQueries/base-class.d.ts +28 -21
  91. package/dist/reactiveQueries/base-class.d.ts.map +1 -1
  92. package/dist/reactiveQueries/base-class.js +22 -18
  93. package/dist/reactiveQueries/base-class.js.map +1 -1
  94. package/dist/reactiveQueries/graph.d.ts +10 -0
  95. package/dist/reactiveQueries/graph.d.ts.map +1 -0
  96. package/dist/reactiveQueries/graph.js +6 -0
  97. package/dist/reactiveQueries/graph.js.map +1 -0
  98. package/dist/reactiveQueries/graphql.d.ts +35 -17
  99. package/dist/reactiveQueries/graphql.d.ts.map +1 -1
  100. package/dist/reactiveQueries/graphql.js +86 -10
  101. package/dist/reactiveQueries/graphql.js.map +1 -1
  102. package/dist/reactiveQueries/js.d.ts +17 -12
  103. package/dist/reactiveQueries/js.d.ts.map +1 -1
  104. package/dist/reactiveQueries/js.js +30 -8
  105. package/dist/reactiveQueries/js.js.map +1 -1
  106. package/dist/reactiveQueries/sql.d.ts +28 -18
  107. package/dist/reactiveQueries/sql.d.ts.map +1 -1
  108. package/dist/reactiveQueries/sql.js +79 -16
  109. package/dist/reactiveQueries/sql.js.map +1 -1
  110. package/dist/store.d.ts +35 -61
  111. package/dist/store.d.ts.map +1 -1
  112. package/dist/store.js +77 -272
  113. package/dist/store.js.map +1 -1
  114. package/package.json +4 -3
  115. package/src/QueryCache.ts +1 -1
  116. package/src/__tests__/react/fixture.tsx +10 -8
  117. package/src/__tests__/react/{useLiveStoreComponent.test.tsx → useComponentState.test.tsx} +9 -20
  118. package/src/__tests__/react/useQuery.test.tsx +48 -0
  119. package/src/__tests__/react/utils/stack-info.test.ts +45 -0
  120. package/src/__tests__/reactive.test.ts +212 -140
  121. package/src/__tests__/reactiveQueries/sql.test.ts +372 -0
  122. package/src/inMemoryDatabase.ts +11 -8
  123. package/src/index.ts +7 -11
  124. package/src/react/index.ts +4 -7
  125. package/src/react/{useLiveStoreComponent.ts → useComponentState.ts} +90 -253
  126. package/src/react/useQuery.ts +74 -40
  127. package/src/react/useTemporaryQuery.ts +23 -0
  128. package/src/react/utils/stack-info.ts +63 -0
  129. package/src/reactive.ts +234 -308
  130. package/src/reactiveQueries/base-class.ts +59 -42
  131. package/src/reactiveQueries/graph.ts +15 -0
  132. package/src/reactiveQueries/graphql.ts +143 -29
  133. package/src/reactiveQueries/js.ts +57 -20
  134. package/src/reactiveQueries/sql.ts +136 -36
  135. package/src/store.ts +121 -426
  136. package/src/react/useGraphQL.ts +0 -138
@@ -1,25 +1,43 @@
1
1
  import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';
2
- import type * as otel from '@opentelemetry/api';
3
- import type { ComponentKey } from '../componentKey.js';
2
+ import * as otel from '@opentelemetry/api';
3
+ import * as graphql from 'graphql';
4
4
  import type { Thunk } from '../reactive.js';
5
- import type { BaseGraphQLContext, GetAtomResult, Store } from '../store.js';
6
- import { LiveStoreQueryBase } from './base-class.js';
7
- import type { LiveStoreJSQuery } from './js.js';
8
- export declare class LiveStoreGraphQLQuery<TResult extends Record<string, any>, VariableValues extends Record<string, any>, TContext extends BaseGraphQLContext> extends LiveStoreQueryBase<TResult> {
5
+ import type { BaseGraphQLContext, RefreshReason, Store } from '../store.js';
6
+ import { type GetAtomResult, LiveStoreQueryBase } from './base-class.js';
7
+ import { type DbContext } from './graph.js';
8
+ import { LiveStoreJSQuery } from './js.js';
9
+ export declare const queryGraphQL: <TResult extends Record<string, any>, TVariableValues extends Record<string, any>>(document: DocumentNode<TResult, TVariableValues>, genVariableValues: TVariableValues | ((get: GetAtomResult) => TVariableValues), { label }?: {
10
+ label?: string | undefined;
11
+ }) => LiveStoreGraphQLQuery<TResult, TVariableValues, BaseGraphQLContext>;
12
+ export declare class LiveStoreGraphQLQuery<TResult extends Record<string, any>, TVariableValues extends Record<string, any>, TContext extends BaseGraphQLContext> extends LiveStoreQueryBase<TResult> {
9
13
  _tag: 'graphql';
10
14
  /** The abstract GraphQL query */
11
- document: DocumentNode<TResult, VariableValues>;
15
+ document: DocumentNode<TResult, TVariableValues>;
12
16
  /** A reactive thunk representing the query results */
13
- results$: Thunk<TResult>;
14
- constructor({ document, results$, ...baseProps }: {
15
- document: DocumentNode<TResult, VariableValues>;
16
- context: TContext;
17
- results$: Thunk<TResult>;
18
- componentKey: ComponentKey;
19
- label: string;
20
- store: Store<TContext>;
21
- otelContext: otel.Context;
17
+ results$: Thunk<TResult, DbContext, RefreshReason>;
18
+ variableValues$: Thunk<TVariableValues, DbContext, RefreshReason>;
19
+ label: string;
20
+ constructor({ document, label, genVariableValues, }: {
21
+ document: DocumentNode<TResult, TVariableValues>;
22
+ genVariableValues: TVariableValues | ((get: GetAtomResult) => TVariableValues);
23
+ label?: string;
22
24
  });
23
- pipe: <U>(f: (x: TResult, get: GetAtomResult) => U) => LiveStoreJSQuery<U>;
25
+ /**
26
+ * Returns a new reactive query that contains the result of
27
+ * running an arbitrary JS computation on the results of this SQL query.
28
+ */
29
+ pipe: <U>(fn: (result: TResult, get: GetAtomResult) => U) => LiveStoreJSQuery<U>;
30
+ queryOnce: ({ document, otelContext, otelTracer, variableValues, store, }: {
31
+ document: graphql.DocumentNode;
32
+ otelContext: otel.Context;
33
+ otelTracer: otel.Tracer;
34
+ variableValues: TVariableValues;
35
+ store: Store<TContext>;
36
+ }) => {
37
+ result: TResult;
38
+ queriedTables: string[];
39
+ durationMs: number;
40
+ };
41
+ destroy: () => void;
24
42
  }
25
43
  //# sourceMappingURL=graphql.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"graphql.d.ts","sourceRoot":"","sources":["../../src/reactiveQueries/graphql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,IAAI,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAC1F,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C,qBAAa,qBAAqB,CAChC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACnC,cAAc,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1C,QAAQ,SAAS,kBAAkB,CACnC,SAAQ,kBAAkB,CAAC,OAAO,CAAC;IACnC,IAAI,EAAE,SAAS,CAAY;IAE3B,iCAAiC;IACjC,QAAQ,EAAE,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;IAE/C,sDAAsD;IACtD,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;gBAEZ,EACV,QAAQ,EACR,QAAQ,EACR,GAAG,SAAS,EACb,EAAE;QACD,QAAQ,EAAE,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;QAC/C,OAAO,EAAE,QAAQ,CAAA;QACjB,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;QACxB,YAAY,EAAE,YAAY,CAAA;QAC1B,KAAK,EAAE,MAAM,CAAA;QACb,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAA;QACtB,WAAW,EAAE,IAAI,CAAC,OAAO,CAAA;KAC1B;IAOD,IAAI,aAAc,OAAO,OAAO,aAAa,+BAW1C;CACJ"}
1
+ {"version":3,"file":"graphql.d.ts","sourceRoot":"","sources":["../../src/reactiveQueries/graphql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,IAAI,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAE1F,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC1C,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAGlC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAC3E,OAAO,EAAE,KAAK,aAAa,EAAE,kBAAkB,EAAqB,MAAM,iBAAiB,CAAA;AAC3F,OAAO,EAAE,KAAK,SAAS,EAAW,MAAM,YAAY,CAAA;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE1C,eAAO,MAAM,YAAY,mLAEqB,aAAa;;yEAEW,CAAA;AAEtE,qBAAa,qBAAqB,CAChC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACnC,eAAe,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3C,QAAQ,SAAS,kBAAkB,CACnC,SAAQ,kBAAkB,CAAC,OAAO,CAAC;IACnC,IAAI,EAAE,SAAS,CAAY;IAE3B,iCAAiC;IACjC,QAAQ,EAAE,YAAY,CAAC,OAAO,EAAE,eAAe,CAAC,CAAA;IAEhD,sDAAsD;IACtD,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,aAAa,CAAC,CAAA;IAElD,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,SAAS,EAAE,aAAa,CAAC,CAAA;IAEjE,KAAK,EAAE,MAAM,CAAA;gBAED,EACV,QAAQ,EACR,KAAK,EACL,iBAAiB,GAClB,EAAE;QACD,QAAQ,EAAE,YAAY,CAAC,OAAO,EAAE,eAAe,CAAC,CAAA;QAChD,iBAAiB,EAAE,eAAe,GAAG,CAAC,CAAC,GAAG,EAAE,aAAa,KAAK,eAAe,CAAC,CAAA;QAC9E,KAAK,CAAC,EAAE,MAAM,CAAA;KACf;IAkDD;;;OAGG;IACH,IAAI,mBAAoB,OAAO,OAAO,aAAa,+BAQ/C;IAEJ,SAAS;kBAOG,oBAAoB;qBACjB,KAAK,OAAO;oBACb,KAAK,MAAM;wBACP,eAAe;eACxB,MAAM,QAAQ,CAAC;;;;;MA2CvB;IAED,OAAO,aAGN;CACF"}
@@ -1,18 +1,94 @@
1
- import { LiveStoreQueryBase } from './base-class.js';
1
+ import { assertNever, shouldNeverHappen } from '@livestore/utils';
2
+ import * as otel from '@opentelemetry/api';
3
+ import * as graphql from 'graphql';
4
+ import { getDurationMsFromSpan } from '../otel.js';
5
+ import { LiveStoreQueryBase, makeGetAtomResult } from './base-class.js';
6
+ import { dbGraph } from './graph.js';
7
+ import { LiveStoreJSQuery } from './js.js';
8
+ export const queryGraphQL = (document, genVariableValues, { label } = {}) => new LiveStoreGraphQLQuery({ document, genVariableValues, label });
2
9
  export class LiveStoreGraphQLQuery extends LiveStoreQueryBase {
3
- constructor({ document, results$, ...baseProps }) {
4
- super(baseProps);
10
+ constructor({ document, label, genVariableValues, }) {
11
+ super();
5
12
  this._tag = 'graphql';
6
- this.pipe = (f) => this.store.queryJS((get) => {
7
- const results = get(this.results$);
8
- return f(results, get);
9
- }, {
10
- componentKey: this.componentKey,
13
+ /**
14
+ * Returns a new reactive query that contains the result of
15
+ * running an arbitrary JS computation on the results of this SQL query.
16
+ */
17
+ this.pipe = (fn) => new LiveStoreJSQuery({
18
+ fn: (get) => {
19
+ const results = get(this.results$);
20
+ return fn(results, get);
21
+ },
11
22
  label: `${this.label}:js`,
12
- otelContext: this.otelContext,
23
+ onDestroy: () => this.destroy(),
13
24
  });
25
+ this.queryOnce = ({ document, otelContext, otelTracer, variableValues, store, }) => {
26
+ const schema = store.graphQLSchema ?? shouldNeverHappen("Can't run a GraphQL query on a store without GraphQL schema");
27
+ const context = store.graphQLContext ?? shouldNeverHappen("Can't run a GraphQL query on a store without GraphQL context");
28
+ const operationName = graphql.getOperationAST(document)?.name?.value;
29
+ return otelTracer.startActiveSpan(`executeGraphQLQuery: ${operationName}`, {}, otelContext, (span) => {
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);
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
+ };
54
+ });
55
+ };
56
+ this.destroy = () => {
57
+ dbGraph.destroy(this.variableValues$);
58
+ dbGraph.destroy(this.results$);
59
+ };
60
+ const labelWithDefault = label ?? graphql.getOperationAST(document)?.name?.value ?? 'graphql';
61
+ this.label = labelWithDefault;
14
62
  this.document = document;
15
- this.results$ = results$;
63
+ // TODO don't even create a thunk if variables are static
64
+ const variableValues$ = dbGraph.makeThunk((get, _setDebugInfo, { rootOtelContext }, otelContext) => {
65
+ if (typeof genVariableValues === 'function') {
66
+ return genVariableValues(makeGetAtomResult(get, otelContext ?? rootOtelContext));
67
+ }
68
+ else {
69
+ return genVariableValues;
70
+ }
71
+ }, { label: `${labelWithDefault}:variableValues`, meta: { liveStoreThunkType: 'graphqlVariableValues' } });
72
+ this.variableValues$ = variableValues$;
73
+ const resultsLabel = `${labelWithDefault}:results`;
74
+ this.results$ = dbGraph.makeThunk((get, setDebugInfo, { store, otelTracer, rootOtelContext }, otelContext) => {
75
+ const variableValues = get(variableValues$);
76
+ const { result, queriedTables, durationMs } = this.queryOnce({
77
+ document,
78
+ variableValues,
79
+ otelContext: otelContext ?? rootOtelContext,
80
+ otelTracer,
81
+ store: store,
82
+ });
83
+ // Add dependencies on any tables that were used
84
+ for (const tableName of queriedTables) {
85
+ const tableRef = store.tableRefs[tableName];
86
+ assertNever(tableRef !== undefined, `No table ref found for ${tableName}`);
87
+ get(tableRef);
88
+ }
89
+ setDebugInfo({ _tag: 'graphql', label: resultsLabel, query: graphql.print(document), durationMs });
90
+ return result;
91
+ }, { label: resultsLabel, meta: { liveStoreThunkType: 'graphqlResults' } });
16
92
  }
17
93
  }
18
94
  //# sourceMappingURL=graphql.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"graphql.js","sourceRoot":"","sources":["../../src/reactiveQueries/graphql.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAGpD,MAAM,OAAO,qBAIX,SAAQ,kBAA2B;IASnC,YAAY,EACV,QAAQ,EACR,QAAQ,EACR,GAAG,SAAS,EASb;QACC,KAAK,CAAC,SAAS,CAAC,CAAA;QArBlB,SAAI,GAAc,SAAS,CAAA;QA2B3B,SAAI,GAAG,CAAI,CAAwC,EAAuB,EAAE,CAC1E,IAAI,CAAC,KAAK,CAAC,OAAO,CAChB,CAAC,GAAG,EAAE,EAAE;YACN,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAClC,OAAO,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QACxB,CAAC,EACD;YACE,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,KAAK;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CACF,CAAA;QAfD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;CAcF"}
1
+ {"version":3,"file":"graphql.js","sourceRoot":"","sources":["../../src/reactiveQueries/graphql.ts"],"names":[],"mappings":"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"}
@@ -1,19 +1,24 @@
1
- import type * as otel from '@opentelemetry/api';
2
- import type { ComponentKey } from '../componentKey.js';
3
- import type { GetAtom, Thunk } from '../reactive.js';
4
- import type { Store } from '../store.js';
5
- import { LiveStoreQueryBase } from './base-class.js';
1
+ import type { Thunk } from '../reactive.js';
2
+ import type { RefreshReason } from '../store.js';
3
+ import { type GetAtomResult, LiveStoreQueryBase } from './base-class.js';
4
+ import type { DbContext } from './graph.js';
5
+ export declare const queryJS: <TResult>(fn: (get: GetAtomResult) => TResult, options: {
6
+ label: string;
7
+ }) => LiveStoreJSQuery<TResult>;
6
8
  export declare class LiveStoreJSQuery<TResult> extends LiveStoreQueryBase<TResult> {
7
9
  _tag: 'js';
8
10
  /** A reactive thunk representing the query results */
9
- results$: Thunk<TResult>;
10
- constructor({ results$, ...baseProps }: {
11
- results$: Thunk<TResult>;
12
- componentKey: ComponentKey;
11
+ results$: Thunk<TResult, DbContext, RefreshReason>;
12
+ label: string;
13
+ /** Currently only used for "nested destruction" of piped queries */
14
+ private onDestroy;
15
+ constructor({ fn, label, onDestroy, }: {
13
16
  label: string;
14
- store: Store;
15
- otelContext: otel.Context;
17
+ fn: (get: GetAtomResult) => TResult;
18
+ /** Currently only used for "nested destruction" of piped queries */
19
+ onDestroy?: () => void;
16
20
  });
17
- pipe: <U>(f: (x: TResult, get: GetAtom) => U) => LiveStoreJSQuery<U>;
21
+ pipe: <U>(fn: (result: TResult, get: GetAtomResult) => U) => LiveStoreJSQuery<U>;
22
+ destroy: () => void;
18
23
  }
19
24
  //# sourceMappingURL=js.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"js.d.ts","sourceRoot":"","sources":["../../src/reactiveQueries/js.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAEpD,qBAAa,gBAAgB,CAAC,OAAO,CAAE,SAAQ,kBAAkB,CAAC,OAAO,CAAC;IACxE,IAAI,EAAE,IAAI,CAAO;IACjB,sDAAsD;IACtD,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;gBAEZ,EACV,QAAQ,EACR,GAAG,SAAS,EACb,EAAE;QACD,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;QACxB,YAAY,EAAE,YAAY,CAAA;QAC1B,KAAK,EAAE,MAAM,CAAA;QACb,KAAK,EAAE,KAAK,CAAA;QACZ,WAAW,EAAE,IAAI,CAAC,OAAO,CAAA;KAC1B;IAMD,IAAI,aAAc,OAAO,OAAO,OAAO,+BAOpC;CACJ"}
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,13 +1,35 @@
1
- import { LiveStoreQueryBase } from './base-class.js';
1
+ import * as otel from '@opentelemetry/api';
2
+ import { getDurationMsFromSpan } from '../otel.js';
3
+ import { LiveStoreQueryBase, makeGetAtomResult } from './base-class.js';
4
+ import { dbGraph } from './graph.js';
5
+ export const queryJS = (fn, options) => new LiveStoreJSQuery({ fn, label: options.label });
2
6
  export class LiveStoreJSQuery extends LiveStoreQueryBase {
3
- constructor({ results$, ...baseProps }) {
4
- super(baseProps);
7
+ constructor({ fn, label, onDestroy, }) {
8
+ super();
5
9
  this._tag = 'js';
6
- this.pipe = (f) => this.store.queryJS((get) => {
7
- const results = get(this.results$);
8
- return f(results, get);
9
- }, { componentKey: this.componentKey, label: `${this.label}:js`, otelContext: this.otelContext });
10
- this.results$ = results$;
10
+ this.pipe = (fn) => new LiveStoreJSQuery({
11
+ fn: (get) => {
12
+ const results = get(this.results$);
13
+ return fn(results, get);
14
+ },
15
+ label: `${this.label}:js`,
16
+ onDestroy: () => this.destroy(),
17
+ });
18
+ this.destroy = () => {
19
+ dbGraph.destroy(this.results$);
20
+ this.onDestroy?.();
21
+ };
22
+ this.onDestroy = onDestroy;
23
+ this.label = label;
24
+ const queryLabel = `${label}:results`;
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;
32
+ }), { label: queryLabel, meta: { liveStoreThunkType: 'jsResults' } });
11
33
  }
12
34
  }
13
35
  //# sourceMappingURL=js.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"js.js","sourceRoot":"","sources":["../../src/reactiveQueries/js.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAEpD,MAAM,OAAO,gBAA0B,SAAQ,kBAA2B;IAKxE,YAAY,EACV,QAAQ,EACR,GAAG,SAAS,EAOb;QACC,KAAK,CAAC,SAAS,CAAC,CAAA;QAdlB,SAAI,GAAS,IAAI,CAAA;QAmBjB,SAAI,GAAG,CAAI,CAAkC,EAAuB,EAAE,CACpE,IAAI,CAAC,KAAK,CAAC,OAAO,CAChB,CAAC,GAAG,EAAE,EAAE;YACN,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAClC,OAAO,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QACxB,CAAC,EACD,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAC9F,CAAA;QAVD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;CAUF"}
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,31 +1,41 @@
1
- import type * as otel from '@opentelemetry/api';
2
- import type { ComponentKey } from '../componentKey.js';
3
- import type { GetAtom, Thunk } from '../reactive.js';
4
- import type { Store } from '../store.js';
5
- import { LiveStoreQueryBase } from './base-class.js';
6
- import type { LiveStoreJSQuery } from './js.js';
7
- export declare class LiveStoreSQLQuery<Row> extends LiveStoreQueryBase<Row> {
1
+ import type { Thunk } from '../reactive.js';
2
+ import type { RefreshReason } from '../store.js';
3
+ import type { Bindable } from '../util.js';
4
+ import { type GetAtomResult, LiveStoreQueryBase } from './base-class.js';
5
+ import type { DbContext } from './graph.js';
6
+ import { LiveStoreJSQuery } from './js.js';
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>;
14
+ bindValues?: Bindable;
15
+ label?: string;
16
+ }) => LiveStoreSQLQuery<Row>;
17
+ export declare class LiveStoreSQLQuery<Row> extends LiveStoreQueryBase<ReadonlyArray<Row>> {
8
18
  _tag: 'sql';
9
19
  /** A reactive thunk representing the query text */
10
- queryString$: Thunk<string>;
20
+ queryString$: Thunk<string, DbContext, RefreshReason>;
11
21
  /** A reactive thunk representing the query results */
12
- results$: Thunk<ReadonlyArray<Row>>;
13
- constructor({ queryString$, results$, ...baseProps }: {
14
- queryString$: Thunk<string>;
15
- results$: Thunk<ReadonlyArray<Row>>;
16
- componentKey: ComponentKey;
17
- label: string;
18
- store: Store;
19
- otelContext: otel.Context;
22
+ results$: Thunk<ReadonlyArray<Row>, DbContext, RefreshReason>;
23
+ label: string;
24
+ constructor({ genQueryString, queriedTables, bindValues, label: label_, }: {
25
+ label?: string;
26
+ genQueryString: string | ((get: GetAtomResult) => string);
27
+ queriedTables?: ReadonlyArray<string>;
28
+ bindValues?: Bindable;
20
29
  });
21
30
  /**
22
31
  * Returns a new reactive query that contains the result of
23
32
  * running an arbitrary JS computation on the results of this SQL query.
24
33
  */
25
- pipe: <U>(fn: (result: ReadonlyArray<Row>, get: GetAtom) => U) => LiveStoreJSQuery<U>;
34
+ pipe: <U>(fn: (result: ReadonlyArray<Row>, get: GetAtomResult) => U) => LiveStoreJSQuery<U>;
26
35
  /** Returns a reactive query */
27
36
  getFirstRow: (args?: {
28
37
  defaultValue?: Row;
29
- }) => LiveStoreJSQuery<Row>;
38
+ }) => LiveStoreJSQuery<NonNullable<Row>>;
39
+ destroy: () => void;
30
40
  }
31
41
  //# sourceMappingURL=sql.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/reactiveQueries/sql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAG/C,qBAAa,iBAAiB,CAAC,GAAG,CAAE,SAAQ,kBAAkB,CAAC,GAAG,CAAC;IACjE,IAAI,EAAE,KAAK,CAAQ;IACnB,mDAAmD;IACnD,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;IAC3B,sDAAsD;IACtD,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAA;gBAEvB,EACV,YAAY,EACZ,QAAQ,EACR,GAAG,SAAS,EACb,EAAE;QACD,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;QAC3B,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAA;QACnC,YAAY,EAAE,YAAY,CAAA;QAC1B,KAAK,EAAE,MAAM,CAAA;QACb,KAAK,EAAE,KAAK,CAAA;QACZ,WAAW,EAAE,IAAI,CAAC,OAAO,CAAA;KAC1B;IAOD;;;OAGG;IACH,IAAI,mBAAoB,cAAc,GAAG,CAAC,OAAO,OAAO,+BAWrD;IAEH,gCAAgC;IAChC,WAAW,UAAW;QAAE,YAAY,CAAC,EAAE,GAAG,CAAA;KAAE,2BAWzC;CACJ"}
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,31 +1,94 @@
1
- import { LiveStoreQueryBase } from './base-class.js';
1
+ import { shouldNeverHappen } from '@livestore/utils';
2
+ import * as otel from '@opentelemetry/api';
3
+ import { getDurationMsFromSpan } from '../otel.js';
4
+ import { prepareBindValues } from '../util.js';
5
+ import { LiveStoreQueryBase, makeGetAtomResult } from './base-class.js';
6
+ import { dbGraph } from './graph.js';
7
+ import { LiveStoreJSQuery } from './js.js';
8
+ export const querySQL = (query, options) => new LiveStoreSQLQuery({
9
+ label: options?.label,
10
+ genQueryString: query,
11
+ queriedTables: options?.queriedTables,
12
+ bindValues: options?.bindValues,
13
+ });
2
14
  /* An object encapsulating a reactive SQL query */
3
15
  export class LiveStoreSQLQuery extends LiveStoreQueryBase {
4
- constructor({ queryString$, results$, ...baseProps }) {
5
- super(baseProps);
16
+ constructor({ genQueryString, queriedTables, bindValues, label: label_, }) {
17
+ super();
6
18
  this._tag = 'sql';
7
19
  /**
8
20
  * Returns a new reactive query that contains the result of
9
21
  * running an arbitrary JS computation on the results of this SQL query.
10
22
  */
11
- this.pipe = (fn) => this.store.queryJS((get) => {
12
- const results = get(this.results$);
13
- return fn(results, get);
14
- }, {
15
- componentKey: this.componentKey,
23
+ this.pipe = (fn) => new LiveStoreJSQuery({
24
+ fn: (get) => {
25
+ const results = get(this.results$);
26
+ return fn(results, get);
27
+ },
16
28
  label: `${this.label}:js`,
17
- otelContext: this.otelContext,
29
+ onDestroy: () => this.destroy(),
18
30
  });
19
31
  /** Returns a reactive query */
20
- this.getFirstRow = (args) => this.store.queryJS((get) => {
21
- const results = get(this.results$);
22
- if (results.length === 0 && args?.defaultValue === undefined) {
23
- const queryLabel = this._tag === 'sql' ? this.queryString$.result : this.label;
24
- throw new Error(`Expected query ${queryLabel} to return at least one result`);
32
+ this.getFirstRow = (args) => new LiveStoreJSQuery({
33
+ fn: (get) => {
34
+ const results = get(this.results$);
35
+ if (results.length === 0 && args?.defaultValue === undefined) {
36
+ // const queryLabel = this._tag === 'sql' ? this.queryString$!.computeResult(otelContext) : this.label
37
+ const queryLabel = this.label;
38
+ throw new Error(`Expected query ${queryLabel} to return at least one result`);
39
+ }
40
+ return results[0] ?? args.defaultValue;
41
+ },
42
+ label: `${this.label}:first`,
43
+ onDestroy: () => this.destroy(),
44
+ });
45
+ this.destroy = () => {
46
+ dbGraph.destroy(this.queryString$);
47
+ dbGraph.destroy(this.results$);
48
+ };
49
+ const label = label_ ?? genQueryString.toString();
50
+ this.label = `sql(${label})`;
51
+ // TODO don't even create a thunk if query string is static
52
+ const queryString$ = dbGraph.makeThunk((get, setDebugInfo, { rootOtelContext }, otelContext) => {
53
+ if (typeof genQueryString === 'function') {
54
+ const startMs = performance.now();
55
+ const queryString = genQueryString(makeGetAtomResult(get, otelContext ?? rootOtelContext));
56
+ const durationMs = performance.now() - startMs;
57
+ setDebugInfo({ _tag: 'js', label: `${label}:queryString`, query: queryString, durationMs });
58
+ return queryString;
59
+ }
60
+ else {
61
+ return genQueryString;
25
62
  }
26
- return (results[0] ?? args?.defaultValue);
27
- }, { componentKey: this.componentKey, label: `${this.label}:first`, otelContext: this.otelContext });
63
+ }, { label: `${label}:queryString`, meta: { liveStoreThunkType: 'sqlQueryString' } });
28
64
  this.queryString$ = queryString$;
65
+ const queryLabel = `${label}:results`;
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
+ {}, otelContext ?? rootOtelContext, (span) => {
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);
73
+ }
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);
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
+ }), { label: queryLabel });
29
92
  this.results$ = results$;
30
93
  }
31
94
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/reactiveQueries/sql.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAGpD,kDAAkD;AAClD,MAAM,OAAO,iBAAuB,SAAQ,kBAAuB;IAOjE,YAAY,EACV,YAAY,EACZ,QAAQ,EACR,GAAG,SAAS,EAQb;QACC,KAAK,CAAC,SAAS,CAAC,CAAA;QAlBlB,SAAI,GAAU,KAAK,CAAA;QAwBnB;;;WAGG;QACH,SAAI,GAAG,CAAI,EAAmD,EAAuB,EAAE,CACrF,IAAI,CAAC,KAAK,CAAC,OAAO,CAChB,CAAC,GAAG,EAAE,EAAE;YACN,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAClC,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QACzB,CAAC,EACD;YACE,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,KAAK;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CACF,CAAA;QAEH,gCAAgC;QAChC,gBAAW,GAAG,CAAC,IAA6B,EAAE,EAAE,CAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAChB,CAAC,GAAG,EAAE,EAAE;YACN,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAClC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,EAAE,YAAY,KAAK,SAAS,EAAE;gBAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAA;gBAC9E,MAAM,IAAI,KAAK,CAAC,kBAAkB,UAAU,gCAAgC,CAAC,CAAA;aAC9E;YACD,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,YAAY,CAAQ,CAAA;QAClD,CAAC,EACD,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CACjG,CAAA;QAjCD,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;QAChC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;CAgCF"}
1
+ {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/reactiveQueries/sql.ts"],"names":[],"mappings":"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"}