@dxos/echo 0.8.4-main.40e3dcdf1b → 0.8.4-main.43cb759274
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +102 -5
- package/README.md +7 -7
- package/dist/lib/neutral/Annotation.mjs +29 -6
- package/dist/lib/neutral/Database.mjs +8 -9
- package/dist/lib/neutral/Entity.mjs +29 -18
- package/dist/lib/neutral/Err.mjs +3 -3
- package/dist/lib/neutral/Feed.mjs +27 -19
- package/dist/lib/neutral/Filter.mjs +25 -15
- package/dist/lib/neutral/Format.mjs +23 -3
- package/dist/lib/neutral/JsonSchema.mjs +7 -8
- package/dist/lib/neutral/Key.mjs +9 -5
- package/dist/lib/neutral/Migration.mjs +18 -0
- package/dist/lib/neutral/Obj.mjs +25 -19
- package/dist/lib/neutral/Order.mjs +1 -1
- package/dist/lib/neutral/Query.mjs +19 -16
- package/dist/lib/neutral/QueryResult.mjs +1 -1
- package/dist/lib/neutral/Ref.mjs +10 -9
- package/dist/lib/neutral/Registry.mjs +14 -0
- package/dist/lib/neutral/Registry.mjs.map +7 -0
- package/dist/lib/neutral/Relation.mjs +26 -24
- package/dist/lib/neutral/Scope.mjs +12 -0
- package/dist/lib/neutral/Scope.mjs.map +7 -0
- package/dist/lib/neutral/Tag.mjs +17 -13
- package/dist/lib/neutral/Type.mjs +52 -26
- package/dist/lib/neutral/chunk-3DKP2EIN.mjs +31 -0
- package/dist/lib/neutral/chunk-3DKP2EIN.mjs.map +7 -0
- package/dist/lib/neutral/chunk-4BB4MFCN.mjs +154 -0
- package/dist/lib/neutral/chunk-4BB4MFCN.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-CIRHIEMW.mjs → chunk-4SFPZJVA.mjs} +92 -112
- package/dist/lib/neutral/chunk-4SFPZJVA.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-YWXWXIE5.mjs → chunk-4Z6GET2X.mjs} +3 -3
- package/dist/lib/neutral/chunk-4Z6GET2X.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-ANHVGJI4.mjs → chunk-7LOUAPYZ.mjs} +9 -5
- package/dist/lib/neutral/chunk-7LOUAPYZ.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-43Y5DOS6.mjs → chunk-7OAFN3OX.mjs} +75 -112
- package/dist/lib/neutral/chunk-7OAFN3OX.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-BOZZPUXE.mjs → chunk-7PRCIDHH.mjs} +41 -81
- package/dist/lib/neutral/chunk-7PRCIDHH.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-UBEZSGXY.mjs → chunk-BBFJWWAV.mjs} +6 -6
- package/dist/lib/neutral/chunk-BBFJWWAV.mjs.map +7 -0
- package/dist/lib/neutral/chunk-BDQGMDIX.mjs +132 -0
- package/dist/lib/neutral/chunk-BDQGMDIX.mjs.map +7 -0
- package/dist/lib/neutral/chunk-CGTI5MXO.mjs +36 -0
- package/dist/lib/neutral/chunk-CGTI5MXO.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-OMUPQMLR.mjs → chunk-DKLUHO4T.mjs} +1 -1
- package/dist/lib/neutral/chunk-DKLUHO4T.mjs.map +7 -0
- package/dist/lib/neutral/chunk-DMN2CKPX.mjs +93 -0
- package/dist/lib/neutral/chunk-DMN2CKPX.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-UTBRYVQC.mjs → chunk-G6CFWUYH.mjs} +2 -2
- package/dist/lib/neutral/chunk-H26LSXVJ.mjs +653 -0
- package/dist/lib/neutral/chunk-H26LSXVJ.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-FXEG7EOK.mjs → chunk-J3MNM65T.mjs} +9 -6
- package/dist/lib/neutral/chunk-J3MNM65T.mjs.map +7 -0
- package/dist/lib/neutral/chunk-JE7AOSWF.mjs +247 -0
- package/dist/lib/neutral/chunk-JE7AOSWF.mjs.map +7 -0
- package/dist/lib/neutral/chunk-LAF3LSWI.mjs +379 -0
- package/dist/lib/neutral/chunk-LAF3LSWI.mjs.map +7 -0
- package/dist/lib/neutral/chunk-LMNRFOVB.mjs +108 -0
- package/dist/lib/neutral/chunk-LMNRFOVB.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-WYOKA6AE.mjs → chunk-O6BH7EPN.mjs} +31 -4
- package/dist/lib/neutral/chunk-O6BH7EPN.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-KTAWP7GI.mjs → chunk-OIYW7R2G.mjs} +99 -46
- package/dist/lib/neutral/chunk-OIYW7R2G.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-TQQZLKB7.mjs → chunk-OYUG4FHF.mjs} +648 -1228
- package/dist/lib/neutral/chunk-OYUG4FHF.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-NQRLRYJM.mjs → chunk-Q5FKCVBC.mjs} +173 -60
- package/dist/lib/neutral/chunk-Q5FKCVBC.mjs.map +7 -0
- package/dist/lib/neutral/chunk-Q62IHV2N.mjs +41 -0
- package/dist/lib/neutral/chunk-Q62IHV2N.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-UFDK26FO.mjs → chunk-QVJDDG44.mjs} +69 -34
- package/dist/lib/neutral/chunk-QVJDDG44.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-B5OXLWZL.mjs → chunk-TFEWTY5A.mjs} +155 -129
- package/dist/lib/neutral/chunk-TFEWTY5A.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-UI6MWK5W.mjs → chunk-TTCSATUD.mjs} +1 -1
- package/dist/lib/neutral/{chunk-FZO7LQO7.mjs → chunk-VKWOFXT2.mjs} +22 -2
- package/dist/lib/neutral/{chunk-FZO7LQO7.mjs.map → chunk-VKWOFXT2.mjs.map} +1 -1
- package/dist/lib/neutral/{chunk-NXMFBIT5.mjs → chunk-ZACMEAYV.mjs} +89 -23
- package/dist/lib/neutral/chunk-ZACMEAYV.mjs.map +7 -0
- package/dist/lib/neutral/index.mjs +58 -38
- package/dist/lib/neutral/internal/index.mjs +131 -64
- package/dist/lib/neutral/meta.json +1 -1
- package/dist/lib/neutral/testing/index.mjs +222 -177
- package/dist/lib/neutral/testing/index.mjs.map +3 -3
- package/dist/types/src/Annotation.d.ts +108 -4
- package/dist/types/src/Annotation.d.ts.map +1 -1
- package/dist/types/src/Annotation.test.d.ts +2 -0
- package/dist/types/src/Annotation.test.d.ts.map +1 -0
- package/dist/types/src/Collection.d.ts +2 -3
- package/dist/types/src/Collection.d.ts.map +1 -1
- package/dist/types/src/Database.d.ts +56 -24
- package/dist/types/src/Database.d.ts.map +1 -1
- package/dist/types/src/Dataset.d.ts +17 -6
- package/dist/types/src/Dataset.d.ts.map +1 -1
- package/dist/types/src/Entity.d.ts +102 -26
- package/dist/types/src/Entity.d.ts.map +1 -1
- package/dist/types/src/Err.d.ts +27 -27
- package/dist/types/src/Err.d.ts.map +1 -1
- package/dist/types/src/Feed.d.ts +89 -25
- package/dist/types/src/Feed.d.ts.map +1 -1
- 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/Hypergraph.d.ts +14 -9
- package/dist/types/src/Hypergraph.d.ts.map +1 -1
- package/dist/types/src/Json.d.ts +33 -0
- package/dist/types/src/Json.d.ts.map +1 -0
- package/dist/types/src/Json.test.d.ts +2 -0
- package/dist/types/src/Json.test.d.ts.map +1 -0
- package/dist/types/src/JsonSchema.d.ts +2 -2
- package/dist/types/src/JsonSchema.d.ts.map +1 -1
- package/dist/types/src/Key.d.ts +1 -1
- package/dist/types/src/Key.d.ts.map +1 -1
- package/dist/types/src/Migration.d.ts +72 -0
- package/dist/types/src/Migration.d.ts.map +1 -0
- package/dist/types/src/Obj.d.ts +108 -65
- 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 +35 -10
- package/dist/types/src/Query.d.ts.map +1 -1
- package/dist/types/src/QueryResult.d.ts +9 -0
- package/dist/types/src/QueryResult.d.ts.map +1 -1
- package/dist/types/src/Ref.d.ts +15 -7
- package/dist/types/src/Ref.d.ts.map +1 -1
- package/dist/types/src/Registry.d.ts +131 -0
- package/dist/types/src/Registry.d.ts.map +1 -0
- package/dist/types/src/Relation.d.ts +72 -44
- package/dist/types/src/Relation.d.ts.map +1 -1
- package/dist/types/src/Scope.d.ts +34 -0
- package/dist/types/src/Scope.d.ts.map +1 -0
- package/dist/types/src/StateMap.d.ts +32 -0
- package/dist/types/src/StateMap.d.ts.map +1 -0
- package/dist/types/src/StateMap.test.d.ts +2 -0
- package/dist/types/src/StateMap.test.d.ts.map +1 -0
- package/dist/types/src/Tag.d.ts +21 -5
- package/dist/types/src/Tag.d.ts.map +1 -1
- package/dist/types/src/TagIndex.d.ts +36 -0
- package/dist/types/src/TagIndex.d.ts.map +1 -0
- package/dist/types/src/TagIndex.test.d.ts +2 -0
- package/dist/types/src/TagIndex.test.d.ts.map +1 -0
- package/dist/types/src/Tagging.d.ts +31 -0
- package/dist/types/src/Tagging.d.ts.map +1 -0
- package/dist/types/src/Type.d.ts +357 -96
- package/dist/types/src/Type.d.ts.map +1 -1
- package/dist/types/src/View.d.ts +2 -5
- package/dist/types/src/View.d.ts.map +1 -1
- package/dist/types/src/exemplars.test.d.ts +2 -0
- package/dist/types/src/exemplars.test.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +8 -2
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/internal/Annotation/annotations.d.ts +79 -37
- package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -1
- package/dist/types/src/internal/Annotation/dictionary.d.ts +24 -0
- package/dist/types/src/internal/Annotation/dictionary.d.ts.map +1 -0
- package/dist/types/src/internal/Annotation/entity-dictionary.d.ts +14 -0
- package/dist/types/src/internal/Annotation/entity-dictionary.d.ts.map +1 -0
- package/dist/types/src/internal/Annotation/index.d.ts +4 -2
- package/dist/types/src/internal/Annotation/index.d.ts.map +1 -1
- package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -1
- package/dist/types/src/internal/Annotation/util.d.ts +14 -5
- package/dist/types/src/internal/Annotation/util.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/api.d.ts +3 -3
- package/dist/types/src/internal/Entity/api.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/entity.d.ts +72 -8
- package/dist/types/src/internal/Entity/entity.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/guard.d.ts +10 -0
- package/dist/types/src/internal/Entity/guard.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/index.d.ts +2 -0
- package/dist/types/src/internal/Entity/index.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/model.d.ts +20 -17
- package/dist/types/src/internal/Entity/model.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/object.d.ts +3 -3
- package/dist/types/src/internal/Entity/object.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/relation.d.ts +30 -7
- package/dist/types/src/internal/Entity/relation.d.ts.map +1 -1
- package/dist/types/src/internal/Entity/type-kind.d.ts +24 -0
- package/dist/types/src/internal/Entity/type-kind.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/type-uri.d.ts +25 -0
- package/dist/types/src/internal/Entity/type-uri.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/version.d.ts.map +1 -1
- package/dist/types/src/internal/Format/date.d.ts.map +1 -1
- package/dist/types/src/internal/Format/format.d.ts +3 -2
- package/dist/types/src/internal/Format/format.d.ts.map +1 -1
- package/dist/types/src/internal/Format/index.d.ts +2 -2
- package/dist/types/src/internal/Format/index.d.ts.map +1 -1
- package/dist/types/src/internal/Format/number.d.ts.map +1 -1
- package/dist/types/src/internal/Format/object.d.ts +3 -1
- package/dist/types/src/internal/Format/object.d.ts.map +1 -1
- package/dist/types/src/internal/Format/types.d.ts.map +1 -1
- package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -1
- package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts +28 -28
- package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -1
- package/dist/types/src/internal/JsonSchema/json-schema.d.ts +3 -2
- package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/clone.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/common.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/create-object.d.ts +11 -12
- package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/index.d.ts +0 -1
- package/dist/types/src/internal/Obj/index.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/json-serializer.d.ts +11 -10
- package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/set-value.d.ts +1 -1
- package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -1
- package/dist/types/src/internal/Obj/typed-object.d.ts +1 -1
- package/dist/types/src/internal/Query.d.ts +10 -0
- package/dist/types/src/internal/Query.d.ts.map +1 -0
- package/dist/types/src/internal/Ref/ref-array.d.ts +2 -2
- package/dist/types/src/internal/Ref/ref-array.d.ts.map +1 -1
- package/dist/types/src/internal/Ref/ref.d.ts +42 -19
- package/dist/types/src/internal/Ref/ref.d.ts.map +1 -1
- package/dist/types/src/internal/Type/compose.d.ts.map +1 -1
- package/dist/types/src/internal/Type/index.d.ts +1 -2
- package/dist/types/src/internal/Type/index.d.ts.map +1 -1
- package/dist/types/src/internal/Type/manipulation.d.ts +0 -1
- package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -1
- package/dist/types/src/internal/Type/type-schema.d.ts +52 -0
- package/dist/types/src/internal/Type/type-schema.d.ts.map +1 -0
- package/dist/types/src/internal/common/api/meta.d.ts +14 -11
- package/dist/types/src/internal/common/api/meta.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/change-context.d.ts +1 -1
- package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/errors.d.ts +1 -1
- package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/event-batch.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/make-object.d.ts +11 -5
- package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/ownership.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/reactive-array.d.ts +1 -1
- package/dist/types/src/internal/common/proxy/reactive.d.ts +1 -1
- package/dist/types/src/internal/common/proxy/reactive.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/reactive.test.d.ts +2 -0
- package/dist/types/src/internal/common/proxy/reactive.test.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -1
- package/dist/types/src/internal/common/proxy/typed-handler.d.ts +18 -2
- package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/base.d.ts +4 -4
- package/dist/types/src/internal/common/types/base.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/entity.d.ts +63 -6
- package/dist/types/src/internal/common/types/entity.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/index.d.ts +1 -1
- package/dist/types/src/internal/common/types/index.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/meta.d.ts +23 -7
- package/dist/types/src/internal/common/types/meta.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/model-symbols.d.ts +8 -4
- package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/typename.d.ts +7 -0
- package/dist/types/src/internal/common/types/typename.d.ts.map +1 -1
- package/dist/types/src/internal/common/types/version.d.ts +1 -1
- package/dist/types/src/internal/common/types/well-known-types.d.ts +11 -0
- package/dist/types/src/internal/common/types/well-known-types.d.ts.map +1 -0
- package/dist/types/src/internal/index.d.ts +2 -0
- 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 +83 -89
- package/dist/types/src/testing/test-schema.d.ts.map +1 -1
- package/dist/types/src/testing/util.d.ts +5 -3
- package/dist/types/src/testing/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +27 -19
- package/src/Annotation.test.ts +439 -0
- package/src/Annotation.ts +152 -4
- package/src/Collection.ts +6 -5
- package/src/Database.ts +117 -57
- package/src/Dataset.ts +10 -2
- package/src/Entity.test.ts +116 -6
- package/src/Entity.ts +130 -31
- package/src/Err.ts +4 -4
- package/src/Feed.ts +138 -43
- package/src/Filter.test.ts +90 -0
- package/src/Filter.ts +143 -27
- package/src/Hypergraph.ts +14 -9
- package/src/Json.test.ts +175 -0
- package/src/Json.ts +103 -0
- package/src/Key.ts +1 -1
- package/src/Migration.ts +114 -0
- package/src/Obj.test.ts +122 -19
- package/src/Obj.ts +279 -97
- package/src/Query.test.ts +317 -131
- package/src/Query.ts +181 -73
- package/src/QueryResult.ts +11 -0
- package/src/Ref.ts +22 -4
- package/src/Registry.ts +155 -0
- package/src/Relation.test.ts +10 -10
- package/src/Relation.ts +112 -71
- package/src/Scope.ts +50 -0
- package/src/StateMap.test.ts +56 -0
- package/src/StateMap.ts +99 -0
- package/src/Tag.md +88 -0
- package/src/Tag.ts +49 -6
- package/src/TagIndex.test.ts +57 -0
- package/src/TagIndex.ts +110 -0
- package/src/Tagging.ts +83 -0
- package/src/Type.test.ts +223 -18
- package/src/Type.ts +602 -132
- package/src/View.ts +11 -15
- package/src/exemplars.test.ts +21 -0
- package/src/index.ts +9 -3
- package/src/internal/Annotation/annotations.test.ts +82 -13
- package/src/internal/Annotation/annotations.ts +153 -115
- package/src/internal/Annotation/dictionary.ts +47 -0
- package/src/internal/Annotation/entity-dictionary.ts +40 -0
- package/src/internal/Annotation/index.ts +4 -2
- package/src/internal/Annotation/sorting.ts +0 -1
- package/src/internal/Annotation/util.ts +17 -8
- package/src/internal/Entity/api.ts +7 -8
- package/src/internal/Entity/entity.ts +196 -47
- package/src/internal/Entity/guard.ts +26 -0
- package/src/internal/Entity/index.ts +2 -0
- package/src/internal/Entity/model.ts +37 -28
- package/src/internal/Entity/object.ts +21 -6
- package/src/internal/Entity/relation.ts +68 -34
- package/src/internal/Entity/type-kind.ts +75 -0
- package/src/internal/Entity/type-uri.ts +87 -0
- package/src/internal/Entity/util.ts +10 -9
- package/src/internal/Entity/version.ts +0 -1
- package/src/internal/Format/date.test.ts +0 -1
- package/src/internal/Format/date.ts +0 -4
- package/src/internal/Format/format.test.ts +21 -1
- package/src/internal/Format/index.ts +2 -3
- package/src/internal/Format/object.ts +21 -4
- package/src/internal/Format/types.ts +1 -1
- package/src/internal/JsonSchema/annotations.ts +1 -1
- package/src/internal/JsonSchema/json-schema-type.ts +1 -1
- package/src/internal/JsonSchema/json-schema.test.ts +55 -142
- package/src/internal/JsonSchema/json-schema.ts +44 -31
- package/src/internal/Obj/clone.ts +9 -4
- package/src/internal/Obj/create-object.test.ts +13 -13
- package/src/internal/Obj/create-object.ts +68 -24
- package/src/internal/Obj/deleted.ts +1 -1
- package/src/internal/Obj/index.ts +0 -1
- package/src/internal/Obj/inspect.ts +4 -3
- package/src/internal/Obj/json-serializer.test.ts +102 -24
- package/src/internal/Obj/json-serializer.ts +105 -43
- package/src/internal/Obj/set-value.test.ts +31 -54
- package/src/internal/Obj/set-value.ts +1 -1
- package/src/internal/Obj/snapshot.ts +11 -4
- package/src/internal/Obj/typed-object.test.ts +9 -11
- package/src/internal/Obj/typed-object.ts +1 -1
- package/src/internal/Query.ts +159 -0
- package/src/internal/Ref/ref-array.ts +3 -4
- package/src/internal/Ref/ref.test.ts +17 -27
- package/src/internal/Ref/ref.ts +124 -59
- package/src/internal/Type/compose.test.ts +3 -2
- package/src/internal/Type/index.ts +1 -2
- package/src/internal/Type/manipulation.ts +0 -25
- package/src/internal/Type/type-schema.ts +60 -0
- package/src/internal/common/README.md +2 -2
- package/src/internal/common/api/meta.ts +19 -17
- package/src/internal/common/proxy/change-context.ts +1 -1
- package/src/internal/common/proxy/change.test.ts +118 -110
- package/src/internal/common/proxy/errors.ts +2 -2
- package/src/internal/common/proxy/handler.test.ts +1 -3
- package/src/internal/common/proxy/json-serializer.ts +26 -16
- package/src/internal/common/proxy/make-object.ts +43 -21
- package/src/internal/common/proxy/ownership.ts +2 -3
- package/src/internal/common/proxy/reactive-array.ts +1 -1
- package/src/internal/common/proxy/reactive.test.ts +54 -0
- package/src/internal/common/proxy/reactive.ts +11 -3
- package/src/internal/common/proxy/schema.test.ts +48 -86
- package/src/internal/common/proxy/typed-handler.test.ts +12 -12
- package/src/internal/common/proxy/typed-handler.ts +79 -19
- package/src/internal/common/proxy/typed-object.test.ts +16 -29
- package/src/internal/common/types/base.ts +4 -4
- package/src/internal/common/types/entity.ts +81 -2
- package/src/internal/common/types/index.ts +6 -1
- package/src/internal/common/types/meta.ts +49 -15
- package/src/internal/common/types/model-symbols.ts +16 -4
- package/src/internal/common/types/typename.ts +39 -3
- package/src/internal/common/types/well-known-types.ts +15 -0
- package/src/internal/index.ts +6 -0
- package/src/testing/api.test.ts +15 -10
- package/src/testing/test-data.ts +159 -100
- package/src/testing/test-schema.ts +22 -58
- package/src/testing/util.ts +14 -11
- package/dist/lib/neutral/SchemaRegistry.mjs +0 -2
- package/dist/lib/neutral/chunk-43Y5DOS6.mjs.map +0 -7
- package/dist/lib/neutral/chunk-724GQYEN.mjs +0 -56
- package/dist/lib/neutral/chunk-724GQYEN.mjs.map +0 -7
- package/dist/lib/neutral/chunk-ANHVGJI4.mjs.map +0 -7
- package/dist/lib/neutral/chunk-B5OXLWZL.mjs.map +0 -7
- package/dist/lib/neutral/chunk-BNCCGLJN.mjs +0 -7
- package/dist/lib/neutral/chunk-BNCCGLJN.mjs.map +0 -7
- package/dist/lib/neutral/chunk-BOZZPUXE.mjs.map +0 -7
- package/dist/lib/neutral/chunk-CIRHIEMW.mjs.map +0 -7
- package/dist/lib/neutral/chunk-DYDJBZEG.mjs +0 -102
- package/dist/lib/neutral/chunk-DYDJBZEG.mjs.map +0 -7
- package/dist/lib/neutral/chunk-FXEG7EOK.mjs.map +0 -7
- package/dist/lib/neutral/chunk-KTAWP7GI.mjs.map +0 -7
- package/dist/lib/neutral/chunk-NEGC54NE.mjs +0 -130
- package/dist/lib/neutral/chunk-NEGC54NE.mjs.map +0 -7
- package/dist/lib/neutral/chunk-NQRLRYJM.mjs.map +0 -7
- package/dist/lib/neutral/chunk-NXMFBIT5.mjs.map +0 -7
- package/dist/lib/neutral/chunk-OENWMTE6.mjs +0 -45
- package/dist/lib/neutral/chunk-OENWMTE6.mjs.map +0 -7
- package/dist/lib/neutral/chunk-OMUPQMLR.mjs.map +0 -7
- package/dist/lib/neutral/chunk-RMLF7JOZ.mjs +0 -97
- package/dist/lib/neutral/chunk-RMLF7JOZ.mjs.map +0 -7
- package/dist/lib/neutral/chunk-SEMVAGBM.mjs +0 -355
- package/dist/lib/neutral/chunk-SEMVAGBM.mjs.map +0 -7
- package/dist/lib/neutral/chunk-TQQZLKB7.mjs.map +0 -7
- package/dist/lib/neutral/chunk-UBEZSGXY.mjs.map +0 -7
- package/dist/lib/neutral/chunk-UFDK26FO.mjs.map +0 -7
- package/dist/lib/neutral/chunk-VA2F47ZC.mjs +0 -152
- package/dist/lib/neutral/chunk-VA2F47ZC.mjs.map +0 -7
- package/dist/lib/neutral/chunk-WYOKA6AE.mjs.map +0 -7
- package/dist/lib/neutral/chunk-YWXWXIE5.mjs.map +0 -7
- package/dist/types/src/SchemaRegistry.d.ts +0 -84
- package/dist/types/src/SchemaRegistry.d.ts.map +0 -1
- package/dist/types/src/internal/Obj/ids.d.ts +0 -6
- package/dist/types/src/internal/Obj/ids.d.ts.map +0 -1
- package/dist/types/src/internal/Type/echo-schema.d.ts +0 -181
- package/dist/types/src/internal/Type/echo-schema.d.ts.map +0 -1
- package/dist/types/src/internal/Type/persistent-schema.d.ts +0 -20
- package/dist/types/src/internal/Type/persistent-schema.d.ts.map +0 -1
- package/src/SchemaRegistry.ts +0 -106
- package/src/internal/Obj/ids.ts +0 -12
- package/src/internal/Type/echo-schema.ts +0 -424
- package/src/internal/Type/persistent-schema.ts +0 -33
- /package/dist/lib/neutral/{SchemaRegistry.mjs.map → Migration.mjs.map} +0 -0
- /package/dist/lib/neutral/{chunk-UTBRYVQC.mjs.map → chunk-G6CFWUYH.mjs.map} +0 -0
- /package/dist/lib/neutral/{chunk-UI6MWK5W.mjs.map → chunk-TTCSATUD.mjs.map} +0 -0
|
@@ -7,8 +7,9 @@ import { deepMapValues } from '@dxos/util';
|
|
|
7
7
|
|
|
8
8
|
import type * as Obj from '../../Obj';
|
|
9
9
|
import { makeObject } from '../common/proxy';
|
|
10
|
+
import { getSchema, getStaticTypeSchema, getType } from '../common/types';
|
|
11
|
+
import { getMeta } from '../common/types/meta';
|
|
10
12
|
import { Ref } from '../Ref';
|
|
11
|
-
import { getMeta, getSchema } from '../common/types';
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* Clones an object or relation.
|
|
@@ -17,8 +18,12 @@ import { getMeta, getSchema } from '../common/types';
|
|
|
17
18
|
*/
|
|
18
19
|
export const clone = <T extends Obj.Any>(obj: T, opts?: Obj.CloneOptions): T => {
|
|
19
20
|
const { id, ...data } = obj;
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
// Prefer cloning through the type entity so the cloned instance preserves
|
|
22
|
+
// `Obj.getType` identity. Falls back to the raw schema for older instances
|
|
23
|
+
// that don't have a type-entity back-reference set (e.g. deserialized).
|
|
24
|
+
const typeEntity = getType(obj);
|
|
25
|
+
const schema = typeEntity != null ? getStaticTypeSchema(typeEntity) : getSchema(obj);
|
|
26
|
+
invariant(schema != null, 'Object should have a type or schema');
|
|
22
27
|
const props: any = deepMapValues(data, (value, recurse) => {
|
|
23
28
|
if (Ref.isRef(value)) {
|
|
24
29
|
if (opts?.deep) {
|
|
@@ -44,5 +49,5 @@ export const clone = <T extends Obj.Any>(obj: T, opts?: Obj.CloneOptions): T =>
|
|
|
44
49
|
return recurse(value);
|
|
45
50
|
});
|
|
46
51
|
|
|
47
|
-
return makeObject(schema, props, meta);
|
|
52
|
+
return makeObject(schema, props, meta, typeEntity as object | undefined);
|
|
48
53
|
};
|
|
@@ -2,19 +2,19 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { inspect } from 'util';
|
|
6
|
-
|
|
7
5
|
import * as Schema from 'effect/Schema';
|
|
6
|
+
import { inspect } from 'util';
|
|
8
7
|
import { describe, expect, test } from 'vitest';
|
|
9
8
|
|
|
10
|
-
import { DXN } from '@dxos/keys';
|
|
9
|
+
import { DXN, EID } from '@dxos/keys';
|
|
11
10
|
|
|
12
11
|
import { Relation } from '../../index';
|
|
13
12
|
import { TestSchema } from '../../testing';
|
|
14
|
-
import
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
|
|
13
|
+
import * as Type from '../../Type';
|
|
14
|
+
import { getTypeURI } from '../Annotation';
|
|
15
|
+
import { ATTR_TYPE, getSchema } from '../common/types';
|
|
16
|
+
import { ATTR_META } from '../common/types/meta';
|
|
17
|
+
import { ATTR_RELATION_SOURCE, ATTR_RELATION_TARGET, isInstanceOf } from '../Entity';
|
|
18
18
|
import { createObject } from './create-object';
|
|
19
19
|
import { objectToJSON } from './json-serializer';
|
|
20
20
|
|
|
@@ -42,7 +42,7 @@ describe('create (static version)', () => {
|
|
|
42
42
|
expect(contact.name).toBe('Bot');
|
|
43
43
|
expect(contact.email).toBe('bot@example.com');
|
|
44
44
|
expect((contact as any)['@type']).toBeUndefined();
|
|
45
|
-
expect(
|
|
45
|
+
expect(getTypeURI(contact)?.toString()).toBe(Type.getURI(TestSchema.Person).toString());
|
|
46
46
|
expect(isInstanceOf(TestSchema.Person, contact)).toBe(true);
|
|
47
47
|
});
|
|
48
48
|
|
|
@@ -55,7 +55,7 @@ describe('create (static version)', () => {
|
|
|
55
55
|
const json = JSON.parse(JSON.stringify(contact));
|
|
56
56
|
expect(json).toEqual({
|
|
57
57
|
id: contact.id,
|
|
58
|
-
'@type': DXN.
|
|
58
|
+
'@type': DXN.make(Type.getTypename(TestSchema.Person), Type.getVersion(TestSchema.Person)),
|
|
59
59
|
'@meta': {
|
|
60
60
|
keys: [],
|
|
61
61
|
},
|
|
@@ -83,9 +83,9 @@ describe('create (static version)', () => {
|
|
|
83
83
|
const json = JSON.parse(JSON.stringify(manager));
|
|
84
84
|
expect(json).toEqual({
|
|
85
85
|
id: manager.id,
|
|
86
|
-
[ATTR_TYPE]: DXN.
|
|
87
|
-
[ATTR_RELATION_SOURCE]:
|
|
88
|
-
[ATTR_RELATION_TARGET]:
|
|
86
|
+
[ATTR_TYPE]: DXN.make(Type.getTypename(TestSchema.HasManager), Type.getVersion(TestSchema.HasManager)),
|
|
87
|
+
[ATTR_RELATION_SOURCE]: EID.make({ entityId: person1.id }),
|
|
88
|
+
[ATTR_RELATION_TARGET]: EID.make({ entityId: person2.id }),
|
|
89
89
|
[ATTR_META]: {
|
|
90
90
|
keys: [],
|
|
91
91
|
},
|
|
@@ -98,7 +98,7 @@ describe('create (static version)', () => {
|
|
|
98
98
|
email: 'bot@example.com',
|
|
99
99
|
});
|
|
100
100
|
|
|
101
|
-
expect(getSchema(contact)).toBe(TestSchema.Person);
|
|
101
|
+
expect(getSchema(contact)).toBe(Type.getSchema(TestSchema.Person));
|
|
102
102
|
});
|
|
103
103
|
|
|
104
104
|
test('inspect', () => {
|
|
@@ -2,28 +2,44 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import type * as Schema from 'effect/Schema';
|
|
6
|
-
|
|
7
5
|
import { raise } from '@dxos/debug';
|
|
8
6
|
import { assertArgument, failedInvariant } from '@dxos/invariant';
|
|
9
|
-
import {
|
|
7
|
+
import { EntityId } from '@dxos/keys';
|
|
10
8
|
|
|
11
|
-
import
|
|
9
|
+
import type * as Type from '../../Type';
|
|
10
|
+
import { getSchemaURI, getTypeAnnotation, setTypename } from '../Annotation';
|
|
11
|
+
import { defineHiddenProperty } from '../common/proxy';
|
|
12
|
+
import {
|
|
13
|
+
EntityKind,
|
|
14
|
+
KindId,
|
|
15
|
+
SchemaKindId,
|
|
16
|
+
StaticTypeSchemaSlot,
|
|
17
|
+
getStaticTypeSchema,
|
|
18
|
+
setSchema,
|
|
19
|
+
setType,
|
|
20
|
+
} from '../common/types';
|
|
21
|
+
import { MetaId, type EntityMeta } from '../common/types/meta';
|
|
12
22
|
import {
|
|
13
23
|
RelationSourceDXNId,
|
|
14
24
|
RelationSourceId,
|
|
15
25
|
RelationTargetDXNId,
|
|
16
26
|
RelationTargetId,
|
|
17
27
|
assertObjectModel,
|
|
18
|
-
|
|
28
|
+
getObjectEchoUri,
|
|
19
29
|
} from '../Entity';
|
|
20
|
-
import { defineHiddenProperty } from '../common/proxy';
|
|
21
|
-
import { EntityKind, KindId, MetaId, setSchema } from '../common/types';
|
|
22
|
-
|
|
23
30
|
import { attachedTypedObjectInspector } from './inspect';
|
|
24
31
|
import { attachTypedJsonSerializer } from './json-serializer';
|
|
25
32
|
|
|
26
|
-
|
|
33
|
+
// Omits the brand slots — those get stamped on the instance by the entity
|
|
34
|
+
// handler (KindId via setKind, SchemaKindId derived in the proxy `get` trap
|
|
35
|
+
// from kind + jsonSchema.entityKind, StaticTypeSchemaSlot lazily via the
|
|
36
|
+
// proxy), not supplied by the caller. Allows `[Obj.Meta]` (MetaId symbol) for
|
|
37
|
+
// seeding registry-provenance meta at construction (mirrors `Obj.make`).
|
|
38
|
+
export type CreateObjectProps<T> = (T extends { id: string }
|
|
39
|
+
? Omit<T, 'id' | KindId | SchemaKindId | StaticTypeSchemaSlot> & { id?: string }
|
|
40
|
+
: Omit<T, KindId | SchemaKindId | StaticTypeSchemaSlot>) & {
|
|
41
|
+
readonly [MetaId]?: Partial<EntityMeta>;
|
|
42
|
+
};
|
|
27
43
|
|
|
28
44
|
/**
|
|
29
45
|
* Creates a new object instance from a schema and data, without signal reactivity.
|
|
@@ -41,10 +57,7 @@ export type CreateObjectProps<T> = T extends { id: string } ? Omit<T, 'id' | Kin
|
|
|
41
57
|
* const Contact = Schema.Struct({
|
|
42
58
|
* name: Schema.String,
|
|
43
59
|
* email: Schema.String,
|
|
44
|
-
* }).pipe(Type.
|
|
45
|
-
* typename: 'com.example.type.person',
|
|
46
|
-
* version: '0.1.0',
|
|
47
|
-
* }))
|
|
60
|
+
* }).pipe(Type.makeObject(DXN.make('com.example.type.person', '0.1.0')))
|
|
48
61
|
*
|
|
49
62
|
* const contact = createObject(Contact, {
|
|
50
63
|
* name: "John",
|
|
@@ -53,10 +66,13 @@ export type CreateObjectProps<T> = T extends { id: string } ? Omit<T, 'id' | Kin
|
|
|
53
66
|
* ```
|
|
54
67
|
*/
|
|
55
68
|
// TODO(burdon): Make internal.
|
|
56
|
-
export const createObject
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
69
|
+
export const createObject: {
|
|
70
|
+
<T extends Type.AnyEntity>(input: T, props: NoInfer<CreateObjectProps<Type.InstanceType<T>>>): Type.InstanceType<T>;
|
|
71
|
+
} = (input: any, props: any): any => {
|
|
72
|
+
// `Type.Type` entities aren't `Schema.Schema` themselves; read the source
|
|
73
|
+
// schema off the hidden slot (persisted entities synthesize it lazily via
|
|
74
|
+
// the proxy `get` trap).
|
|
75
|
+
const schema = getStaticTypeSchema(input) ?? failedInvariant('Type entity is missing its source schema');
|
|
60
76
|
const annotation = getTypeAnnotation(schema);
|
|
61
77
|
if (!annotation) {
|
|
62
78
|
throw new Error('Schema is not an ECHO schema');
|
|
@@ -70,22 +86,50 @@ export const createObject = <S extends Schema.Schema.AnyNoContext>(
|
|
|
70
86
|
'Relation source and target must be provided together',
|
|
71
87
|
);
|
|
72
88
|
|
|
89
|
+
// Pull `[Obj.Meta]` (MetaId-symbol) off props before spreading so it doesn't
|
|
90
|
+
// leak into data. Callers use this to seed registry-provenance meta fields
|
|
91
|
+
// (`key`, `version`) and foreign keys / tags at construction time, mirroring
|
|
92
|
+
// `Obj.make`'s symbol-keyed meta convention.
|
|
93
|
+
const metaOverride = props[MetaId];
|
|
94
|
+
if (metaOverride !== undefined) {
|
|
95
|
+
delete props[MetaId];
|
|
96
|
+
}
|
|
97
|
+
|
|
73
98
|
// Raw object.
|
|
74
|
-
const obj = { ...props, id: props.id ??
|
|
99
|
+
const obj = { ...props, id: props.id ?? EntityId.random() };
|
|
75
100
|
|
|
76
|
-
// Metadata.
|
|
77
|
-
|
|
101
|
+
// Metadata. Instance-kind is read from the schema's TypeAnnotation (set by
|
|
102
|
+
// EchoObjectSchema / EchoRelationSchema / EchoTypeKindSchema): instances of
|
|
103
|
+
// a type-kind meta-schema are themselves type-kind entities, etc. The
|
|
104
|
+
// RelationSourceId-in-props check covers the legacy path where the schema
|
|
105
|
+
// annotation isn't authoritative.
|
|
106
|
+
const kind =
|
|
107
|
+
annotation.kind === EntityKind.Type
|
|
108
|
+
? EntityKind.Type
|
|
109
|
+
: annotation.kind === EntityKind.Relation || RelationSourceId in props
|
|
110
|
+
? EntityKind.Relation
|
|
111
|
+
: EntityKind.Object;
|
|
78
112
|
defineHiddenProperty(obj, KindId, kind);
|
|
79
|
-
defineHiddenProperty(obj, MetaId, {
|
|
113
|
+
defineHiddenProperty(obj, MetaId, {
|
|
114
|
+
...metaOverride,
|
|
115
|
+
keys: metaOverride?.keys ?? [],
|
|
116
|
+
tags: metaOverride?.tags ?? [],
|
|
117
|
+
annotations: metaOverride?.annotations ?? {},
|
|
118
|
+
});
|
|
80
119
|
setSchema(obj, schema);
|
|
81
|
-
|
|
120
|
+
// If the caller passed a type entity (recognised via the schema slot), keep
|
|
121
|
+
// a reference to it on the instance for `Obj.getType` / `Relation.getType`.
|
|
122
|
+
if (input !== schema) {
|
|
123
|
+
setType(obj, input);
|
|
124
|
+
}
|
|
125
|
+
setTypename(obj, getSchemaURI(schema) ?? failedInvariant('Missing schema URI'));
|
|
82
126
|
attachTypedJsonSerializer(obj);
|
|
83
127
|
attachedTypedObjectInspector(obj);
|
|
84
128
|
|
|
85
129
|
// Relation.
|
|
86
130
|
if (kind === EntityKind.Relation) {
|
|
87
|
-
const sourceDXN =
|
|
88
|
-
const targetDXN =
|
|
131
|
+
const sourceDXN = getObjectEchoUri(props[RelationSourceId]) ?? raise(new Error('Unresolved relation source'));
|
|
132
|
+
const targetDXN = getObjectEchoUri(props[RelationTargetId]) ?? raise(new Error('Unresolved relation target'));
|
|
89
133
|
defineHiddenProperty(obj, RelationSourceDXNId, sourceDXN);
|
|
90
134
|
defineHiddenProperty(obj, RelationTargetDXNId, targetDXN);
|
|
91
135
|
}
|
|
@@ -6,8 +6,9 @@ import type { InspectOptionsStylized, inspect as inspectFn } from 'node:util';
|
|
|
6
6
|
|
|
7
7
|
import { type CustomInspectFunction, inspectCustom } from '@dxos/debug';
|
|
8
8
|
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
9
|
+
import { getTypeURI } from '../Annotation';
|
|
10
|
+
import { ATTR_TYPE, type AnyEntity } from '../common/types';
|
|
11
|
+
import { ATTR_META, MetaId } from '../common/types/meta';
|
|
11
12
|
|
|
12
13
|
/*
|
|
13
14
|
* @internal
|
|
@@ -37,7 +38,7 @@ const typedObjectInspectFunction: CustomInspectFunction<AnyEntity> = function (
|
|
|
37
38
|
return inspect(
|
|
38
39
|
{
|
|
39
40
|
id,
|
|
40
|
-
[ATTR_TYPE]:
|
|
41
|
+
[ATTR_TYPE]: getTypeURI(this),
|
|
41
42
|
...props,
|
|
42
43
|
[ATTR_META]: (this as any)[MetaId], // TODO(dmaretskyi): Couldn't use getMeta since that throw's if the object has no meta.
|
|
43
44
|
},
|
|
@@ -2,27 +2,29 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
5
6
|
import { describe, expect, test } from 'vitest';
|
|
6
7
|
|
|
7
|
-
import { DXN } from '@dxos/keys';
|
|
8
|
+
import { DXN, EID } from '@dxos/keys';
|
|
8
9
|
|
|
9
10
|
import * as Obj from '../../Obj';
|
|
10
11
|
import { TestSchema } from '../../testing';
|
|
11
|
-
import
|
|
12
|
+
import * as Type from '../../Type';
|
|
13
|
+
import { getTypeURI, getTypename } from '../Annotation';
|
|
12
14
|
import { getMetaChecked } from '../common/api';
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
+
import { ATTR_TYPE, EntityKind, KindId, TypeId, getSchema } from '../common/types';
|
|
16
|
+
import { MetaId } from '../common/types/meta';
|
|
17
|
+
import { RelationSourceId, RelationTargetId, getObjectEchoUri } from '../Entity';
|
|
18
|
+
import * as JsonSchema from '../JsonSchema';
|
|
15
19
|
import { Ref, StaticRefResolver } from '../Ref';
|
|
16
|
-
import { ATTR_TYPE, EntityKind, KindId, MetaId, TypeId, getSchema } from '../common/types';
|
|
17
|
-
|
|
18
20
|
import { createObject } from './create-object';
|
|
19
21
|
import { objectFromJSON, objectToJSON } from './json-serializer';
|
|
20
22
|
|
|
21
23
|
describe('Object JSON serializer', () => {
|
|
22
24
|
test('should serialize and deserialize object', async () => {
|
|
23
|
-
const contact =
|
|
24
|
-
Obj.
|
|
25
|
-
getMetaChecked(
|
|
25
|
+
const contact = Obj.make(TestSchema.Person, { name: 'Alice' });
|
|
26
|
+
Obj.update(contact, (contact) => {
|
|
27
|
+
getMetaChecked(contact).keys.push({ id: '12345', source: 'example.com' });
|
|
26
28
|
});
|
|
27
29
|
|
|
28
30
|
const task = createObject(TestSchema.Task, {
|
|
@@ -34,13 +36,13 @@ describe('Object JSON serializer', () => {
|
|
|
34
36
|
const taskJson = objectToJSON(task);
|
|
35
37
|
|
|
36
38
|
expect(contactJson.id).toBe(contact.id);
|
|
37
|
-
expect(contactJson[ATTR_TYPE]).toEqual(
|
|
39
|
+
expect(contactJson[ATTR_TYPE]).toEqual(Type.getURI(TestSchema.Person).toString());
|
|
38
40
|
expect(contactJson.name).toEqual('Alice');
|
|
39
41
|
|
|
40
42
|
expect(taskJson.id).toBe(task.id);
|
|
41
|
-
expect(taskJson[ATTR_TYPE]).toEqual(
|
|
43
|
+
expect(taskJson[ATTR_TYPE]).toEqual(Type.getURI(TestSchema.Task).toString());
|
|
42
44
|
expect(taskJson.title).toEqual('Fix the tests');
|
|
43
|
-
expect(taskJson.assignee).toEqual({ '/':
|
|
45
|
+
expect(taskJson.assignee).toEqual({ '/': EID.make({ entityId: contact.id }) });
|
|
44
46
|
|
|
45
47
|
const refResolver = new StaticRefResolver()
|
|
46
48
|
.addSchema(TestSchema.Person)
|
|
@@ -53,7 +55,7 @@ describe('Object JSON serializer', () => {
|
|
|
53
55
|
|
|
54
56
|
expect(contactFromJson.id).toBe(contact.id);
|
|
55
57
|
expect(contactFromJson.name).toBe('Alice');
|
|
56
|
-
expect((contactFromJson as any)[TypeId]).toEqual(
|
|
58
|
+
expect((contactFromJson as any)[TypeId]).toEqual(Type.getURI(TestSchema.Person));
|
|
57
59
|
expect((contactFromJson as any)[KindId]).toBe(EntityKind.Object);
|
|
58
60
|
expect((contactFromJson as any)[RelationSourceId]).toBeUndefined();
|
|
59
61
|
expect((contactFromJson as any)[RelationTargetId]).toBeUndefined();
|
|
@@ -64,23 +66,25 @@ describe('Object JSON serializer', () => {
|
|
|
64
66
|
source: 'example.com',
|
|
65
67
|
},
|
|
66
68
|
],
|
|
69
|
+
tags: [],
|
|
70
|
+
annotations: {},
|
|
67
71
|
});
|
|
68
|
-
expect(
|
|
69
|
-
expect(getTypename(contactFromJson)).toBe(
|
|
70
|
-
expect(
|
|
71
|
-
expect(getSchema(contactFromJson)).toEqual(TestSchema.Person);
|
|
72
|
+
expect(getTypeURI(contactFromJson)?.toString()).toBe(Type.getURI(TestSchema.Person).toString());
|
|
73
|
+
expect(getTypename(contactFromJson)).toBe(Type.getTypename(TestSchema.Person));
|
|
74
|
+
expect(getObjectEchoUri(contactFromJson)?.toString()).toEqual(getObjectEchoUri(contact)?.toString());
|
|
75
|
+
expect(getSchema(contactFromJson)).toEqual(Type.getSchema(TestSchema.Person));
|
|
72
76
|
|
|
73
77
|
expect(taskFromJson.id).toBe(task.id);
|
|
74
78
|
expect(taskFromJson.title).toBe('Fix the tests');
|
|
75
|
-
expect(taskFromJson.assignee!.
|
|
79
|
+
expect(taskFromJson.assignee!.uri).toEqual(EID.make({ entityId: contact.id }));
|
|
76
80
|
expect(taskFromJson.assignee!.target).toEqual(contact);
|
|
77
81
|
expect(await taskFromJson.assignee!.load()).toEqual(contact);
|
|
78
|
-
expect((taskFromJson as any)[TypeId]).toEqual(
|
|
82
|
+
expect((taskFromJson as any)[TypeId]).toEqual(Type.getURI(TestSchema.Task));
|
|
79
83
|
expect((taskFromJson as any)[KindId]).toBe(EntityKind.Object);
|
|
80
84
|
expect((taskFromJson as any)[RelationSourceId]).toBeUndefined();
|
|
81
85
|
expect((taskFromJson as any)[RelationTargetId]).toBeUndefined();
|
|
82
|
-
expect((taskFromJson as any)[MetaId]).toEqual({ keys: [] });
|
|
83
|
-
expect(getSchema(taskFromJson)).toEqual(TestSchema.Task);
|
|
86
|
+
expect((taskFromJson as any)[MetaId]).toEqual({ keys: [], tags: [], annotations: {} });
|
|
87
|
+
expect(getSchema(taskFromJson)).toEqual(Type.getSchema(TestSchema.Task));
|
|
84
88
|
});
|
|
85
89
|
|
|
86
90
|
test('serialize with unresolved schema', async () => {
|
|
@@ -91,9 +95,20 @@ describe('Object JSON serializer', () => {
|
|
|
91
95
|
expect(contactFromJson.id).toBe(contact.id);
|
|
92
96
|
expect(contactFromJson.name).toBe('Alice');
|
|
93
97
|
expect(getSchema(contactFromJson)).toBeUndefined();
|
|
94
|
-
expect(getTypename(contactFromJson)).toEqual(
|
|
95
|
-
expect(
|
|
96
|
-
expect(
|
|
98
|
+
expect(getTypename(contactFromJson)).toEqual(Type.getTypename(TestSchema.Person));
|
|
99
|
+
expect(getObjectEchoUri(contactFromJson)).toEqual(getObjectEchoUri(contact));
|
|
100
|
+
expect(getTypeURI(contactFromJson)).toEqual(Type.getURI(TestSchema.Person));
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test('upgrades legacy string tags to encoded references on deserialize', async () => {
|
|
104
|
+
const expando = Obj.make(TestSchema.Expando, { message: 'hi' });
|
|
105
|
+
const json = objectToJSON(expando) as any;
|
|
106
|
+
// Simulate data serialized before the tags-as-refs migration: bare DXN strings.
|
|
107
|
+
json['@meta'] = { keys: [], tags: ['dxn:echo:@:TAGLEGACY'] };
|
|
108
|
+
|
|
109
|
+
const fromJson = (await objectFromJSON(json)) as any;
|
|
110
|
+
// Decodes to a materialized `Ref` (the shared ref codec), not a raw encoded reference.
|
|
111
|
+
expect(fromJson[MetaId].tags.map((ref: any) => ref.uri)).toEqual(['dxn:echo:@:TAGLEGACY']);
|
|
97
112
|
});
|
|
98
113
|
|
|
99
114
|
test('deserializes expando without leaking internal json keys', async () => {
|
|
@@ -118,4 +133,67 @@ describe('Object JSON serializer', () => {
|
|
|
118
133
|
expect(expandoFromJson.message).toBe('local-only');
|
|
119
134
|
expect((expandoFromJson as any)[ATTR_TYPE]).toBeUndefined();
|
|
120
135
|
});
|
|
136
|
+
|
|
137
|
+
// `objectFromJSON` is the deserialization path for queue messages and devtools
|
|
138
|
+
// round-trips. For persisted `Type.Type` entities it must stamp `KindId = Type`
|
|
139
|
+
// (not Object), mirroring the kind resolution that `createObject` does for the
|
|
140
|
+
// in-memory path. Otherwise `Filter.type(Type.Type)` / `Type.isType` skip them.
|
|
141
|
+
describe('Type.Type round-trip', () => {
|
|
142
|
+
test('preserves KindId=Type for a persisted Type.Type entity', async ({ expect }) => {
|
|
143
|
+
const typeEntity = Type.makeObjectFromJsonSchema({
|
|
144
|
+
typename: 'com.example.type.regression',
|
|
145
|
+
version: '0.1.0',
|
|
146
|
+
jsonSchema: JsonSchema.toJsonSchema(Schema.Struct({ field: Schema.Number })),
|
|
147
|
+
name: 'Regression Type',
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
const typeJson = objectToJSON(typeEntity as any);
|
|
151
|
+
const refResolver = new StaticRefResolver().addSchema(Type.Type);
|
|
152
|
+
const reconstructed = (await objectFromJSON(typeJson, { refResolver })) as any;
|
|
153
|
+
|
|
154
|
+
expect(reconstructed[KindId]).toBe(EntityKind.Type);
|
|
155
|
+
expect(Type.isType(reconstructed)).toBe(true);
|
|
156
|
+
// `typename` lives in `EntityMeta.key` on persisted Type.Type entities
|
|
157
|
+
// — surfaced via `Type.getTypename`.
|
|
158
|
+
expect(Type.getTypename(reconstructed)).toBe('com.example.type.regression');
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
describe('Uint8Array', () => {
|
|
163
|
+
const Blob = Schema.Struct({
|
|
164
|
+
name: Schema.String,
|
|
165
|
+
bytes: Schema.Uint8ArrayFromSelf,
|
|
166
|
+
}).pipe(Type.makeObject(DXN.make('com.example.type.blob', '0.1.0')));
|
|
167
|
+
type Blob = Type.InstanceType<typeof Blob>;
|
|
168
|
+
|
|
169
|
+
test('round-trips Uint8Array field through JSON with schema', async ({ expect }) => {
|
|
170
|
+
const bytes = new Uint8Array([0, 1, 2, 3, 250, 251, 252, 253, 254, 255]);
|
|
171
|
+
const blob = Obj.make(Blob, { name: 'blob', bytes });
|
|
172
|
+
|
|
173
|
+
const blobJson = objectToJSON(blob);
|
|
174
|
+
// JSON must round-trip through stringify/parse without loss.
|
|
175
|
+
const roundTripped = JSON.parse(JSON.stringify(blobJson));
|
|
176
|
+
|
|
177
|
+
const refResolver = new StaticRefResolver().addSchema(Blob);
|
|
178
|
+
const blobFromJson = (await objectFromJSON(roundTripped, { refResolver })) as Blob;
|
|
179
|
+
|
|
180
|
+
expect(blobFromJson.name).toBe('blob');
|
|
181
|
+
expect(blobFromJson.bytes).toBeInstanceOf(Uint8Array);
|
|
182
|
+
expect(Array.from(blobFromJson.bytes)).toEqual(Array.from(bytes));
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
test('round-trips Uint8Array field through JSON without schema resolver', async ({ expect }) => {
|
|
186
|
+
const bytes = new Uint8Array([10, 20, 30, 40, 50]);
|
|
187
|
+
const blob = Obj.make(Blob, { name: 'blob', bytes });
|
|
188
|
+
|
|
189
|
+
const blobJson = objectToJSON(blob);
|
|
190
|
+
const roundTripped = JSON.parse(JSON.stringify(blobJson));
|
|
191
|
+
|
|
192
|
+
const blobFromJson = (await objectFromJSON(roundTripped)) as Blob;
|
|
193
|
+
|
|
194
|
+
expect(blobFromJson.name).toBe('blob');
|
|
195
|
+
expect(blobFromJson.bytes).toBeInstanceOf(Uint8Array);
|
|
196
|
+
expect(Array.from(blobFromJson.bytes)).toEqual(Array.from(bytes));
|
|
197
|
+
});
|
|
198
|
+
});
|
|
121
199
|
});
|