| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339 | 'use strict';/*** Nanomatch compilers*/module.exports = function(nanomatch, options) {  function slash() {    if (options && typeof options.slash === 'string') {      return options.slash;    }    if (options && typeof options.slash === 'function') {      return options.slash.call(nanomatch);    }    return '\\\\/';  }  function star() {    if (options && typeof options.star === 'string') {      return options.star;    }    if (options && typeof options.star === 'function') {      return options.star.call(nanomatch);    }    return '[^' + slash() + ']*?';  }  var ast = nanomatch.ast = nanomatch.parser.ast;  ast.state = nanomatch.parser.state;  nanomatch.compiler.state = ast.state;  nanomatch.compiler    /**     * Negation / escaping     */    .set('not', function(node) {      var prev = this.prev();      if (this.options.nonegate === true || prev.type !== 'bos') {        return this.emit('\\' + node.val, node);      }      return this.emit(node.val, node);    })    .set('escape', function(node) {      if (this.options.unescape && /^[-\w_.]/.test(node.val)) {        return this.emit(node.val, node);      }      return this.emit('\\' + node.val, node);    })    .set('quoted', function(node) {      return this.emit(node.val, node);    })    /**     * Regex     */    .set('dollar', function(node) {      if (node.parent.type === 'bracket') {        return this.emit(node.val, node);      }      return this.emit('\\' + node.val, node);    })    /**     * Dot: "."     */    .set('dot', function(node) {      if (node.dotfiles === true) this.dotfiles = true;      return this.emit('\\' + node.val, node);    })    /**     * Slashes: "/" and "\"     */    .set('backslash', function(node) {      return this.emit(node.val, node);    })    .set('slash', function(node, nodes, i) {      var val = '[' + slash() + ']';      var parent = node.parent;      var prev = this.prev();      // set "node.hasSlash" to true on all ancestor parens nodes      while (parent.type === 'paren' && !parent.hasSlash) {        parent.hasSlash = true;        parent = parent.parent;      }      if (prev.addQmark) {        val += '?';      }      // word boundary      if (node.rest.slice(0, 2) === '\\b') {        return this.emit(val, node);      }      // globstars      if (node.parsed === '**' || node.parsed === './**') {        this.output = '(?:' + this.output;        return this.emit(val + ')?', node);      }      // negation      if (node.parsed === '!**' && this.options.nonegate !== true) {        return this.emit(val + '?\\b', node);      }      return this.emit(val, node);    })    /**     * Square brackets     */    .set('bracket', function(node) {      var close = node.close;      var open = !node.escaped ? '[' : '\\[';      var negated = node.negated;      var inner = node.inner;      var val = node.val;      if (node.escaped === true) {        inner = inner.replace(/\\?(\W)/g, '\\$1');        negated = '';      }      if (inner === ']-') {        inner = '\\]\\-';      }      if (negated && inner.indexOf('.') === -1) {        inner += '.';      }      if (negated && inner.indexOf('/') === -1) {        inner += '/';      }      val = open + negated + inner + close;      return this.emit(val, node);    })    /**     * Square: "[.]" (only matches a single character in brackets)     */    .set('square', function(node) {      var val = (/^\W/.test(node.val) ? '\\' : '') + node.val;      return this.emit(val, node);    })    /**     * Question mark: "?"     */    .set('qmark', function(node) {      var prev = this.prev();      // don't use "slash" variable so that we always avoid      // matching backslashes and slashes with a qmark      var val = '[^.\\\\/]';      if (this.options.dot || (prev.type !== 'bos' && prev.type !== 'slash')) {        val = '[^\\\\/]';      }      if (node.parsed.slice(-1) === '(') {        var ch = node.rest.charAt(0);        if (ch === '!' || ch === '=' || ch === ':') {          return this.emit(node.val, node);        }      }      if (node.val.length > 1) {        val += '{' + node.val.length + '}';      }      return this.emit(val, node);    })    /**     * Plus     */    .set('plus', function(node) {      var prev = node.parsed.slice(-1);      if (prev === ']' || prev === ')') {        return this.emit(node.val, node);      }      if (!this.output || (/[?*+]/.test(ch) && node.parent.type !== 'bracket')) {        return this.emit('\\+', node);      }      var ch = this.output.slice(-1);      if (/\w/.test(ch) && !node.inside) {        return this.emit('+\\+?', node);      }      return this.emit('+', node);    })    /**     * globstar: '**'     */    .set('globstar', function(node, nodes, i) {      if (!this.output) {        this.state.leadingGlobstar = true;      }      var prev = this.prev();      var before = this.prev(2);      var next = this.next();      var after = this.next(2);      var type = prev.type;      var val = node.val;      if (prev.type === 'slash' && next.type === 'slash') {        if (before.type === 'text') {          this.output += '?';          if (after.type !== 'text') {            this.output += '\\b';          }        }      }      var parsed = node.parsed;      if (parsed.charAt(0) === '!') {        parsed = parsed.slice(1);      }      var isInside = node.isInside.paren || node.isInside.brace;      if (parsed && type !== 'slash' && type !== 'bos' && !isInside) {        val = star();      } else {        val = this.options.dot !== true          ? '(?:(?!(?:[' + slash() + ']|^)\\.).)*?'          : '(?:(?!(?:[' + slash() + ']|^)(?:\\.{1,2})($|[' + slash() + ']))(?!\\.{2}).)*?';      }      if ((type === 'slash' || type === 'bos') && this.options.dot !== true) {        val = '(?!\\.)' + val;      }      if (prev.type === 'slash' && next.type === 'slash' && before.type !== 'text') {        if (after.type === 'text' || after.type === 'star') {          node.addQmark = true;        }      }      if (this.options.capture) {        val = '(' + val + ')';      }      return this.emit(val, node);    })    /**     * Star: "*"     */    .set('star', function(node, nodes, i) {      var prior = nodes[i - 2] || {};      var prev = this.prev();      var next = this.next();      var type = prev.type;      function isStart(n) {        return n.type === 'bos' || n.type === 'slash';      }      if (this.output === '' && this.options.contains !== true) {        this.output = '(?![' + slash() + '])';      }      if (type === 'bracket' && this.options.bash === false) {        var str = next && next.type === 'bracket' ? star() : '*?';        if (!prev.nodes || prev.nodes[1].type !== 'posix') {          return this.emit(str, node);        }      }      var prefix = !this.dotfiles && type !== 'text' && type !== 'escape'        ? (this.options.dot ? '(?!(?:^|[' + slash() + '])\\.{1,2}(?:$|[' + slash() + ']))' : '(?!\\.)')        : '';      if (isStart(prev) || (isStart(prior) && type === 'not')) {        if (prefix !== '(?!\\.)') {          prefix += '(?!(\\.{2}|\\.[' + slash() + ']))(?=.)';        } else {          prefix += '(?=.)';        }      } else if (prefix === '(?!\\.)') {        prefix = '';      }      if (prev.type === 'not' && prior.type === 'bos' && this.options.dot === true) {        this.output = '(?!\\.)' + this.output;      }      var output = prefix + star();      if (this.options.capture) {        output = '(' + output + ')';      }      return this.emit(output, node);    })    /**     * Text     */    .set('text', function(node) {      return this.emit(node.val, node);    })    /**     * End-of-string     */    .set('eos', function(node) {      var prev = this.prev();      var val = node.val;      this.output = '(?:\\.[' + slash() + '](?=.))?' + this.output;      if (this.state.metachar && prev.type !== 'qmark' && prev.type !== 'slash') {        val += (this.options.contains ? '[' + slash() + ']?' : '(?:[' + slash() + ']|$)');      }      return this.emit(val, node);    });  /**   * Allow custom compilers to be passed on options   */  if (options && typeof options.compilers === 'function') {    options.compilers(nanomatch.compiler);  }};
 |