@dxos/echo 0.10.0 → 0.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/Annotation.mjs +3 -0
- package/dist/lib/Blob.mjs +160 -0
- package/dist/lib/Blob.mjs.map +1 -0
- package/dist/lib/Database.mjs +2 -0
- package/dist/lib/Entity.mjs +231 -0
- package/dist/lib/Entity.mjs.map +1 -0
- package/dist/lib/Err.mjs +105 -0
- package/dist/lib/Err.mjs.map +1 -0
- package/dist/lib/Feed.mjs +338 -0
- package/dist/lib/Feed.mjs.map +1 -0
- package/dist/lib/Filter.mjs +380 -0
- package/dist/lib/Filter.mjs.map +1 -0
- package/dist/lib/Format.mjs +47 -0
- package/dist/lib/Format.mjs.map +1 -0
- package/dist/lib/JsonSchema.mjs +21 -0
- package/dist/lib/JsonSchema.mjs.map +1 -0
- package/dist/lib/Key.mjs +15 -0
- package/dist/lib/Key.mjs.map +1 -0
- package/dist/lib/Migration.mjs +38 -0
- package/dist/lib/Migration.mjs.map +1 -0
- package/dist/lib/Obj.mjs +660 -0
- package/dist/lib/Obj.mjs.map +1 -0
- package/dist/lib/Order.mjs +65 -0
- package/dist/lib/Order.mjs.map +1 -0
- package/dist/lib/Query.mjs +336 -0
- package/dist/lib/Query.mjs.map +1 -0
- package/dist/lib/QueryResult.mjs +7 -0
- package/dist/lib/QueryResult.mjs.map +1 -0
- package/dist/lib/Ref.mjs +44 -0
- package/dist/lib/Ref.mjs.map +1 -0
- package/dist/lib/Registry.mjs +35 -0
- package/dist/lib/Registry.mjs.map +1 -0
- package/dist/lib/Relation.mjs +397 -0
- package/dist/lib/Relation.mjs.map +1 -0
- package/dist/lib/Scope.mjs +51 -0
- package/dist/lib/Scope.mjs.map +1 -0
- package/dist/lib/Tag.mjs +70 -0
- package/dist/lib/Tag.mjs.map +1 -0
- package/dist/lib/Text.mjs +82 -0
- package/dist/lib/Text.mjs.map +1 -0
- package/dist/lib/Type.mjs +371 -0
- package/dist/lib/Type.mjs.map +1 -0
- package/dist/lib/chunk-Annotation.mjs +221 -0
- package/dist/lib/chunk-Annotation.mjs.map +1 -0
- package/dist/lib/chunk-Database.mjs +918 -0
- package/dist/lib/chunk-Database.mjs.map +1 -0
- package/dist/lib/chunk-atom-snapshot.mjs +249 -0
- package/dist/lib/chunk-atom-snapshot.mjs.map +1 -0
- package/dist/lib/chunk-internal.mjs +2775 -0
- package/dist/lib/chunk-internal.mjs.map +1 -0
- package/dist/lib/chunk-json-schema.mjs +660 -0
- package/dist/lib/chunk-json-schema.mjs.map +1 -0
- package/dist/lib/chunk-number.mjs +164 -0
- package/dist/lib/chunk-number.mjs.map +1 -0
- package/dist/lib/chunk-ref-array.mjs +31 -0
- package/dist/lib/chunk-ref-array.mjs.map +1 -0
- package/dist/lib/chunk-ref.mjs +590 -0
- package/dist/lib/chunk-ref.mjs.map +1 -0
- package/dist/lib/chunk-rolldown-runtime.mjs +13 -0
- package/dist/lib/chunk-select.mjs +186 -0
- package/dist/lib/chunk-select.mjs.map +1 -0
- package/dist/lib/chunk-src.mjs +234 -0
- package/dist/lib/chunk-src.mjs.map +1 -0
- package/dist/lib/chunk-util.mjs +140 -0
- package/dist/lib/chunk-util.mjs.map +1 -0
- package/dist/lib/index.mjs +24 -0
- package/dist/lib/internal.mjs +10 -0
- package/dist/lib/testing.mjs +346 -0
- package/dist/lib/testing.mjs.map +1 -0
- package/dist/types/src/Aggregate.d.ts +86 -0
- package/dist/types/src/Aggregate.d.ts.map +1 -0
- package/dist/types/src/Blob.d.ts +153 -0
- package/dist/types/src/Blob.d.ts.map +1 -0
- package/dist/types/src/Blob.test.d.ts +2 -0
- package/dist/types/src/Blob.test.d.ts.map +1 -0
- package/dist/types/src/Database.d.ts +153 -4
- package/dist/types/src/Database.d.ts.map +1 -1
- package/dist/types/src/Err.d.ts +116 -0
- package/dist/types/src/Err.d.ts.map +1 -1
- package/dist/types/src/Feed.d.ts +116 -28
- package/dist/types/src/Feed.d.ts.map +1 -1
- package/dist/types/src/Feed.test.d.ts +2 -0
- package/dist/types/src/Feed.test.d.ts.map +1 -0
- package/dist/types/src/Filter.d.ts +14 -6
- package/dist/types/src/Filter.d.ts.map +1 -1
- package/dist/types/src/Hypergraph.d.ts +18 -0
- package/dist/types/src/Hypergraph.d.ts.map +1 -1
- package/dist/types/src/Json.d.ts.map +1 -1
- package/dist/types/src/Obj.d.ts +14 -1
- package/dist/types/src/Obj.d.ts.map +1 -1
- package/dist/types/src/Order.d.ts +9 -3
- package/dist/types/src/Order.d.ts.map +1 -1
- package/dist/types/src/Query.d.ts +107 -26
- package/dist/types/src/Query.d.ts.map +1 -1
- package/dist/types/src/Relation.d.ts +6 -0
- package/dist/types/src/Relation.d.ts.map +1 -1
- package/dist/types/src/Type.d.ts.map +1 -1
- package/dist/types/src/View.d.ts +1 -1
- package/dist/types/src/index.d.ts +2 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/api.d.ts +6 -0
- package/dist/types/src/internal/Entity/api.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/model.d.ts +3 -2
- package/dist/types/src/internal/Entity/model.d.ts.map +1 -1
- package/dist/types/src/internal/Filter/match.d.ts.map +1 -1
- package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts +34 -8
- package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -1
- package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/atoms.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -1
- package/dist/types/src/internal/Query/pretty.d.ts.map +1 -1
- package/dist/types/src/internal/Query/query-result-effect.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/make-object.d.ts +13 -0
- package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/reactive.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/symbols.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/typed-handler.d.ts +12 -0
- package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/index.d.ts +1 -0
- package/dist/types/src/internal/common/types/index.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/model-symbols.d.ts +5 -0
- package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/projection.d.ts +32 -0
- package/dist/types/src/internal/common/types/projection.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +40 -35
- package/src/Aggregate.ts +105 -0
- package/src/Blob.test.ts +45 -0
- package/src/Blob.ts +205 -0
- package/src/Database.ts +207 -17
- package/src/Err.ts +36 -0
- package/src/Feed.test.ts +188 -0
- package/src/Feed.ts +238 -62
- package/src/Filter.ts +28 -10
- package/src/Hypergraph.ts +18 -0
- package/src/Json.ts +1 -0
- package/src/Obj.test.ts +2 -2
- package/src/Obj.ts +21 -1
- package/src/Order.ts +16 -9
- package/src/Query.test.ts +319 -2
- package/src/Query.ts +165 -51
- package/src/Relation.ts +14 -0
- package/src/Type.ts +5 -6
- package/src/index.ts +2 -0
- package/src/internal/Entity/api.ts +11 -1
- package/src/internal/Entity/model.ts +3 -0
- package/src/internal/Filter/match.ts +30 -1
- package/src/internal/JsonSchema/json-schema-type.ts +14 -2
- package/src/internal/JsonSchema/json-schema.test.ts +28 -1
- package/src/internal/JsonSchema/json-schema.ts +33 -6
- package/src/internal/Obj/atoms.ts +4 -2
- package/src/internal/Obj/json-serializer.test.ts +162 -2
- package/src/internal/Obj/json-serializer.ts +6 -0
- package/src/internal/Query/pretty.ts +19 -1
- package/src/internal/Query/query-result-effect.ts +2 -4
- package/src/internal/Ref/atoms.ts +1 -1
- package/src/internal/common/proxy/change-context.ts +1 -1
- package/src/internal/common/proxy/make-object.ts +42 -3
- package/src/internal/common/proxy/reactive.ts +5 -0
- package/src/internal/common/proxy/symbols.ts +1 -0
- package/src/internal/common/proxy/typed-handler.ts +71 -29
- package/src/internal/common/types/index.ts +1 -0
- package/src/internal/common/types/model-symbols.ts +6 -0
- package/src/internal/common/types/projection.ts +45 -0
- package/src/testing/test-data.ts +14 -14
- package/dist/lib/neutral/Annotation.mjs +0 -90
- package/dist/lib/neutral/Annotation.mjs.map +0 -7
- package/dist/lib/neutral/Database.mjs +0 -42
- package/dist/lib/neutral/Database.mjs.map +0 -7
- package/dist/lib/neutral/Entity.mjs +0 -76
- package/dist/lib/neutral/Entity.mjs.map +0 -7
- package/dist/lib/neutral/Err.mjs +0 -16
- package/dist/lib/neutral/Err.mjs.map +0 -7
- package/dist/lib/neutral/Feed.mjs +0 -50
- package/dist/lib/neutral/Feed.mjs.map +0 -7
- package/dist/lib/neutral/Filter.mjs +0 -72
- package/dist/lib/neutral/Filter.mjs.map +0 -7
- package/dist/lib/neutral/Format.mjs +0 -82
- package/dist/lib/neutral/Format.mjs.map +0 -7
- package/dist/lib/neutral/JsonSchema.mjs +0 -18
- package/dist/lib/neutral/JsonSchema.mjs.map +0 -7
- package/dist/lib/neutral/Key.mjs +0 -16
- package/dist/lib/neutral/Key.mjs.map +0 -7
- package/dist/lib/neutral/Migration.mjs +0 -18
- package/dist/lib/neutral/Migration.mjs.map +0 -7
- package/dist/lib/neutral/Obj.mjs +0 -128
- package/dist/lib/neutral/Obj.mjs.map +0 -7
- package/dist/lib/neutral/Order.mjs +0 -16
- package/dist/lib/neutral/Order.mjs.map +0 -7
- package/dist/lib/neutral/Query.mjs +0 -38
- package/dist/lib/neutral/Query.mjs.map +0 -7
- package/dist/lib/neutral/QueryResult.mjs +0 -2
- package/dist/lib/neutral/QueryResult.mjs.map +0 -7
- package/dist/lib/neutral/Ref.mjs +0 -25
- package/dist/lib/neutral/Ref.mjs.map +0 -7
- package/dist/lib/neutral/Registry.mjs +0 -14
- package/dist/lib/neutral/Registry.mjs.map +0 -7
- package/dist/lib/neutral/Relation.mjs +0 -97
- package/dist/lib/neutral/Relation.mjs.map +0 -7
- package/dist/lib/neutral/Scope.mjs +0 -12
- package/dist/lib/neutral/Scope.mjs.map +0 -7
- package/dist/lib/neutral/Tag.mjs +0 -32
- package/dist/lib/neutral/Tag.mjs.map +0 -7
- package/dist/lib/neutral/Text.mjs +0 -25
- package/dist/lib/neutral/Text.mjs.map +0 -7
- package/dist/lib/neutral/Type.mjs +0 -65
- package/dist/lib/neutral/Type.mjs.map +0 -7
- package/dist/lib/neutral/chunk-2HKGAQM4.mjs +0 -1394
- package/dist/lib/neutral/chunk-2HKGAQM4.mjs.map +0 -7
- package/dist/lib/neutral/chunk-2ZHECXUR.mjs +0 -95
- package/dist/lib/neutral/chunk-2ZHECXUR.mjs.map +0 -7
- package/dist/lib/neutral/chunk-3KTE2Y7Q.mjs +0 -336
- package/dist/lib/neutral/chunk-3KTE2Y7Q.mjs.map +0 -7
- package/dist/lib/neutral/chunk-3TN2VMI4.mjs +0 -714
- package/dist/lib/neutral/chunk-3TN2VMI4.mjs.map +0 -7
- package/dist/lib/neutral/chunk-42L4HJ3Z.mjs +0 -104
- package/dist/lib/neutral/chunk-42L4HJ3Z.mjs.map +0 -7
- package/dist/lib/neutral/chunk-4A2NWKRJ.mjs +0 -747
- package/dist/lib/neutral/chunk-4A2NWKRJ.mjs.map +0 -7
- package/dist/lib/neutral/chunk-7LOUAPYZ.mjs +0 -25
- package/dist/lib/neutral/chunk-7LOUAPYZ.mjs.map +0 -7
- package/dist/lib/neutral/chunk-ACFAOTKJ.mjs +0 -1531
- package/dist/lib/neutral/chunk-ACFAOTKJ.mjs.map +0 -7
- package/dist/lib/neutral/chunk-BEFR7LEA.mjs +0 -170
- package/dist/lib/neutral/chunk-BEFR7LEA.mjs.map +0 -7
- package/dist/lib/neutral/chunk-BXIKXT7Q.mjs +0 -89
- package/dist/lib/neutral/chunk-BXIKXT7Q.mjs.map +0 -7
- package/dist/lib/neutral/chunk-C57XMMBY.mjs +0 -206
- package/dist/lib/neutral/chunk-C57XMMBY.mjs.map +0 -7
- package/dist/lib/neutral/chunk-C62JYFAD.mjs +0 -183
- package/dist/lib/neutral/chunk-C62JYFAD.mjs.map +0 -7
- package/dist/lib/neutral/chunk-FSGX2R62.mjs +0 -48
- package/dist/lib/neutral/chunk-FSGX2R62.mjs.map +0 -7
- package/dist/lib/neutral/chunk-HBXT3GSB.mjs +0 -459
- package/dist/lib/neutral/chunk-HBXT3GSB.mjs.map +0 -7
- package/dist/lib/neutral/chunk-IQR45HAD.mjs +0 -31
- package/dist/lib/neutral/chunk-IQR45HAD.mjs.map +0 -7
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs +0 -10
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +0 -7
- package/dist/lib/neutral/chunk-KCBW4BR6.mjs +0 -424
- package/dist/lib/neutral/chunk-KCBW4BR6.mjs.map +0 -7
- package/dist/lib/neutral/chunk-L3E5IXAE.mjs +0 -575
- package/dist/lib/neutral/chunk-L3E5IXAE.mjs.map +0 -7
- package/dist/lib/neutral/chunk-PRC4FEKJ.mjs +0 -56
- package/dist/lib/neutral/chunk-PRC4FEKJ.mjs.map +0 -7
- package/dist/lib/neutral/chunk-SCT6FFCR.mjs +0 -351
- package/dist/lib/neutral/chunk-SCT6FFCR.mjs.map +0 -7
- package/dist/lib/neutral/chunk-TOCVVFK2.mjs +0 -75
- package/dist/lib/neutral/chunk-TOCVVFK2.mjs.map +0 -7
- package/dist/lib/neutral/chunk-U53LSQQA.mjs +0 -41
- package/dist/lib/neutral/chunk-U53LSQQA.mjs.map +0 -7
- package/dist/lib/neutral/chunk-UGFFV2FR.mjs +0 -27
- package/dist/lib/neutral/chunk-UGFFV2FR.mjs.map +0 -7
- package/dist/lib/neutral/chunk-UWLP4RFM.mjs +0 -7
- package/dist/lib/neutral/chunk-UWLP4RFM.mjs.map +0 -7
- package/dist/lib/neutral/chunk-UZHCQ6NI.mjs +0 -283
- package/dist/lib/neutral/chunk-UZHCQ6NI.mjs.map +0 -7
- package/dist/lib/neutral/chunk-WISOH2XH.mjs +0 -36
- package/dist/lib/neutral/chunk-WISOH2XH.mjs.map +0 -7
- package/dist/lib/neutral/chunk-WKIT2YY5.mjs +0 -34
- package/dist/lib/neutral/chunk-WKIT2YY5.mjs.map +0 -7
- package/dist/lib/neutral/chunk-XB6ISRAO.mjs +0 -271
- package/dist/lib/neutral/chunk-XB6ISRAO.mjs.map +0 -7
- package/dist/lib/neutral/chunk-XXL42WCB.mjs +0 -84
- package/dist/lib/neutral/chunk-XXL42WCB.mjs.map +0 -7
- package/dist/lib/neutral/chunk-XXWK4J53.mjs +0 -117
- package/dist/lib/neutral/chunk-XXWK4J53.mjs.map +0 -7
- package/dist/lib/neutral/index.mjs +0 -115
- package/dist/lib/neutral/index.mjs.map +0 -7
- package/dist/lib/neutral/internal/index.mjs +0 -581
- package/dist/lib/neutral/internal/index.mjs.map +0 -7
- package/dist/lib/neutral/meta.json +0 -1
- package/dist/lib/neutral/testing/index.mjs +0 -477
- package/dist/lib/neutral/testing/index.mjs.map +0 -7
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
import { t as __exportAll } from "./chunk-rolldown-runtime.mjs";
|
|
2
|
+
import { Dt as isProjection, vt as prettyFilter, y as filterMatchEntity } from "./chunk-internal.mjs";
|
|
3
|
+
import { T as getUri, x as getTypeURIFromSpecifier } from "./chunk-Database.mjs";
|
|
4
|
+
import { isRef } from "./Ref.mjs";
|
|
5
|
+
import { EID, EntityId } from "@dxos/keys";
|
|
6
|
+
import * as Function from "effect/Function";
|
|
7
|
+
import * as Schema from "effect/Schema";
|
|
8
|
+
import * as SchemaAST from "effect/SchemaAST";
|
|
9
|
+
import { assertArgument } from "@dxos/invariant";
|
|
10
|
+
import * as Match from "effect/Match";
|
|
11
|
+
//#region src/Filter.ts
|
|
12
|
+
var Filter_exports = /* @__PURE__ */ __exportAll({
|
|
13
|
+
FilterTypeId: () => FilterTypeId,
|
|
14
|
+
and: () => and,
|
|
15
|
+
between: () => between,
|
|
16
|
+
childOf: () => childOf,
|
|
17
|
+
contains: () => contains,
|
|
18
|
+
created: () => created,
|
|
19
|
+
eq: () => eq,
|
|
20
|
+
everything: () => everything,
|
|
21
|
+
foreignKeys: () => foreignKeys,
|
|
22
|
+
fromAst: () => fromAst,
|
|
23
|
+
gt: () => gt,
|
|
24
|
+
gte: () => gte,
|
|
25
|
+
id: () => id,
|
|
26
|
+
in: () => in$,
|
|
27
|
+
is: () => is,
|
|
28
|
+
key: () => key,
|
|
29
|
+
lt: () => lt,
|
|
30
|
+
lte: () => lte,
|
|
31
|
+
neq: () => neq,
|
|
32
|
+
not: () => not,
|
|
33
|
+
nothing: () => nothing,
|
|
34
|
+
or: () => or,
|
|
35
|
+
pretty: () => pretty,
|
|
36
|
+
props: () => props,
|
|
37
|
+
tag: () => tag,
|
|
38
|
+
text: () => text,
|
|
39
|
+
toPredicate: () => toPredicate,
|
|
40
|
+
type: () => type,
|
|
41
|
+
updated: () => updated
|
|
42
|
+
});
|
|
43
|
+
var FilterTypeId = "~@dxos/echo/Filter";
|
|
44
|
+
var FilterClass = class FilterClass {
|
|
45
|
+
ast;
|
|
46
|
+
static "variance" = {};
|
|
47
|
+
constructor(ast) {
|
|
48
|
+
this.ast = ast;
|
|
49
|
+
}
|
|
50
|
+
[FilterTypeId] = FilterClass.variance;
|
|
51
|
+
};
|
|
52
|
+
var is = (value) => {
|
|
53
|
+
return typeof value === "object" && value !== null && "~@dxos/echo/Filter" in value;
|
|
54
|
+
};
|
|
55
|
+
/** Construct a filter from an ast. */
|
|
56
|
+
var fromAst = (ast) => {
|
|
57
|
+
return new FilterClass(ast);
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Filter that matches all objects.
|
|
61
|
+
*/
|
|
62
|
+
var everything = () => {
|
|
63
|
+
return new FilterClass({
|
|
64
|
+
type: "object",
|
|
65
|
+
typename: null,
|
|
66
|
+
props: {}
|
|
67
|
+
});
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Filter that matches no objects.
|
|
71
|
+
*/
|
|
72
|
+
var nothing = () => {
|
|
73
|
+
return new FilterClass({
|
|
74
|
+
type: "not",
|
|
75
|
+
filter: {
|
|
76
|
+
type: "object",
|
|
77
|
+
typename: null,
|
|
78
|
+
props: {}
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
var id = (...ids) => {
|
|
83
|
+
assertArgument(ids.every((id) => EntityId.isValid(id)), "ids", "ids must be valid");
|
|
84
|
+
if (ids.length === 0) return nothing();
|
|
85
|
+
return new FilterClass({
|
|
86
|
+
type: "object",
|
|
87
|
+
typename: null,
|
|
88
|
+
id: ids,
|
|
89
|
+
props: {}
|
|
90
|
+
});
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Filter by type.
|
|
94
|
+
*
|
|
95
|
+
* Accepts a `Type.Type` entity (the value produced by `Type.makeObject` /
|
|
96
|
+
* `Type.makeRelation`), a `Schema.Union` of such entities (for filtering across a
|
|
97
|
+
* union of ECHO types), or a fully-qualified type URI — an `echo:` EID (stored schema)
|
|
98
|
+
* or a `dxn:` DXN (static schema). To filter by a bare typename, wrap it: `DXN.make(typename)`.
|
|
99
|
+
*/
|
|
100
|
+
var type = (input, props) => {
|
|
101
|
+
if (Schema.isSchema(input) && SchemaAST.isUnion(input.ast)) return new FilterClass({
|
|
102
|
+
type: "or",
|
|
103
|
+
filters: input.ast.types.map((t) => getTypeURIFromSpecifier(Schema.make(t))).map((typename) => ({
|
|
104
|
+
type: "object",
|
|
105
|
+
typename,
|
|
106
|
+
props: {}
|
|
107
|
+
}))
|
|
108
|
+
});
|
|
109
|
+
return new FilterClass({
|
|
110
|
+
type: "object",
|
|
111
|
+
typename: getTypeURIFromSpecifier(input),
|
|
112
|
+
...propsFilterToAst(props ?? {})
|
|
113
|
+
});
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* Filter by tag.
|
|
117
|
+
*/
|
|
118
|
+
var tag = (tag) => {
|
|
119
|
+
return new FilterClass({
|
|
120
|
+
type: "tag",
|
|
121
|
+
tag
|
|
122
|
+
});
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* Filter by registry key stored in object meta.
|
|
126
|
+
*
|
|
127
|
+
* @example
|
|
128
|
+
* ```ts
|
|
129
|
+
* Filter.key('org.example.type.foo');
|
|
130
|
+
* Filter.key('org.example.type.foo', { version: '^1.2.3' });
|
|
131
|
+
* ```
|
|
132
|
+
*/
|
|
133
|
+
var key = (key, options) => {
|
|
134
|
+
return new FilterClass({
|
|
135
|
+
type: "object",
|
|
136
|
+
typename: null,
|
|
137
|
+
props: {},
|
|
138
|
+
metaKey: key,
|
|
139
|
+
metaVersion: options?.version
|
|
140
|
+
});
|
|
141
|
+
};
|
|
142
|
+
/**
|
|
143
|
+
* Filter by properties.
|
|
144
|
+
*/
|
|
145
|
+
var props = (props) => {
|
|
146
|
+
return new FilterClass({
|
|
147
|
+
type: "object",
|
|
148
|
+
typename: null,
|
|
149
|
+
...propsFilterToAst(props)
|
|
150
|
+
});
|
|
151
|
+
};
|
|
152
|
+
/**
|
|
153
|
+
* Full-text or vector search.
|
|
154
|
+
*/
|
|
155
|
+
var text = (text, options) => {
|
|
156
|
+
return new FilterClass({
|
|
157
|
+
type: "text-search",
|
|
158
|
+
text,
|
|
159
|
+
searchKind: options?.type
|
|
160
|
+
});
|
|
161
|
+
};
|
|
162
|
+
/**
|
|
163
|
+
* Filter by foreign keys.
|
|
164
|
+
*/
|
|
165
|
+
var foreignKeys = (schema, keys) => {
|
|
166
|
+
return new FilterClass({
|
|
167
|
+
type: "object",
|
|
168
|
+
typename: getTypeURIFromSpecifier(schema),
|
|
169
|
+
props: {},
|
|
170
|
+
foreignKeys: keys
|
|
171
|
+
});
|
|
172
|
+
};
|
|
173
|
+
/**
|
|
174
|
+
* Predicate for property to be equal to the provided value.
|
|
175
|
+
*/
|
|
176
|
+
var eq = (value) => {
|
|
177
|
+
if (!isRef(value) && typeof value === "object" && value !== null) throw new TypeError("Cannot use object as a value for eq filter");
|
|
178
|
+
return new FilterClass({
|
|
179
|
+
type: "compare",
|
|
180
|
+
operator: "eq",
|
|
181
|
+
value: isRef(value) ? value.noInline().encode() : value
|
|
182
|
+
});
|
|
183
|
+
};
|
|
184
|
+
/**
|
|
185
|
+
* Predicate for property to be not equal to the provided value.
|
|
186
|
+
*/
|
|
187
|
+
var neq = (value) => {
|
|
188
|
+
return new FilterClass({
|
|
189
|
+
type: "compare",
|
|
190
|
+
operator: "neq",
|
|
191
|
+
value
|
|
192
|
+
});
|
|
193
|
+
};
|
|
194
|
+
/**
|
|
195
|
+
* Predicate for property to be greater than the provided value.
|
|
196
|
+
*/
|
|
197
|
+
var gt = (value) => {
|
|
198
|
+
return new FilterClass({
|
|
199
|
+
type: "compare",
|
|
200
|
+
operator: "gt",
|
|
201
|
+
value
|
|
202
|
+
});
|
|
203
|
+
};
|
|
204
|
+
/**
|
|
205
|
+
* Predicate for property to be greater than or equal to the provided value.
|
|
206
|
+
*/
|
|
207
|
+
var gte = (value) => {
|
|
208
|
+
return new FilterClass({
|
|
209
|
+
type: "compare",
|
|
210
|
+
operator: "gte",
|
|
211
|
+
value
|
|
212
|
+
});
|
|
213
|
+
};
|
|
214
|
+
/**
|
|
215
|
+
* Predicate for property to be less than the provided value.
|
|
216
|
+
*/
|
|
217
|
+
var lt = (value) => {
|
|
218
|
+
return new FilterClass({
|
|
219
|
+
type: "compare",
|
|
220
|
+
operator: "lt",
|
|
221
|
+
value
|
|
222
|
+
});
|
|
223
|
+
};
|
|
224
|
+
/**
|
|
225
|
+
* Predicate for property to be less than or equal to the provided value.
|
|
226
|
+
*/
|
|
227
|
+
var lte = (value) => {
|
|
228
|
+
return new FilterClass({
|
|
229
|
+
type: "compare",
|
|
230
|
+
operator: "lte",
|
|
231
|
+
value
|
|
232
|
+
});
|
|
233
|
+
};
|
|
234
|
+
/**
|
|
235
|
+
* Predicate for property to be in the provided array, or in the set of values projected
|
|
236
|
+
* from a subquery's results (an uncorrelated `col IN (SELECT property FROM ...)` semi-join —
|
|
237
|
+
* see `Query.project`). The subquery may target a different scope than the parent query; it
|
|
238
|
+
* is resolved once at execution time.
|
|
239
|
+
* @param values - Values to check against, or a single subquery projection.
|
|
240
|
+
*/
|
|
241
|
+
var in$ = (...args) => {
|
|
242
|
+
if (args.length === 1 && isProjection(args[0])) {
|
|
243
|
+
const projection = args[0];
|
|
244
|
+
return new FilterClass({
|
|
245
|
+
type: "in-query",
|
|
246
|
+
subquery: projection.query,
|
|
247
|
+
property: projection.property
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
return new FilterClass({
|
|
251
|
+
type: "in",
|
|
252
|
+
values: args
|
|
253
|
+
});
|
|
254
|
+
};
|
|
255
|
+
/**
|
|
256
|
+
* Predicate for an array property to contain the provided value.
|
|
257
|
+
* @param value - Value to check against.
|
|
258
|
+
*/
|
|
259
|
+
var contains = (value) => {
|
|
260
|
+
return new FilterClass({
|
|
261
|
+
type: "contains",
|
|
262
|
+
value
|
|
263
|
+
});
|
|
264
|
+
};
|
|
265
|
+
/**
|
|
266
|
+
* Predicate for property to be in the provided range.
|
|
267
|
+
* @param from - Start of the range (inclusive).
|
|
268
|
+
* @param to - End of the range (exclusive).
|
|
269
|
+
*/
|
|
270
|
+
var between = (from, to) => {
|
|
271
|
+
return new FilterClass({
|
|
272
|
+
type: "range",
|
|
273
|
+
from,
|
|
274
|
+
to
|
|
275
|
+
});
|
|
276
|
+
};
|
|
277
|
+
var _toUnixMs = (date) => typeof date === "number" ? date : date.getTime();
|
|
278
|
+
var _timeRangeFilter = (field, range) => {
|
|
279
|
+
const filters = [];
|
|
280
|
+
if (range.after != null) filters.push(new FilterClass({
|
|
281
|
+
type: "timestamp",
|
|
282
|
+
field,
|
|
283
|
+
operator: "gte",
|
|
284
|
+
value: _toUnixMs(range.after)
|
|
285
|
+
}));
|
|
286
|
+
if (range.before != null) filters.push(new FilterClass({
|
|
287
|
+
type: "timestamp",
|
|
288
|
+
field,
|
|
289
|
+
operator: "lte",
|
|
290
|
+
value: _toUnixMs(range.before)
|
|
291
|
+
}));
|
|
292
|
+
if (filters.length === 0) return everything();
|
|
293
|
+
return filters.length === 1 ? filters[0] : and(...filters);
|
|
294
|
+
};
|
|
295
|
+
/**
|
|
296
|
+
* Filter objects by updatedAt timestamp.
|
|
297
|
+
*/
|
|
298
|
+
var updated = (range) => _timeRangeFilter("updatedAt", range);
|
|
299
|
+
/**
|
|
300
|
+
* Filter objects by createdAt timestamp.
|
|
301
|
+
*/
|
|
302
|
+
var created = (range) => _timeRangeFilter("createdAt", range);
|
|
303
|
+
/**
|
|
304
|
+
* Filter objects that are children of the specified parent(s).
|
|
305
|
+
* Accepts ECHO objects, Refs, or arrays of either.
|
|
306
|
+
* Refs are resolved to DXNs without loading; objects use {@link Obj.getURI}.
|
|
307
|
+
* With transitive=true (default), also matches grandchildren and beyond.
|
|
308
|
+
*/
|
|
309
|
+
var childOf = (parents, options) => {
|
|
310
|
+
return new FilterClass({
|
|
311
|
+
type: "child-of",
|
|
312
|
+
parents: (Array.isArray(parents) ? parents : [parents]).map((item) => {
|
|
313
|
+
if (isRef(item)) return EID.parse(item.uri);
|
|
314
|
+
return EID.parse(getUri(item));
|
|
315
|
+
}),
|
|
316
|
+
transitive: options?.transitive ?? true
|
|
317
|
+
});
|
|
318
|
+
};
|
|
319
|
+
/**
|
|
320
|
+
* Negate the filter.
|
|
321
|
+
*/
|
|
322
|
+
var not = (filter) => {
|
|
323
|
+
return new FilterClass({
|
|
324
|
+
type: "not",
|
|
325
|
+
filter: filter.ast
|
|
326
|
+
});
|
|
327
|
+
};
|
|
328
|
+
/**
|
|
329
|
+
* Combine filters with a logical AND.
|
|
330
|
+
*/
|
|
331
|
+
var and = (...filters) => {
|
|
332
|
+
return new FilterClass({
|
|
333
|
+
type: "and",
|
|
334
|
+
filters: filters.map((f) => f.ast)
|
|
335
|
+
});
|
|
336
|
+
};
|
|
337
|
+
/**
|
|
338
|
+
* Combine filters with a logical OR.
|
|
339
|
+
*/
|
|
340
|
+
var or = (...filters) => {
|
|
341
|
+
return new FilterClass({
|
|
342
|
+
type: "or",
|
|
343
|
+
filters: filters.map((f) => f.ast)
|
|
344
|
+
});
|
|
345
|
+
};
|
|
346
|
+
var propsFilterToAst = (predicates) => {
|
|
347
|
+
let idFilter;
|
|
348
|
+
if ("id" in predicates) {
|
|
349
|
+
assertArgument(typeof predicates.id === "string" || Array.isArray(predicates.id), "predicates.id", "invalid id filter");
|
|
350
|
+
idFilter = typeof predicates.id === "string" ? [predicates.id] : predicates.id;
|
|
351
|
+
Schema.Array(EntityId).pipe(Schema.validateSync)(idFilter);
|
|
352
|
+
}
|
|
353
|
+
return {
|
|
354
|
+
id: idFilter,
|
|
355
|
+
props: Object.fromEntries(Object.entries(predicates).filter(([prop, _value]) => prop !== "id").map(([prop, predicate]) => [prop, processPredicate(predicate)]))
|
|
356
|
+
};
|
|
357
|
+
};
|
|
358
|
+
var processPredicate = (predicate) => {
|
|
359
|
+
return Match.value(predicate).pipe(Match.withReturnType(), Match.when(is, (predicate) => predicate.ast), Match.when(Array.isArray, (_predicate) => {
|
|
360
|
+
throw new Error("Array predicates are not yet supported.");
|
|
361
|
+
}), Match.when((predicate) => !isRef(predicate) && typeof predicate === "object" && predicate !== null, (predicate) => {
|
|
362
|
+
return {
|
|
363
|
+
type: "object",
|
|
364
|
+
typename: null,
|
|
365
|
+
props: Object.fromEntries(Object.entries(predicate).map(([key, value]) => [key, processPredicate(value)]))
|
|
366
|
+
};
|
|
367
|
+
}), Match.orElse((value) => eq(value).ast));
|
|
368
|
+
};
|
|
369
|
+
/**
|
|
370
|
+
* Returns a human-readable string representation of a Filter AST.
|
|
371
|
+
*/
|
|
372
|
+
var pretty = (filter) => prettyFilter(filter.ast);
|
|
373
|
+
/**
|
|
374
|
+
* Create a predicate from a filter.
|
|
375
|
+
*/
|
|
376
|
+
var toPredicate = Function.dual(2, (entity, filter) => filterMatchEntity(filter.ast, entity));
|
|
377
|
+
//#endregion
|
|
378
|
+
export { FilterTypeId, and, between, childOf, contains, created, eq, everything, foreignKeys, fromAst, gt, gte, id, in$ as in, is, key, lt, lte, neq, not, nothing, or, pretty, props, Filter_exports as t, tag, text, toPredicate, type, updated };
|
|
379
|
+
|
|
380
|
+
//# sourceMappingURL=Filter.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Filter.mjs","names":[],"sources":["../../src/Filter.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Function from 'effect/Function';\nimport * as Match from 'effect/Match';\nimport * as Schema from 'effect/Schema';\nimport * as SchemaAST from 'effect/SchemaAST';\nimport type * as Types from 'effect/Types';\n\nimport { type ForeignKey, type QueryAST } from '@dxos/echo-protocol';\nimport { assertArgument } from '@dxos/invariant';\nimport { EID, EntityId, type URI } from '@dxos/keys';\n\nimport type * as Entity from './Entity';\nimport * as internal from './internal';\nimport type * as Obj from './Obj';\nimport * as Ref from './Ref';\n// eslint-disable-next-line @dxos/rules/import-as-namespace\nimport type * as Type$ from './Type';\n\nexport const FilterTypeId = '~@dxos/echo/Filter' as const;\nexport type FilterTypeId = typeof FilterTypeId;\n\nexport interface Filter<T> {\n // TODO(dmaretskyi): See new effect-schema approach to variance.\n readonly [FilterTypeId]: { value: Types.Covariant<T> };\n\n ast: QueryAST.Filter;\n}\n\nexport type Props<T> = {\n // Predicate or a value as a shorthand for `eq`.\n [K in keyof T & string]?: Filter<T[K]> | T[K];\n};\n\nexport type Any = Filter<any>;\n\nexport type Type<F extends Any> = F extends Filter<infer T> ? T : never;\n\nclass FilterClass implements Any {\n private static 'variance': Any[FilterTypeId] = {} as Any[FilterTypeId];\n\n constructor(public readonly ast: QueryAST.Filter) {}\n\n [FilterTypeId] = FilterClass.variance;\n}\n\nexport const is = (value: unknown): value is Any => {\n return typeof value === 'object' && value !== null && FilterTypeId in value;\n};\n\n/** Construct a filter from an ast. */\nexport const fromAst = (ast: QueryAST.Filter): Any => {\n return new FilterClass(ast);\n};\n\n/**\n * Filter that matches all objects.\n */\n// TODO(dmaretskyi): `Entity.Any` would be more type-safe, but causes annoying errors in existing code\nexport const everything = (): FilterClass => {\n return new FilterClass({\n type: 'object',\n typename: null,\n props: {},\n });\n};\n\n/**\n * Filter that matches no objects.\n */\nexport const nothing = (): FilterClass => {\n return new FilterClass({\n type: 'not',\n filter: {\n type: 'object',\n typename: null,\n props: {},\n },\n });\n};\n\n/*\n * Filter by EntityId.\n */\nexport const id = (...ids: EntityId[]): Any => {\n assertArgument(\n ids.every((id) => EntityId.isValid(id)),\n 'ids',\n 'ids must be valid',\n );\n\n if (ids.length === 0) {\n return nothing();\n }\n\n return new FilterClass({\n type: 'object',\n typename: null,\n id: ids,\n props: {},\n });\n};\n\n/**\n * Filter by type.\n *\n * Accepts a `Type.Type` entity (the value produced by `Type.makeObject` /\n * `Type.makeRelation`), a `Schema.Union` of such entities (for filtering across a\n * union of ECHO types), or a fully-qualified type URI — an `echo:` EID (stored schema)\n * or a `dxn:` DXN (static schema). To filter by a bare typename, wrap it: `DXN.make(typename)`.\n */\nexport const type: {\n <T extends Type$.AnyEntity>(type: T, props?: Props<Type$.InstanceType<T>>): Filter<Type$.InstanceType<T>>;\n // Schema-side overload restricted to the well-known unknown schemas and to\n // `Schema.Union(...)` of `Type.Type` entities (for filtering across a union\n // of ECHO types). Other raw schemas are rejected.\n <S extends internal.UnknownTypeSchema<any, any>>(\n schema: S,\n props?: Props<Schema.Schema.Type<S>>,\n ): Filter<Schema.Schema.Type<S>>;\n <S extends Schema.Union<readonly Schema.Schema.AnyNoContext[]>>(\n union: S,\n props?: Props<Schema.Schema.Type<S>>,\n ): Filter<Schema.Schema.Type<S>>;\n (uri: URI.URI, props?: Props<unknown>): Filter<any>;\n // Passthrough overload for callers that hold a `Type.AnyEntity | URI.URI` union\n // (e.g. Query.type / Query.sourceOf / Query.targetOf impls). Listed last so the\n // typed overloads above still win for monomorphic inputs.\n (input: Type$.AnyEntity | URI.URI, props?: Props<unknown>): Filter<unknown>;\n} = (input: Type$.AnyEntity | Schema.Schema.AnyNoContext | URI.URI, props?: Props<unknown>): any => {\n if (Schema.isSchema(input) && SchemaAST.isUnion(input.ast)) {\n const typenames = input.ast.types.map((t) => internal.getTypeURIFromSpecifier(Schema.make(t)));\n return new FilterClass({\n type: 'or',\n filters: typenames.map((typename) => ({\n type: 'object',\n typename,\n props: {},\n })),\n });\n }\n\n const uri = internal.getTypeURIFromSpecifier(input);\n return new FilterClass({\n type: 'object',\n typename: uri,\n ...propsFilterToAst(props ?? {}),\n });\n};\n\n/**\n * Filter by tag.\n */\nexport const tag = (tag: string): Any => {\n return new FilterClass({\n type: 'tag',\n tag,\n });\n};\n\n/**\n * Options for {@link key} filter.\n */\nexport type KeyFilterOptions = {\n /**\n * Optional semver range expression (e.g. `^1.2.3`, `~2.0.0`, `>=1.0.0 <2.0.0`).\n * Matches the object's meta `version` field against the range.\n * If omitted, matches any version (including objects with no version).\n */\n version?: string;\n};\n\n/**\n * Filter by registry key stored in object meta.\n *\n * @example\n * ```ts\n * Filter.key('org.example.type.foo');\n * Filter.key('org.example.type.foo', { version: '^1.2.3' });\n * ```\n */\nexport const key = (key: string, options?: KeyFilterOptions): Any => {\n return new FilterClass({\n type: 'object',\n typename: null,\n props: {},\n metaKey: key,\n metaVersion: options?.version,\n });\n};\n\n/**\n * Filter by properties.\n */\nexport const props = <T>(props: Props<T>): Filter<T> => {\n return new FilterClass({\n type: 'object',\n typename: null,\n ...propsFilterToAst(props),\n });\n};\n\nexport type TextSearchOptions = {\n // TODO(dmaretskyi): Hybrid search.\n type?: 'full-text' | 'vector';\n};\n\n/**\n * Full-text or vector search.\n */\nexport const text = (\n // TODO(dmaretskyi): Consider passing a vector here, but really the embedding should be done on the query-executor side.\n text: string,\n options?: TextSearchOptions,\n): Any => {\n return new FilterClass({\n type: 'text-search',\n text,\n searchKind: options?.type,\n });\n};\n\n/**\n * Filter by foreign keys.\n */\nexport const foreignKeys = <S extends Type$.AnyEntity | URI.URI>(\n schema: S,\n keys: ForeignKey[],\n): Filter<S extends Type$.AnyEntity ? Type$.InstanceType<S> : unknown> => {\n const uri = internal.getTypeURIFromSpecifier(schema);\n return new FilterClass({\n type: 'object',\n typename: uri,\n props: {},\n foreignKeys: keys,\n });\n};\n\n/**\n * Predicate for property to be equal to the provided value.\n */\nexport const eq = <T>(value: T): Filter<T | undefined> => {\n if (!Ref.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: Ref.isRef(value) ? value.noInline().encode() : value,\n });\n};\n\n/**\n * Predicate for property to be not equal to the provided value.\n */\nexport const neq = <T>(value: T): Filter<T | undefined> => {\n return new FilterClass({\n type: 'compare',\n operator: 'neq',\n value,\n });\n};\n\n/**\n * Predicate for property to be greater than the provided value.\n */\nexport const gt = <T>(value: T): Filter<T | undefined> => {\n return new FilterClass({\n type: 'compare',\n operator: 'gt',\n value,\n });\n};\n\n/**\n * Predicate for property to be greater than or equal to the provided value.\n */\nexport const gte = <T>(value: T): Filter<T | undefined> => {\n return new FilterClass({\n type: 'compare',\n operator: 'gte',\n value,\n });\n};\n\n/**\n * Predicate for property to be less than the provided value.\n */\nexport const lt = <T>(value: T): Filter<T | undefined> => {\n return new FilterClass({\n type: 'compare',\n operator: 'lt',\n value,\n });\n};\n\n/**\n * Predicate for property to be less than or equal to the provided value.\n */\nexport const lte = <T>(value: T): Filter<T | undefined> => {\n return new FilterClass({\n type: 'compare',\n operator: 'lte',\n value,\n });\n};\n\n/**\n * Predicate for property to be in the provided array, or in the set of values projected\n * from a subquery's results (an uncorrelated `col IN (SELECT property FROM ...)` semi-join —\n * see `Query.project`). The subquery may target a different scope than the parent query; it\n * is resolved once at execution time.\n * @param values - Values to check against, or a single subquery projection.\n */\nconst in$: {\n <T>(projection: internal.Projection<T>): Filter<T>;\n <T>(...values: T[]): Filter<T>;\n} = <T>(...args: [internal.Projection<T>] | T[]): Filter<T> => {\n if (args.length === 1 && internal.isProjection(args[0])) {\n const projection = args[0];\n return new FilterClass({\n type: 'in-query',\n subquery: projection.query,\n property: projection.property,\n });\n }\n return new FilterClass({\n type: 'in',\n values: args,\n });\n};\nexport { in$ as in };\n\n/**\n * Predicate for an array property to contain the provided value.\n * @param value - Value to check against.\n */\nexport const contains = <T>(value: T): Filter<readonly T[] | undefined> => {\n return new FilterClass({\n type: 'contains',\n value,\n });\n};\n\n/**\n * Predicate for property to be in the provided range.\n * @param from - Start of the range (inclusive).\n * @param to - End of the range (exclusive).\n */\nexport const between = <T>(from: T, to: T): Filter<T> => {\n return new FilterClass({\n type: 'range',\n from,\n to,\n });\n};\n\ntype TimeRange = { after?: Date | number; before?: Date | number };\n\nconst _toUnixMs = (date: Date | number): number => (typeof date === 'number' ? date : date.getTime());\n\nconst _timeRangeFilter = (field: 'updatedAt' | 'createdAt', range: TimeRange): Any => {\n const filters: Any[] = [];\n if (range.after != null) {\n filters.push(new FilterClass({ type: 'timestamp', field, operator: 'gte', value: _toUnixMs(range.after) }));\n }\n if (range.before != null) {\n filters.push(new FilterClass({ type: 'timestamp', field, operator: 'lte', value: _toUnixMs(range.before) }));\n }\n if (filters.length === 0) {\n return everything();\n }\n return filters.length === 1 ? filters[0] : and(...filters);\n};\n\n/**\n * Filter objects by updatedAt timestamp.\n */\nexport const updated = (range: TimeRange): Any => _timeRangeFilter('updatedAt', range);\n\n/**\n * Filter objects by createdAt timestamp.\n */\nexport const created = (range: TimeRange): Any => _timeRangeFilter('createdAt', range);\n\nexport type ChildOfOptions = {\n /** Whether to match transitively (grandchildren, etc.). Defaults to true. */\n transitive?: boolean;\n};\n\n/**\n * Filter objects that are children of the specified parent(s).\n * Accepts ECHO objects, Refs, or arrays of either.\n * Refs are resolved to DXNs without loading; objects use {@link Obj.getURI}.\n * With transitive=true (default), also matches grandchildren and beyond.\n */\nexport const childOf = (\n parents: Obj.Unknown | Ref.Unknown | readonly (Obj.Unknown | Ref.Unknown)[],\n options?: ChildOfOptions,\n): Any => {\n const items = Array.isArray(parents) ? parents : [parents];\n const dxns = items.map((item) => {\n if (Ref.isRef(item)) {\n return EID.parse(item.uri);\n }\n return EID.parse(internal.getUri(item));\n });\n return new FilterClass({\n type: 'child-of',\n parents: dxns,\n transitive: options?.transitive ?? true,\n });\n};\n\n/**\n * Negate the filter.\n */\nexport const not = <F extends Any>(filter: F): Filter<Type<F>> => {\n return new FilterClass({\n type: 'not',\n filter: filter.ast,\n });\n};\n\n/**\n * Combine filters with a logical AND.\n */\nexport const and = <Filters extends readonly Any[]>(...filters: Filters): Filter<Type<Filters[number]>> => {\n return new FilterClass({\n type: 'and',\n filters: filters.map((f) => f.ast),\n });\n};\n\n/**\n * Combine filters with a logical OR.\n */\nexport const or = <Filters extends readonly Any[]>(...filters: Filters): Filter<Type<Filters[number]>> => {\n return new FilterClass({\n type: 'or',\n filters: filters.map((f) => f.ast),\n });\n};\n\n// TODO(dmaretskyi): Add `Filter.match` to support pattern matching on string props.\n\nconst propsFilterToAst = (predicates: Props<any>): Pick<QueryAST.FilterObject, 'id' | 'props'> => {\n let idFilter: readonly EntityId[] | 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 Schema.Array(EntityId).pipe(Schema.validateSync)(idFilter);\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 return Match.value(predicate).pipe(\n Match.withReturnType<QueryAST.Filter>(),\n Match.when(is, (predicate) => predicate.ast),\n // TODO(wittjosiah): Add support for array predicates.\n Match.when(Array.isArray, (_predicate) => {\n throw new Error('Array predicates are not yet supported.');\n }),\n Match.when(\n (predicate: any) => !Ref.isRef(predicate) && typeof predicate === 'object' && predicate !== null,\n (predicate) => {\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 Match.orElse((value) => eq(value).ast),\n );\n};\n\n/**\n * Returns a human-readable string representation of a Filter AST.\n */\nexport const pretty = (filter: Any): string => internal.prettyFilter(filter.ast);\n\n/**\n * Create a predicate from a filter.\n */\nexport const toPredicate: {\n <T extends Entity.Unknown>(filter: Filter<T>): (entity: Entity.Unknown) => entity is T;\n <T extends Entity.Unknown>(entity: Entity.Unknown, filter: Filter<T>): entity is T;\n} = Function.dual<\n <T extends Entity.Unknown>(filter: Filter<T>) => (entity: Entity.Unknown) => entity is T,\n <T extends Entity.Unknown>(entity: Entity.Unknown, filter: Filter<T>) => entity is T\n>(2, <T extends Entity.Unknown>(entity: Entity.Unknown, filter: Filter<T>): entity is T =>\n internal.filterMatchEntity(filter.ast, entity),\n);\n"],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { t as __exportAll } from "./chunk-rolldown-runtime.mjs";
|
|
2
|
+
import { _ as getOptionsAnnotation, c as FormatAnnotationId, d as OptionsAnnotationId, f as PropertyKind, g as getFormatAnnotation, h as formatToType, l as FormatEnums, m as TypeFormat, n as CurrencyAnnotationId, p as TypeEnum, r as DecimalPrecision, s as FormatAnnotation, t as Currency, u as OptionsAnnotation, v as getTypeEnum, y as typeToFormat } from "./chunk-number.mjs";
|
|
3
|
+
import { _ as SimpleTime, a as Hostname, b as toSimpleDateTime, c as URL, d as GeoPoint, f as DateOnly, g as SimpleDateTime, h as SimpleDate, i as Formula, l as UUID, m as Duration, n as Format, o as Regex, p as DateTime, r as Email, s as Text, t as SelectOption, u as GeoLocation, v as TimeOnly, x as toSimpleTime, y as toSimpleDate } from "./chunk-select.mjs";
|
|
4
|
+
//#region src/Format.ts
|
|
5
|
+
var Format_exports = /* @__PURE__ */ __exportAll({
|
|
6
|
+
Currency: () => Currency,
|
|
7
|
+
CurrencyAnnotationId: () => CurrencyAnnotationId,
|
|
8
|
+
DateOnly: () => DateOnly,
|
|
9
|
+
DateTime: () => DateTime,
|
|
10
|
+
DecimalPrecision: () => DecimalPrecision,
|
|
11
|
+
Duration: () => Duration,
|
|
12
|
+
Email: () => Email,
|
|
13
|
+
Format: () => Format,
|
|
14
|
+
FormatAnnotation: () => FormatAnnotation,
|
|
15
|
+
FormatAnnotationId: () => FormatAnnotationId,
|
|
16
|
+
FormatEnums: () => FormatEnums,
|
|
17
|
+
Formula: () => Formula,
|
|
18
|
+
GeoLocation: () => GeoLocation,
|
|
19
|
+
GeoPoint: () => GeoPoint,
|
|
20
|
+
Hostname: () => Hostname,
|
|
21
|
+
OptionsAnnotation: () => OptionsAnnotation,
|
|
22
|
+
OptionsAnnotationId: () => OptionsAnnotationId,
|
|
23
|
+
PropertyKind: () => PropertyKind,
|
|
24
|
+
Regex: () => Regex,
|
|
25
|
+
SelectOption: () => SelectOption,
|
|
26
|
+
SimpleDate: () => SimpleDate,
|
|
27
|
+
SimpleDateTime: () => SimpleDateTime,
|
|
28
|
+
SimpleTime: () => SimpleTime,
|
|
29
|
+
Text: () => Text,
|
|
30
|
+
TimeOnly: () => TimeOnly,
|
|
31
|
+
TypeEnum: () => TypeEnum,
|
|
32
|
+
TypeFormat: () => TypeFormat,
|
|
33
|
+
URL: () => URL,
|
|
34
|
+
UUID: () => UUID,
|
|
35
|
+
formatToType: () => formatToType,
|
|
36
|
+
getFormatAnnotation: () => getFormatAnnotation,
|
|
37
|
+
getOptionsAnnotation: () => getOptionsAnnotation,
|
|
38
|
+
getTypeEnum: () => getTypeEnum,
|
|
39
|
+
toSimpleDate: () => toSimpleDate,
|
|
40
|
+
toSimpleDateTime: () => toSimpleDateTime,
|
|
41
|
+
toSimpleTime: () => toSimpleTime,
|
|
42
|
+
typeToFormat: () => typeToFormat
|
|
43
|
+
});
|
|
44
|
+
//#endregion
|
|
45
|
+
export { Currency, CurrencyAnnotationId, DateOnly, DateTime, DecimalPrecision, Duration, Email, Format, FormatAnnotation, FormatAnnotationId, FormatEnums, Formula, GeoLocation, GeoPoint, Hostname, OptionsAnnotation, OptionsAnnotationId, PropertyKind, Regex, SelectOption, SimpleDate, SimpleDateTime, SimpleTime, Text, TimeOnly, TypeEnum, TypeFormat, URL, UUID, formatToType, getFormatAnnotation, getOptionsAnnotation, getTypeEnum, Format_exports as t, toSimpleDate, toSimpleDateTime, toSimpleTime, typeToFormat };
|
|
46
|
+
|
|
47
|
+
//# sourceMappingURL=Format.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Format.mjs","names":[],"sources":["../../src/Format.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nexport * from './internal/Format';\n"],"mappings":""}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { t as __exportAll } from "./chunk-rolldown-runtime.mjs";
|
|
2
|
+
import { l as JsonSchemaType, n as toEffectSchema$1, r as toJsonSchema$1 } from "./chunk-json-schema.mjs";
|
|
3
|
+
//#region src/JsonSchema.ts
|
|
4
|
+
var JsonSchema_exports = /* @__PURE__ */ __exportAll({
|
|
5
|
+
JsonSchema: () => JsonSchema,
|
|
6
|
+
toEffectSchema: () => toEffectSchema,
|
|
7
|
+
toJsonSchema: () => toJsonSchema
|
|
8
|
+
});
|
|
9
|
+
/**
|
|
10
|
+
* Decode JSON Schema to Effect Schema.
|
|
11
|
+
*/
|
|
12
|
+
var toEffectSchema = toEffectSchema$1;
|
|
13
|
+
/**
|
|
14
|
+
* Encode Effect Schema to JSON Schema.
|
|
15
|
+
*/
|
|
16
|
+
var toJsonSchema = toJsonSchema$1;
|
|
17
|
+
var JsonSchema = JsonSchemaType;
|
|
18
|
+
//#endregion
|
|
19
|
+
export { JsonSchema, JsonSchema_exports as t, toEffectSchema, toJsonSchema };
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=JsonSchema.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JsonSchema.mjs","names":[],"sources":["../../src/JsonSchema.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport type * as Schema from 'effect/Schema';\n\nimport * as jsonSchemaInternal from './internal/JsonSchema';\n\n/**\n * Decode JSON Schema to Effect Schema.\n */\nexport const toEffectSchema = jsonSchemaInternal.toEffectSchema;\n\n/**\n * Encode Effect Schema to JSON Schema.\n */\nexport const toJsonSchema = jsonSchemaInternal.toJsonSchema;\n\n/**\n * Serializable JsonSchema type definition.\n */\nexport type JsonSchema = jsonSchemaInternal.JsonSchemaType;\n\nexport const JsonSchema: Schema.Schema<jsonSchemaInternal.JsonSchemaType> = jsonSchemaInternal.JsonSchemaType;\n"],"mappings":";;;;;;;;;;;AAaA,IAAa,iBAAiB;;;;AAK9B,IAAa,eAAe;AAO5B,IAAa,aAA+D"}
|
package/dist/lib/Key.mjs
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { t as __exportAll } from "./chunk-rolldown-runtime.mjs";
|
|
2
|
+
import { ForeignKey } from "@dxos/echo-protocol";
|
|
3
|
+
import { EID, EntityId, SpaceId, URI } from "@dxos/keys";
|
|
4
|
+
//#region src/Key.ts
|
|
5
|
+
var Key_exports = /* @__PURE__ */ __exportAll({
|
|
6
|
+
EID: () => EID,
|
|
7
|
+
EntityId: () => EntityId,
|
|
8
|
+
ForeignKey: () => ForeignKey,
|
|
9
|
+
SpaceId: () => SpaceId,
|
|
10
|
+
URI: () => URI
|
|
11
|
+
});
|
|
12
|
+
//#endregion
|
|
13
|
+
export { EID, EntityId, ForeignKey, SpaceId, URI, Key_exports as t };
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=Key.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Key.mjs","names":[],"sources":["../../src/Key.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\n// TODO(wittjosiah): Should this be a subset of Type?\n\nexport { ForeignKey } from '@dxos/echo-protocol';\nexport { EID, EntityId, SpaceId, URI } from '@dxos/keys';\n"],"mappings":""}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { t as __exportAll } from "./chunk-rolldown-runtime.mjs";
|
|
2
|
+
import { vt as getSchemaURI } from "./chunk-Database.mjs";
|
|
3
|
+
import { getSchema } from "./Type.mjs";
|
|
4
|
+
//#region src/Migration.ts
|
|
5
|
+
var Migration_exports = /* @__PURE__ */ __exportAll({ define: () => define });
|
|
6
|
+
/**
|
|
7
|
+
* Define a migration between two object schemas.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* const migration = Migration.define({
|
|
12
|
+
* from: ContactV1,
|
|
13
|
+
* to: ContactV2,
|
|
14
|
+
* transform: async (from) => ({ name: `${from.firstName} ${from.lastName}` }),
|
|
15
|
+
* onMigration: async () => {},
|
|
16
|
+
* });
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
var define = (options) => {
|
|
20
|
+
const fromSchema = getSchema(options.from);
|
|
21
|
+
const toSchema = getSchema(options.to);
|
|
22
|
+
const fromType = getSchemaURI(fromSchema);
|
|
23
|
+
if (!fromType) throw new Error("Invalid from schema");
|
|
24
|
+
const toType = getSchemaURI(toSchema);
|
|
25
|
+
if (!toType) throw new Error("Invalid to schema");
|
|
26
|
+
return {
|
|
27
|
+
fromType,
|
|
28
|
+
toType,
|
|
29
|
+
fromSchema,
|
|
30
|
+
toSchema,
|
|
31
|
+
transform: options.transform,
|
|
32
|
+
onMigration: options.onMigration
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
//#endregion
|
|
36
|
+
export { define, Migration_exports as t };
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=Migration.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Migration.mjs","names":[],"sources":["../../src/Migration.ts"],"sourcesContent":["//\n// Copyright 2024 DXOS.org\n//\n\n// @import-as-namespace\n\nimport type * as Schema from 'effect/Schema';\n\nimport { type URI } from '@dxos/keys';\n\nimport type * as Database from './Database';\nimport type * as Entity from './Entity';\nimport { type EntityMeta, MetaId, getSchemaURI } from './internal';\nimport * as Type from './Type';\n\n/**\n * Result returned by a migration's `transform` callback.\n * The data shape matches the target schema; the optional `[Obj.Meta]` symbol key lets the\n * transform update the object's meta (e.g. `key` / `version`) atomically with the data swap.\n */\ntype MigrationSchemaInput = Type.AnyEntity;\n\ntype MigrationInstanceType<S> = S extends Type.AnyEntity\n ? Type.InstanceType<S>\n : S extends Schema.Schema.AnyNoContext\n ? Schema.Schema.Type<S>\n : never;\n\nexport type TransformResult<To> = Omit<MigrationInstanceType<To>, 'id' | Entity.KindId> & {\n [MetaId]?: Partial<EntityMeta>;\n};\n\ntype DefineObjectMigrationOptions<From extends MigrationSchemaInput, To extends MigrationSchemaInput> = {\n from: From;\n to: To;\n /**\n * Pure function that converts the old object data to the new object data.\n *\n * The returned object may include an optional `[Obj.Meta]` entry to update the object's meta\n * (e.g. registry `key` / `version`) atomically with the data swap.\n */\n // TODO(dmaretskyi): `id` should not be a part of the schema.\n transform: (from: MigrationInstanceType<From>, context: ObjectMigrationContext) => Promise<TransformResult<To>>;\n\n /**\n * Callback that is called after the object is migrated. Called for every object that is migrated.\n *\n * NOTE: Database mutations performed in this callback are not guaranteed to be idempotent.\n * If multiple peers run the migration separately, the effects may be applied multiple times.\n */\n onMigration?: (params: OnMigrateProps<From, To>) => Promise<void>;\n};\n\n/**\n * Context passed to object migration callbacks.\n */\nexport type ObjectMigrationContext = {\n db: Database.Database;\n};\n\ntype OnMigrateProps<From, To> = {\n before: MigrationInstanceType<From>;\n object: MigrationInstanceType<To>;\n db: Database.Database;\n};\n\n/**\n * Definition of a migration from one object schema version to another.\n */\nexport type ObjectMigration = {\n fromType: URI.URI;\n toType: URI.URI;\n fromSchema: Schema.Schema.AnyNoContext;\n toSchema: Schema.Schema.AnyNoContext;\n transform: (from: unknown, context: ObjectMigrationContext) => Promise<unknown>;\n onMigration?: (params: OnMigrateProps<any, any>) => Promise<void>;\n};\n\n/**\n * Define a migration between two object schemas.\n *\n * @example\n * ```ts\n * const migration = Migration.define({\n * from: ContactV1,\n * to: ContactV2,\n * transform: async (from) => ({ name: `${from.firstName} ${from.lastName}` }),\n * onMigration: async () => {},\n * });\n * ```\n */\nexport const define = <From extends MigrationSchemaInput, To extends MigrationSchemaInput>(\n options: DefineObjectMigrationOptions<From, To>,\n): ObjectMigration => {\n const fromSchema = Type.getSchema(options.from);\n const toSchema = Type.getSchema(options.to);\n const fromType = getSchemaURI(fromSchema);\n if (!fromType) {\n throw new Error('Invalid from schema');\n }\n const toType = getSchemaURI(toSchema);\n if (!toType) {\n throw new Error('Invalid to schema');\n }\n\n return {\n fromType,\n toType,\n fromSchema,\n toSchema,\n transform: options.transform as any,\n onMigration: options.onMigration as any,\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AA2FA,IAAa,UACX,YACoB;CACpB,MAAM,aAAa,UAAe,QAAQ,IAAI;CAC9C,MAAM,WAAW,UAAe,QAAQ,EAAE;CAC1C,MAAM,WAAW,aAAa,UAAU;CACxC,IAAI,CAAC,UACH,MAAM,IAAI,MAAM,qBAAqB;CAEvC,MAAM,SAAS,aAAa,QAAQ;CACpC,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,mBAAmB;CAGrC,OAAO;EACL;EACA;EACA;EACA;EACA,WAAW,QAAQ;EACnB,aAAa,QAAQ;CACvB;AACF"}
|