| /* |
| Copyright 2012-2015, Yahoo Inc. |
| Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. |
| */ |
| const fs = require('fs'); |
| const path = require('path'); |
| const async = require('async'); |
| const fileset = require('fileset'); |
| let seq = 0; |
| |
| function filesFor(options, callback) { |
| if (!callback && typeof options === 'function') { |
| callback = options; |
| options = null; |
| } |
| options = options || {}; |
| |
| let root = options.root; |
| let includes = options.includes; |
| let excludes = options.excludes; |
| const realpath = options.realpath; |
| const relative = options.relative; |
| |
| root = root || process.cwd(); |
| includes = includes && Array.isArray(includes) ? includes : ['**/*.js']; |
| excludes = |
| excludes && Array.isArray(excludes) ? excludes : ['**/node_modules/**']; |
| |
| const opts = { cwd: root, nodir: true, ignore: excludes }; |
| seq += 1; |
| opts['x' + seq + new Date().getTime()] = true; //cache buster for minimatch cache bug |
| fileset(includes.join(' '), excludes.join(' '), opts, (err, files) => { |
| /* istanbul ignore if - untestable */ |
| if (err) { |
| return callback(err); |
| } |
| if (relative) { |
| return callback(err, files); |
| } |
| |
| if (!realpath) { |
| files = files.map(file => path.resolve(root, file)); |
| return callback(err, files); |
| } |
| |
| const realPathCache = |
| module.constructor._realpathCache || /* istanbul ignore next */ {}; |
| |
| async.map( |
| files, |
| (file, done) => { |
| fs.realpath(path.resolve(root, file), realPathCache, done); |
| }, |
| callback |
| ); |
| }); |
| } |
| |
| function matcherFor(options, callback) { |
| if (!callback && typeof options === 'function') { |
| callback = options; |
| options = null; |
| } |
| options = options || {}; |
| options.relative = false; //force absolute paths |
| options.realpath = true; //force real paths (to match Node.js module paths) |
| |
| filesFor(options, (err, files) => { |
| const fileMap = Object.create(null); |
| /* istanbul ignore if - untestable */ |
| if (err) { |
| return callback(err); |
| } |
| files.forEach(file => { |
| fileMap[file] = true; |
| }); |
| |
| const matchFn = function(file) { |
| return fileMap[file]; |
| }; |
| matchFn.files = Object.keys(fileMap); |
| return callback(null, matchFn); |
| }); |
| } |
| |
| module.exports = { |
| filesFor, |
| matcherFor |
| }; |