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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/QueryCache.d.ts.map +1 -1
  3. package/dist/SqliteDbWrapper.d.ts +60 -0
  4. package/dist/SqliteDbWrapper.d.ts.map +1 -0
  5. package/dist/{SynchronousDatabaseWrapper.js → SqliteDbWrapper.js} +69 -34
  6. package/dist/SqliteDbWrapper.js.map +1 -0
  7. package/dist/effect/LiveStore.d.ts +6 -34
  8. package/dist/effect/LiveStore.d.ts.map +1 -1
  9. package/dist/effect/LiveStore.js +10 -12
  10. package/dist/effect/LiveStore.js.map +1 -1
  11. package/dist/effect/mod.d.ts +3 -0
  12. package/dist/effect/mod.d.ts.map +1 -0
  13. package/dist/effect/mod.js +3 -0
  14. package/dist/effect/mod.js.map +1 -0
  15. package/dist/internal/mod.d.ts +3 -0
  16. package/dist/internal/mod.d.ts.map +1 -0
  17. package/dist/internal/mod.js +3 -0
  18. package/dist/internal/mod.js.map +1 -0
  19. package/dist/live-queries/base-class.d.ts +69 -29
  20. package/dist/live-queries/base-class.d.ts.map +1 -1
  21. package/dist/live-queries/base-class.js +60 -14
  22. package/dist/live-queries/base-class.js.map +1 -1
  23. package/dist/live-queries/client-document-get-query.d.ts +12 -0
  24. package/dist/live-queries/client-document-get-query.d.ts.map +1 -0
  25. package/dist/live-queries/client-document-get-query.js +18 -0
  26. package/dist/live-queries/client-document-get-query.js.map +1 -0
  27. package/dist/live-queries/computed.d.ts +13 -15
  28. package/dist/live-queries/computed.d.ts.map +1 -1
  29. package/dist/live-queries/computed.js +37 -15
  30. package/dist/live-queries/computed.js.map +1 -1
  31. package/dist/live-queries/db-query.d.ts +93 -0
  32. package/dist/live-queries/db-query.d.ts.map +1 -0
  33. package/dist/live-queries/{db.js → db-query.js} +113 -40
  34. package/dist/live-queries/db-query.js.map +1 -0
  35. package/dist/live-queries/db-query.test.d.ts +2 -0
  36. package/dist/live-queries/db-query.test.d.ts.map +1 -0
  37. package/dist/live-queries/db-query.test.js +133 -0
  38. package/dist/live-queries/db-query.test.js.map +1 -0
  39. package/dist/live-queries/mod.d.ts +5 -0
  40. package/dist/live-queries/mod.d.ts.map +1 -0
  41. package/dist/live-queries/mod.js +5 -0
  42. package/dist/live-queries/mod.js.map +1 -0
  43. package/dist/live-queries/signal.d.ts +25 -0
  44. package/dist/live-queries/signal.d.ts.map +1 -0
  45. package/dist/live-queries/signal.js +50 -0
  46. package/dist/live-queries/signal.js.map +1 -0
  47. package/dist/live-queries/signal.test.d.ts +2 -0
  48. package/dist/live-queries/signal.test.d.ts.map +1 -0
  49. package/dist/live-queries/signal.test.js +25 -0
  50. package/dist/live-queries/signal.test.js.map +1 -0
  51. package/dist/mod.d.ts +14 -0
  52. package/dist/mod.d.ts.map +1 -0
  53. package/dist/mod.js +13 -0
  54. package/dist/mod.js.map +1 -0
  55. package/dist/reactive.d.ts +23 -17
  56. package/dist/reactive.d.ts.map +1 -1
  57. package/dist/reactive.js +23 -19
  58. package/dist/reactive.js.map +1 -1
  59. package/dist/reactive.test.js +1 -1
  60. package/dist/reactive.test.js.map +1 -1
  61. package/dist/store/create-store.d.ts +70 -12
  62. package/dist/store/create-store.d.ts.map +1 -1
  63. package/dist/store/create-store.js +68 -19
  64. package/dist/store/create-store.js.map +1 -1
  65. package/dist/store/devtools.d.ts +5 -4
  66. package/dist/store/devtools.d.ts.map +1 -1
  67. package/dist/store/devtools.js +92 -40
  68. package/dist/store/devtools.js.map +1 -1
  69. package/dist/store/store-types.d.ts +54 -42
  70. package/dist/store/store-types.d.ts.map +1 -1
  71. package/dist/store/store-types.js +2 -5
  72. package/dist/store/store-types.js.map +1 -1
  73. package/dist/store/store.d.ts +141 -35
  74. package/dist/store/store.d.ts.map +1 -1
  75. package/dist/store/store.js +322 -154
  76. package/dist/store/store.js.map +1 -1
  77. package/dist/utils/data-structures.d.ts.map +1 -1
  78. package/dist/utils/dev.d.ts.map +1 -1
  79. package/dist/utils/dev.js +6 -1
  80. package/dist/utils/dev.js.map +1 -1
  81. package/dist/utils/function-string.d.ts +7 -0
  82. package/dist/utils/function-string.d.ts.map +1 -0
  83. package/dist/utils/function-string.js +9 -0
  84. package/dist/utils/function-string.js.map +1 -0
  85. package/dist/utils/stack-info.d.ts.map +1 -1
  86. package/dist/utils/stack-info.js +6 -1
  87. package/dist/utils/stack-info.js.map +1 -1
  88. package/dist/utils/stack-info.test.js +54 -1
  89. package/dist/utils/stack-info.test.js.map +1 -1
  90. package/dist/utils/tests/fixture.d.ts +59 -216
  91. package/dist/utils/tests/fixture.d.ts.map +1 -1
  92. package/dist/utils/tests/fixture.js +23 -18
  93. package/dist/utils/tests/fixture.js.map +1 -1
  94. package/dist/utils/tests/mod.d.ts +1 -0
  95. package/dist/utils/tests/mod.d.ts.map +1 -1
  96. package/dist/utils/tests/mod.js +1 -0
  97. package/dist/utils/tests/mod.js.map +1 -1
  98. package/dist/utils/tests/otel.d.ts.map +1 -1
  99. package/dist/utils/tests/otel.js +8 -3
  100. package/dist/utils/tests/otel.js.map +1 -1
  101. package/package.json +29 -26
  102. package/src/{SynchronousDatabaseWrapper.ts → SqliteDbWrapper.ts} +92 -42
  103. package/src/effect/LiveStore.ts +27 -64
  104. package/src/effect/{index.ts → mod.ts} +2 -3
  105. package/src/internal/mod.ts +2 -0
  106. package/src/live-queries/__snapshots__/{db.test.ts.snap → db-query.test.ts.snap} +241 -45
  107. package/src/live-queries/base-class.ts +170 -53
  108. package/src/live-queries/client-document-get-query.ts +52 -0
  109. package/src/live-queries/computed.ts +51 -33
  110. package/src/live-queries/db-query.test.ts +192 -0
  111. package/src/live-queries/{db.ts → db-query.ts} +171 -82
  112. package/src/live-queries/mod.ts +4 -0
  113. package/src/live-queries/signal.test.ts +40 -0
  114. package/src/live-queries/signal.ts +81 -0
  115. package/src/mod.ts +51 -0
  116. package/src/reactive.test.ts +1 -1
  117. package/src/reactive.ts +66 -43
  118. package/src/store/create-store.ts +188 -62
  119. package/src/store/devtools.ts +124 -46
  120. package/src/store/store-types.ts +54 -43
  121. package/src/store/store.ts +457 -237
  122. package/src/utils/dev.ts +6 -1
  123. package/src/utils/function-string.ts +12 -0
  124. package/src/utils/stack-info.test.ts +58 -1
  125. package/src/utils/stack-info.ts +6 -1
  126. package/src/utils/tests/fixture.ts +22 -31
  127. package/src/utils/tests/mod.ts +1 -0
  128. package/src/utils/tests/otel.ts +10 -3
  129. package/dist/SynchronousDatabaseWrapper.d.ts +0 -41
  130. package/dist/SynchronousDatabaseWrapper.d.ts.map +0 -1
  131. package/dist/SynchronousDatabaseWrapper.js.map +0 -1
  132. package/dist/effect/index.d.ts +0 -2
  133. package/dist/effect/index.d.ts.map +0 -1
  134. package/dist/effect/index.js +0 -2
  135. package/dist/effect/index.js.map +0 -1
  136. package/dist/global-state.d.ts +0 -14
  137. package/dist/global-state.d.ts.map +0 -1
  138. package/dist/global-state.js +0 -16
  139. package/dist/global-state.js.map +0 -1
  140. package/dist/index.d.ts +0 -20
  141. package/dist/index.d.ts.map +0 -1
  142. package/dist/index.js +0 -16
  143. package/dist/index.js.map +0 -1
  144. package/dist/live-queries/db.d.ts +0 -66
  145. package/dist/live-queries/db.d.ts.map +0 -1
  146. package/dist/live-queries/db.js.map +0 -1
  147. package/dist/live-queries/db.test.d.ts +0 -2
  148. package/dist/live-queries/db.test.d.ts.map +0 -1
  149. package/dist/live-queries/db.test.js +0 -118
  150. package/dist/live-queries/db.test.js.map +0 -1
  151. package/dist/live-queries/graphql.d.ts +0 -49
  152. package/dist/live-queries/graphql.d.ts.map +0 -1
  153. package/dist/live-queries/graphql.js +0 -122
  154. package/dist/live-queries/graphql.js.map +0 -1
  155. package/dist/row-query-utils.d.ts +0 -17
  156. package/dist/row-query-utils.d.ts.map +0 -1
  157. package/dist/row-query-utils.js +0 -30
  158. package/dist/row-query-utils.js.map +0 -1
  159. package/dist/utils/otel.d.ts +0 -4
  160. package/dist/utils/otel.d.ts.map +0 -1
  161. package/dist/utils/otel.js +0 -6
  162. package/dist/utils/otel.js.map +0 -1
  163. package/src/global-state.ts +0 -20
  164. package/src/index.ts +0 -66
  165. package/src/live-queries/db.test.ts +0 -154
  166. package/src/live-queries/graphql.ts +0 -219
  167. package/src/row-query-utils.ts +0 -65
  168. package/src/utils/otel.ts +0 -9
  169. package/tsconfig.json +0 -18
  170. package/vitest.config.js +0 -9
@@ -1,23 +1,95 @@
1
- import { getResultSchema, isQueryBuilder, prepareBindValues, QueryBuilderAstSymbol, replaceSessionIdSymbol, UnexpectedError, } from '@livestore/common';
1
+ import { getDurationMsFromSpan, getResultSchema, isQueryBuilder, prepareBindValues, QueryBuilderAstSymbol, replaceSessionIdSymbol, SessionIdSymbol, UnexpectedError, } from '@livestore/common';
2
2
  import { deepEqual, shouldNeverHappen } from '@livestore/utils';
3
3
  import { Predicate, Schema, TreeFormatter } from '@livestore/utils/effect';
4
4
  import * as otel from '@opentelemetry/api';
5
- import { globalReactivityGraph } from '../global-state.js';
6
5
  import { isThunk, NOT_REFRESHED_YET } from '../reactive.js';
7
- import { makeExecBeforeFirstRun, rowQueryLabel } from '../row-query-utils.js';
8
- import { getDurationMsFromSpan } from '../utils/otel.js';
9
- import { LiveStoreQueryBase, makeGetAtomResult } from './base-class.js';
6
+ import { isValidFunctionString } from '../utils/function-string.js';
7
+ import { depsToString, LiveStoreQueryBase, makeGetAtomResult, withRCMap } from './base-class.js';
8
+ import { makeExecBeforeFirstRun, rowQueryLabel } from './client-document-get-query.js';
9
+ export const isQueryInputRaw = (value) => Predicate.hasProperty(value, 'query') && Predicate.hasProperty(value, 'schema');
10
10
  /**
11
- * NOTE `query` is only supposed to read data. Don't use it to insert/update/delete data but use mutations instead.
11
+ * NOTE `queryDb` is only supposed to read data. Don't use it to insert/update/delete data but use events instead.
12
+ *
13
+ * When using contextual data when constructing the query, please make sure to include it in the `deps` option.
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * const todos$ = queryDb(tables.todos.where({ complete: true }))
18
+ * ```
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * // Group-by raw SQL query
23
+ * const colorCounts$ = queryDb({
24
+ * query: sql`SELECT color, COUNT(*) as count FROM todos WHERE complete = ? GROUP BY color`,
25
+ * schema: Schema.Array(Schema.Struct({
26
+ * color: Schema.String,
27
+ * count: Schema.Number,
28
+ * })),
29
+ * bindValues: [1],
30
+ * })
31
+ * ```
32
+ *
33
+ * @example
34
+ * ```ts
35
+ * // Using contextual data when constructing the query
36
+ * const makeFilteredQuery = (filter: string) =>
37
+ * queryDb(tables.todos.where({ title: { op: 'like', value: filter } }), { deps: [filter] })
38
+ *
39
+ * const filteredTodos$ = makeFilteredQuery('buy coffee')
40
+ * ```
12
41
  */
13
- export const queryDb = (queryInput, options) => new LiveStoreDbQuery({
14
- queryInput,
15
- label: options?.label,
16
- reactivityGraph: options?.reactivityGraph,
17
- map: options?.map,
18
- queryInfo: Predicate.hasProperty(options, 'queryInfo') ? options.queryInfo : undefined,
19
- otelContext: options?.otelContext,
20
- });
42
+ export const queryDb = (queryInput, options) => {
43
+ const { queryString, extraDeps } = getQueryStringAndExtraDeps(queryInput);
44
+ const hash = [queryString, options?.deps ? depsToString(options.deps) : undefined, depsToString(extraDeps)]
45
+ .filter(Boolean)
46
+ .join('-');
47
+ if (isValidFunctionString(hash)._tag === 'invalid') {
48
+ throw new Error(`On Expo/React Native, db queries must provide a \`deps\` option`);
49
+ }
50
+ if (hash.trim() === '') {
51
+ return shouldNeverHappen(`Invalid query hash for query: ${queryInput}`);
52
+ }
53
+ const label = options?.label ?? queryString;
54
+ const def = {
55
+ _tag: 'def',
56
+ make: withRCMap(hash, (ctx, otelContext) => {
57
+ // TODO onDestroy
58
+ return new LiveStoreDbQuery({
59
+ reactivityGraph: ctx.reactivityGraph.deref(),
60
+ queryInput,
61
+ label,
62
+ map: options?.map,
63
+ otelContext,
64
+ def,
65
+ });
66
+ }),
67
+ label,
68
+ hash,
69
+ };
70
+ return def;
71
+ };
72
+ const bindValuesToDepKey = (bindValues) => {
73
+ if (bindValues === undefined) {
74
+ return [];
75
+ }
76
+ return Object.entries(bindValues)
77
+ .map(([key, value]) => `${key}:${value === SessionIdSymbol ? 'SessionIdSymbol' : value}`)
78
+ .join(',');
79
+ };
80
+ const getQueryStringAndExtraDeps = (queryInput) => {
81
+ if (isQueryBuilder(queryInput)) {
82
+ const { query, bindValues } = queryInput.asSql();
83
+ return { queryString: query, extraDeps: bindValuesToDepKey(bindValues) };
84
+ }
85
+ if (isQueryInputRaw(queryInput)) {
86
+ return { queryString: queryInput.query, extraDeps: bindValuesToDepKey(queryInput.bindValues) };
87
+ }
88
+ if (typeof queryInput === 'function') {
89
+ return { queryString: queryInput.toString(), extraDeps: [] };
90
+ }
91
+ return shouldNeverHappen(`Invalid query input: ${queryInput}`);
92
+ };
21
93
  /* An object encapsulating a reactive SQL query */
22
94
  export class LiveStoreDbQuery extends LiveStoreQueryBase {
23
95
  _tag = 'db';
@@ -26,14 +98,14 @@ export class LiveStoreDbQuery extends LiveStoreQueryBase {
26
98
  /** A reactive thunk representing the query results */
27
99
  results$;
28
100
  label;
29
- queryInfo;
30
101
  reactivityGraph;
31
102
  mapResult;
32
- constructor({ queryInput, label: inputLabel, reactivityGraph, map, queryInfo: inputQueryInfo, otelContext, }) {
103
+ def;
104
+ constructor({ queryInput, label: inputLabel, reactivityGraph, map, otelContext, def, }) {
33
105
  super();
34
106
  let label = inputLabel ?? 'db(unknown)';
35
- let queryInfo = inputQueryInfo ?? { _tag: 'None' };
36
- this.reactivityGraph = reactivityGraph ?? globalReactivityGraph;
107
+ this.reactivityGraph = reactivityGraph;
108
+ this.def = def;
37
109
  this.mapResult = map === undefined ? (rows) => rows : map;
38
110
  const schemaRef = {
39
111
  current: typeof queryInput === 'function' ? undefined : isQueryBuilder(queryInput) ? undefined : queryInput.schema,
@@ -53,13 +125,12 @@ export class LiveStoreDbQuery extends LiveStoreQueryBase {
53
125
  schema,
54
126
  bindValues: qbRes.bindValues,
55
127
  queriedTables: new Set([ast.tableDef.sqliteDef.name]),
56
- queryInfo: ast._tag === 'RowQuery' ? { _tag: 'Row', table: ast.tableDef, id: ast.id } : { _tag: 'None' },
57
128
  },
58
129
  label: ast._tag === 'RowQuery' ? rowQueryLabel(ast.tableDef, ast.id) : qb.toString(),
59
130
  execBeforeFirstRun: ast._tag === 'RowQuery'
60
131
  ? makeExecBeforeFirstRun({
61
132
  table: ast.tableDef,
62
- insertValues: ast.insertValues,
133
+ explicitDefaultValues: ast.explicitDefaultValues,
63
134
  id: ast.id,
64
135
  otelContext,
65
136
  })
@@ -73,7 +144,7 @@ export class LiveStoreDbQuery extends LiveStoreQueryBase {
73
144
  if (typeof queryInput === 'function') {
74
145
  queryInputRaw$OrQueryInputRaw = this.reactivityGraph.makeThunk((get, setDebugInfo, ctx, otelContext) => {
75
146
  const startMs = performance.now();
76
- const queryInputResult = queryInput(makeGetAtomResult(get, otelContext ?? ctx.rootOtelContext), ctx);
147
+ const queryInputResult = queryInput(makeGetAtomResult(get, ctx, otelContext ?? ctx.rootOtelContext, this.dependencyQueriesRef), ctx);
77
148
  const durationMs = performance.now() - startMs;
78
149
  let queryInputRaw;
79
150
  if (isQueryBuilder(queryInputResult)) {
@@ -88,9 +159,6 @@ export class LiveStoreDbQuery extends LiveStoreQueryBase {
88
159
  }
89
160
  setDebugInfo({ _tag: 'computed', label: `${this.label}:queryInput`, query: queryInputRaw.query, durationMs });
90
161
  schemaRef.current = queryInputRaw.schema;
91
- if (inputQueryInfo === undefined && queryInputRaw.queryInfo !== undefined) {
92
- queryInfo = queryInputRaw.queryInfo;
93
- }
94
162
  return queryInputRaw;
95
163
  }, {
96
164
  label: `${label}:query`,
@@ -98,6 +166,7 @@ export class LiveStoreDbQuery extends LiveStoreQueryBase {
98
166
  // NOTE we're not checking the schema here as we assume the query string to always change when the schema might change
99
167
  equal: (a, b) => a.query === b.query && deepEqual(a.bindValues, b.bindValues),
100
168
  });
169
+ this.queryInput$ = queryInputRaw$OrQueryInputRaw;
101
170
  }
102
171
  else {
103
172
  let queryInputRaw;
@@ -119,9 +188,6 @@ export class LiveStoreDbQuery extends LiveStoreQueryBase {
119
188
  label = `db(${rowQueryLabel(ast.tableDef, ast.id)})`;
120
189
  }
121
190
  }
122
- if (inputQueryInfo === undefined && queryInputRaw.queryInfo !== undefined) {
123
- queryInfo = queryInputRaw.queryInfo;
124
- }
125
191
  }
126
192
  const queriedTablesRef = { current: undefined };
127
193
  const makeResultsEqual = (resultSchema) => (a, b) => a === NOT_REFRESHED_YET || b === NOT_REFRESHED_YET ? false : Schema.equivalence(resultSchema)(a, b);
@@ -133,8 +199,14 @@ export class LiveStoreDbQuery extends LiveStoreQueryBase {
133
199
  ? (a, b) => makeResultsEqual(schemaRef.current)(a, b)
134
200
  : makeResultsEqual(schemaRef.current)
135
201
  : undefined;
136
- const results$ = this.reactivityGraph.makeThunk((get, setDebugInfo, queryContext, otelContext) => queryContext.otelTracer.startActiveSpan('db:...', // NOTE span name will be overridden further down
137
- {}, otelContext ?? queryContext.rootOtelContext, (span) => {
202
+ const results$ = this.reactivityGraph.makeThunk((get, setDebugInfo, queryContext, otelContext, debugRefreshReason) => queryContext.otelTracer.startActiveSpan('db:...', // NOTE span name will be overridden further down
203
+ {
204
+ attributes: {
205
+ 'livestore.debugRefreshReason': Predicate.hasProperty(debugRefreshReason, 'label')
206
+ ? debugRefreshReason.label
207
+ : debugRefreshReason?._tag,
208
+ },
209
+ }, otelContext ?? queryContext.rootOtelContext, (span) => {
138
210
  const otelContext = otel.trace.setSpan(otel.context.active(), span);
139
211
  const { store } = queryContext;
140
212
  if (execBeforeFirstRunRef.current !== undefined) {
@@ -142,12 +214,12 @@ export class LiveStoreDbQuery extends LiveStoreQueryBase {
142
214
  execBeforeFirstRunRef.current = undefined;
143
215
  }
144
216
  const queryInputResult = isThunk(queryInputRaw$OrQueryInputRaw)
145
- ? get(queryInputRaw$OrQueryInputRaw, otelContext)
217
+ ? get(queryInputRaw$OrQueryInputRaw, otelContext, debugRefreshReason)
146
218
  : queryInputRaw$OrQueryInputRaw;
147
219
  const sqlString = queryInputResult.query;
148
220
  const bindValues = queryInputResult.bindValues;
149
221
  if (queriedTablesRef.current === undefined) {
150
- queriedTablesRef.current = store.syncDbWrapper.getTablesUsed(sqlString);
222
+ queriedTablesRef.current = store.sqliteDbWrapper.getTablesUsed(sqlString);
151
223
  }
152
224
  if (bindValues !== undefined) {
153
225
  replaceSessionIdSymbol(bindValues, store.clientSession.sessionId);
@@ -155,13 +227,12 @@ export class LiveStoreDbQuery extends LiveStoreQueryBase {
155
227
  // Establish a reactive dependency on the tables used in the query
156
228
  for (const tableName of queriedTablesRef.current) {
157
229
  const tableRef = store.tableRefs[tableName] ?? shouldNeverHappen(`No table ref found for ${tableName}`);
158
- get(tableRef, otelContext);
230
+ get(tableRef, otelContext, debugRefreshReason);
159
231
  }
160
232
  span.setAttribute('sql.query', sqlString);
161
233
  span.updateName(`db:${sqlString.slice(0, 50)}`);
162
- const rawDbResults = store.syncDbWrapper.select(sqlString, {
234
+ const rawDbResults = store.sqliteDbWrapper.select(sqlString, bindValues ? prepareBindValues(bindValues, sqlString) : undefined, {
163
235
  queriedTables: queriedTablesRef.current,
164
- bindValues: bindValues ? prepareBindValues(bindValues, sqlString) : undefined,
165
236
  otelContext,
166
237
  });
167
238
  span.setAttribute('sql.rowsCount', rawDbResults.length);
@@ -170,8 +241,8 @@ export class LiveStoreDbQuery extends LiveStoreQueryBase {
170
241
  const parseErrorStr = TreeFormatter.formatErrorSync(parsedResult.left);
171
242
  const expectedSchemaStr = String(schemaRef.current.ast);
172
243
  const bindValuesStr = bindValues === undefined ? '' : `\nBind values: ${JSON.stringify(bindValues)}`;
173
- console.error(`\
174
- Error parsing SQL query result.
244
+ return shouldNeverHappen(`\
245
+ Error parsing SQL query result (${label}).
175
246
 
176
247
  Query: ${sqlString}\
177
248
  ${bindValuesStr}
@@ -180,8 +251,7 @@ Expected schema: ${expectedSchemaStr}
180
251
 
181
252
  Error: ${parseErrorStr}
182
253
 
183
- Result:`, rawDbResults);
184
- return shouldNeverHappen(`Error parsing SQL query result: ${parsedResult.left}`);
254
+ Result:`, rawDbResults, '\n');
185
255
  }
186
256
  const result = this.mapResult(parsedResult.right);
187
257
  span.end();
@@ -192,13 +262,16 @@ Result:`, rawDbResults);
192
262
  }), { label: `${label}:results`, meta: { liveStoreThunkType: 'db.result' }, equal: resultsEqual });
193
263
  this.results$ = results$;
194
264
  this.label = label;
195
- this.queryInfo = queryInfo;
196
265
  }
197
266
  destroy = () => {
267
+ this.isDestroyed = true;
198
268
  if (this.queryInput$ !== undefined) {
199
269
  this.reactivityGraph.destroyNode(this.queryInput$);
200
270
  }
201
271
  this.reactivityGraph.destroyNode(this.results$);
272
+ for (const query of this.dependencyQueriesRef) {
273
+ query.deref();
274
+ }
202
275
  };
203
276
  }
204
- //# sourceMappingURL=db.js.map
277
+ //# sourceMappingURL=db-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-query.js","sourceRoot":"","sources":["../../src/live-queries/db-query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=db-query.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-query.test.d.ts","sourceRoot":"","sources":["../../src/live-queries/db-query.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,133 @@
1
+ import { sql } from '@livestore/common';
2
+ import { rawSqlEvent } from '@livestore/common/schema';
3
+ import { Effect, ReadonlyRecord, Schema } from '@livestore/utils/effect';
4
+ import { Vitest } from '@livestore/utils-dev/node-vitest';
5
+ import * as otel from '@opentelemetry/api';
6
+ import { BasicTracerProvider, InMemorySpanExporter, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base';
7
+ import { expect } from 'vitest';
8
+ import * as RG from '../reactive.js';
9
+ import { makeTodoMvc, tables } from '../utils/tests/fixture.js';
10
+ import { getSimplifiedRootSpan } from '../utils/tests/otel.js';
11
+ import { computed } from './computed.js';
12
+ import { queryDb } from './db-query.js';
13
+ /*
14
+ TODO write tests for:
15
+
16
+ - sql queries without and with `map` (incl. callback and schemas)
17
+ - optional and explicit `queriedTables` argument
18
+ */
19
+ Vitest.describe('otel', () => {
20
+ const mapAttributes = (attributes) => {
21
+ return ReadonlyRecord.map(attributes, (val, key) => {
22
+ if (key === 'code.stacktrace') {
23
+ return '<STACKTRACE>';
24
+ }
25
+ return val;
26
+ });
27
+ };
28
+ const makeQuery = Effect.gen(function* () {
29
+ const exporter = new InMemorySpanExporter();
30
+ RG.__resetIds();
31
+ const provider = new BasicTracerProvider({
32
+ spanProcessors: [new SimpleSpanProcessor(exporter)],
33
+ });
34
+ const otelTracer = provider.getTracer('test');
35
+ const span = otelTracer.startSpan('test-root');
36
+ const otelContext = otel.trace.setSpan(otel.context.active(), span);
37
+ const store = yield* makeTodoMvc({ otelTracer, otelContext });
38
+ return {
39
+ store,
40
+ otelTracer,
41
+ exporter,
42
+ span,
43
+ provider,
44
+ };
45
+ });
46
+ Vitest.scopedLive('otel', () => Effect.gen(function* () {
47
+ const { store, exporter, span, provider } = yield* makeQuery;
48
+ const query$ = queryDb({
49
+ query: `select * from todos`,
50
+ schema: Schema.Array(tables.todos.rowSchema),
51
+ queriedTables: new Set(['todos']),
52
+ });
53
+ expect(store.query(query$)).toMatchInlineSnapshot('[]');
54
+ store.commit(rawSqlEvent({ sql: sql `INSERT INTO todos (id, text, completed) VALUES ('t1', 'buy milk', 0)` }));
55
+ expect(store.query(query$)).toMatchInlineSnapshot(`
56
+ [
57
+ {
58
+ "completed": false,
59
+ "id": "t1",
60
+ "text": "buy milk",
61
+ },
62
+ ]
63
+ `);
64
+ span.end();
65
+ return { exporter, provider };
66
+ }).pipe(Effect.scoped, Effect.tap(({ exporter, provider }) => Effect.promise(async () => {
67
+ await provider.forceFlush();
68
+ expect(getSimplifiedRootSpan(exporter, mapAttributes)).toMatchSnapshot();
69
+ await provider.shutdown();
70
+ }))));
71
+ Vitest.scopedLive('with thunks', () => Effect.gen(function* () {
72
+ const { store, exporter, span, provider } = yield* makeQuery;
73
+ const defaultTodo = { id: '', text: '', completed: false };
74
+ const filter = computed(() => `where completed = 0`, { label: 'where-filter' });
75
+ const query$ = queryDb((get) => ({
76
+ query: `select * from todos ${get(filter)}`,
77
+ schema: Schema.Array(tables.todos.rowSchema).pipe(Schema.headOrElse(() => defaultTodo)),
78
+ }), { label: 'all todos' });
79
+ expect(store.reactivityGraph.getSnapshot({ includeResults: true })).toMatchSnapshot();
80
+ expect(store.query(query$)).toMatchInlineSnapshot(`
81
+ {
82
+ "completed": false,
83
+ "id": "",
84
+ "text": "",
85
+ }
86
+ `);
87
+ expect(store.reactivityGraph.getSnapshot({ includeResults: true })).toMatchSnapshot();
88
+ store.commit(rawSqlEvent({ sql: sql `INSERT INTO todos (id, text, completed) VALUES ('t1', 'buy milk', 0)` }));
89
+ expect(store.reactivityGraph.getSnapshot({ includeResults: true })).toMatchSnapshot();
90
+ expect(store.query(query$)).toMatchInlineSnapshot(`
91
+ {
92
+ "completed": false,
93
+ "id": "t1",
94
+ "text": "buy milk",
95
+ }
96
+ `);
97
+ expect(store.reactivityGraph.getSnapshot({ includeResults: true })).toMatchSnapshot();
98
+ span.end();
99
+ return { exporter, provider };
100
+ }).pipe(Effect.scoped, Effect.tap(({ exporter, provider }) => Effect.promise(async () => {
101
+ await provider.forceFlush();
102
+ expect(getSimplifiedRootSpan(exporter, mapAttributes)).toMatchSnapshot();
103
+ await provider.shutdown();
104
+ }))));
105
+ Vitest.scopedLive('with thunks with query builder and without labels', () => Effect.gen(function* () {
106
+ const { store, exporter, span, provider } = yield* makeQuery;
107
+ const defaultTodo = { id: '', text: '', completed: false };
108
+ const filter = computed(() => ({ completed: false }));
109
+ const query$ = queryDb((get) => tables.todos.where(get(filter)).first({ fallback: () => defaultTodo }));
110
+ expect(store.query(query$)).toMatchInlineSnapshot(`
111
+ {
112
+ "completed": false,
113
+ "id": "",
114
+ "text": "",
115
+ }
116
+ `);
117
+ store.commit(rawSqlEvent({ sql: sql `INSERT INTO todos (id, text, completed) VALUES ('t1', 'buy milk', 0)` }));
118
+ expect(store.query(query$)).toMatchInlineSnapshot(`
119
+ {
120
+ "completed": false,
121
+ "id": "t1",
122
+ "text": "buy milk",
123
+ }
124
+ `);
125
+ span.end();
126
+ return { exporter, provider };
127
+ }).pipe(Effect.scoped, Effect.tap(({ exporter, provider }) => Effect.promise(async () => {
128
+ await provider.forceFlush();
129
+ expect(getSimplifiedRootSpan(exporter, mapAttributes)).toMatchSnapshot();
130
+ await provider.shutdown();
131
+ }))));
132
+ });
133
+ //# sourceMappingURL=db-query.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-query.test.js","sourceRoot":"","sources":["../../src/live-queries/db-query.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export * from './base-class.js';
2
+ export * from './computed.js';
3
+ export * from './db-query.js';
4
+ export * from './signal.js';
5
+ //# sourceMappingURL=mod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../src/live-queries/mod.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA"}
@@ -0,0 +1,5 @@
1
+ export * from './base-class.js';
2
+ export * from './computed.js';
3
+ export * from './db-query.js';
4
+ export * from './signal.js';
5
+ //# sourceMappingURL=mod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.js","sourceRoot":"","sources":["../../src/live-queries/mod.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA"}
@@ -0,0 +1,25 @@
1
+ import type * as RG from '../reactive.js';
2
+ import type { RefreshReason } from '../store/store-types.js';
3
+ import type { ISignal, ReactivityGraph, ReactivityGraphContext, SignalDef } from './base-class.js';
4
+ import { LiveStoreQueryBase } from './base-class.js';
5
+ export declare const signal: <T>(defaultValue: T, options?: {
6
+ label?: string;
7
+ }) => SignalDef<T>;
8
+ export declare class Signal<T> extends LiveStoreQueryBase<T> implements ISignal<T> {
9
+ _tag: "signal";
10
+ readonly ref: RG.Ref<T, ReactivityGraphContext, RefreshReason>;
11
+ label: string;
12
+ reactivityGraph: ReactivityGraph;
13
+ results$: RG.Ref<T, ReactivityGraphContext, RefreshReason>;
14
+ def: SignalDef<T>;
15
+ constructor({ defaultValue, reactivityGraph, label, def, }: {
16
+ defaultValue: T;
17
+ reactivityGraph: ReactivityGraph;
18
+ label: string;
19
+ def: SignalDef<T>;
20
+ });
21
+ set: (value: T) => void;
22
+ get: () => T;
23
+ destroy: () => void;
24
+ }
25
+ //# sourceMappingURL=signal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal.d.ts","sourceRoot":"","sources":["../../src/live-queries/signal.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAClG,OAAO,EAAE,kBAAkB,EAAa,MAAM,iBAAiB,CAAA;AAE/D,eAAO,MAAM,MAAM,GAAI,CAAC,EACtB,cAAc,CAAC,EACf,UAAU;IACR,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,KACA,SAAS,CAAC,CAAC,CAoBb,CAAA;AAED,qBAAa,MAAM,CAAC,CAAC,CAAE,SAAQ,kBAAkB,CAAC,CAAC,CAAE,YAAW,OAAO,CAAC,CAAC,CAAC;IACxE,IAAI,EAAG,QAAQ,CAAS;IACxB,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,sBAAsB,EAAE,aAAa,CAAC,CAAA;IAC9D,KAAK,EAAE,MAAM,CAAA;IACb,eAAe,EAAE,eAAe,CAAA;IAChC,QAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,sBAAsB,EAAE,aAAa,CAAC,CAAA;IAC1D,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAA;gBAOf,EACE,YAAY,EACZ,eAAe,EACf,KAAK,EACL,GAAG,GACJ,EAAE;QACD,YAAY,EAAE,CAAC,CAAA;QACf,eAAe,EAAE,eAAe,CAAA;QAChC,KAAK,EAAE,MAAM,CAAA;QACb,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAA;KAClB;IAYH,GAAG,GAAI,OAAO,CAAC,UAEd;IAED,GAAG,UAEF;IAED,OAAO,aAEN;CACF"}
@@ -0,0 +1,50 @@
1
+ import { nanoid } from '@livestore/utils/nanoid';
2
+ import { LiveStoreQueryBase, withRCMap } from './base-class.js';
3
+ export const signal = (defaultValue, options) => {
4
+ const id = nanoid();
5
+ const def = {
6
+ _tag: 'signal-def',
7
+ defaultValue,
8
+ hash: id,
9
+ label: options?.label ?? 'Signal',
10
+ make: withRCMap(id, (ctx) => new Signal({
11
+ defaultValue,
12
+ reactivityGraph: ctx.reactivityGraph.deref(),
13
+ label: options?.label ?? 'Signal',
14
+ def,
15
+ })),
16
+ };
17
+ return def;
18
+ };
19
+ export class Signal extends LiveStoreQueryBase {
20
+ _tag = 'signal';
21
+ ref;
22
+ label;
23
+ reactivityGraph;
24
+ results$;
25
+ def;
26
+ constructor(
27
+ // private defaultValue: T,
28
+ // readonly reactivityGraph: ReactivityGraph,
29
+ // private options?: {
30
+ // label?: string
31
+ // },
32
+ { defaultValue, reactivityGraph, label, def, }) {
33
+ super();
34
+ this.ref = reactivityGraph.makeRef(defaultValue, { label });
35
+ this.label = label;
36
+ this.reactivityGraph = reactivityGraph;
37
+ this.def = def;
38
+ this.results$ = this.ref;
39
+ }
40
+ set = (value) => {
41
+ this.reactivityGraph.setRef(this.ref, value);
42
+ };
43
+ get = () => {
44
+ return this.ref.computeResult();
45
+ };
46
+ destroy = () => {
47
+ this.reactivityGraph.destroyNode(this.ref);
48
+ };
49
+ }
50
+ //# sourceMappingURL=signal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal.js","sourceRoot":"","sources":["../../src/live-queries/signal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAKhD,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE/D,MAAM,CAAC,MAAM,MAAM,GAAG,CACpB,YAAe,EACf,OAEC,EACa,EAAE;IAChB,MAAM,EAAE,GAAG,MAAM,EAAE,CAAA;IACnB,MAAM,GAAG,GAAiB;QACxB,IAAI,EAAE,YAAY;QAClB,YAAY;QACZ,IAAI,EAAE,EAAE;QACR,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,QAAQ;QACjC,IAAI,EAAE,SAAS,CACb,EAAE,EACF,CAAC,GAAG,EAAE,EAAE,CACN,IAAI,MAAM,CAAC;YACT,YAAY;YACZ,eAAe,EAAE,GAAG,CAAC,eAAe,CAAC,KAAK,EAAG;YAC7C,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,QAAQ;YACjC,GAAG;SACJ,CAAC,CACL;KACF,CAAA;IAED,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED,MAAM,OAAO,MAAU,SAAQ,kBAAqB;IAClD,IAAI,GAAG,QAAiB,CAAA;IACf,GAAG,CAAkD;IAC9D,KAAK,CAAQ;IACb,eAAe,CAAiB;IAChC,QAAQ,CAAkD;IAC1D,GAAG,CAAc;IACjB;IACE,2BAA2B;IAC3B,6CAA6C;IAC7C,sBAAsB;IACtB,mBAAmB;IACnB,KAAK;IACL,EACE,YAAY,EACZ,eAAe,EACf,KAAK,EACL,GAAG,GAMJ;QAED,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,GAAG,GAAG,eAAe,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;QAC3D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,eAAe,GAAG,eAAe,CAAA;QACtC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QAEd,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAA;IAC1B,CAAC;IAED,GAAG,GAAG,CAAC,KAAQ,EAAE,EAAE;QACjB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAC9C,CAAC,CAAA;IAED,GAAG,GAAG,GAAG,EAAE;QACT,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAA;IACjC,CAAC,CAAA;IAED,OAAO,GAAG,GAAG,EAAE;QACb,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC5C,CAAC,CAAA;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=signal.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal.test.d.ts","sourceRoot":"","sources":["../../src/live-queries/signal.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ import { Effect } from '@livestore/utils/effect';
2
+ import { Vitest } from '@livestore/utils-dev/node-vitest';
3
+ import { expect } from 'vitest';
4
+ import { makeTodoMvc } from '../utils/tests/fixture.js';
5
+ import { computed } from './computed.js';
6
+ import { signal } from './signal.js';
7
+ Vitest.describe('signal', () => {
8
+ Vitest.scopedLive('should be able to create a signal', () => Effect.gen(function* () {
9
+ const num$ = signal(0, { label: 'num$' });
10
+ const duplicated$ = computed((get) => get(num$) * 2, { label: 'duplicated$' });
11
+ const store = yield* makeTodoMvc({});
12
+ expect(store.query(duplicated$)).toBe(0);
13
+ store.setSignal(num$, 1);
14
+ expect(store.query(duplicated$)).toBe(2);
15
+ }));
16
+ Vitest.scopedLive('counter example', () => Effect.gen(function* () {
17
+ const count$ = signal(0, { label: 'count$' });
18
+ const store = yield* makeTodoMvc({});
19
+ const increment = () => store.setSignal(count$, (prev) => prev + 1);
20
+ increment();
21
+ increment();
22
+ expect(store.query(count$)).toBe(2);
23
+ }));
24
+ });
25
+ //# sourceMappingURL=signal.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal.test.js","sourceRoot":"","sources":["../../src/live-queries/signal.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IAC7B,MAAM,CAAC,UAAU,CAAC,mCAAmC,EAAE,GAAG,EAAE,CAC1D,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QAEzC,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAA;QAE9E,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;QAEpC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAExC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QAExB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC1C,CAAC,CAAC,CACH,CAAA;IAED,MAAM,CAAC,UAAU,CAAC,iBAAiB,EAAE,GAAG,EAAE,CACxC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;QAE7C,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;QAEpC,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAA;QAEnE,SAAS,EAAE,CAAA;QACX,SAAS,EAAE,CAAA;QAEX,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACrC,CAAC,CAAC,CACH,CAAA;AACH,CAAC,CAAC,CAAA"}
package/dist/mod.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ export { Store } from './store/store.js';
2
+ export { createStore, createStorePromise, type CreateStoreOptions } from './store/create-store.js';
3
+ export type { QueryDebugInfo, RefreshReason, OtelOptions } from './store/store-types.js';
4
+ export { Schema } from '@livestore/utils/effect';
5
+ export { type LiveStoreContext, type LiveStoreContextRunning, type ShutdownDeferred, makeShutdownDeferred, } from './store/store-types.js';
6
+ export { SqliteDbWrapper, emptyDebugInfo } from './SqliteDbWrapper.js';
7
+ export { queryDb, computed, signal, type LiveQuery, type LiveQueryDef, type Signal, type SignalDef, type RcRef, } from './live-queries/mod.js';
8
+ export * from '@livestore/common/schema';
9
+ export { sql, SessionIdSymbol, type BootStatus, type SqliteDb, type DebugInfo, type MutableDebugInfo, prepareBindValues, type Bindable, type PreparedBindValues, type QueryBuilderAst, type QueryBuilder, type RowQuery, StoreInterrupted, IntentionalShutdownCause, provideOtel, } from '@livestore/common';
10
+ export { deepEqual } from '@livestore/utils';
11
+ export { nanoid } from '@livestore/utils/nanoid';
12
+ export * from './utils/stack-info.js';
13
+ export type { ClientSession, Adapter, PreparedStatement } from '@livestore/common';
14
+ //# sourceMappingURL=mod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAClG,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAExF,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,oBAAoB,GACrB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAEtE,OAAO,EACL,OAAO,EACP,QAAQ,EACR,MAAM,EACN,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,MAAM,EACX,KAAK,SAAS,EACd,KAAK,KAAK,GACX,MAAM,uBAAuB,CAAA;AAE9B,cAAc,0BAA0B,CAAA;AACxC,OAAO,EACL,GAAG,EACH,eAAe,EACf,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,iBAAiB,EACjB,KAAK,QAAQ,EACb,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,gBAAgB,EAChB,wBAAwB,EACxB,WAAW,GACZ,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,cAAc,uBAAuB,CAAA;AAErC,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA"}
package/dist/mod.js ADDED
@@ -0,0 +1,13 @@
1
+ export { Store } from './store/store.js';
2
+ export { createStore, createStorePromise } from './store/create-store.js';
3
+ // We're re-exporting `Schema` from `effect` for convenience
4
+ export { Schema } from '@livestore/utils/effect';
5
+ export { makeShutdownDeferred, } from './store/store-types.js';
6
+ export { SqliteDbWrapper, emptyDebugInfo } from './SqliteDbWrapper.js';
7
+ export { queryDb, computed, signal, } from './live-queries/mod.js';
8
+ export * from '@livestore/common/schema';
9
+ export { sql, SessionIdSymbol, prepareBindValues, StoreInterrupted, IntentionalShutdownCause, provideOtel, } from '@livestore/common';
10
+ export { deepEqual } from '@livestore/utils';
11
+ export { nanoid } from '@livestore/utils/nanoid';
12
+ export * from './utils/stack-info.js';
13
+ //# sourceMappingURL=mod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.js","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAA2B,MAAM,yBAAyB,CAAA;AAElG,4DAA4D;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,OAAO,EAIL,oBAAoB,GACrB,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAEtE,OAAO,EACL,OAAO,EACP,QAAQ,EACR,MAAM,GAMP,MAAM,uBAAuB,CAAA;AAE9B,cAAc,0BAA0B,CAAA;AACxC,OAAO,EACL,GAAG,EACH,eAAe,EAKf,iBAAiB,EAMjB,gBAAgB,EAChB,wBAAwB,EACxB,WAAW,GACZ,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhD,cAAc,uBAAuB,CAAA"}