WIP: Vendoo 1.44.0 – UX Foundation & Guided Workspaces #29
@@ -0,0 +1,104 @@
|
||||
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/inventory-workspace.js');
|
||||
const css = read('public/inventory-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="inventory"',
|
||||
'class="inventory-header"',
|
||||
'id="inv-add-location-btn"',
|
||||
'id="inv-stats"',
|
||||
'id="inv-locations"',
|
||||
'id="inv-detail"',
|
||||
'id="inv-back"',
|
||||
'id="inv-detail-title"',
|
||||
'id="inv-rename-btn"',
|
||||
'id="inv-move-btn"',
|
||||
'id="inv-detail-list"',
|
||||
], 'Bestehender Lagerverwaltungsvertrag fehlt');
|
||||
|
||||
includesAll(runtime, [
|
||||
'inventory-workspace.css?v=1.44.0',
|
||||
'inventory-workspace.js?v=1.44.0',
|
||||
'data-ux-inventory-workspace',
|
||||
'loadInventoryWorkspaceAssets()',
|
||||
], 'Theme-Runtime bindet die Lager-UX nicht vollständig ein');
|
||||
|
||||
expect(pkg.scripts?.['verify:inventory-workspace'] === 'node tools/verify-inventory-workspace-ux-1.44.0.mjs', 'verify:inventory-workspace Script fehlt');
|
||||
expect(pkg.scripts?.['verify:all']?.includes('npm run verify:inventory-workspace'), 'verify:all enthält das Lager-UX-Gate nicht');
|
||||
|
||||
includesAll(js, [
|
||||
'ux-inventory-overview',
|
||||
'ux-inventory-metrics',
|
||||
'data-ux-inventory-metric',
|
||||
'data-ux-inventory-next',
|
||||
'ux-inventory-toolbar',
|
||||
'data-ux-inventory-search',
|
||||
'data-ux-inventory-filter',
|
||||
'data-ux-inventory-sort',
|
||||
'ux-inventory-needs-attention',
|
||||
'ux-inventory-detail-toolbar',
|
||||
'data-ux-inventory-detail-search',
|
||||
'data-ux-inventory-select-all',
|
||||
'ux-inventory-selection-bar',
|
||||
'ux-inventory-more-actions',
|
||||
'inv-item-check',
|
||||
'MutationObserver',
|
||||
'requestAnimationFrame',
|
||||
'scrollIntoView',
|
||||
'aria-pressed',
|
||||
'ArrowLeft',
|
||||
'ArrowRight',
|
||||
], 'Lager-UX-Vertrag fehlt');
|
||||
|
||||
includesAll(css, [
|
||||
'#inventory.ux-inventory-ready',
|
||||
'.ux-inventory-overview',
|
||||
'.ux-inventory-metrics',
|
||||
'.ux-inventory-toolbar',
|
||||
'.ux-inventory-filter-group',
|
||||
'.ux-inventory-needs-attention',
|
||||
'.ux-inventory-detail-toolbar',
|
||||
'.ux-inventory-selection-bar',
|
||||
'.ux-inventory-more-actions',
|
||||
'@media (max-width: 700px)',
|
||||
'@media (max-width: 470px)',
|
||||
'@media (prefers-reduced-motion: reduce)',
|
||||
':focus-visible',
|
||||
'var(--',
|
||||
], 'Lager-UX-CSS-Vertrag fehlt');
|
||||
|
||||
expect(!/\bfetch\s*\(/.test(js), 'Additive Lager-UX darf keine eigenen Netzwerkaufrufe ausführen');
|
||||
expect(!/\bapi\s*\(/.test(js), 'Additive Lager-UX darf die Vendoo-API nicht direkt aufrufen');
|
||||
expect(!/\.innerHTML\s*=/.test(js), 'Lager-UX darf keine innerHTML-Zuweisungen verwenden');
|
||||
expect(!/\.outerHTML\s*=/.test(js), 'Lager-UX darf keine outerHTML-Zuweisungen verwenden');
|
||||
expect(!/\.onclick\s*=/.test(js), 'Lager-UX darf keine onclick-Zuweisungen verwenden');
|
||||
expect(!/confirm\s*\(/.test(js), 'Gefährliche Lageraktionen müssen in der bestehenden geprüften Logik bleiben');
|
||||
expect(!/prompt\s*\(/.test(js), 'Eingaben für Lageränderungen müssen in der bestehenden geprüften Logik bleiben');
|
||||
expect(!/\b(?:DELETE|PATCH|POST|PUT)\b/.test(js), 'Lager-UX darf keine Schreiboperationen implementieren');
|
||||
expect(!/bulk-location/.test(js), 'Lager-UX darf die Bulk-Location-API nicht direkt verwenden');
|
||||
expect(!/loadInventory\s*\(/.test(js), 'Lager-UX darf den produktiven Ladevorgang nicht direkt auslösen');
|
||||
expect(!/showInventoryDetail\s*\(/.test(js), 'Lager-UX darf die produktive Detailfunktion nicht direkt aufrufen');
|
||||
expect(!/state\./.test(js), 'Additive Lager-UX darf den produktiven Vendoo-State nicht direkt verändern');
|
||||
|
||||
if (failures.length) {
|
||||
console.error('Inventory Workspace UX Gate fehlgeschlagen:');
|
||||
for (const failure of failures) console.error(`- ${failure}`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
console.log('Inventory Workspace UX Gate bestanden.');
|
||||
Reference in New Issue
Block a user