Projekt

Obecné

Profil

Stáhnout (32.6 KB) Statistiky
| Větev: | Revize:
1 3a515b92 cagy
# 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._