@@ -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