1 | const {isFunction, union, template} = require('lodash');
|
2 | const semver = require('semver');
|
3 | const hideSensitive = require('./hide-sensitive');
|
4 |
|
5 | function extractErrors(err) {
|
6 | return err && isFunction(err[Symbol.iterator]) ? [...err] : [err];
|
7 | }
|
8 |
|
9 | function hideSensitiveValues(env, objs) {
|
10 | const hideFunction = hideSensitive(env);
|
11 | return objs.map((object) => {
|
12 | Object.getOwnPropertyNames(object).forEach((prop) => {
|
13 | if (object[prop]) {
|
14 | object[prop] = hideFunction(object[prop]);
|
15 | }
|
16 | });
|
17 | return object;
|
18 | });
|
19 | }
|
20 |
|
21 | function tagsToVersions(tags) {
|
22 | return tags.map(({version}) => version);
|
23 | }
|
24 |
|
25 | function isMajorRange(range) {
|
26 | return /^\d+\.x(?:\.x)?$/i.test(range);
|
27 | }
|
28 |
|
29 | function isMaintenanceRange(range) {
|
30 | return /^\d+\.(?:\d+|x)(?:\.x)?$/i.test(range);
|
31 | }
|
32 |
|
33 | function getUpperBound(range) {
|
34 | const result = semver.valid(range)
|
35 | ? range
|
36 | : ((semver.validRange(range) || '').match(/<(?<upperBound>\d+\.\d+\.\d+(-\d+)?)$/) || [])[1];
|
37 |
|
38 | return result
|
39 | ?
|
40 | result.replace(/-\d+$/, '')
|
41 | : result;
|
42 | }
|
43 |
|
44 | function getLowerBound(range) {
|
45 | return ((semver.validRange(range) || '').match(/(?<lowerBound>\d+\.\d+\.\d+)/) || [])[1];
|
46 | }
|
47 |
|
48 | function highest(version1, version2) {
|
49 | return version1 && version2 ? (semver.gt(version1, version2) ? version1 : version2) : version1 || version2;
|
50 | }
|
51 |
|
52 | function lowest(version1, version2) {
|
53 | return version1 && version2 ? (semver.lt(version1, version2) ? version1 : version2) : version1 || version2;
|
54 | }
|
55 |
|
56 | function getLatestVersion(versions, {withPrerelease} = {}) {
|
57 | return versions.filter((version) => withPrerelease || !semver.prerelease(version)).sort(semver.rcompare)[0];
|
58 | }
|
59 |
|
60 | function getEarliestVersion(versions, {withPrerelease} = {}) {
|
61 | return versions.filter((version) => withPrerelease || !semver.prerelease(version)).sort(semver.compare)[0];
|
62 | }
|
63 |
|
64 | function getFirstVersion(versions, lowerBranches) {
|
65 | const lowerVersion = union(...lowerBranches.map(({tags}) => tagsToVersions(tags))).sort(semver.rcompare);
|
66 | if (lowerVersion[0]) {
|
67 | return versions.sort(semver.compare).find((version) => semver.gt(version, lowerVersion[0]));
|
68 | }
|
69 |
|
70 | return getEarliestVersion(versions);
|
71 | }
|
72 |
|
73 | function getRange(min, max) {
|
74 | return `>=${min}${max ? ` <${max}` : ''}`;
|
75 | }
|
76 |
|
77 | function makeTag(tagFormat, version) {
|
78 | return template(tagFormat)({version});
|
79 | }
|
80 |
|
81 | function isSameChannel(channel, otherChannel) {
|
82 | return channel === otherChannel || (!channel && !otherChannel);
|
83 | }
|
84 |
|
85 | module.exports = {
|
86 | extractErrors,
|
87 | hideSensitiveValues,
|
88 | tagsToVersions,
|
89 | isMajorRange,
|
90 | isMaintenanceRange,
|
91 | getUpperBound,
|
92 | getLowerBound,
|
93 | highest,
|
94 | lowest,
|
95 | getLatestVersion,
|
96 | getEarliestVersion,
|
97 | getFirstVersion,
|
98 | getRange,
|
99 | makeTag,
|
100 | isSameChannel,
|
101 | };
|