conf.js 3.96 KB
/**
 *  This file contains the variables used in other gulp files
 *  which defines tasks
 *  By design, we only put there very generic config values
 *  which are used in several places to keep good readability
 *  of the tasks
 */

var argv = require('minimist')(process.argv.slice(2));
var gutil = require('gulp-util');
var path = require('path');
var fs = require('fs-extra');

/**
 *  The main paths of your project handle these with care
 */
exports.paths = {
  src: 'src',
  plugins: 'plugins',
  dist: 'dist',
  tmp: '.tmp',
  e2e: 'e2e',
  docs: 'docs',
  themes: 'themes',
  languages: 'languages'
};

exports.isBuild = function () {
  if (!exports.building) {
    exports.building = (argv._[0] == 'build' ? true : false);
  }
  return exports.building;
};

exports.isDefaultTheme = function (name) {
  return /-default$/.test(name);
};

/**
* Check if theme folder exists on "themes" directory
*
* @param path The string relative path of the theme
*/
exports.themeExists = function (path) {
  try {
    fs.statSync(path);
  } catch (e) {
    throw new Error('The theme "'+exports.paths.theme+ ' on path "'+path+'" was not found');
  }
};

/**
* Check if skin file exists on "{theme}/app/layout/skins" directory
*
* @param skin The skin name passed by arg to gulp task
*/
exports.skinExists = function (skin) {
  
    var skinPath, prefixPath = '';
    var skinFile = skin+'.scss';
    if (/skin-/.test(skin)) {
       skinFile = skin.replace('skin-','_')+'.scss';
    }

    if (exports.isDefaultTheme(exports.paths.theme)) {
      prefixPath = exports.paths.src;
    }else {
      prefixPath = path.join(exports.paths.themes, exports.paths.theme);
    }

    skinPath = path.join(prefixPath, '/app/layout/scss/skins/', skinFile);

    try {
      fs.statSync(skinPath);
    } catch(e) {
      throw new Error('The skin file "'+skinPath+'" was not found');
    }

    var content = fs.readFileSync(skinPath, {encoding: 'utf8'});
    if (content.search(skin) == -1) {
      throw new Error('The skin css selector ".'+skin+'" was not found in "'+skinPath+'" file');
    }else if (content.search('@extend %skin-base') == -1) {
      throw new Error('The skin css selector ".'+skin+'" needs inherit from %skin-base sass placeholder');
    }

};

exports.configTheme = function(theme) {

  exports.paths.theme = theme || "angular-default";
  var themePath = path.join(exports.paths.themes, exports.paths.theme);

  exports.paths.allSources = [exports.paths.src, themePath];

  exports.themeExists(themePath);
  exports.paths.dist = path.join("dist", exports.paths.theme);

  if(exports.isBuild() && !exports.isDefaultTheme(exports.paths.theme)){

      try {
        fs.statSync(path.join(themePath,'package.json'));
        var themeData = fs.readJsonSync(path.join(themePath,'package.json'));

        if(!themeData.config || !themeData.config.skin) {
          throw new Error('The theme "'+exports.paths.theme+'" needs a default skin on their package.json file');
        }
        argv.skin = themeData.config.skin;
      } catch (e) {
        gutil.log(gutil.colors.yellow('[WARNING]','The package.json file was not found into theme:'), gutil.colors.cyan(exports.paths.theme));
      }

  }

  if(argv.skin && argv.skin != 'skin-whbl') {
    exports.skinExists(argv.skin);

    exports.paths.skin = argv.skin;
  }

  gutil.log('Configuring theme', gutil.colors.green(exports.paths.theme.toUpperCase()));
}
exports.configTheme(argv.theme);

/**
 *  Wiredep is the lib which inject bower dependencies in your project
 *  Mainly used to inject script tags in the index.html but also used
 *  to inject css preprocessor deps and js files in karma
 */
exports.wiredep = {
  exclude: [/jquery/, /\/bootstrap\.js$/, /\/bootstrap-sass\/.*\.js/, /\/bootstrap\.css/],
  directory: 'bower_components'
};

/**
 *  Common implementation for an error handler of a Gulp plugin
 */
exports.errorHandler = function(title) {
  'use strict';

  return function(err) {
    gutil.log(gutil.colors.red('[' + title + ']'), err.toString());
    this.emit('end');
  };
};