core/private/Set-JaxDiscoveredEntityDefaults.ps1

function Set-JaxDiscoveredEntityDefaults {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [System.Collections.IDictionary] $Entity,
        [hashtable] $Context
    )

    $commonParams = Get-JaxCommonParameters -BoundParameters $PSBoundParameters
    Write-Debug "FUNC: $($MyInvocation.MyCommand.Name) Args: $($PSBoundParameters | ConvertTo-Json -Depth 1 -Compress -WarningAction SilentlyContinue)"

    if ($null -eq $Context -or -not $Context.ContainsKey('DiscoveredEntityIndex')) {
        return $Entity
    }

    $index = $Context['DiscoveredEntityIndex']
    if ($index -isnot [System.Collections.IDictionary]) {
        return $Entity
    }

    $taskName = $null
    if ($Entity.Contains('Tasks') -and $null -ne $Entity['Tasks']) {
        $tasks = @($Entity['Tasks'])
        if ($tasks.Count -gt 0) {
            $taskName = $tasks[0]
        }
    }

    # If no explicit tasks: for script runners we often have Key != Script name (e.g. suite.library keys).
    if ([string]::IsNullOrWhiteSpace($taskName)) {
        if ($Entity.Contains('Script') -and $Entity['Script'] -is [string] -and -not [string]::IsNullOrWhiteSpace($Entity['Script'])) {
            $scriptKey = [string]$Entity['Script']
            $scriptKeyTrimmed = $scriptKey.Trim()
            $hasSeparators = $scriptKeyTrimmed.Contains('/') -or $scriptKeyTrimmed.Contains('\')
            $extension = [IO.Path]::GetExtension($scriptKeyTrimmed)
            if (-not $hasSeparators -and [string]::IsNullOrWhiteSpace($extension)) {
                $taskName = $scriptKeyTrimmed
            }
        }
    }

    if ([string]::IsNullOrWhiteSpace($taskName)) {
        $taskName = Get-JaxRunEntityKey -Entity $Entity @commonParams
    }
    if ([string]::IsNullOrWhiteSpace($taskName)) {
        return $Entity
    }

    $lookupKey = Convert-JaxRunEntityName -Name $taskName @commonParams
    if (-not $index.ContainsKey($lookupKey)) {
        return $Entity
    }

    $discovered = $index[$lookupKey]
    if ($discovered -isnot [System.Collections.IDictionary]) {
        return $Entity
    }

    if ($Entity.Contains('Runner')) {
        $runner = $Entity['Runner']
        if ($runner -eq 'psake' -and [string]::IsNullOrWhiteSpace($Entity['PsakeFile'])) {
            $Entity['PsakeFile'] = $discovered['PsakeFile']
        }
        if (($runner -eq 'pwshscript' -or $runner -eq 'bashscript' -or $runner -eq 'cmdscript') -and
            $Entity.Contains('Script') -and $Entity['Script'] -is [string] -and -not [string]::IsNullOrWhiteSpace($Entity['Script'])) {
            if (Test-JaxDictionaryHasKey -Dictionary $discovered -Key 'Script' @commonParams) {
                $Entity['Script'] = $discovered['Script']
            }
        }
    }

    if ($Entity.Contains('Tasks') -and ($null -eq $Entity['Tasks'] -or @($Entity['Tasks']).Count -eq 0)) {
        if (Test-JaxDictionaryHasKey -Dictionary $discovered -Key 'Tasks' @commonParams) {
            $Entity['Tasks'] = $discovered['Tasks']
        }
    }

    if (-not $Entity.Contains('Aliases') -and (Test-JaxDictionaryHasKey -Dictionary $discovered -Key 'Aliases' @commonParams)) {
        $Entity['Aliases'] = $discovered['Aliases']
    }
    if (-not $Entity.Contains('Definition') -and (Test-JaxDictionaryHasKey -Dictionary $discovered -Key 'Definition' @commonParams)) {
        $Entity['Definition'] = $discovered['Definition']
    }
    if (-not $Entity.Contains('DirectoryType') -and (Test-JaxDictionaryHasKey -Dictionary $discovered -Key 'DirectoryType')) {
        $Entity['DirectoryType'] = $discovered['DirectoryType']
    }

    if (-not $Entity.Contains('SourcePath') -and (Test-JaxDictionaryHasKey -Dictionary $discovered -Key 'SourcePath')) {
        $Entity['SourcePath'] = $discovered['SourcePath']
    }

    if (-not $Entity.Contains('Provenance') -and (Test-JaxDictionaryHasKey -Dictionary $discovered -Key 'Provenance')) {
        $Entity['Provenance'] = $discovered['Provenance']
    }

    return $Entity
}