@livestore/livestore 0.0.25 → 0.0.27
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/dist/.tsbuildinfo +1 -1
- package/dist/QueryCache.d.ts +1 -1
- package/dist/QueryCache.d.ts.map +1 -1
- package/dist/QueryCache.js +50 -60
- package/dist/QueryCache.js.map +1 -1
- package/dist/__tests__/react/fixture.d.ts +21 -6
- package/dist/__tests__/react/fixture.d.ts.map +1 -1
- package/dist/__tests__/react/fixture.js +13 -14
- package/dist/__tests__/react/fixture.js.map +1 -1
- package/dist/__tests__/react/useQuery.test.js +5 -5
- package/dist/__tests__/react/useQuery.test.js.map +1 -1
- package/dist/__tests__/react/useRow.test.d.ts +2 -0
- package/dist/__tests__/react/useRow.test.d.ts.map +1 -0
- package/dist/__tests__/react/{useComponentState.test.js → useRow.test.js} +21 -26
- package/dist/__tests__/react/useRow.test.js.map +1 -0
- package/dist/__tests__/react/utils/stack-info.test.js +32 -0
- package/dist/__tests__/react/utils/stack-info.test.js.map +1 -1
- package/dist/__tests__/reactiveQueries/sql.test.js +4 -4
- package/dist/__tests__/reactiveQueries/sql.test.js.map +1 -1
- package/dist/effect/LiveStore.d.ts +3 -3
- package/dist/effect/LiveStore.d.ts.map +1 -1
- package/dist/effect/LiveStore.js +1 -1
- package/dist/effect/LiveStore.js.map +1 -1
- package/dist/global-state.d.ts +19 -0
- package/dist/global-state.d.ts.map +1 -0
- package/dist/global-state.js +20 -0
- package/dist/global-state.js.map +1 -0
- package/dist/inMemoryDatabase.d.ts +3 -3
- package/dist/inMemoryDatabase.d.ts.map +1 -1
- package/dist/inMemoryDatabase.js +13 -7
- package/dist/inMemoryDatabase.js.map +1 -1
- package/dist/index.d.ts +5 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -5
- package/dist/index.js.map +1 -1
- package/dist/migrations.d.ts +4 -4
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +34 -28
- package/dist/migrations.js.map +1 -1
- package/dist/react/LiveStoreContext.js.map +1 -1
- package/dist/react/LiveStoreProvider.d.ts +2 -2
- package/dist/react/LiveStoreProvider.d.ts.map +1 -1
- package/dist/react/LiveStoreProvider.js.map +1 -1
- package/dist/react/index.d.ts +1 -2
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +1 -1
- package/dist/react/index.js.map +1 -1
- package/dist/react/useQuery.d.ts +3 -0
- package/dist/react/useQuery.d.ts.map +1 -1
- package/dist/react/useQuery.js +5 -4
- package/dist/react/useQuery.js.map +1 -1
- package/dist/react/useRow.d.ts +33 -0
- package/dist/react/useRow.d.ts.map +1 -0
- package/dist/react/useRow.js +136 -0
- package/dist/react/useRow.js.map +1 -0
- package/dist/react/useTemporaryQuery.d.ts +2 -0
- package/dist/react/useTemporaryQuery.d.ts.map +1 -1
- package/dist/react/useTemporaryQuery.js +28 -11
- package/dist/react/useTemporaryQuery.js.map +1 -1
- package/dist/react/utils/stack-info.d.ts.map +1 -1
- package/dist/react/utils/stack-info.js +3 -2
- package/dist/react/utils/stack-info.js.map +1 -1
- package/dist/react/utils/useStateRefWithReactiveInput.js.map +1 -1
- package/dist/reactive.d.ts +1 -1
- package/dist/reactive.d.ts.map +1 -1
- package/dist/reactive.js +47 -44
- package/dist/reactive.js.map +1 -1
- package/dist/reactiveQueries/base-class.d.ts +6 -2
- package/dist/reactiveQueries/base-class.d.ts.map +1 -1
- package/dist/reactiveQueries/base-class.js +10 -12
- package/dist/reactiveQueries/base-class.js.map +1 -1
- package/dist/reactiveQueries/graphql.d.ts +2 -2
- package/dist/reactiveQueries/graphql.d.ts.map +1 -1
- package/dist/reactiveQueries/graphql.js +56 -50
- package/dist/reactiveQueries/graphql.js.map +1 -1
- package/dist/reactiveQueries/js.d.ts +1 -2
- package/dist/reactiveQueries/js.d.ts.map +1 -1
- package/dist/reactiveQueries/js.js +25 -15
- package/dist/reactiveQueries/js.js.map +1 -1
- package/dist/reactiveQueries/sql.d.ts +3 -3
- package/dist/reactiveQueries/sql.d.ts.map +1 -1
- package/dist/reactiveQueries/sql.js +39 -34
- package/dist/reactiveQueries/sql.js.map +1 -1
- package/dist/row-query.d.ts +21 -0
- package/dist/row-query.d.ts.map +1 -0
- package/dist/row-query.js +77 -0
- package/dist/row-query.js.map +1 -0
- package/dist/schema/action.d.ts +30 -0
- package/dist/schema/action.d.ts.map +1 -0
- package/dist/schema/action.js +3 -0
- package/dist/schema/action.js.map +1 -0
- package/dist/schema/index.d.ts +28 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +26 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/system-tables.d.ts +24 -0
- package/dist/schema/system-tables.d.ts.map +1 -0
- package/dist/schema/system-tables.js +11 -0
- package/dist/schema/system-tables.js.map +1 -0
- package/dist/schema/table-def.d.ts +161 -0
- package/dist/schema/table-def.d.ts.map +1 -0
- package/dist/schema/table-def.js +53 -0
- package/dist/schema/table-def.js.map +1 -0
- package/dist/storage/in-memory/index.d.ts +1 -1
- package/dist/storage/in-memory/index.d.ts.map +1 -1
- package/dist/storage/in-memory/index.js +6 -7
- package/dist/storage/in-memory/index.js.map +1 -1
- package/dist/storage/index.d.ts +1 -1
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/tauri/index.d.ts +1 -1
- package/dist/storage/tauri/index.d.ts.map +1 -1
- package/dist/storage/tauri/index.js +25 -23
- package/dist/storage/tauri/index.js.map +1 -1
- package/dist/storage/utils/idb.js +3 -1
- package/dist/storage/utils/idb.js.map +1 -1
- package/dist/storage/web-worker/index.d.ts +1 -1
- package/dist/storage/web-worker/index.d.ts.map +1 -1
- package/dist/storage/web-worker/index.js +38 -34
- package/dist/storage/web-worker/index.js.map +1 -1
- package/dist/storage/web-worker/worker.d.ts +1 -1
- package/dist/storage/web-worker/worker.d.ts.map +1 -1
- package/dist/storage/web-worker/worker.js +1 -1
- package/dist/storage/web-worker/worker.js.map +1 -1
- package/dist/store.d.ts +9 -10
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +282 -265
- package/dist/store.js.map +1 -1
- package/dist/utils/bounded-collections.d.ts.map +1 -0
- package/dist/utils/bounded-collections.js +90 -0
- package/dist/utils/bounded-collections.js.map +1 -0
- package/dist/utils/otel.d.ts.map +1 -0
- package/dist/{otel.js → utils/otel.js} +1 -1
- package/dist/utils/otel.js.map +1 -0
- package/dist/utils/util.d.ts.map +1 -0
- package/dist/utils/util.js.map +1 -0
- package/package.json +12 -12
- package/src/QueryCache.ts +2 -2
- package/src/__tests__/react/fixture.tsx +15 -15
- package/src/__tests__/react/useQuery.test.tsx +5 -5
- package/src/__tests__/react/{useComponentState.test.tsx → useRow.test.tsx} +27 -28
- package/src/__tests__/react/utils/stack-info.test.ts +34 -0
- package/src/__tests__/reactiveQueries/sql.test.ts +4 -4
- package/src/effect/LiveStore.ts +6 -6
- package/src/global-state.ts +26 -0
- package/src/inMemoryDatabase.ts +6 -4
- package/src/index.ts +18 -17
- package/src/migrations.ts +41 -35
- package/src/react/LiveStoreProvider.tsx +2 -2
- package/src/react/index.ts +7 -9
- package/src/react/useQuery.ts +10 -4
- package/src/react/useRow.ts +221 -0
- package/src/react/useTemporaryQuery.ts +43 -11
- package/src/react/utils/stack-info.ts +4 -2
- package/src/reactive.ts +1 -1
- package/src/reactiveQueries/base-class.ts +8 -2
- package/src/reactiveQueries/graphql.ts +4 -3
- package/src/reactiveQueries/js.ts +3 -4
- package/src/reactiveQueries/sql.ts +6 -6
- package/src/row-query.ts +142 -0
- package/src/schema/action.ts +41 -0
- package/src/schema/index.ts +63 -0
- package/src/schema/system-tables.ts +21 -0
- package/src/schema/table-def.ts +199 -0
- package/src/storage/in-memory/index.ts +1 -1
- package/src/storage/index.ts +2 -1
- package/src/storage/tauri/index.ts +2 -2
- package/src/storage/web-worker/index.ts +1 -1
- package/src/storage/web-worker/worker.ts +2 -2
- package/src/store.ts +39 -27
- package/dist/__tests__/react/useComponentState.test.d.ts +0 -2
- package/dist/__tests__/react/useComponentState.test.d.ts.map +0 -1
- package/dist/__tests__/react/useComponentState.test.js.map +0 -1
- package/dist/bounded-collections.d.ts.map +0 -1
- package/dist/bounded-collections.js +0 -103
- package/dist/bounded-collections.js.map +0 -1
- package/dist/componentKey.d.ts +0 -20
- package/dist/componentKey.d.ts.map +0 -1
- package/dist/componentKey.js +0 -3
- package/dist/componentKey.js.map +0 -1
- package/dist/otel.d.ts.map +0 -1
- package/dist/otel.js.map +0 -1
- package/dist/react/useComponentState.d.ts +0 -50
- package/dist/react/useComponentState.d.ts.map +0 -1
- package/dist/react/useComponentState.js +0 -226
- package/dist/react/useComponentState.js.map +0 -1
- package/dist/reactiveQueries/graph.d.ts +0 -10
- package/dist/reactiveQueries/graph.d.ts.map +0 -1
- package/dist/reactiveQueries/graph.js +0 -6
- package/dist/reactiveQueries/graph.js.map +0 -1
- package/dist/schema.d.ts +0 -81
- package/dist/schema.d.ts.map +0 -1
- package/dist/schema.js +0 -46
- package/dist/schema.js.map +0 -1
- package/dist/util.d.ts.map +0 -1
- package/dist/util.js.map +0 -1
- package/src/componentKey.ts +0 -9
- package/src/react/useComponentState.ts +0 -385
- package/src/reactiveQueries/graph.ts +0 -15
- package/src/schema.ts +0 -143
- /package/dist/{bounded-collections.d.ts → utils/bounded-collections.d.ts} +0 -0
- /package/dist/{otel.d.ts → utils/otel.d.ts} +0 -0
- /package/dist/{util.d.ts → utils/util.d.ts} +0 -0
- /package/dist/{util.js → utils/util.js} +0 -0
- /package/src/{bounded-collections.ts → utils/bounded-collections.ts} +0 -0
- /package/src/{otel.ts → utils/otel.ts} +0 -0
- /package/src/{util.ts → utils/util.ts} +0 -0
|
@@ -1,62 +1,21 @@
|
|
|
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 {
|
|
4
|
+
import { dbGraph } from '../global-state.js';
|
|
5
|
+
import { getDurationMsFromSpan } from '../utils/otel.js';
|
|
5
6
|
import { LiveStoreQueryBase, makeGetAtomResult } from './base-class.js';
|
|
6
|
-
import { dbGraph } from './graph.js';
|
|
7
7
|
import { LiveStoreJSQuery } from './js.js';
|
|
8
8
|
export const queryGraphQL = (document, genVariableValues, { label } = {}) => new LiveStoreGraphQLQuery({ document, genVariableValues, label });
|
|
9
9
|
export class LiveStoreGraphQLQuery extends LiveStoreQueryBase {
|
|
10
|
+
_tag = 'graphql';
|
|
11
|
+
/** The abstract GraphQL query */
|
|
12
|
+
document;
|
|
13
|
+
/** A reactive thunk representing the query results */
|
|
14
|
+
results$;
|
|
15
|
+
variableValues$;
|
|
16
|
+
label;
|
|
10
17
|
constructor({ document, label, genVariableValues, }) {
|
|
11
18
|
super();
|
|
12
|
-
this._tag = 'graphql';
|
|
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
|
-
},
|
|
22
|
-
label: `${this.label}:js`,
|
|
23
|
-
onDestroy: () => this.destroy(),
|
|
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
19
|
const labelWithDefault = label ?? graphql.getOperationAST(document)?.name?.value ?? 'graphql';
|
|
61
20
|
this.label = labelWithDefault;
|
|
62
21
|
this.document = document;
|
|
@@ -90,5 +49,52 @@ export class LiveStoreGraphQLQuery extends LiveStoreQueryBase {
|
|
|
90
49
|
return result;
|
|
91
50
|
}, { label: resultsLabel, meta: { liveStoreThunkType: 'graphqlResults' } });
|
|
92
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* Returns a new reactive query that contains the result of
|
|
54
|
+
* running an arbitrary JS computation on the results of this SQL query.
|
|
55
|
+
*/
|
|
56
|
+
pipe = (fn) => new LiveStoreJSQuery({
|
|
57
|
+
fn: (get) => {
|
|
58
|
+
const results = get(this.results$);
|
|
59
|
+
return fn(results, get);
|
|
60
|
+
},
|
|
61
|
+
label: `${this.label}:js`,
|
|
62
|
+
onDestroy: () => this.destroy(),
|
|
63
|
+
});
|
|
64
|
+
queryOnce = ({ document, otelContext, otelTracer, variableValues, store, }) => {
|
|
65
|
+
const schema = store.graphQLSchema ?? shouldNeverHappen("Can't run a GraphQL query on a store without GraphQL schema");
|
|
66
|
+
const context = store.graphQLContext ?? shouldNeverHappen("Can't run a GraphQL query on a store without GraphQL context");
|
|
67
|
+
const operationName = graphql.getOperationAST(document)?.name?.value;
|
|
68
|
+
return otelTracer.startActiveSpan(`executeGraphQLQuery: ${operationName}`, {}, otelContext, (span) => {
|
|
69
|
+
span.setAttribute('graphql.variables', JSON.stringify(variableValues));
|
|
70
|
+
span.setAttribute('graphql.query', graphql.print(document));
|
|
71
|
+
context.queriedTables.clear();
|
|
72
|
+
context.otelContext = otel.trace.setSpan(otel.context.active(), span);
|
|
73
|
+
const res = graphql.executeSync({
|
|
74
|
+
document,
|
|
75
|
+
contextValue: context,
|
|
76
|
+
schema: schema,
|
|
77
|
+
variableValues,
|
|
78
|
+
});
|
|
79
|
+
// TODO track number of nested SQL queries via Otel + debug info
|
|
80
|
+
if (res.errors) {
|
|
81
|
+
span.setStatus({ code: otel.SpanStatusCode.ERROR, message: 'GraphQL error' });
|
|
82
|
+
span.setAttribute('graphql.error', res.errors.join('\n'));
|
|
83
|
+
span.setAttribute('graphql.error-detail', JSON.stringify(res.errors));
|
|
84
|
+
console.error(`graphql error (${operationName})`, res.errors);
|
|
85
|
+
}
|
|
86
|
+
span.end();
|
|
87
|
+
const durationMs = getDurationMsFromSpan(span);
|
|
88
|
+
return {
|
|
89
|
+
result: res.data,
|
|
90
|
+
queriedTables: Array.from(context.queriedTables.values()),
|
|
91
|
+
durationMs,
|
|
92
|
+
};
|
|
93
|
+
});
|
|
94
|
+
};
|
|
95
|
+
destroy = () => {
|
|
96
|
+
dbGraph.destroy(this.variableValues$);
|
|
97
|
+
dbGraph.destroy(this.results$);
|
|
98
|
+
};
|
|
93
99
|
}
|
|
94
100
|
//# sourceMappingURL=graphql.js.map
|
|
@@ -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;AAElC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"graphql.js","sourceRoot":"","sources":["../../src/reactiveQueries/graphql.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import type { Thunk } from '../reactive.js';
|
|
2
2
|
import type { RefreshReason } from '../store.js';
|
|
3
|
-
import { type GetAtomResult, LiveStoreQueryBase } from './base-class.js';
|
|
4
|
-
import type { DbContext } from './graph.js';
|
|
3
|
+
import { type DbContext, type GetAtomResult, LiveStoreQueryBase } from './base-class.js';
|
|
5
4
|
export declare const queryJS: <TResult>(fn: (get: GetAtomResult) => TResult, options: {
|
|
6
5
|
label: string;
|
|
7
6
|
}) => LiveStoreJSQuery<TResult>;
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
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;AAEhD,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,kBAAkB,EAAqB,MAAM,iBAAiB,CAAA;AAE3G,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;;;;;OAKG;IACH,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,24 +1,22 @@
|
|
|
1
1
|
import * as otel from '@opentelemetry/api';
|
|
2
|
-
import {
|
|
2
|
+
import { dbGraph } from '../global-state.js';
|
|
3
|
+
import { getDurationMsFromSpan } from '../utils/otel.js';
|
|
3
4
|
import { LiveStoreQueryBase, makeGetAtomResult } from './base-class.js';
|
|
4
|
-
import { dbGraph } from './graph.js';
|
|
5
5
|
export const queryJS = (fn, options) => new LiveStoreJSQuery({ fn, label: options.label });
|
|
6
6
|
export class LiveStoreJSQuery extends LiveStoreQueryBase {
|
|
7
|
+
_tag = 'js';
|
|
8
|
+
/** A reactive thunk representing the query results */
|
|
9
|
+
results$;
|
|
10
|
+
label;
|
|
11
|
+
/**
|
|
12
|
+
* Currently only used for "nested destruction" of piped queries
|
|
13
|
+
*
|
|
14
|
+
* i.e. when doing something like `const q = querySQL(...).pipe(...)`
|
|
15
|
+
* we need to also destory the SQL query when the JS query `q` is destroyed
|
|
16
|
+
*/
|
|
17
|
+
onDestroy;
|
|
7
18
|
constructor({ fn, label, onDestroy, }) {
|
|
8
19
|
super();
|
|
9
|
-
this._tag = 'js';
|
|
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
20
|
this.onDestroy = onDestroy;
|
|
23
21
|
this.label = label;
|
|
24
22
|
const queryLabel = `${label}:results`;
|
|
@@ -31,5 +29,17 @@ export class LiveStoreJSQuery extends LiveStoreQueryBase {
|
|
|
31
29
|
return res;
|
|
32
30
|
}), { label: queryLabel, meta: { liveStoreThunkType: 'jsResults' } });
|
|
33
31
|
}
|
|
32
|
+
pipe = (fn) => new LiveStoreJSQuery({
|
|
33
|
+
fn: (get) => {
|
|
34
|
+
const results = get(this.results$);
|
|
35
|
+
return fn(results, get);
|
|
36
|
+
},
|
|
37
|
+
label: `${this.label}:js`,
|
|
38
|
+
onDestroy: () => this.destroy(),
|
|
39
|
+
});
|
|
40
|
+
destroy = () => {
|
|
41
|
+
dbGraph.destroy(this.results$);
|
|
42
|
+
this.onDestroy?.();
|
|
43
|
+
};
|
|
34
44
|
}
|
|
35
45
|
//# sourceMappingURL=js.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"js.js","sourceRoot":"","sources":["../../src/reactiveQueries/js.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE1C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"js.js","sourceRoot":"","sources":["../../src/reactiveQueries/js.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE1C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAG5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,EAAsC,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAE3G,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;IACxE,IAAI,GAAS,IAAI,CAAA;IAEjB,sDAAsD;IACtD,QAAQ,CAA0C;IAElD,KAAK,CAAQ;IAEb;;;;;OAKG;IACK,SAAS,CAA0B;IAE3C,YAAY,EACV,EAAE,EACF,KAAK,EACL,SAAS,GAMV;QACC,KAAK,EAAE,CAAA;QAEP,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;IAED,IAAI,GAAG,CAAI,EAA8C,EAAuB,EAAE,CAChF,IAAI,gBAAgB,CAAC;QACnB,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE;YACV,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAClC,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QACzB,CAAC;QACD,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,KAAK;QACzB,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE;KAChC,CAAC,CAAA;IAEJ,OAAO,GAAG,GAAG,EAAE;QACb,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC9B,IAAI,CAAC,SAAS,EAAE,EAAE,CAAA;IACpB,CAAC,CAAA;CACF"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { Thunk } from '../reactive.js';
|
|
2
2
|
import type { RefreshReason } from '../store.js';
|
|
3
|
-
import type { Bindable } from '../util.js';
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
3
|
+
import type { Bindable } from '../utils/util.js';
|
|
4
|
+
import type { DbContext, GetAtomResult } from './base-class.js';
|
|
5
|
+
import { LiveStoreQueryBase } from './base-class.js';
|
|
6
6
|
import { LiveStoreJSQuery } from './js.js';
|
|
7
7
|
export declare const querySQL: <Row>(query: string | ((get: GetAtomResult) => string), options?: {
|
|
8
8
|
/**
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
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;AAEhD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/D,OAAO,EAAE,kBAAkB,EAAqB,MAAM,iBAAiB,CAAA;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE1C,eAAO,MAAM,QAAQ,+BACI,aAAa,KAAK,MAAM,aACrC;IACR;;;;OAIG;IACH,aAAa,CAAC,EAAE,IAAI,MAAM,CAAC,CAAA;IAC3B,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,GAAG,CAAC,MAAM,CAAC,CAAA;QAC3B,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,9 +1,9 @@
|
|
|
1
1
|
import { shouldNeverHappen } from '@livestore/utils';
|
|
2
2
|
import * as otel from '@opentelemetry/api';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { dbGraph } from '../global-state.js';
|
|
4
|
+
import { getDurationMsFromSpan } from '../utils/otel.js';
|
|
5
|
+
import { prepareBindValues } from '../utils/util.js';
|
|
5
6
|
import { LiveStoreQueryBase, makeGetAtomResult } from './base-class.js';
|
|
6
|
-
import { dbGraph } from './graph.js';
|
|
7
7
|
import { LiveStoreJSQuery } from './js.js';
|
|
8
8
|
export const querySQL = (query, options) => new LiveStoreSQLQuery({
|
|
9
9
|
label: options?.label,
|
|
@@ -13,39 +13,14 @@ export const querySQL = (query, options) => new LiveStoreSQLQuery({
|
|
|
13
13
|
});
|
|
14
14
|
/* An object encapsulating a reactive SQL query */
|
|
15
15
|
export class LiveStoreSQLQuery extends LiveStoreQueryBase {
|
|
16
|
+
_tag = 'sql';
|
|
17
|
+
/** A reactive thunk representing the query text */
|
|
18
|
+
queryString$;
|
|
19
|
+
/** A reactive thunk representing the query results */
|
|
20
|
+
results$;
|
|
21
|
+
label;
|
|
16
22
|
constructor({ genQueryString, queriedTables, bindValues, label: label_, }) {
|
|
17
23
|
super();
|
|
18
|
-
this._tag = 'sql';
|
|
19
|
-
/**
|
|
20
|
-
* Returns a new reactive query that contains the result of
|
|
21
|
-
* running an arbitrary JS computation on the results of this SQL query.
|
|
22
|
-
*/
|
|
23
|
-
this.pipe = (fn) => new LiveStoreJSQuery({
|
|
24
|
-
fn: (get) => {
|
|
25
|
-
const results = get(this.results$);
|
|
26
|
-
return fn(results, get);
|
|
27
|
-
},
|
|
28
|
-
label: `${this.label}:js`,
|
|
29
|
-
onDestroy: () => this.destroy(),
|
|
30
|
-
});
|
|
31
|
-
/** Returns a reactive query */
|
|
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
|
-
return shouldNeverHappen(`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
24
|
const label = label_ ?? genQueryString.toString();
|
|
50
25
|
this.label = `sql(${label})`;
|
|
51
26
|
// TODO don't even create a thunk if query string is static
|
|
@@ -91,5 +66,35 @@ export class LiveStoreSQLQuery extends LiveStoreQueryBase {
|
|
|
91
66
|
}), { label: queryLabel });
|
|
92
67
|
this.results$ = results$;
|
|
93
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Returns a new reactive query that contains the result of
|
|
71
|
+
* running an arbitrary JS computation on the results of this SQL query.
|
|
72
|
+
*/
|
|
73
|
+
pipe = (fn) => new LiveStoreJSQuery({
|
|
74
|
+
fn: (get) => {
|
|
75
|
+
const results = get(this.results$);
|
|
76
|
+
return fn(results, get);
|
|
77
|
+
},
|
|
78
|
+
label: `${this.label}:js`,
|
|
79
|
+
onDestroy: () => this.destroy(),
|
|
80
|
+
});
|
|
81
|
+
/** Returns a reactive query */
|
|
82
|
+
getFirstRow = (args) => new LiveStoreJSQuery({
|
|
83
|
+
fn: (get) => {
|
|
84
|
+
const results = get(this.results$);
|
|
85
|
+
if (results.length === 0 && args?.defaultValue === undefined) {
|
|
86
|
+
// const queryLabel = this._tag === 'sql' ? this.queryString$!.computeResult(otelContext) : this.label
|
|
87
|
+
const queryLabel = this.label;
|
|
88
|
+
return shouldNeverHappen(`Expected query ${queryLabel} to return at least one result`);
|
|
89
|
+
}
|
|
90
|
+
return results[0] ?? args.defaultValue;
|
|
91
|
+
},
|
|
92
|
+
label: `${this.label}:first`,
|
|
93
|
+
onDestroy: () => this.destroy(),
|
|
94
|
+
});
|
|
95
|
+
destroy = () => {
|
|
96
|
+
dbGraph.destroy(this.queryString$);
|
|
97
|
+
dbGraph.destroy(this.results$);
|
|
98
|
+
};
|
|
94
99
|
}
|
|
95
100
|
//# sourceMappingURL=sql.js.map
|
|
@@ -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;AAE1C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/reactiveQueries/sql.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type * as otel from '@opentelemetry/api';
|
|
2
|
+
import { SqliteDsl } from 'effect-db-schema';
|
|
3
|
+
import type { LiveStoreJSQuery } from './reactiveQueries/js.js';
|
|
4
|
+
import type { TableDef } from './schema/table-def.js';
|
|
5
|
+
import type { Store } from './store.js';
|
|
6
|
+
export type RowQueryArgs<TTableDef extends TableDef> = TTableDef['options']['isSingleton'] extends true ? {
|
|
7
|
+
table: TTableDef;
|
|
8
|
+
store: Store;
|
|
9
|
+
otelContext?: otel.Context;
|
|
10
|
+
} : {
|
|
11
|
+
table: TTableDef;
|
|
12
|
+
store: Store;
|
|
13
|
+
otelContext?: otel.Context;
|
|
14
|
+
id: string;
|
|
15
|
+
};
|
|
16
|
+
export declare const rowQuery: <TTableDef extends TableDef>(args: RowQueryArgs<TTableDef>) => LiveStoreJSQuery<RowResult<TTableDef>>;
|
|
17
|
+
type GetValForKey<T, K> = K extends keyof T ? T[K] : never;
|
|
18
|
+
export type RowResult<TTableDef extends TableDef> = TTableDef['isSingleColumn'] extends true ? GetValForKey<SqliteDsl.FromColumns.RowDecoded<TTableDef['schema']['columns']>, 'value'> : SqliteDsl.FromColumns.RowDecoded<TTableDef['schema']['columns']>;
|
|
19
|
+
export type RowResultEncoded<TTableDef extends TableDef> = TTableDef['isSingleColumn'] extends true ? GetValForKey<SqliteDsl.FromColumns.RowEncoded<TTableDef['schema']['columns']>, 'value'> : SqliteDsl.FromColumns.RowEncoded<TTableDef['schema']['columns']>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=row-query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"row-query.d.ts","sourceRoot":"","sources":["../src/row-query.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAa,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAIvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAG/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAGvC,MAAM,MAAM,YAAY,CAAC,SAAS,SAAS,QAAQ,IAAI,SAAS,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,SAAS,IAAI,GACnG;IACE,KAAK,EAAE,SAAS,CAAA;IAChB,KAAK,EAAE,KAAK,CAAA;IACZ,WAAW,CAAC,EAAE,IAAI,CAAC,OAAO,CAAA;CAC3B,GACD;IACE,KAAK,EAAE,SAAS,CAAA;IAChB,KAAK,EAAE,KAAK,CAAA;IACZ,WAAW,CAAC,EAAE,IAAI,CAAC,OAAO,CAAA;IAC1B,EAAE,EAAE,MAAM,CAAA;CACX,CAAA;AAGL,eAAO,MAAM,QAAQ,uGAqEpB,CAAA;AAED,KAAK,YAAY,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;AAE1D,MAAM,MAAM,SAAS,CAAC,SAAS,SAAS,QAAQ,IAAI,SAAS,CAAC,gBAAgB,CAAC,SAAS,IAAI,GACxF,YAAY,CAAC,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,GACvF,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,CAAA;AAEpE,MAAM,MAAM,gBAAgB,CAAC,SAAS,SAAS,QAAQ,IAAI,SAAS,CAAC,gBAAgB,CAAC,SAAS,IAAI,GAC/F,YAAY,CAAC,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,GACvF,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { shouldNeverHappen } from '@livestore/utils';
|
|
2
|
+
import { pipe, ReadonlyRecord, Schema, TreeFormatter } from '@livestore/utils/effect';
|
|
3
|
+
import { SqliteAst, SqliteDsl } from 'effect-db-schema';
|
|
4
|
+
import { migrateTable } from './migrations.js';
|
|
5
|
+
import { LiveStoreSQLQuery } from './reactiveQueries/sql.js';
|
|
6
|
+
import { SCHEMA_META_TABLE } from './schema/index.js';
|
|
7
|
+
import { prepareBindValues, sql } from './utils/util.js';
|
|
8
|
+
// TODO also allow other where clauses and multiple rows
|
|
9
|
+
export const rowQuery = (args) => {
|
|
10
|
+
const { table, store } = args;
|
|
11
|
+
const otelContext = args.otelContext ?? store.otel.queriesSpanContext;
|
|
12
|
+
const id = args.id;
|
|
13
|
+
// Validate query args
|
|
14
|
+
if (table.options.isSingleton === true && id !== undefined) {
|
|
15
|
+
shouldNeverHappen(`Cannot query state table ${table.schema.name} with id "${id}" as it is a singleton`);
|
|
16
|
+
}
|
|
17
|
+
else if (table.options.isSingleton !== true && id === undefined) {
|
|
18
|
+
shouldNeverHappen(`Cannot query state table ${table.schema.name} without id`);
|
|
19
|
+
}
|
|
20
|
+
const stateSchema = table.schema;
|
|
21
|
+
const componentTableName = stateSchema.name;
|
|
22
|
+
// TODO find a better solution for this
|
|
23
|
+
if (store.tableRefs[componentTableName] === undefined) {
|
|
24
|
+
const schemaHash = SqliteAst.hash(stateSchema.ast);
|
|
25
|
+
const res = store.inMemoryDB.select(sql `SELECT schemaHash FROM ${SCHEMA_META_TABLE} WHERE tableName = '${componentTableName}'`);
|
|
26
|
+
if (res.length === 0 || res[0].schemaHash !== schemaHash) {
|
|
27
|
+
migrateTable({
|
|
28
|
+
db: store._proxyDb,
|
|
29
|
+
tableAst: stateSchema.ast,
|
|
30
|
+
otelContext,
|
|
31
|
+
schemaHash,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
store.tableRefs[componentTableName] = store.graph.makeRef(null, {
|
|
35
|
+
equal: () => false,
|
|
36
|
+
label: componentTableName,
|
|
37
|
+
meta: { liveStoreRefType: 'table' },
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
// TODO find a way to only do this if necessary
|
|
41
|
+
insertRowWithDefaultValuesOrIgnore({
|
|
42
|
+
db: store._proxyDb,
|
|
43
|
+
id: id ?? 'singleton',
|
|
44
|
+
stateSchema,
|
|
45
|
+
otelContext,
|
|
46
|
+
});
|
|
47
|
+
const whereClause = id === undefined ? '' : `where id = '${id}'`;
|
|
48
|
+
const queryStr = sql `select * from ${componentTableName} ${whereClause} limit 1`;
|
|
49
|
+
return new LiveStoreSQLQuery({
|
|
50
|
+
label: `localState:query:${stateSchema.name}${id === undefined ? '' : `:${id}`}`,
|
|
51
|
+
genQueryString: queryStr,
|
|
52
|
+
queriedTables: new Set([componentTableName]),
|
|
53
|
+
}).pipe((results) => {
|
|
54
|
+
if (results.length === 0)
|
|
55
|
+
return shouldNeverHappen(`No results for query ${queryStr}`);
|
|
56
|
+
const componentStateEffectSchema = SqliteDsl.structSchemaForTable(stateSchema);
|
|
57
|
+
const parseResult = Schema.parseEither(componentStateEffectSchema)(results[0]);
|
|
58
|
+
if (parseResult._tag === 'Left') {
|
|
59
|
+
console.error('decode error', TreeFormatter.formatErrors(parseResult.left.errors), 'results', results);
|
|
60
|
+
return shouldNeverHappen(`Error decoding query result for ${queryStr}`);
|
|
61
|
+
}
|
|
62
|
+
return table.isSingleColumn === true ? parseResult.right.value : parseResult.right;
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
const insertRowWithDefaultValuesOrIgnore = ({ db, id, stateSchema, otelContext, }) => {
|
|
66
|
+
const columnNames = Object.keys(stateSchema.columns);
|
|
67
|
+
const columnValues = columnNames.map((name) => `$${name}`).join(', ');
|
|
68
|
+
const tableName = stateSchema.name;
|
|
69
|
+
const insertQuery = sql `insert into ${tableName} (${columnNames.join(', ')}) select ${columnValues} where not exists(select 1 from ${tableName} where id = '${id}')`;
|
|
70
|
+
const defaultValues = pipe(stateSchema.columns, ReadonlyRecord.filter((_, key) => key !== 'id'), ReadonlyRecord.map((column, columnName) => column.default === undefined
|
|
71
|
+
? column.nullable === true
|
|
72
|
+
? null
|
|
73
|
+
: shouldNeverHappen(`Column ${columnName} has no default value and is not nullable`)
|
|
74
|
+
: Schema.encodeSync(column.type.codec)(column.default ?? null)));
|
|
75
|
+
void db.execute(insertQuery, prepareBindValues({ ...defaultValues, id }, insertQuery), [tableName], { otelContext });
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=row-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"row-query.js","sourceRoot":"","sources":["../src/row-query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export type SQLWriteStatement = {
|
|
2
|
+
sql: string;
|
|
3
|
+
/** Tables written by the statement */
|
|
4
|
+
writeTables: ReadonlyArray<string>;
|
|
5
|
+
argsAlreadyBound?: boolean;
|
|
6
|
+
};
|
|
7
|
+
export type ActionDefinition<TArgs = any> = {
|
|
8
|
+
statement: SQLWriteStatement | ((args: TArgs) => SQLWriteStatement);
|
|
9
|
+
prepareBindValues?: (args: TArgs) => any;
|
|
10
|
+
};
|
|
11
|
+
export type ActionDefinitions<TArgsMap extends Record<string, any>> = {
|
|
12
|
+
[key in keyof TArgsMap]: ActionDefinition<TArgsMap[key]>;
|
|
13
|
+
};
|
|
14
|
+
export declare const defineActions: <A extends ActionDefinitions<any>>(actions: A) => A;
|
|
15
|
+
export declare const defineAction: <TArgs extends Record<string, any>>(action: ActionDefinition<TArgs>) => ActionDefinition<TArgs>;
|
|
16
|
+
export type GetApplyEventArgs<TActionDefinitionsMap> = RecordValues<{
|
|
17
|
+
[eventType in keyof TActionDefinitionsMap]: {
|
|
18
|
+
eventType: eventType;
|
|
19
|
+
args: GetActionArgs<TActionDefinitionsMap[eventType]>;
|
|
20
|
+
};
|
|
21
|
+
}>;
|
|
22
|
+
type RecordValues<T> = T extends Record<string, infer V> ? V : never;
|
|
23
|
+
export type GetActionArgs<A> = A extends ActionDefinition<infer TArgs> ? TArgs : never;
|
|
24
|
+
declare global {
|
|
25
|
+
interface LiveStoreActionDefinitionsTypes {
|
|
26
|
+
[key: string]: ActionDefinition;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=action.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/schema/action.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAA;IAEX,sCAAsC;IACtC,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IAElC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,gBAAgB,CAAC,KAAK,GAAG,GAAG,IAAI;IAC1C,SAAS,EAAE,iBAAiB,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,iBAAiB,CAAC,CAAA;IACnE,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,GAAG,CAAA;CACzC,CAAA;AAED,MAAM,MAAM,iBAAiB,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI;KACnE,GAAG,IAAI,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;CACzD,CAAA;AAED,eAAO,MAAM,aAAa,qDAA4D,CAAA;AACtF,eAAO,MAAM,YAAY,iGAEW,CAAA;AAEpC,MAAM,MAAM,iBAAiB,CAAC,qBAAqB,IAAI,YAAY,CAAC;KACjE,SAAS,IAAI,MAAM,qBAAqB,GAAG;QAC1C,SAAS,EAAE,SAAS,CAAA;QACpB,IAAI,EAAE,aAAa,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAA;KACtD;CACF,CAAC,CAAA;AAEF,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AAEpE,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,SAAS,gBAAgB,CAAC,MAAM,KAAK,CAAC,GAAG,KAAK,GAAG,KAAK,CAAA;AAGtF,OAAO,CAAC,MAAM,CAAC;IAEb,UAAU,+BAA+B;QACvC,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAA;KAChC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action.js","sourceRoot":"","sources":["../../src/schema/action.ts"],"names":[],"mappings":"AAkBA,MAAM,CAAC,MAAM,aAAa,GAAG,CAAmC,OAAU,EAAE,EAAE,CAAC,OAAO,CAAA;AACtF,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,MAA+B,EACN,EAAE,CAAC,MAAM,CAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { SqliteDsl } from 'effect-db-schema';
|
|
2
|
+
import type { ActionDefinitions } from './action.js';
|
|
3
|
+
import type { TableDef } from './table-def.js';
|
|
4
|
+
export * from './action.js';
|
|
5
|
+
export * from './system-tables.js';
|
|
6
|
+
export * as DbSchema from './table-def.js';
|
|
7
|
+
export type LiveStoreSchema<TDbSchema extends SqliteDsl.DbSchema = SqliteDsl.DbSchema> = {
|
|
8
|
+
/** Only used on type-level */
|
|
9
|
+
readonly _DbSchemaType: TDbSchema;
|
|
10
|
+
readonly tables: Map<string, TableDef>;
|
|
11
|
+
readonly actions: ActionDefinitions<any>;
|
|
12
|
+
};
|
|
13
|
+
export type InputSchema = {
|
|
14
|
+
tables: Record<string, TableDef> | ReadonlyArray<TableDef>;
|
|
15
|
+
actions: ActionDefinitions<any>;
|
|
16
|
+
};
|
|
17
|
+
export declare const makeSchema: <TInputSchema extends InputSchema>(schema: TInputSchema) => LiveStoreSchema<DbSchemaFromInputSchemaTables<TInputSchema["tables"]>>;
|
|
18
|
+
/**
|
|
19
|
+
* In case of ...
|
|
20
|
+
* - array: we use the table name of each array item (= table definition) as the object key
|
|
21
|
+
* - object: we discard the keys of the input object and use the table name of each object value (= table definition) as the new object key
|
|
22
|
+
*/
|
|
23
|
+
export type DbSchemaFromInputSchemaTables<TTables extends InputSchema['tables']> = TTables extends ReadonlyArray<TableDef> ? {
|
|
24
|
+
[K in TTables[number] as K['schema']['name']]: K['schema'];
|
|
25
|
+
} : TTables extends Record<string, TableDef> ? {
|
|
26
|
+
[K in keyof TTables as TTables[K]['schema']['name']]: TTables[K]['schema'];
|
|
27
|
+
} : never;
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE9C,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA;AAClC,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAI1C,MAAM,MAAM,eAAe,CAAC,SAAS,SAAS,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,IAAI;IACvF,8BAA8B;IAC9B,QAAQ,CAAC,aAAa,EAAE,SAAS,CAAA;IAEjC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACtC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAA;CACzC,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;IAC1D,OAAO,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAA;CAChC,CAAA;AAED,eAAO,MAAM,UAAU,oIAyBtB,CAAA;AAED;;;;GAIG;AACH,MAAM,MAAM,6BAA6B,CAAC,OAAO,SAAS,WAAW,CAAC,QAAQ,CAAC,IAC7E,OAAO,SAAS,aAAa,CAAC,QAAQ,CAAC,GACnC;KAAG,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;CAAE,GAC9D,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GACtC;KAAG,CAAC,IAAI,MAAM,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;CAAE,GAC9E,KAAK,CAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { systemTables } from './system-tables.js';
|
|
2
|
+
export * from './action.js';
|
|
3
|
+
export * from './system-tables.js';
|
|
4
|
+
export * as DbSchema from './table-def.js';
|
|
5
|
+
export const makeSchema = (
|
|
6
|
+
/** Note when using the object-notation for tables, the object keys are ignored and not used as table names */
|
|
7
|
+
schema) => {
|
|
8
|
+
const inputTables = Array.isArray(schema.tables)
|
|
9
|
+
? schema.tables
|
|
10
|
+
: // TODO validate that table names are unique in this case
|
|
11
|
+
Object.values(schema.tables);
|
|
12
|
+
const tables = new Map();
|
|
13
|
+
for (const tableDef of inputTables) {
|
|
14
|
+
// TODO validate tables (e.g. index names are unique)
|
|
15
|
+
tables.set(tableDef.schema.ast.name, tableDef);
|
|
16
|
+
}
|
|
17
|
+
for (const tableDef of systemTables) {
|
|
18
|
+
tables.set(tableDef.schema.name, tableDef);
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
_DbSchemaType: Symbol('livestore.DbSchemaType'),
|
|
22
|
+
tables,
|
|
23
|
+
actions: schema.actions,
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAGjD,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA;AAClC,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAiB1C,MAAM,CAAC,MAAM,UAAU,GAAG;AACxB,8GAA8G;AAC9G,MAAoB,EACoD,EAAE;IAC1E,MAAM,WAAW,GAA4B,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;QACvE,CAAC,CAAC,MAAM,CAAC,MAAM;QACf,CAAC,CAAC,yDAAyD;YACzD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAEhC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAA;IAE1C,KAAK,MAAM,QAAQ,IAAI,WAAW,EAAE,CAAC;QACnC,qDAAqD;QACrD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAChD,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC5C,CAAC;IAED,OAAO;QACL,aAAa,EAAE,MAAM,CAAC,wBAAwB,CAAQ;QACtD,MAAM;QACN,OAAO,EAAE,MAAM,CAAC,OAAO;KACE,CAAA;AAC7B,CAAC,CAAA"}
|