Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

matchingPatterns method #27

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -657,6 +657,28 @@ Clear the regex cache.
nm.clearCache();
```

### [.matchingPatterns](index.js#L105)

Similar to the main function, but returns matched patterns, instead of matched values
Doesn't work with negative lookup, because it the most cases it doesn't have sense

**Params**

* `list` **{Array}**: A list of strings to match
* `patterns` **{String|Array}**: One or more glob patterns to use for matching
* `options` **{Object}**: See available [options](#options) for changing how matches are performed
* `returns` **{Array}**: Returns an array of metched patterns

**Example**

```js
var nm = require('nanomatch');
nm.matchingPatterns(list, pattern[, options]);

console.log(nm.matchingPatterns(['a.a', 'a.aa', 'a.b', 'a.c'], ['*.a', '*.d']));
//=> ['*.a']
```

## Options

<details>
Expand Down
46 changes: 46 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,52 @@ function nanomatch(list, patterns, options) {
return matches;
}

/**
* Similar to the main function, but returns matched patterns, instead of matched values
* Doesn't work with negative lookup, because it the most cases it doesn't have sense
*
* ```js
* const nm = require('nanomatch');
* nm.matchingPatterns(list, pattern[, options]);
*
* console.log(nm.matchingPatterns(['a.a', 'a.aa', 'a.b', 'a.c'], ['*.a', '*.d']));
* //=> ['*.a']
* ```
* @param {Array} `list` Array of strings to match
* @param {Array} `pattern` Array of patterns
* @param {Object} `options` See available [options](#options) for changing how matches are performed
* @return {Array} Returns an array of matched patterns
* @api public
*/
nanomatch.matchingPatterns = function(list, patterns, options) {
patterns = utils.arrayify(patterns);
list = utils.arrayify(list);

const len = patterns.length;
if (list.length === 0 || len === 0) {
return [];
}

const omit = [];
const keep = [];
let idx = -1;

while (++idx < len) {
const pattern = patterns[idx];
const match = nanomatch.match(list, pattern, options);

match.length > 0 && keep.push(pattern);
}

const matches = utils.diff(keep, omit);

if (!options || options.nodupes !== false) {
return utils.unique(matches);
}

return matches;
}

/**
* Similar to the main function, but `pattern` must be a string.
*
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
"Devon Govett (http://badassjs.com)",
"Jon Schlinkert (http://twitter.com/jonschlinkert)",
"Tony Colston (http://twitter.com/tonetheman)",
"Daniel Tschinder (https://github.com/danez)"
"Daniel Tschinder (https://github.com/danez)",
"Konstantin Epishev (https://epishev.me)"
],
"repository": "micromatch/nanomatch",
"bugs": {
Expand Down
169 changes: 169 additions & 0 deletions test/api.mathchingPatterns.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
'use strict';

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

describe('.matchingPatterns method', function() {
describe('posix paths', function() {
it('should return an array of matched patterns for a literal string', function() {
assert.deepEqual(nm.matchingPatterns(['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c'], ['(a/b)']), ['(a/b)']);
assert.deepEqual(nm.matchingPatterns(['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c'], ['a/b']), ['a/b']);
assert.deepEqual(nm.matchingPatterns(['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c'], ['(a/d)']), []);
assert.deepEqual(nm.matchingPatterns(['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c'], ['a/d']), []);
});

it('should return an array of matches for an array of literal strings', function() {
assert.deepEqual(nm.matchingPatterns(['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c'], ['(a/b)', 'a/c']), ['(a/b)', 'a/c']);
assert.deepEqual(nm.matchingPatterns(['a/a', 'a/b', 'a/c', 'b/a'], ['a/b']), ['a/b']);
});

it('should support regex logical or', function() {
assert.deepEqual(nm.matchingPatterns(['a/a', 'a/b', 'a/c'], ['a/(a|c)']), ['a/(a|c)']);
assert.deepEqual(nm.matchingPatterns(['a/a', 'a/b', 'a/c'], ['a/(a|b|c)', 'a/b']), ['a/(a|b|c)', 'a/b']);
});

it('should support regex ranges', function() {
assert.deepEqual(nm.matchingPatterns(['a/a', 'a/b', 'a/c'], ['a/[b-c]']), ['a/[b-c]']);
assert.deepEqual(nm.matchingPatterns(['a/a', 'a/b', 'a/c', 'a/x/y', 'a/x'], ['a/[a-z]']), ['a/[a-z]']);
});

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'];
assert.deepEqual(nm.matchingPatterns(fixtures, ['*']), ['*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['*/*']), ['*/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['*/*/*']), ['*/*/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['*/*/*/*']), ['*/*/*/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['*/*/*/*/*']), ['*/*/*/*/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/*']), ['a/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/*/*']), ['a/*/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/*/*/*']), ['a/*/*/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/*/*/*/*']), ['a/*/*/*/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/*/a']), ['a/*/a']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/*/b']), ['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'];
assert.deepEqual(nm.matchingPatterns(fixtures, ['*']), ['*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['*/']), ['*/']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['*/*']), ['*/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['**']), ['**']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['**/a']), ['**/a']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/*']), ['a/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/**']), ['a/**']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/**/*']), ['a/**/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/**/**/*']), ['a/**/**/*']);
assert.deepEqual(nm.matchingPatterns(['a/b/foo/bar/baz.qux'], ['a/b/**/bar/**/*.*']), ['a/b/**/bar/**/*.*']);
assert.deepEqual(nm.matchingPatterns(['a/b/bar/baz.qux'], ['a/b/**/bar/**/*.*']), ['a/b/**/bar/**/*.*']);
});

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

it('should match literal brackets', function() {
assert.deepEqual(nm.matchingPatterns(['a [b]'], ['a \\[b\\]']), ['a \\[b\\]']);
assert.deepEqual(nm.matchingPatterns(['a [b] c'], ['a [b] c']), ['a [b] c']);
assert.deepEqual(nm.matchingPatterns(['a [b]'], ['a \\[b\\]*']), ['a \\[b\\]*']);
assert.deepEqual(nm.matchingPatterns(['a [bc]'], ['a \\[bc\\]*']), ['a \\[bc\\]*']);
assert.deepEqual(nm.matchingPatterns(['a [b]', 'a [b].js'], ['a \\[b\\].*']), ['a \\[b\\].*']);
});

describe('windows paths', function() {
beforeEach(function() {
path.sep = '\\';
});
afterEach(function() {
path.sep = sep;
});

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'];
assert.deepEqual(nm.matchingPatterns(fixtures, ['(a/b)']), ['(a/b)']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/b']), ['a/b']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['(a/b)']), ['(a/b)']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/b']), ['a/b']);
});

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'];
assert.deepEqual(nm.matchingPatterns(fixtures, ['(a/b)', 'a/c']), ['(a/b)', 'a/c']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/b', 'b/b']), ['a/b', 'b/b']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['(a/b)', 'a/c']), ['(a/b)', 'a/c']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/b', 'b/b']), ['a/b', 'b/b']);
});

it('should support regex logical or', function() {
var fixtures = ['a\\a', 'a\\b', 'a\\c'];
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/(a|c)']), ['a/(a|c)']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/(a|b|c)', 'a/b']), ['a/(a|b|c)', 'a/b']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/(a|c)']), ['a/(a|c)']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/(a|b|c)', 'a/b']), ['a/(a|b|c)', 'a/b']);
});

it('should support regex ranges', function() {
var fixtures = ['a\\a', 'a\\b', 'a\\c', 'a\\x\\y', 'a\\x'];
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/[b-c]']), ['a/[b-c]']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/[a-z]']), ['a/[a-z]']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/[b-c]']), ['a/[b-c]']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/[a-z]']), ['a/[a-z]']);
});

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'];
assert.deepEqual(nm.matchingPatterns(fixtures, ['*']), ['*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['*/*']), ['*/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['*/*/*']), ['*/*/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['*/*/*/*']), ['*/*/*/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['*/*/*/*/*']), ['*/*/*/*/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/*']), ['a/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/*/*']), ['a/*/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/*/*/*']), ['a/*/*/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/*/*/*/*']), ['a/*/*/*/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/*/a']), ['a/*/a']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/*/b']), ['a/*/b']);

assert.deepEqual(nm.matchingPatterns(fixtures, ['*/*']), ['*/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['*/*/*']), ['*/*/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['*/*/*/*']), ['*/*/*/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['*/*/*/*/*']), ['*/*/*/*/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/*']), ['a/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/*/*']), ['a/*/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/*/*/*']), ['a/*/*/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/*/*/*/*']), ['a/*/*/*/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/*/a']), ['a/*/a']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/*/b']), ['a/*/b']);
});

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'];
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/**']), ['a/**']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/**/*']), ['a/**/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/**/**/*']), ['a/**/**/*']);

assert.deepEqual(nm.matchingPatterns(fixtures, ['a/**']), ['a/**']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/**/*']), ['a/**/*']);
assert.deepEqual(nm.matchingPatterns(fixtures, ['a/**/**/*']), ['a/**/**/*']);
});

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