@@ -192,11 +192,10 @@ function Build-PSModuleManifest {
192192 $hashtable = ' @\{[^}]*\}'
193193 if ($_ -match $hashtable ) {
194194 Write-Verbose " - [#Requires -Modules] - [$_ ] - Hashtable"
195- $capturedModules.Add ([PSCustomObject ](ConvertTo-Hashtable - InputString $_ ))
196195 } else {
197196 Write-Verbose " - [#Requires -Modules] - [$_ ] - String"
198- $capturedModules.Add ($_ )
199197 }
198+ $capturedModules.Add ($_ )
200199 }
201200 }
202201 # PowerShellVersion -> REQUIRES -Version <N>[.<n>], $null if not provided
@@ -213,21 +212,94 @@ function Build-PSModuleManifest {
213212 }
214213 }
215214
215+ <#
216+ $test = [Microsoft.PowerShell.Commands.ModuleSpecification]::new()
217+ [Microsoft.PowerShell.Commands.ModuleSpecification]::TryParse("@{ModuleName = 'Az'; RequiredVersion = '5.0.0' }", [ref]$test)
218+ $test
219+
220+ $test.ToString()
221+
222+ $required = [Microsoft.PowerShell.Commands.ModuleSpecification]::new(@{ModuleName = 'Az'; RequiredVersion = '5.0.0' })
223+ $required.ToString()
224+ #>
225+
216226 Write-Verbose ' [RequiredModules] - Gathered'
217- $capturedModules | ForEach-Object { Write-Verbose " - [$_ ]" }
218- $capturedModules | Sort-Object - Unique
219- $requiredModules = @ ()
220- $capturedModules | ForEach-Object {
221- if ($_ -is [string ]) {
222- $requiredModules += $_
227+ # Group the module specifications by ModuleName
228+ $capturedModules = $capturedModules | ForEach-Object {
229+ $test = [Microsoft.PowerShell.Commands.ModuleSpecification ]::new()
230+ if ([Microsoft.PowerShell.Commands.ModuleSpecification ]::TryParse($_ , [ref ]$test )) {
231+ $test
232+ } else {
233+ [Microsoft.PowerShell.Commands.ModuleSpecification ]::new($_ )
234+ }
235+ }
236+
237+ $groupedModules = $capturedModules | Group-Object - Property Name
238+
239+ # Initialize a list to store unique module specifications
240+ $uniqueModules = [System.Collections.Generic.List [System.Object ]]::new()
241+
242+ # Iterate through each group
243+ foreach ($group in $groupedModules ) {
244+ $requiredModuleName = $group.Name
245+ Write-Verbose " Processing required module [$requiredModuleName ]"
246+ $requiredVersion = $group.Group.RequiredVersion | ForEach-Object { [Version ]$_ } | Sort-Object - Unique
247+ $minimumVersion = $group.Group.Version | ForEach-Object { [Version ]$_ } | Sort-Object - Unique | Select-Object - Last 1
248+ $maximumVersion = $group.Group.MaximumVersion | ForEach-Object { [Version ]$_ } | Sort-Object - Unique | Select-Object - First 1
249+ Write-Verbose " RequiredVersion: [$ ( $requiredVersion -join ' , ' ) ]"
250+ Write-Verbose " ModuleVersion: [$minimumVersion ]"
251+ Write-Verbose " MaximumVersion: [$maximumVersion ]"
252+
253+ if ($requiredVersion.Count -gt 1 ) {
254+ throw ' Multiple RequiredVersions specified.'
255+ }
256+
257+ if (-not $minimumVersion ) {
258+ $minimumVersion = [Version ]' 0.0.0'
259+ }
260+
261+ if (-not $maximumVersion ) {
262+ $maximumVersion = [Version ]' 9999.9999.9999'
263+ }
264+
265+ if ($requiredVersion -and ($minimumVersion -gt $requiredVersion )) {
266+ throw ' ModuleVersion is higher than RequiredVersion.'
267+ }
268+
269+ if ($minimumVersion -gt $maximumVersion ) {
270+ throw ' ModuleVersion is higher than MaximumVersion.'
271+ }
272+ if ($requiredVersion -and ($requiredVersion -gt $maximumVersion )) {
273+ throw ' RequiredVersion is higher than MaximumVersion.'
274+ }
275+
276+ if ($requiredVersion ) {
277+ Write-Verbose ' [RequiredModules] - RequiredVersion'
278+ $uniqueModule = @ {
279+ ModuleName = $requiredModuleName
280+ RequiredVersion = $requiredVersion
281+ }
282+ } elseif (($minimumVersion -ne [Version ]' 0.0.0' ) -or ($maximumVersion -ne [Version ]' 9999.9999.9999' )) {
283+ Write-Verbose ' [RequiredModules] - ModuleVersion/MaximumVersion'
284+ $uniqueModule = @ {
285+ ModuleName = $requiredModuleName
286+ }
287+ if ($minimumVersion -ne [Version ]' 0.0.0' ) {
288+ $uniqueModule [' ModuleVersion' ] = $minimumVersion
289+ }
290+ if ($maximumVersion -ne [Version ]' 9999.9999.9999' ) {
291+ $uniqueModule [' MaximumVersion' ] = $maximumVersion
292+ }
223293 } else {
224- $requiredModules += ($_ | ConvertTo-Json - Depth 5 | ConvertFrom-Json - AsHashtable)
294+ Write-Verbose ' [RequiredModules] - Simple string'
295+ $uniqueModule = $requiredModuleName
225296 }
297+ $uniqueModules.Add ([Microsoft.PowerShell.Commands.ModuleSpecification ]::new($uniqueModule ))
226298 }
227299
228300 Write-Verbose ' [RequiredModules] - Result'
229- $manifest.RequiredModules = $requiredModules
230- $manifest.RequiredModules | ForEach-Object { Write-Verbose " [RequiredModules] - [$_ ]" }
301+ $manifest.RequiredModules = $uniqueModules
302+ $manifest.RequiredModules | ForEach-Object { Write-Verbose " - [$ ( $_ | Out-String ) ]" }
231303
232304 Write-Verbose ' [PowerShellVersion]'
233305 $capturedVersions = $capturedVersions | Sort-Object - Unique - Descending
0 commit comments