@dxos/echo 0.8.4-main.7ace549 → 0.8.4-main.8360d9e660
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/README.md +3 -4
- package/dist/lib/neutral/Annotation.mjs +37 -0
- package/dist/lib/neutral/Database.mjs +45 -0
- package/dist/lib/neutral/Entity.mjs +59 -0
- package/dist/lib/neutral/Err.mjs +12 -0
- package/dist/lib/neutral/Feed.mjs +47 -0
- package/dist/lib/neutral/Feed.mjs.map +7 -0
- package/dist/lib/neutral/Filter.mjs +64 -0
- package/dist/lib/neutral/Filter.mjs.map +7 -0
- package/dist/lib/neutral/Format.mjs +66 -0
- package/dist/lib/neutral/Format.mjs.map +7 -0
- package/dist/lib/neutral/JsonSchema.mjs +19 -0
- package/dist/lib/neutral/JsonSchema.mjs.map +7 -0
- package/dist/lib/neutral/Key.mjs +12 -0
- package/dist/lib/neutral/Key.mjs.map +7 -0
- package/dist/lib/neutral/Obj.mjs +110 -0
- package/dist/lib/neutral/Obj.mjs.map +7 -0
- package/dist/lib/neutral/Order.mjs +12 -0
- package/dist/lib/neutral/Order.mjs.map +7 -0
- package/dist/lib/neutral/Query.mjs +36 -0
- package/dist/lib/neutral/Query.mjs.map +7 -0
- package/dist/lib/neutral/QueryResult.mjs +2 -0
- package/dist/lib/neutral/QueryResult.mjs.map +7 -0
- package/dist/lib/neutral/Ref.mjs +24 -0
- package/dist/lib/neutral/Ref.mjs.map +7 -0
- package/dist/lib/neutral/Relation.mjs +93 -0
- package/dist/lib/neutral/Relation.mjs.map +7 -0
- package/dist/lib/neutral/SchemaRegistry.mjs +2 -0
- package/dist/lib/neutral/SchemaRegistry.mjs.map +7 -0
- package/dist/lib/neutral/Tag.mjs +28 -0
- package/dist/lib/neutral/Tag.mjs.map +7 -0
- package/dist/lib/neutral/Type.mjs +37 -0
- package/dist/lib/neutral/Type.mjs.map +7 -0
- package/dist/lib/neutral/chunk-43Y5DOS6.mjs +396 -0
- package/dist/lib/neutral/chunk-43Y5DOS6.mjs.map +7 -0
- package/dist/lib/neutral/chunk-4JRI2ZJI.mjs +313 -0
- package/dist/lib/neutral/chunk-4JRI2ZJI.mjs.map +7 -0
- package/dist/lib/neutral/chunk-6DNYDXCV.mjs +159 -0
- package/dist/lib/neutral/chunk-6DNYDXCV.mjs.map +7 -0
- package/dist/lib/neutral/chunk-6GPU7XC3.mjs +283 -0
- package/dist/lib/neutral/chunk-6GPU7XC3.mjs.map +7 -0
- package/dist/lib/neutral/chunk-6K2MVI2O.mjs +56 -0
- package/dist/lib/neutral/chunk-6K2MVI2O.mjs.map +7 -0
- package/dist/lib/neutral/chunk-7VNVH63N.mjs +106 -0
- package/dist/lib/neutral/chunk-7VNVH63N.mjs.map +7 -0
- package/dist/lib/neutral/chunk-ANHVGJI4.mjs +21 -0
- package/dist/lib/neutral/chunk-ANHVGJI4.mjs.map +7 -0
- package/dist/lib/neutral/chunk-B5OXLWZL.mjs +402 -0
- package/dist/lib/neutral/chunk-B5OXLWZL.mjs.map +7 -0
- package/dist/lib/neutral/chunk-BNCCGLJN.mjs +7 -0
- package/dist/lib/neutral/chunk-BNCCGLJN.mjs.map +7 -0
- package/dist/lib/neutral/chunk-BOZZPUXE.mjs +787 -0
- package/dist/lib/neutral/chunk-BOZZPUXE.mjs.map +7 -0
- package/dist/lib/neutral/chunk-C4JZK4J7.mjs +2712 -0
- package/dist/lib/neutral/chunk-C4JZK4J7.mjs.map +7 -0
- package/dist/lib/neutral/chunk-FXEG7EOK.mjs +45 -0
- package/dist/lib/neutral/chunk-FXEG7EOK.mjs.map +7 -0
- package/dist/lib/neutral/chunk-FZO7LQO7.mjs +73 -0
- package/dist/lib/neutral/chunk-FZO7LQO7.mjs.map +7 -0
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
- package/dist/lib/neutral/chunk-NEGC54NE.mjs +130 -0
- package/dist/lib/neutral/chunk-NEGC54NE.mjs.map +7 -0
- package/dist/lib/neutral/chunk-NXMFBIT5.mjs +299 -0
- package/dist/lib/neutral/chunk-NXMFBIT5.mjs.map +7 -0
- package/dist/lib/neutral/chunk-OENWMTE6.mjs +45 -0
- package/dist/lib/neutral/chunk-OENWMTE6.mjs.map +7 -0
- package/dist/lib/neutral/chunk-OMUPQMLR.mjs +7 -0
- package/dist/lib/neutral/chunk-OMUPQMLR.mjs.map +7 -0
- package/dist/lib/neutral/chunk-ROAGDPV7.mjs +121 -0
- package/dist/lib/neutral/chunk-ROAGDPV7.mjs.map +7 -0
- package/dist/lib/neutral/chunk-SEMVAGBM.mjs +355 -0
- package/dist/lib/neutral/chunk-SEMVAGBM.mjs.map +7 -0
- package/dist/lib/neutral/chunk-UBEZSGXY.mjs +51 -0
- package/dist/lib/neutral/chunk-UBEZSGXY.mjs.map +7 -0
- package/dist/lib/neutral/chunk-UI6MWK5W.mjs +42 -0
- package/dist/lib/neutral/chunk-UI6MWK5W.mjs.map +7 -0
- package/dist/lib/neutral/chunk-UTBRYVQC.mjs +27 -0
- package/dist/lib/neutral/chunk-UTBRYVQC.mjs.map +7 -0
- package/dist/lib/neutral/chunk-W47JKR3X.mjs +298 -0
- package/dist/lib/neutral/chunk-W47JKR3X.mjs.map +7 -0
- package/dist/lib/neutral/chunk-WYOKA6AE.mjs +67 -0
- package/dist/lib/neutral/chunk-WYOKA6AE.mjs.map +7 -0
- package/dist/lib/neutral/chunk-YMNSMKKW.mjs +97 -0
- package/dist/lib/neutral/chunk-YMNSMKKW.mjs.map +7 -0
- package/dist/lib/neutral/chunk-YWXWXIE5.mjs +34 -0
- package/dist/lib/neutral/chunk-YWXWXIE5.mjs.map +7 -0
- package/dist/lib/neutral/index.mjs +97 -0
- package/dist/lib/neutral/index.mjs.map +7 -0
- package/dist/lib/{node-esm → neutral}/internal/index.mjs +257 -123
- package/dist/lib/neutral/internal/index.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/lib/{browser → neutral}/testing/index.mjs +97 -52
- package/dist/lib/neutral/testing/index.mjs.map +7 -0
- package/dist/types/src/Annotation.d.ts +23 -1
- package/dist/types/src/Annotation.d.ts.map +1 -1
- package/dist/types/src/Collection.d.ts +16 -0
- package/dist/types/src/Collection.d.ts.map +1 -0
- package/dist/types/src/Database.d.ts +139 -87
- package/dist/types/src/Database.d.ts.map +1 -1
- package/dist/types/src/Dataset.d.ts +18 -0
- package/dist/types/src/Dataset.d.ts.map +1 -0
- package/dist/types/src/Entity.d.ts +141 -9
- package/dist/types/src/Entity.d.ts.map +1 -1
- package/dist/types/src/Entity.test.d.ts +2 -0
- package/dist/types/src/Entity.test.d.ts.map +1 -0
- package/dist/types/src/Err.d.ts +107 -0
- package/dist/types/src/Err.d.ts.map +1 -0
- package/dist/types/src/Feed.d.ts +165 -0
- package/dist/types/src/Feed.d.ts.map +1 -0
- package/dist/types/src/Filter.d.ts +120 -0
- package/dist/types/src/Filter.d.ts.map +1 -0
- package/dist/types/src/Format.d.ts +3 -3
- package/dist/types/src/Format.d.ts.map +1 -1
- package/dist/types/src/Hypergraph.d.ts +65 -0
- package/dist/types/src/Hypergraph.d.ts.map +1 -0
- package/dist/types/src/JsonSchema.d.ts +11 -4
- package/dist/types/src/JsonSchema.d.ts.map +1 -1
- package/dist/types/src/Obj.d.ts +392 -85
- package/dist/types/src/Obj.d.ts.map +1 -1
- package/dist/types/src/Obj.test.d.ts +2 -0
- package/dist/types/src/Obj.test.d.ts.map +1 -0
- package/dist/types/src/Order.d.ts +16 -0
- package/dist/types/src/Order.d.ts.map +1 -0
- package/dist/types/src/Query.d.ts +202 -0
- package/dist/types/src/Query.d.ts.map +1 -0
- package/dist/types/src/Query.test.d.ts +2 -0
- package/dist/types/src/Query.test.d.ts.map +1 -0
- package/dist/types/src/QueryResult.d.ts +80 -0
- package/dist/types/src/QueryResult.d.ts.map +1 -0
- package/dist/types/src/Ref.d.ts +61 -11
- package/dist/types/src/Ref.d.ts.map +1 -1
- package/dist/types/src/Relation.d.ts +282 -18
- package/dist/types/src/Relation.d.ts.map +1 -1
- package/dist/types/src/Relation.test.d.ts +2 -0
- package/dist/types/src/Relation.test.d.ts.map +1 -0
- package/dist/types/src/SchemaRegistry.d.ts +84 -0
- package/dist/types/src/SchemaRegistry.d.ts.map +1 -0
- package/dist/types/src/Tag.d.ts +8 -7
- package/dist/types/src/Tag.d.ts.map +1 -1
- package/dist/types/src/Type.d.ts +124 -90
- package/dist/types/src/Type.d.ts.map +1 -1
- package/dist/types/src/Type.test.d.ts +2 -0
- package/dist/types/src/Type.test.d.ts.map +1 -0
- package/dist/types/src/View.d.ts +68 -0
- package/dist/types/src/View.d.ts.map +1 -0
- package/dist/types/src/hierarchy.test.d.ts +2 -0
- package/dist/types/src/hierarchy.test.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +12 -2
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/internal/{annotations → Annotation}/annotations.d.ts +83 -27
- package/dist/types/src/internal/Annotation/annotations.d.ts.map +1 -0
- package/dist/types/src/internal/Annotation/annotations.test.d.ts.map +1 -0
- package/dist/types/src/internal/Annotation/index.d.ts +4 -0
- package/dist/types/src/internal/Annotation/index.d.ts.map +1 -0
- package/dist/types/src/internal/Annotation/sorting.d.ts +24 -0
- package/dist/types/src/internal/Annotation/sorting.d.ts.map +1 -0
- package/dist/types/src/internal/{annotations → Annotation}/util.d.ts +14 -1
- package/dist/types/src/internal/Annotation/util.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/api.d.ts +13 -0
- package/dist/types/src/internal/Entity/api.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/entity.d.ts +20 -0
- package/dist/types/src/internal/Entity/entity.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/index.d.ts +8 -0
- package/dist/types/src/internal/Entity/index.d.ts.map +1 -0
- package/dist/types/src/internal/{entities → Entity}/model.d.ts +14 -29
- package/dist/types/src/internal/Entity/model.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/object.d.ts +18 -0
- package/dist/types/src/internal/Entity/object.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/relation.d.ts +35 -0
- package/dist/types/src/internal/Entity/relation.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/util.d.ts.map +1 -0
- package/dist/types/src/internal/Entity/version.d.ts +42 -0
- package/dist/types/src/internal/Entity/version.d.ts.map +1 -0
- package/dist/types/src/internal/Format/date.d.ts.map +1 -0
- package/dist/types/src/internal/Format/date.test.d.ts.map +1 -0
- package/dist/types/src/internal/{formats → Format}/format.d.ts +4 -4
- package/dist/types/src/internal/Format/format.d.ts.map +1 -0
- package/dist/types/src/internal/Format/format.test.d.ts.map +1 -0
- package/dist/types/src/internal/Format/index.d.ts.map +1 -0
- package/dist/types/src/internal/Format/number.d.ts.map +1 -0
- package/dist/types/src/internal/Format/object.d.ts.map +1 -0
- package/dist/types/src/internal/{formats → Format}/select.d.ts +6 -4
- package/dist/types/src/internal/Format/select.d.ts.map +1 -0
- package/dist/types/src/internal/{formats → Format}/string.d.ts +4 -0
- package/dist/types/src/internal/Format/string.d.ts.map +1 -0
- package/dist/types/src/internal/{formats → Format}/types.d.ts +7 -3
- package/dist/types/src/internal/Format/types.d.ts.map +1 -0
- package/dist/types/src/internal/{json-schema → JsonSchema}/annotations.d.ts +1 -1
- package/dist/types/src/internal/JsonSchema/annotations.d.ts.map +1 -0
- package/dist/types/src/internal/JsonSchema/effect-schema.test.d.ts.map +1 -0
- package/dist/types/src/internal/JsonSchema/index.d.ts.map +1 -0
- package/dist/types/src/internal/JsonSchema/json-schema-normalize.d.ts.map +1 -0
- package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema-type.d.ts +131 -30
- package/dist/types/src/internal/JsonSchema/json-schema-type.d.ts.map +1 -0
- package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema.d.ts +2 -1
- package/dist/types/src/internal/JsonSchema/json-schema.d.ts.map +1 -0
- package/dist/types/src/internal/JsonSchema/json-schema.test.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/clone.d.ts +8 -0
- package/dist/types/src/internal/Obj/clone.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/common.d.ts.map +1 -0
- package/dist/types/src/internal/{object → Obj}/create-object.d.ts +3 -3
- package/dist/types/src/internal/Obj/create-object.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/create-object.test.d.ts.map +1 -0
- package/dist/types/src/internal/{object → Obj}/deleted.d.ts +1 -1
- package/dist/types/src/internal/Obj/deleted.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/ids.d.ts.map +1 -0
- package/dist/types/src/internal/{object → Obj}/index.d.ts +3 -0
- package/dist/types/src/internal/Obj/index.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/inspect.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/json-serializer.d.ts +44 -0
- package/dist/types/src/internal/Obj/json-serializer.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/json-serializer.test.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/schema-validator.d.ts +2 -0
- package/dist/types/src/internal/Obj/schema-validator.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/schema-validator.test.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/set-value.d.ts +7 -0
- package/dist/types/src/internal/Obj/set-value.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/set-value.test.d.ts +2 -0
- package/dist/types/src/internal/Obj/set-value.test.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/snapshot.d.ts +6 -0
- package/dist/types/src/internal/Obj/snapshot.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/typed-object.d.ts +25 -0
- package/dist/types/src/internal/Obj/typed-object.d.ts.map +1 -0
- package/dist/types/src/internal/Obj/typed-object.test.d.ts.map +1 -0
- package/dist/types/src/internal/Ref/index.d.ts.map +1 -0
- package/dist/types/src/internal/{ref → Ref}/ref-array.d.ts +4 -4
- package/dist/types/src/internal/Ref/ref-array.d.ts.map +1 -0
- package/dist/types/src/internal/{ref → Ref}/ref.d.ts +31 -9
- package/dist/types/src/internal/Ref/ref.d.ts.map +1 -0
- package/dist/types/src/internal/Ref/ref.test.d.ts.map +1 -0
- package/dist/types/src/internal/Type/compose.d.ts +7 -0
- package/dist/types/src/internal/Type/compose.d.ts.map +1 -0
- package/dist/types/src/internal/Type/compose.test.d.ts.map +1 -0
- package/dist/types/src/internal/{schema → Type}/echo-schema.d.ts +20 -7
- package/dist/types/src/internal/Type/echo-schema.d.ts.map +1 -0
- package/dist/types/src/internal/Type/index.d.ts +4 -0
- package/dist/types/src/internal/Type/index.d.ts.map +1 -0
- package/dist/types/src/internal/Type/manipulation.d.ts.map +1 -0
- package/dist/types/src/internal/Type/persistent-schema.d.ts +20 -0
- package/dist/types/src/internal/Type/persistent-schema.d.ts.map +1 -0
- package/dist/types/src/internal/common/api/index.d.ts +11 -0
- package/dist/types/src/internal/common/api/index.d.ts.map +1 -0
- package/dist/types/src/internal/common/api/meta.d.ts +42 -0
- package/dist/types/src/internal/common/api/meta.d.ts.map +1 -0
- package/dist/types/src/internal/common/index.d.ts +4 -0
- package/dist/types/src/internal/common/index.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/change-context.d.ts +55 -0
- package/dist/types/src/internal/common/proxy/change-context.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/change.test.d.ts +2 -0
- package/dist/types/src/internal/common/proxy/change.test.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts +5 -0
- package/dist/types/src/internal/common/proxy/define-hidden-property.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/errors.d.ts +19 -0
- package/dist/types/src/internal/common/proxy/errors.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/event-batch.d.ts +10 -0
- package/dist/types/src/internal/common/proxy/event-batch.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/handler.test.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/index.d.ts +14 -0
- package/dist/types/src/internal/common/proxy/index.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/json-serializer.d.ts +6 -0
- package/dist/types/src/internal/common/proxy/json-serializer.d.ts.map +1 -0
- package/dist/types/src/internal/{proxy → common/proxy}/make-object.d.ts +2 -4
- package/dist/types/src/internal/common/proxy/make-object.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/ownership.d.ts +57 -0
- package/dist/types/src/internal/common/proxy/ownership.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/proxy-types.d.ts +18 -0
- package/dist/types/src/internal/common/proxy/proxy-types.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/proxy-utils.d.ts +47 -0
- package/dist/types/src/internal/common/proxy/proxy-utils.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/reactive-array.d.ts +8 -0
- package/dist/types/src/internal/common/proxy/reactive-array.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/reactive.d.ts +39 -0
- package/dist/types/src/internal/common/proxy/reactive.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/schema-validator.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/schema.test.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/symbols.d.ts +3 -0
- package/dist/types/src/internal/common/proxy/symbols.d.ts.map +1 -0
- package/dist/types/src/internal/{proxy → common/proxy}/typed-handler.d.ts +16 -12
- package/dist/types/src/internal/common/proxy/typed-handler.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/typed-handler.test.d.ts.map +1 -0
- package/dist/types/src/internal/common/proxy/typed-object.test.d.ts.map +1 -0
- package/dist/types/src/internal/{types → common/types}/base.d.ts +6 -16
- package/dist/types/src/internal/common/types/base.d.ts.map +1 -0
- package/dist/types/src/internal/common/types/entity.d.ts +37 -0
- package/dist/types/src/internal/common/types/entity.d.ts.map +1 -0
- package/dist/types/src/internal/{types → common/types}/index.d.ts +1 -0
- package/dist/types/src/internal/common/types/index.d.ts.map +1 -0
- package/dist/types/src/internal/{types → common/types}/meta.d.ts +8 -15
- package/dist/types/src/internal/common/types/meta.d.ts.map +1 -0
- package/dist/types/src/internal/common/types/model-symbols.d.ts +54 -0
- package/dist/types/src/internal/common/types/model-symbols.d.ts.map +1 -0
- package/dist/types/src/internal/{types → common/types}/typename.d.ts +8 -0
- package/dist/types/src/internal/common/types/typename.d.ts.map +1 -0
- package/dist/types/src/internal/{types → common/types}/version.d.ts +2 -2
- package/dist/types/src/internal/common/types/version.d.ts.map +1 -0
- package/dist/types/src/internal/index.d.ts +9 -10
- package/dist/types/src/internal/index.d.ts.map +1 -1
- package/dist/types/src/testing/test-schema.d.ts +146 -179
- package/dist/types/src/testing/test-schema.d.ts.map +1 -1
- package/dist/types/src/testing/util.d.ts +6 -1
- package/dist/types/src/testing/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +94 -61
- package/src/Annotation.ts +36 -5
- package/src/Collection.ts +37 -0
- package/src/Database.ts +250 -122
- package/src/Dataset.ts +26 -0
- package/src/Entity.test.ts +22 -0
- package/src/Entity.ts +197 -11
- package/src/Err.ts +40 -0
- package/src/Feed.ts +262 -0
- package/src/Filter.ts +391 -0
- package/src/Format.ts +3 -5
- package/src/Hypergraph.ts +79 -0
- package/src/JsonSchema.ts +14 -4
- package/src/Obj.test.ts +447 -0
- package/src/Obj.ts +528 -295
- package/src/Order.ts +46 -0
- package/src/Query.test.ts +632 -0
- package/src/Query.ts +522 -0
- package/src/QueryResult.ts +106 -0
- package/src/Ref.ts +79 -9
- package/src/Relation.test.ts +88 -0
- package/src/Relation.ts +439 -68
- package/src/SchemaRegistry.ts +106 -0
- package/src/Tag.ts +7 -6
- package/src/Type.test.ts +52 -0
- package/src/Type.ts +167 -166
- package/src/View.ts +107 -0
- package/src/hierarchy.test.ts +33 -0
- package/src/index.ts +13 -5
- package/src/internal/{annotations → Annotation}/annotations.test.ts +12 -12
- package/src/internal/{annotations → Annotation}/annotations.ts +172 -64
- package/src/internal/{annotations → Annotation}/index.ts +1 -0
- package/src/internal/Annotation/sorting.ts +52 -0
- package/src/internal/{annotations → Annotation}/util.ts +16 -1
- package/src/internal/Entity/api.ts +31 -0
- package/src/internal/{entities → Entity}/entity.ts +39 -20
- package/src/internal/{entities → Entity}/index.ts +3 -1
- package/src/internal/{entities → Entity}/model.ts +29 -49
- package/src/internal/{entities → Entity}/object.ts +23 -10
- package/src/internal/{entities → Entity}/relation.ts +42 -43
- package/src/internal/Entity/version.ts +97 -0
- package/src/internal/{formats → Format}/date.test.ts +1 -1
- package/src/internal/{formats → Format}/format.test.ts +2 -2
- package/src/internal/{formats → Format}/format.ts +7 -8
- package/src/internal/{formats → Format}/object.ts +2 -2
- package/src/internal/{formats → Format}/select.ts +6 -4
- package/src/internal/{formats → Format}/string.ts +5 -0
- package/src/internal/{formats → Format}/types.ts +12 -6
- package/src/internal/{json-schema → JsonSchema}/annotations.ts +3 -3
- package/src/internal/{json-schema → JsonSchema}/json-schema-normalize.ts +4 -2
- package/src/internal/{json-schema → JsonSchema}/json-schema-type.ts +34 -35
- package/src/internal/{json-schema → JsonSchema}/json-schema.test.ts +67 -65
- package/src/internal/{json-schema → JsonSchema}/json-schema.ts +18 -12
- package/src/internal/Obj/clone.ts +48 -0
- package/src/internal/{object → Obj}/common.ts +2 -2
- package/src/internal/{object → Obj}/create-object.test.ts +4 -4
- package/src/internal/{object → Obj}/create-object.ts +6 -6
- package/src/internal/{object → Obj}/deleted.ts +2 -2
- package/src/internal/{object → Obj}/index.ts +3 -0
- package/src/internal/{object → Obj}/inspect.ts +4 -4
- package/src/internal/{object → Obj}/json-serializer.test.ts +33 -6
- package/src/internal/{object → Obj}/json-serializer.ts +69 -84
- package/src/internal/{object → Obj}/schema-validator.test.ts +3 -7
- package/src/internal/Obj/schema-validator.ts +6 -0
- package/src/internal/Obj/set-value.test.ts +281 -0
- package/src/internal/Obj/set-value.ts +165 -0
- package/src/internal/Obj/snapshot.ts +105 -0
- package/src/internal/{object → Obj}/typed-object.test.ts +12 -12
- package/src/internal/Obj/typed-object.ts +30 -0
- package/src/internal/{ref → Ref}/ref-array.ts +4 -4
- package/src/internal/{ref → Ref}/ref.test.ts +5 -5
- package/src/internal/{ref → Ref}/ref.ts +90 -43
- package/src/internal/{schema → Type}/compose.test.ts +6 -6
- package/src/internal/{schema → Type}/compose.ts +14 -10
- package/src/internal/{schema → Type}/echo-schema.ts +55 -16
- package/src/internal/{schema → Type}/index.ts +0 -2
- package/src/internal/{schema → Type}/manipulation.ts +1 -1
- package/src/internal/Type/persistent-schema.ts +33 -0
- package/src/internal/{README.md → common/README.md} +36 -17
- package/src/internal/common/api/index.ts +15 -0
- package/src/internal/common/api/meta.ts +88 -0
- package/src/internal/common/index.ts +7 -0
- package/src/internal/common/proxy/change-context.ts +138 -0
- package/src/internal/common/proxy/change.test.ts +519 -0
- package/src/internal/common/proxy/define-hidden-property.ts +14 -0
- package/src/internal/common/proxy/errors.ts +42 -0
- package/src/internal/common/proxy/event-batch.ts +44 -0
- package/src/internal/{proxy → common/proxy}/handler.test.ts +32 -82
- package/src/internal/common/proxy/index.ts +17 -0
- package/src/internal/common/proxy/json-serializer.ts +90 -0
- package/src/internal/common/proxy/make-object.ts +106 -0
- package/src/internal/common/proxy/ownership.ts +253 -0
- package/src/internal/common/proxy/proxy-types.ts +23 -0
- package/src/internal/common/proxy/proxy-utils.ts +150 -0
- package/src/internal/common/proxy/reactive-array.ts +71 -0
- package/src/internal/common/proxy/reactive.ts +69 -0
- package/src/internal/{object → common/proxy}/schema-validator.ts +3 -1
- package/src/internal/{proxy → common/proxy}/schema.test.ts +29 -21
- package/src/internal/common/proxy/symbols.ts +7 -0
- package/src/internal/common/proxy/typed-handler.test.ts +314 -0
- package/src/internal/common/proxy/typed-handler.ts +449 -0
- package/src/internal/common/proxy/typed-object.test.ts +116 -0
- package/src/internal/{types → common/types}/base.ts +7 -22
- package/src/internal/common/types/entity.ts +54 -0
- package/src/internal/{types → common/types}/index.ts +1 -0
- package/src/internal/{types → common/types}/meta.ts +17 -25
- package/src/internal/common/types/model-symbols.ts +69 -0
- package/src/internal/{types → common/types}/typename.ts +10 -0
- package/src/internal/{types → common/types}/version.ts +2 -3
- package/src/internal/index.ts +9 -31
- package/src/testing/api.test.ts +32 -6
- package/src/testing/test-schema.ts +68 -41
- package/src/testing/util.ts +22 -15
- package/dist/lib/browser/chunk-7GH6RXJ3.mjs +0 -3683
- package/dist/lib/browser/chunk-7GH6RXJ3.mjs.map +0 -7
- package/dist/lib/browser/chunk-E4UTVJNF.mjs +0 -1111
- package/dist/lib/browser/chunk-E4UTVJNF.mjs.map +0 -7
- package/dist/lib/browser/index.mjs +0 -45
- package/dist/lib/browser/internal/index.mjs +0 -336
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/browser/testing/index.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-JE5RXM2I.mjs +0 -1111
- package/dist/lib/node-esm/chunk-JE5RXM2I.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-M4B6BMD2.mjs +0 -3683
- package/dist/lib/node-esm/chunk-M4B6BMD2.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -45
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/testing/index.mjs +0 -328
- package/dist/lib/node-esm/testing/index.mjs.map +0 -7
- package/dist/types/src/errors.d.ts +0 -68
- package/dist/types/src/errors.d.ts.map +0 -1
- package/dist/types/src/internal/annotations/annotations.d.ts.map +0 -1
- package/dist/types/src/internal/annotations/annotations.test.d.ts.map +0 -1
- package/dist/types/src/internal/annotations/index.d.ts +0 -3
- package/dist/types/src/internal/annotations/index.d.ts.map +0 -1
- package/dist/types/src/internal/annotations/util.d.ts.map +0 -1
- package/dist/types/src/internal/entities/entity.d.ts +0 -10
- package/dist/types/src/internal/entities/entity.d.ts.map +0 -1
- package/dist/types/src/internal/entities/expando.d.ts +0 -16
- package/dist/types/src/internal/entities/expando.d.ts.map +0 -1
- package/dist/types/src/internal/entities/index.d.ts +0 -6
- package/dist/types/src/internal/entities/index.d.ts.map +0 -1
- package/dist/types/src/internal/entities/model.d.ts.map +0 -1
- package/dist/types/src/internal/entities/object.d.ts +0 -11
- package/dist/types/src/internal/entities/object.d.ts.map +0 -1
- package/dist/types/src/internal/entities/relation.d.ts +0 -55
- package/dist/types/src/internal/entities/relation.d.ts.map +0 -1
- package/dist/types/src/internal/entities/util.d.ts.map +0 -1
- package/dist/types/src/internal/formats/date.d.ts.map +0 -1
- package/dist/types/src/internal/formats/date.test.d.ts.map +0 -1
- package/dist/types/src/internal/formats/format.d.ts.map +0 -1
- package/dist/types/src/internal/formats/format.test.d.ts.map +0 -1
- package/dist/types/src/internal/formats/index.d.ts.map +0 -1
- package/dist/types/src/internal/formats/number.d.ts.map +0 -1
- package/dist/types/src/internal/formats/object.d.ts.map +0 -1
- package/dist/types/src/internal/formats/select.d.ts.map +0 -1
- package/dist/types/src/internal/formats/string.d.ts.map +0 -1
- package/dist/types/src/internal/formats/types.d.ts.map +0 -1
- package/dist/types/src/internal/json-schema/annotations.d.ts.map +0 -1
- package/dist/types/src/internal/json-schema/effect-schema.test.d.ts.map +0 -1
- package/dist/types/src/internal/json-schema/index.d.ts.map +0 -1
- package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts.map +0 -1
- package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +0 -1
- package/dist/types/src/internal/json-schema/json-schema.d.ts.map +0 -1
- package/dist/types/src/internal/json-schema/json-schema.test.d.ts.map +0 -1
- package/dist/types/src/internal/object/common.d.ts.map +0 -1
- package/dist/types/src/internal/object/create-object.d.ts.map +0 -1
- package/dist/types/src/internal/object/create-object.test.d.ts.map +0 -1
- package/dist/types/src/internal/object/deleted.d.ts.map +0 -1
- package/dist/types/src/internal/object/ids.d.ts.map +0 -1
- package/dist/types/src/internal/object/index.d.ts.map +0 -1
- package/dist/types/src/internal/object/inspect.d.ts.map +0 -1
- package/dist/types/src/internal/object/json-serializer.d.ts +0 -31
- package/dist/types/src/internal/object/json-serializer.d.ts.map +0 -1
- package/dist/types/src/internal/object/json-serializer.test.d.ts.map +0 -1
- package/dist/types/src/internal/object/schema-validator.d.ts.map +0 -1
- package/dist/types/src/internal/object/schema-validator.test.d.ts.map +0 -1
- package/dist/types/src/internal/object/typed-object.d.ts +0 -31
- package/dist/types/src/internal/object/typed-object.d.ts.map +0 -1
- package/dist/types/src/internal/object/typed-object.test.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/handler.test.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/index.d.ts +0 -3
- package/dist/types/src/internal/proxy/index.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/make-object.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/schema.test.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/typed-handler.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/typed-handler.test.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/typed-object.test.d.ts.map +0 -1
- package/dist/types/src/internal/ref/index.d.ts.map +0 -1
- package/dist/types/src/internal/ref/ref-array.d.ts.map +0 -1
- package/dist/types/src/internal/ref/ref.d.ts.map +0 -1
- package/dist/types/src/internal/ref/ref.test.d.ts.map +0 -1
- package/dist/types/src/internal/schema/compose.d.ts +0 -6
- package/dist/types/src/internal/schema/compose.d.ts.map +0 -1
- package/dist/types/src/internal/schema/compose.test.d.ts.map +0 -1
- package/dist/types/src/internal/schema/echo-schema.d.ts.map +0 -1
- package/dist/types/src/internal/schema/index.d.ts +0 -6
- package/dist/types/src/internal/schema/index.d.ts.map +0 -1
- package/dist/types/src/internal/schema/manipulation.d.ts.map +0 -1
- package/dist/types/src/internal/schema/persistent-schema.d.ts +0 -18
- package/dist/types/src/internal/schema/persistent-schema.d.ts.map +0 -1
- package/dist/types/src/internal/schema/runtime-schema-registry.d.ts +0 -18
- package/dist/types/src/internal/schema/runtime-schema-registry.d.ts.map +0 -1
- package/dist/types/src/internal/schema/snapshot.d.ts +0 -6
- package/dist/types/src/internal/schema/snapshot.d.ts.map +0 -1
- package/dist/types/src/internal/types/base.d.ts.map +0 -1
- package/dist/types/src/internal/types/entity.d.ts +0 -12
- package/dist/types/src/internal/types/entity.d.ts.map +0 -1
- package/dist/types/src/internal/types/index.d.ts.map +0 -1
- package/dist/types/src/internal/types/meta.d.ts.map +0 -1
- package/dist/types/src/internal/types/typename.d.ts.map +0 -1
- package/dist/types/src/internal/types/version.d.ts.map +0 -1
- package/dist/types/src/query/filter.d.ts +0 -167
- package/dist/types/src/query/filter.d.ts.map +0 -1
- package/dist/types/src/query/index.d.ts +0 -5
- package/dist/types/src/query/index.d.ts.map +0 -1
- package/dist/types/src/query/order.d.ts +0 -12
- package/dist/types/src/query/order.d.ts.map +0 -1
- package/dist/types/src/query/query.d.ts +0 -112
- package/dist/types/src/query/query.d.ts.map +0 -1
- package/dist/types/src/query/query.test.d.ts +0 -2
- package/dist/types/src/query/query.test.d.ts.map +0 -1
- package/dist/types/src/query/testing.d.ts +0 -51
- package/dist/types/src/query/testing.d.ts.map +0 -1
- package/dist/types/src/query/types.d.ts +0 -17
- package/dist/types/src/query/types.d.ts.map +0 -1
- package/dist/types/src/query/util.d.ts +0 -8
- package/dist/types/src/query/util.d.ts.map +0 -1
- package/src/errors.ts +0 -18
- package/src/internal/entities/expando.ts +0 -23
- package/src/internal/object/typed-object.ts +0 -94
- package/src/internal/proxy/index.ts +0 -6
- package/src/internal/proxy/make-object.ts +0 -113
- package/src/internal/proxy/typed-handler.test.ts +0 -102
- package/src/internal/proxy/typed-handler.ts +0 -233
- package/src/internal/proxy/typed-object.test.ts +0 -105
- package/src/internal/schema/persistent-schema.ts +0 -28
- package/src/internal/schema/runtime-schema-registry.ts +0 -78
- package/src/internal/schema/snapshot.ts +0 -25
- package/src/internal/types/entity.ts +0 -23
- package/src/query/filter.ts +0 -455
- package/src/query/index.ts +0 -9
- package/src/query/order.ts +0 -34
- package/src/query/query.test.ts +0 -334
- package/src/query/query.ts +0 -303
- package/src/query/testing.ts +0 -64
- package/src/query/types.ts +0 -23
- package/src/query/util.ts +0 -25
- /package/dist/lib/{browser/index.mjs.map → neutral/Annotation.mjs.map} +0 -0
- /package/dist/lib/{browser/internal/index.mjs.map → neutral/Database.mjs.map} +0 -0
- /package/dist/lib/{node-esm/index.mjs.map → neutral/Entity.mjs.map} +0 -0
- /package/dist/lib/{node-esm/internal/index.mjs.map → neutral/Err.mjs.map} +0 -0
- /package/dist/types/src/internal/{annotations → Annotation}/annotations.test.d.ts +0 -0
- /package/dist/types/src/internal/{entities → Entity}/util.d.ts +0 -0
- /package/dist/types/src/internal/{formats → Format}/date.d.ts +0 -0
- /package/dist/types/src/internal/{formats → Format}/date.test.d.ts +0 -0
- /package/dist/types/src/internal/{formats → Format}/format.test.d.ts +0 -0
- /package/dist/types/src/internal/{formats → Format}/index.d.ts +0 -0
- /package/dist/types/src/internal/{formats → Format}/number.d.ts +0 -0
- /package/dist/types/src/internal/{formats → Format}/object.d.ts +0 -0
- /package/dist/types/src/internal/{json-schema → JsonSchema}/effect-schema.test.d.ts +0 -0
- /package/dist/types/src/internal/{json-schema → JsonSchema}/index.d.ts +0 -0
- /package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema-normalize.d.ts +0 -0
- /package/dist/types/src/internal/{json-schema → JsonSchema}/json-schema.test.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/common.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/create-object.test.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/ids.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/inspect.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/json-serializer.test.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/schema-validator.test.d.ts +0 -0
- /package/dist/types/src/internal/{object → Obj}/typed-object.test.d.ts +0 -0
- /package/dist/types/src/internal/{ref → Ref}/index.d.ts +0 -0
- /package/dist/types/src/internal/{ref → Ref}/ref.test.d.ts +0 -0
- /package/dist/types/src/internal/{schema → Type}/compose.test.d.ts +0 -0
- /package/dist/types/src/internal/{schema → Type}/manipulation.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/handler.test.d.ts +0 -0
- /package/dist/types/src/internal/{object → common/proxy}/schema-validator.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/schema.test.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/typed-handler.test.d.ts +0 -0
- /package/dist/types/src/internal/{proxy → common/proxy}/typed-object.test.d.ts +0 -0
- /package/src/internal/{entities → Entity}/util.ts +0 -0
- /package/src/internal/{formats → Format}/date.ts +0 -0
- /package/src/internal/{formats → Format}/index.ts +0 -0
- /package/src/internal/{formats → Format}/number.ts +0 -0
- /package/src/internal/{json-schema → JsonSchema}/effect-schema.test.ts +0 -0
- /package/src/internal/{json-schema → JsonSchema}/index.ts +0 -0
- /package/src/internal/{object → Obj}/ids.ts +0 -0
- /package/src/internal/{ref → Ref}/index.ts +0 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Match from 'effect/Match';
|
|
6
|
+
import * as Option from 'effect/Option';
|
|
7
|
+
import * as SchemaAST from 'effect/SchemaAST';
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
type SchemaProperty,
|
|
11
|
+
getArrayElementType,
|
|
12
|
+
getBaseType,
|
|
13
|
+
getProperties,
|
|
14
|
+
isArrayType,
|
|
15
|
+
isNestedType,
|
|
16
|
+
} from '@dxos/effect';
|
|
17
|
+
import { invariant } from '@dxos/invariant';
|
|
18
|
+
|
|
19
|
+
import { type Mutable } from '../common/proxy';
|
|
20
|
+
import { getSchema } from '../common/types';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Set a deeply nested property on an object.
|
|
24
|
+
* Must be called within an Obj.change or Relation.change callback.
|
|
25
|
+
*/
|
|
26
|
+
export const setValue = (obj: Mutable<any>, path: readonly (string | number)[], value: any): void => {
|
|
27
|
+
invariant(path.length > 0, 'Path must not be empty');
|
|
28
|
+
|
|
29
|
+
const schema = getSchema(obj);
|
|
30
|
+
invariant(schema != null, 'Object must have a schema');
|
|
31
|
+
|
|
32
|
+
let parent = obj;
|
|
33
|
+
let currentAST: SchemaAST.AST | undefined = schema.ast;
|
|
34
|
+
|
|
35
|
+
// Navigate to the parent of the target property.
|
|
36
|
+
for (let i = 0; i < path.length - 1; i++) {
|
|
37
|
+
const part = path[i];
|
|
38
|
+
const key = typeof part === 'number' ? part : String(part);
|
|
39
|
+
if (parent[key] === undefined) {
|
|
40
|
+
const propertyAST = getPropertyAST(currentAST, String(part));
|
|
41
|
+
const shouldBeArray = propertyAST ? isArrayType(propertyAST) : false;
|
|
42
|
+
|
|
43
|
+
if (shouldBeArray) {
|
|
44
|
+
// Create array.
|
|
45
|
+
parent[key] = [];
|
|
46
|
+
} else {
|
|
47
|
+
// TODO(wittjosiah): Is there a better way to handle this than creating an object with defaults?
|
|
48
|
+
// Perhaps properties on objects should be optional by default?
|
|
49
|
+
// Create object with defaults for required fields.
|
|
50
|
+
const objWithDefaults = createObjectWithDefaults(propertyAST);
|
|
51
|
+
parent[key] = objWithDefaults;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
parent = parent[key];
|
|
56
|
+
currentAST = getPropertyAST(currentAST, String(part));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const finalKey = path[path.length - 1];
|
|
60
|
+
parent[finalKey] = value;
|
|
61
|
+
|
|
62
|
+
return value;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Helper to get the AST of a nested property.
|
|
67
|
+
* @param ast - Current schema AST.
|
|
68
|
+
* @param propertyName - Name of the property to get.
|
|
69
|
+
* @returns The AST of the nested property, or undefined if not found.
|
|
70
|
+
*/
|
|
71
|
+
const getPropertyAST = (ast: SchemaAST.AST | undefined, propertyName: string): SchemaAST.AST | undefined => {
|
|
72
|
+
if (!ast) {
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (isNestedType(ast)) {
|
|
77
|
+
const properties = getProperties(ast);
|
|
78
|
+
const property = properties.find((p) => p.name.toString() === propertyName);
|
|
79
|
+
if (property) {
|
|
80
|
+
return getBaseType(property).type;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (isArrayType(ast)) {
|
|
85
|
+
const elementType = getArrayElementType(ast);
|
|
86
|
+
return elementType;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return undefined;
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Get all required properties from a schema AST.
|
|
94
|
+
* A property is required if it's not optional.
|
|
95
|
+
*
|
|
96
|
+
* @param ast - Schema AST to inspect.
|
|
97
|
+
* @returns Array of required properties with their types.
|
|
98
|
+
*/
|
|
99
|
+
const getRequiredProperties = (ast: SchemaAST.AST | undefined): SchemaProperty[] => {
|
|
100
|
+
if (!ast) {
|
|
101
|
+
return [];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Only objects/structs have properties with optional/required distinction.
|
|
105
|
+
if (!isNestedType(ast)) {
|
|
106
|
+
return [];
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const properties = getProperties(ast);
|
|
110
|
+
|
|
111
|
+
// Filter to only required properties (where isOptional === false).
|
|
112
|
+
return properties.filter((p) => !p.isOptional);
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Get the default value for a primitive type.
|
|
117
|
+
* Returns undefined for non-primitive or unsupported types.
|
|
118
|
+
*
|
|
119
|
+
* @param ast - Type AST.
|
|
120
|
+
* @returns Default value for the type, or undefined.
|
|
121
|
+
*/
|
|
122
|
+
const getDefaultValueForType = (ast: SchemaAST.AST | undefined): any => {
|
|
123
|
+
if (!ast) {
|
|
124
|
+
return undefined;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const defaultValue = SchemaAST.getDefaultAnnotation(ast);
|
|
128
|
+
if (Option.isSome(defaultValue)) {
|
|
129
|
+
return defaultValue.value;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return Match.value(ast).pipe(
|
|
133
|
+
Match.when({ _tag: 'StringKeyword' }, () => ''),
|
|
134
|
+
Match.when({ _tag: 'NumberKeyword' }, () => 0),
|
|
135
|
+
Match.when({ _tag: 'BooleanKeyword' }, () => false),
|
|
136
|
+
Match.orElse(() => undefined),
|
|
137
|
+
);
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Create an object with default values for all required properties.
|
|
142
|
+
* Handles primitive types (String, Number, Boolean) and recursively initializes required nested objects.
|
|
143
|
+
*
|
|
144
|
+
* @param ast - Schema AST describing the object structure.
|
|
145
|
+
* @returns Object with required fields populated with defaults.
|
|
146
|
+
*/
|
|
147
|
+
const createObjectWithDefaults = (ast: SchemaAST.AST | undefined): any => {
|
|
148
|
+
if (!ast) {
|
|
149
|
+
return {};
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const requiredProps = getRequiredProperties(ast);
|
|
153
|
+
const obj: any = {};
|
|
154
|
+
|
|
155
|
+
for (const prop of requiredProps) {
|
|
156
|
+
const defaultValue = getDefaultValueForType(prop.type);
|
|
157
|
+
if (defaultValue !== undefined) {
|
|
158
|
+
obj[prop.name] = defaultValue;
|
|
159
|
+
} else if (isNestedType(prop.type)) {
|
|
160
|
+
obj[prop.name] = createObjectWithDefaults(prop.type);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return obj;
|
|
165
|
+
};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { assertArgument } from '@dxos/invariant';
|
|
6
|
+
import { deepMapValues } from '@dxos/util';
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
KindId,
|
|
10
|
+
MetaId,
|
|
11
|
+
ObjectDatabaseId,
|
|
12
|
+
ObjectDeletedId,
|
|
13
|
+
RelationSourceDXNId,
|
|
14
|
+
RelationSourceId,
|
|
15
|
+
RelationTargetDXNId,
|
|
16
|
+
RelationTargetId,
|
|
17
|
+
SchemaId,
|
|
18
|
+
SelfDXNId,
|
|
19
|
+
SnapshotKindId,
|
|
20
|
+
TypeId,
|
|
21
|
+
} from '../common/types';
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Copy a Symbol-keyed property from source to target if it has a defined value.
|
|
25
|
+
* Handles both plain objects (symbol in source) and proxies where get returns a value
|
|
26
|
+
* but has/in returns false (e.g. ObjectDatabaseId on echo-db proxies).
|
|
27
|
+
* Optional transform clones or mutates the value before assignment (e.g. for MetaId).
|
|
28
|
+
*/
|
|
29
|
+
const copySymbolProperty = (
|
|
30
|
+
source: any,
|
|
31
|
+
target: any,
|
|
32
|
+
symbol: symbol,
|
|
33
|
+
transform?: (value: unknown) => unknown,
|
|
34
|
+
): void => {
|
|
35
|
+
let value: unknown;
|
|
36
|
+
// Echo-db proxy getters (e.g. RelationSourceId, RelationTargetId) can throw in certain states.
|
|
37
|
+
try {
|
|
38
|
+
value = source[symbol];
|
|
39
|
+
} catch {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (value !== undefined) {
|
|
43
|
+
const finalValue = transform ? transform(value) : value;
|
|
44
|
+
Object.defineProperty(target, symbol, {
|
|
45
|
+
value: finalValue,
|
|
46
|
+
writable: false,
|
|
47
|
+
enumerable: false,
|
|
48
|
+
configurable: false,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Returns an immutable snapshot of the reactive object.
|
|
55
|
+
* The snapshot is branded with SnapshotKindId (not KindId).
|
|
56
|
+
*/
|
|
57
|
+
export const getSnapshot = <T extends object>(obj: T): T => {
|
|
58
|
+
assertArgument(typeof obj === 'object' && obj !== null && KindId in obj, 'obj', 'must be an entity');
|
|
59
|
+
|
|
60
|
+
const snapshot = deepMapValues(obj, (value, recurse) => {
|
|
61
|
+
// Do not recurse on references (but do recurse on arrays).
|
|
62
|
+
if (
|
|
63
|
+
typeof value === 'object' &&
|
|
64
|
+
value !== null &&
|
|
65
|
+
Object.getPrototypeOf(value) !== Object.prototype &&
|
|
66
|
+
!Array.isArray(value)
|
|
67
|
+
) {
|
|
68
|
+
return value;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return recurse(value);
|
|
72
|
+
}) as any;
|
|
73
|
+
|
|
74
|
+
// Add SnapshotKindId brand based on original KindId.
|
|
75
|
+
if (obj != null && typeof obj === 'object' && KindId in obj) {
|
|
76
|
+
snapshot[SnapshotKindId] = (obj as any)[KindId];
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Preserve Symbol-keyed properties that are important for type introspection.
|
|
80
|
+
// These are not copied by deepMapValues since Object.keys() doesn't include symbols.
|
|
81
|
+
const source = obj as any;
|
|
82
|
+
|
|
83
|
+
// Type introspection symbols.
|
|
84
|
+
copySymbolProperty(source, snapshot, TypeId);
|
|
85
|
+
copySymbolProperty(source, snapshot, SchemaId);
|
|
86
|
+
copySymbolProperty(source, snapshot, SelfDXNId);
|
|
87
|
+
|
|
88
|
+
// Database reference (required for Obj.getDatabase to work on snapshots).
|
|
89
|
+
copySymbolProperty(source, snapshot, ObjectDatabaseId);
|
|
90
|
+
copySymbolProperty(source, snapshot, ObjectDeletedId);
|
|
91
|
+
|
|
92
|
+
// Metadata symbol. Copy arrays so the snapshot is not affected by mutations to the live meta's keys/tags.
|
|
93
|
+
copySymbolProperty(source, snapshot, MetaId, (meta: any) => ({
|
|
94
|
+
keys: [...(meta?.keys ?? [])],
|
|
95
|
+
tags: [...(meta?.tags ?? [])],
|
|
96
|
+
}));
|
|
97
|
+
|
|
98
|
+
// Relation endpoint symbols.
|
|
99
|
+
copySymbolProperty(source, snapshot, RelationSourceDXNId);
|
|
100
|
+
copySymbolProperty(source, snapshot, RelationTargetDXNId);
|
|
101
|
+
copySymbolProperty(source, snapshot, RelationSourceId);
|
|
102
|
+
copySymbolProperty(source, snapshot, RelationTargetId);
|
|
103
|
+
|
|
104
|
+
return Object.freeze(snapshot) as T;
|
|
105
|
+
};
|
|
@@ -6,26 +6,26 @@ 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 {
|
|
9
|
+
import { EchoObjectSchema } from '../Entity';
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
typename: 'example.com/type/Organization',
|
|
13
|
-
version: '0.1.0',
|
|
14
|
-
})({
|
|
11
|
+
const Organization = Schema.Struct({
|
|
15
12
|
name: Schema.String,
|
|
16
|
-
})
|
|
13
|
+
}).pipe(
|
|
14
|
+
EchoObjectSchema({
|
|
15
|
+
typename: 'com.example.type.organization',
|
|
16
|
+
version: '0.1.0',
|
|
17
|
+
}),
|
|
18
|
+
);
|
|
17
19
|
|
|
18
|
-
|
|
20
|
+
interface Organization extends Schema.Schema.Type<typeof Organization> {}
|
|
21
|
+
|
|
22
|
+
describe('EchoObjectSchema DSL', () => {
|
|
19
23
|
test('type is a valid schema', async () => {
|
|
20
24
|
expect(Schema.isSchema(Organization)).to.be.true;
|
|
21
25
|
});
|
|
22
26
|
|
|
23
27
|
test('static typename accessor', async () => {
|
|
24
|
-
expect(Organization.typename).to.eq('example.
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
test('expect constructor to throw', async () => {
|
|
28
|
-
expect(() => new Organization()).to.throw();
|
|
28
|
+
expect(Organization.typename).to.eq('com.example.type.organization');
|
|
29
29
|
});
|
|
30
30
|
|
|
31
31
|
test('expect schema', async () => {
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import type * as Schema from 'effect/Schema';
|
|
6
|
+
|
|
7
|
+
import { type TypeMeta } from '../Annotation';
|
|
8
|
+
import { type AnyEntity } from '../common/types';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Definition for an object type that can be stored in an ECHO database.
|
|
12
|
+
* Implements effect schema to define object properties.
|
|
13
|
+
* Has a typename and version.
|
|
14
|
+
*
|
|
15
|
+
* In contrast to {@link EchoSchema} this definition is not recorded in the database.
|
|
16
|
+
*
|
|
17
|
+
* @deprecated Use `Type.AnyObj` from `@dxos/echo` instead.
|
|
18
|
+
*/
|
|
19
|
+
export interface TypedObject<A = any, I = any> extends TypeMeta, Schema.Schema<A, I> {}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Typed object that could be used as a prototype in class definitions.
|
|
23
|
+
* This is an internal API type.
|
|
24
|
+
*
|
|
25
|
+
* @deprecated Use `Type.AnyObj` from `@dxos/echo` instead.
|
|
26
|
+
*/
|
|
27
|
+
export interface TypedObjectPrototype<A = any, I = any> extends TypedObject<A, I> {
|
|
28
|
+
/** Type constructor. */
|
|
29
|
+
new (): AnyEntity & A;
|
|
30
|
+
}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { type ObjectId } from '@dxos/keys';
|
|
6
6
|
import { isNonNullable } from '@dxos/util';
|
|
7
7
|
|
|
8
|
-
import { type
|
|
8
|
+
import { type AnyEntity } from '../common/types';
|
|
9
9
|
|
|
10
10
|
import { Ref } from './ref';
|
|
11
11
|
|
|
@@ -16,21 +16,21 @@ export const RefArray = Object.freeze({
|
|
|
16
16
|
/**
|
|
17
17
|
* @returns all resolved targets.
|
|
18
18
|
*/
|
|
19
|
-
targets: <T extends
|
|
19
|
+
targets: <T extends AnyEntity>(refs: readonly Ref<T>[]): T[] => {
|
|
20
20
|
return refs.map((ref) => ref.target).filter(isNonNullable);
|
|
21
21
|
},
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
24
|
* Load all referenced objects.
|
|
25
25
|
*/
|
|
26
|
-
loadAll: <T extends
|
|
26
|
+
loadAll: <T extends AnyEntity>(refs: readonly Ref<T>[]): Promise<T[]> => {
|
|
27
27
|
return Promise.all(refs.map((ref) => ref.load()));
|
|
28
28
|
},
|
|
29
29
|
|
|
30
30
|
/**
|
|
31
31
|
* Removes the ref with the given id.
|
|
32
32
|
*/
|
|
33
|
-
removeById: (refs: Ref<
|
|
33
|
+
removeById: (refs: Ref<AnyEntity>[], id: ObjectId) => {
|
|
34
34
|
const index = refs.findIndex(Ref.hasObjectId(id));
|
|
35
35
|
if (index >= 0) {
|
|
36
36
|
refs.splice(index, 1);
|
|
@@ -7,8 +7,8 @@ import { describe, expect, test } from 'vitest';
|
|
|
7
7
|
|
|
8
8
|
import { DXN, ObjectId } from '@dxos/keys';
|
|
9
9
|
|
|
10
|
-
import { EchoObjectSchema, getObjectDXN } from '../
|
|
11
|
-
import { createObject } from '../
|
|
10
|
+
import { EchoObjectSchema, getObjectDXN } from '../Entity';
|
|
11
|
+
import { createObject } from '../Obj';
|
|
12
12
|
|
|
13
13
|
import { Ref, getReferenceAst } from './ref';
|
|
14
14
|
|
|
@@ -16,7 +16,7 @@ const Task = Schema.Struct({
|
|
|
16
16
|
title: Schema.optional(Schema.String),
|
|
17
17
|
}).pipe(
|
|
18
18
|
EchoObjectSchema({
|
|
19
|
-
typename: 'example.
|
|
19
|
+
typename: 'com.example.type.task',
|
|
20
20
|
version: '0.1.0',
|
|
21
21
|
}),
|
|
22
22
|
);
|
|
@@ -26,10 +26,10 @@ type Task = Schema.Schema.Type<typeof Task>;
|
|
|
26
26
|
const Contact = Schema.Struct({
|
|
27
27
|
name: Schema.String,
|
|
28
28
|
email: Schema.optional(Schema.String),
|
|
29
|
-
tasks: Schema.
|
|
29
|
+
tasks: Schema.Array(Ref(Task)),
|
|
30
30
|
}).pipe(
|
|
31
31
|
EchoObjectSchema({
|
|
32
|
-
typename: 'example.
|
|
32
|
+
typename: 'com.example.type.person',
|
|
33
33
|
version: '0.1.0',
|
|
34
34
|
}),
|
|
35
35
|
);
|
|
@@ -3,19 +3,25 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import * as Effect from 'effect/Effect';
|
|
6
|
+
import * as Equal from 'effect/Equal';
|
|
7
|
+
import * as Hash from 'effect/Hash';
|
|
6
8
|
import * as Option from 'effect/Option';
|
|
7
9
|
import * as ParseResult from 'effect/ParseResult';
|
|
10
|
+
import * as Pipeable from 'effect/Pipeable';
|
|
8
11
|
import * as Schema from 'effect/Schema';
|
|
9
12
|
import * as SchemaAST from 'effect/SchemaAST';
|
|
13
|
+
import type * as Types from 'effect/Types';
|
|
10
14
|
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
15
|
+
import { Event } from '@dxos/async';
|
|
16
|
+
import { type CustomInspectFunction, inspectCustom } from '@dxos/debug';
|
|
17
|
+
import { EncodedReference } from '@dxos/echo-protocol';
|
|
13
18
|
import { assertArgument, invariant } from '@dxos/invariant';
|
|
14
19
|
import { DXN, ObjectId } from '@dxos/keys';
|
|
15
20
|
|
|
16
|
-
import
|
|
17
|
-
import {
|
|
18
|
-
import
|
|
21
|
+
import * as Database from '../../Database';
|
|
22
|
+
import { ReferenceAnnotationId, getSchemaDXN, getTypeAnnotation, getTypeIdentifierAnnotation } from '../Annotation';
|
|
23
|
+
import { type JsonSchemaType } from '../JsonSchema';
|
|
24
|
+
import type { AnyEntity, AnyProperties } from '../common/types';
|
|
19
25
|
|
|
20
26
|
/**
|
|
21
27
|
* The `$id` and `$ref` fields for an ECHO reference schema.
|
|
@@ -29,7 +35,7 @@ export const getSchemaReference = (property: JsonSchemaType): { typename: string
|
|
|
29
35
|
}
|
|
30
36
|
};
|
|
31
37
|
|
|
32
|
-
export const createSchemaReference = (typename: string): JsonSchemaType => {
|
|
38
|
+
export const createSchemaReference = (typename: string): Types.DeepMutable<JsonSchemaType> => {
|
|
33
39
|
return {
|
|
34
40
|
$id: JSON_SCHEMA_ECHO_REF_ID,
|
|
35
41
|
reference: {
|
|
@@ -70,7 +76,7 @@ export const RefTypeId: unique symbol = Symbol('@dxos/echo/internal/Ref');
|
|
|
70
76
|
/**
|
|
71
77
|
* Reference Schema.
|
|
72
78
|
*/
|
|
73
|
-
export interface RefSchema<T extends
|
|
79
|
+
export interface RefSchema<T extends AnyEntity> extends Schema.SchemaClass<Ref<T>, EncodedReference> {}
|
|
74
80
|
|
|
75
81
|
/**
|
|
76
82
|
* Type of the `Ref` function and extra methods attached to it.
|
|
@@ -101,8 +107,8 @@ export interface RefFn {
|
|
|
101
107
|
/**
|
|
102
108
|
* Constructs a reference that points to the given object.
|
|
103
109
|
*/
|
|
104
|
-
// TODO(burdon): Narrow to Obj.
|
|
105
|
-
make: <T extends
|
|
110
|
+
// TODO(burdon): Narrow to Obj.Unknown?
|
|
111
|
+
make: <T extends AnyEntity>(object: T) => Ref<T>;
|
|
106
112
|
|
|
107
113
|
/**
|
|
108
114
|
* Constructs a reference that points to the object specified by the provided DXN.
|
|
@@ -115,36 +121,33 @@ export interface RefFn {
|
|
|
115
121
|
*/
|
|
116
122
|
export const Ref: RefFn = <S extends Schema.Schema.Any>(schema: S): RefSchema<Schema.Schema.Type<S>> => {
|
|
117
123
|
assertArgument(Schema.isSchema(schema), 'schema', 'Must call with an instance of effect-schema');
|
|
118
|
-
|
|
119
124
|
const annotation = getTypeAnnotation(schema);
|
|
120
125
|
if (annotation == null) {
|
|
121
126
|
throw new Error('Reference target must be an ECHO schema.');
|
|
122
127
|
}
|
|
123
128
|
|
|
124
|
-
return createEchoReferenceSchema(
|
|
125
|
-
getTypeIdentifierAnnotation(schema),
|
|
126
|
-
annotation.typename,
|
|
127
|
-
annotation.version,
|
|
128
|
-
getSchemaExpectedName(schema.ast),
|
|
129
|
-
);
|
|
129
|
+
return createEchoReferenceSchema(getTypeIdentifierAnnotation(schema), annotation.typename, annotation.version);
|
|
130
130
|
};
|
|
131
131
|
|
|
132
132
|
/**
|
|
133
133
|
* Represents materialized reference to a target.
|
|
134
134
|
* This is the data type for the fields marked as ref.
|
|
135
135
|
*/
|
|
136
|
-
export interface Ref<T> {
|
|
136
|
+
export interface Ref<T> extends Pipeable.Pipeable {
|
|
137
137
|
/**
|
|
138
138
|
* Target object DXN.
|
|
139
139
|
*/
|
|
140
140
|
get dxn(): DXN;
|
|
141
141
|
|
|
142
|
+
/**
|
|
143
|
+
* Returns true if the reference has a target available (inlined or resolver set).
|
|
144
|
+
*/
|
|
145
|
+
get isAvailable(): boolean;
|
|
146
|
+
|
|
142
147
|
/**
|
|
143
148
|
* @returns The reference target.
|
|
144
149
|
* May return `undefined` if the object is not loaded in the working set.
|
|
145
150
|
* Accessing this property, even if it returns `undefined` will trigger the object to be loaded to the working set.
|
|
146
|
-
*
|
|
147
|
-
* @reactive Supports signal subscriptions.
|
|
148
151
|
*/
|
|
149
152
|
get target(): T | undefined;
|
|
150
153
|
|
|
@@ -158,6 +161,7 @@ export interface Ref<T> {
|
|
|
158
161
|
/**
|
|
159
162
|
* @returns Promise that will resolves with the target object or undefined if the object is not loaded locally.
|
|
160
163
|
*/
|
|
164
|
+
|
|
161
165
|
tryLoad(): Promise<T | undefined>;
|
|
162
166
|
|
|
163
167
|
/**
|
|
@@ -219,7 +223,7 @@ Ref.make = <T extends AnyProperties>(obj: T): Ref<T> => {
|
|
|
219
223
|
// TODO(dmaretskyi): Extract to `getObjectDXN` function.
|
|
220
224
|
const id = obj.id;
|
|
221
225
|
invariant(ObjectId.isValid(id), 'Invalid object ID');
|
|
222
|
-
const dxn =
|
|
226
|
+
const dxn = DXN.fromLocalObjectId(id);
|
|
223
227
|
return new RefImpl(dxn, obj);
|
|
224
228
|
};
|
|
225
229
|
|
|
@@ -244,7 +248,6 @@ export const createEchoReferenceSchema = (
|
|
|
244
248
|
echoId: string | undefined,
|
|
245
249
|
typename: string | undefined,
|
|
246
250
|
version: string | undefined,
|
|
247
|
-
schemaName?: string, // TODO(burdon): Not used.
|
|
248
251
|
): Schema.SchemaClass<Ref<any>, EncodedReference> => {
|
|
249
252
|
if (!echoId && !typename) {
|
|
250
253
|
throw new TypeError('Either echoId or typename must be provided.');
|
|
@@ -263,25 +266,39 @@ export const createEchoReferenceSchema = (
|
|
|
263
266
|
[],
|
|
264
267
|
{
|
|
265
268
|
encode: () => {
|
|
266
|
-
return (value) =>
|
|
267
|
-
|
|
268
|
-
|
|
269
|
+
return (value) =>
|
|
270
|
+
Effect.gen(function* () {
|
|
271
|
+
if (Ref.isRef(value)) {
|
|
272
|
+
return EncodedReference.fromDXN((value as Ref<any>).dxn);
|
|
273
|
+
} else if (EncodedReference.isEncodedReference(value)) {
|
|
274
|
+
return value;
|
|
275
|
+
}
|
|
276
|
+
throw new Error('Invalid reference');
|
|
269
277
|
});
|
|
270
|
-
};
|
|
271
278
|
},
|
|
272
279
|
decode: () => {
|
|
273
|
-
return (value) =>
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
280
|
+
return (value) =>
|
|
281
|
+
Effect.gen(function* () {
|
|
282
|
+
const dbService = yield* Effect.serviceOption(Database.Service);
|
|
283
|
+
|
|
284
|
+
// TODO(dmaretskyi): This branch seems to be taken by Schema.is
|
|
285
|
+
if (Ref.isRef(value)) {
|
|
286
|
+
if (Option.isSome(dbService)) {
|
|
287
|
+
return dbService.value.db.makeRef(value.dxn);
|
|
288
|
+
} else {
|
|
289
|
+
return value;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
if (!EncodedReference.isEncodedReference(value)) {
|
|
294
|
+
return yield* Effect.fail(new ParseResult.Unexpected(value, 'reference'));
|
|
295
|
+
}
|
|
296
|
+
if (Option.isSome(dbService)) {
|
|
297
|
+
return dbService.value.db.makeRef(EncodedReference.toDXN(value));
|
|
298
|
+
} else {
|
|
299
|
+
return Ref.fromDXN(EncodedReference.toDXN(value));
|
|
300
|
+
}
|
|
301
|
+
});
|
|
285
302
|
},
|
|
286
303
|
},
|
|
287
304
|
{
|
|
@@ -331,7 +348,7 @@ export interface RefResolver {
|
|
|
331
348
|
export class RefImpl<T> implements Ref<T> {
|
|
332
349
|
#dxn: DXN;
|
|
333
350
|
#resolver?: RefResolver = undefined;
|
|
334
|
-
#
|
|
351
|
+
#resolved = new Event<void>();
|
|
335
352
|
|
|
336
353
|
/**
|
|
337
354
|
* Target is set when the reference is created from a specific object.
|
|
@@ -343,7 +360,7 @@ export class RefImpl<T> implements Ref<T> {
|
|
|
343
360
|
* Callback to issue a reactive notification when object is resolved.
|
|
344
361
|
*/
|
|
345
362
|
#resolverCallback = () => {
|
|
346
|
-
this.#
|
|
363
|
+
this.#resolved.emit();
|
|
347
364
|
};
|
|
348
365
|
|
|
349
366
|
constructor(dxn: DXN, target?: T) {
|
|
@@ -358,11 +375,17 @@ export class RefImpl<T> implements Ref<T> {
|
|
|
358
375
|
return this.#dxn;
|
|
359
376
|
}
|
|
360
377
|
|
|
378
|
+
/**
|
|
379
|
+
* @inheritdoc
|
|
380
|
+
*/
|
|
381
|
+
get isAvailable(): boolean {
|
|
382
|
+
return this.#target !== undefined || this.#resolver !== undefined;
|
|
383
|
+
}
|
|
384
|
+
|
|
361
385
|
/**
|
|
362
386
|
* @inheritdoc
|
|
363
387
|
*/
|
|
364
388
|
get target(): T | undefined {
|
|
365
|
-
this.#signal.notifyRead();
|
|
366
389
|
if (this.#target) {
|
|
367
390
|
return this.#target;
|
|
368
391
|
}
|
|
@@ -390,6 +413,9 @@ export class RefImpl<T> implements Ref<T> {
|
|
|
390
413
|
* @inheritdoc
|
|
391
414
|
*/
|
|
392
415
|
async tryLoad(): Promise<T | undefined> {
|
|
416
|
+
if (this.#target) {
|
|
417
|
+
return this.#target;
|
|
418
|
+
}
|
|
393
419
|
invariant(this.#resolver, 'Resolver is not set');
|
|
394
420
|
return (await this.#resolver.resolve(this.#dxn)) as T | undefined;
|
|
395
421
|
}
|
|
@@ -430,8 +456,27 @@ export class RefImpl<T> implements Ref<T> {
|
|
|
430
456
|
return `Ref(${this.#dxn.toString()})`;
|
|
431
457
|
}
|
|
432
458
|
|
|
459
|
+
[inspectCustom]: CustomInspectFunction = (depth, options, inspect) => {
|
|
460
|
+
return this.toString();
|
|
461
|
+
};
|
|
462
|
+
|
|
433
463
|
[RefTypeId] = refVariance;
|
|
434
464
|
|
|
465
|
+
/**
|
|
466
|
+
* Effect Hash trait. Required for MutableHashMap-based caches (e.g., Atom.family)
|
|
467
|
+
* to deduplicate Ref instances that point to the same object.
|
|
468
|
+
* ECHO proxies return new RefImpl instances on every property access,
|
|
469
|
+
* so without this, each access would create a separate cache entry.
|
|
470
|
+
*/
|
|
471
|
+
[Hash.symbol](): number {
|
|
472
|
+
return Hash.hash(this.#dxn.toString());
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
/** Effect Equal trait. See {@link Hash.symbol} for rationale. */
|
|
476
|
+
[Equal.symbol](that: Equal.Equal): boolean {
|
|
477
|
+
return that instanceof RefImpl && this.#dxn.toString() === that.dxn.toString();
|
|
478
|
+
}
|
|
479
|
+
|
|
435
480
|
/**
|
|
436
481
|
* Internal method to set the resolver.
|
|
437
482
|
*
|
|
@@ -442,14 +487,16 @@ export class RefImpl<T> implements Ref<T> {
|
|
|
442
487
|
}
|
|
443
488
|
|
|
444
489
|
/**
|
|
445
|
-
* Internal method to get the saved target.
|
|
446
|
-
* Not the same as `target` which is resolved from the resolver.
|
|
447
|
-
*
|
|
448
490
|
* @internal
|
|
449
491
|
*/
|
|
450
492
|
_getSavedTarget(): T | undefined {
|
|
451
493
|
return this.#target;
|
|
452
494
|
}
|
|
495
|
+
|
|
496
|
+
pipe() {
|
|
497
|
+
// eslint-disable-next-line prefer-rest-params
|
|
498
|
+
return Pipeable.pipeArguments(this, arguments);
|
|
499
|
+
}
|
|
453
500
|
}
|
|
454
501
|
|
|
455
502
|
/**
|