All files core.js

98.08% Statements 51/52
82.05% Branches 32/39
100% Functions 8/8
100% Lines 49/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 842x 2x 2x 2x         2x 2x 2x   2x 5x 5x 4x   4x     2x 17x   2x 9x 2x   7x 1x   6x 1x   5x 5x 5x   5x 1x 1x 1x 1x 1x 1x   4x   3x     4x 4x 4x 1x 1x   3x 3x       1x 1x   2x 2x 1x 1x 1x                     2x     2x  
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);
  Iif ('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';
    Eif (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};