Skip to content

Commit 1e06f6d

Browse files
committed
[update] init project
1 parent 6cbdf81 commit 1e06f6d

File tree

5 files changed

+5580
-0
lines changed

5 files changed

+5580
-0
lines changed

.eslintignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
node_modules
2+
lib
3+
flow
4+
coverage
5+
bundle-size
6+
demo

.eslintrc

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
"globals": {
3+
"process": true
4+
},
5+
"env": {
6+
"browser": true,
7+
"commonjs": true,
8+
"es6": true,
9+
"jest/globals": true
10+
},
11+
"extends": [
12+
"eslint-config-egg"
13+
],
14+
"plugins": [
15+
"jest"
16+
],
17+
"parserOptions": {
18+
"sourceType": "module"
19+
},
20+
"rules": {
21+
"valid-jsdoc": "off"
22+
}
23+
}

index.js

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
const shell = require('shelljs');
2+
const semver = require('semver');
3+
const { isFunction, isRegExp, isString } = require('toxic-predicate-functions');
4+
5+
class Helper {
6+
getPrefix(rawPrefix) {
7+
const prefix = isFunction(rawPrefix)
8+
? rawPrefix()
9+
: rawPrefix;
10+
if (!isRegExp(prefix) && !isString(prefix)) throw new Error(`prefix must be RegExp or String, but not ${typeof prefix}`);
11+
return prefix;
12+
}
13+
14+
get semverMap() {
15+
const { stdout } = shell.exec('git ls-remote --tags origin', { silent: true });
16+
const rawTags = stdout.split(/\n/);
17+
const semverMap = rawTags.reduce((map, rawTag) => {
18+
if (!/refs\/tags\/(.*)$/.test(rawTag)) return map;
19+
20+
const tag = rawTag.match(/refs\/tags\/(.*)$/)[1];
21+
22+
const version = semver.coerce(tag);
23+
24+
if (!version) return map;
25+
26+
const [ prefix, suffix ] = tag.split(version);
27+
28+
map[prefix] = map[prefix] || [];
29+
30+
map[prefix].push({
31+
version,
32+
wholeVersion: version + suffix,
33+
prefix,
34+
tag,
35+
});
36+
37+
return map;
38+
}, {});
39+
40+
Object.values(semverMap).forEach(arr => arr.sort((a, b) => (semver.gt(a.version, b.version) ? 1 : -1)));
41+
42+
return semverMap;
43+
}
44+
45+
getLatest(rawPrefix, {
46+
wholeVersion = false,
47+
withPrefix = false,
48+
all = false,
49+
}) {
50+
const prefix = this.getPrefix(rawPrefix);
51+
52+
const tagsList = this.semverMap[prefix] || [];
53+
54+
const obj = tagsList[tagsList.length - 1];
55+
56+
if (wholeVersion) return obj.wholeVersion;
57+
else if (withPrefix) return obj.tag;
58+
else if (all) return obj;
59+
60+
return obj.semver;
61+
}
62+
}
63+
64+
module.exports = Helper;

0 commit comments

Comments
 (0)