feat(lsp): use smarter detection of typescript project #4217
+168
−73
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Problem: TypeScript projects face an issue where the appropriate LSP to launch differs depending on whether it's a Deno project or a Node/Bun project. Furthermore, as Deno started supporting workspaces and coexisting with package.json, problems arise such as LSPs failing to launch or two LSPs launching simultaneously. This has led to the codebase for resolving these issues becoming complex and prone to omissions.
Solution: I introduced a function
detect_projectintolspconfig.typescriptto determine the TypeScript project type (eithernode,bun, ordeno) and its root directory. I then rewrote the logic in various TypeScript-related LSPs (biome,denols,eslint,ts_ls,tsgo,vtsls), which was previously written individually, to use the determination made by this function.Testing: I created and ran a test runner to confirm that
detect_projectworks as expected in AsPulse/lspconfig-detection-test. Infixtures/, we describe situations that should be tested, and intests/, we describe which runtime androot_dirshould be detected. I've confirmed that the code in the PR passes these tests. I also confirmed that a neovim environment that was installed nvim-lspconfig, included in the PR, functioned as intended.