@dxos/echo 0.8.4-main.ef1bc66f44 → 0.8.4-main.effb148878
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 +9 -9
- package/dist/lib/neutral/Annotation.mjs +7 -3
- package/dist/lib/neutral/Database.mjs +8 -4
- package/dist/lib/neutral/Entity.mjs +35 -18
- package/dist/lib/neutral/Err.mjs +3 -1
- package/dist/lib/neutral/Extension.mjs +18 -0
- package/dist/lib/neutral/Extension.mjs.map +7 -0
- package/dist/lib/neutral/Feed.mjs +54 -0
- package/dist/lib/neutral/Feed.mjs.map +7 -0
- package/dist/lib/neutral/Filter.mjs +25 -12
- package/dist/lib/neutral/Format.mjs +23 -3
- package/dist/lib/neutral/JsonSchema.mjs +9 -9
- package/dist/lib/neutral/Key.mjs +7 -3
- package/dist/lib/neutral/Migration.mjs +18 -0
- package/dist/lib/neutral/Migration.mjs.map +7 -0
- package/dist/lib/neutral/Obj.mjs +41 -23
- package/dist/lib/neutral/Order.mjs +1 -1
- package/dist/lib/neutral/Query.mjs +21 -9
- package/dist/lib/neutral/QueryResult.mjs +1 -1
- package/dist/lib/neutral/Ref.mjs +13 -9
- package/dist/lib/neutral/Relation.mjs +34 -23
- package/dist/lib/neutral/SchemaRegistry.mjs +1 -1
- package/dist/lib/neutral/Tag.mjs +14 -10
- package/dist/lib/neutral/Type.mjs +52 -36
- package/dist/lib/neutral/{chunk-K5K3Z62A.mjs → chunk-4SYHDOQA.mjs} +14 -6
- package/dist/lib/neutral/chunk-4SYHDOQA.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-XAJMXQ4H.mjs → chunk-4U7OD55H.mjs} +6 -2
- package/dist/lib/neutral/chunk-4U7OD55H.mjs.map +7 -0
- package/dist/lib/neutral/chunk-52NG2XEE.mjs +34 -0
- package/dist/lib/neutral/chunk-52NG2XEE.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-KB7RIVLK.mjs → chunk-A5HDDVKS.mjs} +33 -6
- package/dist/lib/neutral/chunk-A5HDDVKS.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-DLPC7DHQ.mjs → chunk-EZ4XJFHJ.mjs} +9 -11
- package/dist/lib/neutral/chunk-EZ4XJFHJ.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-ZAHWXGK4.mjs → chunk-F625JEZB.mjs} +97 -19
- package/dist/lib/neutral/chunk-F625JEZB.mjs.map +7 -0
- package/dist/lib/neutral/chunk-FFCN66OF.mjs +420 -0
- package/dist/lib/neutral/chunk-FFCN66OF.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-RPB6V4BE.mjs → chunk-GOHDOJE3.mjs} +16 -3
- package/dist/lib/neutral/chunk-GOHDOJE3.mjs.map +7 -0
- package/dist/lib/neutral/chunk-GWFFC34K.mjs +50 -0
- package/dist/lib/neutral/chunk-GWFFC34K.mjs.map +7 -0
- package/dist/lib/neutral/chunk-J7QWJQQV.mjs +318 -0
- package/dist/lib/neutral/chunk-J7QWJQQV.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-QARLJVDB.mjs → chunk-JTHNDGAR.mjs} +8 -4
- package/dist/lib/neutral/chunk-JTHNDGAR.mjs.map +7 -0
- package/dist/lib/neutral/chunk-K5RH2PBH.mjs +361 -0
- package/dist/lib/neutral/chunk-K5RH2PBH.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-RIMHNJ3E.mjs → chunk-KHRAQDYX.mjs} +138 -91
- package/dist/lib/neutral/chunk-KHRAQDYX.mjs.map +7 -0
- package/dist/lib/neutral/chunk-L65CW5EI.mjs +156 -0
- package/dist/lib/neutral/chunk-L65CW5EI.mjs.map +7 -0
- package/dist/lib/neutral/chunk-LNZIPZX6.mjs +2186 -0
- package/dist/lib/neutral/chunk-LNZIPZX6.mjs.map +7 -0
- package/dist/lib/neutral/chunk-MPXUNTME.mjs +41 -0
- package/dist/lib/neutral/chunk-MPXUNTME.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-7WE7SBA2.mjs → chunk-O2EOH7XQ.mjs} +152 -134
- package/dist/lib/neutral/chunk-O2EOH7XQ.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-MTEHHY62.mjs → chunk-Q7ID37KF.mjs} +121 -94
- package/dist/lib/neutral/chunk-Q7ID37KF.mjs.map +7 -0
- package/dist/lib/neutral/chunk-QLYEQ5VA.mjs +205 -0
- package/dist/lib/neutral/chunk-QLYEQ5VA.mjs.map +7 -0
- package/dist/lib/neutral/chunk-SSDGRJ3A.mjs +747 -0
- package/dist/lib/neutral/chunk-SSDGRJ3A.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-ROKO4RKJ.mjs → chunk-TTCSATUD.mjs} +2 -2
- package/dist/lib/neutral/chunk-TTCSATUD.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-ANHVGJI4.mjs → chunk-UEFRFUYC.mjs} +8 -4
- package/dist/lib/neutral/chunk-UEFRFUYC.mjs.map +7 -0
- package/dist/lib/neutral/chunk-UN7K472Q.mjs +132 -0
- package/dist/lib/neutral/chunk-UN7K472Q.mjs.map +7 -0
- package/dist/lib/neutral/chunk-UQAMAXDU.mjs +243 -0
- package/dist/lib/neutral/chunk-UQAMAXDU.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-4L6DOFXP.mjs → chunk-V5NE2X7Y.mjs} +1 -1
- package/dist/lib/neutral/chunk-V5NE2X7Y.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-OMUPQMLR.mjs → chunk-V72DY6LU.mjs} +1 -1
- package/dist/lib/neutral/chunk-ZII2BGPM.mjs +269 -0
- package/dist/lib/neutral/chunk-ZII2BGPM.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-N2QNHMT5.mjs → chunk-ZM7VFIS2.mjs} +22 -2
- package/dist/lib/neutral/chunk-ZM7VFIS2.mjs.map +7 -0
- package/dist/lib/neutral/index.mjs +56 -29
- package/dist/lib/neutral/internal/index.mjs +128 -77
- package/dist/lib/neutral/meta.json +1 -1
- package/dist/lib/neutral/testing/index.mjs +226 -174
- package/dist/lib/neutral/testing/index.mjs.map +3 -3
- package/dist/types/src/Annotation.d.ts +3 -3
- package/dist/types/src/Annotation.d.ts.map +1 -1
- package/dist/types/src/Collection.d.ts +15 -0
- package/dist/types/src/Collection.d.ts.map +1 -0
- package/dist/types/src/Database.d.ts +27 -42
- package/dist/types/src/Database.d.ts.map +1 -1
- package/dist/types/src/Dataset.d.ts +29 -0
- package/dist/types/src/Dataset.d.ts.map +1 -0
- package/dist/types/src/Entity.d.ts +123 -29
- package/dist/types/src/Entity.d.ts.map +1 -1
- package/dist/types/src/Err.d.ts +56 -13
- package/dist/types/src/Err.d.ts.map +1 -1
- package/dist/types/src/Extension.d.ts +80 -0
- package/dist/types/src/Extension.d.ts.map +1 -0
- package/dist/types/src/Extension.test.d.ts +2 -0
- package/dist/types/src/Extension.test.d.ts.map +1 -0
- package/dist/types/src/Feed.d.ts +229 -0
- package/dist/types/src/Feed.d.ts.map +1 -0
- package/dist/types/src/Filter.d.ts +74 -11
- package/dist/types/src/Filter.d.ts.map +1 -1
- package/dist/types/src/Filter.test.d.ts +2 -0
- package/dist/types/src/Filter.test.d.ts.map +1 -0
- package/dist/types/src/Format.d.ts +3 -3
- package/dist/types/src/Format.d.ts.map +1 -1
- package/dist/types/src/Hypergraph.d.ts +15 -10
- 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 +11 -4
- 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 +72 -0
- package/dist/types/src/Migration.d.ts.map +1 -0
- package/dist/types/src/Obj.d.ts +201 -77
- package/dist/types/src/Obj.d.ts.map +1 -1
- package/dist/types/src/Order.d.ts.map +1 -1
- package/dist/types/src/Query.d.ts +117 -17
- package/dist/types/src/Query.d.ts.map +1 -1
- package/dist/types/src/Ref.d.ts +66 -10
- package/dist/types/src/Ref.d.ts.map +1 -1
- package/dist/types/src/Relation.d.ts +127 -54
- package/dist/types/src/Relation.d.ts.map +1 -1
- package/dist/types/src/SchemaRegistry.d.ts +12 -13
- package/dist/types/src/SchemaRegistry.d.ts.map +1 -1
- package/dist/types/src/Tag.d.ts +4 -3
- package/dist/types/src/Tag.d.ts.map +1 -1
- package/dist/types/src/Type.d.ts +337 -218
- package/dist/types/src/Type.d.ts.map +1 -1
- package/dist/types/src/View.d.ts +65 -0
- package/dist/types/src/View.d.ts.map +1 -0
- package/dist/types/src/exemplars.test.d.ts +2 -0
- package/dist/types/src/exemplars.test.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +8 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/internal/{annotations → Annotation}/annotations.d.ts +98 -24
- 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/{api → Annotation}/sorting.d.ts +1 -1
- package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -0
- package/dist/types/src/internal/{annotations → Annotation}/util.d.ts +15 -6
- 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 +67 -0
- package/dist/types/src/internal/Entity/entity.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/index.d.ts +10 -0
- package/dist/types/src/internal/Entity/index.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/model.d.ts +57 -0
- package/dist/types/src/internal/Entity/model.d.ts.map +1 -0
- package/dist/types/src/internal/{entities → Entity}/object.d.ts +3 -3
- package/dist/types/src/internal/Entity/object.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/relation.d.ts +51 -0
- package/dist/types/src/internal/Entity/relation.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/type-kind.d.ts +24 -0
- package/dist/types/src/internal/Entity/type-kind.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/type-uri.d.ts +25 -0
- package/dist/types/src/internal/Entity/type-uri.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/util.d.ts.map +1 -0
- package/dist/types/src/internal/{api → Entity}/version.d.ts +1 -1
- 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 +2 -1
- 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/{formats → Format}/index.d.ts +2 -2
- 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/Format/select.d.ts.map +1 -0
- package/dist/types/src/internal/Format/string.d.ts.map +1 -0
- package/dist/types/src/internal/{formats → Format}/types.d.ts +1 -1
- package/dist/types/src/internal/Format/types.d.ts.map +1 -0
- package/dist/types/src/internal/{json-schema → 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.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 +37 -37
- package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -0
- package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema.d.ts +3 -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.map +1 -0
- package/dist/types/src/internal/Obj/common.d.ts.map +1 -0
- package/dist/types/src/internal/{object → Obj}/create-object.d.ts +10 -12
- package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/create-object.test.d.ts.map +1 -0
- package/dist/types/src/internal/{object → Obj}/deleted.d.ts +1 -1
- package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -0
- package/dist/types/src/internal/{object → Obj}/index.d.ts +0 -1
- 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/{object → Obj}/json-serializer.d.ts +16 -8
- 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/{object → Obj}/set-value.d.ts +2 -2
- package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/set-value.test.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -0
- package/dist/types/src/internal/{object → Obj}/typed-object.d.ts +5 -5
- 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/Query.d.ts +10 -0
- package/dist/types/src/internal/Query.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 +1 -1
- package/dist/types/src/internal/Ref/ref-array.d.ts.map +1 -0
- package/dist/types/src/internal/{ref → Ref}/ref.d.ts +42 -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/{schema → Type}/compose.d.ts +1 -1
- 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/Type/index.d.ts +3 -0
- package/dist/types/src/internal/Type/index.d.ts.map +1 -0
- package/dist/types/src/internal/{schema → Type}/manipulation.d.ts +0 -1
- package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -0
- package/dist/types/src/internal/Type/type-schema.d.ts +52 -0
- package/dist/types/src/internal/Type/type-schema.d.ts.map +1 -0
- package/dist/types/src/internal/{api → common/api}/index.d.ts +0 -4
- package/dist/types/src/internal/common/api/index.d.ts.map +1 -0
- package/dist/types/src/internal/{api → common/api}/meta.d.ts +3 -3
- 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/{proxy → common/proxy}/change-context.d.ts +1 -1
- 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.map +1 -0
- package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -0
- package/dist/types/src/internal/{proxy → common/proxy}/errors.d.ts +1 -1
- package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -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.map +1 -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 +19 -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.map +1 -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.map +1 -0
- package/dist/types/src/internal/{proxy → common/proxy}/reactive-array.d.ts +1 -1
- package/dist/types/src/internal/common/proxy/reactive-array.d.ts.map +1 -0
- package/dist/types/src/internal/{proxy → common/proxy}/reactive.d.ts +2 -2
- package/dist/types/src/internal/{proxy → 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 -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.map +1 -0
- package/dist/types/src/internal/{proxy → common/proxy}/typed-handler.d.ts +18 -2
- 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/{types → common/types}/base.d.ts +1 -0
- package/dist/types/src/internal/common/types/base.d.ts.map +1 -0
- package/dist/types/src/internal/common/types/entity.d.ts +94 -0
- package/dist/types/src/internal/common/types/entity.d.ts.map +1 -0
- package/dist/types/src/internal/{types → common/types}/index.d.ts +1 -0
- package/dist/types/src/internal/common/types/index.d.ts.map +1 -0
- package/dist/types/src/internal/{types → common/types}/meta.d.ts +12 -1
- package/dist/types/src/internal/common/types/meta.d.ts.map +1 -0
- package/dist/types/src/internal/common/types/model-symbols.d.ts +58 -0
- package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -0
- package/dist/types/src/internal/{types → common/types}/typename.d.ts +7 -0
- package/dist/types/src/internal/common/types/typename.d.ts.map +1 -0
- package/dist/types/src/internal/{types → common/types}/version.d.ts +2 -2
- package/dist/types/src/internal/common/types/version.d.ts.map +1 -0
- package/dist/types/src/internal/index.d.ts +9 -10
- package/dist/types/src/internal/index.d.ts.map +1 -1
- 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 +77 -82
- 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 +30 -15
- package/src/Annotation.ts +7 -3
- package/src/Collection.ts +36 -0
- package/src/Database.ts +80 -77
- package/src/Dataset.ts +34 -0
- package/src/Entity.test.ts +116 -6
- package/src/Entity.ts +181 -66
- package/src/Err.ts +25 -3
- package/src/Extension.test.ts +235 -0
- package/src/Extension.ts +122 -0
- package/src/Feed.ts +356 -0
- package/src/Filter.test.ts +90 -0
- package/src/Filter.ts +152 -21
- package/src/Format.ts +3 -3
- package/src/Hypergraph.ts +16 -11
- package/src/Json.test.ts +175 -0
- package/src/Json.ts +103 -0
- package/src/JsonSchema.ts +14 -4
- package/src/Key.ts +1 -1
- package/src/Migration.ts +114 -0
- package/src/Obj.test.ts +158 -20
- package/src/Obj.ts +451 -183
- package/src/Order.ts +3 -1
- package/src/Query.test.ts +446 -89
- package/src/Query.ts +300 -35
- package/src/Ref.ts +83 -12
- package/src/Relation.test.ts +16 -10
- package/src/Relation.ts +236 -165
- package/src/SchemaRegistry.ts +13 -17
- package/src/Tag.ts +9 -9
- package/src/Type.test.ts +169 -24
- package/src/Type.ts +561 -354
- package/src/View.ts +101 -0
- package/src/exemplars.test.ts +21 -0
- package/src/index.ts +9 -2
- package/src/internal/Annotation/annotations.test.ts +165 -0
- package/src/internal/{annotations → Annotation}/annotations.ts +181 -101
- package/src/internal/{annotations → Annotation}/index.ts +1 -0
- package/src/internal/{api → Annotation}/sorting.ts +2 -4
- package/src/internal/{annotations → Annotation}/util.ts +17 -9
- package/src/internal/{api/entity.ts → Entity/api.ts} +9 -8
- package/src/internal/Entity/entity.ts +246 -0
- package/src/internal/{entities → Entity}/index.ts +4 -0
- package/src/internal/{entities → Entity}/model.ts +42 -60
- package/src/internal/{entities → Entity}/object.ts +13 -6
- package/src/internal/Entity/relation.ts +179 -0
- package/src/internal/Entity/type-kind.ts +67 -0
- package/src/internal/Entity/type-uri.ts +87 -0
- package/src/internal/Entity/util.ts +34 -0
- package/src/internal/{api → Entity}/version.ts +2 -2
- package/src/internal/{formats → Format}/date.test.ts +1 -2
- package/src/internal/{formats → Format}/date.ts +0 -4
- package/src/internal/{formats → Format}/format.test.ts +1 -2
- package/src/internal/{formats → Format}/index.ts +2 -3
- package/src/internal/{formats → Format}/types.ts +2 -2
- package/src/internal/{json-schema → JsonSchema}/annotations.ts +3 -3
- package/src/internal/{json-schema → JsonSchema}/json-schema-type.ts +4 -4
- package/src/internal/{json-schema → JsonSchema}/json-schema.test.ts +64 -151
- package/src/internal/{json-schema → JsonSchema}/json-schema.ts +47 -28
- package/src/internal/{object → Obj}/clone.ts +10 -6
- package/src/internal/{object → Obj}/common.ts +2 -2
- package/src/internal/{object → Obj}/create-object.test.ts +13 -14
- package/src/internal/Obj/create-object.ts +135 -0
- package/src/internal/{object → Obj}/deleted.ts +2 -2
- package/src/internal/{object → Obj}/index.ts +0 -1
- package/src/internal/{object → Obj}/inspect.ts +3 -3
- package/src/internal/Obj/json-serializer.test.ts +185 -0
- package/src/internal/{object → Obj}/json-serializer.ts +108 -45
- package/src/internal/{object → Obj}/schema-validator.ts +1 -1
- package/src/internal/{object → Obj}/set-value.test.ts +31 -54
- package/src/internal/{object → Obj}/set-value.ts +3 -3
- package/src/internal/{object → Obj}/snapshot.ts +41 -23
- package/src/internal/Obj/typed-object.test.ts +32 -0
- package/src/internal/{object → Obj}/typed-object.ts +5 -5
- package/src/internal/Query.ts +156 -0
- package/src/internal/{ref → Ref}/ref-array.ts +1 -2
- package/src/internal/{ref → Ref}/ref.test.ts +16 -26
- package/src/internal/{ref → Ref}/ref.ts +117 -57
- package/src/internal/{schema → Type}/compose.test.ts +6 -5
- package/src/internal/{schema → Type}/compose.ts +1 -1
- package/src/internal/Type/index.ts +6 -0
- package/src/internal/{schema → Type}/manipulation.ts +0 -25
- package/src/internal/Type/type-schema.ts +60 -0
- package/src/internal/{README.md → common/README.md} +2 -2
- package/src/internal/{api → common/api}/index.ts +0 -4
- package/src/internal/{api → common/api}/meta.ts +3 -3
- package/src/internal/common/index.ts +7 -0
- package/src/internal/{proxy → common/proxy}/change-context.ts +1 -1
- package/src/internal/{proxy → common/proxy}/change.test.ts +97 -97
- package/src/internal/{proxy → common/proxy}/errors.ts +2 -2
- package/src/internal/{proxy → common/proxy}/handler.test.ts +2 -4
- package/src/internal/{proxy → common/proxy}/json-serializer.ts +20 -14
- package/src/internal/{proxy → common/proxy}/make-object.ts +37 -15
- package/src/internal/{proxy → common/proxy}/ownership.ts +0 -1
- package/src/internal/{proxy → common/proxy}/reactive-array.ts +1 -1
- package/src/internal/common/proxy/reactive.test.ts +54 -0
- package/src/internal/{proxy → common/proxy}/reactive.ts +12 -4
- package/src/internal/common/proxy/schema.test.ts +107 -0
- package/src/internal/{proxy → common/proxy}/typed-handler.test.ts +15 -15
- package/src/internal/{proxy → common/proxy}/typed-handler.ts +75 -18
- package/src/internal/{proxy → common/proxy}/typed-object.test.ts +17 -30
- package/src/internal/{types → common/types}/base.ts +1 -1
- package/src/internal/common/types/entity.ts +133 -0
- package/src/internal/{types → common/types}/index.ts +1 -0
- package/src/internal/{types → common/types}/meta.ts +15 -1
- package/src/internal/common/types/model-symbols.ts +74 -0
- package/src/internal/common/types/typename.ts +91 -0
- package/src/internal/{types → common/types}/version.ts +2 -3
- package/src/internal/index.ts +9 -31
- package/src/testing/api.test.ts +15 -12
- package/src/testing/test-data.ts +158 -99
- package/src/testing/test-schema.ts +33 -67
- package/src/testing/util.ts +14 -11
- package/dist/lib/neutral/chunk-2AF5GMG6.mjs +0 -171
- package/dist/lib/neutral/chunk-2AF5GMG6.mjs.map +0 -7
- package/dist/lib/neutral/chunk-4L6DOFXP.mjs.map +0 -7
- package/dist/lib/neutral/chunk-7WE7SBA2.mjs.map +0 -7
- package/dist/lib/neutral/chunk-ANHVGJI4.mjs.map +0 -7
- package/dist/lib/neutral/chunk-DLPC7DHQ.mjs.map +0 -7
- package/dist/lib/neutral/chunk-EBUAT5ID.mjs +0 -229
- package/dist/lib/neutral/chunk-EBUAT5ID.mjs.map +0 -7
- package/dist/lib/neutral/chunk-K5K3Z62A.mjs.map +0 -7
- package/dist/lib/neutral/chunk-KB7RIVLK.mjs.map +0 -7
- package/dist/lib/neutral/chunk-LKFNEFHF.mjs +0 -130
- package/dist/lib/neutral/chunk-LKFNEFHF.mjs.map +0 -7
- package/dist/lib/neutral/chunk-MTEHHY62.mjs.map +0 -7
- package/dist/lib/neutral/chunk-N2QNHMT5.mjs.map +0 -7
- package/dist/lib/neutral/chunk-QARLJVDB.mjs.map +0 -7
- package/dist/lib/neutral/chunk-RIMHNJ3E.mjs.map +0 -7
- package/dist/lib/neutral/chunk-ROKO4RKJ.mjs.map +0 -7
- package/dist/lib/neutral/chunk-RPB6V4BE.mjs.map +0 -7
- package/dist/lib/neutral/chunk-TLGNKUUG.mjs +0 -3905
- package/dist/lib/neutral/chunk-TLGNKUUG.mjs.map +0 -7
- package/dist/lib/neutral/chunk-TQT6WTIJ.mjs +0 -142
- package/dist/lib/neutral/chunk-TQT6WTIJ.mjs.map +0 -7
- package/dist/lib/neutral/chunk-VUQGRDRI.mjs +0 -97
- package/dist/lib/neutral/chunk-VUQGRDRI.mjs.map +0 -7
- package/dist/lib/neutral/chunk-X2MPMYYN.mjs +0 -13
- package/dist/lib/neutral/chunk-X2MPMYYN.mjs.map +0 -7
- package/dist/lib/neutral/chunk-XAJMXQ4H.mjs.map +0 -7
- package/dist/lib/neutral/chunk-ZAHWXGK4.mjs.map +0 -7
- package/dist/types/src/internal/annotations/annotations.d.ts.map +0 -1
- package/dist/types/src/internal/annotations/annotations.test.d.ts.map +0 -1
- package/dist/types/src/internal/annotations/index.d.ts +0 -3
- package/dist/types/src/internal/annotations/index.d.ts.map +0 -1
- package/dist/types/src/internal/annotations/util.d.ts.map +0 -1
- package/dist/types/src/internal/api/annotations.d.ts +0 -23
- package/dist/types/src/internal/api/annotations.d.ts.map +0 -1
- package/dist/types/src/internal/api/entity.d.ts +0 -13
- package/dist/types/src/internal/api/entity.d.ts.map +0 -1
- package/dist/types/src/internal/api/index.d.ts.map +0 -1
- package/dist/types/src/internal/api/meta.d.ts.map +0 -1
- package/dist/types/src/internal/api/sorting.d.ts.map +0 -1
- package/dist/types/src/internal/api/version.d.ts.map +0 -1
- package/dist/types/src/internal/entities/entity.d.ts +0 -20
- package/dist/types/src/internal/entities/entity.d.ts.map +0 -1
- package/dist/types/src/internal/entities/index.d.ts +0 -6
- package/dist/types/src/internal/entities/index.d.ts.map +0 -1
- package/dist/types/src/internal/entities/model.d.ts +0 -79
- package/dist/types/src/internal/entities/model.d.ts.map +0 -1
- package/dist/types/src/internal/entities/object.d.ts.map +0 -1
- package/dist/types/src/internal/entities/relation.d.ts +0 -62
- package/dist/types/src/internal/entities/relation.d.ts.map +0 -1
- package/dist/types/src/internal/entities/util.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-schema/annotations.d.ts.map +0 -1
- package/dist/types/src/internal/json-schema/effect-schema.test.d.ts.map +0 -1
- 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/json-schema/json-schema.d.ts.map +0 -1
- package/dist/types/src/internal/json-schema/json-schema.test.d.ts.map +0 -1
- package/dist/types/src/internal/object/clone.d.ts.map +0 -1
- package/dist/types/src/internal/object/common.d.ts.map +0 -1
- package/dist/types/src/internal/object/create-object.d.ts.map +0 -1
- package/dist/types/src/internal/object/create-object.test.d.ts.map +0 -1
- package/dist/types/src/internal/object/deleted.d.ts.map +0 -1
- package/dist/types/src/internal/object/ids.d.ts +0 -6
- package/dist/types/src/internal/object/ids.d.ts.map +0 -1
- 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.map +0 -1
- package/dist/types/src/internal/object/json-serializer.test.d.ts.map +0 -1
- package/dist/types/src/internal/object/schema-validator.d.ts +0 -2
- 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/set-value.d.ts.map +0 -1
- package/dist/types/src/internal/object/set-value.test.d.ts.map +0 -1
- package/dist/types/src/internal/object/snapshot.d.ts.map +0 -1
- 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/proxy/change-context.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/change.test.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/define-hidden-property.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/errors.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/event-batch.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/handler.test.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/index.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/json-serializer.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/make-object.d.ts +0 -14
- package/dist/types/src/internal/proxy/make-object.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/ownership.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/proxy-types.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/proxy-utils.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/reactive-array.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/schema-validator.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/schema.test.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/symbols.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/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/compose.d.ts.map +0 -1
- package/dist/types/src/internal/schema/compose.test.d.ts.map +0 -1
- package/dist/types/src/internal/schema/echo-schema.d.ts +0 -181
- package/dist/types/src/internal/schema/echo-schema.d.ts.map +0 -1
- package/dist/types/src/internal/schema/index.d.ts +0 -4
- 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/persistent-schema.d.ts +0 -20
- package/dist/types/src/internal/schema/persistent-schema.d.ts.map +0 -1
- package/dist/types/src/internal/types/base.d.ts.map +0 -1
- package/dist/types/src/internal/types/entity.d.ts +0 -37
- package/dist/types/src/internal/types/entity.d.ts.map +0 -1
- package/dist/types/src/internal/types/index.d.ts.map +0 -1
- package/dist/types/src/internal/types/meta.d.ts.map +0 -1
- package/dist/types/src/internal/types/typename.d.ts.map +0 -1
- package/dist/types/src/internal/types/version.d.ts.map +0 -1
- package/src/internal/annotations/annotations.test.ts +0 -96
- package/src/internal/api/annotations.ts +0 -60
- package/src/internal/entities/entity.ts +0 -126
- package/src/internal/entities/relation.ts +0 -171
- package/src/internal/entities/util.ts +0 -33
- package/src/internal/object/create-object.ts +0 -95
- package/src/internal/object/ids.ts +0 -12
- package/src/internal/object/json-serializer.test.ts +0 -98
- package/src/internal/object/typed-object.test.ts +0 -34
- package/src/internal/proxy/schema.test.ts +0 -145
- package/src/internal/schema/echo-schema.ts +0 -424
- package/src/internal/schema/index.ts +0 -7
- package/src/internal/schema/persistent-schema.ts +0 -28
- package/src/internal/types/entity.ts +0 -54
- package/src/internal/types/typename.ts +0 -55
- /package/dist/lib/neutral/{chunk-OMUPQMLR.mjs.map → chunk-V72DY6LU.mjs.map} +0 -0
- /package/dist/types/src/internal/{annotations → Annotation}/annotations.test.d.ts +0 -0
- /package/dist/types/src/internal/{entities → Entity}/util.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}/number.d.ts +0 -0
- /package/dist/types/src/internal/{formats → Format}/object.d.ts +0 -0
- /package/dist/types/src/internal/{formats → Format}/select.d.ts +0 -0
- /package/dist/types/src/internal/{formats → Format}/string.d.ts +0 -0
- /package/dist/types/src/internal/{json-schema → JsonSchema}/effect-schema.test.d.ts +0 -0
- /package/dist/types/src/internal/{json-schema → JsonSchema}/index.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-schema → JsonSchema}/json-schema.test.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/clone.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/common.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/create-object.test.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}/set-value.test.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/snapshot.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/{schema → Type}/compose.test.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/change.test.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/define-hidden-property.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/event-batch.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/handler.test.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/index.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/json-serializer.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/ownership.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/proxy-types.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/proxy-utils.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → 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}/symbols.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/src/internal/{formats → Format}/format.ts +0 -0
- /package/src/internal/{formats → Format}/number.ts +0 -0
- /package/src/internal/{formats → Format}/object.ts +0 -0
- /package/src/internal/{formats → Format}/select.ts +0 -0
- /package/src/internal/{formats → Format}/string.ts +0 -0
- /package/src/internal/{json-schema → JsonSchema}/effect-schema.test.ts +0 -0
- /package/src/internal/{json-schema → JsonSchema}/index.ts +0 -0
- /package/src/internal/{json-schema → JsonSchema}/json-schema-normalize.ts +0 -0
- /package/src/internal/{object → Obj}/schema-validator.test.ts +0 -0
- /package/src/internal/{ref → Ref}/index.ts +0 -0
- /package/src/internal/{proxy → common/proxy}/define-hidden-property.ts +0 -0
- /package/src/internal/{proxy → common/proxy}/event-batch.ts +0 -0
- /package/src/internal/{proxy → common/proxy}/index.ts +0 -0
- /package/src/internal/{proxy → common/proxy}/proxy-types.ts +0 -0
- /package/src/internal/{proxy → common/proxy}/proxy-utils.ts +0 -0
- /package/src/internal/{proxy → common/proxy}/schema-validator.ts +0 -0
- /package/src/internal/{proxy → common/proxy}/symbols.ts +0 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type QueryAST } from '@dxos/echo-protocol';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Returns a human-readable string representation of a Filter AST.
|
|
9
|
+
*/
|
|
10
|
+
export const prettyFilter = (filter: QueryAST.Filter): string => {
|
|
11
|
+
switch (filter.type) {
|
|
12
|
+
case 'object': {
|
|
13
|
+
// A type-less object filter with only a meta-key constraint is `Filter.key(...)`.
|
|
14
|
+
if (
|
|
15
|
+
filter.typename === null &&
|
|
16
|
+
(filter.id === undefined || filter.id.length === 0) &&
|
|
17
|
+
Object.keys(filter.props).length === 0 &&
|
|
18
|
+
(filter.foreignKeys === undefined || filter.foreignKeys.length === 0) &&
|
|
19
|
+
filter.metaKey !== undefined
|
|
20
|
+
) {
|
|
21
|
+
return filter.metaVersion !== undefined
|
|
22
|
+
? `Filter.key(${JSON.stringify(filter.metaKey)}, { version: ${JSON.stringify(filter.metaVersion)} })`
|
|
23
|
+
: `Filter.key(${JSON.stringify(filter.metaKey)})`;
|
|
24
|
+
}
|
|
25
|
+
const parts: string[] = [];
|
|
26
|
+
if (filter.typename !== null) {
|
|
27
|
+
parts.push(String(filter.typename));
|
|
28
|
+
}
|
|
29
|
+
if (filter.id !== undefined && filter.id.length > 0) {
|
|
30
|
+
parts.push(`id: [${filter.id.join(', ')}]`);
|
|
31
|
+
}
|
|
32
|
+
const propEntries = Object.entries(filter.props);
|
|
33
|
+
if (propEntries.length > 0) {
|
|
34
|
+
const propsStr = propEntries.map(([k, v]) => `${k}: ${prettyFilter(v)}`).join(', ');
|
|
35
|
+
parts.push(`{ ${propsStr} }`);
|
|
36
|
+
}
|
|
37
|
+
if (filter.foreignKeys !== undefined && filter.foreignKeys.length > 0) {
|
|
38
|
+
parts.push(`foreignKeys: [${filter.foreignKeys.map((fk) => JSON.stringify(fk)).join(', ')}]`);
|
|
39
|
+
}
|
|
40
|
+
if (filter.metaKey !== undefined) {
|
|
41
|
+
parts.push(
|
|
42
|
+
filter.metaVersion !== undefined
|
|
43
|
+
? `metaKey: ${JSON.stringify(filter.metaKey)} (${filter.metaVersion})`
|
|
44
|
+
: `metaKey: ${JSON.stringify(filter.metaKey)}`,
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
return parts.length > 0 ? `Filter.type(${parts.join(', ')})` : 'Filter.everything()';
|
|
48
|
+
}
|
|
49
|
+
case 'compare':
|
|
50
|
+
return `Filter.${filter.operator}(${JSON.stringify(filter.value)})`;
|
|
51
|
+
case 'in':
|
|
52
|
+
return `Filter.in([${filter.values.map((v) => JSON.stringify(v)).join(', ')}])`;
|
|
53
|
+
case 'contains':
|
|
54
|
+
return `Filter.contains(${JSON.stringify(filter.value)})`;
|
|
55
|
+
case 'tag':
|
|
56
|
+
return `Filter.tag(${JSON.stringify(filter.tag)})`;
|
|
57
|
+
case 'range':
|
|
58
|
+
return `Filter.range(${JSON.stringify(filter.from)}, ${JSON.stringify(filter.to)})`;
|
|
59
|
+
case 'text-search':
|
|
60
|
+
return filter.searchKind
|
|
61
|
+
? `Filter.textSearch(${JSON.stringify(filter.text)}, ${JSON.stringify(filter.searchKind)})`
|
|
62
|
+
: `Filter.textSearch(${JSON.stringify(filter.text)})`;
|
|
63
|
+
case 'timestamp':
|
|
64
|
+
return `Filter.${filter.field}.${filter.operator}(${filter.value})`;
|
|
65
|
+
case 'child-of':
|
|
66
|
+
return `Filter.childOf([${filter.parents.map((p) => JSON.stringify(p)).join(', ')}], { transitive: ${filter.transitive} })`;
|
|
67
|
+
case 'not':
|
|
68
|
+
return `Filter.not(${prettyFilter(filter.filter)})`;
|
|
69
|
+
case 'and':
|
|
70
|
+
return `Filter.and(${filter.filters.map(prettyFilter).join(', ')})`;
|
|
71
|
+
case 'or':
|
|
72
|
+
return `Filter.or(${filter.filters.map(prettyFilter).join(', ')})`;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Returns a human-readable string representation of a Query AST.
|
|
78
|
+
*/
|
|
79
|
+
export const prettyQuery = (query: QueryAST.Query): string => {
|
|
80
|
+
switch (query.type) {
|
|
81
|
+
case 'select':
|
|
82
|
+
return `Query.select(${prettyFilter(query.filter)})`;
|
|
83
|
+
case 'filter':
|
|
84
|
+
return `${prettyQuery(query.selection)}.select(${prettyFilter(query.filter)})`;
|
|
85
|
+
case 'reference-traversal':
|
|
86
|
+
return `${prettyQuery(query.anchor)}.reference(${JSON.stringify(query.property)})`;
|
|
87
|
+
case 'incoming-references': {
|
|
88
|
+
const args: string[] = [];
|
|
89
|
+
if (query.typename !== null) {
|
|
90
|
+
args.push(String(query.typename));
|
|
91
|
+
}
|
|
92
|
+
if (query.property !== null) {
|
|
93
|
+
args.push(JSON.stringify(query.property));
|
|
94
|
+
}
|
|
95
|
+
return `${prettyQuery(query.anchor)}.referencedBy(${args.join(', ')})`;
|
|
96
|
+
}
|
|
97
|
+
case 'relation': {
|
|
98
|
+
const method =
|
|
99
|
+
query.direction === 'outgoing' ? 'sourceOf' : query.direction === 'incoming' ? 'targetOf' : 'relationOf';
|
|
100
|
+
const filterStr = query.filter !== undefined ? prettyFilter(query.filter) : '';
|
|
101
|
+
return `${prettyQuery(query.anchor)}.${method}(${filterStr})`;
|
|
102
|
+
}
|
|
103
|
+
case 'relation-traversal':
|
|
104
|
+
return `${prettyQuery(query.anchor)}.${query.direction}()`;
|
|
105
|
+
case 'hierarchy-traversal':
|
|
106
|
+
return query.direction === 'to-parent'
|
|
107
|
+
? `${prettyQuery(query.anchor)}.parent()`
|
|
108
|
+
: `${prettyQuery(query.anchor)}.children()`;
|
|
109
|
+
case 'union':
|
|
110
|
+
return `Query.all(${query.queries.map(prettyQuery).join(', ')})`;
|
|
111
|
+
case 'set-difference':
|
|
112
|
+
return `Query.without(${prettyQuery(query.source)}, ${prettyQuery(query.exclude)})`;
|
|
113
|
+
case 'order': {
|
|
114
|
+
const orders = query.order.map((o) => {
|
|
115
|
+
if (o.kind === 'natural') {
|
|
116
|
+
return 'Order.natural()';
|
|
117
|
+
} else if (o.kind === 'rank') {
|
|
118
|
+
return `Order.rank(${JSON.stringify(o.direction)})`;
|
|
119
|
+
} else {
|
|
120
|
+
return `Order.property(${JSON.stringify(o.property)}, ${JSON.stringify(o.direction)})`;
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
return `${prettyQuery(query.query)}.orderBy(${orders.join(', ')})`;
|
|
124
|
+
}
|
|
125
|
+
case 'options': {
|
|
126
|
+
const opts = query.options;
|
|
127
|
+
const parts: string[] = [];
|
|
128
|
+
if (opts.deleted !== undefined) {
|
|
129
|
+
parts.push(`deleted: ${JSON.stringify(opts.deleted)}`);
|
|
130
|
+
}
|
|
131
|
+
if (opts.debugLabel !== undefined) {
|
|
132
|
+
parts.push(`debugLabel: ${JSON.stringify(opts.debugLabel)}`);
|
|
133
|
+
}
|
|
134
|
+
return `${prettyQuery(query.query)}.options({ ${parts.join(', ')} })`;
|
|
135
|
+
}
|
|
136
|
+
case 'from': {
|
|
137
|
+
if (query.from._tag === 'scope') {
|
|
138
|
+
const scope = query.from.scope;
|
|
139
|
+
const parts: string[] = [];
|
|
140
|
+
if (scope.spaceIds !== undefined) {
|
|
141
|
+
parts.push(`spaceIds: [${scope.spaceIds.map((s) => JSON.stringify(s)).join(', ')}]`);
|
|
142
|
+
}
|
|
143
|
+
if (scope.feeds !== undefined) {
|
|
144
|
+
parts.push(`feeds: [${scope.feeds.map(String).join(', ')}]`);
|
|
145
|
+
}
|
|
146
|
+
if (scope.allFeedsFromSpaces !== undefined) {
|
|
147
|
+
parts.push(`allFeedsFromSpaces: ${scope.allFeedsFromSpaces}`);
|
|
148
|
+
}
|
|
149
|
+
return `${prettyQuery(query.query)}.from({ ${parts.join(', ')} })`;
|
|
150
|
+
}
|
|
151
|
+
return `${prettyQuery(query.query)}.from(${prettyQuery(query.from.query)})`;
|
|
152
|
+
}
|
|
153
|
+
case 'limit':
|
|
154
|
+
return `${prettyQuery(query.query)}.limit(${query.limit})`;
|
|
155
|
+
}
|
|
156
|
+
};
|
|
@@ -5,47 +5,37 @@
|
|
|
5
5
|
import * as Schema from 'effect/Schema';
|
|
6
6
|
import { describe, expect, test } from 'vitest';
|
|
7
7
|
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
import { EchoObjectSchema, getObjectDXN } from '../entities';
|
|
11
|
-
import { createObject } from '../object';
|
|
8
|
+
import { EchoURI, ObjectId, DXN } from '@dxos/keys';
|
|
12
9
|
|
|
10
|
+
import * as Type from '../../Type';
|
|
11
|
+
import { EchoObjectSchema, getObjectEchoUri } from '../Entity';
|
|
12
|
+
import { createObject } from '../Obj';
|
|
13
13
|
import { Ref, getReferenceAst } from './ref';
|
|
14
14
|
|
|
15
15
|
const Task = Schema.Struct({
|
|
16
16
|
title: Schema.optional(Schema.String),
|
|
17
|
-
}).pipe(
|
|
18
|
-
EchoObjectSchema({
|
|
19
|
-
typename: 'example.com/type/Task',
|
|
20
|
-
version: '0.1.0',
|
|
21
|
-
}),
|
|
22
|
-
);
|
|
17
|
+
}).pipe(EchoObjectSchema(DXN.make('com.example.type.task', '0.1.0')));
|
|
23
18
|
|
|
24
|
-
type Task =
|
|
19
|
+
type Task = Type.InstanceType<typeof Task>;
|
|
25
20
|
|
|
26
21
|
const Contact = Schema.Struct({
|
|
27
22
|
name: Schema.String,
|
|
28
23
|
email: Schema.optional(Schema.String),
|
|
29
24
|
tasks: Schema.Array(Ref(Task)),
|
|
30
|
-
}).pipe(
|
|
31
|
-
EchoObjectSchema({
|
|
32
|
-
typename: 'example.com/type/Person',
|
|
33
|
-
version: '0.1.0',
|
|
34
|
-
}),
|
|
35
|
-
);
|
|
25
|
+
}).pipe(EchoObjectSchema(DXN.make('com.example.type.person', '0.1.0')));
|
|
36
26
|
|
|
37
|
-
type Contact =
|
|
27
|
+
type Contact = Type.InstanceType<typeof Contact>;
|
|
38
28
|
|
|
39
29
|
describe('Ref', () => {
|
|
40
30
|
test('Schema is', () => {
|
|
41
|
-
Ref(Contact).pipe(Schema.is)(Ref.
|
|
31
|
+
Ref(Contact).pipe(Schema.is)(Ref.fromURI(EchoURI.make({ objectId: ObjectId.random() })));
|
|
42
32
|
});
|
|
43
33
|
|
|
44
34
|
test('ref ast', () => {
|
|
45
35
|
const ref = Ref(Task);
|
|
46
36
|
expect(ref.ast._tag).toEqual('Declaration');
|
|
47
37
|
const refAst = getReferenceAst(ref.ast);
|
|
48
|
-
expect(refAst).toEqual({ typename: Task
|
|
38
|
+
expect(refAst).toEqual({ typename: Type.getTypename(Task), version: Type.getVersion(Task) });
|
|
49
39
|
});
|
|
50
40
|
|
|
51
41
|
// TODO(dmaretskyi): Figure out how to expose this in the API.
|
|
@@ -56,14 +46,14 @@ describe('Ref', () => {
|
|
|
56
46
|
const json = JSON.parse(JSON.stringify(contact));
|
|
57
47
|
expect(json).toEqual({
|
|
58
48
|
id: contact.id,
|
|
59
|
-
'@type': `dxn
|
|
49
|
+
'@type': `dxn:${Type.getTypename(Contact)}:${Type.getVersion(Contact)}`,
|
|
60
50
|
'@meta': {
|
|
61
51
|
keys: [],
|
|
62
52
|
},
|
|
63
53
|
name: 'John Doe',
|
|
64
54
|
tasks: [
|
|
65
55
|
{
|
|
66
|
-
'/':
|
|
56
|
+
'/': getObjectEchoUri(task)!.toString(),
|
|
67
57
|
target: JSON.parse(JSON.stringify(task)),
|
|
68
58
|
},
|
|
69
59
|
],
|
|
@@ -77,12 +67,12 @@ describe('Ref', () => {
|
|
|
77
67
|
const json = JSON.parse(JSON.stringify(contact));
|
|
78
68
|
expect(json).toEqual({
|
|
79
69
|
id: contact.id,
|
|
80
|
-
'@type': `dxn
|
|
70
|
+
'@type': `dxn:${Type.getTypename(Contact)}:${Type.getVersion(Contact)}`,
|
|
81
71
|
'@meta': {
|
|
82
72
|
keys: [],
|
|
83
73
|
},
|
|
84
74
|
name: 'John Doe',
|
|
85
|
-
tasks: [{ '/':
|
|
75
|
+
tasks: [{ '/': getObjectEchoUri(task)!.toString() }],
|
|
86
76
|
});
|
|
87
77
|
});
|
|
88
78
|
|
|
@@ -94,8 +84,8 @@ describe('Ref', () => {
|
|
|
94
84
|
tasks: [{ '/': `dxn:echo:@:${id}` }],
|
|
95
85
|
};
|
|
96
86
|
|
|
97
|
-
const contact = Contact.pipe(Schema.decodeUnknownSync)(contactData);
|
|
87
|
+
const contact = Type.getSchema(Contact).pipe(Schema.decodeUnknownSync)(contactData);
|
|
98
88
|
expect(Ref.isRef(contact.tasks[0])).toEqual(true);
|
|
99
|
-
expect(contact.tasks[0].
|
|
89
|
+
expect(contact.tasks[0].uri.toString()).toEqual(`dxn:echo:@:${id}`);
|
|
100
90
|
});
|
|
101
91
|
});
|
|
@@ -16,12 +16,13 @@ import { Event } from '@dxos/async';
|
|
|
16
16
|
import { type CustomInspectFunction, inspectCustom } from '@dxos/debug';
|
|
17
17
|
import { EncodedReference } from '@dxos/echo-protocol';
|
|
18
18
|
import { assertArgument, invariant } from '@dxos/invariant';
|
|
19
|
-
import { DXN, ObjectId } from '@dxos/keys';
|
|
19
|
+
import { DXN, EchoURI, ObjectId, type URI } from '@dxos/keys';
|
|
20
20
|
|
|
21
21
|
import * as Database from '../../Database';
|
|
22
|
-
import
|
|
23
|
-
import {
|
|
24
|
-
import type
|
|
22
|
+
import type * as Type from '../../Type';
|
|
23
|
+
import { ReferenceAnnotationId, getSchemaURI, getTypeAnnotation, getTypeIdentifierAnnotation } from '../Annotation';
|
|
24
|
+
import { type AnyEntity, type AnyProperties, type UnknownTypeSchema, getStaticTypeSchema } from '../common/types';
|
|
25
|
+
import { type JsonSchemaType } from '../JsonSchema';
|
|
25
26
|
|
|
26
27
|
/**
|
|
27
28
|
* The `$id` and `$ref` fields for an ECHO reference schema.
|
|
@@ -31,7 +32,9 @@ export const JSON_SCHEMA_ECHO_REF_ID = '/schemas/echo/ref';
|
|
|
31
32
|
export const getSchemaReference = (property: JsonSchemaType): { typename: string } | undefined => {
|
|
32
33
|
const { $id, reference: { schema: { $ref } = {} } = {} } = property;
|
|
33
34
|
if ($id === JSON_SCHEMA_ECHO_REF_ID && $ref) {
|
|
34
|
-
|
|
35
|
+
const parsed = DXN.tryMake($ref);
|
|
36
|
+
const typename = parsed ? DXN.getName(parsed) : undefined;
|
|
37
|
+
return typename ? { typename } : undefined;
|
|
35
38
|
}
|
|
36
39
|
};
|
|
37
40
|
|
|
@@ -40,7 +43,7 @@ export const createSchemaReference = (typename: string): Types.DeepMutable<JsonS
|
|
|
40
43
|
$id: JSON_SCHEMA_ECHO_REF_ID,
|
|
41
44
|
reference: {
|
|
42
45
|
schema: {
|
|
43
|
-
$ref: DXN.
|
|
46
|
+
$ref: DXN.make(typename),
|
|
44
47
|
},
|
|
45
48
|
},
|
|
46
49
|
};
|
|
@@ -82,7 +85,27 @@ export interface RefSchema<T extends AnyEntity> extends Schema.SchemaClass<Ref<T
|
|
|
82
85
|
* Type of the `Ref` function and extra methods attached to it.
|
|
83
86
|
*/
|
|
84
87
|
export interface RefFn {
|
|
85
|
-
|
|
88
|
+
// A reference target is a `Type.AnyEntity` entity (the canonical Option B
|
|
89
|
+
// input) or one of the well-known "any object" / "any relation" branded
|
|
90
|
+
// schemas (`Obj.Unknown` / `Relation.Unknown`). Arbitrary raw schemas are
|
|
91
|
+
// rejected.
|
|
92
|
+
//
|
|
93
|
+
// Referencing a type-kind entity (a meta-schema, e.g. `Type.Type`) yields a
|
|
94
|
+
// reference to a stored schema record; its loaded target is any registered
|
|
95
|
+
// entity (`Type.AnyEntity`), since a stored object/relation schema is itself a
|
|
96
|
+
// `Type.Type` record. Referencing an object/relation type yields a reference
|
|
97
|
+
// to an instance of that type.
|
|
98
|
+
<S extends Type.AnyEntity | UnknownTypeSchema<any, any> = Type.AnyEntity>(
|
|
99
|
+
schema: S,
|
|
100
|
+
): RefSchema<
|
|
101
|
+
S extends Type.AnyType
|
|
102
|
+
? Type.AnyEntity
|
|
103
|
+
: S extends Type.AnyObj | Type.AnyRelation
|
|
104
|
+
? Type.InstanceType<S>
|
|
105
|
+
: S extends UnknownTypeSchema<infer A, any>
|
|
106
|
+
? A
|
|
107
|
+
: never
|
|
108
|
+
>;
|
|
86
109
|
|
|
87
110
|
/**
|
|
88
111
|
* @returns True if the object is a reference.
|
|
@@ -111,15 +134,19 @@ export interface RefFn {
|
|
|
111
134
|
make: <T extends AnyEntity>(object: T) => Ref<T>;
|
|
112
135
|
|
|
113
136
|
/**
|
|
114
|
-
* Constructs a reference that points to the object specified by the provided
|
|
137
|
+
* Constructs a reference that points to the object specified by the provided URI
|
|
138
|
+
* (either an `echo:` EchoURI for an object reference or a `dxn:` DXN for a type reference).
|
|
115
139
|
*/
|
|
116
|
-
|
|
140
|
+
fromURI: (uri: URI.URI) => Ref<any>;
|
|
117
141
|
}
|
|
118
142
|
|
|
119
143
|
/**
|
|
120
144
|
* Schema builder for references.
|
|
121
145
|
*/
|
|
122
|
-
export const Ref: RefFn =
|
|
146
|
+
export const Ref: RefFn = (input: any): RefSchema<any> => {
|
|
147
|
+
// `Type.Type` entities carry their source schema on the hidden slot; the
|
|
148
|
+
// branded `Obj.Unknown` / `Relation.Unknown` schemas are used directly.
|
|
149
|
+
const schema = getStaticTypeSchema(input) ?? input;
|
|
123
150
|
assertArgument(Schema.isSchema(schema), 'schema', 'Must call with an instance of effect-schema');
|
|
124
151
|
const annotation = getTypeAnnotation(schema);
|
|
125
152
|
if (annotation == null) {
|
|
@@ -135,9 +162,9 @@ export const Ref: RefFn = <S extends Schema.Schema.Any>(schema: S): RefSchema<Sc
|
|
|
135
162
|
*/
|
|
136
163
|
export interface Ref<T> extends Pipeable.Pipeable {
|
|
137
164
|
/**
|
|
138
|
-
* Target object DXN.
|
|
165
|
+
* Target URI (either an `echo:` EchoURI for an object reference or a `dxn:` DXN for a type reference).
|
|
139
166
|
*/
|
|
140
|
-
get
|
|
167
|
+
get uri(): URI.URI;
|
|
141
168
|
|
|
142
169
|
/**
|
|
143
170
|
* Returns true if the reference has a target available (inlined or resolver set).
|
|
@@ -164,6 +191,16 @@ export interface Ref<T> extends Pipeable.Pipeable {
|
|
|
164
191
|
|
|
165
192
|
tryLoad(): Promise<T | undefined>;
|
|
166
193
|
|
|
194
|
+
/**
|
|
195
|
+
* Subscribe to the ref's resolution event.
|
|
196
|
+
* The callback fires when the target object becomes available in the working set
|
|
197
|
+
* (e.g. when its document is loaded after sibling-client mutation).
|
|
198
|
+
* Note: the resolver only schedules a notification when the target is requested
|
|
199
|
+
* via {@link target} while it is not yet loaded.
|
|
200
|
+
* @returns Function that unsubscribes the callback.
|
|
201
|
+
*/
|
|
202
|
+
onResolved(callback: () => void): () => void;
|
|
203
|
+
|
|
167
204
|
/**
|
|
168
205
|
* Do not inline the target object in the reference.
|
|
169
206
|
* Makes .target unavailable unless the reference is connected to a database context.
|
|
@@ -205,7 +242,10 @@ Ref.isRef = (obj: any): obj is Ref<any> => {
|
|
|
205
242
|
return obj && typeof obj === 'object' && RefTypeId in obj;
|
|
206
243
|
};
|
|
207
244
|
|
|
208
|
-
Ref.hasObjectId = (id: ObjectId) => (ref: Ref<any>) =>
|
|
245
|
+
Ref.hasObjectId = (id: ObjectId) => (ref: Ref<any>) => {
|
|
246
|
+
const uri = EchoURI.tryParse(ref.uri);
|
|
247
|
+
return uri !== undefined && EchoURI.isLocal(uri) && EchoURI.getObjectId(uri) === id;
|
|
248
|
+
};
|
|
209
249
|
|
|
210
250
|
Ref.isRefSchema = (schema: Schema.Schema<any, any>): schema is RefSchema<any> => {
|
|
211
251
|
return Ref.isRefSchemaAST(schema.ast);
|
|
@@ -220,16 +260,16 @@ Ref.make = <T extends AnyProperties>(obj: T): Ref<T> => {
|
|
|
220
260
|
throw new TypeError('Expected: ECHO object.');
|
|
221
261
|
}
|
|
222
262
|
|
|
223
|
-
// TODO(dmaretskyi): Extract to `
|
|
263
|
+
// TODO(dmaretskyi): Extract to `getObjectEchoUri` function.
|
|
224
264
|
const id = obj.id;
|
|
225
265
|
invariant(ObjectId.isValid(id), 'Invalid object ID');
|
|
226
|
-
const
|
|
227
|
-
return new RefImpl(
|
|
266
|
+
const uri = EchoURI.make({ objectId: id });
|
|
267
|
+
return new RefImpl(uri, obj);
|
|
228
268
|
};
|
|
229
269
|
|
|
230
|
-
Ref.
|
|
231
|
-
assertArgument(
|
|
232
|
-
return new RefImpl(
|
|
270
|
+
Ref.fromURI = (uri: URI.URI): Ref<any> => {
|
|
271
|
+
assertArgument(typeof uri === 'string', 'uri', 'Expected URI string');
|
|
272
|
+
return new RefImpl(uri);
|
|
233
273
|
};
|
|
234
274
|
|
|
235
275
|
/**
|
|
@@ -245,18 +285,18 @@ export type JsonSchemaReferenceInfo = {
|
|
|
245
285
|
*/
|
|
246
286
|
// TODO(burdon): Move to json schema and make private?
|
|
247
287
|
export const createEchoReferenceSchema = (
|
|
248
|
-
|
|
288
|
+
echoUri: string | undefined,
|
|
249
289
|
typename: string | undefined,
|
|
250
290
|
version: string | undefined,
|
|
251
291
|
): Schema.SchemaClass<Ref<any>, EncodedReference> => {
|
|
252
|
-
if (!
|
|
253
|
-
throw new TypeError('Either
|
|
292
|
+
if (!echoUri && !typename) {
|
|
293
|
+
throw new TypeError('Either echoUri or typename must be provided.');
|
|
254
294
|
}
|
|
255
295
|
|
|
256
296
|
const referenceInfo: JsonSchemaReferenceInfo = {
|
|
257
297
|
schema: {
|
|
258
298
|
// TODO(dmaretskyi): Include version?
|
|
259
|
-
$ref:
|
|
299
|
+
$ref: echoUri ?? DXN.make(typename!),
|
|
260
300
|
},
|
|
261
301
|
schemaVersion: version,
|
|
262
302
|
};
|
|
@@ -269,7 +309,7 @@ export const createEchoReferenceSchema = (
|
|
|
269
309
|
return (value) =>
|
|
270
310
|
Effect.gen(function* () {
|
|
271
311
|
if (Ref.isRef(value)) {
|
|
272
|
-
return EncodedReference.
|
|
312
|
+
return EncodedReference.fromURI((value as Ref<any>).uri);
|
|
273
313
|
} else if (EncodedReference.isEncodedReference(value)) {
|
|
274
314
|
return value;
|
|
275
315
|
}
|
|
@@ -284,7 +324,7 @@ export const createEchoReferenceSchema = (
|
|
|
284
324
|
// TODO(dmaretskyi): This branch seems to be taken by Schema.is
|
|
285
325
|
if (Ref.isRef(value)) {
|
|
286
326
|
if (Option.isSome(dbService)) {
|
|
287
|
-
return dbService.value.db.makeRef(value.
|
|
327
|
+
return dbService.value.db.makeRef(value.uri);
|
|
288
328
|
} else {
|
|
289
329
|
return value;
|
|
290
330
|
}
|
|
@@ -294,9 +334,9 @@ export const createEchoReferenceSchema = (
|
|
|
294
334
|
return yield* Effect.fail(new ParseResult.Unexpected(value, 'reference'));
|
|
295
335
|
}
|
|
296
336
|
if (Option.isSome(dbService)) {
|
|
297
|
-
return dbService.value.db.makeRef(EncodedReference.
|
|
337
|
+
return dbService.value.db.makeRef(EncodedReference.toURI(value));
|
|
298
338
|
} else {
|
|
299
|
-
return Ref.
|
|
339
|
+
return Ref.fromURI(EncodedReference.toURI(value));
|
|
300
340
|
}
|
|
301
341
|
});
|
|
302
342
|
},
|
|
@@ -330,23 +370,32 @@ export interface RefResolver {
|
|
|
330
370
|
/**
|
|
331
371
|
* Resolve ref synchronously from the objects in the working set.
|
|
332
372
|
*
|
|
333
|
-
* @param
|
|
373
|
+
* @param uri
|
|
334
374
|
* @param load If true the resolver should attempt to load the object from disk.
|
|
335
375
|
* @param onLoad Callback to call when the object is loaded.
|
|
336
376
|
*/
|
|
337
|
-
resolveSync(
|
|
377
|
+
resolveSync(uri: URI.URI, load: boolean, onLoad?: () => void): AnyProperties | undefined;
|
|
338
378
|
|
|
339
379
|
/**
|
|
340
380
|
* Resolver ref asynchronously.
|
|
341
381
|
*/
|
|
342
|
-
resolve(
|
|
382
|
+
resolve(uri: URI.URI): Promise<AnyProperties | undefined>;
|
|
343
383
|
|
|
344
384
|
// TODO(dmaretskyi): Combine with `resolve`.
|
|
345
|
-
resolveSchema(
|
|
385
|
+
resolveSchema(uri: URI.URI): Promise<Schema.Schema.AnyNoContext | undefined>;
|
|
386
|
+
|
|
387
|
+
/**
|
|
388
|
+
* Resolve the source `Type.AnyEntity` entity for a type URI. Used by
|
|
389
|
+
* deserialization paths (`Obj.fromJSON`) to set the back-reference accessed
|
|
390
|
+
* via `Obj.getType` / `Entity.getType`. Optional — resolvers that only
|
|
391
|
+
* carry raw schemas may leave this unimplemented; the deserializer falls
|
|
392
|
+
* back to leaving the type entity unset.
|
|
393
|
+
*/
|
|
394
|
+
resolveType?(uri: URI.URI): Promise<unknown | undefined>;
|
|
346
395
|
}
|
|
347
396
|
|
|
348
397
|
export class RefImpl<T> implements Ref<T> {
|
|
349
|
-
#
|
|
398
|
+
#uri: URI.URI;
|
|
350
399
|
#resolver?: RefResolver = undefined;
|
|
351
400
|
#resolved = new Event<void>();
|
|
352
401
|
|
|
@@ -363,16 +412,16 @@ export class RefImpl<T> implements Ref<T> {
|
|
|
363
412
|
this.#resolved.emit();
|
|
364
413
|
};
|
|
365
414
|
|
|
366
|
-
constructor(
|
|
367
|
-
this.#
|
|
415
|
+
constructor(uri: URI.URI, target?: T) {
|
|
416
|
+
this.#uri = uri;
|
|
368
417
|
this.#target = target;
|
|
369
418
|
}
|
|
370
419
|
|
|
371
420
|
/**
|
|
372
421
|
* @inheritdoc
|
|
373
422
|
*/
|
|
374
|
-
get
|
|
375
|
-
return this.#
|
|
423
|
+
get uri(): URI.URI {
|
|
424
|
+
return this.#uri;
|
|
376
425
|
}
|
|
377
426
|
|
|
378
427
|
/**
|
|
@@ -391,7 +440,7 @@ export class RefImpl<T> implements Ref<T> {
|
|
|
391
440
|
}
|
|
392
441
|
|
|
393
442
|
invariant(this.#resolver, 'Resolver is not set');
|
|
394
|
-
return this.#resolver.resolveSync(this.#
|
|
443
|
+
return this.#resolver.resolveSync(this.#uri, true, this.#resolverCallback) as T | undefined;
|
|
395
444
|
}
|
|
396
445
|
|
|
397
446
|
/**
|
|
@@ -402,7 +451,7 @@ export class RefImpl<T> implements Ref<T> {
|
|
|
402
451
|
return this.#target;
|
|
403
452
|
}
|
|
404
453
|
invariant(this.#resolver, 'Resolver is not set');
|
|
405
|
-
const obj = await this.#resolver.resolve(this.#
|
|
454
|
+
const obj = await this.#resolver.resolve(this.#uri);
|
|
406
455
|
if (obj == null) {
|
|
407
456
|
throw new Error('Object not found');
|
|
408
457
|
}
|
|
@@ -417,7 +466,14 @@ export class RefImpl<T> implements Ref<T> {
|
|
|
417
466
|
return this.#target;
|
|
418
467
|
}
|
|
419
468
|
invariant(this.#resolver, 'Resolver is not set');
|
|
420
|
-
return (await this.#resolver.resolve(this.#
|
|
469
|
+
return (await this.#resolver.resolve(this.#uri)) as T | undefined;
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
/**
|
|
473
|
+
* @inheritdoc
|
|
474
|
+
*/
|
|
475
|
+
onResolved(callback: () => void): () => void {
|
|
476
|
+
return this.#resolved.on(callback);
|
|
421
477
|
}
|
|
422
478
|
|
|
423
479
|
/**
|
|
@@ -426,14 +482,14 @@ export class RefImpl<T> implements Ref<T> {
|
|
|
426
482
|
* Clones the reference object.
|
|
427
483
|
*/
|
|
428
484
|
noInline(): RefImpl<T> {
|
|
429
|
-
const ref = new RefImpl<T>(this.#
|
|
485
|
+
const ref = new RefImpl<T>(this.#uri, undefined);
|
|
430
486
|
ref.#resolver = this.#resolver;
|
|
431
487
|
return ref;
|
|
432
488
|
}
|
|
433
489
|
|
|
434
490
|
encode(): EncodedReference {
|
|
435
491
|
return {
|
|
436
|
-
'/': this.#
|
|
492
|
+
'/': this.#uri,
|
|
437
493
|
...(this.#target ? { target: this.#target } : {}),
|
|
438
494
|
};
|
|
439
495
|
}
|
|
@@ -453,7 +509,7 @@ export class RefImpl<T> implements Ref<T> {
|
|
|
453
509
|
return `Ref(${this.#target.toString()})`;
|
|
454
510
|
}
|
|
455
511
|
|
|
456
|
-
return `Ref(${this.#
|
|
512
|
+
return `Ref(${this.#uri.toString()})`;
|
|
457
513
|
}
|
|
458
514
|
|
|
459
515
|
[inspectCustom]: CustomInspectFunction = (depth, options, inspect) => {
|
|
@@ -469,12 +525,12 @@ export class RefImpl<T> implements Ref<T> {
|
|
|
469
525
|
* so without this, each access would create a separate cache entry.
|
|
470
526
|
*/
|
|
471
527
|
[Hash.symbol](): number {
|
|
472
|
-
return Hash.hash(this.#
|
|
528
|
+
return Hash.hash(this.#uri.toString());
|
|
473
529
|
}
|
|
474
530
|
|
|
475
531
|
/** Effect Equal trait. See {@link Hash.symbol} for rationale. */
|
|
476
532
|
[Equal.symbol](that: Equal.Equal): boolean {
|
|
477
|
-
return that instanceof RefImpl && this.#
|
|
533
|
+
return that instanceof RefImpl && this.#uri === that.uri;
|
|
478
534
|
}
|
|
479
535
|
|
|
480
536
|
/**
|
|
@@ -521,8 +577,8 @@ const refVariance: Ref<any>[typeof RefTypeId] = {
|
|
|
521
577
|
};
|
|
522
578
|
|
|
523
579
|
export const refFromEncodedReference = (encodedReference: EncodedReference, resolver?: RefResolver): Ref<any> => {
|
|
524
|
-
const
|
|
525
|
-
const ref = new RefImpl(
|
|
580
|
+
const uri = EncodedReference.toURI(encodedReference);
|
|
581
|
+
const ref = new RefImpl(uri);
|
|
526
582
|
|
|
527
583
|
// TODO(dmaretskyi): Handle inline target in the encoded reference.
|
|
528
584
|
|
|
@@ -534,22 +590,25 @@ export const refFromEncodedReference = (encodedReference: EncodedReference, reso
|
|
|
534
590
|
|
|
535
591
|
export class StaticRefResolver implements RefResolver {
|
|
536
592
|
public objects = new Map<ObjectId, AnyProperties>();
|
|
537
|
-
public schemas = new Map<
|
|
593
|
+
public schemas = new Map<URI.URI, Schema.Schema.AnyNoContext>();
|
|
538
594
|
|
|
539
595
|
addObject(obj: AnyProperties): this {
|
|
540
596
|
this.objects.set(obj.id, obj);
|
|
541
597
|
return this;
|
|
542
598
|
}
|
|
543
599
|
|
|
544
|
-
addSchema(
|
|
545
|
-
const
|
|
546
|
-
invariant(
|
|
547
|
-
|
|
600
|
+
addSchema(input: Type.AnyEntity): this {
|
|
601
|
+
const schema = getStaticTypeSchema(input);
|
|
602
|
+
invariant(schema, 'Type entity is missing its source schema');
|
|
603
|
+
const uri = getSchemaURI(schema);
|
|
604
|
+
invariant(uri, 'Schema has no URI');
|
|
605
|
+
this.schemas.set(uri, schema);
|
|
548
606
|
return this;
|
|
549
607
|
}
|
|
550
608
|
|
|
551
|
-
resolveSync(
|
|
552
|
-
const
|
|
609
|
+
resolveSync(uri: URI.URI, _load: boolean, _onLoad?: () => void): AnyProperties | undefined {
|
|
610
|
+
const echoUri = EchoURI.tryParse(uri);
|
|
611
|
+
const id = echoUri ? EchoURI.getObjectId(echoUri) : undefined;
|
|
553
612
|
if (id == null) {
|
|
554
613
|
return undefined;
|
|
555
614
|
}
|
|
@@ -557,8 +616,9 @@ export class StaticRefResolver implements RefResolver {
|
|
|
557
616
|
return this.objects.get(id);
|
|
558
617
|
}
|
|
559
618
|
|
|
560
|
-
async resolve(
|
|
561
|
-
const
|
|
619
|
+
async resolve(uri: URI.URI): Promise<AnyProperties | undefined> {
|
|
620
|
+
const echoUri = EchoURI.tryParse(uri);
|
|
621
|
+
const id = echoUri ? EchoURI.getObjectId(echoUri) : undefined;
|
|
562
622
|
if (id == null) {
|
|
563
623
|
return undefined;
|
|
564
624
|
}
|
|
@@ -566,7 +626,7 @@ export class StaticRefResolver implements RefResolver {
|
|
|
566
626
|
return this.objects.get(id);
|
|
567
627
|
}
|
|
568
628
|
|
|
569
|
-
async resolveSchema(
|
|
570
|
-
return this.schemas.get(
|
|
629
|
+
async resolveSchema(uri: URI.URI): Promise<Schema.Schema.AnyNoContext | undefined> {
|
|
630
|
+
return this.schemas.get(uri);
|
|
571
631
|
}
|
|
572
632
|
}
|