@livestore/livestore 0.3.0-dev.5 → 0.3.0-dev.50

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 (170) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/QueryCache.d.ts.map +1 -1
  3. package/dist/SqliteDbWrapper.d.ts +60 -0
  4. package/dist/SqliteDbWrapper.d.ts.map +1 -0
  5. package/dist/{SynchronousDatabaseWrapper.js → SqliteDbWrapper.js} +69 -34
  6. package/dist/SqliteDbWrapper.js.map +1 -0
  7. package/dist/effect/LiveStore.d.ts +6 -34
  8. package/dist/effect/LiveStore.d.ts.map +1 -1
  9. package/dist/effect/LiveStore.js +10 -12
  10. package/dist/effect/LiveStore.js.map +1 -1
  11. package/dist/effect/mod.d.ts +3 -0
  12. package/dist/effect/mod.d.ts.map +1 -0
  13. package/dist/effect/mod.js +3 -0
  14. package/dist/effect/mod.js.map +1 -0
  15. package/dist/internal/mod.d.ts +3 -0
  16. package/dist/internal/mod.d.ts.map +1 -0
  17. package/dist/internal/mod.js +3 -0
  18. package/dist/internal/mod.js.map +1 -0
  19. package/dist/live-queries/base-class.d.ts +65 -27
  20. package/dist/live-queries/base-class.d.ts.map +1 -1
  21. package/dist/live-queries/base-class.js +54 -13
  22. package/dist/live-queries/base-class.js.map +1 -1
  23. package/dist/live-queries/client-document-get-query.d.ts +12 -0
  24. package/dist/live-queries/client-document-get-query.d.ts.map +1 -0
  25. package/dist/live-queries/client-document-get-query.js +18 -0
  26. package/dist/live-queries/client-document-get-query.js.map +1 -0
  27. package/dist/live-queries/computed.d.ts +12 -14
  28. package/dist/live-queries/computed.d.ts.map +1 -1
  29. package/dist/live-queries/computed.js +37 -15
  30. package/dist/live-queries/computed.js.map +1 -1
  31. package/dist/live-queries/db-query.d.ts +93 -0
  32. package/dist/live-queries/db-query.d.ts.map +1 -0
  33. package/dist/live-queries/{db.js → db-query.js} +111 -40
  34. package/dist/live-queries/db-query.js.map +1 -0
  35. package/dist/live-queries/db-query.test.d.ts +2 -0
  36. package/dist/live-queries/db-query.test.d.ts.map +1 -0
  37. package/dist/live-queries/db-query.test.js +133 -0
  38. package/dist/live-queries/db-query.test.js.map +1 -0
  39. package/dist/live-queries/mod.d.ts +5 -0
  40. package/dist/live-queries/mod.d.ts.map +1 -0
  41. package/dist/live-queries/mod.js +5 -0
  42. package/dist/live-queries/mod.js.map +1 -0
  43. package/dist/live-queries/signal.d.ts +20 -0
  44. package/dist/live-queries/signal.d.ts.map +1 -0
  45. package/dist/live-queries/signal.js +33 -0
  46. package/dist/live-queries/signal.js.map +1 -0
  47. package/dist/live-queries/signal.test.d.ts +2 -0
  48. package/dist/live-queries/signal.test.d.ts.map +1 -0
  49. package/dist/live-queries/signal.test.js +25 -0
  50. package/dist/live-queries/signal.test.js.map +1 -0
  51. package/dist/mod.d.ts +14 -0
  52. package/dist/mod.d.ts.map +1 -0
  53. package/dist/mod.js +13 -0
  54. package/dist/mod.js.map +1 -0
  55. package/dist/reactive.d.ts +23 -17
  56. package/dist/reactive.d.ts.map +1 -1
  57. package/dist/reactive.js +23 -19
  58. package/dist/reactive.js.map +1 -1
  59. package/dist/reactive.test.js +1 -1
  60. package/dist/reactive.test.js.map +1 -1
  61. package/dist/store/create-store.d.ts +70 -12
  62. package/dist/store/create-store.d.ts.map +1 -1
  63. package/dist/store/create-store.js +68 -19
  64. package/dist/store/create-store.js.map +1 -1
  65. package/dist/store/devtools.d.ts +5 -4
  66. package/dist/store/devtools.d.ts.map +1 -1
  67. package/dist/store/devtools.js +92 -40
  68. package/dist/store/devtools.js.map +1 -1
  69. package/dist/store/store-types.d.ts +54 -42
  70. package/dist/store/store-types.d.ts.map +1 -1
  71. package/dist/store/store-types.js +2 -5
  72. package/dist/store/store-types.js.map +1 -1
  73. package/dist/store/store.d.ts +141 -35
  74. package/dist/store/store.d.ts.map +1 -1
  75. package/dist/store/store.js +319 -153
  76. package/dist/store/store.js.map +1 -1
  77. package/dist/utils/data-structures.d.ts.map +1 -1
  78. package/dist/utils/dev.d.ts.map +1 -1
  79. package/dist/utils/dev.js +6 -1
  80. package/dist/utils/dev.js.map +1 -1
  81. package/dist/utils/function-string.d.ts +7 -0
  82. package/dist/utils/function-string.d.ts.map +1 -0
  83. package/dist/utils/function-string.js +9 -0
  84. package/dist/utils/function-string.js.map +1 -0
  85. package/dist/utils/stack-info.d.ts.map +1 -1
  86. package/dist/utils/stack-info.js +6 -1
  87. package/dist/utils/stack-info.js.map +1 -1
  88. package/dist/utils/stack-info.test.js +54 -1
  89. package/dist/utils/stack-info.test.js.map +1 -1
  90. package/dist/utils/tests/fixture.d.ts +59 -216
  91. package/dist/utils/tests/fixture.d.ts.map +1 -1
  92. package/dist/utils/tests/fixture.js +23 -18
  93. package/dist/utils/tests/fixture.js.map +1 -1
  94. package/dist/utils/tests/mod.d.ts +1 -0
  95. package/dist/utils/tests/mod.d.ts.map +1 -1
  96. package/dist/utils/tests/mod.js +1 -0
  97. package/dist/utils/tests/mod.js.map +1 -1
  98. package/dist/utils/tests/otel.d.ts.map +1 -1
  99. package/dist/utils/tests/otel.js +8 -3
  100. package/dist/utils/tests/otel.js.map +1 -1
  101. package/package.json +29 -26
  102. package/src/{SynchronousDatabaseWrapper.ts → SqliteDbWrapper.ts} +92 -42
  103. package/src/effect/LiveStore.ts +27 -64
  104. package/src/effect/{index.ts → mod.ts} +2 -3
  105. package/src/internal/mod.ts +2 -0
  106. package/src/live-queries/__snapshots__/{db.test.ts.snap → db-query.test.ts.snap} +241 -45
  107. package/src/live-queries/base-class.ts +152 -50
  108. package/src/live-queries/client-document-get-query.ts +52 -0
  109. package/src/live-queries/computed.ts +51 -33
  110. package/src/live-queries/db-query.test.ts +192 -0
  111. package/src/live-queries/{db.ts → db-query.ts} +168 -81
  112. package/src/live-queries/mod.ts +4 -0
  113. package/src/live-queries/signal.test.ts +40 -0
  114. package/src/live-queries/signal.ts +47 -0
  115. package/src/mod.ts +42 -0
  116. package/src/reactive.test.ts +1 -1
  117. package/src/reactive.ts +66 -43
  118. package/src/store/create-store.ts +188 -62
  119. package/src/store/devtools.ts +124 -46
  120. package/src/store/store-types.ts +54 -43
  121. package/src/store/store.ts +454 -236
  122. package/src/utils/dev.ts +6 -1
  123. package/src/utils/function-string.ts +12 -0
  124. package/src/utils/stack-info.test.ts +58 -1
  125. package/src/utils/stack-info.ts +6 -1
  126. package/src/utils/tests/fixture.ts +22 -31
  127. package/src/utils/tests/mod.ts +1 -0
  128. package/src/utils/tests/otel.ts +10 -3
  129. package/dist/SynchronousDatabaseWrapper.d.ts +0 -41
  130. package/dist/SynchronousDatabaseWrapper.d.ts.map +0 -1
  131. package/dist/SynchronousDatabaseWrapper.js.map +0 -1
  132. package/dist/effect/index.d.ts +0 -2
  133. package/dist/effect/index.d.ts.map +0 -1
  134. package/dist/effect/index.js +0 -2
  135. package/dist/effect/index.js.map +0 -1
  136. package/dist/global-state.d.ts +0 -14
  137. package/dist/global-state.d.ts.map +0 -1
  138. package/dist/global-state.js +0 -16
  139. package/dist/global-state.js.map +0 -1
  140. package/dist/index.d.ts +0 -20
  141. package/dist/index.d.ts.map +0 -1
  142. package/dist/index.js +0 -16
  143. package/dist/index.js.map +0 -1
  144. package/dist/live-queries/db.d.ts +0 -66
  145. package/dist/live-queries/db.d.ts.map +0 -1
  146. package/dist/live-queries/db.js.map +0 -1
  147. package/dist/live-queries/db.test.d.ts +0 -2
  148. package/dist/live-queries/db.test.d.ts.map +0 -1
  149. package/dist/live-queries/db.test.js +0 -118
  150. package/dist/live-queries/db.test.js.map +0 -1
  151. package/dist/live-queries/graphql.d.ts +0 -49
  152. package/dist/live-queries/graphql.d.ts.map +0 -1
  153. package/dist/live-queries/graphql.js +0 -122
  154. package/dist/live-queries/graphql.js.map +0 -1
  155. package/dist/row-query-utils.d.ts +0 -17
  156. package/dist/row-query-utils.d.ts.map +0 -1
  157. package/dist/row-query-utils.js +0 -30
  158. package/dist/row-query-utils.js.map +0 -1
  159. package/dist/utils/otel.d.ts +0 -4
  160. package/dist/utils/otel.d.ts.map +0 -1
  161. package/dist/utils/otel.js +0 -6
  162. package/dist/utils/otel.js.map +0 -1
  163. package/src/global-state.ts +0 -20
  164. package/src/index.ts +0 -66
  165. package/src/live-queries/db.test.ts +0 -154
  166. package/src/live-queries/graphql.ts +0 -219
  167. package/src/row-query-utils.ts +0 -65
  168. package/src/utils/otel.ts +0 -9
  169. package/tsconfig.json +0 -18
  170. package/vitest.config.js +0 -9
@@ -1,118 +0,0 @@
1
- import { Effect, Schema } from '@livestore/utils/effect';
2
- import * as otel from '@opentelemetry/api';
3
- import { BasicTracerProvider, InMemorySpanExporter, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base';
4
- import { describe, expect, it } from 'vitest';
5
- import { computed, queryDb, rawSqlMutation, sql } from '../index.js';
6
- import { makeTodoMvc, tables } from '../utils/tests/fixture.js';
7
- import { getSimplifiedRootSpan } from '../utils/tests/otel.js';
8
- /*
9
- TODO write tests for:
10
-
11
- - sql queries without and with `map` (incl. callback and schemas)
12
- - optional and explicit `queriedTables` argument
13
- */
14
- describe('otel', () => {
15
- let cachedProvider;
16
- const makeQuery = Effect.gen(function* () {
17
- const exporter = new InMemorySpanExporter();
18
- // const provider = cachedProvider ?? new BasicTracerProvider({ spanProcessors: [new SimpleSpanProcessor(exporter)] })
19
- const provider = cachedProvider ?? new BasicTracerProvider();
20
- cachedProvider = provider;
21
- provider.addSpanProcessor(new SimpleSpanProcessor(exporter));
22
- provider.register();
23
- const otelTracer = otel.trace.getTracer('test');
24
- const span = otelTracer.startSpan('test-root');
25
- const otelContext = otel.trace.setSpan(otel.context.active(), span);
26
- const { store } = yield* makeTodoMvc({ otelTracer, otelContext });
27
- return {
28
- store,
29
- otelTracer,
30
- exporter,
31
- span,
32
- provider,
33
- };
34
- });
35
- it('otel', async () => {
36
- const { exporter } = await Effect.gen(function* () {
37
- const { store, exporter, span } = yield* makeQuery;
38
- const query$ = queryDb({
39
- query: `select * from todos`,
40
- schema: Schema.Array(tables.todos.schema),
41
- queriedTables: new Set(['todos']),
42
- });
43
- expect(query$.run()).toMatchInlineSnapshot('[]');
44
- store.mutate(rawSqlMutation({ sql: sql `INSERT INTO todos (id, text, completed) VALUES ('t1', 'buy milk', 0)` }));
45
- expect(query$.run()).toMatchInlineSnapshot(`
46
- [
47
- {
48
- "completed": false,
49
- "id": "t1",
50
- "text": "buy milk",
51
- },
52
- ]
53
- `);
54
- query$.destroy();
55
- span.end();
56
- return { exporter };
57
- }).pipe(Effect.scoped, Effect.tapCauseLogPretty, Effect.runPromise);
58
- expect(getSimplifiedRootSpan(exporter)).toMatchSnapshot();
59
- });
60
- it('with thunks', async () => {
61
- const { exporter } = await Effect.gen(function* () {
62
- const { store, exporter, span } = yield* makeQuery;
63
- const defaultTodo = { id: '', text: '', completed: false };
64
- const filter = computed(() => `where completed = 0`, { label: 'where-filter' });
65
- const query$ = queryDb((get) => ({
66
- query: `select * from todos ${get(filter)}`,
67
- schema: Schema.Array(tables.todos.schema).pipe(Schema.headOrElse(() => defaultTodo)),
68
- }), { label: 'all todos' });
69
- expect(query$.run()).toMatchInlineSnapshot(`
70
- {
71
- "completed": false,
72
- "id": "",
73
- "text": "",
74
- }
75
- `);
76
- store.mutate(rawSqlMutation({ sql: sql `INSERT INTO todos (id, text, completed) VALUES ('t1', 'buy milk', 0)` }));
77
- expect(query$.run()).toMatchInlineSnapshot(`
78
- {
79
- "completed": false,
80
- "id": "t1",
81
- "text": "buy milk",
82
- }
83
- `);
84
- query$.destroy();
85
- span.end();
86
- return { exporter };
87
- }).pipe(Effect.scoped, Effect.tapCauseLogPretty, Effect.runPromise);
88
- expect(getSimplifiedRootSpan(exporter)).toMatchSnapshot();
89
- });
90
- it('with thunks with query builder and without labels', async () => {
91
- const { exporter } = await Effect.gen(function* () {
92
- const { store, exporter, span } = yield* makeQuery;
93
- const defaultTodo = { id: '', text: '', completed: false };
94
- const filter = computed(() => ({ completed: false }));
95
- const query$ = queryDb((get) => tables.todos.query.where(get(filter)).first({ fallback: () => defaultTodo }));
96
- expect(query$.run()).toMatchInlineSnapshot(`
97
- {
98
- "completed": false,
99
- "id": "",
100
- "text": "",
101
- }
102
- `);
103
- store.mutate(rawSqlMutation({ sql: sql `INSERT INTO todos (id, text, completed) VALUES ('t1', 'buy milk', 0)` }));
104
- expect(query$.run()).toMatchInlineSnapshot(`
105
- {
106
- "completed": false,
107
- "id": "t1",
108
- "text": "buy milk",
109
- }
110
- `);
111
- query$.destroy();
112
- span.end();
113
- return { exporter };
114
- }).pipe(Effect.scoped, Effect.tapCauseLogPretty, Effect.runPromise);
115
- expect(getSimplifiedRootSpan(exporter)).toMatchSnapshot();
116
- });
117
- });
118
- //# sourceMappingURL=db.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"db.test.js","sourceRoot":"","sources":["../../src/live-queries/db.test.ts"],"names":[],"mappings":"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"}
@@ -1,49 +0,0 @@
1
- import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';
2
- import type { QueryInfo } from '@livestore/common';
3
- import { Schema } from '@livestore/utils/effect';
4
- import * as otel from '@opentelemetry/api';
5
- import * as graphql from 'graphql';
6
- import { type Thunk } from '../reactive.js';
7
- import type { Store } from '../store/store.js';
8
- import type { BaseGraphQLContext, RefreshReason } from '../store/store-types.js';
9
- import type { GetAtomResult, LiveQuery, QueryContext, ReactivityGraph } from './base-class.js';
10
- import { LiveStoreQueryBase } from './base-class.js';
11
- export type MapResult<To, From> = ((res: From, get: GetAtomResult) => To) | Schema.Schema<To, From>;
12
- export declare const queryGraphQL: <TResult extends Record<string, any>, TVariableValues extends Record<string, any>, TResultMapped extends Record<string, any> = TResult>(document: DocumentNode<TResult, TVariableValues>, genVariableValues: TVariableValues | ((get: GetAtomResult) => TVariableValues), { label, reactivityGraph, map, }?: {
13
- label?: string;
14
- reactivityGraph?: ReactivityGraph;
15
- map?: MapResult<TResultMapped, TResult>;
16
- }) => LiveQuery<TResultMapped, QueryInfo.None>;
17
- export declare class LiveStoreGraphQLQuery<TResult extends Record<string, any>, TVariableValues extends Record<string, any>, TContext extends BaseGraphQLContext, TResultMapped extends Record<string, any> = TResult> extends LiveStoreQueryBase<TResultMapped, QueryInfo.None> {
18
- _tag: 'graphql';
19
- /** The abstract GraphQL query */
20
- document: DocumentNode<TResult, TVariableValues>;
21
- /** A reactive thunk representing the query results */
22
- results$: Thunk<TResultMapped, QueryContext, RefreshReason>;
23
- variableValues$: Thunk<TVariableValues, QueryContext, RefreshReason> | undefined;
24
- label: string;
25
- protected reactivityGraph: ReactivityGraph;
26
- queryInfo: QueryInfo.None;
27
- private mapResult;
28
- constructor({ document, label, genVariableValues, reactivityGraph, map, }: {
29
- document: DocumentNode<TResult, TVariableValues>;
30
- genVariableValues: TVariableValues | ((get: GetAtomResult) => TVariableValues);
31
- label?: string;
32
- reactivityGraph?: ReactivityGraph;
33
- map?: MapResult<TResultMapped, TResult>;
34
- });
35
- queryOnce: ({ document, otelContext, otelTracer, variableValues, store, get, }: {
36
- document: graphql.DocumentNode;
37
- otelContext: otel.Context;
38
- otelTracer: otel.Tracer;
39
- variableValues: TVariableValues;
40
- store: Store<TContext>;
41
- get: GetAtomResult;
42
- }) => {
43
- result: TResultMapped;
44
- queriedTables: string[];
45
- durationMs: number;
46
- };
47
- destroy: () => void;
48
- }
49
- //# sourceMappingURL=graphql.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"graphql.d.ts","sourceRoot":"","sources":["../../src/live-queries/graphql.ts"],"names":[],"mappings":"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"}
@@ -1,122 +0,0 @@
1
- import { shouldNeverHappen } from '@livestore/utils';
2
- import { Schema, TreeFormatter } from '@livestore/utils/effect';
3
- import * as otel from '@opentelemetry/api';
4
- import * as graphql from 'graphql';
5
- import { globalReactivityGraph } from '../global-state.js';
6
- import { isThunk } from '../reactive.js';
7
- import { getDurationMsFromSpan } from '../utils/otel.js';
8
- import { LiveStoreQueryBase, makeGetAtomResult } from './base-class.js';
9
- export const queryGraphQL = (document, genVariableValues, { label, reactivityGraph, map, } = {}) => new LiveStoreGraphQLQuery({ document, genVariableValues, label, reactivityGraph, map });
10
- export class LiveStoreGraphQLQuery extends LiveStoreQueryBase {
11
- _tag = 'graphql';
12
- /** The abstract GraphQL query */
13
- document;
14
- /** A reactive thunk representing the query results */
15
- results$;
16
- variableValues$;
17
- label;
18
- reactivityGraph;
19
- queryInfo = { _tag: 'None' };
20
- mapResult;
21
- constructor({ document, label, genVariableValues, reactivityGraph, map, }) {
22
- super();
23
- const labelWithDefault = label ?? graphql.getOperationAST(document)?.name?.value ?? 'graphql';
24
- this.label = labelWithDefault;
25
- this.document = document;
26
- this.reactivityGraph = reactivityGraph ?? globalReactivityGraph;
27
- this.mapResult =
28
- map === undefined
29
- ? (res) => res
30
- : Schema.isSchema(map)
31
- ? (res) => {
32
- const parseResult = Schema.decodeEither(map)(res);
33
- if (parseResult._tag === 'Left') {
34
- console.error(`Error parsing GraphQL query result: ${TreeFormatter.formatErrorSync(parseResult.left)}`);
35
- return shouldNeverHappen(`Error parsing SQL query result: ${parseResult.left}`);
36
- }
37
- else {
38
- return parseResult.right;
39
- }
40
- }
41
- : typeof map === 'function'
42
- ? map
43
- : shouldNeverHappen(`Invalid map function ${map}`);
44
- // TODO don't even create a thunk if variables are static
45
- let variableValues$OrvariableValues;
46
- if (typeof genVariableValues === 'function') {
47
- variableValues$OrvariableValues = this.reactivityGraph.makeThunk((get, _setDebugInfo, { rootOtelContext }, otelContext) => {
48
- return genVariableValues(makeGetAtomResult(get, otelContext ?? rootOtelContext));
49
- }, { label: `${labelWithDefault}:variableValues`, meta: { liveStoreThunkType: 'graphql.variables' } });
50
- this.variableValues$ = variableValues$OrvariableValues;
51
- }
52
- else {
53
- variableValues$OrvariableValues = genVariableValues;
54
- }
55
- const resultsLabel = `${labelWithDefault}:results`;
56
- this.results$ = this.reactivityGraph.makeThunk((get, setDebugInfo, { store, otelTracer, rootOtelContext }, otelContext) => {
57
- const variableValues = isThunk(variableValues$OrvariableValues)
58
- ? get(variableValues$OrvariableValues)
59
- : variableValues$OrvariableValues;
60
- const { result, queriedTables, durationMs } = this.queryOnce({
61
- document,
62
- variableValues,
63
- otelContext: otelContext ?? rootOtelContext,
64
- otelTracer,
65
- store: store,
66
- get: makeGetAtomResult(get, otelContext ?? rootOtelContext),
67
- });
68
- // Add dependencies on any tables that were used
69
- for (const tableName of queriedTables) {
70
- const tableRef = store.tableRefs[tableName] ?? shouldNeverHappen(`No table ref found for ${tableName}`);
71
- get(tableRef);
72
- }
73
- setDebugInfo({ _tag: 'graphql', label: resultsLabel, query: graphql.print(document), durationMs });
74
- return result;
75
- }, { label: resultsLabel, meta: { liveStoreThunkType: 'graphql.result' } });
76
- }
77
- queryOnce = ({ document, otelContext, otelTracer, variableValues, store, get, }) => {
78
- const schema = store.graphQLSchema ?? shouldNeverHappen("Can't run a GraphQL query on a store without GraphQL schema");
79
- const context = store.graphQLContext ?? shouldNeverHappen("Can't run a GraphQL query on a store without GraphQL context");
80
- const operationName = graphql.getOperationAST(document)?.name?.value;
81
- return otelTracer.startActiveSpan(`executeGraphQLQuery: ${operationName}`, {}, otelContext, (span) => {
82
- span.setAttribute('graphql.variables', JSON.stringify(variableValues));
83
- span.setAttribute('graphql.query', graphql.print(document));
84
- context.queriedTables.clear();
85
- context.otelContext = otel.trace.setSpan(otel.context.active(), span);
86
- const res = graphql.executeSync({
87
- document,
88
- contextValue: context,
89
- schema: schema,
90
- variableValues,
91
- });
92
- // TODO track number of nested SQL queries via Otel + debug info
93
- if (res.errors) {
94
- span.setStatus({ code: otel.SpanStatusCode.ERROR, message: 'GraphQL error' });
95
- span.setAttribute('graphql.error', res.errors.join('\n'));
96
- span.setAttribute('graphql.error-detail', JSON.stringify(res.errors));
97
- console.error(`graphql error (${operationName}) - ${res.errors.length} errors`);
98
- for (const error of res.errors) {
99
- console.error(error);
100
- }
101
- debugger;
102
- shouldNeverHappen(`GraphQL error: ${res.errors.join('\n')}`);
103
- }
104
- span.end();
105
- const result = this.mapResult(res.data, get);
106
- const durationMs = getDurationMsFromSpan(span);
107
- this.executionTimes.push(durationMs);
108
- return {
109
- result,
110
- queriedTables: Array.from(context.queriedTables.values()),
111
- durationMs,
112
- };
113
- });
114
- };
115
- destroy = () => {
116
- if (this.variableValues$ !== undefined) {
117
- this.reactivityGraph.destroyNode(this.variableValues$);
118
- }
119
- this.reactivityGraph.destroyNode(this.results$);
120
- };
121
- }
122
- //# sourceMappingURL=graphql.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"graphql.js","sourceRoot":"","sources":["../../src/live-queries/graphql.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- import type { QueryInfo } from '@livestore/common';
2
- import { SessionIdSymbol } from '@livestore/common';
3
- import { DbSchema } from '@livestore/common/schema';
4
- import type * as otel from '@opentelemetry/api';
5
- import type { LiveQuery, QueryContext } from './live-queries/base-class.js';
6
- export declare const rowQueryLabel: (table: DbSchema.TableDefBase, id: string | SessionIdSymbol | undefined) => string;
7
- export declare const deriveColQuery: {
8
- <TQuery extends LiveQuery<any, QueryInfo.None>, TCol extends keyof TQuery['__result!'] & string>(query$: TQuery, colName: TCol): LiveQuery<TQuery['__result!'][TCol], QueryInfo.None>;
9
- <TQuery extends LiveQuery<any, QueryInfo.Row>, TCol extends keyof TQuery['__result!'] & string>(query$: TQuery, colName: TCol): LiveQuery<TQuery['__result!'][TCol], QueryInfo.Col>;
10
- };
11
- export declare const makeExecBeforeFirstRun: ({ id, insertValues, table, otelContext: otelContext_, }: {
12
- id?: string | SessionIdSymbol;
13
- insertValues?: any;
14
- table: DbSchema.TableDefBase;
15
- otelContext: otel.Context | undefined;
16
- }) => ({ store }: QueryContext) => undefined;
17
- //# sourceMappingURL=row-query-utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"row-query-utils.d.ts","sourceRoot":"","sources":["../src/row-query-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAsB,SAAS,EAAE,MAAM,mBAAmB,CAAA;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAEnD,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE/C,OAAO,KAAK,EAAE,SAAS,EAAgB,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAGzF,eAAO,MAAM,aAAa,UAAW,QAAQ,CAAC,YAAY,MAAM,MAAM,GAAG,eAAe,GAAG,SAAS,WACM,CAAA;AAE1G,eAAO,MAAM,cAAc,EAAE;IAC3B,CAAC,MAAM,SAAS,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,SAAS,MAAM,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,EAC7F,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,IAAI,GACZ,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;IACvD,CAAC,MAAM,SAAS,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,SAAS,MAAM,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,EAC5F,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,IAAI,GACZ,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAA;CASvD,CAAA;AAED,eAAO,MAAM,sBAAsB,4DAM9B;IACD,EAAE,CAAC,EAAE,MAAM,GAAG,eAAe,CAAA;IAC7B,YAAY,CAAC,EAAE,GAAG,CAAA;IAClB,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAA;IAC5B,WAAW,EAAE,IAAI,CAAC,OAAO,GAAG,SAAS,CAAA;CACtC,iBACW,YAAY,cAqBvB,CAAA"}
@@ -1,30 +0,0 @@
1
- import { SessionIdSymbol } from '@livestore/common';
2
- import { DbSchema } from '@livestore/common/schema';
3
- import { shouldNeverHappen } from '@livestore/utils';
4
- import { computed } from './live-queries/computed.js';
5
- export const rowQueryLabel = (table, id) => `row:${table.sqliteDef.name}${id === undefined ? '' : id === SessionIdSymbol ? `:sessionId` : `:${id}`}`;
6
- export const deriveColQuery = (query$, colName) => {
7
- return computed((get) => get(query$)[colName], {
8
- label: `deriveColQuery:${query$.label}:${colName}`,
9
- queryInfo: query$.queryInfo._tag === 'Row'
10
- ? { _tag: 'Col', table: query$.queryInfo.table, column: colName, id: query$.queryInfo.id }
11
- : undefined,
12
- });
13
- };
14
- export const makeExecBeforeFirstRun = ({ id, insertValues, table, otelContext: otelContext_, }) => ({ store }) => {
15
- const otelContext = otelContext_ ?? store.otel.queriesSpanContext;
16
- if (table.options.isSingleton === false) {
17
- const idStr = id === SessionIdSymbol ? store.sessionId : id;
18
- const rowExists = store.syncDbWrapper.select(`SELECT 1 FROM '${table.sqliteDef.name}' WHERE id = ?`, {
19
- bindValues: [idStr],
20
- }).length === 1;
21
- if (rowExists)
22
- return;
23
- if (DbSchema.tableHasDerivedMutations(table) === false) {
24
- return shouldNeverHappen(`Cannot insert row for table "${table.sqliteDef.name}" which does not have 'deriveMutations: true' set`);
25
- }
26
- // NOTE It's important that we only mutate and don't refresh here, as this function is called during a render
27
- store.mutate({ otelContext, skipRefresh: true }, table.insert({ id, ...insertValues }));
28
- }
29
- };
30
- //# sourceMappingURL=row-query-utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"row-query-utils.js","sourceRoot":"","sources":["../src/row-query-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAIpD,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAErD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAA4B,EAAE,EAAwC,EAAE,EAAE,CACtG,OAAO,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAA;AAE1G,MAAM,CAAC,MAAM,cAAc,GASvB,CAAC,MAAoB,EAAE,OAAe,EAAE,EAAE;IAC5C,OAAO,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE;QAC7C,KAAK,EAAE,kBAAkB,MAAM,CAAC,KAAK,IAAI,OAAO,EAAE;QAClD,SAAS,EACP,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,KAAK;YAC7B,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE;YAC1F,CAAC,CAAC,SAAS;KAChB,CAAQ,CAAA;AACX,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,sBAAsB,GACjC,CAAC,EACC,EAAE,EACF,YAAY,EACZ,KAAK,EACL,WAAW,EAAE,YAAY,GAM1B,EAAE,EAAE,CACL,CAAC,EAAE,KAAK,EAAgB,EAAE,EAAE;IAC1B,MAAM,WAAW,GAAG,YAAY,IAAI,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAA;IAEjE,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,EAAE,KAAK,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAG,CAAA;QAC5D,MAAM,SAAS,GACb,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,kBAAkB,KAAK,CAAC,SAAS,CAAC,IAAI,gBAAgB,EAAE;YACjF,UAAU,EAAE,CAAC,KAAK,CAA8B;SACjD,CAAC,CAAC,MAAM,KAAK,CAAC,CAAA;QAEjB,IAAI,SAAS;YAAE,OAAM;QAErB,IAAI,QAAQ,CAAC,wBAAwB,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE,CAAC;YACvD,OAAO,iBAAiB,CACtB,gCAAgC,KAAK,CAAC,SAAS,CAAC,IAAI,mDAAmD,CACxG,CAAA;QACH,CAAC;QAED,6GAA6G;QAC7G,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,YAAY,EAAE,CAAC,CAAC,CAAA;IACzF,CAAC;AACH,CAAC,CAAA"}
@@ -1,4 +0,0 @@
1
- import type * as otel from '@opentelemetry/api';
2
- export declare const getDurationMsFromSpan: (span: otel.Span) => number;
3
- export declare const getStartTimeHighResFromSpan: (span: otel.Span) => DOMHighResTimeStamp;
4
- //# sourceMappingURL=otel.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../../src/utils/otel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE/C,eAAO,MAAM,qBAAqB,SAAU,IAAI,CAAC,IAAI,KAAG,MAGvD,CAAA;AAED,eAAO,MAAM,2BAA2B,SAAU,IAAI,CAAC,IAAI,KAAG,mBACF,CAAA"}
@@ -1,6 +0,0 @@
1
- export const getDurationMsFromSpan = (span) => {
2
- const durationHr = span._duration;
3
- return durationHr[0] * 1000 + durationHr[1] / 1_000_000;
4
- };
5
- export const getStartTimeHighResFromSpan = (span) => span._performanceStartTime;
6
- //# sourceMappingURL=otel.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"otel.js","sourceRoot":"","sources":["../../src/utils/otel.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,IAAe,EAAU,EAAE;IAC/D,MAAM,UAAU,GAAsC,IAAY,CAAC,SAAS,CAAA;IAC5E,OAAO,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,CAAA;AACzD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,IAAe,EAAuB,EAAE,CACjF,IAAY,CAAC,qBAA4C,CAAA"}
@@ -1,20 +0,0 @@
1
- /**
2
- *
3
- * LiveStore currently relies on some global state in order to simplify the end-user API.
4
- * This however also has the downside that LiveStore can't be used in multiple instances in the same app.
5
- * It could possibly also lead to some other problems.
6
- *
7
- * We should find some better way to do this and ideally remove this global state.
8
- *
9
- * Another approach could be to use the global state by default but provide an additional way to let the user
10
- * explicitly pass instances of state below into the LiveStore constructors.
11
- *
12
- */
13
-
14
- import { GlobalValue } from '@livestore/utils/effect'
15
-
16
- import { makeReactivityGraph } from './live-queries/base-class.js'
17
-
18
- export const globalReactivityGraph = GlobalValue.globalValue('livestore-global-reactivityGraph', () =>
19
- makeReactivityGraph(),
20
- )
package/src/index.ts DELETED
@@ -1,66 +0,0 @@
1
- export { Store } from './store/store.js'
2
- export { createStore, createStorePromise, type CreateStoreOptions } from './store/create-store.js'
3
- export type {
4
- BaseGraphQLContext,
5
- QueryDebugInfo,
6
- RefreshReason,
7
- GraphQLOptions,
8
- OtelOptions,
9
- } from './store/store-types.js'
10
-
11
- export type { LiveStoreContextRunning } from './effect/LiveStore.js'
12
- export { StoreAbort, StoreInterrupted, type LiveStoreContext, type ShutdownDeferred } from './store/store-types.js'
13
-
14
- export { SynchronousDatabaseWrapper, emptyDebugInfo } from './SynchronousDatabaseWrapper.js'
15
-
16
- export type {
17
- GetAtom,
18
- AtomDebugInfo,
19
- RefreshDebugInfo,
20
- ReactiveGraphSnapshot,
21
- SerializedAtom,
22
- SerializedEffect,
23
- Atom,
24
- Node,
25
- Ref,
26
- Effect,
27
- } from './reactive.js'
28
- export { LiveStoreComputedQuery, computed } from './live-queries/computed.js'
29
- export { LiveStoreDbQuery, queryDb } from './live-queries/db.js'
30
- export { LiveStoreGraphQLQuery, queryGraphQL } from './live-queries/graphql.js'
31
- export {
32
- type GetAtomResult,
33
- type ReactivityGraph,
34
- makeReactivityGraph,
35
- type LiveQuery,
36
- type GetResult,
37
- type LiveQueryAny,
38
- } from './live-queries/base-class.js'
39
-
40
- export { globalReactivityGraph } from './global-state.js'
41
-
42
- export { deriveColQuery } from './row-query-utils.js'
43
-
44
- export * from '@livestore/common/schema'
45
- export {
46
- sql,
47
- SessionIdSymbol,
48
- type BootStatus,
49
- type SynchronousDatabase,
50
- type DebugInfo,
51
- type MutableDebugInfo,
52
- prepareBindValues,
53
- type Bindable,
54
- type PreparedBindValues,
55
- type QueryBuilderAst,
56
- type QueryBuilder,
57
- type RowQuery,
58
- } from '@livestore/common'
59
-
60
- export { SqliteAst, SqliteDsl } from '@livestore/db-schema'
61
-
62
- export { deepEqual } from '@livestore/utils'
63
-
64
- export * from './utils/stack-info.js'
65
-
66
- export type { ClientSession, Adapter, PreparedStatement } from '@livestore/common'
@@ -1,154 +0,0 @@
1
- import { Effect, Schema } from '@livestore/utils/effect'
2
- import * as otel from '@opentelemetry/api'
3
- import { BasicTracerProvider, InMemorySpanExporter, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base'
4
- import { describe, expect, it } from 'vitest'
5
-
6
- import { computed, queryDb, rawSqlMutation, sql } from '../index.js'
7
- import { makeTodoMvc, tables } from '../utils/tests/fixture.js'
8
- import { getSimplifiedRootSpan } from '../utils/tests/otel.js'
9
-
10
- /*
11
- TODO write tests for:
12
-
13
- - sql queries without and with `map` (incl. callback and schemas)
14
- - optional and explicit `queriedTables` argument
15
- */
16
-
17
- describe('otel', () => {
18
- let cachedProvider: BasicTracerProvider | undefined
19
-
20
- const makeQuery = Effect.gen(function* () {
21
- const exporter = new InMemorySpanExporter()
22
-
23
- // const provider = cachedProvider ?? new BasicTracerProvider({ spanProcessors: [new SimpleSpanProcessor(exporter)] })
24
- const provider = cachedProvider ?? new BasicTracerProvider()
25
- cachedProvider = provider
26
- provider.addSpanProcessor(new SimpleSpanProcessor(exporter))
27
- provider.register()
28
-
29
- const otelTracer = otel.trace.getTracer('test')
30
-
31
- const span = otelTracer.startSpan('test-root')
32
- const otelContext = otel.trace.setSpan(otel.context.active(), span)
33
-
34
- const { store } = yield* makeTodoMvc({ otelTracer, otelContext })
35
-
36
- return {
37
- store,
38
- otelTracer,
39
- exporter,
40
- span,
41
- provider,
42
- }
43
- })
44
-
45
- it('otel', async () => {
46
- const { exporter } = await Effect.gen(function* () {
47
- const { store, exporter, span } = yield* makeQuery
48
-
49
- const query$ = queryDb({
50
- query: `select * from todos`,
51
- schema: Schema.Array(tables.todos.schema),
52
- queriedTables: new Set(['todos']),
53
- })
54
- expect(query$.run()).toMatchInlineSnapshot('[]')
55
-
56
- store.mutate(rawSqlMutation({ sql: sql`INSERT INTO todos (id, text, completed) VALUES ('t1', 'buy milk', 0)` }))
57
-
58
- expect(query$.run()).toMatchInlineSnapshot(`
59
- [
60
- {
61
- "completed": false,
62
- "id": "t1",
63
- "text": "buy milk",
64
- },
65
- ]
66
- `)
67
-
68
- query$.destroy()
69
- span.end()
70
-
71
- return { exporter }
72
- }).pipe(Effect.scoped, Effect.tapCauseLogPretty, Effect.runPromise)
73
-
74
- expect(getSimplifiedRootSpan(exporter)).toMatchSnapshot()
75
- })
76
-
77
- it('with thunks', async () => {
78
- const { exporter } = await Effect.gen(function* () {
79
- const { store, exporter, span } = yield* makeQuery
80
-
81
- const defaultTodo = { id: '', text: '', completed: false }
82
-
83
- const filter = computed(() => `where completed = 0`, { label: 'where-filter' })
84
- const query$ = queryDb(
85
- (get) => ({
86
- query: `select * from todos ${get(filter)}`,
87
- schema: Schema.Array(tables.todos.schema).pipe(Schema.headOrElse(() => defaultTodo)),
88
- }),
89
- { label: 'all todos' },
90
- )
91
-
92
- expect(query$.run()).toMatchInlineSnapshot(`
93
- {
94
- "completed": false,
95
- "id": "",
96
- "text": "",
97
- }
98
- `)
99
-
100
- store.mutate(rawSqlMutation({ sql: sql`INSERT INTO todos (id, text, completed) VALUES ('t1', 'buy milk', 0)` }))
101
-
102
- expect(query$.run()).toMatchInlineSnapshot(`
103
- {
104
- "completed": false,
105
- "id": "t1",
106
- "text": "buy milk",
107
- }
108
- `)
109
-
110
- query$.destroy()
111
- span.end()
112
-
113
- return { exporter }
114
- }).pipe(Effect.scoped, Effect.tapCauseLogPretty, Effect.runPromise)
115
-
116
- expect(getSimplifiedRootSpan(exporter)).toMatchSnapshot()
117
- })
118
-
119
- it('with thunks with query builder and without labels', async () => {
120
- const { exporter } = await Effect.gen(function* () {
121
- const { store, exporter, span } = yield* makeQuery
122
-
123
- const defaultTodo = { id: '', text: '', completed: false }
124
-
125
- const filter = computed(() => ({ completed: false }))
126
- const query$ = queryDb((get) => tables.todos.query.where(get(filter)).first({ fallback: () => defaultTodo }))
127
-
128
- expect(query$.run()).toMatchInlineSnapshot(`
129
- {
130
- "completed": false,
131
- "id": "",
132
- "text": "",
133
- }
134
- `)
135
-
136
- store.mutate(rawSqlMutation({ sql: sql`INSERT INTO todos (id, text, completed) VALUES ('t1', 'buy milk', 0)` }))
137
-
138
- expect(query$.run()).toMatchInlineSnapshot(`
139
- {
140
- "completed": false,
141
- "id": "t1",
142
- "text": "buy milk",
143
- }
144
- `)
145
-
146
- query$.destroy()
147
- span.end()
148
-
149
- return { exporter }
150
- }).pipe(Effect.scoped, Effect.tapCauseLogPretty, Effect.runPromise)
151
-
152
- expect(getSimplifiedRootSpan(exporter)).toMatchSnapshot()
153
- })
154
- })