text: // @flow strict
  
  import { GraphQLError } from '../../error/GraphQLError';
  
  import type { ASTVisitor } from '../../language/visitor';
  import type { OperationDefinitionNode } from '../../language/ast';
  
  import type { ASTValidationContext } from '../ValidationContext';
  
  /**
   * Subscriptions must only include one field.
   *
   * A GraphQL subscription is valid only if it contains a single root field.
   */
  export function SingleFieldSubscriptionsRule(
    context: ASTValidationContext,
  ): ASTVisitor {
    return {
      OperationDefinition(node: OperationDefinitionNode) {
        if (node.operation === 'subscription') {
          if (node.selectionSet.selections.length !== 1) {
            context.reportError(
              new GraphQLError(
                node.name
                  ? `Subscription "${node.name.value}" must select only one top level field.`
                  : 'Anonymous Subscription must select only one top level field.',
                node.selectionSet.selections.slice(1),
              ),
            );
          }
        }
      },
    };
  }
  