Skip to content

Instantly share code, notes, and snippets.

@shellscape
Last active November 9, 2016 15:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shellscape/c262ec5d74811525b1fe8c7e26a2c7e1 to your computer and use it in GitHub Desktop.
Save shellscape/c262ec5d74811525b1fe8c7e26a2c7e1 to your computer and use it in GitHub Desktop.
Snippet demonstrating NPM module version tree retrieval.
'use strict';
const npm = require('npm');
const semver = require('semver');
const graph = {};
function get (moduleName) {
const silent = true;
return new Promise((resolve, reject) => {
npm.load({ loglevel: 'silent', progress: false }, (error) => {
if (error) {
reject(error);
}
// silencio, por favor
if (npm && npm.registry && npm.registry.log && npm.registry.log.level) {
npm.registry.log.level = 'silent';
}
npm.commands.info([moduleName], silent, function (error, data) {
if (error || !data) {
reject(error || new Error('No data received.'));
}
// data is/should be a hash with property names as version number
for (let version in data) {
if (!data.hasOwnProperty(version) ||!semver.valid(version)) {
// look for the next valid property
continue;
}
resolve(data[version]);
return;
}
reject(new Error('Invalid data received.'))
});
});
});
}
async function traverse (moduleName, parent) {
let module = await get(moduleName),
keys = module.dependencies ? Object.keys(module.dependencies) : [],
meta = { version: module.version, parent: parent };
if (!graph[module.name]) {
graph[module.name] = [meta];
}
else {
graph[module.name].push(meta);
}
return await Promise.all(keys.map(async (dependency) => {
await traverse(dependency, module.name);
}));
}
async function execute () {
await Promise.resolve(traverse('koa', ''));
let sorted = Object.keys(graph)
.sort()
.reduce((result, key) =>
(result[key] = graph[key], result),
{});
return sorted;
}
execute().then((result) => { console.log(result); });
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment