@dxos/echo-query 0.8.4-main.2e9d522 → 0.8.4-main.3c1ae3b

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +1 -1
  2. package/dist/lib/browser/index.mjs +717 -0
  3. package/dist/lib/browser/index.mjs.map +4 -4
  4. package/dist/lib/browser/meta.json +1 -1
  5. package/dist/lib/node-esm/index.mjs +717 -0
  6. package/dist/lib/node-esm/index.mjs.map +4 -4
  7. package/dist/lib/node-esm/meta.json +1 -1
  8. package/dist/query-lite/index.d.ts +8645 -0
  9. package/dist/query-lite/index.d.ts.map +1 -0
  10. package/dist/query-lite/index.js +357 -0
  11. package/dist/query-lite/index.js.map +1 -0
  12. package/dist/types/src/index.d.ts +2 -0
  13. package/dist/types/src/index.d.ts.map +1 -1
  14. package/dist/types/src/parser/gen/index.d.ts +8 -0
  15. package/dist/types/src/parser/gen/index.d.ts.map +1 -0
  16. package/dist/types/src/parser/gen/query.d.ts +3 -0
  17. package/dist/types/src/parser/gen/query.d.ts.map +1 -0
  18. package/dist/types/src/parser/gen/query.terms.d.ts +2 -0
  19. package/dist/types/src/parser/gen/query.terms.d.ts.map +1 -0
  20. package/dist/types/src/parser/index.d.ts +3 -0
  21. package/dist/types/src/parser/index.d.ts.map +1 -0
  22. package/dist/types/src/parser/query-builder.d.ts +82 -0
  23. package/dist/types/src/parser/query-builder.d.ts.map +1 -0
  24. package/dist/types/src/parser/query.test.d.ts +2 -0
  25. package/dist/types/src/parser/query.test.d.ts.map +1 -0
  26. package/dist/types/src/query-lite/index.d.ts +2 -0
  27. package/dist/types/src/query-lite/index.d.ts.map +1 -0
  28. package/dist/types/src/query-lite/query-lite.d.ts +8 -0
  29. package/dist/types/src/query-lite/query-lite.d.ts.map +1 -0
  30. package/dist/types/src/sandbox/index.d.ts +2 -0
  31. package/dist/types/src/sandbox/index.d.ts.map +1 -0
  32. package/dist/types/src/sandbox/query-sandbox.d.ts +21 -0
  33. package/dist/types/src/sandbox/query-sandbox.d.ts.map +1 -0
  34. package/dist/types/src/sandbox/query-sandbox.test.d.ts +2 -0
  35. package/dist/types/src/sandbox/query-sandbox.test.d.ts.map +1 -0
  36. package/dist/types/src/sandbox/quickjs.d.ts +8 -0
  37. package/dist/types/src/sandbox/quickjs.d.ts.map +1 -0
  38. package/dist/types/src/sandbox/quickjs.test.d.ts +2 -0
  39. package/dist/types/src/sandbox/quickjs.test.d.ts.map +1 -0
  40. package/dist/types/tsconfig.tsbuildinfo +1 -1
  41. package/package.json +25 -8
  42. package/src/env.d.ts +8 -0
  43. package/src/index.ts +3 -0
  44. package/src/parser/gen/index.ts +13 -0
  45. package/src/parser/gen/query.terms.ts +27 -0
  46. package/src/parser/gen/query.ts +18 -0
  47. package/src/parser/index.ts +6 -0
  48. package/src/parser/query-builder.ts +539 -0
  49. package/src/parser/query.grammar +130 -0
  50. package/src/parser/query.test.ts +416 -0
  51. package/src/query-lite/index.ts +5 -0
  52. package/src/query-lite/query-lite.ts +472 -0
  53. package/src/sandbox/index.ts +5 -0
  54. package/src/sandbox/query-sandbox.test.ts +53 -0
  55. package/src/sandbox/query-sandbox.ts +72 -0
  56. package/src/sandbox/quickjs.test.ts +67 -0
  57. package/src/sandbox/quickjs.ts +33 -0
  58. package/dist/types/src/search.test.d.ts +0 -2
  59. package/dist/types/src/search.test.d.ts.map +0 -1
  60. package/src/search.test.ts +0 -49
@@ -0,0 +1,357 @@
1
+ //#region ../../../common/invariant/dist/lib/browser/index.mjs
2
+ var assertArgument = (condition, argumentName, message) => {
3
+ if (!condition) {
4
+ const error = /* @__PURE__ */ new TypeError(`Invalid argument \`${argumentName}\`` + (message ? `: ${message}` : ""));
5
+ Error.captureStackTrace(error, assertArgument);
6
+ throw error;
7
+ }
8
+ };
9
+
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;
21
+ };
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
+ })(Order1 || (Order1 = {}));
31
+ const Order2 = Order1;
32
+ var FilterClass = class FilterClass {
33
+ static variance = {};
34
+ static is(value) {
35
+ return typeof value === "object" && value !== null && "~Filter" in value;
36
+ }
37
+ static fromAst(ast) {
38
+ return new FilterClass(ast);
39
+ }
40
+ static everything() {
41
+ return new FilterClass({
42
+ type: "object",
43
+ typename: null,
44
+ props: {}
45
+ });
46
+ }
47
+ static nothing() {
48
+ return new FilterClass({
49
+ type: "not",
50
+ filter: {
51
+ type: "object",
52
+ typename: null,
53
+ props: {}
54
+ }
55
+ });
56
+ }
57
+ static relation() {
58
+ return new FilterClass({
59
+ type: "object",
60
+ typename: null,
61
+ props: {}
62
+ });
63
+ }
64
+ static id(...ids) {
65
+ if (ids.length === 0) return FilterClass.nothing();
66
+ return new FilterClass({
67
+ type: "object",
68
+ typename: null,
69
+ id: ids,
70
+ props: {}
71
+ });
72
+ }
73
+ static type(schema, props) {
74
+ if (typeof schema !== "string") throw new TypeError("expected typename as the first paramter");
75
+ return new FilterClass({
76
+ type: "object",
77
+ typename: makeTypeDxn(schema),
78
+ ...propsFilterToAst(props ?? {})
79
+ });
80
+ }
81
+ static typename(typename) {
82
+ return new FilterClass({
83
+ type: "object",
84
+ typename: makeTypeDxn(typename),
85
+ props: {}
86
+ });
87
+ }
88
+ static typeDXN(dxn) {
89
+ return new FilterClass({
90
+ type: "object",
91
+ typename: dxn.toString(),
92
+ props: {}
93
+ });
94
+ }
95
+ static tag(tag) {
96
+ return new FilterClass({
97
+ type: "tag",
98
+ tag
99
+ });
100
+ }
101
+ static props(props) {
102
+ return new FilterClass({
103
+ type: "object",
104
+ typename: null,
105
+ ...propsFilterToAst(props)
106
+ });
107
+ }
108
+ static text(text, options) {
109
+ return new FilterClass({
110
+ type: "text-search",
111
+ text,
112
+ searchKind: options?.type
113
+ });
114
+ }
115
+ static foreignKeys(schema, keys) {
116
+ assertArgument(typeof schema === "string", "schema");
117
+ assertArgument(!schema.startsWith("dxn:"), "schema");
118
+ return new FilterClass({
119
+ type: "object",
120
+ typename: `dxn:type:${schema}`,
121
+ props: {},
122
+ foreignKeys: keys
123
+ });
124
+ }
125
+ static eq(value) {
126
+ if (!isRef(value) && typeof value === "object" && value !== null) throw new TypeError("Cannot use object as a value for eq filter");
127
+ return new FilterClass({
128
+ type: "compare",
129
+ operator: "eq",
130
+ value: isRef(value) ? value.noInline().encode() : value
131
+ });
132
+ }
133
+ static neq(value) {
134
+ return new FilterClass({
135
+ type: "compare",
136
+ operator: "neq",
137
+ value
138
+ });
139
+ }
140
+ static gt(value) {
141
+ return new FilterClass({
142
+ type: "compare",
143
+ operator: "gt",
144
+ value
145
+ });
146
+ }
147
+ static gte(value) {
148
+ return new FilterClass({
149
+ type: "compare",
150
+ operator: "gte",
151
+ value
152
+ });
153
+ }
154
+ static lt(value) {
155
+ return new FilterClass({
156
+ type: "compare",
157
+ operator: "lt",
158
+ value
159
+ });
160
+ }
161
+ static lte(value) {
162
+ return new FilterClass({
163
+ type: "compare",
164
+ operator: "lte",
165
+ value
166
+ });
167
+ }
168
+ static in(...values) {
169
+ return new FilterClass({
170
+ type: "in",
171
+ values
172
+ });
173
+ }
174
+ static contains(value) {
175
+ return new FilterClass({
176
+ type: "contains",
177
+ value
178
+ });
179
+ }
180
+ static between(from, to) {
181
+ return new FilterClass({
182
+ type: "range",
183
+ from,
184
+ to
185
+ });
186
+ }
187
+ static not(filter) {
188
+ return new FilterClass({
189
+ type: "not",
190
+ filter: filter.ast
191
+ });
192
+ }
193
+ static and(...filters) {
194
+ return new FilterClass({
195
+ type: "and",
196
+ filters: filters.map((f) => f.ast)
197
+ });
198
+ }
199
+ static or(...filters) {
200
+ return new FilterClass({
201
+ type: "or",
202
+ filters: filters.map((f) => f.ast)
203
+ });
204
+ }
205
+ constructor(ast) {
206
+ this.ast = ast;
207
+ }
208
+ "~Filter" = FilterClass.variance;
209
+ };
210
+ const Filter1 = FilterClass;
211
+ const propsFilterToAst = (predicates) => {
212
+ let idFilter;
213
+ if ("id" in predicates) {
214
+ assertArgument(typeof predicates.id === "string" || Array.isArray(predicates.id), "predicates.id", "invalid id filter");
215
+ idFilter = typeof predicates.id === "string" ? [predicates.id] : predicates.id;
216
+ }
217
+ return {
218
+ id: idFilter,
219
+ props: Object.fromEntries(Object.entries(predicates).filter(([prop, _value]) => prop !== "id").map(([prop, predicate]) => [prop, processPredicate(predicate)]))
220
+ };
221
+ };
222
+ const processPredicate = (predicate) => {
223
+ if (FilterClass.is(predicate)) return predicate.ast;
224
+ if (Array.isArray(predicate)) throw new Error("Array predicates are not yet supported.");
225
+ if (!isRef(predicate) && typeof predicate === "object" && predicate !== null) return {
226
+ type: "object",
227
+ typename: null,
228
+ props: Object.fromEntries(Object.entries(predicate).map(([key, value]) => [key, processPredicate(value)]))
229
+ };
230
+ return FilterClass.eq(predicate).ast;
231
+ };
232
+ var QueryClass = class QueryClass {
233
+ static variance = {};
234
+ static is(value) {
235
+ return typeof value === "object" && value !== null && "~Query" in value;
236
+ }
237
+ static fromAst(ast) {
238
+ return new QueryClass(ast);
239
+ }
240
+ static select(filter) {
241
+ return new QueryClass({
242
+ type: "select",
243
+ filter: filter.ast
244
+ });
245
+ }
246
+ static type(schema, predicates) {
247
+ return new QueryClass({
248
+ type: "select",
249
+ filter: FilterClass.type(schema, predicates).ast
250
+ });
251
+ }
252
+ static all(...queries) {
253
+ if (queries.length === 0) throw new TypeError("Query.all combines results of multiple queries, to query all objects use Query.select(Filter.everything())");
254
+ return new QueryClass({
255
+ type: "union",
256
+ queries: queries.map((q) => q.ast)
257
+ });
258
+ }
259
+ static without(source, exclude) {
260
+ return new QueryClass({
261
+ type: "set-difference",
262
+ source: source.ast,
263
+ exclude: exclude.ast
264
+ });
265
+ }
266
+ constructor(ast) {
267
+ this.ast = ast;
268
+ }
269
+ "~Query" = QueryClass.variance;
270
+ select(filter) {
271
+ if (FilterClass.is(filter)) return new QueryClass({
272
+ type: "filter",
273
+ selection: this.ast,
274
+ filter: filter.ast
275
+ });
276
+ else return new QueryClass({
277
+ type: "filter",
278
+ selection: this.ast,
279
+ filter: FilterClass.props(filter).ast
280
+ });
281
+ }
282
+ reference(key) {
283
+ return new QueryClass({
284
+ type: "reference-traversal",
285
+ anchor: this.ast,
286
+ property: key
287
+ });
288
+ }
289
+ referencedBy(target, key) {
290
+ assertArgument(typeof target === "string", "target");
291
+ assertArgument(!target.startsWith("dxn:"), "target");
292
+ return new QueryClass({
293
+ type: "incoming-references",
294
+ anchor: this.ast,
295
+ property: key,
296
+ typename: target
297
+ });
298
+ }
299
+ sourceOf(relation, predicates) {
300
+ return new QueryClass({
301
+ type: "relation",
302
+ anchor: this.ast,
303
+ direction: "outgoing",
304
+ filter: FilterClass.type(relation, predicates).ast
305
+ });
306
+ }
307
+ targetOf(relation, predicates) {
308
+ return new QueryClass({
309
+ type: "relation",
310
+ anchor: this.ast,
311
+ direction: "incoming",
312
+ filter: FilterClass.type(relation, predicates).ast
313
+ });
314
+ }
315
+ source() {
316
+ return new QueryClass({
317
+ type: "relation-traversal",
318
+ anchor: this.ast,
319
+ direction: "source"
320
+ });
321
+ }
322
+ target() {
323
+ return new QueryClass({
324
+ type: "relation-traversal",
325
+ anchor: this.ast,
326
+ direction: "target"
327
+ });
328
+ }
329
+ orderBy(...order) {
330
+ return new QueryClass({
331
+ type: "order",
332
+ query: this.ast,
333
+ order: order.map((o) => o.ast)
334
+ });
335
+ }
336
+ options(options) {
337
+ return new QueryClass({
338
+ type: "options",
339
+ query: this.ast,
340
+ options
341
+ });
342
+ }
343
+ };
344
+ const Query1 = QueryClass;
345
+ const RefTypeId = Symbol("@dxos/echo-query/Ref");
346
+ const isRef = (obj) => {
347
+ return obj && typeof obj === "object" && RefTypeId in obj;
348
+ };
349
+ const makeTypeDxn = (typename) => {
350
+ assertArgument(typeof typename === "string", "typename");
351
+ assertArgument(!typename.startsWith("dxn:"), "typename");
352
+ return `dxn:type:${typename}`;
353
+ };
354
+
355
+ //#endregion
356
+ export { Filter1 as Filter, Filter1, Order2 as Order, Query1 as Query, Query1 };
357
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["ast: QueryAST.Order","Order2: typeof Order$","ast: QueryAST.Filter","Filter1: typeof Filter$","idFilter: readonly ObjectId[] | undefined","ast: QueryAST.Query","Query1: typeof Query$","RefTypeId: unique symbol"],"sources":["../../../../../common/invariant/dist/lib/browser/index.mjs","../../src/query-lite/query-lite.ts"],"sourcesContent":["// src/invariant.ts\nvar invariant = (condition, message, meta) => {\n if (condition) {\n return;\n }\n if (message?.startsWith(\"BUG\")) {\n debugger;\n }\n let errorMessage = \"invariant violation\";\n if (message) {\n errorMessage += `: ${message}`;\n }\n if (meta?.A) {\n errorMessage += ` [${meta.A[0]}]`;\n }\n if (meta?.F) {\n errorMessage += ` at ${getRelativeFilename(meta.F)}:${meta.L}`;\n }\n const error = new InvariantViolation(errorMessage);\n Error.captureStackTrace(error, invariant);\n throw error;\n};\nvar InvariantViolation = class extends Error {\n constructor(message) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n};\nvar getRelativeFilename = (filename) => {\n const match = filename.match(/.+\\/(packages\\/.+\\/.+)/);\n if (match) {\n const [, filePath] = match;\n return filePath;\n }\n return filename;\n};\nvar failedInvariant = (message1, message2, meta) => {\n let errorMessage = \"invariant violation\";\n const message = [\n message1,\n message2\n ].filter((str) => typeof str === \"string\").join(\" \");\n if (message) {\n errorMessage += `: ${message}`;\n }\n if (meta?.A) {\n errorMessage += ` [${meta.A[0]}]`;\n }\n if (meta?.F) {\n errorMessage += ` at ${getRelativeFilename(meta.F)}:${meta.L}`;\n }\n throw new InvariantViolation(errorMessage);\n};\n\n// src/assert.ts\nvar assertArgument = (condition, argumentName, message) => {\n if (!condition) {\n const error = new TypeError(`Invalid argument \\`${argumentName}\\`` + (message ? `: ${message}` : \"\"));\n Error.captureStackTrace(error, assertArgument);\n throw error;\n }\n};\nvar assertState = (condition, message) => {\n if (!condition) {\n const error = new InvalidStateError(message);\n Error.captureStackTrace(error, assertState);\n throw error;\n }\n};\nvar InvalidStateError = class extends Error {\n};\nexport {\n InvalidStateError,\n InvariantViolation,\n assertArgument,\n assertState,\n failedInvariant,\n invariant\n};\n//# sourceMappingURL=index.mjs.map\n","//\n// Copyright 2025 DXOS.org\n//\n\nimport type * as Schema from 'effect/Schema';\n\nimport type { Filter as Filter$, Order as Order$, Query as Query$, Ref } from '@dxos/echo';\nimport type { ForeignKey, QueryAST } from '@dxos/echo-protocol';\nimport { assertArgument } from '@dxos/invariant';\nimport type { DXN, ObjectId } from '@dxos/keys';\n\n//\n// Light-weight implementation of query execution.\n//\n\n// TODO(wittjosiah): The `export * as ...` syntax causes tsdown to genereate multiple files which breaks the sandbox.\n\nclass OrderClass implements Order$.Any {\n private static variance: Order$.Any['~Order'] = {} as Order$.Any['~Order'];\n\n static is(value: unknown): value is Order$.Any {\n return typeof value === 'object' && value !== null && '~Order' in value;\n }\n\n constructor(public readonly ast: QueryAST.Order) {}\n\n '~Order' = OrderClass.variance;\n}\n\nnamespace Order1 {\n export const natural: Order$.Any = new OrderClass({ kind: 'natural' });\n export const property = <T>(property: keyof T & string, direction: QueryAST.OrderDirection): Order$.Order<T> =>\n new OrderClass({\n kind: 'property',\n property,\n direction,\n });\n}\n\nconst Order2: typeof Order$ = Order1;\nexport { Order2 as Order };\n\nclass FilterClass implements Filter$.Any {\n private static variance: Filter$.Any['~Filter'] = {} as Filter$.Any['~Filter'];\n\n static is(value: unknown): value is Filter$.Any {\n return typeof value === 'object' && value !== null && '~Filter' in value;\n }\n\n static fromAst(ast: QueryAST.Filter): Filter$.Any {\n return new FilterClass(ast);\n }\n\n static everything(): FilterClass {\n return new FilterClass({\n type: 'object',\n typename: null,\n props: {},\n });\n }\n\n static nothing(): FilterClass {\n return new FilterClass({\n type: 'not',\n filter: {\n type: 'object',\n typename: null,\n props: {},\n },\n });\n }\n\n static relation() {\n return new FilterClass({\n type: 'object',\n typename: null,\n props: {},\n });\n }\n\n static id(...ids: ObjectId[]): Filter$.Any {\n // assertArgument(\n // ids.every((id) => ObjectId.isValid(id)),\n // 'ids',\n // 'ids must be valid',\n // );\n\n if (ids.length === 0) {\n return FilterClass.nothing();\n }\n\n return new FilterClass({\n type: 'object',\n typename: null,\n id: ids,\n props: {},\n });\n }\n\n static type<S extends Schema.Schema.All>(\n schema: S | string,\n props?: Filter$.Props<Schema.Schema.Type<S>>,\n ): Filter$.Filter<Schema.Schema.Type<S>> {\n if (typeof schema !== 'string') {\n throw new TypeError('expected typename as the first paramter');\n }\n return new FilterClass({\n type: 'object',\n typename: makeTypeDxn(schema),\n ...propsFilterToAst(props ?? {}),\n });\n }\n\n static typename(typename: string): Filter$.Any {\n return new FilterClass({\n type: 'object',\n typename: makeTypeDxn(typename),\n props: {},\n });\n }\n\n static typeDXN(dxn: DXN): Filter$.Any {\n return new FilterClass({\n type: 'object',\n typename: dxn.toString(),\n props: {},\n });\n }\n\n static tag(tag: string): Filter$.Any {\n return new FilterClass({\n type: 'tag',\n tag,\n });\n }\n\n static props<T>(props: Filter$.Props<T>): Filter$.Filter<T> {\n return new FilterClass({\n type: 'object',\n typename: null,\n ...propsFilterToAst(props),\n });\n }\n\n static text(text: string, options?: Filter$.TextSearchOptions): Filter$.Any {\n return new FilterClass({\n type: 'text-search',\n text,\n searchKind: options?.type,\n });\n }\n\n static foreignKeys<S extends Schema.Schema.All>(\n schema: S | string,\n keys: ForeignKey[],\n ): Filter$.Filter<Schema.Schema.Type<S>> {\n assertArgument(typeof schema === 'string', 'schema');\n assertArgument(!schema.startsWith('dxn:'), 'schema');\n return new FilterClass({\n type: 'object',\n typename: `dxn:type:${schema}`,\n props: {},\n foreignKeys: keys,\n });\n }\n\n static eq<T>(value: T): Filter$.Filter<T | undefined> {\n if (!isRef(value) && typeof value === 'object' && value !== null) {\n throw new TypeError('Cannot use object as a value for eq filter');\n }\n\n return new FilterClass({\n type: 'compare',\n operator: 'eq',\n value: isRef(value) ? value.noInline().encode() : value,\n });\n }\n\n static neq<T>(value: T): Filter$.Filter<T | undefined> {\n return new FilterClass({\n type: 'compare',\n operator: 'neq',\n value,\n });\n }\n\n static gt<T>(value: T): Filter$.Filter<T | undefined> {\n return new FilterClass({\n type: 'compare',\n operator: 'gt',\n value,\n });\n }\n\n static gte<T>(value: T): Filter$.Filter<T | undefined> {\n return new FilterClass({\n type: 'compare',\n operator: 'gte',\n value,\n });\n }\n\n static lt<T>(value: T): Filter$.Filter<T | undefined> {\n return new FilterClass({\n type: 'compare',\n operator: 'lt',\n value,\n });\n }\n\n static lte<T>(value: T): Filter$.Filter<T | undefined> {\n return new FilterClass({\n type: 'compare',\n operator: 'lte',\n value,\n });\n }\n\n static in<T>(...values: T[]): Filter$.Filter<T | undefined> {\n return new FilterClass({\n type: 'in',\n values,\n });\n }\n\n static contains<T>(value: T): Filter$.Filter<readonly T[] | undefined> {\n return new FilterClass({\n type: 'contains',\n value,\n });\n }\n\n static between<T>(from: T, to: T): Filter$.Filter<unknown> {\n return new FilterClass({\n type: 'range',\n from,\n to,\n });\n }\n\n static not<F extends Filter$.Any>(filter: F): Filter$.Filter<Filter$.Type<F>> {\n return new FilterClass({\n type: 'not',\n filter: filter.ast,\n });\n }\n\n static and<Filters extends readonly Filter$.Any[]>(\n ...filters: Filters\n ): Filter$.Filter<Filter$.Type<Filters[number]>> {\n return new FilterClass({\n type: 'and',\n filters: filters.map((f) => f.ast),\n });\n }\n\n static or<Filters extends readonly Filter$.Any[]>(\n ...filters: Filters\n ): Filter$.Filter<Filter$.Type<Filters[number]>> {\n return new FilterClass({\n type: 'or',\n filters: filters.map((f) => f.ast),\n });\n }\n\n private constructor(public readonly ast: QueryAST.Filter) {}\n\n '~Filter' = FilterClass.variance;\n}\n\nexport const Filter1: typeof Filter$ = FilterClass;\nexport { Filter1 as Filter };\n\n/**\n * All property paths inside T that are references.\n */\n// TODO(dmaretskyi): Filter only properties that are references (or optional references, or unions that include references).\ntype RefPropKey<T> = keyof T & string;\n\nconst propsFilterToAst = (predicates: Filter$.Props<any>): Pick<QueryAST.FilterObject, 'id' | 'props'> => {\n let idFilter: readonly ObjectId[] | undefined;\n if ('id' in predicates) {\n assertArgument(\n typeof predicates.id === 'string' || Array.isArray(predicates.id),\n 'predicates.id',\n 'invalid id filter',\n );\n idFilter = typeof predicates.id === 'string' ? [predicates.id] : predicates.id;\n }\n\n return {\n id: idFilter,\n props: Object.fromEntries(\n Object.entries(predicates)\n .filter(([prop, _value]) => prop !== 'id')\n .map(([prop, predicate]) => [prop, processPredicate(predicate)]),\n ) as Record<string, QueryAST.Filter>,\n };\n};\n\nconst processPredicate = (predicate: any): QueryAST.Filter => {\n if (FilterClass.is(predicate)) {\n return predicate.ast;\n }\n\n if (Array.isArray(predicate)) {\n throw new Error('Array predicates are not yet supported.');\n }\n\n if (!isRef(predicate) && typeof predicate === 'object' && predicate !== null) {\n const nestedProps = Object.fromEntries(\n Object.entries(predicate).map(([key, value]) => [key, processPredicate(value)]),\n );\n\n return {\n type: 'object',\n typename: null,\n props: nestedProps,\n };\n }\n\n return FilterClass.eq(predicate).ast;\n};\n\nclass QueryClass implements Query$.Any {\n private static variance: Query$.Any['~Query'] = {} as Query$.Any['~Query'];\n\n static is(value: unknown): value is Query$.Any {\n return typeof value === 'object' && value !== null && '~Query' in value;\n }\n\n static fromAst(ast: QueryAST.Query): Query$.Any {\n return new QueryClass(ast);\n }\n\n static select<F extends Filter$.Any>(filter: F): Query$.Query<Filter$.Type<F>> {\n return new QueryClass({\n type: 'select',\n filter: filter.ast,\n });\n }\n\n static type(schema: Schema.Schema.All | string, predicates?: Filter$.Props<unknown>): Query$.Any {\n return new QueryClass({\n type: 'select',\n filter: FilterClass.type(schema, predicates).ast,\n });\n }\n\n static all(...queries: Query$.Any[]): Query$.Any {\n if (queries.length === 0) {\n throw new TypeError(\n 'Query.all combines results of multiple queries, to query all objects use Query.select(Filter.everything())',\n );\n }\n return new QueryClass({\n type: 'union',\n queries: queries.map((q) => q.ast),\n });\n }\n\n static without<T>(source: Query$.Query<T>, exclude: Query$.Query<T>): Query$.Query<T> {\n return new QueryClass({\n type: 'set-difference',\n source: source.ast,\n exclude: exclude.ast,\n });\n }\n\n constructor(public readonly ast: QueryAST.Query) {}\n\n '~Query' = QueryClass.variance;\n\n select(filter: Filter$.Any | Filter$.Props<any>): Query$.Any {\n if (FilterClass.is(filter)) {\n return new QueryClass({\n type: 'filter',\n selection: this.ast,\n filter: filter.ast,\n });\n } else {\n return new QueryClass({\n type: 'filter',\n selection: this.ast,\n filter: FilterClass.props(filter).ast,\n });\n }\n }\n\n reference(key: string): Query$.Any {\n return new QueryClass({\n type: 'reference-traversal',\n anchor: this.ast,\n property: key,\n });\n }\n\n referencedBy(target: Schema.Schema.All | string, key: string): Query$.Any {\n assertArgument(typeof target === 'string', 'target');\n assertArgument(!target.startsWith('dxn:'), 'target');\n return new QueryClass({\n type: 'incoming-references',\n anchor: this.ast,\n property: key,\n typename: target,\n });\n }\n\n sourceOf(relation: Schema.Schema.All | string, predicates?: Filter$.Props<unknown> | undefined): Query$.Any {\n return new QueryClass({\n type: 'relation',\n anchor: this.ast,\n direction: 'outgoing',\n filter: FilterClass.type(relation, predicates).ast,\n });\n }\n\n targetOf(relation: Schema.Schema.All | string, predicates?: Filter$.Props<unknown> | undefined): Query$.Any {\n return new QueryClass({\n type: 'relation',\n anchor: this.ast,\n direction: 'incoming',\n filter: FilterClass.type(relation, predicates).ast,\n });\n }\n\n source(): Query$.Any {\n return new QueryClass({\n type: 'relation-traversal',\n anchor: this.ast,\n direction: 'source',\n });\n }\n\n target(): Query$.Any {\n return new QueryClass({\n type: 'relation-traversal',\n anchor: this.ast,\n direction: 'target',\n });\n }\n\n orderBy(...order: Order$.Any[]): Query$.Any {\n return new QueryClass({\n type: 'order',\n query: this.ast,\n order: order.map((o) => o.ast),\n });\n }\n\n options(options: QueryAST.QueryOptions): Query$.Any {\n return new QueryClass({\n type: 'options',\n query: this.ast,\n options,\n });\n }\n}\n\nexport const Query1: typeof Query$ = QueryClass;\nexport { Query1 as Query };\n\nconst RefTypeId: unique symbol = Symbol('@dxos/echo-query/Ref');\nconst isRef = (obj: any): obj is Ref.Ref<any> => {\n return obj && typeof obj === 'object' && RefTypeId in obj;\n};\n\nconst makeTypeDxn = (typename: string) => {\n assertArgument(typeof typename === 'string', 'typename');\n assertArgument(!typename.startsWith('dxn:'), 'typename');\n return `dxn:type:${typename}`;\n};\n"],"mappings":"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"}
@@ -1 +1,3 @@
1
+ export * from './parser';
2
+ export * from './sandbox';
1
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { LRParser } from '@lezer/lr';
2
+ import * as terms from './query.terms';
3
+ export declare namespace QueryDSL {
4
+ const Parser: LRParser;
5
+ const Node: typeof terms;
6
+ const Tokens: string[];
7
+ }
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/parser/gen/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,OAAO,KAAK,KAAK,MAAM,eAAe,CAAC;AAEvC,yBAAiB,QAAQ,CAAC;IACjB,MAAM,MAAM,EAAE,QAAiB,CAAC;IAChC,MAAM,IAAI,cAAQ,CAAC;IACnB,MAAM,MAAM,UAAgC,CAAC;CACrD"}
@@ -0,0 +1,3 @@
1
+ import { LRParser } from "@lezer/lr";
2
+ export declare const parser: LRParser;
3
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../../src/parser/gen/query.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,QAAQ,EAAC,MAAM,WAAW,CAAA;AAElC,eAAO,MAAM,MAAM,UAcjB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare const Query = 1, Assignment = 2, Identifier = 3, Filter = 7, TagFilter = 8, Tag = 9, TextFilter = 10, String = 11, TypeFilter = 12, TypeKeyword = 13, PropertyFilter = 15, PropertyPath = 16, Value = 18, Number = 19, Boolean = 20, Null = 21, ObjectLiteral = 22, ObjectProperty = 24, ArrayLiteral = 27, Not = 30, And = 31, Or = 32, Relation = 33, ArrowRight = 34, ArrowLeft = 35;
2
+ //# sourceMappingURL=query.terms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.terms.d.ts","sourceRoot":"","sources":["../../../../../src/parser/gen/query.terms.ts"],"names":[],"mappings":"AACA,eAAO,MACL,KAAK,IAAI,EACT,UAAU,IAAI,EACd,UAAU,IAAI,EACd,MAAM,IAAI,EACV,SAAS,IAAI,EACb,GAAG,IAAI,EACP,UAAU,KAAK,EACf,MAAM,KAAK,EACX,UAAU,KAAK,EACf,WAAW,KAAK,EAChB,cAAc,KAAK,EACnB,YAAY,KAAK,EACjB,KAAK,KAAK,EACV,MAAM,KAAK,EACX,OAAO,KAAK,EACZ,IAAI,KAAK,EACT,aAAa,KAAK,EAClB,cAAc,KAAK,EACnB,YAAY,KAAK,EACjB,GAAG,KAAK,EACR,GAAG,KAAK,EACR,EAAE,KAAK,EACP,QAAQ,KAAK,EACb,UAAU,KAAK,EACf,SAAS,KAAK,CAAA"}
@@ -0,0 +1,3 @@
1
+ export * from './gen';
2
+ export * from './query-builder';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/parser/index.ts"],"names":[],"mappings":"AAIA,cAAc,OAAO,CAAC;AACtB,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,82 @@
1
+ import { type Tree } from '@lezer/common';
2
+ import { Filter, type Tag } from '@dxos/echo';
3
+ export type BuildResult = {
4
+ filter?: Filter.Any;
5
+ name?: string;
6
+ };
7
+ /**
8
+ * Stateless query builder that parses DSL trees into filters.
9
+ *
10
+ * NOTE: QueryBuilder was largely developed using Claude Sonnet 4.5 (in Windsurf)..
11
+ * To modify the functionality, create a minimal breaking test and direct the LLM to fix either the grammar or builder.
12
+ */
13
+ export declare class QueryBuilder {
14
+ private readonly _tags?;
15
+ private readonly _parser;
16
+ constructor(_tags?: Tag.Map | undefined);
17
+ /**
18
+ * Check valid input.
19
+ */
20
+ validate(input: string): boolean;
21
+ /**
22
+ * Build a query from the input string.
23
+ */
24
+ build(input: string): BuildResult;
25
+ /**
26
+ * Build a query from a parsed DSL tree.
27
+ */
28
+ buildQuery(tree: Tree, input: string): BuildResult;
29
+ /**
30
+ * Parse an assignment node.
31
+ */
32
+ private _parseAssignment;
33
+ /**
34
+ * Parse an expression node.
35
+ */
36
+ private _parseExpression;
37
+ /**
38
+ * Parse a binary expression (AND/OR).
39
+ */
40
+ private _parseBinaryExpression;
41
+ /**
42
+ * Parse a Filter node.
43
+ */
44
+ private _parseFilter;
45
+ /**
46
+ * Parse a TypeFilter node (type:typename).
47
+ */
48
+ private _parseTypeFilter;
49
+ /**
50
+ * Parse a TextFilter node (quoted string).
51
+ */
52
+ private _parseTextFilter;
53
+ /**
54
+ * Parse an ObjectLiteral node.
55
+ */
56
+ private _parseObjectLiteral;
57
+ /**
58
+ * Parse an ObjectProperty node.
59
+ */
60
+ private _parseObjectProperty;
61
+ /**
62
+ * Parse a PropertyFilter node (property:value).
63
+ */
64
+ private _parsePropertyFilter;
65
+ /**
66
+ * Parse a PropertyPath node (supports dot notation).
67
+ */
68
+ private _parsePropertyPath;
69
+ /**
70
+ * Parse a TagFilter node (#tag).
71
+ */
72
+ private _parseTagFilter;
73
+ /**
74
+ * Parse a Value node.
75
+ */
76
+ private _parseValue;
77
+ /**
78
+ * Get the text content of the current node.
79
+ */
80
+ private _getNodeText;
81
+ }
82
+ //# sourceMappingURL=query-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-builder.d.ts","sourceRoot":"","sources":["../../../../src/parser/query-builder.ts"],"names":[],"mappings":"AAIA,OAAO,EAAe,KAAK,IAAI,EAAmB,MAAM,eAAe,CAAC;AAExE,OAAO,EAAE,MAAM,EAAE,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AAM9C,MAAM,MAAM,WAAW,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjE;;;;;GAKG;AACH,qBAAa,YAAY;IAGX,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;IAFnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuD;gBAElD,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG,YAAA;IAE5C;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAShC;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW;IASjC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW;IAyClD;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuCxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAmExB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAuF9B;;OAEG;IACH,OAAO,CAAC,YAAY;IAsCpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAQxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAoB3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAyB5B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA6B5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgB1B;;OAEG;IACH,OAAO,CAAC,eAAe;IAOvB;;OAEG;IACH,OAAO,CAAC,WAAW;IAwDnB;;OAEG;IACH,OAAO,CAAC,YAAY;CAGrB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=query.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.test.d.ts","sourceRoot":"","sources":["../../../../src/parser/query.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export * from './query-lite';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/query-lite/index.ts"],"names":[],"mappings":"AAIA,cAAc,cAAc,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { Filter as Filter$, Order as Order$, Query as Query$ } from '@dxos/echo';
2
+ declare const Order2: typeof Order$;
3
+ export { Order2 as Order };
4
+ export declare const Filter1: typeof Filter$;
5
+ export { Filter1 as Filter };
6
+ export declare const Query1: typeof Query$;
7
+ export { Query1 as Query };
8
+ //# sourceMappingURL=query-lite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-lite.d.ts","sourceRoot":"","sources":["../../../../src/query-lite/query-lite.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,IAAI,OAAO,EAAE,KAAK,IAAI,MAAM,EAAE,KAAK,IAAI,MAAM,EAAO,MAAM,YAAY,CAAC;AAiC3F,QAAA,MAAM,MAAM,EAAE,OAAO,MAAe,CAAC;AACrC,OAAO,EAAE,MAAM,IAAI,KAAK,EAAE,CAAC;AAsO3B,eAAO,MAAM,OAAO,EAAE,OAAO,OAAqB,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,CAAC;AA4L7B,eAAO,MAAM,MAAM,EAAE,OAAO,MAAmB,CAAC;AAChD,OAAO,EAAE,MAAM,IAAI,KAAK,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './query-sandbox';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/sandbox/index.ts"],"names":[],"mappings":"AAIA,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { Resource } from '@dxos/context';
2
+ import { type QueryAST } from '@dxos/echo';
3
+ import { type QuickJSWASMModule } from '@dxos/vendor-quickjs';
4
+ /**
5
+ * Evaluates queries written in JavaScript using QuickJS.
6
+ * Queries are expected to use the echo Query API.
7
+ * `Query`, `Filter` and `Order` are provided as globals.
8
+ */
9
+ export declare class QuerySandbox extends Resource {
10
+ #private;
11
+ private static quickJS;
12
+ static getQuickJS(): Promise<QuickJSWASMModule>;
13
+ protected _open(): Promise<void>;
14
+ protected _close(): Promise<void>;
15
+ /**
16
+ * Evaluates the query code.
17
+ * @param queryCode Example: `Query.select(Filter.typename('dxos.org/type/Person'))`
18
+ */
19
+ eval(queryCode: string): QueryAST.Query;
20
+ }
21
+ //# sourceMappingURL=query-sandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-sandbox.d.ts","sourceRoot":"","sources":["../../../../src/sandbox/query-sandbox.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAS,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAElD,OAAO,EAAuB,KAAK,iBAAiB,EAAiB,MAAM,sBAAsB,CAAC;AAMlG;;;;GAIG;AACH,qBAAa,YAAa,SAAQ,QAAQ;;IAExC,OAAO,CAAC,MAAM,CAAC,OAAO,CAA2C;IACjE,MAAM,CAAC,UAAU;cAUQ,KAAK;cAcL,MAAM;IAI/B;;;OAGG;IACH,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,CAAC,KAAK;CAkBxC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=query-sandbox.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-sandbox.test.d.ts","sourceRoot":"","sources":["../../../../src/sandbox/query-sandbox.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import { type QuickJSContext, type QuickJSHandle, type SuccessOrFail } from '@dxos/vendor-quickjs';
2
+ /**
3
+ * Unwraps a result and throws the underlying error.
4
+ *
5
+ * Replacement for `QuickJScontext.unwrapResult` because that seems to cause an OOM.
6
+ */
7
+ export declare const unwrapResult: <T>(context: QuickJSContext, result: SuccessOrFail<T, QuickJSHandle>) => T;
8
+ //# sourceMappingURL=quickjs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quickjs.d.ts","sourceRoot":"","sources":["../../../../src/sandbox/quickjs.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAEnG;;;;GAIG;AAEH,eAAO,MAAM,YAAY,GAAI,CAAC,EAAE,SAAS,cAAc,EAAE,QAAQ,aAAa,CAAC,CAAC,EAAE,aAAa,CAAC,KAAG,CAoBlG,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=quickjs.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quickjs.test.d.ts","sourceRoot":"","sources":["../../../../src/sandbox/quickjs.test.ts"],"names":[],"mappings":""}