const {isFunction, union, template} = require('lodash'); const semver = require('semver'); const hideSensitive = require('./hide-sensitive'); function extractErrors(err) { return err && isFunction(err[Symbol.iterator]) ? [...err] : [err]; } function hideSensitiveValues(env, objs) { const hideFunction = hideSensitive(env); return objs.map(obj => { Object.getOwnPropertyNames(obj).forEach(prop => { if (obj[prop]) { obj[prop] = hideFunction(obj[prop]); } }); return obj; }); } function tagsToVersions(tags) { return tags.map(({version}) => version); } function isMajorRange(range) { return /^\d+\.x(?:\.x)?$/i.test(range); } function isMaintenanceRange(range) { return /^\d+\.(?:\d+|x)(?:\.x)?$/i.test(range); } function getUpperBound(range) { return semver.valid(range) ? range : ((semver.validRange(range) || '').match(/<(\d+\.\d+\.\d+)$/) || [])[1]; } function getLowerBound(range) { return ((semver.validRange(range) || '').match(/(\d+\.\d+\.\d+)/) || [])[1]; } function highest(version1, version2) { return version1 && version2 ? (semver.gt(version1, version2) ? version1 : version2) : version1 || version2; } function lowest(version1, version2) { return version1 && version2 ? (semver.lt(version1, version2) ? version1 : version2) : version1 || version2; } function getLatestVersion(versions, {withPrerelease} = {}) { return versions.filter(version => withPrerelease || !semver.prerelease(version)).sort(semver.rcompare)[0]; } function getEarliestVersion(versions, {withPrerelease} = {}) { return versions.filter(version => withPrerelease || !semver.prerelease(version)).sort(semver.compare)[0]; } function getFirstVersion(versions, lowerBranches) { const lowerVersion = union(...lowerBranches.map(({tags}) => tagsToVersions(tags))).sort(semver.rcompare); if (lowerVersion[0]) { return versions.sort(semver.compare).find(version => semver.gt(version, lowerVersion[0])); } return getEarliestVersion(versions); } function getRange(min, max) { return `>=${min}${max ? ` <${max}` : ''}`; } function makeTag(tagFormat, version) { return template(tagFormat)({version}); } function isSameChannel(channel, otherChannel) { return channel === otherChannel || (!channel && !otherChannel); } module.exports = { extractErrors, hideSensitiveValues, tagsToVersions, isMajorRange, isMaintenanceRange, getUpperBound, getLowerBound, highest, lowest, getLatestVersion, getEarliestVersion, getFirstVersion, getRange, makeTag, isSameChannel, };