@dxos/echo 0.9.1-main.c7dcc2e112 → 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 +22 -8
- package/dist/lib/neutral/Database.mjs +3 -3
- package/dist/lib/neutral/Entity.mjs +11 -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 +15 -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-AFANXSGV.mjs → chunk-3KTE2Y7Q.mjs} +20 -20
- package/dist/lib/neutral/chunk-3KTE2Y7Q.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-WZ32BF53.mjs → chunk-3TN2VMI4.mjs} +49 -37
- package/dist/lib/neutral/chunk-3TN2VMI4.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-E7IOTOZD.mjs → chunk-42L4HJ3Z.mjs} +11 -15
- package/dist/lib/neutral/chunk-42L4HJ3Z.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-K3S7D5PR.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-Z3WMRRAZ.mjs → chunk-BEFR7LEA.mjs} +11 -9
- package/dist/lib/neutral/{chunk-Z3WMRRAZ.mjs.map → chunk-BEFR7LEA.mjs.map} +1 -1
- 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-3JXQUMUI.mjs → chunk-C57XMMBY.mjs} +21 -20
- package/dist/lib/neutral/chunk-C57XMMBY.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-JZ6LFQU5.mjs → chunk-C62JYFAD.mjs} +82 -8
- package/dist/lib/neutral/chunk-C62JYFAD.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-TF5BSLF6.mjs → chunk-FSGX2R62.mjs} +3 -3
- package/dist/lib/neutral/chunk-FSGX2R62.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-6CEISA3V.mjs → chunk-HBXT3GSB.mjs} +29 -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-4TPQZPLY.mjs → chunk-L3E5IXAE.mjs} +198 -30
- 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-NOL7O3BL.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-A53NTBHE.mjs → chunk-U53LSQQA.mjs} +3 -3
- package/dist/lib/neutral/{chunk-A53NTBHE.mjs.map → chunk-U53LSQQA.mjs.map} +1 -1
- package/dist/lib/neutral/{chunk-PLDMJJJC.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-SZ5WB6HF.mjs → chunk-UZHCQ6NI.mjs} +13 -11
- package/dist/lib/neutral/{chunk-SZ5WB6HF.mjs.map → chunk-UZHCQ6NI.mjs.map} +3 -3
- package/dist/lib/neutral/{chunk-L3OBWBV2.mjs → chunk-WKIT2YY5.mjs} +2 -2
- package/dist/lib/neutral/{chunk-HGWQR5KH.mjs → chunk-XB6ISRAO.mjs} +27 -15
- 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-5GAIWRQB.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 +91 -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 +16 -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/Err.d.ts +67 -0
- package/dist/types/src/Err.d.ts.map +1 -1
- package/dist/types/src/Feed.d.ts +56 -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 +31 -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 +8 -4
- 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 +33 -20
- 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 +9 -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 +7 -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/ref.d.ts +13 -6
- package/dist/types/src/internal/Ref/ref.d.ts.map +1 -1
- 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 +55 -6
- package/src/Collection.ts +10 -12
- package/src/Database.ts +22 -20
- package/src/Err.ts +22 -0
- package/src/Feed.ts +114 -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 +36 -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 +12 -4
- package/src/Registry.ts +1 -1
- package/src/Relation.ts +1 -1
- package/src/Tag.ts +12 -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 +69 -31
- package/src/View.ts +22 -30
- package/src/index.ts +1 -1
- package/src/internal/Annotation/annotations.ts +15 -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 +31 -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 +1 -1
- 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/ref.test.ts +8 -8
- package/src/internal/Ref/ref.ts +26 -20
- 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-3JXQUMUI.mjs.map +0 -7
- package/dist/lib/neutral/chunk-4TPQZPLY.mjs.map +0 -7
- package/dist/lib/neutral/chunk-5GAIWRQB.mjs.map +0 -7
- package/dist/lib/neutral/chunk-6CEISA3V.mjs.map +0 -7
- package/dist/lib/neutral/chunk-AFANXSGV.mjs.map +0 -7
- package/dist/lib/neutral/chunk-BBFJWWAV.mjs.map +0 -7
- package/dist/lib/neutral/chunk-E7IOTOZD.mjs.map +0 -7
- package/dist/lib/neutral/chunk-EVK6XBXO.mjs.map +0 -7
- package/dist/lib/neutral/chunk-HGWQR5KH.mjs.map +0 -7
- package/dist/lib/neutral/chunk-JZ6LFQU5.mjs.map +0 -7
- package/dist/lib/neutral/chunk-NOL7O3BL.mjs.map +0 -7
- package/dist/lib/neutral/chunk-O6BH7EPN.mjs.map +0 -7
- package/dist/lib/neutral/chunk-TF5BSLF6.mjs.map +0 -7
- package/dist/lib/neutral/chunk-TFEWTY5A.mjs.map +0 -7
- package/dist/lib/neutral/chunk-VQYL2OQF.mjs +0 -2353
- package/dist/lib/neutral/chunk-VQYL2OQF.mjs.map +0 -7
- package/dist/lib/neutral/chunk-WU3GIANS.mjs.map +0 -7
- package/dist/lib/neutral/chunk-WZ32BF53.mjs.map +0 -7
- package/dist/lib/neutral/chunk-X3NUUON4.mjs +0 -184
- package/dist/lib/neutral/chunk-X3NUUON4.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-K3S7D5PR.mjs.map → chunk-4A2NWKRJ.mjs.map} +0 -0
- /package/dist/lib/neutral/{chunk-PLDMJJJC.mjs.map → chunk-UGFFV2FR.mjs.map} +0 -0
- /package/dist/lib/neutral/{chunk-L3OBWBV2.mjs.map → chunk-WKIT2YY5.mjs.map} +0 -0
|
@@ -0,0 +1,1394 @@
|
|
|
1
|
+
import {
|
|
2
|
+
JsonSchemaType,
|
|
3
|
+
toEffectSchema
|
|
4
|
+
} from "./chunk-4A2NWKRJ.mjs";
|
|
5
|
+
import {
|
|
6
|
+
ChangeId,
|
|
7
|
+
EventId,
|
|
8
|
+
Ref,
|
|
9
|
+
change,
|
|
10
|
+
createEchoReferenceSchema,
|
|
11
|
+
createProxy,
|
|
12
|
+
getProxyTarget,
|
|
13
|
+
isProxy,
|
|
14
|
+
isReactiveRecord,
|
|
15
|
+
isValidProxyTarget,
|
|
16
|
+
normalizeSpliceRange,
|
|
17
|
+
symbolIsProxy,
|
|
18
|
+
symbolReactivePrototype
|
|
19
|
+
} from "./chunk-L3E5IXAE.mjs";
|
|
20
|
+
import {
|
|
21
|
+
ATTR_RELATION_SOURCE,
|
|
22
|
+
ATTR_RELATION_TARGET,
|
|
23
|
+
ATTR_SELF_URI,
|
|
24
|
+
ATTR_TYPE,
|
|
25
|
+
Dictionary,
|
|
26
|
+
MetaId,
|
|
27
|
+
ObjectDeletedId,
|
|
28
|
+
ParentId,
|
|
29
|
+
RelationSourceDXNId,
|
|
30
|
+
RelationTargetDXNId,
|
|
31
|
+
SchemaId,
|
|
32
|
+
SelfURIId,
|
|
33
|
+
TypeAnnotationId,
|
|
34
|
+
TypeEntityId,
|
|
35
|
+
TypeId,
|
|
36
|
+
getDictionary,
|
|
37
|
+
getSchemaURI,
|
|
38
|
+
getTypeAnnotation
|
|
39
|
+
} from "./chunk-3TN2VMI4.mjs";
|
|
40
|
+
import {
|
|
41
|
+
EntityKind,
|
|
42
|
+
KindId,
|
|
43
|
+
SchemaKindId,
|
|
44
|
+
SnapshotKindId,
|
|
45
|
+
StaticTypeSchemaSlot,
|
|
46
|
+
makeTypeJsonSchemaAnnotation
|
|
47
|
+
} from "./chunk-2ZHECXUR.mjs";
|
|
48
|
+
|
|
49
|
+
// src/internal/common/types/well-known-types.ts
|
|
50
|
+
import { DXN } from "@dxos/keys";
|
|
51
|
+
var TagTypeDXN = DXN.make("org.dxos.type.tag", "0.1.0");
|
|
52
|
+
|
|
53
|
+
// src/internal/common/types/meta.ts
|
|
54
|
+
import * as Schema from "effect/Schema";
|
|
55
|
+
import { ForeignKey } from "@dxos/echo-protocol";
|
|
56
|
+
import { invariant } from "@dxos/invariant";
|
|
57
|
+
import { DXN as DXN2 } from "@dxos/keys";
|
|
58
|
+
import { intersection } from "@dxos/util";
|
|
59
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/types/meta.ts";
|
|
60
|
+
var ATTR_META = "@meta";
|
|
61
|
+
var TagRefSchema = Schema.suspend(() => (
|
|
62
|
+
// The factory yields a loosely-typed `Ref<any>` schema; narrow it to the Tag-typed ref.
|
|
63
|
+
createEchoReferenceSchema(void 0, DXN2.getName(TagTypeDXN), DXN2.getVersion(TagTypeDXN))
|
|
64
|
+
));
|
|
65
|
+
var EntityMetaSchema = Schema.Struct({
|
|
66
|
+
keys: Schema.Array(ForeignKey),
|
|
67
|
+
/**
|
|
68
|
+
* Tags applied to this entity, as references to {@link Tag} objects.
|
|
69
|
+
*/
|
|
70
|
+
tags: Schema.Array(TagRefSchema),
|
|
71
|
+
/**
|
|
72
|
+
* Fully-qualified registry key for the object (FQN format, e.g. `org.example.type.foo`).
|
|
73
|
+
* Identifies the canonical registry entry the object instance was created from.
|
|
74
|
+
*/
|
|
75
|
+
key: Schema.optional(Schema.String),
|
|
76
|
+
/**
|
|
77
|
+
* Semantic version of the registry entry the object was created from.
|
|
78
|
+
* Must be a valid semver string (e.g. `1.2.3`).
|
|
79
|
+
*/
|
|
80
|
+
version: Schema.optional(Schema.String),
|
|
81
|
+
/**
|
|
82
|
+
* Dictionary of annotations to this entity.
|
|
83
|
+
*/
|
|
84
|
+
annotations: Dictionary,
|
|
85
|
+
/**
|
|
86
|
+
* Unix ms timestamp when this entity was created.
|
|
87
|
+
* Read-only; sourced from the system section of the automerge document — not stored in meta.
|
|
88
|
+
*/
|
|
89
|
+
createdAt: Schema.optional(Schema.Number),
|
|
90
|
+
/**
|
|
91
|
+
* Unix ms timestamp of the last automerge change on this entity's document.
|
|
92
|
+
* Read-only; derived from the automerge change graph — not stored in meta.
|
|
93
|
+
*/
|
|
94
|
+
updatedAt: Schema.optional(Schema.Number)
|
|
95
|
+
});
|
|
96
|
+
var getMeta = (obj) => {
|
|
97
|
+
const metadata = obj[MetaId];
|
|
98
|
+
invariant(metadata, "EntityMeta not found.", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 63, S: void 0, A: ["metadata", "'EntityMeta not found.'"] });
|
|
99
|
+
return metadata;
|
|
100
|
+
};
|
|
101
|
+
var foreignKey = (source, id) => ({
|
|
102
|
+
source,
|
|
103
|
+
id
|
|
104
|
+
});
|
|
105
|
+
var foreignKeyEquals = (a, b) => a.source === b.source && a.id === b.id;
|
|
106
|
+
var compareForeignKeys = (a, b) => intersection(getMeta(a).keys, getMeta(b).keys, foreignKeyEquals).length > 0;
|
|
107
|
+
|
|
108
|
+
// src/internal/common/api/meta.ts
|
|
109
|
+
import { assertArgument, invariant as invariant2 } from "@dxos/invariant";
|
|
110
|
+
var __dxlog_file2 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/api/meta.ts";
|
|
111
|
+
function getMetaChecked(entity) {
|
|
112
|
+
assertArgument(entity, "entity", "Should be an entity.");
|
|
113
|
+
const meta = getMeta(entity);
|
|
114
|
+
invariant2(meta != null, "Invalid entity.", { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 9, S: this, A: ["meta != null", "'Invalid entity.'"] });
|
|
115
|
+
return meta;
|
|
116
|
+
}
|
|
117
|
+
var getKeys = (entity, source) => {
|
|
118
|
+
assertArgument(entity, "entity", "Should be an entity.");
|
|
119
|
+
const meta = getMetaChecked(entity);
|
|
120
|
+
invariant2(meta != null, "Invalid entity.", { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 18, S: void 0, A: ["meta != null", "'Invalid entity.'"] });
|
|
121
|
+
return meta.keys.filter((key) => key.source === source);
|
|
122
|
+
};
|
|
123
|
+
var deleteKeys = (entity, source) => {
|
|
124
|
+
const meta = getMetaChecked(entity);
|
|
125
|
+
for (let i = 0; i < meta.keys.length; i++) {
|
|
126
|
+
if (meta.keys[i].source === source) {
|
|
127
|
+
meta.keys.splice(i, 1);
|
|
128
|
+
i--;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
var addTag = (entity, tag) => {
|
|
133
|
+
const meta = getMetaChecked(entity);
|
|
134
|
+
if (!meta.tags.some((existing) => existing.uri === tag.uri)) {
|
|
135
|
+
meta.tags.push(tag);
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
var removeTag = (entity, tag) => {
|
|
139
|
+
const meta = getMetaChecked(entity);
|
|
140
|
+
for (let i = 0; i < meta.tags.length; i++) {
|
|
141
|
+
if (meta.tags[i].uri === tag.uri) {
|
|
142
|
+
meta.tags.splice(i, 1);
|
|
143
|
+
i--;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
// src/internal/Entity/guard.ts
|
|
149
|
+
var isEntity = (value) => {
|
|
150
|
+
if (value == null || typeof value !== "object" && typeof value !== "function") {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
return value[KindId] !== void 0;
|
|
154
|
+
};
|
|
155
|
+
var isSnapshot = (value) => {
|
|
156
|
+
if (typeof value !== "object" || value === null) {
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
return value[SnapshotKindId] !== void 0;
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
// src/internal/Annotation/entity-dictionary.ts
|
|
163
|
+
import * as Option from "effect/Option";
|
|
164
|
+
import * as Schema2 from "effect/Schema";
|
|
165
|
+
var get = (target, annotation) => {
|
|
166
|
+
if (isSnapshot(target)) {
|
|
167
|
+
return getDictionary(getMetaChecked(target).annotations, annotation);
|
|
168
|
+
}
|
|
169
|
+
if (isEntity(target)) {
|
|
170
|
+
const annotations2 = getMetaChecked(target).annotations;
|
|
171
|
+
return annotation.key in annotations2 ? Option.some(annotations2[annotation.key]) : Option.none();
|
|
172
|
+
}
|
|
173
|
+
throw new TypeError("Target is not an annotation target.");
|
|
174
|
+
};
|
|
175
|
+
var set = (target, annotation, value) => {
|
|
176
|
+
if (isEntity(target)) {
|
|
177
|
+
Schema2.validateSync(annotation.schema)(value);
|
|
178
|
+
getMetaChecked(target).annotations[annotation.key] = value;
|
|
179
|
+
} else {
|
|
180
|
+
throw new TypeError("Target is not an annotation target.");
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
var update = (target, annotation, mutator) => {
|
|
184
|
+
change(target, (mutable) => {
|
|
185
|
+
const current = get(mutable, annotation);
|
|
186
|
+
if (Option.isSome(current)) {
|
|
187
|
+
const value = current.value;
|
|
188
|
+
mutator(value);
|
|
189
|
+
Schema2.validateSync(annotation.schema)(value);
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
// src/internal/common/proxy/define-hidden-property.ts
|
|
195
|
+
var defineHiddenProperty = (object, key, value) => {
|
|
196
|
+
Object.defineProperty(object, key, {
|
|
197
|
+
enumerable: false,
|
|
198
|
+
configurable: true,
|
|
199
|
+
value
|
|
200
|
+
});
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
// src/internal/common/proxy/json-serializer.ts
|
|
204
|
+
import { invariant as invariant3 } from "@dxos/invariant";
|
|
205
|
+
import { EID } from "@dxos/keys";
|
|
206
|
+
import { deepMapValues, encodeUint8ArrayToJson } from "@dxos/util";
|
|
207
|
+
var __dxlog_file3 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/proxy/json-serializer.ts";
|
|
208
|
+
var attachTypedJsonSerializer = (obj) => {
|
|
209
|
+
const descriptor = Object.getOwnPropertyDescriptor(obj, "toJSON");
|
|
210
|
+
if (descriptor) {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
Object.defineProperty(obj, "toJSON", {
|
|
214
|
+
value: typedJsonSerializer,
|
|
215
|
+
writable: false,
|
|
216
|
+
enumerable: false,
|
|
217
|
+
// Setting `configurable` to false breaks proxy invariants, should be fixable.
|
|
218
|
+
configurable: true
|
|
219
|
+
});
|
|
220
|
+
};
|
|
221
|
+
var typedJsonSerializer = function() {
|
|
222
|
+
const { id, ...rest } = this;
|
|
223
|
+
const result = {
|
|
224
|
+
id
|
|
225
|
+
};
|
|
226
|
+
if (this[TypeId]) {
|
|
227
|
+
result[ATTR_TYPE] = this[TypeId];
|
|
228
|
+
}
|
|
229
|
+
if (this[MetaId]) {
|
|
230
|
+
result[ATTR_META] = serializeMeta(this[MetaId]);
|
|
231
|
+
}
|
|
232
|
+
if (this[SelfURIId]) {
|
|
233
|
+
result[ATTR_SELF_URI] = this[SelfURIId];
|
|
234
|
+
}
|
|
235
|
+
if (this[RelationSourceDXNId]) {
|
|
236
|
+
const sourceDXN = this[RelationSourceDXNId];
|
|
237
|
+
invariant3(EID.isEID(sourceDXN), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 44, S: this, A: ["EID.isEID(sourceDXN)", ""] });
|
|
238
|
+
result[ATTR_RELATION_SOURCE] = sourceDXN;
|
|
239
|
+
}
|
|
240
|
+
if (this[RelationTargetDXNId]) {
|
|
241
|
+
const targetDXN = this[RelationTargetDXNId];
|
|
242
|
+
invariant3(EID.isEID(targetDXN), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 49, S: this, A: ["EID.isEID(targetDXN)", ""] });
|
|
243
|
+
result[ATTR_RELATION_TARGET] = targetDXN;
|
|
244
|
+
}
|
|
245
|
+
Object.assign(result, serializeData(rest));
|
|
246
|
+
return result;
|
|
247
|
+
};
|
|
248
|
+
var serializeData = (data) => {
|
|
249
|
+
return deepMapValues(data, (value, recurse) => {
|
|
250
|
+
if (Ref.isRef(value)) {
|
|
251
|
+
return value.noInline().encode();
|
|
252
|
+
}
|
|
253
|
+
if (value instanceof Uint8Array) {
|
|
254
|
+
return encodeUint8ArrayToJson(value);
|
|
255
|
+
}
|
|
256
|
+
return recurse(value);
|
|
257
|
+
});
|
|
258
|
+
};
|
|
259
|
+
var serializeMeta = (meta) => {
|
|
260
|
+
const { tags, annotations: annotations2, ...rest } = meta;
|
|
261
|
+
const compact = {
|
|
262
|
+
...rest,
|
|
263
|
+
...tags != null && tags.length > 0 ? {
|
|
264
|
+
tags
|
|
265
|
+
} : {},
|
|
266
|
+
...annotations2 != null && Object.keys(annotations2).length > 0 ? {
|
|
267
|
+
annotations: annotations2
|
|
268
|
+
} : {}
|
|
269
|
+
};
|
|
270
|
+
return serializeData(compact);
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
// src/internal/common/proxy/event-batch.ts
|
|
274
|
+
var eventBatchDepth = 0;
|
|
275
|
+
var pendingEventTargets = /* @__PURE__ */ new Set();
|
|
276
|
+
var batchEvents = (callback) => {
|
|
277
|
+
eventBatchDepth++;
|
|
278
|
+
try {
|
|
279
|
+
callback();
|
|
280
|
+
} finally {
|
|
281
|
+
eventBatchDepth--;
|
|
282
|
+
if (eventBatchDepth === 0) {
|
|
283
|
+
for (const target of pendingEventTargets) {
|
|
284
|
+
target[EventId]?.emit();
|
|
285
|
+
}
|
|
286
|
+
pendingEventTargets.clear();
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
var emitEvent = (target) => {
|
|
291
|
+
if (eventBatchDepth > 0) {
|
|
292
|
+
pendingEventTargets.add(target);
|
|
293
|
+
} else {
|
|
294
|
+
target[EventId]?.emit();
|
|
295
|
+
}
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
// src/internal/common/proxy/change-context.ts
|
|
299
|
+
var currentChangeContext = null;
|
|
300
|
+
var pendingNotificationKey = null;
|
|
301
|
+
var pendingOwnerNotifications = /* @__PURE__ */ new Set();
|
|
302
|
+
var enterChangeContext = (key) => {
|
|
303
|
+
currentChangeContext = key;
|
|
304
|
+
return () => {
|
|
305
|
+
currentChangeContext = null;
|
|
306
|
+
};
|
|
307
|
+
};
|
|
308
|
+
var isInChangeContext = (key) => {
|
|
309
|
+
return currentChangeContext === key;
|
|
310
|
+
};
|
|
311
|
+
var queueNotification = (key) => {
|
|
312
|
+
if (currentChangeContext === key) {
|
|
313
|
+
pendingNotificationKey = key;
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
var queueOwnerNotification = (target) => {
|
|
317
|
+
if (currentChangeContext !== null && target !== currentChangeContext) {
|
|
318
|
+
pendingOwnerNotifications.add(target);
|
|
319
|
+
}
|
|
320
|
+
};
|
|
321
|
+
var hasPendingNotifications = (key) => {
|
|
322
|
+
return pendingNotificationKey === key;
|
|
323
|
+
};
|
|
324
|
+
var clearPendingNotifications = (key) => {
|
|
325
|
+
if (pendingNotificationKey === key) {
|
|
326
|
+
pendingNotificationKey = null;
|
|
327
|
+
}
|
|
328
|
+
};
|
|
329
|
+
var executeChange = (contextKey, eventTarget, proxy, callback) => {
|
|
330
|
+
const exitContext = enterChangeContext(contextKey);
|
|
331
|
+
try {
|
|
332
|
+
batchEvents(() => callback(proxy));
|
|
333
|
+
} finally {
|
|
334
|
+
exitContext();
|
|
335
|
+
if (hasPendingNotifications(contextKey)) {
|
|
336
|
+
clearPendingNotifications(contextKey);
|
|
337
|
+
eventTarget[EventId]?.emit();
|
|
338
|
+
}
|
|
339
|
+
for (const ownerTarget of pendingOwnerNotifications) {
|
|
340
|
+
ownerTarget[EventId]?.emit();
|
|
341
|
+
}
|
|
342
|
+
pendingOwnerNotifications.clear();
|
|
343
|
+
}
|
|
344
|
+
};
|
|
345
|
+
|
|
346
|
+
// src/internal/common/proxy/errors.ts
|
|
347
|
+
var MutationOutsideChangeContextError = class extends Error {
|
|
348
|
+
constructor(operation, suggestion) {
|
|
349
|
+
super(`Cannot ${operation} outside of Obj.update(). Use Obj.update(obj, (mutableObj) => { ${suggestion} }) instead.`);
|
|
350
|
+
this.name = "MutationOutsideChangeContextError";
|
|
351
|
+
}
|
|
352
|
+
};
|
|
353
|
+
var createPropertySetError = (prop) => {
|
|
354
|
+
return new MutationOutsideChangeContextError(`modify object property "${String(prop)}"`, `mutableObj.${String(prop)} = value;`);
|
|
355
|
+
};
|
|
356
|
+
var createPropertyDeleteError = (prop) => {
|
|
357
|
+
return new MutationOutsideChangeContextError(`delete object property "${String(prop)}"`, `delete mutableObj.${String(prop)};`);
|
|
358
|
+
};
|
|
359
|
+
var createArrayMethodError = (method) => {
|
|
360
|
+
return new MutationOutsideChangeContextError(`call array.${method}()`, `mutableObj.array.${method}(...);`);
|
|
361
|
+
};
|
|
362
|
+
|
|
363
|
+
// src/internal/common/proxy/ownership.ts
|
|
364
|
+
import { invariant as invariant4 } from "@dxos/invariant";
|
|
365
|
+
var __dxlog_file4 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/proxy/ownership.ts";
|
|
366
|
+
var EchoOwner = /* @__PURE__ */ Symbol.for("@dxos/echo/Owner");
|
|
367
|
+
var getRawTarget = (value) => {
|
|
368
|
+
return isProxy(value) ? getProxyTarget(value) : value;
|
|
369
|
+
};
|
|
370
|
+
var getOwner = (value) => {
|
|
371
|
+
return value?.[EchoOwner];
|
|
372
|
+
};
|
|
373
|
+
var setMetaOwner = (metaTarget, parent) => {
|
|
374
|
+
defineHiddenProperty(metaTarget, EchoOwner, parent);
|
|
375
|
+
};
|
|
376
|
+
var setOwnerRecursive = (value, owner, options = {}) => {
|
|
377
|
+
const { visited = /* @__PURE__ */ new Set(), depth = 0, allowedPreviousOwner } = options;
|
|
378
|
+
if (value == null || typeof value !== "object") {
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
const actualValue = getRawTarget(value);
|
|
382
|
+
if (visited.has(actualValue)) {
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
visited.add(actualValue);
|
|
386
|
+
const existingOwner = getOwner(actualValue);
|
|
387
|
+
const isRootEchoObject = EventId in actualValue;
|
|
388
|
+
let newAllowedPreviousOwner = allowedPreviousOwner;
|
|
389
|
+
if (isRootEchoObject && depth === 0) {
|
|
390
|
+
newAllowedPreviousOwner = actualValue;
|
|
391
|
+
}
|
|
392
|
+
if (!isRootEchoObject) {
|
|
393
|
+
const ownershipAllowed = existingOwner == null || existingOwner === owner || existingOwner === newAllowedPreviousOwner;
|
|
394
|
+
invariant4(ownershipAllowed, "Cannot reassign ownership of a nested record to a different ECHO object. Use deep copy first.", { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 76, S: void 0, A: ["ownershipAllowed", "'Cannot reassign ownership of a nested record to a different ECHO object. Use deep copy first.'"] });
|
|
395
|
+
}
|
|
396
|
+
defineHiddenProperty(actualValue, EchoOwner, owner);
|
|
397
|
+
const recursiveOptions = {
|
|
398
|
+
visited,
|
|
399
|
+
depth: depth + 1,
|
|
400
|
+
allowedPreviousOwner: newAllowedPreviousOwner
|
|
401
|
+
};
|
|
402
|
+
if (Array.isArray(actualValue)) {
|
|
403
|
+
for (const item of actualValue) {
|
|
404
|
+
if (isValidProxyTarget(item) || isProxy(item)) {
|
|
405
|
+
setOwnerRecursive(item, owner, recursiveOptions);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
} else {
|
|
409
|
+
for (const key in actualValue) {
|
|
410
|
+
if (Object.prototype.hasOwnProperty.call(actualValue, key)) {
|
|
411
|
+
const nested = actualValue[key];
|
|
412
|
+
if (isValidProxyTarget(nested) || isProxy(nested)) {
|
|
413
|
+
setOwnerRecursive(nested, owner, recursiveOptions);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
};
|
|
419
|
+
var traverseObjectGraph = (value, visitor, visited = /* @__PURE__ */ new Set()) => {
|
|
420
|
+
if (value == null || typeof value !== "object") {
|
|
421
|
+
return false;
|
|
422
|
+
}
|
|
423
|
+
const actualValue = getRawTarget(value);
|
|
424
|
+
if (visited.has(actualValue)) {
|
|
425
|
+
return false;
|
|
426
|
+
}
|
|
427
|
+
visited.add(actualValue);
|
|
428
|
+
if (visitor(actualValue)) {
|
|
429
|
+
return true;
|
|
430
|
+
}
|
|
431
|
+
if (Array.isArray(actualValue)) {
|
|
432
|
+
for (const item of actualValue) {
|
|
433
|
+
if (traverseObjectGraph(item, visitor, visited)) {
|
|
434
|
+
return true;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
} else {
|
|
438
|
+
for (const key in actualValue) {
|
|
439
|
+
if (Object.prototype.hasOwnProperty.call(actualValue, key)) {
|
|
440
|
+
if (traverseObjectGraph(actualValue[key], visitor, visited)) {
|
|
441
|
+
return true;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
return false;
|
|
447
|
+
};
|
|
448
|
+
var wouldCreateCycle = (targetRoot, value) => traverseObjectGraph(value, (v) => v === targetRoot);
|
|
449
|
+
var hasForeignOwner = (value, target) => traverseObjectGraph(value, (v) => {
|
|
450
|
+
const owner = getOwner(v);
|
|
451
|
+
if (owner != null && owner !== target) {
|
|
452
|
+
return true;
|
|
453
|
+
}
|
|
454
|
+
if (EventId in v && v !== target) {
|
|
455
|
+
return true;
|
|
456
|
+
}
|
|
457
|
+
return false;
|
|
458
|
+
});
|
|
459
|
+
var MAX_OWNER_DEPTH = 100;
|
|
460
|
+
var getEchoRoot = (target, depth = 0) => {
|
|
461
|
+
invariant4(depth < MAX_OWNER_DEPTH, "Owner chain too deep - possible circular ownership", { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 169, S: void 0, A: ["depth < MAX_OWNER_DEPTH", "'Owner chain too deep - possible circular ownership'"] });
|
|
462
|
+
if (KindId in target) {
|
|
463
|
+
return target;
|
|
464
|
+
}
|
|
465
|
+
const owner = getOwner(target);
|
|
466
|
+
if (owner) {
|
|
467
|
+
return getEchoRoot(owner, depth + 1);
|
|
468
|
+
}
|
|
469
|
+
return target;
|
|
470
|
+
};
|
|
471
|
+
var notifyOwnerChain = (target) => {
|
|
472
|
+
const owner = getOwner(target);
|
|
473
|
+
if (owner) {
|
|
474
|
+
queueOwnerNotification(getEchoRoot(owner));
|
|
475
|
+
notifyOwnerChain(owner);
|
|
476
|
+
}
|
|
477
|
+
};
|
|
478
|
+
|
|
479
|
+
// src/internal/common/proxy/proxy-types.ts
|
|
480
|
+
var objectData = /* @__PURE__ */ Symbol.for("@dxos/live-object/objectData");
|
|
481
|
+
|
|
482
|
+
// src/internal/common/proxy/reactive-array.ts
|
|
483
|
+
var checkArrayMutationAllowed = (arr, method) => {
|
|
484
|
+
const target = isProxy(arr) ? getProxyTarget(arr) : arr;
|
|
485
|
+
const echoRoot = getEchoRoot(target);
|
|
486
|
+
const isInitialized = EventId in echoRoot;
|
|
487
|
+
if (!isInitialized) {
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
if (!isInChangeContext(echoRoot)) {
|
|
491
|
+
throw createArrayMethodError(method);
|
|
492
|
+
}
|
|
493
|
+
};
|
|
494
|
+
var ReactiveArray = class extends Array {
|
|
495
|
+
static get [Symbol.species]() {
|
|
496
|
+
return Array;
|
|
497
|
+
}
|
|
498
|
+
static {
|
|
499
|
+
const BATCHED_METHODS = [
|
|
500
|
+
"push",
|
|
501
|
+
"pop",
|
|
502
|
+
"shift",
|
|
503
|
+
"unshift",
|
|
504
|
+
"splice",
|
|
505
|
+
"sort",
|
|
506
|
+
"reverse"
|
|
507
|
+
];
|
|
508
|
+
for (const method of BATCHED_METHODS) {
|
|
509
|
+
Object.defineProperty(this.prototype, method, {
|
|
510
|
+
enumerable: false,
|
|
511
|
+
value: function(...args) {
|
|
512
|
+
checkArrayMutationAllowed(this, method);
|
|
513
|
+
let result;
|
|
514
|
+
batchEvents(() => {
|
|
515
|
+
result = Array.prototype[method].apply(this, args);
|
|
516
|
+
});
|
|
517
|
+
return result;
|
|
518
|
+
}
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
};
|
|
523
|
+
|
|
524
|
+
// src/internal/common/proxy/schema-validator.ts
|
|
525
|
+
import * as Schema3 from "effect/Schema";
|
|
526
|
+
import * as SchemaAST from "effect/SchemaAST";
|
|
527
|
+
import { invariant as invariant5 } from "@dxos/invariant";
|
|
528
|
+
var __dxlog_file5 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/proxy/schema-validator.ts";
|
|
529
|
+
var SchemaValidator = class {
|
|
530
|
+
/**
|
|
531
|
+
* Recursively check that schema specifies constructions we can handle.
|
|
532
|
+
* Validates there are no ambiguous discriminated union types.
|
|
533
|
+
*/
|
|
534
|
+
static validateSchema(schema) {
|
|
535
|
+
const visitAll = (nodes) => nodes.forEach((node) => this.validateSchema(Schema3.make(node)));
|
|
536
|
+
if (SchemaAST.isUnion(schema.ast)) {
|
|
537
|
+
const typeAstList = schema.ast.types.filter((type) => SchemaAST.isTypeLiteral(type));
|
|
538
|
+
if (typeAstList.length > 1) {
|
|
539
|
+
getTypeDiscriminators(typeAstList);
|
|
540
|
+
}
|
|
541
|
+
visitAll(typeAstList);
|
|
542
|
+
} else if (SchemaAST.isTupleType(schema.ast)) {
|
|
543
|
+
const positionalTypes = schema.ast.elements.map((t) => t.type);
|
|
544
|
+
const allTypes = positionalTypes.concat(schema.ast.rest.map((t) => t.type));
|
|
545
|
+
visitAll(allTypes);
|
|
546
|
+
} else if (SchemaAST.isTypeLiteral(schema.ast)) {
|
|
547
|
+
visitAll(SchemaAST.getPropertySignatures(schema.ast).map((p) => p.type));
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
static hasTypeAnnotation(rootObjectSchema, property, annotation) {
|
|
551
|
+
try {
|
|
552
|
+
let type = this.getPropertySchema(rootObjectSchema, [
|
|
553
|
+
property
|
|
554
|
+
]);
|
|
555
|
+
if (SchemaAST.isTupleType(type.ast)) {
|
|
556
|
+
type = this.getPropertySchema(rootObjectSchema, [
|
|
557
|
+
property,
|
|
558
|
+
"0"
|
|
559
|
+
]);
|
|
560
|
+
}
|
|
561
|
+
return type.ast.annotations[annotation] != null;
|
|
562
|
+
} catch {
|
|
563
|
+
return false;
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
static getPropertySchema(rootObjectSchema, propertyPath, getProperty = () => null) {
|
|
567
|
+
let schema = rootObjectSchema;
|
|
568
|
+
for (let i = 0; i < propertyPath.length; i++) {
|
|
569
|
+
const propertyName = propertyPath[i];
|
|
570
|
+
const tupleAst = unwrapArray(schema.ast);
|
|
571
|
+
if (tupleAst != null) {
|
|
572
|
+
schema = getArrayElementSchema(tupleAst, propertyName);
|
|
573
|
+
} else {
|
|
574
|
+
const propertyType = getPropertyType(schema.ast, propertyName.toString(), (propertyName2) => getProperty([
|
|
575
|
+
...propertyPath.slice(0, i),
|
|
576
|
+
propertyName2
|
|
577
|
+
]));
|
|
578
|
+
if (propertyType == null) {
|
|
579
|
+
const indexSignatureType = getIndexSignatureValueType(schema.ast);
|
|
580
|
+
if (indexSignatureType != null) {
|
|
581
|
+
schema = Schema3.make(indexSignatureType).annotations(indexSignatureType.annotations);
|
|
582
|
+
continue;
|
|
583
|
+
}
|
|
584
|
+
throw new TypeError(`Unknown property: ${formatPropertyPath([
|
|
585
|
+
...propertyPath.slice(0, i),
|
|
586
|
+
propertyName
|
|
587
|
+
])}`);
|
|
588
|
+
}
|
|
589
|
+
schema = Schema3.make(propertyType).annotations(propertyType.annotations);
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
return schema;
|
|
593
|
+
}
|
|
594
|
+
/**
|
|
595
|
+
* Rejects properties not declared on the schema. Types with index signatures allow extra keys.
|
|
596
|
+
*/
|
|
597
|
+
static assertExactProperties(schema, value, getProperty = () => void 0, path = []) {
|
|
598
|
+
if (!isPlainRecord(value)) {
|
|
599
|
+
return;
|
|
600
|
+
}
|
|
601
|
+
const typeLiteral = resolveTypeLiteral(schema.ast, (propertyName) => getProperty([
|
|
602
|
+
...path,
|
|
603
|
+
propertyName
|
|
604
|
+
]));
|
|
605
|
+
if (typeLiteral == null) {
|
|
606
|
+
return;
|
|
607
|
+
}
|
|
608
|
+
const propertySignatures = SchemaAST.getPropertySignatures(typeLiteral);
|
|
609
|
+
const allowedKeys = new Set(propertySignatures.map((property) => String(property.name)));
|
|
610
|
+
const indexSignatureType = typeLiteral.indexSignatures[0]?.type;
|
|
611
|
+
for (const key of Object.keys(value)) {
|
|
612
|
+
const propertyPath = [
|
|
613
|
+
...path,
|
|
614
|
+
key
|
|
615
|
+
];
|
|
616
|
+
if (!allowedKeys.has(key)) {
|
|
617
|
+
if (indexSignatureType == null) {
|
|
618
|
+
throw new TypeError(`Unknown property: ${formatPropertyPath(propertyPath)}`);
|
|
619
|
+
}
|
|
620
|
+
const indexSchema = Schema3.make(indexSignatureType).annotations(indexSignatureType.annotations);
|
|
621
|
+
this.assertExactProperties(indexSchema, value[key], getProperty, propertyPath);
|
|
622
|
+
continue;
|
|
623
|
+
}
|
|
624
|
+
const propertySignature = propertySignatures.find((property) => String(property.name) === key);
|
|
625
|
+
invariant5(propertySignature, "Property signature must exist.", { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 104, S: this, A: ["propertySignature", "'Property signature must exist.'"] });
|
|
626
|
+
const propertySchema = Schema3.make(propertySignature.type).annotations(propertySignature.type.annotations);
|
|
627
|
+
this.assertExactProperties(propertySchema, value[key], getProperty, propertyPath);
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
static getIndexedElementSchema(schema, index) {
|
|
631
|
+
const arrayAst = unwrapArray(schema.ast);
|
|
632
|
+
if (arrayAst != null) {
|
|
633
|
+
return getArrayElementSchema(arrayAst, index);
|
|
634
|
+
}
|
|
635
|
+
const unionAst = unwrapAst(schema.ast, (candidate) => SchemaAST.isUnion(candidate) && candidate.types.some((member) => unwrapArray(member) != null));
|
|
636
|
+
if (unionAst != null && SchemaAST.isUnion(unionAst)) {
|
|
637
|
+
for (const member of unionAst.types) {
|
|
638
|
+
const memberArrayAst = unwrapArray(member);
|
|
639
|
+
if (memberArrayAst != null) {
|
|
640
|
+
return getArrayElementSchema(memberArrayAst, index);
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
return null;
|
|
645
|
+
}
|
|
646
|
+
static getTargetPropertySchema(target, prop) {
|
|
647
|
+
const schema = target[SchemaId];
|
|
648
|
+
invariant5(schema, "target has no schema", { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 127, S: this, A: ["schema", "'target has no schema'"] });
|
|
649
|
+
if (Array.isArray(target)) {
|
|
650
|
+
if (prop === "length") {
|
|
651
|
+
return Schema3.Number;
|
|
652
|
+
}
|
|
653
|
+
if (typeof prop !== "symbol") {
|
|
654
|
+
const indexedSchema = this.getIndexedElementSchema(schema, prop);
|
|
655
|
+
if (indexedSchema != null) {
|
|
656
|
+
return indexedSchema;
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
if (SchemaAST.isTypeLiteral(schema.ast)) {
|
|
660
|
+
return schema;
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
if (typeof prop === "number" || typeof prop === "string" && /^\d+$/.test(prop)) {
|
|
664
|
+
const indexedSchema = this.getIndexedElementSchema(schema, prop);
|
|
665
|
+
if (indexedSchema != null) {
|
|
666
|
+
return indexedSchema;
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
const arrayAst = unwrapArray(schema.ast);
|
|
670
|
+
if (arrayAst != null) {
|
|
671
|
+
return getArrayElementSchema(arrayAst, prop);
|
|
672
|
+
}
|
|
673
|
+
const propertyType = getPropertyType(schema.ast, prop.toString(), (prop2) => target[prop2]);
|
|
674
|
+
if (propertyType == null) {
|
|
675
|
+
const indexSignatureType = getIndexSignatureValueType(schema.ast);
|
|
676
|
+
if (indexSignatureType != null) {
|
|
677
|
+
return Schema3.make(indexSignatureType).annotations(indexSignatureType.annotations);
|
|
678
|
+
}
|
|
679
|
+
throw new TypeError(`Unknown property: ${String(prop)}`);
|
|
680
|
+
}
|
|
681
|
+
return Schema3.make(propertyType).annotations(propertyType.annotations);
|
|
682
|
+
}
|
|
683
|
+
};
|
|
684
|
+
var getArrayElementSchema = (tupleAst, property) => {
|
|
685
|
+
const elementIndex = typeof property === "number" ? property : typeof property === "string" ? parseInt(property, 10) : Number.NaN;
|
|
686
|
+
if (Number.isNaN(elementIndex)) {
|
|
687
|
+
invariant5(property === "length", `invalid array property: ${String(property)}`, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 171, S: void 0, A: ["property === 'length'", "`invalid array property: ${String(property)}`"] });
|
|
688
|
+
return Schema3.Number;
|
|
689
|
+
}
|
|
690
|
+
if (elementIndex < tupleAst.elements.length) {
|
|
691
|
+
const elementType = tupleAst.elements[elementIndex].type;
|
|
692
|
+
return Schema3.make(elementType).annotations(elementType.annotations);
|
|
693
|
+
}
|
|
694
|
+
const restType = tupleAst.rest;
|
|
695
|
+
return Schema3.make(restType[0].type).annotations(restType[0].annotations);
|
|
696
|
+
};
|
|
697
|
+
var flattenUnion = (typeAst) => SchemaAST.isUnion(typeAst) ? typeAst.types.flatMap(flattenUnion) : [
|
|
698
|
+
typeAst
|
|
699
|
+
];
|
|
700
|
+
var getProperties = (typeAst, getTargetPropertyFn) => {
|
|
701
|
+
const astCandidates = flattenUnion(typeAst);
|
|
702
|
+
const typeAstList = astCandidates.filter((type) => SchemaAST.isTypeLiteral(type));
|
|
703
|
+
if (typeAstList.length === 0) {
|
|
704
|
+
return [];
|
|
705
|
+
}
|
|
706
|
+
if (typeAstList.length === 1) {
|
|
707
|
+
return SchemaAST.getPropertySignatures(typeAstList[0]);
|
|
708
|
+
}
|
|
709
|
+
const typeDiscriminators = getTypeDiscriminators(typeAstList);
|
|
710
|
+
const targetPropertyValue = getTargetPropertyFn(String(typeDiscriminators[0].name));
|
|
711
|
+
const typeIndex = typeDiscriminators.findIndex((p) => targetPropertyValue === p.type.literal);
|
|
712
|
+
invariant5(typeIndex !== -1, "discriminator field not set on target", { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 196, S: void 0, A: ["typeIndex !== -1", "'discriminator field not set on target'"] });
|
|
713
|
+
return SchemaAST.getPropertySignatures(typeAstList[typeIndex]);
|
|
714
|
+
};
|
|
715
|
+
var getPropertyType = (ast, propertyName, getTargetPropertyFn) => {
|
|
716
|
+
const anyOrObject = unwrapAst(ast, (candidate) => SchemaAST.isAnyKeyword(candidate) || SchemaAST.isUnknownKeyword(candidate) || SchemaAST.isObjectKeyword(candidate));
|
|
717
|
+
if (anyOrObject != null) {
|
|
718
|
+
return ast;
|
|
719
|
+
}
|
|
720
|
+
const typeOrDiscriminatedUnion = unwrapAst(ast, (t) => {
|
|
721
|
+
return SchemaAST.isTypeLiteral(t) || SchemaAST.isUnion(t) && t.types.some((t2) => SchemaAST.isTypeLiteral(t2));
|
|
722
|
+
});
|
|
723
|
+
if (typeOrDiscriminatedUnion == null) {
|
|
724
|
+
return null;
|
|
725
|
+
}
|
|
726
|
+
const targetProperty = getProperties(typeOrDiscriminatedUnion, getTargetPropertyFn).find((p) => p.name === propertyName);
|
|
727
|
+
if (targetProperty != null) {
|
|
728
|
+
return unwrapAst(targetProperty.type);
|
|
729
|
+
}
|
|
730
|
+
const indexSignatureType = unwrapAst(ast, SchemaAST.isTypeLiteral);
|
|
731
|
+
if (indexSignatureType && SchemaAST.isTypeLiteral(indexSignatureType) && indexSignatureType.indexSignatures.length > 0) {
|
|
732
|
+
return unwrapAst(indexSignatureType.indexSignatures[0].type);
|
|
733
|
+
}
|
|
734
|
+
return null;
|
|
735
|
+
};
|
|
736
|
+
var getTypeDiscriminators = (typeAstList) => {
|
|
737
|
+
const discriminatorPropCandidates = typeAstList.flatMap(SchemaAST.getPropertySignatures).filter((p) => SchemaAST.isLiteral(p.type));
|
|
738
|
+
const propertyName = discriminatorPropCandidates[0].name;
|
|
739
|
+
const isValidDiscriminator = discriminatorPropCandidates.every((p) => p.name === propertyName && !p.isOptional);
|
|
740
|
+
const everyTypeHasDiscriminator = discriminatorPropCandidates.length === typeAstList.length;
|
|
741
|
+
const isDiscriminatedUnion = isValidDiscriminator && everyTypeHasDiscriminator;
|
|
742
|
+
invariant5(isDiscriminatedUnion, "type ambiguity: every type in a union must have a single unique-literal field", { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 226, S: void 0, A: ["isDiscriminatedUnion", "'type ambiguity: every type in a union must have a single unique-literal field'"] });
|
|
743
|
+
return discriminatorPropCandidates;
|
|
744
|
+
};
|
|
745
|
+
var unwrapAst = (rootAst, predicate) => {
|
|
746
|
+
let ast = rootAst;
|
|
747
|
+
while (ast != null) {
|
|
748
|
+
if (predicate?.(ast)) {
|
|
749
|
+
return ast;
|
|
750
|
+
}
|
|
751
|
+
if (SchemaAST.isUnion(ast)) {
|
|
752
|
+
const next = ast.types.find((t) => predicate != null && predicate(t) || SchemaAST.isSuspend(t));
|
|
753
|
+
if (next != null) {
|
|
754
|
+
ast = next;
|
|
755
|
+
continue;
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
if (SchemaAST.isSuspend(ast)) {
|
|
759
|
+
ast = ast.f();
|
|
760
|
+
} else {
|
|
761
|
+
return predicate == null ? ast : null;
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
return null;
|
|
765
|
+
};
|
|
766
|
+
var unwrapArray = (ast) => unwrapAst(ast, SchemaAST.isTupleType);
|
|
767
|
+
var getIndexSignatureValueType = (ast) => {
|
|
768
|
+
const typeLiteral = unwrapAst(ast, SchemaAST.isTypeLiteral);
|
|
769
|
+
if (typeLiteral == null || !SchemaAST.isTypeLiteral(typeLiteral) || typeLiteral.indexSignatures.length === 0) {
|
|
770
|
+
return null;
|
|
771
|
+
}
|
|
772
|
+
return unwrapAst(typeLiteral.indexSignatures[0].type);
|
|
773
|
+
};
|
|
774
|
+
var resolveTypeLiteral = (ast, getTargetPropertyFn) => {
|
|
775
|
+
const anyOrObject = unwrapAst(ast, (candidate) => SchemaAST.isAnyKeyword(candidate) || SchemaAST.isUnknownKeyword(candidate) || SchemaAST.isObjectKeyword(candidate));
|
|
776
|
+
if (anyOrObject != null) {
|
|
777
|
+
return null;
|
|
778
|
+
}
|
|
779
|
+
const typeOrDiscriminatedUnion = unwrapAst(ast, (type) => {
|
|
780
|
+
return SchemaAST.isTypeLiteral(type) || SchemaAST.isUnion(type) && type.types.some((member) => SchemaAST.isTypeLiteral(member));
|
|
781
|
+
});
|
|
782
|
+
if (typeOrDiscriminatedUnion == null) {
|
|
783
|
+
return null;
|
|
784
|
+
}
|
|
785
|
+
if (SchemaAST.isTypeLiteral(typeOrDiscriminatedUnion)) {
|
|
786
|
+
return typeOrDiscriminatedUnion;
|
|
787
|
+
}
|
|
788
|
+
if (!SchemaAST.isUnion(typeOrDiscriminatedUnion)) {
|
|
789
|
+
return null;
|
|
790
|
+
}
|
|
791
|
+
const typeAstList = typeOrDiscriminatedUnion.types.filter((type) => SchemaAST.isTypeLiteral(type));
|
|
792
|
+
if (typeAstList.length === 1) {
|
|
793
|
+
return typeAstList[0];
|
|
794
|
+
}
|
|
795
|
+
const typeDiscriminators = getTypeDiscriminators(typeAstList);
|
|
796
|
+
const targetPropertyValue = getTargetPropertyFn(String(typeDiscriminators[0].name));
|
|
797
|
+
const typeIndex = typeDiscriminators.findIndex((property) => targetPropertyValue === property.type.literal);
|
|
798
|
+
invariant5(typeIndex !== -1, "discriminator field not set on target", { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 292, S: void 0, A: ["typeIndex !== -1", "'discriminator field not set on target'"] });
|
|
799
|
+
return typeAstList[typeIndex];
|
|
800
|
+
};
|
|
801
|
+
var isPlainRecord = (value) => {
|
|
802
|
+
if (typeof value !== "object" || value === null || Array.isArray(value) || value instanceof Uint8Array) {
|
|
803
|
+
return false;
|
|
804
|
+
}
|
|
805
|
+
const proto = Object.getPrototypeOf(value);
|
|
806
|
+
return proto === Object.prototype || proto === null;
|
|
807
|
+
};
|
|
808
|
+
var formatPropertyPath = (path) => path.map(String).join(".");
|
|
809
|
+
var checkIdNotPresentOnSchema = (schema) => {
|
|
810
|
+
invariant5(SchemaAST.isTypeLiteral(schema.ast), void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 304, S: void 0, A: ["SchemaAST.isTypeLiteral(schema.ast)", ""] });
|
|
811
|
+
const idProperty = SchemaAST.getPropertySignatures(schema.ast).find((prop) => prop.name === "id");
|
|
812
|
+
if (idProperty != null) {
|
|
813
|
+
throw new Error('"id" property name is reserved');
|
|
814
|
+
}
|
|
815
|
+
};
|
|
816
|
+
|
|
817
|
+
// src/internal/common/proxy/typed-handler.ts
|
|
818
|
+
import * as Schema4 from "effect/Schema";
|
|
819
|
+
import * as SchemaAST2 from "effect/SchemaAST";
|
|
820
|
+
import { Event } from "@dxos/async";
|
|
821
|
+
import { inspectCustom } from "@dxos/debug";
|
|
822
|
+
import { assertArgument as assertArgument2, invariant as invariant6 } from "@dxos/invariant";
|
|
823
|
+
import { getDeep, setDeep } from "@dxos/util";
|
|
824
|
+
var __dxlog_file6 = "/__w/dxos/dxos/packages/core/echo/echo/src/internal/common/proxy/typed-handler.ts";
|
|
825
|
+
var deepCopy = (value, visited = /* @__PURE__ */ new Map()) => {
|
|
826
|
+
if (value == null || typeof value !== "object") {
|
|
827
|
+
return value;
|
|
828
|
+
}
|
|
829
|
+
const actualValue = getRawTarget(value);
|
|
830
|
+
if (visited.has(actualValue)) {
|
|
831
|
+
return visited.get(actualValue);
|
|
832
|
+
}
|
|
833
|
+
if (actualValue instanceof ReactiveArray) {
|
|
834
|
+
const copy2 = new ReactiveArray();
|
|
835
|
+
visited.set(actualValue, copy2);
|
|
836
|
+
for (const item of actualValue) {
|
|
837
|
+
copy2.push(deepCopy(item, visited));
|
|
838
|
+
}
|
|
839
|
+
copyHiddenProperties(actualValue, copy2);
|
|
840
|
+
return copy2;
|
|
841
|
+
}
|
|
842
|
+
const proto = Object.getPrototypeOf(actualValue);
|
|
843
|
+
if (proto !== Array.prototype && proto !== null && !isReactiveRecord(actualValue)) {
|
|
844
|
+
return value;
|
|
845
|
+
}
|
|
846
|
+
if (Array.isArray(actualValue)) {
|
|
847
|
+
const copy2 = new ReactiveArray();
|
|
848
|
+
visited.set(actualValue, copy2);
|
|
849
|
+
for (const item of actualValue) {
|
|
850
|
+
copy2.push(deepCopy(item, visited));
|
|
851
|
+
}
|
|
852
|
+
return copy2;
|
|
853
|
+
}
|
|
854
|
+
const copy = {};
|
|
855
|
+
visited.set(actualValue, copy);
|
|
856
|
+
for (const key of Object.keys(actualValue)) {
|
|
857
|
+
copy[key] = deepCopy(actualValue[key], visited);
|
|
858
|
+
}
|
|
859
|
+
copyHiddenProperties(actualValue, copy);
|
|
860
|
+
return copy;
|
|
861
|
+
};
|
|
862
|
+
var copyHiddenProperties = (source, target) => {
|
|
863
|
+
if (SchemaId in source) {
|
|
864
|
+
defineHiddenProperty(target, SchemaId, source[SchemaId]);
|
|
865
|
+
}
|
|
866
|
+
if (TypeId in source) {
|
|
867
|
+
defineHiddenProperty(target, TypeId, source[TypeId]);
|
|
868
|
+
}
|
|
869
|
+
};
|
|
870
|
+
var TypedObjectPrototype = Object.create(Object.prototype);
|
|
871
|
+
defineHiddenProperty(TypedObjectPrototype, symbolReactivePrototype, true);
|
|
872
|
+
Object.defineProperties(TypedObjectPrototype, {
|
|
873
|
+
// TODO(burdon): Remove?
|
|
874
|
+
[objectData]: {
|
|
875
|
+
get() {
|
|
876
|
+
return toJSON(getRawTarget(this));
|
|
877
|
+
}
|
|
878
|
+
},
|
|
879
|
+
[ChangeId]: {
|
|
880
|
+
// A function that runs a mutation inside a controlled change context. Only root objects (which
|
|
881
|
+
// own an `EventId`) expose one; nested records share their root's reactivity and return undefined.
|
|
882
|
+
get() {
|
|
883
|
+
const target = getRawTarget(this);
|
|
884
|
+
if (!(EventId in target)) {
|
|
885
|
+
return void 0;
|
|
886
|
+
}
|
|
887
|
+
return (callback) => executeChange(target, target, this, callback);
|
|
888
|
+
}
|
|
889
|
+
},
|
|
890
|
+
[StaticTypeSchemaSlot]: {
|
|
891
|
+
// Lazily rebuild the source Effect Schema from `jsonSchema` and cache it as an own (hidden)
|
|
892
|
+
// property so subsequent reads short-circuit this accessor; the set-trap deletes the cache when
|
|
893
|
+
// `jsonSchema` is mutated.
|
|
894
|
+
get() {
|
|
895
|
+
const target = getRawTarget(this);
|
|
896
|
+
const jsonSchema = target.jsonSchema;
|
|
897
|
+
if (jsonSchema == null) {
|
|
898
|
+
return void 0;
|
|
899
|
+
}
|
|
900
|
+
const rebuilt = toEffectSchema(jsonSchema);
|
|
901
|
+
defineHiddenProperty(target, StaticTypeSchemaSlot, rebuilt);
|
|
902
|
+
return rebuilt;
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
});
|
|
906
|
+
var isBehaviourAccessor = (target, prop) => {
|
|
907
|
+
let proto = Object.getPrototypeOf(target);
|
|
908
|
+
while (proto != null && proto !== Object.prototype) {
|
|
909
|
+
const descriptor = Object.getOwnPropertyDescriptor(proto, prop);
|
|
910
|
+
if (descriptor != null) {
|
|
911
|
+
return descriptor.get != null;
|
|
912
|
+
}
|
|
913
|
+
proto = Object.getPrototypeOf(proto);
|
|
914
|
+
}
|
|
915
|
+
return false;
|
|
916
|
+
};
|
|
917
|
+
var assertMutableWithinChange = (echoRoot, prop) => {
|
|
918
|
+
const isInitialized = EventId in echoRoot;
|
|
919
|
+
if (isInitialized && typeof prop !== "symbol" && !isInChangeContext(echoRoot)) {
|
|
920
|
+
throw new Error(`Cannot modify object property "${String(prop)}" outside of Obj.update(). Use Obj.update(obj, (mutableObj) => { mutableObj.property = value; }) instead.`);
|
|
921
|
+
}
|
|
922
|
+
return isInitialized;
|
|
923
|
+
};
|
|
924
|
+
var compactMetadataToInstanceState = (target) => {
|
|
925
|
+
if (Array.isArray(target) || Object.getPrototypeOf(target) !== Object.prototype) {
|
|
926
|
+
return;
|
|
927
|
+
}
|
|
928
|
+
const state = Object.create(TypedObjectPrototype);
|
|
929
|
+
for (const symbol of Object.getOwnPropertySymbols(target)) {
|
|
930
|
+
Object.defineProperty(state, symbol, Object.getOwnPropertyDescriptor(target, symbol));
|
|
931
|
+
delete target[symbol];
|
|
932
|
+
}
|
|
933
|
+
Object.setPrototypeOf(target, state);
|
|
934
|
+
};
|
|
935
|
+
var TypedReactiveHandler = class _TypedReactiveHandler {
|
|
936
|
+
static instance = new _TypedReactiveHandler();
|
|
937
|
+
_proxyMap = /* @__PURE__ */ new WeakMap();
|
|
938
|
+
_inSet = false;
|
|
939
|
+
constructor() {
|
|
940
|
+
}
|
|
941
|
+
init(target) {
|
|
942
|
+
assertArgument2(typeof target === "object" && target !== null, "target");
|
|
943
|
+
invariant6(SchemaId in target, "Schema is not defined for the target", { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 223, S: this, A: ["SchemaId in target", "'Schema is not defined for the target'"] });
|
|
944
|
+
const hasOwner = !!getOwner(target);
|
|
945
|
+
if (!(EventId in target) && !hasOwner) {
|
|
946
|
+
defineHiddenProperty(target, EventId, new Event());
|
|
947
|
+
}
|
|
948
|
+
defineHiddenProperty(target, ObjectDeletedId, false);
|
|
949
|
+
if (!hasOwner) {
|
|
950
|
+
for (const key in target) {
|
|
951
|
+
if (target[symbolIsProxy]) {
|
|
952
|
+
continue;
|
|
953
|
+
}
|
|
954
|
+
let value = target[key];
|
|
955
|
+
if (isValidProxyTarget(value) || isProxy(value)) {
|
|
956
|
+
if (hasForeignOwner(value, target)) {
|
|
957
|
+
value = deepCopy(value);
|
|
958
|
+
target[key] = value;
|
|
959
|
+
}
|
|
960
|
+
setOwnerRecursive(value, target);
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
}
|
|
964
|
+
Object.defineProperty(target, inspectCustom, {
|
|
965
|
+
enumerable: false,
|
|
966
|
+
configurable: true,
|
|
967
|
+
value: this._inspect.bind(target)
|
|
968
|
+
});
|
|
969
|
+
compactMetadataToInstanceState(target);
|
|
970
|
+
}
|
|
971
|
+
/**
|
|
972
|
+
* Hide the internal instance-state prototype so consumers see a plain object; arrays keep their
|
|
973
|
+
* real (ReactiveArray) prototype.
|
|
974
|
+
*/
|
|
975
|
+
getPrototypeOf(target) {
|
|
976
|
+
return Array.isArray(target) ? Reflect.getPrototypeOf(target) : Object.prototype;
|
|
977
|
+
}
|
|
978
|
+
get(target, prop, receiver) {
|
|
979
|
+
if (typeof prop === "symbol" && isBehaviourAccessor(target, prop)) {
|
|
980
|
+
return Reflect.get(target, prop, receiver);
|
|
981
|
+
}
|
|
982
|
+
if (prop === TypeEntityId) {
|
|
983
|
+
return Reflect.get(target, prop, receiver);
|
|
984
|
+
}
|
|
985
|
+
if (Object.getOwnPropertyDescriptor(target, prop)?.get) {
|
|
986
|
+
return Reflect.get(target, prop, receiver);
|
|
987
|
+
}
|
|
988
|
+
const value = Reflect.get(target, prop, receiver);
|
|
989
|
+
if (isValidProxyTarget(value)) {
|
|
990
|
+
return createProxy(value, this);
|
|
991
|
+
}
|
|
992
|
+
return value;
|
|
993
|
+
}
|
|
994
|
+
set(target, prop, value, receiver) {
|
|
995
|
+
const echoRoot = getEchoRoot(target);
|
|
996
|
+
const isInitialized = assertMutableWithinChange(echoRoot, prop);
|
|
997
|
+
let result = false;
|
|
998
|
+
this._inSet = true;
|
|
999
|
+
try {
|
|
1000
|
+
batchEvents(() => {
|
|
1001
|
+
const { echoRoot: _, preparedValue } = this._prepareValueForAssignment(target, prop, value);
|
|
1002
|
+
result = Reflect.set(target, prop, preparedValue, receiver);
|
|
1003
|
+
if (prop === "jsonSchema") {
|
|
1004
|
+
Reflect.deleteProperty(target, StaticTypeSchemaSlot);
|
|
1005
|
+
}
|
|
1006
|
+
if (isInitialized) {
|
|
1007
|
+
queueNotification(echoRoot);
|
|
1008
|
+
notifyOwnerChain(target);
|
|
1009
|
+
}
|
|
1010
|
+
});
|
|
1011
|
+
} finally {
|
|
1012
|
+
this._inSet = false;
|
|
1013
|
+
}
|
|
1014
|
+
return result;
|
|
1015
|
+
}
|
|
1016
|
+
ownKeys(target) {
|
|
1017
|
+
return Reflect.ownKeys(target);
|
|
1018
|
+
}
|
|
1019
|
+
deleteProperty(target, property) {
|
|
1020
|
+
const echoRoot = getEchoRoot(target);
|
|
1021
|
+
const isInitialized = EventId in echoRoot;
|
|
1022
|
+
const isSymbolProp = typeof property === "symbol";
|
|
1023
|
+
if (isInitialized && !isSymbolProp && !isInChangeContext(echoRoot)) {
|
|
1024
|
+
throw createPropertyDeleteError(property);
|
|
1025
|
+
}
|
|
1026
|
+
const result = Reflect.deleteProperty(target, property);
|
|
1027
|
+
if (isInitialized) {
|
|
1028
|
+
queueNotification(echoRoot);
|
|
1029
|
+
}
|
|
1030
|
+
return result;
|
|
1031
|
+
}
|
|
1032
|
+
defineProperty(target, property, attributes) {
|
|
1033
|
+
const echoRoot = getEchoRoot(target);
|
|
1034
|
+
const isInitialized = assertMutableWithinChange(echoRoot, property);
|
|
1035
|
+
const { echoRoot: _, preparedValue } = this._prepareValueForAssignment(target, property, attributes.value);
|
|
1036
|
+
const result = Reflect.defineProperty(target, property, {
|
|
1037
|
+
...attributes,
|
|
1038
|
+
value: preparedValue
|
|
1039
|
+
});
|
|
1040
|
+
if (!this._inSet && isInitialized) {
|
|
1041
|
+
queueNotification(echoRoot);
|
|
1042
|
+
}
|
|
1043
|
+
return result;
|
|
1044
|
+
}
|
|
1045
|
+
textUpdate(target, path, newText) {
|
|
1046
|
+
this._applyTextMutation(target, path, () => newText);
|
|
1047
|
+
}
|
|
1048
|
+
textSplice(target, path, start, deleteCount, insert) {
|
|
1049
|
+
let removed = "";
|
|
1050
|
+
this._applyTextMutation(target, path, (current) => {
|
|
1051
|
+
const range = normalizeSpliceRange(current.length, start, deleteCount);
|
|
1052
|
+
removed = current.slice(range.start, range.start + range.deleteCount);
|
|
1053
|
+
return current.slice(0, range.start) + insert + current.slice(range.start + range.deleteCount);
|
|
1054
|
+
});
|
|
1055
|
+
return removed;
|
|
1056
|
+
}
|
|
1057
|
+
/**
|
|
1058
|
+
* Shared read-modify-write for the in-memory string CRDT path. Mirrors the `set` trap: enforce the
|
|
1059
|
+
* change context, then mutate and notify through the same batched notification path so reactivity fires.
|
|
1060
|
+
*
|
|
1061
|
+
* Writes via `setDeep` on the raw target, intentionally bypassing `_prepareValueForAssignment` /
|
|
1062
|
+
* `_validateValue`: a string CRDT delta produces a string, and per-delta schema checks (pattern,
|
|
1063
|
+
* maxLength) would reject valid intermediate states during incremental edits. Such constraints are
|
|
1064
|
+
* enforced at the initial assignment or as application-level invariants, mirroring the Automerge path.
|
|
1065
|
+
*/
|
|
1066
|
+
_applyTextMutation(target, path, compute) {
|
|
1067
|
+
const echoRoot = getEchoRoot(target);
|
|
1068
|
+
if (!isInChangeContext(echoRoot)) {
|
|
1069
|
+
throw new Error(`Cannot modify text at "${path.join(".")}" outside of Obj.update(). Use Obj.update(obj, () => { Text.splice(obj, path, ...); }) instead.`);
|
|
1070
|
+
}
|
|
1071
|
+
const keyPath = [
|
|
1072
|
+
...path
|
|
1073
|
+
];
|
|
1074
|
+
invariant6(keyPath.length > 0, "Text path must be non-empty", { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 380, S: this, A: ["keyPath.length > 0", "'Text path must be non-empty'"] });
|
|
1075
|
+
const current = getDeep(target, keyPath);
|
|
1076
|
+
if (typeof current !== "string") {
|
|
1077
|
+
throw new TypeError(`Text mutation target at "${keyPath.join(".")}" is not a string.`);
|
|
1078
|
+
}
|
|
1079
|
+
const next = compute(current);
|
|
1080
|
+
batchEvents(() => {
|
|
1081
|
+
setDeep(target, keyPath, next);
|
|
1082
|
+
queueNotification(echoRoot);
|
|
1083
|
+
notifyOwnerChain(target);
|
|
1084
|
+
});
|
|
1085
|
+
}
|
|
1086
|
+
/**
|
|
1087
|
+
* Prepare a value for assignment to a typed object property.
|
|
1088
|
+
* Handles cycle detection, copy-on-assign, array conversion, validation, and ownership.
|
|
1089
|
+
*/
|
|
1090
|
+
_prepareValueForAssignment(target, prop, value) {
|
|
1091
|
+
const echoRoot = getEchoRoot(target);
|
|
1092
|
+
if (typeof prop === "symbol") {
|
|
1093
|
+
return {
|
|
1094
|
+
echoRoot,
|
|
1095
|
+
preparedValue: value
|
|
1096
|
+
};
|
|
1097
|
+
}
|
|
1098
|
+
if (isValidProxyTarget(value) || isProxy(value)) {
|
|
1099
|
+
if (wouldCreateCycle(echoRoot, value)) {
|
|
1100
|
+
throw new Error("Cannot create cycles in typed object graph. Consider using Ref for circular references.");
|
|
1101
|
+
}
|
|
1102
|
+
}
|
|
1103
|
+
if (isValidProxyTarget(value) || isProxy(value)) {
|
|
1104
|
+
const actualValue = getRawTarget(value);
|
|
1105
|
+
const isRootEchoObject = EventId in actualValue;
|
|
1106
|
+
if (isRootEchoObject) {
|
|
1107
|
+
throw new Error("Object references must be wrapped with `Ref.make`");
|
|
1108
|
+
}
|
|
1109
|
+
}
|
|
1110
|
+
if (isValidProxyTarget(value) || isProxy(value)) {
|
|
1111
|
+
const actualValue = getRawTarget(value);
|
|
1112
|
+
const existingOwner = getOwner(actualValue);
|
|
1113
|
+
if (existingOwner != null && existingOwner !== echoRoot) {
|
|
1114
|
+
value = deepCopy(value);
|
|
1115
|
+
}
|
|
1116
|
+
}
|
|
1117
|
+
if (Array.isArray(value) && !(value instanceof ReactiveArray)) {
|
|
1118
|
+
value = ReactiveArray.from(value);
|
|
1119
|
+
}
|
|
1120
|
+
const validatedValue = this._validateValue(target, prop, value);
|
|
1121
|
+
if (isValidProxyTarget(validatedValue) || isProxy(validatedValue)) {
|
|
1122
|
+
setOwnerRecursive(validatedValue, echoRoot);
|
|
1123
|
+
}
|
|
1124
|
+
return {
|
|
1125
|
+
echoRoot,
|
|
1126
|
+
preparedValue: validatedValue
|
|
1127
|
+
};
|
|
1128
|
+
}
|
|
1129
|
+
_validateValue(target, prop, value) {
|
|
1130
|
+
if (prop === ParentId) {
|
|
1131
|
+
return value;
|
|
1132
|
+
}
|
|
1133
|
+
const schema = SchemaValidator.getTargetPropertySchema(target, prop);
|
|
1134
|
+
const _ = Schema4.asserts(schema)(value);
|
|
1135
|
+
SchemaValidator.assertExactProperties(schema, value, (path) => getDeep(value, path));
|
|
1136
|
+
if (isValidProxyTarget(value)) {
|
|
1137
|
+
setSchemaProperties(value, schema);
|
|
1138
|
+
}
|
|
1139
|
+
return value;
|
|
1140
|
+
}
|
|
1141
|
+
_inspect(_, options, inspectFn) {
|
|
1142
|
+
const inspected = inspectFn(this, {
|
|
1143
|
+
...options,
|
|
1144
|
+
showHidden: false,
|
|
1145
|
+
customInspect: false
|
|
1146
|
+
});
|
|
1147
|
+
return `Typed ${inspected}`;
|
|
1148
|
+
}
|
|
1149
|
+
};
|
|
1150
|
+
var toJSON = (target) => {
|
|
1151
|
+
return {
|
|
1152
|
+
"@type": "TypedReactiveObject",
|
|
1153
|
+
...target
|
|
1154
|
+
};
|
|
1155
|
+
};
|
|
1156
|
+
var setSchemaProperties = (obj, schema, typeSource) => {
|
|
1157
|
+
const schemaType = getSchemaURI(schema);
|
|
1158
|
+
if (schemaType != null) {
|
|
1159
|
+
defineHiddenProperty(obj, TypeId, schemaType);
|
|
1160
|
+
}
|
|
1161
|
+
if (typeSource != null) {
|
|
1162
|
+
defineHiddenProperty(obj, TypeEntityId, typeSource);
|
|
1163
|
+
Object.defineProperty(obj, SchemaId, {
|
|
1164
|
+
get: () => typeSource[StaticTypeSchemaSlot] ?? schema,
|
|
1165
|
+
enumerable: false,
|
|
1166
|
+
configurable: true
|
|
1167
|
+
});
|
|
1168
|
+
} else {
|
|
1169
|
+
defineHiddenProperty(obj, SchemaId, schema);
|
|
1170
|
+
}
|
|
1171
|
+
if (Array.isArray(obj)) {
|
|
1172
|
+
for (let index = 0; index < obj.length; index++) {
|
|
1173
|
+
if (isValidProxyTarget(obj[index])) {
|
|
1174
|
+
const elementSchema = SchemaValidator.getIndexedElementSchema(schema, index) ?? Schema4.Any;
|
|
1175
|
+
setSchemaProperties(obj[index], elementSchema);
|
|
1176
|
+
}
|
|
1177
|
+
}
|
|
1178
|
+
return;
|
|
1179
|
+
}
|
|
1180
|
+
for (const key in obj) {
|
|
1181
|
+
if (isValidProxyTarget(obj[key])) {
|
|
1182
|
+
let elementSchema;
|
|
1183
|
+
try {
|
|
1184
|
+
elementSchema = SchemaValidator.getTargetPropertySchema(obj, key);
|
|
1185
|
+
} catch {
|
|
1186
|
+
elementSchema = Schema4.Any;
|
|
1187
|
+
}
|
|
1188
|
+
setSchemaProperties(obj[key], elementSchema);
|
|
1189
|
+
}
|
|
1190
|
+
}
|
|
1191
|
+
};
|
|
1192
|
+
var prepareTypedTarget = (target, schema, typeSource) => {
|
|
1193
|
+
if (!SchemaAST2.isTypeLiteral(schema.ast)) {
|
|
1194
|
+
throw new Error("schema has to describe an object type");
|
|
1195
|
+
}
|
|
1196
|
+
SchemaValidator.validateSchema(schema);
|
|
1197
|
+
const _ = Schema4.asserts(schema)(target);
|
|
1198
|
+
SchemaValidator.assertExactProperties(schema, target, (path) => getDeep(target, path));
|
|
1199
|
+
makeArraysReactive(target);
|
|
1200
|
+
setSchemaProperties(target, schema, typeSource);
|
|
1201
|
+
};
|
|
1202
|
+
var makeArraysReactive = (target) => {
|
|
1203
|
+
for (const key in target) {
|
|
1204
|
+
if (target[symbolIsProxy]) {
|
|
1205
|
+
continue;
|
|
1206
|
+
}
|
|
1207
|
+
if (Array.isArray(target[key])) {
|
|
1208
|
+
target[key] = ReactiveArray.from(target[key]);
|
|
1209
|
+
}
|
|
1210
|
+
if (typeof target[key] === "object") {
|
|
1211
|
+
makeArraysReactive(target[key]);
|
|
1212
|
+
}
|
|
1213
|
+
}
|
|
1214
|
+
};
|
|
1215
|
+
|
|
1216
|
+
// src/internal/common/proxy/make-object.ts
|
|
1217
|
+
import { EntityId } from "@dxos/keys";
|
|
1218
|
+
var makeObject = (schema, obj, meta, typeSource) => {
|
|
1219
|
+
return createReactiveObject(Object.assign({}, obj), meta, schema, typeSource);
|
|
1220
|
+
};
|
|
1221
|
+
var createReactiveObject = (obj, meta, schema, typeSource) => {
|
|
1222
|
+
if (!isValidProxyTarget(obj)) {
|
|
1223
|
+
throw new Error("Value cannot be made into a reactive object.");
|
|
1224
|
+
}
|
|
1225
|
+
if (!schema) {
|
|
1226
|
+
throw new Error("Schema is required for reactive objects. Use Atom for untyped reactive state.");
|
|
1227
|
+
}
|
|
1228
|
+
const parent = obj[ParentId];
|
|
1229
|
+
if (parent !== void 0) {
|
|
1230
|
+
delete obj[ParentId];
|
|
1231
|
+
}
|
|
1232
|
+
const annotation = getTypeAnnotation(schema);
|
|
1233
|
+
if (annotation) {
|
|
1234
|
+
setIdOnTarget(obj);
|
|
1235
|
+
defineHiddenProperty(obj, KindId, annotation.kind);
|
|
1236
|
+
}
|
|
1237
|
+
initMeta(obj, meta);
|
|
1238
|
+
if (parent !== void 0) {
|
|
1239
|
+
defineHiddenProperty(obj, ParentId, parent);
|
|
1240
|
+
}
|
|
1241
|
+
prepareTypedTarget(obj, schema, typeSource);
|
|
1242
|
+
attachTypedJsonSerializer(obj);
|
|
1243
|
+
const proxy = createProxy(obj, TypedReactiveHandler.instance);
|
|
1244
|
+
const metaProxy = obj[MetaId];
|
|
1245
|
+
if (metaProxy) {
|
|
1246
|
+
const metaTarget = getProxyTarget(metaProxy);
|
|
1247
|
+
if (metaTarget) {
|
|
1248
|
+
setMetaOwner(metaTarget, obj);
|
|
1249
|
+
}
|
|
1250
|
+
}
|
|
1251
|
+
return proxy;
|
|
1252
|
+
};
|
|
1253
|
+
var setIdOnTarget = (target) => {
|
|
1254
|
+
if ("id" in target && target.id !== void 0 && target.id !== null) {
|
|
1255
|
+
if (!EntityId.isValid(target.id)) {
|
|
1256
|
+
throw new Error("Invalid object id format.");
|
|
1257
|
+
}
|
|
1258
|
+
} else {
|
|
1259
|
+
target.id = EntityId.random();
|
|
1260
|
+
}
|
|
1261
|
+
};
|
|
1262
|
+
var initMeta = (obj, meta) => {
|
|
1263
|
+
const fullMeta = {
|
|
1264
|
+
...meta,
|
|
1265
|
+
keys: meta?.keys ?? [],
|
|
1266
|
+
tags: meta?.tags ?? [],
|
|
1267
|
+
annotations: meta?.annotations ?? {}
|
|
1268
|
+
};
|
|
1269
|
+
prepareTypedTarget(fullMeta, EntityMetaSchema);
|
|
1270
|
+
defineHiddenProperty(obj, MetaId, createProxy(fullMeta, TypedReactiveHandler.instance));
|
|
1271
|
+
};
|
|
1272
|
+
|
|
1273
|
+
// src/internal/Entity/entity.ts
|
|
1274
|
+
import * as Schema5 from "effect/Schema";
|
|
1275
|
+
import * as SchemaAST3 from "effect/SchemaAST";
|
|
1276
|
+
import { DXN as DXN3, EntityId as EntityId2 } from "@dxos/keys";
|
|
1277
|
+
var TypeMetaSchemaDXN = DXN3.make("org.dxos.type.schema", "0.1.0");
|
|
1278
|
+
var persistentEntitySchema = (() => {
|
|
1279
|
+
const typename = DXN3.getName(TypeMetaSchemaDXN);
|
|
1280
|
+
const version = DXN3.getVersion(TypeMetaSchemaDXN);
|
|
1281
|
+
const struct = Schema5.Struct({
|
|
1282
|
+
name: Schema5.optional(Schema5.String),
|
|
1283
|
+
jsonSchema: JsonSchemaType.pipe(Schema5.optional),
|
|
1284
|
+
id: EntityId2
|
|
1285
|
+
});
|
|
1286
|
+
const ast = SchemaAST3.annotations(struct.ast, {
|
|
1287
|
+
[TypeAnnotationId]: {
|
|
1288
|
+
kind: EntityKind.Type,
|
|
1289
|
+
typename,
|
|
1290
|
+
version
|
|
1291
|
+
},
|
|
1292
|
+
[SchemaAST3.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
|
|
1293
|
+
kind: EntityKind.Type,
|
|
1294
|
+
typename,
|
|
1295
|
+
version
|
|
1296
|
+
})
|
|
1297
|
+
});
|
|
1298
|
+
return Schema5.make(ast);
|
|
1299
|
+
})();
|
|
1300
|
+
var makeEchoTypeSchema = (fields, ast, typename, version, kind, computeJsonSchema, explicitId) => {
|
|
1301
|
+
const sourceSchema = Schema5.make(ast);
|
|
1302
|
+
const meta = {
|
|
1303
|
+
keys: [],
|
|
1304
|
+
key: typename,
|
|
1305
|
+
version
|
|
1306
|
+
};
|
|
1307
|
+
const id = explicitId ?? EntityId2.deterministic(typename, version);
|
|
1308
|
+
const entity = makeObject(persistentEntitySchema, {
|
|
1309
|
+
id
|
|
1310
|
+
}, meta);
|
|
1311
|
+
const target = getProxyTarget(entity);
|
|
1312
|
+
let memoizedJsonSchema;
|
|
1313
|
+
Object.defineProperty(target, "jsonSchema", {
|
|
1314
|
+
configurable: true,
|
|
1315
|
+
enumerable: true,
|
|
1316
|
+
get() {
|
|
1317
|
+
return memoizedJsonSchema ??= computeJsonSchema();
|
|
1318
|
+
},
|
|
1319
|
+
set(value) {
|
|
1320
|
+
memoizedJsonSchema = value;
|
|
1321
|
+
}
|
|
1322
|
+
});
|
|
1323
|
+
defineHiddenProperty(target, StaticTypeSchemaSlot, sourceSchema);
|
|
1324
|
+
defineHiddenProperty(target, SchemaKindId, kind);
|
|
1325
|
+
Object.defineProperty(target, "fields", {
|
|
1326
|
+
configurable: true,
|
|
1327
|
+
enumerable: false,
|
|
1328
|
+
get: () => fields
|
|
1329
|
+
});
|
|
1330
|
+
return entity;
|
|
1331
|
+
};
|
|
1332
|
+
|
|
1333
|
+
// src/internal/common/atom-snapshot.ts
|
|
1334
|
+
var snapshotForComparison = (value) => {
|
|
1335
|
+
if (Array.isArray(value)) {
|
|
1336
|
+
return [
|
|
1337
|
+
...value
|
|
1338
|
+
];
|
|
1339
|
+
}
|
|
1340
|
+
if (value !== null && typeof value === "object") {
|
|
1341
|
+
return {
|
|
1342
|
+
...value
|
|
1343
|
+
};
|
|
1344
|
+
}
|
|
1345
|
+
return value;
|
|
1346
|
+
};
|
|
1347
|
+
|
|
1348
|
+
export {
|
|
1349
|
+
TagTypeDXN,
|
|
1350
|
+
ATTR_META,
|
|
1351
|
+
EntityMetaSchema,
|
|
1352
|
+
getMeta,
|
|
1353
|
+
foreignKey,
|
|
1354
|
+
foreignKeyEquals,
|
|
1355
|
+
compareForeignKeys,
|
|
1356
|
+
getMetaChecked,
|
|
1357
|
+
getKeys,
|
|
1358
|
+
deleteKeys,
|
|
1359
|
+
addTag,
|
|
1360
|
+
removeTag,
|
|
1361
|
+
isEntity,
|
|
1362
|
+
get,
|
|
1363
|
+
set,
|
|
1364
|
+
update,
|
|
1365
|
+
snapshotForComparison,
|
|
1366
|
+
defineHiddenProperty,
|
|
1367
|
+
attachTypedJsonSerializer,
|
|
1368
|
+
typedJsonSerializer,
|
|
1369
|
+
batchEvents,
|
|
1370
|
+
emitEvent,
|
|
1371
|
+
enterChangeContext,
|
|
1372
|
+
isInChangeContext,
|
|
1373
|
+
queueNotification,
|
|
1374
|
+
queueOwnerNotification,
|
|
1375
|
+
hasPendingNotifications,
|
|
1376
|
+
clearPendingNotifications,
|
|
1377
|
+
executeChange,
|
|
1378
|
+
MutationOutsideChangeContextError,
|
|
1379
|
+
createPropertySetError,
|
|
1380
|
+
createPropertyDeleteError,
|
|
1381
|
+
createArrayMethodError,
|
|
1382
|
+
setMetaOwner,
|
|
1383
|
+
getEchoRoot,
|
|
1384
|
+
objectData,
|
|
1385
|
+
ReactiveArray,
|
|
1386
|
+
SchemaValidator,
|
|
1387
|
+
checkIdNotPresentOnSchema,
|
|
1388
|
+
TypedReactiveHandler,
|
|
1389
|
+
prepareTypedTarget,
|
|
1390
|
+
makeObject,
|
|
1391
|
+
TypeMetaSchemaDXN,
|
|
1392
|
+
makeEchoTypeSchema
|
|
1393
|
+
};
|
|
1394
|
+
//# sourceMappingURL=chunk-2HKGAQM4.mjs.map
|