From 6059c408a0636f0fe104c57b9ef4147b30b9147b Mon Sep 17 00:00:00 2001 From: Nicolas C Date: Thu, 11 Jun 2020 16:15:01 +0200 Subject: [PATCH] fix(stitchSchemas): subschemas with object inputs and mergeTypes as true (#1631) --- packages/stitch/src/typeCandidates.ts | 19 +++++++++++++++++++ .../tests/alternateStitchSchemas.test.ts | 16 ++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/packages/stitch/src/typeCandidates.ts b/packages/stitch/src/typeCandidates.ts index add9e6d4ad5..d76a4c33b4c 100644 --- a/packages/stitch/src/typeCandidates.ts +++ b/packages/stitch/src/typeCandidates.ts @@ -16,9 +16,12 @@ import { isInterfaceType, isUnionType, isEnumType, + isInputObjectType, SchemaDefinitionNode, SchemaExtensionNode, GraphQLFieldConfigMap, + GraphQLInputObjectType, + GraphQLInputFieldConfigMap, } from 'graphql'; import { wrapSchema } from '@graphql-tools/wrap'; @@ -277,6 +280,22 @@ function merge(typeName: string, candidates: Array): GraphQL extensionASTNodes: initialCandidateType.extensionASTNodes, }; return new GraphQLObjectType(config); + } else if (isInputObjectType(initialCandidateType)) { + const config = { + name: typeName, + fields: candidates.reduce( + (acc, candidate) => ({ + ...acc, + ...(candidate.type as GraphQLInputObjectType).toConfig().fields, + }), + {} + ), + description: initialCandidateType.description, + extensions: initialCandidateType.extensions, + astNode: initialCandidateType.astNode, + extensionASTNodes: initialCandidateType.extensionASTNodes, + }; + return new GraphQLInputObjectType(config); } else if (isInterfaceType(initialCandidateType)) { const config = { name: typeName, diff --git a/packages/stitch/tests/alternateStitchSchemas.test.ts b/packages/stitch/tests/alternateStitchSchemas.test.ts index 41191128f73..cd8b6097eae 100644 --- a/packages/stitch/tests/alternateStitchSchemas.test.ts +++ b/packages/stitch/tests/alternateStitchSchemas.test.ts @@ -1853,6 +1853,10 @@ describe('mergeTypes', () => { beforeEach(() => { const typeDefs1 = ` + input ObjectInput { + val: String! + } + type Query { rootField1: Wrapper getTest(id: ID): Test @@ -1981,6 +1985,18 @@ describe('mergeTypes', () => { }, }, }); + + const stitchedSchemaWithMerge = stitchSchemas({ + subschemas: [subschemaConfig1, subschemaConfig2], + mergeTypes: true, + }) + + const result2 = await graphql( + stitchedSchemaWithMerge, + `{ rootField1 { test { id } } }` + ); + + expect(result2).toEqual({ data: { rootField1: { test: { id: '1' } } } }) }); });