AL/Get-ALDependencies.ps1

function Get-ALDependencies {
    Param(
        [Parameter(Mandatory=$false)]
        [string]$SourcePath = (Get-Location),
        [Parameter(Mandatory=$false)]
        [string]$ContainerName = (Get-ContainerFromLaunchJson),
        [Parameter(Mandatory=$false)]
        [switch]$Install
    )

    $RepositoryName = (Get-EnvironmentKeyValue -SourcePath $SourcePath -KeyName 'repo')

    if ($RepositoryName -eq $null) {
        $RepositoryUrl = Get-GitRepoFetchUrl
        if (($RepositoryUrl.EndsWith('-AL')) -or ($RepositoryUrl.EndsWith('-BC'))) {
            $RepositoryName = $RepositoryUrl.Substring($RepositoryUrl.Length - 3)
        }
    }

    Write-Host "Repository Name: $RepositoryName"

    if (!([IO.Directory]::Exists((Join-Path $SourcePath '.alpackages')))) {
        Create-EmptyDirectory (Join-Path $SourcePath '.alpackages')            
    }

    $AppJson = ConvertFrom-Json (Get-Content (Join-Path $SourcePath 'app.json') -Raw)

    Get-ALDependenciesFromAppJson -AppJson $AppJson -SourcePath $SourcePath -RepositoryName $RepositoryName -ContainerName $ContainerName -Install:$Install
}

function Get-ALDependenciesFromAppJson {
    Param(
        [Parameter(Mandatory=$true)]
        $AppJson,
        [Parameter(Mandatory=$false)]
        [string]$SourcePath = (Get-Location),
        [Parameter(Mandatory=$false)]
        [string]$RepositoryName,
        [Parameter(Mandatory=$false)]
        [string]$ContainerName,
        [Parameter(Mandatory=$false)]
        [switch]$Install
    )
    
    if ($RepositoryName -eq '') {
        $RepositoryName = 'BC'
    }

    foreach ($Dependency in $AppJson.dependencies | where Name -NotLike '*Tests*') {
        $IncludeTest = $false
        $EnvDependency = Get-DependencyFromEnvironment -SourcePath $SourcePath -Name $Dependency.name
        if ($EnvDependency -ne $null) {
            if ($EnvDependency.includetest -ne $null){
                $IncludeTest = $EnvDependency.includetest
            }
            $Apps = Get-AppFromLastSuccessfulBuild -ProjectName $EnvDependency.project -RepositoryName $EnvDependency.repo
            $DependencyAppJson = Get-AppJsonForProjectAndRepo -ProjectName $EnvDependency.project -RepositoryName $EnvDependency.repo
        }
        else {
            $Apps = Get-AppFromLastSuccessfulBuild -ProjectName $Dependency.name -RepositoryName $RepositoryName
            $DependencyAppJson = Get-AppJsonForProjectAndRepo -ProjectName $Dependency.name -RepositoryName $RepositoryName
        }
        Get-ALDependenciesFromAppJson -AppJson $DependencyAppJson -SourcePath $SourcePath -RepositoryName $RepositoryName -ContainerName $ContainerName -Install:$Install
                
        
        foreach ($App in $Apps | where Name -NotLike '*Tests*') {  
            Copy-Item $App.FullName (Join-Path (Join-Path $SourcePath '.alpackages') $App.Name)
            if ($Install.IsPresent) {
                try {
                    Publish-NavContainerApp -containerName $ContainerName -appFile $App.FullName -sync -install
                }
                catch {
                    if (!($_.Exception.Message.Contains('already published'))) {
                        throw $_.Exception.Message
                    }
                }
            }
        } 
        
        if($IncludeTest){
            foreach ($App in $Apps | where Name -Like '*Tests*') {  
                Copy-Item $App.FullName (Join-Path (Join-Path $SourcePath '.alpackages') $App.Name)
                if ($Install.IsPresent) {
                    try {
                        Publish-NavContainerApp -containerName $ContainerName -appFile $App.FullName -sync -install
                    }
                    catch {
                        if (!($_.Exception.Message.Contains('already published'))) {
                            throw $_.Exception.Message
                        }
                    }
                }
            }
        }  
    }
}

function Get-AppJsonForProjectAndRepo {
    Param(
        [Parameter(Mandatory=$true)]
        [string]$ProjectName,
        [Parameter(Mandatory=$false)]
        [string]$RepositoryName
    )

    $VSTSProjectName = (Get-VSTSProjects | where name -like ('*{0}' -f $ProjectName)).name
    if (($VSTSProjectName -eq $null) -and ($ProjectName.StartsWith('Clever'))) {
        $VSTSProjectName = (Get-VSTSProjects | where name -like ('*{0}' -f $ProjectName.Substring(7))).name
    }

    if ($RepositoryName -eq '') {
        $RepositoryName = 'BC'
    }

    $AppContent = Invoke-TFSAPI ('{0}{1}/_apis/git/repositories/{2}/items?path=app.json' -f (Get-TFSCollectionURL), $VSTSProjectName, (Get-RepositoryId -ProjectName $VSTSProjectName -RepositoryName $RepositoryName)) -GetContents
    $AppJson = ConvertFrom-Json $AppContent
    $AppJson
}

function Get-DependencyFromEnvironment {
    Param(
        [Parameter(Mandatory=$true)]
        [string]$SourcePath,
        [Parameter(Mandatory=$true)]
        [string]$Name
    )

    Get-EnvironmentKeyValue -SourcePath $SourcePath -KeyName 'dependencies' | where name -eq $Name
}

Export-ModuleMember -Function Get-ALDependencies