🧊

PrettierのGraphQLサポートについて

言語が違えばまた、違った歴史があるのだなあ・・・。

graphql-js

  • Prettierは、graphql-jsを使ってGraphQLをパースする
  • GraphQL Spec自体は日付ベースでカットされる

そして、Prettierが使ってるgraphql-jsのバージョンはこの通り。

  • v3.8.4(latest): v16
  • v3.9.x(main): v17

少しややこしいのは、graphql-jsのバージョンと、Specのバージョンは対応してるわけではないってところ。

たとえば、2025で仕様入りした”executable descriptions”は、v16.12の時点でもパースできる。また、@oneOfというディレクティブも2025仕様だが、ASTとしては元々パースできてたり。

Draft features

また、リファレンス実装なので、まだ正式仕様になってないものも対応してる。

たとえば、graphql-jsのv16では、allowLegacyFragmentVariables: trueを指定してる。

https://github.com/prettier/prettier/blob/1c6ba5539141552e0e8e22d401ea620d8fdff468/src/language-graphql/parser-graphql.js#L19

そしてこれがv17になると、experimentalFragmentArguments: trueに変わってる。

https://github.com/prettier/prettier/blob/a42e063d5ce94a3a9e46cc9ff58020995199a3a5/src/language-graphql/parser-graphql.js#L24

Fragment Arguments | GraphQL https://www.graphql-js.org/docs/fragment-arguments/

詳しいことは知らないけど、要するに名前が変わって、さらにできることも増えたという感じらしい。(定義側だけでなく、呼び出し側の引数でも使えるように)

また、リファレンス実装だからか、まだRFC段階の”Directives on Directive Definitions”も、v17からオプションなしでパースされるようになってたり・・・。

Directives on Directive Definitions | GraphQL https://www.graphql-js.org/docs/directives-on-directives/

Prettier互換を謳い続ける限り、PrettierのCHANGELOGを追い続ける必要がある!