Cargo.lock 🔗
@@ -13208,7 +13208,7 @@ dependencies = [
[[package]]
name = "zed_html"
-version = "0.1.0"
+version = "0.1.1"
dependencies = [
"zed_extension_api 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
]
Piotr Osiewicz created
Moves to using the npm package as installation method.
Release Notes:
- N/A
Cargo.lock | 2
extensions/html/Cargo.toml | 2
extensions/html/extension.toml | 2
extensions/html/src/html.rs | 99 +++++++++++++++--------------------
4 files changed, 46 insertions(+), 59 deletions(-)
@@ -13208,7 +13208,7 @@ dependencies = [
[[package]]
name = "zed_html"
-version = "0.1.0"
+version = "0.1.1"
dependencies = [
"zed_extension_api 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -1,6 +1,6 @@
[package]
name = "zed_html"
-version = "0.1.0"
+version = "0.1.1"
edition = "2021"
publish = false
license = "Apache-2.0"
@@ -1,7 +1,7 @@
id = "html"
name = "HTML"
description = "HTML support."
-version = "0.1.0"
+version = "0.1.1"
schema_version = 1
authors = ["Isaac Clayton <slightknack@gmail.com>"]
repository = "https://github.com/zed-industries/zed"
@@ -1,94 +1,80 @@
-use crate::zed::settings::LspSettings;
-use std::{env, fs, path::PathBuf};
-use zed_extension_api::{self as zed, Result};
+use std::{env, fs};
+use zed::settings::LspSettings;
+use zed_extension_api::{self as zed, LanguageServerId, Result};
-const PACKAGE_NAME: &str = "vscode-language-server";
+const SERVER_PATH: &str =
+ "node_modules/@zed-industries/vscode-langservers-extracted/bin/vscode-html-language-server";
+const PACKAGE_NAME: &str = "@zed-industries/vscode-langservers-extracted";
struct HtmlExtension {
- path: Option<PathBuf>,
+ did_find_server: bool,
}
impl HtmlExtension {
- fn server_script_path(&self, language_server_id: &zed::LanguageServerId) -> Result<PathBuf> {
- if let Some(path) = self.path.as_ref() {
- if fs::metadata(path).map_or(false, |stat| stat.is_dir()) {
- return Ok(path.clone());
- }
+ fn server_exists(&self) -> bool {
+ fs::metadata(SERVER_PATH).map_or(false, |stat| stat.is_file())
+ }
+
+ fn server_script_path(&mut self, language_server_id: &LanguageServerId) -> Result<String> {
+ let server_exists = self.server_exists();
+ if self.did_find_server && server_exists {
+ return Ok(SERVER_PATH.to_string());
}
zed::set_language_server_installation_status(
language_server_id,
&zed::LanguageServerInstallationStatus::CheckingForUpdate,
);
- let release = zed::latest_github_release(
- "zed-industries/vscode-langservers-extracted",
- zed::GithubReleaseOptions {
- require_assets: true,
- pre_release: false,
- },
- )?;
+ let version = zed::npm_package_latest_version(PACKAGE_NAME)?;
- let asset_name = "vscode-language-server.tar.gz";
-
- let asset = release
- .assets
- .iter()
- .find(|asset| asset.name == asset_name)
- .ok_or_else(|| format!("no asset found matching {:?}", asset_name))?;
- let version_dir = format!("{}-{}", PACKAGE_NAME, release.version);
- if !fs::metadata(&version_dir).map_or(false, |stat| stat.is_dir()) {
+ if !server_exists
+ || zed::npm_package_installed_version(PACKAGE_NAME)?.as_ref() != Some(&version)
+ {
zed::set_language_server_installation_status(
&language_server_id,
&zed::LanguageServerInstallationStatus::Downloading,
);
-
- zed::download_file(
- &asset.download_url,
- &version_dir,
- zed::DownloadedFileType::GzipTar,
- )
- .map_err(|e| format!("failed to download file: {e}"))?;
-
- let entries =
- fs::read_dir(".").map_err(|e| format!("failed to list working directory {e}"))?;
- for entry in entries {
- let entry = entry.map_err(|e| format!("failed to load directory entry {e}"))?;
- if entry.file_name().to_str() != Some(&version_dir) {
- fs::remove_dir_all(&entry.path()).ok();
+ let result = zed::npm_install_package(PACKAGE_NAME, &version);
+ match result {
+ Ok(()) => {
+ if !self.server_exists() {
+ Err(format!(
+ "installed package '{PACKAGE_NAME}' did not contain expected path '{SERVER_PATH}'",
+ ))?;
+ }
+ }
+ Err(error) => {
+ if !self.server_exists() {
+ Err(error)?;
+ }
}
}
}
- Ok(PathBuf::from(version_dir)
- .join("bin")
- .join("vscode-html-language-server"))
+
+ self.did_find_server = true;
+ Ok(SERVER_PATH.to_string())
}
}
impl zed::Extension for HtmlExtension {
fn new() -> Self {
- Self { path: None }
+ Self {
+ did_find_server: false,
+ }
}
fn language_server_command(
&mut self,
- language_server_id: &zed::LanguageServerId,
+ language_server_id: &LanguageServerId,
_worktree: &zed::Worktree,
) -> Result<zed::Command> {
- let path = match &self.path {
- Some(path) => path,
- None => {
- let path = self.server_script_path(language_server_id)?;
- self.path = Some(path);
- self.path.as_ref().unwrap()
- }
- };
-
+ let server_path = self.server_script_path(language_server_id)?;
Ok(zed::Command {
command: zed::node_binary_path()?,
args: vec![
env::current_dir()
.unwrap()
- .join(path)
+ .join(&server_path)
.to_string_lossy()
.to_string(),
"--stdio".to_string(),
@@ -96,9 +82,10 @@ impl zed::Extension for HtmlExtension {
env: Default::default(),
})
}
+
fn language_server_workspace_configuration(
&mut self,
- server_id: &zed::LanguageServerId,
+ server_id: &LanguageServerId,
worktree: &zed::Worktree,
) -> Result<Option<zed::serde_json::Value>> {
let settings = LspSettings::for_worktree(server_id.as_ref(), worktree)