posh-gitmoji.psm1

$script:EMOJIS = [pscustomobject[]]@(
    @{emoji = "🎨"; code = "art"; desc = "Improving structure / format of the code." },
    @{emoji = "⚡️"; code = "zap"; desc = "Improving performance." },
    @{emoji = "🔥"; code = "fire"; desc = "Removing code or files." },
    @{emoji = "🐛"; code = "bug"; desc = "Fixing a bug." },
    @{emoji = "🚑"; code = "ambulance"; desc = "Critical hotfix." },
    @{emoji = "✨"; code = "sparkles"; desc = "Introducing new features." },
    @{emoji = "📝"; code = "pencil"; desc = "Writing docs." },
    @{emoji = "🚀"; code = "rocket"; desc = "Deploying stuff." },
    @{emoji = "💄"; code = "lipstick"; desc = "Updating the UI and style files." },
    @{emoji = "🎉"; code = "tada"; desc = "Initial commit." },
    @{emoji = "✅"; code = "white_check_mark"; desc = "Updating tests." },
    @{emoji = "🔒"; code = "lock"; desc = "Fixing security issues." },
    @{emoji = "🍎"; code = "apple"; desc = "Fixing something on macOS." },
    @{emoji = "🐧"; code = "penguin"; desc = "Fixing something on Linux." },
    @{emoji = "🏁"; code = "checkered_flag"; desc = "Fixing something on Windows." },
    @{emoji = "🤖"; code = "robot"; desc = "Fixing something on Android." },
    @{emoji = "🍏"; code = "green_apple"; desc = "Fixing something on iOS." },
    @{emoji = "🔖"; code = "bookmark"; desc = "Releasing / Version tags." },
    @{emoji = "🚨"; code = "rotating_light"; desc = "Removing linter warnings." },
    @{emoji = "🚧"; code = "construction"; desc = "Work in progress." },
    @{emoji = "💚"; code = "green_heart"; desc = "Fixing CI Build." },
    @{emoji = "⬇️"; code = "arrow_down"; desc = "Downgrading dependencies." },
    @{emoji = "⬆️"; code = "arrow_up"; desc = "Upgrading dependencies." },
    @{emoji = "📌"; code = "pushpin"; desc = "Pinning dependencies to specific versions." },
    @{emoji = "👷"; code = "construction_worker"; desc = "Adding CI build system." },
    @{emoji = "📈"; code = "chart_with_upwards_trend"; desc = "Adding analytics or tracking code." },
    @{emoji = "♻️"; code = "recycle"; desc = "Refactoring code." },
    @{emoji = "🐳"; code = "whale"; desc = "Work about Docker." },
    @{emoji = "➕"; code = "heavy_plus_sign"; desc = "Adding a dependency." },
    @{emoji = "➖"; code = "heavy_minus_sign"; desc = "Removing a dependency." },
    @{emoji = "🔧"; code = "wrench"; desc = "Changing configuration files." },
    @{emoji = "🌐"; code = "globe_with_meridians"; desc = "Internationalization and localization." },
    @{emoji = "✏️"; code = "pencil2"; desc = "Fixing typos." },
    @{emoji = "💩"; code = "poop"; desc = "Writing bad code that needs to be improved." },
    @{emoji = "⏪"; code = "rewind"; desc = "Reverting changes." },
    @{emoji = "🔀"; code = "twisted_rightwards_arrows"; desc = "Merging branches." },
    @{emoji = "📦"; code = "package"; desc = "Updating compiled files or packages." },
    @{emoji = "👽"; code = "alien"; desc = "Updating code due to external API changes." },
    @{emoji = "🚚"; code = "truck"; desc = "Moving or renaming files." },
    @{emoji = "📄"; code = "page_facing_up"; desc = "Adding or updating license." },
    @{emoji = "💥"; code = "boom"; desc = "Introducing breaking changes." },
    @{emoji = "🍱"; code = "bento"; desc = "Adding or updating assets." },
    @{emoji = "👌"; code = "ok_hand"; desc = "Updating code due to code review changes." },
    @{emoji = "♿️"; code = "wheelchair"; desc = "Improving accessibility." },
    @{emoji = "💡"; code = "bulb"; desc = "Documenting source code." },
    @{emoji = "🍻"; code = "beers"; desc = "Writing code drunkenly." },
    @{emoji = "💬"; code = "speech_balloon"; desc = "Updating text and literals." },
    @{emoji = "🗃"; code = "card_file_box"; desc = "Performing database related changes." },
    @{emoji = "🔊"; code = "loud_sound"; desc = "Adding logs." },
    @{emoji = "🔇"; code = "mute"; desc = "Removing logs." },
    @{emoji = "👥"; code = "busts_in_silhouette"; desc = "Adding contributor(s)." },
    @{emoji = "🚸"; code = "children_crossing"; desc = "Improving user experience / usability." },
    @{emoji = "🏗"; code = "building_construction"; desc = "Making architectural changes." },
    @{emoji = "📱"; code = "iphone"; desc = "Working on responsive design." },
    @{emoji = "🤡"; code = "clown_face"; desc = "Mocking things." },
    @{emoji = "🥚"; code = "egg"; desc = "Adding an easter egg." },
    @{emoji = "🙈"; code = "see_no_evil"; desc = "Adding or updating a .gitignore file" },
    @{emoji = "📸"; code = "camera_flash"; desc = "Adding or updating snapshots" },
    @{emoji = "⚗"; code = "alembic"; desc = "Experimenting new things" },
    @{emoji = "🔍"; code = "mag"; desc = "Improving SEO" },
    @{emoji = "☸️"; code = "wheel_of_dharma"; desc = "Work about Kubernetes" },
    @{emoji = "🏷️"; code = "label"; desc = "Adding or updating types (Flow, TypeScript)" },
    @{emoji = "🌱"; code = "seedling"; desc = "Adding or updating seed files" },
    @{emoji = "🚩"; code = "triangular_flag_on_post"; desc = "Adding, updating, or removing feature flags" },
    @{emoji = "🥅"; code = "goal_net"; desc = "Catching errors" },
    @{emoji = "💫"; code = "dizzy"; desc = "Adding or updating animations and transitions" }
)

$script:Config = @{
    AreaPath = ""
}

$ConfigLocation = Join-Path $PSScriptRoot "gitmoji.config.json"
function SaveConfig { Set-Content $ConfigLocation (ConvertTo-Json $script:Config); return }
function ReloadConfig { $script:Config = ConvertFrom-Json (Get-Content -Raw $ConfigLocation); return }

if (Test-Path $ConfigLocation) { ReloadConfig }

$script:LastAzureQueryDate = $null
[System.Management.Automation.Job]$script:AzureQueryJob = $null
function GetAzureQueryString {
    @"
Select [System.Id], [System.Title], [System.State], [System.AreaPath] From WorkItems Where [State] = 'Developing' AND [System.AreaPath] = '$($script:Config.AreaPath)' order by [System.CreatedDate] desc
"@

}


function GetActiveStories {
    if (($null -eq $script:LastAzureQueryDate) -or (($(Get-Date) - $script:LastAzureQueryDate).TotalSeconds -gt 60) ) {
        $script:AzureQueryJob = Start-Job -InputObject $(GetAzureQueryString) -ScriptBlock { [pscustomobject[]]$items = az boards query --wiql $input | ConvertFrom-Json; $items | ForEach-Object { [pscustomobject]@{id = $_.fields.'System.Id'; title = $_.fields.'System.Title'; } } }
        $script:LastAzureQueryDate = Get-Date
        $script:AzureQueryJob | Wait-Job | Out-Null
        return Receive-Job $script:AzureQueryJob -Keep
    }
    return Receive-Job $script:AzureQueryJob -Keep
}

function gitmoji {
    [CmdletBinding()]
    param (
        [Parameter()]
        [string]$Type,
        [Parameter()]
        [string]$Message,
        [Parameter()]
        [switch]$All,
        [Parameter()]
        [string]$Story = $null,
        [string]$AreaPath
    )
    if ($AreaPath) {
        $script:Config.AreaPath = $AreaPath
        SaveConfig
        return
    }
    $command = "git commit $(if($All){'-a '})-m `"$Type $($(if($Story){"#$Story "}))$Message`""
    Write-Host "> " -ForegroundColor DarkBlue -NoNewline
    Write-Host $command -ForegroundColor Yellow
    Invoke-Expression $command
}

$gitmojiTypeCompleter = {
    param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters)
    [scriptblock]$RenderHint = { "$($_.emoji) <# $($_.desc) #> " }
    if ($wordToComplete.Length -eq 0) {
        return $script:EMOJIS | ForEach-Object $RenderHint
    }
    $codeMatches = $script:EMOJIS | Where-Object { ($_.code).StartsWith($wordToComplete) } | ForEach-Object $RenderHint
    $codeContains = $script:EMOJIS | Where-Object { ($_.code) -match "$wordToComplete" } | ForEach-Object $RenderHint
    $descContains = $script:EMOJIS | Where-Object { ($_.desc) -match "$wordToComplete" } | ForEach-Object $RenderHint
    @($codeMatches) + $codeContains + $descContains | Sort-Object -Unique
}
Register-ArgumentCompleter -CommandName gitmoji -ParameterName Type -ScriptBlock $gitmojiTypeCompleter

$storyIdCompleter = {
    param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters)
    [scriptblock]$RenderHint = { "'$($_.id)' <# $($_.title) #> " }
    return GetActiveStories | ForEach-Object $RenderHint
}
Register-ArgumentCompleter -CommandName gitmoji -ParameterName Story -ScriptBlock $storyIdCompleter


Export-ModuleMember -Function @(
    "gitmoji"
)