diff --git a/docs/01-configuration.md b/docs/01-configuration.md index d95a1222..a1329f32 100644 --- a/docs/01-configuration.md +++ b/docs/01-configuration.md @@ -15,6 +15,7 @@ The configuration file must be called **`graphqlgen.yml`**. - `output`: Specifies where the scaffolded resolvers should be located. Must point to a **directory**. - `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`). - `default-resolvers`: A boolean dictating if default resolvers will be generated or not. Defaults to `true`. +- `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`. Whether a property is required or not depends on whether you're doing [Generation](#generation) or [Scaffolding](#scaffolding). diff --git a/packages/graphqlgen-json-schema/src/definition.ts b/packages/graphqlgen-json-schema/src/definition.ts index 6f0def1e..48bc2b5a 100644 --- a/packages/graphqlgen-json-schema/src/definition.ts +++ b/packages/graphqlgen-json-schema/src/definition.ts @@ -6,6 +6,7 @@ export interface GraphQLGenDefinition { output: string ['resolver-scaffolding']?: ResolverScaffolding ['default-resolvers']?: boolean + ['iresolvers-augmentation']?: boolean } export interface Models { diff --git a/packages/graphqlgen/src/generators/typescript/generator.ts b/packages/graphqlgen/src/generators/typescript/generator.ts index c095b58e..a50fe15f 100644 --- a/packages/graphqlgen/src/generators/typescript/generator.ts +++ b/packages/graphqlgen/src/generators/typescript/generator.ts @@ -98,6 +98,33 @@ export function generate(args: GenerateArgs): string { ${renderResolvers(args)} + ${ + args.iResolversAugmentationEnabled + ? renderGraphqlToolsModuleAugmentationIResolvers() + : '' + } + + ` +} + +/** + * This renders a TypeScript module augmentation against graphql-tools + * IResolvers type. Apollo Server uses that type to type its resolvers. + * The problem with that type is that it is very loose compared to + * graphqlgen including being an index type. The index type in particular + * breaks compatibility with the resolvers generated by graphqlgen. We + * fix this by augmenting the IResolvers type. + * + * References: + * + * - https://www.typescriptlang.org/docs/handbook/declaration-merging.html + * - https://github.com/prisma/graphqlgen/issues/15 + */ +const renderGraphqlToolsModuleAugmentationIResolvers = (): string => { + return ` + declare module "graphql-tools" { + interface IResolvers extends Resolvers {} + } ` } diff --git a/packages/graphqlgen/src/index.ts b/packages/graphqlgen/src/index.ts index 4921171f..c721482f 100644 --- a/packages/graphqlgen/src/index.ts +++ b/packages/graphqlgen/src/index.ts @@ -105,6 +105,10 @@ export function generateCode(codeGenArgs: CodeGenArgs): CodeGenResult { typeof codeGenArgs.config['default-resolvers'] === 'boolean' ? codeGenArgs.config['default-resolvers'] : true, + iResolversAugmentationEnabled: + typeof codeGenArgs.config['iresolvers-augmentation'] === 'boolean' + ? codeGenArgs.config['iresolvers-augmentation'] + : true, } const generatedTypes = generateTypes(generateArgs, codeGenArgs) diff --git a/packages/graphqlgen/src/types.ts b/packages/graphqlgen/src/types.ts index 0b3cbbb6..5d7c0e02 100644 --- a/packages/graphqlgen/src/types.ts +++ b/packages/graphqlgen/src/types.ts @@ -15,6 +15,7 @@ export interface GenerateArgs { context?: ContextDefinition modelMap: ModelMap defaultResolversEnabled: boolean + iResolversAugmentationEnabled: boolean } export interface ModelMap {