UNPKG

graphql

Version:

A Query Language and Runtime which can target any service.

63 lines (50 loc) 2.28 kB
/* @flow */ /** * Copyright (c) 2015, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ 'use strict'; var _Object$defineProperty = require('babel-runtime/core-js/object/define-property')['default']; var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default']; _Object$defineProperty(exports, '__esModule', { value: true }); exports['default'] = KnownDirectives; var _error = require('../../error'); var _errors = require('../errors'); var _languageKinds = require('../../language/kinds'); var _utilsFind = require('../../utils/find'); var _utilsFind2 = _interopRequireDefault(_utilsFind); /** * 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, _utilsFind2['default'])(context.getSchema().getDirectives(), function (def) { return def.name === node.name.value; }); if (!directiveDef) { return new _error.GraphQLError((0, _errors.unknownDirectiveMessage)(node.name.value), [node]); } var appliedTo = ancestors[ancestors.length - 1]; if (appliedTo.kind === _languageKinds.OPERATION_DEFINITION && !directiveDef.onOperation) { return new _error.GraphQLError((0, _errors.misplacedDirectiveMessage)(node.name.value, 'operation'), [node]); } if (appliedTo.kind === _languageKinds.FIELD && !directiveDef.onField) { return new _error.GraphQLError((0, _errors.misplacedDirectiveMessage)(node.name.value, 'field'), [node]); } if ((appliedTo.kind === _languageKinds.FRAGMENT_SPREAD || appliedTo.kind === _languageKinds.INLINE_FRAGMENT || appliedTo.kind === _languageKinds.FRAGMENT_DEFINITION) && !directiveDef.onFragment) { return new _error.GraphQLError((0, _errors.misplacedDirectiveMessage)(node.name.value, 'fragment'), [node]); } } }; } module.exports = exports['default'];