UNPKG

bsg

Version:

Lint all in one tool for BSG-FE

101 lines (80 loc) 2.96 kB
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; }