eslint-plugin-jest 27.1.2 → 27.1.4

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 (112) hide show
  1. package/README.md +81 -80
  2. package/docs/rules/consistent-test-it.md +4 -11
  3. package/docs/rules/expect-expect.md +3 -4
  4. package/docs/rules/max-expects.md +1 -5
  5. package/docs/rules/max-nested-describe.md +1 -5
  6. package/docs/rules/no-alias-methods.md +8 -10
  7. package/docs/rules/no-commented-out-tests.md +3 -4
  8. package/docs/rules/no-conditional-expect.md +4 -5
  9. package/docs/rules/no-conditional-in-test.md +1 -5
  10. package/docs/rules/no-deprecated-functions.md +5 -7
  11. package/docs/rules/no-disabled-tests.md +3 -4
  12. package/docs/rules/no-done-callback.md +6 -8
  13. package/docs/rules/no-duplicate-hooks.md +1 -5
  14. package/docs/rules/no-export.md +3 -4
  15. package/docs/rules/no-focused-tests.md +5 -7
  16. package/docs/rules/no-hooks.md +1 -5
  17. package/docs/rules/no-identical-title.md +3 -4
  18. package/docs/rules/no-if.md +2 -2
  19. package/docs/rules/no-interpolation-in-snapshots.md +3 -4
  20. package/docs/rules/no-jasmine-globals.md +6 -8
  21. package/docs/rules/no-large-snapshots.md +2 -6
  22. package/docs/rules/no-mocks-import.md +3 -4
  23. package/docs/rules/no-restricted-jest-methods.md +1 -5
  24. package/docs/rules/no-restricted-matchers.md +1 -5
  25. package/docs/rules/no-standalone-expect.md +3 -4
  26. package/docs/rules/no-test-prefixes.md +6 -8
  27. package/docs/rules/no-test-return-statement.md +1 -5
  28. package/docs/rules/prefer-called-with.md +1 -5
  29. package/docs/rules/prefer-comparison-matcher.md +3 -8
  30. package/docs/rules/prefer-each.md +1 -5
  31. package/docs/rules/prefer-equality-matcher.md +3 -8
  32. package/docs/rules/prefer-expect-assertions.md +3 -10
  33. package/docs/rules/prefer-expect-resolves.md +3 -8
  34. package/docs/rules/prefer-hooks-in-order.md +1 -5
  35. package/docs/rules/prefer-hooks-on-top.md +1 -5
  36. package/docs/rules/prefer-lowercase-title.md +3 -8
  37. package/docs/rules/prefer-mock-promise-shorthand.md +3 -8
  38. package/docs/rules/prefer-snapshot-hint.md +1 -5
  39. package/docs/rules/prefer-spy-on.md +3 -10
  40. package/docs/rules/prefer-strict-equal.md +3 -10
  41. package/docs/rules/prefer-to-be.md +5 -7
  42. package/docs/rules/prefer-to-contain.md +5 -9
  43. package/docs/rules/prefer-to-have-length.md +5 -9
  44. package/docs/rules/prefer-todo.md +3 -10
  45. package/docs/rules/require-hook.md +1 -5
  46. package/docs/rules/require-to-throw-message.md +1 -7
  47. package/docs/rules/require-top-level-describe.md +1 -5
  48. package/docs/rules/unbound-method.md +2 -4
  49. package/docs/rules/valid-describe-callback.md +3 -4
  50. package/docs/rules/valid-expect-in-promise.md +4 -5
  51. package/docs/rules/valid-expect.md +3 -6
  52. package/docs/rules/valid-title.md +5 -7
  53. package/lib/index.js +8 -16
  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 +0 -15
  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 +0 -9
  60. package/lib/rules/no-commented-out-tests.js +0 -10
  61. package/lib/rules/no-conditional-expect.js +1 -20
  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 +2 -18
  65. package/lib/rules/no-done-callback.js +2 -31
  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 +0 -15
  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 +0 -22
  74. package/lib/rules/no-large-snapshots.js +3 -21
  75. package/lib/rules/no-mocks-import.js +0 -12
  76. package/lib/rules/no-restricted-jest-methods.js +1 -11
  77. package/lib/rules/no-restricted-matchers.js +0 -11
  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 +0 -18
  84. package/lib/rules/prefer-equality-matcher.js +11 -23
  85. package/lib/rules/prefer-expect-assertions.js +4 -51
  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 +7 -31
  92. package/lib/rules/prefer-spy-on.js +0 -17
  93. package/lib/rules/prefer-strict-equal.js +0 -9
  94. package/lib/rules/prefer-to-be.js +1 -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 +0 -22
  99. package/lib/rules/require-to-throw-message.js +0 -9
  100. package/lib/rules/require-top-level-describe.js +0 -15
  101. package/lib/rules/unbound-method.js +2 -21
  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 +62 -118
  108. package/lib/rules/valid-describe-callback.js +0 -17
  109. package/lib/rules/valid-expect-in-promise.js +27 -94
  110. package/lib/rules/valid-expect.js +5 -48
  111. package/lib/rules/valid-title.js +0 -33
  112. package/package.json +3 -2
@@ -4,13 +4,9 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _path = require("path");
9
-
10
8
  var _utils = require("@typescript-eslint/utils");
11
-
12
9
  var _utils2 = require("./utils");
13
-
14
10
  const reportOnViolation = (context, node, {
15
11
  maxSize: lineLimit = 50,
16
12
  allowedSnapshots = {}
@@ -19,29 +15,23 @@ const reportOnViolation = (context, node, {
19
15
  const endLine = node.loc.end.line;
20
16
  const lineCount = endLine - startLine;
21
17
  const allPathsAreAbsolute = Object.keys(allowedSnapshots).every(_path.isAbsolute);
22
-
23
18
  if (!allPathsAreAbsolute) {
24
19
  throw new Error('All paths for allowedSnapshots must be absolute. You can use JS config and `path.resolve`');
25
20
  }
26
-
27
21
  let isAllowed = false;
28
-
29
22
  if (node.type === _utils.AST_NODE_TYPES.ExpressionStatement && 'left' in node.expression && node.expression.left.type === _utils.AST_NODE_TYPES.MemberExpression && (0, _utils2.isSupportedAccessor)(node.expression.left.property)) {
30
23
  const fileName = context.getFilename();
31
24
  const allowedSnapshotsInFile = allowedSnapshots[fileName];
32
-
33
25
  if (allowedSnapshotsInFile) {
34
26
  const snapshotName = (0, _utils2.getAccessorValue)(node.expression.left.property);
35
27
  isAllowed = allowedSnapshotsInFile.some(name => {
36
28
  if (name instanceof RegExp) {
37
29
  return name.test(snapshotName);
38
30
  }
39
-
40
31
  return snapshotName === name;
41
32
  });
42
33
  }
43
34
  }
44
-
45
35
  if (!isAllowed && lineCount > lineLimit) {
46
36
  context.report({
47
37
  messageId: lineLimit === 0 ? 'noSnapshot' : 'tooLongSnapshots',
@@ -53,13 +43,12 @@ const reportOnViolation = (context, node, {
53
43
  });
54
44
  }
55
45
  };
56
-
57
46
  var _default = (0, _utils2.createRule)({
58
47
  name: __filename,
59
48
  meta: {
60
49
  docs: {
61
50
  category: 'Best Practices',
62
- description: 'disallow large snapshots',
51
+ description: 'Disallow large snapshots',
63
52
  recommended: false
64
53
  },
65
54
  messages: {
@@ -87,35 +76,28 @@ var _default = (0, _utils2.createRule)({
87
76
  }]
88
77
  },
89
78
  defaultOptions: [{}],
90
-
91
79
  create(context, [options]) {
92
80
  if (context.getFilename().endsWith('.snap')) {
93
81
  return {
94
82
  ExpressionStatement(node) {
95
83
  reportOnViolation(context, node, options);
96
84
  }
97
-
98
85
  };
99
86
  }
100
-
101
87
  return {
102
88
  CallExpression(node) {
103
89
  const jestFnCall = (0, _utils2.parseJestFnCall)(node, context);
104
-
105
90
  if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'expect') {
106
91
  return;
107
92
  }
108
-
109
93
  if (['toMatchInlineSnapshot', 'toThrowErrorMatchingInlineSnapshot'].includes((0, _utils2.getAccessorValue)(jestFnCall.matcher)) && jestFnCall.args.length) {
110
- reportOnViolation(context, jestFnCall.args[0], { ...options,
94
+ reportOnViolation(context, jestFnCall.args[0], {
95
+ ...options,
111
96
  maxSize: options.inlineMaxSize ?? options.maxSize
112
97
  });
113
98
  }
114
99
  }
115
-
116
100
  };
117
101
  }
118
-
119
102
  });
120
-
121
103
  exports.default = _default;
@@ -4,17 +4,11 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _path = require("path");
9
-
10
8
  var _utils = require("./utils");
11
-
12
9
  const mocksDirName = '__mocks__';
13
-
14
10
  const isMockPath = path => path.split(_path.posix.sep).includes(mocksDirName);
15
-
16
11
  const isMockImportLiteral = expression => (0, _utils.isStringNode)(expression) && isMockPath((0, _utils.getStringValue)(expression));
17
-
18
12
  var _default = (0, _utils.createRule)({
19
13
  name: __filename,
20
14
  meta: {
@@ -30,7 +24,6 @@ var _default = (0, _utils.createRule)({
30
24
  schema: []
31
25
  },
32
26
  defaultOptions: [],
33
-
34
27
  create(context) {
35
28
  return {
36
29
  ImportDeclaration(node) {
@@ -41,10 +34,8 @@ var _default = (0, _utils.createRule)({
41
34
  });
42
35
  }
43
36
  },
44
-
45
37
  'CallExpression[callee.name="require"]'(node) {
46
38
  const [arg] = node.arguments;
47
-
48
39
  if (arg && isMockImportLiteral(arg)) {
49
40
  context.report({
50
41
  node: arg,
@@ -52,10 +43,7 @@ var _default = (0, _utils.createRule)({
52
43
  });
53
44
  }
54
45
  }
55
-
56
46
  };
57
47
  }
58
-
59
48
  });
60
-
61
49
  exports.default = _default;
@@ -4,14 +4,11 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _utils = require("./utils");
9
-
10
8
  const messages = {
11
9
  restrictedJestMethod: 'Use of `{{ restriction }}` is disallowed',
12
10
  restrictedJestMethodWithMessage: '{{ message }}'
13
11
  };
14
-
15
12
  var _default = (0, _utils.createRule)({
16
13
  name: __filename,
17
14
  meta: {
@@ -30,18 +27,14 @@ var _default = (0, _utils.createRule)({
30
27
  messages
31
28
  },
32
29
  defaultOptions: [{}],
33
-
34
30
  create(context, [restrictedMethods]) {
35
31
  return {
36
32
  CallExpression(node) {
37
33
  const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
38
-
39
- if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'jest') {
34
+ if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'jest' || jestFnCall.members.length === 0) {
40
35
  return;
41
36
  }
42
-
43
37
  const method = (0, _utils.getAccessorValue)(jestFnCall.members[0]);
44
-
45
38
  if (method in restrictedMethods) {
46
39
  const message = restrictedMethods[method];
47
40
  context.report({
@@ -57,10 +50,7 @@ var _default = (0, _utils.createRule)({
57
50
  });
58
51
  }
59
52
  }
60
-
61
53
  };
62
54
  }
63
-
64
55
  });
65
-
66
56
  exports.default = _default;
@@ -4,17 +4,13 @@ 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 isChainRestricted = (chain, restriction) => {
11
9
  if (_utils.ModifierName.hasOwnProperty(restriction) || restriction.endsWith('.not')) {
12
10
  return chain.startsWith(restriction);
13
11
  }
14
-
15
12
  return chain === restriction;
16
13
  };
17
-
18
14
  var _default = (0, _utils.createRule)({
19
15
  name: __filename,
20
16
  meta: {
@@ -36,18 +32,14 @@ var _default = (0, _utils.createRule)({
36
32
  }
37
33
  },
38
34
  defaultOptions: [{}],
39
-
40
35
  create(context, [restrictedChains]) {
41
36
  return {
42
37
  CallExpression(node) {
43
38
  const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
44
-
45
39
  if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'expect') {
46
40
  return;
47
41
  }
48
-
49
42
  const chain = jestFnCall.members.map(nod => (0, _utils.getAccessorValue)(nod)).join('.');
50
-
51
43
  for (const [restriction, message] of Object.entries(restrictedChains)) {
52
44
  if (isChainRestricted(chain, restriction)) {
53
45
  context.report({
@@ -65,10 +57,7 @@ var _default = (0, _utils.createRule)({
65
57
  }
66
58
  }
67
59
  }
68
-
69
60
  };
70
61
  }
71
-
72
62
  });
73
-
74
63
  exports.default = _default;
@@ -4,40 +4,35 @@ 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 getBlockType = (statement, context) => {
13
10
  const func = statement.parent;
14
- /* istanbul ignore if */
15
11
 
12
+ /* istanbul ignore if */
16
13
  if (!func) {
17
14
  throw new Error(`Unexpected BlockStatement. No parent defined. - please file a github issue at https://github.com/jest-community/eslint-plugin-jest`);
18
- } // functionDeclaration: function func() {}
19
-
15
+ }
20
16
 
17
+ // functionDeclaration: function func() {}
21
18
  if (func.type === _utils.AST_NODE_TYPES.FunctionDeclaration) {
22
19
  return 'function';
23
20
  }
24
-
25
21
  if ((0, _utils2.isFunction)(func) && func.parent) {
26
- const expr = func.parent; // arrow function or function expr
22
+ const expr = func.parent;
27
23
 
24
+ // arrow function or function expr
28
25
  if (expr.type === _utils.AST_NODE_TYPES.VariableDeclarator) {
29
26
  return 'function';
30
- } // if it's not a variable, it will be callExpr, we only care about describe
31
-
27
+ }
32
28
 
29
+ // if it's not a variable, it will be callExpr, we only care about describe
33
30
  if (expr.type === _utils.AST_NODE_TYPES.CallExpression && (0, _utils2.isTypeOfJestFnCall)(expr, context, ['describe'])) {
34
31
  return 'describe';
35
32
  }
36
33
  }
37
-
38
34
  return null;
39
35
  };
40
-
41
36
  var _default = (0, _utils2.createRule)({
42
37
  name: __filename,
43
38
  meta: {
@@ -65,85 +60,64 @@ var _default = (0, _utils2.createRule)({
65
60
  defaultOptions: [{
66
61
  additionalTestBlockFunctions: []
67
62
  }],
68
-
69
63
  create(context, [{
70
64
  additionalTestBlockFunctions = []
71
65
  }]) {
72
66
  const callStack = [];
73
-
74
67
  const isCustomTestBlockFunction = node => additionalTestBlockFunctions.includes((0, _utils2.getNodeName)(node) || '');
75
-
76
68
  return {
77
69
  CallExpression(node) {
78
70
  const jestFnCall = (0, _utils2.parseJestFnCall)(node, context);
79
-
80
71
  if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) === 'expect') {
81
72
  var _jestFnCall$head$node;
82
-
83
73
  if (((_jestFnCall$head$node = jestFnCall.head.node.parent) === null || _jestFnCall$head$node === void 0 ? void 0 : _jestFnCall$head$node.type) === _utils.AST_NODE_TYPES.MemberExpression && jestFnCall.members.length === 1 && !['assertions', 'hasAssertions'].includes((0, _utils2.getAccessorValue)(jestFnCall.members[0]))) {
84
74
  return;
85
75
  }
86
-
87
76
  const parent = callStack[callStack.length - 1];
88
-
89
77
  if (!parent || parent === _utils2.DescribeAlias.describe) {
90
78
  context.report({
91
79
  node,
92
80
  messageId: 'unexpectedExpect'
93
81
  });
94
82
  }
95
-
96
83
  return;
97
84
  }
98
-
99
85
  if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) === 'test' || isCustomTestBlockFunction(node)) {
100
86
  callStack.push('test');
101
87
  }
102
-
103
88
  if (node.callee.type === _utils.AST_NODE_TYPES.TaggedTemplateExpression) {
104
89
  callStack.push('template');
105
90
  }
106
91
  },
107
-
108
92
  'CallExpression:exit'(node) {
109
93
  const top = callStack[callStack.length - 1];
110
-
111
94
  if (top === 'test' && ((0, _utils2.isTypeOfJestFnCall)(node, context, ['test']) || isCustomTestBlockFunction(node)) && node.callee.type !== _utils.AST_NODE_TYPES.MemberExpression || top === 'template' && node.callee.type === _utils.AST_NODE_TYPES.TaggedTemplateExpression) {
112
95
  callStack.pop();
113
96
  }
114
97
  },
115
-
116
98
  BlockStatement(statement) {
117
99
  const blockType = getBlockType(statement, context);
118
-
119
100
  if (blockType) {
120
101
  callStack.push(blockType);
121
102
  }
122
103
  },
123
-
124
104
  'BlockStatement:exit'(statement) {
125
105
  if (callStack[callStack.length - 1] === getBlockType(statement, context)) {
126
106
  callStack.pop();
127
107
  }
128
108
  },
129
-
130
109
  ArrowFunctionExpression(node) {
131
110
  var _node$parent;
132
-
133
111
  if (((_node$parent = node.parent) === null || _node$parent === void 0 ? void 0 : _node$parent.type) !== _utils.AST_NODE_TYPES.CallExpression) {
134
112
  callStack.push('arrow');
135
113
  }
136
114
  },
137
-
138
115
  'ArrowFunctionExpression:exit'() {
139
116
  if (callStack[callStack.length - 1] === 'arrow') {
140
117
  callStack.pop();
141
118
  }
142
119
  }
143
-
144
120
  };
145
121
  }
146
-
147
122
  });
148
-
149
123
  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("@typescript-eslint/utils");
9
-
10
8
  var _utils2 = require("./utils");
11
-
12
9
  var _default = (0, _utils2.createRule)({
13
10
  name: __filename,
14
11
  meta: {
15
12
  docs: {
16
13
  category: 'Best Practices',
17
- description: 'Use `.only` and `.skip` over `f` and `x`',
14
+ description: 'Require using `.only` and `.skip` over `f` and `x`',
18
15
  recommended: 'error'
19
16
  },
20
17
  messages: {
@@ -25,20 +22,16 @@ var _default = (0, _utils2.createRule)({
25
22
  type: 'suggestion'
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) !== 'describe' && (jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'test') {
35
30
  return;
36
31
  }
37
-
38
32
  if (jestFnCall.name[0] !== 'f' && jestFnCall.name[0] !== 'x') {
39
33
  return;
40
34
  }
41
-
42
35
  const preferredNodeName = [jestFnCall.name.slice(1), jestFnCall.name[0] === 'f' ? 'only' : 'skip', ...jestFnCall.members.map(s => (0, _utils2.getAccessorValue)(s))].join('.');
43
36
  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;
44
37
  context.report({
@@ -47,17 +40,12 @@ var _default = (0, _utils2.createRule)({
47
40
  data: {
48
41
  preferredNodeName
49
42
  },
50
-
51
43
  fix(fixer) {
52
44
  return [fixer.replaceText(funcNode, preferredNodeName)];
53
45
  }
54
-
55
46
  });
56
47
  }
57
-
58
48
  };
59
49
  }
60
-
61
50
  });
62
-
63
51
  exports.default = _default;
@@ -4,21 +4,15 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _utils = require("@typescript-eslint/utils");
9
-
10
8
  var _utils2 = require("./utils");
11
-
12
9
  const getBody = args => {
13
10
  const [, secondArg] = args;
14
-
15
11
  if (secondArg && (0, _utils2.isFunction)(secondArg) && secondArg.body.type === _utils.AST_NODE_TYPES.BlockStatement) {
16
12
  return secondArg.body.body;
17
13
  }
18
-
19
14
  return [];
20
15
  };
21
-
22
16
  var _default = (0, _utils2.createRule)({
23
17
  name: __filename,
24
18
  meta: {
@@ -34,14 +28,12 @@ var _default = (0, _utils2.createRule)({
34
28
  type: 'suggestion'
35
29
  },
36
30
  defaultOptions: [],
37
-
38
31
  create(context) {
39
32
  return {
40
33
  CallExpression(node) {
41
34
  if (!(0, _utils2.isTypeOfJestFnCall)(node, context, ['test'])) {
42
35
  return;
43
36
  }
44
-
45
37
  const body = getBody(node.arguments);
46
38
  const returnStmt = body.find(t => t.type === _utils.AST_NODE_TYPES.ReturnStatement);
47
39
  if (!returnStmt) return;
@@ -50,7 +42,6 @@ var _default = (0, _utils2.createRule)({
50
42
  node: returnStmt
51
43
  });
52
44
  },
53
-
54
45
  FunctionDeclaration(node) {
55
46
  const declaredVariables = context.getDeclaredVariables(node);
56
47
  const testCallExpressions = (0, _utils2.getTestCallExpressionsFromDeclaredVariables)(declaredVariables, context);
@@ -62,10 +53,7 @@ var _default = (0, _utils2.createRule)({
62
53
  node: returnStmt
63
54
  });
64
55
  }
65
-
66
56
  };
67
57
  }
68
-
69
58
  });
70
-
71
59
  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,25 +20,20 @@ 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
  if (jestFnCall.modifiers.some(nod => (0, _utils.getAccessorValue)(nod) === 'not')) {
36
31
  return;
37
32
  }
38
-
39
33
  const {
40
34
  matcher
41
35
  } = jestFnCall;
42
36
  const matcherName = (0, _utils.getAccessorValue)(matcher);
43
-
44
37
  if (['toBeCalled', 'toHaveBeenCalled'].includes(matcherName)) {
45
38
  context.report({
46
39
  data: {
@@ -51,10 +44,7 @@ var _default = (0, _utils.createRule)({
51
44
  });
52
45
  }
53
46
  }
54
-
55
47
  };
56
48
  }
57
-
58
49
  });
59
-
60
50
  exports.default = _default;
@@ -4,57 +4,41 @@ 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 isString = node => {
13
10
  return (0, _utils2.isStringNode)(node) || node.type === _utils.AST_NODE_TYPES.TemplateLiteral;
14
11
  };
15
-
16
12
  const isComparingToString = expression => {
17
13
  return isString(expression.left) || isString(expression.right);
18
14
  };
19
-
20
15
  const invertOperator = operator => {
21
16
  switch (operator) {
22
17
  case '>':
23
18
  return '<=';
24
-
25
19
  case '<':
26
20
  return '>=';
27
-
28
21
  case '>=':
29
22
  return '<';
30
-
31
23
  case '<=':
32
24
  return '>';
33
25
  }
34
-
35
26
  return null;
36
27
  };
37
-
38
28
  const determineMatcher = (operator, negated) => {
39
29
  const op = negated ? invertOperator(operator) : operator;
40
-
41
30
  switch (op) {
42
31
  case '>':
43
32
  return 'toBeGreaterThan';
44
-
45
33
  case '<':
46
34
  return 'toBeLessThan';
47
-
48
35
  case '>=':
49
36
  return 'toBeGreaterThanOrEqual';
50
-
51
37
  case '<=':
52
38
  return 'toBeLessThanOrEqual';
53
39
  }
54
-
55
40
  return null;
56
41
  };
57
-
58
42
  var _default = (0, _utils2.createRule)({
59
43
  name: __filename,
60
44
  meta: {
@@ -71,24 +55,19 @@ var _default = (0, _utils2.createRule)({
71
55
  schema: []
72
56
  },
73
57
  defaultOptions: [],
74
-
75
58
  create(context) {
76
59
  return {
77
60
  CallExpression(node) {
78
61
  const jestFnCall = (0, _utils2.parseJestFnCall)(node, context);
79
-
80
62
  if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'expect' || jestFnCall.args.length === 0) {
81
63
  return;
82
64
  }
83
-
84
65
  const {
85
66
  parent: expect
86
67
  } = jestFnCall.head.node;
87
-
88
68
  if ((expect === null || expect === void 0 ? void 0 : expect.type) !== _utils.AST_NODE_TYPES.CallExpression) {
89
69
  return;
90
70
  }
91
-
92
71
  const {
93
72
  arguments: [comparison],
94
73
  range: [, expectCallEnd]
@@ -97,30 +76,29 @@ var _default = (0, _utils2.createRule)({
97
76
  matcher
98
77
  } = jestFnCall;
99
78
  const matcherArg = (0, _utils2.getFirstMatcherArg)(jestFnCall);
100
-
101
79
  if ((comparison === null || comparison === void 0 ? void 0 : comparison.type) !== _utils.AST_NODE_TYPES.BinaryExpression || isComparingToString(comparison) || !_utils2.EqualityMatcher.hasOwnProperty((0, _utils2.getAccessorValue)(matcher)) || !(0, _utils2.isBooleanLiteral)(matcherArg)) {
102
80
  return;
103
81
  }
104
-
105
82
  const [modifier] = jestFnCall.modifiers;
106
83
  const hasNot = jestFnCall.modifiers.some(nod => (0, _utils2.getAccessorValue)(nod) === 'not');
107
84
  const preferredMatcher = determineMatcher(comparison.operator, matcherArg.value === hasNot);
108
-
109
85
  if (!preferredMatcher) {
110
86
  return;
111
87
  }
112
-
113
88
  context.report({
114
89
  fix(fixer) {
115
- const sourceCode = context.getSourceCode(); // preserve the existing modifier if it's not a negation
90
+ const sourceCode = context.getSourceCode();
116
91
 
92
+ // preserve the existing modifier if it's not a negation
117
93
  const modifierText = modifier && (0, _utils2.getAccessorValue)(modifier) !== 'not' ? `.${(0, _utils2.getAccessorValue)(modifier)}` : '';
118
- return [// replace the comparison argument with the left-hand side of the comparison
119
- fixer.replaceText(comparison, sourceCode.getText(comparison.left)), // replace the current matcher & modifier with the preferred matcher
120
- fixer.replaceTextRange([expectCallEnd, matcher.parent.range[1]], `${modifierText}.${preferredMatcher}`), // replace the matcher argument with the right-hand side of the comparison
94
+ return [
95
+ // replace the comparison argument with the left-hand side of the comparison
96
+ fixer.replaceText(comparison, sourceCode.getText(comparison.left)),
97
+ // replace the current matcher & modifier with the preferred matcher
98
+ fixer.replaceTextRange([expectCallEnd, matcher.parent.range[1]], `${modifierText}.${preferredMatcher}`),
99
+ // replace the matcher argument with the right-hand side of the comparison
121
100
  fixer.replaceText(matcherArg, sourceCode.getText(comparison.right))];
122
101
  },
123
-
124
102
  messageId: 'useToBeComparison',
125
103
  data: {
126
104
  preferredMatcher
@@ -128,10 +106,7 @@ var _default = (0, _utils2.createRule)({
128
106
  node: matcher
129
107
  });
130
108
  }
131
-
132
109
  };
133
110
  }
134
-
135
111
  });
136
-
137
112
  exports.default = _default;