Skip to main content

JavaScript and TypeScript Setup

Required Tools

# LSP server
npm install -g typescript typescript-language-server

# Linters
npm install -g eslint eslint_d # eslint_d is faster daemon

# Formatters
npm install -g prettier

# Mason installation
:MasonInstall ts_ls eslint_d prettier

TypeScript LSP Configuration

lspconfig.ts_ls.setup({
on_attach = on_attach,
capabilities = capabilities,
settings = {
typescript = {
inlayHints = {
includeInlayParameterNameHints = "all",
includeInlayParameterNameHintsWhenArgumentMatchesName = false,
includeInlayFunctionParameterTypeHints = true,
includeInlayVariableTypeHints = true,
includeInlayPropertyDeclarationTypeHints = true,
includeInlayFunctionLikeReturnTypeHints = true,
includeInlayEnumMemberValueHints = true,
},
},
javascript = {
inlayHints = {
includeInlayParameterNameHints = "all",
},
},
completions = {
completeFunctionCalls = true,
},
},
})

ESLint LSP

lspconfig.eslint.setup({
on_attach = function(client, bufnr)
on_attach(client, bufnr)
-- Auto-fix on save
vim.api.nvim_create_autocmd("BufWritePre", {
buffer = bufnr,
command = "EslintFixAll",
})
end,
capabilities = capabilities,
})

Formatters and Linters (none-ls)

null_ls.setup({
sources = {
null_ls.builtins.formatting.prettier.with({
filetypes = {
"javascript", "javascriptreact",
"typescript", "typescriptreact",
"css", "html", "json", "yaml", "markdown",
},
}),
null_ls.builtins.diagnostics.eslint_d,
null_ls.builtins.code_actions.eslint_d,
},
})

.prettierrc Config

.prettierrc
{
"semi": false,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "es5",
"printWidth": 100
}

tsconfig.json Integration

Pyright and ts_ls automatically detect tsconfig.json. Place it in the project root.

Running npm Scripts from Neovim

custom keymap
vim.keymap.set("n", "<leader>ns", function()
local scripts = vim.fn.systemlist("cat package.json | jq -r '.scripts | keys[]'")
vim.ui.select(scripts, { prompt = "Select npm script: " }, function(choice)
if choice then
vim.cmd("split | terminal npm run " .. choice)
end
end)
end, { desc = "Run npm script" })

What's Next