@dxos/echo 0.8.4-main.84f28bd → 0.8.4-main.a4bbb77

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 (35) hide show
  1. package/README.md +1 -1
  2. package/dist/lib/browser/{chunk-SVSJEELN.mjs → chunk-I4YEWYJA.mjs} +431 -168
  3. package/dist/lib/browser/chunk-I4YEWYJA.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 +1 -1
  7. package/dist/lib/node-esm/{chunk-53HXWYR6.mjs → chunk-AWWFAF75.mjs} +431 -168
  8. package/dist/lib/node-esm/chunk-AWWFAF75.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 +1 -1
  12. package/dist/types/src/Obj.d.ts +108 -13
  13. package/dist/types/src/Obj.d.ts.map +1 -1
  14. package/dist/types/src/Relation.d.ts +10 -7
  15. package/dist/types/src/Relation.d.ts.map +1 -1
  16. package/dist/types/src/Type.d.ts +1 -1
  17. package/dist/types/src/Type.d.ts.map +1 -1
  18. package/dist/types/src/errors.d.ts +72 -0
  19. package/dist/types/src/errors.d.ts.map +1 -0
  20. package/dist/types/src/index.d.ts +3 -1
  21. package/dist/types/src/index.d.ts.map +1 -1
  22. package/dist/types/src/query/dsl.d.ts +32 -5
  23. package/dist/types/src/query/dsl.d.ts.map +1 -1
  24. package/dist/types/tsconfig.tsbuildinfo +1 -1
  25. package/package.json +21 -14
  26. package/src/Obj.ts +242 -22
  27. package/src/Relation.ts +22 -11
  28. package/src/Type.ts +4 -2
  29. package/src/errors.ts +18 -0
  30. package/src/index.ts +4 -1
  31. package/src/query/dsl.test.ts +40 -1
  32. package/src/query/dsl.ts +127 -14
  33. package/src/test/api.test.ts +16 -9
  34. package/dist/lib/browser/chunk-SVSJEELN.mjs.map +0 -7
  35. package/dist/lib/node-esm/chunk-53HXWYR6.mjs.map +0 -7
@@ -5,6 +5,29 @@ var __export = (target, all) => {
5
5
  __defProp(target, name, { get: all[name], enumerable: true });
6
6
  };
7
7
 
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
+
8
31
  // src/Key.ts
9
32
  var Key_exports = {};
10
33
  __export(Key_exports, {
@@ -16,50 +39,143 @@ import { SpaceId, ObjectId } from "@dxos/keys";
16
39
  // src/Obj.ts
17
40
  var Obj_exports = {};
18
41
  __export(Obj_exports, {
42
+ Any: () => Any,
43
+ Meta: () => Meta,
44
+ VersionTypeId: () => VersionTypeId2,
45
+ clone: () => clone,
46
+ compareVersions: () => compareVersions,
47
+ decodeVersion: () => decodeVersion,
48
+ deleteKeys: () => deleteKeys,
49
+ encodeVersion: () => encodeVersion,
19
50
  fromJSON: () => fromJSON,
20
- getDXN: () => getDXN,
51
+ getDXN: () => getDXN2,
52
+ getKeys: () => getKeys,
21
53
  getLabel: () => getLabel2,
22
- getMeta: () => getMeta2,
54
+ getMeta: () => getMeta3,
23
55
  getSchema: () => getSchema2,
56
+ getSnapshot: () => getSnapshot2,
24
57
  getTypeDXN: () => getTypeDXN,
25
- getTypename: () => getTypename,
58
+ getTypename: () => getTypename2,
26
59
  instanceOf: () => instanceOf,
27
60
  isDeleted: () => isDeleted2,
28
61
  isObject: () => isObject,
62
+ isVersion: () => isVersion,
29
63
  make: () => make,
30
- toJSON: () => toJSON
64
+ setLabel: () => setLabel2,
65
+ sort: () => sort,
66
+ sortByLabel: () => sortByLabel,
67
+ sortByTypename: () => sortByTypename,
68
+ toJSON: () => toJSON,
69
+ version: () => version,
70
+ versionValid: () => versionValid
31
71
  });
32
72
  import { Schema } from "effect";
33
- import * as EchoSchema from "@dxos/echo-schema";
34
- import { assertArgument, invariant } from "@dxos/invariant";
73
+ import { dual } from "effect/Function";
74
+ import * as EchoSchema2 from "@dxos/echo-schema";
75
+ import { assertArgument, invariant as invariant2 } from "@dxos/invariant";
76
+ import * as LiveObject from "@dxos/live-object";
35
77
  import { live } from "@dxos/live-object";
36
- import { assumeType } from "@dxos/util";
37
- var __dxlog_file = "/__w/dxos/dxos/packages/core/echo/echo/src/Obj.ts";
78
+ import { assumeType, deepMapValues } from "@dxos/util";
79
+
80
+ // src/Type.ts
81
+ var Type_exports = {};
82
+ __export(Type_exports, {
83
+ DXN: () => DXN,
84
+ Expando: () => Expando2,
85
+ Format: () => Format,
86
+ JsonSchema: () => JsonSchemaType,
87
+ Kind: () => Kind,
88
+ KindId: () => KindId,
89
+ Obj: () => Obj,
90
+ ObjectId: () => ObjectId2,
91
+ Ref: () => Ref2,
92
+ Relation: () => Relation,
93
+ SpaceId: () => SpaceId2,
94
+ getDXN: () => getDXN,
95
+ getMeta: () => getMeta,
96
+ getTypename: () => getTypename,
97
+ getVersion: () => getVersion,
98
+ isMutable: () => isMutable2,
99
+ toEffectSchema: () => toEffectSchema,
100
+ toJsonSchema: () => toJsonSchema
101
+ });
102
+ import * as EchoSchema from "@dxos/echo-schema";
103
+ import { invariant } from "@dxos/invariant";
104
+ import { SpaceId as SpaceId2, ObjectId as ObjectId2, DXN } from "@dxos/keys";
105
+ import { Format, JsonSchemaType, toEffectSchema, toJsonSchema } from "@dxos/echo-schema";
106
+ var __dxlog_file = "/__w/dxos/dxos/packages/core/echo/echo/src/Type.ts";
107
+ var KindId = EchoSchema.EntityKindId;
108
+ var Kind = EchoSchema.EntityKind;
109
+ var Obj = EchoSchema.EchoObject;
110
+ var Expando2 = EchoSchema.Expando;
111
+ var Relation = EchoSchema.EchoRelation;
112
+ var Ref2 = EchoSchema.Ref;
113
+ var getDXN = (schema) => {
114
+ return EchoSchema.getSchemaDXN(schema);
115
+ };
116
+ var getTypename = (schema) => {
117
+ const typename = EchoSchema.getSchemaTypename(schema);
118
+ invariant(typeof typename === "string" && !typename.startsWith("dxn:"), "Invalid typename", {
119
+ F: __dxlog_file,
120
+ L: 212,
121
+ S: void 0,
122
+ A: [
123
+ "typeof typename === 'string' && !typename.startsWith('dxn:')",
124
+ "'Invalid typename'"
125
+ ]
126
+ });
127
+ return typename;
128
+ };
129
+ var getVersion = (schema) => {
130
+ const version2 = EchoSchema.getSchemaVersion(schema);
131
+ invariant(typeof version2 === "string" && version2.match(/^\d+\.\d+\.\d+$/), "Invalid version", {
132
+ F: __dxlog_file,
133
+ L: 222,
134
+ S: void 0,
135
+ A: [
136
+ "typeof version === 'string' && version.match(/^\\d+\\.\\d+\\.\\d+$/)",
137
+ "'Invalid version'"
138
+ ]
139
+ });
140
+ return version2;
141
+ };
142
+ var isMutable2 = EchoSchema.isMutable;
143
+ var getMeta = (schema) => {
144
+ return EchoSchema.getTypeAnnotation(schema);
145
+ };
146
+
147
+ // src/Obj.ts
148
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/core/echo/echo/src/Obj.ts";
149
+ var Any = Schema.Struct({}).pipe(Obj({
150
+ typename: "dxos.org/types/Any",
151
+ version: "0.1.0"
152
+ }));
153
+ var Meta = EchoSchema2.MetaId;
38
154
  var make = (schema, props, meta) => {
39
- assertArgument(EchoSchema.getTypeAnnotation(schema)?.kind === EchoSchema.EntityKind.Object, "Expected an object schema");
40
- if (props[EchoSchema.MetaId] != null) {
41
- meta = props[EchoSchema.MetaId];
42
- delete props[EchoSchema.MetaId];
155
+ assertArgument(EchoSchema2.getTypeAnnotation(schema)?.kind === EchoSchema2.EntityKind.Object, "schema", "Expected an object schema");
156
+ if (props[EchoSchema2.MetaId] != null) {
157
+ meta = props[EchoSchema2.MetaId];
158
+ delete props[EchoSchema2.MetaId];
43
159
  }
44
160
  return live(schema, props, meta);
45
161
  };
46
162
  var isObject = (obj) => {
47
163
  assumeType(obj);
48
- return typeof obj === "object" && obj !== null && obj[EchoSchema.EntityKindId] === EchoSchema.EntityKind.Object;
164
+ return typeof obj === "object" && obj !== null && obj[EchoSchema2.EntityKindId] === EchoSchema2.EntityKind.Object;
49
165
  };
50
166
  var instanceOf = (...args) => {
51
167
  if (args.length === 1) {
52
- return (obj) => EchoSchema.isInstanceOf(args[0], obj);
168
+ return (obj) => EchoSchema2.isInstanceOf(args[0], obj);
53
169
  }
54
- return EchoSchema.isInstanceOf(args[0], args[1]);
170
+ return EchoSchema2.isInstanceOf(args[0], args[1]);
55
171
  };
56
- var getSchema2 = EchoSchema.getSchema;
57
- var getDXN = (obj) => {
58
- assertArgument(!Schema.isSchema(obj), "Object should not be a schema.");
59
- const dxn = EchoSchema.getObjectDXN(obj);
60
- invariant(dxn != null, "Invalid object.", {
61
- F: __dxlog_file,
62
- L: 96,
172
+ var getSchema2 = EchoSchema2.getSchema;
173
+ var getDXN2 = (obj) => {
174
+ assertArgument(!Schema.isSchema(obj), "obj", "Object should not be a schema.");
175
+ const dxn = EchoSchema2.getObjectDXN(obj);
176
+ invariant2(dxn != null, "Invalid object.", {
177
+ F: __dxlog_file2,
178
+ L: 120,
63
179
  S: void 0,
64
180
  A: [
65
181
  "dxn != null",
@@ -68,19 +184,19 @@ var getDXN = (obj) => {
68
184
  });
69
185
  return dxn;
70
186
  };
71
- var getTypeDXN = EchoSchema.getType;
72
- var getTypename = (obj) => {
187
+ var getTypeDXN = EchoSchema2.getType;
188
+ var getTypename2 = (obj) => {
73
189
  const schema = getSchema2(obj);
74
190
  if (schema == null) {
75
- return EchoSchema.getType(obj)?.asTypeDXN()?.type;
191
+ return EchoSchema2.getType(obj)?.asTypeDXN()?.type;
76
192
  }
77
- return EchoSchema.getSchemaTypename(schema);
193
+ return EchoSchema2.getSchemaTypename(schema);
78
194
  };
79
- var getMeta2 = (obj) => {
80
- const meta = EchoSchema.getMeta(obj);
81
- invariant(meta != null, "Invalid object.", {
82
- F: __dxlog_file,
83
- L: 124,
195
+ var getMeta3 = (obj) => {
196
+ const meta = EchoSchema2.getMeta(obj);
197
+ invariant2(meta != null, "Invalid object.", {
198
+ F: __dxlog_file2,
199
+ L: 148,
84
200
  S: void 0,
85
201
  A: [
86
202
  "meta != null",
@@ -89,11 +205,33 @@ var getMeta2 = (obj) => {
89
205
  });
90
206
  return meta;
91
207
  };
208
+ var getKeys = dual(2, (obj, source) => {
209
+ const meta = EchoSchema2.getMeta(obj);
210
+ invariant2(meta != null, "Invalid object.", {
211
+ F: __dxlog_file2,
212
+ L: 160,
213
+ S: void 0,
214
+ A: [
215
+ "meta != null",
216
+ "'Invalid object.'"
217
+ ]
218
+ });
219
+ return meta.keys.filter((key) => key.source === source);
220
+ });
221
+ var deleteKeys = (obj, source) => {
222
+ const meta = EchoSchema2.getMeta(obj);
223
+ for (let i = 0; i < meta.keys.length; i++) {
224
+ if (meta.keys[i].source === source) {
225
+ meta.keys.splice(i, 1);
226
+ i--;
227
+ }
228
+ }
229
+ };
92
230
  var isDeleted2 = (obj) => {
93
- const deleted = EchoSchema.isDeleted(obj);
94
- invariant(typeof deleted === "boolean", "Invalid object.", {
95
- F: __dxlog_file,
96
- L: 131,
231
+ const deleted = EchoSchema2.isDeleted(obj);
232
+ invariant2(typeof deleted === "boolean", "Invalid object.", {
233
+ F: __dxlog_file2,
234
+ L: 182,
97
235
  S: void 0,
98
236
  A: [
99
237
  "typeof deleted === 'boolean'",
@@ -105,11 +243,111 @@ var isDeleted2 = (obj) => {
105
243
  var getLabel2 = (obj) => {
106
244
  const schema = getSchema2(obj);
107
245
  if (schema != null) {
108
- return EchoSchema.getLabel(schema, obj);
246
+ return EchoSchema2.getLabel(schema, obj);
109
247
  }
110
248
  };
111
- var toJSON = (obj) => EchoSchema.objectToJSON(obj);
112
- var fromJSON = EchoSchema.objectFromJSON;
249
+ var setLabel2 = (obj, label) => {
250
+ const schema = getSchema2(obj);
251
+ if (schema != null) {
252
+ EchoSchema2.setLabel(schema, obj, label);
253
+ }
254
+ };
255
+ var compare = (a, b) => {
256
+ if (a == null) {
257
+ return b == null ? 0 : 1;
258
+ }
259
+ if (b == null) {
260
+ return -1;
261
+ }
262
+ return a.localeCompare(b);
263
+ };
264
+ var sortByLabel = (a, b) => compare(getLabel2(a), getLabel2(b));
265
+ var sortByTypename = (a, b) => compare(getTypename2(a), getTypename2(b));
266
+ var sort = (...comparators) => {
267
+ return (a, b) => {
268
+ for (const comparator of comparators) {
269
+ const result = comparator(a, b);
270
+ if (result !== 0) {
271
+ return result;
272
+ }
273
+ }
274
+ return 0;
275
+ };
276
+ };
277
+ var toJSON = (obj) => EchoSchema2.objectToJSON(obj);
278
+ var fromJSON = EchoSchema2.objectFromJSON;
279
+ var getSnapshot2 = LiveObject.getSnapshot;
280
+ var clone = (obj, opts) => {
281
+ const { id, ...data } = obj;
282
+ const schema = getSchema2(obj);
283
+ invariant2(schema != null, "Object should have a schema", {
284
+ F: __dxlog_file2,
285
+ L: 275,
286
+ S: void 0,
287
+ A: [
288
+ "schema != null",
289
+ "'Object should have a schema'"
290
+ ]
291
+ });
292
+ const props = deepMapValues(data, (value, recurse) => {
293
+ if (EchoSchema2.Ref.isRef(value)) {
294
+ return value;
295
+ }
296
+ return recurse(value);
297
+ });
298
+ if (opts?.retainId) {
299
+ props.id = id;
300
+ }
301
+ const meta = getMeta3(obj);
302
+ props[EchoSchema2.MetaId] = deepMapValues(meta, (value, recurse) => {
303
+ if (EchoSchema2.Ref.isRef(value)) {
304
+ return value;
305
+ }
306
+ return recurse(value);
307
+ });
308
+ return make(schema, props);
309
+ };
310
+ var VersionTypeId2 = EchoSchema2.VersionTypeId;
311
+ var unversioned = {
312
+ [VersionTypeId2]: {},
313
+ versioned: false
314
+ };
315
+ var isVersion = (obj) => {
316
+ return obj != null && typeof obj === "object" && VersionTypeId2 in obj;
317
+ };
318
+ var version = (obj) => {
319
+ const version2 = obj[EchoSchema2.ObjectVersionId];
320
+ if (version2 === void 0) {
321
+ return unversioned;
322
+ }
323
+ return version2;
324
+ };
325
+ var versionValid = (version2) => {
326
+ assertArgument(isVersion(version2), "version", "Invalid version object");
327
+ return !!version2.versioned;
328
+ };
329
+ var compareVersions = (version1, version2) => {
330
+ assertArgument(isVersion(version1), "version1", "Invalid version object");
331
+ assertArgument(isVersion(version2), "version2", "Invalid version object");
332
+ if (!versionValid(version1) || !versionValid(version2)) {
333
+ return "unversioned";
334
+ }
335
+ if (version1.automergeHeads?.length !== version2.automergeHeads?.length) {
336
+ return "different";
337
+ }
338
+ if (version1.automergeHeads?.some((head) => !version2.automergeHeads?.includes(head))) {
339
+ return "different";
340
+ }
341
+ return "equal";
342
+ };
343
+ var encodeVersion = (version2) => {
344
+ return JSON.stringify(version2);
345
+ };
346
+ var decodeVersion = (version2) => {
347
+ const parsed = JSON.parse(version2);
348
+ parsed[VersionTypeId2] = {};
349
+ return parsed;
350
+ };
113
351
 
114
352
  // src/Ref.ts
115
353
  var Ref_exports = {};
@@ -119,15 +357,16 @@ __export(Ref_exports, {
119
357
  isRef: () => isRef,
120
358
  make: () => make2
121
359
  });
122
- import * as EchoSchema2 from "@dxos/echo-schema";
123
- var Array2 = EchoSchema2.RefArray;
124
- var isRef = EchoSchema2.Ref.isRef;
125
- var make2 = EchoSchema2.Ref.make;
126
- var fromDXN = EchoSchema2.Ref.fromDXN;
360
+ import * as EchoSchema3 from "@dxos/echo-schema";
361
+ var Array2 = EchoSchema3.RefArray;
362
+ var isRef = EchoSchema3.Ref.isRef;
363
+ var make2 = EchoSchema3.Ref.make;
364
+ var fromDXN = EchoSchema3.Ref.fromDXN;
127
365
 
128
366
  // src/Relation.ts
129
367
  var Relation_exports = {};
130
368
  __export(Relation_exports, {
369
+ Any: () => Any2,
131
370
  Source: () => Source,
132
371
  Target: () => Target,
133
372
  getSource: () => getSource,
@@ -137,44 +376,51 @@ __export(Relation_exports, {
137
376
  isRelation: () => isRelation,
138
377
  make: () => make3
139
378
  });
379
+ import { Schema as Schema2 } from "effect";
140
380
  import { raise } from "@dxos/debug";
141
- import * as EchoSchema3 from "@dxos/echo-schema";
142
- import { assertArgument as assertArgument2, invariant as invariant2 } from "@dxos/invariant";
143
- import { DXN } from "@dxos/keys";
381
+ import * as EchoSchema4 from "@dxos/echo-schema";
382
+ import { assertArgument as assertArgument2, invariant as invariant3 } from "@dxos/invariant";
383
+ import { DXN as DXN2 } from "@dxos/keys";
144
384
  import { live as live2 } from "@dxos/live-object";
145
385
  import { assumeType as assumeType2 } from "@dxos/util";
146
- var __dxlog_file2 = "/__w/dxos/dxos/packages/core/echo/echo/src/Relation.ts";
147
- var Source = EchoSchema3.RelationSourceId;
148
- var Target = EchoSchema3.RelationTargetId;
386
+ var __dxlog_file3 = "/__w/dxos/dxos/packages/core/echo/echo/src/Relation.ts";
387
+ var Any2 = Schema2.Struct({}).pipe(Relation({
388
+ typename: "dxos.org/types/Any",
389
+ version: "0.1.0",
390
+ source: Any,
391
+ target: Any
392
+ }));
393
+ var Source = EchoSchema4.RelationSourceId;
394
+ var Target = EchoSchema4.RelationTargetId;
149
395
  var make3 = (schema, props, meta) => {
150
- assertArgument2(EchoSchema3.getTypeAnnotation(schema)?.kind === EchoSchema3.EntityKind.Relation, "Expected a relation schema");
151
- if (props[EchoSchema3.MetaId] != null) {
152
- meta = props[EchoSchema3.MetaId];
153
- delete props[EchoSchema3.MetaId];
154
- }
155
- const sourceDXN = EchoSchema3.getObjectDXN(props[Source]) ?? raise(new Error("Unresolved relation source"));
156
- const targetDXN = EchoSchema3.getObjectDXN(props[Target]) ?? raise(new Error("Unresolved relation target"));
157
- props[EchoSchema3.RelationSourceDXNId] = sourceDXN;
158
- props[EchoSchema3.RelationTargetDXNId] = targetDXN;
396
+ assertArgument2(EchoSchema4.getTypeAnnotation(schema)?.kind === EchoSchema4.EntityKind.Relation, "schema", "Expected a relation schema");
397
+ if (props[EchoSchema4.MetaId] != null) {
398
+ meta = props[EchoSchema4.MetaId];
399
+ delete props[EchoSchema4.MetaId];
400
+ }
401
+ const sourceDXN = EchoSchema4.getObjectDXN(props[Source]) ?? raise(new Error("Unresolved relation source"));
402
+ const targetDXN = EchoSchema4.getObjectDXN(props[Target]) ?? raise(new Error("Unresolved relation target"));
403
+ props[EchoSchema4.RelationSourceDXNId] = sourceDXN;
404
+ props[EchoSchema4.RelationTargetDXNId] = targetDXN;
159
405
  return live2(schema, props, meta);
160
406
  };
161
407
  var isRelation = (value) => {
162
408
  if (typeof value !== "object" || value === null) {
163
409
  return false;
164
410
  }
165
- if (EchoSchema3.ATTR_RELATION_SOURCE in value || EchoSchema3.ATTR_RELATION_TARGET in value) {
411
+ if (EchoSchema4.ATTR_RELATION_SOURCE in value || EchoSchema4.ATTR_RELATION_TARGET in value) {
166
412
  return true;
167
413
  }
168
- const kind = value[EchoSchema3.EntityKindId];
169
- return kind === EchoSchema3.EntityKind.Relation;
414
+ const kind = value[EchoSchema4.EntityKindId];
415
+ return kind === EchoSchema4.EntityKind.Relation;
170
416
  };
171
417
  var getSourceDXN = (value) => {
172
418
  assertArgument2(isRelation(value), "Expected a relation");
173
419
  assumeType2(value);
174
- const dxn = value[EchoSchema3.RelationSourceDXNId];
175
- invariant2(dxn instanceof DXN, void 0, {
176
- F: __dxlog_file2,
177
- L: 98,
420
+ const dxn = value[EchoSchema4.RelationSourceDXNId];
421
+ invariant3(dxn instanceof DXN2, void 0, {
422
+ F: __dxlog_file3,
423
+ L: 109,
178
424
  S: void 0,
179
425
  A: [
180
426
  "dxn instanceof DXN",
@@ -186,10 +432,10 @@ var getSourceDXN = (value) => {
186
432
  var getTargetDXN = (value) => {
187
433
  assertArgument2(isRelation(value), "Expected a relation");
188
434
  assumeType2(value);
189
- const dxn = value[EchoSchema3.RelationTargetDXNId];
190
- invariant2(dxn instanceof DXN, void 0, {
191
- F: __dxlog_file2,
192
- L: 110,
435
+ const dxn = value[EchoSchema4.RelationTargetDXNId];
436
+ invariant3(dxn instanceof DXN2, void 0, {
437
+ F: __dxlog_file3,
438
+ L: 121,
193
439
  S: void 0,
194
440
  A: [
195
441
  "dxn instanceof DXN",
@@ -201,10 +447,10 @@ var getTargetDXN = (value) => {
201
447
  var getSource = (relation) => {
202
448
  assertArgument2(isRelation(relation), "Expected a relation");
203
449
  assumeType2(relation);
204
- const obj = relation[EchoSchema3.RelationSourceId];
205
- invariant2(obj !== void 0, `Invalid source: ${relation.id}`, {
206
- F: __dxlog_file2,
207
- L: 122,
450
+ const obj = relation[EchoSchema4.RelationSourceId];
451
+ invariant3(obj !== void 0, `Invalid source: ${relation.id}`, {
452
+ F: __dxlog_file3,
453
+ L: 133,
208
454
  S: void 0,
209
455
  A: [
210
456
  "obj !== undefined",
@@ -216,10 +462,10 @@ var getSource = (relation) => {
216
462
  var getTarget = (relation) => {
217
463
  assertArgument2(isRelation(relation), "Expected a relation");
218
464
  assumeType2(relation);
219
- const obj = relation[EchoSchema3.RelationTargetId];
220
- invariant2(obj !== void 0, `Invalid target: ${relation.id}`, {
221
- F: __dxlog_file2,
222
- L: 134,
465
+ const obj = relation[EchoSchema4.RelationTargetId];
466
+ invariant3(obj !== void 0, `Invalid target: ${relation.id}`, {
467
+ F: __dxlog_file3,
468
+ L: 145,
223
469
  S: void 0,
224
470
  A: [
225
471
  "obj !== undefined",
@@ -229,86 +475,51 @@ var getTarget = (relation) => {
229
475
  return obj;
230
476
  };
231
477
 
232
- // src/Type.ts
233
- var Type_exports = {};
234
- __export(Type_exports, {
235
- DXN: () => DXN2,
236
- Expando: () => Expando2,
237
- Format: () => Format,
238
- JsonSchema: () => JsonSchemaType,
239
- Kind: () => Kind,
240
- KindId: () => KindId,
241
- Obj: () => Obj,
242
- ObjectId: () => ObjectId2,
243
- Ref: () => Ref3,
244
- Relation: () => Relation,
245
- SpaceId: () => SpaceId2,
246
- getDXN: () => getDXN2,
247
- getMeta: () => getMeta3,
248
- getTypename: () => getTypename2,
249
- getVersion: () => getVersion,
250
- isMutable: () => isMutable2,
251
- toEffectSchema: () => toEffectSchema,
252
- toJsonSchema: () => toJsonSchema
253
- });
254
- import * as EchoSchema4 from "@dxos/echo-schema";
255
- import { invariant as invariant3 } from "@dxos/invariant";
256
- import { SpaceId as SpaceId2, ObjectId as ObjectId2, DXN as DXN2 } from "@dxos/keys";
257
- import { Format, JsonSchemaType, toEffectSchema, toJsonSchema } from "@dxos/echo-schema";
258
- var __dxlog_file3 = "/__w/dxos/dxos/packages/core/echo/echo/src/Type.ts";
259
- var KindId = EchoSchema4.EntityKindId;
260
- var Kind = EchoSchema4.EntityKind;
261
- var Obj = EchoSchema4.EchoObject;
262
- var Expando2 = EchoSchema4.Expando;
263
- var Relation = EchoSchema4.EchoRelation;
264
- var Ref3 = EchoSchema4.Ref;
265
- var getDXN2 = (schema) => {
266
- return EchoSchema4.getSchemaDXN(schema);
267
- };
268
- var getTypename2 = (schema) => {
269
- const typename = EchoSchema4.getSchemaTypename(schema);
270
- invariant3(typeof typename === "string" && !typename.startsWith("dxn:"), "Invalid typename", {
271
- F: __dxlog_file3,
272
- L: 210,
273
- S: void 0,
274
- A: [
275
- "typeof typename === 'string' && !typename.startsWith('dxn:')",
276
- "'Invalid typename'"
277
- ]
278
- });
279
- return typename;
280
- };
281
- var getVersion = (schema) => {
282
- const version = EchoSchema4.getSchemaVersion(schema);
283
- invariant3(typeof version === "string" && version.match(/^\d+\.\d+\.\d+$/), "Invalid version", {
284
- F: __dxlog_file3,
285
- L: 220,
286
- S: void 0,
287
- A: [
288
- "typeof version === 'string' && version.match(/^\\d+\\.\\d+\\.\\d+$/)",
289
- "'Invalid version'"
290
- ]
291
- });
292
- return version;
293
- };
294
- var isMutable2 = EchoSchema4.isMutable;
295
- var getMeta3 = (schema) => {
296
- return EchoSchema4.getTypeAnnotation(schema);
297
- };
298
-
299
478
  // src/index.ts
300
479
  import { DXN as DXN4 } from "@dxos/keys";
301
480
 
302
481
  // src/query/dsl.ts
303
- import { Schema as Schema2 } from "effect";
482
+ import { Match, Schema as Schema3 } from "effect";
304
483
  import { raise as raise2 } from "@dxos/debug";
305
484
  import { getTypeReference } from "@dxos/echo-schema";
306
485
  import { assertArgument as assertArgument3 } from "@dxos/invariant";
307
486
  import { DXN as DXN3, ObjectId as ObjectId3 } from "@dxos/keys";
308
- var FilterClass = class _FilterClass {
309
- static {
310
- this.variance = {};
487
+ function _define_property(obj, key, value) {
488
+ if (key in obj) {
489
+ Object.defineProperty(obj, key, {
490
+ value,
491
+ enumerable: true,
492
+ configurable: true,
493
+ writable: true
494
+ });
495
+ } else {
496
+ obj[key] = value;
311
497
  }
498
+ return obj;
499
+ }
500
+ var OrderClass = class _OrderClass {
501
+ static is(value) {
502
+ return typeof value === "object" && value !== null && "~Order" in value;
503
+ }
504
+ constructor(ast) {
505
+ _define_property(this, "ast", void 0);
506
+ _define_property(this, "~Order", void 0);
507
+ this.ast = ast;
508
+ this["~Order"] = _OrderClass.variance;
509
+ }
510
+ };
511
+ _define_property(OrderClass, "variance", {});
512
+ (function(Order2) {
513
+ Order2.natural = new OrderClass({
514
+ kind: "natural"
515
+ });
516
+ Order2.property = (property, direction) => new OrderClass({
517
+ kind: "property",
518
+ property,
519
+ direction
520
+ });
521
+ })(Order || (Order = {}));
522
+ var FilterClass = class _FilterClass {
312
523
  static is(value) {
313
524
  return typeof value === "object" && value !== null && "~Filter" in value;
314
525
  }
@@ -337,7 +548,7 @@ var FilterClass = class _FilterClass {
337
548
  });
338
549
  }
339
550
  static ids(...ids) {
340
- assertArgument3(ids.every((id) => ObjectId3.isValid(id)), "ids must be valid");
551
+ assertArgument3(ids.every((id) => ObjectId3.isValid(id)), "ids", "ids must be valid");
341
552
  if (ids.length === 0) {
342
553
  return Filter.nothing();
343
554
  }
@@ -357,7 +568,7 @@ var FilterClass = class _FilterClass {
357
568
  });
358
569
  }
359
570
  static typename(typename) {
360
- assertArgument3(!typename.startsWith("dxn:"), "Typename must no be qualified");
571
+ assertArgument3(!typename.startsWith("dxn:"), "typename", "Typename must no be qualified");
361
572
  return new _FilterClass({
362
573
  type: "object",
363
574
  typename: DXN3.fromTypename(typename).toString(),
@@ -371,10 +582,13 @@ var FilterClass = class _FilterClass {
371
582
  props: {}
372
583
  });
373
584
  }
374
- /**
375
- * @internal
376
- */
377
- static _props(props) {
585
+ static tag(tag) {
586
+ return new _FilterClass({
587
+ type: "tag",
588
+ tag
589
+ });
590
+ }
591
+ static props(props) {
378
592
  return new _FilterClass({
379
593
  type: "object",
380
594
  typename: null,
@@ -448,6 +662,12 @@ var FilterClass = class _FilterClass {
448
662
  values
449
663
  });
450
664
  }
665
+ static contains(value) {
666
+ return new _FilterClass({
667
+ type: "contains",
668
+ value
669
+ });
670
+ }
451
671
  static between(from, to) {
452
672
  return new _FilterClass({
453
673
  type: "range",
@@ -474,35 +694,60 @@ var FilterClass = class _FilterClass {
474
694
  });
475
695
  }
476
696
  constructor(ast) {
697
+ _define_property(this, "ast", void 0);
698
+ _define_property(this, "~Filter", void 0);
477
699
  this.ast = ast;
478
700
  this["~Filter"] = _FilterClass.variance;
479
701
  }
480
702
  };
703
+ _define_property(FilterClass, "variance", {});
481
704
  var Filter = FilterClass;
482
705
  var propsFilterToAst = (predicates) => {
483
706
  let idFilter;
484
707
  if ("id" in predicates) {
485
- assertArgument3(typeof predicates.id === "string" || Array.isArray(predicates.id), "invalid id filter");
708
+ assertArgument3(typeof predicates.id === "string" || Array.isArray(predicates.id), "predicates.id", "invalid id filter");
486
709
  idFilter = typeof predicates.id === "string" ? [
487
710
  predicates.id
488
711
  ] : predicates.id;
489
- Schema2.Array(ObjectId3).pipe(Schema2.validateSync)(idFilter);
712
+ Schema3.Array(ObjectId3).pipe(Schema3.validateSync)(idFilter);
490
713
  }
491
714
  return {
492
715
  id: idFilter,
493
716
  props: Object.fromEntries(Object.entries(predicates).filter(([prop, _value]) => prop !== "id").map(([prop, predicate]) => [
494
717
  prop,
495
- Filter.is(predicate) ? predicate.ast : Filter.eq(predicate).ast
718
+ processPredicate(predicate)
496
719
  ]))
497
720
  };
498
721
  };
722
+ var processPredicate = (predicate) => {
723
+ return Match.value(predicate).pipe(
724
+ Match.withReturnType(),
725
+ Match.when(Filter.is, (predicate2) => predicate2.ast),
726
+ // TODO(wittjosiah): Add support for array predicates.
727
+ Match.when(Array.isArray, (_predicate) => {
728
+ throw new Error("Array predicates are not yet supported.");
729
+ }),
730
+ Match.when((predicate2) => !isRef(predicate2) && typeof predicate2 === "object" && predicate2 !== null, (predicate2) => {
731
+ const nestedProps = Object.fromEntries(Object.entries(predicate2).map(([key, value]) => [
732
+ key,
733
+ processPredicate(value)
734
+ ]));
735
+ return {
736
+ type: "object",
737
+ typename: null,
738
+ props: nestedProps
739
+ };
740
+ }),
741
+ Match.orElse((value) => Filter.eq(value).ast)
742
+ );
743
+ };
499
744
  var QueryClass = class _QueryClass {
500
- static {
501
- this.variance = {};
502
- }
503
745
  static is(value) {
504
746
  return typeof value === "object" && value !== null && "~Query" in value;
505
747
  }
748
+ static fromAst(ast) {
749
+ return new _QueryClass(ast);
750
+ }
506
751
  static select(filter) {
507
752
  return new _QueryClass({
508
753
  type: "select",
@@ -531,10 +776,6 @@ var QueryClass = class _QueryClass {
531
776
  exclude: exclude.ast
532
777
  });
533
778
  }
534
- constructor(ast) {
535
- this.ast = ast;
536
- this["~Query"] = _QueryClass.variance;
537
- }
538
779
  select(filter) {
539
780
  if (Filter.is(filter)) {
540
781
  return new _QueryClass({
@@ -546,7 +787,7 @@ var QueryClass = class _QueryClass {
546
787
  return new _QueryClass({
547
788
  type: "filter",
548
789
  selection: this.ast,
549
- filter: FilterClass._props(filter).ast
790
+ filter: FilterClass.props(filter).ast
550
791
  });
551
792
  }
552
793
  }
@@ -596,6 +837,13 @@ var QueryClass = class _QueryClass {
596
837
  direction: "target"
597
838
  });
598
839
  }
840
+ orderBy(...order) {
841
+ return new _QueryClass({
842
+ type: "order",
843
+ query: this.ast,
844
+ order: order.map((o) => o.ast)
845
+ });
846
+ }
599
847
  options(options) {
600
848
  return new _QueryClass({
601
849
  type: "options",
@@ -603,17 +851,32 @@ var QueryClass = class _QueryClass {
603
851
  options
604
852
  });
605
853
  }
854
+ constructor(ast) {
855
+ _define_property(this, "ast", void 0);
856
+ _define_property(this, "~Query", void 0);
857
+ this.ast = ast;
858
+ this["~Query"] = _QueryClass.variance;
859
+ }
606
860
  };
861
+ _define_property(QueryClass, "variance", {});
607
862
  var Query = QueryClass;
863
+ var Order;
864
+
865
+ // src/index.ts
866
+ import { QueryAST } from "@dxos/echo-protocol";
608
867
 
609
868
  export {
869
+ SchemaNotFoundError,
870
+ ObjectNotFoundError,
610
871
  Key_exports,
872
+ Type_exports,
611
873
  Obj_exports,
612
874
  Ref_exports,
613
875
  Relation_exports,
614
- Type_exports,
615
876
  Filter,
616
877
  Query,
617
- DXN4 as DXN
878
+ Order,
879
+ DXN4 as DXN,
880
+ QueryAST
618
881
  };
619
- //# sourceMappingURL=chunk-53HXWYR6.mjs.map
882
+ //# sourceMappingURL=chunk-AWWFAF75.mjs.map