File: FilterUnknownPackages.cs
Web Access
Project: Microsoft.DotNet.Build.Tasks.Packaging.csproj (Microsoft.DotNet.Build.Tasks.Packaging)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using System;
using System.Collections.Generic;
using System.Linq;

namespace Microsoft.DotNet.Build.Tasks.Packaging;

public class FilterUnknownPackages : Task
{
    /// <summary>
    /// Original dependencies
    /// </summary>
    [Required]
    public ITaskItem[] OriginalDependencies { get; set; }

    /// <summary>
    /// Permitted package baseline versions.
    ///   Identity: Package ID
    ///   Version: Package version.
    /// </summary>
    public ITaskItem[] BaseLinePackages { get; set; }

    /// <summary>
    /// Package index files used to define known packages.
    /// </summary>
    public ITaskItem[] PackageIndexes { get; set; }


    [Output]
    public ITaskItem[] FilteredDependencies { get; set; }

    public override bool Execute()
    {
        Func<string, bool> isKnownPackage;

        if (PackageIndexes != null && PackageIndexes.Length > 0)
        {
            var index = PackageIndex.Load(PackageIndexes.Select(pi => pi.GetMetadata("FullPath")));
            isKnownPackage = packageId => index.Packages.ContainsKey(packageId);
        }
        else
        {
            var baseLinePackageIds = new HashSet<string>(BaseLinePackages.NullAsEmpty().Select(b => b.ItemSpec));
            isKnownPackage = packageId => baseLinePackageIds.Contains(packageId);
        }

        FilteredDependencies = OriginalDependencies.Where(
            dependency =>
                !dependency.ItemSpec.StartsWith("System.Private") ||  // only apply filtering to System.Private dependencies
                isKnownPackage(dependency.ItemSpec)
            ).ToArray();

        return !Log.HasLoggedErrors;
    }
}