@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
package/src/query/query.ts
CHANGED
|
@@ -3,52 +3,29 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import type * as EffectArray from 'effect/Array';
|
|
6
|
-
import * as
|
|
7
|
-
import * as Schema from 'effect/Schema';
|
|
6
|
+
import type * as Schema from 'effect/Schema';
|
|
8
7
|
|
|
9
|
-
import {
|
|
10
|
-
import { type ForeignKey, type QueryAST } from '@dxos/echo-protocol';
|
|
11
|
-
import { assertArgument } from '@dxos/invariant';
|
|
12
|
-
import { DXN, ObjectId } from '@dxos/keys';
|
|
8
|
+
import { type QueryAST } from '@dxos/echo-protocol';
|
|
13
9
|
|
|
14
|
-
import
|
|
15
|
-
import type * as Obj from '../Obj';
|
|
16
|
-
import * as Ref from '../Ref';
|
|
10
|
+
import type * as Ref from '../Ref';
|
|
17
11
|
import type * as Type from '../Type';
|
|
18
12
|
|
|
13
|
+
import { Filter, FilterClass } from './filter';
|
|
14
|
+
import { type Order } from './order';
|
|
15
|
+
import { getTypeDXNFromSpecifier } from './util';
|
|
16
|
+
|
|
17
|
+
// TODO(burdon): Query namespace (and move Filter, Order into Query namespace).
|
|
19
18
|
// TODO(dmaretskyi): Split up into interfaces for objects and relations so they can have separate verbs.
|
|
20
19
|
// TODO(dmaretskyi): Undirected relation traversals.
|
|
21
20
|
// TODO(wittjosiah): Make Filter & Query pipeable.
|
|
22
21
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
class OrderClass implements Order<any> {
|
|
31
|
-
private static variance: Order<any>['~Order'] = {} as Order<any>['~Order'];
|
|
32
|
-
|
|
33
|
-
static is(value: unknown): value is Order<any> {
|
|
34
|
-
return typeof value === 'object' && value !== null && '~Order' in value;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
constructor(public readonly ast: QueryAST.Order) {}
|
|
38
|
-
|
|
39
|
-
'~Order' = OrderClass.variance;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export namespace Order {
|
|
43
|
-
export const natural: Order<any> = new OrderClass({ kind: 'natural' });
|
|
44
|
-
export const property = <T>(property: keyof T & string, direction: QueryAST.OrderDirection): Order<T> =>
|
|
45
|
-
new OrderClass({
|
|
46
|
-
kind: 'property',
|
|
47
|
-
property,
|
|
48
|
-
direction,
|
|
49
|
-
});
|
|
50
|
-
}
|
|
22
|
+
/**
|
|
23
|
+
* All property paths inside T that are references.
|
|
24
|
+
*/
|
|
25
|
+
// TODO(dmaretskyi): Filter only properties that are references (or optional references, or unions that include references).
|
|
26
|
+
type RefPropKey<T> = keyof T & string;
|
|
51
27
|
|
|
28
|
+
// TODO(burdon): Narrow T to Entity.Unknown?
|
|
52
29
|
export interface Query<T> {
|
|
53
30
|
// TODO(dmaretskyi): See new effect-schema approach to variance.
|
|
54
31
|
'~Query': { value: T };
|
|
@@ -186,453 +163,9 @@ export declare namespace Query {
|
|
|
186
163
|
export type Any = Query<any>;
|
|
187
164
|
|
|
188
165
|
export type Type<Q extends Any> = Q extends Query<infer T> ? T : never;
|
|
189
|
-
|
|
190
|
-
export type TextSearchOptions = {
|
|
191
|
-
// TODO(dmaretskyi): Hybrid search.
|
|
192
|
-
type?: 'full-text' | 'vector';
|
|
193
|
-
};
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
export interface Filter<T> {
|
|
197
|
-
// TODO(dmaretskyi): See new effect-schema approach to variance.
|
|
198
|
-
'~Filter': { value: T };
|
|
199
|
-
|
|
200
|
-
ast: QueryAST.Filter;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
type Intersection<Types extends readonly unknown[]> = Types extends [infer First, ...infer Rest]
|
|
204
|
-
? First & Intersection<Rest>
|
|
205
|
-
: unknown;
|
|
206
|
-
|
|
207
|
-
interface FilterAPI {
|
|
208
|
-
is(value: unknown): value is Filter<any>;
|
|
209
|
-
|
|
210
|
-
/** Construct a filter from an ast. */
|
|
211
|
-
fromAst(ast: QueryAST.Filter): Filter<any>;
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* Filter that matches all objects.
|
|
215
|
-
*/
|
|
216
|
-
everything(): Filter<any>;
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* Filter that matches no objects.
|
|
220
|
-
*/
|
|
221
|
-
nothing(): Filter<any>;
|
|
222
|
-
|
|
223
|
-
/**
|
|
224
|
-
* Filter by object IDs.
|
|
225
|
-
*/
|
|
226
|
-
// TODO(dmaretskyi): Rename to `Filter.id`.
|
|
227
|
-
ids(...id: ObjectId[]): Filter<any>;
|
|
228
|
-
|
|
229
|
-
/**
|
|
230
|
-
* Filter by type.
|
|
231
|
-
*/
|
|
232
|
-
type<S extends Schema.Schema.All>(
|
|
233
|
-
schema: S | string,
|
|
234
|
-
props?: Filter.Props<Schema.Schema.Type<S>>,
|
|
235
|
-
): Filter<Schema.Schema.Type<S>>;
|
|
236
|
-
|
|
237
|
-
/**
|
|
238
|
-
* Filter by non-qualified typename.
|
|
239
|
-
*/
|
|
240
|
-
typename(typename: string): Filter<any>;
|
|
241
|
-
|
|
242
|
-
/**
|
|
243
|
-
* Filter by fully qualified type DXN.
|
|
244
|
-
*/
|
|
245
|
-
typeDXN(dxn: DXN): Filter<any>;
|
|
246
|
-
|
|
247
|
-
/**
|
|
248
|
-
* Filter by tag.
|
|
249
|
-
*/
|
|
250
|
-
tag(tag: string): Filter<Obj.Any>;
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* Filter by properties.
|
|
254
|
-
*/
|
|
255
|
-
props<T>(props: Filter.Props<T>): Filter<T>;
|
|
256
|
-
|
|
257
|
-
/**
|
|
258
|
-
* Full-text or vector search.
|
|
259
|
-
*/
|
|
260
|
-
text(
|
|
261
|
-
// TODO(dmaretskyi): Consider passing a vector here, but really the embedding should be done on the query-executor side.
|
|
262
|
-
text: string,
|
|
263
|
-
options?: Query.TextSearchOptions,
|
|
264
|
-
): Filter<any>;
|
|
265
|
-
|
|
266
|
-
/**
|
|
267
|
-
* Filter by foreign keys.
|
|
268
|
-
*/
|
|
269
|
-
foreignKeys<S extends Schema.Schema.All>(schema: S, keys: ForeignKey[]): Filter<Schema.Schema.Type<S>>;
|
|
270
|
-
|
|
271
|
-
/**
|
|
272
|
-
* Predicate for property to be equal to the provided value.
|
|
273
|
-
*/
|
|
274
|
-
eq<T>(value: T): Filter<T>;
|
|
275
|
-
|
|
276
|
-
/**
|
|
277
|
-
* Predicate for property to be not equal to the provided value.
|
|
278
|
-
*/
|
|
279
|
-
neq<T>(value: T): Filter<T>;
|
|
280
|
-
|
|
281
|
-
/**
|
|
282
|
-
* Predicate for property to be greater than the provided value.
|
|
283
|
-
*/
|
|
284
|
-
gt<T>(value: T): Filter<T>;
|
|
285
|
-
|
|
286
|
-
/**
|
|
287
|
-
* Predicate for property to be greater than the provided value.
|
|
288
|
-
*/
|
|
289
|
-
gt<T>(value: T): Filter<T>;
|
|
290
|
-
|
|
291
|
-
/**
|
|
292
|
-
* Predicate for property to be greater than or equal to the provided value.
|
|
293
|
-
*/
|
|
294
|
-
gte<T>(value: T): Filter<T>;
|
|
295
|
-
|
|
296
|
-
/**
|
|
297
|
-
* Predicate for property to be less than the provided value.
|
|
298
|
-
*/
|
|
299
|
-
lt<T>(value: T): Filter<T>;
|
|
300
|
-
|
|
301
|
-
/**
|
|
302
|
-
* Predicate for property to be less than or equal to the provided value.
|
|
303
|
-
*/
|
|
304
|
-
lte<T>(value: T): Filter<T>;
|
|
305
|
-
|
|
306
|
-
/**
|
|
307
|
-
* Predicate for property to be in the provided array.
|
|
308
|
-
* @param values - Values to check against.
|
|
309
|
-
*/
|
|
310
|
-
in<T>(...values: T[]): Filter<T>;
|
|
311
|
-
|
|
312
|
-
/**
|
|
313
|
-
* Predicate for an array property to contain the provided value.
|
|
314
|
-
* @param value - Value to check against.
|
|
315
|
-
*/
|
|
316
|
-
contains<T>(value: T): Filter<T[]>;
|
|
317
|
-
|
|
318
|
-
/**
|
|
319
|
-
* Predicate for property to be in the provided range.
|
|
320
|
-
* @param from - Start of the range (inclusive).
|
|
321
|
-
* @param to - End of the range (exclusive).
|
|
322
|
-
*/
|
|
323
|
-
between<T>(from: T, to: T): Filter<T>;
|
|
324
|
-
|
|
325
|
-
/**
|
|
326
|
-
* Negate the filter.
|
|
327
|
-
*/
|
|
328
|
-
not<F extends Filter.Any>(filter: F): Filter<Filter.Type<F>>;
|
|
329
|
-
|
|
330
|
-
/**
|
|
331
|
-
* Combine filters with a logical AND.
|
|
332
|
-
*/
|
|
333
|
-
and<FS extends Filter.Any[]>(...filters: FS): Filter<Filter.And<FS>>;
|
|
334
|
-
|
|
335
|
-
/**
|
|
336
|
-
* Combine filters with a logical OR.
|
|
337
|
-
*/
|
|
338
|
-
or<FS extends Filter.Any[]>(...filters: FS): Filter<Filter.Or<FS>>;
|
|
339
|
-
|
|
340
|
-
// TODO(dmaretskyi): Add `Filter.match` to support pattern matching on string props.
|
|
341
166
|
}
|
|
342
167
|
|
|
343
|
-
|
|
344
|
-
type Props<T> = {
|
|
345
|
-
// Predicate or a value as a shorthand for `eq`.
|
|
346
|
-
[K in keyof T & string]?: Filter<T[K]> | T[K];
|
|
347
|
-
};
|
|
348
|
-
|
|
349
|
-
type Any = Filter<any>;
|
|
350
|
-
|
|
351
|
-
type Type<F extends Any> = F extends Filter<infer T> ? T : never;
|
|
352
|
-
|
|
353
|
-
type And<FS extends readonly Any[]> = Schema.Simplify<Intersection<{ [K in keyof FS]: Type<FS[K]> }>>;
|
|
354
|
-
|
|
355
|
-
type Or<FS extends readonly Any[]> = Schema.Simplify<{ [K in keyof FS]: Type<FS[K]> }[number]>;
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
class FilterClass implements Filter<any> {
|
|
359
|
-
private static variance: Filter<any>['~Filter'] = {} as Filter<any>['~Filter'];
|
|
360
|
-
|
|
361
|
-
static is(value: unknown): value is Filter<any> {
|
|
362
|
-
return typeof value === 'object' && value !== null && '~Filter' in value;
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
static fromAst(ast: QueryAST.Filter): Filter<any> {
|
|
366
|
-
return new FilterClass(ast);
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
static everything(): FilterClass {
|
|
370
|
-
return new FilterClass({
|
|
371
|
-
type: 'object',
|
|
372
|
-
typename: null,
|
|
373
|
-
props: {},
|
|
374
|
-
});
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
static nothing(): FilterClass {
|
|
378
|
-
return new FilterClass({
|
|
379
|
-
type: 'not',
|
|
380
|
-
filter: {
|
|
381
|
-
type: 'object',
|
|
382
|
-
typename: null,
|
|
383
|
-
props: {},
|
|
384
|
-
},
|
|
385
|
-
});
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
static relation() {
|
|
389
|
-
return new FilterClass({
|
|
390
|
-
type: 'object',
|
|
391
|
-
typename: null,
|
|
392
|
-
props: {},
|
|
393
|
-
});
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
static ids(...ids: ObjectId[]): Filter<any> {
|
|
397
|
-
assertArgument(
|
|
398
|
-
ids.every((id) => ObjectId.isValid(id)),
|
|
399
|
-
'ids',
|
|
400
|
-
'ids must be valid',
|
|
401
|
-
);
|
|
402
|
-
|
|
403
|
-
if (ids.length === 0) {
|
|
404
|
-
return Filter.nothing();
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
return new FilterClass({
|
|
408
|
-
type: 'object',
|
|
409
|
-
typename: null,
|
|
410
|
-
id: ids,
|
|
411
|
-
props: {},
|
|
412
|
-
});
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
static type<S extends Schema.Schema.All>(
|
|
416
|
-
schema: S | string,
|
|
417
|
-
props?: Filter.Props<Schema.Schema.Type<S>>,
|
|
418
|
-
): Filter<Schema.Schema.Type<S>> {
|
|
419
|
-
const dxn = getTypeDXNFromSpecifier(schema);
|
|
420
|
-
return new FilterClass({
|
|
421
|
-
type: 'object',
|
|
422
|
-
typename: dxn.toString(),
|
|
423
|
-
...propsFilterToAst(props ?? {}),
|
|
424
|
-
});
|
|
425
|
-
}
|
|
426
|
-
|
|
427
|
-
static typename(typename: string): Filter<any> {
|
|
428
|
-
assertArgument(!typename.startsWith('dxn:'), 'typename', 'Typename must no be qualified');
|
|
429
|
-
return new FilterClass({
|
|
430
|
-
type: 'object',
|
|
431
|
-
typename: DXN.fromTypename(typename).toString(),
|
|
432
|
-
props: {},
|
|
433
|
-
});
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
static typeDXN(dxn: DXN): Filter<any> {
|
|
437
|
-
return new FilterClass({
|
|
438
|
-
type: 'object',
|
|
439
|
-
typename: dxn.toString(),
|
|
440
|
-
props: {},
|
|
441
|
-
});
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
static tag(tag: string): Filter<any> {
|
|
445
|
-
return new FilterClass({
|
|
446
|
-
type: 'tag',
|
|
447
|
-
tag,
|
|
448
|
-
});
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
static props<T>(props: Filter.Props<T>): Filter<T> {
|
|
452
|
-
return new FilterClass({
|
|
453
|
-
type: 'object',
|
|
454
|
-
typename: null,
|
|
455
|
-
...propsFilterToAst(props),
|
|
456
|
-
});
|
|
457
|
-
}
|
|
458
|
-
|
|
459
|
-
static text(text: string, options?: Query.TextSearchOptions): Filter<any> {
|
|
460
|
-
return new FilterClass({
|
|
461
|
-
type: 'text-search',
|
|
462
|
-
text,
|
|
463
|
-
searchKind: options?.type,
|
|
464
|
-
});
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
static foreignKeys<S extends Schema.Schema.All>(
|
|
468
|
-
schema: S | string,
|
|
469
|
-
keys: ForeignKey[],
|
|
470
|
-
): Filter<Schema.Schema.Type<S>> {
|
|
471
|
-
const dxn = getTypeDXNFromSpecifier(schema);
|
|
472
|
-
return new FilterClass({
|
|
473
|
-
type: 'object',
|
|
474
|
-
typename: dxn.toString(),
|
|
475
|
-
props: {},
|
|
476
|
-
foreignKeys: keys,
|
|
477
|
-
});
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
static eq<T>(value: T): Filter<T> {
|
|
481
|
-
if (!Ref.isRef(value) && typeof value === 'object' && value !== null) {
|
|
482
|
-
throw new TypeError('Cannot use object as a value for eq filter');
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
return new FilterClass({
|
|
486
|
-
type: 'compare',
|
|
487
|
-
operator: 'eq',
|
|
488
|
-
value: Ref.isRef(value) ? value.noInline().encode() : value,
|
|
489
|
-
});
|
|
490
|
-
}
|
|
491
|
-
|
|
492
|
-
static neq<T>(value: T): Filter<T> {
|
|
493
|
-
return new FilterClass({
|
|
494
|
-
type: 'compare',
|
|
495
|
-
operator: 'neq',
|
|
496
|
-
value,
|
|
497
|
-
});
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
static gt<T>(value: T): Filter<T> {
|
|
501
|
-
return new FilterClass({
|
|
502
|
-
type: 'compare',
|
|
503
|
-
operator: 'gt',
|
|
504
|
-
value,
|
|
505
|
-
});
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
static gte<T>(value: T): Filter<T> {
|
|
509
|
-
return new FilterClass({
|
|
510
|
-
type: 'compare',
|
|
511
|
-
operator: 'gte',
|
|
512
|
-
value,
|
|
513
|
-
});
|
|
514
|
-
}
|
|
515
|
-
|
|
516
|
-
static lt<T>(value: T): Filter<T> {
|
|
517
|
-
return new FilterClass({
|
|
518
|
-
type: 'compare',
|
|
519
|
-
operator: 'lt',
|
|
520
|
-
value,
|
|
521
|
-
});
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
static lte<T>(value: T): Filter<T> {
|
|
525
|
-
return new FilterClass({
|
|
526
|
-
type: 'compare',
|
|
527
|
-
operator: 'lte',
|
|
528
|
-
value,
|
|
529
|
-
});
|
|
530
|
-
}
|
|
531
|
-
|
|
532
|
-
static in<T>(...values: T[]): Filter<T> {
|
|
533
|
-
return new FilterClass({
|
|
534
|
-
type: 'in',
|
|
535
|
-
values,
|
|
536
|
-
});
|
|
537
|
-
}
|
|
538
|
-
|
|
539
|
-
static contains<T>(value: T): Filter<T[]> {
|
|
540
|
-
return new FilterClass({
|
|
541
|
-
type: 'contains',
|
|
542
|
-
value,
|
|
543
|
-
});
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
static between<T>(from: T, to: T): Filter<T> {
|
|
547
|
-
return new FilterClass({
|
|
548
|
-
type: 'range',
|
|
549
|
-
from,
|
|
550
|
-
to,
|
|
551
|
-
});
|
|
552
|
-
}
|
|
553
|
-
|
|
554
|
-
static not<F extends Filter.Any>(filter: F): Filter<Filter.Type<F>> {
|
|
555
|
-
return new FilterClass({
|
|
556
|
-
type: 'not',
|
|
557
|
-
filter: filter.ast,
|
|
558
|
-
});
|
|
559
|
-
}
|
|
560
|
-
|
|
561
|
-
static and<T>(...filters: Filter<T>[]): Filter<T> {
|
|
562
|
-
return new FilterClass({
|
|
563
|
-
type: 'and',
|
|
564
|
-
filters: filters.map((f) => f.ast),
|
|
565
|
-
});
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
static or<T>(...filters: Filter<T>[]): Filter<T> {
|
|
569
|
-
return new FilterClass({
|
|
570
|
-
type: 'or',
|
|
571
|
-
filters: filters.map((f) => f.ast),
|
|
572
|
-
});
|
|
573
|
-
}
|
|
574
|
-
|
|
575
|
-
private constructor(public readonly ast: QueryAST.Filter) {}
|
|
576
|
-
|
|
577
|
-
'~Filter' = FilterClass.variance;
|
|
578
|
-
}
|
|
579
|
-
|
|
580
|
-
export const Filter: FilterAPI = FilterClass;
|
|
581
|
-
|
|
582
|
-
/**
|
|
583
|
-
* All property paths inside T that are references.
|
|
584
|
-
*/
|
|
585
|
-
// TODO(dmaretskyi): Filter only properties that are references (or optional references, or unions that include references).
|
|
586
|
-
type RefPropKey<T> = keyof T & string;
|
|
587
|
-
|
|
588
|
-
const propsFilterToAst = (predicates: Filter.Props<any>): Pick<QueryAST.FilterObject, 'id' | 'props'> => {
|
|
589
|
-
let idFilter: readonly ObjectId[] | undefined;
|
|
590
|
-
if ('id' in predicates) {
|
|
591
|
-
assertArgument(
|
|
592
|
-
typeof predicates.id === 'string' || Array.isArray(predicates.id),
|
|
593
|
-
'predicates.id',
|
|
594
|
-
'invalid id filter',
|
|
595
|
-
);
|
|
596
|
-
idFilter = typeof predicates.id === 'string' ? [predicates.id] : predicates.id;
|
|
597
|
-
Schema.Array(ObjectId).pipe(Schema.validateSync)(idFilter);
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
return {
|
|
601
|
-
id: idFilter,
|
|
602
|
-
props: Object.fromEntries(
|
|
603
|
-
Object.entries(predicates)
|
|
604
|
-
.filter(([prop, _value]) => prop !== 'id')
|
|
605
|
-
.map(([prop, predicate]) => [prop, processPredicate(predicate)]),
|
|
606
|
-
) as Record<string, QueryAST.Filter>,
|
|
607
|
-
};
|
|
608
|
-
};
|
|
609
|
-
|
|
610
|
-
const processPredicate = (predicate: any): QueryAST.Filter => {
|
|
611
|
-
return Match.value(predicate).pipe(
|
|
612
|
-
Match.withReturnType<QueryAST.Filter>(),
|
|
613
|
-
Match.when(Filter.is, (predicate) => predicate.ast),
|
|
614
|
-
// TODO(wittjosiah): Add support for array predicates.
|
|
615
|
-
Match.when(Array.isArray, (_predicate) => {
|
|
616
|
-
throw new Error('Array predicates are not yet supported.');
|
|
617
|
-
}),
|
|
618
|
-
Match.when(
|
|
619
|
-
(predicate: any) => !Ref.isRef(predicate) && typeof predicate === 'object' && predicate !== null,
|
|
620
|
-
(predicate) => {
|
|
621
|
-
const nestedProps = Object.fromEntries(
|
|
622
|
-
Object.entries(predicate).map(([key, value]) => [key, processPredicate(value)]),
|
|
623
|
-
);
|
|
624
|
-
|
|
625
|
-
return {
|
|
626
|
-
type: 'object',
|
|
627
|
-
typename: null,
|
|
628
|
-
props: nestedProps,
|
|
629
|
-
};
|
|
630
|
-
},
|
|
631
|
-
),
|
|
632
|
-
Match.orElse((value) => Filter.eq(value).ast),
|
|
633
|
-
);
|
|
634
|
-
};
|
|
635
|
-
|
|
168
|
+
// TODO(dmaretskyi): Separate object instead of statics for better devex with type errors.
|
|
636
169
|
class QueryClass implements Query<any> {
|
|
637
170
|
private static variance: Query<any>['~Query'] = {} as Query<any>['~Query'];
|
|
638
171
|
|
|
@@ -682,7 +215,7 @@ class QueryClass implements Query<any> {
|
|
|
682
215
|
|
|
683
216
|
'~Query' = QueryClass.variance;
|
|
684
217
|
|
|
685
|
-
select(filter: Filter
|
|
218
|
+
select(filter: Filter.Any | Filter.Props<any>): Query.Any {
|
|
686
219
|
if (Filter.is(filter)) {
|
|
687
220
|
return new QueryClass({
|
|
688
221
|
type: 'filter',
|
|
@@ -698,7 +231,7 @@ class QueryClass implements Query<any> {
|
|
|
698
231
|
}
|
|
699
232
|
}
|
|
700
233
|
|
|
701
|
-
reference(key: string): Query
|
|
234
|
+
reference(key: string): Query.Any {
|
|
702
235
|
return new QueryClass({
|
|
703
236
|
type: 'reference-traversal',
|
|
704
237
|
anchor: this.ast,
|
|
@@ -706,7 +239,7 @@ class QueryClass implements Query<any> {
|
|
|
706
239
|
});
|
|
707
240
|
}
|
|
708
241
|
|
|
709
|
-
referencedBy(target: Schema.Schema.All | string, key: string): Query
|
|
242
|
+
referencedBy(target: Schema.Schema.All | string, key: string): Query.Any {
|
|
710
243
|
const dxn = getTypeDXNFromSpecifier(target);
|
|
711
244
|
return new QueryClass({
|
|
712
245
|
type: 'incoming-references',
|
|
@@ -716,7 +249,7 @@ class QueryClass implements Query<any> {
|
|
|
716
249
|
});
|
|
717
250
|
}
|
|
718
251
|
|
|
719
|
-
sourceOf(relation: Schema.Schema.All | string, predicates?: Filter.Props<unknown> | undefined): Query
|
|
252
|
+
sourceOf(relation: Schema.Schema.All | string, predicates?: Filter.Props<unknown> | undefined): Query.Any {
|
|
720
253
|
return new QueryClass({
|
|
721
254
|
type: 'relation',
|
|
722
255
|
anchor: this.ast,
|
|
@@ -725,7 +258,7 @@ class QueryClass implements Query<any> {
|
|
|
725
258
|
});
|
|
726
259
|
}
|
|
727
260
|
|
|
728
|
-
targetOf(relation: Schema.Schema.All | string, predicates?: Filter.Props<unknown> | undefined): Query
|
|
261
|
+
targetOf(relation: Schema.Schema.All | string, predicates?: Filter.Props<unknown> | undefined): Query.Any {
|
|
729
262
|
return new QueryClass({
|
|
730
263
|
type: 'relation',
|
|
731
264
|
anchor: this.ast,
|
|
@@ -734,7 +267,7 @@ class QueryClass implements Query<any> {
|
|
|
734
267
|
});
|
|
735
268
|
}
|
|
736
269
|
|
|
737
|
-
source(): Query
|
|
270
|
+
source(): Query.Any {
|
|
738
271
|
return new QueryClass({
|
|
739
272
|
type: 'relation-traversal',
|
|
740
273
|
anchor: this.ast,
|
|
@@ -742,7 +275,7 @@ class QueryClass implements Query<any> {
|
|
|
742
275
|
});
|
|
743
276
|
}
|
|
744
277
|
|
|
745
|
-
target(): Query
|
|
278
|
+
target(): Query.Any {
|
|
746
279
|
return new QueryClass({
|
|
747
280
|
type: 'relation-traversal',
|
|
748
281
|
anchor: this.ast,
|
|
@@ -750,7 +283,7 @@ class QueryClass implements Query<any> {
|
|
|
750
283
|
});
|
|
751
284
|
}
|
|
752
285
|
|
|
753
|
-
orderBy(...order: Order<any>[]): Query
|
|
286
|
+
orderBy(...order: Order<any>[]): Query.Any {
|
|
754
287
|
return new QueryClass({
|
|
755
288
|
type: 'order',
|
|
756
289
|
query: this.ast,
|
|
@@ -758,7 +291,7 @@ class QueryClass implements Query<any> {
|
|
|
758
291
|
});
|
|
759
292
|
}
|
|
760
293
|
|
|
761
|
-
options(options: QueryAST.QueryOptions): Query
|
|
294
|
+
options(options: QueryAST.QueryOptions): Query.Any {
|
|
762
295
|
return new QueryClass({
|
|
763
296
|
type: 'options',
|
|
764
297
|
query: this.ast,
|
|
@@ -768,17 +301,3 @@ class QueryClass implements Query<any> {
|
|
|
768
301
|
}
|
|
769
302
|
|
|
770
303
|
export const Query: QueryAPI = QueryClass;
|
|
771
|
-
|
|
772
|
-
/**
|
|
773
|
-
* @param input schema or a typename string
|
|
774
|
-
* @return type DXN
|
|
775
|
-
*/
|
|
776
|
-
const getTypeDXNFromSpecifier = (input: Schema.Schema.All | string): DXN => {
|
|
777
|
-
if (Schema.isSchema(input)) {
|
|
778
|
-
return getTypeReference(input)?.toDXN() ?? raise(new TypeError('Schema has no DXN'));
|
|
779
|
-
} else {
|
|
780
|
-
assertArgument(typeof input === 'string', 'input');
|
|
781
|
-
assertArgument(!input.startsWith('dxn:'), 'input');
|
|
782
|
-
return DXN.fromTypename(input);
|
|
783
|
-
}
|
|
784
|
-
};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
|
|
7
|
+
import * as Type from '../Type';
|
|
8
|
+
|
|
9
|
+
// TODO(burdon): Rationalize with ../testing
|
|
10
|
+
|
|
11
|
+
export const Person = Schema.Struct({
|
|
12
|
+
name: Schema.String,
|
|
13
|
+
email: Schema.optional(Schema.String),
|
|
14
|
+
age: Schema.optional(Schema.Number),
|
|
15
|
+
fields: Schema.Struct({
|
|
16
|
+
label: Schema.String,
|
|
17
|
+
value: Schema.String,
|
|
18
|
+
}).pipe(Schema.Array, Schema.optional),
|
|
19
|
+
}).pipe(
|
|
20
|
+
Type.Obj({
|
|
21
|
+
typename: 'dxos.org/type/Person',
|
|
22
|
+
version: '0.1.0',
|
|
23
|
+
}),
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
export interface Person extends Schema.Schema.Type<typeof Person> {}
|
|
27
|
+
|
|
28
|
+
export const Organization = Schema.Struct({
|
|
29
|
+
name: Schema.String,
|
|
30
|
+
properties: Schema.optional(
|
|
31
|
+
Schema.Record({
|
|
32
|
+
key: Schema.String,
|
|
33
|
+
value: Schema.String,
|
|
34
|
+
}),
|
|
35
|
+
),
|
|
36
|
+
}).pipe(
|
|
37
|
+
Type.Obj({
|
|
38
|
+
typename: 'dxos.org/type/Organization',
|
|
39
|
+
version: '0.1.0',
|
|
40
|
+
}),
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
export interface Organization extends Schema.Schema.Type<typeof Organization> {}
|
|
44
|
+
|
|
45
|
+
export const WorksFor = Schema.Struct({
|
|
46
|
+
since: Schema.String,
|
|
47
|
+
}).pipe(
|
|
48
|
+
Type.Relation({
|
|
49
|
+
typename: 'dxos.org/type/WorksFor',
|
|
50
|
+
version: '0.1.0',
|
|
51
|
+
source: Person,
|
|
52
|
+
target: Organization,
|
|
53
|
+
}),
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
export interface WorksFor extends Schema.Schema.Type<typeof WorksFor> {}
|
|
57
|
+
|
|
58
|
+
export const Task = Schema.Struct({
|
|
59
|
+
title: Schema.String,
|
|
60
|
+
createdAt: Schema.String,
|
|
61
|
+
assignee: Schema.optional(Type.Ref(Person)),
|
|
62
|
+
}).pipe(Type.Obj({ typename: 'dxos.org/type/Task', version: '0.1.0' }));
|
|
63
|
+
|
|
64
|
+
export interface Task extends Schema.Schema.Type<typeof Task> {}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
|
+
|
|
7
|
+
import { raise } from '@dxos/debug';
|
|
8
|
+
import { assertArgument } from '@dxos/invariant';
|
|
9
|
+
import { DXN } from '@dxos/keys';
|
|
10
|
+
|
|
11
|
+
import { getTypeReference } from '../internal';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @param input schema or a typename string
|
|
15
|
+
* @return type DXN
|
|
16
|
+
*/
|
|
17
|
+
export const getTypeDXNFromSpecifier = (input: Schema.Schema.All | string): DXN => {
|
|
18
|
+
if (Schema.isSchema(input)) {
|
|
19
|
+
return getTypeReference(input)?.toDXN() ?? raise(new TypeError('Schema has no DXN'));
|
|
20
|
+
} else {
|
|
21
|
+
assertArgument(typeof input === 'string', 'input');
|
|
22
|
+
assertArgument(!input.startsWith('dxn:'), 'input');
|
|
23
|
+
return DXN.fromTypename(input);
|
|
24
|
+
}
|
|
25
|
+
};
|