@dxos/echo 0.8.4-staging.ac66bdf99f → 0.9.0
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/LICENSE +102 -5
- package/README.md +7 -7
- package/dist/lib/neutral/Annotation.mjs +37 -6
- package/dist/lib/neutral/Database.mjs +6 -17
- package/dist/lib/neutral/Entity.mjs +31 -20
- package/dist/lib/neutral/Err.mjs +3 -3
- package/dist/lib/neutral/Feed.mjs +23 -19
- package/dist/lib/neutral/Filter.mjs +13 -15
- 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 +29 -20
- package/dist/lib/neutral/Order.mjs +7 -3
- package/dist/lib/neutral/Query.mjs +17 -17
- package/dist/lib/neutral/QueryResult.mjs +1 -1
- package/dist/lib/neutral/Ref.mjs +10 -9
- package/dist/lib/neutral/Registry.mjs +14 -0
- package/dist/lib/neutral/Relation.mjs +28 -25
- package/dist/lib/neutral/Scope.mjs +12 -0
- package/dist/lib/neutral/Tag.mjs +17 -14
- package/dist/lib/neutral/Type.mjs +54 -26
- package/dist/lib/neutral/{chunk-OMUPQMLR.mjs → chunk-35INCYOE.mjs} +1 -1
- package/dist/lib/neutral/chunk-35INCYOE.mjs.map +7 -0
- package/dist/lib/neutral/chunk-3PBP4V4O.mjs +101 -0
- package/dist/lib/neutral/chunk-3PBP4V4O.mjs.map +7 -0
- package/dist/lib/neutral/chunk-4ZUHOTCG.mjs +184 -0
- package/dist/lib/neutral/chunk-4ZUHOTCG.mjs.map +7 -0
- package/dist/lib/neutral/chunk-5SMDBFVB.mjs +108 -0
- package/dist/lib/neutral/chunk-5SMDBFVB.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-OS35K56T.mjs → chunk-5SUJPHAE.mjs} +3 -3
- package/dist/lib/neutral/{chunk-OS35K56T.mjs.map → chunk-5SUJPHAE.mjs.map} +2 -2
- package/dist/lib/neutral/{chunk-GZQTCRJB.mjs → chunk-6M2Z6WBH.mjs} +22 -2
- package/dist/lib/neutral/chunk-6M2Z6WBH.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-V36VO5SS.mjs → chunk-6YDI3J37.mjs} +32 -40
- package/dist/lib/neutral/chunk-6YDI3J37.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-MOR5ERFM.mjs → chunk-7FPIAJIV.mjs} +701 -1256
- package/dist/lib/neutral/chunk-7FPIAJIV.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-ANHVGJI4.mjs → chunk-7LOUAPYZ.mjs} +9 -5
- package/dist/lib/neutral/chunk-7LOUAPYZ.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-JUXPFOEI.mjs → chunk-7PI7C4EF.mjs} +48 -88
- package/dist/lib/neutral/chunk-7PI7C4EF.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-UBEZSGXY.mjs → chunk-BBFJWWAV.mjs} +6 -6
- package/dist/lib/neutral/chunk-BBFJWWAV.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-UI6MWK5W.mjs → chunk-EVK6XBXO.mjs} +16 -2
- package/dist/lib/neutral/chunk-EVK6XBXO.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-7RO7CPBZ.mjs → chunk-IGK6FN65.mjs} +2 -2
- package/dist/lib/neutral/{chunk-HBUZJNZO.mjs → chunk-LWXVKPPW.mjs} +94 -99
- package/dist/lib/neutral/chunk-LWXVKPPW.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-BVOFLCVF.mjs → chunk-MZ7K3MLL.mjs} +9 -6
- package/dist/lib/neutral/chunk-MZ7K3MLL.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-TBKX6JQO.mjs → chunk-O6BH7EPN.mjs} +30 -3
- package/dist/lib/neutral/chunk-O6BH7EPN.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-EAMSSLZC.mjs → chunk-QQIYS74I.mjs} +83 -46
- package/dist/lib/neutral/chunk-QQIYS74I.mjs.map +7 -0
- package/dist/lib/neutral/chunk-R5W6DXR4.mjs +678 -0
- package/dist/lib/neutral/chunk-R5W6DXR4.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-WAK4DMFV.mjs → chunk-RIVWNMSF.mjs} +12 -7
- package/dist/lib/neutral/chunk-RIVWNMSF.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-T6W2LEZU.mjs → chunk-SBVFRTST.mjs} +73 -38
- package/dist/lib/neutral/chunk-SBVFRTST.mjs.map +7 -0
- package/dist/lib/neutral/chunk-T6E37YIP.mjs +251 -0
- package/dist/lib/neutral/chunk-T6E37YIP.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-DQYLD2RB.mjs → chunk-TFEWTY5A.mjs} +155 -129
- package/dist/lib/neutral/chunk-TFEWTY5A.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-B4BASU6W.mjs → chunk-TYGKCRMK.mjs} +85 -76
- package/dist/lib/neutral/chunk-TYGKCRMK.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-4OIBYSXE.mjs → chunk-UUP46KUQ.mjs} +78 -32
- package/dist/lib/neutral/chunk-UUP46KUQ.mjs.map +7 -0
- package/dist/lib/neutral/chunk-WISOH2XH.mjs +36 -0
- package/dist/lib/neutral/chunk-WISOH2XH.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-G3IQMKF7.mjs → chunk-WTQJHC75.mjs} +111 -112
- package/dist/lib/neutral/chunk-WTQJHC75.mjs.map +7 -0
- package/dist/lib/neutral/chunk-WU3GIANS.mjs +31 -0
- package/dist/lib/neutral/chunk-WU3GIANS.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-TU3GW67D.mjs → chunk-ZGNNFYHS.mjs} +40 -40
- package/dist/lib/neutral/chunk-ZGNNFYHS.mjs.map +7 -0
- package/dist/lib/neutral/index.mjs +47 -41
- package/dist/lib/neutral/internal/index.mjs +137 -72
- package/dist/lib/neutral/meta.json +1 -1
- package/dist/lib/neutral/testing/index.mjs +261 -178
- package/dist/lib/neutral/testing/index.mjs.map +4 -4
- 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 +56 -49
- 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 +101 -28
- package/dist/types/src/Entity.d.ts.map +1 -1
- package/dist/types/src/Err.d.ts +27 -27
- package/dist/types/src/Err.d.ts.map +1 -1
- package/dist/types/src/Feed.d.ts +66 -19
- package/dist/types/src/Feed.d.ts.map +1 -1
- package/dist/types/src/Filter.d.ts +38 -12
- package/dist/types/src/Filter.d.ts.map +1 -1
- package/dist/types/src/Format.d.ts +0 -2
- package/dist/types/src/Format.d.ts.map +1 -1
- package/dist/types/src/Hypergraph.d.ts +14 -9
- package/dist/types/src/Hypergraph.d.ts.map +1 -1
- package/dist/types/src/Json.d.ts +33 -0
- package/dist/types/src/Json.d.ts.map +1 -0
- package/dist/types/src/Json.test.d.ts +2 -0
- package/dist/types/src/Json.test.d.ts.map +1 -0
- package/dist/types/src/JsonSchema.d.ts +2 -2
- 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 +26 -11
- package/dist/types/src/Migration.d.ts.map +1 -1
- package/dist/types/src/Obj.d.ts +104 -61
- package/dist/types/src/Obj.d.ts.map +1 -1
- package/dist/types/src/Order.d.ts +10 -0
- package/dist/types/src/Order.d.ts.map +1 -1
- package/dist/types/src/Query.d.ts +34 -12
- package/dist/types/src/Query.d.ts.map +1 -1
- package/dist/types/src/QueryResult.d.ts +21 -0
- package/dist/types/src/QueryResult.d.ts.map +1 -1
- package/dist/types/src/Ref.d.ts +15 -7
- 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 +73 -41
- package/dist/types/src/Relation.d.ts.map +1 -1
- package/dist/types/src/Scope.d.ts +35 -0
- package/dist/types/src/Scope.d.ts.map +1 -0
- package/dist/types/src/Tag.d.ts +21 -5
- package/dist/types/src/Tag.d.ts.map +1 -1
- package/dist/types/src/Type.d.ts +362 -95
- package/dist/types/src/Type.d.ts.map +1 -1
- package/dist/types/src/View.d.ts +9 -12
- package/dist/types/src/View.d.ts.map +1 -1
- package/dist/types/src/exemplars.test.d.ts +2 -0
- package/dist/types/src/exemplars.test.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +4 -3
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/internal/Annotation/annotations.d.ts +79 -38
- 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/sorting.d.ts.map +1 -1
- package/dist/types/src/internal/Annotation/util.d.ts +14 -5
- package/dist/types/src/internal/Annotation/util.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/api.d.ts +17 -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 +21 -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 +24 -0
- package/dist/types/src/internal/Entity/type-uri.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/version.d.ts.map +1 -1
- 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/number.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/Format/types.d.ts.map +1 -1
- package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -1
- package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts +34 -34
- package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -1
- package/dist/types/src/internal/JsonSchema/json-schema.d.ts +3 -2
- package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/atoms.d.ts +38 -0
- package/dist/types/src/internal/Obj/atoms.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/clone.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/common.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/create-object.d.ts +12 -12
- package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/index.d.ts +1 -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/set-value.d.ts +1 -1
- package/dist/types/src/internal/Obj/set-value.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/index.d.ts +2 -0
- package/dist/types/src/internal/Query/index.d.ts.map +1 -0
- package/dist/types/src/internal/{Query.d.ts → Query/pretty.d.ts} +1 -1
- package/dist/types/src/internal/Query/pretty.d.ts.map +1 -0
- package/dist/types/src/internal/Ref/atoms.d.ts +10 -0
- package/dist/types/src/internal/Ref/atoms.d.ts.map +1 -0
- package/dist/types/src/internal/Ref/ref-array.d.ts +2 -2
- package/dist/types/src/internal/Ref/ref.d.ts +50 -19
- package/dist/types/src/internal/Ref/ref.d.ts.map +1 -1
- package/dist/types/src/internal/Ref/utils.d.ts +8 -0
- package/dist/types/src/internal/Ref/utils.d.ts.map +1 -0
- package/dist/types/src/internal/Type/compose.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 +14 -11
- package/dist/types/src/internal/common/api/meta.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/change-context.d.ts +1 -1
- package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/errors.d.ts +1 -1
- package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/event-batch.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/ownership.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/reactive-array.d.ts +1 -1
- package/dist/types/src/internal/common/proxy/reactive.d.ts +1 -1
- package/dist/types/src/internal/common/proxy/reactive.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/reactive.test.d.ts +2 -0
- package/dist/types/src/internal/common/proxy/reactive.test.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/typed-handler.d.ts +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/base.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/entity.d.ts +62 -5
- 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 +33 -12
- package/dist/types/src/internal/common/types/meta.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/model-symbols.d.ts +15 -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/version.d.ts +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 +2 -2
- package/dist/types/src/internal/index.d.ts.map +1 -1
- package/dist/types/src/testing/index.d.ts +1 -0
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/testing/registry.d.ts +9 -0
- package/dist/types/src/testing/registry.d.ts.map +1 -0
- package/dist/types/src/testing/test-data.d.ts +8 -8
- package/dist/types/src/testing/test-data.d.ts.map +1 -1
- package/dist/types/src/testing/test-schema.d.ts +83 -89
- 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 +26 -24
- package/src/Annotation.test.ts +439 -0
- package/src/Annotation.ts +158 -4
- package/src/Collection.ts +5 -9
- package/src/Database.ts +93 -100
- package/src/Dataset.ts +10 -2
- package/src/Entity.test.ts +116 -6
- package/src/Entity.ts +134 -32
- package/src/Err.ts +4 -4
- package/src/Feed.ts +92 -44
- package/src/Filter.ts +70 -40
- package/src/Format.ts +0 -4
- package/src/Hypergraph.ts +14 -9
- package/src/Json.test.ts +175 -0
- package/src/Json.ts +103 -0
- package/src/Key.ts +1 -1
- package/src/Migration.ts +39 -19
- package/src/Obj.test.ts +122 -20
- package/src/Obj.ts +168 -91
- package/src/Order.ts +22 -0
- package/src/Query.test.ts +183 -154
- package/src/Query.ts +172 -85
- package/src/QueryResult.ts +26 -0
- package/src/Ref.ts +22 -4
- package/src/Registry.ts +155 -0
- package/src/Relation.test.ts +10 -10
- package/src/Relation.ts +116 -69
- package/src/Scope.ts +50 -0
- package/src/Tag.md +88 -0
- package/src/Tag.ts +49 -6
- package/src/Type.test.ts +223 -18
- package/src/Type.ts +609 -131
- package/src/View.ts +14 -23
- package/src/exemplars.test.ts +21 -0
- package/src/index.ts +4 -4
- package/src/internal/Annotation/annotations.test.ts +31 -11
- package/src/internal/Annotation/annotations.ts +143 -111
- package/src/internal/Annotation/dictionary.ts +47 -0
- package/src/internal/Annotation/entity-dictionary.ts +74 -0
- package/src/internal/Annotation/index.ts +4 -2
- package/src/internal/Annotation/util.ts +17 -8
- package/src/internal/Entity/api.ts +54 -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 +38 -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 +92 -0
- package/src/internal/Entity/util.ts +9 -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-type.ts +4 -4
- package/src/internal/JsonSchema/json-schema.test.ts +71 -145
- package/src/internal/JsonSchema/json-schema.ts +49 -35
- package/src/internal/Obj/atoms.ts +244 -0
- 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 +68 -22
- package/src/internal/Obj/index.ts +1 -1
- package/src/internal/Obj/inspect.ts +5 -3
- package/src/internal/Obj/json-serializer.test.ts +101 -22
- package/src/internal/Obj/json-serializer.ts +89 -33
- package/src/internal/Obj/set-value.test.ts +22 -45
- package/src/internal/Obj/set-value.ts +12 -19
- package/src/internal/Obj/snapshot.ts +13 -4
- package/src/internal/Obj/typed-object.test.ts +9 -11
- package/src/internal/Obj/typed-object.ts +1 -1
- package/src/internal/Query/index.ts +5 -0
- package/src/internal/{Query.ts → Query/pretty.ts} +40 -12
- package/src/internal/Ref/atoms.ts +20 -0
- package/src/internal/Ref/ref-array.ts +3 -3
- package/src/internal/Ref/ref.test.ts +18 -27
- package/src/internal/Ref/ref.ts +137 -59
- package/src/internal/Ref/utils.ts +45 -0
- 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 +2 -2
- package/src/internal/common/api/meta.ts +19 -17
- package/src/internal/common/proxy/change-context.ts +1 -1
- package/src/internal/common/proxy/change.test.ts +91 -83
- package/src/internal/common/proxy/errors.ts +2 -2
- package/src/internal/common/proxy/handler.test.ts +1 -1
- package/src/internal/common/proxy/json-serializer.ts +27 -16
- package/src/internal/common/proxy/make-object.ts +44 -20
- package/src/internal/common/proxy/ownership.ts +2 -2
- package/src/internal/common/proxy/reactive-array.ts +1 -1
- package/src/internal/common/proxy/reactive.test.ts +54 -0
- package/src/internal/common/proxy/reactive.ts +11 -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 +78 -16
- package/src/internal/common/proxy/typed-object.test.ts +16 -28
- 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 +62 -20
- package/src/internal/common/types/model-symbols.ts +24 -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 +6 -4
- package/src/testing/api.test.ts +15 -9
- package/src/testing/index.ts +1 -0
- package/src/testing/registry.ts +44 -0
- package/src/testing/test-data.ts +159 -99
- 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-2KHZ36F5.mjs +0 -361
- package/dist/lib/neutral/chunk-2KHZ36F5.mjs.map +0 -7
- package/dist/lib/neutral/chunk-4OIBYSXE.mjs.map +0 -7
- package/dist/lib/neutral/chunk-4P3IXBLT.mjs +0 -45
- package/dist/lib/neutral/chunk-4P3IXBLT.mjs.map +0 -7
- package/dist/lib/neutral/chunk-ANHVGJI4.mjs.map +0 -7
- package/dist/lib/neutral/chunk-B4BASU6W.mjs.map +0 -7
- package/dist/lib/neutral/chunk-BNCCGLJN.mjs +0 -7
- package/dist/lib/neutral/chunk-BNCCGLJN.mjs.map +0 -7
- package/dist/lib/neutral/chunk-BVOFLCVF.mjs.map +0 -7
- package/dist/lib/neutral/chunk-DQYLD2RB.mjs.map +0 -7
- package/dist/lib/neutral/chunk-EAMSSLZC.mjs.map +0 -7
- package/dist/lib/neutral/chunk-G3IQMKF7.mjs.map +0 -7
- package/dist/lib/neutral/chunk-GZQTCRJB.mjs.map +0 -7
- package/dist/lib/neutral/chunk-HBUZJNZO.mjs.map +0 -7
- package/dist/lib/neutral/chunk-JUXPFOEI.mjs.map +0 -7
- package/dist/lib/neutral/chunk-MOR5ERFM.mjs.map +0 -7
- package/dist/lib/neutral/chunk-OMUPQMLR.mjs.map +0 -7
- package/dist/lib/neutral/chunk-PHU22NLC.mjs +0 -136
- package/dist/lib/neutral/chunk-PHU22NLC.mjs.map +0 -7
- package/dist/lib/neutral/chunk-ROG4RXXL.mjs +0 -97
- package/dist/lib/neutral/chunk-ROG4RXXL.mjs.map +0 -7
- package/dist/lib/neutral/chunk-T6W2LEZU.mjs.map +0 -7
- package/dist/lib/neutral/chunk-TBKX6JQO.mjs.map +0 -7
- package/dist/lib/neutral/chunk-TU3GW67D.mjs.map +0 -7
- package/dist/lib/neutral/chunk-UBEZSGXY.mjs.map +0 -7
- package/dist/lib/neutral/chunk-UI6MWK5W.mjs.map +0 -7
- package/dist/lib/neutral/chunk-V36VO5SS.mjs.map +0 -7
- package/dist/lib/neutral/chunk-WAK4DMFV.mjs.map +0 -7
- package/dist/lib/neutral/chunk-YAHXAYOW.mjs +0 -56
- package/dist/lib/neutral/chunk-YAHXAYOW.mjs.map +0 -7
- package/dist/lib/neutral/chunk-YS6Q3XAD.mjs +0 -50
- package/dist/lib/neutral/chunk-YS6Q3XAD.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/Query.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-7RO7CPBZ.mjs.map → chunk-IGK6FN65.mjs.map} +0 -0
|
@@ -6,24 +6,22 @@ import type * as Schema from 'effect/Schema';
|
|
|
6
6
|
|
|
7
7
|
import { type ForeignKey } from '@dxos/echo-protocol';
|
|
8
8
|
import { invariant } from '@dxos/invariant';
|
|
9
|
-
import {
|
|
9
|
+
import { EID, EntityId, type URI } from '@dxos/keys';
|
|
10
10
|
import { assumeType } from '@dxos/util';
|
|
11
11
|
|
|
12
12
|
import type * as Database from '../../Database';
|
|
13
13
|
import {
|
|
14
|
-
type ATTR_META,
|
|
15
14
|
type ATTR_PARENT,
|
|
16
15
|
type ATTR_TYPE,
|
|
17
16
|
ATTR_DELETED,
|
|
18
17
|
ATTR_RELATION_SOURCE,
|
|
19
18
|
ATTR_RELATION_TARGET,
|
|
20
|
-
|
|
19
|
+
ATTR_SELF_URI,
|
|
20
|
+
ATTR_SELF_URI_LEGACY,
|
|
21
21
|
EntityKind,
|
|
22
22
|
KindId,
|
|
23
|
-
type MetaId,
|
|
24
23
|
ObjectDatabaseId,
|
|
25
24
|
ObjectDeletedId,
|
|
26
|
-
type ObjectMeta,
|
|
27
25
|
ObjectVersionId,
|
|
28
26
|
type ParentId,
|
|
29
27
|
RelationSourceDXNId,
|
|
@@ -31,12 +29,22 @@ import {
|
|
|
31
29
|
RelationTargetDXNId,
|
|
32
30
|
RelationTargetId,
|
|
33
31
|
type SchemaId,
|
|
34
|
-
|
|
32
|
+
SelfURIId,
|
|
35
33
|
TypeId,
|
|
36
34
|
type Version,
|
|
37
35
|
} from '../common/types';
|
|
36
|
+
import { type ATTR_META, type EntityMeta } from '../common/types/meta';
|
|
37
|
+
import { type MetaId } from '../common/types/model-symbols';
|
|
38
38
|
|
|
39
|
-
export {
|
|
39
|
+
export {
|
|
40
|
+
ATTR_DELETED,
|
|
41
|
+
ATTR_SELF_URI,
|
|
42
|
+
ATTR_SELF_URI_LEGACY,
|
|
43
|
+
ObjectDatabaseId,
|
|
44
|
+
ObjectDeletedId,
|
|
45
|
+
ObjectVersionId,
|
|
46
|
+
SelfURIId,
|
|
47
|
+
};
|
|
40
48
|
|
|
41
49
|
/**
|
|
42
50
|
* Internal runtime representation of an object.
|
|
@@ -44,18 +52,18 @@ export { ATTR_DELETED, ATTR_SELF_DXN, ObjectDatabaseId, ObjectDeletedId, ObjectV
|
|
|
44
52
|
*/
|
|
45
53
|
// NOTE: Each symbol has a jsdoc describing its purpose.
|
|
46
54
|
export interface InternalObjectProps {
|
|
47
|
-
readonly id:
|
|
48
|
-
readonly [
|
|
55
|
+
readonly id: EntityId;
|
|
56
|
+
readonly [SelfURIId]: EID.EID;
|
|
49
57
|
readonly [KindId]: EntityKind;
|
|
50
58
|
readonly [SchemaId]: Schema.Schema.AnyNoContext;
|
|
51
|
-
readonly [TypeId]:
|
|
52
|
-
readonly [MetaId]?:
|
|
59
|
+
readonly [TypeId]: URI.URI;
|
|
60
|
+
readonly [MetaId]?: EntityMeta;
|
|
53
61
|
[ParentId]?: InternalObjectProps;
|
|
54
62
|
readonly [ObjectDatabaseId]?: Database.Database;
|
|
55
63
|
readonly [ObjectDeletedId]?: boolean;
|
|
56
64
|
readonly [ObjectVersionId]?: Version;
|
|
57
|
-
readonly [RelationSourceDXNId]?:
|
|
58
|
-
readonly [RelationTargetDXNId]?:
|
|
65
|
+
readonly [RelationSourceDXNId]?: EID.EID;
|
|
66
|
+
readonly [RelationTargetDXNId]?: EID.EID;
|
|
59
67
|
readonly [RelationSourceId]?: InternalObjectProps;
|
|
60
68
|
readonly [RelationTargetId]?: InternalObjectProps;
|
|
61
69
|
}
|
|
@@ -63,23 +71,25 @@ export interface InternalObjectProps {
|
|
|
63
71
|
/**
|
|
64
72
|
* Entity metadata.
|
|
65
73
|
*/
|
|
66
|
-
export interface
|
|
74
|
+
export interface EntityMetaJSON {
|
|
67
75
|
keys: ForeignKey[];
|
|
68
76
|
tags?: string[];
|
|
77
|
+
key?: string;
|
|
78
|
+
version?: string;
|
|
69
79
|
}
|
|
70
80
|
|
|
71
81
|
/**
|
|
72
82
|
* JSON representation of an object or relation metadata.
|
|
73
83
|
*/
|
|
74
84
|
export interface ObjectJSON {
|
|
75
|
-
id:
|
|
76
|
-
[ATTR_TYPE]
|
|
77
|
-
[
|
|
78
|
-
[ATTR_PARENT]?:
|
|
85
|
+
id: EntityId;
|
|
86
|
+
[ATTR_TYPE]?: URI.URI;
|
|
87
|
+
[ATTR_SELF_URI]?: EID.EID;
|
|
88
|
+
[ATTR_PARENT]?: EID.EID; // Encoded reference
|
|
79
89
|
[ATTR_DELETED]?: boolean;
|
|
80
|
-
[ATTR_META]?:
|
|
81
|
-
[ATTR_RELATION_SOURCE]?:
|
|
82
|
-
[ATTR_RELATION_TARGET]?:
|
|
90
|
+
[ATTR_META]?: EntityMetaJSON;
|
|
91
|
+
[ATTR_RELATION_SOURCE]?: EID.EID;
|
|
92
|
+
[ATTR_RELATION_TARGET]?: EID.EID;
|
|
83
93
|
|
|
84
94
|
/**
|
|
85
95
|
* Application-specific properties.
|
|
@@ -93,17 +103,17 @@ export interface ObjectJSON {
|
|
|
93
103
|
export function assertObjectModel(obj: unknown): asserts obj is InternalObjectProps {
|
|
94
104
|
invariant(typeof obj === 'object' && obj !== null, 'Invalid object model: not an object');
|
|
95
105
|
assumeType<InternalObjectProps>(obj);
|
|
96
|
-
invariant(
|
|
97
|
-
invariant(obj[TypeId] === undefined || obj[TypeId]
|
|
106
|
+
invariant(EntityId.isValid(obj.id), 'Invalid object model: invalid id');
|
|
107
|
+
invariant(obj[TypeId] === undefined || typeof obj[TypeId] === 'string', 'Invalid object model: invalid type');
|
|
98
108
|
invariant(
|
|
99
|
-
obj[KindId] === EntityKind.Object || obj[KindId] === EntityKind.Relation,
|
|
109
|
+
obj[KindId] === EntityKind.Object || obj[KindId] === EntityKind.Relation || obj[KindId] === EntityKind.Type,
|
|
100
110
|
'Invalid object model: invalid entity kind',
|
|
101
111
|
);
|
|
102
112
|
|
|
103
113
|
if (obj[KindId] === EntityKind.Relation) {
|
|
104
|
-
invariant(obj[RelationSourceDXNId]
|
|
105
|
-
invariant(obj[RelationTargetDXNId]
|
|
106
|
-
invariant(!(obj[RelationSourceId]
|
|
107
|
-
invariant(!(obj[RelationTargetId]
|
|
114
|
+
invariant(EID.isEID(obj[RelationSourceDXNId]), 'Invalid object model: invalid relation source');
|
|
115
|
+
invariant(EID.isEID(obj[RelationTargetDXNId]), 'Invalid object model: invalid relation target');
|
|
116
|
+
invariant(!EID.isEID(obj[RelationSourceId]), 'Invalid object model: source pointer is a DXN');
|
|
117
|
+
invariant(!EID.isEID(obj[RelationTargetId]), 'Invalid object model: target pointer is a DXN');
|
|
108
118
|
}
|
|
109
119
|
}
|
|
@@ -6,10 +6,13 @@ 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';
|
|
9
10
|
|
|
10
|
-
import { type TypeAnnotation, TypeAnnotationId
|
|
11
|
+
import { type TypeAnnotation, TypeAnnotationId } from '../Annotation/annotations';
|
|
12
|
+
import { makeTypeJsonSchemaAnnotation } from '../Annotation/util';
|
|
11
13
|
import { EntityKind } from '../common/types';
|
|
12
|
-
import {
|
|
14
|
+
import { toJsonSchema } from '../JsonSchema';
|
|
15
|
+
import { type EchoTypeOptions, type EchoTypeSchema, makeEchoTypeSchema } from './entity';
|
|
13
16
|
|
|
14
17
|
/**
|
|
15
18
|
* Object schema type with kind marker.
|
|
@@ -25,11 +28,16 @@ export type EchoObjectSchema<
|
|
|
25
28
|
*/
|
|
26
29
|
export const EchoObjectSchema: {
|
|
27
30
|
(
|
|
28
|
-
|
|
31
|
+
dxn: DXN.DXN,
|
|
32
|
+
options?: EchoTypeOptions,
|
|
29
33
|
): <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(
|
|
30
34
|
self: Self & { fields?: Fields },
|
|
31
35
|
) => EchoObjectSchema<Self, Fields>;
|
|
32
|
-
} = (
|
|
36
|
+
} = (dxn, options) => {
|
|
37
|
+
const typename = DXN.getName(dxn);
|
|
38
|
+
const version = DXN.getVersion(dxn);
|
|
39
|
+
invariant(version, `Type.makeObject requires a versioned DXN: ${dxn}`);
|
|
40
|
+
|
|
33
41
|
return <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(
|
|
34
42
|
self: Self & { fields?: Fields },
|
|
35
43
|
): EchoObjectSchema<Self, Fields> => {
|
|
@@ -52,6 +60,14 @@ export const EchoObjectSchema: {
|
|
|
52
60
|
}),
|
|
53
61
|
});
|
|
54
62
|
|
|
55
|
-
return makeEchoTypeSchema<Self, EntityKind.Object, Fields>(
|
|
63
|
+
return makeEchoTypeSchema<Self, EntityKind.Object, Fields>(
|
|
64
|
+
fields,
|
|
65
|
+
ast,
|
|
66
|
+
typename,
|
|
67
|
+
version,
|
|
68
|
+
EntityKind.Object,
|
|
69
|
+
() => toJsonSchema(Schema.make(ast)),
|
|
70
|
+
options?.id,
|
|
71
|
+
);
|
|
56
72
|
};
|
|
57
73
|
};
|
|
@@ -7,17 +7,20 @@ import * as SchemaAST from 'effect/SchemaAST';
|
|
|
7
7
|
|
|
8
8
|
import { raise } from '@dxos/debug';
|
|
9
9
|
import { assertArgument, invariant } from '@dxos/invariant';
|
|
10
|
-
import { DXN } from '@dxos/keys';
|
|
10
|
+
import { DXN, type EntityId } from '@dxos/keys';
|
|
11
11
|
|
|
12
|
+
// Type-only imports (erased at runtime — no import cycle); `internal` may depend
|
|
13
|
+
// on the top-level `Obj` / `Type` API at the type level only.
|
|
14
|
+
import type * as Obj from '../../Obj';
|
|
15
|
+
import type * as Type from '../../Type';
|
|
12
16
|
import {
|
|
13
17
|
type TypeAnnotation,
|
|
14
18
|
TypeAnnotationId,
|
|
15
|
-
type TypeMeta,
|
|
16
19
|
getEntityKind,
|
|
17
20
|
getSchemaTypename,
|
|
18
21
|
getTypeIdentifierAnnotation,
|
|
19
|
-
|
|
20
|
-
} from '../Annotation';
|
|
22
|
+
} from '../Annotation/annotations';
|
|
23
|
+
import { makeTypeJsonSchemaAnnotation } from '../Annotation/util';
|
|
21
24
|
import {
|
|
22
25
|
ATTR_RELATION_SOURCE,
|
|
23
26
|
ATTR_RELATION_TARGET,
|
|
@@ -26,6 +29,8 @@ import {
|
|
|
26
29
|
RelationSourceId,
|
|
27
30
|
RelationTargetDXNId,
|
|
28
31
|
RelationTargetId,
|
|
32
|
+
type UnknownTypeSchema,
|
|
33
|
+
getStaticTypeSchema,
|
|
29
34
|
} from '../common/types';
|
|
30
35
|
|
|
31
36
|
export {
|
|
@@ -37,6 +42,7 @@ export {
|
|
|
37
42
|
RelationTargetId,
|
|
38
43
|
};
|
|
39
44
|
|
|
45
|
+
import { toJsonSchema } from '../JsonSchema';
|
|
40
46
|
import { type EchoTypeSchema, makeEchoTypeSchema } from './entity';
|
|
41
47
|
|
|
42
48
|
/**
|
|
@@ -58,55 +64,75 @@ export type RelationSourceTargetRefs<Source = any, Target = any> = {
|
|
|
58
64
|
export type RelationSource<R> = R extends RelationSourceTargetRefs<infer Source, infer _Target> ? Source : never;
|
|
59
65
|
export type RelationTarget<R> = R extends RelationSourceTargetRefs<infer _Source, infer Target> ? Target : never;
|
|
60
66
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
67
|
+
/**
|
|
68
|
+
* Accepted relation endpoint: an object-kind `Type.Type` entity (slot-backed)
|
|
69
|
+
* or the branded `Obj.Unknown` schema. Source/target are constrained to these
|
|
70
|
+
* — relations only connect object-kind entities.
|
|
71
|
+
*/
|
|
72
|
+
export type RelationEndpoint = Type.AnyObj | UnknownTypeSchema<any, EntityKind.Object>;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Resolves a relation endpoint to the instance type it describes — the source /
|
|
76
|
+
* target instance recorded on the relation's `RelationSourceTargetRefs`.
|
|
77
|
+
*/
|
|
78
|
+
export type RelationEndpointInstance<S> =
|
|
79
|
+
S extends UnknownTypeSchema<infer A, any> ? A : S extends Type.AnyObj ? Type.InstanceType<S> : unknown;
|
|
80
|
+
|
|
81
|
+
export type EchoRelationSchemaOptions<TSource extends RelationEndpoint, TTarget extends RelationEndpoint> = {
|
|
82
|
+
dxn: DXN.DXN;
|
|
65
83
|
source: TSource;
|
|
66
84
|
target: TTarget;
|
|
85
|
+
/**
|
|
86
|
+
* Override the entity id stamped on the in-memory `Type.Type` value.
|
|
87
|
+
*
|
|
88
|
+
* Defaults to `EntityId.deterministic(typename, version)` — stable across processes
|
|
89
|
+
* and workerd-safe (no `crypto.getRandomValues()` at module-evaluation time).
|
|
90
|
+
*/
|
|
91
|
+
id?: EntityId;
|
|
67
92
|
};
|
|
68
93
|
|
|
69
94
|
/**
|
|
70
|
-
* Relation schema type with kind marker.
|
|
95
|
+
* Relation schema type with kind marker. `SourceInstance` / `TargetInstance`
|
|
96
|
+
* are the resolved endpoint instance types (see {@link RelationEndpointInstance}).
|
|
71
97
|
*/
|
|
72
98
|
export type EchoRelationSchema<
|
|
73
99
|
Self extends Schema.Schema.Any,
|
|
74
|
-
|
|
75
|
-
|
|
100
|
+
SourceInstance extends Obj.Unknown,
|
|
101
|
+
TargetInstance extends Obj.Unknown,
|
|
76
102
|
Fields extends Schema.Struct.Fields = Schema.Struct.Fields,
|
|
77
|
-
> = EchoTypeSchema<
|
|
78
|
-
Self,
|
|
79
|
-
RelationSourceTargetRefs<Schema.Schema.Type<Source>, Schema.Schema.Type<Target>>,
|
|
80
|
-
EntityKind.Relation,
|
|
81
|
-
Fields
|
|
82
|
-
>;
|
|
103
|
+
> = EchoTypeSchema<Self, RelationSourceTargetRefs<SourceInstance, TargetInstance>, EntityKind.Relation, Fields>;
|
|
83
104
|
|
|
84
105
|
/**
|
|
85
106
|
* Schema for Relation entity types.
|
|
86
107
|
*/
|
|
87
|
-
export const EchoRelationSchema = <
|
|
88
|
-
|
|
89
|
-
Target extends Schema.Schema.AnyNoContext,
|
|
90
|
-
>({
|
|
108
|
+
export const EchoRelationSchema = <Source extends RelationEndpoint, Target extends RelationEndpoint>({
|
|
109
|
+
dxn,
|
|
91
110
|
source,
|
|
92
111
|
target,
|
|
93
|
-
|
|
94
|
-
version,
|
|
112
|
+
id: explicitId,
|
|
95
113
|
}: EchoRelationSchemaOptions<Source, Target>) => {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
const
|
|
100
|
-
|
|
114
|
+
// `source` / `target` are `Type.Type` entities (slot-backed) or the branded
|
|
115
|
+
// `Obj.Unknown` schema (used directly); resolve each to its Effect Schema for
|
|
116
|
+
// the schema-side machinery (DXN ref + entity-kind checks).
|
|
117
|
+
const sourceSchema = source != null ? (getStaticTypeSchema(source) ?? source) : source;
|
|
118
|
+
const targetSchema = target != null ? (getStaticTypeSchema(target) ?? target) : target;
|
|
119
|
+
assertArgument(Schema.isSchema(sourceSchema), 'source');
|
|
120
|
+
assertArgument(Schema.isSchema(targetSchema), 'target');
|
|
121
|
+
const typename = DXN.getName(dxn);
|
|
122
|
+
const version = DXN.getVersion(dxn);
|
|
123
|
+
invariant(version, `Type.makeRelation requires a versioned DXN: ${dxn}`);
|
|
124
|
+
const sourceDXN = getDXNForRelationSchemaRef(sourceSchema);
|
|
125
|
+
const targetDXN = getDXNForRelationSchemaRef(targetSchema);
|
|
126
|
+
if (getEntityKind(sourceSchema) !== EntityKind.Object) {
|
|
101
127
|
raise(new Error('Source schema must be an echo object schema.'));
|
|
102
128
|
}
|
|
103
|
-
if (getEntityKind(
|
|
129
|
+
if (getEntityKind(targetSchema) !== EntityKind.Object) {
|
|
104
130
|
raise(new Error('Target schema must be an echo object schema.'));
|
|
105
131
|
}
|
|
106
132
|
|
|
107
133
|
return <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(
|
|
108
134
|
self: Self & { fields?: Fields },
|
|
109
|
-
): EchoRelationSchema<Self, Source
|
|
135
|
+
): EchoRelationSchema<Self, RelationEndpointInstance<Source>, RelationEndpointInstance<Target>, Fields> => {
|
|
110
136
|
invariant(SchemaAST.isTypeLiteral(self.ast), 'Schema must be a TypeLiteral.');
|
|
111
137
|
|
|
112
138
|
// Extract fields from the schema if available (Struct schemas have .fields).
|
|
@@ -134,15 +160,23 @@ export const EchoRelationSchema = <
|
|
|
134
160
|
}),
|
|
135
161
|
});
|
|
136
162
|
|
|
137
|
-
return makeEchoTypeSchema<Self, EntityKind.Relation, Fields>(
|
|
163
|
+
return makeEchoTypeSchema<Self, EntityKind.Relation, Fields>(
|
|
164
|
+
fields,
|
|
165
|
+
ast,
|
|
166
|
+
typename,
|
|
167
|
+
version,
|
|
168
|
+
EntityKind.Relation,
|
|
169
|
+
() => toJsonSchema(Schema.make(ast)),
|
|
170
|
+
explicitId,
|
|
171
|
+
);
|
|
138
172
|
};
|
|
139
173
|
};
|
|
140
174
|
|
|
141
|
-
const getDXNForRelationSchemaRef = (schema: Schema.Schema.Any):
|
|
175
|
+
export const getDXNForRelationSchemaRef = (schema: Schema.Schema.Any): DXN.DXN => {
|
|
142
176
|
assertArgument(Schema.isSchema(schema), 'schema');
|
|
143
177
|
const identifier = getTypeIdentifierAnnotation(schema);
|
|
144
178
|
if (identifier) {
|
|
145
|
-
return identifier;
|
|
179
|
+
return DXN.tryMake(identifier) ?? raise(new Error(`Invalid schema identifier: ${identifier}`));
|
|
146
180
|
}
|
|
147
181
|
|
|
148
182
|
const typename = getSchemaTypename(schema);
|
|
@@ -150,5 +184,5 @@ const getDXNForRelationSchemaRef = (schema: Schema.Schema.Any): string => {
|
|
|
150
184
|
throw new Error('Schema must have a typename');
|
|
151
185
|
}
|
|
152
186
|
|
|
153
|
-
return DXN.
|
|
187
|
+
return DXN.make(typename);
|
|
154
188
|
};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
import * as SchemaAST from 'effect/SchemaAST';
|
|
7
|
+
|
|
8
|
+
import { invariant } from '@dxos/invariant';
|
|
9
|
+
import { DXN } from '@dxos/keys';
|
|
10
|
+
|
|
11
|
+
import { type TypeAnnotation, TypeAnnotationId } from '../Annotation/annotations';
|
|
12
|
+
import { makeTypeJsonSchemaAnnotation } from '../Annotation/util';
|
|
13
|
+
import { EntityKind } from '../common/types';
|
|
14
|
+
import { toJsonSchema } from '../JsonSchema';
|
|
15
|
+
import { type EchoTypeOptions, type EchoTypeSchema, makeEchoTypeSchema } from './entity';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Type-kind schema marker — produced by {@link EchoTypeKindSchema}.
|
|
19
|
+
*
|
|
20
|
+
* Distinguishes meta-schemas (entities of `EntityKind.Type`, such as the
|
|
21
|
+
* built-in `Type.Type` TypeSchema) from object and relation types.
|
|
22
|
+
*/
|
|
23
|
+
export type EchoTypeKindSchema<
|
|
24
|
+
Self extends Schema.Schema.Any,
|
|
25
|
+
Fields extends Schema.Struct.Fields = Schema.Struct.Fields,
|
|
26
|
+
> = EchoTypeSchema<Self, {}, EntityKind.Type, Fields>;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Pipeable that brands a schema as a type-kind ECHO entity. Mirrors
|
|
30
|
+
* {@link EchoObjectSchema} / {@link EchoRelationSchema}, but stamps the
|
|
31
|
+
* resulting entity with `[SchemaKindId]: EntityKind.Type` and a matching
|
|
32
|
+
* `TypeAnnotation.kind = 'type'` so meta-schemas surface uniformly through
|
|
33
|
+
* `Type.isTypeKind`, `Filter.type`, etc.
|
|
34
|
+
*/
|
|
35
|
+
export const EchoTypeKindSchema: {
|
|
36
|
+
(
|
|
37
|
+
dxn: DXN.DXN,
|
|
38
|
+
options?: EchoTypeOptions,
|
|
39
|
+
): <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(
|
|
40
|
+
self: Self & { fields?: Fields },
|
|
41
|
+
) => EchoTypeKindSchema<Self, Fields>;
|
|
42
|
+
} = (dxn, options) => {
|
|
43
|
+
const typename = DXN.getName(dxn);
|
|
44
|
+
const version = DXN.getVersion(dxn);
|
|
45
|
+
invariant(version, `Type-kind schemas require a versioned DXN: ${dxn}`);
|
|
46
|
+
|
|
47
|
+
return <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(
|
|
48
|
+
self: Self & { fields?: Fields },
|
|
49
|
+
): EchoTypeKindSchema<Self, Fields> => {
|
|
50
|
+
invariant(SchemaAST.isTypeLiteral(self.ast), 'Schema must be a TypeLiteral.');
|
|
51
|
+
|
|
52
|
+
const fields = ((self as any).fields ?? {}) as Fields;
|
|
53
|
+
|
|
54
|
+
const schemaWithId = Schema.extend(self, Schema.Struct({ id: Schema.String }));
|
|
55
|
+
const ast = SchemaAST.annotations(schemaWithId.ast, {
|
|
56
|
+
...self.ast.annotations,
|
|
57
|
+
[TypeAnnotationId]: { kind: EntityKind.Type, typename, version } satisfies TypeAnnotation,
|
|
58
|
+
[SchemaAST.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
|
|
59
|
+
kind: EntityKind.Type,
|
|
60
|
+
typename,
|
|
61
|
+
version,
|
|
62
|
+
}),
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
return makeEchoTypeSchema<Self, EntityKind.Type, Fields>(
|
|
66
|
+
fields,
|
|
67
|
+
ast,
|
|
68
|
+
typename,
|
|
69
|
+
version,
|
|
70
|
+
EntityKind.Type,
|
|
71
|
+
() => toJsonSchema(Schema.make(ast)),
|
|
72
|
+
options?.id,
|
|
73
|
+
);
|
|
74
|
+
};
|
|
75
|
+
};
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
|
|
7
|
+
import { raise } from '@dxos/debug';
|
|
8
|
+
import { assertArgument } from '@dxos/invariant';
|
|
9
|
+
import { DXN, EID, URI } from '@dxos/keys';
|
|
10
|
+
|
|
11
|
+
import { getSchemaURI, getTypename } from '../Annotation/annotations';
|
|
12
|
+
import { type AnyEntity, InstancePhantomId, KindId, TypeId, getStaticTypeSchema } from '../common/types';
|
|
13
|
+
import { getUri as getUriFromEntity } from './api';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @param input schema, `Type.Type` entity, or a type URI (an `echo:` EID or a `dxn:` DXN).
|
|
17
|
+
* @return type identifier URI — see {@link getSchemaURI}. A URI is returned verbatim. For a
|
|
18
|
+
* `Type.Type` entity, the URI of the schema it declares, symmetric with what
|
|
19
|
+
* `Obj.make(typeEntity, ...)` stamps on `system.type`: a static declaration resolves to its
|
|
20
|
+
* typename DXN, a persisted entity to its local `echo:/<objectId>`.
|
|
21
|
+
*/
|
|
22
|
+
export const getTypeURIFromSpecifier = (input: Schema.Schema.All | AnyEntity | URI.URI): URI.URI => {
|
|
23
|
+
if (Schema.isSchema(input)) {
|
|
24
|
+
return getSchemaURI(input) ?? raise(new TypeError('Schema has no URI'));
|
|
25
|
+
}
|
|
26
|
+
if (typeof input === 'object' && input !== null && KindId in input) {
|
|
27
|
+
// `Type.Type` entity. Both in-memory and persisted forms expose the schema
|
|
28
|
+
// they declare via `StaticTypeSchemaSlot`, whose URI is exactly what
|
|
29
|
+
// `Obj.make` stamps on `system.type` — a static declaration carries
|
|
30
|
+
// `TypeAnnotation` (→ typename DXN), a persisted entity's rebuilt schema
|
|
31
|
+
// carries `TypeIdentifierAnnotation` (→ local `echo:/<objectId>`).
|
|
32
|
+
const schema = getStaticTypeSchema(input);
|
|
33
|
+
if (schema != null) {
|
|
34
|
+
// Static types carry TypeAnnotation → DXN; persisted db types carry
|
|
35
|
+
// TypeIdentifierAnnotation → echo EID. In-memory makeObjectFromJsonSchema
|
|
36
|
+
// entities have neither (plain JSON Schema), so fall through to the EID path.
|
|
37
|
+
const uri = getSchemaURI(schema);
|
|
38
|
+
if (uri != null) {
|
|
39
|
+
return uri;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return getUriFromEntity(input as AnyEntity);
|
|
43
|
+
}
|
|
44
|
+
// A string specifier is already a branded URI — an `echo:` EID or a `dxn:` DXN.
|
|
45
|
+
assertArgument(EID.isEID(input) || DXN.isDXN(input), 'input', 'expected a type URI (EID or DXN)');
|
|
46
|
+
return input;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Checks if the object is an instance of the schema.
|
|
51
|
+
* Only typename is compared, the schema version is ignored.
|
|
52
|
+
*
|
|
53
|
+
* The following cases are considered to mean that the object is an instance of the schema:
|
|
54
|
+
* - Object was created with this exact schema.
|
|
55
|
+
* - Object was created with a different version of this schema.
|
|
56
|
+
* - Object was created with a different schema (maybe dynamic) that has the same typename.
|
|
57
|
+
*/
|
|
58
|
+
// TODO(burdon): Can we use `Schema.is`?
|
|
59
|
+
export const isInstanceOf = <S>(
|
|
60
|
+
schemaOrType: S extends Schema.Schema.AnyNoContext ? S : Schema.Schema.AnyNoContext | AnyEntity,
|
|
61
|
+
object: any,
|
|
62
|
+
): object is S extends Schema.Schema.AnyNoContext
|
|
63
|
+
? Schema.Schema.Type<S>
|
|
64
|
+
: S extends { readonly [InstancePhantomId]?: infer A }
|
|
65
|
+
? A
|
|
66
|
+
: unknown => {
|
|
67
|
+
if (object == null) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const schemaURI = getTypeURIFromSpecifier(schemaOrType);
|
|
72
|
+
|
|
73
|
+
// `object` is arbitrary input — read TypeId directly (it may be missing on
|
|
74
|
+
// non-entities) rather than via `getTypeURI` which asserts the URI is set.
|
|
75
|
+
const type = (object as any)[TypeId];
|
|
76
|
+
if (URI.isURI(type) && type === schemaURI) {
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const typename = getTypename(object);
|
|
81
|
+
if (!typename) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (!DXN.isDXN(schemaURI)) {
|
|
86
|
+
// EID-based schema URI — no typename match possible.
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const parsed = DXN.tryMake(schemaURI);
|
|
91
|
+
return parsed != null && DXN.getName(parsed) === typename;
|
|
92
|
+
};
|
|
@@ -5,29 +5,29 @@
|
|
|
5
5
|
import * as Schema from 'effect/Schema';
|
|
6
6
|
|
|
7
7
|
import { assertArgument, invariant } from '@dxos/invariant';
|
|
8
|
-
import {
|
|
8
|
+
import { EID, EntityId } from '@dxos/keys';
|
|
9
9
|
import { assumeType } from '@dxos/util';
|
|
10
10
|
|
|
11
|
-
import { type InternalObjectProps,
|
|
11
|
+
import { type InternalObjectProps, SelfURIId } from './model';
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
|
-
* Returns
|
|
14
|
+
* Returns the EID of an object.
|
|
15
15
|
*
|
|
16
16
|
* @internal
|
|
17
17
|
*/
|
|
18
|
-
export const
|
|
18
|
+
export const getObjectEchoUri = (object: any): EID.EID | undefined => {
|
|
19
19
|
invariant(!Schema.isSchema(object), 'schema not allowed in this function');
|
|
20
20
|
assertArgument(typeof object === 'object' && object != null, 'object', 'expected object');
|
|
21
21
|
assumeType<InternalObjectProps>(object);
|
|
22
22
|
|
|
23
|
-
if (object[
|
|
24
|
-
invariant(object[
|
|
25
|
-
return object[
|
|
23
|
+
if (object[SelfURIId]) {
|
|
24
|
+
invariant(EID.isEID(object[SelfURIId]), 'Invalid object model: invalid self dxn');
|
|
25
|
+
return EID.parse(object[SelfURIId]);
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
if (!
|
|
28
|
+
if (!EntityId.isValid(object.id)) {
|
|
29
29
|
throw new TypeError('Object id is not valid.');
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
return
|
|
32
|
+
return EID.make({ entityId: object.id });
|
|
33
33
|
};
|
|
@@ -104,7 +104,6 @@ export const DateOnly = /* Schema.transformOrFail(Schema.String, SimpleDate, {
|
|
|
104
104
|
}) */ Schema.String.pipe(
|
|
105
105
|
FormatAnnotation.set(TypeFormat.Date),
|
|
106
106
|
Schema.annotations({
|
|
107
|
-
title: 'Date',
|
|
108
107
|
description: 'Valid date in ISO format',
|
|
109
108
|
}),
|
|
110
109
|
);
|
|
@@ -134,7 +133,6 @@ export const TimeOnly = /* Schema.transformOrFail(Schema.String, SimpleTime, {
|
|
|
134
133
|
}) */ Schema.String.pipe(
|
|
135
134
|
FormatAnnotation.set(TypeFormat.Time),
|
|
136
135
|
Schema.annotations({
|
|
137
|
-
title: 'Time',
|
|
138
136
|
description: 'Valid time in ISO format',
|
|
139
137
|
}),
|
|
140
138
|
);
|
|
@@ -179,7 +177,6 @@ export const DateTime = /* Schema.transformOrFail(Schema.String, SimpleDateTime,
|
|
|
179
177
|
}) */ Schema.String.pipe(
|
|
180
178
|
FormatAnnotation.set(TypeFormat.DateTime),
|
|
181
179
|
Schema.annotations({
|
|
182
|
-
title: 'DateTime',
|
|
183
180
|
description: 'Valid date and time in ISO format',
|
|
184
181
|
}),
|
|
185
182
|
);
|
|
@@ -191,7 +188,6 @@ export const DateTime = /* Schema.transformOrFail(Schema.String, SimpleDateTime,
|
|
|
191
188
|
export const Duration = Schema.String.pipe(
|
|
192
189
|
FormatAnnotation.set(TypeFormat.Duration),
|
|
193
190
|
Schema.annotations({
|
|
194
|
-
title: 'Duration',
|
|
195
191
|
description: 'Duration in ISO 8601 format',
|
|
196
192
|
[SchemaAST.ExamplesAnnotationId]: ['1h', '3D'],
|
|
197
193
|
}),
|
|
@@ -74,3 +74,24 @@ describe('formats', () => {
|
|
|
74
74
|
}
|
|
75
75
|
});
|
|
76
76
|
});
|
|
77
|
+
|
|
78
|
+
describe('GeoPoint', () => {
|
|
79
|
+
const decode = Schema.decodeUnknownSync(Format.GeoPoint);
|
|
80
|
+
|
|
81
|
+
test('rounds high-precision coordinates to 7 decimal places', ({ expect }) => {
|
|
82
|
+
// Live geocoders (e.g. Nominatim/OSRM) emit > 7 decimals; rounding keeps them valid GeoPoints.
|
|
83
|
+
expect(decode([-0.12776534, 51.50744561])).toEqual([-0.1277653, 51.5074456]);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test('passes through coordinates already within precision', ({ expect }) => {
|
|
87
|
+
expect(decode([2.3522, 48.8566])).toEqual([2.3522, 48.8566]);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test('preserves an optional altitude', ({ expect }) => {
|
|
91
|
+
expect(decode([-0.12776534, 51.50744561, 42])).toEqual([-0.1277653, 51.5074456, 42]);
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
test('clamps out-of-range coordinates', ({ expect }) => {
|
|
95
|
+
expect(decode([200, 100])).toEqual([180, 90]);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
export
|
|
5
|
+
export * from './date';
|
|
6
|
+
export * from './format';
|
|
6
7
|
export { CurrencyAnnotationId, DecimalPrecision, Currency } from './number';
|
|
7
8
|
export { GeoPoint, GeoLocation } from './object';
|
|
8
|
-
|
|
9
|
-
export * from './format';
|
|
10
9
|
export * from './select';
|
|
11
10
|
export * from './string';
|
|
12
11
|
export * from './types';
|