Public/Show-Office365Modules.ps1

function Show-Office365Modules {
    param(
        [switch]$AllowPrerelease,
        [switch]$Refresh
    )

    $local:Functions = Get-Office365ModuleInfo
    $local:UsePre = if ($AllowPrerelease.IsPresent) { $true } else { [bool]$script:myOffice365Services['AllowPrerelease'] }
    if ($Refresh) { $script:myOffice365Services['OnlineVersionCache'].Clear() }

    $local:AllInstalled = Get-Module -ListAvailable -ErrorAction SilentlyContinue

    # Single pass: build a module-name→PSModuleInfo map for installed modules.
    # This avoids calling Get-InstalledRepoModule twice per module (once here for
    # the parallel pre-fetch name list, and again in the display loop).
    $local:InstalledMap = @{}
    foreach ($local:Item in $local:Functions) {
        $local:m = Get-InstalledRepoModule -Name $local:Item.Module -Repo $local:Item.Repo -AllInstalled $local:AllInstalled
        if ($local:m) { $local:InstalledMap[$local:Item.Module] = $local:m }
    }

    # Pre-fetch online versions.
    # PS 7+: run lookups in parallel (ThrottleLimit 10) — reduces ~22 s to ~3 s.
    # PS 5.1: sequential; each lookup populates the cache so repeat calls are instant.
    $local:Cache = $script:myOffice365Services['OnlineVersionCache']
    $local:ToFetch = $local:InstalledMap.Keys | Where-Object {
        $local:e = $local:Cache[$_]
        $null -eq $local:e -or ([datetime]::Now - $local:e.Fetched).TotalMinutes -ge 60
    }

    if ($local:ToFetch) {
        if ($PSVersionTable.PSVersion.Major -ge 7) {
            $local:UsePSRG = $script:myOffice365Services['PSResourceGet']
            $local:ToFetch | ForEach-Object -Parallel {
                $local:n = $_
                $local:o = if ($using:UsePSRG) {
                    Find-PSResource -Name $local:n -Prerelease:$using:UsePre -ErrorAction SilentlyContinue
                }
                else {
                    Find-Module -Name $local:n -AllowPrerelease:$using:UsePre -ErrorAction SilentlyContinue
                }
                $local:ver = if ($local:o) {
                    if ($null -ne $local:o.Prerelease -and $local:o.Prerelease -ne '') {
                        '{0}-{1}' -f $local:o.Version, $local:o.Prerelease
                    }
                    else { [string]$local:o.Version }
                }
                else { $null }
                [PSCustomObject]@{ Name = $local:n; Version = $local:ver }
            } -ThrottleLimit 10 | ForEach-Object {
                # Write back to cache in the parent runspace (serial, thread-safe)
                $script:myOffice365Services['OnlineVersionCache'][$_.Name] = [PSCustomObject]@{
                    Version = $_.Version; Fetched = [datetime]::Now
                }
            }
        }
        else {
            # PS 5.1 sequential path — Get-OnlineModuleVersion caches each result
            foreach ($local:n in $local:ToFetch) { $null = Get-OnlineModuleVersion -Name $local:n }
        }
    }

    # Display loop — all online versions come from the cache (instant lookups)
    foreach ($local:Item in $local:Functions) {

        $local:Module = $local:InstalledMap[$local:Item.Module]

        if ( $local:Module) {

            $local:Version = Get-ModuleVersionInfo -Module $local:Module
            $local:OnlineVer = Get-OnlineModuleVersion -Name $local:Item.Module

            Write-Host ('{0} v{1}' -f $local:Item.Description, $local:Version) -NoNewline

            if ( $local:OnlineVer) {
                Write-Host (' (Online v{0})' -f $local:OnlineVer) -NoNewline
            }
            else {
                Write-Host (' (Online N/A)') -NoNewline
            }
            Write-Host (', Scope:{0} - Status is ' -f (Get-ModuleScope -Module $local:Module)) -NoNewline

            if ( [string]::IsNullOrEmpty( $local:Version) -or [string]::IsNullOrEmpty( $local:OnlineVer)) {
                Write-Host ('Unknown') -ForegroundColor $script:myConsoleColors.Warning
            }
            else {
                if ( (Compare-TextVersionNumber -Version $local:Version -CompareTo $local:OnlineVer) -eq 1) {
                    Write-Host ('Outdated') -ForegroundColor $script:myConsoleColors.Error
                }
                else {
                    Write-Host ('OK') -ForegroundColor $script:myConsoleColors.OK
                }
            }
            if ( $local:Item.ReplacedBy) {
                Write-Warning ('{0} has been replaced by {1}' -f $local:Item.Module, $local:Item.ReplacedBy)
            }
        }
        else {
            Write-Host ('{0} not installed' -f $local:Item.Description) -ForegroundColor $script:myConsoleColors.Muted
        }
    }
}