html: Bump to 0.1.1 (#12093)

Piotr Osiewicz created

Moves to using the npm package as installation method.

Release Notes:

- N/A

Change summary

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(-)

Detailed changes

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)",
 ]

extensions/html/Cargo.toml 🔗

@@ -1,6 +1,6 @@
 [package]
 name = "zed_html"
-version = "0.1.0"
+version = "0.1.1"
 edition = "2021"
 publish = false
 license = "Apache-2.0"

extensions/html/extension.toml 🔗

@@ -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"

extensions/html/src/html.rs 🔗

@@ -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)