@@ -23,62 +23,63 @@ class SingleFieldSubscriptionsRule(ValidationRule):
2323 def enter_operation_definition (
2424 self , node : OperationDefinitionNode , * _args : Any
2525 ) -> None :
26- if node .operation == OperationType .SUBSCRIPTION :
27- schema = self .context .schema
28- subscription_type = schema .subscription_type
29- if subscription_type :
30- operation_name = node .name .value if node .name else None
31- variable_values : Dict [str , Any ] = {}
32- document = self .context .document
33- fragments : Dict [str , FragmentDefinitionNode ] = {
34- definition .name .value : definition
35- for definition in document .definitions
36- if isinstance (definition , FragmentDefinitionNode )
37- }
38- fields = collect_fields (
39- schema ,
40- fragments ,
41- variable_values ,
42- subscription_type ,
43- node .selection_set ,
44- {},
45- set (),
46- )
47- if len (fields ) > 1 :
48- field_selection_lists = list (fields .values ())
49- extra_field_selection_lists = field_selection_lists [1 :]
50- extra_field_selection = [
51- field
52- for fields in extra_field_selection_lists
53- for field in (
54- fields
55- if isinstance (fields , list )
56- else [cast (FieldNode , fields )]
26+ if node .operation != OperationType .SUBSCRIPTION :
27+ return
28+ schema = self .context .schema
29+ subscription_type = schema .subscription_type
30+ if subscription_type :
31+ operation_name = node .name .value if node .name else None
32+ variable_values : Dict [str , Any ] = {}
33+ document = self .context .document
34+ fragments : Dict [str , FragmentDefinitionNode ] = {
35+ definition .name .value : definition
36+ for definition in document .definitions
37+ if isinstance (definition , FragmentDefinitionNode )
38+ }
39+ fields = collect_fields (
40+ schema ,
41+ fragments ,
42+ variable_values ,
43+ subscription_type ,
44+ node .selection_set ,
45+ {},
46+ set (),
47+ )
48+ if len (fields ) > 1 :
49+ field_selection_lists = list (fields .values ())
50+ extra_field_selection_lists = field_selection_lists [1 :]
51+ extra_field_selection = [
52+ field
53+ for fields in extra_field_selection_lists
54+ for field in (
55+ fields
56+ if isinstance (fields , list )
57+ else [cast (FieldNode , fields )]
58+ )
59+ ]
60+ self .report_error (
61+ GraphQLError (
62+ (
63+ "Anonymous Subscription"
64+ if operation_name is None
65+ else f"Subscription '{ operation_name } '"
5766 )
58- ]
67+ + " must select only one top level field." ,
68+ extra_field_selection ,
69+ )
70+ )
71+ for field_nodes in fields .values ():
72+ field = field_nodes [0 ]
73+ field_name = field .name .value
74+ if field_name .startswith ("__" ):
5975 self .report_error (
6076 GraphQLError (
6177 (
6278 "Anonymous Subscription"
6379 if operation_name is None
6480 else f"Subscription '{ operation_name } '"
6581 )
66- + " must select only one top level field." ,
67- extra_field_selection ,
82+ + " must not select an introspection top level field." ,
83+ field_nodes ,
6884 )
6985 )
70- for field_nodes in fields .values ():
71- field = field_nodes [0 ]
72- field_name = field .name .value
73- if field_name .startswith ("__" ):
74- self .report_error (
75- GraphQLError (
76- (
77- "Anonymous Subscription"
78- if operation_name is None
79- else f"Subscription '{ operation_name } '"
80- )
81- + " must not select an introspection top level field." ,
82- field_nodes ,
83- )
84- )
0 commit comments