@dxos/echo 0.8.4-main.d05539e30a → 0.8.4-main.d9fc60f731
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/README.md +4 -4
- package/dist/lib/neutral/Annotation.mjs +27 -6
- package/dist/lib/neutral/Database.mjs +6 -11
- package/dist/lib/neutral/Entity.mjs +25 -16
- package/dist/lib/neutral/Err.mjs +3 -3
- package/dist/lib/neutral/Feed.mjs +19 -17
- package/dist/lib/neutral/Filter.mjs +13 -13
- package/dist/lib/neutral/Format.mjs +23 -3
- package/dist/lib/neutral/JsonSchema.mjs +7 -8
- package/dist/lib/neutral/Key.mjs +9 -5
- package/dist/lib/neutral/Migration.mjs +11 -10
- package/dist/lib/neutral/Obj.mjs +21 -18
- package/dist/lib/neutral/Query.mjs +17 -17
- package/dist/lib/neutral/QueryResult.mjs +1 -1
- package/dist/lib/neutral/Ref.mjs +10 -11
- package/dist/lib/neutral/Registry.mjs +14 -0
- package/dist/lib/neutral/Relation.mjs +24 -23
- package/dist/lib/neutral/Scope.mjs +12 -0
- package/dist/lib/neutral/Tag.mjs +17 -14
- package/dist/lib/neutral/Type.mjs +52 -26
- package/dist/lib/neutral/chunk-3DKP2EIN.mjs +31 -0
- package/dist/lib/neutral/chunk-3DKP2EIN.mjs.map +7 -0
- package/dist/lib/neutral/chunk-4BB4MFCN.mjs +154 -0
- package/dist/lib/neutral/chunk-4BB4MFCN.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-PT37DG2F.mjs → chunk-4SFPZJVA.mjs} +82 -74
- package/dist/lib/neutral/chunk-4SFPZJVA.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-APHSOTIX.mjs → chunk-4Z6GET2X.mjs} +3 -3
- package/dist/lib/neutral/{chunk-APHSOTIX.mjs.map → chunk-4Z6GET2X.mjs.map} +2 -2
- package/dist/lib/neutral/{chunk-7RVZT53K.mjs → chunk-7LOUAPYZ.mjs} +9 -5
- package/dist/lib/neutral/chunk-7LOUAPYZ.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-BMB7IHGB.mjs → chunk-7OAFN3OX.mjs} +70 -57
- package/dist/lib/neutral/chunk-7OAFN3OX.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-MLS7U7AT.mjs → chunk-7PRCIDHH.mjs} +41 -28
- package/dist/lib/neutral/chunk-7PRCIDHH.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-ZISMEVKD.mjs → chunk-BBFJWWAV.mjs} +6 -6
- package/dist/lib/neutral/chunk-BBFJWWAV.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-ZFACXBY6.mjs → chunk-BDQGMDIX.mjs} +30 -34
- package/dist/lib/neutral/chunk-BDQGMDIX.mjs.map +7 -0
- package/dist/lib/neutral/chunk-CGTI5MXO.mjs +36 -0
- package/dist/lib/neutral/chunk-CGTI5MXO.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-V72DY6LU.mjs → chunk-DKLUHO4T.mjs} +1 -1
- package/dist/lib/neutral/chunk-DKLUHO4T.mjs.map +7 -0
- package/dist/lib/neutral/chunk-DMN2CKPX.mjs +93 -0
- package/dist/lib/neutral/chunk-DMN2CKPX.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-QRZ2I3ZM.mjs → chunk-G6CFWUYH.mjs} +2 -2
- package/dist/lib/neutral/chunk-H26LSXVJ.mjs +653 -0
- package/dist/lib/neutral/chunk-H26LSXVJ.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-N7VOEPSV.mjs → chunk-J3MNM65T.mjs} +9 -9
- package/dist/lib/neutral/chunk-J3MNM65T.mjs.map +7 -0
- package/dist/lib/neutral/chunk-JE7AOSWF.mjs +247 -0
- package/dist/lib/neutral/chunk-JE7AOSWF.mjs.map +7 -0
- package/dist/lib/neutral/chunk-LAF3LSWI.mjs +379 -0
- package/dist/lib/neutral/chunk-LAF3LSWI.mjs.map +7 -0
- package/dist/lib/neutral/chunk-LMNRFOVB.mjs +108 -0
- package/dist/lib/neutral/chunk-LMNRFOVB.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-N4B7FHQT.mjs → chunk-O6BH7EPN.mjs} +30 -3
- package/dist/lib/neutral/chunk-O6BH7EPN.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-Q7ZL2P5H.mjs → chunk-OIYW7R2G.mjs} +62 -46
- package/dist/lib/neutral/chunk-OIYW7R2G.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-G54OX4IX.mjs → chunk-OYUG4FHF.mjs} +527 -847
- package/dist/lib/neutral/chunk-OYUG4FHF.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-J54QMAKF.mjs → chunk-Q5FKCVBC.mjs} +64 -59
- package/dist/lib/neutral/chunk-Q5FKCVBC.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-FIWO2FZK.mjs → chunk-Q62IHV2N.mjs} +12 -7
- package/dist/lib/neutral/chunk-Q62IHV2N.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-SCPFDS2E.mjs → chunk-QVJDDG44.mjs} +65 -34
- package/dist/lib/neutral/chunk-QVJDDG44.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-TRPZU2HV.mjs → chunk-TFEWTY5A.mjs} +155 -129
- package/dist/lib/neutral/chunk-TFEWTY5A.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-44HT3MEC.mjs → chunk-VKWOFXT2.mjs} +22 -2
- package/dist/lib/neutral/{chunk-44HT3MEC.mjs.map → chunk-VKWOFXT2.mjs.map} +1 -1
- package/dist/lib/neutral/{chunk-APJKDGFL.mjs → chunk-ZACMEAYV.mjs} +24 -24
- package/dist/lib/neutral/chunk-ZACMEAYV.mjs.map +7 -0
- package/dist/lib/neutral/index.mjs +50 -40
- package/dist/lib/neutral/internal/index.mjs +125 -64
- package/dist/lib/neutral/meta.json +1 -1
- package/dist/lib/neutral/testing/index.mjs +88 -99
- package/dist/lib/neutral/testing/index.mjs.map +3 -3
- package/dist/types/src/Annotation.d.ts +108 -4
- package/dist/types/src/Annotation.d.ts.map +1 -1
- package/dist/types/src/Annotation.test.d.ts +2 -0
- package/dist/types/src/Annotation.test.d.ts.map +1 -0
- package/dist/types/src/Collection.d.ts +2 -3
- package/dist/types/src/Collection.d.ts.map +1 -1
- package/dist/types/src/Database.d.ts +50 -30
- package/dist/types/src/Database.d.ts.map +1 -1
- package/dist/types/src/Dataset.d.ts +16 -6
- package/dist/types/src/Dataset.d.ts.map +1 -1
- package/dist/types/src/Entity.d.ts +89 -19
- package/dist/types/src/Entity.d.ts.map +1 -1
- package/dist/types/src/Err.d.ts +9 -9
- package/dist/types/src/Err.d.ts.map +1 -1
- package/dist/types/src/Feed.d.ts +35 -12
- package/dist/types/src/Feed.d.ts.map +1 -1
- package/dist/types/src/Filter.d.ts +21 -8
- package/dist/types/src/Filter.d.ts.map +1 -1
- package/dist/types/src/Hypergraph.d.ts +13 -8
- package/dist/types/src/Hypergraph.d.ts.map +1 -1
- package/dist/types/src/Json.d.ts.map +1 -1
- package/dist/types/src/JsonSchema.d.ts +1 -1
- package/dist/types/src/JsonSchema.d.ts.map +1 -1
- package/dist/types/src/Key.d.ts +1 -1
- package/dist/types/src/Key.d.ts.map +1 -1
- package/dist/types/src/Migration.d.ts +15 -12
- package/dist/types/src/Migration.d.ts.map +1 -1
- package/dist/types/src/Obj.d.ts +69 -40
- package/dist/types/src/Obj.d.ts.map +1 -1
- package/dist/types/src/Query.d.ts +24 -10
- package/dist/types/src/Query.d.ts.map +1 -1
- package/dist/types/src/QueryResult.d.ts +9 -0
- package/dist/types/src/QueryResult.d.ts.map +1 -1
- package/dist/types/src/Ref.d.ts +15 -8
- package/dist/types/src/Ref.d.ts.map +1 -1
- package/dist/types/src/Registry.d.ts +131 -0
- package/dist/types/src/Registry.d.ts.map +1 -0
- package/dist/types/src/Relation.d.ts +55 -26
- package/dist/types/src/Relation.d.ts.map +1 -1
- package/dist/types/src/Scope.d.ts +34 -0
- package/dist/types/src/Scope.d.ts.map +1 -0
- package/dist/types/src/StateMap.d.ts +32 -0
- package/dist/types/src/StateMap.d.ts.map +1 -0
- package/dist/types/src/StateMap.test.d.ts +2 -0
- package/dist/types/src/StateMap.test.d.ts.map +1 -0
- package/dist/types/src/Tag.d.ts +19 -3
- package/dist/types/src/Tag.d.ts.map +1 -1
- package/dist/types/src/TagIndex.d.ts +36 -0
- package/dist/types/src/TagIndex.d.ts.map +1 -0
- package/dist/types/src/TagIndex.test.d.ts +2 -0
- package/dist/types/src/TagIndex.test.d.ts.map +1 -0
- package/dist/types/src/Tagging.d.ts +31 -0
- package/dist/types/src/Tagging.d.ts.map +1 -0
- package/dist/types/src/Type.d.ts +356 -95
- package/dist/types/src/Type.d.ts.map +1 -1
- package/dist/types/src/View.d.ts +1 -4
- package/dist/types/src/View.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +6 -3
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/internal/Annotation/annotations.d.ts +68 -36
- package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -1
- package/dist/types/src/internal/Annotation/dictionary.d.ts +24 -0
- package/dist/types/src/internal/Annotation/dictionary.d.ts.map +1 -0
- package/dist/types/src/internal/Annotation/entity-dictionary.d.ts +14 -0
- package/dist/types/src/internal/Annotation/entity-dictionary.d.ts.map +1 -0
- package/dist/types/src/internal/Annotation/index.d.ts +4 -2
- package/dist/types/src/internal/Annotation/index.d.ts.map +1 -1
- package/dist/types/src/internal/Annotation/util.d.ts +13 -4
- package/dist/types/src/internal/Annotation/util.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/api.d.ts +3 -3
- package/dist/types/src/internal/Entity/api.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/entity.d.ts +72 -8
- package/dist/types/src/internal/Entity/entity.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/guard.d.ts +10 -0
- package/dist/types/src/internal/Entity/guard.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/index.d.ts +2 -0
- package/dist/types/src/internal/Entity/index.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/model.d.ts +18 -17
- package/dist/types/src/internal/Entity/model.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/object.d.ts +3 -3
- package/dist/types/src/internal/Entity/object.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/relation.d.ts +30 -7
- package/dist/types/src/internal/Entity/relation.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/type-kind.d.ts +24 -0
- package/dist/types/src/internal/Entity/type-kind.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/type-uri.d.ts +25 -0
- package/dist/types/src/internal/Entity/type-uri.d.ts.map +1 -0
- package/dist/types/src/internal/Format/date.d.ts.map +1 -1
- package/dist/types/src/internal/Format/format.d.ts +3 -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/object.d.ts +3 -1
- package/dist/types/src/internal/Format/object.d.ts.map +1 -1
- package/dist/types/src/internal/JsonSchema/json-schema.d.ts +2 -1
- package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/clone.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/create-object.d.ts +11 -12
- package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/index.d.ts +0 -1
- package/dist/types/src/internal/Obj/index.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/json-serializer.d.ts +8 -8
- package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/typed-object.d.ts +1 -1
- package/dist/types/src/internal/Query.d.ts.map +1 -1
- package/dist/types/src/internal/Ref/ref-array.d.ts +2 -2
- package/dist/types/src/internal/Ref/ref.d.ts +29 -19
- package/dist/types/src/internal/Ref/ref.d.ts.map +1 -1
- package/dist/types/src/internal/Type/index.d.ts +1 -2
- package/dist/types/src/internal/Type/index.d.ts.map +1 -1
- package/dist/types/src/internal/Type/manipulation.d.ts +0 -1
- package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -1
- package/dist/types/src/internal/Type/type-schema.d.ts +52 -0
- package/dist/types/src/internal/Type/type-schema.d.ts.map +1 -0
- package/dist/types/src/internal/common/api/meta.d.ts +11 -8
- package/dist/types/src/internal/common/api/meta.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/make-object.d.ts +11 -5
- package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/typed-handler.d.ts +18 -2
- package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/base.d.ts +4 -4
- package/dist/types/src/internal/common/types/entity.d.ts +59 -2
- package/dist/types/src/internal/common/types/entity.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/index.d.ts +1 -1
- package/dist/types/src/internal/common/types/index.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/meta.d.ts +13 -7
- package/dist/types/src/internal/common/types/meta.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/model-symbols.d.ts +8 -4
- package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/typename.d.ts +7 -0
- package/dist/types/src/internal/common/types/typename.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/well-known-types.d.ts +11 -0
- package/dist/types/src/internal/common/types/well-known-types.d.ts.map +1 -0
- 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 +32 -38
- package/dist/types/src/testing/test-schema.d.ts.map +1 -1
- package/dist/types/src/testing/util.d.ts +5 -3
- package/dist/types/src/testing/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +21 -23
- package/src/Annotation.test.ts +439 -0
- package/src/Annotation.ts +151 -4
- package/src/Collection.ts +5 -9
- package/src/Database.ts +86 -61
- package/src/Dataset.ts +10 -2
- package/src/Entity.test.ts +116 -6
- package/src/Entity.ts +116 -23
- package/src/Err.ts +4 -4
- package/src/Feed.ts +57 -40
- package/src/Filter.ts +49 -27
- package/src/Hypergraph.ts +13 -8
- package/src/Json.test.ts +4 -4
- package/src/Json.ts +7 -6
- package/src/Key.ts +1 -1
- package/src/Migration.ts +27 -19
- package/src/Obj.test.ts +19 -8
- package/src/Obj.ts +131 -70
- package/src/Query.test.ts +147 -151
- package/src/Query.ts +133 -75
- package/src/QueryResult.ts +11 -0
- package/src/Ref.ts +21 -5
- package/src/Registry.ts +155 -0
- package/src/Relation.test.ts +10 -10
- package/src/Relation.ts +89 -52
- package/src/Scope.ts +50 -0
- package/src/StateMap.test.ts +56 -0
- package/src/StateMap.ts +99 -0
- package/src/Tag.md +88 -0
- package/src/Tag.ts +49 -6
- package/src/TagIndex.test.ts +57 -0
- package/src/TagIndex.ts +110 -0
- package/src/Tagging.ts +83 -0
- package/src/Type.test.ts +223 -18
- package/src/Type.ts +601 -131
- package/src/View.ts +10 -19
- package/src/index.ts +6 -4
- package/src/internal/Annotation/annotations.test.ts +31 -11
- package/src/internal/Annotation/annotations.ts +122 -103
- package/src/internal/Annotation/dictionary.ts +47 -0
- package/src/internal/Annotation/entity-dictionary.ts +40 -0
- package/src/internal/Annotation/index.ts +4 -2
- package/src/internal/Annotation/util.ts +17 -8
- package/src/internal/Entity/api.ts +7 -7
- package/src/internal/Entity/entity.ts +196 -47
- package/src/internal/Entity/guard.ts +26 -0
- package/src/internal/Entity/index.ts +2 -0
- package/src/internal/Entity/model.ts +35 -28
- package/src/internal/Entity/object.ts +21 -5
- package/src/internal/Entity/relation.ts +68 -34
- package/src/internal/Entity/type-kind.ts +75 -0
- package/src/internal/Entity/type-uri.ts +87 -0
- package/src/internal/Entity/util.ts +10 -9
- package/src/internal/Format/date.ts +0 -4
- package/src/internal/Format/format.test.ts +21 -0
- package/src/internal/Format/index.ts +2 -3
- package/src/internal/Format/object.ts +21 -4
- package/src/internal/Format/types.ts +1 -1
- package/src/internal/JsonSchema/annotations.ts +1 -1
- package/src/internal/JsonSchema/json-schema.test.ts +54 -140
- package/src/internal/JsonSchema/json-schema.ts +44 -30
- package/src/internal/Obj/clone.ts +9 -4
- package/src/internal/Obj/create-object.test.ts +12 -10
- package/src/internal/Obj/create-object.ts +67 -22
- package/src/internal/Obj/index.ts +0 -1
- package/src/internal/Obj/inspect.ts +4 -3
- package/src/internal/Obj/json-serializer.test.ts +100 -21
- package/src/internal/Obj/json-serializer.ts +93 -38
- package/src/internal/Obj/set-value.test.ts +7 -30
- package/src/internal/Obj/snapshot.ts +11 -4
- package/src/internal/Obj/typed-object.test.ts +9 -11
- package/src/internal/Obj/typed-object.ts +1 -1
- package/src/internal/Query.ts +14 -11
- package/src/internal/Ref/ref-array.ts +3 -3
- package/src/internal/Ref/ref.test.ts +17 -26
- package/src/internal/Ref/ref.ts +107 -59
- package/src/internal/Type/compose.test.ts +3 -1
- package/src/internal/Type/index.ts +1 -2
- package/src/internal/Type/manipulation.ts +0 -25
- package/src/internal/Type/type-schema.ts +60 -0
- package/src/internal/common/README.md +1 -1
- package/src/internal/common/api/meta.ts +16 -14
- package/src/internal/common/proxy/change.test.ts +35 -27
- package/src/internal/common/proxy/handler.test.ts +1 -1
- package/src/internal/common/proxy/json-serializer.ts +26 -16
- package/src/internal/common/proxy/make-object.ts +43 -20
- package/src/internal/common/proxy/ownership.ts +2 -2
- package/src/internal/common/proxy/schema.test.ts +48 -86
- package/src/internal/common/proxy/typed-handler.test.ts +12 -11
- package/src/internal/common/proxy/typed-handler.ts +71 -9
- package/src/internal/common/proxy/typed-object.test.ts +15 -27
- package/src/internal/common/types/base.ts +4 -4
- package/src/internal/common/types/entity.ts +80 -1
- package/src/internal/common/types/index.ts +6 -1
- package/src/internal/common/types/meta.ts +37 -14
- package/src/internal/common/types/model-symbols.ts +16 -4
- package/src/internal/common/types/typename.ts +39 -3
- package/src/internal/common/types/well-known-types.ts +15 -0
- package/src/internal/index.ts +5 -0
- package/src/testing/api.test.ts +15 -9
- package/src/testing/test-data.ts +24 -24
- package/src/testing/test-schema.ts +22 -58
- package/src/testing/util.ts +14 -11
- package/dist/lib/neutral/Extension.mjs +0 -18
- package/dist/lib/neutral/SchemaRegistry.mjs +0 -2
- package/dist/lib/neutral/chunk-5SL5LDLD.mjs +0 -47
- package/dist/lib/neutral/chunk-5SL5LDLD.mjs.map +0 -7
- package/dist/lib/neutral/chunk-7RVZT53K.mjs.map +0 -7
- package/dist/lib/neutral/chunk-APJKDGFL.mjs.map +0 -7
- package/dist/lib/neutral/chunk-BICZKPQG.mjs +0 -7
- package/dist/lib/neutral/chunk-BICZKPQG.mjs.map +0 -7
- package/dist/lib/neutral/chunk-BMB7IHGB.mjs.map +0 -7
- package/dist/lib/neutral/chunk-FIWO2FZK.mjs.map +0 -7
- package/dist/lib/neutral/chunk-G54OX4IX.mjs.map +0 -7
- package/dist/lib/neutral/chunk-GWFFC34K.mjs +0 -50
- package/dist/lib/neutral/chunk-GWFFC34K.mjs.map +0 -7
- package/dist/lib/neutral/chunk-I2DARWPX.mjs +0 -128
- package/dist/lib/neutral/chunk-I2DARWPX.mjs.map +0 -7
- package/dist/lib/neutral/chunk-J54QMAKF.mjs.map +0 -7
- package/dist/lib/neutral/chunk-MGSQGHOD.mjs +0 -206
- package/dist/lib/neutral/chunk-MGSQGHOD.mjs.map +0 -7
- package/dist/lib/neutral/chunk-MLS7U7AT.mjs.map +0 -7
- package/dist/lib/neutral/chunk-N4B7FHQT.mjs.map +0 -7
- package/dist/lib/neutral/chunk-N7VOEPSV.mjs.map +0 -7
- package/dist/lib/neutral/chunk-PSZBLH53.mjs +0 -81
- package/dist/lib/neutral/chunk-PSZBLH53.mjs.map +0 -7
- package/dist/lib/neutral/chunk-PT37DG2F.mjs.map +0 -7
- package/dist/lib/neutral/chunk-Q2KKKJSV.mjs +0 -56
- package/dist/lib/neutral/chunk-Q2KKKJSV.mjs.map +0 -7
- package/dist/lib/neutral/chunk-Q7ZL2P5H.mjs.map +0 -7
- package/dist/lib/neutral/chunk-SCPFDS2E.mjs.map +0 -7
- package/dist/lib/neutral/chunk-TNBK56IN.mjs +0 -350
- package/dist/lib/neutral/chunk-TNBK56IN.mjs.map +0 -7
- package/dist/lib/neutral/chunk-TRPZU2HV.mjs.map +0 -7
- package/dist/lib/neutral/chunk-V72DY6LU.mjs.map +0 -7
- package/dist/lib/neutral/chunk-ZFACXBY6.mjs.map +0 -7
- package/dist/lib/neutral/chunk-ZISMEVKD.mjs.map +0 -7
- package/dist/types/src/Extension.d.ts +0 -80
- package/dist/types/src/Extension.d.ts.map +0 -1
- package/dist/types/src/Extension.test.d.ts +0 -2
- package/dist/types/src/Extension.test.d.ts.map +0 -1
- package/dist/types/src/SchemaRegistry.d.ts +0 -84
- package/dist/types/src/SchemaRegistry.d.ts.map +0 -1
- package/dist/types/src/internal/Obj/ids.d.ts +0 -6
- package/dist/types/src/internal/Obj/ids.d.ts.map +0 -1
- package/dist/types/src/internal/Type/echo-schema.d.ts +0 -181
- package/dist/types/src/internal/Type/echo-schema.d.ts.map +0 -1
- package/dist/types/src/internal/Type/persistent-schema.d.ts +0 -20
- package/dist/types/src/internal/Type/persistent-schema.d.ts.map +0 -1
- package/src/Extension.test.ts +0 -235
- package/src/Extension.ts +0 -122
- package/src/SchemaRegistry.ts +0 -106
- package/src/internal/Obj/ids.ts +0 -12
- package/src/internal/Type/echo-schema.ts +0 -423
- package/src/internal/Type/persistent-schema.ts +0 -33
- /package/dist/lib/neutral/{Extension.mjs.map → Registry.mjs.map} +0 -0
- /package/dist/lib/neutral/{SchemaRegistry.mjs.map → Scope.mjs.map} +0 -0
- /package/dist/lib/neutral/{chunk-QRZ2I3ZM.mjs.map → chunk-G6CFWUYH.mjs.map} +0 -0
package/src/Json.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Copyright 2026 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { EID } from '@dxos/keys';
|
|
6
6
|
|
|
7
7
|
import * as Database from './Database';
|
|
8
8
|
import * as Obj from './Obj';
|
|
@@ -64,21 +64,22 @@ export const createRefReplacer = ({ db, depth = 1 }: CreateRefReplacerOptions):
|
|
|
64
64
|
// an unparseable string would otherwise crash the whole `JSON.stringify`.
|
|
65
65
|
// Treat any parse miss as "leave as-is" rather than propagating.
|
|
66
66
|
const dxnString = value['/'];
|
|
67
|
-
if (!dxnString.startsWith('dxn:')) {
|
|
67
|
+
if (!dxnString.startsWith('dxn:') && !dxnString.startsWith('echo:')) {
|
|
68
68
|
return value;
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
let
|
|
71
|
+
let echoUri: string | undefined;
|
|
72
72
|
try {
|
|
73
|
-
|
|
73
|
+
const parsed = EID.tryParse(dxnString);
|
|
74
|
+
echoUri = parsed ? EID.getEntityId(parsed) : undefined;
|
|
74
75
|
} catch {
|
|
75
76
|
return value;
|
|
76
77
|
}
|
|
77
78
|
|
|
78
|
-
if (!
|
|
79
|
+
if (!echoUri) {
|
|
79
80
|
return value;
|
|
80
81
|
}
|
|
81
|
-
const target = db.getObjectById(
|
|
82
|
+
const target = db.getObjectById(echoUri);
|
|
82
83
|
if (!target) {
|
|
83
84
|
return value;
|
|
84
85
|
}
|
package/src/Key.ts
CHANGED
package/src/Migration.ts
CHANGED
|
@@ -6,25 +6,31 @@
|
|
|
6
6
|
|
|
7
7
|
import type * as Schema from 'effect/Schema';
|
|
8
8
|
|
|
9
|
-
import { type
|
|
9
|
+
import { type URI } from '@dxos/keys';
|
|
10
10
|
|
|
11
11
|
import type * as Database from './Database';
|
|
12
12
|
import type * as Entity from './Entity';
|
|
13
|
-
import { MetaId, type
|
|
13
|
+
import { MetaId, type EntityMeta, getSchemaURI } from './internal';
|
|
14
|
+
import * as Type from './Type';
|
|
14
15
|
|
|
15
16
|
/**
|
|
16
17
|
* Result returned by a migration's `transform` callback.
|
|
17
18
|
* The data shape matches the target schema; the optional `[Obj.Meta]` symbol key lets the
|
|
18
19
|
* transform update the object's meta (e.g. `key` / `version`) atomically with the data swap.
|
|
19
20
|
*/
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
>
|
|
24
|
-
|
|
21
|
+
type MigrationSchemaInput = Type.AnyEntity;
|
|
22
|
+
|
|
23
|
+
type MigrationInstanceType<S> = S extends Type.AnyEntity
|
|
24
|
+
? Type.InstanceType<S>
|
|
25
|
+
: S extends Schema.Schema.AnyNoContext
|
|
26
|
+
? Schema.Schema.Type<S>
|
|
27
|
+
: never;
|
|
28
|
+
|
|
29
|
+
export type TransformResult<To> = Omit<MigrationInstanceType<To>, 'id' | Entity.KindId> & {
|
|
30
|
+
[MetaId]?: Partial<EntityMeta>;
|
|
25
31
|
};
|
|
26
32
|
|
|
27
|
-
type DefineObjectMigrationOptions<From extends
|
|
33
|
+
type DefineObjectMigrationOptions<From extends MigrationSchemaInput, To extends MigrationSchemaInput> = {
|
|
28
34
|
from: From;
|
|
29
35
|
to: To;
|
|
30
36
|
/**
|
|
@@ -34,7 +40,7 @@ type DefineObjectMigrationOptions<From extends Schema.Schema.AnyNoContext, To ex
|
|
|
34
40
|
* (e.g. registry `key` / `version`) atomically with the data swap.
|
|
35
41
|
*/
|
|
36
42
|
// TODO(dmaretskyi): `id` should not be a part of the schema.
|
|
37
|
-
transform: (from:
|
|
43
|
+
transform: (from: MigrationInstanceType<From>, context: ObjectMigrationContext) => Promise<TransformResult<To>>;
|
|
38
44
|
|
|
39
45
|
/**
|
|
40
46
|
* Callback that is called after the object is migrated. Called for every object that is migrated.
|
|
@@ -52,9 +58,9 @@ export type ObjectMigrationContext = {
|
|
|
52
58
|
db: Database.Database;
|
|
53
59
|
};
|
|
54
60
|
|
|
55
|
-
type OnMigrateProps<From
|
|
56
|
-
before:
|
|
57
|
-
object:
|
|
61
|
+
type OnMigrateProps<From, To> = {
|
|
62
|
+
before: MigrationInstanceType<From>;
|
|
63
|
+
object: MigrationInstanceType<To>;
|
|
58
64
|
db: Database.Database;
|
|
59
65
|
};
|
|
60
66
|
|
|
@@ -62,8 +68,8 @@ type OnMigrateProps<From extends Schema.Schema.AnyNoContext, To extends Schema.S
|
|
|
62
68
|
* Definition of a migration from one object schema version to another.
|
|
63
69
|
*/
|
|
64
70
|
export type ObjectMigration = {
|
|
65
|
-
fromType:
|
|
66
|
-
toType:
|
|
71
|
+
fromType: URI.URI;
|
|
72
|
+
toType: URI.URI;
|
|
67
73
|
fromSchema: Schema.Schema.AnyNoContext;
|
|
68
74
|
toSchema: Schema.Schema.AnyNoContext;
|
|
69
75
|
transform: (from: unknown, context: ObjectMigrationContext) => Promise<unknown>;
|
|
@@ -83,14 +89,16 @@ export type ObjectMigration = {
|
|
|
83
89
|
* });
|
|
84
90
|
* ```
|
|
85
91
|
*/
|
|
86
|
-
export const define = <From extends
|
|
92
|
+
export const define = <From extends MigrationSchemaInput, To extends MigrationSchemaInput>(
|
|
87
93
|
options: DefineObjectMigrationOptions<From, To>,
|
|
88
94
|
): ObjectMigration => {
|
|
89
|
-
const
|
|
95
|
+
const fromSchema = Type.getSchema(options.from);
|
|
96
|
+
const toSchema = Type.getSchema(options.to);
|
|
97
|
+
const fromType = getSchemaURI(fromSchema);
|
|
90
98
|
if (!fromType) {
|
|
91
99
|
throw new Error('Invalid from schema');
|
|
92
100
|
}
|
|
93
|
-
const toType =
|
|
101
|
+
const toType = getSchemaURI(toSchema);
|
|
94
102
|
if (!toType) {
|
|
95
103
|
throw new Error('Invalid to schema');
|
|
96
104
|
}
|
|
@@ -98,8 +106,8 @@ export const define = <From extends Schema.Schema.AnyNoContext, To extends Schem
|
|
|
98
106
|
return {
|
|
99
107
|
fromType,
|
|
100
108
|
toType,
|
|
101
|
-
fromSchema
|
|
102
|
-
toSchema
|
|
109
|
+
fromSchema,
|
|
110
|
+
toSchema,
|
|
103
111
|
transform: options.transform as any,
|
|
104
112
|
onMigration: options.onMigration as any,
|
|
105
113
|
};
|
package/src/Obj.test.ts
CHANGED
|
@@ -42,8 +42,8 @@ describe('Obj', () => {
|
|
|
42
42
|
const snapshot = Obj.getSnapshot(obj);
|
|
43
43
|
|
|
44
44
|
// getDXN - works with both.
|
|
45
|
-
expect(Obj.
|
|
46
|
-
expect(Obj.
|
|
45
|
+
expect(Obj.getURI(obj)).toBeDefined();
|
|
46
|
+
expect(Obj.getURI(snapshot)).toBeDefined();
|
|
47
47
|
|
|
48
48
|
// getTypename - works with both.
|
|
49
49
|
expect(Obj.getTypename(obj)).toBe('com.example.type.person');
|
|
@@ -80,6 +80,17 @@ describe('Obj', () => {
|
|
|
80
80
|
expect(SnapshotKindId in snapshot).toBe(true);
|
|
81
81
|
expect(Entity.KindId in snapshot).toBe(false);
|
|
82
82
|
});
|
|
83
|
+
|
|
84
|
+
test('getSnapshot preserves parent', ({ expect }) => {
|
|
85
|
+
const parent = Obj.make(TestSchema.Organization, { name: 'parent' });
|
|
86
|
+
const child = Obj.make(TestSchema.Person, { name: 'child' });
|
|
87
|
+
Obj.setParent(child, parent);
|
|
88
|
+
|
|
89
|
+
const snapshot = Obj.getSnapshot(child);
|
|
90
|
+
|
|
91
|
+
expect(Obj.getParent(child)).toBe(parent);
|
|
92
|
+
expect(Obj.getParent(snapshot)).toBe(parent);
|
|
93
|
+
});
|
|
83
94
|
});
|
|
84
95
|
|
|
85
96
|
describe('snapshotOf', () => {
|
|
@@ -134,7 +145,7 @@ describe('Obj', () => {
|
|
|
134
145
|
|
|
135
146
|
test('throws for plain object without metadata', ({ expect }) => {
|
|
136
147
|
const plain = { id: 'plain-1', name: 'Plain' };
|
|
137
|
-
expect(() => Obj.getKeys(plain as any, SOURCE)).toThrow(/
|
|
148
|
+
expect(() => Obj.getKeys(plain as any, SOURCE)).toThrow(/EntityMeta not found/);
|
|
138
149
|
});
|
|
139
150
|
});
|
|
140
151
|
|
|
@@ -329,8 +340,8 @@ describe('Obj', () => {
|
|
|
329
340
|
expect(cloned.address?.city).toBe('San Francisco');
|
|
330
341
|
expect(cloned.address?.state).toBe('CA');
|
|
331
342
|
expect(cloned.address?.zip).toBe('94102');
|
|
332
|
-
expect(cloned.address?.coordinates
|
|
333
|
-
expect(cloned.address?.coordinates
|
|
343
|
+
expect(cloned.address?.coordinates?.lat).toBe(37.7749);
|
|
344
|
+
expect(cloned.address?.coordinates?.lng).toBe(-122.4194);
|
|
334
345
|
|
|
335
346
|
// Modifying nested properties should be independent
|
|
336
347
|
Obj.update(person, (person) => {
|
|
@@ -405,7 +416,7 @@ describe('Obj', () => {
|
|
|
405
416
|
const cloned = Obj.clone(person);
|
|
406
417
|
|
|
407
418
|
expect(Obj.instanceOf(TestSchema.Person, cloned)).toBe(true);
|
|
408
|
-
expect(Obj.
|
|
419
|
+
expect(Obj.getType(cloned)).toBe(Obj.getType(person));
|
|
409
420
|
});
|
|
410
421
|
});
|
|
411
422
|
|
|
@@ -490,7 +501,7 @@ describe('Obj', () => {
|
|
|
490
501
|
Obj.update(target, (target) => {
|
|
491
502
|
expect(Obj.updateFrom(target, source)).toBe(true);
|
|
492
503
|
});
|
|
493
|
-
expect(target.employer?.
|
|
504
|
+
expect(target.employer?.uri.toString()).toBe(Ref.make(orgB).uri.toString());
|
|
494
505
|
expect(target.address?.city).toBe('Portland');
|
|
495
506
|
});
|
|
496
507
|
|
|
@@ -513,7 +524,7 @@ describe('Obj', () => {
|
|
|
513
524
|
Obj.update(target, (target) => {
|
|
514
525
|
expect(Obj.updateFrom(target, source)).toBe(true);
|
|
515
526
|
});
|
|
516
|
-
expect(target.tasks?.map((r) => r.
|
|
527
|
+
expect(target.tasks?.map((r) => r.uri)).toEqual(source.tasks?.map((r) => r.uri));
|
|
517
528
|
});
|
|
518
529
|
|
|
519
530
|
test('respects include option', () => {
|
package/src/Obj.ts
CHANGED
|
@@ -14,7 +14,7 @@ import * as Utils from 'effect/Utils';
|
|
|
14
14
|
import type { ForeignKey } from '@dxos/echo-protocol';
|
|
15
15
|
import { createJsonPath } from '@dxos/effect';
|
|
16
16
|
import { assertArgument, invariant } from '@dxos/invariant';
|
|
17
|
-
import {
|
|
17
|
+
import { DXN, EntityId, type URI } from '@dxos/keys';
|
|
18
18
|
import { assumeType, deepMapValues } from '@dxos/util';
|
|
19
19
|
|
|
20
20
|
import type * as Database from './Database';
|
|
@@ -24,7 +24,8 @@ import * as internal from './internal';
|
|
|
24
24
|
import { getProxyTarget, isProxy } from './internal/common/proxy/proxy-utils';
|
|
25
25
|
import * as objInternal from './internal/Obj';
|
|
26
26
|
import * as Ref from './Ref';
|
|
27
|
-
import type * as
|
|
27
|
+
import type * as Tag from './Tag';
|
|
28
|
+
import * as Type from './Type';
|
|
28
29
|
|
|
29
30
|
/**
|
|
30
31
|
* Base type for all ECHO objects.
|
|
@@ -64,25 +65,24 @@ export interface Unknown extends BaseObj {}
|
|
|
64
65
|
* // Reference to any object type
|
|
65
66
|
* const Collection = Schema.Struct({
|
|
66
67
|
* objects: Schema.Array(Ref.Ref(Obj.Unknown)),
|
|
67
|
-
* }).pipe(Type.
|
|
68
|
+
* }).pipe(Type.makeObject(DXN.make('com.example.type.collection', '0.1.0')));
|
|
68
69
|
* ```
|
|
69
70
|
*/
|
|
70
71
|
// TODO(wittjosiah): Investigate if Schema.filter can validate KindId on ECHO instances.
|
|
71
72
|
// Effect Schema normalizes proxy objects to plain objects before calling filter predicates.
|
|
72
73
|
// Possible approaches: custom Schema.declare, AST manipulation, or upstream contribution.
|
|
73
|
-
export const Unknown:
|
|
74
|
+
export const Unknown: internal.UnknownTypeSchema<Unknown, typeof Entity.Kind.Object> = Schema.Struct({
|
|
74
75
|
id: Schema.String,
|
|
75
76
|
}).pipe(
|
|
76
77
|
Schema.extend(Schema.Record({ key: Schema.String, value: Schema.Unknown })),
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
);
|
|
78
|
+
Schema.annotations({
|
|
79
|
+
[internal.TypeAnnotationId]: {
|
|
80
|
+
kind: Entity.Kind.Object,
|
|
81
|
+
typename: internal.ANY_OBJECT_TYPENAME,
|
|
82
|
+
version: internal.ANY_OBJECT_VERSION,
|
|
83
|
+
},
|
|
84
|
+
}),
|
|
85
|
+
) as unknown as internal.UnknownTypeSchema<Unknown, typeof Entity.Kind.Object>;
|
|
86
86
|
|
|
87
87
|
/**
|
|
88
88
|
* Object with arbitrary properties.
|
|
@@ -99,7 +99,7 @@ export interface Any extends BaseObj, internal.AnyProperties {}
|
|
|
99
99
|
*/
|
|
100
100
|
interface BaseSnapshot extends internal.AnyEntity {
|
|
101
101
|
readonly [Entity.SnapshotKindId]: typeof Entity.Kind.Object;
|
|
102
|
-
readonly id:
|
|
102
|
+
readonly id: EntityId;
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
/**
|
|
@@ -120,30 +120,44 @@ export interface BaseObjJson {
|
|
|
120
120
|
id: string;
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
-
const
|
|
123
|
+
// Factory (not a shared const): each object must get its own `keys`/`tags`/`annotations` containers,
|
|
124
|
+
// otherwise mutating one object's meta would leak into every other object via the shared references.
|
|
125
|
+
const defaultMeta = (): internal.EntityMeta => ({
|
|
124
126
|
keys: [],
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
id?: ObjectId;
|
|
129
|
-
[Meta]?: Partial<internal.ObjectMeta>;
|
|
130
|
-
} & Entity.Properties<T>;
|
|
127
|
+
tags: [],
|
|
128
|
+
annotations: {},
|
|
129
|
+
});
|
|
131
130
|
|
|
132
131
|
// TODO(burdon): Should we allow the caller to set the id?
|
|
133
132
|
/**
|
|
134
|
-
* Props type for object creation with a given
|
|
133
|
+
* Props type for object creation with a given type. Accepts a `Type.AnyObj`
|
|
134
|
+
* entity and derives the instance shape via `Type.InstanceType`. Relation-kind
|
|
135
|
+
* entities are rejected at the type level — use `Relation.MakeProps` for those.
|
|
136
|
+
*
|
|
137
|
+
* When the schema is the unconstrained `Type.AnyObj` (`Obj<unknown>` — e.g. a
|
|
138
|
+
* dynamic type from `schemaRegistry.register`), the instance shape is not
|
|
139
|
+
* statically known, so data props widen to `Record<string, unknown>` and the
|
|
140
|
+
* caller can pass arbitrary fields without a cast.
|
|
135
141
|
*/
|
|
136
|
-
export type MakeProps<S extends
|
|
137
|
-
id?:
|
|
138
|
-
[Meta]?: Partial<internal.
|
|
142
|
+
export type MakeProps<S extends Type.AnyObj> = {
|
|
143
|
+
id?: EntityId;
|
|
144
|
+
[Meta]?: Partial<internal.EntityMeta>;
|
|
139
145
|
[Parent]?: Unknown;
|
|
140
|
-
|
|
146
|
+
// When the resolved instance has no known data keys, widen to a permissive
|
|
147
|
+
// record (the `Obj<unknown>` case); otherwise use the precise property shape.
|
|
148
|
+
// `[keyof …] extends [never]` is wrapped in tuples so the check is
|
|
149
|
+
// non-distributive — a `never` instance type (e.g. when narrowing collapses
|
|
150
|
+
// the schema) stays a single branch instead of distributing to `never`.
|
|
151
|
+
} & ([keyof Entity.Properties<Type.InstanceType<S>>] extends [never]
|
|
152
|
+
? Record<string, unknown>
|
|
153
|
+
: Entity.Properties<Type.InstanceType<S>>);
|
|
141
154
|
|
|
142
155
|
/**
|
|
143
|
-
* Creates a new echo object of the given schema.
|
|
144
|
-
*
|
|
156
|
+
* Creates a new echo object of the given schema or `Type.Type`.
|
|
157
|
+
*
|
|
158
|
+
* @param typeOrSchema - A static object schema (`Type.makeObject(...)`) or a
|
|
159
|
+
* `Type.Type` entity (e.g. one returned by `db.addType(schemaEntity)`).
|
|
145
160
|
* @param props - Object properties.
|
|
146
|
-
* @param meta - Object metadata (deprecated) -- pass with Obj.Meta.
|
|
147
161
|
*
|
|
148
162
|
* Meta can be passed as a symbol in `props`.
|
|
149
163
|
*
|
|
@@ -152,23 +166,26 @@ export type MakeProps<S extends Schema.Schema.AnyNoContext> = {
|
|
|
152
166
|
* const obj = Obj.make(Person, { [Obj.Meta]: { keys: [...] }, name: 'John' });
|
|
153
167
|
* ```
|
|
154
168
|
*
|
|
155
|
-
* Note: Only accepts object schemas, not relation schemas.
|
|
169
|
+
* Note: Only accepts object schemas / object-kind types, not relation schemas.
|
|
170
|
+
* Use `Relation.make` for relations.
|
|
156
171
|
*/
|
|
157
|
-
export
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
172
|
+
export function make<T extends Type.AnyObj>(type: T, props: NoInfer<MakeProps<T>>): OfShape<Type.InstanceType<T>>;
|
|
173
|
+
export function make(input: Type.AnyObj, props: any): OfShape<any> {
|
|
174
|
+
// `Type.Type` entities aren't `Schema.Schema` themselves; derive the Effect
|
|
175
|
+
// Schema via `Type.getSchema(...)`. Pass the entity through to `makeObject`
|
|
176
|
+
// so subsequent schema mutations (`Type.addFields`, etc.) propagate.
|
|
177
|
+
const schema = Type.getSchema(input);
|
|
161
178
|
assertArgument(
|
|
162
179
|
internal.getTypeAnnotation(schema)?.kind === Entity.Kind.Object,
|
|
163
180
|
'schema',
|
|
164
181
|
'Expected an object schema',
|
|
165
182
|
);
|
|
166
183
|
|
|
167
|
-
let meta: internal.
|
|
184
|
+
let meta: internal.EntityMeta | undefined = undefined;
|
|
168
185
|
|
|
169
186
|
// Set default fields on meta on creation.
|
|
170
187
|
if (props[internal.MetaId] != null) {
|
|
171
|
-
meta = { ...
|
|
188
|
+
meta = { ...defaultMeta(), ...props[internal.MetaId] };
|
|
172
189
|
delete props[internal.MetaId];
|
|
173
190
|
}
|
|
174
191
|
|
|
@@ -183,11 +200,16 @@ export const make = <S extends Type.AnyObj>(
|
|
|
183
200
|
}
|
|
184
201
|
}
|
|
185
202
|
|
|
186
|
-
return internal.makeObject
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
203
|
+
return internal.makeObject(
|
|
204
|
+
schema,
|
|
205
|
+
filterUndefined,
|
|
206
|
+
{
|
|
207
|
+
...defaultMeta(),
|
|
208
|
+
...meta,
|
|
209
|
+
},
|
|
210
|
+
input,
|
|
211
|
+
);
|
|
212
|
+
}
|
|
191
213
|
|
|
192
214
|
/**
|
|
193
215
|
* Determine if object is an ECHO object.
|
|
@@ -401,12 +423,12 @@ export const setValue: (obj: Mutable<Unknown>, path: readonly (string | number)[
|
|
|
401
423
|
// Type
|
|
402
424
|
//
|
|
403
425
|
|
|
404
|
-
|
|
405
|
-
export
|
|
406
|
-
export type ID = ObjectId;
|
|
426
|
+
export const ID = EntityId;
|
|
427
|
+
export type ID = EntityId;
|
|
407
428
|
|
|
408
429
|
/**
|
|
409
|
-
* Test if object
|
|
430
|
+
* Test if an object is an instance of a given object type.
|
|
431
|
+
*
|
|
410
432
|
* @example
|
|
411
433
|
* ```ts
|
|
412
434
|
* const john = Obj.make(Person, { name: 'John' });
|
|
@@ -415,11 +437,29 @@ export type ID = ObjectId;
|
|
|
415
437
|
* // john is Person
|
|
416
438
|
* }
|
|
417
439
|
* ```
|
|
440
|
+
*
|
|
441
|
+
* Only accepts `Type.AnyObj` — use `Relation.instanceOf` for relations and
|
|
442
|
+
* `Type.isType(value)` to test for `Type.Type` meta-schema entities.
|
|
418
443
|
*/
|
|
419
444
|
export const instanceOf: {
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
445
|
+
// Reject `Type.Type` at the type level — those are meta-schema entities, not
|
|
446
|
+
// object instances. Use `Type.isType(value)` instead.
|
|
447
|
+
<T extends Type.Type>(
|
|
448
|
+
type: T,
|
|
449
|
+
_hint?: never,
|
|
450
|
+
// eslint-disable-next-line @typescript-eslint/unified-signatures
|
|
451
|
+
..._error: ['ERROR: Obj.instanceOf does not accept Type.Type; use Type.isType(value) instead']
|
|
452
|
+
): never;
|
|
453
|
+
// Reject relation types — use `Relation.instanceOf` instead.
|
|
454
|
+
<R extends Type.AnyRelation>(
|
|
455
|
+
type: R,
|
|
456
|
+
_hint?: never,
|
|
457
|
+
// eslint-disable-next-line @typescript-eslint/unified-signatures
|
|
458
|
+
..._error: ['ERROR: Obj.instanceOf does not accept relation types; use Relation.instanceOf instead']
|
|
459
|
+
): never;
|
|
460
|
+
<S extends Type.AnyObj>(schema: S): (value: unknown) => value is Type.InstanceType<S>;
|
|
461
|
+
<S extends Type.AnyObj>(schema: S, value: unknown): value is Type.InstanceType<S>;
|
|
462
|
+
} = ((...args: [schema: Type.AnyEntity, value?: unknown]) => {
|
|
423
463
|
if (args.length === 1) {
|
|
424
464
|
return (entity: unknown) => internal.isInstanceOf(args[0], entity);
|
|
425
465
|
}
|
|
@@ -441,9 +481,9 @@ export const instanceOf: {
|
|
|
441
481
|
* ```
|
|
442
482
|
*/
|
|
443
483
|
export const snapshotOf: {
|
|
444
|
-
<S extends Type.
|
|
445
|
-
<S extends Type.
|
|
446
|
-
} = ((...args: [schema: Type.
|
|
484
|
+
<S extends Type.AnyObj>(schema: S): (value: unknown) => value is Snapshot<Type.InstanceType<S>>;
|
|
485
|
+
<S extends Type.AnyObj>(schema: S, value: unknown): value is Snapshot<Type.InstanceType<S>>;
|
|
486
|
+
} = ((...args: [schema: Type.AnyObj, value: unknown] | [schema: Type.AnyObj]) => {
|
|
447
487
|
const check = (entity: unknown) =>
|
|
448
488
|
entity != null &&
|
|
449
489
|
typeof entity === 'object' &&
|
|
@@ -459,12 +499,14 @@ export const snapshotOf: {
|
|
|
459
499
|
|
|
460
500
|
// TODO(dmaretskyi): Allow returning undefined.
|
|
461
501
|
/**
|
|
462
|
-
* Get the
|
|
502
|
+
* Get the canonical URI of the object. Returns `URI.URI` (today always an EID,
|
|
503
|
+
* but future entity kinds may surface other URI schemes — narrow with
|
|
504
|
+
* `EID.parse(uri)` or `DXN.tryMake(uri)` at the point of use).
|
|
463
505
|
* Accepts both reactive objects and snapshots.
|
|
464
506
|
*/
|
|
465
|
-
export const
|
|
507
|
+
export const getURI = (entity: Unknown | Snapshot): URI.URI => {
|
|
466
508
|
assertArgument(!Schema.isSchema(entity), 'obj', 'Object should not be a schema.');
|
|
467
|
-
return internal.
|
|
509
|
+
return internal.getUri(entity);
|
|
468
510
|
};
|
|
469
511
|
|
|
470
512
|
/**
|
|
@@ -472,17 +514,22 @@ export const getDXN = (entity: Unknown | Snapshot): DXN => {
|
|
|
472
514
|
* @example dxn:com.example.type.person:1.0.0
|
|
473
515
|
* @throws If the object is missing its type (corrupted object).
|
|
474
516
|
*/
|
|
475
|
-
export const
|
|
476
|
-
const type = internal.
|
|
517
|
+
export const getTypeURI = (obj: Unknown | Snapshot): URI.URI => {
|
|
518
|
+
const type = internal.getTypeURI(obj);
|
|
477
519
|
invariant(type != null, 'Corrupted object: missing type.');
|
|
478
520
|
return type;
|
|
479
521
|
};
|
|
480
522
|
|
|
481
523
|
/**
|
|
482
|
-
* Get the
|
|
483
|
-
*
|
|
524
|
+
* Get the type entity (`Type.AnyObj`) the object was created from.
|
|
525
|
+
*
|
|
526
|
+
* Returns `undefined` when the object's type isn't registered in this runtime
|
|
527
|
+
* (e.g. a freshly deserialized snapshot whose type entity hasn't been wired
|
|
528
|
+
* up yet, or an object loaded from storage before its schema is known). To
|
|
529
|
+
* get the Effect Schema from the returned entity, use `Type.getSchema(...)`.
|
|
484
530
|
*/
|
|
485
|
-
export const
|
|
531
|
+
export const getType = (obj: Unknown | Snapshot): Type.AnyObj | undefined =>
|
|
532
|
+
internal.getType(obj) as Type.AnyObj | undefined;
|
|
486
533
|
|
|
487
534
|
/**
|
|
488
535
|
* @returns The typename of the object's type.
|
|
@@ -514,7 +561,7 @@ export const getDatabase = (entity: Entity.Unknown | Entity.Snapshot): Database.
|
|
|
514
561
|
export const Meta = internal.MetaId;
|
|
515
562
|
|
|
516
563
|
/**
|
|
517
|
-
* Deeply read-only version of
|
|
564
|
+
* Deeply read-only version of EntityMeta.
|
|
518
565
|
* Prevents mutation at all nesting levels (e.g., `meta.keys.push()` is a TypeScript error).
|
|
519
566
|
*/
|
|
520
567
|
export type ReadonlyMeta = internal.ReadonlyMeta;
|
|
@@ -538,9 +585,8 @@ export type Meta = internal.Meta;
|
|
|
538
585
|
*
|
|
539
586
|
* // Mutable access inside change callback
|
|
540
587
|
* Obj.update(person, (obj) => {
|
|
541
|
-
* const meta = Obj.getMeta(obj); //
|
|
542
|
-
* meta.tags
|
|
543
|
-
* meta.tags.push('important');
|
|
588
|
+
* const meta = Obj.getMeta(obj); // EntityMeta (mutable)
|
|
589
|
+
* meta.tags.push(Ref.make(tag)); // tags are refs to Tag objects
|
|
544
590
|
* });
|
|
545
591
|
* ```
|
|
546
592
|
*/
|
|
@@ -576,7 +622,7 @@ export const deleteKeys = (entity: Mutable<Unknown>, source: string): void => in
|
|
|
576
622
|
* NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
|
|
577
623
|
* parameters, so there is no compile-time error. Enforcement is runtime-only.
|
|
578
624
|
*/
|
|
579
|
-
export const addTag = (entity: Mutable<Unknown>, tag:
|
|
625
|
+
export const addTag = (entity: Mutable<Unknown>, tag: Ref.Ref<Tag.Tag>): void => internal.addTag(entity, tag);
|
|
580
626
|
|
|
581
627
|
/**
|
|
582
628
|
* Remove a tag from the object.
|
|
@@ -585,7 +631,7 @@ export const addTag = (entity: Mutable<Unknown>, tag: string): void => internal.
|
|
|
585
631
|
* NOTE: TypeScript's structural typing allows readonly objects to be passed to `Mutable<T>`
|
|
586
632
|
* parameters, so there is no compile-time error. Enforcement is runtime-only.
|
|
587
633
|
*/
|
|
588
|
-
export const removeTag = (entity: Mutable<Unknown>, tag:
|
|
634
|
+
export const removeTag = (entity: Mutable<Unknown>, tag: Ref.Ref<Tag.Tag>): void => internal.removeTag(entity, tag);
|
|
589
635
|
|
|
590
636
|
/**
|
|
591
637
|
* Check if the object is deleted.
|
|
@@ -601,8 +647,12 @@ export const isDeleted = (entity: Unknown | Snapshot): boolean => objInternal.is
|
|
|
601
647
|
/**
|
|
602
648
|
* Get the label of the object.
|
|
603
649
|
* Accepts both reactive objects and snapshots.
|
|
650
|
+
*
|
|
651
|
+
* @param options.fallback `'typename'` returns the object's typename when no
|
|
652
|
+
* label is set (e.g. `org.dxos.type.table`).
|
|
604
653
|
*/
|
|
605
|
-
export const getLabel = (entity: Unknown | Snapshot): string | undefined =>
|
|
654
|
+
export const getLabel = (entity: Unknown | Snapshot, options?: internal.GetLabelOptions): string | undefined =>
|
|
655
|
+
internal.getLabel(entity, options);
|
|
606
656
|
|
|
607
657
|
/**
|
|
608
658
|
* Set the label of the object.
|
|
@@ -619,6 +669,17 @@ export const setLabel = (entity: Mutable<Unknown>, label: string): void => inter
|
|
|
619
669
|
*/
|
|
620
670
|
export const getDescription = (entity: Unknown | Snapshot): string | undefined => internal.getDescription(entity);
|
|
621
671
|
|
|
672
|
+
/**
|
|
673
|
+
* Get the icon annotation for the object (or any entity), resolved via its type-level
|
|
674
|
+
* `IconAnnotation`. Accepts both reactive entities and snapshots, and either Objects or
|
|
675
|
+
* Relations — the underlying schema-based lookup works for both.
|
|
676
|
+
*
|
|
677
|
+
* Returns the full `{ icon, hue }` annotation; callers wanting just the icon name typically
|
|
678
|
+
* write `Obj.getIcon(obj)?.icon ?? 'ph--cube--regular'`.
|
|
679
|
+
*/
|
|
680
|
+
export const getIcon = (entity: Entity.Unknown | Entity.Snapshot): internal.IconAnnotation | undefined =>
|
|
681
|
+
internal.getIcon(entity);
|
|
682
|
+
|
|
622
683
|
/**
|
|
623
684
|
* Set the description of the object.
|
|
624
685
|
* Must be called within an `Obj.update` callback.
|
|
@@ -648,7 +709,7 @@ export const Parent: unique symbol = internal.ParentId as any;
|
|
|
648
709
|
* @returns The parent object, or undefined if the object has no parent.
|
|
649
710
|
*/
|
|
650
711
|
export const getParent = (entity: Unknown | Snapshot): Unknown | undefined => {
|
|
651
|
-
assertArgument(isObject(entity), 'Expected an object');
|
|
712
|
+
assertArgument(isObject(entity) || isSnapshot(entity), 'Expected an object');
|
|
652
713
|
assumeType<internal.InternalObjectProps>(entity);
|
|
653
714
|
return entity[internal.ParentId] as Unknown | undefined;
|
|
654
715
|
};
|
|
@@ -683,7 +744,7 @@ const valuesEqual = (left: unknown, right: unknown): boolean => {
|
|
|
683
744
|
return Utils.structuralRegion(() => Equal.equals(left, right));
|
|
684
745
|
}
|
|
685
746
|
if (Ref.isRef(left) && Ref.isRef(right)) {
|
|
686
|
-
return left.
|
|
747
|
+
return left.uri === right.uri;
|
|
687
748
|
}
|
|
688
749
|
if (Ref.isRef(left) || Ref.isRef(right)) {
|
|
689
750
|
return false;
|
|
@@ -807,12 +868,12 @@ export const toJSON = (entity: Unknown | Snapshot): JSON => objInternal.objectTo
|
|
|
807
868
|
* The function must be async to support resolving the schema as well as the relation endpoints.
|
|
808
869
|
*
|
|
809
870
|
* @param options.refResolver - Resolver for references. Produces hydrated references that can be resolved.
|
|
810
|
-
* @param options.
|
|
871
|
+
* @param options.uri - Override object URI. Changes the result of `Obj.getURI`.
|
|
811
872
|
* @param options.database - Database to associate with the object.
|
|
812
873
|
*/
|
|
813
874
|
export const fromJSON: (
|
|
814
875
|
json: unknown,
|
|
815
|
-
options?: { refResolver?: Ref.Resolver;
|
|
876
|
+
options?: { refResolver?: Ref.Resolver; uri?: URI.URI; database?: Database.Database; parent?: Unknown },
|
|
816
877
|
) => Promise<Unknown> = objInternal.objectFromJSON as any;
|
|
817
878
|
|
|
818
879
|
/**
|