@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
|
@@ -5,42 +5,42 @@
|
|
|
5
5
|
import * as Schema from 'effect/Schema';
|
|
6
6
|
|
|
7
7
|
import { raise } from '@dxos/debug';
|
|
8
|
-
import { type EncodedReference,
|
|
8
|
+
import { type EncodedReference, EntityStructure, 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 { EID, EntityId, URI } from '@dxos/keys';
|
|
11
|
+
import { assumeType, decodeUint8ArrayFromJson, deepMapValues, isEncodedUint8Array, visitValues } from '@dxos/util';
|
|
12
12
|
|
|
13
13
|
import type * as Database from '../../Database';
|
|
14
14
|
import type * as Obj from '../../Obj';
|
|
15
|
-
import {
|
|
15
|
+
import { getTypeAnnotation, getTypeURI, setTypename } from '../Annotation';
|
|
16
|
+
import { attachTypedJsonSerializer, defineHiddenProperty, typedJsonSerializer } from '../common/proxy';
|
|
17
|
+
import {
|
|
18
|
+
ATTR_PARENT,
|
|
19
|
+
ATTR_TYPE,
|
|
20
|
+
type AnyEntity,
|
|
21
|
+
EntityKind,
|
|
22
|
+
KindId,
|
|
23
|
+
ParentId,
|
|
24
|
+
setSchema,
|
|
25
|
+
setType,
|
|
26
|
+
} from '../common/types';
|
|
27
|
+
import { ATTR_META, MetaId, EntityMetaSchema } from '../common/types/meta';
|
|
16
28
|
import {
|
|
17
29
|
ATTR_DELETED,
|
|
18
30
|
ATTR_RELATION_SOURCE,
|
|
19
31
|
ATTR_RELATION_TARGET,
|
|
20
|
-
|
|
32
|
+
ATTR_SELF_URI,
|
|
33
|
+
ATTR_SELF_URI_LEGACY,
|
|
21
34
|
ObjectDatabaseId,
|
|
22
35
|
type ObjectJSON,
|
|
23
36
|
RelationSourceDXNId,
|
|
24
37
|
RelationSourceId,
|
|
25
38
|
RelationTargetDXNId,
|
|
26
39
|
RelationTargetId,
|
|
27
|
-
|
|
40
|
+
SelfURIId,
|
|
28
41
|
assertObjectModel,
|
|
29
42
|
} from '../Entity';
|
|
30
|
-
import { attachTypedJsonSerializer, defineHiddenProperty, typedJsonSerializer } from '../common/proxy';
|
|
31
43
|
import { Ref, type RefResolver, refFromEncodedReference, setRefResolver } from '../Ref';
|
|
32
|
-
import {
|
|
33
|
-
ATTR_META,
|
|
34
|
-
ATTR_PARENT,
|
|
35
|
-
ATTR_TYPE,
|
|
36
|
-
type AnyEntity,
|
|
37
|
-
EntityKind,
|
|
38
|
-
KindId,
|
|
39
|
-
MetaId,
|
|
40
|
-
ObjectMetaSchema,
|
|
41
|
-
ParentId,
|
|
42
|
-
setSchema,
|
|
43
|
-
} from '../common/types';
|
|
44
44
|
|
|
45
45
|
// Re-export for backward compatibility.
|
|
46
46
|
export { attachTypedJsonSerializer };
|
|
@@ -62,7 +62,7 @@ type SerializedObject<T extends { id: string }> = {
|
|
|
62
62
|
* Converts object to it's JSON representation.
|
|
63
63
|
*/
|
|
64
64
|
export const objectToJSON = <T extends AnyEntity>(obj: T): SerializedObject<T> => {
|
|
65
|
-
const typename =
|
|
65
|
+
const typename = getTypeURI(obj);
|
|
66
66
|
invariant(typename && typeof typename === 'string');
|
|
67
67
|
return typedJsonSerializer.call(obj);
|
|
68
68
|
};
|
|
@@ -75,22 +75,27 @@ export const objectToJSON = <T extends AnyEntity>(obj: T): SerializedObject<T> =
|
|
|
75
75
|
*
|
|
76
76
|
* @param jsonData - JSON representation of the object.
|
|
77
77
|
* @param options.refResolver - Resolver for references.
|
|
78
|
-
* @param options.
|
|
78
|
+
* @param options.uri - Override object URI.
|
|
79
79
|
* @param options.database - Database to associate with the object.
|
|
80
80
|
*/
|
|
81
81
|
export const objectFromJSON = async (
|
|
82
82
|
jsonData: unknown,
|
|
83
|
-
{
|
|
83
|
+
{
|
|
84
|
+
refResolver,
|
|
85
|
+
uri,
|
|
86
|
+
database,
|
|
87
|
+
parent,
|
|
88
|
+
}: { refResolver?: RefResolver; uri?: URI.URI; database?: Database.Database; parent?: Obj.Unknown } = {},
|
|
84
89
|
): Promise<AnyEntity> => {
|
|
85
90
|
assumeType<ObjectJSON>(jsonData);
|
|
86
91
|
assertArgument(typeof jsonData === 'object' && jsonData !== null, 'jsonData', 'expect object');
|
|
87
92
|
assertArgument(typeof jsonData[ATTR_TYPE] === 'string', 'jsonData[ATTR_TYPE]', 'expected object to have a type');
|
|
88
93
|
assertArgument(typeof jsonData.id === 'string', 'jsonData.id', 'expected object to have an id');
|
|
89
94
|
|
|
90
|
-
const type =
|
|
95
|
+
const type = URI.make(jsonData[ATTR_TYPE]);
|
|
91
96
|
const schema = await refResolver?.resolveSchema(type);
|
|
92
97
|
invariant(schema === undefined || Schema.isSchema(schema));
|
|
93
|
-
const decodedInput = stripInternalJsonKeys(jsonData);
|
|
98
|
+
const decodedInput = restoreUint8Arrays(stripInternalJsonKeys(jsonData));
|
|
94
99
|
|
|
95
100
|
let obj: any;
|
|
96
101
|
if (schema != null) {
|
|
@@ -102,17 +107,26 @@ export const objectFromJSON = async (
|
|
|
102
107
|
obj = decodeGeneric(decodedInput, { refResolver });
|
|
103
108
|
}
|
|
104
109
|
|
|
105
|
-
invariant(
|
|
110
|
+
invariant(EntityId.isValid(obj.id), 'Invalid object id');
|
|
106
111
|
setTypename(obj, type);
|
|
107
112
|
if (schema) {
|
|
108
113
|
setSchema(obj, schema);
|
|
109
114
|
}
|
|
115
|
+
// Resolve and stamp the source type entity, if the resolver provides one.
|
|
116
|
+
// Lets `Obj.getType` / `Entity.getType` return a stable entity for objects
|
|
117
|
+
// loaded via `Obj.fromJSON` (serializer / queue paths).
|
|
118
|
+
if (refResolver?.resolveType) {
|
|
119
|
+
const typeEntity = await refResolver.resolveType(type);
|
|
120
|
+
if (typeEntity != null) {
|
|
121
|
+
setType(obj, typeEntity);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
110
124
|
|
|
111
125
|
const isRelation =
|
|
112
126
|
typeof jsonData[ATTR_RELATION_SOURCE] === 'string' || typeof jsonData[ATTR_RELATION_TARGET] === 'string';
|
|
113
127
|
if (isRelation) {
|
|
114
|
-
const sourceDxn
|
|
115
|
-
const targetDxn
|
|
128
|
+
const sourceDxn = jsonData[ATTR_RELATION_SOURCE] ?? raise(new TypeError('Missing relation source'));
|
|
129
|
+
const targetDxn = jsonData[ATTR_RELATION_TARGET] ?? raise(new TypeError('Missing relation target'));
|
|
116
130
|
|
|
117
131
|
const source = (await refResolver?.resolve(sourceDxn)) as AnyEntity | undefined;
|
|
118
132
|
const target = (await refResolver?.resolve(targetDxn)) as AnyEntity | undefined;
|
|
@@ -123,27 +137,37 @@ export const objectFromJSON = async (
|
|
|
123
137
|
defineHiddenProperty(obj, RelationSourceId, source);
|
|
124
138
|
defineHiddenProperty(obj, RelationTargetId, target);
|
|
125
139
|
} else {
|
|
126
|
-
|
|
140
|
+
// Honour the schema's TypeAnnotation kind — persisted `Type.Type` entities
|
|
141
|
+
// (e.g. dynamic schemas loaded from a snapshot import) must brand as
|
|
142
|
+
// `KindId = Type`, not Object, otherwise `Filter.type(Type.Type)` /
|
|
143
|
+
// `Type.isType` skip them and the schema registry never picks them up.
|
|
144
|
+
// Mirrors the kind resolution in `createObject` (the in-memory path).
|
|
145
|
+
const annotationKind = schema != null ? getTypeAnnotation(schema)?.kind : undefined;
|
|
146
|
+
defineHiddenProperty(obj, KindId, annotationKind === EntityKind.Type ? EntityKind.Type : EntityKind.Object);
|
|
127
147
|
}
|
|
128
148
|
|
|
129
149
|
if (typeof jsonData[ATTR_META] === 'object') {
|
|
130
|
-
const meta = await
|
|
150
|
+
const meta = await EntityMetaSchema.pipe(Schema.decodeUnknownPromise)(normalizeMeta(jsonData[ATTR_META]));
|
|
131
151
|
invariant(Array.isArray(meta.keys));
|
|
132
152
|
defineHiddenProperty(obj, MetaId, meta);
|
|
133
153
|
} else {
|
|
134
154
|
defineHiddenProperty(obj, MetaId, {
|
|
135
155
|
keys: [],
|
|
156
|
+
tags: [],
|
|
157
|
+
annotations: {},
|
|
136
158
|
});
|
|
137
159
|
}
|
|
138
160
|
|
|
139
161
|
if (jsonData[ATTR_PARENT]) {
|
|
140
|
-
const parentDxn =
|
|
141
|
-
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) {
|
|
142
166
|
defineHiddenProperty(obj, ParentId, parent);
|
|
143
167
|
}
|
|
144
168
|
|
|
145
|
-
if (
|
|
146
|
-
defineHiddenProperty(obj,
|
|
169
|
+
if (uri) {
|
|
170
|
+
defineHiddenProperty(obj, SelfURIId, uri);
|
|
147
171
|
}
|
|
148
172
|
|
|
149
173
|
if (database) {
|
|
@@ -154,12 +178,30 @@ export const objectFromJSON = async (
|
|
|
154
178
|
invariant((obj as any)[ATTR_TYPE] === undefined, 'Invalid object model');
|
|
155
179
|
invariant((obj as any)[ATTR_META] === undefined, 'Invalid object model');
|
|
156
180
|
invariant((obj as any)[ATTR_DELETED] === undefined, 'Invalid object model');
|
|
157
|
-
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');
|
|
158
183
|
invariant((obj as any)[ATTR_RELATION_SOURCE] === undefined, 'Invalid object model');
|
|
159
184
|
invariant((obj as any)[ATTR_RELATION_TARGET] === undefined, 'Invalid object model');
|
|
160
185
|
return obj;
|
|
161
186
|
};
|
|
162
187
|
|
|
188
|
+
/**
|
|
189
|
+
* Backfills required meta fields and upgrades legacy `tags` (bare URI strings) to encoded references
|
|
190
|
+
* so serialized data produced before the tags-as-refs migration still decodes.
|
|
191
|
+
*/
|
|
192
|
+
const normalizeMeta = (meta: any): any => {
|
|
193
|
+
const tags = Array.isArray(meta?.tags)
|
|
194
|
+
? meta.tags.map((tag: unknown) => (typeof tag === 'string' ? { '/': URI.make(tag) } : tag))
|
|
195
|
+
: [];
|
|
196
|
+
// Coalesce required fields so explicit `undefined` in legacy input doesn't override the defaults.
|
|
197
|
+
return {
|
|
198
|
+
...meta,
|
|
199
|
+
keys: Array.isArray(meta?.keys) ? meta.keys : [],
|
|
200
|
+
tags,
|
|
201
|
+
annotations: meta?.annotations ?? {},
|
|
202
|
+
};
|
|
203
|
+
};
|
|
204
|
+
|
|
163
205
|
const decodeGeneric = (jsonData: unknown, options: { refResolver?: RefResolver }) => {
|
|
164
206
|
const props = stripInternalJsonKeys(jsonData);
|
|
165
207
|
|
|
@@ -167,17 +209,33 @@ const decodeGeneric = (jsonData: unknown, options: { refResolver?: RefResolver }
|
|
|
167
209
|
if (isEncodedReference(value)) {
|
|
168
210
|
return refFromEncodedReference(value, options.refResolver);
|
|
169
211
|
}
|
|
212
|
+
if (isEncodedUint8Array(value)) {
|
|
213
|
+
return decodeUint8ArrayFromJson(value);
|
|
214
|
+
}
|
|
170
215
|
|
|
171
216
|
return visitor(value);
|
|
172
217
|
});
|
|
173
218
|
};
|
|
174
219
|
|
|
220
|
+
/**
|
|
221
|
+
* Recursively replaces encoded `Uint8Array` JSON markers with actual `Uint8Array` instances.
|
|
222
|
+
* Runs before schema decoding so `Schema.Uint8ArrayFromSelf` sees real bytes.
|
|
223
|
+
*/
|
|
224
|
+
const restoreUint8Arrays = (data: unknown): any =>
|
|
225
|
+
deepMapValues(data, (value, recurse) => {
|
|
226
|
+
if (isEncodedUint8Array(value)) {
|
|
227
|
+
return decodeUint8ArrayFromJson(value);
|
|
228
|
+
}
|
|
229
|
+
return recurse(value);
|
|
230
|
+
});
|
|
231
|
+
|
|
175
232
|
const stripInternalJsonKeys = (jsonData: unknown) => {
|
|
176
233
|
const {
|
|
177
234
|
[ATTR_TYPE]: _type,
|
|
178
235
|
[ATTR_META]: _meta,
|
|
179
236
|
[ATTR_DELETED]: _deleted,
|
|
180
|
-
[
|
|
237
|
+
[ATTR_SELF_URI]: _selfUri,
|
|
238
|
+
[ATTR_SELF_URI_LEGACY]: _legacySelfUri,
|
|
181
239
|
[ATTR_RELATION_SOURCE]: _relationSource,
|
|
182
240
|
[ATTR_RELATION_TARGET]: _relationTarget,
|
|
183
241
|
...props
|
|
@@ -199,17 +257,21 @@ export const setRefResolverOnData = (obj: AnyEntity, refResolver: RefResolver) =
|
|
|
199
257
|
};
|
|
200
258
|
|
|
201
259
|
/**
|
|
202
|
-
* Convert
|
|
203
|
-
* Different from {@link objectToJSON} as it takes the internal {@link
|
|
260
|
+
* Convert EntityStructure to JSON data for indexing.
|
|
261
|
+
* Different from {@link objectToJSON} as it takes the internal {@link EntityStructure} representation directly
|
|
204
262
|
*/
|
|
205
|
-
export const objectStructureToJson = (objectId:
|
|
263
|
+
export const objectStructureToJson = (objectId: EntityId, structure: EntityStructure): Obj.JSON => {
|
|
264
|
+
const typeRef = EntityStructure.getTypeReference(structure)?.['/'];
|
|
265
|
+
const parent = EntityStructure.getParent(structure)?.['/'];
|
|
266
|
+
const source = EntityStructure.getRelationSource(structure)?.['/'];
|
|
267
|
+
const target = EntityStructure.getRelationTarget(structure)?.['/'];
|
|
206
268
|
return {
|
|
207
269
|
...structure.data,
|
|
208
270
|
id: objectId,
|
|
209
|
-
[ATTR_TYPE]:
|
|
210
|
-
[ATTR_DELETED]:
|
|
211
|
-
[ATTR_PARENT]:
|
|
212
|
-
[ATTR_RELATION_SOURCE]:
|
|
213
|
-
[ATTR_RELATION_TARGET]:
|
|
271
|
+
[ATTR_TYPE]: typeRef ? URI.make(typeRef) : undefined,
|
|
272
|
+
[ATTR_DELETED]: EntityStructure.isDeleted(structure),
|
|
273
|
+
[ATTR_PARENT]: parent !== undefined ? EID.tryParse(parent) : undefined,
|
|
274
|
+
[ATTR_RELATION_SOURCE]: source !== undefined ? EID.tryParse(source) : undefined,
|
|
275
|
+
[ATTR_RELATION_TARGET]: target !== undefined ? EID.tryParse(target) : undefined,
|
|
214
276
|
};
|
|
215
277
|
};
|
|
@@ -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('');
|
|
@@ -21,7 +21,7 @@ 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');
|
|
@@ -7,18 +7,20 @@ import { deepMapValues } from '@dxos/util';
|
|
|
7
7
|
|
|
8
8
|
import {
|
|
9
9
|
KindId,
|
|
10
|
-
MetaId,
|
|
11
10
|
ObjectDatabaseId,
|
|
12
11
|
ObjectDeletedId,
|
|
12
|
+
ParentId,
|
|
13
13
|
RelationSourceDXNId,
|
|
14
14
|
RelationSourceId,
|
|
15
15
|
RelationTargetDXNId,
|
|
16
16
|
RelationTargetId,
|
|
17
17
|
SchemaId,
|
|
18
|
-
|
|
18
|
+
SelfURIId,
|
|
19
19
|
SnapshotKindId,
|
|
20
|
+
TypeEntityId,
|
|
20
21
|
TypeId,
|
|
21
22
|
} from '../common/types';
|
|
23
|
+
import { MetaId } from '../common/types/meta';
|
|
22
24
|
|
|
23
25
|
/**
|
|
24
26
|
* Copy a Symbol-keyed property from source to target if it has a defined value.
|
|
@@ -83,16 +85,21 @@ export const getSnapshot = <T extends object>(obj: T): T => {
|
|
|
83
85
|
// Type introspection symbols.
|
|
84
86
|
copySymbolProperty(source, snapshot, TypeId);
|
|
85
87
|
copySymbolProperty(source, snapshot, SchemaId);
|
|
86
|
-
copySymbolProperty(source, snapshot,
|
|
88
|
+
copySymbolProperty(source, snapshot, TypeEntityId);
|
|
89
|
+
copySymbolProperty(source, snapshot, SelfURIId);
|
|
87
90
|
|
|
88
91
|
// Database reference (required for Obj.getDatabase to work on snapshots).
|
|
89
92
|
copySymbolProperty(source, snapshot, ObjectDatabaseId);
|
|
90
93
|
copySymbolProperty(source, snapshot, ObjectDeletedId);
|
|
91
94
|
|
|
92
|
-
//
|
|
95
|
+
// Parent reference (required for Obj.getParent to work on snapshots).
|
|
96
|
+
copySymbolProperty(source, snapshot, ParentId);
|
|
97
|
+
|
|
98
|
+
// Metadata symbol. Copy arrays/objects so the snapshot is not affected by mutations to the live meta.
|
|
93
99
|
copySymbolProperty(source, snapshot, MetaId, (meta: any) => ({
|
|
94
100
|
keys: [...(meta?.keys ?? [])],
|
|
95
101
|
tags: [...(meta?.tags ?? [])],
|
|
102
|
+
...(meta?.annotations ? { annotations: { ...meta.annotations } } : {}),
|
|
96
103
|
}));
|
|
97
104
|
|
|
98
105
|
// Relation endpoint symbols.
|
|
@@ -6,29 +6,27 @@ import * as Schema from 'effect/Schema';
|
|
|
6
6
|
import * as SchemaAST from 'effect/SchemaAST';
|
|
7
7
|
import { describe, expect, test } from 'vitest';
|
|
8
8
|
|
|
9
|
+
import { DXN } from '@dxos/keys';
|
|
10
|
+
|
|
11
|
+
import * as Type from '../../Type';
|
|
9
12
|
import { EchoObjectSchema } from '../Entity';
|
|
10
13
|
|
|
11
14
|
const Organization = Schema.Struct({
|
|
12
15
|
name: Schema.String,
|
|
13
|
-
}).pipe(
|
|
14
|
-
EchoObjectSchema({
|
|
15
|
-
typename: 'com.example.type.organization',
|
|
16
|
-
version: '0.1.0',
|
|
17
|
-
}),
|
|
18
|
-
);
|
|
16
|
+
}).pipe(EchoObjectSchema(DXN.make('com.example.type.organization', '0.1.0')));
|
|
19
17
|
|
|
20
|
-
|
|
18
|
+
type Organization = Type.InstanceType<typeof Organization>;
|
|
21
19
|
|
|
22
20
|
describe('EchoObjectSchema DSL', () => {
|
|
23
|
-
test('type is a
|
|
24
|
-
expect(Schema.isSchema(Organization)).to.be.true;
|
|
21
|
+
test('type is a Type.Type entity', async () => {
|
|
22
|
+
expect(Schema.isSchema(Type.getSchema(Organization))).to.be.true;
|
|
25
23
|
});
|
|
26
24
|
|
|
27
25
|
test('static typename accessor', async () => {
|
|
28
|
-
expect(Organization
|
|
26
|
+
expect(Type.getTypename(Organization)).to.eq('com.example.type.organization');
|
|
29
27
|
});
|
|
30
28
|
|
|
31
29
|
test('expect schema', async () => {
|
|
32
|
-
expect(SchemaAST.isTypeLiteral(Organization.ast)).to.be.true;
|
|
30
|
+
expect(SchemaAST.isTypeLiteral(Type.getSchema(Organization).ast)).to.be.true;
|
|
33
31
|
});
|
|
34
32
|
});
|
|
@@ -12,7 +12,7 @@ import { type AnyEntity } from '../common/types';
|
|
|
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
17
|
* @deprecated Use `Type.AnyObj` from `@dxos/echo` instead.
|
|
18
18
|
*/
|