scripts/Add-OsTemplateRoleParameters.ps1

function Add-OsTemplatemoduleParameters {
    Param(
        [string] $Environment,
        [string] $module,
        [string] $ResourceGroupLocation,
        [object] $JsonParameters,
        [string] $ProjectDirectory = (Get-Location | Select-Object -ExpandProperty Path).ToString()
    )
    
    $DefaultParameters = $JsonParameters.parameters | Get-Member -MemberType NoteProperty | Select-Object -ExpandProperty Name
    $JsonParameters.parameters | Add-Member -MemberType NoteProperty -Name $module -Value (New-Object -TypeName pscustomobject) -Force
    $JsonParameters.parameters.$module | Add-Member -MemberType NoteProperty -Name "value" -Value (New-Object -TypeName pscustomobject) -Force

    $ParametersList = $JsonParameters.parameters | Get-Member -MemberType NoteProperty | Select-Object -ExpandProperty Name

    # Loop through template parameters and add to JSON.
    if (Test-Path -Path "$ProjectDirectory\env\$ResourceGroupLocation\$Environment\modules\$module\") {
        $ModulesFileList = Get-ChildItem "$ProjectDirectory\env\$ResourceGroupLocation\$Environment\modules\$module\" -File *.json | Where-Object { $_.Name -notmatch 'readme|example|metadata' }

        $ModulesFileList | Sort-Object -Property LastWriteTime | ForEach-Object {
            $ModuleParameters = Get-Content $_.FullName -Raw | ConvertFrom-Json
            $ModuleParamList = $ModuleParameters.parameters | Get-Member -MemberType NoteProperty | Select-Object -ExpandProperty Name

            if ($ModuleParamList -contains 'Global') {
                try {
                    $moduleParameters.parameters.Global.value | Get-Member -MemberType NoteProperty -ErrorAction Stop | Select-Object -ExpandProperty Name | ForEach-Object -ErrorAction Stop {
                        if (-not $JsonParameters.parameters.Global.value) {
                            $JsonParameters.parameters.Global | Add-Member -MemberType NoteProperty -Name value -Value $moduleParameters.parameters.Global.value  -ErrorAction Stop -Force
                        }
                        $JsonParameters.parameters.Global.value | Add-Member -MemberType NoteProperty -Name $_ -Value $moduleParameters.parameters.Global.value.$_  -ErrorAction Stop -Force
                    }
                }
                catch {
                    throw "Module file contains a Global parameter block but the values are malformed or null! Remove or fix the Global parameter."
                }
            }

            $ModuleParamList | Where-Object { $DefaultParameters -notcontains $_ } | ForEach-Object {
                $JsonParameters.parameters.$module.value | Add-Member -MemberType NoteProperty -Name $_ -Value $ModuleParameters.parameters.$_.value -Force
                if ($ParametersList -contains $_) {
                    $JsonParameters.parameters.$module.value | Add-Member -MemberType NoteProperty -Name $_ -Value $JsonParameters.parameters.$_.value -Force
                }
            }
        }
    }
    else {
        Write-Verbose "No module settings found for $module in $Environment."
        # if (-not ($moduleDefaultParameters | Select-Object)) {
        # $JsonParameters.parameters = $JsonParameters.parameters | Select-Object -ExcludeProperty $module

        # }
        # Write-Verbose "Removing $module from parameter file since it has no values."
    }

    $JsonParameters.parameters.modules.value | Add-Member -MemberType NoteProperty -Name $module -value 1 -Force
    Write-Verbose "module Added: $module"
}