diff --git a/.changeset/orange-pillows-decide.md b/.changeset/orange-pillows-decide.md new file mode 100644 index 00000000000..6f345c54be1 --- /dev/null +++ b/.changeset/orange-pillows-decide.md @@ -0,0 +1,10 @@ +--- +'@graphql-codegen/visitor-plugin-common': patch +'@graphql-codegen/typescript-resolvers': patch +--- + +Fix generateInternalResolversIfNeeded.\_\_resolveReference making the resolver required + +`__resolveReference`'s default behaviour when not declared is to pass the ref to subsequent resolvers i.e. becoming the `parent`. So, it means we don't have to make this resolver required. + +This patch makes `__resolveReference` optional when `generateInternalResolversIfNeeded.__resolveReference` is set to true. diff --git a/packages/plugins/other/visitor-plugin-common/src/base-resolvers-visitor.ts b/packages/plugins/other/visitor-plugin-common/src/base-resolvers-visitor.ts index 19351915e15..6adb71df597 100644 --- a/packages/plugins/other/visitor-plugin-common/src/base-resolvers-visitor.ts +++ b/packages/plugins/other/visitor-plugin-common/src/base-resolvers-visitor.ts @@ -1531,7 +1531,6 @@ export class BaseResolversVisitor< if (!federationDetails || federationDetails.resolvableKeyDirectives.length === 0) { return ''; } - signature.modifier = ''; // if a federation type has resolvable @key, then it should be required } this._federation.setMeta(parentType.name, { hasResolveReference: true }); diff --git a/packages/plugins/typescript/resolvers/tests/ts-resolvers.federation.spec.ts b/packages/plugins/typescript/resolvers/tests/ts-resolvers.federation.spec.ts index 7aae74ee79c..1cae62b4c31 100644 --- a/packages/plugins/typescript/resolvers/tests/ts-resolvers.federation.spec.ts +++ b/packages/plugins/typescript/resolvers/tests/ts-resolvers.federation.spec.ts @@ -212,7 +212,7 @@ describe('TypeScript Resolvers Plugin + Apollo Federation', () => { // User should have __resolveReference because it has resolvable @key (by default) expect(content).toBeSimilarStringTo(` export type UserResolvers = { - __resolveReference: ReferenceResolver, { __typename: 'User' } & GraphQLRecursivePick, ContextType>; + __resolveReference?: ReferenceResolver, { __typename: 'User' } & GraphQLRecursivePick, ContextType>; id?: Resolver; name?: Resolver, ParentType, ContextType>; username?: Resolver, ParentType, ContextType>; @@ -223,7 +223,7 @@ describe('TypeScript Resolvers Plugin + Apollo Federation', () => { // SingleResolvable has __resolveReference because it has resolvable: true expect(content).toBeSimilarStringTo(` export type SingleResolvableResolvers = { - __resolveReference: ReferenceResolver, { __typename: 'SingleResolvable' } & GraphQLRecursivePick, ContextType>; + __resolveReference?: ReferenceResolver, { __typename: 'SingleResolvable' } & GraphQLRecursivePick, ContextType>; id?: Resolver; __isTypeOf?: IsTypeOfResolverFn; }; @@ -240,7 +240,7 @@ describe('TypeScript Resolvers Plugin + Apollo Federation', () => { // AtLeastOneResolvable has __resolveReference because it at least one resolvable expect(content).toBeSimilarStringTo(` export type AtLeastOneResolvableResolvers = { - __resolveReference: ReferenceResolver, { __typename: 'AtLeastOneResolvable' } & GraphQLRecursivePick, ContextType>; + __resolveReference?: ReferenceResolver, { __typename: 'AtLeastOneResolvable' } & GraphQLRecursivePick, ContextType>; id?: Resolver; id2?: Resolver; id3?: Resolver; @@ -251,7 +251,7 @@ describe('TypeScript Resolvers Plugin + Apollo Federation', () => { // MixedResolvable has __resolveReference and references for resolvable keys expect(content).toBeSimilarStringTo(` export type MixedResolvableResolvers = { - __resolveReference: ReferenceResolver, { __typename: 'MixedResolvable' } & (GraphQLRecursivePick | GraphQLRecursivePick), ContextType>; + __resolveReference?: ReferenceResolver, { __typename: 'MixedResolvable' } & (GraphQLRecursivePick | GraphQLRecursivePick), ContextType>; id?: Resolver; id2?: Resolver; id3?: Resolver;