58 lines
1.7 KiB
PowerShell
58 lines
1.7 KiB
PowerShell
<#
|
|
.SYNOPSIS
|
|
Generates a valid Azure App Service name from a folder name + 8 hex chars.
|
|
.DESCRIPTION
|
|
Produces a name suitable for `az webapp create -n <name>` that satisfies
|
|
Azure App Service naming rules:
|
|
- lowercase a-z, 0-9, and hyphens only
|
|
- starts with a letter, ends with letter or digit
|
|
- total length <= 40 chars (slug truncated as needed)
|
|
- regex: ^[a-z][a-z0-9-]{1,38}[a-z0-9]$
|
|
.PARAMETER FolderName
|
|
Optional. The base name to derive the slug from. Defaults to the current
|
|
working directory's leaf name.
|
|
.EXAMPLE
|
|
.\generate-app-name.ps1
|
|
# Uses current folder name, e.g. "my-flask-app" → "my-flask-app-a3f9c1d2"
|
|
.EXAMPLE
|
|
.\generate-app-name.ps1 -FolderName "my-flask-app"
|
|
#>
|
|
param(
|
|
[string]$FolderName = (Split-Path -Leaf (Get-Location))
|
|
)
|
|
|
|
$ErrorActionPreference = "Stop"
|
|
|
|
# Lowercase, replace non-[a-z0-9] with '-', collapse repeats, trim hyphens.
|
|
$slug = $FolderName.ToLowerInvariant()
|
|
$slug = [regex]::Replace($slug, '[^a-z0-9]+', '-')
|
|
$slug = [regex]::Replace($slug, '-+', '-')
|
|
$slug = $slug.Trim('-')
|
|
|
|
if ([string]::IsNullOrEmpty($slug)) {
|
|
$slug = "app"
|
|
}
|
|
|
|
# 8 hex chars from a fresh GUID (segment before the first '-').
|
|
$suffix = [guid]::NewGuid().ToString().Split('-')[0].Substring(0, 8).ToLowerInvariant()
|
|
|
|
# Reserve 9 chars for "-XXXXXXXX" so the total stays <= 40.
|
|
$maxSlugLen = 31
|
|
if ($slug.Length -gt $maxSlugLen) {
|
|
$slug = $slug.Substring(0, $maxSlugLen).TrimEnd('-')
|
|
}
|
|
|
|
$name = "$slug-$suffix"
|
|
|
|
# Ensure the name starts with a letter (Azure requirement). Prefix 'a' if not.
|
|
if ($name -notmatch '^[a-z]') {
|
|
$name = "a$name"
|
|
}
|
|
|
|
# Final length guard.
|
|
if ($name.Length -gt 40) {
|
|
$name = $name.Substring(0, 40).TrimEnd('-')
|
|
}
|
|
|
|
Write-Output $name
|