diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index ffe18a43..459c831f 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -132,4 +132,3 @@ body: required: true - label: This is not a bug report or security vulnerability report. required: true - diff --git a/CHANGELOG.md b/CHANGELOG.md index ae552d14..cfc368b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -81,6 +81,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- Fix unsupported `nova` help invocations so they now return Nova's structured CLI validation error instead of a + PowerShell parameter-binding failure. +- Keep manifest/package helper edge cases aligned with their intended behavior. + - Manifest settings resolution now accepts ordered dictionary metadata shapes in addition to plain hashtables. + - `New-NovaPackageArtifacts` now accepts an empty metadata list and returns an empty artifact result instead of + failing during parameter binding. - Centralize delivery configuration resolution so raw package upload, update notification settings, and PSGallery publishing now follow one explicit precedence model without surfacing configured secrets in error text. - Raw upload now resolves command overrides before named repository settings, then package defaults. diff --git a/codecov.yml b/codecov.yml index 86c899af..17a925e5 100644 --- a/codecov.yml +++ b/codecov.yml @@ -5,4 +5,4 @@ coverage: target: auto patch: default: - target: 100% \ No newline at end of file + target: 100% diff --git a/docs/NovaModuleTools/en-US/Deploy-NovaPackage.md b/docs/NovaModuleTools/en-US/Deploy-NovaPackage.md index ee2f4fd2..1a304ad9 100644 --- a/docs/NovaModuleTools/en-US/Deploy-NovaPackage.md +++ b/docs/NovaModuleTools/en-US/Deploy-NovaPackage.md @@ -377,4 +377,3 @@ If no upload target can be resolved, `Deploy-NovaPackage` fails fast with a clea - https://github.com/stiwicourage/NovaModuleTools/blob/main/docs/NovaModuleTools/en-US/New-NovaModulePackage.md - https://github.com/stiwicourage/NovaModuleTools/blob/main/docs/NovaModuleTools/en-US/Invoke-NovaCli.md - https://github.com/stiwicourage/NovaModuleTools/blob/main/docs/NovaModuleTools/en-US/Publish-NovaModule.md - diff --git a/src/private/build/GetNovaBuildProjectInfo.ps1 b/src/private/build/GetNovaBuildProjectInfo.ps1 index 3b8168db..0140edbd 100644 --- a/src/private/build/GetNovaBuildProjectInfo.ps1 +++ b/src/private/build/GetNovaBuildProjectInfo.ps1 @@ -10,4 +10,3 @@ function Get-NovaBuildProjectInfo { return Get-NovaProjectInfo } - diff --git a/src/private/build/GetNovaBuildWorkflowContext.ps1 b/src/private/build/GetNovaBuildWorkflowContext.ps1 index 587316b3..a27d7259 100644 --- a/src/private/build/GetNovaBuildWorkflowContext.ps1 +++ b/src/private/build/GetNovaBuildWorkflowContext.ps1 @@ -14,4 +14,3 @@ function Get-NovaBuildWorkflowContext { Operation = 'Build Nova module output' } } - diff --git a/src/private/build/InvokeNovaBuildWorkflow.ps1 b/src/private/build/InvokeNovaBuildWorkflow.ps1 index 202c5a8e..9d594329 100644 --- a/src/private/build/InvokeNovaBuildWorkflow.ps1 +++ b/src/private/build/InvokeNovaBuildWorkflow.ps1 @@ -44,4 +44,3 @@ function Invoke-NovaBuildUpdateNotificationSafely { $null = $_ } } - diff --git a/src/private/cli/AddNovaCliHeaderOption.ps1 b/src/private/cli/AddNovaCliHeaderOption.ps1 index 44305517..a1cf8885 100644 --- a/src/private/cli/AddNovaCliHeaderOption.ps1 +++ b/src/private/cli/AddNovaCliHeaderOption.ps1 @@ -24,4 +24,3 @@ function Add-NovaCliHeaderOption { $Options.Headers[$headerName] = $headerValue } - diff --git a/src/private/cli/AddNovaCliOptionValue.ps1 b/src/private/cli/AddNovaCliOptionValue.ps1 index f0413033..563a843a 100644 --- a/src/private/cli/AddNovaCliOptionValue.ps1 +++ b/src/private/cli/AddNovaCliOptionValue.ps1 @@ -13,4 +13,3 @@ function Add-NovaCliOptionValue { $Options[$Name] = @($existingValue + $Value) } - diff --git a/src/private/cli/ConvertFromNovaBuildCliArgument.ps1 b/src/private/cli/ConvertFromNovaBuildCliArgument.ps1 index aa7c6562..09a0bb43 100644 --- a/src/private/cli/ConvertFromNovaBuildCliArgument.ps1 +++ b/src/private/cli/ConvertFromNovaBuildCliArgument.ps1 @@ -9,4 +9,3 @@ function ConvertFrom-NovaBuildCliArgument { '-i' = 'ContinuousIntegration' } } - diff --git a/src/private/cli/ConvertFromNovaBumpCliArgument.ps1 b/src/private/cli/ConvertFromNovaBumpCliArgument.ps1 index 49818b46..3aaa7a31 100644 --- a/src/private/cli/ConvertFromNovaBumpCliArgument.ps1 +++ b/src/private/cli/ConvertFromNovaBumpCliArgument.ps1 @@ -11,4 +11,3 @@ function ConvertFrom-NovaBumpCliArgument { '-i' = 'ContinuousIntegration' } } - diff --git a/src/private/cli/ConvertFromNovaCliArgument.ps1 b/src/private/cli/ConvertFromNovaCliArgument.ps1 index 27bad27e..339c6425 100644 --- a/src/private/cli/ConvertFromNovaCliArgument.ps1 +++ b/src/private/cli/ConvertFromNovaCliArgument.ps1 @@ -73,4 +73,3 @@ function ConvertFrom-NovaPackageCliArgument { return ConvertFrom-NovaCliArgument -Arguments $Arguments -AllowedOptionNameList @('SkipTests') } - diff --git a/src/private/cli/ConvertFromNovaDeployCliArgument.ps1 b/src/private/cli/ConvertFromNovaDeployCliArgument.ps1 index dc5bbf17..1bd4146e 100644 --- a/src/private/cli/ConvertFromNovaDeployCliArgument.ps1 +++ b/src/private/cli/ConvertFromNovaDeployCliArgument.ps1 @@ -49,5 +49,3 @@ function ConvertFrom-NovaDeployCliArgument { return $options } - - diff --git a/src/private/cli/ConvertFromNovaTestCliArgument.ps1 b/src/private/cli/ConvertFromNovaTestCliArgument.ps1 index dd292e9c..789867a4 100644 --- a/src/private/cli/ConvertFromNovaTestCliArgument.ps1 +++ b/src/private/cli/ConvertFromNovaTestCliArgument.ps1 @@ -9,4 +9,3 @@ function ConvertFrom-NovaTestCliArgument { '-b' = 'Build' } } - diff --git a/src/private/cli/FormatNovaCliCommandHelp.ps1 b/src/private/cli/FormatNovaCliCommandHelp.ps1 index abca4dc6..83b272da 100644 --- a/src/private/cli/FormatNovaCliCommandHelp.ps1 +++ b/src/private/cli/FormatNovaCliCommandHelp.ps1 @@ -174,7 +174,3 @@ function Format-NovaCliCommandHelp { return Format-NovaCliShortCommandHelp -Definition $Definition } - - - - diff --git a/src/private/cli/FormatNovaCliCommandResult.ps1 b/src/private/cli/FormatNovaCliCommandResult.ps1 index 5e33e485..b2bf1192 100644 --- a/src/private/cli/FormatNovaCliCommandResult.ps1 +++ b/src/private/cli/FormatNovaCliCommandResult.ps1 @@ -70,4 +70,3 @@ function Format-NovaCliCommandResult { return $Result } - diff --git a/src/private/cli/GetNovaCliCommandHelp.ps1 b/src/private/cli/GetNovaCliCommandHelp.ps1 index 424d8ac2..3aed0949 100644 --- a/src/private/cli/GetNovaCliCommandHelp.ps1 +++ b/src/private/cli/GetNovaCliCommandHelp.ps1 @@ -17,4 +17,3 @@ function Get-NovaCliCommandHelp { $definition = Get-NovaCliCommandHelpDefinition -Command $Command return Format-NovaCliCommandHelp -Definition $definition -View $View } - diff --git a/src/private/cli/GetNovaCliCommandHelpDefinition.ps1 b/src/private/cli/GetNovaCliCommandHelpDefinition.ps1 index 0fc02369..8495f0f8 100644 --- a/src/private/cli/GetNovaCliCommandHelpDefinition.ps1 +++ b/src/private/cli/GetNovaCliCommandHelpDefinition.ps1 @@ -39,4 +39,3 @@ function Get-NovaCliCommandHelpDefinition { return Import-PowerShellDataFile -Path (Get-NovaCliCommandHelpFilePath -Command $Command) } - diff --git a/src/private/cli/GetNovaCliHelpRequest.ps1 b/src/private/cli/GetNovaCliHelpRequest.ps1 index 6e05899d..d0e0afd5 100644 --- a/src/private/cli/GetNovaCliHelpRequest.ps1 +++ b/src/private/cli/GetNovaCliHelpRequest.ps1 @@ -44,7 +44,7 @@ function Get-NovaCliRootHelpRequest { return Get-NovaCliResolvedHelpRequest -Command $Arguments[0] -View Long -TargetType Command } - Assert-NovaCliHelpUsageSupported -Tokens @('--help') + $Arguments + Assert-NovaCliHelpUsageSupported -Tokens (@('--help') + $Arguments) } function Get-NovaCliSubcommandHelpRequest { @@ -63,7 +63,7 @@ function Get-NovaCliSubcommandHelpRequest { } if (@($Arguments | Where-Object {Test-NovaCliHelpToken -Argument $_}).Count -gt 0) { - Assert-NovaCliHelpUsageSupported -Tokens @($Command) + $Arguments + Assert-NovaCliHelpUsageSupported -Tokens (@($Command) + $Arguments) } return $null @@ -83,5 +83,3 @@ function Get-NovaCliHelpRequest { return Get-NovaCliSubcommandHelpRequest -Command $normalizedCommand -Arguments $Arguments } - - diff --git a/src/private/cli/GetNovaCliRequiredArgumentValue.ps1 b/src/private/cli/GetNovaCliRequiredArgumentValue.ps1 index da74a3d1..52d18538 100644 --- a/src/private/cli/GetNovaCliRequiredArgumentValue.ps1 +++ b/src/private/cli/GetNovaCliRequiredArgumentValue.ps1 @@ -13,4 +13,3 @@ function Get-NovaCliRequiredArgumentValue { return $Arguments[$Index.Value] } - diff --git a/src/private/cli/InvokeNovaCliDeployCommand.ps1 b/src/private/cli/InvokeNovaCliDeployCommand.ps1 index a63d0484..7666ca18 100644 --- a/src/private/cli/InvokeNovaCliDeployCommand.ps1 +++ b/src/private/cli/InvokeNovaCliDeployCommand.ps1 @@ -8,5 +8,3 @@ function Invoke-NovaCliDeployCommand { $options = ConvertFrom-NovaDeployCliArgument -Arguments $Arguments return Deploy-NovaPackage @options @ForwardedParameters } - - diff --git a/src/private/cli/InvokeNovaCliInitCommand.ps1 b/src/private/cli/InvokeNovaCliInitCommand.ps1 index eafa8968..9f635bcc 100644 --- a/src/private/cli/InvokeNovaCliInitCommand.ps1 +++ b/src/private/cli/InvokeNovaCliInitCommand.ps1 @@ -13,4 +13,3 @@ function Invoke-NovaCliInitCommand { $options = ConvertFrom-NovaInitCliArgument -Arguments $Arguments return Initialize-NovaModule @options @ForwardedParameters } - diff --git a/src/private/cli/InvokeNovaCliNotificationCommand.ps1 b/src/private/cli/InvokeNovaCliNotificationCommand.ps1 index 2c222dea..9a259900 100644 --- a/src/private/cli/InvokeNovaCliNotificationCommand.ps1 +++ b/src/private/cli/InvokeNovaCliNotificationCommand.ps1 @@ -20,4 +20,3 @@ function Invoke-NovaCliNotificationCommand { } } } - diff --git a/src/private/package/AddNovaZipFileEntry.ps1 b/src/private/package/AddNovaZipFileEntry.ps1 index 5c083af3..559b853d 100644 --- a/src/private/package/AddNovaZipFileEntry.ps1 +++ b/src/private/package/AddNovaZipFileEntry.ps1 @@ -17,4 +17,3 @@ function Add-NovaZipFileEntry { $entryStream.Dispose() } } - diff --git a/src/private/package/AddNovaZipTextEntry.ps1 b/src/private/package/AddNovaZipTextEntry.ps1 index 4ab2afd2..6049a8a7 100644 --- a/src/private/package/AddNovaZipTextEntry.ps1 +++ b/src/private/package/AddNovaZipTextEntry.ps1 @@ -15,4 +15,3 @@ function Add-NovaZipTextEntry { $streamWriter.Dispose() } } - diff --git a/src/private/package/AssertNovaPackageMetadata.ps1 b/src/private/package/AssertNovaPackageMetadata.ps1 index d44b65ab..6c28d3b0 100644 --- a/src/private/package/AssertNovaPackageMetadata.ps1 +++ b/src/private/package/AssertNovaPackageMetadata.ps1 @@ -15,4 +15,3 @@ function Assert-NovaPackageMetadata { Stop-NovaOperation -Message 'Missing package metadata value: Authors' -ErrorId 'Nova.Configuration.PackageMetadataValueMissing' -Category InvalidData -TargetObject 'Authors' } } - diff --git a/src/private/package/AssertNovaPackageOutputDirectoryCanBeCleared.ps1 b/src/private/package/AssertNovaPackageOutputDirectoryCanBeCleared.ps1 index 83b40fc7..66951608 100644 --- a/src/private/package/AssertNovaPackageOutputDirectoryCanBeCleared.ps1 +++ b/src/private/package/AssertNovaPackageOutputDirectoryCanBeCleared.ps1 @@ -16,4 +16,3 @@ function Assert-NovaPackageOutputDirectoryCanBeCleared { } } } - diff --git a/src/private/package/GetNovaManifestValue.ps1 b/src/private/package/GetNovaManifestValue.ps1 index 9737b3e5..edab4bda 100644 --- a/src/private/package/GetNovaManifestValue.ps1 +++ b/src/private/package/GetNovaManifestValue.ps1 @@ -16,4 +16,3 @@ function Get-NovaManifestValue { return $property.Value } - diff --git a/src/private/package/GetNovaPackageArtifactPatternInfo.ps1 b/src/private/package/GetNovaPackageArtifactPatternInfo.ps1 index 3af589d8..b0c4a06a 100644 --- a/src/private/package/GetNovaPackageArtifactPatternInfo.ps1 +++ b/src/private/package/GetNovaPackageArtifactPatternInfo.ps1 @@ -20,4 +20,3 @@ function Get-NovaPackageArtifactPatternInfo { ExplicitPackageType = $explicitPackageType } } - diff --git a/src/private/package/GetNovaPackageArtifactSearchPattern.ps1 b/src/private/package/GetNovaPackageArtifactSearchPattern.ps1 index 0fecd8a0..4f8636d8 100644 --- a/src/private/package/GetNovaPackageArtifactSearchPattern.ps1 +++ b/src/private/package/GetNovaPackageArtifactSearchPattern.ps1 @@ -12,4 +12,3 @@ function Get-NovaPackageArtifactSearchPattern { return "$( $patternInfo.Pattern )$( Get-NovaPackageTypeExtension -PackageType $PackageType )" } - diff --git a/src/private/package/GetNovaPackageArtifactType.ps1 b/src/private/package/GetNovaPackageArtifactType.ps1 index 15bb37a8..adbe1772 100644 --- a/src/private/package/GetNovaPackageArtifactType.ps1 +++ b/src/private/package/GetNovaPackageArtifactType.ps1 @@ -17,4 +17,3 @@ function Get-NovaPackageArtifactType { Stop-NovaOperation -Message $errorMessage -ErrorId 'Nova.Validation.UnsupportedPackageUploadFileType' -Category InvalidArgument -TargetObject $PackagePath } } - diff --git a/src/private/package/GetNovaPackageAuthorList.ps1 b/src/private/package/GetNovaPackageAuthorList.ps1 index f80bd9f6..c6decff9 100644 --- a/src/private/package/GetNovaPackageAuthorList.ps1 +++ b/src/private/package/GetNovaPackageAuthorList.ps1 @@ -27,4 +27,3 @@ function Get-NovaPackageAuthorList { Select-Object -Unique ) } - diff --git a/src/private/package/GetNovaPackageContentItemList.ps1 b/src/private/package/GetNovaPackageContentItemList.ps1 index db40a2bb..94a33985 100644 --- a/src/private/package/GetNovaPackageContentItemList.ps1 +++ b/src/private/package/GetNovaPackageContentItemList.ps1 @@ -24,4 +24,3 @@ function Get-NovaPackageContentItemList { } ) } - diff --git a/src/private/package/GetNovaPackageFileName.ps1 b/src/private/package/GetNovaPackageFileName.ps1 index 26fd7004..71b7a6b1 100644 --- a/src/private/package/GetNovaPackageFileName.ps1 +++ b/src/private/package/GetNovaPackageFileName.ps1 @@ -69,4 +69,3 @@ function ConvertTo-NovaLatestPackageFileName { return $PackageFileName } - diff --git a/src/private/package/GetNovaPackageMetadata.ps1 b/src/private/package/GetNovaPackageMetadata.ps1 index 0cab1aa9..6c1fb5b1 100644 --- a/src/private/package/GetNovaPackageMetadata.ps1 +++ b/src/private/package/GetNovaPackageMetadata.ps1 @@ -58,4 +58,3 @@ function Get-NovaPackageMetadata { ContentRoot = $contentRoot } } - diff --git a/src/private/package/GetNovaPackageMetadataElement.ps1 b/src/private/package/GetNovaPackageMetadataElement.ps1 index ccec953c..3ddf1f6f 100644 --- a/src/private/package/GetNovaPackageMetadataElement.ps1 +++ b/src/private/package/GetNovaPackageMetadataElement.ps1 @@ -12,4 +12,3 @@ function Get-NovaPackageMetadataElement { $escapedValue = [System.Security.SecurityElement]::Escape($Value) return " <$Name>$escapedValue" } - diff --git a/src/private/package/GetNovaPackageOutputDirectory.ps1 b/src/private/package/GetNovaPackageOutputDirectory.ps1 index 54ec2231..170ffc1c 100644 --- a/src/private/package/GetNovaPackageOutputDirectory.ps1 +++ b/src/private/package/GetNovaPackageOutputDirectory.ps1 @@ -17,4 +17,3 @@ function Get-NovaPackageOutputDirectory { return [System.IO.Path]::Join($ProjectInfo.ProjectRoot, $outputDirectory) } - diff --git a/src/private/package/GetNovaPackageRepository.ps1 b/src/private/package/GetNovaPackageRepository.ps1 index ec8b4a57..b4e85c80 100644 --- a/src/private/package/GetNovaPackageRepository.ps1 +++ b/src/private/package/GetNovaPackageRepository.ps1 @@ -26,4 +26,3 @@ function Get-NovaPackageRepository { Stop-NovaOperation -Message "Package repository not found: $Repository. Define it under Package.Repositories in project.json or provide -Url." -ErrorId 'Nova.Configuration.PackageRepositoryNotFound' -Category InvalidData -TargetObject $Repository } - diff --git a/src/private/package/GetNovaPackageSettingValue.ps1 b/src/private/package/GetNovaPackageSettingValue.ps1 index addfd99e..46841817 100644 --- a/src/private/package/GetNovaPackageSettingValue.ps1 +++ b/src/private/package/GetNovaPackageSettingValue.ps1 @@ -23,4 +23,3 @@ function Get-NovaPackageSettingValue { return $null } - diff --git a/src/private/package/GetNovaPackageTypeExtension.ps1 b/src/private/package/GetNovaPackageTypeExtension.ps1 index e21179d1..47f2a9ea 100644 --- a/src/private/package/GetNovaPackageTypeExtension.ps1 +++ b/src/private/package/GetNovaPackageTypeExtension.ps1 @@ -11,4 +11,3 @@ function Get-NovaPackageTypeExtension { return '.nupkg' } - diff --git a/src/private/package/GetNovaPackageUploadArtifact.ps1 b/src/private/package/GetNovaPackageUploadArtifact.ps1 index d5c31308..0b6ff268 100644 --- a/src/private/package/GetNovaPackageUploadArtifact.ps1 +++ b/src/private/package/GetNovaPackageUploadArtifact.ps1 @@ -15,4 +15,3 @@ function Get-NovaPackageUploadArtifact { UploadUrl = Join-NovaPackageUploadUrl -Url $UploadTarget.Url -UploadPath $UploadTarget.UploadPath -PackageFileName $PackageFileInfo.PackageFileName } } - diff --git a/src/private/package/GetNovaPackageUploadAuthHeaderName.ps1 b/src/private/package/GetNovaPackageUploadAuthHeaderName.ps1 index 39e925fc..48bd2864 100644 --- a/src/private/package/GetNovaPackageUploadAuthHeaderName.ps1 +++ b/src/private/package/GetNovaPackageUploadAuthHeaderName.ps1 @@ -11,4 +11,3 @@ function Get-NovaPackageUploadAuthHeaderName { return "$headerName".Trim() } - diff --git a/src/private/package/GetNovaPackageUploadAuthHeaderValue.ps1 b/src/private/package/GetNovaPackageUploadAuthHeaderValue.ps1 index 1c0f0bd2..dfeece34 100644 --- a/src/private/package/GetNovaPackageUploadAuthHeaderValue.ps1 +++ b/src/private/package/GetNovaPackageUploadAuthHeaderValue.ps1 @@ -24,4 +24,3 @@ function Get-NovaPackageUploadAuthHeaderValue { return "$("$scheme".Trim() ) $Token" } - diff --git a/src/private/package/GetNovaPackageUploadFileList.ps1 b/src/private/package/GetNovaPackageUploadFileList.ps1 index e1fbb868..088635f2 100644 --- a/src/private/package/GetNovaPackageUploadFileList.ps1 +++ b/src/private/package/GetNovaPackageUploadFileList.ps1 @@ -14,4 +14,3 @@ function Get-NovaPackageUploadFileList { return @(Resolve-NovaPackageUploadOutputFileList -ProjectInfo $ProjectInfo -PackageType $PackageType) } - diff --git a/src/private/package/GetNovaPackageUploadPath.ps1 b/src/private/package/GetNovaPackageUploadPath.ps1 index d1f0fbcf..7f680477 100644 --- a/src/private/package/GetNovaPackageUploadPath.ps1 +++ b/src/private/package/GetNovaPackageUploadPath.ps1 @@ -14,4 +14,3 @@ function Get-NovaPackageUploadPath { return "$( $resolvedUploadPath )".Trim() } - diff --git a/src/private/package/GetNovaPackageUploadStatusCode.ps1 b/src/private/package/GetNovaPackageUploadStatusCode.ps1 index e2be076c..fe0af0e4 100644 --- a/src/private/package/GetNovaPackageUploadStatusCode.ps1 +++ b/src/private/package/GetNovaPackageUploadStatusCode.ps1 @@ -14,4 +14,3 @@ function Get-NovaPackageUploadStatusCode { return $null } - diff --git a/src/private/package/GetNovaPackageUploadTargetSettingBundle.ps1 b/src/private/package/GetNovaPackageUploadTargetSettingBundle.ps1 index 0868d236..c5a0c693 100644 --- a/src/private/package/GetNovaPackageUploadTargetSettingBundle.ps1 +++ b/src/private/package/GetNovaPackageUploadTargetSettingBundle.ps1 @@ -11,4 +11,3 @@ function Get-NovaPackageUploadTargetSettingBundle { Auth = Merge-NovaPackageSettingTable -BaseSettings (Get-NovaPackageSettingValue -InputObject $PackageSettings -Name 'Auth') -OverrideSettings (Get-NovaPackageSettingValue -InputObject $RepositorySettings -Name 'Auth') } } - diff --git a/src/private/package/GetNovaPackageUploadTargetUrl.ps1 b/src/private/package/GetNovaPackageUploadTargetUrl.ps1 index c109035b..5d001d1e 100644 --- a/src/private/package/GetNovaPackageUploadTargetUrl.ps1 +++ b/src/private/package/GetNovaPackageUploadTargetUrl.ps1 @@ -18,4 +18,3 @@ function Get-NovaPackageUploadTargetUrl { return "$resolvedUrl".Trim() } - diff --git a/src/private/package/GetNovaPackageUploadToken.ps1 b/src/private/package/GetNovaPackageUploadToken.ps1 index 0b2391e1..3b3d3864 100644 --- a/src/private/package/GetNovaPackageUploadToken.ps1 +++ b/src/private/package/GetNovaPackageUploadToken.ps1 @@ -13,4 +13,3 @@ function Get-NovaPackageUploadToken { ConfiguredValue = Get-NovaPackageSettingValue -InputObject $AuthSettings -Name 'Token' }) } - diff --git a/src/private/package/GetNovaPackageUploadWorkflowContext.ps1 b/src/private/package/GetNovaPackageUploadWorkflowContext.ps1 index 3e7fd2b9..3dc1a24c 100644 --- a/src/private/package/GetNovaPackageUploadWorkflowContext.ps1 +++ b/src/private/package/GetNovaPackageUploadWorkflowContext.ps1 @@ -29,4 +29,3 @@ function Get-NovaPackageUploadWorkflowContext { Operation = Get-NovaPackageUploadWorkflowOperation -UploadArtifactList $uploadArtifactList } } - diff --git a/src/private/package/GetNovaPackageUploadWorkflowOperation.ps1 b/src/private/package/GetNovaPackageUploadWorkflowOperation.ps1 index 4a05df0d..8664fa99 100644 --- a/src/private/package/GetNovaPackageUploadWorkflowOperation.ps1 +++ b/src/private/package/GetNovaPackageUploadWorkflowOperation.ps1 @@ -10,4 +10,3 @@ function Get-NovaPackageUploadWorkflowOperation { return "Upload $( $UploadArtifactList.Count ) package artifacts" } - diff --git a/src/private/package/GetNovaPackageUploadWorkflowTarget.ps1 b/src/private/package/GetNovaPackageUploadWorkflowTarget.ps1 index ddd80066..67f69e88 100644 --- a/src/private/package/GetNovaPackageUploadWorkflowTarget.ps1 +++ b/src/private/package/GetNovaPackageUploadWorkflowTarget.ps1 @@ -6,4 +6,3 @@ function Get-NovaPackageUploadWorkflowTarget { return ($UploadArtifactList | ForEach-Object {$_.UploadUrl}) -join ', ' } - diff --git a/src/private/package/JoinNovaPackageUploadUrl.ps1 b/src/private/package/JoinNovaPackageUploadUrl.ps1 index e0981b8d..3e9c0f94 100644 --- a/src/private/package/JoinNovaPackageUploadUrl.ps1 +++ b/src/private/package/JoinNovaPackageUploadUrl.ps1 @@ -14,4 +14,3 @@ function Join-NovaPackageUploadUrl { $urlPartList += [System.Uri]::EscapeDataString($PackageFileName) return $urlPartList -join '/' } - diff --git a/src/private/package/NewNovaPackageArtifacts.ps1 b/src/private/package/NewNovaPackageArtifacts.ps1 index d3146916..6a84824f 100644 --- a/src/private/package/NewNovaPackageArtifacts.ps1 +++ b/src/private/package/NewNovaPackageArtifacts.ps1 @@ -4,7 +4,7 @@ function New-NovaPackageArtifacts { [CmdletBinding()] param( [Parameter(Mandatory)][pscustomobject]$ProjectInfo, - [Parameter(Mandatory)][object[]]$PackageMetadataList + [Parameter(Mandatory)][AllowEmptyCollection()][object[]]$PackageMetadataList ) $resolvedPackageMetadataList = @($PackageMetadataList) diff --git a/src/private/package/NewNovaPackageContentTypesXml.ps1 b/src/private/package/NewNovaPackageContentTypesXml.ps1 index 30ccd59e..fce1fd98 100644 --- a/src/private/package/NewNovaPackageContentTypesXml.ps1 +++ b/src/private/package/NewNovaPackageContentTypesXml.ps1 @@ -38,4 +38,3 @@ function New-NovaPackageContentTypesXml { $xmlLines += '' return $xmlLines -join [Environment]::NewLine } - diff --git a/src/private/package/NewNovaPackageCorePropertiesXml.ps1 b/src/private/package/NewNovaPackageCorePropertiesXml.ps1 index b4f8f98b..4b35ef68 100644 --- a/src/private/package/NewNovaPackageCorePropertiesXml.ps1 +++ b/src/private/package/NewNovaPackageCorePropertiesXml.ps1 @@ -23,4 +23,3 @@ function New-NovaPackageCorePropertiesXml { '' ) -join [Environment]::NewLine } - diff --git a/src/private/package/NewNovaPackageNuspecXml.ps1 b/src/private/package/NewNovaPackageNuspecXml.ps1 index 8889a0af..5476271b 100644 --- a/src/private/package/NewNovaPackageNuspecXml.ps1 +++ b/src/private/package/NewNovaPackageNuspecXml.ps1 @@ -25,4 +25,3 @@ function New-NovaPackageNuspecXml { '' ) -join [Environment]::NewLine } - diff --git a/src/private/package/NewNovaPackageRelationshipsXml.ps1 b/src/private/package/NewNovaPackageRelationshipsXml.ps1 index d803ec36..669e9ad6 100644 --- a/src/private/package/NewNovaPackageRelationshipsXml.ps1 +++ b/src/private/package/NewNovaPackageRelationshipsXml.ps1 @@ -14,4 +14,3 @@ function New-NovaPackageRelationshipsXml { '' ) -join [Environment]::NewLine } - diff --git a/src/private/package/ResolveNovaPackageUploadAuthHeaderEntry.ps1 b/src/private/package/ResolveNovaPackageUploadAuthHeaderEntry.ps1 index 747d9c34..ec4e381e 100644 --- a/src/private/package/ResolveNovaPackageUploadAuthHeaderEntry.ps1 +++ b/src/private/package/ResolveNovaPackageUploadAuthHeaderEntry.ps1 @@ -16,4 +16,3 @@ function Resolve-NovaPackageUploadAuthHeaderEntry { Value = Get-NovaPackageUploadAuthHeaderValue -AuthSettings $AuthSettings -AuthenticationScheme $UploadOption.AuthenticationScheme -HeaderName $headerName -Token $resolvedToken } } - diff --git a/src/private/package/ResolveNovaPackageUploadHeaders.ps1 b/src/private/package/ResolveNovaPackageUploadHeaders.ps1 index ad7e4805..e0bec25d 100644 --- a/src/private/package/ResolveNovaPackageUploadHeaders.ps1 +++ b/src/private/package/ResolveNovaPackageUploadHeaders.ps1 @@ -15,4 +15,3 @@ function Resolve-NovaPackageUploadHeaders { $resolvedHeaders[$authHeaderEntry.Name] = $authHeaderEntry.Value return $resolvedHeaders } - diff --git a/src/private/package/ResolveNovaPackageUploadTarget.ps1 b/src/private/package/ResolveNovaPackageUploadTarget.ps1 index 5fb1eeba..b5c22a60 100644 --- a/src/private/package/ResolveNovaPackageUploadTarget.ps1 +++ b/src/private/package/ResolveNovaPackageUploadTarget.ps1 @@ -21,4 +21,3 @@ function Resolve-NovaPackageUploadTarget { Auth = $targetSettings.Auth } } - diff --git a/src/private/package/ResolveNovaPackageUploadTypeList.ps1 b/src/private/package/ResolveNovaPackageUploadTypeList.ps1 index 143ba6f0..23599503 100644 --- a/src/private/package/ResolveNovaPackageUploadTypeList.ps1 +++ b/src/private/package/ResolveNovaPackageUploadTypeList.ps1 @@ -48,4 +48,3 @@ function Resolve-NovaRequestedPackageUploadTypeList { Stop-NovaOperation -Message "Package.FileNamePattern '$( $PatternInfo.Pattern )' resolves to type '$( $PatternInfo.ExplicitPackageType )', but requested PackageType values are: $( $resolvedTypeList -join ', ' )." -ErrorId 'Nova.Validation.PackageUploadPatternConflict' -Category InvalidArgument -TargetObject $PatternInfo.Pattern } - diff --git a/src/private/package/TestNovaPathContainsPath.ps1 b/src/private/package/TestNovaPathContainsPath.ps1 index 4f0dd813..5ee10ec3 100644 --- a/src/private/package/TestNovaPathContainsPath.ps1 +++ b/src/private/package/TestNovaPathContainsPath.ps1 @@ -13,4 +13,3 @@ function Test-NovaPathContainsPath { return $normalizedChildPath.StartsWith("$normalizedParentPath$( [System.IO.Path]::DirectorySeparatorChar )", [System.StringComparison]::OrdinalIgnoreCase) } - diff --git a/src/private/quality/GetNovaTestWorkflowContext.ps1 b/src/private/quality/GetNovaTestWorkflowContext.ps1 index ea52c9c6..c334c519 100644 --- a/src/private/quality/GetNovaTestWorkflowContext.ps1 +++ b/src/private/quality/GetNovaTestWorkflowContext.ps1 @@ -60,7 +60,3 @@ function Get-NovaTestOptionValue { return $null } - - - - diff --git a/src/private/quality/InvokeNovaTestWorkflow.ps1 b/src/private/quality/InvokeNovaTestWorkflow.ps1 index 65135410..fd280b06 100644 --- a/src/private/quality/InvokeNovaTestWorkflow.ps1 +++ b/src/private/quality/InvokeNovaTestWorkflow.ps1 @@ -77,5 +77,3 @@ function Initialize-NovaPesterArtifactDirectory { $null = New-Item -ItemType Directory -Path $WorkflowContext.TestResultDirectory -Force } - - diff --git a/src/private/quality/NewNovaTestDynamicParameterDictionary.ps1 b/src/private/quality/NewNovaTestDynamicParameterDictionary.ps1 index 2bb73fe4..31c021d3 100644 --- a/src/private/quality/NewNovaTestDynamicParameterDictionary.ps1 +++ b/src/private/quality/NewNovaTestDynamicParameterDictionary.ps1 @@ -9,4 +9,3 @@ function New-NovaTestDynamicParameterDictionary { $dictionary.Add('Build',[System.Management.Automation.RuntimeDefinedParameter]::new('Build', [switch],$attributeCollection)) return $dictionary } - diff --git a/src/private/release/GetNovaVersionUpdateCiActivatedCommand.ps1 b/src/private/release/GetNovaVersionUpdateCiActivatedCommand.ps1 index 3c35d05a..b1ad62d8 100644 --- a/src/private/release/GetNovaVersionUpdateCiActivatedCommand.ps1 +++ b/src/private/release/GetNovaVersionUpdateCiActivatedCommand.ps1 @@ -15,4 +15,3 @@ function Get-NovaVersionUpdateCiActivatedCommand { $importedModule = Import-NovaBuiltModuleForCi -ProjectInfo $projectInfo return $importedModule.ExportedCommands['Update-NovaModuleVersion'] } - diff --git a/src/private/release/WriteNovaPublishWorkflowContext.ps1 b/src/private/release/WriteNovaPublishWorkflowContext.ps1 index a4d2bd60..f40b5cbf 100644 --- a/src/private/release/WriteNovaPublishWorkflowContext.ps1 +++ b/src/private/release/WriteNovaPublishWorkflowContext.ps1 @@ -7,4 +7,3 @@ function Write-NovaPublishWorkflowContext { Write-NovaLocalWorkflowMode -WorkflowName $WorkflowContext.WorkflowName -LocalRequested:$WorkflowContext.LocalRequested Write-NovaResolvedLocalPublishTarget -PublishInvocation $WorkflowContext.PublishInvocation } - diff --git a/src/private/shared/ConvertToNovaPackageType.ps1 b/src/private/shared/ConvertToNovaPackageType.ps1 index 96cf4312..a20d32cb 100644 --- a/src/private/shared/ConvertToNovaPackageType.ps1 +++ b/src/private/shared/ConvertToNovaPackageType.ps1 @@ -22,4 +22,3 @@ function ConvertTo-NovaPackageType { } } } - diff --git a/src/private/shared/GetNovaEnvironmentVariableValue.ps1 b/src/private/shared/GetNovaEnvironmentVariableValue.ps1 index 9cfb4ed4..5a253d86 100644 --- a/src/private/shared/GetNovaEnvironmentVariableValue.ps1 +++ b/src/private/shared/GetNovaEnvironmentVariableValue.ps1 @@ -10,4 +10,3 @@ function Get-NovaEnvironmentVariableValue { return [System.Environment]::GetEnvironmentVariable($Name.Trim()) } - diff --git a/src/private/shared/GetNovaProjectInfoContext.ps1 b/src/private/shared/GetNovaProjectInfoContext.ps1 index 482d7d9b..032cf408 100644 --- a/src/private/shared/GetNovaProjectInfoContext.ps1 +++ b/src/private/shared/GetNovaProjectInfoContext.ps1 @@ -16,4 +16,3 @@ function Get-NovaProjectInfoContext { JsonData = Read-ProjectJsonData -ProjectJsonPath $projectJson } } - diff --git a/src/private/shared/GetNovaProjectPackageOutputDirectorySettingsTable.ps1 b/src/private/shared/GetNovaProjectPackageOutputDirectorySettingsTable.ps1 index ce71357c..2ec0618f 100644 --- a/src/private/shared/GetNovaProjectPackageOutputDirectorySettingsTable.ps1 +++ b/src/private/shared/GetNovaProjectPackageOutputDirectorySettingsTable.ps1 @@ -20,4 +20,3 @@ function Get-NovaProjectPackageOutputDirectorySettingsTable { Path = $outputDirectoryValue } } - diff --git a/src/private/shared/GetNovaProjectPackageSettingsTable.ps1 b/src/private/shared/GetNovaProjectPackageSettingsTable.ps1 index 7a42f39d..03aef579 100644 --- a/src/private/shared/GetNovaProjectPackageSettingsTable.ps1 +++ b/src/private/shared/GetNovaProjectPackageSettingsTable.ps1 @@ -18,4 +18,3 @@ function Get-NovaProjectPackageSettingsTable { return $packageSettings } - diff --git a/src/private/shared/GetNovaResolvedProjectManifestSettings.ps1 b/src/private/shared/GetNovaResolvedProjectManifestSettings.ps1 index 6b2ce54f..c38b1c1e 100644 --- a/src/private/shared/GetNovaResolvedProjectManifestSettings.ps1 +++ b/src/private/shared/GetNovaResolvedProjectManifestSettings.ps1 @@ -5,10 +5,9 @@ function Get-NovaResolvedProjectManifestSettings { [Parameter(Mandatory)][hashtable]$ProjectData ) - if ($ProjectData.ContainsKey('Manifest') -and $ProjectData['Manifest'] -is [hashtable]) { + if ($ProjectData.ContainsKey('Manifest') -and $ProjectData['Manifest'] -is [System.Collections.IDictionary]) { return [ordered]@{} + $ProjectData['Manifest'] } return [ordered]@{} } - diff --git a/src/private/shared/GetNovaResolvedProjectPackageOutputDirectorySettings.ps1 b/src/private/shared/GetNovaResolvedProjectPackageOutputDirectorySettings.ps1 index fbdfada0..8b783dec 100644 --- a/src/private/shared/GetNovaResolvedProjectPackageOutputDirectorySettings.ps1 +++ b/src/private/shared/GetNovaResolvedProjectPackageOutputDirectorySettings.ps1 @@ -16,4 +16,3 @@ function Get-NovaResolvedProjectPackageOutputDirectorySettings { $outputDirectorySettings['Clean'] = [bool]$outputDirectorySettings['Clean'] return $outputDirectorySettings } - diff --git a/src/private/shared/GetNovaResolvedProjectPackageSettings.ps1 b/src/private/shared/GetNovaResolvedProjectPackageSettings.ps1 index 8cf6c23e..9b6552b0 100644 --- a/src/private/shared/GetNovaResolvedProjectPackageSettings.ps1 +++ b/src/private/shared/GetNovaResolvedProjectPackageSettings.ps1 @@ -30,4 +30,3 @@ function Get-NovaResolvedProjectPackageSettings { return $packageSettings } - diff --git a/src/private/shared/GetNovaResolvedProjectPackageTypeList.ps1 b/src/private/shared/GetNovaResolvedProjectPackageTypeList.ps1 index 0fbd9b71..284e4bca 100644 --- a/src/private/shared/GetNovaResolvedProjectPackageTypeList.ps1 +++ b/src/private/shared/GetNovaResolvedProjectPackageTypeList.ps1 @@ -30,4 +30,3 @@ function Get-NovaResolvedProjectPackageTypeList { return $resolvedTypeList } - diff --git a/src/private/shared/GetNovaSettingsDirectoryPath.ps1 b/src/private/shared/GetNovaSettingsDirectoryPath.ps1 index ee1f07e5..d7a5b773 100644 --- a/src/private/shared/GetNovaSettingsDirectoryPath.ps1 +++ b/src/private/shared/GetNovaSettingsDirectoryPath.ps1 @@ -27,4 +27,3 @@ function Get-NovaSettingsRootPath { return Join-Path $HOME '.config' } - diff --git a/src/private/shared/ImportNovaBuiltModuleForCi.ps1 b/src/private/shared/ImportNovaBuiltModuleForCi.ps1 index 4c504e6e..665fe60b 100644 --- a/src/private/shared/ImportNovaBuiltModuleForCi.ps1 +++ b/src/private/shared/ImportNovaBuiltModuleForCi.ps1 @@ -37,4 +37,3 @@ function Import-NovaBuiltModuleForCi { Get-Module -Name $resolvedProjectInfo.ProjectName -All | Remove-Module -Force -ErrorAction SilentlyContinue return Import-Module -Name $moduleManifestPath -Force -Global -PassThru -ErrorAction Stop } - diff --git a/src/private/shared/InvokeNovaBuildValidation.ps1 b/src/private/shared/InvokeNovaBuildValidation.ps1 index 55b66122..cf976dab 100644 --- a/src/private/shared/InvokeNovaBuildValidation.ps1 +++ b/src/private/shared/InvokeNovaBuildValidation.ps1 @@ -14,5 +14,3 @@ function Invoke-NovaBuildValidation { Write-Verbose 'Skipping Test-NovaBuild because SkipTests was requested for this workflow.' } - - diff --git a/src/private/shared/NewNovaDynamicSkipTestsParameterDictionary.ps1 b/src/private/shared/NewNovaDynamicSkipTestsParameterDictionary.ps1 index 6dd968a0..a44d009f 100644 --- a/src/private/shared/NewNovaDynamicSkipTestsParameterDictionary.ps1 +++ b/src/private/shared/NewNovaDynamicSkipTestsParameterDictionary.ps1 @@ -20,4 +20,3 @@ function Get-NovaDynamicDeliveryParameterDictionary { Add-NovaDynamicSwitchParameter -ParameterDictionary $parameterDictionary -Name 'ContinuousIntegration' return $parameterDictionary } - diff --git a/src/private/shared/SetNovaPackageSettingDefault.ps1 b/src/private/shared/SetNovaPackageSettingDefault.ps1 index 3b801bbc..020e702b 100644 --- a/src/private/shared/SetNovaPackageSettingDefault.ps1 +++ b/src/private/shared/SetNovaPackageSettingDefault.ps1 @@ -17,4 +17,3 @@ function Set-NovaPackageSettingDefault { $null = $PackageSettings[$Name] = $Value } } - diff --git a/src/private/shared/Write-ProjectJsonData.ps1 b/src/private/shared/Write-ProjectJsonData.ps1 index bae51fae..4fcab88b 100644 --- a/src/private/shared/Write-ProjectJsonData.ps1 +++ b/src/private/shared/Write-ProjectJsonData.ps1 @@ -8,4 +8,3 @@ function Write-ProjectJsonData { $projectJsonContent = $Data | ConvertTo-Json -Depth 20 Set-Content -LiteralPath $ProjectJsonPath -Value $projectJsonContent -Encoding utf8 } - diff --git a/src/public/DeployNovaPackage.ps1 b/src/public/DeployNovaPackage.ps1 index c3c91719..f81e6771 100644 --- a/src/public/DeployNovaPackage.ps1 +++ b/src/public/DeployNovaPackage.ps1 @@ -25,4 +25,3 @@ function Deploy-NovaPackage { return @(Invoke-NovaPackageUploadWorkflow -WorkflowContext $workflowContext -UploadArtifactList $workflowContext.UploadArtifactList) } } - diff --git a/src/public/InitializeNovaModule.ps1 b/src/public/InitializeNovaModule.ps1 index 23dd24ca..62fe23c2 100644 --- a/src/public/InitializeNovaModule.ps1 +++ b/src/public/InitializeNovaModule.ps1 @@ -13,4 +13,3 @@ function Initialize-NovaModule { Invoke-NovaModuleInitializationWorkflow -WorkflowContext $workflowContext } - diff --git a/src/resources/cli/help/build.psd1 b/src/resources/cli/help/build.psd1 index 7eaef765..7c78395c 100644 --- a/src/resources/cli/help/build.psd1 +++ b/src/resources/cli/help/build.psd1 @@ -49,4 +49,3 @@ } ) } - diff --git a/src/resources/cli/help/bump.psd1 b/src/resources/cli/help/bump.psd1 index b8eead71..45a908fd 100644 --- a/src/resources/cli/help/bump.psd1 +++ b/src/resources/cli/help/bump.psd1 @@ -55,4 +55,3 @@ } ) } - diff --git a/src/resources/cli/help/deploy.psd1 b/src/resources/cli/help/deploy.psd1 index 55c2209e..5422be42 100644 --- a/src/resources/cli/help/deploy.psd1 +++ b/src/resources/cli/help/deploy.psd1 @@ -93,4 +93,3 @@ } ) } - diff --git a/src/resources/cli/help/info.psd1 b/src/resources/cli/help/info.psd1 index f79ebabf..231ef22a 100644 --- a/src/resources/cli/help/info.psd1 +++ b/src/resources/cli/help/info.psd1 @@ -16,4 +16,3 @@ } ) } - diff --git a/src/resources/cli/help/init.psd1 b/src/resources/cli/help/init.psd1 index 0ee6a862..d6408ccd 100644 --- a/src/resources/cli/help/init.psd1 +++ b/src/resources/cli/help/init.psd1 @@ -37,4 +37,3 @@ } ) } - diff --git a/src/resources/cli/help/notification.psd1 b/src/resources/cli/help/notification.psd1 index 115f51a7..485a2445 100644 --- a/src/resources/cli/help/notification.psd1 +++ b/src/resources/cli/help/notification.psd1 @@ -55,4 +55,3 @@ } ) } - diff --git a/src/resources/cli/help/package.psd1 b/src/resources/cli/help/package.psd1 index f6ef8b1f..d3455adc 100644 --- a/src/resources/cli/help/package.psd1 +++ b/src/resources/cli/help/package.psd1 @@ -50,4 +50,3 @@ } ) } - diff --git a/src/resources/cli/help/publish.psd1 b/src/resources/cli/help/publish.psd1 index be0f50e0..ef4454cc 100644 --- a/src/resources/cli/help/publish.psd1 +++ b/src/resources/cli/help/publish.psd1 @@ -84,4 +84,3 @@ } ) } - diff --git a/src/resources/cli/help/release.psd1 b/src/resources/cli/help/release.psd1 index 15485ccc..4f916585 100644 --- a/src/resources/cli/help/release.psd1 +++ b/src/resources/cli/help/release.psd1 @@ -84,4 +84,3 @@ } ) } - diff --git a/src/resources/cli/help/test.psd1 b/src/resources/cli/help/test.psd1 index 392735cb..184dc67f 100644 --- a/src/resources/cli/help/test.psd1 +++ b/src/resources/cli/help/test.psd1 @@ -50,4 +50,3 @@ } ) } - diff --git a/src/resources/cli/help/update.psd1 b/src/resources/cli/help/update.psd1 index 2f21bc41..42c258a8 100644 --- a/src/resources/cli/help/update.psd1 +++ b/src/resources/cli/help/update.psd1 @@ -39,4 +39,3 @@ } ) } - diff --git a/src/resources/cli/help/version.psd1 b/src/resources/cli/help/version.psd1 index 5c04df03..9051edf9 100644 --- a/src/resources/cli/help/version.psd1 +++ b/src/resources/cli/help/version.psd1 @@ -27,4 +27,3 @@ } ) } - diff --git a/tests/CliHelperCoverage.Tests.ps1 b/tests/CliHelperCoverage.Tests.ps1 new file mode 100644 index 00000000..2a380147 --- /dev/null +++ b/tests/CliHelperCoverage.Tests.ps1 @@ -0,0 +1,130 @@ +$script:coverageGapsCliTestSupportPath = (Resolve-Path -LiteralPath (Join-Path $PSScriptRoot 'CoverageGaps.Cli.TestSupport.ps1')).Path +$global:cliHelperCoverageSupportFunctionNameList = @( + 'Assert-TestStructuredCliError' +) +. $script:coverageGapsCliTestSupportPath + +foreach ($functionName in $global:cliHelperCoverageSupportFunctionNameList) { + $scriptBlock = (Get-Command -Name $functionName -CommandType Function -ErrorAction Stop).ScriptBlock + Set-Item -Path "function:global:$functionName" -Value $scriptBlock +} + +BeforeAll { + $here = Split-Path -Parent $PSCommandPath + $script:repoRoot = Split-Path -Parent $here + $script:moduleName = (Get-Content -LiteralPath (Join-Path $script:repoRoot 'project.json') -Raw | ConvertFrom-Json).ProjectName + $script:distModuleDir = Join-Path $script:repoRoot "dist/$script:moduleName" + $coverageGapsCliTestSupportPath = (Resolve-Path -LiteralPath (Join-Path $PSScriptRoot 'CoverageGaps.Cli.TestSupport.ps1')).Path + + if (-not (Test-Path -LiteralPath $script:distModuleDir)) { + throw "Expected built $script:moduleName module at: $script:distModuleDir. Run Invoke-NovaBuild in the repo root first." + } + + . $coverageGapsCliTestSupportPath + foreach ($functionName in $global:cliHelperCoverageSupportFunctionNameList) { + $scriptBlock = (Get-Command -Name $functionName -CommandType Function -ErrorAction Stop).ScriptBlock + Set-Item -Path "function:global:$functionName" -Value $scriptBlock + } + + Remove-Module $script:moduleName -ErrorAction SilentlyContinue + Import-Module $script:distModuleDir -Force +} + +Describe 'Targeted coverage for smaller CLI helper internals' { + It 'CLI help helpers expose the usage text, unsupported usage errors, empty examples, and direct option accumulation' { + InModuleScope $script:moduleName { + Get-NovaCliHelpUsageText | Should -Be "Use 'nova --help', 'nova -h', 'nova --help ', 'nova -h ', or 'nova --help'/'nova -h'." + Get-NovaCliExampleText -Examples @() | Should -Be ' (none)' + + $options = @{} + Add-NovaCliOptionValue -Options $options -Name 'path' -Value '/tmp/one' + Add-NovaCliOptionValue -Options $options -Name 'path' -Value '/tmp/two' + + $options.path | Should -Be @('/tmp/one', '/tmp/two') + + $directHelpUsageError = $null + try { + Assert-NovaCliHelpUsageSupported -Tokens @('--help', 'build') + } + catch { + $directHelpUsageError = $_ + } + + Assert-TestStructuredCliError -ThrownError $directHelpUsageError -ExpectedError ([pscustomobject]@{ + Message = "Unsupported help usage. Use 'nova --help', 'nova -h', 'nova --help ', 'nova -h ', or 'nova --help'/'nova -h'." + ErrorId = 'Nova.Validation.UnsupportedCliHelpUsage' + Category = [System.Management.Automation.ErrorCategory]::InvalidArgument + TargetObject = '--help build' + }) + + $rootHelpUsageError = $null + try { + Get-NovaCliHelpRequest -Command '--help' -Arguments @('--help') + } + catch { + $rootHelpUsageError = $_ + } + + Assert-TestStructuredCliError -ThrownError $rootHelpUsageError -ExpectedError ([pscustomobject]@{ + Message = "Unsupported help usage. Use 'nova --help', 'nova -h', 'nova --help ', 'nova -h ', or 'nova --help'/'nova -h'." + ErrorId = 'Nova.Validation.UnsupportedCliHelpUsage' + Category = [System.Management.Automation.ErrorCategory]::InvalidArgument + TargetObject = '--help --help' + }) + + $subcommandHelpUsageError = $null + try { + Get-NovaCliHelpRequest -Command 'build' -Arguments @('--help', 'extra') + } + catch { + $subcommandHelpUsageError = $_ + } + + Assert-TestStructuredCliError -ThrownError $subcommandHelpUsageError -ExpectedError ([pscustomobject]@{ + Message = "Unsupported help usage. Use 'nova --help', 'nova -h', 'nova --help ', 'nova -h ', or 'nova --help'/'nova -h'." + ErrorId = 'Nova.Validation.UnsupportedCliHelpUsage' + Category = [System.Management.Automation.ErrorCategory]::InvalidArgument + TargetObject = 'build --help extra' + }) + } + } + + It 'Get-NovaCliForwardingParameterSet includes verbose and should-process options directly when requested' { + InModuleScope $script:moduleName { + $previousWhatIfPreference = $WhatIfPreference + try { + $WhatIfPreference = $true + $result = Get-NovaCliForwardingParameterSet -BoundParameters @{Verbose = $true; Confirm = $false} -IncludeShouldProcess + + $result.Verbose | Should -BeTrue + $result.WhatIf | Should -BeTrue + $result.Confirm | Should -BeFalse + } + finally { + $WhatIfPreference = $previousWhatIfPreference + } + } + } + + It 'Get-NovaCliInstalledVersion returns the stable version when prerelease metadata is blank or missing' { + InModuleScope $script:moduleName { + $blankPrereleaseModule = [pscustomobject]@{ + Version = [version]'2.0.0' + PrivateData = [pscustomobject]@{ + PSData = [pscustomobject]@{ + Prerelease = ' ' + } + } + } + $missingPrereleaseModule = [pscustomobject]@{ + Version = [version]'2.0.1' + PrivateData = [pscustomobject]@{ + PSData = [pscustomobject]@{} + } + } + + Get-NovaCliInstalledVersion -Module $blankPrereleaseModule | Should -Be '2.0.0' + Get-NovaCliInstalledVersion -Module $missingPrereleaseModule | Should -Be '2.0.1' + } + } +} diff --git a/tests/CoverageGaps.BuildInternals.Tests.ps1 b/tests/CoverageGaps.BuildInternals.Tests.ps1 index 10f039c6..dd644288 100644 --- a/tests/CoverageGaps.BuildInternals.Tests.ps1 +++ b/tests/CoverageGaps.BuildInternals.Tests.ps1 @@ -515,5 +515,3 @@ function Second { } } } - - diff --git a/tests/CoverageGaps.Cli.TestSupport.ps1 b/tests/CoverageGaps.Cli.TestSupport.ps1 index c443065f..a58c4f0d 100644 --- a/tests/CoverageGaps.Cli.TestSupport.ps1 +++ b/tests/CoverageGaps.Cli.TestSupport.ps1 @@ -124,4 +124,3 @@ function Get-TestNovaCliSyntaxGuidanceCaseList { @{Argument = '-continuousintegration'; Message = "Unsupported CLI option syntax: -continuousintegration. Use '--continuous-integration' or '-i' instead."} ) } - diff --git a/tests/CoverageGaps.ReleaseInternals.Tests.ps1 b/tests/CoverageGaps.ReleaseInternals.Tests.ps1 index fea8fd5d..d1a1aae7 100644 --- a/tests/CoverageGaps.ReleaseInternals.Tests.ps1 +++ b/tests/CoverageGaps.ReleaseInternals.Tests.ps1 @@ -436,6 +436,28 @@ Describe 'Coverage gaps for release and git internals' { } } + It 'Get-NovaInstalledProjectManifestPath resolves the default project info when ProjectInfo is omitted' { + InModuleScope $script:moduleName { + Mock Get-NovaProjectInfo { + [pscustomobject]@{ProjectName = 'AzureDevOpsAgentInstaller'; ProjectRoot = '/tmp/project'} + } + Mock Resolve-NovaLocalPublishPath {'/tmp/default-modules'} + Mock Get-NovaPublishedLocalManifestPath { + $PublishInvocation.IsLocal | Should -BeTrue + $PublishInvocation.Target | Should -Be '/tmp/default-modules' + $PublishInvocation.Parameters.ProjectInfo.ProjectName | Should -Be 'AzureDevOpsAgentInstaller' + return '/tmp/default-modules/AzureDevOpsAgentInstaller/AzureDevOpsAgentInstaller.psd1' + } + + $result = Get-NovaInstalledProjectManifestPath + + $result | Should -Be '/tmp/default-modules/AzureDevOpsAgentInstaller/AzureDevOpsAgentInstaller.psd1' + Assert-MockCalled Get-NovaProjectInfo -Times 1 + Assert-MockCalled Resolve-NovaLocalPublishPath -Times 1 + Assert-MockCalled Get-NovaPublishedLocalManifestPath -Times 1 + } + } + It 'Get-NovaResolvedPublishParameterMap copies publish parameters and lets workflow values override matching keys' { InModuleScope $script:moduleName { $publishInvocation = [pscustomobject]@{ diff --git a/tests/CoverageGaps.Tests.ps1 b/tests/CoverageGaps.Tests.ps1 index f2449154..93da070a 100644 --- a/tests/CoverageGaps.Tests.ps1 +++ b/tests/CoverageGaps.Tests.ps1 @@ -507,6 +507,28 @@ Describe 'Coverage gaps for scaffold internals' { } } + It 'Initialize-NovaModule defaults Path to the current location when Path is omitted' { + InModuleScope $script:moduleName { + Mock Get-Location {[pscustomobject]@{Path = '/tmp/default-scaffold-root'}} + Mock Get-NovaModuleInitializationWorkflowContext { + [pscustomobject]@{ + Target = '/tmp/default-scaffold-root/NovaDelegation' + Action = 'Create Nova module scaffold' + } + } + Mock Invoke-NovaModuleInitializationWorkflow {} + + Initialize-NovaModule -Confirm:$false + + Assert-MockCalled Get-NovaModuleInitializationWorkflowContext -Times 1 -ParameterFilter { + $Path -eq '/tmp/default-scaffold-root' -and -not $Example + } + Assert-MockCalled Invoke-NovaModuleInitializationWorkflow -Times 1 -ParameterFilter { + $WorkflowContext.Target -eq '/tmp/default-scaffold-root/NovaDelegation' + } + } + } + It 'Initialize-NovaModule -Example creates the packaged example scaffold without asking about Pester' { InModuleScope $script:moduleName { $answer = @{ diff --git a/tests/NovaCommandModel.PackageUpload.TestSupport.ps1 b/tests/NovaCommandModel.PackageUpload.TestSupport.ps1 index 4cc44188..42a8234d 100644 --- a/tests/NovaCommandModel.PackageUpload.TestSupport.ps1 +++ b/tests/NovaCommandModel.PackageUpload.TestSupport.ps1 @@ -360,4 +360,3 @@ function Get-TestNovaPackageUploadFailureCases { } ) } - diff --git a/tests/NovaCommandModel.TestSupport.ps1 b/tests/NovaCommandModel.TestSupport.ps1 index 53f7a937..349c5369 100644 --- a/tests/NovaCommandModel.TestSupport.ps1 +++ b/tests/NovaCommandModel.TestSupport.ps1 @@ -16,4 +16,3 @@ function Initialize-NovaCommandModelTestSupport { } . Initialize-NovaCommandModelTestSupport - diff --git a/tests/NovaCommandModel.TestSupport/Assertions.ps1 b/tests/NovaCommandModel.TestSupport/Assertions.ps1 index 529f0fe5..469cc5c5 100644 --- a/tests/NovaCommandModel.TestSupport/Assertions.ps1 +++ b/tests/NovaCommandModel.TestSupport/Assertions.ps1 @@ -356,4 +356,3 @@ function Assert-TestNovaCliPublishConfirmationResult { $Result.Text | Should -Match 'Operation cancelled\.' } - diff --git a/tests/NovaCommandModel.TestSupport/CliProjectSupport.ps1 b/tests/NovaCommandModel.TestSupport/CliProjectSupport.ps1 index 4baa9a69..8052b65e 100644 --- a/tests/NovaCommandModel.TestSupport/CliProjectSupport.ps1 +++ b/tests/NovaCommandModel.TestSupport/CliProjectSupport.ps1 @@ -184,4 +184,3 @@ function Get-TestNovaCliContinuousIntegrationForwardingCaseList { @{CommandName = 'release'; ActionCommand = 'Invoke-NovaRelease'; UsesPublishOption = $true; Arguments = @('--repository', 'PSGallery', '--api-key', 'key123', '--continuous-integration')} ) } - diff --git a/tests/NovaCommandModel.TestSupport/ModuleSupport.ps1 b/tests/NovaCommandModel.TestSupport/ModuleSupport.ps1 index 1bcc7d69..3b2ae4c1 100644 --- a/tests/NovaCommandModel.TestSupport/ModuleSupport.ps1 +++ b/tests/NovaCommandModel.TestSupport/ModuleSupport.ps1 @@ -79,4 +79,3 @@ function Initialize-TestModuleContext { return $context } - diff --git a/tests/NovaCommandModel.TestSupport/PesterSupport.ps1 b/tests/NovaCommandModel.TestSupport/PesterSupport.ps1 index 72189ee4..13c89762 100644 --- a/tests/NovaCommandModel.TestSupport/PesterSupport.ps1 +++ b/tests/NovaCommandModel.TestSupport/PesterSupport.ps1 @@ -29,4 +29,3 @@ function New-TestPesterConfigStub { return [pscustomobject]$config } - diff --git a/tests/NovaCommandModel.TestSupport/TextAndHelp.ps1 b/tests/NovaCommandModel.TestSupport/TextAndHelp.ps1 index aba5ae63..f58f4822 100644 --- a/tests/NovaCommandModel.TestSupport/TextAndHelp.ps1 +++ b/tests/NovaCommandModel.TestSupport/TextAndHelp.ps1 @@ -123,4 +123,3 @@ function Assert-TestPowerShellHelpExcludesCliSyntax { $Text | Should -Not -Match $forbiddenPattern.Pattern -Because "$Subject $( $forbiddenPattern.Reason )" } } - diff --git a/tests/RemainingCommandCoverage.TestSupport.ps1 b/tests/RemainingCommandCoverage.TestSupport.ps1 index 7ea25267..a9a4280a 100644 --- a/tests/RemainingCommandCoverage.TestSupport.ps1 +++ b/tests/RemainingCommandCoverage.TestSupport.ps1 @@ -78,5 +78,3 @@ function Get-TestNovaPesterReportWriter { $global:reportWasWritten = $null -ne $TestResult -and $OutputPath -eq $ExpectedOutputPath }.GetNewClosure() } - - diff --git a/tests/RemainingHelperCoverage.TestSupport.ps1 b/tests/RemainingHelperCoverage.TestSupport.ps1 index 7589eb87..f3a48097 100644 --- a/tests/RemainingHelperCoverage.TestSupport.ps1 +++ b/tests/RemainingHelperCoverage.TestSupport.ps1 @@ -127,4 +127,3 @@ function Get-TestNovaPackageProjectInfo { } } } - diff --git a/tests/RemainingHelperCoverage.Tests.ps1 b/tests/RemainingHelperCoverage.Tests.ps1 index c6ffe80a..96389515 100644 --- a/tests/RemainingHelperCoverage.Tests.ps1 +++ b/tests/RemainingHelperCoverage.Tests.ps1 @@ -207,6 +207,72 @@ Describe 'Coverage for remaining manifest, JSON, and help-locale helpers' { } } + It 'Get-NovaModulePsDataValue returns null for null PSData and reads object properties when present' { + InModuleScope $script:moduleName { + $nullPsDataModule = [pscustomobject]@{ + PrivateData = [pscustomobject]@{PSData = $null} + } + $objectPsDataModule = [pscustomobject]@{ + PrivateData = [pscustomobject]@{ + PSData = [pscustomobject]@{ + Prerelease = 'preview' + } + } + } + + Get-NovaModulePsDataValue -Name 'Prerelease' -Module $nullPsDataModule | Should -BeNullOrEmpty + Get-NovaModulePsDataValue -Name 'Prerelease' -Module $objectPsDataModule | Should -Be 'preview' + Get-NovaModulePsDataValue -Name 'ReleaseNotes' -Module $objectPsDataModule | Should -BeNullOrEmpty + } + } + + It 'Get-NovaResolvedProjectManifestSettings returns a copy for manifest hashtables and an empty ordered table otherwise' { + InModuleScope $script:moduleName { + $projectDataWithManifest = @{ + Manifest = [ordered]@{ + Author = 'Nova Author' + Description = 'Manifest description' + } + } + $resolvedManifest = Get-NovaResolvedProjectManifestSettings -ProjectData $projectDataWithManifest + + $resolvedManifest['Author'] | Should -Be 'Nova Author' + $resolvedManifest['Description'] | Should -Be 'Manifest description' + $resolvedManifest.GetType().Name | Should -Be 'OrderedDictionary' + + $resolvedManifest['Author'] = 'Changed' + $projectDataWithManifest.Manifest.Author | Should -Be 'Nova Author' + + (Get-NovaResolvedProjectManifestSettings -ProjectData @{}).Count | Should -Be 0 + (Get-NovaResolvedProjectManifestSettings -ProjectData @{Manifest = 'invalid'}).Count | Should -Be 0 + } + } + + It 'Get-NovaProjectPackageOutputDirectorySettingsTable returns dictionary copies and wraps scalar paths' { + InModuleScope $script:moduleName { + $dictionarySettings = [ordered]@{ + OutputDirectory = [ordered]@{ + Path = 'artifacts/packages' + Clean = $true + } + } + $resolvedDictionarySettings = Get-NovaProjectPackageOutputDirectorySettingsTable -PackageSettings $dictionarySettings + + $resolvedDictionarySettings.Path | Should -Be 'artifacts/packages' + $resolvedDictionarySettings.Clean | Should -BeTrue + $resolvedDictionarySettings.GetType().Name | Should -Be 'OrderedDictionary' + + $resolvedDictionarySettings['Path'] = 'changed' + $dictionarySettings.OutputDirectory.Path | Should -Be 'artifacts/packages' + + $resolvedStringSettings = Get-NovaProjectPackageOutputDirectorySettingsTable -PackageSettings @{OutputDirectory = 'dist/packages'} + $resolvedStringSettings.Path | Should -Be 'dist/packages' + + $resolvedMissingSettings = Get-NovaProjectPackageOutputDirectorySettingsTable -PackageSettings @{} + $resolvedMissingSettings.Path | Should -BeNullOrEmpty + } + } + It 'Test-ProjectSchema validates the Build schema' { InModuleScope $script:moduleName { Mock Get-ResourceFilePath {