From d954f784c06291e0f2c87d55ecbf601645de54bd Mon Sep 17 00:00:00 2001 From: Finn Evers Date: Wed, 25 Mar 2026 17:42:00 +0100 Subject: [PATCH] extension_cli: Ensure extension that provide themes do not provide further features (#52272) We generally enforce this policy already and also want this to be this way, so better to be error than sorry here. Release Notes: - N/A --- crates/extension_cli/src/main.rs | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/crates/extension_cli/src/main.rs b/crates/extension_cli/src/main.rs index d0a533bfeb331c196d802df9894e726201794ce7..4d290992f318dc8fec78dad0e40d347d4826ed65 100644 --- a/crates/extension_cli/src/main.rs +++ b/crates/extension_cli/src/main.rs @@ -1,3 +1,4 @@ +use std::collections::BTreeSet; use std::collections::HashMap; use std::env; use std::fs; @@ -7,6 +8,7 @@ use std::sync::Arc; use ::fs::{CopyOptions, Fs, RealFs, copy_recursive}; use anyhow::{Context as _, Result, anyhow, bail}; use clap::Parser; +use cloud_api_types::ExtensionProvides; use extension::extension_builder::{CompileExtensionOptions, ExtensionBuilder}; use extension::{ExtensionManifest, ExtensionSnippets}; use language::LanguageConfig; @@ -80,10 +82,7 @@ async fn main() -> Result<()> { .context("failed to compile extension")?; let extension_provides = manifest.provides(); - - if extension_provides.is_empty() { - bail!("extension does not provide any features"); - } + validate_extension_features(&extension_provides)?; let grammars = test_grammars(&manifest, &extension_path, &mut wasm_store)?; test_languages(&manifest, &extension_path, &grammars)?; @@ -203,7 +202,7 @@ async fn copy_extension_resources( }, ) .await - .with_context(|| "failed to copy icons")?; + .context("failed to copy icons")?; } for (_, agent_entry) in &manifest.agent_servers { @@ -297,6 +296,22 @@ async fn copy_extension_resources( Ok(()) } +fn validate_extension_features(provides: &BTreeSet) -> Result<()> { + if provides.is_empty() { + bail!("extension does not provide any features"); + } + + if provides.contains(&ExtensionProvides::Themes) && provides.len() != 1 { + bail!("extension must not provide other features along with themes"); + } + + if provides.contains(&ExtensionProvides::IconThemes) && provides.len() != 1 { + bail!("extension must not provide other features along with icon themes"); + } + + Ok(()) +} + fn test_grammars( manifest: &ExtensionManifest, extension_path: &Path,