rans>Skip to main content
Community Plugin
View plugin on GitHub
See starters using this

Gatsby Typescript Graphql Codegen

Automatic type generation for your graphql queries via graphql-code-generator

Installation

yarn add typescript gatsby-plugin-graphql-codegen

Add this to your gatsby config like any other plugins:

// gatsby-config.js
module.exports = {
  plugins: [
    `gatsby-plugin-graphql-codegen`,
  ]
}

Options

key default value
options.codegen true enable / disable generating definitions for graphql queries
options.documentPaths
[’./src/**/*.{ts,tsx}‘,
’./.cache/fragments/*.js’,
’./node_modules/gatsby-*/**/*.js’]
The paths to files containing graphql queries.
⚠️ The default paths will be overwritten by the documentPaths you pass in, so please make sure to include all necessary paths ⚠️
options.fileName graphql-type.ts path to the generated file. By default, it’s placed at the project root directory & it should not be placed into src, since this will create an infinite loop
options.codegenDelay 200 amount of delay from file change to codegen
options.pluckConfig
{ globalGqlIdentifierName: “graphql”, modules: [ { name: ‘gatsby’, identifier: ‘graphql’ } ] }
options passed to graphql-tag-pluck when extracting queries and fragments from documents
options.failOnError (^2.5.0) process.env.NODE_ENV === 'production' Throw error if the codegen fails. By default only apply to production builds.
options.codegenConfig (^2.7.0) {} Add config directly to graphql-codegen. These key-value config will be applied to every graphql-codegen plugins. See graphql-codegen docs on the config field
options.codegenPlugins (^2.7.0) [] Add additional plugins to graphql-codegen. We use the same format as Gatsby’s. See example usage below.
options.additionalSchemas (^2.6.0)
[]
array of additional schemas (other than the schema used by gatsby queries) for which types should be generated for. This is useful when you use client-side queries (e.g. with apollo-client) where you are querying another schema/endpoint

Additional Schema Options (for options.additionalSchemas)

key default value
key - an unique key used internally by this plugin to identify different schemas
fileName graphql-types-${key}.ts path to the generated file for this schema. By default, it’s placed at the project root directory & it should not be placed into src, since this will create an infinite loop
documentPaths value of options.documentPaths The paths to files containing graphql queries. See also options.documentPaths
pluckConfig - options passed to graphql-tag-pluck when extracting queries and fragments from documents
schema - additional schema to process. Can either be an url, a path to a local schema definition (both .json and .graphql are supported) or an inline definition. See also https://github.com/ardatan/graphql-toolkit#-schema-loading
codegenConfig (^2.7.0) {} See codegenConfig above
codegenPlugin (^2.7.0) {} See codegenPlugin above

Example Setups

Normal Usecase

Set it & forget it

exports.default = {
  plugins: [
    `gatsby-plugin-graphql-codegen`,
  ]
}

Custom Filename & Location

exports.default = {
  plugins: [{
    resolve: `gatsby-plugin-graphql-codegen`,
    options: {
      fileName: `./gatsby-graphql.ts`,
    }
  }]
}

Gatsby-node.ts

You have queries in your gatsby-node? We can take care of that. The experience is not 100% right now, but that’ll change soon!

exports.default = {
  plugins: [{
    resolve: `gatsby-plugin-graphql-codegen`,
    options: {
      fileName: `./gatsby-graphql.ts`,
      documentPaths: [
        './src/**/*.{ts,tsx}',
        './node_modules/gatsby-*/**/*.js',
        './gatsby-node.ts',
      ],
    }
  }]
}

Customize Graphql Codegen

You want to pass additional config to graphql-codegen:

// additional plugins
import { plugin as resolverPlugin } from '@graphql-codegen/typescript-resolvers'

exports.default = {
  plugins: [{
    resolve: `gatsby-plugin-graphql-codegen`,
    options: {
      codegenConfig: {
        // key-value configs that will be applied to every plugins.
        // Note: The example below is completely unnecessary, just a demonstration.
        typesPrefix: 'Hi' // -> import { HiImageQuery } from '../../graphql-types'
      },
      codegenPlugins: [{
        // built-in plugin. 
        // Use `typescript` for `@graphql-codegen/typescript`
        // and `operations` for `@graphql-codegen/typescript-operations`
        resolve: 'typescript',
        options: {
          namingConvention: `lower-case#lowerCase`,
        }
      },{
        // additional plugin
        resolve: resolverPlugin,
        options: {
          typesPrefix: 'I'
        }
      }]
    }
  }]
}

Dual-Schema Setup

If you use graphql on the client side, this is for you.

exports.default = {
  plugins: [{
    resolve: `gatsby-plugin-graphql-codegen`,
    options: {
      additionalSchemas: [{
        key: 'pokemon',
        fileName: './graphql-pokemon.ts',
        schema: 'https://graphql-pokemon.now.sh/',
        pluckConfig: {
          // config to ensure only queries using the `gql` tag are used for this schema
          globalGqlIdentifierName: 'gql',
          modules: [
            {
              name: 'graphql-tag',
              identifier: 'gql',
            },
          ],
        },
      }],
    }
  }]
}

Code generation

By default, this plugin will build typing for your queries automatically to graphql-types.d.ts on every edit. Please note that the definition file should not be placed inside src since this triggers a never ending loop during development.

In order to take advantage of the generated code, user needs to name their query:

// src/pages/index.tsx

  export const pageQuery = graphql`
-   query {
+   query BlogIndex {
      site {
        siteMetadata {
          title
        }
      }
  ...

…and import it from the generated type file:

// src/pages/index.tsx

import { BlogIndexQuery } from '../graphqlTypes'

interface IBlogIndexProps {
  data: BlogIndexQuery;
  location: Location;
}

const BlogIndex: React.FC<IBlogIndexProps> = ({ data, location }) => {
  ...
}
Docs
Tutorials
Plugins
Blog
Showcase