11'use strict'
22
3- const chalk = require ( 'chalk' )
3+ /** @type {import('chalk').default } */
4+ const chalk = /** @type {any } */ ( require ( 'chalk' ) )
45const checkpoint = require ( '../checkpoint' )
56const conventionalRecommendedBump = require ( 'conventional-recommended-bump' )
67const figures = require ( 'figures' )
78const fs = require ( 'fs' )
8- const DotGitignore = require ( 'dotgitignore' )
9+ /** @type {import('dotgitignore').default } */
10+ const DotGitignore = /** @type {any } */ ( require ( 'dotgitignore' ) )
911const path = require ( 'path' )
1012const presetLoader = require ( '../preset-loader' )
1113const runLifecycleScript = require ( '../run-lifecycle-script' )
1214const semver = require ( 'semver' )
1315const writeFile = require ( '../write-file' )
1416const { resolveUpdaterObjectFromArgument } = require ( '../updaters' )
17+ /** @type {Object<string, boolean> } */
1518let configsToUpdate = { }
1619
20+ /**
21+ * @typedef {import('semver').ReleaseType } ReleaseType
22+ */
23+
24+ /** @type {(args: RuntimeConfig, version: string) => Promise<string> } */
1725async function Bump ( args , version ) {
1826 // reset the cache of updated config files each
1927 // time we perform the version bump step.
@@ -22,42 +30,71 @@ async function Bump (args, version) {
2230 if ( args . skip . bump ) return version
2331 let newVersion = version
2432 await runLifecycleScript ( args , 'prerelease' )
33+ /** @type {ReleaseType | void | undefined } */
2534 const stdout = await runLifecycleScript ( args , 'prebump' )
2635 if ( stdout && stdout . trim ( ) . length ) args . releaseAs = stdout . trim ( )
2736 const release = await bumpVersion ( args . releaseAs , version , args )
2837 if ( ! args . firstRelease ) {
29- const releaseType = getReleaseType ( args . prerelease , release . releaseType , version )
30- const releaseTypeAsVersion = releaseType === 'pre' + release . releaseType ? semver . valid ( release . releaseType + '-' + args . prerelease + '.0' ) : semver . valid ( releaseType )
31-
32- newVersion = releaseTypeAsVersion || semver . inc ( version , releaseType , args . prerelease )
38+ const releaseType = getReleaseType (
39+ args . prerelease ,
40+ release . releaseType ,
41+ version
42+ )
43+ const releaseTypeAsVersion =
44+ releaseType === 'pre' + release . releaseType
45+ ? semver . valid ( release . releaseType + '-' + args . prerelease + '.0' )
46+ : semver . valid ( releaseType )
47+
48+ newVersion =
49+ releaseTypeAsVersion || semver . inc ( version , releaseType , args . prerelease )
3350 updateConfigs ( args , newVersion )
3451 } else {
35- checkpoint ( args , 'skip version bump on first release' , [ ] , chalk . red ( figures . cross ) )
52+ checkpoint (
53+ args ,
54+ 'skip version bump on first release' ,
55+ [ ] ,
56+ chalk . red ( figures . cross )
57+ )
3658 }
3759 await runLifecycleScript ( args , 'postbump' )
3860 return newVersion
3961}
4062
63+ /**
64+ * @returns {Object<string, boolean> }
65+ */
4166Bump . getUpdatedConfigs = function ( ) {
4267 return configsToUpdate
4368}
4469
70+ /**
71+ *
72+ * @param {string } prerelease
73+ * @param {"major" | "minor" | "patch" } expectedReleaseType
74+ * @param {string } currentVersion
75+ * @returns {ReleaseType }
76+ */
4577function getReleaseType ( prerelease , expectedReleaseType , currentVersion ) {
4678 if ( isString ( prerelease ) ) {
4779 if ( isInPrerelease ( currentVersion ) ) {
48- if ( shouldContinuePrerelease ( currentVersion , expectedReleaseType ) ||
49- getTypePriority ( getCurrentActiveType ( currentVersion ) ) > getTypePriority ( expectedReleaseType )
80+ if (
81+ shouldContinuePrerelease ( currentVersion , expectedReleaseType ) ||
82+ getTypePriority ( getCurrentActiveType ( currentVersion ) ) >
83+ getTypePriority ( expectedReleaseType )
5084 ) {
5185 return 'prerelease'
5286 }
5387 }
5488
55- return 'pre' + expectedReleaseType
89+ return /** @type { ReleaseType } */ ( 'pre' + expectedReleaseType )
5690 } else {
5791 return expectedReleaseType
5892 }
5993}
6094
95+ /**
96+ * @type {(val: unknown) => val is string }
97+ */
6198function isString ( val ) {
6299 return typeof val === 'string'
63100}
@@ -67,14 +104,15 @@ function isString (val) {
67104 * and if it current in-pre-release type is same as expect type,
68105 * it should continue the pre-release with the same type
69106 *
70- * @param version
71- * @param expectType
107+ * @param { string } version
108+ * @param { string } expectType
72109 * @return {boolean }
73110 */
74111function shouldContinuePrerelease ( version , expectType ) {
75112 return getCurrentActiveType ( version ) === expectType
76113}
77114
115+ /** @type {(version: string) => boolean } */
78116function isInPrerelease ( version ) {
79117 return Array . isArray ( semver . prerelease ( version ) )
80118}
@@ -83,9 +121,8 @@ const TypeList = ['major', 'minor', 'patch'].reverse()
83121
84122/**
85123 * extract the in-pre-release type in target version
86- *
87- * @param version
88- * @return {string }
124+ * @param {string } version
125+ * @return {string | void }
89126 */
90127function getCurrentActiveType ( version ) {
91128 const typelist = TypeList
@@ -100,13 +137,13 @@ function getCurrentActiveType (version) {
100137 * calculate the priority of release type,
101138 * major - 2, minor - 1, patch - 0
102139 *
103- * @param type
140+ * @param { string } type
104141 * @return {number }
105142 */
106143function getTypePriority ( type ) {
107144 return TypeList . indexOf ( type )
108145}
109-
146+ /** @type { (releaseAs: ReleaseType, currentVersion: string, args: RuntimeConfig) => Promise<{releaseType: ReleaseType}> } */
110147function bumpVersion ( releaseAs , currentVersion , args ) {
111148 return new Promise ( ( resolve , reject ) => {
112149 if ( releaseAs ) {
@@ -118,16 +155,21 @@ function bumpVersion (releaseAs, currentVersion, args) {
118155 if ( typeof presetOptions === 'object' ) {
119156 if ( semver . lt ( currentVersion , '1.0.0' ) ) presetOptions . preMajor = true
120157 }
121- conventionalRecommendedBump ( {
122- debug : args . verbose && console . info . bind ( console , 'conventional-recommended-bump' ) ,
123- preset : presetOptions ,
124- path : args . path ,
125- tagPrefix : args . tagPrefix ,
126- lernaPackage : args . lernaPackage
127- } , function ( err , release ) {
128- if ( err ) return reject ( err )
129- else return resolve ( release )
130- } )
158+ conventionalRecommendedBump (
159+ {
160+ debug :
161+ args . verbose &&
162+ console . info . bind ( console , 'conventional-recommended-bump' ) ,
163+ preset : presetOptions ,
164+ path : args . path ,
165+ tagPrefix : args . tagPrefix ,
166+ lernaPackage : args . lernaPackage
167+ } ,
168+ function ( err , release ) {
169+ if ( err ) return reject ( err )
170+ else return resolve ( release )
171+ }
172+ )
131173 }
132174 } )
133175}
@@ -159,11 +201,7 @@ function updateConfigs (args, newVersion) {
159201 'bumping version in ' + updater . filename + ' from %s to %s' ,
160202 [ updater . updater . readVersion ( contents ) , realNewVersion ]
161203 )
162- writeFile (
163- args ,
164- configPath ,
165- newContents
166- )
204+ writeFile ( args , configPath , newContents )
167205 // flag any config files that we modify the version # for
168206 // as having been updated.
169207 configsToUpdate [ updater . filename ] = true
0 commit comments