diff --git a/src/utilities/buildASTSchema.js b/src/utilities/buildASTSchema.js index f1038b3955..5418700650 100644 --- a/src/utilities/buildASTSchema.js +++ b/src/utilities/buildASTSchema.js @@ -164,62 +164,12 @@ export function buildASTSchema(ast: DocumentNode): GraphQLSchema { } } - let queryTypeName; - let mutationTypeName; - let subscriptionTypeName; - if (schemaDef) { - schemaDef.operationTypes.forEach(operationType => { - const typeName = operationType.type.name.value; - if (operationType.operation === 'query') { - if (queryTypeName) { - throw new Error('Must provide only one query type in schema.'); - } - if (!nodeMap[typeName]) { - throw new Error( - `Specified query type "${typeName}" not found in document.` - ); - } - queryTypeName = typeName; - } else if (operationType.operation === 'mutation') { - if (mutationTypeName) { - throw new Error('Must provide only one mutation type in schema.'); - } - if (!nodeMap[typeName]) { - throw new Error( - `Specified mutation type "${typeName}" not found in document.` - ); - } - mutationTypeName = typeName; - } else if (operationType.operation === 'subscription') { - if (subscriptionTypeName) { - throw new Error('Must provide only one subscription type in schema.'); - } - if (!nodeMap[typeName]) { - throw new Error( - `Specified subscription type "${typeName}" not found in document.` - ); - } - subscriptionTypeName = typeName; - } - }); - } else { - if (nodeMap.Query) { - queryTypeName = 'Query'; - } - if (nodeMap.Mutation) { - mutationTypeName = 'Mutation'; - } - if (nodeMap.Subscription) { - subscriptionTypeName = 'Subscription'; - } - } - - if (!queryTypeName) { - throw new Error( - 'Must provide schema definition with query type or a type named Query.' - ); - } - + const operationTypes = schemaDef ? getOperationTypes(schemaDef) : { + query: nodeMap.Query ? 'Query' : null, + mutation: nodeMap.Mutation ? 'Mutation' : null, + subscription: nodeMap.Subscription ? 'Subscription' : null, + }; + const innerTypeMap = { String: GraphQLString, Int: GraphQLInt, @@ -252,20 +202,45 @@ export function buildASTSchema(ast: DocumentNode): GraphQLSchema { if (!directives.some(directive => directive.name === 'deprecated')) { directives.push(GraphQLDeprecatedDirective); } + + if (!operationTypes.query) { + throw new Error( + 'Must provide schema definition with query type or a type named Query.' + ); + } return new GraphQLSchema({ - query: getObjectType(nodeMap[queryTypeName]), - mutation: mutationTypeName ? - getObjectType(nodeMap[mutationTypeName]) : + query: getObjectType(operationTypes.query), + mutation: operationTypes.mutation ? + getObjectType(operationTypes.mutation) : null, - subscription: subscriptionTypeName ? - getObjectType(nodeMap[subscriptionTypeName]) : + subscription: operationTypes.subscription ? + getObjectType(operationTypes.subscription) : null, types, directives, astNode: schemaDef, }); + function getOperationTypes(schema: SchemaDefinitionNode) { + const opTypes = {}; + schema.operationTypes.forEach(operationType => { + const typeName = operationType.type.name.value; + const operation = operationType.operation; + + if (opTypes[operation]) { + throw new Error(`Must provide only one ${operation} type in schema.`); + } + if (!nodeMap[typeName]) { + throw new Error( + `Specified ${operation} type "${typeName}" not found in document.` + ); + } + opTypes[operation] = typeName; + }); + return opTypes; + } + function getDirective( directiveNode: DirectiveDefinitionNode ): GraphQLDirective { @@ -280,8 +255,8 @@ export function buildASTSchema(ast: DocumentNode): GraphQLSchema { }); } - function getObjectType(typeNode: TypeDefinitionNode): GraphQLObjectType { - const type = typeDefNamed(typeNode.name.value); + function getObjectType(name: string): GraphQLObjectType { + const type = typeDefNamed(name); invariant( type instanceof GraphQLObjectType, 'AST must provide object type.'