PSQualityTools.psm1

#Region '.\public\Show-ModuleUpdateStatus.ps1' 0
function Show-ModuleUpdateStatus {
    <#
        .SYNOPSIS
        Show the update status of installed module.
 
        .DESCRIPTION
        Show the version of all installed modules, optionally only show ones that require update.
        NOTE: Owing to the nature of checks against remote repositories, the function may take quite a while to run!
 
        .PARAMETER Name
        Name of the module to show the version information of, or a wildcard to show all.
 
        .PARAMETER RequiresUpdate
        Switch to only show modules that require update.
 
        .EXAMPLE
        Show-ModuleUpdateStatus
 
        .EXAMPLE
        Show-ModuleUpdateStatus -Name 'ModuleName'
 
        .EXAMPLE
        Show-ModuleUpdateStatus -RequiresUpdate
 
        .EXAMPLE
        $modules = Show-ModuleUpdateStatus -RequiresUpdate
 
        .LINK
        Include any applicable links
 
    #>

    [CmdletBinding()]
    [OutputType([System.Object])]
    param (

        [Parameter(ValueFromPipeline = $true)]
        [ValidateNotNullorEmpty()]
        [string[]]$Name = "*",
        [switch]$RequiresUpdate

    )

    begin {

        Write-Debug "Starting Show-ModuleUpdateStatus"
        Write-Information "Working ..." -InformationAction Continue

        Set-StrictMode -Version Latest
        $ErrorActionPreference = 'Stop'

        $Repositories = Get-PSRepository

        try {
            $localModules = Get-Module -Name $name -ListAvailable -ErrorAction Stop | Sort-Object -Property Name
        }
        catch {
            throw $_
        }

    }

    process {

        if ($localModules -is [System.Array]) {

            $moduleOutput = New-Object -TypeName "System.Collections.ArrayList"

            foreach ($module in $localModules) {

                Write-Information " Processing local module: $($module.Name) ($($module.Version)) ..." -InformationAction Continue

                try {

                    $moduleVersion = New-Object -TypeName "System.Collections.ArrayList"

                    foreach ($repository in $Repositories) {

                        Write-Verbose "Looking at repository '$($repository.Name)' for $($module.Name)"
                        $moduleInfo = Find-Module -Name $module.Name -Repository $repository.Name -ErrorAction SilentlyContinue

                        if ($null -eq $moduleInfo) {
                            $moduleInfo = @{
                                Repository = $repository.Name
                                Version    = "n/a"
                            }
                        }
                        else {
                            $moduleInfo = @{
                                Repository = $repository.Name
                                Version    = $moduleInfo.Version
                            }
                        }

                        $null = $moduleVersion.Add($moduleInfo)

                    }

                    $updateAvailable = $false
                    foreach ($version in $moduleVersion) {
                        if ($version.Version -gt $module.Version -and $version.Version -ne 'n/a') {
                            $updateAvailable = $true
                        }
                    }

                    $moduleData = [PsCustomObject]@{
                        PSTypeName = "moduleInfo"
                        Name       = $module.Name
                    }

                    $moduleData | Add-Member -NotePropertyName "Local" -NotePropertyValue $module.Version
                    foreach ($version in $moduleVersion) {
                        $moduleData | Add-Member -NotePropertyName $version.Repository -NotePropertyValue $version.Version
                    }
                    $moduleData | Add-Member -NotePropertyName "Update" -NotePropertyValue $updateAvailable

                    $null = $moduleOutput.Add($moduleData)

                }
                catch {
                    Write-Error $_
                }

            }

            if ($PSBoundParameters.ContainsKey('RequiresUpdate')) {

                $output = $moduleOutput | Where-Object Update -EQ $true

            }
            else {

                $output = $moduleOutput

            }

            if ($null -ne $output) {

                $output | Format-Table -AutoSize

            }
            else {

                Write-Information '' -InformationAction Continue
                Write-Information 'No module(s) require update.' -InformationAction Continue
                Write-Information '' -InformationAction Continue

            }

        }
        else {
            Write-Warning "No modules found."
        }
    }

    end {

        Write-Debug "Leaving Show-ModuleUpdateStatus"

    }

}

#EndRegion '.\public\Show-ModuleUpdateStatus.ps1' 163