From 0ceea0c137d7a5d2b1f20b5108422c45b1767ff5 Mon Sep 17 00:00:00 2001 From: Guido Ceraso Date: Tue, 12 Sep 2023 15:24:32 +0200 Subject: [PATCH 1/4] feat: skip version bumping if no commits --- index.js | 1 + lib/lifecycles/bump.js | 26 +++++++++++++++++++++++--- package-lock.json | 28 +++++++++++++++++++++------- package.json | 1 + 4 files changed, 46 insertions(+), 10 deletions(-) diff --git a/index.js b/index.js index 8941e654a..cb88fc915 100755 --- a/index.js +++ b/index.js @@ -82,6 +82,7 @@ module.exports = async function standardVersion (argv) { } const newVersion = await bump(args, version) + if (!newVersion) return await changelog(args, newVersion) await commit(args, newVersion) await tag(newVersion, pkg ? pkg.private : false, args) diff --git a/lib/lifecycles/bump.js b/lib/lifecycles/bump.js index da72199f6..8b167968d 100644 --- a/lib/lifecycles/bump.js +++ b/lib/lifecycles/bump.js @@ -9,11 +9,14 @@ const DotGitignore = require('dotgitignore') const path = require('path') const presetLoader = require('../preset-loader') const runLifecycleScript = require('../run-lifecycle-script') +const { loadPreset } = require('conventional-changelog-preset-loader') const semver = require('semver') const writeFile = require('../write-file') const { resolveUpdaterObjectFromArgument } = require('../updaters') let configsToUpdate = {} +function noop () {} + async function Bump (args, version) { // reset the cache of updated config files each // time we perform the version bump step. @@ -25,6 +28,14 @@ async function Bump (args, version) { const stdout = await runLifecycleScript(args, 'prebump') if (stdout && stdout.trim().length) args.releaseAs = stdout.trim() const release = await bumpVersion(args.releaseAs, version, args) + if (!Object.keys(release).length) { + checkpoint( + args, + 'no commits found, so not bumping version', + [] + ) + return null; + } if (!args.firstRelease) { const releaseType = getReleaseType(args.prerelease, release.releaseType, version) const releaseTypeAsVersion = releaseType === 'pre' + release.releaseType ? semver.valid(release.releaseType + '-' + args.prerelease + '.0') : semver.valid(releaseType) @@ -107,8 +118,9 @@ function getTypePriority (type) { return TypeList.indexOf(type) } -function bumpVersion (releaseAs, currentVersion, args) { - return new Promise((resolve, reject) => { +function bumpVersion(releaseAs, currentVersion, args) { + // eslint-disable-next-line no-async-promise-executor + return new Promise(async (resolve, reject) => { if (releaseAs) { return resolve({ releaseType: releaseAs @@ -118,12 +130,20 @@ function bumpVersion (releaseAs, currentVersion, args) { if (typeof presetOptions === 'object') { if (semver.lt(currentVersion, '1.0.0')) presetOptions.preMajor = true } + const config = await loadPreset(presetOptions) + const presetWhatBump = ((config.recommendedBumpOpts && config.recommendedBumpOpts.whatBump) + ? config.recommendedBumpOpts.whatBump + : noop) conventionalRecommendedBump({ debug: args.verbose && console.info.bind(console, 'conventional-recommended-bump'), preset: presetOptions, path: args.path, tagPrefix: args.tagPrefix, - lernaPackage: args.lernaPackage + lernaPackage: args.lernaPackage, + whatBump(commits) { + if (!commits.length) return {} + return presetWhatBump(commits) + } }, args.parserOpts, function (err, release) { if (err) return reject(err) else return resolve(release) diff --git a/package-lock.json b/package-lock.json index b58814d42..14b28e080 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "conventional-changelog": "3.1.25", "conventional-changelog-config-spec": "2.1.0", "conventional-changelog-conventionalcommits": "6.1.0", + "conventional-changelog-preset-loader": "4.1.0", "conventional-recommended-bump": "7.0.1", "detect-indent": "^6.0.0", "detect-newline": "^3.1.0", @@ -1273,11 +1274,11 @@ } }, "node_modules/conventional-changelog-preset-loader": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", - "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-4.1.0.tgz", + "integrity": "sha512-HozQjJicZTuRhCRTq4rZbefaiCzRM2pr6u2NL3XhrmQm4RMnDXfESU6JKu/pnKwx5xtdkYfNCsbhN5exhiKGJA==", "engines": { - "node": ">=10" + "node": ">=16" } }, "node_modules/conventional-changelog-writer": { @@ -1323,6 +1324,14 @@ "node": ">=10" } }, + "node_modules/conventional-changelog/node_modules/conventional-changelog-preset-loader": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", + "engines": { + "node": ">=10" + } + }, "node_modules/conventional-commits-filter": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", @@ -6684,6 +6693,11 @@ "lodash": "^4.17.15", "q": "^1.5.1" } + }, + "conventional-changelog-preset-loader": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==" } } }, @@ -6804,9 +6818,9 @@ } }, "conventional-changelog-preset-loader": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", - "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-4.1.0.tgz", + "integrity": "sha512-HozQjJicZTuRhCRTq4rZbefaiCzRM2pr6u2NL3XhrmQm4RMnDXfESU6JKu/pnKwx5xtdkYfNCsbhN5exhiKGJA==" }, "conventional-changelog-writer": { "version": "5.0.1", diff --git a/package.json b/package.json index bd5038504..200698ffa 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "conventional-changelog-config-spec": "2.1.0", "conventional-changelog-conventionalcommits": "6.1.0", "conventional-recommended-bump": "7.0.1", + "conventional-changelog-preset-loader": "4.1.0", "detect-indent": "^6.0.0", "detect-newline": "^3.1.0", "dotgitignore": "^2.1.0", From 4785715517e6d4b66be64e6f0b076bb1e89f3921 Mon Sep 17 00:00:00 2001 From: Guido Ceraso Date: Tue, 12 Sep 2023 17:37:01 +0200 Subject: [PATCH 2/4] feat: simplified not bumping version by copying whatBump function and adding logic inside --- lib/lifecycles/bump.js | 45 +++++++++++++++++++++++++++++++----------- package-lock.json | 28 +++++++------------------- package.json | 1 - 3 files changed, 41 insertions(+), 33 deletions(-) diff --git a/lib/lifecycles/bump.js b/lib/lifecycles/bump.js index 8b167968d..5274a5997 100644 --- a/lib/lifecycles/bump.js +++ b/lib/lifecycles/bump.js @@ -9,13 +9,43 @@ const DotGitignore = require('dotgitignore') const path = require('path') const presetLoader = require('../preset-loader') const runLifecycleScript = require('../run-lifecycle-script') -const { loadPreset } = require('conventional-changelog-preset-loader') const semver = require('semver') const writeFile = require('../write-file') const { resolveUpdaterObjectFromArgument } = require('../updaters') +const addBangNotes = require('conventional-changelog-conventionalcommits/add-bang-notes') let configsToUpdate = {} -function noop () {} +function _whatBump(config, commits) { + let level = 2 + let breakings = 0 + let features = 0 + + commits.forEach(commit => { + addBangNotes(commit) + if (commit.notes.length > 0) { + breakings += commit.notes.length + level = 0 + } else if (commit.type === 'feat' || commit.type === 'feature') { + features += 1 + if (level === 2) { + level = 1 + } + } + }) + + if (config.preMajor && level < 2) { + level++ + } + + if(!breakings && !features) return {} + + return { + level: level, + reason: breakings === 1 + ? `There is ${breakings} BREAKING CHANGE and ${features} features` + : `There are ${breakings} BREAKING CHANGES and ${features} features` + } +} async function Bump (args, version) { // reset the cache of updated config files each @@ -34,7 +64,7 @@ async function Bump (args, version) { 'no commits found, so not bumping version', [] ) - return null; + return null } if (!args.firstRelease) { const releaseType = getReleaseType(args.prerelease, release.releaseType, version) @@ -130,20 +160,13 @@ function bumpVersion(releaseAs, currentVersion, args) { if (typeof presetOptions === 'object') { if (semver.lt(currentVersion, '1.0.0')) presetOptions.preMajor = true } - const config = await loadPreset(presetOptions) - const presetWhatBump = ((config.recommendedBumpOpts && config.recommendedBumpOpts.whatBump) - ? config.recommendedBumpOpts.whatBump - : noop) conventionalRecommendedBump({ debug: args.verbose && console.info.bind(console, 'conventional-recommended-bump'), preset: presetOptions, path: args.path, tagPrefix: args.tagPrefix, lernaPackage: args.lernaPackage, - whatBump(commits) { - if (!commits.length) return {} - return presetWhatBump(commits) - } + whatBump(commits) { return _whatBump(presetOptions, commits) } }, args.parserOpts, function (err, release) { if (err) return reject(err) else return resolve(release) diff --git a/package-lock.json b/package-lock.json index 14b28e080..b58814d42 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,6 @@ "conventional-changelog": "3.1.25", "conventional-changelog-config-spec": "2.1.0", "conventional-changelog-conventionalcommits": "6.1.0", - "conventional-changelog-preset-loader": "4.1.0", "conventional-recommended-bump": "7.0.1", "detect-indent": "^6.0.0", "detect-newline": "^3.1.0", @@ -1274,11 +1273,11 @@ } }, "node_modules/conventional-changelog-preset-loader": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-4.1.0.tgz", - "integrity": "sha512-HozQjJicZTuRhCRTq4rZbefaiCzRM2pr6u2NL3XhrmQm4RMnDXfESU6JKu/pnKwx5xtdkYfNCsbhN5exhiKGJA==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", "engines": { - "node": ">=16" + "node": ">=10" } }, "node_modules/conventional-changelog-writer": { @@ -1324,14 +1323,6 @@ "node": ">=10" } }, - "node_modules/conventional-changelog/node_modules/conventional-changelog-preset-loader": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", - "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", - "engines": { - "node": ">=10" - } - }, "node_modules/conventional-commits-filter": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", @@ -6693,11 +6684,6 @@ "lodash": "^4.17.15", "q": "^1.5.1" } - }, - "conventional-changelog-preset-loader": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", - "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==" } } }, @@ -6818,9 +6804,9 @@ } }, "conventional-changelog-preset-loader": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-4.1.0.tgz", - "integrity": "sha512-HozQjJicZTuRhCRTq4rZbefaiCzRM2pr6u2NL3XhrmQm4RMnDXfESU6JKu/pnKwx5xtdkYfNCsbhN5exhiKGJA==" + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==" }, "conventional-changelog-writer": { "version": "5.0.1", diff --git a/package.json b/package.json index 200698ffa..bd5038504 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,6 @@ "conventional-changelog-config-spec": "2.1.0", "conventional-changelog-conventionalcommits": "6.1.0", "conventional-recommended-bump": "7.0.1", - "conventional-changelog-preset-loader": "4.1.0", "detect-indent": "^6.0.0", "detect-newline": "^3.1.0", "dotgitignore": "^2.1.0", From 8c9c5ce068ddcbbc7873bd2ec575f0a5b3fa5d33 Mon Sep 17 00:00:00 2001 From: Guido Ceraso Date: Tue, 12 Sep 2023 18:00:42 +0200 Subject: [PATCH 3/4] fix: _whatBump also check for fix types to avoid upgrading if there are not patches --- lib/lifecycles/bump.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/lifecycles/bump.js b/lib/lifecycles/bump.js index 5274a5997..17fc22616 100644 --- a/lib/lifecycles/bump.js +++ b/lib/lifecycles/bump.js @@ -19,6 +19,7 @@ function _whatBump(config, commits) { let level = 2 let breakings = 0 let features = 0 + let fix = 0 commits.forEach(commit => { addBangNotes(commit) @@ -31,13 +32,16 @@ function _whatBump(config, commits) { level = 1 } } + if(commit.type === 'fix') { + fix += 1 + } }) if (config.preMajor && level < 2) { level++ } - if(!breakings && !features) return {} + if(!breakings && !features && !fix) return {} return { level: level, From e936987bd803a258192ffb6c12559eefea20f9fa Mon Sep 17 00:00:00 2001 From: Guido Ceraso Date: Sun, 1 Oct 2023 13:49:20 +0200 Subject: [PATCH 4/4] chore: added config flag and linted files. Missing tests --- command.js | 5 +++++ lib/lifecycles/bump.js | 16 ++++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/command.js b/command.js index afe65fe8d..40d7d7e93 100755 --- a/command.js +++ b/command.js @@ -126,6 +126,11 @@ const yargs = require('yargs') default: defaults.npmPublishHint, describe: 'Customized publishing hint' }) + .option('noBumpWhenEmptyChanges', { + type: 'boolean', + default: false, + describe: 'Avoid bumping files and generating changelog if there are no changes.' + }) .check((argv) => { if (typeof argv.scripts !== 'object' || Array.isArray(argv.scripts)) { throw Error('scripts must be an object') diff --git a/lib/lifecycles/bump.js b/lib/lifecycles/bump.js index 17fc22616..10f912550 100644 --- a/lib/lifecycles/bump.js +++ b/lib/lifecycles/bump.js @@ -15,7 +15,7 @@ const { resolveUpdaterObjectFromArgument } = require('../updaters') const addBangNotes = require('conventional-changelog-conventionalcommits/add-bang-notes') let configsToUpdate = {} -function _whatBump(config, commits) { +function _whatBump (config, commits) { let level = 2 let breakings = 0 let features = 0 @@ -32,7 +32,7 @@ function _whatBump(config, commits) { level = 1 } } - if(commit.type === 'fix') { + if (commit.type === 'fix') { fix += 1 } }) @@ -41,10 +41,10 @@ function _whatBump(config, commits) { level++ } - if(!breakings && !features && !fix) return {} + if (!breakings && !features && !fix) return {} return { - level: level, + level, reason: breakings === 1 ? `There is ${breakings} BREAKING CHANGE and ${features} features` : `There are ${breakings} BREAKING CHANGES and ${features} features` @@ -152,7 +152,7 @@ function getTypePriority (type) { return TypeList.indexOf(type) } -function bumpVersion(releaseAs, currentVersion, args) { +function bumpVersion (releaseAs, currentVersion, args) { // eslint-disable-next-line no-async-promise-executor return new Promise(async (resolve, reject) => { if (releaseAs) { @@ -170,7 +170,11 @@ function bumpVersion(releaseAs, currentVersion, args) { path: args.path, tagPrefix: args.tagPrefix, lernaPackage: args.lernaPackage, - whatBump(commits) { return _whatBump(presetOptions, commits) } + ...args.noBumpWhenEmptyChanges && { + whatBump (commits) { + return _whatBump(presetOptions, commits) + } + } }, args.parserOpts, function (err, release) { if (err) return reject(err) else return resolve(release)