Detailed changes
@@ -8814,6 +8814,7 @@ dependencies = [
"regex",
"rpc",
"schemars",
+ "semver",
"serde",
"serde_json",
"settings",
@@ -9048,6 +9049,7 @@ dependencies = [
"regex",
"rope",
"rust-embed",
+ "semver",
"serde",
"serde_json",
"serde_json_lenient",
@@ -1246,7 +1246,10 @@ async fn get_copilot_lsp(fs: Arc<dyn Fs>, node_runtime: NodeRuntime) -> anyhow::
.await;
if should_install {
node_runtime
- .npm_install_packages(paths::copilot_dir(), &[(PACKAGE_NAME, &latest_version)])
+ .npm_install_packages(
+ paths::copilot_dir(),
+ &[(PACKAGE_NAME, &latest_version.to_string())],
+ )
.await?;
}
@@ -736,6 +736,7 @@ impl nodejs::Host for WasmState {
.node_runtime
.npm_package_latest_version(&package_name)
.await
+ .map(|v| v.to_string())
.to_wasmtime_result()
}
@@ -747,6 +748,7 @@ impl nodejs::Host for WasmState {
.node_runtime
.npm_package_installed_version(&self.work_dir(), &package_name)
.await
+ .map(|option| option.map(|version| version.to_string()))
.to_wasmtime_result()
}
@@ -48,6 +48,7 @@ rand = { workspace = true, optional = true }
regex.workspace = true
rpc.workspace = true
schemars.workspace = true
+semver.workspace = true
serde.workspace = true
serde_json.workspace = true
settings.workspace = true
@@ -43,6 +43,7 @@ pub use manifest::{ManifestDelegate, ManifestName, ManifestProvider, ManifestQue
use parking_lot::Mutex;
use regex::Regex;
use schemars::{JsonSchema, SchemaGenerator, json_schema};
+use semver::Version;
use serde::{Deserialize, Deserializer, Serialize, Serializer, de};
use serde_json::Value;
use settings::WorktreeId;
@@ -347,7 +348,7 @@ pub trait LspAdapterDelegate: Send + Sync {
async fn npm_package_installed_version(
&self,
package_name: &str,
- ) -> Result<Option<(PathBuf, String)>>;
+ ) -> Result<Option<(PathBuf, Version)>>;
async fn which(&self, command: &OsStr) -> Option<PathBuf>;
async fn shell_env(&self) -> HashMap<String, String>;
async fn read_text_file(&self, path: &RelPath) -> Result<String>;
@@ -68,6 +68,7 @@ serde_json.workspace = true
serde_json_lenient.workspace = true
settings.workspace = true
smallvec.workspace = true
+semver.workspace = true
smol.workspace = true
snippet.workspace = true
task.workspace = true
@@ -5,6 +5,7 @@ use language::{LspAdapter, LspAdapterDelegate, LspInstaller, Toolchain};
use lsp::{LanguageServerBinary, LanguageServerName, Uri};
use node_runtime::{NodeRuntime, VersionStrategy};
use project::lsp_store::language_server_settings;
+use semver::Version;
use serde_json::json;
use std::{
ffi::OsString,
@@ -32,14 +33,14 @@ impl CssLspAdapter {
}
impl LspInstaller for CssLspAdapter {
- type BinaryVersion = String;
+ type BinaryVersion = Version;
async fn fetch_latest_server_version(
&self,
_: &dyn LspAdapterDelegate,
_: bool,
_: &mut AsyncApp,
- ) -> Result<String> {
+ ) -> Result<Self::BinaryVersion> {
self.node
.npm_package_latest_version("vscode-langservers-extracted")
.await
@@ -65,11 +66,12 @@ impl LspInstaller for CssLspAdapter {
async fn fetch_server_binary(
&self,
- latest_version: String,
+ latest_version: Self::BinaryVersion,
container_dir: PathBuf,
_: &dyn LspAdapterDelegate,
) -> Result<LanguageServerBinary> {
let server_path = container_dir.join(SERVER_PATH);
+ let latest_version = latest_version.to_string();
self.node
.npm_install_packages(
@@ -87,7 +89,7 @@ impl LspInstaller for CssLspAdapter {
async fn check_if_version_installed(
&self,
- version: &String,
+ version: &Self::BinaryVersion,
container_dir: &PathBuf,
_: &dyn LspAdapterDelegate,
) -> Option<LanguageServerBinary> {
@@ -13,6 +13,7 @@ use language::{
use lsp::{LanguageServerBinary, LanguageServerName, Uri};
use node_runtime::{NodeRuntime, VersionStrategy};
use project::lsp_store::language_server_settings;
+use semver::Version;
use serde_json::{Value, json};
use smol::{
fs::{self},
@@ -142,14 +143,14 @@ impl JsonLspAdapter {
}
impl LspInstaller for JsonLspAdapter {
- type BinaryVersion = String;
+ type BinaryVersion = Version;
async fn fetch_latest_server_version(
&self,
_: &dyn LspAdapterDelegate,
_: bool,
_: &mut AsyncApp,
- ) -> Result<String> {
+ ) -> Result<Self::BinaryVersion> {
self.node
.npm_package_latest_version(Self::PACKAGE_NAME)
.await
@@ -175,7 +176,7 @@ impl LspInstaller for JsonLspAdapter {
async fn check_if_version_installed(
&self,
- version: &String,
+ version: &Self::BinaryVersion,
container_dir: &PathBuf,
_: &dyn LspAdapterDelegate,
) -> Option<LanguageServerBinary> {
@@ -204,11 +205,12 @@ impl LspInstaller for JsonLspAdapter {
async fn fetch_server_binary(
&self,
- latest_version: String,
+ latest_version: Self::BinaryVersion,
container_dir: PathBuf,
_: &dyn LspAdapterDelegate,
) -> Result<LanguageServerBinary> {
let server_path = container_dir.join(SERVER_PATH);
+ let latest_version = latest_version.to_string();
self.node
.npm_install_packages(
@@ -19,6 +19,7 @@ use pet_core::python_environment::{PythonEnvironment, PythonEnvironmentKind};
use pet_virtualenv::is_virtualenv_dir;
use project::Fs;
use project::lsp_store::language_server_settings;
+use semver::Version;
use serde::{Deserialize, Serialize};
use serde_json::{Value, json};
use settings::Settings;
@@ -621,14 +622,14 @@ impl LspAdapter for PyrightLspAdapter {
}
impl LspInstaller for PyrightLspAdapter {
- type BinaryVersion = String;
+ type BinaryVersion = Version;
async fn fetch_latest_server_version(
&self,
_: &dyn LspAdapterDelegate,
_: bool,
_: &mut AsyncApp,
- ) -> Result<String> {
+ ) -> Result<Self::BinaryVersion> {
self.node
.npm_package_latest_version(Self::SERVER_NAME.as_ref())
.await
@@ -672,6 +673,7 @@ impl LspInstaller for PyrightLspAdapter {
delegate: &dyn LspAdapterDelegate,
) -> Result<LanguageServerBinary> {
let server_path = container_dir.join(Self::SERVER_PATH);
+ let latest_version = latest_version.to_string();
self.node
.npm_install_packages(
@@ -2040,14 +2042,14 @@ impl LspAdapter for BasedPyrightLspAdapter {
}
impl LspInstaller for BasedPyrightLspAdapter {
- type BinaryVersion = String;
+ type BinaryVersion = Version;
async fn fetch_latest_server_version(
&self,
_: &dyn LspAdapterDelegate,
_: bool,
_: &mut AsyncApp,
- ) -> Result<String> {
+ ) -> Result<Self::BinaryVersion> {
self.node
.npm_package_latest_version(Self::SERVER_NAME.as_ref())
.await
@@ -2092,6 +2094,7 @@ impl LspInstaller for BasedPyrightLspAdapter {
delegate: &dyn LspAdapterDelegate,
) -> Result<LanguageServerBinary> {
let server_path = container_dir.join(Self::SERVER_PATH);
+ let latest_version = latest_version.to_string();
self.node
.npm_install_packages(
@@ -6,6 +6,7 @@ use language::{LanguageName, LspAdapter, LspAdapterDelegate, LspInstaller, Toolc
use lsp::{LanguageServerBinary, LanguageServerName, Uri};
use node_runtime::{NodeRuntime, VersionStrategy};
use project::lsp_store::language_server_settings;
+use semver::Version;
use serde_json::{Value, json};
use std::{
ffi::OsString,
@@ -39,14 +40,14 @@ impl TailwindLspAdapter {
}
impl LspInstaller for TailwindLspAdapter {
- type BinaryVersion = String;
+ type BinaryVersion = Version;
async fn fetch_latest_server_version(
&self,
_: &dyn LspAdapterDelegate,
_: bool,
_: &mut AsyncApp,
- ) -> Result<String> {
+ ) -> Result<Self::BinaryVersion> {
self.node
.npm_package_latest_version(Self::PACKAGE_NAME)
.await
@@ -70,11 +71,12 @@ impl LspInstaller for TailwindLspAdapter {
async fn fetch_server_binary(
&self,
- latest_version: String,
+ latest_version: Self::BinaryVersion,
container_dir: PathBuf,
_: &dyn LspAdapterDelegate,
) -> Result<LanguageServerBinary> {
let server_path = container_dir.join(SERVER_PATH);
+ let latest_version = latest_version.to_string();
self.node
.npm_install_packages(
@@ -92,7 +94,7 @@ impl LspInstaller for TailwindLspAdapter {
async fn check_if_version_installed(
&self,
- version: &String,
+ version: &Self::BinaryVersion,
container_dir: &PathBuf,
_: &dyn LspAdapterDelegate,
) -> Option<LanguageServerBinary> {
@@ -12,6 +12,7 @@ use language::{
use lsp::{CodeActionKind, LanguageServerBinary, LanguageServerName, Uri};
use node_runtime::{NodeRuntime, VersionStrategy};
use project::{Fs, lsp_store::language_server_settings};
+use semver::Version;
use serde_json::{Value, json};
use smol::lock::RwLock;
use std::{
@@ -635,8 +636,8 @@ impl TypeScriptLspAdapter {
}
pub struct TypeScriptVersions {
- typescript_version: String,
- server_version: String,
+ typescript_version: Version,
+ server_version: Version,
}
impl LspInstaller for TypeScriptLspAdapter {
@@ -647,7 +648,7 @@ impl LspInstaller for TypeScriptLspAdapter {
_: &dyn LspAdapterDelegate,
_: bool,
_: &mut AsyncApp,
- ) -> Result<TypeScriptVersions> {
+ ) -> Result<Self::BinaryVersion> {
Ok(TypeScriptVersions {
typescript_version: self
.node
@@ -662,7 +663,7 @@ impl LspInstaller for TypeScriptLspAdapter {
async fn check_if_version_installed(
&self,
- version: &TypeScriptVersions,
+ version: &Self::BinaryVersion,
container_dir: &PathBuf,
_: &dyn LspAdapterDelegate,
) -> Option<LanguageServerBinary> {
@@ -674,7 +675,7 @@ impl LspInstaller for TypeScriptLspAdapter {
Self::PACKAGE_NAME,
&server_path,
container_dir,
- VersionStrategy::Latest(version.typescript_version.as_str()),
+ VersionStrategy::Latest(&version.typescript_version),
)
.await
{
@@ -687,7 +688,7 @@ impl LspInstaller for TypeScriptLspAdapter {
Self::SERVER_PACKAGE_NAME,
&server_path,
container_dir,
- VersionStrategy::Latest(version.server_version.as_str()),
+ VersionStrategy::Latest(&version.server_version),
)
.await
{
@@ -703,7 +704,7 @@ impl LspInstaller for TypeScriptLspAdapter {
async fn fetch_server_binary(
&self,
- latest_version: TypeScriptVersions,
+ latest_version: Self::BinaryVersion,
container_dir: PathBuf,
_: &dyn LspAdapterDelegate,
) -> Result<LanguageServerBinary> {
@@ -715,11 +716,11 @@ impl LspInstaller for TypeScriptLspAdapter {
&[
(
Self::PACKAGE_NAME,
- latest_version.typescript_version.as_str(),
+ &latest_version.typescript_version.to_string(),
),
(
Self::SERVER_PACKAGE_NAME,
- latest_version.server_version.as_str(),
+ &latest_version.server_version.to_string(),
),
],
)
@@ -7,6 +7,7 @@ use lsp::{CodeActionKind, LanguageServerBinary, LanguageServerName, Uri};
use node_runtime::{NodeRuntime, VersionStrategy};
use project::{Fs, lsp_store::language_server_settings};
use regex::Regex;
+use semver::Version;
use serde_json::Value;
use std::{
ffi::OsString,
@@ -74,8 +75,8 @@ impl VtslsLspAdapter {
}
pub struct TypeScriptVersions {
- typescript_version: String,
- server_version: String,
+ typescript_version: Version,
+ server_version: Version,
}
const SERVER_NAME: LanguageServerName = LanguageServerName::new_static("vtsls");
@@ -88,7 +89,7 @@ impl LspInstaller for VtslsLspAdapter {
_: &dyn LspAdapterDelegate,
_: bool,
_: &mut AsyncApp,
- ) -> Result<TypeScriptVersions> {
+ ) -> Result<Self::BinaryVersion> {
Ok(TypeScriptVersions {
typescript_version: self.node.npm_package_latest_version("typescript").await?,
server_version: self
@@ -115,12 +116,15 @@ impl LspInstaller for VtslsLspAdapter {
async fn fetch_server_binary(
&self,
- latest_version: TypeScriptVersions,
+ latest_version: Self::BinaryVersion,
container_dir: PathBuf,
_: &dyn LspAdapterDelegate,
) -> Result<LanguageServerBinary> {
let server_path = container_dir.join(Self::SERVER_PATH);
+ let typescript_version = latest_version.typescript_version.to_string();
+ let server_version = latest_version.server_version.to_string();
+
let mut packages_to_install = Vec::new();
if self
@@ -133,7 +137,7 @@ impl LspInstaller for VtslsLspAdapter {
)
.await
{
- packages_to_install.push((Self::PACKAGE_NAME, latest_version.server_version.as_str()));
+ packages_to_install.push((Self::PACKAGE_NAME, server_version.as_str()));
}
if self
@@ -146,10 +150,7 @@ impl LspInstaller for VtslsLspAdapter {
)
.await
{
- packages_to_install.push((
- Self::TYPESCRIPT_PACKAGE_NAME,
- latest_version.typescript_version.as_str(),
- ));
+ packages_to_install.push((Self::TYPESCRIPT_PACKAGE_NAME, typescript_version.as_str()));
}
self.node
@@ -7,6 +7,7 @@ use language::{
use lsp::{LanguageServerBinary, LanguageServerName, Uri};
use node_runtime::{NodeRuntime, VersionStrategy};
use project::lsp_store::language_server_settings;
+use semver::Version;
use serde_json::Value;
use settings::{Settings, SettingsLocation};
use std::{
@@ -35,14 +36,14 @@ impl YamlLspAdapter {
}
impl LspInstaller for YamlLspAdapter {
- type BinaryVersion = String;
+ type BinaryVersion = Version;
async fn fetch_latest_server_version(
&self,
_: &dyn LspAdapterDelegate,
_: bool,
_: &mut AsyncApp,
- ) -> Result<String> {
+ ) -> Result<Self::BinaryVersion> {
self.node
.npm_package_latest_version("yaml-language-server")
.await
@@ -66,7 +67,7 @@ impl LspInstaller for YamlLspAdapter {
async fn fetch_server_binary(
&self,
- latest_version: String,
+ latest_version: Self::BinaryVersion,
container_dir: PathBuf,
_: &dyn LspAdapterDelegate,
) -> Result<LanguageServerBinary> {
@@ -75,7 +76,7 @@ impl LspInstaller for YamlLspAdapter {
self.node
.npm_install_packages(
&container_dir,
- &[(Self::PACKAGE_NAME, latest_version.as_str())],
+ &[(Self::PACKAGE_NAME, &latest_version.to_string())],
)
.await?;
@@ -88,7 +89,7 @@ impl LspInstaller for YamlLspAdapter {
async fn check_if_version_installed(
&self,
- version: &String,
+ version: &Self::BinaryVersion,
container_dir: &PathBuf,
_: &dyn LspAdapterDelegate,
) -> Option<LanguageServerBinary> {
@@ -34,9 +34,9 @@ pub struct NodeBinaryOptions {
pub enum VersionStrategy<'a> {
/// Install if current version doesn't match pinned version
- Pin(&'a str),
+ Pin(&'a Version),
/// Install if current version is older than latest version
- Latest(&'a str),
+ Latest(&'a Version),
}
#[derive(Clone)]
@@ -230,14 +230,14 @@ impl NodeRuntime {
&self,
local_package_directory: &Path,
name: &str,
- ) -> Result<Option<String>> {
+ ) -> Result<Option<Version>> {
self.instance()
.await
.npm_package_installed_version(local_package_directory, name)
.await
}
- pub async fn npm_package_latest_version(&self, name: &str) -> Result<String> {
+ pub async fn npm_package_latest_version(&self, name: &str) -> Result<Version> {
let http = self.0.lock().await.http.clone();
let output = self
.instance()
@@ -280,16 +280,19 @@ impl NodeRuntime {
.map(|(name, version)| format!("{name}@{version}"))
.collect();
- let mut arguments: Vec<_> = packages.iter().map(|p| p.as_str()).collect();
- arguments.extend_from_slice(&[
- "--save-exact",
- "--fetch-retry-mintimeout",
- "2000",
- "--fetch-retry-maxtimeout",
- "5000",
- "--fetch-timeout",
- "5000",
- ]);
+ let arguments: Vec<_> = packages
+ .iter()
+ .map(|p| p.as_str())
+ .chain([
+ "--save-exact",
+ "--fetch-retry-mintimeout",
+ "2000",
+ "--fetch-retry-maxtimeout",
+ "5000",
+ "--fetch-timeout",
+ "5000",
+ ])
+ .collect();
// This is also wrong because the directory is wrong.
self.run_npm_subcommand(Some(directory), "install", &arguments)
@@ -320,23 +323,9 @@ impl NodeRuntime {
return true;
};
- let Some(installed_version) = Version::parse(&installed_version).log_err() else {
- return true;
- };
-
match version_strategy {
- VersionStrategy::Pin(pinned_version) => {
- let Some(pinned_version) = Version::parse(pinned_version).log_err() else {
- return true;
- };
- installed_version != pinned_version
- }
- VersionStrategy::Latest(latest_version) => {
- let Some(latest_version) = Version::parse(latest_version).log_err() else {
- return true;
- };
- installed_version < latest_version
- }
+ VersionStrategy::Pin(pinned_version) => &installed_version != pinned_version,
+ VersionStrategy::Latest(latest_version) => &installed_version < latest_version,
}
}
}
@@ -351,12 +340,12 @@ enum ArchiveType {
pub struct NpmInfo {
#[serde(default)]
dist_tags: NpmInfoDistTags,
- versions: Vec<String>,
+ versions: Vec<Version>,
}
#[derive(Debug, Deserialize, Default)]
pub struct NpmInfoDistTags {
- latest: Option<String>,
+ latest: Option<Version>,
}
#[async_trait::async_trait]
@@ -376,7 +365,7 @@ trait NodeRuntimeTrait: Send + Sync {
&self,
local_package_directory: &Path,
name: &str,
- ) -> Result<Option<String>>;
+ ) -> Result<Option<Version>>;
}
#[derive(Clone)]
@@ -610,7 +599,7 @@ impl NodeRuntimeTrait for ManagedNodeRuntime {
&self,
local_package_directory: &Path,
name: &str,
- ) -> Result<Option<String>> {
+ ) -> Result<Option<Version>> {
read_package_installed_version(local_package_directory.join("node_modules"), name).await
}
}
@@ -735,7 +724,7 @@ impl NodeRuntimeTrait for SystemNodeRuntime {
&self,
local_package_directory: &Path,
name: &str,
- ) -> Result<Option<String>> {
+ ) -> Result<Option<Version>> {
read_package_installed_version(local_package_directory.join("node_modules"), name).await
// todo: allow returning a globally installed version (requires callers not to hard-code the path)
}
@@ -744,7 +733,7 @@ impl NodeRuntimeTrait for SystemNodeRuntime {
pub async fn read_package_installed_version(
node_module_directory: PathBuf,
name: &str,
-) -> Result<Option<String>> {
+) -> Result<Option<Version>> {
let package_json_path = node_module_directory.join(name).join("package.json");
let mut file = match fs::File::open(package_json_path).await {
@@ -760,7 +749,7 @@ pub async fn read_package_installed_version(
#[derive(Deserialize)]
struct PackageJson {
- version: String,
+ version: Version,
}
let mut contents = String::new();
@@ -797,7 +786,7 @@ impl NodeRuntimeTrait for UnavailableNodeRuntime {
&self,
_local_package_directory: &Path,
_: &str,
- ) -> Result<Option<String>> {
+ ) -> Result<Option<Version>> {
bail!("{}", self.error_message)
}
}
@@ -22,6 +22,7 @@ use rpc::{
proto::{self, ExternalExtensionAgent},
};
use schemars::JsonSchema;
+use semver::Version;
use serde::{Deserialize, Serialize};
use settings::{RegisterSetting, SettingsStore};
use task::{Shell, SpawnInTerminal};
@@ -974,11 +975,10 @@ fn get_or_npm_install_builtin_agent(
}
versions.sort();
- let newest_version = if let Some((version, file_name)) = versions.last().cloned()
+ let newest_version = if let Some((version, _)) = versions.last().cloned()
&& minimum_version.is_none_or(|minimum_version| version >= minimum_version)
{
- versions.pop();
- Some(file_name)
+ versions.pop()
} else {
None
};
@@ -1004,9 +1004,8 @@ fn get_or_npm_install_builtin_agent(
})
.detach();
- let version = if let Some(file_name) = newest_version {
+ let version = if let Some((version, file_name)) = newest_version {
cx.background_spawn({
- let file_name = file_name.clone();
let dir = dir.clone();
let fs = fs.clone();
async move {
@@ -1015,7 +1014,7 @@ fn get_or_npm_install_builtin_agent(
.await
.ok();
if let Some(latest_version) = latest_version
- && &latest_version != &file_name.to_string_lossy()
+ && latest_version != version
{
let download_result = download_latest_version(
fs,
@@ -1028,7 +1027,9 @@ fn get_or_npm_install_builtin_agent(
if let Some(mut new_version_available) = new_version_available
&& download_result.is_some()
{
- new_version_available.send(Some(latest_version)).ok();
+ new_version_available
+ .send(Some(latest_version.to_string()))
+ .ok();
}
}
}
@@ -1047,6 +1048,7 @@ fn get_or_npm_install_builtin_agent(
package_name.clone(),
))
.await?
+ .to_string()
.into()
};
@@ -1093,7 +1095,7 @@ async fn download_latest_version(
dir: PathBuf,
node_runtime: NodeRuntime,
package_name: SharedString,
-) -> Result<String> {
+) -> Result<Version> {
log::debug!("downloading latest version of {package_name}");
let tmp_dir = tempfile::tempdir_in(&dir)?;
@@ -1109,7 +1111,7 @@ async fn download_latest_version(
fs.rename(
&tmp_dir.keep(),
- &dir.join(&version),
+ &dir.join(version.to_string()),
RenameOptions {
ignore_if_exists: true,
overwrite: true,
@@ -3118,10 +3118,11 @@ async fn get_or_install_companion(node: NodeRuntime, cx: &mut AsyncApp) -> Resul
.await
.context("getting installed companion version")?
.context("companion was not installed")?;
- smol::fs::rename(temp_dir.path(), dir.join(&version))
+ let version_folder = dir.join(version.to_string());
+ smol::fs::rename(temp_dir.path(), &version_folder)
.await
.context("moving companion package into place")?;
- Ok(dir.join(version))
+ Ok(version_folder)
}
let dir = paths::debug_adapters_dir().join("js-debug-companion");
@@ -3134,19 +3135,23 @@ async fn get_or_install_companion(node: NodeRuntime, cx: &mut AsyncApp) -> Resul
.await
.context("creating companion installation directory")?;
- let mut children = smol::fs::read_dir(&dir)
+ let children = smol::fs::read_dir(&dir)
.await
.context("reading companion installation directory")?
.try_collect::<Vec<_>>()
.await
.context("reading companion installation directory entries")?;
- children
- .sort_by_key(|child| semver::Version::parse(child.file_name().to_str()?).ok());
- let latest_installed_version = children.last().and_then(|child| {
- let version = child.file_name().into_string().ok()?;
- Some((child.path(), version))
- });
+ let latest_installed_version = children
+ .iter()
+ .filter_map(|child| {
+ Some((
+ child.path(),
+ semver::Version::parse(child.file_name().to_str()?).ok()?,
+ ))
+ })
+ .max_by_key(|(_, version)| version.clone());
+
let latest_version = node
.npm_package_latest_version(PACKAGE_NAME)
.await
@@ -93,6 +93,7 @@ use rpc::{
AnyProtoClient, ErrorCode, ErrorExt as _,
proto::{LspRequestId, LspRequestMessage as _},
};
+use semver::Version;
use serde::Serialize;
use serde_json::Value;
use settings::{Settings, SettingsLocation, SettingsStore};
@@ -13981,7 +13982,7 @@ impl LspAdapterDelegate for LocalLspAdapterDelegate {
async fn npm_package_installed_version(
&self,
package_name: &str,
- ) -> Result<Option<(PathBuf, String)>> {
+ ) -> Result<Option<(PathBuf, Version)>> {
let local_package_directory = self.worktree_root_path();
let node_modules_directory = local_package_directory.join("node_modules");
@@ -905,7 +905,7 @@ async fn install_prettier_packages(
.with_context(|| {
format!("fetching latest npm version for package {returned_package_name}")
})?;
- anyhow::Ok((returned_package_name, latest_version))
+ anyhow::Ok((returned_package_name, latest_version.to_string()))
}),
)
.await