From 7459d8bcbc6b0dc0d3b8fefa6a65a5b4efdc48d5 Mon Sep 17 00:00:00 2001 From: Edouard Bozon Date: Thu, 8 Feb 2024 14:59:03 +0100 Subject: [PATCH] fix(semver): increment version for `preminor`, `prepatch` and `premajor` Fixes release as preminor is not increasing the version #775 --- .../__snapshots__/index.e2e.spec.ts.snap | 71 ++++++++++++++++++- .../src/executors/version/index.e2e.spec.ts | 43 +++++++++++ .../version/utils/get-last-version.spec.ts | 20 ++++-- .../version/utils/get-last-version.ts | 24 +++---- .../src/executors/version/utils/try-bump.ts | 8 +-- 5 files changed, 140 insertions(+), 26 deletions(-) diff --git a/packages/semver/src/executors/version/__snapshots__/index.e2e.spec.ts.snap b/packages/semver/src/executors/version/__snapshots__/index.e2e.spec.ts.snap index d22a45e56..156b566c3 100644 --- a/packages/semver/src/executors/version/__snapshots__/index.e2e.spec.ts.snap +++ b/packages/semver/src/executors/version/__snapshots__/index.e2e.spec.ts.snap @@ -111,7 +111,76 @@ This file was generated using [@jscutlery/semver](https://github.com/jscutlery/s " `; -exports[`@jscutlery/semver @jscutlery/semver:version when pre-releasing libs/a should generate CHANGELOG.md 1`] = ` +exports[`@jscutlery/semver @jscutlery/semver:version when pre-releasing libs/a (--releaseAs=preminor --preid=alpha) should generate CHANGELOG.md 1`] = ` +"# Changelog + +This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). + +# [1.2.0-alpha.0](/compare/a-1.1.0-alpha.0...a-1.2.0-alpha.0) (yyyy-mm-dd) + + +### Features + +* **a:** 🚀 new feature 2 xxxxxxx + + + +# [1.1.0-alpha.0](/compare/a-1.0.1-beta.1...a-1.1.0-alpha.0) (yyyy-mm-dd) + + +### Features + +* **a:** 🚀 new feature 1 xxxxxxx + + + +## [1.0.1-beta.1](/compare/a-1.0.1-beta.0...a-1.0.1-beta.1) (yyyy-mm-dd) + + +### Features + +* **a:** 🚀 new feature 2 xxxxxxx + + + +## [1.0.1-beta.0](/compare/a-1.0.0...a-1.0.1-beta.0) (yyyy-mm-dd) + + +### Features + +* **a:** 🚀 new feature 1 xxxxxxx + + + +# [1.0.0](/compare/a-0.1.0...a-1.0.0) (yyyy-mm-dd) + + +### Features + +* **a:** 🚀 new feature xxxxxxx + + +### BREAKING CHANGES + +* **a:** 🚨 Breaking change description + + + +# 0.1.0 (yyyy-mm-dd) + + +### Bug Fixes + +* **a:** 🐞 fix bug xxxxxxx + + +### Features + +* **a:** 🚀 new feature xxxxxxx +" +`; + +exports[`@jscutlery/semver @jscutlery/semver:version when pre-releasing libs/a (--releaseAs=prerelease --preid=beta) should generate CHANGELOG.md 1`] = ` "# Changelog This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). diff --git a/packages/semver/src/executors/version/index.e2e.spec.ts b/packages/semver/src/executors/version/index.e2e.spec.ts index ea90d85ca..e630d1d79 100644 --- a/packages/semver/src/executors/version/index.e2e.spec.ts +++ b/packages/semver/src/executors/version/index.e2e.spec.ts @@ -289,6 +289,49 @@ describe('@jscutlery/semver', () => { }); }); + describe('when pre-releasing libs/a (--releaseAs=preminor --preid=alpha)', () => { + beforeAll(() => { + testingWorkspace.exec( + ` + echo feat >> libs/a/a.txt + git add . + git commit -m "feat(a): 🚀 new feature 1" + `, + ); + testingWorkspace.runNx( + `run a:version --releaseAs=preminor --preid=alpha --noVerify`, + ); + testingWorkspace.exec( + ` + echo feat >> libs/a/a.txt + git add . + git commit -m "feat(a): 🚀 new feature 2" + `, + ); + testingWorkspace.runNx( + `run a:version --releaseAs=preminor --preid=alpha --noVerify`, + ); + }); + + it('should tag with version', () => { + expect(getLastTag(testingWorkspace.root)).toBe('a-1.2.0-alpha.0'); + }); + + it('should bump package version', () => { + expect( + readFile(`${testingWorkspace.root}/libs/a/package.json`), + ).toMatch(/"version": "1.2.0-alpha.0"/); + }); + + it('should generate CHANGELOG.md', () => { + expect( + deterministicChangelog( + readFile(`${testingWorkspace.root}/libs/a/CHANGELOG.md`), + ), + ).toMatchSnapshot(); + }); + }); + describe('when libs/b changed (with --skipCommit)', () => { beforeAll(() => { testingWorkspace.exec( diff --git a/packages/semver/src/executors/version/utils/get-last-version.spec.ts b/packages/semver/src/executors/version/utils/get-last-version.spec.ts index d419482a1..4c08566f2 100644 --- a/packages/semver/src/executors/version/utils/get-last-version.spec.ts +++ b/packages/semver/src/executors/version/utils/get-last-version.spec.ts @@ -49,12 +49,22 @@ describe(getLastVersion.name, () => { 'my-lib-1.0.0', ]); - const tag = await lastValueFrom(getLastVersion({ tagPrefix })); + const tag = await lastValueFrom( + getLastVersion({ tagPrefix, releaseType: 'prerelease' }), + ); const tagWithPreidFeat = await lastValueFrom( - getLastVersion({ tagPrefix, preid: 'add-feature' }), + getLastVersion({ + tagPrefix, + releaseType: 'prerelease', + preid: 'add-feature', + }), ); const tagWithPreidFix = await lastValueFrom( - getLastVersion({ tagPrefix, preid: 'fix-bug' }), + getLastVersion({ + tagPrefix, + releaseType: 'prerelease', + preid: 'fix-bug', + }), ); expect(tag).toEqual('2.1.0-z-is-the-last-letter-in-alphabet.0'); @@ -69,9 +79,7 @@ describe(getLastVersion.name, () => { 'my-lib-1.0.0', ]); - const tag = await lastValueFrom( - getLastVersion({ tagPrefix, includePrerelease: false }), - ); + const tag = await lastValueFrom(getLastVersion({ tagPrefix })); expect(tag).toEqual('2.0.0'); }); diff --git a/packages/semver/src/executors/version/utils/get-last-version.ts b/packages/semver/src/executors/version/utils/get-last-version.ts index ef73ecb9c..da5e28f9f 100644 --- a/packages/semver/src/executors/version/utils/get-last-version.ts +++ b/packages/semver/src/executors/version/utils/get-last-version.ts @@ -6,11 +6,11 @@ import type { Observable } from 'rxjs'; export function getLastVersion({ tagPrefix, - includePrerelease = true, + releaseType, preid, }: { tagPrefix: string; - includePrerelease?: boolean; + releaseType?: semver.ReleaseType; preid?: string; }): Observable { return from(gitSemverTags({ tagPrefix }) as Promise).pipe( @@ -25,17 +25,15 @@ export function getLastVersion({ return true; } - if (includePrerelease) { - /* Filter-in everything if preid is not set. */ - if (preid == null) { - return true; - } - - /* Filter-in if preids match. */ - const [versionPreid] = prerelease; - if (versionPreid === preid) { - return true; - } + /* Filter-in everything if preid is not set. */ + if (releaseType && preid == null) { + return true; + } + + /* Filter-in if preids match. */ + const [versionPreid] = prerelease; + if (releaseType && versionPreid === preid) { + return true; } /* Filter-out everything else.*/ diff --git a/packages/semver/src/executors/version/utils/try-bump.ts b/packages/semver/src/executors/version/utils/try-bump.ts index 6fc657e15..7ab1e1dd6 100644 --- a/packages/semver/src/executors/version/utils/try-bump.ts +++ b/packages/semver/src/executors/version/utils/try-bump.ts @@ -46,7 +46,7 @@ export function getProjectVersion({ const lastVersion$ = getLastVersion({ tagPrefix, preid, - includePrerelease: releaseType === 'prerelease', + releaseType, }).pipe( catchError(() => { _logStep({ @@ -263,11 +263,7 @@ export function _manualBump({ preid: string; }) { return defer(() => { - const hasPreid = - ['premajor', 'preminor', 'prepatch', 'prerelease'].includes( - releaseType, - ) && preid !== null; - + const hasPreid = preid !== null; const semverArgs: [string, semver.ReleaseType, ...string[]] = [ since, releaseType as semver.ReleaseType,