Files
ai_site/scripts/Ensure-Web.ps1
2026-07-31 10:31:17 +08:00

58 lines
2.2 KiB
PowerShell

# Ensure web frontend: npm install + optional dist build for Docker nginx.
# Called automatically by start.ps1 / start-host.ps1 (no manual npm).
param(
[switch]$BuildDist
)
$ErrorActionPreference = "Stop"
$Root = Split-Path -Parent $PSScriptRoot
if (-not (Test-Path (Join-Path $Root "web\package.json"))) {
throw "web/package.json not found under repo root"
}
$WebDir = Join-Path $Root "web"
$npmCmd = Get-Command npm.cmd -ErrorAction SilentlyContinue
if (-not $npmCmd) { $npmCmd = Get-Command npm -ErrorAction SilentlyContinue }
if (-not $npmCmd) { throw "npm not found" }
Push-Location $WebDir
try {
if (-not (Test-Path "node_modules")) {
Write-Host " npm install (web) ..." -ForegroundColor DarkGray
& $npmCmd.Source install
if ($LASTEXITCODE -ne 0) { throw "npm install failed" }
}
if (-not $BuildDist) {
# Clear stale native exit code left by caller (e.g. docker compose failure)
$global:LASTEXITCODE = 0
return
}
$distIndex = Join-Path $WebDir "dist\index.html"
$needBuild = -not (Test-Path $distIndex)
if (-not $needBuild) {
$distTime = (Get-Item $distIndex).LastWriteTime
$newer = Get-ChildItem -Path (Join-Path $WebDir "src") -Recurse -File -ErrorAction SilentlyContinue |
Where-Object { $_.LastWriteTime -gt $distTime } |
Select-Object -First 1
if ($newer) { $needBuild = $true }
$cfgNewer = Get-ChildItem -Path $WebDir -File -ErrorAction SilentlyContinue |
Where-Object { $_.Name -match '^(vite\.config|index\.html|package\.json)' -and $_.LastWriteTime -gt $distTime } |
Select-Object -First 1
if ($cfgNewer) { $needBuild = $true }
}
if ($needBuild) {
Write-Host " npm run build (web dist, includes /#/preview) ..." -ForegroundColor DarkGray
& $npmCmd.Source run build
if ($LASTEXITCODE -ne 0) { throw "npm run build failed" }
if (-not (Test-Path $distIndex)) { throw "web/dist/index.html missing after build" }
Write-Host " OK web/dist ready" -ForegroundColor DarkGray
} else {
Write-Host " OK web/dist up to date" -ForegroundColor DarkGray
}
$global:LASTEXITCODE = 0
} finally {
Pop-Location
}