'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); } } }