Skip to content

Commit 71ebf6a

Browse files
committed
feat: respect packageManager in pm shims
1 parent d5e8e61 commit 71ebf6a

20 files changed

Lines changed: 552 additions & 50 deletions

File tree

crates/vite_global_cli/src/commands/env/current.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ use std::process::ExitStatus;
66

77
use owo_colors::OwoColorize;
88
use serde::Serialize;
9+
use vite_install::package_manager::{
10+
package_manager_bin_path, package_manager_install_dir,
11+
resolve_package_manager_from_package_json,
12+
};
913
use vite_path::AbsolutePathBuf;
1014

1115
use super::config::resolve_version;
@@ -20,6 +24,8 @@ struct CurrentEnvInfo {
2024
project_root: Option<String>,
2125
node_path: String,
2226
tool_paths: ToolPaths,
27+
#[serde(skip_serializing_if = "Option::is_none")]
28+
package_manager: Option<PackageManagerInfo>,
2329
}
2430

2531
#[derive(Serialize)]
@@ -29,6 +35,16 @@ struct ToolPaths {
2935
npx: String,
3036
}
3137

38+
#[derive(Clone, Serialize)]
39+
struct PackageManagerInfo {
40+
name: String,
41+
version: String,
42+
source: String,
43+
source_path: String,
44+
project_root: String,
45+
bin_path: String,
46+
}
47+
3248
fn accent(text: &str) -> String {
3349
if help::should_style_help() { text.bright_blue().to_string() } else { text.to_string() }
3450
}
@@ -45,6 +61,7 @@ fn print_rows(title: &str, rows: &[(&str, String)]) {
4561
/// Execute the current command.
4662
pub async fn execute(cwd: AbsolutePathBuf, json: bool) -> Result<ExitStatus, Error> {
4763
let resolution = resolve_version(&cwd).await?;
64+
let package_manager = resolve_package_manager_info(&cwd);
4865

4966
// Get the home directory for this version
5067
let home_dir =
@@ -77,6 +94,7 @@ pub async fn execute(cwd: AbsolutePathBuf, json: bool) -> Result<ExitStatus, Err
7794
npm: npm_path.as_path().display().to_string(),
7895
npx: npx_path.as_path().display().to_string(),
7996
},
97+
package_manager: package_manager.clone(),
8098
};
8199

82100
let json_str = serde_json::to_string_pretty(&info)?;
@@ -101,7 +119,37 @@ pub async fn execute(cwd: AbsolutePathBuf, json: bool) -> Result<ExitStatus, Err
101119
("npx", npx_path.as_path().display().to_string()),
102120
],
103121
);
122+
if let Some(package_manager) = package_manager {
123+
println!();
124+
print_rows(
125+
"Package Manager",
126+
&[
127+
("Name", package_manager.name),
128+
("Version", package_manager.version),
129+
("Source", package_manager.source),
130+
("Source Path", package_manager.source_path),
131+
("Project Root", package_manager.project_root),
132+
("Bin Path", package_manager.bin_path),
133+
],
134+
);
135+
}
104136
}
105137

106138
Ok(ExitStatus::default())
107139
}
140+
141+
fn resolve_package_manager_info(cwd: &AbsolutePathBuf) -> Option<PackageManagerInfo> {
142+
let resolution = resolve_package_manager_from_package_json(cwd).ok()??;
143+
let install_dir =
144+
package_manager_install_dir(resolution.package_manager_type, &resolution.version)?;
145+
let name = resolution.package_manager_type.to_string();
146+
let bin_path = package_manager_bin_path(&install_dir, &name);
147+
Some(PackageManagerInfo {
148+
name,
149+
version: resolution.version.to_string(),
150+
source: resolution.source.to_string(),
151+
source_path: resolution.source_path.as_path().display().to_string(),
152+
project_root: resolution.project_root.as_path().display().to_string(),
153+
bin_path: bin_path.as_path().display().to_string(),
154+
})
155+
}

crates/vite_global_cli/src/commands/env/which.rs

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ use std::process::ExitStatus;
1010

1111
use chrono::Local;
1212
use owo_colors::OwoColorize;
13+
use vite_install::package_manager::{
14+
PackageManagerType, package_manager_bin_path, package_manager_install_dir,
15+
resolve_package_manager_from_package_json,
16+
};
1317
use vite_path::{AbsolutePath, AbsolutePathBuf};
1418
use vite_shared::output;
1519

@@ -27,6 +31,10 @@ const LABEL_WIDTH: usize = 10;
2731

2832
/// Execute the which command.
2933
pub async fn execute(cwd: AbsolutePathBuf, tool: &str) -> Result<ExitStatus, Error> {
34+
if let Some(status) = execute_package_manager_tool(&cwd, tool)? {
35+
return Ok(status);
36+
}
37+
3038
// Check if this is a core tool
3139
if CORE_TOOLS.contains(&tool) {
3240
return execute_core_tool(cwd, tool).await;
@@ -44,6 +52,67 @@ pub async fn execute(cwd: AbsolutePathBuf, tool: &str) -> Result<ExitStatus, Err
4452
Ok(exit_status(1))
4553
}
4654

55+
fn execute_package_manager_tool(
56+
cwd: &AbsolutePath,
57+
tool: &str,
58+
) -> Result<Option<ExitStatus>, Error> {
59+
let Some(expected_type) = package_manager_type_for_tool(tool) else {
60+
return Ok(None);
61+
};
62+
let Some(resolution) = resolve_package_manager_from_package_json(cwd)? else {
63+
return Ok(None);
64+
};
65+
if resolution.package_manager_type != expected_type {
66+
return Ok(None);
67+
}
68+
69+
let Some(install_dir) =
70+
package_manager_install_dir(resolution.package_manager_type, &resolution.version)
71+
else {
72+
return Ok(None);
73+
};
74+
let name = resolution.package_manager_type.to_string();
75+
let bin_name = package_manager_bin_name(tool, resolution.package_manager_type);
76+
let tool_path = package_manager_bin_path(&install_dir, bin_name);
77+
78+
println!("{}", tool_path.as_path().display());
79+
println!(
80+
" {:<LABEL_WIDTH$} {}",
81+
"Package:".dimmed(),
82+
format!("{}@{}", name, resolution.version).bright_blue()
83+
);
84+
println!(
85+
" {:<LABEL_WIDTH$} {}",
86+
"Source:".dimmed(),
87+
resolution.source_path.as_path().display().to_string().dimmed()
88+
);
89+
90+
Ok(Some(ExitStatus::default()))
91+
}
92+
93+
fn package_manager_type_for_tool(tool: &str) -> Option<PackageManagerType> {
94+
match tool {
95+
"npm" | "npx" => Some(PackageManagerType::Npm),
96+
"pnpm" | "pnpx" => Some(PackageManagerType::Pnpm),
97+
"yarn" | "yarnpkg" => Some(PackageManagerType::Yarn),
98+
"bun" | "bunx" => Some(PackageManagerType::Bun),
99+
_ => None,
100+
}
101+
}
102+
103+
fn package_manager_bin_name(tool: &str, package_manager_type: PackageManagerType) -> &str {
104+
match (tool, package_manager_type) {
105+
("npx", PackageManagerType::Npm) => "npx",
106+
("pnpx", PackageManagerType::Pnpm) => "pnpx",
107+
("yarnpkg", PackageManagerType::Yarn) => "yarnpkg",
108+
("bunx", PackageManagerType::Bun) => "bunx",
109+
(_, PackageManagerType::Npm) => "npm",
110+
(_, PackageManagerType::Pnpm) => "pnpm",
111+
(_, PackageManagerType::Yarn) => "yarn",
112+
(_, PackageManagerType::Bun) => "bun",
113+
}
114+
}
115+
47116
/// Execute which for a core tool (node, npm, npx).
48117
async fn execute_core_tool(cwd: AbsolutePathBuf, tool: &str) -> Result<ExitStatus, Error> {
49118
// Resolve version for current directory

0 commit comments

Comments
 (0)