@@ -15,17 +15,18 @@ use crate::parser::{
1515/// pnpm list JSON output structure
1616#[ derive( Debug , Deserialize ) ]
1717struct PnpmListOutput {
18+ name : String ,
1819 #[ serde( flatten) ]
19- packages : HashMap < String , PnpmPackage > ,
20+ package : PackageJsonListItem ,
2021}
2122
2223#[ derive( Debug , Deserialize ) ]
23- struct PnpmPackage {
24+ struct PackageJsonListItem {
2425 version : Option < String > ,
2526 #[ serde( rename = "dependencies" , default ) ]
26- dependencies : HashMap < String , PnpmPackage > ,
27+ dependencies : HashMap < String , PackageJsonListItem > ,
2728 #[ serde( rename = "devDependencies" , default ) ]
28- dev_dependencies : HashMap < String , PnpmPackage > ,
29+ dev_dependencies : HashMap < String , PackageJsonListItem > ,
2930}
3031
3132/// pnpm outdated JSON output structure
@@ -52,13 +53,19 @@ impl OutputParser for PnpmListParser {
5253
5354 fn parse ( input : & str ) -> ParseResult < DependencyState > {
5455 // Tier 1: Try JSON parsing
55- match serde_json:: from_str :: < PnpmListOutput > ( input) {
56+ match serde_json:: from_str :: < Vec < PnpmListOutput > > ( input) {
5657 Ok ( json) => {
5758 let mut dependencies = Vec :: new ( ) ;
5859 let mut total_count = 0 ;
5960
60- for ( name, pkg) in & json. packages {
61- collect_dependencies ( name, pkg, false , & mut dependencies, & mut total_count) ;
61+ for pkg in & json {
62+ collect_dependencies (
63+ pkg. name . as_str ( ) ,
64+ & pkg. package ,
65+ false ,
66+ & mut dependencies,
67+ & mut total_count,
68+ ) ;
6269 }
6370
6471 let result = DependencyState {
@@ -88,7 +95,7 @@ impl OutputParser for PnpmListParser {
8895/// Recursively collect dependencies from pnpm package tree
8996fn collect_dependencies (
9097 name : & str ,
91- pkg : & PnpmPackage ,
98+ pkg : & PackageJsonListItem ,
9299 is_dev : bool ,
93100 deps : & mut Vec < Dependency > ,
94101 count : & mut usize ,
@@ -502,16 +509,17 @@ mod tests {
502509
503510 #[ test]
504511 fn test_pnpm_list_parser_json ( ) {
505- let json = r#"{
506- "my-project": {
512+ let json = r#"[
513+ {
514+ "name": "my-project",
507515 "version": "1.0.0",
508516 "dependencies": {
509517 "express": {
510518 "version": "4.18.2"
511519 }
512520 }
513521 }
514- } "# ;
522+ ] "# ;
515523
516524 let result = PnpmListParser :: parse ( json) ;
517525 assert_eq ! ( result. tier( ) , 1 ) ;
0 commit comments