UNPKG

lint-diff-line

Version:

:Run eslint only in the changed parts of the code

206 lines (185 loc) 10.4 kB
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