@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,14 +7,12 @@ import type * as Schema from 'effect/Schema';
|
|
|
7
7
|
|
|
8
8
|
import { type QueryAST } from '@dxos/echo-protocol';
|
|
9
9
|
|
|
10
|
-
import
|
|
11
|
-
import
|
|
10
|
+
import * as Filter from './Filter';
|
|
11
|
+
import { getTypeDXNFromSpecifier } from './internal';
|
|
12
|
+
import type * as Order from './Order';
|
|
13
|
+
import type * as Ref from './Ref';
|
|
14
|
+
import type * as Type$ from './Type';
|
|
12
15
|
|
|
13
|
-
import { Filter, FilterClass } from './filter';
|
|
14
|
-
import { type Order } from './order';
|
|
15
|
-
import { getTypeDXNFromSpecifier } from './util';
|
|
16
|
-
|
|
17
|
-
// TODO(burdon): Query namespace (and move Filter, Order into Query namespace).
|
|
18
16
|
// TODO(dmaretskyi): Split up into interfaces for objects and relations so they can have separate verbs.
|
|
19
17
|
// TODO(dmaretskyi): Undirected relation traversals.
|
|
20
18
|
// TODO(wittjosiah): Make Filter & Query pipeable.
|
|
@@ -37,7 +35,7 @@ export interface Query<T> {
|
|
|
37
35
|
* @param filter - Filter to select the objects.
|
|
38
36
|
* @returns Query for the selected objects.
|
|
39
37
|
*/
|
|
40
|
-
select(filter: Filter<T>): Query<T>;
|
|
38
|
+
select(filter: Filter.Filter<T>): Query<T>;
|
|
41
39
|
select(props: Filter.Props<T>): Query<T>;
|
|
42
40
|
|
|
43
41
|
/**
|
|
@@ -48,17 +46,17 @@ export interface Query<T> {
|
|
|
48
46
|
reference<K extends RefPropKey<T>>(
|
|
49
47
|
key: K,
|
|
50
48
|
): Query<
|
|
51
|
-
T[K] extends Ref.
|
|
49
|
+
T[K] extends Ref.Unknown
|
|
52
50
|
? Ref.Target<T[K]>
|
|
53
|
-
: T[K] extends Ref.
|
|
51
|
+
: T[K] extends Ref.Unknown | undefined
|
|
54
52
|
? Ref.Target<Exclude<T[K], undefined>>
|
|
55
53
|
: never
|
|
56
54
|
>;
|
|
57
55
|
|
|
58
56
|
/**
|
|
59
57
|
* Find objects referencing this object.
|
|
60
|
-
* @param target - Schema of the referencing object.
|
|
61
|
-
* @param key - Property path inside the referencing object that is a reference.
|
|
58
|
+
* @param target - Schema of the referencing object. If not provided, matches any type.
|
|
59
|
+
* @param key - Property path inside the referencing object that is a reference. If not provided, matches any property.
|
|
62
60
|
* @returns Query for the referencing objects.
|
|
63
61
|
*/
|
|
64
62
|
// TODO(dmaretskyi): any way to enforce `Ref.Target<Schema.Schema.Type<S>[key]> == T`?
|
|
@@ -67,6 +65,8 @@ export interface Query<T> {
|
|
|
67
65
|
target: S | string,
|
|
68
66
|
key: RefPropKey<Schema.Schema.Type<S>>,
|
|
69
67
|
): Query<Schema.Schema.Type<S>>;
|
|
68
|
+
referencedBy<S extends Schema.Schema.All>(target: S | string): Query<Schema.Schema.Type<S>>;
|
|
69
|
+
referencedBy(): Query<any>;
|
|
70
70
|
|
|
71
71
|
/**
|
|
72
72
|
* Find relations where this object is the source.
|
|
@@ -94,13 +94,13 @@ export interface Query<T> {
|
|
|
94
94
|
* For a query for relations, get the source objects.
|
|
95
95
|
* @returns Query for the source objects.
|
|
96
96
|
*/
|
|
97
|
-
source(): Query<Type
|
|
97
|
+
source(): Query<Type$.Relation.Source<T>>;
|
|
98
98
|
|
|
99
99
|
/**
|
|
100
100
|
* For a query for relations, get the target objects.
|
|
101
101
|
* @returns Query for the target objects.
|
|
102
102
|
*/
|
|
103
|
-
target(): Query<Type
|
|
103
|
+
target(): Query<Type$.Relation.Target<T>>;
|
|
104
104
|
|
|
105
105
|
/**
|
|
106
106
|
* Order the query results.
|
|
@@ -108,114 +108,33 @@ export interface Query<T> {
|
|
|
108
108
|
* @param order - Order to sort the results.
|
|
109
109
|
* @returns Query for the ordered results.
|
|
110
110
|
*/
|
|
111
|
-
orderBy(...order: EffectArray.NonEmptyArray<Order<T>>): Query<T>;
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Add options to a query.
|
|
115
|
-
*/
|
|
116
|
-
options(options: QueryAST.QueryOptions): Query<T>;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
interface QueryAPI {
|
|
120
|
-
is(value: unknown): value is Query.Any;
|
|
121
|
-
|
|
122
|
-
/** Construct a query from an ast. */
|
|
123
|
-
fromAst(ast: QueryAST.Query): Query<any>;
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* Select objects based on a filter.
|
|
127
|
-
* @param filter - Filter to select the objects.
|
|
128
|
-
* @returns Query for the selected objects.
|
|
129
|
-
*/
|
|
130
|
-
select<F extends Filter.Any>(filter: F): Query<Filter.Type<F>>;
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* Query for objects of a given schema.
|
|
134
|
-
* @param schema - Schema of the objects.
|
|
135
|
-
* @param predicates - Predicates to filter the objects.
|
|
136
|
-
* @returns Query for the objects.
|
|
137
|
-
*
|
|
138
|
-
* Shorthand for: `Query.select(Filter.type(schema, predicates))`.
|
|
139
|
-
*/
|
|
140
|
-
type<S extends Schema.Schema.All>(
|
|
141
|
-
schema: S | string,
|
|
142
|
-
predicates?: Filter.Props<Schema.Schema.Type<S>>,
|
|
143
|
-
): Query<Schema.Schema.Type<S>>;
|
|
111
|
+
orderBy(...order: EffectArray.NonEmptyArray<Order.Order<T>>): Query<T>;
|
|
144
112
|
|
|
145
113
|
/**
|
|
146
|
-
*
|
|
147
|
-
* @param
|
|
148
|
-
* @returns Query for the
|
|
114
|
+
* Limit the number of results.
|
|
115
|
+
* @param limit - Maximum number of results to return.
|
|
116
|
+
* @returns Query for the limited results.
|
|
149
117
|
*/
|
|
150
|
-
|
|
151
|
-
all<T>(...queries: Query<T>[]): Query<T>;
|
|
118
|
+
limit(limit: number): Query<T>;
|
|
152
119
|
|
|
153
120
|
/**
|
|
154
|
-
*
|
|
155
|
-
* @param source - Query to subtract from.
|
|
156
|
-
* @param exclude - Query to subtract.
|
|
157
|
-
* @returns Query for the results of the source query minus the results of the exclude query.
|
|
121
|
+
* Add options to a query.
|
|
158
122
|
*/
|
|
159
|
-
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
export declare namespace Query {
|
|
163
|
-
export type Any = Query<any>;
|
|
164
|
-
|
|
165
|
-
export type Type<Q extends Any> = Q extends Query<infer T> ? T : never;
|
|
123
|
+
options(options: QueryAST.QueryOptions): Query<T>;
|
|
166
124
|
}
|
|
167
125
|
|
|
168
|
-
|
|
169
|
-
class QueryClass implements Query<any> {
|
|
170
|
-
private static variance: Query<any>['~Query'] = {} as Query<any>['~Query'];
|
|
126
|
+
export type Any = Query<any>;
|
|
171
127
|
|
|
172
|
-
|
|
173
|
-
return typeof value === 'object' && value !== null && '~Query' in value;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
static fromAst(ast: QueryAST.Query): Query<any> {
|
|
177
|
-
return new QueryClass(ast);
|
|
178
|
-
}
|
|
128
|
+
export type Type<Q extends Any> = Q extends Query<infer T> ? T : never;
|
|
179
129
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
type: 'select',
|
|
183
|
-
filter: filter.ast,
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
static type(schema: Schema.Schema.All | string, predicates?: Filter.Props<unknown>): Query<any> {
|
|
188
|
-
return new QueryClass({
|
|
189
|
-
type: 'select',
|
|
190
|
-
filter: FilterClass.type(schema, predicates).ast,
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
static all(...queries: Query<any>[]): Query<any> {
|
|
195
|
-
if (queries.length === 0) {
|
|
196
|
-
throw new TypeError(
|
|
197
|
-
'Query.all combines results of multiple queries, to query all objects use Query.select(Filter.everything())',
|
|
198
|
-
);
|
|
199
|
-
}
|
|
200
|
-
return new QueryClass({
|
|
201
|
-
type: 'union',
|
|
202
|
-
queries: queries.map((q) => q.ast),
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
static without<T>(source: Query<T>, exclude: Query<T>): Query<T> {
|
|
207
|
-
return new QueryClass({
|
|
208
|
-
type: 'set-difference',
|
|
209
|
-
source: source.ast,
|
|
210
|
-
exclude: exclude.ast,
|
|
211
|
-
});
|
|
212
|
-
}
|
|
130
|
+
class QueryClass implements Any {
|
|
131
|
+
private static variance: Any['~Query'] = {} as Any['~Query'];
|
|
213
132
|
|
|
214
133
|
constructor(public readonly ast: QueryAST.Query) {}
|
|
215
134
|
|
|
216
135
|
'~Query' = QueryClass.variance;
|
|
217
136
|
|
|
218
|
-
select(filter: Filter.Any | Filter.Props<any>):
|
|
137
|
+
select(filter: Filter.Any | Filter.Props<any>): Any {
|
|
219
138
|
if (Filter.is(filter)) {
|
|
220
139
|
return new QueryClass({
|
|
221
140
|
type: 'filter',
|
|
@@ -226,12 +145,12 @@ class QueryClass implements Query<any> {
|
|
|
226
145
|
return new QueryClass({
|
|
227
146
|
type: 'filter',
|
|
228
147
|
selection: this.ast,
|
|
229
|
-
filter:
|
|
148
|
+
filter: Filter.props(filter).ast,
|
|
230
149
|
});
|
|
231
150
|
}
|
|
232
151
|
}
|
|
233
152
|
|
|
234
|
-
reference(key: string):
|
|
153
|
+
reference(key: string): Any {
|
|
235
154
|
return new QueryClass({
|
|
236
155
|
type: 'reference-traversal',
|
|
237
156
|
anchor: this.ast,
|
|
@@ -239,35 +158,35 @@ class QueryClass implements Query<any> {
|
|
|
239
158
|
});
|
|
240
159
|
}
|
|
241
160
|
|
|
242
|
-
referencedBy(target
|
|
243
|
-
const dxn = getTypeDXNFromSpecifier(target);
|
|
161
|
+
referencedBy(target?: Schema.Schema.All | string, key?: string): Any {
|
|
162
|
+
const dxn = target !== undefined ? getTypeDXNFromSpecifier(target) : null;
|
|
244
163
|
return new QueryClass({
|
|
245
164
|
type: 'incoming-references',
|
|
246
165
|
anchor: this.ast,
|
|
247
|
-
property: key,
|
|
248
|
-
typename: dxn
|
|
166
|
+
property: key ?? null,
|
|
167
|
+
typename: dxn?.toString() ?? null,
|
|
249
168
|
});
|
|
250
169
|
}
|
|
251
170
|
|
|
252
|
-
sourceOf(relation: Schema.Schema.All | string, predicates?: Filter.Props<unknown> | undefined):
|
|
171
|
+
sourceOf(relation: Schema.Schema.All | string, predicates?: Filter.Props<unknown> | undefined): Any {
|
|
253
172
|
return new QueryClass({
|
|
254
173
|
type: 'relation',
|
|
255
174
|
anchor: this.ast,
|
|
256
175
|
direction: 'outgoing',
|
|
257
|
-
filter:
|
|
176
|
+
filter: Filter.type(relation, predicates).ast,
|
|
258
177
|
});
|
|
259
178
|
}
|
|
260
179
|
|
|
261
|
-
targetOf(relation: Schema.Schema.All | string, predicates?: Filter.Props<unknown> | undefined):
|
|
180
|
+
targetOf(relation: Schema.Schema.All | string, predicates?: Filter.Props<unknown> | undefined): Any {
|
|
262
181
|
return new QueryClass({
|
|
263
182
|
type: 'relation',
|
|
264
183
|
anchor: this.ast,
|
|
265
184
|
direction: 'incoming',
|
|
266
|
-
filter:
|
|
185
|
+
filter: Filter.type(relation, predicates).ast,
|
|
267
186
|
});
|
|
268
187
|
}
|
|
269
188
|
|
|
270
|
-
source():
|
|
189
|
+
source(): Any {
|
|
271
190
|
return new QueryClass({
|
|
272
191
|
type: 'relation-traversal',
|
|
273
192
|
anchor: this.ast,
|
|
@@ -275,7 +194,7 @@ class QueryClass implements Query<any> {
|
|
|
275
194
|
});
|
|
276
195
|
}
|
|
277
196
|
|
|
278
|
-
target():
|
|
197
|
+
target(): Any {
|
|
279
198
|
return new QueryClass({
|
|
280
199
|
type: 'relation-traversal',
|
|
281
200
|
anchor: this.ast,
|
|
@@ -283,7 +202,7 @@ class QueryClass implements Query<any> {
|
|
|
283
202
|
});
|
|
284
203
|
}
|
|
285
204
|
|
|
286
|
-
orderBy(...order: Order<any>[]):
|
|
205
|
+
orderBy(...order: Order.Order<any>[]): Any {
|
|
287
206
|
return new QueryClass({
|
|
288
207
|
type: 'order',
|
|
289
208
|
query: this.ast,
|
|
@@ -291,7 +210,15 @@ class QueryClass implements Query<any> {
|
|
|
291
210
|
});
|
|
292
211
|
}
|
|
293
212
|
|
|
294
|
-
|
|
213
|
+
limit(limit: number): Any {
|
|
214
|
+
return new QueryClass({
|
|
215
|
+
type: 'limit',
|
|
216
|
+
query: this.ast,
|
|
217
|
+
limit,
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
options(options: QueryAST.QueryOptions): Any {
|
|
295
222
|
return new QueryClass({
|
|
296
223
|
type: 'options',
|
|
297
224
|
query: this.ast,
|
|
@@ -300,4 +227,70 @@ class QueryClass implements Query<any> {
|
|
|
300
227
|
}
|
|
301
228
|
}
|
|
302
229
|
|
|
303
|
-
export const
|
|
230
|
+
export const is = (value: unknown): value is Any => {
|
|
231
|
+
return typeof value === 'object' && value !== null && '~Query' in value;
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
/** Construct a query from an ast. */
|
|
235
|
+
export const fromAst = (ast: QueryAST.Query): Any => {
|
|
236
|
+
return new QueryClass(ast);
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Select objects based on a filter.
|
|
241
|
+
* @param filter - Filter to select the objects.
|
|
242
|
+
* @returns Query for the selected objects.
|
|
243
|
+
*/
|
|
244
|
+
export const select = <F extends Filter.Any>(filter: F): Query<Filter.Type<F>> => {
|
|
245
|
+
return new QueryClass({
|
|
246
|
+
type: 'select',
|
|
247
|
+
filter: filter.ast,
|
|
248
|
+
});
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Query for objects of a given schema.
|
|
253
|
+
* @param schema - Schema of the objects.
|
|
254
|
+
* @param predicates - Predicates to filter the objects.
|
|
255
|
+
* @returns Query for the objects.
|
|
256
|
+
*
|
|
257
|
+
* Shorthand for: `Query.select(Filter.type(schema, predicates))`.
|
|
258
|
+
*/
|
|
259
|
+
export const type = (schema: Schema.Schema.All | string, predicates?: Filter.Props<unknown>): Any => {
|
|
260
|
+
return new QueryClass({
|
|
261
|
+
type: 'select',
|
|
262
|
+
filter: Filter.type(schema, predicates).ast,
|
|
263
|
+
});
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Combine results of multiple queries.
|
|
268
|
+
* @param queries - Queries to combine.
|
|
269
|
+
* @returns Query for the combined results.
|
|
270
|
+
*/
|
|
271
|
+
// TODO(dmaretskyi): Rename to `combine` or `union`.
|
|
272
|
+
export const all = (...queries: Any[]): Any => {
|
|
273
|
+
if (queries.length === 0) {
|
|
274
|
+
throw new TypeError(
|
|
275
|
+
'Query.all combines results of multiple queries, to query all objects use Query.select(Filter.everything())',
|
|
276
|
+
);
|
|
277
|
+
}
|
|
278
|
+
return new QueryClass({
|
|
279
|
+
type: 'union',
|
|
280
|
+
queries: queries.map((q) => q.ast),
|
|
281
|
+
});
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Subtract one query from another.
|
|
286
|
+
* @param source - Query to subtract from.
|
|
287
|
+
* @param exclude - Query to subtract.
|
|
288
|
+
* @returns Query for the results of the source query minus the results of the exclude query.
|
|
289
|
+
*/
|
|
290
|
+
export const without = <T>(source: Query<T>, exclude: Query<T>): Query<T> => {
|
|
291
|
+
return new QueryClass({
|
|
292
|
+
type: 'set-difference',
|
|
293
|
+
source: source.ast,
|
|
294
|
+
exclude: exclude.ast,
|
|
295
|
+
});
|
|
296
|
+
};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type CleanupFn } from '@dxos/async';
|
|
6
|
+
|
|
7
|
+
import type * as Entity from './Entity';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Individual query result entry.
|
|
11
|
+
*/
|
|
12
|
+
export type Entry<T> = {
|
|
13
|
+
id: string;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* May not be present for remote results.
|
|
17
|
+
*/
|
|
18
|
+
result?: T;
|
|
19
|
+
|
|
20
|
+
match?: {
|
|
21
|
+
// TODO(dmaretskyi): text positional info.
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Higher means better match.
|
|
25
|
+
*/
|
|
26
|
+
rank: number;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Query resolution metadata.
|
|
31
|
+
*/
|
|
32
|
+
// TODO(dmaretskyi): Rename to meta?
|
|
33
|
+
resolution?: {
|
|
34
|
+
// TODO(dmaretskyi): Make this more generic.
|
|
35
|
+
source: 'remote' | 'local' | 'index';
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Query resolution time in milliseconds.
|
|
39
|
+
*/
|
|
40
|
+
time: number;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Invidual query result entry for a database Entity.
|
|
46
|
+
*/
|
|
47
|
+
export type EntityEntry<T extends Entity.Unknown = Entity.Unknown> = Entry<T>;
|
|
48
|
+
|
|
49
|
+
export type RunOptions = {
|
|
50
|
+
timeout?: number;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
export type SubscriptionOptions = {
|
|
54
|
+
/**
|
|
55
|
+
* Fire the callback immediately.
|
|
56
|
+
*/
|
|
57
|
+
fire?: boolean;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
// TODO(burdon): Should T be constrained to Entity.Any?
|
|
61
|
+
export interface QueryResult<T> {
|
|
62
|
+
/**
|
|
63
|
+
* Currently available results along with their match metadata.
|
|
64
|
+
*/
|
|
65
|
+
readonly entries: Entry<T>[];
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Currently available results.
|
|
69
|
+
*/
|
|
70
|
+
readonly results: T[];
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Returns all known results.
|
|
74
|
+
*/
|
|
75
|
+
run(opts?: RunOptions): Promise<T[]>;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Returns all known results along with their match metadata.
|
|
79
|
+
*/
|
|
80
|
+
runEntries(opts?: RunOptions): Promise<Entry<T>[]>;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Returns currently available results synchronously.
|
|
84
|
+
*/
|
|
85
|
+
runSync(): T[];
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Returns currently available results synchronously along with their match metadata.
|
|
89
|
+
*/
|
|
90
|
+
runSyncEntries(): Entry<T>[];
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Returns first result.
|
|
94
|
+
*/
|
|
95
|
+
first(opts?: RunOptions): Promise<T>;
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Returns first result if there is one.
|
|
99
|
+
*/
|
|
100
|
+
firstOrUndefined(opts?: RunOptions): Promise<T | undefined>;
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Subscribes to changes in query results.
|
|
104
|
+
*/
|
|
105
|
+
subscribe(callback?: (query: QueryResult<T>) => void, opts?: SubscriptionOptions): CleanupFn;
|
|
106
|
+
}
|
package/src/Ref.ts
CHANGED
|
@@ -2,27 +2,44 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import * as Option from 'effect/Option';
|
|
6
|
+
import * as SchemaAST from 'effect/SchemaAST';
|
|
7
|
+
|
|
5
8
|
import { Ref as Ref$, RefArray, type RefResolver } from './internal';
|
|
9
|
+
import { getSchemaReference } from './internal';
|
|
10
|
+
import type * as JsonSchema from './JsonSchema';
|
|
6
11
|
import type * as Obj from './Obj';
|
|
7
12
|
|
|
8
13
|
export type Ref<T> = Ref$<T>;
|
|
9
|
-
export type
|
|
14
|
+
export type Unknown = Ref$<Obj.Unknown>;
|
|
10
15
|
|
|
11
16
|
export const Array = RefArray;
|
|
12
17
|
|
|
13
18
|
/**
|
|
14
19
|
* Extract reference target.
|
|
15
20
|
*/
|
|
16
|
-
export type Target<R extends
|
|
21
|
+
export type Target<R extends Unknown> = R extends Ref$<infer T> ? T : never;
|
|
17
22
|
|
|
18
23
|
/**
|
|
19
24
|
* Reference resolver.
|
|
20
25
|
*/
|
|
21
26
|
export type Resolver = RefResolver;
|
|
22
27
|
|
|
23
|
-
export const isRef: (value: unknown) => value is
|
|
28
|
+
export const isRef: (value: unknown) => value is Unknown = Ref$.isRef;
|
|
24
29
|
|
|
25
30
|
export const make = Ref$.make;
|
|
26
31
|
|
|
27
32
|
// TODO(dmaretskyi): Consider just allowing `make` to accept DXN.
|
|
28
33
|
export const fromDXN = Ref$.fromDXN;
|
|
34
|
+
|
|
35
|
+
// TODO(wittjosiah): Factor out?
|
|
36
|
+
export const isRefType = (ast: SchemaAST.AST): boolean => {
|
|
37
|
+
return SchemaAST.getAnnotation<JsonSchema.JsonSchema>(ast, SchemaAST.JSONSchemaAnnotationId).pipe(
|
|
38
|
+
Option.flatMap((jsonSchema) => ('$id' in jsonSchema ? Option.some(jsonSchema) : Option.none())),
|
|
39
|
+
Option.flatMap((jsonSchema) => {
|
|
40
|
+
const { typename } = getSchemaReference(jsonSchema) ?? {};
|
|
41
|
+
return typename ? Option.some(true) : Option.some(false);
|
|
42
|
+
}),
|
|
43
|
+
Option.getOrElse(() => false),
|
|
44
|
+
);
|
|
45
|
+
};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { describe, test } from 'vitest';
|
|
6
|
+
|
|
7
|
+
import * as Entity from './Entity';
|
|
8
|
+
import { SnapshotKindId } from './internal';
|
|
9
|
+
import * as Obj from './Obj';
|
|
10
|
+
import * as Relation from './Relation';
|
|
11
|
+
import { TestSchema } from './testing';
|
|
12
|
+
|
|
13
|
+
describe('Relation', () => {
|
|
14
|
+
describe('Snapshot', () => {
|
|
15
|
+
test('getSnapshot returns an immutable snapshot with SnapshotKindId', ({ expect }) => {
|
|
16
|
+
const obj1 = Obj.make(TestSchema.Person, { name: 'Alice' });
|
|
17
|
+
const obj2 = Obj.make(TestSchema.Person, { name: 'Bob' });
|
|
18
|
+
const rel = Relation.make(TestSchema.HasManager, {
|
|
19
|
+
[Relation.Source]: obj1,
|
|
20
|
+
[Relation.Target]: obj2,
|
|
21
|
+
});
|
|
22
|
+
const snapshot = Relation.getSnapshot(rel);
|
|
23
|
+
|
|
24
|
+
// Snapshot has SnapshotKindId, not KindId.
|
|
25
|
+
expect(snapshot[SnapshotKindId]).toBe(Entity.Kind.Relation);
|
|
26
|
+
expect((snapshot as any)[Entity.KindId]).toBeUndefined();
|
|
27
|
+
|
|
28
|
+
// Snapshot has same id.
|
|
29
|
+
expect(snapshot.id).toBe(rel.id);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
test('read-only helpers work with both reactive and snapshot', ({ expect }) => {
|
|
33
|
+
const obj1 = Obj.make(TestSchema.Person, { name: 'Alice' });
|
|
34
|
+
const obj2 = Obj.make(TestSchema.Person, { name: 'Bob' });
|
|
35
|
+
const rel = Relation.make(TestSchema.HasManager, {
|
|
36
|
+
[Relation.Source]: obj1,
|
|
37
|
+
[Relation.Target]: obj2,
|
|
38
|
+
});
|
|
39
|
+
const snapshot = Relation.getSnapshot(rel);
|
|
40
|
+
|
|
41
|
+
// getSourceDXN - works with both.
|
|
42
|
+
expect(Relation.getSourceDXN(rel)).toBeDefined();
|
|
43
|
+
expect(Relation.getSourceDXN(snapshot)).toBeDefined();
|
|
44
|
+
|
|
45
|
+
// getTargetDXN - works with both.
|
|
46
|
+
expect(Relation.getTargetDXN(rel)).toBeDefined();
|
|
47
|
+
expect(Relation.getTargetDXN(snapshot)).toBeDefined();
|
|
48
|
+
|
|
49
|
+
// getSource - works with both.
|
|
50
|
+
expect(Relation.getSource(rel)).toBeDefined();
|
|
51
|
+
expect(Relation.getSource(snapshot)).toBeDefined();
|
|
52
|
+
|
|
53
|
+
// getTarget - works with both.
|
|
54
|
+
expect(Relation.getTarget(rel)).toBeDefined();
|
|
55
|
+
expect(Relation.getTarget(snapshot)).toBeDefined();
|
|
56
|
+
|
|
57
|
+
// getDXN - works with both.
|
|
58
|
+
expect(Relation.getDXN(rel)).toBeDefined();
|
|
59
|
+
expect(Relation.getDXN(snapshot)).toBeDefined();
|
|
60
|
+
|
|
61
|
+
// getTypename - works with both.
|
|
62
|
+
expect(Relation.getTypename(rel)).toBe('example.com/type/HasManager');
|
|
63
|
+
expect(Relation.getTypename(snapshot)).toBe('example.com/type/HasManager');
|
|
64
|
+
|
|
65
|
+
// getMeta - works with both.
|
|
66
|
+
expect(Relation.getMeta(rel)).toBeDefined();
|
|
67
|
+
expect(Relation.getMeta(snapshot)).toBeDefined();
|
|
68
|
+
|
|
69
|
+
// isDeleted - works with both.
|
|
70
|
+
expect(Relation.isDeleted(rel)).toBe(false);
|
|
71
|
+
expect(Relation.isDeleted(snapshot)).toBe(false);
|
|
72
|
+
|
|
73
|
+
// version - works with both.
|
|
74
|
+
expect(Relation.version(rel)).toBeDefined();
|
|
75
|
+
expect(Relation.version(snapshot)).toBeDefined();
|
|
76
|
+
|
|
77
|
+
// toJSON - works with both.
|
|
78
|
+
expect(Relation.toJSON(rel)).toBeDefined();
|
|
79
|
+
expect(Relation.toJSON(snapshot)).toBeDefined();
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
});
|