Skip to content

Commit eda730e

Browse files
committed
no generator
1 parent f54c094 commit eda730e

File tree

1 file changed

+18
-7
lines changed

1 file changed

+18
-7
lines changed

packages/federation/src/globalObjectIdentification.ts

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ export function createResolvers({
147147
nodeIdField,
148148
subschemas,
149149
}: GlobalObjectIdentificationOptions): IResolvers {
150-
const types = getDistinctResolvableTypes(subschemas).toArray();
150+
const types = getDistinctResolvableTypes(subschemas);
151151
return {
152152
...types.reduce(
153153
(resolvers, { typeName, keyFieldNames }) => ({
@@ -227,8 +227,18 @@ export function createResolvers({
227227
};
228228
}
229229

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[] = [];
232242
for (const subschema of subschemas) {
233243
// TODO: respect canonical types
234244
for (const [typeName, merge] of Object.entries(subschema.merge || {})
@@ -240,7 +250,7 @@ function* getDistinctResolvableTypes(subschemas: Iterable<SubschemaConfig>) {
240250
// sort by shortest keys first
241251
([, a], [, b]) => a.selectionSet!.length - b.selectionSet!.length,
242252
)) {
243-
if (yieldedTypes.has(typeName)) {
253+
if (visitedTypeNames.has(typeName)) {
244254
// already yielded this type, all types can only have one resolution
245255
continue;
246256
}
@@ -272,13 +282,14 @@ function* getDistinctResolvableTypes(subschemas: Iterable<SubschemaConfig>) {
272282
}
273283
// what we're left in the "key" are simple field(s) like "id" or "email"
274284

275-
yieldedTypes.add(typeName);
276-
yield {
285+
visitedTypeNames.add(typeName);
286+
types.push({
277287
typeName,
278288
subschema,
279289
merge: merge as MergedTypeConfigFromEntities,
280290
keyFieldNames: key.trim().split(/\s+/),
281-
};
291+
});
282292
}
283293
}
294+
return types;
284295
}

0 commit comments

Comments
 (0)