@dxos/echo 0.8.4-main.84f28bd → 0.8.4-main.937b3ca
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -3
- package/dist/lib/browser/Annotation.mjs +33 -0
- package/dist/lib/browser/Annotation.mjs.map +7 -0
- package/dist/lib/browser/Database.mjs +18 -0
- package/dist/lib/browser/Database.mjs.map +7 -0
- package/dist/lib/browser/Entity.mjs +52 -0
- package/dist/lib/browser/Entity.mjs.map +7 -0
- package/dist/lib/browser/Err.mjs +11 -0
- package/dist/lib/browser/Err.mjs.map +7 -0
- package/dist/lib/browser/Filter.mjs +62 -0
- package/dist/lib/browser/Filter.mjs.map +7 -0
- package/dist/lib/browser/Format.mjs +67 -0
- package/dist/lib/browser/Format.mjs.map +7 -0
- package/dist/lib/browser/JsonSchema.mjs +20 -0
- package/dist/lib/browser/JsonSchema.mjs.map +7 -0
- package/dist/lib/browser/Key.mjs +13 -0
- package/dist/lib/browser/Key.mjs.map +7 -0
- package/dist/lib/browser/Obj.mjs +91 -0
- package/dist/lib/browser/Obj.mjs.map +7 -0
- package/dist/lib/browser/Order.mjs +13 -0
- package/dist/lib/browser/Order.mjs.map +7 -0
- package/dist/lib/browser/Query.mjs +27 -0
- package/dist/lib/browser/Query.mjs.map +7 -0
- package/dist/lib/browser/QueryResult.mjs +3 -0
- package/dist/lib/browser/QueryResult.mjs.map +7 -0
- package/dist/lib/browser/Ref.mjs +23 -0
- package/dist/lib/browser/Ref.mjs.map +7 -0
- package/dist/lib/browser/Relation.mjs +85 -0
- package/dist/lib/browser/Relation.mjs.map +7 -0
- package/dist/lib/browser/SchemaRegistry.mjs +3 -0
- package/dist/lib/browser/SchemaRegistry.mjs.map +7 -0
- package/dist/lib/browser/Tag.mjs +26 -0
- package/dist/lib/browser/Tag.mjs.map +7 -0
- package/dist/lib/browser/Type.mjs +48 -0
- package/dist/lib/browser/Type.mjs.map +7 -0
- package/dist/lib/browser/chunk-22JMFST2.mjs +24 -0
- package/dist/lib/browser/chunk-22JMFST2.mjs.map +7 -0
- package/dist/lib/browser/chunk-2SBB7OWV.mjs +250 -0
- package/dist/lib/browser/chunk-2SBB7OWV.mjs.map +7 -0
- package/dist/lib/browser/chunk-6L5HHUVU.mjs +158 -0
- package/dist/lib/browser/chunk-6L5HHUVU.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-BJPE6CIC.mjs +3847 -0
- package/dist/lib/browser/chunk-BJPE6CIC.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-FRDT7RA4.mjs +403 -0
- package/dist/lib/browser/chunk-FRDT7RA4.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-KQQGVHFN.mjs +143 -0
- package/dist/lib/browser/chunk-KQQGVHFN.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-NOPVNWPT.mjs +204 -0
- package/dist/lib/browser/chunk-NOPVNWPT.mjs.map +7 -0
- package/dist/lib/browser/chunk-PQZW3S6L.mjs +74 -0
- package/dist/lib/browser/chunk-PQZW3S6L.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-U2J7TA7K.mjs +57 -0
- package/dist/lib/browser/chunk-U2J7TA7K.mjs.map +7 -0
- package/dist/lib/browser/chunk-W5D2GWAW.mjs +98 -0
- package/dist/lib/browser/chunk-W5D2GWAW.mjs.map +7 -0
- package/dist/lib/browser/chunk-XDIUHAAX.mjs +41 -0
- package/dist/lib/browser/chunk-XDIUHAAX.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-ZAGAOZVY.mjs +288 -0
- package/dist/lib/browser/chunk-ZAGAOZVY.mjs.map +7 -0
- package/dist/lib/browser/chunk-ZHXZGIXD.mjs +9 -0
- package/dist/lib/browser/chunk-ZHXZGIXD.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +72 -9
- package/dist/lib/browser/internal/index.mjs +457 -0
- package/dist/lib/browser/internal/index.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +332 -35
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/node-esm/Annotation.mjs +33 -0
- package/dist/lib/node-esm/Annotation.mjs.map +7 -0
- package/dist/lib/node-esm/Database.mjs +18 -0
- package/dist/lib/node-esm/Database.mjs.map +7 -0
- package/dist/lib/node-esm/Entity.mjs +52 -0
- package/dist/lib/node-esm/Entity.mjs.map +7 -0
- package/dist/lib/node-esm/Err.mjs +11 -0
- package/dist/lib/node-esm/Err.mjs.map +7 -0
- package/dist/lib/node-esm/Filter.mjs +62 -0
- package/dist/lib/node-esm/Filter.mjs.map +7 -0
- package/dist/lib/node-esm/Format.mjs +67 -0
- package/dist/lib/node-esm/Format.mjs.map +7 -0
- package/dist/lib/node-esm/JsonSchema.mjs +20 -0
- package/dist/lib/node-esm/JsonSchema.mjs.map +7 -0
- package/dist/lib/node-esm/Key.mjs +13 -0
- package/dist/lib/node-esm/Key.mjs.map +7 -0
- package/dist/lib/node-esm/Obj.mjs +91 -0
- package/dist/lib/node-esm/Obj.mjs.map +7 -0
- package/dist/lib/node-esm/Order.mjs +13 -0
- package/dist/lib/node-esm/Order.mjs.map +7 -0
- package/dist/lib/node-esm/Query.mjs +27 -0
- package/dist/lib/node-esm/Query.mjs.map +7 -0
- package/dist/lib/node-esm/QueryResult.mjs +3 -0
- package/dist/lib/node-esm/QueryResult.mjs.map +7 -0
- package/dist/lib/node-esm/Ref.mjs +23 -0
- package/dist/lib/node-esm/Ref.mjs.map +7 -0
- package/dist/lib/node-esm/Relation.mjs +85 -0
- package/dist/lib/node-esm/Relation.mjs.map +7 -0
- package/dist/lib/node-esm/SchemaRegistry.mjs +3 -0
- package/dist/lib/node-esm/SchemaRegistry.mjs.map +7 -0
- package/dist/lib/node-esm/Tag.mjs +26 -0
- package/dist/lib/node-esm/Tag.mjs.map +7 -0
- package/dist/lib/node-esm/Type.mjs +48 -0
- package/dist/lib/node-esm/Type.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-4PNXQA64.mjs +250 -0
- package/dist/lib/node-esm/chunk-4PNXQA64.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-5OBN7GZW.mjs +158 -0
- package/dist/lib/node-esm/chunk-5OBN7GZW.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-ANLVLWME.mjs +98 -0
- package/dist/lib/node-esm/chunk-ANLVLWME.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-DMR7OAFK.mjs +57 -0
- package/dist/lib/node-esm/chunk-DMR7OAFK.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-ILMLLM4R.mjs +204 -0
- package/dist/lib/node-esm/chunk-ILMLLM4R.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-LT3H4JOX.mjs +3847 -0
- package/dist/lib/node-esm/chunk-LT3H4JOX.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-NRN3ZW2T.mjs +143 -0
- package/dist/lib/node-esm/chunk-NRN3ZW2T.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-QLI2EIJ2.mjs +41 -0
- package/dist/lib/node-esm/chunk-QLI2EIJ2.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-QYR67VBV.mjs +288 -0
- package/dist/lib/node-esm/chunk-QYR67VBV.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-W6QIEBTQ.mjs +403 -0
- package/dist/lib/node-esm/chunk-W6QIEBTQ.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-Y75VU7LB.mjs +74 -0
- package/dist/lib/node-esm/chunk-Y75VU7LB.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/chunk-ZBB67AKD.mjs +24 -0
- package/dist/lib/node-esm/chunk-ZBB67AKD.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +72 -9
- package/dist/lib/node-esm/internal/index.mjs +457 -0
- package/dist/lib/node-esm/internal/index.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +332 -35
- package/dist/lib/node-esm/testing/index.mjs.map +4 -4
- package/dist/types/src/Annotation.d.ts +2 -0
- package/dist/types/src/Annotation.d.ts.map +1 -0
- package/dist/types/src/Database.d.ts +194 -0
- package/dist/types/src/Database.d.ts.map +1 -0
- package/dist/types/src/Entity.d.ts +142 -0
- package/dist/types/src/Entity.d.ts.map +1 -0
- package/dist/types/src/Entity.test.d.ts +2 -0
- package/dist/types/src/Entity.test.d.ts.map +1 -0
- package/dist/types/src/Err.d.ts +64 -0
- package/dist/types/src/Err.d.ts.map +1 -0
- package/dist/types/src/Filter.d.ts +120 -0
- package/dist/types/src/Filter.d.ts.map +1 -0
- package/dist/types/src/Format.d.ts +4 -0
- package/dist/types/src/Format.d.ts.map +1 -0
- package/dist/types/src/Hypergraph.d.ts +60 -0
- package/dist/types/src/Hypergraph.d.ts.map +1 -0
- package/dist/types/src/JsonSchema.d.ts +9 -0
- package/dist/types/src/JsonSchema.d.ts.map +1 -0
- package/dist/types/src/Key.d.ts +1 -0
- package/dist/types/src/Key.d.ts.map +1 -1
- package/dist/types/src/Obj.d.ts +344 -34
- package/dist/types/src/Obj.d.ts.map +1 -1
- package/dist/types/src/Obj.test.d.ts +2 -0
- package/dist/types/src/Obj.test.d.ts.map +1 -0
- package/dist/types/src/Order.d.ts +16 -0
- package/dist/types/src/Order.d.ts.map +1 -0
- package/dist/types/src/Query.d.ts +115 -0
- package/dist/types/src/Query.d.ts.map +1 -0
- package/dist/types/src/Query.test.d.ts +2 -0
- package/dist/types/src/Query.test.d.ts.map +1 -0
- package/dist/types/src/QueryResult.d.ts +80 -0
- package/dist/types/src/QueryResult.d.ts.map +1 -0
- package/dist/types/src/Ref.d.ts +13 -11
- package/dist/types/src/Ref.d.ts.map +1 -1
- package/dist/types/src/Relation.d.ts +242 -19
- package/dist/types/src/Relation.d.ts.map +1 -1
- package/dist/types/src/Relation.test.d.ts +2 -0
- package/dist/types/src/Relation.test.d.ts.map +1 -0
- package/dist/types/src/SchemaRegistry.d.ts +84 -0
- package/dist/types/src/SchemaRegistry.d.ts.map +1 -0
- package/dist/types/src/Tag.d.ts +17 -0
- package/dist/types/src/Tag.d.ts.map +1 -0
- package/dist/types/src/Type.d.ts +225 -73
- package/dist/types/src/Type.d.ts.map +1 -1
- package/dist/types/src/Type.test.d.ts +2 -0
- package/dist/types/src/Type.test.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +15 -3
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/internal/annotations/annotations.d.ts +170 -0
- package/dist/types/src/internal/annotations/annotations.d.ts.map +1 -0
- package/dist/types/src/internal/annotations/annotations.test.d.ts +2 -0
- package/dist/types/src/internal/annotations/annotations.test.d.ts.map +1 -0
- package/dist/types/src/internal/annotations/index.d.ts +3 -0
- package/dist/types/src/internal/annotations/index.d.ts.map +1 -0
- package/dist/types/src/internal/annotations/util.d.ts +27 -0
- package/dist/types/src/internal/annotations/util.d.ts.map +1 -0
- package/dist/types/src/internal/api/annotations.d.ts +23 -0
- package/dist/types/src/internal/api/annotations.d.ts.map +1 -0
- package/dist/types/src/internal/api/entity.d.ts +13 -0
- package/dist/types/src/internal/api/entity.d.ts.map +1 -0
- package/dist/types/src/internal/api/index.d.ts +15 -0
- package/dist/types/src/internal/api/index.d.ts.map +1 -0
- package/dist/types/src/internal/api/meta.d.ts +42 -0
- package/dist/types/src/internal/api/meta.d.ts.map +1 -0
- package/dist/types/src/internal/api/sorting.d.ts +24 -0
- package/dist/types/src/internal/api/sorting.d.ts.map +1 -0
- package/dist/types/src/internal/api/version.d.ts +42 -0
- package/dist/types/src/internal/api/version.d.ts.map +1 -0
- package/dist/types/src/internal/entities/entity.d.ts +20 -0
- package/dist/types/src/internal/entities/entity.d.ts.map +1 -0
- package/dist/types/src/internal/entities/index.d.ts +6 -0
- package/dist/types/src/internal/entities/index.d.ts.map +1 -0
- package/dist/types/src/internal/entities/model.d.ts +77 -0
- package/dist/types/src/internal/entities/model.d.ts.map +1 -0
- package/dist/types/src/internal/entities/object.d.ts +18 -0
- package/dist/types/src/internal/entities/object.d.ts.map +1 -0
- package/dist/types/src/internal/entities/relation.d.ts +62 -0
- package/dist/types/src/internal/entities/relation.d.ts.map +1 -0
- package/dist/types/src/internal/entities/util.d.ts +2 -0
- package/dist/types/src/internal/entities/util.d.ts.map +1 -0
- package/dist/types/src/internal/formats/date.d.ts +63 -0
- package/dist/types/src/internal/formats/date.d.ts.map +1 -0
- package/dist/types/src/internal/formats/date.test.d.ts +2 -0
- package/dist/types/src/internal/formats/date.test.d.ts.map +1 -0
- package/dist/types/src/internal/formats/format.d.ts +32 -0
- package/dist/types/src/internal/formats/format.d.ts.map +1 -0
- package/dist/types/src/internal/formats/format.test.d.ts +2 -0
- package/dist/types/src/internal/formats/format.test.d.ts.map +1 -0
- package/dist/types/src/internal/formats/index.d.ts +8 -0
- package/dist/types/src/internal/formats/index.d.ts.map +1 -0
- package/dist/types/src/internal/formats/number.d.ts +31 -0
- package/dist/types/src/internal/formats/number.d.ts.map +1 -0
- package/dist/types/src/internal/formats/object.d.ts +35 -0
- package/dist/types/src/internal/formats/object.d.ts.map +1 -0
- package/dist/types/src/internal/formats/select.d.ts +13 -0
- package/dist/types/src/internal/formats/select.d.ts.map +1 -0
- package/dist/types/src/internal/formats/string.d.ts +42 -0
- package/dist/types/src/internal/formats/string.d.ts.map +1 -0
- package/dist/types/src/internal/formats/types.d.ts +72 -0
- package/dist/types/src/internal/formats/types.d.ts.map +1 -0
- package/dist/types/src/internal/index.d.ts +12 -0
- package/dist/types/src/internal/index.d.ts.map +1 -0
- package/dist/types/src/internal/json-schema/annotations.d.ts +19 -0
- package/dist/types/src/internal/json-schema/annotations.d.ts.map +1 -0
- package/dist/types/src/internal/json-schema/effect-schema.test.d.ts +2 -0
- package/dist/types/src/internal/json-schema/effect-schema.test.d.ts.map +1 -0
- package/dist/types/src/internal/json-schema/index.d.ts +5 -0
- package/dist/types/src/internal/json-schema/index.d.ts.map +1 -0
- package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts +7 -0
- package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts.map +1 -0
- package/dist/types/src/internal/json-schema/json-schema-type.d.ts +250 -0
- package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +1 -0
- package/dist/types/src/internal/json-schema/json-schema.d.ts +29 -0
- package/dist/types/src/internal/json-schema/json-schema.d.ts.map +1 -0
- package/dist/types/src/internal/json-schema/json-schema.test.d.ts +2 -0
- package/dist/types/src/internal/json-schema/json-schema.test.d.ts.map +1 -0
- package/dist/types/src/internal/object/clone.d.ts +8 -0
- package/dist/types/src/internal/object/clone.d.ts.map +1 -0
- package/dist/types/src/internal/object/common.d.ts +18 -0
- package/dist/types/src/internal/object/common.d.ts.map +1 -0
- package/dist/types/src/internal/object/create-object.d.ts +39 -0
- package/dist/types/src/internal/object/create-object.d.ts.map +1 -0
- package/dist/types/src/internal/object/create-object.test.d.ts +2 -0
- package/dist/types/src/internal/object/create-object.test.d.ts.map +1 -0
- package/dist/types/src/internal/object/deleted.d.ts +6 -0
- package/dist/types/src/internal/object/deleted.d.ts.map +1 -0
- package/dist/types/src/internal/object/ids.d.ts +6 -0
- package/dist/types/src/internal/object/ids.d.ts.map +1 -0
- package/dist/types/src/internal/object/index.d.ts +11 -0
- package/dist/types/src/internal/object/index.d.ts.map +1 -0
- package/dist/types/src/internal/object/inspect.d.ts +2 -0
- package/dist/types/src/internal/object/inspect.d.ts.map +1 -0
- package/dist/types/src/internal/object/json-serializer.d.ts +37 -0
- package/dist/types/src/internal/object/json-serializer.d.ts.map +1 -0
- package/dist/types/src/internal/object/json-serializer.test.d.ts +2 -0
- package/dist/types/src/internal/object/json-serializer.test.d.ts.map +1 -0
- package/dist/types/src/internal/object/schema-validator.d.ts +2 -0
- package/dist/types/src/internal/object/schema-validator.d.ts.map +1 -0
- package/dist/types/src/internal/object/schema-validator.test.d.ts +2 -0
- package/dist/types/src/internal/object/schema-validator.test.d.ts.map +1 -0
- package/dist/types/src/internal/object/set-value.d.ts +7 -0
- package/dist/types/src/internal/object/set-value.d.ts.map +1 -0
- package/dist/types/src/internal/object/set-value.test.d.ts +2 -0
- package/dist/types/src/internal/object/set-value.test.d.ts.map +1 -0
- package/dist/types/src/internal/object/snapshot.d.ts +6 -0
- package/dist/types/src/internal/object/snapshot.d.ts.map +1 -0
- package/dist/types/src/internal/object/typed-object.d.ts +25 -0
- package/dist/types/src/internal/object/typed-object.d.ts.map +1 -0
- package/dist/types/src/internal/object/typed-object.test.d.ts +2 -0
- package/dist/types/src/internal/object/typed-object.test.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/change-context.d.ts +55 -0
- package/dist/types/src/internal/proxy/change-context.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/change.test.d.ts +2 -0
- package/dist/types/src/internal/proxy/change.test.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/define-hidden-property.d.ts +5 -0
- package/dist/types/src/internal/proxy/define-hidden-property.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/errors.d.ts +19 -0
- package/dist/types/src/internal/proxy/errors.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/event-batch.d.ts +10 -0
- package/dist/types/src/internal/proxy/event-batch.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/handler.test.d.ts +2 -0
- package/dist/types/src/internal/proxy/handler.test.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/index.d.ts +14 -0
- package/dist/types/src/internal/proxy/index.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/json-serializer.d.ts +6 -0
- package/dist/types/src/internal/proxy/json-serializer.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/make-object.d.ts +14 -0
- package/dist/types/src/internal/proxy/make-object.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/ownership.d.ts +57 -0
- package/dist/types/src/internal/proxy/ownership.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/proxy-types.d.ts +18 -0
- package/dist/types/src/internal/proxy/proxy-types.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/proxy-utils.d.ts +47 -0
- package/dist/types/src/internal/proxy/proxy-utils.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/reactive-array.d.ts +8 -0
- package/dist/types/src/internal/proxy/reactive-array.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/reactive.d.ts +39 -0
- package/dist/types/src/internal/proxy/reactive.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/schema-validator.d.ts +15 -0
- package/dist/types/src/internal/proxy/schema-validator.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/schema.test.d.ts +2 -0
- package/dist/types/src/internal/proxy/schema.test.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/symbols.d.ts +3 -0
- package/dist/types/src/internal/proxy/symbols.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/typed-handler.d.ts +47 -0
- package/dist/types/src/internal/proxy/typed-handler.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/typed-handler.test.d.ts +2 -0
- package/dist/types/src/internal/proxy/typed-handler.test.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/typed-object.test.d.ts +2 -0
- package/dist/types/src/internal/proxy/typed-object.test.d.ts.map +1 -0
- package/dist/types/src/internal/ref/index.d.ts +3 -0
- package/dist/types/src/internal/ref/index.d.ts.map +1 -0
- package/dist/types/src/internal/ref/ref-array.d.ts +21 -0
- package/dist/types/src/internal/ref/ref-array.d.ts.map +1 -0
- package/dist/types/src/internal/ref/ref.d.ts +217 -0
- package/dist/types/src/internal/ref/ref.d.ts.map +1 -0
- package/dist/types/src/internal/ref/ref.test.d.ts +2 -0
- package/dist/types/src/internal/ref/ref.test.d.ts.map +1 -0
- package/dist/types/src/internal/schema/compose.d.ts +6 -0
- package/dist/types/src/internal/schema/compose.d.ts.map +1 -0
- package/dist/types/src/internal/schema/compose.test.d.ts +2 -0
- package/dist/types/src/internal/schema/compose.test.d.ts.map +1 -0
- package/dist/types/src/internal/schema/echo-schema.d.ts +180 -0
- package/dist/types/src/internal/schema/echo-schema.d.ts.map +1 -0
- package/dist/types/src/internal/schema/index.d.ts +4 -0
- package/dist/types/src/internal/schema/index.d.ts.map +1 -0
- package/dist/types/src/internal/schema/manipulation.d.ts +10 -0
- package/dist/types/src/internal/schema/manipulation.d.ts.map +1 -0
- package/dist/types/src/internal/schema/persistent-schema.d.ts +20 -0
- package/dist/types/src/internal/schema/persistent-schema.d.ts.map +1 -0
- package/dist/types/src/internal/types/base.d.ts +26 -0
- package/dist/types/src/internal/types/base.d.ts.map +1 -0
- package/dist/types/src/internal/types/entity.d.ts +37 -0
- package/dist/types/src/internal/types/entity.d.ts.map +1 -0
- package/dist/types/src/internal/types/index.d.ts +6 -0
- package/dist/types/src/internal/types/index.d.ts.map +1 -0
- package/dist/types/src/internal/types/meta.d.ts +32 -0
- package/dist/types/src/internal/types/meta.d.ts.map +1 -0
- package/dist/types/src/internal/types/typename.d.ts +13 -0
- package/dist/types/src/internal/types/typename.d.ts.map +1 -0
- package/dist/types/src/internal/types/version.d.ts +15 -0
- package/dist/types/src/internal/types/version.d.ts.map +1 -0
- package/dist/types/src/{test → testing}/api.test.d.ts.map +1 -1
- package/dist/types/src/testing/index.d.ts +3 -1
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/testing/test-data.d.ts +18 -0
- package/dist/types/src/testing/test-data.d.ts.map +1 -0
- package/dist/types/src/testing/test-schema.d.ts +303 -0
- package/dist/types/src/testing/test-schema.d.ts.map +1 -0
- package/dist/types/src/testing/util.d.ts +21 -0
- package/dist/types/src/testing/util.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +166 -33
- package/src/Annotation.ts +18 -0
- package/src/Database.ts +336 -0
- package/src/Entity.test.ts +22 -0
- package/src/Entity.ts +217 -0
- package/src/Err.ts +18 -0
- package/src/Filter.ts +376 -0
- package/src/Format.ts +9 -0
- package/src/Hypergraph.ts +74 -0
- package/src/JsonSchema.ts +16 -0
- package/src/Key.ts +3 -0
- package/src/Obj.test.ts +386 -0
- package/src/Obj.ts +509 -85
- package/src/Order.ts +44 -0
- package/src/Query.test.ts +465 -0
- package/src/Query.ts +296 -0
- package/src/QueryResult.ts +106 -0
- package/src/Ref.ts +25 -9
- package/src/Relation.test.ts +82 -0
- package/src/Relation.ts +414 -51
- package/src/SchemaRegistry.ts +105 -0
- package/src/Tag.ts +40 -0
- package/src/Type.test.ts +52 -0
- package/src/Type.ts +360 -112
- package/src/index.ts +17 -4
- package/src/internal/README.md +102 -0
- package/src/internal/annotations/annotations.test.ts +96 -0
- package/src/internal/annotations/annotations.ts +460 -0
- package/src/internal/annotations/index.ts +6 -0
- package/src/internal/annotations/util.ts +72 -0
- package/src/internal/api/annotations.ts +60 -0
- package/src/internal/api/entity.ts +29 -0
- package/src/internal/api/index.ts +19 -0
- package/src/internal/api/meta.ts +88 -0
- package/src/internal/api/sorting.ts +53 -0
- package/src/internal/api/version.ts +96 -0
- package/src/internal/entities/entity.ts +126 -0
- package/src/internal/entities/index.ts +9 -0
- package/src/internal/entities/model.ts +134 -0
- package/src/internal/entities/object.ts +60 -0
- package/src/internal/entities/relation.ts +173 -0
- package/src/internal/entities/util.ts +33 -0
- package/src/internal/formats/date.test.ts +56 -0
- package/src/internal/formats/date.ts +217 -0
- package/src/internal/formats/format.test.ts +77 -0
- package/src/internal/formats/format.ts +54 -0
- package/src/internal/formats/index.ts +12 -0
- package/src/internal/formats/number.ts +89 -0
- package/src/internal/formats/object.ts +80 -0
- package/src/internal/formats/select.ts +18 -0
- package/src/internal/formats/string.ts +81 -0
- package/src/internal/formats/types.ts +186 -0
- package/src/internal/index.ts +39 -0
- package/src/internal/json-schema/annotations.ts +50 -0
- package/src/internal/json-schema/effect-schema.test.ts +143 -0
- package/src/internal/json-schema/index.ts +8 -0
- package/src/internal/json-schema/json-schema-normalize.ts +109 -0
- package/src/internal/json-schema/json-schema-type.ts +404 -0
- package/src/internal/json-schema/json-schema.test.ts +861 -0
- package/src/internal/json-schema/json-schema.ts +528 -0
- package/src/internal/object/clone.ts +48 -0
- package/src/internal/object/common.ts +75 -0
- package/src/internal/object/create-object.test.ts +116 -0
- package/src/internal/object/create-object.ts +95 -0
- package/src/internal/object/deleted.ts +19 -0
- package/src/internal/object/ids.ts +12 -0
- package/src/internal/object/index.ts +14 -0
- package/src/internal/object/inspect.ts +46 -0
- package/src/internal/object/json-serializer.test.ts +97 -0
- package/src/internal/object/json-serializer.ts +188 -0
- package/src/internal/object/schema-validator.test.ts +186 -0
- package/src/internal/object/schema-validator.ts +6 -0
- package/src/internal/object/set-value.test.ts +281 -0
- package/src/internal/object/set-value.ts +165 -0
- package/src/internal/object/snapshot.ts +70 -0
- package/src/internal/object/typed-object.test.ts +34 -0
- package/src/internal/object/typed-object.ts +30 -0
- package/src/internal/proxy/change-context.ts +138 -0
- package/src/internal/proxy/change.test.ts +519 -0
- package/src/internal/proxy/define-hidden-property.ts +14 -0
- package/src/internal/proxy/errors.ts +42 -0
- package/src/internal/proxy/event-batch.ts +44 -0
- package/src/internal/proxy/handler.test.ts +123 -0
- package/src/internal/proxy/index.ts +17 -0
- package/src/internal/proxy/json-serializer.ts +87 -0
- package/src/internal/proxy/make-object.ts +96 -0
- package/src/internal/proxy/ownership.ts +253 -0
- package/src/internal/proxy/proxy-types.ts +23 -0
- package/src/internal/proxy/proxy-utils.ts +150 -0
- package/src/internal/proxy/reactive-array.ts +71 -0
- package/src/internal/proxy/reactive.ts +69 -0
- package/src/internal/proxy/schema-validator.ts +244 -0
- package/src/internal/proxy/schema.test.ts +145 -0
- package/src/internal/proxy/symbols.ts +7 -0
- package/src/internal/proxy/typed-handler.test.ts +318 -0
- package/src/internal/proxy/typed-handler.ts +442 -0
- package/src/internal/proxy/typed-object.test.ts +116 -0
- package/src/internal/ref/index.ts +6 -0
- package/src/internal/ref/ref-array.ts +39 -0
- package/src/internal/ref/ref.test.ts +101 -0
- package/src/internal/ref/ref.ts +548 -0
- package/src/internal/schema/compose.test.ts +42 -0
- package/src/internal/schema/compose.ts +36 -0
- package/src/internal/schema/echo-schema.ts +423 -0
- package/src/internal/schema/index.ts +7 -0
- package/src/internal/schema/manipulation.ts +92 -0
- package/src/internal/schema/persistent-schema.ts +27 -0
- package/src/internal/types/base.ts +43 -0
- package/src/internal/types/entity.ts +54 -0
- package/src/internal/types/index.ts +9 -0
- package/src/internal/types/meta.ts +66 -0
- package/src/internal/types/typename.ts +45 -0
- package/src/internal/types/version.ts +20 -0
- package/src/testing/api.test.ts +126 -0
- package/src/testing/index.ts +3 -1
- package/src/testing/test-data.ts +130 -0
- package/src/testing/test-schema.ts +238 -0
- package/src/testing/util.ts +85 -0
- package/dist/lib/browser/chunk-SVSJEELN.mjs +0 -619
- package/dist/lib/browser/chunk-SVSJEELN.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-53HXWYR6.mjs +0 -619
- package/dist/lib/node-esm/chunk-53HXWYR6.mjs.map +0 -7
- package/dist/types/src/experimental/database.d.ts +0 -8
- package/dist/types/src/experimental/database.d.ts.map +0 -1
- package/dist/types/src/experimental/index.d.ts +0 -1
- package/dist/types/src/experimental/index.d.ts.map +0 -1
- package/dist/types/src/experimental/queue.d.ts +0 -8
- package/dist/types/src/experimental/queue.d.ts.map +0 -1
- package/dist/types/src/experimental/space.d.ts +0 -8
- package/dist/types/src/experimental/space.d.ts.map +0 -1
- package/dist/types/src/query/dsl.d.ts +0 -218
- package/dist/types/src/query/dsl.d.ts.map +0 -1
- package/dist/types/src/query/dsl.test.d.ts +0 -2
- package/dist/types/src/query/dsl.test.d.ts.map +0 -1
- package/dist/types/src/query/index.d.ts +0 -2
- package/dist/types/src/query/index.d.ts.map +0 -1
- package/dist/types/src/testing/types.d.ts +0 -113
- package/dist/types/src/testing/types.d.ts.map +0 -1
- package/src/experimental/database.ts +0 -11
- package/src/experimental/index.ts +0 -7
- package/src/experimental/queue.ts +0 -11
- package/src/experimental/space.ts +0 -11
- package/src/query/dsl.test.ts +0 -323
- package/src/query/dsl.ts +0 -646
- package/src/query/index.ts +0 -5
- package/src/test/api.test.ts +0 -173
- package/src/testing/types.ts +0 -91
- /package/dist/types/src/{test → testing}/api.test.d.ts +0 -0
package/src/Entity.ts
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import type { ForeignKey } from '@dxos/echo-protocol';
|
|
6
|
+
import type { DXN, ObjectId } from '@dxos/keys';
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
type ChangeCallback,
|
|
10
|
+
EntityKind,
|
|
11
|
+
EntityKindSchema,
|
|
12
|
+
KindId,
|
|
13
|
+
type Mutable,
|
|
14
|
+
type ObjectJSON,
|
|
15
|
+
type ObjectMeta,
|
|
16
|
+
type ReadonlyMeta,
|
|
17
|
+
SnapshotKindId,
|
|
18
|
+
addTag as addTag$,
|
|
19
|
+
change as change$,
|
|
20
|
+
getDXN as getDXN$,
|
|
21
|
+
getDatabase as getDatabase$,
|
|
22
|
+
getDescription as getDescription$,
|
|
23
|
+
getEntityKind,
|
|
24
|
+
getKeys as getKeys$,
|
|
25
|
+
getLabel as getLabel$,
|
|
26
|
+
getMetaChecked as getMeta$,
|
|
27
|
+
getTypeDXN as getTypeDXN$,
|
|
28
|
+
getTypename as getTypename$,
|
|
29
|
+
isDeleted as isDeleted$,
|
|
30
|
+
removeTag as removeTag$,
|
|
31
|
+
subscribe as subscribe$,
|
|
32
|
+
objectToJSON as toJSON$,
|
|
33
|
+
} from './internal';
|
|
34
|
+
|
|
35
|
+
// Re-export KindId and SnapshotKindId from internal.
|
|
36
|
+
export { KindId, SnapshotKindId };
|
|
37
|
+
|
|
38
|
+
// NOTE: Relation does not extend Obj so that, for example, we can prevent Relations from being used as source and target objects.
|
|
39
|
+
// However, we generally refer to Obj and Relation instances as "objects",
|
|
40
|
+
// and many API methods accept both Obj.Unknown and Relation.Unknown (i.e., Entity.Unknown) instances.
|
|
41
|
+
|
|
42
|
+
export const Kind = EntityKind;
|
|
43
|
+
export type Kind = EntityKind;
|
|
44
|
+
export const KindSchema = EntityKindSchema;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Assigns a kind to an Object or Relation instance.
|
|
48
|
+
* NOTE: Needed to make `isRelation` and `isObject` checks work.
|
|
49
|
+
*/
|
|
50
|
+
export interface OfKind<K extends Kind> {
|
|
51
|
+
readonly [KindId]: K;
|
|
52
|
+
readonly id: ObjectId;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Assigns a snapshot kind to an Object or Relation snapshot.
|
|
57
|
+
*/
|
|
58
|
+
export interface SnapshotOfKind<K extends Kind> {
|
|
59
|
+
readonly [SnapshotKindId]: K;
|
|
60
|
+
readonly id: ObjectId;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Obj or Relation with a specific set of properties.
|
|
65
|
+
*/
|
|
66
|
+
export type Entity<Props> = OfKind<Kind> & Props;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Unknown Obj or Relation (reactive).
|
|
70
|
+
*/
|
|
71
|
+
export interface Unknown extends OfKind<Kind> {}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Snapshot of an Obj or Relation.
|
|
75
|
+
* Branded with SnapshotKindId instead of KindId.
|
|
76
|
+
*/
|
|
77
|
+
export interface Snapshot extends SnapshotOfKind<Kind> {}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Object with arbitrary properties.
|
|
81
|
+
*
|
|
82
|
+
* NOTE: Due to how typescript works, this type is not assignable to a specific schema type.
|
|
83
|
+
* In that case, use `Obj.instanceOf` to check if an object is of a specific type.
|
|
84
|
+
*
|
|
85
|
+
* This type is very permissive and allows accessing any property on the object.
|
|
86
|
+
* We should move to Obj.Unknown that is not permissive and requires explicit instanceof checks..
|
|
87
|
+
*/
|
|
88
|
+
export interface Any extends OfKind<Kind> {
|
|
89
|
+
[key: string]: unknown;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export const getKind = getEntityKind;
|
|
93
|
+
|
|
94
|
+
//
|
|
95
|
+
// Entity-level functions that work on any entity (object or relation).
|
|
96
|
+
// Use these when you don't know or care about the specific entity kind.
|
|
97
|
+
// For kind-specific functions, use Obj.* or Relation.*.
|
|
98
|
+
//
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* JSON representation of an entity.
|
|
102
|
+
*/
|
|
103
|
+
export type JSON = ObjectJSON;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Get the DXN of an entity (object or relation).
|
|
107
|
+
*/
|
|
108
|
+
export const getDXN = (entity: Unknown | Snapshot): DXN => getDXN$(entity);
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Get the DXN of an entity's type.
|
|
112
|
+
*/
|
|
113
|
+
export const getTypeDXN = getTypeDXN$;
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Get the typename of an entity's type.
|
|
117
|
+
*/
|
|
118
|
+
export const getTypename = (entity: Unknown | Snapshot): string | undefined => getTypename$(entity);
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Get the database an entity belongs to.
|
|
122
|
+
*/
|
|
123
|
+
export const getDatabase = (entity: Unknown | Snapshot): any | undefined => getDatabase$(entity);
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Get the metadata for an entity.
|
|
127
|
+
* Returns mutable meta when passed a mutable entity (inside change callback).
|
|
128
|
+
* Returns read-only meta when passed a regular entity or snapshot.
|
|
129
|
+
*/
|
|
130
|
+
// TODO(wittjosiah): When passed a Snapshot, should return a snapshot of meta, not the live meta proxy.
|
|
131
|
+
export function getMeta(entity: Mutable<Unknown>): ObjectMeta;
|
|
132
|
+
export function getMeta(entity: Unknown | Snapshot): ReadonlyMeta;
|
|
133
|
+
export function getMeta(entity: Unknown | Snapshot | Mutable<Unknown>): ObjectMeta | ReadonlyMeta {
|
|
134
|
+
return getMeta$(entity);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Get foreign keys for an entity from the specified source.
|
|
139
|
+
*/
|
|
140
|
+
export const getKeys = (entity: Unknown | Snapshot, source: string): ForeignKey[] => getKeys$(entity, source);
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Check if an entity is deleted.
|
|
144
|
+
*/
|
|
145
|
+
export const isDeleted = (entity: Unknown | Snapshot): boolean => isDeleted$(entity);
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Get the label of an entity.
|
|
149
|
+
*/
|
|
150
|
+
export const getLabel = (entity: Unknown | Snapshot): string | undefined => getLabel$(entity);
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Get the description of an entity.
|
|
154
|
+
*/
|
|
155
|
+
export const getDescription = (entity: Unknown | Snapshot): string | undefined => getDescription$(entity);
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Convert an entity to its JSON representation.
|
|
159
|
+
*/
|
|
160
|
+
export const toJSON = (entity: Unknown | Snapshot): JSON => toJSON$(entity);
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Subscribe to changes on an entity (object or relation).
|
|
164
|
+
* @returns Unsubscribe function.
|
|
165
|
+
*/
|
|
166
|
+
export const subscribe = (entity: Unknown, callback: () => void): (() => void) => {
|
|
167
|
+
return subscribe$(entity, callback);
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
//
|
|
171
|
+
// Change
|
|
172
|
+
//
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Used to provide a mutable view of an entity within `Entity.change`.
|
|
176
|
+
*/
|
|
177
|
+
export type { Mutable };
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Perform mutations on an entity (object or relation) within a change context.
|
|
181
|
+
*
|
|
182
|
+
* Entities are read-only by default. Mutations are batched and notifications fire
|
|
183
|
+
* when the callback completes. Direct mutations outside of `Entity.change` will throw
|
|
184
|
+
* at runtime.
|
|
185
|
+
*
|
|
186
|
+
* @param entity - The echo entity (object or relation) to mutate.
|
|
187
|
+
* @param callback - Receives a mutable view of the entity. All mutations must occur here.
|
|
188
|
+
*
|
|
189
|
+
* @example
|
|
190
|
+
* ```typescript
|
|
191
|
+
* // Mutate within Entity.change
|
|
192
|
+
* Entity.change(entity, (e) => {
|
|
193
|
+
* e.name = 'Updated';
|
|
194
|
+
* e.count = 42;
|
|
195
|
+
* });
|
|
196
|
+
*
|
|
197
|
+
* // Direct mutation throws
|
|
198
|
+
* entity.name = 'Bob'; // Error: Cannot modify outside Entity.change()
|
|
199
|
+
* ```
|
|
200
|
+
*
|
|
201
|
+
* Note: For type-specific operations, prefer `Obj.change` or `Relation.change`.
|
|
202
|
+
*/
|
|
203
|
+
export const change = <T extends Unknown>(entity: T, callback: ChangeCallback<T>): void => {
|
|
204
|
+
change$(entity, callback);
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Add a tag to an entity.
|
|
209
|
+
* Must be called within an `Entity.change`, `Obj.change`, or `Relation.change` callback.
|
|
210
|
+
*/
|
|
211
|
+
export const addTag = (entity: Mutable<Unknown>, tag: string): void => addTag$(entity, tag);
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Remove a tag from an entity.
|
|
215
|
+
* Must be called within an `Entity.change`, `Obj.change`, or `Relation.change` callback.
|
|
216
|
+
*/
|
|
217
|
+
export const removeTag = (entity: Mutable<Unknown>, tag: string): void => removeTag$(entity, tag);
|
package/src/Err.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { BaseError, type BaseErrorOptions } from '@dxos/errors';
|
|
6
|
+
import { type DXN } from '@dxos/keys';
|
|
7
|
+
|
|
8
|
+
export class SchemaNotFoundError extends BaseError.extend('SchemaNotFoundError', 'Schema not found') {
|
|
9
|
+
constructor(schema: string, options?: BaseErrorOptions) {
|
|
10
|
+
super({ context: { schema }, ...options });
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export class ObjectNotFoundError extends BaseError.extend('ObjectNotFoundError', 'Object not found') {
|
|
15
|
+
constructor(dxn: DXN, options?: BaseErrorOptions) {
|
|
16
|
+
super({ context: { dxn }, ...options });
|
|
17
|
+
}
|
|
18
|
+
}
|
package/src/Filter.ts
ADDED
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Match from 'effect/Match';
|
|
6
|
+
import * as Schema from 'effect/Schema';
|
|
7
|
+
import type * as Types from 'effect/Types';
|
|
8
|
+
|
|
9
|
+
import { type ForeignKey, type QueryAST } from '@dxos/echo-protocol';
|
|
10
|
+
import { assertArgument } from '@dxos/invariant';
|
|
11
|
+
import { DXN, ObjectId } from '@dxos/keys';
|
|
12
|
+
|
|
13
|
+
import { getTypeDXNFromSpecifier } from './internal';
|
|
14
|
+
import * as Ref from './Ref';
|
|
15
|
+
|
|
16
|
+
export interface Filter<T> {
|
|
17
|
+
// TODO(dmaretskyi): See new effect-schema approach to variance.
|
|
18
|
+
'~Filter': { value: Types.Contravariant<T> };
|
|
19
|
+
|
|
20
|
+
ast: QueryAST.Filter;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export type Props<T> = {
|
|
24
|
+
// Predicate or a value as a shorthand for `eq`.
|
|
25
|
+
[K in keyof T & string]?: Filter<T[K]> | T[K];
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export type Any = Filter<any>;
|
|
29
|
+
|
|
30
|
+
export type Type<F extends Any> = F extends Filter<infer T> ? T : never;
|
|
31
|
+
|
|
32
|
+
class FilterClass implements Any {
|
|
33
|
+
private static variance: Any['~Filter'] = {} as Any['~Filter'];
|
|
34
|
+
|
|
35
|
+
constructor(public readonly ast: QueryAST.Filter) {}
|
|
36
|
+
|
|
37
|
+
'~Filter' = FilterClass.variance;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export const is = (value: unknown): value is Any => {
|
|
41
|
+
return typeof value === 'object' && value !== null && '~Filter' in value;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/** Construct a filter from an ast. */
|
|
45
|
+
export const fromAst = (ast: QueryAST.Filter): Any => {
|
|
46
|
+
return new FilterClass(ast);
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Filter that matches all objects.
|
|
51
|
+
*/
|
|
52
|
+
// TODO(dmaretskyi): `Entity.Any` would be more type-safe, but causes annoying errors in existing code
|
|
53
|
+
export const everything = (): FilterClass => {
|
|
54
|
+
return new FilterClass({
|
|
55
|
+
type: 'object',
|
|
56
|
+
typename: null,
|
|
57
|
+
props: {},
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Filter that matches no objects.
|
|
63
|
+
*/
|
|
64
|
+
export const nothing = (): FilterClass => {
|
|
65
|
+
return new FilterClass({
|
|
66
|
+
type: 'not',
|
|
67
|
+
filter: {
|
|
68
|
+
type: 'object',
|
|
69
|
+
typename: null,
|
|
70
|
+
props: {},
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
/*
|
|
76
|
+
* Filter by ObjectId.
|
|
77
|
+
*/
|
|
78
|
+
export const id = (...ids: ObjectId[]): Any => {
|
|
79
|
+
assertArgument(
|
|
80
|
+
ids.every((id) => ObjectId.isValid(id)),
|
|
81
|
+
'ids',
|
|
82
|
+
'ids must be valid',
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
if (ids.length === 0) {
|
|
86
|
+
return nothing();
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return new FilterClass({
|
|
90
|
+
type: 'object',
|
|
91
|
+
typename: null,
|
|
92
|
+
id: ids,
|
|
93
|
+
props: {},
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Filter by type.
|
|
99
|
+
*/
|
|
100
|
+
export const type = <S extends Schema.Schema.All>(
|
|
101
|
+
schema: S | string,
|
|
102
|
+
props?: Props<Schema.Schema.Type<S>>,
|
|
103
|
+
): Filter<Schema.Schema.Type<S>> => {
|
|
104
|
+
const dxn = getTypeDXNFromSpecifier(schema);
|
|
105
|
+
return new FilterClass({
|
|
106
|
+
type: 'object',
|
|
107
|
+
typename: dxn.toString(),
|
|
108
|
+
...propsFilterToAst(props ?? {}),
|
|
109
|
+
});
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Filter by non-qualified typename.
|
|
114
|
+
*/
|
|
115
|
+
export const typename = (typename: string): Any => {
|
|
116
|
+
assertArgument(!typename.startsWith('dxn:'), 'typename', 'Typename must no be qualified');
|
|
117
|
+
return new FilterClass({
|
|
118
|
+
type: 'object',
|
|
119
|
+
typename: DXN.fromTypename(typename).toString(),
|
|
120
|
+
props: {},
|
|
121
|
+
});
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Filter by fully qualified type DXN.
|
|
126
|
+
*/
|
|
127
|
+
export const typeDXN = (dxn: DXN): Any => {
|
|
128
|
+
return new FilterClass({
|
|
129
|
+
type: 'object',
|
|
130
|
+
typename: dxn.toString(),
|
|
131
|
+
props: {},
|
|
132
|
+
});
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Filter by tag.
|
|
137
|
+
*/
|
|
138
|
+
export const tag = (tag: string): Any => {
|
|
139
|
+
return new FilterClass({
|
|
140
|
+
type: 'tag',
|
|
141
|
+
tag,
|
|
142
|
+
});
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Filter by properties.
|
|
147
|
+
*/
|
|
148
|
+
export const props = <T>(props: Props<T>): Filter<T> => {
|
|
149
|
+
return new FilterClass({
|
|
150
|
+
type: 'object',
|
|
151
|
+
typename: null,
|
|
152
|
+
...propsFilterToAst(props),
|
|
153
|
+
});
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
export type TextSearchOptions = {
|
|
157
|
+
// TODO(dmaretskyi): Hybrid search.
|
|
158
|
+
type?: 'full-text' | 'vector';
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Full-text or vector search.
|
|
163
|
+
*/
|
|
164
|
+
export const text = (
|
|
165
|
+
// TODO(dmaretskyi): Consider passing a vector here, but really the embedding should be done on the query-executor side.
|
|
166
|
+
text: string,
|
|
167
|
+
options?: TextSearchOptions,
|
|
168
|
+
): Any => {
|
|
169
|
+
return new FilterClass({
|
|
170
|
+
type: 'text-search',
|
|
171
|
+
text,
|
|
172
|
+
searchKind: options?.type,
|
|
173
|
+
});
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Filter by foreign keys.
|
|
178
|
+
*/
|
|
179
|
+
export const foreignKeys = <S extends Schema.Schema.All>(
|
|
180
|
+
schema: S | string,
|
|
181
|
+
keys: ForeignKey[],
|
|
182
|
+
): Filter<Schema.Schema.Type<S>> => {
|
|
183
|
+
const dxn = getTypeDXNFromSpecifier(schema);
|
|
184
|
+
return new FilterClass({
|
|
185
|
+
type: 'object',
|
|
186
|
+
typename: dxn.toString(),
|
|
187
|
+
props: {},
|
|
188
|
+
foreignKeys: keys,
|
|
189
|
+
});
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Predicate for property to be equal to the provided value.
|
|
194
|
+
*/
|
|
195
|
+
export const eq = <T>(value: T): Filter<T | undefined> => {
|
|
196
|
+
if (!Ref.isRef(value) && typeof value === 'object' && value !== null) {
|
|
197
|
+
throw new TypeError('Cannot use object as a value for eq filter');
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
return new FilterClass({
|
|
201
|
+
type: 'compare',
|
|
202
|
+
operator: 'eq',
|
|
203
|
+
value: Ref.isRef(value) ? value.noInline().encode() : value,
|
|
204
|
+
});
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Predicate for property to be not equal to the provided value.
|
|
209
|
+
*/
|
|
210
|
+
export const neq = <T>(value: T): Filter<T | undefined> => {
|
|
211
|
+
return new FilterClass({
|
|
212
|
+
type: 'compare',
|
|
213
|
+
operator: 'neq',
|
|
214
|
+
value,
|
|
215
|
+
});
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Predicate for property to be greater than the provided value.
|
|
220
|
+
*/
|
|
221
|
+
export const gt = <T>(value: T): Filter<T | undefined> => {
|
|
222
|
+
return new FilterClass({
|
|
223
|
+
type: 'compare',
|
|
224
|
+
operator: 'gt',
|
|
225
|
+
value,
|
|
226
|
+
});
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Predicate for property to be greater than or equal to the provided value.
|
|
231
|
+
*/
|
|
232
|
+
export const gte = <T>(value: T): Filter<T | undefined> => {
|
|
233
|
+
return new FilterClass({
|
|
234
|
+
type: 'compare',
|
|
235
|
+
operator: 'gte',
|
|
236
|
+
value,
|
|
237
|
+
});
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Predicate for property to be less than the provided value.
|
|
242
|
+
*/
|
|
243
|
+
export const lt = <T>(value: T): Filter<T | undefined> => {
|
|
244
|
+
return new FilterClass({
|
|
245
|
+
type: 'compare',
|
|
246
|
+
operator: 'lt',
|
|
247
|
+
value,
|
|
248
|
+
});
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Predicate for property to be less than or equal to the provided value.
|
|
253
|
+
*/
|
|
254
|
+
export const lte = <T>(value: T): Filter<T | undefined> => {
|
|
255
|
+
return new FilterClass({
|
|
256
|
+
type: 'compare',
|
|
257
|
+
operator: 'lte',
|
|
258
|
+
value,
|
|
259
|
+
});
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Predicate for property to be in the provided array.
|
|
264
|
+
* @param values - Values to check against.
|
|
265
|
+
*/
|
|
266
|
+
const in$ = <T>(...values: T[]): Filter<T | undefined> => {
|
|
267
|
+
return new FilterClass({
|
|
268
|
+
type: 'in',
|
|
269
|
+
values,
|
|
270
|
+
});
|
|
271
|
+
};
|
|
272
|
+
export { in$ as in };
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Predicate for an array property to contain the provided value.
|
|
276
|
+
* @param value - Value to check against.
|
|
277
|
+
*/
|
|
278
|
+
export const contains = <T>(value: T): Filter<readonly T[] | undefined> => {
|
|
279
|
+
return new FilterClass({
|
|
280
|
+
type: 'contains',
|
|
281
|
+
value,
|
|
282
|
+
});
|
|
283
|
+
};
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Predicate for property to be in the provided range.
|
|
287
|
+
* @param from - Start of the range (inclusive).
|
|
288
|
+
* @param to - End of the range (exclusive).
|
|
289
|
+
*/
|
|
290
|
+
export const between = <T>(from: T, to: T): Filter<unknown> => {
|
|
291
|
+
return new FilterClass({
|
|
292
|
+
type: 'range',
|
|
293
|
+
from,
|
|
294
|
+
to,
|
|
295
|
+
});
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Negate the filter.
|
|
300
|
+
*/
|
|
301
|
+
export const not = <F extends Any>(filter: F): Filter<Type<F>> => {
|
|
302
|
+
return new FilterClass({
|
|
303
|
+
type: 'not',
|
|
304
|
+
filter: filter.ast,
|
|
305
|
+
});
|
|
306
|
+
};
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Combine filters with a logical AND.
|
|
310
|
+
*/
|
|
311
|
+
export const and = <Filters extends readonly Any[]>(...filters: Filters): Filter<Type<Filters[number]>> => {
|
|
312
|
+
return new FilterClass({
|
|
313
|
+
type: 'and',
|
|
314
|
+
filters: filters.map((f) => f.ast),
|
|
315
|
+
});
|
|
316
|
+
};
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* Combine filters with a logical OR.
|
|
320
|
+
*/
|
|
321
|
+
export const or = <Filters extends readonly Any[]>(...filters: Filters): Filter<Type<Filters[number]>> => {
|
|
322
|
+
return new FilterClass({
|
|
323
|
+
type: 'or',
|
|
324
|
+
filters: filters.map((f) => f.ast),
|
|
325
|
+
});
|
|
326
|
+
};
|
|
327
|
+
|
|
328
|
+
// TODO(dmaretskyi): Add `Filter.match` to support pattern matching on string props.
|
|
329
|
+
|
|
330
|
+
const propsFilterToAst = (predicates: Props<any>): Pick<QueryAST.FilterObject, 'id' | 'props'> => {
|
|
331
|
+
let idFilter: readonly ObjectId[] | undefined;
|
|
332
|
+
if ('id' in predicates) {
|
|
333
|
+
assertArgument(
|
|
334
|
+
typeof predicates.id === 'string' || Array.isArray(predicates.id),
|
|
335
|
+
'predicates.id',
|
|
336
|
+
'invalid id filter',
|
|
337
|
+
);
|
|
338
|
+
idFilter = typeof predicates.id === 'string' ? [predicates.id] : predicates.id;
|
|
339
|
+
Schema.Array(ObjectId).pipe(Schema.validateSync)(idFilter);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
return {
|
|
343
|
+
id: idFilter,
|
|
344
|
+
props: Object.fromEntries(
|
|
345
|
+
Object.entries(predicates)
|
|
346
|
+
.filter(([prop, _value]) => prop !== 'id')
|
|
347
|
+
.map(([prop, predicate]) => [prop, processPredicate(predicate)]),
|
|
348
|
+
) as Record<string, QueryAST.Filter>,
|
|
349
|
+
};
|
|
350
|
+
};
|
|
351
|
+
|
|
352
|
+
const processPredicate = (predicate: any): QueryAST.Filter => {
|
|
353
|
+
return Match.value(predicate).pipe(
|
|
354
|
+
Match.withReturnType<QueryAST.Filter>(),
|
|
355
|
+
Match.when(is, (predicate) => predicate.ast),
|
|
356
|
+
// TODO(wittjosiah): Add support for array predicates.
|
|
357
|
+
Match.when(Array.isArray, (_predicate) => {
|
|
358
|
+
throw new Error('Array predicates are not yet supported.');
|
|
359
|
+
}),
|
|
360
|
+
Match.when(
|
|
361
|
+
(predicate: any) => !Ref.isRef(predicate) && typeof predicate === 'object' && predicate !== null,
|
|
362
|
+
(predicate) => {
|
|
363
|
+
const nestedProps = Object.fromEntries(
|
|
364
|
+
Object.entries(predicate).map(([key, value]) => [key, processPredicate(value)]),
|
|
365
|
+
);
|
|
366
|
+
|
|
367
|
+
return {
|
|
368
|
+
type: 'object',
|
|
369
|
+
typename: null,
|
|
370
|
+
props: nestedProps,
|
|
371
|
+
};
|
|
372
|
+
},
|
|
373
|
+
),
|
|
374
|
+
Match.orElse((value) => eq(value).ast),
|
|
375
|
+
);
|
|
376
|
+
};
|
package/src/Format.ts
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type DXN } from '@dxos/keys';
|
|
6
|
+
|
|
7
|
+
import type * as Database from './Database';
|
|
8
|
+
import type * as Entity from './Entity';
|
|
9
|
+
import { type AnyProperties } from './internal';
|
|
10
|
+
import type * as Key from './Key';
|
|
11
|
+
import type * as Ref from './Ref';
|
|
12
|
+
import type * as SchemaRegistry from './SchemaRegistry';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Resolution context.
|
|
16
|
+
* Affects how non-absolute DXNs are resolved.
|
|
17
|
+
*/
|
|
18
|
+
export interface RefResolutionContext {
|
|
19
|
+
/**
|
|
20
|
+
* Space that the resolution is happening from.
|
|
21
|
+
*/
|
|
22
|
+
space?: Key.SpaceId;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Queue that the resolution is happening from.
|
|
26
|
+
* This queue will be searched first, and then the space it belongs to.
|
|
27
|
+
*/
|
|
28
|
+
queue?: DXN;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface RefResolverOptions {
|
|
32
|
+
/**
|
|
33
|
+
* Resolution context.
|
|
34
|
+
* Affects how non-absolute DXNs are resolved.
|
|
35
|
+
*/
|
|
36
|
+
context?: RefResolutionContext;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Middleware to change the resolved object before returning it.
|
|
40
|
+
* @deprecated On track to be removed.
|
|
41
|
+
*/
|
|
42
|
+
middleware?: (obj: AnyProperties) => AnyProperties;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
*
|
|
47
|
+
*/
|
|
48
|
+
// TODO(burdon): Comment required.
|
|
49
|
+
export interface Hypergraph extends Database.Queryable {
|
|
50
|
+
get schemaRegistry(): SchemaRegistry.SchemaRegistry;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Query objects.
|
|
54
|
+
*/
|
|
55
|
+
query: Database.QueryFn;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Creates a reference to an existing object in the database.
|
|
59
|
+
*
|
|
60
|
+
* NOTE: The reference may be dangling if the object is not present in the database.
|
|
61
|
+
* NOTE: Difference from `Ref.fromDXN`
|
|
62
|
+
* `Ref.fromDXN(dxn)` returns an unhydrated reference. The `.load` and `.target` APIs will not work.
|
|
63
|
+
* `db.makeRef(dxn)` is preferable in cases with access to the database.
|
|
64
|
+
*/
|
|
65
|
+
makeRef<T extends Entity.Unknown = Entity.Unknown>(dxn: DXN): Ref.Ref<T>;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* @param hostDb Host database for reference resolution.
|
|
69
|
+
* @param middleware Called with the loaded object. The caller may change the object.
|
|
70
|
+
* @returns Result of `onLoad`.
|
|
71
|
+
*/
|
|
72
|
+
// TODO(dmaretskyi): Restructure API: Remove middleware.
|
|
73
|
+
createRefResolver(options: RefResolverOptions): Ref.Resolver;
|
|
74
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import type * as Schema from 'effect/Schema';
|
|
6
|
+
|
|
7
|
+
import { JsonSchemaType } from './internal';
|
|
8
|
+
|
|
9
|
+
export { toEffectSchema, toJsonSchema } from './internal';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Serializable JsonSchema type definition.
|
|
13
|
+
*/
|
|
14
|
+
export type JsonSchema = JsonSchemaType;
|
|
15
|
+
|
|
16
|
+
export const JsonSchema: Schema.Schema<JsonSchemaType> = JsonSchemaType;
|