Blame view

node_modules/regex-not/index.js 1.63 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
  'use strict';
  
  var extend = require('extend-shallow');
  var safe = require('safe-regex');
  
  /**
   * The main export is a function that takes a `pattern` string and an `options` object.
   *
   * ```js
   & var not = require('regex-not');
   & console.log(not('foo'));
   & //=> /^(?:(?!^(?:foo)$).)*$/
   * ```
   *
   * @param {String} `pattern`
   * @param {Object} `options`
   * @return {RegExp} Converts the given `pattern` to a regex using the specified `options`.
   * @api public
   */
  
  function toRegex(pattern, options) {
    return new RegExp(toRegex.create(pattern, options));
  }
  
  /**
   * Create a regex-compatible string from the given `pattern` and `options`.
   *
   * ```js
   & var not = require('regex-not');
   & console.log(not.create('foo'));
   & //=> '^(?:(?!^(?:foo)$).)*$'
   * ```
   * @param {String} `pattern`
   * @param {Object} `options`
   * @return {String}
   * @api public
   */
  
  toRegex.create = function(pattern, options) {
    if (typeof pattern !== 'string') {
      throw new TypeError('expected a string');
    }
  
    var opts = extend({}, options);
    if (opts.contains === true) {
      opts.strictNegate = false;
    }
  
    var open = opts.strictOpen !== false ? '^' : '';
    var close = opts.strictClose !== false ? '$' : '';
    var endChar = opts.endChar ? opts.endChar : '+';
    var str = pattern;
  
    if (opts.strictNegate === false) {
      str = '(?:(?!(?:' + pattern + ')).)' + endChar;
    } else {
      str = '(?:(?!^(?:' + pattern + ')$).)' + endChar;
    }
  
    var res = open + str + close;
    if (opts.safe === true && safe(res) === false) {
      throw new Error('potentially unsafe regular expression: ' + res);
    }
  
    return res;
  };
  
  /**
   * Expose `toRegex`
   */
  
  module.exports = toRegex;