src/Browser/Export-XrmConnectionToBrowser.ps1

. "$PsScriptRoot\..\_Internals\BrowserManager.ps1"
<#
    .SYNOPSIS
    Configure browser according to Dataverse environnements.

    .DESCRIPTION
    Provision or update Chrome or Edge (based on chromium) profile with all dataverse apps and Power Platform usefull links.

    .PARAMETER ProfileName
    Name of existing or new browser profile.
    
    .PARAMETER BrowserShortCutsPath
    Folder path where to store profile shortcut (.lnk).
    
    .PARAMETER IsChrome
    Indicates if browser is Google Chrome. (Default: true)
    Use false to switch to Edge.
    
    .PARAMETER OverrideConnectionStringFormat
    Provide the ConnectionString template in order to access to instances with different credentials.

    .PARAMETER Extensions
    Define chrome extensions identifiers to install.

    .PARAMETER AppIgnoredList
    Filter app list during favorite provisionning.

    .PARAMETER ChromeDefaultProfilesPath
    Folder path where to store Chrome profile folder.

    .PARAMETER ChromeX64AppPath
    Chrome executable path for 64 bits version.

    .PARAMETER ChromeX32AppPath
    Chrome executable path for 32 bits version.

    .PARAMETER EdgeDefaultProfilesPath
    Folder path where to store Edge profile folder.

    .PARAMETER EdgeAppPath
    Edge executable path.
#>

function Export-XrmConnectionToBrowser {
    [CmdletBinding()]
    param
    (        
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]   
        [String]
        $ProfileName,

        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]   
        [String]
        $BrowserShortCutsPath,

        [Parameter(Mandatory = $false)]
        [bool]
        $IsChrome = $true,       

        [Parameter(Mandatory = $false)]
        [String]
        $OverrideConnectionStringFormat = "",

        [Parameter(Mandatory = $false)]
        [string[]]
        $Extensions = @("eadknamngiibbmjdfokmppfooolhdidc", "bjnkkhimoaclnddigpphpgkfgeggokam"),        

        [Parameter(Mandatory = $false)]
        [String[]]
        $AppIgnoredList = @(),

        [Parameter(Mandatory = $false)]
        [string]
        $ChromeDefaultProfilesPath = "$($env:LOCALAPPDATA)\Google\Chrome\User Data\",

        [Parameter(Mandatory = $false)]
        [string]
        $ChromeX64AppPath = "C:\Program Files\Google\Chrome\Application\chrome.exe",

        [Parameter(Mandatory = $false)]
        [string]
        $ChromeX32AppPath = "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe",
        
        [Parameter(Mandatory = $false)]
        [string]
        $EdgeDefaultProfilesPath = "$($env:LOCALAPPDATA)\Microsoft\Edge\User Data\",

        [Parameter(Mandatory = $false)]
        [string]
        $EdgeAppPath = "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"

    )
    begin {   
        $StopWatch = [System.Diagnostics.Stopwatch]::StartNew(); 
        Trace-XrmFunction -Name $MyInvocation.MyCommand.Name -Stage Start -Parameters ($MyInvocation.MyCommand.Parameters); 
    }    
    process {

        if ($isChrome) {
            $browserProfilesPath = $ChromeDefaultProfilesPath;
            if (Test-Path -Path $ChromeX64AppPath) {
                $browserAppPath = $ChromeX64AppPath;
            }
            elseif (Test-Path -Path $ChromeX32AppPath) {
                $browserAppPath = $ChromeX32AppPath;
            }
            else {
                throw "Chrome application path not found!";
            }
        }
        else {
            $browserProfilesPath = $EdgeDefaultProfilesPath;
            $browserAppPath = $EdgeAppPath;
        }

        # Provision profile folder
        $profilePath = [IO.Path]::Combine($browserProfilesPath, $ProfileName);
        if (-not(Test-Path -Path $profilePath)) {
            New-Item -ItemType Directory -Path $browserProfilesPath -Name $ProfileName -Force -ErrorAction Ignore | Out-Null;

            # Create shrotcut
            Add-BrowserShortcut -BrowserShortCutsPath $BrowserShortCutsPath -BrowserAppPath $browserAppPath -ProfileName $ProfileName;
    
            # Start browser for folder initialization
            Start-Browser -BrowserAppPath $browserAppPath -ProfileName $ProfileName;
            Start-Sleep -Seconds 5;
            
            # Configure chrome : Favorite bar
            Set-BrowserFavoriteBarEnabled -ProfileName $ProfileName -ProfilePath $profilePath;
        
            # Configure chrome : Extensions
            $Extensions | ForEach-Object {
                if ($isChrome) {
                    Add-ChromeExtension -ExtensionName $_;
                }
                else {        
                    Add-EdgeExtension -ExtensionName $_;
                }
            }
        }

        # Configure chrome : Add favorites
        $rootBookmark = Get-DefaultBookmark;
        
        # Retrieve CDS instances and add links to bookmark
        $rootBookmark = Get-XrmFavorites -RootBookmark $rootBookmark -OverrideConnectionStringFormat $OverrideConnectionStringFormat -AppIgnoredList $AppIgnoredList;

        # Save favorites
        Save-BookMark -ProfilePath $profilePath -RootBookmark $rootBookmark;

        # Fix profile name
        $browserStateFilePath = "$browserProfilesPath\Local State";
        $localState = [IO.File]::ReadAllText($browserStateFilePath) | ConvertFrom-Json;
        $localState.profile.info_cache.$ProfileName.name = $ProfileName;
        $localState | ConvertTo-Json -Depth 32 | Out-File -FilePath $browserStateFilePath -Encoding utf8 -Force;
    }
    end {
        $StopWatch.Stop();
        Trace-XrmFunction -Name $MyInvocation.MyCommand.Name -Stage Stop -StopWatch $StopWatch;
    }    
}

Export-ModuleMember -Function Export-XrmConnectionToBrowser -Alias *;