jh_PSModule.psm1

$Public  = @(Get-ChildItem -Path "$PSScriptRoot/Public"  -Filter *.ps1 -ErrorAction SilentlyContinue)
$Private = @(Get-ChildItem -Path "$PSScriptRoot/Private" -Filter *.ps1 -ErrorAction SilentlyContinue)

# Collect private module folders
[string[]]$PrivateModules =
    Get-ChildItem -Path "$PSScriptRoot/Private" -Directory -ErrorAction SilentlyContinue |
    Select-Object -ExpandProperty FullName

# Dot‑source all function files
foreach ($import in $Public + $Private) {
    try {
        . $import.FullName
    }
    catch {
        Write-Error "Failed to import function $($import.FullName): $_"
    }
}

# Import nested private modules
foreach ($Module in $PrivateModules) {
    try {
        Import-Module $Module -ErrorAction Stop
    }
    catch {
        Write-Error "Failed to import module $Module`: $_"
    }
}

# Auto-export all functions defined in Public
$PublicFunctions = @()
if ($Public) {
    $PublicFunctions = foreach ($file in $Public) {
        Select-String -Path $file.FullName -Pattern '(?i)^function\s+([A-Za-z0-9_-]+)\s*\{' |
            ForEach-Object { $_.Matches.Groups[1].Value } |
            Select-Object -Unique
    }
}

if ($PublicFunctions.Count -gt 0) {
    Export-ModuleMember -Function $PublicFunctions
} else {
    Write-Verbose "No public functions found to export from $PSScriptRoot/Public"
}