2 * @fileoverview Tests for the prefer-regex-literals rule
3 * @author Milos Djermanovic
8 //------------------------------------------------------------------------------
10 //------------------------------------------------------------------------------
12 const rule
= require("../../../lib/rules/prefer-regex-literals");
13 const { RuleTester
} = require("../../../lib/rule-tester");
15 //------------------------------------------------------------------------------
17 //------------------------------------------------------------------------------
19 const ruleTester
= new RuleTester({ parserOptions
: { ecmaVersion
: 2022 } });
21 ruleTester
.run("prefer-regex-literals", rule
, {
27 // considered as dynamic
28 "new RegExp(pattern)",
29 "RegExp(pattern, 'g')",
31 "RegExp(prefix + 'a')",
32 "new RegExp('a' + suffix)",
33 "RegExp(`a` + suffix);",
34 "new RegExp(String.raw`a` + suffix);",
36 "RegExp('a', 'g' + flags)",
37 "new RegExp(String.raw`a`, flags);",
38 "RegExp(`${prefix}abc`)",
39 "new RegExp(`a${b}c`);",
40 "new RegExp(`a${''}c`);",
41 "new RegExp(String.raw`a${b}c`);",
42 "new RegExp(String.raw`a${''}c`);",
43 "new RegExp('a' + 'b')",
45 "new RegExp(/a/, 'u');",
48 code
: "new RegExp(/a/, flags);",
49 options
: [{ disallowRedundantWrapping
: true }]
52 code
: "new RegExp(/a/, `u${flags}`);",
53 options
: [{ disallowRedundantWrapping
: true }]
56 // redundant wrapping is allowed
58 code
: "new RegExp(/a/);",
62 code
: "new RegExp(/a/);",
63 options
: [{ disallowRedundantWrapping
: false }]
66 // invalid number of arguments
70 "new RegExp('a', 'g', 'b');",
71 "RegExp('a', 'g', 'b');",
72 "new RegExp(`a`, `g`, `b`);",
73 "RegExp(`a`, `g`, `b`);",
74 "new RegExp(String.raw`a`, String.raw`g`, String.raw`b`);",
75 "RegExp(String.raw`a`, String.raw`g`, String.raw`b`);",
77 code
: "new RegExp(/a/, 'u', 'foo');",
78 options
: [{ disallowRedundantWrapping
: true }]
82 "new RegExp(String`a`);",
84 "new RegExp(f(String.raw)`a`);",
85 "RegExp(string.raw`a`);",
86 "new RegExp(String.Raw`a`);",
87 "new RegExp(String[raw]`a`);",
88 "RegExp(String.raw.foo`a`);",
89 "new RegExp(String.foo.raw`a`);",
90 "RegExp(foo.String.raw`a`);",
91 "new RegExp(String.raw);",
93 // not the global String in String.raw``
94 "let String; new RegExp(String.raw`a`);",
95 "function foo() { var String; new RegExp(String.raw`a`); }",
96 "function foo(String) { RegExp(String.raw`a`); }",
97 "if (foo) { const String = bar; RegExp(String.raw`a`); }",
98 "/* globals String:off */ new RegExp(String.raw`a`);",
100 code
: "RegExp('a', String.raw`g`);",
101 globals
: { String
: "off" }
105 "new Regexp('abc');",
107 "new Regexp(String.raw`a`);",
109 // not the global RegExp
110 "let RegExp; new RegExp('a');",
111 "function foo() { var RegExp; RegExp('a', 'g'); }",
112 "function foo(RegExp) { new RegExp(String.raw`a`); }",
113 "if (foo) { const RegExp = bar; RegExp('a'); }",
114 "/* globals RegExp:off */ new RegExp('a');",
116 code
: "RegExp('a');",
117 globals
: { RegExp
: "off" }
119 "new globalThis.RegExp('a');",
121 code
: "new globalThis.RegExp('a');",
125 code
: "new globalThis.RegExp('a');",
126 env
: { es2017
: true }
129 code
: "class C { #RegExp; foo() { globalThis.#RegExp('a'); } }",
130 env
: { es2020
: true }
136 code
: "new RegExp('abc');",
137 errors
: [{ messageId
: "unexpectedRegExp", type
: "NewExpression" }]
140 code
: "RegExp('abc');",
141 errors
: [{ messageId
: "unexpectedRegExp", type
: "CallExpression" }]
144 code
: "new RegExp('abc', 'g');",
145 errors
: [{ messageId
: "unexpectedRegExp", type
: "NewExpression" }]
148 code
: "RegExp('abc', 'g');",
149 errors
: [{ messageId
: "unexpectedRegExp", type
: "CallExpression" }]
152 code
: "new RegExp(`abc`);",
153 errors
: [{ messageId
: "unexpectedRegExp", type
: "NewExpression" }]
156 code
: "RegExp(`abc`);",
157 errors
: [{ messageId
: "unexpectedRegExp", type
: "CallExpression" }]
160 code
: "new RegExp(`abc`, `g`);",
161 errors
: [{ messageId
: "unexpectedRegExp", type
: "NewExpression" }]
164 code
: "RegExp(`abc`, `g`);",
165 errors
: [{ messageId
: "unexpectedRegExp", type
: "CallExpression" }]
168 code
: "new RegExp(String.raw`abc`);",
169 errors
: [{ messageId
: "unexpectedRegExp", type
: "NewExpression" }]
172 code
: "RegExp(String.raw`abc`);",
173 errors
: [{ messageId
: "unexpectedRegExp", type
: "CallExpression" }]
176 code
: "new RegExp(String.raw`abc`, String.raw`g`);",
177 errors
: [{ messageId
: "unexpectedRegExp", type
: "NewExpression" }]
180 code
: "RegExp(String.raw`abc`, String.raw`g`);",
181 errors
: [{ messageId
: "unexpectedRegExp", type
: "CallExpression" }]
184 code
: "new RegExp(String['raw']`a`);",
185 errors
: [{ messageId
: "unexpectedRegExp", type
: "NewExpression" }]
188 code
: "new RegExp('');",
189 errors
: [{ messageId
: "unexpectedRegExp", type
: "NewExpression" }]
192 code
: "RegExp('', '');",
193 errors
: [{ messageId
: "unexpectedRegExp", type
: "CallExpression" }]
196 code
: "new RegExp(String.raw``);",
197 errors
: [{ messageId
: "unexpectedRegExp", type
: "NewExpression" }]
200 code
: "new RegExp('a', `g`);",
201 errors
: [{ messageId
: "unexpectedRegExp", type
: "NewExpression" }]
204 code
: "RegExp(`a`, 'g');",
205 errors
: [{ messageId
: "unexpectedRegExp", type
: "CallExpression" }]
208 code
: "RegExp(String.raw`a`, 'g');",
209 errors
: [{ messageId
: "unexpectedRegExp", type
: "CallExpression" }]
212 code
: "new RegExp(String.raw`\\d`, `g`);",
213 errors
: [{ messageId
: "unexpectedRegExp", type
: "NewExpression" }]
216 code
: "RegExp('a', String.raw`g`);",
217 errors
: [{ messageId
: "unexpectedRegExp", type
: "CallExpression" }]
220 code
: "new globalThis.RegExp('a');",
221 env
: { es2020
: true },
222 errors
: [{ messageId
: "unexpectedRegExp", type
: "NewExpression" }]
225 code
: "globalThis.RegExp('a');",
226 env
: { es2020
: true },
227 errors
: [{ messageId
: "unexpectedRegExp", type
: "CallExpression" }]
231 code
: "new RegExp(/a/);",
232 options
: [{ disallowRedundantWrapping
: true }],
233 errors
: [{ messageId
: "unexpectedRedundantRegExp", type
: "NewExpression", line
: 1, column
: 1 }]
236 code
: "new RegExp(/a/, 'u');",
237 options
: [{ disallowRedundantWrapping
: true }],
238 errors
: [{ messageId
: "unexpectedRedundantRegExpWithFlags", type
: "NewExpression", line
: 1, column
: 1 }]
241 code
: "new RegExp(/a/, `u`);",
242 options
: [{ disallowRedundantWrapping
: true }],
243 errors
: [{ messageId
: "unexpectedRedundantRegExpWithFlags", type
: "NewExpression", line
: 1, column
: 1 }]
246 code
: "new RegExp('a');",
247 options
: [{ disallowRedundantWrapping
: true }],
248 errors
: [{ messageId
: "unexpectedRegExp", type
: "NewExpression", line
: 1, column
: 1 }]
253 code
: "new RegExp((String?.raw)`a`);",
254 errors
: [{ messageId
: "unexpectedRegExp" }]