Skip to content

Commit 3173305

Browse files
authored
fix: update execScript message in no-implied-eval rule (#19937)
1 parent 14053ed commit 3173305

File tree

2 files changed

+75
-5
lines changed

2 files changed

+75
-5
lines changed

lib/rules/no-implied-eval.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ module.exports = {
3232
messages: {
3333
impliedEval:
3434
"Implied eval. Consider passing a function instead of a string.",
35+
execScript: "Implied eval. Do not use execScript().",
3536
},
3637
},
3738

@@ -85,9 +86,14 @@ module.exports = {
8586
isStaticString || isEvaluatedString(firstArgument);
8687

8788
if (isString) {
89+
const calleeName =
90+
node.callee.type === "Identifier"
91+
? node.callee.name
92+
: astUtils.getStaticPropertyName(node.callee);
93+
const isExecScript = calleeName === "execScript";
8894
context.report({
8995
node,
90-
messageId: "impliedEval",
96+
messageId: isExecScript ? "execScript" : "impliedEval",
9197
});
9298
}
9399
}

tests/lib/rules/no-implied-eval.js

Lines changed: 68 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,10 @@ ruleTester.run("no-implied-eval", rule, {
267267
{ code: 'setTimeout("x = 1;");', errors: [expectedError] },
268268
{ code: 'setTimeout("x = 1;", 100);', errors: [expectedError] },
269269
{ code: 'setInterval("x = 1;");', errors: [expectedError] },
270-
{ code: 'execScript("x = 1;");', errors: [expectedError] },
270+
{
271+
code: 'execScript("x = 1;");',
272+
errors: [{ messageId: "execScript", type: "CallExpression" }],
273+
},
271274

272275
{
273276
code: "const s = 'x=1'; setTimeout(s, 100);",
@@ -291,6 +294,11 @@ ruleTester.run("no-implied-eval", rule, {
291294
languageOptions: { globals: globals.browser },
292295
errors: [expectedError],
293296
},
297+
{
298+
code: "window.execScript('foo')",
299+
languageOptions: { globals: globals.browser },
300+
errors: [{ messageId: "execScript", type: "CallExpression" }],
301+
},
294302
{
295303
code: "window['setTimeout']('foo')",
296304
languageOptions: { globals: globals.browser },
@@ -306,11 +314,26 @@ ruleTester.run("no-implied-eval", rule, {
306314
languageOptions: { ecmaVersion: 6, globals: globals.browser },
307315
errors: [expectedError],
308316
},
317+
{
318+
code: "window['execScript']('foo')",
319+
languageOptions: { globals: globals.browser },
320+
errors: [{ messageId: "execScript", type: "CallExpression" }],
321+
},
322+
{
323+
code: "window[`execScript`]('foo')",
324+
languageOptions: { ecmaVersion: 6, globals: globals.browser },
325+
errors: [{ messageId: "execScript", type: "CallExpression" }],
326+
},
309327
{
310328
code: "window.window['setInterval']('foo')",
311329
languageOptions: { globals: globals.browser },
312330
errors: [expectedError],
313331
},
332+
{
333+
code: "window.window['execScript']('foo')",
334+
languageOptions: { globals: globals.browser },
335+
errors: [{ messageId: "execScript", type: "CallExpression" }],
336+
},
314337
{
315338
code: "global.setTimeout('foo')",
316339
languageOptions: { sourceType: "commonjs" },
@@ -321,6 +344,11 @@ ruleTester.run("no-implied-eval", rule, {
321344
languageOptions: { sourceType: "commonjs" },
322345
errors: [expectedError],
323346
},
347+
{
348+
code: "global.execScript('foo')",
349+
languageOptions: { sourceType: "commonjs" },
350+
errors: [{ messageId: "execScript", type: "CallExpression" }],
351+
},
324352
{
325353
code: "global['setTimeout']('foo')",
326354
languageOptions: { sourceType: "commonjs" },
@@ -336,11 +364,26 @@ ruleTester.run("no-implied-eval", rule, {
336364
languageOptions: { ecmaVersion: 6, sourceType: "commonjs" },
337365
errors: [expectedError],
338366
},
367+
{
368+
code: "global['execScript']('foo')",
369+
languageOptions: { sourceType: "commonjs" },
370+
errors: [{ messageId: "execScript", type: "CallExpression" }],
371+
},
372+
{
373+
code: "global[`execScript`]('foo')",
374+
languageOptions: { ecmaVersion: 6, sourceType: "commonjs" },
375+
errors: [{ messageId: "execScript", type: "CallExpression" }],
376+
},
339377
{
340378
code: "global.global['setInterval']('foo')",
341379
languageOptions: { sourceType: "commonjs" },
342380
errors: [expectedError],
343381
},
382+
{
383+
code: "global.global['execScript']('foo')",
384+
languageOptions: { sourceType: "commonjs" },
385+
errors: [{ messageId: "execScript", type: "CallExpression" }],
386+
},
344387
{
345388
code: "globalThis.setTimeout('foo')",
346389
languageOptions: { ecmaVersion: 2020 },
@@ -351,6 +394,11 @@ ruleTester.run("no-implied-eval", rule, {
351394
languageOptions: { ecmaVersion: 2020 },
352395
errors: [expectedError],
353396
},
397+
{
398+
code: "globalThis.execScript('foo')",
399+
languageOptions: { ecmaVersion: 2020 },
400+
errors: [{ messageId: "execScript", type: "CallExpression" }],
401+
},
354402

355403
// template literals
356404
{
@@ -456,7 +504,7 @@ ruleTester.run("no-implied-eval", rule, {
456504

457505
// no error on line 2
458506
{
459-
messageId: "impliedEval",
507+
messageId: "execScript",
460508
type: "CallExpression",
461509
line: 3,
462510
},
@@ -479,7 +527,7 @@ ruleTester.run("no-implied-eval", rule, {
479527

480528
// no error on line 2
481529
{
482-
messageId: "impliedEval",
530+
messageId: "execScript",
483531
type: "CallExpression",
484532
line: 3,
485533
},
@@ -502,7 +550,7 @@ ruleTester.run("no-implied-eval", rule, {
502550

503551
// no error on line 2
504552
{
505-
messageId: "impliedEval",
553+
messageId: "execScript",
506554
type: "CallExpression",
507555
line: 3,
508556
},
@@ -526,5 +574,21 @@ ruleTester.run("no-implied-eval", rule, {
526574
},
527575
errors: [{ messageId: "impliedEval" }],
528576
},
577+
{
578+
code: "window?.execScript('code')",
579+
languageOptions: {
580+
ecmaVersion: 2020,
581+
globals: { window: "readonly" },
582+
},
583+
errors: [{ messageId: "execScript" }],
584+
},
585+
{
586+
code: "(window?.execScript)('code')",
587+
languageOptions: {
588+
ecmaVersion: 2020,
589+
globals: { window: "readonly" },
590+
},
591+
errors: [{ messageId: "execScript" }],
592+
},
529593
],
530594
});

0 commit comments

Comments
 (0)