Posh-Certutil.psm1

$script:SessionPool = [System.Collections.Concurrent.ConcurrentDictionary[string, object]]::new()
$script:ModuleRoot  = $PSScriptRoot
$script:ConfigPath  = Join-Path -Path $PSScriptRoot -ChildPath 'Config\Posh-Certutil.json'

# Singular-noun aliases for cmdlets whose noun predates the PowerShell approved-verb/noun
# guideline requiring singular nouns. The plural name stays the canonical, exported function.
$script:CmdletAliases = @{
    'Get-PWSHCertutilIssuedCerts'            = 'Get-PWSHCertutilIssuedCert'
    'Get-PWSHCertutilRevokedCerts'           = 'Get-PWSHCertutilRevokedCert'
    'Get-PWSHCertutilShortTermExpiringCerts' = 'Get-PWSHCertutilShortTermExpiringCert'
    'Revoke-PWSHCertutilIssuedCerts'         = 'Revoke-PWSHCertutilIssuedCert'
    'Search-PWSHCertutilCerts'               = 'Search-PWSHCertutilCert'
    'Show-PWSHCertutilCerts'                 = 'Show-PWSHCertutilCert'
}

Get-ChildItem -Path "$PSScriptRoot\Private" -Recurse -Filter '*.ps1' -ErrorAction Stop |
    ForEach-Object { . $_.FullName }

Get-ChildItem -Path "$PSScriptRoot\Public" -Filter '*.ps1' -ErrorAction Stop |
    ForEach-Object {
        . $_.FullName
        Export-ModuleMember -Function $_.BaseName

        if ($script:CmdletAliases.ContainsKey($_.BaseName)) {
            $aliasName = $script:CmdletAliases[$_.BaseName]
            New-Alias -Name $aliasName -Value $_.BaseName -Force
            Export-ModuleMember -Alias $aliasName
        }
    }

$MyInvocation.MyCommand.ScriptBlock.Module.OnRemove = {
    $script:SessionPool.Values | ForEach-Object {
        if ($null -ne $_.Session) {
            Remove-PSSession -Session $_.Session -ErrorAction SilentlyContinue
        }
    }
    $script:SessionPool.Clear()
}