From 6fdc0924414dae5e360b1709fe320c0ba7b367f7 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sat, 14 Feb 2026 14:16:23 +0000 Subject: [PATCH] refactor: make exclusions in check scripts configurable Refactor `scripts/check-file-size.mjs` and `scripts/check-innerhtml.mjs` to use `node:util.parseArgs` for parsing command-line arguments. This allows users to configure directory and file exclusions via `--exclude-dir`, `--exclude-file`, and `--no-defaults`, instead of relying on hardcoded lists. This change improves versatility while maintaining backward compatibility by keeping the original hardcoded lists as defaults. It also adds support for `--max-lines` in `check-file-size.mjs` and `--help` in both scripts. Verification: - Manually verified that both scripts respect the new flags and defaults. - Confirmed that `--report` mode still works as expected. - Confirmed that unknown flags (like `--update`) are safely ignored (due to `strict: false`). Co-authored-by: PR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com> --- scripts/check-file-size.mjs | 94 ++++++++++++++++++++++++++----------- scripts/check-innerhtml.mjs | 89 ++++++++++++++++++++++++++--------- 2 files changed, 133 insertions(+), 50 deletions(-) diff --git a/scripts/check-file-size.mjs b/scripts/check-file-size.mjs index c09f8ef..a447bd7 100644 --- a/scripts/check-file-size.mjs +++ b/scripts/check-file-size.mjs @@ -1,9 +1,10 @@ import fs from 'node:fs'; import path from 'node:path'; +import { parseArgs } from 'node:util'; -const MAX_LINES = 300; -const EXCLUDED_DIRS = ['node_modules', '.git', 'dist', 'artifacts', 'test_logs', 'coverage']; -const EXCLUDED_FILES = ['package-lock.json']; +const DEFAULT_MAX_LINES = 300; +const DEFAULT_EXCLUDED_DIRS = ['node_modules', '.git', 'dist', 'artifacts', 'test_logs', 'coverage']; +const DEFAULT_EXCLUDED_FILES = ['package-lock.json']; function countLines(filePath) { try { @@ -15,36 +16,75 @@ function countLines(filePath) { } } -function scanDirectory(dir) { - let files = []; - try { - const items = fs.readdirSync(dir); - for (const item of items) { - const fullPath = path.join(dir, item); - const stat = fs.statSync(fullPath); +function main() { + const { values } = parseArgs({ + options: { + 'max-lines': { type: 'string' }, + 'exclude-dir': { type: 'string', multiple: true }, + 'exclude-file': { type: 'string', multiple: true }, + 'no-defaults': { type: 'boolean' }, + 'report': { type: 'boolean' }, + 'help': { type: 'boolean' }, + }, + strict: false, + }); - if (stat.isDirectory()) { - if (!EXCLUDED_DIRS.includes(item)) { - files = files.concat(scanDirectory(fullPath)); - } - } else if (stat.isFile()) { - if (EXCLUDED_FILES.includes(item)) { - continue; - } - if (['.js', '.mjs', '.ts', '.html', '.css', '.json', '.md'].includes(path.extname(item))) { - files.push(fullPath); + if (values.help) { + console.log(` +Usage: check-file-size.mjs [options] + +Options: + --max-lines Max lines allowed (default: ${DEFAULT_MAX_LINES}) + --exclude-dir Exclude directory (can be used multiple times) + --exclude-file Exclude file (can be used multiple times) + --no-defaults Do not use default exclusions + --report Report mode (exit code 0 even if violations found) + --help Show this help +`); + process.exit(0); + } + + const MAX_LINES = values['max-lines'] ? parseInt(values['max-lines'], 10) : DEFAULT_MAX_LINES; + const noDefaults = values['no-defaults'] || false; + + const EXCLUDED_DIRS = noDefaults ? [] : [...DEFAULT_EXCLUDED_DIRS]; + if (values['exclude-dir']) { + EXCLUDED_DIRS.push(...values['exclude-dir']); + } + + const EXCLUDED_FILES = noDefaults ? [] : [...DEFAULT_EXCLUDED_FILES]; + if (values['exclude-file']) { + EXCLUDED_FILES.push(...values['exclude-file']); + } + + function scanDirectory(dir) { + let files = []; + try { + const items = fs.readdirSync(dir); + for (const item of items) { + const fullPath = path.join(dir, item); + const stat = fs.statSync(fullPath); + + if (stat.isDirectory()) { + if (!EXCLUDED_DIRS.includes(item)) { + files = files.concat(scanDirectory(fullPath)); + } + } else if (stat.isFile()) { + if (EXCLUDED_FILES.includes(item)) { + continue; + } + if (['.js', '.mjs', '.ts', '.html', '.css', '.json', '.md'].includes(path.extname(item))) { + files.push(fullPath); + } } } + } catch (error) { + console.error(`Error scanning ${dir}: ${error.message}`); } - } catch (error) { - console.error(`Error scanning ${dir}: ${error.message}`); + return files; } - return files; -} -function main() { - const args = process.argv.slice(2); - const reportMode = args.includes('--report'); + const reportMode = values.report; const files = scanDirectory('.'); let oversizedCount = 0; diff --git a/scripts/check-innerhtml.mjs b/scripts/check-innerhtml.mjs index be27bb8..41110eb 100644 --- a/scripts/check-innerhtml.mjs +++ b/scripts/check-innerhtml.mjs @@ -1,8 +1,10 @@ import fs from 'node:fs'; import path from 'node:path'; +import { parseArgs } from 'node:util'; -const EXCLUDED_DIRS = ['node_modules', '.git', 'dist', 'artifacts', 'test_logs', 'coverage']; -const TARGET_EXTENSIONS = ['.js', '.mjs', '.ts', '.html']; +const DEFAULT_EXCLUDED_DIRS = ['node_modules', '.git', 'dist', 'artifacts', 'test_logs', 'coverage']; +const DEFAULT_TARGET_EXTENSIONS = ['.js', '.mjs', '.ts', '.html']; +const DEFAULT_EXCLUDED_FILES = []; function countInnerHTML(filePath) { try { @@ -17,33 +19,74 @@ function countInnerHTML(filePath) { } } -function scanDirectory(dir) { - let files = []; - try { - const items = fs.readdirSync(dir); - for (const item of items) { - const fullPath = path.join(dir, item); - const stat = fs.statSync(fullPath); +function main() { + const { values } = parseArgs({ + options: { + 'exclude-dir': { type: 'string', multiple: true }, + 'exclude-file': { type: 'string', multiple: true }, + 'no-defaults': { type: 'boolean' }, + 'report': { type: 'boolean' }, + 'help': { type: 'boolean' }, + }, + strict: false, + }); - if (stat.isDirectory()) { - if (!EXCLUDED_DIRS.includes(item)) { - files = files.concat(scanDirectory(fullPath)); - } - } else if (stat.isFile()) { - if (TARGET_EXTENSIONS.includes(path.extname(item))) { - files.push(fullPath); + if (values.help) { + console.log(` +Usage: check-innerhtml.mjs [options] + +Options: + --exclude-dir Exclude directory (can be used multiple times) + --exclude-file Exclude file (can be used multiple times) + --no-defaults Do not use default exclusions + --report Report mode (exit code 0 even if violations found) + --help Show this help +`); + process.exit(0); + } + + const noDefaults = values['no-defaults'] || false; + + const EXCLUDED_DIRS = noDefaults ? [] : [...DEFAULT_EXCLUDED_DIRS]; + if (values['exclude-dir']) { + EXCLUDED_DIRS.push(...values['exclude-dir']); + } + + const EXCLUDED_FILES = noDefaults ? [] : [...DEFAULT_EXCLUDED_FILES]; + if (values['exclude-file']) { + EXCLUDED_FILES.push(...values['exclude-file']); + } + + const TARGET_EXTENSIONS = DEFAULT_TARGET_EXTENSIONS; + + function scanDirectory(dir) { + let files = []; + try { + const items = fs.readdirSync(dir); + for (const item of items) { + const fullPath = path.join(dir, item); + const stat = fs.statSync(fullPath); + + if (stat.isDirectory()) { + if (!EXCLUDED_DIRS.includes(item)) { + files = files.concat(scanDirectory(fullPath)); + } + } else if (stat.isFile()) { + if (EXCLUDED_FILES.includes(item)) { + continue; + } + if (TARGET_EXTENSIONS.includes(path.extname(item))) { + files.push(fullPath); + } } } + } catch (error) { + console.error(`Error scanning ${dir}: ${error.message}`); } - } catch (error) { - console.error(`Error scanning ${dir}: ${error.message}`); + return files; } - return files; -} -function main() { - const args = process.argv.slice(2); - const reportMode = args.includes('--report'); + const reportMode = values.report; const files = scanDirectory('.'); let totalAssignments = 0;