@dxos/echo 0.8.3 → 0.8.4-main.1f223c7

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 (43) hide show
  1. package/README.md +1 -1
  2. package/dist/lib/browser/{chunk-UYPR62ZB.mjs → chunk-EIXXFUN5.mjs} +271 -56
  3. package/dist/lib/browser/chunk-EIXXFUN5.mjs.map +7 -0
  4. package/dist/lib/browser/index.mjs +9 -1
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +2 -2
  7. package/dist/lib/node-esm/{chunk-BYBICDIO.mjs → chunk-TCY7IVTS.mjs} +271 -56
  8. package/dist/lib/node-esm/chunk-TCY7IVTS.mjs.map +7 -0
  9. package/dist/lib/node-esm/index.mjs +9 -1
  10. package/dist/lib/node-esm/meta.json +1 -1
  11. package/dist/lib/node-esm/testing/index.mjs +2 -2
  12. package/dist/types/src/Obj.d.ts +102 -12
  13. package/dist/types/src/Obj.d.ts.map +1 -1
  14. package/dist/types/src/Ref.d.ts +2 -2
  15. package/dist/types/src/Relation.d.ts +6 -4
  16. package/dist/types/src/Relation.d.ts.map +1 -1
  17. package/dist/types/src/Type.d.ts +34 -33
  18. package/dist/types/src/Type.d.ts.map +1 -1
  19. package/dist/types/src/errors.d.ts +72 -0
  20. package/dist/types/src/errors.d.ts.map +1 -0
  21. package/dist/types/src/index.d.ts +3 -1
  22. package/dist/types/src/index.d.ts.map +1 -1
  23. package/dist/types/src/query/dsl.d.ts +27 -2
  24. package/dist/types/src/query/dsl.d.ts.map +1 -1
  25. package/dist/types/tsconfig.tsbuildinfo +1 -1
  26. package/package.json +20 -13
  27. package/src/Obj.ts +206 -20
  28. package/src/Relation.ts +10 -8
  29. package/src/Type.ts +65 -50
  30. package/src/errors.ts +18 -0
  31. package/src/index.ts +4 -1
  32. package/src/query/dsl.test.ts +40 -1
  33. package/src/query/dsl.ts +112 -6
  34. package/src/test/api.test.ts +9 -2
  35. package/dist/lib/browser/chunk-UYPR62ZB.mjs.map +0 -7
  36. package/dist/lib/node/chunk-4HQE2F3L.cjs +0 -644
  37. package/dist/lib/node/chunk-4HQE2F3L.cjs.map +0 -7
  38. package/dist/lib/node/index.cjs +0 -43
  39. package/dist/lib/node/index.cjs.map +0 -7
  40. package/dist/lib/node/meta.json +0 -1
  41. package/dist/lib/node/testing/index.cjs +0 -89
  42. package/dist/lib/node/testing/index.cjs.map +0 -7
  43. package/dist/lib/node-esm/chunk-BYBICDIO.mjs.map +0 -7
package/README.md CHANGED
@@ -122,7 +122,7 @@ Defines attributes and encoding placed on objects.
122
122
  | | Optional | Runtime prop | Runtime type | JSON prop | JSON type | Description |
123
123
  | ------------------- | ----------------------- | -------------------------------------- | ---------------------- | --------------------------- | ---------- | ------------------------------ |
124
124
  | Id | No | `id` | `ObjectID` ULID string | `id` | string | Unique object ID |
125
- | Self DXN | Yes | `Symbol(@dxos/echo/Self)` | `DXN` | `@self` | string | DXN to the object itself |
125
+ | Self DXN | Yes | `Symbol(@dxos/echo/DXN)` | `DXN` | `@dxn` | string | DXN to the object itself |
126
126
  | Type | No | `Symbol(@dxos/echo/Type)` | `DXN` | `@type` | string | DXN to the object type |
127
127
  | Schema | Yes | `Symbol(@dxos/echo/Schema)` | Effect-Schema | - | | Reference to the object schema |
128
128
  | Tombstone marker | Yes | `Symbol(@dxos/echo/Deleted)` | `boolean` | `@deleted` | boolean | Deletion marker |
@@ -5,7 +5,30 @@ var __export = (target, all) => {
5
5
  __defProp(target, name, { get: all[name], enumerable: true });
6
6
  };
7
7
 
8
- // packages/core/echo/echo/src/Key.ts
8
+ // src/errors.ts
9
+ import { BaseError } from "@dxos/errors";
10
+ var SchemaNotFoundError = class extends BaseError.extend("SCHEMA_NOT_FOUND", "Schema not found") {
11
+ constructor(schema, options) {
12
+ super({
13
+ context: {
14
+ schema
15
+ },
16
+ ...options
17
+ });
18
+ }
19
+ };
20
+ var ObjectNotFoundError = class extends BaseError.extend("OBJECT_NOT_FOUND", "Object not found") {
21
+ constructor(dxn, options) {
22
+ super({
23
+ context: {
24
+ dxn
25
+ },
26
+ ...options
27
+ });
28
+ }
29
+ };
30
+
31
+ // src/Key.ts
9
32
  var Key_exports = {};
10
33
  __export(Key_exports, {
11
34
  ObjectId: () => ObjectId,
@@ -13,30 +36,46 @@ __export(Key_exports, {
13
36
  });
14
37
  import { SpaceId, ObjectId } from "@dxos/keys";
15
38
 
16
- // packages/core/echo/echo/src/Obj.ts
39
+ // src/Obj.ts
17
40
  var Obj_exports = {};
18
41
  __export(Obj_exports, {
42
+ Meta: () => Meta,
43
+ VersionTypeId: () => VersionTypeId2,
44
+ clone: () => clone,
45
+ compareVersions: () => compareVersions,
46
+ decodeVersion: () => decodeVersion,
47
+ deleteKeys: () => deleteKeys,
48
+ encodeVersion: () => encodeVersion,
19
49
  fromJSON: () => fromJSON,
20
50
  getDXN: () => getDXN,
51
+ getKeys: () => getKeys,
21
52
  getLabel: () => getLabel2,
22
53
  getMeta: () => getMeta2,
23
54
  getSchema: () => getSchema2,
55
+ getSnapshot: () => getSnapshot2,
24
56
  getTypeDXN: () => getTypeDXN,
25
57
  getTypename: () => getTypename,
26
58
  instanceOf: () => instanceOf,
27
59
  isDeleted: () => isDeleted2,
28
60
  isObject: () => isObject,
61
+ isVersion: () => isVersion,
29
62
  make: () => make,
30
- toJSON: () => toJSON
63
+ setLabel: () => setLabel2,
64
+ toJSON: () => toJSON,
65
+ version: () => version,
66
+ versionValid: () => versionValid
31
67
  });
32
68
  import { Schema } from "effect";
69
+ import { dual } from "effect/Function";
33
70
  import * as EchoSchema from "@dxos/echo-schema";
34
71
  import { assertArgument, invariant } from "@dxos/invariant";
72
+ import * as LiveObject from "@dxos/live-object";
35
73
  import { live } from "@dxos/live-object";
36
- import { assumeType } from "@dxos/util";
37
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/core/echo/echo/src/Obj.ts";
74
+ import { assumeType, deepMapValues } from "@dxos/util";
75
+ var __dxlog_file = "/__w/dxos/dxos/packages/core/echo/echo/src/Obj.ts";
76
+ var Meta = EchoSchema.MetaId;
38
77
  var make = (schema, props, meta) => {
39
- assertArgument(EchoSchema.getTypeAnnotation(schema)?.kind === EchoSchema.EntityKind.Object, "Expected an object schema");
78
+ assertArgument(EchoSchema.getTypeAnnotation(schema)?.kind === EchoSchema.EntityKind.Object, "schema", "Expected an object schema");
40
79
  if (props[EchoSchema.MetaId] != null) {
41
80
  meta = props[EchoSchema.MetaId];
42
81
  delete props[EchoSchema.MetaId];
@@ -55,11 +94,11 @@ var instanceOf = (...args) => {
55
94
  };
56
95
  var getSchema2 = EchoSchema.getSchema;
57
96
  var getDXN = (obj) => {
58
- assertArgument(!Schema.isSchema(obj), "Object should not be a schema.");
97
+ assertArgument(!Schema.isSchema(obj), "obj", "Object should not be a schema.");
59
98
  const dxn = EchoSchema.getObjectDXN(obj);
60
99
  invariant(dxn != null, "Invalid object.", {
61
100
  F: __dxlog_file,
62
- L: 96,
101
+ L: 113,
63
102
  S: void 0,
64
103
  A: [
65
104
  "dxn != null",
@@ -80,7 +119,7 @@ var getMeta2 = (obj) => {
80
119
  const meta = EchoSchema.getMeta(obj);
81
120
  invariant(meta != null, "Invalid object.", {
82
121
  F: __dxlog_file,
83
- L: 124,
122
+ L: 141,
84
123
  S: void 0,
85
124
  A: [
86
125
  "meta != null",
@@ -89,11 +128,33 @@ var getMeta2 = (obj) => {
89
128
  });
90
129
  return meta;
91
130
  };
131
+ var getKeys = dual(2, (obj, source) => {
132
+ const meta = EchoSchema.getMeta(obj);
133
+ invariant(meta != null, "Invalid object.", {
134
+ F: __dxlog_file,
135
+ L: 153,
136
+ S: void 0,
137
+ A: [
138
+ "meta != null",
139
+ "'Invalid object.'"
140
+ ]
141
+ });
142
+ return meta.keys.filter((key) => key.source === source);
143
+ });
144
+ var deleteKeys = (obj, source) => {
145
+ const meta = EchoSchema.getMeta(obj);
146
+ for (let i = 0; i < meta.keys.length; i++) {
147
+ if (meta.keys[i].source === source) {
148
+ meta.keys.splice(i, 1);
149
+ i--;
150
+ }
151
+ }
152
+ };
92
153
  var isDeleted2 = (obj) => {
93
154
  const deleted = EchoSchema.isDeleted(obj);
94
155
  invariant(typeof deleted === "boolean", "Invalid object.", {
95
156
  F: __dxlog_file,
96
- L: 131,
157
+ L: 175,
97
158
  S: void 0,
98
159
  A: [
99
160
  "typeof deleted === 'boolean'",
@@ -108,10 +169,88 @@ var getLabel2 = (obj) => {
108
169
  return EchoSchema.getLabel(schema, obj);
109
170
  }
110
171
  };
172
+ var setLabel2 = (obj, label) => {
173
+ const schema = getSchema2(obj);
174
+ if (schema != null) {
175
+ EchoSchema.setLabel(schema, obj, label);
176
+ }
177
+ };
111
178
  var toJSON = (obj) => EchoSchema.objectToJSON(obj);
112
179
  var fromJSON = EchoSchema.objectFromJSON;
180
+ var getSnapshot2 = LiveObject.getSnapshot;
181
+ var clone = (obj, opts) => {
182
+ const { id, ...data } = obj;
183
+ const schema = getSchema2(obj);
184
+ invariant(schema != null, "Object should have a schema", {
185
+ F: __dxlog_file,
186
+ L: 240,
187
+ S: void 0,
188
+ A: [
189
+ "schema != null",
190
+ "'Object should have a schema'"
191
+ ]
192
+ });
193
+ const props = deepMapValues(data, (value, recurse) => {
194
+ if (EchoSchema.Ref.isRef(value)) {
195
+ return value;
196
+ }
197
+ return recurse(value);
198
+ });
199
+ if (opts?.retainId) {
200
+ props.id = id;
201
+ }
202
+ const meta = getMeta2(obj);
203
+ props[EchoSchema.MetaId] = deepMapValues(meta, (value, recurse) => {
204
+ if (EchoSchema.Ref.isRef(value)) {
205
+ return value;
206
+ }
207
+ return recurse(value);
208
+ });
209
+ return make(schema, props);
210
+ };
211
+ var VersionTypeId2 = EchoSchema.VersionTypeId;
212
+ var unversioned = {
213
+ [VersionTypeId2]: {},
214
+ versioned: false
215
+ };
216
+ var isVersion = (obj) => {
217
+ return obj != null && typeof obj === "object" && VersionTypeId2 in obj;
218
+ };
219
+ var version = (obj) => {
220
+ const version2 = obj[EchoSchema.ObjectVersionId];
221
+ if (version2 === void 0) {
222
+ return unversioned;
223
+ }
224
+ return version2;
225
+ };
226
+ var versionValid = (version2) => {
227
+ assertArgument(isVersion(version2), "version", "Invalid version object");
228
+ return !!version2.versioned;
229
+ };
230
+ var compareVersions = (version1, version2) => {
231
+ assertArgument(isVersion(version1), "version1", "Invalid version object");
232
+ assertArgument(isVersion(version2), "version2", "Invalid version object");
233
+ if (!versionValid(version1) || !versionValid(version2)) {
234
+ return "unversioned";
235
+ }
236
+ if (version1.automergeHeads?.length !== version2.automergeHeads?.length) {
237
+ return "different";
238
+ }
239
+ if (version1.automergeHeads?.some((head) => !version2.automergeHeads?.includes(head))) {
240
+ return "different";
241
+ }
242
+ return "equal";
243
+ };
244
+ var encodeVersion = (version2) => {
245
+ return JSON.stringify(version2);
246
+ };
247
+ var decodeVersion = (version2) => {
248
+ const parsed = JSON.parse(version2);
249
+ parsed[VersionTypeId2] = {};
250
+ return parsed;
251
+ };
113
252
 
114
- // packages/core/echo/echo/src/Ref.ts
253
+ // src/Ref.ts
115
254
  var Ref_exports = {};
116
255
  __export(Ref_exports, {
117
256
  Array: () => Array2,
@@ -125,7 +264,7 @@ var isRef = EchoSchema2.Ref.isRef;
125
264
  var make2 = EchoSchema2.Ref.make;
126
265
  var fromDXN = EchoSchema2.Ref.fromDXN;
127
266
 
128
- // packages/core/echo/echo/src/Relation.ts
267
+ // src/Relation.ts
129
268
  var Relation_exports = {};
130
269
  __export(Relation_exports, {
131
270
  Source: () => Source,
@@ -143,11 +282,11 @@ import { assertArgument as assertArgument2, invariant as invariant2 } from "@dxo
143
282
  import { DXN } from "@dxos/keys";
144
283
  import { live as live2 } from "@dxos/live-object";
145
284
  import { assumeType as assumeType2 } from "@dxos/util";
146
- var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/core/echo/echo/src/Relation.ts";
285
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/core/echo/echo/src/Relation.ts";
147
286
  var Source = EchoSchema3.RelationSourceId;
148
287
  var Target = EchoSchema3.RelationTargetId;
149
288
  var make3 = (schema, props, meta) => {
150
- assertArgument2(EchoSchema3.getTypeAnnotation(schema)?.kind === EchoSchema3.EntityKind.Relation, "Expected a relation schema");
289
+ assertArgument2(EchoSchema3.getTypeAnnotation(schema)?.kind === EchoSchema3.EntityKind.Relation, "schema", "Expected a relation schema");
151
290
  if (props[EchoSchema3.MetaId] != null) {
152
291
  meta = props[EchoSchema3.MetaId];
153
292
  delete props[EchoSchema3.MetaId];
@@ -174,7 +313,7 @@ var getSourceDXN = (value) => {
174
313
  const dxn = value[EchoSchema3.RelationSourceDXNId];
175
314
  invariant2(dxn instanceof DXN, void 0, {
176
315
  F: __dxlog_file2,
177
- L: 98,
316
+ L: 100,
178
317
  S: void 0,
179
318
  A: [
180
319
  "dxn instanceof DXN",
@@ -189,7 +328,7 @@ var getTargetDXN = (value) => {
189
328
  const dxn = value[EchoSchema3.RelationTargetDXNId];
190
329
  invariant2(dxn instanceof DXN, void 0, {
191
330
  F: __dxlog_file2,
192
- L: 110,
331
+ L: 112,
193
332
  S: void 0,
194
333
  A: [
195
334
  "dxn instanceof DXN",
@@ -204,7 +343,7 @@ var getSource = (relation) => {
204
343
  const obj = relation[EchoSchema3.RelationSourceId];
205
344
  invariant2(obj !== void 0, `Invalid source: ${relation.id}`, {
206
345
  F: __dxlog_file2,
207
- L: 122,
346
+ L: 124,
208
347
  S: void 0,
209
348
  A: [
210
349
  "obj !== undefined",
@@ -219,7 +358,7 @@ var getTarget = (relation) => {
219
358
  const obj = relation[EchoSchema3.RelationTargetId];
220
359
  invariant2(obj !== void 0, `Invalid target: ${relation.id}`, {
221
360
  F: __dxlog_file2,
222
- L: 134,
361
+ L: 136,
223
362
  S: void 0,
224
363
  A: [
225
364
  "obj !== undefined",
@@ -229,18 +368,18 @@ var getTarget = (relation) => {
229
368
  return obj;
230
369
  };
231
370
 
232
- // packages/core/echo/echo/src/Type.ts
371
+ // src/Type.ts
233
372
  var Type_exports = {};
234
373
  __export(Type_exports, {
235
374
  DXN: () => DXN2,
236
375
  Expando: () => Expando2,
237
376
  Format: () => Format,
238
377
  JsonSchema: () => JsonSchemaType,
239
- Kind: () => EntityKind3,
378
+ Kind: () => Kind,
240
379
  KindId: () => KindId,
241
380
  Obj: () => Obj,
242
381
  ObjectId: () => ObjectId2,
243
- Ref: () => Ref3,
382
+ Ref: () => Ref4,
244
383
  Relation: () => Relation,
245
384
  SpaceId: () => SpaceId2,
246
385
  getDXN: () => getDXN2,
@@ -253,19 +392,15 @@ __export(Type_exports, {
253
392
  });
254
393
  import * as EchoSchema4 from "@dxos/echo-schema";
255
394
  import { invariant as invariant3 } from "@dxos/invariant";
256
- import { EntityKind as EntityKind3 } from "@dxos/echo-schema";
257
395
  import { SpaceId as SpaceId2, ObjectId as ObjectId2, DXN as DXN2 } from "@dxos/keys";
258
- import {
259
- Format,
260
- JsonSchemaType,
261
- toEffectSchema,
262
- toJsonSchema
263
- } from "@dxos/echo-schema";
264
- var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/core/echo/echo/src/Type.ts";
396
+ import { Format, JsonSchemaType, toEffectSchema, toJsonSchema } from "@dxos/echo-schema";
397
+ var __dxlog_file3 = "/__w/dxos/dxos/packages/core/echo/echo/src/Type.ts";
265
398
  var KindId = EchoSchema4.EntityKindId;
399
+ var Kind = EchoSchema4.EntityKind;
266
400
  var Obj = EchoSchema4.EchoObject;
401
+ var Expando2 = EchoSchema4.Expando;
267
402
  var Relation = EchoSchema4.EchoRelation;
268
- var Ref3 = EchoSchema4.Ref;
403
+ var Ref4 = EchoSchema4.Ref;
269
404
  var getDXN2 = (schema) => {
270
405
  return EchoSchema4.getSchemaDXN(schema);
271
406
  };
@@ -273,7 +408,7 @@ var getTypename2 = (schema) => {
273
408
  const typename = EchoSchema4.getSchemaTypename(schema);
274
409
  invariant3(typeof typename === "string" && !typename.startsWith("dxn:"), "Invalid typename", {
275
410
  F: __dxlog_file3,
276
- L: 182,
411
+ L: 212,
277
412
  S: void 0,
278
413
  A: [
279
414
  "typeof typename === 'string' && !typename.startsWith('dxn:')",
@@ -283,37 +418,68 @@ var getTypename2 = (schema) => {
283
418
  return typename;
284
419
  };
285
420
  var getVersion = (schema) => {
286
- const version = EchoSchema4.getSchemaVersion(schema);
287
- invariant3(typeof version === "string" && version.match(/^\d+\.\d+\.\d+$/), "Invalid version", {
421
+ const version2 = EchoSchema4.getSchemaVersion(schema);
422
+ invariant3(typeof version2 === "string" && version2.match(/^\d+\.\d+\.\d+$/), "Invalid version", {
288
423
  F: __dxlog_file3,
289
- L: 192,
424
+ L: 222,
290
425
  S: void 0,
291
426
  A: [
292
427
  "typeof version === 'string' && version.match(/^\\d+\\.\\d+\\.\\d+$/)",
293
428
  "'Invalid version'"
294
429
  ]
295
430
  });
296
- return version;
431
+ return version2;
297
432
  };
433
+ var isMutable2 = EchoSchema4.isMutable;
298
434
  var getMeta3 = (schema) => {
299
435
  return EchoSchema4.getTypeAnnotation(schema);
300
436
  };
301
- var isMutable2 = EchoSchema4.isMutable;
302
- var Expando2 = EchoSchema4.Expando;
303
437
 
304
- // packages/core/echo/echo/src/index.ts
438
+ // src/index.ts
305
439
  import { DXN as DXN4 } from "@dxos/keys";
306
440
 
307
- // packages/core/echo/echo/src/query/dsl.ts
308
- import { Schema as Schema2 } from "effect";
441
+ // src/query/dsl.ts
442
+ import { Match, Schema as Schema2 } from "effect";
309
443
  import { raise as raise2 } from "@dxos/debug";
310
444
  import { getTypeReference } from "@dxos/echo-schema";
311
445
  import { assertArgument as assertArgument3 } from "@dxos/invariant";
312
446
  import { DXN as DXN3, ObjectId as ObjectId3 } from "@dxos/keys";
313
- var FilterClass = class _FilterClass {
314
- static {
315
- this.variance = {};
447
+ function _define_property(obj, key, value) {
448
+ if (key in obj) {
449
+ Object.defineProperty(obj, key, {
450
+ value,
451
+ enumerable: true,
452
+ configurable: true,
453
+ writable: true
454
+ });
455
+ } else {
456
+ obj[key] = value;
457
+ }
458
+ return obj;
459
+ }
460
+ var OrderClass = class _OrderClass {
461
+ static is(value) {
462
+ return typeof value === "object" && value !== null && "~Order" in value;
316
463
  }
464
+ constructor(ast) {
465
+ _define_property(this, "ast", void 0);
466
+ _define_property(this, "~Order", void 0);
467
+ this.ast = ast;
468
+ this["~Order"] = _OrderClass.variance;
469
+ }
470
+ };
471
+ _define_property(OrderClass, "variance", {});
472
+ (function(Order2) {
473
+ Order2.natural = new OrderClass({
474
+ kind: "natural"
475
+ });
476
+ Order2.property = (property, direction) => new OrderClass({
477
+ kind: "property",
478
+ property,
479
+ direction
480
+ });
481
+ })(Order || (Order = {}));
482
+ var FilterClass = class _FilterClass {
317
483
  static is(value) {
318
484
  return typeof value === "object" && value !== null && "~Filter" in value;
319
485
  }
@@ -342,7 +508,7 @@ var FilterClass = class _FilterClass {
342
508
  });
343
509
  }
344
510
  static ids(...ids) {
345
- assertArgument3(ids.every((id) => ObjectId3.isValid(id)), "ids must be valid");
511
+ assertArgument3(ids.every((id) => ObjectId3.isValid(id)), "ids", "ids must be valid");
346
512
  if (ids.length === 0) {
347
513
  return Filter.nothing();
348
514
  }
@@ -362,7 +528,7 @@ var FilterClass = class _FilterClass {
362
528
  });
363
529
  }
364
530
  static typename(typename) {
365
- assertArgument3(!typename.startsWith("dxn:"), "Typename must no be qualified");
531
+ assertArgument3(!typename.startsWith("dxn:"), "typename", "Typename must no be qualified");
366
532
  return new _FilterClass({
367
533
  type: "object",
368
534
  typename: DXN3.fromTypename(typename).toString(),
@@ -453,6 +619,12 @@ var FilterClass = class _FilterClass {
453
619
  values
454
620
  });
455
621
  }
622
+ static contains(value) {
623
+ return new _FilterClass({
624
+ type: "contains",
625
+ value
626
+ });
627
+ }
456
628
  static between(from, to) {
457
629
  return new _FilterClass({
458
630
  type: "range",
@@ -479,15 +651,18 @@ var FilterClass = class _FilterClass {
479
651
  });
480
652
  }
481
653
  constructor(ast) {
654
+ _define_property(this, "ast", void 0);
655
+ _define_property(this, "~Filter", void 0);
482
656
  this.ast = ast;
483
657
  this["~Filter"] = _FilterClass.variance;
484
658
  }
485
659
  };
660
+ _define_property(FilterClass, "variance", {});
486
661
  var Filter = FilterClass;
487
662
  var propsFilterToAst = (predicates) => {
488
663
  let idFilter;
489
664
  if ("id" in predicates) {
490
- assertArgument3(typeof predicates.id === "string" || Array.isArray(predicates.id), "invalid id filter");
665
+ assertArgument3(typeof predicates.id === "string" || Array.isArray(predicates.id), "predicates.id", "invalid id filter");
491
666
  idFilter = typeof predicates.id === "string" ? [
492
667
  predicates.id
493
668
  ] : predicates.id;
@@ -497,17 +672,39 @@ var propsFilterToAst = (predicates) => {
497
672
  id: idFilter,
498
673
  props: Object.fromEntries(Object.entries(predicates).filter(([prop, _value]) => prop !== "id").map(([prop, predicate]) => [
499
674
  prop,
500
- Filter.is(predicate) ? predicate.ast : Filter.eq(predicate).ast
675
+ processPredicate(predicate)
501
676
  ]))
502
677
  };
503
678
  };
679
+ var processPredicate = (predicate) => {
680
+ return Match.value(predicate).pipe(
681
+ Match.withReturnType(),
682
+ Match.when(Filter.is, (predicate2) => predicate2.ast),
683
+ // TODO(wittjosiah): Add support for array predicates.
684
+ Match.when(Array.isArray, (_predicate) => {
685
+ throw new Error("Array predicates are not yet supported.");
686
+ }),
687
+ Match.when((predicate2) => !isRef(predicate2) && typeof predicate2 === "object" && predicate2 !== null, (predicate2) => {
688
+ const nestedProps = Object.fromEntries(Object.entries(predicate2).map(([key, value]) => [
689
+ key,
690
+ processPredicate(value)
691
+ ]));
692
+ return {
693
+ type: "object",
694
+ typename: null,
695
+ props: nestedProps
696
+ };
697
+ }),
698
+ Match.orElse((value) => Filter.eq(value).ast)
699
+ );
700
+ };
504
701
  var QueryClass = class _QueryClass {
505
- static {
506
- this.variance = {};
507
- }
508
702
  static is(value) {
509
703
  return typeof value === "object" && value !== null && "~Query" in value;
510
704
  }
705
+ static fromAst(ast) {
706
+ return new _QueryClass(ast);
707
+ }
511
708
  static select(filter) {
512
709
  return new _QueryClass({
513
710
  type: "select",
@@ -536,10 +733,6 @@ var QueryClass = class _QueryClass {
536
733
  exclude: exclude.ast
537
734
  });
538
735
  }
539
- constructor(ast) {
540
- this.ast = ast;
541
- this["~Query"] = _QueryClass.variance;
542
- }
543
736
  select(filter) {
544
737
  if (Filter.is(filter)) {
545
738
  return new _QueryClass({
@@ -601,6 +794,13 @@ var QueryClass = class _QueryClass {
601
794
  direction: "target"
602
795
  });
603
796
  }
797
+ orderBy(...order) {
798
+ return new _QueryClass({
799
+ type: "order",
800
+ query: this.ast,
801
+ order: order.map((o) => o.ast)
802
+ });
803
+ }
604
804
  options(options) {
605
805
  return new _QueryClass({
606
806
  type: "options",
@@ -608,10 +808,23 @@ var QueryClass = class _QueryClass {
608
808
  options
609
809
  });
610
810
  }
811
+ constructor(ast) {
812
+ _define_property(this, "ast", void 0);
813
+ _define_property(this, "~Query", void 0);
814
+ this.ast = ast;
815
+ this["~Query"] = _QueryClass.variance;
816
+ }
611
817
  };
818
+ _define_property(QueryClass, "variance", {});
612
819
  var Query = QueryClass;
820
+ var Order;
821
+
822
+ // src/index.ts
823
+ import { QueryAST } from "@dxos/echo-protocol";
613
824
 
614
825
  export {
826
+ SchemaNotFoundError,
827
+ ObjectNotFoundError,
615
828
  Key_exports,
616
829
  Obj_exports,
617
830
  Ref_exports,
@@ -619,6 +832,8 @@ export {
619
832
  Type_exports,
620
833
  Filter,
621
834
  Query,
622
- DXN4 as DXN
835
+ Order,
836
+ DXN4 as DXN,
837
+ QueryAST
623
838
  };
624
- //# sourceMappingURL=chunk-UYPR62ZB.mjs.map
839
+ //# sourceMappingURL=chunk-EIXXFUN5.mjs.map