import globby from 'globby'; import ignore from 'ignore'; import fs from 'fs'; import { join, relative } from 'path'; function transformOptions( result, item, key ) { result.push(`--${key}`); if (typeof item[key] !== 'boolean') { result.push(item[key]); } } export function getExistFile( { cwd, files, returnRelative } ) { for (const file of files) { const absFilePath = join(cwd, file); if (fs.existsSync(absFilePath)) { return returnRelative ? file : absFilePath; } } } // 获取其他需要忽略的规则 function getIgnores( cwd: string ) { let ignores = []; globby .sync('**/.eslintignore', { ignore: ['**/node_modules/**'], cwd, }) .forEach(file => { const result = fs .readFileSync(file, 'utf8') .split(/\r?\n/) .filter(Boolean) .filter(line => line.charAt(0) !== '#'); ignores = ignores.concat(result); }); return ignores; } export function endsWithArray( str, arr ) { return new RegExp(`${arr.join('$|')}$`).test(str); } export function getFiles( patterns: string[], cwd: string ) { const result = globby .sync(patterns, { gitignore: true, ignore: ['**/node_modules/**', '.git'], onlyFiles: true, dot: true }) .map(item => { // ignore 包必须使用相对路径 return relative(cwd, item); }); return ignore() .add(getIgnores(cwd)) .filter(result); } export function parseSubOptions( option: any ) { if (Array.isArray(option)) { return option .filter(item => typeof item === 'object') .reduce((result, item) => { const key = Object.keys(item)[0]; transformOptions(result, item, key); return result; }, []); } else if (typeof option === 'object') { const result = []; Object.keys(option).forEach(key => { transformOptions(result, option, key); }); return result; } return []; } export function getEsLintExtensions(options) { const index = options.indexOf('--ext'); if (index !== -1) { return options[index + 1].split(','); } return ['.js', '.jsx']; }