@dxos/echo 0.9.0 → 0.9.1-staging.ee54ba693a
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/neutral/Annotation.mjs +30 -8
- package/dist/lib/neutral/Database.mjs +7 -3
- package/dist/lib/neutral/Entity.mjs +15 -11
- package/dist/lib/neutral/Err.mjs +7 -3
- package/dist/lib/neutral/Feed.mjs +15 -19
- package/dist/lib/neutral/Filter.mjs +13 -11
- package/dist/lib/neutral/Format.mjs +3 -7
- package/dist/lib/neutral/JsonSchema.mjs +7 -7
- package/dist/lib/neutral/Migration.mjs +11 -11
- package/dist/lib/neutral/Obj.mjs +19 -13
- package/dist/lib/neutral/Order.mjs +1 -1
- package/dist/lib/neutral/Query.mjs +17 -17
- package/dist/lib/neutral/QueryResult.mjs +1 -1
- package/dist/lib/neutral/Ref.mjs +6 -6
- package/dist/lib/neutral/Registry.mjs +1 -1
- package/dist/lib/neutral/Relation.mjs +12 -12
- package/dist/lib/neutral/Tag.mjs +15 -15
- package/dist/lib/neutral/Text.mjs +25 -0
- package/dist/lib/neutral/Text.mjs.map +7 -0
- package/dist/lib/neutral/Type.mjs +10 -10
- package/dist/lib/neutral/chunk-2HKGAQM4.mjs +1394 -0
- package/dist/lib/neutral/chunk-2HKGAQM4.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-O6BH7EPN.mjs → chunk-2ZHECXUR.mjs} +5 -4
- package/dist/lib/neutral/chunk-2ZHECXUR.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-QQIYS74I.mjs → chunk-3KTE2Y7Q.mjs} +20 -20
- package/dist/lib/neutral/chunk-3KTE2Y7Q.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-R5W6DXR4.mjs → chunk-3TN2VMI4.mjs} +72 -36
- package/dist/lib/neutral/chunk-3TN2VMI4.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-5SMDBFVB.mjs → chunk-42L4HJ3Z.mjs} +11 -15
- package/dist/lib/neutral/chunk-42L4HJ3Z.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-7PI7C4EF.mjs → chunk-4A2NWKRJ.mjs} +5 -5
- package/dist/lib/neutral/chunk-ACFAOTKJ.mjs +1531 -0
- package/dist/lib/neutral/chunk-ACFAOTKJ.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-SBVFRTST.mjs → chunk-BEFR7LEA.mjs} +20 -10
- package/dist/lib/neutral/chunk-BEFR7LEA.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-6M2Z6WBH.mjs → chunk-BXIKXT7Q.mjs} +2 -6
- package/dist/lib/neutral/{chunk-6M2Z6WBH.mjs.map → chunk-BXIKXT7Q.mjs.map} +1 -1
- package/dist/lib/neutral/{chunk-UUP46KUQ.mjs → chunk-C57XMMBY.mjs} +21 -20
- package/dist/lib/neutral/chunk-C57XMMBY.mjs.map +7 -0
- package/dist/lib/neutral/chunk-C62JYFAD.mjs +183 -0
- package/dist/lib/neutral/chunk-C62JYFAD.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-MZ7K3MLL.mjs → chunk-FSGX2R62.mjs} +3 -3
- package/dist/lib/neutral/chunk-FSGX2R62.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-TYGKCRMK.mjs → chunk-HBXT3GSB.mjs} +37 -15
- package/dist/lib/neutral/chunk-HBXT3GSB.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-WU3GIANS.mjs → chunk-IQR45HAD.mjs} +1 -1
- package/dist/lib/neutral/chunk-IQR45HAD.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-TFEWTY5A.mjs → chunk-KCBW4BR6.mjs} +4 -8
- package/dist/lib/neutral/chunk-KCBW4BR6.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-WTQJHC75.mjs → chunk-L3E5IXAE.mjs} +225 -45
- package/dist/lib/neutral/chunk-L3E5IXAE.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-EVK6XBXO.mjs → chunk-PRC4FEKJ.mjs} +2 -2
- package/dist/lib/neutral/chunk-PRC4FEKJ.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-6YDI3J37.mjs → chunk-SCT6FFCR.mjs} +9 -4
- package/dist/lib/neutral/chunk-SCT6FFCR.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-BBFJWWAV.mjs → chunk-TOCVVFK2.mjs} +26 -2
- package/dist/lib/neutral/chunk-TOCVVFK2.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-RIVWNMSF.mjs → chunk-U53LSQQA.mjs} +3 -3
- package/dist/lib/neutral/{chunk-RIVWNMSF.mjs.map → chunk-U53LSQQA.mjs.map} +1 -1
- package/dist/lib/neutral/{chunk-IGK6FN65.mjs → chunk-UGFFV2FR.mjs} +2 -2
- package/dist/lib/neutral/{chunk-35INCYOE.mjs → chunk-UWLP4RFM.mjs} +1 -1
- package/dist/lib/neutral/chunk-UWLP4RFM.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-LWXVKPPW.mjs → chunk-UZHCQ6NI.mjs} +13 -11
- package/dist/lib/neutral/{chunk-LWXVKPPW.mjs.map → chunk-UZHCQ6NI.mjs.map} +3 -3
- package/dist/lib/neutral/{chunk-5SUJPHAE.mjs → chunk-WKIT2YY5.mjs} +2 -2
- package/dist/lib/neutral/{chunk-T6E37YIP.mjs → chunk-XB6ISRAO.mjs} +38 -18
- package/dist/lib/neutral/chunk-XB6ISRAO.mjs.map +7 -0
- package/dist/lib/neutral/chunk-XXL42WCB.mjs +84 -0
- package/dist/lib/neutral/chunk-XXL42WCB.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-ZGNNFYHS.mjs → chunk-XXWK4J53.mjs} +27 -42
- package/dist/lib/neutral/chunk-XXWK4J53.mjs.map +7 -0
- package/dist/lib/neutral/index.mjs +30 -26
- package/dist/lib/neutral/internal/index.mjs +111 -69
- package/dist/lib/neutral/meta.json +1 -1
- package/dist/lib/neutral/testing/index.mjs +79 -60
- package/dist/lib/neutral/testing/index.mjs.map +3 -3
- package/dist/types/src/Annotation.d.ts +35 -1
- package/dist/types/src/Annotation.d.ts.map +1 -1
- package/dist/types/src/Collection.d.ts +9 -8
- package/dist/types/src/Collection.d.ts.map +1 -1
- package/dist/types/src/Database.d.ts +38 -0
- package/dist/types/src/Database.d.ts.map +1 -1
- package/dist/types/src/Dataset.d.ts +1 -16
- package/dist/types/src/Dataset.d.ts.map +1 -1
- package/dist/types/src/Entity.d.ts +2 -0
- package/dist/types/src/Entity.d.ts.map +1 -1
- package/dist/types/src/Err.d.ts +67 -0
- package/dist/types/src/Err.d.ts.map +1 -1
- package/dist/types/src/Feed.d.ts +59 -80
- package/dist/types/src/Feed.d.ts.map +1 -1
- package/dist/types/src/Filter.d.ts +9 -1
- package/dist/types/src/Filter.d.ts.map +1 -1
- package/dist/types/src/Hypergraph.d.ts +2 -9
- package/dist/types/src/Hypergraph.d.ts.map +1 -1
- package/dist/types/src/Migration.d.ts +1 -1
- package/dist/types/src/Migration.d.ts.map +1 -1
- package/dist/types/src/Obj.d.ts +33 -6
- package/dist/types/src/Obj.d.ts.map +1 -1
- package/dist/types/src/Order.d.ts +1 -1
- package/dist/types/src/Order.d.ts.map +1 -1
- package/dist/types/src/Query.d.ts +1 -1
- package/dist/types/src/Query.d.ts.map +1 -1
- package/dist/types/src/QueryResult.d.ts +2 -2
- package/dist/types/src/QueryResult.d.ts.map +1 -1
- package/dist/types/src/Ref.d.ts +10 -6
- package/dist/types/src/Ref.d.ts.map +1 -1
- package/dist/types/src/Registry.d.ts +1 -1
- package/dist/types/src/Relation.d.ts.map +1 -1
- package/dist/types/src/Tag.d.ts +11 -13
- package/dist/types/src/Tag.d.ts.map +1 -1
- package/dist/types/src/Text.d.ts +41 -0
- package/dist/types/src/Text.d.ts.map +1 -0
- package/dist/types/src/Text.test.d.ts +2 -0
- package/dist/types/src/Text.test.d.ts.map +1 -0
- package/dist/types/src/Type.d.ts +38 -21
- package/dist/types/src/Type.d.ts.map +1 -1
- package/dist/types/src/View.d.ts +8 -9
- package/dist/types/src/View.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/internal/Annotation/annotations.d.ts +50 -0
- package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -1
- package/dist/types/src/internal/Annotation/atoms.d.ts +14 -0
- package/dist/types/src/internal/Annotation/atoms.d.ts.map +1 -0
- package/dist/types/src/internal/Annotation/entity-dictionary.d.ts +13 -0
- package/dist/types/src/internal/Annotation/entity-dictionary.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/api.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/guard.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/model.d.ts +1 -1
- package/dist/types/src/internal/Entity/model.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/object.d.ts +5 -1
- package/dist/types/src/internal/Entity/object.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/relation.d.ts +7 -0
- package/dist/types/src/internal/Entity/relation.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/type-uri.d.ts.map +1 -1
- package/dist/types/src/internal/Filter/index.d.ts +2 -0
- package/dist/types/src/internal/Filter/index.d.ts.map +1 -0
- package/dist/types/src/internal/Filter/match.d.ts +22 -0
- package/dist/types/src/internal/Filter/match.d.ts.map +1 -0
- package/dist/types/src/internal/Format/format.d.ts +0 -2
- package/dist/types/src/internal/Format/format.d.ts.map +1 -1
- package/dist/types/src/internal/Format/index.d.ts +2 -2
- package/dist/types/src/internal/Format/index.d.ts.map +1 -1
- package/dist/types/src/internal/Format/string.d.ts +0 -8
- package/dist/types/src/internal/Format/string.d.ts.map +1 -1
- package/dist/types/src/internal/Format/types.d.ts +2 -1
- package/dist/types/src/internal/Format/types.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/atoms.d.ts +12 -3
- package/dist/types/src/internal/Obj/atoms.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/clone.d.ts +2 -1
- package/dist/types/src/internal/Obj/clone.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/create-object.d.ts +3 -4
- package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -1
- package/dist/types/src/internal/Query/index.d.ts +1 -0
- package/dist/types/src/internal/Query/index.d.ts.map +1 -1
- package/dist/types/src/internal/Query/query-result-effect.d.ts +9 -0
- package/dist/types/src/internal/Query/query-result-effect.d.ts.map +1 -0
- package/dist/types/src/internal/Ref/atoms.d.ts +1 -2
- package/dist/types/src/internal/Ref/atoms.d.ts.map +1 -1
- package/dist/types/src/internal/Ref/index.d.ts +1 -0
- package/dist/types/src/internal/Ref/index.d.ts.map +1 -1
- package/dist/types/src/internal/Ref/ref.d.ts +79 -8
- package/dist/types/src/internal/Ref/ref.d.ts.map +1 -1
- package/dist/types/src/internal/Ref/strong-deps.d.ts +35 -0
- package/dist/types/src/internal/Ref/strong-deps.d.ts.map +1 -0
- package/dist/types/src/internal/common/atom-snapshot.d.ts +8 -0
- package/dist/types/src/internal/common/atom-snapshot.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/proxy-types.d.ts +12 -0
- package/dist/types/src/internal/common/proxy/proxy-types.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/proxy-utils.d.ts +25 -0
- package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/schema-validator.d.ts +5 -0
- package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/typed-handler.d.ts +17 -0
- package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/entity.d.ts +4 -4
- package/dist/types/src/internal/common/types/entity.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/meta.d.ts +2 -4
- package/dist/types/src/internal/common/types/meta.d.ts.map +1 -1
- package/dist/types/src/internal/index.d.ts +1 -0
- package/dist/types/src/internal/index.d.ts.map +1 -1
- package/dist/types/src/testing/test-schema.d.ts +42 -171
- package/dist/types/src/testing/test-schema.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +20 -13
- package/src/Annotation.test.ts +257 -10
- package/src/Annotation.ts +58 -4
- package/src/Collection.ts +10 -12
- package/src/Database.ts +55 -21
- package/src/Entity.ts +3 -1
- package/src/Err.ts +22 -0
- package/src/Feed.ts +117 -141
- package/src/Filter.test.ts +38 -0
- package/src/Filter.ts +17 -3
- package/src/Hypergraph.ts +2 -11
- package/src/Migration.ts +1 -1
- package/src/Obj.test.ts +92 -12
- package/src/Obj.ts +38 -5
- package/src/Order.ts +3 -3
- package/src/Query.test.ts +2 -2
- package/src/Query.ts +16 -16
- package/src/QueryResult.ts +2 -2
- package/src/Ref.ts +14 -6
- package/src/Registry.ts +1 -1
- package/src/Relation.ts +1 -1
- package/src/Tag.ts +13 -16
- package/src/Text.test.ts +186 -0
- package/src/Text.ts +116 -0
- package/src/Type.test.ts +52 -24
- package/src/Type.ts +85 -33
- package/src/View.ts +22 -30
- package/src/index.ts +1 -1
- package/src/internal/Annotation/annotations.ts +71 -2
- package/src/internal/Annotation/atoms.ts +107 -0
- package/src/internal/Annotation/entity-dictionary.ts +40 -37
- package/src/internal/Entity/api.ts +1 -1
- package/src/internal/Entity/guard.ts +2 -1
- package/src/internal/Entity/model.ts +2 -2
- package/src/internal/Entity/object.ts +14 -1
- package/src/internal/Entity/relation.ts +19 -0
- package/src/internal/Entity/type-uri.ts +3 -1
- package/src/internal/Filter/index.ts +5 -0
- package/src/internal/Filter/match.ts +284 -0
- package/src/internal/Format/format.ts +0 -2
- package/src/internal/Format/index.ts +2 -2
- package/src/internal/Format/string.ts +0 -12
- package/src/internal/Format/types.ts +4 -2
- package/src/internal/JsonSchema/json-schema.test.ts +82 -54
- package/src/internal/Obj/atoms.ts +62 -18
- package/src/internal/Obj/clone.ts +61 -20
- package/src/internal/Obj/create-object.test.ts +3 -3
- package/src/internal/Obj/create-object.ts +3 -4
- package/src/internal/Obj/inspect.ts +1 -1
- package/src/internal/Obj/json-serializer.test.ts +7 -5
- package/src/internal/Obj/json-serializer.ts +4 -4
- package/src/internal/Obj/schema-validator.test.ts +53 -0
- package/src/internal/Obj/set-value.test.ts +29 -19
- package/src/internal/Query/index.ts +1 -0
- package/src/internal/Query/query-result-effect.ts +35 -0
- package/src/internal/Ref/atoms.ts +23 -3
- package/src/internal/Ref/index.ts +1 -0
- package/src/internal/Ref/ref.test.ts +8 -8
- package/src/internal/Ref/ref.ts +122 -39
- package/src/internal/Ref/strong-deps.ts +107 -0
- package/src/internal/common/atom-snapshot.ts +19 -0
- package/src/internal/common/proxy/make-object.ts +1 -1
- package/src/internal/common/proxy/proxy-types.ts +20 -0
- package/src/internal/common/proxy/proxy-utils.ts +37 -1
- package/src/internal/common/proxy/reactive-array.ts +3 -3
- package/src/internal/common/proxy/reactive.test.ts +1 -1
- package/src/internal/common/proxy/schema-validator.ts +181 -8
- package/src/internal/common/proxy/typed-handler.ts +254 -76
- package/src/internal/common/types/entity.ts +15 -7
- package/src/internal/index.ts +1 -0
- package/src/testing/test-schema.ts +75 -90
- package/dist/lib/neutral/chunk-35INCYOE.mjs.map +0 -7
- package/dist/lib/neutral/chunk-3PBP4V4O.mjs +0 -101
- package/dist/lib/neutral/chunk-3PBP4V4O.mjs.map +0 -7
- package/dist/lib/neutral/chunk-4ZUHOTCG.mjs +0 -184
- package/dist/lib/neutral/chunk-4ZUHOTCG.mjs.map +0 -7
- package/dist/lib/neutral/chunk-5SMDBFVB.mjs.map +0 -7
- package/dist/lib/neutral/chunk-6YDI3J37.mjs.map +0 -7
- package/dist/lib/neutral/chunk-7FPIAJIV.mjs +0 -2279
- package/dist/lib/neutral/chunk-7FPIAJIV.mjs.map +0 -7
- package/dist/lib/neutral/chunk-BBFJWWAV.mjs.map +0 -7
- package/dist/lib/neutral/chunk-EVK6XBXO.mjs.map +0 -7
- package/dist/lib/neutral/chunk-MZ7K3MLL.mjs.map +0 -7
- package/dist/lib/neutral/chunk-O6BH7EPN.mjs.map +0 -7
- package/dist/lib/neutral/chunk-QQIYS74I.mjs.map +0 -7
- package/dist/lib/neutral/chunk-R5W6DXR4.mjs.map +0 -7
- package/dist/lib/neutral/chunk-SBVFRTST.mjs.map +0 -7
- package/dist/lib/neutral/chunk-T6E37YIP.mjs.map +0 -7
- package/dist/lib/neutral/chunk-TFEWTY5A.mjs.map +0 -7
- package/dist/lib/neutral/chunk-TYGKCRMK.mjs.map +0 -7
- package/dist/lib/neutral/chunk-UUP46KUQ.mjs.map +0 -7
- package/dist/lib/neutral/chunk-WTQJHC75.mjs.map +0 -7
- package/dist/lib/neutral/chunk-WU3GIANS.mjs.map +0 -7
- package/dist/lib/neutral/chunk-ZGNNFYHS.mjs.map +0 -7
- package/dist/types/src/exemplars.test.d.ts +0 -2
- package/dist/types/src/exemplars.test.d.ts.map +0 -1
- package/dist/types/src/hierarchy.test.d.ts +0 -2
- package/dist/types/src/hierarchy.test.d.ts.map +0 -1
- package/src/exemplars.test.ts +0 -21
- package/src/hierarchy.test.ts +0 -33
- /package/dist/lib/neutral/{chunk-7PI7C4EF.mjs.map → chunk-4A2NWKRJ.mjs.map} +0 -0
- /package/dist/lib/neutral/{chunk-IGK6FN65.mjs.map → chunk-UGFFV2FR.mjs.map} +0 -0
- /package/dist/lib/neutral/{chunk-5SUJPHAE.mjs.map → chunk-WKIT2YY5.mjs.map} +0 -0
|
@@ -0,0 +1,1531 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ATTR_META,
|
|
3
|
+
EntityMetaSchema,
|
|
4
|
+
TypeMetaSchemaDXN,
|
|
5
|
+
attachTypedJsonSerializer,
|
|
6
|
+
defineHiddenProperty,
|
|
7
|
+
getMeta,
|
|
8
|
+
getMetaChecked,
|
|
9
|
+
isEntity,
|
|
10
|
+
makeEchoTypeSchema,
|
|
11
|
+
makeObject,
|
|
12
|
+
snapshotForComparison,
|
|
13
|
+
typedJsonSerializer
|
|
14
|
+
} from "./chunk-2HKGAQM4.mjs";
|
|
15
|
+
import {
|
|
16
|
+
JsonSchemaFields,
|
|
17
|
+
JsonSchemaType,
|
|
18
|
+
toJsonSchema
|
|
19
|
+
} from "./chunk-4A2NWKRJ.mjs";
|
|
20
|
+
import {
|
|
21
|
+
Ref,
|
|
22
|
+
RefTypeId,
|
|
23
|
+
loadRefTarget,
|
|
24
|
+
refFromEncodedReference,
|
|
25
|
+
setRefResolver,
|
|
26
|
+
subscribe
|
|
27
|
+
} from "./chunk-L3E5IXAE.mjs";
|
|
28
|
+
import {
|
|
29
|
+
ATTR_DELETED,
|
|
30
|
+
ATTR_PARENT,
|
|
31
|
+
ATTR_RELATION_SOURCE,
|
|
32
|
+
ATTR_RELATION_TARGET,
|
|
33
|
+
ATTR_SELF_URI,
|
|
34
|
+
ATTR_SELF_URI_LEGACY,
|
|
35
|
+
ATTR_TYPE,
|
|
36
|
+
IconAnnotation,
|
|
37
|
+
LabelAnnotation,
|
|
38
|
+
MetaId,
|
|
39
|
+
ObjectDatabaseId,
|
|
40
|
+
ObjectDeletedId,
|
|
41
|
+
ObjectVersionId,
|
|
42
|
+
ParentId,
|
|
43
|
+
RelationSourceDXNId,
|
|
44
|
+
RelationSourceId,
|
|
45
|
+
RelationTargetDXNId,
|
|
46
|
+
RelationTargetId,
|
|
47
|
+
SchemaId,
|
|
48
|
+
SelfURIId,
|
|
49
|
+
TypeAnnotationId,
|
|
50
|
+
TypeEntityId,
|
|
51
|
+
TypeId,
|
|
52
|
+
assertObjectModel,
|
|
53
|
+
getDatabase,
|
|
54
|
+
getEntityKind,
|
|
55
|
+
getLabel,
|
|
56
|
+
getObjectEchoUri,
|
|
57
|
+
getSchema,
|
|
58
|
+
getSchemaTypename,
|
|
59
|
+
getSchemaURI,
|
|
60
|
+
getType,
|
|
61
|
+
getTypeAnnotation,
|
|
62
|
+
getTypeIdentifierAnnotation,
|
|
63
|
+
getTypeURI,
|
|
64
|
+
getTypename,
|
|
65
|
+
setSchema,
|
|
66
|
+
setType,
|
|
67
|
+
setTypename
|
|
68
|
+
} from "./chunk-3TN2VMI4.mjs";
|
|
69
|
+
import {
|
|
70
|
+
EntityKind,
|
|
71
|
+
KindId,
|
|
72
|
+
SnapshotKindId,
|
|
73
|
+
getStaticTypeSchema,
|
|
74
|
+
makeTypeJsonSchemaAnnotation
|
|
75
|
+
} from "./chunk-2ZHECXUR.mjs";
|
|
76
|
+
|
|
77
|
+
// src/internal/common/types/base.ts
|
|
78
|
+
import * as Schema from "effect/Schema";
|
|
79
|
+
import * as SchemaAST from "effect/SchemaAST";
|
|
80
|
+
var RawObject = (schema) => {
|
|
81
|
+
return Schema.make(SchemaAST.omit(schema.ast, [
|
|
82
|
+
"id"
|
|
83
|
+
]));
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
// src/internal/common/types/version.ts
|
|
87
|
+
var VersionTypeId = "~@dxos/echo/VersionTypeId";
|
|
88
|
+
|
|
89
|
+
// src/internal/Annotation/sorting.ts
|
|
90
|
+
var compare = (a, b) => {
|
|
91
|
+
if (a == null) {
|
|
92
|
+
return b == null ? 0 : 1;
|
|
93
|
+
}
|
|
94
|
+
if (b == null) {
|
|
95
|
+
return -1;
|
|
96
|
+
}
|
|
97
|
+
return a.localeCompare(b);
|
|
98
|
+
};
|
|
99
|
+
var sortByLabel = (a, b) => compare(getLabel(a), getLabel(b));
|
|
100
|
+
var sortByTypename = (a, b) => compare(getTypename(a), getTypename(b));
|
|
101
|
+
var sort = (...comparators) => {
|
|
102
|
+
return (a, b) => {
|
|
103
|
+
for (const comparator of comparators) {
|
|
104
|
+
const result = comparator(a, b);
|
|
105
|
+
if (result !== 0) {
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return 0;
|
|
110
|
+
};
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
// src/internal/Query/pretty.ts
|
|
114
|
+
var prettyFilter = (filter) => {
|
|
115
|
+
switch (filter.type) {
|
|
116
|
+
case "object": {
|
|
117
|
+
if (filter.typename === null && (filter.id === void 0 || filter.id.length === 0) && Object.keys(filter.props).length === 0 && (filter.foreignKeys === void 0 || filter.foreignKeys.length === 0) && filter.metaKey !== void 0) {
|
|
118
|
+
return filter.metaVersion !== void 0 ? `Filter.key(${JSON.stringify(filter.metaKey)}, { version: ${JSON.stringify(filter.metaVersion)} })` : `Filter.key(${JSON.stringify(filter.metaKey)})`;
|
|
119
|
+
}
|
|
120
|
+
const parts = [];
|
|
121
|
+
if (filter.typename !== null) {
|
|
122
|
+
parts.push(String(filter.typename));
|
|
123
|
+
}
|
|
124
|
+
if (filter.id !== void 0 && filter.id.length > 0) {
|
|
125
|
+
parts.push(`id: [${filter.id.join(", ")}]`);
|
|
126
|
+
}
|
|
127
|
+
const propEntries = Object.entries(filter.props);
|
|
128
|
+
if (propEntries.length > 0) {
|
|
129
|
+
const propsStr = propEntries.map(([k, v]) => `${k}: ${prettyFilter(v)}`).join(", ");
|
|
130
|
+
parts.push(`{ ${propsStr} }`);
|
|
131
|
+
}
|
|
132
|
+
if (filter.foreignKeys !== void 0 && filter.foreignKeys.length > 0) {
|
|
133
|
+
parts.push(`foreignKeys: [${filter.foreignKeys.map((fk) => JSON.stringify(fk)).join(", ")}]`);
|
|
134
|
+
}
|
|
135
|
+
if (filter.metaKey !== void 0) {
|
|
136
|
+
parts.push(filter.metaVersion !== void 0 ? `metaKey: ${JSON.stringify(filter.metaKey)} (${filter.metaVersion})` : `metaKey: ${JSON.stringify(filter.metaKey)}`);
|
|
137
|
+
}
|
|
138
|
+
return parts.length > 0 ? `Filter.type(${parts.join(", ")})` : "Filter.everything()";
|
|
139
|
+
}
|
|
140
|
+
case "compare":
|
|
141
|
+
return `Filter.${filter.operator}(${JSON.stringify(filter.value)})`;
|
|
142
|
+
case "in":
|
|
143
|
+
return `Filter.in([${filter.values.map((v) => JSON.stringify(v)).join(", ")}])`;
|
|
144
|
+
case "contains":
|
|
145
|
+
return `Filter.contains(${JSON.stringify(filter.value)})`;
|
|
146
|
+
case "tag":
|
|
147
|
+
return `Filter.tag(${JSON.stringify(filter.tag)})`;
|
|
148
|
+
case "range":
|
|
149
|
+
return `Filter.range(${JSON.stringify(filter.from)}, ${JSON.stringify(filter.to)})`;
|
|
150
|
+
case "text-search":
|
|
151
|
+
return filter.searchKind ? `Filter.textSearch(${JSON.stringify(filter.text)}, ${JSON.stringify(filter.searchKind)})` : `Filter.textSearch(${JSON.stringify(filter.text)})`;
|
|
152
|
+
case "timestamp":
|
|
153
|
+
return `Filter.${filter.field}.${filter.operator}(${filter.value})`;
|
|
154
|
+
case "child-of":
|
|
155
|
+
return `Filter.childOf([${filter.parents.map((p) => JSON.stringify(p)).join(", ")}], { transitive: ${filter.transitive} })`;
|
|
156
|
+
case "not":
|
|
157
|
+
return `Filter.not(${prettyFilter(filter.filter)})`;
|
|
158
|
+
case "and":
|
|
159
|
+
return `Filter.and(${filter.filters.map(prettyFilter).join(", ")})`;
|
|
160
|
+
case "or":
|
|
161
|
+
return `Filter.or(${filter.filters.map(prettyFilter).join(", ")})`;
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
var prettyQuery = (query) => {
|
|
165
|
+
switch (query.type) {
|
|
166
|
+
case "select":
|
|
167
|
+
return `Query.select(${prettyFilter(query.filter)})`;
|
|
168
|
+
case "filter":
|
|
169
|
+
return `${prettyQuery(query.selection)}.select(${prettyFilter(query.filter)})`;
|
|
170
|
+
case "reference-traversal":
|
|
171
|
+
return `${prettyQuery(query.anchor)}.reference(${JSON.stringify(query.property)})`;
|
|
172
|
+
case "incoming-references": {
|
|
173
|
+
const args = [];
|
|
174
|
+
if (query.typename !== null) {
|
|
175
|
+
args.push(String(query.typename));
|
|
176
|
+
}
|
|
177
|
+
if (query.property !== null) {
|
|
178
|
+
args.push(JSON.stringify(query.property));
|
|
179
|
+
}
|
|
180
|
+
return `${prettyQuery(query.anchor)}.referencedBy(${args.join(", ")})`;
|
|
181
|
+
}
|
|
182
|
+
case "relation": {
|
|
183
|
+
const method = query.direction === "outgoing" ? "sourceOf" : query.direction === "incoming" ? "targetOf" : "relationOf";
|
|
184
|
+
const filterStr = query.filter !== void 0 ? prettyFilter(query.filter) : "";
|
|
185
|
+
return `${prettyQuery(query.anchor)}.${method}(${filterStr})`;
|
|
186
|
+
}
|
|
187
|
+
case "relation-traversal":
|
|
188
|
+
return `${prettyQuery(query.anchor)}.${query.direction}()`;
|
|
189
|
+
case "hierarchy-traversal":
|
|
190
|
+
return query.direction === "to-parent" ? `${prettyQuery(query.anchor)}.parent()` : `${prettyQuery(query.anchor)}.children()`;
|
|
191
|
+
case "union":
|
|
192
|
+
return `Query.all(${query.queries.map(prettyQuery).join(", ")})`;
|
|
193
|
+
case "set-difference":
|
|
194
|
+
return `Query.without(${prettyQuery(query.source)}, ${prettyQuery(query.exclude)})`;
|
|
195
|
+
case "order": {
|
|
196
|
+
const orders = query.order.map((o) => {
|
|
197
|
+
if (o.kind === "natural") {
|
|
198
|
+
return "Order.natural()";
|
|
199
|
+
} else if (o.kind === "rank") {
|
|
200
|
+
return `Order.rank(${JSON.stringify(o.direction)})`;
|
|
201
|
+
} else if (o.kind === "timestamp") {
|
|
202
|
+
const fn = o.field === "updatedAt" ? "updated" : "created";
|
|
203
|
+
return `Order.${fn}(${JSON.stringify(o.direction)})`;
|
|
204
|
+
} else {
|
|
205
|
+
return `Order.property(${JSON.stringify(o.property)}, ${JSON.stringify(o.direction)})`;
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
return `${prettyQuery(query.query)}.orderBy(${orders.join(", ")})`;
|
|
209
|
+
}
|
|
210
|
+
case "options": {
|
|
211
|
+
const opts = query.options;
|
|
212
|
+
const parts = [];
|
|
213
|
+
if (opts.deleted !== void 0) {
|
|
214
|
+
parts.push(`deleted: ${JSON.stringify(opts.deleted)}`);
|
|
215
|
+
}
|
|
216
|
+
if (opts.debugLabel !== void 0) {
|
|
217
|
+
parts.push(`debugLabel: ${JSON.stringify(opts.debugLabel)}`);
|
|
218
|
+
}
|
|
219
|
+
return `${prettyQuery(query.query)}.options({ ${parts.join(", ")} })`;
|
|
220
|
+
}
|
|
221
|
+
case "from": {
|
|
222
|
+
if (query.from._tag === "scope") {
|
|
223
|
+
if (query.from.scopes.length === 0) {
|
|
224
|
+
return `${prettyQuery(query.query)}.from('all-accessible-spaces')`;
|
|
225
|
+
}
|
|
226
|
+
const scopeStrs = query.from.scopes.map((scope) => {
|
|
227
|
+
if (scope._tag === "space") {
|
|
228
|
+
return scope.includeAllFeeds ? `{ space: ${JSON.stringify(scope.spaceId)}, includeAllFeeds: true }` : `{ space: ${JSON.stringify(scope.spaceId)} }`;
|
|
229
|
+
}
|
|
230
|
+
if (scope._tag === "feed") {
|
|
231
|
+
return `{ feed: ${JSON.stringify(String(scope.feedUri))} }`;
|
|
232
|
+
}
|
|
233
|
+
return `{ registry: ${JSON.stringify(scope.location)} }`;
|
|
234
|
+
});
|
|
235
|
+
return `${prettyQuery(query.query)}.from([${scopeStrs.join(", ")}])`;
|
|
236
|
+
}
|
|
237
|
+
return `${prettyQuery(query.query)}.from(${prettyQuery(query.from.query)})`;
|
|
238
|
+
}
|
|
239
|
+
case "limit":
|
|
240
|
+
return `${prettyQuery(query.query)}.limit(${query.limit})`;
|
|
241
|
+
}
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
// src/internal/Ref/strong-deps.ts
|
|
245
|
+
import { EID } from "@dxos/keys";
|
|
246
|
+
var getStrongDependencyUris = (refs, owningSpaceId) => {
|
|
247
|
+
const res = [];
|
|
248
|
+
if (refs.type != null && EID.tryParse(refs.type) != null) {
|
|
249
|
+
res.push(qualifyToSpace(refs.type, owningSpaceId));
|
|
250
|
+
}
|
|
251
|
+
if (refs.kind === EntityKind.Relation) {
|
|
252
|
+
if (refs.source != null) {
|
|
253
|
+
res.push(qualifyToSpace(refs.source, owningSpaceId));
|
|
254
|
+
}
|
|
255
|
+
if (refs.target != null) {
|
|
256
|
+
res.push(qualifyToSpace(refs.target, owningSpaceId));
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
if (refs.parent != null) {
|
|
260
|
+
res.push(qualifyToSpace(refs.parent, owningSpaceId));
|
|
261
|
+
}
|
|
262
|
+
return res;
|
|
263
|
+
};
|
|
264
|
+
var qualifyToSpace = (uri, owningSpaceId) => {
|
|
265
|
+
if (owningSpaceId == null) {
|
|
266
|
+
return uri;
|
|
267
|
+
}
|
|
268
|
+
const eid = EID.tryParse(uri);
|
|
269
|
+
if (eid == null || !EID.isLocal(eid)) {
|
|
270
|
+
return uri;
|
|
271
|
+
}
|
|
272
|
+
const entityId = EID.getEntityId(eid);
|
|
273
|
+
return entityId != null ? EID.make({
|
|
274
|
+
spaceId: owningSpaceId,
|
|
275
|
+
entityId
|
|
276
|
+
}) : uri;
|
|
277
|
+
};
|
|
278
|
+
var getStrongDependencies = (entity) => {
|
|
279
|
+
if (entity == null || typeof entity !== "object") {
|
|
280
|
+
return [];
|
|
281
|
+
}
|
|
282
|
+
const props = entity;
|
|
283
|
+
const kind = props[RelationSourceDXNId] != null || props[RelationTargetDXNId] != null ? EntityKind.Relation : EntityKind.Object;
|
|
284
|
+
const parent = props[ParentId];
|
|
285
|
+
const selfUri = getObjectEchoUri(entity);
|
|
286
|
+
const owningSpaceId = selfUri != null ? EID.getSpaceId(selfUri) : void 0;
|
|
287
|
+
return getStrongDependencyUris({
|
|
288
|
+
kind,
|
|
289
|
+
type: typeof props[TypeId] === "string" ? props[TypeId] : void 0,
|
|
290
|
+
source: props[RelationSourceDXNId],
|
|
291
|
+
target: props[RelationTargetDXNId],
|
|
292
|
+
// A parent is held as the resolved entity; derive its absolute URI for the dependency edge.
|
|
293
|
+
parent: parent != null ? getObjectEchoUri(parent) : void 0
|
|
294
|
+
}, owningSpaceId);
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
// src/internal/Entity/object.ts
|
|
298
|
+
import * as Schema2 from "effect/Schema";
|
|
299
|
+
import * as SchemaAST2 from "effect/SchemaAST";
|
|
300
|
+
import { invariant } from "@dxos/invariant";
|
|
301
|
+
import { DXN } from "@dxos/keys";
|
|
302
|
+
|
|
303
|
+
// src/internal/JsonSchema/json-schema-normalize.ts
|
|
304
|
+
var normalizeSchema = (schema) => {
|
|
305
|
+
const copy = structuredClone(schema);
|
|
306
|
+
go(copy);
|
|
307
|
+
return copy;
|
|
308
|
+
};
|
|
309
|
+
var go = (schema) => {
|
|
310
|
+
if (typeof schema !== "object" || schema === null) {
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
if (schema.exclusiveMaximum === true) {
|
|
314
|
+
schema.exclusiveMaximum = schema.maximum;
|
|
315
|
+
delete schema.exclusiveMaximum;
|
|
316
|
+
} else if (schema.exclusiveMaximum === false) {
|
|
317
|
+
delete schema.exclusiveMaximum;
|
|
318
|
+
}
|
|
319
|
+
if (schema.exclusiveMinimum === true) {
|
|
320
|
+
schema.exclusiveMinimum = schema.minimum;
|
|
321
|
+
delete schema.exclusiveMinimum;
|
|
322
|
+
} else if (schema.exclusiveMinimum === false) {
|
|
323
|
+
delete schema.exclusiveMinimum;
|
|
324
|
+
}
|
|
325
|
+
for (const key of Object.keys(schema)) {
|
|
326
|
+
if (!JsonSchemaFields.includes(key)) {
|
|
327
|
+
delete schema[key];
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
if (schema.properties) {
|
|
331
|
+
goOnRecord(schema.properties);
|
|
332
|
+
}
|
|
333
|
+
if (schema.patternProperties) {
|
|
334
|
+
goOnRecord(schema.patternProperties);
|
|
335
|
+
}
|
|
336
|
+
if (schema.propertyNames) {
|
|
337
|
+
go(schema.propertyNames);
|
|
338
|
+
}
|
|
339
|
+
if (schema.definitions) {
|
|
340
|
+
goOnRecord(schema.definitions);
|
|
341
|
+
}
|
|
342
|
+
if (schema.items) {
|
|
343
|
+
maybeGoOnArray(schema.items);
|
|
344
|
+
}
|
|
345
|
+
if (schema.additionalItems) {
|
|
346
|
+
maybeGoOnArray(schema.additionalItems);
|
|
347
|
+
}
|
|
348
|
+
if (schema.contains) {
|
|
349
|
+
go(schema.contains);
|
|
350
|
+
}
|
|
351
|
+
if (schema.if) {
|
|
352
|
+
go(schema.if);
|
|
353
|
+
}
|
|
354
|
+
if (schema.then) {
|
|
355
|
+
go(schema.then);
|
|
356
|
+
}
|
|
357
|
+
if (schema.else) {
|
|
358
|
+
go(schema.else);
|
|
359
|
+
}
|
|
360
|
+
if (schema.allOf) {
|
|
361
|
+
maybeGoOnArray(schema.allOf);
|
|
362
|
+
}
|
|
363
|
+
if (schema.anyOf) {
|
|
364
|
+
maybeGoOnArray(schema.anyOf);
|
|
365
|
+
}
|
|
366
|
+
if (schema.oneOf) {
|
|
367
|
+
maybeGoOnArray(schema.oneOf);
|
|
368
|
+
}
|
|
369
|
+
if (schema.not) {
|
|
370
|
+
go(schema.not);
|
|
371
|
+
}
|
|
372
|
+
if (schema.$defs) {
|
|
373
|
+
goOnRecord(schema.$defs);
|
|
374
|
+
}
|
|
375
|
+
if (schema.reference) {
|
|
376
|
+
go(schema.reference.schema);
|
|
377
|
+
}
|
|
378
|
+
};
|
|
379
|
+
var maybeGoOnArray = (value2) => {
|
|
380
|
+
if (Array.isArray(value2)) {
|
|
381
|
+
for (const item of value2) {
|
|
382
|
+
go(item);
|
|
383
|
+
}
|
|
384
|
+
} else if (typeof value2 === "object" && value2 !== null) {
|
|
385
|
+
go(value2);
|
|
386
|
+
}
|
|
387
|
+
};
|
|
388
|
+
var goOnRecord = (record) => {
|
|
389
|
+
for (const key of Object.keys(record)) {
|
|
390
|
+
go(record[key]);
|
|
391
|
+
}
|
|
392
|
+
};
|
|
393
|
+
|
|
394
|
+
// src/internal/Entity/object.ts
|
|
395
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Entity/object.ts";
|
|
396
|
+
var EchoObjectSchema = (dxn, options) => {
|
|
397
|
+
const typename = DXN.getName(dxn);
|
|
398
|
+
const version2 = DXN.getVersion(dxn);
|
|
399
|
+
invariant(version2, `Type.makeObject requires a versioned DXN: ${dxn}`, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 19, S: void 0, A: ["version", "`Type.makeObject requires a versioned DXN: ${dxn}`"] });
|
|
400
|
+
return (self) => {
|
|
401
|
+
invariant(typeof TypeAnnotationId === "symbol", "Sanity.", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 21, S: void 0, A: ["typeof TypeAnnotationId === 'symbol'", "'Sanity.'"] });
|
|
402
|
+
invariant(SchemaAST2.isTypeLiteral(self.ast), "Schema must be a TypeLiteral.", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 22, S: void 0, A: ["SchemaAST.isTypeLiteral(self.ast)", "'Schema must be a TypeLiteral.'"] });
|
|
403
|
+
const fields = self.fields ?? {};
|
|
404
|
+
const schemaWithId = Schema2.extend(self, Schema2.Struct({
|
|
405
|
+
id: Schema2.String
|
|
406
|
+
}));
|
|
407
|
+
const ast = SchemaAST2.annotations(schemaWithId.ast, {
|
|
408
|
+
// TODO(dmaretskyi): `extend` kills the annotations.
|
|
409
|
+
...self.ast.annotations,
|
|
410
|
+
[TypeAnnotationId]: {
|
|
411
|
+
kind: EntityKind.Object,
|
|
412
|
+
typename,
|
|
413
|
+
version: version2
|
|
414
|
+
},
|
|
415
|
+
// TODO(dmaretskyi): TypeIdentifierAnnotationId?
|
|
416
|
+
[SchemaAST2.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
|
|
417
|
+
kind: EntityKind.Object,
|
|
418
|
+
typename,
|
|
419
|
+
version: version2
|
|
420
|
+
})
|
|
421
|
+
});
|
|
422
|
+
return makeEchoTypeSchema(fields, ast, typename, version2, EntityKind.Object, () => toJsonSchema(Schema2.make(ast)), options?.id);
|
|
423
|
+
};
|
|
424
|
+
};
|
|
425
|
+
var makeObjectType = (dxn, schema, options) => {
|
|
426
|
+
const type = EchoObjectSchema(dxn, options)(schema);
|
|
427
|
+
const constructor = function ObjectType() {
|
|
428
|
+
};
|
|
429
|
+
Object.setPrototypeOf(constructor, type);
|
|
430
|
+
return constructor;
|
|
431
|
+
};
|
|
432
|
+
|
|
433
|
+
// src/internal/Entity/relation.ts
|
|
434
|
+
import * as Schema3 from "effect/Schema";
|
|
435
|
+
import * as SchemaAST3 from "effect/SchemaAST";
|
|
436
|
+
import { raise } from "@dxos/debug";
|
|
437
|
+
import { assertArgument, invariant as invariant2 } from "@dxos/invariant";
|
|
438
|
+
import { DXN as DXN2 } from "@dxos/keys";
|
|
439
|
+
var __dxlog_file2 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Entity/relation.ts";
|
|
440
|
+
var EchoRelationSchema = ({ dxn, source, target, id: explicitId }) => {
|
|
441
|
+
const sourceSchema = source != null ? getStaticTypeSchema(source) ?? source : source;
|
|
442
|
+
const targetSchema = target != null ? getStaticTypeSchema(target) ?? target : target;
|
|
443
|
+
assertArgument(Schema3.isSchema(sourceSchema), "source");
|
|
444
|
+
assertArgument(Schema3.isSchema(targetSchema), "target");
|
|
445
|
+
const typename = DXN2.getName(dxn);
|
|
446
|
+
const version2 = DXN2.getVersion(dxn);
|
|
447
|
+
invariant2(version2, `Type.makeRelation requires a versioned DXN: ${dxn}`, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 27, S: void 0, A: ["version", "`Type.makeRelation requires a versioned DXN: ${dxn}`"] });
|
|
448
|
+
const sourceDXN = getDXNForRelationSchemaRef(sourceSchema);
|
|
449
|
+
const targetDXN = getDXNForRelationSchemaRef(targetSchema);
|
|
450
|
+
if (getEntityKind(sourceSchema) !== EntityKind.Object) {
|
|
451
|
+
raise(new Error("Source schema must be an echo object schema."));
|
|
452
|
+
}
|
|
453
|
+
if (getEntityKind(targetSchema) !== EntityKind.Object) {
|
|
454
|
+
raise(new Error("Target schema must be an echo object schema."));
|
|
455
|
+
}
|
|
456
|
+
return (self) => {
|
|
457
|
+
invariant2(SchemaAST3.isTypeLiteral(self.ast), "Schema must be a TypeLiteral.", { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 37, S: void 0, A: ["SchemaAST.isTypeLiteral(self.ast)", "'Schema must be a TypeLiteral.'"] });
|
|
458
|
+
const fields = self.fields ?? {};
|
|
459
|
+
const schemaWithId = Schema3.extend(self, Schema3.Struct({
|
|
460
|
+
id: Schema3.String
|
|
461
|
+
}));
|
|
462
|
+
const ast = SchemaAST3.annotations(schemaWithId.ast, {
|
|
463
|
+
// TODO(dmaretskyi): `extend` kills the annotations.
|
|
464
|
+
...self.ast.annotations,
|
|
465
|
+
[TypeAnnotationId]: {
|
|
466
|
+
kind: EntityKind.Relation,
|
|
467
|
+
typename,
|
|
468
|
+
version: version2,
|
|
469
|
+
sourceSchema: sourceDXN,
|
|
470
|
+
targetSchema: targetDXN
|
|
471
|
+
},
|
|
472
|
+
// TODO(dmaretskyi): TypeIdentifierAnnotationId?
|
|
473
|
+
[SchemaAST3.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
|
|
474
|
+
kind: EntityKind.Relation,
|
|
475
|
+
typename,
|
|
476
|
+
version: version2,
|
|
477
|
+
relationSource: sourceDXN,
|
|
478
|
+
relationTarget: targetDXN
|
|
479
|
+
})
|
|
480
|
+
});
|
|
481
|
+
return makeEchoTypeSchema(fields, ast, typename, version2, EntityKind.Relation, () => toJsonSchema(Schema3.make(ast)), explicitId);
|
|
482
|
+
};
|
|
483
|
+
};
|
|
484
|
+
var getDXNForRelationSchemaRef = (schema) => {
|
|
485
|
+
assertArgument(Schema3.isSchema(schema), "schema");
|
|
486
|
+
const identifier = getTypeIdentifierAnnotation(schema);
|
|
487
|
+
if (identifier) {
|
|
488
|
+
return DXN2.tryMake(identifier) ?? raise(new Error(`Invalid schema identifier: ${identifier}`));
|
|
489
|
+
}
|
|
490
|
+
const typename = getSchemaTypename(schema);
|
|
491
|
+
if (!typename) {
|
|
492
|
+
throw new Error("Schema must have a typename");
|
|
493
|
+
}
|
|
494
|
+
return DXN2.make(typename);
|
|
495
|
+
};
|
|
496
|
+
var makeRelationType = (options) => {
|
|
497
|
+
const type = EchoRelationSchema({
|
|
498
|
+
dxn: options.dxn,
|
|
499
|
+
source: options.source,
|
|
500
|
+
target: options.target,
|
|
501
|
+
id: options.id
|
|
502
|
+
})(options.schema);
|
|
503
|
+
const constructor = function RelationType() {
|
|
504
|
+
};
|
|
505
|
+
Object.setPrototypeOf(constructor, type);
|
|
506
|
+
return constructor;
|
|
507
|
+
};
|
|
508
|
+
|
|
509
|
+
// src/internal/Entity/type-kind.ts
|
|
510
|
+
import * as Schema4 from "effect/Schema";
|
|
511
|
+
import * as SchemaAST4 from "effect/SchemaAST";
|
|
512
|
+
import { invariant as invariant3 } from "@dxos/invariant";
|
|
513
|
+
import { DXN as DXN3 } from "@dxos/keys";
|
|
514
|
+
var __dxlog_file3 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Entity/type-kind.ts";
|
|
515
|
+
var EchoTypeKindSchema = (dxn, options) => {
|
|
516
|
+
const typename = DXN3.getName(dxn);
|
|
517
|
+
const version2 = DXN3.getVersion(dxn);
|
|
518
|
+
invariant3(version2, `Type-kind schemas require a versioned DXN: ${dxn}`, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 22, S: void 0, A: ["version", "`Type-kind schemas require a versioned DXN: ${dxn}`"] });
|
|
519
|
+
return (self) => {
|
|
520
|
+
invariant3(SchemaAST4.isTypeLiteral(self.ast), "Schema must be a TypeLiteral.", { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 24, S: void 0, A: ["SchemaAST.isTypeLiteral(self.ast)", "'Schema must be a TypeLiteral.'"] });
|
|
521
|
+
const fields = self.fields ?? {};
|
|
522
|
+
const schemaWithId = Schema4.extend(self, Schema4.Struct({
|
|
523
|
+
id: Schema4.String
|
|
524
|
+
}));
|
|
525
|
+
const ast = SchemaAST4.annotations(schemaWithId.ast, {
|
|
526
|
+
...self.ast.annotations,
|
|
527
|
+
[TypeAnnotationId]: {
|
|
528
|
+
kind: EntityKind.Type,
|
|
529
|
+
typename,
|
|
530
|
+
version: version2
|
|
531
|
+
},
|
|
532
|
+
[SchemaAST4.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
|
|
533
|
+
kind: EntityKind.Type,
|
|
534
|
+
typename,
|
|
535
|
+
version: version2
|
|
536
|
+
})
|
|
537
|
+
});
|
|
538
|
+
return makeEchoTypeSchema(fields, ast, typename, version2, EntityKind.Type, () => toJsonSchema(Schema4.make(ast)), options?.id);
|
|
539
|
+
};
|
|
540
|
+
};
|
|
541
|
+
|
|
542
|
+
// src/internal/Entity/version.ts
|
|
543
|
+
import { assertArgument as assertArgument2 } from "@dxos/invariant";
|
|
544
|
+
var unversioned = {
|
|
545
|
+
[VersionTypeId]: {},
|
|
546
|
+
versioned: false
|
|
547
|
+
};
|
|
548
|
+
var isVersion = (entity) => {
|
|
549
|
+
return entity != null && typeof entity === "object" && VersionTypeId in entity;
|
|
550
|
+
};
|
|
551
|
+
var version = (entity) => {
|
|
552
|
+
const ver = entity[ObjectVersionId];
|
|
553
|
+
if (ver === void 0) {
|
|
554
|
+
return unversioned;
|
|
555
|
+
}
|
|
556
|
+
return ver;
|
|
557
|
+
};
|
|
558
|
+
var versionValid = (ver) => {
|
|
559
|
+
assertArgument2(isVersion(ver), "version", "Invalid version object");
|
|
560
|
+
return !!ver.versioned;
|
|
561
|
+
};
|
|
562
|
+
var compareVersions = (version1, version2) => {
|
|
563
|
+
assertArgument2(isVersion(version1), "version1", "Invalid version object");
|
|
564
|
+
assertArgument2(isVersion(version2), "version2", "Invalid version object");
|
|
565
|
+
if (!versionValid(version1) || !versionValid(version2)) {
|
|
566
|
+
return "unversioned";
|
|
567
|
+
}
|
|
568
|
+
if (version1.automergeHeads?.length !== version2.automergeHeads?.length) {
|
|
569
|
+
return "different";
|
|
570
|
+
}
|
|
571
|
+
if (version1.automergeHeads?.some((head) => !version2.automergeHeads?.includes(head))) {
|
|
572
|
+
return "different";
|
|
573
|
+
}
|
|
574
|
+
return "equal";
|
|
575
|
+
};
|
|
576
|
+
var encodeVersion = (ver) => {
|
|
577
|
+
return JSON.stringify(ver);
|
|
578
|
+
};
|
|
579
|
+
var decodeVersion = (ver) => {
|
|
580
|
+
const parsed = JSON.parse(ver);
|
|
581
|
+
parsed[VersionTypeId] = {};
|
|
582
|
+
return parsed;
|
|
583
|
+
};
|
|
584
|
+
|
|
585
|
+
// src/internal/Filter/match.ts
|
|
586
|
+
import * as semver from "semver";
|
|
587
|
+
import { EncodedReference, isEncodedReference as isEncodedReference2 } from "@dxos/echo-protocol";
|
|
588
|
+
import { DXN as DXN4, EID as EID3 } from "@dxos/keys";
|
|
589
|
+
|
|
590
|
+
// src/internal/Obj/json-serializer.ts
|
|
591
|
+
import * as Schema5 from "effect/Schema";
|
|
592
|
+
import { raise as raise2 } from "@dxos/debug";
|
|
593
|
+
import { EntityStructure, isEncodedReference } from "@dxos/echo-protocol";
|
|
594
|
+
import { assertArgument as assertArgument3, invariant as invariant4 } from "@dxos/invariant";
|
|
595
|
+
import { EID as EID2, EntityId, URI } from "@dxos/keys";
|
|
596
|
+
import { assumeType, decodeUint8ArrayFromJson, deepMapValues, isEncodedUint8Array, visitValues } from "@dxos/util";
|
|
597
|
+
var __dxlog_file4 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Obj/json-serializer.ts";
|
|
598
|
+
var objectToJSON = (obj) => {
|
|
599
|
+
const typename = getTypeURI(obj);
|
|
600
|
+
invariant4(typename && typeof typename === "string", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 23, S: void 0, A: ["typename && typeof typename === 'string'", ""] });
|
|
601
|
+
return typedJsonSerializer.call(obj);
|
|
602
|
+
};
|
|
603
|
+
var objectFromJSON = async (jsonData, { refResolver, uri, database, parent } = {}) => {
|
|
604
|
+
assumeType(jsonData);
|
|
605
|
+
assertArgument3(typeof jsonData === "object" && jsonData !== null, "jsonData", "expect object");
|
|
606
|
+
assertArgument3(typeof jsonData[ATTR_TYPE] === "string", "jsonData[ATTR_TYPE]", "expected object to have a type");
|
|
607
|
+
assertArgument3(typeof jsonData.id === "string", "jsonData.id", "expected object to have an id");
|
|
608
|
+
const type = URI.make(jsonData[ATTR_TYPE]);
|
|
609
|
+
const schema = await refResolver?.resolveSchema(type);
|
|
610
|
+
invariant4(schema === void 0 || Schema5.isSchema(schema), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 43, S: void 0, A: ["schema === undefined || Schema.isSchema(schema)", ""] });
|
|
611
|
+
const decodedInput = restoreUint8Arrays(stripInternalJsonKeys(jsonData));
|
|
612
|
+
let obj;
|
|
613
|
+
if (schema != null) {
|
|
614
|
+
obj = await schema.pipe(Schema5.decodeUnknownPromise)(decodedInput);
|
|
615
|
+
if (refResolver) {
|
|
616
|
+
setRefResolverOnData(obj, refResolver);
|
|
617
|
+
}
|
|
618
|
+
} else {
|
|
619
|
+
obj = decodeGeneric(decodedInput, {
|
|
620
|
+
refResolver
|
|
621
|
+
});
|
|
622
|
+
}
|
|
623
|
+
invariant4(EntityId.isValid(obj.id), "Invalid object id", { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 56, S: void 0, A: ["EntityId.isValid(obj.id)", "'Invalid object id'"] });
|
|
624
|
+
setTypename(obj, type);
|
|
625
|
+
if (schema) {
|
|
626
|
+
setSchema(obj, schema);
|
|
627
|
+
}
|
|
628
|
+
if (refResolver?.resolveType) {
|
|
629
|
+
const typeEntity = await refResolver.resolveType(type);
|
|
630
|
+
if (typeEntity != null) {
|
|
631
|
+
setType(obj, typeEntity);
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
const isRelation = typeof jsonData[ATTR_RELATION_SOURCE] === "string" || typeof jsonData[ATTR_RELATION_TARGET] === "string";
|
|
635
|
+
if (isRelation) {
|
|
636
|
+
const sourceDxn = jsonData[ATTR_RELATION_SOURCE] ?? raise2(new TypeError("Missing relation source"));
|
|
637
|
+
const targetDxn = jsonData[ATTR_RELATION_TARGET] ?? raise2(new TypeError("Missing relation target"));
|
|
638
|
+
const source = await refResolver?.resolveLegacy(sourceDxn);
|
|
639
|
+
const target = await refResolver?.resolveLegacy(targetDxn);
|
|
640
|
+
defineHiddenProperty(obj, KindId, EntityKind.Relation);
|
|
641
|
+
defineHiddenProperty(obj, RelationSourceDXNId, sourceDxn);
|
|
642
|
+
defineHiddenProperty(obj, RelationTargetDXNId, targetDxn);
|
|
643
|
+
defineHiddenProperty(obj, RelationSourceId, source);
|
|
644
|
+
defineHiddenProperty(obj, RelationTargetId, target);
|
|
645
|
+
} else {
|
|
646
|
+
const annotationKind = schema != null ? getTypeAnnotation(schema)?.kind : void 0;
|
|
647
|
+
defineHiddenProperty(obj, KindId, annotationKind === EntityKind.Type ? EntityKind.Type : EntityKind.Object);
|
|
648
|
+
}
|
|
649
|
+
if (typeof jsonData[ATTR_META] === "object") {
|
|
650
|
+
const meta = await EntityMetaSchema.pipe(Schema5.decodeUnknownPromise)(normalizeMeta(jsonData[ATTR_META]));
|
|
651
|
+
invariant4(Array.isArray(meta.keys), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 92, S: void 0, A: ["Array.isArray(meta.keys)", ""] });
|
|
652
|
+
defineHiddenProperty(obj, MetaId, meta);
|
|
653
|
+
} else {
|
|
654
|
+
defineHiddenProperty(obj, MetaId, {
|
|
655
|
+
keys: [],
|
|
656
|
+
tags: [],
|
|
657
|
+
annotations: {}
|
|
658
|
+
});
|
|
659
|
+
}
|
|
660
|
+
if (jsonData[ATTR_PARENT]) {
|
|
661
|
+
const parentDxn = jsonData[ATTR_PARENT];
|
|
662
|
+
const resolvedParent = await refResolver?.resolveLegacy(parentDxn);
|
|
663
|
+
defineHiddenProperty(obj, ParentId, resolvedParent);
|
|
664
|
+
} else if (parent) {
|
|
665
|
+
defineHiddenProperty(obj, ParentId, parent);
|
|
666
|
+
}
|
|
667
|
+
if (uri) {
|
|
668
|
+
defineHiddenProperty(obj, SelfURIId, uri);
|
|
669
|
+
}
|
|
670
|
+
if (database) {
|
|
671
|
+
defineHiddenProperty(obj, ObjectDatabaseId, database);
|
|
672
|
+
}
|
|
673
|
+
assertObjectModel(obj);
|
|
674
|
+
invariant4(obj[ATTR_TYPE] === void 0, "Invalid object model", { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 115, S: void 0, A: ["obj[ATTR_TYPE] === undefined", "'Invalid object model'"] });
|
|
675
|
+
invariant4(obj[ATTR_META] === void 0, "Invalid object model", { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 116, S: void 0, A: ["obj[ATTR_META] === undefined", "'Invalid object model'"] });
|
|
676
|
+
invariant4(obj[ATTR_DELETED] === void 0, "Invalid object model", { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 117, S: void 0, A: ["obj[ATTR_DELETED] === undefined", "'Invalid object model'"] });
|
|
677
|
+
invariant4(obj[ATTR_SELF_URI] === void 0, "Invalid object model", { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 118, S: void 0, A: ["obj[ATTR_SELF_URI] === undefined", "'Invalid object model'"] });
|
|
678
|
+
invariant4(obj[ATTR_SELF_URI_LEGACY] === void 0, "Invalid object model", { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 119, S: void 0, A: ["obj[ATTR_SELF_URI_LEGACY] === undefined", "'Invalid object model'"] });
|
|
679
|
+
invariant4(obj[ATTR_RELATION_SOURCE] === void 0, "Invalid object model", { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 120, S: void 0, A: ["obj[ATTR_RELATION_SOURCE] === undefined", "'Invalid object model'"] });
|
|
680
|
+
invariant4(obj[ATTR_RELATION_TARGET] === void 0, "Invalid object model", { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 121, S: void 0, A: ["obj[ATTR_RELATION_TARGET] === undefined", "'Invalid object model'"] });
|
|
681
|
+
return obj;
|
|
682
|
+
};
|
|
683
|
+
var normalizeMeta = (meta) => {
|
|
684
|
+
const tags = Array.isArray(meta?.tags) ? meta.tags.map((tag) => typeof tag === "string" ? {
|
|
685
|
+
"/": URI.make(tag)
|
|
686
|
+
} : tag) : [];
|
|
687
|
+
return {
|
|
688
|
+
...meta,
|
|
689
|
+
keys: Array.isArray(meta?.keys) ? meta.keys : [],
|
|
690
|
+
tags,
|
|
691
|
+
annotations: meta?.annotations ?? {}
|
|
692
|
+
};
|
|
693
|
+
};
|
|
694
|
+
var decodeGeneric = (jsonData, options) => {
|
|
695
|
+
const props = stripInternalJsonKeys(jsonData);
|
|
696
|
+
return deepMapValues(props, (value2, visitor) => {
|
|
697
|
+
if (isEncodedReference(value2)) {
|
|
698
|
+
return refFromEncodedReference(value2, options.refResolver);
|
|
699
|
+
}
|
|
700
|
+
if (isEncodedUint8Array(value2)) {
|
|
701
|
+
return decodeUint8ArrayFromJson(value2);
|
|
702
|
+
}
|
|
703
|
+
return visitor(value2);
|
|
704
|
+
});
|
|
705
|
+
};
|
|
706
|
+
var restoreUint8Arrays = (data) => deepMapValues(data, (value2, recurse) => {
|
|
707
|
+
if (isEncodedUint8Array(value2)) {
|
|
708
|
+
return decodeUint8ArrayFromJson(value2);
|
|
709
|
+
}
|
|
710
|
+
return recurse(value2);
|
|
711
|
+
});
|
|
712
|
+
var stripInternalJsonKeys = (jsonData) => {
|
|
713
|
+
const { [ATTR_TYPE]: _type, [ATTR_META]: _meta, [ATTR_DELETED]: _deleted, [ATTR_SELF_URI]: _selfUri, [ATTR_SELF_URI_LEGACY]: _legacySelfUri, [ATTR_RELATION_SOURCE]: _relationSource, [ATTR_RELATION_TARGET]: _relationTarget, ...props } = jsonData;
|
|
714
|
+
return props;
|
|
715
|
+
};
|
|
716
|
+
var setRefResolverOnData = (obj, refResolver) => {
|
|
717
|
+
const visitor = (value2) => {
|
|
718
|
+
if (Ref.isRef(value2)) {
|
|
719
|
+
setRefResolver(value2, refResolver);
|
|
720
|
+
} else {
|
|
721
|
+
visitValues(value2, visitor);
|
|
722
|
+
}
|
|
723
|
+
};
|
|
724
|
+
visitor(obj);
|
|
725
|
+
};
|
|
726
|
+
var objectStructureToJson = (objectId, structure) => {
|
|
727
|
+
const typeRef = EntityStructure.getTypeReference(structure)?.["/"];
|
|
728
|
+
const parent = EntityStructure.getParent(structure)?.["/"];
|
|
729
|
+
const source = EntityStructure.getRelationSource(structure)?.["/"];
|
|
730
|
+
const target = EntityStructure.getRelationTarget(structure)?.["/"];
|
|
731
|
+
return {
|
|
732
|
+
...structure.data,
|
|
733
|
+
id: objectId,
|
|
734
|
+
[ATTR_TYPE]: typeRef ? URI.make(typeRef) : void 0,
|
|
735
|
+
[ATTR_DELETED]: EntityStructure.isDeleted(structure),
|
|
736
|
+
[ATTR_PARENT]: parent !== void 0 ? EID2.tryParse(parent) : void 0,
|
|
737
|
+
[ATTR_RELATION_SOURCE]: source !== void 0 ? EID2.tryParse(source) : void 0,
|
|
738
|
+
[ATTR_RELATION_TARGET]: target !== void 0 ? EID2.tryParse(target) : void 0
|
|
739
|
+
};
|
|
740
|
+
};
|
|
741
|
+
|
|
742
|
+
// src/internal/Filter/match.ts
|
|
743
|
+
var matchesTag = (tags, filterTag) => {
|
|
744
|
+
const canonical = (uri) => {
|
|
745
|
+
const eid = EID3.tryParse(uri);
|
|
746
|
+
return eid && EID3.getEntityId(eid) || uri;
|
|
747
|
+
};
|
|
748
|
+
const normalize = (tag) => canonical(isEncodedReference2(tag) ? EncodedReference.toURI(tag) : tag);
|
|
749
|
+
const target = canonical(filterTag);
|
|
750
|
+
return tags.some((tag) => normalize(tag) === target);
|
|
751
|
+
};
|
|
752
|
+
var matchMetaKey = (key, versionRange, objKey, objVersion) => {
|
|
753
|
+
if (objKey !== key) {
|
|
754
|
+
return false;
|
|
755
|
+
}
|
|
756
|
+
if (versionRange === void 0) {
|
|
757
|
+
return true;
|
|
758
|
+
}
|
|
759
|
+
if (objVersion === void 0 || semver.valid(objVersion) === null) {
|
|
760
|
+
return false;
|
|
761
|
+
}
|
|
762
|
+
if (semver.validRange(versionRange) === null) {
|
|
763
|
+
return false;
|
|
764
|
+
}
|
|
765
|
+
return semver.satisfies(objVersion, versionRange, {
|
|
766
|
+
includePrerelease: true
|
|
767
|
+
});
|
|
768
|
+
};
|
|
769
|
+
var compareTypenameStrings = (expectedStr, actualStr) => {
|
|
770
|
+
const expectedEid = EID3.tryParse(expectedStr);
|
|
771
|
+
if (expectedEid) {
|
|
772
|
+
const actualEid = EID3.tryParse(actualStr);
|
|
773
|
+
if (!actualEid) {
|
|
774
|
+
return false;
|
|
775
|
+
}
|
|
776
|
+
if (EID3.getEntityId(expectedEid) !== EID3.getEntityId(actualEid)) {
|
|
777
|
+
return false;
|
|
778
|
+
}
|
|
779
|
+
const expectedSpaceId = EID3.getSpaceId(expectedEid);
|
|
780
|
+
const actualSpaceId = EID3.getSpaceId(actualEid);
|
|
781
|
+
return expectedSpaceId === void 0 || actualSpaceId === void 0 || expectedSpaceId === actualSpaceId;
|
|
782
|
+
}
|
|
783
|
+
const expectedDxn = DXN4.tryMake(expectedStr);
|
|
784
|
+
if (expectedDxn) {
|
|
785
|
+
const actualDxn = DXN4.tryMake(actualStr);
|
|
786
|
+
if (!actualDxn) {
|
|
787
|
+
return false;
|
|
788
|
+
}
|
|
789
|
+
if (DXN4.getName(expectedDxn) !== DXN4.getName(actualDxn)) {
|
|
790
|
+
return false;
|
|
791
|
+
}
|
|
792
|
+
const expectedVersion = DXN4.getVersion(expectedDxn);
|
|
793
|
+
const actualVersion = DXN4.getVersion(actualDxn);
|
|
794
|
+
return expectedVersion === void 0 || actualVersion === void 0 || expectedVersion === actualVersion;
|
|
795
|
+
}
|
|
796
|
+
return expectedStr === actualStr;
|
|
797
|
+
};
|
|
798
|
+
var structuralMatch = (filterObj, targetObj, strict = true) => {
|
|
799
|
+
if (typeof filterObj !== "object" || filterObj === null) {
|
|
800
|
+
return filterObj === targetObj;
|
|
801
|
+
}
|
|
802
|
+
if (typeof targetObj !== "object" || targetObj === null) {
|
|
803
|
+
return false;
|
|
804
|
+
}
|
|
805
|
+
const filterKeys = Object.keys(filterObj);
|
|
806
|
+
const targetKeys = Object.keys(targetObj);
|
|
807
|
+
if (strict && filterKeys.length !== targetKeys.length) {
|
|
808
|
+
return false;
|
|
809
|
+
}
|
|
810
|
+
return filterKeys.every((key) => {
|
|
811
|
+
if (!(key in targetObj)) {
|
|
812
|
+
return false;
|
|
813
|
+
}
|
|
814
|
+
const filterValue = filterObj[key];
|
|
815
|
+
const targetValue = targetObj[key];
|
|
816
|
+
if (typeof filterValue === "object" && filterValue !== null) {
|
|
817
|
+
return structuralMatch(filterValue, targetValue);
|
|
818
|
+
}
|
|
819
|
+
return filterValue === targetValue;
|
|
820
|
+
});
|
|
821
|
+
};
|
|
822
|
+
var filterMatchValue = (filter, value2) => {
|
|
823
|
+
switch (filter.type) {
|
|
824
|
+
case "compare": {
|
|
825
|
+
const compareValue = filter.value;
|
|
826
|
+
switch (filter.operator) {
|
|
827
|
+
case "eq":
|
|
828
|
+
if (isEncodedReference2(compareValue)) {
|
|
829
|
+
if (!isEncodedReference2(value2)) {
|
|
830
|
+
return false;
|
|
831
|
+
}
|
|
832
|
+
return EncodedReference.toURI(value2) === EncodedReference.toURI(compareValue);
|
|
833
|
+
}
|
|
834
|
+
return value2 === compareValue;
|
|
835
|
+
case "neq":
|
|
836
|
+
return value2 !== compareValue;
|
|
837
|
+
case "gt":
|
|
838
|
+
return value2 > compareValue;
|
|
839
|
+
case "gte":
|
|
840
|
+
return value2 >= compareValue;
|
|
841
|
+
case "lt":
|
|
842
|
+
return value2 < compareValue;
|
|
843
|
+
case "lte":
|
|
844
|
+
return value2 <= compareValue;
|
|
845
|
+
default:
|
|
846
|
+
return false;
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
case "object": {
|
|
850
|
+
if (typeof value2 !== "object" || value2 === null) {
|
|
851
|
+
return false;
|
|
852
|
+
}
|
|
853
|
+
if (filter.props) {
|
|
854
|
+
for (const [key, valueFilter] of Object.entries(filter.props)) {
|
|
855
|
+
const nestedValue = value2[key];
|
|
856
|
+
if (!filterMatchValue(valueFilter, nestedValue)) {
|
|
857
|
+
return false;
|
|
858
|
+
}
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
return true;
|
|
862
|
+
}
|
|
863
|
+
case "in": {
|
|
864
|
+
return filter.values.includes(value2);
|
|
865
|
+
}
|
|
866
|
+
case "contains": {
|
|
867
|
+
if (!Array.isArray(value2)) {
|
|
868
|
+
return false;
|
|
869
|
+
}
|
|
870
|
+
return value2.some((element) => {
|
|
871
|
+
if (typeof filter.value === "object" && filter.value !== null && !Array.isArray(filter.value)) {
|
|
872
|
+
return structuralMatch(filter.value, element);
|
|
873
|
+
}
|
|
874
|
+
return element === filter.value;
|
|
875
|
+
});
|
|
876
|
+
}
|
|
877
|
+
case "range": {
|
|
878
|
+
return value2 >= filter.from && value2 <= filter.to;
|
|
879
|
+
}
|
|
880
|
+
case "not": {
|
|
881
|
+
return !filterMatchValue(filter.filter, value2);
|
|
882
|
+
}
|
|
883
|
+
case "and": {
|
|
884
|
+
return filter.filters.every((f) => filterMatchValue(f, value2));
|
|
885
|
+
}
|
|
886
|
+
case "or": {
|
|
887
|
+
return filter.filters.some((f) => filterMatchValue(f, value2));
|
|
888
|
+
}
|
|
889
|
+
default:
|
|
890
|
+
return false;
|
|
891
|
+
}
|
|
892
|
+
};
|
|
893
|
+
var filterMatchEntity = (filter, entity) => {
|
|
894
|
+
switch (filter.type) {
|
|
895
|
+
case "object": {
|
|
896
|
+
if (filter.typename !== null) {
|
|
897
|
+
const typeURI = getTypeURI(entity);
|
|
898
|
+
if (!typeURI || !compareTypenameStrings(filter.typename, typeURI)) {
|
|
899
|
+
return false;
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
if (filter.id && filter.id.length > 0 && !filter.id.includes(entity.id)) {
|
|
903
|
+
return false;
|
|
904
|
+
}
|
|
905
|
+
if (filter.props) {
|
|
906
|
+
let json = null;
|
|
907
|
+
try {
|
|
908
|
+
json = objectToJSON(entity);
|
|
909
|
+
} catch {
|
|
910
|
+
}
|
|
911
|
+
if (json === null) {
|
|
912
|
+
return false;
|
|
913
|
+
}
|
|
914
|
+
for (const [key, valueFilter] of Object.entries(filter.props)) {
|
|
915
|
+
if (key.startsWith("@")) {
|
|
916
|
+
continue;
|
|
917
|
+
}
|
|
918
|
+
if (!filterMatchValue(valueFilter, json[key])) {
|
|
919
|
+
return false;
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
}
|
|
923
|
+
const meta = getMetaChecked(entity);
|
|
924
|
+
if (filter.foreignKeys && filter.foreignKeys.length > 0) {
|
|
925
|
+
const hasKey = filter.foreignKeys.some((fk) => meta.keys.some((k) => k.source === fk.source && k.id === fk.id));
|
|
926
|
+
if (!hasKey) {
|
|
927
|
+
return false;
|
|
928
|
+
}
|
|
929
|
+
}
|
|
930
|
+
if (filter.metaKey !== void 0) {
|
|
931
|
+
if (!matchMetaKey(filter.metaKey, filter.metaVersion, meta.key, meta.version)) {
|
|
932
|
+
return false;
|
|
933
|
+
}
|
|
934
|
+
}
|
|
935
|
+
return true;
|
|
936
|
+
}
|
|
937
|
+
case "tag": {
|
|
938
|
+
const rawTags = getMetaChecked(entity).tags;
|
|
939
|
+
const tags = rawTags.map((tag) => typeof tag?.encode === "function" ? tag.encode() : tag);
|
|
940
|
+
return matchesTag(tags, filter.tag);
|
|
941
|
+
}
|
|
942
|
+
case "text-search": {
|
|
943
|
+
return false;
|
|
944
|
+
}
|
|
945
|
+
case "timestamp": {
|
|
946
|
+
throw new Error("Timestamp filters must be handled at the index level, not in-memory matching.");
|
|
947
|
+
}
|
|
948
|
+
case "child-of": {
|
|
949
|
+
throw new Error("child-of filters must be handled at the executor level, not in-memory matching.");
|
|
950
|
+
}
|
|
951
|
+
case "not": {
|
|
952
|
+
return !filterMatchEntity(filter.filter, entity);
|
|
953
|
+
}
|
|
954
|
+
case "and": {
|
|
955
|
+
return filter.filters.every((f) => filterMatchEntity(f, entity));
|
|
956
|
+
}
|
|
957
|
+
case "or": {
|
|
958
|
+
return filter.filters.some((f) => filterMatchEntity(f, entity));
|
|
959
|
+
}
|
|
960
|
+
default:
|
|
961
|
+
return false;
|
|
962
|
+
}
|
|
963
|
+
};
|
|
964
|
+
|
|
965
|
+
// src/internal/Obj/common.ts
|
|
966
|
+
import * as Schema6 from "effect/Schema";
|
|
967
|
+
var makeTypedEntityClass = (typename, version2, baseSchema) => {
|
|
968
|
+
return class {
|
|
969
|
+
// Implement TypedObject properties.
|
|
970
|
+
static typename = typename;
|
|
971
|
+
static version = version2;
|
|
972
|
+
// Implement Schema.Schema properties.
|
|
973
|
+
// TODO(burdon): Comment required.
|
|
974
|
+
static [Schema6.TypeId] = schemaVariance;
|
|
975
|
+
static ast = baseSchema.ast;
|
|
976
|
+
static annotations = baseSchema.annotations.bind(baseSchema);
|
|
977
|
+
static pipe = baseSchema.pipe.bind(baseSchema);
|
|
978
|
+
// TODO(burdon): Comment required.
|
|
979
|
+
static [Symbol.hasInstance](obj) {
|
|
980
|
+
return obj != null && getTypename(obj) === typename;
|
|
981
|
+
}
|
|
982
|
+
// TODO(burdon): Throw APIError.
|
|
983
|
+
constructor() {
|
|
984
|
+
throw new Error("Use live(Typename, { ...fields }) to instantiate an object.");
|
|
985
|
+
}
|
|
986
|
+
};
|
|
987
|
+
};
|
|
988
|
+
var schemaVariance = {
|
|
989
|
+
_A: (_) => _,
|
|
990
|
+
_I: (_) => _,
|
|
991
|
+
_R: (_) => _
|
|
992
|
+
};
|
|
993
|
+
|
|
994
|
+
// src/internal/Obj/create-object.ts
|
|
995
|
+
import { raise as raise3 } from "@dxos/debug";
|
|
996
|
+
import { assertArgument as assertArgument4, failedInvariant } from "@dxos/invariant";
|
|
997
|
+
import { EntityId as EntityId2 } from "@dxos/keys";
|
|
998
|
+
|
|
999
|
+
// src/internal/Obj/inspect.ts
|
|
1000
|
+
import { inspectCustom } from "@dxos/debug";
|
|
1001
|
+
var attachedTypedObjectInspector = (obj) => {
|
|
1002
|
+
const descriptor = Object.getOwnPropertyDescriptor(obj, inspectCustom);
|
|
1003
|
+
if (descriptor) {
|
|
1004
|
+
return;
|
|
1005
|
+
}
|
|
1006
|
+
Object.defineProperty(obj, inspectCustom, {
|
|
1007
|
+
value: typedObjectInspectFunction,
|
|
1008
|
+
writable: false,
|
|
1009
|
+
enumerable: false,
|
|
1010
|
+
configurable: true
|
|
1011
|
+
});
|
|
1012
|
+
};
|
|
1013
|
+
var typedObjectInspectFunction = function(depth, options, inspect) {
|
|
1014
|
+
const { id, ...props } = this;
|
|
1015
|
+
return inspect({
|
|
1016
|
+
id,
|
|
1017
|
+
[ATTR_TYPE]: getTypeURI(this),
|
|
1018
|
+
...props,
|
|
1019
|
+
[ATTR_META]: this[MetaId]
|
|
1020
|
+
}, options);
|
|
1021
|
+
};
|
|
1022
|
+
|
|
1023
|
+
// src/internal/Obj/create-object.ts
|
|
1024
|
+
var createObject = (input, props) => {
|
|
1025
|
+
const schema = getStaticTypeSchema(input) ?? failedInvariant("Type entity is missing its source schema");
|
|
1026
|
+
const annotation = getTypeAnnotation(schema);
|
|
1027
|
+
if (!annotation) {
|
|
1028
|
+
throw new Error("Schema is not an ECHO schema");
|
|
1029
|
+
}
|
|
1030
|
+
assertArgument4(!("@type" in props), "data", "@type is not allowed");
|
|
1031
|
+
assertArgument4(!(RelationSourceDXNId in props), "data", "Relation source DXN is not allowed in the constructor");
|
|
1032
|
+
assertArgument4(!(RelationTargetDXNId in props), "data", "Relation target DXN is not allowed in the constructor");
|
|
1033
|
+
assertArgument4(RelationSourceId in props === RelationTargetId in props, "data", "Relation source and target must be provided together");
|
|
1034
|
+
const metaOverride = props[MetaId];
|
|
1035
|
+
if (metaOverride !== void 0) {
|
|
1036
|
+
delete props[MetaId];
|
|
1037
|
+
}
|
|
1038
|
+
const obj = {
|
|
1039
|
+
...props,
|
|
1040
|
+
id: props.id ?? EntityId2.random()
|
|
1041
|
+
};
|
|
1042
|
+
const kind = annotation.kind === EntityKind.Type ? EntityKind.Type : annotation.kind === EntityKind.Relation || RelationSourceId in props ? EntityKind.Relation : EntityKind.Object;
|
|
1043
|
+
defineHiddenProperty(obj, KindId, kind);
|
|
1044
|
+
defineHiddenProperty(obj, MetaId, {
|
|
1045
|
+
...metaOverride,
|
|
1046
|
+
keys: metaOverride?.keys ?? [],
|
|
1047
|
+
tags: metaOverride?.tags ?? [],
|
|
1048
|
+
annotations: metaOverride?.annotations ?? {}
|
|
1049
|
+
});
|
|
1050
|
+
setSchema(obj, schema);
|
|
1051
|
+
if (input !== schema) {
|
|
1052
|
+
setType(obj, input);
|
|
1053
|
+
}
|
|
1054
|
+
setTypename(obj, getSchemaURI(schema) ?? failedInvariant("Missing schema URI"));
|
|
1055
|
+
attachTypedJsonSerializer(obj);
|
|
1056
|
+
attachedTypedObjectInspector(obj);
|
|
1057
|
+
if (kind === EntityKind.Relation) {
|
|
1058
|
+
const sourceDXN = getObjectEchoUri(props[RelationSourceId]) ?? raise3(new Error("Unresolved relation source"));
|
|
1059
|
+
const targetDXN = getObjectEchoUri(props[RelationTargetId]) ?? raise3(new Error("Unresolved relation target"));
|
|
1060
|
+
defineHiddenProperty(obj, RelationSourceDXNId, sourceDXN);
|
|
1061
|
+
defineHiddenProperty(obj, RelationTargetDXNId, targetDXN);
|
|
1062
|
+
}
|
|
1063
|
+
assertObjectModel(obj);
|
|
1064
|
+
return obj;
|
|
1065
|
+
};
|
|
1066
|
+
|
|
1067
|
+
// src/internal/Obj/deleted.ts
|
|
1068
|
+
var isDeleted = (obj) => {
|
|
1069
|
+
if (obj[ObjectDeletedId] === void 0) {
|
|
1070
|
+
return false;
|
|
1071
|
+
}
|
|
1072
|
+
return obj[ObjectDeletedId] ?? false;
|
|
1073
|
+
};
|
|
1074
|
+
|
|
1075
|
+
// src/internal/Obj/set-value.ts
|
|
1076
|
+
import * as Match from "effect/Match";
|
|
1077
|
+
import * as Option from "effect/Option";
|
|
1078
|
+
import * as SchemaAST5 from "effect/SchemaAST";
|
|
1079
|
+
import { SchemaEx } from "@dxos/effect";
|
|
1080
|
+
import { invariant as invariant5 } from "@dxos/invariant";
|
|
1081
|
+
var __dxlog_file5 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Obj/set-value.ts";
|
|
1082
|
+
var setValue = (obj, path, value2) => {
|
|
1083
|
+
invariant5(path.length > 0, "Path must not be empty", { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 14, S: void 0, A: ["path.length > 0", "'Path must not be empty'"] });
|
|
1084
|
+
const schema = getSchema(obj);
|
|
1085
|
+
invariant5(schema != null, "Object must have a schema", { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 16, S: void 0, A: ["schema != null", "'Object must have a schema'"] });
|
|
1086
|
+
let parent = obj;
|
|
1087
|
+
let currentAST = schema.ast;
|
|
1088
|
+
for (let i = 0; i < path.length - 1; i++) {
|
|
1089
|
+
const part = path[i];
|
|
1090
|
+
const key = typeof part === "number" ? part : String(part);
|
|
1091
|
+
if (parent[key] === void 0) {
|
|
1092
|
+
const propertyAST = getPropertyAST(currentAST, String(part));
|
|
1093
|
+
const shouldBeArray = propertyAST ? SchemaEx.isArrayType(propertyAST) : false;
|
|
1094
|
+
if (shouldBeArray) {
|
|
1095
|
+
parent[key] = [];
|
|
1096
|
+
} else {
|
|
1097
|
+
const objWithDefaults = createObjectWithDefaults(propertyAST);
|
|
1098
|
+
parent[key] = objWithDefaults;
|
|
1099
|
+
}
|
|
1100
|
+
}
|
|
1101
|
+
parent = parent[key];
|
|
1102
|
+
currentAST = getPropertyAST(currentAST, String(part));
|
|
1103
|
+
}
|
|
1104
|
+
const finalKey = path[path.length - 1];
|
|
1105
|
+
parent[finalKey] = value2;
|
|
1106
|
+
return value2;
|
|
1107
|
+
};
|
|
1108
|
+
var getPropertyAST = (ast, propertyName) => {
|
|
1109
|
+
if (!ast) {
|
|
1110
|
+
return void 0;
|
|
1111
|
+
}
|
|
1112
|
+
if (SchemaEx.isNestedType(ast)) {
|
|
1113
|
+
const properties = SchemaEx.getProperties(ast);
|
|
1114
|
+
const property = properties.find((p) => p.name.toString() === propertyName);
|
|
1115
|
+
if (property) {
|
|
1116
|
+
return SchemaEx.getBaseType(property).type;
|
|
1117
|
+
}
|
|
1118
|
+
}
|
|
1119
|
+
if (SchemaEx.isArrayType(ast)) {
|
|
1120
|
+
const elementType = SchemaEx.getArrayElementType(ast);
|
|
1121
|
+
return elementType;
|
|
1122
|
+
}
|
|
1123
|
+
return void 0;
|
|
1124
|
+
};
|
|
1125
|
+
var getRequiredProperties = (ast) => {
|
|
1126
|
+
if (!ast) {
|
|
1127
|
+
return [];
|
|
1128
|
+
}
|
|
1129
|
+
if (!SchemaEx.isNestedType(ast)) {
|
|
1130
|
+
return [];
|
|
1131
|
+
}
|
|
1132
|
+
const properties = SchemaEx.getProperties(ast);
|
|
1133
|
+
return properties.filter((p) => !p.isOptional);
|
|
1134
|
+
};
|
|
1135
|
+
var getDefaultValueForType = (ast) => {
|
|
1136
|
+
if (!ast) {
|
|
1137
|
+
return void 0;
|
|
1138
|
+
}
|
|
1139
|
+
const defaultValue = SchemaAST5.getDefaultAnnotation(ast);
|
|
1140
|
+
if (Option.isSome(defaultValue)) {
|
|
1141
|
+
return defaultValue.value;
|
|
1142
|
+
}
|
|
1143
|
+
return Match.value(ast).pipe(Match.when({
|
|
1144
|
+
_tag: "StringKeyword"
|
|
1145
|
+
}, () => ""), Match.when({
|
|
1146
|
+
_tag: "NumberKeyword"
|
|
1147
|
+
}, () => 0), Match.when({
|
|
1148
|
+
_tag: "BooleanKeyword"
|
|
1149
|
+
}, () => false), Match.orElse(() => void 0));
|
|
1150
|
+
};
|
|
1151
|
+
var createObjectWithDefaults = (ast) => {
|
|
1152
|
+
if (!ast) {
|
|
1153
|
+
return {};
|
|
1154
|
+
}
|
|
1155
|
+
const requiredProps = getRequiredProperties(ast);
|
|
1156
|
+
const obj = {};
|
|
1157
|
+
for (const prop of requiredProps) {
|
|
1158
|
+
const defaultValue = getDefaultValueForType(prop.type);
|
|
1159
|
+
if (defaultValue !== void 0) {
|
|
1160
|
+
obj[prop.name] = defaultValue;
|
|
1161
|
+
} else if (SchemaEx.isNestedType(prop.type)) {
|
|
1162
|
+
obj[prop.name] = createObjectWithDefaults(prop.type);
|
|
1163
|
+
}
|
|
1164
|
+
}
|
|
1165
|
+
return obj;
|
|
1166
|
+
};
|
|
1167
|
+
|
|
1168
|
+
// src/internal/Obj/snapshot.ts
|
|
1169
|
+
import { assertArgument as assertArgument5 } from "@dxos/invariant";
|
|
1170
|
+
import { deepMapValues as deepMapValues2 } from "@dxos/util";
|
|
1171
|
+
var copySymbolProperty = (source, target, symbol, transform) => {
|
|
1172
|
+
let value2;
|
|
1173
|
+
try {
|
|
1174
|
+
value2 = source[symbol];
|
|
1175
|
+
} catch {
|
|
1176
|
+
return;
|
|
1177
|
+
}
|
|
1178
|
+
if (value2 !== void 0) {
|
|
1179
|
+
const finalValue = transform ? transform(value2) : value2;
|
|
1180
|
+
Object.defineProperty(target, symbol, {
|
|
1181
|
+
value: finalValue,
|
|
1182
|
+
writable: false,
|
|
1183
|
+
enumerable: false,
|
|
1184
|
+
configurable: false
|
|
1185
|
+
});
|
|
1186
|
+
}
|
|
1187
|
+
};
|
|
1188
|
+
var getSnapshot = (obj) => {
|
|
1189
|
+
assertArgument5(typeof obj === "object" && obj !== null && KindId in obj, "obj", "must be an entity");
|
|
1190
|
+
const snapshot = deepMapValues2(obj, (value2, recurse) => {
|
|
1191
|
+
if (typeof value2 === "object" && value2 !== null && Object.getPrototypeOf(value2) !== Object.prototype && !Array.isArray(value2)) {
|
|
1192
|
+
return value2;
|
|
1193
|
+
}
|
|
1194
|
+
return recurse(value2);
|
|
1195
|
+
});
|
|
1196
|
+
if (obj != null && typeof obj === "object" && KindId in obj) {
|
|
1197
|
+
snapshot[SnapshotKindId] = obj[KindId];
|
|
1198
|
+
}
|
|
1199
|
+
const source = obj;
|
|
1200
|
+
copySymbolProperty(source, snapshot, TypeId);
|
|
1201
|
+
copySymbolProperty(source, snapshot, SchemaId);
|
|
1202
|
+
copySymbolProperty(source, snapshot, TypeEntityId);
|
|
1203
|
+
copySymbolProperty(source, snapshot, SelfURIId);
|
|
1204
|
+
copySymbolProperty(source, snapshot, ObjectDatabaseId);
|
|
1205
|
+
copySymbolProperty(source, snapshot, ObjectDeletedId);
|
|
1206
|
+
copySymbolProperty(source, snapshot, ParentId);
|
|
1207
|
+
copySymbolProperty(source, snapshot, MetaId, (meta) => ({
|
|
1208
|
+
keys: [
|
|
1209
|
+
...meta?.keys ?? []
|
|
1210
|
+
],
|
|
1211
|
+
tags: [
|
|
1212
|
+
...meta?.tags ?? []
|
|
1213
|
+
],
|
|
1214
|
+
...meta?.key != null ? {
|
|
1215
|
+
key: meta.key
|
|
1216
|
+
} : {},
|
|
1217
|
+
...meta?.version != null ? {
|
|
1218
|
+
version: meta.version
|
|
1219
|
+
} : {},
|
|
1220
|
+
...meta?.annotations ? {
|
|
1221
|
+
annotations: {
|
|
1222
|
+
...meta.annotations
|
|
1223
|
+
}
|
|
1224
|
+
} : {}
|
|
1225
|
+
}));
|
|
1226
|
+
copySymbolProperty(source, snapshot, RelationSourceDXNId);
|
|
1227
|
+
copySymbolProperty(source, snapshot, RelationTargetDXNId);
|
|
1228
|
+
copySymbolProperty(source, snapshot, RelationSourceId);
|
|
1229
|
+
copySymbolProperty(source, snapshot, RelationTargetId);
|
|
1230
|
+
return Object.freeze(snapshot);
|
|
1231
|
+
};
|
|
1232
|
+
|
|
1233
|
+
// src/internal/Obj/atoms.ts
|
|
1234
|
+
import * as Atom from "@effect-atom/atom/Atom";
|
|
1235
|
+
import * as Result from "@effect-atom/atom/Result";
|
|
1236
|
+
import * as Effect from "effect/Effect";
|
|
1237
|
+
import * as Function from "effect/Function";
|
|
1238
|
+
import * as Option2 from "effect/Option";
|
|
1239
|
+
import { assertArgument as assertArgument6 } from "@dxos/invariant";
|
|
1240
|
+
var isRef = (obj) => obj != null && typeof obj === "object" && RefTypeId in obj;
|
|
1241
|
+
var getReactiveOption = (snapshot) => Effect.gen(function* () {
|
|
1242
|
+
const db = getDatabase(snapshot);
|
|
1243
|
+
if (!db) {
|
|
1244
|
+
return Option2.none();
|
|
1245
|
+
}
|
|
1246
|
+
const obj = db.getObjectById(snapshot.id);
|
|
1247
|
+
return obj ? Option2.some(obj) : Option2.none();
|
|
1248
|
+
});
|
|
1249
|
+
var objectFamily = Atom.family((obj) => {
|
|
1250
|
+
return Atom.make((get) => {
|
|
1251
|
+
const unsubscribe = subscribe(obj, () => {
|
|
1252
|
+
get.setSelf(getSnapshot(obj));
|
|
1253
|
+
});
|
|
1254
|
+
get.addFinalizer(() => unsubscribe());
|
|
1255
|
+
return getSnapshot(obj);
|
|
1256
|
+
}).pipe(Atom.keepAlive);
|
|
1257
|
+
});
|
|
1258
|
+
var refFamily = Atom.family((ref) => {
|
|
1259
|
+
return Atom.make((get) => {
|
|
1260
|
+
let unsubscribeTarget;
|
|
1261
|
+
const setupTargetSubscription = (target) => {
|
|
1262
|
+
unsubscribeTarget?.();
|
|
1263
|
+
unsubscribeTarget = subscribe(target, () => {
|
|
1264
|
+
get.setSelf(isDeleted(target) ? void 0 : getSnapshot(target));
|
|
1265
|
+
});
|
|
1266
|
+
return getSnapshot(target);
|
|
1267
|
+
};
|
|
1268
|
+
get.addFinalizer(() => {
|
|
1269
|
+
unsubscribeTarget?.();
|
|
1270
|
+
});
|
|
1271
|
+
return loadRefTarget(ref, get, setupTargetSubscription);
|
|
1272
|
+
}).pipe(Atom.keepAlive);
|
|
1273
|
+
});
|
|
1274
|
+
var propertyFamily = Atom.family((obj) => Atom.family((key) => {
|
|
1275
|
+
return Atom.make((get) => {
|
|
1276
|
+
let previousSnapshot = snapshotForComparison(obj[key]);
|
|
1277
|
+
const unsubscribe2 = subscribe(obj, () => {
|
|
1278
|
+
const newValue = obj[key];
|
|
1279
|
+
const newSnapshot = snapshotForComparison(newValue);
|
|
1280
|
+
if (newSnapshot !== previousSnapshot) {
|
|
1281
|
+
previousSnapshot = newSnapshot;
|
|
1282
|
+
get.setSelf(newSnapshot);
|
|
1283
|
+
}
|
|
1284
|
+
});
|
|
1285
|
+
get.addFinalizer(() => unsubscribe2());
|
|
1286
|
+
return snapshotForComparison(obj[key]);
|
|
1287
|
+
}).pipe(Atom.keepAlive);
|
|
1288
|
+
}));
|
|
1289
|
+
var objectWithReactiveFamily = Atom.family((obj) => {
|
|
1290
|
+
return Atom.make((get) => {
|
|
1291
|
+
const unsubscribe = subscribe(obj, () => {
|
|
1292
|
+
get.setSelf(obj);
|
|
1293
|
+
});
|
|
1294
|
+
get.addFinalizer(() => unsubscribe());
|
|
1295
|
+
return obj;
|
|
1296
|
+
}).pipe(Atom.keepAlive);
|
|
1297
|
+
});
|
|
1298
|
+
var refWithReactiveFamily = Atom.family((ref) => {
|
|
1299
|
+
const effect = (get) => Effect.gen(function* () {
|
|
1300
|
+
const snapshot = get(makeAtom(ref));
|
|
1301
|
+
if (snapshot == null) {
|
|
1302
|
+
return void 0;
|
|
1303
|
+
}
|
|
1304
|
+
const option = yield* getReactiveOption(snapshot);
|
|
1305
|
+
return Option2.getOrElse(option, () => void 0);
|
|
1306
|
+
});
|
|
1307
|
+
return Function.pipe(Atom.make(effect), Atom.map((result) => Result.getOrElse(result, () => void 0)));
|
|
1308
|
+
});
|
|
1309
|
+
var refPropertyFamily = Atom.family((ref) => Atom.family((key) => {
|
|
1310
|
+
return Atom.make((get) => {
|
|
1311
|
+
const target = get(refWithReactiveFamily(ref));
|
|
1312
|
+
return target ? get(propertyFamily(target)(key)) : void 0;
|
|
1313
|
+
}).pipe(Atom.keepAlive);
|
|
1314
|
+
}));
|
|
1315
|
+
var entityFamily = Atom.family((entity) => {
|
|
1316
|
+
return Atom.make((get) => {
|
|
1317
|
+
const unsubscribe = subscribe(entity, () => {
|
|
1318
|
+
get.setSelf(getSnapshot(entity));
|
|
1319
|
+
});
|
|
1320
|
+
get.addFinalizer(() => unsubscribe());
|
|
1321
|
+
return getSnapshot(entity);
|
|
1322
|
+
}).pipe(Atom.keepAlive);
|
|
1323
|
+
});
|
|
1324
|
+
var relationFamily = Atom.family((relation) => {
|
|
1325
|
+
return Atom.make((get) => {
|
|
1326
|
+
const unsubscribe = subscribe(relation, () => {
|
|
1327
|
+
get.setSelf(getSnapshot(relation));
|
|
1328
|
+
});
|
|
1329
|
+
get.addFinalizer(() => unsubscribe());
|
|
1330
|
+
return getSnapshot(relation);
|
|
1331
|
+
}).pipe(Atom.keepAlive);
|
|
1332
|
+
});
|
|
1333
|
+
var makeAtom = (objOrRef) => {
|
|
1334
|
+
if (isRef(objOrRef)) {
|
|
1335
|
+
return refFamily(objOrRef);
|
|
1336
|
+
}
|
|
1337
|
+
const obj = objOrRef;
|
|
1338
|
+
assertArgument6(isEntity(obj), "obj", "Object must be a reactive object");
|
|
1339
|
+
return objectFamily(obj);
|
|
1340
|
+
};
|
|
1341
|
+
var makeProperty = (objOrRef, key) => {
|
|
1342
|
+
if (isRef(objOrRef)) {
|
|
1343
|
+
return refPropertyFamily(objOrRef)(key);
|
|
1344
|
+
}
|
|
1345
|
+
const obj = objOrRef;
|
|
1346
|
+
assertArgument6(isEntity(obj), "obj", "Object must be a reactive object");
|
|
1347
|
+
return propertyFamily(obj)(key);
|
|
1348
|
+
};
|
|
1349
|
+
var makeWithReactive = (objOrRef) => {
|
|
1350
|
+
if (isRef(objOrRef)) {
|
|
1351
|
+
return refWithReactiveFamily(objOrRef);
|
|
1352
|
+
}
|
|
1353
|
+
const obj = objOrRef;
|
|
1354
|
+
assertArgument6(isEntity(obj), "obj", "Object must be a reactive object");
|
|
1355
|
+
return objectWithReactiveFamily(obj);
|
|
1356
|
+
};
|
|
1357
|
+
var makeEntity = (entity) => {
|
|
1358
|
+
assertArgument6(isEntity(entity), "entity", "Must be a reactive ECHO entity");
|
|
1359
|
+
return entityFamily(entity);
|
|
1360
|
+
};
|
|
1361
|
+
var makeRelation = (relation) => {
|
|
1362
|
+
assertArgument6(isEntity(relation), "relation", "Must be a reactive ECHO relation");
|
|
1363
|
+
return relationFamily(relation);
|
|
1364
|
+
};
|
|
1365
|
+
var labelAtomFamily = Atom.family((entity) => {
|
|
1366
|
+
return Atom.make((get) => {
|
|
1367
|
+
let previous = getLabel(entity);
|
|
1368
|
+
const unsubscribe = subscribe(entity, () => {
|
|
1369
|
+
const next = getLabel(entity);
|
|
1370
|
+
if (next !== previous) {
|
|
1371
|
+
previous = next;
|
|
1372
|
+
get.setSelf(next);
|
|
1373
|
+
}
|
|
1374
|
+
});
|
|
1375
|
+
get.addFinalizer(() => unsubscribe());
|
|
1376
|
+
return previous;
|
|
1377
|
+
}).pipe(Atom.keepAlive);
|
|
1378
|
+
});
|
|
1379
|
+
var makeLabelAtom = (entity) => {
|
|
1380
|
+
assertArgument6(isEntity(entity), "entity", "Must be a reactive ECHO entity");
|
|
1381
|
+
return labelAtomFamily(entity);
|
|
1382
|
+
};
|
|
1383
|
+
|
|
1384
|
+
// src/internal/Obj/clone.ts
|
|
1385
|
+
import { invariant as invariant6 } from "@dxos/invariant";
|
|
1386
|
+
import { assumeType as assumeType2, deepMapValues as deepMapValues3 } from "@dxos/util";
|
|
1387
|
+
var __dxlog_file6 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Obj/clone.ts";
|
|
1388
|
+
var clone = (obj, opts) => cloneInner(obj, opts, obj, /* @__PURE__ */ new Map(), /* @__PURE__ */ new Set());
|
|
1389
|
+
var cloneInner = (obj, opts, root, cache, inProgress) => {
|
|
1390
|
+
if (cache.has(obj.id)) {
|
|
1391
|
+
return cache.get(obj.id);
|
|
1392
|
+
}
|
|
1393
|
+
inProgress.add(obj.id);
|
|
1394
|
+
const { id, ...data } = obj;
|
|
1395
|
+
const typeEntity = getType(obj);
|
|
1396
|
+
const schema = typeEntity != null ? getStaticTypeSchema(typeEntity) : getSchema(obj);
|
|
1397
|
+
invariant6(schema != null, "Object should have a type or schema", { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 32, S: void 0, A: ["schema != null", "'Object should have a type or schema'"] });
|
|
1398
|
+
const mapRef = (value2, recurse) => {
|
|
1399
|
+
if (Ref.isRef(value2)) {
|
|
1400
|
+
const target = value2.target;
|
|
1401
|
+
if (target != null && !inProgress.has(target.id) && (opts?.deep === "all" || opts?.deep === "parent" && isChildOf(target, root))) {
|
|
1402
|
+
return Ref.make(cloneInner(target, opts, root, cache, inProgress));
|
|
1403
|
+
}
|
|
1404
|
+
return value2;
|
|
1405
|
+
}
|
|
1406
|
+
return recurse(value2);
|
|
1407
|
+
};
|
|
1408
|
+
const props = deepMapValues3(data, mapRef);
|
|
1409
|
+
if (opts?.retainId) {
|
|
1410
|
+
props.id = id;
|
|
1411
|
+
}
|
|
1412
|
+
const meta = deepMapValues3(getMeta(obj), mapRef);
|
|
1413
|
+
const result = makeObject(schema, props, meta, typeEntity);
|
|
1414
|
+
inProgress.delete(obj.id);
|
|
1415
|
+
cache.set(obj.id, result);
|
|
1416
|
+
return result;
|
|
1417
|
+
};
|
|
1418
|
+
var isChildOf = (entity, root) => {
|
|
1419
|
+
const seen = /* @__PURE__ */ new Set();
|
|
1420
|
+
assumeType2(entity);
|
|
1421
|
+
let parent = entity[ParentId];
|
|
1422
|
+
while (parent != null && !seen.has(parent)) {
|
|
1423
|
+
if (parent.id === root.id) {
|
|
1424
|
+
return true;
|
|
1425
|
+
}
|
|
1426
|
+
seen.add(parent);
|
|
1427
|
+
parent = parent[ParentId];
|
|
1428
|
+
}
|
|
1429
|
+
return false;
|
|
1430
|
+
};
|
|
1431
|
+
|
|
1432
|
+
// src/internal/Type/manipulation.ts
|
|
1433
|
+
import * as Schema7 from "effect/Schema";
|
|
1434
|
+
import * as SchemaAST6 from "effect/SchemaAST";
|
|
1435
|
+
import { invariant as invariant7 } from "@dxos/invariant";
|
|
1436
|
+
var __dxlog_file7 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/Type/manipulation.ts";
|
|
1437
|
+
var addFieldsToSchema = (schema, fields) => {
|
|
1438
|
+
const schemaExtension = Schema7.partial(Schema7.Struct(fields));
|
|
1439
|
+
return Schema7.extend(schema, schemaExtension).annotations(schema.ast.annotations);
|
|
1440
|
+
};
|
|
1441
|
+
var updateFieldsInSchema = (schema, fields) => {
|
|
1442
|
+
const ast = schema.ast;
|
|
1443
|
+
invariant7(SchemaAST6.isTypeLiteral(ast), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file7, L: 14, S: void 0, A: ["SchemaAST.isTypeLiteral(ast)", ""] });
|
|
1444
|
+
const updatedProperties = [
|
|
1445
|
+
...ast.propertySignatures
|
|
1446
|
+
];
|
|
1447
|
+
const propertiesToUpdate = Schema7.partial(Schema7.Struct(fields)).ast.propertySignatures;
|
|
1448
|
+
for (const property of propertiesToUpdate) {
|
|
1449
|
+
const index = updatedProperties.findIndex((p) => p.name === property.name);
|
|
1450
|
+
if (index !== -1) {
|
|
1451
|
+
updatedProperties[index] = property;
|
|
1452
|
+
} else {
|
|
1453
|
+
updatedProperties.push(property);
|
|
1454
|
+
}
|
|
1455
|
+
}
|
|
1456
|
+
return Schema7.make(new SchemaAST6.TypeLiteral(updatedProperties, ast.indexSignatures, ast.annotations));
|
|
1457
|
+
};
|
|
1458
|
+
var removeFieldsFromSchema = (schema, fieldNames) => {
|
|
1459
|
+
return Schema7.make(SchemaAST6.omit(schema.ast, fieldNames)).annotations(schema.ast.annotations);
|
|
1460
|
+
};
|
|
1461
|
+
var updateFieldNameInSchema = (schema, { before, after }) => {
|
|
1462
|
+
const ast = schema.ast;
|
|
1463
|
+
invariant7(SchemaAST6.isTypeLiteral(ast), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file7, L: 34, S: void 0, A: ["SchemaAST.isTypeLiteral(ast)", ""] });
|
|
1464
|
+
return Schema7.make(new SchemaAST6.TypeLiteral(ast.propertySignatures.map((p) => p.name === before ? new SchemaAST6.PropertySignature(after, p.type, p.isOptional, p.isReadonly, p.annotations) : p), ast.indexSignatures, ast.annotations));
|
|
1465
|
+
};
|
|
1466
|
+
|
|
1467
|
+
// src/internal/Type/type-schema.ts
|
|
1468
|
+
import * as Schema8 from "effect/Schema";
|
|
1469
|
+
var TypeSchemaStruct = Schema8.Struct({
|
|
1470
|
+
name: Schema8.optional(Schema8.String),
|
|
1471
|
+
jsonSchema: JsonSchemaType
|
|
1472
|
+
});
|
|
1473
|
+
var TypeSchema = TypeSchemaStruct.pipe(LabelAnnotation.set([
|
|
1474
|
+
"name"
|
|
1475
|
+
]), IconAnnotation.set({
|
|
1476
|
+
icon: "ph--database--regular",
|
|
1477
|
+
hue: "green"
|
|
1478
|
+
}), EchoTypeKindSchema(TypeMetaSchemaDXN));
|
|
1479
|
+
|
|
1480
|
+
export {
|
|
1481
|
+
RawObject,
|
|
1482
|
+
VersionTypeId,
|
|
1483
|
+
compare,
|
|
1484
|
+
sortByLabel,
|
|
1485
|
+
sortByTypename,
|
|
1486
|
+
sort,
|
|
1487
|
+
prettyFilter,
|
|
1488
|
+
prettyQuery,
|
|
1489
|
+
getStrongDependencyUris,
|
|
1490
|
+
getStrongDependencies,
|
|
1491
|
+
normalizeSchema,
|
|
1492
|
+
EchoObjectSchema,
|
|
1493
|
+
makeObjectType,
|
|
1494
|
+
EchoRelationSchema,
|
|
1495
|
+
getDXNForRelationSchemaRef,
|
|
1496
|
+
makeRelationType,
|
|
1497
|
+
EchoTypeKindSchema,
|
|
1498
|
+
isVersion,
|
|
1499
|
+
version,
|
|
1500
|
+
versionValid,
|
|
1501
|
+
compareVersions,
|
|
1502
|
+
encodeVersion,
|
|
1503
|
+
decodeVersion,
|
|
1504
|
+
objectToJSON,
|
|
1505
|
+
objectFromJSON,
|
|
1506
|
+
setRefResolverOnData,
|
|
1507
|
+
objectStructureToJson,
|
|
1508
|
+
matchesTag,
|
|
1509
|
+
matchMetaKey,
|
|
1510
|
+
compareTypenameStrings,
|
|
1511
|
+
filterMatchValue,
|
|
1512
|
+
filterMatchEntity,
|
|
1513
|
+
makeTypedEntityClass,
|
|
1514
|
+
createObject,
|
|
1515
|
+
isDeleted,
|
|
1516
|
+
setValue,
|
|
1517
|
+
getSnapshot,
|
|
1518
|
+
makeAtom,
|
|
1519
|
+
makeProperty,
|
|
1520
|
+
makeWithReactive,
|
|
1521
|
+
makeEntity,
|
|
1522
|
+
makeRelation,
|
|
1523
|
+
makeLabelAtom,
|
|
1524
|
+
clone,
|
|
1525
|
+
addFieldsToSchema,
|
|
1526
|
+
updateFieldsInSchema,
|
|
1527
|
+
removeFieldsFromSchema,
|
|
1528
|
+
updateFieldNameInSchema,
|
|
1529
|
+
TypeSchema
|
|
1530
|
+
};
|
|
1531
|
+
//# sourceMappingURL=chunk-ACFAOTKJ.mjs.map
|