@@ -147,7 +147,7 @@ export function createResolvers({
147
147
nodeIdField,
148
148
subschemas,
149
149
} : GlobalObjectIdentificationOptions ) : IResolvers {
150
- const types = getDistinctResolvableTypes ( subschemas ) . toArray ( ) ;
150
+ const types = getDistinctResolvableTypes ( subschemas ) ;
151
151
return {
152
152
...types . reduce (
153
153
( resolvers , { typeName, keyFieldNames } ) => ( {
@@ -227,8 +227,18 @@ export function createResolvers({
227
227
} ;
228
228
}
229
229
230
- function * getDistinctResolvableTypes ( subschemas : Iterable < SubschemaConfig > ) {
231
- const yieldedTypes = new Set < string > ( ) ;
230
+ interface DistinctResolvableType {
231
+ typeName : string ;
232
+ subschema : SubschemaConfig ;
233
+ merge : MergedTypeConfigFromEntities ;
234
+ keyFieldNames : string [ ] ;
235
+ }
236
+
237
+ function getDistinctResolvableTypes (
238
+ subschemas : Iterable < SubschemaConfig > ,
239
+ ) : DistinctResolvableType [ ] {
240
+ const visitedTypeNames = new Set < string > ( ) ;
241
+ const types : DistinctResolvableType [ ] = [ ] ;
232
242
for ( const subschema of subschemas ) {
233
243
// TODO: respect canonical types
234
244
for ( const [ typeName , merge ] of Object . entries ( subschema . merge || { } )
@@ -240,7 +250,7 @@ function* getDistinctResolvableTypes(subschemas: Iterable<SubschemaConfig>) {
240
250
// sort by shortest keys first
241
251
( [ , a ] , [ , b ] ) => a . selectionSet ! . length - b . selectionSet ! . length ,
242
252
) ) {
243
- if ( yieldedTypes . has ( typeName ) ) {
253
+ if ( visitedTypeNames . has ( typeName ) ) {
244
254
// already yielded this type, all types can only have one resolution
245
255
continue ;
246
256
}
@@ -272,13 +282,14 @@ function* getDistinctResolvableTypes(subschemas: Iterable<SubschemaConfig>) {
272
282
}
273
283
// what we're left in the "key" are simple field(s) like "id" or "email"
274
284
275
- yieldedTypes . add ( typeName ) ;
276
- yield {
285
+ visitedTypeNames . add ( typeName ) ;
286
+ types . push ( {
277
287
typeName,
278
288
subschema,
279
289
merge : merge as MergedTypeConfigFromEntities ,
280
290
keyFieldNames : key . trim ( ) . split ( / \s + / ) ,
281
- } ;
291
+ } ) ;
282
292
}
283
293
}
294
+ return types ;
284
295
}
0 commit comments