Projekt

Obecné

Profil

Stáhnout (32.6 KB) Statistiky
| Větev: | Revize:
1
# nanomatch [![NPM version](https://img.shields.io/npm/v/nanomatch.svg?style=flat)](https://www.npmjs.com/package/nanomatch) [![NPM monthly downloads](https://img.shields.io/npm/dm/nanomatch.svg?style=flat)](https://npmjs.org/package/nanomatch) [![NPM total downloads](https://img.shields.io/npm/dt/nanomatch.svg?style=flat)](https://npmjs.org/package/nanomatch) [![Linux Build Status](https://img.shields.io/travis/micromatch/nanomatch.svg?style=flat&label=Travis)](https://travis-ci.org/micromatch/nanomatch) [![Windows Build Status](https://img.shields.io/appveyor/ci/micromatch/nanomatch.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/micromatch/nanomatch)
2

    
3
> Fast, minimal glob matcher for node.js. Similar to micromatch, minimatch and multimatch, but complete Bash 4.3 wildcard support only (no support for exglobs, posix brackets or braces)
4

    
5
Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support.
6

    
7
## Table of Contents
8

    
9
<details>
10
<summary><strong>Details</strong></summary>
11

    
12
- [Install](#install)
13
- [What is nanomatch?](#what-is-nanomatch)
14
- [Getting started](#getting-started)
15
  * [Installing nanomatch](#installing-nanomatch)
16
  * [Usage](#usage)
17
- [Documentation](#documentation)
18
  * [Escaping](#escaping)
19
- [API](#api)
20
- [Options](#options)
21
  * [options.basename](#optionsbasename)
22
  * [options.bash](#optionsbash)
23
  * [options.cache](#optionscache)
24
  * [options.dot](#optionsdot)
25
  * [options.failglob](#optionsfailglob)
26
  * [options.ignore](#optionsignore)
27
  * [options.matchBase](#optionsmatchbase)
28
  * [options.nocase](#optionsnocase)
29
  * [options.nodupes](#optionsnodupes)
30
  * [options.noglobstar](#optionsnoglobstar)
31
  * [options.nonegate](#optionsnonegate)
32
  * [options.nonull](#optionsnonull)
33
  * [options.nullglob](#optionsnullglob)
34
  * [options.slash](#optionsslash)
35
  * [options.star](#optionsstar)
36
  * [options.snapdragon](#optionssnapdragon)
37
  * [options.sourcemap](#optionssourcemap)
38
  * [options.unescape](#optionsunescape)
39
  * [options.unixify](#optionsunixify)
40
- [Features](#features)
41
- [Bash expansion libs](#bash-expansion-libs)
42
- [Benchmarks](#benchmarks)
43
  * [Running benchmarks](#running-benchmarks)
44
  * [Nanomatch vs. Minimatch vs. Multimatch](#nanomatch-vs-minimatch-vs-multimatch)
45
- [About](#about)
46

    
47
</details>
48

    
49
## Install
50

    
51
Install with [npm](https://www.npmjs.com/):
52

    
53
```sh
54
$ npm install --save nanomatch
55
```
56

    
57
<details>
58
<summary><strong>Release history</strong></summary>
59

    
60
## History
61

    
62
### key
63

    
64
Changelog entries are classified using the following labels _(from [keep-a-changelog](https://github.com/olivierlacan/keep-a-changelog)_):
65

    
66
* `added`: for new features
67
* `changed`: for changes in existing functionality
68
* `deprecated`: for once-stable features removed in upcoming releases
69
* `removed`: for deprecated features removed in this release
70
* `fixed`: for any bug fixes
71
* `bumped`: updated dependencies, only minor or higher will be listed.
72

    
73
### [1.1.0](https://github.com/micromatch/nanomatch/compare/1.0.4...1.1.0) - 2017-04-11
74

    
75
**Fixed**
76

    
77
* adds support for unclosed quotes
78

    
79
**Added**
80

    
81
* adds support for `options.noglobstar`
82

    
83
### [1.0.4](https://github.com/micromatch/nanomatch/compare/1.0.3...1.0.4) - 2017-04-06
84

    
85
Housekeeping updates. Adds documentation section about escaping, cleans up utils.
86

    
87
### [1.0.3](https://github.com/micromatch/nanomatch/compare/1.0.1...1.0.3) - 2017-04-06
88

    
89
This release includes fixes for windows path edge cases and other improvements for stricter adherence to bash spec.
90

    
91
**Fixed**
92

    
93
* More windows path edge cases
94

    
95
**Added**
96

    
97
* Support for bash-like quoted strings for escaping sequences of characters, such as `foo/"**"/bar` where `**` should be matched literally and not evaluated as special characters.
98

    
99
### [1.0.1](https://github.com/micromatch/nanomatch/compare/1.0.0...1.0.1) - 2016-12-12
100

    
101
**Added**
102

    
103
* Support for windows path edge cases where backslashes are used in brackets or other unusual combinations.
104

    
105
### [1.0.0](https://github.com/micromatch/nanomatch/compare/0.1.0...1.0.0) - 2016-12-12
106

    
107
Stable release.
108

    
109
### [0.1.0] - 2016-10-08
110

    
111
First release.
112

    
113
</details>
114

    
115
## What is nanomatch?
116

    
117
Nanomatch is a fast and accurate glob matcher with full support for standard Bash glob features, including the following "metacharacters": `*`, `**`, `?` and `[...]`.
118

    
119
**Learn more**
120

    
121
* [Getting started](#getting-started): learn how to install and begin using nanomatch
122
* [Features](#features): jump to info about supported patterns, and a glob matching reference
123
* [API documentation](#api): jump to available options and methods
124
* [Unit tests](test): visit unit tests. there is no better way to learn a code library than spending time the unit tests. Nanomatch has 36,000 unit tests - go become a glob matching ninja!
125

    
126
<details>
127
<summary><strong>How is this different?</strong></summary>
128

    
129
**Speed and accuracy**
130

    
131
Nanomatch uses [snapdragon](https://github.com/jonschlinkert/snapdragon) for parsing and compiling globs, which results in:
132

    
133
* Granular control over the entire conversion process in a way that is easy to understand, reason about, and customize.
134
* Faster matching, from a combination of optimized glob patterns and (optional) caching.
135
* Much greater accuracy than minimatch. In fact, nanomatch passes _all of the spec tests_ from bash, including some that bash still fails. However, since there is no real specification for globs, if you encounter a pattern that yields unexpected match results [after researching previous issues](../../issues), [please let us know](../../issues/new).
136

    
137
**Basic globbing only**
138

    
139
Nanomatch supports [basic globbing only](#features), which is limited to `*`, `**`, `?` and regex-like brackets.
140

    
141
If you need support for the other [bash "expansion" types](#bash-expansion-libs) (in addition to the wildcard matching provided by nanomatch), consider using [micromatch](https://github.com/micromatch/micromatch) instead. _(micromatch >=3.0.0  uses the nanomatch parser and compiler for basic glob matching)_
142

    
143
</details>
144

    
145
## Getting started
146

    
147
### Installing nanomatch
148

    
149
**Install with [yarn](https://yarnpkg.com/)**
150

    
151
```sh
152
$ yarn add nanomatch
153
```
154

    
155
**Install with [npm](https://npmjs.com)**
156

    
157
```sh
158
$ npm install nanomatch
159
```
160

    
161
### Usage
162

    
163
Add nanomatch to your project using node's `require()` system:
164

    
165
```js
166
var nanomatch = require('nanomatch');
167

    
168
// the main export is a function that takes an array of strings to match
169
// and a string or array of patterns to use for matching
170
nanomatch(list, patterns[, options]);
171
```
172

    
173
**Params**
174

    
175
* `list` **{String|Array}**: List of strings to perform matches against. This is often a list of file paths.
176
* `patterns` **{String|Array}**: One or more [glob paterns](#features) to use for matching.
177
* `options` **{Object}**: Any [supported options](#options) may be passed
178

    
179
**Examples**
180

    
181
```js
182
var nm = require('nanomatch');
183
console.log(nm(['a', 'b/b', 'c/c/c'], '*'));
184
//=> ['a']
185

    
186
console.log(nm(['a', 'b/b', 'c/c/c'], '*/*'));
187
//=> ['b/b']
188

    
189
console.log(nm(['a', 'b/b', 'c/c/c'], '**'));
190
//=> ['a', 'b/b', 'c/c/c']
191
```
192

    
193
See the [API documentation](#api) for available methods and [options](https://github.com/einaros/options.js).
194

    
195
## Documentation
196

    
197
### Escaping
198

    
199
_Backslashes and quotes_ can be used to escape characters, forcing nanomatch to regard those characters as a literal characters.
200

    
201
**Backslashes**
202

    
203
Use backslashes to escape single characters. For example, the following pattern would match `foo/*/bar` exactly:
204

    
205
```js
206
'foo/\*/bar'
207
```
208

    
209
The following pattern would match `foo/` followed by a literal `*`, followed by zero or more of any characters besides `/`, followed by `/bar`.
210

    
211
```js
212
'foo/\**/bar'
213
```
214

    
215
**Quoted strings**
216

    
217
Use single or double quotes to escape sequences of characters. For example, the following patterns would match `foo/**/bar` exactly:
218

    
219
```js
220
'foo/"**"/bar'
221
'foo/\'**\'/bar'
222
"foo/'**'/bar"
223
```
224

    
225
**Matching literal quotes**
226

    
227
If you need to match quotes literally, you can escape them as well. For example, the following will match `foo/"*"/bar`, `foo/"a"/bar`, `foo/"b"/bar`, or `foo/"c"/bar`:
228

    
229
```js
230
'foo/\\"*\\"/bar'
231
```
232

    
233
And the following will match `foo/'*'/bar`, `foo/'a'/bar`, `foo/'b'/bar`, or `foo/'c'/bar`:
234

    
235
```js
236
'foo/\\\'*\\\'/bar'
237
```
238

    
239
## API
240

    
241
### [nanomatch](index.js#L40)
242

    
243
The main function takes a list of strings and one or more glob patterns to use for matching.
244

    
245
**Params**
246

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

    
252
**Example**
253

    
254
```js
255
var nm = require('nanomatch');
256
nm(list, patterns[, options]);
257

    
258
console.log(nm(['a.js', 'a.txt'], ['*.js']));
259
//=> [ 'a.js' ]
260
```
261

    
262
### [.match](index.js#L106)
263

    
264
Similar to the main function, but `pattern` must be a string.
265

    
266
**Params**
267

    
268
* `list` **{Array}**: Array of strings to match
269
* `pattern` **{String}**: Glob pattern to use for matching.
270
* `options` **{Object}**: See available [options](#options) for changing how matches are performed
271
* `returns` **{Array}**: Returns an array of matches
272

    
273
**Example**
274

    
275
```js
276
var nm = require('nanomatch');
277
nm.match(list, pattern[, options]);
278

    
279
console.log(nm.match(['a.a', 'a.aa', 'a.b', 'a.c'], '*.a'));
280
//=> ['a.a', 'a.aa']
281
```
282

    
283
### [.isMatch](index.js#L167)
284

    
285
Returns true if the specified `string` matches the given glob `pattern`.
286

    
287
**Params**
288

    
289
* `string` **{String}**: String to match
290
* `pattern` **{String}**: Glob pattern to use for matching.
291
* `options` **{Object}**: See available [options](#options) for changing how matches are performed
292
* `returns` **{Boolean}**: Returns true if the string matches the glob pattern.
293

    
294
**Example**
295

    
296
```js
297
var nm = require('nanomatch');
298
nm.isMatch(string, pattern[, options]);
299

    
300
console.log(nm.isMatch('a.a', '*.a'));
301
//=> true
302
console.log(nm.isMatch('a.b', '*.a'));
303
//=> false
304
```
305

    
306
### [.some](index.js#L205)
307

    
308
Returns true if some of the elements in the given `list` match any of the given glob `patterns`.
309

    
310
**Params**
311

    
312
* `list` **{String|Array}**: The string or array of strings to test. Returns as soon as the first match is found.
313
* `patterns` **{String|Array}**: One or more glob patterns to use for matching.
314
* `options` **{Object}**: See available [options](#options) for changing how matches are performed
315
* `returns` **{Boolean}**: Returns true if any patterns match `str`
316

    
317
**Example**
318

    
319
```js
320
var nm = require('nanomatch');
321
nm.some(list, patterns[, options]);
322

    
323
console.log(nm.some(['foo.js', 'bar.js'], ['*.js', '!foo.js']));
324
// true
325
console.log(nm.some(['foo.js'], ['*.js', '!foo.js']));
326
// false
327
```
328

    
329
### [.every](index.js#L243)
330

    
331
Returns true if every element in the given `list` matches at least one of the given glob `patterns`.
332

    
333
**Params**
334

    
335
* `list` **{String|Array}**: The string or array of strings to test.
336
* `patterns` **{String|Array}**: One or more glob patterns to use for matching.
337
* `options` **{Object}**: See available [options](#options) for changing how matches are performed
338
* `returns` **{Boolean}**: Returns true if any patterns match `str`
339

    
340
**Example**
341

    
342
```js
343
var nm = require('nanomatch');
344
nm.every(list, patterns[, options]);
345

    
346
console.log(nm.every('foo.js', ['foo.js']));
347
// true
348
console.log(nm.every(['foo.js', 'bar.js'], ['*.js']));
349
// true
350
console.log(nm.every(['foo.js', 'bar.js'], ['*.js', '!foo.js']));
351
// false
352
console.log(nm.every(['foo.js'], ['*.js', '!foo.js']));
353
// false
354
```
355

    
356
### [.any](index.js#L277)
357

    
358
Returns true if **any** of the given glob `patterns` match the specified `string`.
359

    
360
**Params**
361

    
362
* `str` **{String|Array}**: The string to test.
363
* `patterns` **{String|Array}**: One or more glob patterns to use for matching.
364
* `options` **{Object}**: See available [options](#options) for changing how matches are performed
365
* `returns` **{Boolean}**: Returns true if any patterns match `str`
366

    
367
**Example**
368

    
369
```js
370
var nm = require('nanomatch');
371
nm.any(string, patterns[, options]);
372

    
373
console.log(nm.any('a.a', ['b.*', '*.a']));
374
//=> true
375
console.log(nm.any('a.a', 'b.*'));
376
//=> false
377
```
378

    
379
### [.all](index.js#L325)
380

    
381
Returns true if **all** of the given `patterns` match the specified string.
382

    
383
**Params**
384

    
385
* `str` **{String|Array}**: The string to test.
386
* `patterns` **{String|Array}**: One or more glob patterns to use for matching.
387
* `options` **{Object}**: See available [options](#options) for changing how matches are performed
388
* `returns` **{Boolean}**: Returns true if any patterns match `str`
389

    
390
**Example**
391

    
392
```js
393
var nm = require('nanomatch');
394
nm.all(string, patterns[, options]);
395

    
396
console.log(nm.all('foo.js', ['foo.js']));
397
// true
398

    
399
console.log(nm.all('foo.js', ['*.js', '!foo.js']));
400
// false
401

    
402
console.log(nm.all('foo.js', ['*.js', 'foo.js']));
403
// true
404

    
405
console.log(nm.all('foo.js', ['*.js', 'f*', '*o*', '*o.js']));
406
// true
407
```
408

    
409
### [.not](index.js#L359)
410

    
411
Returns a list of strings that _**do not match any**_ of the given `patterns`.
412

    
413
**Params**
414

    
415
* `list` **{Array}**: Array of strings to match.
416
* `patterns` **{String|Array}**: One or more glob pattern to use for matching.
417
* `options` **{Object}**: See available [options](#options) for changing how matches are performed
418
* `returns` **{Array}**: Returns an array of strings that **do not match** the given patterns.
419

    
420
**Example**
421

    
422
```js
423
var nm = require('nanomatch');
424
nm.not(list, patterns[, options]);
425

    
426
console.log(nm.not(['a.a', 'b.b', 'c.c'], '*.a'));
427
//=> ['b.b', 'c.c']
428
```
429

    
430
### [.contains](index.js#L394)
431

    
432
Returns true if the given `string` contains the given pattern. Similar to [.isMatch](#isMatch) but the pattern can match any part of the string.
433

    
434
**Params**
435

    
436
* `str` **{String}**: The string to match.
437
* `patterns` **{String|Array}**: Glob pattern to use for matching.
438
* `options` **{Object}**: See available [options](#options) for changing how matches are performed
439
* `returns` **{Boolean}**: Returns true if the patter matches any part of `str`.
440

    
441
**Example**
442

    
443
```js
444
var nm = require('nanomatch');
445
nm.contains(string, pattern[, options]);
446

    
447
console.log(nm.contains('aa/bb/cc', '*b'));
448
//=> true
449
console.log(nm.contains('aa/bb/cc', '*d'));
450
//=> false
451
```
452

    
453
### [.matchKeys](index.js#L450)
454

    
455
Filter the keys of the given object with the given `glob` pattern and `options`. Does not attempt to match nested keys. If you need this feature, use [glob-object](https://github.com/jonschlinkert/glob-object) instead.
456

    
457
**Params**
458

    
459
* `object` **{Object}**: The object with keys to filter.
460
* `patterns` **{String|Array}**: One or more glob patterns to use for matching.
461
* `options` **{Object}**: See available [options](#options) for changing how matches are performed
462
* `returns` **{Object}**: Returns an object with only keys that match the given patterns.
463

    
464
**Example**
465

    
466
```js
467
var nm = require('nanomatch');
468
nm.matchKeys(object, patterns[, options]);
469

    
470
var obj = { aa: 'a', ab: 'b', ac: 'c' };
471
console.log(nm.matchKeys(obj, '*b'));
472
//=> { ab: 'b' }
473
```
474

    
475
### [.matcher](index.js#L479)
476

    
477
Returns a memoized matcher function from the given glob `pattern` and `options`. The returned function takes a string to match as its only argument and returns true if the string is a match.
478

    
479
**Params**
480

    
481
* `pattern` **{String}**: Glob pattern
482
* `options` **{Object}**: See available [options](#options) for changing how matches are performed.
483
* `returns` **{Function}**: Returns a matcher function.
484

    
485
**Example**
486

    
487
```js
488
var nm = require('nanomatch');
489
nm.matcher(pattern[, options]);
490

    
491
var isMatch = nm.matcher('*.!(*a)');
492
console.log(isMatch('a.a'));
493
//=> false
494
console.log(isMatch('a.b'));
495
//=> true
496
```
497

    
498
### [.capture](index.js#L560)
499

    
500
Returns an array of matches captured by `pattern` in `string, or`null` if the pattern did not match.
501

    
502
**Params**
503

    
504
* `pattern` **{String}**: Glob pattern to use for matching.
505
* `string` **{String}**: String to match
506
* `options` **{Object}**: See available [options](#options) for changing how matches are performed
507
* `returns` **{Boolean}**: Returns an array of captures if the string matches the glob pattern, otherwise `null`.
508

    
509
**Example**
510

    
511
```js
512
var nm = require('nanomatch');
513
nm.capture(pattern, string[, options]);
514

    
515
console.log(nm.capture('test/*.js', 'test/foo.js'));
516
//=> ['foo']
517
console.log(nm.capture('test/*.js', 'foo/bar.css'));
518
//=> null
519
```
520

    
521
### [.makeRe](index.js#L595)
522

    
523
Create a regular expression from the given glob `pattern`.
524

    
525
**Params**
526

    
527
* `pattern` **{String}**: A glob pattern to convert to regex.
528
* `options` **{Object}**: See available [options](#options) for changing how matches are performed.
529
* `returns` **{RegExp}**: Returns a regex created from the given pattern.
530

    
531
**Example**
532

    
533
```js
534
var nm = require('nanomatch');
535
nm.makeRe(pattern[, options]);
536

    
537
console.log(nm.makeRe('*.js'));
538
//=> /^(?:(\.[\\\/])?(?!\.)(?=.)[^\/]*?\.js)$/
539
```
540

    
541
### [.create](index.js#L658)
542

    
543
Parses the given glob `pattern` and returns an object with the compiled `output` and optional source `map`.
544

    
545
**Params**
546

    
547
* `pattern` **{String}**: Glob pattern to parse and compile.
548
* `options` **{Object}**: Any [options](#options) to change how parsing and compiling is performed.
549
* `returns` **{Object}**: Returns an object with the parsed AST, compiled string and optional source map.
550

    
551
**Example**
552

    
553
```js
554
var nm = require('nanomatch');
555
nm.create(pattern[, options]);
556

    
557
console.log(nm.create('abc/*.js'));
558
// { options: { source: 'string', sourcemap: true },
559
//   state: {},
560
//   compilers:
561
//    { ... },
562
//   output: '(\\.[\\\\\\/])?abc\\/(?!\\.)(?=.)[^\\/]*?\\.js',
563
//   ast:
564
//    { type: 'root',
565
//      errors: [],
566
//      nodes:
567
//       [ ... ],
568
//      dot: false,
569
//      input: 'abc/*.js' },
570
//   parsingErrors: [],
571
//   map:
572
//    { version: 3,
573
//      sources: [ 'string' ],
574
//      names: [],
575
//      mappings: 'AAAA,GAAG,EAAC,kBAAC,EAAC,EAAE',
576
//      sourcesContent: [ 'abc/*.js' ] },
577
//   position: { line: 1, column: 28 },
578
//   content: {},
579
//   files: {},
580
//   idx: 6 }
581
```
582

    
583
### [.parse](index.js#L697)
584

    
585
Parse the given `str` with the given `options`.
586

    
587
**Params**
588

    
589
* `str` **{String}**
590
* `options` **{Object}**
591
* `returns` **{Object}**: Returns an AST
592

    
593
**Example**
594

    
595
```js
596
var nm = require('nanomatch');
597
nm.parse(pattern[, options]);
598

    
599
var ast = nm.parse('a/{b,c}/d');
600
console.log(ast);
601
// { type: 'root',
602
//   errors: [],
603
//   input: 'a/{b,c}/d',
604
//   nodes:
605
//    [ { type: 'bos', val: '' },
606
//      { type: 'text', val: 'a/' },
607
//      { type: 'brace',
608
//        nodes:
609
//         [ { type: 'brace.open', val: '{' },
610
//           { type: 'text', val: 'b,c' },
611
//           { type: 'brace.close', val: '}' } ] },
612
//      { type: 'text', val: '/d' },
613
//      { type: 'eos', val: '' } ] }
614
```
615

    
616
### [.compile](index.js#L745)
617

    
618
Compile the given `ast` or string with the given `options`.
619

    
620
**Params**
621

    
622
* `ast` **{Object|String}**
623
* `options` **{Object}**
624
* `returns` **{Object}**: Returns an object that has an `output` property with the compiled string.
625

    
626
**Example**
627

    
628
```js
629
var nm = require('nanomatch');
630
nm.compile(ast[, options]);
631

    
632
var ast = nm.parse('a/{b,c}/d');
633
console.log(nm.compile(ast));
634
// { options: { source: 'string' },
635
//   state: {},
636
//   compilers:
637
//    { eos: [Function],
638
//      noop: [Function],
639
//      bos: [Function],
640
//      brace: [Function],
641
//      'brace.open': [Function],
642
//      text: [Function],
643
//      'brace.close': [Function] },
644
//   output: [ 'a/(b|c)/d' ],
645
//   ast:
646
//    { ... },
647
//   parsingErrors: [] }
648
```
649

    
650
### [.clearCache](index.js#L768)
651

    
652
Clear the regex cache.
653

    
654
**Example**
655

    
656
```js
657
nm.clearCache();
658
```
659

    
660
## Options
661

    
662
<details>
663
<summary><strong>basename</strong></summary>
664

    
665
### options.basename
666

    
667
Allow glob patterns without slashes to match a file path based on its basename. Same behavior as [minimatch](https://github.com/isaacs/minimatch) option `matchBase`.
668

    
669
Type: `boolean`
670

    
671
Default: `false`
672

    
673
**Example**
674

    
675
```js
676
nm(['a/b.js', 'a/c.md'], '*.js');
677
//=> []
678

    
679
nm(['a/b.js', 'a/c.md'], '*.js', {matchBase: true});
680
//=> ['a/b.js']
681
```
682

    
683
</details>
684

    
685
<details>
686
<summary><strong>bash</strong></summary>
687

    
688
### options.bash
689

    
690
Enabled by default, this option enforces bash-like behavior with stars immediately following a bracket expression. Bash bracket expressions are similar to regex character classes, but unlike regex, a star following a bracket expression **does not repeat the bracketed characters**. Instead, the star is treated the same as an other star.
691

    
692
Type: `boolean`
693

    
694
Default: `true`
695

    
696
**Example**
697

    
698
```js
699
var files = ['abc', 'ajz'];
700
console.log(nm(files, '[a-c]*'));
701
//=> ['abc', 'ajz']
702

    
703
console.log(nm(files, '[a-c]*', {bash: false}));
704
```
705

    
706
</details>
707

    
708
<details>
709
<summary><strong>cache</strong></summary>
710

    
711
### options.cache
712

    
713
Disable regex and function memoization.
714

    
715
Type: `boolean`
716

    
717
Default: `undefined`
718

    
719
</details>
720

    
721
<details>
722
<summary><strong>dot</strong></summary>
723

    
724
### options.dot
725

    
726
Match dotfiles. Same behavior as [minimatch](https://github.com/isaacs/minimatch) option `dot`.
727

    
728
Type: `boolean`
729

    
730
Default: `false`
731

    
732
</details>
733

    
734
<details>
735
<summary><strong>failglob</strong></summary>
736

    
737
### options.failglob
738

    
739
Similar to the `--failglob` behavior in Bash, throws an error when no matches are found.
740

    
741
Type: `boolean`
742

    
743
Default: `undefined`
744

    
745
</details>
746

    
747
<details>
748
<summary><strong>ignore</strong></summary>
749

    
750
### options.ignore
751

    
752
String or array of glob patterns to match files to ignore.
753

    
754
Type: `String|Array`
755

    
756
Default: `undefined`
757

    
758
</details>
759

    
760
<details>
761
<summary><strong>matchBase</strong></summary>
762

    
763
### options.matchBase
764

    
765
Alias for [options.basename](#options-basename).
766

    
767
</details>
768

    
769
<details>
770
<summary><strong>nocase</strong></summary>
771

    
772
### options.nocase
773

    
774
Use a case-insensitive regex for matching files. Same behavior as [minimatch](https://github.com/isaacs/minimatch).
775

    
776
Type: `boolean`
777

    
778
Default: `undefined`
779

    
780
</details>
781

    
782
<details>
783
<summary><strong>nodupes</strong></summary>
784

    
785
### options.nodupes
786

    
787
Remove duplicate elements from the result array.
788

    
789
Type: `boolean`
790

    
791
Default: `true` (enabled by default)
792

    
793
**Example**
794

    
795
Example of using the `unescape` and `nodupes` options together:
796

    
797
```js
798
nm.match(['a/b/c', 'a/b/c'], '**');
799
//=> ['abc']
800

    
801
nm.match(['a/b/c', 'a/b/c'], '**', {nodupes: false});
802
//=> ['a/b/c', 'a/b/c']
803
```
804

    
805
</details>
806

    
807
<details>
808
<summary><strong>nonegate</strong></summary>
809

    
810
### options.noglobstar
811

    
812
Disable matching with globstars (`**`).
813

    
814
Type: `boolean`
815

    
816
Default: `undefined`
817

    
818
```js
819
nm(['a/b', 'a/b/c', 'a/b/c/d'], 'a/**');
820
//=> ['a/b', 'a/b/c', 'a/b/c/d']
821

    
822
nm(['a/b', 'a/b/c', 'a/b/c/d'], 'a/**', {noglobstar: true});
823
//=> ['a/b']
824
```
825

    
826
</details>
827

    
828
<details>
829
<summary><strong>nonegate</strong></summary>
830

    
831
### options.nonegate
832

    
833
Disallow negation (`!`) patterns, and treat leading `!` as a literal character to match.
834

    
835
Type: `boolean`
836

    
837
Default: `undefined`
838

    
839
</details>
840

    
841
<details>
842
<summary><strong>nonull</strong></summary>
843

    
844
### options.nonull
845

    
846
Alias for [options.nullglob](#options-nullglob).
847

    
848
</details>
849

    
850
<details>
851
<summary><strong>nullglob</strong></summary>
852

    
853
### options.nullglob
854

    
855
If `true`, when no matches are found the actual (arrayified) glob pattern is returned instead of an empty array. Same behavior as [minimatch](https://github.com/isaacs/minimatch) option `nonull`.
856

    
857
Type: `boolean`
858

    
859
Default: `undefined`
860

    
861
</details>
862

    
863
<details>
864
<summary><strong><a name="slash">slash</a></strong></summary>
865

    
866
### options.slash
867

    
868
Customize the slash character(s) to use for matching.
869

    
870
Type: `string|function`
871

    
872
Default: `[/\\]` (forward slash and backslash)
873

    
874
</details>
875

    
876
<details>
877
<summary><strong><a name="star">star</a></strong></summary>
878

    
879
### options.star
880

    
881
Customize the star character(s) to use for matching. It's not recommended that you modify this unless you have advanced knowledge of the compiler and matching rules.
882

    
883
Type: `string|function`
884

    
885
Default: `[^/\\]*?`
886

    
887
</details>
888

    
889
<details>
890
<summary><strong><a name="snapdragon">snapdragon</a></strong></summary>
891

    
892
### options.snapdragon
893

    
894
Pass your own instance of [snapdragon](https://github.com/jonschlinkert/snapdragon) to customize parsers or compilers.
895

    
896
Type: `object`
897

    
898
Default: `undefined`
899

    
900
</details>
901

    
902
<details>
903
<summary><strong>snapdragon</strong></summary>
904

    
905
### options.sourcemap
906

    
907
Generate a source map by enabling the `sourcemap` option with the `.parse`, `.compile`, or `.create` methods.
908

    
909
**Examples**
910

    
911
```js
912
var nm = require('nanomatch');
913

    
914
var res = nm.create('abc/*.js', {sourcemap: true});
915
console.log(res.map);
916
// { version: 3,
917
//   sources: [ 'string' ],
918
//   names: [],
919
//   mappings: 'AAAA,GAAG,EAAC,iBAAC,EAAC,EAAE',
920
//   sourcesContent: [ 'abc/*.js' ] }
921

    
922
var ast = nm.parse('abc/**/*.js');
923
var res = nm.compile(ast, {sourcemap: true});
924
console.log(res.map);
925
// { version: 3,
926
//   sources: [ 'string' ],
927
//   names: [],
928
//   mappings: 'AAAA,GAAG,EAAC,2BAAE,EAAC,iBAAC,EAAC,EAAE',
929
//   sourcesContent: [ 'abc/**/*.js' ] }
930
```
931

    
932
</details>
933

    
934
<details>
935
<summary><strong>unescape</strong></summary>
936

    
937
### options.unescape
938

    
939
Remove backslashes from returned matches.
940

    
941
Type: `boolean`
942

    
943
Default: `undefined`
944

    
945
**Example**
946

    
947
In this example we want to match a literal `*`:
948

    
949
```js
950
nm.match(['abc', 'a\\*c'], 'a\\*c');
951
//=> ['a\\*c']
952

    
953
nm.match(['abc', 'a\\*c'], 'a\\*c', {unescape: true});
954
//=> ['a*c']
955
```
956

    
957
</details>
958

    
959
<details>
960
<summary><strong>unixify</strong></summary>
961

    
962
### options.unixify
963

    
964
Convert path separators on returned files to posix/unix-style forward slashes.
965

    
966
Type: `boolean`
967

    
968
Default: `true`
969

    
970
**Example**
971

    
972
```js
973
nm.match(['a\\b\\c'], 'a/**');
974
//=> ['a/b/c']
975

    
976
nm.match(['a\\b\\c'], {unixify: false});
977
//=> ['a\\b\\c']
978
```
979

    
980
</details>
981

    
982
## Features
983

    
984
Nanomatch has full support for standard Bash glob features, including the following "metacharacters": `*`, `**`, `?` and `[...]`.
985

    
986
Here are some examples of how they work:
987

    
988
| **Pattern** | **Description** | 
989
| --- | --- |
990
| `*` | Matches any string except for `/`, leading `.`, or `/.` inside a path |
991
| `**` | Matches any string including `/`, but not a leading `.` or `/.` inside a path. More than two stars (e.g. `***` is treated the same as one star, and `**` loses its special meaning | when it's not the only thing in a path segment, per Bash specifications) |
992
| `foo*` | Matches any string beginning with `foo` |
993
| `*bar*` | Matches any string containing `bar` (beginning, middle or end) |
994
| `*.min.js` | Matches any string ending with `.min.js` |
995
| `[abc]*.js` | Matches any string beginning with `a`, `b`, or `c` and ending with `.js` |
996
| `abc?` | Matches `abcd` or `abcz` but not `abcde` |
997

    
998
The exceptions noted for `*` apply to all patterns that contain a `*`.
999

    
1000
**Not supported**
1001

    
1002
The following extended-globbing features are not supported:
1003

    
1004
* [brace expansion](https://github.com/jonschlinkert/braces) (e.g. `{a,b,c}`)
1005
* [extglobs](https://github.com/jonschlinkert/extglob) (e.g. `@(a|!(c|d))`)
1006
* [POSIX brackets](https://github.com/jonschlinkert/expand-brackets) (e.g. `[[:alpha:][:digit:]]`)
1007

    
1008
If you need any of these features consider using [micromatch](https://github.com/micromatch/micromatch) instead.
1009

    
1010
## Bash expansion libs
1011

    
1012
Nanomatch is part of a suite of libraries aimed at bringing the power and expressiveness of [Bash's](https://www.gnu.org/software/bash/) matching and expansion capabilities to JavaScript, _and - as you can see by the [benchmarks](#benchmarks) - without sacrificing speed_.
1013

    
1014
| **Related library** | **Matching Type** | **Example** | **Description** | 
1015
| --- | --- | --- | --- |
1016
| `nanomatch` (you are here) | Wildcards | `*` | [Filename expansion](https://www.gnu.org/software/bash/manual/html_node/Filename-Expansion.html#Filename-Expansion), also referred to as globbing and pathname expansion, allows the use of [wildcards](#features) for matching. |
1017
| [expand-tilde](https://github.com/jonschlinkert/expand-tilde) | Tildes | `~` | [Tilde expansion](https://www.gnu.org/software/bash/manual/html_node/Tilde-Expansion.html#Tilde-Expansion) converts the leading tilde in a file path to the user home directory. |
1018
| [braces](https://github.com/jonschlinkert/braces) | Braces | `{a,b,c}` | [Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html) |
1019
| [expand-brackets](https://github.com/jonschlinkert/expand-brackets) | Brackets | `[[:alpha:]]` | [POSIX character classes](https://www.gnu.org/software/grep/manual/html_node/Character-Classes-and-Bracket-Expressions.html) (also referred to as POSIX brackets, or POSIX character classes) |
1020
| [extglob](https://github.com/jonschlinkert/extglob) | Parens | `!(a\ | b)` | [Extglobs](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html#Pattern-Matching) |
1021
| [micromatch](https://github.com/micromatch/micromatch) | All | all | Micromatch is built on top of the other libraries. |
1022

    
1023
There are many resources available on the web if you want to dive deeper into how these features work in Bash.
1024

    
1025
## Benchmarks
1026

    
1027
### Running benchmarks
1028

    
1029
Install dev dependencies:
1030

    
1031
```bash
1032
npm i -d && node benchmark
1033
```
1034

    
1035
### Nanomatch vs. Minimatch vs. Multimatch
1036

    
1037
```bash
1038
# globstar-basic (182 bytes)
1039
  minimatch x 69,512 ops/sec ±1.92% (88 runs sampled)
1040
  multimatch x 63,376 ops/sec ±1.41% (89 runs sampled)
1041
  nanomatch x 432,451 ops/sec ±0.92% (88 runs sampled)
1042

    
1043
  fastest is nanomatch (by 651% avg)
1044

    
1045
# large-list-globstar (485686 bytes)
1046
  minimatch x 34.02 ops/sec ±1.42% (59 runs sampled)
1047
  multimatch x 33.58 ops/sec ±1.97% (58 runs sampled)
1048
  nanomatch x 483 ops/sec ±1.06% (86 runs sampled)
1049

    
1050
  fastest is nanomatch (by 1429% avg)
1051

    
1052
# long-list-globstar (194085 bytes)
1053
  minimatch x 383 ops/sec ±0.74% (90 runs sampled)
1054
  multimatch x 378 ops/sec ±0.59% (89 runs sampled)
1055
  nanomatch x 990 ops/sec ±1.14% (85 runs sampled)
1056

    
1057
  fastest is nanomatch (by 260% avg)
1058

    
1059
# negation-basic (132 bytes)
1060
  minimatch x 242,145 ops/sec ±1.17% (89 runs sampled)
1061
  multimatch x 76,403 ops/sec ±0.78% (92 runs sampled)
1062
  nanomatch x 537,253 ops/sec ±1.44% (86 runs sampled)
1063

    
1064
  fastest is nanomatch (by 337% avg)
1065

    
1066
# not-glob-basic (93 bytes)
1067
  minimatch x 252,402 ops/sec ±1.33% (89 runs sampled)
1068
  multimatch x 209,954 ops/sec ±1.30% (90 runs sampled)
1069
  nanomatch x 1,716,468 ops/sec ±1.13% (86 runs sampled)
1070

    
1071
  fastest is nanomatch (by 742% avg)
1072

    
1073
# star-basic (93 bytes)
1074
  minimatch x 182,780 ops/sec ±1.41% (91 runs sampled)
1075
  multimatch x 153,210 ops/sec ±0.72% (89 runs sampled)
1076
  nanomatch x 599,621 ops/sec ±1.22% (90 runs sampled)
1077

    
1078
  fastest is nanomatch (by 357% avg)
1079

    
1080
```
1081

    
1082
## About
1083

    
1084
<details>
1085
<summary><strong>Contributing</strong></summary>
1086

    
1087
Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
1088

    
1089
Please read the [contributing guide](.github/contributing.md) for advice on opening issues, pull requests, and coding standards.
1090

    
1091
</details>
1092

    
1093
<details>
1094
<summary><strong>Running Tests</strong></summary>
1095

    
1096
Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
1097

    
1098
```sh
1099
$ npm install && npm test
1100
```
1101

    
1102
</details>
1103

    
1104
<details>
1105
<summary><strong>Building docs</strong></summary>
1106

    
1107
_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
1108

    
1109
To generate the readme, run the following command:
1110

    
1111
```sh
1112
$ npm install -g verbose/verb#dev verb-generate-readme && verb
1113
```
1114

    
1115
</details>
1116

    
1117
### Related projects
1118

    
1119
You might also be interested in these projects:
1120

    
1121
* [extglob](https://www.npmjs.com/package/extglob): Extended glob support for JavaScript. Adds (almost) the expressive power of regular expressions to glob… [more](https://github.com/micromatch/extglob) | [homepage](https://github.com/micromatch/extglob "Extended glob support for JavaScript. Adds (almost) the expressive power of regular expressions to glob patterns.")
1122
* [is-extglob](https://www.npmjs.com/package/is-extglob): Returns true if a string has an extglob. | [homepage](https://github.com/jonschlinkert/is-extglob "Returns true if a string has an extglob.")
1123
* [is-glob](https://www.npmjs.com/package/is-glob): Returns `true` if the given string looks like a glob pattern or an extglob pattern… [more](https://github.com/jonschlinkert/is-glob) | [homepage](https://github.com/jonschlinkert/is-glob "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a bet")
1124
* [micromatch](https://www.npmjs.com/package/micromatch): Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch. | [homepage](https://github.com/micromatch/micromatch "Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch.")
1125

    
1126
### Contributors
1127

    
1128
| **Commits** | **Contributor** | 
1129
| --- | --- |
1130
| 164 | [jonschlinkert](https://github.com/jonschlinkert) |
1131
| 1 | [devongovett](https://github.com/devongovett) |
1132

    
1133
### Author
1134

    
1135
**Jon Schlinkert**
1136

    
1137
* [linkedin/in/jonschlinkert](https://linkedin.com/in/jonschlinkert)
1138
* [github/jonschlinkert](https://github.com/jonschlinkert)
1139
* [twitter/jonschlinkert](https://twitter.com/jonschlinkert)
1140

    
1141
### License
1142

    
1143
Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert).
1144
Released under the [MIT License](LICENSE).
1145

    
1146
***
1147

    
1148
_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on February 18, 2018._
(3-3/5)