gulp-tasks-manager
Version:
Gulp tasks manager
83 lines (69 loc) • 1.91 kB
JavaScript
var path = require('path');
module.exports = tasks;
var taskCache = Object.create(null);
/**
* @param {Object} gulp gulp
* @param {Object} plugins gulp-load-plugins or self defined object
* @param {Object} opts options
* @return {Function} function to load subtasks
*/
function tasks(gulp, plugins, opts) {
opts = opts || {};
opts.rootDir = opts.rootDir || './';
opts.taskDir = opts.taskDir || './';
return function task(name, filename) {
if (taskCache[name]) {
throw new Error('Duplicate namespace: ' + name);
}
filename = filename || name;
var taskPath = path.join(opts.taskDir, filename),
executor = require(path.resolve(taskPath));
if (typeof executor !== 'function') {
throw new Error('module.exports of ' + taskPath + ' must be a function');
}
var subTasks = [],
ns = function(taskName) {
if (typeof taskName === 'string') {
taskName = name + ':' + taskName;
if (subTasks.indexOf(taskName) > -1) {
throw new Error('Duplicate task name: ' + taskName);
}
subTasks.push(taskName);
return taskName;
}
if (Array.isArray(taskName)) {
return taskName.map(function(item) {
return name + ':' + item;
});
}
throw new Error('The function ns(taskName) must take a string ' +
'or an array of strings as its only parameter');
};
ns.name = name;
ns.context = function(dir) {
var cxt = path.join(opts.rootDir, dir);
return function(rel) {
return path.join(cxt, rel);
};
};
executor(gulp, plugins, ns);
gulp.task(name, subTasks);
taskCache[name] = subTasks;
};
}
/**
* List main tasks managed by this tool.
*
* @return {Array} main tasks, i.e. all namespaces
*/
tasks.list = function() {
return Object.keys(taskCache);
};
/**
* List all tasks managed by this tool.
*
* @return {Object} all tasks
*/
tasks.listAll = function() {
return taskCache;
};