diff options
Diffstat (limited to 'alarm/node_modules/graphql/validation/rules/KnownArgumentNamesRule.js.flow')
-rw-r--r-- | alarm/node_modules/graphql/validation/rules/KnownArgumentNamesRule.js.flow | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/alarm/node_modules/graphql/validation/rules/KnownArgumentNamesRule.js.flow b/alarm/node_modules/graphql/validation/rules/KnownArgumentNamesRule.js.flow new file mode 100644 index 0000000..a5f420b --- /dev/null +++ b/alarm/node_modules/graphql/validation/rules/KnownArgumentNamesRule.js.flow @@ -0,0 +1,98 @@ +// @flow strict +import didYouMean from '../../jsutils/didYouMean'; +import suggestionList from '../../jsutils/suggestionList'; + +import { GraphQLError } from '../../error/GraphQLError'; + +import type { ASTVisitor } from '../../language/visitor'; +import { Kind } from '../../language/kinds'; + +import { specifiedDirectives } from '../../type/directives'; + +import type { + ValidationContext, + SDLValidationContext, +} from '../ValidationContext'; + +/** + * Known argument names + * + * A GraphQL field is only valid if all supplied arguments are defined by + * that field. + */ +export function KnownArgumentNamesRule(context: ValidationContext): ASTVisitor { + return { + // eslint-disable-next-line new-cap + ...KnownArgumentNamesOnDirectivesRule(context), + Argument(argNode) { + const argDef = context.getArgument(); + const fieldDef = context.getFieldDef(); + const parentType = context.getParentType(); + + if (!argDef && fieldDef && parentType) { + const argName = argNode.name.value; + const knownArgsNames = fieldDef.args.map((arg) => arg.name); + const suggestions = suggestionList(argName, knownArgsNames); + context.reportError( + new GraphQLError( + `Unknown argument "${argName}" on field "${parentType.name}.${fieldDef.name}".` + + didYouMean(suggestions), + argNode, + ), + ); + } + }, + }; +} + +/** + * @internal + */ +export function KnownArgumentNamesOnDirectivesRule( + context: ValidationContext | SDLValidationContext, +): ASTVisitor { + const directiveArgs = Object.create(null); + + const schema = context.getSchema(); + const definedDirectives = schema + ? schema.getDirectives() + : specifiedDirectives; + for (const directive of definedDirectives) { + directiveArgs[directive.name] = directive.args.map((arg) => arg.name); + } + + const astDefinitions = context.getDocument().definitions; + for (const def of astDefinitions) { + if (def.kind === Kind.DIRECTIVE_DEFINITION) { + // istanbul ignore next (See: 'https://github.com/graphql/graphql-js/issues/2203') + const argsNodes = def.arguments ?? []; + + directiveArgs[def.name.value] = argsNodes.map((arg) => arg.name.value); + } + } + + return { + Directive(directiveNode) { + const directiveName = directiveNode.name.value; + const knownArgs = directiveArgs[directiveName]; + + if (directiveNode.arguments && knownArgs) { + for (const argNode of directiveNode.arguments) { + const argName = argNode.name.value; + if (knownArgs.indexOf(argName) === -1) { + const suggestions = suggestionList(argName, knownArgs); + context.reportError( + new GraphQLError( + `Unknown argument "${argName}" on directive "@${directiveName}".` + + didYouMean(suggestions), + argNode, + ), + ); + } + } + } + + return false; + }, + }; +} |