eslint-plugin-jest 26.1.5 → 26.2.0

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.
@@ -44,6 +44,7 @@ var _default = (0, _utils2.createRule)({
44
44
  }],
45
45
 
46
46
  create(context) {
47
+ const scope = context.getScope();
47
48
  const configObj = context.options[0] || {};
48
49
  const testKeyword = configObj.fn || _utils2.TestCaseName.test;
49
50
  const testKeywordWithinDescribe = configObj.withinDescribe || configObj.fn || _utils2.TestCaseName.it;
@@ -56,13 +57,13 @@ var _default = (0, _utils2.createRule)({
56
57
  return;
57
58
  }
58
59
 
59
- if ((0, _utils2.isDescribeCall)(node)) {
60
+ if ((0, _utils2.isDescribeCall)(node, scope)) {
60
61
  describeNestingLevel++;
61
62
  }
62
63
 
63
64
  const funcNode = node.callee.type === _utils.AST_NODE_TYPES.TaggedTemplateExpression ? node.callee.tag : node.callee.type === _utils.AST_NODE_TYPES.CallExpression ? node.callee.callee : node.callee;
64
65
 
65
- if ((0, _utils2.isTestCaseCall)(node) && describeNestingLevel === 0 && !nodeName.includes(testKeyword)) {
66
+ if ((0, _utils2.isTestCaseCall)(node, scope) && describeNestingLevel === 0 && !nodeName.includes(testKeyword)) {
66
67
  const oppositeTestKeyword = getOppositeTestKeyword(testKeyword);
67
68
  context.report({
68
69
  messageId: 'consistentMethod',
@@ -75,7 +76,7 @@ var _default = (0, _utils2.createRule)({
75
76
  });
76
77
  }
77
78
 
78
- if ((0, _utils2.isTestCaseCall)(node) && describeNestingLevel > 0 && !nodeName.includes(testKeywordWithinDescribe)) {
79
+ if ((0, _utils2.isTestCaseCall)(node, scope) && describeNestingLevel > 0 && !nodeName.includes(testKeywordWithinDescribe)) {
79
80
  const oppositeTestKeyword = getOppositeTestKeyword(testKeywordWithinDescribe);
80
81
  context.report({
81
82
  messageId: 'consistentMethodWithinDescribe',
@@ -90,7 +91,7 @@ var _default = (0, _utils2.createRule)({
90
91
  },
91
92
 
92
93
  'CallExpression:exit'(node) {
93
- if ((0, _utils2.isDescribeCall)(node)) {
94
+ if ((0, _utils2.isDescribeCall)(node, scope)) {
94
95
  describeNestingLevel--;
95
96
  }
96
97
  }
@@ -68,6 +68,7 @@ var _default = (0, _utils2.createRule)({
68
68
  assertFunctionNames = ['expect'],
69
69
  additionalTestBlockFunctions = []
70
70
  }]) {
71
+ const scope = context.getScope();
71
72
  const unchecked = [];
72
73
 
73
74
  function checkCallExpressionUsed(nodes) {
@@ -76,7 +77,7 @@ var _default = (0, _utils2.createRule)({
76
77
 
77
78
  if (node.type === _utils.AST_NODE_TYPES.FunctionDeclaration) {
78
79
  const declaredVariables = context.getDeclaredVariables(node);
79
- const testCallExpressions = (0, _utils2.getTestCallExpressionsFromDeclaredVariables)(declaredVariables);
80
+ const testCallExpressions = (0, _utils2.getTestCallExpressionsFromDeclaredVariables)(declaredVariables, scope);
80
81
  checkCallExpressionUsed(testCallExpressions);
81
82
  }
82
83
 
@@ -93,7 +94,7 @@ var _default = (0, _utils2.createRule)({
93
94
 
94
95
  const name = (_getNodeName = (0, _utils2.getNodeName)(node.callee)) !== null && _getNodeName !== void 0 ? _getNodeName : '';
95
96
 
96
- if ((0, _utils2.isTestCaseCall)(node) || additionalTestBlockFunctions.includes(name)) {
97
+ if ((0, _utils2.isTestCaseCall)(node, scope) || additionalTestBlockFunctions.includes(name)) {
97
98
  if (node.callee.type === _utils.AST_NODE_TYPES.MemberExpression && (0, _utils2.isSupportedAccessor)(node.callee.property, 'todo')) {
98
99
  return;
99
100
  }
@@ -39,6 +39,7 @@ var _default = (0, _utils2.createRule)({
39
39
  create(context, [{
40
40
  max
41
41
  }]) {
42
+ const scope = context.getScope();
42
43
  const describeCallbackStack = [];
43
44
 
44
45
  function pushDescribeCallback(node) {
@@ -46,7 +47,7 @@ var _default = (0, _utils2.createRule)({
46
47
  parent
47
48
  } = node;
48
49
 
49
- if ((parent === null || parent === void 0 ? void 0 : parent.type) !== _utils.AST_NODE_TYPES.CallExpression || !(0, _utils2.isDescribeCall)(parent)) {
50
+ if ((parent === null || parent === void 0 ? void 0 : parent.type) !== _utils.AST_NODE_TYPES.CallExpression || !(0, _utils2.isDescribeCall)(parent, scope)) {
50
51
  return;
51
52
  }
52
53
 
@@ -69,7 +70,7 @@ var _default = (0, _utils2.createRule)({
69
70
  parent
70
71
  } = node;
71
72
 
72
- if ((parent === null || parent === void 0 ? void 0 : parent.type) === _utils.AST_NODE_TYPES.CallExpression && (0, _utils2.isDescribeCall)(parent)) {
73
+ if ((parent === null || parent === void 0 ? void 0 : parent.type) === _utils.AST_NODE_TYPES.CallExpression && (0, _utils2.isDescribeCall)(parent, scope)) {
73
74
  describeCallbackStack.pop();
74
75
  }
75
76
  }
@@ -28,6 +28,7 @@ var _default = (0, _utils2.createRule)({
28
28
  defaultOptions: [],
29
29
 
30
30
  create(context) {
31
+ const scope = context.getScope();
31
32
  let conditionalDepth = 0;
32
33
  let inTestCase = false;
33
34
  let inPromiseCatch = false;
@@ -39,7 +40,7 @@ var _default = (0, _utils2.createRule)({
39
40
  return {
40
41
  FunctionDeclaration(node) {
41
42
  const declaredVariables = context.getDeclaredVariables(node);
42
- const testCallExpressions = (0, _utils2.getTestCallExpressionsFromDeclaredVariables)(declaredVariables);
43
+ const testCallExpressions = (0, _utils2.getTestCallExpressionsFromDeclaredVariables)(declaredVariables, scope);
43
44
 
44
45
  if (testCallExpressions.length > 0) {
45
46
  inTestCase = true;
@@ -47,7 +48,7 @@ var _default = (0, _utils2.createRule)({
47
48
  },
48
49
 
49
50
  CallExpression(node) {
50
- if ((0, _utils2.isTestCaseCall)(node)) {
51
+ if ((0, _utils2.isTestCaseCall)(node, scope)) {
51
52
  inTestCase = true;
52
53
  }
53
54
 
@@ -71,7 +72,7 @@ var _default = (0, _utils2.createRule)({
71
72
  },
72
73
 
73
74
  'CallExpression:exit'(node) {
74
- if ((0, _utils2.isTestCaseCall)(node)) {
75
+ if ((0, _utils2.isTestCaseCall)(node, scope)) {
75
76
  inTestCase = false;
76
77
  }
77
78
 
@@ -24,6 +24,7 @@ var _default = (0, _utils.createRule)({
24
24
  defaultOptions: [],
25
25
 
26
26
  create(context) {
27
+ const scope = context.getScope();
27
28
  let inTestCase = false;
28
29
 
29
30
  const maybeReportConditional = node => {
@@ -37,13 +38,13 @@ var _default = (0, _utils.createRule)({
37
38
 
38
39
  return {
39
40
  CallExpression(node) {
40
- if ((0, _utils.isTestCaseCall)(node)) {
41
+ if ((0, _utils.isTestCaseCall)(node, scope)) {
41
42
  inTestCase = true;
42
43
  }
43
44
  },
44
45
 
45
46
  'CallExpression:exit'(node) {
46
- if ((0, _utils.isTestCaseCall)(node)) {
47
+ if ((0, _utils.isTestCaseCall)(node, scope)) {
47
48
  inTestCase = false;
48
49
  }
49
50
  },
@@ -9,16 +9,16 @@ var _utils = require("@typescript-eslint/utils");
9
9
 
10
10
  var _utils2 = require("./utils");
11
11
 
12
- const findCallbackArg = (node, isJestEach) => {
12
+ const findCallbackArg = (node, isJestEach, scope) => {
13
13
  if (isJestEach) {
14
14
  return node.arguments[1];
15
15
  }
16
16
 
17
- if ((0, _utils2.isHook)(node) && node.arguments.length >= 1) {
17
+ if ((0, _utils2.isHookCall)(node, scope) && node.arguments.length >= 1) {
18
18
  return node.arguments[0];
19
19
  }
20
20
 
21
- if ((0, _utils2.isTestCaseCall)(node) && node.arguments.length >= 2) {
21
+ if ((0, _utils2.isTestCaseCall)(node, scope) && node.arguments.length >= 2) {
22
22
  return node.arguments[1];
23
23
  }
24
24
 
@@ -46,6 +46,7 @@ var _default = (0, _utils2.createRule)({
46
46
  defaultOptions: [],
47
47
 
48
48
  create(context) {
49
+ const scope = context.getScope();
49
50
  return {
50
51
  CallExpression(node) {
51
52
  var _getNodeName$endsWith, _getNodeName;
@@ -60,7 +61,7 @@ var _default = (0, _utils2.createRule)({
60
61
  return;
61
62
  }
62
63
 
63
- const callback = findCallbackArg(node, isJestEach);
64
+ const callback = findCallbackArg(node, isJestEach, scope);
64
65
  const callbackArgIndex = Number(isJestEach);
65
66
 
66
67
  if (!callback || !(0, _utils2.isFunction)(callback) || callback.params.length !== 1 + callbackArgIndex) {
@@ -31,14 +31,15 @@ var _default = (0, _utils.createRule)({
31
31
  defaultOptions: [],
32
32
 
33
33
  create(context) {
34
+ const scope = context.getScope();
34
35
  const hookContexts = [newHookContext()];
35
36
  return {
36
37
  CallExpression(node) {
37
- if ((0, _utils.isDescribeCall)(node)) {
38
+ if ((0, _utils.isDescribeCall)(node, scope)) {
38
39
  hookContexts.push(newHookContext());
39
40
  }
40
41
 
41
- if ((0, _utils.isHook)(node)) {
42
+ if ((0, _utils.isHookCall)(node, scope)) {
42
43
  const currentLayer = hookContexts[hookContexts.length - 1];
43
44
  currentLayer[node.callee.name] += 1;
44
45
 
@@ -55,7 +56,7 @@ var _default = (0, _utils.createRule)({
55
56
  },
56
57
 
57
58
  'CallExpression:exit'(node) {
58
- if ((0, _utils.isDescribeCall)(node)) {
59
+ if ((0, _utils.isDescribeCall)(node, scope)) {
59
60
  hookContexts.pop();
60
61
  }
61
62
  }
@@ -26,6 +26,7 @@ var _default = (0, _utils2.createRule)({
26
26
  defaultOptions: [],
27
27
 
28
28
  create(context) {
29
+ const scope = context.getScope();
29
30
  const exportNodes = [];
30
31
  let hasTestCase = false;
31
32
  return {
@@ -41,7 +42,7 @@ var _default = (0, _utils2.createRule)({
41
42
  },
42
43
 
43
44
  CallExpression(node) {
44
- if ((0, _utils2.isTestCaseCall)(node)) {
45
+ if ((0, _utils2.isTestCaseCall)(node, scope)) {
45
46
  hasTestCase = true;
46
47
  }
47
48
  },
@@ -45,41 +45,46 @@ var _default = (0, _utils2.createRule)({
45
45
  hasSuggestions: true
46
46
  },
47
47
  defaultOptions: [],
48
- create: context => ({
49
- CallExpression(node) {
50
- if (!(0, _utils2.isDescribeCall)(node) && !(0, _utils2.isTestCaseCall)(node)) {
51
- return;
52
- }
53
48
 
54
- if ((0, _utils2.getNodeName)(node).startsWith('f')) {
49
+ create(context) {
50
+ const scope = context.getScope();
51
+ return {
52
+ CallExpression(node) {
53
+ if (!(0, _utils2.isDescribeCall)(node, scope) && !(0, _utils2.isTestCaseCall)(node, scope)) {
54
+ return;
55
+ }
56
+
57
+ if ((0, _utils2.getNodeName)(node).startsWith('f')) {
58
+ context.report({
59
+ messageId: 'focusedTest',
60
+ node,
61
+ suggest: [{
62
+ messageId: 'suggestRemoveFocus',
63
+ fix: fixer => fixer.removeRange([node.range[0], node.range[0] + 1])
64
+ }]
65
+ });
66
+ return;
67
+ }
68
+
69
+ const onlyNode = findOnlyNode(node);
70
+
71
+ if (!onlyNode) {
72
+ return;
73
+ }
74
+
55
75
  context.report({
56
76
  messageId: 'focusedTest',
57
- node,
77
+ node: onlyNode,
58
78
  suggest: [{
59
79
  messageId: 'suggestRemoveFocus',
60
- fix: fixer => fixer.removeRange([node.range[0], node.range[0] + 1])
80
+ fix: fixer => fixer.removeRange([onlyNode.range[0] - 1, onlyNode.range[1] + Number(onlyNode.type !== _utils.AST_NODE_TYPES.Identifier)])
61
81
  }]
62
82
  });
63
- return;
64
83
  }
65
84
 
66
- const onlyNode = findOnlyNode(node);
67
-
68
- if (!onlyNode) {
69
- return;
70
- }
71
-
72
- context.report({
73
- messageId: 'focusedTest',
74
- node: onlyNode,
75
- suggest: [{
76
- messageId: 'suggestRemoveFocus',
77
- fix: fixer => fixer.removeRange([onlyNode.range[0] - 1, onlyNode.range[1] + Number(onlyNode.type !== _utils.AST_NODE_TYPES.Identifier)])
78
- }]
79
- });
80
- }
85
+ };
86
+ }
81
87
 
82
- })
83
88
  });
84
89
 
85
90
  exports.default = _default;
@@ -37,9 +37,10 @@ var _default = (0, _utils.createRule)({
37
37
  create(context, [{
38
38
  allow = []
39
39
  }]) {
40
+ const scope = context.getScope();
40
41
  return {
41
42
  CallExpression(node) {
42
- if ((0, _utils.isHook)(node) && !allow.includes(node.callee.name)) {
43
+ if ((0, _utils.isHookCall)(node, scope) && !allow.includes(node.callee.name)) {
43
44
  context.report({
44
45
  node,
45
46
  messageId: 'unexpectedHook',
@@ -30,6 +30,7 @@ var _default = (0, _utils.createRule)({
30
30
  defaultOptions: [],
31
31
 
32
32
  create(context) {
33
+ const scope = context.getScope();
33
34
  const contexts = [newDescribeContext()];
34
35
  return {
35
36
  CallExpression(node) {
@@ -37,7 +38,7 @@ var _default = (0, _utils.createRule)({
37
38
 
38
39
  const currentLayer = contexts[contexts.length - 1];
39
40
 
40
- if ((0, _utils.isDescribeCall)(node)) {
41
+ if ((0, _utils.isDescribeCall)(node, scope)) {
41
42
  contexts.push(newDescribeContext());
42
43
  }
43
44
 
@@ -53,7 +54,7 @@ var _default = (0, _utils.createRule)({
53
54
 
54
55
  const title = (0, _utils.getStringValue)(argument);
55
56
 
56
- if ((0, _utils.isTestCaseCall)(node)) {
57
+ if ((0, _utils.isTestCaseCall)(node, scope)) {
57
58
  if (currentLayer.testTitles.includes(title)) {
58
59
  context.report({
59
60
  messageId: 'multipleTestTitle',
@@ -64,7 +65,7 @@ var _default = (0, _utils.createRule)({
64
65
  currentLayer.testTitles.push(title);
65
66
  }
66
67
 
67
- if (!(0, _utils.isDescribeCall)(node)) {
68
+ if (!(0, _utils.isDescribeCall)(node, scope)) {
68
69
  return;
69
70
  }
70
71
 
@@ -79,7 +80,7 @@ var _default = (0, _utils.createRule)({
79
80
  },
80
81
 
81
82
  'CallExpression:exit'(node) {
82
- if ((0, _utils.isDescribeCall)(node)) {
83
+ if ((0, _utils.isDescribeCall)(node, scope)) {
83
84
  contexts.pop();
84
85
  }
85
86
  }
@@ -38,6 +38,7 @@ var _default = (0, _utils2.createRule)({
38
38
  defaultOptions: [],
39
39
 
40
40
  create(context) {
41
+ const scope = context.getScope();
41
42
  const stack = [];
42
43
 
43
44
  function validate(node) {
@@ -58,7 +59,7 @@ var _default = (0, _utils2.createRule)({
58
59
 
59
60
  return {
60
61
  CallExpression(node) {
61
- if ((0, _utils2.isTestCaseCall)(node)) {
62
+ if ((0, _utils2.isTestCaseCall)(node, scope)) {
62
63
  stack.push(true);
63
64
 
64
65
  if ((0, _utils2.getNodeName)(node).endsWith('each')) {
@@ -73,7 +74,7 @@ var _default = (0, _utils2.createRule)({
73
74
 
74
75
  FunctionDeclaration(node) {
75
76
  const declaredVariables = context.getDeclaredVariables(node);
76
- const testCallExpressions = (0, _utils2.getTestCallExpressionsFromDeclaredVariables)(declaredVariables);
77
+ const testCallExpressions = (0, _utils2.getTestCallExpressionsFromDeclaredVariables)(declaredVariables, scope);
77
78
  stack.push(testCallExpressions.length > 0);
78
79
  },
79
80
 
@@ -9,7 +9,7 @@ var _utils = require("@typescript-eslint/utils");
9
9
 
10
10
  var _utils2 = require("./utils");
11
11
 
12
- const getBlockType = statement => {
12
+ const getBlockType = (statement, scope) => {
13
13
  const func = statement.parent;
14
14
  /* istanbul ignore if */
15
15
 
@@ -30,7 +30,7 @@ const getBlockType = statement => {
30
30
  } // if it's not a variable, it will be callExpr, we only care about describe
31
31
 
32
32
 
33
- if (expr.type === _utils.AST_NODE_TYPES.CallExpression && (0, _utils2.isDescribeCall)(expr)) {
33
+ if (expr.type === _utils.AST_NODE_TYPES.CallExpression && (0, _utils2.isDescribeCall)(expr, scope)) {
34
34
  return 'describe';
35
35
  }
36
36
  }
@@ -69,11 +69,12 @@ var _default = (0, _utils2.createRule)({
69
69
  create(context, [{
70
70
  additionalTestBlockFunctions = []
71
71
  }]) {
72
+ const scope = context.getScope();
72
73
  const callStack = [];
73
74
 
74
75
  const isCustomTestBlockFunction = node => additionalTestBlockFunctions.includes((0, _utils2.getNodeName)(node) || '');
75
76
 
76
- const isTestBlock = node => (0, _utils2.isTestCaseCall)(node) || isCustomTestBlockFunction(node);
77
+ const isTestBlock = node => (0, _utils2.isTestCaseCall)(node, scope) || isCustomTestBlockFunction(node);
77
78
 
78
79
  return {
79
80
  CallExpression(node) {
@@ -108,7 +109,7 @@ var _default = (0, _utils2.createRule)({
108
109
  },
109
110
 
110
111
  BlockStatement(statement) {
111
- const blockType = getBlockType(statement);
112
+ const blockType = getBlockType(statement, scope);
112
113
 
113
114
  if (blockType) {
114
115
  callStack.push(blockType);
@@ -116,7 +117,7 @@ var _default = (0, _utils2.createRule)({
116
117
  },
117
118
 
118
119
  'BlockStatement:exit'(statement) {
119
- if (callStack[callStack.length - 1] === getBlockType(statement)) {
120
+ if (callStack[callStack.length - 1] === getBlockType(statement, scope)) {
120
121
  callStack.pop();
121
122
  }
122
123
  },
@@ -27,10 +27,11 @@ var _default = (0, _utils2.createRule)({
27
27
  defaultOptions: [],
28
28
 
29
29
  create(context) {
30
+ const scope = context.getScope();
30
31
  return {
31
32
  CallExpression(node) {
32
33
  const nodeName = (0, _utils2.getNodeName)(node.callee);
33
- if (!nodeName || !(0, _utils2.isDescribeCall)(node) && !(0, _utils2.isTestCaseCall)(node)) return;
34
+ if (!nodeName || !(0, _utils2.isDescribeCall)(node, scope) && !(0, _utils2.isTestCaseCall)(node, scope)) return;
34
35
  const preferredNodeName = getPreferredNodeName(nodeName);
35
36
  if (!preferredNodeName) return;
36
37
  const funcNode = node.callee.type === _utils.AST_NODE_TYPES.TaggedTemplateExpression ? node.callee.tag : node.callee.type === _utils.AST_NODE_TYPES.CallExpression ? node.callee.callee : node.callee;
@@ -36,9 +36,10 @@ var _default = (0, _utils2.createRule)({
36
36
  defaultOptions: [],
37
37
 
38
38
  create(context) {
39
+ const scope = context.getScope();
39
40
  return {
40
41
  CallExpression(node) {
41
- if (!(0, _utils2.isTestCaseCall)(node)) return;
42
+ if (!(0, _utils2.isTestCaseCall)(node, scope)) return;
42
43
  const body = getBody(node.arguments);
43
44
  const returnStmt = body.find(t => t.type === _utils.AST_NODE_TYPES.ReturnStatement);
44
45
  if (!returnStmt) return;
@@ -50,7 +51,7 @@ var _default = (0, _utils2.createRule)({
50
51
 
51
52
  FunctionDeclaration(node) {
52
53
  const declaredVariables = context.getDeclaredVariables(node);
53
- const testCallExpressions = (0, _utils2.getTestCallExpressionsFromDeclaredVariables)(declaredVariables);
54
+ const testCallExpressions = (0, _utils2.getTestCallExpressionsFromDeclaredVariables)(declaredVariables, scope);
54
55
  if (testCallExpressions.length === 0) return;
55
56
  const returnStmt = node.body.body.find(t => t.type === _utils.AST_NODE_TYPES.ReturnStatement);
56
57
  if (!returnStmt) return;
@@ -63,6 +63,7 @@ var _default = (0, _utils2.createRule)({
63
63
  }],
64
64
 
65
65
  create(context, [options]) {
66
+ const scope = context.getScope();
66
67
  let expressionDepth = 0;
67
68
  let hasExpectInCallback = false;
68
69
  let hasExpectInLoop = false;
@@ -116,7 +117,7 @@ var _default = (0, _utils2.createRule)({
116
117
  'ForOfStatement:exit': exitForLoop,
117
118
 
118
119
  CallExpression(node) {
119
- if ((0, _utils2.isTestCaseCall)(node)) {
120
+ if ((0, _utils2.isTestCaseCall)(node, scope)) {
120
121
  inTestCaseCall = true;
121
122
  return;
122
123
  }
@@ -133,7 +134,7 @@ var _default = (0, _utils2.createRule)({
133
134
  },
134
135
 
135
136
  'CallExpression:exit'(node) {
136
- if (!(0, _utils2.isTestCaseCall)(node)) {
137
+ if (!(0, _utils2.isTestCaseCall)(node, scope)) {
137
138
  return;
138
139
  }
139
140
 
@@ -24,14 +24,15 @@ var _default = (0, _utils.createRule)({
24
24
  defaultOptions: [],
25
25
 
26
26
  create(context) {
27
+ const scope = context.getScope();
27
28
  const hooksContext = [false];
28
29
  return {
29
30
  CallExpression(node) {
30
- if (!(0, _utils.isHook)(node) && (0, _utils.isTestCaseCall)(node)) {
31
+ if (!(0, _utils.isHookCall)(node, scope) && (0, _utils.isTestCaseCall)(node, scope)) {
31
32
  hooksContext[hooksContext.length - 1] = true;
32
33
  }
33
34
 
34
- if (hooksContext[hooksContext.length - 1] && (0, _utils.isHook)(node)) {
35
+ if (hooksContext[hooksContext.length - 1] && (0, _utils.isHookCall)(node, scope)) {
35
36
  context.report({
36
37
  messageId: 'noHookOnTop',
37
38
  node
@@ -9,8 +9,8 @@ var _utils = require("./utils");
9
9
 
10
10
  const hasStringAsFirstArgument = node => node.arguments[0] && (0, _utils.isStringNode)(node.arguments[0]);
11
11
 
12
- const findNodeNameAndArgument = node => {
13
- if (!((0, _utils.isTestCaseCall)(node) || (0, _utils.isDescribeCall)(node))) {
12
+ const findNodeNameAndArgument = (node, scope) => {
13
+ if (!((0, _utils.isTestCaseCall)(node, scope) || (0, _utils.isDescribeCall)(node, scope))) {
14
14
  return null;
15
15
  }
16
16
 
@@ -88,11 +88,12 @@ var _default = (0, _utils.createRule)({
88
88
  allowedPrefixes = [],
89
89
  ignoreTopLevelDescribe
90
90
  }]) {
91
+ const scope = context.getScope();
91
92
  const ignores = populateIgnores(ignore);
92
93
  let numberOfDescribeBlocks = 0;
93
94
  return {
94
95
  CallExpression(node) {
95
- if ((0, _utils.isDescribeCall)(node)) {
96
+ if ((0, _utils.isDescribeCall)(node, scope)) {
96
97
  numberOfDescribeBlocks++;
97
98
 
98
99
  if (ignoreTopLevelDescribe && numberOfDescribeBlocks === 1) {
@@ -100,7 +101,7 @@ var _default = (0, _utils.createRule)({
100
101
  }
101
102
  }
102
103
 
103
- const results = findNodeNameAndArgument(node);
104
+ const results = findNodeNameAndArgument(node, scope);
104
105
 
105
106
  if (!results) {
106
107
  return;
@@ -137,7 +138,7 @@ var _default = (0, _utils.createRule)({
137
138
  },
138
139
 
139
140
  'CallExpression:exit'(node) {
140
- if ((0, _utils.isDescribeCall)(node)) {
141
+ if ((0, _utils.isDescribeCall)(node, scope)) {
141
142
  numberOfDescribeBlocks--;
142
143
  }
143
144
  }
@@ -58,6 +58,7 @@ var _default = (0, _utils.createRule)({
58
58
  defaultOptions: ['multi'],
59
59
 
60
60
  create(context, [mode]) {
61
+ const scope = context.getScope();
61
62
  const snapshotMatchers = [];
62
63
  const depths = [];
63
64
  let expressionDepth = 0;
@@ -106,7 +107,7 @@ var _default = (0, _utils.createRule)({
106
107
  'ArrowFunctionExpression:exit': exitExpression,
107
108
 
108
109
  'CallExpression:exit'(node) {
109
- if ((0, _utils.isDescribeCall)(node) || (0, _utils.isTestCaseCall)(node)) {
110
+ if ((0, _utils.isDescribeCall)(node, scope) || (0, _utils.isTestCaseCall)(node, scope)) {
110
111
  var _depths$pop;
111
112
 
112
113
  /* istanbul ignore next */
@@ -115,7 +116,7 @@ var _default = (0, _utils.createRule)({
115
116
  },
116
117
 
117
118
  CallExpression(node) {
118
- if ((0, _utils.isDescribeCall)(node) || (0, _utils.isTestCaseCall)(node)) {
119
+ if ((0, _utils.isDescribeCall)(node, scope) || (0, _utils.isTestCaseCall)(node, scope)) {
119
120
  depths.push(expressionDepth);
120
121
  expressionDepth = 0;
121
122
  }
@@ -22,7 +22,7 @@ function createTodoFixer(node, fixer) {
22
22
  return fixer.replaceText(node.callee, `${testName}.todo`);
23
23
  }
24
24
 
25
- const isTargetedTestCase = node => (0, _utils2.isTestCaseCall)(node) && [_utils2.TestCaseName.it, _utils2.TestCaseName.test, 'it.skip', 'test.skip'].includes((0, _utils2.getNodeName)(node));
25
+ const isTargetedTestCase = (node, scope) => (0, _utils2.isTestCaseCall)(node, scope) && [_utils2.TestCaseName.it, _utils2.TestCaseName.test, 'it.skip', 'test.skip'].includes((0, _utils2.getNodeName)(node));
26
26
 
27
27
  var _default = (0, _utils2.createRule)({
28
28
  name: __filename,
@@ -43,11 +43,12 @@ var _default = (0, _utils2.createRule)({
43
43
  defaultOptions: [],
44
44
 
45
45
  create(context) {
46
+ const scope = context.getScope();
46
47
  return {
47
48
  CallExpression(node) {
48
49
  const [title, callback] = node.arguments;
49
50
 
50
- if (!title || !isTargetedTestCase(node) || !(0, _utils2.isStringNode)(title)) {
51
+ if (!title || !isTargetedTestCase(node, scope) || !(0, _utils2.isStringNode)(title)) {
51
52
  return;
52
53
  }
53
54
 
@@ -9,10 +9,10 @@ var _utils = require("@typescript-eslint/utils");
9
9
 
10
10
  var _utils2 = require("./utils");
11
11
 
12
- const isJestFnCall = node => {
12
+ const isJestFnCall = (node, scope) => {
13
13
  var _getNodeName;
14
14
 
15
- if ((0, _utils2.isDescribeCall)(node) || (0, _utils2.isTestCaseCall)(node) || (0, _utils2.isHook)(node)) {
15
+ if ((0, _utils2.isDescribeCall)(node, scope) || (0, _utils2.isTestCaseCall)(node, scope) || (0, _utils2.isHookCall)(node, scope)) {
16
16
  return true;
17
17
  }
18
18
 
@@ -23,13 +23,13 @@ const isNullOrUndefined = node => {
23
23
  return node.type === _utils.AST_NODE_TYPES.Literal && node.value === null || (0, _utils2.isIdentifier)(node, 'undefined');
24
24
  };
25
25
 
26
- const shouldBeInHook = (node, allowedFunctionCalls = []) => {
26
+ const shouldBeInHook = (node, scope, allowedFunctionCalls = []) => {
27
27
  switch (node.type) {
28
28
  case _utils.AST_NODE_TYPES.ExpressionStatement:
29
- return shouldBeInHook(node.expression, allowedFunctionCalls);
29
+ return shouldBeInHook(node.expression, scope, allowedFunctionCalls);
30
30
 
31
31
  case _utils.AST_NODE_TYPES.CallExpression:
32
- return !(isJestFnCall(node) || allowedFunctionCalls.includes((0, _utils2.getNodeName)(node)));
32
+ return !(isJestFnCall(node, scope) || allowedFunctionCalls.includes((0, _utils2.getNodeName)(node)));
33
33
 
34
34
  case _utils.AST_NODE_TYPES.VariableDeclaration:
35
35
  {
@@ -79,13 +79,14 @@ var _default = (0, _utils2.createRule)({
79
79
  create(context) {
80
80
  var _context$options$;
81
81
 
82
+ const scope = context.getScope();
82
83
  const {
83
84
  allowedFunctionCalls
84
85
  } = (_context$options$ = context.options[0]) !== null && _context$options$ !== void 0 ? _context$options$ : {};
85
86
 
86
87
  const checkBlockBody = body => {
87
88
  for (const statement of body) {
88
- if (shouldBeInHook(statement, allowedFunctionCalls)) {
89
+ if (shouldBeInHook(statement, scope, allowedFunctionCalls)) {
89
90
  context.report({
90
91
  node: statement,
91
92
  messageId: 'useHook'
@@ -100,7 +101,7 @@ var _default = (0, _utils2.createRule)({
100
101
  },
101
102
 
102
103
  CallExpression(node) {
103
- if (!(0, _utils2.isDescribeCall)(node) || node.arguments.length < 2) {
104
+ if (!(0, _utils2.isDescribeCall)(node, scope) || node.arguments.length < 2) {
104
105
  return;
105
106
  }
106
107
 
@@ -42,11 +42,12 @@ var _default = (0, _utils.createRule)({
42
42
  const {
43
43
  maxNumberOfTopLevelDescribes = Infinity
44
44
  } = (_context$options$ = context.options[0]) !== null && _context$options$ !== void 0 ? _context$options$ : {};
45
+ const scope = context.getScope();
45
46
  let numberOfTopLevelDescribeBlocks = 0;
46
47
  let numberOfDescribeBlocks = 0;
47
48
  return {
48
49
  CallExpression(node) {
49
- if ((0, _utils.isDescribeCall)(node)) {
50
+ if ((0, _utils.isDescribeCall)(node, scope)) {
50
51
  numberOfDescribeBlocks++;
51
52
 
52
53
  if (numberOfDescribeBlocks === 1) {
@@ -68,7 +69,7 @@ var _default = (0, _utils.createRule)({
68
69
  }
69
70
 
70
71
  if (numberOfDescribeBlocks === 0) {
71
- if ((0, _utils.isTestCaseCall)(node)) {
72
+ if ((0, _utils.isTestCaseCall)(node, scope)) {
72
73
  context.report({
73
74
  node,
74
75
  messageId: 'unexpectedTestCase'
@@ -76,7 +77,7 @@ var _default = (0, _utils.createRule)({
76
77
  return;
77
78
  }
78
79
 
79
- if ((0, _utils.isHook)(node)) {
80
+ if ((0, _utils.isHookCall)(node, scope)) {
80
81
  context.report({
81
82
  node,
82
83
  messageId: 'unexpectedHook'
@@ -87,7 +88,7 @@ var _default = (0, _utils.createRule)({
87
88
  },
88
89
 
89
90
  'CallExpression:exit'(node) {
90
- if ((0, _utils.isDescribeCall)(node)) {
91
+ if ((0, _utils.isDescribeCall)(node, scope)) {
91
92
  numberOfDescribeBlocks--;
92
93
  }
93
94
  }
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.getAccessorValue = exports.followTypeAssertionChain = exports.createRule = exports.TestCaseProperty = exports.TestCaseName = exports.ModifierName = exports.HookName = exports.EqualityMatcher = exports.DescribeProperty = exports.DescribeAlias = void 0;
7
7
  exports.getNodeName = getNodeName;
8
- exports.scopeHasLocalReference = exports.parseExpectCall = exports.isTestCaseCall = exports.isSupportedAccessor = exports.isStringNode = exports.isParsedEqualityMatcherCall = exports.isIdentifier = exports.isHook = exports.isFunction = exports.isExpectMember = exports.isExpectCall = exports.isDescribeCall = exports.hasOnlyOneArgument = exports.getTestCallExpressionsFromDeclaredVariables = exports.getStringValue = void 0;
8
+ exports.scopeHasLocalReference = exports.parseExpectCall = exports.isTestCaseCall = exports.isSupportedAccessor = exports.isStringNode = exports.isParsedEqualityMatcherCall = exports.isIdentifier = exports.isHookCall = exports.isFunction = exports.isExpectMember = exports.isExpectCall = exports.isDescribeCall = exports.hasOnlyOneArgument = exports.getTestCallExpressionsFromDeclaredVariables = exports.getStringValue = void 0;
9
9
 
10
10
  var _path = require("path");
11
11
 
@@ -384,108 +384,220 @@ const isFunction = node => node.type === _utils.AST_NODE_TYPES.FunctionExpressio
384
384
 
385
385
  exports.isFunction = isFunction;
386
386
 
387
- const isHook = node => node.callee.type === _utils.AST_NODE_TYPES.Identifier && HookName.hasOwnProperty(node.callee.name);
387
+ const isHookCall = (node, scope) => {
388
+ let name = findFirstCallPropertyName(node, []);
388
389
 
389
- exports.isHook = isHook;
390
+ if (!name) {
391
+ return false;
392
+ }
393
+
394
+ name = resolveToJestFn(scope, name);
395
+ return name !== null && HookName.hasOwnProperty(name);
396
+ };
390
397
 
391
- const getTestCallExpressionsFromDeclaredVariables = declaredVariables => {
398
+ exports.isHookCall = isHookCall;
399
+
400
+ const getTestCallExpressionsFromDeclaredVariables = (declaredVariables, scope) => {
392
401
  return declaredVariables.reduce((acc, {
393
402
  references
394
403
  }) => acc.concat(references.map(({
395
404
  identifier
396
- }) => identifier.parent).filter(node => !!node && node.type === _utils.AST_NODE_TYPES.CallExpression && isTestCaseCall(node))), []);
405
+ }) => identifier.parent).filter(node => !!node && node.type === _utils.AST_NODE_TYPES.CallExpression && isTestCaseCall(node, scope))), []);
397
406
  };
398
-
399
- exports.getTestCallExpressionsFromDeclaredVariables = getTestCallExpressionsFromDeclaredVariables;
400
-
401
- const isTestCaseName = node => node.type === _utils.AST_NODE_TYPES.Identifier && TestCaseName.hasOwnProperty(node.name);
402
-
403
- const isTestCaseProperty = node => isSupportedAccessor(node) && TestCaseProperty.hasOwnProperty(getAccessorValue(node));
404
407
  /**
405
408
  * Checks if the given `node` is a *call* to a test case function that would
406
409
  * result in tests being run by `jest`.
407
410
  *
408
411
  * Note that `.each()` does not count as a call in this context, as it will not
409
412
  * result in `jest` running any tests.
410
- *
411
- * @param {TSESTree.CallExpression} node
412
- *
413
- * @return {node is JestFunctionCallExpression<TestCaseName>}
414
413
  */
415
414
 
416
415
 
417
- const isTestCaseCall = node => {
418
- if (isTestCaseName(node.callee)) {
419
- return true;
416
+ exports.getTestCallExpressionsFromDeclaredVariables = getTestCallExpressionsFromDeclaredVariables;
417
+
418
+ const isTestCaseCall = (node, scope) => {
419
+ let name = findFirstCallPropertyName(node, Object.keys(TestCaseProperty));
420
+
421
+ if (!name) {
422
+ return false;
423
+ }
424
+
425
+ name = resolveToJestFn(scope, name);
426
+ return name !== null && TestCaseName.hasOwnProperty(name);
427
+ };
428
+
429
+ exports.isTestCaseCall = isTestCaseCall;
430
+
431
+ const findFirstCallPropertyName = (node, properties) => {
432
+ if (isIdentifier(node.callee)) {
433
+ return node.callee.name;
420
434
  }
421
435
 
422
436
  const callee = node.callee.type === _utils.AST_NODE_TYPES.TaggedTemplateExpression ? node.callee.tag : node.callee.type === _utils.AST_NODE_TYPES.CallExpression ? node.callee.callee : node.callee;
423
437
 
424
- if (callee.type === _utils.AST_NODE_TYPES.MemberExpression && isTestCaseProperty(callee.property)) {
438
+ if (callee.type === _utils.AST_NODE_TYPES.MemberExpression && isSupportedAccessor(callee.property) && properties.includes(getAccessorValue(callee.property))) {
425
439
  // if we're an `each()`, ensure we're the outer CallExpression (i.e `.each()()`)
426
440
  if (getAccessorValue(callee.property) === 'each' && node.callee.type !== _utils.AST_NODE_TYPES.TaggedTemplateExpression && node.callee.type !== _utils.AST_NODE_TYPES.CallExpression) {
427
- return false;
441
+ return null;
428
442
  }
429
443
 
430
- return callee.object.type === _utils.AST_NODE_TYPES.MemberExpression ? isTestCaseName(callee.object.object) : isTestCaseName(callee.object);
444
+ const nod = callee.object.type === _utils.AST_NODE_TYPES.MemberExpression ? callee.object.object : callee.object;
445
+
446
+ if (isSupportedAccessor(nod)) {
447
+ return getAccessorValue(nod);
448
+ }
431
449
  }
432
450
 
433
- return false;
451
+ return null;
434
452
  };
435
-
436
- exports.isTestCaseCall = isTestCaseCall;
437
-
438
- const isDescribeAlias = node => node.type === _utils.AST_NODE_TYPES.Identifier && DescribeAlias.hasOwnProperty(node.name);
439
-
440
- const isDescribeProperty = node => isSupportedAccessor(node) && DescribeProperty.hasOwnProperty(getAccessorValue(node));
441
453
  /**
442
454
  * Checks if the given `node` is a *call* to a `describe` function that would
443
455
  * result in a `describe` block being created by `jest`.
444
456
  *
445
457
  * Note that `.each()` does not count as a call in this context, as it will not
446
458
  * result in `jest` creating any `describe` blocks.
447
- *
448
- * @param {TSESTree.CallExpression} node
449
- *
450
- * @return {node is JestFunctionCallExpression<TestCaseName>}
451
459
  */
452
460
 
453
461
 
454
- const isDescribeCall = node => {
455
- if (isDescribeAlias(node.callee)) {
456
- return true;
462
+ const isDescribeCall = (node, scope) => {
463
+ let name = findFirstCallPropertyName(node, Object.keys(DescribeProperty));
464
+
465
+ if (!name) {
466
+ return false;
457
467
  }
458
468
 
459
- const callee = node.callee.type === _utils.AST_NODE_TYPES.TaggedTemplateExpression ? node.callee.tag : node.callee.type === _utils.AST_NODE_TYPES.CallExpression ? node.callee.callee : node.callee;
469
+ name = resolveToJestFn(scope, name);
470
+ return name !== null && DescribeAlias.hasOwnProperty(name);
471
+ };
460
472
 
461
- if (callee.type === _utils.AST_NODE_TYPES.MemberExpression && isDescribeProperty(callee.property)) {
462
- // if we're an `each()`, ensure we're the outer CallExpression (i.e `.each()()`)
463
- if (getAccessorValue(callee.property) === 'each' && node.callee.type !== _utils.AST_NODE_TYPES.TaggedTemplateExpression && node.callee.type !== _utils.AST_NODE_TYPES.CallExpression) {
464
- return false;
473
+ exports.isDescribeCall = isDescribeCall;
474
+
475
+ const describeImportDefAsImport = def => {
476
+ if (def.parent.type === _utils.AST_NODE_TYPES.TSImportEqualsDeclaration) {
477
+ return null;
478
+ }
479
+
480
+ if (def.node.type !== _utils.AST_NODE_TYPES.ImportSpecifier) {
481
+ return null;
482
+ } // we only care about value imports
483
+
484
+
485
+ if (def.parent.importKind === 'type') {
486
+ return null;
487
+ }
488
+
489
+ return {
490
+ source: def.parent.source.value,
491
+ imported: def.node.imported.name,
492
+ local: def.node.local.name
493
+ };
494
+ };
495
+ /**
496
+ * Attempts to find the node that represents the import source for the
497
+ * given expression node, if it looks like it's an import.
498
+ *
499
+ * If no such node can be found (e.g. because the expression doesn't look
500
+ * like an import), then `null` is returned instead.
501
+ */
502
+
503
+
504
+ const findImportSourceNode = node => {
505
+ if (node.type === _utils.AST_NODE_TYPES.AwaitExpression) {
506
+ if (node.argument.type === _utils.AST_NODE_TYPES.ImportExpression) {
507
+ return node.argument.source;
465
508
  }
466
509
 
467
- return callee.object.type === _utils.AST_NODE_TYPES.MemberExpression ? isDescribeAlias(callee.object.object) : isDescribeAlias(callee.object);
510
+ return null;
511
+ }
512
+
513
+ if (node.type === _utils.AST_NODE_TYPES.CallExpression && isIdentifier(node.callee, 'require')) {
514
+ var _node$arguments$;
515
+
516
+ return (_node$arguments$ = node.arguments[0]) !== null && _node$arguments$ !== void 0 ? _node$arguments$ : null;
468
517
  }
469
518
 
470
- return false;
519
+ return null;
471
520
  };
472
521
 
473
- exports.isDescribeCall = isDescribeCall;
522
+ const describeVariableDefAsImport = def => {
523
+ var _def$name$parent;
524
+
525
+ // make sure that we've actually being assigned a value
526
+ if (!def.node.init) {
527
+ return null;
528
+ }
529
+
530
+ const sourceNode = findImportSourceNode(def.node.init);
531
+
532
+ if (!sourceNode || !isStringNode(sourceNode)) {
533
+ return null;
534
+ }
535
+
536
+ if (((_def$name$parent = def.name.parent) === null || _def$name$parent === void 0 ? void 0 : _def$name$parent.type) !== _utils.AST_NODE_TYPES.Property) {
537
+ return null;
538
+ }
539
+
540
+ if (!isSupportedAccessor(def.name.parent.key)) {
541
+ return null;
542
+ }
543
+
544
+ return {
545
+ source: getStringValue(sourceNode),
546
+ imported: getAccessorValue(def.name.parent.key),
547
+ local: def.name.name
548
+ };
549
+ };
550
+ /**
551
+ * Attempts to describe a definition as an import if possible.
552
+ *
553
+ * If the definition is an import binding, it's described as you'd expect.
554
+ * If the definition is a variable, then we try and determine if it's either
555
+ * a dynamic `import()` or otherwise a call to `require()`.
556
+ *
557
+ * If it's neither of these, `null` is returned to indicate that the definition
558
+ * is not describable as an import of any kind.
559
+ */
560
+
561
+
562
+ const describePossibleImportDef = def => {
563
+ if (def.type === 'Variable') {
564
+ return describeVariableDefAsImport(def);
565
+ }
566
+
567
+ if (def.type === 'ImportBinding') {
568
+ return describeImportDefAsImport(def);
569
+ }
570
+
571
+ return null;
572
+ };
474
573
 
475
574
  const collectReferences = scope => {
476
575
  const locals = new Set();
576
+ const imports = new Map();
477
577
  const unresolved = new Set();
478
578
  let currentScope = scope;
479
579
 
480
580
  while (currentScope !== null) {
481
581
  for (const ref of currentScope.variables) {
482
- const isReferenceDefined = ref.defs.some(def => {
483
- return def.type !== 'ImplicitGlobalVariable';
484
- });
582
+ if (ref.defs.length === 0) {
583
+ continue;
584
+ }
585
+ /* istanbul ignore if */
485
586
 
486
- if (isReferenceDefined) {
487
- locals.add(ref.name);
587
+
588
+ if (ref.defs.length > 1) {
589
+ throw new Error(`Reference unexpected had more than one definition - please file a github issue at https://github.com/jest-community/eslint-plugin-jest`);
488
590
  }
591
+
592
+ const [def] = ref.defs;
593
+ const importDetails = describePossibleImportDef(def);
594
+
595
+ if (importDetails) {
596
+ imports.set(importDetails.local, importDetails);
597
+ continue;
598
+ }
599
+
600
+ locals.add(ref.name);
489
601
  }
490
602
 
491
603
  for (const ref of currentScope.through) {
@@ -497,6 +609,7 @@ const collectReferences = scope => {
497
609
 
498
610
  return {
499
611
  locals,
612
+ imports,
500
613
  unresolved
501
614
  };
502
615
  };
@@ -504,10 +617,34 @@ const collectReferences = scope => {
504
617
  const scopeHasLocalReference = (scope, referenceName) => {
505
618
  const references = collectReferences(scope);
506
619
  return (// referenceName was found as a local variable or function declaration.
507
- references.locals.has(referenceName) || // referenceName was not found as an unresolved reference,
620
+ references.locals.has(referenceName) || // referenceName was found as an imported identifier
621
+ references.imports.has(referenceName) || // referenceName was not found as an unresolved reference,
508
622
  // meaning it is likely not an implicit global reference.
509
623
  !references.unresolved.has(referenceName)
510
624
  );
511
625
  };
512
626
 
513
- exports.scopeHasLocalReference = scopeHasLocalReference;
627
+ exports.scopeHasLocalReference = scopeHasLocalReference;
628
+
629
+ const resolveToJestFn = (scope, identifier) => {
630
+ const references = collectReferences(scope);
631
+ const maybeImport = references.imports.get(identifier);
632
+
633
+ if (maybeImport) {
634
+ // the identifier is imported from @jest/globals,
635
+ // so return the original import name
636
+ if (maybeImport.source === '@jest/globals') {
637
+ return maybeImport.imported;
638
+ }
639
+
640
+ return null;
641
+ } // the identifier was found as a local variable or function declaration
642
+ // meaning it's not a function from jest
643
+
644
+
645
+ if (references.locals.has(identifier)) {
646
+ return null;
647
+ }
648
+
649
+ return identifier;
650
+ };
@@ -39,9 +39,10 @@ var _default = (0, _utils2.createRule)({
39
39
  defaultOptions: [],
40
40
 
41
41
  create(context) {
42
+ const scope = context.getScope();
42
43
  return {
43
44
  CallExpression(node) {
44
- if (!(0, _utils2.isDescribeCall)(node)) {
45
+ if (!(0, _utils2.isDescribeCall)(node, scope)) {
45
46
  return;
46
47
  }
47
48
 
@@ -52,8 +52,8 @@ const findTopMostCallExpression = node => {
52
52
  return topMostCallExpression;
53
53
  };
54
54
 
55
- const isTestCaseCallWithCallbackArg = node => {
56
- if (!(0, _utils2.isTestCaseCall)(node)) {
55
+ const isTestCaseCallWithCallbackArg = (node, scope) => {
56
+ if (!(0, _utils2.isTestCaseCall)(node, scope)) {
57
57
  return false;
58
58
  }
59
59
 
@@ -254,7 +254,7 @@ const findFirstBlockBodyUp = node => {
254
254
  throw new Error(`Could not find BlockStatement - please file a github issue at https://github.com/jest-community/eslint-plugin-jest`);
255
255
  };
256
256
 
257
- const isDirectlyWithinTestCaseCall = node => {
257
+ const isDirectlyWithinTestCaseCall = (node, scope) => {
258
258
  let parent = node;
259
259
 
260
260
  while (parent) {
@@ -262,7 +262,7 @@ const isDirectlyWithinTestCaseCall = node => {
262
262
  var _parent;
263
263
 
264
264
  parent = parent.parent;
265
- return !!(((_parent = parent) === null || _parent === void 0 ? void 0 : _parent.type) === _utils.AST_NODE_TYPES.CallExpression && (0, _utils2.isTestCaseCall)(parent));
265
+ return !!(((_parent = parent) === null || _parent === void 0 ? void 0 : _parent.type) === _utils.AST_NODE_TYPES.CallExpression && (0, _utils2.isTestCaseCall)(parent, scope));
266
266
  }
267
267
 
268
268
  parent = parent.parent;
@@ -299,6 +299,7 @@ var _default = (0, _utils2.createRule)({
299
299
  defaultOptions: [],
300
300
 
301
301
  create(context) {
302
+ const scope = context.getScope();
302
303
  let inTestCaseWithDoneCallback = false; // an array of booleans representing each promise chain we enter, with the
303
304
  // boolean value representing if we think a given chain contains an expect
304
305
  // in it's body.
@@ -312,7 +313,7 @@ var _default = (0, _utils2.createRule)({
312
313
  CallExpression(node) {
313
314
  // there are too many ways that the done argument could be used with
314
315
  // promises that contain expect that would make the promise safe for us
315
- if (isTestCaseCallWithCallbackArg(node)) {
316
+ if (isTestCaseCallWithCallbackArg(node, scope)) {
316
317
  inTestCaseWithDoneCallback = true;
317
318
  return;
318
319
  } // if this call expression is a promise chain, add it to the stack with
@@ -336,7 +337,7 @@ var _default = (0, _utils2.createRule)({
336
337
  // make promises containing expects safe in a test for us to be able to
337
338
  // accurately check, so we just bail out completely if it's present
338
339
  if (inTestCaseWithDoneCallback) {
339
- if ((0, _utils2.isTestCaseCall)(node)) {
340
+ if ((0, _utils2.isTestCaseCall)(node, scope)) {
340
341
  inTestCaseWithDoneCallback = false;
341
342
  }
342
343
 
@@ -363,7 +364,7 @@ var _default = (0, _utils2.createRule)({
363
364
  // because we're most likely in the body of a function being defined
364
365
  // within the test, which we can't track
365
366
 
366
- if (!parent || !isDirectlyWithinTestCaseCall(parent)) {
367
+ if (!parent || !isDirectlyWithinTestCaseCall(parent, scope)) {
367
368
  return;
368
369
  }
369
370
 
@@ -123,6 +123,7 @@ var _default = (0, _utils2.createRule)({
123
123
  mustNotMatch,
124
124
  mustMatch
125
125
  }]) {
126
+ const scope = context.getScope();
126
127
  const disallowedWordsRegexp = new RegExp(`\\b(${disallowedWords.join('|')})\\b`, 'iu');
127
128
  const mustNotMatchPatterns = compileMatcherPatterns(mustNotMatch !== null && mustNotMatch !== void 0 ? mustNotMatch : {});
128
129
  const mustMatchPatterns = compileMatcherPatterns(mustMatch !== null && mustMatch !== void 0 ? mustMatch : {});
@@ -130,7 +131,7 @@ var _default = (0, _utils2.createRule)({
130
131
  CallExpression(node) {
131
132
  var _mustNotMatchPatterns, _mustMatchPatterns$je;
132
133
 
133
- if (!(0, _utils2.isDescribeCall)(node) && !(0, _utils2.isTestCaseCall)(node)) {
134
+ if (!(0, _utils2.isDescribeCall)(node, scope) && !(0, _utils2.isTestCaseCall)(node, scope)) {
134
135
  return;
135
136
  }
136
137
 
@@ -145,7 +146,7 @@ var _default = (0, _utils2.createRule)({
145
146
  return;
146
147
  }
147
148
 
148
- if (argument.type !== _utils.AST_NODE_TYPES.TemplateLiteral && !(ignoreTypeOfDescribeName && (0, _utils2.isDescribeCall)(node))) {
149
+ if (argument.type !== _utils.AST_NODE_TYPES.TemplateLiteral && !(ignoreTypeOfDescribeName && (0, _utils2.isDescribeCall)(node, scope))) {
149
150
  context.report({
150
151
  messageId: 'titleMustBeString',
151
152
  loc: argument.loc
@@ -161,7 +162,7 @@ var _default = (0, _utils2.createRule)({
161
162
  context.report({
162
163
  messageId: 'emptyTitle',
163
164
  data: {
164
- jestFunctionName: (0, _utils2.isDescribeCall)(node) ? _utils2.DescribeAlias.describe : _utils2.TestCaseName.test
165
+ jestFunctionName: (0, _utils2.isDescribeCall)(node, scope) ? _utils2.DescribeAlias.describe : _utils2.TestCaseName.test
165
166
  },
166
167
  node
167
168
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-jest",
3
- "version": "26.1.5",
3
+ "version": "26.2.0",
4
4
  "description": "ESLint rules for Jest",
5
5
  "keywords": [
6
6
  "eslint",
@@ -60,9 +60,6 @@
60
60
  "projects": [
61
61
  {
62
62
  "displayName": "test",
63
- "moduleNameMapper": {
64
- "eslint/use-at-your-own-risk": "eslint/lib/unsupported-api.js"
65
- },
66
63
  "testPathIgnorePatterns": [
67
64
  "<rootDir>/lib/.*",
68
65
  "<rootDir>/src/rules/__tests__/fixtures/*",
@@ -100,7 +97,7 @@
100
97
  "@types/prettier": "^2.0.0",
101
98
  "@typescript-eslint/eslint-plugin": "^5.0.0",
102
99
  "@typescript-eslint/parser": "^5.0.0",
103
- "babel-jest": "^27.0.0",
100
+ "babel-jest": "^28.0.0",
104
101
  "babel-plugin-replace-ts-export-assignment": "^0.0.2",
105
102
  "dedent": "^0.7.0",
106
103
  "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0",
@@ -115,7 +112,7 @@
115
112
  "eslint-remote-tester-repositories": "^0.0.5",
116
113
  "husky": "^7.0.2",
117
114
  "is-ci": "^3.0.0",
118
- "jest": "^27.0.0",
115
+ "jest": "^28.0.0",
119
116
  "jest-runner-eslint": "^1.0.0",
120
117
  "lint-staged": "^12.0.0",
121
118
  "pinst": "^3.0.0",
@@ -163,5 +160,5 @@
163
160
  "@typescript-eslint/experimental-utils": "^5.0.0",
164
161
  "fsevents/node-gyp": "^7.0.0"
165
162
  },
166
- "packageManager": "yarn@3.2.0"
163
+ "packageManager": "yarn@3.2.1"
167
164
  }