Private/Compare-ComponentsWithTargetOrg.ps1

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

    Write-Verbose 'Getting source crm metadata...'
    $metadata = Get-CrmEntityAllMetadata -conn $sourceConn -EntityFilters Attributes | MetadataToHash

    $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-ComponentSortedOnExistence -Component $entities.All -Conn $conn
    [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 

    Write-Verbose "Identifying valid Nonentities..."
    $validNonentitiesGoodIds = $nonentities.All | 
        Where-Object -Filter {($invalidAttributeIds -notcontains $_.ObjectId)} 
    
    $validNonentities = $validNonentitiesGoodIds |
        Where-Object -Filter {(Test-CrmSolutionComponentExists $_.ObjectId $conn)}

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

    $manifest = @{}
    $add = @{}
    $skip = @{}
    
    [SolutionComponent[]]$add["Entities"] = $entities.Valid 
    [SolutionComponent[]]$add["Nonentities"] = $validNonentities
    [SolutionComponent[]]$skip["Entities"] = $entities.Invalid
    [SolutionComponent[]]$skip["Nonentities"] = $invalidNonentities
    
    $manifest["Add"] = $add
    $manifest["Skip"] = $skip
    
    Write-Output $manifest
}