From 97b009d4c8a9970ba249c508e7b00082bb10696d Mon Sep 17 00:00:00 2001 From: Ivan Goncharov Date: Tue, 22 Aug 2017 21:08:06 +0300 Subject: [PATCH 1/3] Simplify operationTypes validation --- src/utilities/buildASTSchema.js | 89 ++++++++++++--------------------- 1 file changed, 32 insertions(+), 57 deletions(-) diff --git a/src/utilities/buildASTSchema.js b/src/utilities/buildASTSchema.js index f1038b3955..d34095b8e3 100644 --- a/src/utilities/buildASTSchema.js +++ b/src/utilities/buildASTSchema.js @@ -164,57 +164,13 @@ 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'; - } - } + const operationTypes = schemaDef ? getOperationTypes(schemaDef) : { + query: nodeMap.Query && 'Query', + mutation: nodeMap.Mutation && 'Mutation', + subscription: nodeMap.Subscription && 'Subscription', + }; - if (!queryTypeName) { + if (!operationTypes.query) { throw new Error( 'Must provide schema definition with query type or a type named Query.' ); @@ -254,18 +210,37 @@ export function buildASTSchema(ast: DocumentNode): GraphQLSchema { } 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.' From 48261feaa1f79ae59d6417e7f23b619567c0cb65 Mon Sep 17 00:00:00 2001 From: Lee Byron Date: Fri, 1 Dec 2017 14:30:24 -0800 Subject: [PATCH 2/3] Explicit nulls --- src/utilities/buildASTSchema.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/utilities/buildASTSchema.js b/src/utilities/buildASTSchema.js index d34095b8e3..ccb5fc44b5 100644 --- a/src/utilities/buildASTSchema.js +++ b/src/utilities/buildASTSchema.js @@ -165,9 +165,9 @@ export function buildASTSchema(ast: DocumentNode): GraphQLSchema { } const operationTypes = schemaDef ? getOperationTypes(schemaDef) : { - query: nodeMap.Query && 'Query', - mutation: nodeMap.Mutation && 'Mutation', - subscription: nodeMap.Subscription && 'Subscription', + query: nodeMap.Query ? 'Query' : null, + mutation: nodeMap.Mutation ? 'Mutation' : null, + subscription: nodeMap.Subscription ? 'Subscription' : null, }; if (!operationTypes.query) { From 9da6e06bfaffd0a0d4a58364172396b82c0ab6d6 Mon Sep 17 00:00:00 2001 From: Lee Byron Date: Fri, 1 Dec 2017 14:37:12 -0800 Subject: [PATCH 3/3] Flow refine null condition --- src/utilities/buildASTSchema.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/utilities/buildASTSchema.js b/src/utilities/buildASTSchema.js index ccb5fc44b5..5418700650 100644 --- a/src/utilities/buildASTSchema.js +++ b/src/utilities/buildASTSchema.js @@ -169,13 +169,7 @@ export function buildASTSchema(ast: DocumentNode): GraphQLSchema { mutation: nodeMap.Mutation ? 'Mutation' : null, subscription: nodeMap.Subscription ? 'Subscription' : null, }; - - if (!operationTypes.query) { - throw new Error( - 'Must provide schema definition with query type or a type named Query.' - ); - } - + const innerTypeMap = { String: GraphQLString, Int: GraphQLInt, @@ -208,6 +202,12 @@ 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(operationTypes.query),