@@ -185,7 +185,7 @@ export function extendSchema(
185
185
const typeName = typeRef . name . value ;
186
186
const existingType = schema . getType ( typeName ) ;
187
187
if ( existingType ) {
188
- return getExtendedType ( existingType ) ;
188
+ return extendNamedType ( existingType ) ;
189
189
}
190
190
191
191
throw new GraphQLError (
@@ -200,9 +200,9 @@ export function extendSchema(
200
200
201
201
// Get the extended root operation types.
202
202
const operationTypes = {
203
- query : getExtendedMaybeType ( schema . getQueryType ( ) ) ,
204
- mutation : getExtendedMaybeType ( schema . getMutationType ( ) ) ,
205
- subscription : getExtendedMaybeType ( schema . getSubscriptionType ( ) ) ,
203
+ query : extendMaybeNamedType ( schema . getQueryType ( ) ) ,
204
+ mutation : extendMaybeNamedType ( schema . getMutationType ( ) ) ,
205
+ subscription : extendMaybeNamedType ( schema . getSubscriptionType ( ) ) ,
206
206
} ;
207
207
208
208
// Then, incorporate all schema extensions.
@@ -231,7 +231,7 @@ export function extendSchema(
231
231
const types = [
232
232
// Iterate through all types, getting the type definition for each, ensuring
233
233
// that any type not directly referenced by a field will get created.
234
- ...objectValues ( schema . getTypeMap ( ) ) . map ( type => getExtendedType ( type ) ) ,
234
+ ...objectValues ( schema . getTypeMap ( ) ) . map ( type => extendNamedType ( type ) ) ,
235
235
// Do the same with new types.
236
236
...astBuilder . buildTypes ( objectValues ( typeDefinitionMap ) ) ,
237
237
] ;
@@ -268,34 +268,29 @@ export function extendSchema(
268
268
) ;
269
269
}
270
270
271
- function getExtendedMaybeType < T : GraphQLNamedType > (type: ?T): ?T {
272
- return type ? getExtendedType ( type ) : null ;
271
+ function extendMaybeNamedType < T : GraphQLNamedType > (type: ?T): ?T {
272
+ return type ? extendNamedType ( type ) : null ;
273
273
}
274
274
275
- function getExtendedType< T : GraphQLNamedType > (type: T): T {
276
- if ( ! extendTypeCache [ type . name ] ) {
277
- extendTypeCache [ type . name ] = extendType ( type ) ;
278
- }
279
- return (extendTypeCache[type.name]: any);
280
- }
281
-
282
- // To be called at most once per type. Only getExtendedType should call this.
283
- function extendType ( type ) {
275
+ function extendNamedType< T : GraphQLNamedType > (type: T): T {
284
276
if ( isIntrospectionType ( type ) ) {
285
277
// Introspection types are not extended.
286
278
return type ;
287
279
}
288
- if (isObjectType(type)) {
289
- return extendObjectType ( type ) ;
290
- }
291
- if (isInterfaceType(type)) {
292
- return extendInterfaceType ( type ) ;
293
- }
294
- if (isUnionType(type)) {
295
- return extendUnionType ( type ) ;
280
+
281
+ if (!extendTypeCache[type.name]) {
282
+ if ( isObjectType ( type ) ) {
283
+ extendTypeCache [ type . name ] = extendObjectType ( type ) ;
284
+ } else if (isInterfaceType(type)) {
285
+ extendTypeCache [ type . name ] = extendInterfaceType ( type ) ;
286
+ } else if (isUnionType(type)) {
287
+ extendTypeCache [ type . name ] = extendUnionType ( type ) ;
288
+ } else {
289
+ // This type is not yet extendable.
290
+ extendTypeCache [ type . name ] = type ;
291
+ }
296
292
}
297
- // This type is not yet extendable.
298
- return type;
293
+ return ( extendTypeCache [ type . name ] : any ) ;
299
294
}
300
295
301
296
function extendObjectType ( type : GraphQLObjectType ) : GraphQLObjectType {
@@ -339,7 +334,7 @@ export function extendSchema(
339
334
return new GraphQLUnionType ( {
340
335
name : type . name ,
341
336
description : type . description ,
342
- types : type . getTypes ( ) . map ( getExtendedType ) ,
337
+ types : type . getTypes ( ) . map ( extendNamedType ) ,
343
338
astNode : type . astNode ,
344
339
resolveType : type . resolveType ,
345
340
} ) ;
@@ -348,7 +343,7 @@ export function extendSchema(
348
343
function extendImplementedInterfaces(
349
344
type: GraphQLObjectType,
350
345
): Array< GraphQLInterfaceType > {
351
- const interfaces = type . getInterfaces ( ) . map ( getExtendedType ) ;
346
+ const interfaces = type . getInterfaces ( ) . map ( extendNamedType ) ;
352
347
353
348
// If there are any extensions to the interfaces, apply those here.
354
349
const extensions = typeExtensionsMap [ type . name ] ;
@@ -374,7 +369,7 @@ export function extendSchema(
374
369
newFieldMap [ fieldName ] = {
375
370
description : field . description ,
376
371
deprecationReason : field . deprecationReason ,
377
- type : extendFieldType ( field . type ) ,
372
+ type : extendType ( field . type ) ,
378
373
args : keyMap ( field . args , arg => arg . name ) ,
379
374
astNode : field . astNode ,
380
375
resolve : field . resolve ,
@@ -402,14 +397,14 @@ export function extendSchema(
402
397
return newFieldMap;
403
398
}
404
399
405
- function extendFieldType < T : GraphQLType > (typeDef: T): T {
400
+ function extendType < T : GraphQLType > (typeDef: T): T {
406
401
if ( isListType ( typeDef ) ) {
407
- return ( GraphQLList ( extendFieldType ( typeDef . ofType ) ) : any ) ;
402
+ return ( GraphQLList ( extendType ( typeDef . ofType ) ) : any ) ;
408
403
}
409
404
if (isNonNullType(typeDef)) {
410
- return ( GraphQLNonNull ( extendFieldType ( typeDef . ofType ) ) : any ) ;
405
+ return ( GraphQLNonNull ( extendType ( typeDef . ofType ) ) : any ) ;
411
406
}
412
- return getExtendedType (typeDef);
407
+ return extendNamedType (typeDef);
413
408
}
414
409
}
415
410
0 commit comments