functions/Get-PsLaTaskByPath.ps1


<#
    .SYNOPSIS
        Get tasks based on files from a directory
         
    .DESCRIPTION
        Get tasks from individual files, that are located in a directory
         
    .PARAMETER Path
        Path to the directory where there are valid PSake tasks saved as ps1 files
         
    .EXAMPLE
        PS C:\> Get-PsLaTaskByPath -Path c:\temp\tasks
         
        List all available tasks, based on the files in the directory
        All files has to be valid PSake files saved as ps1 files
         
        Output example:
         
        Category : Arm
        Name : Set-Arm.Connections.ManagedApis.AsParameter
        Description : Loops all $connections childs
        -Creates an Arm parameter, with prefix & suffix
        --Sets the default value to the original name, extracted from connectionId property
        -Sets the connectionId to: [resourceId('Microsoft.Web/connections', parameters('XYZ'))]
        -Sets the connectionName to: [parameters('XYZ')]
        Path : c:\temp\tasks\Set-Arm.Connections.ManagedApis.AsParameter.task.ps1
        File : Set-Arm.Connections.ManagedApis.AsParameter.task.ps1
         
        Category : Arm
        Name : Set-Arm.Connections.ManagedApis.AsVariable
        Description : Loops all $connections childs
        -Creates an Arm variable, with prefix & suffix
        --Sets the value to the original name, extracted from connectionId property
        -Sets the connectionId to: [resourceId('Microsoft.Web/connections', variables('XYZ'))]
        -Sets the connectionName to: [variables('XYZ')]
        Path : c:\temp\tasks\Set-Arm.Connections.ManagedApis.AsVariable.task.ps1
        File : Set-Arm.Connections.ManagedApis.AsVariable.task.ps1
         
    .NOTES
        General notes
#>

function Get-PsLaTaskByPath {
    [CmdletBinding()]
    param (
        [parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [PsfValidateScript('PSFramework.Validate.FSPath.Folder', ErrorString = 'PSFramework.Validate.FSPath.Folder')]
        [string] $Path
    )
    
    process {
        $files = Get-ChildItem -Path "$Path\*.ps1"

        $res = New-Object System.Collections.Generic.List[System.Object]

        # We are playing around with the internal / global psake object
        $psake.context = New-Object System.Collections.Stack
        $psake.context.push(
            @{
                "tasks"   = @{}
                "aliases" = @{}
            }
        )

        foreach ($item in $files) {
            # We are playing around with the internal / global psake object
            $psake.context = New-Object System.Collections.Stack
            $psake.context.push(
                @{
                    "tasks"   = @{}
                    "aliases" = @{}
                }
            )
        
            . $item.FullName

            foreach ($task in $psake.context.tasks) {
                foreach ($value in $task.Values) {
                    $res.Add([PsCustomObject][ordered]@{
                            Category    = $value.Alias.Split(".")[0]
                            Name        = $value.Name
                            Description = $value.Description
                            Path        = $item.FullName
                            File        = $item.Name
                        })
                }
            }
        }

        # We are playing around with the internal / global psake object
        $psake.context = New-Object System.Collections.Stack

        $res.ToArray() | Where-Object Name -ne "Default" | Sort-Object Category, Name
    }
}