@dxos/echo 0.8.4-main.e8ec1fe → 0.8.4-main.ef1bc66f44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -2
- package/dist/lib/neutral/Annotation.mjs +35 -0
- package/dist/lib/neutral/Database.mjs +45 -0
- package/dist/lib/neutral/Entity.mjs +51 -0
- package/dist/lib/neutral/Err.mjs +10 -0
- package/dist/lib/neutral/Filter.mjs +61 -0
- package/dist/lib/neutral/Format.mjs +66 -0
- package/dist/lib/neutral/JsonSchema.mjs +19 -0
- package/dist/lib/neutral/JsonSchema.mjs.map +7 -0
- package/dist/lib/neutral/Key.mjs +12 -0
- package/dist/lib/neutral/Key.mjs.map +7 -0
- package/dist/lib/neutral/Obj.mjs +96 -0
- package/dist/lib/neutral/Obj.mjs.map +7 -0
- package/dist/lib/neutral/Order.mjs +12 -0
- package/dist/lib/neutral/Order.mjs.map +7 -0
- package/dist/lib/neutral/Query.mjs +26 -0
- package/dist/lib/neutral/Query.mjs.map +7 -0
- package/dist/lib/neutral/QueryResult.mjs +2 -0
- package/dist/lib/neutral/QueryResult.mjs.map +7 -0
- package/dist/lib/neutral/Ref.mjs +22 -0
- package/dist/lib/neutral/Ref.mjs.map +7 -0
- package/dist/lib/neutral/Relation.mjs +84 -0
- package/dist/lib/neutral/Relation.mjs.map +7 -0
- package/dist/lib/neutral/SchemaRegistry.mjs +2 -0
- package/dist/lib/neutral/SchemaRegistry.mjs.map +7 -0
- package/dist/lib/neutral/Tag.mjs +25 -0
- package/dist/lib/neutral/Tag.mjs.map +7 -0
- package/dist/lib/neutral/Type.mjs +47 -0
- package/dist/lib/neutral/Type.mjs.map +7 -0
- package/dist/lib/neutral/chunk-2AF5GMG6.mjs +171 -0
- package/dist/lib/neutral/chunk-2AF5GMG6.mjs.map +7 -0
- package/dist/lib/neutral/chunk-4L6DOFXP.mjs +7 -0
- package/dist/lib/neutral/chunk-4L6DOFXP.mjs.map +7 -0
- package/dist/lib/neutral/chunk-7WE7SBA2.mjs +402 -0
- package/dist/lib/neutral/chunk-7WE7SBA2.mjs.map +7 -0
- package/dist/lib/neutral/chunk-ANHVGJI4.mjs +21 -0
- package/dist/lib/neutral/chunk-ANHVGJI4.mjs.map +7 -0
- package/dist/lib/neutral/chunk-DLPC7DHQ.mjs +56 -0
- package/dist/lib/neutral/chunk-DLPC7DHQ.mjs.map +7 -0
- package/dist/lib/neutral/chunk-EBUAT5ID.mjs +229 -0
- package/dist/lib/neutral/chunk-EBUAT5ID.mjs.map +7 -0
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +7 -0
- package/dist/lib/neutral/chunk-K5K3Z62A.mjs +40 -0
- package/dist/lib/neutral/chunk-K5K3Z62A.mjs.map +7 -0
- package/dist/lib/neutral/chunk-KB7RIVLK.mjs +67 -0
- package/dist/lib/neutral/chunk-KB7RIVLK.mjs.map +7 -0
- package/dist/lib/neutral/chunk-LKFNEFHF.mjs +130 -0
- package/dist/lib/neutral/chunk-LKFNEFHF.mjs.map +7 -0
- package/dist/lib/neutral/chunk-MTEHHY62.mjs +251 -0
- package/dist/lib/neutral/chunk-MTEHHY62.mjs.map +7 -0
- package/dist/lib/neutral/chunk-N2QNHMT5.mjs +73 -0
- package/dist/lib/neutral/chunk-N2QNHMT5.mjs.map +7 -0
- package/dist/lib/neutral/chunk-OMUPQMLR.mjs +7 -0
- package/dist/lib/neutral/chunk-OMUPQMLR.mjs.map +7 -0
- package/dist/lib/neutral/chunk-QARLJVDB.mjs +23 -0
- package/dist/lib/neutral/chunk-QARLJVDB.mjs.map +7 -0
- package/dist/lib/neutral/chunk-RIMHNJ3E.mjs +296 -0
- package/dist/lib/neutral/chunk-RIMHNJ3E.mjs.map +7 -0
- package/dist/lib/neutral/chunk-ROKO4RKJ.mjs +42 -0
- package/dist/lib/neutral/chunk-ROKO4RKJ.mjs.map +7 -0
- package/dist/lib/neutral/chunk-RPB6V4BE.mjs +38 -0
- package/dist/lib/neutral/chunk-RPB6V4BE.mjs.map +7 -0
- package/dist/lib/neutral/chunk-TLGNKUUG.mjs +3905 -0
- package/dist/lib/neutral/chunk-TLGNKUUG.mjs.map +7 -0
- package/dist/lib/neutral/chunk-TQT6WTIJ.mjs +142 -0
- package/dist/lib/neutral/chunk-TQT6WTIJ.mjs.map +7 -0
- package/dist/lib/neutral/chunk-VUQGRDRI.mjs +97 -0
- package/dist/lib/neutral/chunk-VUQGRDRI.mjs.map +7 -0
- package/dist/lib/neutral/chunk-X2MPMYYN.mjs +13 -0
- package/dist/lib/neutral/chunk-X2MPMYYN.mjs.map +7 -0
- package/dist/lib/neutral/chunk-XAJMXQ4H.mjs +43 -0
- package/dist/lib/neutral/chunk-XAJMXQ4H.mjs.map +7 -0
- package/dist/lib/neutral/chunk-ZAHWXGK4.mjs +287 -0
- package/dist/lib/neutral/chunk-ZAHWXGK4.mjs.map +7 -0
- package/dist/lib/neutral/index.mjs +84 -0
- package/dist/lib/neutral/index.mjs.map +7 -0
- package/dist/lib/{node-esm → neutral}/internal/index.mjs +251 -125
- package/dist/lib/neutral/internal/index.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/lib/neutral/testing/index.mjs +366 -0
- package/dist/lib/neutral/testing/index.mjs.map +7 -0
- package/dist/types/src/Annotation.d.ts +24 -0
- package/dist/types/src/Annotation.d.ts.map +1 -0
- package/dist/types/src/Database.d.ts +216 -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/{errors.d.ts → Err.d.ts} +13 -17
- package/dist/types/src/Err.d.ts.map +1 -0
- package/dist/types/src/Filter.d.ts +120 -0
- package/dist/types/src/Filter.d.ts.map +1 -0
- package/dist/types/src/Format.d.ts +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 +325 -99
- 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 +125 -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 +243 -23
- 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 +7 -7
- package/dist/types/src/Tag.d.ts.map +1 -1
- package/dist/types/src/Type.d.ts +225 -72
- 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/hierarchy.test.d.ts +2 -0
- package/dist/types/src/hierarchy.test.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +14 -5
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/internal/annotations/annotations.d.ts +177 -0
- package/dist/types/src/internal/annotations/annotations.d.ts.map +1 -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 +39 -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 +79 -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/format.d.ts +4 -2
- package/dist/types/src/internal/formats/format.d.ts.map +1 -1
- package/dist/types/src/internal/formats/select.d.ts +6 -4
- package/dist/types/src/internal/formats/select.d.ts.map +1 -1
- package/dist/types/src/internal/formats/string.d.ts +4 -0
- package/dist/types/src/internal/formats/string.d.ts.map +1 -1
- package/dist/types/src/internal/formats/types.d.ts +13 -9
- package/dist/types/src/internal/formats/types.d.ts.map +1 -1
- package/dist/types/src/internal/index.d.ts +7 -10
- package/dist/types/src/internal/index.d.ts.map +1 -1
- 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.map +1 -0
- package/dist/types/src/internal/json-schema/index.d.ts +2 -0
- package/dist/types/src/internal/json-schema/index.d.ts.map +1 -1
- package/dist/types/src/internal/json-schema/json-schema-normalize.d.ts.map +1 -1
- package/dist/types/src/internal/json-schema/json-schema-type.d.ts +130 -29
- package/dist/types/src/internal/json-schema/json-schema-type.d.ts.map +1 -1
- package/dist/types/src/internal/{json → json-schema}/json-schema.d.ts +4 -2
- 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.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.map +1 -1
- package/dist/types/src/internal/object/{create.d.ts → create-object.d.ts} +9 -10
- 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 +2 -2
- package/dist/types/src/internal/object/deleted.d.ts.map +1 -1
- package/dist/types/src/internal/object/ids.d.ts.map +1 -1
- package/dist/types/src/internal/object/index.d.ts +6 -11
- package/dist/types/src/internal/object/index.d.ts.map +1 -1
- package/dist/types/src/internal/object/json-serializer.d.ts +14 -9
- package/dist/types/src/internal/object/json-serializer.d.ts.map +1 -1
- package/dist/types/src/internal/object/schema-validator.d.ts +1 -14
- package/dist/types/src/internal/object/schema-validator.d.ts.map +1 -1
- package/dist/types/src/internal/object/set-value.d.ts +7 -0
- package/dist/types/src/internal/object/set-value.d.ts.map +1 -0
- package/dist/types/src/internal/object/set-value.test.d.ts +2 -0
- package/dist/types/src/internal/object/set-value.test.d.ts.map +1 -0
- package/dist/types/src/internal/object/snapshot.d.ts +6 -0
- package/dist/types/src/internal/object/snapshot.d.ts.map +1 -0
- package/dist/types/src/internal/object/typed-object.d.ts +8 -14
- package/dist/types/src/internal/object/typed-object.d.ts.map +1 -1
- package/dist/types/src/internal/proxy/change-context.d.ts +55 -0
- package/dist/types/src/internal/proxy/change-context.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/change.test.d.ts +2 -0
- package/dist/types/src/internal/proxy/change.test.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/define-hidden-property.d.ts +5 -0
- package/dist/types/src/internal/proxy/define-hidden-property.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/errors.d.ts +19 -0
- package/dist/types/src/internal/proxy/errors.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/event-batch.d.ts +10 -0
- package/dist/types/src/internal/proxy/event-batch.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/index.d.ts +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/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 +16 -12
- package/dist/types/src/internal/proxy/typed-handler.d.ts.map +1 -1
- package/dist/types/src/internal/ref/ref-array.d.ts +4 -4
- package/dist/types/src/internal/ref/ref-array.d.ts.map +1 -1
- package/dist/types/src/internal/ref/ref.d.ts +43 -18
- package/dist/types/src/internal/ref/ref.d.ts.map +1 -1
- package/dist/types/src/internal/schema/compose.d.ts +7 -0
- package/dist/types/src/internal/schema/compose.d.ts.map +1 -0
- package/dist/types/src/internal/schema/compose.test.d.ts.map +1 -0
- package/dist/types/src/internal/schema/echo-schema.d.ts +25 -12
- package/dist/types/src/internal/schema/echo-schema.d.ts.map +1 -1
- package/dist/types/src/internal/schema/index.d.ts +1 -4
- package/dist/types/src/internal/schema/index.d.ts.map +1 -1
- 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 +5 -2
- package/dist/types/src/internal/types/index.d.ts.map +1 -1
- package/dist/types/src/internal/{object → types}/meta.d.ts +17 -16
- package/dist/types/src/internal/types/meta.d.ts.map +1 -0
- package/dist/types/src/internal/types/typename.d.ts +21 -0
- package/dist/types/src/internal/types/typename.d.ts.map +1 -0
- package/dist/types/src/internal/{object → types}/version.d.ts +3 -2
- 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 -3
- 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 +101 -65
- package/src/Annotation.ts +45 -0
- package/src/Database.ts +353 -0
- package/src/Entity.test.ts +22 -0
- package/src/Entity.ts +217 -0
- package/src/{errors.ts → Err.ts} +2 -2
- 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 +412 -0
- package/src/Obj.ts +489 -289
- package/src/Order.ts +44 -0
- package/src/Query.test.ts +465 -0
- package/src/Query.ts +324 -0
- package/src/QueryResult.ts +106 -0
- package/src/Ref.ts +26 -9
- package/src/Relation.test.ts +82 -0
- package/src/Relation.ts +414 -61
- package/src/SchemaRegistry.ts +105 -0
- package/src/Tag.ts +3 -2
- package/src/Type.test.ts +52 -0
- package/src/Type.ts +361 -114
- package/src/hierarchy.test.ts +33 -0
- package/src/index.ts +15 -6
- package/src/internal/README.md +102 -0
- package/src/internal/{ast → annotations}/annotations.test.ts +18 -20
- package/src/internal/annotations/annotations.ts +487 -0
- package/src/internal/annotations/index.ts +6 -0
- package/src/internal/annotations/util.ts +85 -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 +138 -0
- package/src/internal/entities/object.ts +58 -0
- package/src/internal/entities/relation.ts +171 -0
- package/src/internal/entities/util.ts +33 -0
- package/src/internal/formats/date.test.ts +1 -1
- package/src/internal/formats/date.ts +5 -5
- package/src/internal/formats/format.test.ts +6 -6
- package/src/internal/formats/format.ts +8 -6
- package/src/internal/formats/number.ts +5 -5
- package/src/internal/formats/object.ts +4 -4
- package/src/internal/formats/select.ts +6 -4
- package/src/internal/formats/string.ts +14 -9
- package/src/internal/formats/types.ts +53 -42
- package/src/internal/index.ts +30 -13
- package/src/internal/{json → json-schema}/annotations.ts +1 -1
- package/src/internal/json-schema/index.ts +2 -0
- package/src/internal/json-schema/json-schema-normalize.ts +4 -2
- package/src/internal/json-schema/json-schema-type.ts +35 -35
- package/src/internal/{json → json-schema}/json-schema.test.ts +67 -55
- package/src/internal/{json → json-schema}/json-schema.ts +27 -14
- package/src/internal/object/clone.ts +48 -0
- package/src/internal/object/common.ts +3 -4
- package/src/internal/object/{create.test.ts → create-object.test.ts} +30 -32
- package/src/internal/object/{create.ts → create-object.ts} +35 -36
- package/src/internal/object/deleted.ts +6 -6
- package/src/internal/object/ids.ts +1 -1
- package/src/internal/object/index.ts +6 -11
- package/src/internal/object/inspect.ts +5 -7
- package/src/internal/object/json-serializer.test.ts +36 -37
- package/src/internal/object/json-serializer.ts +74 -102
- package/src/internal/object/schema-validator.test.ts +3 -7
- package/src/internal/object/schema-validator.ts +2 -237
- 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 +93 -0
- package/src/internal/object/typed-object.test.ts +11 -11
- package/src/internal/object/typed-object.ts +8 -66
- 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 +51 -91
- package/src/internal/proxy/index.ts +17 -0
- package/src/internal/proxy/json-serializer.ts +87 -0
- package/src/internal/proxy/make-object.ts +106 -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 +27 -18
- package/src/internal/proxy/symbols.ts +7 -0
- package/src/internal/proxy/typed-handler.test.ts +260 -48
- package/src/internal/proxy/typed-handler.ts +280 -58
- package/src/internal/proxy/typed-object.test.ts +53 -37
- package/src/internal/ref/ref-array.ts +4 -4
- package/src/internal/ref/ref.test.ts +9 -8
- package/src/internal/ref/ref.ts +107 -56
- package/src/internal/{projection → schema}/compose.test.ts +8 -9
- package/src/internal/{projection → schema}/compose.ts +13 -8
- package/src/internal/schema/echo-schema.ts +74 -33
- package/src/internal/schema/index.ts +1 -4
- package/src/internal/schema/manipulation.ts +1 -1
- package/src/internal/schema/persistent-schema.ts +28 -0
- package/src/internal/types/base.ts +43 -0
- package/src/internal/types/entity.ts +54 -0
- package/src/internal/types/index.ts +5 -2
- package/src/internal/types/meta.ts +65 -0
- package/src/internal/types/typename.ts +55 -0
- package/src/internal/types/version.ts +20 -0
- package/src/testing/api.test.ts +126 -0
- package/src/testing/index.ts +3 -3
- 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-BIDAASFK.mjs +0 -3727
- package/dist/lib/browser/chunk-BIDAASFK.mjs.map +0 -7
- package/dist/lib/browser/chunk-ZDLCWGEW.mjs +0 -410
- package/dist/lib/browser/chunk-ZDLCWGEW.mjs.map +0 -7
- package/dist/lib/browser/chunk-ZFRJKT4A.mjs +0 -585
- package/dist/lib/browser/chunk-ZFRJKT4A.mjs.map +0 -7
- package/dist/lib/browser/index.mjs +0 -35
- package/dist/lib/browser/internal/index.mjs +0 -336
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/browser/query/index.mjs +0 -13
- package/dist/lib/browser/testing/index.mjs +0 -267
- package/dist/lib/browser/testing/index.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-3SVRRCUU.mjs +0 -3727
- package/dist/lib/node-esm/chunk-3SVRRCUU.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-CGDHRZWH.mjs +0 -585
- package/dist/lib/node-esm/chunk-CGDHRZWH.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-HWS6VBQC.mjs +0 -410
- package/dist/lib/node-esm/chunk-HWS6VBQC.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -35
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/query/index.mjs +0 -13
- package/dist/lib/node-esm/testing/index.mjs +0 -267
- package/dist/lib/node-esm/testing/index.mjs.map +0 -7
- package/dist/types/src/errors.d.ts.map +0 -1
- package/dist/types/src/internal/ast/annotation-helper.d.ts +0 -8
- package/dist/types/src/internal/ast/annotation-helper.d.ts.map +0 -1
- package/dist/types/src/internal/ast/annotations.d.ts +0 -131
- package/dist/types/src/internal/ast/annotations.d.ts.map +0 -1
- package/dist/types/src/internal/ast/annotations.test.d.ts.map +0 -1
- package/dist/types/src/internal/ast/entity-kind.d.ts +0 -10
- package/dist/types/src/internal/ast/entity-kind.d.ts.map +0 -1
- package/dist/types/src/internal/ast/index.d.ts +0 -5
- package/dist/types/src/internal/ast/index.d.ts.map +0 -1
- package/dist/types/src/internal/ast/types.d.ts +0 -6
- package/dist/types/src/internal/ast/types.d.ts.map +0 -1
- package/dist/types/src/internal/json/annotations.d.ts.map +0 -1
- package/dist/types/src/internal/json/effect-schema.test.d.ts.map +0 -1
- package/dist/types/src/internal/json/index.d.ts +0 -2
- package/dist/types/src/internal/json/index.d.ts.map +0 -1
- package/dist/types/src/internal/json/json-schema.d.ts.map +0 -1
- package/dist/types/src/internal/json/json-schema.test.d.ts.map +0 -1
- package/dist/types/src/internal/object/accessors.d.ts +0 -37
- package/dist/types/src/internal/object/accessors.d.ts.map +0 -1
- package/dist/types/src/internal/object/create.d.ts.map +0 -1
- package/dist/types/src/internal/object/create.test.d.ts +0 -2
- package/dist/types/src/internal/object/create.test.d.ts.map +0 -1
- package/dist/types/src/internal/object/entity.d.ts +0 -33
- package/dist/types/src/internal/object/entity.d.ts.map +0 -1
- package/dist/types/src/internal/object/expando.d.ts +0 -14
- package/dist/types/src/internal/object/expando.d.ts.map +0 -1
- package/dist/types/src/internal/object/meta.d.ts.map +0 -1
- package/dist/types/src/internal/object/model.d.ts +0 -117
- package/dist/types/src/internal/object/model.d.ts.map +0 -1
- package/dist/types/src/internal/object/relation.d.ts +0 -17
- package/dist/types/src/internal/object/relation.d.ts.map +0 -1
- package/dist/types/src/internal/object/typename.d.ts +0 -15
- package/dist/types/src/internal/object/typename.d.ts.map +0 -1
- package/dist/types/src/internal/object/version.d.ts.map +0 -1
- package/dist/types/src/internal/projection/compose.d.ts +0 -6
- package/dist/types/src/internal/projection/compose.d.ts.map +0 -1
- package/dist/types/src/internal/projection/compose.test.d.ts.map +0 -1
- package/dist/types/src/internal/projection/index.d.ts +0 -2
- package/dist/types/src/internal/projection/index.d.ts.map +0 -1
- package/dist/types/src/internal/proxy/reactive-object.d.ts +0 -15
- package/dist/types/src/internal/proxy/reactive-object.d.ts.map +0 -1
- package/dist/types/src/internal/query/index.d.ts +0 -2
- package/dist/types/src/internal/query/index.d.ts.map +0 -1
- package/dist/types/src/internal/query/query.d.ts +0 -17
- package/dist/types/src/internal/query/query.d.ts.map +0 -1
- package/dist/types/src/internal/schema/runtime-schema-registry.d.ts +0 -18
- package/dist/types/src/internal/schema/runtime-schema-registry.d.ts.map +0 -1
- package/dist/types/src/internal/schema/snapshot.d.ts +0 -6
- package/dist/types/src/internal/schema/snapshot.d.ts.map +0 -1
- package/dist/types/src/internal/schema/stored-schema.d.ts +0 -13
- package/dist/types/src/internal/schema/stored-schema.d.ts.map +0 -1
- package/dist/types/src/internal/testing/index.d.ts +0 -3
- package/dist/types/src/internal/testing/index.d.ts.map +0 -1
- package/dist/types/src/internal/testing/types.d.ts +0 -381
- package/dist/types/src/internal/testing/types.d.ts.map +0 -1
- package/dist/types/src/internal/testing/utils.d.ts +0 -10
- package/dist/types/src/internal/testing/utils.d.ts.map +0 -1
- package/dist/types/src/internal/types/types.d.ts +0 -79
- package/dist/types/src/internal/types/types.d.ts.map +0 -1
- package/dist/types/src/internal/types/types.test.d.ts +0 -2
- package/dist/types/src/internal/types/types.test.d.ts.map +0 -1
- package/dist/types/src/internal/types/util.d.ts +0 -5
- package/dist/types/src/internal/types/util.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/query/query.d.ts +0 -248
- package/dist/types/src/query/query.d.ts.map +0 -1
- package/dist/types/src/query/query.test.d.ts +0 -2
- package/dist/types/src/query/query.test.d.ts.map +0 -1
- package/dist/types/src/testing/echo-schema.d.ts +0 -7
- package/dist/types/src/testing/echo-schema.d.ts.map +0 -1
- package/dist/types/src/testing/types.d.ts +0 -228
- package/dist/types/src/testing/types.d.ts.map +0 -1
- package/src/internal/ast/annotation-helper.ts +0 -22
- package/src/internal/ast/annotations.ts +0 -226
- package/src/internal/ast/entity-kind.ts +0 -15
- package/src/internal/ast/index.ts +0 -8
- package/src/internal/ast/types.ts +0 -17
- package/src/internal/json/index.ts +0 -5
- package/src/internal/object/accessors.ts +0 -153
- package/src/internal/object/entity.ts +0 -248
- package/src/internal/object/expando.ts +0 -21
- package/src/internal/object/meta.ts +0 -61
- package/src/internal/object/model.ts +0 -170
- package/src/internal/object/relation.ts +0 -24
- package/src/internal/object/typename.ts +0 -61
- package/src/internal/object/version.ts +0 -22
- package/src/internal/projection/index.ts +0 -5
- package/src/internal/proxy/reactive-object.ts +0 -108
- package/src/internal/query/index.ts +0 -5
- package/src/internal/query/query.ts +0 -23
- package/src/internal/schema/runtime-schema-registry.ts +0 -78
- package/src/internal/schema/snapshot.ts +0 -25
- package/src/internal/schema/stored-schema.ts +0 -26
- package/src/internal/testing/index.ts +0 -6
- package/src/internal/testing/types.ts +0 -144
- package/src/internal/testing/utils.ts +0 -54
- package/src/internal/types/types.test.ts +0 -48
- package/src/internal/types/types.ts +0 -176
- package/src/internal/types/util.ts +0 -9
- package/src/query/index.ts +0 -6
- package/src/query/query.test.ts +0 -401
- package/src/query/query.ts +0 -789
- package/src/test/api.test.ts +0 -180
- package/src/testing/echo-schema.ts +0 -39
- package/src/testing/types.ts +0 -108
- /package/dist/lib/{browser/index.mjs.map → neutral/Annotation.mjs.map} +0 -0
- /package/dist/lib/{browser/internal/index.mjs.map → neutral/Database.mjs.map} +0 -0
- /package/dist/lib/{browser/query/index.mjs.map → neutral/Entity.mjs.map} +0 -0
- /package/dist/lib/{node-esm/index.mjs.map → neutral/Err.mjs.map} +0 -0
- /package/dist/lib/{node-esm/internal/index.mjs.map → neutral/Filter.mjs.map} +0 -0
- /package/dist/lib/{node-esm/query/index.mjs.map → neutral/Format.mjs.map} +0 -0
- /package/dist/types/src/internal/{ast → annotations}/annotations.test.d.ts +0 -0
- /package/dist/types/src/internal/{json → json-schema}/annotations.d.ts +0 -0
- /package/dist/types/src/internal/{json → json-schema}/effect-schema.test.d.ts +0 -0
- /package/dist/types/src/internal/{json → json-schema}/json-schema.test.d.ts +0 -0
- /package/dist/types/src/internal/{projection → schema}/compose.test.d.ts +0 -0
- /package/dist/types/src/{test → testing}/api.test.d.ts +0 -0
- /package/src/internal/{json → json-schema}/effect-schema.test.ts +0 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import type { ForeignKey } from '@dxos/echo-protocol';
|
|
6
|
+
import { assertArgument, invariant } from '@dxos/invariant';
|
|
7
|
+
import type { DeepReadonly } from '@dxos/util';
|
|
8
|
+
|
|
9
|
+
import { type Mutable } from '../proxy';
|
|
10
|
+
import { type AnyProperties, type ObjectMeta, getMeta as getMeta$ } from '../types';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Deeply read-only version of ObjectMeta.
|
|
14
|
+
*/
|
|
15
|
+
export type ReadonlyMeta = DeepReadonly<ObjectMeta>;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Mutable meta type received in meta mutation callbacks.
|
|
19
|
+
*/
|
|
20
|
+
export type Meta = Mutable<ObjectMeta>;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Get the metadata for an entity with validation.
|
|
24
|
+
* Returns mutable meta when passed a mutable entity (inside change callback).
|
|
25
|
+
* Returns read-only meta when passed a regular entity or snapshot.
|
|
26
|
+
*
|
|
27
|
+
* TODO(burdon): When passed a Snapshot, should return a snapshot of meta, not the live meta proxy.
|
|
28
|
+
*/
|
|
29
|
+
export function getMetaChecked(entity: Mutable<AnyProperties>): Meta;
|
|
30
|
+
export function getMetaChecked(entity: AnyProperties): ReadonlyMeta;
|
|
31
|
+
export function getMetaChecked(entity: AnyProperties): Meta | ReadonlyMeta {
|
|
32
|
+
assertArgument(entity, 'entity', 'Should be an entity.');
|
|
33
|
+
const meta = getMeta$(entity);
|
|
34
|
+
invariant(meta != null, 'Invalid entity.');
|
|
35
|
+
return meta;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @returns Foreign keys for the entity from the specified source.
|
|
40
|
+
* Accepts both reactive entities and snapshots.
|
|
41
|
+
*/
|
|
42
|
+
export const getKeys = (entity: AnyProperties, source: string): ForeignKey[] => {
|
|
43
|
+
assertArgument(entity, 'entity', 'Should be an entity.');
|
|
44
|
+
const meta = getMetaChecked(entity);
|
|
45
|
+
invariant(meta != null, 'Invalid entity.');
|
|
46
|
+
return meta.keys.filter((key) => key.source === source);
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Delete all keys from the entity for the specified source.
|
|
51
|
+
* Must be called within an Obj.change or Relation.change callback.
|
|
52
|
+
*/
|
|
53
|
+
export const deleteKeys = (entity: Mutable<AnyProperties>, source: string) => {
|
|
54
|
+
const meta = getMetaChecked(entity);
|
|
55
|
+
for (let i = 0; i < meta.keys.length; i++) {
|
|
56
|
+
if (meta.keys[i].source === source) {
|
|
57
|
+
meta.keys.splice(i, 1);
|
|
58
|
+
i--;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Add a tag to the entity.
|
|
65
|
+
* Must be called within an Obj.change or Relation.change callback.
|
|
66
|
+
*/
|
|
67
|
+
export const addTag = (entity: Mutable<AnyProperties>, tag: string) => {
|
|
68
|
+
const meta = getMetaChecked(entity);
|
|
69
|
+
meta.tags ??= [];
|
|
70
|
+
meta.tags.push(tag);
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Remove a tag from the entity.
|
|
75
|
+
* Must be called within an Obj.change or Relation.change callback.
|
|
76
|
+
*/
|
|
77
|
+
export const removeTag = (entity: Mutable<AnyProperties>, tag: string) => {
|
|
78
|
+
const meta = getMetaChecked(entity);
|
|
79
|
+
if (!meta.tags) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
for (let i = 0; i < meta.tags.length; i++) {
|
|
83
|
+
if (meta.tags[i] === tag) {
|
|
84
|
+
meta.tags.splice(i, 1);
|
|
85
|
+
i--;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { getTypename } from '../annotations';
|
|
6
|
+
import type { AnyEntity } from '../types';
|
|
7
|
+
|
|
8
|
+
import { getLabel } from './annotations';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* String comparison helper for sorting.
|
|
12
|
+
*/
|
|
13
|
+
export const compare = (a?: string, b?: string): number => {
|
|
14
|
+
if (a == null) {
|
|
15
|
+
return b == null ? 0 : 1;
|
|
16
|
+
}
|
|
17
|
+
if (b == null) {
|
|
18
|
+
return -1;
|
|
19
|
+
}
|
|
20
|
+
return a.localeCompare(b);
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Comparator function type for sorting entities.
|
|
25
|
+
* Accepts both reactive entities and snapshots.
|
|
26
|
+
*/
|
|
27
|
+
export type Comparator<T extends AnyEntity = AnyEntity> = (a: T, b: T) => number;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Sort entities by label.
|
|
31
|
+
*/
|
|
32
|
+
export const sortByLabel: Comparator = (a: AnyEntity, b: AnyEntity) => compare(getLabel(a), getLabel(b));
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Sort entities by typename.
|
|
36
|
+
*/
|
|
37
|
+
export const sortByTypename: Comparator = (a: AnyEntity, b: AnyEntity) => compare(getTypename(a), getTypename(b));
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Compose multiple comparators into one.
|
|
41
|
+
* Applies comparators in order until one returns non-zero.
|
|
42
|
+
*/
|
|
43
|
+
export const sort = <T extends AnyEntity>(...comparators: Comparator<T>[]): Comparator<T> => {
|
|
44
|
+
return (a: T, b: T) => {
|
|
45
|
+
for (const comparator of comparators) {
|
|
46
|
+
const result = comparator(a, b);
|
|
47
|
+
if (result !== 0) {
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return 0;
|
|
52
|
+
};
|
|
53
|
+
};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { assertArgument } from '@dxos/invariant';
|
|
6
|
+
|
|
7
|
+
import { ObjectVersionId } from '../entities';
|
|
8
|
+
import { type AnyEntity, VersionTypeId } from '../types';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Represent entity version.
|
|
12
|
+
* May be backed by Automerge.
|
|
13
|
+
* Entities with no history are not versioned.
|
|
14
|
+
* Named EntityVersion to avoid conflict with types/version.ts.
|
|
15
|
+
*/
|
|
16
|
+
export interface EntityVersion {
|
|
17
|
+
[VersionTypeId]: {};
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Whether the entity is versioned.
|
|
21
|
+
*/
|
|
22
|
+
versioned: boolean;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Automerge heads.
|
|
26
|
+
*/
|
|
27
|
+
automergeHeads?: string[];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const unversioned: EntityVersion = {
|
|
31
|
+
[VersionTypeId]: {},
|
|
32
|
+
versioned: false,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Checks that `obj` is a version object.
|
|
37
|
+
*/
|
|
38
|
+
export const isVersion = (entity: unknown): entity is EntityVersion => {
|
|
39
|
+
return entity != null && typeof entity === 'object' && VersionTypeId in entity;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Returns the version of an entity.
|
|
44
|
+
* Accepts both reactive entities and snapshots.
|
|
45
|
+
*/
|
|
46
|
+
export const version = (entity: AnyEntity): EntityVersion => {
|
|
47
|
+
const ver = (entity as any)[ObjectVersionId];
|
|
48
|
+
if (ver === undefined) {
|
|
49
|
+
return unversioned;
|
|
50
|
+
}
|
|
51
|
+
return ver;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Checks that `version` is a valid version object.
|
|
56
|
+
*/
|
|
57
|
+
export const versionValid = (ver: EntityVersion): boolean => {
|
|
58
|
+
assertArgument(isVersion(ver), 'version', 'Invalid version object');
|
|
59
|
+
return !!ver.versioned;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export type VersionCompareResult = 'unversioned' | 'equal' | 'different';
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Compares two versions.
|
|
66
|
+
* @param version1
|
|
67
|
+
* @param version2
|
|
68
|
+
* @returns 'unversioned' if either entity is unversioned, 'equal' if the versions are equal, 'different' if the versions are different.
|
|
69
|
+
*/
|
|
70
|
+
export const compareVersions = (version1: EntityVersion, version2: EntityVersion): VersionCompareResult => {
|
|
71
|
+
assertArgument(isVersion(version1), 'version1', 'Invalid version object');
|
|
72
|
+
assertArgument(isVersion(version2), 'version2', 'Invalid version object');
|
|
73
|
+
|
|
74
|
+
if (!versionValid(version1) || !versionValid(version2)) {
|
|
75
|
+
return 'unversioned';
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (version1.automergeHeads?.length !== version2.automergeHeads?.length) {
|
|
79
|
+
return 'different';
|
|
80
|
+
}
|
|
81
|
+
if (version1.automergeHeads?.some((head) => !version2.automergeHeads?.includes(head))) {
|
|
82
|
+
return 'different';
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return 'equal';
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
export const encodeVersion = (ver: EntityVersion): string => {
|
|
89
|
+
return JSON.stringify(ver);
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
export const decodeVersion = (ver: string): EntityVersion => {
|
|
93
|
+
const parsed = JSON.parse(ver);
|
|
94
|
+
parsed[VersionTypeId] = {};
|
|
95
|
+
return parsed;
|
|
96
|
+
};
|
|
@@ -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,138 @@
|
|
|
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_PARENT,
|
|
16
|
+
type ATTR_TYPE,
|
|
17
|
+
EntityKind,
|
|
18
|
+
KindId,
|
|
19
|
+
type MetaId,
|
|
20
|
+
type ObjectMeta,
|
|
21
|
+
type ParentId,
|
|
22
|
+
type SchemaId,
|
|
23
|
+
TypeId,
|
|
24
|
+
type Version,
|
|
25
|
+
} from '../types';
|
|
26
|
+
|
|
27
|
+
import {
|
|
28
|
+
type ATTR_RELATION_SOURCE,
|
|
29
|
+
type ATTR_RELATION_TARGET,
|
|
30
|
+
RelationSourceDXNId,
|
|
31
|
+
RelationSourceId,
|
|
32
|
+
RelationTargetDXNId,
|
|
33
|
+
RelationTargetId,
|
|
34
|
+
} from './relation';
|
|
35
|
+
|
|
36
|
+
//
|
|
37
|
+
// Defines the internal model of the echo object.
|
|
38
|
+
//
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Property name for self DXN when object is serialized to JSON.
|
|
42
|
+
*/
|
|
43
|
+
export const ATTR_SELF_DXN = '@dxn';
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* DXN to the object itself.
|
|
47
|
+
*/
|
|
48
|
+
export const SelfDXNId = Symbol.for('@dxos/echo/DXN');
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Property name for deleted when object is serialized to JSON.
|
|
52
|
+
*/
|
|
53
|
+
export const ATTR_DELETED = '@deleted';
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Deletion marker.
|
|
57
|
+
*/
|
|
58
|
+
export const ObjectDeletedId = Symbol.for('@dxos/echo/Deleted');
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Object version accessor symbol.
|
|
62
|
+
*/
|
|
63
|
+
export const ObjectVersionId: unique symbol = Symbol.for('@dxos/echo/Version');
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Object database accessor symbol.
|
|
67
|
+
*/
|
|
68
|
+
export const ObjectDatabaseId = Symbol.for('@dxos/echo/Database');
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Internal runtime representation of an object.
|
|
72
|
+
* The fields are accessed through getter functions.
|
|
73
|
+
*/
|
|
74
|
+
// NOTE: Each symbol has a jsdoc describing its purpose.
|
|
75
|
+
export interface InternalObjectProps {
|
|
76
|
+
readonly id: ObjectId;
|
|
77
|
+
readonly [SelfDXNId]: DXN;
|
|
78
|
+
readonly [KindId]: EntityKind;
|
|
79
|
+
readonly [SchemaId]: Schema.Schema.AnyNoContext;
|
|
80
|
+
readonly [TypeId]: DXN;
|
|
81
|
+
readonly [MetaId]?: ObjectMeta;
|
|
82
|
+
[ParentId]?: InternalObjectProps;
|
|
83
|
+
readonly [ObjectDatabaseId]?: Database.Database;
|
|
84
|
+
readonly [ObjectDeletedId]?: boolean;
|
|
85
|
+
readonly [ObjectVersionId]?: Version;
|
|
86
|
+
readonly [RelationSourceDXNId]?: DXN;
|
|
87
|
+
readonly [RelationTargetDXNId]?: DXN;
|
|
88
|
+
readonly [RelationSourceId]?: InternalObjectProps;
|
|
89
|
+
readonly [RelationTargetId]?: InternalObjectProps;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Entity metadata.
|
|
94
|
+
*/
|
|
95
|
+
export interface ObjectMetaJSON {
|
|
96
|
+
keys: ForeignKey[];
|
|
97
|
+
tags?: string[];
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* JSON representation of an object or relation metadata.
|
|
102
|
+
*/
|
|
103
|
+
export interface ObjectJSON {
|
|
104
|
+
id: string;
|
|
105
|
+
[ATTR_TYPE]: DXN.String;
|
|
106
|
+
[ATTR_SELF_DXN]?: DXN.String;
|
|
107
|
+
[ATTR_PARENT]?: string; // Encoded reference
|
|
108
|
+
[ATTR_DELETED]?: boolean;
|
|
109
|
+
[ATTR_META]?: ObjectMetaJSON;
|
|
110
|
+
[ATTR_RELATION_SOURCE]?: DXN.String;
|
|
111
|
+
[ATTR_RELATION_TARGET]?: DXN.String;
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Application-specific properties.
|
|
115
|
+
*/
|
|
116
|
+
[key: string]: unknown;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* NOTE: Keep as `function` to avoid type inference issues.
|
|
121
|
+
*/
|
|
122
|
+
export function assertObjectModel(obj: unknown): asserts obj is InternalObjectProps {
|
|
123
|
+
invariant(typeof obj === 'object' && obj !== null, 'Invalid object model: not an object');
|
|
124
|
+
assumeType<InternalObjectProps>(obj);
|
|
125
|
+
invariant(ObjectId.isValid(obj.id), 'Invalid object model: invalid id');
|
|
126
|
+
invariant(obj[TypeId] === undefined || obj[TypeId] instanceof DXN, 'Invalid object model: invalid type');
|
|
127
|
+
invariant(
|
|
128
|
+
obj[KindId] === EntityKind.Object || obj[KindId] === EntityKind.Relation,
|
|
129
|
+
'Invalid object model: invalid entity kind',
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
if (obj[KindId] === EntityKind.Relation) {
|
|
133
|
+
invariant(obj[RelationSourceDXNId] instanceof DXN, 'Invalid object model: invalid relation source');
|
|
134
|
+
invariant(obj[RelationTargetDXNId] instanceof DXN, 'Invalid object model: invalid relation target');
|
|
135
|
+
invariant(!(obj[RelationSourceId] instanceof DXN), 'Invalid object model: source pointer is a DXN');
|
|
136
|
+
invariant(!(obj[RelationTargetId] instanceof DXN), 'Invalid object model: target pointer is a DXN');
|
|
137
|
+
}
|
|
138
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
import * as SchemaAST from 'effect/SchemaAST';
|
|
7
|
+
|
|
8
|
+
import { invariant } from '@dxos/invariant';
|
|
9
|
+
|
|
10
|
+
import { type TypeAnnotation, TypeAnnotationId, type TypeMeta, makeTypeJsonSchemaAnnotation } from '../annotations';
|
|
11
|
+
import { EntityKind } from '../types';
|
|
12
|
+
|
|
13
|
+
import { type EchoTypeSchema, makeEchoTypeSchema } from './entity';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Object schema type with kind marker.
|
|
17
|
+
*/
|
|
18
|
+
export type EchoObjectSchema<
|
|
19
|
+
Self extends Schema.Schema.Any,
|
|
20
|
+
Fields extends Schema.Struct.Fields = Schema.Struct.Fields,
|
|
21
|
+
> = EchoTypeSchema<Self, {}, EntityKind.Object, Fields>;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Schema for Obj entity types.
|
|
25
|
+
* Pipeable function to add ECHO object annotations to a schema.
|
|
26
|
+
*/
|
|
27
|
+
export const EchoObjectSchema: {
|
|
28
|
+
(
|
|
29
|
+
meta: TypeMeta,
|
|
30
|
+
): <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(
|
|
31
|
+
self: Self & { fields?: Fields },
|
|
32
|
+
) => EchoObjectSchema<Self, Fields>;
|
|
33
|
+
} = ({ typename, version }) => {
|
|
34
|
+
return <Self extends Schema.Schema.Any, Fields extends Schema.Struct.Fields = Schema.Struct.Fields>(
|
|
35
|
+
self: Self & { fields?: Fields },
|
|
36
|
+
): EchoObjectSchema<Self, Fields> => {
|
|
37
|
+
invariant(typeof TypeAnnotationId === 'symbol', 'Sanity.');
|
|
38
|
+
invariant(SchemaAST.isTypeLiteral(self.ast), 'Schema must be a TypeLiteral.');
|
|
39
|
+
|
|
40
|
+
// Extract fields from the schema if available (Struct schemas have .fields).
|
|
41
|
+
const fields = ((self as any).fields ?? {}) as Fields;
|
|
42
|
+
|
|
43
|
+
const schemaWithId = Schema.extend(self, Schema.Struct({ id: Schema.String }));
|
|
44
|
+
const ast = SchemaAST.annotations(schemaWithId.ast, {
|
|
45
|
+
// TODO(dmaretskyi): `extend` kills the annotations.
|
|
46
|
+
...self.ast.annotations,
|
|
47
|
+
[TypeAnnotationId]: { kind: EntityKind.Object, typename, version } satisfies TypeAnnotation,
|
|
48
|
+
// TODO(dmaretskyi): TypeIdentifierAnnotationId?
|
|
49
|
+
[SchemaAST.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
|
|
50
|
+
kind: EntityKind.Object,
|
|
51
|
+
typename,
|
|
52
|
+
version,
|
|
53
|
+
}),
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
return makeEchoTypeSchema<Self, EntityKind.Object, Fields>(fields, ast, typename, version, EntityKind.Object);
|
|
57
|
+
};
|
|
58
|
+
};
|