diff --git a/src/utilities/buildASTSchema.js b/src/utilities/buildASTSchema.js index bee0c2fa13..07e05834f8 100644 --- a/src/utilities/buildASTSchema.js +++ b/src/utilities/buildASTSchema.js @@ -161,7 +161,7 @@ export function buildASTSchema( subscription: (typeMap['Subscription']: any), }; - const directives = directiveDefs.map(def => astBuilder.buildDirective(def)); + const directives = astBuilder.buildDirectives(directiveDefs); // If specified directives were not explicitly declared, add them. if (!directives.some(directive => directive.name === 'skip')) { @@ -238,18 +238,22 @@ export class ASTDefinitionBuilder { return this.getNamedType(node); } - buildDirective(directive: DirectiveDefinitionNode): GraphQLDirective { - const locations = directive.locations.map( - ({ value }) => ((value: any): DirectiveLocationEnum), - ); - - return new GraphQLDirective({ - name: directive.name.value, - description: getDescription(directive, this._options), - locations, - isRepeatable: directive.repeatable, - args: this.buildArgumentMap(directive.arguments), - astNode: directive, + buildDirectives( + nodes: Array, + ): Array { + return nodes.map(directive => { + const locations = directive.locations.map( + ({ value }) => ((value: any): DirectiveLocationEnum), + ); + + return new GraphQLDirective({ + name: directive.name.value, + description: getDescription(directive, this._options), + locations, + isRepeatable: directive.repeatable, + args: this.buildArgumentMap(directive.arguments), + astNode: directive, + }); }); } diff --git a/src/utilities/extendSchema.js b/src/utilities/extendSchema.js index 010df4c3fc..07432be2e6 100644 --- a/src/utilities/extendSchema.js +++ b/src/utilities/extendSchema.js @@ -178,7 +178,10 @@ export function extendSchema( return new GraphQLSchema({ ...operationTypes, types: objectValues(typeMap), - directives: getMergedDirectives(), + directives: [ + ...replaceDirectives(schemaConfig.directives), + ...astBuilder.buildDirectives(directiveDefs), + ], astNode: schemaDef || schemaConfig.astNode, extensionASTNodes: concatMaybeArrays( schemaConfig.extensionASTNodes, @@ -205,19 +208,18 @@ export function extendSchema( return ((typeMap[type.name]: any): T); } - function getMergedDirectives(): Array { - const existingDirectives = schema.getDirectives().map(directive => { + function replaceDirectives( + directives: $ReadOnlyArray, + ): Array { + devAssert(directives, 'schema must have default directives'); + + return directives.map(directive => { const config = directive.toConfig(); return new GraphQLDirective({ ...config, args: mapValue(config.args, extendArg), }); }); - - devAssert(existingDirectives, 'schema must have default directives'); - return existingDirectives.concat( - directiveDefs.map(node => astBuilder.buildDirective(node)), - ); } function extendNamedType(type: GraphQLNamedType): GraphQLNamedType {