diff --git a/README.md b/README.md index 556e7d07a..82441ff10 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,15 @@ # Conventional Changelog -[![Build Status](https://travis-ci.org/conventional-changelog/conventional-changelog.svg?branch=master)](https://travis-ci.org/conventional-changelog/conventional-changelog) -[![Coverage Status](https://coveralls.io/repos/github/conventional-changelog/conventional-changelog/badge.svg?branch=master)](https://coveralls.io/github/conventional-changelog/conventional-changelog?branch=master?branch=master) -[![Standard Version](https://img.shields.io/badge/release-standard%20version-brightgreen.svg)](https://github.com/conventional-changelog/standard-version) -[![community slack](http://devtoolscommunity.herokuapp.com/badge.svg)](http://devtoolscommunity.herokuapp.com) +[![Build status][build]][build-url] +[![Coverage status][coverage]][coverage-url] -_Having problems? want to contribute? join our [community slack](http://devtoolscommunity.herokuapp.com)_. +[build]: https://img.shields.io/github/actions/workflow/status/conventional-changelog/conventional-changelog/ci.yaml?branch=master +[build-url]: https://github.com/conventional-changelog/conventional-changelog/actions -> Generate a CHANGELOG from git metadata +[coverage]: https://coveralls.io/repos/github/conventional-changelog/conventional-changelog/badge.svg?branch=master +[coverage-url]: https://coveralls.io/github/conventional-changelog/conventional-changelog?branch=master + +Generate a CHANGELOG from git metadata. ## About this Repo diff --git a/package.json b/package.json index 6675d4177..5ea334417 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "pinkie-promise": "^2.0.1", "rimraf": "^3.0.2", "safe-buffer": "5.2.1", - "semver": "^7.0.0", + "semver": "^7.5.2", "sinon": "^15.0.0", "sinon-chai": "^3.7.0", "tmp": "^0.2.1", diff --git a/packages/conventional-changelog-angular/README.md b/packages/conventional-changelog-angular/README.md index b5ed7d049..6bc952710 100644 --- a/packages/conventional-changelog-angular/README.md +++ b/packages/conventional-changelog-angular/README.md @@ -1,9 +1,41 @@ -# [![NPM version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Dependency Status][daviddm-image]][daviddm-url] [![Coverage Status][coverage-image]][coverage-url] +# conventional-changelog-angular -> [conventional-changelog](https://github.com/ajoslin/conventional-changelog) [angular](https://github.com/angular/angular) preset +[![NPM version][npm]][npm-url] +[![Node version][node]][node-url] +[![Dependencies status][deps]][deps-url] +[![Build status][build]][build-url] +[![Coverage status][coverage]][coverage-url] + +[npm]: https://img.shields.io/npm/v/conventional-changelog-angular.svg +[npm-url]: https://npmjs.com/package/conventional-changelog-angular + +[node]: https://img.shields.io/node/v/conventional-changelog-angular.svg +[node-url]: https://nodejs.org + +[deps]: https://img.shields.io/librariesio/release/npm/conventional-changelog-angular +[deps-url]: https://libraries.io/npm/conventional-changelog-angular/tree + +[build]: https://img.shields.io/github/actions/workflow/status/conventional-changelog/conventional-changelog/ci.yaml?branch=master +[build-url]: https://github.com/conventional-changelog/conventional-changelog/actions + +[coverage]: https://coveralls.io/repos/github/conventional-changelog/conventional-changelog/badge.svg?branch=master +[coverage-url]: https://coveralls.io/github/conventional-changelog/conventional-changelog?branch=master + +[conventional-changelog](https://github.com/conventional-changelog/conventional-changelog) [angular](https://github.com/angular/angular) preset. **Issues with the convention itself should be reported on the Angular issue tracker.** +## Install + +```bash +# yarn +yarn add -D conventional-changelog-angular +# pnpm +pnpm add -D conventional-changelog-angular +# npm +npm i -D conventional-changelog-angular +``` + ## Angular Convention Angular's [commit message guidelines](https://github.com/angular/angular/blob/master/CONTRIBUTING.md#commit). @@ -92,13 +124,3 @@ reference GitHub issues that this commit **Closes**. **Breaking Changes** should start with the word `BREAKING CHANGE:` with a space or two newlines. The rest of the commit message is then used for this. A detailed explanation can be found in this [document](#commit-message-format). - -[npm-image]: https://badge.fury.io/js/conventional-changelog-angular.svg -[npm-url]: https://npmjs.org/package/conventional-changelog-angular -[travis-image]: https://travis-ci.org/conventional-changelog/conventional-changelog-angular.svg?branch=master -[travis-url]: https://travis-ci.org/conventional-changelog/conventional-changelog-angular -[daviddm-image]: https://david-dm.org/conventional-changelog/conventional-changelog-angular.svg?theme=shields.io -[daviddm-url]: https://david-dm.org/conventional-changelog/conventional-changelog-angular -[coverage-image]: https://coveralls.io/repos/github/conventional-changelog/conventional-changelog/badge.svg?branch=master -[coverage-url]: https://coveralls.io/github/conventional-changelog/conventional-changelog?branch=master -[commit-message-format]: https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit# diff --git a/packages/conventional-changelog-angular/conventional-changelog.js b/packages/conventional-changelog-angular/conventional-changelog.js deleted file mode 100644 index afa9f2e3b..000000000 --- a/packages/conventional-changelog-angular/conventional-changelog.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict' - -const parserOpts = require('./parser-opts') -const writerOpts = require('./writer-opts') - -module.exports = Promise.all([parserOpts, writerOpts]) - .then(([parserOpts, writerOpts]) => ({ - parserOpts, - writerOpts - })) diff --git a/packages/conventional-changelog-angular/conventional-recommended-bump.js b/packages/conventional-changelog-angular/conventional-recommended-bump.js deleted file mode 100644 index 190742ef1..000000000 --- a/packages/conventional-changelog-angular/conventional-recommended-bump.js +++ /dev/null @@ -1,32 +0,0 @@ -'use strict' - -const parserOpts = require('./parser-opts') - -module.exports = { - parserOpts, - - whatBump: (commits) => { - let level = 2 - let breakings = 0 - let features = 0 - - commits.forEach(commit => { - if (commit.notes.length > 0) { - breakings += commit.notes.length - level = 0 - } else if (commit.type === 'feat') { - features += 1 - if (level === 2) { - level = 1 - } - } - }) - - return { - level: level, - reason: breakings === 1 - ? `There is ${breakings} BREAKING CHANGE and ${features} features` - : `There are ${breakings} BREAKING CHANGES and ${features} features` - } - } -} diff --git a/packages/conventional-changelog-angular/conventionalChangelog.js b/packages/conventional-changelog-angular/conventionalChangelog.js new file mode 100644 index 000000000..9c91ac16e --- /dev/null +++ b/packages/conventional-changelog-angular/conventionalChangelog.js @@ -0,0 +1,10 @@ +'use strict' + +function createConventionalChangelogOpts (parserOpts, writerOpts) { + return { + parserOpts, + writerOpts + } +} + +module.exports.createConventionalChangelogOpts = createConventionalChangelogOpts diff --git a/packages/conventional-changelog-angular/conventionalRecommendedBump.js b/packages/conventional-changelog-angular/conventionalRecommendedBump.js new file mode 100644 index 000000000..8de7e15b5 --- /dev/null +++ b/packages/conventional-changelog-angular/conventionalRecommendedBump.js @@ -0,0 +1,34 @@ +'use strict' + +function createConventionalRecommendedBumpOpts (parserOpts) { + return { + parserOpts, + + whatBump (commits) { + let level = 2 + let breakings = 0 + let features = 0 + + commits.forEach(commit => { + if (commit.notes.length > 0) { + breakings += commit.notes.length + level = 0 + } else if (commit.type === 'feat') { + features += 1 + if (level === 2) { + level = 1 + } + } + }) + + return { + level: level, + reason: breakings === 1 + ? `There is ${breakings} BREAKING CHANGE and ${features} features` + : `There are ${breakings} BREAKING CHANGES and ${features} features` + } + } + } +} + +module.exports.createConventionalRecommendedBumpOpts = createConventionalRecommendedBumpOpts diff --git a/packages/conventional-changelog-angular/index.js b/packages/conventional-changelog-angular/index.js index 3e9181a25..fb8c351e1 100644 --- a/packages/conventional-changelog-angular/index.js +++ b/packages/conventional-changelog-angular/index.js @@ -1,13 +1,22 @@ 'use strict' -const conventionalChangelog = require('./conventional-changelog') -const parserOpts = require('./parser-opts') -const recommendedBumpOpts = require('./conventional-recommended-bump') -const writerOpts = require('./writer-opts') - -module.exports = Promise.all([conventionalChangelog, parserOpts, recommendedBumpOpts, writerOpts]) - .then(([conventionalChangelog, parserOpts, recommendedBumpOpts, writerOpts]) => ({ - conventionalChangelog, + +const { createParserOpts } = require('./parserOpts') +const { createWriterOpts } = require('./writerOpts') +const { createConventionalChangelogOpts } = require('./conventionalChangelog') +const { createConventionalRecommendedBumpOpts } = require('./conventionalRecommendedBump') + +async function createPreset () { + const parserOpts = createParserOpts() + const writerOpts = await createWriterOpts() + const recommendedBumpOpts = createConventionalRecommendedBumpOpts(parserOpts) + const conventionalChangelog = createConventionalChangelogOpts(parserOpts, writerOpts) + + return { parserOpts, + writerOpts, recommendedBumpOpts, - writerOpts - })) + conventionalChangelog + } +} + +module.exports = createPreset diff --git a/packages/conventional-changelog-angular/package.json b/packages/conventional-changelog-angular/package.json index fa3f89d9f..85a1b4e4c 100644 --- a/packages/conventional-changelog-angular/package.json +++ b/packages/conventional-changelog-angular/package.json @@ -16,11 +16,11 @@ "preset" ], "files": [ - "conventional-changelog.js", - "conventional-recommended-bump.js", + "conventionalChangelog.js", + "conventionalRecommendedBump.js", "index.js", - "parser-opts.js", - "writer-opts.js", + "parserOpts.js", + "writerOpts.js", "templates" ], "author": "Steve Mao", diff --git a/packages/conventional-changelog-angular/parser-opts.js b/packages/conventional-changelog-angular/parser-opts.js deleted file mode 100644 index dfbac5068..000000000 --- a/packages/conventional-changelog-angular/parser-opts.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict' - -module.exports = { - headerPattern: /^(\w*)(?:\((.*)\))?: (.*)$/, - headerCorrespondence: [ - 'type', - 'scope', - 'subject' - ], - noteKeywords: ['BREAKING CHANGE'], - revertPattern: /^(?:Revert|revert:)\s"?([\s\S]+?)"?\s*This reverts commit (\w*)\./i, - revertCorrespondence: ['header', 'hash'] -} diff --git a/packages/conventional-changelog-angular/parserOpts.js b/packages/conventional-changelog-angular/parserOpts.js new file mode 100644 index 000000000..3e93f3ec7 --- /dev/null +++ b/packages/conventional-changelog-angular/parserOpts.js @@ -0,0 +1,17 @@ +'use strict' + +function createParserOpts () { + return { + headerPattern: /^(\w*)(?:\((.*)\))?: (.*)$/, + headerCorrespondence: [ + 'type', + 'scope', + 'subject' + ], + noteKeywords: ['BREAKING CHANGE'], + revertPattern: /^(?:Revert|revert:)\s"?([\s\S]+?)"?\s*This reverts commit (\w*)\./i, + revertCorrespondence: ['header', 'hash'] + } +} + +module.exports.createParserOpts = createParserOpts diff --git a/packages/conventional-changelog-angular/writer-opts.js b/packages/conventional-changelog-angular/writerOpts.js similarity index 80% rename from packages/conventional-changelog-angular/writer-opts.js rename to packages/conventional-changelog-angular/writerOpts.js index ef3cb2a7f..991947b85 100644 --- a/packages/conventional-changelog-angular/writer-opts.js +++ b/packages/conventional-changelog-angular/writerOpts.js @@ -4,22 +4,24 @@ const compareFunc = require('compare-func') const { readFile } = require('fs').promises const { resolve } = require('path') -module.exports = Promise.all([ - readFile(resolve(__dirname, './templates/template.hbs'), 'utf-8'), - readFile(resolve(__dirname, './templates/header.hbs'), 'utf-8'), - readFile(resolve(__dirname, './templates/commit.hbs'), 'utf-8'), - readFile(resolve(__dirname, './templates/footer.hbs'), 'utf-8') -]) - .then(([template, header, commit, footer]) => { - const writerOpts = getWriterOpts() +async function createWriterOpts () { + const [template, header, commit, footer] = await Promise.all([ + readFile(resolve(__dirname, './templates/template.hbs'), 'utf-8'), + readFile(resolve(__dirname, './templates/header.hbs'), 'utf-8'), + readFile(resolve(__dirname, './templates/commit.hbs'), 'utf-8'), + readFile(resolve(__dirname, './templates/footer.hbs'), 'utf-8') + ]) + const writerOpts = getWriterOpts() - writerOpts.mainTemplate = template - writerOpts.headerPartial = header - writerOpts.commitPartial = commit - writerOpts.footerPartial = footer + writerOpts.mainTemplate = template + writerOpts.headerPartial = header + writerOpts.commitPartial = commit + writerOpts.footerPartial = footer - return writerOpts - }) + return writerOpts +} + +module.exports.createWriterOpts = createWriterOpts function getWriterOpts () { return { diff --git a/packages/conventional-changelog-atom/README.md b/packages/conventional-changelog-atom/README.md index 4e0f7fc6c..836b13cb4 100644 --- a/packages/conventional-changelog-atom/README.md +++ b/packages/conventional-changelog-atom/README.md @@ -1,9 +1,41 @@ -# [![NPM version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Dependency Status][daviddm-image]][daviddm-url] [![Coverage Status][coverage-image]][coverage-url] +# conventional-changelog-atom -> [conventional-changelog](https://github.com/ajoslin/conventional-changelog) [atom](https://github.com/atom/atom) preset +[![NPM version][npm]][npm-url] +[![Node version][node]][node-url] +[![Dependencies status][deps]][deps-url] +[![Build status][build]][build-url] +[![Coverage status][coverage]][coverage-url] + +[npm]: https://img.shields.io/npm/v/conventional-changelog-atom.svg +[npm-url]: https://npmjs.com/package/conventional-changelog-atom + +[node]: https://img.shields.io/node/v/conventional-changelog-atom.svg +[node-url]: https://nodejs.org + +[deps]: https://img.shields.io/librariesio/release/npm/conventional-changelog-atom +[deps-url]: https://libraries.io/npm/conventional-changelog-atom/tree + +[build]: https://img.shields.io/github/actions/workflow/status/conventional-changelog/conventional-changelog/ci.yaml?branch=master +[build-url]: https://github.com/conventional-changelog/conventional-changelog/actions + +[coverage]: https://coveralls.io/repos/github/conventional-changelog/conventional-changelog/badge.svg?branch=master +[coverage-url]: https://coveralls.io/github/conventional-changelog/conventional-changelog?branch=master + +[conventional-changelog](https://github.com/conventional-changelog/conventional-changelog) [atom](https://github.com/atom/atom) preset. **Issues with the convention itself should be reported on the Atom issue tracker.** +## Install + +```bash +# yarn +yarn add -D conventional-changelog-atom +# pnpm +pnpm add -D conventional-changelog-atom +# npm +npm i -D conventional-changelog-atom +``` + ## Atom Convention ### Git Commit Messages @@ -30,12 +62,3 @@ * :shirt: `:shirt:` when removing linter warnings Based on https://github.com/atom/atom/blob/master/CONTRIBUTING.md#git-commit-messages - -[npm-image]: https://badge.fury.io/js/conventional-changelog-atom.svg -[npm-url]: https://npmjs.org/package/conventional-changelog-atom -[travis-image]: https://travis-ci.org/stevemao/conventional-changelog-atom.svg?branch=master -[travis-url]: https://travis-ci.org/stevemao/conventional-changelog-atom -[daviddm-image]: https://david-dm.org/stevemao/conventional-changelog-atom.svg?theme=shields.io -[daviddm-url]: https://david-dm.org/stevemao/conventional-changelog-atom -[coverage-image]: https://coveralls.io/repos/github/conventional-changelog/conventional-changelog/badge.svg?branch=master -[coverage-url]: https://coveralls.io/github/conventional-changelog/conventional-changelog?branch=master diff --git a/packages/conventional-changelog-atom/conventional-changelog.js b/packages/conventional-changelog-atom/conventional-changelog.js deleted file mode 100644 index afa9f2e3b..000000000 --- a/packages/conventional-changelog-atom/conventional-changelog.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict' - -const parserOpts = require('./parser-opts') -const writerOpts = require('./writer-opts') - -module.exports = Promise.all([parserOpts, writerOpts]) - .then(([parserOpts, writerOpts]) => ({ - parserOpts, - writerOpts - })) diff --git a/packages/conventional-changelog-atom/conventional-recommended-bump.js b/packages/conventional-changelog-atom/conventional-recommended-bump.js deleted file mode 100644 index 5cf6153f5..000000000 --- a/packages/conventional-changelog-atom/conventional-recommended-bump.js +++ /dev/null @@ -1,30 +0,0 @@ -'use strict' - -const parserOpts = require('./parser-opts') - -module.exports = { - parserOpts, - - whatBump: (commits) => { - let level = 2 - let breakings = 0 - let features = 0 - - commits.forEach(commit => { - if (commit.notes.length > 0) { - breakings += commit.notes.length - level = 0 - } else if (commit.type === 'feat') { - features += 1 - if (level === 2) { - level = 1 - } - } - }) - - return { - level: level, - reason: `There are ${breakings} BREAKING CHANGES and ${features} features` - } - } -} diff --git a/packages/conventional-changelog-atom/conventionalChangelog.js b/packages/conventional-changelog-atom/conventionalChangelog.js new file mode 100644 index 000000000..9c91ac16e --- /dev/null +++ b/packages/conventional-changelog-atom/conventionalChangelog.js @@ -0,0 +1,10 @@ +'use strict' + +function createConventionalChangelogOpts (parserOpts, writerOpts) { + return { + parserOpts, + writerOpts + } +} + +module.exports.createConventionalChangelogOpts = createConventionalChangelogOpts diff --git a/packages/conventional-changelog-atom/conventionalRecommendedBump.js b/packages/conventional-changelog-atom/conventionalRecommendedBump.js new file mode 100644 index 000000000..52691a728 --- /dev/null +++ b/packages/conventional-changelog-atom/conventionalRecommendedBump.js @@ -0,0 +1,32 @@ +'use strict' + +function createConventionalRecommendedBumpOpts (parserOpts) { + return { + parserOpts, + + whatBump (commits) { + let level = 2 + let breakings = 0 + let features = 0 + + commits.forEach(commit => { + if (commit.notes.length > 0) { + breakings += commit.notes.length + level = 0 + } else if (commit.type === 'feat') { + features += 1 + if (level === 2) { + level = 1 + } + } + }) + + return { + level: level, + reason: `There are ${breakings} BREAKING CHANGES and ${features} features` + } + } + } +} + +module.exports.createConventionalRecommendedBumpOpts = createConventionalRecommendedBumpOpts diff --git a/packages/conventional-changelog-atom/index.js b/packages/conventional-changelog-atom/index.js index 3107e7928..fb8c351e1 100644 --- a/packages/conventional-changelog-atom/index.js +++ b/packages/conventional-changelog-atom/index.js @@ -1,19 +1,22 @@ 'use strict' -const conventionalChangelog = require('./conventional-changelog') -const parserOpts = require('./parser-opts') -const recommendedBumpOpts = require('./conventional-recommended-bump') -const writerOpts = require('./writer-opts') -module.exports = presetOpts +const { createParserOpts } = require('./parserOpts') +const { createWriterOpts } = require('./writerOpts') +const { createConventionalChangelogOpts } = require('./conventionalChangelog') +const { createConventionalRecommendedBumpOpts } = require('./conventionalRecommendedBump') -function presetOpts (cb) { - Promise.all([conventionalChangelog, parserOpts, recommendedBumpOpts, writerOpts]) - .then(([conventionalChangelog, parserOpts, recommendedBumpOpts, writerOpts]) => { - cb(null, { - conventionalChangelog, - parserOpts, - recommendedBumpOpts, - writerOpts - }) - }) +async function createPreset () { + const parserOpts = createParserOpts() + const writerOpts = await createWriterOpts() + const recommendedBumpOpts = createConventionalRecommendedBumpOpts(parserOpts) + const conventionalChangelog = createConventionalChangelogOpts(parserOpts, writerOpts) + + return { + parserOpts, + writerOpts, + recommendedBumpOpts, + conventionalChangelog + } } + +module.exports = createPreset diff --git a/packages/conventional-changelog-atom/package.json b/packages/conventional-changelog-atom/package.json index db03c5ce7..cc938131b 100644 --- a/packages/conventional-changelog-atom/package.json +++ b/packages/conventional-changelog-atom/package.json @@ -21,11 +21,11 @@ }, "license": "ISC", "files": [ - "conventional-changelog.js", - "conventional-recommended-bump.js", + "conventionalChangelog.js", + "conventionalRecommendedBump.js", "index.js", - "parser-opts.js", - "writer-opts.js", + "parserOpts.js", + "writerOpts.js", "templates" ], "bugs": { diff --git a/packages/conventional-changelog-atom/parser-opts.js b/packages/conventional-changelog-atom/parser-opts.js deleted file mode 100644 index 3549b7517..000000000 --- a/packages/conventional-changelog-atom/parser-opts.js +++ /dev/null @@ -1,9 +0,0 @@ -'use strict' - -module.exports = { - headerPattern: /^(:.*?:) (.*)$/, - headerCorrespondence: [ - 'emoji', - 'shortDesc' - ] -} diff --git a/packages/conventional-changelog-atom/parserOpts.js b/packages/conventional-changelog-atom/parserOpts.js new file mode 100644 index 000000000..c18ec03f3 --- /dev/null +++ b/packages/conventional-changelog-atom/parserOpts.js @@ -0,0 +1,13 @@ +'use strict' + +function createParserOpts () { + return { + headerPattern: /^(:.*?:) (.*)$/, + headerCorrespondence: [ + 'emoji', + 'shortDesc' + ] + } +} + +module.exports.createParserOpts = createParserOpts diff --git a/packages/conventional-changelog-atom/writer-opts.js b/packages/conventional-changelog-atom/writerOpts.js similarity index 58% rename from packages/conventional-changelog-atom/writer-opts.js rename to packages/conventional-changelog-atom/writerOpts.js index c7f094689..adfb10486 100644 --- a/packages/conventional-changelog-atom/writer-opts.js +++ b/packages/conventional-changelog-atom/writerOpts.js @@ -3,20 +3,22 @@ const { readFile } = require('fs').promises const { resolve } = require('path') -module.exports = Promise.all([ - readFile(resolve(__dirname, './templates/template.hbs'), 'utf-8'), - readFile(resolve(__dirname, './templates/header.hbs'), 'utf-8'), - readFile(resolve(__dirname, './templates/commit.hbs'), 'utf-8') -]) - .then(([template, header, commit]) => { - const writerOpts = getWriterOpts() - - writerOpts.mainTemplate = template - writerOpts.headerPartial = header - writerOpts.commitPartial = commit - - return writerOpts - }) +async function createWriterOpts () { + const [template, header, commit] = await Promise.all([ + readFile(resolve(__dirname, './templates/template.hbs'), 'utf-8'), + readFile(resolve(__dirname, './templates/header.hbs'), 'utf-8'), + readFile(resolve(__dirname, './templates/commit.hbs'), 'utf-8') + ]) + const writerOpts = getWriterOpts() + + writerOpts.mainTemplate = template + writerOpts.headerPartial = header + writerOpts.commitPartial = commit + + return writerOpts +} + +module.exports.createWriterOpts = createWriterOpts function getWriterOpts () { return { diff --git a/packages/conventional-changelog-cli/README.md b/packages/conventional-changelog-cli/README.md index eacdde760..3756e34b1 100644 --- a/packages/conventional-changelog-cli/README.md +++ b/packages/conventional-changelog-cli/README.md @@ -31,7 +31,7 @@ All available command line parameters can be listed using CLI: `conventional-cha **Hint:** You can alias your command or add it to your package.json. EG: `"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0"`. -To fully customize the tool, please checkout [conventional-changelog](https://github.com/ajoslin/conventional-changelog) and [conventional-changelog-core](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-core) docs. You can find more details there. **Note: `config` here can work with `preset`, which is different than `options.config` in conventional-changelog.** +To fully customize the tool, please checkout [conventional-changelog](https://github.com/conventional-changelog/conventional-changelog) and [conventional-changelog-core](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-core) docs. You can find more details there. **Note: `config` here can work with `preset`, which is different than `options.config` in conventional-changelog.** ## Example output diff --git a/packages/conventional-changelog-cli/test/test.js b/packages/conventional-changelog-cli/test/test.js index ba0de1c4a..ab023838b 100644 --- a/packages/conventional-changelog-cli/test/test.js +++ b/packages/conventional-changelog-cli/test/test.js @@ -399,7 +399,7 @@ describe('cli', function () { cp.stderr .pipe(concat(function (chunk) { - expect(chunk.toString()).to.include('Preset: "no" does not exist\n') + expect(chunk.toString()).to.include('Unable to load the "no" preset.') })) cp.on('close', function (code) { diff --git a/packages/conventional-changelog-codemirror/README.md b/packages/conventional-changelog-codemirror/README.md index 823444e8e..0bce92143 100644 --- a/packages/conventional-changelog-codemirror/README.md +++ b/packages/conventional-changelog-codemirror/README.md @@ -1,13 +1,37 @@ -# [![NPM version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Dependency Status][daviddm-image]][daviddm-url] [![Coverage Status][coverage-image]][coverage-url] +# conventional-changelog-codemirror -> [conventional-changelog](https://github.com/ajoslin/conventional-changelog) [CodeMirror](https://github.com/codemirror/codemirror) preset +[![NPM version][npm]][npm-url] +[![Node version][node]][node-url] +[![Dependencies status][deps]][deps-url] +[![Build status][build]][build-url] +[![Coverage status][coverage]][coverage-url] +[npm]: https://img.shields.io/npm/v/conventional-changelog-codemirror.svg +[npm-url]: https://npmjs.com/package/conventional-changelog-codemirror -[npm-image]: https://badge.fury.io/js/conventional-changelog-codemirror.svg -[npm-url]: https://npmjs.org/package/conventional-changelog-codemirror -[travis-image]: https://travis-ci.org/stevemao/conventional-changelog-codemirror.svg?branch=master -[travis-url]: https://travis-ci.org/stevemao/conventional-changelog-codemirror -[daviddm-image]: https://david-dm.org/stevemao/conventional-changelog-codemirror.svg?theme=shields.io -[daviddm-url]: https://david-dm.org/stevemao/conventional-changelog-codemirror -[coverage-image]: https://coveralls.io/repos/github/conventional-changelog/conventional-changelog/badge.svg?branch=master +[node]: https://img.shields.io/node/v/conventional-changelog-codemirror.svg +[node-url]: https://nodejs.org + +[deps]: https://img.shields.io/librariesio/release/npm/conventional-changelog-codemirror +[deps-url]: https://libraries.io/npm/conventional-changelog-codemirror/tree + +[build]: https://img.shields.io/github/actions/workflow/status/conventional-changelog/conventional-changelog/ci.yaml?branch=master +[build-url]: https://github.com/conventional-changelog/conventional-changelog/actions + +[coverage]: https://coveralls.io/repos/github/conventional-changelog/conventional-changelog/badge.svg?branch=master [coverage-url]: https://coveralls.io/github/conventional-changelog/conventional-changelog?branch=master + +[conventional-changelog](https://github.com/conventional-changelog/conventional-changelog) [CodeMirror](https://github.com/codemirror/codemirror) preset. + +**Issues with the convention itself should be reported on the CodeMirror issue tracker.** + +## Install + +```bash +# yarn +yarn add -D conventional-changelog-codemirror +# pnpm +pnpm add -D conventional-changelog-codemirror +# npm +npm i -D conventional-changelog-codemirror +``` diff --git a/packages/conventional-changelog-codemirror/conventional-changelog.js b/packages/conventional-changelog-codemirror/conventional-changelog.js deleted file mode 100644 index afa9f2e3b..000000000 --- a/packages/conventional-changelog-codemirror/conventional-changelog.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict' - -const parserOpts = require('./parser-opts') -const writerOpts = require('./writer-opts') - -module.exports = Promise.all([parserOpts, writerOpts]) - .then(([parserOpts, writerOpts]) => ({ - parserOpts, - writerOpts - })) diff --git a/packages/conventional-changelog-codemirror/conventional-recommended-bump.js b/packages/conventional-changelog-codemirror/conventional-recommended-bump.js deleted file mode 100644 index 5cf6153f5..000000000 --- a/packages/conventional-changelog-codemirror/conventional-recommended-bump.js +++ /dev/null @@ -1,30 +0,0 @@ -'use strict' - -const parserOpts = require('./parser-opts') - -module.exports = { - parserOpts, - - whatBump: (commits) => { - let level = 2 - let breakings = 0 - let features = 0 - - commits.forEach(commit => { - if (commit.notes.length > 0) { - breakings += commit.notes.length - level = 0 - } else if (commit.type === 'feat') { - features += 1 - if (level === 2) { - level = 1 - } - } - }) - - return { - level: level, - reason: `There are ${breakings} BREAKING CHANGES and ${features} features` - } - } -} diff --git a/packages/conventional-changelog-codemirror/conventionalChangelog.js b/packages/conventional-changelog-codemirror/conventionalChangelog.js new file mode 100644 index 000000000..9c91ac16e --- /dev/null +++ b/packages/conventional-changelog-codemirror/conventionalChangelog.js @@ -0,0 +1,10 @@ +'use strict' + +function createConventionalChangelogOpts (parserOpts, writerOpts) { + return { + parserOpts, + writerOpts + } +} + +module.exports.createConventionalChangelogOpts = createConventionalChangelogOpts diff --git a/packages/conventional-changelog-codemirror/conventionalRecommendedBump.js b/packages/conventional-changelog-codemirror/conventionalRecommendedBump.js new file mode 100644 index 000000000..52691a728 --- /dev/null +++ b/packages/conventional-changelog-codemirror/conventionalRecommendedBump.js @@ -0,0 +1,32 @@ +'use strict' + +function createConventionalRecommendedBumpOpts (parserOpts) { + return { + parserOpts, + + whatBump (commits) { + let level = 2 + let breakings = 0 + let features = 0 + + commits.forEach(commit => { + if (commit.notes.length > 0) { + breakings += commit.notes.length + level = 0 + } else if (commit.type === 'feat') { + features += 1 + if (level === 2) { + level = 1 + } + } + }) + + return { + level: level, + reason: `There are ${breakings} BREAKING CHANGES and ${features} features` + } + } + } +} + +module.exports.createConventionalRecommendedBumpOpts = createConventionalRecommendedBumpOpts diff --git a/packages/conventional-changelog-codemirror/index.js b/packages/conventional-changelog-codemirror/index.js index 3107e7928..fb8c351e1 100644 --- a/packages/conventional-changelog-codemirror/index.js +++ b/packages/conventional-changelog-codemirror/index.js @@ -1,19 +1,22 @@ 'use strict' -const conventionalChangelog = require('./conventional-changelog') -const parserOpts = require('./parser-opts') -const recommendedBumpOpts = require('./conventional-recommended-bump') -const writerOpts = require('./writer-opts') -module.exports = presetOpts +const { createParserOpts } = require('./parserOpts') +const { createWriterOpts } = require('./writerOpts') +const { createConventionalChangelogOpts } = require('./conventionalChangelog') +const { createConventionalRecommendedBumpOpts } = require('./conventionalRecommendedBump') -function presetOpts (cb) { - Promise.all([conventionalChangelog, parserOpts, recommendedBumpOpts, writerOpts]) - .then(([conventionalChangelog, parserOpts, recommendedBumpOpts, writerOpts]) => { - cb(null, { - conventionalChangelog, - parserOpts, - recommendedBumpOpts, - writerOpts - }) - }) +async function createPreset () { + const parserOpts = createParserOpts() + const writerOpts = await createWriterOpts() + const recommendedBumpOpts = createConventionalRecommendedBumpOpts(parserOpts) + const conventionalChangelog = createConventionalChangelogOpts(parserOpts, writerOpts) + + return { + parserOpts, + writerOpts, + recommendedBumpOpts, + conventionalChangelog + } } + +module.exports = createPreset diff --git a/packages/conventional-changelog-codemirror/package.json b/packages/conventional-changelog-codemirror/package.json index 4253b14d7..330f2f12e 100644 --- a/packages/conventional-changelog-codemirror/package.json +++ b/packages/conventional-changelog-codemirror/package.json @@ -21,11 +21,11 @@ }, "license": "ISC", "files": [ - "conventional-changelog.js", - "conventional-recommended-bump.js", + "conventionalChangelog.js", + "conventionalRecommendedBump.js", "index.js", - "parser-opts.js", - "writer-opts.js", + "parserOpts.js", + "writerOpts.js", "templates" ], "bugs": { diff --git a/packages/conventional-changelog-codemirror/parser-opts.js b/packages/conventional-changelog-codemirror/parser-opts.js deleted file mode 100644 index 6243cdb7b..000000000 --- a/packages/conventional-changelog-codemirror/parser-opts.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict' - -module.exports = { - headerPattern: /^\[(.*?)(?: (.*))?] (.*)$/, - headerCorrespondence: [ - 'language', - 'type', - 'message' - ] -} diff --git a/packages/conventional-changelog-codemirror/parserOpts.js b/packages/conventional-changelog-codemirror/parserOpts.js new file mode 100644 index 000000000..3529dd715 --- /dev/null +++ b/packages/conventional-changelog-codemirror/parserOpts.js @@ -0,0 +1,14 @@ +'use strict' + +function createParserOpts () { + return { + headerPattern: /^\[(.*?)(?: (.*))?] (.*)$/, + headerCorrespondence: [ + 'language', + 'type', + 'message' + ] + } +} + +module.exports.createParserOpts = createParserOpts diff --git a/packages/conventional-changelog-codemirror/writer-opts.js b/packages/conventional-changelog-codemirror/writer-opts.js deleted file mode 100644 index cda2a17ae..000000000 --- a/packages/conventional-changelog-codemirror/writer-opts.js +++ /dev/null @@ -1,38 +0,0 @@ -'use strict' - -const { readFile } = require('fs').promises -const { resolve } = require('path') - -module.exports = Promise.all([ - readFile(resolve(__dirname, './templates/template.hbs'), 'utf-8'), - readFile(resolve(__dirname, './templates/header.hbs'), 'utf-8'), - readFile(resolve(__dirname, './templates/commit.hbs'), 'utf-8') -]) - .then(([template, header, commit]) => { - const writerOpts = getWriterOpts() - - writerOpts.mainTemplate = template - writerOpts.headerPartial = header - writerOpts.commitPartial = commit - - return writerOpts - }) - -function getWriterOpts () { - return { - transform: (commit) => { - if (!commit.language) { - return - } - - if (typeof commit.hash === 'string') { - commit.shortHash = commit.hash.substring(0, 7) - } - - return commit - }, - groupBy: 'language', - commitGroupsSort: 'title', - commitsSort: ['language', 'type', 'message'] - } -} diff --git a/packages/conventional-changelog-codemirror/writerOpts.js b/packages/conventional-changelog-codemirror/writerOpts.js new file mode 100644 index 000000000..c59af39e0 --- /dev/null +++ b/packages/conventional-changelog-codemirror/writerOpts.js @@ -0,0 +1,40 @@ +'use strict' + +const { readFile } = require('fs').promises +const { resolve } = require('path') + +async function createWriterOpts () { + const [template, header, commit] = await Promise.all([ + readFile(resolve(__dirname, './templates/template.hbs'), 'utf-8'), + readFile(resolve(__dirname, './templates/header.hbs'), 'utf-8'), + readFile(resolve(__dirname, './templates/commit.hbs'), 'utf-8') + ]) + const writerOpts = getWriterOpts() + + writerOpts.mainTemplate = template + writerOpts.headerPartial = header + writerOpts.commitPartial = commit + + return writerOpts +} + +module.exports.createWriterOpts = createWriterOpts + +function getWriterOpts () { + return { + transform: (commit) => { + if (!commit.language) { + return + } + + if (typeof commit.hash === 'string') { + commit.shortHash = commit.hash.substring(0, 7) + } + + return commit + }, + groupBy: 'language', + commitGroupsSort: 'title', + commitsSort: ['language', 'type', 'message'] + } +} diff --git a/packages/conventional-changelog-conventionalcommits/README.md b/packages/conventional-changelog-conventionalcommits/README.md index 236c7ad56..a1fa64f20 100644 --- a/packages/conventional-changelog-conventionalcommits/README.md +++ b/packages/conventional-changelog-conventionalcommits/README.md @@ -1,11 +1,38 @@ -# [![Build Status][travis-image]][travis-url] [![Coverage Status][coverage-image]][coverage-url] +# conventional-changelog-conventionalcommits -## conventionalcommits.org convention +[![NPM version][npm]][npm-url] +[![Node version][node]][node-url] +[![Dependencies status][deps]][deps-url] +[![Build status][build]][build-url] +[![Coverage status][coverage]][coverage-url] -A concrete implementation of the specification described at -[conventionalcommits.org](https://conventionalcommits.org/) for automated -CHANGELOG generation and version management. +[npm]: https://img.shields.io/npm/v/conventional-changelog-conventionalcommits.svg +[npm-url]: https://npmjs.com/package/conventional-changelog-conventionalcommits +[node]: https://img.shields.io/node/v/conventional-changelog-conventionalcommits.svg +[node-url]: https://nodejs.org + +[deps]: https://img.shields.io/librariesio/release/npm/conventional-changelog-conventionalcommits +[deps-url]: https://libraries.io/npm/conventional-changelog-conventionalcommits/tree + +[build]: https://img.shields.io/github/actions/workflow/status/conventional-changelog/conventional-changelog/ci.yaml?branch=master +[build-url]: https://github.com/conventional-changelog/conventional-changelog/actions + +[coverage]: https://coveralls.io/repos/github/conventional-changelog/conventional-changelog/badge.svg?branch=master +[coverage-url]: https://coveralls.io/github/conventional-changelog/conventional-changelog?branch=master + +A concrete implementation of the specification described at [conventionalcommits.org](https://conventionalcommits.org/) for automated CHANGELOG generation and version management. + +## Install + +```bash +# yarn +yarn add -D conventional-changelog-conventionalcommits +# pnpm +pnpm add -D conventional-changelog-conventionalcommits +# npm +npm i -D conventional-changelog-conventionalcommits +``` ## Indirect Usage (as preset) @@ -13,38 +40,33 @@ Use the [Conventional Changelog CLI Quick Start](https://github.com/conventional ## Direct Usage (as a base preset so you can customize it) -If you want to use this package directly and pass options, you can use the [Conventional Changelog CLI Quick Start](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-cli#quick-start) and with the `--config` or `-n` parameter, pass a js config that looks like this -``` -'use strict' -const config = require('conventional-changelog-conventionalcommits') +If you want to use this package directly and pass options, you can use the [Conventional Changelog CLI Quick Start](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-cli#quick-start) and with the `--config` or `-n` parameter, pass a js config that looks like this: -module.exports = config({ - "issuePrefixes": ["TEST-"], - "issueUrlFormat": "https://myBugTracker.com/{{prefix}}{{id}}" +```js +const createPreset = require('conventional-changelog-conventionalcommits') + +createPreset({ + issuePrefixes: ['TEST-'], + issueUrlFormat: 'https://myBugTracker.com/{{prefix}}{{id}}' +}).then((config) => { + // do something with the config }) ``` or json config like that: -``` + +```json { - "options": { - "preset": { - "name": "conventionalchangelog", - "issuePrefixes": ["TEST-"], - "issueUrlFormat": "https://myBugTracker.com/{{prefix}}{{id}}" - } + "options": { + "preset": { + "name": "conventionalchangelog", + "issuePrefixes": ["TEST-"], + "issueUrlFormat": "https://myBugTracker.com/{{prefix}}{{id}}" } + } } ``` -This last json config way passes the `preset` object to the `conventional-changelog-preset-loader` package, that in turn, passes this same `preset` object as the config for the `conventional-changelog-conventionalcommits`. - - - -See [conventional-changelog-config-spec](https://github.com/conventional-changelog/conventional-changelog-config-spec) for available -configuration options. +This last json config way passes the `preset` object to the `conventional-changelog-preset-loader` package, that in turn, passes this same `preset` object as the config for the `conventional-changelog-conventionalcommits`. -[travis-image]: https://travis-ci.org/conventional-changelog/conventional-changelog.svg?branch=master -[travis-url]: https://travis-ci.org/conventional-changelog/conventional-changelog -[coverage-image]: https://coveralls.io/repos/github/conventional-changelog/conventional-changelog/badge.svg?branch=master -[coverage-url]: https://coveralls.io/github/conventional-changelog/conventional-changelog?branch=master +See [conventional-changelog-config-spec](https://github.com/conventional-changelog/conventional-changelog-config-spec) for available configuration options. diff --git a/packages/conventional-changelog-conventionalcommits/conventional-changelog.js b/packages/conventional-changelog-conventionalcommits/conventional-changelog.js deleted file mode 100644 index 399789500..000000000 --- a/packages/conventional-changelog-conventionalcommits/conventional-changelog.js +++ /dev/null @@ -1,12 +0,0 @@ -'use strict' - -const parserOpts = require('./parser-opts') -const writerOpts = require('./writer-opts') - -module.exports = function (config) { - return Promise.all([parserOpts(config), writerOpts(config)]) - .then(([parserOpts, writerOpts]) => ({ - parserOpts, - writerOpts - })) -} diff --git a/packages/conventional-changelog-conventionalcommits/conventionalChangelog.js b/packages/conventional-changelog-conventionalcommits/conventionalChangelog.js new file mode 100644 index 000000000..9c91ac16e --- /dev/null +++ b/packages/conventional-changelog-conventionalcommits/conventionalChangelog.js @@ -0,0 +1,10 @@ +'use strict' + +function createConventionalChangelogOpts (parserOpts, writerOpts) { + return { + parserOpts, + writerOpts + } +} + +module.exports.createConventionalChangelogOpts = createConventionalChangelogOpts diff --git a/packages/conventional-changelog-conventionalcommits/conventional-recommended-bump.js b/packages/conventional-changelog-conventionalcommits/conventionalRecommendedBump.js similarity index 78% rename from packages/conventional-changelog-conventionalcommits/conventional-recommended-bump.js rename to packages/conventional-changelog-conventionalcommits/conventionalRecommendedBump.js index ee2cf92da..32d3722ea 100644 --- a/packages/conventional-changelog-conventionalcommits/conventional-recommended-bump.js +++ b/packages/conventional-changelog-conventionalcommits/conventionalRecommendedBump.js @@ -1,13 +1,12 @@ 'use strict' -const addBangNotes = require('./add-bang-notes') -const parserOpts = require('./parser-opts') +const { addBangNotes } = require('./utils') -module.exports = function (config) { +function createConventionalRecommendedBumpOpts (config, parserOpts) { return { - parserOpts: parserOpts(config), + parserOpts, - whatBump: (commits) => { + whatBump (commits) { let level = 2 let breakings = 0 let features = 0 @@ -41,3 +40,5 @@ module.exports = function (config) { } } } + +module.exports.createConventionalRecommendedBumpOpts = createConventionalRecommendedBumpOpts diff --git a/packages/conventional-changelog-conventionalcommits/index.js b/packages/conventional-changelog-conventionalcommits/index.js index 9677410eb..c16241400 100644 --- a/packages/conventional-changelog-conventionalcommits/index.js +++ b/packages/conventional-changelog-conventionalcommits/index.js @@ -1,47 +1,25 @@ 'use strict' -const conventionalChangelog = require('./conventional-changelog') -const parserOpts = require('./parser-opts') -const recommendedBumpOpts = require('./conventional-recommended-bump') -const writerOpts = require('./writer-opts') -module.exports = function (parameter) { - // parameter passed can be either a config object or a callback function - if (typeof parameter === 'function') { - // parameter is a callback object - const config = {} - // FIXME: use presetOpts(config) for callback - Promise.all([ - conventionalChangelog(config), - parserOpts(config), - recommendedBumpOpts(config), - writerOpts(config) - ]).then(([conventionalChangelog, parserOpts, recommendedBumpOpts, writerOpts]) => { - parameter(null, { - gitRawCommitsOpts: { - noMerges: null - }, - conventionalChangelog, - parserOpts, - recommendedBumpOpts, - writerOpts - }) - }) - } else { - const config = parameter || {} - return presetOpts(config) - } -} +const { createParserOpts } = require('./parserOpts') +const { createWriterOpts } = require('./writerOpts') +const { createConventionalChangelogOpts } = require('./conventionalChangelog') +const { createConventionalRecommendedBumpOpts } = require('./conventionalRecommendedBump') + +async function createPreset (config) { + const parserOpts = createParserOpts(config) + const writerOpts = await createWriterOpts(config) + const recommendedBumpOpts = createConventionalRecommendedBumpOpts(config, parserOpts) + const conventionalChangelog = createConventionalChangelogOpts(parserOpts, writerOpts) -function presetOpts (config) { - return Promise.all([ - conventionalChangelog(config), - parserOpts(config), - recommendedBumpOpts(config), - writerOpts(config) - ]).then(([conventionalChangelog, parserOpts, recommendedBumpOpts, writerOpts]) => ({ - conventionalChangelog, + return { + gitRawCommitsOpts: { + noMerges: null + }, parserOpts, + writerOpts, recommendedBumpOpts, - writerOpts - })) + conventionalChangelog + } } + +module.exports = createPreset diff --git a/packages/conventional-changelog-conventionalcommits/package.json b/packages/conventional-changelog-conventionalcommits/package.json index 1470fbb78..0ff1c769f 100644 --- a/packages/conventional-changelog-conventionalcommits/package.json +++ b/packages/conventional-changelog-conventionalcommits/package.json @@ -16,12 +16,12 @@ "preset" ], "files": [ - "add-bang-notes.js", - "conventional-changelog.js", - "conventional-recommended-bump.js", + "utils.js", + "conventionalChangelog.js", + "conventionalRecommendedBump.js", "index.js", - "parser-opts.js", - "writer-opts.js", + "parserOpts.js", + "writerOpts.js", "templates" ], "author": "Ben Coe", diff --git a/packages/conventional-changelog-conventionalcommits/parser-opts.js b/packages/conventional-changelog-conventionalcommits/parser-opts.js deleted file mode 100644 index c79131359..000000000 --- a/packages/conventional-changelog-conventionalcommits/parser-opts.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict' - -module.exports = function (config) { - config = defaultConfig(config) - return { - headerPattern: /^(\w*)(?:\((.*)\))?!?: (.*)$/, - breakingHeaderPattern: /^(\w*)(?:\((.*)\))?!: (.*)$/, - headerCorrespondence: [ - 'type', - 'scope', - 'subject' - ], - noteKeywords: ['BREAKING CHANGE', 'BREAKING-CHANGE'], - revertPattern: /^(?:Revert|revert:)\s"?([\s\S]+?)"?\s*This reverts commit (\w*)\./i, - revertCorrespondence: ['header', 'hash'], - issuePrefixes: config.issuePrefixes - } -} - -// merge user set configuration with default configuration. -function defaultConfig (config) { - config = config || {} - config.issuePrefixes = config.issuePrefixes || ['#'] - return config -} diff --git a/packages/conventional-changelog-conventionalcommits/parserOpts.js b/packages/conventional-changelog-conventionalcommits/parserOpts.js new file mode 100644 index 000000000..93649aef7 --- /dev/null +++ b/packages/conventional-changelog-conventionalcommits/parserOpts.js @@ -0,0 +1,21 @@ +'use strict' + +const { breakingHeaderPattern } = require('./utils') + +function createParserOpts (config) { + return { + headerPattern: /^(\w*)(?:\((.*)\))?!?: (.*)$/, + breakingHeaderPattern, + headerCorrespondence: [ + 'type', + 'scope', + 'subject' + ], + noteKeywords: ['BREAKING CHANGE', 'BREAKING-CHANGE'], + revertPattern: /^(?:Revert|revert:)\s"?([\s\S]+?)"?\s*This reverts commit (\w*)\./i, + revertCorrespondence: ['header', 'hash'], + issuePrefixes: config?.issuePrefixes || ['#'] + } +} + +module.exports.createParserOpts = createParserOpts diff --git a/packages/conventional-changelog-conventionalcommits/add-bang-notes.js b/packages/conventional-changelog-conventionalcommits/utils.js similarity index 53% rename from packages/conventional-changelog-conventionalcommits/add-bang-notes.js rename to packages/conventional-changelog-conventionalcommits/utils.js index 4d612af76..fcce1170d 100644 --- a/packages/conventional-changelog-conventionalcommits/add-bang-notes.js +++ b/packages/conventional-changelog-conventionalcommits/utils.js @@ -1,6 +1,8 @@ -const { breakingHeaderPattern } = require('./parser-opts')() +const breakingHeaderPattern = /^(\w*)(?:\((.*)\))?!: (.*)$/ -module.exports = (commit) => { +module.exports.breakingHeaderPattern = breakingHeaderPattern + +function addBangNotes (commit) { const match = commit.header.match(breakingHeaderPattern) if (match && commit.notes.length === 0) { const noteText = match[3] // the description of the change. @@ -9,3 +11,5 @@ module.exports = (commit) => { }) } } + +module.exports.addBangNotes = addBangNotes diff --git a/packages/conventional-changelog-conventionalcommits/writer-opts.js b/packages/conventional-changelog-conventionalcommits/writerOpts.js similarity index 71% rename from packages/conventional-changelog-conventionalcommits/writer-opts.js rename to packages/conventional-changelog-conventionalcommits/writerOpts.js index e4f6df5ec..857bb6f60 100644 --- a/packages/conventional-changelog-conventionalcommits/writer-opts.js +++ b/packages/conventional-changelog-conventionalcommits/writerOpts.js @@ -1,11 +1,11 @@ 'use strict' -const addBangNotes = require('./add-bang-notes') const compareFunc = require('compare-func') const { readFile } = require('fs').promises const { resolve } = require('path') -const releaseAsRe = /release-as:\s*\w*@?([0-9]+\.[0-9]+\.[0-9a-z]+(-[0-9a-z.]+)?)\s*/i +const { addBangNotes } = require('./utils') +const releaseAsRegex = /release-as:\s*\w*@?([0-9]+\.[0-9]+\.[0-9a-z]+(-[0-9a-z.]+)?)\s*/i /** * Handlebar partials for various property substitutions based on commit context. */ @@ -13,19 +13,40 @@ const owner = '{{#if this.owner}}{{~this.owner}}{{else}}{{~@root.owner}}{{/if}}' const host = '{{~@root.host}}' const repository = '{{#if this.repository}}{{~this.repository}}{{else}}{{~@root.repository}}{{/if}}' -module.exports = async (config) => { - config = defaultConfig(config) - const commitUrlFormat = expandTemplate(config.commitUrlFormat, { +async function createWriterOpts (config) { + const finalConfig = { + types: [ + { type: 'feat', section: 'Features' }, + { type: 'feature', section: 'Features' }, + { type: 'fix', section: 'Bug Fixes' }, + { type: 'perf', section: 'Performance Improvements' }, + { type: 'revert', section: 'Reverts' }, + { type: 'docs', section: 'Documentation', hidden: true }, + { type: 'style', section: 'Styles', hidden: true }, + { type: 'chore', section: 'Miscellaneous Chores', hidden: true }, + { type: 'refactor', section: 'Code Refactoring', hidden: true }, + { type: 'test', section: 'Tests', hidden: true }, + { type: 'build', section: 'Build System', hidden: true }, + { type: 'ci', section: 'Continuous Integration', hidden: true } + ], + issueUrlFormat: '{{host}}/{{owner}}/{{repository}}/issues/{{id}}', + commitUrlFormat: '{{host}}/{{owner}}/{{repository}}/commit/{{hash}}', + compareUrlFormat: '{{host}}/{{owner}}/{{repository}}/compare/{{previousTag}}...{{currentTag}}', + userUrlFormat: '{{host}}/{{user}}', + issuePrefixes: ['#'], + ...config + } + const commitUrlFormat = expandTemplate(finalConfig.commitUrlFormat, { host, owner, repository }) - const compareUrlFormat = expandTemplate(config.compareUrlFormat, { + const compareUrlFormat = expandTemplate(finalConfig.compareUrlFormat, { host, owner, repository }) - const issueUrlFormat = expandTemplate(config.issueUrlFormat, { + const issueUrlFormat = expandTemplate(finalConfig.issueUrlFormat, { host, owner, repository, @@ -44,7 +65,7 @@ module.exports = async (config) => { readFile(resolve(__dirname, './templates/commit.hbs'), 'utf-8'), readFile(resolve(__dirname, './templates/footer.hbs'), 'utf-8') ]) - const writerOpts = getWriterOpts(config) + const writerOpts = getWriterOpts(finalConfig) writerOpts.mainTemplate = template writerOpts.headerPartial = header @@ -57,22 +78,9 @@ module.exports = async (config) => { return writerOpts } -function findTypeEntry (types, commit) { - const typeKey = (commit.revert ? 'revert' : (commit.type || '')).toLowerCase() - return types.find((entry) => { - if (entry.type !== typeKey) { - return false - } - if (entry.scope && entry.scope !== commit.scope) { - return false - } - return true - }) -} +module.exports.createWriterOpts = createWriterOpts function getWriterOpts (config) { - config = defaultConfig(config) - const commitGroupOrder = config.types.flatMap(t => t.section).filter(t => t) return { @@ -88,8 +96,8 @@ function getWriterOpts (config) { // Add an entry in the CHANGELOG if special Release-As footer // is used: - if ((commit.footer && releaseAsRe.test(commit.footer)) || - (commit.body && releaseAsRe.test(commit.body))) { + if ((commit.footer && releaseAsRegex.test(commit.footer)) || + (commit.body && releaseAsRegex.test(commit.body))) { discard = false } @@ -172,34 +180,17 @@ function getWriterOpts (config) { } } -// merge user set configuration with default configuration. -function defaultConfig (config) { - config = config || {} - config.types = config.types || [ - { type: 'feat', section: 'Features' }, - { type: 'feature', section: 'Features' }, - { type: 'fix', section: 'Bug Fixes' }, - { type: 'perf', section: 'Performance Improvements' }, - { type: 'revert', section: 'Reverts' }, - { type: 'docs', section: 'Documentation', hidden: true }, - { type: 'style', section: 'Styles', hidden: true }, - { type: 'chore', section: 'Miscellaneous Chores', hidden: true }, - { type: 'refactor', section: 'Code Refactoring', hidden: true }, - { type: 'test', section: 'Tests', hidden: true }, - { type: 'build', section: 'Build System', hidden: true }, - { type: 'ci', section: 'Continuous Integration', hidden: true } - ] - config.issueUrlFormat = config.issueUrlFormat || - '{{host}}/{{owner}}/{{repository}}/issues/{{id}}' - config.commitUrlFormat = config.commitUrlFormat || - '{{host}}/{{owner}}/{{repository}}/commit/{{hash}}' - config.compareUrlFormat = config.compareUrlFormat || - '{{host}}/{{owner}}/{{repository}}/compare/{{previousTag}}...{{currentTag}}' - config.userUrlFormat = config.userUrlFormat || - '{{host}}/{{user}}' - config.issuePrefixes = config.issuePrefixes || ['#'] - - return config +function findTypeEntry (types, commit) { + const typeKey = (commit.revert ? 'revert' : (commit.type || '')).toLowerCase() + return types.find((entry) => { + if (entry.type !== typeKey) { + return false + } + if (entry.scope && entry.scope !== commit.scope) { + return false + } + return true + }) } // expand on the simple mustache-style templates supported in diff --git a/packages/conventional-changelog-core/lib/merge-config.js b/packages/conventional-changelog-core/lib/merge-config.js index 48bf3cf54..ebb1bdd2a 100644 --- a/packages/conventional-changelog-core/lib/merge-config.js +++ b/packages/conventional-changelog-core/lib/merge-config.js @@ -1,5 +1,4 @@ 'use strict' -const { promisify } = require('util') const dateFormat = require('dateformat') const getPkgRepo = require('get-pkg-repo') const gitSemverTags = require('git-semver-tags') @@ -70,7 +69,6 @@ function omitUndefinedValueProps (obj) { } async function mergeConfig (options, context, gitRawCommitsOpts, parserOpts, writerOpts, gitRawExecOpts) { - let configPromise let pkgPromise options = omitUndefinedValueProps(options) @@ -113,14 +111,6 @@ async function mergeConfig (options, context, gitRawCommitsOpts, parserOpts, wri options.warn = options.warn || options.debug - if (options.config) { - if (typeof options.config === 'function') { - configPromise = promisify(options.config)() - } else { - configPromise = Promise.resolve(options.config) - } - } - if (options.pkg) { if (options.pkg.path) { pkgPromise = Promise.resolve(readPkg(options.pkg.path)) @@ -129,6 +119,7 @@ async function mergeConfig (options, context, gitRawCommitsOpts, parserOpts, wri } } + const presetConfig = typeof options.config === 'function' ? options.config() : options.config const gitRemoteOriginUrlPromise = Promise.resolve(gitRemoteOriginUrl()) const [ configObj, @@ -136,7 +127,7 @@ async function mergeConfig (options, context, gitRawCommitsOpts, parserOpts, wri tagsObj, gitRemoteOriginUrlObj ] = await Promise.allSettled([ - configPromise, + presetConfig, pkgPromise, semverTagsPromise(options), gitRemoteOriginUrlPromise @@ -150,11 +141,11 @@ async function mergeConfig (options, context, gitRawCommitsOpts, parserOpts, wri let gitSemverTags = [] - if (configPromise) { + if (options.config) { if (configObj.status === 'fulfilled') { config = configObj.value } else { - options.warn('Error in config' + configObj.reason.toString()) + options.warn(configObj.reason.toString()) config = {} } } else { diff --git a/packages/conventional-changelog-core/test/index.spec.js b/packages/conventional-changelog-core/test/index.spec.js index 5149ee2c7..99515b15f 100644 --- a/packages/conventional-changelog-core/test/index.spec.js +++ b/packages/conventional-changelog-core/test/index.spec.js @@ -1273,8 +1273,8 @@ describe('conventionalChangelogCore', function () { resolve(config) }) - const fn = function (cb) { - cb(null, config) + const fn = function () { + return config } it('should load object config', function (done) { diff --git a/packages/conventional-changelog-ember/README.md b/packages/conventional-changelog-ember/README.md index d853fa384..5b00e8ddd 100644 --- a/packages/conventional-changelog-ember/README.md +++ b/packages/conventional-changelog-ember/README.md @@ -1,9 +1,41 @@ -# [![NPM version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Dependency Status][daviddm-image]][daviddm-url] [![Coverage Status][coverage-image]][coverage-url] +# conventional-changelog-ember -> [conventional-changelog](https://github.com/ajoslin/conventional-changelog) [ember](https://github.com/emberjs/ember.js) preset +[![NPM version][npm]][npm-url] +[![Node version][node]][node-url] +[![Dependencies status][deps]][deps-url] +[![Build status][build]][build-url] +[![Coverage status][coverage]][coverage-url] + +[npm]: https://img.shields.io/npm/v/conventional-changelog-ember.svg +[npm-url]: https://npmjs.com/package/conventional-changelog-ember + +[node]: https://img.shields.io/node/v/conventional-changelog-ember.svg +[node-url]: https://nodejs.org + +[deps]: https://img.shields.io/librariesio/release/npm/conventional-changelog-ember +[deps-url]: https://libraries.io/npm/conventional-changelog-ember/tree + +[build]: https://img.shields.io/github/actions/workflow/status/conventional-changelog/conventional-changelog/ci.yaml?branch=master +[build-url]: https://github.com/conventional-changelog/conventional-changelog/actions + +[coverage]: https://coveralls.io/repos/github/conventional-changelog/conventional-changelog/badge.svg?branch=master +[coverage-url]: https://coveralls.io/github/conventional-changelog/conventional-changelog?branch=master + +[conventional-changelog](https://github.com/conventional-changelog/conventional-changelog) [ember](https://github.com/emberjs/ember.js) preset. **Issues with the convention itself should be reported on the Ember issue tracker.** +## Install + +```bash +# yarn +yarn add -D conventional-changelog-ember +# pnpm +pnpm add -D conventional-changelog-ember +# npm +npm i -D conventional-changelog-ember +``` + ## Ember Convention Please use an appropriate commit prefix. @@ -52,12 +84,3 @@ Security commits will be tagged as `[SECURITY cve]`. Please do not submit securi In general almost all commits should fall into one of these categories. In the cases where they don't please submit your PR untagged. An Ember contributor will let you know if tagging is required. Based on https://github.com/emberjs/ember.js/blob/master/CONTRIBUTING.md - -[npm-image]: https://badge.fury.io/js/conventional-changelog-ember.svg -[npm-url]: https://npmjs.org/package/conventional-changelog-ember -[travis-image]: https://travis-ci.org/stevemao/conventional-changelog-ember.svg?branch=master -[travis-url]: https://travis-ci.org/stevemao/conventional-changelog-ember -[daviddm-image]: https://david-dm.org/stevemao/conventional-changelog-ember.svg?theme=shields.io -[daviddm-url]: https://david-dm.org/stevemao/conventional-changelog-ember -[coverage-image]: https://coveralls.io/repos/github/conventional-changelog/conventional-changelog/badge.svg?branch=master -[coverage-url]: https://coveralls.io/github/conventional-changelog/conventional-changelog?branch=master diff --git a/packages/conventional-changelog-ember/conventional-changelog.js b/packages/conventional-changelog-ember/conventional-changelog.js deleted file mode 100644 index afa9f2e3b..000000000 --- a/packages/conventional-changelog-ember/conventional-changelog.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict' - -const parserOpts = require('./parser-opts') -const writerOpts = require('./writer-opts') - -module.exports = Promise.all([parserOpts, writerOpts]) - .then(([parserOpts, writerOpts]) => ({ - parserOpts, - writerOpts - })) diff --git a/packages/conventional-changelog-ember/conventional-recommended-bump.js b/packages/conventional-changelog-ember/conventional-recommended-bump.js deleted file mode 100644 index 5cf6153f5..000000000 --- a/packages/conventional-changelog-ember/conventional-recommended-bump.js +++ /dev/null @@ -1,30 +0,0 @@ -'use strict' - -const parserOpts = require('./parser-opts') - -module.exports = { - parserOpts, - - whatBump: (commits) => { - let level = 2 - let breakings = 0 - let features = 0 - - commits.forEach(commit => { - if (commit.notes.length > 0) { - breakings += commit.notes.length - level = 0 - } else if (commit.type === 'feat') { - features += 1 - if (level === 2) { - level = 1 - } - } - }) - - return { - level: level, - reason: `There are ${breakings} BREAKING CHANGES and ${features} features` - } - } -} diff --git a/packages/conventional-changelog-ember/conventionalChangelog.js b/packages/conventional-changelog-ember/conventionalChangelog.js new file mode 100644 index 000000000..9c91ac16e --- /dev/null +++ b/packages/conventional-changelog-ember/conventionalChangelog.js @@ -0,0 +1,10 @@ +'use strict' + +function createConventionalChangelogOpts (parserOpts, writerOpts) { + return { + parserOpts, + writerOpts + } +} + +module.exports.createConventionalChangelogOpts = createConventionalChangelogOpts diff --git a/packages/conventional-changelog-ember/conventionalRecommendedBump.js b/packages/conventional-changelog-ember/conventionalRecommendedBump.js new file mode 100644 index 000000000..52691a728 --- /dev/null +++ b/packages/conventional-changelog-ember/conventionalRecommendedBump.js @@ -0,0 +1,32 @@ +'use strict' + +function createConventionalRecommendedBumpOpts (parserOpts) { + return { + parserOpts, + + whatBump (commits) { + let level = 2 + let breakings = 0 + let features = 0 + + commits.forEach(commit => { + if (commit.notes.length > 0) { + breakings += commit.notes.length + level = 0 + } else if (commit.type === 'feat') { + features += 1 + if (level === 2) { + level = 1 + } + } + }) + + return { + level: level, + reason: `There are ${breakings} BREAKING CHANGES and ${features} features` + } + } + } +} + +module.exports.createConventionalRecommendedBumpOpts = createConventionalRecommendedBumpOpts diff --git a/packages/conventional-changelog-ember/index.js b/packages/conventional-changelog-ember/index.js index f0971171e..7f8d9d910 100644 --- a/packages/conventional-changelog-ember/index.js +++ b/packages/conventional-changelog-ember/index.js @@ -1,22 +1,25 @@ 'use strict' -const conventionalChangelog = require('./conventional-changelog') -const parserOpts = require('./parser-opts') -const recommendedBumpOpts = require('./conventional-recommended-bump') -const writerOpts = require('./writer-opts') -module.exports = presetOpts +const { createParserOpts } = require('./parserOpts') +const { createWriterOpts } = require('./writerOpts') +const { createConventionalChangelogOpts } = require('./conventionalChangelog') +const { createConventionalRecommendedBumpOpts } = require('./conventionalRecommendedBump') -function presetOpts (cb) { - Promise.all([conventionalChangelog, parserOpts, recommendedBumpOpts, writerOpts]) - .then(([conventionalChangelog, parserOpts, recommendedBumpOpts, writerOpts]) => { - cb(null, { - gitRawCommitsOpts: { - noMerges: null - }, - conventionalChangelog, - parserOpts, - recommendedBumpOpts, - writerOpts - }) - }) +async function createPreset () { + const parserOpts = createParserOpts() + const writerOpts = await createWriterOpts() + const recommendedBumpOpts = createConventionalRecommendedBumpOpts(parserOpts) + const conventionalChangelog = createConventionalChangelogOpts(parserOpts, writerOpts) + + return { + gitRawCommitsOpts: { + noMerges: null + }, + parserOpts, + writerOpts, + recommendedBumpOpts, + conventionalChangelog + } } + +module.exports = createPreset diff --git a/packages/conventional-changelog-ember/package.json b/packages/conventional-changelog-ember/package.json index 386e88fba..9ac14f56f 100644 --- a/packages/conventional-changelog-ember/package.json +++ b/packages/conventional-changelog-ember/package.json @@ -21,11 +21,11 @@ }, "license": "ISC", "files": [ - "conventional-changelog.js", - "conventional-recommended-bump.js", + "conventionalChangelog.js", + "conventionalRecommendedBump.js", "index.js", - "parser-opts.js", - "writer-opts.js", + "parserOpts.js", + "writerOpts.js", "templates" ], "bugs": { diff --git a/packages/conventional-changelog-ember/parser-opts.js b/packages/conventional-changelog-ember/parser-opts.js deleted file mode 100644 index 179e7fc31..000000000 --- a/packages/conventional-changelog-ember/parser-opts.js +++ /dev/null @@ -1,12 +0,0 @@ -'use strict' - -module.exports = { - mergePattern: /^Merge pull request #(.*) from .*$/, - mergeCorrespondence: ['pr'], - headerPattern: /^\[(.*) (.*)] (.*)$/, - headerCorrespondence: [ - 'tag', - 'taggedAs', - 'message' - ] -} diff --git a/packages/conventional-changelog-ember/parserOpts.js b/packages/conventional-changelog-ember/parserOpts.js new file mode 100644 index 000000000..7009d1cb6 --- /dev/null +++ b/packages/conventional-changelog-ember/parserOpts.js @@ -0,0 +1,16 @@ +'use strict' + +function createParserOpts () { + return { + mergePattern: /^Merge pull request #(.*) from .*$/, + mergeCorrespondence: ['pr'], + headerPattern: /^\[(.*) (.*)] (.*)$/, + headerCorrespondence: [ + 'tag', + 'taggedAs', + 'message' + ] + } +} + +module.exports.createParserOpts = createParserOpts diff --git a/packages/conventional-changelog-ember/writer-opts.js b/packages/conventional-changelog-ember/writerOpts.js similarity index 62% rename from packages/conventional-changelog-ember/writer-opts.js rename to packages/conventional-changelog-ember/writerOpts.js index 5415bfd69..858ccaf54 100644 --- a/packages/conventional-changelog-ember/writer-opts.js +++ b/packages/conventional-changelog-ember/writerOpts.js @@ -3,20 +3,22 @@ const { readFile } = require('fs').promises const { resolve } = require('path') -module.exports = Promise.all([ - readFile(resolve(__dirname, './templates/template.hbs'), 'utf-8'), - readFile(resolve(__dirname, './templates/header.hbs'), 'utf-8'), - readFile(resolve(__dirname, './templates/commit.hbs'), 'utf-8') -]) - .then(([template, header, commit]) => { - const writerOpts = getWriterOpts() - - writerOpts.mainTemplate = template - writerOpts.headerPartial = header - writerOpts.commitPartial = commit - - return writerOpts - }) +async function createWriterOpts () { + const [template, header, commit] = await Promise.all([ + readFile(resolve(__dirname, './templates/template.hbs'), 'utf-8'), + readFile(resolve(__dirname, './templates/header.hbs'), 'utf-8'), + readFile(resolve(__dirname, './templates/commit.hbs'), 'utf-8') + ]) + const writerOpts = getWriterOpts() + + writerOpts.mainTemplate = template + writerOpts.headerPartial = header + writerOpts.commitPartial = commit + + return writerOpts +} + +module.exports.createWriterOpts = createWriterOpts function getWriterOpts () { return { diff --git a/packages/conventional-changelog-eslint/README.md b/packages/conventional-changelog-eslint/README.md index c5e0abb1a..2acf9da6f 100644 --- a/packages/conventional-changelog-eslint/README.md +++ b/packages/conventional-changelog-eslint/README.md @@ -1,9 +1,41 @@ -# [![NPM version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Dependency Status][daviddm-image]][daviddm-url] [![Coverage Status][coverage-image]][coverage-url] +# conventional-changelog-eslint -> [conventional-changelog](https://github.com/ajoslin/conventional-changelog) [eslint](https://github.com/eslint/eslint) preset +[![NPM version][npm]][npm-url] +[![Node version][node]][node-url] +[![Dependencies status][deps]][deps-url] +[![Build status][build]][build-url] +[![Coverage status][coverage]][coverage-url] + +[npm]: https://img.shields.io/npm/v/conventional-changelog-eslint.svg +[npm-url]: https://npmjs.com/package/conventional-changelog-eslint + +[node]: https://img.shields.io/node/v/conventional-changelog-eslint.svg +[node-url]: https://nodejs.org + +[deps]: https://img.shields.io/librariesio/release/npm/conventional-changelog-eslint +[deps-url]: https://libraries.io/npm/conventional-changelog-eslint/tree + +[build]: https://img.shields.io/github/actions/workflow/status/conventional-changelog/conventional-changelog/ci.yaml?branch=master +[build-url]: https://github.com/conventional-changelog/conventional-changelog/actions + +[coverage]: https://coveralls.io/repos/github/conventional-changelog/conventional-changelog/badge.svg?branch=master +[coverage-url]: https://coveralls.io/github/conventional-changelog/conventional-changelog?branch=master + +[conventional-changelog](https://github.com/conventional-changelog/conventional-changelog) [eslint](https://github.com/eslint/eslint) preset. **Issues with the convention itself should be reported on the ESLint issue tracker.** +## Install + +```bash +# yarn +yarn add -D conventional-changelog-eslint +# pnpm +pnpm add -D conventional-changelog-eslint +# npm +npm i -D conventional-changelog-eslint +``` + ## ESLint Convention Our commit message format is as follows: @@ -42,12 +74,3 @@ Upgrade: Esprima to 1.2, switch to using comment attachment (fixes #730) The commit message format is important because these messages are used to create a changelog for each release. The tag and issue number help to create more consistent and useful changelogs. Based on https://eslint.org/docs/developer-guide/contributing/pull-requests#step2 - -[npm-image]: https://badge.fury.io/js/conventional-changelog-eslint.svg -[npm-url]: https://npmjs.org/package/conventional-changelog-eslint -[travis-image]: https://travis-ci.org/stevemao/conventional-changelog-eslint.svg?branch=master -[travis-url]: https://travis-ci.org/stevemao/conventional-changelog-eslint -[daviddm-image]: https://david-dm.org/stevemao/conventional-changelog-eslint.svg?theme=shields.io -[daviddm-url]: https://david-dm.org/stevemao/conventional-changelog-eslint -[coverage-image]: https://coveralls.io/repos/github/conventional-changelog/conventional-changelog/badge.svg?branch=master -[coverage-url]: https://coveralls.io/github/conventional-changelog/conventional-changelog?branch=master diff --git a/packages/conventional-changelog-eslint/conventional-changelog.js b/packages/conventional-changelog-eslint/conventional-changelog.js deleted file mode 100644 index afa9f2e3b..000000000 --- a/packages/conventional-changelog-eslint/conventional-changelog.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict' - -const parserOpts = require('./parser-opts') -const writerOpts = require('./writer-opts') - -module.exports = Promise.all([parserOpts, writerOpts]) - .then(([parserOpts, writerOpts]) => ({ - parserOpts, - writerOpts - })) diff --git a/packages/conventional-changelog-eslint/conventional-recommended-bump.js b/packages/conventional-changelog-eslint/conventional-recommended-bump.js deleted file mode 100644 index 30a2178e7..000000000 --- a/packages/conventional-changelog-eslint/conventional-recommended-bump.js +++ /dev/null @@ -1,32 +0,0 @@ -'use strict' - -const parserOpts = require('./parser-opts') - -module.exports = { - parserOpts, - - whatBump: commits => { - let level = 2 - let breakings = 0 - let features = 0 - - commits.forEach(commit => { - if (!commit.tag) return - - if (commit.tag.toLowerCase() === 'breaking') { - breakings += 1 - level = 0 - } else if (commit.tag.toLowerCase() === 'new') { - features += 1 - if (level === 2) { - level = 1 - } - } - }) - - return { - level: level, - reason: `There are ${breakings} breaking changes and ${features} features` - } - } -} diff --git a/packages/conventional-changelog-eslint/conventionalChangelog.js b/packages/conventional-changelog-eslint/conventionalChangelog.js new file mode 100644 index 000000000..9c91ac16e --- /dev/null +++ b/packages/conventional-changelog-eslint/conventionalChangelog.js @@ -0,0 +1,10 @@ +'use strict' + +function createConventionalChangelogOpts (parserOpts, writerOpts) { + return { + parserOpts, + writerOpts + } +} + +module.exports.createConventionalChangelogOpts = createConventionalChangelogOpts diff --git a/packages/conventional-changelog-eslint/conventionalRecommendedBump.js b/packages/conventional-changelog-eslint/conventionalRecommendedBump.js new file mode 100644 index 000000000..d6c896023 --- /dev/null +++ b/packages/conventional-changelog-eslint/conventionalRecommendedBump.js @@ -0,0 +1,34 @@ +'use strict' + +function createConventionalRecommendedBumpOpts (parserOpts) { + return { + parserOpts, + + whatBump (commits) { + let level = 2 + let breakings = 0 + let features = 0 + + commits.forEach(commit => { + if (!commit.tag) return + + if (commit.tag.toLowerCase() === 'breaking') { + breakings += 1 + level = 0 + } else if (commit.tag.toLowerCase() === 'new') { + features += 1 + if (level === 2) { + level = 1 + } + } + }) + + return { + level: level, + reason: `There are ${breakings} breaking changes and ${features} features` + } + } + } +} + +module.exports.createConventionalRecommendedBumpOpts = createConventionalRecommendedBumpOpts diff --git a/packages/conventional-changelog-eslint/index.js b/packages/conventional-changelog-eslint/index.js index 3107e7928..fb8c351e1 100644 --- a/packages/conventional-changelog-eslint/index.js +++ b/packages/conventional-changelog-eslint/index.js @@ -1,19 +1,22 @@ 'use strict' -const conventionalChangelog = require('./conventional-changelog') -const parserOpts = require('./parser-opts') -const recommendedBumpOpts = require('./conventional-recommended-bump') -const writerOpts = require('./writer-opts') -module.exports = presetOpts +const { createParserOpts } = require('./parserOpts') +const { createWriterOpts } = require('./writerOpts') +const { createConventionalChangelogOpts } = require('./conventionalChangelog') +const { createConventionalRecommendedBumpOpts } = require('./conventionalRecommendedBump') -function presetOpts (cb) { - Promise.all([conventionalChangelog, parserOpts, recommendedBumpOpts, writerOpts]) - .then(([conventionalChangelog, parserOpts, recommendedBumpOpts, writerOpts]) => { - cb(null, { - conventionalChangelog, - parserOpts, - recommendedBumpOpts, - writerOpts - }) - }) +async function createPreset () { + const parserOpts = createParserOpts() + const writerOpts = await createWriterOpts() + const recommendedBumpOpts = createConventionalRecommendedBumpOpts(parserOpts) + const conventionalChangelog = createConventionalChangelogOpts(parserOpts, writerOpts) + + return { + parserOpts, + writerOpts, + recommendedBumpOpts, + conventionalChangelog + } } + +module.exports = createPreset diff --git a/packages/conventional-changelog-eslint/package.json b/packages/conventional-changelog-eslint/package.json index bc6978467..b88686bbc 100644 --- a/packages/conventional-changelog-eslint/package.json +++ b/packages/conventional-changelog-eslint/package.json @@ -21,11 +21,11 @@ }, "license": "ISC", "files": [ - "conventional-changelog.js", - "conventional-recommended-bump.js", + "conventionalChangelog.js", + "conventionalRecommendedBump.js", "index.js", - "parser-opts.js", - "writer-opts.js", + "parserOpts.js", + "writerOpts.js", "templates" ], "bugs": { diff --git a/packages/conventional-changelog-eslint/parser-opts.js b/packages/conventional-changelog-eslint/parser-opts.js deleted file mode 100644 index ff95defb5..000000000 --- a/packages/conventional-changelog-eslint/parser-opts.js +++ /dev/null @@ -1,9 +0,0 @@ -'use strict' - -module.exports = { - headerPattern: /^(\w*):\s*(.*)$/, - headerCorrespondence: [ - 'tag', - 'message' - ] -} diff --git a/packages/conventional-changelog-eslint/parserOpts.js b/packages/conventional-changelog-eslint/parserOpts.js new file mode 100644 index 000000000..c4c299f02 --- /dev/null +++ b/packages/conventional-changelog-eslint/parserOpts.js @@ -0,0 +1,13 @@ +'use strict' + +function createParserOpts () { + return { + headerPattern: /^(\w*):\s*(.*)$/, + headerCorrespondence: [ + 'tag', + 'message' + ] + } +} + +module.exports.createParserOpts = createParserOpts diff --git a/packages/conventional-changelog-eslint/writer-opts.js b/packages/conventional-changelog-eslint/writer-opts.js deleted file mode 100644 index eab8f3144..000000000 --- a/packages/conventional-changelog-eslint/writer-opts.js +++ /dev/null @@ -1,36 +0,0 @@ -'use strict' - -const { readFile } = require('fs').promises -const { resolve } = require('path') - -module.exports = Promise.all([ - readFile(resolve(__dirname, './templates/template.hbs'), 'utf-8'), - readFile(resolve(__dirname, './templates/header.hbs'), 'utf-8'), - readFile(resolve(__dirname, './templates/commit.hbs'), 'utf-8') -]) - .then(([template, header, commit]) => { - const writerOpts = getWriterOpts() - - writerOpts.mainTemplate = template - writerOpts.headerPartial = header - writerOpts.commitPartial = commit - - return writerOpts - }) - -function getWriterOpts () { - return { - transform: (commit) => { - if (!commit.tag || typeof commit.tag !== 'string') { - return - } - - commit.shortHash = commit.hash.substring(0, 7) - - return commit - }, - groupBy: 'tag', - commitGroupsSort: 'title', - commitsSort: ['tag', 'message'] - } -} diff --git a/packages/conventional-changelog-eslint/writerOpts.js b/packages/conventional-changelog-eslint/writerOpts.js new file mode 100644 index 000000000..5822d2f24 --- /dev/null +++ b/packages/conventional-changelog-eslint/writerOpts.js @@ -0,0 +1,38 @@ +'use strict' + +const { readFile } = require('fs').promises +const { resolve } = require('path') + +async function createWriterOpts () { + const [template, header, commit] = await Promise.all([ + readFile(resolve(__dirname, './templates/template.hbs'), 'utf-8'), + readFile(resolve(__dirname, './templates/header.hbs'), 'utf-8'), + readFile(resolve(__dirname, './templates/commit.hbs'), 'utf-8') + ]) + const writerOpts = getWriterOpts() + + writerOpts.mainTemplate = template + writerOpts.headerPartial = header + writerOpts.commitPartial = commit + + return writerOpts +} + +module.exports.createWriterOpts = createWriterOpts + +function getWriterOpts () { + return { + transform: (commit) => { + if (!commit.tag || typeof commit.tag !== 'string') { + return + } + + commit.shortHash = commit.hash.substring(0, 7) + + return commit + }, + groupBy: 'tag', + commitGroupsSort: 'title', + commitsSort: ['tag', 'message'] + } +} diff --git a/packages/conventional-changelog-express/README.md b/packages/conventional-changelog-express/README.md index 1b88407bb..705277f70 100644 --- a/packages/conventional-changelog-express/README.md +++ b/packages/conventional-changelog-express/README.md @@ -1,14 +1,37 @@ -# [![NPM version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Dependency Status][daviddm-image]][daviddm-url] [![Coverage Status][coverage-image]][coverage-url] +# conventional-changelog-express -> [conventional-changelog](https://github.com/ajoslin/conventional-changelog) [express](https://github.com/strongloop/express) preset +[![NPM version][npm]][npm-url] +[![Node version][node]][node-url] +[![Dependencies status][deps]][deps-url] +[![Build status][build]][build-url] +[![Coverage status][coverage]][coverage-url] -**Issues with the convention itself should be reported on the Express issue tracker.** +[npm]: https://img.shields.io/npm/v/conventional-changelog-express.svg +[npm-url]: https://npmjs.com/package/conventional-changelog-express + +[node]: https://img.shields.io/node/v/conventional-changelog-express.svg +[node-url]: https://nodejs.org + +[deps]: https://img.shields.io/librariesio/release/npm/conventional-changelog-express +[deps-url]: https://libraries.io/npm/conventional-changelog-express/tree -[npm-image]: https://badge.fury.io/js/conventional-changelog-express.svg -[npm-url]: https://npmjs.org/package/conventional-changelog-express -[travis-image]: https://travis-ci.org/stevemao/conventional-changelog-express.svg?branch=master -[travis-url]: https://travis-ci.org/stevemao/conventional-changelog-express -[daviddm-image]: https://david-dm.org/stevemao/conventional-changelog-express.svg?theme=shields.io -[daviddm-url]: https://david-dm.org/stevemao/conventional-changelog-express -[coverage-image]: https://coveralls.io/repos/github/conventional-changelog/conventional-changelog/badge.svg?branch=master +[build]: https://img.shields.io/github/actions/workflow/status/conventional-changelog/conventional-changelog/ci.yaml?branch=master +[build-url]: https://github.com/conventional-changelog/conventional-changelog/actions + +[coverage]: https://coveralls.io/repos/github/conventional-changelog/conventional-changelog/badge.svg?branch=master [coverage-url]: https://coveralls.io/github/conventional-changelog/conventional-changelog?branch=master + +[conventional-changelog](https://github.com/conventional-changelog/conventional-changelog) [express](https://github.com/strongloop/express) preset. + +**Issues with the convention itself should be reported on the Express issue tracker.** + +## Install + +```bash +# yarn +yarn add -D conventional-changelog-express +# pnpm +pnpm add -D conventional-changelog-express +# npm +npm i -D conventional-changelog-express +``` diff --git a/packages/conventional-changelog-express/conventional-changelog.js b/packages/conventional-changelog-express/conventional-changelog.js deleted file mode 100644 index afa9f2e3b..000000000 --- a/packages/conventional-changelog-express/conventional-changelog.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict' - -const parserOpts = require('./parser-opts') -const writerOpts = require('./writer-opts') - -module.exports = Promise.all([parserOpts, writerOpts]) - .then(([parserOpts, writerOpts]) => ({ - parserOpts, - writerOpts - })) diff --git a/packages/conventional-changelog-express/conventional-recommended-bump.js b/packages/conventional-changelog-express/conventional-recommended-bump.js deleted file mode 100644 index 5cf6153f5..000000000 --- a/packages/conventional-changelog-express/conventional-recommended-bump.js +++ /dev/null @@ -1,30 +0,0 @@ -'use strict' - -const parserOpts = require('./parser-opts') - -module.exports = { - parserOpts, - - whatBump: (commits) => { - let level = 2 - let breakings = 0 - let features = 0 - - commits.forEach(commit => { - if (commit.notes.length > 0) { - breakings += commit.notes.length - level = 0 - } else if (commit.type === 'feat') { - features += 1 - if (level === 2) { - level = 1 - } - } - }) - - return { - level: level, - reason: `There are ${breakings} BREAKING CHANGES and ${features} features` - } - } -} diff --git a/packages/conventional-changelog-express/conventionalChangelog.js b/packages/conventional-changelog-express/conventionalChangelog.js new file mode 100644 index 000000000..9c91ac16e --- /dev/null +++ b/packages/conventional-changelog-express/conventionalChangelog.js @@ -0,0 +1,10 @@ +'use strict' + +function createConventionalChangelogOpts (parserOpts, writerOpts) { + return { + parserOpts, + writerOpts + } +} + +module.exports.createConventionalChangelogOpts = createConventionalChangelogOpts diff --git a/packages/conventional-changelog-express/conventionalRecommendedBump.js b/packages/conventional-changelog-express/conventionalRecommendedBump.js new file mode 100644 index 000000000..52691a728 --- /dev/null +++ b/packages/conventional-changelog-express/conventionalRecommendedBump.js @@ -0,0 +1,32 @@ +'use strict' + +function createConventionalRecommendedBumpOpts (parserOpts) { + return { + parserOpts, + + whatBump (commits) { + let level = 2 + let breakings = 0 + let features = 0 + + commits.forEach(commit => { + if (commit.notes.length > 0) { + breakings += commit.notes.length + level = 0 + } else if (commit.type === 'feat') { + features += 1 + if (level === 2) { + level = 1 + } + } + }) + + return { + level: level, + reason: `There are ${breakings} BREAKING CHANGES and ${features} features` + } + } + } +} + +module.exports.createConventionalRecommendedBumpOpts = createConventionalRecommendedBumpOpts diff --git a/packages/conventional-changelog-express/index.js b/packages/conventional-changelog-express/index.js index 3107e7928..fb8c351e1 100644 --- a/packages/conventional-changelog-express/index.js +++ b/packages/conventional-changelog-express/index.js @@ -1,19 +1,22 @@ 'use strict' -const conventionalChangelog = require('./conventional-changelog') -const parserOpts = require('./parser-opts') -const recommendedBumpOpts = require('./conventional-recommended-bump') -const writerOpts = require('./writer-opts') -module.exports = presetOpts +const { createParserOpts } = require('./parserOpts') +const { createWriterOpts } = require('./writerOpts') +const { createConventionalChangelogOpts } = require('./conventionalChangelog') +const { createConventionalRecommendedBumpOpts } = require('./conventionalRecommendedBump') -function presetOpts (cb) { - Promise.all([conventionalChangelog, parserOpts, recommendedBumpOpts, writerOpts]) - .then(([conventionalChangelog, parserOpts, recommendedBumpOpts, writerOpts]) => { - cb(null, { - conventionalChangelog, - parserOpts, - recommendedBumpOpts, - writerOpts - }) - }) +async function createPreset () { + const parserOpts = createParserOpts() + const writerOpts = await createWriterOpts() + const recommendedBumpOpts = createConventionalRecommendedBumpOpts(parserOpts) + const conventionalChangelog = createConventionalChangelogOpts(parserOpts, writerOpts) + + return { + parserOpts, + writerOpts, + recommendedBumpOpts, + conventionalChangelog + } } + +module.exports = createPreset diff --git a/packages/conventional-changelog-express/package.json b/packages/conventional-changelog-express/package.json index b42e4e47e..516cc3be7 100644 --- a/packages/conventional-changelog-express/package.json +++ b/packages/conventional-changelog-express/package.json @@ -21,11 +21,11 @@ }, "license": "ISC", "files": [ - "conventional-changelog.js", - "conventional-recommended-bump.js", + "conventionalChangelog.js", + "conventionalRecommendedBump.js", "index.js", - "parser-opts.js", - "writer-opts.js", + "parserOpts.js", + "writerOpts.js", "templates" ], "bugs": { diff --git a/packages/conventional-changelog-express/parser-opts.js b/packages/conventional-changelog-express/parser-opts.js deleted file mode 100644 index 129387abc..000000000 --- a/packages/conventional-changelog-express/parser-opts.js +++ /dev/null @@ -1,9 +0,0 @@ -'use strict' - -module.exports = { - headerPattern: /^(\w*): (.*)$/, - headerCorrespondence: [ - 'component', - 'shortDesc' - ] -} diff --git a/packages/conventional-changelog-express/parserOpts.js b/packages/conventional-changelog-express/parserOpts.js new file mode 100644 index 000000000..c0f7eff41 --- /dev/null +++ b/packages/conventional-changelog-express/parserOpts.js @@ -0,0 +1,13 @@ +'use strict' + +function createParserOpts () { + return { + headerPattern: /^(\w*): (.*)$/, + headerCorrespondence: [ + 'component', + 'shortDesc' + ] + } +} + +module.exports.createParserOpts = createParserOpts diff --git a/packages/conventional-changelog-express/writer-opts.js b/packages/conventional-changelog-express/writer-opts.js deleted file mode 100644 index 2fc6da105..000000000 --- a/packages/conventional-changelog-express/writer-opts.js +++ /dev/null @@ -1,38 +0,0 @@ -'use strict' - -const { readFile } = require('fs').promises -const { resolve } = require('path') - -module.exports = Promise.all([ - readFile(resolve(__dirname, './templates/template.hbs'), 'utf-8'), - readFile(resolve(__dirname, './templates/header.hbs'), 'utf-8'), - readFile(resolve(__dirname, './templates/commit.hbs'), 'utf-8') -]) - .then(([template, header, commit]) => { - const writerOpts = getWriterOpts() - - writerOpts.mainTemplate = template - writerOpts.headerPartial = header - writerOpts.commitPartial = commit - - return writerOpts - }) - -function getWriterOpts () { - return { - transform: (commit) => { - if (commit.component === 'perf') { - commit.component = 'Performance' - } else if (commit.component === 'deps') { - commit.component = 'Dependencies' - } else { - return - } - - return commit - }, - groupBy: 'component', - commitGroupsSort: 'title', - commitsSort: ['component', 'shortDesc'] - } -} diff --git a/packages/conventional-changelog-express/writerOpts.js b/packages/conventional-changelog-express/writerOpts.js new file mode 100644 index 000000000..d9172aa47 --- /dev/null +++ b/packages/conventional-changelog-express/writerOpts.js @@ -0,0 +1,40 @@ +'use strict' + +const { readFile } = require('fs').promises +const { resolve } = require('path') + +async function createWriterOpts () { + const [template, header, commit] = await Promise.all([ + readFile(resolve(__dirname, './templates/template.hbs'), 'utf-8'), + readFile(resolve(__dirname, './templates/header.hbs'), 'utf-8'), + readFile(resolve(__dirname, './templates/commit.hbs'), 'utf-8') + ]) + const writerOpts = getWriterOpts() + + writerOpts.mainTemplate = template + writerOpts.headerPartial = header + writerOpts.commitPartial = commit + + return writerOpts +} + +module.exports.createWriterOpts = createWriterOpts + +function getWriterOpts () { + return { + transform: (commit) => { + if (commit.component === 'perf') { + commit.component = 'Performance' + } else if (commit.component === 'deps') { + commit.component = 'Dependencies' + } else { + return + } + + return commit + }, + groupBy: 'component', + commitGroupsSort: 'title', + commitsSort: ['component', 'shortDesc'] + } +} diff --git a/packages/conventional-changelog-jquery/README.md b/packages/conventional-changelog-jquery/README.md index 194a75952..d0dc75f9e 100644 --- a/packages/conventional-changelog-jquery/README.md +++ b/packages/conventional-changelog-jquery/README.md @@ -1,9 +1,41 @@ -# [![NPM version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Dependency Status][daviddm-image]][daviddm-url] [![Coverage Status][coverage-image]][coverage-url] +# conventional-changelog-jquery -> [conventional-changelog](https://github.com/ajoslin/conventional-changelog) [jQuery](https://github.com/jquery/jquery) preset +[![NPM version][npm]][npm-url] +[![Node version][node]][node-url] +[![Dependencies status][deps]][deps-url] +[![Build status][build]][build-url] +[![Coverage status][coverage]][coverage-url] + +[npm]: https://img.shields.io/npm/v/conventional-changelog-jquery.svg +[npm-url]: https://npmjs.com/package/conventional-changelog-jquery + +[node]: https://img.shields.io/node/v/conventional-changelog-jquery.svg +[node-url]: https://nodejs.org + +[deps]: https://img.shields.io/librariesio/release/npm/conventional-changelog-jquery +[deps-url]: https://libraries.io/npm/conventional-changelog-jquery/tree + +[build]: https://img.shields.io/github/actions/workflow/status/conventional-changelog/conventional-changelog/ci.yaml?branch=master +[build-url]: https://github.com/conventional-changelog/conventional-changelog/actions + +[coverage]: https://coveralls.io/repos/github/conventional-changelog/conventional-changelog/badge.svg?branch=master +[coverage-url]: https://coveralls.io/github/conventional-changelog/conventional-changelog?branch=master + +[conventional-changelog](https://github.com/conventional-changelog/conventional-changelog) [jQuery](https://github.com/jquery/jquery) preset. **Issues with the convention itself should be reported on the JQuery issue tracker.** +## Install + +```bash +# yarn +yarn add -D conventional-changelog-jquery +# pnpm +pnpm add -D conventional-changelog-jquery +# npm +npm i -D conventional-changelog-jquery +``` + ## JQuery Convention Commit messages should describe what changed, and reference the issue number if the commit closes or is associated with a particular issue. Commit messages for all jQuery projects should look like this: @@ -41,12 +73,3 @@ References to issues or pull requests go after the long description, each one on * Always use "gh-xxx" for GitHub issues and pull requests within the same repository. Use "\[user\]/\[repo\]#xxx" when referencing an issue or pull request in another repository, e.g., "Closes jquery/jquery-ui#175". Based on https://github.com/jquery/contribute.jquery.org/blob/master/pages/commits-and-pull-requests.md#commit-guidelines - -[npm-image]: https://badge.fury.io/js/conventional-changelog-jquery.svg -[npm-url]: https://npmjs.org/package/conventional-changelog-jquery -[travis-image]: https://travis-ci.org/conventional-changelog/conventional-changelog-jquery.svg?branch=master -[travis-url]: https://travis-ci.org/conventional-changelog/conventional-changelog-jquery -[daviddm-image]: https://david-dm.org/conventional-changelog/conventional-changelog-jquery.svg?theme=shields.io -[daviddm-url]: https://david-dm.org/conventional-changelog/conventional-changelog-jquery -[coverage-image]: https://coveralls.io/repos/github/conventional-changelog/conventional-changelog/badge.svg?branch=master -[coverage-url]: https://coveralls.io/github/conventional-changelog/conventional-changelog?branch=master diff --git a/packages/conventional-changelog-jquery/conventional-changelog.js b/packages/conventional-changelog-jquery/conventional-changelog.js deleted file mode 100644 index afa9f2e3b..000000000 --- a/packages/conventional-changelog-jquery/conventional-changelog.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict' - -const parserOpts = require('./parser-opts') -const writerOpts = require('./writer-opts') - -module.exports = Promise.all([parserOpts, writerOpts]) - .then(([parserOpts, writerOpts]) => ({ - parserOpts, - writerOpts - })) diff --git a/packages/conventional-changelog-jquery/conventional-recommended-bump.js b/packages/conventional-changelog-jquery/conventional-recommended-bump.js deleted file mode 100644 index 5cf6153f5..000000000 --- a/packages/conventional-changelog-jquery/conventional-recommended-bump.js +++ /dev/null @@ -1,30 +0,0 @@ -'use strict' - -const parserOpts = require('./parser-opts') - -module.exports = { - parserOpts, - - whatBump: (commits) => { - let level = 2 - let breakings = 0 - let features = 0 - - commits.forEach(commit => { - if (commit.notes.length > 0) { - breakings += commit.notes.length - level = 0 - } else if (commit.type === 'feat') { - features += 1 - if (level === 2) { - level = 1 - } - } - }) - - return { - level: level, - reason: `There are ${breakings} BREAKING CHANGES and ${features} features` - } - } -} diff --git a/packages/conventional-changelog-jquery/conventionalChangelog.js b/packages/conventional-changelog-jquery/conventionalChangelog.js new file mode 100644 index 000000000..9c91ac16e --- /dev/null +++ b/packages/conventional-changelog-jquery/conventionalChangelog.js @@ -0,0 +1,10 @@ +'use strict' + +function createConventionalChangelogOpts (parserOpts, writerOpts) { + return { + parserOpts, + writerOpts + } +} + +module.exports.createConventionalChangelogOpts = createConventionalChangelogOpts diff --git a/packages/conventional-changelog-jquery/conventionalRecommendedBump.js b/packages/conventional-changelog-jquery/conventionalRecommendedBump.js new file mode 100644 index 000000000..52691a728 --- /dev/null +++ b/packages/conventional-changelog-jquery/conventionalRecommendedBump.js @@ -0,0 +1,32 @@ +'use strict' + +function createConventionalRecommendedBumpOpts (parserOpts) { + return { + parserOpts, + + whatBump (commits) { + let level = 2 + let breakings = 0 + let features = 0 + + commits.forEach(commit => { + if (commit.notes.length > 0) { + breakings += commit.notes.length + level = 0 + } else if (commit.type === 'feat') { + features += 1 + if (level === 2) { + level = 1 + } + } + }) + + return { + level: level, + reason: `There are ${breakings} BREAKING CHANGES and ${features} features` + } + } + } +} + +module.exports.createConventionalRecommendedBumpOpts = createConventionalRecommendedBumpOpts diff --git a/packages/conventional-changelog-jquery/index.js b/packages/conventional-changelog-jquery/index.js index 3e9181a25..fb8c351e1 100644 --- a/packages/conventional-changelog-jquery/index.js +++ b/packages/conventional-changelog-jquery/index.js @@ -1,13 +1,22 @@ 'use strict' -const conventionalChangelog = require('./conventional-changelog') -const parserOpts = require('./parser-opts') -const recommendedBumpOpts = require('./conventional-recommended-bump') -const writerOpts = require('./writer-opts') - -module.exports = Promise.all([conventionalChangelog, parserOpts, recommendedBumpOpts, writerOpts]) - .then(([conventionalChangelog, parserOpts, recommendedBumpOpts, writerOpts]) => ({ - conventionalChangelog, + +const { createParserOpts } = require('./parserOpts') +const { createWriterOpts } = require('./writerOpts') +const { createConventionalChangelogOpts } = require('./conventionalChangelog') +const { createConventionalRecommendedBumpOpts } = require('./conventionalRecommendedBump') + +async function createPreset () { + const parserOpts = createParserOpts() + const writerOpts = await createWriterOpts() + const recommendedBumpOpts = createConventionalRecommendedBumpOpts(parserOpts) + const conventionalChangelog = createConventionalChangelogOpts(parserOpts, writerOpts) + + return { parserOpts, + writerOpts, recommendedBumpOpts, - writerOpts - })) + conventionalChangelog + } +} + +module.exports = createPreset diff --git a/packages/conventional-changelog-jquery/package.json b/packages/conventional-changelog-jquery/package.json index b0c6865c5..eec56803a 100644 --- a/packages/conventional-changelog-jquery/package.json +++ b/packages/conventional-changelog-jquery/package.json @@ -21,11 +21,11 @@ }, "license": "ISC", "files": [ - "conventional-changelog.js", - "conventional-recommended-bump.js", + "conventionalChangelog.js", + "conventionalRecommendedBump.js", "index.js", - "parser-opts.js", - "writer-opts.js", + "parserOpts.js", + "writerOpts.js", "templates" ], "bugs": { diff --git a/packages/conventional-changelog-jquery/parser-opts.js b/packages/conventional-changelog-jquery/parser-opts.js deleted file mode 100644 index 129387abc..000000000 --- a/packages/conventional-changelog-jquery/parser-opts.js +++ /dev/null @@ -1,9 +0,0 @@ -'use strict' - -module.exports = { - headerPattern: /^(\w*): (.*)$/, - headerCorrespondence: [ - 'component', - 'shortDesc' - ] -} diff --git a/packages/conventional-changelog-jquery/parserOpts.js b/packages/conventional-changelog-jquery/parserOpts.js new file mode 100644 index 000000000..c0f7eff41 --- /dev/null +++ b/packages/conventional-changelog-jquery/parserOpts.js @@ -0,0 +1,13 @@ +'use strict' + +function createParserOpts () { + return { + headerPattern: /^(\w*): (.*)$/, + headerCorrespondence: [ + 'component', + 'shortDesc' + ] + } +} + +module.exports.createParserOpts = createParserOpts diff --git a/packages/conventional-changelog-jquery/writer-opts.js b/packages/conventional-changelog-jquery/writerOpts.js similarity index 57% rename from packages/conventional-changelog-jquery/writer-opts.js rename to packages/conventional-changelog-jquery/writerOpts.js index a9f317b4d..a324abb1f 100644 --- a/packages/conventional-changelog-jquery/writer-opts.js +++ b/packages/conventional-changelog-jquery/writerOpts.js @@ -3,20 +3,22 @@ const { readFile } = require('fs').promises const { resolve } = require('path') -module.exports = Promise.all([ - readFile(resolve(__dirname, './templates/template.hbs'), 'utf-8'), - readFile(resolve(__dirname, './templates/header.hbs'), 'utf-8'), - readFile(resolve(__dirname, './templates/commit.hbs'), 'utf-8') -]) - .then(([template, header, commit]) => { - const writerOpts = getWriterOpts() - - writerOpts.mainTemplate = template - writerOpts.headerPartial = header - writerOpts.commitPartial = commit - - return writerOpts - }) +async function createWriterOpts () { + const [template, header, commit] = await Promise.all([ + readFile(resolve(__dirname, './templates/template.hbs'), 'utf-8'), + readFile(resolve(__dirname, './templates/header.hbs'), 'utf-8'), + readFile(resolve(__dirname, './templates/commit.hbs'), 'utf-8') + ]) + const writerOpts = getWriterOpts() + + writerOpts.mainTemplate = template + writerOpts.headerPartial = header + writerOpts.commitPartial = commit + + return writerOpts +} + +module.exports.createWriterOpts = createWriterOpts function getWriterOpts () { return { diff --git a/packages/conventional-changelog-jshint/README.md b/packages/conventional-changelog-jshint/README.md index 315bf93a7..4f0962e67 100644 --- a/packages/conventional-changelog-jshint/README.md +++ b/packages/conventional-changelog-jshint/README.md @@ -1,9 +1,41 @@ -# [![NPM version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Dependency Status][daviddm-image]][daviddm-url] [![Coverage Status][coverage-image]][coverage-url] +# conventional-changelog-jshint -> [conventional-changelog](https://github.com/ajoslin/conventional-changelog) [jshint](https://github.com/jshint/jshint) preset +[![NPM version][npm]][npm-url] +[![Node version][node]][node-url] +[![Dependencies status][deps]][deps-url] +[![Build status][build]][build-url] +[![Coverage status][coverage]][coverage-url] + +[npm]: https://img.shields.io/npm/v/conventional-changelog-jshint.svg +[npm-url]: https://npmjs.com/package/conventional-changelog-jshint + +[node]: https://img.shields.io/node/v/conventional-changelog-jshint.svg +[node-url]: https://nodejs.org + +[deps]: https://img.shields.io/librariesio/release/npm/conventional-changelog-jshint +[deps-url]: https://libraries.io/npm/conventional-changelog-jshint/tree + +[build]: https://img.shields.io/github/actions/workflow/status/conventional-changelog/conventional-changelog/ci.yaml?branch=master +[build-url]: https://github.com/conventional-changelog/conventional-changelog/actions + +[coverage]: https://coveralls.io/repos/github/conventional-changelog/conventional-changelog/badge.svg?branch=master +[coverage-url]: https://coveralls.io/github/conventional-changelog/conventional-changelog?branch=master + +[conventional-changelog](https://github.com/conventional-changelog/conventional-changelog) [jshint](https://github.com/jshint/jshint) preset. **Issues with the convention itself should be reported on the JSHint issue tracker.** +## Install + +```bash +# yarn +yarn add -D conventional-changelog-jshint +# pnpm +pnpm add -D conventional-changelog-jshint +# npm +npm i -D conventional-changelog-jshint +``` + ## JSHint Convention ### Overview @@ -79,12 +111,3 @@ Closes #77777 ``` Based on https://github.com/jshint/jshint/blob/master/CONTRIBUTING.md#commit-message-guidelines - -[npm-image]: https://badge.fury.io/js/conventional-changelog-jshint.svg -[npm-url]: https://npmjs.org/package/conventional-changelog-jshint -[travis-image]: https://travis-ci.org/stevemao/conventional-changelog-jshint.svg?branch=master -[travis-url]: https://travis-ci.org/stevemao/conventional-changelog-jshint -[daviddm-image]: https://david-dm.org/stevemao/conventional-changelog-jshint.svg?theme=shields.io -[daviddm-url]: https://david-dm.org/stevemao/conventional-changelog-jshint -[coverage-image]: https://coveralls.io/repos/github/conventional-changelog/conventional-changelog/badge.svg?branch=master -[coverage-url]: https://coveralls.io/github/conventional-changelog/conventional-changelog?branch=master diff --git a/packages/conventional-changelog-jshint/conventional-changelog.js b/packages/conventional-changelog-jshint/conventional-changelog.js deleted file mode 100644 index afa9f2e3b..000000000 --- a/packages/conventional-changelog-jshint/conventional-changelog.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict' - -const parserOpts = require('./parser-opts') -const writerOpts = require('./writer-opts') - -module.exports = Promise.all([parserOpts, writerOpts]) - .then(([parserOpts, writerOpts]) => ({ - parserOpts, - writerOpts - })) diff --git a/packages/conventional-changelog-jshint/conventional-recommended-bump.js b/packages/conventional-changelog-jshint/conventional-recommended-bump.js deleted file mode 100644 index 5cf6153f5..000000000 --- a/packages/conventional-changelog-jshint/conventional-recommended-bump.js +++ /dev/null @@ -1,30 +0,0 @@ -'use strict' - -const parserOpts = require('./parser-opts') - -module.exports = { - parserOpts, - - whatBump: (commits) => { - let level = 2 - let breakings = 0 - let features = 0 - - commits.forEach(commit => { - if (commit.notes.length > 0) { - breakings += commit.notes.length - level = 0 - } else if (commit.type === 'feat') { - features += 1 - if (level === 2) { - level = 1 - } - } - }) - - return { - level: level, - reason: `There are ${breakings} BREAKING CHANGES and ${features} features` - } - } -} diff --git a/packages/conventional-changelog-jshint/conventionalChangelog.js b/packages/conventional-changelog-jshint/conventionalChangelog.js new file mode 100644 index 000000000..9c91ac16e --- /dev/null +++ b/packages/conventional-changelog-jshint/conventionalChangelog.js @@ -0,0 +1,10 @@ +'use strict' + +function createConventionalChangelogOpts (parserOpts, writerOpts) { + return { + parserOpts, + writerOpts + } +} + +module.exports.createConventionalChangelogOpts = createConventionalChangelogOpts diff --git a/packages/conventional-changelog-jshint/conventionalRecommendedBump.js b/packages/conventional-changelog-jshint/conventionalRecommendedBump.js new file mode 100644 index 000000000..52691a728 --- /dev/null +++ b/packages/conventional-changelog-jshint/conventionalRecommendedBump.js @@ -0,0 +1,32 @@ +'use strict' + +function createConventionalRecommendedBumpOpts (parserOpts) { + return { + parserOpts, + + whatBump (commits) { + let level = 2 + let breakings = 0 + let features = 0 + + commits.forEach(commit => { + if (commit.notes.length > 0) { + breakings += commit.notes.length + level = 0 + } else if (commit.type === 'feat') { + features += 1 + if (level === 2) { + level = 1 + } + } + }) + + return { + level: level, + reason: `There are ${breakings} BREAKING CHANGES and ${features} features` + } + } + } +} + +module.exports.createConventionalRecommendedBumpOpts = createConventionalRecommendedBumpOpts diff --git a/packages/conventional-changelog-jshint/index.js b/packages/conventional-changelog-jshint/index.js index 3107e7928..fb8c351e1 100644 --- a/packages/conventional-changelog-jshint/index.js +++ b/packages/conventional-changelog-jshint/index.js @@ -1,19 +1,22 @@ 'use strict' -const conventionalChangelog = require('./conventional-changelog') -const parserOpts = require('./parser-opts') -const recommendedBumpOpts = require('./conventional-recommended-bump') -const writerOpts = require('./writer-opts') -module.exports = presetOpts +const { createParserOpts } = require('./parserOpts') +const { createWriterOpts } = require('./writerOpts') +const { createConventionalChangelogOpts } = require('./conventionalChangelog') +const { createConventionalRecommendedBumpOpts } = require('./conventionalRecommendedBump') -function presetOpts (cb) { - Promise.all([conventionalChangelog, parserOpts, recommendedBumpOpts, writerOpts]) - .then(([conventionalChangelog, parserOpts, recommendedBumpOpts, writerOpts]) => { - cb(null, { - conventionalChangelog, - parserOpts, - recommendedBumpOpts, - writerOpts - }) - }) +async function createPreset () { + const parserOpts = createParserOpts() + const writerOpts = await createWriterOpts() + const recommendedBumpOpts = createConventionalRecommendedBumpOpts(parserOpts) + const conventionalChangelog = createConventionalChangelogOpts(parserOpts, writerOpts) + + return { + parserOpts, + writerOpts, + recommendedBumpOpts, + conventionalChangelog + } } + +module.exports = createPreset diff --git a/packages/conventional-changelog-jshint/package.json b/packages/conventional-changelog-jshint/package.json index 4d8e62c41..053adfe5a 100644 --- a/packages/conventional-changelog-jshint/package.json +++ b/packages/conventional-changelog-jshint/package.json @@ -21,11 +21,11 @@ }, "license": "ISC", "files": [ - "conventional-changelog.js", - "conventional-recommended-bump.js", + "conventionalChangelog.js", + "conventionalRecommendedBump.js", "index.js", - "parser-opts.js", - "writer-opts.js", + "parserOpts.js", + "writerOpts.js", "templates" ], "bugs": { diff --git a/packages/conventional-changelog-jshint/parser-opts.js b/packages/conventional-changelog-jshint/parser-opts.js deleted file mode 100644 index f92384a76..000000000 --- a/packages/conventional-changelog-jshint/parser-opts.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict' - -module.exports = { - headerPattern: /^\[\[(.*)]] (.*)$/, - headerCorrespondence: [ - 'type', - 'shortDesc' - ], - noteKeywords: 'BREAKING CHANGE' -} diff --git a/packages/conventional-changelog-jshint/parserOpts.js b/packages/conventional-changelog-jshint/parserOpts.js new file mode 100644 index 000000000..a7142f580 --- /dev/null +++ b/packages/conventional-changelog-jshint/parserOpts.js @@ -0,0 +1,14 @@ +'use strict' + +function createParserOpts () { + return { + headerPattern: /^\[\[(.*)]] (.*)$/, + headerCorrespondence: [ + 'type', + 'shortDesc' + ], + noteKeywords: 'BREAKING CHANGE' + } +} + +module.exports.createParserOpts = createParserOpts diff --git a/packages/conventional-changelog-jshint/writer-opts.js b/packages/conventional-changelog-jshint/writerOpts.js similarity index 58% rename from packages/conventional-changelog-jshint/writer-opts.js rename to packages/conventional-changelog-jshint/writerOpts.js index 2cf63b0ee..bfa6b689d 100644 --- a/packages/conventional-changelog-jshint/writer-opts.js +++ b/packages/conventional-changelog-jshint/writerOpts.js @@ -4,22 +4,24 @@ const compareFunc = require('compare-func') const { readFile } = require('fs').promises const { resolve } = require('path') -module.exports = Promise.all([ - readFile(resolve(__dirname, './templates/template.hbs'), 'utf-8'), - readFile(resolve(__dirname, './templates/header.hbs'), 'utf-8'), - readFile(resolve(__dirname, './templates/commit.hbs'), 'utf-8'), - readFile(resolve(__dirname, './templates/footer.hbs'), 'utf-8') -]) - .then(([template, header, commit, footer]) => { - const writerOpts = getWriterOpts() - - writerOpts.mainTemplate = template - writerOpts.headerPartial = header - writerOpts.commitPartial = commit - writerOpts.footerPartial = footer - - return writerOpts - }) +async function createWriterOpts () { + const [template, header, commit, footer] = await Promise.all([ + readFile(resolve(__dirname, './templates/template.hbs'), 'utf-8'), + readFile(resolve(__dirname, './templates/header.hbs'), 'utf-8'), + readFile(resolve(__dirname, './templates/commit.hbs'), 'utf-8'), + readFile(resolve(__dirname, './templates/footer.hbs'), 'utf-8') + ]) + const writerOpts = getWriterOpts() + + writerOpts.mainTemplate = template + writerOpts.headerPartial = header + writerOpts.commitPartial = commit + writerOpts.footerPartial = footer + + return writerOpts +} + +module.exports.createWriterOpts = createWriterOpts function getWriterOpts () { return { diff --git a/packages/conventional-changelog-preset-loader/README.md b/packages/conventional-changelog-preset-loader/README.md index bdcf43f8e..f7fd42bc5 100644 --- a/packages/conventional-changelog-preset-loader/README.md +++ b/packages/conventional-changelog-preset-loader/README.md @@ -1,41 +1,98 @@ -# [![NPM version][npm-image]][npm-url] [![Build Status: Linux][travis-image]][travis-url] [![Build Status: Windows][appveyor-image]][appveyor-url] [![Dependency Status][daviddm-image]][daviddm-url] [![Coverage Status][coverage-image]][coverage-url] +# conventional-changelog-preset-loader -> Configuration preset loader for `conventional-changelog`. +[![NPM version][npm]][npm-url] +[![Node version][node]][node-url] +[![Dependencies status][deps]][deps-url] +[![Build status][build]][build-url] +[![Coverage status][coverage]][coverage-url] + +[npm]: https://img.shields.io/npm/v/conventional-changelog-preset-loader.svg +[npm-url]: https://npmjs.com/package/conventional-changelog-preset-loader + +[node]: https://img.shields.io/node/v/conventional-changelog-preset-loader.svg +[node-url]: https://nodejs.org + +[deps]: https://img.shields.io/librariesio/release/npm/conventional-changelog-preset-loader +[deps-url]: https://libraries.io/npm/conventional-changelog-preset-loader/tree + +[build]: https://img.shields.io/github/actions/workflow/status/conventional-changelog/conventional-changelog/ci.yaml?branch=master +[build-url]: https://github.com/conventional-changelog/conventional-changelog/actions + +[coverage]: https://coveralls.io/repos/github/conventional-changelog/conventional-changelog/badge.svg?branch=master +[coverage-url]: https://coveralls.io/github/conventional-changelog/conventional-changelog?branch=master + +Configuration preset loader for `conventional-changelog`. ## Usage -```sh -$ npm install --save conventional-changelog-preset-loader +Install: + +```bash +# yarn +yarn add -D conventional-changelog-preset-loader +# pnpm +pnpm add -D conventional-changelog-preset-loader +# npm +npm i -D conventional-changelog-preset-loader ``` +Import `loadPreset` function from the package and use it to load the preset: + +```js +const { loadPreset } = require('conventional-changelog-preset-loader') + +loadPreset('angular').then((config) => { + // do something with config object +}) +``` + +By default it uses `import` to load preset. If you want to use `require` instead, you can create own loader with `createPresetLoader` function: + ```js -var conventionalChangelogPresetLoader = require('conventional-changelog-preset-loader'); +const { createPresetLoader } = require('conventional-changelog-preset-loader') -configuration = conventionalChangelogPresetLoader(`angular`); +const loadPreset = createPresetLoader(require) ``` +## Preset package resolution -The string that is passed to the preset loader is manipulated by prepending `conventional-changelog` to the name. +Firstly, loader will try prepend `conventional-changelog` to the preset name and load it. For example: -* `angular` => `conventional-changelog-angular` -* `angular/preset/path` => `conventional-changelog-angular/preset/path` -* `@scope/angular` => `@scope/conventional-changelog-angular` -* `@scope/angular/preset/path` => `@scope/conventional-changelog-angular/preset/path` +- `angular` => `conventional-changelog-angular` +- `angular/preset/path` => `conventional-changelog-angular/preset/path` +- `@scope/angular` => `@scope/conventional-changelog-angular` +- `@scope/angular/preset/path` => `@scope/conventional-changelog-angular/preset/path` -Will return whatever is exported by the preset package. That may be a configuration object, a function, or a promise. +If it fails, it will try to load preset using name as is. + +## Preset exports + +Preset package should have default export which is a async (returns `Promise`) or sync function that accepts optional `options` object and returns the config object: + +```js +export default function createPreset(options) { + return { + // config + } +} +``` + +## Preset options + +To pass options to the preset, `loadPreset` function accepts object with `name` property as first argument: + +```js +const { loadPreset } = require('conventional-changelog-preset-loader') + +loadPreset({ + name: 'angular', + ...presetOptions +}).then((config) => { + // do something with config object +}) +``` ## License MIT © [Steve Mao](https://github.com/stevemao) - -[npm-image]: https://badge.fury.io/js/conventional-changelog-preset-loader.svg -[npm-url]: https://npmjs.org/package/conventional-changelog-preset-loader -[travis-image]: https://travis-ci.org/conventional-changelog/conventional-changelog-preset-loader.svg?branch=master -[travis-url]: https://travis-ci.org/conventional-changelog/conventional-changelog-preset-loader -[appveyor-image]: https://ci.appveyor.com/api/projects/status/baoumm34w8c5o0hv/branch/master?svg=true -[appveyor-url]: https://ci.appveyor.com/project/stevemao/conventional-changelog-preset-loader/branch/master -[daviddm-image]: https://david-dm.org/conventional-changelog/conventional-changelog-preset-loader.svg?theme=shields.io -[daviddm-url]: https://david-dm.org/conventional-changelog/conventional-changelog-preset-loader -[coverage-image]: https://coveralls.io/repos/github/conventional-changelog/conventional-changelog/badge.svg?branch=master -[coverage-url]: https://coveralls.io/github/conventional-changelog/conventional-changelog?branch=master diff --git a/packages/conventional-changelog-preset-loader/index.js b/packages/conventional-changelog-preset-loader/index.js index 58d6d8587..13decac18 100644 --- a/packages/conventional-changelog-preset-loader/index.js +++ b/packages/conventional-changelog-preset-loader/index.js @@ -1,59 +1,122 @@ 'use strict' -const nodePath = require('path') +const path = require('path') -module.exports = presetLoader(require) -module.exports.presetLoader = presetLoader +module.exports.loadPreset = createPresetLoader((preset) => import(preset)) +module.exports.createPresetLoader = createPresetLoader -function presetLoader (requireMethod) { - return path => { - let name = '' - let scope = '' - let absolutePath = '' +/** + * @typedef {((moduleName: string) => any) | ((moduleName: string) => Promise)} ModuleLoader + */ - if (typeof path === 'string') { - name = path.toLowerCase() - if (nodePath.isAbsolute(path)) { - absolutePath = path - } - } else if (typeof path === 'object' && path.name) { - // Rather than a string preset name, options.preset can be an object - // with a "name" key indicating the preset to load; additinoal key/value - // pairs are assumed to be configuration for the preset. See the documentation - // for a given preset for configuration available. - name = path.name.toLowerCase() - if (nodePath.isAbsolute(path.name)) { - absolutePath = path.name - } - } else { - throw Error('preset must be string or object with key name') +/** + * @typedef {{ name: string }} PresetParams + */ + +/** + * Trying to add 'conventional-changelog-' prefix to preset name if it is a shorthand. + * @param {string} preset - Absolute path, package name or shorthand preset name. + * @returns Variants of preset names. + */ +function resolvePresetNameVariants (preset) { + if (path.isAbsolute(preset)) { + return [preset] + } + + let scope = '' + let name = preset.toLocaleLowerCase() + + if (preset[0] === '@') { + const parts = preset.split('/') + + scope = parts.shift() + '/' + + if (scope === '@conventional-changelog/') { + return [preset] } - if (!absolutePath) { - if (name[0] === '@') { - const parts = name.split('/') - scope = parts.shift() + '/' - name = parts.join('/') - } + name = parts.join('/') + } + + if (!name.startsWith('conventional-changelog-')) { + name = `conventional-changelog-${name}` + } + + const altPreset = `${scope}${name}` + + if (altPreset !== preset) { + return [altPreset, preset] + } + + return [preset] +} + +/** + * Loads module with fallbacks. + * @param {ModuleLoader} moduleLoader - Function that loads module. + * @param {string[]} variants - Variants of module name to try. + * @returns {Promise} Loaded module. + */ +async function loadWithFallbacks (moduleLoader, variants) { + let error = null - if (!name.startsWith('conventional-changelog-')) { - name = `conventional-changelog-${name}` + for (const variant of variants) { + try { + return await moduleLoader(variant) + } catch (err) { + if (!error) { + error = err } } + } + + throw error +} + +/** + * Gets default export from CommonJS or ES module. + * @param {object} module + * @returns {object} + */ +function getModuleDefaultExport (module) { + if ((module.__esModule || Object.getPrototypeOf(module) === null) && module.default) { + return module.default + } + + return module +} + +/** + * Creates preset loader. + * @param {ModuleLoader} moduleLoader - Function that loads module. + * @returns {(presetOrParams: string | PresetParams) => Promise} Function that loads preset. + */ +function createPresetLoader (moduleLoader) { + return async function loadPreset (presetOrParams) { + let preset = '' + let params = null + + if (typeof presetOrParams === 'string') { + preset = presetOrParams + } else + if (typeof presetOrParams === 'object' && typeof presetOrParams.name === 'string') { + preset = presetOrParams.name + params = presetOrParams + } else { + throw Error('Preset must be string or object with property `name`') + } + + const presetNameVariants = resolvePresetNameVariants(preset) + let createPreset = null try { - const config = requireMethod(absolutePath || `${scope}${name}`) - // rather than returning a promise, presets can return a builder function - // which accepts a config object (allowing for customization) and returns - // a promise. - if (config && !config.then && typeof path === 'object') { - return config(path) - } else { - // require returned a promise that resolves to a config object. - return config - } - } catch (_) { - throw Error('does not exist') + createPreset = getModuleDefaultExport(await loadWithFallbacks(moduleLoader, presetNameVariants)) + } catch (err) { + throw Error(`Unable to load the "${preset}" preset. Please make sure it's installed.`, { cause: err }) } + + return params + ? await createPreset(params) + : await createPreset() } } diff --git a/packages/conventional-changelog-preset-loader/test/test.js b/packages/conventional-changelog-preset-loader/test/test.js index 3729d9d36..6038744ec 100644 --- a/packages/conventional-changelog-preset-loader/test/test.js +++ b/packages/conventional-changelog-preset-loader/test/test.js @@ -4,113 +4,155 @@ const chai = require('chai') const mocha = require('mocha') const describe = mocha.describe const it = mocha.it -const presetLoader = require('../').presetLoader +const { createPresetLoader } = require('../') const sinon = require('sinon') const sinonChai = require('sinon-chai') chai.use(sinonChai) const expect = chai.expect +const mockModuleLoader = () => () => ({}) +const mockUnprefixedModuleLoader = (moduleName) => { + if (/(^|\/)conventional-changelog-/.test(moduleName)) { + throw new Error('Module not found') + } -describe('presetLoader', () => { - it('loads unscoped package', () => { - const requireMethod = sinon.spy() - const load = presetLoader(requireMethod) + return () => ({}) +} - load('angular') +describe('createPresetLoader', () => { + it('should load unscoped package', async () => { + const requireMethod = sinon.spy(mockModuleLoader) + const load = createPresetLoader(requireMethod) + + await load('angular') expect(requireMethod).to.have.been.calledOnce .and.to.have.been.calledWith('conventional-changelog-angular') }) - it('loads unscoped package containing path', () => { - const requireMethod = sinon.spy() - const load = presetLoader(requireMethod) + it('should load unscoped package containing path', async () => { + const requireMethod = sinon.spy(mockModuleLoader) + const load = createPresetLoader(requireMethod) - load('angular/preset/path') + await load('angular/preset/path') expect(requireMethod).to.have.been.calledOnce .and.to.have.been.calledWith('conventional-changelog-angular/preset/path') }) - it('loads unscoped package with full package name', () => { - const requireMethod = sinon.spy() - const load = presetLoader(requireMethod) + it('should load unscoped package with full package name', async () => { + const requireMethod = sinon.spy(mockModuleLoader) + const load = createPresetLoader(requireMethod) - load('conventional-changelog-angular') + await load('conventional-changelog-angular') expect(requireMethod).to.have.been.calledOnce .and.to.have.been.calledWith('conventional-changelog-angular') }) - it('loads unscoped package with full package name containing path', () => { - const requireMethod = sinon.spy() - const load = presetLoader(requireMethod) + it('should load unscoped package with full package name containing path', async () => { + const requireMethod = sinon.spy(mockModuleLoader) + const load = createPresetLoader(requireMethod) - load('conventional-changelog-angular/preset/path') + await load('conventional-changelog-angular/preset/path') expect(requireMethod).to.have.been.calledOnce .and.to.have.been.calledWith('conventional-changelog-angular/preset/path') }) - it('loads scoped package', () => { - const requireMethod = sinon.spy() - const load = presetLoader(requireMethod) + it('should load scoped package', async () => { + const requireMethod = sinon.spy(mockModuleLoader) + const load = createPresetLoader(requireMethod) - load('@scope/angular') + await load('@scope/angular') expect(requireMethod).to.have.been.calledOnce .and.to.have.been.calledWith('@scope/conventional-changelog-angular') }) - it('loads scoped package containing path', () => { - const requireMethod = sinon.spy() - const load = presetLoader(requireMethod) + it('should load scoped package containing path', async () => { + const requireMethod = sinon.spy(mockModuleLoader) + const load = createPresetLoader(requireMethod) - load('@scope/angular/preset/path') + await load('@scope/angular/preset/path') expect(requireMethod).to.have.been.calledOnce .and.to.have.been.calledWith('@scope/conventional-changelog-angular/preset/path') }) - it('loads scoped package with full package name', () => { - const requireMethod = sinon.spy() - const load = presetLoader(requireMethod) + it('should load scoped package with full package name', async () => { + const requireMethod = sinon.spy(mockModuleLoader) + const load = createPresetLoader(requireMethod) - load('@scope/conventional-changelog-angular') + await load('@scope/conventional-changelog-angular') expect(requireMethod).to.have.been.calledOnce .and.to.have.been.calledWith('@scope/conventional-changelog-angular') }) - it('loads scoped package with full package name containing path', () => { - const requireMethod = sinon.spy() - const load = presetLoader(requireMethod) + it('should load scoped package with full package name containing path', async () => { + const requireMethod = sinon.spy(mockModuleLoader) + const load = createPresetLoader(requireMethod) - load('@scope/conventional-changelog-angular/preset/path') + await load('@scope/conventional-changelog-angular/preset/path') expect(requireMethod).to.have.been.calledOnce .and.to.have.been.calledWith('@scope/conventional-changelog-angular/preset/path') }) - it('loads package with an absolute file path', () => { - const requireMethod = sinon.spy() - const load = presetLoader(requireMethod) + it('should load package with an absolute file path', async () => { + const requireMethod = sinon.spy(mockModuleLoader) + const load = createPresetLoader(requireMethod) const filePath = require.resolve('conventional-changelog-angular') - load(filePath) + await load(filePath) expect(requireMethod).to.have.been.calledOnce .and.to.have.been.calledWith(filePath) }) - it('loads package with an absolute file path name', () => { - const requireMethod = sinon.spy() - const load = presetLoader(requireMethod) + it('should load package with an absolute file path name', async () => { + const requireMethod = sinon.spy(mockModuleLoader) + const load = createPresetLoader(requireMethod) const filePath = require.resolve('conventional-changelog-angular') - load({ name: filePath }) + await load({ name: filePath }) expect(requireMethod).to.have.been.calledOnce .and.to.have.been.calledWith(filePath) }) + + it('should load package in @conventional-changelog scope', async () => { + const requireMethod = sinon.spy(mockModuleLoader) + const load = createPresetLoader(requireMethod) + + await load('@conventional-changelog/preset-angular') + + expect(requireMethod).to.have.been.calledOnce + .and.to.have.been.calledWith('@conventional-changelog/preset-angular') + }) + + it('should load package without adding prefix', async () => { + const requireMethod = sinon.spy(mockUnprefixedModuleLoader) + const load = createPresetLoader(requireMethod) + + await load('trigen-conventional-changelog-angular') + + expect(requireMethod.getCalls().map(call => call.args)).to.deep.equal([ + ['conventional-changelog-trigen-conventional-changelog-angular'], + ['trigen-conventional-changelog-angular'] + ]) + }) + + it('should load scoped package without adding prefix', async () => { + const requireMethod = sinon.spy(mockUnprefixedModuleLoader) + const load = createPresetLoader(requireMethod) + + await load('@trigen/cc-preset-angular') + + expect(requireMethod.getCalls().map(call => call.args)).to.deep.equal([ + ['@trigen/conventional-changelog-cc-preset-angular'], + ['@trigen/cc-preset-angular'] + ]) + }) }) diff --git a/packages/conventional-changelog-writer/package.json b/packages/conventional-changelog-writer/package.json index 8f6ae4b35..77738523d 100644 --- a/packages/conventional-changelog-writer/package.json +++ b/packages/conventional-changelog-writer/package.json @@ -41,7 +41,7 @@ "handlebars": "^4.7.7", "json-stringify-safe": "^5.0.1", "meow": "^8.1.2", - "semver": "^7.0.0", + "semver": "^7.5.2", "split": "^1.0.1" }, "scripts": { diff --git a/packages/conventional-changelog/index.js b/packages/conventional-changelog/index.js index 482b02eb5..0aecc105b 100644 --- a/packages/conventional-changelog/index.js +++ b/packages/conventional-changelog/index.js @@ -1,14 +1,14 @@ 'use strict' const conventionalChangelogCore = require('conventional-changelog-core') -const conventionalChangelogPresetLoader = require('conventional-changelog-preset-loader') +const { loadPreset } = require('conventional-changelog-preset-loader') function conventionalChangelog (options, context, gitRawCommitsOpts, parserOpts, writerOpts) { options.warn = options.warn || function () {} if (options.preset) { try { - options.config = conventionalChangelogPresetLoader(options.preset) + options.config = loadPreset(options.preset) } catch (err) { if (typeof options.preset === 'object') { options.warn(`Preset: "${options.preset.name}" ${err.message}`) diff --git a/packages/conventional-changelog/test/test.js b/packages/conventional-changelog/test/test.js index 66e240e8f..c7b8542a6 100644 --- a/packages/conventional-changelog/test/test.js +++ b/packages/conventional-changelog/test/test.js @@ -113,7 +113,7 @@ describe('conventionalChangelog', function () { return } - expect(warning).to.equal('Preset: "no" does not exist') + expect(warning).to.equal('Error: Unable to load the "no" preset. Please make sure it\'s installed.') i++ done() diff --git a/packages/conventional-recommended-bump/index.js b/packages/conventional-recommended-bump/index.js index 2e888429f..0c47ca0e7 100644 --- a/packages/conventional-recommended-bump/index.js +++ b/packages/conventional-recommended-bump/index.js @@ -2,16 +2,15 @@ const concat = require('concat-stream') const conventionalCommitsFilter = require('conventional-commits-filter') const conventionalCommitsParser = require('conventional-commits-parser') -const conventionalChangelogPresetLoader = require('conventional-changelog-preset-loader') +const { loadPreset } = require('conventional-changelog-preset-loader') const gitSemverTags = require('git-semver-tags') const gitRawCommits = require('git-raw-commits') -const presetResolver = require('./preset-resolver') const VERSIONS = ['major', 'minor', 'patch'] -module.exports = conventionalRecommendedBump +module.exports = conventionalRecommendedBumpLegacy -function conventionalRecommendedBump (optionsArgument, parserOptsArgument, cbArgument) { +async function conventionalRecommendedBump (optionsArgument, parserOptsArgument) { if (typeof optionsArgument !== 'object') { throw new Error('The \'options\' argument must be an object.') } @@ -21,48 +20,33 @@ function conventionalRecommendedBump (optionsArgument, parserOptsArgument, cbArg gitRawCommitsOpts: {} }, optionsArgument) - const cb = typeof parserOptsArgument === 'function' ? parserOptsArgument : cbArgument - - if (typeof cb !== 'function') { - throw new Error('You must provide a callback function.') - } - - let presetPackage = options.config || {} + let config = options.config || {} if (options.preset) { - try { - presetPackage = conventionalChangelogPresetLoader(options.preset) - } catch (err) { - if (err.message === 'does not exist') { - const preset = typeof options.preset === 'object' ? options.preset.name : options.preset - return cb(new Error(`Unable to load the "${preset}" preset package. Please make sure it's installed.`)) - } else { - return cb(err) - } - } + config = await loadPreset(options.preset) } - presetResolver(presetPackage).then(config => { - const whatBump = options.whatBump || - ((config.recommendedBumpOpts && config.recommendedBumpOpts.whatBump) - ? config.recommendedBumpOpts.whatBump - : noop) + const whatBump = options.whatBump || + ((config.recommendedBumpOpts && config.recommendedBumpOpts.whatBump) + ? config.recommendedBumpOpts.whatBump + : noop) - if (typeof whatBump !== 'function') { - throw Error('whatBump must be a function') - } + if (typeof whatBump !== 'function') { + throw Error('whatBump must be a function') + } - // TODO: For now we defer to `config.recommendedBumpOpts.parserOpts` if it exists, as our initial refactor - // efforts created a `parserOpts` object under the `recommendedBumpOpts` object in each preset package. - // In the future we want to merge differences found in `recommendedBumpOpts.parserOpts` into the top-level - // `parserOpts` object and remove `recommendedBumpOpts.parserOpts` from each preset package if it exists. - const parserOpts = Object.assign({}, - config.recommendedBumpOpts && config.recommendedBumpOpts.parserOpts - ? config.recommendedBumpOpts.parserOpts - : config.parserOpts, - parserOptsArgument) + // TODO: For now we defer to `config.recommendedBumpOpts.parserOpts` if it exists, as our initial refactor + // efforts created a `parserOpts` object under the `recommendedBumpOpts` object in each preset package. + // In the future we want to merge differences found in `recommendedBumpOpts.parserOpts` into the top-level + // `parserOpts` object and remove `recommendedBumpOpts.parserOpts` from each preset package if it exists. + const parserOpts = Object.assign({}, + config.recommendedBumpOpts && config.recommendedBumpOpts.parserOpts + ? config.recommendedBumpOpts.parserOpts + : config.parserOpts, + parserOptsArgument) - const warn = typeof parserOpts.warn === 'function' ? parserOpts.warn : noop + const warn = typeof parserOpts.warn === 'function' ? parserOpts.warn : noop + return await new Promise((resolve, reject) => { gitSemverTags({ lernaTags: !!options.lernaPackage, package: options.lernaPackage, @@ -70,7 +54,7 @@ function conventionalRecommendedBump (optionsArgument, parserOptsArgument, cbArg skipUnstable: options.skipUnstable }, (err, tags) => { if (err) { - return cb(err) + return reject(err) } gitRawCommits({ @@ -95,10 +79,22 @@ function conventionalRecommendedBump (optionsArgument, parserOptsArgument, cbArg result = {} } - cb(null, result) + resolve(result) })) }) - }).catch(err => cb(err)) + }) +} + +function conventionalRecommendedBumpLegacy (optionsArgument, parserOptsArgument, cbArgument) { + const cb = typeof parserOptsArgument === 'function' ? parserOptsArgument : cbArgument + + if (typeof cb !== 'function') { + throw new Error('You must provide a callback function.') + } + + conventionalRecommendedBump(optionsArgument, parserOptsArgument) + .then((result) => cb(null, result)) + .catch((err) => cb(err)) } function noop () {} diff --git a/packages/conventional-recommended-bump/package.json b/packages/conventional-recommended-bump/package.json index aabac8a51..864867be9 100644 --- a/packages/conventional-recommended-bump/package.json +++ b/packages/conventional-recommended-bump/package.json @@ -21,8 +21,7 @@ }, "files": [ "index.js", - "cli.js", - "preset-resolver.js" + "cli.js" ], "keywords": [ "conventional-recommended-bump", diff --git a/packages/conventional-recommended-bump/preset-resolver.js b/packages/conventional-recommended-bump/preset-resolver.js deleted file mode 100644 index 31abcc21b..000000000 --- a/packages/conventional-recommended-bump/preset-resolver.js +++ /dev/null @@ -1,19 +0,0 @@ -'use strict' - -const { promisify } = require('util') - -module.exports = presetResolver - -async function presetResolver (presetPackage) { - // handle traditional node-style callbacks - if (typeof presetPackage === 'function') { - return await promisify(presetPackage)() - } - - // handle object literal or Promise instance - if (typeof presetPackage === 'object') { - return await presetPackage - } - - throw new Error('preset package must be a promise, function, or object') -} diff --git a/packages/conventional-recommended-bump/test/index.spec.js b/packages/conventional-recommended-bump/test/index.spec.js index 0fe7519ad..04e9aec1b 100644 --- a/packages/conventional-recommended-bump/test/index.spec.js +++ b/packages/conventional-recommended-bump/test/index.spec.js @@ -257,7 +257,7 @@ describe('conventional-recommended-bump API', () => { preset: 'does-not-exist' }, {}, err => { assert.ok(err) - assert.strictEqual(err.message, 'Unable to load the "does-not-exist" preset package. Please make sure it\'s installed.') + assert.strictEqual(err.message, 'Unable to load the "does-not-exist" preset. Please make sure it\'s installed.') done() }) }) diff --git a/packages/conventional-recommended-bump/test/preset-resolver.spec.js b/packages/conventional-recommended-bump/test/preset-resolver.spec.js deleted file mode 100644 index f852c0e99..000000000 --- a/packages/conventional-recommended-bump/test/preset-resolver.spec.js +++ /dev/null @@ -1,48 +0,0 @@ -'use strict' - -const assert = require('assert') -const presetResolver = require('../preset-resolver') - -describe('preset-resolver', () => { - it('rejects if preset package is not a promise, function, or object', () => { - const result = presetResolver('invalid preset package') - - return result.catch(error => { - assert.strictEqual(error.message, 'preset package must be a promise, function, or object') - }) - }) - - it('resolves a promise as a promise', () => { - const result = presetResolver(Promise.resolve(true)) - - return result.then(value => { - assert.strictEqual(value, true) - }) - }) - - it('resolves an object as a promise', () => { - const result = presetResolver({ answer: 42 }) - - return result.then(value => { - assert.deepStrictEqual(value, { answer: 42 }) - }) - }) - - it('resolves a callback function as a promise', () => { - const presetPackage = cb => cb(null, { answer: 42 }) - const result = presetResolver(presetPackage) - - return result.then(value => { - assert.deepStrictEqual(value, { answer: 42 }) - }) - }) - - it('fails promise if callback function returns error', () => { - const presetPackage = cb => cb(new Error('an error happened')) - const result = presetResolver(presetPackage) - - return result.catch(error => { - assert.deepStrictEqual(error.message, 'an error happened') - }) - }) -}) diff --git a/packages/git-semver-tags/package.json b/packages/git-semver-tags/package.json index fdc88516d..11f054a08 100644 --- a/packages/git-semver-tags/package.json +++ b/packages/git-semver-tags/package.json @@ -33,7 +33,7 @@ ], "dependencies": { "meow": "^8.1.2", - "semver": "^7.0.0" + "semver": "^7.5.2" }, "scripts": { "test-windows": "mocha --timeout 30000" diff --git a/packages/gulp-conventional-changelog/README.md b/packages/gulp-conventional-changelog/README.md index e9225a37c..79f0ae46b 100644 --- a/packages/gulp-conventional-changelog/README.md +++ b/packages/gulp-conventional-changelog/README.md @@ -1,8 +1,8 @@ # gulp-conventional-changelog [![NPM version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Dependency Status][daviddm-image]][daviddm-url] [![Coverage Status][coverage-image]][coverage-url] -> Generate a changelog using [conventional-changelog](https://github.com/ajoslin/conventional-changelog) +> Generate a changelog using [conventional-changelog](https://github.com/conventional-changelog/conventional-changelog) -*Issues with the output should be reported on the `conventional-changelog` [issue tracker](https://github.com/ajoslin/conventional-changelog/issues).* +*Issues with the output should be reported on the `conventional-changelog` [issue tracker](https://github.com/conventional-changelog/conventional-changelog/issues).* Checkout the [gulp official recipe](https://github.com/gulpjs/gulp/blob/master/docs/recipes/automate-release-workflow.md) to automate releases with gulp and gulp-conventional-changelog. @@ -64,7 +64,7 @@ gulp.task('changelog', function () { }); ``` -**Note:** If your `options.releaseCount` is `0` (regenerate all changelog from previous releases) you can just use [conventional-changelog](https://github.com/ajoslin/conventional-changelog) directly or not to read the file at all. +**Note:** If your `options.releaseCount` is `0` (regenerate all changelog from previous releases) you can just use [conventional-changelog](https://github.com/conventional-changelog/conventional-changelog) directly or not to read the file at all. ```js var gulp = require('gulp'); @@ -101,7 +101,7 @@ gulp.task('default', function () { ## API -See the [conventional-changelog](https://github.com/ajoslin/conventional-changelog) docs. +See the [conventional-changelog](https://github.com/conventional-changelog/conventional-changelog) docs. There are some changes: diff --git a/packages/standard-changelog/README.md b/packages/standard-changelog/README.md index 9c6a6c7c4..12d6d025b 100644 --- a/packages/standard-changelog/README.md +++ b/packages/standard-changelog/README.md @@ -48,7 +48,7 @@ $ standard-changelog --help ## API -See the [conventional-changelog](https://github.com/ajoslin/conventional-changelog) docs with the angular preset. +See the [conventional-changelog](https://github.com/conventional-changelog/conventional-changelog) docs with the angular preset. ## License diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4855bf005..298b4dc25 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,7 +21,7 @@ importers: pinkie-promise: ^2.0.1 rimraf: ^3.0.2 safe-buffer: 5.2.1 - semver: ^7.0.0 + semver: ^7.5.2 sinon: ^15.0.0 sinon-chai: ^3.7.0 tmp: ^0.2.1 @@ -44,7 +44,7 @@ importers: pinkie-promise: 2.0.1 rimraf: 3.0.2 safe-buffer: 5.2.1 - semver: 7.5.1 + semver: 7.5.4 sinon: 15.2.0 sinon-chai: 3.7.0_chai@4.3.7+sinon@15.2.0 tmp: 0.2.1 @@ -172,7 +172,7 @@ importers: handlebars: ^4.7.7 json-stringify-safe: ^5.0.1 meow: ^8.1.2 - semver: ^7.0.0 + semver: ^7.5.2 split: ^1.0.1 dependencies: conventional-commits-filter: link:../conventional-commits-filter @@ -180,7 +180,7 @@ importers: handlebars: 4.7.7 json-stringify-safe: 5.0.1 meow: 8.1.2 - semver: 7.5.1 + semver: 7.5.4 split: 1.0.1 devDependencies: dedent: 0.7.0 @@ -238,10 +238,10 @@ importers: packages/git-semver-tags: specifiers: meow: ^8.1.2 - semver: ^7.0.0 + semver: ^7.5.2 dependencies: meow: 8.1.2 - semver: 7.5.1 + semver: 7.5.4 packages/gulp-conventional-changelog: specifiers: @@ -2202,7 +2202,7 @@ packages: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.12.1 - semver: 7.5.1 + semver: 7.5.4 validate-npm-package-license: 3.0.4 dev: false @@ -2212,7 +2212,7 @@ packages: dependencies: hosted-git-info: 6.1.1 is-core-module: 2.12.1 - semver: 7.5.1 + semver: 7.5.4 validate-npm-package-license: 3.0.4 dev: false @@ -2664,8 +2664,8 @@ packages: hasBin: true dev: true - /semver/7.5.1: - resolution: {integrity: sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==} + /semver/7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} hasBin: true dependencies: