Includes/PwSh.Fw.Build.Electron.psm1

<#
.SYNOPSIS
Module to give a hand with Eletron building process
 
.DESCRIPTION
 
.NOTES
Electron build reference
https://www.electron.build/
https://docs.npmjs.com/cli/v11/configuring-npm/package-json
#>


function ConvertTo-ElectronPackageJson {
    [CmdletBinding()][OutputType([hashtable])]Param (
        [Parameter(Mandatory = $true, ValueFromPipeLine = $true)][object]$Metadata
    )
    Begin {
        Write-EnterFunction
    }

    Process {
        $PackageJson = @{}
        if ($Metadata) {
            if ($Metadata.Architecture) { $PackageJson.arch = $Metadata.Architecture }
            if ($Metadata.Arch) { $PackageJson.arch = $Metadata.Arch }
            # translate Arch to correct values @see @url https://docs.microsoft.com/fr-fr/powershell/scripting/developer/module/how-to-write-a-powershell-module-manifest
            switch ($PackageJson.arch) {
                'all' { $PackageJson.arch = 'universal' }
                'none' { $PackageJson.arch = 'universal' }
                'x64' { $PackageJson.arch = 'x64' }
                'arm32' { $PackageJson.arch = 'armv7l' }
                'armvl7' { $PackageJson.arch = 'armv7l' }
                'arm64' { $PackageJson.arch = 'arm64' }
                default { $PackageJson.arch = 'universal' }
            }
            if ($Metadata.name) { $PackageJson.name = $Metadata.name }
            if ($Metadata.Version) { $PackageJson.moduleVersion = $Metadata.Version }
            if ($Metadata.Description) { $PackageJson.description = $Metadata.Description }
            if ($Metadata.Author) { $PackageJson.author = $Metadata.Author }
            if ($Metadata.owner) { $PackageJson.author = $Metadata.owner }
            if ($Metadata.CompanyName) { $PackageJson.companyName = $Metadata.CompanyName }
            if ($Metadata.Copyright) { $PackageJson.copyright = $Metadata.Copyright }
            if ($Metadata.extraMetadata) { $PackageJson.extraMetadata = $Metadata.extraMetadata }
            if ($Metadata.Tags) { $PackageJson.tags = $Metadata.Tags }
            if ($Metadata.ProjectUri) { $PackageJson.homepage = $Metadata.ProjectUri }
            if ($Metadata.ProjectUrl) { $PackageJson.homepage = $Metadata.ProjectUrl }
            if ($Metadata.License) { $PackageJson.license = $Metadata.License }
            # if ($Metadata.PackageIcon) { $PackageJson.packageIcon = $Metadata.PackageIcon }
            if ($Metadata.ReleaseNotes) { $PackageJson.releaseNotes = $Metadata.ReleaseNotes }
            # if we are in a prerelease :
            # - add '-preview' to name to differentiate 'preview' branches and 'release' branches
            # - concat Version and Build to get a 4-dotted version number for NSIS
            if ($Metadata.Prerelease) {
                # already done at the Get-Project level
                # $PackageJson.package = "$($PackageJson.package)-preview"
                # $PackageJson.displayName = "$($PackageJson.displayName) (preview)"
                $PackageJson.version = "$($Metadata.Version)-alpha"
            }
        }

        return $PackageJson
    }

    End {
        Write-LeaveFunction
    }
}

function Out-ElectronPackageJson {
    [CmdletBinding()][OutputType([String])]Param (
        [Parameter(Mandatory = $true, ValueFromPipeLine = $true)][object]$Metadata,
        [Parameter(Mandatory = $false, ValueFromPipeLine = $false)][string]$Destination,
        [switch]$PassThru
    )
    Begin {
        Write-EnterFunction
        if ($Destination) {
            if (!(dirExist($Destination))) { $null = New-Item $Destination -Force -ItemType Directory}
        }
    }

    Process {
        $PackageJson = Get-Content -Raw -Path $Destination/package.json | ConvertFrom-Json |ConvertTo-Hashtable
        $MetadataJson = ConvertTo-ElectronPackageJson -Metadata $Metadata

        if ($Destination) {
            Remove-Item $Destination/package.json -Force
            Merge-Hashtables $PackageJson $MetadataJson | ConvertTo-Json -Depth 16 | Out-File -Path "$Destination/package.json" -Encoding utf8 -NoNewline
        }

        if ($PassThru) {
            return $MetadataJson
        } else {
            return (Resolve-Path -Path "$Destination/package.json").Path
        }
    }

    End {
        Write-LeaveFunction
    }
}

function New-ElectronBuild {
    [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'Low', DefaultParameterSetName = 'PROJECT')]
    [OutputType([Boolean], [String])]
    Param (
        # The project object as returned by Get-Project
        [Parameter(Mandatory = $true, ValueFromPipeLine = $true)][hashtable]$Project,

        # The source folder of your project. Files and directory structure will be kept as-is
        [Parameter(Mandatory = $false, ValueFromPipeLine = $false)][string]$Source = "./src",

        # Destination folder to create resulting package
        [Parameter(Mandatory = $false, ValueFromPipeLine = $false)][string]$Destination = "./releases",

        # # Override output package filename.
        # # It defaults to projectName-Version-Arch.deb
        # [Parameter(Mandatory = $false, ValueFromPipeLine = $false)][string]$OutputFileName,

        # Force/override/overwrite things
        [switch]$Force
    )
    Begin {
        Write-EnterFunction
        if (!(Test-DirExist $Destination)) {
            $null = New-Item -Path $Destination -ItemType Directory -Confirm:$false -Force:$Force
        }
    }

    Process {
        $PackageJson = $project | Out-ElectronPackageJson -Destination $Source -PassThru
        # if ([string]::IsNullOrEmpty($OutputFileName)) {
        # $Filename = "$($project.name)-$($project.Version)$($project.PreRelease)-$($PackageJson.arch).deb"
        # } else {
        # $Filename = $OutputFileName
        # }
        if ($PSCmdlet.ShouldProcess("$Destination", "Create electron package")) {
            Push-Location $Source
            if ($IsLinux) {
                $rc = Execute-Command -exe npm -args "run build -- --linux --$($PackageJson.arch)" -AsBool
            }
            if ($IsWindows) {
                $rc = Execute-Command -exe npm -args "run build -- --win --$($PackageJson.arch)" -AsBool
            }
            if($IsMacOS) {
                $rc = Execute-Command -exe npm -args "run build -- --mac --$($PackageJson.arch)" -AsBool
            }
            Write-Devel "rc = $rc"
            # if (Test-FileExist "$Destination/$Filename") {
            # $value = (Resolve-Path "$Destination/$Filename").Path
            # } else {
            # $value = $false
            # }
            Pop-Location
        # } else {
        # $value = "$Destination/$Filename"
        }

        # Write-Devel "value = $value"
        # return $value
        return $rc
    }

    End {
        Write-LeaveFunction
    }
}