@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
|
@@ -17,19 +17,23 @@ import { DXN, ObjectId } from '@dxos/keys';
|
|
|
17
17
|
import { log } from '@dxos/log';
|
|
18
18
|
import { clearUndefined, orderKeys, removeProperties } from '@dxos/util';
|
|
19
19
|
|
|
20
|
-
import {
|
|
21
|
-
|
|
20
|
+
import {
|
|
21
|
+
type TypeAnnotation,
|
|
22
|
+
TypeAnnotationId,
|
|
23
|
+
TypeIdentifierAnnotationId,
|
|
24
|
+
makeTypeJsonSchemaAnnotation,
|
|
25
|
+
} from '../annotations';
|
|
26
|
+
import { type JsonSchemaReferenceInfo, createEchoReferenceSchema } from '../ref';
|
|
27
|
+
import { ANY_OBJECT_TYPENAME, ANY_OBJECT_VERSION, EntityKind, EntityKindSchema } from '../types';
|
|
28
|
+
|
|
29
|
+
import { CustomAnnotations, DecodedAnnotations, EchoAnnotations } from './annotations';
|
|
22
30
|
import {
|
|
23
31
|
ECHO_ANNOTATIONS_NS_DEPRECATED_KEY,
|
|
24
32
|
ECHO_ANNOTATIONS_NS_KEY,
|
|
25
33
|
type JsonSchemaEchoAnnotations,
|
|
26
34
|
type JsonSchemaType,
|
|
27
35
|
getNormalizedEchoAnnotations,
|
|
28
|
-
} from '
|
|
29
|
-
import { Expando, makeTypeJsonSchemaAnnotation } from '../object';
|
|
30
|
-
import { type JsonSchemaReferenceInfo, Ref, createEchoReferenceSchema } from '../ref';
|
|
31
|
-
|
|
32
|
-
import { CustomAnnotations, DecodedAnnotations, EchoAnnotations } from './annotations';
|
|
36
|
+
} from './json-schema-type';
|
|
33
37
|
|
|
34
38
|
// TODO(burdon): Are these values stored (can they be changed?)
|
|
35
39
|
export enum PropType {
|
|
@@ -71,9 +75,16 @@ export type JsonSchemaOptions = {
|
|
|
71
75
|
|
|
72
76
|
/**
|
|
73
77
|
* Convert effect schema to JSON Schema.
|
|
78
|
+
* NOTE: This handles custom annotations.
|
|
74
79
|
* @param schema
|
|
75
80
|
*/
|
|
76
|
-
|
|
81
|
+
// TODO(burdon): Reconcile with possibly extending @effect/Schema/JSONSchema
|
|
82
|
+
// We add additional propertyOrder (but the object properties ARE ordered); and type "string" for literals.
|
|
83
|
+
// TODO(wittjosiah): This is mutable because its a pojo, perhaps should be left as readonly at type level though?
|
|
84
|
+
export const toJsonSchema = (
|
|
85
|
+
schema: Schema.Schema.All,
|
|
86
|
+
options: JsonSchemaOptions = {},
|
|
87
|
+
): Types.DeepMutable<JsonSchemaType> => {
|
|
77
88
|
assertArgument(Schema.isSchema(schema), 'schema');
|
|
78
89
|
let jsonSchema = _toJsonSchemaAST(schema.ast);
|
|
79
90
|
if (options.strict) {
|
|
@@ -96,11 +107,11 @@ export const toJsonSchema = (schema: Schema.Schema.All, options: JsonSchemaOptio
|
|
|
96
107
|
return jsonSchema;
|
|
97
108
|
};
|
|
98
109
|
|
|
99
|
-
const _toJsonSchemaAST = (ast: SchemaAST.AST): JsonSchemaType => {
|
|
110
|
+
const _toJsonSchemaAST = (ast: SchemaAST.AST): Types.DeepMutable<JsonSchemaType> => {
|
|
100
111
|
const withRefinements = withEchoRefinements(ast, '#');
|
|
101
112
|
const jsonSchema = JSONSchema.fromAST(withRefinements, {
|
|
102
113
|
definitions: {},
|
|
103
|
-
}) as JsonSchemaType
|
|
114
|
+
}) as Types.DeepMutable<JsonSchemaType>;
|
|
104
115
|
|
|
105
116
|
return normalizeJsonSchema(jsonSchema);
|
|
106
117
|
};
|
|
@@ -319,7 +330,7 @@ const objectToEffectSchema = (root: JsonSchemaType, defs: JsonSchemaType['$defs'
|
|
|
319
330
|
}
|
|
320
331
|
|
|
321
332
|
if (immutableIdField) {
|
|
322
|
-
schema = Schema.extend(
|
|
333
|
+
schema = Schema.extend(schema, Schema.Struct({ id: immutableIdField }));
|
|
323
334
|
}
|
|
324
335
|
|
|
325
336
|
const annotations = jsonSchemaFieldsToAnnotations(root);
|
|
@@ -344,8 +355,10 @@ const anyToEffectSchema = (root: JSONSchema.JsonSchema7Any): Schema.Schema.AnyNo
|
|
|
344
355
|
// TODO(dmaretskyi): Types.
|
|
345
356
|
const refToEffectSchema = (root: any): Schema.Schema.AnyNoContext => {
|
|
346
357
|
if (!('reference' in root)) {
|
|
347
|
-
|
|
358
|
+
// Fallback to generic object ref when no reference info is provided.
|
|
359
|
+
return createEchoReferenceSchema(undefined, ANY_OBJECT_TYPENAME, ANY_OBJECT_VERSION);
|
|
348
360
|
}
|
|
361
|
+
|
|
349
362
|
const reference: JsonSchemaReferenceInfo = root.reference;
|
|
350
363
|
if (typeof reference !== 'object') {
|
|
351
364
|
throw new Error('Invalid reference field in ref schema');
|
|
@@ -368,7 +381,7 @@ const refToEffectSchema = (root: any): Schema.Schema.AnyNoContext => {
|
|
|
368
381
|
const annotations_toJsonSchemaFields = (annotations: SchemaAST.Annotations): Record<symbol, any> => {
|
|
369
382
|
const schemaFields: Record<string, any> = {};
|
|
370
383
|
|
|
371
|
-
const echoAnnotations: JsonSchemaEchoAnnotations = {};
|
|
384
|
+
const echoAnnotations: Types.Mutable<JsonSchemaEchoAnnotations> = {};
|
|
372
385
|
for (const [key, annotationId] of Object.entries(EchoAnnotations)) {
|
|
373
386
|
if (annotations[annotationId] != null) {
|
|
374
387
|
echoAnnotations[key as keyof JsonSchemaEchoAnnotations] = annotations[annotationId] as any;
|
|
@@ -486,7 +499,7 @@ const addJsonSchemaFields = (ast: SchemaAST.AST, schema: JsonSchemaType): Schema
|
|
|
486
499
|
* Fixes field order.
|
|
487
500
|
* Sets `$schema` prop.
|
|
488
501
|
*/
|
|
489
|
-
const normalizeJsonSchema = (jsonSchema: JsonSchemaType): JsonSchemaType => {
|
|
502
|
+
const normalizeJsonSchema = (jsonSchema: Types.DeepMutable<JsonSchemaType>): Types.DeepMutable<JsonSchemaType> => {
|
|
490
503
|
if (jsonSchema.properties && 'id' in jsonSchema.properties) {
|
|
491
504
|
jsonSchema.properties = orderKeys(jsonSchema.properties, ['id']); // Put id first.
|
|
492
505
|
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { invariant } from '@dxos/invariant';
|
|
6
|
+
import { deepMapValues } from '@dxos/util';
|
|
7
|
+
|
|
8
|
+
import type * as Obj from '../../Obj';
|
|
9
|
+
import { makeObject } from '../proxy';
|
|
10
|
+
import { Ref } from '../ref';
|
|
11
|
+
import { getMeta, getSchema } from '../types';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Clones an object or relation.
|
|
15
|
+
* This does not clone referenced objects, only the properties in the object.
|
|
16
|
+
* @returns A new object with the same schema and properties.
|
|
17
|
+
*/
|
|
18
|
+
export const clone = <T extends Obj.Any>(obj: T, opts?: Obj.CloneOptions): T => {
|
|
19
|
+
const { id, ...data } = obj;
|
|
20
|
+
const schema = getSchema(obj);
|
|
21
|
+
invariant(schema != null, 'Object should have a schema');
|
|
22
|
+
const props: any = deepMapValues(data, (value, recurse) => {
|
|
23
|
+
if (Ref.isRef(value)) {
|
|
24
|
+
if (opts?.deep) {
|
|
25
|
+
// TODO(dmaretskyi): Will break on circular references.
|
|
26
|
+
return Ref.make(clone(value.target!, opts));
|
|
27
|
+
}
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
30
|
+
return recurse(value);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
if (opts?.retainId) {
|
|
34
|
+
props.id = id;
|
|
35
|
+
}
|
|
36
|
+
const meta = deepMapValues(getMeta(obj), (value, recurse) => {
|
|
37
|
+
if (Ref.isRef(value)) {
|
|
38
|
+
if (opts?.deep) {
|
|
39
|
+
// TODO(dmaretskyi): Will break on circular references.
|
|
40
|
+
return Ref.make(clone(value.target!, opts));
|
|
41
|
+
}
|
|
42
|
+
return value;
|
|
43
|
+
}
|
|
44
|
+
return recurse(value);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
return makeObject(schema, props, meta);
|
|
48
|
+
};
|
|
@@ -4,9 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
import * as Schema from 'effect/Schema';
|
|
6
6
|
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
import { getTypename } from './typename';
|
|
7
|
+
import { getTypename } from '../annotations';
|
|
8
|
+
import { type AnyProperties } from '../types';
|
|
10
9
|
|
|
11
10
|
// TODO(dmaretskyi): Rename to represent commonality between objects and relations (e.g. `entity`).
|
|
12
11
|
export type TypedObjectOptions = {
|
|
@@ -58,7 +57,7 @@ export const makeTypedEntityClass = (
|
|
|
58
57
|
static readonly pipe = baseSchema.pipe.bind(baseSchema);
|
|
59
58
|
|
|
60
59
|
// TODO(burdon): Comment required.
|
|
61
|
-
static [Symbol.hasInstance](obj:
|
|
60
|
+
static [Symbol.hasInstance](obj: AnyProperties) {
|
|
62
61
|
return obj != null && getTypename(obj) === typename;
|
|
63
62
|
}
|
|
64
63
|
|
|
@@ -9,15 +9,14 @@ import { describe, expect, test } from 'vitest';
|
|
|
9
9
|
|
|
10
10
|
import { DXN } from '@dxos/keys';
|
|
11
11
|
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import { isInstanceOf } from '../
|
|
12
|
+
import { Relation } from '../../index';
|
|
13
|
+
import { TestSchema } from '../../testing';
|
|
14
|
+
import { getSchemaDXN, getTypeDXN, isInstanceOf } from '../annotations';
|
|
15
|
+
import { ATTR_RELATION_SOURCE, ATTR_RELATION_TARGET } from '../entities';
|
|
16
|
+
import { ATTR_META, ATTR_TYPE, getSchema } from '../types';
|
|
15
17
|
|
|
16
|
-
import {
|
|
17
|
-
import { create } from './create';
|
|
18
|
+
import { createObject } from './create-object';
|
|
18
19
|
import { objectToJSON } from './json-serializer';
|
|
19
|
-
import { RelationSourceId, RelationTargetId } from './model';
|
|
20
|
-
import { getType } from './typename';
|
|
21
20
|
|
|
22
21
|
describe('create (static version)', () => {
|
|
23
22
|
test('defaults', ({ expect }) => {
|
|
@@ -34,7 +33,7 @@ describe('create (static version)', () => {
|
|
|
34
33
|
});
|
|
35
34
|
|
|
36
35
|
test('create static object', () => {
|
|
37
|
-
const contact =
|
|
36
|
+
const contact = createObject(TestSchema.Person, {
|
|
38
37
|
name: 'Bot',
|
|
39
38
|
email: 'bot@example.com',
|
|
40
39
|
});
|
|
@@ -43,12 +42,12 @@ describe('create (static version)', () => {
|
|
|
43
42
|
expect(contact.name).toBe('Bot');
|
|
44
43
|
expect(contact.email).toBe('bot@example.com');
|
|
45
44
|
expect((contact as any)['@type']).toBeUndefined();
|
|
46
|
-
expect(
|
|
47
|
-
expect(isInstanceOf(
|
|
45
|
+
expect(getTypeDXN(contact)?.toString()).toBe(getSchemaDXN(TestSchema.Person)!.toString());
|
|
46
|
+
expect(isInstanceOf(TestSchema.Person, contact)).toBe(true);
|
|
48
47
|
});
|
|
49
48
|
|
|
50
49
|
test('JSON encoding', () => {
|
|
51
|
-
const contact =
|
|
50
|
+
const contact = createObject(TestSchema.Person, {
|
|
52
51
|
name: 'Bot',
|
|
53
52
|
email: 'bot@example.com',
|
|
54
53
|
});
|
|
@@ -56,7 +55,7 @@ describe('create (static version)', () => {
|
|
|
56
55
|
const json = JSON.parse(JSON.stringify(contact));
|
|
57
56
|
expect(json).toEqual({
|
|
58
57
|
id: contact.id,
|
|
59
|
-
'@type': DXN.fromTypenameAndVersion(
|
|
58
|
+
'@type': DXN.fromTypenameAndVersion(TestSchema.Person.typename, TestSchema.Person.version).toString(),
|
|
60
59
|
'@meta': {
|
|
61
60
|
keys: [],
|
|
62
61
|
},
|
|
@@ -67,48 +66,47 @@ describe('create (static version)', () => {
|
|
|
67
66
|
});
|
|
68
67
|
|
|
69
68
|
test('JSON encoding with relation', () => {
|
|
70
|
-
const
|
|
71
|
-
name: '
|
|
72
|
-
email: '
|
|
69
|
+
const person1 = createObject(TestSchema.Person, {
|
|
70
|
+
name: 'Alice',
|
|
71
|
+
email: 'alice@example.com',
|
|
73
72
|
});
|
|
74
|
-
const
|
|
75
|
-
name: '
|
|
76
|
-
email: '
|
|
73
|
+
const person2 = createObject(TestSchema.Person, {
|
|
74
|
+
name: 'Bob',
|
|
75
|
+
email: 'bob@example.com',
|
|
77
76
|
});
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
[
|
|
77
|
+
|
|
78
|
+
const manager = createObject(TestSchema.HasManager, {
|
|
79
|
+
[Relation.Source]: person1 as any,
|
|
80
|
+
[Relation.Target]: person2 as any,
|
|
81
81
|
});
|
|
82
82
|
|
|
83
|
-
const json = JSON.parse(JSON.stringify(
|
|
83
|
+
const json = JSON.parse(JSON.stringify(manager));
|
|
84
84
|
expect(json).toEqual({
|
|
85
|
-
id:
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
85
|
+
id: manager.id,
|
|
86
|
+
[ATTR_TYPE]: DXN.fromTypenameAndVersion(TestSchema.HasManager.typename, TestSchema.HasManager.version).toString(),
|
|
87
|
+
[ATTR_RELATION_SOURCE]: DXN.fromLocalObjectId(person1.id).toString(),
|
|
88
|
+
[ATTR_RELATION_TARGET]: DXN.fromLocalObjectId(person2.id).toString(),
|
|
89
|
+
[ATTR_META]: {
|
|
90
90
|
keys: [],
|
|
91
91
|
},
|
|
92
92
|
});
|
|
93
93
|
});
|
|
94
94
|
|
|
95
95
|
test('getSchema', () => {
|
|
96
|
-
const contact =
|
|
96
|
+
const contact = createObject(TestSchema.Person, {
|
|
97
97
|
name: 'Bot',
|
|
98
98
|
email: 'bot@example.com',
|
|
99
99
|
});
|
|
100
100
|
|
|
101
|
-
expect(getSchema(contact)).toBe(
|
|
101
|
+
expect(getSchema(contact)).toBe(TestSchema.Person);
|
|
102
102
|
});
|
|
103
103
|
|
|
104
104
|
test('inspect', () => {
|
|
105
|
-
const contact =
|
|
105
|
+
const contact = createObject(TestSchema.Person, {
|
|
106
106
|
name: 'Bot',
|
|
107
107
|
email: 'bot@example.com',
|
|
108
108
|
});
|
|
109
109
|
|
|
110
|
-
// console.log(contact);
|
|
111
|
-
|
|
112
110
|
const text = inspect(contact);
|
|
113
111
|
expect(text).toContain('Bot');
|
|
114
112
|
expect(text).toContain('bot@example.com');
|
|
@@ -7,33 +7,30 @@ import type * as Schema from 'effect/Schema';
|
|
|
7
7
|
import { raise } from '@dxos/debug';
|
|
8
8
|
import { assertArgument, failedInvariant } from '@dxos/invariant';
|
|
9
9
|
import { ObjectId } from '@dxos/keys';
|
|
10
|
-
import { defineHiddenProperty } from '@dxos/live-object';
|
|
11
10
|
|
|
12
|
-
import {
|
|
13
|
-
|
|
14
|
-
import { getObjectDXN, setSchema } from './accessors';
|
|
15
|
-
import { attachedTypedObjectInspector } from './inspect';
|
|
16
|
-
import { attachTypedJsonSerializer } from './json-serializer';
|
|
11
|
+
import { getSchemaDXN, getTypeAnnotation, setTypename } from '../annotations';
|
|
17
12
|
import {
|
|
18
|
-
EntityKindId,
|
|
19
|
-
MetaId,
|
|
20
13
|
RelationSourceDXNId,
|
|
21
14
|
RelationSourceId,
|
|
22
15
|
RelationTargetDXNId,
|
|
23
16
|
RelationTargetId,
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
17
|
+
assertObjectModel,
|
|
18
|
+
getObjectDXN,
|
|
19
|
+
} from '../entities';
|
|
20
|
+
import { defineHiddenProperty } from '../proxy';
|
|
21
|
+
import { EntityKind, KindId, MetaId, setSchema } from '../types';
|
|
22
|
+
|
|
23
|
+
import { attachedTypedObjectInspector } from './inspect';
|
|
24
|
+
import { attachTypedJsonSerializer } from './json-serializer';
|
|
27
25
|
|
|
28
|
-
|
|
29
|
-
type CreateData<T> = T extends { id: string } ? Omit<T, 'id' | typeof EntityKindId> & { id?: string } : T;
|
|
26
|
+
export type CreateObjectProps<T> = T extends { id: string } ? Omit<T, 'id' | KindId> & { id?: string } : T;
|
|
30
27
|
|
|
31
28
|
/**
|
|
32
29
|
* Creates a new object instance from a schema and data, without signal reactivity.
|
|
33
30
|
* This static version creates plain JavaScript objects that are not reactive/observable.
|
|
34
31
|
* For reactive objects that automatically update UI when changed, use the regular live() function.
|
|
35
32
|
*
|
|
36
|
-
* @param schema - The Effect schema that defines the object's structure and type, piped into
|
|
33
|
+
* @param schema - The Effect schema that defines the object's structure and type, piped into EchoObjectSchema
|
|
37
34
|
* @param data - The data to initialize the object with. The id and @type fields are handled automatically.
|
|
38
35
|
* @returns A new non-reactive object instance conforming to the schema
|
|
39
36
|
* @throws {Error} If the schema is not an object schema
|
|
@@ -44,53 +41,55 @@ type CreateData<T> = T extends { id: string } ? Omit<T, 'id' | typeof EntityKind
|
|
|
44
41
|
* const Contact = Schema.Struct({
|
|
45
42
|
* name: Schema.String,
|
|
46
43
|
* email: Schema.String,
|
|
47
|
-
* }).pipe(Type.
|
|
44
|
+
* }).pipe(Type.object({
|
|
48
45
|
* typename: 'example.com/type/Person',
|
|
49
46
|
* version: '0.1.0',
|
|
50
47
|
* }))
|
|
51
48
|
*
|
|
52
|
-
*
|
|
53
|
-
* const contact = create(Contact, {
|
|
49
|
+
* const contact = createObject(Contact, {
|
|
54
50
|
* name: "John",
|
|
55
51
|
* email: "john@example.com",
|
|
56
52
|
* })
|
|
57
53
|
* ```
|
|
58
54
|
*/
|
|
59
|
-
// TODO(burdon):
|
|
60
|
-
|
|
61
|
-
// TODO(dmaretskyi): Use `Obj.make` and `Relation.make` from '@dxos/echo' instead.
|
|
62
|
-
export const create = <S extends Schema.Schema.AnyNoContext>(
|
|
55
|
+
// TODO(burdon): Make internal.
|
|
56
|
+
export const createObject = <S extends Schema.Schema.AnyNoContext>(
|
|
63
57
|
schema: S,
|
|
64
|
-
|
|
65
|
-
):
|
|
58
|
+
props: CreateObjectProps<Schema.Schema.Type<S>>,
|
|
59
|
+
): CreateObjectProps<Schema.Schema.Type<S>> & { id: string; [KindId]: EntityKind } => {
|
|
66
60
|
const annotation = getTypeAnnotation(schema);
|
|
67
61
|
if (!annotation) {
|
|
68
|
-
throw new Error('Schema is not an
|
|
62
|
+
throw new Error('Schema is not an ECHO schema');
|
|
69
63
|
}
|
|
70
|
-
assertArgument(!('@type' in
|
|
71
|
-
assertArgument(!(RelationSourceDXNId in
|
|
72
|
-
assertArgument(!(RelationTargetDXNId in
|
|
64
|
+
assertArgument(!('@type' in props), 'data', '@type is not allowed');
|
|
65
|
+
assertArgument(!(RelationSourceDXNId in props), 'data', 'Relation source DXN is not allowed in the constructor');
|
|
66
|
+
assertArgument(!(RelationTargetDXNId in props), 'data', 'Relation target DXN is not allowed in the constructor');
|
|
73
67
|
assertArgument(
|
|
74
|
-
RelationSourceId in
|
|
68
|
+
RelationSourceId in props === RelationTargetId in props,
|
|
75
69
|
'data',
|
|
76
70
|
'Relation source and target must be provided together',
|
|
77
71
|
);
|
|
78
72
|
|
|
79
|
-
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
73
|
+
// Raw object.
|
|
74
|
+
const obj = { ...props, id: props.id ?? ObjectId.random() };
|
|
75
|
+
|
|
76
|
+
// Metadata.
|
|
77
|
+
const kind = RelationSourceId in props ? EntityKind.Relation : EntityKind.Object;
|
|
78
|
+
defineHiddenProperty(obj, KindId, kind);
|
|
79
|
+
defineHiddenProperty(obj, MetaId, { keys: [] });
|
|
83
80
|
setSchema(obj, schema);
|
|
81
|
+
setTypename(obj, getSchemaDXN(schema) ?? failedInvariant('Missing schema DXN'));
|
|
84
82
|
attachTypedJsonSerializer(obj);
|
|
85
83
|
attachedTypedObjectInspector(obj);
|
|
86
|
-
|
|
84
|
+
|
|
85
|
+
// Relation.
|
|
87
86
|
if (kind === EntityKind.Relation) {
|
|
88
|
-
const sourceDXN = getObjectDXN(
|
|
89
|
-
const targetDXN = getObjectDXN(
|
|
87
|
+
const sourceDXN = getObjectDXN(props[RelationSourceId]) ?? raise(new Error('Unresolved relation source'));
|
|
88
|
+
const targetDXN = getObjectDXN(props[RelationTargetId]) ?? raise(new Error('Unresolved relation target'));
|
|
90
89
|
defineHiddenProperty(obj, RelationSourceDXNId, sourceDXN);
|
|
91
90
|
defineHiddenProperty(obj, RelationTargetDXNId, targetDXN);
|
|
92
91
|
}
|
|
93
92
|
|
|
94
|
-
|
|
93
|
+
assertObjectModel(obj);
|
|
95
94
|
return obj;
|
|
96
95
|
};
|
|
@@ -2,18 +2,18 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
import { DeletedId } from './model';
|
|
5
|
+
import { ObjectDeletedId } from '../entities';
|
|
6
|
+
import { type AnyProperties } from '../types';
|
|
8
7
|
|
|
9
8
|
/**
|
|
10
9
|
* @returns `true` if the object has been marked as deleted.
|
|
11
10
|
*/
|
|
12
|
-
export const isDeleted = (obj:
|
|
13
|
-
if ((obj as any)[
|
|
11
|
+
export const isDeleted = (obj: AnyProperties): boolean => {
|
|
12
|
+
if ((obj as any)[ObjectDeletedId] === undefined) {
|
|
14
13
|
// TODO(dmaretskyi): Return to prior behavior of throwing.
|
|
15
14
|
// throw new Error('Object does not support deletion marker');
|
|
16
15
|
return false;
|
|
17
16
|
}
|
|
18
|
-
|
|
17
|
+
|
|
18
|
+
return (obj as any)[ObjectDeletedId] ?? false;
|
|
19
19
|
};
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
import { DXN, ObjectId, QueueSubspaceTags, SpaceId } from '@dxos/keys';
|
|
6
6
|
|
|
7
|
-
// TODO(burdon): Move to @dxos/keys once ObjectId is moved there.
|
|
8
7
|
/**
|
|
9
8
|
* @deprecated Use `db.queues.create()`
|
|
10
9
|
*/
|
|
10
|
+
// TODO(burdon): Move to @dxos/keys.
|
|
11
11
|
export const createQueueDXN = (spaceId = SpaceId.random(), queueId = ObjectId.random()) =>
|
|
12
12
|
new DXN(DXN.kind.QUEUE, [QueueSubspaceTags.DATA, spaceId, queueId]);
|
|
@@ -3,17 +3,12 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
export * from './common';
|
|
6
|
-
export * from './create';
|
|
7
|
-
export * from './
|
|
8
|
-
export * from './expando';
|
|
6
|
+
export * from './create-object';
|
|
7
|
+
export * from './deleted';
|
|
9
8
|
export * from './ids';
|
|
10
9
|
export * from './json-serializer';
|
|
11
|
-
export * from './meta';
|
|
12
|
-
export type * from './relation';
|
|
13
|
-
export * from './typed-object';
|
|
14
|
-
export * from './typename';
|
|
15
|
-
export * from './deleted';
|
|
16
|
-
export * from './model';
|
|
17
|
-
export * from './accessors';
|
|
18
10
|
export * from './schema-validator';
|
|
19
|
-
export * from './
|
|
11
|
+
export * from './set-value';
|
|
12
|
+
export * from './snapshot';
|
|
13
|
+
export * from './typed-object';
|
|
14
|
+
export * from './clone';
|
|
@@ -6,10 +6,8 @@ import type { InspectOptionsStylized, inspect as inspectFn } from 'node:util';
|
|
|
6
6
|
|
|
7
7
|
import { type CustomInspectFunction, inspectCustom } from '@dxos/debug';
|
|
8
8
|
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
import { ATTR_META, ATTR_TYPE, MetaId } from './model';
|
|
12
|
-
import { getType } from './typename';
|
|
9
|
+
import { getTypeDXN } from '../annotations';
|
|
10
|
+
import { ATTR_META, ATTR_TYPE, type AnyEntity, MetaId } from '../types';
|
|
13
11
|
|
|
14
12
|
/*
|
|
15
13
|
* @internal
|
|
@@ -29,8 +27,8 @@ export const attachedTypedObjectInspector = (obj: any) => {
|
|
|
29
27
|
};
|
|
30
28
|
|
|
31
29
|
// NOTE: KEEP as function.
|
|
32
|
-
const typedObjectInspectFunction: CustomInspectFunction<
|
|
33
|
-
this:
|
|
30
|
+
const typedObjectInspectFunction: CustomInspectFunction<AnyEntity> = function (
|
|
31
|
+
this: AnyEntity,
|
|
34
32
|
depth: number,
|
|
35
33
|
options: InspectOptionsStylized,
|
|
36
34
|
inspect: typeof inspectFn,
|
|
@@ -39,7 +37,7 @@ const typedObjectInspectFunction: CustomInspectFunction<AnyEchoObject> = functio
|
|
|
39
37
|
return inspect(
|
|
40
38
|
{
|
|
41
39
|
id,
|
|
42
|
-
[ATTR_TYPE]:
|
|
40
|
+
[ATTR_TYPE]: getTypeDXN(this),
|
|
43
41
|
...props,
|
|
44
42
|
[ATTR_META]: (this as any)[MetaId], // TODO(dmaretskyi): Couldn't use getMeta since that throw's if the object has no meta.
|
|
45
43
|
},
|
|
@@ -6,26 +6,27 @@ import { describe, expect, test } from 'vitest';
|
|
|
6
6
|
|
|
7
7
|
import { DXN } from '@dxos/keys';
|
|
8
8
|
|
|
9
|
-
import
|
|
9
|
+
import * as Obj from '../../Obj';
|
|
10
|
+
import { TestSchema } from '../../testing';
|
|
11
|
+
import { getSchemaDXN, getSchemaTypename, getTypeDXN, getTypename } from '../annotations';
|
|
12
|
+
import { getMetaChecked } from '../api';
|
|
13
|
+
import { RelationSourceId, RelationTargetId, getObjectDXN } from '../entities';
|
|
14
|
+
import { makeObject } from '../proxy';
|
|
10
15
|
import { Ref, StaticRefResolver } from '../ref';
|
|
11
|
-
import {
|
|
16
|
+
import { ATTR_TYPE, EntityKind, KindId, MetaId, TypeId, getSchema } from '../types';
|
|
12
17
|
|
|
13
|
-
import {
|
|
14
|
-
import { create } from './create';
|
|
18
|
+
import { createObject } from './create-object';
|
|
15
19
|
import { objectFromJSON, objectToJSON } from './json-serializer';
|
|
16
|
-
import { getMeta } from './meta';
|
|
17
|
-
import { ATTR_TYPE, EntityKindId, MetaId, RelationSourceId, RelationTargetId, TypeId } from './model';
|
|
18
|
-
import { getType, getTypename } from './typename';
|
|
19
20
|
|
|
20
21
|
describe('Object JSON serializer', () => {
|
|
21
22
|
test('should serialize and deserialize object', async () => {
|
|
22
|
-
const contact =
|
|
23
|
-
|
|
23
|
+
const contact = makeObject(TestSchema.Person, { name: 'Alice' });
|
|
24
|
+
Obj.change(contact, (c) => {
|
|
25
|
+
getMetaChecked(c).keys.push({ id: '12345', source: 'example.com' });
|
|
24
26
|
});
|
|
25
|
-
getMeta(contact).keys.push({ id: '12345', source: 'crm.example.com' });
|
|
26
27
|
|
|
27
|
-
const task =
|
|
28
|
-
title: '
|
|
28
|
+
const task = createObject(TestSchema.Task, {
|
|
29
|
+
title: 'Fix the tests',
|
|
29
30
|
assignee: Ref.make(contact),
|
|
30
31
|
});
|
|
31
32
|
|
|
@@ -33,67 +34,65 @@ describe('Object JSON serializer', () => {
|
|
|
33
34
|
const taskJson = objectToJSON(task);
|
|
34
35
|
|
|
35
36
|
expect(contactJson.id).toBe(contact.id);
|
|
36
|
-
expect(contactJson[ATTR_TYPE]).toEqual(getSchemaDXN(
|
|
37
|
-
expect(contactJson.name).toEqual('
|
|
37
|
+
expect(contactJson[ATTR_TYPE]).toEqual(getSchemaDXN(TestSchema.Person)!.toString());
|
|
38
|
+
expect(contactJson.name).toEqual('Alice');
|
|
38
39
|
|
|
39
40
|
expect(taskJson.id).toBe(task.id);
|
|
40
|
-
expect(taskJson[ATTR_TYPE]).toEqual(getSchemaDXN(
|
|
41
|
-
expect(taskJson.title).toEqual('
|
|
41
|
+
expect(taskJson[ATTR_TYPE]).toEqual(getSchemaDXN(TestSchema.Task)!.toString());
|
|
42
|
+
expect(taskJson.title).toEqual('Fix the tests');
|
|
42
43
|
expect(taskJson.assignee).toEqual({ '/': DXN.fromLocalObjectId(contact.id).toString() });
|
|
43
44
|
|
|
44
45
|
const refResolver = new StaticRefResolver()
|
|
45
|
-
.addSchema(
|
|
46
|
-
.addSchema(
|
|
46
|
+
.addSchema(TestSchema.Person)
|
|
47
|
+
.addSchema(TestSchema.Task)
|
|
47
48
|
.addObject(contact)
|
|
48
49
|
.addObject(task);
|
|
49
50
|
|
|
50
|
-
const contactFromJson = (await objectFromJSON(contactJson, { refResolver })) as
|
|
51
|
-
const taskFromJson = (await objectFromJSON(taskJson, { refResolver })) as
|
|
51
|
+
const contactFromJson = (await objectFromJSON(contactJson, { refResolver })) as TestSchema.Person;
|
|
52
|
+
const taskFromJson = (await objectFromJSON(taskJson, { refResolver })) as TestSchema.Task;
|
|
52
53
|
|
|
53
54
|
expect(contactFromJson.id).toBe(contact.id);
|
|
54
|
-
expect(contactFromJson.name).toBe('
|
|
55
|
-
expect((contactFromJson as any)[TypeId]).toEqual(getSchemaDXN(
|
|
56
|
-
expect((contactFromJson as any)[
|
|
55
|
+
expect(contactFromJson.name).toBe('Alice');
|
|
56
|
+
expect((contactFromJson as any)[TypeId]).toEqual(getSchemaDXN(TestSchema.Person));
|
|
57
|
+
expect((contactFromJson as any)[KindId]).toBe(EntityKind.Object);
|
|
57
58
|
expect((contactFromJson as any)[RelationSourceId]).toBeUndefined();
|
|
58
59
|
expect((contactFromJson as any)[RelationTargetId]).toBeUndefined();
|
|
59
60
|
expect((contactFromJson as any)[MetaId]).toEqual({
|
|
60
61
|
keys: [
|
|
61
62
|
{
|
|
62
63
|
id: '12345',
|
|
63
|
-
source: '
|
|
64
|
+
source: 'example.com',
|
|
64
65
|
},
|
|
65
66
|
],
|
|
66
67
|
});
|
|
67
|
-
expect(
|
|
68
|
-
expect(getTypename(contactFromJson)).toBe(getSchemaTypename(
|
|
68
|
+
expect(getTypeDXN(contactFromJson)?.toString()).toBe(getSchemaDXN(TestSchema.Person)!.toString());
|
|
69
|
+
expect(getTypename(contactFromJson)).toBe(getSchemaTypename(TestSchema.Person));
|
|
69
70
|
expect(getObjectDXN(contactFromJson)?.toString()).toEqual(getObjectDXN(contact)?.toString());
|
|
70
|
-
expect(getSchema(contactFromJson)).toEqual(
|
|
71
|
+
expect(getSchema(contactFromJson)).toEqual(TestSchema.Person);
|
|
71
72
|
|
|
72
73
|
expect(taskFromJson.id).toBe(task.id);
|
|
73
|
-
expect(taskFromJson.title).toBe('
|
|
74
|
+
expect(taskFromJson.title).toBe('Fix the tests');
|
|
74
75
|
expect(taskFromJson.assignee!.dxn).toEqual(DXN.fromLocalObjectId(contact.id));
|
|
75
76
|
expect(taskFromJson.assignee!.target).toEqual(contact);
|
|
76
77
|
expect(await taskFromJson.assignee!.load()).toEqual(contact);
|
|
77
|
-
expect((taskFromJson as any)[TypeId]).toEqual(getSchemaDXN(
|
|
78
|
-
expect((taskFromJson as any)[
|
|
78
|
+
expect((taskFromJson as any)[TypeId]).toEqual(getSchemaDXN(TestSchema.Task));
|
|
79
|
+
expect((taskFromJson as any)[KindId]).toBe(EntityKind.Object);
|
|
79
80
|
expect((taskFromJson as any)[RelationSourceId]).toBeUndefined();
|
|
80
81
|
expect((taskFromJson as any)[RelationTargetId]).toBeUndefined();
|
|
81
82
|
expect((taskFromJson as any)[MetaId]).toEqual({ keys: [] });
|
|
82
|
-
expect(getSchema(taskFromJson)).toEqual(
|
|
83
|
+
expect(getSchema(taskFromJson)).toEqual(TestSchema.Task);
|
|
83
84
|
});
|
|
84
85
|
|
|
85
86
|
test('serialize with unresolved schema', async () => {
|
|
86
|
-
const contact =
|
|
87
|
-
name: 'John Doe',
|
|
88
|
-
});
|
|
87
|
+
const contact = createObject(TestSchema.Person, { name: 'Alice' });
|
|
89
88
|
const contactJson = objectToJSON(contact);
|
|
90
89
|
const contactFromJson: any = await objectFromJSON(contactJson);
|
|
91
90
|
|
|
92
91
|
expect(contactFromJson.id).toBe(contact.id);
|
|
93
|
-
expect(contactFromJson.name).toBe('
|
|
92
|
+
expect(contactFromJson.name).toBe('Alice');
|
|
94
93
|
expect(getSchema(contactFromJson)).toBeUndefined();
|
|
95
|
-
expect(getTypename(contactFromJson)).toEqual(getSchemaTypename(
|
|
94
|
+
expect(getTypename(contactFromJson)).toEqual(getSchemaTypename(TestSchema.Person));
|
|
96
95
|
expect(getObjectDXN(contactFromJson)).toEqual(getObjectDXN(contact));
|
|
97
|
-
expect(
|
|
96
|
+
expect(getTypeDXN(contactFromJson)).toEqual(getSchemaDXN(TestSchema.Person));
|
|
98
97
|
});
|
|
99
98
|
});
|