|
| 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