diff --git a/.gitignore b/.gitignore index 2423093fc..6c9a86780 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,15 @@ __pycache__ package-lock.json debug.sh .idea/ + +# Devenv +.devenv* +devenv.local.nix +devenv.lock +devenv.nix +devenv.yaml +.envrc + +# direnv +.direnv + diff --git a/docs/customizing.md b/docs/customizing.md index 98c796789..e5842e99f 100644 --- a/docs/customizing.md +++ b/docs/customizing.md @@ -44,7 +44,7 @@ version given a list of parsed commits. | `always-bump-minor` | Always bump minor version | | | `always-bump-major` | Always bump major version | | `service-pack` | Designed for Java backport fixes. Uses Maven's specification for service pack versions (e.g. 1.2.3-sp.1) | -| `prerelease` | Bumping prerelease number (eg. 1.2.0-beta01 to 1.2.0-beta02) or if prerelease type is set, using that in the prerelease part (eg. 1.2.1 to 1.3.0-beta) | +| `prerelease` | Bumping prerelease number (eg. 1.2.0-beta01 to 1.2.0-beta02) or if prerelease type is set, using that in the prerelease part (eg. 1.2.1 to 1.3.0-beta). Works together with the "prerelease" settings from [manifest-releaser](/docs/manifest-releaser.md) (see for more infos) - a prerelease version number will only be created, if the prerelease setting is set to true (false by default). | ### Adding additional versioning strategy types diff --git a/docs/manifest-releaser.md b/docs/manifest-releaser.md index 0bf9c0880..e6944c31a 100644 --- a/docs/manifest-releaser.md +++ b/docs/manifest-releaser.md @@ -197,6 +197,10 @@ defaults (those are documented in comments) // when `manifest-release` creates GitHub Releases per package, create // those as "Prerelease" releases that have pre-major or prerelease versions. // absence defaults to false and all versions are fully Published. + // Works together with the "prerelease" versioning strategy, which creates a + // prerelease-version (like 1.0.0-alpha.1) only if this setting is set to true. + // This allows to create prerelease-versions on conditions (e.g. publish them only + // on release-candidate branches) "prerelease": true // Skip creating GitHub Releases diff --git a/src/versioning-strategies/prerelease.ts b/src/versioning-strategies/prerelease.ts index 1fcbadf96..977cbd9dd 100644 --- a/src/versioning-strategies/prerelease.ts +++ b/src/versioning-strategies/prerelease.ts @@ -28,6 +28,7 @@ import { interface PrereleaseVersioningStrategyOptions extends DefaultVersioningStrategyOptions { prereleaseType?: string; + prerelease?: boolean; } /** @@ -176,10 +177,12 @@ class PrereleaseMajorVersionUpdate extends AbstractPrereleaseVersionUpdate { */ export class PrereleaseVersioningStrategy extends DefaultVersioningStrategy { readonly prereleaseType?: string; + readonly prerelease: boolean; constructor(options: PrereleaseVersioningStrategyOptions = {}) { super(options); this.prereleaseType = options.prereleaseType; + this.prerelease = options.prerelease === true; } determineReleaseType( @@ -207,19 +210,40 @@ export class PrereleaseVersioningStrategy extends DefaultVersioningStrategy { } } + let bumpedVersionUpdater: VersionUpdater; if (breaking > 0) { if (version.isPreMajor && this.bumpMinorPreMajor) { - return new PrereleaseMinorVersionUpdate(this.prereleaseType); + bumpedVersionUpdater = new PrereleaseMinorVersionUpdate( + this.prereleaseType + ); } else { - return new PrereleaseMajorVersionUpdate(this.prereleaseType); + bumpedVersionUpdater = new PrereleaseMajorVersionUpdate( + this.prereleaseType + ); } } else if (features > 0) { if (version.isPreMajor && this.bumpPatchForMinorPreMajor) { - return new PrereleasePatchVersionUpdate(this.prereleaseType); + bumpedVersionUpdater = new PrereleasePatchVersionUpdate( + this.prereleaseType + ); } else { - return new PrereleaseMinorVersionUpdate(this.prereleaseType); + bumpedVersionUpdater = new PrereleaseMinorVersionUpdate( + this.prereleaseType + ); } + } else { + bumpedVersionUpdater = new PrereleasePatchVersionUpdate( + this.prereleaseType + ); + } + if (!this.prerelease) { + const bumpedVersion: Version = bumpedVersionUpdater.bump(version); + return new CustomVersionUpdate( + Version.parse( + `${bumpedVersion.major}.${bumpedVersion.minor}.${bumpedVersion.patch}` + ).toString() + ); } - return new PrereleasePatchVersionUpdate(this.prereleaseType); + return bumpedVersionUpdater; } } diff --git a/test/plugins/node-workspace.ts b/test/plugins/node-workspace.ts index 2bff93f73..197232f64 100644 --- a/test/plugins/node-workspace.ts +++ b/test/plugins/node-workspace.ts @@ -353,6 +353,7 @@ describe('NodeWorkspace plugin', () => { path: 'node1', packageName: '@here/pkgA', versioningStrategy: new PrereleaseVersioningStrategy({ + prerelease: true, prereleaseType: 'beta', }), }), @@ -362,6 +363,7 @@ describe('NodeWorkspace plugin', () => { path: 'node2', packageName: '@here/pkgB', versioningStrategy: new PrereleaseVersioningStrategy({ + prerelease: true, prereleaseType: 'beta', }), }), @@ -371,6 +373,7 @@ describe('NodeWorkspace plugin', () => { path: 'node3', packageName: '@here/pkgC', versioningStrategy: new PrereleaseVersioningStrategy({ + prerelease: true, prereleaseType: 'beta', }), }), @@ -380,6 +383,7 @@ describe('NodeWorkspace plugin', () => { path: 'node4', packageName: '@here/pkgD', versioningStrategy: new PrereleaseVersioningStrategy({ + prerelease: true, prereleaseType: 'beta', }), }), @@ -389,6 +393,7 @@ describe('NodeWorkspace plugin', () => { path: 'node5', packageName: '@here/pkgE', versioningStrategy: new PrereleaseVersioningStrategy({ + prerelease: true, prereleaseType: 'beta', }), }), diff --git a/test/versioning-strategies/prerelease.ts b/test/versioning-strategies/prerelease.ts index 41b1a6f30..d9150ef16 100644 --- a/test/versioning-strategies/prerelease.ts +++ b/test/versioning-strategies/prerelease.ts @@ -68,7 +68,7 @@ describe('PrereleaseVersioningStrategy', () => { for (const old in expectedBumps) { const expected = expectedBumps[old]; it(`can bump ${old} to ${expected}`, async () => { - const strategy = new PrereleaseVersioningStrategy(); + const strategy = new PrereleaseVersioningStrategy({prerelease: true}); const oldVersion = Version.parse(old); const newVersion = await strategy.bump(oldVersion, commits); expect(newVersion.toString()).to.equal(expected); @@ -76,6 +76,7 @@ describe('PrereleaseVersioningStrategy', () => { } it('can bump a minor pre major for breaking change', async () => { const strategy = new PrereleaseVersioningStrategy({ + prerelease: true, bumpMinorPreMajor: true, }); const oldVersion = Version.parse('0.1.2'); @@ -109,6 +110,7 @@ describe('PrereleaseVersioningStrategy', () => { const expected = expectedBumps[old]; it(`can bump ${old} to ${expected}`, async () => { const strategy = new PrereleaseVersioningStrategy({ + prerelease: true, prereleaseType: 'beta', }); const oldVersion = Version.parse(old); @@ -118,6 +120,7 @@ describe('PrereleaseVersioningStrategy', () => { } it('can bump a minor pre major for breaking change', async () => { const strategy = new PrereleaseVersioningStrategy({ + prerelease: true, bumpMinorPreMajor: true, prereleaseType: 'beta', }); @@ -126,6 +129,27 @@ describe('PrereleaseVersioningStrategy', () => { expect(newVersion.toString()).to.equal('0.2.0-beta'); }); }); + describe('without prerelease property', () => { + const expectedBumps: Record = { + '1.2.3': '2.0.0', + '1.0.0-beta01': '1.0.0', + '1.1.0-beta01': '2.0.0', + '1.3.0-alpha': '2.0.0', + '1.3.0-alpha.1': '2.0.0', + }; + for (const old in expectedBumps) { + const expected = expectedBumps[old]; + it(`can bump ${old} to ${expected}`, async () => { + const strategy = new PrereleaseVersioningStrategy({ + prerelease: false, + prereleaseType: 'beta', + }); + const oldVersion = Version.parse(old); + const newVersion = await strategy.bump(oldVersion, commits); + expect(newVersion.toString()).to.equal(expected); + }); + } + }); }); describe('with a feature', () => { @@ -177,7 +201,7 @@ describe('PrereleaseVersioningStrategy', () => { for (const old in expectedBumps) { const expected = expectedBumps[old]; it(`can bump ${old} to ${expected}`, async () => { - const strategy = new PrereleaseVersioningStrategy(); + const strategy = new PrereleaseVersioningStrategy({prerelease: true}); const oldVersion = Version.parse(old); const newVersion = await strategy.bump(oldVersion, commits); expect(newVersion.toString()).to.equal(expected); @@ -185,6 +209,7 @@ describe('PrereleaseVersioningStrategy', () => { } it('can bump a patch pre-major', async () => { const strategy = new PrereleaseVersioningStrategy({ + prerelease: true, bumpPatchForMinorPreMajor: true, }); const oldVersion = Version.parse('0.1.2'); @@ -218,6 +243,7 @@ describe('PrereleaseVersioningStrategy', () => { const expected = expectedBumps[old]; it(`can bump ${old} to ${expected}`, async () => { const strategy = new PrereleaseVersioningStrategy({ + prerelease: true, prereleaseType: 'beta', }); const oldVersion = Version.parse(old); @@ -227,6 +253,7 @@ describe('PrereleaseVersioningStrategy', () => { } it('can bump a patch pre-major', async () => { const strategy = new PrereleaseVersioningStrategy({ + prerelease: true, bumpPatchForMinorPreMajor: true, prereleaseType: 'beta', }); @@ -235,6 +262,27 @@ describe('PrereleaseVersioningStrategy', () => { expect(newVersion.toString()).to.equal('0.1.3-beta'); }); }); + describe('without prerelease property', () => { + const expectedBumps: Record = { + '1.2.3': '1.3.0', + '1.0.0-beta01': '1.0.0', + '1.1.0-beta01': '1.1.0', + '1.3.0-alpha': '1.3.0', + '1.3.0-alpha.1': '1.3.0', + }; + for (const old in expectedBumps) { + const expected = expectedBumps[old]; + it(`can bump ${old} to ${expected}`, async () => { + const strategy = new PrereleaseVersioningStrategy({ + prerelease: false, + prereleaseType: 'beta', + }); + const oldVersion = Version.parse(old); + const newVersion = await strategy.bump(oldVersion, commits); + expect(newVersion.toString()).to.equal(expected); + }); + } + }); }); describe('with a fix', () => { @@ -277,7 +325,7 @@ describe('PrereleaseVersioningStrategy', () => { for (const old in expectedBumps) { const expected = expectedBumps[old]; it(`can bump ${old} to ${expected}`, async () => { - const strategy = new PrereleaseVersioningStrategy(); + const strategy = new PrereleaseVersioningStrategy({prerelease: true}); const oldVersion = Version.parse(old); const newVersion = await strategy.bump(oldVersion, commits); expect(newVersion.toString()).to.equal(expected); @@ -307,6 +355,28 @@ describe('PrereleaseVersioningStrategy', () => { const expected = expectedBumps[old]; it(`can bump ${old} to ${expected}`, async () => { const strategy = new PrereleaseVersioningStrategy({ + prerelease: true, + prereleaseType: 'beta', + }); + const oldVersion = Version.parse(old); + const newVersion = await strategy.bump(oldVersion, commits); + expect(newVersion.toString()).to.equal(expected); + }); + } + }); + describe('without prerelease property', () => { + const expectedBumps: Record = { + '1.2.3': '1.2.4', + '1.0.0-beta01': '1.0.0', + '1.1.0-beta01': '1.1.0', + '1.2.4-alpha': '1.2.4', + '1.2.4-alpha.1': '1.2.4', + }; + for (const old in expectedBumps) { + const expected = expectedBumps[old]; + it(`can bump ${old} to ${expected}`, async () => { + const strategy = new PrereleaseVersioningStrategy({ + prerelease: false, prereleaseType: 'beta', }); const oldVersion = Version.parse(old); @@ -354,7 +424,7 @@ describe('PrereleaseVersioningStrategy', () => { breaking: false, }, ]; - const strategy = new PrereleaseVersioningStrategy(); + const strategy = new PrereleaseVersioningStrategy({prerelease: true}); const oldVersion = Version.parse('1.2.3'); const newVersion = await strategy.bump(oldVersion, commits); expect(newVersion.toString()).to.equal('3.1.2'); @@ -406,7 +476,7 @@ describe('PrereleaseVersioningStrategy', () => { breaking: true, }, ]; - const strategy = new PrereleaseVersioningStrategy(); + const strategy = new PrereleaseVersioningStrategy({prerelease: true}); const oldVersion = Version.parse('1.2.3'); const newVersion = await strategy.bump(oldVersion, commits); expect(newVersion.toString()).to.equal('3.1.2');