92 lines
3.5 KiB
JavaScript
92 lines
3.5 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/image-factory-ux.js');
|
|
const css = read('public/image-factory-ux.css');
|
|
const loader = read('public/ux-foundation.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="image-factory"',
|
|
'id="image-factory-source-grid"',
|
|
'id="image-factory-profile-grid"',
|
|
'id="image-factory-selection-count"',
|
|
'id="image-factory-submit"',
|
|
'id="image-factory-summary"',
|
|
'id="image-factory-jobs"',
|
|
'id="image-factory-job-page-info"',
|
|
], 'Bestehender Bildproduktionsvertrag fehlt');
|
|
|
|
includesAll(loader, [
|
|
'image-factory-ux.css?v=1.44.0',
|
|
'image-factory-ux.js?v=1.44.0',
|
|
'data-ux-image-factory',
|
|
'loadImageFactoryAssets()',
|
|
], 'UX-Loader bindet Bildwerkstatt nicht vollständig ein');
|
|
|
|
expect(pkg.scripts?.['verify:image-factory'] === 'node tools/verify-image-factory-ux-1.44.0.mjs', 'verify:image-factory Script fehlt');
|
|
expect(pkg.scripts?.['verify:all']?.includes('npm run verify:image-factory'), 'verify:all enthält das Bildwerkstatt-Gate nicht');
|
|
|
|
includesAll(js, [
|
|
'ux-image-factory-workflow',
|
|
'uxFactoryStep',
|
|
'ux-image-factory-stage',
|
|
'ux-image-factory-monitor',
|
|
'uxFactoryNext',
|
|
'uxFactoryJobFilter',
|
|
'stageTarget',
|
|
'ux-image-factory-stage-jobs',
|
|
'image-factory-selection-count',
|
|
'image-factory-source-grid',
|
|
'image-factory-profile-grid',
|
|
'image-factory-submit',
|
|
'image-factory-summary',
|
|
'MutationObserver',
|
|
'requestAnimationFrame',
|
|
'scrollIntoView',
|
|
], 'Bildwerkstatt-UX-Vertrag fehlt');
|
|
|
|
includesAll(css, [
|
|
'#image-factory.ux-image-factory-ready',
|
|
'.ux-image-factory-workflow',
|
|
'.ux-image-factory-steps',
|
|
'.ux-image-factory-stage',
|
|
'.ux-image-factory-monitor',
|
|
'.ux-image-factory-job-filter',
|
|
'.ux-image-factory-source-controls',
|
|
'.image-factory-submit',
|
|
'@media (max-width: 760px)',
|
|
'@media (max-width: 470px)',
|
|
'@media (prefers-reduced-motion: reduce)',
|
|
':focus-visible',
|
|
'var(--',
|
|
], 'Bildwerkstatt-CSS-Vertrag fehlt');
|
|
|
|
expect(!/\bfetch\s*\(/.test(js), 'Additive Bildwerkstatt-UX darf keine eigenen Netzwerkaufrufe ausführen');
|
|
expect(!/\bapi\s*\(/.test(js), 'Additive Bildwerkstatt-UX darf keine Vendoo-API direkt aufrufen');
|
|
expect(!/\.innerHTML\s*=/.test(js), 'Bildwerkstatt-UX darf keine innerHTML-Zuweisungen verwenden');
|
|
expect(!/\.outerHTML\s*=/.test(js), 'Bildwerkstatt-UX darf keine outerHTML-Zuweisungen verwenden');
|
|
expect(!/\.onclick\s*=/.test(js), 'Bildwerkstatt-UX darf keine onclick-Zuweisungen verwenden');
|
|
expect(!/confirm\s*\(/.test(js), 'Gefährliche Produktionsaktionen müssen in der bestehenden geprüften Logik bleiben');
|
|
expect(!/\b(?:DELETE|PATCH|POST|PUT)\b/.test(js), 'Bildwerkstatt-UX darf keine Schreiboperationen implementieren');
|
|
expect(!/imageFactorySelectedSources\s*=|imageFactorySelectedProfiles\s*=|imageFactoryJobs\s*=/.test(js), 'Additive UX darf den produktiven Image-Factory-State nicht überschreiben');
|
|
|
|
if (failures.length) {
|
|
console.error('Image Factory UX Gate fehlgeschlagen:');
|
|
for (const failure of failures) console.error(`- ${failure}`);
|
|
process.exit(1);
|
|
}
|
|
|
|
console.log('Image Factory UX Gate bestanden.');
|