jazelle/commands/outdated.js (47 lines of code) (raw):
// @flow
const {getManifest} = require('../utils/get-manifest.js');
const {getAllDependencies} = require('../utils/get-all-dependencies.js');
const {exec} = require('../utils/node-helpers.js');
const {node, yarn} = require('../utils/binary-paths.js');
const {minVersion, gt, validRange} = require('../utils/cached-semver');
/*::
type OutdatedArgs = {
root: string,
};
type Outdated = (OutdatedArgs) => Promise<void>
*/
const outdated /*: Outdated */ = async ({root}) => {
const {projects} = await getManifest({root});
const locals = await getAllDependencies({root, projects});
const map = {};
const types = ['dependencies', 'devDependencies'];
for (const local of locals) {
for (const type of types) {
if (local.meta[type]) {
for (const name in local.meta[type]) {
if (!map[name]) map[name] = new Set();
map[name].add(local.meta[type][name]);
}
}
}
}
// report local discrepancies
for (const name in map) {
const local = locals.find(local => local.meta.name === name);
if (local) {
const {version} = local.meta;
for (const range of map[name]) {
if (version !== range) console.log(name, range, version);
}
}
}
// then report registry discrepancies
for (const name in map) {
const local = locals.find(local => local.meta.name === name);
if (!local) {
const query = `${node} ${yarn} info ${name} version --json 2>/dev/null`;
const registryVersion = await exec(query);
if (registryVersion) {
const latest = JSON.parse(registryVersion).data;
for (const range of map[name]) {
if (!validRange(range) || !validRange(latest)) {
continue;
}
if (gt(latest, minVersion(range))) console.log(name, range, latest);
}
}
}
}
};
module.exports = {outdated};