From 13c24883004d5330f7402cb20566e37535c5729b Mon Sep 17 00:00:00 2001 From: Arda TANRIKULU Date: Wed, 7 Dec 2022 15:46:12 +0300 Subject: [PATCH] fix(delegate): handle existing argument nodes correctly --- .changeset/cold-files-drive.md | 6 ++++++ packages/delegate/src/finalizeGatewayRequest.ts | 11 ++++++++++- packages/utils/src/transformInputValue.ts | 3 ++- 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 .changeset/cold-files-drive.md diff --git a/.changeset/cold-files-drive.md b/.changeset/cold-files-drive.md new file mode 100644 index 00000000000..5308652d006 --- /dev/null +++ b/.changeset/cold-files-drive.md @@ -0,0 +1,6 @@ +--- +'@graphql-tools/delegate': patch +'@graphql-tools/utils': patch +--- + +Fix handling argument values in gateway request diff --git a/packages/delegate/src/finalizeGatewayRequest.ts b/packages/delegate/src/finalizeGatewayRequest.ts index 188bfd343f0..aec7447b35a 100644 --- a/packages/delegate/src/finalizeGatewayRequest.ts +++ b/packages/delegate/src/finalizeGatewayRequest.ts @@ -16,6 +16,7 @@ import { SelectionSetNode, TypeInfo, TypeNameMetaFieldDef, + valueFromAST, VariableDefinitionNode, versionInfo as graphqlVersionInfo, visit, @@ -221,6 +222,14 @@ function updateArguments( const argType = argument.type; if (argName in newArgs) { + let value: any; + const existingValueNode = argumentNodeMap[argName]?.value; + if (existingValueNode != null) { + value = valueFromAST(existingValueNode, argType, variableValues); + } + if (value == null) { + value = serializeInputValue(argType, newArgs[argName]); + } updateArgument( argumentNodeMap, variableDefinitionMap, @@ -228,7 +237,7 @@ function updateArguments( argName, generateVariableName(argName), argType, - serializeInputValue(argType, newArgs[argName]) + value ); } } diff --git a/packages/utils/src/transformInputValue.ts b/packages/utils/src/transformInputValue.ts index ef0318a8967..d2465cfe7cc 100644 --- a/packages/utils/src/transformInputValue.ts +++ b/packages/utils/src/transformInputValue.ts @@ -1,4 +1,5 @@ import { GraphQLInputType, getNullableType, isLeafType, isListType, isInputObjectType } from 'graphql'; +import { asArray } from './helpers.js'; import { InputLeafValueTransformer, InputObjectValueTransformer, Maybe } from './types.js'; @@ -17,7 +18,7 @@ export function transformInputValue( if (isLeafType(nullableType)) { return inputLeafValueTransformer != null ? inputLeafValueTransformer(nullableType, value) : value; } else if (isListType(nullableType)) { - return value.map((listMember: any) => + return asArray(value).map((listMember: any) => transformInputValue(nullableType.ofType, listMember, inputLeafValueTransformer, inputObjectValueTransformer) ); } else if (isInputObjectType(nullableType)) {