LazyVim.LazyVim/lua/lazyvim/plugins/extras/lang/vue.lua
2025-07-08 16:24:23 +02:00

69 lines
2.3 KiB
Lua

return {
recommended = function()
return LazyVim.extras.wants({
ft = "vue",
root = { "vue.config.js" },
})
end,
-- depends on the typescript extra
{ import = "lazyvim.plugins.extras.lang.typescript" },
{
"nvim-treesitter/nvim-treesitter",
opts = { ensure_installed = { "vue", "css" } },
},
-- Configure vtsls (the TypeScript plugin host) with @vue/typescript-plugin
{
"neovim/nvim-lspconfig",
opts = function(_, opts)
opts.servers.vtsls = opts.servers.vtsls or {}
opts.servers.vtsls.filetypes = opts.servers.vtsls.filetypes or {}
table.insert(opts.servers.vtsls.filetypes, "vue")
LazyVim.extend(opts.servers.vtsls, "settings.vtsls.tsserver.globalPlugins", {
{
name = "@vue/typescript-plugin",
location = LazyVim.get_pkg_path("vue-language-server", "/node_modules/@vue/language-server"),
languages = { "vue" },
configNamespace = "typescript",
enableForWorkspaceTypeScriptVersions = true,
},
})
end,
},
-- Hook vue_ls to forward requests to vtsls
{
"neovim/nvim-lspconfig",
opts = {
servers = {
volar = { -- when LazyVim switches to nvim-lspconfig ≥ v2.2.0 rename this to `vue_ls`
on_init = function(client)
client.handlers["tsserver/request"] = function(_, result, context)
-- find the vtsls client
local clients = vim.lsp.get_clients({ bufnr = context.bufnr, name = "vtsls" })
if #clients == 0 then
vim.notify("Could not find `vtsls` client, Vue LSP features will be disabled", vim.log.levels.ERROR)
return
end
local ts_client = clients[1]
-- unpack the forwarded request
local params = unpack(result)
local id, command, payload = unpack(params)
-- forward it
ts_client:exec_cmd({
title = "vue_request_forward",
command = "typescript.tsserverRequest",
arguments = { command, payload },
}, { bufnr = context.bufnr }, function(_, resp)
-- send the tsserver/response back to Vue LSP
client.notify("tsserver/response", { { id, resp.body } })
end)
end
end,
},
},
},
},
}