Skip to content

Commit 77eafd2

Browse files
Pass if type implements reachable interface (#319)
Co-authored-by: Kamil Kisiela <[email protected]>
1 parent 5d97b39 commit 77eafd2

File tree

3 files changed

+96
-3
lines changed

3 files changed

+96
-3
lines changed

.changeset/spotty-lies-hang.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@graphql-eslint/eslint-plugin': patch
3+
---
4+
5+
no-unreachable-types pass if type implements reachable interface

packages/plugin/src/rules/no-unreachable-types.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,17 @@ const rule: GraphQLESLintRule = {
4848
create(context) {
4949
function ensureReachability(node) {
5050
const typeName = node.name.value;
51+
const implemented = node.interfaces?.map(instance => instance.name.value) || [];
5152
const reachableTypes = requireReachableTypesFromContext('no-unreachable-types', context);
5253

53-
if (!reachableTypes.has(typeName)) {
54+
if (!reachableTypes.has(typeName) && implemented.filter(name => reachableTypes.has(name)).length === 0) {
5455
context.report({
5556
node,
5657
messageId: UNREACHABLE_TYPE,
5758
data: {
5859
typeName,
5960
},
60-
fix: fixer => fixer.removeRange(node.range)
61+
fix: fixer => fixer.removeRange(node.range),
6162
});
6263
}
6364
}

packages/plugin/tests/no-unreachable-types.spec.ts

Lines changed: 88 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ ruleTester.runGraphQLTests('no-unreachable-types', rule, {
3030
name: String
3131
}
3232
`),
33-
3433
useSchema(/* GraphQL */ `
3534
type Query {
3635
me: User
@@ -44,6 +43,39 @@ ruleTester.runGraphQLTests('no-unreachable-types', rule, {
4443
city: String
4544
}
4645
`),
46+
useSchema(/* GraphQL */ `
47+
type Query {
48+
me: User!
49+
}
50+
51+
interface User {
52+
name: String
53+
}
54+
55+
type SuperUser implements User {
56+
address: String
57+
}
58+
`),
59+
useSchema(/* GraphQL */ `
60+
type Query {
61+
node(id: ID!): Node!
62+
}
63+
64+
interface Node {
65+
id: ID!
66+
}
67+
68+
interface User implements Node {
69+
id: ID!
70+
name: String
71+
}
72+
73+
type SuperUser implements User & Node {
74+
id: ID!
75+
name: String
76+
address: String
77+
}
78+
`),
4779
],
4880
invalid: [
4981
{
@@ -186,5 +218,60 @@ ruleTester.runGraphQLTests('no-unreachable-types', rule, {
186218
},
187219
],
188220
},
221+
{
222+
...useSchema(/* GraphQL */ `
223+
# normalize graphql
224+
225+
type Query {
226+
node(id: ID!): User
227+
}
228+
229+
interface User implements Node {
230+
id: ID!
231+
name: String
232+
}
233+
234+
interface Node {
235+
id: ID!
236+
}
237+
238+
interface Missing {
239+
mid: ID!
240+
}
241+
242+
type SuperUser implements User & Node {
243+
id: ID!
244+
name: String
245+
isSuper: Boolean!
246+
}
247+
`),
248+
output: /* GraphQL */ `
249+
# normalize graphql
250+
251+
type Query {
252+
node(id: ID!): User
253+
}
254+
255+
interface User implements Node {
256+
id: ID!
257+
name: String
258+
}
259+
260+
interface Node {
261+
id: ID!
262+
}
263+
264+
type SuperUser implements User & Node {
265+
id: ID!
266+
name: String
267+
isSuper: Boolean!
268+
}
269+
`,
270+
errors: [
271+
{
272+
message: `Type "Missing" is unreachable`,
273+
},
274+
],
275+
},
189276
],
190277
});

0 commit comments

Comments
 (0)