@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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/QueryCache.d.ts.map +1 -1
- package/dist/SqliteDbWrapper.d.ts +60 -0
- package/dist/SqliteDbWrapper.d.ts.map +1 -0
- package/dist/{SynchronousDatabaseWrapper.js → SqliteDbWrapper.js} +69 -34
- package/dist/SqliteDbWrapper.js.map +1 -0
- package/dist/effect/LiveStore.d.ts +6 -34
- package/dist/effect/LiveStore.d.ts.map +1 -1
- package/dist/effect/LiveStore.js +10 -12
- package/dist/effect/LiveStore.js.map +1 -1
- package/dist/effect/mod.d.ts +3 -0
- package/dist/effect/mod.d.ts.map +1 -0
- package/dist/effect/mod.js +3 -0
- package/dist/effect/mod.js.map +1 -0
- package/dist/internal/mod.d.ts +3 -0
- package/dist/internal/mod.d.ts.map +1 -0
- package/dist/internal/mod.js +3 -0
- package/dist/internal/mod.js.map +1 -0
- package/dist/live-queries/base-class.d.ts +65 -27
- package/dist/live-queries/base-class.d.ts.map +1 -1
- package/dist/live-queries/base-class.js +54 -13
- package/dist/live-queries/base-class.js.map +1 -1
- package/dist/live-queries/client-document-get-query.d.ts +12 -0
- package/dist/live-queries/client-document-get-query.d.ts.map +1 -0
- package/dist/live-queries/client-document-get-query.js +18 -0
- package/dist/live-queries/client-document-get-query.js.map +1 -0
- package/dist/live-queries/computed.d.ts +12 -14
- package/dist/live-queries/computed.d.ts.map +1 -1
- package/dist/live-queries/computed.js +37 -15
- package/dist/live-queries/computed.js.map +1 -1
- package/dist/live-queries/db-query.d.ts +93 -0
- package/dist/live-queries/db-query.d.ts.map +1 -0
- package/dist/live-queries/{db.js → db-query.js} +111 -40
- package/dist/live-queries/db-query.js.map +1 -0
- package/dist/live-queries/db-query.test.d.ts +2 -0
- package/dist/live-queries/db-query.test.d.ts.map +1 -0
- package/dist/live-queries/db-query.test.js +133 -0
- package/dist/live-queries/db-query.test.js.map +1 -0
- package/dist/live-queries/mod.d.ts +5 -0
- package/dist/live-queries/mod.d.ts.map +1 -0
- package/dist/live-queries/mod.js +5 -0
- package/dist/live-queries/mod.js.map +1 -0
- package/dist/live-queries/signal.d.ts +20 -0
- package/dist/live-queries/signal.d.ts.map +1 -0
- package/dist/live-queries/signal.js +33 -0
- package/dist/live-queries/signal.js.map +1 -0
- package/dist/live-queries/signal.test.d.ts +2 -0
- package/dist/live-queries/signal.test.d.ts.map +1 -0
- package/dist/live-queries/signal.test.js +25 -0
- package/dist/live-queries/signal.test.js.map +1 -0
- package/dist/mod.d.ts +14 -0
- package/dist/mod.d.ts.map +1 -0
- package/dist/mod.js +13 -0
- package/dist/mod.js.map +1 -0
- package/dist/reactive.d.ts +23 -17
- package/dist/reactive.d.ts.map +1 -1
- package/dist/reactive.js +23 -19
- package/dist/reactive.js.map +1 -1
- package/dist/reactive.test.js +1 -1
- package/dist/reactive.test.js.map +1 -1
- package/dist/store/create-store.d.ts +70 -12
- package/dist/store/create-store.d.ts.map +1 -1
- package/dist/store/create-store.js +68 -19
- package/dist/store/create-store.js.map +1 -1
- package/dist/store/devtools.d.ts +5 -4
- package/dist/store/devtools.d.ts.map +1 -1
- package/dist/store/devtools.js +92 -40
- package/dist/store/devtools.js.map +1 -1
- package/dist/store/store-types.d.ts +54 -42
- package/dist/store/store-types.d.ts.map +1 -1
- package/dist/store/store-types.js +2 -5
- package/dist/store/store-types.js.map +1 -1
- package/dist/store/store.d.ts +141 -35
- package/dist/store/store.d.ts.map +1 -1
- package/dist/store/store.js +319 -153
- package/dist/store/store.js.map +1 -1
- package/dist/utils/data-structures.d.ts.map +1 -1
- package/dist/utils/dev.d.ts.map +1 -1
- package/dist/utils/dev.js +6 -1
- package/dist/utils/dev.js.map +1 -1
- package/dist/utils/function-string.d.ts +7 -0
- package/dist/utils/function-string.d.ts.map +1 -0
- package/dist/utils/function-string.js +9 -0
- package/dist/utils/function-string.js.map +1 -0
- package/dist/utils/stack-info.d.ts.map +1 -1
- package/dist/utils/stack-info.js +6 -1
- package/dist/utils/stack-info.js.map +1 -1
- package/dist/utils/stack-info.test.js +54 -1
- package/dist/utils/stack-info.test.js.map +1 -1
- package/dist/utils/tests/fixture.d.ts +59 -216
- package/dist/utils/tests/fixture.d.ts.map +1 -1
- package/dist/utils/tests/fixture.js +23 -18
- package/dist/utils/tests/fixture.js.map +1 -1
- package/dist/utils/tests/mod.d.ts +1 -0
- package/dist/utils/tests/mod.d.ts.map +1 -1
- package/dist/utils/tests/mod.js +1 -0
- package/dist/utils/tests/mod.js.map +1 -1
- package/dist/utils/tests/otel.d.ts.map +1 -1
- package/dist/utils/tests/otel.js +8 -3
- package/dist/utils/tests/otel.js.map +1 -1
- package/package.json +29 -26
- package/src/{SynchronousDatabaseWrapper.ts → SqliteDbWrapper.ts} +92 -42
- package/src/effect/LiveStore.ts +27 -64
- package/src/effect/{index.ts → mod.ts} +2 -3
- package/src/internal/mod.ts +2 -0
- package/src/live-queries/__snapshots__/{db.test.ts.snap → db-query.test.ts.snap} +241 -45
- package/src/live-queries/base-class.ts +152 -50
- package/src/live-queries/client-document-get-query.ts +52 -0
- package/src/live-queries/computed.ts +51 -33
- package/src/live-queries/db-query.test.ts +192 -0
- package/src/live-queries/{db.ts → db-query.ts} +168 -81
- package/src/live-queries/mod.ts +4 -0
- package/src/live-queries/signal.test.ts +40 -0
- package/src/live-queries/signal.ts +47 -0
- package/src/mod.ts +42 -0
- package/src/reactive.test.ts +1 -1
- package/src/reactive.ts +66 -43
- package/src/store/create-store.ts +188 -62
- package/src/store/devtools.ts +124 -46
- package/src/store/store-types.ts +54 -43
- package/src/store/store.ts +454 -236
- package/src/utils/dev.ts +6 -1
- package/src/utils/function-string.ts +12 -0
- package/src/utils/stack-info.test.ts +58 -1
- package/src/utils/stack-info.ts +6 -1
- package/src/utils/tests/fixture.ts +22 -31
- package/src/utils/tests/mod.ts +1 -0
- package/src/utils/tests/otel.ts +10 -3
- package/dist/SynchronousDatabaseWrapper.d.ts +0 -41
- package/dist/SynchronousDatabaseWrapper.d.ts.map +0 -1
- package/dist/SynchronousDatabaseWrapper.js.map +0 -1
- package/dist/effect/index.d.ts +0 -2
- package/dist/effect/index.d.ts.map +0 -1
- package/dist/effect/index.js +0 -2
- package/dist/effect/index.js.map +0 -1
- package/dist/global-state.d.ts +0 -14
- package/dist/global-state.d.ts.map +0 -1
- package/dist/global-state.js +0 -16
- package/dist/global-state.js.map +0 -1
- package/dist/index.d.ts +0 -20
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -16
- package/dist/index.js.map +0 -1
- package/dist/live-queries/db.d.ts +0 -66
- package/dist/live-queries/db.d.ts.map +0 -1
- package/dist/live-queries/db.js.map +0 -1
- package/dist/live-queries/db.test.d.ts +0 -2
- package/dist/live-queries/db.test.d.ts.map +0 -1
- package/dist/live-queries/db.test.js +0 -118
- package/dist/live-queries/db.test.js.map +0 -1
- package/dist/live-queries/graphql.d.ts +0 -49
- package/dist/live-queries/graphql.d.ts.map +0 -1
- package/dist/live-queries/graphql.js +0 -122
- package/dist/live-queries/graphql.js.map +0 -1
- package/dist/row-query-utils.d.ts +0 -17
- package/dist/row-query-utils.d.ts.map +0 -1
- package/dist/row-query-utils.js +0 -30
- package/dist/row-query-utils.js.map +0 -1
- package/dist/utils/otel.d.ts +0 -4
- package/dist/utils/otel.d.ts.map +0 -1
- package/dist/utils/otel.js +0 -6
- package/dist/utils/otel.js.map +0 -1
- package/src/global-state.ts +0 -20
- package/src/index.ts +0 -66
- package/src/live-queries/db.test.ts +0 -154
- package/src/live-queries/graphql.ts +0 -219
- package/src/row-query-utils.ts +0 -65
- package/src/utils/otel.ts +0 -9
- package/tsconfig.json +0 -18
- package/vitest.config.js +0 -9
@@ -1,7 +1,14 @@
|
|
1
|
-
import {
|
2
|
-
|
1
|
+
import { isNotNil } from '@livestore/utils';
|
2
|
+
import * as RG from '../reactive.js';
|
3
|
+
export const makeReactivityGraph = () => new RG.ReactiveGraph();
|
3
4
|
let queryIdCounter = 0;
|
4
5
|
export const TypeId = Symbol.for('LiveQuery');
|
6
|
+
export const depsToString = (deps) => {
|
7
|
+
if (typeof deps === 'string' || typeof deps === 'number') {
|
8
|
+
return deps.toString();
|
9
|
+
}
|
10
|
+
return deps.filter(isNotNil).join(',');
|
11
|
+
};
|
5
12
|
export class LiveStoreQueryBase {
|
6
13
|
'__result!';
|
7
14
|
id = queryIdCounter++;
|
@@ -11,21 +18,55 @@ export class LiveStoreQueryBase {
|
|
11
18
|
return this.results$.recomputations;
|
12
19
|
}
|
13
20
|
executionTimes = [];
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
this.
|
18
|
-
return result;
|
21
|
+
// TODO double check if this is needed
|
22
|
+
isDestroyed = false;
|
23
|
+
run = (args) => {
|
24
|
+
return this.results$.computeResult(args.otelContext, args.debugRefreshReason);
|
19
25
|
};
|
20
|
-
|
21
|
-
throwContextNotSetError(this.reactivityGraph);
|
26
|
+
dependencyQueriesRef = new Set();
|
22
27
|
}
|
23
|
-
export const makeGetAtomResult = (get, otelContext) => {
|
24
|
-
|
28
|
+
export const makeGetAtomResult = (get, ctx, otelContext, dependencyQueriesRef) => {
|
29
|
+
// NOTE we're using the `otelContext` from `makeGetAtomResult` here, not the `otelContext` from `getAtom`
|
30
|
+
const getAtom = (atom, _otelContext, debugRefreshReason) => {
|
31
|
+
// ReactivityGraph atoms case
|
25
32
|
if (atom._tag === 'thunk' || atom._tag === 'ref')
|
26
|
-
return get(atom, otelContext);
|
27
|
-
|
33
|
+
return get(atom, otelContext, debugRefreshReason);
|
34
|
+
// def case
|
35
|
+
if (atom._tag === 'def' || atom._tag === 'signal-def') {
|
36
|
+
const query = atom.make(ctx);
|
37
|
+
dependencyQueriesRef.add(query);
|
38
|
+
// TODO deref the query on destroy
|
39
|
+
return getAtom(query.value, _otelContext, debugRefreshReason);
|
40
|
+
}
|
41
|
+
// Signal case
|
42
|
+
if (atom._tag === 'signal')
|
43
|
+
return get(atom.ref, otelContext, debugRefreshReason);
|
44
|
+
// LiveQuery case
|
45
|
+
return get(atom.results$, otelContext, debugRefreshReason);
|
28
46
|
};
|
29
47
|
return getAtom;
|
30
48
|
};
|
49
|
+
export const withRCMap = (id, make) => {
|
50
|
+
return (ctx, otelContext) => {
|
51
|
+
let item = ctx.defRcMap.get(id);
|
52
|
+
if (item) {
|
53
|
+
item.rc++;
|
54
|
+
return item;
|
55
|
+
}
|
56
|
+
const query$ = make(ctx, otelContext);
|
57
|
+
item = {
|
58
|
+
rc: 1,
|
59
|
+
value: query$,
|
60
|
+
deref: () => {
|
61
|
+
item.rc--;
|
62
|
+
if (item.rc === 0) {
|
63
|
+
item.value.destroy();
|
64
|
+
ctx.defRcMap.delete(id);
|
65
|
+
}
|
66
|
+
},
|
67
|
+
};
|
68
|
+
ctx.defRcMap.set(id, item);
|
69
|
+
return item;
|
70
|
+
};
|
71
|
+
};
|
31
72
|
//# sourceMappingURL=base-class.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"base-class.js","sourceRoot":"","sources":["../../src/live-queries/base-class.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"base-class.js","sourceRoot":"","sources":["../../src/live-queries/base-class.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import { SessionIdSymbol } from '@livestore/common';
|
2
|
+
import { State } from '@livestore/common/schema';
|
3
|
+
import type * as otel from '@opentelemetry/api';
|
4
|
+
import type { ReactivityGraphContext } from './base-class.js';
|
5
|
+
export declare const rowQueryLabel: (table: State.SQLite.ClientDocumentTableDef.Any, id: string | SessionIdSymbol | undefined) => string;
|
6
|
+
export declare const makeExecBeforeFirstRun: ({ id, explicitDefaultValues, table, otelContext: otelContext_, }: {
|
7
|
+
id?: string | SessionIdSymbol;
|
8
|
+
explicitDefaultValues?: any;
|
9
|
+
table: State.SQLite.TableDefBase;
|
10
|
+
otelContext: otel.Context | undefined;
|
11
|
+
}) => ({ store }: ReactivityGraphContext) => undefined;
|
12
|
+
//# sourceMappingURL=client-document-get-query.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"client-document-get-query.d.ts","sourceRoot":"","sources":["../../src/live-queries/client-document-get-query.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AAEhD,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE/C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AAE7D,eAAO,MAAM,aAAa,GACxB,OAAO,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,GAAG,EAC9C,IAAI,MAAM,GAAG,eAAe,GAAG,SAAS,WAC2E,CAAA;AAErH,eAAO,MAAM,sBAAsB,GAChC,kEAKE;IACD,EAAE,CAAC,EAAE,MAAM,GAAG,eAAe,CAAA;IAC7B,qBAAqB,CAAC,EAAE,GAAG,CAAA;IAC3B,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,YAAY,CAAA;IAChC,WAAW,EAAE,IAAI,CAAC,OAAO,GAAG,SAAS,CAAA;CACtC,MACA,WAAW,sBAAsB,cA0BjC,CAAA"}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
import { SessionIdSymbol } from '@livestore/common';
|
2
|
+
import { State } from '@livestore/common/schema';
|
3
|
+
import { shouldNeverHappen } from '@livestore/utils';
|
4
|
+
export const rowQueryLabel = (table, id) => `${table.sqliteDef.name}.get:${id === undefined ? table.default.id : id === SessionIdSymbol ? 'sessionId' : id}`;
|
5
|
+
export const makeExecBeforeFirstRun = ({ id, explicitDefaultValues, table, otelContext: otelContext_, }) => ({ store }) => {
|
6
|
+
if (State.SQLite.tableIsClientDocumentTable(table) === false) {
|
7
|
+
return shouldNeverHappen(`Cannot insert row for table "${table.sqliteDef.name}" which does not have 'deriveEvents: true' set`);
|
8
|
+
}
|
9
|
+
const otelContext = otelContext_ ?? store.otel.queriesSpanContext;
|
10
|
+
const idVal = id === SessionIdSymbol ? store.sessionId : id;
|
11
|
+
const rowExists = store.sqliteDbWrapper.select(`SELECT 1 FROM '${table.sqliteDef.name}' WHERE id = ?`, [idVal], { otelContext }).length === 1;
|
12
|
+
if (rowExists)
|
13
|
+
return;
|
14
|
+
// It's important that we only commit and don't refresh here, as this function might be called during a render
|
15
|
+
// and otherwise we might end up in a "reactive loop"
|
16
|
+
store.commit({ otelContext, skipRefresh: true, label: `${table.sqliteDef.name}.set:${idVal}` }, table.set(explicitDefaultValues, idVal));
|
17
|
+
};
|
18
|
+
//# sourceMappingURL=client-document-get-query.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"client-document-get-query.js","sourceRoot":"","sources":["../../src/live-queries/client-document-get-query.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAKpD,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,KAA8C,EAC9C,EAAwC,EACxC,EAAE,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,QAAQ,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;AAErH,MAAM,CAAC,MAAM,sBAAsB,GACjC,CAAC,EACC,EAAE,EACF,qBAAqB,EACrB,KAAK,EACL,WAAW,EAAE,YAAY,GAM1B,EAAE,EAAE,CACL,CAAC,EAAE,KAAK,EAA0B,EAAE,EAAE;IACpC,IAAI,KAAK,CAAC,MAAM,CAAC,0BAA0B,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE,CAAC;QAC7D,OAAO,iBAAiB,CACtB,gCAAgC,KAAK,CAAC,SAAS,CAAC,IAAI,gDAAgD,CACrG,CAAA;IACH,CAAC;IAED,MAAM,WAAW,GAAG,YAAY,IAAI,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAA;IAEjE,MAAM,KAAK,GAAG,EAAE,KAAK,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAG,CAAA;IAC5D,MAAM,SAAS,GACb,KAAK,CAAC,eAAe,CAAC,MAAM,CAC1B,kBAAkB,KAAK,CAAC,SAAS,CAAC,IAAI,gBAAgB,EACtD,CAAC,KAAK,CAA8B,EACpC,EAAE,WAAW,EAAE,CAChB,CAAC,MAAM,KAAK,CAAC,CAAA;IAEhB,IAAI,SAAS;QAAE,OAAM;IAErB,8GAA8G;IAC9G,qDAAqD;IAErD,KAAK,CAAC,MAAM,CACV,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,QAAQ,KAAK,EAAE,EAAE,EACjF,KAAK,CAAC,GAAG,CAAC,qBAAqB,EAAE,KAAa,CAAC,CAChD,CAAA;AACH,CAAC,CAAA"}
|
@@ -1,25 +1,23 @@
|
|
1
|
-
import type { QueryInfo } from '@livestore/common';
|
2
1
|
import type { Thunk } from '../reactive.js';
|
3
2
|
import type { RefreshReason } from '../store/store-types.js';
|
4
|
-
import type {
|
3
|
+
import type { DepKey, GetAtomResult, LiveQueryDef, ReactivityGraph, ReactivityGraphContext } from './base-class.js';
|
5
4
|
import { LiveStoreQueryBase } from './base-class.js';
|
6
|
-
export declare const computed: <TResult
|
7
|
-
label
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
export declare class LiveStoreComputedQuery<TResult, TQueryInfo extends QueryInfo = QueryInfo.None> extends LiveStoreQueryBase<TResult, TQueryInfo> {
|
5
|
+
export declare const computed: <TResult>(fn: (get: GetAtomResult) => TResult, options?: {
|
6
|
+
label?: string;
|
7
|
+
deps?: DepKey;
|
8
|
+
}) => LiveQueryDef<TResult>;
|
9
|
+
export declare class LiveStoreComputedQuery<TResult> extends LiveStoreQueryBase<TResult> {
|
12
10
|
_tag: 'computed';
|
13
11
|
/** A reactive thunk representing the query results */
|
14
|
-
results$: Thunk<TResult,
|
12
|
+
results$: Thunk<TResult, ReactivityGraphContext, RefreshReason>;
|
15
13
|
label: string;
|
16
|
-
|
17
|
-
|
18
|
-
constructor({ fn, label, reactivityGraph,
|
14
|
+
reactivityGraph: ReactivityGraph;
|
15
|
+
def: LiveQueryDef<TResult>;
|
16
|
+
constructor({ fn, label, reactivityGraph, def, }: {
|
19
17
|
label: string;
|
20
18
|
fn: (get: GetAtomResult) => TResult;
|
21
|
-
reactivityGraph
|
22
|
-
|
19
|
+
reactivityGraph: ReactivityGraph;
|
20
|
+
def: LiveQueryDef<TResult>;
|
23
21
|
});
|
24
22
|
destroy: () => void;
|
25
23
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"computed.d.ts","sourceRoot":"","sources":["../../src/live-queries/computed.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"computed.d.ts","sourceRoot":"","sources":["../../src/live-queries/computed.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAE5D,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AACnH,OAAO,EAAgB,kBAAkB,EAAgC,MAAM,iBAAiB,CAAA;AAEhG,eAAO,MAAM,QAAQ,GAAI,OAAO,EAC9B,IAAI,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,EACnC,UAAU;IACR,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,KACA,YAAY,CAAC,OAAO,CAyBtB,CAAA;AAED,qBAAa,sBAAsB,CAAC,OAAO,CAAE,SAAQ,kBAAkB,CAAC,OAAO,CAAC;IAC9E,IAAI,EAAE,UAAU,CAAa;IAE7B,sDAAsD;IACtD,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,sBAAsB,EAAE,aAAa,CAAC,CAAA;IAE/D,KAAK,EAAE,MAAM,CAAA;IAEb,eAAe,EAAE,eAAe,CAAA;IAChC,GAAG,EAAE,YAAY,CAAC,OAAO,CAAC,CAAA;gBAEd,EACV,EAAE,EACF,KAAK,EACL,eAAe,EACf,GAAG,GACJ,EAAE;QACD,KAAK,EAAE,MAAM,CAAA;QACb,EAAE,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAA;QACnC,eAAe,EAAE,eAAe,CAAA;QAChC,GAAG,EAAE,YAAY,CAAC,OAAO,CAAC,CAAA;KAC3B;IA6BD,OAAO,aAQN;CACF"}
|
@@ -1,29 +1,47 @@
|
|
1
|
+
import { getDurationMsFromSpan } from '@livestore/common';
|
1
2
|
import * as otel from '@opentelemetry/api';
|
2
|
-
import {
|
3
|
-
import {
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
3
|
+
import { isValidFunctionString } from '../utils/function-string.js';
|
4
|
+
import { depsToString, LiveStoreQueryBase, makeGetAtomResult, withRCMap } from './base-class.js';
|
5
|
+
export const computed = (fn, options) => {
|
6
|
+
const hash = options?.deps ? depsToString(options.deps) : fn.toString();
|
7
|
+
if (isValidFunctionString(hash)._tag === 'invalid') {
|
8
|
+
throw new Error(`On Expo/React Native, computed queries must provide a \`deps\` option`);
|
9
|
+
}
|
10
|
+
const def = {
|
11
|
+
_tag: 'def',
|
12
|
+
make: withRCMap(hash, (ctx, _otelContext) => {
|
13
|
+
// TODO onDestroy
|
14
|
+
return new LiveStoreComputedQuery({
|
15
|
+
fn,
|
16
|
+
label: options?.label ?? fn.toString(),
|
17
|
+
reactivityGraph: ctx.reactivityGraph.deref(),
|
18
|
+
def,
|
19
|
+
});
|
20
|
+
}),
|
21
|
+
label: options?.label ?? fn.toString(),
|
22
|
+
// NOTE We're using the `makeQuery` function body string to make sure the key is unique across the app
|
23
|
+
// TODO we should figure out whether this could cause some problems and/or if there's a better way to do this
|
24
|
+
// NOTE `fn.toString()` doesn't work in Expo as it always produces `[native code]`
|
25
|
+
hash,
|
26
|
+
};
|
27
|
+
return def;
|
28
|
+
};
|
11
29
|
export class LiveStoreComputedQuery extends LiveStoreQueryBase {
|
12
30
|
_tag = 'computed';
|
13
31
|
/** A reactive thunk representing the query results */
|
14
32
|
results$;
|
15
33
|
label;
|
16
34
|
reactivityGraph;
|
17
|
-
|
18
|
-
constructor({ fn, label, reactivityGraph,
|
35
|
+
def;
|
36
|
+
constructor({ fn, label, reactivityGraph, def, }) {
|
19
37
|
super();
|
20
38
|
this.label = label;
|
21
|
-
this.reactivityGraph = reactivityGraph
|
22
|
-
this.
|
39
|
+
this.reactivityGraph = reactivityGraph;
|
40
|
+
this.def = def;
|
23
41
|
const queryLabel = `${label}:results`;
|
24
|
-
this.results$ = this.reactivityGraph.makeThunk((get, setDebugInfo,
|
42
|
+
this.results$ = this.reactivityGraph.makeThunk((get, setDebugInfo, ctx, otelContext) => ctx.otelTracer.startActiveSpan(`js:${label}`, {}, otelContext ?? ctx.rootOtelContext, (span) => {
|
25
43
|
const otelContext = otel.trace.setSpan(otel.context.active(), span);
|
26
|
-
const res = fn(makeGetAtomResult(get, otelContext));
|
44
|
+
const res = fn(makeGetAtomResult(get, ctx, otelContext, this.dependencyQueriesRef));
|
27
45
|
span.end();
|
28
46
|
const durationMs = getDurationMsFromSpan(span);
|
29
47
|
this.executionTimes.push(durationMs);
|
@@ -32,7 +50,11 @@ export class LiveStoreComputedQuery extends LiveStoreQueryBase {
|
|
32
50
|
}), { label: queryLabel, meta: { liveStoreThunkType: 'computed' } });
|
33
51
|
}
|
34
52
|
destroy = () => {
|
53
|
+
this.isDestroyed = true;
|
35
54
|
this.reactivityGraph.destroyNode(this.results$);
|
55
|
+
for (const query of this.dependencyQueriesRef) {
|
56
|
+
query.deref();
|
57
|
+
}
|
36
58
|
};
|
37
59
|
}
|
38
60
|
//# sourceMappingURL=computed.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"computed.js","sourceRoot":"","sources":["../../src/live-queries/computed.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"computed.js","sourceRoot":"","sources":["../../src/live-queries/computed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAI1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AAEnE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAEhG,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,EAAmC,EACnC,OAGC,EACsB,EAAE;IACzB,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAA;IACvE,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAA;IAC1F,CAAC;IAED,MAAM,GAAG,GAAqB;QAC5B,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE;YAC1C,iBAAiB;YACjB,OAAO,IAAI,sBAAsB,CAAU;gBACzC,EAAE;gBACF,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,QAAQ,EAAE;gBACtC,eAAe,EAAE,GAAG,CAAC,eAAe,CAAC,KAAK,EAAG;gBAC7C,GAAG;aACJ,CAAC,CAAA;QACJ,CAAC,CAAC;QACF,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,QAAQ,EAAE;QACtC,sGAAsG;QACtG,6GAA6G;QAC7G,kFAAkF;QAClF,IAAI;KACL,CAAA;IAED,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED,MAAM,OAAO,sBAAgC,SAAQ,kBAA2B;IAC9E,IAAI,GAAe,UAAU,CAAA;IAE7B,sDAAsD;IACtD,QAAQ,CAAuD;IAE/D,KAAK,CAAQ;IAEb,eAAe,CAAiB;IAChC,GAAG,CAAuB;IAE1B,YAAY,EACV,EAAE,EACF,KAAK,EACL,eAAe,EACf,GAAG,GAMJ;QACC,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,eAAe,GAAG,eAAe,CAAA;QACtC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QAEd,MAAM,UAAU,GAAG,GAAG,KAAK,UAAU,CAAA;QAErC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAC5C,CAAC,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,CACtC,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,MAAM,KAAK,EAAE,EAAE,EAAE,EAAE,WAAW,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE;YAC7F,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,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAA;YAEnF,IAAI,CAAC,GAAG,EAAE,CAAA;YAEV,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAA;YAE9C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAEpC,YAAY,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,CAAA;YAE3E,OAAO,GAAG,CAAA;QACZ,CAAC,CAAC,EACJ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,kBAAkB,EAAE,UAAU,EAAE,EAAE,CAChE,CAAA;IACH,CAAC;IAED,OAAO,GAAG,GAAG,EAAE;QACb,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;QAEvB,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAE/C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9C,KAAK,CAAC,KAAK,EAAE,CAAA;QACf,CAAC;IACH,CAAC,CAAA;CACF"}
|
@@ -0,0 +1,93 @@
|
|
1
|
+
import type { Bindable, QueryBuilder } from '@livestore/common';
|
2
|
+
import { Schema } from '@livestore/utils/effect';
|
3
|
+
import * as otel from '@opentelemetry/api';
|
4
|
+
import type { Thunk } from '../reactive.js';
|
5
|
+
import type { RefreshReason } from '../store/store-types.js';
|
6
|
+
import type { DepKey, GetAtomResult, LiveQueryDef, ReactivityGraph, ReactivityGraphContext } from './base-class.js';
|
7
|
+
import { LiveStoreQueryBase } from './base-class.js';
|
8
|
+
export type QueryInputRaw<TDecoded, TEncoded> = {
|
9
|
+
query: string;
|
10
|
+
schema: Schema.Schema<TDecoded, TEncoded>;
|
11
|
+
bindValues?: Bindable;
|
12
|
+
/**
|
13
|
+
* Can be provided explicitly to slightly speed up initial query performance
|
14
|
+
*
|
15
|
+
* NOTE In the future we want to do this automatically at build time
|
16
|
+
*/
|
17
|
+
queriedTables?: Set<string>;
|
18
|
+
execBeforeFirstRun?: (ctx: ReactivityGraphContext) => void;
|
19
|
+
};
|
20
|
+
export declare const isQueryInputRaw: (value: unknown) => value is QueryInputRaw<any, any>;
|
21
|
+
export type QueryInput<TDecoded, TEncoded> = QueryInputRaw<TDecoded, TEncoded> | QueryBuilder<TDecoded, any, any>;
|
22
|
+
/**
|
23
|
+
* NOTE `queryDb` is only supposed to read data. Don't use it to insert/update/delete data but use events instead.
|
24
|
+
*
|
25
|
+
* When using contextual data when constructing the query, please make sure to include it in the `deps` option.
|
26
|
+
*
|
27
|
+
* @example
|
28
|
+
* ```ts
|
29
|
+
* const todos$ = queryDb(tables.todos.where({ complete: true }))
|
30
|
+
* ```
|
31
|
+
*
|
32
|
+
* @example
|
33
|
+
* ```ts
|
34
|
+
* // Group-by raw SQL query
|
35
|
+
* const colorCounts$ = queryDb({
|
36
|
+
* query: sql`SELECT color, COUNT(*) as count FROM todos WHERE complete = ? GROUP BY color`,
|
37
|
+
* schema: Schema.Array(Schema.Struct({
|
38
|
+
* color: Schema.String,
|
39
|
+
* count: Schema.Number,
|
40
|
+
* })),
|
41
|
+
* bindValues: [1],
|
42
|
+
* })
|
43
|
+
* ```
|
44
|
+
*
|
45
|
+
* @example
|
46
|
+
* ```ts
|
47
|
+
* // Using contextual data when constructing the query
|
48
|
+
* const makeFilteredQuery = (filter: string) =>
|
49
|
+
* queryDb(tables.todos.where({ title: { op: 'like', value: filter } }), { deps: [filter] })
|
50
|
+
*
|
51
|
+
* const filteredTodos$ = makeFilteredQuery('buy coffee')
|
52
|
+
* ```
|
53
|
+
*/
|
54
|
+
export declare const queryDb: {
|
55
|
+
<TResultSchema, TResult = TResultSchema>(queryInput: QueryInputRaw<TResultSchema, ReadonlyArray<any>> | QueryBuilder<TResultSchema, any, any>, options?: {
|
56
|
+
map?: (rows: TResultSchema) => TResult;
|
57
|
+
/**
|
58
|
+
* Used for debugging / devtools
|
59
|
+
*/
|
60
|
+
label?: string;
|
61
|
+
deps?: DepKey;
|
62
|
+
}): LiveQueryDef<TResult>;
|
63
|
+
<TResultSchema, TResult = TResultSchema>(queryInput: ((get: GetAtomResult) => QueryInputRaw<TResultSchema, ReadonlyArray<any>>) | ((get: GetAtomResult) => QueryBuilder<TResultSchema, any, any>), options?: {
|
64
|
+
map?: (rows: TResultSchema) => TResult;
|
65
|
+
/**
|
66
|
+
* Used for debugging / devtools
|
67
|
+
*/
|
68
|
+
label?: string;
|
69
|
+
deps?: DepKey;
|
70
|
+
}): LiveQueryDef<TResult>;
|
71
|
+
};
|
72
|
+
export declare class LiveStoreDbQuery<TResultSchema, TResult = TResultSchema> extends LiveStoreQueryBase<TResult> {
|
73
|
+
_tag: 'db';
|
74
|
+
/** A reactive thunk representing the query text */
|
75
|
+
queryInput$: Thunk<QueryInputRaw<any, any>, ReactivityGraphContext, RefreshReason> | undefined;
|
76
|
+
/** A reactive thunk representing the query results */
|
77
|
+
results$: Thunk<TResult, ReactivityGraphContext, RefreshReason>;
|
78
|
+
label: string;
|
79
|
+
readonly reactivityGraph: ReactivityGraph;
|
80
|
+
private mapResult;
|
81
|
+
def: LiveQueryDef<TResult>;
|
82
|
+
constructor({ queryInput, label: inputLabel, reactivityGraph, map, otelContext, def, }: {
|
83
|
+
label?: string;
|
84
|
+
queryInput: QueryInput<TResultSchema, ReadonlyArray<any>> | ((get: GetAtomResult, ctx: ReactivityGraphContext) => QueryInput<TResultSchema, ReadonlyArray<any>>);
|
85
|
+
reactivityGraph: ReactivityGraph;
|
86
|
+
map?: (rows: TResultSchema) => TResult;
|
87
|
+
/** Only used for the initial query execution */
|
88
|
+
otelContext?: otel.Context;
|
89
|
+
def: LiveQueryDef<TResult>;
|
90
|
+
});
|
91
|
+
destroy: () => void;
|
92
|
+
}
|
93
|
+
//# sourceMappingURL=db-query.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"db-query.d.ts","sourceRoot":"","sources":["../../src/live-queries/db-query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAY/D,OAAO,EAAa,MAAM,EAAiB,MAAM,yBAAyB,CAAA;AAC1E,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE1C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAE3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAE5D,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AACnH,OAAO,EAAgB,kBAAkB,EAAgC,MAAM,iBAAiB,CAAA;AAGhG,MAAM,MAAM,aAAa,CAAC,QAAQ,EAAE,QAAQ,IAAI;IAC9C,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IACzC,UAAU,CAAC,EAAE,QAAQ,CAAA;IACrB;;;;OAIG;IACH,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC3B,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,sBAAsB,KAAK,IAAI,CAAA;CAC3D,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,aAAa,CAAC,GAAG,EAAE,GAAG,CACC,CAAA;AAEjF,MAAM,MAAM,UAAU,CAAC,QAAQ,EAAE,QAAQ,IAAI,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;AAEjH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,OAAO,EAAE;IACpB,CAAC,aAAa,EAAE,OAAO,GAAG,aAAa,EACrC,UAAU,EAAE,aAAa,CAAC,aAAa,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,aAAa,EAAE,GAAG,EAAE,GAAG,CAAC,EACpG,OAAO,CAAC,EAAE;QACR,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,OAAO,CAAA;QACtC;;WAEG;QACH,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,GACA,YAAY,CAAC,OAAO,CAAC,CAAA;IAIxB,CAAC,aAAa,EAAE,OAAO,GAAG,aAAa,EACrC,UAAU,EACN,CAAC,CAAC,GAAG,EAAE,aAAa,KAAK,aAAa,CAAC,aAAa,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,GAC1E,CAAC,CAAC,GAAG,EAAE,aAAa,KAAK,YAAY,CAAC,aAAa,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EACnE,OAAO,CAAC,EAAE;QACR,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,OAAO,CAAA;QACtC;;WAEG;QACH,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,GACA,YAAY,CAAC,OAAO,CAAC,CAAA;CAkCzB,CAAA;AAgCD,qBAAa,gBAAgB,CAAC,aAAa,EAAE,OAAO,GAAG,aAAa,CAAE,SAAQ,kBAAkB,CAAC,OAAO,CAAC;IACvG,IAAI,EAAE,IAAI,CAAO;IAEjB,mDAAmD;IACnD,WAAW,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,sBAAsB,EAAE,aAAa,CAAC,GAAG,SAAS,CAAA;IAE9F,sDAAsD;IACtD,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,sBAAsB,EAAE,aAAa,CAAC,CAAA;IAE/D,KAAK,EAAE,MAAM,CAAA;IAEb,QAAQ,CAAC,eAAe,kBAAA;IAExB,OAAO,CAAC,SAAS,CAAkC;IACnD,GAAG,EAAE,YAAY,CAAC,OAAO,CAAC,CAAA;gBAEd,EACV,UAAU,EACV,KAAK,EAAE,UAAU,EACjB,eAAe,EACf,GAAG,EACH,WAAW,EACX,GAAG,GACJ,EAAE;QACD,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,UAAU,EACN,UAAU,CAAC,aAAa,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,GAC7C,CAAC,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,sBAAsB,KAAK,UAAU,CAAC,aAAa,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACxG,eAAe,EAAE,eAAe,CAAA;QAChC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,OAAO,CAAA;QACtC,gDAAgD;QAChD,WAAW,CAAC,EAAE,IAAI,CAAC,OAAO,CAAA;QAC1B,GAAG,EAAE,YAAY,CAAC,OAAO,CAAC,CAAA;KAC3B;IAqOD,OAAO,aAYN;CACF"}
|