@@ -60,8 +60,12 @@ export function collectFields(
60
60
variableValues : { [ variable : string ] : unknown } ,
61
61
runtimeType : GraphQLObjectType ,
62
62
operation : OperationDefinitionNode ,
63
- ) : Map < string , ReadonlyArray < FieldDetails > > {
63
+ ) : {
64
+ fields : Map < string , ReadonlyArray < FieldDetails > > ;
65
+ newDeferUsages : ReadonlyArray < DeferUsage > ;
66
+ } {
64
67
const groupedFieldSet = new AccumulatorMap < string , FieldDetails > ( ) ;
68
+ const newDeferUsages : Array < DeferUsage > = [ ] ;
65
69
const context : CollectFieldsContext = {
66
70
schema,
67
71
fragments,
@@ -71,8 +75,13 @@ export function collectFields(
71
75
visitedFragmentNames : new Set ( ) ,
72
76
} ;
73
77
74
- collectFieldsImpl ( context , operation . selectionSet , groupedFieldSet ) ;
75
- return groupedFieldSet ;
78
+ collectFieldsImpl (
79
+ context ,
80
+ operation . selectionSet ,
81
+ groupedFieldSet ,
82
+ newDeferUsages ,
83
+ ) ;
84
+ return { fields : groupedFieldSet , newDeferUsages } ;
76
85
}
77
86
78
87
/**
@@ -93,7 +102,10 @@ export function collectSubfields(
93
102
operation : OperationDefinitionNode ,
94
103
returnType : GraphQLObjectType ,
95
104
fieldDetails : ReadonlyArray < FieldDetails > ,
96
- ) : Map < string , ReadonlyArray < FieldDetails > > {
105
+ ) : {
106
+ fields : Map < string , ReadonlyArray < FieldDetails > > ;
107
+ newDeferUsages : ReadonlyArray < DeferUsage > ;
108
+ } {
97
109
const context : CollectFieldsContext = {
98
110
schema,
99
111
fragments,
@@ -103,6 +115,7 @@ export function collectSubfields(
103
115
visitedFragmentNames : new Set ( ) ,
104
116
} ;
105
117
const subGroupedFieldSet = new AccumulatorMap < string , FieldDetails > ( ) ;
118
+ const newDeferUsages : Array < DeferUsage > = [ ] ;
106
119
107
120
for ( const fieldDetail of fieldDetails ) {
108
121
const node = fieldDetail . node ;
@@ -111,19 +124,23 @@ export function collectSubfields(
111
124
context ,
112
125
node . selectionSet ,
113
126
subGroupedFieldSet ,
127
+ newDeferUsages ,
114
128
fieldDetail . deferUsage ,
115
129
) ;
116
130
}
117
131
}
118
132
119
- return subGroupedFieldSet ;
133
+ return {
134
+ fields : subGroupedFieldSet ,
135
+ newDeferUsages,
136
+ } ;
120
137
}
121
138
122
139
function collectFieldsImpl (
123
140
context : CollectFieldsContext ,
124
141
selectionSet : SelectionSetNode ,
125
142
groupedFieldSet : AccumulatorMap < string , FieldDetails > ,
126
- parentDeferUsage ?: DeferUsage ,
143
+ newDeferUsages : Array < DeferUsage > ,
127
144
deferUsage ?: DeferUsage ,
128
145
) : void {
129
146
const {
@@ -143,7 +160,7 @@ function collectFieldsImpl(
143
160
}
144
161
groupedFieldSet . add ( getFieldEntryKey ( selection ) , {
145
162
node : selection ,
146
- deferUsage : deferUsage ?? parentDeferUsage ,
163
+ deferUsage,
147
164
} ) ;
148
165
break ;
149
166
}
@@ -159,16 +176,27 @@ function collectFieldsImpl(
159
176
operation ,
160
177
variableValues ,
161
178
selection ,
162
- parentDeferUsage ,
179
+ deferUsage ,
163
180
) ;
164
181
165
- collectFieldsImpl (
166
- context ,
167
- selection . selectionSet ,
168
- groupedFieldSet ,
169
- parentDeferUsage ,
170
- newDeferUsage ?? deferUsage ,
171
- ) ;
182
+ if ( ! newDeferUsage ) {
183
+ collectFieldsImpl (
184
+ context ,
185
+ selection . selectionSet ,
186
+ groupedFieldSet ,
187
+ newDeferUsages ,
188
+ deferUsage ,
189
+ ) ;
190
+ } else {
191
+ newDeferUsages . push ( newDeferUsage ) ;
192
+ collectFieldsImpl (
193
+ context ,
194
+ selection . selectionSet ,
195
+ groupedFieldSet ,
196
+ newDeferUsages ,
197
+ newDeferUsage ,
198
+ ) ;
199
+ }
172
200
173
201
break ;
174
202
}
@@ -179,7 +207,7 @@ function collectFieldsImpl(
179
207
operation ,
180
208
variableValues ,
181
209
selection ,
182
- parentDeferUsage ,
210
+ deferUsage ,
183
211
) ;
184
212
185
213
if (
@@ -199,15 +227,23 @@ function collectFieldsImpl(
199
227
}
200
228
if ( ! newDeferUsage ) {
201
229
visitedFragmentNames . add ( fragName ) ;
230
+ collectFieldsImpl (
231
+ context ,
232
+ fragment . selectionSet ,
233
+ groupedFieldSet ,
234
+ newDeferUsages ,
235
+ deferUsage ,
236
+ ) ;
237
+ } else {
238
+ newDeferUsages . push ( newDeferUsage ) ;
239
+ collectFieldsImpl (
240
+ context ,
241
+ fragment . selectionSet ,
242
+ groupedFieldSet ,
243
+ newDeferUsages ,
244
+ newDeferUsage ,
245
+ ) ;
202
246
}
203
-
204
- collectFieldsImpl (
205
- context ,
206
- fragment . selectionSet ,
207
- groupedFieldSet ,
208
- parentDeferUsage ,
209
- newDeferUsage ?? deferUsage ,
210
- ) ;
211
247
break ;
212
248
}
213
249
}
0 commit comments