Example #1
0
        public void StringLicense_CorrectResult()
        {
            const string expected   = "TestLicense";
            string       json       = $"{{ \"license\": \"{expected}\" }}";
            var          npmPackage = NpmPackage.Deserialize(json);

            Assert.Equal(expected, npmPackage.License);
        }
Example #2
0
        public void TypeLicense_InvalidRepositoryFormat_CorrectResult()
        {
            const string expected   = "TestLicense";
            const string json       = "{\"name\":\"pinkie\",\"version\":\"2.0.0\",\"description\":\"Itty\",\"license\":\"TestLicense\",\"repository\":\"x/y\",\"author\":{\"name\":\"My Name\",\"email\":\"[email protected]\",\"url\":\"github.com/xx\"},\"engines\":{\"node\":\">=0.10.0\"},\"scripts\":{\"test\":\"xo && nyc mocha\",\"coverage\":\"nyc report --reporter=text-lcov | coveralls\"},\"files\":[\"index.js\"],\"keywords\":[\"promise\",\"promises\",\"es2015\",\"es6\"],\"devDependencies\":{\"coveralls\":\"^2.11.4\",\"mocha\":\"*\",\"nyc\":\"^3.2.2\",\"promises-aplus-tests\":\"*\",\"xo\":\"^0.10.1\"},\"_id\":\"[email protected]\",\"_npmVersion\":\"0.0.0-fake\",\"_nodeVersion\":\"0.0.0-fake\",\"_shasum\":\"11737918d16ab5859a90a5a031b6f7e0d6f245cc\",\"_npmUser\":{\"name\":\"npm\",\"email\":\"[email protected]\"},\"_from\":\".\",\"dist\":{\"shasum\":\"11737918d16ab5859a90a5a031b6f7e0d6f245cc\",\"tarball\":\"https://registry.npmjs.org/xx\"},\"maintainers\":[{\"name\":\"bb\",\"email\":\"[email protected]\"}],\"directories\":{}}";;
            var          npmPackage = NpmPackage.Deserialize(json);

            Assert.Equal(expected, npmPackage.License);
        }
Example #3
0
        public void TypeLicense_CorrectResult()
        {
            const string expected   = "TestLicense";
            string       json       = $"{{ \"name\": \"test-name\", \"version\": \"1.0.0\", \"license\": {{ \"type\": \"{expected}\", \"url\": \"https://test\" }} }}";
            var          npmPackage = NpmPackage.Deserialize(json);

            Assert.Equal(expected, npmPackage.License);
        }
Example #4
0
        private void Versions_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ListView    versions = (ListView)sender;
            ListBoxItem item     = versions.SelectedItem as ListViewItem;

            if (item == null)
            {
                return;
            }

            SelectedPackage = (NpmPackage)item.Tag;
        }
Example #5
0
        /// <summary>
        /// For each package in our registry.json, query NuGet, extract package metadata, and convert them to unity packages.
        /// </summary>
        private async Task BuildInternal()
        {
            var packageMetadataResource = _sourceRepository.GetResource <PackageMetadataResource>();

            foreach (var packageDesc in _registry)
            {
                var packageName  = packageDesc.Key;
                var packageEntry = packageDesc.Value;
                // A package entry is ignored but allowed in the registry (case of Microsoft.CSharp)
                if (packageEntry.Ignored)
                {
                    continue;
                }

                var packageMetaIt = await packageMetadataResource.GetMetadataAsync(packageName, false, false, _sourceCacheContext, Logger, CancellationToken.None);

                var packageMetas = packageMetaIt.ToList();
                foreach (var packageMeta in packageMetas)
                {
                    var packageIdentity = packageMeta.Identity;
                    var packageId       = packageIdentity.Id.ToLowerInvariant();
                    var npmPackageId    = $"{UnityScope}.{packageId}";

                    if (!packageEntry.Version.Satisfies(packageMeta.Identity.Version))
                    {
                        continue;
                    }

                    PackageDependencyGroup netstd20Dependency = null;

                    foreach (var dependencySet in packageMeta.DependencySets)
                    {
                        if (dependencySet.TargetFramework == NuGetFrameworkNetStandard20)
                        {
                            netstd20Dependency = dependencySet;
                            break;
                        }
                    }

                    if (netstd20Dependency == null)
                    {
                        Logger.LogWarning($"The package `{packageIdentity}` doesn't support `netstandard2.0`");
                        continue;
                    }

                    if (!_npmPackageRegistry.Packages.TryGetValue(npmPackageId, out var npmPackage))
                    {
                        npmPackage = new NpmPackage();
                        _npmPackageRegistry.Packages.Add(npmPackageId, npmPackage);
                    }

                    // One NpmPackage (for package request)

                    var packageInfoList = packageEntry.Listed ? _npmPackageRegistry.ListedPackageInfos : _npmPackageRegistry.UnlistedPackageInfos;

                    if (!packageInfoList.Packages.TryGetValue(npmPackageId, out var npmPackageInfo))
                    {
                        npmPackageInfo = new NpmPackageInfo();
                        packageInfoList.Packages.Add(npmPackageId, npmPackageInfo);
                    }

                    // Update latest version
                    var currentVersion = packageIdentity.Version;

                    var update = !npmPackage.DistTags.TryGetValue("latest", out var latestVersion) ||
                                 (currentVersion > NuGetVersion.Parse(latestVersion));

                    string npmCurrentVersion = $"{currentVersion.Major}.{currentVersion.Minor}.{currentVersion.Patch}";

                    if (currentVersion.Revision != 0)
                    {
                        npmCurrentVersion += $"-{currentVersion.Revision}";
                    }

                    if (update)
                    {
                        npmPackage.DistTags["latest"] = npmCurrentVersion;

                        npmPackageInfo.Versions.Clear();
                        npmPackageInfo.Versions[npmCurrentVersion] = "latest";

                        npmPackage.Id      = npmPackageId;
                        npmPackage.License = packageMeta.LicenseMetadata?.License ?? packageMeta.LicenseUrl?.ToString();

                        npmPackage.Name     = npmPackageId;
                        npmPackageInfo.Name = npmPackageId;

                        npmPackage.Description     = packageMeta.Description;
                        npmPackageInfo.Description = packageMeta.Description;

                        npmPackageInfo.Author = packageMeta.Authors;
                        if (packageMeta.Owners != null)
                        {
                            npmPackageInfo.Maintainers.Clear();
                            npmPackageInfo.Maintainers.AddRange(SplitCommaSeparatedString(packageMeta.Owners));
                        }

                        if (packageMeta.Tags != null)
                        {
                            npmPackageInfo.Keywords.Clear();
                            npmPackageInfo.Keywords.Add("nuget");
                            npmPackageInfo.Keywords.AddRange(SplitCommaSeparatedString(packageMeta.Tags));
                        }
                    }

                    var npmVersion = new NpmPackageVersion
                    {
                        Id          = $"{npmPackageId}@{npmCurrentVersion}",
                        Version     = npmCurrentVersion,
                        Name        = npmPackageId,
                        Description = packageMeta.Description,
                        Author      = AuthorNameUnityGroup,
                        DisplayName = $"{packageMeta.Title} ({npmPackageInfo.Author})"
                    };
                    npmVersion.Distribution.Tarball = new Uri($"{RootHttpUrl}/{npmPackage.Id}/-/{GetUnityPackageFileName(packageIdentity, npmVersion)}");
                    npmVersion.Unity = MinimumUnityVersion;
                    npmPackage.Versions[npmVersion.Version] = npmVersion;

                    bool hasDependencyErrors = false;
                    foreach (var deps in netstd20Dependency.Packages)
                    {
                        var depsId = deps.Id.ToLowerInvariant();

                        if (!_registry.TryGetValue(deps.Id, out var packageEntryDep))
                        {
                            LogError($"The package `{packageIdentity}` has a dependency on `{deps.Id}` which is not in the registry. You must add this dependency to the registry.json file.");
                            hasDependencyErrors = true;
                        }
                        else if (packageEntryDep.Ignored)
                        {
                            // A package that is ignored is not declared as an explicit dependency
                            continue;
                        }
                        else if (!deps.VersionRange.IsSubSetOrEqualTo(packageEntryDep.Version))
                        {
                            LogError($"The version range `{deps.VersionRange}` for the dependency `{deps.Id}` for the package `{packageIdentity}` doesn't match the range allowed from the registry.json: `{packageEntryDep.Version}`");
                            hasDependencyErrors = true;
                        }

                        // Otherwise add the package as a dependency
                        npmVersion.Dependencies.Add($"{UnityScope}.{depsId}", deps.VersionRange.MinVersion.ToString());
                    }

                    // If we don't have any dependencies error, generate the package
                    if (!hasDependencyErrors)
                    {
                        await ConvertNuGetToUnityPackageIfDoesNotExist(packageIdentity, npmPackageInfo, npmVersion, packageMeta);

                        npmPackage.Time[npmCurrentVersion] = packageMeta.Published?.UtcDateTime ?? GetUnityPackageFileInfo(packageIdentity, npmVersion).CreationTimeUtc;

                        // Copy repository info if necessary
                        if (update)
                        {
                            npmPackage.Repository = npmVersion.Repository?.Clone();
                        }
                    }
                }
            }
        }
Example #6
0
        /// <summary>
        /// For each package in our registry.json, query NuGet, extract package metadata, and convert them to unity packages.
        /// </summary>
        private async Task BuildInternal()
        {
            var packageMetadataResource = _sourceRepository.GetResource <PackageMetadataResource>();

            var versionPath = Path.Combine(_rootPersistentFolder, "version.txt");
            var forceUpdate = !File.Exists(versionPath) || await File.ReadAllTextAsync(versionPath) != CurrentRegistryVersion;

            if (forceUpdate)
            {
                _logger.LogInformation($"Registry version changed to {CurrentRegistryVersion} - Regenerating all packages");
            }


            var regexFilter = Filter != null ? new Regex(Filter, RegexOptions.IgnoreCase) : null;

            if (Filter != null)
            {
                _logger.LogInformation($"Filtering with regex: {Filter}");
            }

            var onProgress = OnProgress;

            var progressCount = 0;

            foreach (var packageDesc in _registry)
            {
                var packageName  = packageDesc.Key;
                var packageEntry = packageDesc.Value;

                // Log progress count
                onProgress?.Invoke(++progressCount, _registry.Count);

                // A package entry is ignored but allowed in the registry (case of Microsoft.CSharp)
                if (packageEntry.Ignored || (regexFilter != null && !regexFilter.IsMatch(packageName)))
                {
                    continue;
                }

                var packageMetaIt = await packageMetadataResource.GetMetadataAsync(packageName, false, false, _sourceCacheContext, _logger, CancellationToken.None);

                var packageMetas = packageMetaIt.ToList();
                foreach (var packageMeta in packageMetas)
                {
                    var packageIdentity = packageMeta.Identity;
                    var packageId       = packageIdentity.Id.ToLowerInvariant();
                    var npmPackageId    = $"{_unityScope}.{packageId}";

                    if (!packageEntry.Version.Satisfies(packageMeta.Identity.Version))
                    {
                        continue;
                    }

                    var resolvedDependencyGroups = packageMeta.DependencySets.Where(dependencySet => dependencySet.TargetFramework.IsAny || _targetFrameworks.Any(targetFramework => dependencySet.TargetFramework == targetFramework.Framework)).ToList();

                    if (!packageEntry.Analyzer && resolvedDependencyGroups.Count == 0)
                    {
                        _logger.LogWarning($"The package `{packageIdentity}` doesn't support `{string.Join(",", _targetFrameworks.Select(x => x.Name))}`");
                        continue;
                    }

                    if (!_npmPackageRegistry.Packages.TryGetValue(npmPackageId, out var npmPackage))
                    {
                        npmPackage = new NpmPackage();
                        _npmPackageRegistry.Packages.Add(npmPackageId, npmPackage);
                    }

                    // One NpmPackage (for package request)

                    var packageInfoList = packageEntry.Listed ? _npmPackageRegistry.ListedPackageInfos : _npmPackageRegistry.UnlistedPackageInfos;

                    if (!packageInfoList.Packages.TryGetValue(npmPackageId, out var npmPackageInfo))
                    {
                        npmPackageInfo = new NpmPackageInfo();
                        packageInfoList.Packages.Add(npmPackageId, npmPackageInfo);
                    }

                    // Update latest version
                    var currentVersion = packageIdentity.Version;

                    var update = !npmPackage.DistTags.TryGetValue("latest", out var latestVersion) ||
                                 (currentVersion > NuGetVersion.Parse(latestVersion)) ||
                                 forceUpdate;

                    string npmCurrentVersion = GetNpmVersion(currentVersion);

                    if (update)
                    {
                        npmPackage.DistTags["latest"] = npmCurrentVersion;

                        npmPackageInfo.Versions.Clear();
                        npmPackageInfo.Versions[npmCurrentVersion] = "latest";

                        npmPackage.Id      = npmPackageId;
                        npmPackage.License = packageMeta.LicenseMetadata?.License ?? packageMeta.LicenseUrl?.ToString();

                        npmPackage.Name     = npmPackageId;
                        npmPackageInfo.Name = npmPackageId;

                        npmPackage.Description     = packageMeta.Description;
                        npmPackageInfo.Description = packageMeta.Description;

                        npmPackageInfo.Author = packageMeta.Authors;
                        if (packageMeta.Owners != null)
                        {
                            npmPackageInfo.Maintainers.Clear();
                            npmPackageInfo.Maintainers.AddRange(SplitCommaSeparatedString(packageMeta.Owners));
                        }

                        if (packageMeta.Tags != null)
                        {
                            npmPackageInfo.Keywords.Clear();
                            npmPackageInfo.Keywords.Add("nuget");
                            npmPackageInfo.Keywords.AddRange(SplitCommaSeparatedString(packageMeta.Tags));
                        }
                    }

                    var npmVersion = new NpmPackageVersion
                    {
                        Id          = $"{npmPackageId}@{npmCurrentVersion}",
                        Version     = npmCurrentVersion,
                        Name        = npmPackageId,
                        Description = packageMeta.Description,
                        Author      = npmPackageInfo.Author,
                        DisplayName = packageMeta.Title + _packageNameNuGetPostFix
                    };
                    npmVersion.Distribution.Tarball = new Uri(_rootHttpUri, $"{npmPackage.Id}/-/{GetUnityPackageFileName(packageIdentity, npmVersion)}");
                    npmVersion.Unity = _minimumUnityVersion;
                    npmPackage.Versions[npmVersion.Version] = npmVersion;

                    bool hasDependencyErrors = false;
                    foreach (var resolvedDependencyGroup in resolvedDependencyGroups)
                    {
                        foreach (var deps in resolvedDependencyGroup.Packages)
                        {
                            if (!_registry.TryGetValue(deps.Id, out var packageEntryDep))
                            {
                                LogError($"The package `{packageIdentity}` has a dependency on `{deps.Id}` which is not in the registry. You must add this dependency to the registry.json file.");
                                hasDependencyErrors = true;
                            }
                            else if (packageEntryDep.Ignored)
                            {
                                // A package that is ignored is not declared as an explicit dependency
                                continue;
                            }
                            else if (!deps.VersionRange.IsSubSetOrEqualTo(packageEntryDep.Version))
                            {
                                LogError($"The version range `{deps.VersionRange}` for the dependency `{deps.Id}` for the package `{packageIdentity}` doesn't match the range allowed from the registry.json: `{packageEntryDep.Version}`");
                                hasDependencyErrors = true;
                                continue;
                            }

                            // Otherwise add the package as a dependency
                            var depsId = deps.Id.ToLowerInvariant();
                            var key    = $"{_unityScope}.{depsId}";
                            if (!npmVersion.Dependencies.ContainsKey(key))
                            {
                                npmVersion.Dependencies.Add(key, GetNpmVersion(deps.VersionRange.MinVersion));
                            }
                        }
                    }

                    // If we don't have any dependencies error, generate the package
                    if (!hasDependencyErrors)
                    {
                        await ConvertNuGetToUnityPackageIfDoesNotExist(packageIdentity, npmPackageInfo, npmVersion, packageMeta, forceUpdate, packageEntry);

                        npmPackage.Time[npmCurrentVersion] = packageMeta.Published?.UtcDateTime ?? GetUnityPackageFileInfo(packageIdentity, npmVersion).CreationTimeUtc;

                        // Copy repository info if necessary
                        if (update)
                        {
                            npmPackage.Repository = npmVersion.Repository?.Clone();
                        }
                    }
                }
            }

            if (forceUpdate)
            {
                await File.WriteAllTextAsync(versionPath, CurrentRegistryVersion);
            }
        }
Example #7
0
 public void InstallPackageFailureTest()
 {
     string wd = "c:\\root\\project1";
     Uri registry = null;
     NpmFactory factory = new MockNpmFactory();
     NpmPackageManager target = new NpmPackageManager(factory, wd, registry);
     NpmPackage package = new NpmPackage("bogusmod", null);
     NpmException expected = MockTestData.ErrorInstallExpected();
     try
     {
         target.InstallPackage(package);
         Assert.Fail("Expected exception");
     }
     catch (NpmException ex)
     {
         Assert.IsNotNull(ex);
         Assert.AreEqual(expected.Message, ex.Message);
         Assert.AreEqual(expected.NpmCode, ex.NpmCode);
         Assert.AreEqual(expected.NpmErrno, ex.NpmErrno);
         Assert.AreEqual(expected.NpmFile, ex.NpmFile);
         Assert.AreEqual(expected.NpmPath, ex.NpmPath);
         Assert.AreEqual(expected.NpmType, ex.NpmType);
         Assert.AreEqual(expected.NpmSyscall, ex.NpmSyscall);
         Assert.AreEqual(expected.NpmSystem, ex.NpmSystem);
         Assert.AreEqual(expected.NpmCommand, ex.NpmCommand);
         Assert.AreEqual(expected.NpmNodeVersion, ex.NpmNodeVersion);
         Assert.AreEqual(expected.NpmNpmVersion, ex.NpmNpmVersion);
         Assert.AreEqual(expected.NpmMessage, ex.NpmMessage);
         Assert.AreEqual(expected.NpmArguments, ex.NpmArguments);
         Assert.AreEqual(expected.NpmCwd, ex.NpmCwd);
         Assert.AreEqual(expected.NpmVerbose, ex.NpmVerbose);
     }
 }
Example #8
0
 public void UpdatePackageTest()
 {
     string wd = "c:\\root\\update1";
     Uri registry = null;
     NpmFactory factory = new MockNpmFactory();
     NpmPackageManager target = new NpmPackageManager(factory, wd, registry);
     NpmPackage package = new NpmPackage("underscore", null);
     target.UpdatePackage(package);
     Assert.IsTrue(true);    // no exception thrown
 }
Example #9
0
 public void InstallPackageTest()
 {
     string wd = "c:\\root\\project1";
     Uri registry = null;
     NpmFactory factory = new MockNpmFactory();
     NpmPackageManager target = new NpmPackageManager(factory, wd, registry);
     NpmPackage package = new NpmPackage("install1", null);
     target.InstallPackage(package);
     Assert.IsTrue(true);   // no exception thrown
 }
Example #10
0
 public void FindDependenciesToBeInstalledMultiTest()
 {
     string wd = "c:\\root\\outdatedmulti";
     Uri registry = null;
     NpmFactory factory = new MockNpmFactory();
     NpmPackageManager target = new NpmPackageManager(factory, wd, registry);
     NpmPackage package = new NpmPackage("outdatedparent", null);
     List<NpmPackageDependency> expected = MockTestData.OutdatedMultiExpected();
     IEnumerable<INpmPackageDependency> actual;
     actual = target.FindDependenciesToBeInstalled(package);
     Assert.IsNotNull(actual);
     Assert.AreEqual(expected.Count, actual.Count());
     int index = 0;
     foreach (INpmPackageDependency actualItem in actual)
     {
         Assert.AreEqual(expected[index], actualItem, "item value differs");
         index++;
     }
 }
Example #11
0
 public void InstallTest()
 {
     string wd = "c:\\root\\project1";
     Uri registry = null;
     NpmFactory factory = new MockNpmFactory();
     NpmApi target = new NpmApi(factory, wd, registry);
     NpmPackage package = new NpmPackage("install1", null);
     List<NpmInstalledPackage> expected = MockTestData.Install1Expected();
     IEnumerable<INpmInstalledPackage> actual;
     actual = target.Install(package);
     Assert.IsNotNull(actual);
     Assert.AreEqual(expected.Count, actual.Count());
     int index = 0;
     foreach (INpmInstalledPackage actualItem in actual)
     {
         Assert.AreEqual(expected[index], actualItem, "item value differs");
         index++;
     }
 }
Example #12
0
 /// <summary>
 /// Execute UpdatePackage
 /// </summary>
 /// <param name="npm">NpmPackageManager instance</param>
 /// <param name="name">name of package</param>
 private static void DoUpdate(NpmPackageManager npm, string name)
 {
     NpmPackage pkg = new NpmPackage(name, null);
     npm.UpdatePackage(pkg);
 }
Example #13
0
 /// <summary>
 /// Execute UninstallPackage
 /// </summary>
 /// <param name="npm">NpmPackageManager instance</param>
 /// <param name="name">name of package</param>
 private static void DoUninstall(NpmPackageManager npm, string name)
 {
     NpmPackage pkg = new NpmPackage(name, null);
     npm.UninstallPackage(pkg);
 }
Example #14
0
 /// <summary>
 /// Input for IsInstalled
 /// </summary>
 /// <returns>Input for IsInstalled test</returns>
 public static NpmPackage List2MatchInstalledPackage()
 {
     NpmPackage package;
     package = new NpmPackage("bogus", null);
     return package;
 }
Example #15
0
 /// <summary>
 /// Input for IsInstalled test
 /// </summary>
 /// <returns>Input data for IsInstalled test</returns>
 public static NpmPackage List1MatchInstalledPackage()
 {
     NpmPackage package;
     package = new NpmPackage("xml2js", null);
     return package;
 }