// @flow strict import { GraphQLError } from '../../error/GraphQLError'; import type { ASTVisitor } from '../../language/visitor'; import type { SDLValidationContext } from '../ValidationContext'; /** * Lone Schema definition * * A GraphQL document is only valid if it contains only one schema definition. */ export function LoneSchemaDefinitionRule( context: SDLValidationContext, ): ASTVisitor { const oldSchema = context.getSchema(); const alreadyDefined = oldSchema?.astNode ?? oldSchema?.getQueryType() ?? oldSchema?.getMutationType() ?? oldSchema?.getSubscriptionType(); let schemaDefinitionsCount = 0; return { SchemaDefinition(node) { if (alreadyDefined) { context.reportError( new GraphQLError( 'Cannot define a new schema within a schema extension.', node, ), ); return; } if (schemaDefinitionsCount > 0) { context.reportError( new GraphQLError('Must provide only one schema definition.', node), ); } ++schemaDefinitionsCount; }, }; }