@dxos/echo 0.8.4-main.5ad4a44 → 0.8.4-main.66e292d
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/dist/lib/browser/{chunk-MWLA34S5.mjs → chunk-7GH6RXJ3.mjs} +2513 -2673
- package/dist/lib/browser/chunk-7GH6RXJ3.mjs.map +7 -0
- package/dist/lib/browser/chunk-E4UTVJNF.mjs +1111 -0
- package/dist/lib/browser/chunk-E4UTVJNF.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +21 -19
- package/dist/lib/browser/internal/index.mjs +55 -45
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +247 -217
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/node-esm/chunk-JE5RXM2I.mjs +1111 -0
- package/dist/lib/node-esm/chunk-JE5RXM2I.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-YTNLFBIK.mjs → chunk-M4B6BMD2.mjs} +2513 -2673
- package/dist/lib/node-esm/chunk-M4B6BMD2.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +21 -19
- package/dist/lib/node-esm/internal/index.mjs +55 -45
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +247 -217
- package/dist/lib/node-esm/testing/index.mjs.map +4 -4
- package/dist/types/src/Annotation.d.ts +2 -0
- package/dist/types/src/Annotation.d.ts.map +1 -0
- package/dist/types/src/Database.d.ts +137 -0
- package/dist/types/src/Database.d.ts.map +1 -0
- package/dist/types/src/Entity.d.ts +36 -0
- package/dist/types/src/Entity.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/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 +85 -62
- package/dist/types/src/Obj.d.ts.map +1 -1
- package/dist/types/src/Ref.d.ts +10 -10
- package/dist/types/src/Ref.d.ts.map +1 -1
- package/dist/types/src/Relation.d.ts +14 -11
- package/dist/types/src/Relation.d.ts.map +1 -1
- package/dist/types/src/Tag.d.ts +17 -0
- package/dist/types/src/Tag.d.ts.map +1 -0
- package/dist/types/src/Type.d.ts +39 -49
- package/dist/types/src/Type.d.ts.map +1 -1
- package/dist/types/src/errors.d.ts +14 -18
- package/dist/types/src/errors.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +7 -3
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/internal/annotations/annotations.d.ts +174 -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 +26 -0
- package/dist/types/src/internal/annotations/util.d.ts.map +1 -0
- package/dist/types/src/internal/entities/entity.d.ts +10 -0
- package/dist/types/src/internal/entities/entity.d.ts.map +1 -0
- package/dist/types/src/internal/{object → entities}/expando.d.ts +3 -1
- package/dist/types/src/internal/entities/expando.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 +70 -0
- package/dist/types/src/internal/entities/model.d.ts.map +1 -0
- package/dist/types/src/internal/entities/object.d.ts +11 -0
- package/dist/types/src/internal/entities/object.d.ts.map +1 -0
- package/dist/types/src/internal/entities/relation.d.ts +55 -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 +2 -0
- package/dist/types/src/internal/formats/format.d.ts.map +1 -1
- package/dist/types/src/internal/formats/types.d.ts +7 -7
- package/dist/types/src/internal/formats/types.d.ts.map +1 -1
- package/dist/types/src/internal/index.d.ts +6 -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-type.d.ts.map +1 -1
- package/dist/types/src/internal/{json → json-schema}/json-schema.d.ts +2 -5
- 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/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 +3 -12
- package/dist/types/src/internal/object/index.d.ts.map +1 -1
- package/dist/types/src/internal/object/json-serializer.d.ts +1 -2
- package/dist/types/src/internal/object/json-serializer.d.ts.map +1 -1
- package/dist/types/src/internal/object/schema-validator.d.ts.map +1 -1
- package/dist/types/src/internal/object/typed-object.d.ts +1 -1
- package/dist/types/src/internal/object/typed-object.d.ts.map +1 -1
- package/dist/types/src/internal/proxy/index.d.ts +3 -0
- package/dist/types/src/internal/proxy/index.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/make-object.d.ts +16 -0
- package/dist/types/src/internal/proxy/make-object.d.ts.map +1 -0
- package/dist/types/src/internal/proxy/typed-handler.d.ts +1 -1
- package/dist/types/src/internal/proxy/typed-handler.d.ts.map +1 -1
- package/dist/types/src/internal/ref/ref.d.ts +15 -12
- package/dist/types/src/internal/ref/ref.d.ts.map +1 -1
- 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 +9 -9
- package/dist/types/src/internal/schema/echo-schema.d.ts.map +1 -1
- package/dist/types/src/internal/schema/index.d.ts +3 -4
- package/dist/types/src/internal/schema/index.d.ts.map +1 -1
- package/dist/types/src/internal/schema/manipulation.d.ts.map +1 -1
- package/dist/types/src/internal/schema/persistent-schema.d.ts +18 -0
- package/dist/types/src/internal/schema/persistent-schema.d.ts.map +1 -0
- package/dist/types/src/internal/schema/runtime-schema-registry.d.ts +1 -1
- package/dist/types/src/internal/schema/runtime-schema-registry.d.ts.map +1 -1
- package/dist/types/src/internal/types/base.d.ts +37 -0
- package/dist/types/src/internal/types/base.d.ts.map +1 -0
- package/dist/types/src/internal/{ast/entity-kind.d.ts → types/entity.d.ts} +3 -1
- 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 +20 -11
- package/dist/types/src/internal/types/meta.d.ts.map +1 -0
- package/dist/types/src/internal/types/typename.d.ts +13 -0
- package/dist/types/src/internal/types/typename.d.ts.map +1 -0
- package/dist/types/src/internal/{object → types}/version.d.ts +3 -2
- package/dist/types/src/internal/types/version.d.ts.map +1 -0
- package/dist/types/src/query/filter.d.ts +167 -0
- package/dist/types/src/query/filter.d.ts.map +1 -0
- package/dist/types/src/query/index.d.ts +3 -1
- package/dist/types/src/query/index.d.ts.map +1 -1
- package/dist/types/src/query/order.d.ts +12 -0
- package/dist/types/src/query/order.d.ts.map +1 -0
- package/dist/types/src/query/query.d.ts +9 -144
- package/dist/types/src/query/query.d.ts.map +1 -1
- package/dist/types/src/query/testing.d.ts +51 -0
- package/dist/types/src/query/testing.d.ts.map +1 -0
- package/dist/types/src/{internal/query/query.d.ts → query/types.d.ts} +1 -1
- package/dist/types/src/query/types.d.ts.map +1 -0
- package/dist/types/src/query/util.d.ts +8 -0
- package/dist/types/src/query/util.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 +337 -0
- package/dist/types/src/testing/test-schema.d.ts.map +1 -0
- package/dist/types/src/{internal/testing/utils.d.ts → testing/util.d.ts} +11 -5
- package/dist/types/src/testing/util.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +46 -38
- package/src/Annotation.ts +17 -0
- package/src/Database.ts +189 -0
- package/src/Entity.ts +51 -0
- package/src/Format.ts +11 -0
- package/src/JsonSchema.ts +16 -0
- package/src/Key.ts +3 -0
- package/src/Obj.ts +260 -147
- package/src/Ref.ts +9 -9
- package/src/Relation.ts +58 -44
- package/src/Tag.ts +40 -0
- package/src/Type.ts +96 -83
- package/src/index.ts +10 -4
- package/src/internal/README.md +83 -0
- package/src/internal/{ast → annotations}/annotations.test.ts +13 -15
- package/src/internal/annotations/annotations.ts +463 -0
- package/src/internal/annotations/index.ts +6 -0
- package/src/internal/annotations/util.ts +70 -0
- package/src/internal/entities/entity.ts +109 -0
- package/src/internal/{object → entities}/expando.ts +7 -5
- package/src/internal/entities/index.ts +9 -0
- package/src/internal/entities/model.ts +129 -0
- package/src/internal/entities/object.ts +45 -0
- package/src/internal/entities/relation.ts +155 -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 +5 -5
- package/src/internal/formats/format.ts +3 -0
- package/src/internal/formats/number.ts +5 -5
- package/src/internal/formats/object.ts +2 -2
- package/src/internal/formats/string.ts +9 -9
- package/src/internal/formats/types.ts +44 -39
- package/src/internal/index.ts +29 -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-type.ts +4 -3
- package/src/internal/{json → json-schema}/json-schema.test.ts +230 -97
- package/src/internal/{json → json-schema}/json-schema.ts +67 -87
- package/src/internal/object/common.ts +3 -4
- package/src/internal/object/{create.test.ts → create-object.test.ts} +31 -33
- package/src/internal/object/{create.ts → create-object.ts} +34 -35
- package/src/internal/object/deleted.ts +6 -6
- package/src/internal/object/ids.ts +1 -1
- package/src/internal/object/index.ts +3 -12
- package/src/internal/object/inspect.ts +3 -5
- package/src/internal/object/json-serializer.test.ts +33 -38
- package/src/internal/object/json-serializer.ts +43 -38
- package/src/internal/object/schema-validator.ts +3 -2
- package/src/internal/object/typed-object.test.ts +1 -1
- package/src/internal/object/typed-object.ts +17 -4
- package/src/internal/proxy/handler.test.ts +30 -20
- package/src/internal/proxy/index.ts +6 -0
- package/src/internal/proxy/{reactive-object.ts → make-object.ts} +19 -14
- package/src/internal/proxy/schema.test.ts +5 -4
- package/src/internal/proxy/typed-handler.test.ts +28 -28
- package/src/internal/proxy/typed-handler.ts +11 -6
- package/src/internal/proxy/typed-object.test.ts +17 -12
- package/src/internal/ref/ref.test.ts +9 -8
- package/src/internal/ref/ref.ts +24 -20
- package/src/internal/{projection → schema}/compose.test.ts +5 -6
- package/src/internal/{projection → schema}/compose.ts +2 -1
- package/src/internal/schema/echo-schema.ts +30 -28
- package/src/internal/schema/index.ts +3 -4
- package/src/internal/schema/manipulation.ts +7 -1
- package/src/internal/schema/persistent-schema.ts +28 -0
- package/src/internal/schema/runtime-schema-registry.ts +4 -4
- package/src/internal/types/base.ts +58 -0
- package/src/internal/{ast/entity-kind.ts → types/entity.ts} +8 -0
- package/src/internal/types/index.ts +5 -2
- package/src/internal/{object → types}/meta.ts +32 -18
- package/src/internal/types/typename.ts +45 -0
- package/src/internal/types/version.ts +20 -0
- package/src/query/filter.ts +455 -0
- package/src/query/index.ts +4 -1
- package/src/query/order.ts +34 -0
- package/src/query/query.test.ts +188 -216
- package/src/query/query.ts +24 -505
- package/src/query/testing.ts +64 -0
- package/src/query/util.ts +25 -0
- package/src/testing/api.test.ts +100 -0
- package/src/testing/index.ts +3 -3
- package/src/testing/test-data.ts +130 -0
- package/src/testing/test-schema.ts +213 -0
- package/src/{internal/testing/utils.ts → testing/util.ts} +38 -14
- package/dist/lib/browser/chunk-MWLA34S5.mjs.map +0 -7
- package/dist/lib/browser/chunk-OAZJQHVO.mjs +0 -453
- package/dist/lib/browser/chunk-OAZJQHVO.mjs.map +0 -7
- package/dist/lib/browser/chunk-ORIE2FMS.mjs +0 -514
- package/dist/lib/browser/chunk-ORIE2FMS.mjs.map +0 -7
- package/dist/lib/browser/query/index.mjs +0 -23
- package/dist/lib/browser/query/index.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-AXWVDOP7.mjs +0 -453
- package/dist/lib/node-esm/chunk-AXWVDOP7.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-L4PBAJDP.mjs +0 -514
- package/dist/lib/node-esm/chunk-L4PBAJDP.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-YTNLFBIK.mjs.map +0 -7
- package/dist/lib/node-esm/query/index.mjs +0 -23
- package/dist/lib/node-esm/query/index.mjs.map +0 -7
- 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 -119
- 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.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 -29
- 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 -22
- package/dist/types/src/internal/object/entity.d.ts.map +0 -1
- 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/typed-relation.d.ts +0 -32
- package/dist/types/src/internal/object/typed-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.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.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 -455
- package/dist/types/src/internal/testing/types.d.ts.map +0 -1
- 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/tag.d.ts +0 -18
- package/dist/types/src/query/tag.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 -113
- 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 -212
- 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 -115
- package/src/internal/object/entity.ts +0 -204
- package/src/internal/object/model.ts +0 -170
- package/src/internal/object/relation.ts +0 -24
- package/src/internal/object/typed-relation.ts +0 -85
- 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/query/index.ts +0 -5
- package/src/internal/schema/stored-schema.ts +0 -26
- package/src/internal/testing/index.ts +0 -6
- package/src/internal/testing/types.ts +0 -211
- 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/tag.ts +0 -35
- package/src/test/api.test.ts +0 -180
- package/src/testing/echo-schema.ts +0 -39
- package/src/testing/types.ts +0 -91
- /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.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
- /package/src/{internal/query/query.ts → query/types.ts} +0 -0
|
@@ -6,26 +6,23 @@ import { describe, expect, test } from 'vitest';
|
|
|
6
6
|
|
|
7
7
|
import { DXN } from '@dxos/keys';
|
|
8
8
|
|
|
9
|
-
import {
|
|
9
|
+
import { TestSchema } from '../../testing';
|
|
10
|
+
import { getSchemaDXN, getSchemaTypename, getTypeDXN, getTypename } from '../annotations';
|
|
11
|
+
import { RelationSourceId, RelationTargetId, getObjectDXN } from '../entities';
|
|
12
|
+
import { makeObject } from '../proxy';
|
|
10
13
|
import { Ref, StaticRefResolver } from '../ref';
|
|
11
|
-
import {
|
|
14
|
+
import { ATTR_TYPE, EntityKind, KindId, MetaId, TypeId, getMeta, getSchema } from '../types';
|
|
12
15
|
|
|
13
|
-
import {
|
|
14
|
-
import { create } from './create';
|
|
16
|
+
import { createObject } from './create-object';
|
|
15
17
|
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
18
|
|
|
20
19
|
describe('Object JSON serializer', () => {
|
|
21
20
|
test('should serialize and deserialize object', async () => {
|
|
22
|
-
const contact =
|
|
23
|
-
|
|
24
|
-
});
|
|
25
|
-
getMeta(contact).keys.push({ id: '12345', source: 'crm.example.com' });
|
|
21
|
+
const contact = makeObject(TestSchema.Person, { name: 'Alice' });
|
|
22
|
+
getMeta(contact).keys.push({ id: '12345', source: 'example.com' });
|
|
26
23
|
|
|
27
|
-
const task =
|
|
28
|
-
title: '
|
|
24
|
+
const task = createObject(TestSchema.Task, {
|
|
25
|
+
title: 'Fix the tests',
|
|
29
26
|
assignee: Ref.make(contact),
|
|
30
27
|
});
|
|
31
28
|
|
|
@@ -33,67 +30,65 @@ describe('Object JSON serializer', () => {
|
|
|
33
30
|
const taskJson = objectToJSON(task);
|
|
34
31
|
|
|
35
32
|
expect(contactJson.id).toBe(contact.id);
|
|
36
|
-
expect(contactJson[ATTR_TYPE]).toEqual(getSchemaDXN(
|
|
37
|
-
expect(contactJson.name).toEqual('
|
|
33
|
+
expect(contactJson[ATTR_TYPE]).toEqual(getSchemaDXN(TestSchema.Person)!.toString());
|
|
34
|
+
expect(contactJson.name).toEqual('Alice');
|
|
38
35
|
|
|
39
36
|
expect(taskJson.id).toBe(task.id);
|
|
40
|
-
expect(taskJson[ATTR_TYPE]).toEqual(getSchemaDXN(
|
|
41
|
-
expect(taskJson.title).toEqual('
|
|
37
|
+
expect(taskJson[ATTR_TYPE]).toEqual(getSchemaDXN(TestSchema.Task)!.toString());
|
|
38
|
+
expect(taskJson.title).toEqual('Fix the tests');
|
|
42
39
|
expect(taskJson.assignee).toEqual({ '/': DXN.fromLocalObjectId(contact.id).toString() });
|
|
43
40
|
|
|
44
41
|
const refResolver = new StaticRefResolver()
|
|
45
|
-
.addSchema(
|
|
46
|
-
.addSchema(
|
|
42
|
+
.addSchema(TestSchema.Person)
|
|
43
|
+
.addSchema(TestSchema.Task)
|
|
47
44
|
.addObject(contact)
|
|
48
45
|
.addObject(task);
|
|
49
46
|
|
|
50
|
-
const contactFromJson = (await objectFromJSON(contactJson, { refResolver })) as
|
|
51
|
-
const taskFromJson = (await objectFromJSON(taskJson, { refResolver })) as
|
|
47
|
+
const contactFromJson = (await objectFromJSON(contactJson, { refResolver })) as TestSchema.Person;
|
|
48
|
+
const taskFromJson = (await objectFromJSON(taskJson, { refResolver })) as TestSchema.Task;
|
|
52
49
|
|
|
53
50
|
expect(contactFromJson.id).toBe(contact.id);
|
|
54
|
-
expect(contactFromJson.name).toBe('
|
|
55
|
-
expect((contactFromJson as any)[TypeId]).toEqual(getSchemaDXN(
|
|
56
|
-
expect((contactFromJson as any)[
|
|
51
|
+
expect(contactFromJson.name).toBe('Alice');
|
|
52
|
+
expect((contactFromJson as any)[TypeId]).toEqual(getSchemaDXN(TestSchema.Person));
|
|
53
|
+
expect((contactFromJson as any)[KindId]).toBe(EntityKind.Object);
|
|
57
54
|
expect((contactFromJson as any)[RelationSourceId]).toBeUndefined();
|
|
58
55
|
expect((contactFromJson as any)[RelationTargetId]).toBeUndefined();
|
|
59
56
|
expect((contactFromJson as any)[MetaId]).toEqual({
|
|
60
57
|
keys: [
|
|
61
58
|
{
|
|
62
59
|
id: '12345',
|
|
63
|
-
source: '
|
|
60
|
+
source: 'example.com',
|
|
64
61
|
},
|
|
65
62
|
],
|
|
66
63
|
});
|
|
67
|
-
expect(
|
|
68
|
-
expect(getTypename(contactFromJson)).toBe(getSchemaTypename(
|
|
64
|
+
expect(getTypeDXN(contactFromJson)?.toString()).toBe(getSchemaDXN(TestSchema.Person)!.toString());
|
|
65
|
+
expect(getTypename(contactFromJson)).toBe(getSchemaTypename(TestSchema.Person));
|
|
69
66
|
expect(getObjectDXN(contactFromJson)?.toString()).toEqual(getObjectDXN(contact)?.toString());
|
|
70
|
-
expect(getSchema(contactFromJson)).toEqual(
|
|
67
|
+
expect(getSchema(contactFromJson)).toEqual(TestSchema.Person);
|
|
71
68
|
|
|
72
69
|
expect(taskFromJson.id).toBe(task.id);
|
|
73
|
-
expect(taskFromJson.title).toBe('
|
|
70
|
+
expect(taskFromJson.title).toBe('Fix the tests');
|
|
74
71
|
expect(taskFromJson.assignee!.dxn).toEqual(DXN.fromLocalObjectId(contact.id));
|
|
75
72
|
expect(taskFromJson.assignee!.target).toEqual(contact);
|
|
76
73
|
expect(await taskFromJson.assignee!.load()).toEqual(contact);
|
|
77
|
-
expect((taskFromJson as any)[TypeId]).toEqual(getSchemaDXN(
|
|
78
|
-
expect((taskFromJson as any)[
|
|
74
|
+
expect((taskFromJson as any)[TypeId]).toEqual(getSchemaDXN(TestSchema.Task));
|
|
75
|
+
expect((taskFromJson as any)[KindId]).toBe(EntityKind.Object);
|
|
79
76
|
expect((taskFromJson as any)[RelationSourceId]).toBeUndefined();
|
|
80
77
|
expect((taskFromJson as any)[RelationTargetId]).toBeUndefined();
|
|
81
78
|
expect((taskFromJson as any)[MetaId]).toEqual({ keys: [] });
|
|
82
|
-
expect(getSchema(taskFromJson)).toEqual(
|
|
79
|
+
expect(getSchema(taskFromJson)).toEqual(TestSchema.Task);
|
|
83
80
|
});
|
|
84
81
|
|
|
85
82
|
test('serialize with unresolved schema', async () => {
|
|
86
|
-
const contact =
|
|
87
|
-
name: 'John Doe',
|
|
88
|
-
});
|
|
83
|
+
const contact = createObject(TestSchema.Person, { name: 'Alice' });
|
|
89
84
|
const contactJson = objectToJSON(contact);
|
|
90
85
|
const contactFromJson: any = await objectFromJSON(contactJson);
|
|
91
86
|
|
|
92
87
|
expect(contactFromJson.id).toBe(contact.id);
|
|
93
|
-
expect(contactFromJson.name).toBe('
|
|
88
|
+
expect(contactFromJson.name).toBe('Alice');
|
|
94
89
|
expect(getSchema(contactFromJson)).toBeUndefined();
|
|
95
|
-
expect(getTypename(contactFromJson)).toEqual(getSchemaTypename(
|
|
90
|
+
expect(getTypename(contactFromJson)).toEqual(getSchemaTypename(TestSchema.Person));
|
|
96
91
|
expect(getObjectDXN(contactFromJson)).toEqual(getObjectDXN(contact));
|
|
97
|
-
expect(
|
|
92
|
+
expect(getTypeDXN(contactFromJson)).toEqual(getSchemaDXN(TestSchema.Person));
|
|
98
93
|
});
|
|
99
94
|
});
|
|
@@ -11,42 +11,51 @@ import { DXN, ObjectId } from '@dxos/keys';
|
|
|
11
11
|
import { defineHiddenProperty } from '@dxos/live-object';
|
|
12
12
|
import { assumeType, deepMapValues, visitValues } from '@dxos/util';
|
|
13
13
|
|
|
14
|
-
import {
|
|
15
|
-
import { Ref, type RefResolver, refFromEncodedReference, setRefResolver } from '../ref';
|
|
16
|
-
import { type AnyEchoObject } from '../types';
|
|
17
|
-
|
|
18
|
-
import { setSchema } from './accessors';
|
|
19
|
-
import { ObjectMetaSchema } from './meta';
|
|
14
|
+
import { getTypeDXN, setTypename } from '../annotations';
|
|
20
15
|
import {
|
|
21
16
|
ATTR_DELETED,
|
|
22
|
-
ATTR_META,
|
|
23
17
|
ATTR_RELATION_SOURCE,
|
|
24
18
|
ATTR_RELATION_TARGET,
|
|
25
19
|
ATTR_SELF_DXN,
|
|
26
|
-
ATTR_TYPE,
|
|
27
|
-
EntityKindId,
|
|
28
|
-
MetaId,
|
|
29
20
|
type ObjectJSON,
|
|
30
21
|
RelationSourceDXNId,
|
|
31
22
|
RelationSourceId,
|
|
32
23
|
RelationTargetDXNId,
|
|
33
24
|
RelationTargetId,
|
|
34
25
|
SelfDXNId,
|
|
26
|
+
assertObjectModel,
|
|
27
|
+
} from '../entities';
|
|
28
|
+
import { Ref, type RefResolver, refFromEncodedReference, setRefResolver } from '../ref';
|
|
29
|
+
import {
|
|
30
|
+
ATTR_META,
|
|
31
|
+
ATTR_TYPE,
|
|
32
|
+
type AnyEchoObject,
|
|
33
|
+
EntityKind,
|
|
34
|
+
KindId,
|
|
35
|
+
MetaId,
|
|
36
|
+
ObjectMetaSchema,
|
|
35
37
|
TypeId,
|
|
36
|
-
|
|
37
|
-
} from '
|
|
38
|
-
import { getType, setTypename } from './typename';
|
|
38
|
+
setSchema,
|
|
39
|
+
} from '../types';
|
|
39
40
|
|
|
40
41
|
type DeepReplaceRef<T> =
|
|
41
|
-
T extends Ref<any>
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
T extends Ref<any>
|
|
43
|
+
? EncodedReference
|
|
44
|
+
: T extends object
|
|
45
|
+
? {
|
|
46
|
+
[K in keyof T]: DeepReplaceRef<T[K]>;
|
|
47
|
+
}
|
|
48
|
+
: T;
|
|
49
|
+
|
|
50
|
+
type SerializedObject<T extends { id: string }> = {
|
|
51
|
+
[K in keyof T]: DeepReplaceRef<T[K]>;
|
|
52
|
+
} & ObjectJSON;
|
|
44
53
|
|
|
45
54
|
/**
|
|
46
55
|
* Converts object to it's JSON representation.
|
|
47
56
|
*/
|
|
48
57
|
export const objectToJSON = <T extends AnyEchoObject>(obj: T): SerializedObject<T> => {
|
|
49
|
-
const typename =
|
|
58
|
+
const typename = getTypeDXN(obj)?.toString();
|
|
50
59
|
invariant(typename && typeof typename === 'string');
|
|
51
60
|
return typedJsonSerializer.call(obj);
|
|
52
61
|
};
|
|
@@ -55,7 +64,6 @@ export const objectToJSON = <T extends AnyEchoObject>(obj: T): SerializedObject<
|
|
|
55
64
|
* Creates an object from it's json representation.
|
|
56
65
|
* Performs schema validation.
|
|
57
66
|
* References and schema will be resolvable if the `refResolver` is provided.
|
|
58
|
-
*
|
|
59
67
|
* The function need to be async to support resolving the schema as well as the relation endpoints.
|
|
60
68
|
*/
|
|
61
69
|
export const objectFromJSON = async (
|
|
@@ -82,7 +90,6 @@ export const objectFromJSON = async (
|
|
|
82
90
|
}
|
|
83
91
|
|
|
84
92
|
invariant(ObjectId.isValid(obj.id), 'Invalid object id');
|
|
85
|
-
|
|
86
93
|
setTypename(obj, type);
|
|
87
94
|
if (schema) {
|
|
88
95
|
setSchema(obj, schema);
|
|
@@ -94,25 +101,21 @@ export const objectFromJSON = async (
|
|
|
94
101
|
const sourceDxn: DXN = DXN.parse(jsonData[ATTR_RELATION_SOURCE] ?? raise(new TypeError('Missing relation source')));
|
|
95
102
|
const targetDxn: DXN = DXN.parse(jsonData[ATTR_RELATION_TARGET] ?? raise(new TypeError('Missing relation target')));
|
|
96
103
|
|
|
97
|
-
// TODO(dmaretskyi): Async!
|
|
98
104
|
const source = (await refResolver?.resolve(sourceDxn)) as AnyEchoObject | undefined;
|
|
99
105
|
const target = (await refResolver?.resolve(targetDxn)) as AnyEchoObject | undefined;
|
|
100
106
|
|
|
101
|
-
defineHiddenProperty(obj,
|
|
107
|
+
defineHiddenProperty(obj, KindId, EntityKind.Relation);
|
|
102
108
|
defineHiddenProperty(obj, RelationSourceDXNId, sourceDxn);
|
|
103
109
|
defineHiddenProperty(obj, RelationTargetDXNId, targetDxn);
|
|
104
110
|
defineHiddenProperty(obj, RelationSourceId, source);
|
|
105
111
|
defineHiddenProperty(obj, RelationTargetId, target);
|
|
106
112
|
} else {
|
|
107
|
-
defineHiddenProperty(obj,
|
|
113
|
+
defineHiddenProperty(obj, KindId, EntityKind.Object);
|
|
108
114
|
}
|
|
109
115
|
|
|
110
116
|
if (typeof jsonData[ATTR_META] === 'object') {
|
|
111
117
|
const meta = await ObjectMetaSchema.pipe(Schema.decodeUnknownPromise)(jsonData[ATTR_META]);
|
|
112
|
-
|
|
113
|
-
// Defensive programming.
|
|
114
118
|
invariant(Array.isArray(meta.keys));
|
|
115
|
-
|
|
116
119
|
defineHiddenProperty(obj, MetaId, meta);
|
|
117
120
|
}
|
|
118
121
|
|
|
@@ -120,13 +123,13 @@ export const objectFromJSON = async (
|
|
|
120
123
|
defineHiddenProperty(obj, SelfDXNId, dxn);
|
|
121
124
|
}
|
|
122
125
|
|
|
123
|
-
|
|
126
|
+
assertObjectModel(obj);
|
|
124
127
|
invariant((obj as any)[ATTR_TYPE] === undefined, 'Invalid object model');
|
|
125
|
-
invariant((obj as any)[
|
|
128
|
+
invariant((obj as any)[ATTR_META] === undefined, 'Invalid object model');
|
|
126
129
|
invariant((obj as any)[ATTR_DELETED] === undefined, 'Invalid object model');
|
|
130
|
+
invariant((obj as any)[ATTR_SELF_DXN] === undefined, 'Invalid object model');
|
|
127
131
|
invariant((obj as any)[ATTR_RELATION_SOURCE] === undefined, 'Invalid object model');
|
|
128
132
|
invariant((obj as any)[ATTR_RELATION_TARGET] === undefined, 'Invalid object model');
|
|
129
|
-
invariant((obj as any)[ATTR_META] === undefined, 'Invalid object model');
|
|
130
133
|
return obj;
|
|
131
134
|
};
|
|
132
135
|
|
|
@@ -135,30 +138,31 @@ const decodeGeneric = (jsonData: unknown, options: { refResolver?: RefResolver }
|
|
|
135
138
|
[ATTR_TYPE]: _type,
|
|
136
139
|
[ATTR_META]: _meta,
|
|
137
140
|
[ATTR_DELETED]: _deleted,
|
|
141
|
+
[ATTR_SELF_DXN]: _selfDxn,
|
|
138
142
|
[ATTR_RELATION_SOURCE]: _relationSource,
|
|
139
143
|
[ATTR_RELATION_TARGET]: _relationTarget,
|
|
140
|
-
[ATTR_SELF_DXN]: _selfDxn,
|
|
141
144
|
...props
|
|
142
145
|
} = jsonData as any;
|
|
143
146
|
|
|
144
|
-
return deepMapValues(props, (value,
|
|
147
|
+
return deepMapValues(props, (value, visitor) => {
|
|
145
148
|
if (isEncodedReference(value)) {
|
|
146
149
|
return refFromEncodedReference(value, options.refResolver);
|
|
147
150
|
}
|
|
148
|
-
|
|
151
|
+
|
|
152
|
+
return visitor(value);
|
|
149
153
|
});
|
|
150
154
|
};
|
|
151
155
|
|
|
152
156
|
export const setRefResolverOnData = (obj: AnyEchoObject, refResolver: RefResolver) => {
|
|
153
|
-
const
|
|
157
|
+
const visitor = (value: unknown) => {
|
|
154
158
|
if (Ref.isRef(value)) {
|
|
155
159
|
setRefResolver(value, refResolver);
|
|
156
160
|
} else {
|
|
157
|
-
visitValues(value,
|
|
161
|
+
visitValues(value, visitor);
|
|
158
162
|
}
|
|
159
163
|
};
|
|
160
164
|
|
|
161
|
-
|
|
165
|
+
visitor(obj);
|
|
162
166
|
};
|
|
163
167
|
|
|
164
168
|
export const attachTypedJsonSerializer = (obj: any) => {
|
|
@@ -187,6 +191,10 @@ const typedJsonSerializer = function (this: any) {
|
|
|
187
191
|
result[ATTR_TYPE] = this[TypeId].toString();
|
|
188
192
|
}
|
|
189
193
|
|
|
194
|
+
if (this[MetaId]) {
|
|
195
|
+
result[ATTR_META] = serializeMeta(this[MetaId]);
|
|
196
|
+
}
|
|
197
|
+
|
|
190
198
|
if (this[SelfDXNId]) {
|
|
191
199
|
result[ATTR_SELF_DXN] = this[SelfDXNId].toString();
|
|
192
200
|
}
|
|
@@ -202,10 +210,6 @@ const typedJsonSerializer = function (this: any) {
|
|
|
202
210
|
result[ATTR_RELATION_TARGET] = targetDXN.toString();
|
|
203
211
|
}
|
|
204
212
|
|
|
205
|
-
if (this[MetaId]) {
|
|
206
|
-
result[ATTR_META] = serializeMeta(this[MetaId]);
|
|
207
|
-
}
|
|
208
|
-
|
|
209
213
|
Object.assign(result, serializeData(rest));
|
|
210
214
|
return result;
|
|
211
215
|
};
|
|
@@ -216,6 +220,7 @@ const serializeData = (data: unknown) => {
|
|
|
216
220
|
// TODO(dmaretskyi): Should this be configurable?
|
|
217
221
|
return value.noInline().encode();
|
|
218
222
|
}
|
|
223
|
+
|
|
219
224
|
return recurse(value);
|
|
220
225
|
});
|
|
221
226
|
};
|
|
@@ -7,7 +7,7 @@ import * as SchemaAST from 'effect/SchemaAST';
|
|
|
7
7
|
|
|
8
8
|
import { invariant } from '@dxos/invariant';
|
|
9
9
|
|
|
10
|
-
import { SchemaId } from '
|
|
10
|
+
import { SchemaId } from '../types';
|
|
11
11
|
|
|
12
12
|
// TODO(burdon): Reconcile with @dxos/effect visit().
|
|
13
13
|
|
|
@@ -46,7 +46,7 @@ export class SchemaValidator {
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
return type.ast.annotations[annotation] != null;
|
|
49
|
-
} catch
|
|
49
|
+
} catch {
|
|
50
50
|
return false;
|
|
51
51
|
}
|
|
52
52
|
}
|
|
@@ -238,4 +238,5 @@ export const checkIdNotPresentOnSchema = (schema: Schema.Schema<any, any, any>)
|
|
|
238
238
|
}
|
|
239
239
|
};
|
|
240
240
|
|
|
241
|
+
// TODO(burdon): Reconcile with JsonPath.
|
|
241
242
|
type KeyPath = readonly (string | number)[];
|
|
@@ -15,7 +15,7 @@ class Organization extends TypedObject({
|
|
|
15
15
|
name: Schema.String,
|
|
16
16
|
}) {}
|
|
17
17
|
|
|
18
|
-
describe('
|
|
18
|
+
describe('EchoObjectSchema class DSL', () => {
|
|
19
19
|
test('type is a valid schema', async () => {
|
|
20
20
|
expect(Schema.isSchema(Organization)).to.be.true;
|
|
21
21
|
});
|
|
@@ -3,11 +3,19 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import * as Schema from 'effect/Schema';
|
|
6
|
+
import * as SchemaAST from 'effect/SchemaAST';
|
|
6
7
|
|
|
7
8
|
import { invariant } from '@dxos/invariant';
|
|
8
9
|
|
|
9
|
-
import {
|
|
10
|
-
|
|
10
|
+
import {
|
|
11
|
+
type TypeAnnotation,
|
|
12
|
+
TypeAnnotationId,
|
|
13
|
+
type TypeMeta,
|
|
14
|
+
TypenameSchema,
|
|
15
|
+
VersionSchema,
|
|
16
|
+
makeTypeJsonSchemaAnnotation,
|
|
17
|
+
} from '../annotations';
|
|
18
|
+
import { EntityKind, type HasId } from '../types';
|
|
11
19
|
|
|
12
20
|
import { type TypedObjectFields, type TypedObjectOptions, makeTypedEntityClass } from './common';
|
|
13
21
|
|
|
@@ -44,8 +52,8 @@ export const TypedObject = ({
|
|
|
44
52
|
version: versionParam,
|
|
45
53
|
disableValidation,
|
|
46
54
|
}: TypedObjectProps) => {
|
|
47
|
-
const typename =
|
|
48
|
-
const version =
|
|
55
|
+
const typename = TypenameSchema.make(typenameParam, { disableValidation });
|
|
56
|
+
const version = VersionSchema.make(versionParam, { disableValidation });
|
|
49
57
|
|
|
50
58
|
/**
|
|
51
59
|
* Return class definition factory.
|
|
@@ -69,6 +77,11 @@ export const TypedObject = ({
|
|
|
69
77
|
invariant(typeof EntityKind.Object === 'string');
|
|
70
78
|
const annotatedSchema = typeSchema.annotations({
|
|
71
79
|
[TypeAnnotationId]: { kind: EntityKind.Object, typename, version } satisfies TypeAnnotation,
|
|
80
|
+
[SchemaAST.JSONSchemaAnnotationId]: makeTypeJsonSchemaAnnotation({
|
|
81
|
+
kind: EntityKind.Object,
|
|
82
|
+
typename,
|
|
83
|
+
version,
|
|
84
|
+
}),
|
|
72
85
|
});
|
|
73
86
|
|
|
74
87
|
/**
|
|
@@ -7,29 +7,39 @@ import { inspect } from 'node:util';
|
|
|
7
7
|
import { describe, expect, test } from 'vitest';
|
|
8
8
|
|
|
9
9
|
import { registerSignalsRuntime } from '@dxos/echo-signals';
|
|
10
|
-
import type
|
|
11
|
-
import { objectData } from '@dxos/live-object';
|
|
10
|
+
import { type Live, objectData } from '@dxos/live-object';
|
|
12
11
|
import { isNode } from '@dxos/util';
|
|
13
12
|
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
13
|
+
import { TestSchema, updateCounter } from '../../testing';
|
|
14
|
+
import { createObject } from '../object';
|
|
15
|
+
import { ATTR_META } from '../types';
|
|
16
16
|
|
|
17
|
-
import {
|
|
17
|
+
import { makeObject } from './make-object';
|
|
18
18
|
|
|
19
19
|
registerSignalsRuntime();
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
describe('proxy', () => {
|
|
22
|
+
test.skipIf(!isNode())('inspect', ({ expect }) => {
|
|
23
|
+
const obj = createObject(TestSchema.Message, { timestamp: new Date().toISOString() });
|
|
24
|
+
const str = inspect(obj, { colors: true });
|
|
25
|
+
expect(str).to.exist;
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
const TEST_OBJECT: TestSchema.ExampleSchema = {
|
|
22
30
|
string: 'foo',
|
|
23
31
|
number: 42,
|
|
24
32
|
boolean: true,
|
|
25
33
|
null: null,
|
|
26
34
|
stringArray: ['1', '2', '3'],
|
|
27
|
-
|
|
35
|
+
nested: {
|
|
36
|
+
field: 'bar',
|
|
37
|
+
},
|
|
28
38
|
};
|
|
29
39
|
|
|
30
|
-
for (const schema of [undefined,
|
|
31
|
-
const createObject = (props: Partial<
|
|
32
|
-
return schema == null ? (
|
|
40
|
+
for (const schema of [undefined, TestSchema.ExampleSchema]) {
|
|
41
|
+
const createObject = (props: Partial<TestSchema.ExampleSchema> = {}): Live<TestSchema.ExampleSchema> => {
|
|
42
|
+
return schema == null ? (makeObject(props) as TestSchema.ExampleSchema) : makeObject(schema, props);
|
|
33
43
|
};
|
|
34
44
|
|
|
35
45
|
describe(`Non-echo specific proxy properties${schema == null ? '' : ' with schema'}`, () => {
|
|
@@ -51,10 +61,10 @@ for (const schema of [undefined, Testing.TestSchemaWithClass]) {
|
|
|
51
61
|
test('can assign class instances', () => {
|
|
52
62
|
const obj = createObject();
|
|
53
63
|
|
|
54
|
-
const classInstance = new
|
|
64
|
+
const classInstance = new TestSchema.TestClass();
|
|
55
65
|
obj.classInstance = classInstance;
|
|
56
66
|
expect(obj.classInstance!.field).to.eq('value');
|
|
57
|
-
expect(obj.classInstance instanceof
|
|
67
|
+
expect(obj.classInstance instanceof TestSchema.TestClass).to.eq(true);
|
|
58
68
|
expect(obj.classInstance === classInstance).to.be.true;
|
|
59
69
|
|
|
60
70
|
obj.classInstance!.field = 'baz';
|
|
@@ -63,7 +73,7 @@ for (const schema of [undefined, Testing.TestSchemaWithClass]) {
|
|
|
63
73
|
|
|
64
74
|
describe('class instance equality', () => {
|
|
65
75
|
test('toJSON', () => {
|
|
66
|
-
const original = { classInstance: new
|
|
76
|
+
const original = { classInstance: new TestSchema.TestClass() };
|
|
67
77
|
const reactive = createObject(original);
|
|
68
78
|
if (!schema) {
|
|
69
79
|
expect(JSON.stringify(reactive)).to.eq(JSON.stringify(original));
|
|
@@ -80,14 +90,14 @@ for (const schema of [undefined, Testing.TestSchemaWithClass]) {
|
|
|
80
90
|
});
|
|
81
91
|
|
|
82
92
|
test('chai deep equal works', () => {
|
|
83
|
-
const original = { classInstance: new
|
|
93
|
+
const original = { classInstance: new TestSchema.TestClass() };
|
|
84
94
|
const reactive = createObject(original);
|
|
85
95
|
expect(reactive).to.deep.eq(original);
|
|
86
96
|
expect(reactive).to.not.deep.eq({ ...original, number: 11 });
|
|
87
97
|
});
|
|
88
98
|
|
|
89
99
|
test('jest deep equal works', () => {
|
|
90
|
-
const original = { classInstance: new
|
|
100
|
+
const original = { classInstance: new TestSchema.TestClass() };
|
|
91
101
|
const reactive = createObject(original);
|
|
92
102
|
expect(reactive).toEqual(original);
|
|
93
103
|
expect(reactive).not.toEqual({ ...original, number: 11 });
|
|
@@ -96,7 +106,7 @@ for (const schema of [undefined, Testing.TestSchemaWithClass]) {
|
|
|
96
106
|
|
|
97
107
|
describe('signal updates', () => {
|
|
98
108
|
test('not in nested class instances', () => {
|
|
99
|
-
const obj = createObject({ classInstance: new
|
|
109
|
+
const obj = createObject({ classInstance: new TestSchema.TestClass() });
|
|
100
110
|
using updates = updateCounter(() => {
|
|
101
111
|
obj.classInstance!.field;
|
|
102
112
|
});
|
|
@@ -112,7 +122,7 @@ for (const schema of [undefined, Testing.TestSchemaWithClass]) {
|
|
|
112
122
|
describe('getters', () => {
|
|
113
123
|
test('add getter to object', () => {
|
|
114
124
|
let value = 'foo';
|
|
115
|
-
const obj =
|
|
125
|
+
const obj = makeObject({
|
|
116
126
|
get getter() {
|
|
117
127
|
return value;
|
|
118
128
|
},
|
|
@@ -124,11 +134,11 @@ describe('getters', () => {
|
|
|
124
134
|
});
|
|
125
135
|
|
|
126
136
|
test('signal updates', () => {
|
|
127
|
-
const innerObj =
|
|
137
|
+
const innerObj = makeObject({
|
|
128
138
|
string: 'bar',
|
|
129
139
|
});
|
|
130
140
|
|
|
131
|
-
const obj =
|
|
141
|
+
const obj = makeObject({
|
|
132
142
|
field: 1,
|
|
133
143
|
get getter() {
|
|
134
144
|
return innerObj.string;
|
|
@@ -150,7 +160,7 @@ describe('getters', () => {
|
|
|
150
160
|
|
|
151
161
|
test('getter for array', () => {
|
|
152
162
|
const value = [1];
|
|
153
|
-
const obj =
|
|
163
|
+
const obj = makeObject({
|
|
154
164
|
get getter() {
|
|
155
165
|
return value;
|
|
156
166
|
},
|
|
@@ -13,32 +13,37 @@ import {
|
|
|
13
13
|
isValidProxyTarget,
|
|
14
14
|
} from '@dxos/live-object';
|
|
15
15
|
|
|
16
|
-
import { getTypeAnnotation } from '../
|
|
17
|
-
import {
|
|
18
|
-
import
|
|
16
|
+
import { getTypeAnnotation } from '../annotations';
|
|
17
|
+
import { Expando } from '../entities';
|
|
18
|
+
import { attachTypedJsonSerializer } from '../object';
|
|
19
|
+
import { type AnyProperties, KindId, MetaId, type ObjectMeta, ObjectMetaSchema } from '../types';
|
|
19
20
|
|
|
20
21
|
import { TypedReactiveHandler, prepareTypedTarget } from './typed-handler';
|
|
21
22
|
|
|
23
|
+
/**
|
|
24
|
+
*
|
|
25
|
+
*/
|
|
26
|
+
// TODO(burdon): Make internal
|
|
27
|
+
export type MakeObjectProps<T extends AnyProperties> = Omit<T, 'id' | KindId>;
|
|
28
|
+
|
|
22
29
|
/**
|
|
23
30
|
* Creates a reactive object from a plain Javascript object.
|
|
24
31
|
* Optionally provides a TS-effect schema.
|
|
25
|
-
*
|
|
26
|
-
* @depreacted Use `Obj.make`.
|
|
27
32
|
*/
|
|
33
|
+
// TODO(burdon): Make internal
|
|
28
34
|
// TODO(dmaretskyi): Deep mutability.
|
|
29
35
|
// TODO(dmaretskyi): Invert generics (generic over schema) to have better error messages.
|
|
30
36
|
// TODO(dmaretskyi): Could mutate original object making it unusable.
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
<T extends
|
|
34
|
-
<T extends BaseObject>(
|
|
37
|
+
export const makeObject: {
|
|
38
|
+
<T extends AnyProperties>(obj: T): Live<T>;
|
|
39
|
+
<T extends AnyProperties>(
|
|
35
40
|
schema: Schema.Schema<T, any, never>,
|
|
36
|
-
obj: NoInfer<
|
|
41
|
+
obj: NoInfer<MakeObjectProps<T>>,
|
|
37
42
|
meta?: ObjectMeta,
|
|
38
43
|
): Live<T>;
|
|
39
|
-
} = <T extends
|
|
44
|
+
} = <T extends AnyProperties>(
|
|
40
45
|
objOrSchema: Schema.Schema<T, any> | T,
|
|
41
|
-
obj?:
|
|
46
|
+
obj?: MakeObjectProps<T>,
|
|
42
47
|
meta?: ObjectMeta,
|
|
43
48
|
): Live<T> => {
|
|
44
49
|
// TODO(dmaretskyi): Remove Expando special case.
|
|
@@ -51,7 +56,7 @@ export const live: {
|
|
|
51
56
|
}
|
|
52
57
|
};
|
|
53
58
|
|
|
54
|
-
const createReactiveObject = <T extends
|
|
59
|
+
const createReactiveObject = <T extends AnyProperties>(
|
|
55
60
|
obj: T,
|
|
56
61
|
meta?: ObjectMeta,
|
|
57
62
|
schema?: Schema.Schema<T>,
|
|
@@ -68,7 +73,7 @@ const createReactiveObject = <T extends BaseObject>(
|
|
|
68
73
|
setIdOnTarget(obj);
|
|
69
74
|
}
|
|
70
75
|
if (annotation) {
|
|
71
|
-
defineHiddenProperty(obj,
|
|
76
|
+
defineHiddenProperty(obj, KindId, annotation.kind);
|
|
72
77
|
}
|
|
73
78
|
initMeta(obj, meta);
|
|
74
79
|
prepareTypedTarget(obj, schema);
|
|
@@ -6,8 +6,9 @@ import * as Schema from 'effect/Schema';
|
|
|
6
6
|
import * as SchemaAST from 'effect/SchemaAST';
|
|
7
7
|
import { describe, expect, test } from 'vitest';
|
|
8
8
|
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
9
|
+
import { createEchoSchema } from '../../testing';
|
|
10
|
+
import { PropertyMeta, getPropertyMetaAnnotation, getTypeAnnotation } from '../annotations';
|
|
11
|
+
import { TypedObject } from '../object';
|
|
11
12
|
|
|
12
13
|
// TODO(dmaretskyi): Comment.
|
|
13
14
|
class EmptySchemaType extends TypedObject({
|
|
@@ -95,7 +96,7 @@ describe('dynamic schema', () => {
|
|
|
95
96
|
test('updates typename', async ({ expect }) => {
|
|
96
97
|
// Create schema with some fields and annotations.
|
|
97
98
|
const registered = createEchoSchema(EmptySchemaType);
|
|
98
|
-
const originalVersion = registered.
|
|
99
|
+
const originalVersion = registered.persistentSchema.version;
|
|
99
100
|
registered.addFields({
|
|
100
101
|
name: Schema.String.pipe(PropertyMeta('test', { maxLength: 10 })),
|
|
101
102
|
age: Schema.Number,
|
|
@@ -111,7 +112,7 @@ describe('dynamic schema', () => {
|
|
|
111
112
|
expect(registered.jsonSchema.typename).toBe(newTypename1);
|
|
112
113
|
|
|
113
114
|
// Version preservation check.
|
|
114
|
-
expect(registered.
|
|
115
|
+
expect(registered.persistentSchema.version).toBe(originalVersion);
|
|
115
116
|
|
|
116
117
|
// Field preservation check.
|
|
117
118
|
const properties = registered.getProperties();
|