Private/Provider/Invoke-ProviderSearch.ps1

function Invoke-ProviderSearch {
    param(
        [string]$Query,
        [int]$MaxResults = 50,
        [bool]$ExactSearch = $false,
        [string]$SortBy = 'Relevance',
        [string]$Repository = 'PSGallery',
        [bool]$AuthorSearch = $false
    )

    $provider = Get-ModuleProvider

    try {
        Import-ActiveProvider -Provider $provider

        if ($AuthorSearch) {
            if ($provider -eq 'PSResourceGet') {
                # PSResourceGet has no author filter; use name wildcard as pre-filter then match author
                Write-Verbose "PSResourceGet: Author search for '$Query' (using server-side filter)..."
                try {
                    $raw = Find-PSResource -Name "*${Query}*" -Repository $Repository -Type Module -ErrorAction Stop |
                        Where-Object { $_.Author -like "*$Query*" } |
                        Select-Object -First ($MaxResults * 2)
                } catch {
                    $raw = @()
                }
                if ($raw.Count -eq 0) {
                    Write-Warning "Author search with PSResourceGet is limited. Consider installing PowerShellGet for better author search support."
                }
                $results = $raw | ConvertTo-ModuleInfo -ProviderType 'PSResourceGet'
            } else {
                # PowerShellGet's -Filter searches all metadata including author
                $raw = Find-Module -Filter $Query -Repository $Repository -ErrorAction Stop |
                    Where-Object { $_.Author -like "*$Query*" } |
                    Select-Object -First $MaxResults
                $results = $raw | ConvertTo-ModuleInfo -ProviderType 'PowerShellGet'
            }
        } else {
            $resolvedQuery = if ($ExactSearch) { $Query } else { "*$Query*" }

            if ($provider -eq 'PSResourceGet') {
                $fetchCount = if ($SortBy -eq 'Downloads') { $MaxResults * 2 } else { $MaxResults }
                $raw = Find-PSResource -Name $resolvedQuery -Repository $Repository -Type Module -ErrorAction Stop |
                    Select-Object -First $fetchCount
                $results = $raw | ConvertTo-ModuleInfo -ProviderType 'PSResourceGet'
            } else {
                $raw = Find-Module -Name $resolvedQuery -Repository $Repository -ErrorAction Stop |
                    Select-Object -First $MaxResults
                $results = $raw | ConvertTo-ModuleInfo -ProviderType 'PowerShellGet'
            }
        }

        switch ($SortBy) {
            'Downloads' { $results = $results | Sort-Object -Property DownloadCount -Descending }
            'LastUpdated' { $results = $results | Sort-Object -Property PublishedDate -Descending }
        }

        return $results | Select-Object -First $MaxResults

    } catch {
        Write-Error "Search failed: $_"
        return @()
    }
}