From 93835565a746e252b3342dbab688c22bdea81da7 Mon Sep 17 00:00:00 2001 From: Estacio Pereira Date: Fri, 4 Apr 2025 08:34:33 -0300 Subject: fix(eslint): find closest ESLint directory to avoid version mismatch #3686 --- lua/lspconfig/configs/eslint.lua | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'lua') diff --git a/lua/lspconfig/configs/eslint.lua b/lua/lspconfig/configs/eslint.lua index e701928d..f80eee4b 100644 --- a/lua/lspconfig/configs/eslint.lua +++ b/lua/lspconfig/configs/eslint.lua @@ -47,6 +47,28 @@ local root_file = { 'eslint.config.cts', } +--- Find the closest directory containing the ESLint library. +--- Using the repository root as the ESLint library location is a common practice +--- but handling different versions in monorepos can cause the LSP not to point to +--- the correct instance. +--- +--- @return string|nil (path) The path to the closest directory containing the ESLint library, or nil if not found. +local function get_eslint_closest_dir() + local cwd = vim.fn.getcwd() + local eslint_node_modules = vim.fn.finddir('node_modules/eslint', cwd .. ';') + + if eslint_node_modules == '' then + return nil + end + + if eslint_node_modules == 'node_modules/eslint' then + return cwd + end + + -- Strip the node_modules/eslint part + return eslint_node_modules:match '(.*)/node_modules/eslint' +end + return { default_config = { cmd = { 'vscode-eslint-language-server', '--stdio' }, @@ -102,6 +124,8 @@ return { }, }, on_new_config = function(config, new_root_dir) + new_root_dir = get_eslint_closest_dir() or new_root_dir + -- The "workspaceFolder" is a VSCode concept. It limits how far the -- server will traverse the file system when locating the ESLint config -- file (e.g., .eslintrc). -- cgit v1.2.3-70-g09d2