mirror of
https://github.com/belsabbagh/dotfiles.git
synced 2026-08-09 20:47:55 +00:00
55 lines
1.5 KiB
Lua
55 lines
1.5 KiB
Lua
local function resolve_bin(root_dir)
|
|
local candidates = { 'tsc' }
|
|
if root_dir then
|
|
table.insert(candidates, 1, root_dir .. '/node_modules/.bin/tsc')
|
|
end
|
|
for _, bin in ipairs(candidates) do
|
|
if vim.fn.executable(bin) == 1 then
|
|
return bin
|
|
end
|
|
end
|
|
end
|
|
|
|
local function check_version(bin)
|
|
local ver = vim.fn.system({ bin, '--version' })
|
|
local major = tonumber(ver:match('Version (%d+)'))
|
|
return major and major >= 7, major
|
|
end
|
|
|
|
---@type vim.lsp.Config
|
|
return {
|
|
cmd = function(dispatchers, config)
|
|
local bin = resolve_bin(config.root_dir)
|
|
return vim.lsp.rpc.start({ bin, '--lsp', '--stdio' }, dispatchers)
|
|
end,
|
|
filetypes = {
|
|
'javascript',
|
|
'javascriptreact',
|
|
'javascript.jsx',
|
|
'typescript',
|
|
'typescriptreact',
|
|
'typescript.tsx',
|
|
},
|
|
root_dir = function(bufnr, on_dir)
|
|
local root_markers = { 'package-lock.json', 'yarn.lock', 'pnpm-lock.yaml', 'bun.lockb', 'bun.lock' }
|
|
root_markers = vim.fn.has 'nvim-0.11.3' == 1 and { root_markers, { '.git' } } or vim.list_extend(root_markers, { '.git' })
|
|
|
|
if vim.fs.root(bufnr, { 'deno.json', 'deno.jsonc', 'deno.lock' }) then
|
|
return
|
|
end
|
|
|
|
local project_root = vim.fs.root(bufnr, root_markers) or vim.fn.getcwd()
|
|
|
|
local bin = resolve_bin(project_root)
|
|
if not bin then return end
|
|
|
|
local ok, major = check_version(bin)
|
|
if not ok then
|
|
vim.notify(('ts7: need TypeScript >=7, got %d'):format(major or 0), vim.log.levels.WARN)
|
|
return
|
|
end
|
|
|
|
on_dir(project_root)
|
|
end,
|
|
}
|