チーム開発でGraphQLを利用していると、気づかぬ間にdeprecatedのフィールドを参照していたことがあったので、それの防止策を紹介
Pull Request
以下で導入 github.com
内容
@graphql-eslint/eslint-pluginを導入しました。
※似たような感じで名前でeslint-plugin-graphqlがあったが、こちらはうまく自分の環境では動作しなかったので、上記の@graphql-eslint/eslint-pluginを使用しました。
実装
以下のコマンドで追加
$ yarn add -D @graphql-eslint/eslint-plugin
上記を使用するには、GraphqQLのschemaファイルが必要なので、@graphql-codegen/introspectionを使用して生成
以下のコマンドで追加
$ yarn add -D @graphql-codegen/introspection
codegen.ymlに以下を追加
■ codegen.yml
overwrite: true
schema:
- ./schema.graphqls
./schema.json:
plugins:
- introspection
config:
minify: true
これで以下のコマンドでschema.graphqlsからschema.jsonが生成できます。
$ yarn graphql-codegen
これで準備が完了したので、以下のようにESLintに設定
■ .eslintrc.js
module.exports = {
...略
overrides: [
{
files: ['*.gql'],
parser: '@graphql-eslint/eslint-plugin',
plugins: ['@graphql-eslint'],
parserOptions: {
operations: ['./src/**/*.gql'],
schema: './schema.json',
},
rules: {
'@graphql-eslint/no-deprecated': 'error',
},
},
],
};
上記を設定することで、以下のようなrulesを使用することが可能になります
graphql-eslint/README.md at master · dotansimha/graphql-eslint · GitHub
では、早速no-deprecatedを試してみる。
まずサーバー側のGraphQLの設定をdeprecatedにしてみる
type Calendar {
id: ID!
"日付"
date: String!
"true: パブリック、false: プライベート"
public: Boolean! @deprecated(reason: "テストで非推奨にしている")
"スケジュール"
item: Item!
}
schemaを確認すると以下みたいにpublicのフィールドは非推奨の状態になっているのが確認できる

次の上記の非推奨なフィールドにアクセスしている.gqlファイルをfrontend側に作成
query Calendar($date: String!) {
calendar(date: $date) {
id
date
public
}
}
この状態でESLintを実行してみる
$ yarn lint yarn run v1.22.4 $ eslint --ext .js,.ts,.tsx,.gql,.graphql 'src/**' /github.com/wheatandcat/Peperomia/src/queries/calendar.gql 5:6 error This field is marked as deprecated in your GraphQL schema (reason: テストで非推奨にしている) @graphql-eslint/no-deprecated ✖ 1 problem (1 error, 0 warnings)
上記のようにdeprecatedのフィールドアクセスしている場合はESLintでエラーを出力するようになりました
まとめ
上記にリンクを貼っていますが、以下で他にも使えるrulesがあるので試してみると良いと思います
https://github.com/dotansimha/graphql-eslint/blob/master/docs/README.md