本文へスキップ

GraphQLからスキーマASTへの変換 — Numio

@graphql-codegen/schema-ast で GraphQL SDL をパースしてスキーマを構築し、正規化された 1 つのスキーマとして出力し直します。型拡張はベースの型にマージされ、description はブロック文字列として出力されます。

複数ファイルに分かれた extend type ブロックを 1 つの schema.graphql にまとめ、レビューやツールに使う。

GraphQL Schema

Schema AST

こんなときに使えます

  • 複数ファイルに分かれた extend type ブロックを 1 つの schema.graphql にまとめ、レビューやツールに使う。
  • 2 つのバージョンのスキーマを diff する前に、手書きの SDL を正規の出力形式にそろえる。

使い方

  1. extend type ブロックを含む 1 つ以上の SDL 断片を GraphQL Schema エディターに貼り付けます。
  2. 出力結果を確認します。拡張のフィールドは元の型に追加され、description は """ ブロックになります。
  3. 出力をコピーし、.graphql ファイルとして保存します。

GraphQL スキーマ

extend type Query {
  me: User
}

type Query {
  ping: String
}

type User {
  id: ID!
  "Display name"
  name: String @deprecated(reason: "Use fullName")
}

出力されたスキーマ(SDL)

type Query {
  me: User
  ping: String
}

type User {
  id: ID!

  """
  Display name
  """
  name: String @deprecated(reason: "Use fullName")
}

仕様と制限

フィールドの順序が変わることがあります。この例では、extend type ブロックのフィールドがベースの型自身のフィールドより前に出力されました。

@deprecated(reason: ...) などのフィールドディレクティブは出力される SDL に残ります。

スキーマはブラウザの Web Worker で構築・出力され、そのあと Prettier の GraphQL パーサーで整形されます。

FAQ

JSON の AST を出力しますか?

いいえ。名前とは異なり、結果は JSON の DocumentNode ではなく、出力された GraphQL SDL です。JSON が必要なら introspection JSON のページを使ってください。

# コメントはどうなりますか?

コメントはスキーマの一部ではないため、スキーマの出力時に削除されます。ドキュメントを残すには "description" 文字列を使ってください。

extend type をベースの型にマージできますか?

できます。拡張はベースの型に適用されるので、出力にはすべてのフィールドを持つ type Query が 1 つだけ含まれます。

仕様を確認する