@@ -966,6 +966,15 @@ pub fn snapshot_from_lockfile(
966966 let mut root_packages = HashMap :: < PackageReq , NpmPackageId > :: with_capacity (
967967 lockfile. content . packages . specifiers . len ( ) ,
968968 ) ;
969+ let link_package_ids = params
970+ . link_packages
971+ . iter ( )
972+ . flat_map ( |( name, info_vec) | {
973+ info_vec. iter ( ) . map ( move |info| {
974+ StackString :: from_string ( format ! ( "{}@{}" , name, info. version) )
975+ } )
976+ } )
977+ . collect :: < HashSet < _ > > ( ) ;
969978 // collect the specifiers to version mappings
970979 for ( key, value) in & lockfile. content . packages . specifiers {
971980 match key. kind {
@@ -1000,12 +1009,16 @@ pub fn snapshot_from_lockfile(
10001009 }
10011010
10021011 packages. push ( SerializedNpmResolutionSnapshotPackage {
1003- dist : Some ( dist_from_incomplete_package_info (
1004- & id. nv ,
1005- package. integrity . as_deref ( ) ,
1006- package. tarball . as_deref ( ) ,
1007- default_tarball_url,
1008- ) ) ,
1012+ dist : if !link_package_ids. contains ( key) {
1013+ Some ( dist_from_incomplete_package_info (
1014+ & id. nv ,
1015+ package. integrity . as_deref ( ) ,
1016+ package. tarball . as_deref ( ) ,
1017+ default_tarball_url,
1018+ ) )
1019+ } else {
1020+ None
1021+ } ,
10091022 id,
10101023 dependencies : dependencies
10111024 . into_iter ( )
@@ -1552,4 +1565,66 @@ mod tests {
15521565 . is_err( )
15531566 ) ;
15541567 }
1568+
1569+ #[ tokio:: test]
1570+ async fn test_snapshot_from_lockfile_v5_with_linked_package ( ) {
1571+ let api = TestNpmRegistryApi :: default ( ) ;
1572+ let lockfile = Lockfile :: new (
1573+ NewLockfileOptions {
1574+ file_path : PathBuf :: from ( "/deno.lock" ) ,
1575+ content : r#"{
1576+ "version": "5",
1577+ "specifiers": {
1578+ "npm:cowsay@^1.6.0": "1.6.0"
1579+ },
1580+ "npm": {
1581+ 1582+ },
1583+ "workspace": {
1584+ "packageJson": {
1585+ "dependencies": [
1586+ "npm:cowsay@^1.6.0"
1587+ ]
1588+ },
1589+ "links": {
1590+ 1591+ }
1592+ }
1593+ }"# ,
1594+ overwrite : false ,
1595+ } ,
1596+ & api,
1597+ )
1598+ . await
1599+ . unwrap ( ) ;
1600+ let link_packages = & HashMap :: from ( [ (
1601+ PackageName :: from_static ( "cowsay" ) ,
1602+ vec ! [ NpmPackageVersionInfo {
1603+ version: Version :: parse_standard( "1.6.0" ) . unwrap( ) ,
1604+ ..Default :: default ( )
1605+ } ] ,
1606+ ) ] ) ;
1607+ let snapshot = snapshot_from_lockfile ( SnapshotFromLockfileParams {
1608+ lockfile : & lockfile,
1609+ link_packages,
1610+ default_tarball_url : & TestDefaultTarballUrlProvider ,
1611+ } )
1612+ . unwrap ( ) ;
1613+
1614+ assert_eq ! (
1615+ snapshot. as_serialized( ) . packages,
1616+ vec![ SerializedNpmResolutionSnapshotPackage {
1617+ id
: NpmPackageId :: from_serialized
( "[email protected] " ) . unwrap
( ) , 1618+ system: Default :: default ( ) ,
1619+ dist: None , // should be None
1620+ dependencies: Default :: default ( ) ,
1621+ optional_dependencies: Default :: default ( ) ,
1622+ optional_peer_dependencies: Default :: default ( ) ,
1623+ extra: None ,
1624+ is_deprecated: false ,
1625+ has_bin: false ,
1626+ has_scripts: false ,
1627+ } ]
1628+ ) ;
1629+ }
15551630}
0 commit comments