UNPKG

2.71 kBPlain TextView Raw
1/**
2 * Copyright (c) 2021 GraphQL Contributors
3 * All rights reserved.
4 *
5 * This source code is licensed under the license found in the
6 * LICENSE file in the root directory of this source tree.
7 *
8 */
9
10import {
11 ValidationRule,
12 DocumentNode,
13 specifiedRules,
14 validate,
15 GraphQLError,
16 GraphQLSchema,
17 NoUnusedFragmentsRule,
18 KnownFragmentNamesRule,
19 Kind,
20 ExecutableDefinitionsRule,
21 // specifiedSDLRules:
22 LoneSchemaDefinitionRule,
23 UniqueOperationTypesRule,
24 UniqueTypeNamesRule,
25 UniqueEnumValueNamesRule,
26 UniqueFieldDefinitionNamesRule,
27 UniqueDirectiveNamesRule,
28 KnownTypeNamesRule,
29 KnownDirectivesRule,
30 UniqueDirectivesPerLocationRule,
31 PossibleTypeExtensionsRule,
32 // KnownArgumentNamesOnDirectivesRule,
33 UniqueArgumentNamesRule,
34 UniqueInputFieldNamesRule,
35 // ProvidedRequiredArgumentsOnDirectivesRule,
36} from 'graphql';
37
38const specifiedSDLRules = [
39 LoneSchemaDefinitionRule,
40 UniqueOperationTypesRule,
41 UniqueTypeNamesRule,
42 UniqueEnumValueNamesRule,
43 UniqueFieldDefinitionNamesRule,
44 UniqueDirectiveNamesRule,
45 KnownTypeNamesRule,
46 KnownDirectivesRule,
47 UniqueDirectivesPerLocationRule,
48 PossibleTypeExtensionsRule,
49 // KnownArgumentNamesOnDirectivesRule,
50 UniqueArgumentNamesRule,
51 UniqueInputFieldNamesRule,
52 // ProvidedRequiredArgumentsOnDirectivesRule,
53];
54
55/**
56 * Validate a GraphQL Document optionally with custom validation rules.
57 */
58export 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 // Because every fragment is considered for determing model subsets that may
67 // be used anywhere in the codebase they're all technically "used" by clients
68 // of graphql-data. So we remove this rule from the validators.
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}