Skip to content

Instantly share code, notes, and snippets.

@stephenplusplus
Created September 2, 2015 01:59
Show Gist options
  • Select an option

  • Save stephenplusplus/a853791be302a0040a67 to your computer and use it in GitHub Desktop.

Select an option

Save stephenplusplus/a853791be302a0040a67 to your computer and use it in GitHub Desktop.
npm-package-info.js
'use strict';
var Q = require('q');
var packageJson = require('package-json');
var log = process.env.LOGGER || console;
module.exports = function (list) {
log.info('Fetching package info for %s packages', list.length);
var resolved = 0;
var PARALLEL_LIMIT = 50;
var lists = [];
while (list.length > 0) {
lists.push(list.splice(0, PARALLEL_LIMIT));
}
function getPromise() {
var list = lists.pop();
if (!list) {
var d = Q.defer();
d.resolve({});
return d.promise;
}
return Q.allSettled(list.map(function (plugin) {
var d = Q.defer();
packageJson(plugin, function (err, pkg) {
if (err) {
log.error('Unable to fetch package info for %s ', plugin, err);
d.reject(err);
return;
}
if (++resolved % 100 === 0) {
console.log('resolved' , resolved);
}
d.resolve({
author: pkg.author,
description: pkg.description,
name: pkg.name,
repo: pkg.repository && pkg.repository.type === 'git' ?
pkg.repository.url : false,
website: pkg.homepage || false
});
});
return d.promise;
}));
}
var q = Q();
for (var i = 0; i <= lists.length; i++) {
q = q.then(getPromise);
}
q.then(function (plugins) {
var list = [];
plugins.forEach(function (plugin) {
if (plugin.state === 'fulfilled') {
list.push(plugin.value);
}
});
log.info('Fetched info for %s packages', list.length);
return list;
})
.catch(function (err) {
log.error('Could not fetch package info ', err);
Q.reject(err);
return;
});
return q;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment