@@ -124,6 +124,27 @@ export default createRule({
124
124
) ;
125
125
}
126
126
127
+ function escapeString ( str : string ) : string {
128
+ const EscapeMap = {
129
+ '\0' : '\\0' ,
130
+ "'" : "\\'" ,
131
+ '\\' : '\\\\' ,
132
+ '\n' : '\\n' ,
133
+ '\r' : '\\r' ,
134
+ '\v' : '\\v' ,
135
+ '\t' : '\\t' ,
136
+ '\f' : '\\f' ,
137
+ // "\b" cause unexpected replacements
138
+ // '\b': '\\b',
139
+ } ;
140
+ const replaceRegex = new RegExp ( Object . values ( EscapeMap ) . join ( '|' ) , 'g' ) ;
141
+
142
+ return str . replace (
143
+ replaceRegex ,
144
+ char => EscapeMap [ char as keyof typeof EscapeMap ] ,
145
+ ) ;
146
+ }
147
+
127
148
function checkArrayIndexOf (
128
149
node : TSESTree . MemberExpression ,
129
150
allowFixing : boolean ,
@@ -202,12 +223,11 @@ export default createRule({
202
223
} ,
203
224
204
225
// /bar/.test(foo)
205
- 'CallExpression > MemberExpression.callee[property.name="test"][computed=false]' (
206
- node : TSESTree . MemberExpression ,
226
+ 'CallExpression[arguments.length=1] > MemberExpression.callee[property.name="test"][computed=false]' (
227
+ node : TSESTree . MemberExpression & { parent : TSESTree . CallExpression } ,
207
228
) : void {
208
- const callNode = node . parent as TSESTree . CallExpression ;
209
- const text =
210
- callNode . arguments . length === 1 ? parseRegExp ( node . object ) : null ;
229
+ const callNode = node . parent ;
230
+ const text = parseRegExp ( node . object ) ;
211
231
if ( text == null ) {
212
232
return ;
213
233
}
@@ -237,13 +257,14 @@ export default createRule({
237
257
argNode . type !== AST_NODE_TYPES . CallExpression ;
238
258
239
259
yield fixer . removeRange ( [ callNode . range [ 0 ] , argNode . range [ 0 ] ] ) ;
260
+ yield fixer . removeRange ( [ argNode . range [ 1 ] , callNode . range [ 1 ] ] ) ;
240
261
if ( needsParen ) {
241
262
yield fixer . insertTextBefore ( argNode , '(' ) ;
242
263
yield fixer . insertTextAfter ( argNode , ')' ) ;
243
264
}
244
265
yield fixer . insertTextAfter (
245
266
argNode ,
246
- `${ node . optional ? '?.' : '.' } includes('${ text } ' ` ,
267
+ `${ node . optional ? '?.' : '.' } includes('${ escapeString ( text ) } ') ` ,
247
268
) ;
248
269
} ,
249
270
} ) ;
0 commit comments