Private/Get-FoModuleDefaults.ps1

function Get-FoModuleDefaults {
    [CmdletBinding()]
    [OutputType([hashtable])]
    param()

    @{
        Level             = 5
        OutputMode        = 'TempMove'
        TempBackupPath    = Join-Path $env:TEMP 'FileOptimizer\backups'
        PluginSearchMode  = 'PortableFirst'
        PluginPath        = $null
        LogLevel          = 1
        ReportLogLevel    = $null
        ReportPath        = $null
        ReportVerbosity   = 'Standard'
        SizeDisplayUnit   = 'Auto'
        DurationDisplayUnit = 'Pretty'
        MissingToolsPolicy = 'Error'
        BackupPath        = $null
        BackupSuffix      = '.bak'
        OptimizedSuffix   = '.optimized'
        HistoryEnabled    = $true
        HistoryPath       = $null
        DisablePluginMask = ''
        Debug             = $false
        TempDirectory     = $null
        IncludeMask       = ''
        ExcludeMask       = ''
        PNGCopyMetadata   = $false
        PNGAllowLossy     = $false
        JPEGCopyMetadata  = $false
        JPEGAllowLossy    = $false
        GIFCopyMetadata   = $false
        GIFAllowLossy     = $false
        WEBPAllowLossy    = $false
        GZCopyMetadata    = $false
        ZIPCopyMetadata   = $false
        EXEEnableUPX      = $false
        EXEDisablePETrim  = $false
        CSSEnableTidy     = $false
        HTMLEnableTidy    = $false
        JSEnableJSMin     = $false
        JSAdditionalExtensions = ''
        XMLEnableLeanify  = $false
        LUAEnableLeanify  = $false
        MiscDisable       = $false
        MiscCopyMetadata  = $false
        PDFSkipLayered    = $false
        PDFProfile        = 'none'
        TIFFCopyMetadata  = $false
        MP4CopyMetadata   = $false
        WAVCopyMetadata   = $false
        WAVStripSilence   = $false
        ZIPRecurse        = $false
        LeanifyIterations = -1
        PNGWolfIterations = -1
        PluginTimeoutSeconds = 1800
        MaxPluginStderrBytes = 1048576
        AcknowledgedPluginBundleMinimum = ''
    }
}

function Get-FoGlobalConfigPath {
    if ($env:FO_CONFIG_PATH) { return $env:FO_CONFIG_PATH }
    return Join-Path (Join-Path (Join-Path $HOME '.config') 'FileOptimizer') 'config.json'
}

function Get-FoDefaultHistoryPath {
    if ($env:FO_HISTORY_PATH) { return $env:FO_HISTORY_PATH }
    return Join-Path (Join-Path (Join-Path $HOME '.config') 'FileOptimizer') 'history.json'
}

function Get-FoDefaultPluginPath {
    if (-not $script:FoModuleRoot) { return $null }

    if ($env:FO_PLUGIN_PATH) {
        $candidate = $env:FO_PLUGIN_PATH.Trim()
        if ($candidate -and (Test-Path -LiteralPath $candidate)) {
            return ([System.IO.Path]::GetFullPath($candidate))
        }
    }

    $prefer64 = [Environment]::Is64BitProcess
    $candidates = if ($prefer64) {
        @('Plugins64', 'Plugins32')
    }
    else {
        @('Plugins32', 'Plugins64')
    }

    foreach ($name in $candidates) {
        $candidate = Join-Path $script:FoModuleRoot $name
        if (Test-Path -LiteralPath $candidate) {
            return ([System.IO.Path]::GetFullPath($candidate))
        }
    }

    return $null
}