gulp-add-tasks2
Version:
A tool to add tasks to a passed-in gulp instance, as a task list, or as a map of functions
157 lines (156 loc) • 5.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const run_sequence_1 = require("gulp-run-seq-unique/run-sequence");
exports.runSequence = run_sequence_1.default;
//import * as runSequence from 'run-sequence';
const gulpHelp = require("gulp-help");
exports.gulpHelp = gulpHelp;
const SEP = ':';
exports.SEP = SEP;
function looksLikeGulp(gulp) {
return !!(gulp.task && gulp.watch && gulp.src && gulp.dest);
}
exports.looksLikeGulp = looksLikeGulp;
function looksLikeGulpHelp(gulp) {
return !!(gulp.tasks.help);
}
exports.looksLikeGulpHelp = looksLikeGulpHelp;
function getOptions(impl) {
const options = (impl.options || {});
if (options.options || options.aliases) {
return options;
}
return {
options: impl.options || {},
aliases: impl.aliases || []
};
}
exports.getOptions = getOptions;
function isTaskListObject(impl = {}) {
return Object.keys(impl).indexOf('tasks') > -1;
}
exports.isTaskListObject = isTaskListObject;
function getTasks(tasks, parentTask = '', cache = exports.defaultGulpAddTasksOptions) {
if (typeof tasks === 'function') {
tasks = tasks();
}
for (let i in tasks) {
if (Array.isArray(tasks[i])) {
tasks[i] = prefixTasks(tasks[i], parentTask, cache);
}
else if (typeof tasks[i] == 'string') {
tasks[i] = prefixTasks([tasks[i]], parentTask, cache)[0];
}
}
return tasks || [];
}
exports.getTasks = getTasks;
function prefixTasks(tasks = [], parentTask = '', cache = exports.defaultGulpAddTasksOptions) {
if (tasks && !Array.isArray(tasks)) {
tasks = [tasks];
}
return (tasks || []).map(function (v) {
if (typeof v !== 'string')
return v;
if (!cache.sep) {
return v;
}
if (cache.root !== '' && v.indexOf(`~${cache.sep}`) === 0) {
return v.replace(`~${cache.sep}`, `${cache.root}${cache.sep}`);
}
if (v.indexOf(cache.sep) === 0) {
if (parentTask === '') {
return v.substr(cache.sep.length);
}
return parentTask + v;
}
return v;
});
}
exports.prefixTasks = prefixTasks;
function validTaskObject(taskObject) {
let type = typeof taskObject;
if (type === 'function') {
return taskObject;
}
if (type === 'object') {
for (let k of Object.keys(taskObject)) {
if (['function', 'object', 'string'].includes(typeof taskObject[k])) {
return taskObject;
}
}
}
return false;
}
exports.validTaskObject = validTaskObject;
function addTasksToGulp(gulp, rs, taskObject, parentTask = '', cache = exports.defaultGulpAddTasksOptions) {
for (let taskName in taskObject) {
const taskImpl = taskObject[taskName];
if (parentTask) {
taskName = `${parentTask}:${taskName}`;
}
if (Object.keys(taskImpl).indexOf('callback') > -1) {
let taskFn;
if (isTaskListObject(taskImpl)) {
taskFn = async function (...argv) {
await new Promise(function (resolve, reject) {
rs.use(gulp)(...(getTasks(taskImpl.tasks, parentTask, cache).concat(resolve)));
});
await taskImpl.callback.call(this, ...argv);
};
}
else {
taskFn = taskImpl.callback;
}
gulp.task(taskName, taskImpl.description, prefixTasks(taskImpl.deps, parentTask, cache), taskFn, getOptions(taskImpl));
}
else if (typeof taskImpl === 'function' || isTaskListObject(taskImpl)) {
const taskFn = typeof taskImpl === 'function' ? taskImpl : function (done) {
return rs.use(gulp)(...(getTasks(taskImpl.tasks, parentTask, cache)).concat(done));
};
gulp.task(taskName, taskImpl.description, prefixTasks(taskImpl.deps, parentTask, cache), taskFn, getOptions(taskImpl));
}
else if (Object.keys(taskImpl).indexOf('deps') > -1) {
gulp.task(taskName, taskImpl.description, prefixTasks(taskImpl.deps, parentTask, cache), () => { }, getOptions(taskImpl));
}
else if (!validTaskObject(taskImpl)) {
let { inspect } = require('util');
throw new TypeError(`argument:taskObject ${inspect(taskImpl)} not a valid ITaskObject`);
}
else {
addTasksToGulp(gulp, rs, taskImpl, taskName, cache);
}
}
}
exports.addTasksToGulp = addTasksToGulp;
exports.defaultGulpAddTasksOptions = {
sep: SEP,
runSequence: run_sequence_1.default,
gulpHelp: gulpHelp,
};
function gulpAddTasks(gulpInstance, parentTaskName = '', options = exports.defaultGulpAddTasksOptions) {
if (!looksLikeGulp(gulpInstance)) {
throw new Error('An instance of gulp is required as the first argument');
}
if (Array.isArray(parentTaskName)) {
parentTaskName = parentTaskName.join(options.sep ? options.sep : SEP);
}
const cache = Object.assign({
root: parentTaskName,
}, exports.defaultGulpAddTasksOptions, options);
return function (...taskObjects) {
const runSequence = cache.runSequence;
const gulpHelp = cache.gulpHelp;
const gulp = looksLikeGulpHelp(gulpInstance) ? gulpInstance : gulpHelp(gulpInstance);
gulp.options = gulp.options || {};
gulp.options.gulpAddTasks = cache;
taskObjects
.forEach((taskObject) => {
addTasksToGulp(gulp, runSequence, taskObject, parentTaskName, cache);
});
return gulp;
};
}
exports.gulpAddTasks = gulpAddTasks;
exports.init = gulpAddTasks;
exports.default = gulpAddTasks;