import { GraphQLError } from '../../error'; /** * Copyright (c) 2015-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * strict */ export function duplicateDirectiveMessage(directiveName) { return 'The directive "' + directiveName + '" can only be used once at ' + 'this location.'; } /** * Unique directive names per location * * A GraphQL document is only valid if all directives at a given location * are uniquely named. */ export function UniqueDirectivesPerLocation(context) { return { // Many different AST nodes may contain directives. Rather than listing // them all, just listen for entering any node, and check to see if it // defines any directives. enter: function enter(node) { // Flow can't refine that node.directives will only contain directives, var directives = node.directives; if (directives) { var knownDirectives = Object.create(null); directives.forEach(function (directive) { var directiveName = directive.name.value; if (knownDirectives[directiveName]) { context.reportError(new GraphQLError(duplicateDirectiveMessage(directiveName), [knownDirectives[directiveName], directive])); } else { knownDirectives[directiveName] = directive; } }); } } }; }