Files
vendoo/tools/verify-template-workspace-ux-1.44.0.mjs

112 lines
4.1 KiB
JavaScript

import fs from 'node:fs';
import path from 'node:path';
const root = process.cwd();
const read = relative => fs.readFileSync(path.join(root, relative), 'utf8');
const js = read('public/template-workspace.js');
const css = read('public/template-workspace.css');
const runtime = read('public/design-system/theme-runtime.js');
const html = read('public/index.html');
const pkg = JSON.parse(read('package.json'));
const failures = [];
const expect = (condition, message) => {
if (!condition) failures.push(message);
};
const includesAll = (source, values, label) => {
for (const value of values) expect(source.includes(value), `${label}: ${value}`);
};
includesAll(html, [
'id="templates"',
'class="templates-header"',
'id="add-template-btn"',
'id="template-list"',
'id="template-form"',
'id="template-form-title"',
'id="tpl-name"',
'id="tpl-platform"',
'id="tpl-language"',
'id="tpl-notes-editor"',
'id="tpl-tags"',
'id="save-template-btn"',
'id="cancel-template-btn"',
], 'Bestehender Vorlagenvertrag fehlt');
includesAll(runtime, [
'template-workspace.css?v=1.44.0',
'template-workspace.js?v=1.44.0',
'data-ux-template-workspace',
'loadTemplateWorkspaceAssets()',
], 'Theme-Runtime bindet die Vorlagen-UX nicht vollständig ein');
expect(pkg.scripts?.['verify:template-workspace'] === 'node tools/verify-template-workspace-ux-1.44.0.mjs', 'verify:template-workspace Script fehlt');
expect(pkg.scripts?.['verify:all']?.includes('npm run verify:template-workspace'), 'verify:all enthält das Vorlagen-UX-Gate nicht');
includesAll(js, [
'vendoo_template_workspace_filters',
'ux-template-hero',
'ux-template-metrics',
'ux-template-toolbar',
'uxTemplateSearch',
'uxTemplatePlatform',
'uxTemplateLanguage',
'uxTemplateInitial',
'ux-template-card',
'ux-template-badges',
'ux-template-more-actions',
'ux-template-editor-head',
'ux-template-editor-layout',
'ux-template-editor-actions',
'updateEditorStatus',
'template-item',
'tpl-edit',
'tpl-delete',
'save-template-btn',
'cancel-template-btn',
'MutationObserver',
'requestAnimationFrame',
'scrollIntoView',
'aria-live',
'ArrowLeft',
'ArrowRight',
], 'Vorlagen-UX-Vertrag fehlt');
includesAll(css, [
'#templates.ux-template-workspace-ready',
'.ux-template-hero',
'.ux-template-toolbar',
'.ux-template-card',
'.ux-template-badges',
'.ux-template-more-actions',
'#templates.ux-template-editor-open',
'#templates.ux-template-list-open',
'.ux-template-editor-layout',
'.ux-template-editor-actions',
'@media (max-width: 700px)',
'@media (max-width: 470px)',
'@media (prefers-reduced-motion: reduce)',
':focus-visible',
'var(--',
], 'Vorlagen-UX-CSS-Vertrag fehlt');
expect(!/\bfetch\s*\(/.test(js), 'Additive Vorlagen-UX darf keine eigenen Netzwerkaufrufe ausführen');
expect(!/\bapi\s*\(/.test(js), 'Additive Vorlagen-UX darf die Vendoo-API nicht direkt aufrufen');
expect(!/\.innerHTML\s*=/.test(js), 'Vorlagen-UX darf keine innerHTML-Zuweisungen verwenden');
expect(!/\.outerHTML\s*=/.test(js), 'Vorlagen-UX darf keine outerHTML-Zuweisungen verwenden');
expect(!/\.onclick\s*=/.test(js), 'Vorlagen-UX darf keine onclick-Zuweisungen verwenden');
expect(!/confirm\s*\(/.test(js), 'Gefährliche Vorlagenaktionen müssen in der bestehenden geprüften Logik bleiben');
expect(!/\b(?:DELETE|PATCH|POST|PUT)\b/.test(js), 'Vorlagen-UX darf keine Schreiboperationen implementieren');
expect(!/setupTemplates\s*\(/.test(js), 'Vorlagen-UX darf den produktiven Setup-Ablauf nicht direkt aufrufen');
expect(!/renderTemplateList\s*\(/.test(js), 'Vorlagen-UX darf die produktive Vorlagenliste nicht direkt rendern');
expect(!/updateTemplateDropdown\s*\(/.test(js), 'Vorlagen-UX darf den produktiven Generator-Dropdown nicht direkt verändern');
expect(!/state\.templates/.test(js), 'Additive Vorlagen-UX darf den produktiven Template-State nicht direkt verändern');
if (failures.length) {
console.error('Template Workspace UX Gate fehlgeschlagen:');
for (const failure of failures) console.error(`- ${failure}`);
process.exit(1);
}
console.log('Template Workspace UX Gate bestanden.');