UNPKG

danger-plugin-commitlint-gitlab

Version:

This plugin checks a merge request title and commit messages to make sure they are well formatted and respect the commitlint/lint

106 lines (105 loc) 4.53 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 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) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); // Provides dev-time type structures for `danger` - doesn't affect runtime. const lint = require("@commitlint/lint"); const debug_1 = require("debug"); const debug = (0, debug_1.default)("danger-plugin:commitlint-gitlab"); const defaultConfig = { severity: "fail" }; function check(rules, userConfig) { return __awaiter(this, void 0, void 0, function* () { const config = Object.assign(Object.assign({}, defaultConfig), userConfig); // check MR squash flag and number of commits const squashFlag = danger.gitlab.mr.squash; const commitsArrayLength = danger.gitlab.commits.length; debug("squash flag: ", squashFlag); debug("MR title: ", danger.gitlab.mr.title); if (squashFlag === true && commitsArrayLength > 1) { // If MR sqash flag is true & multiple commits - title must be correct yield lintCommitMessage(danger.gitlab.mr.title.replace("Draft:", "").trim(), rules, config.severity); } else if (squashFlag === false && commitsArrayLength > 1) { // If MR sqash flag is false & multiple commits - at least one commit must be correct yield evalMessages(danger.gitlab.commits, rules, config.severity); // await messageLint(danger.gitlab.commits, rules, config.severity) } else { yield lintCommitMessage(danger.gitlab.commits[0].message, rules, config.severity); } }); } exports.default = check; function lintCommitMessage(commitMessage, rules, severity) { return __awaiter(this, void 0, void 0, function* () { debug("Commit message: ", commitMessage); return lint(commitMessage, rules).then((report) => { if (!report.valid) { let failureMessage = `There is a problem with the commit message\n> ${commitMessage}`; report.errors.forEach((error) => { failureMessage = `${failureMessage}\n- ${error.message}`; }); reportFn(severity, failureMessage); } }); }); } function messageFailed(commitMessage, rules) { return __awaiter(this, void 0, void 0, function* () { debug("Commit message: ", commitMessage); return lint(commitMessage, rules).then((report) => { if (!report.valid) { let failureMessage = `There is a problem with the commit message\n> ${commitMessage}`; report.errors.forEach((error) => { failureMessage = `${failureMessage}\n- ${error.message}`; }); return true; } else { return false; } }); }); } function isTrue(currentValue) { return currentValue === true; } function evalMessages(commits, rules, severity) { return __awaiter(this, void 0, void 0, function* () { const tab = []; for (const commit of commits) { const apromise = messageFailed(commit.message, rules); yield apromise.then((res) => { tab.push(res); }); } if (tab.every(isTrue)) { const failureMessage = "At least one commit message should be good. " + "The commit messages have to be squashed for the checks to only be performed on the MR title"; reportFn(severity, failureMessage); } }); } function reportFn(severity, failureMessage) { switch (severity) { case "fail": fail(failureMessage); break; case "warn": warn(failureMessage); break; case "message": message(failureMessage); break; case "disable": default: break; } }