]> git.proxmox.com Git - pve-eslint.git/blame - eslint/tests/lib/rules/no-invalid-this.js
import eslint 7.28.0
[pve-eslint.git] / eslint / tests / lib / rules / no-invalid-this.js
CommitLineData
eb39fafa
DC
1/**
2 * @fileoverview Tests for no-invalid-this rule.
3 * @author Toru Nagashima
4 */
5
6"use strict";
7
8//------------------------------------------------------------------------------
9// Requirements
10//------------------------------------------------------------------------------
11
5422a9cc
TL
12const merge = require("lodash.merge");
13
eb39fafa
DC
14const rule = require("../../../lib/rules/no-invalid-this");
15const { RuleTester } = require("../../../lib/rule-tester");
16
17//------------------------------------------------------------------------------
18// Helpers
19//------------------------------------------------------------------------------
20
21/**
22 * A constant value for non strict mode environment.
23 * @returns {void}
24 */
25function NORMAL() {
26
27 // do nothing.
28}
29
30/**
31 * A constant value for strict mode environment.
32 * This modifies pattern object to make strict mode.
33 * @param {Object} pattern A pattern object to modify.
34 * @returns {void}
35 */
36function USE_STRICT(pattern) {
37 pattern.code = `"use strict"; ${pattern.code}`;
38}
39
40/**
41 * A constant value for implied strict mode.
42 * This modifies pattern object to impose strict mode.
43 * @param {Object} pattern A pattern object to modify.
44 * @returns {void}
45 */
46function IMPLIED_STRICT(pattern) {
47 pattern.code = `/* implied strict mode */ ${pattern.code}`;
48 pattern.parserOptions.ecmaFeatures = pattern.parserOptions.ecmaFeatures || {};
49 pattern.parserOptions.ecmaFeatures.impliedStrict = true;
50}
51
52/**
53 * A constant value for modules environment.
54 * This modifies pattern object to make modules.
55 * @param {Object} pattern A pattern object to modify.
56 * @returns {void}
57 */
58function MODULES(pattern) {
59 pattern.code = `/* modules */ ${pattern.code}`;
60 pattern.parserOptions.sourceType = "module";
61}
62
63/**
64 * Extracts patterns each condition for a specified type. The type is `valid` or `invalid`.
65 * @param {Object[]} patterns Original patterns.
66 * @param {string} type One of `"valid"` or `"invalid"`.
67 * @returns {Object[]} Test patterns.
68 */
69function extractPatterns(patterns, type) {
70
71 // Clone and apply the pattern environment.
72 const patternsList = patterns.map(pattern => pattern[type].map(applyCondition => {
5422a9cc 73 const thisPattern = merge({}, pattern);
eb39fafa
DC
74
75 applyCondition(thisPattern);
76
77 if (type === "valid") {
78 thisPattern.errors = [];
79 } else {
80 thisPattern.code += " /* should error */";
81 }
82
5422a9cc
TL
83 delete thisPattern.valid;
84 delete thisPattern.invalid;
85
86 return thisPattern;
eb39fafa
DC
87 }));
88
89 // Flatten.
90 return [].concat(...patternsList);
91}
92
93
94//------------------------------------------------------------------------------
95// Tests
96//------------------------------------------------------------------------------
97
98const errors = [
99 { messageId: "unexpectedThis", type: "ThisExpression" },
100 { messageId: "unexpectedThis", type: "ThisExpression" }
101];
102
103const patterns = [
104
105 // Global.
106 {
107 code: "console.log(this); z(x => console.log(x, this));",
108 parserOptions: { ecmaVersion: 6 },
109 errors,
110 valid: [NORMAL],
111 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
112 },
113 {
114 code: "console.log(this); z(x => console.log(x, this));",
115 parserOptions: {
116 ecmaVersion: 6,
117 ecmaFeatures: { globalReturn: true }
118 },
119 errors,
120 valid: [NORMAL],
121 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
122 },
123
124 // IIFE.
125 {
126 code: "(function() { console.log(this); z(x => console.log(x, this)); })();",
127 parserOptions: { ecmaVersion: 6 },
128 errors,
129 valid: [NORMAL],
130 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
131 },
132
133 // Just functions.
134 {
135 code: "function foo() { console.log(this); z(x => console.log(x, this)); }",
136 parserOptions: { ecmaVersion: 6 },
137 errors,
138 valid: [NORMAL],
139 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
140 },
141 {
142 code: "function foo() { console.log(this); z(x => console.log(x, this)); }",
143 parserOptions: { ecmaVersion: 6 },
144 options: [{ capIsConstructor: false }], // test that the option doesn't reverse the logic and mistakenly allows lowercase functions
145 errors,
146 valid: [NORMAL],
147 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
148 },
149 {
150 code: "function Foo() { console.log(this); z(x => console.log(x, this)); }",
151 parserOptions: { ecmaVersion: 6 },
152 options: [{ capIsConstructor: false }],
153 errors,
154 valid: [NORMAL],
155 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
156 },
157 {
158 code: "function foo() { \"use strict\"; console.log(this); z(x => console.log(x, this)); }",
159 parserOptions: { ecmaVersion: 6 },
160 errors,
161 valid: [],
162 invalid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES]
163 },
164 {
165 code: "function Foo() { \"use strict\"; console.log(this); z(x => console.log(x, this)); }",
166 parserOptions: { ecmaVersion: 6 },
167 options: [{ capIsConstructor: false }],
168 errors,
169 valid: [],
170 invalid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES]
171 },
172 {
173 code: "return function() { console.log(this); z(x => console.log(x, this)); };",
174 parserOptions: {
175 ecmaVersion: 6,
176 ecmaFeatures: { globalReturn: true }
177 },
178 errors,
179 valid: [NORMAL],
180 invalid: [USE_STRICT, IMPLIED_STRICT] // modules cannot return on global.
181 },
182 {
183 code: "var foo = (function() { console.log(this); z(x => console.log(x, this)); }).bar(obj);",
184 parserOptions: { ecmaVersion: 6 },
185 errors,
186 valid: [NORMAL],
187 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
188 },
189
190 // Functions in methods.
191 {
192 code: "var obj = {foo: function() { function foo() { console.log(this); z(x => console.log(x, this)); } foo(); }};",
193 parserOptions: { ecmaVersion: 6 },
194 errors,
195 valid: [NORMAL],
196 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
197 },
198 {
199 code: "var obj = {foo() { function foo() { console.log(this); z(x => console.log(x, this)); } foo(); }};",
200 parserOptions: { ecmaVersion: 6 },
201 errors,
202 valid: [NORMAL],
203 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
204 },
205 {
206 code: "var obj = {foo: function() { return function() { console.log(this); z(x => console.log(x, this)); }; }};",
207 parserOptions: { ecmaVersion: 6 },
208 errors,
209 valid: [NORMAL],
210 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
211 },
212 {
213 code: "var obj = {foo: function() { \"use strict\"; return function() { console.log(this); z(x => console.log(x, this)); }; }};",
214 parserOptions: { ecmaVersion: 6 },
215 errors,
216 valid: [],
217 invalid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES]
218 },
219 {
220 code: "obj.foo = function() { return function() { console.log(this); z(x => console.log(x, this)); }; };",
221 parserOptions: { ecmaVersion: 6 },
222 errors,
223 valid: [NORMAL],
224 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
225 },
226 {
227 code: "obj.foo = function() { \"use strict\"; return function() { console.log(this); z(x => console.log(x, this)); }; };",
228 parserOptions: { ecmaVersion: 6 },
229 errors,
230 valid: [],
231 invalid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES]
232 },
233 {
234 code: "class A { foo() { return function() { console.log(this); z(x => console.log(x, this)); }; } }",
235 parserOptions: { ecmaVersion: 6 },
236 errors,
237 valid: [],
238 invalid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES]
239 },
240
241 // Class Static methods.
242 {
243 code: "class A {static foo() { console.log(this); z(x => console.log(x, this)); }};",
244 parserOptions: { ecmaVersion: 6 },
245 errors,
246 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
247 invalid: []
248 },
249
250 // Constructors.
251 {
252 code: "function Foo() { console.log(this); z(x => console.log(x, this)); }",
253 parserOptions: { ecmaVersion: 6 },
254 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
255 invalid: []
256 },
257 {
258 code: "function Foo() { console.log(this); z(x => console.log(x, this)); }",
259 parserOptions: { ecmaVersion: 6 },
260 options: [{}], // test the default value in schema
261 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
262 invalid: []
263 },
264 {
265 code: "function Foo() { console.log(this); z(x => console.log(x, this)); }",
266 parserOptions: { ecmaVersion: 6 },
267 options: [{ capIsConstructor: true }], // test explicitly set option to the default value
268 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
269 invalid: []
270 },
271 {
272 code: "var Foo = function Foo() { console.log(this); z(x => console.log(x, this)); };",
273 parserOptions: { ecmaVersion: 6 },
274 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
275 invalid: []
276 },
277 {
278 code: "class A {constructor() { console.log(this); z(x => console.log(x, this)); }};",
279 parserOptions: { ecmaVersion: 6 },
280 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
281 invalid: []
282 },
283
284 // On a property.
285 {
286 code: "var obj = {foo: function() { console.log(this); z(x => console.log(x, this)); }};",
287 parserOptions: { ecmaVersion: 6 },
288 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
289 invalid: []
290 },
291 {
292 code: "var obj = {foo() { console.log(this); z(x => console.log(x, this)); }};",
293 parserOptions: { ecmaVersion: 6 },
294 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
295 invalid: []
296 },
297 {
298 code: "var obj = {foo: foo || function() { console.log(this); z(x => console.log(x, this)); }};",
299 parserOptions: { ecmaVersion: 6 },
300 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
301 invalid: []
302 },
303 {
304 code: "var obj = {foo: hasNative ? foo : function() { console.log(this); z(x => console.log(x, this)); }};",
305 parserOptions: { ecmaVersion: 6 },
306 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
307 invalid: []
308 },
309 {
310 code: "var obj = {foo: (function() { return function() { console.log(this); z(x => console.log(x, this)); }; })()};",
311 parserOptions: { ecmaVersion: 6 },
312 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
313 invalid: []
314 },
315 {
316 code: "Object.defineProperty(obj, \"foo\", {value: function() { console.log(this); z(x => console.log(x, this)); }})",
317 parserOptions: { ecmaVersion: 6 },
318 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
319 invalid: []
320 },
321 {
322 code: "Object.defineProperties(obj, {foo: {value: function() { console.log(this); z(x => console.log(x, this)); }}})",
323 parserOptions: { ecmaVersion: 6 },
324 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
325 invalid: []
326 },
327
328 // Assigns to a property.
329 {
330 code: "obj.foo = function() { console.log(this); z(x => console.log(x, this)); };",
331 parserOptions: { ecmaVersion: 6 },
332 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
333 invalid: []
334 },
335 {
336 code: "obj.foo = foo || function() { console.log(this); z(x => console.log(x, this)); };",
337 parserOptions: { ecmaVersion: 6 },
338 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
339 invalid: []
340 },
341 {
342 code: "obj.foo = foo ? bar : function() { console.log(this); z(x => console.log(x, this)); };",
343 parserOptions: { ecmaVersion: 6 },
344 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
345 invalid: []
346 },
347 {
348 code: "obj.foo = (function() { return function() { console.log(this); z(x => console.log(x, this)); }; })();",
349 parserOptions: { ecmaVersion: 6 },
350 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
351 invalid: []
352 },
353 {
354 code: "obj.foo = (() => function() { console.log(this); z(x => console.log(x, this)); })();",
355 parserOptions: { ecmaVersion: 6 },
356 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
357 invalid: []
358 },
359 {
360 code: "obj.foo = (function() { return () => { console.log(this); z(x => console.log(x, this)); }; })();",
361 parserOptions: { ecmaVersion: 6 },
362 valid: [NORMAL],
363 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES],
364 errors
365 },
366 {
367 code: "obj.foo = (() => () => { console.log(this); z(x => console.log(x, this)); })();",
368 parserOptions: { ecmaVersion: 6 },
369 valid: [NORMAL],
370 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES],
371 errors
372 },
6f036462
TL
373 {
374 code: "obj.foo = (function() { return function() { console.log(this); z(x => console.log(x, this)); }; })?.();",
375 parserOptions: { ecmaVersion: 2020 },
376 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
377 invalid: []
378 },
eb39fafa
DC
379
380 // Class Instance Methods.
381 {
382 code: "class A {foo() { console.log(this); z(x => console.log(x, this)); }};",
383 parserOptions: { ecmaVersion: 6 },
384 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
385 invalid: []
386 },
387
388 // Bind/Call/Apply
389 {
390 code: "var foo = function() { console.log(this); z(x => console.log(x, this)); }.bind(obj);",
391 parserOptions: { ecmaVersion: 6 },
392 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
393 invalid: []
394 },
395 {
396 code: "var foo = function() { console.log(this); z(x => console.log(x, this)); }.bind(null);",
397 parserOptions: { ecmaVersion: 6 },
398 errors,
399 valid: [NORMAL],
400 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
401 },
402 {
403 code: "(function() { console.log(this); z(x => console.log(x, this)); }).call(obj);",
404 parserOptions: { ecmaVersion: 6 },
405 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
406 invalid: []
407 },
408 {
409 code: "(function() { console.log(this); z(x => console.log(x, this)); }).call(undefined);",
410 parserOptions: { ecmaVersion: 6 },
411 errors,
412 valid: [NORMAL],
413 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
414 },
415 {
416 code: "(function() { console.log(this); z(x => console.log(x, this)); }).apply(obj);",
417 parserOptions: { ecmaVersion: 6 },
418 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
419 invalid: []
420 },
421 {
422 code: "(function() { console.log(this); z(x => console.log(x, this)); }).apply(void 0);",
423 parserOptions: { ecmaVersion: 6 },
424 errors,
425 valid: [NORMAL],
426 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
427 },
428 {
429 code: "Reflect.apply(function() { console.log(this); z(x => console.log(x, this)); }, obj, []);",
430 parserOptions: { ecmaVersion: 6 },
431 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
432 invalid: []
433 },
6f036462
TL
434 {
435 code: "var foo = function() { console.log(this); z(x => console.log(x, this)); }?.bind(obj);",
436 parserOptions: { ecmaVersion: 2020 },
437 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
438 invalid: []
439 },
440 {
441 code: "var foo = (function() { console.log(this); z(x => console.log(x, this)); }?.bind)(obj);",
442 parserOptions: { ecmaVersion: 2020 },
443 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
444 invalid: []
445 },
446 {
447 code: "var foo = function() { console.log(this); z(x => console.log(x, this)); }.bind?.(obj);",
448 parserOptions: { ecmaVersion: 2020 },
449 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
450 invalid: []
451 },
eb39fafa
DC
452
453 // Array methods.
454 {
455 code: "Array.from([], function() { console.log(this); z(x => console.log(x, this)); });",
456 parserOptions: { ecmaVersion: 6 },
457 errors,
458 valid: [NORMAL],
459 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
460 },
461 {
462 code: "foo.every(function() { console.log(this); z(x => console.log(x, this)); });",
463 parserOptions: { ecmaVersion: 6 },
464 errors,
465 valid: [NORMAL],
466 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
467 },
468 {
469 code: "foo.filter(function() { console.log(this); z(x => console.log(x, this)); });",
470 parserOptions: { ecmaVersion: 6 },
471 errors,
472 valid: [NORMAL],
473 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
474 },
475 {
476 code: "foo.find(function() { console.log(this); z(x => console.log(x, this)); });",
477 parserOptions: { ecmaVersion: 6 },
478 errors,
479 valid: [NORMAL],
480 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
481 },
482 {
483 code: "foo.findIndex(function() { console.log(this); z(x => console.log(x, this)); });",
484 parserOptions: { ecmaVersion: 6 },
485 errors,
486 valid: [NORMAL],
487 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
488 },
489 {
490 code: "foo.forEach(function() { console.log(this); z(x => console.log(x, this)); });",
491 parserOptions: { ecmaVersion: 6 },
492 errors,
493 valid: [NORMAL],
494 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
495 },
496 {
497 code: "foo.map(function() { console.log(this); z(x => console.log(x, this)); });",
498 parserOptions: { ecmaVersion: 6 },
499 errors,
500 valid: [NORMAL],
501 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
502 },
503 {
504 code: "foo.some(function() { console.log(this); z(x => console.log(x, this)); });",
505 parserOptions: { ecmaVersion: 6 },
506 errors,
507 valid: [NORMAL],
508 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
509 },
510 {
511 code: "Array.from([], function() { console.log(this); z(x => console.log(x, this)); }, obj);",
512 parserOptions: { ecmaVersion: 6 },
513 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
514 invalid: []
515 },
516 {
517 code: "foo.every(function() { console.log(this); z(x => console.log(x, this)); }, obj);",
518 parserOptions: { ecmaVersion: 6 },
519 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
520 invalid: []
521 },
522 {
523 code: "foo.filter(function() { console.log(this); z(x => console.log(x, this)); }, obj);",
524 parserOptions: { ecmaVersion: 6 },
525 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
526 invalid: []
527 },
528 {
529 code: "foo.find(function() { console.log(this); z(x => console.log(x, this)); }, obj);",
530 parserOptions: { ecmaVersion: 6 },
531 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
532 invalid: []
533 },
534 {
535 code: "foo.findIndex(function() { console.log(this); z(x => console.log(x, this)); }, obj);",
536 parserOptions: { ecmaVersion: 6 },
537 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
538 invalid: []
539 },
540 {
541 code: "foo.forEach(function() { console.log(this); z(x => console.log(x, this)); }, obj);",
542 parserOptions: { ecmaVersion: 6 },
543 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
544 invalid: []
545 },
546 {
547 code: "foo.map(function() { console.log(this); z(x => console.log(x, this)); }, obj);",
548 parserOptions: { ecmaVersion: 6 },
549 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
550 invalid: []
551 },
552 {
553 code: "foo.some(function() { console.log(this); z(x => console.log(x, this)); }, obj);",
554 parserOptions: { ecmaVersion: 6 },
555 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
556 invalid: []
557 },
558 {
559 code: "foo.forEach(function() { console.log(this); z(x => console.log(x, this)); }, null);",
560 parserOptions: { ecmaVersion: 6 },
561 errors,
562 valid: [NORMAL],
563 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
564 },
6f036462
TL
565 {
566 code: "Array?.from([], function() { console.log(this); z(x => console.log(x, this)); }, obj);",
567 parserOptions: { ecmaVersion: 2020 },
568 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
569 invalid: []
570 },
571 {
572 code: "foo?.every(function() { console.log(this); z(x => console.log(x, this)); }, obj);",
573 parserOptions: { ecmaVersion: 2020 },
574 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
575 invalid: []
576 },
577 {
578 code: "(Array?.from)([], function() { console.log(this); z(x => console.log(x, this)); }, obj);",
579 parserOptions: { ecmaVersion: 2020 },
580 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
581 invalid: []
582 },
583 {
584 code: "(foo?.every)(function() { console.log(this); z(x => console.log(x, this)); }, obj);",
585 parserOptions: { ecmaVersion: 2020 },
586 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
587 invalid: []
588 },
eb39fafa
DC
589
590 // @this tag.
591 {
592 code: "/** @this Obj */ function foo() { console.log(this); z(x => console.log(x, this)); }",
593 parserOptions: { ecmaVersion: 6 },
594 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
595 invalid: []
596 },
597 {
598 code: "/**\n * @returns {void}\n * @this Obj\n */\nfunction foo() { console.log(this); z(x => console.log(x, this)); }",
599 parserOptions: { ecmaVersion: 6 },
600 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
601 invalid: []
602 },
603 {
604 code: "/** @returns {void} */ function foo() { console.log(this); z(x => console.log(x, this)); }",
605 parserOptions: { ecmaVersion: 6 },
606 errors,
607 valid: [NORMAL],
608 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
609 },
610 {
611 code: "/** @this Obj */ foo(function() { console.log(this); z(x => console.log(x, this)); });",
612 parserOptions: { ecmaVersion: 6 },
613 errors,
614 valid: [NORMAL],
615 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
616 },
617 {
618 code: "foo(/* @this Obj */ function() { console.log(this); z(x => console.log(x, this)); });",
619 parserOptions: { ecmaVersion: 6 },
620 errors,
621 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
622 invalid: []
623 },
624
625 // https://github.com/eslint/eslint/issues/3254
626 {
627 code: "function foo() { console.log(this); z(x => console.log(x, this)); }",
628 parserOptions: { ecmaVersion: 6 },
629 errors,
630 valid: [NORMAL],
631 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
632 },
633
634 // https://github.com/eslint/eslint/issues/3287
635 {
636 code: "function foo() { /** @this Obj*/ return function bar() { console.log(this); z(x => console.log(x, this)); }; }",
637 parserOptions: { ecmaVersion: 6 },
638 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
639 invalid: []
640 },
641
642 // https://github.com/eslint/eslint/issues/6824
643 {
644 code: "var Ctor = function() { console.log(this); z(x => console.log(x, this)); }",
645 parserOptions: { ecmaVersion: 6 },
646 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
647 invalid: []
648 },
649 {
650 code: "var Ctor = function() { console.log(this); z(x => console.log(x, this)); }",
651 parserOptions: { ecmaVersion: 6 },
652 options: [{ capIsConstructor: false }],
653 errors,
654 valid: [NORMAL],
655 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
656 },
657 {
658 code: "var func = function() { console.log(this); z(x => console.log(x, this)); }",
659 parserOptions: { ecmaVersion: 6 },
660 errors,
661 valid: [NORMAL],
662 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
663 },
664 {
665 code: "var func = function() { console.log(this); z(x => console.log(x, this)); }",
666 parserOptions: { ecmaVersion: 6 },
667 options: [{ capIsConstructor: false }],
668 errors,
669 valid: [NORMAL],
670 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
671 },
672 {
673 code: "Ctor = function() { console.log(this); z(x => console.log(x, this)); }",
674 parserOptions: { ecmaVersion: 6 },
675 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
676 invalid: []
677 },
678 {
679 code: "Ctor = function() { console.log(this); z(x => console.log(x, this)); }",
680 parserOptions: { ecmaVersion: 6 },
681 options: [{ capIsConstructor: false }],
682 errors,
683 valid: [NORMAL],
684 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
685 },
686 {
687 code: "func = function() { console.log(this); z(x => console.log(x, this)); }",
688 parserOptions: { ecmaVersion: 6 },
689 errors,
690 valid: [NORMAL],
691 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
692 },
693 {
694 code: "func = function() { console.log(this); z(x => console.log(x, this)); }",
695 parserOptions: { ecmaVersion: 6 },
696 options: [{ capIsConstructor: false }],
697 errors,
698 valid: [NORMAL],
699 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
700 },
701 {
702 code: "function foo(Ctor = function() { console.log(this); z(x => console.log(x, this)); }) {}",
703 parserOptions: { ecmaVersion: 6 },
704 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
705 invalid: []
706 },
707 {
708 code: "function foo(func = function() { console.log(this); z(x => console.log(x, this)); }) {}",
709 parserOptions: { ecmaVersion: 6 },
710 errors,
711 valid: [NORMAL],
712 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
713 },
714 {
715 code: "[obj.method = function() { console.log(this); z(x => console.log(x, this)); }] = a",
716 parserOptions: { ecmaVersion: 6 },
717 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
718 invalid: []
719 },
720 {
721 code: "[func = function() { console.log(this); z(x => console.log(x, this)); }] = a",
722 parserOptions: { ecmaVersion: 6 },
723 errors,
724 valid: [NORMAL],
725 invalid: [USE_STRICT, IMPLIED_STRICT, MODULES]
6f036462
TL
726 },
727 {
728 code: "obj.method &&= function () { console.log(this); z(x => console.log(x, this)); }",
729 parserOptions: { ecmaVersion: 2021 },
730 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
731 invalid: []
732 },
733 {
734 code: "obj.method ||= function () { console.log(this); z(x => console.log(x, this)); }",
735 parserOptions: { ecmaVersion: 2021 },
736 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
737 invalid: []
738 },
739 {
740 code: "obj.method ??= function () { console.log(this); z(x => console.log(x, this)); }",
741 parserOptions: { ecmaVersion: 2021 },
742 valid: [NORMAL, USE_STRICT, IMPLIED_STRICT, MODULES],
743 invalid: []
eb39fafa
DC
744 }
745];
746
747const ruleTester = new RuleTester();
748
749ruleTester.run("no-invalid-this", rule, {
750 valid: extractPatterns(patterns, "valid"),
751 invalid: extractPatterns(patterns, "invalid")
752});