index.js
 1  var parse = require('ret');
 2  var types = parse.types;
 3  
 4  module.exports = function (re, opts) {
 5      if (!opts) opts = {};
 6      var replimit = opts.limit === undefined ? 25 : opts.limit;
 7      
 8      if (isRegExp(re)) re = re.source;
 9      else if (typeof re !== 'string') re = String(re);
10      
11      try { re = parse(re) }
12      catch (err) { return false }
13      
14      var reps = 0;
15      return (function walk (node, starHeight) {
16          if (node.type === types.REPETITION) {
17              starHeight ++;
18              reps ++;
19              if (starHeight > 1) return false;
20              if (reps > replimit) return false;
21          }
22          
23          if (node.options) {
24              for (var i = 0, len = node.options.length; i < len; i++) {
25                  var ok = walk({ stack: node.options[i] }, starHeight);
26                  if (!ok) return false;
27              }
28          }
29          var stack = node.stack || (node.value && node.value.stack);
30          if (!stack) return true;
31          
32          for (var i = 0; i < stack.length; i++) {
33              var ok = walk(stack[i], starHeight);
34              if (!ok) return false;
35          }
36          
37          return true;
38      })(re, 0);
39  };
40  
41  function isRegExp (x) {
42      return {}.toString.call(x) === '[object RegExp]';
43  }