Private/Find-GitHubReleases.ps1

<#
    .SYNOPSIS
        Lists all releases for a specified GitHub repository.
 
    .DESCRIPTION
        Retrieves all releases for the given GitHub repository using the GitHub REST API.
         
        If the GITHUB_ACCESS_TOKEN environment variable is set, authenticated requests are used to increase rate limits.
         
        Returns a list of release objects with selected fields and asset information. Warns if the GitHub API rate limit is exceeded.
 
    .PARAMETER RepositoryOwner
        The owner (user or organization) of the GitHub repository.
 
    .PARAMETER RepositoryName
        The name of the GitHub repository.
 
    .EXAMPLE
        Find-GitHubReleases -RepositoryOwner 'firebird' -RepositoryName 'firebird'
         
        Lists all releases for the 'firebird/firebird' repository.
 
    .OUTPUTS
        PSCustomObject[]
        A list of release objects, each including fields such as html_url, tag_name, name, prerelease, published_at, and an array of asset information (name, size, digest, browser_download_url).
#>

function Find-GitHubReleases {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$RepositoryOwner,

        [Parameter(Mandatory)]
        [string]$RepositoryName
    )

    $uri = "https://api.github.com/repos/$($RepositoryOwner)/$($RepositoryName)/releases"
    Write-VerboseMark -Message "Querying GitHub API for releases: $uri"

    try {
        $headers = @{ 'User-Agent' = 'ChocoForge-Module' }
            
        # Uses GitHub access token from environment variable if available
        [string]$githubAccessToken = $env:GITHUB_ACCESS_TOKEN
        if ($githubAccessToken) {
            Write-VerboseMark '- Using authenticated GitHub API requests'
            $headers['Authorization'] = "Bearer $githubAccessToken"
        }

        $response = Invoke-RestMethod -Uri $uri -Headers $headers -Verbose:$false
        Write-VerboseMark -Message "- Received $($response.Count) releases from GitHub API."

        $result = $response | Select-Object @(
            'html_url',
            'tag_name',
            'name',
            'prerelease',
            'published_at',
            @{ Name = 'assets'; Expression = { @($_.assets | Select-Object -Property name, size, digest, browser_download_url) } }
        )
        return $result
    } catch {
        [string]$errorMessage = $_.Exception.Message
        if ($errorMessage -like '*rate limit*') {
            Write-Warning 'GitHub API rate limit exceeded. Please wait and try again later, or set GITHUB_ACCESS_TOKEN environment variable to increase rate limits.'
        } 
        throw "Failed to fetch GitHub releases for '$($uri): $errorMessage"
    }
}