source: trip-planner-front/node_modules/to-regex/index.js@ 1ad8e64

Last change on this file since 1ad8e64 was 6a3a178, checked in by Ema <ema_spirova@…>, 3 years ago

initial commit

  • Property mode set to 100644
File size: 3.6 KB
RevLine 
[6a3a178]1'use strict';
2
3var safe = require('safe-regex');
4var define = require('define-property');
5var extend = require('extend-shallow');
6var not = require('regex-not');
7var MAX_LENGTH = 1024 * 64;
8
9/**
10 * Session cache
11 */
12
13var cache = {};
14
15/**
16 * Create a regular expression from the given `pattern` string.
17 *
18 * @param {String|RegExp} `pattern` Pattern can be a string or regular expression.
19 * @param {Object} `options`
20 * @return {RegExp}
21 * @api public
22 */
23
24module.exports = function(patterns, options) {
25 if (!Array.isArray(patterns)) {
26 return makeRe(patterns, options);
27 }
28 return makeRe(patterns.join('|'), options);
29};
30
31/**
32 * Create a regular expression from the given `pattern` string.
33 *
34 * @param {String|RegExp} `pattern` Pattern can be a string or regular expression.
35 * @param {Object} `options`
36 * @return {RegExp}
37 * @api public
38 */
39
40function makeRe(pattern, options) {
41 if (pattern instanceof RegExp) {
42 return pattern;
43 }
44
45 if (typeof pattern !== 'string') {
46 throw new TypeError('expected a string');
47 }
48
49 if (pattern.length > MAX_LENGTH) {
50 throw new Error('expected pattern to be less than ' + MAX_LENGTH + ' characters');
51 }
52
53 var key = pattern;
54 // do this before shallow cloning options, it's a lot faster
55 if (!options || (options && options.cache !== false)) {
56 key = createKey(pattern, options);
57
58 if (cache.hasOwnProperty(key)) {
59 return cache[key];
60 }
61 }
62
63 var opts = extend({}, options);
64 if (opts.contains === true) {
65 if (opts.negate === true) {
66 opts.strictNegate = false;
67 } else {
68 opts.strict = false;
69 }
70 }
71
72 if (opts.strict === false) {
73 opts.strictOpen = false;
74 opts.strictClose = false;
75 }
76
77 var open = opts.strictOpen !== false ? '^' : '';
78 var close = opts.strictClose !== false ? '$' : '';
79 var flags = opts.flags || '';
80 var regex;
81
82 if (opts.nocase === true && !/i/.test(flags)) {
83 flags += 'i';
84 }
85
86 try {
87 if (opts.negate || typeof opts.strictNegate === 'boolean') {
88 pattern = not.create(pattern, opts);
89 }
90
91 var str = open + '(?:' + pattern + ')' + close;
92 regex = new RegExp(str, flags);
93
94 if (opts.safe === true && safe(regex) === false) {
95 throw new Error('potentially unsafe regular expression: ' + regex.source);
96 }
97
98 } catch (err) {
99 if (opts.strictErrors === true || opts.safe === true) {
100 err.key = key;
101 err.pattern = pattern;
102 err.originalOptions = options;
103 err.createdOptions = opts;
104 throw err;
105 }
106
107 try {
108 regex = new RegExp('^' + pattern.replace(/(\W)/g, '\\$1') + '$');
109 } catch (err) {
110 regex = /.^/; //<= match nothing
111 }
112 }
113
114 if (opts.cache !== false) {
115 memoize(regex, key, pattern, opts);
116 }
117 return regex;
118}
119
120/**
121 * Memoize generated regex. This can result in dramatic speed improvements
122 * and simplify debugging by adding options and pattern to the regex. It can be
123 * disabled by passing setting `options.cache` to false.
124 */
125
126function memoize(regex, key, pattern, options) {
127 define(regex, 'cached', true);
128 define(regex, 'pattern', pattern);
129 define(regex, 'options', options);
130 define(regex, 'key', key);
131 cache[key] = regex;
132}
133
134/**
135 * Create the key to use for memoization. The key is generated
136 * by iterating over the options and concatenating key-value pairs
137 * to the pattern string.
138 */
139
140function createKey(pattern, options) {
141 if (!options) return pattern;
142 var key = pattern;
143 for (var prop in options) {
144 if (options.hasOwnProperty(prop)) {
145 key += ';' + prop + '=' + String(options[prop]);
146 }
147 }
148 return key;
149}
150
151/**
152 * Expose `makeRe`
153 */
154
155module.exports.makeRe = makeRe;
Note: See TracBrowser for help on using the repository browser.