AWS.SAML.ChromeDriver.psm1

using module .\AWS.SAML.Settings.psm1

function Get-ChromeDriverNeeded{
    [CmdletBinding()]
    [OutputType([String])]
    param(
    )

    $version = Get-ChromeVersion
    return Get-ChromeDriverPathByVersion -ChromeVersion $version
}

function Get-ChromeVersion {
    [CmdletBinding()]
    [OutputType([String])]
    param(
    )
    switch ($true) {
        $IsMacOS {
            # Example response: Google Chrome 80.0.3987.163
            $response = & '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome' --version
            return $response.trim(' ').split(' ')[-1]
        }
        $IsLinux {
            throw 'Chrome Driver Management Not Implemented for Linux Yet!'
        }
        $IsWindows {
            # Get File Path
            $ChromeFile = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe').'(Default)'

            return (Get-Item $ChromeFile).VersionInfo.ProductVersion
        }
        Default {
            Throw 'Not able to detect the platform being used. Make sure you are using an updated version of PowerShell.'
        }
    }
}

function Get-ChromeDriverPathByVersion {
    [CmdletBinding()]
    [OutputType([String])]
    param(
        [Parameter(Mandatory=$true)]
        [String]$ChromeVersion
    )

    $neededDriverVersion = Get-ChromeDriverVersionByChromeVersion -ChromeVersion $ChromeVersion
    $versionsAvailable = Get-ChromeDriverVersions
    $DriverFolder = Get-ChromeDriverFolder

    # Check for the driver and download if needed
    if($neededDriverVersion -notin $versionsAvailable){
        Install-ChromeDriver -ChromeVersion $ChromeVersion
    }

    # Get Driver Details
    $file = (Get-ChildItem "$DriverFolder\$neededDriverVersion\").Name
    return "$DriverFolder\$neededDriverVersion\$file"
}

function Get-ChromeDriverVersions {
    [CmdletBinding()]
    param(
    )

    # Get Driver Details
    $DriverFolder = Get-ChromeDriverFolder
    Return (Get-ChildItem $DriverFolder).Name
}

function Install-ChromeDriver{
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]
        [String]$ChromeVersion
    )

    # Get Driver Details
    $DriverFolder = Get-ChromeDriverFolder
    $DriverVersion = Get-ChromeDriverVersionByChromeVersion -ChromeVersion $ChromeVersion

    # Download File
    $DownloadFile = Invoke-ChromeDriverDownload -DriverFolder $DriverFolder -DriverVersion $DriverVersion
    Expand-Archive -LiteralPath $DownloadFile -DestinationPath "$DriverFolder\$DriverVersion"

    # Additional File Prep
    if($IsMacOS){
        # Mark as Executable
        Push-Location "$DriverFolder\$DriverVersion"
        & 'chmod' 755 chromedriver
        Pop-Location
    }

    Remove-Item $DownloadFile
}

function Invoke-ChromeDriverDownload {
    [CmdletBinding()]
    [OutputType([String])]
    param(
        [Parameter(Mandatory=$true)]
        [String]$DriverFolder,
        [Parameter(Mandatory=$true)]
        [String]$DriverVersion
    )

    $DriverName = Get-ChromeDriverName

    $DownloadURI = "https://chromedriver.storage.googleapis.com/$DriverVersion/$DriverName"
    $DownloadFile = "$($DriverFolder)\$DriverVersion`_$DriverName"

    Invoke-WebRequest -Uri $DownloadURI -OutFile $DownloadFile
    return $DownloadFile
}

function Get-ChromeDriverVersionByChromeVersion {
    [CmdletBinding()]
    [OutputType([String])]
    param(
        [Parameter(Mandatory=$true)]
        [String]$ChromeVersion
    )
    $version = Select-ChromeVersionForDriver -ChromeVersion $ChromeVersion

    $URL = "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_$version"
    return Invoke-RestMethod -Method Get -Uri $URL
}

function Get-ChromeDriverFolder {
    [CmdletBinding()]
    [OutputType([String])]
    param(
    )
    $directory = "$(Get-SaveDir)\ChromeDrivers"

    # Create the folder if it doesn't exist
    if(!(Test-Path $directory)){
        New-Item -ItemType Directory $directory
    }

    return $directory
}

function Select-ChromeVersionForDriver {
    [CmdletBinding()]
    [OutputType([String])]
    param(
        [Parameter(Mandatory=$true)]
        [String]$ChromeVersion
    )
    $versions = $ChromeVersion.Split('.')

    return "$($versions[0]).$($versions[1]).$($versions[2])"
}

function Get-ChromeDriverName {
    [CmdletBinding()]
    [OutputType([String])]
    param(
    )

    switch ($true) {
        $IsMacOS { return 'chromedriver_mac64.zip' }
        $IsLinux { return 'chromedriver_linux64.zip' }
        $IsWindows { return 'chromedriver_win32.zip' }
        Default { Throw 'Not able to detect the platform being used. Make sure you are using an updated version of PowerShell.' }
    }
}