Skip to content

Commit 2dde956

Browse files
authored
fix(gatsby): merge resolveType when merging abstract types (#31710)
1 parent 30d212d commit 2dde956

File tree

2 files changed

+91
-0
lines changed

2 files changed

+91
-0
lines changed

packages/gatsby/src/schema/__tests__/build-schema.js

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -979,6 +979,70 @@ describe(`Build schema`, () => {
979979
expect(interfaces).toEqual([`Foo`, `Bar`])
980980
})
981981

982+
it(`merges resolveType for abstract types (Type Builder)`, async () => {
983+
createTypes(
984+
[
985+
`interface Foo { foo: String }`,
986+
`
987+
type Fizz { id: ID! }
988+
type Buzz { id: ID! }
989+
union FizzBuzz = Fizz | Buzz
990+
`,
991+
buildInterfaceType({
992+
name: `Foo`,
993+
fields: { id: `ID!` },
994+
resolveType: source => source.expectedType,
995+
}),
996+
buildUnionType({
997+
name: `FizzBuzz`,
998+
resolveType: source => (source.isFizz ? `Fizz` : `Buzz`),
999+
}),
1000+
],
1001+
{
1002+
name: `default-site-plugin`,
1003+
}
1004+
)
1005+
const schema = await buildSchema()
1006+
const Foo = schema.getType(`Foo`)
1007+
expect(Foo.resolveType({ expectedType: `Bar` })).toEqual(`Bar`)
1008+
1009+
const FizzBuzz = schema.getType(`FizzBuzz`)
1010+
expect(FizzBuzz.resolveType({ isFizz: true })).toEqual(`Fizz`)
1011+
expect(FizzBuzz.resolveType({ isFizz: false })).toEqual(`Buzz`)
1012+
})
1013+
1014+
it(`merges resolveType for abstract types (graphql-js)`, async () => {
1015+
createTypes(
1016+
[
1017+
`interface Foo { foo: String }`,
1018+
`
1019+
type Fizz { id: ID! }
1020+
type Buzz { id: ID! }
1021+
union FizzBuzz = Fizz | Buzz
1022+
`,
1023+
new GraphQLInterfaceType({
1024+
name: `Foo`,
1025+
fields: { foo: { type: GraphQLString } },
1026+
resolveType: source => source.expectedType,
1027+
}),
1028+
new GraphQLUnionType({
1029+
name: `FizzBuzz`,
1030+
resolveType: source => (source.isFizz ? `Fizz` : `Buzz`),
1031+
}),
1032+
],
1033+
{
1034+
name: `default-site-plugin`,
1035+
}
1036+
)
1037+
const schema = await buildSchema()
1038+
const Foo = schema.getType(`Foo`)
1039+
expect(Foo.resolveType({ expectedType: `Bar` })).toEqual(`Bar`)
1040+
1041+
const FizzBuzz = schema.getType(`FizzBuzz`)
1042+
expect(FizzBuzz.resolveType({ isFizz: true })).toEqual(`Fizz`)
1043+
expect(FizzBuzz.resolveType({ isFizz: false })).toEqual(`Buzz`)
1044+
})
1045+
9821046
it(`merges plugin-defined type (Type Builder) with overridable built-in type without warning`, async () => {
9831047
createTypes(
9841048
[

packages/gatsby/src/schema/schema.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const {
88
GraphQLList,
99
GraphQLObjectType,
1010
GraphQLInterfaceType,
11+
GraphQLUnionType,
1112
} = require(`graphql`)
1213
const {
1314
ObjectTypeComposer,
@@ -406,6 +407,15 @@ const mergeTypes = ({
406407
type.getInterfaces().forEach(iface => typeComposer.addInterface(iface))
407408
}
408409

410+
if (
411+
type instanceof GraphQLInterfaceType ||
412+
type instanceof InterfaceTypeComposer ||
413+
type instanceof GraphQLUnionType ||
414+
type instanceof UnionTypeComposer
415+
) {
416+
mergeResolveType({ typeComposer, type })
417+
}
418+
409419
if (isNamedTypeComposer(type)) {
410420
typeComposer.extendExtensions(type.getExtensions())
411421
}
@@ -1387,3 +1397,20 @@ const mergeFields = ({ typeComposer, fields }) =>
13871397
typeComposer.setField(fieldName, fieldConfig)
13881398
}
13891399
})
1400+
1401+
const mergeResolveType = ({ typeComposer, type }) => {
1402+
if (
1403+
(type instanceof GraphQLInterfaceType ||
1404+
type instanceof GraphQLUnionType) &&
1405+
type.resolveType
1406+
) {
1407+
typeComposer.setResolveType(type.resolveType)
1408+
}
1409+
if (
1410+
(type instanceof InterfaceTypeComposer ||
1411+
type instanceof UnionTypeComposer) &&
1412+
type.getResolveType()
1413+
) {
1414+
typeComposer.setResolveType(type.getResolveType())
1415+
}
1416+
}

0 commit comments

Comments
 (0)