Skip to content

Commit d14fffe

Browse files
committed
Simplify operationTypes validation
1 parent d9178f4 commit d14fffe

File tree

1 file changed

+25
-51
lines changed

1 file changed

+25
-51
lines changed

src/utilities/buildASTSchema.js

Lines changed: 25 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -164,57 +164,31 @@ export function buildASTSchema(ast: DocumentNode): GraphQLSchema {
164164
}
165165
}
166166

167-
let queryTypeName;
168-
let mutationTypeName;
169-
let subscriptionTypeName;
167+
let operationTypes = {
168+
query: nodeMap.Query && 'Query',
169+
mutation: nodeMap.Mutation && 'Mutation',
170+
subscription: nodeMap.Subscription && 'Subscription',
171+
};
172+
170173
if (schemaDef) {
174+
operationTypes = {};
171175
schemaDef.operationTypes.forEach(operationType => {
172176
const typeName = operationType.type.name.value;
173-
if (operationType.operation === 'query') {
174-
if (queryTypeName) {
175-
throw new Error('Must provide only one query type in schema.');
176-
}
177-
if (!nodeMap[typeName]) {
178-
throw new Error(
179-
`Specified query type "${typeName}" not found in document.`
180-
);
181-
}
182-
queryTypeName = typeName;
183-
} else if (operationType.operation === 'mutation') {
184-
if (mutationTypeName) {
185-
throw new Error('Must provide only one mutation type in schema.');
186-
}
187-
if (!nodeMap[typeName]) {
188-
throw new Error(
189-
`Specified mutation type "${typeName}" not found in document.`
190-
);
191-
}
192-
mutationTypeName = typeName;
193-
} else if (operationType.operation === 'subscription') {
194-
if (subscriptionTypeName) {
195-
throw new Error('Must provide only one subscription type in schema.');
196-
}
197-
if (!nodeMap[typeName]) {
198-
throw new Error(
199-
`Specified subscription type "${typeName}" not found in document.`
200-
);
201-
}
202-
subscriptionTypeName = typeName;
177+
const operation = operationType.operation;
178+
179+
if (operationTypes[operation]) {
180+
throw new Error(`Must provide only one ${operation} type in schema.`);
181+
}
182+
if (!nodeMap[typeName]) {
183+
throw new Error(
184+
`Specified ${operation} type "${typeName}" not found in document.`
185+
);
203186
}
187+
operationTypes[operation] = typeName;
204188
});
205-
} else {
206-
if (nodeMap.Query) {
207-
queryTypeName = 'Query';
208-
}
209-
if (nodeMap.Mutation) {
210-
mutationTypeName = 'Mutation';
211-
}
212-
if (nodeMap.Subscription) {
213-
subscriptionTypeName = 'Subscription';
214-
}
215189
}
216190

217-
if (!queryTypeName) {
191+
if (!operationTypes.query) {
218192
throw new Error(
219193
'Must provide schema definition with query type or a type named Query.'
220194
);
@@ -254,12 +228,12 @@ export function buildASTSchema(ast: DocumentNode): GraphQLSchema {
254228
}
255229

256230
return new GraphQLSchema({
257-
query: getObjectType(nodeMap[queryTypeName]),
258-
mutation: mutationTypeName ?
259-
getObjectType(nodeMap[mutationTypeName]) :
231+
query: getObjectType(operationTypes.query),
232+
mutation: operationTypes.mutation ?
233+
getObjectType(operationTypes.mutation) :
260234
null,
261-
subscription: subscriptionTypeName ?
262-
getObjectType(nodeMap[subscriptionTypeName]) :
235+
subscription: operationTypes.subscription ?
236+
getObjectType(operationTypes.subscription) :
263237
null,
264238
types,
265239
directives,
@@ -280,8 +254,8 @@ export function buildASTSchema(ast: DocumentNode): GraphQLSchema {
280254
});
281255
}
282256

283-
function getObjectType(typeNode: TypeDefinitionNode): GraphQLObjectType {
284-
const type = typeDefNamed(typeNode.name.value);
257+
function getObjectType(name: string): GraphQLObjectType {
258+
const type = typeDefNamed(name);
285259
invariant(
286260
type instanceof GraphQLObjectType,
287261
'AST must provide object type.'

0 commit comments

Comments
 (0)