Select Git revision
versions.js
versions.js 17.30 KiB
const semver = require('semver');
const stable = require('semver-stable');
const _ = require('lodash');
const semverUtils = require('semver-utils');
const moment = require('moment');
module.exports = {
determineUpgrades,
isRange,
isValidVersion,
isPastLatest,
};
function determineUpgrades(npmDep, config) {
const dependency = npmDep.name;
logger.debug({ dependency }, `determineUpgrades()`);
logger.trace({ npmDep, config });
const result = {
type: 'warning',
};
const { lockedVersion, pinVersions, allowedVersions } = config;
const { versions } = npmDep;
if (!versions || Object.keys(versions).length === 0) {
result.message = `No versions returned from registry for this package`;
logger.warn({ dependency }, result.message);
return [result];
}
let versionList = Object.keys(versions);
const allUpgrades = {};
let { currentVersion } = config;
// filter out versions past latest
const currentIsPastLatest = isPastLatest(
npmDep,
semver.minSatisfying(versionList, currentVersion)
);
if (currentIsPastLatest) {
logger.debug({ name: npmDep.name, currentVersion }, 'currentIsPastLatest');
}
versionList = versionList.filter(
version =>
currentIsPastLatest || // if current is past latest then don't filter any
config.respectLatest === false || // if user has configured respectLatest to false
isPastLatest(npmDep, version) === false // if the version is less than or equal to latest
);
let rangeOperator;
if (config.upgradeInRange && semver.validRange(currentVersion)) {
logger.debug({ currentVersion }, 'upgradeInRange is true');
const parsedRange = semverUtils.parseRange(currentVersion);
if (parsedRange && parsedRange.length === 1) {
const [range] = parsedRange;
if (range.major && range.minor && range.patch) {
if (range.operator === '^' || range.operator === '~') {
logger.debug('Applying upgradeInRange');
currentVersion = `${range.major}.${range.minor}.${range.patch}`;
currentVersion += range.release ? `-${range.release}` : '';
logger.debug({ currentVersion }, 'upgradeInRange currentVersion');
rangeOperator = range.operator;
} else {
logger.debug({ currentVersion }, 'Unsupported range type');
}
} else {
logger.debug({ currentVersion }, 'Range is not fully specified');
}
} else {
logger.debug({ currentVersion }, 'Skipping complex range');
}
}
let changeLogFromVersion = currentVersion;
// Check for a current range and pin it
if (isRange(currentVersion)) {