-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
102 lines (81 loc) · 2.42 KB
/
index.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 shell = require('shelljs');
const semver = require('semver');
const { isFunction, isRegExp, isString, isEmpty } = require('toxic-predicate-functions');
require('core-js/fn/object');
class Helper {
getPrefix(rawPrefix) {
const prefix = isFunction(rawPrefix)
? rawPrefix()
: rawPrefix;
if (!isRegExp(prefix) && !isString(prefix)) throw new Error(`prefix must be RegExp or String, but not ${typeof prefix}`);
return prefix;
}
get semverMap() {
const { stdout } = shell.exec('git ls-remote --tags origin', { silent: true });
const rawTags = stdout.split(/\n/);
const semverMap = rawTags.reduce((map, rawTag) => {
if (!/refs\/tags\/(.*)$/.test(rawTag)) return map;
const tag = rawTag.match(/refs\/tags\/(.*)$/)[1];
const semverObj = semver.coerce(tag);
if (!semverObj) return map;
const [ prefix, suffix ] = tag.split(semverObj.raw);
map[prefix] = map[prefix] || [];
map[prefix].push({
semver: semverObj,
wholeVersion: semverObj.raw + suffix,
prefix,
tag,
version: semverObj.raw,
});
return map;
}, {});
Object.values(semverMap).forEach(arr => arr.sort((a, b) => (semver.gt(a.semver, b.semver) ? 1 : -1)));
return semverMap;
}
getLatest(rawPrefix, {
semver = false,
wholeVersion = false,
withPrefix = false,
all = false,
} = {}) {
const prefix = this.getPrefix(rawPrefix);
let tagsList = [];
const semverMap = this.semverMap;
if (isString(prefix) && !isEmpty(semverMap[prefix])) {
tagsList = semverMap[prefix];
}
if (isRegExp(prefix)) {
for (const key in semverMap) {
if (prefix.test(key)) {
tagsList = semverMap[key];
break;
}
}
}
const obj = tagsList[tagsList.length - 1] || {
semver: {
raw: '',
major: 0,
minor: 0,
patch: 0,
prerelease: [],
build: [],
version: '',
},
wholeVersion: '',
prefix: '',
tag: '',
version: '',
};
if (semver) return obj.semver;
else if (wholeVersion) return obj.wholeVersion;
else if (withPrefix) return obj.tag;
else if (all) return obj;
return obj.version;
}
increase(prefix = '', type = 'patch') {
const latest_semver = this.getLatest(prefix, { semver: true });
return semver.inc(latest_semver, type);
}
}
module.exports = new Helper();