'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.unknownDirectiveMessage = unknownDirectiveMessage; exports.misplacedDirectiveMessage = misplacedDirectiveMessage; exports.KnownDirectives = KnownDirectives; var _error = require('../../error'); var _find = require('../../jsutils/find'); var _find2 = _interopRequireDefault(_find); var _kinds = require('../../language/kinds'); var _directiveLocation = require('../../language/directiveLocation'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function unknownDirectiveMessage(directiveName) { return 'Unknown directive "' + directiveName + '".'; } /** * 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 */ function misplacedDirectiveMessage(directiveName, location) { return 'Directive "' + directiveName + '" may not be used on ' + location + '.'; } /** * Known directives * * A GraphQL document is only valid if all `@directives` are known by the * schema and legally positioned. */ function KnownDirectives(context) { return { Directive: function Directive(node, key, parent, path, ancestors) { var directiveDef = (0, _find2.default)(context.getSchema().getDirectives(), function (def) { return def.name === node.name.value; }); if (!directiveDef) { context.reportError(new _error.GraphQLError(unknownDirectiveMessage(node.name.value), [node])); return; } var candidateLocation = getDirectiveLocationForASTPath(ancestors); if (candidateLocation && directiveDef.locations.indexOf(candidateLocation) === -1) { context.reportError(new _error.GraphQLError(misplacedDirectiveMessage(node.name.value, candidateLocation), [node])); } } }; } function getDirectiveLocationForASTPath(ancestors) { var appliedTo = ancestors[ancestors.length - 1]; if (!Array.isArray(appliedTo)) { switch (appliedTo.kind) { case _kinds.Kind.OPERATION_DEFINITION: switch (appliedTo.operation) { case 'query': return _directiveLocation.DirectiveLocation.QUERY; case 'mutation': return _directiveLocation.DirectiveLocation.MUTATION; case 'subscription': return _directiveLocation.DirectiveLocation.SUBSCRIPTION; } break; case _kinds.Kind.FIELD: return _directiveLocation.DirectiveLocation.FIELD; case _kinds.Kind.FRAGMENT_SPREAD: return _directiveLocation.DirectiveLocation.FRAGMENT_SPREAD; case _kinds.Kind.INLINE_FRAGMENT: return _directiveLocation.DirectiveLocation.INLINE_FRAGMENT; case _kinds.Kind.FRAGMENT_DEFINITION: return _directiveLocation.DirectiveLocation.FRAGMENT_DEFINITION; case _kinds.Kind.SCHEMA_DEFINITION: return _directiveLocation.DirectiveLocation.SCHEMA; case _kinds.Kind.SCALAR_TYPE_DEFINITION: case _kinds.Kind.SCALAR_TYPE_EXTENSION: return _directiveLocation.DirectiveLocation.SCALAR; case _kinds.Kind.OBJECT_TYPE_DEFINITION: case _kinds.Kind.OBJECT_TYPE_EXTENSION: return _directiveLocation.DirectiveLocation.OBJECT; case _kinds.Kind.FIELD_DEFINITION: return _directiveLocation.DirectiveLocation.FIELD_DEFINITION; case _kinds.Kind.INTERFACE_TYPE_DEFINITION: case _kinds.Kind.INTERFACE_TYPE_EXTENSION: return _directiveLocation.DirectiveLocation.INTERFACE; case _kinds.Kind.UNION_TYPE_DEFINITION: case _kinds.Kind.UNION_TYPE_EXTENSION: return _directiveLocation.DirectiveLocation.UNION; case _kinds.Kind.ENUM_TYPE_DEFINITION: case _kinds.Kind.ENUM_TYPE_EXTENSION: return _directiveLocation.DirectiveLocation.ENUM; case _kinds.Kind.ENUM_VALUE_DEFINITION: return _directiveLocation.DirectiveLocation.ENUM_VALUE; case _kinds.Kind.INPUT_OBJECT_TYPE_DEFINITION: case _kinds.Kind.INPUT_OBJECT_TYPE_EXTENSION: return _directiveLocation.DirectiveLocation.INPUT_OBJECT; case _kinds.Kind.INPUT_VALUE_DEFINITION: var parentNode = ancestors[ancestors.length - 3]; return parentNode.kind === _kinds.Kind.INPUT_OBJECT_TYPE_DEFINITION ? _directiveLocation.DirectiveLocation.INPUT_FIELD_DEFINITION : _directiveLocation.DirectiveLocation.ARGUMENT_DEFINITION; } } }