Tools/Validate-ReleaseTagManifest.ps1

[CmdletBinding()]
param(
    [Parameter(Mandatory = $true)]
    [string]$Tag,

    [string]$ManifestPath = './PowerShellWSL.psd1'
)

$ErrorActionPreference = 'Stop'

if ($Tag -notmatch '^v(?<version>\d+\.\d+\.\d+)(?:-(?<prerelease>[0-9A-Za-z.-]+))?$') {
    throw "Tag '$Tag' is not valid. Expected vMAJOR.MINOR.PATCH or vMAJOR.MINOR.PATCH-prerelease."
}

$TagVersion = $Matches.version
$TagPrerelease = $Matches.prerelease

$Manifest = Import-PowerShellDataFile -Path $ManifestPath
$ManifestVersion = [string]$Manifest.ModuleVersion
$ManifestPrerelease = [string]$Manifest.PrivateData.PSData.Prerelease

if ($ManifestVersion -ne $TagVersion) {
    throw "Manifest ModuleVersion '$ManifestVersion' does not match tag version '$TagVersion'."
}

if ([string]::IsNullOrWhiteSpace($TagPrerelease)) {
    if (-not [string]::IsNullOrWhiteSpace($ManifestPrerelease)) {
        throw "Stable tag '$Tag' requires empty Prerelease in manifest, found '$ManifestPrerelease'."
    }
}
else {
    if ([string]::IsNullOrWhiteSpace($ManifestPrerelease)) {
        throw "Prerelease tag '$Tag' requires PrivateData.PSData.Prerelease='$TagPrerelease' in manifest."
    }

    if ($ManifestPrerelease -ne $TagPrerelease) {
        throw "Manifest Prerelease '$ManifestPrerelease' does not match tag prerelease '$TagPrerelease'."
    }
}

Write-Host "Tag/manifest validation passed for $Tag"