Package Exports
- eslint-plugin-graphql
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (eslint-plugin-graphql) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
eslint-plugin-graphql
An ESLint plugin that checks tagged template strings against a GraphQL schema.
npm install eslint-plugin-graphql
Supports three GraphQL clients out of the box:
Coming soon: You can use it now with the manual approach described below, but we are working on easier tooling so you can just pass a GraphQL server URL.
Importing schema JSON
You'll need to import your introspection query result. This can be done if you define your ESLint config in a JS file.
Identity template literal tag
This plugin relies on GraphQL queries being prefixed with a special tag. In Relay, this is always done, but other clients like just take normal template literals without a tag. In this case, define an identity tag that doesn't do anything except for tell the linter this is a GraphQL query:
global.gql = (literals, ...substitutions) => {
let result = "";
// run the loop only for the substitution count
for (let i = 0; i < substitutions.length; i++) {
result += literals[i];
result += substitutions[i];
}
// add the last literal
result += literals[literals.length - 1];
return result;
}Code snippet taken from: https://leanpub.com/understandinges6/read#leanpub-auto-multiline-strings
Note: the linter rule could be extended to identify calls to various specific APIs to eliminate the need for a template literal tag, but this might just make the implementation a lot more complex for little benefit.
GraphQL literal files
This plugin also lints GraphQL literal files ending on .gql or .graphql.
In order to do so set env to 'literal' in your .eslintrc.js and tell eslint to check these files as well.
eslint . --ext .js --ext .gql --ext .graphqlExample config for Apollo
// In a file called .eslintrc.js
module.exports = {
parser: "babel-eslint",
rules: {
"graphql/template-strings": ['error', {
// Import default settings for your GraphQL client. Supported values:
// 'apollo', 'relay', 'lokka', 'literal'
env: 'apollo',
// Import your schema JSON here
schemaJson: require('./schema.json'),
// OR provide absolute path to your schema JSON
// schemaJsonFilepath: path.resolve(__dirname, './schema.json'),
// tagName is gql by default
}]
},
plugins: [
'graphql'
]
}Example config for Relay
// In a file called .eslintrc.js
module.exports = {
parser: "babel-eslint",
rules: {
"graphql/template-strings": ['error', {
// Import default settings for your GraphQL client. Supported values:
// 'apollo', 'relay', 'lokka', 'literal'
env: 'relay',
// Import your schema JSON here
schemaJson: require('./schema.json'),
// OR provide absolute path to your schema JSON
// schemaJsonFilepath: path.resolve(__dirname, './schema.json'),
// tagName is set for you to Relay.QL
}]
},
plugins: [
'graphql'
]
}Example config for Lokka
// In a file called .eslintrc.js
module.exports = {
parser: "babel-eslint",
rules: {
"graphql/template-strings": ['error', {
// Import default settings for your GraphQL client. Supported values:
// 'apollo', 'relay', 'lokka', 'literal'
env: 'lokka',
// Import your schema JSON here
schemaJson: require('./schema.json'),
// OR provide absolute path to your schema JSON
// schemaJsonFilepath: path.resolve(__dirname, './schema.json'),
// Optional, the name of the template tag, defaults to 'gql'
tagName: 'gql'
}]
},
plugins: [
'graphql'
]
}Example config for literal graphql files
// In a file called .eslintrc.js
module.exports = {
parser: "babel-eslint",
rules: {
"graphql/template-strings": ['error', {
// Import default settings for your GraphQL client. Supported values:
// 'apollo', 'relay', 'lokka', 'literal'
env: 'literal',
// Import your schema JSON here
schemaJson: require('./schema.json'),
// OR provide absolute path to your schema JSON
// schemaJsonFilepath: path.resolve(__dirname, './schema.json'),
// tagName is set automatically
}]
},
plugins: [
'graphql'
]
}Additional Schemas or Tags
This plugin can be used to validate against multiple schemas by identifying them with different tags. This is useful for applications interacting with multiple GraphQL systems. Additional schemas can simply be appended to the options list:
module.exports = {
parser: "babel-eslint",
rules: {
"graphql/template-strings": ['error', {
env: 'apollo',
tagName: 'FirstGQL',
schemaJson: require('./schema-first.json')
}, {
env: 'relay',
tagName: 'SecondGQL',
schemaJson: require('./schema-second.json')
}]
},
plugins: [
'graphql'
]
}Selecting Validation Rules
GraphQL validation rules can be configured in the eslint rule's configuration using the validators setting. The default selection depends on the env setting. If no env is specified, all rules are enabled by default.
The validators setting can be set either to a list of specific validator names or to the special value "all".
module.exports = {
parser: "babel-eslint",
rules: {
"graphql/template-strings": ['error', {
env: 'apollo',
validators: 'all',
tagName: 'FirstGQL',
schemaJson: require('./schema-first.json')
}, {
validators: ['FieldsOnCorrectType'],
tagName: 'SecondGQL',
schemaJson: require('./schema-second.json')
}]
},
plugins: [
'graphql'
]
}The full list of available validators is:
ArgumentsOfCorrectTypeDefaultValuesOfCorrectTypeFieldsOnCorrectTypeFragmentsOnCompositeTypesKnownArgumentNamesKnownDirectives(disabled by default inrelay)KnownFragmentNames(disabled by default inapollo,lokka, andrelay)KnownTypeNamesLoneAnonymousOperationNoFragmentCyclesNoUndefinedVariables(disabled by default inrelay)NoUnusedFragments(disabled by default inapollo,lokka, andrelay)NoUnusedVariablesOverlappingFieldsCanBeMergedPossibleFragmentSpreadsProvidedNonNullArguments(disabled by default inrelay)ScalarLeafs(disabled by default inrelay)UniqueArgumentNamesUniqueFragmentNamesUniqueInputFieldNamesUniqueOperationNamesUniqueVariableNamesVariablesAreInputTypesVariablesInAllowedPosition