'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;