| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 | 
							- /*
 
-  * globule
 
-  * https://github.com/cowboy/node-globule
 
-  *
 
-  * Copyright (c) 2013 "Cowboy" Ben Alman
 
-  * Licensed under the MIT license.
 
-  */
 
- 'use strict';
 
- var fs = require('fs');
 
- var path = require('path');
 
- var _ = require('lodash');
 
- var glob = require('glob');
 
- var minimatch = require('minimatch');
 
- // The module.
 
- var globule = exports;
 
- // Process specified wildcard glob patterns or filenames against a
 
- // callback, excluding and uniquing files in the result set.
 
- function processPatterns(patterns, fn) {
 
-   return _.flatten(patterns).reduce(function(result, pattern) {
 
-     if (pattern.indexOf('!') === 0) {
 
-       // If the first character is ! all matches via this pattern should be
 
-       // removed from the result set.
 
-       pattern = pattern.slice(1);
 
-       return _.difference(result, fn(pattern));
 
-     } else {
 
-       // Otherwise, add all matching filepaths to the result set.
 
-       return _.union(result, fn(pattern));
 
-     }
 
-   }, []);
 
- }
 
- // Match a filepath or filepaths against one or more wildcard patterns. Returns
 
- // all matching filepaths. This behaves just like minimatch.match, but supports
 
- // any number of patterns.
 
- globule.match = function(patterns, filepaths, options) {
 
-   // Return empty set if either patterns or filepaths was omitted.
 
-   if (patterns == null || filepaths == null) { return []; }
 
-   // Normalize patterns and filepaths to arrays.
 
-   if (!_.isArray(patterns)) { patterns = [patterns]; }
 
-   if (!_.isArray(filepaths)) { filepaths = [filepaths]; }
 
-   // Return empty set if there are no patterns or filepaths.
 
-   if (patterns.length === 0 || filepaths.length === 0) { return []; }
 
-   // Return all matching filepaths.
 
-   return processPatterns(patterns, function(pattern) {
 
-     return minimatch.match(filepaths, pattern, options || {});
 
-   });
 
- };
 
- // Match a filepath or filepaths against one or more wildcard patterns. Returns
 
- // true if any of the patterns match.
 
- globule.isMatch = function() {
 
-   return globule.match.apply(null, arguments).length > 0;
 
- };
 
- // Return an array of all file paths that match the given wildcard patterns.
 
- globule.find = function() {
 
-   var args = _.toArray(arguments);
 
-   // If the last argument is an options object, remove it from args.
 
-   var options = _.isPlainObject(args[args.length - 1]) ? args.pop() : {};
 
-   // Use the first argument if it's an Array, otherwise use all arguments.
 
-   var patterns = _.isArray(args[0]) ? args[0] : args;
 
-   // Return empty set if there are no patterns or filepaths.
 
-   if (patterns.length === 0) { return []; }
 
-   var srcBase = options.srcBase || options.cwd;
 
-   // Create glob-specific options object.
 
-   var globOptions = _.extend({}, options);
 
-   if (srcBase) {
 
-     globOptions.cwd = srcBase;
 
-   }
 
-   // Get all matching filepaths.
 
-   var matches = processPatterns(patterns, function(pattern) {
 
-     return glob.sync(pattern, globOptions);
 
-   });
 
-   // If srcBase and prefixBase were specified, prefix srcBase to matched paths.
 
-   if (srcBase && options.prefixBase) {
 
-     matches = matches.map(function(filepath) {
 
-       return path.join(srcBase, filepath);
 
-     });
 
-   }
 
-   // Filter result set?
 
-   if (options.filter) {
 
-     matches = matches.filter(function(filepath) {
 
-       // If srcBase was specified but prefixBase was NOT, prefix srcBase
 
-       // temporarily, for filtering.
 
-       if (srcBase && !options.prefixBase) {
 
-         filepath = path.join(srcBase, filepath);
 
-       }
 
-       try {
 
-         if (_.isFunction(options.filter)) {
 
-           return options.filter(filepath, options);
 
-         } else {
 
-           // If the file is of the right type and exists, this should work.
 
-           return fs.statSync(filepath)[options.filter]();
 
-         }
 
-       } catch(err) {
 
-         // Otherwise, it's probably not the right type.
 
-         return false;
 
-       }
 
-     });
 
-   }
 
-   return matches;
 
- };
 
- var pathSeparatorRe = /[\/\\]/g;
 
- var extDotRe = {
 
-   first: /(\.[^\/]*)?$/,
 
-   last: /(\.[^\/\.]*)?$/,
 
- };
 
- function rename(dest, options) {
 
-   // Flatten path?
 
-   if (options.flatten) {
 
-     dest = path.basename(dest);
 
-   }
 
-   // Change the extension?
 
-   if (options.ext) {
 
-     dest = dest.replace(extDotRe[options.extDot], options.ext);
 
-   }
 
-   // Join dest and destBase?
 
-   if (options.destBase) {
 
-     dest = path.join(options.destBase, dest);
 
-   }
 
-   return dest;
 
- }
 
- // Build a mapping of src-dest filepaths from the given set of filepaths.
 
- globule.mapping = function(filepaths, options) {
 
-   // Return empty set if filepaths was omitted.
 
-   if (filepaths == null) { return []; }
 
-   options = _.defaults({}, options, {
 
-     extDot: 'first',
 
-     rename: rename,
 
-   });
 
-   var files = [];
 
-   var fileByDest = {};
 
-   // Find all files matching pattern, using passed-in options.
 
-   filepaths.forEach(function(src) {
 
-     // Generate destination filename.
 
-     var dest = options.rename(src, options);
 
-     // Prepend srcBase to all src paths.
 
-     if (options.srcBase) {
 
-       src = path.join(options.srcBase, src);
 
-     }
 
-     // Normalize filepaths to be unix-style.
 
-     dest = dest.replace(pathSeparatorRe, '/');
 
-     src = src.replace(pathSeparatorRe, '/');
 
-     // Map correct src path to dest path.
 
-     if (fileByDest[dest]) {
 
-       // If dest already exists, push this src onto that dest's src array.
 
-       fileByDest[dest].src.push(src);
 
-     } else {
 
-       // Otherwise create a new src-dest file mapping object.
 
-       files.push({
 
-         src: [src],
 
-         dest: dest,
 
-       });
 
-       // And store a reference for later use.
 
-       fileByDest[dest] = files[files.length - 1];
 
-     }
 
-   });
 
-   return files;
 
- };
 
- // Return a mapping of src-dest filepaths from files matching the given
 
- // wildcard patterns.
 
- globule.findMapping = function(patterns, options) {
 
-   return globule.mapping(globule.find(patterns, options), options);
 
- };
 
 
  |