all files / lib/component/ updateComponentJson.js

86.67% Statements 26/30
66.67% Branches 4/6
77.78% Functions 7/9
86.67% Lines 26/30
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                                                               
'use strict';
 
var path = require('path');
 
var _ = require('lodash');
var fs = require('graceful-fs');
var jsonfile = require('jsonfile');
 
var fecom = require('../fecom');
var mergeDependencies = require('./mergeDependencies');
 
module.exports = function (incomingList, toRemove) {
  // IncomingList can be installed or uninstalled
  var oldDependenciesMap = fecom.config.dependencies;
  var oldParsedList = oldDependenciesMap.map(function (semantic) {
    return fecom.parse(semantic);
  });
  // Filter specified and resolved
  incomingList = incomingList.slice().filter(function (component) {
    return component.specified  || component.resolved;
  });
 
  var newParsedList = incomingList.map(function (parsed) {
    return _.pick(parsed, ['name', 'owner', 'version', 'resolved', 'specified']);
  });
 
  var componentJson = path.join(fecom.root, 'component.json');
  var json = {};
 
  Eif (fs.existsSync(componentJson)) {
 
    json = jsonfile.readFileSync(componentJson);
 
    Iif (toRemove) {
      // Remove new dependencies from old dependencies
      json.dependencies = _.pullAllWith(oldParsedList, newParsedList, function (oldParsed, newParsed) {
        return _.isMatch(newParsed, _.pick(oldParsed, ['name', 'owner']));
      }).map(function (parsed) {
        return fecom.stringify(parsed);
      }).sort();
    } else {
      // Merge old and new dependencies
      var mergedDependencies = mergeDependencies(newParsedList, oldParsedList);
      json.dependencies = _.unionWith(mergedDependencies, oldParsedList, 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 json.dependencies.map(function (semantic) {
      return fecom.parse(semantic);
    });
  }
 
  return newParsedList;
};