'use strict' const parse = require('ret') const types = parse.types function safeRegex (re, opts) { if (!opts) opts = {} const 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 } let reps = 0 return (function walk (node, starHeight) { let i let ok let len if (node.type === types.REPETITION) { starHeight++ reps++ if (starHeight > 1) return false if (reps > replimit) return false } if (node.options) { for (i = 0, len = node.options.length; i < len; i++) { ok = walk({ stack: node.options[i] }, starHeight) if (!ok) return false } } const stack = node.stack || (node.value && node.value.stack) if (!stack) return true for (i = 0; i < stack.length; i++) { ok = walk(stack[i], starHeight) if (!ok) return false } return true })(re, 0) } function isRegExp (x) { return {}.toString.call(x) === '[object RegExp]' } module.exports = safeRegex module.exports.default = safeRegex module.exports.safeRegex = safeRegex