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

using System;
using System.IO;

namespace Microsoft.DotNet.Build.Tasks.Workloads.Swix;

/// <summary>
/// Creates a SWIX project used to author a Visual Studio component package.
/// </summary>
internal class ComponentSwixProject : SwixProjectBase
{
    private SwixComponent _component;

    public ComponentSwixProject(SwixComponent component, string baseIntermediateOutputPath, string baseOutputPath, bool outOfSupport = false) :
        base(component.Name, component.Version, baseIntermediateOutputPath, baseOutputPath, outOfSupport)
    {
        SourcePath = Path.Combine(SourcePath, $"{component.SdkFeatureBand}", $"{Path.GetRandomFileName()}");
        _component = component;
        ValidateRelativePackagePath(GetRelativePackagePath());

        // Components must have 1 or more dependencies.
        if (!component.HasDependencies)
        {
            throw new ArgumentException(string.Format(Strings.ComponentMustHaveAtLeastOneDependency, component.Name));
        }

        ReplacementTokens[SwixTokens.__VS_COMPONENT_TITLE__] = component.Title;
        ReplacementTokens[SwixTokens.__VS_COMPONENT_DESCRIPTION__] = component.Description;
        ReplacementTokens[SwixTokens.__VS_COMPONENT_CATEGORY__] = component.Category;
        ReplacementTokens[SwixTokens.__VS_IS_UI_GROUP__] = component.IsUiGroup ? DefaultValues.Swix.Yes : DefaultValues.Swix.No;
        ReplacementTokens[SwixTokens.__VS_PACKAGE_OUT_OF_SUPPORT__] = OutOfSupport ? DefaultValues.Swix.Yes : DefaultValues.Swix.No;
        ReplacementTokens[SwixTokens.__VS_IS_ADVERTISED_PACKAGE__] = component.Advertise ? DefaultValues.Swix.Yes : DefaultValues.Swix.No;
    }

    /// <inheritdoc />
    public override string Create()
    {
        string swixProj = AddFile("component.swixproj", $"{Id}.{Version.ToString(2)}.swixproj");
        string componentSwr = AddFile("component.swr");
        AddFile("component.res.swr");

        // SWIX is indentation sensitive. The dependencies should be written as 
        //
        // vs.dependencies
        //   vs.dependency id=<package Id>
        //                 version=<version range>
        using StreamWriter swrWriter = File.AppendText(componentSwr);

        foreach (SwixDependency dependency in _component.Dependencies)
        {
            swrWriter.WriteLine($"  vs.dependency id={dependency.Id}");
            swrWriter.WriteLine($"                version={dependency.GetVersionRange()}");
            swrWriter.WriteLine($"                behaviors=IgnoreApplicabilityFailures");
        }

        return swixProj;
    }

    /// <inheritdoc />
    protected override string GetRelativePackagePath() =>
        Path.Combine(base.GetRelativePackagePath(), "_package.json");
}