-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathaction.js
102 lines (84 loc) · 3.19 KB
/
action.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
const semver = require('semver');
const {getLatestTag} = require('./git-commands');
/**
* @param prefix
* @param versioning
* @param force
* @param tagExtractor
* @returns {string|*}
*/
module.exports = function action(
{
prefix = 'v',
versioning = 'semver',
force,
preReleaseSuffix = '',
level = 'patch'
},
tagExtractor = getLatestTag
) {
const latestTag = tagExtractor(prefix);
const PRERELEASE_LEVEL_NAME = 'prerelease';
if (force) return {'currentTag': latestTag || '', 'nextTag': prefix + force, 'nextVersion': force};
if (!['semver', 'single-number'].includes(versioning)) {
throw new Error(`unknown versioning '${versioning}'`);
}
if (!['major', 'minor', 'patch', 'premajor', 'preminor', 'prepatch', 'prerelease'].includes(level)) {
throw new Error(`Invalid level name: ${level}`);
}
function isPreReleaseLevel() {
return level === PRERELEASE_LEVEL_NAME;
}
if (isPreReleaseLevel() && preReleaseSuffix === '') {
throw new Error(`There is no pre release suffix for level: ${level}`);
}
if (latestTag === null) {
let calculatedPreReleaseVersion = isPreReleaseLevel() ? `-${preReleaseSuffix}.0` : '';
let calculatedNextVersion = '';
if (versioning === 'semver') calculatedNextVersion = `0.0.1${calculatedPreReleaseVersion}`;
if (versioning === 'single-number') calculatedNextVersion = `1${calculatedPreReleaseVersion}`;
return {
currentTag: '',
nextTag: `${prefix}${calculatedNextVersion}`,
nextVersion: `${calculatedNextVersion}`
};
}
if (!latestTag.startsWith(prefix)) {
throw new Error(`expecting provided tag ${latestTag} to start with ${prefix}`);
}
const version = latestTag.slice(prefix.length);
switch (versioning) {
case 'semver': {
if (!semver.valid(version)) throw new Error(`version ${version} not a valid semver string`);
return {
currentTag: latestTag,
nextTag: `${prefix}${semver.inc(version, level, preReleaseSuffix)}`,
nextVersion: semver.inc(version, level, preReleaseSuffix)
};
}
case 'single-number': {
let calculatedNextVersion = '';
const isPreReleasedTag = version.includes('-' + preReleaseSuffix);
const [singleNumberVersion, suffix] = version.split(`-${preReleaseSuffix}.`, 2);
const nextPreReleaseVersion = suffix ? parseInt(suffix, 10) + 1 : 0;
if (isPreReleasedTag && isPreReleaseLevel()) {
calculatedNextVersion = `${singleNumberVersion}-${preReleaseSuffix}.${nextPreReleaseVersion}`;
}
if (isPreReleasedTag && !isPreReleaseLevel()) {
calculatedNextVersion = parseInt(version, 10);
if (isNaN(calculatedNextVersion)) throw new Error(`version ${version} not a valid number`);
}
if (!isPreReleasedTag && isPreReleaseLevel()) {
calculatedNextVersion = `${parseInt(singleNumberVersion, 10) + 1}-${preReleaseSuffix}.${nextPreReleaseVersion}`;
}
if (!isPreReleasedTag && !isPreReleaseLevel()) {
calculatedNextVersion = `${parseInt(singleNumberVersion, 10) + 1}`;
}
return {
currentTag: latestTag,
nextTag: `${prefix}${calculatedNextVersion}`,
nextVersion: `${calculatedNextVersion}`
};
}
}
};