@dxos/echo 0.8.4-main.66e292d → 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 +1 -2
- 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-7GH6RXJ3.mjs → chunk-PAM4KEXE.mjs} +2005 -1841
- 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 +65 -25
- package/dist/lib/browser/internal/index.mjs +213 -92
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +80 -41
- package/dist/lib/browser/testing/index.mjs.map +3 -3
- 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-M4B6BMD2.mjs → chunk-5U5F4AWK.mjs} +2005 -1841
- 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 +65 -25
- package/dist/lib/node-esm/internal/index.mjs +213 -92
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +80 -41
- package/dist/lib/node-esm/testing/index.mjs.map +3 -3
- package/dist/types/src/Annotation.d.ts +1 -1
- package/dist/types/src/Annotation.d.ts.map +1 -1
- package/dist/types/src/Database.d.ts +117 -60
- package/dist/types/src/Database.d.ts.map +1 -1
- package/dist/types/src/Entity.d.ts +111 -5
- 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/{errors.d.ts → Err.d.ts} +13 -17
- 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.map +1 -1
- package/dist/types/src/Hypergraph.d.ts +60 -0
- package/dist/types/src/Hypergraph.d.ts.map +1 -0
- package/dist/types/src/Obj.d.ts +268 -76
- 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/query.d.ts → Query.d.ts} +53 -50
- 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 +9 -7
- package/dist/types/src/Ref.d.ts.map +1 -1
- package/dist/types/src/Relation.d.ts +235 -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 +6 -6
- package/dist/types/src/Tag.d.ts.map +1 -1
- package/dist/types/src/Type.d.ts +213 -50
- 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 +8 -2
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/internal/annotations/annotations.d.ts +23 -27
- package/dist/types/src/internal/annotations/annotations.d.ts.map +1 -1
- package/dist/types/src/internal/annotations/util.d.ts +1 -0
- package/dist/types/src/internal/annotations/util.d.ts.map +1 -1
- 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 +13 -3
- package/dist/types/src/internal/entities/entity.d.ts.map +1 -1
- package/dist/types/src/internal/entities/index.d.ts +1 -1
- package/dist/types/src/internal/entities/index.d.ts.map +1 -1
- package/dist/types/src/internal/entities/model.d.ts +14 -7
- package/dist/types/src/internal/entities/model.d.ts.map +1 -1
- package/dist/types/src/internal/entities/object.d.ts +8 -1
- package/dist/types/src/internal/entities/object.d.ts.map +1 -1
- package/dist/types/src/internal/entities/relation.d.ts +8 -1
- package/dist/types/src/internal/entities/relation.d.ts.map +1 -1
- package/dist/types/src/internal/formats/format.d.ts +4 -4
- package/dist/types/src/internal/formats/format.d.ts.map +1 -1
- package/dist/types/src/internal/formats/select.d.ts +6 -4
- package/dist/types/src/internal/formats/select.d.ts.map +1 -1
- package/dist/types/src/internal/formats/string.d.ts +4 -0
- package/dist/types/src/internal/formats/string.d.ts.map +1 -1
- package/dist/types/src/internal/formats/types.d.ts +6 -2
- package/dist/types/src/internal/formats/types.d.ts.map +1 -1
- package/dist/types/src/internal/index.d.ts +2 -1
- package/dist/types/src/internal/index.d.ts.map +1 -1
- package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts.map +1 -1
- package/dist/types/src/internal/json-schema/json-schema-type.d.ts +130 -29
- package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +1 -1
- package/dist/types/src/internal/json-schema/json-schema.d.ts +2 -1
- package/dist/types/src/internal/json-schema/json-schema.d.ts.map +1 -1
- 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/create-object.d.ts +1 -1
- package/dist/types/src/internal/object/index.d.ts +3 -0
- package/dist/types/src/internal/object/index.d.ts.map +1 -1
- package/dist/types/src/internal/object/json-serializer.d.ts +13 -7
- package/dist/types/src/internal/object/json-serializer.d.ts.map +1 -1
- package/dist/types/src/internal/object/schema-validator.d.ts +1 -14
- package/dist/types/src/internal/object/schema-validator.d.ts.map +1 -1
- 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 +7 -13
- package/dist/types/src/internal/object/typed-object.d.ts.map +1 -1
- 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/index.d.ts +11 -0
- package/dist/types/src/internal/proxy/index.d.ts.map +1 -1
- 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 +2 -4
- package/dist/types/src/internal/proxy/make-object.d.ts.map +1 -1
- 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/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 +14 -11
- package/dist/types/src/internal/proxy/typed-handler.d.ts.map +1 -1
- package/dist/types/src/internal/ref/ref-array.d.ts +4 -4
- package/dist/types/src/internal/ref/ref-array.d.ts.map +1 -1
- package/dist/types/src/internal/ref/ref.d.ts +16 -7
- package/dist/types/src/internal/ref/ref.d.ts.map +1 -1
- package/dist/types/src/internal/schema/compose.d.ts +2 -1
- package/dist/types/src/internal/schema/compose.d.ts.map +1 -1
- package/dist/types/src/internal/schema/echo-schema.d.ts +15 -3
- package/dist/types/src/internal/schema/echo-schema.d.ts.map +1 -1
- package/dist/types/src/internal/schema/index.d.ts +0 -2
- package/dist/types/src/internal/schema/index.d.ts.map +1 -1
- package/dist/types/src/internal/schema/persistent-schema.d.ts +9 -7
- package/dist/types/src/internal/schema/persistent-schema.d.ts.map +1 -1
- package/dist/types/src/internal/types/base.d.ts +5 -16
- package/dist/types/src/internal/types/base.d.ts.map +1 -1
- package/dist/types/src/internal/types/entity.d.ts +27 -2
- package/dist/types/src/internal/types/entity.d.ts.map +1 -1
- package/dist/types/src/internal/types/meta.d.ts +6 -14
- package/dist/types/src/internal/types/meta.d.ts.map +1 -1
- package/dist/types/src/testing/test-schema.d.ts +141 -175
- 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 +130 -23
- package/src/Annotation.ts +5 -4
- package/src/Database.ts +229 -82
- package/src/Entity.test.ts +22 -0
- package/src/Entity.ts +173 -7
- package/src/{errors.ts → Err.ts} +2 -2
- package/src/Filter.ts +376 -0
- package/src/Format.ts +0 -2
- package/src/Hypergraph.ts +74 -0
- package/src/Obj.test.ts +386 -0
- package/src/Obj.ts +338 -250
- package/src/{query/order.ts → Order.ts} +19 -9
- package/src/{query/query.test.ts → Query.test.ts} +180 -49
- package/src/{query/query.ts → Query.ts} +115 -122
- package/src/QueryResult.ts +106 -0
- package/src/Ref.ts +20 -3
- package/src/Relation.test.ts +82 -0
- package/src/Relation.ts +364 -27
- package/src/SchemaRegistry.ts +105 -0
- package/src/Tag.ts +1 -1
- package/src/Type.test.ts +52 -0
- package/src/Type.ts +322 -88
- package/src/index.ts +9 -5
- package/src/internal/README.md +36 -17
- package/src/internal/annotations/annotations.test.ts +6 -6
- package/src/internal/annotations/annotations.ts +73 -76
- package/src/internal/annotations/util.ts +2 -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 +36 -19
- package/src/internal/entities/index.ts +1 -1
- package/src/internal/entities/model.ts +17 -12
- package/src/internal/entities/object.ts +21 -8
- package/src/internal/entities/relation.ts +23 -7
- package/src/internal/formats/format.test.ts +1 -1
- package/src/internal/formats/format.ts +7 -8
- package/src/internal/formats/object.ts +2 -2
- package/src/internal/formats/select.ts +6 -4
- package/src/internal/formats/string.ts +5 -0
- package/src/internal/formats/types.ts +9 -3
- package/src/internal/index.ts +2 -1
- package/src/internal/json-schema/json-schema-normalize.ts +4 -2
- package/src/internal/json-schema/json-schema-type.ts +31 -32
- package/src/internal/json-schema/json-schema.test.ts +19 -17
- package/src/internal/json-schema/json-schema.ts +14 -10
- package/src/internal/object/clone.ts +48 -0
- package/src/internal/object/create-object.ts +2 -2
- package/src/internal/object/index.ts +3 -0
- package/src/internal/object/inspect.ts +3 -3
- package/src/internal/object/json-serializer.test.ts +6 -2
- package/src/internal/object/json-serializer.ts +28 -70
- package/src/internal/object/schema-validator.test.ts +3 -7
- package/src/internal/object/schema-validator.ts +2 -238
- 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 +11 -11
- package/src/internal/object/typed-object.ts +8 -72
- 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 +30 -80
- package/src/internal/proxy/index.ts +11 -0
- package/src/internal/proxy/json-serializer.ts +87 -0
- package/src/internal/proxy/make-object.ts +33 -50
- 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 +23 -15
- package/src/internal/proxy/symbols.ts +7 -0
- package/src/internal/proxy/typed-handler.test.ts +247 -35
- package/src/internal/proxy/typed-handler.ts +265 -56
- package/src/internal/proxy/typed-object.test.ts +37 -26
- package/src/internal/ref/ref-array.ts +4 -4
- package/src/internal/ref/ref.test.ts +1 -1
- package/src/internal/ref/ref.ts +64 -40
- package/src/internal/schema/compose.test.ts +3 -3
- package/src/internal/schema/compose.ts +13 -9
- package/src/internal/schema/echo-schema.ts +49 -11
- package/src/internal/schema/index.ts +0 -2
- package/src/internal/schema/persistent-schema.ts +3 -4
- package/src/internal/types/base.ts +6 -21
- package/src/internal/types/entity.ts +35 -4
- package/src/internal/types/meta.ts +13 -24
- package/src/testing/api.test.ts +31 -5
- package/src/testing/test-schema.ts +55 -30
- package/src/testing/util.ts +22 -15
- 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/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.map +0 -7
- package/dist/types/src/errors.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/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/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.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/internal/entities/expando.ts +0 -23
- package/src/internal/schema/runtime-schema-registry.ts +0 -78
- package/src/internal/schema/snapshot.ts +0 -25
- package/src/query/filter.ts +0 -455
- package/src/query/index.ts +0 -9
- package/src/query/testing.ts +0 -64
- package/src/query/types.ts +0 -23
- package/src/query/util.ts +0 -25
|
@@ -7,7 +7,7 @@ import * as Option from 'effect/Option';
|
|
|
7
7
|
import * as Schema from 'effect/Schema';
|
|
8
8
|
import * as SchemaAST from 'effect/SchemaAST';
|
|
9
9
|
|
|
10
|
-
import {
|
|
10
|
+
import { raise } from '@dxos/debug';
|
|
11
11
|
import { type JsonPath, getField } from '@dxos/effect';
|
|
12
12
|
import { assertArgument, invariant } from '@dxos/invariant';
|
|
13
13
|
import { DXN } from '@dxos/keys';
|
|
@@ -29,6 +29,10 @@ export const FIELD_PATH_ANNOTATION = 'path';
|
|
|
29
29
|
// TODO(burdon): Field, vs. path vs. property.
|
|
30
30
|
export const FieldPath = (path: string) => PropertyMeta(FIELD_PATH_ANNOTATION, path);
|
|
31
31
|
|
|
32
|
+
//
|
|
33
|
+
// Type
|
|
34
|
+
//
|
|
35
|
+
|
|
32
36
|
/**
|
|
33
37
|
* ECHO identifier (for a stored schema).
|
|
34
38
|
* Must be a `dxn:echo:` URI.
|
|
@@ -41,16 +45,56 @@ export const getTypeIdentifierAnnotation = (schema: Schema.Schema.All) =>
|
|
|
41
45
|
Option.getOrElse(() => undefined),
|
|
42
46
|
)(schema.ast);
|
|
43
47
|
|
|
48
|
+
/**
|
|
49
|
+
* @returns DXN of the schema.
|
|
50
|
+
*
|
|
51
|
+
* For non-stored schema returns `dxn:type:`.
|
|
52
|
+
* For stored schema returns `dxn:echo:`.
|
|
53
|
+
*/
|
|
54
|
+
export const getSchemaDXN = (schema: Schema.Schema.All): DXN | undefined => {
|
|
55
|
+
assertArgument(Schema.isSchema(schema), 'schema', 'invalid schema');
|
|
56
|
+
const id = getTypeIdentifierAnnotation(schema);
|
|
57
|
+
if (id) {
|
|
58
|
+
return DXN.parse(id);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// TODO(dmaretskyi): Add support for dynamic schema.
|
|
62
|
+
const objectAnnotation = getTypeAnnotation(schema);
|
|
63
|
+
if (!objectAnnotation) {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return DXN.fromTypenameAndVersion(objectAnnotation.typename, objectAnnotation.version);
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* @param input schema or a typename string.
|
|
72
|
+
* @return type DXN.
|
|
73
|
+
*/
|
|
74
|
+
export const getTypeDXNFromSpecifier = (input: Schema.Schema.All | string): DXN => {
|
|
75
|
+
if (Schema.isSchema(input)) {
|
|
76
|
+
return getSchemaDXN(input) ?? raise(new TypeError('Schema has no DXN'));
|
|
77
|
+
} else {
|
|
78
|
+
assertArgument(typeof input === 'string', 'input');
|
|
79
|
+
assertArgument(!input.startsWith('dxn:'), 'input');
|
|
80
|
+
return DXN.fromTypename(input);
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
//
|
|
85
|
+
// TypeAnnotation
|
|
86
|
+
//
|
|
87
|
+
|
|
44
88
|
/**
|
|
45
89
|
* Fully qualified globally unique typename.
|
|
46
|
-
* Example: `dxos.org/type/
|
|
90
|
+
* Example: `dxos.org/type/Message`
|
|
47
91
|
*/
|
|
48
92
|
// TODO(burdon): Reconcile with short DXN format.
|
|
49
|
-
// TODO(burdon): Change type => schema throughout.
|
|
93
|
+
// TODO(burdon): Change "/type" => "/schema" throughout.
|
|
50
94
|
export const TypenameSchema = Schema.String.pipe(Schema.pattern(/^[a-zA-Z]\w+\.[a-zA-Z]\w{1,}\/[\w/_-]+$/)).annotations(
|
|
51
95
|
{
|
|
52
96
|
description: 'Fully qualified globally unique typename',
|
|
53
|
-
example: 'dxos.org/type/
|
|
97
|
+
example: 'dxos.org/type/Message',
|
|
54
98
|
},
|
|
55
99
|
);
|
|
56
100
|
|
|
@@ -82,9 +126,6 @@ export const TypeAnnotation = Schema.extend(
|
|
|
82
126
|
TypeMeta,
|
|
83
127
|
Schema.Struct({
|
|
84
128
|
kind: Schema.Enums(EntityKind),
|
|
85
|
-
// kind: Schema.Enums(EntityKind),
|
|
86
|
-
// typename: Typename,
|
|
87
|
-
// version: VersionSchema,
|
|
88
129
|
|
|
89
130
|
/**
|
|
90
131
|
* If this is a relation, the schema of the source object.
|
|
@@ -102,8 +143,6 @@ export const TypeAnnotation = Schema.extend(
|
|
|
102
143
|
|
|
103
144
|
export interface TypeAnnotation extends Schema.Schema.Type<typeof TypeAnnotation> {}
|
|
104
145
|
|
|
105
|
-
// export type TypeMeta = Pick<TypeAnnotation, 'typename' | 'version'>;
|
|
106
|
-
|
|
107
146
|
/**
|
|
108
147
|
* @returns {@link TypeAnnotation} from a schema.
|
|
109
148
|
* Schema must have been created with {@link TypedObject} or {@link TypedLink} or manually assigned an appropriate annotation.
|
|
@@ -228,6 +267,10 @@ export const isInstanceOf = <Schema extends Schema.Schema.AnyNoContext>(
|
|
|
228
267
|
return typeDXN.type === typename;
|
|
229
268
|
};
|
|
230
269
|
|
|
270
|
+
//
|
|
271
|
+
// PropertyMeta
|
|
272
|
+
//
|
|
273
|
+
|
|
231
274
|
/**
|
|
232
275
|
* PropertyMeta (metadata for dynamic schema properties).
|
|
233
276
|
* For user-defined annotations.
|
|
@@ -261,18 +304,16 @@ export const getPropertyMetaAnnotation = <T>(prop: SchemaAST.PropertySignature,
|
|
|
261
304
|
Option.getOrElse(() => undefined),
|
|
262
305
|
);
|
|
263
306
|
|
|
307
|
+
//
|
|
308
|
+
// Reference
|
|
309
|
+
//
|
|
310
|
+
|
|
264
311
|
/**
|
|
265
312
|
* Schema reference.
|
|
266
313
|
*/
|
|
267
314
|
export const ReferenceAnnotationId = Symbol.for('@dxos/schema/annotation/Reference');
|
|
268
|
-
|
|
269
315
|
export type ReferenceAnnotationValue = TypeAnnotation;
|
|
270
|
-
|
|
271
|
-
export const getReferenceAnnotation = (schema: Schema.Schema.AnyNoContext) =>
|
|
272
|
-
Function.pipe(
|
|
273
|
-
SchemaAST.getAnnotation<ReferenceAnnotationValue>(ReferenceAnnotationId)(schema.ast),
|
|
274
|
-
Option.getOrElse(() => undefined),
|
|
275
|
-
);
|
|
316
|
+
export const ReferenceAnnotation = createAnnotationHelper<ReferenceAnnotationValue>(ReferenceAnnotationId);
|
|
276
317
|
|
|
277
318
|
/**
|
|
278
319
|
* SchemaMeta.
|
|
@@ -295,9 +336,13 @@ export const LabelAnnotation = createAnnotationHelper<string[]>(LabelAnnotationI
|
|
|
295
336
|
|
|
296
337
|
/**
|
|
297
338
|
* Returns the label for a given object based on {@link LabelAnnotationId}.
|
|
339
|
+
* Lower-level version that requires explicit schema parameter.
|
|
298
340
|
*/
|
|
299
341
|
// TODO(burdon): Convert to JsonPath?
|
|
300
|
-
export const
|
|
342
|
+
export const getLabelWithSchema = <S extends Schema.Schema.Any>(
|
|
343
|
+
schema: S,
|
|
344
|
+
object: Schema.Schema.Type<S>,
|
|
345
|
+
): string | undefined => {
|
|
301
346
|
const annotation = LabelAnnotation.get(schema).pipe(Option.getOrElse(() => ['name']));
|
|
302
347
|
for (const accessor of annotation) {
|
|
303
348
|
assertArgument(
|
|
@@ -325,8 +370,13 @@ export const getLabel = <S extends Schema.Schema.Any>(schema: S, object: Schema.
|
|
|
325
370
|
|
|
326
371
|
/**
|
|
327
372
|
* Sets the label for a given object based on {@link LabelAnnotationId}.
|
|
373
|
+
* Lower-level version that requires explicit schema parameter.
|
|
328
374
|
*/
|
|
329
|
-
export const
|
|
375
|
+
export const setLabelWithSchema = <S extends Schema.Schema.Any>(
|
|
376
|
+
schema: S,
|
|
377
|
+
object: Schema.Schema.Type<S>,
|
|
378
|
+
label: string,
|
|
379
|
+
) => {
|
|
330
380
|
const annotation = LabelAnnotation.get(schema).pipe(
|
|
331
381
|
Option.map((field) => field[0]),
|
|
332
382
|
Option.getOrElse(() => 'name'),
|
|
@@ -342,10 +392,11 @@ export const DescriptionAnnotationId = Symbol.for('@dxos/schema/annotation/Descr
|
|
|
342
392
|
export const DescriptionAnnotation = createAnnotationHelper<string>(DescriptionAnnotationId);
|
|
343
393
|
|
|
344
394
|
/**
|
|
345
|
-
* Returns the
|
|
395
|
+
* Returns the description for a given object based on {@link DescriptionAnnotationId}.
|
|
396
|
+
* Lower-level version that requires explicit schema parameter.
|
|
346
397
|
*/
|
|
347
398
|
// TODO(burdon): Convert to JsonPath?
|
|
348
|
-
export const
|
|
399
|
+
export const getDescriptionWithSchema = <S extends Schema.Schema.Any>(
|
|
349
400
|
schema: S,
|
|
350
401
|
object: Schema.Schema.Type<S>,
|
|
351
402
|
): string | undefined => {
|
|
@@ -369,8 +420,9 @@ export const getDescription = <S extends Schema.Schema.Any>(
|
|
|
369
420
|
|
|
370
421
|
/**
|
|
371
422
|
* Sets the description for a given object based on {@link DescriptionAnnotationId}.
|
|
423
|
+
* Lower-level version that requires explicit schema parameter.
|
|
372
424
|
*/
|
|
373
|
-
export const
|
|
425
|
+
export const setDescriptionWithSchema = <S extends Schema.Schema.Any>(
|
|
374
426
|
schema: S,
|
|
375
427
|
object: Schema.Schema.Type<S>,
|
|
376
428
|
description: string,
|
|
@@ -406,58 +458,3 @@ export type GeneratorAnnotationValue =
|
|
|
406
458
|
};
|
|
407
459
|
|
|
408
460
|
export const GeneratorAnnotation = createAnnotationHelper<GeneratorAnnotationValue>(GeneratorAnnotationId);
|
|
409
|
-
|
|
410
|
-
/**
|
|
411
|
-
* @returns DXN of the schema.
|
|
412
|
-
*
|
|
413
|
-
* For non-stored schema returns `dxn:type:`.
|
|
414
|
-
* For stored schema returns `dxn:echo:`.
|
|
415
|
-
*/
|
|
416
|
-
export const getSchemaDXN = (schema: Schema.Schema.All): DXN | undefined => {
|
|
417
|
-
assertArgument(Schema.isSchema(schema), 'schema', 'invalid schema');
|
|
418
|
-
|
|
419
|
-
const id = getTypeIdentifierAnnotation(schema);
|
|
420
|
-
if (id) {
|
|
421
|
-
return DXN.parse(id);
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
// TODO(dmaretskyi): Add support for dynamic schema.
|
|
425
|
-
const objectAnnotation = getTypeAnnotation(schema);
|
|
426
|
-
if (!objectAnnotation) {
|
|
427
|
-
return undefined;
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
return DXN.fromTypenameAndVersion(objectAnnotation.typename, objectAnnotation.version);
|
|
431
|
-
};
|
|
432
|
-
|
|
433
|
-
/**
|
|
434
|
-
* Returns a reference that will be used to point to a schema.
|
|
435
|
-
* @deprecated Use {@link getSchemaDXN} instead.
|
|
436
|
-
*/
|
|
437
|
-
export const getTypeReference = (schema: Schema.Schema.All | undefined): Reference | undefined => {
|
|
438
|
-
if (!schema) {
|
|
439
|
-
return undefined;
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
const schemaDXN = getSchemaDXN(schema);
|
|
443
|
-
if (!schemaDXN) {
|
|
444
|
-
return undefined;
|
|
445
|
-
}
|
|
446
|
-
return Reference.fromDXN(schemaDXN);
|
|
447
|
-
};
|
|
448
|
-
|
|
449
|
-
/**
|
|
450
|
-
* Returns a reference that will be used to point to a schema.
|
|
451
|
-
* @throws If it is not possible to reference this schema.
|
|
452
|
-
*
|
|
453
|
-
* @deprecated Use {@link getSchemaDXN} instead.
|
|
454
|
-
*/
|
|
455
|
-
export const requireTypeReference = (schema: Schema.Schema.AnyNoContext): Reference => {
|
|
456
|
-
const typeReference = getTypeReference(schema);
|
|
457
|
-
if (typeReference == null) {
|
|
458
|
-
// TODO(burdon): Catalog user-facing errors (this is too verbose).
|
|
459
|
-
throw new Error('Schema must be defined via TypedObject.');
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
return typeReference;
|
|
463
|
-
};
|
|
@@ -13,12 +13,14 @@ import { EntityKind } from '../types';
|
|
|
13
13
|
|
|
14
14
|
export interface AnnotationHelper<T> {
|
|
15
15
|
get: (schema: Schema.Schema.Any) => Option.Option<T>;
|
|
16
|
+
getFromAst: (ast: SchemaAST.AST) => Option.Option<T>;
|
|
16
17
|
set: (value: T) => <S extends Schema.Schema.Any>(schema: S) => S;
|
|
17
18
|
}
|
|
18
19
|
|
|
19
20
|
export const createAnnotationHelper = <T>(id: symbol): AnnotationHelper<T> => {
|
|
20
21
|
return {
|
|
21
22
|
get: (schema) => SchemaAST.getAnnotation(schema.ast, id),
|
|
23
|
+
getFromAst: (ast) => SchemaAST.getAnnotation(ast, id),
|
|
22
24
|
set:
|
|
23
25
|
(value) =>
|
|
24
26
|
<S extends Schema.Schema.Any>(schema: S) =>
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Common annotation helpers shared by Obj and Relation modules.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
getDescriptionWithSchema,
|
|
11
|
+
getLabelWithSchema,
|
|
12
|
+
setDescriptionWithSchema,
|
|
13
|
+
setLabelWithSchema,
|
|
14
|
+
} from '../annotations';
|
|
15
|
+
import { type Mutable } from '../proxy';
|
|
16
|
+
import { type AnyProperties, getSchema as getSchema$ } from '../types';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Get the label of an entity.
|
|
20
|
+
* Accepts both reactive entities and snapshots.
|
|
21
|
+
*/
|
|
22
|
+
export const getLabel = (entity: AnyProperties): string | undefined => {
|
|
23
|
+
const schema = getSchema$(entity);
|
|
24
|
+
if (schema != null) {
|
|
25
|
+
return getLabelWithSchema(schema, entity);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Set the label of an entity.
|
|
31
|
+
* Must be called within an Obj.change or Relation.change callback.
|
|
32
|
+
*/
|
|
33
|
+
export const setLabel = (entity: Mutable<AnyProperties>, label: string) => {
|
|
34
|
+
const schema = getSchema$(entity);
|
|
35
|
+
if (schema != null) {
|
|
36
|
+
setLabelWithSchema(schema, entity, label);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Get the description of an entity.
|
|
42
|
+
* Accepts both reactive entities and snapshots.
|
|
43
|
+
*/
|
|
44
|
+
export const getDescription = (entity: AnyProperties): string | undefined => {
|
|
45
|
+
const schema = getSchema$(entity);
|
|
46
|
+
if (schema != null) {
|
|
47
|
+
return getDescriptionWithSchema(schema, entity);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Set the description of an entity.
|
|
53
|
+
* Must be called within an Obj.change or Relation.change callback.
|
|
54
|
+
*/
|
|
55
|
+
export const setDescription = (entity: Mutable<AnyProperties>, description: string) => {
|
|
56
|
+
const schema = getSchema$(entity);
|
|
57
|
+
if (schema != null) {
|
|
58
|
+
setDescriptionWithSchema(schema, entity, description);
|
|
59
|
+
}
|
|
60
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { invariant } from '@dxos/invariant';
|
|
6
|
+
import { type DXN } from '@dxos/keys';
|
|
7
|
+
import { assumeType } from '@dxos/util';
|
|
8
|
+
|
|
9
|
+
import { type InternalObjectProps, ObjectDatabaseId, getObjectDXN } from '../entities';
|
|
10
|
+
import type { AnyEntity } from '../types';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Get the DXN of an entity.
|
|
14
|
+
* Accepts both reactive entities and snapshots.
|
|
15
|
+
*/
|
|
16
|
+
export const getDXN = (entity: AnyEntity): DXN => {
|
|
17
|
+
const dxn = getObjectDXN(entity);
|
|
18
|
+
invariant(dxn != null, 'Invalid entity.');
|
|
19
|
+
return dxn;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Get the database the entity belongs to.
|
|
24
|
+
* Accepts both reactive entities and snapshots.
|
|
25
|
+
*/
|
|
26
|
+
export const getDatabase = (entity: AnyEntity): any | undefined => {
|
|
27
|
+
assumeType<InternalObjectProps>(entity);
|
|
28
|
+
return entity[ObjectDatabaseId];
|
|
29
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Shared API helpers for Obj and Relation modules.
|
|
7
|
+
* These implementations use generic Entity types.
|
|
8
|
+
* Obj and Relation modules re-export with strongly-typed signatures.
|
|
9
|
+
*
|
|
10
|
+
* TODO(wittjosiah): Could this become the new "internal" where we slowly refactor
|
|
11
|
+
* existing internal modules into here? This would provide a cleaner boundary
|
|
12
|
+
* and prevent external packages from using internals directly.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
export * from './annotations';
|
|
16
|
+
export * from './entity';
|
|
17
|
+
export * from './meta';
|
|
18
|
+
export * from './sorting';
|
|
19
|
+
export * from './version';
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import type { ForeignKey } from '@dxos/echo-protocol';
|
|
6
|
+
import { assertArgument, invariant } from '@dxos/invariant';
|
|
7
|
+
import type { DeepReadonly } from '@dxos/util';
|
|
8
|
+
|
|
9
|
+
import { type Mutable } from '../proxy';
|
|
10
|
+
import { type AnyProperties, type ObjectMeta, getMeta as getMeta$ } from '../types';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Deeply read-only version of ObjectMeta.
|
|
14
|
+
*/
|
|
15
|
+
export type ReadonlyMeta = DeepReadonly<ObjectMeta>;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Mutable meta type received in meta mutation callbacks.
|
|
19
|
+
*/
|
|
20
|
+
export type Meta = Mutable<ObjectMeta>;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Get the metadata for an entity with validation.
|
|
24
|
+
* Returns mutable meta when passed a mutable entity (inside change callback).
|
|
25
|
+
* Returns read-only meta when passed a regular entity or snapshot.
|
|
26
|
+
*
|
|
27
|
+
* TODO(burdon): When passed a Snapshot, should return a snapshot of meta, not the live meta proxy.
|
|
28
|
+
*/
|
|
29
|
+
export function getMetaChecked(entity: Mutable<AnyProperties>): Meta;
|
|
30
|
+
export function getMetaChecked(entity: AnyProperties): ReadonlyMeta;
|
|
31
|
+
export function getMetaChecked(entity: AnyProperties): Meta | ReadonlyMeta {
|
|
32
|
+
assertArgument(entity, 'entity', 'Should be an entity.');
|
|
33
|
+
const meta = getMeta$(entity);
|
|
34
|
+
invariant(meta != null, 'Invalid entity.');
|
|
35
|
+
return meta;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @returns Foreign keys for the entity from the specified source.
|
|
40
|
+
* Accepts both reactive entities and snapshots.
|
|
41
|
+
*/
|
|
42
|
+
export const getKeys = (entity: AnyProperties, source: string): ForeignKey[] => {
|
|
43
|
+
assertArgument(entity, 'entity', 'Should be an entity.');
|
|
44
|
+
const meta = getMetaChecked(entity);
|
|
45
|
+
invariant(meta != null, 'Invalid entity.');
|
|
46
|
+
return meta.keys.filter((key) => key.source === source);
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Delete all keys from the entity for the specified source.
|
|
51
|
+
* Must be called within an Obj.change or Relation.change callback.
|
|
52
|
+
*/
|
|
53
|
+
export const deleteKeys = (entity: Mutable<AnyProperties>, source: string) => {
|
|
54
|
+
const meta = getMetaChecked(entity);
|
|
55
|
+
for (let i = 0; i < meta.keys.length; i++) {
|
|
56
|
+
if (meta.keys[i].source === source) {
|
|
57
|
+
meta.keys.splice(i, 1);
|
|
58
|
+
i--;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Add a tag to the entity.
|
|
65
|
+
* Must be called within an Obj.change or Relation.change callback.
|
|
66
|
+
*/
|
|
67
|
+
export const addTag = (entity: Mutable<AnyProperties>, tag: string) => {
|
|
68
|
+
const meta = getMetaChecked(entity);
|
|
69
|
+
meta.tags ??= [];
|
|
70
|
+
meta.tags.push(tag);
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Remove a tag from the entity.
|
|
75
|
+
* Must be called within an Obj.change or Relation.change callback.
|
|
76
|
+
*/
|
|
77
|
+
export const removeTag = (entity: Mutable<AnyProperties>, tag: string) => {
|
|
78
|
+
const meta = getMetaChecked(entity);
|
|
79
|
+
if (!meta.tags) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
for (let i = 0; i < meta.tags.length; i++) {
|
|
83
|
+
if (meta.tags[i] === tag) {
|
|
84
|
+
meta.tags.splice(i, 1);
|
|
85
|
+
i--;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { getTypename } from '../annotations';
|
|
6
|
+
import type { AnyEntity } from '../types';
|
|
7
|
+
|
|
8
|
+
import { getLabel } from './annotations';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* String comparison helper for sorting.
|
|
12
|
+
*/
|
|
13
|
+
export const compare = (a?: string, b?: string): number => {
|
|
14
|
+
if (a == null) {
|
|
15
|
+
return b == null ? 0 : 1;
|
|
16
|
+
}
|
|
17
|
+
if (b == null) {
|
|
18
|
+
return -1;
|
|
19
|
+
}
|
|
20
|
+
return a.localeCompare(b);
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Comparator function type for sorting entities.
|
|
25
|
+
* Accepts both reactive entities and snapshots.
|
|
26
|
+
*/
|
|
27
|
+
export type Comparator<T extends AnyEntity = AnyEntity> = (a: T, b: T) => number;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Sort entities by label.
|
|
31
|
+
*/
|
|
32
|
+
export const sortByLabel: Comparator = (a: AnyEntity, b: AnyEntity) => compare(getLabel(a), getLabel(b));
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Sort entities by typename.
|
|
36
|
+
*/
|
|
37
|
+
export const sortByTypename: Comparator = (a: AnyEntity, b: AnyEntity) => compare(getTypename(a), getTypename(b));
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Compose multiple comparators into one.
|
|
41
|
+
* Applies comparators in order until one returns non-zero.
|
|
42
|
+
*/
|
|
43
|
+
export const sort = <T extends AnyEntity>(...comparators: Comparator<T>[]): Comparator<T> => {
|
|
44
|
+
return (a: T, b: T) => {
|
|
45
|
+
for (const comparator of comparators) {
|
|
46
|
+
const result = comparator(a, b);
|
|
47
|
+
if (result !== 0) {
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return 0;
|
|
52
|
+
};
|
|
53
|
+
};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { assertArgument } from '@dxos/invariant';
|
|
6
|
+
|
|
7
|
+
import { ObjectVersionId } from '../entities';
|
|
8
|
+
import { type AnyEntity, VersionTypeId } from '../types';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Represent entity version.
|
|
12
|
+
* May be backed by Automerge.
|
|
13
|
+
* Entities with no history are not versioned.
|
|
14
|
+
* Named EntityVersion to avoid conflict with types/version.ts.
|
|
15
|
+
*/
|
|
16
|
+
export interface EntityVersion {
|
|
17
|
+
[VersionTypeId]: {};
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Whether the entity is versioned.
|
|
21
|
+
*/
|
|
22
|
+
versioned: boolean;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Automerge heads.
|
|
26
|
+
*/
|
|
27
|
+
automergeHeads?: string[];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const unversioned: EntityVersion = {
|
|
31
|
+
[VersionTypeId]: {},
|
|
32
|
+
versioned: false,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Checks that `obj` is a version object.
|
|
37
|
+
*/
|
|
38
|
+
export const isVersion = (entity: unknown): entity is EntityVersion => {
|
|
39
|
+
return entity != null && typeof entity === 'object' && VersionTypeId in entity;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Returns the version of an entity.
|
|
44
|
+
* Accepts both reactive entities and snapshots.
|
|
45
|
+
*/
|
|
46
|
+
export const version = (entity: AnyEntity): EntityVersion => {
|
|
47
|
+
const ver = (entity as any)[ObjectVersionId];
|
|
48
|
+
if (ver === undefined) {
|
|
49
|
+
return unversioned;
|
|
50
|
+
}
|
|
51
|
+
return ver;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Checks that `version` is a valid version object.
|
|
56
|
+
*/
|
|
57
|
+
export const versionValid = (ver: EntityVersion): boolean => {
|
|
58
|
+
assertArgument(isVersion(ver), 'version', 'Invalid version object');
|
|
59
|
+
return !!ver.versioned;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export type VersionCompareResult = 'unversioned' | 'equal' | 'different';
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Compares two versions.
|
|
66
|
+
* @param version1
|
|
67
|
+
* @param version2
|
|
68
|
+
* @returns 'unversioned' if either entity is unversioned, 'equal' if the versions are equal, 'different' if the versions are different.
|
|
69
|
+
*/
|
|
70
|
+
export const compareVersions = (version1: EntityVersion, version2: EntityVersion): VersionCompareResult => {
|
|
71
|
+
assertArgument(isVersion(version1), 'version1', 'Invalid version object');
|
|
72
|
+
assertArgument(isVersion(version2), 'version2', 'Invalid version object');
|
|
73
|
+
|
|
74
|
+
if (!versionValid(version1) || !versionValid(version2)) {
|
|
75
|
+
return 'unversioned';
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (version1.automergeHeads?.length !== version2.automergeHeads?.length) {
|
|
79
|
+
return 'different';
|
|
80
|
+
}
|
|
81
|
+
if (version1.automergeHeads?.some((head) => !version2.automergeHeads?.includes(head))) {
|
|
82
|
+
return 'different';
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return 'equal';
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
export const encodeVersion = (ver: EntityVersion): string => {
|
|
89
|
+
return JSON.stringify(ver);
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
export const decodeVersion = (ver: string): EntityVersion => {
|
|
93
|
+
const parsed = JSON.parse(ver);
|
|
94
|
+
parsed[VersionTypeId] = {};
|
|
95
|
+
return parsed;
|
|
96
|
+
};
|