@livestore/livestore 0.0.0-snapshot-669b49b56c8abe87f4e11263af7cbf506deab38e → 0.0.0-snapshot-0a3620623ab8db6de295775532b02edaca7238de

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/global-state.d.ts +1 -1
  3. package/dist/global-state.d.ts.map +1 -1
  4. package/dist/global-state.js +1 -1
  5. package/dist/global-state.js.map +1 -1
  6. package/dist/index.d.ts +6 -6
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +5 -5
  9. package/dist/index.js.map +1 -1
  10. package/dist/{reactiveQueries → live-queries}/base-class.d.ts +8 -4
  11. package/dist/live-queries/base-class.d.ts.map +1 -0
  12. package/dist/{reactiveQueries → live-queries}/base-class.js +2 -0
  13. package/dist/live-queries/base-class.js.map +1 -0
  14. package/dist/{reactiveQueries → live-queries}/computed.d.ts +4 -13
  15. package/dist/live-queries/computed.d.ts.map +1 -0
  16. package/dist/{reactiveQueries → live-queries}/computed.js +4 -23
  17. package/dist/live-queries/computed.js.map +1 -0
  18. package/dist/live-queries/db.d.ts +66 -0
  19. package/dist/live-queries/db.d.ts.map +1 -0
  20. package/dist/live-queries/db.js +199 -0
  21. package/dist/live-queries/db.js.map +1 -0
  22. package/dist/live-queries/db.test.d.ts +2 -0
  23. package/dist/live-queries/db.test.d.ts.map +1 -0
  24. package/dist/live-queries/db.test.js +117 -0
  25. package/dist/live-queries/db.test.js.map +1 -0
  26. package/dist/{reactiveQueries → live-queries}/graphql.d.ts +4 -8
  27. package/dist/live-queries/graphql.d.ts.map +1 -0
  28. package/dist/{reactiveQueries → live-queries}/graphql.js +2 -16
  29. package/dist/live-queries/graphql.js.map +1 -0
  30. package/dist/row-query-utils.d.ts +17 -0
  31. package/dist/row-query-utils.d.ts.map +1 -0
  32. package/dist/row-query-utils.js +30 -0
  33. package/dist/row-query-utils.js.map +1 -0
  34. package/dist/store/create-store.d.ts +1 -1
  35. package/dist/store/create-store.d.ts.map +1 -1
  36. package/dist/store/devtools.d.ts +1 -1
  37. package/dist/store/devtools.d.ts.map +1 -1
  38. package/dist/store/devtools.js.map +1 -1
  39. package/dist/store/store-types.d.ts +2 -2
  40. package/dist/store/store-types.d.ts.map +1 -1
  41. package/dist/store/store.d.ts +8 -3
  42. package/dist/store/store.d.ts.map +1 -1
  43. package/dist/store/store.js +32 -4
  44. package/dist/store/store.js.map +1 -1
  45. package/dist/utils/tests/fixture.d.ts +168 -132
  46. package/dist/utils/tests/fixture.d.ts.map +1 -1
  47. package/package.json +5 -5
  48. package/src/global-state.ts +1 -1
  49. package/src/index.ts +8 -5
  50. package/src/live-queries/__snapshots__/db.test.ts.snap +301 -0
  51. package/src/{reactiveQueries → live-queries}/base-class.ts +10 -5
  52. package/src/{reactiveQueries → live-queries}/computed.ts +5 -29
  53. package/src/live-queries/db.test.ts +153 -0
  54. package/src/live-queries/db.ts +350 -0
  55. package/src/{reactiveQueries → live-queries}/graphql.ts +6 -21
  56. package/src/row-query-utils.ts +65 -0
  57. package/src/store/create-store.ts +1 -1
  58. package/src/store/devtools.ts +1 -1
  59. package/src/store/store-types.ts +2 -2
  60. package/src/store/store.ts +44 -7
  61. package/dist/reactiveQueries/base-class.d.ts.map +0 -1
  62. package/dist/reactiveQueries/base-class.js.map +0 -1
  63. package/dist/reactiveQueries/computed.d.ts.map +0 -1
  64. package/dist/reactiveQueries/computed.js.map +0 -1
  65. package/dist/reactiveQueries/graphql.d.ts.map +0 -1
  66. package/dist/reactiveQueries/graphql.js.map +0 -1
  67. package/dist/reactiveQueries/sql.d.ts +0 -49
  68. package/dist/reactiveQueries/sql.d.ts.map +0 -1
  69. package/dist/reactiveQueries/sql.js +0 -130
  70. package/dist/reactiveQueries/sql.js.map +0 -1
  71. package/dist/reactiveQueries/sql.test.d.ts +0 -2
  72. package/dist/reactiveQueries/sql.test.d.ts.map +0 -1
  73. package/dist/reactiveQueries/sql.test.js +0 -284
  74. package/dist/reactiveQueries/sql.test.js.map +0 -1
  75. package/dist/row-query.d.ts +0 -33
  76. package/dist/row-query.d.ts.map +0 -1
  77. package/dist/row-query.js +0 -80
  78. package/dist/row-query.js.map +0 -1
  79. package/src/reactiveQueries/sql.test.ts +0 -308
  80. package/src/reactiveQueries/sql.ts +0 -226
  81. package/src/row-query.ts +0 -196
@@ -1,49 +0,0 @@
1
- import { type Bindable, type QueryInfo, type QueryInfoNone } from '@livestore/common';
2
- import { Schema } from '@livestore/utils/effect';
3
- import type { Thunk } from '../reactive.js';
4
- import type { RefreshReason } from '../store/store-types.js';
5
- import type { GetAtomResult, LiveQuery, QueryContext, ReactivityGraph } from './base-class.js';
6
- import { LiveStoreQueryBase } from './base-class.js';
7
- /**
8
- * NOTE `querySQL` is only supposed to read data. Don't use it to insert/update/delete data but use mutations instead.
9
- */
10
- export declare const querySQL: <TResultSchema, TResult = TResultSchema>(query: string | ((get: GetAtomResult) => string), options: {
11
- schema: Schema.Schema<TResultSchema, ReadonlyArray<any>>;
12
- map?: (rows: TResultSchema) => TResult;
13
- /**
14
- * Can be provided explicitly to slightly speed up initial query performance
15
- *
16
- * NOTE In the future we want to do this automatically at build time
17
- */
18
- queriedTables?: Set<string>;
19
- bindValues?: Bindable;
20
- label?: string;
21
- reactivityGraph?: ReactivityGraph;
22
- }) => LiveQuery<TResult, QueryInfoNone>;
23
- export declare class LiveStoreSQLQuery<TResultSchema, TResult = TResultSchema, TQueryInfo extends QueryInfo = QueryInfoNone> extends LiveStoreQueryBase<TResult, TQueryInfo> {
24
- _tag: 'sql';
25
- /** A reactive thunk representing the query text */
26
- queryString$: Thunk<string, QueryContext, RefreshReason> | undefined;
27
- /** A reactive thunk representing the query results */
28
- results$: Thunk<TResult, QueryContext, RefreshReason>;
29
- label: string;
30
- protected reactivityGraph: ReactivityGraph;
31
- /** Currently only used by `rowQuery` for lazy table migrations and eager default row insertion */
32
- private execBeforeFirstRun;
33
- private mapResult;
34
- private schema;
35
- queryInfo: TQueryInfo;
36
- constructor({ genQueryString, queriedTables, bindValues, label, reactivityGraph, schema, map, execBeforeFirstRun, queryInfo, }: {
37
- label?: string;
38
- genQueryString: string | ((get: GetAtomResult, ctx: QueryContext) => string);
39
- queriedTables?: Set<string>;
40
- bindValues?: Bindable;
41
- reactivityGraph?: ReactivityGraph;
42
- schema: Schema.Schema<TResultSchema, ReadonlyArray<any>>;
43
- map?: (rows: TResultSchema) => TResult;
44
- execBeforeFirstRun?: (ctx: QueryContext) => void;
45
- queryInfo?: TQueryInfo;
46
- });
47
- destroy: () => void;
48
- }
49
- //# sourceMappingURL=sql.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/reactiveQueries/sql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAqB,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAExG,OAAO,EAAE,MAAM,EAAiB,MAAM,yBAAyB,CAAA;AAI/D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAE3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAE5D,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAC9F,OAAO,EAAE,kBAAkB,EAAqB,MAAM,iBAAiB,CAAA;AAEvE;;GAEG;AACH,eAAO,MAAM,QAAQ,GAAI,aAAa,EAAE,OAAO,yBACtC,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,aAAa,KAAK,MAAM,CAAC,WACvC;IACP,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAA;IACxD,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,OAAO,CAAA;IACtC;;;;OAIG;IACH,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC3B,UAAU,CAAC,EAAE,QAAQ,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,eAAe,CAAC,EAAE,eAAe,CAAA;CAClC,KACA,SAAS,CAAC,OAAO,EAAE,aAAa,CAU/B,CAAA;AAGJ,qBAAa,iBAAiB,CAC5B,aAAa,EACb,OAAO,GAAG,aAAa,EACvB,UAAU,SAAS,SAAS,GAAG,aAAa,CAC5C,SAAQ,kBAAkB,CAAC,OAAO,EAAE,UAAU,CAAC;IAC/C,IAAI,EAAE,KAAK,CAAQ;IAEnB,mDAAmD;IACnD,YAAY,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,aAAa,CAAC,GAAG,SAAS,CAAA;IAEpE,sDAAsD;IACtD,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,aAAa,CAAC,CAAA;IAErD,KAAK,EAAE,MAAM,CAAA;IAEb,SAAS,CAAC,eAAe,kBAAA;IAEzB,kGAAkG;IAClG,OAAO,CAAC,kBAAkB,CAAA;IAE1B,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,MAAM,CAAkD;IAEhE,SAAS,EAAE,UAAU,CAAA;gBAET,EACV,cAAc,EACd,aAAa,EACb,UAAU,EACV,KAAiC,EACjC,eAAe,EACf,MAAM,EACN,GAAG,EACH,kBAAkB,EAClB,SAAS,GACV,EAAE;QACD,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,cAAc,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,YAAY,KAAK,MAAM,CAAC,CAAA;QAC5E,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;QAC3B,UAAU,CAAC,EAAE,QAAQ,CAAA;QACrB,eAAe,CAAC,EAAE,eAAe,CAAA;QACjC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAA;QACxD,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,OAAO,CAAA;QACtC,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,IAAI,CAAA;QAChD,SAAS,CAAC,EAAE,UAAU,CAAA;KACvB;IAiID,OAAO,aAMN;CACF"}
@@ -1,130 +0,0 @@
1
- import { prepareBindValues } from '@livestore/common';
2
- import { shouldNeverHappen } from '@livestore/utils';
3
- import { Schema, TreeFormatter } from '@livestore/utils/effect';
4
- import * as otel from '@opentelemetry/api';
5
- import { globalReactivityGraph } from '../global-state.js';
6
- import { NOT_REFRESHED_YET } from '../reactive.js';
7
- import { getDurationMsFromSpan } from '../utils/otel.js';
8
- import { LiveStoreQueryBase, makeGetAtomResult } from './base-class.js';
9
- /**
10
- * NOTE `querySQL` is only supposed to read data. Don't use it to insert/update/delete data but use mutations instead.
11
- */
12
- export const querySQL = (query, options) => new LiveStoreSQLQuery({
13
- label: options?.label,
14
- genQueryString: query,
15
- queriedTables: options?.queriedTables,
16
- bindValues: options?.bindValues,
17
- reactivityGraph: options?.reactivityGraph,
18
- map: options?.map,
19
- schema: options.schema,
20
- queryInfo: { _tag: 'None' },
21
- });
22
- /* An object encapsulating a reactive SQL query */
23
- export class LiveStoreSQLQuery extends LiveStoreQueryBase {
24
- _tag = 'sql';
25
- /** A reactive thunk representing the query text */
26
- queryString$;
27
- /** A reactive thunk representing the query results */
28
- results$;
29
- label;
30
- reactivityGraph;
31
- /** Currently only used by `rowQuery` for lazy table migrations and eager default row insertion */
32
- execBeforeFirstRun;
33
- mapResult;
34
- schema;
35
- queryInfo;
36
- constructor({ genQueryString, queriedTables, bindValues, label = genQueryString.toString(), reactivityGraph, schema, map, execBeforeFirstRun, queryInfo, }) {
37
- super();
38
- this.label = `sql(${label})`;
39
- this.reactivityGraph = reactivityGraph ?? globalReactivityGraph;
40
- this.execBeforeFirstRun = execBeforeFirstRun;
41
- this.queryInfo = queryInfo ?? { _tag: 'None' };
42
- this.schema = schema;
43
- this.mapResult = map === undefined ? (rows) => rows : map;
44
- let queryString$OrQueryString;
45
- if (typeof genQueryString === 'function') {
46
- queryString$OrQueryString = this.reactivityGraph.makeThunk((get, setDebugInfo, ctx, otelContext) => {
47
- const startMs = performance.now();
48
- const queryString = genQueryString(makeGetAtomResult(get, otelContext ?? ctx.rootOtelContext), ctx);
49
- const durationMs = performance.now() - startMs;
50
- setDebugInfo({ _tag: 'computed', label: `${label}:queryString`, query: queryString, durationMs });
51
- return queryString;
52
- }, {
53
- label: `${label}:queryString`,
54
- meta: { liveStoreThunkType: 'sqlQueryString' },
55
- equal: (a, b) => a === b,
56
- });
57
- this.queryString$ = queryString$OrQueryString;
58
- }
59
- else {
60
- queryString$OrQueryString = genQueryString;
61
- }
62
- const queryLabel = `${label}:results`;
63
- const queriedTablesRef = { current: queriedTables };
64
- const schemaEqual = Schema.equivalence(schema);
65
- // TODO also support derived equality for `map` (probably will depend on having an easy way to transform a schema without an `encode` step)
66
- // This would mean dropping the `map` option
67
- const equal = map === undefined
68
- ? (a, b) => a === NOT_REFRESHED_YET || b === NOT_REFRESHED_YET ? false : schemaEqual(a, b)
69
- : undefined;
70
- const results$ = this.reactivityGraph.makeThunk((get, setDebugInfo, { store, otelTracer, rootOtelContext }, otelContext) => otelTracer.startActiveSpan('sql:...', // NOTE span name will be overridden further down
71
- {}, otelContext ?? rootOtelContext, (span) => {
72
- const otelContext = otel.trace.setSpan(otel.context.active(), span);
73
- if (this.execBeforeFirstRun !== undefined) {
74
- this.execBeforeFirstRun({ store, otelTracer, rootOtelContext, effectsWrapper: (run) => run() });
75
- this.execBeforeFirstRun = undefined;
76
- }
77
- const sqlString = typeof queryString$OrQueryString === 'string'
78
- ? queryString$OrQueryString
79
- : get(queryString$OrQueryString, otelContext);
80
- if (queriedTablesRef.current === undefined) {
81
- queriedTablesRef.current = store.syncDbWrapper.getTablesUsed(sqlString);
82
- }
83
- // Establish a reactive dependency on the tables used in the query
84
- for (const tableName of queriedTablesRef.current) {
85
- const tableRef = store.tableRefs[tableName] ?? shouldNeverHappen(`No table ref found for ${tableName}`);
86
- get(tableRef, otelContext);
87
- }
88
- span.setAttribute('sql.query', sqlString);
89
- span.updateName(`sql:${sqlString.slice(0, 50)}`);
90
- const rawResults = store.syncDbWrapper.select(sqlString, {
91
- queriedTables,
92
- bindValues: bindValues ? prepareBindValues(bindValues, sqlString) : undefined,
93
- otelContext,
94
- });
95
- span.setAttribute('sql.rowsCount', rawResults.length);
96
- const parsedResult = Schema.decodeEither(this.schema)(rawResults);
97
- if (parsedResult._tag === 'Left') {
98
- const parseErrorStr = TreeFormatter.formatErrorSync(parsedResult.left);
99
- const expectedSchemaStr = String(this.schema.ast);
100
- const bindValuesStr = bindValues === undefined ? '' : `\nBind values: ${JSON.stringify(bindValues)}`;
101
- console.error(`\
102
- Error parsing SQL query result.
103
-
104
- Query: ${sqlString}\
105
- ${bindValuesStr}
106
-
107
- Expected schema: ${expectedSchemaStr}
108
-
109
- Error: ${parseErrorStr}
110
-
111
- Result:`, rawResults);
112
- return shouldNeverHappen(`Error parsing SQL query result: ${parsedResult.left}`);
113
- }
114
- const result = this.mapResult(parsedResult.right);
115
- span.end();
116
- const durationMs = getDurationMsFromSpan(span);
117
- this.executionTimes.push(durationMs);
118
- setDebugInfo({ _tag: 'sql', label, query: sqlString, durationMs });
119
- return result;
120
- }), { label: queryLabel, equal });
121
- this.results$ = results$;
122
- }
123
- destroy = () => {
124
- if (this.queryString$ !== undefined) {
125
- this.reactivityGraph.destroyNode(this.queryString$);
126
- }
127
- this.reactivityGraph.destroyNode(this.results$);
128
- };
129
- }
130
- //# sourceMappingURL=sql.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/reactiveQueries/sql.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=sql.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sql.test.d.ts","sourceRoot":"","sources":["../../src/reactiveQueries/sql.test.ts"],"names":[],"mappings":""}
@@ -1,284 +0,0 @@
1
- import { Effect, Schema } from '@livestore/utils/effect';
2
- import * as otel from '@opentelemetry/api';
3
- import { BasicTracerProvider, InMemorySpanExporter, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base';
4
- import { describe, expect, it } from 'vitest';
5
- import { computed, querySQL, rawSqlMutation, sql } from '../index.js';
6
- import { makeTodoMvc, tables } from '../utils/tests/fixture.js';
7
- import { getSimplifiedRootSpan } from '../utils/tests/otel.js';
8
- /*
9
- TODO write tests for:
10
-
11
- - sql queries without and with `map` (incl. callback and schemas)
12
- - optional and explicit `queriedTables` argument
13
- */
14
- describe('otel', () => {
15
- let cachedProvider;
16
- const makeQuery = Effect.gen(function* () {
17
- const exporter = new InMemorySpanExporter();
18
- const provider = cachedProvider ?? new BasicTracerProvider();
19
- cachedProvider = provider;
20
- provider.addSpanProcessor(new SimpleSpanProcessor(exporter));
21
- provider.register();
22
- const otelTracer = otel.trace.getTracer('test');
23
- const span = otelTracer.startSpan('test');
24
- const otelContext = otel.trace.setSpan(otel.context.active(), span);
25
- const { store } = yield* makeTodoMvc({ otelTracer, otelContext });
26
- return {
27
- store,
28
- otelTracer,
29
- exporter,
30
- span,
31
- provider,
32
- };
33
- });
34
- it('otel', async () => {
35
- const { exporter } = await Effect.gen(function* () {
36
- const { store, exporter, span } = yield* makeQuery;
37
- const query = querySQL(`select * from todos`, {
38
- schema: Schema.Array(tables.todos.schema),
39
- queriedTables: new Set(['todos']),
40
- });
41
- expect(query.run()).toMatchInlineSnapshot('[]');
42
- store.mutate(rawSqlMutation({ sql: sql `INSERT INTO todos (id, text, completed) VALUES ('t1', 'buy milk', 0)` }));
43
- expect(query.run()).toMatchInlineSnapshot(`
44
- [
45
- {
46
- "completed": false,
47
- "id": "t1",
48
- "text": "buy milk",
49
- },
50
- ]
51
- `);
52
- query.destroy();
53
- span.end();
54
- return { exporter };
55
- }).pipe(Effect.scoped, Effect.tapCauseLogPretty, Effect.runPromise);
56
- expect(getSimplifiedRootSpan(exporter)).toMatchInlineSnapshot(`
57
- {
58
- "_name": "test",
59
- "children": [
60
- {
61
- "_name": "livestore.in-memory-db:execute",
62
- "attributes": {
63
- "sql.query": "
64
- PRAGMA page_size=32768;
65
- PRAGMA cache_size=10000;
66
- PRAGMA journal_mode='MEMORY'; -- we don't flush to disk before committing a write
67
- PRAGMA synchronous='OFF';
68
- PRAGMA temp_store='MEMORY';
69
- PRAGMA foreign_keys='ON'; -- we want foreign key constraints to be enforced
70
- ",
71
- },
72
- },
73
- {
74
- "_name": "LiveStore:mutations",
75
- "children": [
76
- {
77
- "_name": "LiveStore:mutate",
78
- "attributes": {
79
- "livestore.mutateLabel": "mutate",
80
- },
81
- "children": [
82
- {
83
- "_name": "LiveStore:processWrites",
84
- "attributes": {
85
- "livestore.mutateLabel": "mutate",
86
- },
87
- "children": [
88
- {
89
- "_name": "LiveStore:mutateWithoutRefresh",
90
- "attributes": {
91
- "livestore.args": "{
92
- "sql": "INSERT INTO todos (id, text, completed) VALUES ('t1', 'buy milk', 0)"
93
- }",
94
- "livestore.mutation": "livestore.RawSql",
95
- },
96
- "children": [
97
- {
98
- "_name": "livestore.in-memory-db:execute",
99
- "attributes": {
100
- "sql.query": "INSERT INTO todos (id, text, completed) VALUES ('t1', 'buy milk', 0)",
101
- },
102
- },
103
- ],
104
- },
105
- ],
106
- },
107
- ],
108
- },
109
- ],
110
- },
111
- {
112
- "_name": "LiveStore:queries",
113
- "children": [
114
- {
115
- "_name": "sql:select * from todos",
116
- "attributes": {
117
- "sql.query": "select * from todos",
118
- "sql.rowsCount": 0,
119
- },
120
- "children": [
121
- {
122
- "_name": "sql-in-memory-select",
123
- "attributes": {
124
- "sql.cached": false,
125
- "sql.query": "select * from todos",
126
- "sql.rowsCount": 0,
127
- },
128
- },
129
- ],
130
- },
131
- {
132
- "_name": "sql:select * from todos",
133
- "attributes": {
134
- "sql.query": "select * from todos",
135
- "sql.rowsCount": 1,
136
- },
137
- "children": [
138
- {
139
- "_name": "sql-in-memory-select",
140
- "attributes": {
141
- "sql.cached": false,
142
- "sql.query": "select * from todos",
143
- "sql.rowsCount": 1,
144
- },
145
- },
146
- ],
147
- },
148
- ],
149
- },
150
- ],
151
- }
152
- `);
153
- });
154
- it('with thunks', async () => {
155
- const { exporter } = await Effect.gen(function* () {
156
- const { store, exporter, span } = yield* makeQuery;
157
- const defaultTodo = { id: '', text: '', completed: false };
158
- const filter = computed(() => `where completed = 0`, { label: 'where-filter' });
159
- const query = querySQL((get) => `select * from todos ${get(filter)}`, {
160
- label: 'all todos',
161
- schema: Schema.Array(tables.todos.schema).pipe(Schema.headOrElse(() => defaultTodo)),
162
- });
163
- expect(query.run()).toMatchInlineSnapshot(`
164
- {
165
- "completed": false,
166
- "id": "",
167
- "text": "",
168
- }
169
- `);
170
- store.mutate(rawSqlMutation({ sql: sql `INSERT INTO todos (id, text, completed) VALUES ('t1', 'buy milk', 0)` }));
171
- expect(query.run()).toMatchInlineSnapshot(`
172
- {
173
- "completed": false,
174
- "id": "t1",
175
- "text": "buy milk",
176
- }
177
- `);
178
- query.destroy();
179
- span.end();
180
- return { exporter };
181
- }).pipe(Effect.scoped, Effect.tapCauseLogPretty, Effect.runPromise);
182
- expect(getSimplifiedRootSpan(exporter)).toMatchInlineSnapshot(`
183
- {
184
- "_name": "test",
185
- "children": [
186
- {
187
- "_name": "livestore.in-memory-db:execute",
188
- "attributes": {
189
- "sql.query": "
190
- PRAGMA page_size=32768;
191
- PRAGMA cache_size=10000;
192
- PRAGMA journal_mode='MEMORY'; -- we don't flush to disk before committing a write
193
- PRAGMA synchronous='OFF';
194
- PRAGMA temp_store='MEMORY';
195
- PRAGMA foreign_keys='ON'; -- we want foreign key constraints to be enforced
196
- ",
197
- },
198
- },
199
- {
200
- "_name": "LiveStore:mutations",
201
- "children": [
202
- {
203
- "_name": "LiveStore:mutate",
204
- "attributes": {
205
- "livestore.mutateLabel": "mutate",
206
- },
207
- "children": [
208
- {
209
- "_name": "LiveStore:processWrites",
210
- "attributes": {
211
- "livestore.mutateLabel": "mutate",
212
- },
213
- "children": [
214
- {
215
- "_name": "LiveStore:mutateWithoutRefresh",
216
- "attributes": {
217
- "livestore.args": "{
218
- "sql": "INSERT INTO todos (id, text, completed) VALUES ('t1', 'buy milk', 0)"
219
- }",
220
- "livestore.mutation": "livestore.RawSql",
221
- },
222
- "children": [
223
- {
224
- "_name": "livestore.in-memory-db:execute",
225
- "attributes": {
226
- "sql.query": "INSERT INTO todos (id, text, completed) VALUES ('t1', 'buy milk', 0)",
227
- },
228
- },
229
- ],
230
- },
231
- ],
232
- },
233
- ],
234
- },
235
- ],
236
- },
237
- {
238
- "_name": "LiveStore:queries",
239
- "children": [
240
- {
241
- "_name": "sql:select * from todos where completed = 0",
242
- "attributes": {
243
- "sql.query": "select * from todos where completed = 0",
244
- "sql.rowsCount": 0,
245
- },
246
- "children": [
247
- {
248
- "_name": "js:where-filter",
249
- },
250
- {
251
- "_name": "sql-in-memory-select",
252
- "attributes": {
253
- "sql.cached": false,
254
- "sql.query": "select * from todos where completed = 0",
255
- "sql.rowsCount": 0,
256
- },
257
- },
258
- ],
259
- },
260
- {
261
- "_name": "sql:select * from todos where completed = 0",
262
- "attributes": {
263
- "sql.query": "select * from todos where completed = 0",
264
- "sql.rowsCount": 1,
265
- },
266
- "children": [
267
- {
268
- "_name": "sql-in-memory-select",
269
- "attributes": {
270
- "sql.cached": false,
271
- "sql.query": "select * from todos where completed = 0",
272
- "sql.rowsCount": 1,
273
- },
274
- },
275
- ],
276
- },
277
- ],
278
- },
279
- ],
280
- }
281
- `);
282
- });
283
- });
284
- //# sourceMappingURL=sql.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sql.test.js","sourceRoot":"","sources":["../../src/reactiveQueries/sql.test.ts"],"names":[],"mappings":"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"}
@@ -1,33 +0,0 @@
1
- import type { QueryInfoCol, QueryInfoNone, QueryInfoRow } from '@livestore/common';
2
- import { SessionIdSymbol } from '@livestore/common';
3
- import { DbSchema } from '@livestore/common/schema';
4
- import type { SqliteDsl } from '@livestore/db-schema';
5
- import type { GetValForKey } from '@livestore/utils';
6
- import type * as otel from '@opentelemetry/api';
7
- import type { LiveQuery, ReactivityGraph } from './reactiveQueries/base-class.js';
8
- export type RowQueryOptions<TTableDef extends DbSchema.TableDef, TResult = RowResult<TTableDef>> = {
9
- otelContext?: otel.Context;
10
- skipInsertDefaultRow?: boolean;
11
- reactivityGraph?: ReactivityGraph;
12
- map?: (result: RowResult<TTableDef>) => TResult;
13
- label?: string;
14
- };
15
- export type RowQueryOptionsDefaulValues<TTableDef extends DbSchema.TableDef> = {
16
- defaultValues?: Partial<RowResult<TTableDef>>;
17
- };
18
- export type MakeRowQuery = {
19
- <TTableDef extends DbSchema.TableDef<DbSchema.DefaultSqliteTableDef, boolean, DbSchema.TableOptions & {
20
- isSingleton: true;
21
- }>, TResult = RowResult<TTableDef>>(table: TTableDef, options?: RowQueryOptions<TTableDef, TResult>): LiveQuery<RowResult<TTableDef>, QueryInfoRow<TTableDef>>;
22
- <TTableDef extends DbSchema.TableDef<DbSchema.DefaultSqliteTableDef, boolean, DbSchema.TableOptions & {
23
- isSingleton: false;
24
- }>, TResult = RowResult<TTableDef>>(table: TTableDef, id: string | SessionIdSymbol, options?: RowQueryOptions<TTableDef, TResult> & RowQueryOptionsDefaulValues<TTableDef>): LiveQuery<TResult, QueryInfoRow<TTableDef>>;
25
- };
26
- export declare const rowQuery: MakeRowQuery;
27
- export type RowResult<TTableDef extends DbSchema.TableDef> = TTableDef['isSingleColumn'] extends true ? GetValForKey<SqliteDsl.FromColumns.RowDecoded<TTableDef['sqliteDef']['columns']>, 'value'> : SqliteDsl.FromColumns.RowDecoded<TTableDef['sqliteDef']['columns']>;
28
- export type RowResultEncoded<TTableDef extends DbSchema.TableDef> = TTableDef['isSingleColumn'] extends true ? GetValForKey<SqliteDsl.FromColumns.RowEncoded<TTableDef['sqliteDef']['columns']>, 'value'> : SqliteDsl.FromColumns.RowEncoded<TTableDef['sqliteDef']['columns']>;
29
- export declare const deriveColQuery: {
30
- <TQuery extends LiveQuery<any, QueryInfoNone>, TCol extends keyof TQuery['__result!'] & string>(query$: TQuery, colName: TCol): LiveQuery<TQuery['__result!'][TCol], QueryInfoNone>;
31
- <TQuery extends LiveQuery<any, QueryInfoRow<any>>, TCol extends keyof TQuery['__result!'] & string>(query$: TQuery, colName: TCol): LiveQuery<TQuery['__result!'][TCol], QueryInfoCol<TQuery['queryInfo']['table'], TCol>>;
32
- };
33
- //# sourceMappingURL=row-query.d.ts.map
@@ -1 +0,0 @@
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 DELETED
@@ -1,80 +0,0 @@
1
- import { SessionIdSymbol, sql } from '@livestore/common';
2
- import { DbSchema } from '@livestore/common/schema';
3
- import { shouldNeverHappen } from '@livestore/utils';
4
- import { Schema } from '@livestore/utils/effect';
5
- import { computed } from './reactiveQueries/computed.js';
6
- import { LiveStoreSQLQuery } from './reactiveQueries/sql.js';
7
- // TODO also allow other where clauses and multiple rows
8
- export const rowQuery = (table, idOrOptions, options_) => {
9
- const id = typeof idOrOptions === 'string' || idOrOptions === SessionIdSymbol ? idOrOptions : undefined;
10
- const options = typeof idOrOptions === 'string' || idOrOptions === SessionIdSymbol ? options_ : idOrOptions;
11
- const defaultValues = options?.defaultValues ?? {};
12
- // Validate query args
13
- if (table.options.isSingleton === true && id !== undefined && id !== SessionIdSymbol) {
14
- shouldNeverHappen(`Cannot query state table ${table.sqliteDef.name} with id "${id}" as it is a singleton`);
15
- }
16
- else if (table.options.isSingleton !== true && id === undefined) {
17
- shouldNeverHappen(`Cannot query state table ${table.sqliteDef.name} without id`);
18
- }
19
- const tableSchema = table.sqliteDef;
20
- const tableName = tableSchema.name;
21
- const makeQueryString = (id) => sql `select * from ${tableName} ${id === undefined ? '' : `where id = '${id}'`} limit 1`;
22
- const genQueryString = id === SessionIdSymbol
23
- ? (_, ctx) => makeQueryString(ctx.store.sessionId)
24
- : makeQueryString(id);
25
- const rowSchema = table.isSingleColumn === true ? table.schema.pipe(Schema.pluck('value')) : table.schema;
26
- return new LiveStoreSQLQuery({
27
- label: options?.label ??
28
- `rowQuery:query:${tableSchema.name}${id === undefined ? '' : id === SessionIdSymbol ? `:sessionId` : `:${id}`}`,
29
- genQueryString,
30
- queriedTables: new Set([tableName]),
31
- reactivityGraph: options?.reactivityGraph,
32
- // While this code-path is not needed for singleton tables, it's still needed for `useRow` with non-existing rows for a given ID
33
- execBeforeFirstRun: makeExecBeforeFirstRun({
34
- otelContext: options?.otelContext,
35
- table,
36
- defaultValues,
37
- id,
38
- skipInsertDefaultRow: options?.skipInsertDefaultRow,
39
- }),
40
- schema: rowSchema.pipe(Schema.Array, Schema.headOrElse()),
41
- map: options?.map,
42
- queryInfo: { _tag: 'Row', table, id: id ?? 'singleton' },
43
- });
44
- };
45
- export const deriveColQuery = (query$, colName) => {
46
- return computed((get) => get(query$)[colName], {
47
- label: `deriveColQuery:${query$.label}:${colName}`,
48
- queryInfo: query$.queryInfo._tag === 'Row'
49
- ? { _tag: 'Col', table: query$.queryInfo.table, column: colName, id: query$.queryInfo.id }
50
- : undefined,
51
- });
52
- };
53
- const makeExecBeforeFirstRun = ({ id, defaultValues, skipInsertDefaultRow, otelContext: otelContext_, table, }) => ({ store }) => {
54
- const otelContext = otelContext_ ?? store.otel.queriesSpanContext;
55
- if (skipInsertDefaultRow !== true && table.options.isSingleton === false) {
56
- insertRowWithDefaultValuesOrIgnore({
57
- store,
58
- id: id,
59
- table,
60
- otelContext,
61
- explicitDefaultValues: defaultValues,
62
- });
63
- }
64
- };
65
- const insertRowWithDefaultValuesOrIgnore = ({ store, id, table, otelContext, explicitDefaultValues, }) => {
66
- const idStr = id === SessionIdSymbol ? store.sessionId : id;
67
- const rowExists = store.syncDbWrapper.select(`select 1 from ${table.sqliteDef.name} where id = '${idStr}'`).length === 1;
68
- if (rowExists)
69
- return;
70
- // const mutationDef = deriveCreateMutationDef(table)
71
- if (DbSchema.tableHasDerivedMutations(table) === false) {
72
- return shouldNeverHappen(`Cannot insert row for table "${table.sqliteDef.name}" which does not have 'deriveMutations: true' set`);
73
- }
74
- // NOTE It's important that we only mutate and don't refresh here, as this function is called during a render
75
- store.mutateWithoutRefresh(table.insert({ id, ...explicitDefaultValues }), {
76
- otelContext,
77
- coordinatorMode: 'default',
78
- });
79
- };
80
- //# sourceMappingURL=row-query.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"row-query.js","sourceRoot":"","sources":["../src/row-query.ts"],"names":[],"mappings":"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"}