Completers/Repository.ps1

using namespace System.Management.Automation;

$ownerCompleter = {
    [CmdletBinding()]
    param([string]$command, [string]$parameter, [string]$wordToComplete, [CommandAst]$commandAst, [Hashtable]$params)
    Add-DefaultParameterValues -Command $command -Parameters $params
    & {
        $tokenParam = @{ }
        if ($params.ContainsKey('Token')) {
            $tokenParam.Token = $params.Token
        }
        # Requesting one of your own repos
        $user = Get-GitHubUser @tokenParam
        if ($wordToComplete -and $user.Login -like "$wordToComplete*") {
            return $user
        }
        # Requesting a repo of one of your orgs
        $orgs = $user | Get-GitHubOrganization @tokenParam | Where-Object { $_.Login -like "$wordToComplete*" }
        if ($wordToComplete -and $orgs) {
            return $orgs
        }
        # Invoking autocomplete without any character typed
        if (-not $wordToComplete) {
            return ($user, $orgs) | ForEach-Object { $_ }
        }
        # Requesting any other repo
        Find-GitHubUser -Query $wordToComplete @tokenParam |
            Where-Object { $_.Login -like "$wordToComplete*" } |
            Select-Object -First 10
    } | ForEach-Object {
        $tooltip = if ('PSGitHub.Organization' -in $_.PSTypeNames -and $_.Description) {
            $_.Description
        } elseif ('PSGitHub.User' -in $_.PSTypeNames -and $_.Name) {
            $_.Name
        } else {
            $_.Login
        }
        [CompletionResult]::new($_.Login, $_.Login, [CompletionResultType]::ParameterValue, $tooltip)
    }
}
Get-Command *-GitHub* | Where-Object { $_.Parameters -and $_.Parameters.ContainsKey('Owner') } | ForEach-Object {
    Register-ArgumentCompleter -CommandName $_.Name -ParameterName Owner -ScriptBlock $ownerCompleter
}

$repositoryNameCompleter = {
    [CmdletBinding()]
    param([string]$command, [string]$parameter, [string]$wordToComplete, [CommandAst]$commandAst, [Hashtable]$params)
    Add-DefaultParameterValues -Command $command -Parameters $params
    $findRepoParams = @{
        Query = $wordToComplete
    }
    if ($params.ContainsKey('Token')) {
        $findRepoParams.Token = $params.Token
    }
    if ($params.ContainsKey('Owner')) {
        $findRepoParams.Query += " user:$($params.Owner)"
    }
    Find-GitHubRepository @findRepoParams |
        Where-Object { $_.Name -like "$wordToComplete*" } |
        Select-Object -First 5 |
        ForEach-Object {
            $tooltip = if ($_.Description) { $_.Description } else { $_.Name }
            [CompletionResult]::new($_.Name, $_.Name, [CompletionResultType]::ParameterValue, $tooltip)
        }
}
Get-Command *-GitHub* | Where-Object { $_.Parameters -and $_.Parameters.ContainsKey('RepositoryName') } | ForEach-Object {
    Register-ArgumentCompleter -CommandName $_.Name -ParameterName RepositoryName -ScriptBlock $repositoryNameCompleter
}