all files / lib/ fecom.js

82.67% Statements 62/75
46.88% Branches 15/32
70% Functions 7/10
82.67% Lines 62/75
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 126 127 128 129 130 131 132 133 134 135 136 137 138 139                36× 27×                                                               27× 27× 27× 27× 27×   27×     156× 156× 156×   156×       156×     281× 281× 281× 281× 281× 281× 281×                                                          
'use strict';
 
var path = require('path');
var EventEmitter = require('events');
var util = require('util');
 
var _ = require('lodash');
var fs = require('graceful-fs');
var osLocale = require('os-locale');
var ini = require('ini');
var YAML = require('yamljs');
 
var parse = require('./util/parse');
var logger = require('./util/logger');
var promisify = require('./util/promisify');
 
function getUserHome() {
  return process.env[('win32' === process.platform) ? 'USERPROFILE' : 'HOME'];
}
 
function placeholder(value, patterns) {
 
  if (!patterns.length) {
    return value;
  }
 
  var regexp = new RegExp('\\{' + (patterns.length - 1) + '\\}', 'g');
  return placeholder(value.replace(regexp, patterns.pop()), patterns);
}
 
var defaults = {}, profile;
var profileFile = path.join(getUserHome(), '.fecomrc');
 
Eif (fs.existsSync(profileFile)) {
 
  try {
    profile = ini.parse(fs.readFileSync(profileFile, 'utf-8'));
    defaults = profile.defaults;
  } catch (err) {
    logger.error(err);
  }
 
}
 
var Fecom = function () {
  this.root = '';
  this.componentRoot = '';
  this.profile = null;
  this.config = null;
  this.locale = osLocale.sync();
  this.lang = YAML.load(path.join(__dirname, '../i18n/lang.yml'));
  this.tmpDir = path.join(getUserHome(), '.fecom');
  EventEmitter.call(this);
};
 
util.inherits(Fecom, EventEmitter);
 
Fecom.defaults = {};
Fecom.defaults.config = _.assign({
  name: path.basename(process.cwd()),
  dir: 'components',
  protocol: 'gitlab',
  owner: 'fecom-fe',
  domain: 'http://gitlab.58corp.com'
}, defaults);
 
Fecom.prototype = _.assign(Fecom.prototype, {
  constructor: Fecom,
  initialize: function (options, config, profile) {
    // Initialize Fecom instance
    var self = this;
 
    Iif (!fs.existsSync(self.tmpDir)) {
      fs.mkdirSync(self.tmpDir);
    }
 
    self.profile = profile;
    self.config = _.assign({}, Fecom.defaults.config, config);
    self.componentRoot = path.join(options.cwd, self.config.dir);
    self.emit('ready');
  },
  i18n: function () {
    var self = this;
    var args = [].slice.call(arguments);
    var key = args.shift();
    var entity = self.lang[key];
    var value = (entity.hasOwnProperty(self.locale)) ? entity[self.locale] : entity['en-US'];
 
    return placeholder(value, args);
  },
  parse: function (str) {
    var self = this;
    var isResolved = _.startsWith(str, '*');
    var parsed = parse(isResolved ? str.substr(1) : str);
 
    Iif (isResolved) {
      parsed.resolved = true;
    }
 
    return _.assign({}, { owner: self.config.owner }, parsed);
  },
  stringify: function (parsed) {
    var semantic = '';
    semantic += (!parsed.specified && parsed.resolved) ? '*' : '';
    semantic += parsed.owner ? (parsed.owner + '/') : '';
    semantic += parsed.name;
    semantic += parsed.version ? ('@' + parsed.version) : '';
    semantic += parsed.status ? (' (' + parsed.status + ')') : '';
    return semantic;
  },
  logger: logger,
  errorHandler: function (err) {
 
    if ('string' === typeof err) {
      err = new Error(err);
    }
 
    logger.error(err.message);
 
    if (err.hasOwnProperty('conflictList') && err.conflictList.length > 0) {
      err.conflictList.forEach(function (conflict) {
        var components = conflict.owners.map(function (owner) {
          return owner + '/' + conflict.name;
        }).join(', ');
 
        logger.info(components);
      });
    }
 
    if ('debug' === process.env.NODE_ENV) {
      logger.error(err.stack);
    }
 
  },
  async: promisify
});
 
module.exports = new Fecom();