all files / lib/ install.js

92.19% Statements 59/64
50% Branches 8/16
94.74% Functions 18/19
92.19% Lines 59/64
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 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125                                                                                                                                   
'use strict';
 
var path = require('path');
 
var _ = require('lodash');
var fs = require('graceful-fs');
var jsonfile = require('jsonfile');
var Promise = require('bluebird');
var treeify = require('treeify');
var inquirer = require('inquirer');
 
var fecom = require('./fecom');
var Component = require('./component/Component');
var getInstalled = require('./component/getInstalled');
var getToInstall = require('./component/getToInstall');
var analyze = require('./component/analyze');
var mergeDependencies = require('./component/mergeDependencies');
 
module.exports = function (semList, options) {
  var parsedList = semList.map(function (str) {
    return fecom.parse(str);
  });
 
  Iif (!parsedList.length) {
    fecom.logger.info(fecom.i18n('INSTALL_COMPONENT_JSON_DEPENDENCIES'));
  }
 
  return Promise
    .props({
      installed: getInstalled(),
      toInstall: getToInstall(parsedList)
    })
    .then(function (results) {
      return analyze(results.toInstall, results.installed, options.resolve ? 'latest' : 'ask');
    })
    .then(function (treeModel) {
      var toInstallAll = treeModel.getAllNodes().slice(1).filter(function (parsed) {
        return !parsed.installed;
      }).map(function (parsed) {
        return new Component(parsed, 'remote');
      });
 
      Eif (toInstallAll.length) {
        fecom.logger.info(fecom.i18n('BEGIN_TO_DOWNLOAD_COMPONENTS'));
      }
 
      return Promise.reduce(toInstallAll, function (newInstalledList, component) {
        return component.install()
          .then(function (newInstalled) {
            newInstalledList.push(newInstalled);
            return newInstalledList;
          })
          .catch(function (err) {
            // var _err = new Error(fecom.i18n('FAIL_TO_INSTALL_COMPONENTS', component.stringify()));
            fecom.errorHandler(err);
            return newInstalledList;
          });
      }, []);
 
    })
    .then(function (newInstalledList) {
      var map = {};
      var rootName = fecom.config.name;
      var rootVersion = fecom.config.version;
      var tree, str;
 
      // fecom.logger.info(fecom.i18n('FINISH_INSTALLING_COMPONENT'));
 
      Iif (!newInstalledList.length) {
        fecom.logger.info(fecom.i18n('NO_COMPONENT_TO_INSTALL'));
        return newInstalledList;
      }
 
      map = _.zipObject(newInstalledList.map(function (component) {
        return component.stringify();
      }));
 
      tree = treeify.asTree(map);
      str = rootName ? (rootName + (rootVersion ? '@' + rootVersion : '') + '\n') : '';
 
      fecom.logger.info(fecom.i18n('INSTALLED_COMPONENTS', str + tree));
 
      return newInstalledList;
    })
    .then(function (newInstalledList) {
      var oldDependencies = fecom.config.dependencies;
      var oldParsedList = oldDependencies.map(function (semantic) {
        return fecom.parse(semantic);
      });
 
      newInstalledList = newInstalledList.filter(function (component) {
        return component.specified  || component.resolved;
      });
 
      var newParsedList = newInstalledList.map(function (parsed) {
        return _.pick(parsed, ['name', 'owner', 'version', 'resolved', 'specified']);
      });
 
      return mergeDependencies(newParsedList, oldParsedList);
    })
    .then(function (dependencies) {
      var componentJson = path.join(options.cwd, 'component.json');
      var json = {};
      var newDependencies = dependencies;
 
      Eif (fs.existsSync(componentJson)) {
        json = jsonfile.readFileSync(componentJson);
      }
 
      var oldDependencies = json.dependencies.map(function (semantic) {
        return fecom.parse(semantic);
      });
 
      json.dependencies = _.unionWith(newDependencies, oldDependencies, function (oldParsed, newParsed) {
        return _.isMatch(newParsed, _.pick(oldParsed, ['name', 'owner']));
      }).map(function (parsed) {
        return fecom.stringify(parsed);
      }).sort();
 
      jsonfile.writeFileSync(componentJson, json, { spaces: 2 });
      return newDependencies;
    })
    .catch(fecom.errorHandler);
 
};