8
8
FragmentDefinitionNode ,
9
9
FragmentSpreadNode ,
10
10
InlineFragmentNode ,
11
+ OperationDefinitionNode ,
12
+ OperationType ,
11
13
SelectionSetNode ,
12
14
)
13
15
from ..type import (
@@ -43,7 +45,7 @@ def collect_fields(
43
45
fragments : Dict [str , FragmentDefinitionNode ],
44
46
variable_values : Dict [str , Any ],
45
47
runtime_type : GraphQLObjectType ,
46
- selection_set : SelectionSetNode ,
48
+ operation : OperationDefinitionNode ,
47
49
) -> FieldsAndPatches :
48
50
"""Collect fields.
49
51
@@ -61,8 +63,9 @@ def collect_fields(
61
63
schema ,
62
64
fragments ,
63
65
variable_values ,
66
+ operation ,
64
67
runtime_type ,
65
- selection_set ,
68
+ operation . selection_set ,
66
69
fields ,
67
70
patches ,
68
71
set (),
@@ -74,6 +77,7 @@ def collect_subfields(
74
77
schema : GraphQLSchema ,
75
78
fragments : Dict [str , FragmentDefinitionNode ],
76
79
variable_values : Dict [str , Any ],
80
+ operation : OperationDefinitionNode ,
77
81
return_type : GraphQLObjectType ,
78
82
field_nodes : List [FieldNode ],
79
83
) -> FieldsAndPatches :
@@ -100,6 +104,7 @@ def collect_subfields(
100
104
schema ,
101
105
fragments ,
102
106
variable_values ,
107
+ operation ,
103
108
return_type ,
104
109
node .selection_set ,
105
110
sub_field_nodes ,
@@ -113,6 +118,7 @@ def collect_fields_impl(
113
118
schema : GraphQLSchema ,
114
119
fragments : Dict [str , FragmentDefinitionNode ],
115
120
variable_values : Dict [str , Any ],
121
+ operation : OperationDefinitionNode ,
116
122
runtime_type : GraphQLObjectType ,
117
123
selection_set : SelectionSetNode ,
118
124
fields : Dict [str , List [FieldNode ]],
@@ -133,13 +139,14 @@ def collect_fields_impl(
133
139
) or not does_fragment_condition_match (schema , selection , runtime_type ):
134
140
continue
135
141
136
- defer = get_defer_values (variable_values , selection )
142
+ defer = get_defer_values (operation , variable_values , selection )
137
143
if defer :
138
144
patch_fields = defaultdict (list )
139
145
collect_fields_impl (
140
146
schema ,
141
147
fragments ,
142
148
variable_values ,
149
+ operation ,
143
150
runtime_type ,
144
151
selection .selection_set ,
145
152
patch_fields ,
@@ -152,6 +159,7 @@ def collect_fields_impl(
152
159
schema ,
153
160
fragments ,
154
161
variable_values ,
162
+ operation ,
155
163
runtime_type ,
156
164
selection .selection_set ,
157
165
fields ,
@@ -164,7 +172,7 @@ def collect_fields_impl(
164
172
if not should_include_node (variable_values , selection ):
165
173
continue
166
174
167
- defer = get_defer_values (variable_values , selection )
175
+ defer = get_defer_values (operation , variable_values , selection )
168
176
if frag_name in visited_fragment_names and not defer :
169
177
continue
170
178
@@ -183,6 +191,7 @@ def collect_fields_impl(
183
191
schema ,
184
192
fragments ,
185
193
variable_values ,
194
+ operation ,
186
195
runtime_type ,
187
196
fragment .selection_set ,
188
197
patch_fields ,
@@ -195,6 +204,7 @@ def collect_fields_impl(
195
204
schema ,
196
205
fragments ,
197
206
variable_values ,
207
+ operation ,
198
208
runtime_type ,
199
209
fragment .selection_set ,
200
210
fields ,
@@ -210,7 +220,9 @@ class DeferValues(NamedTuple):
210
220
211
221
212
222
def get_defer_values (
213
- variable_values : Dict [str , Any ], node : Union [FragmentSpreadNode , InlineFragmentNode ]
223
+ operation : OperationDefinitionNode ,
224
+ variable_values : Dict [str , Any ],
225
+ node : Union [FragmentSpreadNode , InlineFragmentNode ],
214
226
) -> Optional [DeferValues ]:
215
227
"""Get values of defer directive if active.
216
228
@@ -223,6 +235,13 @@ def get_defer_values(
223
235
if not defer or defer .get ("if" ) is False :
224
236
return None
225
237
238
+ if operation .operation == OperationType .SUBSCRIPTION :
239
+ msg = (
240
+ "`@defer` directive not supported on subscription operations."
241
+ " Disable `@defer` by setting the `if` argument to `false`."
242
+ )
243
+ raise TypeError (msg )
244
+
226
245
return DeferValues (defer .get ("label" ))
227
246
228
247
0 commit comments