Skip to content

Instantly share code, notes, and snippets.

@maggiben
Created February 22, 2017 04:54
Show Gist options
  • Save maggiben/c455fafdcdac28878a98d2ee78db065b to your computer and use it in GitHub Desktop.
Save maggiben/c455fafdcdac28878a98d2ee78db065b to your computer and use it in GitHub Desktop.
Check package.json module versions
/* to move into a module */
import _ from 'lodash';
import fs from 'fs';
import path from 'path';
import globby from 'globby';
import Table from 'cli-table';
import packageJson from 'package-json';
import semver from 'semver';
import colors from 'colors';
import ProgressBar from 'progress';
const config = JSON.parse(fs.readFileSync('package.json'));
function timeout (delay) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve('Ok done!');
//reject(new Error('problem'));
}, delay);
})
}
function getPackage (module) {
return new Promise((resolve, reject) => {
packageJson(module, 'latest').then(resolve).catch(reject);
});
}
async function foo () {
console.log('waiting...');
try {
var result = await timeout(1000);
//var result = await getPackage('axios');
console.log('result:', result);
} catch (err) {
console.log(err.toString());
}
}
//foo();
function readPackageJson(filename) {
let pkg;
let error;
try {
pkg = require(filename);
} catch (e) {
if (e.code === 'MODULE_NOT_FOUND') {
error = new Error(`A package.json was not found at ${filename}`);
} else {
error = new Error(`A package.json was found at ${filename}, but it is not valid.`);
}
}
return Object.assign(pkg, {devDependencies: {}, dependencies: {}, error: error});
}
function getInstalledPackages (cwd) {
const GLOBBY_PACKAGE_JSON = '{*/package.json,@*/*/package.json}';
const installedPackages = globby.sync(GLOBBY_PACKAGE_JSON, {cwd: cwd});
return _(installedPackages)
.map(pkgPath => {
const pkg = readPackageJson(path.resolve(cwd, pkgPath));
return [pkg.name, pkg.version];
})
.fromPairs()
.valueOf();
}
async function checkDependencies(dependencies) {
let modules = Object.keys(dependencies);
let bar = new ProgressBar('downloading ╣:bar╠ :percent :etas', {
total: modules.length,
complete: '█',
incomplete: '░',
})
let table = new Table({
head: ['module', 'local version', 'latest version', 'needs update']
});
let nodeModulesPath = path.join(process.cwd(), 'node_modules');
let installedPackages = getInstalledPackages(nodeModulesPath);
for(let dependency in dependencies) {
if( dependencies.hasOwnProperty(dependency) ) {
let module = await getPackage(dependency);
let local = installedPackages[dependency];
let remote = module.version;
bar.tick();
var canUpdate = null;
if(semver.compare(remote, local)) {
canUpdate = colors.red
} else {
canUpdate = colors.green
}
table.push([dependency, canUpdate(local), remote, semver.compare(remote, local) ? colors.red('yes'):'no']);
}
}
console.log(table.toString());
}
checkDependencies(config.devDependencies)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment