Files
scan-receipts/scripts/verify-styles.js
Timo 84b9987c49 Add full application: receipt scanning, auth, billing, and account deletion
Brings the working codebase (Next.js app, auth system, Stripe billing,
Docker/deploy config, tests, docs) into version control on top of the
placeholder initial commit, and adds account self-deletion (Danger Zone
in Settings, password + typed-email confirmation, cascading DB cleanup,
Stripe cancellation) per GDPR right-to-erasure.

Excludes local build caches, node_modules, and internal agent scratch
files; .gitignore hardened to keep those out going forward.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-19 20:59:04 +02:00

51 lines
1.3 KiB
JavaScript

const fs = require('fs');
const path = require('path');
function walk(dir) {
let results = [];
fs.readdirSync(dir).forEach((file) => {
const full = path.join(dir, file);
if (fs.statSync(full).isDirectory()) {
results = results.concat(walk(full));
} else if (/\.(tsx|ts|css)$/.test(file)) {
results.push(full);
}
});
return results;
}
const files = walk('src');
let violations = 0;
files.forEach((f) => {
const lines = fs.readFileSync(f, 'utf8').split('\n');
lines.forEach((l, i) => {
if (/\bshadow-(sm|md|lg|xl|2xl)\b/.test(l)) {
console.log(`SHADOW: ${f}:${i + 1} -> ${l.trim()}`);
violations++;
}
if (/\brounded-(full|lg|md|xl|2xl|3xl)\b/.test(l)) {
console.log(`ROUNDED: ${f}:${i + 1} -> ${l.trim()}`);
violations++;
}
if (/\bbg-gradient\b/.test(l)) {
console.log(`GRADIENT: ${f}:${i + 1} -> ${l.trim()}`);
violations++;
}
if (/box-shadow:/.test(l)) {
console.log(`BOX-SHADOW: ${f}:${i + 1} -> ${l.trim()}`);
violations++;
}
});
});
console.log('--- VERIFICATION RESULT ---');
console.log('TOTAL_VIOLATIONS:', violations);
if (violations === 0) {
console.log('VERIFICATION_PASSED: 0 residual style violations across src/');
process.exit(0);
} else {
console.log('VERIFICATION_FAILED');
process.exit(1);
}