@dxos/echo-query 0.8.4-main.72ec0f3 → 0.8.4-main.74a063c4e0
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/dist/lib/{browser → neutral}/index.mjs +159 -3
- package/dist/lib/{node-esm → neutral}/index.mjs.map +4 -4
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/query-lite/index.d.ts +9932 -0
- package/dist/query-lite/index.d.ts.map +1 -0
- package/dist/query-lite/index.js +506 -375
- package/dist/query-lite/index.js.map +1 -0
- package/dist/types/src/index.d.ts +1 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/query-lite/query-lite.d.ts +4 -4
- package/dist/types/src/query-lite/query-lite.d.ts.map +1 -1
- package/dist/types/src/sandbox/index.d.ts +2 -0
- package/dist/types/src/sandbox/index.d.ts.map +1 -0
- package/dist/types/src/sandbox/query-sandbox.d.ts +1 -1
- package/dist/types/src/sandbox/quickjs.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +21 -16
- package/src/index.ts +1 -0
- package/src/parser/query.test.ts +29 -29
- package/src/query-lite/query-lite.ts +302 -70
- package/src/sandbox/index.ts +5 -0
- package/src/sandbox/query-sandbox.test.ts +10 -10
- package/src/sandbox/query-sandbox.ts +1 -1
- package/src/sandbox/quickjs.ts +1 -2
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/node-esm/index.mjs +0 -563
- package/dist/lib/node-esm/meta.json +0 -1
package/dist/query-lite/index.js
CHANGED
|
@@ -1,387 +1,518 @@
|
|
|
1
|
-
|
|
1
|
+
//#region ../../../common/invariant/dist/lib/browser/index.mjs
|
|
2
2
|
var assertArgument = (condition, argumentName, message) => {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
if (!condition) {
|
|
4
|
+
const error = /* @__PURE__ */ new TypeError(`Invalid argument \`${argumentName}\`` + (message ? `: ${message}` : ""));
|
|
5
|
+
Error.captureStackTrace(error, assertArgument);
|
|
6
|
+
throw error;
|
|
7
|
+
}
|
|
8
8
|
};
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
10
|
+
//#endregion
|
|
11
|
+
//#region src/query-lite/query-lite.ts
|
|
12
|
+
var OrderClass = class OrderClass {
|
|
13
|
+
static "variance" = {};
|
|
14
|
+
static is(value) {
|
|
15
|
+
return typeof value === "object" && value !== null && "~Order" in value;
|
|
16
|
+
}
|
|
17
|
+
constructor(ast) {
|
|
18
|
+
this.ast = ast;
|
|
19
|
+
}
|
|
20
|
+
"~Order" = OrderClass.variance;
|
|
20
21
|
};
|
|
21
|
-
|
|
22
|
-
((
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
22
|
+
let Order1;
|
|
23
|
+
(function(_Order) {
|
|
24
|
+
_Order.natural = new OrderClass({ kind: "natural" });
|
|
25
|
+
_Order.property = (property, direction) => new OrderClass({
|
|
26
|
+
kind: "property",
|
|
27
|
+
property,
|
|
28
|
+
direction
|
|
29
|
+
});
|
|
30
|
+
_Order.rank = (direction = "desc") => new OrderClass({
|
|
31
|
+
kind: "rank",
|
|
32
|
+
direction
|
|
33
|
+
});
|
|
29
34
|
})(Order1 || (Order1 = {}));
|
|
30
|
-
|
|
31
|
-
var FilterClass = class
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
35
|
+
const Order2 = Order1;
|
|
36
|
+
var FilterClass = class FilterClass {
|
|
37
|
+
static "variance" = {};
|
|
38
|
+
static is(value) {
|
|
39
|
+
return typeof value === "object" && value !== null && "~Filter" in value;
|
|
40
|
+
}
|
|
41
|
+
static fromAst(ast) {
|
|
42
|
+
return new FilterClass(ast);
|
|
43
|
+
}
|
|
44
|
+
static everything() {
|
|
45
|
+
return new FilterClass({
|
|
46
|
+
type: "object",
|
|
47
|
+
typename: null,
|
|
48
|
+
props: {}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
static nothing() {
|
|
52
|
+
return new FilterClass({
|
|
53
|
+
type: "not",
|
|
54
|
+
filter: {
|
|
55
|
+
type: "object",
|
|
56
|
+
typename: null,
|
|
57
|
+
props: {}
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
static relation() {
|
|
62
|
+
return new FilterClass({
|
|
63
|
+
type: "object",
|
|
64
|
+
typename: null,
|
|
65
|
+
props: {}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
static id(...ids) {
|
|
69
|
+
if (ids.length === 0) return FilterClass.nothing();
|
|
70
|
+
return new FilterClass({
|
|
71
|
+
type: "object",
|
|
72
|
+
typename: null,
|
|
73
|
+
id: ids,
|
|
74
|
+
props: {}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
static type(schema, props) {
|
|
78
|
+
if (typeof schema !== "string") throw new TypeError("expected typename as the first paramter");
|
|
79
|
+
return new FilterClass({
|
|
80
|
+
type: "object",
|
|
81
|
+
typename: makeTypeDxn(schema),
|
|
82
|
+
...propsFilterToAst(props ?? {})
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
static typename(typename) {
|
|
86
|
+
return new FilterClass({
|
|
87
|
+
type: "object",
|
|
88
|
+
typename: makeTypeDxn(typename),
|
|
89
|
+
props: {}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
static typeDXN(dxn) {
|
|
93
|
+
return new FilterClass({
|
|
94
|
+
type: "object",
|
|
95
|
+
typename: dxn.toString(),
|
|
96
|
+
props: {}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
static tag(tag) {
|
|
100
|
+
return new FilterClass({
|
|
101
|
+
type: "tag",
|
|
102
|
+
tag
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
static props(props) {
|
|
106
|
+
return new FilterClass({
|
|
107
|
+
type: "object",
|
|
108
|
+
typename: null,
|
|
109
|
+
...propsFilterToAst(props)
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
static text(text, options) {
|
|
113
|
+
return new FilterClass({
|
|
114
|
+
type: "text-search",
|
|
115
|
+
text,
|
|
116
|
+
searchKind: options?.type
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
static foreignKeys(schema, keys) {
|
|
120
|
+
assertArgument(typeof schema === "string", "schema");
|
|
121
|
+
assertArgument(!schema.startsWith("dxn:"), "schema");
|
|
122
|
+
return new FilterClass({
|
|
123
|
+
type: "object",
|
|
124
|
+
typename: `dxn:type:${schema}`,
|
|
125
|
+
props: {},
|
|
126
|
+
foreignKeys: keys
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
static eq(value) {
|
|
130
|
+
if (!isRef(value) && typeof value === "object" && value !== null) throw new TypeError("Cannot use object as a value for eq filter");
|
|
131
|
+
return new FilterClass({
|
|
132
|
+
type: "compare",
|
|
133
|
+
operator: "eq",
|
|
134
|
+
value: isRef(value) ? value.noInline().encode() : value
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
static neq(value) {
|
|
138
|
+
return new FilterClass({
|
|
139
|
+
type: "compare",
|
|
140
|
+
operator: "neq",
|
|
141
|
+
value
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
static gt(value) {
|
|
145
|
+
return new FilterClass({
|
|
146
|
+
type: "compare",
|
|
147
|
+
operator: "gt",
|
|
148
|
+
value
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
static gte(value) {
|
|
152
|
+
return new FilterClass({
|
|
153
|
+
type: "compare",
|
|
154
|
+
operator: "gte",
|
|
155
|
+
value
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
static lt(value) {
|
|
159
|
+
return new FilterClass({
|
|
160
|
+
type: "compare",
|
|
161
|
+
operator: "lt",
|
|
162
|
+
value
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
static lte(value) {
|
|
166
|
+
return new FilterClass({
|
|
167
|
+
type: "compare",
|
|
168
|
+
operator: "lte",
|
|
169
|
+
value
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
static in(...values) {
|
|
173
|
+
return new FilterClass({
|
|
174
|
+
type: "in",
|
|
175
|
+
values
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
static contains(value) {
|
|
179
|
+
return new FilterClass({
|
|
180
|
+
type: "contains",
|
|
181
|
+
value
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
static between(from, to) {
|
|
185
|
+
return new FilterClass({
|
|
186
|
+
type: "range",
|
|
187
|
+
from,
|
|
188
|
+
to
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
static updated(range) {
|
|
192
|
+
return FilterClass.#timeRangeFilter("updatedAt", range);
|
|
193
|
+
}
|
|
194
|
+
static created(range) {
|
|
195
|
+
return FilterClass.#timeRangeFilter("createdAt", range);
|
|
196
|
+
}
|
|
197
|
+
static #timeRangeFilter(field, range) {
|
|
198
|
+
const toMs = (d) => typeof d === "number" ? d : d.getTime();
|
|
199
|
+
const filters = [];
|
|
200
|
+
if (range.after != null) filters.push(new FilterClass({
|
|
201
|
+
type: "timestamp",
|
|
202
|
+
field,
|
|
203
|
+
operator: "gte",
|
|
204
|
+
value: toMs(range.after)
|
|
205
|
+
}));
|
|
206
|
+
if (range.before != null) filters.push(new FilterClass({
|
|
207
|
+
type: "timestamp",
|
|
208
|
+
field,
|
|
209
|
+
operator: "lte",
|
|
210
|
+
value: toMs(range.before)
|
|
211
|
+
}));
|
|
212
|
+
if (filters.length === 0) return FilterClass.everything();
|
|
213
|
+
return filters.length === 1 ? filters[0] : FilterClass.and(...filters);
|
|
214
|
+
}
|
|
215
|
+
static not(filter) {
|
|
216
|
+
return new FilterClass({
|
|
217
|
+
type: "not",
|
|
218
|
+
filter: filter.ast
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
static and(...filters) {
|
|
222
|
+
return new FilterClass({
|
|
223
|
+
type: "and",
|
|
224
|
+
filters: filters.map((f) => f.ast)
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
static or(...filters) {
|
|
228
|
+
return new FilterClass({
|
|
229
|
+
type: "or",
|
|
230
|
+
filters: filters.map((f) => f.ast)
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
/** Returns a human-readable string representation of a Filter AST. */
|
|
234
|
+
static pretty(filter) {
|
|
235
|
+
return prettyFilter(filter.ast);
|
|
236
|
+
}
|
|
237
|
+
constructor(ast) {
|
|
238
|
+
this.ast = ast;
|
|
239
|
+
}
|
|
240
|
+
"~Filter" = FilterClass.variance;
|
|
214
241
|
};
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
return {
|
|
227
|
-
id: idFilter,
|
|
228
|
-
props: Object.fromEntries(
|
|
229
|
-
Object.entries(predicates).filter(([prop, _value]) => prop !== "id").map(([prop, predicate]) => [prop, processPredicate(predicate)])
|
|
230
|
-
)
|
|
231
|
-
};
|
|
242
|
+
const Filter1 = FilterClass;
|
|
243
|
+
const propsFilterToAst = (predicates) => {
|
|
244
|
+
let idFilter;
|
|
245
|
+
if ("id" in predicates) {
|
|
246
|
+
assertArgument(typeof predicates.id === "string" || Array.isArray(predicates.id), "predicates.id", "invalid id filter");
|
|
247
|
+
idFilter = typeof predicates.id === "string" ? [predicates.id] : predicates.id;
|
|
248
|
+
}
|
|
249
|
+
return {
|
|
250
|
+
id: idFilter,
|
|
251
|
+
props: Object.fromEntries(Object.entries(predicates).filter(([prop, _value]) => prop !== "id").map(([prop, predicate]) => [prop, processPredicate(predicate)]))
|
|
252
|
+
};
|
|
232
253
|
};
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
Object.entries(predicate).map(([key, value]) => [key, processPredicate(value)])
|
|
243
|
-
);
|
|
244
|
-
return {
|
|
245
|
-
type: "object",
|
|
246
|
-
typename: null,
|
|
247
|
-
props: nestedProps
|
|
248
|
-
};
|
|
249
|
-
}
|
|
250
|
-
return FilterClass.eq(predicate).ast;
|
|
254
|
+
const processPredicate = (predicate) => {
|
|
255
|
+
if (FilterClass.is(predicate)) return predicate.ast;
|
|
256
|
+
if (Array.isArray(predicate)) throw new Error("Array predicates are not yet supported.");
|
|
257
|
+
if (!isRef(predicate) && typeof predicate === "object" && predicate !== null) return {
|
|
258
|
+
type: "object",
|
|
259
|
+
typename: null,
|
|
260
|
+
props: Object.fromEntries(Object.entries(predicate).map(([key, value]) => [key, processPredicate(value)]))
|
|
261
|
+
};
|
|
262
|
+
return FilterClass.eq(predicate).ast;
|
|
251
263
|
};
|
|
252
|
-
var QueryClass = class
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
264
|
+
var QueryClass = class QueryClass {
|
|
265
|
+
static "variance" = {};
|
|
266
|
+
static is(value) {
|
|
267
|
+
return typeof value === "object" && value !== null && "~Query" in value;
|
|
268
|
+
}
|
|
269
|
+
static fromAst(ast) {
|
|
270
|
+
return new QueryClass(ast);
|
|
271
|
+
}
|
|
272
|
+
static select(filter) {
|
|
273
|
+
return new QueryClass({
|
|
274
|
+
type: "select",
|
|
275
|
+
filter: filter.ast
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
select(filter) {
|
|
279
|
+
if (FilterClass.is(filter)) return new QueryClass({
|
|
280
|
+
type: "filter",
|
|
281
|
+
selection: this.ast,
|
|
282
|
+
filter: filter.ast
|
|
283
|
+
});
|
|
284
|
+
else return new QueryClass({
|
|
285
|
+
type: "filter",
|
|
286
|
+
selection: this.ast,
|
|
287
|
+
filter: FilterClass.props(filter).ast
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
static type(schema, predicates) {
|
|
291
|
+
return new QueryClass({
|
|
292
|
+
type: "select",
|
|
293
|
+
filter: FilterClass.type(schema, predicates).ast
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
static all(...queries) {
|
|
297
|
+
if (queries.length === 0) throw new TypeError("Query.all combines results of multiple queries, to query all objects use Query.select(Filter.everything())");
|
|
298
|
+
return new QueryClass({
|
|
299
|
+
type: "union",
|
|
300
|
+
queries: queries.map((q) => q.ast)
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
static without(source, exclude) {
|
|
304
|
+
return new QueryClass({
|
|
305
|
+
type: "set-difference",
|
|
306
|
+
source: source.ast,
|
|
307
|
+
exclude: exclude.ast
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
static from(source, options) {
|
|
311
|
+
return new QueryClass({
|
|
312
|
+
type: "select",
|
|
313
|
+
filter: FilterClass.everything().ast
|
|
314
|
+
}).from(source, options);
|
|
315
|
+
}
|
|
316
|
+
from(arg, options) {
|
|
317
|
+
if (arg === "all-accessible-spaces") return new QueryClass({
|
|
318
|
+
type: "from",
|
|
319
|
+
query: this.ast,
|
|
320
|
+
from: {
|
|
321
|
+
_tag: "scope",
|
|
322
|
+
scope: { ...options?.includeFeeds ? { allQueuesFromSpaces: true } : {} }
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
if (_isScopeLike(arg)) return new QueryClass({
|
|
326
|
+
type: "from",
|
|
327
|
+
query: this.ast,
|
|
328
|
+
from: {
|
|
329
|
+
_tag: "scope",
|
|
330
|
+
scope: arg
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
throw new TypeError("Database and Feed objects are not supported in query-lite sandbox");
|
|
334
|
+
}
|
|
335
|
+
/** Returns a human-readable string representation of a Query AST. */
|
|
336
|
+
static pretty(query) {
|
|
337
|
+
return prettyQuery(query.ast);
|
|
338
|
+
}
|
|
339
|
+
constructor(ast) {
|
|
340
|
+
this.ast = ast;
|
|
341
|
+
}
|
|
342
|
+
"~Query" = QueryClass.variance;
|
|
343
|
+
reference(key) {
|
|
344
|
+
return new QueryClass({
|
|
345
|
+
type: "reference-traversal",
|
|
346
|
+
anchor: this.ast,
|
|
347
|
+
property: key
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
referencedBy(target, key) {
|
|
351
|
+
const typename = target !== void 0 ? (assertArgument(typeof target === "string", "target"), assertArgument(!target.startsWith("dxn:"), "target"), target) : null;
|
|
352
|
+
return new QueryClass({
|
|
353
|
+
type: "incoming-references",
|
|
354
|
+
anchor: this.ast,
|
|
355
|
+
property: key ?? null,
|
|
356
|
+
typename
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
sourceOf(relation, predicates) {
|
|
360
|
+
return new QueryClass({
|
|
361
|
+
type: "relation",
|
|
362
|
+
anchor: this.ast,
|
|
363
|
+
direction: "outgoing",
|
|
364
|
+
filter: relation !== void 0 ? FilterClass.type(relation, predicates).ast : void 0
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
targetOf(relation, predicates) {
|
|
368
|
+
return new QueryClass({
|
|
369
|
+
type: "relation",
|
|
370
|
+
anchor: this.ast,
|
|
371
|
+
direction: "incoming",
|
|
372
|
+
filter: relation !== void 0 ? FilterClass.type(relation, predicates).ast : void 0
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
source() {
|
|
376
|
+
return new QueryClass({
|
|
377
|
+
type: "relation-traversal",
|
|
378
|
+
anchor: this.ast,
|
|
379
|
+
direction: "source"
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
target() {
|
|
383
|
+
return new QueryClass({
|
|
384
|
+
type: "relation-traversal",
|
|
385
|
+
anchor: this.ast,
|
|
386
|
+
direction: "target"
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
parent() {
|
|
390
|
+
return new QueryClass({
|
|
391
|
+
type: "hierarchy-traversal",
|
|
392
|
+
anchor: this.ast,
|
|
393
|
+
direction: "to-parent"
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
children() {
|
|
397
|
+
return new QueryClass({
|
|
398
|
+
type: "hierarchy-traversal",
|
|
399
|
+
anchor: this.ast,
|
|
400
|
+
direction: "to-children"
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
orderBy(...order) {
|
|
404
|
+
return new QueryClass({
|
|
405
|
+
type: "order",
|
|
406
|
+
query: this.ast,
|
|
407
|
+
order: order.map((o) => o.ast)
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
limit(limit) {
|
|
411
|
+
return new QueryClass({
|
|
412
|
+
type: "limit",
|
|
413
|
+
query: this.ast,
|
|
414
|
+
limit
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
options(options) {
|
|
418
|
+
return new QueryClass({
|
|
419
|
+
type: "options",
|
|
420
|
+
query: this.ast,
|
|
421
|
+
options
|
|
422
|
+
});
|
|
423
|
+
}
|
|
370
424
|
};
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
425
|
+
const Query1 = QueryClass;
|
|
426
|
+
const RefTypeId = Symbol("@dxos/echo-query/Ref");
|
|
427
|
+
const isRef = (obj) => {
|
|
428
|
+
return obj && typeof obj === "object" && RefTypeId in obj;
|
|
375
429
|
};
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
430
|
+
const makeTypeDxn = (typename) => {
|
|
431
|
+
assertArgument(typeof typename === "string", "typename");
|
|
432
|
+
assertArgument(!typename.startsWith("dxn:"), "typename");
|
|
433
|
+
return `dxn:type:${typename}`;
|
|
380
434
|
};
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
435
|
+
const SCOPE_KEYS = new Set([
|
|
436
|
+
"spaceIds",
|
|
437
|
+
"queues",
|
|
438
|
+
"allQueuesFromSpaces"
|
|
439
|
+
]);
|
|
440
|
+
const _isScopeLike = (value) => {
|
|
441
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
|
|
442
|
+
return Object.keys(value).every((key) => SCOPE_KEYS.has(key));
|
|
387
443
|
};
|
|
444
|
+
const prettyFilter = (filter) => {
|
|
445
|
+
switch (filter.type) {
|
|
446
|
+
case "object": {
|
|
447
|
+
const parts = [];
|
|
448
|
+
if (filter.typename !== null) parts.push(JSON.stringify(filter.typename));
|
|
449
|
+
const propEntries = Object.entries(filter.props);
|
|
450
|
+
if (propEntries.length > 0) {
|
|
451
|
+
const propsStr = propEntries.map(([k, v]) => `${k}: ${prettyFilter(v)}`).join(", ");
|
|
452
|
+
parts.push(`{ ${propsStr} }`);
|
|
453
|
+
}
|
|
454
|
+
if (filter.id !== void 0) parts.push(`id: [${filter.id.join(", ")}]`);
|
|
455
|
+
return parts.length > 0 ? `Filter.type(${parts.join(", ")})` : "Filter.everything()";
|
|
456
|
+
}
|
|
457
|
+
case "compare": return `Filter.${filter.operator}(${JSON.stringify(filter.value)})`;
|
|
458
|
+
case "in": return `Filter.in(${filter.values.map((v) => JSON.stringify(v)).join(", ")})`;
|
|
459
|
+
case "contains": return `Filter.contains(${JSON.stringify(filter.value)})`;
|
|
460
|
+
case "range": return `Filter.between(${JSON.stringify(filter.from)}, ${JSON.stringify(filter.to)})`;
|
|
461
|
+
case "text-search": return `Filter.text(${JSON.stringify(filter.text)})`;
|
|
462
|
+
case "tag": return `Filter.tag(${JSON.stringify(filter.tag)})`;
|
|
463
|
+
case "timestamp": return `Filter.${filter.field}.${filter.operator}(${filter.value})`;
|
|
464
|
+
case "not": return `Filter.not(${prettyFilter(filter.filter)})`;
|
|
465
|
+
case "and": return `Filter.and(${filter.filters.map(prettyFilter).join(", ")})`;
|
|
466
|
+
case "or": return `Filter.or(${filter.filters.map(prettyFilter).join(", ")})`;
|
|
467
|
+
}
|
|
468
|
+
};
|
|
469
|
+
const prettyQuery = (query) => {
|
|
470
|
+
switch (query.type) {
|
|
471
|
+
case "select": return `Query.select(${prettyFilter(query.filter)})`;
|
|
472
|
+
case "filter": return `${prettyQuery(query.selection)}.select(${prettyFilter(query.filter)})`;
|
|
473
|
+
case "reference-traversal": return `${prettyQuery(query.anchor)}.reference(${JSON.stringify(query.property)})`;
|
|
474
|
+
case "incoming-references": {
|
|
475
|
+
const args = [];
|
|
476
|
+
if (query.typename !== null) args.push(JSON.stringify(query.typename));
|
|
477
|
+
if (query.property !== null) args.push(JSON.stringify(query.property));
|
|
478
|
+
return `${prettyQuery(query.anchor)}.referencedBy(${args.join(", ")})`;
|
|
479
|
+
}
|
|
480
|
+
case "relation": {
|
|
481
|
+
const method = query.direction === "outgoing" ? "sourceOf" : query.direction === "incoming" ? "targetOf" : "relationOf";
|
|
482
|
+
const filterStr = query.filter !== void 0 ? prettyFilter(query.filter) : "";
|
|
483
|
+
return `${prettyQuery(query.anchor)}.${method}(${filterStr})`;
|
|
484
|
+
}
|
|
485
|
+
case "relation-traversal": return `${prettyQuery(query.anchor)}.${query.direction}()`;
|
|
486
|
+
case "hierarchy-traversal": return query.direction === "to-parent" ? `${prettyQuery(query.anchor)}.parent()` : `${prettyQuery(query.anchor)}.children()`;
|
|
487
|
+
case "union": return `Query.all(${query.queries.map(prettyQuery).join(", ")})`;
|
|
488
|
+
case "set-difference": return `Query.without(${prettyQuery(query.source)}, ${prettyQuery(query.exclude)})`;
|
|
489
|
+
case "order": {
|
|
490
|
+
const orders = query.order.map((o) => {
|
|
491
|
+
if (o.kind === "natural") return "Order.natural";
|
|
492
|
+
if (o.kind === "rank") return `Order.rank(${JSON.stringify(o.direction)})`;
|
|
493
|
+
return `Order.property(${JSON.stringify(o.property)}, ${JSON.stringify(o.direction)})`;
|
|
494
|
+
});
|
|
495
|
+
return `${prettyQuery(query.query)}.orderBy(${orders.join(", ")})`;
|
|
496
|
+
}
|
|
497
|
+
case "options": {
|
|
498
|
+
const parts = [];
|
|
499
|
+
if (query.options.deleted !== void 0) parts.push(`deleted: ${JSON.stringify(query.options.deleted)}`);
|
|
500
|
+
return `${prettyQuery(query.query)}.options({ ${parts.join(", ")} })`;
|
|
501
|
+
}
|
|
502
|
+
case "from":
|
|
503
|
+
if (query.from._tag === "scope") {
|
|
504
|
+
const scope = query.from.scope;
|
|
505
|
+
const parts = [];
|
|
506
|
+
if (scope.spaceIds !== void 0) parts.push(`spaceIds: [${scope.spaceIds.join(", ")}]`);
|
|
507
|
+
if (scope.queues !== void 0) parts.push(`queues: [${scope.queues.join(", ")}]`);
|
|
508
|
+
if (scope.allQueuesFromSpaces !== void 0) parts.push(`allQueuesFromSpaces: ${scope.allQueuesFromSpaces}`);
|
|
509
|
+
return `${prettyQuery(query.query)}.from({ ${parts.join(", ")} })`;
|
|
510
|
+
}
|
|
511
|
+
return `${prettyQuery(query.query)}.from(${prettyQuery(query.from.query)})`;
|
|
512
|
+
case "limit": return `${prettyQuery(query.query)}.limit(${query.limit})`;
|
|
513
|
+
}
|
|
514
|
+
};
|
|
515
|
+
|
|
516
|
+
//#endregion
|
|
517
|
+
export { Filter1 as Filter, Filter1, Order2 as Order, Query1 as Query, Query1 };
|
|
518
|
+
//# sourceMappingURL=index.js.map
|