release-notes-cli
Version:
Generate release notes from git for playstore/appstore or github
139 lines (138 loc) • 5.73 kB
JavaScript
;
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 });
let git = require("./utils/git");
let ejs = require("ejs");
let debug = require("debug")("release-notes:cli");
let fileSystem = require("./utils/file-system");
let processCommits = require("./utils/process").processCommits;
let dateFnsFormat = require("date-fns/format");
const clipboard = require("clipboardy");
const chalk = require("chalk");
const githubUsername = require("./utils/github-username");
exports.default = (cliOptions, positionalRange, positionalTemplate = "appstore") => {
return fileSystem.resolveTemplate(positionalTemplate).then((template) => {
return fileSystem.resolveOptions(cliOptions).then((options) => {
debug("Running git log in '%s' on branch '%s' with range '%s'", options.p, options.b, positionalRange);
return git
.log({
branch: options.b,
range: positionalRange,
title: options.i ? new RegExp(options.t, "i") : new RegExp(options.t),
meaning: Array.isArray(options.m) ? options.m : [options.m],
cwd: options.p,
mergeCommits: options.mg,
additionalOptions: Array.isArray(options.o) ? options.o : [options.o],
})
.then((commits) => {
return processCommits(options, commits, positionalRange);
})
.then((data) => {
return render(positionalRange, template, data, positionalTemplate, options.c || cliOptions.copy);
});
});
});
};
const render = (range, templateContent, data, type = "appstore", copy = false) => __awaiter(void 0, void 0, void 0, function* () {
debug("Rendering template");
let renderedContent = "";
if (type === "appstore" || type === "changelog") {
let gitRemote = "";
let isError = false;
const allCommits = commitFormateForAppstore(data.commits);
if (type === "changelog") {
gitRemote = yield git.gitRemoteOriginUrl();
for (let [key, value] of Object.entries(allCommits)) {
const valueCommits = value;
const x = valueCommits.map((commit) => __awaiter(void 0, void 0, void 0, function* () {
try {
const username = yield githubUsername(commit.committerEmail, { token: process.env.GITHUB_AUTH });
commit.username = username;
}
catch (error) {
isError = true;
}
}));
yield Promise.all(x);
renderedContent += ejs.render(templateContent, { title: key, gitRemote, commits: valueCommits }) + "\n";
}
}
else {
for (let [key, value] of Object.entries(allCommits)) {
renderedContent += ejs.render(templateContent, { title: key, commits: value }) + "\n";
}
}
console.log(chalk.magentaBright(renderedContent));
if (copy) {
clipboard.writeSync(renderedContent);
console.log(chalk.green("Copied to clipboard successfully\n"));
}
if (isError) {
console.log(chalk.red('You need to get personal access token from github for setting committer username like this:\n\nexport GITHUB_AUTH="..."'));
}
return;
}
renderedContent = ejs.render(templateContent, Object.assign({
range: range,
dateFnsFormat: dateFnsFormat,
}, data));
console.log(renderedContent);
if (copy) {
clipboard.writeSync(renderedContent);
console.log(chalk.green("Copied to clipboard successfully\n"));
}
});
const commitLintTypes = [
"build",
"chore",
"ci",
"docs",
"feat",
"fix",
"perf",
"refactor",
"revert",
"style",
"test",
];
const commitLintTypesMapper = [
"build",
"Others",
"ci",
"docs",
"Features",
"Fixes",
"perf",
"Changed",
"revert",
"style",
"test",
];
const commitFormateForAppstore = (commits) => {
let obj = {};
commits.forEach(commit => {
const index = commitLintTypes.findIndex(commitLintType => commit.title.includes(commitLintType));
commit.title = removeCommitHeader(commit.title);
if (index > -1) {
if (obj[commitLintTypesMapper[index]]) {
obj = Object.assign(Object.assign({}, obj), { [commitLintTypesMapper[index]]: obj[commitLintTypesMapper[index]].concat(commit) });
}
else {
obj = Object.assign(Object.assign({}, obj), { [commitLintTypesMapper[index]]: [commit] });
}
}
});
return obj;
};
const removeCommitHeader = (commitTitle) => {
const removeRegex = /^(?<type>build|chore|ci|docs|feat|fix|perf|refactor|revert|style|test|¯\\_\(ツ\)_\/¯)(?<scope>\(\w+\)?((?=:\s)?|(?=!:\s)))?:?/;
return commitTitle.replace(removeRegex, "");
};