quick-lint-js

Find bugs in JavaScript programs.

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:

Table of Contents

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

typescript-jsx

typescript

See below

typescriptsource

typescript

typescriptdefinition

typescript-definition

typescriptreact

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"
      }
    }
  }
}