From e1e57f2cfd1087285c0e64f500f0403cc2fb0a34 Mon Sep 17 00:00:00 2001 From: James Brunton Date: Wed, 3 Sep 2025 09:15:10 +0100 Subject: [PATCH] Enable ESLint no-require-imports rule --- frontend/eslint.config.mjs | 1 - frontend/postcss.config.js | 7 ++-- frontend/scripts/generate-icons.js | 34 +++++++++---------- frontend/scripts/generate-licenses.js | 6 ++-- frontend/src/tests/convert/ConvertE2E.spec.ts | 5 ++- 5 files changed, 27 insertions(+), 26 deletions(-) diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs index 7922013cb..5503f0fcb 100644 --- a/frontend/eslint.config.mjs +++ b/frontend/eslint.config.mjs @@ -24,7 +24,6 @@ export default defineConfig( "@typescript-eslint/ban-ts-comment": "off", // Temporarily disabled until codebase conformant "@typescript-eslint/no-empty-object-type": "off", // Temporarily disabled until codebase conformant "@typescript-eslint/no-explicit-any": "off", // Temporarily disabled until codebase conformant - "@typescript-eslint/no-require-imports": "off", // Temporarily disabled until codebase conformant "@typescript-eslint/no-unused-expressions": "off", // Temporarily disabled until codebase conformant "@typescript-eslint/no-unused-vars": "off", // Temporarily disabled until codebase conformant }, diff --git a/frontend/postcss.config.js b/frontend/postcss.config.js index 57e730c99..a4122e2fe 100644 --- a/frontend/postcss.config.js +++ b/frontend/postcss.config.js @@ -1,6 +1,9 @@ +import postcss from '@tailwindcss/postcss'; +import autoprefixer from 'autoprefixer'; + module.exports = { plugins: [ - require('@tailwindcss/postcss'), - require('autoprefixer'), + postcss, + autoprefixer, ], }; diff --git a/frontend/scripts/generate-icons.js b/frontend/scripts/generate-icons.js index 0fd42a4df..694453ca7 100644 --- a/frontend/scripts/generate-icons.js +++ b/frontend/scripts/generate-icons.js @@ -1,8 +1,8 @@ #!/usr/bin/env node -const { icons } = require('@iconify-json/material-symbols'); -const fs = require('fs'); -const path = require('path'); +import { icons } from '@iconify-json/material-symbols'; +import fs from 'fs'; +import path from 'path'; // Check for verbose flag const isVerbose = process.argv.includes('--verbose') || process.argv.includes('-v'); @@ -19,27 +19,27 @@ const debug = (message) => { function scanForUsedIcons() { const usedIcons = new Set(); const srcDir = path.join(__dirname, '..', 'src'); - + info('🔍 Scanning codebase for LocalIcon usage...'); - + if (!fs.existsSync(srcDir)) { console.error('❌ Source directory not found:', srcDir); process.exit(1); } - + // Recursively scan all .tsx and .ts files function scanDirectory(dir) { const files = fs.readdirSync(dir); - + files.forEach(file => { const filePath = path.join(dir, file); const stat = fs.statSync(filePath); - + if (stat.isDirectory()) { scanDirectory(filePath); } else if (file.endsWith('.tsx') || file.endsWith('.ts')) { const content = fs.readFileSync(filePath, 'utf8'); - + // Match LocalIcon usage: const localIconMatches = content.match(/]*icon="([^"]+)"/g); if (localIconMatches) { @@ -51,7 +51,7 @@ function scanForUsedIcons() { } }); } - + // Match old material-symbols-rounded spans: icon-name const spanMatches = content.match(/]*className="[^"]*material-symbols-rounded[^"]*"[^>]*>([^<]+)<\/span>/g); if (spanMatches) { @@ -64,7 +64,7 @@ function scanForUsedIcons() { } }); } - + // Match Icon component usage: const iconMatches = content.match(/]*icon="material-symbols:([^"]+)"/g); if (iconMatches) { @@ -79,12 +79,12 @@ function scanForUsedIcons() { } }); } - + scanDirectory(srcDir); - + const iconArray = Array.from(usedIcons).sort(); info(`📋 Found ${iconArray.length} unique icons across codebase`); - + return iconArray; } @@ -102,7 +102,7 @@ async function main() { const existingSet = JSON.parse(fs.readFileSync(outputPath, 'utf8')); const existingIcons = Object.keys(existingSet.icons || {}).sort(); const currentIcons = [...usedIcons].sort(); - + if (JSON.stringify(existingIcons) === JSON.stringify(currentIcons)) { needsRegeneration = false; info(`✅ Icon set already up-to-date (${usedIcons.length} icons, ${Math.round(fs.statSync(outputPath).size / 1024)}KB)`); @@ -122,7 +122,7 @@ async function main() { // Dynamic import of ES module const { getIcons } = await import('@iconify/utils'); - + // Extract only our used icons from the full set const extractedIcons = getIcons(icons, usedIcons); @@ -183,4 +183,4 @@ export default iconSet; main().catch(error => { console.error('❌ Script failed:', error); process.exit(1); -}); \ No newline at end of file +}); diff --git a/frontend/scripts/generate-licenses.js b/frontend/scripts/generate-licenses.js index aaac69800..0213be648 100644 --- a/frontend/scripts/generate-licenses.js +++ b/frontend/scripts/generate-licenses.js @@ -1,8 +1,8 @@ #!/usr/bin/env node -const { execSync } = require('child_process'); -const fs = require('fs'); -const path = require('path'); +import { execSync } from 'child_process'; +import fs from 'fs'; +import path from 'path'; /** * Generate 3rd party licenses for frontend dependencies diff --git a/frontend/src/tests/convert/ConvertE2E.spec.ts b/frontend/src/tests/convert/ConvertE2E.spec.ts index 60e2c4849..fdee4bfec 100644 --- a/frontend/src/tests/convert/ConvertE2E.spec.ts +++ b/frontend/src/tests/convert/ConvertE2E.spec.ts @@ -12,8 +12,8 @@ import { conversionDiscovery, type ConversionEndpoint } from '../helpers/conversionEndpointDiscovery'; -import * as path from 'path'; -import * as fs from 'fs'; +import path from 'path'; +import fs from 'fs'; // Test configuration const BASE_URL = process.env.BASE_URL || 'http://localhost:5173'; @@ -239,7 +239,6 @@ async function testConversion(page: Page, conversion: ConversionEndpoint) { // Save and verify file is not empty const path = await download.path(); if (path) { - const fs = require('fs'); const stats = fs.statSync(path); expect(stats.size).toBeGreaterThan(0);