graphql
Version:
A Query Language and Runtime which can target any service.
63 lines (50 loc) • 2.28 kB
JavaScript
/* @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.
*/
;
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'];