@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,119 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import type * as Schema from 'effect/Schema';
|
|
6
|
+
|
|
7
|
+
import { type ForeignKey } from '@dxos/echo-protocol';
|
|
8
|
+
import { invariant } from '@dxos/invariant';
|
|
9
|
+
import { EID, EntityId, type URI } from '@dxos/keys';
|
|
10
|
+
import { assumeType } from '@dxos/util';
|
|
11
|
+
|
|
12
|
+
import type * as Database from '../../Database';
|
|
13
|
+
import {
|
|
14
|
+
type ATTR_PARENT,
|
|
15
|
+
type ATTR_TYPE,
|
|
16
|
+
ATTR_DELETED,
|
|
17
|
+
ATTR_RELATION_SOURCE,
|
|
18
|
+
ATTR_RELATION_TARGET,
|
|
19
|
+
ATTR_SELF_URI,
|
|
20
|
+
ATTR_SELF_URI_LEGACY,
|
|
21
|
+
EntityKind,
|
|
22
|
+
KindId,
|
|
23
|
+
ObjectDatabaseId,
|
|
24
|
+
ObjectDeletedId,
|
|
25
|
+
ObjectVersionId,
|
|
26
|
+
type ParentId,
|
|
27
|
+
RelationSourceDXNId,
|
|
28
|
+
RelationSourceId,
|
|
29
|
+
RelationTargetDXNId,
|
|
30
|
+
RelationTargetId,
|
|
31
|
+
type SchemaId,
|
|
32
|
+
SelfURIId,
|
|
33
|
+
TypeId,
|
|
34
|
+
type Version,
|
|
35
|
+
} from '../common/types';
|
|
36
|
+
import { type ATTR_META, type EntityMeta } from '../common/types/meta';
|
|
37
|
+
import { type MetaId } from '../common/types/model-symbols';
|
|
38
|
+
|
|
39
|
+
export {
|
|
40
|
+
ATTR_DELETED,
|
|
41
|
+
ATTR_SELF_URI,
|
|
42
|
+
ATTR_SELF_URI_LEGACY,
|
|
43
|
+
ObjectDatabaseId,
|
|
44
|
+
ObjectDeletedId,
|
|
45
|
+
ObjectVersionId,
|
|
46
|
+
SelfURIId,
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Internal runtime representation of an object.
|
|
51
|
+
* The fields are accessed through getter functions.
|
|
52
|
+
*/
|
|
53
|
+
// NOTE: Each symbol has a jsdoc describing its purpose.
|
|
54
|
+
export interface InternalObjectProps {
|
|
55
|
+
readonly id: EntityId;
|
|
56
|
+
readonly [SelfURIId]: EID.EID;
|
|
57
|
+
readonly [KindId]: EntityKind;
|
|
58
|
+
readonly [SchemaId]: Schema.Schema.AnyNoContext;
|
|
59
|
+
readonly [TypeId]: URI.URI;
|
|
60
|
+
readonly [MetaId]?: EntityMeta;
|
|
61
|
+
[ParentId]?: InternalObjectProps;
|
|
62
|
+
readonly [ObjectDatabaseId]?: Database.Database;
|
|
63
|
+
readonly [ObjectDeletedId]?: boolean;
|
|
64
|
+
readonly [ObjectVersionId]?: Version;
|
|
65
|
+
readonly [RelationSourceDXNId]?: EID.EID;
|
|
66
|
+
readonly [RelationTargetDXNId]?: EID.EID;
|
|
67
|
+
readonly [RelationSourceId]?: InternalObjectProps;
|
|
68
|
+
readonly [RelationTargetId]?: InternalObjectProps;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Entity metadata.
|
|
73
|
+
*/
|
|
74
|
+
export interface EntityMetaJSON {
|
|
75
|
+
keys: ForeignKey[];
|
|
76
|
+
tags?: string[];
|
|
77
|
+
key?: string;
|
|
78
|
+
version?: string;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* JSON representation of an object or relation metadata.
|
|
83
|
+
*/
|
|
84
|
+
export interface ObjectJSON {
|
|
85
|
+
id: EntityId;
|
|
86
|
+
[ATTR_TYPE]?: URI.URI;
|
|
87
|
+
[ATTR_SELF_URI]?: EID.EID;
|
|
88
|
+
[ATTR_PARENT]?: EID.EID; // Encoded reference
|
|
89
|
+
[ATTR_DELETED]?: boolean;
|
|
90
|
+
[ATTR_META]?: EntityMetaJSON;
|
|
91
|
+
[ATTR_RELATION_SOURCE]?: EID.EID;
|
|
92
|
+
[ATTR_RELATION_TARGET]?: EID.EID;
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Application-specific properties.
|
|
96
|
+
*/
|
|
97
|
+
[key: string]: unknown;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* NOTE: Keep as `function` to avoid type inference issues.
|
|
102
|
+
*/
|
|
103
|
+
export function assertObjectModel(obj: unknown): asserts obj is InternalObjectProps {
|
|
104
|
+
invariant(typeof obj === 'object' && obj !== null, 'Invalid object model: not an object');
|
|
105
|
+
assumeType<InternalObjectProps>(obj);
|
|
106
|
+
invariant(EntityId.isValid(obj.id), 'Invalid object model: invalid id');
|
|
107
|
+
invariant(obj[TypeId] === undefined || typeof obj[TypeId] === 'string', 'Invalid object model: invalid type');
|
|
108
|
+
invariant(
|
|
109
|
+
obj[KindId] === EntityKind.Object || obj[KindId] === EntityKind.Relation || obj[KindId] === EntityKind.Type,
|
|
110
|
+
'Invalid object model: invalid entity kind',
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
if (obj[KindId] === EntityKind.Relation) {
|
|
114
|
+
invariant(EID.isEID(obj[RelationSourceDXNId]), 'Invalid object model: invalid relation source');
|
|
115
|
+
invariant(EID.isEID(obj[RelationTargetDXNId]), 'Invalid object model: invalid relation target');
|
|
116
|
+
invariant(!EID.isEID(obj[RelationSourceId]), 'Invalid object model: source pointer is a DXN');
|
|
117
|
+
invariant(!EID.isEID(obj[RelationTargetId]), 'Invalid object model: target pointer is a DXN');
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
import * as SchemaAST from 'effect/SchemaAST';
|
|
7
|
+
|
|
8
|
+
import { invariant } from '@dxos/invariant';
|
|
9
|
+
import { DXN } from '@dxos/keys';
|
|
10
|
+
|
|
11
|
+
import { type TypeAnnotation, TypeAnnotationId } from '../Annotation/annotations';
|
|
12
|
+
import { makeTypeJsonSchemaAnnotation } from '../Annotation/util';
|
|
13
|
+
import { EntityKind } from '../common/types';
|
|
14
|
+
import { toJsonSchema } from '../JsonSchema';
|
|
15
|
+
import { type EchoTypeOptions, type EchoTypeSchema, makeEchoTypeSchema } from './entity';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Object schema type with kind marker.
|
|
19
|
+
*/
|
|
20
|
+
export type EchoObjectSchema<
|
|
21
|
+
Self extends Schema.Schema.Any,
|
|
22
|
+
Fields extends Schema.Struct.Fields = Schema.Struct.Fields,
|
|
23
|
+
> = EchoTypeSchema<Self, {}, EntityKind.Object, Fields>;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Schema for Obj entity types.
|
|
27
|
+
* Pipeable function to add ECHO object annotations to a schema.
|
|
28
|
+
*/
|
|
29
|
+
export const EchoObjectSchema: {
|
|
30
|
+
(
|
|
31
|
+
dxn: DXN.DXN,
|
|
32
|
+
options?: EchoTypeOptions,
|
|
33
|
+
): <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(
|
|
34
|
+
self: Self & { fields?: Fields },
|
|
35
|
+
) => EchoObjectSchema<Self, Fields>;
|
|
36
|
+
} = (dxn, options) => {
|
|
37
|
+
const typename = DXN.getName(dxn);
|
|
38
|
+
const version = DXN.getVersion(dxn);
|
|
39
|
+
invariant(version, `Type.makeObject requires a versioned DXN: ${dxn}`);
|
|
40
|
+
|
|
41
|
+
return <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(
|
|
42
|
+
self: Self & { fields?: Fields },
|
|
43
|
+
): EchoObjectSchema<Self, Fields> => {
|
|
44
|
+
invariant(typeof TypeAnnotationId === 'symbol', 'Sanity.');
|
|
45
|
+
invariant(SchemaAST.isTypeLiteral(self.ast), 'Schema must be a TypeLiteral.');
|
|
46
|
+
|
|
47
|
+
// Extract fields from the schema if available (Struct schemas have .fields).
|
|
48
|
+
const fields = ((self as any).fields ?? {}) as Fields;
|
|
49
|
+
|
|
50
|
+
const schemaWithId = Schema.extend(self, Schema.Struct({ id: Schema.String }));
|
|
51
|
+
const ast = SchemaAST.annotations(schemaWithId.ast, {
|
|
52
|
+
// TODO(dmaretskyi): `extend` kills the annotations.
|
|
53
|
+
...self.ast.annotations,
|
|
54
|
+
[TypeAnnotationId]: { kind: EntityKind.Object, typename, version } satisfies TypeAnnotation,
|
|
55
|
+
// TODO(dmaretskyi): TypeIdentifierAnnotationId?
|
|
56
|
+
[SchemaAST.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
|
|
57
|
+
kind: EntityKind.Object,
|
|
58
|
+
typename,
|
|
59
|
+
version,
|
|
60
|
+
}),
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
return makeEchoTypeSchema<Self, EntityKind.Object, Fields>(
|
|
64
|
+
fields,
|
|
65
|
+
ast,
|
|
66
|
+
typename,
|
|
67
|
+
version,
|
|
68
|
+
EntityKind.Object,
|
|
69
|
+
() => toJsonSchema(Schema.make(ast)),
|
|
70
|
+
options?.id,
|
|
71
|
+
);
|
|
72
|
+
};
|
|
73
|
+
};
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
import * as SchemaAST from 'effect/SchemaAST';
|
|
7
|
+
|
|
8
|
+
import { raise } from '@dxos/debug';
|
|
9
|
+
import { assertArgument, invariant } from '@dxos/invariant';
|
|
10
|
+
import { DXN, type EntityId } from '@dxos/keys';
|
|
11
|
+
|
|
12
|
+
// Type-only imports (erased at runtime — no import cycle); `internal` may depend
|
|
13
|
+
// on the top-level `Obj` / `Type` API at the type level only.
|
|
14
|
+
import type * as Obj from '../../Obj';
|
|
15
|
+
import type * as Type from '../../Type';
|
|
16
|
+
import {
|
|
17
|
+
type TypeAnnotation,
|
|
18
|
+
TypeAnnotationId,
|
|
19
|
+
getEntityKind,
|
|
20
|
+
getSchemaTypename,
|
|
21
|
+
getTypeIdentifierAnnotation,
|
|
22
|
+
} from '../Annotation/annotations';
|
|
23
|
+
import { makeTypeJsonSchemaAnnotation } from '../Annotation/util';
|
|
24
|
+
import {
|
|
25
|
+
ATTR_RELATION_SOURCE,
|
|
26
|
+
ATTR_RELATION_TARGET,
|
|
27
|
+
EntityKind,
|
|
28
|
+
RelationSourceDXNId,
|
|
29
|
+
RelationSourceId,
|
|
30
|
+
RelationTargetDXNId,
|
|
31
|
+
RelationTargetId,
|
|
32
|
+
type UnknownTypeSchema,
|
|
33
|
+
getStaticTypeSchema,
|
|
34
|
+
} from '../common/types';
|
|
35
|
+
|
|
36
|
+
export {
|
|
37
|
+
ATTR_RELATION_SOURCE,
|
|
38
|
+
ATTR_RELATION_TARGET,
|
|
39
|
+
RelationSourceDXNId,
|
|
40
|
+
RelationSourceId,
|
|
41
|
+
RelationTargetDXNId,
|
|
42
|
+
RelationTargetId,
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
import { toJsonSchema } from '../JsonSchema';
|
|
46
|
+
import { type EchoTypeSchema, makeEchoTypeSchema } from './entity';
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Source and target props on relations.
|
|
50
|
+
*/
|
|
51
|
+
// TODO(burdon): any?
|
|
52
|
+
export type RelationSourceTargetRefs<Source = any, Target = any> = {
|
|
53
|
+
/**
|
|
54
|
+
* Source ECHO live object.
|
|
55
|
+
*/
|
|
56
|
+
[RelationSourceId]: Source;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Target ECHO live object.
|
|
60
|
+
*/
|
|
61
|
+
[RelationTargetId]: Target;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
export type RelationSource<R> = R extends RelationSourceTargetRefs<infer Source, infer _Target> ? Source : never;
|
|
65
|
+
export type RelationTarget<R> = R extends RelationSourceTargetRefs<infer _Source, infer Target> ? Target : never;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Accepted relation endpoint: an object-kind `Type.Type` entity (slot-backed)
|
|
69
|
+
* or the branded `Obj.Unknown` schema. Source/target are constrained to these
|
|
70
|
+
* — relations only connect object-kind entities.
|
|
71
|
+
*/
|
|
72
|
+
export type RelationEndpoint = Type.AnyObj | UnknownTypeSchema<any, EntityKind.Object>;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Resolves a relation endpoint to the instance type it describes — the source /
|
|
76
|
+
* target instance recorded on the relation's `RelationSourceTargetRefs`.
|
|
77
|
+
*/
|
|
78
|
+
export type RelationEndpointInstance<S> =
|
|
79
|
+
S extends UnknownTypeSchema<infer A, any> ? A : S extends Type.AnyObj ? Type.InstanceType<S> : unknown;
|
|
80
|
+
|
|
81
|
+
export type EchoRelationSchemaOptions<TSource extends RelationEndpoint, TTarget extends RelationEndpoint> = {
|
|
82
|
+
dxn: DXN.DXN;
|
|
83
|
+
source: TSource;
|
|
84
|
+
target: TTarget;
|
|
85
|
+
/**
|
|
86
|
+
* Override the entity id stamped on the in-memory `Type.Type` value.
|
|
87
|
+
*
|
|
88
|
+
* Defaults to `EntityId.deterministic(typename, version)` — stable across processes
|
|
89
|
+
* and workerd-safe (no `crypto.getRandomValues()` at module-evaluation time).
|
|
90
|
+
*/
|
|
91
|
+
id?: EntityId;
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Relation schema type with kind marker. `SourceInstance` / `TargetInstance`
|
|
96
|
+
* are the resolved endpoint instance types (see {@link RelationEndpointInstance}).
|
|
97
|
+
*/
|
|
98
|
+
export type EchoRelationSchema<
|
|
99
|
+
Self extends Schema.Schema.Any,
|
|
100
|
+
SourceInstance extends Obj.Unknown,
|
|
101
|
+
TargetInstance extends Obj.Unknown,
|
|
102
|
+
Fields extends Schema.Struct.Fields = Schema.Struct.Fields,
|
|
103
|
+
> = EchoTypeSchema<Self, RelationSourceTargetRefs<SourceInstance, TargetInstance>, EntityKind.Relation, Fields>;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Schema for Relation entity types.
|
|
107
|
+
*/
|
|
108
|
+
export const EchoRelationSchema = <Source extends RelationEndpoint, Target extends RelationEndpoint>({
|
|
109
|
+
dxn,
|
|
110
|
+
source,
|
|
111
|
+
target,
|
|
112
|
+
id: explicitId,
|
|
113
|
+
}: EchoRelationSchemaOptions<Source, Target>) => {
|
|
114
|
+
// `source` / `target` are `Type.Type` entities (slot-backed) or the branded
|
|
115
|
+
// `Obj.Unknown` schema (used directly); resolve each to its Effect Schema for
|
|
116
|
+
// the schema-side machinery (DXN ref + entity-kind checks).
|
|
117
|
+
const sourceSchema = source != null ? (getStaticTypeSchema(source) ?? source) : source;
|
|
118
|
+
const targetSchema = target != null ? (getStaticTypeSchema(target) ?? target) : target;
|
|
119
|
+
assertArgument(Schema.isSchema(sourceSchema), 'source');
|
|
120
|
+
assertArgument(Schema.isSchema(targetSchema), 'target');
|
|
121
|
+
const typename = DXN.getName(dxn);
|
|
122
|
+
const version = DXN.getVersion(dxn);
|
|
123
|
+
invariant(version, `Type.makeRelation requires a versioned DXN: ${dxn}`);
|
|
124
|
+
const sourceDXN = getDXNForRelationSchemaRef(sourceSchema);
|
|
125
|
+
const targetDXN = getDXNForRelationSchemaRef(targetSchema);
|
|
126
|
+
if (getEntityKind(sourceSchema) !== EntityKind.Object) {
|
|
127
|
+
raise(new Error('Source schema must be an echo object schema.'));
|
|
128
|
+
}
|
|
129
|
+
if (getEntityKind(targetSchema) !== EntityKind.Object) {
|
|
130
|
+
raise(new Error('Target schema must be an echo object schema.'));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(
|
|
134
|
+
self: Self & { fields?: Fields },
|
|
135
|
+
): EchoRelationSchema<Self, RelationEndpointInstance<Source>, RelationEndpointInstance<Target>, Fields> => {
|
|
136
|
+
invariant(SchemaAST.isTypeLiteral(self.ast), 'Schema must be a TypeLiteral.');
|
|
137
|
+
|
|
138
|
+
// Extract fields from the schema if available (Struct schemas have .fields).
|
|
139
|
+
const fields = ((self as any).fields ?? {}) as Fields;
|
|
140
|
+
|
|
141
|
+
const schemaWithId = Schema.extend(self, Schema.Struct({ id: Schema.String }));
|
|
142
|
+
const ast = SchemaAST.annotations(schemaWithId.ast, {
|
|
143
|
+
// TODO(dmaretskyi): `extend` kills the annotations.
|
|
144
|
+
...self.ast.annotations,
|
|
145
|
+
[TypeAnnotationId]: {
|
|
146
|
+
kind: EntityKind.Relation,
|
|
147
|
+
typename,
|
|
148
|
+
version,
|
|
149
|
+
sourceSchema: sourceDXN,
|
|
150
|
+
targetSchema: targetDXN,
|
|
151
|
+
} satisfies TypeAnnotation,
|
|
152
|
+
// TODO(dmaretskyi): TypeIdentifierAnnotationId?
|
|
153
|
+
|
|
154
|
+
[SchemaAST.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
|
|
155
|
+
kind: EntityKind.Relation,
|
|
156
|
+
typename,
|
|
157
|
+
version,
|
|
158
|
+
relationSource: sourceDXN,
|
|
159
|
+
relationTarget: targetDXN,
|
|
160
|
+
}),
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
return makeEchoTypeSchema<Self, EntityKind.Relation, Fields>(
|
|
164
|
+
fields,
|
|
165
|
+
ast,
|
|
166
|
+
typename,
|
|
167
|
+
version,
|
|
168
|
+
EntityKind.Relation,
|
|
169
|
+
() => toJsonSchema(Schema.make(ast)),
|
|
170
|
+
explicitId,
|
|
171
|
+
);
|
|
172
|
+
};
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
export const getDXNForRelationSchemaRef = (schema: Schema.Schema.Any): DXN.DXN => {
|
|
176
|
+
assertArgument(Schema.isSchema(schema), 'schema');
|
|
177
|
+
const identifier = getTypeIdentifierAnnotation(schema);
|
|
178
|
+
if (identifier) {
|
|
179
|
+
return DXN.tryMake(identifier) ?? raise(new Error(`Invalid schema identifier: ${identifier}`));
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const typename = getSchemaTypename(schema);
|
|
183
|
+
if (!typename) {
|
|
184
|
+
throw new Error('Schema must have a typename');
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return DXN.make(typename);
|
|
188
|
+
};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
import * as SchemaAST from 'effect/SchemaAST';
|
|
7
|
+
|
|
8
|
+
import { invariant } from '@dxos/invariant';
|
|
9
|
+
import { DXN } from '@dxos/keys';
|
|
10
|
+
|
|
11
|
+
import { type TypeAnnotation, TypeAnnotationId } from '../Annotation/annotations';
|
|
12
|
+
import { makeTypeJsonSchemaAnnotation } from '../Annotation/util';
|
|
13
|
+
import { EntityKind } from '../common/types';
|
|
14
|
+
import { toJsonSchema } from '../JsonSchema';
|
|
15
|
+
import { type EchoTypeOptions, type EchoTypeSchema, makeEchoTypeSchema } from './entity';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Type-kind schema marker — produced by {@link EchoTypeKindSchema}.
|
|
19
|
+
*
|
|
20
|
+
* Distinguishes meta-schemas (entities of `EntityKind.Type`, such as the
|
|
21
|
+
* built-in `Type.Type` TypeSchema) from object and relation types.
|
|
22
|
+
*/
|
|
23
|
+
export type EchoTypeKindSchema<
|
|
24
|
+
Self extends Schema.Schema.Any,
|
|
25
|
+
Fields extends Schema.Struct.Fields = Schema.Struct.Fields,
|
|
26
|
+
> = EchoTypeSchema<Self, {}, EntityKind.Type, Fields>;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Pipeable that brands a schema as a type-kind ECHO entity. Mirrors
|
|
30
|
+
* {@link EchoObjectSchema} / {@link EchoRelationSchema}, but stamps the
|
|
31
|
+
* resulting entity with `[SchemaKindId]: EntityKind.Type` and a matching
|
|
32
|
+
* `TypeAnnotation.kind = 'type'` so meta-schemas surface uniformly through
|
|
33
|
+
* `Type.isTypeKind`, `Filter.type`, etc.
|
|
34
|
+
*/
|
|
35
|
+
export const EchoTypeKindSchema: {
|
|
36
|
+
(
|
|
37
|
+
dxn: DXN.DXN,
|
|
38
|
+
options?: EchoTypeOptions,
|
|
39
|
+
): <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(
|
|
40
|
+
self: Self & { fields?: Fields },
|
|
41
|
+
) => EchoTypeKindSchema<Self, Fields>;
|
|
42
|
+
} = (dxn, options) => {
|
|
43
|
+
const typename = DXN.getName(dxn);
|
|
44
|
+
const version = DXN.getVersion(dxn);
|
|
45
|
+
invariant(version, `Type-kind schemas require a versioned DXN: ${dxn}`);
|
|
46
|
+
|
|
47
|
+
return <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(
|
|
48
|
+
self: Self & { fields?: Fields },
|
|
49
|
+
): EchoTypeKindSchema<Self, Fields> => {
|
|
50
|
+
invariant(SchemaAST.isTypeLiteral(self.ast), 'Schema must be a TypeLiteral.');
|
|
51
|
+
|
|
52
|
+
const fields = ((self as any).fields ?? {}) as Fields;
|
|
53
|
+
|
|
54
|
+
const schemaWithId = Schema.extend(self, Schema.Struct({ id: Schema.String }));
|
|
55
|
+
const ast = SchemaAST.annotations(schemaWithId.ast, {
|
|
56
|
+
...self.ast.annotations,
|
|
57
|
+
[TypeAnnotationId]: { kind: EntityKind.Type, typename, version } satisfies TypeAnnotation,
|
|
58
|
+
[SchemaAST.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
|
|
59
|
+
kind: EntityKind.Type,
|
|
60
|
+
typename,
|
|
61
|
+
version,
|
|
62
|
+
}),
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
return makeEchoTypeSchema<Self, EntityKind.Type, Fields>(
|
|
66
|
+
fields,
|
|
67
|
+
ast,
|
|
68
|
+
typename,
|
|
69
|
+
version,
|
|
70
|
+
EntityKind.Type,
|
|
71
|
+
() => toJsonSchema(Schema.make(ast)),
|
|
72
|
+
options?.id,
|
|
73
|
+
);
|
|
74
|
+
};
|
|
75
|
+
};
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
|
|
7
|
+
import { raise } from '@dxos/debug';
|
|
8
|
+
import { assertArgument } from '@dxos/invariant';
|
|
9
|
+
import { DXN, EID, URI } from '@dxos/keys';
|
|
10
|
+
|
|
11
|
+
import { getSchemaURI, getTypename } from '../Annotation/annotations';
|
|
12
|
+
import { type AnyEntity, InstancePhantomId, KindId, TypeId, getStaticTypeSchema } from '../common/types';
|
|
13
|
+
import { getUri as getUriFromEntity } from './api';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @param input schema, `Type.Type` entity, or a type URI (an `echo:` EID or a `dxn:` DXN).
|
|
17
|
+
* @return type identifier URI — see {@link getSchemaURI}. A URI is returned verbatim. For a
|
|
18
|
+
* `Type.Type` entity, the URI of the schema it declares, symmetric with what
|
|
19
|
+
* `Obj.make(typeEntity, ...)` stamps on `system.type`: a static declaration resolves to its
|
|
20
|
+
* typename DXN, a persisted entity to its local `echo:/<objectId>`.
|
|
21
|
+
*/
|
|
22
|
+
export const getTypeURIFromSpecifier = (input: Schema.Schema.All | AnyEntity | URI.URI): URI.URI => {
|
|
23
|
+
if (Schema.isSchema(input)) {
|
|
24
|
+
return getSchemaURI(input) ?? raise(new TypeError('Schema has no URI'));
|
|
25
|
+
}
|
|
26
|
+
if (typeof input === 'object' && input !== null && KindId in input) {
|
|
27
|
+
// `Type.Type` entity. Both in-memory and persisted forms expose the schema
|
|
28
|
+
// they declare via `StaticTypeSchemaSlot`, whose URI is exactly what
|
|
29
|
+
// `Obj.make` stamps on `system.type` — a static declaration carries
|
|
30
|
+
// `TypeAnnotation` (→ typename DXN), a persisted entity's rebuilt schema
|
|
31
|
+
// carries `TypeIdentifierAnnotation` (→ local `echo:/<objectId>`).
|
|
32
|
+
const schema = getStaticTypeSchema(input);
|
|
33
|
+
if (schema != null) {
|
|
34
|
+
// Static types carry TypeAnnotation → DXN; persisted db types carry
|
|
35
|
+
// TypeIdentifierAnnotation → echo EID. In-memory makeObjectFromJsonSchema
|
|
36
|
+
// entities have neither (plain JSON Schema), so fall through to the EID path.
|
|
37
|
+
const uri = getSchemaURI(schema);
|
|
38
|
+
if (uri != null) {
|
|
39
|
+
return uri;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return getUriFromEntity(input as AnyEntity);
|
|
43
|
+
}
|
|
44
|
+
// A string specifier is already a branded URI — an `echo:` EID or a `dxn:` DXN.
|
|
45
|
+
assertArgument(EID.isEID(input) || DXN.isDXN(input), 'input', 'expected a type URI (EID or DXN)');
|
|
46
|
+
return input;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Checks if the object is an instance of the schema.
|
|
51
|
+
* Only typename is compared, the schema version is ignored.
|
|
52
|
+
*
|
|
53
|
+
* The following cases are considered to mean that the object is an instance of the schema:
|
|
54
|
+
* - Object was created with this exact schema.
|
|
55
|
+
* - Object was created with a different version of this schema.
|
|
56
|
+
* - Object was created with a different schema (maybe dynamic) that has the same typename.
|
|
57
|
+
*/
|
|
58
|
+
// TODO(burdon): Can we use `Schema.is`?
|
|
59
|
+
export const isInstanceOf = <S>(
|
|
60
|
+
schemaOrType: S extends Schema.Schema.AnyNoContext ? S : Schema.Schema.AnyNoContext | AnyEntity,
|
|
61
|
+
object: any,
|
|
62
|
+
): object is S extends Schema.Schema.AnyNoContext
|
|
63
|
+
? Schema.Schema.Type<S>
|
|
64
|
+
: S extends { readonly [InstancePhantomId]?: infer A }
|
|
65
|
+
? A
|
|
66
|
+
: unknown => {
|
|
67
|
+
if (object == null) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const schemaURI = getTypeURIFromSpecifier(schemaOrType);
|
|
72
|
+
|
|
73
|
+
// `object` is arbitrary input — read TypeId directly (it may be missing on
|
|
74
|
+
// non-entities) rather than via `getTypeURI` which asserts the URI is set.
|
|
75
|
+
const type = (object as any)[TypeId];
|
|
76
|
+
if (URI.isURI(type) && type === schemaURI) {
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const typename = getTypename(object);
|
|
81
|
+
if (!typename) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (!DXN.isDXN(schemaURI)) {
|
|
86
|
+
// EID-based schema URI — no typename match possible.
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const parsed = DXN.tryMake(schemaURI);
|
|
91
|
+
return parsed != null && DXN.getName(parsed) === typename;
|
|
92
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
|
|
7
|
+
import { assertArgument, invariant } from '@dxos/invariant';
|
|
8
|
+
import { EID, EntityId } from '@dxos/keys';
|
|
9
|
+
import { assumeType } from '@dxos/util';
|
|
10
|
+
|
|
11
|
+
import { type InternalObjectProps, SelfURIId } from './model';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Returns the EID of an object.
|
|
15
|
+
*
|
|
16
|
+
* @internal
|
|
17
|
+
*/
|
|
18
|
+
export const getObjectEchoUri = (object: any): EID.EID | undefined => {
|
|
19
|
+
invariant(!Schema.isSchema(object), 'schema not allowed in this function');
|
|
20
|
+
assertArgument(typeof object === 'object' && object != null, 'object', 'expected object');
|
|
21
|
+
assumeType<InternalObjectProps>(object);
|
|
22
|
+
|
|
23
|
+
if (object[SelfURIId]) {
|
|
24
|
+
invariant(EID.isEID(object[SelfURIId]), 'Invalid object model: invalid self dxn');
|
|
25
|
+
return EID.parse(object[SelfURIId]);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (!EntityId.isValid(object.id)) {
|
|
29
|
+
throw new TypeError('Object id is not valid.');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return EID.make({ entityId: object.id });
|
|
33
|
+
};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { assertArgument } from '@dxos/invariant';
|
|
6
|
+
|
|
7
|
+
import { type AnyEntity, VersionTypeId } from '../common/types';
|
|
8
|
+
import { ObjectVersionId } from './model';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Represent entity version.
|
|
12
|
+
* May be backed by Automerge.
|
|
13
|
+
* Entities with no history are not versioned.
|
|
14
|
+
* Named EntityVersion to avoid conflict with types/version.ts.
|
|
15
|
+
*/
|
|
16
|
+
export interface EntityVersion {
|
|
17
|
+
[VersionTypeId]: {};
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Whether the entity is versioned.
|
|
21
|
+
*/
|
|
22
|
+
versioned: boolean;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Automerge heads.
|
|
26
|
+
*/
|
|
27
|
+
automergeHeads?: string[];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const unversioned: EntityVersion = {
|
|
31
|
+
[VersionTypeId]: {},
|
|
32
|
+
versioned: false,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Checks that `obj` is a version object.
|
|
37
|
+
*/
|
|
38
|
+
export const isVersion = (entity: unknown): entity is EntityVersion => {
|
|
39
|
+
return entity != null && typeof entity === 'object' && VersionTypeId in entity;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Returns the version of an entity.
|
|
44
|
+
* Accepts both reactive entities and snapshots.
|
|
45
|
+
*/
|
|
46
|
+
export const version = (entity: AnyEntity): EntityVersion => {
|
|
47
|
+
const ver = (entity as any)[ObjectVersionId];
|
|
48
|
+
if (ver === undefined) {
|
|
49
|
+
return unversioned;
|
|
50
|
+
}
|
|
51
|
+
return ver;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Checks that `version` is a valid version object.
|
|
56
|
+
*/
|
|
57
|
+
export const versionValid = (ver: EntityVersion): boolean => {
|
|
58
|
+
assertArgument(isVersion(ver), 'version', 'Invalid version object');
|
|
59
|
+
return !!ver.versioned;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export type VersionCompareResult = 'unversioned' | 'equal' | 'different';
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Compares two versions.
|
|
66
|
+
* @param version1
|
|
67
|
+
* @param version2
|
|
68
|
+
* @returns 'unversioned' if either entity is unversioned, 'equal' if the versions are equal, 'different' if the versions are different.
|
|
69
|
+
*/
|
|
70
|
+
export const compareVersions = (version1: EntityVersion, version2: EntityVersion): VersionCompareResult => {
|
|
71
|
+
assertArgument(isVersion(version1), 'version1', 'Invalid version object');
|
|
72
|
+
assertArgument(isVersion(version2), 'version2', 'Invalid version object');
|
|
73
|
+
|
|
74
|
+
if (!versionValid(version1) || !versionValid(version2)) {
|
|
75
|
+
return 'unversioned';
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (version1.automergeHeads?.length !== version2.automergeHeads?.length) {
|
|
79
|
+
return 'different';
|
|
80
|
+
}
|
|
81
|
+
if (version1.automergeHeads?.some((head) => !version2.automergeHeads?.includes(head))) {
|
|
82
|
+
return 'different';
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return 'equal';
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
export const encodeVersion = (ver: EntityVersion): string => {
|
|
89
|
+
return JSON.stringify(ver);
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
export const decodeVersion = (ver: string): EntityVersion => {
|
|
93
|
+
const parsed = JSON.parse(ver);
|
|
94
|
+
parsed[VersionTypeId] = {};
|
|
95
|
+
return parsed;
|
|
96
|
+
};
|