🎂
【GraphQL】graphql-schema-linterのルールまとめ
はじめに
最近GraphQLのLinterである graphql-schema-linter を導入したので、ビルトインのルールをまとめてみました。
ビルトインのルールは18種類あるので、2回に分けて9種類ずつ記事にしたいと思います。
※ 2021/10/01現在18種類中9種類のみ記載済み(あと半分がんばります)
ルール内容と実行例
arguments-have-descriptions
フィールドの引数にコメントが無いと怒られます。
NG
type User {
id: String!
name: String!
age: Int
}
type Query {
user(id: String!): User!
}
OK
type User {
id: String!
name: String!
age: Int
}
type Query {
user(
"""
The id is user's unique ID
"""
id: String!
): User!
}
defined-types-are-used
使われていない型があると怒られます。
NG
type Task {
title: String!
detail: String!
}
type User {
id: String!
name: String!
age: Int
}
type Query {
user(
"""
The id is user's unique ID
"""
id: String!
): User!
}
OK
type Task {
title: String!
detail: String!
}
type User {
id: String!
name: String!
age: Int
tasks: [Task!]
}
type Query {
user(
"""
The id is user's unique ID
"""
id: String!
): User!
}
deprecations-have-a-reason
@deprecated
ディレクティブに理由が付いていないと怒られます。
NG
type Task {
title: String!
detail: String! @deprecated
}
OK
type Task {
title: String!
detail: String! @deprecated(reason: "detail will be deleted.")
}
descriptions-are-capitalized
fieldに対するコメントが存在する場合、大文字始まりでないと怒られます。
NG
type Task {
"""
the title is task's title
"""
title: String!
detail: String! @deprecated(reason: "detail will be deleted.")
}
OK
type Task {
"""
The title is task's title
"""
title: String!
detail: String! @deprecated(reason: "detail will be deleted.")
}
ちなみに、field以外に対するコメントは大文字始まりでなくても許されます。
enum-values-all-caps
enum値がコンスタントケース(全て大文字)じゃないと怒られます。
NG
enum Job {
Engineer
Monk
Doctor
}
OK
enum Job {
ENGINEER
MONK
DOCTOR
}
enum-values-have-descriptions
enum値にコメントが付いていないと怒られます。
NG
enum Job {
ENGINEER
MONK
DOCTOR
}
OK
enum Job {
"""
エンジニア
"""
ENGINEER
"""
僧
"""
MONK
"""
医師
"""
DOCTOR
}
enum-values-sorted-alphabetically
enum値がアルファベット順でないと怒られます。
NG
enum Job {
"""
エンジニア
"""
ENGINEER
"""
僧
"""
MONK
"""
医師
"""
DOCTOR
}
OK
enum Job {
"""
医師
"""
DOCTOR
"""
エンジニア
"""
ENGINEER
"""
僧
"""
MONK
}
fields-are-camel-cased
fieldがキャメルケースでないと怒られます。
NG
type Query {
user(
"""
The id is user's unique ID
"""
id: String!
): User!
all_users: [User!]
}
OK
type Query {
user(
"""
The id is user's unique ID
"""
id: String!
): User!
allUsers: [User!]
}
fields-have-descriptions
fieldにコメントが付いていないと怒られます。
NG
type Query {
"""
Get user
"""
user(
"""
The id is user's unique ID
"""
id: String!
): User!
allUsers: [User!]
}
OK
type Query {
"""
Get one user
"""
user(
"""
The id is user's unique ID
"""
id: String!
): User!
"""
Get all users
"""
allUsers: [User!]
}
さいごに
To be continued
Discussion