Skip to content

Commit 5163c3f

Browse files
Refactored the NormalizedOptions.release type to be more explicit
1 parent 4ba0ba5 commit 5163c3f

2 files changed

Lines changed: 45 additions & 23 deletions

File tree

src/get-new-version.ts

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import * as inquirer from "inquirer";
22
import * as semver from "semver";
33
import { ReleaseType, SemVer } from "semver"; // tslint:disable-line: no-duplicate-imports
4-
import { NormalizedOptions } from "./normalize-options";
5-
import { isPrerelease, isReleaseType, releaseTypes } from "./release-type";
4+
import { BumpRelease, NormalizedOptions } from "./normalize-options";
5+
import { isPrerelease, releaseTypes } from "./release-type";
66

77
type Params = NormalizedOptions & { oldVersion: string };
88
type VersionAndReleaseType = [string, ReleaseType?];
@@ -15,29 +15,32 @@ type VersionAndReleaseType = [string, ReleaseType?];
1515
export async function getNewVersion(params: Params): Promise<VersionAndReleaseType> {
1616
let { release } = params;
1717

18-
if (release === "prompt") {
19-
return promptForNewVersion(params);
20-
}
21-
else if (isReleaseType(release)) {
22-
return [getNextVersion(params), release];
23-
}
24-
else {
25-
let newSemVer = new SemVer(release.version, true);
26-
return [newSemVer.version];
18+
switch (release.type) {
19+
case "prompt":
20+
return promptForNewVersion(params);
21+
22+
case "version":
23+
let newSemVer = new SemVer(release.version, true);
24+
return [newSemVer.version];
25+
26+
default:
27+
return [getNextVersion(params), release.type];
2728
}
2829
}
2930

3031
/**
3132
* Returns the next version number of the specified type.
3233
*/
33-
function getNextVersion({ oldVersion, release, preid }: Params): string {
34+
function getNextVersion({ oldVersion, release }: Params): string {
35+
let bump = release as BumpRelease;
36+
3437
let oldSemVer = new SemVer(oldVersion);
35-
let newSemVer = oldSemVer.inc(release as ReleaseType, preid);
38+
let newSemVer = oldSemVer.inc(bump.type as ReleaseType, bump.preid);
3639

3740
if (
3841
isPrerelease(release) &&
3942
newSemVer.prerelease.length === 2 &&
40-
newSemVer.prerelease[0] === preid &&
43+
newSemVer.prerelease[0] === bump.preid &&
4144
String(newSemVer.prerelease[1]) === "0"
4245
) {
4346
// This is a special case when going from a non-prerelease version to a prerelease version.
@@ -54,10 +57,11 @@ function getNextVersion({ oldVersion, release, preid }: Params): string {
5457
* Returns the next version number for all release types.
5558
*/
5659
function getNextVersions(params: Params): Record<ReleaseType, string> {
60+
let release = params.release as BumpRelease;
5761
let next: Record<string, string> = {};
5862

59-
for (let release of releaseTypes) {
60-
next[release] = getNextVersion({ ...params, release });
63+
for (let type of releaseTypes) {
64+
next[type] = getNextVersion({ ...params, release: { ...release, type }});
6165
}
6266

6367
return next;

src/normalize-options.ts

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,32 @@ interface Interface {
88
[key: string]: unknown;
99
}
1010

11-
type Release = "prompt" | ReleaseType | { version: string };
11+
/**
12+
* A specific version release.
13+
*/
14+
export interface VersionRelease {
15+
type: "version";
16+
version: string;
17+
}
18+
19+
/**
20+
* A bump release (prompted or otherwise), relative to the current version number.
21+
*/
22+
export interface BumpRelease {
23+
type: "prompt" | ReleaseType;
24+
preid: string;
25+
}
26+
27+
/**
28+
* One of the possible Release types.
29+
*/
30+
export type Release = VersionRelease | BumpRelease;
1231

1332
/**
1433
* Normalized and sanitized options
1534
*/
1635
export interface NormalizedOptions {
1736
release: Release;
18-
preid: string;
1937
commit?: {
2038
message: string;
2139
noVerify: boolean;
@@ -43,13 +61,13 @@ export async function normalizeOptions(raw: VersionBumpOptions): Promise<Normali
4361

4462
let release: Release;
4563
if (!raw.release || raw.release === "prompt") {
46-
release = "prompt";
64+
release = { type: "prompt", preid };
4765
}
4866
else if (isReleaseType(raw.release)) {
49-
release = raw.release;
67+
release = { type: raw.release, preid };
5068
}
5169
else {
52-
release = { version: raw.release };
70+
release = { type: "version", version: raw.release };
5371
}
5472

5573
let tag;
@@ -98,9 +116,9 @@ export async function normalizeOptions(raw: VersionBumpOptions): Promise<Normali
98116
ui = { input, output, ...other };
99117
}
100118

101-
if (release === "prompt" && !(ui.input && ui.output)) {
119+
if (release.type === "prompt" && !(ui.input && ui.output)) {
102120
throw new Error(`Cannot prompt for the version number because input or output has been disabled.`);
103121
}
104122

105-
return { release, preid, commit, tag, push, files, cwd, interface: ui };
123+
return { release, commit, tag, push, files, cwd, interface: ui };
106124
}

0 commit comments

Comments
 (0)