From 84e8cc6c388aac34b65d41301aa9b43742f7fe61 Mon Sep 17 00:00:00 2001 From: gilgardosh Date: Wed, 11 Jan 2023 18:35:01 +0200 Subject: [PATCH] Handle array field types used for alias field name --- .../utils/src/build-operation-for-field.ts | 2 +- .../build-operation-node-for-field.spec.ts | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/utils/src/build-operation-for-field.ts b/packages/utils/src/build-operation-for-field.ts index 02cc32fa467..83715fb229c 100644 --- a/packages/utils/src/build-operation-for-field.ts +++ b/packages/utils/src/build-operation-for-field.ts @@ -476,7 +476,7 @@ function resolveField({ const fieldPathStr = fieldPath.join('.'); let fieldName = field.name; if (fieldTypeMap.has(fieldPathStr) && fieldTypeMap.get(fieldPathStr) !== field.type.toString()) { - fieldName += (field.type as any).toString().replace('!', 'NonNull'); + fieldName += (field.type as any).toString().replace('!', 'NonNull').replace('[', 'List').replace(']', ''); } fieldTypeMap.set(fieldPathStr, field.type.toString()); diff --git a/packages/utils/tests/build-operation-node-for-field.spec.ts b/packages/utils/tests/build-operation-node-for-field.spec.ts index 9f7a0419e1c..9e79e6f8a4d 100644 --- a/packages/utils/tests/build-operation-node-for-field.spec.ts +++ b/packages/utils/tests/build-operation-node-for-field.spec.ts @@ -1,6 +1,7 @@ import { print, parse, buildSchema, ASTNode, OperationTypeNode } from 'graphql'; import { buildOperationNodeForField } from '../src/build-operation-for-field.js'; +import { parseGraphQLSDL } from '../src/parse-graphql-sdl.js'; function clean(doc: string | ASTNode) { return print(typeof doc === 'string' ? parse(doc) : doc).trim(); @@ -46,6 +47,16 @@ const schema = buildSchema(/* GraphQL */ ` comments(filter: String!): [String!]! } + type BestFood { + recommendation: Food + } + + type BestFoods { + recommendation: [Food] + } + + union Recommendations = BestFood | BestFoods + type Query { me: User user(id: ID!): User @@ -53,6 +64,7 @@ const schema = buildSchema(/* GraphQL */ ` menu: [Food] menuByIngredients(ingredients: [String!]!): [Food] feed: [Post] + recommendations: Recommendations } type Mutation { @@ -640,3 +652,16 @@ test('selectedFields', async () => { `) ); }); + +test('should handle array field types used for alias field names', async () => { + const document = buildOperationNodeForField({ + schema, + kind: 'query' as OperationTypeNode, + field: 'recommendations', + depthLimit: 3, + })!; + const virtualFileName = document.name?.value || 'defaultName'; + const rawSDL = print(document); + const source = parseGraphQLSDL(`${virtualFileName}.graphql`, rawSDL); + expect(source).toBeDefined(); +});