github.com/anchore/syft@v1.38.2/syft/pkg/cataloger/dart/package.go (about)

     1  package dart
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/anchore/packageurl-go"
     7  	"github.com/anchore/syft/syft/file"
     8  	"github.com/anchore/syft/syft/pkg"
     9  	"github.com/anchore/syft/syft/pkg/cataloger/internal/licenses"
    10  )
    11  
    12  func newPubspecLockPackage(name string, raw pubspecLockPackage, locations ...file.Location) pkg.Package {
    13  	metadata := pkg.DartPubspecLockEntry{
    14  		Name:      name,
    15  		Version:   raw.Version,
    16  		HostedURL: raw.getHostedURL(),
    17  		VcsURL:    raw.getVcsURL(),
    18  	}
    19  
    20  	p := pkg.Package{
    21  		Name:      name,
    22  		Version:   raw.Version,
    23  		Locations: file.NewLocationSet(locations...),
    24  		PURL:      packageURLFromPubspecLock(metadata),
    25  		Language:  pkg.Dart,
    26  		Type:      pkg.DartPubPkg,
    27  		Metadata:  metadata,
    28  	}
    29  
    30  	p.SetID()
    31  
    32  	return p
    33  }
    34  
    35  func newPubspecPackage(ctx context.Context, resolver file.Resolver, raw pubspecPackage, locations ...file.Location) pkg.Package {
    36  	var env *pkg.DartPubspecEnvironment
    37  	if raw.Environment.SDK != "" || raw.Environment.Flutter != "" {
    38  		// this is required only after pubspec v2, but might have been optional before this
    39  		env = &pkg.DartPubspecEnvironment{
    40  			SDK:     raw.Environment.SDK,
    41  			Flutter: raw.Environment.Flutter,
    42  		}
    43  	}
    44  	p := pkg.Package{
    45  		Name:      raw.Name,
    46  		Version:   raw.Version,
    47  		Locations: file.NewLocationSet(locations...),
    48  		PURL:      packageURLFromPubspec(raw.Name, raw.Version),
    49  		Language:  pkg.Dart,
    50  		Type:      pkg.DartPubPkg,
    51  		Metadata: pkg.DartPubspec{
    52  			Homepage:          raw.Homepage,
    53  			Repository:        raw.Repository,
    54  			Documentation:     raw.Documentation,
    55  			PublishTo:         raw.PublishTo,
    56  			Environment:       env,
    57  			Platforms:         raw.Platforms,
    58  			IgnoredAdvisories: raw.IgnoredAdvisories,
    59  		},
    60  	}
    61  
    62  	p.SetID()
    63  
    64  	p = licenses.RelativeToPackage(ctx, resolver, p)
    65  
    66  	return p
    67  }
    68  
    69  func packageURLFromPubspecLock(m pkg.DartPubspecLockEntry) string {
    70  	var qualifiers packageurl.Qualifiers
    71  
    72  	if m.HostedURL != "" {
    73  		qualifiers = append(qualifiers, packageurl.Qualifier{
    74  			Key:   "hosted_url",
    75  			Value: m.HostedURL,
    76  		})
    77  	} else if m.VcsURL != "" { // Default to using Hosted if somehow both are provided
    78  		qualifiers = append(qualifiers, packageurl.Qualifier{
    79  			Key:   "vcs_url",
    80  			Value: m.VcsURL,
    81  		})
    82  	}
    83  
    84  	return packageurl.NewPackageURL(
    85  		packageurl.TypePub,
    86  		"",
    87  		m.Name,
    88  		m.Version,
    89  		qualifiers,
    90  		"",
    91  	).ToString()
    92  }
    93  
    94  func packageURLFromPubspec(name, version string) string {
    95  	var qualifiers packageurl.Qualifiers
    96  
    97  	return packageurl.NewPackageURL(
    98  		packageurl.TypePub,
    99  		"",
   100  		name,
   101  		version,
   102  		qualifiers,
   103  		"",
   104  	).ToString()
   105  }