Provides functions to help TypeScript GraphQL client development including auto completion, query validation, type generation and so on.
This plugin has the following features:
- As TypeScript Language Service extension:
- Completion suggestion
- Get GraphQL diagnostics
- Display GraphQL quick info within tooltip
- As CLI
- Generate ts type files from your GraphQL operations in your TypeScript sources
- Extract or validate GraphQL operations in your TypeScript sources
- As webpack plugin
- Transform your queries to GraphQL AST object statically
- Getting started
- CLI Usage
- Plugin options
- webpack custom transformer
- Template strings
- Available editors
- License
First, confirm that your project has typescript(v2.3.x or later) and graphql.
To install this plugin, execute the following:
npm install ts-graphql-plugin -D
And configure plugins
section in your tsconfig.json, for example:
{
"compilerOptions": {
"module": "commonjs",
"target": "es5",
"plugins": [
{
"name": "ts-graphql-plugin",
"schema": "path-or-url-to-your-schema.graphql",
"tag": "gql"
}
]
}
}
It's ready to go. Launch your TypeScript IDE.
$ npx ts-graphql-plugin <command> [options]
If you install this plugin, a short alias tsgql
is also available instead of ts-graphql-plugin
.
Available commands are typegen
, extract
, validate
and report
. If you want more detail, runts-graphql-plugin --help
orts-graphql-plugin <command> --help
in your console.
Generate TypeScript types from GraphQL operations or fragments in your .ts source files. Here is an output example.
Extracts GraphQL operations and fragments from ts files and writes them to manifest.json
.
Validates your GraphQL operations and fragments in your ts files and report syntax or semantic errors.
Extracts GraphQL operations and fragments from ts files and report them to a Markdown file. Here is an output example.
Pass plugin options to your tsconfig.json to configure this plugin.
/* tsconfig.json */
{
"compilerOptions": {
"plugins": [
{
"name": "ts-graphql-plugin",
/* plugin options */
"schema": "path-or-url-to-your-schema.graphql",
"tag": "gql",
...
}
]
}
}
It's a required parameter and should point your GraphQL schema SDL file such as :
type Author {
id: ID!
firstName: String
lastName: String
posts: [Post]
}
type Post {
id: ID!
title: String
author: Author
votes: Int
}
type Query {
posts: [Post]
author(id: ID!): Author
}
Also you can use GraphQL introspection query result data such as:
{
"__schema": {
"queryType": {
"name": "Query"
},
"types": [
{
"kind": "OBJECT",
"name": "Query",
"description": null,
"fields": [
{
"name": "viewer",
:
You can pass URL and custom HTTP headers. It's useful to use an existing GraphQL server like GitHub v4 API. For example:
"schema": {
"http": {
"url": "https://api.github.com/graphql",
"headers": {
"Authorization": "Bearer YOUR_GITHUB_API_TOKEN"
}
}
},
If you need to use more complex logic like fetch bearer token using client secret then you can build your http schema configuration using javascript. First, you need to setup your plugin configuration like below:
"schema": {
"http": {
"fromScript": "my-graphql-config.js"
}
},
Your script have to return valid RequestSetup
or Promise<RequestSetup>
object:
url: string;
method?: string; // default to 'POST'
headers?: { [key: string]: string };
Example how configuration script may look like:
// my-graphql-config.js
const fetch = require('node-fetch');
module.exports = projectRootPath =>
new Promise(resolve => {
fetch('http://localhost/identity-server/connect/token', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: `client_secret=${process.env.MY_CLIENT_SECRET}`,
})
.then(response => response.json())
.then(response => {
resolve({
url: 'http://localhost/graphql',
method: 'POST', // unnecessary, "POST" is default value
headers: {
Authorization: `Bearer ${response.access_token}`,
},
});
});
});
The schema
option accepts the following type:
type SchemaConfig =
| string
| {
file: {
path: string;
};
}
| {
http: {
url: string;
method?: string;
headers?: { [key: string]: string };
};
}
| {
http: {
fromScript: string;
};
};
It's optional. When it's set, this plugin works only if the target template string is tagged by a function whose name is equal to this parameter.
If not set, this plugin treats all template strings in your .ts as GraphQL query.
For example:
import gql from 'graphql-tag';
// when tag paramter is 'gql'
const str1 = gql`query { }`; // work
const str2 = `<div></div>`; // don't work
const str3 = otherTagFn`foooo`; // don't work
It's useful to write multiple kinds template strings(e.g. one is Angular Component template, another is Apollo GraphQL query).
It's optional. If you want to extend server-side schema, derived from schema
option, you can set path of SDL file of your local extension.
For example:
# local-extension.graphql
directive @client on FIELD
type SomeClientOnlyType {
name: String!
}
extend type Query {
someLocalField: SomeClientOnlyType!
}
/* tsconfig.json */
{
"compilerOptions": {
"plugins": [
{
"name": "ts-graphql-plugin",
"schema": "base-schema.graphql",
"localSchemaExtensions": ["local-extension.graphql"]
}
]
}
}
The above example setting allows to write the following query:
const query = gql`
query {
someLocalField @client {
name
}
}
`;
It's optional and default: true
. By default, this plugin ignores duplicated fragment definitions such as:
const fragment = gql`
fragment A on Query {
id
}
`;
const query = gql`
${fragment}
query MyQuery {
...A
}
${fragment}
# Duplicated fragment interpolation
`;
This option affects all editor supporting functions, results of CLI commands and results of transformation.
If you set this option false
, this plugin passes through query document without removing duplication.
ts-graphql-plugin provides TypeScript custom transformer to static transform from query template strings to GraphQL AST. It's useful if you use https://github.com/apollographql/graphql-tag
/* webpack.config.js */
const TsGraphQLPlugin = require('ts-graphql-plugin/webpack');
const tsgqlPlugin = new TsGraphQLPlugin({
/* plugin options */
});
module.exports = {
module: {
rules: [
{
test: /\.tsx?$/,
exclude: /node_modules/,
loader: 'ts-loader',
options: {
getCustomTransformers: () => ({
before: [
tsgqlPlugin.getTransformer({
/* transformer options */
}),
],
}),
},
},
],
},
plugins: [tsgqlPlugin],
};
NOTE: For now, this plugin transforms nothing when webpack's --mode
option is development
and webpack runs with --watch
option.
Set your project tsconfig json's file path. Default value: tsconfig.json
.
Default: true
. If set, the transformer transforms template strings which include only GraphQL fragment definitions to empty string literal.
For example, we finally does not need the GraphQL AST document of fragment
. We need interpolated GraphQL query AST for query
. So this transformer statically resolves ${fragment}
interpolation and removes right-hand-side of the fragment
variable.
const fragment = gql`
fragment MyFragment on Query {
hello
}
`;
const query = gql`
${fragment}
query MyQuery {
...MyFragment
}
`;
Default: []
. You can set an array of GraphQL AST document visitor functions. The visitor functions should be compatible to https://graphql.org/graphql-js/language/#visit .
This tool analyzes template string literals in .ts files such as:
const query = gql`
query MyQuery = {
viewer {
id
name
}
}
`;
NOTE
This tool cannot interpret queries containing too complex TypeScript expressions because it statically explores GraphQL queries.
/* It's ok */
const fragment = gql`
fragment MyFragment on User {
id
name
}
`;
const query = gql`
${fragment}
query MyQuery {
viewer {
...MyFragment
}
}
`;
/* Bad */
const query = gql`
query MyQuery {
${someComplexFunction()}
}
`;
Keep your queries static (see also https://blog.apollographql.com/5-benefits-of-static-graphql-queries-b7fa90b0b69a ).
I've checked the operation with the following editors:
- Visual Studio Code
- Vim (with tsuquyomi)
And the following editor have TypeScript plugin with LanguageService so they're compatible with this plugin:
- Emacs
- Sublime text
- Eclipse
This software is released under the MIT License, see LICENSE.txt.