File: UpgradeLegacyWasmStaticWebAssets.cs
Web Access
Project: ..\..\..\src\BlazorWasmSdk\Tasks\Microsoft.NET.Sdk.BlazorWebAssembly.Tasks.csproj (Microsoft.NET.Sdk.BlazorWebAssembly.Tasks)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
#nullable disable
 
using Microsoft.AspNetCore.StaticWebAssets.Tasks;
using Microsoft.Build.Framework;
 
namespace Microsoft.NET.Sdk.BlazorWebAssembly;
 
public class UpgradeLegacyWasmStaticWebAssets : Task
{
    [Required]
    public ITaskItem[] LegacyAssets { get; set; }
 
    [Output]
    public ITaskItem[] UpgradedAssets { get; set; }
 
    public override bool Execute()
    {
        var upgradedAssets = new List<ITaskItem>();
 
        var legacyAssets = LegacyAssets.Select(StaticWebAsset.FromV1TaskItem).ToArray();
        var assetsByFinalPath = legacyAssets
            .GroupBy(asset => asset.ComputeTargetPath("", '/'))
            .ToDictionary(g => g.Key, g => g.ToArray());
 
        foreach (var legacyAsset in legacyAssets)
        {
            var upgradedAsset = new StaticWebAsset(legacyAsset);
 
            legacyAsset.AssetKind = StaticWebAsset.AssetKinds.Build;
 
            if (string.Equals(Path.GetExtension(legacyAsset.RelativePath), ".gz", StringComparison.Ordinal))
            {
                var relatedPath = legacyAsset.RelativePath.Substring(0, legacyAsset.RelativePath.Length - 3);
                var relatedAsset = assetsByFinalPath.TryGetValue(relatedPath, out var relatedAssets)
                    ? relatedAssets.Single()
                    : null;
 
                if (relatedAsset == null)
                {
                    Log.LogError($"Could not find a corresponding asset for '{legacyAsset.RelativePath}'");
                    continue;
                }
 
                Log.LogMessage($"Upgrading '{legacyAsset.RelativePath}' to use '{relatedAsset.Identity}' as the related asset");
 
                upgradedAsset.RelatedAsset = relatedAsset.Identity;
                upgradedAsset.AssetTraitName = "Content-Encoding";
                upgradedAsset.AssetTraitValue = "gzip";
            }
 
            upgradedAssets.Add(upgradedAsset.ToTaskItem());
        }
 
        UpgradedAssets = [.. upgradedAssets];
 
        return !Log.HasLoggedErrors;
    }
}