UNPKG

5.05 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.KnownDirectivesRule = KnownDirectivesRule;
7
8var _inspect = _interopRequireDefault(require("../../jsutils/inspect.js"));
9
10var _invariant = _interopRequireDefault(require("../../jsutils/invariant.js"));
11
12var _GraphQLError = require("../../error/GraphQLError.js");
13
14var _kinds = require("../../language/kinds.js");
15
16var _directiveLocation = require("../../language/directiveLocation.js");
17
18var _directives = require("../../type/directives.js");
19
20function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
22/**
23 * Known directives
24 *
25 * A GraphQL document is only valid if all `@directives` are known by the
26 * schema and legally positioned.
27 */
28function KnownDirectivesRule(context) {
29 var locationsMap = Object.create(null);
30 var schema = context.getSchema();
31 var definedDirectives = schema ? schema.getDirectives() : _directives.specifiedDirectives;
32
33 for (var _i2 = 0; _i2 < definedDirectives.length; _i2++) {
34 var directive = definedDirectives[_i2];
35 locationsMap[directive.name] = directive.locations;
36 }
37
38 var astDefinitions = context.getDocument().definitions;
39
40 for (var _i4 = 0; _i4 < astDefinitions.length; _i4++) {
41 var def = astDefinitions[_i4];
42
43 if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) {
44 locationsMap[def.name.value] = def.locations.map(function (name) {
45 return name.value;
46 });
47 }
48 }
49
50 return {
51 Directive: function Directive(node, _key, _parent, _path, ancestors) {
52 var name = node.name.value;
53 var locations = locationsMap[name];
54
55 if (!locations) {
56 context.reportError(new _GraphQLError.GraphQLError("Unknown directive \"@".concat(name, "\"."), node));
57 return;
58 }
59
60 var candidateLocation = getDirectiveLocationForASTPath(ancestors);
61
62 if (candidateLocation && locations.indexOf(candidateLocation) === -1) {
63 context.reportError(new _GraphQLError.GraphQLError("Directive \"@".concat(name, "\" may not be used on ").concat(candidateLocation, "."), node));
64 }
65 }
66 };
67}
68
69function getDirectiveLocationForASTPath(ancestors) {
70 var appliedTo = ancestors[ancestors.length - 1];
71 !Array.isArray(appliedTo) || (0, _invariant.default)(0);
72
73 switch (appliedTo.kind) {
74 case _kinds.Kind.OPERATION_DEFINITION:
75 return getDirectiveLocationForOperation(appliedTo.operation);
76
77 case _kinds.Kind.FIELD:
78 return _directiveLocation.DirectiveLocation.FIELD;
79
80 case _kinds.Kind.FRAGMENT_SPREAD:
81 return _directiveLocation.DirectiveLocation.FRAGMENT_SPREAD;
82
83 case _kinds.Kind.INLINE_FRAGMENT:
84 return _directiveLocation.DirectiveLocation.INLINE_FRAGMENT;
85
86 case _kinds.Kind.FRAGMENT_DEFINITION:
87 return _directiveLocation.DirectiveLocation.FRAGMENT_DEFINITION;
88
89 case _kinds.Kind.VARIABLE_DEFINITION:
90 return _directiveLocation.DirectiveLocation.VARIABLE_DEFINITION;
91
92 case _kinds.Kind.SCHEMA_DEFINITION:
93 case _kinds.Kind.SCHEMA_EXTENSION:
94 return _directiveLocation.DirectiveLocation.SCHEMA;
95
96 case _kinds.Kind.SCALAR_TYPE_DEFINITION:
97 case _kinds.Kind.SCALAR_TYPE_EXTENSION:
98 return _directiveLocation.DirectiveLocation.SCALAR;
99
100 case _kinds.Kind.OBJECT_TYPE_DEFINITION:
101 case _kinds.Kind.OBJECT_TYPE_EXTENSION:
102 return _directiveLocation.DirectiveLocation.OBJECT;
103
104 case _kinds.Kind.FIELD_DEFINITION:
105 return _directiveLocation.DirectiveLocation.FIELD_DEFINITION;
106
107 case _kinds.Kind.INTERFACE_TYPE_DEFINITION:
108 case _kinds.Kind.INTERFACE_TYPE_EXTENSION:
109 return _directiveLocation.DirectiveLocation.INTERFACE;
110
111 case _kinds.Kind.UNION_TYPE_DEFINITION:
112 case _kinds.Kind.UNION_TYPE_EXTENSION:
113 return _directiveLocation.DirectiveLocation.UNION;
114
115 case _kinds.Kind.ENUM_TYPE_DEFINITION:
116 case _kinds.Kind.ENUM_TYPE_EXTENSION:
117 return _directiveLocation.DirectiveLocation.ENUM;
118
119 case _kinds.Kind.ENUM_VALUE_DEFINITION:
120 return _directiveLocation.DirectiveLocation.ENUM_VALUE;
121
122 case _kinds.Kind.INPUT_OBJECT_TYPE_DEFINITION:
123 case _kinds.Kind.INPUT_OBJECT_TYPE_EXTENSION:
124 return _directiveLocation.DirectiveLocation.INPUT_OBJECT;
125
126 case _kinds.Kind.INPUT_VALUE_DEFINITION:
127 {
128 var parentNode = ancestors[ancestors.length - 3];
129 return parentNode.kind === _kinds.Kind.INPUT_OBJECT_TYPE_DEFINITION ? _directiveLocation.DirectiveLocation.INPUT_FIELD_DEFINITION : _directiveLocation.DirectiveLocation.ARGUMENT_DEFINITION;
130 }
131 }
132}
133
134function getDirectiveLocationForOperation(operation) {
135 switch (operation) {
136 case 'query':
137 return _directiveLocation.DirectiveLocation.QUERY;
138
139 case 'mutation':
140 return _directiveLocation.DirectiveLocation.MUTATION;
141
142 case 'subscription':
143 return _directiveLocation.DirectiveLocation.SUBSCRIPTION;
144 } // istanbul ignore next (Not reachable. All possible types have been considered)
145
146
147 false || (0, _invariant.default)(0, 'Unexpected operation: ' + (0, _inspect.default)(operation));
148}