@fenge/eslint-config
Version:
A super strict eslint config for linting js/ts/package.json.
65 lines • 9.56 kB
JavaScript
import childProcess from "node:child_process";
import checkFilePlugin from "eslint-plugin-check-file";
export function base(options, enabled) {
const filesMap = {
js: "**/*.{js,cjs,mjs,jsx}",
ts: "**/*.{ts,cts,mts,tsx}",
pkg: "**/package.json",
html: "**/*.html",
};
const blockedFilesMap = {
// Comment out "**/.env.*" and "**/.*rc" because of parsing error.
// TODO: We should disable "**/.env.*" and "**/.*rc" patterns later in another way.
// "**/.env.*": ".*.env",
// "**/.*rc": "*.config.js",
"**/.*rc.*": "*.config.*",
"**/*.{cjs,mjs,cts,mts}": "*.{js,ts}",
"**/*.spec.{js,cjs,mjs,jsx,ts,cts,mts,tsx}": "*.test.{js,cjs,mjs,jsx,ts,cts,mts,tsx}", // Node.js built-in support *.test.js. See https://nodejs.org/api/test.html#running-tests-from-the-command-line.
"**/.*.{js,cjs,mjs,jsx,ts,cts,mts,tsx}": "*.{js,cjs,mjs,jsx,ts,cts,mts,tsx}",
"**/*.d.*.{ts,cts,mts,tsx}": "**/*.d.{ts,cts,mts,tsx}",
};
const enabledPatterns = [...enabled].map((key) => filesMap[key]);
const blockedPatterns = Object.keys(blockedFilesMap);
return [
// Global ignore. Refer: https://eslint.org/docs/latest/use/configure/configuration-files#specifying-files-and-ignores.
{
name: "fenge/gitignore",
// There are 2 kinds of exception when running `git ls-files`:
// 1. Git is not installed. The `stdout` will be null.
// 2. The running directory is not initialized by `git init` command. The `stdout` will an empty string.
ignores: [
...(childProcess.spawnSync("git", [
"ls-files",
"--others",
"--ignored",
"--exclude-standard",
"--directory",
], { encoding: "utf8" }).stdout || "")
.split("\n")
.map((line) => line.trim())
.filter(Boolean),
...(options.ignores ?? []),
],
},
{
name: "fenge/common",
files: [...enabledPatterns, ...blockedPatterns],
...(options.linterOptions
? { linterOptions: options.linterOptions }
: {}),
plugins: {
"check-file": checkFilePlugin,
},
rules: {
"check-file/filename-blocklist": [
"error",
Object.fromEntries(Object.entries({
...blockedFilesMap,
...options.blockedFiles,
}).filter(([_, value]) => value)),
],
},
},
];
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFlBQVksTUFBTSxvQkFBb0IsQ0FBQztBQUU5QyxPQUFPLGVBQWUsTUFBTSwwQkFBMEIsQ0FBQztBQWdCdkQsTUFBTSxVQUFVLElBQUksQ0FDbEIsT0FBb0IsRUFDcEIsT0FBMEM7SUFFMUMsTUFBTSxRQUFRLEdBQUc7UUFDZixFQUFFLEVBQUUsdUJBQXVCO1FBQzNCLEVBQUUsRUFBRSx1QkFBdUI7UUFDM0IsR0FBRyxFQUFFLGlCQUFpQjtRQUN0QixJQUFJLEVBQUUsV0FBVztLQUNULENBQUM7SUFDWCxNQUFNLGVBQWUsR0FBRztRQUN0QixrRUFBa0U7UUFDbEUsbUZBQW1GO1FBQ25GLHlCQUF5QjtRQUN6Qiw0QkFBNEI7UUFDNUIsV0FBVyxFQUFFLFlBQVk7UUFFekIsd0JBQXdCLEVBQUUsV0FBVztRQUNyQywyQ0FBMkMsRUFDekMsd0NBQXdDLEVBQUUsZ0hBQWdIO1FBQzVKLHVDQUF1QyxFQUNyQyxtQ0FBbUM7UUFFckMsMkJBQTJCLEVBQUUseUJBQXlCO0tBQzlDLENBQUM7SUFFWCxNQUFNLGVBQWUsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNqRSxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3JELE9BQU87UUFDTCx1SEFBdUg7UUFDdkg7WUFDRSxJQUFJLEVBQUUsaUJBQWlCO1lBQ3ZCLDhEQUE4RDtZQUM5RCxzREFBc0Q7WUFDdEQsd0dBQXdHO1lBQ3hHLE9BQU8sRUFBRTtnQkFDUCxHQUFHLENBQ0QsWUFBWSxDQUFDLFNBQVMsQ0FDcEIsS0FBSyxFQUNMO29CQUNFLFVBQVU7b0JBQ1YsVUFBVTtvQkFDVixXQUFXO29CQUNYLG9CQUFvQjtvQkFDcEIsYUFBYTtpQkFDZCxFQUNELEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUNyQixDQUFDLE1BQU0sSUFBSSxFQUFFLENBQ2Y7cUJBQ0UsS0FBSyxDQUFDLElBQUksQ0FBQztxQkFDWCxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztxQkFDMUIsTUFBTSxDQUFDLE9BQU8sQ0FBQztnQkFDbEIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO2FBQzNCO1NBQ0Y7UUFDRDtZQUNFLElBQUksRUFBRSxjQUFjO1lBQ3BCLEtBQUssRUFBRSxDQUFDLEdBQUcsZUFBZSxFQUFFLEdBQUcsZUFBZSxDQUFDO1lBQy9DLEdBQUcsQ0FBQyxPQUFPLENBQUMsYUFBYTtnQkFDdkIsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLE9BQU8sQ0FBQyxhQUFhLEVBQUU7Z0JBQzFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDUCxPQUFPLEVBQUU7Z0JBQ1AsWUFBWSxFQUFFLGVBQWU7YUFDOUI7WUFDRCxLQUFLLEVBQUU7Z0JBQ0wsK0JBQStCLEVBQUU7b0JBQy9CLE9BQU87b0JBQ1AsTUFBTSxDQUFDLFdBQVcsQ0FDaEIsTUFBTSxDQUFDLE9BQU8sQ0FBaUI7d0JBQzdCLEdBQUcsZUFBZTt3QkFDbEIsR0FBRyxPQUFPLENBQUMsWUFBWTtxQkFDeEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FDakM7aUJBQ0Y7YUFDRjtTQUNGO0tBQ08sQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2hpbGRQcm9jZXNzIGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB0eXBlIHsgTGludGVyIH0gZnJvbSBcImVzbGludFwiO1xuaW1wb3J0IGNoZWNrRmlsZVBsdWdpbiBmcm9tIFwiZXNsaW50LXBsdWdpbi1jaGVjay1maWxlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZU9wdGlvbnMge1xuICBsaW50ZXJPcHRpb25zPzogTGludGVyLkxpbnRlck9wdGlvbnM7XG4gIC8qKlxuICAgKiBUaGUga2V5IHJlcHJlc2VudHMgdGhlIGZpbGUgcGF0dGVybiB0byBibG9jay5cbiAgICogSWYgdGhlIHZhbHVlIGlzIGBmYWxzZWAsIGZpbGVzIG1hdGNoaW5nIHRoZSBrZXkgcGF0dGVybiBhcmUgYWxsb3dlZC5cbiAgICogSWYgdGhlIHZhbHVlIGlzIGEgYHN0cmluZ2AsIGZpbGVzIG1hdGNoaW5nIHRoZSBrZXkgcGF0dGVybiBhcmUgYmxvY2tlZCwgYW5kIHRoZSBzdHJpbmcgaW5kaWNhdGVzIHRoZSBwcmVmZXJyZWQgZmlsZW5hbWUgcGF0dGVybi5cbiAgICovXG4gIGJsb2NrZWRGaWxlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGZhbHNlPjtcbiAgLyoqXG4gICAqIFRoZSBmaWxlIHBhdHRlcm5zIHRvIGlnbm9yZS4gRmlsZXMgbWF0Y2hpbmcgdGhlIHBhdHRlcm4gYXJlIG5vdCBsaW50ZWQuXG4gICAqL1xuICBpZ25vcmVzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiYXNlKFxuICBvcHRpb25zOiBCYXNlT3B0aW9ucyxcbiAgZW5hYmxlZDogU2V0PFwianNcIiB8IFwidHNcIiB8IFwicGtnXCIgfCBcImh0bWxcIj4sXG4pOiBMaW50ZXIuQ29uZmlnW10ge1xuICBjb25zdCBmaWxlc01hcCA9IHtcbiAgICBqczogXCIqKi8qLntqcyxjanMsbWpzLGpzeH1cIixcbiAgICB0czogXCIqKi8qLnt0cyxjdHMsbXRzLHRzeH1cIixcbiAgICBwa2c6IFwiKiovcGFja2FnZS5qc29uXCIsXG4gICAgaHRtbDogXCIqKi8qLmh0bWxcIixcbiAgfSBhcyBjb25zdDtcbiAgY29uc3QgYmxvY2tlZEZpbGVzTWFwID0ge1xuICAgIC8vIENvbW1lbnQgb3V0IFwiKiovLmVudi4qXCIgYW5kIFwiKiovLipyY1wiIGJlY2F1c2Ugb2YgcGFyc2luZyBlcnJvci5cbiAgICAvLyBUT0RPOiBXZSBzaG91bGQgZGlzYWJsZSBcIioqLy5lbnYuKlwiIGFuZCBcIioqLy4qcmNcIiBwYXR0ZXJucyBsYXRlciBpbiBhbm90aGVyIHdheS5cbiAgICAvLyBcIioqLy5lbnYuKlwiOiBcIi4qLmVudlwiLFxuICAgIC8vIFwiKiovLipyY1wiOiBcIiouY29uZmlnLmpzXCIsXG4gICAgXCIqKi8uKnJjLipcIjogXCIqLmNvbmZpZy4qXCIsXG5cbiAgICBcIioqLyoue2NqcyxtanMsY3RzLG10c31cIjogXCIqLntqcyx0c31cIixcbiAgICBcIioqLyouc3BlYy57anMsY2pzLG1qcyxqc3gsdHMsY3RzLG10cyx0c3h9XCI6XG4gICAgICBcIioudGVzdC57anMsY2pzLG1qcyxqc3gsdHMsY3RzLG10cyx0c3h9XCIsIC8vIE5vZGUuanMgYnVpbHQtaW4gc3VwcG9ydCAqLnRlc3QuanMuIFNlZSBodHRwczovL25vZGVqcy5vcmcvYXBpL3Rlc3QuaHRtbCNydW5uaW5nLXRlc3RzLWZyb20tdGhlLWNvbW1hbmQtbGluZS5cbiAgICBcIioqLy4qLntqcyxjanMsbWpzLGpzeCx0cyxjdHMsbXRzLHRzeH1cIjpcbiAgICAgIFwiKi57anMsY2pzLG1qcyxqc3gsdHMsY3RzLG10cyx0c3h9XCIsXG5cbiAgICBcIioqLyouZC4qLnt0cyxjdHMsbXRzLHRzeH1cIjogXCIqKi8qLmQue3RzLGN0cyxtdHMsdHN4fVwiLFxuICB9IGFzIGNvbnN0O1xuXG4gIGNvbnN0IGVuYWJsZWRQYXR0ZXJucyA9IFsuLi5lbmFibGVkXS5tYXAoKGtleSkgPT4gZmlsZXNNYXBba2V5XSk7XG4gIGNvbnN0IGJsb2NrZWRQYXR0ZXJucyA9IE9iamVjdC5rZXlzKGJsb2NrZWRGaWxlc01hcCk7XG4gIHJldHVybiBbXG4gICAgLy8gR2xvYmFsIGlnbm9yZS4gUmVmZXI6IGh0dHBzOi8vZXNsaW50Lm9yZy9kb2NzL2xhdGVzdC91c2UvY29uZmlndXJlL2NvbmZpZ3VyYXRpb24tZmlsZXMjc3BlY2lmeWluZy1maWxlcy1hbmQtaWdub3Jlcy5cbiAgICB7XG4gICAgICBuYW1lOiBcImZlbmdlL2dpdGlnbm9yZVwiLFxuICAgICAgLy8gVGhlcmUgYXJlIDIga2luZHMgb2YgZXhjZXB0aW9uIHdoZW4gcnVubmluZyBgZ2l0IGxzLWZpbGVzYDpcbiAgICAgIC8vIDEuIEdpdCBpcyBub3QgaW5zdGFsbGVkLiBUaGUgYHN0ZG91dGAgd2lsbCBiZSBudWxsLlxuICAgICAgLy8gMi4gVGhlIHJ1bm5pbmcgZGlyZWN0b3J5IGlzIG5vdCBpbml0aWFsaXplZCBieSBgZ2l0IGluaXRgIGNvbW1hbmQuIFRoZSBgc3Rkb3V0YCB3aWxsIGFuIGVtcHR5IHN0cmluZy5cbiAgICAgIGlnbm9yZXM6IFtcbiAgICAgICAgLi4uKFxuICAgICAgICAgIGNoaWxkUHJvY2Vzcy5zcGF3blN5bmMoXG4gICAgICAgICAgICBcImdpdFwiLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBcImxzLWZpbGVzXCIsXG4gICAgICAgICAgICAgIFwiLS1vdGhlcnNcIixcbiAgICAgICAgICAgICAgXCItLWlnbm9yZWRcIixcbiAgICAgICAgICAgICAgXCItLWV4Y2x1ZGUtc3RhbmRhcmRcIixcbiAgICAgICAgICAgICAgXCItLWRpcmVjdG9yeVwiLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0sXG4gICAgICAgICAgKS5zdGRvdXQgfHwgXCJcIlxuICAgICAgICApXG4gICAgICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAgICAgLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpXG4gICAgICAgICAgLmZpbHRlcihCb29sZWFuKSxcbiAgICAgICAgLi4uKG9wdGlvbnMuaWdub3JlcyA/PyBbXSksXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJmZW5nZS9jb21tb25cIixcbiAgICAgIGZpbGVzOiBbLi4uZW5hYmxlZFBhdHRlcm5zLCAuLi5ibG9ja2VkUGF0dGVybnNdLFxuICAgICAgLi4uKG9wdGlvbnMubGludGVyT3B0aW9uc1xuICAgICAgICA/IHsgbGludGVyT3B0aW9uczogb3B0aW9ucy5saW50ZXJPcHRpb25zIH1cbiAgICAgICAgOiB7fSksXG4gICAgICBwbHVnaW5zOiB7XG4gICAgICAgIFwiY2hlY2stZmlsZVwiOiBjaGVja0ZpbGVQbHVnaW4sXG4gICAgICB9LFxuICAgICAgcnVsZXM6IHtcbiAgICAgICAgXCJjaGVjay1maWxlL2ZpbGVuYW1lLWJsb2NrbGlzdFwiOiBbXG4gICAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzPHN0cmluZyB8IGZhbHNlPih7XG4gICAgICAgICAgICAgIC4uLmJsb2NrZWRGaWxlc01hcCxcbiAgICAgICAgICAgICAgLi4ub3B0aW9ucy5ibG9ja2VkRmlsZXMsXG4gICAgICAgICAgICB9KS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlKSxcbiAgICAgICAgICApLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICBdIGFzIGNvbnN0O1xufVxuIl19