@livestore/livestore 0.0.12 → 0.0.14

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 (226) hide show
  1. package/README.md +25 -28
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/QueryCache.d.ts +20 -0
  4. package/dist/QueryCache.d.ts.map +1 -0
  5. package/dist/QueryCache.js +71 -0
  6. package/dist/QueryCache.js.map +1 -0
  7. package/dist/__tests__/react/fixture.d.ts +26 -0
  8. package/dist/__tests__/react/fixture.d.ts.map +1 -0
  9. package/dist/__tests__/react/fixture.js +60 -0
  10. package/dist/__tests__/react/fixture.js.map +1 -0
  11. package/dist/__tests__/react/useComponentState.test.d.ts +2 -0
  12. package/dist/__tests__/react/useComponentState.test.d.ts.map +1 -0
  13. package/dist/__tests__/react/useComponentState.test.js +68 -0
  14. package/dist/__tests__/react/useComponentState.test.js.map +1 -0
  15. package/dist/__tests__/react/useLQuery.test.d.ts +2 -0
  16. package/dist/__tests__/react/useLQuery.test.d.ts.map +1 -0
  17. package/dist/__tests__/react/useLQuery.test.js +38 -0
  18. package/dist/__tests__/react/useLQuery.test.js.map +1 -0
  19. package/dist/__tests__/react/useLiveStoreComponent.test.d.ts +2 -0
  20. package/dist/__tests__/react/useLiveStoreComponent.test.d.ts.map +1 -0
  21. package/dist/__tests__/react/useLiveStoreComponent.test.js +73 -0
  22. package/dist/__tests__/react/useLiveStoreComponent.test.js.map +1 -0
  23. package/dist/__tests__/react/useQuery.test.d.ts +2 -0
  24. package/dist/__tests__/react/useQuery.test.d.ts.map +1 -0
  25. package/dist/__tests__/react/useQuery.test.js +33 -0
  26. package/dist/__tests__/react/useQuery.test.js.map +1 -0
  27. package/dist/__tests__/react/utils/extractStackInfoFromStackTrace.test.d.ts +2 -0
  28. package/dist/__tests__/react/utils/extractStackInfoFromStackTrace.test.d.ts.map +1 -0
  29. package/dist/__tests__/react/utils/extractStackInfoFromStackTrace.test.js +38 -0
  30. package/dist/__tests__/react/utils/extractStackInfoFromStackTrace.test.js.map +1 -0
  31. package/dist/__tests__/reactive.test.d.ts +2 -0
  32. package/dist/__tests__/reactive.test.d.ts.map +1 -0
  33. package/dist/__tests__/reactive.test.js +271 -0
  34. package/dist/__tests__/reactive.test.js.map +1 -0
  35. package/dist/__tests__/reactiveQueries/sql.test.d.ts +2 -0
  36. package/dist/__tests__/reactiveQueries/sql.test.d.ts.map +1 -0
  37. package/dist/__tests__/reactiveQueries/sql.test.js +337 -0
  38. package/dist/__tests__/reactiveQueries/sql.test.js.map +1 -0
  39. package/dist/bounded-collections.d.ts +34 -0
  40. package/dist/bounded-collections.d.ts.map +1 -0
  41. package/dist/bounded-collections.js +103 -0
  42. package/dist/bounded-collections.js.map +1 -0
  43. package/dist/componentKey.d.ts +20 -0
  44. package/dist/componentKey.d.ts.map +1 -0
  45. package/dist/componentKey.js +3 -0
  46. package/dist/componentKey.js.map +1 -0
  47. package/dist/effect/LiveStore.d.ts +36 -0
  48. package/dist/effect/LiveStore.d.ts.map +1 -0
  49. package/dist/effect/LiveStore.js +41 -0
  50. package/dist/effect/LiveStore.js.map +1 -0
  51. package/dist/effect/index.d.ts +2 -0
  52. package/dist/effect/index.d.ts.map +1 -0
  53. package/dist/effect/index.js +2 -0
  54. package/dist/effect/index.js.map +1 -0
  55. package/dist/events.d.ts +7 -0
  56. package/dist/events.d.ts.map +1 -0
  57. package/dist/events.js +2 -0
  58. package/dist/events.js.map +1 -0
  59. package/dist/inMemoryDatabase.d.ts +56 -0
  60. package/dist/inMemoryDatabase.d.ts.map +1 -0
  61. package/dist/inMemoryDatabase.js +223 -0
  62. package/dist/inMemoryDatabase.js.map +1 -0
  63. package/dist/index.d.ts +22 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +13 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/migrations.d.ts +16 -0
  68. package/dist/migrations.d.ts.map +1 -0
  69. package/dist/migrations.js +67 -0
  70. package/dist/migrations.js.map +1 -0
  71. package/dist/otel.d.ts +4 -0
  72. package/dist/otel.d.ts.map +1 -0
  73. package/dist/otel.js +6 -0
  74. package/dist/otel.js.map +1 -0
  75. package/dist/react/LiveStoreContext.d.ts +11 -0
  76. package/dist/react/LiveStoreContext.d.ts.map +1 -0
  77. package/dist/react/LiveStoreContext.js +10 -0
  78. package/dist/react/LiveStoreContext.js.map +1 -0
  79. package/dist/react/LiveStoreProvider.d.ts +20 -0
  80. package/dist/react/LiveStoreProvider.d.ts.map +1 -0
  81. package/dist/react/LiveStoreProvider.js +52 -0
  82. package/dist/react/LiveStoreProvider.js.map +1 -0
  83. package/dist/react/index.d.ts +8 -0
  84. package/dist/react/index.d.ts.map +1 -0
  85. package/dist/react/index.js +6 -0
  86. package/dist/react/index.js.map +1 -0
  87. package/dist/react/useComponentState.d.ts +50 -0
  88. package/dist/react/useComponentState.d.ts.map +1 -0
  89. package/dist/react/useComponentState.js +248 -0
  90. package/dist/react/useComponentState.js.map +1 -0
  91. package/dist/react/useGlobalQuery.d.ts +3 -0
  92. package/dist/react/useGlobalQuery.d.ts.map +1 -0
  93. package/dist/react/useGlobalQuery.js +26 -0
  94. package/dist/react/useGlobalQuery.js.map +1 -0
  95. package/dist/react/useGraphQL.d.ts +13 -0
  96. package/dist/react/useGraphQL.d.ts.map +1 -0
  97. package/dist/react/useGraphQL.js +87 -0
  98. package/dist/react/useGraphQL.js.map +1 -0
  99. package/dist/react/useLiveStoreComponent.d.ts +75 -0
  100. package/dist/react/useLiveStoreComponent.d.ts.map +1 -0
  101. package/dist/react/useLiveStoreComponent.js +361 -0
  102. package/dist/react/useLiveStoreComponent.js.map +1 -0
  103. package/dist/react/useQuery.d.ts +3 -0
  104. package/dist/react/useQuery.d.ts.map +1 -0
  105. package/dist/react/useQuery.js +42 -0
  106. package/dist/react/useQuery.js.map +1 -0
  107. package/dist/react/useTemporaryQuery.d.ts +8 -0
  108. package/dist/react/useTemporaryQuery.d.ts.map +1 -0
  109. package/dist/react/useTemporaryQuery.js +17 -0
  110. package/dist/react/useTemporaryQuery.js.map +1 -0
  111. package/dist/react/utils/extractNamesFromStackTrace.d.ts +3 -0
  112. package/dist/react/utils/extractNamesFromStackTrace.d.ts.map +1 -0
  113. package/dist/react/utils/extractNamesFromStackTrace.js +40 -0
  114. package/dist/react/utils/extractNamesFromStackTrace.js.map +1 -0
  115. package/dist/react/utils/extractStackInfoFromStackTrace.d.ts +7 -0
  116. package/dist/react/utils/extractStackInfoFromStackTrace.d.ts.map +1 -0
  117. package/dist/react/utils/extractStackInfoFromStackTrace.js +40 -0
  118. package/dist/react/utils/extractStackInfoFromStackTrace.js.map +1 -0
  119. package/dist/react/utils/useStateRefWithReactiveInput.d.ts +13 -0
  120. package/dist/react/utils/useStateRefWithReactiveInput.d.ts.map +1 -0
  121. package/dist/react/utils/useStateRefWithReactiveInput.js +38 -0
  122. package/dist/react/utils/useStateRefWithReactiveInput.js.map +1 -0
  123. package/dist/reactive.d.ts +134 -0
  124. package/dist/reactive.d.ts.map +1 -0
  125. package/dist/reactive.js +409 -0
  126. package/dist/reactive.js.map +1 -0
  127. package/dist/reactiveQueries/base-class.d.ts +32 -0
  128. package/dist/reactiveQueries/base-class.d.ts.map +1 -0
  129. package/dist/reactiveQueries/base-class.js +30 -0
  130. package/dist/reactiveQueries/base-class.js.map +1 -0
  131. package/dist/reactiveQueries/graph.d.ts +10 -0
  132. package/dist/reactiveQueries/graph.d.ts.map +1 -0
  133. package/dist/reactiveQueries/graph.js +6 -0
  134. package/dist/reactiveQueries/graph.js.map +1 -0
  135. package/dist/reactiveQueries/graphql.d.ts +42 -0
  136. package/dist/reactiveQueries/graphql.d.ts.map +1 -0
  137. package/dist/reactiveQueries/graphql.js +99 -0
  138. package/dist/reactiveQueries/graphql.js.map +1 -0
  139. package/dist/reactiveQueries/js.d.ts +23 -0
  140. package/dist/reactiveQueries/js.d.ts.map +1 -0
  141. package/dist/reactiveQueries/js.js +36 -0
  142. package/dist/reactiveQueries/js.js.map +1 -0
  143. package/dist/reactiveQueries/sql.d.ts +35 -0
  144. package/dist/reactiveQueries/sql.d.ts.map +1 -0
  145. package/dist/reactiveQueries/sql.js +97 -0
  146. package/dist/reactiveQueries/sql.js.map +1 -0
  147. package/dist/schema.d.ts +81 -0
  148. package/dist/schema.d.ts.map +1 -0
  149. package/dist/schema.js +46 -0
  150. package/dist/schema.js.map +1 -0
  151. package/dist/storage/in-memory/index.d.ts +15 -0
  152. package/dist/storage/in-memory/index.d.ts.map +1 -0
  153. package/dist/storage/in-memory/index.js +14 -0
  154. package/dist/storage/in-memory/index.js.map +1 -0
  155. package/dist/storage/index.d.ts +14 -0
  156. package/dist/storage/index.d.ts.map +1 -0
  157. package/dist/storage/index.js +9 -0
  158. package/dist/storage/index.js.map +1 -0
  159. package/dist/storage/tauri/index.d.ts +19 -0
  160. package/dist/storage/tauri/index.d.ts.map +1 -0
  161. package/dist/storage/tauri/index.js +38 -0
  162. package/dist/storage/tauri/index.js.map +1 -0
  163. package/dist/storage/utils/idb.d.ts +10 -0
  164. package/dist/storage/utils/idb.d.ts.map +1 -0
  165. package/dist/storage/utils/idb.js +58 -0
  166. package/dist/storage/utils/idb.js.map +1 -0
  167. package/dist/storage/web-worker/index.d.ts +27 -0
  168. package/dist/storage/web-worker/index.d.ts.map +1 -0
  169. package/dist/storage/web-worker/index.js +74 -0
  170. package/dist/storage/web-worker/index.js.map +1 -0
  171. package/dist/storage/web-worker/worker.d.ts +13 -0
  172. package/dist/storage/web-worker/worker.d.ts.map +1 -0
  173. package/dist/storage/web-worker/worker.js +110 -0
  174. package/dist/storage/web-worker/worker.js.map +1 -0
  175. package/dist/store.d.ts +159 -0
  176. package/dist/store.d.ts.map +1 -0
  177. package/dist/store.js +626 -0
  178. package/dist/store.js.map +1 -0
  179. package/dist/util.d.ts +28 -0
  180. package/dist/util.d.ts.map +1 -0
  181. package/dist/util.js +55 -0
  182. package/dist/util.js.map +1 -0
  183. package/package.json +47 -19
  184. package/src/QueryCache.ts +1 -1
  185. package/src/__tests__/react/fixture.tsx +35 -39
  186. package/src/__tests__/react/{useLiveStoreComponent.test.tsx → useComponentState.test.tsx} +9 -20
  187. package/src/__tests__/react/useQuery.test.tsx +48 -0
  188. package/src/__tests__/react/utils/extractStackInfoFromStackTrace.test.ts +40 -0
  189. package/src/__tests__/reactive.test.ts +194 -142
  190. package/src/__tests__/reactiveQueries/sql.test.ts +372 -0
  191. package/src/effect/LiveStore.ts +22 -31
  192. package/src/events.ts +1 -1
  193. package/src/inMemoryDatabase.ts +117 -142
  194. package/src/index.ts +18 -22
  195. package/src/migrations.ts +119 -0
  196. package/src/otel.ts +0 -11
  197. package/src/react/LiveStoreProvider.tsx +24 -23
  198. package/src/react/index.ts +12 -7
  199. package/src/react/useComponentState.ts +409 -0
  200. package/src/react/useQuery.ts +58 -0
  201. package/src/react/useTemporaryQuery.ts +21 -0
  202. package/src/react/utils/extractStackInfoFromStackTrace.ts +47 -0
  203. package/src/reactive.ts +386 -267
  204. package/src/reactiveQueries/base-class.ts +61 -39
  205. package/src/reactiveQueries/graph.ts +15 -0
  206. package/src/reactiveQueries/graphql.ts +147 -31
  207. package/src/reactiveQueries/js.ts +54 -21
  208. package/src/reactiveQueries/sql.ts +128 -37
  209. package/src/schema.ts +69 -145
  210. package/src/storage/in-memory/index.ts +21 -0
  211. package/src/storage/index.ts +27 -0
  212. package/src/{backends/tauri.ts → storage/tauri/index.ts} +14 -28
  213. package/src/storage/web-worker/index.ts +116 -0
  214. package/src/{backends/web-worker.ts → storage/web-worker/worker.ts} +17 -52
  215. package/src/store.ts +466 -457
  216. package/src/util.ts +13 -3
  217. package/tsconfig.json +1 -3
  218. package/src/backends/base.ts +0 -67
  219. package/src/backends/index.ts +0 -98
  220. package/src/backends/noop.ts +0 -32
  221. package/src/backends/web-in-memory.ts +0 -65
  222. package/src/backends/web.ts +0 -97
  223. package/src/react/useGlobalQuery.ts +0 -40
  224. package/src/react/useGraphQL.ts +0 -112
  225. package/src/react/useLiveStoreComponent.ts +0 -483
  226. /package/src/{backends → storage}/utils/idb.ts +0 -0
@@ -0,0 +1,99 @@
1
+ import { assertNever, shouldNeverHappen } from '@livestore/utils';
2
+ import * as otel from '@opentelemetry/api';
3
+ import * as graphql from 'graphql';
4
+ import { LiveStoreQueryBase, makeGetAtomResult } from './base-class.js';
5
+ import { dbGraph } from './graph.js';
6
+ import { LiveStoreJSQuery } from './js.js';
7
+ export const queryGraphQL = (document, genVariableValues, { label } = {}) => new LiveStoreGraphQLQuery({ document, genVariableValues, label });
8
+ export class LiveStoreGraphQLQuery extends LiveStoreQueryBase {
9
+ constructor({ document, label, genVariableValues, // context,
10
+ }) {
11
+ super();
12
+ this._tag = 'graphql';
13
+ /**
14
+ * Returns a new reactive query that contains the result of
15
+ * running an arbitrary JS computation on the results of this SQL query.
16
+ */
17
+ this.pipe = (fn) => new LiveStoreJSQuery({
18
+ fn: (get) => {
19
+ const results = get(this.results$);
20
+ return fn(results, get);
21
+ },
22
+ label: `${this.label}:js`,
23
+ onDestroy: () => this.destroy(),
24
+ });
25
+ this.queryOnce = ({ document, otelContext, otelTracer, variableValues, store, }) => {
26
+ // const schema = this.schema
27
+ // const context = this.context
28
+ const schema = store.graphQLSchema ?? shouldNeverHappen("Can't run a GraphQL query on a store without GraphQL schema");
29
+ const context = store.graphQLContext ?? shouldNeverHappen("Can't run a GraphQL query on a store without GraphQL context");
30
+ const operationName = graphql.getOperationAST(document)?.name?.value;
31
+ return otelTracer.startActiveSpan(`executeGraphQLQuery: ${operationName}`, {}, otelContext, (span) => {
32
+ try {
33
+ span.setAttribute('graphql.variables', JSON.stringify(variableValues));
34
+ span.setAttribute('graphql.query', graphql.print(document));
35
+ context.queriedTables.clear();
36
+ context.otelContext = otel.trace.setSpan(otel.context.active(), span);
37
+ const res = graphql.executeSync({
38
+ document,
39
+ contextValue: context,
40
+ schema: schema,
41
+ variableValues,
42
+ });
43
+ // TODO track number of nested SQL queries via Otel + debug info
44
+ if (res.errors) {
45
+ span.setStatus({ code: otel.SpanStatusCode.ERROR, message: 'GraphQL error' });
46
+ span.setAttribute('graphql.error', res.errors.join('\n'));
47
+ span.setAttribute('graphql.error-detail', JSON.stringify(res.errors));
48
+ console.error(`graphql error (${operationName})`, res.errors);
49
+ }
50
+ return { result: res.data, queriedTables: Array.from(context.queriedTables.values()) };
51
+ }
52
+ finally {
53
+ span.end();
54
+ }
55
+ });
56
+ };
57
+ this.destroy = () => {
58
+ dbGraph.destroy(this.variableValues$);
59
+ dbGraph.destroy(this.results$);
60
+ };
61
+ const labelWithDefault = label ?? graphql.getOperationAST(document)?.name?.value ?? 'graphql';
62
+ this.label = labelWithDefault;
63
+ this.document = document;
64
+ // if (context === undefined) {
65
+ // return shouldNeverHappen("Can't run a GraphQL query on a store without GraphQL context")
66
+ // }
67
+ // TODO don't even create a thunk if variables are static
68
+ const variableValues$ = dbGraph.makeThunk((get, _addDebugInfo, { rootOtelContext }, otelContext) => {
69
+ if (typeof genVariableValues === 'function') {
70
+ return genVariableValues(makeGetAtomResult(get, otelContext ?? rootOtelContext));
71
+ }
72
+ else {
73
+ return genVariableValues;
74
+ }
75
+ }, { label: `${labelWithDefault}:variableValues`, meta: { liveStoreThunkType: 'graphqlVariableValues' } });
76
+ this.variableValues$ = variableValues$;
77
+ // const resultsLabel = `${labelWithDefault}:results` + (this.temporaryQueries ? ':temp' : '')
78
+ const resultsLabel = `${labelWithDefault}:results`;
79
+ this.results$ = dbGraph.makeThunk((get, addDebugInfo, { store, otelTracer, rootOtelContext }, otelContext) => {
80
+ const variableValues = get(variableValues$);
81
+ const { result, queriedTables } = this.queryOnce({
82
+ document,
83
+ variableValues,
84
+ otelContext: otelContext ?? rootOtelContext,
85
+ otelTracer,
86
+ store: store,
87
+ });
88
+ // Add dependencies on any tables that were used
89
+ for (const tableName of queriedTables) {
90
+ const tableRef = store.tableRefs[tableName];
91
+ assertNever(tableRef !== undefined, `No table ref found for ${tableName}`);
92
+ get(tableRef);
93
+ }
94
+ addDebugInfo({ _tag: 'graphql', label: resultsLabel, query: graphql.print(document) });
95
+ return result;
96
+ }, { label: resultsLabel, meta: { liveStoreThunkType: 'graphqlResults' } });
97
+ }
98
+ }
99
+ //# sourceMappingURL=graphql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql.js","sourceRoot":"","sources":["../../src/reactiveQueries/graphql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { Thunk } from '../reactive.js';
2
+ import { type GetAtomResult, LiveStoreQueryBase } from './base-class.js';
3
+ import type { DbContext } from './graph.js';
4
+ export declare const queryJS: <TResult>(fn: (get: GetAtomResult) => TResult, options: {
5
+ label: string;
6
+ }) => LiveStoreJSQuery<TResult>;
7
+ export declare class LiveStoreJSQuery<TResult> extends LiveStoreQueryBase<TResult> {
8
+ _tag: 'js';
9
+ /** A reactive thunk representing the query results */
10
+ results$: Thunk<TResult, DbContext>;
11
+ label: string;
12
+ /** Currently only used for "nested destruction" of piped queries */
13
+ private onDestroy;
14
+ constructor({ fn, label, onDestroy, }: {
15
+ label: string;
16
+ fn: (get: GetAtomResult) => TResult;
17
+ /** Currently only used for "nested destruction" of piped queries */
18
+ onDestroy?: () => void;
19
+ });
20
+ pipe: <U>(fn: (result: TResult, get: GetAtomResult) => U) => LiveStoreJSQuery<U>;
21
+ destroy: () => void;
22
+ }
23
+ //# sourceMappingURL=js.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js.d.ts","sourceRoot":"","sources":["../../src/reactiveQueries/js.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,KAAK,aAAa,EAAE,kBAAkB,EAAqB,MAAM,iBAAiB,CAAA;AAC3F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAG3C,eAAO,MAAM,OAAO,sBAAuB,aAAa,uBAAuB;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,8BACnC,CAAA;AAE7D,qBAAa,gBAAgB,CAAC,OAAO,CAAE,SAAQ,kBAAkB,CAAC,OAAO,CAAC;IACxE,IAAI,EAAE,IAAI,CAAO;IAEjB,sDAAsD;IACtD,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IAEnC,KAAK,EAAE,MAAM,CAAA;IAEb,oEAAoE;IACpE,OAAO,CAAC,SAAS,CAA0B;gBAE/B,EACV,EAAE,EACF,KAAK,EACL,SAAS,GACV,EAAE;QACD,KAAK,EAAE,MAAM,CAAA;QACb,EAAE,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAA;QACnC,oEAAoE;QACpE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;KACvB;IAwBD,IAAI,mBAAoB,OAAO,OAAO,aAAa,+BAQ/C;IAEJ,OAAO,aAGN;CACF"}
@@ -0,0 +1,36 @@
1
+ import * as otel from '@opentelemetry/api';
2
+ import { LiveStoreQueryBase, makeGetAtomResult } from './base-class.js';
3
+ import { dbGraph } from './graph.js';
4
+ export const queryJS = (fn, options) => new LiveStoreJSQuery({ fn, label: options.label });
5
+ export class LiveStoreJSQuery extends LiveStoreQueryBase {
6
+ constructor({ fn, label, onDestroy, }) {
7
+ super();
8
+ this._tag = 'js';
9
+ this.pipe = (fn) => new LiveStoreJSQuery({
10
+ fn: (get) => {
11
+ const results = get(this.results$);
12
+ return fn(results, get);
13
+ },
14
+ label: `${this.label}:js`,
15
+ onDestroy: () => this.destroy(),
16
+ });
17
+ this.destroy = () => {
18
+ dbGraph.destroy(this.results$);
19
+ this.onDestroy?.();
20
+ };
21
+ this.onDestroy = onDestroy;
22
+ this.label = label;
23
+ const queryLabel = `${label}:results`;
24
+ this.results$ = dbGraph.makeThunk((get, addDebugInfo, { otelTracer, rootOtelContext }, otelContext) => otelTracer.startActiveSpan(`js:${label}`, {}, otelContext ?? rootOtelContext, (span) => {
25
+ try {
26
+ addDebugInfo({ _tag: 'js', label, query: fn.toString() });
27
+ const otelContext = otel.trace.setSpan(otel.context.active(), span);
28
+ return fn(makeGetAtomResult(get, otelContext));
29
+ }
30
+ finally {
31
+ span.end();
32
+ }
33
+ }), { label: queryLabel, meta: { liveStoreThunkType: 'jsResults' } });
34
+ }
35
+ }
36
+ //# sourceMappingURL=js.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js.js","sourceRoot":"","sources":["../../src/reactiveQueries/js.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAG1C,OAAO,EAAsB,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAE3F,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEpC,MAAM,CAAC,MAAM,OAAO,GAAG,CAAU,EAAmC,EAAE,OAA0B,EAAE,EAAE,CAClG,IAAI,gBAAgB,CAAU,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAA;AAE7D,MAAM,OAAO,gBAA0B,SAAQ,kBAA2B;IAWxE,YAAY,EACV,EAAE,EACF,KAAK,EACL,SAAS,GAMV;QACC,KAAK,EAAE,CAAA;QApBT,SAAI,GAAS,IAAI,CAAA;QA2CjB,SAAI,GAAG,CAAI,EAA8C,EAAuB,EAAE,CAChF,IAAI,gBAAgB,CAAC;YACnB,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE;gBACV,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;gBAClC,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;YACzB,CAAC;YACD,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,KAAK;YACzB,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE;SAChC,CAAC,CAAA;QAEJ,YAAO,GAAG,GAAG,EAAE;YACb,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC9B,IAAI,CAAC,SAAS,EAAE,EAAE,CAAA;QACpB,CAAC,CAAA;QAlCC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAElB,MAAM,UAAU,GAAG,GAAG,KAAK,UAAU,CAAA;QAErC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,SAAS,CAC/B,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,EAAE,WAAW,EAAE,EAAE,CAClE,UAAU,CAAC,eAAe,CAAC,MAAM,KAAK,EAAE,EAAE,EAAE,EAAE,WAAW,IAAI,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE;YACrF,IAAI;gBACF,YAAY,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;gBAEzD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,CAAA;gBACnE,OAAO,EAAE,CAAC,iBAAiB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAA;aAC/C;oBAAS;gBACR,IAAI,CAAC,GAAG,EAAE,CAAA;aACX;QACH,CAAC,CAAC,EACJ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,kBAAkB,EAAE,WAAW,EAAE,EAAE,CACjE,CAAA;IACH,CAAC;CAgBF"}
@@ -0,0 +1,35 @@
1
+ import type { Thunk } from '../reactive.js';
2
+ import type { Bindable } from '../util.js';
3
+ import { type GetAtomResult, LiveStoreQueryBase } from './base-class.js';
4
+ import type { DbContext } from './graph.js';
5
+ import { LiveStoreJSQuery } from './js.js';
6
+ export declare const querySQL: <Row>(query: string | ((get: GetAtomResult) => string), options: {
7
+ queriedTables: ReadonlyArray<string>;
8
+ bindValues?: Bindable;
9
+ label?: string;
10
+ }) => LiveStoreSQLQuery<Row>;
11
+ export declare class LiveStoreSQLQuery<Row> extends LiveStoreQueryBase<ReadonlyArray<Row>> {
12
+ _tag: 'sql';
13
+ /** A reactive thunk representing the query text */
14
+ queryString$: Thunk<string, DbContext>;
15
+ /** A reactive thunk representing the query results */
16
+ results$: Thunk<ReadonlyArray<Row>, DbContext>;
17
+ label: string;
18
+ constructor({ genQueryString, queriedTables, bindValues, label, }: {
19
+ label?: string;
20
+ genQueryString: string | ((get: GetAtomResult) => string);
21
+ queriedTables: ReadonlyArray<string>;
22
+ bindValues?: Bindable;
23
+ });
24
+ /**
25
+ * Returns a new reactive query that contains the result of
26
+ * running an arbitrary JS computation on the results of this SQL query.
27
+ */
28
+ pipe: <U>(fn: (result: ReadonlyArray<Row>, get: GetAtomResult) => U) => LiveStoreJSQuery<U>;
29
+ /** Returns a reactive query */
30
+ getFirstRow: (args?: {
31
+ defaultValue?: Row;
32
+ }) => LiveStoreJSQuery<NonNullable<Row>>;
33
+ destroy: () => void;
34
+ }
35
+ //# sourceMappingURL=sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/reactiveQueries/sql.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE1C,OAAO,EAAE,KAAK,aAAa,EAAE,kBAAkB,EAAqB,MAAM,iBAAiB,CAAA;AAC3F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE1C,eAAO,MAAM,QAAQ,+BACI,aAAa,KAAK,MAAM,YACtC;IACP,aAAa,EAAE,cAAc,MAAM,CAAC,CAAA;IACpC,UAAU,CAAC,EAAE,QAAQ,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,2BAOC,CAAA;AAGJ,qBAAa,iBAAiB,CAAC,GAAG,CAAE,SAAQ,kBAAkB,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAChF,IAAI,EAAE,KAAK,CAAQ;IAEnB,mDAAmD;IACnD,YAAY,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAEtC,sDAAsD;IACtD,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,CAAA;IAE9C,KAAK,EAAE,MAAM,CAAA;gBAED,EACV,cAAc,EACd,aAAa,EACb,UAAU,EACV,KAAK,GACN,EAAE;QACD,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,cAAc,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,aAAa,KAAK,MAAM,CAAC,CAAA;QACzD,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;QACpC,UAAU,CAAC,EAAE,QAAQ,CAAA;KACtB;IAyED;;;OAGG;IACH,IAAI,mBAAoB,cAAc,GAAG,CAAC,OAAO,aAAa,+BAQ1D;IAEJ,gCAAgC;IAChC,WAAW,UAAW;QAAE,YAAY,CAAC,EAAE,GAAG,CAAA;KAAE,wCAaxC;IAEJ,OAAO,aAGN;CACF"}
@@ -0,0 +1,97 @@
1
+ import { shouldNeverHappen } from '@livestore/utils';
2
+ import * as otel from '@opentelemetry/api';
3
+ import { prepareBindValues } from '../util.js';
4
+ import { LiveStoreQueryBase, makeGetAtomResult } from './base-class.js';
5
+ import { dbGraph } from './graph.js';
6
+ import { LiveStoreJSQuery } from './js.js';
7
+ export const querySQL = (query, options) => new LiveStoreSQLQuery({
8
+ label: options.label,
9
+ genQueryString: query,
10
+ queriedTables: options.queriedTables,
11
+ bindValues: options.bindValues,
12
+ });
13
+ /* An object encapsulating a reactive SQL query */
14
+ export class LiveStoreSQLQuery extends LiveStoreQueryBase {
15
+ constructor({ genQueryString, queriedTables, bindValues, label, }) {
16
+ super();
17
+ this._tag = 'sql';
18
+ /**
19
+ * Returns a new reactive query that contains the result of
20
+ * running an arbitrary JS computation on the results of this SQL query.
21
+ */
22
+ this.pipe = (fn) => new LiveStoreJSQuery({
23
+ fn: (get) => {
24
+ const results = get(this.results$);
25
+ return fn(results, get);
26
+ },
27
+ label: `${this.label}:js`,
28
+ onDestroy: () => this.destroy(),
29
+ });
30
+ /** Returns a reactive query */
31
+ this.getFirstRow = (args) => new LiveStoreJSQuery({
32
+ fn: (get) => {
33
+ const results = get(this.results$);
34
+ if (results.length === 0 && args?.defaultValue === undefined) {
35
+ // const queryLabel = this._tag === 'sql' ? this.queryString$!.computeResult(otelContext) : this.label
36
+ const queryLabel = this.label;
37
+ throw new Error(`Expected query ${queryLabel} to return at least one result`);
38
+ }
39
+ return results[0] ?? args.defaultValue;
40
+ },
41
+ label: `${this.label}:first`,
42
+ onDestroy: () => this.destroy(),
43
+ });
44
+ this.destroy = () => {
45
+ dbGraph.destroy(this.queryString$);
46
+ dbGraph.destroy(this.results$);
47
+ };
48
+ // TODO don't even create a thunk if query string is static
49
+ const queryString$ = dbGraph.makeThunk((get, addDebugInfo, { rootOtelContext }, otelContext) => {
50
+ if (typeof genQueryString === 'function') {
51
+ const queryString = genQueryString(makeGetAtomResult(get, otelContext ?? rootOtelContext));
52
+ addDebugInfo({ _tag: 'js', label: `${label}:queryString`, query: queryString });
53
+ return queryString;
54
+ }
55
+ else {
56
+ return genQueryString;
57
+ }
58
+ }, { label: `${label}:queryString`, meta: { liveStoreThunkType: 'sqlQueryString' } });
59
+ this.queryString$ = queryString$;
60
+ // TODO come up with different way to handle labels
61
+ // label = label ?? `sql(${queryString$.computeResult()})`
62
+ this.label = label ?? `sql(${genQueryString.toString()})`;
63
+ // span.updateName(`querySQL:${label}`)
64
+ const queryLabel = `${label}:results`;
65
+ // const queryLabel = `${label}:results` + (this.temporaryQueries ? ':temp' : '')
66
+ const results$ = dbGraph.makeThunk((get, addDebugInfo, { store, otelTracer, rootOtelContext }, otelContext) => otelTracer.startActiveSpan('sql:', // NOTE span name will be overridden further down
67
+ {}, otelContext ?? rootOtelContext, (span) => {
68
+ try {
69
+ const otelContext = otel.trace.setSpan(otel.context.active(), span);
70
+ // Establish a reactive dependency on the tables used in the query
71
+ for (const tableName of queriedTables) {
72
+ const tableRef = store.tableRefs[tableName] ?? shouldNeverHappen(`No table ref found for ${tableName}`);
73
+ get(tableRef, otelContext);
74
+ }
75
+ const sqlString = get(queryString$, otelContext);
76
+ span.setAttribute('sql.query', sqlString);
77
+ span.updateName(`sql:${sqlString.slice(0, 50)}`);
78
+ const results = store.inMemoryDB.select(sqlString, {
79
+ queriedTables,
80
+ bindValues: bindValues ? prepareBindValues(bindValues, sqlString) : undefined,
81
+ otelContext,
82
+ });
83
+ span.setAttribute('sql.rowsCount', results.length);
84
+ addDebugInfo({ _tag: 'sql', label: label ?? '', query: sqlString });
85
+ return results;
86
+ }
87
+ finally {
88
+ span.end();
89
+ }
90
+ }), { label: queryLabel });
91
+ // this.queryString$ = queryString$
92
+ // this.results$ = results$
93
+ // this.payload = payload
94
+ this.results$ = results$;
95
+ }
96
+ }
97
+ //# sourceMappingURL=sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/reactiveQueries/sql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import type { PrettifyFlat } from '@livestore/utils';
2
+ import type { Schema } from '@livestore/utils/effect';
3
+ import type { SqliteAst } from 'effect-db-schema';
4
+ import { SqliteDsl } from 'effect-db-schema';
5
+ export type Index = {
6
+ name: string;
7
+ columns: string[];
8
+ /** @default false */
9
+ isUnique?: boolean;
10
+ };
11
+ export declare const componentStateTables: {
12
+ [key: string]: SqliteAst.Table;
13
+ };
14
+ export type InputSchema = {
15
+ tables: {
16
+ [tableName: string]: SqliteDsl.TableDefinition<any, any>;
17
+ };
18
+ materializedViews?: MaterializedViewDefinitions;
19
+ actions: ActionDefinitions<any>;
20
+ };
21
+ export declare const makeSchema: <TSchema extends InputSchema>(schema: TSchema) => Schema;
22
+ export type ComponentStateSchema = SqliteDsl.TableDefinition<any, any> & {
23
+ register: () => void;
24
+ };
25
+ export declare const defineComponentStateSchema: <TName extends string, TColumns extends SqliteDsl.Columns>(name: TName, columns: TColumns) => SqliteDsl.TableDefinition<`components__${TName}`, PrettifyFlat<TColumns & {
26
+ id: SqliteDsl.ColumnDefinition<SqliteDsl.FieldType.FieldTypeText<string, string>, false>;
27
+ }>>;
28
+ export type SQLWriteStatement = {
29
+ sql: string;
30
+ /** Tables written by the statement */
31
+ writeTables: string[];
32
+ argsAlreadyBound?: boolean;
33
+ };
34
+ export type ActionDefinition<TArgs = any> = {
35
+ statement: SQLWriteStatement | ((args: TArgs) => SQLWriteStatement);
36
+ prepareBindValues?: (args: TArgs) => any;
37
+ };
38
+ export type Schema = {
39
+ tables: TableDefinitions;
40
+ materializedViews: MaterializedViewDefinitions;
41
+ actions: ActionDefinitions<any>;
42
+ };
43
+ export type TableDefinitions = {
44
+ [key: string]: SqliteAst.Table;
45
+ };
46
+ export type MaterializedViewDefinitions = {
47
+ [key: string]: {};
48
+ };
49
+ export type ActionDefinitions<TArgsMap extends Record<string, any>> = {
50
+ [key in keyof TArgsMap]: ActionDefinition<TArgsMap[key]>;
51
+ };
52
+ export declare const SCHEMA_META_TABLE = "__livestore_schema";
53
+ declare const schemaMetaTable: SqliteDsl.TableDefinition<"__livestore_schema", {
54
+ tableName: SqliteDsl.ColumnDefinition<SqliteDsl.FieldType.FieldTypeText<string, string>, false>;
55
+ schemaHash: SqliteDsl.ColumnDefinition<SqliteDsl.FieldType.FieldTypeInteger, false>;
56
+ /** ISO date format */
57
+ updatedAt: SqliteDsl.ColumnDefinition<SqliteDsl.FieldType.FieldTypeText<string, string>, false>;
58
+ }>;
59
+ export type SchemaMetaRow = SqliteDsl.FromTable.RowDecoded<typeof schemaMetaTable>;
60
+ export declare const systemTables: {
61
+ __livestore_schema: SqliteAst.Table;
62
+ };
63
+ export declare const defineTables: <T extends TableDefinitions>(tables: T) => T;
64
+ export declare const defineMaterializedViews: <M extends MaterializedViewDefinitions>(materializedViews: M) => M;
65
+ export declare const defineActions: <A extends ActionDefinitions<any>>(actions: A) => A;
66
+ export declare const defineAction: <TArgs extends Record<string, any>>(action: ActionDefinition<TArgs>) => ActionDefinition<TArgs>;
67
+ export type GetApplyEventArgs<TActionDefinitionsMap> = RecordValues<{
68
+ [eventType in keyof TActionDefinitionsMap]: {
69
+ eventType: eventType;
70
+ args: GetActionArgs<TActionDefinitionsMap[eventType]>;
71
+ };
72
+ }>;
73
+ type RecordValues<T> = T extends Record<string, infer V> ? V : never;
74
+ export type GetActionArgs<A> = A extends ActionDefinition<infer TArgs> ? TArgs : never;
75
+ declare global {
76
+ interface LiveStoreActionDefinitionsTypes {
77
+ [key: string]: ActionDefinition;
78
+ }
79
+ }
80
+ export {};
81
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
package/dist/schema.js ADDED
@@ -0,0 +1,46 @@
1
+ import { mapObjectValues } from '@livestore/utils';
2
+ import { SqliteDsl } from 'effect-db-schema';
3
+ import { DbSchema } from './index.js';
4
+ // A global variable representing component state tables we should create in the database
5
+ export const componentStateTables = {};
6
+ export const makeSchema = (schema) => ({
7
+ tables: { ...mapObjectValues(schema.tables, (_tableName, table) => table.ast), ...systemTables },
8
+ materializedViews: schema.materializedViews ?? {},
9
+ actions: schema.actions,
10
+ });
11
+ // TODO get rid of "side effect" in this function (via explicit register fn)
12
+ export const defineComponentStateSchema = (
13
+ // TODO get rid of the `name` param here and use the `componentKey` name instead
14
+ name, columns) => {
15
+ const tablePath = `components__${name}`;
16
+ if (Object.keys(componentStateTables).includes(tablePath)) {
17
+ // throw new Error(`Can't register duplicate component: ${name}`)
18
+ console.error(`Can't register duplicate component: ${tablePath}`);
19
+ }
20
+ const schemaWithId = columns;
21
+ schemaWithId.id = DbSchema.text({ primaryKey: true });
22
+ const tableDef = SqliteDsl.table(tablePath, schemaWithId, []);
23
+ // TODO move into register fn
24
+ componentStateTables[tablePath] = tableDef.ast;
25
+ return tableDef;
26
+ };
27
+ export const SCHEMA_META_TABLE = '__livestore_schema';
28
+ const schemaMetaTable = SqliteDsl.table(SCHEMA_META_TABLE, {
29
+ tableName: SqliteDsl.text({ primaryKey: true }),
30
+ schemaHash: SqliteDsl.integer({ nullable: false }),
31
+ /** ISO date format */
32
+ updatedAt: SqliteDsl.text({ nullable: false }),
33
+ });
34
+ export const systemTables = {
35
+ // [EVENTS_TABLE_NAME]: SqliteDsl.table(EVENTS_TABLE_NAME, {
36
+ // id: SqliteDsl.text({ primaryKey: true }),
37
+ // type: SqliteDsl.text({ nullable: false }),
38
+ // args: SqliteDsl.text({ nullable: false }),
39
+ // }).ast,
40
+ [SCHEMA_META_TABLE]: schemaMetaTable.ast,
41
+ };
42
+ export const defineTables = (tables) => tables;
43
+ export const defineMaterializedViews = (materializedViews) => materializedViews;
44
+ export const defineActions = (actions) => actions;
45
+ export const defineAction = (action) => action;
46
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAGlD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAE5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AASrC,yFAAyF;AACzF,MAAM,CAAC,MAAM,oBAAoB,GAAuC,EAAE,CAAA;AAU1E,MAAM,CAAC,MAAM,UAAU,GAAG,CAA8B,MAAe,EAAU,EAAE,CACjF,CAAC;IACC,MAAM,EAAE,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,YAAY,EAAE;IAChG,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,EAAE;IACjD,OAAO,EAAE,MAAM,CAAC,OAAO;CACxB,CAAkB,CAAA;AAOrB,4EAA4E;AAC5E,MAAM,CAAC,MAAM,0BAA0B,GAAG;AACxC,gFAAgF;AAChF,IAAW,EACX,OAAiB,EAIjB,EAAE;IACF,MAAM,SAAS,GAAG,eAAe,IAAI,EAAW,CAAA;IAChD,IAAI,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;QACzD,iEAAiE;QACjE,OAAO,CAAC,KAAK,CAAC,uCAAuC,SAAS,EAAE,CAAC,CAAA;KAClE;IAED,MAAM,YAAY,GAAG,OAIpB,CAAA;IAED,YAAY,CAAC,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;IAErD,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,YAAY,EAAE,EAAE,CAAC,CAAA;IAE7D,6BAA6B;IAC7B,oBAAoB,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAA;IAE9C,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AA4BD,MAAM,CAAC,MAAM,iBAAiB,GAAG,oBAAoB,CAAA;AAErD,MAAM,eAAe,GAAG,SAAS,CAAC,KAAK,CAAC,iBAAiB,EAAE;IACzD,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC/C,UAAU,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAClD,sBAAsB;IACtB,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;CAC/C,CAAC,CAAA;AAIF,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,4DAA4D;IAC5D,8CAA8C;IAC9C,+CAA+C;IAC/C,+CAA+C;IAC/C,UAAU;IACV,CAAC,iBAAiB,CAAC,EAAE,eAAe,CAAC,GAAG;CACd,CAAA;AAE5B,MAAM,CAAC,MAAM,YAAY,GAAG,CAA6B,MAAS,EAAE,EAAE,CAAC,MAAM,CAAA;AAE7E,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAwC,iBAAoB,EAAE,EAAE,CACrG,iBAAiB,CAAA;AAEnB,MAAM,CAAC,MAAM,aAAa,GAAG,CAAmC,OAAU,EAAE,EAAE,CAAC,OAAO,CAAA;AACtF,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,MAA+B,EACN,EAAE,CAAC,MAAM,CAAA"}
@@ -0,0 +1,15 @@
1
+ import type * as otel from '@opentelemetry/api';
2
+ import type { PreparedBindValues } from '../../util.js';
3
+ import type { Storage, StorageOtelProps } from '../index.js';
4
+ export type StorageOptionsWebInMemory = {
5
+ type: 'web-in-memory';
6
+ };
7
+ /** NOTE: This storage is currently only used for testing */
8
+ export declare class InMemoryStorage implements Storage {
9
+ readonly otelTracer: otel.Tracer;
10
+ constructor(otelTracer: otel.Tracer);
11
+ static load: (_options?: StorageOptionsWebInMemory) => Promise<({ otelTracer }: StorageOtelProps) => InMemoryStorage>;
12
+ execute: (_query: string, _bindValues?: PreparedBindValues) => void;
13
+ getPersistedData: () => Promise<Uint8Array>;
14
+ }
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storage/in-memory/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE5D,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,eAAe,CAAA;CACtB,CAAA;AAED,4DAA4D;AAC5D,qBAAa,eAAgB,YAAW,OAAO;IACjC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM;gBAAvB,UAAU,EAAE,IAAI,CAAC,MAAM;IAE5C,MAAM,CAAC,IAAI,cAAqB,yBAAyB,8BAC/B,gBAAgB,sBACzC;IAED,OAAO,WAAY,MAAM,gBAAgB,kBAAkB,KAAG,IAAI,CAAM;IAExE,gBAAgB,QAAa,QAAQ,UAAU,CAAC,CAAoB;CACrE"}
@@ -0,0 +1,14 @@
1
+ var _a;
2
+ /** NOTE: This storage is currently only used for testing */
3
+ export class InMemoryStorage {
4
+ constructor(otelTracer) {
5
+ this.otelTracer = otelTracer;
6
+ this.execute = (_query, _bindValues) => { };
7
+ this.getPersistedData = async () => new Uint8Array();
8
+ }
9
+ }
10
+ _a = InMemoryStorage;
11
+ InMemoryStorage.load = async (_options) => {
12
+ return ({ otelTracer }) => new _a(otelTracer);
13
+ };
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/storage/in-memory/index.ts"],"names":[],"mappings":";AASA,4DAA4D;AAC5D,MAAM,OAAO,eAAe;IAC1B,YAAqB,UAAuB;QAAvB,eAAU,GAAV,UAAU,CAAa;QAM5C,YAAO,GAAG,CAAC,MAAc,EAAE,WAAgC,EAAQ,EAAE,GAAE,CAAC,CAAA;QAExE,qBAAgB,GAAG,KAAK,IAAyB,EAAE,CAAC,IAAI,UAAU,EAAE,CAAA;IARrB,CAAC;;;AAEzC,oBAAI,GAAG,KAAK,EAAE,QAAoC,EAAE,EAAE;IAC3D,OAAO,CAAC,EAAE,UAAU,EAAoB,EAAE,EAAE,CAAC,IAAI,EAAe,CAAC,UAAU,CAAC,CAAA;AAC9E,CAAC,AAFU,CAEV"}
@@ -0,0 +1,14 @@
1
+ import type * as otel from '@opentelemetry/api';
2
+ import type { PreparedBindValues } from '../util.js';
3
+ export type StorageInit = (otelProps: StorageOtelProps) => Promise<Storage> | Storage;
4
+ export interface Storage {
5
+ execute(query: string, bindValues?: PreparedBindValues, parentSpan?: otel.Span): void;
6
+ /** Return a snapshot of persisted data from the storage */
7
+ getPersistedData(parentSpan?: otel.Span): Promise<Uint8Array>;
8
+ }
9
+ export type StorageType = 'tauri' | 'web' | 'web-in-memory';
10
+ export type StorageOtelProps = {
11
+ otelTracer: otel.Tracer;
12
+ parentSpan: otel.Span;
13
+ };
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAEpD,MAAM,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,gBAAgB,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAA;AAErF,MAAM,WAAW,OAAO;IACtB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,kBAAkB,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAErF,2DAA2D;IAC3D,gBAAgB,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;CAC9D;AAED,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,KAAK,GAAG,eAAe,CAAA;AAE3D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,UAAU,EAAE,IAAI,CAAC,MAAM,CAAA;IACvB,UAAU,EAAE,IAAI,CAAC,IAAI,CAAA;CACtB,CAAA"}
@@ -0,0 +1,9 @@
1
+ // A storage represents a raw SQLite database.
2
+ // Examples include:
3
+ // - A native SQLite process running in a Tauri Rust process
4
+ // - A SQL.js WASM version of SQLite running in a web worker
5
+ //
6
+ // We can send commands to execute various kinds of queries,
7
+ // and respond to various events from the database.
8
+ export {};
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,oBAAoB;AACpB,4DAA4D;AAC5D,4DAA4D;AAC5D,EAAE;AACF,4DAA4D;AAC5D,mDAAmD"}
@@ -0,0 +1,19 @@
1
+ import type * as otel from '@opentelemetry/api';
2
+ import type { PreparedBindValues } from '../../util.js';
3
+ import type { Storage, StorageOtelProps } from '../index.js';
4
+ export type StorageOptionsTauri = {
5
+ dbDirPath: string;
6
+ appDbFileName: string;
7
+ };
8
+ export declare class TauriStorage implements Storage {
9
+ readonly dbFilePath: string;
10
+ readonly dbDirPath: string;
11
+ readonly otelTracer: otel.Tracer;
12
+ readonly parentSpan: otel.Span;
13
+ constructor(dbFilePath: string, dbDirPath: string, otelTracer: otel.Tracer, parentSpan: otel.Span);
14
+ static load: ({ dbDirPath, appDbFileName }: StorageOptionsTauri) => ({ otelTracer, parentSpan }: StorageOtelProps) => Promise<TauriStorage>;
15
+ execute: (query: string, bindValues?: PreparedBindValues, parentSpan?: otel.Span) => void;
16
+ getPersistedData: (parentSpan?: otel.Span) => Promise<Uint8Array>;
17
+ private getOtelData;
18
+ }
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storage/tauri/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAG/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAEvD,OAAO,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE5D,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,qBAAa,YAAa,YAAW,OAAO;IAExC,QAAQ,CAAC,UAAU,EAAE,MAAM;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM;IAChC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI;gBAHrB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,IAAI,CAAC,MAAM,EACvB,UAAU,EAAE,IAAI,CAAC,IAAI;IAGhC,MAAM,CAAC,IAAI,iCACsB,mBAAmB,kCACf,gBAAgB,2BAKlD;IAEH,OAAO,UAAW,MAAM,eAAe,kBAAkB,eAAe,KAAK,IAAI,KAAG,IAAI,CAQvF;IAED,gBAAgB,gBAAuB,KAAK,IAAI,KAAG,QAAQ,UAAU,CAAC,CAOrE;IAED,OAAO,CAAC,WAAW,CAA2E;CAC/F"}
@@ -0,0 +1,38 @@
1
+ var _a;
2
+ import { getTraceParentHeader } from '@livestore/utils';
3
+ import { invoke } from '@tauri-apps/api';
4
+ import { prepareBindValues } from '../../util.js';
5
+ export class TauriStorage {
6
+ constructor(dbFilePath, dbDirPath, otelTracer, parentSpan) {
7
+ this.dbFilePath = dbFilePath;
8
+ this.dbDirPath = dbDirPath;
9
+ this.otelTracer = otelTracer;
10
+ this.parentSpan = parentSpan;
11
+ this.execute = (query, bindValues, parentSpan) => {
12
+ // console.log({ query, bindValues, prepared: prepareBindValues(bindValues ?? {}, query) })
13
+ void invoke('execute', {
14
+ dbName: this.dbFilePath,
15
+ query,
16
+ values: prepareBindValues(bindValues ?? {}, query),
17
+ otelData: this.getOtelData(parentSpan),
18
+ });
19
+ };
20
+ this.getPersistedData = async (parentSpan) => {
21
+ const headers = new Headers();
22
+ headers.set('traceparent', getTraceParentHeader(parentSpan ?? this.parentSpan));
23
+ return fetch(`http://localhost:38787/get-persisted-data?file_path=${this.dbFilePath}`, { headers }).then((response) => response.arrayBuffer().then((buffer) => new Uint8Array(buffer)));
24
+ };
25
+ this.getOtelData = (parentSpan) => getOtelData_(parentSpan ?? this.parentSpan);
26
+ }
27
+ }
28
+ _a = TauriStorage;
29
+ TauriStorage.load = ({ dbDirPath, appDbFileName }) => async ({ otelTracer, parentSpan }) => {
30
+ const dbFilePath = `${dbDirPath}/${appDbFileName}`;
31
+ await invoke('initialize_connection', { dbName: dbFilePath, otelData: getOtelData_(parentSpan) });
32
+ return new _a(dbFilePath, dbDirPath, otelTracer, parentSpan);
33
+ };
34
+ const getOtelData_ = (parentSpan) => {
35
+ const spanContext = parentSpan?.spanContext();
36
+ return spanContext ? { trace_id: spanContext.traceId, span_id: spanContext.spanId } : undefined;
37
+ };
38
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/storage/tauri/index.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAEvD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAGxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAQjD,MAAM,OAAO,YAAY;IACvB,YACW,UAAkB,EAClB,SAAiB,EACjB,UAAuB,EACvB,UAAqB;QAHrB,eAAU,GAAV,UAAU,CAAQ;QAClB,cAAS,GAAT,SAAS,CAAQ;QACjB,eAAU,GAAV,UAAU,CAAa;QACvB,eAAU,GAAV,UAAU,CAAW;QAYhC,YAAO,GAAG,CAAC,KAAa,EAAE,UAA+B,EAAE,UAAsB,EAAQ,EAAE;YACzF,2FAA2F;YAC3F,KAAK,MAAM,CAAC,SAAS,EAAE;gBACrB,MAAM,EAAE,IAAI,CAAC,UAAU;gBACvB,KAAK;gBACL,MAAM,EAAE,iBAAiB,CAAC,UAAU,IAAI,EAAE,EAAE,KAAK,CAAC;gBAClD,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;aACvC,CAAC,CAAA;QACJ,CAAC,CAAA;QAED,qBAAgB,GAAG,KAAK,EAAE,UAAsB,EAAuB,EAAE;YACvE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;YAC7B,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,oBAAoB,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;YAE/E,OAAO,KAAK,CAAC,uDAAuD,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CACtG,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAC9E,CAAA;QACH,CAAC,CAAA;QAEO,gBAAW,GAAG,CAAC,UAAsB,EAAE,EAAE,CAAC,YAAY,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAE,CAAA;IA9B3F,CAAC;;;AAEG,iBAAI,GACT,CAAC,EAAE,SAAS,EAAE,aAAa,EAAuB,EAAE,EAAE,CACtD,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAoB,EAAE,EAAE;IACrD,MAAM,UAAU,GAAG,GAAG,SAAS,IAAI,aAAa,EAAE,CAAA;IAClD,MAAM,MAAM,CAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;IAEjG,OAAO,IAAI,EAAY,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;AACxE,CAAC,AAPQ,CAOR;AAwBL,MAAM,YAAY,GAAG,CAAC,UAAiC,EAAE,EAAE;IACzD,MAAM,WAAW,GAAG,UAAU,EAAE,WAAW,EAAE,CAAA;IAC7C,OAAO,WAAW,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;AACjG,CAAC,CAAA"}
@@ -0,0 +1,10 @@
1
+ export declare class IDB {
2
+ private dbName;
3
+ private storeName;
4
+ private db;
5
+ constructor(dbName: string, storeName?: string);
6
+ private open;
7
+ get(key: string): Promise<Uint8Array | undefined>;
8
+ put(key: string, value: Uint8Array): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=idb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idb.d.ts","sourceRoot":"","sources":["../../../src/storage/utils/idb.ts"],"names":[],"mappings":"AAGA,qBAAa,GAAG;IAIZ,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,SAAS;IAJnB,OAAO,CAAC,EAAE,CAA2B;gBAG3B,MAAM,EAAE,MAAM,EACd,SAAS,GAAE,MAAuB;YAG9B,IAAI;IAwBL,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAkBjD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAiBhE"}