/
recommend-version.js
90 lines (78 loc) · 3.14 KB
/
recommend-version.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
"use strict";
const conventionalRecommendedBump = require("conventional-recommended-bump");
const log = require("npmlog");
const semver = require("semver");
const getChangelogConfig = require("./get-changelog-config");
module.exports = recommendVersion;
function recommendVersion(pkg, type, { changelogPreset, rootPath, tagPrefix, prereleaseId }) {
log.silly(type, "for %s at %s", pkg.name, pkg.location);
const options = {
path: pkg.location,
};
if (type === "independent") {
options.lernaPackage = pkg.name;
} else {
// only fixed mode can have a custom tag prefix
options.tagPrefix = tagPrefix;
}
const shouldBumpPrerelease = (releaseType, version) => {
if (!semver.prerelease(version)) {
return true;
}
switch (releaseType) {
case "major":
return semver.minor(version) !== 0 || semver.patch(version) !== 0;
case "minor":
return semver.patch(version) !== 0;
default:
return false;
}
};
// Ensure potential ValidationError in getChangelogConfig() is propagated correctly
let chain = Promise.resolve();
chain = chain.then(() => getChangelogConfig(changelogPreset, rootPath));
chain = chain.then(config => {
// "new" preset API
options.config = config;
return new Promise((resolve, reject) => {
conventionalRecommendedBump(options, (err, data) => {
if (err) {
return reject(err);
}
// result might be undefined because some presets are not consistent with angular
// we still need to bump _something_ because lerna saw a change here
let releaseType = data.releaseType || "patch";
if (prereleaseId) {
const shouldBump = shouldBumpPrerelease(releaseType, pkg.version);
const prereleaseType = shouldBump ? `pre${releaseType}` : "prerelease";
log.verbose(type, "increment %s by %s", pkg.version, prereleaseType);
resolve(semver.inc(pkg.version, prereleaseType, prereleaseId));
} else {
if (semver.major(pkg.version) === 0) {
// According to semver, major version zero (0.y.z) is for initial
// development. Anything MAY change at any time. The public API
// SHOULD NOT be considered stable. The version 1.0.0 defines
// the (initial stable) public API.
//
// To allow monorepos to use major version zero meaningfully,
// the transition from 0.x to 1.x must be explicitly requested
// by the user. Breaking changes MUST NOT automatically bump
// the major version from 0.x to 1.x.
//
// The usual convention is to use semver-patch bumps for bugfix
// releases and semver-minor for everything else, including
// breaking changes. This matches the behavior of `^` operator
// as implemented by `npm`.
//
if (releaseType === "major") {
releaseType = "minor";
}
}
log.verbose(type, "increment %s by %s", pkg.version, releaseType);
resolve(semver.inc(pkg.version, releaseType));
}
});
});
});
return chain;
}