104 lines
2.5 KiB
JavaScript
104 lines
2.5 KiB
JavaScript
|
/*jshint node:true */
|
||
|
|
||
|
"use strict";
|
||
|
|
||
|
var colors = require('chalk');
|
||
|
var gutil = require('gulp-util');
|
||
|
|
||
|
function verifyTaskSets(gulp, taskSets, skipArrays) {
|
||
|
if(taskSets.length === 0) {
|
||
|
throw new Error('No tasks were provided to run-sequence');
|
||
|
}
|
||
|
var foundTasks = {};
|
||
|
taskSets.forEach(function(t) {
|
||
|
var isTask = typeof t === "string",
|
||
|
isArray = !skipArrays && Array.isArray(t);
|
||
|
if(!isTask && !isArray) {
|
||
|
throw new Error("Task "+t+" is not a valid task string.");
|
||
|
}
|
||
|
if(isTask && !gulp.hasTask(t)) {
|
||
|
throw new Error("Task "+t+" is not configured as a task on gulp. If this is a submodule, you may need to use require('run-sequence').use(gulp).");
|
||
|
}
|
||
|
if(skipArrays && isTask) {
|
||
|
if(foundTasks[t]) {
|
||
|
throw new Error("Task "+t+" is listed more than once. This is probably a typo.");
|
||
|
}
|
||
|
foundTasks[t] = true;
|
||
|
}
|
||
|
if(isArray) {
|
||
|
if(t.length === 0) {
|
||
|
throw new Error("An empty array was provided as a task set");
|
||
|
}
|
||
|
verifyTaskSets(gulp, t, true, foundTasks);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function runSequence(gulp) {
|
||
|
// load gulp directly when no external was passed
|
||
|
if(gulp === undefined) {
|
||
|
gulp = require('gulp');
|
||
|
}
|
||
|
|
||
|
// Slice and dice the input to prevent modification of parallel arrays.
|
||
|
var taskSets = Array.prototype.slice.call(arguments, 1).map(function(task) {
|
||
|
return Array.isArray(task) ? task.slice() : task;
|
||
|
}),
|
||
|
callBack = typeof taskSets[taskSets.length-1] === 'function' ? taskSets.pop() : false,
|
||
|
currentTaskSet,
|
||
|
|
||
|
finish = function(e) {
|
||
|
gulp.removeListener('task_stop', onTaskEnd);
|
||
|
gulp.removeListener('task_err', onError);
|
||
|
|
||
|
var error;
|
||
|
if (e && e.err) {
|
||
|
error = new gutil.PluginError('run-sequence(' + e.task + ')', e.err, {showStack: true});
|
||
|
}
|
||
|
|
||
|
if(callBack) {
|
||
|
callBack(error);
|
||
|
} else if(error) {
|
||
|
gutil.log(colors.red(error.toString()));
|
||
|
}
|
||
|
},
|
||
|
|
||
|
onError = function(err) {
|
||
|
finish(err);
|
||
|
},
|
||
|
onTaskEnd = function(event) {
|
||
|
var idx = currentTaskSet.indexOf(event.task);
|
||
|
if(idx > -1) {
|
||
|
currentTaskSet.splice(idx,1);
|
||
|
}
|
||
|
if(currentTaskSet.length === 0) {
|
||
|
runNextSet();
|
||
|
}
|
||
|
},
|
||
|
|
||
|
runNextSet = function() {
|
||
|
if(taskSets.length) {
|
||
|
var command = taskSets.shift();
|
||
|
if(!Array.isArray(command)) {
|
||
|
command = [command];
|
||
|
}
|
||
|
currentTaskSet = command;
|
||
|
gulp.start.apply(gulp, command);
|
||
|
} else {
|
||
|
finish();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
verifyTaskSets(gulp, taskSets);
|
||
|
|
||
|
gulp.on('task_stop', onTaskEnd);
|
||
|
gulp.on('task_err', onError);
|
||
|
|
||
|
runNextSet();
|
||
|
}
|
||
|
|
||
|
module.exports = runSequence.bind(null, undefined);
|
||
|
module.exports.use = function(gulp) {
|
||
|
return runSequence.bind(null, gulp);
|
||
|
};
|