1+ import minimatch from 'minimatch' ;
2+ import * as semver from 'semver' ;
3+
14import { ILambdaResponse } from './merge-dependency' ;
25import { downloadDependency } from '../eval/npm/fetch-npm-module' ;
6+ import { IParsedResolution } from './resolutions' ;
37
48function getPackageJSON ( dep : string , version : string ) {
59 return downloadDependency ( dep , version , '/package.json' ) . then ( m => m . code ) ;
@@ -18,9 +22,39 @@ interface IPeerDependencyResult {
1822 } ;
1923}
2024
25+ function getAbsoluteVersion (
26+ originalDep : string ,
27+ depName : string ,
28+ depVersion : string ,
29+ parsedResolutions : { [ name : string ] : IParsedResolution [ ] }
30+ ) {
31+ // Try getting it from the resolutions field first, if that doesn't work
32+ // we try to get the latest version from the semver.
33+ const applicableResolutions = parsedResolutions [ depName ] ;
34+ if ( applicableResolutions ) {
35+ const modulePath = [ originalDep , depName ] . join ( '/' ) ;
36+
37+ const { range } =
38+ applicableResolutions . find ( ( { globPattern } ) =>
39+ minimatch ( modulePath , globPattern )
40+ ) || { } ;
41+
42+ if ( range ) {
43+ if ( semver . valid ( range ) ) {
44+ return getLatestVersionForSemver ( depName , range ) ;
45+ }
46+
47+ return range ;
48+ }
49+ }
50+
51+ return getLatestVersionForSemver ( depName , depVersion ) ;
52+ }
53+
2154async function getDependencyDependencies (
2255 dep : string ,
2356 version : string ,
57+ parsedResolutions : { [ name : string ] : IParsedResolution [ ] } ,
2458 peerDependencyResult : IPeerDependencyResult = { }
2559) : Promise < IPeerDependencyResult > {
2660 const packageJSONCode = await getPackageJSON ( dep , version ) ;
@@ -35,9 +69,11 @@ async function getDependencyDependencies(
3569 return ;
3670 }
3771
38- const absoluteVersion = await getLatestVersionForSemver (
72+ const absoluteVersion = await getAbsoluteVersion (
73+ dep ,
3974 depName ,
40- depVersion
75+ depVersion ,
76+ parsedResolutions
4177 ) ;
4278
4379 // eslint-disable-next-line
@@ -51,6 +87,7 @@ async function getDependencyDependencies(
5187 await getDependencyDependencies (
5288 depName ,
5389 depVersion ,
90+ parsedResolutions ,
5491 peerDependencyResult
5592 ) ;
5693 } )
@@ -59,7 +96,11 @@ async function getDependencyDependencies(
5996 return peerDependencyResult ;
6097}
6198
62- export async function resolveDependencyInfo ( dep : string , version : string ) {
99+ export async function resolveDependencyInfo (
100+ dep : string ,
101+ version : string ,
102+ parsedResolutions : IParsedResolution [ ]
103+ ) {
63104 const packageJSONCode = await getPackageJSON ( dep , version ) ;
64105 const packageJSON = JSON . parse ( packageJSONCode ) ;
65106 const response : ILambdaResponse = {
@@ -73,10 +114,17 @@ export async function resolveDependencyInfo(dep: string, version: string) {
73114 dependencyAliases : { } ,
74115 } ;
75116
117+ const resolutionsByPackage = { } ;
118+ parsedResolutions . forEach ( res => {
119+ resolutionsByPackage [ res . name ] = resolutionsByPackage [ res . name ] || [ ] ;
120+ resolutionsByPackage [ res . name ] . push ( res ) ;
121+ } ) ;
122+
76123 response . peerDependencies = packageJSON . peerDependencies || { } ;
77124 response . dependencyDependencies = await getDependencyDependencies (
78125 dep ,
79- version
126+ version ,
127+ resolutionsByPackage
80128 ) ;
81129
82130 response . contents = {
0 commit comments