UNPKG

@iceworks/doctor

Version:

Analyse and running codemods over react/rax projects, troubleshooting and automatically fixing errors

118 lines (117 loc) 4.34 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var fs = require("fs-extra"); var path = require("path"); var ignore_1 = require("ignore"); var eslint_1 = require("eslint"); var spec_1 = require("@iceworks/spec"); var getCustomESLintConfig_1 = require("./getCustomESLintConfig"); var Scorer_1 = require("../../Scorer"); // level waring minus 1 point var WARNING_WEIGHT = -1; // level error minus 3 point var ERROR_WEIGHT = -3; // bonus add 2 point var BONUS_WEIGHT = 2; var SUPPORT_FILE_REG = /(\.js|\.jsx|\.ts|\.tsx|\.vue|package\.json)$/; function getEslintReports(directory, files, ruleKey, fix) { var fixErr = fix === 'true'; var customConfig = getCustomESLintConfig_1.default(directory) || {}; if (ruleKey.indexOf('ts') !== -1) { if (!customConfig.parserOptions) { customConfig.parserOptions = {}; } if (fs.existsSync(path.join(directory, './tsconfig.json'))) { customConfig.parserOptions.project = path.join(directory, './tsconfig.json'); } } var warningScore = 0; var warningCount = 0; var errorScore = 0; var errorCount = 0; // package.json object var packageInfo = {}; var reports = []; var cliEngine = new eslint_1.CLIEngine({ cache: false, baseConfig: spec_1.deepmerge(spec_1.getESLintConfig(ruleKey), customConfig), // Use plugin in @iceworks/spec cwd: path.dirname(require.resolve('@iceworks/spec')), fix: !!fixErr, useEslintrc: false, }); var ig = ignore_1.default(); var ignoreConfigFilePath = path.join(directory, '.eslintignore'); if (fs.existsSync(ignoreConfigFilePath)) { ig.add(fs.readFileSync(ignoreConfigFilePath).toString()); } var targetFiles = files.filter(function (file) { if (file.path.endsWith('package.json')) { packageInfo = JSON.parse(file.source); } return SUPPORT_FILE_REG.test(file.path) && !ig.ignores(file.path.replace(path.join(directory, '/'), '')); }).map(function (file) { // Use absolute path return file.path.startsWith('.') ? path.join(process.cwd(), file.path) : file.path; }); var data = cliEngine.executeOnFiles(targetFiles); if (fixErr) { // output fixes to disk eslint_1.CLIEngine.outputFixes(data); } (data.results || []).forEach(function (result) { // Remove Parsing error result.messages = (result.messages || []).filter(function (message) { if (message.severity === 2 && ( // Ignore Parsing error (message.fatal && message.message.startsWith('Parsing error:')) || // Ignore no rules error message.message.startsWith('Definition for rule'))) { result.errorCount--; return false; } return true; }); reports.push(result); }); // calculate score reports.forEach(function (report) { // Add critical level calculate. (report.messages || []).forEach(function (message) { if (message.message.indexOf('[Critical]') === 0) { if (message.severity === 2) { // Critical error errorScore += ERROR_WEIGHT; } else { // Critical warning warningScore += WARNING_WEIGHT; } } }); warningCount += report.warningCount; warningScore += report.warningCount * WARNING_WEIGHT; errorCount += report.errorCount; errorScore += report.errorCount * ERROR_WEIGHT; }); var scorer = new Scorer_1.default(); scorer.plus(warningScore); scorer.plus(errorScore); // Calculate bonus // recommend-deps-fusion-design if (packageInfo.dependencies && packageInfo.dependencies['@alifd/next']) { scorer.plus(BONUS_WEIGHT); } // recommend-typescript if (packageInfo.devDependencies && packageInfo.devDependencies.typescript) { scorer.plus(BONUS_WEIGHT); } return { score: scorer.getScore(), reports: reports, errorCount: errorCount, warningCount: warningCount, customConfig: customConfig, }; } exports.default = getEslintReports;