# quick-lint-js LSP server documentation

This page documents the quick-lint-js Language Server Protocol (LSP) server.

This page is written for people writing editor plugins. If you just want to use quick-lint-js in your editor, follow one of these installation guides instead:

- Visual Studio Code
- VSCodium
- Vim
- Neovim
- Sublime Text
- Emacs
- Kate

## Description

quick-lint-js supports the Language Server Protocol. This allows code editors to ask quick-lint-js for diagnostics which can be displayed inline.

To start the quick-lint-js LSP server, run the quick-lint-js CLI with the --lsp-server option. The server accepts JSON-RPC+LSP messages from the editor via standard input, and sends JSON-RPC messages to the editor via standard output.

## Supported LSP features

quick-lint-js can receive and handle the following LSP requests and notifications:

- Basic lifecycle

  - `exit`

  - `initialize`

  - `initialized`

  - `shutdown`

- Document sync

  - `textDocument/didClose`

  - `textDocument/didOpen`

  - `textDocument/didChange`

quick-lint-js sends the following LSP requests and notifications:

- `textDocument/publishDiagnostics`

- `window/showMessage`

- `workspace/configuration`

## Document languageId

quick-lint-js uses `languageId` from a `textDocument/didOpen` notification to determine the language of that LSP document according to the following table:

quick-lint-js’s interpretation of languageId
LSP languageId | Equivalent --language= command-line option
`javascript` | `javascript-jsx`
`javascriptreact` | `javascript-jsx`
`js-jsx` | `javascript-jsx`
`js` | `javascript-jsx`
`tsx` | `experimental-typescript-jsx`
`typescript` | See below
`typescriptsource` | `experimental-typescript`
`typescriptdefinition` | `experimental-typescript-definition`
`typescriptreact` | `experimental-typescript-jsx`
(any) | See below

If the `languageId` is equal to `typescript`, then quick-lint-js inspects the base name of that document’s URI to determine the language of that document:

- If the base name contains ".d.", then quick-lint-js interprets the document as if `languageId` was instead `typescriptdefinition`.

- Otherwise, if the base name ends with ".tsx", then quick-lint-js interprets the document as if `languageId` was instead `typescriptreact`.

- Otherwise, quick-lint-js interprets the document as if `languageId` was instead `typescriptsource`.

quick-lint-js interprets documents with a base name of `quick-lint-js.config` as a JSON config file. The document’s language ID is ignored. See quick-lint-js.config(5) for more details.

## Configuration

The quick-lint-js LSP server accepts the following configuration settings, communicated through `workspace/configuration`:

`quick-lint-js.tracing-directory`

  Log raw LSP messages between the editor and quick-lint-js. A timestamped subdirectory is created inside the tracing directory containing binary log files. If null or an empty string, tracing is disabled.

It is also possible to configure quick-lint-js using the `initialize` request. To do so, set `initializationOptions` to an object containing a `configuration` object containing the settings. For example, the following `initialize` request sets `quick-lint-js.tracing-directory`:

    {
      "jsonrpc": "2.0",
      "id": 1,
      "method": "initialize",
      "params": {
        "processId": null,
        "rootUri": null,
        "capabilities": {},
        "initializationOptions": {
          "configuration": {
            "quick-lint-js.tracing-directory": "/tmp/quick-lint-js-logs"
          }
        }
      }
    }