Private/Resolve-PlumberReleaseConfig.ps1

function Resolve-PlumberReleaseConfig {
    <#
        .SYNOPSIS
        Resolves release task configuration.
    #>

    [CmdletBinding()]
    param(
        [hashtable]
        $Config = @{},

        [string]
        $BuildRoot
    )

    if (-not $BuildRoot) {
        $BuildRoot = Get-Location
    }

    $moduleRoot = if ($Config.ModuleRoot) {
        $Config.ModuleRoot
    } else {
        $BuildRoot
    }

    $manifestPath = if ($Config.ModuleManifest) {
        if ([System.IO.Path]::IsPathRooted($Config.ModuleManifest)) {
            $Config.ModuleManifest
        } else {
            Join-Path $moduleRoot $Config.ModuleManifest
        }
    } else {
        Get-ChildItem -Path $moduleRoot -Filter '*.psd1' -File -ErrorAction SilentlyContinue |
            Select-Object -First 1 -ExpandProperty FullName
    }

    if (-not $manifestPath -or -not (Test-Path $manifestPath)) {
        throw "Could not find module manifest for release tasks under '$moduleRoot'."
    }

    $manifest = Get-Item $manifestPath
    $moduleName = if ($Config.ModuleName) {
        $Config.ModuleName
    } else {
        $manifest.BaseName
    }

    $defaultItems = @(
        'Private',
        'Public',
        'Resource',
        'Tasks',
        'docs',
        'LICENSE',
        'README.md',
        'CHANGELOG.md',
        "$moduleName.psd1",
        "$moduleName.psm1"
    )

    $buildItems = $defaultItems + @($Config.ModuleBuildIncludeItems)
    $buildItems = @($buildItems | Where-Object { -not [string]::IsNullOrWhiteSpace($_) })

    $excludeItems = @($Config.ModuleBuildExcludeItems |
        Where-Object { -not [string]::IsNullOrWhiteSpace($_) })
    if ($excludeItems) {
        $buildItems = @($buildItems | Where-Object {
            $item = $_
            -not ($excludeItems | Where-Object { $item -like $_ })
        })
    }

    $releaseTargets = if ($Config.ReleaseTargets) {
        @($Config.ReleaseTargets)
    } else {
        @('PSGallery', 'GitHub')
    }
    $releaseTargets = @($releaseTargets | Where-Object { -not [string]::IsNullOrWhiteSpace($_) })
    $supportedTargets = @('PSGallery', 'GitHub')
    foreach ($target in $releaseTargets) {
        if ($target -notin $supportedTargets) {
            throw "Unsupported release target '$target'. Supported targets: $($supportedTargets -join ', ')."
        }
    }

    [pscustomobject]@{
        ModuleRoot       = $moduleRoot
        ModuleManifest   = $manifest.FullName
        ModuleName       = $moduleName
        ModuleOutputRoot = if ($Config.ModuleOutputRoot) {
            $Config.ModuleOutputRoot
        } else {
            Join-Path ([System.IO.Path]::GetTempPath()) $moduleName
        }
        ModuleBuildItems = $buildItems
        ReleaseTargets   = $releaseTargets
        GitRemote        = if ($Config.GitRemote) { $Config.GitRemote } else { 'origin' }
    }
}