@dxos/echo 0.8.4-main.67995b8 → 0.8.4-main.69d29f4
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 +2 -3
- package/dist/lib/browser/Annotation.mjs +33 -0
- package/dist/lib/browser/Annotation.mjs.map +7 -0
- package/dist/lib/browser/Database.mjs +18 -0
- package/dist/lib/browser/Database.mjs.map +7 -0
- package/dist/lib/browser/Entity.mjs +52 -0
- package/dist/lib/browser/Entity.mjs.map +7 -0
- package/dist/lib/browser/Err.mjs +11 -0
- package/dist/lib/browser/Err.mjs.map +7 -0
- package/dist/lib/browser/Filter.mjs +62 -0
- package/dist/lib/browser/Filter.mjs.map +7 -0
- package/dist/lib/browser/Format.mjs +67 -0
- package/dist/lib/browser/Format.mjs.map +7 -0
- package/dist/lib/browser/JsonSchema.mjs +20 -0
- package/dist/lib/browser/JsonSchema.mjs.map +7 -0
- package/dist/lib/browser/Key.mjs +13 -0
- package/dist/lib/browser/Key.mjs.map +7 -0
- package/dist/lib/browser/Obj.mjs +91 -0
- package/dist/lib/browser/Obj.mjs.map +7 -0
- package/dist/lib/browser/Order.mjs +13 -0
- package/dist/lib/browser/Order.mjs.map +7 -0
- package/dist/lib/browser/Query.mjs +27 -0
- package/dist/lib/browser/Query.mjs.map +7 -0
- package/dist/lib/browser/QueryResult.mjs +3 -0
- package/dist/lib/browser/QueryResult.mjs.map +7 -0
- package/dist/lib/browser/Ref.mjs +23 -0
- package/dist/lib/browser/Ref.mjs.map +7 -0
- package/dist/lib/browser/Relation.mjs +85 -0
- package/dist/lib/browser/Relation.mjs.map +7 -0
- package/dist/lib/browser/SchemaRegistry.mjs +3 -0
- package/dist/lib/browser/SchemaRegistry.mjs.map +7 -0
- package/dist/lib/browser/Tag.mjs +26 -0
- package/dist/lib/browser/Tag.mjs.map +7 -0
- package/dist/lib/browser/Type.mjs +48 -0
- package/dist/lib/browser/Type.mjs.map +7 -0
- package/dist/lib/browser/chunk-2RMVRVOB.mjs +250 -0
- package/dist/lib/browser/chunk-2RMVRVOB.mjs.map +7 -0
- package/dist/lib/browser/chunk-5RDNDPMX.mjs +74 -0
- package/dist/lib/browser/chunk-5RDNDPMX.mjs.map +7 -0
- package/dist/lib/browser/chunk-73M2G455.mjs +98 -0
- package/dist/lib/browser/chunk-73M2G455.mjs.map +7 -0
- package/dist/lib/browser/chunk-7STIBCP7.mjs +133 -0
- package/dist/lib/browser/chunk-7STIBCP7.mjs.map +7 -0
- package/dist/lib/browser/chunk-AFGYYVVQ.mjs +57 -0
- package/dist/lib/browser/chunk-AFGYYVVQ.mjs.map +7 -0
- package/dist/lib/browser/chunk-BC6R4CAF.mjs +24 -0
- package/dist/lib/browser/chunk-BC6R4CAF.mjs.map +7 -0
- package/dist/lib/browser/chunk-BPYFLHWO.mjs +158 -0
- package/dist/lib/browser/chunk-BPYFLHWO.mjs.map +7 -0
- package/dist/lib/browser/chunk-CBPFF3ZO.mjs +204 -0
- package/dist/lib/browser/chunk-CBPFF3ZO.mjs.map +7 -0
- package/dist/lib/browser/chunk-CGS2ULMK.mjs +11 -0
- package/dist/lib/browser/chunk-CGS2ULMK.mjs.map +7 -0
- package/dist/lib/browser/chunk-CJ5YELTO.mjs +39 -0
- package/dist/lib/browser/chunk-CJ5YELTO.mjs.map +7 -0
- package/dist/lib/browser/chunk-FPOISFQK.mjs +40 -0
- package/dist/lib/browser/chunk-FPOISFQK.mjs.map +7 -0
- package/dist/lib/browser/chunk-INHXFXY5.mjs +22 -0
- package/dist/lib/browser/chunk-INHXFXY5.mjs.map +7 -0
- package/dist/lib/browser/chunk-IXVWLTG7.mjs +9 -0
- package/dist/lib/browser/chunk-IXVWLTG7.mjs.map +7 -0
- package/dist/lib/browser/chunk-JMKVF2YQ.mjs +43 -0
- package/dist/lib/browser/chunk-JMKVF2YQ.mjs.map +7 -0
- package/dist/lib/browser/chunk-L4RXUJHJ.mjs +143 -0
- package/dist/lib/browser/chunk-L4RXUJHJ.mjs.map +7 -0
- package/dist/lib/browser/chunk-MYCCGG2T.mjs +15 -0
- package/dist/lib/browser/chunk-MYCCGG2T.mjs.map +7 -0
- package/dist/lib/browser/chunk-PAM4KEXE.mjs +3847 -0
- package/dist/lib/browser/chunk-PAM4KEXE.mjs.map +7 -0
- package/dist/lib/browser/chunk-QIWDIPLR.mjs +41 -0
- package/dist/lib/browser/chunk-QIWDIPLR.mjs.map +7 -0
- package/dist/lib/browser/chunk-R3S54KRI.mjs +403 -0
- package/dist/lib/browser/chunk-R3S54KRI.mjs.map +7 -0
- package/dist/lib/browser/chunk-RK4Z4JUZ.mjs +283 -0
- package/dist/lib/browser/chunk-RK4Z4JUZ.mjs.map +7 -0
- package/dist/lib/browser/chunk-TPIL3G6Y.mjs +288 -0
- package/dist/lib/browser/chunk-TPIL3G6Y.mjs.map +7 -0
- package/dist/lib/browser/chunk-YKTSSMDS.mjs +69 -0
- package/dist/lib/browser/chunk-YKTSSMDS.mjs.map +7 -0
- package/dist/lib/browser/chunk-ZHXZGIXD.mjs +9 -0
- package/dist/lib/browser/chunk-ZHXZGIXD.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +72 -9
- package/dist/lib/browser/internal/index.mjs +457 -0
- package/dist/lib/browser/internal/index.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +332 -35
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/node-esm/Annotation.mjs +33 -0
- package/dist/lib/node-esm/Annotation.mjs.map +7 -0
- package/dist/lib/node-esm/Database.mjs +18 -0
- package/dist/lib/node-esm/Database.mjs.map +7 -0
- package/dist/lib/node-esm/Entity.mjs +52 -0
- package/dist/lib/node-esm/Entity.mjs.map +7 -0
- package/dist/lib/node-esm/Err.mjs +11 -0
- package/dist/lib/node-esm/Err.mjs.map +7 -0
- package/dist/lib/node-esm/Filter.mjs +62 -0
- package/dist/lib/node-esm/Filter.mjs.map +7 -0
- package/dist/lib/node-esm/Format.mjs +67 -0
- package/dist/lib/node-esm/Format.mjs.map +7 -0
- package/dist/lib/node-esm/JsonSchema.mjs +20 -0
- package/dist/lib/node-esm/JsonSchema.mjs.map +7 -0
- package/dist/lib/node-esm/Key.mjs +13 -0
- package/dist/lib/node-esm/Key.mjs.map +7 -0
- package/dist/lib/node-esm/Obj.mjs +91 -0
- package/dist/lib/node-esm/Obj.mjs.map +7 -0
- package/dist/lib/node-esm/Order.mjs +13 -0
- package/dist/lib/node-esm/Order.mjs.map +7 -0
- package/dist/lib/node-esm/Query.mjs +27 -0
- package/dist/lib/node-esm/Query.mjs.map +7 -0
- package/dist/lib/node-esm/QueryResult.mjs +3 -0
- package/dist/lib/node-esm/QueryResult.mjs.map +7 -0
- package/dist/lib/node-esm/Ref.mjs +23 -0
- package/dist/lib/node-esm/Ref.mjs.map +7 -0
- package/dist/lib/node-esm/Relation.mjs +85 -0
- package/dist/lib/node-esm/Relation.mjs.map +7 -0
- package/dist/lib/node-esm/SchemaRegistry.mjs +3 -0
- package/dist/lib/node-esm/SchemaRegistry.mjs.map +7 -0
- package/dist/lib/node-esm/Tag.mjs +26 -0
- package/dist/lib/node-esm/Tag.mjs.map +7 -0
- package/dist/lib/node-esm/Type.mjs +48 -0
- package/dist/lib/node-esm/Type.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-2RIFBW3A.mjs +250 -0
- package/dist/lib/node-esm/chunk-2RIFBW3A.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-5CB2ZW74.mjs +57 -0
- package/dist/lib/node-esm/chunk-5CB2ZW74.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-5U5F4AWK.mjs +3847 -0
- package/dist/lib/node-esm/chunk-5U5F4AWK.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-AJEMYSIR.mjs +22 -0
- package/dist/lib/node-esm/chunk-AJEMYSIR.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-BKYE5IW6.mjs +158 -0
- package/dist/lib/node-esm/chunk-BKYE5IW6.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-BYOD7EVP.mjs +98 -0
- package/dist/lib/node-esm/chunk-BYOD7EVP.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-FWTSPIFF.mjs +133 -0
- package/dist/lib/node-esm/chunk-FWTSPIFF.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-K37NA7PO.mjs +43 -0
- package/dist/lib/node-esm/chunk-K37NA7PO.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-LIXUCQJM.mjs +41 -0
- package/dist/lib/node-esm/chunk-LIXUCQJM.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-MOLNWFNL.mjs +9 -0
- package/dist/lib/node-esm/chunk-MOLNWFNL.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-MOWUEW5P.mjs +15 -0
- package/dist/lib/node-esm/chunk-MOWUEW5P.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-NBWL7UCZ.mjs +40 -0
- package/dist/lib/node-esm/chunk-NBWL7UCZ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-OZEDKT4R.mjs +204 -0
- package/dist/lib/node-esm/chunk-OZEDKT4R.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-PW3VCWL5.mjs +24 -0
- package/dist/lib/node-esm/chunk-PW3VCWL5.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-TSTKBFST.mjs +403 -0
- package/dist/lib/node-esm/chunk-TSTKBFST.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-UKGVOINP.mjs +9 -0
- package/dist/lib/node-esm/chunk-UKGVOINP.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-UV63HEHQ.mjs +143 -0
- package/dist/lib/node-esm/chunk-UV63HEHQ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-WXLVPCRJ.mjs +288 -0
- package/dist/lib/node-esm/chunk-WXLVPCRJ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-WZ6YBELW.mjs +74 -0
- package/dist/lib/node-esm/chunk-WZ6YBELW.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-XHJRMQZD.mjs +69 -0
- package/dist/lib/node-esm/chunk-XHJRMQZD.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-YOLH5KS4.mjs +283 -0
- package/dist/lib/node-esm/chunk-YOLH5KS4.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-YQ2NWGL5.mjs +39 -0
- package/dist/lib/node-esm/chunk-YQ2NWGL5.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +72 -9
- package/dist/lib/node-esm/internal/index.mjs +457 -0
- package/dist/lib/node-esm/internal/index.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +332 -35
- package/dist/lib/node-esm/testing/index.mjs.map +4 -4
- package/dist/types/src/Annotation.d.ts +2 -0
- package/dist/types/src/Annotation.d.ts.map +1 -0
- package/dist/types/src/Database.d.ts +194 -0
- package/dist/types/src/Database.d.ts.map +1 -0
- package/dist/types/src/Entity.d.ts +142 -0
- package/dist/types/src/Entity.d.ts.map +1 -0
- 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 +64 -0
- package/dist/types/src/Err.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 +4 -0
- package/dist/types/src/Format.d.ts.map +1 -0
- package/dist/types/src/Hypergraph.d.ts +60 -0
- package/dist/types/src/Hypergraph.d.ts.map +1 -0
- package/dist/types/src/JsonSchema.d.ts +9 -0
- package/dist/types/src/JsonSchema.d.ts.map +1 -0
- package/dist/types/src/Key.d.ts +1 -0
- package/dist/types/src/Key.d.ts.map +1 -1
- package/dist/types/src/Obj.d.ts +344 -35
- 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 +115 -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 +13 -11
- package/dist/types/src/Ref.d.ts.map +1 -1
- package/dist/types/src/Relation.d.ts +242 -19
- 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 +17 -0
- package/dist/types/src/Tag.d.ts.map +1 -0
- package/dist/types/src/Type.d.ts +225 -73
- 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/index.d.ts +15 -3
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/internal/annotations/annotations.d.ts +170 -0
- package/dist/types/src/internal/annotations/annotations.d.ts.map +1 -0
- package/dist/types/src/internal/annotations/annotations.test.d.ts +2 -0
- package/dist/types/src/internal/annotations/annotations.test.d.ts.map +1 -0
- package/dist/types/src/internal/annotations/index.d.ts +3 -0
- package/dist/types/src/internal/annotations/index.d.ts.map +1 -0
- package/dist/types/src/internal/annotations/util.d.ts +27 -0
- package/dist/types/src/internal/annotations/util.d.ts.map +1 -0
- package/dist/types/src/internal/api/annotations.d.ts +23 -0
- package/dist/types/src/internal/api/annotations.d.ts.map +1 -0
- package/dist/types/src/internal/api/entity.d.ts +13 -0
- package/dist/types/src/internal/api/entity.d.ts.map +1 -0
- package/dist/types/src/internal/api/index.d.ts +15 -0
- package/dist/types/src/internal/api/index.d.ts.map +1 -0
- package/dist/types/src/internal/api/meta.d.ts +42 -0
- package/dist/types/src/internal/api/meta.d.ts.map +1 -0
- package/dist/types/src/internal/api/sorting.d.ts +24 -0
- package/dist/types/src/internal/api/sorting.d.ts.map +1 -0
- package/dist/types/src/internal/api/version.d.ts +42 -0
- package/dist/types/src/internal/api/version.d.ts.map +1 -0
- package/dist/types/src/internal/entities/entity.d.ts +20 -0
- package/dist/types/src/internal/entities/entity.d.ts.map +1 -0
- package/dist/types/src/internal/entities/index.d.ts +6 -0
- package/dist/types/src/internal/entities/index.d.ts.map +1 -0
- package/dist/types/src/internal/entities/model.d.ts +77 -0
- package/dist/types/src/internal/entities/model.d.ts.map +1 -0
- package/dist/types/src/internal/entities/object.d.ts +18 -0
- package/dist/types/src/internal/entities/object.d.ts.map +1 -0
- package/dist/types/src/internal/entities/relation.d.ts +62 -0
- package/dist/types/src/internal/entities/relation.d.ts.map +1 -0
- package/dist/types/src/internal/entities/util.d.ts +2 -0
- package/dist/types/src/internal/entities/util.d.ts.map +1 -0
- package/dist/types/src/internal/formats/date.d.ts +63 -0
- package/dist/types/src/internal/formats/date.d.ts.map +1 -0
- package/dist/types/src/internal/formats/date.test.d.ts +2 -0
- package/dist/types/src/internal/formats/date.test.d.ts.map +1 -0
- package/dist/types/src/internal/formats/format.d.ts +32 -0
- package/dist/types/src/internal/formats/format.d.ts.map +1 -0
- package/dist/types/src/internal/formats/format.test.d.ts +2 -0
- package/dist/types/src/internal/formats/format.test.d.ts.map +1 -0
- package/dist/types/src/internal/formats/index.d.ts +8 -0
- package/dist/types/src/internal/formats/index.d.ts.map +1 -0
- package/dist/types/src/internal/formats/number.d.ts +31 -0
- package/dist/types/src/internal/formats/number.d.ts.map +1 -0
- package/dist/types/src/internal/formats/object.d.ts +35 -0
- package/dist/types/src/internal/formats/object.d.ts.map +1 -0
- package/dist/types/src/internal/formats/select.d.ts +13 -0
- package/dist/types/src/internal/formats/select.d.ts.map +1 -0
- package/dist/types/src/internal/formats/string.d.ts +42 -0
- package/dist/types/src/internal/formats/string.d.ts.map +1 -0
- package/dist/types/src/internal/formats/types.d.ts +72 -0
- package/dist/types/src/internal/formats/types.d.ts.map +1 -0
- package/dist/types/src/internal/index.d.ts +12 -0
- package/dist/types/src/internal/index.d.ts.map +1 -0
- package/dist/types/src/internal/json-schema/annotations.d.ts +19 -0
- package/dist/types/src/internal/json-schema/annotations.d.ts.map +1 -0
- package/dist/types/src/internal/json-schema/effect-schema.test.d.ts +2 -0
- package/dist/types/src/internal/json-schema/effect-schema.test.d.ts.map +1 -0
- package/dist/types/src/internal/json-schema/index.d.ts +5 -0
- package/dist/types/src/internal/json-schema/index.d.ts.map +1 -0
- package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts +7 -0
- package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts.map +1 -0
- package/dist/types/src/internal/json-schema/json-schema-type.d.ts +351 -0
- package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +1 -0
- package/dist/types/src/internal/json-schema/json-schema.d.ts +30 -0
- package/dist/types/src/internal/json-schema/json-schema.d.ts.map +1 -0
- package/dist/types/src/internal/json-schema/json-schema.test.d.ts +2 -0
- package/dist/types/src/internal/json-schema/json-schema.test.d.ts.map +1 -0
- package/dist/types/src/internal/object/clone.d.ts +8 -0
- package/dist/types/src/internal/object/clone.d.ts.map +1 -0
- package/dist/types/src/internal/object/common.d.ts +18 -0
- package/dist/types/src/internal/object/common.d.ts.map +1 -0
- package/dist/types/src/internal/object/create-object.d.ts +39 -0
- package/dist/types/src/internal/object/create-object.d.ts.map +1 -0
- package/dist/types/src/internal/object/create-object.test.d.ts +2 -0
- package/dist/types/src/internal/object/create-object.test.d.ts.map +1 -0
- package/dist/types/src/internal/object/deleted.d.ts +6 -0
- package/dist/types/src/internal/object/deleted.d.ts.map +1 -0
- package/dist/types/src/internal/object/ids.d.ts +6 -0
- package/dist/types/src/internal/object/ids.d.ts.map +1 -0
- package/dist/types/src/internal/object/index.d.ts +11 -0
- package/dist/types/src/internal/object/index.d.ts.map +1 -0
- package/dist/types/src/internal/object/inspect.d.ts +2 -0
- package/dist/types/src/internal/object/inspect.d.ts.map +1 -0
- package/dist/types/src/internal/object/json-serializer.d.ts +37 -0
- package/dist/types/src/internal/object/json-serializer.d.ts.map +1 -0
- package/dist/types/src/internal/object/json-serializer.test.d.ts +2 -0
- package/dist/types/src/internal/object/json-serializer.test.d.ts.map +1 -0
- package/dist/types/src/internal/object/schema-validator.d.ts +2 -0
- package/dist/types/src/internal/object/schema-validator.d.ts.map +1 -0
- package/dist/types/src/internal/object/schema-validator.test.d.ts +2 -0
- package/dist/types/src/internal/object/schema-validator.test.d.ts.map +1 -0
- package/dist/types/src/internal/object/set-value.d.ts +7 -0
- package/dist/types/src/internal/object/set-value.d.ts.map +1 -0
- package/dist/types/src/internal/object/set-value.test.d.ts +2 -0
- package/dist/types/src/internal/object/set-value.test.d.ts.map +1 -0
- package/dist/types/src/internal/object/snapshot.d.ts +6 -0
- package/dist/types/src/internal/object/snapshot.d.ts.map +1 -0
- package/dist/types/src/internal/object/typed-object.d.ts +25 -0
- package/dist/types/src/internal/object/typed-object.d.ts.map +1 -0
- package/dist/types/src/internal/object/typed-object.test.d.ts +2 -0
- package/dist/types/src/internal/object/typed-object.test.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/change-context.d.ts +55 -0
- package/dist/types/src/internal/proxy/change-context.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/change.test.d.ts +2 -0
- package/dist/types/src/internal/proxy/change.test.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/define-hidden-property.d.ts +5 -0
- package/dist/types/src/internal/proxy/define-hidden-property.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/errors.d.ts +19 -0
- package/dist/types/src/internal/proxy/errors.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/event-batch.d.ts +10 -0
- package/dist/types/src/internal/proxy/event-batch.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/handler.test.d.ts +2 -0
- package/dist/types/src/internal/proxy/handler.test.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/index.d.ts +14 -0
- package/dist/types/src/internal/proxy/index.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/json-serializer.d.ts +6 -0
- package/dist/types/src/internal/proxy/json-serializer.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/make-object.d.ts +14 -0
- package/dist/types/src/internal/proxy/make-object.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/ownership.d.ts +57 -0
- package/dist/types/src/internal/proxy/ownership.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/proxy-types.d.ts +18 -0
- package/dist/types/src/internal/proxy/proxy-types.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/proxy-utils.d.ts +47 -0
- package/dist/types/src/internal/proxy/proxy-utils.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/reactive-array.d.ts +8 -0
- package/dist/types/src/internal/proxy/reactive-array.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/reactive.d.ts +39 -0
- package/dist/types/src/internal/proxy/reactive.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/schema-validator.d.ts +15 -0
- package/dist/types/src/internal/proxy/schema-validator.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/schema.test.d.ts +2 -0
- package/dist/types/src/internal/proxy/schema.test.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/symbols.d.ts +3 -0
- package/dist/types/src/internal/proxy/symbols.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/typed-handler.d.ts +47 -0
- package/dist/types/src/internal/proxy/typed-handler.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/typed-handler.test.d.ts +2 -0
- package/dist/types/src/internal/proxy/typed-handler.test.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/typed-object.test.d.ts +2 -0
- package/dist/types/src/internal/proxy/typed-object.test.d.ts.map +1 -0
- package/dist/types/src/internal/ref/index.d.ts +3 -0
- package/dist/types/src/internal/ref/index.d.ts.map +1 -0
- package/dist/types/src/internal/ref/ref-array.d.ts +21 -0
- package/dist/types/src/internal/ref/ref-array.d.ts.map +1 -0
- package/dist/types/src/internal/ref/ref.d.ts +218 -0
- package/dist/types/src/internal/ref/ref.d.ts.map +1 -0
- package/dist/types/src/internal/ref/ref.test.d.ts +2 -0
- package/dist/types/src/internal/ref/ref.test.d.ts.map +1 -0
- package/dist/types/src/internal/schema/compose.d.ts +7 -0
- package/dist/types/src/internal/schema/compose.d.ts.map +1 -0
- package/dist/types/src/internal/schema/compose.test.d.ts +2 -0
- package/dist/types/src/internal/schema/compose.test.d.ts.map +1 -0
- package/dist/types/src/internal/schema/echo-schema.d.ts +180 -0
- package/dist/types/src/internal/schema/echo-schema.d.ts.map +1 -0
- package/dist/types/src/internal/schema/index.d.ts +4 -0
- package/dist/types/src/internal/schema/index.d.ts.map +1 -0
- package/dist/types/src/internal/schema/manipulation.d.ts +10 -0
- package/dist/types/src/internal/schema/manipulation.d.ts.map +1 -0
- package/dist/types/src/internal/schema/persistent-schema.d.ts +20 -0
- package/dist/types/src/internal/schema/persistent-schema.d.ts.map +1 -0
- package/dist/types/src/internal/types/base.d.ts +26 -0
- package/dist/types/src/internal/types/base.d.ts.map +1 -0
- package/dist/types/src/internal/types/entity.d.ts +37 -0
- package/dist/types/src/internal/types/entity.d.ts.map +1 -0
- package/dist/types/src/internal/types/index.d.ts +6 -0
- package/dist/types/src/internal/types/index.d.ts.map +1 -0
- package/dist/types/src/internal/types/meta.d.ts +32 -0
- package/dist/types/src/internal/types/meta.d.ts.map +1 -0
- package/dist/types/src/internal/types/typename.d.ts +13 -0
- package/dist/types/src/internal/types/typename.d.ts.map +1 -0
- package/dist/types/src/internal/types/version.d.ts +15 -0
- package/dist/types/src/internal/types/version.d.ts.map +1 -0
- package/dist/types/src/{test → testing}/api.test.d.ts.map +1 -1
- package/dist/types/src/testing/index.d.ts +3 -1
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/testing/test-data.d.ts +18 -0
- package/dist/types/src/testing/test-data.d.ts.map +1 -0
- package/dist/types/src/testing/test-schema.d.ts +303 -0
- package/dist/types/src/testing/test-schema.d.ts.map +1 -0
- package/dist/types/src/testing/util.d.ts +21 -0
- package/dist/types/src/testing/util.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +169 -42
- package/src/Annotation.ts +18 -0
- package/src/Database.ts +336 -0
- package/src/Entity.test.ts +22 -0
- package/src/Entity.ts +217 -0
- package/src/Err.ts +18 -0
- package/src/Filter.ts +376 -0
- package/src/Format.ts +9 -0
- package/src/Hypergraph.ts +74 -0
- package/src/JsonSchema.ts +16 -0
- package/src/Key.ts +3 -0
- package/src/Obj.test.ts +386 -0
- package/src/Obj.ts +508 -84
- package/src/Order.ts +44 -0
- package/src/Query.test.ts +465 -0
- package/src/Query.ts +296 -0
- package/src/QueryResult.ts +106 -0
- package/src/Ref.ts +25 -9
- package/src/Relation.test.ts +82 -0
- package/src/Relation.ts +414 -51
- package/src/SchemaRegistry.ts +105 -0
- package/src/Tag.ts +40 -0
- package/src/Type.test.ts +52 -0
- package/src/Type.ts +360 -112
- package/src/index.ts +17 -4
- package/src/internal/README.md +102 -0
- package/src/internal/annotations/annotations.test.ts +96 -0
- package/src/internal/annotations/annotations.ts +460 -0
- package/src/internal/annotations/index.ts +6 -0
- package/src/internal/annotations/util.ts +72 -0
- package/src/internal/api/annotations.ts +60 -0
- package/src/internal/api/entity.ts +29 -0
- package/src/internal/api/index.ts +19 -0
- package/src/internal/api/meta.ts +88 -0
- package/src/internal/api/sorting.ts +53 -0
- package/src/internal/api/version.ts +96 -0
- package/src/internal/entities/entity.ts +126 -0
- package/src/internal/entities/index.ts +9 -0
- package/src/internal/entities/model.ts +134 -0
- package/src/internal/entities/object.ts +58 -0
- package/src/internal/entities/relation.ts +171 -0
- package/src/internal/entities/util.ts +33 -0
- package/src/internal/formats/date.test.ts +56 -0
- package/src/internal/formats/date.ts +217 -0
- package/src/internal/formats/format.test.ts +77 -0
- package/src/internal/formats/format.ts +54 -0
- package/src/internal/formats/index.ts +12 -0
- package/src/internal/formats/number.ts +89 -0
- package/src/internal/formats/object.ts +80 -0
- package/src/internal/formats/select.ts +18 -0
- package/src/internal/formats/string.ts +81 -0
- package/src/internal/formats/types.ts +186 -0
- package/src/internal/index.ts +39 -0
- package/src/internal/json-schema/annotations.ts +50 -0
- package/src/internal/json-schema/effect-schema.test.ts +143 -0
- package/src/internal/json-schema/index.ts +8 -0
- package/src/internal/json-schema/json-schema-normalize.ts +111 -0
- package/src/internal/json-schema/json-schema-type.ts +403 -0
- package/src/internal/json-schema/json-schema.test.ts +861 -0
- package/src/internal/json-schema/json-schema.ts +532 -0
- package/src/internal/object/clone.ts +48 -0
- package/src/internal/object/common.ts +75 -0
- package/src/internal/object/create-object.test.ts +116 -0
- package/src/internal/object/create-object.ts +95 -0
- package/src/internal/object/deleted.ts +19 -0
- package/src/internal/object/ids.ts +12 -0
- package/src/internal/object/index.ts +14 -0
- package/src/internal/object/inspect.ts +46 -0
- package/src/internal/object/json-serializer.test.ts +98 -0
- package/src/internal/object/json-serializer.ts +188 -0
- package/src/internal/object/schema-validator.test.ts +182 -0
- package/src/internal/object/schema-validator.ts +6 -0
- package/src/internal/object/set-value.test.ts +281 -0
- package/src/internal/object/set-value.ts +165 -0
- package/src/internal/object/snapshot.ts +70 -0
- package/src/internal/object/typed-object.test.ts +34 -0
- package/src/internal/object/typed-object.ts +30 -0
- package/src/internal/proxy/change-context.ts +138 -0
- package/src/internal/proxy/change.test.ts +519 -0
- package/src/internal/proxy/define-hidden-property.ts +14 -0
- package/src/internal/proxy/errors.ts +42 -0
- package/src/internal/proxy/event-batch.ts +44 -0
- package/src/internal/proxy/handler.test.ts +123 -0
- package/src/internal/proxy/index.ts +17 -0
- package/src/internal/proxy/json-serializer.ts +87 -0
- package/src/internal/proxy/make-object.ts +96 -0
- package/src/internal/proxy/ownership.ts +253 -0
- package/src/internal/proxy/proxy-types.ts +23 -0
- package/src/internal/proxy/proxy-utils.ts +150 -0
- package/src/internal/proxy/reactive-array.ts +71 -0
- package/src/internal/proxy/reactive.ts +69 -0
- package/src/internal/proxy/schema-validator.ts +244 -0
- package/src/internal/proxy/schema.test.ts +145 -0
- package/src/internal/proxy/symbols.ts +7 -0
- package/src/internal/proxy/typed-handler.test.ts +314 -0
- package/src/internal/proxy/typed-handler.ts +442 -0
- package/src/internal/proxy/typed-object.test.ts +116 -0
- package/src/internal/ref/index.ts +6 -0
- package/src/internal/ref/ref-array.ts +39 -0
- package/src/internal/ref/ref.test.ts +101 -0
- package/src/internal/ref/ref.ts +549 -0
- package/src/internal/schema/compose.test.ts +42 -0
- package/src/internal/schema/compose.ts +41 -0
- package/src/internal/schema/echo-schema.ts +423 -0
- package/src/internal/schema/index.ts +7 -0
- package/src/internal/schema/manipulation.ts +92 -0
- package/src/internal/schema/persistent-schema.ts +27 -0
- package/src/internal/types/base.ts +43 -0
- package/src/internal/types/entity.ts +54 -0
- package/src/internal/types/index.ts +9 -0
- package/src/internal/types/meta.ts +65 -0
- package/src/internal/types/typename.ts +45 -0
- package/src/internal/types/version.ts +20 -0
- package/src/testing/api.test.ts +126 -0
- package/src/testing/index.ts +3 -1
- package/src/testing/test-data.ts +130 -0
- package/src/testing/test-schema.ts +238 -0
- package/src/testing/util.ts +85 -0
- package/dist/lib/browser/chunk-EUA7CM23.mjs +0 -619
- package/dist/lib/browser/chunk-EUA7CM23.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-IV6BWGHK.mjs +0 -619
- package/dist/lib/node-esm/chunk-IV6BWGHK.mjs.map +0 -7
- package/dist/types/src/experimental/database.d.ts +0 -8
- package/dist/types/src/experimental/database.d.ts.map +0 -1
- package/dist/types/src/experimental/index.d.ts +0 -1
- package/dist/types/src/experimental/index.d.ts.map +0 -1
- package/dist/types/src/experimental/queue.d.ts +0 -8
- package/dist/types/src/experimental/queue.d.ts.map +0 -1
- package/dist/types/src/experimental/space.d.ts +0 -8
- package/dist/types/src/experimental/space.d.ts.map +0 -1
- package/dist/types/src/query/dsl.d.ts +0 -218
- package/dist/types/src/query/dsl.d.ts.map +0 -1
- package/dist/types/src/query/dsl.test.d.ts +0 -2
- package/dist/types/src/query/dsl.test.d.ts.map +0 -1
- package/dist/types/src/query/index.d.ts +0 -2
- package/dist/types/src/query/index.d.ts.map +0 -1
- package/dist/types/src/testing/types.d.ts +0 -113
- package/dist/types/src/testing/types.d.ts.map +0 -1
- package/src/experimental/database.ts +0 -11
- package/src/experimental/index.ts +0 -7
- package/src/experimental/queue.ts +0 -11
- package/src/experimental/space.ts +0 -11
- package/src/query/dsl.test.ts +0 -323
- package/src/query/dsl.ts +0 -646
- package/src/query/index.ts +0 -5
- package/src/test/api.test.ts +0 -173
- package/src/testing/types.ts +0 -91
- /package/dist/types/src/{test → testing}/api.test.d.ts +0 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { inspect } from 'node:util';
|
|
6
|
+
|
|
7
|
+
import { describe, expect, test } from 'vitest';
|
|
8
|
+
|
|
9
|
+
import { isNode } from '@dxos/util';
|
|
10
|
+
|
|
11
|
+
import { TestSchema, updateCounter } from '../../testing';
|
|
12
|
+
import { createObject } from '../object';
|
|
13
|
+
import { ATTR_META } from '../types';
|
|
14
|
+
|
|
15
|
+
import { makeObject } from './make-object';
|
|
16
|
+
import { objectData } from './proxy-types';
|
|
17
|
+
import { change } from './reactive';
|
|
18
|
+
|
|
19
|
+
describe('proxy', () => {
|
|
20
|
+
test.skipIf(!isNode())('inspect', ({ expect }) => {
|
|
21
|
+
const obj = createObject(TestSchema.Message, { timestamp: new Date().toISOString() });
|
|
22
|
+
const str = inspect(obj, { colors: true });
|
|
23
|
+
expect(str).to.exist;
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const TEST_OBJECT: TestSchema.ExampleSchema = {
|
|
28
|
+
string: 'foo',
|
|
29
|
+
number: 42,
|
|
30
|
+
boolean: true,
|
|
31
|
+
null: null,
|
|
32
|
+
stringArray: ['1', '2', '3'],
|
|
33
|
+
nested: {
|
|
34
|
+
field: 'bar',
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
// Schema is now required for reactive objects.
|
|
39
|
+
{
|
|
40
|
+
const createObject = (props: Partial<TestSchema.ExampleSchema> = {}): TestSchema.ExampleSchema => {
|
|
41
|
+
return makeObject(TestSchema.ExampleSchema, props);
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
describe('Non-echo specific proxy properties with schema', () => {
|
|
45
|
+
test.skipIf(!isNode())('inspect', () => {
|
|
46
|
+
const obj = createObject({ string: 'bar' });
|
|
47
|
+
const str = inspect(obj, { colors: false });
|
|
48
|
+
expect(str).to.eq("Typed { string: 'bar' }");
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test('data symbol', async () => {
|
|
52
|
+
const obj = createObject({ ...TEST_OBJECT });
|
|
53
|
+
const objData: any = (obj as any)[objectData];
|
|
54
|
+
expect(objData).to.deep.contain({
|
|
55
|
+
'@type': 'TypedReactiveObject',
|
|
56
|
+
...TEST_OBJECT,
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
// TODO(wittjosiah): Should we prevent this?
|
|
61
|
+
test('can assign class instances', () => {
|
|
62
|
+
const obj = createObject();
|
|
63
|
+
|
|
64
|
+
const classInstance = new TestSchema.TestClass();
|
|
65
|
+
change(obj, (o) => {
|
|
66
|
+
o.classInstance = classInstance;
|
|
67
|
+
});
|
|
68
|
+
expect(obj.classInstance!.field).to.eq('value');
|
|
69
|
+
expect(obj.classInstance instanceof TestSchema.TestClass).to.eq(true);
|
|
70
|
+
expect(obj.classInstance === classInstance).to.be.true;
|
|
71
|
+
|
|
72
|
+
// Class instances are not wrapped in proxies, so direct mutation works.
|
|
73
|
+
obj.classInstance!.field = 'baz';
|
|
74
|
+
expect(obj.classInstance!.field).to.eq('baz');
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
describe('class instance equality', () => {
|
|
78
|
+
test('toJSON', () => {
|
|
79
|
+
const original = { classInstance: new TestSchema.TestClass() };
|
|
80
|
+
const reactive = createObject(original);
|
|
81
|
+
expect(JSON.stringify(reactive)).to.eq(
|
|
82
|
+
JSON.stringify({
|
|
83
|
+
[ATTR_META]: {
|
|
84
|
+
keys: [],
|
|
85
|
+
},
|
|
86
|
+
...original,
|
|
87
|
+
}),
|
|
88
|
+
);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test('chai deep equal works', () => {
|
|
92
|
+
const original = { classInstance: new TestSchema.TestClass() };
|
|
93
|
+
const reactive = createObject(original);
|
|
94
|
+
expect(reactive).to.deep.eq(original);
|
|
95
|
+
expect(reactive).to.not.deep.eq({ ...original, number: 11 });
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
test('jest deep equal works', () => {
|
|
99
|
+
const original = { classInstance: new TestSchema.TestClass() };
|
|
100
|
+
const reactive = createObject(original);
|
|
101
|
+
expect(reactive).toEqual(original);
|
|
102
|
+
expect(reactive).not.toEqual({ ...original, number: 11 });
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
describe('subscription updates', () => {
|
|
107
|
+
test('not triggered by nested class instance changes', () => {
|
|
108
|
+
const obj = createObject({ classInstance: new TestSchema.TestClass() });
|
|
109
|
+
using updates = updateCounter(obj);
|
|
110
|
+
expect(updates.count, 'update count').to.eq(0);
|
|
111
|
+
|
|
112
|
+
// Changes to class instance fields don't trigger subscription updates
|
|
113
|
+
// because class instances aren't wrapped in live proxies.
|
|
114
|
+
obj.classInstance!.field = 'baz';
|
|
115
|
+
expect(updates.count, 'update count').to.eq(0);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// NOTE: Getter tests with external variable references were removed.
|
|
122
|
+
// These patterns only worked with untyped reactive objects, which are no longer supported.
|
|
123
|
+
// For typed schemas, getters should be defined in the schema itself.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
export * from './change-context';
|
|
6
|
+
export * from './define-hidden-property';
|
|
7
|
+
export * from './errors';
|
|
8
|
+
export * from './event-batch';
|
|
9
|
+
export * from './json-serializer';
|
|
10
|
+
export * from './make-object';
|
|
11
|
+
export * from './proxy-types';
|
|
12
|
+
export * from './proxy-utils';
|
|
13
|
+
export * from './reactive';
|
|
14
|
+
export * from './reactive-array';
|
|
15
|
+
export * from './schema-validator';
|
|
16
|
+
export * from './symbols';
|
|
17
|
+
export * from './typed-handler';
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type ObjectMeta } from '@dxos/echo-protocol';
|
|
6
|
+
import { invariant } from '@dxos/invariant';
|
|
7
|
+
import { DXN } from '@dxos/keys';
|
|
8
|
+
import { deepMapValues } from '@dxos/util';
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
ATTR_RELATION_SOURCE,
|
|
12
|
+
ATTR_RELATION_TARGET,
|
|
13
|
+
ATTR_SELF_DXN,
|
|
14
|
+
RelationSourceDXNId,
|
|
15
|
+
RelationTargetDXNId,
|
|
16
|
+
SelfDXNId,
|
|
17
|
+
} from '../entities';
|
|
18
|
+
import { Ref } from '../ref';
|
|
19
|
+
import { ATTR_META, ATTR_TYPE, MetaId, TypeId } from '../types';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Attaches a toJSON method to the object for typed serialization.
|
|
23
|
+
*/
|
|
24
|
+
export const attachTypedJsonSerializer = (obj: any) => {
|
|
25
|
+
const descriptor = Object.getOwnPropertyDescriptor(obj, 'toJSON');
|
|
26
|
+
if (descriptor) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
Object.defineProperty(obj, 'toJSON', {
|
|
31
|
+
value: typedJsonSerializer,
|
|
32
|
+
writable: false,
|
|
33
|
+
enumerable: false,
|
|
34
|
+
// Setting `configurable` to false breaks proxy invariants, should be fixable.
|
|
35
|
+
configurable: true,
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// NOTE: KEEP as function.
|
|
40
|
+
// Exported for use in objectToJSON.
|
|
41
|
+
export const typedJsonSerializer = function (this: any) {
|
|
42
|
+
const { id, ...rest } = this;
|
|
43
|
+
const result: any = {
|
|
44
|
+
id,
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
if (this[TypeId]) {
|
|
48
|
+
result[ATTR_TYPE] = this[TypeId].toString();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (this[MetaId]) {
|
|
52
|
+
result[ATTR_META] = serializeMeta(this[MetaId]);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (this[SelfDXNId]) {
|
|
56
|
+
result[ATTR_SELF_DXN] = this[SelfDXNId].toString();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (this[RelationSourceDXNId]) {
|
|
60
|
+
const sourceDXN = this[RelationSourceDXNId];
|
|
61
|
+
invariant(sourceDXN instanceof DXN);
|
|
62
|
+
result[ATTR_RELATION_SOURCE] = sourceDXN.toString();
|
|
63
|
+
}
|
|
64
|
+
if (this[RelationTargetDXNId]) {
|
|
65
|
+
const targetDXN = this[RelationTargetDXNId];
|
|
66
|
+
invariant(targetDXN instanceof DXN);
|
|
67
|
+
result[ATTR_RELATION_TARGET] = targetDXN.toString();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
Object.assign(result, serializeData(rest));
|
|
71
|
+
return result;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const serializeData = (data: unknown) => {
|
|
75
|
+
return deepMapValues(data, (value, recurse) => {
|
|
76
|
+
if (Ref.isRef(value)) {
|
|
77
|
+
// TODO(dmaretskyi): Should this be configurable?
|
|
78
|
+
return value.noInline().encode();
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return recurse(value);
|
|
82
|
+
});
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const serializeMeta = (meta: ObjectMeta) => {
|
|
86
|
+
return deepMapValues(meta, (value, recurse) => recurse(value));
|
|
87
|
+
};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import type * as Schema from 'effect/Schema';
|
|
6
|
+
|
|
7
|
+
import { ObjectId } from '@dxos/keys';
|
|
8
|
+
|
|
9
|
+
import { getTypeAnnotation } from '../annotations';
|
|
10
|
+
import { type AnyProperties, KindId, MetaId, type ObjectMeta, ObjectMetaSchema } from '../types';
|
|
11
|
+
|
|
12
|
+
import { defineHiddenProperty } from './define-hidden-property';
|
|
13
|
+
import { attachTypedJsonSerializer } from './json-serializer';
|
|
14
|
+
import { createProxy, getProxyTarget, isValidProxyTarget } from './proxy-utils';
|
|
15
|
+
import { TypedReactiveHandler, prepareTypedTarget, setMetaOwner } from './typed-handler';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
*
|
|
19
|
+
*/
|
|
20
|
+
// TODO(burdon): Make internal
|
|
21
|
+
export type MakeObjectProps<T extends AnyProperties> = Omit<T, 'id' | KindId>;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Creates a reactive object from a plain Javascript object.
|
|
25
|
+
* Requires a TS-effect schema.
|
|
26
|
+
*/
|
|
27
|
+
// TODO(burdon): Make internal
|
|
28
|
+
// TODO(dmaretskyi): Deep mutability.
|
|
29
|
+
// TODO(dmaretskyi): Invert generics (generic over schema) to have better error messages.
|
|
30
|
+
// TODO(dmaretskyi): Could mutate original object making it unusable.
|
|
31
|
+
export const makeObject: {
|
|
32
|
+
<T extends AnyProperties>(
|
|
33
|
+
schema: Schema.Schema<T, any, never>,
|
|
34
|
+
obj: NoInfer<MakeObjectProps<T>>,
|
|
35
|
+
meta?: ObjectMeta,
|
|
36
|
+
): T;
|
|
37
|
+
} = <T extends AnyProperties>(schema: Schema.Schema<T, any>, obj: MakeObjectProps<T>, meta?: ObjectMeta): T => {
|
|
38
|
+
return createReactiveObject<T>({ ...obj } as T, meta, schema);
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const createReactiveObject = <T extends AnyProperties>(obj: T, meta?: ObjectMeta, schema?: Schema.Schema<T>): T => {
|
|
42
|
+
if (!isValidProxyTarget(obj)) {
|
|
43
|
+
throw new Error('Value cannot be made into a reactive object.');
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (!schema) {
|
|
47
|
+
throw new Error('Schema is required for reactive objects. Use Atom for untyped reactive state.');
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const annotation = getTypeAnnotation(schema);
|
|
51
|
+
if (annotation) {
|
|
52
|
+
setIdOnTarget(obj);
|
|
53
|
+
defineHiddenProperty(obj, KindId, annotation.kind);
|
|
54
|
+
}
|
|
55
|
+
initMeta(obj, meta);
|
|
56
|
+
prepareTypedTarget(obj, schema);
|
|
57
|
+
attachTypedJsonSerializer(obj);
|
|
58
|
+
const proxy = createProxy<T>(obj, TypedReactiveHandler.instance);
|
|
59
|
+
|
|
60
|
+
// Set meta's owner to the main object so meta mutations respect the parent's change context.
|
|
61
|
+
// For non-database objects using TypedReactiveHandler, this links the meta to the main object's
|
|
62
|
+
// change context. For database objects, meta is handled by EchoReactiveHandler.getMeta().
|
|
63
|
+
const metaProxy = (obj as any)[MetaId];
|
|
64
|
+
if (metaProxy) {
|
|
65
|
+
const metaTarget = getProxyTarget(metaProxy);
|
|
66
|
+
if (metaTarget) {
|
|
67
|
+
setMetaOwner(metaTarget, obj);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return proxy;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Set ID on ECHO object targets during creation.
|
|
76
|
+
* Used for objects with schema and the ones explicitly marked as Expando.
|
|
77
|
+
*/
|
|
78
|
+
const setIdOnTarget = (target: any) => {
|
|
79
|
+
// invariant(!('id' in target), 'Object already has an `id` field, which is reserved.');
|
|
80
|
+
if ('id' in target && target.id !== undefined && target.id !== null) {
|
|
81
|
+
if (!ObjectId.isValid(target.id)) {
|
|
82
|
+
throw new Error('Invalid object id format.');
|
|
83
|
+
}
|
|
84
|
+
} else {
|
|
85
|
+
target.id = ObjectId.random();
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Set metadata on object.
|
|
91
|
+
*/
|
|
92
|
+
// TODO(dmaretskyi): Move to echo-schema.
|
|
93
|
+
const initMeta = <T>(obj: T, meta: ObjectMeta = { keys: [] }) => {
|
|
94
|
+
prepareTypedTarget(meta, ObjectMetaSchema);
|
|
95
|
+
defineHiddenProperty(obj, MetaId, createProxy(meta, TypedReactiveHandler.instance as any));
|
|
96
|
+
};
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { invariant } from '@dxos/invariant';
|
|
6
|
+
|
|
7
|
+
import { KindId } from '../types';
|
|
8
|
+
|
|
9
|
+
import { queueOwnerNotification } from './change-context';
|
|
10
|
+
import { defineHiddenProperty } from './define-hidden-property';
|
|
11
|
+
import { getProxyTarget, isProxy, isValidProxyTarget } from './proxy-utils';
|
|
12
|
+
import { EventId } from './symbols';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Symbol to store the owning ECHO object reference on nested JS objects (records).
|
|
16
|
+
* Every nested record is attributed to exactly one ECHO object.
|
|
17
|
+
* This achieves:
|
|
18
|
+
* - No cycles in the object graph (cyclical Refs are still allowed).
|
|
19
|
+
* - No multiple inbound pointers to one record.
|
|
20
|
+
* - Centralized reactivity for entire ECHO object.
|
|
21
|
+
*/
|
|
22
|
+
const EchoOwner = Symbol.for('@dxos/echo/Owner');
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Get the raw target from a value, unwrapping proxy if needed.
|
|
26
|
+
*/
|
|
27
|
+
export const getRawTarget = (value: any): any => {
|
|
28
|
+
return isProxy(value) ? getProxyTarget(value) : value;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Get the ECHO object that owns this nested record.
|
|
33
|
+
*
|
|
34
|
+
* The owner is always the raw target object (not a proxy) of the root ECHO object.
|
|
35
|
+
* For example, if you have `echoObject.nested.deep`, both `nested` and `deep`
|
|
36
|
+
* will have their owner set to the raw target of `echoObject`.
|
|
37
|
+
*
|
|
38
|
+
* @param value - The nested record to check (can be a proxy or raw target).
|
|
39
|
+
* @returns The raw target of the owning root ECHO object, or undefined if not owned.
|
|
40
|
+
*/
|
|
41
|
+
export const getOwner = (value: object | null | undefined): object | undefined => {
|
|
42
|
+
return (value as any)?.[EchoOwner];
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Set the owner of a meta object to its parent.
|
|
47
|
+
* This allows meta mutations to respect the parent's change context.
|
|
48
|
+
* @internal
|
|
49
|
+
*/
|
|
50
|
+
export const setMetaOwner = (metaTarget: object, parent: object): void => {
|
|
51
|
+
defineHiddenProperty(metaTarget, EchoOwner, parent);
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Set the ECHO object owner on a value and all its nested records.
|
|
56
|
+
* All nested JS objects point directly to the root ECHO object.
|
|
57
|
+
*
|
|
58
|
+
* @param value - The value to set ownership on (can be a proxy or raw target).
|
|
59
|
+
* @param owner - The raw target of the root ECHO object that will own this value.
|
|
60
|
+
* @param options.visited - Set of already-visited objects to avoid infinite loops.
|
|
61
|
+
* @param options.depth - Current recursion depth (unused, kept for debugging).
|
|
62
|
+
* @param options.allowedPreviousOwner - When reassigning a root ECHO object, its nested structures
|
|
63
|
+
* are allowed to have this as their previous owner without triggering the invariant.
|
|
64
|
+
*/
|
|
65
|
+
export const setOwnerRecursive = (
|
|
66
|
+
value: any,
|
|
67
|
+
owner: object,
|
|
68
|
+
options: {
|
|
69
|
+
visited?: Set<object>;
|
|
70
|
+
depth?: number;
|
|
71
|
+
allowedPreviousOwner?: object;
|
|
72
|
+
} = {},
|
|
73
|
+
): void => {
|
|
74
|
+
const { visited = new Set<object>(), depth = 0, allowedPreviousOwner } = options;
|
|
75
|
+
if (value == null || typeof value !== 'object') {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const actualValue = getRawTarget(value);
|
|
80
|
+
if (visited.has(actualValue)) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
visited.add(actualValue);
|
|
84
|
+
|
|
85
|
+
// Check that we're not stealing a nested record owned by a different ECHO object.
|
|
86
|
+
// Root ECHO objects (those with EventId) can be reassigned - they maintain their own
|
|
87
|
+
// identity and choosing to embed them in another object is a valid operation.
|
|
88
|
+
// When reassigning a root, its nested records (owned by that root) are also allowed.
|
|
89
|
+
const existingOwner = getOwner(actualValue);
|
|
90
|
+
const isRootEchoObject = EventId in actualValue;
|
|
91
|
+
|
|
92
|
+
// Track if this is a root being assigned - its nested structures are allowed to transfer.
|
|
93
|
+
let newAllowedPreviousOwner = allowedPreviousOwner;
|
|
94
|
+
if (isRootEchoObject && depth === 0) {
|
|
95
|
+
// This is the top-level root being assigned; allow its nested structures to transfer.
|
|
96
|
+
newAllowedPreviousOwner = actualValue;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (!isRootEchoObject) {
|
|
100
|
+
const ownershipAllowed =
|
|
101
|
+
existingOwner == null || existingOwner === owner || existingOwner === newAllowedPreviousOwner;
|
|
102
|
+
invariant(
|
|
103
|
+
ownershipAllowed,
|
|
104
|
+
'Cannot reassign ownership of a nested record to a different ECHO object. Use deep copy first.',
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Set owner directly to the root ECHO object.
|
|
109
|
+
defineHiddenProperty(actualValue, EchoOwner, owner);
|
|
110
|
+
|
|
111
|
+
// Recursively set owner on nested objects and array elements.
|
|
112
|
+
const recursiveOptions = {
|
|
113
|
+
visited,
|
|
114
|
+
depth: depth + 1,
|
|
115
|
+
allowedPreviousOwner: newAllowedPreviousOwner,
|
|
116
|
+
};
|
|
117
|
+
if (Array.isArray(actualValue)) {
|
|
118
|
+
for (const item of actualValue) {
|
|
119
|
+
if (isValidProxyTarget(item) || isProxy(item)) {
|
|
120
|
+
setOwnerRecursive(item, owner, recursiveOptions);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
} else {
|
|
124
|
+
for (const key in actualValue) {
|
|
125
|
+
if (Object.prototype.hasOwnProperty.call(actualValue, key)) {
|
|
126
|
+
const nested = actualValue[key];
|
|
127
|
+
if (isValidProxyTarget(nested) || isProxy(nested)) {
|
|
128
|
+
setOwnerRecursive(nested, owner, recursiveOptions);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Traverse an object graph, calling the visitor on each object.
|
|
137
|
+
* Handles proxy unwrapping and cycle detection.
|
|
138
|
+
*
|
|
139
|
+
* @param value - The value to traverse (can be a proxy or raw target).
|
|
140
|
+
* @param visitor - Called for each object. Return true to stop traversal (early exit).
|
|
141
|
+
* @returns true if the visitor returns true for any object.
|
|
142
|
+
*/
|
|
143
|
+
export const traverseObjectGraph = (
|
|
144
|
+
value: any,
|
|
145
|
+
visitor: (actualValue: any) => boolean,
|
|
146
|
+
visited = new Set<object>(),
|
|
147
|
+
): boolean => {
|
|
148
|
+
if (value == null || typeof value !== 'object') {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const actualValue = getRawTarget(value);
|
|
153
|
+
|
|
154
|
+
if (visited.has(actualValue)) {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
visited.add(actualValue);
|
|
158
|
+
|
|
159
|
+
if (visitor(actualValue)) {
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (Array.isArray(actualValue)) {
|
|
164
|
+
for (const item of actualValue) {
|
|
165
|
+
if (traverseObjectGraph(item, visitor, visited)) {
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
} else {
|
|
170
|
+
for (const key in actualValue) {
|
|
171
|
+
if (Object.prototype.hasOwnProperty.call(actualValue, key)) {
|
|
172
|
+
if (traverseObjectGraph(actualValue[key], visitor, visited)) {
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return false;
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Check if a value would create a cycle when assigned to a target ECHO object.
|
|
184
|
+
* Returns true if the value (or any nested object) IS the target root.
|
|
185
|
+
*/
|
|
186
|
+
export const wouldCreateCycle = (targetRoot: object, value: any): boolean =>
|
|
187
|
+
traverseObjectGraph(value, (v) => v === targetRoot);
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Check if a value or any of its nested objects has an owner different from the target.
|
|
191
|
+
* Used to determine if deep copy is needed during init.
|
|
192
|
+
*/
|
|
193
|
+
export const hasForeignOwner = (value: any, target: object): boolean =>
|
|
194
|
+
traverseObjectGraph(value, (v) => {
|
|
195
|
+
const owner = getOwner(v);
|
|
196
|
+
if (owner != null && owner !== target) {
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
199
|
+
// Root ECHO objects (with EventId) have their nested structures owned by them.
|
|
200
|
+
if (EventId in v && v !== target) {
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
return false;
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Maximum depth for owner chain traversal.
|
|
208
|
+
* This is a defensive measure against malformed circular ownership.
|
|
209
|
+
* Primary cycle detection is handled by wouldCreateCycle() before assignment.
|
|
210
|
+
*/
|
|
211
|
+
const MAX_OWNER_DEPTH = 100;
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Get the root ECHO object for a target.
|
|
215
|
+
* Follows the owner chain to find the ultimate root.
|
|
216
|
+
* An object may have EventId (from being created standalone) but if it now
|
|
217
|
+
* has an owner, it's nested and we should use its owner's root instead.
|
|
218
|
+
* @internal
|
|
219
|
+
*/
|
|
220
|
+
export const getEchoRoot = (target: object, depth = 0): object => {
|
|
221
|
+
invariant(depth < MAX_OWNER_DEPTH, 'Owner chain too deep - possible circular ownership');
|
|
222
|
+
|
|
223
|
+
// Root ECHO objects (those created with Obj.make or Relation.make) have KindId set.
|
|
224
|
+
// They maintain their own change context identity even when nested inside another object.
|
|
225
|
+
// Nested helper objects like ObjectMeta don't have KindId and should follow their owner.
|
|
226
|
+
if (KindId in target) {
|
|
227
|
+
return target;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// For non-root objects (nested records, ObjectMeta, etc.), follow the owner chain.
|
|
231
|
+
const owner = getOwner(target);
|
|
232
|
+
if (owner) {
|
|
233
|
+
return getEchoRoot(owner, depth + 1);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// No owner means this is an unowned object (e.g., during initialization).
|
|
237
|
+
return target;
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Notify all owners in the ownership chain.
|
|
242
|
+
* When a nested object changes, its parent should also be notified.
|
|
243
|
+
* This handles the case where a root ECHO object is nested inside another object.
|
|
244
|
+
*/
|
|
245
|
+
export const notifyOwnerChain = (target: object): void => {
|
|
246
|
+
const owner = getOwner(target);
|
|
247
|
+
if (owner) {
|
|
248
|
+
// Queue notification for the owner's root (which has EventId).
|
|
249
|
+
queueOwnerNotification(getEchoRoot(owner));
|
|
250
|
+
// Continue up the chain (owner might also be nested).
|
|
251
|
+
notifyOwnerChain(owner);
|
|
252
|
+
}
|
|
253
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Reactive object proxy.
|
|
7
|
+
*/
|
|
8
|
+
export interface ReactiveHandler<T extends object> extends ProxyHandler<T> {
|
|
9
|
+
/**
|
|
10
|
+
* Target to Proxy mapping.
|
|
11
|
+
*/
|
|
12
|
+
readonly _proxyMap: WeakMap<object, any>;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Called when a proxy is created for this target.
|
|
16
|
+
*/
|
|
17
|
+
init(target: T): void;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* For debug-dumping the data of the object.
|
|
22
|
+
*/
|
|
23
|
+
export const objectData = Symbol.for('@dxos/live-object/objectData');
|