eslint-plugin-jest 27.1.5 → 27.1.7
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 +1 -1
- package/docs/rules/no-if.md +1 -1
- package/lib/rules/no-done-callback.js +15 -12
- package/lib/rules/prefer-expect-assertions.js +6 -6
- package/lib/rules/prefer-spy-on.js +12 -4
- package/lib/rules/prefer-to-be.js +7 -7
- package/lib/rules/utils/misc.js +12 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -273,7 +273,7 @@ set to warn in.\
|
|
|
273
273
|
|
|
274
274
|
In order to use the rules powered by TypeScript type-checking, you must be using
|
|
275
275
|
`@typescript-eslint/parser` & adjust your eslint config as outlined
|
|
276
|
-
[here](https://
|
|
276
|
+
[here](https://typescript-eslint.io/docs/linting/typed-linting).
|
|
277
277
|
|
|
278
278
|
Note that unlike the type-checking rules in `@typescript-eslint/eslint-plugin`,
|
|
279
279
|
the rules here will fallback to doing nothing if type information is not
|
package/docs/rules/no-if.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Disallow conditional logic (`no-if`)
|
|
2
2
|
|
|
3
3
|
❌ This rule is deprecated. It was replaced by
|
|
4
|
-
[`no-conditional-in-test`](no-conditional-in-test.md).
|
|
4
|
+
[`jest/no-conditional-in-test`](../../docs/rules/no-conditional-in-test.md).
|
|
5
5
|
|
|
6
6
|
<!-- end auto-generated rule header -->
|
|
7
7
|
|
|
@@ -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;
|
|
@@ -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) {
|
|
@@ -28,6 +28,16 @@ const getJestFnCall = node => {
|
|
|
28
28
|
}
|
|
29
29
|
return getJestFnCall(obj);
|
|
30
30
|
};
|
|
31
|
+
const getAutoFixMockImplementation = (jestFnCall, context) => {
|
|
32
|
+
var _jestFnCall$parent;
|
|
33
|
+
const hasMockImplementationAlready = ((_jestFnCall$parent = jestFnCall.parent) === null || _jestFnCall$parent === void 0 ? void 0 : _jestFnCall$parent.type) === _utils.AST_NODE_TYPES.MemberExpression && jestFnCall.parent.property.type === _utils.AST_NODE_TYPES.Identifier && jestFnCall.parent.property.name === 'mockImplementation';
|
|
34
|
+
if (hasMockImplementationAlready) {
|
|
35
|
+
return '';
|
|
36
|
+
}
|
|
37
|
+
const [arg] = jestFnCall.arguments;
|
|
38
|
+
const argSource = arg && context.getSourceCode().getText(arg);
|
|
39
|
+
return argSource ? `.mockImplementation(${argSource})` : '.mockImplementation()';
|
|
40
|
+
};
|
|
31
41
|
var _default = (0, _utils2.createRule)({
|
|
32
42
|
name: __filename,
|
|
33
43
|
meta: {
|
|
@@ -58,10 +68,8 @@ var _default = (0, _utils2.createRule)({
|
|
|
58
68
|
node,
|
|
59
69
|
messageId: 'useJestSpyOn',
|
|
60
70
|
fix(fixer) {
|
|
61
|
-
const leftPropQuote = left.property.type === _utils.AST_NODE_TYPES.Identifier ? "'" : '';
|
|
62
|
-
const
|
|
63
|
-
const argSource = arg && context.getSourceCode().getText(arg);
|
|
64
|
-
const mockImplementation = argSource ? `.mockImplementation(${argSource})` : '.mockImplementation()';
|
|
71
|
+
const leftPropQuote = left.property.type === _utils.AST_NODE_TYPES.Identifier && !left.computed ? "'" : '';
|
|
72
|
+
const mockImplementation = getAutoFixMockImplementation(jestFnCall, context);
|
|
65
73
|
return [fixer.insertTextBefore(left, `jest.spyOn(`), fixer.replaceTextRange([left.object.range[1], left.property.range[0]], `, ${leftPropQuote}`), fixer.replaceTextRange([left.property.range[1], jestFnCall.range[1]], `${leftPropQuote})${mockImplementation}`)];
|
|
66
74
|
}
|
|
67
75
|
});
|
|
@@ -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 {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-plugin-jest",
|
|
3
|
-
"version": "27.1.
|
|
3
|
+
"version": "27.1.7",
|
|
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",
|
|
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": "^1.0.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
|
}
|