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,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: {
@@ -28,35 +25,26 @@ var _default = (0, _utils2.createRule)({
28
25
  create: context => ({
29
26
  CallExpression(node) {
30
27
  const jestFnCall = (0, _utils2.parseJestFnCall)(node, context);
31
-
32
28
  if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'expect') {
33
29
  return;
34
30
  }
35
-
36
31
  const {
37
32
  parent
38
33
  } = jestFnCall.head.node;
39
-
40
34
  if ((parent === null || parent === void 0 ? void 0 : parent.type) !== _utils.AST_NODE_TYPES.CallExpression) {
41
35
  return;
42
36
  }
43
-
44
37
  const [awaitNode] = parent.arguments;
45
-
46
38
  if ((awaitNode === null || awaitNode === void 0 ? void 0 : awaitNode.type) === _utils.AST_NODE_TYPES.AwaitExpression) {
47
39
  context.report({
48
40
  node: awaitNode,
49
41
  messageId: 'expectResolves',
50
-
51
42
  fix(fixer) {
52
43
  return [fixer.insertTextBefore(parent, 'await '), fixer.removeRange([awaitNode.range[0], awaitNode.argument.range[0]]), fixer.insertTextAfter(parent, '.resolves')];
53
44
  }
54
-
55
45
  });
56
46
  }
57
47
  }
58
-
59
48
  })
60
49
  });
61
-
62
50
  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("./utils");
9
-
10
8
  const HooksOrder = ['beforeAll', 'beforeEach', 'afterEach', 'afterAll'];
11
-
12
9
  var _default = (0, _utils.createRule)({
13
10
  name: __filename,
14
11
  meta: {
@@ -24,7 +21,6 @@ var _default = (0, _utils.createRule)({
24
21
  type: 'suggestion'
25
22
  },
26
23
  defaultOptions: [],
27
-
28
24
  create(context) {
29
25
  let previousHookIndex = -1;
30
26
  let inHook = false;
@@ -34,19 +30,15 @@ var _default = (0, _utils.createRule)({
34
30
  // Ignore everything that is passed into a hook
35
31
  return;
36
32
  }
37
-
38
33
  const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
39
-
40
34
  if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'hook') {
41
35
  // Reset the previousHookIndex when encountering something different from a hook
42
36
  previousHookIndex = -1;
43
37
  return;
44
38
  }
45
-
46
39
  inHook = true;
47
40
  const currentHook = jestFnCall.name;
48
41
  const currentHookIndex = HooksOrder.indexOf(currentHook);
49
-
50
42
  if (currentHookIndex < previousHookIndex) {
51
43
  context.report({
52
44
  messageId: 'reorderHooks',
@@ -58,27 +50,21 @@ var _default = (0, _utils.createRule)({
58
50
  });
59
51
  return;
60
52
  }
61
-
62
53
  previousHookIndex = currentHookIndex;
63
54
  },
64
-
65
55
  'CallExpression:exit'(node) {
66
56
  if ((0, _utils.isTypeOfJestFnCall)(node, context, ['hook'])) {
67
57
  inHook = false;
68
58
  return;
69
59
  }
70
-
71
60
  if (inHook) {
72
61
  return;
73
- } // Reset the previousHookIndex when encountering something different from a hook
74
-
62
+ }
75
63
 
64
+ // Reset the previousHookIndex when encountering something different from a hook
76
65
  previousHookIndex = -1;
77
66
  }
78
-
79
67
  };
80
68
  }
81
-
82
69
  });
83
-
84
70
  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,7 +20,6 @@ var _default = (0, _utils.createRule)({
22
20
  type: 'suggestion'
23
21
  },
24
22
  defaultOptions: [],
25
-
26
23
  create(context) {
27
24
  const hooksContext = [false];
28
25
  return {
@@ -30,24 +27,18 @@ var _default = (0, _utils.createRule)({
30
27
  if ((0, _utils.isTypeOfJestFnCall)(node, context, ['test'])) {
31
28
  hooksContext[hooksContext.length - 1] = true;
32
29
  }
33
-
34
30
  if (hooksContext[hooksContext.length - 1] && (0, _utils.isTypeOfJestFnCall)(node, context, ['hook'])) {
35
31
  context.report({
36
32
  messageId: 'noHookOnTop',
37
33
  node
38
34
  });
39
35
  }
40
-
41
36
  hooksContext.push(false);
42
37
  },
43
-
44
38
  'CallExpression:exit'() {
45
39
  hooksContext.pop();
46
40
  }
47
-
48
41
  };
49
42
  }
50
-
51
43
  });
52
-
53
44
  exports.default = _default;
@@ -4,29 +4,21 @@ 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 hasStringAsFirstArgument = node => node.arguments[0] && (0, _utils.isStringNode)(node.arguments[0]);
11
-
12
9
  const populateIgnores = ignore => {
13
10
  const ignores = [];
14
-
15
11
  if (ignore.includes(_utils.DescribeAlias.describe)) {
16
12
  ignores.push(...Object.keys(_utils.DescribeAlias));
17
13
  }
18
-
19
14
  if (ignore.includes(_utils.TestCaseName.test)) {
20
15
  ignores.push(...Object.keys(_utils.TestCaseName).filter(k => k.endsWith(_utils.TestCaseName.test)));
21
16
  }
22
-
23
17
  if (ignore.includes(_utils.TestCaseName.it)) {
24
18
  ignores.push(...Object.keys(_utils.TestCaseName).filter(k => k.endsWith(_utils.TestCaseName.it)));
25
19
  }
26
-
27
20
  return ignores;
28
21
  };
29
-
30
22
  var _default = (0, _utils.createRule)({
31
23
  name: __filename,
32
24
  meta: {
@@ -70,7 +62,6 @@ var _default = (0, _utils.createRule)({
70
62
  allowedPrefixes: [],
71
63
  ignoreTopLevelDescribe: false
72
64
  }],
73
-
74
65
  create(context, [{
75
66
  ignore = [],
76
67
  allowedPrefixes = [],
@@ -81,60 +72,46 @@ var _default = (0, _utils.createRule)({
81
72
  return {
82
73
  CallExpression(node) {
83
74
  const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
84
-
85
75
  if (!jestFnCall || !hasStringAsFirstArgument(node)) {
86
76
  return;
87
77
  }
88
-
89
78
  if (jestFnCall.type === 'describe') {
90
79
  numberOfDescribeBlocks++;
91
-
92
80
  if (ignoreTopLevelDescribe && numberOfDescribeBlocks === 1) {
93
81
  return;
94
82
  }
95
83
  } else if (jestFnCall.type !== 'test') {
96
84
  return;
97
85
  }
98
-
99
86
  const [firstArg] = node.arguments;
100
87
  const description = (0, _utils.getStringValue)(firstArg);
101
-
102
88
  if (allowedPrefixes.some(name => description.startsWith(name))) {
103
89
  return;
104
90
  }
105
-
106
91
  const firstCharacter = description.charAt(0);
107
-
108
92
  if (!firstCharacter || firstCharacter === firstCharacter.toLowerCase() || ignores.includes(jestFnCall.name)) {
109
93
  return;
110
94
  }
111
-
112
95
  context.report({
113
96
  messageId: 'unexpectedLowercase',
114
97
  node: node.arguments[0],
115
98
  data: {
116
99
  method: jestFnCall.name
117
100
  },
118
-
119
101
  fix(fixer) {
120
102
  const description = (0, _utils.getStringValue)(firstArg);
121
103
  const rangeIgnoringQuotes = [firstArg.range[0] + 1, firstArg.range[1] - 1];
122
104
  const newDescription = description.substring(0, 1).toLowerCase() + description.substring(1);
123
105
  return [fixer.replaceTextRange(rangeIgnoringQuotes, newDescription)];
124
106
  }
125
-
126
107
  });
127
108
  },
128
-
129
109
  'CallExpression:exit'(node) {
130
110
  if ((0, _utils.isTypeOfJestFnCall)(node, context, ['describe'])) {
131
111
  numberOfDescribeBlocks--;
132
112
  }
133
113
  }
134
-
135
114
  };
136
115
  }
137
-
138
116
  });
139
-
140
117
  exports.default = _default;
@@ -4,29 +4,21 @@ 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 withOnce = (name, addOnce) => {
13
10
  return `${name}${addOnce ? 'Once' : ''}`;
14
11
  };
15
-
16
12
  const findSingleReturnArgumentNode = fnNode => {
17
13
  var _fnNode$body$body$;
18
-
19
14
  if (fnNode.body.type !== _utils.AST_NODE_TYPES.BlockStatement) {
20
15
  return fnNode.body;
21
16
  }
22
-
23
17
  if (((_fnNode$body$body$ = fnNode.body.body[0]) === null || _fnNode$body$body$ === void 0 ? void 0 : _fnNode$body$body$.type) === _utils.AST_NODE_TYPES.ReturnStatement) {
24
18
  return fnNode.body.body[0].argument;
25
19
  }
26
-
27
20
  return null;
28
21
  };
29
-
30
22
  var _default = (0, _utils2.createRule)({
31
23
  name: __filename,
32
24
  meta: {
@@ -43,19 +35,15 @@ var _default = (0, _utils2.createRule)({
43
35
  fixable: 'code'
44
36
  },
45
37
  defaultOptions: [],
46
-
47
38
  create(context) {
48
39
  const report = (property, isOnce, outerArgNode, innerArgNode = outerArgNode) => {
49
40
  if ((innerArgNode === null || innerArgNode === void 0 ? void 0 : innerArgNode.type) !== _utils.AST_NODE_TYPES.CallExpression) {
50
41
  return;
51
42
  }
52
-
53
43
  const argName = (0, _utils2.getNodeName)(innerArgNode);
54
-
55
44
  if (argName !== 'Promise.resolve' && argName !== 'Promise.reject') {
56
45
  return;
57
46
  }
58
-
59
47
  const replacement = withOnce(argName.endsWith('reject') ? 'mockRejectedValue' : 'mockResolvedValue', isOnce);
60
48
  context.report({
61
49
  node: property,
@@ -63,49 +51,40 @@ var _default = (0, _utils2.createRule)({
63
51
  data: {
64
52
  replacement
65
53
  },
66
-
67
54
  fix(fixer) {
68
- const sourceCode = context.getSourceCode(); // there shouldn't be more than one argument, but if there is don't try
69
- // fixing since we have no idea what to do with the extra arguments
55
+ const sourceCode = context.getSourceCode();
70
56
 
57
+ // there shouldn't be more than one argument, but if there is don't try
58
+ // fixing since we have no idea what to do with the extra arguments
71
59
  if (innerArgNode.arguments.length > 1) {
72
60
  return null;
73
61
  }
74
-
75
- return [fixer.replaceText(property, replacement), fixer.replaceText(outerArgNode, // the value argument for both Promise methods is optional,
62
+ return [fixer.replaceText(property, replacement), fixer.replaceText(outerArgNode,
63
+ // the value argument for both Promise methods is optional,
76
64
  // whereas for Jest they're required so use an explicit undefined
77
65
  // if no argument is being passed to the call we're replacing
78
66
  innerArgNode.arguments.length === 1 ? sourceCode.getText(innerArgNode.arguments[0]) : 'undefined')];
79
67
  }
80
-
81
68
  });
82
69
  };
83
-
84
70
  return {
85
71
  CallExpression(node) {
86
72
  if (node.callee.type !== _utils.AST_NODE_TYPES.MemberExpression || !(0, _utils2.isSupportedAccessor)(node.callee.property) || node.arguments.length === 0) {
87
73
  return;
88
74
  }
89
-
90
75
  const mockFnName = (0, _utils2.getAccessorValue)(node.callee.property);
91
76
  const isOnce = mockFnName.endsWith('Once');
92
-
93
77
  if (mockFnName === withOnce('mockReturnValue', isOnce)) {
94
78
  report(node.callee.property, isOnce, node.arguments[0]);
95
79
  } else if (mockFnName === withOnce('mockImplementation', isOnce)) {
96
80
  const [arg] = node.arguments;
97
-
98
81
  if (!(0, _utils2.isFunction)(arg) || arg.params.length !== 0) {
99
82
  return;
100
83
  }
101
-
102
84
  report(node.callee.property, isOnce, arg, findSingleReturnArgumentNode(arg));
103
85
  }
104
86
  }
105
-
106
87
  };
107
88
  }
108
-
109
89
  });
110
-
111
90
  exports.default = _default;
@@ -4,39 +4,34 @@ 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 snapshotMatchers = ['toMatchSnapshot', 'toThrowErrorMatchingSnapshot'];
11
9
  const snapshotMatcherNames = snapshotMatchers;
12
-
13
10
  const isSnapshotMatcherWithoutHint = expectFnCall => {
14
11
  if (expectFnCall.args.length === 0) {
15
12
  return true;
16
- } // this matcher only supports one argument which is the hint
17
-
13
+ }
18
14
 
15
+ // this matcher only supports one argument which is the hint
19
16
  if (!(0, _utils.isSupportedAccessor)(expectFnCall.matcher, 'toMatchSnapshot')) {
20
17
  return expectFnCall.args.length !== 1;
21
- } // if we're being passed two arguments,
22
- // the second one should be the hint
23
-
18
+ }
24
19
 
20
+ // if we're being passed two arguments,
21
+ // the second one should be the hint
25
22
  if (expectFnCall.args.length === 2) {
26
23
  return false;
27
24
  }
25
+ const [arg] = expectFnCall.args;
28
26
 
29
- const [arg] = expectFnCall.args; // the first argument to `toMatchSnapshot` can be _either_ a snapshot hint or
27
+ // the first argument to `toMatchSnapshot` can be _either_ a snapshot hint or
30
28
  // an object with asymmetric matchers, so we can't just assume that the first
31
29
  // argument is a hint when it's by itself.
32
-
33
30
  return !(0, _utils.isStringNode)(arg);
34
31
  };
35
-
36
32
  const messages = {
37
33
  missingHint: 'You should provide a hint for this snapshot'
38
34
  };
39
-
40
35
  var _default = (0, _utils.createRule)({
41
36
  name: __filename,
42
37
  meta: {
@@ -53,12 +48,10 @@ var _default = (0, _utils.createRule)({
53
48
  }]
54
49
  },
55
50
  defaultOptions: ['multi'],
56
-
57
51
  create(context, [mode]) {
58
52
  const snapshotMatchers = [];
59
53
  const depths = [];
60
54
  let expressionDepth = 0;
61
-
62
55
  const reportSnapshotMatchersWithoutHints = () => {
63
56
  for (const snapshotMatcher of snapshotMatchers) {
64
57
  if (isSnapshotMatcherWithoutHint(snapshotMatcher)) {
@@ -69,72 +62,53 @@ var _default = (0, _utils.createRule)({
69
62
  }
70
63
  }
71
64
  };
72
-
73
65
  const enterExpression = () => {
74
66
  expressionDepth++;
75
67
  };
76
-
77
68
  const exitExpression = () => {
78
69
  expressionDepth--;
79
-
80
70
  if (mode === 'always') {
81
71
  reportSnapshotMatchersWithoutHints();
82
72
  snapshotMatchers.length = 0;
83
73
  }
84
-
85
74
  if (mode === 'multi' && expressionDepth === 0) {
86
75
  if (snapshotMatchers.length > 1) {
87
76
  reportSnapshotMatchersWithoutHints();
88
77
  }
89
-
90
78
  snapshotMatchers.length = 0;
91
79
  }
92
80
  };
93
-
94
81
  return {
95
82
  'Program:exit'() {
96
83
  enterExpression();
97
84
  exitExpression();
98
85
  },
99
-
100
86
  FunctionExpression: enterExpression,
101
87
  'FunctionExpression:exit': exitExpression,
102
88
  ArrowFunctionExpression: enterExpression,
103
89
  'ArrowFunctionExpression:exit': exitExpression,
104
-
105
90
  'CallExpression:exit'(node) {
106
91
  if ((0, _utils.isTypeOfJestFnCall)(node, context, ['describe', 'test'])) {
107
- var _depths$pop;
108
-
109
92
  /* istanbul ignore next */
110
- expressionDepth = (_depths$pop = depths.pop()) !== null && _depths$pop !== void 0 ? _depths$pop : 0;
93
+ expressionDepth = depths.pop() ?? 0;
111
94
  }
112
95
  },
113
-
114
96
  CallExpression(node) {
115
97
  const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
116
-
117
98
  if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'expect') {
118
99
  if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) === 'describe' || (jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) === 'test') {
119
100
  depths.push(expressionDepth);
120
101
  expressionDepth = 0;
121
102
  }
122
-
123
103
  return;
124
104
  }
125
-
126
105
  const matcherName = (0, _utils.getAccessorValue)(jestFnCall.matcher);
127
-
128
106
  if (!snapshotMatcherNames.includes(matcherName)) {
129
107
  return;
130
108
  }
131
-
132
109
  snapshotMatchers.push(jestFnCall);
133
110
  }
134
-
135
111
  };
136
112
  }
137
-
138
113
  });
139
-
140
114
  exports.default = _default;
@@ -4,41 +4,30 @@ 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 findNodeObject = node => {
13
10
  if ('object' in node) {
14
11
  return node.object;
15
12
  }
16
-
17
13
  if (node.callee.type === _utils.AST_NODE_TYPES.MemberExpression) {
18
14
  return node.callee.object;
19
15
  }
20
-
21
16
  return null;
22
17
  };
23
-
24
18
  const getJestFnCall = node => {
25
19
  if (node.type !== _utils.AST_NODE_TYPES.CallExpression && node.type !== _utils.AST_NODE_TYPES.MemberExpression) {
26
20
  return null;
27
21
  }
28
-
29
22
  const obj = findNodeObject(node);
30
-
31
23
  if (!obj) {
32
24
  return null;
33
25
  }
34
-
35
26
  if (obj.type === _utils.AST_NODE_TYPES.Identifier) {
36
27
  return node.type === _utils.AST_NODE_TYPES.CallExpression && (0, _utils2.getNodeName)(node.callee) === 'jest.fn' ? node : null;
37
28
  }
38
-
39
29
  return getJestFnCall(obj);
40
30
  };
41
-
42
31
  var _default = (0, _utils2.createRule)({
43
32
  name: __filename,
44
33
  meta: {
@@ -55,7 +44,6 @@ var _default = (0, _utils2.createRule)({
55
44
  type: 'suggestion'
56
45
  },
57
46
  defaultOptions: [],
58
-
59
47
  create(context) {
60
48
  return {
61
49
  AssignmentExpression(node) {
@@ -69,7 +57,6 @@ var _default = (0, _utils2.createRule)({
69
57
  context.report({
70
58
  node,
71
59
  messageId: 'useJestSpyOn',
72
-
73
60
  fix(fixer) {
74
61
  const leftPropQuote = left.property.type === _utils.AST_NODE_TYPES.Identifier ? "'" : '';
75
62
  const [arg] = jestFnCall.arguments;
@@ -77,13 +64,9 @@ var _default = (0, _utils2.createRule)({
77
64
  const mockImplementation = argSource ? `.mockImplementation(${argSource})` : '.mockImplementation()';
78
65
  return [fixer.insertTextBefore(left, `jest.spyOn(`), fixer.replaceTextRange([left.object.range[1], left.property.range[0]], `, ${leftPropQuote}`), fixer.replaceTextRange([left.property.range[1], jestFnCall.range[1]], `${leftPropQuote})${mockImplementation}`)];
79
66
  }
80
-
81
67
  });
82
68
  }
83
-
84
69
  };
85
70
  }
86
-
87
71
  });
88
-
89
72
  exports.default = _default;
@@ -4,17 +4,14 @@ 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: {
13
11
  docs: {
14
12
  category: 'Best Practices',
15
13
  description: 'Suggest using `toStrictEqual()`',
16
- recommended: false,
17
- suggestion: true
14
+ recommended: false
18
15
  },
19
16
  messages: {
20
17
  useToStrictEqual: 'Use `toStrictEqual()` instead',
@@ -25,20 +22,16 @@ var _default = (0, _utils.createRule)({
25
22
  hasSuggestions: true
26
23
  },
27
24
  defaultOptions: [],
28
-
29
25
  create(context) {
30
26
  return {
31
27
  CallExpression(node) {
32
28
  const jestFnCall = (0, _utils.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
  matcher
40
34
  } = jestFnCall;
41
-
42
35
  if ((0, _utils.isSupportedAccessor)(matcher, 'toEqual')) {
43
36
  context.report({
44
37
  messageId: 'useToStrictEqual',
@@ -50,10 +43,7 @@ var _default = (0, _utils.createRule)({
50
43
  });
51
44
  }
52
45
  }
53
-
54
46
  };
55
47
  }
56
-
57
48
  });
58
-
59
49
  exports.default = _default;