graphqL-code-generatorをセットアップしますた
graphqL-code-generatorとは、GraphQLのスキーマからTypeScriptの型を自動生成してくれるライブラリです。便利です。
普段、何気なく使ってたのですがセットアップ周りとか、あんま知らないなあ。。。
と思ったのでセットアップしてみました。
備忘録で残します。
- 初期セットアップ
npx create-react-app graphql-codegen-github-app --template typescript
でappを作成します。
次に、パッケージをinstallします。
yarn add @apollo/client graphql
-
src/graphql/documents.ts
を作成します。
documents.tsの内容は以下です。(今回はGitHub GraphQL APIのスキーマからTypeScriptの型を自動生成します)
import { gql } from '@apollo/client';
gql`
query Repositories($first: Int, $query: String!) {
search(first: $first, query: $query, type: REPOSITORY) {
repositoryCount
# リポジトリ情報
edges {
node {
... on Repository {
# リポジトリ名
name
}
}
}
}
}
`;
内容としては、引数のqueryに対応したリポジトリ情報を先頭からfirst
件、取得するといったQueryを定義しました。
- graphqL-code-generatorをセットアップ
yarn add -D @graphql-codegen/cli @graphql-codegen/typescript
yarn graphql-codegen init
yarn graphql-codegen init
の質問はデフォルトのままエンターで大丈夫です。
最後のコマンド名の質問はgenerate
で打ってください。
ここで、アプリ直下にcodegen.yml
が作成されます。
codegen.yml
を以下のように書き換えてください。
overwrite: true
schema: 'schema.graphql'
generates:
src/graphql/generate/index.ts:
documents: 'src/graphql/documents.ts'
plugins:
- 'typescript'
- 'typescript-operations'
- 'typescript-react-apollo'
内容としては、src/graphql/documents.ts
を参照して、schema.graphql
で定義されてるスキーマをTypescirptの型でsrc/graphql/generate/index.ts
に自動で吐き出すといった内容です。
-
schema.graphql
を作成
いったんここでyarn generate
を実行してみると以下のようなerrorがでます。
Unable to find any GraphQL type definitions for the following pointers:
schema.graphql
がないみたいなことを言ってますね。
僕がcode-generatorを使いやすいななと思うところは、errorがとてもわかりやすいところです。
ここからは、あえてエラーを出しながら進めます。(うざいですがご了承ください🙏)
では改めてschema.graphql
を作成します。
type Query {
search(
first: Int
query: String!
type: SearchType!
): SearchResultItemConnection!
}
内容はGitHub GraphQL APIのDocをそのまま記載しました。
ここで再度yarn generate
を行うとエラーが出ます。
Error: Unknown type: "SearchResultItemConnection".
SearchResultItemConnection
が定義されてないので、定義します。
type SearchResultItemConnection {
repositoryCount: Int!
edges: [SearchResultItemEdge]
}
type Query {
search(
first: Int
query: String!
type: SearchType!
): SearchResultItemConnection!
}
再度yarn generate
を実行でエラーが出ます
Error: Unknown type: "SearchType".
SearchType
が定義されてないので、定義します。
type SearchResultItemConnection {
repositoryCount: Int!
edges: [SearchResultItemEdge]
}
enum SearchType {
REPOSITORY
}
type Query {
search(
first: Int
query: String!
type: SearchType!
): SearchResultItemConnection!
}
再度yarn generate
を実行でエラーが出ます
Error: Unknown type: "SearchResultItemEdge".
SearchResultItemEdge
が定義されてないので、定義します。
type SearchResultItemEdge {
node: SearchResultItem
}
type SearchResultItemConnection {
repositoryCount: Int!
edges: [SearchResultItemEdge]
}
enum SearchType {
REPOSITORY
}
type Query {
search(
first: Int
query: String!
type: SearchType!
): SearchResultItemConnection!
}
再度yarn generate
を実行でエラーが出ます
Error: Unknown type: "SearchResultItem".
SearchResultItem
が定義されてないので、定義します。
interface Repository {
name: String!
}
type SearchResultItem implements Repository {
name: String!
}
type SearchResultItemEdge {
node: SearchResultItem
}
type SearchResultItemConnection {
repositoryCount: Int!
edges: [SearchResultItemEdge]
}
enum SearchType {
REPOSITORY
}
type Query {
search(
first: Int
query: String!
type: SearchType!
): SearchResultItemConnection!
}
再度yarn generate
を実行でついに成功しsrc/graphql/generate/index.ts
が生成されました。
後は自動生成されたuseRepositoriesQuery
を使用してみると型補完が効くように
なります。
おわり。
Discussion