138 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
/*
 | 
						||
 * @Author: your name
 | 
						||
 * @Date: 2022-02-10 10:20:44
 | 
						||
 * @LastEditTime: 2022-02-10 15:47:03
 | 
						||
 * @LastEditors: Please set LastEditors
 | 
						||
 * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 | 
						||
 * @FilePath: /low_code_designer_eslint/config/lint.js
 | 
						||
 */
 | 
						||
const configJSON = require('../config.json');
 | 
						||
const fs = require('fs');
 | 
						||
const { resolve } = require('path');
 | 
						||
const { spawn } = require('child_process');
 | 
						||
const consoleStyles = {
 | 
						||
    // 亮色
 | 
						||
    'bright': '\x1B[1m',
 | 
						||
    // 灰色
 | 
						||
    'grey': '\x1B[2m',
 | 
						||
    // 斜体
 | 
						||
    'italic': '\x1B[3m',
 | 
						||
    // 下划线
 | 
						||
    'underline': '\x1B[4m',
 | 
						||
    // 反向
 | 
						||
    'reverse': '\x1B[7m',
 | 
						||
    // 隐藏
 | 
						||
    'hidden': '\x1B[8m',
 | 
						||
    // 黑色
 | 
						||
    'black': '\x1B[30m',
 | 
						||
    // 红色
 | 
						||
    'red': '\x1B[31m',
 | 
						||
    // 绿色
 | 
						||
    'green': '\x1B[32m',
 | 
						||
    // 黄色
 | 
						||
    'yellow': '\x1B[33m',
 | 
						||
    // 蓝色
 | 
						||
    'blue': '\x1B[34m',
 | 
						||
    // 品红色
 | 
						||
    'magenta': '\x1B[35m',
 | 
						||
    // 青色
 | 
						||
    'cyan': '\x1B[36m',
 | 
						||
    // 白色
 | 
						||
    'white': '\x1B[37m',
 | 
						||
    // 背景黑色
 | 
						||
    'blackBG': '\x1B[40m',
 | 
						||
    // 红色
 | 
						||
    'redBG': '\x1B[41m',
 | 
						||
    // 绿色
 | 
						||
    'greenBG': '\x1B[42m',
 | 
						||
    // 黄色
 | 
						||
    'yellowBG': '\x1B[43m',
 | 
						||
    // 蓝色
 | 
						||
    'blueBG': '\x1B[44m',
 | 
						||
    // 品红色
 | 
						||
    'magentaBG': '\x1B[45m',
 | 
						||
    // 青色
 | 
						||
    'cyanBG': '\x1B[46m',
 | 
						||
    // 白色
 | 
						||
    'whiteBG': '\x1B[47m'
 | 
						||
};
 | 
						||
let lintConfig = configJSON.eslint || {};
 | 
						||
let cmd = resolve('./node_modules/.bin/eslint');
 | 
						||
let lintPaths = getLintPaths(lintConfig);
 | 
						||
 | 
						||
let lintArgs = [
 | 
						||
    '--ext', '.js',
 | 
						||
    '--ext', '.jsx',
 | 
						||
    ...lintPaths
 | 
						||
];
 | 
						||
if (lintConfig.autoFix === true) {
 | 
						||
    lintArgs.push('--fix');
 | 
						||
}
 | 
						||
console.log(cmd, lintArgs, lintConfig.autoFix);
 | 
						||
function getLintPaths(lintConfig) {
 | 
						||
    let paths = lintConfig.path || [];
 | 
						||
    let ret = paths.filter((path) => {
 | 
						||
        path = resolve(path);
 | 
						||
        return hasEsLintFile(path);
 | 
						||
    });
 | 
						||
    return ret;
 | 
						||
}
 | 
						||
function hasEsLintFile(path) {
 | 
						||
    let files = fs.readdirSync(path);
 | 
						||
    let idx = files.findIndex((file) => {
 | 
						||
        return file === '.eslintrc.js';
 | 
						||
    });
 | 
						||
    let sourceRoot = resolve(process.cwd(), `${configJSON.srcDir || 'src'}`);
 | 
						||
    let pPath = resolve(path, '../');
 | 
						||
    let ret = idx > -1;
 | 
						||
    if (!ret && sourceRoot !== pPath) {
 | 
						||
        ret = hasEsLintFile(resolve(path, '../'));
 | 
						||
    }
 | 
						||
    return ret;
 | 
						||
}
 | 
						||
function begin() {
 | 
						||
    if (!lintConfig.enable || lintPaths.length === 0) {
 | 
						||
        console.log(`${consoleStyles.bright}`, '----Eslint cancel');
 | 
						||
        console.log(`${consoleStyles.bright}`, '请确认是否配置需要lint的项目目录,或项目目录中是否配置.eslintrc')
 | 
						||
        return;
 | 
						||
    }
 | 
						||
    const execProcess = spawn(cmd, lintArgs, {
 | 
						||
        shell: process.platform === 'win32'
 | 
						||
    });
 | 
						||
    const stdCallBack = (data) => {
 | 
						||
        if (data.includes('ERROR')) {
 | 
						||
            throw new Error(data);
 | 
						||
        } else {
 | 
						||
            let str = `${data}`;
 | 
						||
            let arr = str ? str.split('\n') : [];
 | 
						||
            arr.forEach((row) => {
 | 
						||
                if (isError(row)) {
 | 
						||
                    console.log(consoleStyles.red, `${row}\n`);
 | 
						||
                } else if (isWarning(row)) {
 | 
						||
                    console.log(consoleStyles.yellow, `${row}\n`);
 | 
						||
                } else {
 | 
						||
                    console.log(`${consoleStyles.italic}${consoleStyles.blue}`, `${row}\n`);
 | 
						||
                }
 | 
						||
            })
 | 
						||
 | 
						||
            // data && console.log(`${data}`);
 | 
						||
        }
 | 
						||
    };
 | 
						||
    execProcess.stdout.on('data', stdCallBack);
 | 
						||
    execProcess.stderr.on('data', stdCallBack);
 | 
						||
    execProcess.on('close', () => {
 | 
						||
        console.log(`${consoleStyles.bright}`, '----Done');
 | 
						||
    });
 | 
						||
}
 | 
						||
 | 
						||
function isError(row) {
 | 
						||
    let test = row.toLowerCase();
 | 
						||
    return test.indexOf('error') > -1 || test.indexOf('err') > -1;
 | 
						||
}
 | 
						||
function isWarning(row) {
 | 
						||
    let test = row.toLowerCase();
 | 
						||
    return test.indexOf('warning') > -1 || test.indexOf('warn') > -1;
 | 
						||
}
 | 
						||
 | 
						||
begin();
 |