@dxos/echo 0.8.4-staging.ac66bdf99f → 0.9.1-main.c7dcc2e112
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +102 -5
- package/README.md +7 -7
- package/dist/lib/neutral/Annotation.mjs +45 -6
- package/dist/lib/neutral/Database.mjs +10 -17
- package/dist/lib/neutral/Entity.mjs +35 -20
- package/dist/lib/neutral/Err.mjs +3 -3
- package/dist/lib/neutral/Feed.mjs +23 -19
- package/dist/lib/neutral/Filter.mjs +13 -15
- package/dist/lib/neutral/Format.mjs +23 -3
- package/dist/lib/neutral/JsonSchema.mjs +7 -8
- package/dist/lib/neutral/Key.mjs +9 -5
- package/dist/lib/neutral/Migration.mjs +11 -10
- package/dist/lib/neutral/Obj.mjs +33 -20
- package/dist/lib/neutral/Order.mjs +7 -3
- package/dist/lib/neutral/Query.mjs +17 -17
- package/dist/lib/neutral/QueryResult.mjs +1 -1
- package/dist/lib/neutral/Ref.mjs +10 -9
- package/dist/lib/neutral/Registry.mjs +14 -0
- package/dist/lib/neutral/Relation.mjs +28 -25
- package/dist/lib/neutral/Scope.mjs +12 -0
- package/dist/lib/neutral/Tag.mjs +17 -14
- package/dist/lib/neutral/Type.mjs +54 -26
- package/dist/lib/neutral/{chunk-OMUPQMLR.mjs → chunk-35INCYOE.mjs} +1 -1
- package/dist/lib/neutral/chunk-35INCYOE.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-4OIBYSXE.mjs → chunk-3JXQUMUI.mjs} +78 -32
- package/dist/lib/neutral/chunk-3JXQUMUI.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-G3IQMKF7.mjs → chunk-4TPQZPLY.mjs} +130 -119
- package/dist/lib/neutral/chunk-4TPQZPLY.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-TU3GW67D.mjs → chunk-5GAIWRQB.mjs} +40 -40
- package/dist/lib/neutral/chunk-5GAIWRQB.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-B4BASU6W.mjs → chunk-6CEISA3V.mjs} +93 -76
- package/dist/lib/neutral/chunk-6CEISA3V.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-GZQTCRJB.mjs → chunk-6M2Z6WBH.mjs} +22 -2
- package/dist/lib/neutral/chunk-6M2Z6WBH.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-ANHVGJI4.mjs → chunk-7LOUAPYZ.mjs} +9 -5
- package/dist/lib/neutral/chunk-7LOUAPYZ.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-WAK4DMFV.mjs → chunk-A53NTBHE.mjs} +12 -7
- package/dist/lib/neutral/chunk-A53NTBHE.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-EAMSSLZC.mjs → chunk-AFANXSGV.mjs} +83 -46
- package/dist/lib/neutral/chunk-AFANXSGV.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-UBEZSGXY.mjs → chunk-BBFJWWAV.mjs} +6 -6
- package/dist/lib/neutral/chunk-BBFJWWAV.mjs.map +7 -0
- package/dist/lib/neutral/chunk-E7IOTOZD.mjs +108 -0
- package/dist/lib/neutral/chunk-E7IOTOZD.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-UI6MWK5W.mjs → chunk-EVK6XBXO.mjs} +16 -2
- package/dist/lib/neutral/chunk-EVK6XBXO.mjs.map +7 -0
- package/dist/lib/neutral/chunk-HGWQR5KH.mjs +259 -0
- package/dist/lib/neutral/chunk-HGWQR5KH.mjs.map +7 -0
- package/dist/lib/neutral/chunk-JZ6LFQU5.mjs +109 -0
- package/dist/lib/neutral/chunk-JZ6LFQU5.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-JUXPFOEI.mjs → chunk-K3S7D5PR.mjs} +48 -88
- package/dist/lib/neutral/chunk-K3S7D5PR.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-OS35K56T.mjs → chunk-L3OBWBV2.mjs} +3 -3
- package/dist/lib/neutral/{chunk-OS35K56T.mjs.map → chunk-L3OBWBV2.mjs.map} +2 -2
- package/dist/lib/neutral/{chunk-V36VO5SS.mjs → chunk-NOL7O3BL.mjs} +32 -40
- package/dist/lib/neutral/chunk-NOL7O3BL.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-TBKX6JQO.mjs → chunk-O6BH7EPN.mjs} +30 -3
- package/dist/lib/neutral/chunk-O6BH7EPN.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-7RO7CPBZ.mjs → chunk-PLDMJJJC.mjs} +2 -2
- package/dist/lib/neutral/{chunk-HBUZJNZO.mjs → chunk-SZ5WB6HF.mjs} +94 -99
- package/dist/lib/neutral/chunk-SZ5WB6HF.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-BVOFLCVF.mjs → chunk-TF5BSLF6.mjs} +9 -6
- package/dist/lib/neutral/chunk-TF5BSLF6.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-DQYLD2RB.mjs → chunk-TFEWTY5A.mjs} +155 -129
- package/dist/lib/neutral/chunk-TFEWTY5A.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-MOR5ERFM.mjs → chunk-VQYL2OQF.mjs} +771 -1252
- package/dist/lib/neutral/chunk-VQYL2OQF.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-WU3GIANS.mjs +31 -0
- package/dist/lib/neutral/chunk-WU3GIANS.mjs.map +7 -0
- package/dist/lib/neutral/chunk-WZ32BF53.mjs +702 -0
- package/dist/lib/neutral/chunk-WZ32BF53.mjs.map +7 -0
- package/dist/lib/neutral/chunk-X3NUUON4.mjs +184 -0
- package/dist/lib/neutral/chunk-X3NUUON4.mjs.map +7 -0
- package/dist/lib/neutral/chunk-Z3WMRRAZ.mjs +168 -0
- package/dist/lib/neutral/chunk-Z3WMRRAZ.mjs.map +7 -0
- package/dist/lib/neutral/index.mjs +47 -41
- package/dist/lib/neutral/internal/index.mjs +157 -72
- package/dist/lib/neutral/meta.json +1 -1
- package/dist/lib/neutral/testing/index.mjs +261 -178
- package/dist/lib/neutral/testing/index.mjs.map +4 -4
- package/dist/types/src/Annotation.d.ts +108 -4
- package/dist/types/src/Annotation.d.ts.map +1 -1
- package/dist/types/src/Annotation.test.d.ts +2 -0
- package/dist/types/src/Annotation.test.d.ts.map +1 -0
- package/dist/types/src/Collection.d.ts +2 -3
- package/dist/types/src/Collection.d.ts.map +1 -1
- package/dist/types/src/Database.d.ts +78 -49
- package/dist/types/src/Database.d.ts.map +1 -1
- package/dist/types/src/Dataset.d.ts +16 -6
- package/dist/types/src/Dataset.d.ts.map +1 -1
- package/dist/types/src/Entity.d.ts +103 -28
- package/dist/types/src/Entity.d.ts.map +1 -1
- package/dist/types/src/Err.d.ts +27 -27
- package/dist/types/src/Err.d.ts.map +1 -1
- package/dist/types/src/Feed.d.ts +69 -19
- package/dist/types/src/Feed.d.ts.map +1 -1
- package/dist/types/src/Filter.d.ts +38 -12
- package/dist/types/src/Filter.d.ts.map +1 -1
- package/dist/types/src/Format.d.ts +0 -2
- package/dist/types/src/Format.d.ts.map +1 -1
- package/dist/types/src/Hypergraph.d.ts +14 -9
- package/dist/types/src/Hypergraph.d.ts.map +1 -1
- package/dist/types/src/Json.d.ts +33 -0
- package/dist/types/src/Json.d.ts.map +1 -0
- package/dist/types/src/Json.test.d.ts +2 -0
- package/dist/types/src/Json.test.d.ts.map +1 -0
- package/dist/types/src/JsonSchema.d.ts +2 -2
- package/dist/types/src/JsonSchema.d.ts.map +1 -1
- package/dist/types/src/Key.d.ts +1 -1
- package/dist/types/src/Key.d.ts.map +1 -1
- package/dist/types/src/Migration.d.ts +26 -11
- package/dist/types/src/Migration.d.ts.map +1 -1
- package/dist/types/src/Obj.d.ts +106 -61
- package/dist/types/src/Obj.d.ts.map +1 -1
- package/dist/types/src/Order.d.ts +10 -0
- package/dist/types/src/Order.d.ts.map +1 -1
- package/dist/types/src/Query.d.ts +34 -12
- package/dist/types/src/Query.d.ts.map +1 -1
- package/dist/types/src/QueryResult.d.ts +21 -0
- package/dist/types/src/QueryResult.d.ts.map +1 -1
- package/dist/types/src/Ref.d.ts +15 -7
- package/dist/types/src/Ref.d.ts.map +1 -1
- package/dist/types/src/Registry.d.ts +131 -0
- package/dist/types/src/Registry.d.ts.map +1 -0
- package/dist/types/src/Relation.d.ts +73 -41
- package/dist/types/src/Relation.d.ts.map +1 -1
- package/dist/types/src/Scope.d.ts +35 -0
- package/dist/types/src/Scope.d.ts.map +1 -0
- package/dist/types/src/Tag.d.ts +21 -5
- package/dist/types/src/Tag.d.ts.map +1 -1
- package/dist/types/src/Type.d.ts +366 -95
- package/dist/types/src/Type.d.ts.map +1 -1
- package/dist/types/src/View.d.ts +9 -12
- package/dist/types/src/View.d.ts.map +1 -1
- package/dist/types/src/exemplars.test.d.ts +2 -0
- package/dist/types/src/exemplars.test.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +4 -3
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/internal/Annotation/annotations.d.ts +120 -38
- package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -1
- package/dist/types/src/internal/Annotation/dictionary.d.ts +24 -0
- package/dist/types/src/internal/Annotation/dictionary.d.ts.map +1 -0
- package/dist/types/src/internal/Annotation/entity-dictionary.d.ts +14 -0
- package/dist/types/src/internal/Annotation/entity-dictionary.d.ts.map +1 -0
- package/dist/types/src/internal/Annotation/index.d.ts +4 -2
- package/dist/types/src/internal/Annotation/index.d.ts.map +1 -1
- package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -1
- package/dist/types/src/internal/Annotation/util.d.ts +14 -5
- package/dist/types/src/internal/Annotation/util.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/api.d.ts +17 -3
- package/dist/types/src/internal/Entity/api.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/entity.d.ts +72 -8
- package/dist/types/src/internal/Entity/entity.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/guard.d.ts +10 -0
- package/dist/types/src/internal/Entity/guard.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/index.d.ts +2 -0
- package/dist/types/src/internal/Entity/index.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/model.d.ts +21 -17
- package/dist/types/src/internal/Entity/model.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/object.d.ts +3 -3
- package/dist/types/src/internal/Entity/object.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/relation.d.ts +30 -7
- package/dist/types/src/internal/Entity/relation.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/type-kind.d.ts +24 -0
- package/dist/types/src/internal/Entity/type-kind.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/type-uri.d.ts +24 -0
- package/dist/types/src/internal/Entity/type-uri.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/version.d.ts.map +1 -1
- package/dist/types/src/internal/Format/date.d.ts.map +1 -1
- package/dist/types/src/internal/Format/format.d.ts +3 -2
- package/dist/types/src/internal/Format/format.d.ts.map +1 -1
- package/dist/types/src/internal/Format/index.d.ts +2 -2
- package/dist/types/src/internal/Format/index.d.ts.map +1 -1
- package/dist/types/src/internal/Format/number.d.ts.map +1 -1
- package/dist/types/src/internal/Format/object.d.ts +3 -1
- package/dist/types/src/internal/Format/object.d.ts.map +1 -1
- package/dist/types/src/internal/Format/types.d.ts.map +1 -1
- package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -1
- package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts +34 -34
- package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -1
- package/dist/types/src/internal/JsonSchema/json-schema.d.ts +3 -2
- package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/atoms.d.ts +43 -0
- package/dist/types/src/internal/Obj/atoms.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/clone.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/common.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/create-object.d.ts +12 -12
- package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/index.d.ts +1 -1
- package/dist/types/src/internal/Obj/index.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/json-serializer.d.ts +8 -8
- package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/set-value.d.ts +1 -1
- package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/typed-object.d.ts +1 -1
- package/dist/types/src/internal/Query/index.d.ts +2 -0
- package/dist/types/src/internal/Query/index.d.ts.map +1 -0
- package/dist/types/src/internal/{Query.d.ts → Query/pretty.d.ts} +1 -1
- package/dist/types/src/internal/Query/pretty.d.ts.map +1 -0
- package/dist/types/src/internal/Ref/atoms.d.ts +10 -0
- package/dist/types/src/internal/Ref/atoms.d.ts.map +1 -0
- package/dist/types/src/internal/Ref/index.d.ts +1 -0
- package/dist/types/src/internal/Ref/index.d.ts.map +1 -1
- package/dist/types/src/internal/Ref/ref-array.d.ts +2 -2
- package/dist/types/src/internal/Ref/ref.d.ts +114 -19
- package/dist/types/src/internal/Ref/ref.d.ts.map +1 -1
- package/dist/types/src/internal/Ref/strong-deps.d.ts +35 -0
- package/dist/types/src/internal/Ref/strong-deps.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.map +1 -1
- package/dist/types/src/internal/Type/index.d.ts +1 -2
- package/dist/types/src/internal/Type/index.d.ts.map +1 -1
- package/dist/types/src/internal/Type/manipulation.d.ts +0 -1
- package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -1
- package/dist/types/src/internal/Type/type-schema.d.ts +52 -0
- package/dist/types/src/internal/Type/type-schema.d.ts.map +1 -0
- package/dist/types/src/internal/common/api/meta.d.ts +14 -11
- package/dist/types/src/internal/common/api/meta.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/change-context.d.ts +1 -1
- package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/errors.d.ts +1 -1
- package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/event-batch.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/make-object.d.ts +11 -5
- package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/ownership.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/reactive-array.d.ts +1 -1
- package/dist/types/src/internal/common/proxy/reactive.d.ts +1 -1
- package/dist/types/src/internal/common/proxy/reactive.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/reactive.test.d.ts +2 -0
- package/dist/types/src/internal/common/proxy/reactive.test.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/typed-handler.d.ts +18 -2
- package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/base.d.ts +4 -4
- package/dist/types/src/internal/common/types/base.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/entity.d.ts +62 -5
- package/dist/types/src/internal/common/types/entity.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/index.d.ts +1 -1
- package/dist/types/src/internal/common/types/index.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/meta.d.ts +33 -12
- package/dist/types/src/internal/common/types/meta.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/model-symbols.d.ts +15 -4
- package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/typename.d.ts +7 -0
- package/dist/types/src/internal/common/types/typename.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/version.d.ts +1 -1
- package/dist/types/src/internal/common/types/well-known-types.d.ts +11 -0
- package/dist/types/src/internal/common/types/well-known-types.d.ts.map +1 -0
- package/dist/types/src/internal/index.d.ts +2 -2
- package/dist/types/src/internal/index.d.ts.map +1 -1
- package/dist/types/src/testing/index.d.ts +1 -0
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/testing/registry.d.ts +9 -0
- package/dist/types/src/testing/registry.d.ts.map +1 -0
- package/dist/types/src/testing/test-data.d.ts +8 -8
- package/dist/types/src/testing/test-data.d.ts.map +1 -1
- package/dist/types/src/testing/test-schema.d.ts +83 -89
- package/dist/types/src/testing/test-schema.d.ts.map +1 -1
- package/dist/types/src/testing/util.d.ts +5 -3
- package/dist/types/src/testing/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +26 -24
- package/src/Annotation.test.ts +439 -0
- package/src/Annotation.ts +163 -4
- package/src/Collection.ts +5 -9
- package/src/Database.ts +126 -101
- package/src/Dataset.ts +10 -2
- package/src/Entity.test.ts +116 -6
- package/src/Entity.ts +136 -32
- package/src/Err.ts +4 -4
- package/src/Feed.ts +95 -44
- package/src/Filter.ts +70 -40
- package/src/Format.ts +0 -4
- package/src/Hypergraph.ts +14 -9
- package/src/Json.test.ts +175 -0
- package/src/Json.ts +103 -0
- package/src/Key.ts +1 -1
- package/src/Migration.ts +39 -19
- package/src/Obj.test.ts +122 -20
- package/src/Obj.ts +170 -91
- package/src/Order.ts +22 -0
- package/src/Query.test.ts +183 -154
- package/src/Query.ts +172 -85
- package/src/QueryResult.ts +26 -0
- package/src/Ref.ts +22 -4
- package/src/Registry.ts +155 -0
- package/src/Relation.test.ts +10 -10
- package/src/Relation.ts +116 -69
- package/src/Scope.ts +50 -0
- package/src/Tag.md +88 -0
- package/src/Tag.ts +50 -6
- package/src/Type.test.ts +223 -18
- package/src/Type.ts +623 -131
- package/src/View.ts +14 -23
- package/src/exemplars.test.ts +21 -0
- package/src/index.ts +4 -4
- package/src/internal/Annotation/annotations.test.ts +31 -11
- package/src/internal/Annotation/annotations.ts +199 -111
- package/src/internal/Annotation/dictionary.ts +47 -0
- package/src/internal/Annotation/entity-dictionary.ts +74 -0
- package/src/internal/Annotation/index.ts +4 -2
- package/src/internal/Annotation/util.ts +17 -8
- package/src/internal/Entity/api.ts +54 -7
- package/src/internal/Entity/entity.ts +196 -47
- package/src/internal/Entity/guard.ts +26 -0
- package/src/internal/Entity/index.ts +2 -0
- package/src/internal/Entity/model.ts +38 -28
- package/src/internal/Entity/object.ts +21 -5
- package/src/internal/Entity/relation.ts +68 -34
- package/src/internal/Entity/type-kind.ts +75 -0
- package/src/internal/Entity/type-uri.ts +92 -0
- package/src/internal/Entity/util.ts +9 -9
- package/src/internal/Format/date.ts +0 -4
- package/src/internal/Format/format.test.ts +21 -0
- package/src/internal/Format/index.ts +2 -3
- package/src/internal/Format/object.ts +21 -4
- package/src/internal/Format/types.ts +1 -1
- package/src/internal/JsonSchema/annotations.ts +1 -1
- package/src/internal/JsonSchema/json-schema-type.ts +4 -4
- package/src/internal/JsonSchema/json-schema.test.ts +71 -145
- package/src/internal/JsonSchema/json-schema.ts +49 -35
- package/src/internal/Obj/atoms.ts +275 -0
- package/src/internal/Obj/clone.ts +9 -4
- package/src/internal/Obj/create-object.test.ts +12 -10
- package/src/internal/Obj/create-object.ts +68 -22
- package/src/internal/Obj/index.ts +1 -1
- package/src/internal/Obj/inspect.ts +5 -3
- package/src/internal/Obj/json-serializer.test.ts +101 -22
- package/src/internal/Obj/json-serializer.ts +92 -36
- package/src/internal/Obj/set-value.test.ts +22 -45
- package/src/internal/Obj/set-value.ts +12 -19
- package/src/internal/Obj/snapshot.ts +13 -4
- package/src/internal/Obj/typed-object.test.ts +9 -11
- package/src/internal/Obj/typed-object.ts +1 -1
- package/src/internal/Query/index.ts +5 -0
- package/src/internal/{Query.ts → Query/pretty.ts} +40 -12
- package/src/internal/Ref/atoms.ts +20 -0
- package/src/internal/Ref/index.ts +1 -0
- package/src/internal/Ref/ref-array.ts +3 -3
- package/src/internal/Ref/ref.test.ts +18 -27
- package/src/internal/Ref/ref.ts +224 -69
- package/src/internal/Ref/strong-deps.ts +107 -0
- package/src/internal/Ref/utils.ts +45 -0
- package/src/internal/Type/compose.test.ts +3 -1
- package/src/internal/Type/index.ts +1 -2
- package/src/internal/Type/manipulation.ts +0 -25
- package/src/internal/Type/type-schema.ts +60 -0
- package/src/internal/common/README.md +2 -2
- package/src/internal/common/api/meta.ts +19 -17
- package/src/internal/common/proxy/change-context.ts +1 -1
- package/src/internal/common/proxy/change.test.ts +91 -83
- package/src/internal/common/proxy/errors.ts +2 -2
- package/src/internal/common/proxy/handler.test.ts +1 -1
- package/src/internal/common/proxy/json-serializer.ts +27 -16
- package/src/internal/common/proxy/make-object.ts +44 -20
- package/src/internal/common/proxy/ownership.ts +2 -2
- package/src/internal/common/proxy/reactive-array.ts +1 -1
- package/src/internal/common/proxy/reactive.test.ts +54 -0
- package/src/internal/common/proxy/reactive.ts +11 -2
- package/src/internal/common/proxy/schema.test.ts +48 -86
- package/src/internal/common/proxy/typed-handler.test.ts +12 -11
- package/src/internal/common/proxy/typed-handler.ts +78 -16
- package/src/internal/common/proxy/typed-object.test.ts +16 -28
- package/src/internal/common/types/base.ts +4 -4
- package/src/internal/common/types/entity.ts +80 -1
- package/src/internal/common/types/index.ts +6 -1
- package/src/internal/common/types/meta.ts +62 -20
- package/src/internal/common/types/model-symbols.ts +24 -4
- package/src/internal/common/types/typename.ts +39 -3
- package/src/internal/common/types/well-known-types.ts +15 -0
- package/src/internal/index.ts +6 -4
- package/src/testing/api.test.ts +15 -9
- package/src/testing/index.ts +1 -0
- package/src/testing/registry.ts +44 -0
- package/src/testing/test-data.ts +159 -99
- package/src/testing/test-schema.ts +22 -58
- package/src/testing/util.ts +14 -11
- package/dist/lib/neutral/Extension.mjs +0 -18
- package/dist/lib/neutral/SchemaRegistry.mjs +0 -2
- package/dist/lib/neutral/chunk-2KHZ36F5.mjs +0 -361
- package/dist/lib/neutral/chunk-2KHZ36F5.mjs.map +0 -7
- package/dist/lib/neutral/chunk-4OIBYSXE.mjs.map +0 -7
- package/dist/lib/neutral/chunk-4P3IXBLT.mjs +0 -45
- package/dist/lib/neutral/chunk-4P3IXBLT.mjs.map +0 -7
- package/dist/lib/neutral/chunk-ANHVGJI4.mjs.map +0 -7
- package/dist/lib/neutral/chunk-B4BASU6W.mjs.map +0 -7
- package/dist/lib/neutral/chunk-BNCCGLJN.mjs +0 -7
- package/dist/lib/neutral/chunk-BNCCGLJN.mjs.map +0 -7
- package/dist/lib/neutral/chunk-BVOFLCVF.mjs.map +0 -7
- package/dist/lib/neutral/chunk-DQYLD2RB.mjs.map +0 -7
- package/dist/lib/neutral/chunk-EAMSSLZC.mjs.map +0 -7
- package/dist/lib/neutral/chunk-G3IQMKF7.mjs.map +0 -7
- package/dist/lib/neutral/chunk-GZQTCRJB.mjs.map +0 -7
- package/dist/lib/neutral/chunk-HBUZJNZO.mjs.map +0 -7
- package/dist/lib/neutral/chunk-JUXPFOEI.mjs.map +0 -7
- package/dist/lib/neutral/chunk-MOR5ERFM.mjs.map +0 -7
- package/dist/lib/neutral/chunk-OMUPQMLR.mjs.map +0 -7
- package/dist/lib/neutral/chunk-PHU22NLC.mjs +0 -136
- package/dist/lib/neutral/chunk-PHU22NLC.mjs.map +0 -7
- package/dist/lib/neutral/chunk-ROG4RXXL.mjs +0 -97
- package/dist/lib/neutral/chunk-ROG4RXXL.mjs.map +0 -7
- package/dist/lib/neutral/chunk-T6W2LEZU.mjs +0 -125
- package/dist/lib/neutral/chunk-T6W2LEZU.mjs.map +0 -7
- package/dist/lib/neutral/chunk-TBKX6JQO.mjs.map +0 -7
- package/dist/lib/neutral/chunk-TU3GW67D.mjs.map +0 -7
- package/dist/lib/neutral/chunk-UBEZSGXY.mjs.map +0 -7
- package/dist/lib/neutral/chunk-UI6MWK5W.mjs.map +0 -7
- package/dist/lib/neutral/chunk-V36VO5SS.mjs.map +0 -7
- package/dist/lib/neutral/chunk-WAK4DMFV.mjs.map +0 -7
- package/dist/lib/neutral/chunk-YAHXAYOW.mjs +0 -56
- package/dist/lib/neutral/chunk-YAHXAYOW.mjs.map +0 -7
- package/dist/lib/neutral/chunk-YS6Q3XAD.mjs +0 -50
- package/dist/lib/neutral/chunk-YS6Q3XAD.mjs.map +0 -7
- package/dist/types/src/Extension.d.ts +0 -80
- package/dist/types/src/Extension.d.ts.map +0 -1
- package/dist/types/src/Extension.test.d.ts +0 -2
- package/dist/types/src/Extension.test.d.ts.map +0 -1
- package/dist/types/src/SchemaRegistry.d.ts +0 -84
- package/dist/types/src/SchemaRegistry.d.ts.map +0 -1
- package/dist/types/src/internal/Obj/ids.d.ts +0 -6
- package/dist/types/src/internal/Obj/ids.d.ts.map +0 -1
- package/dist/types/src/internal/Query.d.ts.map +0 -1
- package/dist/types/src/internal/Type/echo-schema.d.ts +0 -181
- package/dist/types/src/internal/Type/echo-schema.d.ts.map +0 -1
- package/dist/types/src/internal/Type/persistent-schema.d.ts +0 -20
- package/dist/types/src/internal/Type/persistent-schema.d.ts.map +0 -1
- package/src/Extension.test.ts +0 -235
- package/src/Extension.ts +0 -122
- package/src/SchemaRegistry.ts +0 -106
- package/src/internal/Obj/ids.ts +0 -12
- package/src/internal/Type/echo-schema.ts +0 -423
- package/src/internal/Type/persistent-schema.ts +0 -33
- /package/dist/lib/neutral/{Extension.mjs.map → Registry.mjs.map} +0 -0
- /package/dist/lib/neutral/{SchemaRegistry.mjs.map → Scope.mjs.map} +0 -0
- /package/dist/lib/neutral/{chunk-7RO7CPBZ.mjs.map → chunk-PLDMJJJC.mjs.map} +0 -0
package/src/Annotation.ts
CHANGED
|
@@ -6,24 +6,95 @@
|
|
|
6
6
|
|
|
7
7
|
export {
|
|
8
8
|
DescriptionAnnotation,
|
|
9
|
+
FieldLookupAnnotationId,
|
|
9
10
|
FormInputAnnotation,
|
|
11
|
+
FormInlineAnnotation,
|
|
12
|
+
FormOrderedAnnotation,
|
|
13
|
+
FormLayoutAnnotation,
|
|
14
|
+
FormLayoutAnnotationId,
|
|
15
|
+
type FormLayoutMap,
|
|
16
|
+
DEFAULT_LAYOUT_NAME,
|
|
10
17
|
GeneratorAnnotation,
|
|
18
|
+
GeneratorAnnotationId,
|
|
19
|
+
type GeneratorAnnotationValue,
|
|
11
20
|
LabelAnnotation,
|
|
12
21
|
ReferenceAnnotation,
|
|
13
|
-
|
|
22
|
+
ReferenceAnnotationId,
|
|
23
|
+
type ReferenceAnnotationValue,
|
|
24
|
+
HiddenAnnotation,
|
|
14
25
|
TypeAnnotation,
|
|
15
26
|
getDescriptionWithSchema,
|
|
16
27
|
getLabelWithSchema,
|
|
17
28
|
getTypeAnnotation,
|
|
29
|
+
getTypeIdentifierAnnotation,
|
|
18
30
|
setDescriptionWithSchema,
|
|
19
31
|
setLabelWithSchema,
|
|
20
32
|
IconAnnotation,
|
|
33
|
+
IconFromRefAnnotation,
|
|
21
34
|
} from './internal/Annotation';
|
|
22
35
|
|
|
23
|
-
import
|
|
36
|
+
import * as Function from 'effect/Function';
|
|
37
|
+
import * as Option from 'effect/Option';
|
|
38
|
+
import * as Schema from 'effect/Schema';
|
|
39
|
+
import * as SchemaAST from 'effect/SchemaAST';
|
|
40
|
+
import * as Types from 'effect/Types';
|
|
24
41
|
|
|
42
|
+
import * as Entity from './Entity';
|
|
25
43
|
import * as internalAnnotations from './internal/Annotation';
|
|
26
44
|
|
|
45
|
+
export const TypeId = '~@dxos/echo/Annotation' as const;
|
|
46
|
+
export type TypeId = typeof TypeId;
|
|
47
|
+
|
|
48
|
+
// TODO(dmaretskyi): Reconcile different get/set styles: mutate in-place, return.
|
|
49
|
+
// TODO(dmaretskyi): Reconcile Annotation methods vs static functions.
|
|
50
|
+
// TODO(dmaretskyi): Reconcile Annotation.Key vs DXN -- work-out approach to versioning.
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Annotation is a typed property that can be assigned to a schema or an entity instance.
|
|
54
|
+
*/
|
|
55
|
+
export interface Annotation<T> {
|
|
56
|
+
[TypeId]: {
|
|
57
|
+
_Type: T;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
// TODO(dmaretskyi): Make this a DXN?
|
|
61
|
+
/**
|
|
62
|
+
* Unique fully-qualified identifier for the annotation.
|
|
63
|
+
* @example "org.dxos.annotation.color"
|
|
64
|
+
*/
|
|
65
|
+
readonly key: Key;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Schema of the annotation value.
|
|
69
|
+
*/
|
|
70
|
+
readonly schema: Schema.Schema<T, unknown, never>;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Get the annotation value from an Effect schema.
|
|
74
|
+
*
|
|
75
|
+
* Only accepts `Schema.Schema.Any` — to read an annotation off a `Type.Type`
|
|
76
|
+
* entity, unwrap it first with `Type.getSchema(entity)`. This keeps the
|
|
77
|
+
* annotation pipeline single-shaped and forces annotations to live on the
|
|
78
|
+
* source schema, not on the post-construction Type entity.
|
|
79
|
+
*/
|
|
80
|
+
get: (schema: Schema.Schema.Any) => Option.Option<T>;
|
|
81
|
+
/**
|
|
82
|
+
* Get the annotation value from the AST.
|
|
83
|
+
*/
|
|
84
|
+
getFromAst: (ast: SchemaAST.AST) => Option.Option<T>;
|
|
85
|
+
/**
|
|
86
|
+
* Set the annotation on an Effect schema.
|
|
87
|
+
*
|
|
88
|
+
* Only accepts `Schema.Schema.Any` — annotations must be applied to the
|
|
89
|
+
* source schema BEFORE wrapping it with `Type.makeObject` / `Type.makeRelation`.
|
|
90
|
+
* In a pipe, place every `Annotation.X.set(...)` before the `Type.make...` step.
|
|
91
|
+
*/
|
|
92
|
+
set: (value: T) => <S extends Schema.Schema.Any>(schema: S) => S;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export const Key = internalAnnotations.Key;
|
|
96
|
+
export type Key = Schema.Schema.Type<typeof Key>;
|
|
97
|
+
|
|
27
98
|
interface MakeProps<T> {
|
|
28
99
|
id: string;
|
|
29
100
|
schema: Schema.Schema<T, any, never>;
|
|
@@ -44,5 +115,93 @@ interface MakeProps<T> {
|
|
|
44
115
|
* const schema = Schema.String.annotations(ColorAnnotation.set('red'));
|
|
45
116
|
* ```
|
|
46
117
|
*/
|
|
47
|
-
export const make: <T>(props: MakeProps<T>) =>
|
|
48
|
-
|
|
118
|
+
export const make: <T>(props: MakeProps<T>) => Annotation<T> = internalAnnotations.makeUserAnnotation;
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Get the value of an annotation from an entity instance or snapshot.
|
|
122
|
+
* For schema-level reads use the annotation instance method (e.g. `ColorAnnotation.get(schema)`).
|
|
123
|
+
* For getting an annotation value from a dictionary, use `getDictionary`.
|
|
124
|
+
*/
|
|
125
|
+
export const get: {
|
|
126
|
+
<T>(annotation: Annotation<T>): (target: Entity.Unknown | Entity.Snapshot) => Option.Option<T>;
|
|
127
|
+
<T>(target: Entity.Unknown | Entity.Snapshot, annotation: Annotation<T>): Option.Option<T>;
|
|
128
|
+
} = Function.dual<
|
|
129
|
+
<T>(annotation: Annotation<T>) => (target: Entity.Unknown | Entity.Snapshot) => Option.Option<T>,
|
|
130
|
+
<T>(target: Entity.Unknown | Entity.Snapshot, annotation: Annotation<T>) => Option.Option<T>
|
|
131
|
+
>(2, (target, annotation) => {
|
|
132
|
+
return internalAnnotations.get(target, annotation);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Set the value of an annotation on an entity instance.
|
|
137
|
+
* For schema-level writes use the annotation instance method (e.g. `ColorAnnotation.set('red')`).
|
|
138
|
+
* For setting an annotation value on a dictionary, use `setDictionary`.
|
|
139
|
+
*/
|
|
140
|
+
export const set: {
|
|
141
|
+
<T>(annotation: Annotation<T>, value: T): (target: Entity.Mutable<Entity.Unknown>) => void;
|
|
142
|
+
<T>(target: Entity.Mutable<Entity.Unknown>, annotation: Annotation<T>, value: T): void;
|
|
143
|
+
} = Function.dual<
|
|
144
|
+
<T>(annotation: Annotation<T>, value: T) => (target: Entity.Mutable<Entity.Unknown>) => void,
|
|
145
|
+
<T>(target: Entity.Mutable<Entity.Unknown>, annotation: Annotation<T>, value: T) => void
|
|
146
|
+
>(3, (target, annotation, value) => {
|
|
147
|
+
return internalAnnotations.set(target, annotation, value);
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
export const getFromAst: {
|
|
151
|
+
<T>(annotation: Annotation<T>): (ast: SchemaAST.AST) => Option.Option<T>;
|
|
152
|
+
<T>(ast: SchemaAST.AST, annotation: Annotation<T>): Option.Option<T>;
|
|
153
|
+
} = Function.dual<
|
|
154
|
+
<T>(annotation: Annotation<T>) => (ast: SchemaAST.AST) => Option.Option<T>,
|
|
155
|
+
<T>(ast: SchemaAST.AST, annotation: Annotation<T>) => Option.Option<T>
|
|
156
|
+
>(2, (ast, annotation) => {
|
|
157
|
+
return internalAnnotations.getFromAst(ast, annotation);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Set of annotation values.
|
|
162
|
+
*
|
|
163
|
+
* Can be used inside an object/relation schema:
|
|
164
|
+
*
|
|
165
|
+
* ```ts
|
|
166
|
+
* const Person = Schema.Struct({
|
|
167
|
+
* name: Schema.String,
|
|
168
|
+
* extensions: Annotation.Dictionary,
|
|
169
|
+
* });
|
|
170
|
+
* ```
|
|
171
|
+
*/
|
|
172
|
+
export const Dictionary = internalAnnotations.Dictionary;
|
|
173
|
+
export interface Dictionary extends Schema.Schema.Type<typeof Dictionary> {}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Get the value of an annotation from a Dictionary.
|
|
177
|
+
*/
|
|
178
|
+
export const getDictionary: {
|
|
179
|
+
<T>(annotation: Annotation<T>): (values: Dictionary) => Option.Option<T>;
|
|
180
|
+
<T>(values: Dictionary, annotation: Annotation<T>): Option.Option<T>;
|
|
181
|
+
} = Function.dual<
|
|
182
|
+
<T>(annotation: Annotation<T>) => (values: Dictionary) => Option.Option<T>,
|
|
183
|
+
<T>(values: Dictionary, annotation: Annotation<T>) => Option.Option<T>
|
|
184
|
+
>(2, (values, annotation) => {
|
|
185
|
+
return internalAnnotations.getDictionary(values, annotation);
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Set the value of an annotation in a Dictionary.
|
|
190
|
+
*
|
|
191
|
+
* Can also be used within Obj.update callback:
|
|
192
|
+
*
|
|
193
|
+
* ```ts
|
|
194
|
+
* Obj.update(obj, (obj) => {
|
|
195
|
+
* Annotation.setDictionary(obj.annotations, ColorAnnotation, 'red');
|
|
196
|
+
* });
|
|
197
|
+
* ```
|
|
198
|
+
*/
|
|
199
|
+
export const setDictionary: {
|
|
200
|
+
<T>(annotation: Annotation<T>, value: T): (values: Dictionary) => void;
|
|
201
|
+
<T>(values: Types.Mutable<Dictionary>, annotation: Annotation<T>, value: T): void;
|
|
202
|
+
} = Function.dual<
|
|
203
|
+
<T>(annotation: Annotation<T>, value: T) => (values: Dictionary) => void,
|
|
204
|
+
<T>(values: Types.Mutable<Dictionary>, annotation: Annotation<T>, value: T) => void
|
|
205
|
+
>(3, (values, annotation, value) => {
|
|
206
|
+
return internalAnnotations.setDictionary(values, annotation, value);
|
|
207
|
+
});
|
package/src/Collection.ts
CHANGED
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
import * as Schema from 'effect/Schema';
|
|
8
8
|
|
|
9
|
+
import { DXN } from '@dxos/keys';
|
|
10
|
+
|
|
9
11
|
import * as Annotation from './Annotation';
|
|
10
12
|
import * as internal from './internal';
|
|
11
13
|
import * as Obj from './Obj';
|
|
@@ -19,17 +21,11 @@ export const Collection = Schema.Struct({
|
|
|
19
21
|
name: Schema.String.pipe(Schema.optional),
|
|
20
22
|
objects: Schema.Array(Ref.Ref(Obj.Unknown)).pipe(internal.FormInputAnnotation.set(false)),
|
|
21
23
|
}).pipe(
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
version: '0.1.0',
|
|
25
|
-
}),
|
|
26
|
-
Annotation.IconAnnotation.set({
|
|
27
|
-
icon: 'ph--folder--regular',
|
|
28
|
-
hue: 'neutral',
|
|
29
|
-
}),
|
|
24
|
+
Annotation.IconAnnotation.set({ icon: 'ph--folder--regular', hue: 'amber' }),
|
|
25
|
+
Type.makeObject(DXN.make('org.dxos.type.collection', '0.1.0')),
|
|
30
26
|
);
|
|
31
27
|
|
|
32
|
-
export
|
|
28
|
+
export type Collection = Type.InstanceType<typeof Collection>;
|
|
33
29
|
|
|
34
30
|
export const make = (props: Partial<Obj.MakeProps<typeof Collection>> = {}): Collection =>
|
|
35
31
|
Obj.make(Collection, { objects: [], ...props });
|
package/src/Database.ts
CHANGED
|
@@ -6,26 +6,29 @@
|
|
|
6
6
|
|
|
7
7
|
import * as Context from 'effect/Context';
|
|
8
8
|
import * as Effect from 'effect/Effect';
|
|
9
|
+
import * as Effectable from 'effect/Effectable';
|
|
9
10
|
import * as Layer from 'effect/Layer';
|
|
10
11
|
import * as Option from 'effect/Option';
|
|
11
12
|
import * as Schema from 'effect/Schema';
|
|
12
|
-
import type * as Types from 'effect/Types';
|
|
13
13
|
|
|
14
|
-
import {
|
|
14
|
+
import { EffectEx } from '@dxos/effect';
|
|
15
15
|
import { invariant } from '@dxos/invariant';
|
|
16
|
-
import {
|
|
16
|
+
import { type SpaceId, type URI } from '@dxos/keys';
|
|
17
17
|
|
|
18
18
|
import type * as Entity from './Entity';
|
|
19
19
|
import * as Err from './Err';
|
|
20
|
+
import type * as Feed from './Feed';
|
|
20
21
|
import type * as Filter from './Filter';
|
|
21
22
|
import type * as Hypergraph from './Hypergraph';
|
|
22
|
-
import {
|
|
23
|
-
import
|
|
23
|
+
import { type AnyProperties, EntityKind, KindId } from './internal/common/types';
|
|
24
|
+
// Deep import (not the `./internal/Entity` barrel) to avoid a cycle:
|
|
25
|
+
// Database → internal/Entity → entity → JsonSchema → Ref → Database.
|
|
26
|
+
import { isInstanceOf } from './internal/Entity/type-uri';
|
|
24
27
|
import type { Ref } from './internal/Ref/ref';
|
|
25
28
|
import type * as Obj from './Obj';
|
|
26
29
|
import type * as Query from './Query';
|
|
27
30
|
import type * as QueryResult from './QueryResult';
|
|
28
|
-
import type * as
|
|
31
|
+
import type * as Registry from './Registry';
|
|
29
32
|
import type * as Type from './Type';
|
|
30
33
|
|
|
31
34
|
/**
|
|
@@ -38,7 +41,7 @@ export interface QueryFn {
|
|
|
38
41
|
}
|
|
39
42
|
|
|
40
43
|
/**
|
|
41
|
-
* Common interface for Database and
|
|
44
|
+
* Common interface for Database, Feed, and Hypergraph.
|
|
42
45
|
*/
|
|
43
46
|
export interface Queryable {
|
|
44
47
|
query: QueryFn;
|
|
@@ -62,6 +65,16 @@ export type AddOptions = {
|
|
|
62
65
|
placeIn?: ObjectPlacement;
|
|
63
66
|
};
|
|
64
67
|
|
|
68
|
+
/**
|
|
69
|
+
* Rejects Type entities from {@link Database.add} at compile time via their `[KindId]` brand. Used
|
|
70
|
+
* as `T & RejectTypeEntity<T>` to preserve inference of `T`. Bounding `add` on
|
|
71
|
+
* `Obj.Unknown | Relation.Unknown` instead would reject broadly-typed instance adds (e.g.
|
|
72
|
+
* `Entity.Any`, `Obj.OfShape<T>`), forcing casts repo-wide.
|
|
73
|
+
*/
|
|
74
|
+
export type RejectTypeEntity<T> = T extends { readonly [KindId]: EntityKind.Type }
|
|
75
|
+
? { __error: 'Type entities must be persisted via db.addType(), not db.add().' }
|
|
76
|
+
: T;
|
|
77
|
+
|
|
65
78
|
export type FlushOptions = {
|
|
66
79
|
/**
|
|
67
80
|
* Write any pending changes to disk.
|
|
@@ -96,15 +109,20 @@ export interface Database extends Queryable {
|
|
|
96
109
|
|
|
97
110
|
get spaceId(): SpaceId;
|
|
98
111
|
|
|
99
|
-
// TODO(burdon): Can we move this into graph?
|
|
100
|
-
get schemaRegistry(): SchemaRegistry.SchemaRegistry;
|
|
101
|
-
|
|
102
112
|
get graph(): Hypergraph.Hypergraph;
|
|
103
113
|
|
|
114
|
+
/**
|
|
115
|
+
* Registry for this database. Delegates type lookups to the shared hypergraph registry.
|
|
116
|
+
* To persist a schema so it replicates to other clients, add the type entity with
|
|
117
|
+
* {@link addType} (e.g. `await db.addType(Type.makeObjectFromJsonSchema(...))`).
|
|
118
|
+
*/
|
|
119
|
+
readonly registry: Registry.Registry;
|
|
120
|
+
|
|
104
121
|
toJSON(): object;
|
|
105
122
|
|
|
106
123
|
/**
|
|
107
124
|
* Return object by local ID.
|
|
125
|
+
* @deprecated Use `db.query(Filter.id(id)).runSync()[0]` for a working-set lookup, or resolve via a {@link Ref}.
|
|
108
126
|
*/
|
|
109
127
|
getObjectById<T extends Obj.Unknown = Obj.OfShape<AnyProperties>>(
|
|
110
128
|
id: string,
|
|
@@ -120,16 +138,28 @@ export interface Database extends Queryable {
|
|
|
120
138
|
* Creates a reference to an existing object in the database.
|
|
121
139
|
*
|
|
122
140
|
* NOTE: The reference may be dangling if the object is not present in the database.
|
|
123
|
-
* NOTE: Difference from `Ref.
|
|
124
|
-
* `Ref.
|
|
141
|
+
* NOTE: Difference from `Ref.fromURI`
|
|
142
|
+
* `Ref.fromURI(dxn)` returns an unhydrated reference. The `.load` and `.target` APIs will not work.
|
|
125
143
|
* `db.makeRef(dxn)` is preferable in cases with access to the database.
|
|
126
144
|
*/
|
|
127
|
-
makeRef<T extends Entity.Unknown = Entity.Unknown>(
|
|
145
|
+
makeRef<T extends Entity.Unknown = Entity.Unknown>(uri: URI.URI): Ref<T>;
|
|
128
146
|
|
|
129
147
|
/**
|
|
130
|
-
* Adds object to the database.
|
|
148
|
+
* Adds an object or relation to the database.
|
|
149
|
+
*
|
|
150
|
+
* Only Object and Relation entities are accepted. To persist a Type definition use
|
|
151
|
+
* {@link addType} — passing a Type entity is rejected at compile time (and at runtime).
|
|
131
152
|
*/
|
|
132
|
-
add<T extends Entity.Unknown = Entity.Unknown>(obj: T
|
|
153
|
+
add<T extends Entity.Unknown = Entity.Unknown>(obj: T & RejectTypeEntity<T>, opts?: AddOptions): T;
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Persists a Type definition (clones/forks the entity) so it replicates to other peers.
|
|
157
|
+
*
|
|
158
|
+
* Runs a conflict query first: if a type with the same typename + version already exists in
|
|
159
|
+
* this space, the existing persisted entity is returned and no duplicate is created. This is
|
|
160
|
+
* the only supported way to add Type entities — {@link add} rejects them.
|
|
161
|
+
*/
|
|
162
|
+
addType<T extends Type.AnyEntity>(type: T): Promise<T>;
|
|
133
163
|
|
|
134
164
|
/**
|
|
135
165
|
* Removes object from the database.
|
|
@@ -137,6 +167,19 @@ export interface Database extends Queryable {
|
|
|
137
167
|
// TODO(burdon): Return true if removed (currently throws if not present).
|
|
138
168
|
remove(obj: Entity.Unknown): void;
|
|
139
169
|
|
|
170
|
+
/**
|
|
171
|
+
* Appends entities to a feed.
|
|
172
|
+
*
|
|
173
|
+
* The feed must already be stored in the database (added via {@link add}); its underlying
|
|
174
|
+
* queue is addressed by the feed object's URI.
|
|
175
|
+
*/
|
|
176
|
+
appendToFeed(feed: Feed.Feed, entities: Entity.Unknown[]): Promise<void>;
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Removes entities from a feed.
|
|
180
|
+
*/
|
|
181
|
+
deleteFromFeed(feed: Feed.Feed, entities: Entity.Unknown[]): Promise<void>;
|
|
182
|
+
|
|
140
183
|
/**
|
|
141
184
|
* Wait for all pending changes to be saved to disk.
|
|
142
185
|
* Optionaly waits for changes to be propagated to indexes and event handlers.
|
|
@@ -201,67 +244,73 @@ export const spaceId = Effect.gen(function* () {
|
|
|
201
244
|
*/
|
|
202
245
|
export const resolve: {
|
|
203
246
|
// No type check.
|
|
204
|
-
(ref:
|
|
247
|
+
(ref: URI.URI | Ref<any>): Effect.Effect<Entity.Unknown, never, Service>;
|
|
205
248
|
// Check matches schema.
|
|
206
249
|
<S extends Type.AnyEntity>(
|
|
207
|
-
ref:
|
|
250
|
+
ref: URI.URI | Ref<any>,
|
|
208
251
|
schema: S,
|
|
209
|
-
): Effect.Effect<
|
|
252
|
+
): Effect.Effect<Type.InstanceType<S>, Err.EntityNotFoundError, Service>;
|
|
210
253
|
} = (<S extends Type.AnyEntity>(
|
|
211
|
-
ref:
|
|
254
|
+
ref: URI.URI | Ref<any>,
|
|
212
255
|
schema?: S,
|
|
213
|
-
): Effect.Effect<
|
|
256
|
+
): Effect.Effect<Type.InstanceType<S>, Err.EntityNotFoundError, Service> =>
|
|
214
257
|
Effect.gen(function* () {
|
|
215
258
|
const { db } = yield* Service;
|
|
216
|
-
const dxn = ref
|
|
217
|
-
const object = yield* promiseWithCauseCapture(() =>
|
|
259
|
+
const dxn = typeof ref === 'string' ? ref : ref.uri;
|
|
260
|
+
const object = yield* EffectEx.promiseWithCauseCapture(() =>
|
|
218
261
|
db.graph
|
|
219
262
|
.createRefResolver({
|
|
220
263
|
context: {
|
|
221
264
|
space: db.spaceId,
|
|
222
265
|
},
|
|
223
266
|
})
|
|
224
|
-
.
|
|
267
|
+
.resolveLegacy(dxn),
|
|
225
268
|
);
|
|
226
269
|
|
|
227
270
|
if (!object) {
|
|
228
|
-
return yield* Effect.fail(new Err.
|
|
271
|
+
return yield* Effect.fail(new Err.EntityNotFoundError(dxn));
|
|
229
272
|
}
|
|
230
|
-
|
|
273
|
+
// `isInstanceOf` uses a conditional generic that TS can't resolve through
|
|
274
|
+
// the local `S extends Type.AnyEntity` parameter — runtime accepts it fine.
|
|
275
|
+
invariant(!schema || isInstanceOf(schema as any, object), 'Object type mismatch.');
|
|
231
276
|
return object as any;
|
|
232
277
|
}).pipe(Effect.withSpan('Database.resolve'))) as any;
|
|
233
278
|
|
|
234
279
|
/**
|
|
235
280
|
* Loads an object reference.
|
|
281
|
+
*
|
|
282
|
+
* Catching not found error:
|
|
283
|
+
*
|
|
284
|
+
* ```ts
|
|
285
|
+
* yield* load(ref).pipe(Effect.catchTag('EntityNotFoundError', () => Effect.succeed(undefined)));
|
|
286
|
+
* ```
|
|
287
|
+
*
|
|
236
288
|
*/
|
|
237
|
-
export const load: <T>(ref: Ref<T>) => Effect.Effect<T, Err.
|
|
289
|
+
export const load: <T>(ref: Ref<T>) => Effect.Effect<T, Err.EntityNotFoundError, never> = Effect.fn('Database.load')(
|
|
238
290
|
function* (ref) {
|
|
239
|
-
const object = yield* promiseWithCauseCapture(() => ref.tryLoad());
|
|
291
|
+
const object = yield* EffectEx.promiseWithCauseCapture(() => ref.tryLoad());
|
|
240
292
|
if (!object) {
|
|
241
|
-
return yield* Effect.fail(new Err.
|
|
293
|
+
return yield* Effect.fail(new Err.EntityNotFoundError(ref.uri));
|
|
242
294
|
}
|
|
243
295
|
return object;
|
|
244
296
|
},
|
|
245
297
|
);
|
|
246
298
|
|
|
247
299
|
/**
|
|
248
|
-
*
|
|
300
|
+
* Adds an object or relation to the database.
|
|
301
|
+
* @see {@link Database.add}
|
|
249
302
|
*/
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
'Database.loadOption',
|
|
253
|
-
)(function* (ref) {
|
|
254
|
-
const object = yield* load(ref).pipe(Effect.catchTag('ObjectNotFoundError', () => Effect.succeed(undefined)));
|
|
255
|
-
|
|
256
|
-
return Option.fromNullable(object);
|
|
257
|
-
});
|
|
303
|
+
export const add = <T extends Entity.Unknown>(obj: T & RejectTypeEntity<T>): Effect.Effect<T, never, Service> =>
|
|
304
|
+
Service.pipe(Effect.map(({ db }) => db.add<T>(obj))).pipe(Effect.withSpan('Database.add'));
|
|
258
305
|
|
|
259
306
|
/**
|
|
260
|
-
*
|
|
261
|
-
* @see {@link Database.
|
|
307
|
+
* Persists a Type definition to the database.
|
|
308
|
+
* @see {@link Database.addType}
|
|
262
309
|
*/
|
|
263
|
-
export const
|
|
264
|
-
Service.pipe(Effect.
|
|
310
|
+
export const addType = <T extends Type.AnyEntity>(type: T): Effect.Effect<T, never, Service> =>
|
|
311
|
+
Service.pipe(Effect.flatMap(({ db }) => EffectEx.promiseWithCauseCapture(() => db.addType(type)))).pipe(
|
|
312
|
+
Effect.withSpan('Database.addType'),
|
|
313
|
+
);
|
|
265
314
|
|
|
266
315
|
/**
|
|
267
316
|
* Removes an object from the database.
|
|
@@ -270,12 +319,30 @@ export const add = <T extends Entity.Unknown>(obj: T): Effect.Effect<T, never, S
|
|
|
270
319
|
export const remove = <T extends Entity.Unknown>(obj: T): Effect.Effect<void, never, Service> =>
|
|
271
320
|
Service.pipe(Effect.map(({ db }) => db.remove(obj))).pipe(Effect.withSpan('Database.remove'));
|
|
272
321
|
|
|
322
|
+
/**
|
|
323
|
+
* Appends entities to a feed.
|
|
324
|
+
* @see {@link Database.appendToFeed}
|
|
325
|
+
*/
|
|
326
|
+
export const appendToFeed = (feed: Feed.Feed, entities: Entity.Unknown[]): Effect.Effect<void, never, Service> =>
|
|
327
|
+
Service.pipe(
|
|
328
|
+
Effect.flatMap(({ db }) => EffectEx.promiseWithCauseCapture(() => db.appendToFeed(feed, entities))),
|
|
329
|
+
).pipe(Effect.withSpan('Database.appendToFeed'));
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Removes entities from a feed.
|
|
333
|
+
* @see {@link Database.deleteFromFeed}
|
|
334
|
+
*/
|
|
335
|
+
export const deleteFromFeed = (feed: Feed.Feed, entities: Entity.Unknown[]): Effect.Effect<void, never, Service> =>
|
|
336
|
+
Service.pipe(
|
|
337
|
+
Effect.flatMap(({ db }) => EffectEx.promiseWithCauseCapture(() => db.deleteFromFeed(feed, entities))),
|
|
338
|
+
).pipe(Effect.withSpan('Database.deleteFromFeed'));
|
|
339
|
+
|
|
273
340
|
/**
|
|
274
341
|
* Flushes pending changes to disk.
|
|
275
342
|
* @see {@link Database.flush}
|
|
276
343
|
*/
|
|
277
344
|
export const flush = (opts?: FlushOptions) =>
|
|
278
|
-
Service.pipe(Effect.flatMap(({ db }) => promiseWithCauseCapture(() => db.flush(opts)))).pipe(
|
|
345
|
+
Service.pipe(Effect.flatMap(({ db }) => EffectEx.promiseWithCauseCapture(() => db.flush(opts)))).pipe(
|
|
279
346
|
Effect.withSpan('Database.flush'),
|
|
280
347
|
);
|
|
281
348
|
|
|
@@ -283,70 +350,28 @@ export const flush = (opts?: FlushOptions) =>
|
|
|
283
350
|
* Creates a `QueryResult` object that can be subscribed to.
|
|
284
351
|
*/
|
|
285
352
|
export const query: {
|
|
286
|
-
<Q extends Query.Any>(query: Q):
|
|
287
|
-
<F extends Filter.Any>(filter: F):
|
|
353
|
+
<Q extends Query.Any>(query: Q): QueryResult.QueryResultEffect<Query.Type<Q>, never, Service>;
|
|
354
|
+
<F extends Filter.Any>(filter: F): QueryResult.QueryResultEffect<Filter.Type<F>, never, Service>;
|
|
288
355
|
} = (queryOrFilter: Query.Any | Filter.Any) =>
|
|
289
356
|
Service.pipe(
|
|
290
357
|
Effect.map(({ db }) => db.query(queryOrFilter as any) as QueryResult.QueryResult<any>),
|
|
291
358
|
Effect.withSpan('Database.query'),
|
|
359
|
+
makeQueryResultEffect,
|
|
292
360
|
);
|
|
293
361
|
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
query(queryOrFilter as any).pipe(
|
|
302
|
-
Effect.flatMap((queryResult) => promiseWithCauseCapture(() => queryResult.run())),
|
|
303
|
-
Effect.withSpan('Database.runQuery'),
|
|
304
|
-
);
|
|
305
|
-
|
|
306
|
-
/**
|
|
307
|
-
* Executes the query once and returns the first result as or None.
|
|
308
|
-
*/
|
|
309
|
-
export const runQueryFirst: {
|
|
310
|
-
<Q extends Query.Any>(query: Q): Effect.Effect<Option.Option<Query.Type<Q>>, never, Service>;
|
|
311
|
-
<F extends Filter.Any>(filter: F): Effect.Effect<Option.Option<Filter.Type<F>>, never, Service>;
|
|
312
|
-
} = (queryOrFilter: Query.Any | Filter.Any) =>
|
|
313
|
-
query(queryOrFilter as any).pipe(
|
|
314
|
-
Effect.flatMap((queryResult) =>
|
|
315
|
-
promiseWithCauseCapture(async () => Option.fromNullable(await queryResult.firstOrUndefined())),
|
|
362
|
+
const makeQueryResultEffect = <T>(
|
|
363
|
+
eff: Effect.Effect<QueryResult.QueryResult<T>, never, Service>,
|
|
364
|
+
): QueryResult.QueryResultEffect<T, never, Service> => {
|
|
365
|
+
return {
|
|
366
|
+
run: Effect.flatMap(eff, (result) => EffectEx.promiseWithCauseCapture(() => result.run())),
|
|
367
|
+
first: Effect.flatMap(eff, (result) =>
|
|
368
|
+
EffectEx.promiseWithCauseCapture(async () => Option.fromNullable(await result.firstOrUndefined())),
|
|
316
369
|
),
|
|
317
|
-
Effect.withSpan('Database.runQueryFirst'),
|
|
318
|
-
);
|
|
319
|
-
|
|
320
|
-
/**
|
|
321
|
-
* Persists schemas in the database so they replicate to other clients.
|
|
322
|
-
* @see {@link SchemaRegistry.SchemaRegistry.register}
|
|
323
|
-
*/
|
|
324
|
-
export const registerSchema = (
|
|
325
|
-
input: SchemaRegistry.RegisterSchemaInput[],
|
|
326
|
-
): Effect.Effect<Type.RuntimeType[], never, Service> =>
|
|
327
|
-
Service.pipe(
|
|
328
|
-
Effect.flatMap(({ db }) => promiseWithCauseCapture(() => db.schemaRegistry.register(input))),
|
|
329
|
-
Effect.withSpan('Database.registerSchema'),
|
|
330
|
-
);
|
|
331
|
-
|
|
332
|
-
/**
|
|
333
|
-
* Creates a schema query result that can be subscribed to.
|
|
334
|
-
*/
|
|
335
|
-
// TODO(dmaretskyi): Change API to `yield* Database.querySchema(...).first` and `yield* Database.querySchema(...).schema`.
|
|
336
|
-
export const schemaQuery = <Q extends Types.NoExcessProperties<SchemaRegistry.Query, Q>>(
|
|
337
|
-
schemaQueryOptions?: Q & SchemaRegistry.Query,
|
|
338
|
-
): Effect.Effect<QueryResult.QueryResult<SchemaRegistry.ExtractQueryResult<Q>>, never, Service> =>
|
|
339
|
-
Service.pipe(
|
|
340
|
-
Effect.map(({ db }) => db.schemaRegistry.query(schemaQueryOptions)),
|
|
341
|
-
Effect.withSpan('Database.schemaQuery'),
|
|
342
|
-
);
|
|
343
370
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
Effect.flatMap((queryResult) => promiseWithCauseCapture(() => queryResult.run())),
|
|
352
|
-
);
|
|
371
|
+
// Effect internals
|
|
372
|
+
...Effectable.CommitPrototype,
|
|
373
|
+
commit() {
|
|
374
|
+
return eff;
|
|
375
|
+
},
|
|
376
|
+
} as any;
|
|
377
|
+
};
|
package/src/Dataset.ts
CHANGED
|
@@ -11,13 +11,21 @@ import * as Schema from 'effect/Schema';
|
|
|
11
11
|
import * as Collection from './Collection';
|
|
12
12
|
import * as Feed from './Feed';
|
|
13
13
|
import * as Obj from './Obj';
|
|
14
|
+
import * as Type from './Type';
|
|
14
15
|
import * as View from './View';
|
|
15
16
|
|
|
16
17
|
/**
|
|
17
|
-
*
|
|
18
|
+
* Abstract set of objects, represented by a view, feed, or collection.
|
|
19
|
+
* Schema-level union of the underlying type entities (rebuilt via
|
|
20
|
+
* `Type.getSchema`) so this can still be consumed by Schema-side APIs such
|
|
21
|
+
* as `Filter.type(...)` on a union.
|
|
18
22
|
*/
|
|
19
|
-
export const Dataset = Schema.Union(Feed.Feed, Collection.Collection, View.View);
|
|
20
23
|
export type Dataset = Feed.Feed | Collection.Collection | View.View;
|
|
24
|
+
export const Dataset = Schema.Union(
|
|
25
|
+
Type.getSchema(Feed.Feed),
|
|
26
|
+
Type.getSchema(Collection.Collection),
|
|
27
|
+
Type.getSchema(View.View),
|
|
28
|
+
);
|
|
21
29
|
|
|
22
30
|
export const isDataset: (value: unknown) => value is Dataset = pipe(
|
|
23
31
|
Obj.instanceOf(Feed.Feed),
|