all files / lib/ tree.js

88.89% Statements 40/45
70% Branches 7/10
88.89% Functions 8/9
88.89% Lines 40/45
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 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105                                                                                                                                 
'use strict';
 
var _ = require('lodash');
var treeify = require('treeify');
var Spinner = require('cli-spinner').Spinner;
 
var fecom = require('./fecom');
var Component = require('./component/Component');
var Tree = require('./component/Tree');
var getInstalled = require('./component/getInstalled');
 
module.exports = function (semList, options) {
  var promise;
  var children = [], parsedList, rootComponent;
  var spinner;
 
  if (options.remote) {
 
    Iif (!semList.length) {
      throw new Error('No component was specified!');
    }
 
    spinner = new Spinner(fecom.i18n('ANALYZING_DEPENDENCIES'));
    spinner.setSpinnerString('|/-\\');
    spinner.start();
 
    parsedList = semList.map(function (semantic) {
      return fecom.parse(semantic);
    });
 
    children = parsedList.map(function (parsed) {
      return {
        props: parsed
      };
    });
 
    rootComponent = new Component(null, 'root', {
      children: children
    });
 
    promise = rootComponent.getRemoteDependenciesTree();
  } else {
    promise = getInstalled()
      .then(function (installed) {
 
        if (semList.length > 0) {
          parsedList = semList.map(function (semantic) {
            return fecom.parse(semantic);
          });
 
          installed = installed.filter(function (component) {
            return ~_.findIndex(parsedList, {
              name: component.name,
              owner: component.owner
            });
          });
 
          children = installed.map(function (component) {
            return {
              props: {
                name: component.name,
                owner: component.owner,
                version: component.version,
                installed: true,
                specified: true
              }
            };
          });
 
          rootComponent = new Component(null, 'root', {
            children: children
          });
 
        } else {
          rootComponent = new Component(null, 'root');
        }
 
        return rootComponent.getLocalDependenciesTree();
      });
  }
 
  return promise
    .then(function (filledTree) {
      var treeModel = new Tree(filledTree);
      var treeMap = treeify.asTree(treeModel.transform());
 
      if (spinner) {
        spinner.stop(true);
      }
 
      fecom.logger.info(fecom.i18n('DEPENDENCIES_TREE') + '\n' + treeMap);
      // fecom.logger.info(fecom.i18n('FINISH_ANALYZING_DEPENDENCIES'));
      return treeModel;
    })
    .catch(function (err) {
 
      if (spinner) {
        spinner.stop(true);
      }
 
      fecom.errorHandler(err);
      return {};
    });
 
};