You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							72 lines
						
					
					
						
							1.6 KiB
						
					
					
				
			
		
		
	
	
							72 lines
						
					
					
						
							1.6 KiB
						
					
					
				'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;
 | 
						|
 |