Skip to content

Commit 47443ad

Browse files
committed
fix graphql#1277 ensure interface has at least 1 concrete type
1 parent fb27b92 commit 47443ad

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

src/type/schema.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
*/
99

1010
import {
11+
isAbstractType,
1112
isObjectType,
1213
isInterfaceType,
1314
isUnionType,
@@ -159,6 +160,8 @@ export class GraphQLSchema {
159160
this._implementations[iface.name] = [type];
160161
}
161162
});
163+
} else if (isAbstractType(type) && !this._implementations[type.name]) {
164+
this._implementations[type.name] = [];
162165
}
163166
});
164167
}

src/type/validate.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,9 @@ function validateTypes(context: SchemaValidationContext): void {
257257
} else if (isInterfaceType(type)) {
258258
// Ensure fields are valid.
259259
validateFields(context, type);
260+
261+
// Ensure Interfaces include at least 1 concrete type.
262+
validateInterfaces(context, type);
260263
} else if (isUnionType(type)) {
261264
// Ensure Unions include valid member types.
262265
validateUnionMembers(context, type);
@@ -355,6 +358,21 @@ function validateObjectInterfaces(
355358
});
356359
}
357360

361+
function validateInterfaces(
362+
context: SchemaValidationContext,
363+
iface: GraphQLInterfaceType,
364+
): void {
365+
const possibleTypes = context.schema.getPossibleTypes(iface);
366+
367+
if (possibleTypes.length === 0) {
368+
context.reportError(
369+
`No concrete types found for Interface type ${iface.name}. ` +
370+
`If only referenced via abstraction, add concrete types to schema.types array`,
371+
iface.astNode,
372+
);
373+
}
374+
}
375+
358376
function validateObjectImplementsInterface(
359377
context: SchemaValidationContext,
360378
object: GraphQLObjectType,

0 commit comments

Comments
 (0)