Public/NugetSearch.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Management.Automation;
using System.Threading;
using System.Threading.Tasks;
using NuGet.Common;
using NuGet.Configuration;
using NuGet.Protocol;
using NuGet.Protocol.Core.Types;
namespace NugetSearch{
    [Cmdlet(VerbsCommon.Get, "NugetPackageSearchMetadata")]
    [OutputType(typeof(IPackageSearchMetadata))]
    [CmdletBinding]
    public class GetNugetPackageSearchMetadata : PSCmdlet{
        [Parameter(Mandatory = true, ValueFromPipeline = true)]
        public string Name{ get; set; } = string.Empty;
        [Parameter]
        public SwitchParameter AllVersions{ get; set; }
        [Parameter]
        public SwitchParameter IncludePrerelease{ get; set; } =SwitchParameter.Present;
        [Parameter]
        public SwitchParameter IncludeUnlisted{ get; set; } = SwitchParameter.Present;
 
        protected override void ProcessRecord(){
            base.ProcessRecord();
            try{
                var packageSearchMetadata = Find(Name, IncludeUnlisted, IncludePrerelease).Result;
                if (!AllVersions)
                    packageSearchMetadata = new[]{packageSearchMetadata.Last()};
 
                WriteObject(packageSearchMetadata, true);
            }
            catch (AggregateException e){
                var flatten = e.Flatten();
                flatten.Flatten().Handle(_ => {
                    if (_ is AggregateException){
                        WriteError(new ErrorRecord(flatten, _.GetType().FullName, ErrorCategory.InvalidOperation, Name));
                        return true;
                    }
 
                    return false;
                });
            }
        }
 
        async Task<IEnumerable<IPackageSearchMetadata>> Find(string packageID,bool includeUnlisted, bool includePrerelease){
            var providers = new List<Lazy<INuGetResourceProvider>>();
            providers.AddRange(Repository.Provider.GetCoreV3());
            var packageSource = new PackageSource("https://api.nuget.org/v3/index.json");
            var sourceRepository = new SourceRepository(packageSource, providers);
            var packageMetadataResource = await sourceRepository.GetResourceAsync<PackageMetadataResource>();
            return await packageMetadataResource.GetMetadataAsync(packageID, includePrerelease, includeUnlisted, new NullLogger(), CancellationToken.None);
        }
    }
}