@dxos/echo 0.8.4-main.406dc2a → 0.8.4-main.40e3dcdf1b
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -4
- package/dist/lib/neutral/Annotation.mjs +37 -0
- package/dist/lib/neutral/Database.mjs +45 -0
- package/dist/lib/neutral/Entity.mjs +59 -0
- package/dist/lib/neutral/Err.mjs +12 -0
- package/dist/lib/neutral/Feed.mjs +46 -0
- package/dist/lib/neutral/Filter.mjs +64 -0
- package/dist/lib/neutral/Format.mjs +66 -0
- package/dist/lib/neutral/Format.mjs.map +7 -0
- package/dist/lib/neutral/JsonSchema.mjs +19 -0
- package/dist/lib/neutral/JsonSchema.mjs.map +7 -0
- package/dist/lib/neutral/Key.mjs +12 -0
- package/dist/lib/neutral/Key.mjs.map +7 -0
- package/dist/lib/neutral/Obj.mjs +110 -0
- package/dist/lib/neutral/Obj.mjs.map +7 -0
- package/dist/lib/neutral/Order.mjs +12 -0
- package/dist/lib/neutral/Order.mjs.map +7 -0
- package/dist/lib/neutral/Query.mjs +35 -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 +24 -0
- package/dist/lib/neutral/Ref.mjs.map +7 -0
- package/dist/lib/neutral/Relation.mjs +93 -0
- package/dist/lib/neutral/Relation.mjs.map +7 -0
- package/dist/lib/neutral/SchemaRegistry.mjs +2 -0
- package/dist/lib/neutral/SchemaRegistry.mjs.map +7 -0
- package/dist/lib/neutral/Tag.mjs +28 -0
- package/dist/lib/neutral/Tag.mjs.map +7 -0
- package/dist/lib/neutral/Type.mjs +37 -0
- package/dist/lib/neutral/Type.mjs.map +7 -0
- package/dist/lib/neutral/chunk-43Y5DOS6.mjs +396 -0
- package/dist/lib/neutral/chunk-43Y5DOS6.mjs.map +7 -0
- package/dist/lib/neutral/chunk-724GQYEN.mjs +56 -0
- package/dist/lib/neutral/chunk-724GQYEN.mjs.map +7 -0
- package/dist/lib/neutral/chunk-ANHVGJI4.mjs +21 -0
- package/dist/lib/neutral/chunk-ANHVGJI4.mjs.map +7 -0
- package/dist/lib/neutral/chunk-B5OXLWZL.mjs +402 -0
- package/dist/lib/neutral/chunk-B5OXLWZL.mjs.map +7 -0
- package/dist/lib/neutral/chunk-BNCCGLJN.mjs +7 -0
- package/dist/lib/neutral/chunk-BNCCGLJN.mjs.map +7 -0
- package/dist/lib/neutral/chunk-BOZZPUXE.mjs +787 -0
- package/dist/lib/neutral/chunk-BOZZPUXE.mjs.map +7 -0
- package/dist/lib/neutral/chunk-CIRHIEMW.mjs +298 -0
- package/dist/lib/neutral/chunk-CIRHIEMW.mjs.map +7 -0
- package/dist/lib/neutral/chunk-DYDJBZEG.mjs +102 -0
- package/dist/lib/neutral/chunk-DYDJBZEG.mjs.map +7 -0
- package/dist/lib/neutral/chunk-FXEG7EOK.mjs +45 -0
- package/dist/lib/neutral/chunk-FXEG7EOK.mjs.map +7 -0
- package/dist/lib/neutral/chunk-FZO7LQO7.mjs +73 -0
- package/dist/lib/neutral/chunk-FZO7LQO7.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-KTAWP7GI.mjs +283 -0
- package/dist/lib/neutral/chunk-KTAWP7GI.mjs.map +7 -0
- package/dist/lib/neutral/chunk-NEGC54NE.mjs +130 -0
- package/dist/lib/neutral/chunk-NEGC54NE.mjs.map +7 -0
- package/dist/lib/neutral/chunk-NQRLRYJM.mjs +313 -0
- package/dist/lib/neutral/chunk-NQRLRYJM.mjs.map +7 -0
- package/dist/lib/neutral/chunk-NXMFBIT5.mjs +299 -0
- package/dist/lib/neutral/chunk-NXMFBIT5.mjs.map +7 -0
- package/dist/lib/neutral/chunk-OENWMTE6.mjs +45 -0
- package/dist/lib/neutral/chunk-OENWMTE6.mjs.map +7 -0
- package/dist/lib/neutral/chunk-OMUPQMLR.mjs +7 -0
- package/dist/lib/neutral/chunk-OMUPQMLR.mjs.map +7 -0
- package/dist/lib/neutral/chunk-RMLF7JOZ.mjs +97 -0
- package/dist/lib/neutral/chunk-RMLF7JOZ.mjs.map +7 -0
- package/dist/lib/neutral/chunk-SEMVAGBM.mjs +355 -0
- package/dist/lib/neutral/chunk-SEMVAGBM.mjs.map +7 -0
- package/dist/lib/neutral/chunk-TQQZLKB7.mjs +2712 -0
- package/dist/lib/neutral/chunk-TQQZLKB7.mjs.map +7 -0
- package/dist/lib/neutral/chunk-UBEZSGXY.mjs +51 -0
- package/dist/lib/neutral/chunk-UBEZSGXY.mjs.map +7 -0
- package/dist/lib/neutral/chunk-UFDK26FO.mjs +121 -0
- package/dist/lib/neutral/chunk-UFDK26FO.mjs.map +7 -0
- package/dist/lib/neutral/chunk-UI6MWK5W.mjs +42 -0
- package/dist/lib/neutral/chunk-UI6MWK5W.mjs.map +7 -0
- package/dist/lib/neutral/chunk-UTBRYVQC.mjs +27 -0
- package/dist/lib/neutral/chunk-UTBRYVQC.mjs.map +7 -0
- package/dist/lib/neutral/chunk-VA2F47ZC.mjs +152 -0
- package/dist/lib/neutral/chunk-VA2F47ZC.mjs.map +7 -0
- package/dist/lib/neutral/chunk-WYOKA6AE.mjs +67 -0
- package/dist/lib/neutral/chunk-WYOKA6AE.mjs.map +7 -0
- package/dist/lib/neutral/chunk-YWXWXIE5.mjs +34 -0
- package/dist/lib/neutral/chunk-YWXWXIE5.mjs.map +7 -0
- package/dist/lib/neutral/index.mjs +97 -0
- package/dist/lib/neutral/index.mjs.map +7 -0
- package/dist/lib/{node-esm → neutral}/internal/index.mjs +286 -148
- 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 +373 -0
- package/dist/lib/neutral/testing/index.mjs.map +7 -0
- package/dist/types/src/Annotation.d.ts +24 -0
- package/dist/types/src/Annotation.d.ts.map +1 -0
- package/dist/types/src/Collection.d.ts +16 -0
- package/dist/types/src/Collection.d.ts.map +1 -0
- package/dist/types/src/Database.d.ts +189 -0
- package/dist/types/src/Database.d.ts.map +1 -0
- package/dist/types/src/Dataset.d.ts +18 -0
- package/dist/types/src/Dataset.d.ts.map +1 -0
- package/dist/types/src/Entity.d.ts +168 -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 +165 -0
- package/dist/types/src/Feed.d.ts.map +1 -0
- package/dist/types/src/Filter.d.ts +120 -0
- package/dist/types/src/Filter.d.ts.map +1 -0
- package/dist/types/src/Format.d.ts +4 -0
- package/dist/types/src/Format.d.ts.map +1 -0
- package/dist/types/src/Hypergraph.d.ts +65 -0
- package/dist/types/src/Hypergraph.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 +1 -0
- package/dist/types/src/Key.d.ts.map +1 -1
- package/dist/types/src/Obj.d.ts +419 -101
- 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 +16 -0
- package/dist/types/src/Order.d.ts.map +1 -0
- package/dist/types/src/Query.d.ts +202 -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 +80 -0
- package/dist/types/src/QueryResult.d.ts.map +1 -0
- package/dist/types/src/Ref.d.ts +61 -11
- package/dist/types/src/Ref.d.ts.map +1 -1
- package/dist/types/src/Relation.d.ts +288 -21
- 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/SchemaRegistry.d.ts +84 -0
- package/dist/types/src/SchemaRegistry.d.ts.map +1 -0
- package/dist/types/src/Tag.d.ts +18 -0
- package/dist/types/src/Tag.d.ts.map +1 -0
- package/dist/types/src/Type.d.ts +123 -99
- 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 +68 -0
- package/dist/types/src/View.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 +19 -5
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/internal/Annotation/annotations.d.ts +230 -0
- package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -0
- package/dist/types/src/internal/Annotation/annotations.test.d.ts.map +1 -0
- package/dist/types/src/internal/Annotation/index.d.ts +4 -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 +39 -0
- package/dist/types/src/internal/Annotation/util.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/api.d.ts +13 -0
- package/dist/types/src/internal/Entity/api.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/entity.d.ts +20 -0
- package/dist/types/src/internal/Entity/entity.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/index.d.ts +8 -0
- package/dist/types/src/internal/Entity/index.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/model.d.ts +55 -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 +35 -0
- package/dist/types/src/internal/Entity/relation.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.map +1 -0
- package/dist/types/src/internal/Format/date.test.d.ts.map +1 -0
- package/dist/types/src/internal/{formats → Format}/format.d.ts +4 -2
- package/dist/types/src/internal/Format/format.d.ts.map +1 -0
- package/dist/types/src/internal/Format/format.test.d.ts.map +1 -0
- package/dist/types/src/internal/Format/index.d.ts.map +1 -0
- package/dist/types/src/internal/Format/number.d.ts.map +1 -0
- package/dist/types/src/internal/Format/object.d.ts.map +1 -0
- package/dist/types/src/internal/{formats → Format}/select.d.ts +6 -4
- package/dist/types/src/internal/Format/select.d.ts.map +1 -0
- package/dist/types/src/internal/{formats → Format}/string.d.ts +4 -0
- package/dist/types/src/internal/Format/string.d.ts.map +1 -0
- package/dist/types/src/internal/{formats → Format}/types.d.ts +14 -10
- package/dist/types/src/internal/Format/types.d.ts.map +1 -0
- package/dist/types/src/internal/{json → JsonSchema}/annotations.d.ts +1 -1
- package/dist/types/src/internal/JsonSchema/annotations.d.ts.map +1 -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.map +1 -0
- package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema-type.d.ts +131 -30
- package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -0
- package/dist/types/src/internal/{json → JsonSchema}/json-schema.d.ts +4 -2
- package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -0
- package/dist/types/src/internal/JsonSchema/json-schema.test.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.map +1 -0
- package/dist/types/src/internal/{object/create.d.ts → Obj/create-object.d.ts} +10 -11
- 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/ids.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.map +1 -0
- package/dist/types/src/internal/Obj/json-serializer.d.ts +44 -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.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.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.map +1 -0
- package/dist/types/src/internal/Ref/index.d.ts.map +1 -0
- package/dist/types/src/internal/{ref → Ref}/ref-array.d.ts +4 -4
- package/dist/types/src/internal/Ref/ref-array.d.ts.map +1 -0
- package/dist/types/src/internal/{ref → Ref}/ref.d.ts +44 -19
- package/dist/types/src/internal/Ref/ref.d.ts.map +1 -0
- package/dist/types/src/internal/Ref/ref.test.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.map +1 -0
- package/dist/types/src/internal/{schema → Type}/echo-schema.d.ts +27 -14
- package/dist/types/src/internal/Type/echo-schema.d.ts.map +1 -0
- package/dist/types/src/internal/Type/index.d.ts +4 -0
- package/dist/types/src/internal/Type/index.d.ts.map +1 -0
- package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -0
- package/dist/types/src/internal/Type/persistent-schema.d.ts +20 -0
- package/dist/types/src/internal/Type/persistent-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 +42 -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.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 +14 -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/schema-validator.d.ts.map +1 -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/{proxy → common/proxy}/typed-handler.d.ts +16 -12
- 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.map +1 -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 +37 -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/{object → common/types}/meta.d.ts +18 -16
- package/dist/types/src/internal/common/types/meta.d.ts.map +1 -0
- package/dist/types/src/internal/common/types/model-symbols.d.ts +54 -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 +21 -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/index.d.ts +9 -14
- package/dist/types/src/internal/index.d.ts.map +1 -1
- package/dist/types/src/{test → testing}/api.test.d.ts.map +1 -1
- package/dist/types/src/testing/index.d.ts +3 -3
- package/dist/types/src/testing/index.d.ts.map +1 -1
- 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 +304 -0
- package/dist/types/src/testing/test-schema.d.ts.map +1 -0
- package/dist/types/src/testing/util.d.ts +21 -0
- package/dist/types/src/testing/util.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +106 -65
- package/src/Annotation.ts +48 -0
- package/src/Collection.ts +32 -0
- package/src/Database.ts +317 -0
- package/src/Dataset.ts +26 -0
- package/src/Entity.test.ts +22 -0
- package/src/Entity.ts +237 -0
- package/src/Err.ts +40 -0
- package/src/Feed.ts +257 -0
- package/src/Filter.ts +391 -0
- package/src/Format.ts +9 -0
- package/src/Hypergraph.ts +79 -0
- package/src/JsonSchema.ts +26 -0
- package/src/Key.ts +3 -0
- package/src/Obj.test.ts +447 -0
- package/src/Obj.ts +587 -268
- package/src/Order.ts +46 -0
- package/src/Query.test.ts +632 -0
- package/src/Query.ts +522 -0
- package/src/QueryResult.ts +106 -0
- package/src/Ref.ts +79 -9
- package/src/Relation.test.ts +88 -0
- package/src/Relation.ts +443 -58
- package/src/SchemaRegistry.ts +106 -0
- package/src/{query/tag.ts → Tag.ts} +13 -9
- package/src/Type.test.ts +52 -0
- package/src/Type.ts +167 -153
- package/src/View.ts +102 -0
- package/src/hierarchy.test.ts +33 -0
- package/src/index.ts +20 -6
- package/src/internal/{ast → Annotation}/annotations.test.ts +20 -22
- package/src/internal/Annotation/annotations.ts +571 -0
- package/src/internal/Annotation/index.ts +7 -0
- package/src/internal/Annotation/sorting.ts +52 -0
- package/src/internal/Annotation/util.ts +85 -0
- package/src/internal/Entity/api.ts +31 -0
- package/src/internal/Entity/entity.ts +128 -0
- package/src/internal/Entity/index.ts +11 -0
- package/src/internal/Entity/model.ts +109 -0
- package/src/internal/Entity/object.ts +58 -0
- package/src/internal/Entity/relation.ts +154 -0
- package/src/internal/Entity/util.ts +33 -0
- package/src/internal/Entity/version.ts +97 -0
- package/src/internal/{formats → Format}/date.test.ts +1 -1
- package/src/internal/{formats → Format}/date.ts +5 -5
- package/src/internal/{formats → Format}/format.test.ts +6 -6
- package/src/internal/{formats → Format}/format.ts +8 -6
- package/src/internal/{formats → Format}/number.ts +5 -5
- package/src/internal/{formats → Format}/object.ts +4 -4
- package/src/internal/{formats → Format}/select.ts +6 -4
- package/src/internal/{formats → Format}/string.ts +14 -9
- package/src/internal/{formats → Format}/types.ts +54 -43
- package/src/internal/{json → JsonSchema}/annotations.ts +3 -3
- package/src/internal/{json-schema → JsonSchema}/index.ts +2 -0
- package/src/internal/{json-schema → JsonSchema}/json-schema-normalize.ts +4 -2
- package/src/internal/{json-schema → JsonSchema}/json-schema-type.ts +36 -36
- package/src/internal/{json → JsonSchema}/json-schema.test.ts +98 -94
- package/src/internal/{json → JsonSchema}/json-schema.ts +30 -15
- package/src/internal/Obj/clone.ts +48 -0
- package/src/internal/{object → Obj}/common.ts +3 -4
- package/src/internal/{object/create.test.ts → Obj/create-object.test.ts} +31 -33
- package/src/internal/{object/create.ts → Obj/create-object.ts} +36 -37
- package/src/internal/Obj/deleted.ts +19 -0
- package/src/internal/{object → Obj}/ids.ts +1 -1
- package/src/internal/Obj/index.ts +14 -0
- package/src/internal/{object → Obj}/inspect.ts +5 -7
- package/src/internal/Obj/json-serializer.test.ts +121 -0
- package/src/internal/{object → Obj}/json-serializer.ts +99 -109
- package/src/internal/{object → Obj}/schema-validator.test.ts +3 -7
- package/src/internal/Obj/schema-validator.ts +6 -0
- package/src/internal/Obj/set-value.test.ts +281 -0
- package/src/internal/Obj/set-value.ts +165 -0
- package/src/internal/Obj/snapshot.ts +105 -0
- package/src/internal/{object → Obj}/typed-object.test.ts +12 -12
- package/src/internal/Obj/typed-object.ts +30 -0
- package/src/internal/{ref → Ref}/ref-array.ts +4 -4
- package/src/internal/{ref → Ref}/ref.test.ts +11 -10
- package/src/internal/{ref → Ref}/ref.ts +108 -57
- package/src/internal/{projection → Type}/compose.test.ts +8 -9
- package/src/internal/{projection → Type}/compose.ts +14 -9
- package/src/internal/{schema → Type}/echo-schema.ts +74 -33
- package/src/internal/Type/index.ts +7 -0
- package/src/internal/{schema → Type}/manipulation.ts +1 -1
- package/src/internal/Type/persistent-schema.ts +33 -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 +88 -0
- package/src/internal/{testing → common}/index.ts +2 -1
- package/src/internal/common/proxy/change-context.ts +138 -0
- package/src/internal/common/proxy/change.test.ts +519 -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 +123 -0
- package/src/internal/common/proxy/index.ts +17 -0
- package/src/internal/common/proxy/json-serializer.ts +90 -0
- package/src/internal/common/proxy/make-object.ts +106 -0
- package/src/internal/common/proxy/ownership.ts +253 -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.ts +69 -0
- package/src/internal/{object → common/proxy}/schema-validator.ts +6 -3
- package/src/internal/{proxy → common/proxy}/schema.test.ts +31 -22
- 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 +449 -0
- package/src/internal/common/proxy/typed-object.test.ts +116 -0
- package/src/internal/common/types/base.ts +43 -0
- package/src/internal/common/types/entity.ts +54 -0
- package/src/internal/common/types/index.ts +10 -0
- package/src/internal/common/types/meta.ts +68 -0
- package/src/internal/common/types/model-symbols.ts +69 -0
- package/src/internal/common/types/typename.ts +55 -0
- package/src/internal/common/types/version.ts +19 -0
- package/src/internal/index.ts +11 -17
- package/src/testing/api.test.ts +126 -0
- package/src/testing/index.ts +3 -3
- package/src/testing/test-data.ts +130 -0
- package/src/testing/test-schema.ts +240 -0
- package/src/testing/util.ts +85 -0
- package/dist/lib/browser/chunk-HKFCK2GL.mjs +0 -175
- package/dist/lib/browser/chunk-HKFCK2GL.mjs.map +0 -7
- package/dist/lib/browser/chunk-MAAYELT7.mjs +0 -830
- package/dist/lib/browser/chunk-MAAYELT7.mjs.map +0 -7
- package/dist/lib/browser/chunk-MB6MMNFP.mjs +0 -3857
- package/dist/lib/browser/chunk-MB6MMNFP.mjs.map +0 -7
- package/dist/lib/browser/index.mjs +0 -35
- package/dist/lib/browser/internal/index.mjs +0 -332
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/browser/query/index.mjs +0 -15
- package/dist/lib/browser/testing/index.mjs +0 -298
- package/dist/lib/browser/testing/index.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-5NWDGIBT.mjs +0 -830
- package/dist/lib/node-esm/chunk-5NWDGIBT.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-AUAH4E2J.mjs +0 -175
- package/dist/lib/node-esm/chunk-AUAH4E2J.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-BQRA4VLX.mjs +0 -3857
- package/dist/lib/node-esm/chunk-BQRA4VLX.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -35
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/query/index.mjs +0 -15
- package/dist/lib/node-esm/testing/index.mjs +0 -298
- package/dist/lib/node-esm/testing/index.mjs.map +0 -7
- package/dist/types/src/errors.d.ts +0 -72
- package/dist/types/src/errors.d.ts.map +0 -1
- package/dist/types/src/internal/ast/annotation-helper.d.ts +0 -8
- package/dist/types/src/internal/ast/annotation-helper.d.ts.map +0 -1
- package/dist/types/src/internal/ast/annotations.d.ts +0 -125
- package/dist/types/src/internal/ast/annotations.d.ts.map +0 -1
- package/dist/types/src/internal/ast/annotations.test.d.ts.map +0 -1
- package/dist/types/src/internal/ast/entity-kind.d.ts +0 -10
- package/dist/types/src/internal/ast/entity-kind.d.ts.map +0 -1
- package/dist/types/src/internal/ast/index.d.ts +0 -5
- package/dist/types/src/internal/ast/index.d.ts.map +0 -1
- package/dist/types/src/internal/ast/types.d.ts +0 -6
- package/dist/types/src/internal/ast/types.d.ts.map +0 -1
- package/dist/types/src/internal/formats/date.d.ts.map +0 -1
- package/dist/types/src/internal/formats/date.test.d.ts.map +0 -1
- package/dist/types/src/internal/formats/format.d.ts.map +0 -1
- package/dist/types/src/internal/formats/format.test.d.ts.map +0 -1
- package/dist/types/src/internal/formats/index.d.ts.map +0 -1
- package/dist/types/src/internal/formats/number.d.ts.map +0 -1
- package/dist/types/src/internal/formats/object.d.ts.map +0 -1
- package/dist/types/src/internal/formats/select.d.ts.map +0 -1
- package/dist/types/src/internal/formats/string.d.ts.map +0 -1
- package/dist/types/src/internal/formats/types.d.ts.map +0 -1
- package/dist/types/src/internal/json/annotations.d.ts.map +0 -1
- package/dist/types/src/internal/json/effect-schema.test.d.ts.map +0 -1
- package/dist/types/src/internal/json/index.d.ts +0 -2
- package/dist/types/src/internal/json/index.d.ts.map +0 -1
- package/dist/types/src/internal/json/json-schema.d.ts.map +0 -1
- package/dist/types/src/internal/json/json-schema.test.d.ts.map +0 -1
- package/dist/types/src/internal/json-schema/index.d.ts +0 -3
- package/dist/types/src/internal/json-schema/index.d.ts.map +0 -1
- package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts.map +0 -1
- package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +0 -1
- package/dist/types/src/internal/object/accessors.d.ts +0 -37
- package/dist/types/src/internal/object/accessors.d.ts.map +0 -1
- package/dist/types/src/internal/object/common.d.ts.map +0 -1
- package/dist/types/src/internal/object/create.d.ts.map +0 -1
- package/dist/types/src/internal/object/create.test.d.ts +0 -2
- package/dist/types/src/internal/object/create.test.d.ts.map +0 -1
- package/dist/types/src/internal/object/deleted.d.ts +0 -6
- package/dist/types/src/internal/object/deleted.d.ts.map +0 -1
- package/dist/types/src/internal/object/entity.d.ts +0 -33
- package/dist/types/src/internal/object/entity.d.ts.map +0 -1
- package/dist/types/src/internal/object/expando.d.ts +0 -14
- package/dist/types/src/internal/object/expando.d.ts.map +0 -1
- package/dist/types/src/internal/object/ids.d.ts.map +0 -1
- package/dist/types/src/internal/object/index.d.ts +0 -16
- package/dist/types/src/internal/object/index.d.ts.map +0 -1
- package/dist/types/src/internal/object/inspect.d.ts.map +0 -1
- package/dist/types/src/internal/object/json-serializer.d.ts +0 -32
- package/dist/types/src/internal/object/json-serializer.d.ts.map +0 -1
- package/dist/types/src/internal/object/json-serializer.test.d.ts.map +0 -1
- package/dist/types/src/internal/object/meta.d.ts.map +0 -1
- package/dist/types/src/internal/object/model.d.ts +0 -117
- package/dist/types/src/internal/object/model.d.ts.map +0 -1
- package/dist/types/src/internal/object/relation.d.ts +0 -17
- package/dist/types/src/internal/object/relation.d.ts.map +0 -1
- package/dist/types/src/internal/object/schema-validator.d.ts.map +0 -1
- package/dist/types/src/internal/object/schema-validator.test.d.ts.map +0 -1
- package/dist/types/src/internal/object/typed-object.d.ts +0 -31
- package/dist/types/src/internal/object/typed-object.d.ts.map +0 -1
- package/dist/types/src/internal/object/typed-object.test.d.ts.map +0 -1
- package/dist/types/src/internal/object/typename.d.ts +0 -15
- package/dist/types/src/internal/object/typename.d.ts.map +0 -1
- package/dist/types/src/internal/object/version.d.ts +0 -14
- package/dist/types/src/internal/object/version.d.ts.map +0 -1
- package/dist/types/src/internal/projection/compose.d.ts +0 -6
- package/dist/types/src/internal/projection/compose.d.ts.map +0 -1
- package/dist/types/src/internal/projection/compose.test.d.ts.map +0 -1
- package/dist/types/src/internal/projection/index.d.ts +0 -2
- package/dist/types/src/internal/projection/index.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/handler.test.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/reactive-object.d.ts +0 -15
- package/dist/types/src/internal/proxy/reactive-object.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/schema.test.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/typed-handler.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/typed-handler.test.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/typed-object.test.d.ts.map +0 -1
- package/dist/types/src/internal/query/index.d.ts +0 -2
- package/dist/types/src/internal/query/index.d.ts.map +0 -1
- package/dist/types/src/internal/query/query.d.ts +0 -17
- package/dist/types/src/internal/query/query.d.ts.map +0 -1
- package/dist/types/src/internal/ref/index.d.ts.map +0 -1
- package/dist/types/src/internal/ref/ref-array.d.ts.map +0 -1
- package/dist/types/src/internal/ref/ref.d.ts.map +0 -1
- package/dist/types/src/internal/ref/ref.test.d.ts.map +0 -1
- package/dist/types/src/internal/schema/echo-schema.d.ts.map +0 -1
- package/dist/types/src/internal/schema/index.d.ts +0 -7
- package/dist/types/src/internal/schema/index.d.ts.map +0 -1
- package/dist/types/src/internal/schema/manipulation.d.ts.map +0 -1
- package/dist/types/src/internal/schema/runtime-schema-registry.d.ts +0 -18
- package/dist/types/src/internal/schema/runtime-schema-registry.d.ts.map +0 -1
- package/dist/types/src/internal/schema/snapshot.d.ts +0 -6
- package/dist/types/src/internal/schema/snapshot.d.ts.map +0 -1
- package/dist/types/src/internal/schema/stored-schema.d.ts +0 -13
- package/dist/types/src/internal/schema/stored-schema.d.ts.map +0 -1
- package/dist/types/src/internal/testing/index.d.ts +0 -3
- package/dist/types/src/internal/testing/index.d.ts.map +0 -1
- package/dist/types/src/internal/testing/types.d.ts +0 -455
- package/dist/types/src/internal/testing/types.d.ts.map +0 -1
- package/dist/types/src/internal/testing/utils.d.ts +0 -10
- package/dist/types/src/internal/testing/utils.d.ts.map +0 -1
- package/dist/types/src/internal/types/index.d.ts +0 -3
- package/dist/types/src/internal/types/index.d.ts.map +0 -1
- package/dist/types/src/internal/types/types.d.ts +0 -79
- package/dist/types/src/internal/types/types.d.ts.map +0 -1
- package/dist/types/src/internal/types/types.test.d.ts +0 -2
- package/dist/types/src/internal/types/types.test.d.ts.map +0 -1
- package/dist/types/src/internal/types/util.d.ts +0 -5
- package/dist/types/src/internal/types/util.d.ts.map +0 -1
- package/dist/types/src/query/index.d.ts +0 -3
- package/dist/types/src/query/index.d.ts.map +0 -1
- package/dist/types/src/query/query.d.ts +0 -248
- package/dist/types/src/query/query.d.ts.map +0 -1
- package/dist/types/src/query/query.test.d.ts +0 -2
- package/dist/types/src/query/query.test.d.ts.map +0 -1
- package/dist/types/src/query/tag.d.ts +0 -17
- package/dist/types/src/query/tag.d.ts.map +0 -1
- package/dist/types/src/testing/echo-schema.d.ts +0 -7
- package/dist/types/src/testing/echo-schema.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/errors.ts +0 -18
- package/src/internal/ast/annotation-helper.ts +0 -22
- package/src/internal/ast/annotations.ts +0 -219
- package/src/internal/ast/entity-kind.ts +0 -15
- package/src/internal/ast/index.ts +0 -8
- package/src/internal/ast/types.ts +0 -17
- package/src/internal/json/index.ts +0 -5
- package/src/internal/object/accessors.ts +0 -153
- package/src/internal/object/deleted.ts +0 -19
- package/src/internal/object/entity.ts +0 -248
- package/src/internal/object/expando.ts +0 -21
- package/src/internal/object/index.ts +0 -19
- package/src/internal/object/json-serializer.test.ts +0 -99
- package/src/internal/object/meta.ts +0 -61
- package/src/internal/object/model.ts +0 -170
- package/src/internal/object/relation.ts +0 -24
- package/src/internal/object/typed-object.ts +0 -88
- package/src/internal/object/typename.ts +0 -61
- package/src/internal/object/version.ts +0 -22
- package/src/internal/projection/index.ts +0 -5
- package/src/internal/proxy/handler.test.ts +0 -163
- package/src/internal/proxy/reactive-object.ts +0 -108
- package/src/internal/proxy/typed-handler.test.ts +0 -102
- package/src/internal/proxy/typed-handler.ts +0 -228
- package/src/internal/proxy/typed-object.test.ts +0 -100
- package/src/internal/query/index.ts +0 -5
- package/src/internal/query/query.ts +0 -23
- package/src/internal/schema/index.ts +0 -10
- package/src/internal/schema/runtime-schema-registry.ts +0 -78
- package/src/internal/schema/snapshot.ts +0 -25
- package/src/internal/schema/stored-schema.ts +0 -26
- package/src/internal/testing/types.ts +0 -211
- package/src/internal/testing/utils.ts +0 -54
- package/src/internal/types/index.ts +0 -6
- package/src/internal/types/types.test.ts +0 -48
- package/src/internal/types/types.ts +0 -176
- package/src/internal/types/util.ts +0 -9
- package/src/query/index.ts +0 -6
- package/src/query/query.test.ts +0 -401
- package/src/query/query.ts +0 -789
- package/src/test/api.test.ts +0 -180
- package/src/testing/echo-schema.ts +0 -39
- package/src/testing/types.ts +0 -91
- /package/dist/lib/{browser/index.mjs.map → neutral/Annotation.mjs.map} +0 -0
- /package/dist/lib/{browser/internal/index.mjs.map → neutral/Database.mjs.map} +0 -0
- /package/dist/lib/{browser/query/index.mjs.map → neutral/Entity.mjs.map} +0 -0
- /package/dist/lib/{node-esm/index.mjs.map → neutral/Err.mjs.map} +0 -0
- /package/dist/lib/{node-esm/internal/index.mjs.map → neutral/Feed.mjs.map} +0 -0
- /package/dist/lib/{node-esm/query/index.mjs.map → neutral/Filter.mjs.map} +0 -0
- /package/dist/types/src/internal/{ast → Annotation}/annotations.test.d.ts +0 -0
- /package/dist/types/src/internal/{formats → Format}/date.d.ts +0 -0
- /package/dist/types/src/internal/{formats → Format}/date.test.d.ts +0 -0
- /package/dist/types/src/internal/{formats → Format}/format.test.d.ts +0 -0
- /package/dist/types/src/internal/{formats → Format}/index.d.ts +0 -0
- /package/dist/types/src/internal/{formats → Format}/number.d.ts +0 -0
- /package/dist/types/src/internal/{formats → Format}/object.d.ts +0 -0
- /package/dist/types/src/internal/{json → JsonSchema}/effect-schema.test.d.ts +0 -0
- /package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema-normalize.d.ts +0 -0
- /package/dist/types/src/internal/{json → JsonSchema}/json-schema.test.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/common.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/ids.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/inspect.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/json-serializer.test.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/schema-validator.test.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/typed-object.test.d.ts +0 -0
- /package/dist/types/src/internal/{ref → Ref}/index.d.ts +0 -0
- /package/dist/types/src/internal/{ref → Ref}/ref.test.d.ts +0 -0
- /package/dist/types/src/internal/{projection → Type}/compose.test.d.ts +0 -0
- /package/dist/types/src/internal/{schema → Type}/manipulation.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/handler.test.d.ts +0 -0
- /package/dist/types/src/internal/{object → common/proxy}/schema-validator.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/schema.test.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/typed-handler.test.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/typed-object.test.d.ts +0 -0
- /package/dist/types/src/{test → testing}/api.test.d.ts +0 -0
- /package/src/internal/{formats → Format}/index.ts +0 -0
- /package/src/internal/{json → JsonSchema}/effect-schema.test.ts +0 -0
- /package/src/internal/{ref → Ref}/index.ts +0 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { invariant } from '@dxos/invariant';
|
|
6
|
+
import { type DXN } from '@dxos/keys';
|
|
7
|
+
import { assumeType } from '@dxos/util';
|
|
8
|
+
|
|
9
|
+
import type { AnyEntity } from '../common/types';
|
|
10
|
+
|
|
11
|
+
import { type InternalObjectProps, ObjectDatabaseId } from './model';
|
|
12
|
+
import { getObjectDXN } from './util';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Get the DXN of an entity.
|
|
16
|
+
* Accepts both reactive entities and snapshots.
|
|
17
|
+
*/
|
|
18
|
+
export const getDXN = (entity: AnyEntity): DXN => {
|
|
19
|
+
const dxn = getObjectDXN(entity);
|
|
20
|
+
invariant(dxn != null, 'Invalid entity.');
|
|
21
|
+
return dxn;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Get the database the entity belongs to.
|
|
26
|
+
* Accepts both reactive entities and snapshots.
|
|
27
|
+
*/
|
|
28
|
+
export const getDatabase = (entity: AnyEntity): any | undefined => {
|
|
29
|
+
assumeType<InternalObjectProps>(entity);
|
|
30
|
+
return entity[ObjectDatabaseId];
|
|
31
|
+
};
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
import type * as SchemaAST from 'effect/SchemaAST';
|
|
7
|
+
import type * as Types from 'effect/Types';
|
|
8
|
+
|
|
9
|
+
import { type ToMutable } from '@dxos/util';
|
|
10
|
+
|
|
11
|
+
import { type TypeMeta } from '../Annotation';
|
|
12
|
+
import { type AnyEntity, type EntityKind, SchemaKindId } from '../common/types';
|
|
13
|
+
|
|
14
|
+
// TODO(burdon): Define Schema type for `typename` and use consistently for all DXN-like properties.
|
|
15
|
+
|
|
16
|
+
// type RequiredKeys<T> = { [K in keyof T]-?: {} extends Pick<T, K> ? never : K }[keyof T];
|
|
17
|
+
export type EchoTypeSchemaProps<T, ExtraFields = {}> = Types.Simplify<AnyEntity & ToMutable<T> & ExtraFields>;
|
|
18
|
+
|
|
19
|
+
// TODO(burdon): Rename EchoEntitySchema.
|
|
20
|
+
export interface EchoTypeSchema<
|
|
21
|
+
Self extends Schema.Schema.Any,
|
|
22
|
+
ExtraFields = {},
|
|
23
|
+
K extends EntityKind = EntityKind,
|
|
24
|
+
Fields extends Schema.Struct.Fields = Schema.Struct.Fields,
|
|
25
|
+
>
|
|
26
|
+
extends
|
|
27
|
+
TypeMeta,
|
|
28
|
+
Schema.AnnotableClass<
|
|
29
|
+
EchoTypeSchema<Self, ExtraFields, K, Fields>,
|
|
30
|
+
EchoTypeSchemaProps<Schema.Schema.Type<Self>, ExtraFields>,
|
|
31
|
+
EchoTypeSchemaProps<Schema.Schema.Encoded<Self>, ExtraFields>,
|
|
32
|
+
Schema.Schema.Context<Self>
|
|
33
|
+
> {
|
|
34
|
+
/**
|
|
35
|
+
* Schema kind key that marks this as an ECHO schema and indicates its kind.
|
|
36
|
+
* Makes EchoTypeSchema satisfy the Type.AnyObj or Type.Relation.Any type.
|
|
37
|
+
*/
|
|
38
|
+
readonly [SchemaKindId]: K;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* The fields defined in the original struct schema.
|
|
42
|
+
* Allows accessing field definitions for introspection.
|
|
43
|
+
*/
|
|
44
|
+
readonly fields: Fields;
|
|
45
|
+
|
|
46
|
+
instanceOf(value: unknown): boolean;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// type MakeProps =
|
|
50
|
+
// | boolean
|
|
51
|
+
// | {
|
|
52
|
+
// readonly disableValidation?: boolean;
|
|
53
|
+
// };
|
|
54
|
+
|
|
55
|
+
// NOTE: Utils copied from Effect `Schema.ts`.
|
|
56
|
+
// const _ownKeys = (o: object): Array<PropertyKey> =>
|
|
57
|
+
// (Object.keys(o) as Array<PropertyKey>).concat(Object.getOwnPropertySymbols(o));
|
|
58
|
+
|
|
59
|
+
// const _lazilyMergeDefaults = (
|
|
60
|
+
// fields: Schema.Struct.Fields,
|
|
61
|
+
// out: Record<PropertyKey, unknown>,
|
|
62
|
+
// ): { [x: string | symbol]: unknown } => {
|
|
63
|
+
// const ownKeys = _ownKeys(fields);
|
|
64
|
+
// for (const key of ownKeys) {
|
|
65
|
+
// const field = fields[key];
|
|
66
|
+
// if (out[key] === undefined && Schema.isPropertySignature(field)) {
|
|
67
|
+
// const ast = field.ast;
|
|
68
|
+
// const defaultValue = ast._tag === 'PropertySignatureDeclaration' ? ast.defaultValue : ast.to.defaultValue;
|
|
69
|
+
// if (defaultValue !== undefined) {
|
|
70
|
+
// out[key] = defaultValue();
|
|
71
|
+
// }
|
|
72
|
+
// }
|
|
73
|
+
// }
|
|
74
|
+
// return out;
|
|
75
|
+
// };
|
|
76
|
+
|
|
77
|
+
// const _getDisableValidationMakeOption = (options: MakeProps | undefined): boolean =>
|
|
78
|
+
// Predicate.isBoolean(options) ? options : options?.disableValidation ?? false;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* @internal
|
|
82
|
+
*/
|
|
83
|
+
export const makeEchoTypeSchema = <
|
|
84
|
+
Self extends Schema.Schema.Any,
|
|
85
|
+
K extends EntityKind = EntityKind,
|
|
86
|
+
// TODO(wittjosiah): Can this be inferred from the schema?
|
|
87
|
+
Fields extends Schema.Struct.Fields = Schema.Struct.Fields,
|
|
88
|
+
>(
|
|
89
|
+
fields: Fields,
|
|
90
|
+
ast: SchemaAST.AST,
|
|
91
|
+
typename: string,
|
|
92
|
+
version: string,
|
|
93
|
+
kind: K,
|
|
94
|
+
): EchoTypeSchema<Self, {}, K, Fields> => {
|
|
95
|
+
return class EchoObjectSchemaClass extends Schema.make<
|
|
96
|
+
EchoTypeSchemaProps<Schema.Schema.Type<Self>>,
|
|
97
|
+
EchoTypeSchemaProps<Schema.Schema.Encoded<Self>>,
|
|
98
|
+
Schema.Schema.Context<Self>
|
|
99
|
+
>(ast) {
|
|
100
|
+
static readonly typename = typename;
|
|
101
|
+
static readonly version = version;
|
|
102
|
+
static readonly [SchemaKindId] = kind;
|
|
103
|
+
static readonly fields = fields;
|
|
104
|
+
|
|
105
|
+
static override annotations(
|
|
106
|
+
annotations: Schema.Annotations.GenericSchema<EchoTypeSchemaProps<Schema.Schema.Type<Self>>>,
|
|
107
|
+
): EchoTypeSchema<Self, {}, K, Fields> {
|
|
108
|
+
const schema = Schema.make<EchoTypeSchemaProps<Schema.Schema.Type<Self>>>(ast).annotations(annotations);
|
|
109
|
+
return makeEchoTypeSchema<Self, K, Fields>(fields, schema.ast, typename, version, kind);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// static make(
|
|
113
|
+
// props: RequiredKeys<Schema.TypeLiteral.Constructor<Fields, []>> extends never
|
|
114
|
+
// ? void | Simplify<Schema.TypeLiteral.Constructor<Fields, []>>
|
|
115
|
+
// : Simplify<Schema.TypeLiteral.Constructor<Fields, []>>,
|
|
116
|
+
// options?: MakeProps,
|
|
117
|
+
// ): Simplify<Schema.TypeLiteral.Type<Fields, []>> {
|
|
118
|
+
// const propsWithDefaults: any = _lazilyMergeDefaults(fields, { ...(props as any) });
|
|
119
|
+
// return _getDisableValidationMakeOption(options)
|
|
120
|
+
// ? propsWithDefaults
|
|
121
|
+
// : ParseResult.validateSync(this)(propsWithDefaults);
|
|
122
|
+
// }
|
|
123
|
+
|
|
124
|
+
static instanceOf(value: unknown): boolean {
|
|
125
|
+
return Schema.is(this)(value);
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
};
|
|
@@ -0,0 +1,109 @@
|
|
|
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 { DXN, ObjectId } from '@dxos/keys';
|
|
10
|
+
import { assumeType } from '@dxos/util';
|
|
11
|
+
|
|
12
|
+
import type * as Database from '../../Database';
|
|
13
|
+
import {
|
|
14
|
+
type ATTR_META,
|
|
15
|
+
type ATTR_PARENT,
|
|
16
|
+
type ATTR_TYPE,
|
|
17
|
+
ATTR_DELETED,
|
|
18
|
+
ATTR_RELATION_SOURCE,
|
|
19
|
+
ATTR_RELATION_TARGET,
|
|
20
|
+
ATTR_SELF_DXN,
|
|
21
|
+
EntityKind,
|
|
22
|
+
KindId,
|
|
23
|
+
type MetaId,
|
|
24
|
+
ObjectDatabaseId,
|
|
25
|
+
ObjectDeletedId,
|
|
26
|
+
type ObjectMeta,
|
|
27
|
+
ObjectVersionId,
|
|
28
|
+
type ParentId,
|
|
29
|
+
RelationSourceDXNId,
|
|
30
|
+
RelationSourceId,
|
|
31
|
+
RelationTargetDXNId,
|
|
32
|
+
RelationTargetId,
|
|
33
|
+
type SchemaId,
|
|
34
|
+
SelfDXNId,
|
|
35
|
+
TypeId,
|
|
36
|
+
type Version,
|
|
37
|
+
} from '../common/types';
|
|
38
|
+
|
|
39
|
+
export { ATTR_DELETED, ATTR_SELF_DXN, ObjectDatabaseId, ObjectDeletedId, ObjectVersionId, SelfDXNId };
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Internal runtime representation of an object.
|
|
43
|
+
* The fields are accessed through getter functions.
|
|
44
|
+
*/
|
|
45
|
+
// NOTE: Each symbol has a jsdoc describing its purpose.
|
|
46
|
+
export interface InternalObjectProps {
|
|
47
|
+
readonly id: ObjectId;
|
|
48
|
+
readonly [SelfDXNId]: DXN;
|
|
49
|
+
readonly [KindId]: EntityKind;
|
|
50
|
+
readonly [SchemaId]: Schema.Schema.AnyNoContext;
|
|
51
|
+
readonly [TypeId]: DXN;
|
|
52
|
+
readonly [MetaId]?: ObjectMeta;
|
|
53
|
+
[ParentId]?: InternalObjectProps;
|
|
54
|
+
readonly [ObjectDatabaseId]?: Database.Database;
|
|
55
|
+
readonly [ObjectDeletedId]?: boolean;
|
|
56
|
+
readonly [ObjectVersionId]?: Version;
|
|
57
|
+
readonly [RelationSourceDXNId]?: DXN;
|
|
58
|
+
readonly [RelationTargetDXNId]?: DXN;
|
|
59
|
+
readonly [RelationSourceId]?: InternalObjectProps;
|
|
60
|
+
readonly [RelationTargetId]?: InternalObjectProps;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Entity metadata.
|
|
65
|
+
*/
|
|
66
|
+
export interface ObjectMetaJSON {
|
|
67
|
+
keys: ForeignKey[];
|
|
68
|
+
tags?: string[];
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* JSON representation of an object or relation metadata.
|
|
73
|
+
*/
|
|
74
|
+
export interface ObjectJSON {
|
|
75
|
+
id: string;
|
|
76
|
+
[ATTR_TYPE]: DXN.String;
|
|
77
|
+
[ATTR_SELF_DXN]?: DXN.String;
|
|
78
|
+
[ATTR_PARENT]?: string; // Encoded reference
|
|
79
|
+
[ATTR_DELETED]?: boolean;
|
|
80
|
+
[ATTR_META]?: ObjectMetaJSON;
|
|
81
|
+
[ATTR_RELATION_SOURCE]?: DXN.String;
|
|
82
|
+
[ATTR_RELATION_TARGET]?: DXN.String;
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Application-specific properties.
|
|
86
|
+
*/
|
|
87
|
+
[key: string]: unknown;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* NOTE: Keep as `function` to avoid type inference issues.
|
|
92
|
+
*/
|
|
93
|
+
export function assertObjectModel(obj: unknown): asserts obj is InternalObjectProps {
|
|
94
|
+
invariant(typeof obj === 'object' && obj !== null, 'Invalid object model: not an object');
|
|
95
|
+
assumeType<InternalObjectProps>(obj);
|
|
96
|
+
invariant(ObjectId.isValid(obj.id), 'Invalid object model: invalid id');
|
|
97
|
+
invariant(obj[TypeId] === undefined || obj[TypeId] instanceof DXN, 'Invalid object model: invalid type');
|
|
98
|
+
invariant(
|
|
99
|
+
obj[KindId] === EntityKind.Object || obj[KindId] === EntityKind.Relation,
|
|
100
|
+
'Invalid object model: invalid entity kind',
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
if (obj[KindId] === EntityKind.Relation) {
|
|
104
|
+
invariant(obj[RelationSourceDXNId] instanceof DXN, 'Invalid object model: invalid relation source');
|
|
105
|
+
invariant(obj[RelationTargetDXNId] instanceof DXN, 'Invalid object model: invalid relation target');
|
|
106
|
+
invariant(!(obj[RelationSourceId] instanceof DXN), 'Invalid object model: source pointer is a DXN');
|
|
107
|
+
invariant(!(obj[RelationTargetId] instanceof DXN), 'Invalid object model: target pointer is a DXN');
|
|
108
|
+
}
|
|
109
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
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
|
+
|
|
10
|
+
import { type TypeAnnotation, TypeAnnotationId, type TypeMeta, makeTypeJsonSchemaAnnotation } from '../Annotation';
|
|
11
|
+
import { EntityKind } from '../common/types';
|
|
12
|
+
|
|
13
|
+
import { type EchoTypeSchema, makeEchoTypeSchema } from './entity';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Object schema type with kind marker.
|
|
17
|
+
*/
|
|
18
|
+
export type EchoObjectSchema<
|
|
19
|
+
Self extends Schema.Schema.Any,
|
|
20
|
+
Fields extends Schema.Struct.Fields = Schema.Struct.Fields,
|
|
21
|
+
> = EchoTypeSchema<Self, {}, EntityKind.Object, Fields>;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Schema for Obj entity types.
|
|
25
|
+
* Pipeable function to add ECHO object annotations to a schema.
|
|
26
|
+
*/
|
|
27
|
+
export const EchoObjectSchema: {
|
|
28
|
+
(
|
|
29
|
+
meta: TypeMeta,
|
|
30
|
+
): <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(
|
|
31
|
+
self: Self & { fields?: Fields },
|
|
32
|
+
) => EchoObjectSchema<Self, Fields>;
|
|
33
|
+
} = ({ typename, version }) => {
|
|
34
|
+
return <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(
|
|
35
|
+
self: Self & { fields?: Fields },
|
|
36
|
+
): EchoObjectSchema<Self, Fields> => {
|
|
37
|
+
invariant(typeof TypeAnnotationId === 'symbol', 'Sanity.');
|
|
38
|
+
invariant(SchemaAST.isTypeLiteral(self.ast), 'Schema must be a TypeLiteral.');
|
|
39
|
+
|
|
40
|
+
// Extract fields from the schema if available (Struct schemas have .fields).
|
|
41
|
+
const fields = ((self as any).fields ?? {}) as Fields;
|
|
42
|
+
|
|
43
|
+
const schemaWithId = Schema.extend(self, Schema.Struct({ id: Schema.String }));
|
|
44
|
+
const ast = SchemaAST.annotations(schemaWithId.ast, {
|
|
45
|
+
// TODO(dmaretskyi): `extend` kills the annotations.
|
|
46
|
+
...self.ast.annotations,
|
|
47
|
+
[TypeAnnotationId]: { kind: EntityKind.Object, typename, version } satisfies TypeAnnotation,
|
|
48
|
+
// TODO(dmaretskyi): TypeIdentifierAnnotationId?
|
|
49
|
+
[SchemaAST.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
|
|
50
|
+
kind: EntityKind.Object,
|
|
51
|
+
typename,
|
|
52
|
+
version,
|
|
53
|
+
}),
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
return makeEchoTypeSchema<Self, EntityKind.Object, Fields>(fields, ast, typename, version, EntityKind.Object);
|
|
57
|
+
};
|
|
58
|
+
};
|
|
@@ -0,0 +1,154 @@
|
|
|
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 } from '@dxos/keys';
|
|
11
|
+
|
|
12
|
+
import {
|
|
13
|
+
type TypeAnnotation,
|
|
14
|
+
TypeAnnotationId,
|
|
15
|
+
type TypeMeta,
|
|
16
|
+
getEntityKind,
|
|
17
|
+
getSchemaTypename,
|
|
18
|
+
getTypeIdentifierAnnotation,
|
|
19
|
+
makeTypeJsonSchemaAnnotation,
|
|
20
|
+
} from '../Annotation';
|
|
21
|
+
import {
|
|
22
|
+
ATTR_RELATION_SOURCE,
|
|
23
|
+
ATTR_RELATION_TARGET,
|
|
24
|
+
EntityKind,
|
|
25
|
+
RelationSourceDXNId,
|
|
26
|
+
RelationSourceId,
|
|
27
|
+
RelationTargetDXNId,
|
|
28
|
+
RelationTargetId,
|
|
29
|
+
} from '../common/types';
|
|
30
|
+
|
|
31
|
+
export {
|
|
32
|
+
ATTR_RELATION_SOURCE,
|
|
33
|
+
ATTR_RELATION_TARGET,
|
|
34
|
+
RelationSourceDXNId,
|
|
35
|
+
RelationSourceId,
|
|
36
|
+
RelationTargetDXNId,
|
|
37
|
+
RelationTargetId,
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
import { type EchoTypeSchema, makeEchoTypeSchema } from './entity';
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Source and target props on relations.
|
|
44
|
+
*/
|
|
45
|
+
// TODO(burdon): any?
|
|
46
|
+
export type RelationSourceTargetRefs<Source = any, Target = any> = {
|
|
47
|
+
/**
|
|
48
|
+
* Source ECHO live object.
|
|
49
|
+
*/
|
|
50
|
+
[RelationSourceId]: Source;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Target ECHO live object.
|
|
54
|
+
*/
|
|
55
|
+
[RelationTargetId]: Target;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export type RelationSource<R> = R extends RelationSourceTargetRefs<infer Source, infer _Target> ? Source : never;
|
|
59
|
+
export type RelationTarget<R> = R extends RelationSourceTargetRefs<infer _Source, infer Target> ? Target : never;
|
|
60
|
+
|
|
61
|
+
export type EchoRelationSchemaOptions<
|
|
62
|
+
TSource extends Schema.Schema.AnyNoContext,
|
|
63
|
+
TTarget extends Schema.Schema.AnyNoContext,
|
|
64
|
+
> = TypeMeta & {
|
|
65
|
+
source: TSource;
|
|
66
|
+
target: TTarget;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Relation schema type with kind marker.
|
|
71
|
+
*/
|
|
72
|
+
export type EchoRelationSchema<
|
|
73
|
+
Self extends Schema.Schema.Any,
|
|
74
|
+
Source extends Schema.Schema.AnyNoContext,
|
|
75
|
+
Target extends Schema.Schema.AnyNoContext,
|
|
76
|
+
Fields extends Schema.Struct.Fields = Schema.Struct.Fields,
|
|
77
|
+
> = EchoTypeSchema<
|
|
78
|
+
Self,
|
|
79
|
+
RelationSourceTargetRefs<Schema.Schema.Type<Source>, Schema.Schema.Type<Target>>,
|
|
80
|
+
EntityKind.Relation,
|
|
81
|
+
Fields
|
|
82
|
+
>;
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Schema for Relation entity types.
|
|
86
|
+
*/
|
|
87
|
+
export const EchoRelationSchema = <
|
|
88
|
+
Source extends Schema.Schema.AnyNoContext,
|
|
89
|
+
Target extends Schema.Schema.AnyNoContext,
|
|
90
|
+
>({
|
|
91
|
+
source,
|
|
92
|
+
target,
|
|
93
|
+
typename,
|
|
94
|
+
version,
|
|
95
|
+
}: EchoRelationSchemaOptions<Source, Target>) => {
|
|
96
|
+
assertArgument(Schema.isSchema(source), 'source');
|
|
97
|
+
assertArgument(Schema.isSchema(target), 'target');
|
|
98
|
+
const sourceDXN = getDXNForRelationSchemaRef(source);
|
|
99
|
+
const targetDXN = getDXNForRelationSchemaRef(target);
|
|
100
|
+
if (getEntityKind(source) !== EntityKind.Object) {
|
|
101
|
+
raise(new Error('Source schema must be an echo object schema.'));
|
|
102
|
+
}
|
|
103
|
+
if (getEntityKind(target) !== EntityKind.Object) {
|
|
104
|
+
raise(new Error('Target schema must be an echo object schema.'));
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(
|
|
108
|
+
self: Self & { fields?: Fields },
|
|
109
|
+
): EchoRelationSchema<Self, Source, Target, Fields> => {
|
|
110
|
+
invariant(SchemaAST.isTypeLiteral(self.ast), 'Schema must be a TypeLiteral.');
|
|
111
|
+
|
|
112
|
+
// Extract fields from the schema if available (Struct schemas have .fields).
|
|
113
|
+
const fields = ((self as any).fields ?? {}) as Fields;
|
|
114
|
+
|
|
115
|
+
const schemaWithId = Schema.extend(self, Schema.Struct({ id: Schema.String }));
|
|
116
|
+
const ast = SchemaAST.annotations(schemaWithId.ast, {
|
|
117
|
+
// TODO(dmaretskyi): `extend` kills the annotations.
|
|
118
|
+
...self.ast.annotations,
|
|
119
|
+
[TypeAnnotationId]: {
|
|
120
|
+
kind: EntityKind.Relation,
|
|
121
|
+
typename,
|
|
122
|
+
version,
|
|
123
|
+
sourceSchema: sourceDXN,
|
|
124
|
+
targetSchema: targetDXN,
|
|
125
|
+
} satisfies TypeAnnotation,
|
|
126
|
+
// TODO(dmaretskyi): TypeIdentifierAnnotationId?
|
|
127
|
+
|
|
128
|
+
[SchemaAST.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
|
|
129
|
+
kind: EntityKind.Relation,
|
|
130
|
+
typename,
|
|
131
|
+
version,
|
|
132
|
+
relationSource: sourceDXN,
|
|
133
|
+
relationTarget: targetDXN,
|
|
134
|
+
}),
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
return makeEchoTypeSchema<Self, EntityKind.Relation, Fields>(fields, ast, typename, version, EntityKind.Relation);
|
|
138
|
+
};
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
const getDXNForRelationSchemaRef = (schema: Schema.Schema.Any): string => {
|
|
142
|
+
assertArgument(Schema.isSchema(schema), 'schema');
|
|
143
|
+
const identifier = getTypeIdentifierAnnotation(schema);
|
|
144
|
+
if (identifier) {
|
|
145
|
+
return identifier;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const typename = getSchemaTypename(schema);
|
|
149
|
+
if (!typename) {
|
|
150
|
+
throw new Error('Schema must have a typename');
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return DXN.fromTypename(typename).toString();
|
|
154
|
+
};
|
|
@@ -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 { DXN, ObjectId } from '@dxos/keys';
|
|
9
|
+
import { assumeType } from '@dxos/util';
|
|
10
|
+
|
|
11
|
+
import { type InternalObjectProps, SelfDXNId } from './model';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Returns a DXN for an object or schema.
|
|
15
|
+
*
|
|
16
|
+
* @internal
|
|
17
|
+
*/
|
|
18
|
+
export const getObjectDXN = (object: any): DXN | 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[SelfDXNId]) {
|
|
24
|
+
invariant(object[SelfDXNId] instanceof DXN, 'Invalid object model: invalid self dxn');
|
|
25
|
+
return object[SelfDXNId];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (!ObjectId.isValid(object.id)) {
|
|
29
|
+
throw new TypeError('Object id is not valid.');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return DXN.fromLocalObjectId(object.id);
|
|
33
|
+
};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { assertArgument } from '@dxos/invariant';
|
|
6
|
+
|
|
7
|
+
import { type AnyEntity, VersionTypeId } from '../common/types';
|
|
8
|
+
|
|
9
|
+
import { ObjectVersionId } from './model';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Represent entity version.
|
|
13
|
+
* May be backed by Automerge.
|
|
14
|
+
* Entities with no history are not versioned.
|
|
15
|
+
* Named EntityVersion to avoid conflict with types/version.ts.
|
|
16
|
+
*/
|
|
17
|
+
export interface EntityVersion {
|
|
18
|
+
[VersionTypeId]: {};
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Whether the entity is versioned.
|
|
22
|
+
*/
|
|
23
|
+
versioned: boolean;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Automerge heads.
|
|
27
|
+
*/
|
|
28
|
+
automergeHeads?: string[];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const unversioned: EntityVersion = {
|
|
32
|
+
[VersionTypeId]: {},
|
|
33
|
+
versioned: false,
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Checks that `obj` is a version object.
|
|
38
|
+
*/
|
|
39
|
+
export const isVersion = (entity: unknown): entity is EntityVersion => {
|
|
40
|
+
return entity != null && typeof entity === 'object' && VersionTypeId in entity;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Returns the version of an entity.
|
|
45
|
+
* Accepts both reactive entities and snapshots.
|
|
46
|
+
*/
|
|
47
|
+
export const version = (entity: AnyEntity): EntityVersion => {
|
|
48
|
+
const ver = (entity as any)[ObjectVersionId];
|
|
49
|
+
if (ver === undefined) {
|
|
50
|
+
return unversioned;
|
|
51
|
+
}
|
|
52
|
+
return ver;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Checks that `version` is a valid version object.
|
|
57
|
+
*/
|
|
58
|
+
export const versionValid = (ver: EntityVersion): boolean => {
|
|
59
|
+
assertArgument(isVersion(ver), 'version', 'Invalid version object');
|
|
60
|
+
return !!ver.versioned;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export type VersionCompareResult = 'unversioned' | 'equal' | 'different';
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Compares two versions.
|
|
67
|
+
* @param version1
|
|
68
|
+
* @param version2
|
|
69
|
+
* @returns 'unversioned' if either entity is unversioned, 'equal' if the versions are equal, 'different' if the versions are different.
|
|
70
|
+
*/
|
|
71
|
+
export const compareVersions = (version1: EntityVersion, version2: EntityVersion): VersionCompareResult => {
|
|
72
|
+
assertArgument(isVersion(version1), 'version1', 'Invalid version object');
|
|
73
|
+
assertArgument(isVersion(version2), 'version2', 'Invalid version object');
|
|
74
|
+
|
|
75
|
+
if (!versionValid(version1) || !versionValid(version2)) {
|
|
76
|
+
return 'unversioned';
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (version1.automergeHeads?.length !== version2.automergeHeads?.length) {
|
|
80
|
+
return 'different';
|
|
81
|
+
}
|
|
82
|
+
if (version1.automergeHeads?.some((head) => !version2.automergeHeads?.includes(head))) {
|
|
83
|
+
return 'different';
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return 'equal';
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export const encodeVersion = (ver: EntityVersion): string => {
|
|
90
|
+
return JSON.stringify(ver);
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
export const decodeVersion = (ver: string): EntityVersion => {
|
|
94
|
+
const parsed = JSON.parse(ver);
|
|
95
|
+
parsed[VersionTypeId] = {};
|
|
96
|
+
return parsed;
|
|
97
|
+
};
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import * as Schema from 'effect/Schema';
|
|
6
6
|
import * as SchemaAST from 'effect/SchemaAST';
|
|
7
7
|
|
|
8
|
-
import { FormatAnnotation,
|
|
8
|
+
import { FormatAnnotation, TypeFormat } from './types';
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* Datetime values should be stored as ISO strings or unix numbers (ms) in UTC.
|
|
@@ -102,7 +102,7 @@ export const DateOnly = /* Schema.transformOrFail(Schema.String, SimpleDate, {
|
|
|
102
102
|
);
|
|
103
103
|
},
|
|
104
104
|
}) */ Schema.String.pipe(
|
|
105
|
-
FormatAnnotation.set(
|
|
105
|
+
FormatAnnotation.set(TypeFormat.Date),
|
|
106
106
|
Schema.annotations({
|
|
107
107
|
title: 'Date',
|
|
108
108
|
description: 'Valid date in ISO format',
|
|
@@ -132,7 +132,7 @@ export const TimeOnly = /* Schema.transformOrFail(Schema.String, SimpleTime, {
|
|
|
132
132
|
);
|
|
133
133
|
},
|
|
134
134
|
}) */ Schema.String.pipe(
|
|
135
|
-
FormatAnnotation.set(
|
|
135
|
+
FormatAnnotation.set(TypeFormat.Time),
|
|
136
136
|
Schema.annotations({
|
|
137
137
|
title: 'Time',
|
|
138
138
|
description: 'Valid time in ISO format',
|
|
@@ -177,7 +177,7 @@ export const DateTime = /* Schema.transformOrFail(Schema.String, SimpleDateTime,
|
|
|
177
177
|
);
|
|
178
178
|
},
|
|
179
179
|
}) */ Schema.String.pipe(
|
|
180
|
-
FormatAnnotation.set(
|
|
180
|
+
FormatAnnotation.set(TypeFormat.DateTime),
|
|
181
181
|
Schema.annotations({
|
|
182
182
|
title: 'DateTime',
|
|
183
183
|
description: 'Valid date and time in ISO format',
|
|
@@ -189,7 +189,7 @@ export const DateTime = /* Schema.transformOrFail(Schema.String, SimpleDateTime,
|
|
|
189
189
|
*/
|
|
190
190
|
// TODO(burdon): Define duration type.
|
|
191
191
|
export const Duration = Schema.String.pipe(
|
|
192
|
-
FormatAnnotation.set(
|
|
192
|
+
FormatAnnotation.set(TypeFormat.Duration),
|
|
193
193
|
Schema.annotations({
|
|
194
194
|
title: 'Duration',
|
|
195
195
|
description: 'Duration in ISO 8601 format',
|