Skip to content

Commit 1dc01bb

Browse files
authored
feat(cli): sort global package list output (#1748)
The current `vp list -g` output depends on filesystem directory iteration order, so global packages can be printed in a random order. This PR sorts global package metadata by package identity before returning it from `PackageMetadata::list_all()`. That makes global pm commands like `vp list -g` follow `npm list -g`'s alphabetical package tree ordering for both human-readable and JSON output. 🤖 Generated with Codex
1 parent 5c2382f commit 1dc01bb

1 file changed

Lines changed: 38 additions & 0 deletions

File tree

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ impl PackageMetadata {
119119

120120
let mut packages = Vec::new();
121121
list_packages_recursive(&packages_dir, &mut packages).await?;
122+
packages.sort_by(|a, b| a.name.cmp(&b.name).then_with(|| a.version.cmp(&b.version)));
122123
Ok(packages)
123124
}
124125

@@ -268,6 +269,43 @@ mod tests {
268269
assert!(names.contains(&"@types/node"), "Missing @types/node package");
269270
}
270271

272+
#[tokio::test]
273+
async fn test_list_all_sorts_packages_by_name() {
274+
use tempfile::TempDir;
275+
276+
let temp_dir = TempDir::new().unwrap();
277+
let temp_path = temp_dir.path().to_path_buf();
278+
let _guard = vite_shared::EnvConfig::test_guard(
279+
vite_shared::EnvConfig::for_test_with_home(&temp_path),
280+
);
281+
282+
let zed = PackageMetadata::new(
283+
"zed".to_string(),
284+
"1.0.0".to_string(),
285+
"20.18.0".to_string(),
286+
None,
287+
vec![],
288+
HashSet::new(),
289+
"npm".to_string(),
290+
);
291+
zed.save().await.unwrap();
292+
293+
let alpha = PackageMetadata::new(
294+
"alpha".to_string(),
295+
"1.0.0".to_string(),
296+
"20.18.0".to_string(),
297+
None,
298+
vec![],
299+
HashSet::new(),
300+
"npm".to_string(),
301+
);
302+
alpha.save().await.unwrap();
303+
304+
let all = PackageMetadata::list_all().await.unwrap();
305+
let names: Vec<_> = all.iter().map(|p| p.name.as_str()).collect();
306+
assert_eq!(names, vec!["alpha", "zed"]);
307+
}
308+
271309
#[tokio::test]
272310
async fn test_find_by_binary() {
273311
use tempfile::TempDir;

0 commit comments

Comments
 (0)