deno: Extract to zed-extensions/deno repository (#26129)

Marshall Bowers created

This PR extracts the Deno extension to the
[zed-extensions/deno](https://github.com/zed-extensions/deno)
repository.

Release Notes:

- N/A

Change summary

Cargo.lock                     |   7 -
Cargo.toml                     |   1 
docs/src/languages/deno.md     |   2 
extensions/deno/Cargo.toml     |  16 ---
extensions/deno/LICENSE-APACHE |   1 
extensions/deno/extension.toml |  13 --
extensions/deno/src/deno.rs    | 169 ------------------------------------
7 files changed, 1 insertion(+), 208 deletions(-)

Detailed changes

Cargo.lock 🔗

@@ -17001,13 +17001,6 @@ dependencies = [
  "zed_extension_api 0.1.0",
 ]
 
-[[package]]
-name = "zed_deno"
-version = "0.1.0"
-dependencies = [
- "zed_extension_api 0.1.0",
-]
-
 [[package]]
 name = "zed_elixir"
 version = "0.1.4"

Cargo.toml 🔗

@@ -169,7 +169,6 @@ members = [
     #
 
     "extensions/csharp",
-    "extensions/deno",
     "extensions/elixir",
     "extensions/emmet",
     "extensions/erlang",

docs/src/languages/deno.md 🔗

@@ -1,6 +1,6 @@
 # Deno
 
-Deno support is available through the [Deno extension](https://github.com/zed-industries/zed/tree/main/extensions/deno).
+Deno support is available through the [Deno extension](https://github.com/zed-extensions/deno).
 
 - Language server: [Deno Language Server](https://docs.deno.com/runtime/manual/advanced/language_server/overview/)
 

extensions/deno/Cargo.toml 🔗

@@ -1,16 +0,0 @@
-[package]
-name = "zed_deno"
-version = "0.1.0"
-edition.workspace = true
-publish.workspace = true
-license = "Apache-2.0"
-
-[lints]
-workspace = true
-
-[lib]
-path = "src/deno.rs"
-crate-type = ["cdylib"]
-
-[dependencies]
-zed_extension_api = "0.1.0"

extensions/deno/extension.toml 🔗

@@ -1,13 +0,0 @@
-id = "deno"
-name = "Deno"
-description = "Deno support."
-version = "0.1.0"
-schema_version = 1
-authors = ["Lino Le Van <11367844+lino-levan@users.noreply.github.com>"]
-repository = "https://github.com/zed-industries/zed"
-
-[language_servers.deno]
-name = "Deno Language Server"
-languages = ["TypeScript", "TSX", "JavaScript", "JSDoc"]
-language_ids = { "TypeScript" = "typescript", "TSX" = "typescriptreact", "JavaScript" = "javascript" }
-code_action_kinds = ["quickfix", "refactor", "refactor.extract", "source"]

extensions/deno/src/deno.rs 🔗

@@ -1,169 +0,0 @@
-use std::fs;
-use zed::lsp::CompletionKind;
-use zed::{serde_json, CodeLabel, CodeLabelSpan, LanguageServerId};
-use zed_extension_api::settings::LspSettings;
-use zed_extension_api::{self as zed, Result};
-
-struct DenoExtension {
-    cached_binary_path: Option<String>,
-}
-
-impl DenoExtension {
-    fn language_server_binary_path(
-        &mut self,
-        language_server_id: &LanguageServerId,
-        worktree: &zed::Worktree,
-    ) -> Result<String> {
-        if let Some(path) = worktree.which("deno") {
-            return Ok(path);
-        }
-
-        if let Some(path) = &self.cached_binary_path {
-            if fs::metadata(path).map_or(false, |stat| stat.is_file()) {
-                return Ok(path.clone());
-            }
-        }
-
-        zed::set_language_server_installation_status(
-            language_server_id,
-            &zed::LanguageServerInstallationStatus::CheckingForUpdate,
-        );
-        let release = zed::latest_github_release(
-            "denoland/deno",
-            zed::GithubReleaseOptions {
-                require_assets: true,
-                pre_release: false,
-            },
-        )?;
-
-        let (platform, arch) = zed::current_platform();
-        let asset_name = format!(
-            "deno-{arch}-{os}.zip",
-            arch = match arch {
-                zed::Architecture::Aarch64 => "aarch64",
-                zed::Architecture::X8664 => "x86_64",
-                zed::Architecture::X86 =>
-                    return Err(format!("unsupported architecture: {arch:?}")),
-            },
-            os = match platform {
-                zed::Os::Mac => "apple-darwin",
-                zed::Os::Linux => "unknown-linux-gnu",
-                zed::Os::Windows => "pc-windows-msvc",
-            },
-        );
-
-        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!("deno-{}", release.version);
-        let binary_path = format!("{version_dir}/deno");
-
-        if !fs::metadata(&binary_path).map_or(false, |stat| stat.is_file()) {
-            zed::set_language_server_installation_status(
-                language_server_id,
-                &zed::LanguageServerInstallationStatus::Downloading,
-            );
-
-            zed::download_file(
-                &asset.download_url,
-                &version_dir,
-                zed::DownloadedFileType::Zip,
-            )
-            .map_err(|e| format!("failed to download file: {e}"))?;
-
-            zed::make_file_executable(&binary_path)?;
-
-            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();
-                }
-            }
-        }
-
-        self.cached_binary_path = Some(binary_path.clone());
-        Ok(binary_path)
-    }
-}
-
-impl zed::Extension for DenoExtension {
-    fn new() -> Self {
-        Self {
-            cached_binary_path: None,
-        }
-    }
-
-    fn language_server_command(
-        &mut self,
-        language_server_id: &LanguageServerId,
-        worktree: &zed::Worktree,
-    ) -> Result<zed::Command> {
-        Ok(zed::Command {
-            command: self.language_server_binary_path(language_server_id, worktree)?,
-            args: vec!["lsp".to_string()],
-            env: Default::default(),
-        })
-    }
-
-    fn language_server_initialization_options(
-        &mut self,
-        _language_server_id: &zed::LanguageServerId,
-        _worktree: &zed::Worktree,
-    ) -> Result<Option<serde_json::Value>> {
-        Ok(Some(serde_json::json!({
-            "provideFormatter": true,
-        })))
-    }
-
-    fn language_server_workspace_configuration(
-        &mut self,
-        _language_server_id: &zed::LanguageServerId,
-        worktree: &zed::Worktree,
-    ) -> Result<Option<serde_json::Value>> {
-        let settings = LspSettings::for_worktree("deno", worktree)
-            .ok()
-            .and_then(|lsp_settings| lsp_settings.settings.clone())
-            .unwrap_or_default();
-        Ok(Some(settings))
-    }
-
-    fn label_for_completion(
-        &self,
-        _language_server_id: &LanguageServerId,
-        completion: zed::lsp::Completion,
-    ) -> Option<CodeLabel> {
-        let highlight_name = match completion.kind? {
-            CompletionKind::Class | CompletionKind::Interface | CompletionKind::Constructor => {
-                "type"
-            }
-            CompletionKind::Constant => "constant",
-            CompletionKind::Function | CompletionKind::Method => "function",
-            CompletionKind::Property | CompletionKind::Field => "property",
-            _ => return None,
-        };
-
-        let len = completion.label.len();
-        let name_span = CodeLabelSpan::literal(completion.label, Some(highlight_name.to_string()));
-
-        Some(zed::CodeLabel {
-            code: Default::default(),
-            spans: if let Some(detail) = completion.detail {
-                vec![
-                    name_span,
-                    CodeLabelSpan::literal(" ", None),
-                    CodeLabelSpan::literal(detail, None),
-                ]
-            } else {
-                vec![name_span]
-            },
-            filter_range: (0..len).into(),
-        })
-    }
-}
-
-zed::register_extension!(DenoExtension);