Skip to content

Commit

Permalink
major refactor to breakup modules
Browse files Browse the repository at this point in the history
  • Loading branch information
reaganthomas committed Jun 30, 2015
1 parent 98c13d6 commit 768cc7e
Show file tree
Hide file tree
Showing 10 changed files with 302 additions and 190 deletions.
80 changes: 14 additions & 66 deletions build/index.js
Expand Up @@ -6,82 +6,30 @@ var path = require('path');
var _ = require('lodash');
var fs = require('fs');

var defaultOptions = {
taskDirectory: 'gulp-tasks',
plugins: {},
filenameDelimiter: '',
tasknameDelimiter: '',
config: {}
};

function voidFunction() {
return;
}
var validation = require('./validation');
var processor = require('./processor');

module.exports = function (options) {
var defaultOptions = {
taskDirectory: 'gulp-tasks',
plugins: {},
filenameDelimiter: '',
tasknameDelimiter: '',
config: {},
configFile: ''
};

options = _.assign(defaultOptions, options);

if (typeof options.taskDirectory !== 'string') {
throw new Error('Task directory must be a string containing the relative path to a task directory');
}
validation.validateOptions(options);

if (options.taskDirectory.slice(0, 2) === '.' + path.sep) {
options.taskDirectory = options.taskDirectory.slice(2);
}

options.taskDirectory = path.join(process.cwd(), options.taskDirectory);

var dirStat = fs.statSync(options.taskDirectory);
if (!dirStat.isDirectory()) {
throw new Error(options.taskDirectory + ' is not a directory');
}

function processDirectory(dir) {
function filterFilenames(filename) {
var file = path.resolve(dir, filename);
var extname = path.extname(filename);
return extname === '.js' || extname === '.coffee' || fs.statSync(file).isDirectory();
}

function mapFiles(filename) {
var file = path.resolve(dir, filename);

if (fs.statSync(file).isDirectory()) {
return { directory: true, filename: filename };
} else {
var taskname = path.basename(filename, path.extname(filename));
taskname = taskname.split(options.filenameDelimiter).join(options.tasknameDelimiter);
return { file: file, filename: filename, taskname: taskname };
}
}

function handleFileOrDirectory(obj) {
if (obj.directory) {
processDirectory(dir + '/' + obj.filename);
} else {
createTask(obj);
}
}

function createTask(obj) {
var taskinfo = require(obj.file)(gulp, _.defaults(options.config, _.omit(options, ['config', 'plugins'])), options.plugins);
var taskdeps = taskinfo.deps || [];
var taskparams = taskinfo.params || [];
var taskfn = taskinfo.deps || taskinfo.fn || taskinfo.params ? taskinfo.fn || voidFunction : taskinfo;

if (taskparams.length > 0) {
gulp.task(obj.taskname, taskdeps, function () {
async.map(taskparams, function (params, callback) {
taskfn(params, callback);
});
});
} else {
gulp.task(obj.taskname, taskdeps, taskfn);
}
}

fs.readdirSync(dir).filter(filterFilenames).map(mapFiles).forEach(handleFileOrDirectory);
}
validation.validateTaskDirectory(options.taskDirectory);

processDirectory(options.taskDirectory);
processor.processTaskDirectory(options, gulp);
};
63 changes: 63 additions & 0 deletions build/processor.js
@@ -0,0 +1,63 @@
'use strict';

var async = require('async');
var path = require('path');
var fs = require('fs');
var _ = require('lodash');

function voidFunction() {
return;
}

module.exports = {
processTaskDirectory: function processTaskDirectory(options, gulp) {
function processDirectory(dir) {
function filterFilenames(filename) {
var file = path.resolve(dir, filename);
var extname = path.extname(filename);
return extname === '.js' || extname === '.coffee' || fs.statSync(file).isDirectory();
}

function mapFiles(filename) {
var file = path.resolve(dir, filename);

if (fs.statSync(file).isDirectory()) {
return { directory: true, filename: filename };
} else {
var taskname = path.basename(filename, path.extname(filename));
taskname = taskname.split(options.filenameDelimiter).join(options.tasknameDelimiter);
return { file: file, filename: filename, taskname: taskname };
}
}

function handleFileOrDirectory(obj) {
if (obj.directory) {
processDirectory(dir + '/' + obj.filename);
} else {
createTask(obj);
}
}

function createTask(obj) {
var taskinfo = require(obj.file)(gulp, _.defaults(options.config, _.omit(options, ['config', 'plugins'])), options.plugins);
var taskdeps = taskinfo.deps || [];
var taskparams = taskinfo.params || [];
var taskfn = taskinfo.deps || taskinfo.fn || taskinfo.params ? taskinfo.fn || voidFunction : taskinfo;

if (taskparams.length > 0) {
gulp.task(obj.taskname, taskdeps, function () {
async.map(taskparams, function (params, callback) {
taskfn(params, callback);
});
});
} else {
gulp.task(obj.taskname, taskdeps, taskfn);
}
}

fs.readdirSync(dir).filter(filterFilenames).map(mapFiles).forEach(handleFileOrDirectory);
}

processDirectory(options.taskDirectory);
}
};
31 changes: 31 additions & 0 deletions build/validation.js
@@ -0,0 +1,31 @@
'use strict';

var fs = require('fs');

module.exports = {
validateOptions: function validateOptions(options) {
if (typeof options.taskDirectory !== 'string') {
throw new Error('Task directory must be a string containing the relative path to a task directory');
}

if (typeof options.filenameDelimiter !== 'string') {
throw new Error('Filename delimiter must be a string');
}

if (typeof options.tasknameDelimiter !== 'string') {
throw new Error('Taskname delimiter must be a string');
}

if (typeof options.configFile !== 'string') {
throw new Error('Config file must be a string containing the relative path to a config file');
}
},

validateTaskDirectory: function validateTaskDirectory(taskDirectory) {
var dirStat = fs.statSync(taskDirectory);

if (!dirStat.isDirectory()) {
throw new Error(taskDirectory + ' is not a directory');
}
}
};
71 changes: 39 additions & 32 deletions gulpfile.js
@@ -1,38 +1,45 @@
'use strict';
(function() {
'use strict';

var gulp = require('gulp');
var bump = require('gulp-bump');
var mocha = require('gulp-mocha');
var babel = require('gulp-babel');
var istanbul = require('gulp-istanbul');
var del = require('del');
var gulp = require('gulp');
var bump = require('gulp-bump');
var mocha = require('gulp-mocha');
var babel = require('gulp-babel');
var istanbul = require('gulp-istanbul');

gulp.task('build', function() {
return gulp.src('index.js')
.pipe(babel())
.pipe(gulp.dest('./build'));
});
gulp.task('clean', function(cb) {
del([ 'build/**' ], cb);
});

gulp.task('test', [ 'build' ], function() {
return gulp.src('./test/**/*.js', { read: false })
.pipe(mocha({ reporter: 'dot' }));
});
gulp.task('build', [ 'clean' ], function() {
return gulp.src('src/**/*.js')
.pipe(babel())
.pipe(gulp.dest('./build'));
});

gulp.task('coverage', [ 'build' ], function(cb) {
gulp.src('./build/index.js')
.pipe(istanbul())
.pipe(istanbul.hookRequire())
.on('finish', function() {
gulp.src('./test/**/*.js')
.pipe(mocha({ reporter: 'spec' }))
.pipe(istanbul.writeReports())
.on('end', cb);
});
});
gulp.task('test', [ 'build' ], function() {
return gulp.src('./test/**/*.js', { read: false })
.pipe(mocha({ reporter: 'dot' }));
});

gulp.task('bump', [ 'build', 'test' ], function() {
return gulp.src('./package.json')
.pipe(bump())
.pipe(gulp.dest('./'));
});
gulp.task('coverage', [ 'build' ], function(cb) {
gulp.src('build/**/*.js')
.pipe(istanbul())
.pipe(istanbul.hookRequire())
.on('finish', function() {
gulp.src('./test/**/*.js')
.pipe(mocha({ reporter: 'spec' }))
.pipe(istanbul.writeReports())
.on('end', cb);
});
});

gulp.task('default', [ 'build', 'test', 'bump' ]);
gulp.task('bump', [ 'build', 'test' ], function() {
return gulp.src('./package.json')
.pipe(bump())
.pipe(gulp.dest('./'));
});

gulp.task('default', [ 'clean', 'build', 'test', 'bump' ]);
})();
90 changes: 0 additions & 90 deletions index.js

This file was deleted.

2 changes: 1 addition & 1 deletion package.json
@@ -1,6 +1,6 @@
{
"name": "gulp-simple-task-loader",
"version": "1.1.9",
"version": "1.2.0",
"description": "A simple task loader for gulp",
"keywords": [
"gulp",
Expand Down

0 comments on commit 768cc7e

Please sign in to comment.