[CmdletBinding()] param( [switch]$DryRun, [switch]$SkipAdmin, [switch]$SkipClient, [switch]$SkipPda ) $ErrorActionPreference = 'Stop' $repoRoot = (Resolve-Path (Join-Path $PSScriptRoot '../..')).Path function Invoke-FrontendStep { param([string]$Name, [string]$Directory, [string]$Task) $display = "pnpm --dir `"$Directory`" $Task" Write-Host " [$Name] $display" if ($DryRun) { return } & pnpm --dir $Directory $Task if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } } function Invoke-PdaTests { param([string]$Directory) $pattern = Join-Path $Directory 'tests/*.test.mjs' Write-Host " [test] node --test `"$pattern`"" if ($DryRun) { return } & node --test $pattern if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } } if ($SkipAdmin -and $SkipClient -and $SkipPda) { Write-Error 'At least one of Admin, Client or PDA must be selected.'; exit 2 } if ((-not $SkipAdmin -or -not $SkipClient) -and -not (Get-Command pnpm -ErrorAction SilentlyContinue)) { Write-Error 'pnpm was not found on PATH.'; exit 2 } if (-not $SkipPda -and -not (Get-Command node -ErrorAction SilentlyContinue)) { Write-Error 'node was not found on PATH.'; exit 2 } $targets = @() if (-not $SkipAdmin) { $targets += @{ Name = 'Admin'; Directory = Join-Path $repoRoot 'apps/admin-web' } } if (-not $SkipClient) { $targets += @{ Name = 'Client'; Directory = Join-Path $repoRoot 'apps/client-web' } } Write-Host 'Frontend full regression (local only)' Write-Host "Repository: $repoRoot" Write-Host "Mode: $(if ($DryRun) { 'DryRun' } else { 'Execute' })" Write-Host 'Gateway/database/deployment: not used' foreach ($target in $targets) { $packageJson = Join-Path $target.Directory 'package.json' if (-not (Test-Path -LiteralPath $packageJson)) { Write-Error "$($target.Name) package.json not found: $packageJson"; exit 2 } Write-Host "[$($target.Name)]" Invoke-FrontendStep 'test' $target.Directory 'test' Invoke-FrontendStep 'typecheck' $target.Directory 'typecheck' } if (-not $SkipPda) { $pdaTargets = @( @{ Name = 'Domestic PDA'; Directory = Join-Path $repoRoot 'apps/pda-uniapp' }, @{ Name = 'Overseas PDA'; Directory = Join-Path $repoRoot 'apps/pda-overseas-uniapp' } ) foreach ($pdaTarget in $pdaTargets) { if (-not (Test-Path -LiteralPath (Join-Path $pdaTarget.Directory 'tests'))) { Write-Error "$($pdaTarget.Name) tests directory not found: $($pdaTarget.Directory)"; exit 2 } Write-Host "[$($pdaTarget.Name)]" Invoke-PdaTests $pdaTarget.Directory } } Write-Host 'Frontend regression completed.'