Private/Get-NuPkgInfo.ps1

function Get-NuPkgInfo {
    <#
    .SYNOPSIS
        Parse NuPkg filename to extract package information.
     
    .PARAMETER FilePath
        Path to the NuPkg file.
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]$FilePath
    )
    
    $fileName = [System.IO.Path]::GetFileNameWithoutExtension($FilePath)
    Write-Verbose "Parsing filename: $fileName"
    
    # Try different regex patterns for NuPkg filename parsing
    $patterns = @(
        '^(.+?)\.(\d+(?:\.\d+){0,3}(?:-[\w\-\.]+)?)$',  # Standard: PackageName.Version
        '^(.+)\.(\d+(?:\.\d+)*)$',                        # Simple: PackageName.Version (numeric only)
        '^(.+)-(\d+(?:\.\d+){0,3}(?:-[\w\-\.]+)?)$'      # Alternative: PackageName-Version
    )
    
    $packageName = $null
    $versionString = $null
    
    foreach ($pattern in $patterns) {
        if ($fileName -match $pattern) {
            $packageName = $matches[1]
            $versionString = $matches[2]
            Write-Verbose "Matched pattern '$pattern': Name='$packageName', Version='$versionString'"
            break
        }
    }
    
    if (-not $packageName -or -not $versionString) {
        Write-Warning "Could not parse package info from filename: $fileName"
        Write-Verbose "Tried patterns: $($patterns -join ', ')"
        return $null
    }
    
    # Clean version string and create Version object
    $cleanVersion = $versionString -replace '-.*$', ''
    Write-Verbose "Clean version: $cleanVersion"
    
    try {
        $version = [System.Version]::new($cleanVersion)
        Write-Verbose "Created version object: $version"
    } catch {
        Write-Verbose "Failed to create version object, trying fallback: $($_.Exception.Message)"
        # Fallback: try to create a valid version
        $versionParts = $cleanVersion -split '\.'
        if ($versionParts.Count -eq 1) {
            $version = [System.Version]::new([int]$versionParts[0], 0)
        } elseif ($versionParts.Count -eq 2) {
            $version = [System.Version]::new([int]$versionParts[0], [int]$versionParts[1])
        } elseif ($versionParts.Count -eq 3) {
            $version = [System.Version]::new([int]$versionParts[0], [int]$versionParts[1], [int]$versionParts[2])
        } else {
            $version = [System.Version]::new([int]$versionParts[0], [int]$versionParts[1], [int]$versionParts[2], [int]$versionParts[3])
        }
        Write-Verbose "Fallback version object: $version"
    }
    
    try {
        $fileSize = [math]::Round((Get-Item $FilePath).Length / 1MB, 2)
    } catch {
        Write-Warning "Could not get file size for: $FilePath"
        $fileSize = 0
    }
    
    $result = @{
        Name = $packageName
        Version = $version
        VersionString = $versionString
        FilePath = $FilePath
        FileName = [System.IO.Path]::GetFileName($FilePath)
        Size = $fileSize
        LastModified = (Get-Item $FilePath).LastWriteTime
    }
    
    Write-Verbose "Package info result: Name='$($result.Name)', Version='$($result.Version)', Size='$($result.Size)' MB"
    return $result
}