public/Invoke-WpcPreProcess.ps1

function Invoke-WpcPreProcess {
    param(
        $node,
        [System.Collections.IDictionary] $baseVars,
        [string] $repoRoot,
        [string] $sourceDir
    )

    if ($node -is [System.Collections.IDictionary]) {
        $result = [ordered]@{}
        foreach ($key in $node.Keys) {
            $result[$key] = Invoke-WpcPreProcess -node $node[$key] -baseVars $baseVars -repoRoot $repoRoot -sourceDir $sourceDir
        }
        return $result
    }

    if ($node -is [System.Collections.IEnumerable] -and $node -isnot [string]) {
        $result = [System.Collections.Generic.List[object]]::new()
        foreach ($item in $node) {
            $processed = Invoke-WpcPreProcess -node $item -baseVars $baseVars -repoRoot $repoRoot -sourceDir $sourceDir
            $result.Add($processed)
        }
        return $result.ToArray()
    }

    if ($node -is [string]) {
        return Invoke-WpcPreProcessString -str $node -baseVars $baseVars -repoRoot $repoRoot -sourceDir $sourceDir
    }

    return $node
}