@sunfall/arc-db 0.1.0-alpha.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.
- package/LICENSE +21 -0
- package/dist/change-feed-dispatcher.d.ts +21 -0
- package/dist/change-feed-dispatcher.d.ts.map +1 -0
- package/dist/change-feed-dispatcher.js +53 -0
- package/dist/change-feed-dispatcher.js.map +1 -0
- package/dist/collection-change-feed-runtime.d.ts +32 -0
- package/dist/collection-change-feed-runtime.d.ts.map +1 -0
- package/dist/collection-change-feed-runtime.js +50 -0
- package/dist/collection-change-feed-runtime.js.map +1 -0
- package/dist/collection-contract.d.ts +525 -0
- package/dist/collection-contract.d.ts.map +1 -0
- package/dist/collection-contract.js +4 -0
- package/dist/collection-contract.js.map +1 -0
- package/dist/collection-definition-snapshot.d.ts +64 -0
- package/dist/collection-definition-snapshot.d.ts.map +1 -0
- package/dist/collection-definition-snapshot.js +122 -0
- package/dist/collection-definition-snapshot.js.map +1 -0
- package/dist/collection-errors.d.ts +38 -0
- package/dist/collection-errors.d.ts.map +1 -0
- package/dist/collection-errors.js +17 -0
- package/dist/collection-errors.js.map +1 -0
- package/dist/collection-ids.d.ts +6 -0
- package/dist/collection-ids.d.ts.map +1 -0
- package/dist/collection-ids.js +6 -0
- package/dist/collection-ids.js.map +1 -0
- package/dist/collection-index-materialization.d.ts +29 -0
- package/dist/collection-index-materialization.d.ts.map +1 -0
- package/dist/collection-index-materialization.js +118 -0
- package/dist/collection-index-materialization.js.map +1 -0
- package/dist/collection-mutation-queue.d.ts +10 -0
- package/dist/collection-mutation-queue.d.ts.map +1 -0
- package/dist/collection-mutation-queue.js +46 -0
- package/dist/collection-mutation-queue.js.map +1 -0
- package/dist/collection-mutation-workflow.d.ts +18 -0
- package/dist/collection-mutation-workflow.d.ts.map +1 -0
- package/dist/collection-mutation-workflow.js +252 -0
- package/dist/collection-mutation-workflow.js.map +1 -0
- package/dist/collection-persistence.d.ts +48 -0
- package/dist/collection-persistence.d.ts.map +1 -0
- package/dist/collection-persistence.js +323 -0
- package/dist/collection-persistence.js.map +1 -0
- package/dist/collection-policy.d.ts +5 -0
- package/dist/collection-policy.d.ts.map +1 -0
- package/dist/collection-policy.js +7 -0
- package/dist/collection-policy.js.map +1 -0
- package/dist/collection-preload.d.ts +21 -0
- package/dist/collection-preload.d.ts.map +1 -0
- package/dist/collection-preload.js +4 -0
- package/dist/collection-preload.js.map +1 -0
- package/dist/collection-projection-callback-policy.d.ts +14 -0
- package/dist/collection-projection-callback-policy.d.ts.map +1 -0
- package/dist/collection-projection-callback-policy.js +25 -0
- package/dist/collection-projection-callback-policy.js.map +1 -0
- package/dist/collection-reactive-binding.d.ts +72 -0
- package/dist/collection-reactive-binding.d.ts.map +1 -0
- package/dist/collection-reactive-binding.js +95 -0
- package/dist/collection-reactive-binding.js.map +1 -0
- package/dist/collection-registry.d.ts +56 -0
- package/dist/collection-registry.d.ts.map +1 -0
- package/dist/collection-registry.js +123 -0
- package/dist/collection-registry.js.map +1 -0
- package/dist/collection-row-ingress.d.ts +16 -0
- package/dist/collection-row-ingress.d.ts.map +1 -0
- package/dist/collection-row-ingress.js +110 -0
- package/dist/collection-row-ingress.js.map +1 -0
- package/dist/collection-runtime.d.ts +20 -0
- package/dist/collection-runtime.d.ts.map +1 -0
- package/dist/collection-runtime.js +256 -0
- package/dist/collection-runtime.js.map +1 -0
- package/dist/collection-snapshot-codec.d.ts +62 -0
- package/dist/collection-snapshot-codec.d.ts.map +1 -0
- package/dist/collection-snapshot-codec.js +563 -0
- package/dist/collection-snapshot-codec.js.map +1 -0
- package/dist/collection-state.d.ts +72 -0
- package/dist/collection-state.d.ts.map +1 -0
- package/dist/collection-state.js +276 -0
- package/dist/collection-state.js.map +1 -0
- package/dist/collection-sync-load-policy.d.ts +17 -0
- package/dist/collection-sync-load-policy.d.ts.map +1 -0
- package/dist/collection-sync-load-policy.js +245 -0
- package/dist/collection-sync-load-policy.js.map +1 -0
- package/dist/collection-value-detachment.d.ts +34 -0
- package/dist/collection-value-detachment.d.ts.map +1 -0
- package/dist/collection-value-detachment.js +248 -0
- package/dist/collection-value-detachment.js.map +1 -0
- package/dist/collection-write-commit.d.ts +32 -0
- package/dist/collection-write-commit.d.ts.map +1 -0
- package/dist/collection-write-commit.js +51 -0
- package/dist/collection-write-commit.js.map +1 -0
- package/dist/flush-policy.d.ts +130 -0
- package/dist/flush-policy.d.ts.map +1 -0
- package/dist/flush-policy.js +96 -0
- package/dist/flush-policy.js.map +1 -0
- package/dist/index.d.ts +481 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +251 -0
- package/dist/index.js.map +1 -0
- package/dist/live-query-collection-materialization.d.ts +47 -0
- package/dist/live-query-collection-materialization.d.ts.map +1 -0
- package/dist/live-query-collection-materialization.js +231 -0
- package/dist/live-query-collection-materialization.js.map +1 -0
- package/dist/live-query-collection.d.ts +23 -0
- package/dist/live-query-collection.d.ts.map +1 -0
- package/dist/live-query-collection.js +94 -0
- package/dist/live-query-collection.js.map +1 -0
- package/dist/live-query-runtime.d.ts +8 -0
- package/dist/live-query-runtime.d.ts.map +1 -0
- package/dist/live-query-runtime.js +228 -0
- package/dist/live-query-runtime.js.map +1 -0
- package/dist/live-query-state.d.ts +11 -0
- package/dist/live-query-state.d.ts.map +1 -0
- package/dist/live-query-state.js +130 -0
- package/dist/live-query-state.js.map +1 -0
- package/dist/query-builder.d.ts +294 -0
- package/dist/query-builder.d.ts.map +1 -0
- package/dist/query-builder.js +373 -0
- package/dist/query-builder.js.map +1 -0
- package/dist/query-context-identity.d.ts +19 -0
- package/dist/query-context-identity.d.ts.map +1 -0
- package/dist/query-context-identity.js +41 -0
- package/dist/query-context-identity.js.map +1 -0
- package/dist/query-execution-plan.d.ts +27 -0
- package/dist/query-execution-plan.d.ts.map +1 -0
- package/dist/query-execution-plan.js +69 -0
- package/dist/query-execution-plan.js.map +1 -0
- package/dist/query-plan.d.ts +200 -0
- package/dist/query-plan.d.ts.map +1 -0
- package/dist/query-plan.js +524 -0
- package/dist/query-plan.js.map +1 -0
- package/dist/query-source-adapter.d.ts +25 -0
- package/dist/query-source-adapter.d.ts.map +1 -0
- package/dist/query-source-adapter.js +14 -0
- package/dist/query-source-adapter.js.map +1 -0
- package/dist/runtime-collection-store.d.ts +38 -0
- package/dist/runtime-collection-store.d.ts.map +1 -0
- package/dist/runtime-collection-store.js +149 -0
- package/dist/runtime-collection-store.js.map +1 -0
- package/dist/server-collection.d.ts +84 -0
- package/dist/server-collection.d.ts.map +1 -0
- package/dist/server-collection.js +84 -0
- package/dist/server-collection.js.map +1 -0
- package/dist/sqlite-persistence.d.ts +239 -0
- package/dist/sqlite-persistence.d.ts.map +1 -0
- package/dist/sqlite-persistence.js +345 -0
- package/dist/sqlite-persistence.js.map +1 -0
- package/dist/sync-adapter.d.ts +233 -0
- package/dist/sync-adapter.d.ts.map +1 -0
- package/dist/sync-adapter.js +226 -0
- package/dist/sync-adapter.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,524 @@
|
|
|
1
|
+
import { isEffectLike, isPromiseLikeValue, stableStringify, } from "@sunfall/arc-core";
|
|
2
|
+
import { Data } from "effect";
|
|
3
|
+
import { makeQuerySourceAdapter, } from "./query-source-adapter.js";
|
|
4
|
+
/**
|
|
5
|
+
* Error raised when the query builder cannot be represented as a live query.
|
|
6
|
+
*/
|
|
7
|
+
export class UnsupportedLiveQuery extends Data.TaggedError("UnsupportedLiveQuery") {
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Error raised when query factories, plan validation, or user-provided
|
|
11
|
+
* synchronous query callbacks fail during evaluation.
|
|
12
|
+
*
|
|
13
|
+
* Query factory throws are normalized with operation `"evaluate"`. One-shot
|
|
14
|
+
* query Effects report this value in their error channel, while synchronous
|
|
15
|
+
* diagnostics/live-query constructors throw the typed error directly.
|
|
16
|
+
*/
|
|
17
|
+
export class QueryEvaluationError extends Data.TaggedError("QueryEvaluationError") {
|
|
18
|
+
}
|
|
19
|
+
class QueryCallbackPromiseRejected extends Data.TaggedError("QueryCallbackPromiseRejected") {
|
|
20
|
+
}
|
|
21
|
+
class QueryCallbackEffectRejected extends Data.TaggedError("QueryCallbackEffectRejected") {
|
|
22
|
+
}
|
|
23
|
+
export const projectCurrentContext = (row) => {
|
|
24
|
+
const value = row;
|
|
25
|
+
return value;
|
|
26
|
+
};
|
|
27
|
+
const isQueryEvaluationError = (cause) => cause instanceof QueryEvaluationError ||
|
|
28
|
+
(typeof cause === "object" &&
|
|
29
|
+
cause !== null &&
|
|
30
|
+
cause._tag === "QueryEvaluationError" &&
|
|
31
|
+
"operation" in cause &&
|
|
32
|
+
"cause" in cause &&
|
|
33
|
+
"message" in cause);
|
|
34
|
+
export const toQueryEvaluationError = (operation, cause) => isQueryEvaluationError(cause)
|
|
35
|
+
? cause
|
|
36
|
+
: new QueryEvaluationError({
|
|
37
|
+
operation,
|
|
38
|
+
cause,
|
|
39
|
+
message: cause instanceof Error ? cause.message : String(cause),
|
|
40
|
+
});
|
|
41
|
+
const isEffectShapedQueryValue = (value) => value instanceof Error ? false : isEffectLike(value);
|
|
42
|
+
const queryGroupKeyPathSegment = (key) => /^[A-Za-z_$][\w$]*$/.test(key) ? `.${key}` : `[${JSON.stringify(key)}]`;
|
|
43
|
+
const promiseShapedQueryValuePath = (value, path = "$", active = new WeakSet()) => {
|
|
44
|
+
if (isPromiseLikeValue(value)) {
|
|
45
|
+
return path;
|
|
46
|
+
}
|
|
47
|
+
if (value === null || typeof value !== "object") {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
if (value instanceof Date ||
|
|
51
|
+
value instanceof URL ||
|
|
52
|
+
value instanceof ArrayBuffer ||
|
|
53
|
+
value instanceof DataView ||
|
|
54
|
+
ArrayBuffer.isView(value)) {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
if (active.has(value)) {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
active.add(value);
|
|
61
|
+
try {
|
|
62
|
+
if (Array.isArray(value)) {
|
|
63
|
+
for (let index = 0; index < value.length; index++) {
|
|
64
|
+
const found = promiseShapedQueryValuePath(value[index], `${path}[${index}]`, active);
|
|
65
|
+
if (found !== undefined) {
|
|
66
|
+
return found;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
if (value instanceof Map) {
|
|
72
|
+
let index = 0;
|
|
73
|
+
for (const [key, entryValue] of value.entries()) {
|
|
74
|
+
const keyPath = promiseShapedQueryValuePath(key, `${path}.<key:${index}>`, active);
|
|
75
|
+
if (keyPath !== undefined) {
|
|
76
|
+
return keyPath;
|
|
77
|
+
}
|
|
78
|
+
const valuePath = promiseShapedQueryValuePath(entryValue, `${path}.<value:${index}>`, active);
|
|
79
|
+
if (valuePath !== undefined) {
|
|
80
|
+
return valuePath;
|
|
81
|
+
}
|
|
82
|
+
index++;
|
|
83
|
+
}
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
if (value instanceof Set) {
|
|
87
|
+
let index = 0;
|
|
88
|
+
for (const entryValue of value.values()) {
|
|
89
|
+
const found = promiseShapedQueryValuePath(entryValue, `${path}.<value:${index}>`, active);
|
|
90
|
+
if (found !== undefined) {
|
|
91
|
+
return found;
|
|
92
|
+
}
|
|
93
|
+
index++;
|
|
94
|
+
}
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
const object = value;
|
|
98
|
+
for (const key of Object.keys(object)) {
|
|
99
|
+
const propertyPath = `${path}${queryGroupKeyPathSegment(key)}`;
|
|
100
|
+
const found = promiseShapedQueryValuePath(Reflect.get(object, key), propertyPath, active);
|
|
101
|
+
if (found !== undefined) {
|
|
102
|
+
return found;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
active.delete(value);
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
const effectShapedQueryValuePath = (value, path = "$", active = new WeakSet()) => {
|
|
112
|
+
if (isEffectShapedQueryValue(value)) {
|
|
113
|
+
return path;
|
|
114
|
+
}
|
|
115
|
+
if (value === null || typeof value !== "object") {
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
if (value instanceof Date ||
|
|
119
|
+
value instanceof URL ||
|
|
120
|
+
value instanceof ArrayBuffer ||
|
|
121
|
+
value instanceof DataView ||
|
|
122
|
+
ArrayBuffer.isView(value)) {
|
|
123
|
+
return undefined;
|
|
124
|
+
}
|
|
125
|
+
if (active.has(value)) {
|
|
126
|
+
return undefined;
|
|
127
|
+
}
|
|
128
|
+
active.add(value);
|
|
129
|
+
try {
|
|
130
|
+
if (Array.isArray(value)) {
|
|
131
|
+
for (let index = 0; index < value.length; index++) {
|
|
132
|
+
const found = effectShapedQueryValuePath(value[index], `${path}[${index}]`, active);
|
|
133
|
+
if (found !== undefined) {
|
|
134
|
+
return found;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
if (value instanceof Map) {
|
|
140
|
+
let index = 0;
|
|
141
|
+
for (const [key, entryValue] of value.entries()) {
|
|
142
|
+
const keyPath = effectShapedQueryValuePath(key, `${path}.<key:${index}>`, active);
|
|
143
|
+
if (keyPath !== undefined) {
|
|
144
|
+
return keyPath;
|
|
145
|
+
}
|
|
146
|
+
const valuePath = effectShapedQueryValuePath(entryValue, `${path}.<value:${index}>`, active);
|
|
147
|
+
if (valuePath !== undefined) {
|
|
148
|
+
return valuePath;
|
|
149
|
+
}
|
|
150
|
+
index++;
|
|
151
|
+
}
|
|
152
|
+
return undefined;
|
|
153
|
+
}
|
|
154
|
+
if (value instanceof Set) {
|
|
155
|
+
let index = 0;
|
|
156
|
+
for (const entryValue of value.values()) {
|
|
157
|
+
const found = effectShapedQueryValuePath(entryValue, `${path}.<value:${index}>`, active);
|
|
158
|
+
if (found !== undefined) {
|
|
159
|
+
return found;
|
|
160
|
+
}
|
|
161
|
+
index++;
|
|
162
|
+
}
|
|
163
|
+
return undefined;
|
|
164
|
+
}
|
|
165
|
+
const object = value;
|
|
166
|
+
for (const key of Object.keys(object)) {
|
|
167
|
+
const propertyPath = `${path}${queryGroupKeyPathSegment(key)}`;
|
|
168
|
+
const found = effectShapedQueryValuePath(Reflect.get(object, key), propertyPath, active);
|
|
169
|
+
if (found !== undefined) {
|
|
170
|
+
return found;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return undefined;
|
|
174
|
+
}
|
|
175
|
+
finally {
|
|
176
|
+
active.delete(value);
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
const promiseShapedQueryCallbackError = (operation, path = "$") => new QueryEvaluationError({
|
|
180
|
+
operation,
|
|
181
|
+
cause: new QueryCallbackPromiseRejected({
|
|
182
|
+
guidance: "Query callbacks are synchronous. Move async work into collection load/refetch/sync adapters, or wrap host Promise work in an Effect before it reaches Query evaluation.",
|
|
183
|
+
}),
|
|
184
|
+
message: `Query ${operation} callbacks must return synchronous values, not Promise-shaped values at ${path}.`,
|
|
185
|
+
});
|
|
186
|
+
const effectShapedQueryCallbackError = (operation, path = "$") => new QueryEvaluationError({
|
|
187
|
+
operation,
|
|
188
|
+
cause: new QueryCallbackEffectRejected({
|
|
189
|
+
guidance: "Query callbacks are synchronous data projections. Return Effect work from collection load/refetch/sync adapters before it reaches Query evaluation.",
|
|
190
|
+
}),
|
|
191
|
+
message: `Query ${operation} callbacks must return plain data, not Effect-shaped values at ${path}.`,
|
|
192
|
+
});
|
|
193
|
+
export const evaluateQueryOperation = (operation, evaluate) => {
|
|
194
|
+
try {
|
|
195
|
+
const value = evaluate();
|
|
196
|
+
if (isPromiseLikeValue(value)) {
|
|
197
|
+
throw promiseShapedQueryCallbackError(operation);
|
|
198
|
+
}
|
|
199
|
+
if (isEffectShapedQueryValue(value)) {
|
|
200
|
+
throw effectShapedQueryCallbackError(operation);
|
|
201
|
+
}
|
|
202
|
+
return value;
|
|
203
|
+
}
|
|
204
|
+
catch (cause) {
|
|
205
|
+
throw toQueryEvaluationError(operation, cause);
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
export const evaluateQueryStructuredOperation = (operation, evaluate) => evaluateQueryOperation(operation, () => {
|
|
209
|
+
const value = evaluate();
|
|
210
|
+
const promisePath = promiseShapedQueryValuePath(value);
|
|
211
|
+
if (promisePath !== undefined) {
|
|
212
|
+
throw promiseShapedQueryCallbackError(operation, promisePath);
|
|
213
|
+
}
|
|
214
|
+
const effectPath = effectShapedQueryValuePath(value);
|
|
215
|
+
if (effectPath !== undefined) {
|
|
216
|
+
throw effectShapedQueryCallbackError(operation, effectPath);
|
|
217
|
+
}
|
|
218
|
+
return value;
|
|
219
|
+
});
|
|
220
|
+
export const joinKey = (value) => value instanceof Date ? `Date:${value.toISOString()}` : stableStringify(value);
|
|
221
|
+
export const evaluateQueryJoinKey = (value) => evaluateQueryOperation("join", () => joinKey(value));
|
|
222
|
+
export const evaluateQueryGroupKey = (value) => evaluateQueryOperation("aggregate", () => {
|
|
223
|
+
const promisePath = promiseShapedQueryValuePath(value);
|
|
224
|
+
if (promisePath !== undefined) {
|
|
225
|
+
throw promiseShapedQueryCallbackError("aggregate", promisePath);
|
|
226
|
+
}
|
|
227
|
+
const effectPath = effectShapedQueryValuePath(value);
|
|
228
|
+
if (effectPath !== undefined) {
|
|
229
|
+
throw effectShapedQueryCallbackError("aggregate", effectPath);
|
|
230
|
+
}
|
|
231
|
+
return stableStringify(value);
|
|
232
|
+
});
|
|
233
|
+
const isQuerySortScalar = (value) => value === null ||
|
|
234
|
+
value === undefined ||
|
|
235
|
+
typeof value === "string" ||
|
|
236
|
+
typeof value === "number" ||
|
|
237
|
+
typeof value === "boolean" ||
|
|
238
|
+
value instanceof Date;
|
|
239
|
+
const querySortValueError = (path, reason) => new QueryEvaluationError({
|
|
240
|
+
operation: "order",
|
|
241
|
+
cause: new TypeError(reason),
|
|
242
|
+
message: `Query order value at ${path} must be a comparable scalar value.`,
|
|
243
|
+
});
|
|
244
|
+
const normalizeQuerySortValue = (value, path) => {
|
|
245
|
+
if (!isQuerySortScalar(value)) {
|
|
246
|
+
throw querySortValueError(path, "Query order values must be string, number, boolean, Date, null, or undefined.");
|
|
247
|
+
}
|
|
248
|
+
if (value instanceof Date) {
|
|
249
|
+
const millis = value.getTime();
|
|
250
|
+
if (!Number.isFinite(millis)) {
|
|
251
|
+
throw querySortValueError(path, "Query order Date values must be valid.");
|
|
252
|
+
}
|
|
253
|
+
return millis;
|
|
254
|
+
}
|
|
255
|
+
if (typeof value === "number" && Number.isNaN(value)) {
|
|
256
|
+
throw querySortValueError(path, "Query order number values cannot be NaN.");
|
|
257
|
+
}
|
|
258
|
+
return value;
|
|
259
|
+
};
|
|
260
|
+
const validateQueryOrderValues = (contexts, orders) => {
|
|
261
|
+
for (const context of contexts) {
|
|
262
|
+
for (const order of orders) {
|
|
263
|
+
const value = evaluateQueryOperation("order", () => order.selector(context));
|
|
264
|
+
normalizeQuerySortValue(value, "$.order");
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
const reservedQuerySourceAliases = new Set(["__proto__", "constructor", "prototype"]);
|
|
269
|
+
/** Builds the diagnostic message for a source alias that cannot safely key a row context. */
|
|
270
|
+
export const reservedQuerySourceAliasReason = (alias) => `Query source alias "${alias}" is reserved. Use a domain alias that can be represented as an own object property.`;
|
|
271
|
+
/** Rejects source aliases that would collide with object prototype mechanics. */
|
|
272
|
+
export const validateQuerySourceAlias = (alias) => {
|
|
273
|
+
if (reservedQuerySourceAliases.has(alias)) {
|
|
274
|
+
throw new UnsupportedLiveQuery({
|
|
275
|
+
reason: reservedQuerySourceAliasReason(alias),
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
/** Validates alias and join invariants before a Query plan reads source rows. */
|
|
280
|
+
export const validateQueryPlan = (builder) => {
|
|
281
|
+
if (builder.sources.length === 0) {
|
|
282
|
+
throw new UnsupportedLiveQuery({
|
|
283
|
+
reason: "Live queries require at least one source collection.",
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
if (!Number.isSafeInteger(builder.offsetCount) || builder.offsetCount < 0) {
|
|
287
|
+
throw new UnsupportedLiveQuery({
|
|
288
|
+
reason: "Query offset must be a finite non-negative safe integer.",
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
if (builder.limitCount !== undefined &&
|
|
292
|
+
(!Number.isSafeInteger(builder.limitCount) || builder.limitCount < 0)) {
|
|
293
|
+
throw new UnsupportedLiveQuery({
|
|
294
|
+
reason: "Query limit must be a finite non-negative safe integer.",
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
const aliases = new Map();
|
|
298
|
+
for (const [alias, collection] of builder.sources) {
|
|
299
|
+
validateQuerySourceAlias(alias);
|
|
300
|
+
const existing = aliases.get(alias);
|
|
301
|
+
if (existing) {
|
|
302
|
+
throw new UnsupportedLiveQuery({
|
|
303
|
+
reason: `Query source alias "${alias}" is registered more than once.`,
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
aliases.set(alias, collection);
|
|
307
|
+
}
|
|
308
|
+
for (const join of builder.joins) {
|
|
309
|
+
const source = aliases.get(join.alias);
|
|
310
|
+
if (!source) {
|
|
311
|
+
throw new UnsupportedLiveQuery({
|
|
312
|
+
reason: `Join source "${join.alias}" is not registered.`,
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
if (source !== join.collection) {
|
|
316
|
+
throw new UnsupportedLiveQuery({
|
|
317
|
+
reason: `Join source "${join.alias}" is registered for collection "${source.name}" but the join uses "${join.collection.name}".`,
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
if (join.rightIndex !== undefined &&
|
|
321
|
+
!makeQuerySourceAdapter(join.collection).hasIndex(join.rightIndex)) {
|
|
322
|
+
throw new UnsupportedLiveQuery({
|
|
323
|
+
reason: `Join source "${join.alias}" uses unknown index "${join.rightIndex}" on collection "${join.collection.name}".`,
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
if (builder.joins.length > 0) {
|
|
328
|
+
const joinAliases = new Set(builder.joins.map((join) => join.alias));
|
|
329
|
+
const hasBaseSource = builder.sources.some(([alias]) => !joinAliases.has(alias));
|
|
330
|
+
if (!hasBaseSource) {
|
|
331
|
+
throw new UnsupportedLiveQuery({
|
|
332
|
+
reason: "Live queries with joins require at least one non-join source collection.",
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
/** Compiles validated Query builder facts into the shared snapshot/live stage plan. */
|
|
338
|
+
export const compileQueryStagePlan = (builder) => {
|
|
339
|
+
validateQueryPlan(builder);
|
|
340
|
+
const joinAliases = new Set(builder.joins.map((join) => join.alias));
|
|
341
|
+
const adapterByCollection = new Map();
|
|
342
|
+
const sourceAdapter = (collection) => {
|
|
343
|
+
const existing = adapterByCollection.get(collection);
|
|
344
|
+
if (existing !== undefined) {
|
|
345
|
+
return existing;
|
|
346
|
+
}
|
|
347
|
+
const adapter = makeQuerySourceAdapter(collection);
|
|
348
|
+
adapterByCollection.set(collection, adapter);
|
|
349
|
+
return adapter;
|
|
350
|
+
};
|
|
351
|
+
const sources = builder.sources.map(([alias, collection]) => ({
|
|
352
|
+
alias,
|
|
353
|
+
collection,
|
|
354
|
+
adapter: sourceAdapter(collection),
|
|
355
|
+
role: joinAliases.has(alias) ? "join" : "base",
|
|
356
|
+
}));
|
|
357
|
+
const baseSources = sources.filter((source) => source.role === "base");
|
|
358
|
+
const sourceByAlias = new Map(sources.map((source) => [source.alias, source]));
|
|
359
|
+
return {
|
|
360
|
+
sources,
|
|
361
|
+
baseSources,
|
|
362
|
+
sourceAdapters: Array.from(adapterByCollection.values()),
|
|
363
|
+
sourceByAlias,
|
|
364
|
+
identityAliases: [
|
|
365
|
+
...baseSources.map((source) => source.alias),
|
|
366
|
+
...builder.joins.map((join) => join.alias),
|
|
367
|
+
],
|
|
368
|
+
joins: builder.joins,
|
|
369
|
+
grouping: builder.grouping,
|
|
370
|
+
filters: builder.filters,
|
|
371
|
+
orders: builder.orders,
|
|
372
|
+
window: {
|
|
373
|
+
offset: builder.offsetCount,
|
|
374
|
+
...(builder.limitCount === undefined ? {} : { limit: builder.limitCount }),
|
|
375
|
+
},
|
|
376
|
+
};
|
|
377
|
+
};
|
|
378
|
+
const buildStageSourceContexts = (sources) => {
|
|
379
|
+
if (sources.length === 0) {
|
|
380
|
+
throw new UnsupportedLiveQuery({
|
|
381
|
+
reason: "Live queries require at least one source collection.",
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
const contexts = [];
|
|
385
|
+
const visit = (index, current) => {
|
|
386
|
+
if (index >= sources.length) {
|
|
387
|
+
contexts.push({ ...current });
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
const source = sources[index];
|
|
391
|
+
if (!source) {
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
for (const row of source.adapter.rows()) {
|
|
395
|
+
current[source.alias] = row;
|
|
396
|
+
visit(index + 1, current);
|
|
397
|
+
}
|
|
398
|
+
delete current[source.alias];
|
|
399
|
+
};
|
|
400
|
+
visit(0, {});
|
|
401
|
+
return contexts;
|
|
402
|
+
};
|
|
403
|
+
export const buildQueryExecutionFromStagePlan = (stagePlan) => {
|
|
404
|
+
const sourceDiagnostics = stagePlan.sources.map((source) => {
|
|
405
|
+
return {
|
|
406
|
+
alias: source.alias,
|
|
407
|
+
collection: source.adapter.name,
|
|
408
|
+
rows: source.adapter.rowCount(),
|
|
409
|
+
};
|
|
410
|
+
});
|
|
411
|
+
const joins = [];
|
|
412
|
+
let contexts = buildStageSourceContexts(stagePlan.baseSources);
|
|
413
|
+
for (const join of stagePlan.joins) {
|
|
414
|
+
const joined = [];
|
|
415
|
+
const leftRows = contexts.length;
|
|
416
|
+
const source = stagePlan.sourceByAlias.get(join.alias)?.adapter;
|
|
417
|
+
if (!source) {
|
|
418
|
+
throw new UnsupportedLiveQuery({ reason: `Join source "${join.alias}" is not registered.` });
|
|
419
|
+
}
|
|
420
|
+
const rightRows = source.rowCount();
|
|
421
|
+
for (const context of contexts) {
|
|
422
|
+
const leftValue = evaluateQueryOperation("join", () => join.leftKey(context));
|
|
423
|
+
const left = evaluateQueryJoinKey(leftValue);
|
|
424
|
+
const rows = join.rightIndex
|
|
425
|
+
? evaluateQueryOperation("join", () => source.indexRows(join.rightIndex, leftValue))
|
|
426
|
+
: source.rows();
|
|
427
|
+
for (const row of rows) {
|
|
428
|
+
const rightKeys = evaluateQueryStructuredOperation("join", () => join.rightKeys(row));
|
|
429
|
+
if (rightKeys.some((rightValue) => left === evaluateQueryJoinKey(rightValue))) {
|
|
430
|
+
joined.push({
|
|
431
|
+
...context,
|
|
432
|
+
[join.alias]: row,
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
joins.push({
|
|
438
|
+
alias: join.alias,
|
|
439
|
+
collection: source.name,
|
|
440
|
+
strategy: join.rightIndex ? "collection-index" : "collection-scan",
|
|
441
|
+
...(join.rightIndex === undefined ? {} : { index: join.rightIndex }),
|
|
442
|
+
leftRows,
|
|
443
|
+
rightRows,
|
|
444
|
+
outputRows: joined.length,
|
|
445
|
+
estimatedComparisons: join.rightIndex ? leftRows : leftRows * rightRows,
|
|
446
|
+
});
|
|
447
|
+
contexts = joined;
|
|
448
|
+
}
|
|
449
|
+
let resultContexts;
|
|
450
|
+
if (stagePlan.grouping !== undefined) {
|
|
451
|
+
resultContexts = groupContexts(contexts, stagePlan.grouping);
|
|
452
|
+
}
|
|
453
|
+
else {
|
|
454
|
+
resultContexts = contexts;
|
|
455
|
+
}
|
|
456
|
+
if (stagePlan.orders.length > 0) {
|
|
457
|
+
validateQueryOrderValues(resultContexts.filter((context) => stagePlan.filters.every((filter) => evaluateQueryOperation("filter", () => filter(context)))), stagePlan.orders);
|
|
458
|
+
}
|
|
459
|
+
return {
|
|
460
|
+
contexts: resultContexts,
|
|
461
|
+
diagnostics: {
|
|
462
|
+
sources: sourceDiagnostics,
|
|
463
|
+
joins,
|
|
464
|
+
filters: stagePlan.filters.length,
|
|
465
|
+
orders: stagePlan.orders.length,
|
|
466
|
+
grouped: stagePlan.grouping !== undefined,
|
|
467
|
+
offset: stagePlan.window.offset,
|
|
468
|
+
...(stagePlan.window.limit === undefined ? {} : { limit: stagePlan.window.limit }),
|
|
469
|
+
contextRows: resultContexts.length,
|
|
470
|
+
},
|
|
471
|
+
};
|
|
472
|
+
};
|
|
473
|
+
export const groupContexts = (contexts, grouping) => {
|
|
474
|
+
const groups = new Map();
|
|
475
|
+
for (const context of contexts) {
|
|
476
|
+
if (!grouping.sourceFilters.every((filter) => evaluateQueryOperation("filter", () => filter(context)))) {
|
|
477
|
+
continue;
|
|
478
|
+
}
|
|
479
|
+
const key = evaluateQueryOperation("aggregate", () => grouping.key(context));
|
|
480
|
+
const keyString = evaluateQueryGroupKey(key);
|
|
481
|
+
const existing = groups.get(keyString);
|
|
482
|
+
if (existing) {
|
|
483
|
+
existing.values.push(context);
|
|
484
|
+
}
|
|
485
|
+
else {
|
|
486
|
+
groups.set(keyString, { key, values: [context] });
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
return Array.from(groups.values(), (group) => {
|
|
490
|
+
const result = { ...group.key };
|
|
491
|
+
for (const [name, aggregate] of Object.entries(grouping.aggregates)) {
|
|
492
|
+
const values = group.values.map((value) => [evaluateQueryStructuredOperation("aggregate", () => aggregate.preMap(value)), 1]);
|
|
493
|
+
const reduced = evaluateQueryStructuredOperation("aggregate", () => aggregate.reduce(values));
|
|
494
|
+
result[name] = aggregate.postMap
|
|
495
|
+
? evaluateQueryStructuredOperation("aggregate", () => aggregate.postMap(reduced))
|
|
496
|
+
: reduced;
|
|
497
|
+
}
|
|
498
|
+
return result;
|
|
499
|
+
});
|
|
500
|
+
};
|
|
501
|
+
export const compareValue = (left, right) => {
|
|
502
|
+
const leftValue = normalizeQuerySortValue(left, "$.left");
|
|
503
|
+
const rightValue = normalizeQuerySortValue(right, "$.right");
|
|
504
|
+
if (leftValue === rightValue)
|
|
505
|
+
return 0;
|
|
506
|
+
if (leftValue === null || leftValue === undefined)
|
|
507
|
+
return 1;
|
|
508
|
+
if (rightValue === null || rightValue === undefined)
|
|
509
|
+
return -1;
|
|
510
|
+
return leftValue < rightValue ? -1 : 1;
|
|
511
|
+
};
|
|
512
|
+
export const compareRows = (left, right, leftIndex, rightIndex, orders) => {
|
|
513
|
+
for (const order of orders) {
|
|
514
|
+
const direction = order.direction === "asc" ? 1 : -1;
|
|
515
|
+
const leftValue = evaluateQueryOperation("order", () => order.selector(left));
|
|
516
|
+
const rightValue = evaluateQueryOperation("order", () => order.selector(right));
|
|
517
|
+
const comparison = compareValue(leftValue, rightValue);
|
|
518
|
+
if (comparison !== 0) {
|
|
519
|
+
return comparison * direction;
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
return leftIndex - rightIndex;
|
|
523
|
+
};
|
|
524
|
+
//# sourceMappingURL=query-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-plan.js","sourceRoot":"","sources":["../src/query-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ReadableSignal } from "@sunfall/arc-core";
|
|
2
|
+
import type { Effect } from "effect";
|
|
3
|
+
import type { AnyCollection, CollectionIndexValue, CollectionLoadState, CollectionRow } from "./collection-contract.js";
|
|
4
|
+
export type QuerySourceRow = CollectionRow<any, any>;
|
|
5
|
+
/**
|
|
6
|
+
* Internal Adapter from Collection Definitions to query-readable sources.
|
|
7
|
+
*
|
|
8
|
+
* Query Builder and Live Query Runtime should depend on this Interface instead
|
|
9
|
+
* of knowing which Collection methods expose rows, indexes, load state,
|
|
10
|
+
* versions, and preload/refetch behavior.
|
|
11
|
+
*/
|
|
12
|
+
export interface QueryCollectionSourceAdapter {
|
|
13
|
+
readonly collection: AnyCollection;
|
|
14
|
+
readonly name: string;
|
|
15
|
+
rows(): ReadonlyArray<QuerySourceRow>;
|
|
16
|
+
rowCount(): number;
|
|
17
|
+
hasIndex(index: string): boolean;
|
|
18
|
+
indexRows(index: string, value: CollectionIndexValue): ReadonlyArray<QuerySourceRow>;
|
|
19
|
+
indexJoinKeys(index: string, row: QuerySourceRow): ReadonlyArray<CollectionIndexValue>;
|
|
20
|
+
version(): ReadableSignal<number>;
|
|
21
|
+
state(): ReadableSignal<CollectionLoadState<any>>;
|
|
22
|
+
preloadEffect(force: boolean): Effect.Effect<void, any, any>;
|
|
23
|
+
}
|
|
24
|
+
export declare const makeQuerySourceAdapter: (collection: AnyCollection) => QueryCollectionSourceAdapter;
|
|
25
|
+
//# sourceMappingURL=query-source-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-source-adapter.d.ts","sourceRoot":"","sources":["../src/query-source-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EACpB,mBAAmB,EACnB,aAAa,EACd,MAAM,0BAA0B,CAAC;AAElC,MAAM,MAAM,cAAc,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAErD;;;;;;GAMG;AACH,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,IAAI,IAAI,aAAa,CAAC,cAAc,CAAC,CAAC;IACtC,QAAQ,IAAI,MAAM,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,oBAAoB,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;IACrF,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,GAAG,aAAa,CAAC,oBAAoB,CAAC,CAAC;IACvF,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;IAClC,KAAK,IAAI,cAAc,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;CAC9D;AAED,eAAO,MAAM,sBAAsB,eACrB,aAAa,KACxB,4BAWD,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { collectionIndexJoinKeys, collectionIndexes } from "./collection-index-materialization.js";
|
|
2
|
+
export const makeQuerySourceAdapter = (collection) => ({
|
|
3
|
+
collection,
|
|
4
|
+
name: collection.name,
|
|
5
|
+
rows: () => collection.rows(),
|
|
6
|
+
rowCount: () => collection.rows().length,
|
|
7
|
+
hasIndex: (index) => collectionIndexes(collection.options).has(index),
|
|
8
|
+
indexRows: (index, value) => collection.index(index, value),
|
|
9
|
+
indexJoinKeys: (index, row) => collectionIndexJoinKeys(collection, index, row),
|
|
10
|
+
version: () => collection.version(),
|
|
11
|
+
state: () => collection.state(),
|
|
12
|
+
preloadEffect: (force) => (force ? collection.refetchEffect() : collection.preloadEffect()),
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=query-source-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-source-adapter.js","sourceRoot":"","sources":["../src/query-source-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AA8BnG,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,UAAyB,EACK,EAAE,CAAC,CAAC;IAClC,UAAU;IACV,IAAI,EAAE,UAAU,CAAC,IAAI;IACrB,IAAI,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE;IAC7B,QAAQ,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM;IACxC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;IACrE,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC;IAC3D,aAAa,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,uBAAuB,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC;IAC9E,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE;IACnC,KAAK,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE;IAC/B,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;CAC5F,CAAC,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type ResourceStore as ResourceStoreState } from "@sunfall/arc-core";
|
|
2
|
+
import { Effect, PubSub, Scope } from "effect";
|
|
3
|
+
import { CollectionStoreTypeId } from "./collection-ids.js";
|
|
4
|
+
import { type CollectionState } from "./collection-state.js";
|
|
5
|
+
import type { AnyCollection, CollectionDefinition, CollectionKey, CollectionStore, CollectionStoreDiagnosticsSnapshot, CollectionStoreEvent } from "./collection-contract.js";
|
|
6
|
+
/**
|
|
7
|
+
* Runtime/request-local owner of collection state, diagnostics, and lifecycle
|
|
8
|
+
* events.
|
|
9
|
+
*
|
|
10
|
+
* The store is keyed through the active Resource Store's module registry, so
|
|
11
|
+
* SSR requests, client runtimes, and tests get isolated collection rows,
|
|
12
|
+
* pending mutation queues, and event streams.
|
|
13
|
+
*/
|
|
14
|
+
export declare class RuntimeCollectionStore implements CollectionStore {
|
|
15
|
+
#private;
|
|
16
|
+
readonly [CollectionStoreTypeId]: typeof CollectionStoreTypeId;
|
|
17
|
+
readonly disposeEffect: Effect.Effect<void, never, never>;
|
|
18
|
+
readonly diagnostics: {
|
|
19
|
+
snapshot: () => CollectionStoreDiagnosticsSnapshot;
|
|
20
|
+
snapshotEffect: Effect.Effect<CollectionStoreDiagnosticsSnapshot, never, never>;
|
|
21
|
+
};
|
|
22
|
+
state(definition: AnyCollection): CollectionState<any, any, any>;
|
|
23
|
+
state<A extends object, K extends CollectionKey, E, R>(definition: CollectionDefinition<A, K, E, R>): CollectionState<A, K, E>;
|
|
24
|
+
diagnosticsSnapshot(): CollectionStoreDiagnosticsSnapshot;
|
|
25
|
+
publish(event: CollectionStoreEvent): Effect.Effect<void>;
|
|
26
|
+
subscribeEventsEffect(): Effect.Effect<PubSub.Subscription<CollectionStoreEvent>, never, Scope.Scope>;
|
|
27
|
+
}
|
|
28
|
+
/** Resolve the Runtime Collection Store attached to a Resource Store. */
|
|
29
|
+
export declare const storeFor: (resourceStore: ResourceStoreState) => RuntimeCollectionStore;
|
|
30
|
+
export declare const defaultRuntimeCollectionStore: () => RuntimeCollectionStore;
|
|
31
|
+
/** Access the active Runtime Collection Store from inside Effect. */
|
|
32
|
+
export declare const collectionStoreEffect: Effect.Effect<RuntimeCollectionStore>;
|
|
33
|
+
/** Access the active Runtime Collection Store from synchronous render/read seams. */
|
|
34
|
+
export declare const currentCollectionStore: () => CollectionStore;
|
|
35
|
+
export declare const runWithCollectionStore: <A>(store: RuntimeCollectionStore, evaluate: () => A) => A;
|
|
36
|
+
/** Subscribe to active Runtime Collection Store events inside a Scope. */
|
|
37
|
+
export declare const subscribeCollectionEventsEffect: () => Effect.Effect<PubSub.Subscription<CollectionStoreEvent>, never, Scope.Scope>;
|
|
38
|
+
//# sourceMappingURL=runtime-collection-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-collection-store.d.ts","sourceRoot":"","sources":["../src/runtime-collection-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,aAAa,IAAI,kBAAkB,EACzC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,MAAM,EAAU,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EACV,aAAa,EACb,oBAAoB,EACpB,aAAa,EAEb,eAAe,EACf,kCAAkC,EAClC,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAiDlC;;;;;;;GAOG;AACH,qBAAa,sBAAuB,YAAW,eAAe;;IAC5D,QAAQ,CAAC,CAAC,qBAAqB,CAAC,EAAE,OAAO,qBAAqB,CAAyB;IAIvF,QAAQ,CAAC,aAAa,oCAAiC;IACvD,QAAQ,CAAC,WAAW;QAClB,QAAQ,QAAM,kCAAkC;QAChD,cAAc;MACd;IAEF,KAAK,CAAC,UAAU,EAAE,aAAa,GAAG,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACjE,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,aAAa,EAAE,CAAC,EAAE,CAAC,EACnD,UAAU,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAC3C,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAgB5B,mBAAmB,IAAI,kCAAkC,CAuCxD;IAED,OAAO,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAExD;IAED,qBAAqB,IAAI,MAAM,CAAC,MAAM,CACpC,MAAM,CAAC,YAAY,CAAC,oBAAoB,CAAC,EACzC,KAAK,EACL,KAAK,CAAC,KAAK,CACZ,CAEA;CACF;AAOD,yEAAyE;AACzE,eAAO,MAAM,QAAQ,kBAAmB,kBAAkB,KAAG,sBAS5D,CAAC;AAEF,eAAO,MAAM,6BAA6B,QAAO,sBACE,CAAC;AAOpD,qEAAqE;AACrE,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAGvE,CAAC;AAIF,qFAAqF;AACrF,eAAO,MAAM,sBAAsB,QAAO,eACyB,CAAC;AAEpE,eAAO,MAAM,sBAAsB,GAAI,CAAC,SAAS,sBAAsB,YAAY,MAAM,CAAC,KAAG,CAQ5F,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,+BAA+B,QAAO,MAAM,CAAC,MAAM,CAC9D,MAAM,CAAC,YAAY,CAAC,oBAAoB,CAAC,EACzC,KAAK,EACL,KAAK,CAAC,KAAK,CACuE,CAAC"}
|