All files core.js

0% Statements 0/52
0% Branches 0/39
0% Functions 0/8
0% Lines 0/49

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84                                                                                                                                                                       
const c = require('chalk');
const _ = require('lodash/fp');
const ora = require('ora');
const pMap = require('p-map');
const {
  fetchPackageStats,
  getPackageVersionList,
  getPackagesFromPackageJson
} = require('./fetch-package-stats');
const {getView} = require('./cli-views');
const fakeSpinner = require('./fake-spinner');
 
const getPackages = async argv => {
  const range = argv.range || (argv.range === undefined ? null : -1);
  if ('range' in argv && 'r' in argv) return getPackageVersionList(argv._[0], range || 8);
  if ('package' in argv && 'p' in argv) return getPackagesFromPackageJson(argv.package);
 
  return argv.self ? ['bundle-phobia-cli'] : argv._;
};
 
const isSingleOutput = argv =>
  _.some(opt => opt in argv, ['size', 'json', 'gzip-size', 'dependencies']);
 
const main = async ({argv, stream = process.stdout}) => {
  if ('range' in argv && 'r' in argv && argv._.length > 1)
    throw new Error("Can't use both --range option and list of packages");
 
  if ('package' in argv && 'p' in argv && argv._.length > 0)
    throw new Error("Can't use both --package option and list of packages");
 
  if ('self' in argv && argv._.length > 0)
    throw new Error("Can't use both --self and list of packages");
 
  const spinnerActivated = !isSingleOutput(argv);
  const Spinner = spinnerActivated ? ora : fakeSpinner;
  const spinner = Spinner({stream});
 
  const packages = await getPackages(argv).catch(err => {
    const paquage = argv._[0] || 'packages from packages.json';
    if (spinnerActivated)
      spinner.fail(c.red(`resolving ${c.bold.underline(paquage)} failed: `) + err.message);
    const wrapError = new Error(`${paquage}: ${err.message}`);
    wrapError.error = err;
    throw wrapError;
  });
  const view = getView(argv);
 
  const allStats = await pMap(
    packages,
    async paquage => {
      spinner.text = `Fetching stats for package ${c.dim.bold(paquage)}`;
      spinner.start();
      const stats = await fetchPackageStats(paquage).catch(err => {
        spinner.fail(c.red(`resolving ${c.bold.underline(paquage)} failed: `) + err.message);
        throw err;
      });
      spinner.info(view(stats));
      return stats;
    },
    {concurrency: 1}
  ).catch(err => {
    spinner.stop();
    throw err;
  });
  const nLibs = _.size(allStats);
  if (nLibs > 1) {
    spinner.clear();
    stream.write('\n');
    spinner.info(
      view({
        name: c.magenta('total'),
        version: `${nLibs} packages`,
        gzip: _.sumBy('gzip', allStats),
        size: _.sumBy('size', allStats),
        dependencyCount: _.sumBy('dependencyCount', allStats)
      })
    );
  }
 
  spinner.stop();
};
 
module.exports = {main, isSingleOutput};