Skip to content

Commit

Permalink
fix graphql#1277 ensure interface has at least 1 concrete type
Browse files Browse the repository at this point in the history
  • Loading branch information
mattkrick committed Mar 8, 2018
1 parent fb27b92 commit 47443ad
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 0 deletions.
3 changes: 3 additions & 0 deletions src/type/schema.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
*/

import {
isAbstractType,
isObjectType,
isInterfaceType,
isUnionType,
Expand Down Expand Up @@ -159,6 +160,8 @@ export class GraphQLSchema {
this._implementations[iface.name] = [type];
}
});
} else if (isAbstractType(type) && !this._implementations[type.name]) {
this._implementations[type.name] = [];
}
});
}
Expand Down
18 changes: 18 additions & 0 deletions src/type/validate.js
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,9 @@ function validateTypes(context: SchemaValidationContext): void {
} else if (isInterfaceType(type)) {
// Ensure fields are valid.
validateFields(context, type);

// Ensure Interfaces include at least 1 concrete type.
validateInterfaces(context, type);
} else if (isUnionType(type)) {
// Ensure Unions include valid member types.
validateUnionMembers(context, type);
Expand Down Expand Up @@ -355,6 +358,21 @@ function validateObjectInterfaces(
});
}

function validateInterfaces(
context: SchemaValidationContext,
iface: GraphQLInterfaceType,
): void {
const possibleTypes = context.schema.getPossibleTypes(iface);

if (possibleTypes.length === 0) {
context.reportError(
`No concrete types found for Interface type ${iface.name}. ` +
`If only referenced via abstraction, add concrete types to schema.types array`,
iface.astNode,
);
}
}

function validateObjectImplementsInterface(
context: SchemaValidationContext,
object: GraphQLObjectType,
Expand Down

0 comments on commit 47443ad

Please sign in to comment.