@livestore/livestore 0.0.0

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 (205) hide show
  1. package/README.md +108 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/LiveRiffleStore.d.ts +42 -0
  4. package/dist/LiveRiffleStore.d.ts.map +1 -0
  5. package/dist/LiveRiffleStore.js +36 -0
  6. package/dist/LiveRiffleStore.js.map +1 -0
  7. package/dist/QueryCache.d.ts +20 -0
  8. package/dist/QueryCache.d.ts.map +1 -0
  9. package/dist/QueryCache.js +71 -0
  10. package/dist/QueryCache.js.map +1 -0
  11. package/dist/__tests__/react/fixture.d.ts +141 -0
  12. package/dist/__tests__/react/fixture.d.ts.map +1 -0
  13. package/dist/__tests__/react/fixture.js +72 -0
  14. package/dist/__tests__/react/fixture.js.map +1 -0
  15. package/dist/__tests__/react/useLiveStoreComponent.test.d.ts +2 -0
  16. package/dist/__tests__/react/useLiveStoreComponent.test.d.ts.map +1 -0
  17. package/dist/__tests__/react/useLiveStoreComponent.test.js +78 -0
  18. package/dist/__tests__/react/useLiveStoreComponent.test.js.map +1 -0
  19. package/dist/__tests__/react/useRiffleComponent.test.d.ts +2 -0
  20. package/dist/__tests__/react/useRiffleComponent.test.d.ts.map +1 -0
  21. package/dist/__tests__/react/useRiffleComponent.test.js +78 -0
  22. package/dist/__tests__/react/useRiffleComponent.test.js.map +1 -0
  23. package/dist/__tests__/reactive.test.d.ts +2 -0
  24. package/dist/__tests__/reactive.test.d.ts.map +1 -0
  25. package/dist/__tests__/reactive.test.js +167 -0
  26. package/dist/__tests__/reactive.test.js.map +1 -0
  27. package/dist/backends/base.d.ts +13 -0
  28. package/dist/backends/base.d.ts.map +1 -0
  29. package/dist/backends/base.js +53 -0
  30. package/dist/backends/base.js.map +1 -0
  31. package/dist/backends/index.d.ts +41 -0
  32. package/dist/backends/index.d.ts.map +1 -0
  33. package/dist/backends/index.js +38 -0
  34. package/dist/backends/index.js.map +1 -0
  35. package/dist/backends/noop.d.ts +18 -0
  36. package/dist/backends/noop.d.ts.map +1 -0
  37. package/dist/backends/noop.js +21 -0
  38. package/dist/backends/noop.js.map +1 -0
  39. package/dist/backends/tauri.d.ts +24 -0
  40. package/dist/backends/tauri.d.ts.map +1 -0
  41. package/dist/backends/tauri.js +48 -0
  42. package/dist/backends/tauri.js.map +1 -0
  43. package/dist/backends/utils/idb.d.ts +10 -0
  44. package/dist/backends/utils/idb.d.ts.map +1 -0
  45. package/dist/backends/utils/idb.js +58 -0
  46. package/dist/backends/utils/idb.js.map +1 -0
  47. package/dist/backends/web-in-memory.d.ts +24 -0
  48. package/dist/backends/web-in-memory.d.ts.map +1 -0
  49. package/dist/backends/web-in-memory.js +46 -0
  50. package/dist/backends/web-in-memory.js.map +1 -0
  51. package/dist/backends/web-worker.d.ts +17 -0
  52. package/dist/backends/web-worker.d.ts.map +1 -0
  53. package/dist/backends/web-worker.js +139 -0
  54. package/dist/backends/web-worker.js.map +1 -0
  55. package/dist/backends/web.d.ts +28 -0
  56. package/dist/backends/web.d.ts.map +1 -0
  57. package/dist/backends/web.js +64 -0
  58. package/dist/backends/web.js.map +1 -0
  59. package/dist/bounded-collections.d.ts +34 -0
  60. package/dist/bounded-collections.d.ts.map +1 -0
  61. package/dist/bounded-collections.js +103 -0
  62. package/dist/bounded-collections.js.map +1 -0
  63. package/dist/componentKey.d.ts +20 -0
  64. package/dist/componentKey.d.ts.map +1 -0
  65. package/dist/componentKey.js +3 -0
  66. package/dist/componentKey.js.map +1 -0
  67. package/dist/effect/LiveStore.d.ts +42 -0
  68. package/dist/effect/LiveStore.d.ts.map +1 -0
  69. package/dist/effect/LiveStore.js +36 -0
  70. package/dist/effect/LiveStore.js.map +1 -0
  71. package/dist/effect/index.d.ts +2 -0
  72. package/dist/effect/index.d.ts.map +1 -0
  73. package/dist/effect/index.js +2 -0
  74. package/dist/effect/index.js.map +1 -0
  75. package/dist/events.d.ts +7 -0
  76. package/dist/events.d.ts.map +1 -0
  77. package/dist/events.js +2 -0
  78. package/dist/events.js.map +1 -0
  79. package/dist/inMemoryDatabase.d.ts +65 -0
  80. package/dist/inMemoryDatabase.d.ts.map +1 -0
  81. package/dist/inMemoryDatabase.js +241 -0
  82. package/dist/inMemoryDatabase.js.map +1 -0
  83. package/dist/index.d.ts +20 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +10 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/otel.d.ts +5 -0
  88. package/dist/otel.d.ts.map +1 -0
  89. package/dist/otel.js +17 -0
  90. package/dist/otel.js.map +1 -0
  91. package/dist/react/LiveStoreContext.d.ts +11 -0
  92. package/dist/react/LiveStoreContext.d.ts.map +1 -0
  93. package/dist/react/LiveStoreContext.js +10 -0
  94. package/dist/react/LiveStoreContext.js.map +1 -0
  95. package/dist/react/LiveStoreProvider.d.ts +21 -0
  96. package/dist/react/LiveStoreProvider.d.ts.map +1 -0
  97. package/dist/react/LiveStoreProvider.js +48 -0
  98. package/dist/react/LiveStoreProvider.js.map +1 -0
  99. package/dist/react/RiffleProvider.d.ts +21 -0
  100. package/dist/react/RiffleProvider.d.ts.map +1 -0
  101. package/dist/react/RiffleProvider.js +48 -0
  102. package/dist/react/RiffleProvider.js.map +1 -0
  103. package/dist/react/StoreContext.d.ts +11 -0
  104. package/dist/react/StoreContext.d.ts.map +1 -0
  105. package/dist/react/StoreContext.js +10 -0
  106. package/dist/react/StoreContext.js.map +1 -0
  107. package/dist/react/index.d.ts +7 -0
  108. package/dist/react/index.d.ts.map +1 -0
  109. package/dist/react/index.js +6 -0
  110. package/dist/react/index.js.map +1 -0
  111. package/dist/react/useGlobalQuery.d.ts +3 -0
  112. package/dist/react/useGlobalQuery.d.ts.map +1 -0
  113. package/dist/react/useGlobalQuery.js +25 -0
  114. package/dist/react/useGlobalQuery.js.map +1 -0
  115. package/dist/react/useGraphQL.d.ts +11 -0
  116. package/dist/react/useGraphQL.d.ts.map +1 -0
  117. package/dist/react/useGraphQL.js +68 -0
  118. package/dist/react/useGraphQL.js.map +1 -0
  119. package/dist/react/useLiveStoreComponent.d.ts +70 -0
  120. package/dist/react/useLiveStoreComponent.d.ts.map +1 -0
  121. package/dist/react/useLiveStoreComponent.js +261 -0
  122. package/dist/react/useLiveStoreComponent.js.map +1 -0
  123. package/dist/react/useRiffleComponent.d.ts +70 -0
  124. package/dist/react/useRiffleComponent.d.ts.map +1 -0
  125. package/dist/react/useRiffleComponent.js +261 -0
  126. package/dist/react/useRiffleComponent.js.map +1 -0
  127. package/dist/react/useRiffleJsonHook.d.ts +4 -0
  128. package/dist/react/useRiffleJsonHook.d.ts.map +1 -0
  129. package/dist/react/useRiffleJsonHook.js +21 -0
  130. package/dist/react/useRiffleJsonHook.js.map +1 -0
  131. package/dist/react/utils/useStateRefWithReactiveInput.d.ts +13 -0
  132. package/dist/react/utils/useStateRefWithReactiveInput.d.ts.map +1 -0
  133. package/dist/react/utils/useStateRefWithReactiveInput.js +38 -0
  134. package/dist/react/utils/useStateRefWithReactiveInput.js.map +1 -0
  135. package/dist/reactive.d.ts +140 -0
  136. package/dist/reactive.d.ts.map +1 -0
  137. package/dist/reactive.js +301 -0
  138. package/dist/reactive.js.map +1 -0
  139. package/dist/reactiveQueries/base-class.d.ts +24 -0
  140. package/dist/reactiveQueries/base-class.d.ts.map +1 -0
  141. package/dist/reactiveQueries/base-class.js +22 -0
  142. package/dist/reactiveQueries/base-class.js.map +1 -0
  143. package/dist/reactiveQueries/graphql.d.ts +25 -0
  144. package/dist/reactiveQueries/graphql.d.ts.map +1 -0
  145. package/dist/reactiveQueries/graphql.js +14 -0
  146. package/dist/reactiveQueries/graphql.js.map +1 -0
  147. package/dist/reactiveQueries/js.d.ts +19 -0
  148. package/dist/reactiveQueries/js.d.ts.map +1 -0
  149. package/dist/reactiveQueries/js.js +13 -0
  150. package/dist/reactiveQueries/js.js.map +1 -0
  151. package/dist/reactiveQueries/sql.d.ts +31 -0
  152. package/dist/reactiveQueries/sql.d.ts.map +1 -0
  153. package/dist/reactiveQueries/sql.js +28 -0
  154. package/dist/reactiveQueries/sql.js.map +1 -0
  155. package/dist/schema.d.ts +163 -0
  156. package/dist/schema.d.ts.map +1 -0
  157. package/dist/schema.js +92 -0
  158. package/dist/schema.js.map +1 -0
  159. package/dist/store.d.ts +175 -0
  160. package/dist/store.d.ts.map +1 -0
  161. package/dist/store.js +546 -0
  162. package/dist/store.js.map +1 -0
  163. package/dist/util.d.ts +24 -0
  164. package/dist/util.d.ts.map +1 -0
  165. package/dist/util.js +51 -0
  166. package/dist/util.js.map +1 -0
  167. package/package.json +52 -0
  168. package/src/QueryCache.ts +81 -0
  169. package/src/__tests__/react/fixture.tsx +106 -0
  170. package/src/__tests__/react/useLiveStoreComponent.test.tsx +111 -0
  171. package/src/__tests__/reactive.test.ts +227 -0
  172. package/src/ambient.d.ts +7 -0
  173. package/src/backends/base.ts +67 -0
  174. package/src/backends/index.ts +94 -0
  175. package/src/backends/noop.ts +32 -0
  176. package/src/backends/tauri.ts +74 -0
  177. package/src/backends/utils/idb.ts +71 -0
  178. package/src/backends/web-in-memory.ts +65 -0
  179. package/src/backends/web-worker.ts +176 -0
  180. package/src/backends/web.ts +96 -0
  181. package/src/bounded-collections.ts +112 -0
  182. package/src/componentKey.ts +9 -0
  183. package/src/effect/LiveStore.ts +123 -0
  184. package/src/effect/index.ts +7 -0
  185. package/src/events.ts +8 -0
  186. package/src/inMemoryDatabase.ts +347 -0
  187. package/src/index.ts +47 -0
  188. package/src/otel.ts +20 -0
  189. package/src/react/LiveStoreContext.ts +23 -0
  190. package/src/react/LiveStoreProvider.tsx +93 -0
  191. package/src/react/index.ts +11 -0
  192. package/src/react/useGlobalQuery.ts +40 -0
  193. package/src/react/useGraphQL.ts +113 -0
  194. package/src/react/useLiveStoreComponent.ts +493 -0
  195. package/src/react/utils/useStateRefWithReactiveInput.ts +51 -0
  196. package/src/reactive.ts +538 -0
  197. package/src/reactiveQueries/base-class.ts +49 -0
  198. package/src/reactiveQueries/graphql.ts +52 -0
  199. package/src/reactiveQueries/js.ts +38 -0
  200. package/src/reactiveQueries/sql.ts +65 -0
  201. package/src/schema.ts +219 -0
  202. package/src/store.ts +889 -0
  203. package/src/util.ts +59 -0
  204. package/tsconfig.json +15 -0
  205. package/vitest.config.js +13 -0
@@ -0,0 +1,301 @@
1
+ // This is a simple implementation of a reactive dependency graph.
2
+ import { pick } from '@livestore/utils';
3
+ import { isEqual, max, uniqueId } from 'lodash-es';
4
+ import { BoundArray } from './bounded-collections.js';
5
+ class DependencyNotReadyError extends Error {
6
+ constructor(message) {
7
+ super(message);
8
+ this.name = 'DependencyNotReadyError';
9
+ }
10
+ }
11
+ export const unknownRefreshReason = () => {
12
+ debugger;
13
+ return { _tag: 'unknown' };
14
+ };
15
+ const uniqueNodeId = () => uniqueId('node-');
16
+ const uniqueRefreshInfoId = () => uniqueId('refresh-info-');
17
+ const serializeAtom = (atom) => ({
18
+ ...pick(atom, ['_tag', 'height', 'id', 'label', 'meta', 'result']),
19
+ sub: Array.from(atom.sub).map((a) => a.id),
20
+ super: Array.from(atom.super).map((a) => a.id),
21
+ });
22
+ const serializeEffect = (effect) => pick(effect, ['_tag', 'id']);
23
+ export class ReactiveGraph {
24
+ constructor(options) {
25
+ this.atoms = new Set();
26
+ this.effects = new Set();
27
+ this.dirtyNodes = new Set();
28
+ this.debugRefreshInfos = new BoundArray(5000);
29
+ this.getSnapshot = () => ({
30
+ atoms: Array.from(this.atoms).map(serializeAtom),
31
+ effects: Array.from(this.effects).map(serializeEffect),
32
+ dirtyNodes: Array.from(this.dirtyNodes).map((a) => a.id),
33
+ });
34
+ this.effectsWrapper = options?.effectsWrapper ?? ((runEffects) => runEffects());
35
+ this.otelTracer = options.otelTracer;
36
+ }
37
+ makeRef(val, options) {
38
+ const ref = {
39
+ _tag: 'ref',
40
+ id: uniqueNodeId(),
41
+ result: val,
42
+ height: 0,
43
+ getResult: () => ref.result,
44
+ sub: new Set(),
45
+ super: new Set(),
46
+ label: options?.label,
47
+ meta: options?.meta,
48
+ equal: options?.equal ?? isEqual,
49
+ };
50
+ this.atoms.add(ref);
51
+ return ref;
52
+ }
53
+ makeThunk(getResult, options, parentSpanContext) {
54
+ const thunk = {
55
+ _tag: 'thunk',
56
+ id: uniqueNodeId(),
57
+ result: undefined,
58
+ height: 0,
59
+ getResult,
60
+ sub: new Set(),
61
+ super: new Set(),
62
+ label: options?.label,
63
+ meta: options?.meta,
64
+ equal: options?.equal ?? isEqual,
65
+ };
66
+ this.atoms.add(thunk);
67
+ this.dirtyNodes.add(thunk);
68
+ this.refresh({
69
+ otelHint: options?.label ?? 'makeThunk',
70
+ debugRefreshReason: options?.debugRefreshReason ?? { _tag: 'makeThunk', label: options?.label },
71
+ }, parentSpanContext);
72
+ // Manually tell the typesystem this thunk is guaranteed to have a result at this point
73
+ return thunk;
74
+ }
75
+ destroy(node) {
76
+ // Recursively destroy any supercomputations
77
+ if (node._tag === 'ref' || node._tag === 'thunk') {
78
+ for (const superComp of node.super) {
79
+ this.destroy(superComp);
80
+ }
81
+ }
82
+ // Destroy this node
83
+ for (const subComp of node.sub) {
84
+ this.removeEdge(node, subComp);
85
+ }
86
+ if (node._tag === 'effect') {
87
+ this.effects.delete(node);
88
+ }
89
+ else {
90
+ this.atoms.delete(node);
91
+ }
92
+ }
93
+ makeEffect(doEffect, options, parentSpanContext) {
94
+ const effect = {
95
+ _tag: 'effect',
96
+ id: uniqueNodeId(),
97
+ doEffect,
98
+ sub: new Set(),
99
+ };
100
+ this.effects.add(effect);
101
+ this.dirtyNodes.add(effect);
102
+ this.refresh({ otelHint: 'makeEffect', debugRefreshReason: { _tag: 'makeEffect', label: options?.label } }, parentSpanContext);
103
+ return effect;
104
+ }
105
+ setRef(ref, val, options, parentSpanContext) {
106
+ const { otelHint, skipRefresh, debugRefreshReason } = options ?? {};
107
+ ref.result = val;
108
+ this.dirtyNodes.add(ref);
109
+ if (skipRefresh) {
110
+ const refreshDebugInfo = {
111
+ id: uniqueRefreshInfoId(),
112
+ reason: debugRefreshReason ?? unknownRefreshReason(),
113
+ skippedRefresh: true,
114
+ refreshedAtoms: [],
115
+ durationMs: 0,
116
+ completedTimestamp: Date.now(),
117
+ graphSnapshot: this.getSnapshot(),
118
+ };
119
+ this.debugRefreshInfos.push(refreshDebugInfo);
120
+ return;
121
+ }
122
+ this.refresh({ otelHint, debugRefreshReason }, parentSpanContext);
123
+ }
124
+ setRefs(refs, options, parentSpanContext) {
125
+ const otelHint = options?.otelHint ?? '';
126
+ const skipRefresh = options?.skipRefresh ?? false;
127
+ const debugRefreshReason = options?.debugRefreshReason;
128
+ for (const [ref, val] of refs) {
129
+ ref.result = val;
130
+ this.dirtyNodes.add(ref);
131
+ }
132
+ if (skipRefresh) {
133
+ const refreshDebugInfo = {
134
+ id: uniqueRefreshInfoId(),
135
+ reason: debugRefreshReason ?? unknownRefreshReason(),
136
+ skippedRefresh: true,
137
+ refreshedAtoms: [],
138
+ durationMs: 0,
139
+ completedTimestamp: Date.now(),
140
+ graphSnapshot: this.getSnapshot(),
141
+ };
142
+ this.debugRefreshInfos.push(refreshDebugInfo);
143
+ return;
144
+ }
145
+ this.refresh({ otelHint, debugRefreshReason }, parentSpanContext);
146
+ }
147
+ get(atom, context) {
148
+ // Autotracking: if we're getting the value of an atom,
149
+ // that means it's a subcomputation for the currently refreshing atom.
150
+ this.addEdge(context, atom);
151
+ const dependencyMightBeStale = context._tag !== 'effect' && context.height <= atom.height;
152
+ const dependencyNotRefreshedYet = atom.result === undefined;
153
+ if (dependencyMightBeStale || dependencyNotRefreshedYet) {
154
+ throw new DependencyNotReadyError(`${this.label(context)} referenced dependency ${this.label(atom)} which isn't ready`);
155
+ }
156
+ return atom.result;
157
+ }
158
+ /**
159
+ * Update the graph to be consistent with the current values of the root atoms.
160
+ * Generally we run this after a ref is updated.
161
+ * At the end of the refresh, we run any effects that were scheduled.
162
+ *
163
+ * @param roots Root atoms to start the refresh from
164
+ */
165
+ refresh(options, parentSpanContext) {
166
+ const otelHint = options?.otelHint ?? '';
167
+ const debugRefreshReason = options?.debugRefreshReason;
168
+ const roots = [...this.dirtyNodes];
169
+ const debugInfoForRefreshedAtoms = [];
170
+ // if (otelHint.includes('tableName')) {
171
+ // console.log('refresh', otelHint, { shouldTrace })
172
+ // }
173
+ this.otelTracer.startActiveSpan(`LiveStore.refresh:${otelHint}`, {}, parentSpanContext, (span) => {
174
+ const atomsToRefresh = roots.filter(isAtom);
175
+ const effectsToRun = new Set(roots.filter(isEffect));
176
+ span.setAttribute('livestore.hint', otelHint);
177
+ span.setAttribute('livestore.rootsCount', roots.length);
178
+ // span.setAttribute('sstack', new Error().stack!)
179
+ // Sort in topological order, starting with minimum height
180
+ while (atomsToRefresh.length > 0) {
181
+ atomsToRefresh.sort((a, b) => a.height - b.height);
182
+ const atomToRefresh = atomsToRefresh.shift();
183
+ // Recompute the value
184
+ let resultChanged = false;
185
+ const debugInfoForAtom = {
186
+ atom: serializeAtom(atomToRefresh),
187
+ resultChanged,
188
+ // debugInfo: unknownRefreshReason() as TDebugThunkInfo,
189
+ debugInfo: { _tag: 'unknown' },
190
+ durationMs: 0,
191
+ };
192
+ try {
193
+ atomToRefresh.sub = new Set();
194
+ const beforeTimestamp = performance.now();
195
+ const newResult = atomToRefresh.getResult((atom) => this.get(atom, atomToRefresh), (debugInfo) => {
196
+ debugInfoForAtom.debugInfo = debugInfo;
197
+ });
198
+ const afterTimestamp = performance.now();
199
+ debugInfoForAtom.durationMs = afterTimestamp - beforeTimestamp;
200
+ // Determine if the result changed to do early cutoff and avoid further unnecessary updates.
201
+ // Refs never depend on anything, so if a ref is being refreshed it definitely changed.
202
+ // For thunks, we use a deep equality check.
203
+ resultChanged =
204
+ atomToRefresh._tag === 'ref' ||
205
+ (atomToRefresh._tag === 'thunk' && !atomToRefresh.equal(atomToRefresh.result, newResult));
206
+ if (resultChanged) {
207
+ atomToRefresh.result = newResult;
208
+ }
209
+ this.dirtyNodes.delete(atomToRefresh);
210
+ }
211
+ catch (e) {
212
+ if (e instanceof DependencyNotReadyError) {
213
+ // If we hit a dependency that wasn't ready yet,
214
+ // abort this recomputation and try again later.
215
+ if (!atomsToRefresh.includes(atomToRefresh)) {
216
+ atomsToRefresh.push(atomToRefresh);
217
+ }
218
+ }
219
+ else {
220
+ throw e;
221
+ }
222
+ }
223
+ debugInfoForRefreshedAtoms.push(debugInfoForAtom);
224
+ if (!resultChanged) {
225
+ continue;
226
+ }
227
+ // Schedule supercomputations
228
+ for (const superComp of atomToRefresh.super) {
229
+ switch (superComp._tag) {
230
+ case 'ref':
231
+ case 'thunk': {
232
+ if (!atomsToRefresh.includes(superComp)) {
233
+ atomsToRefresh.push(superComp);
234
+ }
235
+ break;
236
+ }
237
+ case 'effect': {
238
+ effectsToRun.add(superComp);
239
+ break;
240
+ }
241
+ }
242
+ }
243
+ }
244
+ this.effectsWrapper(() => {
245
+ for (const effect of effectsToRun) {
246
+ effect.doEffect((atom) => this.get(atom, effect));
247
+ this.dirtyNodes.delete(effect);
248
+ }
249
+ });
250
+ span.end();
251
+ const spanDurationHr = span._duration;
252
+ const spanDurationMs = spanDurationHr[0] * 1000 + spanDurationHr[1] / 1000000;
253
+ const refreshDebugInfo = {
254
+ id: uniqueRefreshInfoId(),
255
+ reason: debugRefreshReason ?? unknownRefreshReason(),
256
+ refreshedAtoms: debugInfoForRefreshedAtoms,
257
+ skippedRefresh: false,
258
+ durationMs: spanDurationMs,
259
+ completedTimestamp: Date.now(),
260
+ graphSnapshot: this.getSnapshot(),
261
+ };
262
+ this.debugRefreshInfos.push(refreshDebugInfo);
263
+ });
264
+ }
265
+ label(atom) {
266
+ if (atom._tag === 'effect') {
267
+ return `unknown effect`;
268
+ }
269
+ else {
270
+ return atom.label ?? `unknown ${atom._tag}`;
271
+ }
272
+ }
273
+ addEdge(superComp, subComp) {
274
+ superComp.sub.add(subComp);
275
+ subComp.super.add(superComp);
276
+ this.updateAtomHeight(superComp);
277
+ }
278
+ removeEdge(superComp, subComp) {
279
+ superComp.sub.delete(subComp);
280
+ subComp.super.delete(superComp);
281
+ this.updateAtomHeight(superComp);
282
+ }
283
+ updateAtomHeight(atom) {
284
+ switch (atom._tag) {
285
+ case 'ref': {
286
+ atom.height = 0;
287
+ break;
288
+ }
289
+ case 'thunk': {
290
+ atom.height = (max([...atom.sub].map((atom) => atom.height)) || 0) + 1;
291
+ break;
292
+ }
293
+ case 'effect': {
294
+ break;
295
+ }
296
+ }
297
+ }
298
+ }
299
+ const isAtom = (a) => a._tag === 'ref' || a._tag === 'thunk';
300
+ const isEffect = (a) => a._tag === 'effect';
301
+ //# sourceMappingURL=reactive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactive.js","sourceRoot":"","sources":["../src/reactive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import * as otel from '@opentelemetry/api';
2
+ import type { ComponentKey } from '../componentKey.js';
3
+ import type { Store } from '../store.js';
4
+ export type UnsubscribeQuery = () => void;
5
+ export declare abstract class LiveStoreQueryBase {
6
+ /** The key for the associated component */
7
+ componentKey: ComponentKey;
8
+ /** Human-readable label for the query for debugging */
9
+ label: string;
10
+ /** A pointer back to the store containing this query */
11
+ store: Store<any>;
12
+ /** Otel Span is started in LiveStore store but ended in this query */
13
+ otelContext: otel.Context;
14
+ /** The string key is used to identify a subscription from "outside" */
15
+ activeSubscriptions: Map<string, UnsubscribeQuery>;
16
+ constructor({ componentKey, label, store, otelContext, }: {
17
+ componentKey: ComponentKey;
18
+ label: string;
19
+ store: Store<any>;
20
+ otelContext: otel.Context;
21
+ });
22
+ destroy: () => void;
23
+ }
24
+ //# sourceMappingURL=base-class.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-class.d.ts","sourceRoot":"","sources":["../../src/reactiveQueries/base-class.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAExC,MAAM,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAA;AAEzC,8BAAsB,kBAAkB;IACtC,2CAA2C;IAC3C,YAAY,EAAE,YAAY,CAAA;IAC1B,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAA;IACb,wDAAwD;IACxD,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;IACjB,sEAAsE;IACtE,WAAW,EAAE,IAAI,CAAC,OAAO,CAAA;IAEzB,uEAAuE;IACvE,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAY;gBAElD,EACV,YAAY,EACZ,KAAK,EACL,KAAK,EACL,WAAW,GACZ,EAAE;QACD,YAAY,EAAE,YAAY,CAAA;QAC1B,KAAK,EAAE,MAAM,CAAA;QACb,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;QACjB,WAAW,EAAE,IAAI,CAAC,OAAO,CAAA;KAC1B;IAOD,OAAO,aAUN;CACF"}
@@ -0,0 +1,22 @@
1
+ import * as otel from '@opentelemetry/api';
2
+ export class LiveStoreQueryBase {
3
+ constructor({ componentKey, label, store, otelContext, }) {
4
+ /** The string key is used to identify a subscription from "outside" */
5
+ this.activeSubscriptions = new Map();
6
+ this.destroy = () => {
7
+ const span = otel.trace.getSpan(this.otelContext);
8
+ span.end();
9
+ // NOTE usually the `unsubscribe` function is called by `useLiveStoreComponent` but this code path
10
+ // is used for manual store destruction, so we need to manually unsubscribe here
11
+ for (const [_key, unsubscribe] of this.activeSubscriptions) {
12
+ // unsubscribe from the query
13
+ unsubscribe();
14
+ }
15
+ };
16
+ this.componentKey = componentKey;
17
+ this.label = label;
18
+ this.store = store;
19
+ this.otelContext = otelContext;
20
+ }
21
+ }
22
+ //# sourceMappingURL=base-class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-class.js","sourceRoot":"","sources":["../../src/reactiveQueries/base-class.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAO1C,MAAM,OAAgB,kBAAkB;IAatC,YAAY,EACV,YAAY,EACZ,KAAK,EACL,KAAK,EACL,WAAW,GAMZ;QAbD,uEAAuE;QACvE,wBAAmB,GAAkC,IAAI,GAAG,EAAE,CAAA;QAmB9D,YAAO,GAAG,GAAG,EAAE;YACb,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAE,CAAA;YAClD,IAAI,CAAC,GAAG,EAAE,CAAA;YAEV,kGAAkG;YAClG,gFAAgF;YAChF,KAAK,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,IAAI,CAAC,mBAAmB,EAAE;gBAC1D,6BAA6B;gBAC7B,WAAW,EAAE,CAAA;aACd;QACH,CAAC,CAAA;QAhBC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;QAChC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;IAChC,CAAC;CAaF"}
@@ -0,0 +1,25 @@
1
+ import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';
2
+ import type * as otel from '@opentelemetry/api';
3
+ import type { ComponentKey } from '../componentKey.js';
4
+ import type { GetAtom, Thunk } from '../reactive.js';
5
+ import type { BaseGraphQLContext, Store } from '../store.js';
6
+ import { LiveStoreQueryBase } from './base-class.js';
7
+ import type { LiveStoreJSQuery } from './js.js';
8
+ export declare class LiveStoreGraphQLQuery<TResult extends Record<string, any>, VariableValues extends Record<string, any>, TContext extends BaseGraphQLContext> extends LiveStoreQueryBase {
9
+ _tag: 'graphql';
10
+ /** The abstract GraphQL query */
11
+ document: DocumentNode<TResult, VariableValues>;
12
+ /** A reactive thunk representing the query results */
13
+ results$: Thunk<TResult>;
14
+ constructor({ document, results$, ...baseProps }: {
15
+ document: DocumentNode<TResult, VariableValues>;
16
+ context: TContext;
17
+ results$: Thunk<TResult>;
18
+ componentKey: ComponentKey;
19
+ label: string;
20
+ store: Store<TContext>;
21
+ otelContext: otel.Context;
22
+ });
23
+ pipe: <U>(f: (x: TResult, get: GetAtom) => U) => LiveStoreJSQuery<U>;
24
+ }
25
+ //# sourceMappingURL=graphql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql.d.ts","sourceRoot":"","sources":["../../src/reactiveQueries/graphql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,IAAI,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAC1F,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C,qBAAa,qBAAqB,CAChC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACnC,cAAc,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1C,QAAQ,SAAS,kBAAkB,CACnC,SAAQ,kBAAkB;IAC1B,IAAI,EAAE,SAAS,CAAY;IAE3B,iCAAiC;IACjC,QAAQ,EAAE,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;IAE/C,sDAAsD;IACtD,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;gBAEZ,EACV,QAAQ,EACR,QAAQ,EACR,GAAG,SAAS,EACb,EAAE;QACD,QAAQ,EAAE,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;QAC/C,OAAO,EAAE,QAAQ,CAAA;QACjB,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;QACxB,YAAY,EAAE,YAAY,CAAA;QAC1B,KAAK,EAAE,MAAM,CAAA;QACb,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAA;QACtB,WAAW,EAAE,IAAI,CAAC,OAAO,CAAA;KAC1B;IAOD,IAAI,aAAc,OAAO,OAAO,OAAO,+BASpC;CACJ"}
@@ -0,0 +1,14 @@
1
+ import { LiveStoreQueryBase } from './base-class.js';
2
+ export class LiveStoreGraphQLQuery extends LiveStoreQueryBase {
3
+ constructor({ document, results$, ...baseProps }) {
4
+ super(baseProps);
5
+ this._tag = 'graphql';
6
+ this.pipe = (f) => this.store.queryJS((get) => {
7
+ const results = get(this.results$);
8
+ return f(results, get);
9
+ }, this.componentKey, `${this.label}:js`, this.otelContext);
10
+ this.document = document;
11
+ this.results$ = results$;
12
+ }
13
+ }
14
+ //# sourceMappingURL=graphql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql.js","sourceRoot":"","sources":["../../src/reactiveQueries/graphql.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAGpD,MAAM,OAAO,qBAIX,SAAQ,kBAAkB;IAS1B,YAAY,EACV,QAAQ,EACR,QAAQ,EACR,GAAG,SAAS,EASb;QACC,KAAK,CAAC,SAAS,CAAC,CAAA;QArBlB,SAAI,GAAc,SAAS,CAAA;QA2B3B,SAAI,GAAG,CAAI,CAAkC,EAAuB,EAAE,CACpE,IAAI,CAAC,KAAK,CAAC,OAAO,CAChB,CAAC,GAAG,EAAE,EAAE;YACN,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAClC,OAAO,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QACxB,CAAC,EACD,IAAI,CAAC,YAAY,EACjB,GAAG,IAAI,CAAC,KAAK,KAAK,EAClB,IAAI,CAAC,WAAW,CACjB,CAAA;QAbD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;CAYF"}
@@ -0,0 +1,19 @@
1
+ import type * as otel from '@opentelemetry/api';
2
+ import type { ComponentKey } from '../componentKey.js';
3
+ import type { GetAtom, Thunk } from '../reactive.js';
4
+ import type { Store } from '../store.js';
5
+ import { LiveStoreQueryBase } from './base-class.js';
6
+ export declare class LiveStoreJSQuery<TResult> extends LiveStoreQueryBase {
7
+ _tag: 'js';
8
+ /** A reactive thunk representing the query results */
9
+ results$: Thunk<TResult>;
10
+ constructor({ results$, ...baseProps }: {
11
+ results$: Thunk<TResult>;
12
+ componentKey: ComponentKey;
13
+ label: string;
14
+ store: Store<any>;
15
+ otelContext: otel.Context;
16
+ });
17
+ pipe: <U>(f: (x: TResult, get: GetAtom) => U) => LiveStoreJSQuery<U>;
18
+ }
19
+ //# sourceMappingURL=js.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js.d.ts","sourceRoot":"","sources":["../../src/reactiveQueries/js.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAEpD,qBAAa,gBAAgB,CAAC,OAAO,CAAE,SAAQ,kBAAkB;IAC/D,IAAI,EAAE,IAAI,CAAO;IACjB,sDAAsD;IACtD,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;gBAEZ,EACV,QAAQ,EACR,GAAG,SAAS,EACb,EAAE;QACD,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;QACxB,YAAY,EAAE,YAAY,CAAA;QAC1B,KAAK,EAAE,MAAM,CAAA;QACb,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;QACjB,WAAW,EAAE,IAAI,CAAC,OAAO,CAAA;KAC1B;IAMD,IAAI,aAAc,OAAO,OAAO,OAAO,+BASpC;CACJ"}
@@ -0,0 +1,13 @@
1
+ import { LiveStoreQueryBase } from './base-class.js';
2
+ export class LiveStoreJSQuery extends LiveStoreQueryBase {
3
+ constructor({ results$, ...baseProps }) {
4
+ super(baseProps);
5
+ this._tag = 'js';
6
+ this.pipe = (f) => this.store.queryJS((get) => {
7
+ const results = get(this.results$);
8
+ return f(results, get);
9
+ }, this.componentKey, `${this.label}:js`, this.otelContext);
10
+ this.results$ = results$;
11
+ }
12
+ }
13
+ //# sourceMappingURL=js.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js.js","sourceRoot":"","sources":["../../src/reactiveQueries/js.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAEpD,MAAM,OAAO,gBAA0B,SAAQ,kBAAkB;IAK/D,YAAY,EACV,QAAQ,EACR,GAAG,SAAS,EAOb;QACC,KAAK,CAAC,SAAS,CAAC,CAAA;QAdlB,SAAI,GAAS,IAAI,CAAA;QAmBjB,SAAI,GAAG,CAAI,CAAkC,EAAuB,EAAE,CACpE,IAAI,CAAC,KAAK,CAAC,OAAO,CAChB,CAAC,GAAG,EAAE,EAAE;YACN,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAClC,OAAO,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QACxB,CAAC,EACD,IAAI,CAAC,YAAY,EACjB,GAAG,IAAI,CAAC,KAAK,KAAK,EAClB,IAAI,CAAC,WAAW,CACjB,CAAA;QAZD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;CAYF"}
@@ -0,0 +1,31 @@
1
+ import type * as otel from '@opentelemetry/api';
2
+ import type { ComponentKey } from '../componentKey.js';
3
+ import type { GetAtom, Thunk } from '../reactive.js';
4
+ import type { Store } from '../store.js';
5
+ import { LiveStoreQueryBase } from './base-class.js';
6
+ import type { LiveStoreJSQuery } from './js.js';
7
+ export declare class LiveStoreSQLQuery<Row> extends LiveStoreQueryBase {
8
+ _tag: 'sql';
9
+ /** A reactive thunk representing the query text */
10
+ queryString$: Thunk<string>;
11
+ /** A reactive thunk representing the query results */
12
+ results$: Thunk<Row[]>;
13
+ constructor({ queryString$, results$, ...baseProps }: {
14
+ queryString$: Thunk<string>;
15
+ results$: Thunk<Row[]>;
16
+ componentKey: ComponentKey;
17
+ label: string;
18
+ store: Store<any>;
19
+ otelContext: otel.Context;
20
+ });
21
+ /**
22
+ * Returns a new reactive query that contains the result of
23
+ * running an arbitrary JS computation on the results of this SQL query.
24
+ */
25
+ pipe: <U>(f: (result: Row[], get: GetAtom) => U) => LiveStoreJSQuery<U>;
26
+ /** Returns a reactive query */
27
+ getFirstRow: (args?: {
28
+ defaultValue?: Row;
29
+ }) => LiveStoreJSQuery<Row>;
30
+ }
31
+ //# sourceMappingURL=sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/reactiveQueries/sql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAG/C,qBAAa,iBAAiB,CAAC,GAAG,CAAE,SAAQ,kBAAkB;IAC5D,IAAI,EAAE,KAAK,CAAQ;IACnB,mDAAmD;IACnD,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;IAC3B,sDAAsD;IACtD,QAAQ,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAA;gBAEV,EACV,YAAY,EACZ,QAAQ,EACR,GAAG,SAAS,EACb,EAAE;QACD,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;QAC3B,QAAQ,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAA;QACtB,YAAY,EAAE,YAAY,CAAA;QAC1B,KAAK,EAAE,MAAM,CAAA;QACb,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;QACjB,WAAW,EAAE,IAAI,CAAC,OAAO,CAAA;KAC1B;IAOD;;;OAGG;IACH,IAAI,kBAAmB,GAAG,EAAE,OAAO,OAAO,+BASvC;IAEH,gCAAgC;IAChC,WAAW,UAAW;QAAE,YAAY,CAAC,EAAE,GAAG,CAAA;KAAE,2BAazC;CACJ"}
@@ -0,0 +1,28 @@
1
+ import { LiveStoreQueryBase } from './base-class.js';
2
+ /* An object encapsulating a reactive SQL query */
3
+ export class LiveStoreSQLQuery extends LiveStoreQueryBase {
4
+ constructor({ queryString$, results$, ...baseProps }) {
5
+ super(baseProps);
6
+ this._tag = 'sql';
7
+ /**
8
+ * Returns a new reactive query that contains the result of
9
+ * running an arbitrary JS computation on the results of this SQL query.
10
+ */
11
+ this.pipe = (f) => this.store.queryJS((get) => {
12
+ const results = get(this.results$);
13
+ return f(results, get);
14
+ }, this.componentKey, `${this.label}:js`, this.otelContext);
15
+ /** Returns a reactive query */
16
+ this.getFirstRow = (args) => this.store.queryJS((get) => {
17
+ const results = get(this.results$);
18
+ if (results.length === 0 && args?.defaultValue === undefined) {
19
+ const queryLabel = this._tag === 'sql' ? this.queryString$.result : this.label;
20
+ throw new Error(`Expected query ${queryLabel} to return at least one result`);
21
+ }
22
+ return (results[0] ?? args?.defaultValue);
23
+ }, this.componentKey, `${this.label}:first`, this.otelContext);
24
+ this.queryString$ = queryString$;
25
+ this.results$ = results$;
26
+ }
27
+ }
28
+ //# sourceMappingURL=sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/reactiveQueries/sql.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAGpD,kDAAkD;AAClD,MAAM,OAAO,iBAAuB,SAAQ,kBAAkB;IAO5D,YAAY,EACV,YAAY,EACZ,QAAQ,EACR,GAAG,SAAS,EAQb;QACC,KAAK,CAAC,SAAS,CAAC,CAAA;QAlBlB,SAAI,GAAU,KAAK,CAAA;QAwBnB;;;WAGG;QACH,SAAI,GAAG,CAAI,CAAqC,EAAuB,EAAE,CACvE,IAAI,CAAC,KAAK,CAAC,OAAO,CAChB,CAAC,GAAG,EAAE,EAAE;YACN,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAClC,OAAO,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QACxB,CAAC,EACD,IAAI,CAAC,YAAY,EACjB,GAAG,IAAI,CAAC,KAAK,KAAK,EAClB,IAAI,CAAC,WAAW,CACjB,CAAA;QAEH,gCAAgC;QAChC,gBAAW,GAAG,CAAC,IAA6B,EAAE,EAAE,CAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAChB,CAAC,GAAG,EAAE,EAAE;YACN,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAClC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,EAAE,YAAY,KAAK,SAAS,EAAE;gBAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAA;gBAC9E,MAAM,IAAI,KAAK,CAAC,kBAAkB,UAAU,gCAAgC,CAAC,CAAA;aAC9E;YACD,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,YAAY,CAAQ,CAAA;QAClD,CAAC,EACD,IAAI,CAAC,YAAY,EACjB,GAAG,IAAI,CAAC,KAAK,QAAQ,EACrB,IAAI,CAAC,WAAW,CACjB,CAAA;QAjCD,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;QAChC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;CAgCF"}