diff --git a/src/index.js b/src/index.js index 7a8a2f6981..b91cf7231d 100644 --- a/src/index.js +++ b/src/index.js @@ -98,6 +98,8 @@ export { isWrappingType, isNullableType, isNamedType, + isRequiredArgument, + isRequiredInputField, isSpecifiedScalarType, isIntrospectionType, isSpecifiedDirective, diff --git a/src/type/definition.js b/src/type/definition.js index bf5e5449fb..952e59bdd9 100644 --- a/src/type/definition.js +++ b/src/type/definition.js @@ -858,6 +858,10 @@ export type GraphQLArgument = { astNode?: ?InputValueDefinitionNode, }; +export function isRequiredArgument(arg: GraphQLArgument): boolean %checks { + return isNonNullType(arg.type) && arg.defaultValue === undefined; +} + export type GraphQLFieldMap = ObjMap< GraphQLField, >; @@ -1273,4 +1277,10 @@ export type GraphQLInputField = { astNode?: ?InputValueDefinitionNode, }; +export function isRequiredInputField( + field: GraphQLInputField, +): boolean %checks { + return isNonNullType(field.type) && field.defaultValue === undefined; +} + export type GraphQLInputFieldMap = ObjMap; diff --git a/src/type/index.js b/src/type/index.js index e8ac7437ae..4868543ab9 100644 --- a/src/type/index.js +++ b/src/type/index.js @@ -35,6 +35,8 @@ export { isWrappingType, isNullableType, isNamedType, + isRequiredArgument, + isRequiredInputField, // Assertions assertType, assertScalarType, diff --git a/src/validation/rules/ProvidedRequiredArguments.js b/src/validation/rules/ProvidedRequiredArguments.js index 8b101adc1e..b140059743 100644 --- a/src/validation/rules/ProvidedRequiredArguments.js +++ b/src/validation/rules/ProvidedRequiredArguments.js @@ -11,7 +11,7 @@ import type { ValidationContext } from '../ValidationContext'; import { GraphQLError } from '../../error/GraphQLError'; import inspect from '../../jsutils/inspect'; import keyMap from '../../jsutils/keyMap'; -import { isNonNullType } from '../../type/definition'; +import { isRequiredArgument } from '../../type/definition'; import type { ASTVisitor } from '../../language/visitor'; export function missingFieldArgMessage( @@ -58,11 +58,7 @@ export function ProvidedRequiredArguments( const argNodeMap = keyMap(argNodes, arg => arg.name.value); for (const argDef of fieldDef.args) { const argNode = argNodeMap[argDef.name]; - if ( - !argNode && - isNonNullType(argDef.type) && - argDef.defaultValue === undefined - ) { + if (!argNode && isRequiredArgument(argDef)) { context.reportError( new GraphQLError( missingFieldArgMessage( @@ -90,11 +86,7 @@ export function ProvidedRequiredArguments( const argNodeMap = keyMap(argNodes, arg => arg.name.value); for (const argDef of directiveDef.args) { const argNode = argNodeMap[argDef.name]; - if ( - !argNode && - isNonNullType(argDef.type) && - argDef.defaultValue === undefined - ) { + if (!argNode && isRequiredArgument(argDef)) { context.reportError( new GraphQLError( missingDirectiveArgMessage( diff --git a/src/validation/rules/ValuesOfCorrectType.js b/src/validation/rules/ValuesOfCorrectType.js index 44e4fdf772..8df1358301 100644 --- a/src/validation/rules/ValuesOfCorrectType.js +++ b/src/validation/rules/ValuesOfCorrectType.js @@ -18,6 +18,7 @@ import { isInputObjectType, isListType, isNonNullType, + isRequiredInputField, getNullableType, getNamedType, } from '../../type/definition'; @@ -97,16 +98,12 @@ export function ValuesOfCorrectType(context: ValidationContext): ASTVisitor { const fieldNodeMap = keyMap(node.fields, field => field.name.value); for (const fieldName of Object.keys(inputFields)) { const fieldDef = inputFields[fieldName]; - const fieldType = fieldDef.type; const fieldNode = fieldNodeMap[fieldName]; - if ( - !fieldNode && - isNonNullType(fieldType) && - fieldDef.defaultValue === undefined - ) { + if (!fieldNode && isRequiredInputField(fieldDef)) { + const typeStr = inspect(fieldDef.type); context.reportError( new GraphQLError( - requiredFieldMessage(type.name, fieldName, inspect(fieldType)), + requiredFieldMessage(type.name, fieldName, typeStr), node, ), );