From 78d41a22029e709af3e841a1fffe6572722a01a2 Mon Sep 17 00:00:00 2001 From: JongKyung Lee <118944686+jong-kyung@users.noreply.github.com> Date: Tue, 19 May 2026 09:09:53 +0900 Subject: [PATCH] Revert "feat(cli): support yarn plugin commands via vp pm plugin (#1540)" This reverts commit adbacfb39619b6fd659ac4d967e99cb6e47fb271. --- crates/vite_install/src/commands/mod.rs | 1 - crates/vite_install/src/commands/plugin.rs | 276 ------------------ crates/vite_pm_cli/src/cli.rs | 63 ---- crates/vite_pm_cli/src/handlers.rs | 31 +- .../cli-helper-message/snap.txt | 1 - .../command-plugin-pnpm10/package.json | 5 - .../command-plugin-pnpm10/snap.txt | 2 - .../command-plugin-pnpm10/steps.json | 5 - .../command-plugin-yarn1/package.json | 5 - .../command-plugin-yarn1/snap.txt | 2 - .../command-plugin-yarn1/steps.json | 5 - .../command-plugin-yarn4/package.json | 5 - .../command-plugin-yarn4/snap.txt | 18 -- .../command-plugin-yarn4/steps.json | 6 - 14 files changed, 1 insertion(+), 424 deletions(-) delete mode 100644 crates/vite_install/src/commands/plugin.rs delete mode 100644 packages/cli/snap-tests-global/command-plugin-pnpm10/package.json delete mode 100644 packages/cli/snap-tests-global/command-plugin-pnpm10/snap.txt delete mode 100644 packages/cli/snap-tests-global/command-plugin-pnpm10/steps.json delete mode 100644 packages/cli/snap-tests-global/command-plugin-yarn1/package.json delete mode 100644 packages/cli/snap-tests-global/command-plugin-yarn1/snap.txt delete mode 100644 packages/cli/snap-tests-global/command-plugin-yarn1/steps.json delete mode 100644 packages/cli/snap-tests-global/command-plugin-yarn4/package.json delete mode 100644 packages/cli/snap-tests-global/command-plugin-yarn4/snap.txt delete mode 100644 packages/cli/snap-tests-global/command-plugin-yarn4/steps.json diff --git a/crates/vite_install/src/commands/mod.rs b/crates/vite_install/src/commands/mod.rs index c03e5d2442..948880f6cb 100644 --- a/crates/vite_install/src/commands/mod.rs +++ b/crates/vite_install/src/commands/mod.rs @@ -16,7 +16,6 @@ pub mod outdated; pub mod owner; pub mod pack; pub mod ping; -pub mod plugin; pub mod prune; pub mod publish; pub mod rebuild; diff --git a/crates/vite_install/src/commands/plugin.rs b/crates/vite_install/src/commands/plugin.rs deleted file mode 100644 index 1e4ae8dcd7..0000000000 --- a/crates/vite_install/src/commands/plugin.rs +++ /dev/null @@ -1,276 +0,0 @@ -use std::{collections::HashMap, process::ExitStatus}; - -use vite_command::run_command; -use vite_error::Error; -use vite_path::AbsolutePath; -use vite_shared::output; - -use crate::package_manager::{ - PackageManager, PackageManagerType, ResolveCommandResult, format_path_env, -}; - -#[derive(Debug)] -pub enum PluginSubcommand<'a> { - Import { - spec: &'a str, - }, - /// `name` is yarn's positional plugin identifier, not a repository URL. - /// Repository/branch/path go through `pass_through_args`. - ImportFromSources { - name: &'a str, - }, - List, - Runtime, - Remove { - name: &'a str, - }, - Check, -} - -#[derive(Debug)] -pub struct PluginCommandOptions<'a> { - pub subcommand: PluginSubcommand<'a>, - pub pass_through_args: Option<&'a [String]>, -} - -impl PackageManager { - /// Returns success (exit 0) on unsupported PMs (Yarn 1.x, npm, pnpm, bun). - #[must_use] - pub async fn run_plugin_command( - &self, - options: &PluginCommandOptions<'_>, - cwd: impl AsRef, - ) -> Result { - let Some(resolve_command) = self.resolve_plugin_command(options) else { - return Ok(ExitStatus::default()); - }; - run_command(&resolve_command.bin_path, &resolve_command.args, &resolve_command.envs, cwd) - .await - } - - /// Yarn 4 parses `import-from-sources` as four separate tokens - /// (`plugin import from sources`), so the resolver emits them split. - #[must_use] - pub fn resolve_plugin_command( - &self, - options: &PluginCommandOptions, - ) -> Option { - match self.client { - PackageManagerType::Yarn => { - if self.version.starts_with("1.") { - output::warn("yarn classic (1.x) does not support plugin commands"); - return None; - } - } - PackageManagerType::Npm | PackageManagerType::Pnpm | PackageManagerType::Bun => { - output::warn(&format!("{} does not support plugin commands", self.client)); - return None; - } - } - - let bin_name = "yarn".to_string(); - let envs = HashMap::from([("PATH".to_string(), format_path_env(self.get_bin_prefix()))]); - let mut args: Vec = vec!["plugin".into()]; - - match &options.subcommand { - PluginSubcommand::Import { spec } => { - args.push("import".into()); - args.push((*spec).to_string()); - } - PluginSubcommand::ImportFromSources { name } => { - args.push("import".into()); - args.push("from".into()); - args.push("sources".into()); - args.push((*name).to_string()); - } - PluginSubcommand::List => { - args.push("list".into()); - } - PluginSubcommand::Runtime => { - args.push("runtime".into()); - } - PluginSubcommand::Remove { name } => { - args.push("remove".into()); - args.push((*name).to_string()); - } - PluginSubcommand::Check => { - args.push("check".into()); - } - } - - if let Some(pass_through_args) = options.pass_through_args { - args.extend_from_slice(pass_through_args); - } - - Some(ResolveCommandResult { bin_path: bin_name, args, envs }) - } -} - -#[cfg(test)] -mod tests { - use tempfile::{TempDir, tempdir}; - use vite_path::AbsolutePathBuf; - use vite_str::Str; - - use super::*; - - fn create_temp_dir() -> TempDir { - tempdir().expect("Failed to create temp directory") - } - - fn create_mock_package_manager(pm_type: PackageManagerType, version: &str) -> PackageManager { - let temp_dir = create_temp_dir(); - let temp_dir_path = AbsolutePathBuf::new(temp_dir.path().to_path_buf()).unwrap(); - let install_dir = temp_dir_path.join("install"); - - PackageManager { - client: pm_type, - package_name: pm_type.to_string().into(), - version: Str::from(version), - hash: None, - bin_name: pm_type.to_string().into(), - workspace_root: temp_dir_path.clone(), - is_monorepo: false, - install_dir, - } - } - - fn opts<'a>( - sub: PluginSubcommand<'a>, - pass_through: Option<&'a [String]>, - ) -> PluginCommandOptions<'a> { - PluginCommandOptions { subcommand: sub, pass_through_args: pass_through } - } - - #[test] - fn yarn4_import() { - let pm = create_mock_package_manager(PackageManagerType::Yarn, "4.10.3"); - let result = pm - .resolve_plugin_command(&opts( - PluginSubcommand::Import { spec: "@yarnpkg/plugin-typescript" }, - None, - )) - .expect("expected resolved command"); - assert_eq!(result.bin_path, "yarn"); - assert_eq!(result.args, vec!["plugin", "import", "@yarnpkg/plugin-typescript"]); - } - - #[test] - fn yarn4_runtime() { - let pm = create_mock_package_manager(PackageManagerType::Yarn, "4.10.3"); - let result = pm - .resolve_plugin_command(&opts(PluginSubcommand::Runtime, None)) - .expect("expected resolved command"); - assert_eq!(result.bin_path, "yarn"); - assert_eq!(result.args, vec!["plugin", "runtime"]); - } - - #[test] - fn yarn4_list() { - let pm = create_mock_package_manager(PackageManagerType::Yarn, "4.10.3"); - let result = pm - .resolve_plugin_command(&opts(PluginSubcommand::List, None)) - .expect("expected resolved command"); - assert_eq!(result.bin_path, "yarn"); - assert_eq!(result.args, vec!["plugin", "list"]); - } - - #[test] - fn yarn4_remove() { - let pm = create_mock_package_manager(PackageManagerType::Yarn, "4.10.3"); - let result = pm - .resolve_plugin_command(&opts(PluginSubcommand::Remove { name: "typescript" }, None)) - .expect("expected resolved command"); - assert_eq!(result.bin_path, "yarn"); - assert_eq!(result.args, vec!["plugin", "remove", "typescript"]); - } - - #[test] - fn yarn4_import_from_sources() { - let pm = create_mock_package_manager(PackageManagerType::Yarn, "4.10.3"); - let result = pm - .resolve_plugin_command(&opts( - PluginSubcommand::ImportFromSources { name: "typescript" }, - None, - )) - .expect("expected resolved command"); - assert_eq!(result.bin_path, "yarn"); - assert_eq!(result.args, vec!["plugin", "import", "from", "sources", "typescript"]); - } - - #[test] - fn yarn4_check() { - let pm = create_mock_package_manager(PackageManagerType::Yarn, "4.10.3"); - let result = pm - .resolve_plugin_command(&opts(PluginSubcommand::Check, None)) - .expect("expected resolved command"); - assert_eq!(result.bin_path, "yarn"); - assert_eq!(result.args, vec!["plugin", "check"]); - } - - #[test] - fn yarn4_pass_through_args_appended() { - let pm = create_mock_package_manager(PackageManagerType::Yarn, "4.10.3"); - let pass_through = vec!["--json".to_string()]; - let result = pm - .resolve_plugin_command(&opts(PluginSubcommand::List, Some(&pass_through))) - .expect("expected resolved command"); - assert_eq!(result.args, vec!["plugin", "list", "--json"]); - } - - #[test] - fn yarn4_empty_pass_through_args_is_noop() { - let pm = create_mock_package_manager(PackageManagerType::Yarn, "4.10.3"); - let pass_through: Vec = vec![]; - let result = pm - .resolve_plugin_command(&opts(PluginSubcommand::Runtime, Some(&pass_through))) - .expect("expected resolved command"); - assert_eq!(result.args, vec!["plugin", "runtime"]); - } - - #[test] - fn yarn1_returns_none() { - let pm = create_mock_package_manager(PackageManagerType::Yarn, "1.22.22"); - let result = pm.resolve_plugin_command(&opts(PluginSubcommand::List, None)); - assert!(result.is_none()); - } - - #[test] - fn yarn_2_rc_treated_as_berry() { - let pm = create_mock_package_manager(PackageManagerType::Yarn, "2.0.0-rc.1"); - let result = pm - .resolve_plugin_command(&opts(PluginSubcommand::List, None)) - .expect("yarn 2.0.0-rc.1 should be treated as Yarn 2+"); - assert_eq!(result.args, vec!["plugin", "list"]); - } - - #[test] - fn yarn_berry_literal_treated_as_berry() { - let pm = create_mock_package_manager(PackageManagerType::Yarn, "berry"); - let result = pm - .resolve_plugin_command(&opts(PluginSubcommand::List, None)) - .expect("yarn 'berry' literal should be treated as Yarn 2+"); - assert_eq!(result.args, vec!["plugin", "list"]); - } - - #[test] - fn npm_returns_none() { - let pm = create_mock_package_manager(PackageManagerType::Npm, "11.0.0"); - let result = pm.resolve_plugin_command(&opts(PluginSubcommand::List, None)); - assert!(result.is_none()); - } - - #[test] - fn pnpm_returns_none() { - let pm = create_mock_package_manager(PackageManagerType::Pnpm, "10.0.0"); - let result = pm.resolve_plugin_command(&opts(PluginSubcommand::List, None)); - assert!(result.is_none()); - } - - #[test] - fn bun_returns_none() { - let pm = create_mock_package_manager(PackageManagerType::Bun, "1.2.0"); - let result = pm.resolve_plugin_command(&opts(PluginSubcommand::List, None)); - assert!(result.is_none()); - } -} diff --git a/crates/vite_pm_cli/src/cli.rs b/crates/vite_pm_cli/src/cli.rs index 80ee9a8402..75975de99d 100644 --- a/crates/vite_pm_cli/src/cli.rs +++ b/crates/vite_pm_cli/src/cli.rs @@ -889,10 +889,6 @@ pub enum PmCommands { #[arg(last = true, allow_hyphen_values = true)] pass_through_args: Option>, }, - - /// Manage Yarn plugins (Yarn 2+ only — other package managers will print a warning and exit successfully) - #[command(subcommand)] - Plugin(PluginCommands), } impl PmCommands { @@ -912,65 +908,6 @@ impl PmCommands { } } -/// Plugin subcommands (Yarn 2+ only). -#[derive(Subcommand, Debug, Clone)] -pub enum PluginCommands { - /// Import a plugin from a known source - Import { - /// Plugin name or URL to import - #[arg(required = true)] - spec: String, - - /// Additional arguments - #[arg(last = true, allow_hyphen_values = true)] - pass_through_args: Option>, - }, - - /// Build and import a plugin from sources - #[command(name = "import-from-sources")] - ImportFromSources { - /// Plugin name to compile (yarn's positional ``, not a repository URL) - #[arg(required = true)] - name: String, - - /// Additional arguments - #[arg(last = true, allow_hyphen_values = true)] - pass_through_args: Option>, - }, - - /// List plugins available on the registry - List { - /// Additional arguments - #[arg(last = true, allow_hyphen_values = true)] - pass_through_args: Option>, - }, - - /// List the currently installed plugins - Runtime { - /// Additional arguments - #[arg(last = true, allow_hyphen_values = true)] - pass_through_args: Option>, - }, - - /// Remove a plugin - Remove { - /// Plugin name to remove - #[arg(required = true)] - name: String, - - /// Additional arguments - #[arg(last = true, allow_hyphen_values = true)] - pass_through_args: Option>, - }, - - /// Find all third-party plugins that differ from their own spec - Check { - /// Additional arguments - #[arg(last = true, allow_hyphen_values = true)] - pass_through_args: Option>, - }, -} - /// Configuration subcommands. #[derive(Subcommand, Debug, Clone)] pub enum ConfigCommands { diff --git a/crates/vite_pm_cli/src/handlers.rs b/crates/vite_pm_cli/src/handlers.rs index 0108e6aa51..cd8c9b7e18 100644 --- a/crates/vite_pm_cli/src/handlers.rs +++ b/crates/vite_pm_cli/src/handlers.rs @@ -25,7 +25,6 @@ use vite_install::{ owner::OwnerSubcommand, pack::PackCommandOptions, ping::PingCommandOptions, - plugin::{PluginCommandOptions, PluginSubcommand}, prune::PruneCommandOptions, publish::PublishCommandOptions, rebuild::RebuildCommandOptions, @@ -42,9 +41,7 @@ use vite_install::{ use vite_path::AbsolutePath; use crate::{ - cli::{ - ConfigCommands, DistTagCommands, OwnerCommands, PluginCommands, PmCommands, TokenCommands, - }, + cli::{ConfigCommands, DistTagCommands, OwnerCommands, PmCommands, TokenCommands}, error::Error, helpers::{build_package_manager, build_package_manager_or_npm_default, ensure_package_json}, }; @@ -473,32 +470,6 @@ pub async fn run_pm_subcommand( }; Ok(pm.run_ping_command(&options, cwd).await?) } - - PmCommands::Plugin(plugin_command) => { - let (subcommand, pass_through_args) = match &plugin_command { - PluginCommands::Import { spec, pass_through_args } => { - (PluginSubcommand::Import { spec: spec.as_str() }, pass_through_args.as_deref()) - } - PluginCommands::ImportFromSources { name, pass_through_args } => ( - PluginSubcommand::ImportFromSources { name: name.as_str() }, - pass_through_args.as_deref(), - ), - PluginCommands::List { pass_through_args } => { - (PluginSubcommand::List, pass_through_args.as_deref()) - } - PluginCommands::Runtime { pass_through_args } => { - (PluginSubcommand::Runtime, pass_through_args.as_deref()) - } - PluginCommands::Remove { name, pass_through_args } => { - (PluginSubcommand::Remove { name: name.as_str() }, pass_through_args.as_deref()) - } - PluginCommands::Check { pass_through_args } => { - (PluginSubcommand::Check, pass_through_args.as_deref()) - } - }; - let options = PluginCommandOptions { subcommand, pass_through_args }; - Ok(pm.run_plugin_command(&options, cwd).await?) - } } } diff --git a/packages/cli/snap-tests-global/cli-helper-message/snap.txt b/packages/cli/snap-tests-global/cli-helper-message/snap.txt index a8ef8dd79e..08992b73cf 100644 --- a/packages/cli/snap-tests-global/cli-helper-message/snap.txt +++ b/packages/cli/snap-tests-global/cli-helper-message/snap.txt @@ -329,7 +329,6 @@ Commands: rebuild Rebuild native modules [aliases: rb] fund Show funding information for installed packages ping Ping the registry - plugin Manage Yarn plugins (Yarn 2+ only — other package managers will print a warning and exit successfully) Options: -h, --help Print help diff --git a/packages/cli/snap-tests-global/command-plugin-pnpm10/package.json b/packages/cli/snap-tests-global/command-plugin-pnpm10/package.json deleted file mode 100644 index 509eebfdd9..0000000000 --- a/packages/cli/snap-tests-global/command-plugin-pnpm10/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "command-plugin-pnpm10", - "version": "1.0.0", - "packageManager": "pnpm@10.20.0" -} diff --git a/packages/cli/snap-tests-global/command-plugin-pnpm10/snap.txt b/packages/cli/snap-tests-global/command-plugin-pnpm10/snap.txt deleted file mode 100644 index 6a3e0e1d03..0000000000 --- a/packages/cli/snap-tests-global/command-plugin-pnpm10/snap.txt +++ /dev/null @@ -1,2 +0,0 @@ -> vp pm plugin runtime # pnpm does not support plugin commands; should warn and exit 0 -warn: pnpm does not support plugin commands diff --git a/packages/cli/snap-tests-global/command-plugin-pnpm10/steps.json b/packages/cli/snap-tests-global/command-plugin-pnpm10/steps.json deleted file mode 100644 index 4f4b1f4a29..0000000000 --- a/packages/cli/snap-tests-global/command-plugin-pnpm10/steps.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "commands": [ - "vp pm plugin runtime # pnpm does not support plugin commands; should warn and exit 0" - ] -} diff --git a/packages/cli/snap-tests-global/command-plugin-yarn1/package.json b/packages/cli/snap-tests-global/command-plugin-yarn1/package.json deleted file mode 100644 index bddb75d798..0000000000 --- a/packages/cli/snap-tests-global/command-plugin-yarn1/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "command-plugin-yarn1", - "version": "1.0.0", - "packageManager": "yarn@1.22.22" -} diff --git a/packages/cli/snap-tests-global/command-plugin-yarn1/snap.txt b/packages/cli/snap-tests-global/command-plugin-yarn1/snap.txt deleted file mode 100644 index 25ce3bb38e..0000000000 --- a/packages/cli/snap-tests-global/command-plugin-yarn1/snap.txt +++ /dev/null @@ -1,2 +0,0 @@ -> vp pm plugin runtime # yarn classic does not support plugin commands; should warn and exit 0 -warn: yarn classic (1.x) does not support plugin commands diff --git a/packages/cli/snap-tests-global/command-plugin-yarn1/steps.json b/packages/cli/snap-tests-global/command-plugin-yarn1/steps.json deleted file mode 100644 index 4f5f3f6e7a..0000000000 --- a/packages/cli/snap-tests-global/command-plugin-yarn1/steps.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "commands": [ - "vp pm plugin runtime # yarn classic does not support plugin commands; should warn and exit 0" - ] -} diff --git a/packages/cli/snap-tests-global/command-plugin-yarn4/package.json b/packages/cli/snap-tests-global/command-plugin-yarn4/package.json deleted file mode 100644 index 79a4109b28..0000000000 --- a/packages/cli/snap-tests-global/command-plugin-yarn4/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "command-plugin-yarn4", - "version": "1.0.0", - "packageManager": "yarn@4.10.3" -} diff --git a/packages/cli/snap-tests-global/command-plugin-yarn4/snap.txt b/packages/cli/snap-tests-global/command-plugin-yarn4/snap.txt deleted file mode 100644 index 447457ec59..0000000000 --- a/packages/cli/snap-tests-global/command-plugin-yarn4/snap.txt +++ /dev/null @@ -1,18 +0,0 @@ -> vp pm plugin --help # should list 6 plugin subcommands; clap output is deterministic -Usage: vp pm plugin - -Manage Yarn plugins (Yarn 2+ only — other package managers will print a warning and exit successfully) - -Commands: - import Import a plugin from a known source - import-from-sources Build and import a plugin from sources - list List plugins available on the registry - runtime List the currently installed plugins - remove Remove a plugin - check Find all third-party plugins that differ from their own spec - -Options: - -h, --help Print help - -Documentation: https://viteplus.dev/guide/install - diff --git a/packages/cli/snap-tests-global/command-plugin-yarn4/steps.json b/packages/cli/snap-tests-global/command-plugin-yarn4/steps.json deleted file mode 100644 index 7bfe49900d..0000000000 --- a/packages/cli/snap-tests-global/command-plugin-yarn4/steps.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "ignoredPlatforms": ["win32", "darwin"], - "commands": [ - "vp pm plugin --help # should list 6 plugin subcommands; clap output is deterministic" - ] -}