bsg
Version:
Lint all in one tool for BSG-FE
101 lines (80 loc) • 2.96 kB
JavaScript
const fs = require("fs");
const path = require("path");
const globby = require("globby");
const packageJSON = require(path.resolve("package.json"));
const { dependencies, devDependencies } = packageJSON;
const isVueProject = !!(dependencies.vue || devDependencies.vue);
let ESLint = require("eslint").ESLint;
module.exports = async function ({ fix, files }) {
let baseConfigPath = path.resolve(__dirname, "../../.eslintrc.js");
const customConfigPath = path.resolve(".eslintrc.js");
// 有两种情况会优先调用 bsg 依赖的 eslint
// 1. 用户指定使用 bsg 的配置文件
// 2. 用户删除了根目录的配置文件(有可能会忘了指定为 bsg 的配置文件)
let isUseBSGConfig = false;
let isNoRootConfig = true;
if (fs.existsSync(customConfigPath)) {
baseConfigPath = customConfigPath;
isNoRootConfig = false;
}
const settingsJsonPath = path.resolve(".vscode/settings.json");
if (fs.existsSync(settingsJsonPath)) {
try {
const settingsJson = require(settingsJsonPath);
if (
settingsJson["eslint.options"]["overrideConfigFile"] ===
"node_modules/bsg/.eslintrc.js"
) {
isUseBSGConfig = true;
}
} catch (e) {
// eslint-disable-next-line no-empty
}
}
if (isUseBSGConfig || isNoRootConfig) {
try {
ESLint = require("bsg/node_modules/eslint").ESLint;
} catch (e) {
// eslint-disable-next-line no-empty
}
}
const options = {
baseConfig: require(baseConfigPath),
extensions: [".js", ".jsx", ".ts", ".tsx", ".vue"],
fix,
};
const eslint = new ESLint(options);
const lintFilesPatterns = files
? files
: await getGlobalLintFilesPatterns(eslint);
const results = await eslint.lintFiles(lintFilesPatterns);
fix && (await ESLint.outputFixes(results));
const formatter = await eslint.loadFormatter("stylish");
const resultText = formatter.format(results);
if (resultText) console.log(resultText);
};
/** 获取需要被校验的所有文件列表 */
async function getGlobalLintFilesPatterns(eslint) {
/** 默认针对整个项目目录做校验 */
let lintFilesPatterns = path.resolve();
// 如果是 Vue 项目,校验范围与官方保持一直,即 src、tests 文件夹中未被 eslint 忽略的文件以及根目录中的 js、ts 文件
if (isVueProject) {
let allFilesInTargetDir = await globby(
["src", "tests", "*.js", ".*.js", "*.ts", ".*.ts"],
{
cwd: path.resolve(),
absolute: true,
expandDirectories: {
extensions: ["js", "jsx", "ts", "tsx", "vue"],
},
},
);
const filesToLint = [];
for (let i = 0; i < allFilesInTargetDir.length; i++) {
const isPathIgnored = await eslint.isPathIgnored(allFilesInTargetDir[i]);
if (!isPathIgnored) filesToLint.push(allFilesInTargetDir[i]);
}
lintFilesPatterns = filesToLint;
}
return lintFilesPatterns;
}