EMOS.psm1

# EMOS.psm1 - Entra MemberOf Scanner
# Dot-source all public and private functions

$Private = Get-ChildItem -Path "$PSScriptRoot\Private\*.ps1" -ErrorAction SilentlyContinue
$Public  = Get-ChildItem -Path "$PSScriptRoot\Public\*.ps1"  -ErrorAction SilentlyContinue

foreach ($file in @($Private + $Public)) {
    try {
        . $file.FullName
    }
    catch {
        Write-Error "Failed to import function $($file.FullName): $_"
    }
}

# Module-level constants
$script:EMOS_RETIREMENT_DATE = [datetime]'2026-11-03'

# Real MemberOf rule syntax used by Entra ID:
# user.memberof -any (group.objectId -in ['id1', 'id2'])
# device.memberof -any (group.objectId -in ['id1'])
# Also handles the older docs-style variant: memberOf("id")
$script:MEMBEROF_PATTERN = [regex]'(?i)\b(user|device)\.memberof\b|\bmemberOf\s*\('

Export-ModuleMember -Function $Public.BaseName