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