#+TITLE:   lang/graphql
#+DATE:    March 31, 2022
#+SINCE:   v2.0
#+STARTUP: inlineimages nofold

* Table of Contents :TOC_3:noexport:
- [[#description][Description]]
  - [[#maintainers][Maintainers]]
  - [[#module-flags][Module Flags]]
  - [[#plugins][Plugins]]
  - [[#hacks][Hacks]]
- [[#prerequisites][Prerequisites]]
- [[#features][Features]]
  - [[#sending-queries][Sending queries]]
  - [[#viewing-docs][Viewing docs]]
- [[#configuration][Configuration]]
- [[#troubleshooting][Troubleshooting]]

* Description
This module adds [[https://www.graphql.org][GraphQL]] support to Doom Emacs.

+ Code completion
+ LSP support (=+lsp=)
  + Diagnostics (GraphQL syntax linting/validations) (spec-compliant)
  + Autocomplete suggestions (spec-compliant)
  + Hyperlink to fragment definitions and named types (type, input, enum) definitions (spec-compliant)
  + Outline view support for queries and SDL
  + Symbols support across the workspace
+ Local schema viewer
+ Org-babel exporter (requires =:lang org=)

** Maintainers
+ [[https://github.com/elken][@elken]] (Author)

** Module Flags
+ =+lsp= Enable LSP support through [[https://github.com/graphql/graphiql/tree/main/packages/graphql-language-service-cli#readme][graphql-language-service-cli]] (also requires =:tools lsp=)

** Plugins
+ [[https://github.com/davazp/graphql-mode][graphql-mode]]
+ [[https://github.com/ifitzpatrick/graphql-doc.el][graphql-doc]]
+ [[https://github.com/timoweave/company-graphql][company-graphql]] (when =+lsp= is disabled)

** Hacks
Added a convenience function =+graphql-doc-open-config= to open schema docs from a
[[https://github.com/jimkyndemeyer/graphql-config-examples][=.graphqlconfig=]] file.

* Prerequisites
There are no prerequisites for using this module. LSP server should be
downloaded upon opening a graphql buffer.

* Features
** Sending queries
When visiting a graphql buffer, you have access to the ability to send the
current query with =C-c C-c= which will prompt you for an optional variables file,
then execute the query and return a buffer of the results.

It's also possible to send queries using org-babel using a block such as the
ones below (executing correctly will require =:lang org=)

#+NAME: my-variables
#+begin_src json
{
    "continentCode": "AF"
}
#+end_src

#+BEGIN_SRC graphql :url https://countries.trevorblades.com/ :variables my-variables
query GetContinents($continentCode: String!) {
  continent(code: $continentCode) {
    name
    code
  }
}
#+END_SRC

#+RESULTS:
: {
:   "data": {
:     "continent": {
:       "name": "Africa",
:       "code": "AF"
:     }
:   }
: }

** Viewing docs
With this module, there are 3 ways to view schemas:
+ =+graphql-doc-open-config= which uses a local [[https://github.com/jimkyndemeyer/graphql-config-examples][=.graphqlconfig=]] file to seed endpoints to query
+ =graphql-doc= which prompts you to select an endpoint based on ones added manually by =graphql-doc-add-api=
+ =graphql-doc-open-url= which prompts to to manually enter an endpoint url

When using the doc viewer, there are a few bindings for navigating around.

| Key         | Command             | Description                       |
|-------------+---------------------+-----------------------------------|
| =C-j=         | =forward-button=      | Follow a forward button           |
| =C-k=         | =backward-button=     | Follow a backward button          |
| =<backspace>= | =graphql-doc-go-back= | Go back to a previous page        |
| =mouse-1=     | -                   | Follow the next label under =point= |
| =RET=         | -                   | Follow the next label under =point= |

* Configuration
Most of the "magic" in the module relies on a properly configured
[[https://github.com/jimkyndemeyer/graphql-config-examples][=.graphqlconfig=]] file, so follow the examples linked to create an appropriate
setup.

LSP configuration is handled through [[https://github.com/graphql/graphiql/tree/main/packages/graphql-language-service-cli#graphql-configuration-file-graphqlrcyml][GraphQL Config]] to handle custom directives/documents/validation etc.

These files will also be useful to other editors, so it would be worth trying to
get them into version control.

* Troubleshooting
- [[https://github.com/ifitzpatrick/graphql-doc.el/issues][Issues with the doc viewer]]
- [[https://github.com/davazp/graphql-mode/issues][Issues with graphql-mode]]
- [[https://github.com/emacs-lsp/lsp-mode/issues][Issues with LSP]] ([[https://github.com/graphql/graphiql/issues][Upstream LSP issues]])
