Skip to content

Commit 6521637

Browse files
committed
fix(versioning-strategy): create a stable version if prerelease is false
1 parent 422df5a commit 6521637

File tree

4 files changed

+121
-10
lines changed

4 files changed

+121
-10
lines changed

.gitignore

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,15 @@ __pycache__
88
package-lock.json
99
debug.sh
1010
.idea/
11+
12+
# Devenv
13+
.devenv*
14+
devenv.local.nix
15+
devenv.lock
16+
devenv.nix
17+
devenv.yaml
18+
.envrc
19+
20+
# direnv
21+
.direnv
22+

src/versioning-strategies/prerelease.ts

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import {
2828
interface PrereleaseVersioningStrategyOptions
2929
extends DefaultVersioningStrategyOptions {
3030
prereleaseType?: string;
31+
prerelease?: boolean;
3132
}
3233

3334
/**
@@ -176,10 +177,12 @@ class PrereleaseMajorVersionUpdate extends AbstractPrereleaseVersionUpdate {
176177
*/
177178
export class PrereleaseVersioningStrategy extends DefaultVersioningStrategy {
178179
readonly prereleaseType?: string;
180+
readonly prerelease: boolean;
179181

180182
constructor(options: PrereleaseVersioningStrategyOptions = {}) {
181183
super(options);
182184
this.prereleaseType = options.prereleaseType;
185+
this.prerelease = options.prerelease === true;
183186
}
184187

185188
determineReleaseType(
@@ -207,19 +210,40 @@ export class PrereleaseVersioningStrategy extends DefaultVersioningStrategy {
207210
}
208211
}
209212

213+
let bumpedVersionUpdater: VersionUpdater;
210214
if (breaking > 0) {
211215
if (version.isPreMajor && this.bumpMinorPreMajor) {
212-
return new PrereleaseMinorVersionUpdate(this.prereleaseType);
216+
bumpedVersionUpdater = new PrereleaseMinorVersionUpdate(
217+
this.prereleaseType
218+
);
213219
} else {
214-
return new PrereleaseMajorVersionUpdate(this.prereleaseType);
220+
bumpedVersionUpdater = new PrereleaseMajorVersionUpdate(
221+
this.prereleaseType
222+
);
215223
}
216224
} else if (features > 0) {
217225
if (version.isPreMajor && this.bumpPatchForMinorPreMajor) {
218-
return new PrereleasePatchVersionUpdate(this.prereleaseType);
226+
bumpedVersionUpdater = new PrereleasePatchVersionUpdate(
227+
this.prereleaseType
228+
);
219229
} else {
220-
return new PrereleaseMinorVersionUpdate(this.prereleaseType);
230+
bumpedVersionUpdater = new PrereleaseMinorVersionUpdate(
231+
this.prereleaseType
232+
);
221233
}
234+
} else {
235+
bumpedVersionUpdater = new PrereleasePatchVersionUpdate(
236+
this.prereleaseType
237+
);
238+
}
239+
if (!this.prerelease) {
240+
const bumpedVersion: Version = bumpedVersionUpdater.bump(version);
241+
return new CustomVersionUpdate(
242+
Version.parse(
243+
`${bumpedVersion.major}.${bumpedVersion.minor}.${bumpedVersion.patch}`
244+
).toString()
245+
);
222246
}
223-
return new PrereleasePatchVersionUpdate(this.prereleaseType);
247+
return bumpedVersionUpdater;
224248
}
225249
}

test/plugins/node-workspace.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,7 @@ describe('NodeWorkspace plugin', () => {
353353
path: 'node1',
354354
packageName: '@here/pkgA',
355355
versioningStrategy: new PrereleaseVersioningStrategy({
356+
prerelease: true,
356357
prereleaseType: 'beta',
357358
}),
358359
}),
@@ -362,6 +363,7 @@ describe('NodeWorkspace plugin', () => {
362363
path: 'node2',
363364
packageName: '@here/pkgB',
364365
versioningStrategy: new PrereleaseVersioningStrategy({
366+
prerelease: true,
365367
prereleaseType: 'beta',
366368
}),
367369
}),
@@ -371,6 +373,7 @@ describe('NodeWorkspace plugin', () => {
371373
path: 'node3',
372374
packageName: '@here/pkgC',
373375
versioningStrategy: new PrereleaseVersioningStrategy({
376+
prerelease: true,
374377
prereleaseType: 'beta',
375378
}),
376379
}),
@@ -380,6 +383,7 @@ describe('NodeWorkspace plugin', () => {
380383
path: 'node4',
381384
packageName: '@here/pkgD',
382385
versioningStrategy: new PrereleaseVersioningStrategy({
386+
prerelease: true,
383387
prereleaseType: 'beta',
384388
}),
385389
}),
@@ -389,6 +393,7 @@ describe('NodeWorkspace plugin', () => {
389393
path: 'node5',
390394
packageName: '@here/pkgE',
391395
versioningStrategy: new PrereleaseVersioningStrategy({
396+
prerelease: true,
392397
prereleaseType: 'beta',
393398
}),
394399
}),

test/versioning-strategies/prerelease.ts

Lines changed: 75 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,15 @@ describe('PrereleaseVersioningStrategy', () => {
6868
for (const old in expectedBumps) {
6969
const expected = expectedBumps[old];
7070
it(`can bump ${old} to ${expected}`, async () => {
71-
const strategy = new PrereleaseVersioningStrategy();
71+
const strategy = new PrereleaseVersioningStrategy({prerelease: true});
7272
const oldVersion = Version.parse(old);
7373
const newVersion = await strategy.bump(oldVersion, commits);
7474
expect(newVersion.toString()).to.equal(expected);
7575
});
7676
}
7777
it('can bump a minor pre major for breaking change', async () => {
7878
const strategy = new PrereleaseVersioningStrategy({
79+
prerelease: true,
7980
bumpMinorPreMajor: true,
8081
});
8182
const oldVersion = Version.parse('0.1.2');
@@ -109,6 +110,7 @@ describe('PrereleaseVersioningStrategy', () => {
109110
const expected = expectedBumps[old];
110111
it(`can bump ${old} to ${expected}`, async () => {
111112
const strategy = new PrereleaseVersioningStrategy({
113+
prerelease: true,
112114
prereleaseType: 'beta',
113115
});
114116
const oldVersion = Version.parse(old);
@@ -118,6 +120,7 @@ describe('PrereleaseVersioningStrategy', () => {
118120
}
119121
it('can bump a minor pre major for breaking change', async () => {
120122
const strategy = new PrereleaseVersioningStrategy({
123+
prerelease: true,
121124
bumpMinorPreMajor: true,
122125
prereleaseType: 'beta',
123126
});
@@ -126,6 +129,27 @@ describe('PrereleaseVersioningStrategy', () => {
126129
expect(newVersion.toString()).to.equal('0.2.0-beta');
127130
});
128131
});
132+
describe('without prerelease property', () => {
133+
const expectedBumps: Record<string, string> = {
134+
'1.2.3': '2.0.0',
135+
'1.0.0-beta01': '1.0.0',
136+
'1.1.0-beta01': '2.0.0',
137+
'1.3.0-alpha': '2.0.0',
138+
'1.3.0-alpha.1': '2.0.0',
139+
};
140+
for (const old in expectedBumps) {
141+
const expected = expectedBumps[old];
142+
it(`can bump ${old} to ${expected}`, async () => {
143+
const strategy = new PrereleaseVersioningStrategy({
144+
prerelease: false,
145+
prereleaseType: 'beta',
146+
});
147+
const oldVersion = Version.parse(old);
148+
const newVersion = await strategy.bump(oldVersion, commits);
149+
expect(newVersion.toString()).to.equal(expected);
150+
});
151+
}
152+
});
129153
});
130154

131155
describe('with a feature', () => {
@@ -177,14 +201,15 @@ describe('PrereleaseVersioningStrategy', () => {
177201
for (const old in expectedBumps) {
178202
const expected = expectedBumps[old];
179203
it(`can bump ${old} to ${expected}`, async () => {
180-
const strategy = new PrereleaseVersioningStrategy();
204+
const strategy = new PrereleaseVersioningStrategy({prerelease: true});
181205
const oldVersion = Version.parse(old);
182206
const newVersion = await strategy.bump(oldVersion, commits);
183207
expect(newVersion.toString()).to.equal(expected);
184208
});
185209
}
186210
it('can bump a patch pre-major', async () => {
187211
const strategy = new PrereleaseVersioningStrategy({
212+
prerelease: true,
188213
bumpPatchForMinorPreMajor: true,
189214
});
190215
const oldVersion = Version.parse('0.1.2');
@@ -218,6 +243,7 @@ describe('PrereleaseVersioningStrategy', () => {
218243
const expected = expectedBumps[old];
219244
it(`can bump ${old} to ${expected}`, async () => {
220245
const strategy = new PrereleaseVersioningStrategy({
246+
prerelease: true,
221247
prereleaseType: 'beta',
222248
});
223249
const oldVersion = Version.parse(old);
@@ -227,6 +253,7 @@ describe('PrereleaseVersioningStrategy', () => {
227253
}
228254
it('can bump a patch pre-major', async () => {
229255
const strategy = new PrereleaseVersioningStrategy({
256+
prerelease: true,
230257
bumpPatchForMinorPreMajor: true,
231258
prereleaseType: 'beta',
232259
});
@@ -235,6 +262,27 @@ describe('PrereleaseVersioningStrategy', () => {
235262
expect(newVersion.toString()).to.equal('0.1.3-beta');
236263
});
237264
});
265+
describe('without prerelease property', () => {
266+
const expectedBumps: Record<string, string> = {
267+
'1.2.3': '1.3.0',
268+
'1.0.0-beta01': '1.0.0',
269+
'1.1.0-beta01': '1.1.0',
270+
'1.3.0-alpha': '1.3.0',
271+
'1.3.0-alpha.1': '1.3.0',
272+
};
273+
for (const old in expectedBumps) {
274+
const expected = expectedBumps[old];
275+
it(`can bump ${old} to ${expected}`, async () => {
276+
const strategy = new PrereleaseVersioningStrategy({
277+
prerelease: false,
278+
prereleaseType: 'beta',
279+
});
280+
const oldVersion = Version.parse(old);
281+
const newVersion = await strategy.bump(oldVersion, commits);
282+
expect(newVersion.toString()).to.equal(expected);
283+
});
284+
}
285+
});
238286
});
239287

240288
describe('with a fix', () => {
@@ -277,7 +325,7 @@ describe('PrereleaseVersioningStrategy', () => {
277325
for (const old in expectedBumps) {
278326
const expected = expectedBumps[old];
279327
it(`can bump ${old} to ${expected}`, async () => {
280-
const strategy = new PrereleaseVersioningStrategy();
328+
const strategy = new PrereleaseVersioningStrategy({prerelease: true});
281329
const oldVersion = Version.parse(old);
282330
const newVersion = await strategy.bump(oldVersion, commits);
283331
expect(newVersion.toString()).to.equal(expected);
@@ -307,6 +355,28 @@ describe('PrereleaseVersioningStrategy', () => {
307355
const expected = expectedBumps[old];
308356
it(`can bump ${old} to ${expected}`, async () => {
309357
const strategy = new PrereleaseVersioningStrategy({
358+
prerelease: true,
359+
prereleaseType: 'beta',
360+
});
361+
const oldVersion = Version.parse(old);
362+
const newVersion = await strategy.bump(oldVersion, commits);
363+
expect(newVersion.toString()).to.equal(expected);
364+
});
365+
}
366+
});
367+
describe('without prerelease property', () => {
368+
const expectedBumps: Record<string, string> = {
369+
'1.2.3': '1.2.4',
370+
'1.0.0-beta01': '1.0.0',
371+
'1.1.0-beta01': '1.1.0',
372+
'1.2.4-alpha': '1.2.4',
373+
'1.2.4-alpha.1': '1.2.4',
374+
};
375+
for (const old in expectedBumps) {
376+
const expected = expectedBumps[old];
377+
it(`can bump ${old} to ${expected}`, async () => {
378+
const strategy = new PrereleaseVersioningStrategy({
379+
prerelease: false,
310380
prereleaseType: 'beta',
311381
});
312382
const oldVersion = Version.parse(old);
@@ -354,7 +424,7 @@ describe('PrereleaseVersioningStrategy', () => {
354424
breaking: false,
355425
},
356426
];
357-
const strategy = new PrereleaseVersioningStrategy();
427+
const strategy = new PrereleaseVersioningStrategy({prerelease: true});
358428
const oldVersion = Version.parse('1.2.3');
359429
const newVersion = await strategy.bump(oldVersion, commits);
360430
expect(newVersion.toString()).to.equal('3.1.2');
@@ -406,7 +476,7 @@ describe('PrereleaseVersioningStrategy', () => {
406476
breaking: true,
407477
},
408478
];
409-
const strategy = new PrereleaseVersioningStrategy();
479+
const strategy = new PrereleaseVersioningStrategy({prerelease: true});
410480
const oldVersion = Version.parse('1.2.3');
411481
const newVersion = await strategy.bump(oldVersion, commits);
412482
expect(newVersion.toString()).to.equal('3.1.2');

0 commit comments

Comments
 (0)