Skip to content

Commit 143c9d8

Browse files
committed
Properly parse prefix versions when comparing and fail when bumping a non .0 version.
1 parent 4b0f308 commit 143c9d8

File tree

2 files changed

+52
-2
lines changed

2 files changed

+52
-2
lines changed

__tests__/main.test.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,16 @@ test('should bump version if same tag is available', () => {
1414
expect(nextVersion).toBe('0.0.1-preview.1');
1515
});
1616

17+
test('should bump version if same tag is available but prefixed', () => {
18+
const nextVersion = getNextVersion('v0.0.1-preview.0', ['0.0.1-preview.0']);
19+
expect(nextVersion).toBe('0.0.1-preview.1');
20+
});
21+
22+
test('should bump version if same tag is available but not prefixed', () => {
23+
const nextVersion = getNextVersion('0.0.1-preview.0', ['v0.0.1-preview.0']);
24+
expect(nextVersion).toBe('0.0.1-preview.1');
25+
});
26+
1727
test('should use bump latest pre-release tag if multiple tags are available', async () => {
1828
const nextVersion = getNextVersion('0.0.1-preview.0', ['0.0.1-preview.1', '0.0.1-preview.0']);
1929
expect(nextVersion).toBe('0.0.1-preview.2');
@@ -62,3 +72,24 @@ test('should bump final version if tag already exists and ends with 0', () => {
6272
]);
6373
expect(nextVersion).toBe('0.2.1');
6474
});
75+
76+
test('should throw an error if final version is already tagged and does not end with 0', () => {
77+
const nextVersion = () => getNextVersion('0.2.1', [
78+
'0.2.1',
79+
]);
80+
expect(nextVersion).toThrow(Error);
81+
});
82+
83+
test('should throw an error if pre-release version is already tagged and does not end with 0', () => {
84+
const nextVersion = () => getNextVersion('0.2.0-preview.1', [
85+
'0.2.0-preview.1',
86+
]);
87+
expect(nextVersion).toThrow(Error);
88+
});
89+
90+
test('should throw an error for wrong versions', () => {
91+
expect(() => getNextVersion('xyz', [])).toThrow(Error);
92+
expect(() => getNextVersion('1.0', [])).toThrow(Error);
93+
expect(() => getNextVersion('~1.0.0', [])).toThrow(Error);
94+
});
95+

src/main.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,29 @@ export function getNextVersion(version: string, tags: string[]): string {
2222
tags = rsort(tags);
2323

2424
if (semVer === null || semVer.prerelease.length === 1) {
25-
throw new Error(`Invalid semver - ${version}`);
25+
throw new Error(`Invalid semver: ${version}`);
2626
}
2727

2828
let nextVer: SemVer | null = null;
2929

3030
if (semVer.prerelease.length === 0) {
3131
if (tags.includes(semVer.version)) {
32+
if (semVer.patch > 0) {
33+
throw new Error(
34+
`Version in package.json is ${version} but tag already exists. Set patch to 0 to enable auto-increment.`,
35+
);
36+
}
3237
nextVer = new SemVer(tags[0]).inc('patch');
3338
}
3439
} else {
3540
for (const tag of tags) {
36-
if (tag.startsWith(semVer.version.substring(0, semVer.version.lastIndexOf('.') + 1))) {
41+
const tagSemVer = new SemVer(tag);
42+
if (isSameRelease(tagSemVer, semVer)) {
43+
if (preReleaseNumber(semVer) > 0) {
44+
throw new Error(
45+
`Version in package.json is ${version} but tag already exists. Set pre-release to 0 to enable auto-increment.`,
46+
);
47+
}
3748
nextVer = new SemVer(tag).inc('prerelease');
3849
break;
3950
}
@@ -47,6 +58,14 @@ export function getNextVersion(version: string, tags: string[]): string {
4758
return nextVer.version;
4859
}
4960

61+
function isSameRelease(v1: SemVer, v2: SemVer): boolean {
62+
return v1.major === v2.major && v1.minor === v2.minor && v1.patch === v2.patch;
63+
}
64+
65+
function preReleaseNumber(v: SemVer): number {
66+
return v.prerelease[1] as number;
67+
}
68+
5069
async function run(): Promise<void> {
5170
try {
5271
const version = JSON.parse(readFileSync('package.json', 'utf8')).version;

0 commit comments

Comments
 (0)