Private/Project/ConvertTo-TcProjectObject.ps1

function ConvertTo-TcProjectObject {
    <#
    .SYNOPSIS
    Builds a project in its file format, assigning source roles in order.
    #>

    [CmdletBinding()]
    [OutputType([pscustomobject])]
    param(
        [Parameter(Mandatory)][string]$Name,
        [Parameter(Mandatory)][string]$TargetDomain,
        [Parameter(Mandatory)][string]$TargetDisplayName,
        [Parameter(Mandatory)][string]$TargetState,
        [Parameter(Mandatory)][AllowEmptyCollection()][hashtable[]]$Source,
        [string]$AccessMode = 'Browser',
        [string]$OutputPath = './output',
        [AllowEmptyCollection()][string[]]$Team = @()
    )

    $sources = @()
    for ($i = 0; $i -lt $Source.Count; $i++) {
        $entry = $Source[$i]
        $sources += [pscustomobject][ordered]@{
            role          = "S$($i + 1)"
            displayName   = $entry['DisplayName']
            primaryDomain = ConvertTo-TcDomain -Value $entry['PrimaryDomain']
            tenantId      = $entry['TenantId']
            wave          = if ($entry.ContainsKey('Wave')) { $entry['Wave'] } else { 1 }
        }
    }

    [pscustomobject][ordered]@{
        schemaVersion = $script:TcSchemaVersion
        name          = $Name
        target        = [pscustomobject][ordered]@{
            displayName   = $TargetDisplayName
            primaryDomain = ConvertTo-TcDomain -Value $TargetDomain
            tenantId      = $null
            state         = $TargetState
        }
        sources       = $sources
        access        = [pscustomobject]@{ mode = $AccessMode }
        output        = [pscustomobject]@{ path = $OutputPath }
        team          = @($Team)
    }
}