@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,20 @@
1
+ import type { Bindable } from './util.js';
2
+ type Opaque<BaseType, BrandType = unknown> = BaseType & {
3
+ readonly [Symbols.base]: BaseType;
4
+ readonly [Symbols.brand]: BrandType;
5
+ };
6
+ declare namespace Symbols {
7
+ const base: unique symbol;
8
+ const brand: unique symbol;
9
+ }
10
+ export type CacheKey = Opaque<string, string>;
11
+ export default class QueryCache {
12
+ #private;
13
+ getKey: (sql: string, bindValues?: Bindable) => CacheKey;
14
+ get: (key: CacheKey) => any;
15
+ set: (queriedTables: ReadonlyArray<string>, key: CacheKey, results: any) => void;
16
+ ignoreQuery: (query: string) => boolean;
17
+ invalidate: (queriedTables: string[]) => void;
18
+ }
19
+ export {};
20
+ //# sourceMappingURL=QueryCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryCache.d.ts","sourceRoot":"","sources":["../src/QueryCache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEzC,KAAK,MAAM,CAAC,QAAQ,EAAE,SAAS,GAAG,OAAO,IAAI,QAAQ,GAAG;IACtD,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAA;IACjC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,SAAS,CAAA;CACpC,CAAA;AAED,kBAAU,OAAO,CAAC;IACD,MAAM,IAAI,EAAE,OAAO,MAAM,CAAA;IACzB,MAAM,KAAK,EAAE,OAAO,MAAM,CAAA;CAC1C;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAO7C,MAAM,CAAC,OAAO,OAAO,UAAU;;IAI7B,MAAM,QAAS,MAAM,eAAe,QAAQ,KAAG,QAAQ,CAUtD;IAED,GAAG,QAAS,QAAQ,SAEnB;IAED,GAAG,kBAAmB,cAAc,MAAM,CAAC,OAAO,QAAQ,WAAW,GAAG,UAWvE;IAMD,WAAW,UAAW,MAAM,aAE3B;IAUD,UAAU,kBAAmB,MAAM,EAAE,UAUpC;CACF"}
@@ -0,0 +1,71 @@
1
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
+ 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");
4
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
+ };
6
+ var _QueryCache_entries, _QueryCache_dependencies, _QueryCache_dependencyTrackerEvicted;
7
+ import BoundMap, { BoundSet } from './bounded-collections.js';
8
+ var Symbols;
9
+ (function (Symbols) {
10
+ })(Symbols || (Symbols = {}));
11
+ const ignore = ['begin', 'rollback', 'commit', 'savepoint', 'release'];
12
+ // TODO: profile to see how big we need this cache to be.
13
+ const cacheSize = 200;
14
+ class QueryCache {
15
+ constructor() {
16
+ _QueryCache_entries.set(this, new BoundMap(cacheSize));
17
+ _QueryCache_dependencies.set(this, new Map());
18
+ this.getKey = (sql, bindValues) => {
19
+ if (bindValues == null) {
20
+ return sql;
21
+ }
22
+ if (Array.isArray(bindValues)) {
23
+ return (sql + '\n' + bindValues.join('\n'));
24
+ }
25
+ return (sql + '\n' + Object.values(bindValues).join('\n'));
26
+ };
27
+ this.get = (key) => {
28
+ return __classPrivateFieldGet(this, _QueryCache_entries, "f").get(key);
29
+ };
30
+ this.set = (queriedTables, key, results) => {
31
+ __classPrivateFieldGet(this, _QueryCache_entries, "f").set(key, results);
32
+ for (const table of queriedTables) {
33
+ let keys = __classPrivateFieldGet(this, _QueryCache_dependencies, "f").get(table);
34
+ if (keys == null) {
35
+ keys = new BoundSet(cacheSize);
36
+ keys.onEvict = __classPrivateFieldGet(this, _QueryCache_dependencyTrackerEvicted, "f");
37
+ __classPrivateFieldGet(this, _QueryCache_dependencies, "f").set(table, keys);
38
+ }
39
+ keys.add(key);
40
+ }
41
+ };
42
+ _QueryCache_dependencyTrackerEvicted.set(this, (key) => {
43
+ __classPrivateFieldGet(this, _QueryCache_entries, "f").delete(key);
44
+ });
45
+ this.ignoreQuery = (query) => {
46
+ return ignore.some((prefix) => query.startsWith(prefix));
47
+ };
48
+ // The next simplest step is to create a specific implementation for invalidating
49
+ // the expensive track list queries only when constraints data in a write overlaps with read constraints.
50
+ //
51
+ // As well as either:
52
+ // a. removeing the big view (since we'll have our cache)
53
+ // b. incrementally updating the view on insert by the EventImporter
54
+ //
55
+ // We'll not try to tackle any generalized approach until we have a proof of concept working.
56
+ this.invalidate = (queriedTables) => {
57
+ for (const table of queriedTables) {
58
+ const keys = __classPrivateFieldGet(this, _QueryCache_dependencies, "f").get(table);
59
+ if (keys == null) {
60
+ continue;
61
+ }
62
+ for (const k of keys) {
63
+ __classPrivateFieldGet(this, _QueryCache_entries, "f").delete(k);
64
+ }
65
+ }
66
+ };
67
+ }
68
+ }
69
+ _QueryCache_entries = new WeakMap(), _QueryCache_dependencies = new WeakMap(), _QueryCache_dependencyTrackerEvicted = new WeakMap();
70
+ export default QueryCache;
71
+ //# sourceMappingURL=QueryCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryCache.js","sourceRoot":"","sources":["../src/QueryCache.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAQ7D,IAAU,OAAO,CAGhB;AAHD,WAAU,OAAO;AAGjB,CAAC,EAHS,OAAO,KAAP,OAAO,QAGhB;AAKD,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC,CAAA;AAEtE,yDAAyD;AACzD,MAAM,SAAS,GAAG,GAAG,CAAA;AACrB,MAAqB,UAAU;IAA/B;QACE,8BAAW,IAAI,QAAQ,CAAgB,SAAS,CAAC,EAAA;QACjD,mCAAgB,IAAI,GAAG,EAAiC,EAAA;QAExD,WAAM,GAAG,CAAC,GAAW,EAAE,UAAqB,EAAY,EAAE;YACxD,IAAI,UAAU,IAAI,IAAI,EAAE;gBACtB,OAAO,GAAe,CAAA;aACvB;YAED,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;gBAC7B,OAAO,CAAC,GAAG,GAAG,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAa,CAAA;aACxD;YAED,OAAO,CAAC,GAAG,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAa,CAAA;QACxE,CAAC,CAAA;QAED,QAAG,GAAG,CAAC,GAAa,EAAE,EAAE;YACtB,OAAO,uBAAA,IAAI,2BAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC/B,CAAC,CAAA;QAED,QAAG,GAAG,CAAC,aAAoC,EAAE,GAAa,EAAE,OAAY,EAAE,EAAE;YAC1E,uBAAA,IAAI,2BAAS,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;YAC/B,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE;gBACjC,IAAI,IAAI,GAAG,uBAAA,IAAI,gCAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;gBACxC,IAAI,IAAI,IAAI,IAAI,EAAE;oBAChB,IAAI,GAAG,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAA;oBAC9B,IAAI,CAAC,OAAO,GAAG,uBAAA,IAAI,4CAA0B,CAAA;oBAC7C,uBAAA,IAAI,gCAAc,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;iBACpC;gBACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;aACd;QACH,CAAC,CAAA;QAED,+CAA4B,CAAC,GAAa,EAAE,EAAE;YAC5C,uBAAA,IAAI,2BAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC3B,CAAC,EAAA;QAED,gBAAW,GAAG,CAAC,KAAa,EAAE,EAAE;YAC9B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAA;QAC1D,CAAC,CAAA;QAED,iFAAiF;QACjF,yGAAyG;QACzG,EAAE;QACF,qBAAqB;QACrB,yDAAyD;QACzD,oEAAoE;QACpE,EAAE;QACF,6FAA6F;QAC7F,eAAU,GAAG,CAAC,aAAuB,EAAE,EAAE;YACvC,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE;gBACjC,MAAM,IAAI,GAAG,uBAAA,IAAI,gCAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;gBAC1C,IAAI,IAAI,IAAI,IAAI,EAAE;oBAChB,SAAQ;iBACT;gBACD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;oBACpB,uBAAA,IAAI,2BAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;iBACxB;aACF;QACH,CAAC,CAAA;IACH,CAAC;CAAA;;eA5DoB,UAAU"}
@@ -0,0 +1,26 @@
1
+ import type * as otel from '@opentelemetry/api';
2
+ import React from 'react';
3
+ import * as LiveStore from '../../index.js';
4
+ export type Todo = {
5
+ id: string;
6
+ text: string | null;
7
+ completed: boolean;
8
+ };
9
+ export type Filter = 'all' | 'active' | 'completed';
10
+ export type AppState = {
11
+ newTodoText: string;
12
+ filter: Filter;
13
+ };
14
+ export declare const schema: LiveStore.Schema;
15
+ export declare const makeTodoMvc: ({ otelTracer, otelContext, }?: {
16
+ otelTracer?: otel.Tracer | undefined;
17
+ otelContext?: otel.Context | undefined;
18
+ }) => Promise<{
19
+ wrapper: ({ children }: any) => React.JSX.Element;
20
+ AppSchema: LiveStore.SqliteDsl.TableDefinition<"components__UserInfo", {
21
+ username: LiveStore.SqliteDsl.ColumnDefinition<LiveStore.SqliteDsl.FieldType.FieldTypeText<string, string>, false>;
22
+ id: LiveStore.SqliteDsl.ColumnDefinition<LiveStore.SqliteDsl.FieldType.FieldTypeText<string, string>, false>;
23
+ }>;
24
+ store: LiveStore.Store<LiveStore.BaseGraphQLContext>;
25
+ }>;
26
+ //# sourceMappingURL=fixture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixture.d.ts","sourceRoot":"","sources":["../../../src/__tests__/react/fixture.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAK3C,MAAM,MAAM,IAAI,GAAG;IACjB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,SAAS,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,WAAW,CAAA;AAEnD,MAAM,MAAM,QAAQ,GAAG;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAKD,eAAO,MAAM,MAAM,kBA8BjB,CAAA;AAEF,eAAO,MAAM,WAAW;;;;4BA2BS,GAAG;;;;;;EAKnC,CAAA"}
@@ -0,0 +1,60 @@
1
+ import React from 'react';
2
+ import initSqlite3Wasm from 'sqlite-esm';
3
+ import * as LiveStore from '../../index.js';
4
+ import { sql } from '../../index.js';
5
+ import * as LiveStoreReact from '../../react/index.js';
6
+ import { InMemoryStorage } from '../../storage/in-memory/index.js';
7
+ // const appState: LiveStore.QueryDefinition = (store) =>
8
+ // store.querySQL<AppState>(() => `select newTodoText, filter from app;`, { queriedTables: ['app'] }).getFirstRow()
9
+ export const schema = LiveStore.makeSchema({
10
+ tables: {
11
+ todos: LiveStore.DbSchema.table('todos', {
12
+ id: LiveStore.DbSchema.text({ primaryKey: true }),
13
+ text: LiveStore.DbSchema.text({ default: '', nullable: false }),
14
+ completed: LiveStore.DbSchema.boolean({ default: false, nullable: false }),
15
+ }),
16
+ app: LiveStore.DbSchema.table('app', {
17
+ id: LiveStore.DbSchema.text({ primaryKey: true }),
18
+ newTodoText: LiveStore.DbSchema.text({ default: '', nullable: true }),
19
+ filter: LiveStore.DbSchema.text({ default: 'all', nullable: false }),
20
+ }),
21
+ },
22
+ actions: {
23
+ // TODO: fix these actions to make them have write annotatinos
24
+ addTodo: {
25
+ statement: {
26
+ sql: sql `INSERT INTO todos (id, text, completed) VALUES ($id, $text, false);`,
27
+ writeTables: ['app'],
28
+ },
29
+ },
30
+ completeTodo: { statement: { sql: sql `UPDATE todos SET completed = true WHERE id = $id;`, writeTables: ['app'] } },
31
+ uncompleteTodo: {
32
+ statement: { sql: sql `UPDATE todos SET completed = false WHERE id = $id;`, writeTables: ['app'] },
33
+ },
34
+ deleteTodo: { statement: { sql: sql `DELETE FROM todos WHERE id = $id;`, writeTables: ['app'] } },
35
+ clearCompleted: { statement: { sql: sql `DELETE FROM todos WHERE completed = true;`, writeTables: ['app'] } },
36
+ updateNewTodoText: { statement: { sql: sql `UPDATE app SET newTodoText = $text;`, writeTables: ['app'] } },
37
+ setFilter: { statement: { sql: sql `UPDATE app SET filter = $filter;`, writeTables: ['app'] } },
38
+ },
39
+ });
40
+ export const makeTodoMvc = async ({ otelTracer, otelContext, } = {}) => {
41
+ const AppSchema = LiveStore.defineComponentStateSchema('UserInfo', {
42
+ username: LiveStore.DbSchema.text({ default: '' }),
43
+ });
44
+ const sqlite3 = await initSqlite3Wasm({
45
+ print: (message) => console.log(`[livestore sqlite] ${message}`),
46
+ printErr: (message) => console.error(`[livestore sqlite] ${message}`),
47
+ });
48
+ const store = await LiveStore.createStore({
49
+ schema,
50
+ loadStorage: () => InMemoryStorage.load(),
51
+ boot: (db) => db.execute(sql `INSERT OR IGNORE INTO app (id, newTodoText, filter) VALUES ('static', '', 'all');`),
52
+ sqlite3,
53
+ otelTracer,
54
+ otelRootSpanContext: otelContext,
55
+ });
56
+ const storeContext = { store };
57
+ const wrapper = ({ children }) => (React.createElement(LiveStoreReact.LiveStoreContext.Provider, { value: storeContext }, children));
58
+ return { wrapper, AppSchema, store };
59
+ };
60
+ //# sourceMappingURL=fixture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixture.js","sourceRoot":"","sources":["../../../src/__tests__/react/fixture.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=useComponentState.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useComponentState.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/react/useComponentState.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,68 @@
1
+ import { act, renderHook } from '@testing-library/react';
2
+ import { describe, expect, it } from 'vitest';
3
+ import { sql } from '../../index.js';
4
+ import * as LiveStoreReact from '../../react/index.js';
5
+ import { makeTodoMvc } from './fixture.js';
6
+ describe('useComponentState', () => {
7
+ it('should update the data based on component key', async () => {
8
+ let renderCount = 0;
9
+ const { wrapper, AppSchema, store } = await makeTodoMvc();
10
+ const { result, rerender } = renderHook((userId) => {
11
+ renderCount++;
12
+ return LiveStoreReact.useComponentState({
13
+ schema: AppSchema,
14
+ componentKey: { name: 'UserInfo', id: userId },
15
+ });
16
+ }, { wrapper, initialProps: 'u1' });
17
+ expect(result.current.state.id).toBe('u1');
18
+ expect(result.current.state.username).toBe('');
19
+ expect(renderCount).toBe(1);
20
+ act(() => {
21
+ void store.execute(sql `INSERT INTO components__UserInfo (id, username) VALUES ('u2', 'username_u2');`);
22
+ });
23
+ rerender('u2');
24
+ expect(result.current.state.id).toBe('u2');
25
+ expect(result.current.state.username).toBe('username_u2');
26
+ expect(renderCount).toBe(2);
27
+ });
28
+ it('should update the data reactively - via setState', async () => {
29
+ let renderCount = 0;
30
+ const { wrapper, AppSchema } = await makeTodoMvc();
31
+ const { result } = renderHook((userId) => {
32
+ renderCount++;
33
+ return LiveStoreReact.useComponentState({
34
+ schema: AppSchema,
35
+ componentKey: { name: 'UserInfo', id: userId },
36
+ });
37
+ }, { wrapper, initialProps: 'u1' });
38
+ expect(result.current.state.id).toBe('u1');
39
+ expect(result.current.state.username).toBe('');
40
+ expect(renderCount).toBe(1);
41
+ act(() => result.current.setState.username('username_u1_hello'));
42
+ expect(result.current.state.id).toBe('u1');
43
+ expect(result.current.state.username).toBe('username_u1_hello');
44
+ expect(renderCount).toBe(2);
45
+ });
46
+ it('should update the data reactively - via raw store update', async () => {
47
+ let renderCount = 0;
48
+ const { wrapper, AppSchema, store } = await makeTodoMvc();
49
+ const { result } = renderHook((userId) => {
50
+ renderCount++;
51
+ return LiveStoreReact.useComponentState({
52
+ schema: AppSchema,
53
+ componentKey: { name: 'UserInfo', id: userId },
54
+ });
55
+ }, { wrapper, initialProps: 'u1' });
56
+ expect(result.current.state.id).toBe('u1');
57
+ expect(result.current.state.username).toBe('');
58
+ expect(renderCount).toBe(1);
59
+ act(() => result.current.setState.username('username_u1_hello'));
60
+ act(() => {
61
+ void store.execute(sql `UPDATE components__UserInfo SET username = 'username_u1_hello' WHERE id = 'u1';`);
62
+ });
63
+ expect(result.current.state.id).toBe('u1');
64
+ expect(result.current.state.username).toBe('username_u1_hello');
65
+ expect(renderCount).toBe(2);
66
+ });
67
+ });
68
+ //# sourceMappingURL=useComponentState.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useComponentState.test.js","sourceRoot":"","sources":["../../../src/__tests__/react/useComponentState.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=useLQuery.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLQuery.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/react/useLQuery.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,38 @@
1
+ import { makeNoopTracer } from '@livestore/utils';
2
+ import * as otel from '@opentelemetry/api';
3
+ import { renderHook } from '@testing-library/react';
4
+ import { describe, it } from 'vitest';
5
+ import * as LiveStoreReact from '../../react/index.js';
6
+ import { LiveStoreSQLQuery } from '../../reactiveQueries/sql.js';
7
+ import { makeTodoMvc } from './fixture.js';
8
+ describe.only('useQuery', () => {
9
+ it('todo', async () => {
10
+ let renderCount = 0;
11
+ const { wrapper, AppSchema, store } = await makeTodoMvc();
12
+ const { result, rerender } = renderHook((userId) => {
13
+ renderCount++;
14
+ const query = new LiveStoreSQLQuery({
15
+ label: 'todo',
16
+ otelContext: otel.context.active(),
17
+ otelTracer: makeNoopTracer(),
18
+ payload: {
19
+ genQueryString: `select * from todos`,
20
+ queriedTables: ['todos'],
21
+ },
22
+ });
23
+ return LiveStoreReact.useQuery(query);
24
+ }, { wrapper, initialProps: 'u1' });
25
+ console.log(result.current);
26
+ // expect(result.current.state.id).toBe('u1')
27
+ // expect(result.current.state.username).toBe('')
28
+ // expect(renderCount).toBe(1)
29
+ // act(() => {
30
+ // void store.execute(sql`INSERT INTO components__UserInfo (id, username) VALUES ('u2', 'username_u2');`)
31
+ // })
32
+ // rerender('u2')
33
+ // expect(result.current.state.id).toBe('u2')
34
+ // expect(result.current.state.username).toBe('username_u2')
35
+ // expect(renderCount).toBe(2)
36
+ });
37
+ });
38
+ //# sourceMappingURL=useLQuery.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLQuery.test.js","sourceRoot":"","sources":["../../../src/__tests__/react/useLQuery.test.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAO,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAU,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAEhE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE1C,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;QACpB,IAAI,WAAW,GAAG,CAAC,CAAA;QAEnB,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,MAAM,WAAW,EAAE,CAAA;QAEzD,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CACrC,CAAC,MAAc,EAAE,EAAE;YACjB,WAAW,EAAE,CAAA;YAEb,MAAM,KAAK,GAAG,IAAI,iBAAiB,CAAO;gBACxC,KAAK,EAAE,MAAM;gBACb,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;gBAClC,UAAU,EAAE,cAAc,EAAE;gBAC5B,OAAO,EAAE;oBACP,cAAc,EAAE,qBAAqB;oBACrC,aAAa,EAAE,CAAC,OAAO,CAAC;iBACzB;aACF,CAAC,CAAA;YAEF,OAAO,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACvC,CAAC,EACD,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,CAChC,CAAA;QAED,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAE3B,6CAA6C;QAC7C,iDAAiD;QACjD,8BAA8B;QAE9B,cAAc;QACd,2GAA2G;QAC3G,KAAK;QAEL,iBAAiB;QAEjB,6CAA6C;QAC7C,4DAA4D;QAC5D,8BAA8B;IAChC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=useLiveStoreComponent.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLiveStoreComponent.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/react/useLiveStoreComponent.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,73 @@
1
+ import { act, renderHook } from '@testing-library/react';
2
+ import { describe, expect, it } from 'vitest';
3
+ import { sql } from '../../index.js';
4
+ import * as LiveStoreReact from '../../react/index.js';
5
+ import { makeTodoMvc } from './fixture.js';
6
+ describe('useLiveStoreComponent', () => {
7
+ it('should update the data based on component key', async () => {
8
+ let renderCount = 0;
9
+ const { wrapper, AppSchema, store } = await makeTodoMvc();
10
+ const { result, rerender } = renderHook((userId) => {
11
+ renderCount++;
12
+ return LiveStoreReact.useLiveStoreComponent({
13
+ stateSchema: AppSchema,
14
+ componentKey: { name: 'UserInfo', id: userId },
15
+ queries: () => ({}),
16
+ });
17
+ }, { wrapper, initialProps: 'u1' });
18
+ expect(result.current.state.id).toBe('u1');
19
+ expect(result.current.state.username).toBe('');
20
+ expect(renderCount).toBe(1);
21
+ act(() => {
22
+ void store.execute(sql `INSERT INTO components__UserInfo (id, username) VALUES ('u2', 'username_u2');`);
23
+ });
24
+ rerender('u2');
25
+ expect(result.current.state.id).toBe('u2');
26
+ expect(result.current.state.username).toBe('username_u2');
27
+ expect(renderCount).toBe(2);
28
+ });
29
+ it('should update the data reactively - via setState', async () => {
30
+ let renderCount = 0;
31
+ const { wrapper, AppSchema } = await makeTodoMvc();
32
+ const { result } = renderHook((userId) => {
33
+ renderCount++;
34
+ return LiveStoreReact.useLiveStoreComponent({
35
+ stateSchema: AppSchema,
36
+ componentKey: { name: 'UserInfo', id: userId },
37
+ queries: () => ({}),
38
+ });
39
+ }, { wrapper, initialProps: 'u1' });
40
+ expect(result.current.state.id).toBe('u1');
41
+ expect(result.current.state.username).toBe('');
42
+ expect(renderCount).toBe(1);
43
+ act(() => result.current.setState.username('username_u1_hello'));
44
+ expect(result.current.state.id).toBe('u1');
45
+ expect(result.current.state.username).toBe('username_u1_hello');
46
+ expect(renderCount).toBe(2);
47
+ });
48
+ it('should update the data reactively - via raw store update', async () => {
49
+ let renderCount = 0;
50
+ const { wrapper, AppSchema, store } = await makeTodoMvc();
51
+ const { result } = renderHook((userId) => {
52
+ renderCount++;
53
+ return LiveStoreReact.useLiveStoreComponent({
54
+ stateSchema: AppSchema,
55
+ componentKey: { name: 'UserInfo', id: userId },
56
+ queries: () => ({}),
57
+ });
58
+ }, { wrapper, initialProps: 'u1' });
59
+ expect(result.current.state.id).toBe('u1');
60
+ expect(result.current.state.username).toBe('');
61
+ expect(renderCount).toBe(1);
62
+ act(() => result.current.setState.username('username_u1_hello'));
63
+ act(() => {
64
+ void store.execute(sql `UPDATE components__UserInfo SET username = 'username_u1_hello' WHERE id = 'u1';`);
65
+ });
66
+ expect(result.current.state.id).toBe('u1');
67
+ expect(result.current.state.username).toBe('username_u1_hello');
68
+ expect(renderCount).toBe(2);
69
+ });
70
+ });
71
+ // TODO add a test case that tests the `queries` callback
72
+ // TODO add a test case that tests the `subscribe` in the `queries` callback
73
+ //# sourceMappingURL=useLiveStoreComponent.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLiveStoreComponent.test.js","sourceRoot":"","sources":["../../../src/__tests__/react/useLiveStoreComponent.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=useQuery.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useQuery.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/react/useQuery.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,33 @@
1
+ import { act, renderHook } from '@testing-library/react';
2
+ import { describe, expect, it } from 'vitest';
3
+ import * as LiveStoreReact from '../../react/index.js';
4
+ import { LiveStoreSQLQuery } from '../../reactiveQueries/sql.js';
5
+ import { sql } from '../../util.js';
6
+ import { makeTodoMvc } from './fixture.js';
7
+ const query = new LiveStoreSQLQuery({
8
+ label: 'todo',
9
+ genQueryString: `select * from todos`,
10
+ queriedTables: ['todos'],
11
+ });
12
+ describe('useQuery', () => {
13
+ it('simple', async () => {
14
+ let renderCount = 0;
15
+ const { wrapper, store } = await makeTodoMvc();
16
+ const { result } = renderHook(() => {
17
+ renderCount++;
18
+ return LiveStoreReact.useQuery(query);
19
+ }, { wrapper });
20
+ expect(result.current.length).toBe(0);
21
+ expect(renderCount).toBe(1);
22
+ act(() => store.applyEvent('RawSql', {
23
+ sql: sql `INSERT INTO todos (id, text, completed) VALUES ('t1', 'buy milk', 0);`,
24
+ bindValues: {},
25
+ writeTables: ['todos'],
26
+ }));
27
+ expect(result.current.length).toBe(1);
28
+ expect(result.current[0].text).toBe('buy milk');
29
+ expect(renderCount).toBe(2);
30
+ });
31
+ });
32
+ // TODO write tests that use the same query in multiple components at the same time with different bind values
33
+ //# sourceMappingURL=useQuery.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useQuery.test.js","sourceRoot":"","sources":["../../../src/__tests__/react/useQuery.test.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAChE,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAA;AAEnC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE1C,MAAM,KAAK,GAAG,IAAI,iBAAiB,CAAO;IACxC,KAAK,EAAE,MAAM;IACb,cAAc,EAAE,qBAAqB;IACrC,aAAa,EAAE,CAAC,OAAO,CAAC;CACzB,CAAC,CAAA;AAEF,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QACtB,IAAI,WAAW,GAAG,CAAC,CAAA;QAEnB,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,WAAW,EAAE,CAAA;QAE9C,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAC3B,GAAG,EAAE;YACH,WAAW,EAAE,CAAA;YAEb,OAAO,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACvC,CAAC,EACD,EAAE,OAAO,EAAE,CACZ,CAAA;QAED,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACrC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAE3B,GAAG,CAAC,GAAG,EAAE,CACP,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE;YACzB,GAAG,EAAE,GAAG,CAAA,uEAAuE;YAC/E,UAAU,EAAE,EAAE;YACd,WAAW,EAAE,CAAC,OAAO,CAAC;SACvB,CAAC,CACH,CAAA;QAED,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACrC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAChD,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC7B,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,8GAA8G"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=extractStackInfoFromStackTrace.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractStackInfoFromStackTrace.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/react/utils/extractStackInfoFromStackTrace.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,38 @@
1
+ import { expect, it } from 'vitest';
2
+ import { extractStackInfoFromStackTrace } from '../../../react/utils/extractStackInfoFromStackTrace.js';
3
+ it('RouteLink stacktrace', async () => {
4
+ const stackTrace = `\
5
+ Error
6
+ at https://localhost:8081/@fs/Users/schickling/Code/overtone/submodules/livestore/packages/@livestore/livestore/dist/react/useQuery.js?t=1699550216884:18:23
7
+ at mountMemo (https://localhost:8081/node_modules/.vite-web/deps/chunk-M23HUTQV.js?v=3eb66ed6:12817:27)
8
+ at Object.useMemo (https://localhost:8081/node_modules/.vite-web/deps/chunk-M23HUTQV.js?v=3eb66ed6:13141:24)
9
+ at Object.useMemo (https://localhost:8081/node_modules/.vite-web/deps/chunk-4WADDZ2G.js?v=3eb66ed6:1094:29)
10
+ at useQuery (https://localhost:8081/@fs/Users/schickling/Code/overtone/submodules/livestore/packages/@livestore/livestore/dist/react/useQuery.js?t=1699550216884:13:33)
11
+ at useAppState (https://localhost:8081/src/db/AppState.ts?t=1699550216884:17:34)
12
+ at useRoute (https://localhost:8081/src/db/AppState.ts?t=1699550216884:74:22)
13
+ at RouteLink (https://localhost:8081/src/components/Link.tsx?t=1699550216884:36:7)
14
+ at renderWithHooks (https://localhost:8081/node_modules/.vite-web/deps/chunk-M23HUTQV.js?v=3eb66ed6:12171:26)
15
+ at mountIndeterminateComponent (https://localhost:8081/node_modules/.vite-web/deps/chunk-M23HUTQV.js?v=3eb66ed6:14921:21)
16
+ `;
17
+ expect(extractStackInfoFromStackTrace(stackTrace)).toMatchInlineSnapshot(`
18
+ [
19
+ {
20
+ "filePath": "https://localhost:8081/src/components/Link.tsx?t=1699550216884:36:7",
21
+ "name": "RouteLink",
22
+ },
23
+ {
24
+ "filePath": "https://localhost:8081/src/db/AppState.ts?t=1699550216884:74:22",
25
+ "name": "useRoute",
26
+ },
27
+ {
28
+ "filePath": "https://localhost:8081/src/db/AppState.ts?t=1699550216884:17:34",
29
+ "name": "useAppState",
30
+ },
31
+ {
32
+ "filePath": "https://localhost:8081/@fs/Users/schickling/Code/overtone/submodules/livestore/packages/@livestore/livestore/dist/react/useQuery.js?t=1699550216884:13:33",
33
+ "name": "useQuery",
34
+ },
35
+ ]
36
+ `);
37
+ });
38
+ //# sourceMappingURL=extractStackInfoFromStackTrace.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractStackInfoFromStackTrace.test.js","sourceRoot":"","sources":["../../../../src/__tests__/react/utils/extractStackInfoFromStackTrace.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAEnC,OAAO,EAAE,8BAA8B,EAAE,MAAM,wDAAwD,CAAA;AAEvG,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;IACpC,MAAM,UAAU,GAAG;;;;;;;;;;;;CAYpB,CAAA;IAEC,MAAM,CAAC,8BAA8B,CAAC,UAAU,CAAC,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;;GAmBxE,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=reactive.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactive.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/reactive.test.ts"],"names":[],"mappings":""}