lint-diff-line
Version:
:Run eslint only in the changed parts of the code
206 lines (185 loc) • 10.4 kB
JavaScript
var $gXNCa$meow = require("meow");
var $gXNCa$process = require("process");
var $gXNCa$util = require("util");
var $gXNCa$child_process = require("child_process");
var $gXNCa$path = require("path");
var $gXNCa$eslint = require("eslint");
var $gXNCa$minimatch = require("minimatch");
var $gXNCa$ramda = require("ramda");
function $parcel$interopDefault(a) {
return a && a.__esModule ? a.default : a;
}
var $f1af35dff6e2a12b$require$ESLint = $gXNCa$eslint.ESLint;
var $d47c6110bce7f5c0$exports = {};
var $c9982608134cbaef$exports = {};
const { addIndex: $c9982608134cbaef$var$addIndex, complement: $c9982608134cbaef$var$complement, curry: $c9982608134cbaef$var$curry, defaultTo: $c9982608134cbaef$var$defaultTo, filter: $c9982608134cbaef$var$filter, insert: $c9982608134cbaef$var$insert, isEmpty: $c9982608134cbaef$var$isEmpty, map: $c9982608134cbaef$var$map, pipe: $c9982608134cbaef$var$pipe, reduce: $c9982608134cbaef$var$reduce, slice: $c9982608134cbaef$var$slice, startsWith: $c9982608134cbaef$var$startsWith } = $gXNCa$ramda;
const $c9982608134cbaef$var$mapIndexed = $c9982608134cbaef$var$addIndex($c9982608134cbaef$var$map);
const $c9982608134cbaef$var$reduceIndexed = $c9982608134cbaef$var$addIndex($c9982608134cbaef$var$reduce);
const $c9982608134cbaef$var$firstItemStartsWith = $c9982608134cbaef$var$curry((prefix, list)=>$c9982608134cbaef$var$startsWith(prefix, list[0]));
const $c9982608134cbaef$var$doesNotStartWith = $c9982608134cbaef$var$complement($c9982608134cbaef$var$startsWith);
const $c9982608134cbaef$var$splitEveryTime = $c9982608134cbaef$var$curry((predicate, list)=>{
const splitIndexes = $c9982608134cbaef$var$pipe($c9982608134cbaef$var$reduceIndexed((acc, item, index)=>{
if (predicate(item)) return [
...acc,
index
];
return acc;
}, []), $c9982608134cbaef$var$insert(list.length - 1, list.length))(list);
const split = $c9982608134cbaef$var$mapIndexed((splitIndex, i, splitIndexList)=>{
const previousIndex = $c9982608134cbaef$var$defaultTo(0, splitIndexList[i - 1]);
const currentIndex = splitIndexList[i];
return $c9982608134cbaef$var$slice(previousIndex, currentIndex, list);
});
return $c9982608134cbaef$var$pipe(split, $c9982608134cbaef$var$filter($c9982608134cbaef$var$complement($c9982608134cbaef$var$isEmpty)))(splitIndexes);
});
$c9982608134cbaef$exports = {
mapIndexed: $c9982608134cbaef$var$mapIndexed,
reduceIndexed: $c9982608134cbaef$var$reduceIndexed,
firstItemStartsWith: $c9982608134cbaef$var$firstItemStartsWith,
doesNotStartWith: $c9982608134cbaef$var$doesNotStartWith,
splitEveryTime: $c9982608134cbaef$var$splitEveryTime
};
const { doesNotStartWith: $d47c6110bce7f5c0$var$doesNotStartWith, firstItemStartsWith: $d47c6110bce7f5c0$var$firstItemStartsWith, splitEveryTime: $d47c6110bce7f5c0$var$splitEveryTime } = $c9982608134cbaef$exports;
const { filter: $d47c6110bce7f5c0$var$filter, flatten: $d47c6110bce7f5c0$var$flatten, map: $d47c6110bce7f5c0$var$map, pipe: $d47c6110bce7f5c0$var$pipe, split: $d47c6110bce7f5c0$var$split, startsWith: $d47c6110bce7f5c0$var$startsWith, uniq: $d47c6110bce7f5c0$var$uniq } = $gXNCa$ramda;
const $d47c6110bce7f5c0$var$getChangedLinesFromHunk = (hunk)=>{
let lineNumber = 0;
return hunk.reduce((changedLines, line)=>{
if ($d47c6110bce7f5c0$var$startsWith("@@", line)) {
lineNumber = Number(line.match(/\+([0-9]+)/)[1]) - 1;
return changedLines;
}
if ($d47c6110bce7f5c0$var$doesNotStartWith("-", line)) {
lineNumber += 1;
if ($d47c6110bce7f5c0$var$startsWith("+", line)) return [
...changedLines,
lineNumber
];
}
return changedLines;
}, []);
};
const $d47c6110bce7f5c0$var$getHunksFromDiff = $d47c6110bce7f5c0$var$pipe($d47c6110bce7f5c0$var$split("\n"), $d47c6110bce7f5c0$var$splitEveryTime($d47c6110bce7f5c0$var$startsWith("@@")), $d47c6110bce7f5c0$var$filter($d47c6110bce7f5c0$var$firstItemStartsWith("@@")));
$d47c6110bce7f5c0$exports = getChangedLinesFromDiff = $d47c6110bce7f5c0$var$pipe($d47c6110bce7f5c0$var$getHunksFromDiff, $d47c6110bce7f5c0$var$map($d47c6110bce7f5c0$var$getChangedLinesFromHunk), $d47c6110bce7f5c0$var$flatten, $d47c6110bce7f5c0$var$uniq);
const $f1af35dff6e2a12b$var$exec = $gXNCa$util.promisify($gXNCa$child_process.exec);
const $f1af35dff6e2a12b$var$linter = new $f1af35dff6e2a12b$require$ESLint();
const $f1af35dff6e2a12b$var$getChangedFiles = async (range, ext)=>{
const file = await $f1af35dff6e2a12b$var$exec(`git diff --pretty=format: --name-only --diff-filter=ACM ${range} | sort | uniq`);
const files = (file.stdout || "").split("\n").filter(Boolean);
return files.filter((x)=>ext.some((y)=>x.endsWith(y)));
};
const $f1af35dff6e2a12b$var$filterChangedFilesByGlob = (changedFiles, glob)=>changedFiles.filter((x)=>glob.some((g)=>$gXNCa$minimatch(x, g)));
const $f1af35dff6e2a12b$var$getResolvedPaths = async (filteredFiles)=>{
const rootDir = (await $f1af35dff6e2a12b$var$exec("git rev-parse --show-toplevel")).stdout?.replace("\n", "");
return filteredFiles.map((x)=>$gXNCa$path.join(rootDir, x));
};
const $f1af35dff6e2a12b$var$getLineMapForFiles = async (commitRange, changedFiles)=>{
const errPaths = [];
const changedFilesLineMap = [];
for(let i = 0; i < changedFiles.length; i++){
const file = changedFiles[i];
try {
const diff = (await $f1af35dff6e2a12b$var$exec(`git diff ${commitRange} ${file}`)).stdout;
const lines = $d47c6110bce7f5c0$exports(diff);
if (lines.length) changedFilesLineMap.push({
changedLines: lines,
filePath: file
});
} catch (err) {
errPaths.push(file);
}
}
if (errPaths.length) console.log(`\x1b[33m\n\nChanges found that are not in current range.\npaths: ${errPaths.join("\n")} \ncommit range: ${commitRange}\n\n\x1b[0m`);
return changedFilesLineMap;
};
const $f1af35dff6e2a12b$var$filterLinterMessages = (changedFileLineMap, linterOutput)=>changedFileLineMap.map((x)=>{
const outputForFile = linterOutput.find((l)=>l.filePath === x.filePath);
if (!outputForFile) return undefined;
outputForFile.version = "lineOnly";
outputForFile.messages = outputForFile.messages.filter((m)=>x.changedLines.includes(m.line));
return outputForFile;
}).filter(Boolean);
const $f1af35dff6e2a12b$var$decorateLinterMessages = (changedFileLineMap, linterOutput)=>changedFileLineMap.map((x)=>{
const outputForFile = linterOutput.find((l)=>l.filePath === x.filePath);
if (!outputForFile) return undefined;
outputForFile.version = "fullFile";
outputForFile.messages = outputForFile.messages.map((m)=>x.changedLines.includes(m.line) ? {
...m,
newLineError: true
} : m);
return outputForFile;
}).filter(Boolean);
const $f1af35dff6e2a12b$var$updateErrorAndWarningCounts = (filteredLintResults)=>filteredLintResults.map((x)=>({
...x,
warningCount: x.messages.filter((x)=>x.severity === 1).length,
errorCount: x.messages.filter((x)=>x.severity === 2).length,
fixableWarningCount: x.messages.filter((x)=>x.severity === 1 && !!x.fix).length,
fixableErrorCount: x.messages.filter((x)=>x.severity === 2 && !!x.fix).length
}));
const $f1af35dff6e2a12b$var$applyLinter = async (changedFiles)=>await $f1af35dff6e2a12b$var$linter.lintFiles(changedFiles.map((x)=>x.filePath));
const $f1af35dff6e2a12b$var$reportResults = async (results)=>{
let formatter = await $f1af35dff6e2a12b$var$linter.loadFormatter("lint-diff-line-formatter");
let formatted = formatter.format(results);
if (!formatted) formatted = "\x1b[32m 0 problems (0 errors, 0 warnings)\n 0 errors and 0 warnings potentially fixable with the `--fix` option. \x1b[0m";
console.log(formatted);
if (results.reduce((acc, x)=>{
return acc += x.errorCount;
}, 0) === 0) $gXNCa$process.exit(0);
$gXNCa$process.exit(1);
};
const $f1af35dff6e2a12b$export$889ea624f2cb2c57 = async (commitRange, ext, files, fullFiles)=>{
const changedFiles = await $f1af35dff6e2a12b$var$getChangedFiles(commitRange, ext);
const filteredFiles = $f1af35dff6e2a12b$var$filterChangedFilesByGlob(changedFiles, files);
const resolvedFiles = await $f1af35dff6e2a12b$var$getResolvedPaths(filteredFiles);
const changedFilesLineMap = await $f1af35dff6e2a12b$var$getLineMapForFiles(commitRange, resolvedFiles);
const lintResults = await $f1af35dff6e2a12b$var$applyLinter(changedFilesLineMap);
let results;
if (fullFiles) results = $f1af35dff6e2a12b$var$decorateLinterMessages(changedFilesLineMap, lintResults);
else {
const filteredLintResults = $f1af35dff6e2a12b$var$filterLinterMessages(changedFilesLineMap, lintResults);
results = $f1af35dff6e2a12b$var$updateErrorAndWarningCounts(filteredLintResults);
}
await $f1af35dff6e2a12b$var$reportResults(results);
};
const $4fa36e821943b400$var$cli = (0, ($parcel$interopDefault($gXNCa$meow)))(`
Usage
$ lint-diff-line
Options
--range -r
--ext -e
--files -f
--fulFiles -F
Examples
$ lint-diff-line
$ lint-diff-line -f HEAD~1..HEAD
$ lint-diff-line -f master..my-branch
$ lint-diff-line -f master..my-branch --ext js/ts
// Note the quotes around -f
$ lint-diff-line -f master..my-branch --ext js/ts -f 'src/**'
`, {
flags: {
range: {
type: "string",
alias: "r",
default: "HEAD"
},
ext: {
type: "string",
alias: "e",
default: ".js"
},
files: {
type: "string",
alias: "f",
default: "**"
},
fullFiles: {
type: "boolean",
alias: "F",
default: "false"
}
}
});
const $4fa36e821943b400$var$globs = $4fa36e821943b400$var$cli.flags.files.split(" ");
const $4fa36e821943b400$var$extentions = $4fa36e821943b400$var$cli.flags.ext.split(",");
(0, $f1af35dff6e2a12b$export$889ea624f2cb2c57)($4fa36e821943b400$var$cli.flags.range, $4fa36e821943b400$var$extentions, $4fa36e821943b400$var$globs, $4fa36e821943b400$var$cli.flags.fullFiles);
//# sourceMappingURL=lint-diff-line.js.map