forked from cypress-io/cypress
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathget-next-version.js
116 lines (90 loc) · 2.95 KB
/
get-next-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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
const path = require('path')
const semver = require('semver')
const bumpCb = require('conventional-recommended-bump')
const { promisify } = require('util')
const checkedInBinaryVersion = require('../package.json').version
const { changeCatagories } = require('./semantic-commits/change-categories')
const { getCurrentReleaseData } = require('./semantic-commits/get-current-release-data')
const bump = promisify(bumpCb)
const paths = ['packages', 'cli']
const getNextVersionForPath = async (path) => {
const { version: releasedVersion } = await getCurrentReleaseData(false)
let commits
const whatBump = (foundCommits) => {
// semantic version bump: 0 - major, 1 - minor, 2 - patch
let level = 2
let breakings = 0
let features = 0
commits = foundCommits
foundCommits.forEach((commit) => {
if (!commit.type || !changeCatagories[commit.type]) return
if (changeCatagories[commit.type].release === 'major') {
breakings += 1
level = 0
} else if (changeCatagories[commit.type].release === 'minor') {
features += 1
if (level === 2) {
level = 1
}
}
})
return {
level,
reason: breakings > 0
? `There is ${breakings} BREAKING CHANGE and ${features} features`
: features > 0 ? `There ${features} features` : 'There are only patch changes in this release',
}
}
const { releaseType } = await bump({
whatBump,
path,
})
let nextVersion = semver.inc(checkedInBinaryVersion, releaseType || 'patch')
const hasVersionBump = checkedInBinaryVersion !== releasedVersion
// See ../guides/next-version.md for documentation.
// for the time being, honoring this ENV -- ideally this will be deleted to remove manually overriding without a PR
if (process.env.NEXT_VERSION) {
nextVersion = process.env.NEXT_VERSION
} else if (hasVersionBump) {
nextVersion = checkedInBinaryVersion
}
return {
nextVersion,
commits,
}
}
const getNextVersionForBinary = async () => {
let commits = []
let nextVersion
for (const path of paths) {
const { nextVersion: pathNextVersion, commits: pathCommits } = await getNextVersionForPath(path)
if (!nextVersion || semver.gt(pathNextVersion, nextVersion)) {
nextVersion = pathNextVersion
}
commits = commits.concat(pathCommits)
}
if (!nextVersion) {
throw new Error('Unable to determine next version.')
}
return {
nextVersion,
commits,
}
}
if (require.main !== module) {
module.exports = {
getNextVersionForBinary,
getNextVersionForPath,
}
return
}
(async () => {
process.chdir(path.join(__dirname, '..'))
const { nextVersion } = await getNextVersionForBinary()
if (process.argv.includes('--npm') && checkedInBinaryVersion !== nextVersion) {
const cmd = `npm --no-git-tag-version version ${nextVersion}`
console.log(`Running '${cmd}'...`)
return require('child_process').execSync(cmd)
}
console.log(nextVersion)
})()