@@ -63,7 +63,7 @@ func (resolver *NpmResolver) CanResolve(file string) bool {
6363}
6464
6565// Resolve resolves licenses of all dependencies declared in the package.json file.
66- func (resolver * NpmResolver ) Resolve (pkgFile string , report * Report ) error {
66+ func (resolver * NpmResolver ) Resolve (pkgFile string , licenses [] * ConfigDepLicense , report * Report ) error {
6767 workDir := filepath .Dir (pkgFile )
6868 if err := os .Chdir (workDir ); err != nil {
6969 return err
@@ -85,7 +85,7 @@ func (resolver *NpmResolver) Resolve(pkgFile string, report *Report) error {
8585 // Walk through each package's root directory to resolve licenses
8686 // Resolve from a package's package.json file or its license file
8787 for _ , pkg := range pkgs {
88- if result := resolver .ResolvePackageLicense (pkg .Name , pkg .Path ); result .LicenseSpdxID != "" {
88+ if result := resolver .ResolvePackageLicense (pkg .Name , pkg .Path , licenses ); result .LicenseSpdxID != "" {
8989 report .Resolve (result )
9090 } else {
9191 result .LicenseSpdxID = Unknown
@@ -185,32 +185,39 @@ func (resolver *NpmResolver) GetInstalledPkgs(pkgDir string) []*Package {
185185// First, try to find and parse the package's package.json file to check the license file
186186// If the previous step fails, then try to identify the package's LICENSE file
187187// It's a necessary procedure to check the LICENSE file, because the resolver needs to record the license content
188- func (resolver * NpmResolver ) ResolvePackageLicense (pkgName , pkgPath string ) * Result {
188+ func (resolver * NpmResolver ) ResolvePackageLicense (pkgName , pkgPath string , licenses [] * ConfigDepLicense ) * Result {
189189 result := & Result {
190190 Dependency : pkgName ,
191191 }
192192 // resolve from the package.json file
193- if err := resolver .ResolvePkgFile (result , pkgPath ); err != nil {
193+ if err := resolver .ResolvePkgFile (result , pkgPath , licenses ); err != nil {
194194 result .ResolveErrors = append (result .ResolveErrors , err )
195195 }
196196
197197 // resolve from the LICENSE file
198- if err := resolver .ResolveLcsFile (result , pkgPath ); err != nil {
198+ if err := resolver .ResolveLcsFile (result , pkgPath , licenses ); err != nil {
199199 result .ResolveErrors = append (result .ResolveErrors , err )
200200 }
201201
202202 return result
203203}
204204
205205// ResolvePkgFile tries to find and parse the package.json file to capture the license field
206- func (resolver * NpmResolver ) ResolvePkgFile (result * Result , pkgPath string ) error {
206+ func (resolver * NpmResolver ) ResolvePkgFile (result * Result , pkgPath string , licenses [] * ConfigDepLicense ) error {
207207 expectedPkgFile := filepath .Join (pkgPath , PkgFileName )
208208 packageInfo , err := resolver .ParsePkgFile (expectedPkgFile )
209209 if err != nil {
210210 return err
211211 }
212212
213213 result .Version = packageInfo .Version
214+ for _ , l := range licenses {
215+ if l .Name == packageInfo .Name && l .Version == packageInfo .Version {
216+ result .LicenseSpdxID = l .License
217+ return nil
218+ }
219+ }
220+
214221 if lcs , ok := resolver .ResolveLicenseField (packageInfo .License ); ok {
215222 result .LicenseSpdxID = lcs
216223 return nil
@@ -259,7 +266,7 @@ func (resolver *NpmResolver) ResolveLicensesField(licenses []Lcs) (string, bool)
259266}
260267
261268// ResolveLcsFile tries to find the license file to identify the license
262- func (resolver * NpmResolver ) ResolveLcsFile (result * Result , pkgPath string ) error {
269+ func (resolver * NpmResolver ) ResolveLcsFile (result * Result , pkgPath string , licenses [] * ConfigDepLicense ) error {
263270 depFiles , err := os .ReadDir (pkgPath )
264271 if err != nil {
265272 return err
@@ -278,6 +285,12 @@ func (resolver *NpmResolver) ResolveLcsFile(result *Result, pkgPath string) erro
278285 if result .LicenseSpdxID != "" {
279286 return nil
280287 }
288+ for _ , l := range licenses {
289+ if l .Name == info .Name () && l .Version == result .Version {
290+ result .LicenseSpdxID = l .License
291+ return nil
292+ }
293+ }
281294 identifier , err := license .Identify (result .Dependency , string (content ))
282295 if err != nil {
283296 return err
0 commit comments