Skip to content

Commit

Permalink
closes #91
Browse files Browse the repository at this point in the history
  • Loading branch information
jonschlinkert committed May 31, 2017
1 parent e47fc91 commit 7880461
Show file tree
Hide file tree
Showing 3 changed files with 148 additions and 129 deletions.
27 changes: 13 additions & 14 deletions index.js
Expand Up @@ -67,18 +67,6 @@ function micromatch(list, patterns, options) {
}
}

// minimatch.match parity
if (negated && keep.length === 0) {
if (options && options.unixify === false) {
keep = list.slice();
} else {
var unixify = utils.unixify(options);
for (var i = 0; i < list.length; i++) {
keep.push(unixify(list[i]));
}
}
}

var matches = utils.diff(keep, omit);
if (!options || options.nodupes !== false) {
return utils.unique(matches);
Expand Down Expand Up @@ -519,7 +507,11 @@ micromatch.matcher = function matcher(pattern, options) {
}

var fn = test(re);
fn.result = re.result;
Object.defineProperty(fn, 'result', {
configurable: true,
enumerable: false,
value: re.result
});
return fn;
};

Expand Down Expand Up @@ -558,7 +550,11 @@ micromatch.makeRe = function(pattern, options) {
});

var regex = toRegex(output.join('|'), options);
regex.result = asts;
Object.defineProperty(regex, 'result', {
configurable: true,
enumerable: false,
value: asts
});
return regex;
}

Expand Down Expand Up @@ -590,6 +586,9 @@ micromatch.braces = function(pattern, options) {
function expand() {
if (options && options.nobrace === true) return [pattern];
if (!/\{.*\}/.test(pattern)) return [pattern];
// if (/[!@*?+]\{/.test(pattern)) {
// options = utils.extend({}, options, {expand: true});
// }
return braces(pattern, options);
}

Expand Down
241 changes: 126 additions & 115 deletions test/api.js
@@ -1,97 +1,108 @@
'use strict';

var assert = require('assert');
var path = require('path');
var sep = path.sep;
var mm = require('./support/match');
var matcher = require('./support/match');
var mm = require('..');

describe('micromatch', function() {
describe('empty list', function() {
it('should return an empty array', function() {
mm([], '*', []);
matcher([], '*', []);
});
});

describe('options.nodupes', function() {
it('should return an array with duplicates', function() {
mm(['a', 'a', 'a'], ['*', 'a*'], {nodupes: false}, ['a', 'a', 'a', 'a', 'a', 'a']);
matcher(['a', 'a', 'a'], ['*', 'a*'], {nodupes: false}, ['a', 'a', 'a', 'a', 'a', 'a']);
});
});

describe('posix paths', function() {
it('should return an array of matches for a literal string', function() {
mm(['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c'], '(a/b)', ['a/b']);
mm(['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c'], 'a/b', ['a/b']);
matcher(['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c'], '(a/b)', ['a/b']);
matcher(['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c'], 'a/b', ['a/b']);
});

it('should return an array of matches for an array of literal strings', function() {
mm(['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c'], ['(a/b)', 'a/c'], ['a/b', 'a/c']);
mm(['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c'], ['a/b', 'b/b'], ['a/b', 'b/b']);
matcher(['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c'], ['(a/b)', 'a/c'], ['a/b', 'a/c']);
matcher(['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c'], ['a/b', 'b/b'], ['a/b', 'b/b']);
});

it('should support regex logical or', function() {
mm(['a/a', 'a/b', 'a/c'], ['a/(a|c)'], ['a/a', 'a/c']);
mm(['a/a', 'a/b', 'a/c'], ['a/(a|b|c)', 'a/b'], ['a/a', 'a/b', 'a/c']);
matcher(['a/a', 'a/b', 'a/c'], ['a/(a|c)'], ['a/a', 'a/c']);
matcher(['a/a', 'a/b', 'a/c'], ['a/(a|b|c)', 'a/b'], ['a/a', 'a/b', 'a/c']);
});

it('should support regex ranges', function() {
mm(['a/a', 'a/b', 'a/c'], 'a/[b-c]', ['a/b', 'a/c']);
mm(['a/a', 'a/b', 'a/c', 'a/x/y', 'a/x'], 'a/[a-z]', ['a/a', 'a/b', 'a/c', 'a/x']);
matcher(['a/a', 'a/b', 'a/c'], 'a/[b-c]', ['a/b', 'a/c']);
matcher(['a/a', 'a/b', 'a/c', 'a/x/y', 'a/x'], 'a/[a-z]', ['a/a', 'a/b', 'a/c', 'a/x']);
});

it('should support single globs (*)', function() {
var fixtures = ['a', 'b', 'a/a', 'a/b', 'a/c', 'a/x', 'a/a/a', 'a/a/b', 'a/a/a/a', 'a/a/a/a/a', 'x/y', 'z/z'];
mm(fixtures, ['*'], ['a', 'b']);
mm(fixtures, ['*/*'], ['a/a', 'a/b', 'a/c', 'a/x', 'x/y', 'z/z']);
mm(fixtures, ['*/*/*'], ['a/a/a', 'a/a/b']);
mm(fixtures, ['*/*/*/*'], ['a/a/a/a']);
mm(fixtures, ['*/*/*/*/*'], ['a/a/a/a/a']);
mm(fixtures, ['a/*'], ['a/a', 'a/b', 'a/c', 'a/x']);
mm(fixtures, ['a/*/*'], ['a/a/a', 'a/a/b']);
mm(fixtures, ['a/*/*/*'], ['a/a/a/a']);
mm(fixtures, ['a/*/*/*/*'], ['a/a/a/a/a']);
mm(fixtures, ['a/*/a'], ['a/a/a']);
mm(fixtures, ['a/*/b'], ['a/a/b']);
matcher(fixtures, ['*'], ['a', 'b']);
matcher(fixtures, ['*/*'], ['a/a', 'a/b', 'a/c', 'a/x', 'x/y', 'z/z']);
matcher(fixtures, ['*/*/*'], ['a/a/a', 'a/a/b']);
matcher(fixtures, ['*/*/*/*'], ['a/a/a/a']);
matcher(fixtures, ['*/*/*/*/*'], ['a/a/a/a/a']);
matcher(fixtures, ['a/*'], ['a/a', 'a/b', 'a/c', 'a/x']);
matcher(fixtures, ['a/*/*'], ['a/a/a', 'a/a/b']);
matcher(fixtures, ['a/*/*/*'], ['a/a/a/a']);
matcher(fixtures, ['a/*/*/*/*'], ['a/a/a/a/a']);
matcher(fixtures, ['a/*/a'], ['a/a/a']);
matcher(fixtures, ['a/*/b'], ['a/a/b']);
});

it('should support globstars (**)', function() {
var fixtures = ['a', 'a/', 'a/a', 'a/b', 'a/c', 'a/x', 'a/x/y', 'a/x/y/z'];
mm(fixtures, ['*'], ['a', 'a/']);
mm(fixtures, ['*/'], ['a/']);
mm(fixtures, ['*/*'], ['a/a', 'a/b', 'a/c', 'a/x']);
mm(fixtures, ['**'], fixtures);
mm(fixtures, ['**/a'], ['a', 'a/', 'a/a']);
mm(fixtures, ['a/*'], ['a/a', 'a/b', 'a/c', 'a/x']);
mm(fixtures, ['a/**'], ['a/', 'a/a', 'a/b', 'a/c', 'a/x', 'a/x/y', 'a/x/y/z']);
mm(fixtures, ['a/**/*'], ['a/a', 'a/b', 'a/c', 'a/x', 'a/x/y', 'a/x/y/z']);
mm(fixtures, ['a/**/**/*'], ['a/a', 'a/b', 'a/c', 'a/x', 'a/x/y', 'a/x/y/z']);
mm(['a/b/foo/bar/baz.qux'], 'a/b/**/bar/**/*.*', ['a/b/foo/bar/baz.qux']);
mm(['a/b/bar/baz.qux'], 'a/b/**/bar/**/*.*', ['a/b/bar/baz.qux']);
matcher(fixtures, ['*'], ['a', 'a/']);
matcher(fixtures, ['*/'], ['a/']);
matcher(fixtures, ['*/*'], ['a/a', 'a/b', 'a/c', 'a/x']);
matcher(fixtures, ['**'], fixtures);
matcher(fixtures, ['**/a'], ['a', 'a/', 'a/a']);
matcher(fixtures, ['a/*'], ['a/a', 'a/b', 'a/c', 'a/x']);
matcher(fixtures, ['a/**'], ['a/', 'a/a', 'a/b', 'a/c', 'a/x', 'a/x/y', 'a/x/y/z']);
matcher(fixtures, ['a/**/*'], ['a/a', 'a/b', 'a/c', 'a/x', 'a/x/y', 'a/x/y/z']);
matcher(fixtures, ['a/**/**/*'], ['a/a', 'a/b', 'a/c', 'a/x', 'a/x/y', 'a/x/y/z']);
matcher(['a/b/foo/bar/baz.qux'], 'a/b/**/bar/**/*.*', ['a/b/foo/bar/baz.qux']);
matcher(['a/b/bar/baz.qux'], 'a/b/**/bar/**/*.*', ['a/b/bar/baz.qux']);
});

it('should support negation patterns', function() {
var fixtures = ['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c'];
mm(fixtures, ['!a/b'], ['a/a', 'a/c', 'b/a', 'b/b', 'b/c']);
mm(fixtures, ['*/*', '!a/b', '!*/c'], ['a/a', 'b/a', 'b/b']);
mm(fixtures, ['!a/b', '!*/c'], ['a/a', 'b/a', 'b/b']);
mm(fixtures, ['!a/b', '!a/c'], ['a/a', 'b/a', 'b/b', 'b/c']);
mm(fixtures, ['!a/(b)'], ['a/a', 'a/c', 'b/a', 'b/b', 'b/c']);
mm(fixtures, ['!(a/b)'], ['a/a', 'a/c', 'b/a', 'b/b', 'b/c']);
matcher(fixtures, ['!a/b'], ['a/a', 'a/c', 'b/a', 'b/b', 'b/c']);
matcher(fixtures, ['*/*', '!a/b', '!*/c'], ['a/a', 'b/a', 'b/b']);
matcher(fixtures, ['*/*', '!a/b', '!*/c'], ['a/a', 'b/a', 'b/b']);
matcher(fixtures, ['*/*', '!a/b', '!a/c'], ['a/a', 'b/a', 'b/b', 'b/c']);
matcher(fixtures, ['!a/(b)'], ['a/a', 'a/c', 'b/a', 'b/b', 'b/c']);
matcher(fixtures, ['!(a/b)'], ['a/a', 'a/c', 'b/a', 'b/b', 'b/c']);
});

it('should support multiple patterns', function() {
var dirs = ['foo.js', 'bar.js', 'baz.js', 'main.js', 'other.js', 'foo/a/b/c.js', 'bar/a/b/d.js', 'baz/a/b/e.js', 'a/a/a.js', 'a/a/b.js', 'a/a/c.js', 'a/a/file.js'];

var actual = mm(dirs, ['a/**', '!a/a/file.js', 'main.js']);
assert.deepEqual(actual, ['a/a/a.js', 'a/a/b.js', 'a/a/c.js', 'main.js']);
assert.deepEqual(mm('foo', ['a/**', '!a/a/file.js', 'main.js']), []);
assert.deepEqual(mm(['foo'], ['a/**', '!a/a/file.js', 'main.js']), []);
});

it('should work with file extensions', function() {
var fixtures = ['a.txt', 'a/b.txt', 'a/x/y.txt', 'a/x/y/z'];
mm(fixtures, ['a/**/*.txt'], ['a/b.txt', 'a/x/y.txt']);
mm(fixtures, ['a/*.txt'], ['a/b.txt']);
mm(fixtures, ['a*.txt'], ['a.txt']);
mm(fixtures, ['*.txt'], ['a.txt']);
matcher(fixtures, ['a/**/*.txt'], ['a/b.txt', 'a/x/y.txt']);
matcher(fixtures, ['a/*.txt'], ['a/b.txt']);
matcher(fixtures, ['a*.txt'], ['a.txt']);
matcher(fixtures, ['*.txt'], ['a.txt']);
});

it('should match literal brackets', function() {
mm(['a [b]'], 'a \\[b\\]', ['a [b]']);
mm(['a [b] c'], 'a [b] c', ['a [b] c']);
mm(['a [b]'], 'a \\[b\\]*', ['a [b]']);
mm(['a [bc]'], 'a \\[bc\\]*', ['a [bc]']);
mm(['a [b]', 'a [b].js'], 'a \\[b\\].*', ['a [b].js']);
matcher(['a [b]'], 'a \\[b\\]', ['a [b]']);
matcher(['a [b] c'], 'a [b] c', ['a [b] c']);
matcher(['a [b]'], 'a \\[b\\]*', ['a [b]']);
matcher(['a [bc]'], 'a \\[bc\\]*', ['a [bc]']);
matcher(['a [b]', 'a [b].js'], 'a \\[b\\].*', ['a [b].js']);
});
});

Expand All @@ -105,103 +116,103 @@ describe('micromatch', function() {

it('should return an array of matches for a literal string', function() {
var fixtures = ['a\\a', 'a\\b', 'a\\c', 'b\\a', 'b\\b', 'b\\c'];
mm(fixtures, '(a/b)', ['a/b']);
mm(fixtures, 'a/b', ['a/b']);
mm(fixtures, '(a/b)', ['a\\b'], {unixify: false});
mm(fixtures, 'a/b', ['a\\b'], {unixify: false});
matcher(fixtures, '(a/b)', ['a/b']);
matcher(fixtures, 'a/b', ['a/b']);
matcher(fixtures, '(a/b)', ['a\\b'], {unixify: false});
matcher(fixtures, 'a/b', ['a\\b'], {unixify: false});
});

it('should return an array of matches for an array of literal strings', function() {
var fixtures = ['a\\a', 'a\\b', 'a\\c', 'b\\a', 'b\\b', 'b\\c'];
mm(fixtures, ['(a/b)', 'a/c'], ['a/b', 'a/c']);
mm(fixtures, ['a/b', 'b/b'], ['a/b', 'b/b']);
mm(fixtures, ['(a/b)', 'a/c'], ['a\\b', 'a\\c'], {unixify: false});
mm(fixtures, ['a/b', 'b/b'], ['a\\b', 'b\\b'], {unixify: false});
matcher(fixtures, ['(a/b)', 'a/c'], ['a/b', 'a/c']);
matcher(fixtures, ['a/b', 'b/b'], ['a/b', 'b/b']);
matcher(fixtures, ['(a/b)', 'a/c'], ['a\\b', 'a\\c'], {unixify: false});
matcher(fixtures, ['a/b', 'b/b'], ['a\\b', 'b\\b'], {unixify: false});
});

it('should support regex logical or', function() {
var fixtures = ['a\\a', 'a\\b', 'a\\c'];
mm(fixtures, ['a/(a|c)'], ['a/a', 'a/c']);
mm(fixtures, ['a/(a|b|c)', 'a/b'], ['a/a', 'a/b', 'a/c']);
mm(fixtures, ['a/(a|c)'], ['a\\a', 'a\\c'], {unixify: false});
mm(fixtures, ['a/(a|b|c)', 'a/b'], ['a\\a', 'a\\b', 'a\\c'], {unixify: false});
matcher(fixtures, ['a/(a|c)'], ['a/a', 'a/c']);
matcher(fixtures, ['a/(a|b|c)', 'a/b'], ['a/a', 'a/b', 'a/c']);
matcher(fixtures, ['a/(a|c)'], ['a\\a', 'a\\c'], {unixify: false});
matcher(fixtures, ['a/(a|b|c)', 'a/b'], ['a\\a', 'a\\b', 'a\\c'], {unixify: false});
});

it('should support regex ranges', function() {
var fixtures = ['a\\a', 'a\\b', 'a\\c', 'a\\x\\y', 'a\\x'];
mm(fixtures, 'a/[b-c]', ['a/b', 'a/c']);
mm(fixtures, 'a/[a-z]', ['a/a', 'a/b', 'a/c', 'a/x']);
mm(fixtures, 'a/[b-c]', ['a\\b', 'a\\c'], {unixify: false});
mm(fixtures, 'a/[a-z]', ['a\\a', 'a\\b', 'a\\c', 'a\\x'], {unixify: false});
matcher(fixtures, 'a/[b-c]', ['a/b', 'a/c']);
matcher(fixtures, 'a/[a-z]', ['a/a', 'a/b', 'a/c', 'a/x']);
matcher(fixtures, 'a/[b-c]', ['a\\b', 'a\\c'], {unixify: false});
matcher(fixtures, 'a/[a-z]', ['a\\a', 'a\\b', 'a\\c', 'a\\x'], {unixify: false});
});

it('should support single globs (*)', function() {
var fixtures = ['a', 'b', 'a\\a', 'a\\b', 'a\\c', 'a\\x', 'a\\a\\a', 'a\\a\\b', 'a\\a\\a\\a', 'a\\a\\a\\a\\a', 'x\\y', 'z\\z'];
mm(fixtures, ['*'], ['a', 'b']);
mm(fixtures, ['*/*'], ['a/a', 'a/b', 'a/c', 'a/x', 'x/y', 'z/z']);
mm(fixtures, ['*/*/*'], ['a/a/a', 'a/a/b']);
mm(fixtures, ['*/*/*/*'], ['a/a/a/a']);
mm(fixtures, ['*/*/*/*/*'], ['a/a/a/a/a']);
mm(fixtures, ['a/*'], ['a/a', 'a/b', 'a/c', 'a/x']);
mm(fixtures, ['a/*/*'], ['a/a/a', 'a/a/b']);
mm(fixtures, ['a/*/*/*'], ['a/a/a/a']);
mm(fixtures, ['a/*/*/*/*'], ['a/a/a/a/a']);
mm(fixtures, ['a/*/a'], ['a/a/a']);
mm(fixtures, ['a/*/b'], ['a/a/b']);

mm(fixtures, ['*/*'], ['a\\a', 'a\\b', 'a\\c', 'a\\x', 'x\\y', 'z\\z'], {unixify: false});
mm(fixtures, ['*/*/*'], ['a\\a\\a', 'a\\a\\b'], {unixify: false});
mm(fixtures, ['*/*/*/*'], ['a\\a\\a\\a'], {unixify: false});
mm(fixtures, ['*/*/*/*/*'], ['a\\a\\a\\a\\a'], {unixify: false});
mm(fixtures, ['a/*'], ['a\\a', 'a\\b', 'a\\c', 'a\\x'], {unixify: false});
mm(fixtures, ['a/*/*'], ['a\\a\\a', 'a\\a\\b'], {unixify: false});
mm(fixtures, ['a/*/*/*'], ['a\\a\\a\\a'], {unixify: false});
mm(fixtures, ['a/*/*/*/*'], ['a\\a\\a\\a\\a'], {unixify: false});
mm(fixtures, ['a/*/a'], ['a\\a\\a'], {unixify: false});
mm(fixtures, ['a/*/b'], ['a\\a\\b'], {unixify: false});
matcher(fixtures, ['*'], ['a', 'b']);
matcher(fixtures, ['*/*'], ['a/a', 'a/b', 'a/c', 'a/x', 'x/y', 'z/z']);
matcher(fixtures, ['*/*/*'], ['a/a/a', 'a/a/b']);
matcher(fixtures, ['*/*/*/*'], ['a/a/a/a']);
matcher(fixtures, ['*/*/*/*/*'], ['a/a/a/a/a']);
matcher(fixtures, ['a/*'], ['a/a', 'a/b', 'a/c', 'a/x']);
matcher(fixtures, ['a/*/*'], ['a/a/a', 'a/a/b']);
matcher(fixtures, ['a/*/*/*'], ['a/a/a/a']);
matcher(fixtures, ['a/*/*/*/*'], ['a/a/a/a/a']);
matcher(fixtures, ['a/*/a'], ['a/a/a']);
matcher(fixtures, ['a/*/b'], ['a/a/b']);

matcher(fixtures, ['*/*'], ['a\\a', 'a\\b', 'a\\c', 'a\\x', 'x\\y', 'z\\z'], {unixify: false});
matcher(fixtures, ['*/*/*'], ['a\\a\\a', 'a\\a\\b'], {unixify: false});
matcher(fixtures, ['*/*/*/*'], ['a\\a\\a\\a'], {unixify: false});
matcher(fixtures, ['*/*/*/*/*'], ['a\\a\\a\\a\\a'], {unixify: false});
matcher(fixtures, ['a/*'], ['a\\a', 'a\\b', 'a\\c', 'a\\x'], {unixify: false});
matcher(fixtures, ['a/*/*'], ['a\\a\\a', 'a\\a\\b'], {unixify: false});
matcher(fixtures, ['a/*/*/*'], ['a\\a\\a\\a'], {unixify: false});
matcher(fixtures, ['a/*/*/*/*'], ['a\\a\\a\\a\\a'], {unixify: false});
matcher(fixtures, ['a/*/a'], ['a\\a\\a'], {unixify: false});
matcher(fixtures, ['a/*/b'], ['a\\a\\b'], {unixify: false});
});

it('should support globstars (**)', function() {
var fixtures = ['a\\a', 'a\\b', 'a\\c', 'a\\x', 'a\\x\\y', 'a\\x\\y\\z'];
var expected = ['a/a', 'a/b', 'a/c', 'a/x', 'a/x/y', 'a/x/y/z'];
mm(fixtures, ['a/**'], expected);
mm(fixtures, ['a/**/*'], expected);
mm(fixtures, ['a/**/**/*'], expected);
matcher(fixtures, ['a/**'], expected);
matcher(fixtures, ['a/**/*'], expected);
matcher(fixtures, ['a/**/**/*'], expected);

mm(fixtures, ['a/**'], fixtures, {unixify: false});
mm(fixtures, ['a/**/*'], fixtures, {unixify: false});
mm(fixtures, ['a/**/**/*'], fixtures, {unixify: false});
matcher(fixtures, ['a/**'], fixtures, {unixify: false});
matcher(fixtures, ['a/**/*'], fixtures, {unixify: false});
matcher(fixtures, ['a/**/**/*'], fixtures, {unixify: false});
});

it('should work with file extensions', function() {
var fixtures = ['a.txt', 'a\\b.txt', 'a\\x\\y.txt', 'a\\x\\y\\z'];
mm(fixtures, ['a/**/*.txt'], ['a\\b.txt', 'a\\x\\y.txt'], {unixify: false});
mm(fixtures, ['a/*/*.txt'], ['a\\x\\y.txt'], {unixify: false});
mm(fixtures, ['a/*.txt'], ['a\\b.txt'], {unixify: false});
mm(fixtures, ['a/**/*.txt'], ['a/b.txt', 'a/x/y.txt']);
mm(fixtures, ['a/*/*.txt'], ['a/x/y.txt']);
mm(fixtures, ['a/*.txt'], ['a/b.txt']);
mm(fixtures, ['a*.txt'], ['a.txt']);
mm(fixtures, ['a.txt'], ['a.txt']);
matcher(fixtures, ['a/**/*.txt'], ['a\\b.txt', 'a\\x\\y.txt'], {unixify: false});
matcher(fixtures, ['a/*/*.txt'], ['a\\x\\y.txt'], {unixify: false});
matcher(fixtures, ['a/*.txt'], ['a\\b.txt'], {unixify: false});
matcher(fixtures, ['a/**/*.txt'], ['a/b.txt', 'a/x/y.txt']);
matcher(fixtures, ['a/*/*.txt'], ['a/x/y.txt']);
matcher(fixtures, ['a/*.txt'], ['a/b.txt']);
matcher(fixtures, ['a*.txt'], ['a.txt']);
matcher(fixtures, ['a.txt'], ['a.txt']);
});

it('should support negation patterns', function() {
var fixtures = ['a', 'a\\a', 'a\\b', 'a\\c', 'b\\a', 'b\\b', 'b\\c'];
mm(fixtures, ['!a/b'], ['a', 'a/a', 'a/c', 'b/a', 'b/b', 'b/c']);
mm(fixtures, ['*/*', '!a/b', '!*/c'], ['a/a', 'b/a', 'b/b']);
mm(fixtures, ['!*/c'], ['a', 'a/a', 'a/b', 'b/a', 'b/b']);
mm(fixtures, ['!a/b', '!*/c'], ['a', 'a/a', 'b/a', 'b/b']);
mm(fixtures, ['!a/b', '!a/c'], ['a', 'a/a', 'b/a', 'b/b', 'b/c']);
mm(fixtures, ['!a/(b)'], ['a', 'a/a', 'a/c', 'b/a', 'b/b', 'b/c']);
mm(fixtures, ['!(a/b)'], ['a', 'a/a', 'a/c', 'b/a', 'b/b', 'b/c']);

mm(fixtures, ['!a/b'], ['a', 'a\\a', 'a\\c', 'b\\a', 'b\\b', 'b\\c'], {unixify: false});
mm(fixtures, ['*/*', '!a/b', '!*/c'], ['a\\a', 'b\\a', 'b\\b'], {unixify: false});
mm(fixtures, ['!*/c'], ['a', 'a\\a', 'a\\b', 'b\\a', 'b\\b'], {unixify: false});
mm(fixtures, ['!a/b', '!*/c'], ['a', 'a\\a', 'b\\a', 'b\\b'], {unixify: false});
mm(fixtures, ['!a/b', '!a/c'], ['a', 'a\\a', 'b\\a', 'b\\b', 'b\\c'], {unixify: false});
mm(fixtures, ['!a/(b)'], ['a', 'a\\a', 'a\\c', 'b\\a', 'b\\b', 'b\\c'], {unixify: false});
mm(fixtures, ['!(a/b)'], ['a', 'a\\a', 'a\\c', 'b\\a', 'b\\b', 'b\\c'], {unixify: false});
matcher(fixtures, ['!a/b'], ['a', 'a/a', 'a/c', 'b/a', 'b/b', 'b/c']);
matcher(fixtures, ['*/*', '!a/b', '!*/c'], ['a/a', 'b/a', 'b/b']);
matcher(fixtures, ['!*/c'], ['a', 'a/a', 'a/b', 'b/a', 'b/b']);
matcher(fixtures, ['**', '!a/b', '!*/c'], ['a', 'a/a', 'b/a', 'b/b']);
matcher(fixtures, ['**', '!a/b', '!a/c'], ['a', 'a/a', 'b/a', 'b/b', 'b/c']);
matcher(fixtures, ['!a/(b)'], ['a', 'a/a', 'a/c', 'b/a', 'b/b', 'b/c']);
matcher(fixtures, ['!(a/b)'], ['a', 'a/a', 'a/c', 'b/a', 'b/b', 'b/c']);

matcher(fixtures, ['!a/b'], ['a', 'a\\a', 'a\\c', 'b\\a', 'b\\b', 'b\\c'], {unixify: false});
matcher(fixtures, ['*/*', '!a/b', '!*/c'], ['a\\a', 'b\\a', 'b\\b'], {unixify: false});
matcher(fixtures, ['!*/c'], ['a', 'a\\a', 'a\\b', 'b\\a', 'b\\b'], {unixify: false});
matcher(fixtures, ['**', '!a/b', '!*/c'], ['a', 'a\\a', 'b\\a', 'b\\b'], {unixify: false});
matcher(fixtures, ['**', '!a/b', '!a/c'], ['a', 'a\\a', 'b\\a', 'b\\b', 'b\\c'], {unixify: false});
matcher(fixtures, ['**', '!a/(b)'], ['a', 'a\\a', 'a\\c', 'b\\a', 'b\\b', 'b\\c'], {unixify: false});
matcher(fixtures, ['**', '!(a/b)'], ['a', 'a\\a', 'a\\c', 'b\\a', 'b\\b', 'b\\c'], {unixify: false});
});
});
});
9 changes: 9 additions & 0 deletions test/negation.js
Expand Up @@ -24,6 +24,15 @@ describe('negation', function() {
mm(['foo!.md', 'ba!r.js'], '**/*!*.*', ['foo!.md', 'ba!r.js']);
});

it('should support negated file names', function() {
mm(['bar', 'baz', 'foo'], '!foo', ['bar', 'baz']);
mm(['bar', 'baz', 'foo'], ['!foo'], ['bar', 'baz']);
mm(['bar', 'baz', 'foo'], ['!foo', 'bar'], ['bar']);
mm(['bar', 'baz', 'foo'], ['bar', '!foo', '!bar'], []);
mm(['bar', 'baz', 'foo'], ['!bar', 'bar'], []);
mm(['bar', 'baz', 'foo'], ['!bar', 'bar', '*'], ['baz', 'foo']);
});

it('should support negated globs ("*")', function() {
mm(['a.js', 'b.txt', 'c.md'], '!*.md', ['a.js', 'b.txt']);
mm(['a/a/a.js', 'a/b/a.js', 'a/c/a.js'], '!a/*/a.js', []);
Expand Down

0 comments on commit 7880461

Please sign in to comment.