Skip to content
This repository was archived by the owner on Dec 8, 2021. It is now read-only.

Commit 6b2fdd7

Browse files
author
Jason Kuhrt
authored
feat: make apollo iresolvers compatible with gg resolvers (#444)
closes #15
1 parent dcedf5f commit 6b2fdd7

File tree

7 files changed

+94
-0
lines changed

7 files changed

+94
-0
lines changed

docs/01-configuration.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ The configuration file must be called **`graphqlgen.yml`**.
1515
- `output`: Specifies where the scaffolded resolvers should be located. Must point to a **directory**.
1616
- `layout`: Specifies the [_layout_](#layouts) for the generated files. Possible values: `file-per-type` (more layouts [coming soon](https://github.com/prisma/graphqlgen/issues/106): `single-file`, `file-per-type-classes`, `single-file-classes`).
1717
- `default-resolvers`: A boolean dictating if default resolvers will be generated or not. Defaults to `true`.
18+
- `iresolvers-augmentation`: A boolean dictating if Apollo Server IResolvers type should be augmented so that it is compatible with graphqlgen `Resolvers` type. Defaults to `true`.
1819

1920
Whether a property is required or not depends on whether you're doing [Generation](#generation) or [Scaffolding](#scaffolding).
2021

packages/graphqlgen-json-schema/src/definition.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export interface GraphQLGenDefinition {
66
output: string
77
['resolver-scaffolding']?: ResolverScaffolding
88
['default-resolvers']?: boolean
9+
['iresolvers-augmentation']?: boolean
910
}
1011

1112
export interface Models {

packages/graphqlgen/src/generators/typescript/generator.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,38 @@ export function generate(args: GenerateArgs): string {
9898
9999
${renderResolvers(args)}
100100
101+
${
102+
args.iResolversAugmentationEnabled
103+
? renderGraphqlToolsModuleAugmentationIResolvers()
104+
: ''
105+
}
106+
107+
`
108+
}
109+
110+
/**
111+
* This renders a TypeScript module augmentation against graphql-tools
112+
* IResolvers type. Apollo Server uses that type to type its resolvers.
113+
* The problem with that type is that it is very loose compared to
114+
* graphqlgen including being an index type. The index type in particular
115+
* breaks compatibility with the resolvers generated by graphqlgen. We
116+
* fix this by augmenting the IResolvers type.
117+
*
118+
* References:
119+
*
120+
* - https://www.typescriptlang.org/docs/handbook/declaration-merging.html
121+
* - https://github.com/prisma/graphqlgen/issues/15
122+
*/
123+
const renderGraphqlToolsModuleAugmentationIResolvers = (): string => {
124+
// Use ts-ignore otherwise tests will throw an error about no such
125+
// module being found. Further, if a user for some reason is not using
126+
// Apollo Server, then this augmentation doesn't matter anyways, and
127+
// should not throw an exception for them either.
128+
return `
129+
// @ts-ignore
130+
declare module "graphql-tools" {
131+
interface IResolvers extends Resolvers {}
132+
}
101133
`
102134
}
103135

packages/graphqlgen/src/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,10 @@ export function generateCode(codeGenArgs: CodeGenArgs): CodeGenResult {
105105
typeof codeGenArgs.config['default-resolvers'] === 'boolean'
106106
? codeGenArgs.config['default-resolvers']
107107
: true,
108+
iResolversAugmentationEnabled:
109+
typeof codeGenArgs.config['iresolvers-augmentation'] === 'boolean'
110+
? codeGenArgs.config['iresolvers-augmentation']
111+
: true,
108112
}
109113

110114
const generatedTypes = generateTypes(generateArgs, codeGenArgs)

packages/graphqlgen/src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export interface GenerateArgs {
1515
context?: ContextDefinition
1616
modelMap: ModelMap
1717
defaultResolversEnabled: boolean
18+
iResolversAugmentationEnabled: boolean
1819
}
1920

2021
export interface ModelMap {

packages/graphqlgen/tests/typescript/__snapshots__/basic.test.ts.snap

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,11 @@ export interface Resolvers {
205205
Query: QueryResolvers.Type;
206206
User: UserResolvers.Type;
207207
}
208+
209+
// @ts-ignore
210+
declare module \\"graphql-tools\\" {
211+
interface IResolvers extends Resolvers {}
212+
}
208213
"
209214
`;
210215

@@ -455,6 +460,11 @@ export interface Resolvers {
455460
Mutation: MutationResolvers.Type;
456461
AddMemberPayload: AddMemberPayloadResolvers.Type;
457462
}
463+
464+
// @ts-ignore
465+
declare module \\"graphql-tools\\" {
466+
interface IResolvers extends Resolvers {}
467+
}
458468
"
459469
`;
460470

@@ -935,6 +945,11 @@ export interface Resolvers {
935945
Video: VideoResolvers.Type;
936946
Media?: MediaResolvers.Type;
937947
}
948+
949+
// @ts-ignore
950+
declare module \\"graphql-tools\\" {
951+
interface IResolvers extends Resolvers {}
952+
}
938953
"
939954
`;
940955

@@ -1156,6 +1171,11 @@ export interface Resolvers {
11561171
Mutation: MutationResolvers.Type;
11571172
AddMemberPayload: AddMemberPayloadResolvers.Type;
11581173
}
1174+
1175+
// @ts-ignore
1176+
declare module \\"graphql-tools\\" {
1177+
interface IResolvers extends Resolvers {}
1178+
}
11591179
"
11601180
`;
11611181

@@ -1775,6 +1795,11 @@ export interface Resolvers {
17751795
Query: QueryResolvers.Type;
17761796
Number: NumberResolvers.Type;
17771797
}
1798+
1799+
// @ts-ignore
1800+
declare module \\"graphql-tools\\" {
1801+
interface IResolvers extends Resolvers {}
1802+
}
17781803
"
17791804
`;
17801805

@@ -2098,6 +2123,11 @@ export interface Resolvers {
20982123
User: UserResolvers.Type;
20992124
UserType?: UserTypeResolvers.Type;
21002125
}
2126+
2127+
// @ts-ignore
2128+
declare module \\"graphql-tools\\" {
2129+
interface IResolvers extends Resolvers {}
2130+
}
21012131
"
21022132
`;
21032133

@@ -2289,6 +2319,11 @@ export interface Resolvers {
22892319
Query: QueryResolvers.Type;
22902320
User: UserResolvers.Type;
22912321
}
2322+
2323+
// @ts-ignore
2324+
declare module \\"graphql-tools\\" {
2325+
interface IResolvers extends Resolvers {}
2326+
}
22922327
"
22932328
`;
22942329

@@ -2919,6 +2954,11 @@ export interface Resolvers {
29192954
Query: QueryResolvers.Type;
29202955
Number: NumberResolvers.Type;
29212956
}
2957+
2958+
// @ts-ignore
2959+
declare module \\"graphql-tools\\" {
2960+
interface IResolvers extends Resolvers {}
2961+
}
29222962
"
29232963
`;
29242964

@@ -3574,6 +3614,11 @@ export interface Resolvers {
35743614
Query: QueryResolvers.Type;
35753615
Number: NumberResolvers.Type;
35763616
}
3617+
3618+
// @ts-ignore
3619+
declare module \\"graphql-tools\\" {
3620+
interface IResolvers extends Resolvers {}
3621+
}
35773622
"
35783623
`;
35793624

@@ -3753,6 +3798,11 @@ export interface Resolvers {
37533798
Subscription: SubscriptionResolvers.Type;
37543799
User: UserResolvers.Type;
37553800
}
3801+
3802+
// @ts-ignore
3803+
declare module \\"graphql-tools\\" {
3804+
interface IResolvers extends Resolvers {}
3805+
}
37563806
"
37573807
`;
37583808

packages/graphqlgen/tests/typescript/__snapshots__/large-schema.test.ts.snap

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8530,6 +8530,11 @@ export interface Resolvers {
85308530
AuthPayload: AuthPayloadResolvers.Type;
85318531
MutationResult: MutationResultResolvers.Type;
85328532
}
8533+
8534+
// @ts-ignore
8535+
declare module \\"graphql-tools\\" {
8536+
interface IResolvers extends Resolvers {}
8537+
}
85338538
"
85348539
`;
85358540

0 commit comments

Comments
 (0)