Skip to content

Commit

Permalink
github issue #6 -- config file
Browse files Browse the repository at this point in the history
  • Loading branch information
reaganthomas committed Jul 7, 2015
1 parent 303b081 commit 39342b7
Show file tree
Hide file tree
Showing 24 changed files with 908 additions and 415 deletions.
3 changes: 3 additions & 0 deletions .jshintrc
@@ -0,0 +1,3 @@
{
"esnext": true
}
34 changes: 31 additions & 3 deletions README.md
Expand Up @@ -24,6 +24,7 @@ Easily modularize gulp tasks and minify your gulpfile. Works well with [gulp-loa
* [Plugins](#options-plugins)
* [Using gulp-load-plugins](#options-plugins-using-gulp-load-plugins)
* [Passing in plugins manually](#options-plugins-passing-in-plugins-manually)
* [Config File](#options-config-file)
* [Structuring a task](#structuring-a-task)
* [Basic Tasks](#structuring-a-task-basic-tasks)
* [Tasks with dependencies and/or parameters](#structuring-a-task-tasks-with-dependencies-and-or-parameters)
Expand Down Expand Up @@ -66,7 +67,8 @@ taskLoader({
plugins: {}, // the plugins to expose to your tasks
filenameDelimiter: '', // a character or string of characters to replace in task filenames
taskDelimiter: '', // a character or string of characters to insert in place of removed filenameDelimiter
config: {} // an object to store configuration for use in tasks
config: {}, // an object to store configuration for use in tasks
configFile: '' // the relative path to your task configuration file from your task directory
});
```

Expand Down Expand Up @@ -107,6 +109,7 @@ taskLoader({ plugins: plugins });
If not using gulp-load-plugins you must specify which plugins you want made available to your tasks.

```js
(gulpfile.js)
'use strict';

var taskLoader = require('gulp-simple-task-loader');
Expand All @@ -118,6 +121,29 @@ var plugins = {
taskLoader({ plugins: plugins });
```

<h3 id="options-config-file">Config File</h3>

You have the option of passing in the location of a configuration file from within your task directory. Please note that the configuration file takes precedence over the `config` option that you may also pass in, meaning that any key in `config` is overwritten if the same key exists in the config file.

```js
(gulpfile.js)
'use strict';

var taskLoader = require('gulp-simple-task-loader');
var config = { env: 'production' };

taskLoader({ config: config, configFile: 'config.js' });
```

```js
(config.js)
'use strict';

module.exports = {
// insert configuration options here
};
```

<h2 id="structuring-a-task">Structuring a task</h2>

All tasks should be functions that receive the parameters `gulp`, `config`, and `plugins`.
Expand All @@ -138,7 +164,7 @@ module.exports = function(gulp, config, plugins) {

<h3 id="structuring-a-task-tasks-with-dependencies-and-or-parameters">Tasks with dependencies and/or parameters</h3>

All 3 object keys (`deps`, `params`, and `fn`) are optional. This allows you to create a task that strictly calls other tasks, a task that is parameterized, or a task that just acts like a normal task.
All 3 object keys (`deps`, `params`, and `fn`) are optional. This allows you to create a task that strictly calls other tasks, a task that is parameterized, or a task that just acts like a normal task.

If there are no dependencies or parameters for the task you can use the above "Basic task" format for creating a basic task.

Expand Down Expand Up @@ -266,6 +292,8 @@ The task in `parameterized.js` would produce the following output:
Documented below are any significant changes to the package.

* 1.x.x
* 1.3.x
* [1.3.0]() - added feature for passing in configuration file [github issue #6](https://github.com/reaganthomas/gulp-simple-task-loader/issues/6); restructured test suite to section out functionality
* 1.2.x
* [1.2.4](https://github.com/reaganthomas/gulp-simple-task-loader/commit/8aceeee667076cb9b86f8022427866820d51ce30) - added table of contents and changelog to README.md
* [1.2.1](https://github.com/reaganthomas/gulp-simple-task-loader/commit/767318e136aa7cb27925e73587487d11486ed50f) - added testing for `plugins` and `config` options
Expand All @@ -281,4 +309,4 @@ Documented below are any significant changes to the package.
* [1.0.17](https://github.com/reaganthomas/gulp-simple-task-loader/commit/e3d28d22ae085b2fd83ca914bfb3341962ab5f27) - added documentation for calling the plugin; added documentation for complete examples
* [1.0.16](https://github.com/reaganthomas/gulp-simple-task-loader/commit/5ddc6f5b5735538169d1123df5299e2e1cb0f794) - created README.md
* [1.0.15](https://github.com/reaganthomas/gulp-simple-task-loader/commit/0833009aefb217673891387916642c5ed1a53be9) - added dependency support for tasks
* [1.0.14](https://github.com/reaganthomas/gulp-simple-task-loader/commit/e178e6ca2dfb5e571ea622cb56d5915ad7954e48) - implemented first set of tests
* [1.0.14](https://github.com/reaganthomas/gulp-simple-task-loader/commit/e178e6ca2dfb5e571ea622cb56d5915ad7954e48) - implemented first set of tests
65 changes: 38 additions & 27 deletions build/index.js
@@ -1,35 +1,46 @@
'use strict';

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

var validation = require('./validation');
var processor = require('./processor');

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

var gulp = require('gulp');
var path = require('path');
var _ = require('lodash');

var transformer = require('./transformer');
var validation = require('./validation');
var processor = require('./processor');

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

validation.validateOptions(options);
options = _.assign(defaultOptions, options);
validation.validateOptions(options);

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

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

validation.validateTaskDirectory(options.taskDirectory);
options.configFile = options.configFile ? path.join(options.taskDirectory, options.configFile) : null;
validation.validateConfigFile(options.configFile);

if (options.configFile !== '') {
options.config = _.assign(options.config, require(options.configFile));
}

processor.processTaskDirectory(options, gulp);
};
})();

processor.processTaskDirectory(options, gulp);
};
/* Todo
- Possible plugins file?
*/
114 changes: 65 additions & 49 deletions build/processor.js
@@ -1,63 +1,79 @@
'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 () {
'use strict';

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

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

function isConfigFile(configFile, filename) {
return configFile && configFile.indexOf(filename) !== -1;
}

function hasValidExtension(filename) {
var extname = path.extname(filename);
return extname === '.js' || extname === '.coffee';
}

function isDirectory(directory, filename) {
var file = path.resolve(directory, filename);
return fs.statSync(file).isDirectory();
}

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 };
module.exports = {
processTaskDirectory: function processTaskDirectory(options, gulp) {
function processDirectory(dir) {
function filterFilenames(filename) {
return !isConfigFile(options.configFile, filename) && (hasValidExtension(filename) || isDirectory(dir, filename));
}
}

function handleFileOrDirectory(obj) {
if (obj.directory) {
processDirectory(dir + '/' + obj.filename);
} else {
createTask(obj);
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;
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);
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);
} else {
gulp.task(obj.taskname, taskdeps, taskfn);
}
}

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

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

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

(function () {
'use strict';

var path = require('path');

function removeDotSlash(relativePath) {
if (relativePath.slice(0, 2) === '.' + path.sep) {
relativePath = relativePath.slice(2);
}

return relativePath;
}

module.exports = {
transformTaskDirectory: function transformTaskDirectory(taskDirectory) {
return removeDotSlash(taskDirectory);
},

transformConfigFile: function transformConfigFile(configFile) {
configFile = removeDotSlash(configFile);
return configFile.length !== 0 ? configFile : null;
}
};
})();

0 comments on commit 39342b7

Please sign in to comment.