src/public/Publish-Module.ps1

[CmdletBinding()]
param (
  [Parameter(Mandatory = $true)]
  [string]
  $ModulePath,
  [Parameter(Mandatory = $true)]
  [string]
  $ApiKey
)

begin {
  $ErrorActionPreference = "Stop"
  
  if ( -not $PSBoundParameters.ContainsKey( 'ModulePath' ) ) {
    $Dir = (Get-Item $PSScriptRoot)
    $DirName = $Dir.Name
    $DirFullPath = $Dir.FullName
    $ModulePath = Join-Path $DirFullPath "$DirName.ps1"
  }
  
  if ( -not ( Test-Path $ModulePath ) ) {
    Write-Error "Module file: '$ModulePath' doesn't exist!"
  }
  
  $ModuleName = [System.IO.Path]::GetFileNameWithoutExtension( $ModulePath )
}

process {
    $modulePublished = $true
    try {
        $moduleOnFeed = Find-Module -Repository $PSRepository -Name $ModuleName -ErrorAction Stop
    } catch {
        $modulePublished = $false
    }
    
    Import-Module $ModulePath
    $module = Get-Module $ModuleName
    
    if ( -not $modulePublished ) {
        Write-Verbose "Module doesn't exists on NuGet feed. Publishing..."
        Publish-Module -Path . -Repository $PSRepository -NuGetApiKey $ApiKey
    } else {
        [Version] $currentVersion = $module.Version
        [Version] $feedVersion = $moduleOnFeed.Version
        
        Write-Verbose "Current module version: $currentVersion" 
        Write-Verbose "Published module last version: $feedVersion"
        
        $currentVersion = [Version]::new($currentVersion.Major, $currentVersion.Minor, $currentVersion.Build)
        $feedVersion = [Version]::new($feedVersion.Major, $feedVersion.Minor, $feedVersion.Build)
        
        if ( $currentVersion -gt $feedVersion ) {
            Write-Verbose "Module version is greater than published module's version. Publishing..."
            Publish-Module -Path . -Repository $PSRepository -NuGetApiKey $ApiKey
        }
    }
}