@@ -282,8 +282,12 @@ function Get-GitHubRelease {
282282 . SYNOPSIS
283283 Retrieves all releases from the current GitHub repository.
284284
285+ . DESCRIPTION
286+ Lists the releases of the current repository. A repository that has no releases yet
287+ returns an empty array rather than $null, so callers can treat the result uniformly.
288+
285289 . OUTPUTS
286- Array of release objects.
290+ Array of release objects. Empty when the repository has no releases.
287291
288292 . EXAMPLE
289293 $releases = Get-GitHubRelease
@@ -298,14 +302,16 @@ function Get-GitHubRelease {
298302 Write-Error ' Failed to list releases for the repo.'
299303 exit $LASTEXITCODE
300304 }
301- $releases = $releasesJson | ConvertFrom-Json
305+ $releases = @ ( $releasesJson | ConvertFrom-Json )
302306
303307 Write-Host ' -------------------------------------------------'
308+ Write-Host " Found [$ ( $releases.Count ) ] releases."
304309 Write-Host ($releases | Select-Object - Property name, isPrerelease, isLatest, publishedAt |
305310 Format-Table | Out-String )
306311 Write-Host ' -------------------------------------------------'
307312
308- $releases
313+ # -NoEnumerate keeps an empty or single-element result an array through the pipeline.
314+ Write-Output - NoEnumerate $releases
309315 }
310316}
311317
@@ -314,6 +320,11 @@ function Get-LatestGitHubVersion {
314320 . SYNOPSIS
315321 Extracts the latest stable version from a GitHub releases list.
316322
323+ . DESCRIPTION
324+ Returns the version of the release marked as latest. A repository that has no releases
325+ yet - or that has releases but none marked as latest - resolves to '0.0.0' so a brand-new
326+ module can still be versioned before its first release exists.
327+
317328 . OUTPUTS
318329 PSSemVer representing the latest GitHub release version.
319330
@@ -325,9 +336,11 @@ function Get-LatestGitHubVersion {
325336 [CmdletBinding ()]
326337 [OutputType ([object ])]
327338 param (
328- # The GitHub releases array to search.
329- [Parameter (Mandatory )]
330- [array ] $Releases
339+ # The GitHub releases array to search. Empty or null when the repository has no releases.
340+ [Parameter ()]
341+ [AllowNull ()]
342+ [AllowEmptyCollection ()]
343+ [array ] $Releases = @ ()
331344 )
332345
333346 LogGroup ' Get latest version - GitHub' {
@@ -409,6 +422,11 @@ function Get-LatestPublishedVersion {
409422 . SYNOPSIS
410423 Returns the highest version between GitHub and the PowerShell Gallery.
411424
425+ . DESCRIPTION
426+ Compares the two known published versions and returns the highest one. A missing
427+ (null) version is treated as '0.0.0', so a module that has never been released to
428+ GitHub or published to the PowerShell Gallery resolves to a '0.0.0' baseline.
429+
412430 . OUTPUTS
413431 PSSemVer representing the highest known published version.
414432
@@ -420,19 +438,27 @@ function Get-LatestPublishedVersion {
420438 [CmdletBinding ()]
421439 [OutputType ([object ])]
422440 param (
423- # The latest version found in GitHub releases.
424- [Parameter (Mandatory )]
441+ # The latest version found in GitHub releases. Null when the repository has no releases.
442+ [Parameter ()]
443+ [AllowNull ()]
425444 [object ] $GitHubVersion ,
426445
427- # The latest version found in the PowerShell Gallery.
428- [Parameter (Mandatory )]
446+ # The latest version found in the PowerShell Gallery. Null when the module is unpublished.
447+ [Parameter ()]
448+ [AllowNull ()]
429449 [object ] $PSGalleryVersion
430450 )
431451
432452 LogGroup ' Latest version' {
433- $latestVersion = New-PSSemVer - Version (
434- $PSGalleryVersion , $GitHubVersion | Sort-Object - Descending | Select-Object - First 1
435- )
453+ $candidates = @ ($PSGalleryVersion , $GitHubVersion ) |
454+ Where-Object { $null -ne $_ -and -not [string ]::IsNullOrWhiteSpace([string ]$_ ) }
455+
456+ $latestVersion = if ($candidates.Count -gt 0 ) {
457+ New-PSSemVer - Version ($candidates | Sort-Object - Descending | Select-Object - First 1 )
458+ } else {
459+ Write-Warning " No published version found in GitHub or the PowerShell Gallery. Using '0.0.0'."
460+ New-PSSemVer - Version ' 0.0.0'
461+ }
436462 Write-Host " Latest version: [$ ( $latestVersion.ToString ()) ]"
437463 $latestVersion
438464 }
@@ -472,9 +498,11 @@ function Get-NextPrereleaseNumber {
472498 [ValidateNotNullOrEmpty ()]
473499 [string ] $PrereleaseName ,
474500
475- # The GitHub releases list.
476- [Parameter (Mandatory )]
477- [array ] $Releases
501+ # The GitHub releases list. Empty or null when the repository has no releases.
502+ [Parameter ()]
503+ [AllowNull ()]
504+ [AllowEmptyCollection ()]
505+ [array ] $Releases = @ ()
478506 )
479507
480508 $params = @ {
@@ -532,8 +560,9 @@ function Get-NextModuleVersion {
532560 [CmdletBinding ()]
533561 [OutputType ([object ])]
534562 param (
535- # The current latest published version.
536- [Parameter (Mandatory )]
563+ # The current latest published version. Null resolves to a '0.0.0' baseline.
564+ [Parameter ()]
565+ [AllowNull ()]
537566 [object ] $LatestVersion ,
538567
539568 # The release decision object.
@@ -550,12 +579,21 @@ function Get-NextModuleVersion {
550579 [string ] $ModuleName ,
551580
552581 # The GitHub releases list, used for incremental prerelease calculation.
553- [Parameter (Mandatory )]
554- [array ] $Releases
582+ # Empty or null when the repository has no releases.
583+ [Parameter ()]
584+ [AllowNull ()]
585+ [AllowEmptyCollection ()]
586+ [array ] $Releases = @ ()
555587 )
556588
557589 LogGroup ' Calculate new version' {
558- $newVersion = New-PSSemVer - Version $LatestVersion
590+ $baseVersion = if ($null -eq $LatestVersion -or [string ]::IsNullOrWhiteSpace([string ]$LatestVersion )) {
591+ Write-Warning " No latest version was resolved. Using '0.0.0' as the baseline."
592+ ' 0.0.0'
593+ } else {
594+ $LatestVersion
595+ }
596+ $newVersion = New-PSSemVer - Version $baseVersion
559597 $newVersion.Prefix = $Configuration.VersionPrefix
560598
561599 if ($Decision.MajorRelease ) {
0 commit comments