1+
2+ <#
3+ . SYNOPSIS
4+ Gets Module Relationships
5+ . DESCRIPTION
6+ Gets Modules that are related to a given module.
7+
8+ Modules can be related to each other by a few mechanisms:
9+
10+ * A Module Can Include another Module's Name in it's ```.PrivateData.PSData.Tags```
11+ * A Module Can include data for another module it it's ```.PrivataData.```
12+ . EXAMPLE
13+ .> {
14+ $Module = Get-Module PipeScript
15+ [ModuleRelationships()]$Module
16+ }
17+ #>
18+ [ValidateScript ({
19+ $val = $_
20+ if (
21+ ($val.Parent -is [Management.Automation.Language.AttributedExpressionAst ]) -and
22+ ($val.Parent.Attribute.TypeName.Name -in ' RelatedModules' , ' RelatedModule' , ' ModuleRelationships' )
23+ ) {
24+ return $true
25+ }
26+ return $false
27+ })]
28+ [Alias (' RelatedModules' , ' RelatedModule' , ' ModuleRelationships' )]
29+ param (
30+ # A VariableExpression. This variable must contain a module or name of module.
31+ [Parameter (Mandatory , ValueFromPipeline , ParameterSetName = ' VariableExpressionAST' )]
32+ [Management.Automation.Language.VariableExpressionAST ]
33+ $VariableAST
34+ )
35+
36+
37+ process {
38+
39+ [scriptblock ]::Create($ ({
40+
41+ @ (
42+
43+ $MyModuleName , $myModule =
44+ if ($targetModule -is [string ]) {
45+ $targetModule , (Get-Module $targetModule )
46+ } elseif ($targetModule -is [Management.Automation.PSModuleInfo ]) {
47+ $targetModule.Name , $targetModule
48+ } else {
49+ Write-Error " $targetModule must be a [string] or [Management.Automation.PSModuleInfo]"
50+ }
51+
52+
53+ # region Search for Module Relationships
54+ if ($myModule -and $MyModuleName ) {
55+ foreach ($loadedModule in Get-Module ) { # Walk over all modules.
56+ if ( # If the module has PrivateData keyed to this module
57+ $loadedModule.PrivateData .$myModuleName
58+ ) {
59+ # Determine the root of the module with private data.
60+ $relationshipData = $loadedModule.PrivateData .$myModuleName
61+ [PSCustomObject ][Ordered ]@ {
62+ PSTypeName = ' Module.Relationship'
63+ Module = $myModule
64+ RelatedModule = $loadedModule
65+ PrivateData = $loadedModule.PrivateData .$myModuleName
66+ }
67+ }
68+ elseif ($loadedModule.PrivateData.PSData.Tags -contains $myModuleName ) {
69+ [PSCustomObject ][Ordered ]@ {
70+ PSTypeName = ' Module.Relationship'
71+ Module = $myModule
72+ RelatedModule = $loadedModule
73+ PrivateData = @ {}
74+ }
75+ }
76+ }
77+ }
78+ # endregion Search for Module Relationships
79+
80+ )
81+
82+ } -replace ' \$TargetModule' , " $VariableAST " ))
83+
84+ }
0 commit comments