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.
83 lines
1.8 KiB
83 lines
1.8 KiB
var util = require('utils-extend');
|
|
/**
|
|
* @description
|
|
* @example
|
|
* `**\/*` match all files
|
|
* `*.js` only match current dir files
|
|
* '**\/*.js' match all js files
|
|
* 'path/*.js' match js files in path
|
|
* '!*.js' exclude js files
|
|
*/
|
|
function fileMatch(filter, ignore) {
|
|
if (filter === null) {
|
|
return function() {
|
|
return true;
|
|
};
|
|
} else if (filter === '' || (util.isArray(filter) && !filter.length)) {
|
|
return function() {
|
|
return false;
|
|
};
|
|
}
|
|
|
|
if (util.isString(filter)) {
|
|
filter = [filter];
|
|
}
|
|
|
|
var match = [];
|
|
var negate = [];
|
|
var isIgnore = ignore ? 'i' : '';
|
|
|
|
filter.forEach(function(item) {
|
|
var isNegate = item.indexOf('!') === 0;
|
|
item = item
|
|
.replace(/^!/, '')
|
|
.replace(/\*(?![\/*])/, '[^/]*?')
|
|
.replace('**\/', '([^/]+\/)*')
|
|
.replace(/\{([^\}]+)\}/g, function($1, $2) {
|
|
var collection = $2.split(',');
|
|
var length = collection.length;
|
|
var result = '(?:';
|
|
|
|
collection.forEach(function(item, index) {
|
|
result += '(' + item.trim() + ')';
|
|
|
|
if (index + 1 !== length) {
|
|
result += '|';
|
|
}
|
|
});
|
|
|
|
result += ')';
|
|
|
|
return result;
|
|
})
|
|
.replace(/([\/\.])/g, '\\$1');
|
|
|
|
item = '(^' + item + '$)';
|
|
|
|
if (isNegate) {
|
|
negate.push(item);
|
|
} else {
|
|
match.push(item);
|
|
}
|
|
});
|
|
|
|
match = match.length ? new RegExp(match.join('|'), isIgnore) : null;
|
|
negate = negate.length ? new RegExp(negate.join('|'), isIgnore) : null;
|
|
|
|
return function(filepath) {
|
|
// Normalize \\ paths to / paths.
|
|
filepath = util.path.unixifyPath(filepath);
|
|
|
|
if (negate && negate.test(filepath)) {
|
|
return false;
|
|
}
|
|
|
|
if (match && match.test(filepath)) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
};
|
|
}
|
|
|
|
module.exports = fileMatch; |