gatsby-plugin-typegen forked from https://github.com/cometkim/gatsby-plugin-typegen
Modifications that have been made while official V3 is in progress:
- For flow language JSON scalar is now anyinstead ofnever.
- Updated @graphql-codegen/flow to v1.18.5 to fix issues with missing type prefixes inside arrays.
- Removed $from types prefix for flow language.
High-performance TypeScript/Flow code generation for GatsbyJS queries.
Features
- Schema extraction
- Plugin documents extraction
- Generates type definitions using graphql-codegen
-  Auto-fixing <StaticQuery>anduseStaticQuery()in code with generated type name.
- Integrates GatsbyJS project with GraphQL & TypeScript ecosystem.
- Provides type definitions for the schema customization.
-  Provides utility types for gatsby-node.js.
Demo

Install
yarn add gatsby-plugin-typegen
# or
# npm install --save gatsby-plugin-typegenHow to use
// In your gatsby-config.js
plugins: [`@ofqwx/gatsby-plugin-typegen`]Example of type-safe usage
import type { PluginOptions as TypegenPluginOptions } from 'gatsby-plugin-typegen/types';
type Plugin = (
  | string
  | { resolve: string, options: object }
  | { resolve: `@ofqwx/gatsby-plugin-typegen`, options: TypegenPluginOptions }
);
const plugins: Plugin[] = [
  {
    resolve: `@ofqwx/gatsby-plugin-typegen`,
    options: {
      // ... customize options here
    },
  },
];
module.exports = {
  plugins,
};Change the output path
{
  options: {
    outputPath: `src/__generated__/gatsby-types.d.ts`,
  },
}Switch to Flow
{
  options: {
    language: `flow`,
    outputPath: `src/__generated__/gatsby-types.flow.js`,
  },
}Add generated typedefs to .flowconfig:
[lib]
./src/__generated__/gatsby-types.flow.jsEmit schema as GraphQL SDL
{
  options: {
    emitSchema: {
      'src/__generated__/gatsby-schema.graphql': true,
    },
  },
}
Visualized via GraphQL Voyager.
VSCode extension
You can use the VSCode GraphQL with a graphql-config file.
- 
Install the VSCode GraphQL extension. 
- 
Configure plugin to emit schema and plugin documents. // gatsby-config.js module.exports = { plugins: [ // ... { resolve: `gatsby-plugin-typegen`, options: { emitSchema: { 'src/__generated__/gatsby-introspection.json': true, }, emitPluginDocuments: { 'src/__generated__/gatsby-plugin-documents.graphql': true, }, }, }, ], };
- 
Create graphql.config.jsfile in project root or supported graphql-configs.// graphql.config.js module.exports = { schema: ["src/__generated__/gatsby-introspection.json"], documents: ["src/__generated__/gatsby-plugin-documents.graphql"], extensions: { endpoints: { default: { url: "http://localhost:8000/___graphql", headers: { "user-agent": "JS GraphQL" }, introspect: false, }, }, }, }
- 
Reload VSCode, gatsby developto make queries in VSCode.

ESLint
You can use the extracted schema file for eslint-plugin-graphql!
// gatsby-config.js
module.exports = {
  plugins: [
    // ...
    {
      resolve: `gatsby-plugin-typegen`,
      options: {
        emitSchema: {
          'src/__generated__/gatsby-introspection.json': true,
        },
      },
    },
  ],
};// .eslintrc.js
const path = require('path');
module.exports = {
  plugins: [
    'graphql'
  ],
  rules: {
    'graphql/template-strings': ['error', {
      env: 'relay',
      tagName: 'graphql',
      schemaJsonFilepath: path.resolve(__dirname, 'src/__generated__/gatsby-introspection.json'),
    }],
  },
};TypeScript plugin
The extracted schema file can also be used for ts-graphql-plugin. Using the config defined in Emit schema as GraphQL SDL:
// tsconfig.json
{
  "compilerOptions": {
    // ...
    "plugins": [
      {
        "name": "ts-graphql-plugin",
        "schema": "src/__generated__/gatsby-schema.graphql",
        "tag": "graphql"
      }
    ]
  },
}
Available options
Checkout the full documentation of plugin options from src/types.ts.
Disclaimer
This plugin is a bit opinionated about how integrate GatsbyJS and codegen.
You cannot customize plugins and its options of graphql-codegen because this plugin is built for ONLY GatsbyJS.
If you wanna use codegen with other plugins (e.g. React Apollo), you can use @graphql-codegen/cli for it.
Or gatsby-plugin-graphql-codegen gives you a more flex options.
Troubleshooting
Error: Cannot use GraphQLSchema "[object GraphQLSchema]" from another module or realm.
See https://github.com/cometkim/gatsby-plugin-typegen/issues/120
Changelog
v2.2.4
- Fix misconfigured codegen options (#$81)
v2.2.3
- Allow React v17 as peer dependency (#140)
v2.2.2
- Fix missing options (#$81)
v2.2.1
- Fixes bug caused by upstream behavior change (#93)
v2.2.0
v2.1.0
- Use stringtype for the GatsbyJS’sDatescalar by default. (#73)
- Allow to add type mappings for custom scalars. (#73)
- Avoid using unstable API internally (#71, original issue: #54)
v2.0.1
v2.0.0
- [BREAKING CHANGE] Generated types are now using global declaration with a namespace (default is GatsbyTypes).
- Fixed an issue where the insert types function only worked when documents were changed. (#43)
v1.1.2
- Export inline fragment subtypes. (#45)
- Insert eslint-disable comment on top of generated file. (#37)
Contributors ✨
Thanks goes to these wonderful people (emoji key):
This project follows the all-contributors specification. Contributions of any kind welcome!
Acknowledgements
- 
graphql-code-generator by @dotansimha 
 The where this plugin started from.
- 
gatsby-plugin-graphql-codegen by @d4rekanguok 
 Has almost same goal, but little bit different how handle GraphQL documents. @d4rekanguok also makes great contribution to this plugin as well!
- 
gatsby-plugin-extract-code by @NickyMeuleman 
 Gives me an idea of ESLint integraiton.