
Security News
Meet Socket at Black Hat Europe and BSides London 2025
Socket is heading to London! Stop by our booth or schedule a meeting to see what we've been working on.
@eddeee888/gcg-typescript-resolver-files
Advanced tools
This [GraphQL Code Generator](https://www.the-guild.dev/graphql/codegen) plugin creates resolvers given GraphQL schema.
This GraphQL Code Generator plugin creates resolvers given GraphQL schema.
This relies on types generated from @graphql-codegen/typescript and @graphql-codegen/typescript-resolvers plugins.
yarn add -D @graphql-codegen/cli @eddeee888/gcg-typescript-resolver-files
yarn add graphql-scalars
Mapper suffix) from accompanying .mappers.ts files in each module. For example, if the schema file is /path/to/schema.graphql, the mapper file is /path/to/schema.mappers.ts.# src/schema/base/schema.graphql
type Query
# src/schema/user/schema.graphql
extend type Query {
user(id: ID!): User
}
type User {
id: ID!
fullName: String!
}
type Address {
id: ID!
address: String!
}
// src/schema/user/schema.mappers.ts
// Exporting the following Mapper interfaces and types is the equivalent of this codegen config:
// ```yml
// mappers:
// Address: './user/schema.mappers#AddressMapper'
// User: './user/schema.mappers#UserMapper'
// ```
export { Address as AddressMapper } from 'address-package';
export interface UserMapper {
id: string;
firstName: string;
lastName: string;
}
// codegen.ts
import type { CodegenConfig } from '@graphql-codegen/cli';
import { defineConfig } from '@eddeee888/gcg-typescript-resolver-files';
const config: CodegenConfig = {
schema: '**/schema.graphql',
generates: {
'src/schema': defineConfig(),
},
};
export default config;
OR
# codegen.yml
schema: '**/*.graphql'
generates:
src/schema:
preset: '@eddeee888/gcg-typescript-resolver-files'
watchPattern: '**/*.mappers.ts'
Running codegen will generate the following files:
src/schema/user/resolvers/Query/user.tssrc/schema/user/resolvers/User.tssrc/schema/user/resolvers/Address.tssrc/schema/resolvers.generated.tssrc/schema/typeDefs.generated.tssrc/schema/types.generated.tsmerged or modules (Default: modules)
How files are collocated. modules detects containing dir of a schema file as "modules", then split resolvers into those modules. merged treats baseOutputDir as the one and only module and generates resolvers.
last or first or a number (Default: last)
Specifies how the plugin determines the module name for each schema file.
last: The module name is derived from the last directory (within the schema directory) in the file's path.first: The module name is derived from the first directory (within the schema directory) in the file's path.For example:
src/schema/foo/bar/baz/User.graphql => module name is bazsrc/schema/foo/bar/baz/User.graphql => module name is foosrc/schema/foo/bar/baz/User.graphql => module name is barsrc/schema/foo/bar/baz/User.graphql => module name is barstring (Default: ./types.generated.ts)
Relative path to type file generated by typescript-resolvers plugin.
string (Default: resolvers)
Relative path to target dir. For config.mode=merged, files will be generated into <baseOutputDir>/<resolverRelativeTargetDir>. For config.mode=modules, files will be generated into <baseOutputDir>/**/<moduleName>/<resolverRelativeTargetDir>.
merged or modules (Default: merged)
How to generate file/s that put resolvers map together:
merged: one filemodules: one file per modulestring (Default: resolvers.generated.ts)
File that puts all generated resolvers together. Relative from baseOutputDir.
disabled or minimal or recommended or all or object (Default: recommended)
Decides which resolvers to generate:
disabled: generates no resolvers. Use this if you want to use your own structures. Note: if custom scalars are detected and used, resolver main files are still generated.minimal: generates root-level resolvers only.recommended: generates root-level and object resolvers. Use this if you want a managed experience.
typescript-resolvers that make these not required.all: generates all resolvers. Use this if you want all resolvers to be generated and use the ones you need.Internally, each string option is turned into an object. This object uses glob pattern to tell which files to be generated based on the file's normalized name (*). For example, recommended option is the equivalent of the following object:
{
query: '*',
mutation: '*',
subscription: '*',
scalar: '*',
object: '*',
union: '',
interface: '',
enum: '',
}
(*) A normalized name has the following shape: <Module name>.<Top-level type name>.<Field resolver>?
Consider this schema:
# src/schema/pet/schema.graphql
extend type Query {
pets: [Pet!]!
}
type Cat {
id: ID!
}
type Dog {
id: ID!
}
union Pet = Cat | Dog
# src/schema/user/schema.graphql
extend type Mutation {
createUser(id: ID!): CreateUserResult!
}
type User {
id: ID!
}
type CreateUserOk {
result: User!
}
type CreateUserError {
error: String!
}
union CreateUserResult = CreateUserOk | CreateUserError
Then, the generated files and normalised names are:
src/schema/pet/resolvers/Query/pets.ts, affected by query option, normalized name: pet.Query.petssrc/schema/pet/resolvers/Cat.ts, affected by object option, normalized name: pet.Catsrc/schema/pet/resolvers/Dog.ts, affected by object option, normalized name: pet.Dogsrc/schema/pet/resolvers/Pet.ts, affected by union option, normalized name: pet.Petsrc/schema/user/resolvers/Mutation/createUser.ts, affected by mutation option, normalized name: user.Mutation.createUsersrc/schema/user/resolvers/User.ts, affected by object option, normalized name: user.Usersrc/schema/user/resolvers/CreateUserOk.ts, affected by object option, normalized name: user.CreateUserOksrc/schema/user/resolvers/CreateUserError.ts, affected by object option, normalized name: user.CreateUserErrorsrc/schema/user/resolvers/CreateUserResult.ts, affected by union option, normalized name: user.CreateUserResultNow, let's say we want to disable all union files, types ending with Ok or Error, the config would look like this:
defineConfig({
resolverGeneration: {
query: '*',
mutation: '*',
subscription: '*',
scalar: '*',
object: ['!*.*Ok', '!*.*Error'], // Disables objects ending with `Ok` or `Error` in every module
union: '', // Empty string disables all file generation of relevant type in every module
interface: '*',
},
});
Hint: To see why certain files are skipped, run codegen command with DEBUG turned on:
DEBUG="@eddeee888/gcg-typescript-resolver-files" yarn graphql-codegen
merged or mergedWhitelisted or modules (Default: merged)
How to generate typeDefs file/s:
merged: one filemergedWhitelisted: one file but only contains whitelisted modulesmodules: one file per moduleIf config.mode=merged, this config is always merged
string or false (Default: ./typeDefs.generated.ts)
Where to generate typeDefs files. If value is false or empty string, the file/s are not generated.
If typeDefsFileMode=merged or typeDefsFileMode=mergedWhitelisted, this path is relative from baseOutputDir.
If typeDefsFileMode=modules, this path is relative from each module directory.
boolean, string or object (Default:./schema.generated.graphqls)
Option to merge multiple schemas into one. Uses schema-ast plugin internally.
Unless false is used, the input is turned into the following object:
{
path: string; // path to the generated file
config: `(@graphql-codegen/schema-ast).SchemaASTConfig`; // Full config options can be found here: https://the-guild.dev/graphql/codegen/plugins/other/schema-ast
}
Note: Make sure your Codegen config's schema field does not include the generated schema file, otherwise unexpected errors may occur.
Record<string, (@graphql-codegen/add).AddPluginConfig> (Default: undefined) (EXPERIMENTAL)
Allows using add plugin on a given file.
Note: Currently only supports resolverTypesPath file i.e. types.generated.ts
Example:
// codegen.ts
{
generates: {
'src/schema': defineConfig({
add: {
'./types.generated.ts': { content: '/* eslint-disable */' },
},
})
}
}
Array<string> (Only works with config.mode=modules)
Whitelists modules to generate files and entries in main file. By default all modules are whitelisted. Useful for gradual migrations.
Array<string> (Only works with config.mode=modules)
Blacklists modules to avoid generate files and entries in main file. Useful for gradual migrations.
Record<string, string>
Map of relative or absolute path (prefixed with ~) to external or existing resolvers.
Examples:
DateTime: ~graphql-scalars#DateTimeResolverQuery.me: '~@org/meResolver#default as meResolver'User: 'otherResolvers#User as UserResolver'.(@graphql-codegen/typescript).TypeScriptPluginConfig & (@graphql-codegen/typescript-resolvers).TypeScriptResolversPluginConfig
Takes typescript config and typescript-resolvers config to override the defaults.
Experimental options:
namingConventionstring (Default: ./)
By default, mappers must be siblings with the schema they represent. For example, if the schema file is /path/to/schema.graphql, the mapper file is /path/to/schema.mappers.ts. This extension allows mappers to reside in a different directory relative to the schema file using the pattern <schemaPath>/<mappersRelativeTargetDir>/<schemaName><mappersFileExtension>.
string (Default: .mappers.ts)
The files with this extension provides mappers interfaces and types for the schema files in the same module.
string (Default: Mapper)
Exported interfaces and types with this suffix from mappersFile in each module are put into the mappers object of @graphql-codegen/typescript-resolvers.
string or false (Default: graphql-scalars)
Where Scalar implementation and codegen types come from. Use false to implement your own Scalars.
If using an module that is not graphql-scalars, the module must export resolver implementation and codegen type the same way graphql-scalars does e.g.
{
resolvers: {
DateTime: DateTimeResolver,
},
DateTimeResolver: {
// ... resolver implementation
extensions: {
codegenScalarType: 'Date | string',
},
}
}
Record<string, { resolver?: string; type?: string | { input: string; output: string } }> (Default: {})
Overrides scalars' resolver implementation, type or both.
Example:
// codegen.ts
{
generates: {
'src/schema': defineConfig({
scalarsOverrides: {
DateTime: {
resolver: './localDateTimeResolver#Resolver',
}
Currency: {
type: 'unknown'
},
BigInt: {
resolver: '@other/scalars#BigIntResolver',
type: {
input: 'bigint',
output: 'number | string'
}
}
}
})
}
}
string (Default: ./tsconfig.json)
Project's TypeScript config, relative from project root. This helps type analysis such as resolving custom module paths.
smart or disabled or object (Default: smart) (Experimental)
smart option does static analysis and add fields to ensure no runtime errors. The default smart option is expanded to an object like this to target supported types:
{
object: 'smart',
enum: 'smart'
}
bool (Default: true)
Determines whether imports emitted should use CommonJS syntax or ESM syntax (with .js file endings)
Custom preset config can be set using the presetConfig option:
# codegen.yml
schema: '**/*.graphql'
generates:
src/schema:
preset: '@eddeee888/gcg-typescript-resolver-files'
presetConfig:
mode: 'modules'
resolverTypesPath: './types.gen.ts'
typeDefsFilePath: false
typesPluginsConfig: # Pass config you'd normally use for `typescript` and `typescript-resolvers` here
nonOptionalTypename: false
federation: true
If you use codegen.ts, you can use the exported defineConfig function to get better TypeScript support:
import type { CodegenConfig } from '@graphql-codegen/cli';
import { defineConfig } from '@eddeee888/gcg-typescript-resolver-files';
const config: CodegenConfig = {
schema: '**/schema.graphql',
generates: {
'src/schema': defineConfig({
mode: 'modules',
resolverTypesPath: './types.gen.ts',
typeDefsFilePath: false,
typesPluginsConfig: {
// Pass config you'd normally use for `typescript` and `typescript-resolvers` here
nonOptionalTypename: false,
federation: true,
},
}),
},
};
export default config;
FAQs
This [GraphQL Code Generator](https://www.the-guild.dev/graphql/codegen) plugin creates resolvers given GraphQL schema.
The npm package @eddeee888/gcg-typescript-resolver-files receives a total of 37,082 weekly downloads. As such, @eddeee888/gcg-typescript-resolver-files popularity was classified as popular.
We found that @eddeee888/gcg-typescript-resolver-files demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Socket is heading to London! Stop by our booth or schedule a meeting to see what we've been working on.

Security News
OWASP’s 2025 Top 10 introduces Software Supply Chain Failures as a new category, reflecting rising concern over dependency and build system risks.

Research
/Security News
Socket researchers discovered nine malicious NuGet packages that use time-delayed payloads to crash applications and corrupt industrial control systems.