standard-commit
Version:
conventional commit
92 lines (91 loc) • 3.04 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.sanitizeCommitMessage = exports.parseCommitMessage = exports.parseIssues = exports.parseBreaking = exports.parseBody = exports.parseCommitHeader = exports.unwrap = void 0;
const linewrap_1 = __importDefault(require("linewrap"));
const os_1 = require("os");
const wrapLines = (0, linewrap_1.default)(72);
const splitLinePattern = /$/gm;
const splitWordsPattern = /\s+/gm;
const headerPattern = /^(\w*)(?:\(([\w$.\-* ]*)\))?: (.*)/;
function unwrap(block) {
return block.split(splitWordsPattern).join(' ');
}
exports.unwrap = unwrap;
function parseCommitHeader(message) {
const match = message.match(headerPattern);
let type, scope, subject;
if (match) {
type = match[1];
scope = match[2];
subject = match[3];
}
else {
const header = message.split(splitLinePattern)[0];
subject = header && header.trim();
}
const commit = { type, subject };
if (scope)
commit.scope = scope;
return commit;
}
exports.parseCommitHeader = parseCommitHeader;
function parseBody(message) {
const bodyLines = message.split(/\r?\n/);
const numlines = bodyLines.length;
const body = [];
let block = null;
for (let i = 1; i < numlines; i++) {
const line = bodyLines[i];
if (/^(BREAKING CHANGE|close|closes|fix|fixes|resolve|resolves)./.test(line)) {
break;
}
if (line.match(/^\s*$/)) {
block && body.push(unwrap(wrapLines(block)));
block = null;
}
else {
block = block ? [block, line].join(os_1.EOL) : line;
}
}
return body.length ? body : undefined;
}
exports.parseBody = parseBody;
function parseBreaking(message) {
const match = /^BREAKING CHANGE:(.*)$/gm.exec(message);
if (match && match[1])
return match[1].trim();
}
exports.parseBreaking = parseBreaking;
function parseIssues(message) {
const r = /^(close|closes|fix|fixes|resolve|resolves)\s+(.*)$/gm;
const issues = [];
let match;
while ((match = r.exec(message)) !== null) {
issues.push(match[2].trim());
}
return issues.length ? issues : undefined;
}
exports.parseIssues = parseIssues;
function parseCommitMessage(message) {
const text = sanitizeCommitMessage(message);
const commit = parseCommitHeader(text);
const body = parseBody(text);
const breaking = parseBreaking(text);
const issues = parseIssues(text);
if (breaking)
commit.breaking = breaking;
if (issues)
commit.issues = issues;
if (body)
commit.body = body;
return commit;
}
exports.parseCommitMessage = parseCommitMessage;
function sanitizeCommitMessage(message) {
// strip comments
return message.replace(/^#.*$/gm, '');
}
exports.sanitizeCommitMessage = sanitizeCommitMessage;