Private/Compare-ComponentsWithTargetOrg.ps1

Function Compare-ComponentsWithTargetOrg {
    Param
    (
        [SolutionComponent[]]$Component,
        [hashtable]$metadata,
        [Microsoft.Xrm.Tooling.Connector.CrmServiceClient]$SourceConn,
        [Microsoft.Xrm.Tooling.Connector.CrmServiceClient]$TargetConn
    )

    $entities = @{}
    $nonentities = @{}
    
    $entities["All"] = $Component | Where-Object -Property ComponentType -EQ 1
    $nonentities["All"] = $Component | Where-Object -Property ComponentType -NE 1

    $entities["Valid"] = Get-ExistingComponent -Component $entities.All -Metadata $Metadata -Conn $TargetConn
    $entities["Invalid"] = Get-InvalidComponent -AllComponent $entities.All -ValidComponent $entities.Valid

    $nonentities["valid"] = Get-ValidNonentities -NonentityComponent $nonentities.All -Metadata $metadata -Conn $TargetConn
    $nonentities["Invalid"] = Get-InvalidComponent -AllComponent $nonentities.All -ValidComponent $nonentities.Valid

    $all     = @{"Entities" = $entities.All;     "Nonentities" = $nonentities.All}    
    $release = @{"Entities" = $entities.Valid;   "Nonentities" = $nonentities.Valid}
    $detain  = @{"Entities" = $entities.Invalid; "Nonentities" = $nonentities.Invalid}

    Write-Output @{"All" = $all; "Release" = $release; "Detain" = $detain;}
}