Private/Utilities/Resolve-HydrationTemplateChildPath.ps1

function Resolve-HydrationTemplateChildPath {
    [CmdletBinding()]
    [OutputType([string])]
    param(
        [Parameter(Mandatory)]
        [string]$RootPath,

        [Parameter(Mandatory)]
        [string]$ChildPath,

        [Parameter()]
        [string]$PathLabel = 'Template child path'
    )

    $resolvedRoot = (Resolve-Path -LiteralPath $RootPath -ErrorAction Stop).Path
    $candidatePath = Join-Path -Path $resolvedRoot -ChildPath $ChildPath
    $resolvedChildPath = (Resolve-Path -LiteralPath $candidatePath -ErrorAction Stop).Path
    $rootPrefix = $resolvedRoot.TrimEnd([System.IO.Path]::DirectorySeparatorChar, [System.IO.Path]::AltDirectorySeparatorChar) + [System.IO.Path]::DirectorySeparatorChar
    $pathComparison = if ($IsWindows) { [System.StringComparison]::OrdinalIgnoreCase } else { [System.StringComparison]::Ordinal }

    if ($resolvedChildPath -ne $resolvedRoot -and -not $resolvedChildPath.StartsWith($rootPrefix, $pathComparison)) {
        throw "$PathLabel '$ChildPath' resolves outside template root '$RootPath'."
    }

    return $resolvedChildPath
}