Skip to content

Commit dfa87d2

Browse files
🩹 [Patch]: Get unique list of required modules (#67)
## Description - Get unique list of required modules ## Type of change <!-- Use the check-boxes [x] on the options that are relevant. --> - [ ] 📖 [Docs] - [ ] 🪲 [Fix] - [x] 🩹 [Patch] - [ ] ⚠️ [Security fix] - [ ] 🚀 [Feature] - [ ] 🌟 [Breaking change] ## Checklist <!-- Use the check-boxes [x] on the options that are relevant. --> - [x] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas
1 parent 1ed1a6a commit dfa87d2

File tree

2 files changed

+84
-12
lines changed

2 files changed

+84
-12
lines changed

scripts/helpers/Build/Build-PSModuleManifest.ps1

Lines changed: 83 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

tests/src/functions/public/Get-PSModuleTest.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#Requires -Modules Utilities
2-
#Requires -Modules @{ ModuleName = 'PSSemVer'; ModuleVersion = '1.0.0' }
2+
#Requires -Modules @{ ModuleName = 'PSSemVer'; RequiredVersion = '1.0.0' }
33
#Requires -Modules @{ ModuleName = 'DynamicParams'; ModuleVersion = '1.1.8' }
44
#Requires -Modules @{ ModuleName = 'Store'; ModuleVersion = '0.3.1' }
55

0 commit comments

Comments
 (0)