Files
vendoo/tools/verify-ux-foundation-1.44.0.mjs

47 lines
2.9 KiB
JavaScript

import { readFileSync } from 'node:fs';
import { resolve } from 'node:path';
const root = resolve(process.cwd());
const read = path => readFileSync(resolve(root, path), 'utf8');
const runtime = read('public/design-system/theme-runtime.js');
const css = read('public/ux-foundation.css');
const js = read('public/ux-foundation.js');
const pkg = JSON.parse(read('package.json'));
const failures = [];
const assert = (condition, message) => { if (!condition) failures.push(message); };
assert(runtime.includes('/ux-foundation.css?v=1.44.0'), 'UX-Foundation-Stylesheet wird nicht über den stabilen Theme-Runtime-Pfad geladen.');
assert(runtime.includes('/ux-foundation.js?v=1.44.0'), 'UX-Foundation-Script wird nicht über den stabilen Theme-Runtime-Pfad geladen.');
assert(runtime.includes("window.addEventListener('load', loadBehavior"), 'UX-Verhalten startet nicht nach der bestehenden App-Initialisierung.');
assert(pkg.scripts?.['verify:ux-foundation'] === 'node tools/verify-ux-foundation-1.44.0.mjs', 'npm-Script verify:ux-foundation fehlt oder ist falsch.');
assert(String(pkg.scripts?.['verify:all'] || '').includes('verify:ux-foundation'), 'verify:all enthält das UX-Foundation-Gate nicht.');
for (const label of ['Start', 'Verkaufen', 'Inhalte & AI', 'Werkzeuge & System']) {
assert(js.includes(`label: '${label}'`), `Navigationsgruppe fehlt: ${label}`);
}
for (const tab of ['dashboard', 'today', 'generator', 'history', 'publish', 'inventory', 'media-library', 'settings', 'admin']) {
assert(js.includes(tab), `Navigationsziel fehlt im UX-Vertrag: ${tab}`);
}
assert(js.includes('aria-current'), 'Aktive Navigation wird nicht über aria-current ausgezeichnet.');
assert(js.includes('MutationObserver'), 'Kontexttitel reagieren nicht auf Ansichtswechsel.');
assert(js.includes('data-ux-target'), 'Kontextbezogene Schnellaktionen fehlen.');
assert(js.includes("localStorage.setItem('vendoo_ux_system_nav_open'"), 'Zustand der Systemnavigation wird nicht benutzerfreundlich gespeichert.');
assert(!js.includes('onclick='), 'Inline-Eventhandler sind im UX-Script unzulässig.');
assert(!js.includes('innerHTML +=') && !js.includes('outerHTML'), 'Unsichere DOM-Erweiterung im UX-Script erkannt.');
for (const selector of ['.ux-nav-sections', '.ux-command-center', '.ux-dashboard-more', '@media (max-width: 900px)', '@media (prefers-reduced-motion: reduce)']) {
assert(css.includes(selector), `UX-CSS-Vertrag fehlt: ${selector}`);
}
assert(css.includes('focus-visible'), 'Sichtbare Tastaturfokusse fehlen.');
assert(css.includes('var(--'), 'UX-CSS verwendet das zentrale Token-/Variablensystem nicht.');
if (failures.length) {
console.error('[UX-FOUNDATION] Prüfung fehlgeschlagen:');
failures.forEach(failure => console.error(`- ${failure}`));
process.exit(1);
}
console.log('[UX-FOUNDATION] Navigation, Dashboard-Reduktion, Kontextführung, Runtime-Integration, Responsive-Vertrag und Accessibility-Gates sind vollständig.');