---@brief --- --- https://github.com/typescript-language-server/typescript-language-server --- --- `ts_ls`, aka `typescript-language-server`, is a Language Server Protocol implementation for TypeScript wrapping `tsserver`. Note that `ts_ls` is not `tsserver`. --- --- `typescript-language-server` depends on `typescript`. Both packages can be installed via `npm`: --- ```sh --- npm install -g typescript typescript-language-server --- ``` --- --- To configure typescript language server, add a --- [`tsconfig.json`](https://www.typescriptlang.org/docs/handbook/tsconfig-json.html) or --- [`jsconfig.json`](https://code.visualstudio.com/docs/languages/jsconfig) to the root of your --- project. --- --- Here's an example that disables type checking in JavaScript files. --- --- ```json --- { --- "compilerOptions": { --- "module": "commonjs", --- "target": "es6", --- "checkJs": false --- }, --- "exclude": [ --- "node_modules" --- ] --- } --- ``` --- --- Use the `:LspTypescriptSourceAction` command to see "whole file" ("source") code-actions such as: --- - organize imports --- - remove unused code return { init_options = { hostInfo = 'neovim' }, cmd = { 'typescript-language-server', '--stdio' }, filetypes = { 'javascript', 'javascriptreact', 'javascript.jsx', 'typescript', 'typescriptreact', 'typescript.tsx', }, root_markers = { 'tsconfig.json', 'jsconfig.json', 'package.json', '.git' }, handlers = { -- handle rename request for certain code actions like extracting functions / types ['_typescript.rename'] = function(_, result, ctx) local client = assert(vim.lsp.get_client_by_id(ctx.client_id)) vim.lsp.util.show_document({ uri = result.textDocument.uri, range = { start = result.position, ['end'] = result.position, }, }, client.offset_encoding) vim.lsp.buf.rename() return vim.NIL end, }, commands = { ['editor.action.showReferences'] = function(command, ctx) local client = assert(vim.lsp.get_client_by_id(ctx.client_id)) local file_uri, position, references = unpack(command.arguments) local quickfix_items = vim.lsp.util.locations_to_items(references, client.offset_encoding) vim.fn.setqflist({}, ' ', { title = command.title, items = quickfix_items, context = { command = command, bufnr = ctx.bufnr, }, }) vim.lsp.util.show_document({ uri = file_uri, range = { start = position, ['end'] = position, }, }, client.offset_encoding) vim.cmd('botright copen') end, }, on_attach = function(client, bufnr) -- ts_ls provides `source.*` code actions that apply to the whole file. These only appear in -- `vim.lsp.buf.code_action()` if specified in `context.only`. vim.api.nvim_buf_create_user_command(bufnr, 'LspTypescriptSourceAction', function() local source_actions = vim.tbl_filter(function(action) return vim.startswith(action, 'source.') end, client.server_capabilities.codeActionProvider.codeActionKinds) vim.lsp.buf.code_action({ context = { only = source_actions, }, }) end, {}) end, }