"use strict"; const Promise = require("bluebird"); const path = require("path"); const chalk = require("chalk"); const pad = require("pad"); const yargs = require("yargs"); const ldd = require("./lib/ldd"); const findPackages = require("./lib/find-packages"); let argv = yargs .boolean("run") .argv; function printPackages(groupedPackages) { let packageNameWidth = Object.keys(groupedPackages).reduce((highest, pkg) => Math.max(highest, pkg.length), 0); Object.keys(groupedPackages).sort().forEach((pkg) => { console.log(` ${chalk.bold(pad(pkg, packageNameWidth))} ${groupedPackages[pkg].join(", ")}`); }); } function groupPackages(packages) { let grouped = {}; packages.forEach((pkg) => { if (grouped[pkg.package] == null) { grouped[pkg.package] = []; } grouped[pkg.package].push(pkg.library); }); return grouped; } let target = argv._[0]; Promise.try(() => { if (target == null) { throw new Error("Must specify a binary to analyze"); } else { return ldd(target); } }).then((libraries) => { let missingLibraries = libraries .filter((item) => item.location == null) .map((item) => item.library); return Promise.try(() => { return findPackages(missingLibraries) }).then((groupedResults) => { return Object.entries(groupedResults).map(([ library, pkg ]) => { return { library, package: pkg }; }); }); }).then((results) => { let groupedPackages = groupPackages(results); let binaryName = path.basename(target); console.log(""); console.log(chalk.cyan(`DepFish has guessed the following set of dependencies for ${chalk.bold(binaryName)}:`)); console.log(""); printPackages(groupedPackages); console.log(""); if (argv.run) { console.log(chalk.cyan(`Preparing to run ${chalk.bold(binaryName)}...`)); /* TODO */ } });