local util = require("lspconfig.util")
|
|
local utils = require("lsp.utils")
|
|
|
|
-- Determine base path for node_modules
|
|
local base_path = utils.find_node_modules_path()
|
|
|
|
if not base_path then
|
|
vim.notify("No global node_modules found for TypeScript server", vim.log.levels.WARN)
|
|
base_path = ""
|
|
end
|
|
|
|
local function get_typescript_server_path(root_dir)
|
|
local global_ts = base_path .. "/typescript/lib"
|
|
local found_ts = ""
|
|
|
|
local function check_dir(path)
|
|
found_ts = table.concat({ path, "typescript", "lib" }, "/")
|
|
if vim.loop.fs_stat(found_ts) then
|
|
return path
|
|
end
|
|
end
|
|
|
|
-- Check frontend/node_modules first
|
|
if util.search_ancestors(root_dir .. '/frontend/node_modules', check_dir) then
|
|
return found_ts
|
|
end
|
|
|
|
-- Check root node_modules
|
|
if util.search_ancestors(root_dir .. '/node_modules', check_dir) then
|
|
return found_ts
|
|
end
|
|
|
|
return global_ts
|
|
end
|
|
|
|
local function get_tsserver_cmd(root_dir)
|
|
-- Check for local typescript-language-server in node_modules
|
|
local tsserver
|
|
|
|
tsserver = root_dir .. '/node_modules/.bin/typescript-language-server'
|
|
if vim.loop.fs_stat(tsserver) then
|
|
return { tsserver, '--stdio' }
|
|
end
|
|
|
|
-- Check for local typescript-language-server in node_modules
|
|
tsserver = root_dir .. '/node_modules/.bin/tsserver'
|
|
if vim.loop.fs_stat(tsserver) then
|
|
return { tsserver, '--stdio' }
|
|
end
|
|
|
|
-- Check frontend/node_modules
|
|
tsserver = root_dir .. '/frontend/node_modules/.bin/typescript-language-server'
|
|
if vim.loop.fs_stat(tsserver) then
|
|
return { tsserver, '--stdio' }
|
|
end
|
|
|
|
-- Check frontend/node_modules
|
|
tsserver = root_dir .. '/frontend/node_modules/.bin/tsserver'
|
|
if vim.loop.fs_stat(tsserver) then
|
|
return { tsserver, '--stdio' }
|
|
end
|
|
|
|
-- Fallback to Mason
|
|
return { vim.fn.expand('~/.local/share/nvim/mason/bin/typescript-language-server'), '--stdio' }
|
|
end
|
|
|
|
local function organize_imports()
|
|
local params = {
|
|
command = "_typescript.organizeImports",
|
|
arguments = { vim.api.nvim_buf_get_name(0) },
|
|
title = ""
|
|
}
|
|
vim.lsp.buf.execute_command(params)
|
|
end
|
|
|
|
return {
|
|
cmd = { vim.fn.expand('~/.local/share/nvim/mason/bin/typescript-language-server'), '--stdio' },
|
|
init_options = {
|
|
plugins = {
|
|
{
|
|
name = "@vue/typescript-plugin",
|
|
location = base_path .. "/@vue/typescript-plugin",
|
|
languages = { "javascript", "typescript", "vue", "react" },
|
|
},
|
|
},
|
|
},
|
|
filetypes = {
|
|
"javascript",
|
|
"typescript",
|
|
"vue",
|
|
"typescriptreact",
|
|
},
|
|
root_markers = { "package.json", "package-lock.json" },
|
|
commands = {
|
|
OrganizeImports = {
|
|
organize_imports,
|
|
description = "Organize Imports"
|
|
}
|
|
},
|
|
before_init = function(initialize_params, config)
|
|
local root_dir = initialize_params.rootPath or initialize_params.rootUri
|
|
if root_dir and root_dir:match("^file://") then
|
|
root_dir = vim.uri_to_fname(root_dir)
|
|
end
|
|
|
|
-- Update cmd
|
|
config.cmd = get_tsserver_cmd(root_dir)
|
|
|
|
-- Update tsdk
|
|
if get_typescript_server_path then
|
|
config.init_options.typescript = config.init_options.typescript or {}
|
|
config.init_options.typescript.tsdk = get_typescript_server_path(root_dir)
|
|
end
|
|
end,
|
|
}
|