test(ux): add publish center contract gate

This commit is contained in:
Masterluke77
2026-07-11 08:54:10 +02:00
parent 873d2a2283
commit fc9850a3a7
+73
View File
@@ -0,0 +1,73 @@
import { readFileSync } from 'node:fs';
import { resolve } from 'node:path';
const root = resolve(import.meta.dirname, '..');
const read = path => readFileSync(resolve(root, path), 'utf8');
const failures = [];
function requireText(content, needle, label) {
if (!content.includes(needle)) failures.push(`${label}: ${needle}`);
}
function forbidText(content, needle, label) {
if (content.includes(needle)) failures.push(`${label}: ${needle}`);
}
const loader = read('public/ux-foundation.js');
const script = read('public/publish-center-ux.js');
const style = read('public/publish-center-ux.css');
const pkg = JSON.parse(read('package.json'));
requireText(loader, '/publish-center-ux.css?v=1.44.0', 'Publish-CSS wird nicht geladen');
requireText(loader, '/publish-center-ux.js?v=1.44.0', 'Publish-JavaScript wird nicht geladen');
requireText(loader, 'loadPublishCenterAssets();', 'Publish-Assets fehlen in der UX-Initialisierung');
if (pkg.scripts?.['verify:publish-center'] !== 'node tools/verify-publish-center-ux-1.44.0.mjs') {
failures.push('package.json: verify:publish-center fehlt oder zeigt auf die falsche Datei');
}
requireText(pkg.scripts?.['verify:all'] || '', 'npm run verify:publish-center', 'Publish-Gate fehlt in verify:all');
for (const token of [
'OPERATIONAL_VIEWS',
'VIEW_META',
'ux-publish-view-groups',
'ux-publish-status-drawer',
'data-publish-operational',
'data-has-publish-selection',
'MutationObserver',
"button.setAttribute('role', 'tab')",
"button.setAttribute('aria-selected'",
'publish-filter-platform',
'publish-filter-status',
'publish-list-card',
]) requireText(script, token, 'Publish-UX-Vertrag unvollständig');
for (const forbidden of ['fetch(', 'api(', 'XMLHttpRequest', '.innerHTML', 'outerHTML', 'onclick=', 'localStorage.clear']) {
forbidText(script, forbidden, 'Publish-UX darf keine Daten-, API- oder unsichere DOM-Logik enthalten');
}
for (const token of [
'.ux-publish-guide',
'.ux-publish-view-groups',
'.ux-publish-status-drawer',
'[data-publish-operational]',
'[data-has-publish-selection]',
'.ux-publish-active-filters',
'.ux-publish-batch-more',
':focus-visible',
'@media (max-width: 900px)',
'@media (prefers-reduced-motion: reduce)',
'var(--vd-',
]) requireText(style, token, 'Publish-CSS-Vertrag unvollständig');
for (const forbidden of ['position: fixed', 'z-index: 9999', '#ff0000', '!important']) {
forbidText(style, forbidden, 'Publish-CSS verletzt Design- oder Layoutgrenzen');
}
if (failures.length) {
console.error('Publish-Center-UX 1.44.0 Gate fehlgeschlagen:');
for (const failure of failures) console.error(`- ${failure}`);
process.exit(1);
}
console.log('Publish-Center-UX 1.44.0 Gate bestanden.');