UNPKG

gulp-tasks-manager

Version:
83 lines (69 loc) 1.91 kB
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; };