private static Uri? GetPackageUrl(NpmPackage package) { string? url = package.Repository?.Url; if (url == null) { return null; } else if (url == NpmPackage.UnknownUrl) { return null; } if (!url.Contains("+")) { // // git://github.com/zertosh/loose-envify.git // https://github.com/then/promise.git return new Uri(url); } else { // Example: // git+https://github.com/facebook/fbjs.git return new Uri(url.Substring(url.IndexOf("+") + 1)); } }
private (string?, Uri?) GetLicense(NpmPackage package) { if (package.Licenses?.Count > 0) { foreach (var l in package.Licenses.Skip(1)) { Log.Warning($"Found multiple licenses for {package.Id} {package.Version}. Will NOT include {l.Type}"); } if (package.Licenses[0].Url == null) { return (package.Licenses[0].Type, null); } else { return (package.Licenses[0].Type, new Uri(package.Licenses[0].Url)); } } if (package.License != null) { return (package.License, null); } return (null, null); }
internal async Task <DependencyChain <AnalyzedPackage> > FindPackageDependencies(Package package, HashSet <string> upstreamDependencies) { string resolvedDependenciesPath = string.Format(this.resolvedPathFormatStr, package.Id, package.Version); if (DiskCache.TryGetValue(resolvedDependenciesPath, this.config.ResolvedDependencies, out DependencyChain <AnalyzedPackage>?cached)) { return(cached); } string path = string.Format(this.detailsPathFormatStr, package.Id, package.Version); NpmPackage?npmPackage; if (!DiskCache.TryGetValue(path, this.config.PackageDetails, out npmPackage)) { npmPackage = await this.npm.GetPackage(package).ContinueWith(CachePackage); } if (npmPackage == null) { Log.Warning($"Could not find information about {package.Id} {package.Version} from npm"); return(new InvalidDependencyChain(package, "Could not find information from npm")); } var analyzedPackage = new AnalyzedPackage(package); var packageDependencies = npmPackage.Dependencies ?? new Dictionary <string, string>(); var ds = packageDependencies.Select(x => new PackageRange(x.Key, x.Value, package.OriginProject)); var dependencies = await FindPackageDependencies(ds, upstreamDependencies); var result = new DependencyChain <AnalyzedPackage>(analyzedPackage, dependencies); CacheDependencies(package, result); return(result); NpmPackage?CachePackage(Task <(PackageDetailsResultEnum, NpmPackage?)> package) { if (!this.config.PackageDetails.DoCache) { return(package.Result.Item2); } if (package.Result.Item1 != PackageDetailsResultEnum.Success) { return(null); } NpmPackage p = package.Result.Item2 !; string cachePath = string.Format(this.detailsPathFormatStr, p.Id, p.Version); DiskCache.Cache(cachePath, p); return(p); } }
public NpmPackageDetails(NpmPackage package) { this.package = package; PackageUrl = GetPackageUrl(package); (License, LicenseUrl) = GetLicense(package); }