@livestore/livestore 0.0.38 → 0.0.39-dev.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -4
- package/dist/.tsbuildinfo +1 -1
- package/dist/__tests__/react/fixture.d.ts +97 -3
- package/dist/__tests__/react/fixture.d.ts.map +1 -1
- package/dist/__tests__/react/fixture.js +10 -7
- package/dist/__tests__/react/fixture.js.map +1 -1
- package/dist/__tests__/react/useQuery.test.js +12 -23
- package/dist/__tests__/react/useQuery.test.js.map +1 -1
- package/dist/__tests__/react/useRow.test.js +4 -4
- package/dist/__tests__/react/useRow.test.js.map +1 -1
- package/dist/__tests__/reactiveQueries/sql.test.js +32 -35
- package/dist/__tests__/reactiveQueries/sql.test.js.map +1 -1
- package/dist/effect/LiveStore.d.ts +3 -2
- package/dist/effect/LiveStore.d.ts.map +1 -1
- package/dist/effect/LiveStore.js.map +1 -1
- package/dist/index.d.ts +6 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/migrations.js +2 -2
- package/dist/migrations.js.map +1 -1
- package/dist/mutations.d.ts +3 -1
- package/dist/mutations.d.ts.map +1 -1
- package/dist/mutations.js +2 -2
- package/dist/mutations.js.map +1 -1
- package/dist/react/LiveStoreContext.d.ts +2 -2
- package/dist/react/LiveStoreContext.d.ts.map +1 -1
- package/dist/react/LiveStoreContext.js.map +1 -1
- package/dist/react/index.d.ts +1 -0
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +1 -0
- package/dist/react/index.js.map +1 -1
- package/dist/react/useAtom.d.ts +5 -0
- package/dist/react/useAtom.d.ts.map +1 -0
- package/dist/react/useAtom.js +16 -0
- package/dist/react/useAtom.js.map +1 -0
- package/dist/react/useQuery.d.ts +3 -3
- package/dist/react/useQuery.d.ts.map +1 -1
- package/dist/react/useQuery.js.map +1 -1
- package/dist/react/useRow.d.ts +5 -5
- package/dist/react/useRow.d.ts.map +1 -1
- package/dist/react/useRow.js +16 -30
- package/dist/react/useRow.js.map +1 -1
- package/dist/react/useTemporaryQuery.d.ts +3 -3
- package/dist/react/useTemporaryQuery.d.ts.map +1 -1
- package/dist/react/useTemporaryQuery.js.map +1 -1
- package/dist/reactiveQueries/base-class.d.ts +12 -4
- package/dist/reactiveQueries/base-class.d.ts.map +1 -1
- package/dist/reactiveQueries/base-class.js +1 -0
- package/dist/reactiveQueries/base-class.js.map +1 -1
- package/dist/reactiveQueries/graphql.d.ts +5 -5
- package/dist/reactiveQueries/graphql.d.ts.map +1 -1
- package/dist/reactiveQueries/graphql.js +11 -10
- package/dist/reactiveQueries/graphql.js.map +1 -1
- package/dist/reactiveQueries/js.d.ts +10 -7
- package/dist/reactiveQueries/js.d.ts.map +1 -1
- package/dist/reactiveQueries/js.js +19 -11
- package/dist/reactiveQueries/js.js.map +1 -1
- package/dist/reactiveQueries/sql.d.ts +21 -15
- package/dist/reactiveQueries/sql.d.ts.map +1 -1
- package/dist/reactiveQueries/sql.js +50 -28
- package/dist/reactiveQueries/sql.js.map +1 -1
- package/dist/row-query.d.ts +22 -21
- package/dist/row-query.d.ts.map +1 -1
- package/dist/row-query.js +62 -47
- package/dist/row-query.js.map +1 -1
- package/dist/schema/index.d.ts +3 -2
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +3 -2
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/parse-utils.d.ts +6 -0
- package/dist/schema/parse-utils.d.ts.map +1 -0
- package/dist/schema/parse-utils.js +59 -0
- package/dist/schema/parse-utils.js.map +1 -0
- package/dist/schema/system-tables.d.ts +24 -8
- package/dist/schema/system-tables.d.ts.map +1 -1
- package/dist/schema/table-def.d.ts +32 -7
- package/dist/schema/table-def.d.ts.map +1 -1
- package/dist/schema/table-def.js +18 -6
- package/dist/schema/table-def.js.map +1 -1
- package/dist/store.d.ts +4 -8
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +7 -8
- package/dist/store.js.map +1 -1
- package/dist/update-path.d.ts +52 -0
- package/dist/update-path.d.ts.map +1 -0
- package/dist/update-path.js +33 -0
- package/dist/update-path.js.map +1 -0
- package/dist/utils/util.d.ts +1 -0
- package/dist/utils/util.d.ts.map +1 -1
- package/dist/utils/util.js.map +1 -1
- package/package.json +4 -4
- package/src/__tests__/react/fixture.tsx +13 -7
- package/src/__tests__/react/useQuery.test.tsx +12 -29
- package/src/__tests__/react/useRow.test.tsx +5 -7
- package/src/__tests__/reactiveQueries/sql.test.ts +33 -35
- package/src/effect/LiveStore.ts +3 -2
- package/src/index.ts +6 -6
- package/src/migrations.ts +2 -2
- package/src/mutations.ts +8 -3
- package/src/react/LiveStoreContext.ts +3 -2
- package/src/react/index.ts +1 -0
- package/src/react/useAtom.ts +25 -0
- package/src/react/useQuery.ts +7 -7
- package/src/react/useRow.ts +27 -47
- package/src/react/useTemporaryQuery.ts +4 -6
- package/src/reactiveQueries/base-class.ts +18 -4
- package/src/reactiveQueries/graphql.ts +16 -14
- package/src/reactiveQueries/js.ts +36 -15
- package/src/reactiveQueries/sql.ts +77 -37
- package/src/row-query.ts +155 -113
- package/src/schema/index.ts +5 -4
- package/src/schema/parse-utils.ts +84 -0
- package/src/schema/table-def.ts +80 -12
- package/src/store.ts +14 -29
- package/src/update-path.ts +102 -0
- package/src/utils/util.ts +2 -0
|
@@ -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,aAAa,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"graphql.js","sourceRoot":"","sources":["../../src/reactiveQueries/graphql.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
import type { Thunk } from '../reactive.js';
|
|
2
2
|
import type { RefreshReason } from '../store.js';
|
|
3
|
-
import type {
|
|
3
|
+
import type { UpdatePathDesc, UpdatePathDescNone } from '../update-path.js';
|
|
4
|
+
import type { DbContext, DbGraph, GetAtomResult, LiveQuery } from './base-class.js';
|
|
4
5
|
import { LiveStoreQueryBase } from './base-class.js';
|
|
5
|
-
export declare const
|
|
6
|
+
export declare const computed: <TResult, TUpdatePath extends UpdatePathDesc = UpdatePathDescNone>(fn: (get: GetAtomResult) => TResult, options?: {
|
|
6
7
|
label: string;
|
|
7
|
-
dbGraph?: DbGraph;
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
dbGraph?: DbGraph | undefined;
|
|
9
|
+
updatePathDesc?: TUpdatePath | undefined;
|
|
10
|
+
} | undefined) => LiveQuery<TResult, TUpdatePath>;
|
|
11
|
+
export declare class LiveStoreJSQuery<TResult, TUpdatePath extends UpdatePathDesc = UpdatePathDescNone> extends LiveStoreQueryBase<TResult, TUpdatePath> {
|
|
10
12
|
_tag: 'js';
|
|
11
13
|
/** A reactive thunk representing the query results */
|
|
12
14
|
results$: Thunk<TResult, DbContext, RefreshReason>;
|
|
13
15
|
label: string;
|
|
14
16
|
protected dbGraph: DbGraph;
|
|
17
|
+
updatePathDesc: TUpdatePath;
|
|
15
18
|
/**
|
|
16
19
|
* Currently only used for "nested destruction" of piped queries
|
|
17
20
|
*
|
|
@@ -19,14 +22,14 @@ export declare class LiveStoreJSQuery<TResult> extends LiveStoreQueryBase<TResul
|
|
|
19
22
|
* we need to also destory the SQL query when the JS query `q` is destroyed
|
|
20
23
|
*/
|
|
21
24
|
private onDestroy;
|
|
22
|
-
constructor({ fn, label, onDestroy, dbGraph, }: {
|
|
25
|
+
constructor({ fn, label, onDestroy, dbGraph, updatePathDesc, }: {
|
|
23
26
|
label: string;
|
|
24
27
|
fn: (get: GetAtomResult) => TResult;
|
|
25
28
|
/** Currently only used for "nested destruction" of piped queries */
|
|
26
29
|
onDestroy?: () => void;
|
|
27
30
|
dbGraph?: DbGraph;
|
|
31
|
+
updatePathDesc?: TUpdatePath;
|
|
28
32
|
});
|
|
29
|
-
pipe: <U>(fn: (result: TResult, get: GetAtomResult) => U) => LiveStoreJSQuery<U>;
|
|
30
33
|
destroy: () => void;
|
|
31
34
|
}
|
|
32
35
|
//# sourceMappingURL=js.d.ts.map
|
|
@@ -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;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAE3E,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACnF,OAAO,EAAE,kBAAkB,EAAqB,MAAM,iBAAiB,CAAA;AAEvE,eAAO,MAAM,QAAQ,+EACT,aAAa;WAEd,MAAM;;;iDAUb,CAAA;AAEJ,qBAAa,gBAAgB,CAC3B,OAAO,EACP,WAAW,SAAS,cAAc,GAAG,kBAAkB,CACvD,SAAQ,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC;IAChD,IAAI,EAAE,IAAI,CAAO;IAEjB,sDAAsD;IACtD,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,aAAa,CAAC,CAAA;IAElD,KAAK,EAAE,MAAM,CAAA;IAEb,SAAS,CAAC,OAAO,EAAE,OAAO,CAAA;IAE1B,cAAc,EAAE,WAAW,CAAA;IAE3B;;;;;OAKG;IACH,OAAO,CAAC,SAAS,CAA0B;gBAE/B,EACV,EAAE,EACF,KAAK,EACL,SAAS,EACT,OAAO,EACP,cAAc,GACf,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;QACtB,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,cAAc,CAAC,EAAE,WAAW,CAAA;KAC7B;IAwCD,OAAO,aAGN;CACF"}
|
|
@@ -2,13 +2,19 @@ import * as otel from '@opentelemetry/api';
|
|
|
2
2
|
import { globalDbGraph } from '../global-state.js';
|
|
3
3
|
import { getDurationMsFromSpan } from '../utils/otel.js';
|
|
4
4
|
import { LiveStoreQueryBase, makeGetAtomResult } from './base-class.js';
|
|
5
|
-
export const
|
|
5
|
+
export const computed = (fn, options) => new LiveStoreJSQuery({
|
|
6
|
+
fn,
|
|
7
|
+
label: options?.label ?? fn.toString(),
|
|
8
|
+
dbGraph: options?.dbGraph,
|
|
9
|
+
updatePathDesc: options?.updatePathDesc,
|
|
10
|
+
});
|
|
6
11
|
export class LiveStoreJSQuery extends LiveStoreQueryBase {
|
|
7
12
|
_tag = 'js';
|
|
8
13
|
/** A reactive thunk representing the query results */
|
|
9
14
|
results$;
|
|
10
15
|
label;
|
|
11
16
|
dbGraph;
|
|
17
|
+
updatePathDesc;
|
|
12
18
|
/**
|
|
13
19
|
* Currently only used for "nested destruction" of piped queries
|
|
14
20
|
*
|
|
@@ -16,11 +22,12 @@ export class LiveStoreJSQuery extends LiveStoreQueryBase {
|
|
|
16
22
|
* we need to also destory the SQL query when the JS query `q` is destroyed
|
|
17
23
|
*/
|
|
18
24
|
onDestroy;
|
|
19
|
-
constructor({ fn, label, onDestroy, dbGraph, }) {
|
|
25
|
+
constructor({ fn, label, onDestroy, dbGraph, updatePathDesc, }) {
|
|
20
26
|
super();
|
|
21
27
|
this.onDestroy = onDestroy;
|
|
22
28
|
this.label = label;
|
|
23
29
|
this.dbGraph = dbGraph ?? globalDbGraph;
|
|
30
|
+
this.updatePathDesc = updatePathDesc ?? { _tag: 'None' };
|
|
24
31
|
const queryLabel = `${label}:results`;
|
|
25
32
|
this.results$ = this.dbGraph.makeThunk((get, setDebugInfo, { otelTracer, rootOtelContext }, otelContext) => otelTracer.startActiveSpan(`js:${label}`, {}, otelContext ?? rootOtelContext, (span) => {
|
|
26
33
|
const otelContext = otel.trace.setSpan(otel.context.active(), span);
|
|
@@ -31,15 +38,16 @@ export class LiveStoreJSQuery extends LiveStoreQueryBase {
|
|
|
31
38
|
return res;
|
|
32
39
|
}), { label: queryLabel, meta: { liveStoreThunkType: 'jsResults' } });
|
|
33
40
|
}
|
|
34
|
-
pipe = (fn) =>
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
// pipe = <U>(fn: (result: TResult, get: GetAtomResult) => U): LiveStoreJSQuery<U> =>
|
|
42
|
+
// new LiveStoreJSQuery({
|
|
43
|
+
// fn: (get) => {
|
|
44
|
+
// const results = get(this.results$)
|
|
45
|
+
// return fn(results, get)
|
|
46
|
+
// },
|
|
47
|
+
// label: `${this.label}:js`,
|
|
48
|
+
// onDestroy: () => this.destroy(),
|
|
49
|
+
// dbGraph: this.dbGraph,
|
|
50
|
+
// })
|
|
43
51
|
destroy = () => {
|
|
44
52
|
this.dbGraph.destroyNode(this.results$);
|
|
45
53
|
this.onDestroy?.();
|
|
@@ -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,aAAa,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"js.js","sourceRoot":"","sources":["../../src/reactiveQueries/js.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAIlD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAExD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAEvE,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,EAAmC,EACnC,OAIC,EACgC,EAAE,CACnC,IAAI,gBAAgB,CAAuB;IACzC,EAAE;IACF,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,QAAQ,EAAE;IACtC,OAAO,EAAE,OAAO,EAAE,OAAO;IACzB,cAAc,EAAE,OAAO,EAAE,cAAc;CACxC,CAAC,CAAA;AAEJ,MAAM,OAAO,gBAGX,SAAQ,kBAAwC;IAChD,IAAI,GAAS,IAAI,CAAA;IAEjB,sDAAsD;IACtD,QAAQ,CAA0C;IAElD,KAAK,CAAQ;IAEH,OAAO,CAAS;IAE1B,cAAc,CAAa;IAE3B;;;;;OAKG;IACK,SAAS,CAA0B;IAE3C,YAAY,EACV,EAAE,EACF,KAAK,EACL,SAAS,EACT,OAAO,EACP,cAAc,GAQf;QACC,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAElB,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,aAAa,CAAA;QACvC,IAAI,CAAC,cAAc,GAAG,cAAc,IAAK,EAAE,IAAI,EAAE,MAAM,EAAkB,CAAA;QAEzE,MAAM,UAAU,GAAG,GAAG,KAAK,UAAU,CAAA;QAErC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CACpC,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,qFAAqF;IACrF,2BAA2B;IAC3B,qBAAqB;IACrB,2CAA2C;IAC3C,gCAAgC;IAChC,SAAS;IACT,iCAAiC;IACjC,uCAAuC;IACvC,6BAA6B;IAC7B,OAAO;IAEP,OAAO,GAAG,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACvC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAA;IACpB,CAAC,CAAA;CACF"}
|
|
@@ -1,44 +1,50 @@
|
|
|
1
|
+
import { Schema } from '@livestore/utils/effect';
|
|
1
2
|
import type { Thunk } from '../reactive.js';
|
|
2
3
|
import type { RefreshReason } from '../store.js';
|
|
4
|
+
import type { UpdatePathDesc, UpdatePathDescNone } from '../update-path.js';
|
|
3
5
|
import type { Bindable } from '../utils/util.js';
|
|
4
|
-
import type { DbContext, DbGraph, GetAtomResult } from './base-class.js';
|
|
6
|
+
import type { DbContext, DbGraph, GetAtomResult, LiveQuery } from './base-class.js';
|
|
5
7
|
import { LiveStoreQueryBase } from './base-class.js';
|
|
6
|
-
|
|
7
|
-
export declare const querySQL: <
|
|
8
|
+
export type MapRows<TResult, TRaw = any> = ((rows: ReadonlyArray<TRaw>) => TResult) | Schema.Schema<ReadonlyArray<TRaw>, TResult>;
|
|
9
|
+
export declare const querySQL: <Result, TRaw = any>(query: string | ((get: GetAtomResult) => string), options?: {
|
|
10
|
+
map?: MapRows<Result, TRaw> | undefined;
|
|
8
11
|
/**
|
|
9
12
|
* Can be provided explicitly to slightly speed up initial query performance
|
|
10
13
|
*
|
|
11
14
|
* NOTE In the future we want to do this automatically at build time
|
|
12
15
|
*/
|
|
13
|
-
queriedTables?: Set<string
|
|
14
|
-
bindValues?: Bindable;
|
|
15
|
-
label?: string;
|
|
16
|
-
dbGraph?: DbGraph;
|
|
17
|
-
}) =>
|
|
18
|
-
export declare class LiveStoreSQLQuery<
|
|
16
|
+
queriedTables?: Set<string> | undefined;
|
|
17
|
+
bindValues?: Bindable | undefined;
|
|
18
|
+
label?: string | undefined;
|
|
19
|
+
dbGraph?: DbGraph | undefined;
|
|
20
|
+
} | undefined) => LiveQuery<Result, UpdatePathDescNone>;
|
|
21
|
+
export declare class LiveStoreSQLQuery<Result, TUpdatePath extends UpdatePathDesc = UpdatePathDescNone> extends LiveStoreQueryBase<Result, TUpdatePath> {
|
|
19
22
|
_tag: 'sql';
|
|
20
23
|
/** A reactive thunk representing the query text */
|
|
21
24
|
queryString$: Thunk<string, DbContext, RefreshReason>;
|
|
22
25
|
/** A reactive thunk representing the query results */
|
|
23
|
-
results$: Thunk<
|
|
26
|
+
results$: Thunk<Result, DbContext, RefreshReason>;
|
|
24
27
|
label: string;
|
|
25
28
|
protected dbGraph: DbGraph;
|
|
26
|
-
|
|
29
|
+
/** Currently only used by `rowQuery` for lazy table migrations and eager default row insertion */
|
|
30
|
+
private execBeforeFirstRun;
|
|
31
|
+
private mapRows;
|
|
32
|
+
updatePathDesc: TUpdatePath;
|
|
33
|
+
constructor({ genQueryString, queriedTables, bindValues, label: label_, dbGraph, map, execBeforeFirstRun, updatePathDesc, }: {
|
|
27
34
|
label?: string;
|
|
28
35
|
genQueryString: string | ((get: GetAtomResult) => string);
|
|
29
36
|
queriedTables?: Set<string>;
|
|
30
37
|
bindValues?: Bindable;
|
|
31
38
|
dbGraph?: DbGraph;
|
|
39
|
+
map?: MapRows<Result>;
|
|
40
|
+
execBeforeFirstRun?: (ctx: DbContext) => void;
|
|
41
|
+
updatePathDesc?: TUpdatePath;
|
|
32
42
|
});
|
|
33
43
|
/**
|
|
34
44
|
* Returns a new reactive query that contains the result of
|
|
35
45
|
* running an arbitrary JS computation on the results of this SQL query.
|
|
36
46
|
*/
|
|
37
|
-
pipe: <U>(fn: (result: ReadonlyArray<Row>, get: GetAtomResult) => U) => LiveStoreJSQuery<U>;
|
|
38
47
|
/** Returns a reactive query */
|
|
39
|
-
getFirstRow: (args?: {
|
|
40
|
-
defaultValue?: Row;
|
|
41
|
-
}) => LiveStoreJSQuery<NonNullable<Row>>;
|
|
42
48
|
destroy: () => void;
|
|
43
49
|
}
|
|
44
50
|
//# sourceMappingURL=sql.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/reactiveQueries/sql.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/reactiveQueries/sql.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAIhD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAE3E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AACnF,OAAO,EAAE,kBAAkB,EAAqB,MAAM,iBAAiB,CAAA;AAEvE,MAAM,MAAM,OAAO,CAAC,OAAO,EAAE,IAAI,GAAG,GAAG,IACnC,CAAC,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,GACxC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAA;AAE/C,eAAO,MAAM,QAAQ,8CACI,aAAa,KAAK,MAAM;;IAG7C;;;;OAIG;;;;;uDAeH,CAAA;AAGJ,qBAAa,iBAAiB,CAC5B,MAAM,EACN,WAAW,SAAS,cAAc,GAAG,kBAAkB,CACvD,SAAQ,kBAAkB,CAAC,MAAM,EAAE,WAAW,CAAC;IAC/C,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,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC,CAAA;IAEjD,KAAK,EAAE,MAAM,CAAA;IAEb,SAAS,CAAC,OAAO,UAAA;IAEjB,kGAAkG;IAClG,OAAO,CAAC,kBAAkB,CAAA;IAE1B,OAAO,CAAC,OAAO,CAAA;IAEf,cAAc,EAAE,WAAW,CAAA;gBAEf,EACV,cAAc,EACd,aAAa,EACb,UAAU,EACV,KAAK,EAAE,MAAM,EACb,OAAO,EACP,GAAG,EACH,kBAAkB,EAClB,cAAc,GACf,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;QACrB,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,GAAG,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;QACrB,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,CAAA;QAC7C,cAAc,CAAC,EAAE,WAAW,CAAA;KAC7B;IA2FD;;;OAGG;IAaH,gCAAgC;IAiBhC,OAAO,aAGN;CACF"}
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import { shouldNeverHappen } from '@livestore/utils';
|
|
2
|
+
import { Schema } from '@livestore/utils/effect';
|
|
2
3
|
import * as otel from '@opentelemetry/api';
|
|
3
4
|
import { globalDbGraph } from '../global-state.js';
|
|
4
5
|
import { getDurationMsFromSpan } from '../utils/otel.js';
|
|
5
6
|
import { prepareBindValues } from '../utils/util.js';
|
|
6
7
|
import { LiveStoreQueryBase, makeGetAtomResult } from './base-class.js';
|
|
7
|
-
import { LiveStoreJSQuery } from './js.js';
|
|
8
8
|
export const querySQL = (query, options) => new LiveStoreSQLQuery({
|
|
9
9
|
label: options?.label,
|
|
10
10
|
genQueryString: query,
|
|
11
11
|
queriedTables: options?.queriedTables,
|
|
12
12
|
bindValues: options?.bindValues,
|
|
13
13
|
dbGraph: options?.dbGraph,
|
|
14
|
+
map: options?.map,
|
|
15
|
+
updatePathDesc: { _tag: 'None' },
|
|
14
16
|
});
|
|
15
17
|
/* An object encapsulating a reactive SQL query */
|
|
16
18
|
export class LiveStoreSQLQuery extends LiveStoreQueryBase {
|
|
@@ -21,11 +23,23 @@ export class LiveStoreSQLQuery extends LiveStoreQueryBase {
|
|
|
21
23
|
results$;
|
|
22
24
|
label;
|
|
23
25
|
dbGraph;
|
|
24
|
-
|
|
26
|
+
/** Currently only used by `rowQuery` for lazy table migrations and eager default row insertion */
|
|
27
|
+
execBeforeFirstRun;
|
|
28
|
+
mapRows;
|
|
29
|
+
updatePathDesc;
|
|
30
|
+
constructor({ genQueryString, queriedTables, bindValues, label: label_, dbGraph, map, execBeforeFirstRun, updatePathDesc, }) {
|
|
25
31
|
super();
|
|
26
32
|
const label = label_ ?? genQueryString.toString();
|
|
27
33
|
this.label = `sql(${label})`;
|
|
28
34
|
this.dbGraph = dbGraph ?? globalDbGraph;
|
|
35
|
+
this.execBeforeFirstRun = execBeforeFirstRun;
|
|
36
|
+
this.updatePathDesc = updatePathDesc ?? { _tag: 'None' };
|
|
37
|
+
this.mapRows =
|
|
38
|
+
map === undefined
|
|
39
|
+
? (rows) => rows
|
|
40
|
+
: typeof map === 'function'
|
|
41
|
+
? map
|
|
42
|
+
: (rows) => Schema.parseSync(map)(rows);
|
|
29
43
|
// TODO don't even create a thunk if query string is static
|
|
30
44
|
const queryString$ = this.dbGraph.makeThunk((get, setDebugInfo, { rootOtelContext }, otelContext) => {
|
|
31
45
|
if (typeof genQueryString === 'function') {
|
|
@@ -45,6 +59,10 @@ export class LiveStoreSQLQuery extends LiveStoreQueryBase {
|
|
|
45
59
|
const results$ = this.dbGraph.makeThunk((get, setDebugInfo, { store, otelTracer, rootOtelContext }, otelContext) => otelTracer.startActiveSpan('sql:...', // NOTE span name will be overridden further down
|
|
46
60
|
{}, otelContext ?? rootOtelContext, (span) => {
|
|
47
61
|
const otelContext = otel.trace.setSpan(otel.context.active(), span);
|
|
62
|
+
if (this.execBeforeFirstRun !== undefined) {
|
|
63
|
+
this.execBeforeFirstRun({ store, otelTracer, rootOtelContext });
|
|
64
|
+
this.execBeforeFirstRun = undefined;
|
|
65
|
+
}
|
|
48
66
|
const sqlString = get(queryString$, otelContext);
|
|
49
67
|
if (queriedTablesRef.current === undefined) {
|
|
50
68
|
queriedTablesRef.current = store.inMemoryDB.getTablesUsed(sqlString);
|
|
@@ -56,16 +74,17 @@ export class LiveStoreSQLQuery extends LiveStoreQueryBase {
|
|
|
56
74
|
}
|
|
57
75
|
span.setAttribute('sql.query', sqlString);
|
|
58
76
|
span.updateName(`sql:${sqlString.slice(0, 50)}`);
|
|
59
|
-
const
|
|
77
|
+
const rawResults = store.inMemoryDB.select(sqlString, {
|
|
60
78
|
queriedTables,
|
|
61
79
|
bindValues: bindValues ? prepareBindValues(bindValues, sqlString) : undefined,
|
|
62
80
|
otelContext,
|
|
63
81
|
});
|
|
64
|
-
span.setAttribute('sql.rowsCount',
|
|
82
|
+
span.setAttribute('sql.rowsCount', rawResults.length);
|
|
83
|
+
const result = this.mapRows(rawResults);
|
|
65
84
|
span.end();
|
|
66
85
|
const durationMs = getDurationMsFromSpan(span);
|
|
67
86
|
setDebugInfo({ _tag: 'sql', label, query: sqlString, durationMs });
|
|
68
|
-
return
|
|
87
|
+
return result;
|
|
69
88
|
}), { label: queryLabel });
|
|
70
89
|
this.results$ = results$;
|
|
71
90
|
}
|
|
@@ -73,30 +92,33 @@ export class LiveStoreSQLQuery extends LiveStoreQueryBase {
|
|
|
73
92
|
* Returns a new reactive query that contains the result of
|
|
74
93
|
* running an arbitrary JS computation on the results of this SQL query.
|
|
75
94
|
*/
|
|
76
|
-
pipe = (fn) =>
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
95
|
+
// pipe = <U>(fn: (result: Result, get: GetAtomResult) => U): LiveStoreJSQuery<U> =>
|
|
96
|
+
// new LiveStoreJSQuery({
|
|
97
|
+
// fn: (get) => {
|
|
98
|
+
// const results = get(this.results$!)
|
|
99
|
+
// return fn(results, get)
|
|
100
|
+
// },
|
|
101
|
+
// label: `${this.label}:js`,
|
|
102
|
+
// onDestroy: () => this.destroy(),
|
|
103
|
+
// dbGraph: this.dbGraph,
|
|
104
|
+
// updatePathDesc: undefined,
|
|
105
|
+
// })
|
|
85
106
|
/** Returns a reactive query */
|
|
86
|
-
getFirstRow = (args) =>
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
107
|
+
// getFirstRow = (args?: { defaultValue?: Result }) =>
|
|
108
|
+
// new LiveStoreJSQuery({
|
|
109
|
+
// fn: (get) => {
|
|
110
|
+
// const results = get(this.results$!)
|
|
111
|
+
// if (results.length === 0 && args?.defaultValue === undefined) {
|
|
112
|
+
// // const queryLabel = this._tag === 'sql' ? this.queryString$!.computeResult(otelContext) : this.label
|
|
113
|
+
// const queryLabel = this.label
|
|
114
|
+
// return shouldNeverHappen(`Expected query ${queryLabel} to return at least one result`)
|
|
115
|
+
// }
|
|
116
|
+
// return results[0] ?? args!.defaultValue!
|
|
117
|
+
// },
|
|
118
|
+
// label: `${this.label}:first`,
|
|
119
|
+
// onDestroy: () => this.destroy(),
|
|
120
|
+
// dbGraph: this.dbGraph,
|
|
121
|
+
// })
|
|
100
122
|
destroy = () => {
|
|
101
123
|
this.dbGraph.destroyNode(this.queryString$);
|
|
102
124
|
this.dbGraph.destroyNode(this.results$);
|
|
@@ -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,aAAa,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/reactiveQueries/sql.ts"],"names":[],"mappings":"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"}
|
package/dist/row-query.d.ts
CHANGED
|
@@ -1,29 +1,30 @@
|
|
|
1
1
|
import type * as otel from '@opentelemetry/api';
|
|
2
2
|
import { SqliteDsl } from 'effect-db-schema';
|
|
3
|
-
import type { DbGraph } from './reactiveQueries/base-class.js';
|
|
4
|
-
import type
|
|
5
|
-
import type {
|
|
6
|
-
import type {
|
|
7
|
-
export type
|
|
8
|
-
table: TTableDef;
|
|
9
|
-
store: Store;
|
|
3
|
+
import type { DbGraph, LiveQuery } from './reactiveQueries/base-class.js';
|
|
4
|
+
import { type DefaultSqliteTableDef, type TableDef, type TableOptions } from './schema/table-def.js';
|
|
5
|
+
import type { UpdatePathDescCol, UpdatePathDescNone, UpdatePathDescRow } from './update-path.js';
|
|
6
|
+
import type { GetValForKey } from './utils/util.js';
|
|
7
|
+
export type RowQueryOptions = {
|
|
10
8
|
otelContext?: otel.Context;
|
|
11
|
-
defaultValues: Partial<RowResult<TTableDef>>;
|
|
12
9
|
skipInsertDefaultRow?: boolean;
|
|
13
10
|
dbGraph?: DbGraph;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
store: Store;
|
|
17
|
-
otelContext?: otel.Context;
|
|
18
|
-
id: string;
|
|
11
|
+
};
|
|
12
|
+
export type RowQueryOptionsDefaulValues<TTableDef extends TableDef> = {
|
|
19
13
|
defaultValues: Partial<RowResult<TTableDef>>;
|
|
20
|
-
skipInsertDefaultRow?: boolean;
|
|
21
|
-
dbGraph?: DbGraph;
|
|
22
14
|
};
|
|
23
|
-
export
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
15
|
+
export type MakeRowQuery = {
|
|
16
|
+
<TTableDef extends TableDef<DefaultSqliteTableDef, boolean, TableOptions & {
|
|
17
|
+
isSingleton: true;
|
|
18
|
+
}>>(table: TTableDef, options?: RowQueryOptions): LiveQuery<RowResult<TTableDef>, UpdatePathDescRow<TTableDef>>;
|
|
19
|
+
<TTableDef extends TableDef<DefaultSqliteTableDef, boolean, TableOptions & {
|
|
20
|
+
isSingleton: false;
|
|
21
|
+
}>>(table: TTableDef, id: string, options?: RowQueryOptions & RowQueryOptionsDefaulValues<TTableDef>): LiveQuery<RowResult<TTableDef>, UpdatePathDescRow<TTableDef>>;
|
|
22
|
+
};
|
|
23
|
+
export declare const rowQuery: MakeRowQuery;
|
|
24
|
+
export type RowResult<TTableDef extends TableDef> = TTableDef['isSingleColumn'] extends true ? GetValForKey<SqliteDsl.FromColumns.RowDecoded<TTableDef['sqliteDef']['columns']>, 'value'> : SqliteDsl.FromColumns.RowDecoded<TTableDef['sqliteDef']['columns']>;
|
|
25
|
+
export type RowResultEncoded<TTableDef extends TableDef> = TTableDef['isSingleColumn'] extends true ? GetValForKey<SqliteDsl.FromColumns.RowEncoded<TTableDef['sqliteDef']['columns']>, 'value'> : SqliteDsl.FromColumns.RowEncoded<TTableDef['sqliteDef']['columns']>;
|
|
26
|
+
export declare const deriveColQuery: {
|
|
27
|
+
<TQuery extends LiveQuery<any, UpdatePathDescNone>, TCol extends keyof TQuery['result!'] & string>(query$: TQuery, colName: TCol): LiveQuery<TQuery['result!'][TCol], UpdatePathDescNone>;
|
|
28
|
+
<TQuery extends LiveQuery<any, UpdatePathDescRow<any>>, TCol extends keyof TQuery['result!'] & string>(query$: TQuery, colName: TCol): LiveQuery<TQuery['result!'][TCol], UpdatePathDescCol<TQuery['updatePathDesc']['table'], TCol>>;
|
|
29
|
+
};
|
|
29
30
|
//# sourceMappingURL=row-query.d.ts.map
|
package/dist/row-query.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"row-query.d.ts","sourceRoot":"","sources":["../src/row-query.ts"],"names":[],"mappings":"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"}
|
package/dist/row-query.js
CHANGED
|
@@ -1,85 +1,100 @@
|
|
|
1
1
|
import { shouldNeverHappen } from '@livestore/utils';
|
|
2
2
|
import { pipe, ReadonlyRecord, Schema, TreeFormatter } from '@livestore/utils/effect';
|
|
3
3
|
import { SqliteAst, SqliteDsl } from 'effect-db-schema';
|
|
4
|
+
import { computed } from './index.js';
|
|
4
5
|
import { migrateTable } from './migrations.js';
|
|
6
|
+
// import type { LiveStoreJSQuery } from './reactiveQueries/js.js'
|
|
5
7
|
import { LiveStoreSQLQuery } from './reactiveQueries/sql.js';
|
|
6
8
|
import { SCHEMA_META_TABLE } from './schema/index.js';
|
|
9
|
+
import { getDefaultValuesEncoded, } from './schema/table-def.js';
|
|
7
10
|
import { prepareBindValues, sql } from './utils/util.js';
|
|
8
11
|
// TODO also allow other where clauses and multiple rows
|
|
9
|
-
export const rowQuery = (
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
const
|
|
12
|
+
export const rowQuery = (table, idOrOptions, options_) => {
|
|
13
|
+
const id = typeof idOrOptions === 'string' ? idOrOptions : undefined;
|
|
14
|
+
const options = typeof idOrOptions === 'string' ? options_ : idOrOptions;
|
|
15
|
+
const defaultValues = options?.defaultValues ?? {};
|
|
13
16
|
// Validate query args
|
|
14
17
|
if (table.options.isSingleton === true && id !== undefined) {
|
|
15
|
-
shouldNeverHappen(`Cannot query state table ${table.
|
|
18
|
+
shouldNeverHappen(`Cannot query state table ${table.sqliteDef.name} with id "${id}" as it is a singleton`);
|
|
16
19
|
}
|
|
17
20
|
else if (table.options.isSingleton !== true && id === undefined) {
|
|
18
|
-
shouldNeverHappen(`Cannot query state table ${table.
|
|
21
|
+
shouldNeverHappen(`Cannot query state table ${table.sqliteDef.name} without id`);
|
|
19
22
|
}
|
|
20
|
-
const stateSchema = table.
|
|
23
|
+
const stateSchema = table.sqliteDef;
|
|
21
24
|
const componentTableName = stateSchema.name;
|
|
25
|
+
const whereClause = id === undefined ? '' : `where id = '${id}'`;
|
|
26
|
+
const queryStr = sql `select * from ${componentTableName} ${whereClause} limit 1`;
|
|
27
|
+
return new LiveStoreSQLQuery({
|
|
28
|
+
label: `rowQuery:query:${stateSchema.name}${id === undefined ? '' : `:${id}`}`,
|
|
29
|
+
genQueryString: queryStr,
|
|
30
|
+
queriedTables: new Set([componentTableName]),
|
|
31
|
+
dbGraph: options?.dbGraph,
|
|
32
|
+
execBeforeFirstRun: makeExecBeforeFirstRun({
|
|
33
|
+
otelContext: options?.otelContext,
|
|
34
|
+
table,
|
|
35
|
+
componentTableName,
|
|
36
|
+
defaultValues,
|
|
37
|
+
id,
|
|
38
|
+
skipInsertDefaultRow: options?.skipInsertDefaultRow,
|
|
39
|
+
}),
|
|
40
|
+
map: (results) => {
|
|
41
|
+
if (results.length === 0)
|
|
42
|
+
return shouldNeverHappen(`No results for query ${queryStr}`);
|
|
43
|
+
const componentStateEffectSchema = SqliteDsl.structSchemaForTable(stateSchema);
|
|
44
|
+
const parseResult = Schema.parseEither(componentStateEffectSchema)(results[0]);
|
|
45
|
+
if (parseResult._tag === 'Left') {
|
|
46
|
+
console.error('decode error', TreeFormatter.formatError(parseResult.left), 'results', results);
|
|
47
|
+
return shouldNeverHappen(`Error decoding query result for ${queryStr}`);
|
|
48
|
+
}
|
|
49
|
+
return table.isSingleColumn === true ? parseResult.right.value : parseResult.right;
|
|
50
|
+
},
|
|
51
|
+
updatePathDesc: { _tag: 'Row', table, id: id ?? 'singleton' },
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
export const deriveColQuery = (query$, colName) => {
|
|
55
|
+
return computed((get) => get(query$)[colName], {
|
|
56
|
+
label: `deriveColQuery:${query$.label}:${colName}`,
|
|
57
|
+
updatePathDesc: query$.updatePathDesc._tag === 'Row'
|
|
58
|
+
? { _tag: 'Col', table: query$.updatePathDesc.table, column: colName, id: query$.updatePathDesc.id }
|
|
59
|
+
: undefined,
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
const insertRowWithDefaultValuesOrIgnore = ({ db, id, table, otelContext, defaultValues: explicitDefaultValues, }) => {
|
|
63
|
+
const columnNames = Object.keys(table.sqliteDef.columns);
|
|
64
|
+
const columnValues = columnNames.map((name) => `$${name}`).join(', ');
|
|
65
|
+
const tableName = table.sqliteDef.name;
|
|
66
|
+
const insertQuery = sql `insert into ${tableName} (${columnNames.join(', ')}) select ${columnValues} where not exists(select 1 from ${tableName} where id = '${id}')`;
|
|
67
|
+
const defaultValues = pipe(getDefaultValuesEncoded(table), ReadonlyRecord.map((val, columnName) => explicitDefaultValues?.[columnName] ?? val));
|
|
68
|
+
db.execute(insertQuery, prepareBindValues({ ...defaultValues, id }, insertQuery), [tableName], { otelContext });
|
|
69
|
+
};
|
|
70
|
+
const makeExecBeforeFirstRun = ({ id, defaultValues, skipInsertDefaultRow, otelContext: otelContext_, table, componentTableName, }) => ({ store }) => {
|
|
71
|
+
const otelContext = otelContext_ ?? store.otel.queriesSpanContext;
|
|
22
72
|
// TODO find a better solution for this
|
|
23
73
|
if (store.tableRefs[componentTableName] === undefined) {
|
|
24
|
-
const schemaHash = SqliteAst.hash(
|
|
74
|
+
const schemaHash = SqliteAst.hash(table.sqliteDef.ast);
|
|
25
75
|
const res = store.inMemoryDB.select(sql `SELECT schemaHash FROM ${SCHEMA_META_TABLE} WHERE tableName = '${componentTableName}'`);
|
|
26
76
|
if (res.length === 0 || res[0].schemaHash !== schemaHash) {
|
|
27
77
|
migrateTable({
|
|
28
78
|
db: store._proxyDb,
|
|
29
|
-
tableAst:
|
|
79
|
+
tableAst: table.sqliteDef.ast,
|
|
30
80
|
otelContext,
|
|
31
81
|
schemaHash,
|
|
32
82
|
});
|
|
33
83
|
}
|
|
34
84
|
const label = `tableRef:${componentTableName}`;
|
|
85
|
+
// TODO find a better implementation for this
|
|
35
86
|
const existingTableRefFromGraph = Array.from(store.graph.atoms.values()).find((_) => _._tag === 'ref' && _.label === label);
|
|
36
|
-
store.tableRefs[componentTableName] =
|
|
37
|
-
existingTableRefFromGraph ??
|
|
38
|
-
store.graph.makeRef(null, {
|
|
39
|
-
equal: () => false,
|
|
40
|
-
label,
|
|
41
|
-
meta: { liveStoreRefType: 'table' },
|
|
42
|
-
});
|
|
87
|
+
store.tableRefs[componentTableName] = existingTableRefFromGraph ?? store.makeTableRef(componentTableName);
|
|
43
88
|
}
|
|
44
89
|
if (skipInsertDefaultRow !== true) {
|
|
45
90
|
// TODO find a way to only do this if necessary
|
|
46
91
|
insertRowWithDefaultValuesOrIgnore({
|
|
47
92
|
db: store._proxyDb,
|
|
48
93
|
id: id ?? 'singleton',
|
|
49
|
-
|
|
94
|
+
table,
|
|
50
95
|
otelContext,
|
|
51
96
|
defaultValues,
|
|
52
97
|
});
|
|
53
98
|
}
|
|
54
|
-
const whereClause = id === undefined ? '' : `where id = '${id}'`;
|
|
55
|
-
const queryStr = sql `select * from ${componentTableName} ${whereClause} limit 1`;
|
|
56
|
-
return new LiveStoreSQLQuery({
|
|
57
|
-
label: `localState:query:${stateSchema.name}${id === undefined ? '' : `:${id}`}`,
|
|
58
|
-
genQueryString: queryStr,
|
|
59
|
-
queriedTables: new Set([componentTableName]),
|
|
60
|
-
dbGraph,
|
|
61
|
-
}).pipe((results) => {
|
|
62
|
-
if (results.length === 0)
|
|
63
|
-
return shouldNeverHappen(`No results for query ${queryStr}`);
|
|
64
|
-
const componentStateEffectSchema = SqliteDsl.structSchemaForTable(stateSchema);
|
|
65
|
-
const parseResult = Schema.parseEither(componentStateEffectSchema)(results[0]);
|
|
66
|
-
if (parseResult._tag === 'Left') {
|
|
67
|
-
console.error('decode error', TreeFormatter.formatErrors(parseResult.left.errors), 'results', results);
|
|
68
|
-
return shouldNeverHappen(`Error decoding query result for ${queryStr}`);
|
|
69
|
-
}
|
|
70
|
-
return table.isSingleColumn === true ? parseResult.right.value : parseResult.right;
|
|
71
|
-
});
|
|
72
|
-
};
|
|
73
|
-
const insertRowWithDefaultValuesOrIgnore = ({ db, id, stateSchema, otelContext, defaultValues: explicitDefaultValues, }) => {
|
|
74
|
-
const columnNames = Object.keys(stateSchema.columns);
|
|
75
|
-
const columnValues = columnNames.map((name) => `$${name}`).join(', ');
|
|
76
|
-
const tableName = stateSchema.name;
|
|
77
|
-
const insertQuery = sql `insert into ${tableName} (${columnNames.join(', ')}) select ${columnValues} where not exists(select 1 from ${tableName} where id = '${id}')`;
|
|
78
|
-
const defaultValues = pipe(stateSchema.columns, ReadonlyRecord.filter((_, key) => key !== 'id'), ReadonlyRecord.map((column, columnName) => column.default._tag === 'None'
|
|
79
|
-
? column.nullable === true
|
|
80
|
-
? null
|
|
81
|
-
: shouldNeverHappen(`Column ${columnName} has no default value and is not nullable`)
|
|
82
|
-
: Schema.encodeSync(column.schema)(column.default.value)), ReadonlyRecord.map((val, columnName) => explicitDefaultValues?.[columnName] ?? val));
|
|
83
|
-
void db.execute(insertQuery, prepareBindValues({ ...defaultValues, id }, insertQuery), [tableName], { otelContext });
|
|
84
99
|
};
|
|
85
100
|
//# sourceMappingURL=row-query.js.map
|