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