@@ -64,6 +64,8 @@ pub struct ExtensionManifest {
#[serde(default)]
pub authors: Vec<String>,
#[serde(default)]
+ pub capabilities: Vec<ExtensionCapability>,
+ #[serde(default)]
pub lib: LibManifestEntry,
#[serde(default)]
@@ -82,6 +84,28 @@ pub struct ExtensionManifest {
pub snippets: Option<PathBuf>,
}
+/// A capability for an extension.
+#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
+#[serde(tag = "kind")]
+pub enum ExtensionCapability {
+ /// The capability to download a file from a server.
+ #[serde(rename = "download-file")]
+ DownloadFile {
+ /// The host name of the server from which the file will be downloaded (e.g., `github.com`).
+ host: String,
+ /// The path prefix to the file that will be downloaded.
+ ///
+ /// Any path that starts with this prefix will be allowed.
+ path_prefix: String,
+ },
+ /// The capability to install a package from npm.
+ #[serde(rename = "npm:install")]
+ NpmInstall {
+ /// The name of the package.
+ package: String,
+ },
+}
+
#[derive(Clone, Default, PartialEq, Eq, Debug, Deserialize, Serialize)]
pub struct LibManifestEntry {
pub kind: Option<ExtensionLibraryKind>,
@@ -186,6 +210,7 @@ fn manifest_from_old_manifest(
repository: manifest_json.repository,
authors: manifest_json.authors,
schema_version: SchemaVersion::ZERO,
+ capabilities: Vec::new(),
lib: Default::default(),
themes: {
let mut themes = manifest_json.themes.into_values().collect::<Vec<_>>();
@@ -150,6 +150,7 @@ async fn test_extension_store(cx: &mut TestAppContext) {
authors: Vec::new(),
repository: None,
themes: Default::default(),
+ capabilities: Vec::new(),
lib: Default::default(),
languages: vec!["languages/erb".into(), "languages/ruby".into()],
grammars: [
@@ -181,6 +182,7 @@ async fn test_extension_store(cx: &mut TestAppContext) {
"themes/monokai-pro.json".into(),
"themes/monokai.json".into(),
],
+ capabilities: Vec::new(),
lib: Default::default(),
languages: Default::default(),
grammars: BTreeMap::default(),
@@ -344,6 +346,7 @@ async fn test_extension_store(cx: &mut TestAppContext) {
authors: vec![],
repository: None,
themes: vec!["themes/gruvbox.json".into()],
+ capabilities: Vec::new(),
lib: Default::default(),
languages: Default::default(),
grammars: BTreeMap::default(),
@@ -6,6 +6,10 @@ schema_version = 1
authors = ["Marshall Bowers <elliott.codes@gmail.com>"]
repository = "https://github.com/zed-industries/zed"
+capabilities = [
+ { kind = "download-file", host = "github.com", path_prefix = "gleam-lang/gleam" },
+]
+
[language_servers.gleam]
name = "Gleam LSP"
language = "Gleam"