@@ -12,6 +12,7 @@ import BlockingQueue from './util/blocking-queue.js';
1212import  Lockfile  from  './lockfile/wrapper.js' ; 
1313import  map  from  './util/map.js' ; 
1414import  WorkspaceLayout  from  './workspace-layout.js' ; 
15+ import  Resolutions  from  './resolutions' ; 
1516
1617const  invariant  =  require ( 'invariant' ) ; 
1718const  semver  =  require ( 'semver' ) ; 
@@ -23,11 +24,12 @@ export type ResolverOptions = {|
2324| } ; 
2425
2526export  default  class  PackageResolver  { 
26-   constructor ( config : Config ,  lockfile : Lockfile )  { 
27+   constructor ( config : Config ,  lockfile : Lockfile ,   resolutions : ? Resolutions )  { 
2728    this . patternsByPackage  =  map ( ) ; 
2829    this . fetchingPatterns  =  map ( ) ; 
2930    this . fetchingQueue  =  new  BlockingQueue ( 'resolver fetching' ) ; 
3031    this . patterns  =  map ( ) ; 
32+     this . resolutions  =  resolutions  ||  new  Resolutions ( config ) ; 
3133    this . usedRegistries  =  new  Set ( ) ; 
3234    this . flat  =  false ; 
3335
@@ -44,6 +46,8 @@ export default class PackageResolver {
4446
4547  workspaceLayout : ?WorkspaceLayout ; 
4648
49+   resolutions : Resolutions ; 
50+ 
4751  // list of registries that have been used in this resolution 
4852  usedRegistries : Set < RegistryNames > ; 
4953
@@ -401,6 +405,7 @@ export default class PackageResolver {
401405
402406  getHighestRangeVersionMatch ( name : string ,  range : string ,  manifest : ?Manifest ) : ?Manifest  { 
403407    const  patterns  =  this . patternsByPackage [ name ] ; 
408+ 
404409    if  ( ! patterns )  { 
405410      return  null ; 
406411    } 
@@ -446,12 +451,33 @@ export default class PackageResolver {
446451    return  matchedPkg ; 
447452  } 
448453
454+   /** 
455+    * Determine if LockfileEntry is incorrect, remove it from lockfile cache and consider the pattern as new 
456+    */ 
457+   isLockfileEntryOutdated ( version : string ,  range : string ,  hasVersion : boolean ) : boolean  { 
458+     return  ! ! ( 
459+       semver . validRange ( range )  && 
460+       semver . valid ( version )  && 
461+       ! getExoticResolver ( range )  && 
462+       hasVersion  && 
463+       ! semver . satisfies ( version ,  range ) 
464+     ) ; 
465+   } 
466+ 
449467  /** 
450468   * TODO description 
451469   */ 
452470
453-   async  find ( req : DependencyRequestPattern ) : Promise < void >  { 
471+   async  find ( initialReq : DependencyRequestPattern ) : Promise < void >  { 
472+     const req  =  this . resolveToResolution ( initialReq ) ; 
473+ 
474+     // we've already resolved it with a resolution 
475+     if  ( ! req )  { 
476+       return ; 
477+     } 
478+ 
454479    const  fetchKey  =  `${ req . registry } ${ req . pattern }  ; 
480+ 
455481    if  ( this . fetchingPatterns [ fetchKey ] )  { 
456482      return ; 
457483    }  else  { 
@@ -464,16 +490,11 @@ export default class PackageResolver {
464490
465491    const  lockfileEntry  =  this . lockfile . getLocked ( req . pattern ) ; 
466492    let  fresh  =  false ; 
493+ 
467494    if  ( lockfileEntry )  { 
468495      const  { range ,  hasVersion }  =  PackageRequest . normalizePattern ( req . pattern ) ; 
469-       // lockfileEntry is incorrect, remove it from lockfile cache and consider the pattern as new 
470-       if  ( 
471-         semver . validRange ( range )  && 
472-         semver . valid ( lockfileEntry . version )  && 
473-         ! semver . satisfies ( lockfileEntry . version ,  range )  && 
474-         ! getExoticResolver ( range )  && 
475-         hasVersion 
476-       )  { 
496+ 
497+       if  ( this . isLockfileEntryOutdated ( lockfileEntry . version ,  range ,  hasVersion ) )  { 
477498        this . reporter . warn ( this . reporter . lang ( 'incorrectLockfileEntry' ,  req . pattern ) ) ; 
478499        this . removePattern ( req . pattern ) ; 
479500        this . lockfile . removePattern ( req . pattern ) ; 
@@ -532,4 +553,26 @@ export default class PackageResolver {
532553      req . resolveToExistingVersion ( info ) ; 
533554    } 
534555  } 
556+ 
557+   resolveToResolution ( req : DependencyRequestPattern ) : ?DependencyRequestPattern  { 
558+     const  { parentNames ,  pattern }  =  req ; 
559+ 
560+     if  ( ! parentNames )  { 
561+       return  req ; 
562+     } 
563+ 
564+     const  resolution  =  this . resolutions . find ( pattern ,  parentNames ) ; 
565+ 
566+     if  ( resolution )  { 
567+       const  resolutionManifest  =  this . getStrictResolvedPattern ( resolution ) ; 
568+       invariant ( resolutionManifest . _reference ,  'resolutions  should  have  a  resolved  reference ') ; 
569+ 
570+       resolutionManifest . _reference . patterns . push ( pattern ) ; 
571+       this . lockfile . removePattern ( pattern ) ; 
572+ 
573+       return  null ; 
574+     } 
575+ 
576+     return  req ; 
577+   } 
535578} 
0 commit comments