@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,244 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Atom from '@effect-atom/atom/Atom';
|
|
6
|
+
import * as Result from '@effect-atom/atom/Result';
|
|
7
|
+
import * as Effect from 'effect/Effect';
|
|
8
|
+
import * as Function from 'effect/Function';
|
|
9
|
+
import * as Option from 'effect/Option';
|
|
10
|
+
|
|
11
|
+
import { assertArgument } from '@dxos/invariant';
|
|
12
|
+
|
|
13
|
+
import type * as Entity from '../../Entity';
|
|
14
|
+
import type * as Obj from '../../Obj';
|
|
15
|
+
import type * as Ref from '../../Ref';
|
|
16
|
+
import type * as Relation from '../../Relation';
|
|
17
|
+
import { subscribe } from '../common/proxy/reactive';
|
|
18
|
+
import { isEntity, getDatabase } from '../Entity';
|
|
19
|
+
import { RefTypeId } from '../Ref/ref';
|
|
20
|
+
import { loadRefTarget } from '../Ref/utils';
|
|
21
|
+
import { getSnapshot } from './snapshot';
|
|
22
|
+
|
|
23
|
+
const isRef = (obj: unknown): obj is Ref.Ref<any> =>
|
|
24
|
+
obj != null && typeof obj === 'object' && RefTypeId in (obj as object);
|
|
25
|
+
|
|
26
|
+
const getReactiveOption = <T extends Obj.Unknown>(snapshot: Obj.Snapshot<T>): Effect.Effect<Option.Option<T>, never> =>
|
|
27
|
+
Effect.gen(function* () {
|
|
28
|
+
const db = getDatabase(snapshot as any);
|
|
29
|
+
if (!db) {
|
|
30
|
+
return Option.none();
|
|
31
|
+
}
|
|
32
|
+
const obj = db.getObjectById((snapshot as any).id);
|
|
33
|
+
return obj ? Option.some(obj as T) : Option.none();
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Atom family for ECHO objects.
|
|
38
|
+
* Uses object reference as key — same object returns same atom.
|
|
39
|
+
*/
|
|
40
|
+
const objectFamily = Atom.family(<T extends Obj.Unknown>(obj: T): Atom.Atom<Obj.Snapshot<T>> => {
|
|
41
|
+
return Atom.make<Obj.Snapshot<T>>((get) => {
|
|
42
|
+
const unsubscribe = subscribe(obj, () => {
|
|
43
|
+
// getSnapshot adds SnapshotKindId brand at runtime; cast bridges static types.
|
|
44
|
+
get.setSelf(getSnapshot(obj) as unknown as Obj.Snapshot<T>);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
get.addFinalizer(() => unsubscribe());
|
|
48
|
+
|
|
49
|
+
return getSnapshot(obj) as unknown as Obj.Snapshot<T>;
|
|
50
|
+
}).pipe(Atom.keepAlive);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Atom family for ECHO refs (snapshot version).
|
|
55
|
+
* Uses ref as key — same ref returns same atom.
|
|
56
|
+
* Subscribes to target object changes after loading.
|
|
57
|
+
*/
|
|
58
|
+
const refFamily = Atom.family(<T extends Obj.Unknown>(ref: Ref.Ref<T>): Atom.Atom<Obj.Snapshot<T> | undefined> => {
|
|
59
|
+
return Atom.make<Obj.Snapshot<T> | undefined>((get) => {
|
|
60
|
+
let unsubscribeTarget: (() => void) | undefined;
|
|
61
|
+
|
|
62
|
+
const setupTargetSubscription = (target: T): Obj.Snapshot<T> => {
|
|
63
|
+
unsubscribeTarget?.();
|
|
64
|
+
unsubscribeTarget = subscribe(target, () => {
|
|
65
|
+
// getSnapshot adds SnapshotKindId brand at runtime; cast bridges static types.
|
|
66
|
+
get.setSelf(getSnapshot(target) as unknown as Obj.Snapshot<T>);
|
|
67
|
+
});
|
|
68
|
+
return getSnapshot(target) as unknown as Obj.Snapshot<T>;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
get.addFinalizer(() => {
|
|
72
|
+
unsubscribeTarget?.();
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
return loadRefTarget(ref, get, setupTargetSubscription);
|
|
76
|
+
}).pipe(Atom.keepAlive);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Snapshot a value to create a new reference for comparison and React dependency tracking.
|
|
81
|
+
*/
|
|
82
|
+
const snapshotForComparison = <V>(value: V): V => {
|
|
83
|
+
if (Array.isArray(value)) {
|
|
84
|
+
return [...value] as V;
|
|
85
|
+
}
|
|
86
|
+
if (value !== null && typeof value === 'object') {
|
|
87
|
+
return { ...value } as V;
|
|
88
|
+
}
|
|
89
|
+
return value;
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Atom family for ECHO object properties.
|
|
94
|
+
* Uses nested families: outer keyed by object, inner keyed by property key.
|
|
95
|
+
*/
|
|
96
|
+
const propertyFamily = Atom.family(<T extends Obj.Unknown>(obj: T) =>
|
|
97
|
+
Atom.family(<K extends keyof T>(key: K): Atom.Atom<T[K]> => {
|
|
98
|
+
return Atom.make<T[K]>((get) => {
|
|
99
|
+
let previousSnapshot = snapshotForComparison(obj[key]);
|
|
100
|
+
|
|
101
|
+
const unsubscribe2 = subscribe(obj, () => {
|
|
102
|
+
const newValue = obj[key];
|
|
103
|
+
const newSnapshot = snapshotForComparison(newValue);
|
|
104
|
+
if (newSnapshot !== previousSnapshot) {
|
|
105
|
+
previousSnapshot = newSnapshot;
|
|
106
|
+
get.setSelf(newSnapshot);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
get.addFinalizer(() => unsubscribe2());
|
|
111
|
+
|
|
112
|
+
return snapshotForComparison(obj[key]);
|
|
113
|
+
}).pipe(Atom.keepAlive);
|
|
114
|
+
}),
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Atom family for ECHO objects — returns the live object, not a snapshot.
|
|
119
|
+
*/
|
|
120
|
+
const objectWithReactiveFamily = Atom.family(<T extends Obj.Unknown>(obj: T): Atom.Atom<T> => {
|
|
121
|
+
return Atom.make<T>((get) => {
|
|
122
|
+
const unsubscribe = subscribe(obj, () => {
|
|
123
|
+
get.setSelf(obj);
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
get.addFinalizer(() => unsubscribe());
|
|
127
|
+
|
|
128
|
+
return obj;
|
|
129
|
+
}).pipe(Atom.keepAlive);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Atom family for ECHO refs — returns the live reactive object, not a snapshot.
|
|
134
|
+
*/
|
|
135
|
+
const refWithReactiveFamily = Atom.family(<T extends Obj.Unknown>(ref: Ref.Ref<T>): Atom.Atom<T | undefined> => {
|
|
136
|
+
const effect = (get: Atom.Context) =>
|
|
137
|
+
Effect.gen(function* () {
|
|
138
|
+
const snapshot = get(makeAtom(ref));
|
|
139
|
+
if (snapshot == null) {
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
const option = yield* getReactiveOption(snapshot);
|
|
143
|
+
return Option.getOrElse(option, () => undefined);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
return Function.pipe(
|
|
147
|
+
Atom.make(effect),
|
|
148
|
+
Atom.map((result) => Result.getOrElse(result, () => undefined)),
|
|
149
|
+
);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Atom family for any ECHO entity (obj or relation) — returns a snapshot.
|
|
154
|
+
*/
|
|
155
|
+
const entityFamily = Atom.family(<T extends Entity.Unknown>(entity: T): Atom.Atom<Entity.Snapshot> => {
|
|
156
|
+
return Atom.make<Entity.Snapshot>((get) => {
|
|
157
|
+
const unsubscribe = subscribe(entity, () => {
|
|
158
|
+
// getSnapshot adds SnapshotKindId brand at runtime; cast bridges static types.
|
|
159
|
+
get.setSelf(getSnapshot(entity) as unknown as Entity.Snapshot);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
get.addFinalizer(() => unsubscribe());
|
|
163
|
+
|
|
164
|
+
return getSnapshot(entity) as unknown as Entity.Snapshot;
|
|
165
|
+
}).pipe(Atom.keepAlive);
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Atom family for ECHO relations — returns a typed relation snapshot.
|
|
170
|
+
*/
|
|
171
|
+
const relationFamily = Atom.family(<T extends Relation.Unknown>(relation: T): Atom.Atom<Relation.Snapshot<T>> => {
|
|
172
|
+
return Atom.make<Relation.Snapshot<T>>((get) => {
|
|
173
|
+
const unsubscribe = subscribe(relation, () => {
|
|
174
|
+
// getSnapshot adds SnapshotKindId brand at runtime; cast bridges static types.
|
|
175
|
+
get.setSelf(getSnapshot(relation) as unknown as Relation.Snapshot<T>);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
get.addFinalizer(() => unsubscribe());
|
|
179
|
+
|
|
180
|
+
return getSnapshot(relation) as unknown as Relation.Snapshot<T>;
|
|
181
|
+
}).pipe(Atom.keepAlive);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Create a read-only snapshot atom for a reactive object or ref.
|
|
186
|
+
* Updates automatically when the object is mutated.
|
|
187
|
+
* For refs, subscribes to target object changes after loading.
|
|
188
|
+
*/
|
|
189
|
+
export const makeAtom: {
|
|
190
|
+
<T extends Obj.Unknown>(obj: T): Atom.Atom<Obj.Snapshot<T>>;
|
|
191
|
+
<T extends Obj.Unknown>(ref: Ref.Ref<T>): Atom.Atom<Obj.Snapshot<T> | undefined>;
|
|
192
|
+
} = (objOrRef: Obj.Unknown | Ref.Ref<any>): Atom.Atom<any> => {
|
|
193
|
+
if (isRef(objOrRef)) {
|
|
194
|
+
return refFamily(objOrRef as any);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
const obj = objOrRef as Obj.Unknown;
|
|
198
|
+
assertArgument(isEntity(obj), 'obj', 'Object must be a reactive object');
|
|
199
|
+
return objectFamily(obj as any);
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Create a read-only atom for a specific property of a reactive object.
|
|
204
|
+
* Only fires updates when the property value actually changes.
|
|
205
|
+
*/
|
|
206
|
+
export const makeProperty = <T extends Obj.Unknown, K extends keyof T>(obj: T, key: K): Atom.Atom<T[K]> => {
|
|
207
|
+
assertArgument(isEntity(obj), 'obj', 'Object must be a reactive object');
|
|
208
|
+
return propertyFamily(obj)(key);
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Like `makeAtom` but returns the live reactive object instead of a snapshot.
|
|
213
|
+
* Prefer `makeAtom` (snapshot) unless you need the live Obj for generic mutations.
|
|
214
|
+
*/
|
|
215
|
+
export const makeWithReactive: {
|
|
216
|
+
<T extends Obj.Unknown>(obj: T): Atom.Atom<T>;
|
|
217
|
+
<T extends Obj.Unknown>(ref: Ref.Ref<T>): Atom.Atom<T | undefined>;
|
|
218
|
+
} = (objOrRef: Obj.Unknown | Ref.Ref<any>): Atom.Atom<any> => {
|
|
219
|
+
if (isRef(objOrRef)) {
|
|
220
|
+
return refWithReactiveFamily(objOrRef as Ref.Ref<any>);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const obj = objOrRef as Obj.Unknown;
|
|
224
|
+
assertArgument(isEntity(obj), 'obj', 'Object must be a reactive object');
|
|
225
|
+
return objectWithReactiveFamily(obj);
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Create a read-only snapshot atom for any ECHO entity (obj or relation).
|
|
230
|
+
* Updates automatically when the entity is mutated.
|
|
231
|
+
*/
|
|
232
|
+
export const makeEntity = <T extends Entity.Unknown>(entity: T): Atom.Atom<Entity.Snapshot> => {
|
|
233
|
+
assertArgument(isEntity(entity), 'entity', 'Must be a reactive ECHO entity');
|
|
234
|
+
return entityFamily(entity);
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Create a read-only snapshot atom for a reactive relation.
|
|
239
|
+
* Updates automatically when the relation is mutated.
|
|
240
|
+
*/
|
|
241
|
+
export const makeRelation = <T extends Relation.Unknown>(relation: T): Atom.Atom<Relation.Snapshot<T>> => {
|
|
242
|
+
assertArgument(isEntity(relation), 'relation', 'Must be a reactive ECHO relation');
|
|
243
|
+
return relationFamily(relation);
|
|
244
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { invariant } from '@dxos/invariant';
|
|
6
|
+
import { deepMapValues } from '@dxos/util';
|
|
7
|
+
|
|
8
|
+
import type * as Obj from '../../Obj';
|
|
9
|
+
import { makeObject } from '../common/proxy';
|
|
10
|
+
import { getSchema, getStaticTypeSchema, getType } from '../common/types';
|
|
11
|
+
import { getMeta } from '../common/types/meta';
|
|
12
|
+
import { Ref } from '../Ref';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Clones an object or relation.
|
|
16
|
+
* This does not clone referenced objects, only the properties in the object.
|
|
17
|
+
* @returns A new object with the same schema and properties.
|
|
18
|
+
*/
|
|
19
|
+
export const clone = <T extends Obj.Any>(obj: T, opts?: Obj.CloneOptions): T => {
|
|
20
|
+
const { id, ...data } = obj;
|
|
21
|
+
// Prefer cloning through the type entity so the cloned instance preserves
|
|
22
|
+
// `Obj.getType` identity. Falls back to the raw schema for older instances
|
|
23
|
+
// that don't have a type-entity back-reference set (e.g. deserialized).
|
|
24
|
+
const typeEntity = getType(obj);
|
|
25
|
+
const schema = typeEntity != null ? getStaticTypeSchema(typeEntity) : getSchema(obj);
|
|
26
|
+
invariant(schema != null, 'Object should have a type or schema');
|
|
27
|
+
const props: any = deepMapValues(data, (value, recurse) => {
|
|
28
|
+
if (Ref.isRef(value)) {
|
|
29
|
+
if (opts?.deep) {
|
|
30
|
+
// TODO(dmaretskyi): Will break on circular references.
|
|
31
|
+
return Ref.make(clone(value.target!, opts));
|
|
32
|
+
}
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
return recurse(value);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
if (opts?.retainId) {
|
|
39
|
+
props.id = id;
|
|
40
|
+
}
|
|
41
|
+
const meta = deepMapValues(getMeta(obj), (value, recurse) => {
|
|
42
|
+
if (Ref.isRef(value)) {
|
|
43
|
+
if (opts?.deep) {
|
|
44
|
+
// TODO(dmaretskyi): Will break on circular references.
|
|
45
|
+
return Ref.make(clone(value.target!, opts));
|
|
46
|
+
}
|
|
47
|
+
return value;
|
|
48
|
+
}
|
|
49
|
+
return recurse(value);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
return makeObject(schema, props, meta, typeEntity as object | undefined);
|
|
53
|
+
};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
|
|
7
|
+
import { getTypename } from '../Annotation';
|
|
8
|
+
import { type AnyProperties } from '../common/types';
|
|
9
|
+
|
|
10
|
+
// TODO(dmaretskyi): Rename to represent commonality between objects and relations (e.g. `entity`).
|
|
11
|
+
export type TypedObjectOptions = {
|
|
12
|
+
// TODO(burdon): Document.
|
|
13
|
+
partial?: true;
|
|
14
|
+
// TODO(burdon): Document.
|
|
15
|
+
record?: true;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
*
|
|
20
|
+
*/
|
|
21
|
+
// TODO(burdon): Comment required.
|
|
22
|
+
// TODO(dmaretskyi): Rename to represent commonality between objects and relations (e.g. `entity`).
|
|
23
|
+
type SimplifiedSchemaFields<
|
|
24
|
+
SchemaFields extends Schema.Struct.Fields,
|
|
25
|
+
Options extends TypedObjectOptions,
|
|
26
|
+
> = Options['partial'] extends boolean
|
|
27
|
+
? Schema.SimplifyMutable<Partial<Schema.Struct.Type<SchemaFields>>>
|
|
28
|
+
: Schema.SimplifyMutable<Schema.Struct.Type<SchemaFields>>;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
*
|
|
32
|
+
*/
|
|
33
|
+
// TODO(burdon): Comment required.
|
|
34
|
+
// TODO(dmaretskyi): Rename to represent commonality between objects and relations (e.g. `entity`).
|
|
35
|
+
export type TypedObjectFields<
|
|
36
|
+
SchemaFields extends Schema.Struct.Fields,
|
|
37
|
+
Options extends TypedObjectOptions,
|
|
38
|
+
> = SimplifiedSchemaFields<SchemaFields, Options> & { id: string } & (Options['record'] extends boolean
|
|
39
|
+
? Schema.SimplifyMutable<Schema.IndexSignature.Type<Schema.IndexSignature.Records>>
|
|
40
|
+
: {});
|
|
41
|
+
|
|
42
|
+
export const makeTypedEntityClass = (
|
|
43
|
+
typename: string,
|
|
44
|
+
version: string,
|
|
45
|
+
baseSchema: Schema.Schema.AnyNoContext,
|
|
46
|
+
): Schema.SchemaClass<any> => {
|
|
47
|
+
return class {
|
|
48
|
+
// Implement TypedObject properties.
|
|
49
|
+
static readonly typename = typename;
|
|
50
|
+
static readonly version = version;
|
|
51
|
+
|
|
52
|
+
// Implement Schema.Schema properties.
|
|
53
|
+
// TODO(burdon): Comment required.
|
|
54
|
+
static readonly [Schema.TypeId] = schemaVariance;
|
|
55
|
+
static readonly ast = baseSchema.ast;
|
|
56
|
+
static readonly annotations = baseSchema.annotations.bind(baseSchema);
|
|
57
|
+
static readonly pipe = baseSchema.pipe.bind(baseSchema);
|
|
58
|
+
|
|
59
|
+
// TODO(burdon): Comment required.
|
|
60
|
+
static [Symbol.hasInstance](obj: AnyProperties) {
|
|
61
|
+
return obj != null && getTypename(obj) === typename;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// TODO(burdon): Throw APIError.
|
|
65
|
+
private constructor() {
|
|
66
|
+
throw new Error('Use live(Typename, { ...fields }) to instantiate an object.');
|
|
67
|
+
}
|
|
68
|
+
} as any;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const schemaVariance = {
|
|
72
|
+
_A: (_: any) => _,
|
|
73
|
+
_I: (_: any) => _,
|
|
74
|
+
_R: (_: never) => _,
|
|
75
|
+
};
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
import { inspect } from 'util';
|
|
7
|
+
import { describe, expect, test } from 'vitest';
|
|
8
|
+
|
|
9
|
+
import { DXN, EID } from '@dxos/keys';
|
|
10
|
+
|
|
11
|
+
import { Relation } from '../../index';
|
|
12
|
+
import { TestSchema } from '../../testing';
|
|
13
|
+
import * as Type from '../../Type';
|
|
14
|
+
import { getTypeURI } from '../Annotation';
|
|
15
|
+
import { ATTR_TYPE, getSchema } from '../common/types';
|
|
16
|
+
import { ATTR_META } from '../common/types/meta';
|
|
17
|
+
import { ATTR_RELATION_SOURCE, ATTR_RELATION_TARGET, isInstanceOf } from '../Entity';
|
|
18
|
+
import { createObject } from './create-object';
|
|
19
|
+
import { objectToJSON } from './json-serializer';
|
|
20
|
+
|
|
21
|
+
describe('create (static version)', () => {
|
|
22
|
+
test('defaults', ({ expect }) => {
|
|
23
|
+
const Contact = Schema.Struct({
|
|
24
|
+
name: Schema.String.pipe(
|
|
25
|
+
Schema.optional,
|
|
26
|
+
Schema.withConstructorDefault(() => 'Anonymous'),
|
|
27
|
+
),
|
|
28
|
+
email: Schema.String.pipe(Schema.optional),
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
const obj = Contact.make({});
|
|
32
|
+
expect(obj.name).toBe('Anonymous');
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test('create static object', () => {
|
|
36
|
+
const contact = createObject(TestSchema.Person, {
|
|
37
|
+
name: 'Bot',
|
|
38
|
+
email: 'bot@example.com',
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
expect(contact.id).toBeDefined();
|
|
42
|
+
expect(contact.name).toBe('Bot');
|
|
43
|
+
expect(contact.email).toBe('bot@example.com');
|
|
44
|
+
expect((contact as any)['@type']).toBeUndefined();
|
|
45
|
+
expect(getTypeURI(contact)?.toString()).toBe(Type.getURI(TestSchema.Person).toString());
|
|
46
|
+
expect(isInstanceOf(TestSchema.Person, contact)).toBe(true);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test('JSON encoding', () => {
|
|
50
|
+
const contact = createObject(TestSchema.Person, {
|
|
51
|
+
name: 'Bot',
|
|
52
|
+
email: 'bot@example.com',
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
const json = JSON.parse(JSON.stringify(contact));
|
|
56
|
+
expect(json).toEqual({
|
|
57
|
+
id: contact.id,
|
|
58
|
+
'@type': DXN.make(Type.getTypename(TestSchema.Person), Type.getVersion(TestSchema.Person)),
|
|
59
|
+
'@meta': {
|
|
60
|
+
keys: [],
|
|
61
|
+
},
|
|
62
|
+
name: 'Bot',
|
|
63
|
+
email: 'bot@example.com',
|
|
64
|
+
});
|
|
65
|
+
expect(objectToJSON(contact)).toStrictEqual(json);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test('JSON encoding with relation', () => {
|
|
69
|
+
const person1 = createObject(TestSchema.Person, {
|
|
70
|
+
name: 'Alice',
|
|
71
|
+
email: 'alice@example.com',
|
|
72
|
+
});
|
|
73
|
+
const person2 = createObject(TestSchema.Person, {
|
|
74
|
+
name: 'Bob',
|
|
75
|
+
email: 'bob@example.com',
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
const manager = createObject(TestSchema.HasManager, {
|
|
79
|
+
[Relation.Source]: person1 as any,
|
|
80
|
+
[Relation.Target]: person2 as any,
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
const json = JSON.parse(JSON.stringify(manager));
|
|
84
|
+
expect(json).toEqual({
|
|
85
|
+
id: manager.id,
|
|
86
|
+
[ATTR_TYPE]: DXN.make(Type.getTypename(TestSchema.HasManager), Type.getVersion(TestSchema.HasManager)),
|
|
87
|
+
[ATTR_RELATION_SOURCE]: EID.make({ entityId: person1.id }),
|
|
88
|
+
[ATTR_RELATION_TARGET]: EID.make({ entityId: person2.id }),
|
|
89
|
+
[ATTR_META]: {
|
|
90
|
+
keys: [],
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
test('getSchema', () => {
|
|
96
|
+
const contact = createObject(TestSchema.Person, {
|
|
97
|
+
name: 'Bot',
|
|
98
|
+
email: 'bot@example.com',
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
expect(getSchema(contact)).toBe(Type.getSchema(TestSchema.Person));
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
test('inspect', () => {
|
|
105
|
+
const contact = createObject(TestSchema.Person, {
|
|
106
|
+
name: 'Bot',
|
|
107
|
+
email: 'bot@example.com',
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
const text = inspect(contact);
|
|
111
|
+
expect(text).toContain('Bot');
|
|
112
|
+
expect(text).toContain('bot@example.com');
|
|
113
|
+
expect(text).toContain('com.example.type.person');
|
|
114
|
+
expect(text).toContain('0.1.0');
|
|
115
|
+
});
|
|
116
|
+
});
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { raise } from '@dxos/debug';
|
|
6
|
+
import { assertArgument, failedInvariant } from '@dxos/invariant';
|
|
7
|
+
import { EntityId } from '@dxos/keys';
|
|
8
|
+
|
|
9
|
+
import type * as Type from '../../Type';
|
|
10
|
+
import { getSchemaURI, getTypeAnnotation, setTypename } from '../Annotation';
|
|
11
|
+
import { defineHiddenProperty } from '../common/proxy';
|
|
12
|
+
import {
|
|
13
|
+
EntityKind,
|
|
14
|
+
KindId,
|
|
15
|
+
SchemaKindId,
|
|
16
|
+
StaticTypeSchemaSlot,
|
|
17
|
+
getStaticTypeSchema,
|
|
18
|
+
setSchema,
|
|
19
|
+
setType,
|
|
20
|
+
} from '../common/types';
|
|
21
|
+
import { type EntityMeta } from '../common/types/meta';
|
|
22
|
+
import { MetaId } from '../common/types/model-symbols';
|
|
23
|
+
import {
|
|
24
|
+
RelationSourceDXNId,
|
|
25
|
+
RelationSourceId,
|
|
26
|
+
RelationTargetDXNId,
|
|
27
|
+
RelationTargetId,
|
|
28
|
+
assertObjectModel,
|
|
29
|
+
getObjectEchoUri,
|
|
30
|
+
} from '../Entity';
|
|
31
|
+
import { attachedTypedObjectInspector } from './inspect';
|
|
32
|
+
import { attachTypedJsonSerializer } from './json-serializer';
|
|
33
|
+
|
|
34
|
+
// Omits the brand slots — those get stamped on the instance by the entity
|
|
35
|
+
// handler (KindId via setKind, SchemaKindId derived in the proxy `get` trap
|
|
36
|
+
// from kind + jsonSchema.entityKind, StaticTypeSchemaSlot lazily via the
|
|
37
|
+
// proxy), not supplied by the caller. Allows `[Obj.Meta]` (MetaId symbol) for
|
|
38
|
+
// seeding registry-provenance meta at construction (mirrors `Obj.make`).
|
|
39
|
+
export type CreateObjectProps<T> = (T extends { id: string }
|
|
40
|
+
? Omit<T, 'id' | KindId | SchemaKindId | StaticTypeSchemaSlot> & { id?: string }
|
|
41
|
+
: Omit<T, KindId | SchemaKindId | StaticTypeSchemaSlot>) & {
|
|
42
|
+
readonly [MetaId]?: Partial<EntityMeta>;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Creates a new object instance from a schema and data, without signal reactivity.
|
|
47
|
+
* This static version creates plain JavaScript objects that are not reactive/observable.
|
|
48
|
+
* For reactive objects that automatically update UI when changed, use the regular live() function.
|
|
49
|
+
*
|
|
50
|
+
* @param schema - The Effect schema that defines the object's structure and type, piped into EchoObjectSchema
|
|
51
|
+
* @param data - The data to initialize the object with. The id and @type fields are handled automatically.
|
|
52
|
+
* @returns A new non-reactive object instance conforming to the schema
|
|
53
|
+
* @throws {Error} If the schema is not an object schema
|
|
54
|
+
* @throws {TypeError} If data contains an @type field
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```ts
|
|
58
|
+
* const Contact = Schema.Struct({
|
|
59
|
+
* name: Schema.String,
|
|
60
|
+
* email: Schema.String,
|
|
61
|
+
* }).pipe(Type.makeObject(DXN.make('com.example.type.person', '0.1.0')))
|
|
62
|
+
*
|
|
63
|
+
* const contact = createObject(Contact, {
|
|
64
|
+
* name: "John",
|
|
65
|
+
* email: "john@example.com",
|
|
66
|
+
* })
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
// TODO(burdon): Make internal.
|
|
70
|
+
export const createObject: {
|
|
71
|
+
<T extends Type.AnyEntity>(input: T, props: NoInfer<CreateObjectProps<Type.InstanceType<T>>>): Type.InstanceType<T>;
|
|
72
|
+
} = (input: any, props: any): any => {
|
|
73
|
+
// `Type.Type` entities aren't `Schema.Schema` themselves; read the source
|
|
74
|
+
// schema off the hidden slot (persisted entities synthesize it lazily via
|
|
75
|
+
// the proxy `get` trap).
|
|
76
|
+
const schema = getStaticTypeSchema(input) ?? failedInvariant('Type entity is missing its source schema');
|
|
77
|
+
const annotation = getTypeAnnotation(schema);
|
|
78
|
+
if (!annotation) {
|
|
79
|
+
throw new Error('Schema is not an ECHO schema');
|
|
80
|
+
}
|
|
81
|
+
assertArgument(!('@type' in props), 'data', '@type is not allowed');
|
|
82
|
+
assertArgument(!(RelationSourceDXNId in props), 'data', 'Relation source DXN is not allowed in the constructor');
|
|
83
|
+
assertArgument(!(RelationTargetDXNId in props), 'data', 'Relation target DXN is not allowed in the constructor');
|
|
84
|
+
assertArgument(
|
|
85
|
+
RelationSourceId in props === RelationTargetId in props,
|
|
86
|
+
'data',
|
|
87
|
+
'Relation source and target must be provided together',
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
// Pull `[Obj.Meta]` (MetaId-symbol) off props before spreading so it doesn't
|
|
91
|
+
// leak into data. Callers use this to seed registry-provenance meta fields
|
|
92
|
+
// (`key`, `version`) and foreign keys / tags at construction time, mirroring
|
|
93
|
+
// `Obj.make`'s symbol-keyed meta convention.
|
|
94
|
+
const metaOverride = props[MetaId];
|
|
95
|
+
if (metaOverride !== undefined) {
|
|
96
|
+
delete props[MetaId];
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Raw object.
|
|
100
|
+
const obj = { ...props, id: props.id ?? EntityId.random() };
|
|
101
|
+
|
|
102
|
+
// Metadata. Instance-kind is read from the schema's TypeAnnotation (set by
|
|
103
|
+
// EchoObjectSchema / EchoRelationSchema / EchoTypeKindSchema): instances of
|
|
104
|
+
// a type-kind meta-schema are themselves type-kind entities, etc. The
|
|
105
|
+
// RelationSourceId-in-props check covers the legacy path where the schema
|
|
106
|
+
// annotation isn't authoritative.
|
|
107
|
+
const kind =
|
|
108
|
+
annotation.kind === EntityKind.Type
|
|
109
|
+
? EntityKind.Type
|
|
110
|
+
: annotation.kind === EntityKind.Relation || RelationSourceId in props
|
|
111
|
+
? EntityKind.Relation
|
|
112
|
+
: EntityKind.Object;
|
|
113
|
+
defineHiddenProperty(obj, KindId, kind);
|
|
114
|
+
defineHiddenProperty(obj, MetaId, {
|
|
115
|
+
...metaOverride,
|
|
116
|
+
keys: metaOverride?.keys ?? [],
|
|
117
|
+
tags: metaOverride?.tags ?? [],
|
|
118
|
+
annotations: metaOverride?.annotations ?? {},
|
|
119
|
+
});
|
|
120
|
+
setSchema(obj, schema);
|
|
121
|
+
// If the caller passed a type entity (recognised via the schema slot), keep
|
|
122
|
+
// a reference to it on the instance for `Obj.getType` / `Relation.getType`.
|
|
123
|
+
if (input !== schema) {
|
|
124
|
+
setType(obj, input);
|
|
125
|
+
}
|
|
126
|
+
setTypename(obj, getSchemaURI(schema) ?? failedInvariant('Missing schema URI'));
|
|
127
|
+
attachTypedJsonSerializer(obj);
|
|
128
|
+
attachedTypedObjectInspector(obj);
|
|
129
|
+
|
|
130
|
+
// Relation.
|
|
131
|
+
if (kind === EntityKind.Relation) {
|
|
132
|
+
const sourceDXN = getObjectEchoUri(props[RelationSourceId]) ?? raise(new Error('Unresolved relation source'));
|
|
133
|
+
const targetDXN = getObjectEchoUri(props[RelationTargetId]) ?? raise(new Error('Unresolved relation target'));
|
|
134
|
+
defineHiddenProperty(obj, RelationSourceDXNId, sourceDXN);
|
|
135
|
+
defineHiddenProperty(obj, RelationTargetDXNId, targetDXN);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
assertObjectModel(obj);
|
|
139
|
+
return obj;
|
|
140
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type AnyProperties } from '../common/types';
|
|
6
|
+
import { ObjectDeletedId } from '../Entity';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @returns `true` if the object has been marked as deleted.
|
|
10
|
+
*/
|
|
11
|
+
export const isDeleted = (obj: AnyProperties): boolean => {
|
|
12
|
+
if ((obj as any)[ObjectDeletedId] === undefined) {
|
|
13
|
+
// TODO(dmaretskyi): Return to prior behavior of throwing.
|
|
14
|
+
// throw new Error('Object does not support deletion marker');
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return (obj as any)[ObjectDeletedId] ?? false;
|
|
19
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
export * from './common';
|
|
6
|
+
export * from './create-object';
|
|
7
|
+
export * from './deleted';
|
|
8
|
+
export * from './json-serializer';
|
|
9
|
+
export * from './schema-validator';
|
|
10
|
+
export * from './set-value';
|
|
11
|
+
export * from './snapshot';
|
|
12
|
+
export * from './typed-object';
|
|
13
|
+
export * from './atoms';
|
|
14
|
+
export * from './clone';
|