eslint-plugin-jest 26.8.7 → 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/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 +20 -47
- 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 +14 -60
- 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 +12 -37
- 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 +14 -47
- 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,20 +4,15 @@ 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 parseJestVersion = rawVersion => {
|
|
13
10
|
if (typeof rawVersion === 'number') {
|
|
14
11
|
return rawVersion;
|
|
15
12
|
}
|
|
16
|
-
|
|
17
13
|
const [majorVersion] = rawVersion.split('.');
|
|
18
14
|
return parseInt(majorVersion, 10);
|
|
19
15
|
};
|
|
20
|
-
|
|
21
16
|
var _default = (0, _utils2.createRule)({
|
|
22
17
|
name: __filename,
|
|
23
18
|
meta: {
|
|
@@ -34,12 +29,11 @@ var _default = (0, _utils2.createRule)({
|
|
|
34
29
|
fixable: 'code'
|
|
35
30
|
},
|
|
36
31
|
defaultOptions: [],
|
|
37
|
-
|
|
38
32
|
create(context) {
|
|
39
33
|
var _context$settings, _context$settings$jes;
|
|
40
|
-
|
|
41
34
|
const jestVersion = parseJestVersion(((_context$settings = context.settings) === null || _context$settings === void 0 ? void 0 : (_context$settings$jes = _context$settings.jest) === null || _context$settings$jes === void 0 ? void 0 : _context$settings$jes.version) || (0, _utils2.detectJestVersion)());
|
|
42
|
-
const deprecations = {
|
|
35
|
+
const deprecations = {
|
|
36
|
+
...(jestVersion >= 15 && {
|
|
43
37
|
'jest.resetModuleRegistry': 'jest.resetModules'
|
|
44
38
|
}),
|
|
45
39
|
...(jestVersion >= 17 && {
|
|
@@ -61,13 +55,10 @@ var _default = (0, _utils2.createRule)({
|
|
|
61
55
|
if (node.callee.type !== _utils.AST_NODE_TYPES.MemberExpression) {
|
|
62
56
|
return;
|
|
63
57
|
}
|
|
64
|
-
|
|
65
58
|
const deprecation = (0, _utils2.getNodeName)(node);
|
|
66
|
-
|
|
67
59
|
if (!deprecation || !(deprecation in deprecations)) {
|
|
68
60
|
return;
|
|
69
61
|
}
|
|
70
|
-
|
|
71
62
|
const replacement = deprecations[deprecation];
|
|
72
63
|
const {
|
|
73
64
|
callee
|
|
@@ -79,23 +70,16 @@ var _default = (0, _utils2.createRule)({
|
|
|
79
70
|
replacement
|
|
80
71
|
},
|
|
81
72
|
node,
|
|
82
|
-
|
|
83
73
|
fix(fixer) {
|
|
84
74
|
let [name, func] = replacement.split('.');
|
|
85
|
-
|
|
86
75
|
if (callee.property.type === _utils.AST_NODE_TYPES.Literal) {
|
|
87
76
|
func = `'${func}'`;
|
|
88
77
|
}
|
|
89
|
-
|
|
90
78
|
return [fixer.replaceText(callee.object, name), fixer.replaceText(callee.property, func)];
|
|
91
79
|
}
|
|
92
|
-
|
|
93
80
|
});
|
|
94
81
|
}
|
|
95
|
-
|
|
96
82
|
};
|
|
97
83
|
}
|
|
98
|
-
|
|
99
84
|
});
|
|
100
|
-
|
|
101
85
|
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: {
|
|
@@ -27,25 +25,20 @@ var _default = (0, _utils.createRule)({
|
|
|
27
25
|
type: 'suggestion'
|
|
28
26
|
},
|
|
29
27
|
defaultOptions: [],
|
|
30
|
-
|
|
31
28
|
create(context) {
|
|
32
29
|
let suiteDepth = 0;
|
|
33
30
|
let testDepth = 0;
|
|
34
31
|
return {
|
|
35
32
|
CallExpression(node) {
|
|
36
33
|
const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
|
|
37
|
-
|
|
38
34
|
if (!jestFnCall) {
|
|
39
35
|
return;
|
|
40
36
|
}
|
|
41
|
-
|
|
42
37
|
if (jestFnCall.type === 'describe') {
|
|
43
38
|
suiteDepth++;
|
|
44
39
|
}
|
|
45
|
-
|
|
46
40
|
if (jestFnCall.type === 'test') {
|
|
47
41
|
testDepth++;
|
|
48
|
-
|
|
49
42
|
if (node.arguments.length < 2 && jestFnCall.members.every(s => (0, _utils.getAccessorValue)(s) !== 'todo')) {
|
|
50
43
|
context.report({
|
|
51
44
|
messageId: 'missingFunction',
|
|
@@ -53,8 +46,8 @@ var _default = (0, _utils.createRule)({
|
|
|
53
46
|
});
|
|
54
47
|
}
|
|
55
48
|
}
|
|
56
|
-
|
|
57
|
-
|
|
49
|
+
if (
|
|
50
|
+
// the only jest functions that are with "x" are "xdescribe", "xtest", and "xit"
|
|
58
51
|
jestFnCall.name.startsWith('x') || jestFnCall.members.some(s => (0, _utils.getAccessorValue)(s) === 'skip')) {
|
|
59
52
|
context.report({
|
|
60
53
|
messageId: jestFnCall.type === 'describe' ? 'disabledSuite' : 'disabledTest',
|
|
@@ -62,28 +55,22 @@ var _default = (0, _utils.createRule)({
|
|
|
62
55
|
});
|
|
63
56
|
}
|
|
64
57
|
},
|
|
65
|
-
|
|
66
58
|
'CallExpression:exit'(node) {
|
|
67
59
|
const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
|
|
68
|
-
|
|
69
60
|
if (!jestFnCall) {
|
|
70
61
|
return;
|
|
71
62
|
}
|
|
72
|
-
|
|
73
63
|
if (jestFnCall.type === 'describe') {
|
|
74
64
|
suiteDepth--;
|
|
75
65
|
}
|
|
76
|
-
|
|
77
66
|
if (jestFnCall.type === 'test') {
|
|
78
67
|
testDepth--;
|
|
79
68
|
}
|
|
80
69
|
},
|
|
81
|
-
|
|
82
70
|
'CallExpression[callee.name="pending"]'(node) {
|
|
83
|
-
if ((0, _utils.
|
|
71
|
+
if ((0, _utils.resolveScope)(context.getScope(), 'pending')) {
|
|
84
72
|
return;
|
|
85
73
|
}
|
|
86
|
-
|
|
87
74
|
if (testDepth > 0) {
|
|
88
75
|
context.report({
|
|
89
76
|
messageId: 'pendingTest',
|
|
@@ -101,10 +88,7 @@ var _default = (0, _utils.createRule)({
|
|
|
101
88
|
});
|
|
102
89
|
}
|
|
103
90
|
}
|
|
104
|
-
|
|
105
91
|
};
|
|
106
92
|
}
|
|
107
|
-
|
|
108
93
|
});
|
|
109
|
-
|
|
110
94
|
exports.default = _default;
|
|
@@ -4,37 +4,28 @@ 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 findCallbackArg = (node, isJestEach, context) => {
|
|
13
10
|
if (isJestEach) {
|
|
14
11
|
return node.arguments[1];
|
|
15
12
|
}
|
|
16
|
-
|
|
17
13
|
const jestFnCall = (0, _utils2.parseJestFnCall)(node, context);
|
|
18
|
-
|
|
19
14
|
if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) === 'hook' && node.arguments.length >= 1) {
|
|
20
15
|
return node.arguments[0];
|
|
21
16
|
}
|
|
22
|
-
|
|
23
17
|
if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) === 'test' && node.arguments.length >= 2) {
|
|
24
18
|
return node.arguments[1];
|
|
25
19
|
}
|
|
26
|
-
|
|
27
20
|
return null;
|
|
28
21
|
};
|
|
29
|
-
|
|
30
22
|
var _default = (0, _utils2.createRule)({
|
|
31
23
|
name: __filename,
|
|
32
24
|
meta: {
|
|
33
25
|
docs: {
|
|
34
26
|
category: 'Best Practices',
|
|
35
|
-
description: '
|
|
36
|
-
recommended: 'error'
|
|
37
|
-
suggestion: true
|
|
27
|
+
description: 'Disallow using a callback in asynchronous tests and hooks',
|
|
28
|
+
recommended: 'error'
|
|
38
29
|
},
|
|
39
30
|
messages: {
|
|
40
31
|
noDoneCallback: 'Return a Promise instead of relying on callback parameter',
|
|
@@ -46,31 +37,24 @@ var _default = (0, _utils2.createRule)({
|
|
|
46
37
|
hasSuggestions: true
|
|
47
38
|
},
|
|
48
39
|
defaultOptions: [],
|
|
49
|
-
|
|
50
40
|
create(context) {
|
|
51
41
|
return {
|
|
52
42
|
CallExpression(node) {
|
|
53
|
-
var _getNodeName
|
|
54
|
-
|
|
43
|
+
var _getNodeName;
|
|
55
44
|
// done is the second argument for it.each, not the first
|
|
56
|
-
const isJestEach = (
|
|
57
|
-
|
|
45
|
+
const isJestEach = ((_getNodeName = (0, _utils2.getNodeName)(node.callee)) === null || _getNodeName === void 0 ? void 0 : _getNodeName.endsWith('.each')) ?? false;
|
|
58
46
|
if (isJestEach && node.callee.type !== _utils.AST_NODE_TYPES.TaggedTemplateExpression) {
|
|
59
47
|
// isJestEach but not a TaggedTemplateExpression, so this must be
|
|
60
48
|
// the `jest.each([])()` syntax which this rule doesn't support due
|
|
61
49
|
// to its complexity (see jest-community/eslint-plugin-jest#710)
|
|
62
50
|
return;
|
|
63
51
|
}
|
|
64
|
-
|
|
65
52
|
const callback = findCallbackArg(node, isJestEach, context);
|
|
66
53
|
const callbackArgIndex = Number(isJestEach);
|
|
67
|
-
|
|
68
54
|
if (!callback || !(0, _utils2.isFunction)(callback) || callback.params.length !== 1 + callbackArgIndex) {
|
|
69
55
|
return;
|
|
70
56
|
}
|
|
71
|
-
|
|
72
57
|
const argument = callback.params[callbackArgIndex];
|
|
73
|
-
|
|
74
58
|
if (argument.type !== _utils.AST_NODE_TYPES.Identifier) {
|
|
75
59
|
context.report({
|
|
76
60
|
node: argument,
|
|
@@ -78,7 +62,6 @@ var _default = (0, _utils2.createRule)({
|
|
|
78
62
|
});
|
|
79
63
|
return;
|
|
80
64
|
}
|
|
81
|
-
|
|
82
65
|
if (callback.async) {
|
|
83
66
|
context.report({
|
|
84
67
|
node: argument,
|
|
@@ -86,7 +69,6 @@ var _default = (0, _utils2.createRule)({
|
|
|
86
69
|
});
|
|
87
70
|
return;
|
|
88
71
|
}
|
|
89
|
-
|
|
90
72
|
context.report({
|
|
91
73
|
node: argument,
|
|
92
74
|
messageId: 'noDoneCallback',
|
|
@@ -95,56 +77,47 @@ var _default = (0, _utils2.createRule)({
|
|
|
95
77
|
data: {
|
|
96
78
|
callback: argument.name
|
|
97
79
|
},
|
|
98
|
-
|
|
99
80
|
fix(fixer) {
|
|
81
|
+
var _tokenAfterLastParam;
|
|
100
82
|
const {
|
|
101
|
-
body
|
|
83
|
+
body,
|
|
84
|
+
params
|
|
102
85
|
} = callback;
|
|
103
86
|
const sourceCode = context.getSourceCode();
|
|
104
87
|
const firstBodyToken = sourceCode.getFirstToken(body);
|
|
105
88
|
const lastBodyToken = sourceCode.getLastToken(body);
|
|
106
|
-
const
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
if (
|
|
111
|
-
|
|
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);
|
|
112
95
|
}
|
|
113
96
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
if (argumentInParens) {
|
|
118
|
-
argumentFix = fixer.remove(argument);
|
|
97
|
+
/* istanbul ignore if */
|
|
98
|
+
if (!firstBodyToken || !lastBodyToken || !tokenBeforeFirstParam || !tokenAfterLastParam) {
|
|
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`);
|
|
119
100
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
if (argumentInParens) {
|
|
124
|
-
newCallback = `(${newCallback})`;
|
|
101
|
+
let argumentFix = fixer.replaceText(firstParam, '()');
|
|
102
|
+
if (tokenBeforeFirstParam.value === '(' && tokenAfterLastParam.value === ')') {
|
|
103
|
+
argumentFix = fixer.removeRange([tokenBeforeFirstParam.range[1], tokenAfterLastParam.range[0]]);
|
|
125
104
|
}
|
|
126
|
-
|
|
105
|
+
const newCallback = argument.name;
|
|
127
106
|
let beforeReplacement = `new Promise(${newCallback} => `;
|
|
128
107
|
let afterReplacement = ')';
|
|
129
108
|
let replaceBefore = true;
|
|
130
|
-
|
|
131
109
|
if (body.type === _utils.AST_NODE_TYPES.BlockStatement) {
|
|
132
110
|
const keyword = 'return';
|
|
133
111
|
beforeReplacement = `${keyword} ${beforeReplacement}{`;
|
|
134
112
|
afterReplacement += '}';
|
|
135
113
|
replaceBefore = false;
|
|
136
114
|
}
|
|
137
|
-
|
|
138
115
|
return [argumentFix, replaceBefore ? fixer.insertTextBefore(firstBodyToken, beforeReplacement) : fixer.insertTextAfter(firstBodyToken, beforeReplacement), fixer.insertTextAfter(lastBodyToken, afterReplacement)];
|
|
139
116
|
}
|
|
140
|
-
|
|
141
117
|
}]
|
|
142
118
|
});
|
|
143
119
|
}
|
|
144
|
-
|
|
145
120
|
};
|
|
146
121
|
}
|
|
147
|
-
|
|
148
122
|
});
|
|
149
|
-
|
|
150
123
|
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,27 +20,21 @@ var _default = (0, _utils.createRule)({
|
|
|
22
20
|
type: 'suggestion'
|
|
23
21
|
},
|
|
24
22
|
defaultOptions: [],
|
|
25
|
-
|
|
26
23
|
create(context) {
|
|
27
24
|
const hookContexts = [{}];
|
|
28
25
|
return {
|
|
29
26
|
CallExpression(node) {
|
|
30
27
|
var _jestFnCall$name;
|
|
31
|
-
|
|
32
28
|
const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
|
|
33
|
-
|
|
34
29
|
if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) === 'describe') {
|
|
35
30
|
hookContexts.push({});
|
|
36
31
|
}
|
|
37
|
-
|
|
38
32
|
if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'hook') {
|
|
39
33
|
return;
|
|
40
34
|
}
|
|
41
|
-
|
|
42
35
|
const currentLayer = hookContexts[hookContexts.length - 1];
|
|
43
36
|
currentLayer[_jestFnCall$name = jestFnCall.name] || (currentLayer[_jestFnCall$name] = 0);
|
|
44
37
|
currentLayer[jestFnCall.name] += 1;
|
|
45
|
-
|
|
46
38
|
if (currentLayer[jestFnCall.name] > 1) {
|
|
47
39
|
context.report({
|
|
48
40
|
messageId: 'noDuplicateHook',
|
|
@@ -53,16 +45,12 @@ var _default = (0, _utils.createRule)({
|
|
|
53
45
|
});
|
|
54
46
|
}
|
|
55
47
|
},
|
|
56
|
-
|
|
57
48
|
'CallExpression:exit'(node) {
|
|
58
49
|
if ((0, _utils.isTypeOfJestFnCall)(node, context, ['describe'])) {
|
|
59
50
|
hookContexts.pop();
|
|
60
51
|
}
|
|
61
52
|
}
|
|
62
|
-
|
|
63
53
|
};
|
|
64
54
|
}
|
|
65
|
-
|
|
66
55
|
});
|
|
67
|
-
|
|
68
56
|
exports.default = _default;
|
package/lib/rules/no-export.js
CHANGED
|
@@ -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: {
|
|
@@ -24,7 +21,6 @@ var _default = (0, _utils2.createRule)({
|
|
|
24
21
|
schema: []
|
|
25
22
|
},
|
|
26
23
|
defaultOptions: [],
|
|
27
|
-
|
|
28
24
|
create(context) {
|
|
29
25
|
const exportNodes = [];
|
|
30
26
|
let hasTestCase = false;
|
|
@@ -39,38 +35,30 @@ var _default = (0, _utils2.createRule)({
|
|
|
39
35
|
}
|
|
40
36
|
}
|
|
41
37
|
},
|
|
42
|
-
|
|
43
38
|
CallExpression(node) {
|
|
44
39
|
if ((0, _utils2.isTypeOfJestFnCall)(node, context, ['test'])) {
|
|
45
40
|
hasTestCase = true;
|
|
46
41
|
}
|
|
47
42
|
},
|
|
48
|
-
|
|
49
43
|
'ExportNamedDeclaration, ExportDefaultDeclaration'(node) {
|
|
50
44
|
exportNodes.push(node);
|
|
51
45
|
},
|
|
52
|
-
|
|
53
46
|
'AssignmentExpression > MemberExpression'(node) {
|
|
54
47
|
let {
|
|
55
48
|
object,
|
|
56
49
|
property
|
|
57
50
|
} = node;
|
|
58
|
-
|
|
59
51
|
if (object.type === _utils.AST_NODE_TYPES.MemberExpression) {
|
|
60
52
|
({
|
|
61
53
|
object,
|
|
62
54
|
property
|
|
63
55
|
} = object);
|
|
64
56
|
}
|
|
65
|
-
|
|
66
57
|
if ('name' in object && object.name === 'module' && property.type === _utils.AST_NODE_TYPES.Identifier && /^exports?$/u.test(property.name)) {
|
|
67
58
|
exportNodes.push(node);
|
|
68
59
|
}
|
|
69
60
|
}
|
|
70
|
-
|
|
71
61
|
};
|
|
72
62
|
}
|
|
73
|
-
|
|
74
63
|
});
|
|
75
|
-
|
|
76
64
|
exports.default = _default;
|
|
@@ -4,19 +4,15 @@ 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: {
|
|
15
12
|
docs: {
|
|
16
13
|
category: 'Best Practices',
|
|
17
14
|
description: 'Disallow focused tests',
|
|
18
|
-
recommended: 'error'
|
|
19
|
-
suggestion: true
|
|
15
|
+
recommended: 'error'
|
|
20
16
|
},
|
|
21
17
|
messages: {
|
|
22
18
|
focusedTest: 'Unexpected focused test.',
|
|
@@ -27,43 +23,34 @@ var _default = (0, _utils2.createRule)({
|
|
|
27
23
|
hasSuggestions: true
|
|
28
24
|
},
|
|
29
25
|
defaultOptions: [],
|
|
30
|
-
|
|
31
26
|
create(context) {
|
|
32
27
|
return {
|
|
33
28
|
CallExpression(node) {
|
|
34
29
|
const jestFnCall = (0, _utils2.parseJestFnCall)(node, context);
|
|
35
|
-
|
|
36
30
|
if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'test' && (jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'describe') {
|
|
37
31
|
return;
|
|
38
32
|
}
|
|
39
|
-
|
|
40
33
|
if (jestFnCall.name.startsWith('f')) {
|
|
41
34
|
context.report({
|
|
42
35
|
messageId: 'focusedTest',
|
|
43
36
|
node,
|
|
44
37
|
suggest: [{
|
|
45
38
|
messageId: 'suggestRemoveFocus',
|
|
46
|
-
|
|
47
39
|
fix(fixer) {
|
|
48
40
|
// don't apply the fixer if we're an aliased import
|
|
49
41
|
if (jestFnCall.head.type === 'import' && jestFnCall.name !== jestFnCall.head.local) {
|
|
50
42
|
return null;
|
|
51
43
|
}
|
|
52
|
-
|
|
53
44
|
return fixer.removeRange([node.range[0], node.range[0] + 1]);
|
|
54
45
|
}
|
|
55
|
-
|
|
56
46
|
}]
|
|
57
47
|
});
|
|
58
48
|
return;
|
|
59
49
|
}
|
|
60
|
-
|
|
61
50
|
const onlyNode = jestFnCall.members.find(s => (0, _utils2.getAccessorValue)(s) === 'only');
|
|
62
|
-
|
|
63
51
|
if (!onlyNode) {
|
|
64
52
|
return;
|
|
65
53
|
}
|
|
66
|
-
|
|
67
54
|
context.report({
|
|
68
55
|
messageId: 'focusedTest',
|
|
69
56
|
node: onlyNode,
|
|
@@ -73,10 +60,7 @@ var _default = (0, _utils2.createRule)({
|
|
|
73
60
|
}]
|
|
74
61
|
});
|
|
75
62
|
}
|
|
76
|
-
|
|
77
63
|
};
|
|
78
64
|
}
|
|
79
|
-
|
|
80
65
|
});
|
|
81
|
-
|
|
82
66
|
exports.default = _default;
|
package/lib/rules/no-hooks.js
CHANGED
|
@@ -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: {
|
|
@@ -33,14 +31,12 @@ var _default = (0, _utils.createRule)({
|
|
|
33
31
|
defaultOptions: [{
|
|
34
32
|
allow: []
|
|
35
33
|
}],
|
|
36
|
-
|
|
37
34
|
create(context, [{
|
|
38
35
|
allow = []
|
|
39
36
|
}]) {
|
|
40
37
|
return {
|
|
41
38
|
CallExpression(node) {
|
|
42
39
|
const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
|
|
43
|
-
|
|
44
40
|
if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) === 'hook' && !allow.includes(jestFnCall.name)) {
|
|
45
41
|
context.report({
|
|
46
42
|
node,
|
|
@@ -51,10 +47,7 @@ var _default = (0, _utils.createRule)({
|
|
|
51
47
|
});
|
|
52
48
|
}
|
|
53
49
|
}
|
|
54
|
-
|
|
55
50
|
};
|
|
56
51
|
}
|
|
57
|
-
|
|
58
52
|
});
|
|
59
|
-
|
|
60
53
|
exports.default = _default;
|
|
@@ -4,14 +4,11 @@ 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 newDescribeContext = () => ({
|
|
11
9
|
describeTitles: [],
|
|
12
10
|
testTitles: []
|
|
13
11
|
});
|
|
14
|
-
|
|
15
12
|
var _default = (0, _utils.createRule)({
|
|
16
13
|
name: __filename,
|
|
17
14
|
meta: {
|
|
@@ -28,34 +25,26 @@ var _default = (0, _utils.createRule)({
|
|
|
28
25
|
type: 'suggestion'
|
|
29
26
|
},
|
|
30
27
|
defaultOptions: [],
|
|
31
|
-
|
|
32
28
|
create(context) {
|
|
33
29
|
const contexts = [newDescribeContext()];
|
|
34
30
|
return {
|
|
35
31
|
CallExpression(node) {
|
|
36
32
|
const currentLayer = contexts[contexts.length - 1];
|
|
37
33
|
const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
|
|
38
|
-
|
|
39
34
|
if (!jestFnCall) {
|
|
40
35
|
return;
|
|
41
36
|
}
|
|
42
|
-
|
|
43
37
|
if (jestFnCall.type === 'describe') {
|
|
44
38
|
contexts.push(newDescribeContext());
|
|
45
39
|
}
|
|
46
|
-
|
|
47
40
|
if (jestFnCall.members.find(s => (0, _utils.isSupportedAccessor)(s, 'each'))) {
|
|
48
41
|
return;
|
|
49
42
|
}
|
|
50
|
-
|
|
51
43
|
const [argument] = node.arguments;
|
|
52
|
-
|
|
53
44
|
if (!argument || !(0, _utils.isStringNode)(argument)) {
|
|
54
45
|
return;
|
|
55
46
|
}
|
|
56
|
-
|
|
57
47
|
const title = (0, _utils.getStringValue)(argument);
|
|
58
|
-
|
|
59
48
|
if (jestFnCall.type === 'test') {
|
|
60
49
|
if (currentLayer.testTitles.includes(title)) {
|
|
61
50
|
context.report({
|
|
@@ -63,33 +52,25 @@ var _default = (0, _utils.createRule)({
|
|
|
63
52
|
node: argument
|
|
64
53
|
});
|
|
65
54
|
}
|
|
66
|
-
|
|
67
55
|
currentLayer.testTitles.push(title);
|
|
68
56
|
}
|
|
69
|
-
|
|
70
57
|
if (jestFnCall.type !== 'describe') {
|
|
71
58
|
return;
|
|
72
59
|
}
|
|
73
|
-
|
|
74
60
|
if (currentLayer.describeTitles.includes(title)) {
|
|
75
61
|
context.report({
|
|
76
62
|
messageId: 'multipleDescribeTitle',
|
|
77
63
|
node: argument
|
|
78
64
|
});
|
|
79
65
|
}
|
|
80
|
-
|
|
81
66
|
currentLayer.describeTitles.push(title);
|
|
82
67
|
},
|
|
83
|
-
|
|
84
68
|
'CallExpression:exit'(node) {
|
|
85
69
|
if ((0, _utils.isTypeOfJestFnCall)(node, context, ['describe'])) {
|
|
86
70
|
contexts.pop();
|
|
87
71
|
}
|
|
88
72
|
}
|
|
89
|
-
|
|
90
73
|
};
|
|
91
74
|
}
|
|
92
|
-
|
|
93
75
|
});
|
|
94
|
-
|
|
95
76
|
exports.default = _default;
|