@iceworks/doctor
Version:
Analyse and running codemods over react/rax projects, troubleshooting and automatically fixing errors
118 lines (117 loc) • 4.34 kB
JavaScript
;
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;