Public/Resolve-NuspecProperty.ps1

function Resolve-NuspecProperty
{
    <#
        .SYNOPSIS
            Resolves a property to be used in a Nuspec manifest.
        .DESCRIPTION
            Resolves a property that matches some mappings to be used in a Nuspec manifest.
            This CmdLet supports most of PowerShell module manifest file (psd1) properties.
        .PARAMETER Name
            A string containing the name of the property to be resolved.
        .PARAMETER Value
            An object containing the value(s) of the property.
        .PARAMETER AcceptChocolateyProperties
            A switch specifying whether or not to accept Chocolatey-specific properties.
        .INPUTS
        .OUTPUTS
            System.Management.Automation.PSCustomObject
            Returns a PSCustomObject containing the name and value of the mapped property.
        .EXAMPLE
            Resolve-NuspecProperty -Name "version" -Value "1.0.0"
 
            Description
            -----------
            This example will return the mapped property for "version" (which is "version") and the value specified.
        .EXAMPLE
            Resolve-NuspecProperty -Name "RequiredModules" -Value @( "MyModule1", @{ ModuleName = "MyModule2" ; ModuleVersion = "1.0.0" }, @{ ModuleName = "MyModule3" ; RequiredVersion = "1.0.0" } )
 
            Description
            -----------
            This example will return the mapped property for "RequiredModules" (which is "dependencies") and the value specified.
        .EXAMPLE
            Resolve-NuspecProperty -Name "CompanyName"
 
            Description
            -----------
            This example will return the mapped property for "CompanyName" (which is "owners").
        .NOTES
        .LINK
            Set-NuspecProperty
        .LINK
            https://docs.microsoft.com/en-us/nuget/reference/nuspec
    #>

    [CmdLetBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [string] $Name,
        [Parameter(Mandatory = $false)]
        $Value,
        [Parameter(Mandatory = $false)]
        [switch] $AcceptChocolateyProperties
    )
    
    $ResolvedProperty = New-Object -TypeName PSCustomObject
    switch -Regex ($Name)
    {
        "description"
        {
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Name" -Value "description" -PassThru | Out-Null
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Value" -Value $Value -PassThru | Out-Null
        }
        "^summary$"
        {
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Name" -Value "summary" -PassThru | Out-Null
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Value" -Value $Value -PassThru | Out-Null
        }
        "^version$|ModuleVersion"
        {
            switch -Regex ($Value.GetType().Name)
            {
                "version" { $Value = $Value.ToString() }
                "object" { $Value = "$($Value.Major).$($Value.Minor).$($Value.Build)" }
            }
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Name" -Value "version" -PassThru | Out-Null
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Value" -Value $Value -PassThru | Out-Null
        }
        "Prerelease"
        {
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Name" -Value "Prerelease" -PassThru | Out-Null
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Value" -Value $Value -PassThru | Out-Null
        }
        "^name$|^id$|RootModule|ModuleToProcess"
        {
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Name" -Value "id" -PassThru | Out-Null
            if ((($Name -eq "RootModule") -or ($Name -eq "ModuleToProcess")) -and ($Value)) { $Value = $Value.Replace(".psm1", "") }
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Value" -Value $Value -PassThru | Out-Null
        }
        "^title$"
        {
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Name" -Value "title" -PassThru | Out-Null
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Value" -Value $Value -PassThru | Out-Null
        }
        "^owners$|CompanyName"
        {
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Name" -Value "owners" -PassThru | Out-Null
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Value" -Value $Value -PassThru | Out-Null
        }
        "^authors$|Author"
        {
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Name" -Value "authors" -PassThru | Out-Null
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Value" -Value $Value -PassThru | Out-Null
        }
        "Copyright"
        {
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Name" -Value "copyright" -PassThru | Out-Null
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Value" -Value $Value -PassThru | Out-Null
        }
        "projectUrl|ProjectUri"
        {
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Name" -Value "projectUrl" -PassThru | Out-Null
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Value" -Value $Value -PassThru | Out-Null
        }
        "licenseUrl|LicenseUri"
        {
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Name" -Value "licenseUrl" -PassThru | Out-Null
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Value" -Value $Value -PassThru | Out-Null
        }
        "^license$"
        {
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Name" -Value "license" -PassThru | Out-Null
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Value" -Value $Value -PassThru | Out-Null
        }
        "iconUrl|IconUri"
        {
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Name" -Value "iconUrl" -PassThru | Out-Null
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Value" -Value $Value -PassThru | Out-Null
        }
        "dependencies|RequiredModules|RequiredScripts"
        {
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Name" -Value "dependencies" -PassThru | Out-Null
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Value" -Value $Value -PassThru | Out-Null
            
        }
        "tags"
        {
            if ($Value.GetType().Name -eq "string") { $Value = $Value.Split(",") -join " " }
            else { $Value = $Value | Select-Object -Unique }
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Name" -Value "tags" -PassThru | Out-Null
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Value" -Value $($Value.Split(" ") -join " ") -PassThru | Out-Null
        }
        "releaseNotes"
        {
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Name" -Value "releaseNotes" -PassThru | Out-Null
            if ($Value -like "*.md") { $Value = Get-Content $Value }
            $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Value" -Value ($Value -join "`r`n") -PassThru | Out-Null   
        }
        "^docsUrl$|^mailingListUrl$|^bugTrackerUrl$|^packageSourceUrl$|^projectSourceUrl$"
        {
            if ($AcceptChocolateyProperties)
            {
                $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Name" -Value $Name -PassThru | Out-Null
                $ResolvedProperty | Add-Member -MemberType NoteProperty -Name "Value" -Value $Value -PassThru | Out-Null
            }
            else { Write-Warning "Property '$Name' does not match any mapped Nuspec property." }    
        }
        default { Write-Warning "Property '$Name' does not match any mapped Nuspec property." }
    }
    if ($ResolvedProperty.Name)
    { 
        Write-Verbose "Property '$Name' resolved to '$($ResolvedProperty.Name)'."
        if ($ResolvedProperty.Value) { Write-Verbose "Value returned for this property is '$($ResolvedProperty.Value)' ($($ResolvedProperty.Value.GetType().Name))." }
    }
    else { $ResolvedProperty = $null }
    $ResolvedProperty
}