• Jump To … +
    index.js Dependency.js Manifest.js buildGlobs.js processManifest.js readManifest.js
  • Manifest.js

  • ¶
    'use strict';
    
    var _               = require('lodash');
    var readManifest    = require('./readManifest');
    var processManifest = require('./processManifest');
    var BuildGlobs      = require('./buildGlobs');
    var Dependency      = require('./Dependency');
    var mainBowerFiles  = require('main-bower-files');
    
    /**
     * Manifest
     *
     * @class
     * @param {String} path File path to the manifest JSON file
     * @param {Object} options
     * @property {Object} config the original config from the manifest JSON file
     * @property {Object} dependencies the original dependencies property from the manifest JSON file
     * @property {Object} globs [see buildGlobs.globs property]{@link module:lib/buildGlobs~buildGlobs}
     * @property {Object} paths
     * @property {Object} paths.source the path to the asset source directory. Includes a trailing slash.
     * @property {Object} paths.dist path to the build directory. Includes a trailing slash.
     */
    var Manifest = module.exports = function(path, options) {
      var manifest = processManifest(readManifest(path));
      var bower = mainBowerFiles(_.pick(options, [
        'paths'
      ]));
      this.config = manifest.config;
      this.dependencies = manifest.dependencies;
      this.globs = new BuildGlobs(manifest.dependencies, bower, options).globs;
      this.paths = manifest.paths;
    };
    
    /**
     * forEachDependency
     * loops through the dependencies of the specified type and calls the callback for each dependency.
     *
     * @param {String} type The type of dependencies you want to loop through. These can be
     * @param {Function} callback Callback called per iteration with the arguments (value, index|key, collection)
     * @see {@link https://lodash.com/docs#forEach}
     */
    Manifest.prototype.forEachDependency = function(type, callback) {
      _.forEach(this.globs[type], callback);
    };
    
    /**
     * getDependency
     *
     * @param {String} name
     * @return {Object}
     */
    Manifest.prototype.getDependencyByName = function(name) {
      return _.find([].concat(this.globs.js, this.globs.css), {name: name});
    };
    
    /**
     * getProjectGlobs
     * gets
     *
     * @return {Object} returns an object with properties corresponding to
     * @example
     * // if you had a manifest with a dependencies property that looked like:
     * {
     *   "app.js": {
     *     files: [ "scripts/main.js" ],
     *     vendor: [ "vendor/hello-world.js" ]
     *   }
     *   "app.js": {
     *     files: [ "styles/main.css" ],
     *     vendor: [ "vendor/hello-world.css" ]
     *   }
     * }
     * // then
     * manifest.getProjectGlobs();
     * // will output
     * {
     *   "js": [
     *     "scripts/main.js"
     *   ],
     *   "css": [
     *     "styles/main.css"
     *   ]
     * }
     */
    Manifest.prototype.getProjectGlobs = function() {
      return _.reduce(this.dependencies, function(result, dep, key) {
        var type = Dependency.parseType(key);
        if (!_.isArray(result[type])) {
          result[type] = [];
        }
        result[type] = result[type].concat(dep.files);
        return result;
      }, {});
    };