🎂

【GraphQL】graphql-schema-linterのルールまとめ

2021/09/12に公開

はじめに

最近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