scripts/Normalize-Template.ps1

function Normalize-Template {
    [CmdletBinding()]
    param (
      [Parameter(Position = 0, Mandatory = $false)]
      [hashtable]$item,

      [Parameter(Position = 1, Mandatory = $false)]
      [hashtable]$config = @{},

      [Parameter(Position = 2, Mandatory = $false)]
      [int]$depth = 0
    )    
    process {
        $ErrorActionPreference = "Stop"

        if ($depth -gt ${pwshake-context}.max_depth) {
            throw "Circular reference detected for templates in:`n$(ConvertFrom-Yaml $item)"
        }

        if (-not $item) { return $null }

        $step = Normalize-Step $config.templates[$item.template] $config
        $step.parameters = Merge-Hashtables $step.parameters $item.parameters
        $parameters = $step.parameters.Clone()
        foreach ($param in $parameters.Keys) {
            $step = ($step | ConvertTo-Yaml).Replace("[[$param]]", $parameters[$param]) | ConvertFrom-Yaml
        }

        if ($step.template) {
            $step = Normalize-Template $step $config ($depth + 1)
        }

        return $step
    }
}