Skip to content

Commit 865b539

Browse files
author
James Brundage
committed
Adding ModuleRelationship Transpiler (#105)
1 parent e9e62ec commit 865b539

File tree

1 file changed

+84
-0
lines changed

1 file changed

+84
-0
lines changed
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
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

Comments
 (0)