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();
							 |