A better approach to GraphQL renames
04 Jun 2019 by Nigel SampsonAs it typically happens I write a post on how I do something, it gets some decent traffic and then I find a better way to do it.
In this case I’m referring to a post from a few weeks ago about Handling name collisions in GraphQL schema stitching, in that post I highlighted a way to use AddMergedDocumentRewriter
to rewrite the merged schema document. It turns out there’s a better way…
Hot Chocolate supports an ITypeRewriter
interface that when registered will be called for each type in the merged schema. Our RenameTypeRewriter
looks like the following which is a lot cleaner in my opinion.
public class RenameTypeRewriter : ITypeRewriter
{
public ITypeDefinitionNode Rewrite(ISchemaInfo schema, ITypeDefinitionNode typeDefinition)
{
var renameDirective = typeDefinition.Directives.SingleOrDefault(d => d.Name.Value == RenameDirectiveType.DirectiveName);
if (renameDirective != null) {
var newNameArgumment = renameDirective.Arguments.Single(a => a.Name.Value == RenameDirectiveType.ArgumentName );
if (newNameArgumment.Value is StringValueNode stringValue) {
return typeDefinition.Rename(stringValue.Value, schema.Name);
}
}
return typeDefinition;
}
}
Instead of our call to AddMergedDocumentRewriter
we now have
.AddTypeRewriter(new RenameTypeRewriter())