eslint-plugin-jest 26.8.7 → 27.1.5
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 +82 -78
- package/docs/rules/consistent-test-it.md +9 -4
- package/docs/rules/expect-expect.md +5 -0
- package/docs/rules/max-expects.md +3 -1
- package/docs/rules/max-nested-describe.md +3 -1
- package/docs/rules/no-alias-methods.md +13 -2
- package/docs/rules/no-commented-out-tests.md +6 -1
- package/docs/rules/no-conditional-expect.md +7 -2
- package/docs/rules/no-conditional-in-test.md +3 -1
- package/docs/rules/no-deprecated-functions.md +14 -7
- package/docs/rules/no-disabled-tests.md +6 -1
- package/docs/rules/no-done-callback.md +9 -1
- package/docs/rules/no-duplicate-hooks.md +3 -1
- package/docs/rules/no-export.md +6 -1
- package/docs/rules/no-focused-tests.md +10 -1
- package/docs/rules/no-hooks.md +3 -1
- package/docs/rules/no-identical-title.md +6 -1
- package/docs/rules/no-if.md +4 -4
- package/docs/rules/no-interpolation-in-snapshots.md +6 -1
- package/docs/rules/no-jasmine-globals.md +10 -2
- package/docs/rules/no-large-snapshots.md +4 -2
- package/docs/rules/no-mocks-import.md +6 -1
- package/docs/rules/no-restricted-jest-methods.md +51 -0
- package/docs/rules/no-restricted-matchers.md +19 -4
- package/docs/rules/no-standalone-expect.md +6 -1
- package/docs/rules/no-test-prefixes.md +9 -1
- package/docs/rules/no-test-return-statement.md +2 -0
- package/docs/rules/prefer-called-with.md +2 -0
- package/docs/rules/prefer-comparison-matcher.md +5 -0
- package/docs/rules/prefer-each.md +56 -0
- package/docs/rules/prefer-equality-matcher.md +5 -0
- package/docs/rules/prefer-expect-assertions.md +5 -2
- package/docs/rules/prefer-expect-resolves.md +8 -1
- package/docs/rules/prefer-hooks-in-order.md +3 -1
- package/docs/rules/prefer-hooks-on-top.md +3 -1
- package/docs/rules/prefer-lowercase-title.md +5 -0
- package/docs/rules/prefer-mock-promise-shorthand.md +6 -1
- package/docs/rules/prefer-snapshot-hint.md +2 -0
- package/docs/rules/prefer-spy-on.md +5 -2
- package/docs/rules/prefer-strict-equal.md +5 -2
- package/docs/rules/prefer-to-be.md +8 -0
- package/docs/rules/prefer-to-contain.md +8 -2
- package/docs/rules/prefer-to-have-length.md +8 -2
- package/docs/rules/prefer-todo.md +5 -2
- package/docs/rules/require-hook.md +2 -0
- package/docs/rules/require-to-throw-message.md +2 -2
- package/docs/rules/require-top-level-describe.md +5 -1
- package/docs/rules/unbound-method.md +7 -2
- package/docs/rules/valid-describe-callback.md +6 -1
- package/docs/rules/valid-expect-in-promise.md +6 -1
- package/docs/rules/valid-expect.md +5 -2
- package/docs/rules/valid-title.md +9 -1
- package/lib/index.js +14 -25
- package/lib/processors/snapshot-processor.js +3 -5
- package/lib/rules/consistent-test-it.js +1 -19
- package/lib/rules/expect-expect.js +1 -18
- package/lib/rules/max-expects.js +0 -16
- package/lib/rules/max-nested-describe.js +0 -13
- package/lib/rules/no-alias-methods.js +1 -10
- package/lib/rules/no-commented-out-tests.js +0 -10
- package/lib/rules/no-conditional-expect.js +2 -23
- package/lib/rules/no-conditional-in-test.js +0 -9
- package/lib/rules/no-deprecated-functions.js +2 -18
- package/lib/rules/no-disabled-tests.js +3 -19
- package/lib/rules/no-done-callback.js +5 -35
- package/lib/rules/no-duplicate-hooks.js +0 -12
- package/lib/rules/no-export.js +0 -12
- package/lib/rules/no-focused-tests.js +1 -17
- package/lib/rules/no-hooks.js +0 -7
- package/lib/rules/no-identical-title.js +0 -19
- package/lib/rules/no-if.js +0 -24
- package/lib/rules/no-interpolation-in-snapshots.js +0 -9
- package/lib/rules/no-jasmine-globals.js +1 -23
- package/lib/rules/no-large-snapshots.js +4 -24
- package/lib/rules/no-mocks-import.js +0 -12
- package/lib/rules/no-restricted-jest-methods.js +56 -0
- package/lib/rules/no-restricted-matchers.js +13 -28
- package/lib/rules/no-standalone-expect.js +7 -33
- package/lib/rules/no-test-prefixes.js +1 -13
- package/lib/rules/no-test-return-statement.js +0 -12
- package/lib/rules/prefer-called-with.js +0 -10
- package/lib/rules/prefer-comparison-matcher.js +8 -33
- package/lib/rules/prefer-each.js +80 -0
- package/lib/rules/prefer-equality-matcher.js +12 -25
- package/lib/rules/prefer-expect-assertions.js +8 -54
- package/lib/rules/prefer-expect-resolves.js +0 -12
- package/lib/rules/prefer-hooks-in-order.js +2 -16
- package/lib/rules/prefer-hooks-on-top.js +0 -9
- package/lib/rules/prefer-lowercase-title.js +0 -23
- package/lib/rules/prefer-mock-promise-shorthand.js +5 -26
- package/lib/rules/prefer-snapshot-hint.js +8 -34
- package/lib/rules/prefer-spy-on.js +0 -17
- package/lib/rules/prefer-strict-equal.js +1 -11
- package/lib/rules/prefer-to-be.js +5 -30
- package/lib/rules/prefer-to-contain.js +11 -21
- package/lib/rules/prefer-to-have-length.js +4 -16
- package/lib/rules/prefer-todo.js +2 -18
- package/lib/rules/require-hook.js +1 -25
- package/lib/rules/require-to-throw-message.js +0 -9
- package/lib/rules/require-top-level-describe.js +1 -18
- package/lib/rules/unbound-method.js +3 -30
- package/lib/rules/utils/accessors.js +6 -18
- package/lib/rules/utils/detectJestVersion.js +2 -7
- package/lib/rules/utils/followTypeAssertionChain.js +0 -4
- package/lib/rules/utils/index.js +0 -10
- package/lib/rules/utils/misc.js +2 -46
- package/lib/rules/utils/parseJestFnCall.js +51 -154
- package/lib/rules/valid-describe-callback.js +0 -17
- package/lib/rules/valid-expect-in-promise.js +28 -95
- package/lib/rules/valid-expect.js +5 -48
- package/lib/rules/valid-title.js +5 -40
- package/package.json +20 -16
- package/docs/rules/no-jest-import.md +0 -20
- package/lib/rules/no-jest-import.js +0 -48
|
@@ -4,11 +4,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _utils = require("@typescript-eslint/utils");
|
|
9
|
-
|
|
10
8
|
var _utils2 = require("./utils");
|
|
11
|
-
|
|
12
9
|
var _default = (0, _utils2.createRule)({
|
|
13
10
|
name: __filename,
|
|
14
11
|
meta: {
|
|
@@ -28,35 +25,26 @@ var _default = (0, _utils2.createRule)({
|
|
|
28
25
|
create: context => ({
|
|
29
26
|
CallExpression(node) {
|
|
30
27
|
const jestFnCall = (0, _utils2.parseJestFnCall)(node, context);
|
|
31
|
-
|
|
32
28
|
if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'expect') {
|
|
33
29
|
return;
|
|
34
30
|
}
|
|
35
|
-
|
|
36
31
|
const {
|
|
37
32
|
parent
|
|
38
33
|
} = jestFnCall.head.node;
|
|
39
|
-
|
|
40
34
|
if ((parent === null || parent === void 0 ? void 0 : parent.type) !== _utils.AST_NODE_TYPES.CallExpression) {
|
|
41
35
|
return;
|
|
42
36
|
}
|
|
43
|
-
|
|
44
37
|
const [awaitNode] = parent.arguments;
|
|
45
|
-
|
|
46
38
|
if ((awaitNode === null || awaitNode === void 0 ? void 0 : awaitNode.type) === _utils.AST_NODE_TYPES.AwaitExpression) {
|
|
47
39
|
context.report({
|
|
48
40
|
node: awaitNode,
|
|
49
41
|
messageId: 'expectResolves',
|
|
50
|
-
|
|
51
42
|
fix(fixer) {
|
|
52
43
|
return [fixer.insertTextBefore(parent, 'await '), fixer.removeRange([awaitNode.range[0], awaitNode.argument.range[0]]), fixer.insertTextAfter(parent, '.resolves')];
|
|
53
44
|
}
|
|
54
|
-
|
|
55
45
|
});
|
|
56
46
|
}
|
|
57
47
|
}
|
|
58
|
-
|
|
59
48
|
})
|
|
60
49
|
});
|
|
61
|
-
|
|
62
50
|
exports.default = _default;
|
|
@@ -4,11 +4,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _utils = require("./utils");
|
|
9
|
-
|
|
10
8
|
const HooksOrder = ['beforeAll', 'beforeEach', 'afterEach', 'afterAll'];
|
|
11
|
-
|
|
12
9
|
var _default = (0, _utils.createRule)({
|
|
13
10
|
name: __filename,
|
|
14
11
|
meta: {
|
|
@@ -24,7 +21,6 @@ var _default = (0, _utils.createRule)({
|
|
|
24
21
|
type: 'suggestion'
|
|
25
22
|
},
|
|
26
23
|
defaultOptions: [],
|
|
27
|
-
|
|
28
24
|
create(context) {
|
|
29
25
|
let previousHookIndex = -1;
|
|
30
26
|
let inHook = false;
|
|
@@ -34,19 +30,15 @@ var _default = (0, _utils.createRule)({
|
|
|
34
30
|
// Ignore everything that is passed into a hook
|
|
35
31
|
return;
|
|
36
32
|
}
|
|
37
|
-
|
|
38
33
|
const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
|
|
39
|
-
|
|
40
34
|
if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'hook') {
|
|
41
35
|
// Reset the previousHookIndex when encountering something different from a hook
|
|
42
36
|
previousHookIndex = -1;
|
|
43
37
|
return;
|
|
44
38
|
}
|
|
45
|
-
|
|
46
39
|
inHook = true;
|
|
47
40
|
const currentHook = jestFnCall.name;
|
|
48
41
|
const currentHookIndex = HooksOrder.indexOf(currentHook);
|
|
49
|
-
|
|
50
42
|
if (currentHookIndex < previousHookIndex) {
|
|
51
43
|
context.report({
|
|
52
44
|
messageId: 'reorderHooks',
|
|
@@ -58,27 +50,21 @@ var _default = (0, _utils.createRule)({
|
|
|
58
50
|
});
|
|
59
51
|
return;
|
|
60
52
|
}
|
|
61
|
-
|
|
62
53
|
previousHookIndex = currentHookIndex;
|
|
63
54
|
},
|
|
64
|
-
|
|
65
55
|
'CallExpression:exit'(node) {
|
|
66
56
|
if ((0, _utils.isTypeOfJestFnCall)(node, context, ['hook'])) {
|
|
67
57
|
inHook = false;
|
|
68
58
|
return;
|
|
69
59
|
}
|
|
70
|
-
|
|
71
60
|
if (inHook) {
|
|
72
61
|
return;
|
|
73
|
-
}
|
|
74
|
-
|
|
62
|
+
}
|
|
75
63
|
|
|
64
|
+
// Reset the previousHookIndex when encountering something different from a hook
|
|
76
65
|
previousHookIndex = -1;
|
|
77
66
|
}
|
|
78
|
-
|
|
79
67
|
};
|
|
80
68
|
}
|
|
81
|
-
|
|
82
69
|
});
|
|
83
|
-
|
|
84
70
|
exports.default = _default;
|
|
@@ -4,9 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _utils = require("./utils");
|
|
9
|
-
|
|
10
8
|
var _default = (0, _utils.createRule)({
|
|
11
9
|
name: __filename,
|
|
12
10
|
meta: {
|
|
@@ -22,7 +20,6 @@ var _default = (0, _utils.createRule)({
|
|
|
22
20
|
type: 'suggestion'
|
|
23
21
|
},
|
|
24
22
|
defaultOptions: [],
|
|
25
|
-
|
|
26
23
|
create(context) {
|
|
27
24
|
const hooksContext = [false];
|
|
28
25
|
return {
|
|
@@ -30,24 +27,18 @@ var _default = (0, _utils.createRule)({
|
|
|
30
27
|
if ((0, _utils.isTypeOfJestFnCall)(node, context, ['test'])) {
|
|
31
28
|
hooksContext[hooksContext.length - 1] = true;
|
|
32
29
|
}
|
|
33
|
-
|
|
34
30
|
if (hooksContext[hooksContext.length - 1] && (0, _utils.isTypeOfJestFnCall)(node, context, ['hook'])) {
|
|
35
31
|
context.report({
|
|
36
32
|
messageId: 'noHookOnTop',
|
|
37
33
|
node
|
|
38
34
|
});
|
|
39
35
|
}
|
|
40
|
-
|
|
41
36
|
hooksContext.push(false);
|
|
42
37
|
},
|
|
43
|
-
|
|
44
38
|
'CallExpression:exit'() {
|
|
45
39
|
hooksContext.pop();
|
|
46
40
|
}
|
|
47
|
-
|
|
48
41
|
};
|
|
49
42
|
}
|
|
50
|
-
|
|
51
43
|
});
|
|
52
|
-
|
|
53
44
|
exports.default = _default;
|
|
@@ -4,29 +4,21 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _utils = require("./utils");
|
|
9
|
-
|
|
10
8
|
const hasStringAsFirstArgument = node => node.arguments[0] && (0, _utils.isStringNode)(node.arguments[0]);
|
|
11
|
-
|
|
12
9
|
const populateIgnores = ignore => {
|
|
13
10
|
const ignores = [];
|
|
14
|
-
|
|
15
11
|
if (ignore.includes(_utils.DescribeAlias.describe)) {
|
|
16
12
|
ignores.push(...Object.keys(_utils.DescribeAlias));
|
|
17
13
|
}
|
|
18
|
-
|
|
19
14
|
if (ignore.includes(_utils.TestCaseName.test)) {
|
|
20
15
|
ignores.push(...Object.keys(_utils.TestCaseName).filter(k => k.endsWith(_utils.TestCaseName.test)));
|
|
21
16
|
}
|
|
22
|
-
|
|
23
17
|
if (ignore.includes(_utils.TestCaseName.it)) {
|
|
24
18
|
ignores.push(...Object.keys(_utils.TestCaseName).filter(k => k.endsWith(_utils.TestCaseName.it)));
|
|
25
19
|
}
|
|
26
|
-
|
|
27
20
|
return ignores;
|
|
28
21
|
};
|
|
29
|
-
|
|
30
22
|
var _default = (0, _utils.createRule)({
|
|
31
23
|
name: __filename,
|
|
32
24
|
meta: {
|
|
@@ -70,7 +62,6 @@ var _default = (0, _utils.createRule)({
|
|
|
70
62
|
allowedPrefixes: [],
|
|
71
63
|
ignoreTopLevelDescribe: false
|
|
72
64
|
}],
|
|
73
|
-
|
|
74
65
|
create(context, [{
|
|
75
66
|
ignore = [],
|
|
76
67
|
allowedPrefixes = [],
|
|
@@ -81,60 +72,46 @@ var _default = (0, _utils.createRule)({
|
|
|
81
72
|
return {
|
|
82
73
|
CallExpression(node) {
|
|
83
74
|
const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
|
|
84
|
-
|
|
85
75
|
if (!jestFnCall || !hasStringAsFirstArgument(node)) {
|
|
86
76
|
return;
|
|
87
77
|
}
|
|
88
|
-
|
|
89
78
|
if (jestFnCall.type === 'describe') {
|
|
90
79
|
numberOfDescribeBlocks++;
|
|
91
|
-
|
|
92
80
|
if (ignoreTopLevelDescribe && numberOfDescribeBlocks === 1) {
|
|
93
81
|
return;
|
|
94
82
|
}
|
|
95
83
|
} else if (jestFnCall.type !== 'test') {
|
|
96
84
|
return;
|
|
97
85
|
}
|
|
98
|
-
|
|
99
86
|
const [firstArg] = node.arguments;
|
|
100
87
|
const description = (0, _utils.getStringValue)(firstArg);
|
|
101
|
-
|
|
102
88
|
if (allowedPrefixes.some(name => description.startsWith(name))) {
|
|
103
89
|
return;
|
|
104
90
|
}
|
|
105
|
-
|
|
106
91
|
const firstCharacter = description.charAt(0);
|
|
107
|
-
|
|
108
92
|
if (!firstCharacter || firstCharacter === firstCharacter.toLowerCase() || ignores.includes(jestFnCall.name)) {
|
|
109
93
|
return;
|
|
110
94
|
}
|
|
111
|
-
|
|
112
95
|
context.report({
|
|
113
96
|
messageId: 'unexpectedLowercase',
|
|
114
97
|
node: node.arguments[0],
|
|
115
98
|
data: {
|
|
116
99
|
method: jestFnCall.name
|
|
117
100
|
},
|
|
118
|
-
|
|
119
101
|
fix(fixer) {
|
|
120
102
|
const description = (0, _utils.getStringValue)(firstArg);
|
|
121
103
|
const rangeIgnoringQuotes = [firstArg.range[0] + 1, firstArg.range[1] - 1];
|
|
122
104
|
const newDescription = description.substring(0, 1).toLowerCase() + description.substring(1);
|
|
123
105
|
return [fixer.replaceTextRange(rangeIgnoringQuotes, newDescription)];
|
|
124
106
|
}
|
|
125
|
-
|
|
126
107
|
});
|
|
127
108
|
},
|
|
128
|
-
|
|
129
109
|
'CallExpression:exit'(node) {
|
|
130
110
|
if ((0, _utils.isTypeOfJestFnCall)(node, context, ['describe'])) {
|
|
131
111
|
numberOfDescribeBlocks--;
|
|
132
112
|
}
|
|
133
113
|
}
|
|
134
|
-
|
|
135
114
|
};
|
|
136
115
|
}
|
|
137
|
-
|
|
138
116
|
});
|
|
139
|
-
|
|
140
117
|
exports.default = _default;
|
|
@@ -4,29 +4,21 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _utils = require("@typescript-eslint/utils");
|
|
9
|
-
|
|
10
8
|
var _utils2 = require("./utils");
|
|
11
|
-
|
|
12
9
|
const withOnce = (name, addOnce) => {
|
|
13
10
|
return `${name}${addOnce ? 'Once' : ''}`;
|
|
14
11
|
};
|
|
15
|
-
|
|
16
12
|
const findSingleReturnArgumentNode = fnNode => {
|
|
17
13
|
var _fnNode$body$body$;
|
|
18
|
-
|
|
19
14
|
if (fnNode.body.type !== _utils.AST_NODE_TYPES.BlockStatement) {
|
|
20
15
|
return fnNode.body;
|
|
21
16
|
}
|
|
22
|
-
|
|
23
17
|
if (((_fnNode$body$body$ = fnNode.body.body[0]) === null || _fnNode$body$body$ === void 0 ? void 0 : _fnNode$body$body$.type) === _utils.AST_NODE_TYPES.ReturnStatement) {
|
|
24
18
|
return fnNode.body.body[0].argument;
|
|
25
19
|
}
|
|
26
|
-
|
|
27
20
|
return null;
|
|
28
21
|
};
|
|
29
|
-
|
|
30
22
|
var _default = (0, _utils2.createRule)({
|
|
31
23
|
name: __filename,
|
|
32
24
|
meta: {
|
|
@@ -43,19 +35,15 @@ var _default = (0, _utils2.createRule)({
|
|
|
43
35
|
fixable: 'code'
|
|
44
36
|
},
|
|
45
37
|
defaultOptions: [],
|
|
46
|
-
|
|
47
38
|
create(context) {
|
|
48
39
|
const report = (property, isOnce, outerArgNode, innerArgNode = outerArgNode) => {
|
|
49
40
|
if ((innerArgNode === null || innerArgNode === void 0 ? void 0 : innerArgNode.type) !== _utils.AST_NODE_TYPES.CallExpression) {
|
|
50
41
|
return;
|
|
51
42
|
}
|
|
52
|
-
|
|
53
43
|
const argName = (0, _utils2.getNodeName)(innerArgNode);
|
|
54
|
-
|
|
55
44
|
if (argName !== 'Promise.resolve' && argName !== 'Promise.reject') {
|
|
56
45
|
return;
|
|
57
46
|
}
|
|
58
|
-
|
|
59
47
|
const replacement = withOnce(argName.endsWith('reject') ? 'mockRejectedValue' : 'mockResolvedValue', isOnce);
|
|
60
48
|
context.report({
|
|
61
49
|
node: property,
|
|
@@ -63,49 +51,40 @@ var _default = (0, _utils2.createRule)({
|
|
|
63
51
|
data: {
|
|
64
52
|
replacement
|
|
65
53
|
},
|
|
66
|
-
|
|
67
54
|
fix(fixer) {
|
|
68
|
-
const sourceCode = context.getSourceCode();
|
|
69
|
-
// fixing since we have no idea what to do with the extra arguments
|
|
55
|
+
const sourceCode = context.getSourceCode();
|
|
70
56
|
|
|
57
|
+
// there shouldn't be more than one argument, but if there is don't try
|
|
58
|
+
// fixing since we have no idea what to do with the extra arguments
|
|
71
59
|
if (innerArgNode.arguments.length > 1) {
|
|
72
60
|
return null;
|
|
73
61
|
}
|
|
74
|
-
|
|
75
|
-
|
|
62
|
+
return [fixer.replaceText(property, replacement), fixer.replaceText(outerArgNode,
|
|
63
|
+
// the value argument for both Promise methods is optional,
|
|
76
64
|
// whereas for Jest they're required so use an explicit undefined
|
|
77
65
|
// if no argument is being passed to the call we're replacing
|
|
78
66
|
innerArgNode.arguments.length === 1 ? sourceCode.getText(innerArgNode.arguments[0]) : 'undefined')];
|
|
79
67
|
}
|
|
80
|
-
|
|
81
68
|
});
|
|
82
69
|
};
|
|
83
|
-
|
|
84
70
|
return {
|
|
85
71
|
CallExpression(node) {
|
|
86
72
|
if (node.callee.type !== _utils.AST_NODE_TYPES.MemberExpression || !(0, _utils2.isSupportedAccessor)(node.callee.property) || node.arguments.length === 0) {
|
|
87
73
|
return;
|
|
88
74
|
}
|
|
89
|
-
|
|
90
75
|
const mockFnName = (0, _utils2.getAccessorValue)(node.callee.property);
|
|
91
76
|
const isOnce = mockFnName.endsWith('Once');
|
|
92
|
-
|
|
93
77
|
if (mockFnName === withOnce('mockReturnValue', isOnce)) {
|
|
94
78
|
report(node.callee.property, isOnce, node.arguments[0]);
|
|
95
79
|
} else if (mockFnName === withOnce('mockImplementation', isOnce)) {
|
|
96
80
|
const [arg] = node.arguments;
|
|
97
|
-
|
|
98
81
|
if (!(0, _utils2.isFunction)(arg) || arg.params.length !== 0) {
|
|
99
82
|
return;
|
|
100
83
|
}
|
|
101
|
-
|
|
102
84
|
report(node.callee.property, isOnce, arg, findSingleReturnArgumentNode(arg));
|
|
103
85
|
}
|
|
104
86
|
}
|
|
105
|
-
|
|
106
87
|
};
|
|
107
88
|
}
|
|
108
|
-
|
|
109
89
|
});
|
|
110
|
-
|
|
111
90
|
exports.default = _default;
|
|
@@ -4,39 +4,34 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _utils = require("./utils");
|
|
9
|
-
|
|
10
8
|
const snapshotMatchers = ['toMatchSnapshot', 'toThrowErrorMatchingSnapshot'];
|
|
11
9
|
const snapshotMatcherNames = snapshotMatchers;
|
|
12
|
-
|
|
13
10
|
const isSnapshotMatcherWithoutHint = expectFnCall => {
|
|
14
11
|
if (expectFnCall.args.length === 0) {
|
|
15
12
|
return true;
|
|
16
|
-
}
|
|
17
|
-
|
|
13
|
+
}
|
|
18
14
|
|
|
15
|
+
// this matcher only supports one argument which is the hint
|
|
19
16
|
if (!(0, _utils.isSupportedAccessor)(expectFnCall.matcher, 'toMatchSnapshot')) {
|
|
20
17
|
return expectFnCall.args.length !== 1;
|
|
21
|
-
}
|
|
22
|
-
// the second one should be the hint
|
|
23
|
-
|
|
18
|
+
}
|
|
24
19
|
|
|
20
|
+
// if we're being passed two arguments,
|
|
21
|
+
// the second one should be the hint
|
|
25
22
|
if (expectFnCall.args.length === 2) {
|
|
26
23
|
return false;
|
|
27
24
|
}
|
|
25
|
+
const [arg] = expectFnCall.args;
|
|
28
26
|
|
|
29
|
-
|
|
27
|
+
// the first argument to `toMatchSnapshot` can be _either_ a snapshot hint or
|
|
30
28
|
// an object with asymmetric matchers, so we can't just assume that the first
|
|
31
29
|
// argument is a hint when it's by itself.
|
|
32
|
-
|
|
33
30
|
return !(0, _utils.isStringNode)(arg);
|
|
34
31
|
};
|
|
35
|
-
|
|
36
32
|
const messages = {
|
|
37
33
|
missingHint: 'You should provide a hint for this snapshot'
|
|
38
34
|
};
|
|
39
|
-
|
|
40
35
|
var _default = (0, _utils.createRule)({
|
|
41
36
|
name: __filename,
|
|
42
37
|
meta: {
|
|
@@ -53,12 +48,10 @@ var _default = (0, _utils.createRule)({
|
|
|
53
48
|
}]
|
|
54
49
|
},
|
|
55
50
|
defaultOptions: ['multi'],
|
|
56
|
-
|
|
57
51
|
create(context, [mode]) {
|
|
58
52
|
const snapshotMatchers = [];
|
|
59
53
|
const depths = [];
|
|
60
54
|
let expressionDepth = 0;
|
|
61
|
-
|
|
62
55
|
const reportSnapshotMatchersWithoutHints = () => {
|
|
63
56
|
for (const snapshotMatcher of snapshotMatchers) {
|
|
64
57
|
if (isSnapshotMatcherWithoutHint(snapshotMatcher)) {
|
|
@@ -69,72 +62,53 @@ var _default = (0, _utils.createRule)({
|
|
|
69
62
|
}
|
|
70
63
|
}
|
|
71
64
|
};
|
|
72
|
-
|
|
73
65
|
const enterExpression = () => {
|
|
74
66
|
expressionDepth++;
|
|
75
67
|
};
|
|
76
|
-
|
|
77
68
|
const exitExpression = () => {
|
|
78
69
|
expressionDepth--;
|
|
79
|
-
|
|
80
70
|
if (mode === 'always') {
|
|
81
71
|
reportSnapshotMatchersWithoutHints();
|
|
82
72
|
snapshotMatchers.length = 0;
|
|
83
73
|
}
|
|
84
|
-
|
|
85
74
|
if (mode === 'multi' && expressionDepth === 0) {
|
|
86
75
|
if (snapshotMatchers.length > 1) {
|
|
87
76
|
reportSnapshotMatchersWithoutHints();
|
|
88
77
|
}
|
|
89
|
-
|
|
90
78
|
snapshotMatchers.length = 0;
|
|
91
79
|
}
|
|
92
80
|
};
|
|
93
|
-
|
|
94
81
|
return {
|
|
95
82
|
'Program:exit'() {
|
|
96
83
|
enterExpression();
|
|
97
84
|
exitExpression();
|
|
98
85
|
},
|
|
99
|
-
|
|
100
86
|
FunctionExpression: enterExpression,
|
|
101
87
|
'FunctionExpression:exit': exitExpression,
|
|
102
88
|
ArrowFunctionExpression: enterExpression,
|
|
103
89
|
'ArrowFunctionExpression:exit': exitExpression,
|
|
104
|
-
|
|
105
90
|
'CallExpression:exit'(node) {
|
|
106
91
|
if ((0, _utils.isTypeOfJestFnCall)(node, context, ['describe', 'test'])) {
|
|
107
|
-
var _depths$pop;
|
|
108
|
-
|
|
109
92
|
/* istanbul ignore next */
|
|
110
|
-
expressionDepth =
|
|
93
|
+
expressionDepth = depths.pop() ?? 0;
|
|
111
94
|
}
|
|
112
95
|
},
|
|
113
|
-
|
|
114
96
|
CallExpression(node) {
|
|
115
97
|
const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
|
|
116
|
-
|
|
117
98
|
if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'expect') {
|
|
118
99
|
if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) === 'describe' || (jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) === 'test') {
|
|
119
100
|
depths.push(expressionDepth);
|
|
120
101
|
expressionDepth = 0;
|
|
121
102
|
}
|
|
122
|
-
|
|
123
103
|
return;
|
|
124
104
|
}
|
|
125
|
-
|
|
126
105
|
const matcherName = (0, _utils.getAccessorValue)(jestFnCall.matcher);
|
|
127
|
-
|
|
128
106
|
if (!snapshotMatcherNames.includes(matcherName)) {
|
|
129
107
|
return;
|
|
130
108
|
}
|
|
131
|
-
|
|
132
109
|
snapshotMatchers.push(jestFnCall);
|
|
133
110
|
}
|
|
134
|
-
|
|
135
111
|
};
|
|
136
112
|
}
|
|
137
|
-
|
|
138
113
|
});
|
|
139
|
-
|
|
140
114
|
exports.default = _default;
|
|
@@ -4,41 +4,30 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _utils = require("@typescript-eslint/utils");
|
|
9
|
-
|
|
10
8
|
var _utils2 = require("./utils");
|
|
11
|
-
|
|
12
9
|
const findNodeObject = node => {
|
|
13
10
|
if ('object' in node) {
|
|
14
11
|
return node.object;
|
|
15
12
|
}
|
|
16
|
-
|
|
17
13
|
if (node.callee.type === _utils.AST_NODE_TYPES.MemberExpression) {
|
|
18
14
|
return node.callee.object;
|
|
19
15
|
}
|
|
20
|
-
|
|
21
16
|
return null;
|
|
22
17
|
};
|
|
23
|
-
|
|
24
18
|
const getJestFnCall = node => {
|
|
25
19
|
if (node.type !== _utils.AST_NODE_TYPES.CallExpression && node.type !== _utils.AST_NODE_TYPES.MemberExpression) {
|
|
26
20
|
return null;
|
|
27
21
|
}
|
|
28
|
-
|
|
29
22
|
const obj = findNodeObject(node);
|
|
30
|
-
|
|
31
23
|
if (!obj) {
|
|
32
24
|
return null;
|
|
33
25
|
}
|
|
34
|
-
|
|
35
26
|
if (obj.type === _utils.AST_NODE_TYPES.Identifier) {
|
|
36
27
|
return node.type === _utils.AST_NODE_TYPES.CallExpression && (0, _utils2.getNodeName)(node.callee) === 'jest.fn' ? node : null;
|
|
37
28
|
}
|
|
38
|
-
|
|
39
29
|
return getJestFnCall(obj);
|
|
40
30
|
};
|
|
41
|
-
|
|
42
31
|
var _default = (0, _utils2.createRule)({
|
|
43
32
|
name: __filename,
|
|
44
33
|
meta: {
|
|
@@ -55,7 +44,6 @@ var _default = (0, _utils2.createRule)({
|
|
|
55
44
|
type: 'suggestion'
|
|
56
45
|
},
|
|
57
46
|
defaultOptions: [],
|
|
58
|
-
|
|
59
47
|
create(context) {
|
|
60
48
|
return {
|
|
61
49
|
AssignmentExpression(node) {
|
|
@@ -69,7 +57,6 @@ var _default = (0, _utils2.createRule)({
|
|
|
69
57
|
context.report({
|
|
70
58
|
node,
|
|
71
59
|
messageId: 'useJestSpyOn',
|
|
72
|
-
|
|
73
60
|
fix(fixer) {
|
|
74
61
|
const leftPropQuote = left.property.type === _utils.AST_NODE_TYPES.Identifier ? "'" : '';
|
|
75
62
|
const [arg] = jestFnCall.arguments;
|
|
@@ -77,13 +64,9 @@ var _default = (0, _utils2.createRule)({
|
|
|
77
64
|
const mockImplementation = argSource ? `.mockImplementation(${argSource})` : '.mockImplementation()';
|
|
78
65
|
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}`)];
|
|
79
66
|
}
|
|
80
|
-
|
|
81
67
|
});
|
|
82
68
|
}
|
|
83
|
-
|
|
84
69
|
};
|
|
85
70
|
}
|
|
86
|
-
|
|
87
71
|
});
|
|
88
|
-
|
|
89
72
|
exports.default = _default;
|
|
@@ -4,17 +4,14 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _utils = require("./utils");
|
|
9
|
-
|
|
10
8
|
var _default = (0, _utils.createRule)({
|
|
11
9
|
name: __filename,
|
|
12
10
|
meta: {
|
|
13
11
|
docs: {
|
|
14
12
|
category: 'Best Practices',
|
|
15
13
|
description: 'Suggest using `toStrictEqual()`',
|
|
16
|
-
recommended: false
|
|
17
|
-
suggestion: true
|
|
14
|
+
recommended: false
|
|
18
15
|
},
|
|
19
16
|
messages: {
|
|
20
17
|
useToStrictEqual: 'Use `toStrictEqual()` instead',
|
|
@@ -25,20 +22,16 @@ var _default = (0, _utils.createRule)({
|
|
|
25
22
|
hasSuggestions: true
|
|
26
23
|
},
|
|
27
24
|
defaultOptions: [],
|
|
28
|
-
|
|
29
25
|
create(context) {
|
|
30
26
|
return {
|
|
31
27
|
CallExpression(node) {
|
|
32
28
|
const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
|
|
33
|
-
|
|
34
29
|
if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'expect') {
|
|
35
30
|
return;
|
|
36
31
|
}
|
|
37
|
-
|
|
38
32
|
const {
|
|
39
33
|
matcher
|
|
40
34
|
} = jestFnCall;
|
|
41
|
-
|
|
42
35
|
if ((0, _utils.isSupportedAccessor)(matcher, 'toEqual')) {
|
|
43
36
|
context.report({
|
|
44
37
|
messageId: 'useToStrictEqual',
|
|
@@ -50,10 +43,7 @@ var _default = (0, _utils.createRule)({
|
|
|
50
43
|
});
|
|
51
44
|
}
|
|
52
45
|
}
|
|
53
|
-
|
|
54
46
|
};
|
|
55
47
|
}
|
|
56
|
-
|
|
57
48
|
});
|
|
58
|
-
|
|
59
49
|
exports.default = _default;
|