11import * as inquirer from "inquirer" ;
22import * as semver from "semver" ;
33import { ReleaseType , SemVer } from "semver" ; // tslint:disable-line: no-duplicate-imports
4- import { BumpRelease , NormalizedOptions } from "./normalize-options" ;
4+ import { BumpRelease , PromptRelease } from "./normalize-options" ;
5+ import { Operation } from "./operation" ;
56import { isPrerelease , releaseTypes } from "./release-type" ;
67
7- type Params = NormalizedOptions & { oldVersion : string } ;
8- type VersionAndReleaseType = [ string , ReleaseType ?] ;
9-
108/**
11- * Returns the new version number, possibly by prompting the user for it.
12- *
13- * @returns - A tuple containing the new version number and the release type (if any)
9+ * Determines the new version number, possibly by prompting the user for it.
1410 */
15- export async function getNewVersion ( params : Params ) : Promise < VersionAndReleaseType > {
16- let { release } = params ;
11+ export async function getNewVersion ( operation : Operation ) : Promise < Operation > {
12+ let { release } = operation . options ;
13+ let { oldVersion } = operation . state ;
1714
1815 switch ( release . type ) {
1916 case "prompt" :
20- return promptForNewVersion ( params ) ;
17+ return promptForNewVersion ( operation ) ;
2118
2219 case "version" :
2320 let newSemVer = new SemVer ( release . version , true ) ;
24- return [ newSemVer . version ] ;
21+ return operation . update ( {
22+ newVersion : newSemVer . version ,
23+ } ) ;
2524
2625 default :
27- return [ getNextVersion ( params ) , release . type ] ;
26+ return operation . update ( {
27+ release : release . type ,
28+ newVersion : getNextVersion ( oldVersion , release ) ,
29+ } ) ;
2830 }
2931}
3032
3133/**
3234 * Returns the next version number of the specified type.
3335 */
34- function getNextVersion ( { oldVersion, release } : Params ) : string {
35- let bump = release as BumpRelease ;
36-
36+ function getNextVersion ( oldVersion : string , bump : BumpRelease ) : string {
3737 let oldSemVer = new SemVer ( oldVersion ) ;
38- let newSemVer = oldSemVer . inc ( bump . type as ReleaseType , bump . preid ) ;
38+ let newSemVer = oldSemVer . inc ( bump . type , bump . preid ) ;
3939
4040 if (
41- isPrerelease ( release ) &&
41+ isPrerelease ( bump . type ) &&
4242 newSemVer . prerelease . length === 2 &&
4343 newSemVer . prerelease [ 0 ] === bump . preid &&
4444 String ( newSemVer . prerelease [ 1 ] ) === "0"
@@ -56,12 +56,11 @@ function getNextVersion({ oldVersion, release }: Params): string {
5656/**
5757 * Returns the next version number for all release types.
5858 */
59- function getNextVersions ( params : Params ) : Record < ReleaseType , string > {
60- let release = params . release as BumpRelease ;
59+ function getNextVersions ( oldVersion : string , preid : string ) : Record < ReleaseType , string > {
6160 let next : Record < string , string > = { } ;
6261
6362 for ( let type of releaseTypes ) {
64- next [ type ] = getNextVersion ( { ... params , release : { ... release , type } } ) ;
63+ next [ type ] = getNextVersion ( oldVersion , { type , preid } ) ;
6564 }
6665
6766 return next ;
@@ -72,10 +71,12 @@ function getNextVersions(params: Params): Record<ReleaseType, string> {
7271 *
7372 * @returns - A tuple containing the new version number and the release type (if any)
7473 */
75- async function promptForNewVersion ( params : Params ) : Promise < VersionAndReleaseType > {
76- let { oldVersion, interface : ui } = params ;
77- let next = getNextVersions ( params ) ;
78- let prompts = inquirer . createPromptModule ( ui as inquirer . StreamOptions ) ;
74+ async function promptForNewVersion ( operation : Operation ) : Promise < Operation > {
75+ let { oldVersion, oldVersionSource } = operation . state ;
76+ let release = operation . options . release as PromptRelease ;
77+ let prompts = inquirer . createPromptModule ( operation . options . interface as inquirer . StreamOptions ) ;
78+
79+ let next = getNextVersions ( oldVersion , release . preid ) ;
7980
8081 let answers : {
8182 release : ReleaseType | "none" | "custom" ;
@@ -86,7 +87,7 @@ async function promptForNewVersion(params: Params): Promise<VersionAndReleaseTyp
8687 {
8788 type : "list" ,
8889 name : "release" ,
89- message : `\nThe current version is ${ oldVersion } \nHow would you like to bump it?` ,
90+ message : `\nThe current version in ${ oldVersionSource } is ${ oldVersion } \nHow would you like to bump it?` ,
9091 default : "patch" ,
9192 pageSize : 10 ,
9293 choices : [
@@ -107,7 +108,7 @@ async function promptForNewVersion(params: Params): Promise<VersionAndReleaseTyp
107108 name : "newVersion" ,
108109 message : "Enter the new version number:" ,
109110 default : oldVersion ,
110- when : ( { release } ) => release === "custom" ,
111+ when : ( previousAnswer ) => previousAnswer . release === "custom" ,
111112 filter : semver . clean ,
112113 validate : ( newVersion : string ) => {
113114 return semver . valid ( newVersion ) ? true : "That's not a valid version number" ;
@@ -117,12 +118,15 @@ async function promptForNewVersion(params: Params): Promise<VersionAndReleaseTyp
117118
118119 switch ( answers . release ) {
119120 case "none" :
120- return [ oldVersion ] ;
121+ return operation . update ( { newVersion : oldVersion } ) ;
121122
122123 case "custom" :
123- return [ answers . newVersion ! ] ;
124+ return operation . update ( { newVersion : answers . newVersion ! } ) ;
124125
125126 default :
126- return [ next [ answers . release ] , answers . release ] ;
127+ return operation . update ( {
128+ release : answers . release ,
129+ newVersion : next [ answers . release ] ,
130+ } ) ;
127131 }
128132}
0 commit comments