Home Reference Source

src/index.js

import glob from 'glob';
import path from 'path';
import { getOptions, getFactory, getPath } from './utils';
import Logger from './logger';
import Group from './group';
import Filter from './filter';

const SUCESS_MESSAGE = 'Registered task:';
const FAILURE_MESSAGE = 'Failed to register task:';

/**
 * Iterates over target directory and registers gulp tasks by invoking task factories.
 * Task name is based on its path.
 * @param params
 * @param params.gulp {Object} - Gulp instance.
 * @param params.dir {String} - Full path to task factories directory.
 * @param params.args {Array<any>} - Arguments to pass to task factories. optionsional.
 * @param params.verbose {Boolean} - Defines whether to push to console logs. optionsional. Default false.
 * @param params.panic {Boolean} - Defines whether to throw error if task registration failed. optionsional. Default true.
 * @param params.group {Boolean} - Defines whether to create gulp task based on folder name and add nested tasks as dependencies.
 * @param params.filter {String|Function} - Defines a filter using either a regexp expression or a function. Optional.
 */
module.exports = function registrator(params) {
    const options = getOptions(params);
    const logger = Logger.create(options.verbose);
    const group = Group(options.group);
    const filter = Filter(options.filter);

    glob.sync(path.join(options.dir, '/**/*.js')).forEach((file) => {
        let taskFullName = '';

        try {
            const taskName = path.basename(file, '.js');
            const taskPath = getPath(options.dir, path.dirname(file));
            const factory = getFactory(require(file));

            if (filter(file) === true) {
                if (taskPath) {
                    taskFullName = `${taskPath}:${taskName}`;
                } else {
                    taskFullName = taskName;
                }

                const task = factory(...options.args);

                options.gulp.task(taskFullName, task.dependencies || [], task);

                group.push(taskFullName);

                logger.info(SUCESS_MESSAGE, Logger.colors.cyan(taskFullName));
            }
        } catch (err) {
            logger.error(FAILURE_MESSAGE, Logger.colors.cyan(taskFullName), err.toString());

            if (options.panic) {
                throw err;
            }
        }
    });

    group.forEach((task) => {
        try {
            options.gulp.task(task.name, task.dependencies);
            logger.info(SUCESS_MESSAGE, Logger.colors.cyan(task.name));
        } catch (err) {
            logger.error(FAILURE_MESSAGE, Logger.colors.cyan(task.name), err.toString());

            if (options.panic) {
                throw err;
            }
        }
    });
};