UNPKG

release-notes-cli

Version:

Generate release notes from git for playstore/appstore or github

139 lines (138 loc) 5.73 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 }); 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, ""); };