Private/New-PstModuleRootContent.ps1
|
function New-PstModuleRootContent { <# .SYNOPSIS Generates PowerShell module root file (.psm1) content based on complexity level. .DESCRIPTION Creates the content for a PowerShell module root file with appropriate structure and features based on the specified complexity level. Basic: Simple dot-sourcing of Public/Private functions Standard: Adds error handling, verbose output, and function export Advanced: Full module with version checks, dependency loading, and cleanup .PARAMETER ModuleName The name of the module. .PARAMETER Complexity The complexity level. Valid values: Basic, Standard, Advanced. .EXAMPLE New-PstModuleRootContent -ModuleName "MyModule" -Complexity "Basic" Generates a basic .psm1 content. .EXAMPLE New-PstModuleRootContent -ModuleName "MyModule" -Complexity "Advanced" Generates a full-featured .psm1 with all advanced patterns. .NOTES Version: 1.0 Author: MyPowerShellTemplates Creation Date: 2024 Purpose/Change: Initial function development for intelligent code generation #> [CmdletBinding()] [OutputType([string])] param ( [Parameter(Mandatory = $true, Position = 0)] [ValidateNotNullOrEmpty()] [string]$ModuleName, [Parameter(Mandatory = $false, Position = 1)] [ValidateSet("Basic", "Standard", "Advanced")] [string]$Complexity = "Standard" ) begin { Write-Debug "Begin '$($MyInvocation.MyCommand.Name)' at '$(Get-Date)'" $sb = [System.Text.StringBuilder]::new() } process { switch ($Complexity) { "Basic" { # Basic: Simple dot-sourcing pattern [void]$sb.AppendLine("#Requires -Version 5.1") [void]$sb.AppendLine("") [void]$sb.AppendLine("# $ModuleName Module") [void]$sb.AppendLine("# Simple module loader") [void]$sb.AppendLine("") [void]$sb.AppendLine("# Dot-source private functions") [void]$sb.AppendLine('$PrivatePath = Join-Path $PSScriptRoot "Private"') [void]$sb.AppendLine('if (Test-Path $PrivatePath) {') [void]$sb.AppendLine(' Get-ChildItem -Path $PrivatePath -Filter "*.ps1" | ForEach-Object {') [void]$sb.AppendLine(' . $_.FullName') [void]$sb.AppendLine(' }') [void]$sb.AppendLine('}') [void]$sb.AppendLine("") [void]$sb.AppendLine("# Dot-source and export public functions") [void]$sb.AppendLine('$PublicPath = Join-Path $PSScriptRoot "Public"') [void]$sb.AppendLine('if (Test-Path $PublicPath) {') [void]$sb.AppendLine(' Get-ChildItem -Path $PublicPath -Filter "*.ps1" | ForEach-Object {') [void]$sb.AppendLine(' . $_.FullName') [void]$sb.AppendLine(' Export-ModuleMember -Function $_.BaseName') [void]$sb.AppendLine(' }') [void]$sb.AppendLine('}') } "Standard" { # Standard: Adds error handling and verbose output [void]$sb.AppendLine("#Requires -Version 5.1") [void]$sb.AppendLine("") [void]$sb.AppendLine("<#") [void]$sb.AppendLine(".SYNOPSIS") [void]$sb.AppendLine(" $ModuleName module root file.") [void]$sb.AppendLine("") [void]$sb.AppendLine(".DESCRIPTION") [void]$sb.AppendLine(" Loads all public and private functions for the $ModuleName module.") [void]$sb.AppendLine(" Private functions are internal helpers, public functions are exported.") [void]$sb.AppendLine("#>") [void]$sb.AppendLine("") [void]$sb.AppendLine('$ErrorActionPreference = "Stop"') [void]$sb.AppendLine("") [void]$sb.AppendLine("# Get paths for function files") [void]$sb.AppendLine('$PublicPath = Join-Path -Path $PSScriptRoot -ChildPath "Public"') [void]$sb.AppendLine('$PrivatePath = Join-Path -Path $PSScriptRoot -ChildPath "Private"') [void]$sb.AppendLine("") [void]$sb.AppendLine("# Collect functions to export") [void]$sb.AppendLine('$FunctionsToExport = @()') [void]$sb.AppendLine("") [void]$sb.AppendLine("# Dot-source private functions") [void]$sb.AppendLine('if (Test-Path -Path $PrivatePath) {') [void]$sb.AppendLine(' $PrivateFiles = Get-ChildItem -Path $PrivatePath -Filter "*.ps1" -Recurse') [void]$sb.AppendLine(' foreach ($file in $PrivateFiles) {') [void]$sb.AppendLine(' try {') [void]$sb.AppendLine(' Write-Verbose "Loading private function: $($file.BaseName)"') [void]$sb.AppendLine(' . $file.FullName') [void]$sb.AppendLine(' }') [void]$sb.AppendLine(' catch {') [void]$sb.AppendLine(' Write-Error "Failed to load private function $($file.BaseName): $_"') [void]$sb.AppendLine(' }') [void]$sb.AppendLine(' }') [void]$sb.AppendLine('}') [void]$sb.AppendLine("") [void]$sb.AppendLine("# Dot-source public functions") [void]$sb.AppendLine('if (Test-Path -Path $PublicPath) {') [void]$sb.AppendLine(' $PublicFiles = Get-ChildItem -Path $PublicPath -Filter "*.ps1" -Recurse') [void]$sb.AppendLine(' foreach ($file in $PublicFiles) {') [void]$sb.AppendLine(' try {') [void]$sb.AppendLine(' Write-Verbose "Loading public function: $($file.BaseName)"') [void]$sb.AppendLine(' . $file.FullName') [void]$sb.AppendLine(' $FunctionsToExport += $file.BaseName') [void]$sb.AppendLine(' }') [void]$sb.AppendLine(' catch {') [void]$sb.AppendLine(' Write-Error "Failed to load public function $($file.BaseName): $_"') [void]$sb.AppendLine(' }') [void]$sb.AppendLine(' }') [void]$sb.AppendLine('}') [void]$sb.AppendLine("") [void]$sb.AppendLine("# Export public functions") [void]$sb.AppendLine('Export-ModuleMember -Function $FunctionsToExport') } "Advanced" { # Advanced: Full module with version checks, dependencies, and cleanup [void]$sb.AppendLine("#Requires -Version 5.1") [void]$sb.AppendLine("") [void]$sb.AppendLine("<#") [void]$sb.AppendLine(".SYNOPSIS") [void]$sb.AppendLine(" $ModuleName module root file.") [void]$sb.AppendLine("") [void]$sb.AppendLine(".DESCRIPTION") [void]$sb.AppendLine(" Advanced module loader for $ModuleName with the following features:") [void]$sb.AppendLine(" - Private and public function loading with error handling") [void]$sb.AppendLine(" - Module-scoped variable initialization") [void]$sb.AppendLine(" - Dependency checking") [void]$sb.AppendLine(" - Module cleanup on removal") [void]$sb.AppendLine(" - Performance logging") [void]$sb.AppendLine("#>") [void]$sb.AppendLine("") [void]$sb.AppendLine('$ErrorActionPreference = "Stop"') [void]$sb.AppendLine("") [void]$sb.AppendLine("#region Module Variables") [void]$sb.AppendLine("") [void]$sb.AppendLine("# Module-scoped variables") [void]$sb.AppendLine("`$script:ModuleName = '$ModuleName'") [void]$sb.AppendLine('$script:ModulePath = $PSScriptRoot') [void]$sb.AppendLine('$script:LoadStartTime = Get-Date') [void]$sb.AppendLine("") [void]$sb.AppendLine("#endregion Module Variables") [void]$sb.AppendLine("") [void]$sb.AppendLine("#region Dependency Checks") [void]$sb.AppendLine("") [void]$sb.AppendLine("# Check for required modules (add your dependencies here)") [void]$sb.AppendLine('$RequiredModules = @(') [void]$sb.AppendLine(" # @{ Name = 'ModuleName'; MinimumVersion = '1.0.0' }") [void]$sb.AppendLine(')') [void]$sb.AppendLine("") [void]$sb.AppendLine('foreach ($module in $RequiredModules) {') [void]$sb.AppendLine(' $params = @{ Name = $module.Name }') [void]$sb.AppendLine(' if ($module.MinimumVersion) {') [void]$sb.AppendLine(' $params.MinimumVersion = $module.MinimumVersion') [void]$sb.AppendLine(' }') [void]$sb.AppendLine(' ') [void]$sb.AppendLine(' if (-not (Get-Module -ListAvailable @params)) {') [void]$sb.AppendLine(' throw "Required module not found: $($module.Name) (MinVersion: $($module.MinimumVersion))"') [void]$sb.AppendLine(' }') [void]$sb.AppendLine('}') [void]$sb.AppendLine("") [void]$sb.AppendLine("#endregion Dependency Checks") [void]$sb.AppendLine("") [void]$sb.AppendLine("#region Function Loading") [void]$sb.AppendLine("") [void]$sb.AppendLine("# Get paths for function files") [void]$sb.AppendLine('$PublicPath = Join-Path -Path $PSScriptRoot -ChildPath "Public"') [void]$sb.AppendLine('$PrivatePath = Join-Path -Path $PSScriptRoot -ChildPath "Private"') [void]$sb.AppendLine('$ResourcesPath = Join-Path -Path $PSScriptRoot -ChildPath "Resources"') [void]$sb.AppendLine("") [void]$sb.AppendLine("# Initialize function tracking") [void]$sb.AppendLine('$script:LoadedFunctions = @{') [void]$sb.AppendLine(' Private = @()') [void]$sb.AppendLine(' Public = @()') [void]$sb.AppendLine('}') [void]$sb.AppendLine("") [void]$sb.AppendLine("# Function to safely load a script file") [void]$sb.AppendLine('function Import-ModuleFunction {') [void]$sb.AppendLine(' [CmdletBinding()]') [void]$sb.AppendLine(' param (') [void]$sb.AppendLine(' [Parameter(Mandatory)]') [void]$sb.AppendLine(' [System.IO.FileInfo]$File,') [void]$sb.AppendLine('') [void]$sb.AppendLine(' [Parameter(Mandatory)]') [void]$sb.AppendLine(' [ValidateSet("Private", "Public")]') [void]$sb.AppendLine(' [string]$Scope') [void]$sb.AppendLine(' )') [void]$sb.AppendLine('') [void]$sb.AppendLine(' try {') [void]$sb.AppendLine(' $startTime = Get-Date') [void]$sb.AppendLine(' . $File.FullName') [void]$sb.AppendLine(' $loadTime = (Get-Date) - $startTime') [void]$sb.AppendLine(' ') [void]$sb.AppendLine(' Write-Verbose "[$Scope] Loaded: $($File.BaseName) ($($loadTime.TotalMilliseconds)ms)"') [void]$sb.AppendLine(' $script:LoadedFunctions[$Scope] += $File.BaseName') [void]$sb.AppendLine(' return $true') [void]$sb.AppendLine(' }') [void]$sb.AppendLine(' catch {') [void]$sb.AppendLine(' Write-Error "Failed to load $Scope function $($File.BaseName): $_"') [void]$sb.AppendLine(' return $false') [void]$sb.AppendLine(' }') [void]$sb.AppendLine('}') [void]$sb.AppendLine("") [void]$sb.AppendLine("# Load private functions") [void]$sb.AppendLine('if (Test-Path -Path $PrivatePath) {') [void]$sb.AppendLine(' Get-ChildItem -Path $PrivatePath -Filter "*.ps1" -Recurse | ForEach-Object {') [void]$sb.AppendLine(' $null = Import-ModuleFunction -File $_ -Scope Private') [void]$sb.AppendLine(' }') [void]$sb.AppendLine('}') [void]$sb.AppendLine("") [void]$sb.AppendLine("# Load public functions") [void]$sb.AppendLine('if (Test-Path -Path $PublicPath) {') [void]$sb.AppendLine(' Get-ChildItem -Path $PublicPath -Filter "*.ps1" -Recurse | ForEach-Object {') [void]$sb.AppendLine(' $null = Import-ModuleFunction -File $_ -Scope Public') [void]$sb.AppendLine(' }') [void]$sb.AppendLine('}') [void]$sb.AppendLine("") [void]$sb.AppendLine("#endregion Function Loading") [void]$sb.AppendLine("") [void]$sb.AppendLine("#region Module Cleanup") [void]$sb.AppendLine("") [void]$sb.AppendLine('$ExecutionContext.SessionState.Module.OnRemove = {') [void]$sb.AppendLine(' # Cleanup tasks when module is removed') [void]$sb.AppendLine(' Write-Verbose "Removing $script:ModuleName module..."') [void]$sb.AppendLine(' ') [void]$sb.AppendLine(' # Add any cleanup code here (close connections, dispose objects, etc.)') [void]$sb.AppendLine(' ') [void]$sb.AppendLine(' Write-Verbose "$script:ModuleName module removed."') [void]$sb.AppendLine('}') [void]$sb.AppendLine("") [void]$sb.AppendLine("#endregion Module Cleanup") [void]$sb.AppendLine("") [void]$sb.AppendLine("#region Export") [void]$sb.AppendLine("") [void]$sb.AppendLine("# Export public functions") [void]$sb.AppendLine('Export-ModuleMember -Function $script:LoadedFunctions.Public') [void]$sb.AppendLine("") [void]$sb.AppendLine("# Log module load time") [void]$sb.AppendLine('$loadDuration = (Get-Date) - $script:LoadStartTime') [void]$sb.AppendLine('Write-Verbose "$script:ModuleName loaded in $($loadDuration.TotalMilliseconds)ms. Functions: $($script:LoadedFunctions.Public.Count) public, $($script:LoadedFunctions.Private.Count) private."') [void]$sb.AppendLine("") [void]$sb.AppendLine("#endregion Export") } } } end { Write-Debug "End '$($MyInvocation.MyCommand.Name)' at '$(Get-Date)'" return $sb.ToString() } } |