public/New-ModuleV1.ps1

 #Modules
function New-ModuleV1 {
<#
.Synopsis
   Created a Powershell module with BiT21 format.
#>

    [CmdletBinding()]
    [Alias("New-Module")] # Set default V2 on release v3.0
    [OutputType([System.IO.FileInfo])]
    Param
    (
        # Param1 help description
        [Parameter(Mandatory)][string]$Name,
        [Parameter(Mandatory)][string]$Description,
        [Parameter()][string]$Path,
        [Parameter()][switch]$AvoidModuleFile,
        [Parameter()][switch]$AvoidTestFile,
        [Parameter()][String]$AppendToModuleFile
    )    

    $AUTHOR = 'rulasg'
    $ModuleName = $Name

    if (!$Path) {
        $Path = '.'
    }

    $modulePath = Join-Path -Path $Path -ChildPath $Name

    if(Test-Path($modulePath)){
        throw "Folder already exists"
    } else {
       $null = New-Item -ItemType Directory -Name $modulePath
    }

    # Manifest
    $filename = "$ModuleName.psd1"
    
    New-ModuleManifest `
        -Path (Join-Path -Path $modulePath -ChildPath $filename) `
        -RootModule "$ModuleName.psm1" `
        -Author        $AUTHOR `
        -ModuleVersion '0.1' `
        -Description   $Description `
        #-CompanyName "rulasg" `
        #-Copyright "(c) 2021 rulasg. All rights reserved." `
        # -RequiredModules 'BaseSDK' `
        # -DefaultCommandPrefix $ModuleName

    # Module File
    if (-Not $AvoidModuleFile)
    {
        NewModulefile -Path $modulePath -ModuleName $ModuleName -Author $AUTHOR -Description $Description -Append $AppendToModuleFile
    }    

    # Testing module
    if (-Not $AvoidTestFile)
    {
        New-TestingModule -Path $modulePath -ModuleName $ModuleName
        New-TestingVsCodeLaunchJson -Path $modulePath -ModuleName $ModuleName
    }

    return $modulePath
} Export-ModuleMember -Function New-ModuleV1 -Alias New-ModuleV1

function NewModulefile($Path, $ModuleName, $Author, $Description, $Append){
    $myString = 
@'
<#
.Synopsis
_XMODULE_

.Description
_DESCRIPTION_

.Notes
NAME : _XMODULE_.psm1*
AUTHOR: _AUTHOR_

CREATED: _CREATED_TIME_
#>

Write-Host "Loading _XMODULE_ ..." -ForegroundColor DarkCyan
'@

    $myString = $myString.Replace('_XMODULE_',$ModuleName)
    $myString = $myString.Replace('_DESCRIPTION_',$Description)
    $myString = $myString.Replace('_AUTHOR_',$AUTHOR)
    $myString = $myString.Replace('_CREATED_TIME_',(Get-Date).ToShortDateString());

    if ($Append) {
        $myString+=$Append
    }

    $myString |  Out-File -FilePath (Join-Path -Path $Path -ChildPath "$ModuleName.psm1")
} 

function New-TestingModule($Path, $ModuleName){

    $testingModuleName = $ModuleName + "Test"

    $testScript = 
@'
[CmdletBinding()]
param ()

$ModuleName = "_XMODULE_"

Import-Module -Name TestingHelper -Force

Test-Module -Name $ModuleName
'@


    $testingModulePs1 = "$TestingModuleName.ps1"
    
    $testScript = $testScript.Replace('_XMODULE_',$ModuleName)
    $testScript = $testScript.Replace('_CREATED_TIME_',(Get-Date).ToShortDateString());
    
    $testScript |  Out-File -FilePath (Join-Path -Path $Path -ChildPath $testingModulePs1)

    $toAppend =
@'


function _MODULE_TESTING__Sample(){
    Assert-IsTrue -Condition $true
}

Export-ModuleMember -Function _MODULE_TESTING__*
'@


    $toAppend = $toAppend.Replace('_MODULE_TESTING_',$testingModuleName)

    $null = New-Module -Path $Path -Name $testingModuleName -Description "Testing module for $ModuleName" -AvoidTestFile -AppendToModuleFile $toAppend
} Export-ModuleMember -Function New-TestingModule

function New-TestingVsCodeLaunchJson($Path, $ModuleName){
    $testScript = 
@'
    {
        // Use IntelliSense to learn about possible attributes.
        // Hover to view descriptions of existing attributes.
        // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
        "version": "0.2.0",
        "configurations": [
            {
                "name": "PowerShell: _XMODULE_.ps1",
                "type": "PowerShell",
                "request": "launch",
                "script": "${workspaceFolder}/_XMODULE_Test.ps1",
                "cwd": "${workspaceFolder}"
            }
        ]
    }
'@


    $testScript = $testScript.Replace('_XMODULE_',$ModuleName)

    New-Item `
        -ItemType File `
        -Path (Join-Path -Path $Path -ChildPath '.vscode' -AdditionalChildPath 'launch.json') `
        -Value $testScript `
        -Force `
        | Out-Null
} Export-ModuleMember -Function New-TestingVsCodeLaunchJson