'use strict'; var glob = require('glob'); /** * Expand one or more patterns into an Array of files. * * ## Examples: * * ``` * globs('../*.js', function (err, jsfiles) { * console.log(jsfiles); * }) * * globs(['*.js', '../*.js'], function (err, jsfiles) { * console.log(jsfiles) * }) * * globs(['*.js', '../*.js'], { cwd: '/foo' }, function (err, jsfiles) { * console.log(jsfiles) * }) * ``` * * @param {String|Array} patterns One or more patterns to match * @param {Object} [options] Options * @param {Function} callback Function which accepts two parameters: err, files */ var globs = module.exports = function (patterns, options, callback) { var pending , groups = []; // not an Array? make it so! if (!Array.isArray(patterns)) { patterns = [ patterns ]; } pending = patterns.length; // parameter shifting is really horrible, but i'm // mimicing glob's api... if (typeof options === 'function') { callback = options; options = {}; } if (!pending) { // nothing to do // ensure callback called asynchronously return process.nextTick(function() { callback(null, []); }) } // walk the patterns patterns.forEach(function (pattern) { // grab the files glob(pattern, options, function (err, files) { if (err) { return callback(err); } // add the files to the group groups = groups.concat(files); pending -= 1; // last pattern? if (!pending) { // done return callback(null, groups); } }); }); }; /** * Synchronously Expand one or more patterns to an Array of files * * @api public * @param {String|Array} patterns * @param {Object} [options] * @return {Array} */ globs.sync = function (patterns, options) { options = options || {}; var groups = [] , index , length; if (!Array.isArray(patterns)) { patterns = [ patterns ]; } for (index = 0, length = patterns.length; index < length; index++) { groups = groups.concat(glob.sync(patterns[index], options)); } return groups; };