| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 | /*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);};
 |