@@ -654,21 +654,21 @@ impl PnpmLockfile {
654654 ) -> Result < ( Packages , Option < Snapshots > ) , crate :: Error > {
655655 let mut pruned_packages = BTreeMap :: new ( ) ;
656656 if let Some ( snapshots) = self . snapshots . as_ref ( ) {
657- let mut pruned_snapshots = BTreeMap :: new ( ) ;
657+ let mut pruned_snapshots = Some ( BTreeMap :: new ( ) ) ;
658658 for package in packages {
659- let entry = snapshots
660- . get ( package. as_str ( ) )
661- . ok_or_else ( || crate :: Error :: MissingPackage ( package. clone ( ) ) ) ?;
662- pruned_snapshots. insert ( package. clone ( ) , entry. clone ( ) ) ;
659+ if !snapshots. contains_key ( package. as_str ( ) ) {
660+ return Err ( crate :: Error :: MissingPackage ( package. clone ( ) ) ) ;
661+ }
663662
664663 let package_key = self . package_key_for_snapshot ( package. as_str ( ) ) ?;
665- let entry = self
666- . get_packages ( & package_key)
667- . ok_or_else ( || crate :: Error :: MissingPackage ( package_key. clone ( ) ) ) ?;
668- pruned_packages. insert ( package_key, entry. clone ( ) ) ;
664+ if self . get_packages ( & package_key) . is_none ( ) {
665+ return Err ( crate :: Error :: MissingPackage ( package_key) ) ;
666+ }
667+
668+ self . retain_package ( package, & mut pruned_packages, & mut pruned_snapshots) ?;
669669 }
670670
671- return Ok ( ( pruned_packages, Some ( pruned_snapshots) ) ) ;
671+ return Ok ( ( pruned_packages, pruned_snapshots) ) ;
672672 }
673673
674674 for package in packages {
@@ -707,7 +707,11 @@ impl PnpmLockfile {
707707 }
708708
709709 for ( dep_name, dep_version) in snapshot. dependencies ( ) {
710- let dep_key = self . format_key ( & dep_name, & dep_version) ;
710+ let dep_key = if self . has_package ( & dep_version) {
711+ dep_version
712+ } else {
713+ self . format_key ( & dep_name, & dep_version)
714+ } ;
711715 self . retain_package ( & dep_key, pruned_packages, pruned_snapshots) ?;
712716 }
713717
@@ -1400,6 +1404,59 @@ importers:
14001404 ) ;
14011405 }
14021406
1407+ #[ test]
1408+ fn test_subgraph_preserves_aliased_dependency_targets ( ) {
1409+ let yaml = r#"lockfileVersion: '9.0'
1410+
1411+ importers:
1412+
1413+ .: {}
1414+
1415+ apps/web:
1416+ dependencies:
1417+ pretty-format:
1418+ specifier: 30.2.0
1419+ version: 30.2.0
1420+
1421+ packages:
1422+
1423+ pretty-format@30.2.0:
1424+ resolution: {integrity: sha512-abc}
1425+
1426+ react-is@19.2.8:
1427+ resolution: {integrity: sha512-def}
1428+
1429+ snapshots:
1430+
1431+ pretty-format@30.2.0:
1432+ dependencies:
1433+ react-is-19: react-is@19.2.8
1434+
1435+ react-is@19.2.8: {}
1436+ "# ;
1437+ let lockfile = PnpmLockfile :: from_bytes ( yaml. as_bytes ( ) ) . unwrap ( ) ;
1438+ let pruned = lockfile
1439+ . subgraph (
1440+ & [ "apps/web" . to_string ( ) ] ,
1441+ & [ "pretty-format@30.2.0" . to_string ( ) ] ,
1442+ )
1443+ . unwrap ( ) ;
1444+
1445+ let pruned_bytes = pruned. encode ( ) . unwrap ( ) ;
1446+ let pruned_lockfile = PnpmLockfile :: from_bytes ( & pruned_bytes) . unwrap ( ) ;
1447+ let packages = pruned_lockfile
1448+ . packages
1449+ . as_ref ( )
1450+ . expect ( "should have packages" ) ;
1451+ let snapshots = pruned_lockfile
1452+ . snapshots
1453+ . as_ref ( )
1454+ . expect ( "should have snapshots" ) ;
1455+
1456+ assert ! ( packages. contains_key( "react-is@19.2.8" ) ) ;
1457+ assert ! ( snapshots. contains_key( "react-is@19.2.8" ) ) ;
1458+ }
1459+
14031460 #[ test]
14041461 fn test_subgraph_preserves_leading_pnpm_v11_documents ( ) {
14051462 let yaml = pnpm_v11_lockfile ( "11.0.0-rc.0" ) ;
0 commit comments