morbo-cli
Version:
… All tech debt is vermin in the eyes of Morbo!
168 lines (167 loc) • 9.75 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
/* eslint-disable max-len,no-console */
var event_stream_1 = __importDefault(require("event-stream"));
var fs_1 = __importDefault(require("fs"));
var readdirp_1 = __importDefault(require("readdirp"));
var open_1 = __importDefault(require("open"));
var fileFilterer_1 = __importDefault(require("./lib/fileFilterer"));
var getMessagesFromLine_1 = __importDefault(require("./lib/getMessagesFromLine"));
var createReport_1 = __importDefault(require("./lib/createReport"));
var defaultOptions_1 = __importDefault(require("./lib/defaultOptions"));
var getGitBlame_1 = __importDefault(require("./lib/getGitBlame"));
var sendReport_1 = __importDefault(require("./lib/sendReport"));
var defaultDefinitions_1 = __importDefault(require("./lib/defaultDefinitions"));
// const spinner = new MorboSpinner();
/**
* Reads through the configured path scans the matching files for messages.
*/
function scanAndProcessMessages(_a) {
var _this = this;
var _b = _a.createLocalReport, createLocalReport = _b === void 0 ? defaultOptions_1.default.createLocalReport : _b, _c = _a.customDefinitions, customDefinitions = _c === void 0 ? defaultOptions_1.default.customDefinitions : _c, _d = _a.fileEncoding, fileEncoding = _d === void 0 ? defaultOptions_1.default.fileEncoding : _d, _e = _a.filesToScan, filesToScan = _e === void 0 ? defaultOptions_1.default.filesToScan : _e, _f = _a.ignoredDirectories, ignoredDirectories = _f === void 0 ? defaultOptions_1.default.ignoredDirectories : _f, _g = _a.lineLengthLimit, lineLengthLimit = _g === void 0 ? defaultOptions_1.default.lineLengthLimit : _g, _h = _a.morboServerUri, morboServerUri = _h === void 0 ? defaultOptions_1.default.morboServerUri : _h, _j = _a.openReportOnCompletion, openReportOnCompletion = _j === void 0 ? defaultOptions_1.default.openReportOnCompletion : _j, _k = _a.projectId, projectId = _k === void 0 ? defaultOptions_1.default.projectId : _k, _l = _a.repositoryUrl, repositoryUrl = _l === void 0 ? defaultOptions_1.default.repositoryUrl : _l, _m = _a.scanPath, scanPath = _m === void 0 ? defaultOptions_1.default.scanPath : _m, _o = _a.sendReportOnCompletion, sendReportOnCompletion = _o === void 0 ? defaultOptions_1.default.sendReportOnCompletion : _o, _p = _a.showGitBlame, showGitBlame = _p === void 0 ? defaultOptions_1.default.showGitBlame : _p, _q = _a.showSkippedChecks, showSkippedChecks = _q === void 0 ? defaultOptions_1.default.showSkippedChecks : _q, _r = _a.skipChecks, skipChecks = _r === void 0 ? defaultOptions_1.default.skipChecks : _r;
return new Promise(function (resolve, reject) {
var payload = {
results: [],
repositoryUrl: repositoryUrl,
fileStats: {},
linesOfCode: 0,
};
// spinner.start();
var definitions = __assign({}, defaultDefinitions_1.default, customDefinitions);
var stream = readdirp_1.default({
root: scanPath,
fileFilter: fileFilterer_1.default({ ignoredDirectories: ignoredDirectories, filesToScan: filesToScan }),
});
// Remove skipped checks for our mapping
skipChecks.forEach(function (checkName) {
if (definitions[checkName]) {
delete definitions[checkName];
}
});
var getFileExtension = function (fileName) { return fileName.split('.').pop(); };
var dupeFiles = {};
// TODO: Actually do something meaningful/useful with these handlers.
stream.on('warn', console.warn).on('error', console.error);
stream.pipe(event_stream_1.default.map(function (fileInformation, callback) {
var input = fs_1.default.createReadStream(fileInformation.fullPath, {
encoding: fileEncoding,
});
// Dont rescan files we already scanned
if (dupeFiles[fileInformation.path]) {
return;
}
else {
dupeFiles[fileInformation.path] = 1;
}
var fileExtension = getFileExtension(fileInformation.path);
// Count file types by extension
if (fileExtension) {
if (payload.fileStats[fileExtension]) {
payload.fileStats[fileExtension] += 1;
}
else {
payload.fileStats[fileExtension] = 1;
}
}
var currentFileLineNumber = 1;
input.pipe(event_stream_1.default.split()).pipe(event_stream_1.default.map(function (fileLineString) {
var messages;
var lengthError;
if (fileLineString.length < lineLengthLimit) {
messages = getMessagesFromLine_1.default(definitions, fileLineString, currentFileLineNumber, fileInformation.path);
messages.forEach(function (message) {
payload.results.push(message);
});
}
else if (showSkippedChecks) {
lengthError = "" + 'Morbo is skipping this line because its length is ' +
'greater than the maximum line-length of ' + lineLengthLimit + ".";
payload.results.push({
message: lengthError,
lineNumber: currentFileLineNumber,
label: 'SKIPPED CHECK',
fileName: fileInformation.fullPath,
});
}
currentFileLineNumber += 1;
payload.linesOfCode += 1;
return null;
}));
return callback();
}));
stream.on('end', function () { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
if (showGitBlame) {
// spinner.updateText('Finding the humans responsible');
payload.results = getGitBlame_1.default(scanPath, payload.results);
}
if (createLocalReport) {
createReport_1.default(payload, function (file) {
// spinner.succeed(file);
if (openReportOnCompletion) {
open_1.default(file);
}
});
}
else {
// spinner.spinner.succeed();
}
if (sendReportOnCompletion) {
sendReport_1.default(payload, { morboServerUri: morboServerUri, projectId: projectId });
}
resolve(payload);
return [2 /*return*/];
});
}); });
});
}
exports.default = scanAndProcessMessages;