@@ -3,6 +3,8 @@ const semver = require("semver");
3
3
const { isObject, isEqual, transform } = require ( "lodash" ) ;
4
4
const recognizeFormat = require ( "./recognizeFormat" ) ;
5
5
const getManifest = require ( "./getManifest" ) ;
6
+ const { getHighestVersion, getLatestVersion } = require ( "./utils" ) ;
7
+ const { getTags } = require ( "./git" ) ;
6
8
const debug = require ( "debug" ) ( "msr:updateDeps" ) ;
7
9
8
10
/**
@@ -24,13 +26,58 @@ const getNextVersion = (pkg) => {
24
26
* Resolve next package version on prereleases.
25
27
*
26
28
* @param {Package } pkg Package object.
29
+ * @param {Array<string> } tags Override list of tags from specific pkg and branch.
27
30
* @returns {string|undefined } Next pkg version.
28
31
* @internal
29
32
*/
30
- const getNextPreVersion = ( pkg ) => {
33
+ const getNextPreVersion = ( pkg , tags ) => {
34
+ const tagFilters = [ pkg . _preRelease ] ;
31
35
const lastVersion = pkg . _lastRelease && pkg . _lastRelease . version ;
36
+ const version = `1.0.0-${ pkg . _preRelease } .1` ;
32
37
33
- return lastVersion ? semver . inc ( lastVersion , "prerelease" , pkg . _preRelease ) : `1.0.0-${ pkg . _preRelease } .1` ;
38
+ if ( pkg . name ) tagFilters . push ( pkg . name ) ;
39
+ if ( ! tags || ! tags . length ) tags = getTags ( pkg . _branch , { cwd : "." } , tagFilters ) ;
40
+
41
+ if ( lastVersion ) {
42
+ const { prerelease } = semver . parse ( lastVersion ) ;
43
+ const lastPreRelTag = prerelease [ 0 ] || null ;
44
+
45
+ // If there was a change in the prerelease tag (e.g. dev to rc), start semver from scratch with the new prerelease tag
46
+ if ( lastPreRelTag && lastPreRelTag !== pkg . _preRelease ) {
47
+ return version ;
48
+ }
49
+
50
+ return _nextPreHighestVersion ( tags , lastVersion , pkg . _nextType , pkg . _preRelease ) ;
51
+ }
52
+
53
+ return version ;
54
+ } ;
55
+
56
+ /**
57
+ * Resolve next prerelease highest version from tags or major/minor/patch.
58
+ *
59
+ * @param {Array } tags List of all released tags from package.
60
+ * @param {string } lastVersion Last package version released.
61
+ * @param {string } pkgNextType Next type evaluated for the next package type.
62
+ * @param {string } pkgPreRelease Package prerelease suffix.
63
+ * @returns {string|undefined } Next pkg version.
64
+ * @internal
65
+ */
66
+ const _nextPreHighestVersion = ( tags , lastVersion , pkgNextType , pkgPreRelease ) => {
67
+ if ( semver . prerelease ( lastVersion ) ) {
68
+ const latestVerTags = getLatestVersion ( tags , { withPrerelease : true } ) ;
69
+ // Bump the latest version from tags if:
70
+ // 1. There is a tag list and a latest version result from the list
71
+ // 2. The last prerelease tag exists and is the same
72
+ const bumpLatestVerTags = latestVerTags ? semver . inc ( latestVerTags , "prerelease" , pkgPreRelease ) : null ;
73
+ const bumpLastVer = semver . inc ( lastVersion , "prerelease" , pkgPreRelease ) ;
74
+
75
+ return bumpLatestVerTags ? getHighestVersion ( bumpLastVer , bumpLatestVerTags ) : bumpLastVer ;
76
+ } else {
77
+ const { major, minor, patch } = semver . parse ( lastVersion ) ;
78
+ // Case when last version was a normal release and now it needs to be a prerelease
79
+ return `${ semver . inc ( `${ major } .${ minor } .${ patch } ` , pkgNextType || "patch" ) } -${ pkgPreRelease } .1` ;
80
+ }
34
81
} ;
35
82
36
83
/**
0 commit comments