File tree Expand file tree Collapse file tree 2 files changed +21
-0
lines changed Expand file tree Collapse file tree 2 files changed +21
-0
lines changed Original file line number Diff line number Diff line change 8
8
*/
9
9
10
10
import {
11
+ isAbstractType ,
11
12
isObjectType ,
12
13
isInterfaceType ,
13
14
isUnionType ,
@@ -159,6 +160,8 @@ export class GraphQLSchema {
159
160
this . _implementations [ iface . name ] = [ type ] ;
160
161
}
161
162
} ) ;
163
+ } else if ( isAbstractType ( type ) && ! this . _implementations [ type . name ] ) {
164
+ this . _implementations [ type . name ] = [ ] ;
162
165
}
163
166
} ) ;
164
167
}
Original file line number Diff line number Diff line change @@ -257,6 +257,9 @@ function validateTypes(context: SchemaValidationContext): void {
257
257
} else if ( isInterfaceType ( type ) ) {
258
258
// Ensure fields are valid.
259
259
validateFields ( context , type ) ;
260
+
261
+ // Ensure Interfaces include at least 1 concrete type.
262
+ validateInterfaces ( context , type ) ;
260
263
} else if ( isUnionType ( type ) ) {
261
264
// Ensure Unions include valid member types.
262
265
validateUnionMembers ( context , type ) ;
@@ -355,6 +358,21 @@ function validateObjectInterfaces(
355
358
} ) ;
356
359
}
357
360
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
+
358
376
function validateObjectImplementsInterface (
359
377
context : SchemaValidationContext ,
360
378
object : GraphQLObjectType ,
You can’t perform that action at this time.
0 commit comments