* web: update to ESLint 9 ESLint 9 has been out for awhile now, and all of the plug-ins that we use have caught up, so it is time to bite the bullet and upgrade. This commit: - upgrades to ESLint 9, and upgrades all associated plugins - Replaces the `.eslintrc` and `.eslintignore` files with the new, "flat" configuration file, "eslint.config.mjs". - Places the previous "precommit" and "nightmare" rules in `./scripts/eslint.precommit.mjs` and `./scripts/eslint.nightmare.mjs`, respectively - Replaces the scripted wrappers for eslint (`eslint`, `eslint-precommit`) with a single executable that takes the arguments `--precommit`, which applies a stricter set of rules, and `--nightmare`, which applies an even more terrifyingly strict set of rules. - Provides the scripted wrapper `./scripts/eslint.mjs` so that eslint can be run from `bun`, if one so chooses. - Fixes *all* of the lint `eslint.config.mjs` now finds, including removing all of the `eslint` styling rules and overrides because Eslint now proudly leaves that entirely up to Prettier. To shut Dependabot up about ESLint. * Added explanation for no-console removal. * web: did not need the old and unmaintained nightmare mode; it can be configured directly.
		
			
				
	
	
		
			57 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import { execFileSync } from "child_process";
 | 
						|
import { ESLint } from "eslint";
 | 
						|
import fs from "fs";
 | 
						|
import path from "path";
 | 
						|
import process from "process";
 | 
						|
import { fileURLToPath } from "url";
 | 
						|
 | 
						|
function changedFiles() {
 | 
						|
    const gitStatus = execFileSync("git", ["diff", "--name-only", "HEAD"], { encoding: "utf8" });
 | 
						|
    const gitUntracked = execFileSync("git", ["ls-files", "--others", "--exclude-standard"], {
 | 
						|
        encoding: "utf8",
 | 
						|
    });
 | 
						|
 | 
						|
    const changed = gitStatus
 | 
						|
        .split("\n")
 | 
						|
        .filter((line) => line.trim().substring(0, 4) === "web/")
 | 
						|
        .filter((line) => /\.(m|c)?(t|j)s$/.test(line))
 | 
						|
        .map((line) => line.substring(4))
 | 
						|
        .filter((line) => fs.existsSync(line));
 | 
						|
 | 
						|
    const untracked = gitUntracked
 | 
						|
        .split("\n")
 | 
						|
        .filter((line) => /\.(m|c)?(t|j)s$/.test(line))
 | 
						|
        .filter((line) => fs.existsSync(line));
 | 
						|
 | 
						|
    const sourceFiles = [...changed, ...untracked].filter((line) => /^src\//.test(line));
 | 
						|
    const scriptFiles = [...changed, ...untracked].filter(
 | 
						|
        (line) => /^scripts\//.test(line) || !/^src\//.test(line),
 | 
						|
    );
 | 
						|
 | 
						|
    return [...sourceFiles, ...scriptFiles];
 | 
						|
}
 | 
						|
 | 
						|
const __dirname = fileURLToPath(new URL(".", import.meta.url));
 | 
						|
const projectRoot = path.join(__dirname, "..");
 | 
						|
process.chdir(projectRoot);
 | 
						|
 | 
						|
const hasFlag = (flags) => process.argv.length > 1 && flags.includes(process.argv[2]);
 | 
						|
 | 
						|
const [configFile, files] = hasFlag(["-n", "--nightmare"])
 | 
						|
    ? [path.join(__dirname, "eslint.nightmare.mjs"), changedFiles()]
 | 
						|
    : hasFlag(["-p", "--precommit"])
 | 
						|
      ? [path.join(__dirname, "eslint.precommit.mjs"), changedFiles()]
 | 
						|
      : [path.join(projectRoot, "eslint.config.mjs"), ["."]];
 | 
						|
 | 
						|
const eslint = new ESLint({
 | 
						|
    overrideConfigFile: configFile,
 | 
						|
    warnIgnored: false,
 | 
						|
});
 | 
						|
 | 
						|
const results = await eslint.lintFiles(files);
 | 
						|
const formatter = await eslint.loadFormatter("stylish");
 | 
						|
const resultText = formatter.format(results);
 | 
						|
const errors = results.reduce((acc, result) => acc + result.errorCount, 0);
 | 
						|
console.log(resultText);
 | 
						|
process.exit(errors > 1 ? 1 : 0);
 |