@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
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import type * as Option from 'effect/Option';
|
|
6
|
+
import type * as Schema from 'effect/Schema';
|
|
7
|
+
import * as SchemaAST from 'effect/SchemaAST';
|
|
8
|
+
|
|
9
|
+
import { assertArgument } from '@dxos/invariant';
|
|
10
|
+
import { DXN } from '@dxos/keys';
|
|
11
|
+
|
|
12
|
+
import { EntityKind } from '../types';
|
|
13
|
+
|
|
14
|
+
export interface AnnotationHelper<T> {
|
|
15
|
+
get: (schema: Schema.Schema.Any) => Option.Option<T>;
|
|
16
|
+
getFromAst: (ast: SchemaAST.AST) => Option.Option<T>;
|
|
17
|
+
set: (value: T) => <S extends Schema.Schema.Any>(schema: S) => S;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export const createAnnotationHelper = <T>(id: symbol): AnnotationHelper<T> => {
|
|
21
|
+
return {
|
|
22
|
+
get: (schema) => SchemaAST.getAnnotation(schema.ast, id),
|
|
23
|
+
getFromAst: (ast) => SchemaAST.getAnnotation(ast, id),
|
|
24
|
+
set:
|
|
25
|
+
(value) =>
|
|
26
|
+
<S extends Schema.Schema.Any>(schema: S) =>
|
|
27
|
+
schema.annotations({ [id]: value }) as S,
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* If property is optional returns the nested property, otherwise returns the property.
|
|
33
|
+
*/
|
|
34
|
+
// TODO(wittjosiah): Is there a way to do this as a generic?
|
|
35
|
+
export const unwrapOptional = (property: SchemaAST.PropertySignature) => {
|
|
36
|
+
if (!property.isOptional || !SchemaAST.isUnion(property.type)) {
|
|
37
|
+
return property;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return property.type.types[0];
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @see JSONSchemaAnnotationId
|
|
45
|
+
* @returns JSON-schema annotation so that the schema can be serialized with correct parameters.
|
|
46
|
+
*/
|
|
47
|
+
// TODO(burdon): Required type.
|
|
48
|
+
export const makeTypeJsonSchemaAnnotation = (options: {
|
|
49
|
+
identifier?: string;
|
|
50
|
+
kind: EntityKind;
|
|
51
|
+
typename: string;
|
|
52
|
+
version: string;
|
|
53
|
+
relationSource?: string;
|
|
54
|
+
relationTarget?: string;
|
|
55
|
+
}) => {
|
|
56
|
+
assertArgument(!!options.relationSource === (options.kind === EntityKind.Relation), 'relationSource');
|
|
57
|
+
assertArgument(!!options.relationTarget === (options.kind === EntityKind.Relation), 'relationTarget');
|
|
58
|
+
|
|
59
|
+
const obj = {
|
|
60
|
+
// TODO(dmaretskyi): Should this include the version?
|
|
61
|
+
$id: options.identifier ?? DXN.fromTypename(options.typename).toString(),
|
|
62
|
+
entityKind: options.kind,
|
|
63
|
+
version: options.version,
|
|
64
|
+
typename: options.typename,
|
|
65
|
+
} as any;
|
|
66
|
+
if (options.kind === EntityKind.Relation) {
|
|
67
|
+
obj.relationSource = { $ref: options.relationSource };
|
|
68
|
+
obj.relationTarget = { $ref: options.relationTarget };
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return obj;
|
|
72
|
+
};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Common annotation helpers shared by Obj and Relation modules.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
getDescriptionWithSchema,
|
|
11
|
+
getLabelWithSchema,
|
|
12
|
+
setDescriptionWithSchema,
|
|
13
|
+
setLabelWithSchema,
|
|
14
|
+
} from '../annotations';
|
|
15
|
+
import { type Mutable } from '../proxy';
|
|
16
|
+
import { type AnyProperties, getSchema as getSchema$ } from '../types';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Get the label of an entity.
|
|
20
|
+
* Accepts both reactive entities and snapshots.
|
|
21
|
+
*/
|
|
22
|
+
export const getLabel = (entity: AnyProperties): string | undefined => {
|
|
23
|
+
const schema = getSchema$(entity);
|
|
24
|
+
if (schema != null) {
|
|
25
|
+
return getLabelWithSchema(schema, entity);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Set the label of an entity.
|
|
31
|
+
* Must be called within an Obj.change or Relation.change callback.
|
|
32
|
+
*/
|
|
33
|
+
export const setLabel = (entity: Mutable<AnyProperties>, label: string) => {
|
|
34
|
+
const schema = getSchema$(entity);
|
|
35
|
+
if (schema != null) {
|
|
36
|
+
setLabelWithSchema(schema, entity, label);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Get the description of an entity.
|
|
42
|
+
* Accepts both reactive entities and snapshots.
|
|
43
|
+
*/
|
|
44
|
+
export const getDescription = (entity: AnyProperties): string | undefined => {
|
|
45
|
+
const schema = getSchema$(entity);
|
|
46
|
+
if (schema != null) {
|
|
47
|
+
return getDescriptionWithSchema(schema, entity);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Set the description of an entity.
|
|
53
|
+
* Must be called within an Obj.change or Relation.change callback.
|
|
54
|
+
*/
|
|
55
|
+
export const setDescription = (entity: Mutable<AnyProperties>, description: string) => {
|
|
56
|
+
const schema = getSchema$(entity);
|
|
57
|
+
if (schema != null) {
|
|
58
|
+
setDescriptionWithSchema(schema, entity, description);
|
|
59
|
+
}
|
|
60
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { invariant } from '@dxos/invariant';
|
|
6
|
+
import { type DXN } from '@dxos/keys';
|
|
7
|
+
import { assumeType } from '@dxos/util';
|
|
8
|
+
|
|
9
|
+
import { type InternalObjectProps, ObjectDatabaseId, getObjectDXN } from '../entities';
|
|
10
|
+
import type { AnyEntity } from '../types';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Get the DXN of an entity.
|
|
14
|
+
* Accepts both reactive entities and snapshots.
|
|
15
|
+
*/
|
|
16
|
+
export const getDXN = (entity: AnyEntity): DXN => {
|
|
17
|
+
const dxn = getObjectDXN(entity);
|
|
18
|
+
invariant(dxn != null, 'Invalid entity.');
|
|
19
|
+
return dxn;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Get the database the entity belongs to.
|
|
24
|
+
* Accepts both reactive entities and snapshots.
|
|
25
|
+
*/
|
|
26
|
+
export const getDatabase = (entity: AnyEntity): any | undefined => {
|
|
27
|
+
assumeType<InternalObjectProps>(entity);
|
|
28
|
+
return entity[ObjectDatabaseId];
|
|
29
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Shared API helpers for Obj and Relation modules.
|
|
7
|
+
* These implementations use generic Entity types.
|
|
8
|
+
* Obj and Relation modules re-export with strongly-typed signatures.
|
|
9
|
+
*
|
|
10
|
+
* TODO(wittjosiah): Could this become the new "internal" where we slowly refactor
|
|
11
|
+
* existing internal modules into here? This would provide a cleaner boundary
|
|
12
|
+
* and prevent external packages from using internals directly.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
export * from './annotations';
|
|
16
|
+
export * from './entity';
|
|
17
|
+
export * from './meta';
|
|
18
|
+
export * from './sorting';
|
|
19
|
+
export * from './version';
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import type { ForeignKey } from '@dxos/echo-protocol';
|
|
6
|
+
import { assertArgument, invariant } from '@dxos/invariant';
|
|
7
|
+
import type { DeepReadonly } from '@dxos/util';
|
|
8
|
+
|
|
9
|
+
import { type Mutable } from '../proxy';
|
|
10
|
+
import { type AnyProperties, type ObjectMeta, getMeta as getMeta$ } from '../types';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Deeply read-only version of ObjectMeta.
|
|
14
|
+
*/
|
|
15
|
+
export type ReadonlyMeta = DeepReadonly<ObjectMeta>;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Mutable meta type received in meta mutation callbacks.
|
|
19
|
+
*/
|
|
20
|
+
export type Meta = ObjectMeta;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Get the metadata for an entity with validation.
|
|
24
|
+
* Returns mutable meta when passed a mutable entity (inside change callback).
|
|
25
|
+
* Returns read-only meta when passed a regular entity or snapshot.
|
|
26
|
+
*
|
|
27
|
+
* TODO(burdon): When passed a Snapshot, should return a snapshot of meta, not the live meta proxy.
|
|
28
|
+
*/
|
|
29
|
+
export function getMetaChecked(entity: Mutable<AnyProperties>): ObjectMeta;
|
|
30
|
+
export function getMetaChecked(entity: AnyProperties): ReadonlyMeta;
|
|
31
|
+
export function getMetaChecked(entity: AnyProperties): ObjectMeta | ReadonlyMeta {
|
|
32
|
+
assertArgument(entity, 'entity', 'Should be an entity.');
|
|
33
|
+
const meta = getMeta$(entity);
|
|
34
|
+
invariant(meta != null, 'Invalid entity.');
|
|
35
|
+
return meta;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @returns Foreign keys for the entity from the specified source.
|
|
40
|
+
* Accepts both reactive entities and snapshots.
|
|
41
|
+
*/
|
|
42
|
+
export const getKeys = (entity: AnyProperties, source: string): ForeignKey[] => {
|
|
43
|
+
assertArgument(entity, 'entity', 'Should be an entity.');
|
|
44
|
+
const meta = getMetaChecked(entity);
|
|
45
|
+
invariant(meta != null, 'Invalid entity.');
|
|
46
|
+
return meta.keys.filter((key) => key.source === source);
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Delete all keys from the entity for the specified source.
|
|
51
|
+
* Must be called within an Obj.change or Relation.change callback.
|
|
52
|
+
*/
|
|
53
|
+
export const deleteKeys = (entity: Mutable<AnyProperties>, source: string) => {
|
|
54
|
+
const meta = getMetaChecked(entity);
|
|
55
|
+
for (let i = 0; i < meta.keys.length; i++) {
|
|
56
|
+
if (meta.keys[i].source === source) {
|
|
57
|
+
meta.keys.splice(i, 1);
|
|
58
|
+
i--;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Add a tag to the entity.
|
|
65
|
+
* Must be called within an Obj.change or Relation.change callback.
|
|
66
|
+
*/
|
|
67
|
+
export const addTag = (entity: Mutable<AnyProperties>, tag: string) => {
|
|
68
|
+
const meta = getMetaChecked(entity);
|
|
69
|
+
meta.tags ??= [];
|
|
70
|
+
meta.tags.push(tag);
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Remove a tag from the entity.
|
|
75
|
+
* Must be called within an Obj.change or Relation.change callback.
|
|
76
|
+
*/
|
|
77
|
+
export const removeTag = (entity: Mutable<AnyProperties>, tag: string) => {
|
|
78
|
+
const meta = getMetaChecked(entity);
|
|
79
|
+
if (!meta.tags) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
for (let i = 0; i < meta.tags.length; i++) {
|
|
83
|
+
if (meta.tags[i] === tag) {
|
|
84
|
+
meta.tags.splice(i, 1);
|
|
85
|
+
i--;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { getTypename } from '../annotations';
|
|
6
|
+
import type { AnyEntity } from '../types';
|
|
7
|
+
|
|
8
|
+
import { getLabel } from './annotations';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* String comparison helper for sorting.
|
|
12
|
+
*/
|
|
13
|
+
export const compare = (a?: string, b?: string): number => {
|
|
14
|
+
if (a == null) {
|
|
15
|
+
return b == null ? 0 : 1;
|
|
16
|
+
}
|
|
17
|
+
if (b == null) {
|
|
18
|
+
return -1;
|
|
19
|
+
}
|
|
20
|
+
return a.localeCompare(b);
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Comparator function type for sorting entities.
|
|
25
|
+
* Accepts both reactive entities and snapshots.
|
|
26
|
+
*/
|
|
27
|
+
export type Comparator<T extends AnyEntity = AnyEntity> = (a: T, b: T) => number;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Sort entities by label.
|
|
31
|
+
*/
|
|
32
|
+
export const sortByLabel: Comparator = (a: AnyEntity, b: AnyEntity) => compare(getLabel(a), getLabel(b));
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Sort entities by typename.
|
|
36
|
+
*/
|
|
37
|
+
export const sortByTypename: Comparator = (a: AnyEntity, b: AnyEntity) => compare(getTypename(a), getTypename(b));
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Compose multiple comparators into one.
|
|
41
|
+
* Applies comparators in order until one returns non-zero.
|
|
42
|
+
*/
|
|
43
|
+
export const sort = <T extends AnyEntity>(...comparators: Comparator<T>[]): Comparator<T> => {
|
|
44
|
+
return (a: T, b: T) => {
|
|
45
|
+
for (const comparator of comparators) {
|
|
46
|
+
const result = comparator(a, b);
|
|
47
|
+
if (result !== 0) {
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return 0;
|
|
52
|
+
};
|
|
53
|
+
};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { assertArgument } from '@dxos/invariant';
|
|
6
|
+
|
|
7
|
+
import { ObjectVersionId } from '../entities';
|
|
8
|
+
import { type AnyEntity, VersionTypeId } from '../types';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Represent entity version.
|
|
12
|
+
* May be backed by Automerge.
|
|
13
|
+
* Entities with no history are not versioned.
|
|
14
|
+
* Named EntityVersion to avoid conflict with types/version.ts.
|
|
15
|
+
*/
|
|
16
|
+
export interface EntityVersion {
|
|
17
|
+
[VersionTypeId]: {};
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Whether the entity is versioned.
|
|
21
|
+
*/
|
|
22
|
+
versioned: boolean;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Automerge heads.
|
|
26
|
+
*/
|
|
27
|
+
automergeHeads?: string[];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const unversioned: EntityVersion = {
|
|
31
|
+
[VersionTypeId]: {},
|
|
32
|
+
versioned: false,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Checks that `obj` is a version object.
|
|
37
|
+
*/
|
|
38
|
+
export const isVersion = (entity: unknown): entity is EntityVersion => {
|
|
39
|
+
return entity != null && typeof entity === 'object' && VersionTypeId in entity;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Returns the version of an entity.
|
|
44
|
+
* Accepts both reactive entities and snapshots.
|
|
45
|
+
*/
|
|
46
|
+
export const version = (entity: AnyEntity): EntityVersion => {
|
|
47
|
+
const ver = (entity as any)[ObjectVersionId];
|
|
48
|
+
if (ver === undefined) {
|
|
49
|
+
return unversioned;
|
|
50
|
+
}
|
|
51
|
+
return ver;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Checks that `version` is a valid version object.
|
|
56
|
+
*/
|
|
57
|
+
export const versionValid = (ver: EntityVersion): boolean => {
|
|
58
|
+
assertArgument(isVersion(ver), 'version', 'Invalid version object');
|
|
59
|
+
return !!ver.versioned;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export type VersionCompareResult = 'unversioned' | 'equal' | 'different';
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Compares two versions.
|
|
66
|
+
* @param version1
|
|
67
|
+
* @param version2
|
|
68
|
+
* @returns 'unversioned' if either entity is unversioned, 'equal' if the versions are equal, 'different' if the versions are different.
|
|
69
|
+
*/
|
|
70
|
+
export const compareVersions = (version1: EntityVersion, version2: EntityVersion): VersionCompareResult => {
|
|
71
|
+
assertArgument(isVersion(version1), 'version1', 'Invalid version object');
|
|
72
|
+
assertArgument(isVersion(version2), 'version2', 'Invalid version object');
|
|
73
|
+
|
|
74
|
+
if (!versionValid(version1) || !versionValid(version2)) {
|
|
75
|
+
return 'unversioned';
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (version1.automergeHeads?.length !== version2.automergeHeads?.length) {
|
|
79
|
+
return 'different';
|
|
80
|
+
}
|
|
81
|
+
if (version1.automergeHeads?.some((head) => !version2.automergeHeads?.includes(head))) {
|
|
82
|
+
return 'different';
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return 'equal';
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
export const encodeVersion = (ver: EntityVersion): string => {
|
|
89
|
+
return JSON.stringify(ver);
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
export const decodeVersion = (ver: string): EntityVersion => {
|
|
93
|
+
const parsed = JSON.parse(ver);
|
|
94
|
+
parsed[VersionTypeId] = {};
|
|
95
|
+
return parsed;
|
|
96
|
+
};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
import type * as SchemaAST from 'effect/SchemaAST';
|
|
7
|
+
import type * as Types from 'effect/Types';
|
|
8
|
+
|
|
9
|
+
import { type ToMutable } from '@dxos/util';
|
|
10
|
+
|
|
11
|
+
import { type TypeMeta } from '../annotations';
|
|
12
|
+
import { type AnyEntity, type EntityKind, SchemaKindId } from '../types';
|
|
13
|
+
|
|
14
|
+
// TODO(burdon): Define Schema type for `typename` and use consistently for all DXN-like properties.
|
|
15
|
+
|
|
16
|
+
// type RequiredKeys<T> = { [K in keyof T]-?: {} extends Pick<T, K> ? never : K }[keyof T];
|
|
17
|
+
export type EchoTypeSchemaProps<T, ExtraFields = {}> = Types.Simplify<AnyEntity & ToMutable<T> & ExtraFields>;
|
|
18
|
+
|
|
19
|
+
// TODO(burdon): Rename EchoEntitySchema.
|
|
20
|
+
export interface EchoTypeSchema<
|
|
21
|
+
Self extends Schema.Schema.Any,
|
|
22
|
+
ExtraFields = {},
|
|
23
|
+
K extends EntityKind = EntityKind,
|
|
24
|
+
Fields extends Schema.Struct.Fields = Schema.Struct.Fields,
|
|
25
|
+
> extends TypeMeta,
|
|
26
|
+
Schema.AnnotableClass<
|
|
27
|
+
EchoTypeSchema<Self, ExtraFields, K, Fields>,
|
|
28
|
+
EchoTypeSchemaProps<Schema.Schema.Type<Self>, ExtraFields>,
|
|
29
|
+
EchoTypeSchemaProps<Schema.Schema.Encoded<Self>, ExtraFields>,
|
|
30
|
+
Schema.Schema.Context<Self>
|
|
31
|
+
> {
|
|
32
|
+
/**
|
|
33
|
+
* Schema kind key that marks this as an ECHO schema and indicates its kind.
|
|
34
|
+
* Makes EchoTypeSchema satisfy the Type.Obj.Any or Type.Relation.Any type.
|
|
35
|
+
*/
|
|
36
|
+
readonly [SchemaKindId]: K;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* The fields defined in the original struct schema.
|
|
40
|
+
* Allows accessing field definitions for introspection.
|
|
41
|
+
*/
|
|
42
|
+
readonly fields: Fields;
|
|
43
|
+
|
|
44
|
+
instanceOf(value: unknown): boolean;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// type MakeProps =
|
|
48
|
+
// | boolean
|
|
49
|
+
// | {
|
|
50
|
+
// readonly disableValidation?: boolean;
|
|
51
|
+
// };
|
|
52
|
+
|
|
53
|
+
// NOTE: Utils copied from Effect `Schema.ts`.
|
|
54
|
+
// const _ownKeys = (o: object): Array<PropertyKey> =>
|
|
55
|
+
// (Object.keys(o) as Array<PropertyKey>).concat(Object.getOwnPropertySymbols(o));
|
|
56
|
+
|
|
57
|
+
// const _lazilyMergeDefaults = (
|
|
58
|
+
// fields: Schema.Struct.Fields,
|
|
59
|
+
// out: Record<PropertyKey, unknown>,
|
|
60
|
+
// ): { [x: string | symbol]: unknown } => {
|
|
61
|
+
// const ownKeys = _ownKeys(fields);
|
|
62
|
+
// for (const key of ownKeys) {
|
|
63
|
+
// const field = fields[key];
|
|
64
|
+
// if (out[key] === undefined && Schema.isPropertySignature(field)) {
|
|
65
|
+
// const ast = field.ast;
|
|
66
|
+
// const defaultValue = ast._tag === 'PropertySignatureDeclaration' ? ast.defaultValue : ast.to.defaultValue;
|
|
67
|
+
// if (defaultValue !== undefined) {
|
|
68
|
+
// out[key] = defaultValue();
|
|
69
|
+
// }
|
|
70
|
+
// }
|
|
71
|
+
// }
|
|
72
|
+
// return out;
|
|
73
|
+
// };
|
|
74
|
+
|
|
75
|
+
// const _getDisableValidationMakeOption = (options: MakeProps | undefined): boolean =>
|
|
76
|
+
// Predicate.isBoolean(options) ? options : options?.disableValidation ?? false;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* @internal
|
|
80
|
+
*/
|
|
81
|
+
export const makeEchoTypeSchema = <
|
|
82
|
+
Self extends Schema.Schema.Any,
|
|
83
|
+
K extends EntityKind = EntityKind,
|
|
84
|
+
// TODO(wittjosiah): Can this be inferred from the schema?
|
|
85
|
+
Fields extends Schema.Struct.Fields = Schema.Struct.Fields,
|
|
86
|
+
>(
|
|
87
|
+
fields: Fields,
|
|
88
|
+
ast: SchemaAST.AST,
|
|
89
|
+
typename: string,
|
|
90
|
+
version: string,
|
|
91
|
+
kind: K,
|
|
92
|
+
): EchoTypeSchema<Self, {}, K, Fields> => {
|
|
93
|
+
return class EchoObjectSchemaClass extends Schema.make<
|
|
94
|
+
EchoTypeSchemaProps<Schema.Schema.Type<Self>>,
|
|
95
|
+
EchoTypeSchemaProps<Schema.Schema.Encoded<Self>>,
|
|
96
|
+
Schema.Schema.Context<Self>
|
|
97
|
+
>(ast) {
|
|
98
|
+
static readonly typename = typename;
|
|
99
|
+
static readonly version = version;
|
|
100
|
+
static readonly [SchemaKindId] = kind;
|
|
101
|
+
static readonly fields = fields;
|
|
102
|
+
|
|
103
|
+
static override annotations(
|
|
104
|
+
annotations: Schema.Annotations.GenericSchema<EchoTypeSchemaProps<Schema.Schema.Type<Self>>>,
|
|
105
|
+
): EchoTypeSchema<Self, {}, K, Fields> {
|
|
106
|
+
const schema = Schema.make<EchoTypeSchemaProps<Schema.Schema.Type<Self>>>(ast).annotations(annotations);
|
|
107
|
+
return makeEchoTypeSchema<Self, K, Fields>(fields, schema.ast, typename, version, kind);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// static make(
|
|
111
|
+
// props: RequiredKeys<Schema.TypeLiteral.Constructor<Fields, []>> extends never
|
|
112
|
+
// ? void | Simplify<Schema.TypeLiteral.Constructor<Fields, []>>
|
|
113
|
+
// : Simplify<Schema.TypeLiteral.Constructor<Fields, []>>,
|
|
114
|
+
// options?: MakeProps,
|
|
115
|
+
// ): Simplify<Schema.TypeLiteral.Type<Fields, []>> {
|
|
116
|
+
// const propsWithDefaults: any = _lazilyMergeDefaults(fields, { ...(props as any) });
|
|
117
|
+
// return _getDisableValidationMakeOption(options)
|
|
118
|
+
// ? propsWithDefaults
|
|
119
|
+
// : ParseResult.validateSync(this)(propsWithDefaults);
|
|
120
|
+
// }
|
|
121
|
+
|
|
122
|
+
static instanceOf(value: unknown): boolean {
|
|
123
|
+
return Schema.is(this)(value);
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
};
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import type * as Schema from 'effect/Schema';
|
|
6
|
+
|
|
7
|
+
import { type ForeignKey } from '@dxos/echo-protocol';
|
|
8
|
+
import { invariant } from '@dxos/invariant';
|
|
9
|
+
import { DXN, ObjectId } from '@dxos/keys';
|
|
10
|
+
import { assumeType } from '@dxos/util';
|
|
11
|
+
|
|
12
|
+
import type * as Database from '../../Database';
|
|
13
|
+
import {
|
|
14
|
+
type ATTR_META,
|
|
15
|
+
type ATTR_TYPE,
|
|
16
|
+
EntityKind,
|
|
17
|
+
KindId,
|
|
18
|
+
type MetaId,
|
|
19
|
+
type ObjectMeta,
|
|
20
|
+
type SchemaId,
|
|
21
|
+
TypeId,
|
|
22
|
+
type Version,
|
|
23
|
+
} from '../types';
|
|
24
|
+
|
|
25
|
+
import {
|
|
26
|
+
type ATTR_RELATION_SOURCE,
|
|
27
|
+
type ATTR_RELATION_TARGET,
|
|
28
|
+
RelationSourceDXNId,
|
|
29
|
+
RelationSourceId,
|
|
30
|
+
RelationTargetDXNId,
|
|
31
|
+
RelationTargetId,
|
|
32
|
+
} from './relation';
|
|
33
|
+
|
|
34
|
+
//
|
|
35
|
+
// Defines the internal model of the echo object.
|
|
36
|
+
//
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Property name for self DXN when object is serialized to JSON.
|
|
40
|
+
*/
|
|
41
|
+
export const ATTR_SELF_DXN = '@dxn';
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* DXN to the object itself.
|
|
45
|
+
*/
|
|
46
|
+
export const SelfDXNId = Symbol.for('@dxos/echo/DXN');
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Property name for deleted when object is serialized to JSON.
|
|
50
|
+
*/
|
|
51
|
+
export const ATTR_DELETED = '@deleted';
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Deletion marker.
|
|
55
|
+
*/
|
|
56
|
+
export const ObjectDeletedId = Symbol.for('@dxos/echo/Deleted');
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Object version accessor symbol.
|
|
60
|
+
*/
|
|
61
|
+
export const ObjectVersionId: unique symbol = Symbol.for('@dxos/echo/Version');
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Object database accessor symbol.
|
|
65
|
+
*/
|
|
66
|
+
export const ObjectDatabaseId = Symbol.for('@dxos/echo/Database');
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Internal runtime representation of an object.
|
|
70
|
+
* The fields are accessed through getter functions.
|
|
71
|
+
*/
|
|
72
|
+
// NOTE: Each symbol has a jsdoc describing its purpose.
|
|
73
|
+
export interface InternalObjectProps {
|
|
74
|
+
readonly id: ObjectId;
|
|
75
|
+
readonly [SelfDXNId]: DXN;
|
|
76
|
+
readonly [KindId]: EntityKind;
|
|
77
|
+
readonly [SchemaId]: Schema.Schema.AnyNoContext;
|
|
78
|
+
readonly [TypeId]: DXN;
|
|
79
|
+
readonly [MetaId]?: ObjectMeta;
|
|
80
|
+
readonly [ObjectDatabaseId]?: Database.Database;
|
|
81
|
+
readonly [ObjectDeletedId]?: boolean;
|
|
82
|
+
readonly [ObjectVersionId]?: Version;
|
|
83
|
+
readonly [RelationSourceDXNId]?: DXN;
|
|
84
|
+
readonly [RelationTargetDXNId]?: DXN;
|
|
85
|
+
readonly [RelationSourceId]?: InternalObjectProps;
|
|
86
|
+
readonly [RelationTargetId]?: InternalObjectProps;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Entity metadata.
|
|
91
|
+
*/
|
|
92
|
+
export interface ObjectMetaJSON {
|
|
93
|
+
keys: ForeignKey[];
|
|
94
|
+
tags?: string[];
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* JSON representation of an object or relation metadata.
|
|
99
|
+
*/
|
|
100
|
+
export interface ObjectJSON {
|
|
101
|
+
id: string;
|
|
102
|
+
[ATTR_TYPE]: DXN.String;
|
|
103
|
+
[ATTR_SELF_DXN]?: DXN.String;
|
|
104
|
+
[ATTR_DELETED]?: boolean;
|
|
105
|
+
[ATTR_META]?: ObjectMetaJSON;
|
|
106
|
+
[ATTR_RELATION_SOURCE]?: DXN.String;
|
|
107
|
+
[ATTR_RELATION_TARGET]?: DXN.String;
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Application-specific properties.
|
|
111
|
+
*/
|
|
112
|
+
[key: string]: unknown;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* NOTE: Keep as `function` to avoid type inference issues.
|
|
117
|
+
*/
|
|
118
|
+
export function assertObjectModel(obj: unknown): asserts obj is InternalObjectProps {
|
|
119
|
+
invariant(typeof obj === 'object' && obj !== null, 'Invalid object model: not an object');
|
|
120
|
+
assumeType<InternalObjectProps>(obj);
|
|
121
|
+
invariant(ObjectId.isValid(obj.id), 'Invalid object model: invalid id');
|
|
122
|
+
invariant(obj[TypeId] === undefined || obj[TypeId] instanceof DXN, 'Invalid object model: invalid type');
|
|
123
|
+
invariant(
|
|
124
|
+
obj[KindId] === EntityKind.Object || obj[KindId] === EntityKind.Relation,
|
|
125
|
+
'Invalid object model: invalid entity kind',
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
if (obj[KindId] === EntityKind.Relation) {
|
|
129
|
+
invariant(obj[RelationSourceDXNId] instanceof DXN, 'Invalid object model: invalid relation source');
|
|
130
|
+
invariant(obj[RelationTargetDXNId] instanceof DXN, 'Invalid object model: invalid relation target');
|
|
131
|
+
invariant(!(obj[RelationSourceId] instanceof DXN), 'Invalid object model: source pointer is a DXN');
|
|
132
|
+
invariant(!(obj[RelationTargetId] instanceof DXN), 'Invalid object model: target pointer is a DXN');
|
|
133
|
+
}
|
|
134
|
+
}
|