@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.
- package/README.md +7 -7
- package/dist/.tsbuildinfo +1 -0
- package/dist/QueryCache.d.ts +20 -0
- package/dist/QueryCache.d.ts.map +1 -0
- package/dist/QueryCache.js +71 -0
- package/dist/QueryCache.js.map +1 -0
- package/dist/__tests__/react/fixture.d.ts +25 -0
- package/dist/__tests__/react/fixture.d.ts.map +1 -0
- package/dist/__tests__/react/fixture.js +60 -0
- package/dist/__tests__/react/fixture.js.map +1 -0
- package/dist/__tests__/react/useLiveStoreComponent.test.d.ts +2 -0
- package/dist/__tests__/react/useLiveStoreComponent.test.d.ts.map +1 -0
- package/dist/__tests__/react/useLiveStoreComponent.test.js +78 -0
- package/dist/__tests__/react/useLiveStoreComponent.test.js.map +1 -0
- package/dist/__tests__/reactive.test.d.ts +2 -0
- package/dist/__tests__/reactive.test.d.ts.map +1 -0
- package/dist/__tests__/reactive.test.js +197 -0
- package/dist/__tests__/reactive.test.js.map +1 -0
- package/dist/bounded-collections.d.ts +34 -0
- package/dist/bounded-collections.d.ts.map +1 -0
- package/dist/bounded-collections.js +103 -0
- package/dist/bounded-collections.js.map +1 -0
- package/dist/componentKey.d.ts +20 -0
- package/dist/componentKey.d.ts.map +1 -0
- package/dist/componentKey.js +3 -0
- package/dist/componentKey.js.map +1 -0
- package/dist/effect/LiveStore.d.ts +36 -0
- package/dist/effect/LiveStore.d.ts.map +1 -0
- package/dist/effect/LiveStore.js +41 -0
- package/dist/effect/LiveStore.js.map +1 -0
- package/dist/effect/index.d.ts +2 -0
- package/dist/effect/index.d.ts.map +1 -0
- package/dist/effect/index.js +2 -0
- package/dist/effect/index.js.map +1 -0
- package/dist/events.d.ts +7 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +2 -0
- package/dist/events.js.map +1 -0
- package/dist/inMemoryDatabase.d.ts +56 -0
- package/dist/inMemoryDatabase.d.ts.map +1 -0
- package/dist/inMemoryDatabase.js +223 -0
- package/dist/inMemoryDatabase.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/migrations.d.ts +16 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +67 -0
- package/dist/migrations.js.map +1 -0
- package/dist/otel.d.ts +4 -0
- package/dist/otel.d.ts.map +1 -0
- package/dist/otel.js +6 -0
- package/dist/otel.js.map +1 -0
- package/dist/react/LiveStoreContext.d.ts +11 -0
- package/dist/react/LiveStoreContext.d.ts.map +1 -0
- package/dist/react/LiveStoreContext.js +10 -0
- package/dist/react/LiveStoreContext.js.map +1 -0
- package/dist/react/LiveStoreProvider.d.ts +20 -0
- package/dist/react/LiveStoreProvider.d.ts.map +1 -0
- package/dist/react/LiveStoreProvider.js +52 -0
- package/dist/react/LiveStoreProvider.js.map +1 -0
- package/dist/react/index.d.ts +8 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +6 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/useGraphQL.d.ts +13 -0
- package/dist/react/useGraphQL.d.ts.map +1 -0
- package/dist/react/useGraphQL.js +85 -0
- package/dist/react/useGraphQL.js.map +1 -0
- package/dist/react/useLiveStoreComponent.d.ts +75 -0
- package/dist/react/useLiveStoreComponent.d.ts.map +1 -0
- package/dist/react/useLiveStoreComponent.js +317 -0
- package/dist/react/useLiveStoreComponent.js.map +1 -0
- package/dist/react/useQuery.d.ts +3 -0
- package/dist/react/useQuery.d.ts.map +1 -0
- package/dist/react/useQuery.js +38 -0
- package/dist/react/useQuery.js.map +1 -0
- package/dist/react/utils/useStateRefWithReactiveInput.d.ts +13 -0
- package/dist/react/utils/useStateRefWithReactiveInput.d.ts.map +1 -0
- package/dist/react/utils/useStateRefWithReactiveInput.js +38 -0
- package/dist/react/utils/useStateRefWithReactiveInput.js.map +1 -0
- package/dist/reactive.d.ts +140 -0
- package/dist/reactive.d.ts.map +1 -0
- package/dist/reactive.js +302 -0
- package/dist/reactive.js.map +1 -0
- package/dist/reactiveQueries/base-class.d.ts +27 -0
- package/dist/reactiveQueries/base-class.d.ts.map +1 -0
- package/dist/reactiveQueries/base-class.js +23 -0
- package/dist/reactiveQueries/base-class.js.map +1 -0
- package/dist/reactiveQueries/graphql.d.ts +25 -0
- package/dist/reactiveQueries/graphql.d.ts.map +1 -0
- package/dist/reactiveQueries/graphql.js +18 -0
- package/dist/reactiveQueries/graphql.js.map +1 -0
- package/dist/reactiveQueries/js.d.ts +19 -0
- package/dist/reactiveQueries/js.d.ts.map +1 -0
- package/dist/reactiveQueries/js.js +13 -0
- package/dist/reactiveQueries/js.js.map +1 -0
- package/dist/reactiveQueries/sql.d.ts +31 -0
- package/dist/reactiveQueries/sql.d.ts.map +1 -0
- package/dist/reactiveQueries/sql.js +32 -0
- package/dist/reactiveQueries/sql.js.map +1 -0
- package/dist/schema.d.ts +81 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +46 -0
- package/dist/schema.js.map +1 -0
- package/dist/storage/in-memory/index.d.ts +15 -0
- package/dist/storage/in-memory/index.d.ts.map +1 -0
- package/dist/storage/in-memory/index.js +14 -0
- package/dist/storage/in-memory/index.js.map +1 -0
- package/dist/storage/index.d.ts +14 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +9 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/tauri/index.d.ts +19 -0
- package/dist/storage/tauri/index.d.ts.map +1 -0
- package/dist/storage/tauri/index.js +38 -0
- package/dist/storage/tauri/index.js.map +1 -0
- package/dist/storage/utils/idb.d.ts +10 -0
- package/dist/storage/utils/idb.d.ts.map +1 -0
- package/dist/storage/utils/idb.js +58 -0
- package/dist/storage/utils/idb.js.map +1 -0
- package/dist/storage/web-worker/index.d.ts +27 -0
- package/dist/storage/web-worker/index.d.ts.map +1 -0
- package/dist/storage/web-worker/index.js +74 -0
- package/dist/storage/web-worker/index.js.map +1 -0
- package/dist/storage/web-worker/worker.d.ts +13 -0
- package/dist/storage/web-worker/worker.d.ts.map +1 -0
- package/dist/storage/web-worker/worker.js +110 -0
- package/dist/storage/web-worker/worker.js.map +1 -0
- package/dist/store.d.ts +199 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +603 -0
- package/dist/store.js.map +1 -0
- package/dist/util.d.ts +28 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +55 -0
- package/dist/util.js.map +1 -0
- package/package.json +46 -19
- package/src/__tests__/react/fixture.tsx +23 -32
- package/src/__tests__/reactive.test.ts +3 -4
- package/src/effect/LiveStore.ts +22 -31
- package/src/events.ts +1 -1
- package/src/inMemoryDatabase.ts +115 -140
- package/src/index.ts +20 -20
- package/src/migrations.ts +119 -0
- package/src/otel.ts +0 -11
- package/src/react/LiveStoreProvider.tsx +24 -23
- package/src/react/index.ts +10 -1
- package/src/react/useGraphQL.ts +28 -2
- package/src/react/useLiveStoreComponent.ts +134 -50
- package/src/react/useQuery.ts +56 -0
- package/src/reactive.ts +6 -4
- package/src/reactiveQueries/base-class.ts +9 -3
- package/src/reactiveQueries/graphql.ts +4 -4
- package/src/reactiveQueries/js.ts +2 -2
- package/src/reactiveQueries/sql.ts +6 -6
- package/src/schema.ts +69 -145
- package/src/storage/in-memory/index.ts +21 -0
- package/src/storage/index.ts +27 -0
- package/src/{backends/tauri.ts → storage/tauri/index.ts} +14 -28
- package/src/storage/web-worker/index.ts +116 -0
- package/src/{backends/web-worker.ts → storage/web-worker/worker.ts} +17 -52
- package/src/store.ts +171 -98
- package/src/util.ts +13 -3
- package/tsconfig.json +1 -3
- package/src/backends/base.ts +0 -67
- package/src/backends/index.ts +0 -98
- package/src/backends/noop.ts +0 -32
- package/src/backends/web-in-memory.ts +0 -65
- package/src/backends/web.ts +0 -97
- package/src/react/useGlobalQuery.ts +0 -40
- /package/src/{backends → storage}/utils/idb.ts +0 -0
package/dist/reactive.js
ADDED
|
@@ -0,0 +1,302 @@
|
|
|
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
|
+
const NOT_REFRESHED_YET = Symbol.for('NOT_REFRESHED_YET');
|
|
6
|
+
class DependencyNotReadyError extends Error {
|
|
7
|
+
constructor(message) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.name = 'DependencyNotReadyError';
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export const unknownRefreshReason = () => {
|
|
13
|
+
debugger;
|
|
14
|
+
return { _tag: 'unknown' };
|
|
15
|
+
};
|
|
16
|
+
const uniqueNodeId = () => uniqueId('node-');
|
|
17
|
+
const uniqueRefreshInfoId = () => uniqueId('refresh-info-');
|
|
18
|
+
const serializeAtom = (atom) => ({
|
|
19
|
+
...pick(atom, ['_tag', 'height', 'id', 'label', 'meta', 'result']),
|
|
20
|
+
sub: Array.from(atom.sub).map((a) => a.id),
|
|
21
|
+
super: Array.from(atom.super).map((a) => a.id),
|
|
22
|
+
});
|
|
23
|
+
const serializeEffect = (effect) => pick(effect, ['_tag', 'id']);
|
|
24
|
+
export class ReactiveGraph {
|
|
25
|
+
constructor(options) {
|
|
26
|
+
this.atoms = new Set();
|
|
27
|
+
this.effects = new Set();
|
|
28
|
+
this.dirtyNodes = new Set();
|
|
29
|
+
this.debugRefreshInfos = new BoundArray(5000);
|
|
30
|
+
this.getSnapshot = () => ({
|
|
31
|
+
atoms: Array.from(this.atoms).map(serializeAtom),
|
|
32
|
+
effects: Array.from(this.effects).map(serializeEffect),
|
|
33
|
+
dirtyNodes: Array.from(this.dirtyNodes).map((a) => a.id),
|
|
34
|
+
});
|
|
35
|
+
this.effectsWrapper = options?.effectsWrapper ?? ((runEffects) => runEffects());
|
|
36
|
+
this.otelTracer = options.otelTracer;
|
|
37
|
+
}
|
|
38
|
+
makeRef(val, options) {
|
|
39
|
+
const ref = {
|
|
40
|
+
_tag: 'ref',
|
|
41
|
+
id: uniqueNodeId(),
|
|
42
|
+
result: val,
|
|
43
|
+
height: 0,
|
|
44
|
+
getResult: () => ref.result,
|
|
45
|
+
sub: new Set(),
|
|
46
|
+
super: new Set(),
|
|
47
|
+
label: options?.label,
|
|
48
|
+
meta: options?.meta,
|
|
49
|
+
equal: options?.equal ?? isEqual,
|
|
50
|
+
};
|
|
51
|
+
this.atoms.add(ref);
|
|
52
|
+
return ref;
|
|
53
|
+
}
|
|
54
|
+
makeThunk(getResult, options, otelContext) {
|
|
55
|
+
const thunk = {
|
|
56
|
+
_tag: 'thunk',
|
|
57
|
+
id: uniqueNodeId(),
|
|
58
|
+
result: NOT_REFRESHED_YET,
|
|
59
|
+
height: 0,
|
|
60
|
+
getResult,
|
|
61
|
+
sub: new Set(),
|
|
62
|
+
super: new Set(),
|
|
63
|
+
label: options?.label,
|
|
64
|
+
meta: options?.meta,
|
|
65
|
+
equal: options?.equal ?? isEqual,
|
|
66
|
+
};
|
|
67
|
+
this.atoms.add(thunk);
|
|
68
|
+
this.dirtyNodes.add(thunk);
|
|
69
|
+
this.refresh({
|
|
70
|
+
otelHint: options?.label ?? 'makeThunk',
|
|
71
|
+
debugRefreshReason: options?.debugRefreshReason ?? { _tag: 'makeThunk', label: options?.label },
|
|
72
|
+
}, otelContext);
|
|
73
|
+
// Manually tell the typesystem this thunk is guaranteed to have a result at this point
|
|
74
|
+
return thunk;
|
|
75
|
+
}
|
|
76
|
+
destroy(node) {
|
|
77
|
+
// Recursively destroy any supercomputations
|
|
78
|
+
if (node._tag === 'ref' || node._tag === 'thunk') {
|
|
79
|
+
for (const superComp of node.super) {
|
|
80
|
+
this.destroy(superComp);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Destroy this node
|
|
84
|
+
for (const subComp of node.sub) {
|
|
85
|
+
this.removeEdge(node, subComp);
|
|
86
|
+
}
|
|
87
|
+
if (node._tag === 'effect') {
|
|
88
|
+
this.effects.delete(node);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
this.atoms.delete(node);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
makeEffect(doEffect, options, otelContext) {
|
|
95
|
+
const effect = {
|
|
96
|
+
_tag: 'effect',
|
|
97
|
+
id: uniqueNodeId(),
|
|
98
|
+
doEffect,
|
|
99
|
+
sub: new Set(),
|
|
100
|
+
};
|
|
101
|
+
this.effects.add(effect);
|
|
102
|
+
this.dirtyNodes.add(effect);
|
|
103
|
+
this.refresh({ otelHint: 'makeEffect', debugRefreshReason: { _tag: 'makeEffect', label: options?.label } }, otelContext);
|
|
104
|
+
return effect;
|
|
105
|
+
}
|
|
106
|
+
setRef(ref, val, options, otelContext) {
|
|
107
|
+
const { otelHint, skipRefresh, debugRefreshReason } = options ?? {};
|
|
108
|
+
ref.result = val;
|
|
109
|
+
this.dirtyNodes.add(ref);
|
|
110
|
+
if (skipRefresh) {
|
|
111
|
+
const refreshDebugInfo = {
|
|
112
|
+
id: uniqueRefreshInfoId(),
|
|
113
|
+
reason: debugRefreshReason ?? unknownRefreshReason(),
|
|
114
|
+
skippedRefresh: true,
|
|
115
|
+
refreshedAtoms: [],
|
|
116
|
+
durationMs: 0,
|
|
117
|
+
completedTimestamp: Date.now(),
|
|
118
|
+
graphSnapshot: this.getSnapshot(),
|
|
119
|
+
};
|
|
120
|
+
this.debugRefreshInfos.push(refreshDebugInfo);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
this.refresh({ otelHint, debugRefreshReason }, otelContext);
|
|
124
|
+
}
|
|
125
|
+
setRefs(refs, options, otelContext) {
|
|
126
|
+
const otelHint = options?.otelHint ?? '';
|
|
127
|
+
const skipRefresh = options?.skipRefresh ?? false;
|
|
128
|
+
const debugRefreshReason = options?.debugRefreshReason;
|
|
129
|
+
for (const [ref, val] of refs) {
|
|
130
|
+
ref.result = val;
|
|
131
|
+
this.dirtyNodes.add(ref);
|
|
132
|
+
}
|
|
133
|
+
if (skipRefresh) {
|
|
134
|
+
const refreshDebugInfo = {
|
|
135
|
+
id: uniqueRefreshInfoId(),
|
|
136
|
+
reason: debugRefreshReason ?? unknownRefreshReason(),
|
|
137
|
+
skippedRefresh: true,
|
|
138
|
+
refreshedAtoms: [],
|
|
139
|
+
durationMs: 0,
|
|
140
|
+
completedTimestamp: Date.now(),
|
|
141
|
+
graphSnapshot: this.getSnapshot(),
|
|
142
|
+
};
|
|
143
|
+
this.debugRefreshInfos.push(refreshDebugInfo);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
this.refresh({ otelHint, debugRefreshReason }, otelContext);
|
|
147
|
+
}
|
|
148
|
+
get(atom, context) {
|
|
149
|
+
// Autotracking: if we're getting the value of an atom,
|
|
150
|
+
// that means it's a subcomputation for the currently refreshing atom.
|
|
151
|
+
this.addEdge(context, atom);
|
|
152
|
+
const dependencyMightBeStale = context._tag !== 'effect' && context.height <= atom.height;
|
|
153
|
+
const dependencyNotRefreshedYet = atom.result === NOT_REFRESHED_YET;
|
|
154
|
+
if (dependencyMightBeStale || dependencyNotRefreshedYet) {
|
|
155
|
+
throw new DependencyNotReadyError(`${this.label(context)} referenced dependency ${this.label(atom)} which isn't ready`);
|
|
156
|
+
}
|
|
157
|
+
return atom.result;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Update the graph to be consistent with the current values of the root atoms.
|
|
161
|
+
* Generally we run this after a ref is updated.
|
|
162
|
+
* At the end of the refresh, we run any effects that were scheduled.
|
|
163
|
+
*
|
|
164
|
+
* @param roots Root atoms to start the refresh from
|
|
165
|
+
*/
|
|
166
|
+
refresh(options, otelContext) {
|
|
167
|
+
const otelHint = options?.otelHint ?? '';
|
|
168
|
+
const debugRefreshReason = options?.debugRefreshReason;
|
|
169
|
+
const roots = [...this.dirtyNodes];
|
|
170
|
+
const debugInfoForRefreshedAtoms = [];
|
|
171
|
+
// if (otelHint.includes('tableName')) {
|
|
172
|
+
// console.log('refresh', otelHint, { shouldTrace })
|
|
173
|
+
// }
|
|
174
|
+
this.otelTracer.startActiveSpan(`LiveStore.refresh:${otelHint}`, {}, otelContext, (span) => {
|
|
175
|
+
const atomsToRefresh = roots.filter(isAtom);
|
|
176
|
+
const effectsToRun = new Set(roots.filter(isEffect));
|
|
177
|
+
span.setAttribute('livestore.hint', otelHint);
|
|
178
|
+
span.setAttribute('livestore.rootsCount', roots.length);
|
|
179
|
+
// span.setAttribute('sstack', new Error().stack!)
|
|
180
|
+
// Sort in topological order, starting with minimum height
|
|
181
|
+
while (atomsToRefresh.length > 0) {
|
|
182
|
+
atomsToRefresh.sort((a, b) => a.height - b.height);
|
|
183
|
+
const atomToRefresh = atomsToRefresh.shift();
|
|
184
|
+
// Recompute the value
|
|
185
|
+
let resultChanged = false;
|
|
186
|
+
const debugInfoForAtom = {
|
|
187
|
+
atom: serializeAtom(atomToRefresh),
|
|
188
|
+
resultChanged,
|
|
189
|
+
// debugInfo: unknownRefreshReason() as TDebugThunkInfo,
|
|
190
|
+
debugInfo: { _tag: 'unknown' },
|
|
191
|
+
durationMs: 0,
|
|
192
|
+
};
|
|
193
|
+
try {
|
|
194
|
+
atomToRefresh.sub = new Set();
|
|
195
|
+
const beforeTimestamp = performance.now();
|
|
196
|
+
const newResult = atomToRefresh.getResult((atom) => this.get(atom, atomToRefresh), (debugInfo) => {
|
|
197
|
+
debugInfoForAtom.debugInfo = debugInfo;
|
|
198
|
+
});
|
|
199
|
+
const afterTimestamp = performance.now();
|
|
200
|
+
debugInfoForAtom.durationMs = afterTimestamp - beforeTimestamp;
|
|
201
|
+
// Determine if the result changed to do early cutoff and avoid further unnecessary updates.
|
|
202
|
+
// Refs never depend on anything, so if a ref is being refreshed it definitely changed.
|
|
203
|
+
// For thunks, we use a deep equality check.
|
|
204
|
+
resultChanged =
|
|
205
|
+
atomToRefresh._tag === 'ref' ||
|
|
206
|
+
(atomToRefresh._tag === 'thunk' && !atomToRefresh.equal(atomToRefresh.result, newResult));
|
|
207
|
+
if (resultChanged) {
|
|
208
|
+
atomToRefresh.result = newResult;
|
|
209
|
+
}
|
|
210
|
+
this.dirtyNodes.delete(atomToRefresh);
|
|
211
|
+
}
|
|
212
|
+
catch (e) {
|
|
213
|
+
if (e instanceof DependencyNotReadyError) {
|
|
214
|
+
// If we hit a dependency that wasn't ready yet,
|
|
215
|
+
// abort this recomputation and try again later.
|
|
216
|
+
if (!atomsToRefresh.includes(atomToRefresh)) {
|
|
217
|
+
atomsToRefresh.push(atomToRefresh);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
throw e;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
debugInfoForRefreshedAtoms.push(debugInfoForAtom);
|
|
225
|
+
if (!resultChanged) {
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
// Schedule supercomputations
|
|
229
|
+
for (const superComp of atomToRefresh.super) {
|
|
230
|
+
switch (superComp._tag) {
|
|
231
|
+
case 'ref':
|
|
232
|
+
case 'thunk': {
|
|
233
|
+
if (!atomsToRefresh.includes(superComp)) {
|
|
234
|
+
atomsToRefresh.push(superComp);
|
|
235
|
+
}
|
|
236
|
+
break;
|
|
237
|
+
}
|
|
238
|
+
case 'effect': {
|
|
239
|
+
effectsToRun.add(superComp);
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
this.effectsWrapper(() => {
|
|
246
|
+
for (const effect of effectsToRun) {
|
|
247
|
+
effect.doEffect((atom) => this.get(atom, effect));
|
|
248
|
+
this.dirtyNodes.delete(effect);
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
span.end();
|
|
252
|
+
const spanDurationHr = span._duration;
|
|
253
|
+
const spanDurationMs = spanDurationHr[0] * 1000 + spanDurationHr[1] / 1000000;
|
|
254
|
+
const refreshDebugInfo = {
|
|
255
|
+
id: uniqueRefreshInfoId(),
|
|
256
|
+
reason: debugRefreshReason ?? unknownRefreshReason(),
|
|
257
|
+
refreshedAtoms: debugInfoForRefreshedAtoms,
|
|
258
|
+
skippedRefresh: false,
|
|
259
|
+
durationMs: spanDurationMs,
|
|
260
|
+
completedTimestamp: Date.now(),
|
|
261
|
+
graphSnapshot: this.getSnapshot(),
|
|
262
|
+
};
|
|
263
|
+
this.debugRefreshInfos.push(refreshDebugInfo);
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
label(atom) {
|
|
267
|
+
if (atom._tag === 'effect') {
|
|
268
|
+
return `unknown effect`;
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
return atom.label ?? `unknown ${atom._tag}`;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
addEdge(superComp, subComp) {
|
|
275
|
+
superComp.sub.add(subComp);
|
|
276
|
+
subComp.super.add(superComp);
|
|
277
|
+
this.updateAtomHeight(superComp);
|
|
278
|
+
}
|
|
279
|
+
removeEdge(superComp, subComp) {
|
|
280
|
+
superComp.sub.delete(subComp);
|
|
281
|
+
subComp.super.delete(superComp);
|
|
282
|
+
this.updateAtomHeight(superComp);
|
|
283
|
+
}
|
|
284
|
+
updateAtomHeight(atom) {
|
|
285
|
+
switch (atom._tag) {
|
|
286
|
+
case 'ref': {
|
|
287
|
+
atom.height = 0;
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
case 'thunk': {
|
|
291
|
+
atom.height = (max([...atom.sub].map((atom) => atom.height)) || 0) + 1;
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
case 'effect': {
|
|
295
|
+
break;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
const isAtom = (a) => a._tag === 'ref' || a._tag === 'thunk';
|
|
301
|
+
const isEffect = (a) => a._tag === 'effect';
|
|
302
|
+
//# 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,27 @@
|
|
|
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<TResult> {
|
|
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;
|
|
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;
|
|
20
|
+
otelContext: otel.Context;
|
|
21
|
+
});
|
|
22
|
+
destroy: () => void;
|
|
23
|
+
subscribe: (onNewValue: (value: TResult) => void, onSubsubscribe?: () => void, options?: {
|
|
24
|
+
label?: string;
|
|
25
|
+
} | undefined) => (() => void);
|
|
26
|
+
}
|
|
27
|
+
//# 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,CAAC,OAAO;IAC9C,2CAA2C;IAC3C,YAAY,EAAE,YAAY,CAAA;IAC1B,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAA;IACb,wDAAwD;IACxD,KAAK,EAAE,KAAK,CAAA;IACZ,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,CAAA;QACZ,WAAW,EAAE,IAAI,CAAC,OAAO,CAAA;KAC1B;IAOD,OAAO,aAUN;IAED,SAAS,uBACa,OAAO,KAAK,IAAI,mBACnB,MAAM,IAAI,YACjB;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,KACvC,CAAC,MAAM,IAAI,CAAC,CAAiF;CACjG"}
|
|
@@ -0,0 +1,23 @@
|
|
|
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.subscribe = (onNewValue, onSubsubscribe, options) => this.store.subscribe(this, onNewValue, onSubsubscribe, options);
|
|
17
|
+
this.componentKey = componentKey;
|
|
18
|
+
this.label = label;
|
|
19
|
+
this.store = store;
|
|
20
|
+
this.otelContext = otelContext;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# 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;QAED,cAAS,GAAG,CACV,UAAoC,EACpC,cAA2B,EAC3B,OAAwC,EAC1B,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAW,EAAE,UAAiB,EAAE,cAAc,EAAE,OAAO,CAAC,CAAA;QAtB9F,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;CAmBF"}
|
|
@@ -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 { Thunk } from '../reactive.js';
|
|
5
|
+
import type { BaseGraphQLContext, GetAtomResult, 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<TResult> {
|
|
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: GetAtomResult) => 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,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAC3E,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,CAAC,OAAO,CAAC;IACnC,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,aAAa,+BAW1C;CACJ"}
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
+
}, {
|
|
10
|
+
componentKey: this.componentKey,
|
|
11
|
+
label: `${this.label}:js`,
|
|
12
|
+
otelContext: this.otelContext,
|
|
13
|
+
});
|
|
14
|
+
this.document = document;
|
|
15
|
+
this.results$ = results$;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# 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,kBAA2B;IASnC,YAAY,EACV,QAAQ,EACR,QAAQ,EACR,GAAG,SAAS,EASb;QACC,KAAK,CAAC,SAAS,CAAC,CAAA;QArBlB,SAAI,GAAc,SAAS,CAAA;QA2B3B,SAAI,GAAG,CAAI,CAAwC,EAAuB,EAAE,CAC1E,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;YACE,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,KAAK;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CACF,CAAA;QAfD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;CAcF"}
|
|
@@ -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<TResult> {
|
|
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;
|
|
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,CAAC,OAAO,CAAC;IACxE,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,CAAA;QACZ,WAAW,EAAE,IAAI,CAAC,OAAO,CAAA;KAC1B;IAMD,IAAI,aAAc,OAAO,OAAO,OAAO,+BAOpC;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
|
+
}, { componentKey: this.componentKey, label: `${this.label}:js`, otelContext: 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,kBAA2B;IAKxE,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,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAC9F,CAAA;QAVD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;CAUF"}
|
|
@@ -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<Row> {
|
|
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<ReadonlyArray<Row>>;
|
|
13
|
+
constructor({ queryString$, results$, ...baseProps }: {
|
|
14
|
+
queryString$: Thunk<string>;
|
|
15
|
+
results$: Thunk<ReadonlyArray<Row>>;
|
|
16
|
+
componentKey: ComponentKey;
|
|
17
|
+
label: string;
|
|
18
|
+
store: Store;
|
|
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>(fn: (result: ReadonlyArray<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,CAAC,GAAG,CAAC;IACjE,IAAI,EAAE,KAAK,CAAQ;IACnB,mDAAmD;IACnD,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;IAC3B,sDAAsD;IACtD,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAA;gBAEvB,EACV,YAAY,EACZ,QAAQ,EACR,GAAG,SAAS,EACb,EAAE;QACD,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;QAC3B,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAA;QACnC,YAAY,EAAE,YAAY,CAAA;QAC1B,KAAK,EAAE,MAAM,CAAA;QACb,KAAK,EAAE,KAAK,CAAA;QACZ,WAAW,EAAE,IAAI,CAAC,OAAO,CAAA;KAC1B;IAOD;;;OAGG;IACH,IAAI,mBAAoB,cAAc,GAAG,CAAC,OAAO,OAAO,+BAWrD;IAEH,gCAAgC;IAChC,WAAW,UAAW;QAAE,YAAY,CAAC,EAAE,GAAG,CAAA;KAAE,2BAWzC;CACJ"}
|
|
@@ -0,0 +1,32 @@
|
|
|
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 = (fn) => this.store.queryJS((get) => {
|
|
12
|
+
const results = get(this.results$);
|
|
13
|
+
return fn(results, get);
|
|
14
|
+
}, {
|
|
15
|
+
componentKey: this.componentKey,
|
|
16
|
+
label: `${this.label}:js`,
|
|
17
|
+
otelContext: this.otelContext,
|
|
18
|
+
});
|
|
19
|
+
/** Returns a reactive query */
|
|
20
|
+
this.getFirstRow = (args) => this.store.queryJS((get) => {
|
|
21
|
+
const results = get(this.results$);
|
|
22
|
+
if (results.length === 0 && args?.defaultValue === undefined) {
|
|
23
|
+
const queryLabel = this._tag === 'sql' ? this.queryString$.result : this.label;
|
|
24
|
+
throw new Error(`Expected query ${queryLabel} to return at least one result`);
|
|
25
|
+
}
|
|
26
|
+
return (results[0] ?? args?.defaultValue);
|
|
27
|
+
}, { componentKey: this.componentKey, label: `${this.label}:first`, otelContext: this.otelContext });
|
|
28
|
+
this.queryString$ = queryString$;
|
|
29
|
+
this.results$ = results$;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# 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,kBAAuB;IAOjE,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,EAAmD,EAAuB,EAAE,CACrF,IAAI,CAAC,KAAK,CAAC,OAAO,CAChB,CAAC,GAAG,EAAE,EAAE;YACN,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAClC,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QACzB,CAAC,EACD;YACE,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,KAAK;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CACF,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,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CACjG,CAAA;QAjCD,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;QAChC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;CAgCF"}
|
package/dist/schema.d.ts
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { PrettifyFlat } from '@livestore/utils';
|
|
2
|
+
import type { Schema } from '@livestore/utils/effect';
|
|
3
|
+
import type { SqliteAst } from 'effect-db-schema';
|
|
4
|
+
import { SqliteDsl } from 'effect-db-schema';
|
|
5
|
+
export type Index = {
|
|
6
|
+
name: string;
|
|
7
|
+
columns: string[];
|
|
8
|
+
/** @default false */
|
|
9
|
+
isUnique?: boolean;
|
|
10
|
+
};
|
|
11
|
+
export declare const componentStateTables: {
|
|
12
|
+
[key: string]: SqliteAst.Table;
|
|
13
|
+
};
|
|
14
|
+
export type InputSchema = {
|
|
15
|
+
tables: {
|
|
16
|
+
[tableName: string]: SqliteDsl.TableDefinition<any, any>;
|
|
17
|
+
};
|
|
18
|
+
materializedViews?: MaterializedViewDefinitions;
|
|
19
|
+
actions: ActionDefinitions<any>;
|
|
20
|
+
};
|
|
21
|
+
export declare const makeSchema: <TSchema extends InputSchema>(schema: TSchema) => Schema;
|
|
22
|
+
export type ComponentStateSchema = SqliteDsl.TableDefinition<any, any> & {
|
|
23
|
+
register: () => void;
|
|
24
|
+
};
|
|
25
|
+
export declare const defineComponentStateSchema: <TName extends string, TColumns extends SqliteDsl.Columns>(name: TName, columns: TColumns) => SqliteDsl.TableDefinition<`components__${TName}`, PrettifyFlat<TColumns & {
|
|
26
|
+
id: SqliteDsl.ColumnDefinition<SqliteDsl.FieldType.FieldTypeText<string, string>, false>;
|
|
27
|
+
}>>;
|
|
28
|
+
export type SQLWriteStatement = {
|
|
29
|
+
sql: string;
|
|
30
|
+
/** Tables written by the statement */
|
|
31
|
+
writeTables: string[];
|
|
32
|
+
argsAlreadyBound?: boolean;
|
|
33
|
+
};
|
|
34
|
+
export type ActionDefinition<TArgs = any> = {
|
|
35
|
+
statement: SQLWriteStatement | ((args: TArgs) => SQLWriteStatement);
|
|
36
|
+
prepareBindValues?: (args: TArgs) => any;
|
|
37
|
+
};
|
|
38
|
+
export type Schema = {
|
|
39
|
+
tables: TableDefinitions;
|
|
40
|
+
materializedViews: MaterializedViewDefinitions;
|
|
41
|
+
actions: ActionDefinitions<any>;
|
|
42
|
+
};
|
|
43
|
+
export type TableDefinitions = {
|
|
44
|
+
[key: string]: SqliteAst.Table;
|
|
45
|
+
};
|
|
46
|
+
export type MaterializedViewDefinitions = {
|
|
47
|
+
[key: string]: {};
|
|
48
|
+
};
|
|
49
|
+
export type ActionDefinitions<TArgsMap extends Record<string, any>> = {
|
|
50
|
+
[key in keyof TArgsMap]: ActionDefinition<TArgsMap[key]>;
|
|
51
|
+
};
|
|
52
|
+
export declare const SCHEMA_META_TABLE = "__livestore_schema";
|
|
53
|
+
declare const schemaMetaTable: SqliteDsl.TableDefinition<"__livestore_schema", {
|
|
54
|
+
tableName: SqliteDsl.ColumnDefinition<SqliteDsl.FieldType.FieldTypeText<string, string>, false>;
|
|
55
|
+
schemaHash: SqliteDsl.ColumnDefinition<SqliteDsl.FieldType.FieldTypeInteger, false>;
|
|
56
|
+
/** ISO date format */
|
|
57
|
+
updatedAt: SqliteDsl.ColumnDefinition<SqliteDsl.FieldType.FieldTypeText<string, string>, false>;
|
|
58
|
+
}>;
|
|
59
|
+
export type SchemaMetaRow = SqliteDsl.FromTable.RowDecoded<typeof schemaMetaTable>;
|
|
60
|
+
export declare const systemTables: {
|
|
61
|
+
__livestore_schema: SqliteAst.Table;
|
|
62
|
+
};
|
|
63
|
+
export declare const defineTables: <T extends TableDefinitions>(tables: T) => T;
|
|
64
|
+
export declare const defineMaterializedViews: <M extends MaterializedViewDefinitions>(materializedViews: M) => M;
|
|
65
|
+
export declare const defineActions: <A extends ActionDefinitions<any>>(actions: A) => A;
|
|
66
|
+
export declare const defineAction: <TArgs extends Record<string, any>>(action: ActionDefinition<TArgs>) => ActionDefinition<TArgs>;
|
|
67
|
+
export type GetApplyEventArgs<TActionDefinitionsMap> = RecordValues<{
|
|
68
|
+
[eventType in keyof TActionDefinitionsMap]: {
|
|
69
|
+
eventType: eventType;
|
|
70
|
+
args: GetActionArgs<TActionDefinitionsMap[eventType]>;
|
|
71
|
+
};
|
|
72
|
+
}>;
|
|
73
|
+
type RecordValues<T> = T extends Record<string, infer V> ? V : never;
|
|
74
|
+
export type GetActionArgs<A> = A extends ActionDefinition<infer TArgs> ? TArgs : never;
|
|
75
|
+
declare global {
|
|
76
|
+
interface LiveStoreActionDefinitionsTypes {
|
|
77
|
+
[key: string]: ActionDefinition;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export {};
|
|
81
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|