blob: 19b7d05a30a741ae4c4a57377383d8c3e9c0e54d [file]
const {Glob} = require('glob')
const inherits = require('util.inherits')
const {
IGNORE,
createTasks
} = require('./util')
const {sync} = require('./sync')
// Subclass of `glob.GlobSync`
// @param {string} pattern Pattern to be matched.
// @param {Object} options `options` for `glob`
// @param {function()} shouldIgnore Method to check whether a directory should be ignored.
// @constructor
function _Glob (pattern, options, callback, shouldIgnore) {
// We don't put this thing to argument `options` to avoid
// further problems, such as `options` validation.
// Use `Symbol` as much as possible to avoid confliction.
this[IGNORE] = shouldIgnore
Glob.call(this, pattern, options, callback)
}
inherits(_Glob, Glob)
_Glob.prototype._readdir = function _readdir (abs, inGlobStar, cb) {
const marked = this._mark(abs)
if (this[IGNORE] && this[IGNORE](marked)) {
return cb()
}
return Glob.prototype._readdir.call(this, abs, inGlobStar, cb)
}
function globOne (pattern, opts, ignore) {
return new Promise((resolve, reject) => {
new _Glob(pattern, opts, (err, files) => {
if (err) {
return reject(err)
}
resolve(files)
}, ignore)
})
}
exports.glob = (_patterns, options = {}) => {
if (options.sync) {
return sync(_patterns, options)
}
const {
patterns,
ignores,
join,
opts,
result
} = createTasks(_patterns, options)
if (result) {
return Promise.resolve(result)
}
return Promise.all(
patterns.map(pattern => globOne(pattern, opts, ignores))
)
.then(join)
}