From 22e1bcccadac6cc98e8f2610182531cc24e395e5 Mon Sep 17 00:00:00 2001 From: tidely <43219534+tidely@users.noreply.github.com> Date: Mon, 8 Dec 2025 23:19:10 +0200 Subject: [PATCH] languages: Check whether to update `typescript-language-server` (#44343) Closes #43155 Adds a missing check to also update packages when the `typescript-language-server` package is outdated. I created a new `SERVER_PACKAGE_NAME ` constant so that the package name isn't coupled to the language server name inside of Zed. Release Notes: - Fixed the typescript language server falling out of date --- crates/languages/src/typescript.rs | 54 ++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/crates/languages/src/typescript.rs b/crates/languages/src/typescript.rs index b02fb40ac7d84eba03766bcdfc19fb0eee04a6ca..a7aa1bc49c0132b01d0fe45d94a29af4efac6602 100644 --- a/crates/languages/src/typescript.rs +++ b/crates/languages/src/typescript.rs @@ -599,14 +599,19 @@ pub struct TypeScriptLspAdapter { } impl TypeScriptLspAdapter { - const OLD_SERVER_PATH: &'static str = "node_modules/typescript-language-server/lib/cli.js"; - const NEW_SERVER_PATH: &'static str = "node_modules/typescript-language-server/lib/cli.mjs"; - const SERVER_NAME: LanguageServerName = - LanguageServerName::new_static("typescript-language-server"); + const OLD_SERVER_PATH: &str = "node_modules/typescript-language-server/lib/cli.js"; + const NEW_SERVER_PATH: &str = "node_modules/typescript-language-server/lib/cli.mjs"; + const PACKAGE_NAME: &str = "typescript"; + const SERVER_PACKAGE_NAME: &str = "typescript-language-server"; + + const SERVER_NAME: LanguageServerName = + LanguageServerName::new_static(Self::SERVER_PACKAGE_NAME); + pub fn new(node: NodeRuntime, fs: Arc) -> Self { TypeScriptLspAdapter { fs, node } } + async fn tsdk_path(&self, adapter: &Arc) -> Option<&'static str> { let is_yarn = adapter .read_text_file(RelPath::unix(".yarn/sdks/typescript/lib/typescript.js").unwrap()) @@ -646,10 +651,13 @@ impl LspInstaller for TypeScriptLspAdapter { _: &mut AsyncApp, ) -> Result { Ok(TypeScriptVersions { - typescript_version: self.node.npm_package_latest_version("typescript").await?, + typescript_version: self + .node + .npm_package_latest_version(Self::PACKAGE_NAME) + .await?, server_version: self .node - .npm_package_latest_version("typescript-language-server") + .npm_package_latest_version(Self::SERVER_PACKAGE_NAME) .await?, }) } @@ -662,7 +670,7 @@ impl LspInstaller for TypeScriptLspAdapter { ) -> Option { let server_path = container_dir.join(Self::NEW_SERVER_PATH); - let should_install_language_server = self + if self .node .should_install_npm_package( Self::PACKAGE_NAME, @@ -670,17 +678,29 @@ impl LspInstaller for TypeScriptLspAdapter { container_dir, VersionStrategy::Latest(version.typescript_version.as_str()), ) - .await; + .await + { + return None; + } - if should_install_language_server { - None - } else { - Some(LanguageServerBinary { - path: self.node.binary_path().await.ok()?, - env: None, - arguments: typescript_server_binary_arguments(&server_path), - }) + if self + .node + .should_install_npm_package( + Self::SERVER_PACKAGE_NAME, + &server_path, + container_dir, + VersionStrategy::Latest(version.server_version.as_str()), + ) + .await + { + return None; } + + Some(LanguageServerBinary { + path: self.node.binary_path().await.ok()?, + env: None, + arguments: typescript_server_binary_arguments(&server_path), + }) } async fn fetch_server_binary( @@ -700,7 +720,7 @@ impl LspInstaller for TypeScriptLspAdapter { latest_version.typescript_version.as_str(), ), ( - "typescript-language-server", + Self::SERVER_PACKAGE_NAME, latest_version.server_version.as_str(), ), ],