eslint 8.34.0 → 8.39.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -18
- package/conf/rule-type-list.json +2 -2
- package/lib/cli-engine/cli-engine.js +2 -2
- package/lib/cli-engine/file-enumerator.js +8 -6
- package/lib/config/default-config.js +1 -4
- package/lib/config/flat-config-array.js +77 -17
- package/lib/config/flat-config-schema.js +4 -18
- package/lib/eslint/eslint-helpers.js +3 -3
- package/lib/linter/linter.js +4 -77
- package/lib/rule-tester/flat-rule-tester.js +1 -1
- package/lib/rule-tester/rule-tester.js +1 -1
- package/lib/rules/block-scoped-var.js +2 -1
- package/lib/rules/camelcase.js +5 -4
- package/lib/rules/consistent-this.js +4 -2
- package/lib/rules/func-names.js +1 -1
- package/lib/rules/global-require.js +4 -2
- package/lib/rules/handle-callback-err.js +2 -1
- package/lib/rules/id-blacklist.js +3 -2
- package/lib/rules/id-denylist.js +3 -2
- package/lib/rules/id-match.js +3 -2
- package/lib/rules/lines-around-comment.js +11 -0
- package/lib/rules/logical-assignment-operators.js +4 -4
- package/lib/rules/multiline-comment-style.js +42 -3
- package/lib/rules/new-parens.js +5 -14
- package/lib/rules/no-alert.js +3 -1
- package/lib/rules/no-catch-shadow.js +3 -1
- package/lib/rules/no-class-assign.js +3 -1
- package/lib/rules/no-console.js +3 -2
- package/lib/rules/no-const-assign.js +3 -1
- package/lib/rules/no-constant-binary-expression.js +36 -27
- package/lib/rules/no-constant-condition.js +3 -2
- package/lib/rules/no-control-regex.js +1 -1
- package/lib/rules/no-div-regex.js +1 -1
- package/lib/rules/no-dupe-args.js +3 -1
- package/lib/rules/no-else-return.js +13 -12
- package/lib/rules/no-eval.js +5 -5
- package/lib/rules/no-ex-assign.js +3 -1
- package/lib/rules/no-extend-native.js +3 -2
- package/lib/rules/no-extra-boolean-cast.js +1 -1
- package/lib/rules/no-extra-parens.js +1 -1
- package/lib/rules/no-func-assign.js +3 -1
- package/lib/rules/no-global-assign.js +3 -2
- package/lib/rules/no-implicit-globals.js +3 -2
- package/lib/rules/no-implied-eval.js +5 -4
- package/lib/rules/no-import-assign.js +5 -3
- package/lib/rules/no-invalid-regexp.js +1 -1
- package/lib/rules/no-invalid-this.js +2 -2
- package/lib/rules/no-label-var.js +2 -1
- package/lib/rules/no-lone-blocks.js +8 -6
- package/lib/rules/no-lonely-if.js +2 -3
- package/lib/rules/no-loop-func.js +3 -1
- package/lib/rules/no-misleading-character-class.js +12 -41
- package/lib/rules/no-native-reassign.js +3 -2
- package/lib/rules/no-new-func.js +7 -6
- package/lib/rules/no-new-native-nonconstructor.js +8 -6
- package/lib/rules/no-new-object.js +4 -1
- package/lib/rules/no-new-symbol.js +8 -6
- package/lib/rules/no-obj-calls.js +8 -6
- package/lib/rules/no-param-reassign.js +2 -1
- package/lib/rules/no-promise-executor-return.js +3 -2
- package/lib/rules/no-redeclare.js +3 -3
- package/lib/rules/no-regex-spaces.js +4 -2
- package/lib/rules/no-restricted-exports.js +2 -1
- package/lib/rules/no-restricted-globals.js +4 -2
- package/lib/rules/no-setter-return.js +3 -2
- package/lib/rules/no-shadow-restricted-names.js +2 -1
- package/lib/rules/no-shadow.js +3 -2
- package/lib/rules/no-undef-init.js +1 -1
- package/lib/rules/no-undef.js +3 -2
- package/lib/rules/no-undefined.js +4 -2
- package/lib/rules/no-underscore-dangle.js +2 -1
- package/lib/rules/no-unmodified-loop-condition.js +2 -2
- package/lib/rules/no-unused-expressions.js +4 -5
- package/lib/rules/no-unused-vars.js +2 -2
- package/lib/rules/no-use-before-define.js +3 -2
- package/lib/rules/no-useless-backreference.js +9 -7
- package/lib/rules/no-useless-return.js +1 -1
- package/lib/rules/no-var.js +2 -2
- package/lib/rules/object-shorthand.js +3 -2
- package/lib/rules/prefer-arrow-callback.js +2 -2
- package/lib/rules/prefer-const.js +1 -1
- package/lib/rules/prefer-exponentiation-operator.js +5 -5
- package/lib/rules/prefer-named-capture-group.js +8 -8
- package/lib/rules/prefer-object-has-own.js +4 -2
- package/lib/rules/prefer-object-spread.js +12 -13
- package/lib/rules/prefer-promise-reject-errors.js +2 -1
- package/lib/rules/prefer-regex-literals.js +26 -27
- package/lib/rules/prefer-rest-params.js +5 -2
- package/lib/rules/radix.js +11 -11
- package/lib/rules/require-atomic-updates.js +2 -2
- package/lib/rules/require-unicode-regexp.js +67 -7
- package/lib/rules/symbol-description.js +7 -5
- package/lib/rules/utils/regular-expressions.js +42 -0
- package/lib/rules/valid-typeof.js +4 -4
- package/lib/rules/wrap-iife.js +1 -1
- package/lib/rules/wrap-regex.js +2 -3
- package/lib/rules/yoda.js +1 -1
- package/lib/source-code/source-code.js +137 -1
- package/lib/source-code/token-store/index.js +1 -1
- package/lib/source-code/token-store/utils.js +35 -20
- package/messages/no-config-found.js +1 -1
- package/package.json +13 -8
- package/conf/eslint-all.js +0 -31
- package/conf/eslint-recommended.js +0 -76
@@ -31,6 +31,8 @@ module.exports = {
|
|
31
31
|
|
32
32
|
create(context) {
|
33
33
|
|
34
|
+
const sourceCode = context.getSourceCode();
|
35
|
+
|
34
36
|
/**
|
35
37
|
* Reports a reference if is non initializer and writable.
|
36
38
|
* @param {References} references Collection of reference to check.
|
@@ -65,7 +67,7 @@ module.exports = {
|
|
65
67
|
* @returns {void}
|
66
68
|
*/
|
67
69
|
function checkForFunction(node) {
|
68
|
-
|
70
|
+
sourceCode.getDeclaredVariables(node).forEach(checkVariable);
|
69
71
|
}
|
70
72
|
|
71
73
|
return {
|
@@ -41,6 +41,7 @@ module.exports = {
|
|
41
41
|
|
42
42
|
create(context) {
|
43
43
|
const config = context.options[0];
|
44
|
+
const sourceCode = context.getSourceCode();
|
44
45
|
const exceptions = (config && config.exceptions) || [];
|
45
46
|
|
46
47
|
/**
|
@@ -84,8 +85,8 @@ module.exports = {
|
|
84
85
|
}
|
85
86
|
|
86
87
|
return {
|
87
|
-
Program() {
|
88
|
-
const globalScope =
|
88
|
+
Program(node) {
|
89
|
+
const globalScope = sourceCode.getScope(node);
|
89
90
|
|
90
91
|
globalScope.variables.forEach(checkVariable);
|
91
92
|
}
|
@@ -43,6 +43,7 @@ module.exports = {
|
|
43
43
|
create(context) {
|
44
44
|
|
45
45
|
const checkLexicalBindings = context.options[0] && context.options[0].lexicalBindings === true;
|
46
|
+
const sourceCode = context.getSourceCode();
|
46
47
|
|
47
48
|
/**
|
48
49
|
* Reports the node.
|
@@ -62,8 +63,8 @@ module.exports = {
|
|
62
63
|
}
|
63
64
|
|
64
65
|
return {
|
65
|
-
Program() {
|
66
|
-
const scope =
|
66
|
+
Program(node) {
|
67
|
+
const scope = sourceCode.getScope(node);
|
67
68
|
|
68
69
|
scope.variables.forEach(variable => {
|
69
70
|
|
@@ -10,7 +10,7 @@
|
|
10
10
|
//------------------------------------------------------------------------------
|
11
11
|
|
12
12
|
const astUtils = require("./utils/ast-utils");
|
13
|
-
const { getStaticValue } = require("eslint-utils");
|
13
|
+
const { getStaticValue } = require("@eslint-community/eslint-utils");
|
14
14
|
|
15
15
|
//------------------------------------------------------------------------------
|
16
16
|
// Rule Definition
|
@@ -37,6 +37,7 @@ module.exports = {
|
|
37
37
|
create(context) {
|
38
38
|
const GLOBAL_CANDIDATES = Object.freeze(["global", "window", "globalThis"]);
|
39
39
|
const EVAL_LIKE_FUNC_PATTERN = /^(?:set(?:Interval|Timeout)|execScript)$/u;
|
40
|
+
const sourceCode = context.getSourceCode();
|
40
41
|
|
41
42
|
/**
|
42
43
|
* Checks whether a node is evaluated as a string or not.
|
@@ -66,7 +67,7 @@ module.exports = {
|
|
66
67
|
|
67
68
|
if (firstArgument) {
|
68
69
|
|
69
|
-
const staticValue = getStaticValue(firstArgument,
|
70
|
+
const staticValue = getStaticValue(firstArgument, sourceCode.getScope(node));
|
70
71
|
const isStaticString = staticValue && typeof staticValue.value === "string";
|
71
72
|
const isString = isStaticString || isEvaluatedString(firstArgument);
|
72
73
|
|
@@ -117,8 +118,8 @@ module.exports = {
|
|
117
118
|
reportImpliedEvalCallExpression(node);
|
118
119
|
}
|
119
120
|
},
|
120
|
-
"Program:exit"() {
|
121
|
-
const globalScope =
|
121
|
+
"Program:exit"(node) {
|
122
|
+
const globalScope = sourceCode.getScope(node);
|
122
123
|
|
123
124
|
GLOBAL_CANDIDATES
|
124
125
|
.map(candidate => astUtils.getVariableByName(globalScope, candidate))
|
@@ -9,7 +9,7 @@
|
|
9
9
|
// Helpers
|
10
10
|
//------------------------------------------------------------------------------
|
11
11
|
|
12
|
-
const { findVariable } = require("eslint-utils");
|
12
|
+
const { findVariable } = require("@eslint-community/eslint-utils");
|
13
13
|
const astUtils = require("./utils/ast-utils");
|
14
14
|
|
15
15
|
const WellKnownMutationFunctions = {
|
@@ -194,11 +194,13 @@ module.exports = {
|
|
194
194
|
},
|
195
195
|
|
196
196
|
create(context) {
|
197
|
+
const sourceCode = context.getSourceCode();
|
198
|
+
|
197
199
|
return {
|
198
200
|
ImportDeclaration(node) {
|
199
|
-
const scope =
|
201
|
+
const scope = sourceCode.getScope(node);
|
200
202
|
|
201
|
-
for (const variable of
|
203
|
+
for (const variable of sourceCode.getDeclaredVariables(node)) {
|
202
204
|
const shouldCheckMembers = variable.defs.some(
|
203
205
|
d => d.node.type === "ImportNamespaceSpecifier"
|
204
206
|
);
|
@@ -8,7 +8,7 @@
|
|
8
8
|
// Requirements
|
9
9
|
//------------------------------------------------------------------------------
|
10
10
|
|
11
|
-
const RegExpValidator = require("regexpp").RegExpValidator;
|
11
|
+
const RegExpValidator = require("@eslint-community/regexpp").RegExpValidator;
|
12
12
|
const validator = new RegExpValidator();
|
13
13
|
const validFlags = /[dgimsuy]/gu;
|
14
14
|
const undefined1 = void 0;
|
@@ -95,7 +95,7 @@ module.exports = {
|
|
95
95
|
}
|
96
96
|
|
97
97
|
if (codePath.origin === "program") {
|
98
|
-
const scope =
|
98
|
+
const scope = sourceCode.getScope(node);
|
99
99
|
const features = context.parserOptions.ecmaFeatures || {};
|
100
100
|
|
101
101
|
// `this` at the top level of scripts always refers to the global object
|
@@ -120,7 +120,7 @@ module.exports = {
|
|
120
120
|
* always valid, so we can set `init: true` right away.
|
121
121
|
*/
|
122
122
|
stack.push({
|
123
|
-
init: !
|
123
|
+
init: !sourceCode.getScope(node).isStrict,
|
124
124
|
node,
|
125
125
|
valid: true
|
126
126
|
});
|
@@ -34,6 +34,7 @@ module.exports = {
|
|
34
34
|
},
|
35
35
|
|
36
36
|
create(context) {
|
37
|
+
const sourceCode = context.getSourceCode();
|
37
38
|
|
38
39
|
//--------------------------------------------------------------------------
|
39
40
|
// Helpers
|
@@ -59,7 +60,7 @@ module.exports = {
|
|
59
60
|
LabeledStatement(node) {
|
60
61
|
|
61
62
|
// Fetch the innermost scope.
|
62
|
-
const scope =
|
63
|
+
const scope = sourceCode.getScope(node);
|
63
64
|
|
64
65
|
/*
|
65
66
|
* Recursively find the identifier walking up the scope, starting
|
@@ -33,6 +33,7 @@ module.exports = {
|
|
33
33
|
// A stack of lone blocks to be checked for block-level bindings
|
34
34
|
const loneBlocks = [];
|
35
35
|
let ruleDef;
|
36
|
+
const sourceCode = context.getSourceCode();
|
36
37
|
|
37
38
|
/**
|
38
39
|
* Reports a node as invalid.
|
@@ -67,14 +68,15 @@ module.exports = {
|
|
67
68
|
/**
|
68
69
|
* Checks the enclosing block of the current node for block-level bindings,
|
69
70
|
* and "marks it" as valid if any.
|
71
|
+
* @param {ASTNode} node The current node to check.
|
70
72
|
* @returns {void}
|
71
73
|
*/
|
72
|
-
function markLoneBlock() {
|
74
|
+
function markLoneBlock(node) {
|
73
75
|
if (loneBlocks.length === 0) {
|
74
76
|
return;
|
75
77
|
}
|
76
78
|
|
77
|
-
const block =
|
79
|
+
const block = node.parent;
|
78
80
|
|
79
81
|
if (loneBlocks[loneBlocks.length - 1] === block) {
|
80
82
|
loneBlocks.pop();
|
@@ -116,13 +118,13 @@ module.exports = {
|
|
116
118
|
|
117
119
|
ruleDef.VariableDeclaration = function(node) {
|
118
120
|
if (node.kind === "let" || node.kind === "const") {
|
119
|
-
markLoneBlock();
|
121
|
+
markLoneBlock(node);
|
120
122
|
}
|
121
123
|
};
|
122
124
|
|
123
|
-
ruleDef.FunctionDeclaration = function() {
|
124
|
-
if (
|
125
|
-
markLoneBlock();
|
125
|
+
ruleDef.FunctionDeclaration = function(node) {
|
126
|
+
if (sourceCode.getScope(node).isStrict) {
|
127
|
+
markLoneBlock(node);
|
126
128
|
}
|
127
129
|
};
|
128
130
|
|
@@ -32,9 +32,8 @@ module.exports = {
|
|
32
32
|
|
33
33
|
return {
|
34
34
|
IfStatement(node) {
|
35
|
-
const
|
36
|
-
|
37
|
-
grandparent = ancestors.pop();
|
35
|
+
const parent = node.parent,
|
36
|
+
grandparent = parent.parent;
|
38
37
|
|
39
38
|
if (parent && parent.type === "BlockStatement" &&
|
40
39
|
parent.body.length === 1 && grandparent &&
|
@@ -168,6 +168,8 @@ module.exports = {
|
|
168
168
|
|
169
169
|
create(context) {
|
170
170
|
|
171
|
+
const sourceCode = context.getSourceCode();
|
172
|
+
|
171
173
|
/**
|
172
174
|
* Reports functions which match the following condition:
|
173
175
|
*
|
@@ -183,7 +185,7 @@ module.exports = {
|
|
183
185
|
return;
|
184
186
|
}
|
185
187
|
|
186
|
-
const references =
|
188
|
+
const references = sourceCode.getScope(node).through;
|
187
189
|
const unsafeRefs = references.filter(r => !isSafe(loopNode, r)).map(r => r.identifier.name);
|
188
190
|
|
189
191
|
if (unsafeRefs.length > 0) {
|
@@ -3,17 +3,16 @@
|
|
3
3
|
*/
|
4
4
|
"use strict";
|
5
5
|
|
6
|
-
const { CALL, CONSTRUCT, ReferenceTracker, getStringIfConstant } = require("eslint-utils");
|
7
|
-
const {
|
6
|
+
const { CALL, CONSTRUCT, ReferenceTracker, getStringIfConstant } = require("@eslint-community/eslint-utils");
|
7
|
+
const { RegExpParser, visitRegExpAST } = require("@eslint-community/regexpp");
|
8
8
|
const { isCombiningCharacter, isEmojiModifier, isRegionalIndicatorSymbol, isSurrogatePair } = require("./utils/unicode");
|
9
9
|
const astUtils = require("./utils/ast-utils.js");
|
10
|
+
const { isValidWithUnicodeFlag } = require("./utils/regular-expressions");
|
10
11
|
|
11
12
|
//------------------------------------------------------------------------------
|
12
13
|
// Helpers
|
13
14
|
//------------------------------------------------------------------------------
|
14
15
|
|
15
|
-
const REGEXPP_LATEST_ECMA_VERSION = 2022;
|
16
|
-
|
17
16
|
/**
|
18
17
|
* Iterate character sequences of a given nodes.
|
19
18
|
*
|
@@ -185,46 +184,18 @@ module.exports = {
|
|
185
184
|
}
|
186
185
|
}
|
187
186
|
|
188
|
-
/**
|
189
|
-
* Checks if the given regular expression pattern would be valid with the `u` flag.
|
190
|
-
* @param {string} pattern The regular expression pattern to verify.
|
191
|
-
* @returns {boolean} `true` if the pattern would be valid with the `u` flag.
|
192
|
-
* `false` if the pattern would be invalid with the `u` flag or the configured
|
193
|
-
* ecmaVersion doesn't support the `u` flag.
|
194
|
-
*/
|
195
|
-
function isValidWithUnicodeFlag(pattern) {
|
196
|
-
const { ecmaVersion } = context.languageOptions;
|
197
|
-
|
198
|
-
// ecmaVersion <= 5 doesn't support the 'u' flag
|
199
|
-
if (ecmaVersion <= 5) {
|
200
|
-
return false;
|
201
|
-
}
|
202
|
-
|
203
|
-
const validator = new RegExpValidator({
|
204
|
-
ecmaVersion: Math.min(ecmaVersion, REGEXPP_LATEST_ECMA_VERSION)
|
205
|
-
});
|
206
|
-
|
207
|
-
try {
|
208
|
-
validator.validatePattern(pattern, void 0, void 0, /* uFlag = */ true);
|
209
|
-
} catch {
|
210
|
-
return false;
|
211
|
-
}
|
212
|
-
|
213
|
-
return true;
|
214
|
-
}
|
215
|
-
|
216
187
|
return {
|
217
188
|
"Literal[regex]"(node) {
|
218
189
|
verify(node, node.regex.pattern, node.regex.flags, fixer => {
|
219
|
-
if (!isValidWithUnicodeFlag(node.regex.pattern)) {
|
190
|
+
if (!isValidWithUnicodeFlag(context.languageOptions.ecmaVersion, node.regex.pattern)) {
|
220
191
|
return null;
|
221
192
|
}
|
222
193
|
|
223
194
|
return fixer.insertTextAfter(node, "u");
|
224
195
|
});
|
225
196
|
},
|
226
|
-
"Program"() {
|
227
|
-
const scope =
|
197
|
+
"Program"(node) {
|
198
|
+
const scope = sourceCode.getScope(node);
|
228
199
|
const tracker = new ReferenceTracker(scope);
|
229
200
|
|
230
201
|
/*
|
@@ -232,22 +203,22 @@ module.exports = {
|
|
232
203
|
* E.g., `new RegExp()`, `RegExp()`, `new window.RegExp()`,
|
233
204
|
* `const {RegExp: a} = window; new a()`, etc...
|
234
205
|
*/
|
235
|
-
for (const { node } of tracker.iterateGlobalReferences({
|
206
|
+
for (const { node: refNode } of tracker.iterateGlobalReferences({
|
236
207
|
RegExp: { [CALL]: true, [CONSTRUCT]: true }
|
237
208
|
})) {
|
238
|
-
const [patternNode, flagsNode] =
|
209
|
+
const [patternNode, flagsNode] = refNode.arguments;
|
239
210
|
const pattern = getStringIfConstant(patternNode, scope);
|
240
211
|
const flags = getStringIfConstant(flagsNode, scope);
|
241
212
|
|
242
213
|
if (typeof pattern === "string") {
|
243
|
-
verify(
|
214
|
+
verify(refNode, pattern, flags || "", fixer => {
|
244
215
|
|
245
|
-
if (!isValidWithUnicodeFlag(pattern)) {
|
216
|
+
if (!isValidWithUnicodeFlag(context.languageOptions.ecmaVersion, pattern)) {
|
246
217
|
return null;
|
247
218
|
}
|
248
219
|
|
249
|
-
if (
|
250
|
-
const penultimateToken = sourceCode.getLastToken(
|
220
|
+
if (refNode.arguments.length === 1) {
|
221
|
+
const penultimateToken = sourceCode.getLastToken(refNode, { skip: 1 }); // skip closing parenthesis
|
251
222
|
|
252
223
|
return fixer.insertTextAfter(
|
253
224
|
penultimateToken,
|
@@ -47,6 +47,7 @@ module.exports = {
|
|
47
47
|
create(context) {
|
48
48
|
const config = context.options[0];
|
49
49
|
const exceptions = (config && config.exceptions) || [];
|
50
|
+
const sourceCode = context.getSourceCode();
|
50
51
|
|
51
52
|
/**
|
52
53
|
* Reports write references.
|
@@ -87,8 +88,8 @@ module.exports = {
|
|
87
88
|
}
|
88
89
|
|
89
90
|
return {
|
90
|
-
Program() {
|
91
|
-
const globalScope =
|
91
|
+
Program(node) {
|
92
|
+
const globalScope = sourceCode.getScope(node);
|
92
93
|
|
93
94
|
globalScope.variables.forEach(checkVariable);
|
94
95
|
}
|
package/lib/rules/no-new-func.js
CHANGED
@@ -40,27 +40,28 @@ module.exports = {
|
|
40
40
|
},
|
41
41
|
|
42
42
|
create(context) {
|
43
|
+
const sourceCode = context.getSourceCode();
|
43
44
|
|
44
45
|
return {
|
45
|
-
"Program:exit"() {
|
46
|
-
const globalScope =
|
46
|
+
"Program:exit"(node) {
|
47
|
+
const globalScope = sourceCode.getScope(node);
|
47
48
|
const variable = globalScope.set.get("Function");
|
48
49
|
|
49
50
|
if (variable && variable.defs.length === 0) {
|
50
51
|
variable.references.forEach(ref => {
|
51
|
-
const
|
52
|
-
const { parent } =
|
52
|
+
const idNode = ref.identifier;
|
53
|
+
const { parent } = idNode;
|
53
54
|
let evalNode;
|
54
55
|
|
55
56
|
if (parent) {
|
56
|
-
if (
|
57
|
+
if (idNode === parent.callee && (
|
57
58
|
parent.type === "NewExpression" ||
|
58
59
|
parent.type === "CallExpression"
|
59
60
|
)) {
|
60
61
|
evalNode = parent;
|
61
62
|
} else if (
|
62
63
|
parent.type === "MemberExpression" &&
|
63
|
-
|
64
|
+
idNode === parent.object &&
|
64
65
|
callMethods.has(astUtils.getStaticPropertyName(parent))
|
65
66
|
) {
|
66
67
|
const maybeCallee = parent.parent.type === "ChainExpression" ? parent.parent : parent;
|
@@ -35,21 +35,23 @@ module.exports = {
|
|
35
35
|
|
36
36
|
create(context) {
|
37
37
|
|
38
|
+
const sourceCode = context.getSourceCode();
|
39
|
+
|
38
40
|
return {
|
39
|
-
"Program:exit"() {
|
40
|
-
const globalScope =
|
41
|
+
"Program:exit"(node) {
|
42
|
+
const globalScope = sourceCode.getScope(node);
|
41
43
|
|
42
44
|
for (const nonConstructorName of nonConstructorGlobalFunctionNames) {
|
43
45
|
const variable = globalScope.set.get(nonConstructorName);
|
44
46
|
|
45
47
|
if (variable && variable.defs.length === 0) {
|
46
48
|
variable.references.forEach(ref => {
|
47
|
-
const
|
48
|
-
const parent =
|
49
|
+
const idNode = ref.identifier;
|
50
|
+
const parent = idNode.parent;
|
49
51
|
|
50
|
-
if (parent && parent.type === "NewExpression" && parent.callee ===
|
52
|
+
if (parent && parent.type === "NewExpression" && parent.callee === idNode) {
|
51
53
|
context.report({
|
52
|
-
node,
|
54
|
+
node: idNode,
|
53
55
|
messageId: "noNewNonconstructor",
|
54
56
|
data: { name: nonConstructorName }
|
55
57
|
});
|
@@ -34,10 +34,13 @@ module.exports = {
|
|
34
34
|
},
|
35
35
|
|
36
36
|
create(context) {
|
37
|
+
|
38
|
+
const sourceCode = context.getSourceCode();
|
39
|
+
|
37
40
|
return {
|
38
41
|
NewExpression(node) {
|
39
42
|
const variable = astUtils.getVariableByName(
|
40
|
-
|
43
|
+
sourceCode.getScope(node),
|
41
44
|
node.callee.name
|
42
45
|
);
|
43
46
|
|
@@ -29,19 +29,21 @@ module.exports = {
|
|
29
29
|
|
30
30
|
create(context) {
|
31
31
|
|
32
|
+
const sourceCode = context.getSourceCode();
|
33
|
+
|
32
34
|
return {
|
33
|
-
"Program:exit"() {
|
34
|
-
const globalScope =
|
35
|
+
"Program:exit"(node) {
|
36
|
+
const globalScope = sourceCode.getScope(node);
|
35
37
|
const variable = globalScope.set.get("Symbol");
|
36
38
|
|
37
39
|
if (variable && variable.defs.length === 0) {
|
38
40
|
variable.references.forEach(ref => {
|
39
|
-
const
|
40
|
-
const parent =
|
41
|
+
const idNode = ref.identifier;
|
42
|
+
const parent = idNode.parent;
|
41
43
|
|
42
|
-
if (parent && parent.type === "NewExpression" && parent.callee ===
|
44
|
+
if (parent && parent.type === "NewExpression" && parent.callee === idNode) {
|
43
45
|
context.report({
|
44
|
-
node,
|
46
|
+
node: idNode,
|
45
47
|
messageId: "noNewSymbol"
|
46
48
|
});
|
47
49
|
}
|
@@ -9,7 +9,7 @@
|
|
9
9
|
// Requirements
|
10
10
|
//------------------------------------------------------------------------------
|
11
11
|
|
12
|
-
const { CALL, CONSTRUCT, ReferenceTracker } = require("eslint-utils");
|
12
|
+
const { CALL, CONSTRUCT, ReferenceTracker } = require("@eslint-community/eslint-utils");
|
13
13
|
const getPropertyName = require("./utils/ast-utils").getStaticPropertyName;
|
14
14
|
|
15
15
|
//------------------------------------------------------------------------------
|
@@ -58,9 +58,11 @@ module.exports = {
|
|
58
58
|
|
59
59
|
create(context) {
|
60
60
|
|
61
|
+
const sourceCode = context.getSourceCode();
|
62
|
+
|
61
63
|
return {
|
62
|
-
Program() {
|
63
|
-
const scope =
|
64
|
+
Program(node) {
|
65
|
+
const scope = sourceCode.getScope(node);
|
64
66
|
const tracker = new ReferenceTracker(scope);
|
65
67
|
const traceMap = {};
|
66
68
|
|
@@ -71,12 +73,12 @@ module.exports = {
|
|
71
73
|
};
|
72
74
|
}
|
73
75
|
|
74
|
-
for (const { node, path } of tracker.iterateGlobalReferences(traceMap)) {
|
75
|
-
const name = getReportNodeName(
|
76
|
+
for (const { node: refNode, path } of tracker.iterateGlobalReferences(traceMap)) {
|
77
|
+
const name = getReportNodeName(refNode.callee);
|
76
78
|
const ref = path[0];
|
77
79
|
const messageId = name === ref ? "unexpectedCall" : "unexpectedRefCall";
|
78
80
|
|
79
|
-
context.report({ node, messageId, data: { name, ref } });
|
81
|
+
context.report({ node: refNode, messageId, data: { name, ref } });
|
80
82
|
}
|
81
83
|
}
|
82
84
|
};
|
@@ -70,6 +70,7 @@ module.exports = {
|
|
70
70
|
const props = context.options[0] && context.options[0].props;
|
71
71
|
const ignoredPropertyAssignmentsFor = context.options[0] && context.options[0].ignorePropertyModificationsFor || [];
|
72
72
|
const ignoredPropertyAssignmentsForRegex = context.options[0] && context.options[0].ignorePropertyModificationsForRegex || [];
|
73
|
+
const sourceCode = context.getSourceCode();
|
73
74
|
|
74
75
|
/**
|
75
76
|
* Checks whether or not the reference modifies properties of its variable.
|
@@ -214,7 +215,7 @@ module.exports = {
|
|
214
215
|
* @returns {void}
|
215
216
|
*/
|
216
217
|
function checkForFunction(node) {
|
217
|
-
|
218
|
+
sourceCode.getDeclaredVariables(node).forEach(checkVariable);
|
218
219
|
}
|
219
220
|
|
220
221
|
return {
|
@@ -9,7 +9,7 @@
|
|
9
9
|
// Requirements
|
10
10
|
//------------------------------------------------------------------------------
|
11
11
|
|
12
|
-
const { findVariable } = require("eslint-utils");
|
12
|
+
const { findVariable } = require("@eslint-community/eslint-utils");
|
13
13
|
|
14
14
|
//------------------------------------------------------------------------------
|
15
15
|
// Helpers
|
@@ -84,6 +84,7 @@ module.exports = {
|
|
84
84
|
create(context) {
|
85
85
|
|
86
86
|
let funcInfo = null;
|
87
|
+
const sourceCode = context.getSourceCode();
|
87
88
|
|
88
89
|
/**
|
89
90
|
* Reports the given node.
|
@@ -99,7 +100,7 @@ module.exports = {
|
|
99
100
|
onCodePathStart(_, node) {
|
100
101
|
funcInfo = {
|
101
102
|
upper: funcInfo,
|
102
|
-
shouldCheck: functionTypesToCheck.has(node.type) && isPromiseExecutor(node,
|
103
|
+
shouldCheck: functionTypesToCheck.has(node.type) && isPromiseExecutor(node, sourceCode.getScope(node))
|
103
104
|
};
|
104
105
|
|
105
106
|
if (funcInfo.shouldCheck && node.type === "ArrowFunctionExpression" && node.expression) {
|
@@ -129,7 +129,7 @@ module.exports = {
|
|
129
129
|
* @private
|
130
130
|
*/
|
131
131
|
function checkForBlock(node) {
|
132
|
-
const scope =
|
132
|
+
const scope = sourceCode.getScope(node);
|
133
133
|
|
134
134
|
/*
|
135
135
|
* In ES5, some node type such as `BlockStatement` doesn't have that scope.
|
@@ -141,8 +141,8 @@ module.exports = {
|
|
141
141
|
}
|
142
142
|
|
143
143
|
return {
|
144
|
-
Program() {
|
145
|
-
const scope =
|
144
|
+
Program(node) {
|
145
|
+
const scope = sourceCode.getScope(node);
|
146
146
|
|
147
147
|
findVariablesInScope(scope);
|
148
148
|
|
@@ -10,7 +10,7 @@
|
|
10
10
|
//------------------------------------------------------------------------------
|
11
11
|
|
12
12
|
const astUtils = require("./utils/ast-utils");
|
13
|
-
const regexpp = require("regexpp");
|
13
|
+
const regexpp = require("@eslint-community/regexpp");
|
14
14
|
|
15
15
|
//------------------------------------------------------------------------------
|
16
16
|
// Helpers
|
@@ -54,6 +54,8 @@ module.exports = {
|
|
54
54
|
|
55
55
|
create(context) {
|
56
56
|
|
57
|
+
const sourceCode = context.getSourceCode();
|
58
|
+
|
57
59
|
/**
|
58
60
|
* Validate regular expression
|
59
61
|
* @param {ASTNode} nodeToReport Node to report.
|
@@ -149,7 +151,7 @@ module.exports = {
|
|
149
151
|
* @private
|
150
152
|
*/
|
151
153
|
function checkFunction(node) {
|
152
|
-
const scope =
|
154
|
+
const scope = sourceCode.getScope(node);
|
153
155
|
const regExpVar = astUtils.getVariableByName(scope, "RegExp");
|
154
156
|
const shadowed = regExpVar && regExpVar.defs.length > 0;
|
155
157
|
const patternNode = node.arguments[0];
|
@@ -99,6 +99,7 @@ module.exports = {
|
|
99
99
|
|
100
100
|
const restrictedNames = new Set(context.options[0] && context.options[0].restrictedNamedExports);
|
101
101
|
const restrictDefaultExports = context.options[0] && context.options[0].restrictDefaultExports;
|
102
|
+
const sourceCode = context.getSourceCode();
|
102
103
|
|
103
104
|
/**
|
104
105
|
* Checks and reports given exported name.
|
@@ -176,7 +177,7 @@ module.exports = {
|
|
176
177
|
if (declaration.type === "FunctionDeclaration" || declaration.type === "ClassDeclaration") {
|
177
178
|
checkExportedName(declaration.id);
|
178
179
|
} else if (declaration.type === "VariableDeclaration") {
|
179
|
-
|
180
|
+
sourceCode.getDeclaredVariables(declaration)
|
180
181
|
.map(v => v.defs.find(d => d.parent === declaration))
|
181
182
|
.map(d => d.name) // Identifier nodes
|
182
183
|
.forEach(checkExportedName);
|
@@ -50,6 +50,8 @@ module.exports = {
|
|
50
50
|
|
51
51
|
create(context) {
|
52
52
|
|
53
|
+
const sourceCode = context.getSourceCode();
|
54
|
+
|
53
55
|
// If no globals are restricted, we don't need to do anything
|
54
56
|
if (context.options.length === 0) {
|
55
57
|
return {};
|
@@ -99,8 +101,8 @@ module.exports = {
|
|
99
101
|
}
|
100
102
|
|
101
103
|
return {
|
102
|
-
Program() {
|
103
|
-
const scope =
|
104
|
+
Program(node) {
|
105
|
+
const scope = sourceCode.getScope(node);
|
104
106
|
|
105
107
|
// Report variables declared elsewhere (ex: variables defined as "global" by eslint)
|
106
108
|
scope.variables.forEach(variable => {
|