You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

100 lines
2.1 KiB

4 years ago
'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;
};