Private/Initialize-Configuration.ps1

function Initialize-Configuration {
    if ($script:ConfigurationInitialized -and $script:ConfigurationData) {
        return
    }

    Invoke-ModuleSynchronized $script:ConfigurationSyncRoot {
        if ($script:ConfigurationInitialized -and $script:ConfigurationData) {
            return
        }

        $configRoot = Get-ColorScriptsConfigurationRoot
        $script:ConfigurationPath = Join-Path -Path $configRoot -ChildPath 'config.json'

        $existing = $null
        $raw = $null
        $forceSave = $false
        $configExists = Test-Path -LiteralPath $script:ConfigurationPath

        if ($configExists) {
            try {
                $raw = Get-Content -LiteralPath $script:ConfigurationPath -Raw -ErrorAction Stop
                if (-not [string]::IsNullOrWhiteSpace($raw)) {
                    $existing = ConvertFrom-JsonToHashtable -InputObject $raw
                }
                else {
                    $raw = $null
                }
            }
            catch {
                Write-Warning ($script:Messages.FailedToParseConfigurationFile -f $script:ConfigurationPath, $_.Exception.Message)
                $forceSave = $true
                $raw = $null
            }
        }

        $script:ConfigurationData = Merge-ColorScriptConfiguration $script:DefaultConfiguration $existing

        if ($forceSave -or -not $configExists) {
            Save-ColorScriptConfiguration -Configuration $script:ConfigurationData -ExistingContent $raw -Force:$forceSave
        }

        $script:ConfigurationInitialized = $true
    }
}