}, function(packages, done) { Cs.debug('2: found: ' + packages.map(function(p) { return p.id; }).join(',') + ' deps = ' + deps); if (!deps) return done(null, packages); // nothing to do var ret = [], seen = {}; function addPackage(packageInfo, done) { if (seen[packageInfo.id]) return done(); ret.push(packageInfo); seen[packageInfo.id] = true; Cs.each(packageInfo.dependencies(), function(packageId, done) { PackageInfo.findCompatible(packageId, function(err, curInfo) { if (err) return done(err); if (!curInfo) done(); // nothing to do if dependency not found else addPackage(curInfo, done); }); })(done); } Cs.each(packages, function(curInfo, done) { addPackage(curInfo, done); })(function(err) { if (err) return done(err); else return done(null, ret); }); // finally filter based on if you have access to see a given package }, function(packages, done) {
function addPackage(packageInfo, done) { if (seen[packageInfo.id]) return done(); ret.push(packageInfo); seen[packageInfo.id] = true; Cs.each(packageInfo.dependencies(), function(packageId, done) { PackageInfo.findCompatible(packageId, function(err, curInfo) { if (err) return done(err); if (!curInfo) done(); // nothing to do if dependency not found else addPackage(curInfo, done); }); })(done); }