eslint-plugin-jest 27.1.4 → 27.1.6
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/lib/rules/no-disabled-tests.js +1 -1
- package/lib/rules/no-done-callback.js +15 -12
- package/lib/rules/no-jasmine-globals.js +1 -1
- package/lib/rules/prefer-expect-assertions.js +6 -6
- package/lib/rules/prefer-to-be.js +7 -7
- package/lib/rules/utils/misc.js +12 -1
- package/lib/rules/utils/parseJestFnCall.js +6 -51
- package/lib/rules/valid-title.js +1 -1
- package/package.json +4 -4
|
@@ -68,7 +68,7 @@ var _default = (0, _utils.createRule)({
|
|
|
68
68
|
}
|
|
69
69
|
},
|
|
70
70
|
'CallExpression[callee.name="pending"]'(node) {
|
|
71
|
-
if ((0, _utils.
|
|
71
|
+
if ((0, _utils.resolveScope)(context.getScope(), 'pending')) {
|
|
72
72
|
return;
|
|
73
73
|
}
|
|
74
74
|
if (testDepth > 0) {
|
|
@@ -78,28 +78,31 @@ var _default = (0, _utils2.createRule)({
|
|
|
78
78
|
callback: argument.name
|
|
79
79
|
},
|
|
80
80
|
fix(fixer) {
|
|
81
|
+
var _tokenAfterLastParam;
|
|
81
82
|
const {
|
|
82
|
-
body
|
|
83
|
+
body,
|
|
84
|
+
params
|
|
83
85
|
} = callback;
|
|
84
86
|
const sourceCode = context.getSourceCode();
|
|
85
87
|
const firstBodyToken = sourceCode.getFirstToken(body);
|
|
86
88
|
const lastBodyToken = sourceCode.getLastToken(body);
|
|
87
|
-
const
|
|
88
|
-
const
|
|
89
|
+
const [firstParam] = params;
|
|
90
|
+
const lastParam = params[params.length - 1];
|
|
91
|
+
const tokenBeforeFirstParam = sourceCode.getTokenBefore(firstParam);
|
|
92
|
+
let tokenAfterLastParam = sourceCode.getTokenAfter(lastParam);
|
|
93
|
+
if (((_tokenAfterLastParam = tokenAfterLastParam) === null || _tokenAfterLastParam === void 0 ? void 0 : _tokenAfterLastParam.value) === ',') {
|
|
94
|
+
tokenAfterLastParam = sourceCode.getTokenAfter(tokenAfterLastParam);
|
|
95
|
+
}
|
|
89
96
|
|
|
90
97
|
/* istanbul ignore if */
|
|
91
|
-
if (!firstBodyToken || !lastBodyToken || !
|
|
98
|
+
if (!firstBodyToken || !lastBodyToken || !tokenBeforeFirstParam || !tokenAfterLastParam) {
|
|
92
99
|
throw new Error(`Unexpected null when attempting to fix ${context.getFilename()} - please file a github issue at https://github.com/jest-community/eslint-plugin-jest`);
|
|
93
100
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
argumentFix = fixer.remove(argument);
|
|
98
|
-
}
|
|
99
|
-
let newCallback = argument.name;
|
|
100
|
-
if (argumentInParens) {
|
|
101
|
-
newCallback = `(${newCallback})`;
|
|
101
|
+
let argumentFix = fixer.replaceText(firstParam, '()');
|
|
102
|
+
if (tokenBeforeFirstParam.value === '(' && tokenAfterLastParam.value === ')') {
|
|
103
|
+
argumentFix = fixer.removeRange([tokenBeforeFirstParam.range[1], tokenAfterLastParam.range[0]]);
|
|
102
104
|
}
|
|
105
|
+
const newCallback = argument.name;
|
|
103
106
|
let beforeReplacement = `new Promise(${newCallback} => `;
|
|
104
107
|
let afterReplacement = ')';
|
|
105
108
|
let replaceBefore = true;
|
|
@@ -37,7 +37,7 @@ var _default = (0, _utils2.createRule)({
|
|
|
37
37
|
return;
|
|
38
38
|
}
|
|
39
39
|
if (calleeName === 'spyOn' || calleeName === 'spyOnProperty' || calleeName === 'fail' || calleeName === 'pending') {
|
|
40
|
-
if ((0, _utils2.
|
|
40
|
+
if ((0, _utils2.resolveScope)(context.getScope(), calleeName)) {
|
|
41
41
|
// It's a local variable, not a jasmine global.
|
|
42
42
|
return;
|
|
43
43
|
}
|
|
@@ -25,9 +25,9 @@ const isFirstStatement = node => {
|
|
|
25
25
|
/* istanbul ignore next */
|
|
26
26
|
throw new Error(`Could not find BlockStatement - please file a github issue at https://github.com/jest-community/eslint-plugin-jest`);
|
|
27
27
|
};
|
|
28
|
-
const suggestRemovingExtraArguments = (
|
|
28
|
+
const suggestRemovingExtraArguments = (context, func, from) => ({
|
|
29
29
|
messageId: 'suggestRemovingExtraArguments',
|
|
30
|
-
fix: fixer =>
|
|
30
|
+
fix: fixer => (0, _utils2.removeExtraArgumentsFixer)(fixer, context, func, from)
|
|
31
31
|
});
|
|
32
32
|
var _default = (0, _utils2.createRule)({
|
|
33
33
|
name: __filename,
|
|
@@ -97,13 +97,13 @@ var _default = (0, _utils2.createRule)({
|
|
|
97
97
|
}
|
|
98
98
|
return false;
|
|
99
99
|
};
|
|
100
|
-
const checkExpectHasAssertions = expectFnCall => {
|
|
100
|
+
const checkExpectHasAssertions = (expectFnCall, func) => {
|
|
101
101
|
if ((0, _utils2.getAccessorValue)(expectFnCall.members[0]) === 'hasAssertions') {
|
|
102
102
|
if (expectFnCall.args.length) {
|
|
103
103
|
context.report({
|
|
104
104
|
messageId: 'hasAssertionsTakesNoArguments',
|
|
105
105
|
node: expectFnCall.matcher,
|
|
106
|
-
suggest: [suggestRemovingExtraArguments(
|
|
106
|
+
suggest: [suggestRemovingExtraArguments(context, func, 0)]
|
|
107
107
|
});
|
|
108
108
|
}
|
|
109
109
|
return;
|
|
@@ -115,7 +115,7 @@ var _default = (0, _utils2.createRule)({
|
|
|
115
115
|
const suggest = [];
|
|
116
116
|
if (expectFnCall.args.length) {
|
|
117
117
|
loc = expectFnCall.args[1].loc;
|
|
118
|
-
suggest.push(suggestRemovingExtraArguments(
|
|
118
|
+
suggest.push(suggestRemovingExtraArguments(context, func, 1));
|
|
119
119
|
}
|
|
120
120
|
context.report({
|
|
121
121
|
messageId: 'assertionsRequiresOneArgument',
|
|
@@ -157,7 +157,7 @@ var _default = (0, _utils2.createRule)({
|
|
|
157
157
|
if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) === 'expect' && inTestCaseCall) {
|
|
158
158
|
var _jestFnCall$head$node;
|
|
159
159
|
if (expressionDepth === 1 && isFirstStatement(node) && ((_jestFnCall$head$node = jestFnCall.head.node.parent) === null || _jestFnCall$head$node === void 0 ? void 0 : _jestFnCall$head$node.type) === _utils.AST_NODE_TYPES.MemberExpression && jestFnCall.members.length === 1 && ['assertions', 'hasAssertions'].includes((0, _utils2.getAccessorValue)(jestFnCall.members[0]))) {
|
|
160
|
-
checkExpectHasAssertions(jestFnCall);
|
|
160
|
+
checkExpectHasAssertions(jestFnCall, node);
|
|
161
161
|
hasExpectAssertionsAsFirstStatement = true;
|
|
162
162
|
}
|
|
163
163
|
if (inForLoop) {
|
|
@@ -26,14 +26,14 @@ const shouldUseToBe = expectFnCall => {
|
|
|
26
26
|
}
|
|
27
27
|
return firstArg.type === _utils.AST_NODE_TYPES.TemplateLiteral;
|
|
28
28
|
};
|
|
29
|
-
const reportPreferToBe = (context, whatToBe, expectFnCall, modifierNode) => {
|
|
29
|
+
const reportPreferToBe = (context, whatToBe, expectFnCall, func, modifierNode) => {
|
|
30
30
|
context.report({
|
|
31
31
|
messageId: `useToBe${whatToBe}`,
|
|
32
32
|
fix(fixer) {
|
|
33
33
|
var _expectFnCall$args;
|
|
34
34
|
const fixes = [(0, _utils2.replaceAccessorFixer)(fixer, expectFnCall.matcher, `toBe${whatToBe}`)];
|
|
35
35
|
if ((_expectFnCall$args = expectFnCall.args) !== null && _expectFnCall$args !== void 0 && _expectFnCall$args.length && whatToBe !== '') {
|
|
36
|
-
fixes.push(
|
|
36
|
+
fixes.push((0, _utils2.removeExtraArgumentsFixer)(fixer, context, func, 0));
|
|
37
37
|
}
|
|
38
38
|
if (modifierNode) {
|
|
39
39
|
fixes.push(fixer.removeRange([modifierNode.range[0] - 1, modifierNode.range[1]]));
|
|
@@ -73,27 +73,27 @@ var _default = (0, _utils2.createRule)({
|
|
|
73
73
|
const matcherName = (0, _utils2.getAccessorValue)(jestFnCall.matcher);
|
|
74
74
|
const notModifier = jestFnCall.modifiers.find(nod => (0, _utils2.getAccessorValue)(nod) === 'not');
|
|
75
75
|
if (notModifier && ['toBeUndefined', 'toBeDefined'].includes(matcherName)) {
|
|
76
|
-
reportPreferToBe(context, matcherName === 'toBeDefined' ? 'Undefined' : 'Defined', jestFnCall, notModifier);
|
|
76
|
+
reportPreferToBe(context, matcherName === 'toBeDefined' ? 'Undefined' : 'Defined', jestFnCall, node, notModifier);
|
|
77
77
|
return;
|
|
78
78
|
}
|
|
79
79
|
if (!_utils2.EqualityMatcher.hasOwnProperty(matcherName) || jestFnCall.args.length === 0) {
|
|
80
80
|
return;
|
|
81
81
|
}
|
|
82
82
|
if (isNullEqualityMatcher(jestFnCall)) {
|
|
83
|
-
reportPreferToBe(context, 'Null', jestFnCall);
|
|
83
|
+
reportPreferToBe(context, 'Null', jestFnCall, node);
|
|
84
84
|
return;
|
|
85
85
|
}
|
|
86
86
|
if (isFirstArgumentIdentifier(jestFnCall, 'undefined')) {
|
|
87
87
|
const name = notModifier ? 'Defined' : 'Undefined';
|
|
88
|
-
reportPreferToBe(context, name, jestFnCall, notModifier);
|
|
88
|
+
reportPreferToBe(context, name, jestFnCall, node, notModifier);
|
|
89
89
|
return;
|
|
90
90
|
}
|
|
91
91
|
if (isFirstArgumentIdentifier(jestFnCall, 'NaN')) {
|
|
92
|
-
reportPreferToBe(context, 'NaN', jestFnCall);
|
|
92
|
+
reportPreferToBe(context, 'NaN', jestFnCall, node);
|
|
93
93
|
return;
|
|
94
94
|
}
|
|
95
95
|
if (shouldUseToBe(jestFnCall) && matcherName !== _utils2.EqualityMatcher.toBe) {
|
|
96
|
-
reportPreferToBe(context, '', jestFnCall);
|
|
96
|
+
reportPreferToBe(context, '', jestFnCall, node);
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
};
|
package/lib/rules/utils/misc.js
CHANGED
|
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.getFirstMatcherArg = exports.findTopMostCallExpression = exports.createRule = exports.TestCaseName = exports.ModifierName = exports.HookName = exports.EqualityMatcher = exports.DescribeAlias = void 0;
|
|
7
7
|
exports.getNodeName = getNodeName;
|
|
8
|
-
exports.replaceAccessorFixer = exports.isFunction = exports.isBooleanLiteral = exports.hasOnlyOneArgument = exports.getTestCallExpressionsFromDeclaredVariables = void 0;
|
|
8
|
+
exports.replaceAccessorFixer = exports.removeExtraArgumentsFixer = exports.isFunction = exports.isBooleanLiteral = exports.hasOnlyOneArgument = exports.getTestCallExpressionsFromDeclaredVariables = void 0;
|
|
9
9
|
var _path = require("path");
|
|
10
10
|
var _utils = require("@typescript-eslint/utils");
|
|
11
11
|
var _package = require("../../../package.json");
|
|
@@ -106,6 +106,17 @@ const replaceAccessorFixer = (fixer, node, text) => {
|
|
|
106
106
|
return fixer.replaceText(node, node.type === _utils.AST_NODE_TYPES.Identifier ? text : `'${text}'`);
|
|
107
107
|
};
|
|
108
108
|
exports.replaceAccessorFixer = replaceAccessorFixer;
|
|
109
|
+
const removeExtraArgumentsFixer = (fixer, context, func, from) => {
|
|
110
|
+
const firstArg = func.arguments[from];
|
|
111
|
+
const lastArg = func.arguments[func.arguments.length - 1];
|
|
112
|
+
const sourceCode = context.getSourceCode();
|
|
113
|
+
let tokenAfterLastParam = sourceCode.getTokenAfter(lastArg);
|
|
114
|
+
if (tokenAfterLastParam.value === ',') {
|
|
115
|
+
tokenAfterLastParam = sourceCode.getTokenAfter(tokenAfterLastParam);
|
|
116
|
+
}
|
|
117
|
+
return fixer.removeRange([firstArg.range[0], tokenAfterLastParam.range[0]]);
|
|
118
|
+
};
|
|
119
|
+
exports.removeExtraArgumentsFixer = removeExtraArgumentsFixer;
|
|
109
120
|
const findTopMostCallExpression = node => {
|
|
110
121
|
let topMostCallExpression = node;
|
|
111
122
|
let {
|
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.getNodeChain = getNodeChain;
|
|
7
|
-
exports.
|
|
7
|
+
exports.resolveScope = exports.parseJestFnCallWithReason = exports.parseJestFnCall = exports.isTypeOfJestFnCall = void 0;
|
|
8
8
|
var _utils = require("@typescript-eslint/utils");
|
|
9
9
|
var _utils2 = require("../utils");
|
|
10
10
|
const isTypeOfJestFnCall = (node, context, types) => {
|
|
@@ -286,55 +286,23 @@ const describePossibleImportDef = def => {
|
|
|
286
286
|
}
|
|
287
287
|
return null;
|
|
288
288
|
};
|
|
289
|
-
const collectReferences = scope => {
|
|
290
|
-
const locals = new Set();
|
|
291
|
-
const imports = new Map();
|
|
292
|
-
const unresolved = new Set();
|
|
293
|
-
let currentScope = scope;
|
|
294
|
-
while (currentScope !== null) {
|
|
295
|
-
for (const ref of currentScope.variables) {
|
|
296
|
-
if (ref.defs.length === 0) {
|
|
297
|
-
continue;
|
|
298
|
-
}
|
|
299
|
-
const def = ref.defs[ref.defs.length - 1];
|
|
300
|
-
const importDetails = describePossibleImportDef(def);
|
|
301
|
-
if (importDetails) {
|
|
302
|
-
imports.set(importDetails.local, importDetails);
|
|
303
|
-
continue;
|
|
304
|
-
}
|
|
305
|
-
locals.add(ref.name);
|
|
306
|
-
}
|
|
307
|
-
for (const ref of currentScope.through) {
|
|
308
|
-
unresolved.add(ref.identifier.name);
|
|
309
|
-
}
|
|
310
|
-
currentScope = currentScope.upper;
|
|
311
|
-
}
|
|
312
|
-
return {
|
|
313
|
-
locals,
|
|
314
|
-
imports,
|
|
315
|
-
unresolved
|
|
316
|
-
};
|
|
317
|
-
};
|
|
318
289
|
const resolveScope = (scope, identifier) => {
|
|
319
290
|
let currentScope = scope;
|
|
320
291
|
while (currentScope !== null) {
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
continue;
|
|
324
|
-
}
|
|
292
|
+
const ref = currentScope.set.get(identifier);
|
|
293
|
+
if (ref && ref.defs.length > 0) {
|
|
325
294
|
const def = ref.defs[ref.defs.length - 1];
|
|
326
295
|
const importDetails = describePossibleImportDef(def);
|
|
327
296
|
if ((importDetails === null || importDetails === void 0 ? void 0 : importDetails.local) === identifier) {
|
|
328
297
|
return importDetails;
|
|
329
298
|
}
|
|
330
|
-
|
|
331
|
-
return 'local';
|
|
332
|
-
}
|
|
299
|
+
return 'local';
|
|
333
300
|
}
|
|
334
301
|
currentScope = currentScope.upper;
|
|
335
302
|
}
|
|
336
303
|
return null;
|
|
337
304
|
};
|
|
305
|
+
exports.resolveScope = resolveScope;
|
|
338
306
|
const resolveToJestFn = (context, identifier) => {
|
|
339
307
|
const maybeImport = resolveScope(context.getScope(), identifier);
|
|
340
308
|
|
|
@@ -360,17 +328,4 @@ const resolveToJestFn = (context, identifier) => {
|
|
|
360
328
|
local: identifier,
|
|
361
329
|
type: 'global'
|
|
362
330
|
};
|
|
363
|
-
};
|
|
364
|
-
const scopeHasLocalReference = (scope, referenceName) => {
|
|
365
|
-
const references = collectReferences(scope);
|
|
366
|
-
return (
|
|
367
|
-
// referenceName was found as a local variable or function declaration.
|
|
368
|
-
references.locals.has(referenceName) ||
|
|
369
|
-
// referenceName was found as an imported identifier
|
|
370
|
-
references.imports.has(referenceName) ||
|
|
371
|
-
// referenceName was not found as an unresolved reference,
|
|
372
|
-
// meaning it is likely not an implicit global reference.
|
|
373
|
-
!references.unresolved.has(referenceName)
|
|
374
|
-
);
|
|
375
|
-
};
|
|
376
|
-
exports.scopeHasLocalReference = scopeHasLocalReference;
|
|
331
|
+
};
|
package/lib/rules/valid-title.js
CHANGED
|
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
var _utils = require("@typescript-eslint/utils");
|
|
8
8
|
var _utils2 = require("./utils");
|
|
9
|
-
const trimFXprefix = word => ['f', 'x'].includes(word.charAt(0)) ? word.
|
|
9
|
+
const trimFXprefix = word => ['f', 'x'].includes(word.charAt(0)) ? word.substring(1) : word;
|
|
10
10
|
const doesBinaryExpressionContainStringNode = binaryExp => {
|
|
11
11
|
if ((0, _utils2.isStringNode)(binaryExp.right)) {
|
|
12
12
|
return true;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-plugin-jest",
|
|
3
|
-
"version": "27.1.
|
|
3
|
+
"version": "27.1.6",
|
|
4
4
|
"description": "ESLint rules for Jest",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"eslint",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"prettier:write": "prettier --write 'docs/**/*.md' README.md '.github/**' package.json tsconfig.json src/globals.json .yarnrc.yml",
|
|
30
30
|
"postpublish": "pinst --enable",
|
|
31
31
|
"test": "jest",
|
|
32
|
-
"tools:regenerate-docs": "yarn prepack && eslint-doc-generator
|
|
32
|
+
"tools:regenerate-docs": "yarn prepack && eslint-doc-generator && yarn prettier:write",
|
|
33
33
|
"typecheck": "tsc -p ."
|
|
34
34
|
},
|
|
35
35
|
"commitlint": {
|
|
@@ -121,7 +121,7 @@
|
|
|
121
121
|
"dedent": "^0.7.0",
|
|
122
122
|
"eslint": "^6.0.0 || ^7.0.0 || ^8.0.0",
|
|
123
123
|
"eslint-config-prettier": "^8.3.0",
|
|
124
|
-
"eslint-doc-generator": "^0.
|
|
124
|
+
"eslint-doc-generator": "^0.26.0",
|
|
125
125
|
"eslint-plugin-eslint-comments": "^3.1.2",
|
|
126
126
|
"eslint-plugin-eslint-plugin": "^5.0.6",
|
|
127
127
|
"eslint-plugin-import": "^2.25.1",
|
|
@@ -155,7 +155,7 @@
|
|
|
155
155
|
"optional": true
|
|
156
156
|
}
|
|
157
157
|
},
|
|
158
|
-
"packageManager": "yarn@3.
|
|
158
|
+
"packageManager": "yarn@3.3.0",
|
|
159
159
|
"engines": {
|
|
160
160
|
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
|
|
161
161
|
}
|