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,58 +4,45 @@ 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 isNullLiteral = node => node.type === _utils.AST_NODE_TYPES.Literal && node.value === null;
|
|
10
|
+
|
|
13
11
|
/**
|
|
14
12
|
* Checks if the given `ParsedEqualityMatcherCall` is a call to one of the equality matchers,
|
|
15
13
|
* with a `null` literal as the sole argument.
|
|
16
14
|
*/
|
|
17
|
-
|
|
18
|
-
|
|
19
15
|
const isNullEqualityMatcher = expectFnCall => isNullLiteral((0, _utils2.getFirstMatcherArg)(expectFnCall));
|
|
20
|
-
|
|
21
16
|
const isFirstArgumentIdentifier = (expectFnCall, name) => (0, _utils2.isIdentifier)((0, _utils2.getFirstMatcherArg)(expectFnCall), name);
|
|
22
|
-
|
|
23
17
|
const shouldUseToBe = expectFnCall => {
|
|
24
|
-
|
|
25
|
-
|
|
18
|
+
let firstArg = (0, _utils2.getFirstMatcherArg)(expectFnCall);
|
|
19
|
+
if (firstArg.type === _utils.AST_NODE_TYPES.UnaryExpression && firstArg.operator === '-') {
|
|
20
|
+
firstArg = firstArg.argument;
|
|
21
|
+
}
|
|
26
22
|
if (firstArg.type === _utils.AST_NODE_TYPES.Literal) {
|
|
27
23
|
// regex literals are classed as literals, but they're actually objects
|
|
28
24
|
// which means "toBe" will give different results than other matchers
|
|
29
25
|
return !('regex' in firstArg);
|
|
30
26
|
}
|
|
31
|
-
|
|
32
27
|
return firstArg.type === _utils.AST_NODE_TYPES.TemplateLiteral;
|
|
33
28
|
};
|
|
34
|
-
|
|
35
29
|
const reportPreferToBe = (context, whatToBe, expectFnCall, modifierNode) => {
|
|
36
30
|
context.report({
|
|
37
31
|
messageId: `useToBe${whatToBe}`,
|
|
38
|
-
|
|
39
32
|
fix(fixer) {
|
|
40
33
|
var _expectFnCall$args;
|
|
41
|
-
|
|
42
34
|
const fixes = [(0, _utils2.replaceAccessorFixer)(fixer, expectFnCall.matcher, `toBe${whatToBe}`)];
|
|
43
|
-
|
|
44
35
|
if ((_expectFnCall$args = expectFnCall.args) !== null && _expectFnCall$args !== void 0 && _expectFnCall$args.length && whatToBe !== '') {
|
|
45
36
|
fixes.push(fixer.remove(expectFnCall.args[0]));
|
|
46
37
|
}
|
|
47
|
-
|
|
48
38
|
if (modifierNode) {
|
|
49
39
|
fixes.push(fixer.removeRange([modifierNode.range[0] - 1, modifierNode.range[1]]));
|
|
50
40
|
}
|
|
51
|
-
|
|
52
41
|
return fixes;
|
|
53
42
|
},
|
|
54
|
-
|
|
55
43
|
node: expectFnCall.matcher
|
|
56
44
|
});
|
|
57
45
|
};
|
|
58
|
-
|
|
59
46
|
var _default = (0, _utils2.createRule)({
|
|
60
47
|
name: __filename,
|
|
61
48
|
meta: {
|
|
@@ -76,52 +63,40 @@ var _default = (0, _utils2.createRule)({
|
|
|
76
63
|
schema: []
|
|
77
64
|
},
|
|
78
65
|
defaultOptions: [],
|
|
79
|
-
|
|
80
66
|
create(context) {
|
|
81
67
|
return {
|
|
82
68
|
CallExpression(node) {
|
|
83
69
|
const jestFnCall = (0, _utils2.parseJestFnCall)(node, context);
|
|
84
|
-
|
|
85
70
|
if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'expect') {
|
|
86
71
|
return;
|
|
87
72
|
}
|
|
88
|
-
|
|
89
73
|
const matcherName = (0, _utils2.getAccessorValue)(jestFnCall.matcher);
|
|
90
74
|
const notModifier = jestFnCall.modifiers.find(nod => (0, _utils2.getAccessorValue)(nod) === 'not');
|
|
91
|
-
|
|
92
75
|
if (notModifier && ['toBeUndefined', 'toBeDefined'].includes(matcherName)) {
|
|
93
76
|
reportPreferToBe(context, matcherName === 'toBeDefined' ? 'Undefined' : 'Defined', jestFnCall, notModifier);
|
|
94
77
|
return;
|
|
95
78
|
}
|
|
96
|
-
|
|
97
79
|
if (!_utils2.EqualityMatcher.hasOwnProperty(matcherName) || jestFnCall.args.length === 0) {
|
|
98
80
|
return;
|
|
99
81
|
}
|
|
100
|
-
|
|
101
82
|
if (isNullEqualityMatcher(jestFnCall)) {
|
|
102
83
|
reportPreferToBe(context, 'Null', jestFnCall);
|
|
103
84
|
return;
|
|
104
85
|
}
|
|
105
|
-
|
|
106
86
|
if (isFirstArgumentIdentifier(jestFnCall, 'undefined')) {
|
|
107
87
|
const name = notModifier ? 'Defined' : 'Undefined';
|
|
108
88
|
reportPreferToBe(context, name, jestFnCall, notModifier);
|
|
109
89
|
return;
|
|
110
90
|
}
|
|
111
|
-
|
|
112
91
|
if (isFirstArgumentIdentifier(jestFnCall, 'NaN')) {
|
|
113
92
|
reportPreferToBe(context, 'NaN', jestFnCall);
|
|
114
93
|
return;
|
|
115
94
|
}
|
|
116
|
-
|
|
117
95
|
if (shouldUseToBe(jestFnCall) && matcherName !== _utils2.EqualityMatcher.toBe) {
|
|
118
96
|
reportPreferToBe(context, '', jestFnCall);
|
|
119
97
|
}
|
|
120
98
|
}
|
|
121
|
-
|
|
122
99
|
};
|
|
123
100
|
}
|
|
124
|
-
|
|
125
101
|
});
|
|
126
|
-
|
|
127
102
|
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("@typescript-eslint/utils");
|
|
9
|
-
|
|
10
8
|
var _utils2 = require("./utils");
|
|
11
|
-
|
|
12
9
|
/**
|
|
13
10
|
* Checks if the given `node` is a `CallExpression` representing the calling
|
|
14
11
|
* of an `includes`-like method that can be 'fixed' (using `toContain`).
|
|
@@ -17,9 +14,9 @@ var _utils2 = require("./utils");
|
|
|
17
14
|
*
|
|
18
15
|
* @return {node is FixableIncludesCallExpression}
|
|
19
16
|
*/
|
|
20
|
-
const isFixableIncludesCallExpression = node => node.type === _utils.AST_NODE_TYPES.CallExpression && node.callee.type === _utils.AST_NODE_TYPES.MemberExpression && (0, _utils2.isSupportedAccessor)(node.callee.property, 'includes') && (0, _utils2.hasOnlyOneArgument)(node) && node.arguments[0].type !== _utils.AST_NODE_TYPES.SpreadElement;
|
|
21
|
-
|
|
17
|
+
const isFixableIncludesCallExpression = node => node.type === _utils.AST_NODE_TYPES.CallExpression && node.callee.type === _utils.AST_NODE_TYPES.MemberExpression && (0, _utils2.isSupportedAccessor)(node.callee.property, 'includes') && (0, _utils2.hasOnlyOneArgument)(node) && node.arguments[0].type !== _utils.AST_NODE_TYPES.SpreadElement;
|
|
22
18
|
|
|
19
|
+
// expect(array.includes(<value>)[not.]{toBe,toEqual}(<boolean>)
|
|
23
20
|
var _default = (0, _utils2.createRule)({
|
|
24
21
|
name: __filename,
|
|
25
22
|
meta: {
|
|
@@ -36,24 +33,19 @@ var _default = (0, _utils2.createRule)({
|
|
|
36
33
|
schema: []
|
|
37
34
|
},
|
|
38
35
|
defaultOptions: [],
|
|
39
|
-
|
|
40
36
|
create(context) {
|
|
41
37
|
return {
|
|
42
38
|
CallExpression(node) {
|
|
43
39
|
const jestFnCall = (0, _utils2.parseJestFnCall)(node, context);
|
|
44
|
-
|
|
45
40
|
if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'expect' || jestFnCall.args.length === 0) {
|
|
46
41
|
return;
|
|
47
42
|
}
|
|
48
|
-
|
|
49
43
|
const {
|
|
50
44
|
parent: expect
|
|
51
45
|
} = jestFnCall.head.node;
|
|
52
|
-
|
|
53
46
|
if ((expect === null || expect === void 0 ? void 0 : expect.type) !== _utils.AST_NODE_TYPES.CallExpression) {
|
|
54
47
|
return;
|
|
55
48
|
}
|
|
56
|
-
|
|
57
49
|
const {
|
|
58
50
|
arguments: [includesCall],
|
|
59
51
|
range: [, expectCallEnd]
|
|
@@ -62,32 +54,30 @@ var _default = (0, _utils2.createRule)({
|
|
|
62
54
|
matcher
|
|
63
55
|
} = jestFnCall;
|
|
64
56
|
const matcherArg = (0, _utils2.getFirstMatcherArg)(jestFnCall);
|
|
65
|
-
|
|
66
57
|
if (!includesCall || matcherArg.type === _utils.AST_NODE_TYPES.SpreadElement || !_utils2.EqualityMatcher.hasOwnProperty((0, _utils2.getAccessorValue)(matcher)) || !(0, _utils2.isBooleanLiteral)(matcherArg) || !isFixableIncludesCallExpression(includesCall)) {
|
|
67
58
|
return;
|
|
68
59
|
}
|
|
69
|
-
|
|
70
60
|
const hasNot = jestFnCall.modifiers.some(nod => (0, _utils2.getAccessorValue)(nod) === 'not');
|
|
71
61
|
context.report({
|
|
72
62
|
fix(fixer) {
|
|
73
|
-
const sourceCode = context.getSourceCode();
|
|
74
|
-
// value is itself negated by the "not" modifier
|
|
63
|
+
const sourceCode = context.getSourceCode();
|
|
75
64
|
|
|
65
|
+
// we need to negate the expectation if the current expected
|
|
66
|
+
// value is itself negated by the "not" modifier
|
|
76
67
|
const addNotModifier = matcherArg.value === hasNot;
|
|
77
|
-
return [
|
|
78
|
-
|
|
79
|
-
fixer.
|
|
68
|
+
return [
|
|
69
|
+
// remove the "includes" call entirely
|
|
70
|
+
fixer.removeRange([includesCall.callee.property.range[0] - 1, includesCall.range[1]]),
|
|
71
|
+
// replace the current matcher with "toContain", adding "not" if needed
|
|
72
|
+
fixer.replaceTextRange([expectCallEnd, matcher.parent.range[1]], addNotModifier ? `.${_utils2.ModifierName.not}.toContain` : '.toContain'),
|
|
73
|
+
// replace the matcher argument with the value from the "includes"
|
|
80
74
|
fixer.replaceText(jestFnCall.args[0], sourceCode.getText(includesCall.arguments[0]))];
|
|
81
75
|
},
|
|
82
|
-
|
|
83
76
|
messageId: 'useToContain',
|
|
84
77
|
node: matcher
|
|
85
78
|
});
|
|
86
79
|
}
|
|
87
|
-
|
|
88
80
|
};
|
|
89
81
|
}
|
|
90
|
-
|
|
91
82
|
});
|
|
92
|
-
|
|
93
83
|
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("@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: {
|
|
@@ -25,48 +22,39 @@ var _default = (0, _utils2.createRule)({
|
|
|
25
22
|
schema: []
|
|
26
23
|
},
|
|
27
24
|
defaultOptions: [],
|
|
28
|
-
|
|
29
25
|
create(context) {
|
|
30
26
|
return {
|
|
31
27
|
CallExpression(node) {
|
|
32
28
|
const jestFnCall = (0, _utils2.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
|
parent: expect
|
|
40
34
|
} = jestFnCall.head.node;
|
|
41
|
-
|
|
42
35
|
if ((expect === null || expect === void 0 ? void 0 : expect.type) !== _utils.AST_NODE_TYPES.CallExpression) {
|
|
43
36
|
return;
|
|
44
37
|
}
|
|
45
|
-
|
|
46
38
|
const [argument] = expect.arguments;
|
|
47
39
|
const {
|
|
48
40
|
matcher
|
|
49
41
|
} = jestFnCall;
|
|
50
|
-
|
|
51
42
|
if (!_utils2.EqualityMatcher.hasOwnProperty((0, _utils2.getAccessorValue)(matcher)) || (argument === null || argument === void 0 ? void 0 : argument.type) !== _utils.AST_NODE_TYPES.MemberExpression || !(0, _utils2.isSupportedAccessor)(argument.property, 'length')) {
|
|
52
43
|
return;
|
|
53
44
|
}
|
|
54
|
-
|
|
55
45
|
context.report({
|
|
56
46
|
fix(fixer) {
|
|
57
|
-
return [
|
|
58
|
-
|
|
47
|
+
return [
|
|
48
|
+
// remove the "length" property accessor
|
|
49
|
+
fixer.removeRange([argument.property.range[0] - 1, argument.range[1]]),
|
|
50
|
+
// replace the current matcher with "toHaveLength"
|
|
59
51
|
fixer.replaceTextRange([matcher.parent.object.range[1], matcher.parent.range[1]], '.toHaveLength')];
|
|
60
52
|
},
|
|
61
|
-
|
|
62
53
|
messageId: 'useToHaveLength',
|
|
63
54
|
node: matcher
|
|
64
55
|
});
|
|
65
56
|
}
|
|
66
|
-
|
|
67
57
|
};
|
|
68
58
|
}
|
|
69
|
-
|
|
70
59
|
});
|
|
71
|
-
|
|
72
60
|
exports.default = _default;
|
package/lib/rules/prefer-todo.js
CHANGED
|
@@ -4,40 +4,31 @@ 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
|
function isEmptyFunction(node) {
|
|
13
10
|
if (!(0, _utils2.isFunction)(node)) {
|
|
14
11
|
return false;
|
|
15
12
|
}
|
|
16
|
-
|
|
17
13
|
return node.body.type === _utils.AST_NODE_TYPES.BlockStatement && !node.body.body.length;
|
|
18
14
|
}
|
|
19
|
-
|
|
20
15
|
function createTodoFixer(jestFnCall, fixer) {
|
|
21
16
|
if (jestFnCall.members.length) {
|
|
22
17
|
return (0, _utils2.replaceAccessorFixer)(fixer, jestFnCall.members[0], 'todo');
|
|
23
18
|
}
|
|
24
|
-
|
|
25
19
|
return fixer.replaceText(jestFnCall.head.node, `${jestFnCall.head.local}.todo`);
|
|
26
20
|
}
|
|
27
|
-
|
|
28
21
|
const isTargetedTestCase = jestFnCall => {
|
|
29
22
|
if (jestFnCall.members.some(s => (0, _utils2.getAccessorValue)(s) !== 'skip')) {
|
|
30
23
|
return false;
|
|
31
|
-
}
|
|
32
|
-
|
|
24
|
+
}
|
|
33
25
|
|
|
26
|
+
// todo: we should support this too (needs custom fixer)
|
|
34
27
|
if (jestFnCall.name.startsWith('x')) {
|
|
35
28
|
return false;
|
|
36
29
|
}
|
|
37
|
-
|
|
38
30
|
return !jestFnCall.name.startsWith('f');
|
|
39
31
|
};
|
|
40
|
-
|
|
41
32
|
var _default = (0, _utils2.createRule)({
|
|
42
33
|
name: __filename,
|
|
43
34
|
meta: {
|
|
@@ -55,17 +46,14 @@ var _default = (0, _utils2.createRule)({
|
|
|
55
46
|
type: 'layout'
|
|
56
47
|
},
|
|
57
48
|
defaultOptions: [],
|
|
58
|
-
|
|
59
49
|
create(context) {
|
|
60
50
|
return {
|
|
61
51
|
CallExpression(node) {
|
|
62
52
|
const [title, callback] = node.arguments;
|
|
63
53
|
const jestFnCall = (0, _utils2.parseJestFnCall)(node, context);
|
|
64
|
-
|
|
65
54
|
if (!title || (jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'test' || !isTargetedTestCase(jestFnCall) || !(0, _utils2.isStringNode)(title)) {
|
|
66
55
|
return;
|
|
67
56
|
}
|
|
68
|
-
|
|
69
57
|
if (callback && isEmptyFunction(callback)) {
|
|
70
58
|
context.report({
|
|
71
59
|
messageId: 'emptyTest',
|
|
@@ -73,7 +61,6 @@ var _default = (0, _utils2.createRule)({
|
|
|
73
61
|
fix: fixer => [fixer.removeRange([title.range[1], callback.range[1]]), createTodoFixer(jestFnCall, fixer)]
|
|
74
62
|
});
|
|
75
63
|
}
|
|
76
|
-
|
|
77
64
|
if ((0, _utils2.hasOnlyOneArgument)(node)) {
|
|
78
65
|
context.report({
|
|
79
66
|
messageId: 'unimplementedTest',
|
|
@@ -82,10 +69,7 @@ var _default = (0, _utils2.createRule)({
|
|
|
82
69
|
});
|
|
83
70
|
}
|
|
84
71
|
}
|
|
85
|
-
|
|
86
72
|
};
|
|
87
73
|
}
|
|
88
|
-
|
|
89
74
|
});
|
|
90
|
-
|
|
91
75
|
exports.default = _default;
|
|
@@ -4,49 +4,37 @@ 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 isJestFnCall = (node, context) => {
|
|
13
10
|
var _getNodeName;
|
|
14
|
-
|
|
15
11
|
if ((0, _utils2.parseJestFnCall)(node, context)) {
|
|
16
12
|
return true;
|
|
17
13
|
}
|
|
18
|
-
|
|
19
14
|
return !!((_getNodeName = (0, _utils2.getNodeName)(node)) !== null && _getNodeName !== void 0 && _getNodeName.startsWith('jest.'));
|
|
20
15
|
};
|
|
21
|
-
|
|
22
16
|
const isNullOrUndefined = node => {
|
|
23
17
|
return node.type === _utils.AST_NODE_TYPES.Literal && node.value === null || (0, _utils2.isIdentifier)(node, 'undefined');
|
|
24
18
|
};
|
|
25
|
-
|
|
26
19
|
const shouldBeInHook = (node, context, allowedFunctionCalls = []) => {
|
|
27
20
|
switch (node.type) {
|
|
28
21
|
case _utils.AST_NODE_TYPES.ExpressionStatement:
|
|
29
22
|
return shouldBeInHook(node.expression, context, allowedFunctionCalls);
|
|
30
|
-
|
|
31
23
|
case _utils.AST_NODE_TYPES.CallExpression:
|
|
32
24
|
return !(isJestFnCall(node, context) || allowedFunctionCalls.includes((0, _utils2.getNodeName)(node)));
|
|
33
|
-
|
|
34
25
|
case _utils.AST_NODE_TYPES.VariableDeclaration:
|
|
35
26
|
{
|
|
36
27
|
if (node.kind === 'const') {
|
|
37
28
|
return false;
|
|
38
29
|
}
|
|
39
|
-
|
|
40
30
|
return node.declarations.some(({
|
|
41
31
|
init
|
|
42
32
|
}) => init !== null && !isNullOrUndefined(init));
|
|
43
33
|
}
|
|
44
|
-
|
|
45
34
|
default:
|
|
46
35
|
return false;
|
|
47
36
|
}
|
|
48
37
|
};
|
|
49
|
-
|
|
50
38
|
var _default = (0, _utils2.createRule)({
|
|
51
39
|
name: __filename,
|
|
52
40
|
meta: {
|
|
@@ -75,14 +63,10 @@ var _default = (0, _utils2.createRule)({
|
|
|
75
63
|
defaultOptions: [{
|
|
76
64
|
allowedFunctionCalls: []
|
|
77
65
|
}],
|
|
78
|
-
|
|
79
66
|
create(context) {
|
|
80
|
-
var _context$options$;
|
|
81
|
-
|
|
82
67
|
const {
|
|
83
68
|
allowedFunctionCalls
|
|
84
|
-
} =
|
|
85
|
-
|
|
69
|
+
} = context.options[0] ?? {};
|
|
86
70
|
const checkBlockBody = body => {
|
|
87
71
|
for (const statement of body) {
|
|
88
72
|
if (shouldBeInHook(statement, context, allowedFunctionCalls)) {
|
|
@@ -93,29 +77,21 @@ var _default = (0, _utils2.createRule)({
|
|
|
93
77
|
}
|
|
94
78
|
}
|
|
95
79
|
};
|
|
96
|
-
|
|
97
80
|
return {
|
|
98
81
|
Program(program) {
|
|
99
82
|
checkBlockBody(program.body);
|
|
100
83
|
},
|
|
101
|
-
|
|
102
84
|
CallExpression(node) {
|
|
103
85
|
if (!(0, _utils2.isTypeOfJestFnCall)(node, context, ['describe']) || node.arguments.length < 2) {
|
|
104
86
|
return;
|
|
105
87
|
}
|
|
106
|
-
|
|
107
88
|
const [, testFn] = node.arguments;
|
|
108
|
-
|
|
109
89
|
if (!(0, _utils2.isFunction)(testFn) || testFn.body.type !== _utils.AST_NODE_TYPES.BlockStatement) {
|
|
110
90
|
return;
|
|
111
91
|
}
|
|
112
|
-
|
|
113
92
|
checkBlockBody(testFn.body.body);
|
|
114
93
|
}
|
|
115
|
-
|
|
116
94
|
};
|
|
117
95
|
}
|
|
118
|
-
|
|
119
96
|
});
|
|
120
|
-
|
|
121
97
|
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,21 +20,17 @@ var _default = (0, _utils.createRule)({
|
|
|
22
20
|
schema: []
|
|
23
21
|
},
|
|
24
22
|
defaultOptions: [],
|
|
25
|
-
|
|
26
23
|
create(context) {
|
|
27
24
|
return {
|
|
28
25
|
CallExpression(node) {
|
|
29
26
|
const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
|
|
30
|
-
|
|
31
27
|
if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'expect') {
|
|
32
28
|
return;
|
|
33
29
|
}
|
|
34
|
-
|
|
35
30
|
const {
|
|
36
31
|
matcher
|
|
37
32
|
} = jestFnCall;
|
|
38
33
|
const matcherName = (0, _utils.getAccessorValue)(matcher);
|
|
39
|
-
|
|
40
34
|
if (jestFnCall.args.length === 0 && ['toThrow', 'toThrowError'].includes(matcherName) && !jestFnCall.modifiers.some(nod => (0, _utils.getAccessorValue)(nod) === 'not')) {
|
|
41
35
|
// Look for `toThrow` calls with no arguments.
|
|
42
36
|
context.report({
|
|
@@ -48,10 +42,7 @@ var _default = (0, _utils.createRule)({
|
|
|
48
42
|
});
|
|
49
43
|
}
|
|
50
44
|
}
|
|
51
|
-
|
|
52
45
|
};
|
|
53
46
|
}
|
|
54
|
-
|
|
55
47
|
});
|
|
56
|
-
|
|
57
48
|
exports.default = _default;
|
|
@@ -4,15 +4,12 @@ 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 messages = {
|
|
11
9
|
tooManyDescribes: 'There should not be more than {{ max }} describe{{ s }} at the top level',
|
|
12
10
|
unexpectedTestCase: 'All test cases must be wrapped in a describe block.',
|
|
13
11
|
unexpectedHook: 'All hooks must be wrapped in a describe block.'
|
|
14
12
|
};
|
|
15
|
-
|
|
16
13
|
var _default = (0, _utils.createRule)({
|
|
17
14
|
name: __filename,
|
|
18
15
|
meta: {
|
|
@@ -35,29 +32,22 @@ var _default = (0, _utils.createRule)({
|
|
|
35
32
|
}]
|
|
36
33
|
},
|
|
37
34
|
defaultOptions: [{}],
|
|
38
|
-
|
|
39
35
|
create(context) {
|
|
40
|
-
var _context$options$;
|
|
41
|
-
|
|
42
36
|
const {
|
|
43
37
|
maxNumberOfTopLevelDescribes = Infinity
|
|
44
|
-
} =
|
|
38
|
+
} = context.options[0] ?? {};
|
|
45
39
|
let numberOfTopLevelDescribeBlocks = 0;
|
|
46
40
|
let numberOfDescribeBlocks = 0;
|
|
47
41
|
return {
|
|
48
42
|
CallExpression(node) {
|
|
49
43
|
const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
|
|
50
|
-
|
|
51
44
|
if (!jestFnCall) {
|
|
52
45
|
return;
|
|
53
46
|
}
|
|
54
|
-
|
|
55
47
|
if (jestFnCall.type === 'describe') {
|
|
56
48
|
numberOfDescribeBlocks++;
|
|
57
|
-
|
|
58
49
|
if (numberOfDescribeBlocks === 1) {
|
|
59
50
|
numberOfTopLevelDescribeBlocks++;
|
|
60
|
-
|
|
61
51
|
if (numberOfTopLevelDescribeBlocks > maxNumberOfTopLevelDescribes) {
|
|
62
52
|
context.report({
|
|
63
53
|
node,
|
|
@@ -69,10 +59,8 @@ var _default = (0, _utils.createRule)({
|
|
|
69
59
|
});
|
|
70
60
|
}
|
|
71
61
|
}
|
|
72
|
-
|
|
73
62
|
return;
|
|
74
63
|
}
|
|
75
|
-
|
|
76
64
|
if (numberOfDescribeBlocks === 0) {
|
|
77
65
|
if (jestFnCall.type === 'test') {
|
|
78
66
|
context.report({
|
|
@@ -81,7 +69,6 @@ var _default = (0, _utils.createRule)({
|
|
|
81
69
|
});
|
|
82
70
|
return;
|
|
83
71
|
}
|
|
84
|
-
|
|
85
72
|
if (jestFnCall.type === 'hook') {
|
|
86
73
|
context.report({
|
|
87
74
|
node,
|
|
@@ -91,16 +78,12 @@ var _default = (0, _utils.createRule)({
|
|
|
91
78
|
}
|
|
92
79
|
}
|
|
93
80
|
},
|
|
94
|
-
|
|
95
81
|
'CallExpression:exit'(node) {
|
|
96
82
|
if ((0, _utils.isTypeOfJestFnCall)(node, context, ['describe'])) {
|
|
97
83
|
numberOfDescribeBlocks--;
|
|
98
84
|
}
|
|
99
85
|
}
|
|
100
|
-
|
|
101
86
|
};
|
|
102
87
|
}
|
|
103
|
-
|
|
104
88
|
});
|
|
105
|
-
|
|
106
89
|
exports.default = _default;
|
|
@@ -4,40 +4,23 @@ 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 toThrowMatchers = ['toThrow', 'toThrowError', 'toThrowErrorMatchingSnapshot', 'toThrowErrorMatchingInlineSnapshot'];
|
|
13
|
-
|
|
14
10
|
const baseRule = (() => {
|
|
15
11
|
try {
|
|
16
12
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
17
13
|
const TSESLintPlugin = require('@typescript-eslint/eslint-plugin');
|
|
18
|
-
|
|
19
14
|
return TSESLintPlugin.rules['unbound-method'];
|
|
20
15
|
} catch (e) {
|
|
21
16
|
const error = e;
|
|
22
|
-
|
|
23
17
|
if (error.code === 'MODULE_NOT_FOUND') {
|
|
24
18
|
return null;
|
|
25
19
|
}
|
|
26
|
-
|
|
27
20
|
throw error;
|
|
28
21
|
}
|
|
29
22
|
})();
|
|
30
|
-
|
|
31
|
-
const tryCreateBaseRule = context => {
|
|
32
|
-
try {
|
|
33
|
-
return baseRule === null || baseRule === void 0 ? void 0 : baseRule.create(context);
|
|
34
|
-
} catch {
|
|
35
|
-
return null;
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
|
|
39
23
|
const DEFAULT_MESSAGE = 'This rule requires `@typescript-eslint/eslint-plugin`';
|
|
40
|
-
|
|
41
24
|
var _default = (0, _utils2.createRule)({
|
|
42
25
|
defaultOptions: [{
|
|
43
26
|
ignoreStatic: false
|
|
@@ -60,39 +43,29 @@ var _default = (0, _utils2.createRule)({
|
|
|
60
43
|
recommended: false
|
|
61
44
|
}
|
|
62
45
|
},
|
|
63
|
-
|
|
64
46
|
create(context) {
|
|
65
|
-
const baseSelectors =
|
|
66
|
-
|
|
47
|
+
const baseSelectors = baseRule === null || baseRule === void 0 ? void 0 : baseRule.create(context);
|
|
67
48
|
if (!baseSelectors) {
|
|
68
49
|
return {};
|
|
69
50
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
51
|
+
return {
|
|
52
|
+
...baseSelectors,
|
|
73
53
|
MemberExpression(node) {
|
|
74
54
|
var _node$parent, _baseSelectors$Member;
|
|
75
|
-
|
|
76
55
|
if (((_node$parent = node.parent) === null || _node$parent === void 0 ? void 0 : _node$parent.type) === _utils.AST_NODE_TYPES.CallExpression) {
|
|
77
56
|
const jestFnCall = (0, _utils2.parseJestFnCall)((0, _utils2.findTopMostCallExpression)(node.parent), context);
|
|
78
|
-
|
|
79
57
|
if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) === 'expect') {
|
|
80
58
|
const {
|
|
81
59
|
matcher
|
|
82
60
|
} = jestFnCall;
|
|
83
|
-
|
|
84
61
|
if (!toThrowMatchers.includes((0, _utils2.getAccessorValue)(matcher))) {
|
|
85
62
|
return;
|
|
86
63
|
}
|
|
87
64
|
}
|
|
88
65
|
}
|
|
89
|
-
|
|
90
66
|
(_baseSelectors$Member = baseSelectors.MemberExpression) === null || _baseSelectors$Member === void 0 ? void 0 : _baseSelectors$Member.call(baseSelectors, node);
|
|
91
67
|
}
|
|
92
|
-
|
|
93
68
|
};
|
|
94
69
|
}
|
|
95
|
-
|
|
96
70
|
});
|
|
97
|
-
|
|
98
71
|
exports.default = _default;
|