@dxos/echo 0.8.4-main.72ec0f3 → 0.8.4-main.7ace549
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-BIDAASFK.mjs → chunk-7GH6RXJ3.mjs} +2246 -2290
- 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 +18 -8
- package/dist/lib/browser/internal/index.mjs +45 -45
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +252 -191
- 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-3SVRRCUU.mjs → chunk-M4B6BMD2.mjs} +2246 -2290
- package/dist/lib/node-esm/chunk-M4B6BMD2.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +18 -8
- package/dist/lib/node-esm/internal/index.mjs +45 -45
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +252 -191
- 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 +79 -70
- 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 +1 -1
- package/dist/types/src/Tag.d.ts.map +1 -1
- package/dist/types/src/Type.d.ts +39 -49
- package/dist/types/src/Type.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +6 -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 -1
- 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} +8 -9
- 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 -11
- 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/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 -0
- 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 -145
- 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/{types.d.ts → test-schema.d.ts} +166 -57
- 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 +248 -181
- package/src/Ref.ts +9 -9
- package/src/Relation.ts +58 -44
- package/src/Tag.ts +2 -1
- package/src/Type.ts +96 -83
- package/src/index.ts +9 -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/{object → entities}/model.ts +49 -90
- 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 +48 -38
- package/src/internal/{json → json-schema}/json-schema.ts +16 -7
- 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} +33 -34
- package/src/internal/object/deleted.ts +6 -6
- package/src/internal/object/ids.ts +1 -1
- package/src/internal/object/index.ts +3 -11
- 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 +11 -5
- 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 +8 -3
- package/src/internal/proxy/typed-object.test.ts +16 -11
- package/src/internal/ref/ref.test.ts +8 -7
- 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 +1 -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 -17
- 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 +48 -115
- package/src/query/query.ts +16 -502
- 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-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/query/index.mjs +0 -13
- package/dist/lib/browser/query/index.mjs.map +0 -7
- 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/query/index.mjs +0 -13
- 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 -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.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.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.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 -381
- 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/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.map +0 -1
- package/src/internal/ast/annotation-helper.ts +0 -22
- package/src/internal/ast/annotations.ts +0 -226
- 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/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/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 -144
- 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/test/api.test.ts +0 -180
- package/src/testing/echo-schema.ts +0 -39
- package/src/testing/types.ts +0 -108
- /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
|
@@ -10,6 +10,7 @@ import * as DateUtil from './date';
|
|
|
10
10
|
import * as NumberUtil from './number';
|
|
11
11
|
import * as ObjectUtil from './object';
|
|
12
12
|
import * as StringUtil from './string';
|
|
13
|
+
import { TypeFormat as TypeFormatEnum } from './types';
|
|
13
14
|
|
|
14
15
|
// TODO(burdon): Consider factoring out to separate `@dxos/json-schema`
|
|
15
16
|
// TODO(burdon): Media encoding.
|
|
@@ -22,6 +23,8 @@ import * as StringUtil from './string';
|
|
|
22
23
|
*/
|
|
23
24
|
// TODO(burdon): Add fields for `examples`, `message`, etc.
|
|
24
25
|
export namespace Format {
|
|
26
|
+
export import TypeFormat = TypeFormatEnum;
|
|
27
|
+
|
|
25
28
|
// Strings
|
|
26
29
|
export const DXN = Keys.DXN.Schema;
|
|
27
30
|
export const Email = StringUtil.Email;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import * as Schema from 'effect/Schema';
|
|
6
6
|
|
|
7
|
-
import { FormatAnnotation,
|
|
7
|
+
import { FormatAnnotation, TypeFormat } from './types';
|
|
8
8
|
|
|
9
9
|
const encodeMultipleOf = (divisor: number) => 1 / Math.pow(10, divisor);
|
|
10
10
|
|
|
@@ -37,7 +37,7 @@ export type CurrencyAnnotation = {
|
|
|
37
37
|
export const Currency = ({ decimals, code }: CurrencyAnnotation = { decimals: 2 }) =>
|
|
38
38
|
Schema.Number.pipe(
|
|
39
39
|
encodeMultiple(decimals),
|
|
40
|
-
FormatAnnotation.set(
|
|
40
|
+
FormatAnnotation.set(TypeFormat.Currency),
|
|
41
41
|
Schema.annotations({
|
|
42
42
|
title: 'Currency',
|
|
43
43
|
description: 'Currency value',
|
|
@@ -55,7 +55,7 @@ export type PercentAnnotation = {
|
|
|
55
55
|
export const Integer = () =>
|
|
56
56
|
Schema.Number.pipe(
|
|
57
57
|
Schema.int(),
|
|
58
|
-
FormatAnnotation.set(
|
|
58
|
+
FormatAnnotation.set(TypeFormat.Integer),
|
|
59
59
|
Schema.annotations({
|
|
60
60
|
title: 'Integer',
|
|
61
61
|
description: 'Integer value',
|
|
@@ -69,7 +69,7 @@ export const Integer = () =>
|
|
|
69
69
|
export const Percent = ({ decimals }: PercentAnnotation = { decimals: 2 }) =>
|
|
70
70
|
Schema.Number.pipe(
|
|
71
71
|
encodeMultiple(decimals),
|
|
72
|
-
FormatAnnotation.set(
|
|
72
|
+
FormatAnnotation.set(TypeFormat.Percent),
|
|
73
73
|
Schema.annotations({
|
|
74
74
|
title: 'Percent',
|
|
75
75
|
description: 'Percentage value',
|
|
@@ -81,7 +81,7 @@ export const Percent = ({ decimals }: PercentAnnotation = { decimals: 2 }) =>
|
|
|
81
81
|
* https://en.wikipedia.org/wiki/Unix_time
|
|
82
82
|
*/
|
|
83
83
|
export const Timestamp = Schema.Number.pipe(
|
|
84
|
-
FormatAnnotation.set(
|
|
84
|
+
FormatAnnotation.set(TypeFormat.Timestamp),
|
|
85
85
|
Schema.annotations({
|
|
86
86
|
title: 'Timestamp',
|
|
87
87
|
description: 'Unix timestamp',
|
|
@@ -6,7 +6,7 @@ import * as Schema from 'effect/Schema';
|
|
|
6
6
|
|
|
7
7
|
import { clamp } from '@dxos/util';
|
|
8
8
|
|
|
9
|
-
import { FormatAnnotation,
|
|
9
|
+
import { FormatAnnotation, TypeFormat } from './types';
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
12
|
* GeoJSON Format
|
|
@@ -27,7 +27,7 @@ export const GeoPoint = Schema.Tuple(
|
|
|
27
27
|
title: 'Height ASL (m)',
|
|
28
28
|
}),
|
|
29
29
|
).pipe(
|
|
30
|
-
FormatAnnotation.set(
|
|
30
|
+
FormatAnnotation.set(TypeFormat.GeoPoint),
|
|
31
31
|
Schema.annotations({
|
|
32
32
|
title: 'GeoPoint',
|
|
33
33
|
description: 'GeoJSON Position',
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import * as Schema from 'effect/Schema';
|
|
6
6
|
import * as SchemaAST from 'effect/SchemaAST';
|
|
7
7
|
|
|
8
|
-
import { FormatAnnotation,
|
|
8
|
+
import { FormatAnnotation, TypeFormat } from './types';
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* Email address (RFC 5321)
|
|
@@ -13,7 +13,7 @@ import { FormatAnnotation, FormatEnum } from './types';
|
|
|
13
13
|
*/
|
|
14
14
|
export const Email = Schema.String.pipe(
|
|
15
15
|
Schema.pattern(/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/),
|
|
16
|
-
FormatAnnotation.set(
|
|
16
|
+
FormatAnnotation.set(TypeFormat.Email),
|
|
17
17
|
Schema.annotations({
|
|
18
18
|
title: 'Email',
|
|
19
19
|
description: 'Email address',
|
|
@@ -24,25 +24,25 @@ export const Email = Schema.String.pipe(
|
|
|
24
24
|
*
|
|
25
25
|
*/
|
|
26
26
|
// TODO(burdon): Implement.
|
|
27
|
-
export const Formula = Schema.String.pipe(FormatAnnotation.set(
|
|
27
|
+
export const Formula = Schema.String.pipe(FormatAnnotation.set(TypeFormat.Formula));
|
|
28
28
|
|
|
29
29
|
/**
|
|
30
30
|
*
|
|
31
31
|
*/
|
|
32
32
|
// TODO(burdon): Implement.
|
|
33
|
-
export const Hostname = Schema.String.pipe(FormatAnnotation.set(
|
|
33
|
+
export const Hostname = Schema.String.pipe(FormatAnnotation.set(TypeFormat.Hostname));
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
36
|
*
|
|
37
37
|
*/
|
|
38
38
|
// TODO(burdon): Implement.
|
|
39
|
-
export const JSON = Schema.String.pipe(FormatAnnotation.set(
|
|
39
|
+
export const JSON = Schema.String.pipe(FormatAnnotation.set(TypeFormat.JSON));
|
|
40
40
|
|
|
41
41
|
/**
|
|
42
42
|
*
|
|
43
43
|
*/
|
|
44
44
|
// TODO(burdon): Implement.
|
|
45
|
-
export const Markdown = Schema.String.pipe(FormatAnnotation.set(
|
|
45
|
+
export const Markdown = Schema.String.pipe(FormatAnnotation.set(TypeFormat.Markdown));
|
|
46
46
|
|
|
47
47
|
/**
|
|
48
48
|
* Regex
|
|
@@ -50,14 +50,14 @@ export const Markdown = Schema.String.pipe(FormatAnnotation.set(FormatEnum.Markd
|
|
|
50
50
|
* https://ecma-international.org/publications-and-standards/standards/ecma-262
|
|
51
51
|
*/
|
|
52
52
|
// TODO(burdon): Implement.
|
|
53
|
-
export const Regex = Schema.String.pipe(FormatAnnotation.set(
|
|
53
|
+
export const Regex = Schema.String.pipe(FormatAnnotation.set(TypeFormat.Regex));
|
|
54
54
|
|
|
55
55
|
/**
|
|
56
56
|
* https://datatracker.ietf.org/doc/html/rfc3986#section-1.1.3
|
|
57
57
|
*/
|
|
58
58
|
export const URL = Schema.String.pipe(
|
|
59
59
|
Schema.pattern(/^(\w+?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([/\w .-]*)*\/?$/i),
|
|
60
|
-
FormatAnnotation.set(
|
|
60
|
+
FormatAnnotation.set(TypeFormat.URL),
|
|
61
61
|
Schema.annotations({
|
|
62
62
|
title: 'URL',
|
|
63
63
|
description: 'URL',
|
|
@@ -69,7 +69,7 @@ export const URL = Schema.String.pipe(
|
|
|
69
69
|
* https://datatracker.ietf.org/doc/html/rfc4122
|
|
70
70
|
*/
|
|
71
71
|
export const UUID = Schema.UUID.pipe(
|
|
72
|
-
FormatAnnotation.set(
|
|
72
|
+
FormatAnnotation.set(TypeFormat.UUID),
|
|
73
73
|
Schema.annotations({
|
|
74
74
|
[SchemaAST.ExamplesAnnotationId]: ['3e4666bf-d5e5-4aa7-b8ce-cefe41c7568a'],
|
|
75
75
|
}),
|
|
@@ -7,7 +7,7 @@ import type * as JSONSchema from 'effect/JSONSchema';
|
|
|
7
7
|
import * as Option from 'effect/Option';
|
|
8
8
|
import * as SchemaAST from 'effect/SchemaAST';
|
|
9
9
|
|
|
10
|
-
import { createAnnotationHelper } from '../
|
|
10
|
+
import { createAnnotationHelper } from '../annotations';
|
|
11
11
|
import { type JsonSchemaType } from '../json-schema';
|
|
12
12
|
|
|
13
13
|
// TODO(burdon): Rename PropertyType.
|
|
@@ -53,14 +53,19 @@ export const getTypeEnum = (property: JsonSchemaType): TypeEnum | undefined => {
|
|
|
53
53
|
*/
|
|
54
54
|
export const FormatAnnotationId = Symbol.for('@dxos/schema/annotation/Format');
|
|
55
55
|
|
|
56
|
-
export const FormatAnnotation = createAnnotationHelper<
|
|
56
|
+
export const FormatAnnotation = createAnnotationHelper<TypeFormat>(FormatAnnotationId);
|
|
57
57
|
|
|
58
|
-
export const getFormatAnnotation = (node: SchemaAST.AST):
|
|
59
|
-
Function.pipe(SchemaAST.getAnnotation<
|
|
58
|
+
export const getFormatAnnotation = (node: SchemaAST.AST): TypeFormat | undefined =>
|
|
59
|
+
Function.pipe(SchemaAST.getAnnotation<TypeFormat>(FormatAnnotationId)(node), Option.getOrUndefined);
|
|
60
60
|
|
|
61
|
-
// TODO(burdon): Rename
|
|
62
|
-
export enum
|
|
61
|
+
// TODO(burdon): Rename Format; Change to discriminated union?
|
|
62
|
+
export enum TypeFormat {
|
|
63
63
|
None = 'none',
|
|
64
|
+
|
|
65
|
+
//
|
|
66
|
+
// Scalar
|
|
67
|
+
//
|
|
68
|
+
|
|
64
69
|
String = 'string',
|
|
65
70
|
Number = 'number',
|
|
66
71
|
Boolean = 'boolean',
|
|
@@ -108,60 +113,60 @@ export enum FormatEnum {
|
|
|
108
113
|
GeoPoint = 'lnglat',
|
|
109
114
|
}
|
|
110
115
|
|
|
111
|
-
export const FormatEnums = Object.values(
|
|
116
|
+
export const FormatEnums = Object.values(TypeFormat).sort();
|
|
112
117
|
|
|
113
118
|
export const PropertyKind = {
|
|
114
119
|
type: TypeEnum,
|
|
115
|
-
format:
|
|
120
|
+
format: TypeFormat,
|
|
116
121
|
};
|
|
117
122
|
|
|
118
123
|
/**
|
|
119
124
|
* Default formats
|
|
120
125
|
*/
|
|
121
|
-
export const typeToFormat: Partial<Record<TypeEnum,
|
|
122
|
-
[TypeEnum.String]:
|
|
123
|
-
[TypeEnum.Number]:
|
|
124
|
-
[TypeEnum.Boolean]:
|
|
126
|
+
export const typeToFormat: Partial<Record<TypeEnum, TypeFormat>> = {
|
|
127
|
+
[TypeEnum.String]: TypeFormat.String,
|
|
128
|
+
[TypeEnum.Number]: TypeFormat.Number,
|
|
129
|
+
[TypeEnum.Boolean]: TypeFormat.Boolean,
|
|
125
130
|
};
|
|
126
131
|
|
|
127
132
|
/**
|
|
128
133
|
* Map of format to type.
|
|
129
134
|
*/
|
|
130
|
-
export const formatToType: Record<
|
|
131
|
-
[
|
|
132
|
-
[
|
|
133
|
-
[
|
|
134
|
-
[
|
|
135
|
-
[
|
|
135
|
+
export const formatToType: Record<TypeFormat, TypeEnum> = {
|
|
136
|
+
[TypeFormat.None]: undefined as any,
|
|
137
|
+
[TypeFormat.String]: TypeEnum.String,
|
|
138
|
+
[TypeFormat.Number]: TypeEnum.Number,
|
|
139
|
+
[TypeFormat.Boolean]: TypeEnum.Boolean,
|
|
140
|
+
[TypeFormat.Ref]: TypeEnum.Ref,
|
|
136
141
|
|
|
137
142
|
// Strings
|
|
138
|
-
[
|
|
139
|
-
[
|
|
140
|
-
[
|
|
141
|
-
[
|
|
142
|
-
[
|
|
143
|
-
[
|
|
144
|
-
[
|
|
145
|
-
[
|
|
146
|
-
[
|
|
147
|
-
[
|
|
148
|
-
[
|
|
149
|
-
[
|
|
143
|
+
[TypeFormat.DID]: TypeEnum.String,
|
|
144
|
+
[TypeFormat.DXN]: TypeEnum.String,
|
|
145
|
+
[TypeFormat.Email]: TypeEnum.String,
|
|
146
|
+
[TypeFormat.Formula]: TypeEnum.String,
|
|
147
|
+
[TypeFormat.Hostname]: TypeEnum.String,
|
|
148
|
+
[TypeFormat.JSON]: TypeEnum.String,
|
|
149
|
+
[TypeFormat.Markdown]: TypeEnum.String,
|
|
150
|
+
[TypeFormat.Regex]: TypeEnum.String,
|
|
151
|
+
[TypeFormat.URL]: TypeEnum.String,
|
|
152
|
+
[TypeFormat.UUID]: TypeEnum.String,
|
|
153
|
+
[TypeFormat.SingleSelect]: TypeEnum.String,
|
|
154
|
+
[TypeFormat.MultiSelect]: TypeEnum.Object,
|
|
150
155
|
|
|
151
156
|
// Dates
|
|
152
|
-
[
|
|
153
|
-
[
|
|
154
|
-
[
|
|
155
|
-
[
|
|
157
|
+
[TypeFormat.Date]: TypeEnum.String,
|
|
158
|
+
[TypeFormat.DateTime]: TypeEnum.String,
|
|
159
|
+
[TypeFormat.Duration]: TypeEnum.String,
|
|
160
|
+
[TypeFormat.Time]: TypeEnum.String,
|
|
156
161
|
|
|
157
162
|
// Numbers
|
|
158
|
-
[
|
|
159
|
-
[
|
|
160
|
-
[
|
|
161
|
-
[
|
|
163
|
+
[TypeFormat.Currency]: TypeEnum.Number,
|
|
164
|
+
[TypeFormat.Integer]: TypeEnum.Number,
|
|
165
|
+
[TypeFormat.Percent]: TypeEnum.Number,
|
|
166
|
+
[TypeFormat.Timestamp]: TypeEnum.Number,
|
|
162
167
|
|
|
163
168
|
// Objects
|
|
164
|
-
[
|
|
169
|
+
[TypeFormat.GeoPoint]: TypeEnum.Array,
|
|
165
170
|
};
|
|
166
171
|
|
|
167
172
|
/**
|
package/src/internal/index.ts
CHANGED
|
@@ -2,21 +2,37 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
// TODO(burdon): Import directly (not part of ECHO API).
|
|
6
|
+
export { JsonPath, JsonProp, getValue, setValue, splitJsonPath } from '@dxos/effect';
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
export
|
|
9
|
-
export { ForeignKey } from '@dxos/echo-protocol';
|
|
10
|
-
|
|
11
|
-
export * from './ast';
|
|
8
|
+
export * from './annotations';
|
|
9
|
+
export * from './entities';
|
|
12
10
|
export * from './formats';
|
|
13
|
-
export * from './json';
|
|
14
11
|
export * from './json-schema';
|
|
15
|
-
export * from './object';
|
|
16
|
-
export * from './types';
|
|
17
|
-
export { defineHiddenProperty } from '@dxos/live-object';
|
|
18
|
-
export * from './projection';
|
|
19
|
-
// TODO(dmaretskyi): Remove
|
|
20
|
-
export { live } from './proxy/reactive-object';
|
|
21
12
|
export * from './ref';
|
|
13
|
+
export * from './types';
|
|
14
|
+
|
|
15
|
+
// TODO(wittjosiah): Required to ensure types are portable (need to export all types required for downstream inference).
|
|
16
|
+
export * from './object';
|
|
17
|
+
export * from './proxy';
|
|
22
18
|
export * from './schema';
|
|
19
|
+
|
|
20
|
+
// export {
|
|
21
|
+
// createObject,
|
|
22
|
+
// createQueueDXN,
|
|
23
|
+
// isDeleted,
|
|
24
|
+
// objectFromJSON,
|
|
25
|
+
// objectToJSON,
|
|
26
|
+
// setRefResolverOnData,
|
|
27
|
+
// SchemaValidator,
|
|
28
|
+
// TypedObject,
|
|
29
|
+
// } from './object';
|
|
30
|
+
// export { makeObject } from './proxy';
|
|
31
|
+
// export {
|
|
32
|
+
// type BaseSchema,
|
|
33
|
+
// EchoSchema,
|
|
34
|
+
// ImmutableSchema,
|
|
35
|
+
// RuntimeSchemaRegistry,
|
|
36
|
+
// PersistentSchema,
|
|
37
|
+
// isMutable,
|
|
38
|
+
// } from './schema';
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import * as SchemaAST from 'effect/SchemaAST';
|
|
6
6
|
|
|
7
|
-
import { GeneratorAnnotationId, LabelAnnotationId, PropertyMetaAnnotationId } from '../
|
|
7
|
+
import { GeneratorAnnotationId, LabelAnnotationId, PropertyMetaAnnotationId } from '../annotations';
|
|
8
8
|
import { CurrencyAnnotationId, FormatAnnotationId } from '../formats';
|
|
9
9
|
import { type JsonSchemaEchoAnnotations, type JsonSchemaType } from '../json-schema';
|
|
10
10
|
|
|
@@ -6,8 +6,8 @@ import * as Schema from 'effect/Schema';
|
|
|
6
6
|
|
|
7
7
|
import { JsonPath, type JsonProp } from '@dxos/effect';
|
|
8
8
|
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
9
|
+
import { FormatAnnotation, TypeFormat } from '../formats';
|
|
10
|
+
import { EntityKindSchema } from '../types';
|
|
11
11
|
|
|
12
12
|
//
|
|
13
13
|
// JSON Schema
|
|
@@ -206,7 +206,7 @@ const _JsonSchemaType = Schema.Struct({
|
|
|
206
206
|
/**
|
|
207
207
|
* Regex pattern for strings.
|
|
208
208
|
*/
|
|
209
|
-
pattern: Schema.optional(Schema.String.pipe(FormatAnnotation.set(
|
|
209
|
+
pattern: Schema.optional(Schema.String.pipe(FormatAnnotation.set(TypeFormat.Regex))),
|
|
210
210
|
|
|
211
211
|
/**
|
|
212
212
|
* Serialized from {@link FormatAnnotationId}.
|
|
@@ -337,6 +337,7 @@ export const JsonSchemaFields = Object.keys(_JsonSchemaType.fields);
|
|
|
337
337
|
/**
|
|
338
338
|
* https://json-schema.org/draft-07/schema
|
|
339
339
|
*/
|
|
340
|
+
// TODO(burdon): Reconcile with @effect/Schema/JSONSchema
|
|
340
341
|
export interface JsonSchemaType extends Schema.Schema.Type<Schema.mutable<typeof _JsonSchemaType>> {}
|
|
341
342
|
|
|
342
343
|
export const JsonSchemaType: Schema.Schema<JsonSchemaType> = _JsonSchemaType.pipe(Schema.mutable);
|
|
@@ -11,22 +11,22 @@ import { type JsonProp, findAnnotation } from '@dxos/effect';
|
|
|
11
11
|
import { ObjectId } from '@dxos/keys';
|
|
12
12
|
import { log } from '@dxos/log';
|
|
13
13
|
|
|
14
|
-
import {
|
|
15
|
-
import
|
|
14
|
+
import { TestSchema, prepareAstForCompare } from '../../testing';
|
|
15
|
+
import * as Type from '../../Type';
|
|
16
16
|
import {
|
|
17
|
-
EntityKind,
|
|
18
17
|
FieldLookupAnnotationId,
|
|
19
18
|
GeneratorAnnotation,
|
|
20
19
|
LabelAnnotation,
|
|
21
20
|
PropertyMeta,
|
|
22
21
|
getTypeAnnotation,
|
|
23
22
|
getTypeIdentifierAnnotation,
|
|
24
|
-
} from '../
|
|
25
|
-
import {
|
|
23
|
+
} from '../annotations';
|
|
24
|
+
import { EchoObjectSchema } from '../entities';
|
|
25
|
+
import { Email, FormatAnnotation, TypeFormat } from '../formats';
|
|
26
26
|
import { JsonSchemaType, getNormalizedEchoAnnotations, getSchemaProperty, setSchemaProperty } from '../json-schema';
|
|
27
|
-
import { EchoObject } from '../object';
|
|
28
27
|
import { Ref, createSchemaReference, getReferenceAst, getSchemaReference } from '../ref';
|
|
29
|
-
import {
|
|
28
|
+
import { PersistentSchema } from '../schema';
|
|
29
|
+
import { EntityKind } from '../types';
|
|
30
30
|
|
|
31
31
|
import { toEffectSchema, toJsonSchema } from './json-schema';
|
|
32
32
|
|
|
@@ -159,9 +159,9 @@ describe('effect-to-json', () => {
|
|
|
159
159
|
});
|
|
160
160
|
|
|
161
161
|
test('annotations', () => {
|
|
162
|
-
const
|
|
162
|
+
const TempSchema = Schema.Struct({
|
|
163
163
|
name: Schema.String.annotations({ description: 'Person name', title: 'Name' }),
|
|
164
|
-
email: Schema.String.pipe(FormatAnnotation.set(
|
|
164
|
+
email: Schema.String.pipe(FormatAnnotation.set(TypeFormat.Email)).annotations({
|
|
165
165
|
description: 'Email address',
|
|
166
166
|
}),
|
|
167
167
|
}).pipe(
|
|
@@ -170,7 +170,8 @@ describe('effect-to-json', () => {
|
|
|
170
170
|
version: '0.1.0',
|
|
171
171
|
}),
|
|
172
172
|
);
|
|
173
|
-
|
|
173
|
+
|
|
174
|
+
const jsonSchema = toJsonSchema(TempSchema);
|
|
174
175
|
expect(jsonSchema).to.deep.eq({
|
|
175
176
|
$schema: 'http://json-schema.org/draft-07/schema#',
|
|
176
177
|
$id: 'dxn:type:example.com/type/Person',
|
|
@@ -197,8 +198,16 @@ describe('effect-to-json', () => {
|
|
|
197
198
|
});
|
|
198
199
|
|
|
199
200
|
test('handles suspend -- Contact schema serialization', () => {
|
|
200
|
-
const schema = toJsonSchema(
|
|
201
|
-
expect(Object.keys(schema.properties!)).toEqual([
|
|
201
|
+
const schema = toJsonSchema(TestSchema.Person);
|
|
202
|
+
expect(Object.keys(schema.properties!)).toEqual([
|
|
203
|
+
'id',
|
|
204
|
+
'name',
|
|
205
|
+
'username',
|
|
206
|
+
'email',
|
|
207
|
+
'tasks',
|
|
208
|
+
'employer',
|
|
209
|
+
'address',
|
|
210
|
+
]);
|
|
202
211
|
});
|
|
203
212
|
|
|
204
213
|
test('reference property by ref', () => {
|
|
@@ -289,8 +298,8 @@ describe('effect-to-json', () => {
|
|
|
289
298
|
expect(typename).to.eq(Organization.typename);
|
|
290
299
|
});
|
|
291
300
|
|
|
292
|
-
test('serialize circular schema (
|
|
293
|
-
const jsonSchema = toJsonSchema(
|
|
301
|
+
test('serialize circular schema (PersistentSchema)', () => {
|
|
302
|
+
const jsonSchema = toJsonSchema(PersistentSchema);
|
|
294
303
|
expect(Object.keys(jsonSchema.properties!).length).toBeGreaterThan(0);
|
|
295
304
|
|
|
296
305
|
// TODO(dmaretskyi): Currently unable to deserialize.
|
|
@@ -313,7 +322,7 @@ describe('effect-to-json', () => {
|
|
|
313
322
|
|
|
314
323
|
test('reference with title annotation', () => {
|
|
315
324
|
const schema = Schema.Struct({
|
|
316
|
-
contact: Ref(
|
|
325
|
+
contact: Ref(TestSchema.Person).annotations({ title: 'Custom Title' }),
|
|
317
326
|
});
|
|
318
327
|
|
|
319
328
|
// log.info('schema before', { ast: schema.ast });
|
|
@@ -336,13 +345,13 @@ describe('effect-to-json', () => {
|
|
|
336
345
|
});
|
|
337
346
|
|
|
338
347
|
test('relation schema', () => {
|
|
339
|
-
const schema =
|
|
348
|
+
const schema = TestSchema.EmployedBy;
|
|
340
349
|
const jsonSchema = toJsonSchema(schema);
|
|
341
350
|
expect(jsonSchema).toEqual({
|
|
342
|
-
$id: 'dxn:type:example.com/type/
|
|
351
|
+
$id: 'dxn:type:example.com/type/EmployedBy',
|
|
343
352
|
$schema: 'http://json-schema.org/draft-07/schema#',
|
|
344
353
|
entityKind: 'relation',
|
|
345
|
-
typename: 'example.com/type/
|
|
354
|
+
typename: 'example.com/type/EmployedBy',
|
|
346
355
|
version: '0.1.0',
|
|
347
356
|
relationSource: {
|
|
348
357
|
// TODO(dmaretskyi): Should those point to specific schema version?
|
|
@@ -350,19 +359,22 @@ describe('effect-to-json', () => {
|
|
|
350
359
|
},
|
|
351
360
|
relationTarget: {
|
|
352
361
|
// TODO(dmaretskyi): Should those point to specific schema version?
|
|
353
|
-
$ref: 'dxn:type:example.com/type/
|
|
362
|
+
$ref: 'dxn:type:example.com/type/Organization',
|
|
354
363
|
},
|
|
355
364
|
type: 'object',
|
|
356
365
|
properties: {
|
|
357
366
|
id: {
|
|
358
367
|
type: 'string',
|
|
359
368
|
},
|
|
369
|
+
role: {
|
|
370
|
+
type: 'string',
|
|
371
|
+
},
|
|
360
372
|
since: {
|
|
361
373
|
type: 'string',
|
|
362
374
|
},
|
|
363
375
|
},
|
|
364
|
-
propertyOrder: ['since', 'id'],
|
|
365
|
-
required: ['id'],
|
|
376
|
+
propertyOrder: ['role', 'since', 'id'],
|
|
377
|
+
required: ['role', 'id'],
|
|
366
378
|
additionalProperties: false,
|
|
367
379
|
});
|
|
368
380
|
});
|
|
@@ -372,7 +384,7 @@ describe('effect-to-json', () => {
|
|
|
372
384
|
id: ObjectId,
|
|
373
385
|
name: Schema.String,
|
|
374
386
|
}).pipe(
|
|
375
|
-
|
|
387
|
+
EchoObjectSchema({
|
|
376
388
|
typename: 'example.com/type/Organization',
|
|
377
389
|
version: '0.1.0',
|
|
378
390
|
}),
|
|
@@ -498,7 +510,7 @@ describe('json-to-effect', () => {
|
|
|
498
510
|
object: Schema.Struct({ id: Schema.String, field: Ref(Organization) }),
|
|
499
511
|
echoObject: Ref(Organization),
|
|
500
512
|
echoObjectArray: Schema.Array(Ref(Organization)),
|
|
501
|
-
email: Schema.String.pipe(FormatAnnotation.set(
|
|
513
|
+
email: Schema.String.pipe(FormatAnnotation.set(TypeFormat.Email)),
|
|
502
514
|
null: Schema.Null,
|
|
503
515
|
} as const;
|
|
504
516
|
|
|
@@ -570,8 +582,8 @@ describe('json-to-effect', () => {
|
|
|
570
582
|
});
|
|
571
583
|
|
|
572
584
|
test('symbol annotations get compared', () => {
|
|
573
|
-
const schema1 = Schema.String.pipe(FormatAnnotation.set(
|
|
574
|
-
const schema2 = Schema.String.pipe(FormatAnnotation.set(
|
|
585
|
+
const schema1 = Schema.String.pipe(FormatAnnotation.set(TypeFormat.Email));
|
|
586
|
+
const schema2 = Schema.String.pipe(FormatAnnotation.set(TypeFormat.Currency));
|
|
575
587
|
expect(prepareAstForCompare(schema1.ast)).not.to.deep.eq(prepareAstForCompare(schema2.ast));
|
|
576
588
|
});
|
|
577
589
|
|
|
@@ -586,7 +598,7 @@ describe('json-to-effect', () => {
|
|
|
586
598
|
});
|
|
587
599
|
|
|
588
600
|
test('relation schema roundtrip', () => {
|
|
589
|
-
const schema =
|
|
601
|
+
const schema = TestSchema.HasManager;
|
|
590
602
|
const jsonSchema = toJsonSchema(schema);
|
|
591
603
|
const effectSchema = toEffectSchema(jsonSchema);
|
|
592
604
|
expect(prepareAstForCompare(effectSchema.ast)).to.deep.eq(prepareAstForCompare(schema.ast));
|
|
@@ -689,10 +701,8 @@ describe('json-to-effect', () => {
|
|
|
689
701
|
});
|
|
690
702
|
|
|
691
703
|
test('schema with optional referece', () => {
|
|
692
|
-
const
|
|
693
|
-
|
|
694
|
-
});
|
|
695
|
-
const jsonSchema = toJsonSchema(TestSchema);
|
|
704
|
+
const TempSchema = Schema.Struct({ contact: Schema.optional(Ref(TestSchema.Person)) });
|
|
705
|
+
const jsonSchema = toJsonSchema(TempSchema);
|
|
696
706
|
expect(jsonSchema).toMatchInlineSnapshot(`
|
|
697
707
|
{
|
|
698
708
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
@@ -718,13 +728,13 @@ describe('json-to-effect', () => {
|
|
|
718
728
|
`);
|
|
719
729
|
|
|
720
730
|
const effectSchema = toEffectSchema(jsonSchema);
|
|
721
|
-
expect(prepareAstForCompare(effectSchema.ast)).to.deep.eq(prepareAstForCompare(
|
|
731
|
+
expect(prepareAstForCompare(effectSchema.ast)).to.deep.eq(prepareAstForCompare(TempSchema.ast));
|
|
722
732
|
});
|
|
723
733
|
|
|
724
734
|
test('object nested inside another struct', () => {
|
|
725
735
|
const Contact = Schema.Struct({
|
|
726
736
|
name: Schema.String,
|
|
727
|
-
}).pipe(
|
|
737
|
+
}).pipe(EchoObjectSchema({ typename: 'example.com/type/Person', version: '0.1.0' }));
|
|
728
738
|
const input = Schema.Struct({
|
|
729
739
|
contact: Contact,
|
|
730
740
|
});
|
|
@@ -776,7 +786,7 @@ describe('json-to-effect', () => {
|
|
|
776
786
|
|
|
777
787
|
describe('reference', () => {
|
|
778
788
|
test('reference annotation', () => {
|
|
779
|
-
const schema = Ref(
|
|
789
|
+
const schema = Ref(TestSchema.Person);
|
|
780
790
|
const jsonSchema = toJsonSchema(schema);
|
|
781
791
|
expect(jsonSchema).toEqual({
|
|
782
792
|
$id: '/schemas/echo/ref',
|
|
@@ -792,7 +802,7 @@ describe('reference', () => {
|
|
|
792
802
|
});
|
|
793
803
|
|
|
794
804
|
test('title annotation', () => {
|
|
795
|
-
const schema = Ref(
|
|
805
|
+
const schema = Ref(TestSchema.Person).annotations({ title: 'My custom title' });
|
|
796
806
|
const jsonSchema = toJsonSchema(schema);
|
|
797
807
|
expect(jsonSchema).toEqual({
|
|
798
808
|
$schema: 'http://json-schema.org/draft-07/schema#',
|
|
@@ -813,7 +823,7 @@ describe('reference', () => {
|
|
|
813
823
|
});
|
|
814
824
|
|
|
815
825
|
test('description annotation', () => {
|
|
816
|
-
const schema = Ref(
|
|
826
|
+
const schema = Ref(TestSchema.Person).annotations({ description: 'My custom description' });
|
|
817
827
|
const jsonSchema = toJsonSchema(schema);
|
|
818
828
|
expect(jsonSchema).toEqual({
|
|
819
829
|
$schema: 'http://json-schema.org/draft-07/schema#',
|
|
@@ -837,13 +847,13 @@ describe('reference', () => {
|
|
|
837
847
|
});
|
|
838
848
|
|
|
839
849
|
test('serialize and deserialize', () => {
|
|
840
|
-
const schema = Ref(
|
|
850
|
+
const schema = Ref(TestSchema.Person);
|
|
841
851
|
const jsonSchema = toJsonSchema(schema);
|
|
842
852
|
const deserializedSchema = toEffectSchema(jsonSchema);
|
|
843
853
|
const refAst = getReferenceAst(deserializedSchema.ast);
|
|
844
854
|
expect(refAst).toEqual({
|
|
845
|
-
typename:
|
|
846
|
-
version:
|
|
855
|
+
typename: TestSchema.Person.typename,
|
|
856
|
+
version: TestSchema.Person.version,
|
|
847
857
|
});
|
|
848
858
|
});
|
|
849
859
|
});
|
|
@@ -17,19 +17,24 @@ 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 { Expando } from '../entities';
|
|
27
|
+
import { type JsonSchemaReferenceInfo, Ref, createEchoReferenceSchema } from '../ref';
|
|
28
|
+
import { EntityKind, EntityKindSchema } from '../types';
|
|
29
|
+
|
|
30
|
+
import { CustomAnnotations, DecodedAnnotations, EchoAnnotations } from './annotations';
|
|
22
31
|
import {
|
|
23
32
|
ECHO_ANNOTATIONS_NS_DEPRECATED_KEY,
|
|
24
33
|
ECHO_ANNOTATIONS_NS_KEY,
|
|
25
34
|
type JsonSchemaEchoAnnotations,
|
|
26
35
|
type JsonSchemaType,
|
|
27
36
|
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';
|
|
37
|
+
} from './json-schema-type';
|
|
33
38
|
|
|
34
39
|
// TODO(burdon): Are these values stored (can they be changed?)
|
|
35
40
|
export enum PropType {
|
|
@@ -71,8 +76,11 @@ export type JsonSchemaOptions = {
|
|
|
71
76
|
|
|
72
77
|
/**
|
|
73
78
|
* Convert effect schema to JSON Schema.
|
|
79
|
+
* NOTE: This handles custom annotations.
|
|
74
80
|
* @param schema
|
|
75
81
|
*/
|
|
82
|
+
// TODO(burdon): Reconcile with possibly extending @effect/Schema/JSONSchema
|
|
83
|
+
// We add additional propertyOrder (but the object properties ARE ordered); and type "string" for literals.
|
|
76
84
|
export const toJsonSchema = (schema: Schema.Schema.All, options: JsonSchemaOptions = {}): JsonSchemaType => {
|
|
77
85
|
assertArgument(Schema.isSchema(schema), 'schema');
|
|
78
86
|
let jsonSchema = _toJsonSchemaAST(schema.ast);
|
|
@@ -346,6 +354,7 @@ const refToEffectSchema = (root: any): Schema.Schema.AnyNoContext => {
|
|
|
346
354
|
if (!('reference' in root)) {
|
|
347
355
|
return Ref(Expando);
|
|
348
356
|
}
|
|
357
|
+
|
|
349
358
|
const reference: JsonSchemaReferenceInfo = root.reference;
|
|
350
359
|
if (typeof reference !== 'object') {
|
|
351
360
|
throw new Error('Invalid reference field in ref schema');
|