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 = @{}
    
    [SolutionComponent[]]$entities["All"] = $Component | Where-Object -Property ComponentType -EQ 1
    [SolutionComponent[]]$nonentities["All"] = $Component | Where-Object -Property ComponentType -NE 1

    $entities["Exist"] = Get-ComponentSortedByExistence -Component $entities.All -Conn $TargetConn

    [SolutionComponent[]]$entities["Valid"] = Get-ValidEntityComponent -AllEntityComponent $($entities.All) -ExistingComponent $($entities.Exist.True)  
    [SolutionComponent[]]$entities["Invalid"] = Get-InvalidComponent -AllEntityComponent $($entities.All) -ValidComponent $($entites.Valid)

    [guid[]]$invalidAttributeIds = Get-ComponentAttributeId -Component $($entities.Invalid) -Metadata $metadata.Source 

    Write-Verbose "Identifying valid Nonentities..."
    $validNonentitiesGoodIds = $nonentities.All | 
        Where-Object -Filter {($invalidAttributeIds -notcontains $_.ObjectId)} 
    
    $validNonentities = @()
    foreach ($nonEntity in $validNonentitiesGoodIds){
        $exists = Test-CrmSolutionComponentExists -SolutionComponent $nonEntity -Conn $TargetConn
        if ($exists){
            $validNonentities += $nonEntity
        }
    }

    Write-Verbose "Identifying invalid Nonentities..."
    if($validNonentities){
        $invalidNonentities = Compare-Object $validNonentities $nonentities.All -Property ObjectId.Guid -PassThru |
        Where-Object SideIndicator -eq '=>' 
    } else {
        $invalidNonentities = $nonentities.All
    }

    $manifest = @{}
    $add = @{}
    $skip = @{}
    $all = @{}
    
    [SolutionComponent[]]$all["Entities"] = $entities.All
    [SolutionComponent[]]$all["Nonentities"] = $nonentities.All

    [SolutionComponent[]]$add["Entities"] = $entities.Valid
    [SolutionComponent[]]$add["Nonentities"] = $validNonentities

    [SolutionComponent[]]$skip["Entities"] = $entities.Invalid
    [SolutionComponent[]]$skip["Nonentities"] = $invalidNonentities
    
    $manifest["Add"] = $add
    $manifest["Skip"] = $skip
    $manifest["All"] = $all
    
    Write-Output $manifest
}