github.com/anchore/syft@v1.38.2/syft/pkg/cataloger/javascript/dependency.go (about)

     1  package javascript
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"github.com/anchore/packageurl-go"
     8  	"github.com/anchore/syft/internal/log"
     9  	"github.com/anchore/syft/syft/pkg"
    10  	"github.com/anchore/syft/syft/pkg/cataloger/internal/dependency"
    11  )
    12  
    13  func packageLockDependencySpecifier(p pkg.Package) dependency.Specification {
    14  	meta, ok := p.Metadata.(pkg.NpmPackageLockEntry)
    15  	if !ok {
    16  		log.Tracef("cataloger failed to extract package lock metadata for package %+v", p.Name)
    17  		return dependency.Specification{}
    18  	}
    19  
    20  	provides := []string{p.Name}
    21  
    22  	var requires []string
    23  
    24  	for name, dependencySpecifier := range meta.Dependencies {
    25  		purl, err := packageurl.FromString(strings.ReplaceAll(dependencySpecifier, "npm:", "pkg:npm/"))
    26  		if err == nil {
    27  			// if the package url is valid, include the name from the package url since this is likely an alias
    28  			var fullName = fmt.Sprintf("%s/%s", purl.Namespace, purl.Name)
    29  			requires = append(requires, fullName)
    30  		} else {
    31  			fmt.Println("error", err)
    32  		}
    33  
    34  		requires = append(requires, name)
    35  	}
    36  
    37  	return dependency.Specification{
    38  		ProvidesRequires: dependency.ProvidesRequires{
    39  			Provides: provides,
    40  			Requires: requires,
    41  		},
    42  	}
    43  }
    44  
    45  func pnpmLockDependencySpecifier(p pkg.Package) dependency.Specification {
    46  	meta, ok := p.Metadata.(pkg.PnpmLockEntry)
    47  	if !ok {
    48  		log.Tracef("cataloger failed to extract pnpm lock metadata for package %+v", p.Name)
    49  		return dependency.Specification{}
    50  	}
    51  
    52  	provides := []string{p.Name}
    53  
    54  	var requires []string
    55  
    56  	for name := range meta.Dependencies {
    57  		requires = append(requires, name)
    58  	}
    59  	return dependency.Specification{
    60  		ProvidesRequires: dependency.ProvidesRequires{
    61  			Provides: provides,
    62  			Requires: requires,
    63  		},
    64  	}
    65  }
    66  
    67  func yarnLockDependencySpecifier(p pkg.Package) dependency.Specification {
    68  	meta, ok := p.Metadata.(pkg.YarnLockEntry)
    69  	if !ok {
    70  		log.Tracef("cataloger failed to extract yarn lock metadata for package %+v", p.Name)
    71  		return dependency.Specification{}
    72  	}
    73  
    74  	provides := []string{p.Name}
    75  
    76  	var requires []string
    77  
    78  	for name := range meta.Dependencies {
    79  		requires = append(requires, name)
    80  	}
    81  	return dependency.Specification{
    82  		ProvidesRequires: dependency.ProvidesRequires{
    83  			Provides: provides,
    84  			Requires: requires,
    85  		},
    86  	}
    87  }