@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
|
@@ -7,26 +7,13 @@ import * as Schema from 'effect/Schema';
|
|
|
7
7
|
import { raise } from '@dxos/debug';
|
|
8
8
|
import { type EncodedReference, ObjectStructure, isEncodedReference } from '@dxos/echo-protocol';
|
|
9
9
|
import { assertArgument, invariant } from '@dxos/invariant';
|
|
10
|
-
import {
|
|
11
|
-
import { assumeType, deepMapValues, visitValues } from '@dxos/util';
|
|
10
|
+
import { EchoURI, ObjectId, URI } from '@dxos/keys';
|
|
11
|
+
import { assumeType, decodeUint8ArrayFromJson, deepMapValues, isEncodedUint8Array, visitValues } from '@dxos/util';
|
|
12
12
|
|
|
13
|
+
import type * as Database from '../../Database';
|
|
13
14
|
import type * as Obj from '../../Obj';
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
ATTR_DELETED,
|
|
17
|
-
ATTR_RELATION_SOURCE,
|
|
18
|
-
ATTR_RELATION_TARGET,
|
|
19
|
-
ATTR_SELF_DXN,
|
|
20
|
-
type ObjectJSON,
|
|
21
|
-
RelationSourceDXNId,
|
|
22
|
-
RelationSourceId,
|
|
23
|
-
RelationTargetDXNId,
|
|
24
|
-
RelationTargetId,
|
|
25
|
-
SelfDXNId,
|
|
26
|
-
assertObjectModel,
|
|
27
|
-
} from '../entities';
|
|
28
|
-
import { attachTypedJsonSerializer, defineHiddenProperty, typedJsonSerializer } from '../proxy';
|
|
29
|
-
import { Ref, type RefResolver, refFromEncodedReference, setRefResolver } from '../ref';
|
|
15
|
+
import { getTypeAnnotation, getTypeURI, setTypename } from '../Annotation';
|
|
16
|
+
import { attachTypedJsonSerializer, defineHiddenProperty, typedJsonSerializer } from '../common/proxy';
|
|
30
17
|
import {
|
|
31
18
|
ATTR_META,
|
|
32
19
|
ATTR_PARENT,
|
|
@@ -38,7 +25,24 @@ import {
|
|
|
38
25
|
ObjectMetaSchema,
|
|
39
26
|
ParentId,
|
|
40
27
|
setSchema,
|
|
41
|
-
|
|
28
|
+
setType,
|
|
29
|
+
} from '../common/types';
|
|
30
|
+
import {
|
|
31
|
+
ATTR_DELETED,
|
|
32
|
+
ATTR_RELATION_SOURCE,
|
|
33
|
+
ATTR_RELATION_TARGET,
|
|
34
|
+
ATTR_SELF_URI,
|
|
35
|
+
ATTR_SELF_URI_LEGACY,
|
|
36
|
+
ObjectDatabaseId,
|
|
37
|
+
type ObjectJSON,
|
|
38
|
+
RelationSourceDXNId,
|
|
39
|
+
RelationSourceId,
|
|
40
|
+
RelationTargetDXNId,
|
|
41
|
+
RelationTargetId,
|
|
42
|
+
SelfURIId,
|
|
43
|
+
assertObjectModel,
|
|
44
|
+
} from '../Entity';
|
|
45
|
+
import { Ref, type RefResolver, refFromEncodedReference, setRefResolver } from '../Ref';
|
|
42
46
|
|
|
43
47
|
// Re-export for backward compatibility.
|
|
44
48
|
export { attachTypedJsonSerializer };
|
|
@@ -60,7 +64,7 @@ type SerializedObject<T extends { id: string }> = {
|
|
|
60
64
|
* Converts object to it's JSON representation.
|
|
61
65
|
*/
|
|
62
66
|
export const objectToJSON = <T extends AnyEntity>(obj: T): SerializedObject<T> => {
|
|
63
|
-
const typename =
|
|
67
|
+
const typename = getTypeURI(obj);
|
|
64
68
|
invariant(typename && typeof typename === 'string');
|
|
65
69
|
return typedJsonSerializer.call(obj);
|
|
66
70
|
};
|
|
@@ -70,28 +74,39 @@ export const objectToJSON = <T extends AnyEntity>(obj: T): SerializedObject<T> =
|
|
|
70
74
|
* Performs schema validation.
|
|
71
75
|
* References and schema will be resolvable if the `refResolver` is provided.
|
|
72
76
|
* The function need to be async to support resolving the schema as well as the relation endpoints.
|
|
77
|
+
*
|
|
78
|
+
* @param jsonData - JSON representation of the object.
|
|
79
|
+
* @param options.refResolver - Resolver for references.
|
|
80
|
+
* @param options.uri - Override object URI.
|
|
81
|
+
* @param options.database - Database to associate with the object.
|
|
73
82
|
*/
|
|
74
83
|
export const objectFromJSON = async (
|
|
75
84
|
jsonData: unknown,
|
|
76
|
-
{
|
|
85
|
+
{
|
|
86
|
+
refResolver,
|
|
87
|
+
uri,
|
|
88
|
+
database,
|
|
89
|
+
parent,
|
|
90
|
+
}: { refResolver?: RefResolver; uri?: URI.URI; database?: Database.Database; parent?: Obj.Unknown } = {},
|
|
77
91
|
): Promise<AnyEntity> => {
|
|
78
92
|
assumeType<ObjectJSON>(jsonData);
|
|
79
93
|
assertArgument(typeof jsonData === 'object' && jsonData !== null, 'jsonData', 'expect object');
|
|
80
94
|
assertArgument(typeof jsonData[ATTR_TYPE] === 'string', 'jsonData[ATTR_TYPE]', 'expected object to have a type');
|
|
81
95
|
assertArgument(typeof jsonData.id === 'string', 'jsonData.id', 'expected object to have an id');
|
|
82
96
|
|
|
83
|
-
const type =
|
|
97
|
+
const type = URI.make(jsonData[ATTR_TYPE]);
|
|
84
98
|
const schema = await refResolver?.resolveSchema(type);
|
|
85
99
|
invariant(schema === undefined || Schema.isSchema(schema));
|
|
100
|
+
const decodedInput = restoreUint8Arrays(stripInternalJsonKeys(jsonData));
|
|
86
101
|
|
|
87
102
|
let obj: any;
|
|
88
103
|
if (schema != null) {
|
|
89
|
-
obj = await schema.pipe(Schema.decodeUnknownPromise)(
|
|
104
|
+
obj = await schema.pipe(Schema.decodeUnknownPromise)(decodedInput);
|
|
90
105
|
if (refResolver) {
|
|
91
106
|
setRefResolverOnData(obj, refResolver);
|
|
92
107
|
}
|
|
93
108
|
} else {
|
|
94
|
-
obj = decodeGeneric(
|
|
109
|
+
obj = decodeGeneric(decodedInput, { refResolver });
|
|
95
110
|
}
|
|
96
111
|
|
|
97
112
|
invariant(ObjectId.isValid(obj.id), 'Invalid object id');
|
|
@@ -99,12 +114,21 @@ export const objectFromJSON = async (
|
|
|
99
114
|
if (schema) {
|
|
100
115
|
setSchema(obj, schema);
|
|
101
116
|
}
|
|
117
|
+
// Resolve and stamp the source type entity, if the resolver provides one.
|
|
118
|
+
// Lets `Obj.getType` / `Entity.getType` return a stable entity for objects
|
|
119
|
+
// loaded via `Obj.fromJSON` (serializer / queue paths).
|
|
120
|
+
if (refResolver?.resolveType) {
|
|
121
|
+
const typeEntity = await refResolver.resolveType(type);
|
|
122
|
+
if (typeEntity != null) {
|
|
123
|
+
setType(obj, typeEntity);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
102
126
|
|
|
103
127
|
const isRelation =
|
|
104
128
|
typeof jsonData[ATTR_RELATION_SOURCE] === 'string' || typeof jsonData[ATTR_RELATION_TARGET] === 'string';
|
|
105
129
|
if (isRelation) {
|
|
106
|
-
const sourceDxn
|
|
107
|
-
const targetDxn
|
|
130
|
+
const sourceDxn = jsonData[ATTR_RELATION_SOURCE] ?? raise(new TypeError('Missing relation source'));
|
|
131
|
+
const targetDxn = jsonData[ATTR_RELATION_TARGET] ?? raise(new TypeError('Missing relation target'));
|
|
108
132
|
|
|
109
133
|
const source = (await refResolver?.resolve(sourceDxn)) as AnyEntity | undefined;
|
|
110
134
|
const target = (await refResolver?.resolve(targetDxn)) as AnyEntity | undefined;
|
|
@@ -115,7 +139,13 @@ export const objectFromJSON = async (
|
|
|
115
139
|
defineHiddenProperty(obj, RelationSourceId, source);
|
|
116
140
|
defineHiddenProperty(obj, RelationTargetId, target);
|
|
117
141
|
} else {
|
|
118
|
-
|
|
142
|
+
// Honour the schema's TypeAnnotation kind — persisted `Type.Type` entities
|
|
143
|
+
// (e.g. dynamic schemas loaded from a snapshot import) must brand as
|
|
144
|
+
// `KindId = Type`, not Object, otherwise `Filter.type(Type.Type)` /
|
|
145
|
+
// `Type.isType` skip them and the schema registry never picks them up.
|
|
146
|
+
// Mirrors the kind resolution in `createObject` (the in-memory path).
|
|
147
|
+
const annotationKind = schema != null ? getTypeAnnotation(schema)?.kind : undefined;
|
|
148
|
+
defineHiddenProperty(obj, KindId, annotationKind === EntityKind.Type ? EntityKind.Type : EntityKind.Object);
|
|
119
149
|
}
|
|
120
150
|
|
|
121
151
|
if (typeof jsonData[ATTR_META] === 'object') {
|
|
@@ -129,43 +159,72 @@ export const objectFromJSON = async (
|
|
|
129
159
|
}
|
|
130
160
|
|
|
131
161
|
if (jsonData[ATTR_PARENT]) {
|
|
132
|
-
const parentDxn =
|
|
133
|
-
const
|
|
162
|
+
const parentDxn = jsonData[ATTR_PARENT];
|
|
163
|
+
const resolvedParent = (await refResolver?.resolve(parentDxn)) as Obj.Unknown | undefined;
|
|
164
|
+
defineHiddenProperty(obj, ParentId, resolvedParent);
|
|
165
|
+
} else if (parent) {
|
|
134
166
|
defineHiddenProperty(obj, ParentId, parent);
|
|
135
167
|
}
|
|
136
168
|
|
|
137
|
-
if (
|
|
138
|
-
defineHiddenProperty(obj,
|
|
169
|
+
if (uri) {
|
|
170
|
+
defineHiddenProperty(obj, SelfURIId, uri);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (database) {
|
|
174
|
+
defineHiddenProperty(obj, ObjectDatabaseId, database);
|
|
139
175
|
}
|
|
140
176
|
|
|
141
177
|
assertObjectModel(obj);
|
|
142
178
|
invariant((obj as any)[ATTR_TYPE] === undefined, 'Invalid object model');
|
|
143
179
|
invariant((obj as any)[ATTR_META] === undefined, 'Invalid object model');
|
|
144
180
|
invariant((obj as any)[ATTR_DELETED] === undefined, 'Invalid object model');
|
|
145
|
-
invariant((obj as any)[
|
|
181
|
+
invariant((obj as any)[ATTR_SELF_URI] === undefined, 'Invalid object model');
|
|
182
|
+
invariant((obj as any)[ATTR_SELF_URI_LEGACY] === undefined, 'Invalid object model');
|
|
146
183
|
invariant((obj as any)[ATTR_RELATION_SOURCE] === undefined, 'Invalid object model');
|
|
147
184
|
invariant((obj as any)[ATTR_RELATION_TARGET] === undefined, 'Invalid object model');
|
|
148
185
|
return obj;
|
|
149
186
|
};
|
|
150
187
|
|
|
151
188
|
const decodeGeneric = (jsonData: unknown, options: { refResolver?: RefResolver }) => {
|
|
189
|
+
const props = stripInternalJsonKeys(jsonData);
|
|
190
|
+
|
|
191
|
+
return deepMapValues(props, (value, visitor) => {
|
|
192
|
+
if (isEncodedReference(value)) {
|
|
193
|
+
return refFromEncodedReference(value, options.refResolver);
|
|
194
|
+
}
|
|
195
|
+
if (isEncodedUint8Array(value)) {
|
|
196
|
+
return decodeUint8ArrayFromJson(value);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return visitor(value);
|
|
200
|
+
});
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Recursively replaces encoded `Uint8Array` JSON markers with actual `Uint8Array` instances.
|
|
205
|
+
* Runs before schema decoding so `Schema.Uint8ArrayFromSelf` sees real bytes.
|
|
206
|
+
*/
|
|
207
|
+
const restoreUint8Arrays = (data: unknown): any =>
|
|
208
|
+
deepMapValues(data, (value, recurse) => {
|
|
209
|
+
if (isEncodedUint8Array(value)) {
|
|
210
|
+
return decodeUint8ArrayFromJson(value);
|
|
211
|
+
}
|
|
212
|
+
return recurse(value);
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
const stripInternalJsonKeys = (jsonData: unknown) => {
|
|
152
216
|
const {
|
|
153
217
|
[ATTR_TYPE]: _type,
|
|
154
218
|
[ATTR_META]: _meta,
|
|
155
219
|
[ATTR_DELETED]: _deleted,
|
|
156
|
-
[
|
|
220
|
+
[ATTR_SELF_URI]: _selfUri,
|
|
221
|
+
[ATTR_SELF_URI_LEGACY]: _legacySelfUri,
|
|
157
222
|
[ATTR_RELATION_SOURCE]: _relationSource,
|
|
158
223
|
[ATTR_RELATION_TARGET]: _relationTarget,
|
|
159
224
|
...props
|
|
160
225
|
} = jsonData as any;
|
|
161
226
|
|
|
162
|
-
return
|
|
163
|
-
if (isEncodedReference(value)) {
|
|
164
|
-
return refFromEncodedReference(value, options.refResolver);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
return visitor(value);
|
|
168
|
-
});
|
|
227
|
+
return props;
|
|
169
228
|
};
|
|
170
229
|
|
|
171
230
|
export const setRefResolverOnData = (obj: AnyEntity, refResolver: RefResolver) => {
|
|
@@ -184,14 +243,18 @@ export const setRefResolverOnData = (obj: AnyEntity, refResolver: RefResolver) =
|
|
|
184
243
|
* Convert ObjectStructure to JSON data for indexing.
|
|
185
244
|
* Different from {@link objectToJSON} as it takes the internal {@link ObjectStructure} representation directly
|
|
186
245
|
*/
|
|
187
|
-
export const objectStructureToJson = (objectId:
|
|
246
|
+
export const objectStructureToJson = (objectId: ObjectId, structure: ObjectStructure): Obj.JSON => {
|
|
247
|
+
const typeRef = ObjectStructure.getTypeReference(structure)?.['/'];
|
|
248
|
+
const parent = ObjectStructure.getParent(structure)?.['/'];
|
|
249
|
+
const source = ObjectStructure.getRelationSource(structure)?.['/'];
|
|
250
|
+
const target = ObjectStructure.getRelationTarget(structure)?.['/'];
|
|
188
251
|
return {
|
|
189
252
|
...structure.data,
|
|
190
253
|
id: objectId,
|
|
191
|
-
[ATTR_TYPE]:
|
|
254
|
+
[ATTR_TYPE]: typeRef ? URI.make(typeRef) : undefined,
|
|
192
255
|
[ATTR_DELETED]: ObjectStructure.isDeleted(structure),
|
|
193
|
-
[ATTR_PARENT]:
|
|
194
|
-
[ATTR_RELATION_SOURCE]:
|
|
195
|
-
[ATTR_RELATION_TARGET]:
|
|
256
|
+
[ATTR_PARENT]: parent !== undefined ? EchoURI.tryParse(parent) : undefined,
|
|
257
|
+
[ATTR_RELATION_SOURCE]: source !== undefined ? EchoURI.tryParse(source) : undefined,
|
|
258
|
+
[ATTR_RELATION_TARGET]: target !== undefined ? EchoURI.tryParse(target) : undefined,
|
|
196
259
|
};
|
|
197
260
|
};
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
import * as Schema from 'effect/Schema';
|
|
6
6
|
import { describe, test } from 'vitest';
|
|
7
7
|
|
|
8
|
+
import { DXN } from '@dxos/keys';
|
|
9
|
+
|
|
8
10
|
import * as Obj from '../../Obj';
|
|
9
11
|
import { TestSchema } from '../../testing';
|
|
10
12
|
import * as Type from '../../Type';
|
|
@@ -17,7 +19,7 @@ describe('Obj.setValue', () => {
|
|
|
17
19
|
email: 'john@example.com',
|
|
18
20
|
});
|
|
19
21
|
|
|
20
|
-
Obj.
|
|
22
|
+
Obj.update(person, (person) => Obj.setValue(person, ['address', 'city'], 'NYC'));
|
|
21
23
|
|
|
22
24
|
expect(person.address).toBeDefined();
|
|
23
25
|
expect(person.address?.city).toBe('NYC');
|
|
@@ -30,7 +32,7 @@ describe('Obj.setValue', () => {
|
|
|
30
32
|
email: 'john@example.com',
|
|
31
33
|
});
|
|
32
34
|
|
|
33
|
-
Obj.
|
|
35
|
+
Obj.update(person, (person) => Obj.setValue(person, ['fields', 0, 'label'], 'Phone'));
|
|
34
36
|
|
|
35
37
|
expect(Array.isArray(person.fields)).toBe(true);
|
|
36
38
|
expect(person.fields?.[0].label).toBe('Phone');
|
|
@@ -45,7 +47,7 @@ describe('Obj.setValue', () => {
|
|
|
45
47
|
email: 'john@example.com',
|
|
46
48
|
});
|
|
47
49
|
|
|
48
|
-
Obj.
|
|
50
|
+
Obj.update(person, (person) => Obj.setValue(person, ['address', 'coordinates', 'lat'], 40.7128));
|
|
49
51
|
|
|
50
52
|
expect(person.address).toBeDefined();
|
|
51
53
|
expect(person.address?.coordinates).toBeDefined();
|
|
@@ -60,19 +62,14 @@ describe('Obj.setValue', () => {
|
|
|
60
62
|
const Container = Schema.Struct({
|
|
61
63
|
name: Schema.String,
|
|
62
64
|
items: Schema.optional(Schema.Array(Item)),
|
|
63
|
-
}).pipe(
|
|
64
|
-
Type.object({
|
|
65
|
-
typename: 'test.com/Container',
|
|
66
|
-
version: '0.1.0',
|
|
67
|
-
}),
|
|
68
|
-
);
|
|
65
|
+
}).pipe(Type.makeObject(DXN.make('com.test.type.container', '0.1.0')));
|
|
69
66
|
|
|
70
67
|
const container = Obj.make(Container, { name: 'box' });
|
|
71
68
|
|
|
72
|
-
Obj.
|
|
73
|
-
Obj.setValue(
|
|
74
|
-
Obj.setValue(
|
|
75
|
-
Obj.setValue(
|
|
69
|
+
Obj.update(container, (container) => {
|
|
70
|
+
Obj.setValue(container, ['items', 0, 'value'], 10);
|
|
71
|
+
Obj.setValue(container, ['items', 1, 'value'], 20);
|
|
72
|
+
Obj.setValue(container, ['items', 2, 'value'], 30);
|
|
76
73
|
});
|
|
77
74
|
|
|
78
75
|
expect(container.items).toHaveLength(3);
|
|
@@ -88,7 +85,7 @@ describe('Obj.setValue', () => {
|
|
|
88
85
|
email: 'john@example.com',
|
|
89
86
|
});
|
|
90
87
|
|
|
91
|
-
Obj.
|
|
88
|
+
Obj.update(person, (person) => Obj.setValue(person, ['age'], 25));
|
|
92
89
|
|
|
93
90
|
expect(person.age).toBe(25);
|
|
94
91
|
});
|
|
@@ -100,7 +97,7 @@ describe('Obj.setValue', () => {
|
|
|
100
97
|
email: 'john@example.com',
|
|
101
98
|
});
|
|
102
99
|
|
|
103
|
-
Obj.
|
|
100
|
+
Obj.update(person, (person) => Obj.setValue(person, ['address', 'city'], 'NYC'));
|
|
104
101
|
|
|
105
102
|
expect(person.address).toBeDefined();
|
|
106
103
|
expect(person.address?.city).toBe('NYC');
|
|
@@ -114,8 +111,8 @@ describe('Obj.setValue', () => {
|
|
|
114
111
|
});
|
|
115
112
|
|
|
116
113
|
let result: any;
|
|
117
|
-
Obj.
|
|
118
|
-
result = Obj.setValue(
|
|
114
|
+
Obj.update(person, (person) => {
|
|
115
|
+
result = Obj.setValue(person, ['age'], 30);
|
|
119
116
|
});
|
|
120
117
|
|
|
121
118
|
expect(result).toBe(30);
|
|
@@ -129,7 +126,7 @@ describe('Obj.setValue', () => {
|
|
|
129
126
|
age: 25,
|
|
130
127
|
});
|
|
131
128
|
|
|
132
|
-
Obj.
|
|
129
|
+
Obj.update(person, (person) => Obj.setValue(person, ['age'], 30));
|
|
133
130
|
|
|
134
131
|
expect(person.age).toBe(30);
|
|
135
132
|
});
|
|
@@ -142,7 +139,7 @@ describe('Obj.setValue', () => {
|
|
|
142
139
|
address: { city: 'Boston', state: 'MA', coordinates: {} },
|
|
143
140
|
});
|
|
144
141
|
|
|
145
|
-
Obj.
|
|
142
|
+
Obj.update(person, (person) => Obj.setValue(person, ['address', 'city'], 'NYC'));
|
|
146
143
|
|
|
147
144
|
expect(person.address?.city).toBe('NYC');
|
|
148
145
|
expect(person.address?.state).toBe('MA');
|
|
@@ -151,20 +148,15 @@ describe('Obj.setValue', () => {
|
|
|
151
148
|
test('handles two-dimensional arrays', ({ expect }) => {
|
|
152
149
|
const Matrix = Schema.Struct({
|
|
153
150
|
values: Schema.optional(Schema.Array(Schema.Array(Schema.Number))),
|
|
154
|
-
}).pipe(
|
|
155
|
-
Type.object({
|
|
156
|
-
typename: 'test.com/Matrix',
|
|
157
|
-
version: '0.1.0',
|
|
158
|
-
}),
|
|
159
|
-
);
|
|
151
|
+
}).pipe(Type.makeObject(DXN.make('com.test.type.matrix', '0.1.0')));
|
|
160
152
|
|
|
161
153
|
const matrix = Obj.make(Matrix, {});
|
|
162
154
|
|
|
163
|
-
Obj.
|
|
164
|
-
Obj.setValue(
|
|
165
|
-
Obj.setValue(
|
|
166
|
-
Obj.setValue(
|
|
167
|
-
Obj.setValue(
|
|
155
|
+
Obj.update(matrix, (matrix) => {
|
|
156
|
+
Obj.setValue(matrix, ['values', 0, 0], 1);
|
|
157
|
+
Obj.setValue(matrix, ['values', 0, 1], 2);
|
|
158
|
+
Obj.setValue(matrix, ['values', 1, 0], 3);
|
|
159
|
+
Obj.setValue(matrix, ['values', 1, 1], 4);
|
|
168
160
|
});
|
|
169
161
|
|
|
170
162
|
expect(matrix.values?.[0][0]).toBe(1);
|
|
@@ -180,8 +172,8 @@ describe('Obj.setValue', () => {
|
|
|
180
172
|
email: 'john@example.com',
|
|
181
173
|
});
|
|
182
174
|
|
|
183
|
-
Obj.
|
|
184
|
-
expect(() => Obj.setValue(
|
|
175
|
+
Obj.update(person, (person) => {
|
|
176
|
+
expect(() => Obj.setValue(person, [], 'value')).toThrow('Path must not be empty');
|
|
185
177
|
});
|
|
186
178
|
});
|
|
187
179
|
|
|
@@ -192,7 +184,7 @@ describe('Obj.setValue', () => {
|
|
|
192
184
|
email: 'john@example.com',
|
|
193
185
|
});
|
|
194
186
|
|
|
195
|
-
Obj.
|
|
187
|
+
Obj.update(person, (person) => Obj.setValue(person, ['age'], 30));
|
|
196
188
|
|
|
197
189
|
expect(person.age).toBe(30);
|
|
198
190
|
});
|
|
@@ -205,17 +197,12 @@ describe('Obj.setValue', () => {
|
|
|
205
197
|
const Container = Schema.Struct({
|
|
206
198
|
name: Schema.String,
|
|
207
199
|
items: Schema.optional(Schema.Array(Item)),
|
|
208
|
-
}).pipe(
|
|
209
|
-
Type.object({
|
|
210
|
-
typename: 'test.com/Container',
|
|
211
|
-
version: '0.1.0',
|
|
212
|
-
}),
|
|
213
|
-
);
|
|
200
|
+
}).pipe(Type.makeObject(DXN.make('com.test.type.container', '0.1.0')));
|
|
214
201
|
|
|
215
202
|
const container = Obj.make(Container, { name: 'box' });
|
|
216
203
|
|
|
217
204
|
// Using string '0' for array index.
|
|
218
|
-
Obj.
|
|
205
|
+
Obj.update(container, (container) => Obj.setValue(container, ['items', '0', 'value'], 42));
|
|
219
206
|
|
|
220
207
|
expect(container.items?.[0].value).toBe(42);
|
|
221
208
|
});
|
|
@@ -232,18 +219,13 @@ describe('Obj.setValue', () => {
|
|
|
232
219
|
const TodoList = Schema.Struct({
|
|
233
220
|
name: Schema.String,
|
|
234
221
|
tasks: Schema.optional(Schema.Array(Task)),
|
|
235
|
-
}).pipe(
|
|
236
|
-
Type.object({
|
|
237
|
-
typename: 'test.com/TodoList',
|
|
238
|
-
version: '0.1.0',
|
|
239
|
-
}),
|
|
240
|
-
);
|
|
222
|
+
}).pipe(Type.makeObject(DXN.make('com.test.type.todoList', '0.1.0')));
|
|
241
223
|
|
|
242
224
|
const todoList = Obj.make(TodoList, { name: 'My Tasks' });
|
|
243
225
|
|
|
244
226
|
// This should work: setting a nested property on an array element.
|
|
245
227
|
// The required 'id' field should be initialized with a default value.
|
|
246
|
-
Obj.
|
|
228
|
+
Obj.update(todoList, (todoList) => Obj.setValue(todoList, ['tasks', 0, 'title'], 'Buy groceries'));
|
|
247
229
|
|
|
248
230
|
expect(todoList.tasks?.[0].id).toBe(''); // Default value for required String
|
|
249
231
|
expect(todoList.tasks?.[0].title).toBe('Buy groceries');
|
|
@@ -261,16 +243,11 @@ describe('Obj.setValue', () => {
|
|
|
261
243
|
const Container = Schema.Struct({
|
|
262
244
|
name: Schema.String,
|
|
263
245
|
items: Schema.optional(Schema.Array(Item)),
|
|
264
|
-
}).pipe(
|
|
265
|
-
Type.object({
|
|
266
|
-
typename: 'test.com/Container',
|
|
267
|
-
version: '0.1.0',
|
|
268
|
-
}),
|
|
269
|
-
);
|
|
246
|
+
}).pipe(Type.makeObject(DXN.make('com.test.type.container', '0.1.0')));
|
|
270
247
|
|
|
271
248
|
const container = Obj.make(Container, { name: 'box' });
|
|
272
249
|
|
|
273
|
-
Obj.
|
|
250
|
+
Obj.update(container, (container) => Obj.setValue(container, ['items', 0, 'label'], 'First Item'));
|
|
274
251
|
|
|
275
252
|
// All required primitive fields should have default values.
|
|
276
253
|
expect(container.items?.[0].id).toBe('');
|
|
@@ -16,12 +16,12 @@ import {
|
|
|
16
16
|
} from '@dxos/effect';
|
|
17
17
|
import { invariant } from '@dxos/invariant';
|
|
18
18
|
|
|
19
|
-
import { type Mutable } from '../proxy';
|
|
20
|
-
import { getSchema } from '../types';
|
|
19
|
+
import { type Mutable } from '../common/proxy';
|
|
20
|
+
import { getSchema } from '../common/types';
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* Set a deeply nested property on an object.
|
|
24
|
-
* Must be called within an Obj.
|
|
24
|
+
* Must be called within an Obj.update or Relation.update callback.
|
|
25
25
|
*/
|
|
26
26
|
export const setValue = (obj: Mutable<any>, path: readonly (string | number)[], value: any): void => {
|
|
27
27
|
invariant(path.length > 0, 'Path must not be empty');
|
|
@@ -2,13 +2,25 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import { assertArgument } from '@dxos/invariant';
|
|
5
6
|
import { deepMapValues } from '@dxos/util';
|
|
6
7
|
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
import {
|
|
9
|
+
KindId,
|
|
10
|
+
MetaId,
|
|
11
|
+
ObjectDatabaseId,
|
|
12
|
+
ObjectDeletedId,
|
|
13
|
+
ParentId,
|
|
14
|
+
RelationSourceDXNId,
|
|
15
|
+
RelationSourceId,
|
|
16
|
+
RelationTargetDXNId,
|
|
17
|
+
RelationTargetId,
|
|
18
|
+
SchemaId,
|
|
19
|
+
SelfURIId,
|
|
20
|
+
SnapshotKindId,
|
|
21
|
+
TypeEntityId,
|
|
22
|
+
TypeId,
|
|
23
|
+
} from '../common/types';
|
|
12
24
|
|
|
13
25
|
/**
|
|
14
26
|
* Copy a Symbol-keyed property from source to target if it has a defined value.
|
|
@@ -45,6 +57,8 @@ const copySymbolProperty = (
|
|
|
45
57
|
* The snapshot is branded with SnapshotKindId (not KindId).
|
|
46
58
|
*/
|
|
47
59
|
export const getSnapshot = <T extends object>(obj: T): T => {
|
|
60
|
+
assertArgument(typeof obj === 'object' && obj !== null && KindId in obj, 'obj', 'must be an entity');
|
|
61
|
+
|
|
48
62
|
const snapshot = deepMapValues(obj, (value, recurse) => {
|
|
49
63
|
// Do not recurse on references (but do recurse on arrays).
|
|
50
64
|
if (
|
|
@@ -66,28 +80,32 @@ export const getSnapshot = <T extends object>(obj: T): T => {
|
|
|
66
80
|
|
|
67
81
|
// Preserve Symbol-keyed properties that are important for type introspection.
|
|
68
82
|
// These are not copied by deepMapValues since Object.keys() doesn't include symbols.
|
|
69
|
-
|
|
70
|
-
const source = obj as any;
|
|
83
|
+
const source = obj as any;
|
|
71
84
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
85
|
+
// Type introspection symbols.
|
|
86
|
+
copySymbolProperty(source, snapshot, TypeId);
|
|
87
|
+
copySymbolProperty(source, snapshot, SchemaId);
|
|
88
|
+
copySymbolProperty(source, snapshot, TypeEntityId);
|
|
89
|
+
copySymbolProperty(source, snapshot, SelfURIId);
|
|
75
90
|
|
|
76
|
-
|
|
77
|
-
|
|
91
|
+
// Database reference (required for Obj.getDatabase to work on snapshots).
|
|
92
|
+
copySymbolProperty(source, snapshot, ObjectDatabaseId);
|
|
93
|
+
copySymbolProperty(source, snapshot, ObjectDeletedId);
|
|
78
94
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
keys: [...(meta?.keys ?? [])],
|
|
82
|
-
tags: [...(meta?.tags ?? [])],
|
|
83
|
-
}));
|
|
95
|
+
// Parent reference (required for Obj.getParent to work on snapshots).
|
|
96
|
+
copySymbolProperty(source, snapshot, ParentId);
|
|
84
97
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
98
|
+
// Metadata symbol. Copy arrays so the snapshot is not affected by mutations to the live meta's keys/tags.
|
|
99
|
+
copySymbolProperty(source, snapshot, MetaId, (meta: any) => ({
|
|
100
|
+
keys: [...(meta?.keys ?? [])],
|
|
101
|
+
tags: [...(meta?.tags ?? [])],
|
|
102
|
+
}));
|
|
103
|
+
|
|
104
|
+
// Relation endpoint symbols.
|
|
105
|
+
copySymbolProperty(source, snapshot, RelationSourceDXNId);
|
|
106
|
+
copySymbolProperty(source, snapshot, RelationTargetDXNId);
|
|
107
|
+
copySymbolProperty(source, snapshot, RelationSourceId);
|
|
108
|
+
copySymbolProperty(source, snapshot, RelationTargetId);
|
|
91
109
|
|
|
92
110
|
return Object.freeze(snapshot) as T;
|
|
93
111
|
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
import * as SchemaAST from 'effect/SchemaAST';
|
|
7
|
+
import { describe, expect, test } from 'vitest';
|
|
8
|
+
|
|
9
|
+
import { DXN } from '@dxos/keys';
|
|
10
|
+
|
|
11
|
+
import * as Type from '../../Type';
|
|
12
|
+
import { EchoObjectSchema } from '../Entity';
|
|
13
|
+
|
|
14
|
+
const Organization = Schema.Struct({
|
|
15
|
+
name: Schema.String,
|
|
16
|
+
}).pipe(EchoObjectSchema(DXN.make('com.example.type.organization', '0.1.0')));
|
|
17
|
+
|
|
18
|
+
type Organization = Type.InstanceType<typeof Organization>;
|
|
19
|
+
|
|
20
|
+
describe('EchoObjectSchema DSL', () => {
|
|
21
|
+
test('type is a Type.Type entity', async () => {
|
|
22
|
+
expect(Schema.isSchema(Type.getSchema(Organization))).to.be.true;
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
test('static typename accessor', async () => {
|
|
26
|
+
expect(Type.getTypename(Organization)).to.eq('com.example.type.organization');
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test('expect schema', async () => {
|
|
30
|
+
expect(SchemaAST.isTypeLiteral(Type.getSchema(Organization).ast)).to.be.true;
|
|
31
|
+
});
|
|
32
|
+
});
|
|
@@ -4,17 +4,17 @@
|
|
|
4
4
|
|
|
5
5
|
import type * as Schema from 'effect/Schema';
|
|
6
6
|
|
|
7
|
-
import { type TypeMeta } from '../
|
|
8
|
-
import { type AnyEntity } from '../types';
|
|
7
|
+
import { type TypeMeta } from '../Annotation';
|
|
8
|
+
import { type AnyEntity } from '../common/types';
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* Definition for an object type that can be stored in an ECHO database.
|
|
12
12
|
* Implements effect schema to define object properties.
|
|
13
13
|
* Has a typename and version.
|
|
14
14
|
*
|
|
15
|
-
* In contrast to
|
|
15
|
+
* In contrast to a stored `Type.Type` entity, this definition is not recorded in the database.
|
|
16
16
|
*
|
|
17
|
-
* @deprecated Use `Type.
|
|
17
|
+
* @deprecated Use `Type.AnyObj` from `@dxos/echo` instead.
|
|
18
18
|
*/
|
|
19
19
|
export interface TypedObject<A = any, I = any> extends TypeMeta, Schema.Schema<A, I> {}
|
|
20
20
|
|
|
@@ -22,7 +22,7 @@ export interface TypedObject<A = any, I = any> extends TypeMeta, Schema.Schema<A
|
|
|
22
22
|
* Typed object that could be used as a prototype in class definitions.
|
|
23
23
|
* This is an internal API type.
|
|
24
24
|
*
|
|
25
|
-
* @deprecated Use `Type.
|
|
25
|
+
* @deprecated Use `Type.AnyObj` from `@dxos/echo` instead.
|
|
26
26
|
*/
|
|
27
27
|
export interface TypedObjectPrototype<A = any, I = any> extends TypedObject<A, I> {
|
|
28
28
|
/** Type constructor. */
|