Files
jiapuapp/tests/module-page-visual-contract.ps1
T
2026-07-20 06:52:33 +08:00

45 lines
1.6 KiB
PowerShell

$ErrorActionPreference = 'Stop'
$root = Split-Path -Parent $PSScriptRoot
$componentPath = Join-Path $root 'components/ModulePage.vue'
if (-not (Test-Path -LiteralPath $componentPath)) { throw 'Missing shared module page component' }
$component = Get-Content -LiteralPath $componentPath -Raw -Encoding utf8
foreach ($anchor in @(
"const moduleState = ref(['loading', 'empty', 'success', 'error'].includes(query.state) ? query.state : 'ready')",
'module-state--${moduleState}',
'empty: { eyebrow:',
'success: { eyebrow:',
'error: { eyebrow:',
'module-content-frame.png',
'module-field-frame.png',
'<AppLoading',
'<AppButton',
'<AppToast',
'<ModulePageBackground',
'query.state'
)) {
if ($component -notmatch [regex]::Escape($anchor)) { throw "ModulePage is missing high-spec anchor: $anchor" }
}
foreach ($forbidden in @(
'class="page-intro"',
'g03-create-flow-panel.png',
'g06-search-input-wide.png',
'application-status-card.png'
)) {
if ($component -match [regex]::Escape($forbidden)) { throw "ModulePage must not keep obsolete shared surface: $forbidden" }
}
foreach ($className in @('module-panel', 'form-row', 'list-card', 'detail-card', 'timeline-row', 'settings-row', 'status-card')) {
foreach ($property in @('border', 'background', 'border-radius', 'box-shadow', 'background-image')) {
if ($component -match "(?s)\.$className\s*\{[^}]*\b$property\s*:") {
throw "ModulePage must not construct .$className with CSS $property"
}
}
}
if ($component -match '::before|::after') { throw 'ModulePage must not draw visible decorations with CSS pseudo-elements' }
Write-Output 'MODULE-PAGE-VISUAL-CONTRACT PASS'