Private/Common/Merge-NAVGitHashtable.ps1

function Merge-NAVGitHashtable {
    <#
    .SYNOPSIS
        Deep merges two hashtables. Values in Override win; nested hashtables are merged, arrays are replaced.
    #>

    [CmdletBinding()]
    [OutputType([hashtable])]
    param(
        [Parameter(Mandatory)]
        [hashtable] $Base,

        [Parameter(Mandatory)]
        [AllowEmptyCollection()]
        [hashtable] $Override
    )

    $result = @{}
    foreach ($key in $Base.Keys) {
        $result[$key] = $Base[$key]
    }

    foreach ($key in $Override.Keys) {
        if ($result.ContainsKey($key) -and $result[$key] -is [hashtable] -and $Override[$key] -is [hashtable]) {
            $result[$key] = Merge-NAVGitHashtable -Base $result[$key] -Override $Override[$key]
        }
        else {
            $result[$key] = $Override[$key]
        }
    }

    return $result
}