diff --git a/lib/readconfigdir.js b/lib/readconfigdir.js index 421fd0e..a001b82 100644 --- a/lib/readconfigdir.js +++ b/lib/readconfigdir.js @@ -1,54 +1,51 @@ -var glob = require('glob'); -var async = require('async'); -var readfile = require('./readfile'); -var path = require('path'); +var parseDir = require('parse-dir'); var _ = require('lodash-node'); module.exports = function(dir, grunt, options) { + var files = parseDir(dir + '/' + '*.{js,json,yml,yaml,coffee,ls}'); + var result = {}; - var getKey = function(file) { - var ext = path.extname(file); - var base = path.basename(file, ext); - return base; - }; + files.forEach(function(file) { + var content = file.contents; + var fileName = file.basename; - var files = glob.sync('*.{js,json,yml,yaml,coffee,ls}', { cwd: dir }); + if (_.isFunction(content)) { + content = content(grunt, options); + } - var fullPaths = files.map(function(file) { - return path.join(dir, file); - }); + // Check if multi config + if (fileName.match(/-tasks$/)) { + var target = fileName.replace(/-tasks$/, ''); + var newTarget; + var spl; + var originalKey; - var obj = {}; - fullPaths.forEach(function(path) { - var result = readfile(path); - var key = getKey(path); - if (_.isFunction(result)) { - result = result(grunt, options); - } + for (var newKey in content) { + if (content.hasOwnProperty(newKey)) { + newTarget = target; + originalKey = newKey; - //check if multi config - if (key.match(/-tasks$/)) { - var target = key.replace(/-tasks$/, ''); - for (var newKey in result) { - var newTarget = target; - var originalKey = newKey; - if (newKey.indexOf('__') != -1) { - var spl = newKey.split('__'); - newKey = spl[0]; - newTarget = target + '_' + spl[1]; - } - if (!obj[newKey]) { - obj[newKey] = {}; + if (newKey.indexOf('__') != -1) { + spl = newKey.split('__'); + newKey = spl.shift(); + newTarget = target + '_' + spl.shift(); + } + + if (!result[newKey]) { + result[newKey] = {}; + } + + result[newKey][newTarget] = content[originalKey]; } - obj[newKey][newTarget] = result[originalKey]; } } else { - if (!obj[key]) { - obj[key] = {}; + if (!result[fileName]) { + result[fileName] = {}; } - obj[key] = _.merge(obj[key], result); + + result[fileName] = _.merge(result[fileName], content); } }); - return obj; + return result; }; diff --git a/lib/readfile.js b/lib/readfile.js deleted file mode 100644 index 6c41657..0000000 --- a/lib/readfile.js +++ /dev/null @@ -1,28 +0,0 @@ -var path = require('path'); -var yaml = require('js-yaml'); -var fs = require('fs'); - -module.exports = function(file) { - - // check for existence first - if (!fs.existsSync(file)) { - throw new Error(file + ' doesn\'t exist'); - } - - var ext = path.extname(file); - - // YAML file - if (ext.match(/ya?ml/)) { - var res = fs.readFileSync(file, 'utf8'); - return yaml.safeLoad(res); - } - - // JS / JSON / CoffeeScript - if (ext.match(/json|js|coffee|ls/)) { - return require(file); - } - - // unknown - throw new Error(file + ' is an unsupported filetype'); - -}; diff --git a/package.json b/package.json index fe69bb8..a48fec9 100644 --- a/package.json +++ b/package.json @@ -30,11 +30,12 @@ "proxyquire": "^0.5.3" }, "dependencies": { + "async": "~0.2.10", "glob": "~3.2.6", + "jit-grunt": "~0.7.0", "js-yaml": "~3.0.1", "load-grunt-tasks": "~0.3.0", - "jit-grunt": "~0.7.0", "lodash-node": "~2.4.1", - "async": "~0.2.10" + "parse-dir": "0.0.3" } } diff --git a/test/readfile.test.js b/test/readfile.test.js deleted file mode 100644 index 6a219fa..0000000 --- a/test/readfile.test.js +++ /dev/null @@ -1,60 +0,0 @@ -/* global suite,test */ - -var assert = require('assert'); -var readfile = require('../lib/readfile'); - -suite('readfile', function() { - - test('read non-existing file', function() { - assert.throws(function() { - readfile(__dirname+'/config/fakefile.yaml'); - }); - }); - - test('read yaml file', function() { - var yaml = readfile(__dirname+'/config/yamlfile.yaml'); - assert.equal(yaml.yamlFile.options.filename, 'read.yaml'); - }); - - test('read yml file', function() { - var yaml = readfile(__dirname+'/config/ymlfile.yml'); - assert.equal(yaml.ymlFile.options.filename, 'read.yml'); - }); - - test('read json file', function() { - var json = readfile(__dirname+'/config/jsonfile.json'); - assert.equal(json.jsonFile.options.filename, 'read.json'); - }); - - test('read js object file', function() { - var json = readfile(__dirname+'/config/jsobj.js'); - assert.equal(json.jsobjFile.options.filename, 'jsobj.js'); - }); - - test('read js file with function, returns function', function() { - var fn = readfile(__dirname+'/config/jsfun.js'); - assert.equal(typeof fn, 'function'); - //fn takes two args, grunt and options - var obj = fn({}, { test: 1 }); - assert.equal(obj.jsFunFile.options.filename, 'jsfun.js'); - assert.equal(obj.jsFunFile.options.test, 1); - }); - - test('read coffee file', function() { - var json = readfile(__dirname+'/config/coffeefile.coffee'); - assert.equal(json.coffeeFile.options.filename, 'read.coffee'); - }); - - test('read missing coffee file', function() { - assert.throws(function() { - readfile(__dirname+'/config/coffeefile2.coffee'); - }); - }); - - test('read unsupported file', function() { - assert.throws(function() { - readfile(__dirname+'/config/htmlfile.html'); - }); - }); - -});