aboutsummaryrefslogtreecommitdiff
path: root/node_modules/safe-regex/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/safe-regex/index.js')
-rw-r--r--node_modules/safe-regex/index.js43
1 files changed, 43 insertions, 0 deletions
diff --git a/node_modules/safe-regex/index.js b/node_modules/safe-regex/index.js
new file mode 100644
index 0000000..488f501
--- /dev/null
+++ b/node_modules/safe-regex/index.js
@@ -0,0 +1,43 @@
+var parse = require('ret');
+var types = parse.types;
+
+module.exports = function (re, opts) {
+ if (!opts) opts = {};
+ var replimit = opts.limit === undefined ? 25 : opts.limit;
+
+ if (isRegExp(re)) re = re.source;
+ else if (typeof re !== 'string') re = String(re);
+
+ try { re = parse(re) }
+ catch (err) { return false }
+
+ var reps = 0;
+ return (function walk (node, starHeight) {
+ if (node.type === types.REPETITION) {
+ starHeight ++;
+ reps ++;
+ if (starHeight > 1) return false;
+ if (reps > replimit) return false;
+ }
+
+ if (node.options) {
+ for (var i = 0, len = node.options.length; i < len; i++) {
+ var ok = walk({ stack: node.options[i] }, starHeight);
+ if (!ok) return false;
+ }
+ }
+ var stack = node.stack || (node.value && node.value.stack);
+ if (!stack) return true;
+
+ for (var i = 0; i < stack.length; i++) {
+ var ok = walk(stack[i], starHeight);
+ if (!ok) return false;
+ }
+
+ return true;
+ })(re, 0);
+};
+
+function isRegExp (x) {
+ return {}.toString.call(x) === '[object RegExp]';
+}