Skip to content

Commit

Permalink
fix(composition): respect resolveTo directive definitions in transforms
Browse files Browse the repository at this point in the history
  • Loading branch information
ardatan committed Nov 29, 2024
1 parent aa7b440 commit 750ce54
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 1 deletion.
5 changes: 5 additions & 0 deletions .changeset/lazy-nails-glow.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@graphql-mesh/fusion-composition': patch
---

Respect resolveTo directives in rename transform
34 changes: 33 additions & 1 deletion packages/fusion/composition/src/transforms/rename.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import {
isInterfaceType,
isObjectType,
isSpecifiedScalarType,
type GraphQLFieldConfig,
type GraphQLFieldConfigArgumentMap,
Expand All @@ -7,7 +9,13 @@ import {
type GraphQLSchema,
} from 'graphql';
import { resolvers as scalarsResolversMap } from 'graphql-scalars';
import { getRootTypes, MapperKind, mapSchema, type SchemaMapper } from '@graphql-tools/utils';
import {
getDirectiveExtensions,
getRootTypes,
MapperKind,
mapSchema,
type SchemaMapper,
} from '@graphql-tools/utils';
import type { SubgraphConfig, SubgraphTransform } from '../compose.js';

export const ignoreList = [
Expand Down Expand Up @@ -179,6 +187,7 @@ export function createRenameTransform(opts: RenameTransformConfig) {
}
return function renameTransform(schema: GraphQLSchema, subgraphConfig: SubgraphConfig) {
const schemaMapper: SchemaMapper = {};
const typeRenameMap = new Map<string, string>();
if (typeRenamers.length) {
schemaMapper[MapperKind.TYPE] = type => {
let newTypeName = type.name;
Expand All @@ -191,6 +200,7 @@ export function createRenameTransform(opts: RenameTransformConfig) {
}) || newTypeName;
}
if (newTypeName !== type.name) {
typeRenameMap.set(type.name, newTypeName);
return new (Object.getPrototypeOf(type).constructor)({
...type.toConfig(),
name: newTypeName,
Expand All @@ -199,6 +209,7 @@ export function createRenameTransform(opts: RenameTransformConfig) {
return type;
};
}
const fieldRenameMap = new Map<string, Map<string, string>>();
if (fieldRenamers.length || argRenamers.length) {
schemaMapper[MapperKind.FIELD] = (field, fieldName, typeName, schema) => {
let newFieldName = fieldName;
Expand All @@ -214,6 +225,12 @@ export function createRenameTransform(opts: RenameTransformConfig) {
subgraphConfig,
}) || newFieldName;
}
let typeFieldRenameMap = fieldRenameMap.get(typeName);
if (!typeFieldRenameMap) {
typeFieldRenameMap = new Map();
fieldRenameMap.set(typeName, typeFieldRenameMap);
}
typeFieldRenameMap.set(fieldName, newFieldName);
}
if (argRenamers.length && 'args' in field && field.args) {
const newArgs: GraphQLFieldConfigArgumentMap = {};
Expand All @@ -238,6 +255,21 @@ export function createRenameTransform(opts: RenameTransformConfig) {
},
];
}
const fieldDirectives = getDirectiveExtensions(field, schema);
if (fieldDirectives.resolveTo) {
fieldDirectives.resolveTo = fieldDirectives.resolveTo.map(resolveTo => ({
...resolveTo,
sourceTypeName:
(resolveTo.sourceTypeName && typeRenameMap.get(resolveTo.sourceTypeName)) ||
resolveTo.sourceTypeName,
sourceFieldName:
(resolveTo.sourceFieldName &&
fieldRenameMap.get(resolveTo.sourceTypeName)?.get(resolveTo.sourceFieldName)) ||
resolveTo.sourceFieldName,
}));
const fieldExtensions: Record<string, any> = (field.extensions ||= {});
fieldExtensions.directives = fieldDirectives;
}
return [newFieldName, field];
};
}
Expand Down

0 comments on commit 750ce54

Please sign in to comment.