]> git.proxmox.com Git - pve-eslint.git/blame - eslint/tests/lib/rules/no-implied-eval.js
upgrade to v7.0.0
[pve-eslint.git] / eslint / tests / lib / rules / no-implied-eval.js
CommitLineData
eb39fafa
DC
1/**
2 * @fileoverview Tests for no-implied-eval rule.
3 * @author James Allardice
4 */
5
6"use strict";
7
8//------------------------------------------------------------------------------
9// Requirements
10//------------------------------------------------------------------------------
11
12const rule = require("../../../lib/rules/no-implied-eval"),
13 { RuleTester } = require("../../../lib/rule-tester");
14
15//------------------------------------------------------------------------------
16// Tests
17//------------------------------------------------------------------------------
18
19const ruleTester = new RuleTester(),
20 expectedError = { messageId: "impliedEval", type: "CallExpression" };
21
22ruleTester.run("no-implied-eval", rule, {
23 valid: [
24 "setTimeout();",
25
26 { code: "setTimeout;", env: { browser: true } },
27 { code: "setTimeout = foo;", env: { browser: true } },
28 { code: "window.setTimeout;", env: { browser: true } },
29 { code: "window.setTimeout = foo;", env: { browser: true } },
30 { code: "window['setTimeout'];", env: { browser: true } },
31 { code: "window['setTimeout'] = foo;", env: { browser: true } },
32 { code: "global.setTimeout;", env: { node: true } },
33 { code: "global.setTimeout = foo;", env: { node: true } },
34 { code: "global['setTimeout'];", env: { node: true } },
35 { code: "global['setTimeout'] = foo;", env: { node: true } },
36 { code: "globalThis['setTimeout'] = foo;", env: { es2020: true } },
37
38 "window.setTimeout('foo')",
39 "window.setInterval('foo')",
40 "window['setTimeout']('foo')",
41 "window['setInterval']('foo')",
42
43 { code: "window.setTimeout('foo')", env: { node: true } },
44 { code: "window.setInterval('foo')", env: { node: true } },
45 { code: "window['setTimeout']('foo')", env: { node: true } },
46 { code: "window['setInterval']('foo')", env: { node: true } },
47 { code: "global.setTimeout('foo')", env: { browser: true } },
48 { code: "global.setInterval('foo')", env: { browser: true } },
49 { code: "global['setTimeout']('foo')", env: { browser: true } },
50 { code: "global['setInterval']('foo')", env: { browser: true } },
51 { code: "globalThis.setTimeout('foo')", env: { es6: true } },
52 { code: "globalThis['setInterval']('foo')", env: { es2017: true } },
53
54 { code: "window[`SetTimeOut`]('foo', 100);", parserOptions: { ecmaVersion: 6 }, env: { browser: true } },
55 { code: "global[`SetTimeOut`]('foo', 100);", parserOptions: { ecmaVersion: 6 }, env: { node: true } },
56 { code: "global[`setTimeout${foo}`]('foo', 100);", parserOptions: { ecmaVersion: 6 }, env: { browser: true } },
57 { code: "global[`setTimeout${foo}`]('foo', 100);", parserOptions: { ecmaVersion: 6 }, env: { node: true } },
58 { code: "globalThis[`setTimeout${foo}`]('foo', 100);", parserOptions: { ecmaVersion: 6 }, env: { es2020: true } },
59
60 // normal usage
61 "setTimeout(function() { x = 1; }, 100);",
62 "setInterval(function() { x = 1; }, 100)",
63 "execScript(function() { x = 1; }, 100)",
64 { code: "window.setTimeout(function() { x = 1; }, 100);", env: { browser: true } },
65 { code: "window.setInterval(function() { x = 1; }, 100);", env: { browser: true } },
66 { code: "window.execScript(function() { x = 1; }, 100);", env: { browser: true } },
67 { code: "window.setTimeout(foo, 100);", env: { browser: true } },
68 { code: "window.setInterval(foo, 100);", env: { browser: true } },
69 { code: "window.execScript(foo, 100);", env: { browser: true } },
70 { code: "global.setTimeout(function() { x = 1; }, 100);", env: { node: true } },
71 { code: "global.setInterval(function() { x = 1; }, 100);", env: { node: true } },
72 { code: "global.execScript(function() { x = 1; }, 100);", env: { node: true } },
73 { code: "global.setTimeout(foo, 100);", env: { node: true } },
74 { code: "global.setInterval(foo, 100);", env: { node: true } },
75 { code: "global.execScript(foo, 100);", env: { node: true } },
76 { code: "globalThis.setTimeout(foo, 100);", env: { es2020: true } },
77
78 // only checks on top-level statements or window.*
79 "foo.setTimeout('hi')",
80
81 // identifiers are fine
82 "setTimeout(foo, 10)",
83 "setInterval(1, 10)",
84 "execScript(2)",
85
86 // as are function expressions
87 "setTimeout(function() {}, 10)",
88
89 // setInterval
90 "foo.setInterval('hi')",
91 "setInterval(foo, 10)",
92 "setInterval(function() {}, 10)",
93
94 // execScript
95 "foo.execScript('hi')",
96 "execScript(foo)",
97 "execScript(function() {})",
98
99 // a binary plus on non-strings doesn't guarantee a string
100 "setTimeout(foo + bar, 10)",
101
102 // doesn't check anything but the first argument
103 "setTimeout(foobar, 'buzz')",
104 "setTimeout(foobar, foo + 'bar')",
105
106 // only checks immediate subtrees of the argument
107 "setTimeout(function() { return 'foobar'; }, 10)",
108
109 // https://github.com/eslint/eslint/issues/7821
110 "setTimeoutFooBar('Foo Bar')",
111
112 { code: "foo.window.setTimeout('foo', 100);", env: { browser: true } },
113 { code: "foo.global.setTimeout('foo', 100);", env: { node: true } },
114 { code: "var window; window.setTimeout('foo', 100);", env: { browser: true } },
115 { code: "var global; global.setTimeout('foo', 100);", env: { node: true } },
116 { code: "function foo(window) { window.setTimeout('foo', 100); }", env: { browser: true } },
117 { code: "function foo(global) { global.setTimeout('foo', 100); }", env: { node: true } },
118 { code: "foo('', window.setTimeout);", env: { browser: true } },
119 { code: "foo('', global.setTimeout);", env: { node: true } }
120 ],
121
122 invalid: [
123 { code: "setTimeout(\"x = 1;\");", errors: [expectedError] },
124 { code: "setTimeout(\"x = 1;\", 100);", errors: [expectedError] },
125 { code: "setInterval(\"x = 1;\");", errors: [expectedError] },
126 { code: "execScript(\"x = 1;\");", errors: [expectedError] },
127
128 { code: "const s = 'x=1'; setTimeout(s, 100);", parserOptions: { ecmaVersion: 6 }, errors: [expectedError] },
129 { code: "setTimeout(String('x=1'), 100);", parserOptions: { ecmaVersion: 6 }, errors: [expectedError] },
130
131 // member expressions
132 { code: "window.setTimeout('foo')", env: { browser: true }, errors: [expectedError] },
133 { code: "window.setInterval('foo')", env: { browser: true }, errors: [expectedError] },
134 { code: "window['setTimeout']('foo')", env: { browser: true }, errors: [expectedError] },
135 { code: "window['setInterval']('foo')", env: { browser: true }, errors: [expectedError] },
136 { code: "window[`setInterval`]('foo')", parserOptions: { ecmaVersion: 6 }, env: { browser: true }, errors: [expectedError] },
137 { code: "window.window['setInterval']('foo')", env: { browser: true }, errors: [expectedError] },
138 { code: "global.setTimeout('foo')", env: { node: true }, errors: [expectedError] },
139 { code: "global.setInterval('foo')", env: { node: true }, errors: [expectedError] },
140 { code: "global['setTimeout']('foo')", env: { node: true }, errors: [expectedError] },
141 { code: "global['setInterval']('foo')", env: { node: true }, errors: [expectedError] },
142 { code: "global[`setInterval`]('foo')", parserOptions: { ecmaVersion: 6 }, env: { node: true }, errors: [expectedError] },
143 { code: "global.global['setInterval']('foo')", env: { node: true }, errors: [expectedError] },
144 { code: "globalThis.setTimeout('foo')", env: { es2020: true }, errors: [expectedError] },
145 { code: "globalThis.setInterval('foo')", env: { es2020: true }, errors: [expectedError] },
146
147 // template literals
148 { code: "setTimeout(`foo${bar}`)", parserOptions: { ecmaVersion: 6 }, errors: [expectedError] },
149 { code: "window.setTimeout(`foo${bar}`)", parserOptions: { ecmaVersion: 6 }, env: { browser: true }, errors: [expectedError] },
150 { code: "window.window.setTimeout(`foo${bar}`)", parserOptions: { ecmaVersion: 6 }, env: { browser: true }, errors: [expectedError] },
151 { code: "global.global.setTimeout(`foo${bar}`)", parserOptions: { ecmaVersion: 6 }, env: { node: true }, errors: [expectedError] },
152
56c4a2cb 153 // string concatenation
eb39fafa
DC
154 { code: "setTimeout('foo' + bar)", errors: [expectedError] },
155 { code: "setTimeout(foo + 'bar')", errors: [expectedError] },
156 { code: "setTimeout(`foo` + bar)", parserOptions: { ecmaVersion: 6 }, errors: [expectedError] },
157 { code: "setTimeout(1 + ';' + 1)", errors: [expectedError] },
158 { code: "window.setTimeout('foo' + bar)", env: { browser: true }, errors: [expectedError] },
159 { code: "window.setTimeout(foo + 'bar')", env: { browser: true }, errors: [expectedError] },
160 { code: "window.setTimeout(`foo` + bar)", parserOptions: { ecmaVersion: 6 }, env: { browser: true }, errors: [expectedError] },
161 { code: "window.setTimeout(1 + ';' + 1)", env: { browser: true }, errors: [expectedError] },
162 { code: "window.window.setTimeout(1 + ';' + 1)", env: { browser: true }, errors: [expectedError] },
163 { code: "global.setTimeout('foo' + bar)", env: { node: true }, errors: [expectedError] },
164 { code: "global.setTimeout(foo + 'bar')", env: { node: true }, errors: [expectedError] },
165 { code: "global.setTimeout(`foo` + bar)", parserOptions: { ecmaVersion: 6 }, env: { node: true }, errors: [expectedError] },
166 { code: "global.setTimeout(1 + ';' + 1)", env: { node: true }, errors: [expectedError] },
167 { code: "global.global.setTimeout(1 + ';' + 1)", env: { node: true }, errors: [expectedError] },
168 { code: "globalThis.setTimeout('foo' + bar)", env: { es2020: true }, errors: [expectedError] },
169
170 // gives the correct node when dealing with nesting
171 {
172 code:
173 "setTimeout('foo' + (function() {\n" +
174 " setTimeout(helper);\n" +
175 " execScript('str');\n" +
176 " return 'bar';\n" +
177 "})())",
178 errors: [
179 {
180 messageId: "impliedEval",
181 type: "CallExpression",
182 line: 1
183 },
184
185 // no error on line 2
186 {
187 messageId: "impliedEval",
188 type: "CallExpression",
189 line: 3
190 }
191 ]
192 },
193 {
194 code:
195 "window.setTimeout('foo' + (function() {\n" +
196 " setTimeout(helper);\n" +
197 " window.execScript('str');\n" +
198 " return 'bar';\n" +
199 "})())",
200 env: { browser: true },
201 errors: [
202 {
203 messageId: "impliedEval",
204 type: "CallExpression",
205 line: 1
206 },
207
208 // no error on line 2
209 {
210 messageId: "impliedEval",
211 type: "CallExpression",
212 line: 3
213 }
214 ]
215 },
216 {
217 code:
218 "global.setTimeout('foo' + (function() {\n" +
219 " setTimeout(helper);\n" +
220 " global.execScript('str');\n" +
221 " return 'bar';\n" +
222 "})())",
223 env: { node: true },
224 errors: [
225 {
226 messageId: "impliedEval",
227 type: "CallExpression",
228 line: 1
229 },
230
231 // no error on line 2
232 {
233 messageId: "impliedEval",
234 type: "CallExpression",
235 line: 3
236 }
237 ]
238 }
239 ]
240});