@livestore/livestore 0.0.12 → 0.0.15

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 (173) hide show
  1. package/README.md +7 -7
  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 +25 -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/useLiveStoreComponent.test.d.ts +2 -0
  12. package/dist/__tests__/react/useLiveStoreComponent.test.d.ts.map +1 -0
  13. package/dist/__tests__/react/useLiveStoreComponent.test.js +78 -0
  14. package/dist/__tests__/react/useLiveStoreComponent.test.js.map +1 -0
  15. package/dist/__tests__/reactive.test.d.ts +2 -0
  16. package/dist/__tests__/reactive.test.d.ts.map +1 -0
  17. package/dist/__tests__/reactive.test.js +197 -0
  18. package/dist/__tests__/reactive.test.js.map +1 -0
  19. package/dist/bounded-collections.d.ts +34 -0
  20. package/dist/bounded-collections.d.ts.map +1 -0
  21. package/dist/bounded-collections.js +103 -0
  22. package/dist/bounded-collections.js.map +1 -0
  23. package/dist/componentKey.d.ts +20 -0
  24. package/dist/componentKey.d.ts.map +1 -0
  25. package/dist/componentKey.js +3 -0
  26. package/dist/componentKey.js.map +1 -0
  27. package/dist/effect/LiveStore.d.ts +36 -0
  28. package/dist/effect/LiveStore.d.ts.map +1 -0
  29. package/dist/effect/LiveStore.js +41 -0
  30. package/dist/effect/LiveStore.js.map +1 -0
  31. package/dist/effect/index.d.ts +2 -0
  32. package/dist/effect/index.d.ts.map +1 -0
  33. package/dist/effect/index.js +2 -0
  34. package/dist/effect/index.js.map +1 -0
  35. package/dist/events.d.ts +7 -0
  36. package/dist/events.d.ts.map +1 -0
  37. package/dist/events.js +2 -0
  38. package/dist/events.js.map +1 -0
  39. package/dist/inMemoryDatabase.d.ts +56 -0
  40. package/dist/inMemoryDatabase.d.ts.map +1 -0
  41. package/dist/inMemoryDatabase.js +223 -0
  42. package/dist/inMemoryDatabase.js.map +1 -0
  43. package/dist/index.d.ts +20 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +9 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/migrations.d.ts +16 -0
  48. package/dist/migrations.d.ts.map +1 -0
  49. package/dist/migrations.js +67 -0
  50. package/dist/migrations.js.map +1 -0
  51. package/dist/otel.d.ts +4 -0
  52. package/dist/otel.d.ts.map +1 -0
  53. package/dist/otel.js +6 -0
  54. package/dist/otel.js.map +1 -0
  55. package/dist/react/LiveStoreContext.d.ts +11 -0
  56. package/dist/react/LiveStoreContext.d.ts.map +1 -0
  57. package/dist/react/LiveStoreContext.js +10 -0
  58. package/dist/react/LiveStoreContext.js.map +1 -0
  59. package/dist/react/LiveStoreProvider.d.ts +20 -0
  60. package/dist/react/LiveStoreProvider.d.ts.map +1 -0
  61. package/dist/react/LiveStoreProvider.js +52 -0
  62. package/dist/react/LiveStoreProvider.js.map +1 -0
  63. package/dist/react/index.d.ts +8 -0
  64. package/dist/react/index.d.ts.map +1 -0
  65. package/dist/react/index.js +6 -0
  66. package/dist/react/index.js.map +1 -0
  67. package/dist/react/useGraphQL.d.ts +13 -0
  68. package/dist/react/useGraphQL.d.ts.map +1 -0
  69. package/dist/react/useGraphQL.js +85 -0
  70. package/dist/react/useGraphQL.js.map +1 -0
  71. package/dist/react/useLiveStoreComponent.d.ts +75 -0
  72. package/dist/react/useLiveStoreComponent.d.ts.map +1 -0
  73. package/dist/react/useLiveStoreComponent.js +317 -0
  74. package/dist/react/useLiveStoreComponent.js.map +1 -0
  75. package/dist/react/useQuery.d.ts +3 -0
  76. package/dist/react/useQuery.d.ts.map +1 -0
  77. package/dist/react/useQuery.js +38 -0
  78. package/dist/react/useQuery.js.map +1 -0
  79. package/dist/react/utils/useStateRefWithReactiveInput.d.ts +13 -0
  80. package/dist/react/utils/useStateRefWithReactiveInput.d.ts.map +1 -0
  81. package/dist/react/utils/useStateRefWithReactiveInput.js +38 -0
  82. package/dist/react/utils/useStateRefWithReactiveInput.js.map +1 -0
  83. package/dist/reactive.d.ts +140 -0
  84. package/dist/reactive.d.ts.map +1 -0
  85. package/dist/reactive.js +302 -0
  86. package/dist/reactive.js.map +1 -0
  87. package/dist/reactiveQueries/base-class.d.ts +27 -0
  88. package/dist/reactiveQueries/base-class.d.ts.map +1 -0
  89. package/dist/reactiveQueries/base-class.js +23 -0
  90. package/dist/reactiveQueries/base-class.js.map +1 -0
  91. package/dist/reactiveQueries/graphql.d.ts +25 -0
  92. package/dist/reactiveQueries/graphql.d.ts.map +1 -0
  93. package/dist/reactiveQueries/graphql.js +18 -0
  94. package/dist/reactiveQueries/graphql.js.map +1 -0
  95. package/dist/reactiveQueries/js.d.ts +19 -0
  96. package/dist/reactiveQueries/js.d.ts.map +1 -0
  97. package/dist/reactiveQueries/js.js +13 -0
  98. package/dist/reactiveQueries/js.js.map +1 -0
  99. package/dist/reactiveQueries/sql.d.ts +31 -0
  100. package/dist/reactiveQueries/sql.d.ts.map +1 -0
  101. package/dist/reactiveQueries/sql.js +32 -0
  102. package/dist/reactiveQueries/sql.js.map +1 -0
  103. package/dist/schema.d.ts +81 -0
  104. package/dist/schema.d.ts.map +1 -0
  105. package/dist/schema.js +46 -0
  106. package/dist/schema.js.map +1 -0
  107. package/dist/storage/in-memory/index.d.ts +15 -0
  108. package/dist/storage/in-memory/index.d.ts.map +1 -0
  109. package/dist/storage/in-memory/index.js +14 -0
  110. package/dist/storage/in-memory/index.js.map +1 -0
  111. package/dist/storage/index.d.ts +14 -0
  112. package/dist/storage/index.d.ts.map +1 -0
  113. package/dist/storage/index.js +9 -0
  114. package/dist/storage/index.js.map +1 -0
  115. package/dist/storage/tauri/index.d.ts +19 -0
  116. package/dist/storage/tauri/index.d.ts.map +1 -0
  117. package/dist/storage/tauri/index.js +38 -0
  118. package/dist/storage/tauri/index.js.map +1 -0
  119. package/dist/storage/utils/idb.d.ts +10 -0
  120. package/dist/storage/utils/idb.d.ts.map +1 -0
  121. package/dist/storage/utils/idb.js +58 -0
  122. package/dist/storage/utils/idb.js.map +1 -0
  123. package/dist/storage/web-worker/index.d.ts +27 -0
  124. package/dist/storage/web-worker/index.d.ts.map +1 -0
  125. package/dist/storage/web-worker/index.js +74 -0
  126. package/dist/storage/web-worker/index.js.map +1 -0
  127. package/dist/storage/web-worker/worker.d.ts +13 -0
  128. package/dist/storage/web-worker/worker.d.ts.map +1 -0
  129. package/dist/storage/web-worker/worker.js +110 -0
  130. package/dist/storage/web-worker/worker.js.map +1 -0
  131. package/dist/store.d.ts +199 -0
  132. package/dist/store.d.ts.map +1 -0
  133. package/dist/store.js +603 -0
  134. package/dist/store.js.map +1 -0
  135. package/dist/util.d.ts +28 -0
  136. package/dist/util.d.ts.map +1 -0
  137. package/dist/util.js +55 -0
  138. package/dist/util.js.map +1 -0
  139. package/package.json +46 -19
  140. package/src/__tests__/react/fixture.tsx +23 -32
  141. package/src/__tests__/reactive.test.ts +3 -4
  142. package/src/effect/LiveStore.ts +22 -31
  143. package/src/events.ts +1 -1
  144. package/src/inMemoryDatabase.ts +115 -140
  145. package/src/index.ts +20 -20
  146. package/src/migrations.ts +119 -0
  147. package/src/otel.ts +0 -11
  148. package/src/react/LiveStoreProvider.tsx +24 -23
  149. package/src/react/index.ts +10 -1
  150. package/src/react/useGraphQL.ts +28 -2
  151. package/src/react/useLiveStoreComponent.ts +134 -50
  152. package/src/react/useQuery.ts +56 -0
  153. package/src/reactive.ts +6 -4
  154. package/src/reactiveQueries/base-class.ts +9 -3
  155. package/src/reactiveQueries/graphql.ts +4 -4
  156. package/src/reactiveQueries/js.ts +2 -2
  157. package/src/reactiveQueries/sql.ts +6 -6
  158. package/src/schema.ts +69 -145
  159. package/src/storage/in-memory/index.ts +21 -0
  160. package/src/storage/index.ts +27 -0
  161. package/src/{backends/tauri.ts → storage/tauri/index.ts} +14 -28
  162. package/src/storage/web-worker/index.ts +116 -0
  163. package/src/{backends/web-worker.ts → storage/web-worker/worker.ts} +17 -52
  164. package/src/store.ts +171 -98
  165. package/src/util.ts +13 -3
  166. package/tsconfig.json +1 -3
  167. package/src/backends/base.ts +0 -67
  168. package/src/backends/index.ts +0 -98
  169. package/src/backends/noop.ts +0 -32
  170. package/src/backends/web-in-memory.ts +0 -65
  171. package/src/backends/web.ts +0 -97
  172. package/src/react/useGlobalQuery.ts +0 -40
  173. /package/src/{backends → storage}/utils/idb.ts +0 -0
@@ -0,0 +1,103 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _BoundMap_map, _BoundMap_sizeLimit, _BoundSet_map, _BoundSet_onEvict, _a, _BoundArray_array, _BoundArray_sizeLimit, _b;
13
+ /**
14
+ * Creates a map that has a fixed number of entries.
15
+ * Once hitting the bound, earliest insertions are removed
16
+ */
17
+ class BoundMap {
18
+ constructor(sizeLimit) {
19
+ _BoundMap_map.set(this, new Map());
20
+ _BoundMap_sizeLimit.set(this, void 0);
21
+ this.set = (key, value) => {
22
+ __classPrivateFieldGet(this, _BoundMap_map, "f").set(key, value);
23
+ // console.log(this.#map.size, this.#sizeLimit);
24
+ if (__classPrivateFieldGet(this, _BoundMap_map, "f").size > __classPrivateFieldGet(this, _BoundMap_sizeLimit, "f")) {
25
+ const firstKey = __classPrivateFieldGet(this, _BoundMap_map, "f").keys().next().value;
26
+ __classPrivateFieldGet(this, _BoundMap_map, "f").delete(firstKey);
27
+ if (this.onEvict) {
28
+ this.onEvict(firstKey);
29
+ }
30
+ }
31
+ };
32
+ this.get = (key) => {
33
+ return __classPrivateFieldGet(this, _BoundMap_map, "f").get(key);
34
+ };
35
+ this.delete = (key) => {
36
+ __classPrivateFieldGet(this, _BoundMap_map, "f").delete(key);
37
+ };
38
+ this.keys = () => {
39
+ return __classPrivateFieldGet(this, _BoundMap_map, "f").keys();
40
+ };
41
+ __classPrivateFieldSet(this, _BoundMap_sizeLimit, sizeLimit, "f");
42
+ }
43
+ }
44
+ _BoundMap_map = new WeakMap(), _BoundMap_sizeLimit = new WeakMap();
45
+ export default BoundMap;
46
+ export class BoundSet {
47
+ constructor(sizeLimit) {
48
+ _BoundSet_map.set(this, void 0);
49
+ _BoundSet_onEvict.set(this, (v) => {
50
+ if (this.onEvict) {
51
+ this.onEvict(v);
52
+ }
53
+ });
54
+ this.add = (v) => {
55
+ __classPrivateFieldGet(this, _BoundSet_map, "f").set(v, v);
56
+ };
57
+ this[_a] = () => {
58
+ return __classPrivateFieldGet(this, _BoundSet_map, "f").keys();
59
+ };
60
+ __classPrivateFieldSet(this, _BoundSet_map, new BoundMap(sizeLimit), "f");
61
+ __classPrivateFieldGet(this, _BoundSet_map, "f").onEvict = __classPrivateFieldGet(this, _BoundSet_onEvict, "f");
62
+ }
63
+ }
64
+ _BoundSet_map = new WeakMap(), _BoundSet_onEvict = new WeakMap(), _a = Symbol.iterator;
65
+ export class BoundArray {
66
+ constructor(sizeLimit) {
67
+ _BoundArray_array.set(this, []);
68
+ _BoundArray_sizeLimit.set(this, void 0);
69
+ this.push = (v) => {
70
+ __classPrivateFieldGet(this, _BoundArray_array, "f").push(v);
71
+ if (__classPrivateFieldGet(this, _BoundArray_array, "f").length > __classPrivateFieldGet(this, _BoundArray_sizeLimit, "f")) {
72
+ const first = __classPrivateFieldGet(this, _BoundArray_array, "f").shift();
73
+ if (first && this.onEvict) {
74
+ this.onEvict(first);
75
+ }
76
+ }
77
+ };
78
+ this.get = (index) => {
79
+ return __classPrivateFieldGet(this, _BoundArray_array, "f")[index];
80
+ };
81
+ this.delete = (index) => {
82
+ __classPrivateFieldGet(this, _BoundArray_array, "f").splice(index, 1);
83
+ };
84
+ this[_b] = () => {
85
+ return __classPrivateFieldGet(this, _BoundArray_array, "f")[Symbol.iterator]();
86
+ };
87
+ this.map = (fn) => {
88
+ return __classPrivateFieldGet(this, _BoundArray_array, "f").map(fn);
89
+ };
90
+ this.clear = () => {
91
+ __classPrivateFieldSet(this, _BoundArray_array, [], "f");
92
+ };
93
+ this.sort = (fn) => {
94
+ return __classPrivateFieldGet(this, _BoundArray_array, "f").sort(fn);
95
+ };
96
+ __classPrivateFieldSet(this, _BoundArray_sizeLimit, sizeLimit, "f");
97
+ }
98
+ get length() {
99
+ return __classPrivateFieldGet(this, _BoundArray_array, "f").length;
100
+ }
101
+ }
102
+ _BoundArray_array = new WeakMap(), _BoundArray_sizeLimit = new WeakMap(), _b = Symbol.iterator;
103
+ //# sourceMappingURL=bounded-collections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bounded-collections.js","sourceRoot":"","sources":["../src/bounded-collections.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ type SingletonKey = {
2
+ _tag: 'singleton';
3
+ componentName: string;
4
+ id: 'singleton';
5
+ };
6
+ type EphemeralKey = {
7
+ _tag: 'ephemeral';
8
+ componentName: string;
9
+ id: string;
10
+ };
11
+ type CustomKey = {
12
+ _tag: 'custom';
13
+ componentName: string;
14
+ id: string;
15
+ };
16
+ export type ComponentKey = SingletonKey | EphemeralKey | CustomKey;
17
+ export declare const labelForKey: (key: ComponentKey) => string;
18
+ export declare const tableNameForComponentKey: (componentKey: ComponentKey) => string;
19
+ export {};
20
+ //# sourceMappingURL=componentKey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"componentKey.d.ts","sourceRoot":"","sources":["../src/componentKey.ts"],"names":[],"mappings":"AAAA,KAAK,YAAY,GAAG;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,WAAW,CAAA;CAAE,CAAA;AACjF,KAAK,YAAY,GAAG;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAA;AAC5E,KAAK,SAAS,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAA;AAEtE,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,SAAS,CAAA;AAElE,eAAO,MAAM,WAAW,QAAS,YAAY,KAAG,MAA0C,CAAA;AAE1F,eAAO,MAAM,wBAAwB,iBAAkB,YAAY,WAAgD,CAAA"}
@@ -0,0 +1,3 @@
1
+ export const labelForKey = (key) => `${key.componentName}/${key.id}`;
2
+ export const tableNameForComponentKey = (componentKey) => `components__${componentKey.componentName}`;
3
+ //# sourceMappingURL=componentKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"componentKey.js","sourceRoot":"","sources":["../src/componentKey.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAiB,EAAU,EAAE,CAAC,GAAG,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,EAAE,EAAE,CAAA;AAE1F,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,YAA0B,EAAE,EAAE,CAAC,eAAe,YAAY,CAAC,aAAa,EAAE,CAAA"}
@@ -0,0 +1,36 @@
1
+ import type { Scope } from '@livestore/utils/effect';
2
+ import { Context, Deferred, Effect, Layer } from '@livestore/utils/effect';
3
+ import * as otel from '@opentelemetry/api';
4
+ import type { GraphQLSchema } from 'graphql';
5
+ import type { InMemoryDatabase } from '../inMemoryDatabase.js';
6
+ import type { Schema } from '../schema.js';
7
+ import type { StorageInit } from '../storage/index.js';
8
+ import type { BaseGraphQLContext, GraphQLOptions, LiveStoreQuery, Store } from '../store.js';
9
+ export type LiveStoreContext = {
10
+ store: Store;
11
+ };
12
+ export type QueryDefinition = (store: Store) => LiveStoreQuery;
13
+ export type LiveStoreCreateStoreOptions<GraphQLContext extends BaseGraphQLContext> = {
14
+ schema: Schema;
15
+ loadStorage: () => StorageInit | Promise<StorageInit>;
16
+ graphQLOptions?: GraphQLOptions<GraphQLContext>;
17
+ otelTracer?: otel.Tracer;
18
+ otelRootSpanContext?: otel.Context;
19
+ boot?: (db: InMemoryDatabase, parentSpan: otel.Span) => unknown | Promise<unknown>;
20
+ };
21
+ export declare const LiveStoreContext: Context.Tag<LiveStoreContext, LiveStoreContext>;
22
+ export type DeferredStoreContext = Deferred.Deferred<never, LiveStoreContext>;
23
+ export declare const DeferredStoreContext: Context.Tag<DeferredStoreContext, DeferredStoreContext>;
24
+ export type LiveStoreContextProps<GraphQLContext extends BaseGraphQLContext> = {
25
+ schema: Schema;
26
+ loadStorage: () => StorageInit | Promise<StorageInit>;
27
+ graphQLOptions?: {
28
+ schema: Effect.Effect<otel.Tracer, never, GraphQLSchema>;
29
+ makeContext: (db: InMemoryDatabase) => GraphQLContext;
30
+ };
31
+ boot?: (db: InMemoryDatabase) => Effect.Effect<never, never, void>;
32
+ };
33
+ export declare const LiveStoreContextLayer: <GraphQLContext extends BaseGraphQLContext>(props: LiveStoreContextProps<GraphQLContext>) => Layer.Layer<otel.Tracer, never, LiveStoreContext>;
34
+ export declare const LiveStoreContextDeferred: Layer.Layer<never, never, DeferredStoreContext>;
35
+ export declare const makeLiveStoreContext: <GraphQLContext extends BaseGraphQLContext>({ schema, loadStorage, graphQLOptions: graphQLOptions_, boot: boot_, }: LiveStoreContextProps<GraphQLContext>) => Effect.Effect<DeferredStoreContext | Scope.Scope | otel.Tracer, never, LiveStoreContext>;
36
+ //# sourceMappingURL=LiveStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LiveStore.d.ts","sourceRoot":"","sources":["../../src/effect/LiveStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAY,MAAM,EAAE,KAAK,EAA6B,MAAM,yBAAyB,CAAA;AAC/G,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAG5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAW5F,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,KAAK,CAAA;CACb,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,cAAc,CAAA;AAE9D,MAAM,MAAM,2BAA2B,CAAC,cAAc,SAAS,kBAAkB,IAAI;IACnF,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;IACrD,cAAc,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAA;IAC/C,UAAU,CAAC,EAAE,IAAI,CAAC,MAAM,CAAA;IACxB,mBAAmB,CAAC,EAAE,IAAI,CAAC,OAAO,CAAA;IAClC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,gBAAgB,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACnF,CAAA;AAED,eAAO,MAAM,gBAAgB,iDAAyE,CAAA;AAEtG,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAA;AAC7E,eAAO,MAAM,oBAAoB,yDAEhC,CAAA;AAID,MAAM,MAAM,qBAAqB,CAAC,cAAc,SAAS,kBAAkB,IAAI;IAC7E,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;IACrD,cAAc,CAAC,EAAE;QACf,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,aAAa,CAAC,CAAA;QACxD,WAAW,EAAE,CAAC,EAAE,EAAE,gBAAgB,KAAK,cAAc,CAAA;KACtD,CAAA;IACD,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,gBAAgB,KAAK,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;CACnE,CAAA;AAED,eAAO,MAAM,qBAAqB,+FAE/B,WAAW,CAAC,KAAK,MAAM,EAAE,KAAK,EAAE,gBAAgB,CAIhD,CAAA;AAEH,eAAO,MAAM,wBAAwB,iDAA+E,CAAA;AAEpH,eAAO,MAAM,oBAAoB,gKAKU,aAAa,CACtD,oBAAoB,GAAG,WAAW,GAAG,KAAK,MAAM,EAChD,KAAK,EACL,gBAAgB,CAgDf,CAAA"}
@@ -0,0 +1,41 @@
1
+ import { Context, Deferred, Duration, Effect, Layer, OtelTracer, pipe, Runtime } from '@livestore/utils/effect';
2
+ import * as otel from '@opentelemetry/api';
3
+ import initSqlite3Wasm from 'sqlite-esm';
4
+ import { createStore } from '../store.js';
5
+ // NOTE we're starting to initialize the sqlite wasm binary here (already before calling `createStore`),
6
+ // so that it's ready when we need it
7
+ const sqlite3Promise = initSqlite3Wasm({
8
+ print: (message) => console.log(`[livestore sqlite] ${message}`),
9
+ printErr: (message) => console.error(`[livestore sqlite] ${message}`),
10
+ });
11
+ export const LiveStoreContext = Context.Tag('@livestore/livestore/LiveStoreContext');
12
+ export const DeferredStoreContext = Context.Tag(Symbol.for('@livestore/livestore/DeferredStoreContext'));
13
+ export const LiveStoreContextLayer = (props) => Layer.provide(LiveStoreContextDeferred, Layer.scoped(LiveStoreContext, makeLiveStoreContext(props)).pipe(Layer.withSpan('LiveStore')));
14
+ export const LiveStoreContextDeferred = Layer.effect(DeferredStoreContext, Deferred.make());
15
+ export const makeLiveStoreContext = ({ schema, loadStorage, graphQLOptions: graphQLOptions_, boot: boot_, }) => pipe(Effect.gen(function* ($) {
16
+ const runtime = yield* $(Effect.runtime());
17
+ const otelRootSpanContext = otel.context.active();
18
+ const otelTracer = yield* $(OtelTracer.OtelTracer);
19
+ const graphQLOptions = yield* $(graphQLOptions_
20
+ ? Effect.all({ schema: graphQLOptions_.schema, makeContext: Effect.succeed(graphQLOptions_.makeContext) })
21
+ : Effect.succeed(undefined));
22
+ const boot = boot_
23
+ ? (db) => boot_(db).pipe(Effect.withSpan('boot'), Effect.tapCauseLogPretty, Runtime.runPromise(runtime))
24
+ : undefined;
25
+ const sqlite3 = yield* $(Effect.promise(() => sqlite3Promise));
26
+ const store = yield* $(Effect.tryPromise(() => createStore({
27
+ schema,
28
+ loadStorage,
29
+ graphQLOptions,
30
+ otelTracer,
31
+ otelRootSpanContext,
32
+ boot,
33
+ sqlite3,
34
+ })), Effect.acquireRelease((store) => Effect.sync(() => store.destroy())));
35
+ window.__debugLiveStore = store;
36
+ return { store };
37
+ }), Effect.tap((storeCtx) => Effect.flatMap(DeferredStoreContext, (def) => Deferred.succeed(def, storeCtx))), Effect.timeoutFail({
38
+ onTimeout: () => new Error('Timed out while creating LiveStore store after 10sec'),
39
+ duration: Duration.seconds(10),
40
+ }), Effect.orDie);
41
+ //# sourceMappingURL=LiveStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LiveStore.js","sourceRoot":"","sources":["../../src/effect/LiveStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { LiveStoreContextLayer, LiveStoreContext, LiveStoreContextDeferred, DeferredStoreContext, type LiveStoreContextProps, } from './LiveStore.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/effect/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,EACpB,KAAK,qBAAqB,GAC3B,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { LiveStoreContextLayer, LiveStoreContext, LiveStoreContextDeferred, DeferredStoreContext, } from './LiveStore.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/effect/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,GAErB,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,7 @@
1
+ export type LiveStoreEvent = {
2
+ type: string;
3
+ id: string;
4
+ args?: any;
5
+ };
6
+ export declare const EVENTS_TABLE_NAME = "__livestore_events";
7
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,GAAG,CAAA;CACX,CAAA;AAED,eAAO,MAAM,iBAAiB,uBAAuB,CAAA"}
package/dist/events.js ADDED
@@ -0,0 +1,2 @@
1
+ export const EVENTS_TABLE_NAME = '__livestore_events';
2
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,iBAAiB,GAAG,oBAAoB,CAAA"}
@@ -0,0 +1,56 @@
1
+ import type * as otel from '@opentelemetry/api';
2
+ import type * as Sqlite from 'sqlite-esm';
3
+ import { BoundArray } from './bounded-collections.js';
4
+ import type { Bindable, PreparedBindValues } from './util.js';
5
+ type DatabaseWithCAPI = Sqlite.Database & {
6
+ capi: Sqlite.CAPI;
7
+ };
8
+ export interface DebugInfo {
9
+ slowQueries: BoundArray<SlowQueryInfo>;
10
+ queryFrameDuration: number;
11
+ queryFrameCount: number;
12
+ events: BoundArray<[queryStr: string, bindValues: Bindable | undefined]>;
13
+ }
14
+ export type SlowQueryInfo = [
15
+ queryStr: string,
16
+ bindValues: PreparedBindValues | undefined,
17
+ durationMs: number,
18
+ rowsCount: number | undefined,
19
+ queriedTables: string[],
20
+ startTimePerfNow: DOMHighResTimeStamp
21
+ ];
22
+ export declare const emptyDebugInfo: () => DebugInfo;
23
+ export declare class InMemoryDatabase {
24
+ private db;
25
+ private otelTracer;
26
+ private otelRootSpanContext;
27
+ SQL: Sqlite.Sqlite3Static;
28
+ private cachedStmts;
29
+ private tablesUsedCache;
30
+ private resultCache;
31
+ debugInfo: DebugInfo;
32
+ constructor(db: DatabaseWithCAPI, otelTracer: otel.Tracer, otelRootSpanContext: otel.Context, SQL: Sqlite.Sqlite3Static);
33
+ static load({ data, otelTracer, otelRootSpanContext, sqlite3, }: {
34
+ data: Uint8Array | undefined;
35
+ otelTracer: otel.Tracer;
36
+ otelRootSpanContext: otel.Context;
37
+ sqlite3: Sqlite.Sqlite3Static;
38
+ }): InMemoryDatabase;
39
+ txn<TRes>(callback: () => TRes): TRes;
40
+ getTablesUsed(query: string): string[];
41
+ execute(query: string, bindValues?: PreparedBindValues, writeTables?: string[], options?: {
42
+ hasNoEffects?: boolean;
43
+ otelContext: otel.Context;
44
+ }): {
45
+ durationMs: number;
46
+ };
47
+ select<T = any>(query: string, options?: {
48
+ queriedTables?: string[];
49
+ bindValues?: PreparedBindValues;
50
+ skipCache?: boolean;
51
+ otelContext?: otel.Context;
52
+ }): ReadonlyArray<T>;
53
+ export(): any;
54
+ }
55
+ export {};
56
+ //# sourceMappingURL=inMemoryDatabase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inMemoryDatabase.d.ts","sourceRoot":"","sources":["../src/inMemoryDatabase.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC/C,OAAO,KAAK,KAAK,MAAM,MAAM,YAAY,CAAA;AAEzC,OAAiB,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAK/D,OAAO,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAE7D,KAAK,gBAAgB,GAAG,MAAM,CAAC,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAA;CAAE,CAAA;AAE/D,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,UAAU,CAAC,aAAa,CAAC,CAAA;IACtC,kBAAkB,EAAE,MAAM,CAAA;IAC1B,eAAe,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,UAAU,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAA;CACzE;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,kBAAkB,GAAG,SAAS;IAC1C,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,MAAM,GAAG,SAAS;IAC7B,aAAa,EAAE,MAAM,EAAE;IACvB,gBAAgB,EAAE,mBAAmB;CACtC,CAAA;AAED,eAAO,MAAM,cAAc,QAAO,SAKhC,CAAA;AAEF,qBAAa,gBAAgB;IAQzB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,mBAAmB;IACpB,GAAG,EAAE,MAAM,CAAC,aAAa;IATlC,OAAO,CAAC,WAAW,CAAsD;IACzE,OAAO,CAAC,eAAe,CAAsC;IAC7D,OAAO,CAAC,WAAW,CAAmB;IAC/B,SAAS,EAAE,SAAS,CAAmB;gBAGpC,EAAE,EAAE,gBAAgB,EACpB,UAAU,EAAE,IAAI,CAAC,MAAM,EACvB,mBAAmB,EAAE,IAAI,CAAC,OAAO,EAClC,GAAG,EAAE,MAAM,CAAC,aAAa;IAGlC,MAAM,CAAC,IAAI,CAAC,EACV,IAAI,EACJ,UAAU,EACV,mBAAmB,EACnB,OAAO,GACR,EAAE;QACD,IAAI,EAAE,UAAU,GAAG,SAAS,CAAA;QAC5B,UAAU,EAAE,IAAI,CAAC,MAAM,CAAA;QACvB,mBAAmB,EAAE,IAAI,CAAC,OAAO,CAAA;QACjC,OAAO,EAAE,MAAM,CAAC,aAAa,CAAA;KAC9B,GAAG,gBAAgB;IA4BpB,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAoBrC,aAAa,CAAC,KAAK,EAAE,MAAM;IAqB3B,OAAO,CACL,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,kBAAkB,EAC/B,WAAW,CAAC,EAAE,MAAM,EAAE,EACtB,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAA;KAAE,GAC9D;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE;IAiEzB,MAAM,CAAC,CAAC,GAAG,GAAG,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QACR,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;QACxB,UAAU,CAAC,EAAE,kBAAkB,CAAA;QAC/B,SAAS,CAAC,EAAE,OAAO,CAAA;QACnB,WAAW,CAAC,EAAE,IAAI,CAAC,OAAO,CAAA;KAC3B,GACA,aAAa,CAAC,CAAC,CAAC;IAyFnB,MAAM;CAQP"}
@@ -0,0 +1,223 @@
1
+ /* eslint-disable prefer-arrow/prefer-arrow-functions */
2
+ import { shouldNeverHappen } from '@livestore/utils';
3
+ import BoundMap, { BoundArray } from './bounded-collections.js';
4
+ // import { EVENTS_TABLE_NAME } from './events.js'
5
+ import { sql } from './index.js';
6
+ import { getDurationMsFromSpan, getStartTimeHighResFromSpan } from './otel.js';
7
+ import QueryCache from './QueryCache.js';
8
+ export const emptyDebugInfo = () => ({
9
+ slowQueries: new BoundArray(200),
10
+ queryFrameDuration: 0,
11
+ queryFrameCount: 0,
12
+ events: new BoundArray(1000),
13
+ });
14
+ export class InMemoryDatabase {
15
+ constructor(db, otelTracer, otelRootSpanContext, SQL) {
16
+ this.db = db;
17
+ this.otelTracer = otelTracer;
18
+ this.otelRootSpanContext = otelRootSpanContext;
19
+ this.SQL = SQL;
20
+ // TODO: how many unique active statements are expected?
21
+ this.cachedStmts = new BoundMap(200);
22
+ this.tablesUsedCache = new BoundMap(200);
23
+ this.resultCache = new QueryCache();
24
+ this.debugInfo = emptyDebugInfo();
25
+ }
26
+ static load({ data, otelTracer, otelRootSpanContext, sqlite3, }) {
27
+ // TODO move WASM init higher up in the init process (to do some other work while it's loading)
28
+ const db = new sqlite3.oo1.DB({ filename: ':memory:', flags: 'c' });
29
+ db.capi = sqlite3.capi;
30
+ if (data !== undefined) {
31
+ // Based on https://sqlite.org/forum/forumpost/2119230da8ac5357a13b731f462dc76e08621a4a29724f7906d5f35bb8508465
32
+ // TODO find cleaner way to do this once possible in sqlite3-wasm
33
+ const bytes = data;
34
+ const p = sqlite3.wasm.allocFromTypedArray(bytes);
35
+ const _rc = sqlite3.capi.sqlite3_deserialize(db.pointer, 'main', p, bytes.length, bytes.length, sqlite3.capi.SQLITE_DESERIALIZE_FREEONCLOSE && sqlite3.capi.SQLITE_DESERIALIZE_RESIZEABLE);
36
+ }
37
+ const inMemoryDatabase = new InMemoryDatabase(db, otelTracer, otelRootSpanContext, sqlite3);
38
+ configureSQLite(inMemoryDatabase);
39
+ return inMemoryDatabase;
40
+ }
41
+ txn(callback) {
42
+ this.execute(sql `begin transaction;`);
43
+ let errored = false;
44
+ let result;
45
+ try {
46
+ result = callback();
47
+ }
48
+ catch (e) {
49
+ errored = true;
50
+ this.execute(sql `rollback;`);
51
+ throw e;
52
+ }
53
+ if (!errored) {
54
+ this.execute(sql `commit;`);
55
+ }
56
+ return result;
57
+ }
58
+ getTablesUsed(query) {
59
+ const cached = this.tablesUsedCache.get(query);
60
+ if (cached) {
61
+ return cached;
62
+ }
63
+ const stmt = this.db.prepare(`SELECT tbl_name FROM tables_used(?) AS u JOIN sqlite_master ON sqlite_master.name = u.name WHERE u.schema = 'main';`);
64
+ const tablesUsed = [];
65
+ try {
66
+ stmt.bind([query]);
67
+ while (stmt.step()) {
68
+ tablesUsed.push(stmt.get(0));
69
+ }
70
+ }
71
+ finally {
72
+ stmt.finalize();
73
+ }
74
+ this.tablesUsedCache.set(query, tablesUsed);
75
+ return tablesUsed;
76
+ }
77
+ execute(query, bindValues, writeTables, options) {
78
+ return this.otelTracer.startActiveSpan('livestore.in-memory-db:execute',
79
+ // TODO truncate query string
80
+ { attributes: { 'sql.query': query } }, options?.otelContext ?? this.otelRootSpanContext, (span) => {
81
+ try {
82
+ let stmt = this.cachedStmts.get(query);
83
+ if (stmt === undefined) {
84
+ stmt = this.db.prepare(query);
85
+ this.cachedStmts.set(query, stmt);
86
+ }
87
+ if (bindValues !== undefined && Object.keys(bindValues).length > 0) {
88
+ stmt.bind(bindValues);
89
+ }
90
+ if (import.meta.env.DEV) {
91
+ this.debugInfo.events.push([query, bindValues]);
92
+ }
93
+ try {
94
+ stmt.step();
95
+ }
96
+ finally {
97
+ stmt.reset(); // Reset is needed for next execution
98
+ }
99
+ }
100
+ catch (error) {
101
+ shouldNeverHappen(`Error executing query: ${error} \n ${JSON.stringify({
102
+ query,
103
+ bindValues,
104
+ })}`);
105
+ }
106
+ if (options?.hasNoEffects !== true && !this.resultCache.ignoreQuery(query)) {
107
+ // TODO use write tables instead
108
+ // check what queries actually end up here.
109
+ this.resultCache.invalidate(writeTables ?? this.getTablesUsed(query));
110
+ }
111
+ span.end();
112
+ const durationMs = getDurationMsFromSpan(span);
113
+ this.debugInfo.queryFrameDuration += durationMs;
114
+ this.debugInfo.queryFrameCount++;
115
+ if (durationMs > 5 && import.meta.env.DEV) {
116
+ this.debugInfo.slowQueries.push([
117
+ query,
118
+ bindValues,
119
+ durationMs,
120
+ undefined,
121
+ [],
122
+ getStartTimeHighResFromSpan(span),
123
+ ]);
124
+ }
125
+ return { durationMs };
126
+ });
127
+ }
128
+ select(query, options) {
129
+ const { queriedTables, bindValues, skipCache = false, otelContext } = options ?? {};
130
+ return this.otelTracer.startActiveSpan('sql-in-memory-select', {}, otelContext ?? this.otelRootSpanContext, (span) => {
131
+ try {
132
+ span.setAttribute('sql.query', query);
133
+ const key = this.resultCache.getKey(query, bindValues);
134
+ const cachedResult = this.resultCache.get(key);
135
+ if (skipCache === false && cachedResult !== undefined) {
136
+ span.setAttribute('sql.rowsCount', cachedResult.length);
137
+ span.setAttribute('sql.cached', true);
138
+ span.end();
139
+ return cachedResult;
140
+ }
141
+ let stmt = this.cachedStmts.get(query);
142
+ if (stmt === undefined) {
143
+ stmt = this.db.prepare(query);
144
+ this.cachedStmts.set(query, stmt);
145
+ }
146
+ if (bindValues !== undefined && Object.keys(bindValues).length > 0) {
147
+ stmt.bind(bindValues);
148
+ }
149
+ const result = [];
150
+ try {
151
+ // NOTE `getColumnNames` only works for `SELECT` statements, ignoring other statements for now
152
+ let columns = undefined;
153
+ try {
154
+ columns = stmt.getColumnNames();
155
+ }
156
+ catch (_e) { }
157
+ while (stmt.step()) {
158
+ if (columns !== undefined) {
159
+ const obj = {};
160
+ for (const [i, c] of columns.entries()) {
161
+ obj[c] = stmt.get(i);
162
+ }
163
+ result.push(obj);
164
+ }
165
+ }
166
+ }
167
+ finally {
168
+ // we're caching statements in this iteration. do not free.
169
+ // stmt.free();
170
+ // reset the cached statement so we can use it again in the future
171
+ stmt.reset();
172
+ }
173
+ span.setAttribute('sql.rowsCount', result.length);
174
+ span.setAttribute('sql.cached', false);
175
+ const queriedTables_ = queriedTables ?? this.getTablesUsed(query);
176
+ this.resultCache.set(queriedTables_, key, result);
177
+ span.end();
178
+ const durationMs = getDurationMsFromSpan(span);
179
+ this.debugInfo.queryFrameDuration += durationMs;
180
+ this.debugInfo.queryFrameCount++;
181
+ // TODO also enable in non-dev mode
182
+ if (durationMs > 5 && import.meta.env.DEV) {
183
+ this.debugInfo.slowQueries.push([
184
+ query,
185
+ bindValues,
186
+ durationMs,
187
+ result.length,
188
+ queriedTables_,
189
+ getStartTimeHighResFromSpan(span),
190
+ ]);
191
+ }
192
+ return result;
193
+ }
194
+ catch (e) {
195
+ span.end();
196
+ console.error(query);
197
+ console.error(bindValues);
198
+ shouldNeverHappen(`Error executing select query: ${e} \n ${JSON.stringify({ query, bindValues })}`);
199
+ }
200
+ });
201
+ }
202
+ export() {
203
+ // Clear statement cache because exporting frees statements
204
+ for (const key of this.cachedStmts.keys()) {
205
+ this.cachedStmts.delete(key);
206
+ }
207
+ return this.db.capi.sqlite3_js_db_export(this.db.pointer);
208
+ }
209
+ }
210
+ /** Set up SQLite performance; hasn't been super carefully optimized yet. */
211
+ const configureSQLite = (db) => {
212
+ db.execute(
213
+ // TODO: revisit these tuning parameters for max performance
214
+ sql `
215
+ PRAGMA page_size=32768;
216
+ PRAGMA cache_size=10000;
217
+ PRAGMA journal_mode='MEMORY'; -- we don't flush to disk before committing a write
218
+ PRAGMA synchronous='OFF';
219
+ PRAGMA temp_store='MEMORY';
220
+ PRAGMA foreign_keys='ON'; -- we want foreign key constraints to be enforced
221
+ `);
222
+ };
223
+ //# sourceMappingURL=inMemoryDatabase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inMemoryDatabase.js","sourceRoot":"","sources":["../src/inMemoryDatabase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export { Store, createStore } from './store.js';
2
+ export type { LiveStoreQuery, GetAtomResult, BaseGraphQLContext, QueryResult, QueryDebugInfo, RefreshReason, } from './store.js';
3
+ export type { QueryDefinition, LiveStoreCreateStoreOptions, LiveStoreContext } from './effect/LiveStore.js';
4
+ export { defineComponentStateSchema, defineAction, defineActions, defineTables, defineMaterializedViews, makeSchema, } from './schema.js';
5
+ export { InMemoryDatabase, type DebugInfo, emptyDebugInfo } from './inMemoryDatabase.js';
6
+ export type { Storage, StorageType, StorageInit } from './storage/index.js';
7
+ export type { GetAtom, AtomDebugInfo, RefreshDebugInfo, RefreshReasonWithGenericReasons, SerializedAtom, SerializedEffect, } from './reactive.js';
8
+ export type { LiveStoreJSQuery } from './reactiveQueries/js.js';
9
+ export type { LiveStoreSQLQuery } from './reactiveQueries/sql.js';
10
+ export type { LiveStoreGraphQLQuery } from './reactiveQueries/graphql.js';
11
+ export { labelForKey } from './componentKey.js';
12
+ export type { ComponentKey } from './componentKey.js';
13
+ export type { Schema, GetActionArgs, GetApplyEventArgs, Index, ActionDefinition, ActionDefinitions } from './schema.js';
14
+ export { SqliteAst, SqliteDsl } from 'effect-db-schema';
15
+ import type { SqliteAst } from 'effect-db-schema';
16
+ export type TableDefinition = SqliteAst.Table;
17
+ export { SqliteDsl as DbSchema } from 'effect-db-schema';
18
+ export { prepareBindValues, sql, type Bindable, type PreparedBindValues } from './util.js';
19
+ export { isEqual } from 'lodash-es';
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAC/C,YAAY,EACV,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,aAAa,GACd,MAAM,YAAY,CAAA;AAEnB,YAAY,EAAE,eAAe,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE3G,OAAO,EACL,0BAA0B,EAC1B,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,uBAAuB,EACvB,UAAU,GACX,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,gBAAgB,EAAE,KAAK,SAAS,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACxF,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAC3E,YAAY,EACV,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,+BAA+B,EAC/B,cAAc,EACd,gBAAgB,GACjB,MAAM,eAAe,CAAA;AACtB,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AACjE,YAAY,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AAEzE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEvH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,MAAM,MAAM,eAAe,GAAG,SAAS,CAAC,KAAK,CAAA;AAE7C,OAAO,EAAE,SAAS,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAExD,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAAE,KAAK,QAAQ,EAAE,KAAK,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAC1F,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ export { Store, createStore } from './store.js';
2
+ export { defineComponentStateSchema, defineAction, defineActions, defineTables, defineMaterializedViews, makeSchema, } from './schema.js';
3
+ export { InMemoryDatabase, emptyDebugInfo } from './inMemoryDatabase.js';
4
+ export { labelForKey } from './componentKey.js';
5
+ export { SqliteAst, SqliteDsl } from 'effect-db-schema';
6
+ export { SqliteDsl as DbSchema } from 'effect-db-schema';
7
+ export { prepareBindValues, sql } from './util.js';
8
+ export { isEqual } from 'lodash-es';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAY/C,OAAO,EACL,0BAA0B,EAC1B,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,uBAAuB,EACvB,UAAU,GACX,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,gBAAgB,EAAkB,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAcxF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAI/C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAKvD,OAAO,EAAE,SAAS,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAExD,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAA0C,MAAM,WAAW,CAAA;AAC1F,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,16 @@
1
+ import type * as otel from '@opentelemetry/api';
2
+ import { SqliteAst } from 'effect-db-schema';
3
+ import type { InMemoryDatabase } from './index.js';
4
+ import type { Schema } from './schema.js';
5
+ export declare const migrateDb: ({ db, otelContext, schema, }: {
6
+ db: InMemoryDatabase;
7
+ otelContext: otel.Context;
8
+ schema: Schema;
9
+ }) => void;
10
+ export declare const migrateTable: ({ db, tableDef, otelContext, schemaHash, }: {
11
+ db: InMemoryDatabase;
12
+ tableDef: SqliteAst.Table;
13
+ otelContext: otel.Context;
14
+ schemaHash: number;
15
+ }) => void;
16
+ //# sourceMappingURL=migrations.d.ts.map