@dxos/echo 0.8.4-main.fd6878d → 0.8.4-staging.60fe92afc8
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 +10 -11
- package/dist/lib/neutral/Annotation.mjs +68 -0
- package/dist/lib/neutral/Database.mjs +38 -0
- package/dist/lib/neutral/Entity.mjs +72 -0
- package/dist/lib/neutral/Entity.mjs.map +7 -0
- package/dist/lib/neutral/Err.mjs +12 -0
- package/dist/lib/neutral/Err.mjs.map +7 -0
- package/dist/lib/neutral/Feed.mjs +54 -0
- package/dist/lib/neutral/Feed.mjs.map +7 -0
- package/dist/lib/neutral/Filter.mjs +70 -0
- package/dist/lib/neutral/Filter.mjs.map +7 -0
- package/dist/lib/neutral/Format.mjs +86 -0
- package/dist/lib/neutral/Format.mjs.map +7 -0
- package/dist/lib/neutral/JsonSchema.mjs +18 -0
- package/dist/lib/neutral/JsonSchema.mjs.map +7 -0
- package/dist/lib/neutral/Key.mjs +16 -0
- package/dist/lib/neutral/Key.mjs.map +7 -0
- package/dist/lib/neutral/Migration.mjs +18 -0
- package/dist/lib/neutral/Migration.mjs.map +7 -0
- package/dist/lib/neutral/Obj.mjs +122 -0
- package/dist/lib/neutral/Obj.mjs.map +7 -0
- package/dist/lib/neutral/Order.mjs +16 -0
- package/dist/lib/neutral/Order.mjs.map +7 -0
- package/dist/lib/neutral/Query.mjs +38 -0
- package/dist/lib/neutral/Query.mjs.map +7 -0
- package/dist/lib/neutral/QueryResult.mjs +2 -0
- package/dist/lib/neutral/QueryResult.mjs.map +7 -0
- package/dist/lib/neutral/Ref.mjs +25 -0
- package/dist/lib/neutral/Ref.mjs.map +7 -0
- package/dist/lib/neutral/Registry.mjs +14 -0
- package/dist/lib/neutral/Registry.mjs.map +7 -0
- package/dist/lib/neutral/Relation.mjs +97 -0
- package/dist/lib/neutral/Relation.mjs.map +7 -0
- package/dist/lib/neutral/Scope.mjs +12 -0
- package/dist/lib/neutral/Scope.mjs.map +7 -0
- package/dist/lib/neutral/Tag.mjs +32 -0
- package/dist/lib/neutral/Tag.mjs.map +7 -0
- package/dist/lib/neutral/Type.mjs +65 -0
- package/dist/lib/neutral/Type.mjs.map +7 -0
- package/dist/lib/neutral/chunk-35INCYOE.mjs +7 -0
- 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-5SUJPHAE.mjs +34 -0
- package/dist/lib/neutral/chunk-5SUJPHAE.mjs.map +7 -0
- package/dist/lib/neutral/chunk-6M2Z6WBH.mjs +93 -0
- package/dist/lib/neutral/chunk-6M2Z6WBH.mjs.map +7 -0
- package/dist/lib/neutral/chunk-6YDI3J37.mjs +346 -0
- package/dist/lib/neutral/chunk-6YDI3J37.mjs.map +7 -0
- package/dist/lib/neutral/chunk-7FPIAJIV.mjs +2279 -0
- package/dist/lib/neutral/chunk-7FPIAJIV.mjs.map +7 -0
- package/dist/lib/neutral/chunk-7LOUAPYZ.mjs +25 -0
- package/dist/lib/neutral/chunk-7LOUAPYZ.mjs.map +7 -0
- package/dist/lib/neutral/chunk-7PI7C4EF.mjs +747 -0
- package/dist/lib/neutral/chunk-7PI7C4EF.mjs.map +7 -0
- package/dist/lib/neutral/chunk-BBFJWWAV.mjs +51 -0
- package/dist/lib/neutral/chunk-BBFJWWAV.mjs.map +7 -0
- package/dist/lib/neutral/chunk-EVK6XBXO.mjs +56 -0
- package/dist/lib/neutral/chunk-EVK6XBXO.mjs.map +7 -0
- package/dist/lib/neutral/chunk-IGK6FN65.mjs +27 -0
- package/dist/lib/neutral/chunk-IGK6FN65.mjs.map +7 -0
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
- package/dist/lib/neutral/chunk-LWXVKPPW.mjs +281 -0
- package/dist/lib/neutral/chunk-LWXVKPPW.mjs.map +7 -0
- package/dist/lib/neutral/chunk-MZ7K3MLL.mjs +48 -0
- package/dist/lib/neutral/chunk-MZ7K3MLL.mjs.map +7 -0
- package/dist/lib/neutral/chunk-O6BH7EPN.mjs +94 -0
- package/dist/lib/neutral/chunk-O6BH7EPN.mjs.map +7 -0
- package/dist/lib/neutral/chunk-QQIYS74I.mjs +336 -0
- 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-RIVWNMSF.mjs +41 -0
- package/dist/lib/neutral/chunk-RIVWNMSF.mjs.map +7 -0
- package/dist/lib/neutral/chunk-SBVFRTST.mjs +160 -0
- 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-TFEWTY5A.mjs +428 -0
- package/dist/lib/neutral/chunk-TFEWTY5A.mjs.map +7 -0
- package/dist/lib/neutral/chunk-TYGKCRMK.mjs +437 -0
- package/dist/lib/neutral/chunk-TYGKCRMK.mjs.map +7 -0
- package/dist/lib/neutral/chunk-UUP46KUQ.mjs +205 -0
- 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-WTQJHC75.mjs +395 -0
- 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-ZGNNFYHS.mjs +132 -0
- package/dist/lib/neutral/chunk-ZGNNFYHS.mjs.map +7 -0
- package/dist/lib/neutral/index.mjs +111 -0
- package/dist/lib/neutral/index.mjs.map +7 -0
- package/dist/lib/neutral/internal/index.mjs +539 -0
- package/dist/lib/neutral/internal/index.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/lib/neutral/testing/index.mjs +458 -0
- package/dist/lib/neutral/testing/index.mjs.map +7 -0
- package/dist/types/src/Annotation.d.ts +128 -0
- package/dist/types/src/Annotation.d.ts.map +1 -0
- 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 +15 -0
- package/dist/types/src/Collection.d.ts.map +1 -0
- package/dist/types/src/Database.d.ts +208 -0
- package/dist/types/src/Database.d.ts.map +1 -0
- package/dist/types/src/Dataset.d.ts +29 -0
- package/dist/types/src/Dataset.d.ts.map +1 -0
- package/dist/types/src/Entity.d.ts +247 -0
- package/dist/types/src/Entity.d.ts.map +1 -0
- package/dist/types/src/Entity.test.d.ts +2 -0
- package/dist/types/src/Entity.test.d.ts.map +1 -0
- package/dist/types/src/Err.d.ts +107 -0
- package/dist/types/src/Err.d.ts.map +1 -0
- package/dist/types/src/Feed.d.ts +229 -0
- package/dist/types/src/Feed.d.ts.map +1 -0
- package/dist/types/src/Filter.d.ts +175 -0
- package/dist/types/src/Filter.d.ts.map +1 -0
- package/dist/types/src/Filter.test.d.ts +2 -0
- package/dist/types/src/Filter.test.d.ts.map +1 -0
- package/dist/types/src/Format.d.ts +2 -0
- package/dist/types/src/Format.d.ts.map +1 -0
- package/dist/types/src/Hypergraph.d.ts +70 -0
- package/dist/types/src/Hypergraph.d.ts.map +1 -0
- 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 +16 -0
- package/dist/types/src/JsonSchema.d.ts.map +1 -0
- package/dist/types/src/Key.d.ts +2 -1
- package/dist/types/src/Key.d.ts.map +1 -1
- package/dist/types/src/Migration.d.ts +72 -0
- package/dist/types/src/Migration.d.ts.map +1 -0
- package/dist/types/src/Obj.d.ts +514 -53
- package/dist/types/src/Obj.d.ts.map +1 -1
- package/dist/types/src/Obj.test.d.ts +2 -0
- package/dist/types/src/Obj.test.d.ts.map +1 -0
- package/dist/types/src/Order.d.ts +26 -0
- package/dist/types/src/Order.d.ts.map +1 -0
- package/dist/types/src/Query.d.ts +231 -0
- package/dist/types/src/Query.d.ts.map +1 -0
- package/dist/types/src/Query.test.d.ts +2 -0
- package/dist/types/src/Query.test.d.ts.map +1 -0
- package/dist/types/src/QueryResult.d.ts +101 -0
- package/dist/types/src/QueryResult.d.ts.map +1 -0
- package/dist/types/src/Ref.d.ts +69 -11
- 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 +323 -24
- package/dist/types/src/Relation.d.ts.map +1 -1
- package/dist/types/src/Relation.test.d.ts +2 -0
- package/dist/types/src/Relation.test.d.ts.map +1 -0
- 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 +34 -0
- package/dist/types/src/Tag.d.ts.map +1 -0
- package/dist/types/src/Type.d.ts +397 -107
- package/dist/types/src/Type.d.ts.map +1 -1
- package/dist/types/src/Type.test.d.ts +2 -0
- package/dist/types/src/Type.test.d.ts.map +1 -0
- package/dist/types/src/View.d.ts +65 -0
- package/dist/types/src/View.d.ts.map +1 -0
- 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/hierarchy.test.d.ts +2 -0
- package/dist/types/src/hierarchy.test.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +22 -3
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/internal/Annotation/annotations.d.ts +272 -0
- package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -0
- package/dist/types/src/internal/Annotation/annotations.test.d.ts +2 -0
- package/dist/types/src/internal/Annotation/annotations.test.d.ts.map +1 -0
- 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 +6 -0
- package/dist/types/src/internal/Annotation/index.d.ts.map +1 -0
- package/dist/types/src/internal/Annotation/sorting.d.ts +24 -0
- package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -0
- package/dist/types/src/internal/Annotation/util.d.ts +48 -0
- package/dist/types/src/internal/Annotation/util.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/api.d.ts +27 -0
- package/dist/types/src/internal/Entity/api.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/entity.d.ts +84 -0
- package/dist/types/src/internal/Entity/entity.d.ts.map +1 -0
- 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 +10 -0
- package/dist/types/src/internal/Entity/index.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/model.d.ts +59 -0
- package/dist/types/src/internal/Entity/model.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/object.d.ts +18 -0
- package/dist/types/src/internal/Entity/object.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/relation.d.ts +58 -0
- package/dist/types/src/internal/Entity/relation.d.ts.map +1 -0
- 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/util.d.ts +2 -0
- package/dist/types/src/internal/Entity/util.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/version.d.ts +42 -0
- package/dist/types/src/internal/Entity/version.d.ts.map +1 -0
- package/dist/types/src/internal/Format/date.d.ts +63 -0
- package/dist/types/src/internal/Format/date.d.ts.map +1 -0
- package/dist/types/src/internal/Format/date.test.d.ts +2 -0
- package/dist/types/src/internal/Format/date.test.d.ts.map +1 -0
- package/dist/types/src/internal/Format/format.d.ts +33 -0
- package/dist/types/src/internal/Format/format.d.ts.map +1 -0
- package/dist/types/src/internal/Format/format.test.d.ts +2 -0
- package/dist/types/src/internal/Format/format.test.d.ts.map +1 -0
- package/dist/types/src/internal/Format/index.d.ts +8 -0
- package/dist/types/src/internal/Format/index.d.ts.map +1 -0
- package/dist/types/src/internal/Format/number.d.ts +31 -0
- package/dist/types/src/internal/Format/number.d.ts.map +1 -0
- package/dist/types/src/internal/Format/object.d.ts +37 -0
- package/dist/types/src/internal/Format/object.d.ts.map +1 -0
- package/dist/types/src/internal/Format/select.d.ts +13 -0
- package/dist/types/src/internal/Format/select.d.ts.map +1 -0
- package/dist/types/src/internal/Format/string.d.ts +42 -0
- package/dist/types/src/internal/Format/string.d.ts.map +1 -0
- package/dist/types/src/internal/Format/types.d.ts +72 -0
- package/dist/types/src/internal/Format/types.d.ts.map +1 -0
- package/dist/types/src/internal/JsonSchema/annotations.d.ts +19 -0
- package/dist/types/src/internal/JsonSchema/annotations.d.ts.map +1 -0
- package/dist/types/src/internal/JsonSchema/effect-schema.test.d.ts +2 -0
- package/dist/types/src/internal/JsonSchema/effect-schema.test.d.ts.map +1 -0
- package/dist/types/src/internal/JsonSchema/index.d.ts +5 -0
- package/dist/types/src/internal/JsonSchema/index.d.ts.map +1 -0
- package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts +7 -0
- package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -0
- package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts +351 -0
- package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -0
- package/dist/types/src/internal/JsonSchema/json-schema.d.ts +31 -0
- package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -0
- package/dist/types/src/internal/JsonSchema/json-schema.test.d.ts +2 -0
- package/dist/types/src/internal/JsonSchema/json-schema.test.d.ts.map +1 -0
- 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 +8 -0
- package/dist/types/src/internal/Obj/clone.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/common.d.ts +18 -0
- package/dist/types/src/internal/Obj/common.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/create-object.d.ts +39 -0
- package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/create-object.test.d.ts +2 -0
- package/dist/types/src/internal/Obj/create-object.test.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/deleted.d.ts +6 -0
- package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/index.d.ts +11 -0
- package/dist/types/src/internal/Obj/index.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/inspect.d.ts +2 -0
- package/dist/types/src/internal/Obj/inspect.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/json-serializer.d.ts +45 -0
- package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/json-serializer.test.d.ts +2 -0
- package/dist/types/src/internal/Obj/json-serializer.test.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/schema-validator.d.ts +2 -0
- package/dist/types/src/internal/Obj/schema-validator.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/schema-validator.test.d.ts +2 -0
- package/dist/types/src/internal/Obj/schema-validator.test.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/set-value.d.ts +7 -0
- package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/set-value.test.d.ts +2 -0
- package/dist/types/src/internal/Obj/set-value.test.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/snapshot.d.ts +6 -0
- package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/typed-object.d.ts +25 -0
- package/dist/types/src/internal/Obj/typed-object.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/typed-object.test.d.ts +2 -0
- package/dist/types/src/internal/Obj/typed-object.test.d.ts.map +1 -0
- 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/pretty.d.ts +10 -0
- 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/index.d.ts +3 -0
- package/dist/types/src/internal/Ref/index.d.ts.map +1 -0
- package/dist/types/src/internal/Ref/ref-array.d.ts +21 -0
- package/dist/types/src/internal/Ref/ref-array.d.ts.map +1 -0
- package/dist/types/src/internal/Ref/ref.d.ts +262 -0
- package/dist/types/src/internal/Ref/ref.d.ts.map +1 -0
- package/dist/types/src/internal/Ref/ref.test.d.ts +2 -0
- package/dist/types/src/internal/Ref/ref.test.d.ts.map +1 -0
- 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 +7 -0
- package/dist/types/src/internal/Type/compose.d.ts.map +1 -0
- package/dist/types/src/internal/Type/compose.test.d.ts +2 -0
- package/dist/types/src/internal/Type/compose.test.d.ts.map +1 -0
- package/dist/types/src/internal/Type/index.d.ts +3 -0
- package/dist/types/src/internal/Type/index.d.ts.map +1 -0
- package/dist/types/src/internal/Type/manipulation.d.ts +9 -0
- package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -0
- 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/index.d.ts +11 -0
- package/dist/types/src/internal/common/api/index.d.ts.map +1 -0
- package/dist/types/src/internal/common/api/meta.d.ts +45 -0
- package/dist/types/src/internal/common/api/meta.d.ts.map +1 -0
- package/dist/types/src/internal/common/index.d.ts +4 -0
- package/dist/types/src/internal/common/index.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/change-context.d.ts +55 -0
- package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/change.test.d.ts +2 -0
- package/dist/types/src/internal/common/proxy/change.test.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts +5 -0
- package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/errors.d.ts +19 -0
- package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/event-batch.d.ts +10 -0
- package/dist/types/src/internal/common/proxy/event-batch.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/handler.test.d.ts +2 -0
- package/dist/types/src/internal/common/proxy/handler.test.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/index.d.ts +14 -0
- package/dist/types/src/internal/common/proxy/index.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/json-serializer.d.ts +6 -0
- package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/make-object.d.ts +20 -0
- package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/ownership.d.ts +57 -0
- package/dist/types/src/internal/common/proxy/ownership.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/proxy-types.d.ts +18 -0
- package/dist/types/src/internal/common/proxy/proxy-types.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/proxy-utils.d.ts +47 -0
- package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/reactive-array.d.ts +8 -0
- package/dist/types/src/internal/common/proxy/reactive-array.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/reactive.d.ts +39 -0
- package/dist/types/src/internal/common/proxy/reactive.d.ts.map +1 -0
- 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 +15 -0
- package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/schema.test.d.ts +2 -0
- package/dist/types/src/internal/common/proxy/schema.test.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/symbols.d.ts +3 -0
- package/dist/types/src/internal/common/proxy/symbols.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/typed-handler.d.ts +64 -0
- package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/typed-handler.test.d.ts +2 -0
- package/dist/types/src/internal/common/proxy/typed-handler.test.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/typed-object.test.d.ts +2 -0
- package/dist/types/src/internal/common/proxy/typed-object.test.d.ts.map +1 -0
- package/dist/types/src/internal/common/types/base.d.ts +27 -0
- package/dist/types/src/internal/common/types/base.d.ts.map +1 -0
- package/dist/types/src/internal/common/types/entity.d.ts +94 -0
- package/dist/types/src/internal/common/types/entity.d.ts.map +1 -0
- package/dist/types/src/internal/common/types/index.d.ts +7 -0
- package/dist/types/src/internal/common/types/index.d.ts.map +1 -0
- package/dist/types/src/internal/common/types/meta.d.ts +54 -0
- package/dist/types/src/internal/common/types/meta.d.ts.map +1 -0
- package/dist/types/src/internal/common/types/model-symbols.d.ts +65 -0
- package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -0
- package/dist/types/src/internal/common/types/typename.d.ts +28 -0
- package/dist/types/src/internal/common/types/typename.d.ts.map +1 -0
- package/dist/types/src/internal/common/types/version.d.ts +15 -0
- package/dist/types/src/internal/common/types/version.d.ts.map +1 -0
- 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 +11 -0
- package/dist/types/src/internal/index.d.ts.map +1 -0
- package/dist/types/src/{test → testing}/api.test.d.ts.map +1 -1
- package/dist/types/src/testing/index.d.ts +4 -1
- 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 +18 -0
- package/dist/types/src/testing/test-data.d.ts.map +1 -0
- package/dist/types/src/testing/test-schema.d.ts +298 -0
- package/dist/types/src/testing/test-schema.d.ts.map +1 -0
- package/dist/types/src/testing/util.d.ts +23 -0
- package/dist/types/src/testing/util.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +122 -57
- package/src/Annotation.test.ts +439 -0
- package/src/Annotation.ts +202 -0
- package/src/Collection.ts +33 -0
- package/src/Database.ts +345 -0
- package/src/Dataset.ts +34 -0
- package/src/Entity.test.ts +132 -0
- package/src/Entity.ts +345 -0
- package/src/Err.ts +40 -0
- package/src/Feed.ts +352 -0
- package/src/Filter.test.ts +90 -0
- package/src/Filter.ts +484 -0
- package/src/Format.ts +5 -0
- package/src/Hypergraph.ts +84 -0
- package/src/Json.test.ts +175 -0
- package/src/Json.ts +103 -0
- package/src/JsonSchema.ts +26 -0
- package/src/Key.ts +4 -1
- package/src/Migration.ts +114 -0
- package/src/Obj.test.ts +641 -0
- package/src/Obj.ts +836 -105
- package/src/Order.ts +68 -0
- package/src/Query.test.ts +835 -0
- package/src/Query.ts +634 -0
- package/src/QueryResult.ts +132 -0
- package/src/Ref.ts +97 -10
- package/src/Registry.ts +155 -0
- package/src/Relation.test.ts +88 -0
- package/src/Relation.ts +508 -61
- package/src/Scope.ts +50 -0
- package/src/Tag.md +88 -0
- package/src/Tag.ts +84 -0
- package/src/Type.test.ts +257 -0
- package/src/Type.ts +643 -152
- package/src/View.ts +98 -0
- package/src/exemplars.test.ts +21 -0
- package/src/hierarchy.test.ts +33 -0
- package/src/index.ts +24 -4
- package/src/internal/Annotation/annotations.test.ts +165 -0
- package/src/internal/Annotation/annotations.ts +609 -0
- package/src/internal/Annotation/dictionary.ts +47 -0
- package/src/internal/Annotation/entity-dictionary.ts +74 -0
- package/src/internal/Annotation/index.ts +9 -0
- package/src/internal/Annotation/sorting.ts +51 -0
- package/src/internal/Annotation/util.ts +94 -0
- package/src/internal/Entity/api.ts +77 -0
- package/src/internal/Entity/entity.ts +277 -0
- package/src/internal/Entity/guard.ts +26 -0
- package/src/internal/Entity/index.ts +13 -0
- package/src/internal/Entity/model.ts +119 -0
- package/src/internal/Entity/object.ts +73 -0
- package/src/internal/Entity/relation.ts +188 -0
- package/src/internal/Entity/type-kind.ts +75 -0
- package/src/internal/Entity/type-uri.ts +92 -0
- package/src/internal/Entity/util.ts +33 -0
- package/src/internal/Entity/version.ts +96 -0
- package/src/internal/Format/date.test.ts +55 -0
- package/src/internal/Format/date.ts +213 -0
- package/src/internal/Format/format.test.ts +97 -0
- package/src/internal/Format/format.ts +54 -0
- package/src/internal/Format/index.ts +11 -0
- package/src/internal/Format/number.ts +89 -0
- package/src/internal/Format/object.ts +97 -0
- package/src/internal/Format/select.ts +18 -0
- package/src/internal/Format/string.ts +81 -0
- package/src/internal/Format/types.ts +186 -0
- package/src/internal/JsonSchema/annotations.ts +50 -0
- package/src/internal/JsonSchema/effect-schema.test.ts +143 -0
- package/src/internal/JsonSchema/index.ts +8 -0
- package/src/internal/JsonSchema/json-schema-normalize.ts +111 -0
- package/src/internal/JsonSchema/json-schema-type.ts +403 -0
- package/src/internal/JsonSchema/json-schema.test.ts +786 -0
- package/src/internal/JsonSchema/json-schema.ts +547 -0
- package/src/internal/Obj/atoms.ts +244 -0
- package/src/internal/Obj/clone.ts +53 -0
- package/src/internal/Obj/common.ts +75 -0
- package/src/internal/Obj/create-object.test.ts +116 -0
- package/src/internal/Obj/create-object.ts +140 -0
- package/src/internal/Obj/deleted.ts +19 -0
- package/src/internal/Obj/index.ts +14 -0
- package/src/internal/Obj/inspect.ts +48 -0
- package/src/internal/Obj/json-serializer.test.ts +199 -0
- package/src/internal/Obj/json-serializer.ts +278 -0
- package/src/internal/Obj/schema-validator.test.ts +182 -0
- package/src/internal/Obj/schema-validator.ts +6 -0
- package/src/internal/Obj/set-value.test.ts +258 -0
- package/src/internal/Obj/set-value.ts +158 -0
- package/src/internal/Obj/snapshot.ts +114 -0
- package/src/internal/Obj/typed-object.test.ts +32 -0
- package/src/internal/Obj/typed-object.ts +30 -0
- package/src/{query → internal/Query}/index.ts +1 -1
- package/src/internal/Query/pretty.ts +162 -0
- package/src/internal/Ref/atoms.ts +20 -0
- package/src/internal/Ref/index.ts +6 -0
- package/src/internal/Ref/ref-array.ts +38 -0
- package/src/internal/Ref/ref.test.ts +91 -0
- package/src/internal/Ref/ref.ts +650 -0
- package/src/internal/Ref/utils.ts +45 -0
- package/src/internal/Type/compose.test.ts +43 -0
- package/src/internal/Type/compose.ts +41 -0
- package/src/internal/Type/index.ts +6 -0
- package/src/internal/Type/manipulation.ts +67 -0
- package/src/internal/Type/type-schema.ts +60 -0
- package/src/internal/common/README.md +102 -0
- package/src/internal/common/api/index.ts +15 -0
- package/src/internal/common/api/meta.ts +90 -0
- package/src/internal/common/index.ts +7 -0
- package/src/internal/common/proxy/change-context.ts +138 -0
- package/src/internal/common/proxy/change.test.ts +527 -0
- package/src/internal/common/proxy/define-hidden-property.ts +14 -0
- package/src/internal/common/proxy/errors.ts +42 -0
- package/src/internal/common/proxy/event-batch.ts +44 -0
- package/src/internal/common/proxy/handler.test.ts +121 -0
- package/src/internal/common/proxy/index.ts +17 -0
- package/src/internal/common/proxy/json-serializer.ts +101 -0
- package/src/internal/common/proxy/make-object.ts +129 -0
- package/src/internal/common/proxy/ownership.ts +252 -0
- package/src/internal/common/proxy/proxy-types.ts +23 -0
- package/src/internal/common/proxy/proxy-utils.ts +150 -0
- package/src/internal/common/proxy/reactive-array.ts +71 -0
- package/src/internal/common/proxy/reactive.test.ts +54 -0
- package/src/internal/common/proxy/reactive.ts +77 -0
- package/src/internal/common/proxy/schema-validator.ts +244 -0
- package/src/internal/common/proxy/schema.test.ts +107 -0
- package/src/internal/common/proxy/symbols.ts +7 -0
- package/src/internal/common/proxy/typed-handler.test.ts +314 -0
- package/src/internal/common/proxy/typed-handler.ts +509 -0
- package/src/internal/common/proxy/typed-object.test.ts +103 -0
- package/src/internal/common/types/base.ts +43 -0
- package/src/internal/common/types/entity.ts +133 -0
- package/src/internal/common/types/index.ts +15 -0
- package/src/internal/common/types/meta.ts +109 -0
- package/src/internal/common/types/model-symbols.ts +89 -0
- package/src/internal/common/types/typename.ts +91 -0
- package/src/internal/common/types/version.ts +19 -0
- package/src/internal/common/types/well-known-types.ts +15 -0
- package/src/internal/index.ts +19 -0
- package/src/testing/api.test.ts +131 -0
- package/src/testing/index.ts +4 -1
- package/src/testing/registry.ts +44 -0
- package/src/testing/test-data.ts +189 -0
- package/src/testing/test-schema.ts +204 -0
- package/src/testing/util.ts +88 -0
- package/dist/lib/browser/chunk-NLPBTYZV.mjs +0 -647
- package/dist/lib/browser/chunk-NLPBTYZV.mjs.map +0 -7
- package/dist/lib/browser/index.mjs +0 -22
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/browser/testing/index.mjs +0 -70
- package/dist/lib/browser/testing/index.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-BQZZRMFX.mjs +0 -647
- package/dist/lib/node-esm/chunk-BQZZRMFX.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -22
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/testing/index.mjs +0 -70
- package/dist/lib/node-esm/testing/index.mjs.map +0 -7
- package/dist/types/src/experimental/database.d.ts +0 -8
- package/dist/types/src/experimental/database.d.ts.map +0 -1
- package/dist/types/src/experimental/index.d.ts +0 -1
- package/dist/types/src/experimental/index.d.ts.map +0 -1
- package/dist/types/src/experimental/queue.d.ts +0 -8
- package/dist/types/src/experimental/queue.d.ts.map +0 -1
- package/dist/types/src/experimental/space.d.ts +0 -8
- package/dist/types/src/experimental/space.d.ts.map +0 -1
- package/dist/types/src/query/dsl.d.ts +0 -218
- package/dist/types/src/query/dsl.d.ts.map +0 -1
- package/dist/types/src/query/dsl.test.d.ts +0 -2
- package/dist/types/src/query/dsl.test.d.ts.map +0 -1
- package/dist/types/src/query/index.d.ts +0 -2
- package/dist/types/src/query/index.d.ts.map +0 -1
- package/dist/types/src/testing/types.d.ts +0 -113
- package/dist/types/src/testing/types.d.ts.map +0 -1
- package/src/experimental/database.ts +0 -11
- package/src/experimental/index.ts +0 -7
- package/src/experimental/queue.ts +0 -11
- package/src/experimental/space.ts +0 -11
- package/src/query/dsl.test.ts +0 -324
- package/src/query/dsl.ts +0 -646
- package/src/test/api.test.ts +0 -173
- package/src/testing/types.ts +0 -91
- /package/dist/lib/{browser/index.mjs.map → neutral/Annotation.mjs.map} +0 -0
- /package/dist/lib/{node-esm/index.mjs.map → neutral/Database.mjs.map} +0 -0
- /package/dist/types/src/{test → testing}/api.test.d.ts +0 -0
|
@@ -0,0 +1,650 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import type * as Atom from '@effect-atom/atom/Atom';
|
|
6
|
+
import * as Effect from 'effect/Effect';
|
|
7
|
+
import * as Equal from 'effect/Equal';
|
|
8
|
+
import * as Hash from 'effect/Hash';
|
|
9
|
+
import * as Option from 'effect/Option';
|
|
10
|
+
import * as ParseResult from 'effect/ParseResult';
|
|
11
|
+
import * as Pipeable from 'effect/Pipeable';
|
|
12
|
+
import * as Schema from 'effect/Schema';
|
|
13
|
+
import * as SchemaAST from 'effect/SchemaAST';
|
|
14
|
+
import type * as Types from 'effect/Types';
|
|
15
|
+
|
|
16
|
+
import { Event } from '@dxos/async';
|
|
17
|
+
import { type CustomInspectFunction, inspectCustom } from '@dxos/debug';
|
|
18
|
+
import { EncodedReference } from '@dxos/echo-protocol';
|
|
19
|
+
import { assertArgument, invariant } from '@dxos/invariant';
|
|
20
|
+
import { DXN, EID, EntityId, type URI } from '@dxos/keys';
|
|
21
|
+
|
|
22
|
+
import * as Database from '../../Database';
|
|
23
|
+
import type * as Type from '../../Type';
|
|
24
|
+
import {
|
|
25
|
+
ReferenceAnnotationId,
|
|
26
|
+
getSchemaURI,
|
|
27
|
+
getTypeAnnotation,
|
|
28
|
+
getTypeIdentifierAnnotation,
|
|
29
|
+
} from '../Annotation/annotations';
|
|
30
|
+
import { type AnyEntity, type AnyProperties, type UnknownTypeSchema, getStaticTypeSchema } from '../common/types';
|
|
31
|
+
import { type JsonSchemaType } from '../JsonSchema';
|
|
32
|
+
import * as RefAtoms from './atoms';
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* The `$id` and `$ref` fields for an ECHO reference schema.
|
|
36
|
+
*/
|
|
37
|
+
export const JSON_SCHEMA_ECHO_REF_ID = '/schemas/echo/ref';
|
|
38
|
+
|
|
39
|
+
export const getSchemaReference = (property: JsonSchemaType): { typename: string } | undefined => {
|
|
40
|
+
const { $id, reference: { schema: { $ref } = {} } = {} } = property;
|
|
41
|
+
if ($id === JSON_SCHEMA_ECHO_REF_ID && $ref) {
|
|
42
|
+
const parsed = DXN.tryMake($ref);
|
|
43
|
+
const typename = parsed ? DXN.getName(parsed) : undefined;
|
|
44
|
+
return typename ? { typename } : undefined;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export const createSchemaReference = (typename: string): Types.DeepMutable<JsonSchemaType> => {
|
|
49
|
+
return {
|
|
50
|
+
$id: JSON_SCHEMA_ECHO_REF_ID,
|
|
51
|
+
reference: {
|
|
52
|
+
schema: {
|
|
53
|
+
$ref: DXN.make(typename),
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Runtime type-info for a reference extracted from effect AST.
|
|
61
|
+
*/
|
|
62
|
+
export type RefereneAST = {
|
|
63
|
+
/**
|
|
64
|
+
* Typename of linked schema.
|
|
65
|
+
*/
|
|
66
|
+
typename: string;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Version of linked schema.
|
|
70
|
+
*/
|
|
71
|
+
version: string;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export const getReferenceAst = (ast: SchemaAST.AST): RefereneAST | undefined => {
|
|
75
|
+
if (ast._tag !== 'Declaration' || !ast.annotations[ReferenceAnnotationId]) {
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
typename: (ast.annotations[ReferenceAnnotationId] as any).typename,
|
|
80
|
+
version: (ast.annotations[ReferenceAnnotationId] as any).version,
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
export const RefTypeId: unique symbol = Symbol('@dxos/echo/internal/Ref');
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Reference Schema.
|
|
88
|
+
*/
|
|
89
|
+
export interface RefSchema<T extends AnyEntity> extends Schema.SchemaClass<Ref<T>, EncodedReference> {}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Type of the `Ref` function and extra methods attached to it.
|
|
93
|
+
*/
|
|
94
|
+
export interface RefFn {
|
|
95
|
+
// A reference target is a `Type.AnyEntity` entity (the canonical Option B
|
|
96
|
+
// input) or one of the well-known "any object" / "any relation" branded
|
|
97
|
+
// schemas (`Obj.Unknown` / `Relation.Unknown`). Arbitrary raw schemas are
|
|
98
|
+
// rejected.
|
|
99
|
+
//
|
|
100
|
+
// Referencing a type-kind entity (a meta-schema, e.g. `Type.Type`) yields a
|
|
101
|
+
// reference to a stored schema record; its loaded target is any registered
|
|
102
|
+
// entity (`Type.AnyEntity`), since a stored object/relation schema is itself a
|
|
103
|
+
// `Type.Type` record. Referencing an object/relation type yields a reference
|
|
104
|
+
// to an instance of that type.
|
|
105
|
+
<S extends Type.AnyEntity | UnknownTypeSchema<any, any> = Type.AnyEntity>(
|
|
106
|
+
schema: S,
|
|
107
|
+
): RefSchema<
|
|
108
|
+
S extends Type.AnyType
|
|
109
|
+
? Type.AnyEntity
|
|
110
|
+
: S extends Type.AnyObj | Type.AnyRelation
|
|
111
|
+
? Type.InstanceType<S>
|
|
112
|
+
: S extends UnknownTypeSchema<infer A, any>
|
|
113
|
+
? A
|
|
114
|
+
: never
|
|
115
|
+
>;
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* @returns True if the object is a reference.
|
|
119
|
+
*/
|
|
120
|
+
isRef: (obj: unknown) => obj is Ref<any>;
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* @returns True if the reference points to the given object id.
|
|
124
|
+
*/
|
|
125
|
+
hasEntityId: (id: EntityId) => (ref: Ref<any>) => boolean;
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* @returns True if the schema is a reference schema.
|
|
129
|
+
*/
|
|
130
|
+
isRefSchema: (schema: Schema.Schema<any, any>) => schema is RefSchema<any>;
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* @returns True if the schema AST is a reference schema.
|
|
134
|
+
*/
|
|
135
|
+
isRefSchemaAST: (ast: SchemaAST.AST) => boolean;
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Constructs a reference that points to the given object.
|
|
139
|
+
*/
|
|
140
|
+
// TODO(burdon): Narrow to Obj.Unknown?
|
|
141
|
+
make: <T extends AnyEntity>(object: T) => Ref<T>;
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Constructs a reference that points to the object specified by the provided URI
|
|
145
|
+
* (either an `echo:` EID for an object reference or a `dxn:` DXN for a type reference).
|
|
146
|
+
*/
|
|
147
|
+
fromURI: (uri: URI.URI) => Ref<any>;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Schema builder for references.
|
|
152
|
+
*/
|
|
153
|
+
export const Ref: RefFn = (input: any): RefSchema<any> => {
|
|
154
|
+
// `Type.Type` entities carry their source schema on the hidden slot; the
|
|
155
|
+
// branded `Obj.Unknown` / `Relation.Unknown` schemas are used directly.
|
|
156
|
+
const schema = getStaticTypeSchema(input) ?? input;
|
|
157
|
+
assertArgument(Schema.isSchema(schema), 'schema', 'Must call with an instance of effect-schema');
|
|
158
|
+
const annotation = getTypeAnnotation(schema);
|
|
159
|
+
if (annotation == null) {
|
|
160
|
+
throw new Error('Reference target must be an ECHO schema.');
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return createEchoReferenceSchema(getTypeIdentifierAnnotation(schema), annotation.typename, annotation.version);
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Represents materialized reference to a target.
|
|
168
|
+
* This is the data type for the fields marked as ref.
|
|
169
|
+
*/
|
|
170
|
+
export interface Ref<T> extends Pipeable.Pipeable {
|
|
171
|
+
/**
|
|
172
|
+
* Target URI (either an `echo:` EID for an object reference or a `dxn:` DXN for a type reference).
|
|
173
|
+
*/
|
|
174
|
+
get uri(): URI.URI;
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Returns true if the reference has a target available (inlined or resolver set).
|
|
178
|
+
*/
|
|
179
|
+
get isAvailable(): boolean;
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* @returns The reference target.
|
|
183
|
+
* May return `undefined` if the object is not loaded in the working set.
|
|
184
|
+
* Accessing this property, even if it returns `undefined` will trigger the object to be loaded to the working set.
|
|
185
|
+
*/
|
|
186
|
+
get target(): T | undefined;
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* @returns Promise that will resolves with the target object.
|
|
190
|
+
* Will load the object from disk if it is not present in the working set.
|
|
191
|
+
* @throws If the object is not available locally.
|
|
192
|
+
*/
|
|
193
|
+
load(): Promise<T>;
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* @returns Promise that will resolves with the target object or undefined if the object is not loaded locally.
|
|
197
|
+
*/
|
|
198
|
+
|
|
199
|
+
tryLoad(): Promise<T | undefined>;
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Subscribe to the ref's resolution event.
|
|
203
|
+
* The callback fires when the target object becomes available in the working set
|
|
204
|
+
* (e.g. when its document is loaded after sibling-client mutation).
|
|
205
|
+
* Note: the resolver only schedules a notification when the target is requested
|
|
206
|
+
* via {@link target} while it is not yet loaded.
|
|
207
|
+
* @returns Function that unsubscribes the callback.
|
|
208
|
+
*/
|
|
209
|
+
onResolved(callback: () => void): () => void;
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Do not inline the target object in the reference.
|
|
213
|
+
* Makes .target unavailable unless the reference is connected to a database context.
|
|
214
|
+
*
|
|
215
|
+
* When serialized with toJSON, the difference is between:
|
|
216
|
+
* `{ "/": "dxn:..." }`
|
|
217
|
+
* and
|
|
218
|
+
* `{ "/": "dxn:...", "target": { ... } }`
|
|
219
|
+
*
|
|
220
|
+
* Clones the reference object.
|
|
221
|
+
*/
|
|
222
|
+
noInline(): Ref<T>;
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Read-only atom for the ref target.
|
|
226
|
+
* Resolves once when the target loads; does NOT subscribe to target object mutations.
|
|
227
|
+
* Use `Obj.atom(ref)` if you need reactive snapshots that update on every object mutation.
|
|
228
|
+
*/
|
|
229
|
+
get atom(): Atom.Atom<T | undefined>;
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Serializes the reference to a JSON object.
|
|
233
|
+
* The serialization format is compatible with the IPLD-style encoded references.
|
|
234
|
+
* When a reference has a saved target (i.e. the target or object holding the reference is not in the database),
|
|
235
|
+
* the target is included in the serialized object.
|
|
236
|
+
*
|
|
237
|
+
* Examples:
|
|
238
|
+
* `{ "/": "dxn:..." }`
|
|
239
|
+
* `{ "/": "dxn:...", "target": { ... } }`
|
|
240
|
+
*/
|
|
241
|
+
encode(): EncodedReference;
|
|
242
|
+
|
|
243
|
+
[RefTypeId]: {
|
|
244
|
+
_T: T;
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
export declare namespace Ref {
|
|
249
|
+
/**
|
|
250
|
+
* Target of the reference.
|
|
251
|
+
*/
|
|
252
|
+
export type Target<R> = R extends Ref<infer U> ? U : never;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
Ref.isRef = (obj: any): obj is Ref<any> => {
|
|
256
|
+
return obj && typeof obj === 'object' && RefTypeId in obj;
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
Ref.hasEntityId = (id: EntityId) => (ref: Ref<any>) => {
|
|
260
|
+
const uri = EID.tryParse(ref.uri);
|
|
261
|
+
return uri !== undefined && EID.isLocal(uri) && EID.getEntityId(uri) === id;
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
Ref.isRefSchema = (schema: Schema.Schema<any, any>): schema is RefSchema<any> => {
|
|
265
|
+
return Ref.isRefSchemaAST(schema.ast);
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
Ref.isRefSchemaAST = (ast: SchemaAST.AST): boolean => {
|
|
269
|
+
return SchemaAST.getAnnotation(ast, ReferenceAnnotationId).pipe(Option.isSome);
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
Ref.make = <T extends AnyProperties>(obj: T): Ref<T> => {
|
|
273
|
+
if (typeof obj !== 'object' || obj === null) {
|
|
274
|
+
throw new TypeError('Expected: ECHO object.');
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// TODO(dmaretskyi): Extract to `getObjectEchoUri` function.
|
|
278
|
+
const id = obj.id;
|
|
279
|
+
invariant(EntityId.isValid(id), 'Invalid object ID');
|
|
280
|
+
const uri = EID.make({ entityId: id });
|
|
281
|
+
return new RefImpl(uri, obj);
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
Ref.fromURI = (uri: URI.URI): Ref<any> => {
|
|
285
|
+
assertArgument(typeof uri === 'string', 'uri', 'Expected URI string');
|
|
286
|
+
return new RefImpl(uri);
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* `reference` field on the schema object.
|
|
291
|
+
*/
|
|
292
|
+
export type JsonSchemaReferenceInfo = {
|
|
293
|
+
schema: { $ref: string };
|
|
294
|
+
schemaVersion?: string;
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* @internal
|
|
299
|
+
*/
|
|
300
|
+
// TODO(burdon): Move to json schema and make private?
|
|
301
|
+
export const createEchoReferenceSchema = (
|
|
302
|
+
echoUri: string | undefined,
|
|
303
|
+
typename: string | undefined,
|
|
304
|
+
version: string | undefined,
|
|
305
|
+
): Schema.SchemaClass<Ref<any>, EncodedReference> => {
|
|
306
|
+
if (!echoUri && !typename) {
|
|
307
|
+
throw new TypeError('Either echoUri or typename must be provided.');
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
const referenceInfo: JsonSchemaReferenceInfo = {
|
|
311
|
+
schema: {
|
|
312
|
+
// TODO(dmaretskyi): Include version?
|
|
313
|
+
$ref: echoUri ?? DXN.make(typename!),
|
|
314
|
+
},
|
|
315
|
+
schemaVersion: version,
|
|
316
|
+
};
|
|
317
|
+
|
|
318
|
+
// TODO(dmaretskyi): Add name and description.
|
|
319
|
+
const refSchema = Schema.declare<Ref<any>, EncodedReference, []>(
|
|
320
|
+
[],
|
|
321
|
+
{
|
|
322
|
+
encode: () => {
|
|
323
|
+
return (value) =>
|
|
324
|
+
Effect.gen(function* () {
|
|
325
|
+
if (Ref.isRef(value)) {
|
|
326
|
+
return EncodedReference.fromURI((value as Ref<any>).uri);
|
|
327
|
+
} else if (EncodedReference.isEncodedReference(value)) {
|
|
328
|
+
return value;
|
|
329
|
+
}
|
|
330
|
+
throw new Error('Invalid reference');
|
|
331
|
+
});
|
|
332
|
+
},
|
|
333
|
+
decode: () => {
|
|
334
|
+
return (value) =>
|
|
335
|
+
Effect.gen(function* () {
|
|
336
|
+
const dbService = yield* Effect.serviceOption(Database.Service);
|
|
337
|
+
|
|
338
|
+
// TODO(dmaretskyi): This branch seems to be taken by Schema.is
|
|
339
|
+
if (Ref.isRef(value)) {
|
|
340
|
+
if (Option.isSome(dbService)) {
|
|
341
|
+
return dbService.value.db.makeRef(value.uri);
|
|
342
|
+
} else {
|
|
343
|
+
return value;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
if (!EncodedReference.isEncodedReference(value)) {
|
|
348
|
+
return yield* Effect.fail(new ParseResult.Unexpected(value, 'reference'));
|
|
349
|
+
}
|
|
350
|
+
if (Option.isSome(dbService)) {
|
|
351
|
+
return dbService.value.db.makeRef(EncodedReference.toURI(value));
|
|
352
|
+
} else {
|
|
353
|
+
return Ref.fromURI(EncodedReference.toURI(value));
|
|
354
|
+
}
|
|
355
|
+
});
|
|
356
|
+
},
|
|
357
|
+
},
|
|
358
|
+
{
|
|
359
|
+
jsonSchema: {
|
|
360
|
+
// TODO(dmaretskyi): We should remove `$id` and keep `$ref` with a fully qualified name.
|
|
361
|
+
$id: JSON_SCHEMA_ECHO_REF_ID,
|
|
362
|
+
$ref: JSON_SCHEMA_ECHO_REF_ID,
|
|
363
|
+
reference: referenceInfo,
|
|
364
|
+
},
|
|
365
|
+
[ReferenceAnnotationId]: {
|
|
366
|
+
typename: typename ?? '',
|
|
367
|
+
version,
|
|
368
|
+
},
|
|
369
|
+
},
|
|
370
|
+
);
|
|
371
|
+
|
|
372
|
+
return refSchema;
|
|
373
|
+
};
|
|
374
|
+
|
|
375
|
+
const getSchemaExpectedName = (ast: SchemaAST.Annotated): string | undefined => {
|
|
376
|
+
return SchemaAST.getIdentifierAnnotation(ast).pipe(
|
|
377
|
+
Option.orElse(() => SchemaAST.getTitleAnnotation(ast)),
|
|
378
|
+
Option.orElse(() => SchemaAST.getDescriptionAnnotation(ast)),
|
|
379
|
+
Option.getOrElse(() => undefined),
|
|
380
|
+
);
|
|
381
|
+
};
|
|
382
|
+
|
|
383
|
+
export interface RefResolver {
|
|
384
|
+
/**
|
|
385
|
+
* Resolve ref synchronously from the objects in the working set.
|
|
386
|
+
*
|
|
387
|
+
* @param uri
|
|
388
|
+
* @param load If true the resolver should attempt to load the object from disk.
|
|
389
|
+
* @param onLoad Callback to call when the object is loaded.
|
|
390
|
+
*/
|
|
391
|
+
resolveSync(uri: URI.URI, load: boolean, onLoad?: () => void): AnyProperties | undefined;
|
|
392
|
+
|
|
393
|
+
/**
|
|
394
|
+
* Resolver ref asynchronously.
|
|
395
|
+
*/
|
|
396
|
+
resolve(uri: URI.URI): Promise<AnyProperties | undefined>;
|
|
397
|
+
|
|
398
|
+
// TODO(dmaretskyi): Combine with `resolve`.
|
|
399
|
+
resolveSchema(uri: URI.URI): Promise<Schema.Schema.AnyNoContext | undefined>;
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* Resolve the source `Type.AnyEntity` entity for a type URI. Used by
|
|
403
|
+
* deserialization paths (`Obj.fromJSON`) to set the back-reference accessed
|
|
404
|
+
* via `Obj.getType` / `Entity.getType`. Optional — resolvers that only
|
|
405
|
+
* carry raw schemas may leave this unimplemented; the deserializer falls
|
|
406
|
+
* back to leaving the type entity unset.
|
|
407
|
+
*/
|
|
408
|
+
resolveType?(uri: URI.URI): Promise<unknown | undefined>;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
export class RefImpl<T> implements Ref<T> {
|
|
412
|
+
#uri: URI.URI;
|
|
413
|
+
#resolver?: RefResolver = undefined;
|
|
414
|
+
#resolved = new Event<void>();
|
|
415
|
+
|
|
416
|
+
/**
|
|
417
|
+
* Target is set when the reference is created from a specific object.
|
|
418
|
+
* In this case, the target might not be in the database.
|
|
419
|
+
*/
|
|
420
|
+
#target: T | undefined = undefined;
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
* Callback to issue a reactive notification when object is resolved.
|
|
424
|
+
*/
|
|
425
|
+
#resolverCallback = () => {
|
|
426
|
+
this.#resolved.emit();
|
|
427
|
+
};
|
|
428
|
+
|
|
429
|
+
constructor(uri: URI.URI, target?: T) {
|
|
430
|
+
this.#uri = uri;
|
|
431
|
+
this.#target = target;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/**
|
|
435
|
+
* @inheritdoc
|
|
436
|
+
*/
|
|
437
|
+
get uri(): URI.URI {
|
|
438
|
+
return this.#uri;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
/**
|
|
442
|
+
* @inheritdoc
|
|
443
|
+
*/
|
|
444
|
+
get isAvailable(): boolean {
|
|
445
|
+
return this.#target !== undefined || this.#resolver !== undefined;
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
/**
|
|
449
|
+
* @inheritdoc
|
|
450
|
+
*/
|
|
451
|
+
get target(): T | undefined {
|
|
452
|
+
if (this.#target) {
|
|
453
|
+
return this.#target;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
invariant(this.#resolver, 'Resolver is not set');
|
|
457
|
+
return this.#resolver.resolveSync(this.#uri, true, this.#resolverCallback) as T | undefined;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
/**
|
|
461
|
+
* @inheritdoc
|
|
462
|
+
*/
|
|
463
|
+
async load(): Promise<T> {
|
|
464
|
+
if (this.#target) {
|
|
465
|
+
return this.#target;
|
|
466
|
+
}
|
|
467
|
+
invariant(this.#resolver, 'Resolver is not set');
|
|
468
|
+
const obj = await this.#resolver.resolve(this.#uri);
|
|
469
|
+
if (obj == null) {
|
|
470
|
+
throw new Error('Object not found');
|
|
471
|
+
}
|
|
472
|
+
return obj as T;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
/**
|
|
476
|
+
* @inheritdoc
|
|
477
|
+
*/
|
|
478
|
+
async tryLoad(): Promise<T | undefined> {
|
|
479
|
+
if (this.#target) {
|
|
480
|
+
return this.#target;
|
|
481
|
+
}
|
|
482
|
+
invariant(this.#resolver, 'Resolver is not set');
|
|
483
|
+
return (await this.#resolver.resolve(this.#uri)) as T | undefined;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* @inheritdoc
|
|
488
|
+
*/
|
|
489
|
+
onResolved(callback: () => void): () => void {
|
|
490
|
+
return this.#resolved.on(callback);
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
/**
|
|
494
|
+
* Do not inline the target object in the reference.
|
|
495
|
+
* Makes .target unavailable unless the reference is connected to a database context.
|
|
496
|
+
* Clones the reference object.
|
|
497
|
+
*/
|
|
498
|
+
noInline(): RefImpl<T> {
|
|
499
|
+
const ref = new RefImpl<T>(this.#uri, undefined);
|
|
500
|
+
ref.#resolver = this.#resolver;
|
|
501
|
+
return ref;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
encode(): EncodedReference {
|
|
505
|
+
return {
|
|
506
|
+
'/': this.#uri,
|
|
507
|
+
...(this.#target ? { target: this.#target } : {}),
|
|
508
|
+
};
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
/**
|
|
512
|
+
* Serializes the reference to a JSON object.
|
|
513
|
+
* The serialization format is compatible with the IPLD-style encoded references.
|
|
514
|
+
* When a reference has a saved target (i.e. the target or object holding the reference is not in the database),
|
|
515
|
+
* the target is included in the serialized object.
|
|
516
|
+
*/
|
|
517
|
+
toJSON(): EncodedReference {
|
|
518
|
+
return this.encode();
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
toString(): string {
|
|
522
|
+
if (this.#target) {
|
|
523
|
+
return `Ref(${this.#target.toString()})`;
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
return `Ref(${this.#uri.toString()})`;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
[inspectCustom]: CustomInspectFunction = (depth, options, inspect) => {
|
|
530
|
+
return this.toString();
|
|
531
|
+
};
|
|
532
|
+
|
|
533
|
+
[RefTypeId] = refVariance;
|
|
534
|
+
|
|
535
|
+
/**
|
|
536
|
+
* Effect Hash trait. Required for MutableHashMap-based caches (e.g., Atom.family)
|
|
537
|
+
* to deduplicate Ref instances that point to the same object.
|
|
538
|
+
* ECHO proxies return new RefImpl instances on every property access,
|
|
539
|
+
* so without this, each access would create a separate cache entry.
|
|
540
|
+
*/
|
|
541
|
+
[Hash.symbol](): number {
|
|
542
|
+
return Hash.hash(this.#uri.toString());
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
/** Effect Equal trait. See {@link Hash.symbol} for rationale. */
|
|
546
|
+
[Equal.symbol](that: Equal.Equal): boolean {
|
|
547
|
+
return that instanceof RefImpl && this.#uri === that.uri;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
get atom(): Atom.Atom<T | undefined> {
|
|
551
|
+
return RefAtoms.refSimpleFamily(this);
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
/**
|
|
555
|
+
* Internal method to set the resolver.
|
|
556
|
+
*
|
|
557
|
+
* @internal
|
|
558
|
+
*/
|
|
559
|
+
_setResolver(resolver: RefResolver): void {
|
|
560
|
+
this.#resolver = resolver;
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
/**
|
|
564
|
+
* @internal
|
|
565
|
+
*/
|
|
566
|
+
_getSavedTarget(): T | undefined {
|
|
567
|
+
return this.#target;
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
pipe() {
|
|
571
|
+
// eslint-disable-next-line prefer-rest-params
|
|
572
|
+
return Pipeable.pipeArguments(this, arguments);
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
/**
|
|
577
|
+
* Internal API for setting the reference resolver.
|
|
578
|
+
*/
|
|
579
|
+
export const setRefResolver = (ref: Ref<any>, resolver: RefResolver) => {
|
|
580
|
+
invariant(ref instanceof RefImpl, 'Ref is not an instance of RefImpl');
|
|
581
|
+
ref._setResolver(resolver);
|
|
582
|
+
};
|
|
583
|
+
|
|
584
|
+
/**
|
|
585
|
+
* Internal API for getting the saved target on a reference.
|
|
586
|
+
*/
|
|
587
|
+
export const getRefSavedTarget = (ref: Ref<any>): AnyProperties | undefined => {
|
|
588
|
+
invariant(ref instanceof RefImpl, 'Ref is not an instance of RefImpl');
|
|
589
|
+
return ref._getSavedTarget();
|
|
590
|
+
};
|
|
591
|
+
|
|
592
|
+
// Used to validate reference target type.
|
|
593
|
+
const refVariance: Ref<any>[typeof RefTypeId] = {
|
|
594
|
+
_T: null as any,
|
|
595
|
+
};
|
|
596
|
+
|
|
597
|
+
export const refFromEncodedReference = (encodedReference: EncodedReference, resolver?: RefResolver): Ref<any> => {
|
|
598
|
+
const uri = EncodedReference.toURI(encodedReference);
|
|
599
|
+
const ref = new RefImpl(uri);
|
|
600
|
+
|
|
601
|
+
// TODO(dmaretskyi): Handle inline target in the encoded reference.
|
|
602
|
+
|
|
603
|
+
if (resolver) {
|
|
604
|
+
setRefResolver(ref, resolver);
|
|
605
|
+
}
|
|
606
|
+
return ref;
|
|
607
|
+
};
|
|
608
|
+
|
|
609
|
+
export class StaticRefResolver implements RefResolver {
|
|
610
|
+
public objects = new Map<EntityId, AnyProperties>();
|
|
611
|
+
public schemas = new Map<URI.URI, Schema.Schema.AnyNoContext>();
|
|
612
|
+
|
|
613
|
+
addObject(obj: AnyProperties): this {
|
|
614
|
+
this.objects.set(obj.id, obj);
|
|
615
|
+
return this;
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
addSchema(input: Type.AnyEntity): this {
|
|
619
|
+
const schema = getStaticTypeSchema(input);
|
|
620
|
+
invariant(schema, 'Type entity is missing its source schema');
|
|
621
|
+
const uri = getSchemaURI(schema);
|
|
622
|
+
invariant(uri, 'Schema has no URI');
|
|
623
|
+
this.schemas.set(uri, schema);
|
|
624
|
+
return this;
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
resolveSync(uri: URI.URI, _load: boolean, _onLoad?: () => void): AnyProperties | undefined {
|
|
628
|
+
const echoUri = EID.tryParse(uri);
|
|
629
|
+
const id = echoUri ? EID.getEntityId(echoUri) : undefined;
|
|
630
|
+
if (id == null) {
|
|
631
|
+
return undefined;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
return this.objects.get(id);
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
async resolve(uri: URI.URI): Promise<AnyProperties | undefined> {
|
|
638
|
+
const echoUri = EID.tryParse(uri);
|
|
639
|
+
const id = echoUri ? EID.getEntityId(echoUri) : undefined;
|
|
640
|
+
if (id == null) {
|
|
641
|
+
return undefined;
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
return this.objects.get(id);
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
async resolveSchema(uri: URI.URI): Promise<Schema.Schema.AnyNoContext | undefined> {
|
|
648
|
+
return this.schemas.get(uri);
|
|
649
|
+
}
|
|
650
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import type * as Atom from '@effect-atom/atom/Atom';
|
|
6
|
+
|
|
7
|
+
import type { Ref } from './ref';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Internal helper for loading ref targets in atoms.
|
|
11
|
+
* Handles the common pattern of checking for loaded target and triggering async load.
|
|
12
|
+
*/
|
|
13
|
+
export const loadRefTarget = <T, R>(
|
|
14
|
+
ref: Ref<T>,
|
|
15
|
+
get: Atom.Context,
|
|
16
|
+
onTargetAvailable: (target: T) => R,
|
|
17
|
+
): R | undefined => {
|
|
18
|
+
// Accessing `ref.target` registers a resolution callback when the target is
|
|
19
|
+
// not yet loaded, so resolution can be observed via `ref.onResolved` below.
|
|
20
|
+
const currentTarget = ref.target;
|
|
21
|
+
if (currentTarget) {
|
|
22
|
+
return onTargetAvailable(currentTarget);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Subscribe to the ref's resolution event in case the target loads later.
|
|
26
|
+
const unsubscribe = ref.onResolved(() => {
|
|
27
|
+
const target = ref.target;
|
|
28
|
+
if (target) {
|
|
29
|
+
get.setSelf(onTargetAvailable(target));
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
get.addFinalizer(unsubscribe);
|
|
33
|
+
|
|
34
|
+
// Also try async load (e.g. for objects that need disk loading).
|
|
35
|
+
void ref
|
|
36
|
+
.load()
|
|
37
|
+
.then((loadedTarget) => {
|
|
38
|
+
get.setSelf(onTargetAvailable(loadedTarget));
|
|
39
|
+
})
|
|
40
|
+
.catch(() => {
|
|
41
|
+
// Loading failed; the resolution subscription above will pick up cross-client updates.
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
return undefined;
|
|
45
|
+
};
|