@graphprotocol/hypergraph 0.12.0 → 0.13.0

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.
Files changed (22) hide show
  1. package/dist/entity/find-many-public.d.ts.map +1 -1
  2. package/dist/entity/find-many-public.js +33 -4
  3. package/dist/entity/find-many-public.js.map +1 -1
  4. package/dist/entity/types.d.ts +8 -0
  5. package/dist/entity/types.d.ts.map +1 -1
  6. package/dist/typesync-studio/dist/assets/{authenticate-callback-DffCNmxZ.js → authenticate-callback-ClHGCEBM.js} +1 -1
  7. package/dist/typesync-studio/dist/assets/{authenticate-callback-DffCNmxZ.js.map → authenticate-callback-ClHGCEBM.js.map} +1 -1
  8. package/dist/typesync-studio/dist/assets/{ccip-BJ7g8YE6.js → ccip-CVB5IdFh.js} +1 -1
  9. package/dist/typesync-studio/dist/assets/{ccip-BJ7g8YE6.js.map → ccip-CVB5IdFh.js.map} +1 -1
  10. package/dist/typesync-studio/dist/assets/{index-CHTDYpLG.js → index-CZGD3lPb.js} +1 -1
  11. package/dist/typesync-studio/dist/assets/{index-CHTDYpLG.js.map → index-CZGD3lPb.js.map} +1 -1
  12. package/dist/typesync-studio/dist/assets/{index-B5RxXGeM.js → index-Dmh0I_CD.js} +102 -102
  13. package/dist/typesync-studio/dist/assets/{index-B5RxXGeM.js.map → index-Dmh0I_CD.js.map} +1 -1
  14. package/dist/typesync-studio/dist/index.html +1 -1
  15. package/dist/utils/translate-filter-to-graphql.d.ts +22 -5
  16. package/dist/utils/translate-filter-to-graphql.d.ts.map +1 -1
  17. package/dist/utils/translate-filter-to-graphql.js +77 -11
  18. package/dist/utils/translate-filter-to-graphql.js.map +1 -1
  19. package/package.json +2 -2
  20. package/src/entity/find-many-public.ts +46 -9
  21. package/src/entity/types.ts +11 -0
  22. package/src/utils/translate-filter-to-graphql.ts +85 -14
@@ -21,7 +21,7 @@
21
21
  <title>Graph Protocol | Hypergraph TypeSync</title>
22
22
  <link rel="preconnect" href="https://fonts.googleapis.com" />
23
23
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
24
- <script type="module" crossorigin src="/assets/index-B5RxXGeM.js"></script>
24
+ <script type="module" crossorigin src="/assets/index-Dmh0I_CD.js"></script>
25
25
  <link rel="stylesheet" crossorigin href="/assets/index-BY93eSrW.css">
26
26
  </head>
27
27
  <body class="h-full w-full">
@@ -1,5 +1,22 @@
1
1
  import { type Entity } from '@graphprotocol/hypergraph';
2
2
  import type * as Schema from 'effect/Schema';
3
+ type EntityIdGraphqlFilter = {
4
+ is: string;
5
+ } | {
6
+ in: readonly string[];
7
+ };
8
+ type RelationSomeFilter = {
9
+ typeId: {
10
+ is: string;
11
+ };
12
+ toEntityId?: EntityIdGraphqlFilter;
13
+ };
14
+ type BacklinkSomeFilter = {
15
+ typeId: {
16
+ is: string;
17
+ };
18
+ fromEntityId?: EntityIdGraphqlFilter;
19
+ };
3
20
  type GraphqlFilterEntry = {
4
21
  values: {
5
22
  some: {
@@ -43,11 +60,11 @@ type GraphqlFilterEntry = {
43
60
  and: GraphqlFilterEntry[];
44
61
  } | {
45
62
  relations: {
46
- some: {
47
- typeId: {
48
- is: string;
49
- };
50
- };
63
+ some: RelationSomeFilter;
64
+ };
65
+ } | {
66
+ backlinks: {
67
+ some: BacklinkSomeFilter;
51
68
  };
52
69
  } | {
53
70
  id: {
@@ -1 +1 @@
1
- {"version":3,"file":"translate-filter-to-graphql.d.ts","sourceRoot":"","sources":["../../src/utils/translate-filter-to-graphql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAEnE,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAC;AAG7C,KAAK,kBAAkB,GACnB;IACE,MAAM,EAAE;QACN,IAAI,EACA;YACE,UAAU,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAA;aAAE,CAAC;YAC3B,IAAI,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAA;aAAE,GAAG;gBAAE,UAAU,EAAE,MAAM,CAAA;aAAE,GAAG;gBAAE,QAAQ,EAAE,MAAM,CAAA;aAAE,GAAG;gBAAE,QAAQ,EAAE,MAAM,CAAA;aAAE,CAAC;SAC7F,GACD;YACE,UAAU,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAA;aAAE,CAAC;YAC3B,OAAO,EAAE;gBAAE,EAAE,EAAE,OAAO,CAAA;aAAE,CAAC;SAC1B,GACD;YACE,UAAU,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAA;aAAE,CAAC;YAC3B,KAAK,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAA;aAAE,GAAG;gBAAE,WAAW,EAAE,MAAM,CAAA;aAAE,GAAG;gBAAE,QAAQ,EAAE,MAAM,CAAA;aAAE,CAAC;SACxE,CAAC;KACP,CAAC;CACH,GACD;IACE,GAAG,EAAE,kBAAkB,CAAC;CACzB,GACD;IACE,EAAE,EAAE,kBAAkB,EAAE,CAAC;CAC1B,GACD;IACE,GAAG,EAAE,kBAAkB,EAAE,CAAC;CAC3B,GACD;IACE,SAAS,EAAE;QACT,IAAI,EAAE;YACJ,MAAM,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAA;aAAE,CAAC;SACxB,CAAC;KACH,CAAC;CACH,GACD;IACE,EAAE,EAAE;QACF,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;CACH,GACD;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;CAAE,CAAC;AAE3B;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,YAAY,EAC3E,MAAM,EAAE;KAAG,CAAC,IAAI,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG,SAAS,EAC/G,IAAI,EAAE,CAAC,GACN,kBAAkB,CA8HpB"}
1
+ {"version":3,"file":"translate-filter-to-graphql.d.ts","sourceRoot":"","sources":["../../src/utils/translate-filter-to-graphql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAEnE,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAC;AAG7C,KAAK,qBAAqB,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAExE,KAAK,kBAAkB,GAAG;IACxB,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACvB,UAAU,CAAC,EAAE,qBAAqB,CAAC;CACpC,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACvB,YAAY,CAAC,EAAE,qBAAqB,CAAC;CACtC,CAAC;AAEF,KAAK,kBAAkB,GACnB;IACE,MAAM,EAAE;QACN,IAAI,EACA;YACE,UAAU,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAA;aAAE,CAAC;YAC3B,IAAI,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAA;aAAE,GAAG;gBAAE,UAAU,EAAE,MAAM,CAAA;aAAE,GAAG;gBAAE,QAAQ,EAAE,MAAM,CAAA;aAAE,GAAG;gBAAE,QAAQ,EAAE,MAAM,CAAA;aAAE,CAAC;SAC7F,GACD;YACE,UAAU,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAA;aAAE,CAAC;YAC3B,OAAO,EAAE;gBAAE,EAAE,EAAE,OAAO,CAAA;aAAE,CAAC;SAC1B,GACD;YACE,UAAU,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAA;aAAE,CAAC;YAC3B,KAAK,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAA;aAAE,GAAG;gBAAE,WAAW,EAAE,MAAM,CAAA;aAAE,GAAG;gBAAE,QAAQ,EAAE,MAAM,CAAA;aAAE,CAAC;SACxE,CAAC;KACP,CAAC;CACH,GACD;IACE,GAAG,EAAE,kBAAkB,CAAC;CACzB,GACD;IACE,EAAE,EAAE,kBAAkB,EAAE,CAAC;CAC1B,GACD;IACE,GAAG,EAAE,kBAAkB,EAAE,CAAC;CAC3B,GACD;IACE,SAAS,EAAE;QACT,IAAI,EAAE,kBAAkB,CAAC;KAC1B,CAAC;CACH,GACD;IACE,SAAS,EAAE;QACT,IAAI,EAAE,kBAAkB,CAAC;KAC1B,CAAC;CACH,GACD;IACE,EAAE,EAAE;QACF,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;CACH,GACD;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;CAAE,CAAC;AAE3B;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,YAAY,EAC3E,MAAM,EAAE;KAAG,CAAC,IAAI,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG,SAAS,EAC/G,IAAI,EAAE,CAAC,GACN,kBAAkB,CAsLpB"}
@@ -10,15 +10,6 @@ export function translateFilterToGraphql(filter, type) {
10
10
  return {};
11
11
  }
12
12
  const graphqlFilter = [];
13
- const buildRelationExistsFilter = propertyId => ({
14
- relations: {
15
- some: {
16
- typeId: {
17
- is: propertyId
18
- }
19
- }
20
- }
21
- });
22
13
  for (const [fieldName, fieldFilter] of Object.entries(filter)) {
23
14
  if (fieldName === 'or') {
24
15
  graphqlFilter.push({
@@ -53,17 +44,92 @@ export function translateFilterToGraphql(filter, type) {
53
44
  if (!Option.isSome(propertyId) || !Option.isSome(propertyType)) continue;
54
45
  if (propertyType.value === 'relation') {
55
46
  const relationFilter = fieldFilter;
47
+ const isBacklink = SchemaAST.getAnnotation(Constants.RelationBacklinkSymbol)(propertySignature.type).pipe(Option.getOrElse(() => false));
48
+ // Normalize entityId shorthand: string → { is: string }
49
+ const entityIdFilter = typeof relationFilter.entityId === 'string' ? {
50
+ is: relationFilter.entityId
51
+ } : relationFilter.entityId;
52
+ if (entityIdFilter) {
53
+ const entityIdValue = typeof entityIdFilter.is === 'string' && entityIdFilter.is ? {
54
+ is: entityIdFilter.is
55
+ } : Array.isArray(entityIdFilter.in) && entityIdFilter.in.length > 0 ? {
56
+ in: entityIdFilter.in
57
+ } : undefined;
58
+ if (entityIdValue === undefined) {
59
+ continue;
60
+ }
61
+ if (isBacklink) {
62
+ graphqlFilter.push({
63
+ backlinks: {
64
+ some: {
65
+ typeId: {
66
+ is: propertyId.value
67
+ },
68
+ fromEntityId: entityIdValue
69
+ }
70
+ }
71
+ });
72
+ } else {
73
+ graphqlFilter.push({
74
+ relations: {
75
+ some: {
76
+ typeId: {
77
+ is: propertyId.value
78
+ },
79
+ toEntityId: entityIdValue
80
+ }
81
+ }
82
+ });
83
+ }
84
+ }
56
85
  if (relationFilter.exists === true) {
57
- graphqlFilter.push(buildRelationExistsFilter(propertyId.value));
86
+ if (isBacklink) {
87
+ graphqlFilter.push({
88
+ backlinks: {
89
+ some: {
90
+ typeId: {
91
+ is: propertyId.value
92
+ }
93
+ }
94
+ }
95
+ });
96
+ } else {
97
+ graphqlFilter.push({
98
+ relations: {
99
+ some: {
100
+ typeId: {
101
+ is: propertyId.value
102
+ }
103
+ }
104
+ }
105
+ });
106
+ }
58
107
  continue;
59
108
  }
60
109
  if (relationFilter.exists === false) {
61
- const existsFilter = buildRelationExistsFilter(propertyId.value);
110
+ const existsFilter = isBacklink ? {
111
+ backlinks: {
112
+ some: {
113
+ typeId: {
114
+ is: propertyId.value
115
+ }
116
+ }
117
+ }
118
+ } : {
119
+ relations: {
120
+ some: {
121
+ typeId: {
122
+ is: propertyId.value
123
+ }
124
+ }
125
+ }
126
+ };
62
127
  graphqlFilter.push({
63
128
  not: existsFilter
64
129
  });
65
130
  continue;
66
131
  }
132
+ continue;
67
133
  }
68
134
  if (propertyType.value === 'string' && (fieldFilter.is || fieldFilter.startsWith || fieldFilter.endsWith || fieldFilter.contains)) {
69
135
  graphqlFilter.push({
@@ -1 +1 @@
1
- {"version":3,"file":"translate-filter-to-graphql.js","names":["Constants","Option","SchemaAST","translateFilterToGraphql","filter","type","graphqlFilter","buildRelationExistsFilter","propertyId","relations","some","typeId","is","fieldName","fieldFilter","Object","entries","push","or","map","not","idFilter","id","ast","propertySignature","propertySignatures","find","a","name","getAnnotation","PropertyIdSymbol","propertyType","PropertyTypeSymbol","isSome","value","relationFilter","exists","existsFilter","startsWith","endsWith","contains","values","text","includes","boolean","greaterThan","lessThan","float","length","and"],"sources":["../../src/utils/translate-filter-to-graphql.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"translate-filter-to-graphql.js","names":["Constants","Option","SchemaAST","translateFilterToGraphql","filter","type","graphqlFilter","fieldName","fieldFilter","Object","entries","push","or","map","not","idFilter","is","id","ast","propertySignature","propertySignatures","find","a","name","propertyId","getAnnotation","PropertyIdSymbol","propertyType","PropertyTypeSymbol","isSome","value","relationFilter","isBacklink","RelationBacklinkSymbol","pipe","getOrElse","entityIdFilter","entityId","entityIdValue","Array","isArray","in","length","undefined","backlinks","some","typeId","fromEntityId","relations","toEntityId","exists","existsFilter","startsWith","endsWith","contains","values","text","includes","boolean","greaterThan","lessThan","float","and"],"sources":["../../src/utils/translate-filter-to-graphql.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@graphprotocol/hypergraph",
3
- "version": "0.12.0",
3
+ "version": "0.13.0",
4
4
  "description": "SDK for building performant, type-safe, local-first dapps on top of The Graph ecosystem knowledge graphs.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -41,7 +41,7 @@
41
41
  "@effect/platform-node": "^0.96.1",
42
42
  "@effect/printer": "^0.45.0",
43
43
  "@effect/printer-ansi": "^0.45.0",
44
- "@geoprotocol/geo-sdk": "^0.2.0",
44
+ "@geoprotocol/geo-sdk": "^0.3.0",
45
45
  "@noble/ciphers": "^1.3.0",
46
46
  "@noble/curves": "^1.9.7",
47
47
  "@noble/hashes": "^1.8.0",
@@ -58,13 +58,6 @@ const buildEntitiesQuery = (
58
58
  .filter(Boolean)
59
59
  .join(', ');
60
60
 
61
- const orderByArgs = useOrderBy ? 'propertyId: $propertyId\n sortDirection: $sortDirection\n ' : '';
62
- const entitySpaceFilter =
63
- spaceSelection.mode === 'single'
64
- ? 'spaceIds: {in: [$spaceId]},'
65
- : spaceSelection.mode === 'many'
66
- ? 'spaceIds: {in: $spaceIds},'
67
- : '';
68
61
  const valuesListFilter =
69
62
  spaceSelection.mode === 'single'
70
63
  ? '(filter: { spaceId: { is: $spaceId } })'
@@ -72,11 +65,22 @@ const buildEntitiesQuery = (
72
65
  ? '(filter: { spaceId: { in: $spaceIds } })'
73
66
  : '';
74
67
 
75
- return `
68
+ // entitiesOrderedByProperty doesn't support the native typeIds filter yet,
69
+ // so we fall back to the relation-based filter for orderBy queries
70
+ if (useOrderBy) {
71
+ const orderByArgs = 'propertyId: $propertyId\n sortDirection: $sortDirection\n ';
72
+ const entitySpaceFilter =
73
+ spaceSelection.mode === 'single'
74
+ ? 'spaceIds: {in: [$spaceId]},'
75
+ : spaceSelection.mode === 'many'
76
+ ? 'spaceIds: {in: $spaceIds},'
77
+ : '';
78
+
79
+ return `
76
80
  query ${queryName}(${variableDefinitions}) {
77
81
  entities: ${queryName}(
78
82
  ${orderByArgs}filter: { and: [{
79
- relations: {some: {typeId: {is: "8f151ba4de204e3c9cb499ddf96f48f1"}, toEntityId: {in: $typeIds}}},
83
+ relations: {some: {typeId: {is: "8f151ba4de204e3c9cb499ddf96f48f1"}, toEntityId: {in: $typeIds}}},
80
84
  ${entitySpaceFilter}
81
85
  }, $filter]}
82
86
  first: $first
@@ -95,6 +99,39 @@ query ${queryName}(${variableDefinitions}) {
95
99
  }
96
100
  ${level1Relations}
97
101
  }
102
+ }`;
103
+ }
104
+
105
+ // For the regular entities query, use the native spaceId/spaceIds and typeIds filters
106
+ const spaceArg =
107
+ spaceSelection.mode === 'single'
108
+ ? 'spaceId: $spaceId'
109
+ : spaceSelection.mode === 'many'
110
+ ? 'spaceIds: {in: $spaceIds}'
111
+ : '';
112
+
113
+ return `
114
+ query ${queryName}(${variableDefinitions}) {
115
+ entities: ${queryName}(
116
+ ${spaceArg}
117
+ typeIds: {in: $typeIds}
118
+ filter: $filter
119
+ first: $first
120
+ offset: $offset
121
+ ) {
122
+ id
123
+ name${spaceIdsSelection}
124
+ valuesList${valuesListFilter} {
125
+ propertyId
126
+ text
127
+ boolean
128
+ float
129
+ datetime
130
+ point
131
+ schedule
132
+ }
133
+ ${level1Relations}
134
+ }
98
135
  }`;
99
136
  };
100
137
 
@@ -74,6 +74,16 @@ export type EntityIdFilter = {
74
74
  is?: string;
75
75
  };
76
76
 
77
+ export type RelationEntityIdFilter =
78
+ | {
79
+ is: string;
80
+ in?: never;
81
+ }
82
+ | {
83
+ in: readonly string[];
84
+ is?: never;
85
+ };
86
+
77
87
  export type CrossFieldFilter<T, Extra extends object = Record<never, never>> = {
78
88
  [K in keyof T]?: EntityFieldFilter<T[K]>;
79
89
  } & Extra & {
@@ -84,6 +94,7 @@ export type CrossFieldFilter<T, Extra extends object = Record<never, never>> = {
84
94
  type RelationExistsFilter<T> = [T] extends [readonly unknown[] | undefined]
85
95
  ? {
86
96
  exists?: boolean;
97
+ entityId?: string | RelationEntityIdFilter;
87
98
  }
88
99
  : Record<never, never>;
89
100
 
@@ -3,6 +3,18 @@ import * as Option from 'effect/Option';
3
3
  import type * as Schema from 'effect/Schema';
4
4
  import * as SchemaAST from 'effect/SchemaAST';
5
5
 
6
+ type EntityIdGraphqlFilter = { is: string } | { in: readonly string[] };
7
+
8
+ type RelationSomeFilter = {
9
+ typeId: { is: string };
10
+ toEntityId?: EntityIdGraphqlFilter;
11
+ };
12
+
13
+ type BacklinkSomeFilter = {
14
+ typeId: { is: string };
15
+ fromEntityId?: EntityIdGraphqlFilter;
16
+ };
17
+
6
18
  type GraphqlFilterEntry =
7
19
  | {
8
20
  values: {
@@ -32,9 +44,12 @@ type GraphqlFilterEntry =
32
44
  }
33
45
  | {
34
46
  relations: {
35
- some: {
36
- typeId: { is: string };
37
- };
47
+ some: RelationSomeFilter;
48
+ };
49
+ }
50
+ | {
51
+ backlinks: {
52
+ some: BacklinkSomeFilter;
38
53
  };
39
54
  }
40
55
  | {
@@ -58,14 +73,6 @@ export function translateFilterToGraphql<S extends Schema.Schema.AnyNoContext>(
58
73
 
59
74
  const graphqlFilter: GraphqlFilterEntry[] = [];
60
75
 
61
- const buildRelationExistsFilter = (propertyId: string): GraphqlFilterEntry => ({
62
- relations: {
63
- some: {
64
- typeId: { is: propertyId },
65
- },
66
- },
67
- });
68
-
69
76
  for (const [fieldName, fieldFilter] of Object.entries(filter)) {
70
77
  if (fieldName === 'or') {
71
78
  graphqlFilter.push({
@@ -107,20 +114,84 @@ export function translateFilterToGraphql<S extends Schema.Schema.AnyNoContext>(
107
114
  if (!Option.isSome(propertyId) || !Option.isSome(propertyType)) continue;
108
115
 
109
116
  if (propertyType.value === 'relation') {
110
- const relationFilter = fieldFilter as { exists?: boolean };
117
+ const relationFilter = fieldFilter as {
118
+ exists?: boolean;
119
+ entityId?: string | { is?: string; in?: readonly string[] };
120
+ };
121
+
122
+ const isBacklink = SchemaAST.getAnnotation<boolean>(Constants.RelationBacklinkSymbol)(
123
+ propertySignature.type,
124
+ ).pipe(Option.getOrElse(() => false));
125
+
126
+ // Normalize entityId shorthand: string → { is: string }
127
+ const entityIdFilter =
128
+ typeof relationFilter.entityId === 'string' ? { is: relationFilter.entityId } : relationFilter.entityId;
129
+
130
+ if (entityIdFilter) {
131
+ const entityIdValue: EntityIdGraphqlFilter | undefined =
132
+ typeof entityIdFilter.is === 'string' && entityIdFilter.is
133
+ ? { is: entityIdFilter.is }
134
+ : Array.isArray(entityIdFilter.in) && entityIdFilter.in.length > 0
135
+ ? { in: entityIdFilter.in }
136
+ : undefined;
137
+
138
+ if (entityIdValue === undefined) {
139
+ continue;
140
+ }
141
+
142
+ if (isBacklink) {
143
+ graphqlFilter.push({
144
+ backlinks: {
145
+ some: {
146
+ typeId: { is: propertyId.value },
147
+ fromEntityId: entityIdValue,
148
+ },
149
+ },
150
+ });
151
+ } else {
152
+ graphqlFilter.push({
153
+ relations: {
154
+ some: {
155
+ typeId: { is: propertyId.value },
156
+ toEntityId: entityIdValue,
157
+ },
158
+ },
159
+ });
160
+ }
161
+ }
111
162
 
112
163
  if (relationFilter.exists === true) {
113
- graphqlFilter.push(buildRelationExistsFilter(propertyId.value));
164
+ if (isBacklink) {
165
+ graphqlFilter.push({
166
+ backlinks: {
167
+ some: {
168
+ typeId: { is: propertyId.value },
169
+ },
170
+ },
171
+ });
172
+ } else {
173
+ graphqlFilter.push({
174
+ relations: {
175
+ some: {
176
+ typeId: { is: propertyId.value },
177
+ },
178
+ },
179
+ });
180
+ }
114
181
  continue;
115
182
  }
116
183
 
117
184
  if (relationFilter.exists === false) {
118
- const existsFilter = buildRelationExistsFilter(propertyId.value);
185
+ const existsFilter: GraphqlFilterEntry = isBacklink
186
+ ? { backlinks: { some: { typeId: { is: propertyId.value } } } }
187
+ : { relations: { some: { typeId: { is: propertyId.value } } } };
119
188
  graphqlFilter.push({
120
189
  not: existsFilter,
121
190
  });
122
191
  continue;
123
192
  }
193
+
194
+ continue;
124
195
  }
125
196
 
126
197
  if (