Private/Get-Payload.ps1

Function Get-Payload {
    Param
    (
        [hashtable]$Metadata,
        [Microsoft.Xrm.Tooling.Connector.CrmServiceClient]$SourceConn,
        [Microsoft.Xrm.Tooling.Connector.CrmServiceClient]$TargetConn
    )

    $sourceComponents = Get-CrmSolutionComponent -Conn $sourceConn -SolutionName $solutionName
    $targetComponents = Get-CrmSolutionComponent -Conn $targetConn -SolutionName $solutionName

    Write-Verbose 'Updating source components against metadata...'
    $updatedSourceComponents = Update-ComponentAgainstMetadata -Component $sourceComponents -Metadata $metadata -SourceConn $sourceConn -TargetConn $targetConn

    if ($updatedSourceComponents -and $targetComponents) {
        $sourceOnlyComponents = Compare-CrmSolutionComponent -ReferenceComponent $updatedSourceComponents -DifferenceComponent $targetComponents
        $targetOnlyComponents = Compare-CrmSolutionComponent -ReferenceComponent $targetComponents -DifferenceComponent $updatedSourceComponents
    }

    if ($sourceOnlyComponents) { 
        $payload = Compare-ComponentsWithTargetOrg -Component $sourceOnlyComponents -Metadata $metadata -SourceConn $SourceConn -TargetConn $targetConn
    } else {
        $payload = Compare-ComponentsWithTargetOrg -Component $updatedSourceComponents -Metadata $metadata -SourceConn $SourceConn -TargetConn $targetConn
    }

    $payload["Remove"] = $targetOnlyComponents
    $payload["Original"] = @{"Source" = $sourceComponents; "Target" = $targetComponents}

    Write-Output $payload
}