@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/internal/Ref/ref.ts
CHANGED
|
@@ -16,11 +16,17 @@ import { Event } from '@dxos/async';
|
|
|
16
16
|
import { type CustomInspectFunction, inspectCustom } from '@dxos/debug';
|
|
17
17
|
import { EncodedReference } from '@dxos/echo-protocol';
|
|
18
18
|
import { assertArgument, invariant } from '@dxos/invariant';
|
|
19
|
-
import { DXN,
|
|
19
|
+
import { DXN, EID, EntityId, type URI } from '@dxos/keys';
|
|
20
20
|
|
|
21
21
|
import * as Database from '../../Database';
|
|
22
|
-
import
|
|
23
|
-
import
|
|
22
|
+
import type * as Type from '../../Type';
|
|
23
|
+
import {
|
|
24
|
+
ReferenceAnnotationId,
|
|
25
|
+
getSchemaURI,
|
|
26
|
+
getTypeAnnotation,
|
|
27
|
+
getTypeIdentifierAnnotation,
|
|
28
|
+
} from '../Annotation/annotations';
|
|
29
|
+
import { type AnyEntity, type AnyProperties, type UnknownTypeSchema, getStaticTypeSchema } from '../common/types';
|
|
24
30
|
import { type JsonSchemaType } from '../JsonSchema';
|
|
25
31
|
|
|
26
32
|
/**
|
|
@@ -31,7 +37,9 @@ export const JSON_SCHEMA_ECHO_REF_ID = '/schemas/echo/ref';
|
|
|
31
37
|
export const getSchemaReference = (property: JsonSchemaType): { typename: string } | undefined => {
|
|
32
38
|
const { $id, reference: { schema: { $ref } = {} } = {} } = property;
|
|
33
39
|
if ($id === JSON_SCHEMA_ECHO_REF_ID && $ref) {
|
|
34
|
-
|
|
40
|
+
const parsed = DXN.tryMake($ref);
|
|
41
|
+
const typename = parsed ? DXN.getName(parsed) : undefined;
|
|
42
|
+
return typename ? { typename } : undefined;
|
|
35
43
|
}
|
|
36
44
|
};
|
|
37
45
|
|
|
@@ -40,7 +48,7 @@ export const createSchemaReference = (typename: string): Types.DeepMutable<JsonS
|
|
|
40
48
|
$id: JSON_SCHEMA_ECHO_REF_ID,
|
|
41
49
|
reference: {
|
|
42
50
|
schema: {
|
|
43
|
-
$ref: DXN.
|
|
51
|
+
$ref: DXN.make(typename),
|
|
44
52
|
},
|
|
45
53
|
},
|
|
46
54
|
};
|
|
@@ -82,7 +90,27 @@ export interface RefSchema<T extends AnyEntity> extends Schema.SchemaClass<Ref<T
|
|
|
82
90
|
* Type of the `Ref` function and extra methods attached to it.
|
|
83
91
|
*/
|
|
84
92
|
export interface RefFn {
|
|
85
|
-
|
|
93
|
+
// A reference target is a `Type.AnyEntity` entity (the canonical Option B
|
|
94
|
+
// input) or one of the well-known "any object" / "any relation" branded
|
|
95
|
+
// schemas (`Obj.Unknown` / `Relation.Unknown`). Arbitrary raw schemas are
|
|
96
|
+
// rejected.
|
|
97
|
+
//
|
|
98
|
+
// Referencing a type-kind entity (a meta-schema, e.g. `Type.Type`) yields a
|
|
99
|
+
// reference to a stored schema record; its loaded target is any registered
|
|
100
|
+
// entity (`Type.AnyEntity`), since a stored object/relation schema is itself a
|
|
101
|
+
// `Type.Type` record. Referencing an object/relation type yields a reference
|
|
102
|
+
// to an instance of that type.
|
|
103
|
+
<S extends Type.AnyEntity | UnknownTypeSchema<any, any> = Type.AnyEntity>(
|
|
104
|
+
schema: S,
|
|
105
|
+
): RefSchema<
|
|
106
|
+
S extends Type.AnyType
|
|
107
|
+
? Type.AnyEntity
|
|
108
|
+
: S extends Type.AnyObj | Type.AnyRelation
|
|
109
|
+
? Type.InstanceType<S>
|
|
110
|
+
: S extends UnknownTypeSchema<infer A, any>
|
|
111
|
+
? A
|
|
112
|
+
: never
|
|
113
|
+
>;
|
|
86
114
|
|
|
87
115
|
/**
|
|
88
116
|
* @returns True if the object is a reference.
|
|
@@ -92,7 +120,7 @@ export interface RefFn {
|
|
|
92
120
|
/**
|
|
93
121
|
* @returns True if the reference points to the given object id.
|
|
94
122
|
*/
|
|
95
|
-
|
|
123
|
+
hasEntityId: (id: EntityId) => (ref: Ref<any>) => boolean;
|
|
96
124
|
|
|
97
125
|
/**
|
|
98
126
|
* @returns True if the schema is a reference schema.
|
|
@@ -111,15 +139,19 @@ export interface RefFn {
|
|
|
111
139
|
make: <T extends AnyEntity>(object: T) => Ref<T>;
|
|
112
140
|
|
|
113
141
|
/**
|
|
114
|
-
* Constructs a reference that points to the object specified by the provided
|
|
142
|
+
* Constructs a reference that points to the object specified by the provided URI
|
|
143
|
+
* (either an `echo:` EID for an object reference or a `dxn:` DXN for a type reference).
|
|
115
144
|
*/
|
|
116
|
-
|
|
145
|
+
fromURI: (uri: URI.URI) => Ref<any>;
|
|
117
146
|
}
|
|
118
147
|
|
|
119
148
|
/**
|
|
120
149
|
* Schema builder for references.
|
|
121
150
|
*/
|
|
122
|
-
export const Ref: RefFn =
|
|
151
|
+
export const Ref: RefFn = (input: any): RefSchema<any> => {
|
|
152
|
+
// `Type.Type` entities carry their source schema on the hidden slot; the
|
|
153
|
+
// branded `Obj.Unknown` / `Relation.Unknown` schemas are used directly.
|
|
154
|
+
const schema = getStaticTypeSchema(input) ?? input;
|
|
123
155
|
assertArgument(Schema.isSchema(schema), 'schema', 'Must call with an instance of effect-schema');
|
|
124
156
|
const annotation = getTypeAnnotation(schema);
|
|
125
157
|
if (annotation == null) {
|
|
@@ -135,9 +167,9 @@ export const Ref: RefFn = <S extends Schema.Schema.Any>(schema: S): RefSchema<Sc
|
|
|
135
167
|
*/
|
|
136
168
|
export interface Ref<T> extends Pipeable.Pipeable {
|
|
137
169
|
/**
|
|
138
|
-
* Target object DXN.
|
|
170
|
+
* Target URI (either an `echo:` EID for an object reference or a `dxn:` DXN for a type reference).
|
|
139
171
|
*/
|
|
140
|
-
get
|
|
172
|
+
get uri(): URI.URI;
|
|
141
173
|
|
|
142
174
|
/**
|
|
143
175
|
* Returns true if the reference has a target available (inlined or resolver set).
|
|
@@ -215,7 +247,10 @@ Ref.isRef = (obj: any): obj is Ref<any> => {
|
|
|
215
247
|
return obj && typeof obj === 'object' && RefTypeId in obj;
|
|
216
248
|
};
|
|
217
249
|
|
|
218
|
-
Ref.
|
|
250
|
+
Ref.hasEntityId = (id: EntityId) => (ref: Ref<any>) => {
|
|
251
|
+
const uri = EID.tryParse(ref.uri);
|
|
252
|
+
return uri !== undefined && EID.isLocal(uri) && EID.getEntityId(uri) === id;
|
|
253
|
+
};
|
|
219
254
|
|
|
220
255
|
Ref.isRefSchema = (schema: Schema.Schema<any, any>): schema is RefSchema<any> => {
|
|
221
256
|
return Ref.isRefSchemaAST(schema.ast);
|
|
@@ -230,16 +265,16 @@ Ref.make = <T extends AnyProperties>(obj: T): Ref<T> => {
|
|
|
230
265
|
throw new TypeError('Expected: ECHO object.');
|
|
231
266
|
}
|
|
232
267
|
|
|
233
|
-
// TODO(dmaretskyi): Extract to `
|
|
268
|
+
// TODO(dmaretskyi): Extract to `getObjectEchoUri` function.
|
|
234
269
|
const id = obj.id;
|
|
235
|
-
invariant(
|
|
236
|
-
const
|
|
237
|
-
return new RefImpl(
|
|
270
|
+
invariant(EntityId.isValid(id), 'Invalid object ID');
|
|
271
|
+
const uri = EID.make({ entityId: id });
|
|
272
|
+
return new RefImpl(uri, obj);
|
|
238
273
|
};
|
|
239
274
|
|
|
240
|
-
Ref.
|
|
241
|
-
assertArgument(
|
|
242
|
-
return new RefImpl(
|
|
275
|
+
Ref.fromURI = (uri: URI.URI): Ref<any> => {
|
|
276
|
+
assertArgument(typeof uri === 'string', 'uri', 'Expected URI string');
|
|
277
|
+
return new RefImpl(uri);
|
|
243
278
|
};
|
|
244
279
|
|
|
245
280
|
/**
|
|
@@ -255,18 +290,18 @@ export type JsonSchemaReferenceInfo = {
|
|
|
255
290
|
*/
|
|
256
291
|
// TODO(burdon): Move to json schema and make private?
|
|
257
292
|
export const createEchoReferenceSchema = (
|
|
258
|
-
|
|
293
|
+
echoUri: string | undefined,
|
|
259
294
|
typename: string | undefined,
|
|
260
295
|
version: string | undefined,
|
|
261
296
|
): Schema.SchemaClass<Ref<any>, EncodedReference> => {
|
|
262
|
-
if (!
|
|
263
|
-
throw new TypeError('Either
|
|
297
|
+
if (!echoUri && !typename) {
|
|
298
|
+
throw new TypeError('Either echoUri or typename must be provided.');
|
|
264
299
|
}
|
|
265
300
|
|
|
266
301
|
const referenceInfo: JsonSchemaReferenceInfo = {
|
|
267
302
|
schema: {
|
|
268
303
|
// TODO(dmaretskyi): Include version?
|
|
269
|
-
$ref:
|
|
304
|
+
$ref: echoUri ?? DXN.make(typename!),
|
|
270
305
|
},
|
|
271
306
|
schemaVersion: version,
|
|
272
307
|
};
|
|
@@ -279,7 +314,7 @@ export const createEchoReferenceSchema = (
|
|
|
279
314
|
return (value) =>
|
|
280
315
|
Effect.gen(function* () {
|
|
281
316
|
if (Ref.isRef(value)) {
|
|
282
|
-
return EncodedReference.
|
|
317
|
+
return EncodedReference.fromURI((value as Ref<any>).uri);
|
|
283
318
|
} else if (EncodedReference.isEncodedReference(value)) {
|
|
284
319
|
return value;
|
|
285
320
|
}
|
|
@@ -294,7 +329,7 @@ export const createEchoReferenceSchema = (
|
|
|
294
329
|
// TODO(dmaretskyi): This branch seems to be taken by Schema.is
|
|
295
330
|
if (Ref.isRef(value)) {
|
|
296
331
|
if (Option.isSome(dbService)) {
|
|
297
|
-
return dbService.value.db.makeRef(value.
|
|
332
|
+
return dbService.value.db.makeRef(value.uri);
|
|
298
333
|
} else {
|
|
299
334
|
return value;
|
|
300
335
|
}
|
|
@@ -304,9 +339,9 @@ export const createEchoReferenceSchema = (
|
|
|
304
339
|
return yield* Effect.fail(new ParseResult.Unexpected(value, 'reference'));
|
|
305
340
|
}
|
|
306
341
|
if (Option.isSome(dbService)) {
|
|
307
|
-
return dbService.value.db.makeRef(EncodedReference.
|
|
342
|
+
return dbService.value.db.makeRef(EncodedReference.toURI(value));
|
|
308
343
|
} else {
|
|
309
|
-
return Ref.
|
|
344
|
+
return Ref.fromURI(EncodedReference.toURI(value));
|
|
310
345
|
}
|
|
311
346
|
});
|
|
312
347
|
},
|
|
@@ -340,23 +375,32 @@ export interface RefResolver {
|
|
|
340
375
|
/**
|
|
341
376
|
* Resolve ref synchronously from the objects in the working set.
|
|
342
377
|
*
|
|
343
|
-
* @param
|
|
378
|
+
* @param uri
|
|
344
379
|
* @param load If true the resolver should attempt to load the object from disk.
|
|
345
380
|
* @param onLoad Callback to call when the object is loaded.
|
|
346
381
|
*/
|
|
347
|
-
resolveSync(
|
|
382
|
+
resolveSync(uri: URI.URI, load: boolean, onLoad?: () => void): AnyProperties | undefined;
|
|
348
383
|
|
|
349
384
|
/**
|
|
350
385
|
* Resolver ref asynchronously.
|
|
351
386
|
*/
|
|
352
|
-
resolve(
|
|
387
|
+
resolve(uri: URI.URI): Promise<AnyProperties | undefined>;
|
|
353
388
|
|
|
354
389
|
// TODO(dmaretskyi): Combine with `resolve`.
|
|
355
|
-
resolveSchema(
|
|
390
|
+
resolveSchema(uri: URI.URI): Promise<Schema.Schema.AnyNoContext | undefined>;
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* Resolve the source `Type.AnyEntity` entity for a type URI. Used by
|
|
394
|
+
* deserialization paths (`Obj.fromJSON`) to set the back-reference accessed
|
|
395
|
+
* via `Obj.getType` / `Entity.getType`. Optional — resolvers that only
|
|
396
|
+
* carry raw schemas may leave this unimplemented; the deserializer falls
|
|
397
|
+
* back to leaving the type entity unset.
|
|
398
|
+
*/
|
|
399
|
+
resolveType?(uri: URI.URI): Promise<unknown | undefined>;
|
|
356
400
|
}
|
|
357
401
|
|
|
358
402
|
export class RefImpl<T> implements Ref<T> {
|
|
359
|
-
#
|
|
403
|
+
#uri: URI.URI;
|
|
360
404
|
#resolver?: RefResolver = undefined;
|
|
361
405
|
#resolved = new Event<void>();
|
|
362
406
|
|
|
@@ -373,16 +417,16 @@ export class RefImpl<T> implements Ref<T> {
|
|
|
373
417
|
this.#resolved.emit();
|
|
374
418
|
};
|
|
375
419
|
|
|
376
|
-
constructor(
|
|
377
|
-
this.#
|
|
420
|
+
constructor(uri: URI.URI, target?: T) {
|
|
421
|
+
this.#uri = uri;
|
|
378
422
|
this.#target = target;
|
|
379
423
|
}
|
|
380
424
|
|
|
381
425
|
/**
|
|
382
426
|
* @inheritdoc
|
|
383
427
|
*/
|
|
384
|
-
get
|
|
385
|
-
return this.#
|
|
428
|
+
get uri(): URI.URI {
|
|
429
|
+
return this.#uri;
|
|
386
430
|
}
|
|
387
431
|
|
|
388
432
|
/**
|
|
@@ -401,7 +445,7 @@ export class RefImpl<T> implements Ref<T> {
|
|
|
401
445
|
}
|
|
402
446
|
|
|
403
447
|
invariant(this.#resolver, 'Resolver is not set');
|
|
404
|
-
return this.#resolver.resolveSync(this.#
|
|
448
|
+
return this.#resolver.resolveSync(this.#uri, true, this.#resolverCallback) as T | undefined;
|
|
405
449
|
}
|
|
406
450
|
|
|
407
451
|
/**
|
|
@@ -412,7 +456,7 @@ export class RefImpl<T> implements Ref<T> {
|
|
|
412
456
|
return this.#target;
|
|
413
457
|
}
|
|
414
458
|
invariant(this.#resolver, 'Resolver is not set');
|
|
415
|
-
const obj = await this.#resolver.resolve(this.#
|
|
459
|
+
const obj = await this.#resolver.resolve(this.#uri);
|
|
416
460
|
if (obj == null) {
|
|
417
461
|
throw new Error('Object not found');
|
|
418
462
|
}
|
|
@@ -427,7 +471,7 @@ export class RefImpl<T> implements Ref<T> {
|
|
|
427
471
|
return this.#target;
|
|
428
472
|
}
|
|
429
473
|
invariant(this.#resolver, 'Resolver is not set');
|
|
430
|
-
return (await this.#resolver.resolve(this.#
|
|
474
|
+
return (await this.#resolver.resolve(this.#uri)) as T | undefined;
|
|
431
475
|
}
|
|
432
476
|
|
|
433
477
|
/**
|
|
@@ -443,14 +487,14 @@ export class RefImpl<T> implements Ref<T> {
|
|
|
443
487
|
* Clones the reference object.
|
|
444
488
|
*/
|
|
445
489
|
noInline(): RefImpl<T> {
|
|
446
|
-
const ref = new RefImpl<T>(this.#
|
|
490
|
+
const ref = new RefImpl<T>(this.#uri, undefined);
|
|
447
491
|
ref.#resolver = this.#resolver;
|
|
448
492
|
return ref;
|
|
449
493
|
}
|
|
450
494
|
|
|
451
495
|
encode(): EncodedReference {
|
|
452
496
|
return {
|
|
453
|
-
'/': this.#
|
|
497
|
+
'/': this.#uri,
|
|
454
498
|
...(this.#target ? { target: this.#target } : {}),
|
|
455
499
|
};
|
|
456
500
|
}
|
|
@@ -470,7 +514,7 @@ export class RefImpl<T> implements Ref<T> {
|
|
|
470
514
|
return `Ref(${this.#target.toString()})`;
|
|
471
515
|
}
|
|
472
516
|
|
|
473
|
-
return `Ref(${this.#
|
|
517
|
+
return `Ref(${this.#uri.toString()})`;
|
|
474
518
|
}
|
|
475
519
|
|
|
476
520
|
[inspectCustom]: CustomInspectFunction = (depth, options, inspect) => {
|
|
@@ -486,12 +530,12 @@ export class RefImpl<T> implements Ref<T> {
|
|
|
486
530
|
* so without this, each access would create a separate cache entry.
|
|
487
531
|
*/
|
|
488
532
|
[Hash.symbol](): number {
|
|
489
|
-
return Hash.hash(this.#
|
|
533
|
+
return Hash.hash(this.#uri.toString());
|
|
490
534
|
}
|
|
491
535
|
|
|
492
536
|
/** Effect Equal trait. See {@link Hash.symbol} for rationale. */
|
|
493
537
|
[Equal.symbol](that: Equal.Equal): boolean {
|
|
494
|
-
return that instanceof RefImpl && this.#
|
|
538
|
+
return that instanceof RefImpl && this.#uri === that.uri;
|
|
495
539
|
}
|
|
496
540
|
|
|
497
541
|
/**
|
|
@@ -538,8 +582,8 @@ const refVariance: Ref<any>[typeof RefTypeId] = {
|
|
|
538
582
|
};
|
|
539
583
|
|
|
540
584
|
export const refFromEncodedReference = (encodedReference: EncodedReference, resolver?: RefResolver): Ref<any> => {
|
|
541
|
-
const
|
|
542
|
-
const ref = new RefImpl(
|
|
585
|
+
const uri = EncodedReference.toURI(encodedReference);
|
|
586
|
+
const ref = new RefImpl(uri);
|
|
543
587
|
|
|
544
588
|
// TODO(dmaretskyi): Handle inline target in the encoded reference.
|
|
545
589
|
|
|
@@ -550,23 +594,26 @@ export const refFromEncodedReference = (encodedReference: EncodedReference, reso
|
|
|
550
594
|
};
|
|
551
595
|
|
|
552
596
|
export class StaticRefResolver implements RefResolver {
|
|
553
|
-
public objects = new Map<
|
|
554
|
-
public schemas = new Map<
|
|
597
|
+
public objects = new Map<EntityId, AnyProperties>();
|
|
598
|
+
public schemas = new Map<URI.URI, Schema.Schema.AnyNoContext>();
|
|
555
599
|
|
|
556
600
|
addObject(obj: AnyProperties): this {
|
|
557
601
|
this.objects.set(obj.id, obj);
|
|
558
602
|
return this;
|
|
559
603
|
}
|
|
560
604
|
|
|
561
|
-
addSchema(
|
|
562
|
-
const
|
|
563
|
-
invariant(
|
|
564
|
-
|
|
605
|
+
addSchema(input: Type.AnyEntity): this {
|
|
606
|
+
const schema = getStaticTypeSchema(input);
|
|
607
|
+
invariant(schema, 'Type entity is missing its source schema');
|
|
608
|
+
const uri = getSchemaURI(schema);
|
|
609
|
+
invariant(uri, 'Schema has no URI');
|
|
610
|
+
this.schemas.set(uri, schema);
|
|
565
611
|
return this;
|
|
566
612
|
}
|
|
567
613
|
|
|
568
|
-
resolveSync(
|
|
569
|
-
const
|
|
614
|
+
resolveSync(uri: URI.URI, _load: boolean, _onLoad?: () => void): AnyProperties | undefined {
|
|
615
|
+
const echoUri = EID.tryParse(uri);
|
|
616
|
+
const id = echoUri ? EID.getEntityId(echoUri) : undefined;
|
|
570
617
|
if (id == null) {
|
|
571
618
|
return undefined;
|
|
572
619
|
}
|
|
@@ -574,8 +621,9 @@ export class StaticRefResolver implements RefResolver {
|
|
|
574
621
|
return this.objects.get(id);
|
|
575
622
|
}
|
|
576
623
|
|
|
577
|
-
async resolve(
|
|
578
|
-
const
|
|
624
|
+
async resolve(uri: URI.URI): Promise<AnyProperties | undefined> {
|
|
625
|
+
const echoUri = EID.tryParse(uri);
|
|
626
|
+
const id = echoUri ? EID.getEntityId(echoUri) : undefined;
|
|
579
627
|
if (id == null) {
|
|
580
628
|
return undefined;
|
|
581
629
|
}
|
|
@@ -583,7 +631,7 @@ export class StaticRefResolver implements RefResolver {
|
|
|
583
631
|
return this.objects.get(id);
|
|
584
632
|
}
|
|
585
633
|
|
|
586
|
-
async resolveSchema(
|
|
587
|
-
return this.schemas.get(
|
|
634
|
+
async resolveSchema(uri: URI.URI): Promise<Schema.Schema.AnyNoContext | undefined> {
|
|
635
|
+
return this.schemas.get(uri);
|
|
588
636
|
}
|
|
589
637
|
}
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
import * as Schema from 'effect/Schema';
|
|
6
6
|
import { describe, test } from 'vitest';
|
|
7
7
|
|
|
8
|
+
import { DXN } from '@dxos/keys';
|
|
9
|
+
|
|
8
10
|
import { FieldPath } from '../Annotation';
|
|
9
11
|
import { EchoObjectSchema } from '../Entity';
|
|
10
12
|
import { FormatAnnotation, TypeFormat } from '../Format';
|
|
@@ -16,7 +18,7 @@ describe('schema composition', () => {
|
|
|
16
18
|
const BaseType = Schema.Struct({
|
|
17
19
|
name: Schema.String,
|
|
18
20
|
email: Schema.String,
|
|
19
|
-
}).pipe(EchoObjectSchema(
|
|
21
|
+
}).pipe(EchoObjectSchema(DXN.make('com.example.person', '0.1.0')));
|
|
20
22
|
|
|
21
23
|
const OverlaySchema = Schema.Struct({
|
|
22
24
|
email: Schema.String.pipe(FieldPath('$.email'), FormatAnnotation.set(TypeFormat.Email)),
|
|
@@ -6,9 +6,6 @@ import * as Schema from 'effect/Schema';
|
|
|
6
6
|
import * as SchemaAST from 'effect/SchemaAST';
|
|
7
7
|
|
|
8
8
|
import { invariant } from '@dxos/invariant';
|
|
9
|
-
import { DXN } from '@dxos/keys';
|
|
10
|
-
|
|
11
|
-
import { type TypeAnnotation, TypeAnnotationId, TypeIdentifierAnnotationId } from '../Annotation';
|
|
12
9
|
|
|
13
10
|
// TODO(ZaymonFC): Do this one at a time. This might be dangerous.
|
|
14
11
|
export const addFieldsToSchema = (
|
|
@@ -68,25 +65,3 @@ export const updateFieldNameInSchema = (
|
|
|
68
65
|
),
|
|
69
66
|
);
|
|
70
67
|
};
|
|
71
|
-
|
|
72
|
-
export const setTypenameInSchema = (
|
|
73
|
-
schema: Schema.Schema.AnyNoContext,
|
|
74
|
-
typename: string,
|
|
75
|
-
): Schema.Schema.AnyNoContext => {
|
|
76
|
-
const existingAnnotation = schema.ast.annotations[TypeAnnotationId] as TypeAnnotation;
|
|
77
|
-
invariant(existingAnnotation, `Missing ${String(TypeAnnotationId)}`);
|
|
78
|
-
|
|
79
|
-
return schema.annotations({
|
|
80
|
-
...schema.ast.annotations,
|
|
81
|
-
[TypeAnnotationId]: {
|
|
82
|
-
kind: existingAnnotation.kind,
|
|
83
|
-
typename,
|
|
84
|
-
version: existingAnnotation.version,
|
|
85
|
-
} satisfies TypeAnnotation,
|
|
86
|
-
[SchemaAST.JSONSchemaAnnotationId]: {
|
|
87
|
-
...(schema.ast.annotations[SchemaAST.JSONSchemaAnnotationId] ?? {}),
|
|
88
|
-
$id: schema.ast.annotations[TypeIdentifierAnnotationId] ?? DXN.fromTypename(typename).toString(),
|
|
89
|
-
typename,
|
|
90
|
-
},
|
|
91
|
-
});
|
|
92
|
-
};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
|
|
7
|
+
import { IconAnnotation, LabelAnnotation } from '../Annotation';
|
|
8
|
+
import { EntityKind, KindId, SchemaKindId, StaticTypeSchemaSlot } from '../common/types';
|
|
9
|
+
import { EchoTypeKindSchema, TypeMetaSchemaDXN } from '../Entity';
|
|
10
|
+
import { JsonSchemaType } from '../JsonSchema';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Raw struct backing {@link TypeSchema}. Exposed only so `TypeSchema`
|
|
14
|
+
* (the TS type) can derive its data fields via `Schema.Schema.Type<typeof ...>`;
|
|
15
|
+
* runtime callers should use {@link TypeSchema} (the piped, branded entity).
|
|
16
|
+
*
|
|
17
|
+
* `typename` and `version` are NOT data fields — they live in `EntityMeta.key` /
|
|
18
|
+
* `EntityMeta.version` (the canonical registry-provenance pair, queryable via
|
|
19
|
+
* `Filter.key(...)`). The same `jsonSchema` payload also embeds them so a
|
|
20
|
+
* standalone JSON-Schema export remains self-describing, but the schema-registry
|
|
21
|
+
* reads/writes them through meta.
|
|
22
|
+
*/
|
|
23
|
+
const TypeSchemaStruct = Schema.Struct({
|
|
24
|
+
name: Schema.optional(Schema.String),
|
|
25
|
+
jsonSchema: JsonSchemaType,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Persistent representation of a schema.
|
|
30
|
+
*/
|
|
31
|
+
export const TypeSchema = TypeSchemaStruct.pipe(
|
|
32
|
+
LabelAnnotation.set(['name']),
|
|
33
|
+
IconAnnotation.set({
|
|
34
|
+
icon: 'ph--database--regular',
|
|
35
|
+
hue: 'green',
|
|
36
|
+
}),
|
|
37
|
+
EchoTypeKindSchema(TypeMetaSchemaDXN),
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Persistent representation of a schema — the runtime shape that
|
|
42
|
+
* `db.addType(Type.makeObjectFromJsonSchema(...))` produces
|
|
43
|
+
* and `Filter.type(Type.Type).run()` returns.
|
|
44
|
+
*
|
|
45
|
+
* Structurally identical to a static `Type.Type` entity: the entity-handler's
|
|
46
|
+
* `get` trap exposes `[SchemaKindId]` (derived from `system.kind` and
|
|
47
|
+
* `data.jsonSchema.entityKind`) and rebuilds `[StaticTypeSchemaSlot]` lazily
|
|
48
|
+
* from `jsonSchema`, so a persisted instance satisfies the public `Type<A>`
|
|
49
|
+
* interface without casting.
|
|
50
|
+
*/
|
|
51
|
+
export type TypeSchema = Schema.Schema.Type<typeof TypeSchemaStruct> & {
|
|
52
|
+
/** Object identifier — injected by `EchoTypeKindSchema` and stamped at construction. */
|
|
53
|
+
readonly id: string;
|
|
54
|
+
/** Entity-kind discriminator (object/relation/type) carried on every entity instance. */
|
|
55
|
+
readonly [KindId]: EntityKind.Type;
|
|
56
|
+
/** Kind of schema described by this meta-instance — always `EntityKind.Type` for `Type.Type` itself. */
|
|
57
|
+
readonly [SchemaKindId]: EntityKind.Type;
|
|
58
|
+
/** Effect Schema rebuilt lazily from `jsonSchema`; satisfies `Type.getSchema(...)` without an extra cast. */
|
|
59
|
+
readonly [StaticTypeSchemaSlot]: Schema.Schema.AnyNoContext;
|
|
60
|
+
};
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
- [x] Unify FOUR different nests of test schema.
|
|
8
8
|
- [x] Remove @deprecated from internal methods and mark @internal (e.g., getSchemaDXN).
|
|
9
9
|
- NOTE: Internal methods should not use the import \* from Obj/Type APIs.
|
|
10
|
-
- [x] import
|
|
10
|
+
- [x] import EntityId => @dxos/keys
|
|
11
11
|
- [x] Entity.Any = Obj.Any | Relation.Any
|
|
12
12
|
- NOTE: Relation does not extend (in not polymorphic with) Obj.
|
|
13
13
|
- [x] import LabelAnnotation => Annotation.LabelAnnotation
|
|
@@ -6,18 +6,21 @@ import type { ForeignKey } from '@dxos/echo-protocol';
|
|
|
6
6
|
import { assertArgument, invariant } from '@dxos/invariant';
|
|
7
7
|
import type { DeepReadonly } from '@dxos/util';
|
|
8
8
|
|
|
9
|
+
import type * as Tag from '../../../Tag';
|
|
10
|
+
import type { Ref } from '../../Ref/ref';
|
|
9
11
|
import { type Mutable } from '../proxy';
|
|
10
|
-
import { type AnyProperties
|
|
12
|
+
import { type AnyProperties } from '../types';
|
|
13
|
+
import { type EntityMeta, getMeta as getMeta$ } from '../types/meta';
|
|
11
14
|
|
|
12
15
|
/**
|
|
13
|
-
* Deeply read-only version of
|
|
16
|
+
* Deeply read-only version of EntityMeta.
|
|
14
17
|
*/
|
|
15
|
-
export type ReadonlyMeta = DeepReadonly<
|
|
18
|
+
export type ReadonlyMeta = DeepReadonly<EntityMeta>;
|
|
16
19
|
|
|
17
20
|
/**
|
|
18
21
|
* Mutable meta type received in meta mutation callbacks.
|
|
19
22
|
*/
|
|
20
|
-
export type Meta = Mutable<
|
|
23
|
+
export type Meta = Mutable<EntityMeta>;
|
|
21
24
|
|
|
22
25
|
/**
|
|
23
26
|
* Get the metadata for an entity with validation.
|
|
@@ -61,26 +64,25 @@ export const deleteKeys = (entity: Mutable<AnyProperties>, source: string) => {
|
|
|
61
64
|
};
|
|
62
65
|
|
|
63
66
|
/**
|
|
64
|
-
* Add a tag to the entity.
|
|
67
|
+
* Add a tag (a reference to a {@link Tag} object) to the entity. Idempotent.
|
|
65
68
|
* Must be called within an Obj.update or Relation.update callback.
|
|
66
69
|
*/
|
|
67
|
-
export const addTag = (entity: Mutable<AnyProperties>, tag:
|
|
70
|
+
export const addTag = (entity: Mutable<AnyProperties>, tag: Ref<Tag.Tag>) => {
|
|
68
71
|
const meta = getMetaChecked(entity);
|
|
69
|
-
|
|
70
|
-
meta.tags.
|
|
72
|
+
// Two refs to the same target are not `===`; dedupe by URI.
|
|
73
|
+
if (!meta.tags.some((existing) => existing.uri === tag.uri)) {
|
|
74
|
+
meta.tags.push(tag);
|
|
75
|
+
}
|
|
71
76
|
};
|
|
72
77
|
|
|
73
78
|
/**
|
|
74
|
-
* Remove a tag from the entity.
|
|
79
|
+
* Remove a tag (a reference to a {@link Tag} object) from the entity. No-op when not present.
|
|
75
80
|
* Must be called within an Obj.update or Relation.update callback.
|
|
76
81
|
*/
|
|
77
|
-
export const removeTag = (entity: Mutable<AnyProperties>, tag:
|
|
82
|
+
export const removeTag = (entity: Mutable<AnyProperties>, tag: Ref<Tag.Tag>) => {
|
|
78
83
|
const meta = getMetaChecked(entity);
|
|
79
|
-
if (!meta.tags) {
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
84
|
for (let i = 0; i < meta.tags.length; i++) {
|
|
83
|
-
if (meta.tags[i] === tag) {
|
|
85
|
+
if (meta.tags[i].uri === tag.uri) {
|
|
84
86
|
meta.tags.splice(i, 1);
|
|
85
87
|
i--;
|
|
86
88
|
}
|