| 'use strict'; | 
|   | 
| var nanomatch = require('nanomatch'); | 
| var extglob = require('extglob'); | 
|   | 
| module.exports = function(snapdragon) { | 
|   var compilers = snapdragon.compiler.compilers; | 
|   var opts = snapdragon.options; | 
|   | 
|   // register nanomatch compilers | 
|   snapdragon.use(nanomatch.compilers); | 
|   | 
|   // get references to some specific nanomatch compilers before they | 
|   // are overridden by the extglob and/or custom compilers | 
|   var escape = compilers.escape; | 
|   var qmark = compilers.qmark; | 
|   var slash = compilers.slash; | 
|   var star = compilers.star; | 
|   var text = compilers.text; | 
|   var plus = compilers.plus; | 
|   var dot = compilers.dot; | 
|   | 
|   // register extglob compilers or escape exglobs if disabled | 
|   if (opts.extglob === false || opts.noext === true) { | 
|     snapdragon.compiler.use(escapeExtglobs); | 
|   } else { | 
|     snapdragon.use(extglob.compilers); | 
|   } | 
|   | 
|   snapdragon.use(function() { | 
|     this.options.star = this.options.star || function(/*node*/) { | 
|       return '[^\\\\/]*?'; | 
|     }; | 
|   }); | 
|   | 
|   // custom micromatch compilers | 
|   snapdragon.compiler | 
|   | 
|     // reset referenced compiler | 
|     .set('dot', dot) | 
|     .set('escape', escape) | 
|     .set('plus', plus) | 
|     .set('slash', slash) | 
|     .set('qmark', qmark) | 
|     .set('star', star) | 
|     .set('text', text); | 
| }; | 
|   | 
| function escapeExtglobs(compiler) { | 
|   compiler.set('paren', function(node) { | 
|     var val = ''; | 
|     visit(node, function(tok) { | 
|       if (tok.val) val += (/^\W/.test(tok.val) ? '\\' : '') + tok.val; | 
|     }); | 
|     return this.emit(val, node); | 
|   }); | 
|   | 
|   /** | 
|    * Visit `node` with the given `fn` | 
|    */ | 
|   | 
|   function visit(node, fn) { | 
|     return node.nodes ? mapVisit(node.nodes, fn) : fn(node); | 
|   } | 
|   | 
|   /** | 
|    * Map visit over array of `nodes`. | 
|    */ | 
|   | 
|   function mapVisit(nodes, fn) { | 
|     var len = nodes.length; | 
|     var idx = -1; | 
|     while (++idx < len) { | 
|       visit(nodes[idx], fn); | 
|     } | 
|   } | 
| } |