Module/Script/Add-ModuleManifestExport.ps1

<#
.SYNOPSIS
Helps to build a ModuleManifest argument hashtable based from the details of the files
 
.DESCRIPTION
 
 
.PARAMETER File
Array of files. Typically a result from Get-ChildItem
 
.EXAMPLE
 
#>

function Add-ModuleManifestExport {
    [CmdletBinding()]
    param (
        [Parameter()][ValidateSet('PublicOnlyIfIndicated', 'PublicByDefault')][string]$ExportMode,
        [Parameter(Mandatory)][hashtable]$ModuleManifestArgs,
        [Parameter(Mandatory, ValueFromPipeline)][System.IO.FileInfo[]]$File,
        [Parameter()][switch]$PassThru
    )

    begin {
        Set-StrictMode -Version Latest
        $ErrorActionPreference = "Stop"
    }

    process {
        foreach ($_file in $File) {
            $nature = Get-ScriptNature -File $_file

            $export = if (-not $nature.PSObject.Properties['AccessibilityIndicator']) {
                $false
            } elseif ($nature.AccessibilityIndicator -eq 'public') {
                $true
            } elseif ($nature.AccessibilityIndicator -eq 'private') {
                $false
            } else {
                $ExportMode -eq 'PublicByDefault'
            }

            if ($nature.ScriptType -eq 'function') {
                if ($export) {
                    Write-Verbose "marking $($nature.filenameFunctionName) for export"
                    if (-not $ModuleManifestArgs.Contains('FunctionsToExport')) {
                        $ModuleManifestArgs.Add('FunctionsToExport', @())
                    }
                    $ModuleManifestArgs.FunctionsToExport += $nature.filenameFunctionName
                } else {
                    Write-Verbose "not exporting $($nature.filenameFunctionName)"
                }

                if ($PassThru) { Write-Output $_file }
            }
        }
    }
    end {
        # Write-Output ([scriptblock]::Create($sb.ToString()))
    }
}