Skip to content

Next major version feature branch #10218

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 9 commits into
base: master
Choose a base branch
from
7 changes: 7 additions & 0 deletions .changeset/angry-lamps-notice.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@graphql-codegen/visitor-plugin-common': major
'@graphql-codegen/typescript-resolvers': major
'@graphql-codegen/plugin-helpers': major
---

BREAKING CHANGES: Do not generate \_\_isTypeOf for non-implementing types or non-union members
10 changes: 10 additions & 0 deletions .changeset/loud-suits-admire.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
'@graphql-codegen/visitor-plugin-common': major
'@graphql-codegen/typescript-resolvers': major
'@graphql-codegen/plugin-helpers': major
---

Ensure Federation Interfaces have `__resolveReference` if they are resolvable entities

BREAKING CHANGES: Deprecate `onlyResolveTypeForInterfaces` because majority of use cases cannot implement resolvers in Interfaces.
BREAKING CHANGES: Deprecate `generateInternalResolversIfNeeded.__resolveReference` because types do not have `__resolveReference` if they are not Federation entities or are not resolvable. Users should not have to manually set this option. This option was put in to wait for this major version.
7 changes: 7 additions & 0 deletions .changeset/lovely-snails-travel.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@graphql-codegen/visitor-plugin-common': major
'@graphql-codegen/typescript-resolvers': major
'@graphql-codegen/plugin-helpers': major
---

BREAKING CHANGE: Improve Federation Entity's resolvers' parent param type: These types were using reference types inline. This makes it hard to handle mappers. The Parent type now all comes from ParentResolverTypes to make handling mappers and parent types simpler.
11 changes: 11 additions & 0 deletions .changeset/thick-pianos-smoke.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
'@graphql-codegen/visitor-plugin-common': major
'@graphql-codegen/typescript-resolvers': major
'@graphql-codegen/plugin-helpers': major
---

Fix `mappers` usage with Federation

`mappers` was previously used as `__resolveReference`'s first param (usually called "reference"). However, this is incorrect because `reference` interface comes directly from `@key` and `@requires` directives. This patch fixes the issue by creating a new `FederationTypes` type and use it as the base for federation entity types when being used to type entity references.

BREAKING CHANGES: No longer generate `UnwrappedObject` utility type, as this was used to support the wrong previously generated type.
1 change: 1 addition & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ on:
pull_request:
branches:
- master
- federation-fixes # FIXME: Remove this line after the PR is merged

env:
NODE_OPTIONS: '--max_old_space_size=4096'
Expand Down
3 changes: 0 additions & 3 deletions dev-test/modules/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,6 @@ export type ArticleResolvers<
id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
text?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
title?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};

export type CreditCardResolvers<
Expand All @@ -241,7 +240,6 @@ export type DonationResolvers<
id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
recipient?: Resolver<ResolversTypes['User'], ParentType, ContextType>;
sender?: Resolver<ResolversTypes['User'], ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};

export type MutationResolvers<
Expand Down Expand Up @@ -298,7 +296,6 @@ export type UserResolvers<
id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
lastName?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
paymentOptions?: Resolver<Maybe<Array<ResolversTypes['PaymentOption']>>, ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};

export type Resolvers<ContextType = any> = {
Expand Down
2 changes: 0 additions & 2 deletions dev-test/subpath-import/result.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,6 @@ export type UserResolvers<
name?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
password?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
updatedAt?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};

export type MutationResolvers<
Expand All @@ -157,7 +156,6 @@ export type MutationResolvers<
FiedContextType,
RequireFields<MutationCreateUserArgs, 'email' | 'name' | 'password'>
>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};

export type Resolvers<ContextType = TestContext> = {
Expand Down
36 changes: 18 additions & 18 deletions dev-test/test-schema/resolvers-federation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,11 @@ export type DirectiveResolverFn<TResult = {}, TParent = {}, TContext = {}, TArgs
info: GraphQLResolveInfo
) => TResult | Promise<TResult>;

/** Mapping of federation types */
export type FederationTypes = {
User: User;
};

/** Mapping between all available schema types and the resolvers types */
export type ResolversTypes = {
Address: ResolverTypeWrapper<Address>;
Expand All @@ -149,7 +154,13 @@ export type ResolversParentTypes = {
ID: Scalars['ID']['output'];
Lines: Lines;
Query: {};
User: User;
User:
| User
| ({ __typename: 'User' } & (
| GraphQLRecursivePick<FederationTypes['User'], { id: true }>
| GraphQLRecursivePick<FederationTypes['User'], { name: true }>
) &
GraphQLRecursivePick<FederationTypes['User'], { address: { city: true; lines: { line2: true } } }>);
Int: Scalars['Int']['output'];
Boolean: Scalars['Boolean']['output'];
};
Expand All @@ -161,15 +172,13 @@ export type AddressResolvers<
city?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
lines?: Resolver<ResolversTypes['Lines'], ParentType, ContextType>;
state?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};

export type BookResolvers<
ContextType = any,
ParentType extends ResolversParentTypes['Book'] = ResolversParentTypes['Book']
> = {
id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};

export type LinesResolvers<
Expand All @@ -178,7 +187,6 @@ export type LinesResolvers<
> = {
line1?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
line2?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};

export type QueryResolvers<
Expand All @@ -190,28 +198,20 @@ export type QueryResolvers<

export type UserResolvers<
ContextType = any,
ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User']
ParentType extends ResolversParentTypes['User'] = ResolversParentTypes['User'],
FederationType extends FederationTypes['User'] = FederationTypes['User']
> = {
__resolveReference?: ReferenceResolver<
Maybe<ResolversTypes['User']>,
{ __typename: 'User' } & (
| GraphQLRecursivePick<ParentType, { id: true }>
| GraphQLRecursivePick<ParentType, { name: true }>
),
ContextType
>;

email?: Resolver<
ResolversTypes['String'],
{ __typename: 'User' } & (
| GraphQLRecursivePick<ParentType, { id: true }>
| GraphQLRecursivePick<ParentType, { name: true }>
| GraphQLRecursivePick<FederationType, { id: true }>
| GraphQLRecursivePick<FederationType, { name: true }>
) &
GraphQLRecursivePick<ParentType, { address: { city: true; lines: { line2: true } } }>,
GraphQLRecursivePick<FederationType, { address: { city: true; lines: { line2: true } } }>,
ContextType
>;

__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
email?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
};

export type Resolvers<ContextType = any> = {
Expand Down
2 changes: 0 additions & 2 deletions dev-test/test-schema/resolvers-root.ts
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,6 @@ export type QueryResolvers<
ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']
> = {
someDummyField?: Resolver<ResolversTypes['Int'], ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};

export type QueryRootResolvers<
Expand Down Expand Up @@ -172,7 +171,6 @@ export type UserResolvers<
email?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
id?: Resolver<ResolversTypes['Int'], ParentType, ContextType>;
name?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};

export type Resolvers<ContextType = any> = {
Expand Down
1 change: 0 additions & 1 deletion dev-test/test-schema/resolvers-stitching.ts
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,6 @@ export type UserResolvers<
email?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
id?: Resolver<ResolversTypes['Int'], ParentType, ContextType>;
name?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};

export type Resolvers<ContextType = any> = {
Expand Down
1 change: 0 additions & 1 deletion dev-test/test-schema/resolvers-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,6 @@ export type UserResolvers<
email?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
id?: Resolver<ResolversTypes['Int'], ParentType, ContextType>;
name?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};

export type Resolvers<ContextType = any> = {
Expand Down
1 change: 0 additions & 1 deletion dev-test/test-schema/typings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,6 @@ export type UserResolvers<
email?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
id?: Resolver<ResolversTypes['Int'], ParentType, ContextType>;
name?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};

export type Resolvers<ContextType = any> = {
Expand Down
Loading
Loading