diff --git a/lib/src/Gren.js b/lib/src/Gren.js index 39d46c48..b36f4488 100644 --- a/lib/src/Gren.js +++ b/lib/src/Gren.js @@ -159,10 +159,9 @@ class Gren { const loaded = utils.task(this, 'Updating latest release'); const { data: release } = await this.repo.updateRelease(releaseId, releaseOptions); - loaded(); + loaded(chalk.green(`${release.name} has been successfully updated!`)); - console.log(chalk.green(`\n${release.name} has been successfully updated!`)); - console.log(chalk.blue(`See the results here: ${release.html_url}`)); + console.log(chalk.blue(`\nSee the results here: ${release.html_url}`)); return release; } @@ -189,9 +188,8 @@ class Gren { const loaded = utils.task(this, 'Preparing the release'); const { data: release } = await this.repo.createRelease(releaseOptions); - loaded(); + loaded(chalk.green(`\n${release.name} has been successfully created!`)); - console.log(chalk.green(`\n${release.name} has been successfully created!`)); console.log(chalk.blue(`See the results here: ${release.html_url}`)); return release; @@ -383,15 +381,13 @@ class Gren { page }); - loaded(); - const totalPages = this._getLastPage(link); if (this.options.tags.indexOf('all') >= 0 && totalPages && +page < totalPages) { return this._getListReleases(page + 1).then(moreReleases => moreReleases.concat(releases)); } - process.stdout.write(releases.length + ' releases found\n'); + loaded(`Releases found: ${releases.length}`); return releases; } @@ -590,8 +586,6 @@ class Gren { * @return {Promise} The promise which resolves the [Array] commit messages */ async _getCommitsBetweenTwo(since, until) { - process.stdout.write(chalk.green('Get commits between ' + utils.formatDate(new Date(since)) + ' and ' + utils.formatDate(new Date(until)) + '\n')); - const options = { since: since, until: until, @@ -613,12 +607,16 @@ class Gren { * * @return {Promise[]} */ - _getCommitBlocks(releaseRanges) { - console.log(chalk.blue('\nCreating the body blocks from commits:')); + async _getCommitBlocks(releaseRanges) { + const taskName = 'Creating the body blocks from commits'; + const loaded = utils.task(this, taskName); - return Promise.all( + const ranges = await Promise.all( releaseRanges .map(async range => { + const [{ date: since }, { date: until }] = range; + + this.tasks[taskName].text = `Get commits between ${utils.formatDate(new Date(since))} and ${utils.formatDate(new Date(until))}`; const commits = await this._getCommitsBetweenTwo(range[1].date, range[0].date); return { @@ -630,6 +628,10 @@ class Gren { }; }) ); + + loaded(`Commit ranges loaded: ${ranges.length}`); + + return ranges; } /** @@ -666,16 +668,20 @@ class Gren { * @return {Promise} The promise which resolves the list of the issues */ async _getClosedIssues(releaseRanges) { - const loaded = utils.task(this, 'Getting all closed issues'); - - const { data } = await this.issues.listIssues({ + const type = { + issues: 'Issues', + milestones: 'Issues', + prs: 'Pull Requests' + }[this.options.dataSource]; + const loaded = utils.task(this, `Getting all closed ${type}`); + const { data: issues } = await this.issues.listIssues({ state: 'closed', since: releaseRanges[releaseRanges.length - 1][1].date }); - loaded(); + loaded(`${type} found: ${issues.length}`); - return data; + return issues; } /** @@ -739,7 +745,6 @@ class Gren { } const allLabels = Object.values(groupBy).reduce((carry, group) => carry.concat(group), []); - const groups = Object.keys(groupBy).reduce((carry, group) => { const groupIssues = issues.filter(issue => { if (!issue.labels.length && this.options.template.noLabel) { @@ -815,15 +820,7 @@ class Gren { * @return {Promise[]} */ async _getIssueBlocks(releaseRanges) { - console.log('Creating the body blocks from releases:'); - - let totalIssues = 0; const issues = await this._getClosedIssues(releaseRanges); - const type = { - 'issues': 'issues', - 'prs': 'pull requests', - 'milestones': 'issues' - }[this.options.dataSource]; const release = releaseRanges .map(range => { const filteredIssues = Array.from(issues) @@ -831,8 +828,6 @@ class Gren { .filter(this._filterBlockIssue.bind(this, range)); const body = (!range[0].body || this.options.override) && this._groupBy(filteredIssues); - totalIssues += filteredIssues.length; - return { id: range[0].id, release: range[0].name, @@ -842,8 +837,6 @@ class Gren { }; }); - process.stdout.write(`${totalIssues} ${type} found.\n`); - return release; } @@ -897,29 +890,20 @@ class Gren { * @return {Promise} Resolving the release blocks */ async _getReleaseBlocks() { - let loaded; + const loaded = utils.task(this, 'Getting releases'); const dataSource = { issues: this._getIssueBlocks.bind(this), commits: this._getCommitBlocks.bind(this), milestones: this._getIssueBlocks.bind(this), prs: this._getIssueBlocks.bind(this) }; - const releases = await this._getListReleases(); - - loaded = utils.task(this, 'Getting tags'); + this.tasks['Getting releases'].text = 'Getting tags'; const tags = await this._getLastTags(releases.length ? releases : false); - - loaded(); - - console.log('Tags found: ' + tags.map(({ tag: { name } }) => name).join(', ')); - - loaded = utils.task(this, 'Getting the tag dates ranges'); - const releaseDates = await Promise.all(this._getTagDates(tags)); - loaded(); + loaded(`Tags found: ${tags.map(({ tag: { name } }) => name).join(', ')}`); return dataSource[this.options.dataSource]( this._createReleaseRanges(releaseDates) diff --git a/lib/src/_utils.js b/lib/src/_utils.js index e77aea2c..b842a29c 100644 --- a/lib/src/_utils.js +++ b/lib/src/_utils.js @@ -1,5 +1,6 @@ const chalk = require('chalk'); const fs = require('fs'); +const ora = require('ora'); require('require-yaml'); /** @@ -44,21 +45,13 @@ function printTask(name) { * @return {Function} The function to be fired when is loaded */// istanbul ignore next function task(gren, taskName) { - const time = process.hrtime(); - process.stdout.write(`\n${chalk.green(taskName)} : .`); + const spinner = ora(taskName); + gren.tasks[taskName] = spinner; - gren.tasks[taskName] = setInterval(() => { - process.stdout.write('.'); - }, 100); + spinner.start(); - return function(message) { - const diff = process.hrtime(time); - const seconds = ((diff[0] * 1e9 + diff[1]) * 1e-9).toFixed(2); - - process.stdout.write(message || '' + chalk.yellow(` (${seconds} secs)\n`)); - clearInterval(gren.tasks[taskName]); - - gren.tasks[taskName] = seconds; + return message => { + spinner.succeed(message); }; } @@ -76,7 +69,7 @@ function clearTasks(gren) { } Object.keys(gren.tasks).forEach((taskName) => { - clearInterval(gren.tasks[taskName]); + gren.tasks[taskName].stop(); }); process.stdout.write(chalk.red('\nTask(s) stopped because of the following error:\n')); diff --git a/package-lock.json b/package-lock.json index e171de6a..b23c85be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,8 +66,7 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { "version": "3.2.0", @@ -1334,11 +1333,15 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, "requires": { "restore-cursor": "2.0.0" } }, + "cli-spinners": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.1.0.tgz", + "integrity": "sha1-8YR7FohE2RemceudFH499JfJDQY=" + }, "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", @@ -4279,7 +4282,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, "requires": { "ansi-regex": "2.1.1" } @@ -5276,6 +5278,38 @@ "lodash.escape": "3.2.0" } }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "requires": { + "chalk": "1.1.3" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, "loose-envify": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", @@ -5435,8 +5469,7 @@ "mimic-fn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", - "dev": true + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=" }, "minami": { "version": "1.2.3", @@ -7410,7 +7443,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, "requires": { "mimic-fn": "1.1.0" } @@ -7429,6 +7461,41 @@ "wordwrap": "1.0.0" } }, + "ora": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-1.3.0.tgz", + "integrity": "sha1-gAeN0rkqk0r2ajrXKluRBpTt5Ro=", + "requires": { + "chalk": "1.1.3", + "cli-cursor": "2.1.0", + "cli-spinners": "1.1.0", + "log-symbols": "1.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, "orchestrator": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", @@ -8036,7 +8103,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, "requires": { "onetime": "2.0.1", "signal-exit": "3.0.2" @@ -8162,8 +8228,7 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "slash": { "version": "1.0.0", @@ -8331,7 +8396,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, "requires": { "ansi-regex": "2.1.1" } diff --git a/package.json b/package.json index c6e7a3ec..6ec9011b 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "github-api": "^3.0.0", "minimist": "^1.2.0", "object-assign-deep": "^0.3.1", + "ora": "^1.3.0", "require-yaml": "0.0.1" }, "devDependencies": {