diff --git a/.changeset/good-crabs-report.md b/.changeset/good-crabs-report.md new file mode 100644 index 00000000000..d2d32afc094 --- /dev/null +++ b/.changeset/good-crabs-report.md @@ -0,0 +1,5 @@ +--- +'@graphql-tools/utils': minor +--- + +Do not throw duplicate type error name while rewiring types diff --git a/.changeset/nice-moose-compete.md b/.changeset/nice-moose-compete.md new file mode 100644 index 00000000000..7f28ce07e71 --- /dev/null +++ b/.changeset/nice-moose-compete.md @@ -0,0 +1,5 @@ +--- +'@graphql-tools/wrap': minor +--- + +RenameTypes: do not rename type if the new name already exists in the schema diff --git a/packages/loaders/url/tests/url-loader.spec.ts b/packages/loaders/url/tests/url-loader.spec.ts index b04252b74b8..e2f959896ab 100644 --- a/packages/loaders/url/tests/url-loader.spec.ts +++ b/packages/loaders/url/tests/url-loader.spec.ts @@ -584,7 +584,7 @@ describe('Schema URL Loader', () => { })) as ExecutionResult; expect(result.data).toBeUndefined(); expect(result.errors).toBeDefined(); - expect(result.errors?.[0].message).toBe('fetch failed to http://127.0.0.1:9777/graphql'); - expect(result.errors?.[0].originalError?.message).toContain('failed'); + expect(result.errors?.[0].message).toContain('failed'); + expect(result.errors?.[0].message).toContain('http://127.0.0.1:9777/graphql'); }); }); diff --git a/packages/utils/src/heal.ts b/packages/utils/src/heal.ts index 259a0263d0d..9c88f1cb8c4 100644 --- a/packages/utils/src/heal.ts +++ b/packages/utils/src/heal.ts @@ -75,8 +75,9 @@ export function healTypes( continue; } - if (actualName in actualNamedTypeMap) { - throw new Error(`Duplicate schema type name ${actualName}`); + if (actualNamedTypeMap[actualName] != null) { + console.warn(`Duplicate schema type name ${actualName} found; keeping the existing one found in the schema`); + continue; } actualNamedTypeMap[actualName] = namedType; diff --git a/packages/utils/src/rewire.ts b/packages/utils/src/rewire.ts index bfc26e7c565..5119a740fcf 100644 --- a/packages/utils/src/rewire.ts +++ b/packages/utils/src/rewire.ts @@ -54,7 +54,8 @@ export function rewireTypes( } if (newTypeMap[newName] != null) { - throw new Error(`Duplicate schema type name ${newName}`); + console.warn(`Duplicate schema type name ${newName} found; keeping the existing one found in the schema`); + continue; } newTypeMap[newName] = namedType; diff --git a/packages/wrap/src/transforms/RenameTypes.ts b/packages/wrap/src/transforms/RenameTypes.ts index 2c831f7a55f..db15da2d664 100644 --- a/packages/wrap/src/transforms/RenameTypes.ts +++ b/packages/wrap/src/transforms/RenameTypes.ts @@ -44,6 +44,7 @@ export default class RenameTypes> originalWrappingSchema: GraphQLSchema, _subschemaConfig: SubschemaConfig ): GraphQLSchema { + const typeNames = new Set(Object.keys(originalWrappingSchema.getTypeMap())); return mapSchema(originalWrappingSchema, { [MapperKind.TYPE]: (type: GraphQLNamedType) => { if (isSpecifiedScalarType(type) && !this.renameBuiltins) { @@ -55,9 +56,16 @@ export default class RenameTypes> const oldName = type.name; const newName = this.renamer(oldName); if (newName !== undefined && newName !== oldName) { + if (typeNames.has(newName)) { + console.warn(`New type name ${newName} for ${oldName} already exists in the schema. Skip renaming.`); + return; + } this.map[oldName] = newName; this.reverseMap[newName] = oldName; + typeNames.delete(oldName); + typeNames.add(newName); + return renameType(type, newName); } },