task.js

"use strict"
import async from 'async';
import fs from 'fs';
import p from 'path';
import util from 'util';

/**
 * Load Bob task files in parallel.
 * Only task files in specified taskNames will be loaded.
 *
 * @param {Array} taskNames: an array of task names
 * @param {String} dir: base directory where task files are located
 * @param {Function} cb: standard cb(err, result) callback
 */
function load(taskNames, dir, cb) {
  
  const jobs = {};

  taskNames.forEach((taskName) => {
    jobs[taskName] = function (cb) {
      const file = p.join(dir, taskName + '.json');
      fs.access(file, fs.constants.F_OK, (err) => {
        if (err) {
          const _err = new Error(util.format('Unknown command: %s, use --help for more info', taskName));
          cb(_err);
        } else {
          fs.readFile(file, cb);
        }
      });
    };
  });
  
  function parse(err, results) {
    if (!err) {
      Object.keys(results).forEach((taskName) => {
        results[taskName] = JSON.parse(results[taskName]);
      });
    }
    cb(err, results);
  }

  async.parallel(jobs, parse);
}

const exports = {
  load: load
};

export {
  exports as default
};