1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 | import {
|
11 | ValidationRule,
|
12 | DocumentNode,
|
13 | specifiedRules,
|
14 | validate,
|
15 | GraphQLError,
|
16 | GraphQLSchema,
|
17 | NoUnusedFragmentsRule,
|
18 | KnownFragmentNamesRule,
|
19 | Kind,
|
20 | ExecutableDefinitionsRule,
|
21 |
|
22 | LoneSchemaDefinitionRule,
|
23 | UniqueOperationTypesRule,
|
24 | UniqueTypeNamesRule,
|
25 | UniqueEnumValueNamesRule,
|
26 | UniqueFieldDefinitionNamesRule,
|
27 | UniqueDirectiveNamesRule,
|
28 | KnownTypeNamesRule,
|
29 | KnownDirectivesRule,
|
30 | UniqueDirectivesPerLocationRule,
|
31 | PossibleTypeExtensionsRule,
|
32 |
|
33 | UniqueArgumentNamesRule,
|
34 | UniqueInputFieldNamesRule,
|
35 |
|
36 | } from 'graphql';
|
37 |
|
38 | const specifiedSDLRules = [
|
39 | LoneSchemaDefinitionRule,
|
40 | UniqueOperationTypesRule,
|
41 | UniqueTypeNamesRule,
|
42 | UniqueEnumValueNamesRule,
|
43 | UniqueFieldDefinitionNamesRule,
|
44 | UniqueDirectiveNamesRule,
|
45 | KnownTypeNamesRule,
|
46 | KnownDirectivesRule,
|
47 | UniqueDirectivesPerLocationRule,
|
48 | PossibleTypeExtensionsRule,
|
49 |
|
50 | UniqueArgumentNamesRule,
|
51 | UniqueInputFieldNamesRule,
|
52 |
|
53 | ];
|
54 |
|
55 |
|
56 |
|
57 |
|
58 | export function validateWithCustomRules(
|
59 | schema: GraphQLSchema,
|
60 | ast: DocumentNode,
|
61 | customRules?: Array<ValidationRule> | null,
|
62 | isRelayCompatMode?: boolean,
|
63 | isSchemaDocument?: boolean,
|
64 | ): Array<GraphQLError> {
|
65 | const rules = specifiedRules.filter(rule => {
|
66 |
|
67 |
|
68 |
|
69 | if (rule === NoUnusedFragmentsRule || rule === ExecutableDefinitionsRule) {
|
70 | return false;
|
71 | }
|
72 | if (isRelayCompatMode && rule === KnownFragmentNamesRule) {
|
73 | return false;
|
74 | }
|
75 | return true;
|
76 | });
|
77 |
|
78 | if (customRules) {
|
79 | Array.prototype.push.apply(rules, customRules);
|
80 | }
|
81 | if (isSchemaDocument) {
|
82 | Array.prototype.push.apply(rules, specifiedSDLRules);
|
83 | }
|
84 | const errors = validate(schema, ast, rules);
|
85 | return errors.filter(error => {
|
86 | if (error.message.indexOf('Unknown directive') !== -1 && error.nodes) {
|
87 | const node = error.nodes[0];
|
88 | if (node && node.kind === Kind.DIRECTIVE) {
|
89 | const name = node.name.value;
|
90 | if (name === 'arguments' || name === 'argumentDefinitions') {
|
91 | return false;
|
92 | }
|
93 | }
|
94 | }
|
95 | return true;
|
96 | });
|
97 | }
|