|  | /* | 
|  | 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 | 
|  | }; |