Public/Get-NextPSGalleryVersion.ps1

function Get-NextPSGalleryVersion {
    <#
    .SYNOPSIS
        Get the next version for a module or script in the PowerShell Gallery

    .FUNCTIONALITY
        CI/CD

    .DESCRIPTION
        Get the next version for a module or script in the PowerShell Gallery

        Uses the versioning scheme adopted by the user

        Where possible, users should stick to semver: http://semver.org/ (Major.Minor.Patch, given restrictions .NET Version class)

        This requires the PowerShellGet module
        
        If no existing module is found, we return 0.0.1

    .PARAMETER Name
        Name of the PowerShell module or script

    .PARAMETER Type
        Module or script. Defaults to module.

    .EXAMPLE
        Get-NextPSGalleryVersion PSDeploy

    .EXAMPLE
        Get-NextPSGalleryVersion Open-ISEFunction -Type Script

    .LINK
        https://github.com/RamblingCookieMonster/BuildHelpers

    .LINK
        about_BuildHelpers
    #>

    [cmdletbinding()]
    param(
        [parameter(ValueFromPipelineByPropertyName=$True)]
        [string[]]$Name,

        [parameter(ValueFromPipelineByPropertyName=$True)]
        [ValidateSet('Module', 'Script')]
        [string]$Type = 'Module',

        [string]$Repository = 'PSGallery'
    )
    Process
    {
        foreach($Item in $Name)
        {
            Try
            {
                $Existing = $null
                if($Type -eq 'Module')
                {
                    $Existing = Find-Module -Name $Item -Repository $Repository -ErrorAction Stop
                }
                else # Script
                {
                    $Existing = Find-Script -Name $Item -Repository $Repository -ErrorAction Stop
                }
            }
            Catch
            {
                if($_ -match "No match was found for the specified search criteria")
                {
                    New-Object System.Version (0,0,1)
                }
                else
                {
                    Write-Error $_
                }
                continue
            }

            if($Existing.count -gt 1)
            {
                Write-Error "Found more than one $Type matching '$Item': Did you use a wildcard?"
                continue
            }
            elseif($Existing.count -eq 0)
            {
                Write-Verbose "Found no $Type matching '$Item'"
                New-Object System.Version (0,0,1)
                continue
            }
            else
            {
                $Version = $Existing.Version
            }

            # using revision
            if($Version.Revision -ge 0)
            {
                $Build = if($Version.Build -le 0) { 0 } else { $Version.Build }
                $Revision = if($Version.Revision -le 0) { 1 } else { $Version.Revision + 1 }
                New-Object System.Version ($Version.Major, $Version.Minor, $Build, $Revision)
            }
            # using build
            elseif($Version.Build -ge 0)
            {
                $Build = if($Version.Build -le 0) { 1 } else { $Version.Build + 1 }
                New-Object System.Version ($Version.Major, $Version.Minor, $Build)
            }
            # using minor. wat?
            elseif($Version.Minor -ge 0)
            {
                $Minor = if($Version.Minor -le 0) { 1 } else { $Version.Minor + 1 }
                New-Object System.Version ($Version.Major, $Minor)
            }
            # using major only. I don't even.
            else
            {
                New-Object System.Version ($Version.Major + 1, 0)
            }
        }
    }
}