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,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,7 +77,6 @@ var _default = (0, _utils2.createRule)({
|
|
|
95
77
|
data: {
|
|
96
78
|
callback: argument.name
|
|
97
79
|
},
|
|
98
|
-
|
|
99
80
|
fix(fixer) {
|
|
100
81
|
const {
|
|
101
82
|
body
|
|
@@ -105,46 +86,35 @@ var _default = (0, _utils2.createRule)({
|
|
|
105
86
|
const lastBodyToken = sourceCode.getLastToken(body);
|
|
106
87
|
const tokenBeforeArgument = sourceCode.getTokenBefore(argument);
|
|
107
88
|
const tokenAfterArgument = sourceCode.getTokenAfter(argument);
|
|
108
|
-
/* istanbul ignore if */
|
|
109
89
|
|
|
90
|
+
/* istanbul ignore if */
|
|
110
91
|
if (!firstBodyToken || !lastBodyToken || !tokenBeforeArgument || !tokenAfterArgument) {
|
|
111
92
|
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`);
|
|
112
93
|
}
|
|
113
|
-
|
|
114
94
|
const argumentInParens = tokenBeforeArgument.value === '(' && tokenAfterArgument.value === ')';
|
|
115
95
|
let argumentFix = fixer.replaceText(argument, '()');
|
|
116
|
-
|
|
117
96
|
if (argumentInParens) {
|
|
118
97
|
argumentFix = fixer.remove(argument);
|
|
119
98
|
}
|
|
120
|
-
|
|
121
99
|
let newCallback = argument.name;
|
|
122
|
-
|
|
123
100
|
if (argumentInParens) {
|
|
124
101
|
newCallback = `(${newCallback})`;
|
|
125
102
|
}
|
|
126
|
-
|
|
127
103
|
let beforeReplacement = `new Promise(${newCallback} => `;
|
|
128
104
|
let afterReplacement = ')';
|
|
129
105
|
let replaceBefore = true;
|
|
130
|
-
|
|
131
106
|
if (body.type === _utils.AST_NODE_TYPES.BlockStatement) {
|
|
132
107
|
const keyword = 'return';
|
|
133
108
|
beforeReplacement = `${keyword} ${beforeReplacement}{`;
|
|
134
109
|
afterReplacement += '}';
|
|
135
110
|
replaceBefore = false;
|
|
136
111
|
}
|
|
137
|
-
|
|
138
112
|
return [argumentFix, replaceBefore ? fixer.insertTextBefore(firstBodyToken, beforeReplacement) : fixer.insertTextAfter(firstBodyToken, beforeReplacement), fixer.insertTextAfter(lastBodyToken, afterReplacement)];
|
|
139
113
|
}
|
|
140
|
-
|
|
141
114
|
}]
|
|
142
115
|
});
|
|
143
116
|
}
|
|
144
|
-
|
|
145
117
|
};
|
|
146
118
|
}
|
|
147
|
-
|
|
148
119
|
});
|
|
149
|
-
|
|
150
120
|
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;
|