eslint-plugin-jest 22.15.0 → 22.17.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.
Files changed (51) hide show
  1. package/README.md +42 -40
  2. package/docs/rules/prefer-to-be-null.md +7 -2
  3. package/docs/rules/prefer-to-be-undefined.md +7 -2
  4. package/docs/rules/prefer-to-contain.md +8 -10
  5. package/docs/rules/prefer-to-have-length.md +7 -3
  6. package/docs/rules/require-top-level-describe.md +52 -0
  7. package/lib/__tests__/rules.test.js +5 -4
  8. package/lib/index.js +2 -3
  9. package/lib/rules/consistent-test-it.js +7 -7
  10. package/lib/rules/expect-expect.js +3 -3
  11. package/lib/rules/lowercase-name.js +3 -3
  12. package/lib/rules/no-alias-methods.js +18 -14
  13. package/lib/rules/no-commented-out-tests.js +2 -2
  14. package/lib/rules/no-disabled-tests.js +4 -4
  15. package/lib/rules/no-duplicate-hooks.js +5 -5
  16. package/lib/rules/no-empty-title.js +8 -14
  17. package/lib/rules/no-expect-resolves.js +3 -3
  18. package/lib/rules/no-export.js +3 -3
  19. package/lib/rules/no-focused-tests.js +4 -4
  20. package/lib/rules/no-hooks.js +3 -3
  21. package/lib/rules/no-identical-title.js +9 -9
  22. package/lib/rules/no-if.js +5 -5
  23. package/lib/rules/no-jasmine-globals.js +4 -4
  24. package/lib/rules/no-jest-import.js +2 -2
  25. package/lib/rules/no-large-snapshots.js +25 -18
  26. package/lib/rules/no-mocks-import.js +18 -7
  27. package/lib/rules/no-standalone-expect.js +8 -8
  28. package/lib/rules/no-test-callback.js +5 -5
  29. package/lib/rules/no-test-prefixes.js +4 -4
  30. package/lib/rules/no-test-return-statement.js +4 -4
  31. package/lib/rules/no-truthy-falsy.js +31 -19
  32. package/lib/rules/no-try-expect.js +5 -5
  33. package/lib/rules/prefer-called-with.js +23 -11
  34. package/lib/rules/prefer-expect-assertions.js +45 -34
  35. package/lib/rules/prefer-inline-snapshots.js +2 -2
  36. package/lib/rules/prefer-spy-on.js +4 -4
  37. package/lib/rules/prefer-strict-equal.js +10 -12
  38. package/lib/rules/prefer-to-be-null.js +34 -16
  39. package/lib/rules/prefer-to-be-undefined.js +34 -16
  40. package/lib/rules/prefer-to-contain.js +112 -51
  41. package/lib/rules/prefer-to-have-length.js +47 -14
  42. package/lib/rules/prefer-todo.js +13 -17
  43. package/lib/rules/require-top-level-describe.js +66 -0
  44. package/lib/rules/require-tothrow-message.js +20 -15
  45. package/lib/rules/utils.js +486 -0
  46. package/lib/rules/valid-describe.js +36 -44
  47. package/lib/rules/valid-expect-in-promise.js +71 -66
  48. package/lib/rules/valid-expect.js +140 -173
  49. package/package.json +6 -5
  50. package/lib/rules/tsUtils.js +0 -250
  51. package/lib/rules/util.js +0 -100
@@ -7,17 +7,17 @@ exports.default = void 0;
7
7
 
8
8
  var _experimentalUtils = require("@typescript-eslint/experimental-utils");
9
9
 
10
- var _tsUtils = require("./tsUtils");
10
+ var _utils = require("./utils");
11
11
 
12
12
  function isIdentifierResolves(node) {
13
13
  return node.property.type === _experimentalUtils.AST_NODE_TYPES.Identifier && node.property.name === 'resolves';
14
14
  }
15
15
 
16
16
  function isExpectResolves(node) {
17
- return (0, _tsUtils.isExpectCall)(node.object) && isIdentifierResolves(node);
17
+ return (0, _utils.isExpectCall)(node.object) && isIdentifierResolves(node);
18
18
  }
19
19
 
20
- var _default = (0, _tsUtils.createRule)({
20
+ var _default = (0, _utils.createRule)({
21
21
  name: __filename,
22
22
  meta: {
23
23
  docs: {
@@ -7,9 +7,9 @@ exports.default = void 0;
7
7
 
8
8
  var _experimentalUtils = require("@typescript-eslint/experimental-utils");
9
9
 
10
- var _tsUtils = require("./tsUtils");
10
+ var _utils = require("./utils");
11
11
 
12
- var _default = (0, _tsUtils.createRule)({
12
+ var _default = (0, _utils.createRule)({
13
13
  name: __filename,
14
14
  meta: {
15
15
  docs: {
@@ -42,7 +42,7 @@ var _default = (0, _tsUtils.createRule)({
42
42
  },
43
43
 
44
44
  CallExpression(node) {
45
- if ((0, _tsUtils.isTestCase)(node)) {
45
+ if ((0, _utils.isTestCase)(node)) {
46
46
  hasTestCase = true;
47
47
  }
48
48
  },
@@ -7,19 +7,19 @@ exports.default = void 0;
7
7
 
8
8
  var _experimentalUtils = require("@typescript-eslint/experimental-utils");
9
9
 
10
- var _tsUtils = require("./tsUtils");
10
+ var _utils = require("./utils");
11
11
 
12
12
  const testFunctions = new Set(['describe', 'it', 'test']);
13
13
 
14
- const matchesTestFunction = object => object && 'name' in object && (object.name in _tsUtils.TestCaseName || object.name in _tsUtils.DescribeAlias);
14
+ const matchesTestFunction = object => object && 'name' in object && (object.name in _utils.TestCaseName || object.name in _utils.DescribeAlias);
15
15
 
16
- const isCallToFocusedTestFunction = object => object && object.name[0] === 'f' && testFunctions.has(object.name.substring(1));
16
+ const isCallToFocusedTestFunction = object => object && object.name.startsWith('f') && testFunctions.has(object.name.substring(1));
17
17
 
18
18
  const isPropertyNamedOnly = property => property && ('name' in property && property.name === 'only' || 'value' in property && property.value === 'only');
19
19
 
20
20
  const isCallToTestOnlyFunction = callee => matchesTestFunction(callee.object) && isPropertyNamedOnly(callee.property);
21
21
 
22
- var _default = (0, _tsUtils.createRule)({
22
+ var _default = (0, _utils.createRule)({
23
23
  name: __filename,
24
24
  meta: {
25
25
  docs: {
@@ -5,9 +5,9 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
- var _tsUtils = require("./tsUtils");
8
+ var _utils = require("./utils");
9
9
 
10
- var _default = (0, _tsUtils.createRule)({
10
+ var _default = (0, _utils.createRule)({
11
11
  name: __filename,
12
12
  meta: {
13
13
  docs: {
@@ -46,7 +46,7 @@ var _default = (0, _tsUtils.createRule)({
46
46
 
47
47
  return {
48
48
  CallExpression(node) {
49
- if ((0, _tsUtils.isHook)(node) && !isWhitelisted(node)) {
49
+ if ((0, _utils.isHook)(node) && !isWhitelisted(node)) {
50
50
  context.report({
51
51
  node,
52
52
  messageId: 'unexpectedHook',
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
- var _tsUtils = require("./tsUtils");
8
+ var _utils = require("./utils");
9
9
 
10
10
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
11
11
 
@@ -20,7 +20,7 @@ const newDescribeContext = () => ({
20
20
  testTitles: []
21
21
  });
22
22
 
23
- var _default = (0, _tsUtils.createRule)({
23
+ var _default = (0, _utils.createRule)({
24
24
  name: __filename,
25
25
  meta: {
26
26
  docs: {
@@ -43,20 +43,20 @@ var _default = (0, _tsUtils.createRule)({
43
43
  CallExpression(node) {
44
44
  const currentLayer = contexts[contexts.length - 1];
45
45
 
46
- if ((0, _tsUtils.isDescribe)(node)) {
46
+ if ((0, _utils.isDescribe)(node)) {
47
47
  contexts.push(newDescribeContext());
48
48
  }
49
49
 
50
50
  const _node$arguments = _slicedToArray(node.arguments, 1),
51
- firstArgument = _node$arguments[0];
51
+ argument = _node$arguments[0];
52
52
 
53
- if (!(0, _tsUtils.isStringNode)(firstArgument) || (0, _tsUtils.isTemplateLiteral)(firstArgument) && (0, _tsUtils.hasExpressions)(firstArgument)) {
53
+ if (!argument || !(0, _utils.isStringNode)(argument) || (0, _utils.isTemplateLiteral)(argument) && argument.expressions.length > 0) {
54
54
  return;
55
55
  }
56
56
 
57
- const title = (0, _tsUtils.getStringValue)(firstArgument);
57
+ const title = (0, _utils.getAccessorValue)(argument);
58
58
 
59
- if ((0, _tsUtils.isTestCase)(node)) {
59
+ if ((0, _utils.isTestCase)(node)) {
60
60
  if (currentLayer.testTitles.includes(title)) {
61
61
  context.report({
62
62
  messageId: 'multipleTestTitle',
@@ -67,7 +67,7 @@ var _default = (0, _tsUtils.createRule)({
67
67
  currentLayer.testTitles.push(title);
68
68
  }
69
69
 
70
- if (!(0, _tsUtils.isDescribe)(node)) {
70
+ if (!(0, _utils.isDescribe)(node)) {
71
71
  return;
72
72
  }
73
73
 
@@ -82,7 +82,7 @@ var _default = (0, _tsUtils.createRule)({
82
82
  },
83
83
 
84
84
  'CallExpression:exit'(node) {
85
- if ((0, _tsUtils.isDescribe)(node)) {
85
+ if ((0, _utils.isDescribe)(node)) {
86
86
  contexts.pop();
87
87
  }
88
88
  }
@@ -5,15 +5,15 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
- var _tsUtils = require("./tsUtils");
8
+ var _utils = require("./utils");
9
9
 
10
10
  var _experimentalUtils = require("@typescript-eslint/experimental-utils");
11
11
 
12
- const testCaseNames = new Set([...Object.keys(_tsUtils.TestCaseName), 'it.only', 'it.skip', 'test.only', 'test.skip']);
12
+ const testCaseNames = new Set([...Object.keys(_utils.TestCaseName), 'it.only', 'it.skip', 'test.only', 'test.skip']);
13
13
 
14
- const isTestArrowFunction = node => node.parent !== undefined && node.parent.type === _experimentalUtils.AST_NODE_TYPES.CallExpression && testCaseNames.has((0, _tsUtils.getNodeName)(node.parent.callee));
14
+ const isTestArrowFunction = node => node.parent !== undefined && node.parent.type === _experimentalUtils.AST_NODE_TYPES.CallExpression && testCaseNames.has((0, _utils.getNodeName)(node.parent.callee));
15
15
 
16
- var _default = (0, _tsUtils.createRule)({
16
+ var _default = (0, _utils.createRule)({
17
17
  name: __filename,
18
18
  meta: {
19
19
  docs: {
@@ -49,7 +49,7 @@ var _default = (0, _tsUtils.createRule)({
49
49
 
50
50
  return {
51
51
  CallExpression(node) {
52
- stack.push((0, _tsUtils.isTestCase)(node));
52
+ stack.push((0, _utils.isTestCase)(node));
53
53
  },
54
54
 
55
55
  FunctionExpression() {
@@ -7,9 +7,9 @@ exports.default = void 0;
7
7
 
8
8
  var _experimentalUtils = require("@typescript-eslint/experimental-utils");
9
9
 
10
- var _tsUtils = require("./tsUtils");
10
+ var _utils = require("./utils");
11
11
 
12
- var _default = (0, _tsUtils.createRule)({
12
+ var _default = (0, _utils.createRule)({
13
13
  name: __filename,
14
14
  meta: {
15
15
  docs: {
@@ -34,14 +34,14 @@ var _default = (0, _tsUtils.createRule)({
34
34
  return {
35
35
  CallExpression(node) {
36
36
  const callee = node.callee;
37
- const calleeName = (0, _tsUtils.getNodeName)(callee);
37
+ const calleeName = (0, _utils.getNodeName)(callee);
38
38
 
39
39
  if (!calleeName) {
40
40
  return;
41
41
  }
42
42
 
43
43
  if (calleeName === 'spyOn' || calleeName === 'spyOnProperty' || calleeName === 'fail' || calleeName === 'pending') {
44
- if ((0, _tsUtils.scopeHasLocalReference)(context.getScope(), calleeName)) {
44
+ if ((0, _utils.scopeHasLocalReference)(context.getScope(), calleeName)) {
45
45
  // It's a local variable, not a jasmine global.
46
46
  return;
47
47
  }
@@ -5,9 +5,9 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
- var _tsUtils = require("./tsUtils");
8
+ var _utils = require("./utils");
9
9
 
10
- var _default = (0, _tsUtils.createRule)({
10
+ var _default = (0, _utils.createRule)({
11
11
  name: __filename,
12
12
  meta: {
13
13
  type: 'problem',
@@ -5,17 +5,20 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
+ var _experimentalUtils = require("@typescript-eslint/experimental-utils");
9
+
8
10
  var _path = require("path");
9
11
 
10
- var _util = require("./util");
12
+ var _utils = require("./utils");
11
13
 
12
- const reportOnViolation = (context, node) => {
13
- const lineLimit = context.options[0] && Number.isFinite(context.options[0].maxSize) ? context.options[0].maxSize : 50;
14
+ const reportOnViolation = (context, node, {
15
+ maxSize: lineLimit = 50,
16
+ whitelistedSnapshots = {}
17
+ }) => {
14
18
  const startLine = node.loc.start.line;
15
19
  const endLine = node.loc.end.line;
16
20
  const lineCount = endLine - startLine;
17
- const whitelistedSnapshots = context.options && context.options[0] && context.options[0].whitelistedSnapshots;
18
- const allPathsAreAbsolute = Object.keys(whitelistedSnapshots || {}).every(_path.isAbsolute);
21
+ const allPathsAreAbsolute = Object.keys(whitelistedSnapshots).every(_path.isAbsolute);
19
22
 
20
23
  if (!allPathsAreAbsolute) {
21
24
  throw new Error('All paths for whitelistedSnapshots must be absolute. You can use JS config and `path.resolve`');
@@ -23,18 +26,18 @@ const reportOnViolation = (context, node) => {
23
26
 
24
27
  let isWhitelisted = false;
25
28
 
26
- if (whitelistedSnapshots) {
29
+ if (whitelistedSnapshots && node.type === _experimentalUtils.AST_NODE_TYPES.ExpressionStatement && 'left' in node.expression && (0, _utils.isExpectMember)(node.expression.left)) {
27
30
  const fileName = context.getFilename();
28
31
  const whitelistedSnapshotsInFile = whitelistedSnapshots[fileName];
29
32
 
30
33
  if (whitelistedSnapshotsInFile) {
31
- const snapshotName = (0, _util.getStringValue)(node.expression.left.property);
34
+ const snapshotName = (0, _utils.getAccessorValue)(node.expression.left.property);
32
35
  isWhitelisted = whitelistedSnapshotsInFile.some(name => {
33
- if (name.test && typeof name.test === 'function') {
36
+ if (name instanceof RegExp) {
34
37
  return name.test(snapshotName);
35
38
  }
36
39
 
37
- return name === snapshotName;
40
+ return snapshotName;
38
41
  });
39
42
  }
40
43
  }
@@ -51,15 +54,19 @@ const reportOnViolation = (context, node) => {
51
54
  }
52
55
  };
53
56
 
54
- var _default = {
57
+ var _default = (0, _utils.createRule)({
58
+ name: __filename,
55
59
  meta: {
56
60
  docs: {
57
- url: (0, _util.getDocsUrl)(__filename)
61
+ category: 'Best Practices',
62
+ description: 'disallow large snapshots',
63
+ recommended: false
58
64
  },
59
65
  messages: {
60
66
  noSnapshot: '`{{ lineCount }}`s should begin with lowercase',
61
67
  tooLongSnapshots: 'Expected Jest snapshot to be smaller than {{ lineLimit }} lines but was {{ lineCount }} lines long'
62
68
  },
69
+ type: 'suggestion',
63
70
  schema: [{
64
71
  type: 'object',
65
72
  properties: {
@@ -78,22 +85,21 @@ var _default = {
78
85
  additionalProperties: false
79
86
  }]
80
87
  },
88
+ defaultOptions: [{}],
81
89
 
82
- create(context) {
90
+ create(context, [options]) {
83
91
  if (context.getFilename().endsWith('.snap')) {
84
92
  return {
85
93
  ExpressionStatement(node) {
86
- reportOnViolation(context, node);
94
+ reportOnViolation(context, node, options);
87
95
  }
88
96
 
89
97
  };
90
98
  } else if (context.getFilename().endsWith('.js')) {
91
99
  return {
92
100
  CallExpression(node) {
93
- const propertyName = node.callee.property && node.callee.property.name;
94
-
95
- if (propertyName === 'toMatchInlineSnapshot' || propertyName === 'toThrowErrorMatchingInlineSnapshot') {
96
- reportOnViolation(context, node);
101
+ if ('property' in node.callee && ((0, _utils.isSupportedAccessor)(node.callee.property, 'toMatchInlineSnapshot') || (0, _utils.isSupportedAccessor)(node.callee.property, 'toThrowErrorMatchingInlineSnapshot'))) {
102
+ reportOnViolation(context, node, options);
97
103
  }
98
104
  }
99
105
 
@@ -103,5 +109,6 @@ var _default = {
103
109
  return {};
104
110
  }
105
111
 
106
- };
112
+ });
113
+
107
114
  exports.default = _default;
@@ -7,21 +7,29 @@ exports.default = void 0;
7
7
 
8
8
  var _path = require("path");
9
9
 
10
- var _tsUtils = require("./tsUtils");
10
+ var _utils = require("./utils");
11
+
12
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
13
+
14
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
15
+
16
+ function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
17
+
18
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
11
19
 
12
20
  const mocksDirName = '__mocks__';
13
21
 
14
22
  const isMockPath = path => path.split(_path.posix.sep).includes(mocksDirName);
15
23
 
16
- const isMockImportLiteral = expression => expression !== undefined && (0, _tsUtils.isLiteralNode)(expression) && typeof expression.value === 'string' && isMockPath(expression.value);
24
+ const isMockImportLiteral = expression => (0, _utils.isStringNode)(expression) && isMockPath((0, _utils.getStringValue)(expression));
17
25
 
18
- var _default = (0, _tsUtils.createRule)({
26
+ var _default = (0, _utils.createRule)({
19
27
  name: __filename,
20
28
  meta: {
21
29
  type: 'problem',
22
30
  docs: {
23
- description: 'When using `jest.mock`, your tests (just like the code being tested) should import from `./x`, not `./__mocks__/x`. Not following this rule can lead to confusion, because you will have multiple instances of the mocked module',
24
31
  category: 'Best Practices',
32
+ description: 'When using `jest.mock`, your tests (just like the code being tested) should import from `./x`, not `./__mocks__/x`. Not following this rule can lead to confusion, because you will have multiple instances of the mocked module',
25
33
  recommended: 'error'
26
34
  },
27
35
  messages: {
@@ -34,7 +42,7 @@ var _default = (0, _tsUtils.createRule)({
34
42
  create(context) {
35
43
  return {
36
44
  ImportDeclaration(node) {
37
- if (isMockImportLiteral(node.source)) {
45
+ if (node.source && isMockImportLiteral(node.source)) {
38
46
  context.report({
39
47
  node,
40
48
  messageId: 'noManualImport'
@@ -43,9 +51,12 @@ var _default = (0, _tsUtils.createRule)({
43
51
  },
44
52
 
45
53
  'CallExpression[callee.name="require"]'(node) {
46
- if (isMockImportLiteral(node.arguments[0])) {
54
+ const _node$arguments = _slicedToArray(node.arguments, 1),
55
+ arg = _node$arguments[0];
56
+
57
+ if (arg && isMockImportLiteral(arg)) {
47
58
  context.report({
48
- node: node.arguments[0],
59
+ node: arg,
49
60
  messageId: 'noManualImport'
50
61
  });
51
62
  }
@@ -7,7 +7,7 @@ exports.default = void 0;
7
7
 
8
8
  var _experimentalUtils = require("@typescript-eslint/experimental-utils");
9
9
 
10
- var _tsUtils = require("./tsUtils");
10
+ var _utils = require("./utils");
11
11
 
12
12
  const getBlockType = stmt => {
13
13
  const func = stmt.parent;
@@ -22,7 +22,7 @@ const getBlockType = stmt => {
22
22
  return 'function';
23
23
  }
24
24
 
25
- if ((0, _tsUtils.isFunction)(func) && func.parent) {
25
+ if ((0, _utils.isFunction)(func) && func.parent) {
26
26
  const expr = func.parent; // arrowfunction or function expr
27
27
 
28
28
  if (expr.type === _experimentalUtils.AST_NODE_TYPES.VariableDeclarator) {
@@ -30,7 +30,7 @@ const getBlockType = stmt => {
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 === _experimentalUtils.AST_NODE_TYPES.CallExpression && (0, _tsUtils.isDescribe)(expr)) {
33
+ if (expr.type === _experimentalUtils.AST_NODE_TYPES.CallExpression && (0, _utils.isDescribe)(expr)) {
34
34
  return 'describe';
35
35
  }
36
36
  }
@@ -39,14 +39,14 @@ const getBlockType = stmt => {
39
39
  };
40
40
 
41
41
  const isEach = node => {
42
- if (node && node.callee && node.callee.type === _experimentalUtils.AST_NODE_TYPES.CallExpression && node.callee.callee && node.callee.callee.type === _experimentalUtils.AST_NODE_TYPES.MemberExpression && node.callee.callee.property && node.callee.callee.property.type === _experimentalUtils.AST_NODE_TYPES.Identifier && node.callee.callee.property.name === 'each' && node.callee.callee.object && node.callee.callee.object.type === _experimentalUtils.AST_NODE_TYPES.Identifier && _tsUtils.TestCaseName.hasOwnProperty(node.callee.callee.object.name)) {
42
+ if (node && node.callee && node.callee.type === _experimentalUtils.AST_NODE_TYPES.CallExpression && node.callee.callee && node.callee.callee.type === _experimentalUtils.AST_NODE_TYPES.MemberExpression && node.callee.callee.property && node.callee.callee.property.type === _experimentalUtils.AST_NODE_TYPES.Identifier && node.callee.callee.property.name === 'each' && node.callee.callee.object && node.callee.callee.object.type === _experimentalUtils.AST_NODE_TYPES.Identifier && _utils.TestCaseName.hasOwnProperty(node.callee.callee.object.name)) {
43
43
  return true;
44
44
  }
45
45
 
46
46
  return false;
47
47
  };
48
48
 
49
- var _default = (0, _tsUtils.createRule)({
49
+ var _default = (0, _utils.createRule)({
50
50
  name: __filename,
51
51
  meta: {
52
52
  docs: {
@@ -66,7 +66,7 @@ var _default = (0, _tsUtils.createRule)({
66
66
  const callStack = [];
67
67
  return {
68
68
  CallExpression(node) {
69
- if ((0, _tsUtils.isExpectCall)(node)) {
69
+ if ((0, _utils.isExpectCall)(node)) {
70
70
  const parent = callStack[callStack.length - 1];
71
71
 
72
72
  if (!parent || parent === 'describe') {
@@ -79,7 +79,7 @@ var _default = (0, _tsUtils.createRule)({
79
79
  return;
80
80
  }
81
81
 
82
- if ((0, _tsUtils.isTestCase)(node)) {
82
+ if ((0, _utils.isTestCase)(node)) {
83
83
  callStack.push('test');
84
84
  }
85
85
 
@@ -91,7 +91,7 @@ var _default = (0, _tsUtils.createRule)({
91
91
  'CallExpression:exit'(node) {
92
92
  const top = callStack[callStack.length - 1];
93
93
 
94
- if (((0, _tsUtils.isTestCase)(node) && node.callee.type !== _experimentalUtils.AST_NODE_TYPES.MemberExpression || isEach(node)) && top === 'test' || node.callee.type === _experimentalUtils.AST_NODE_TYPES.TaggedTemplateExpression && top === 'template') {
94
+ if (((0, _utils.isTestCase)(node) && node.callee.type !== _experimentalUtils.AST_NODE_TYPES.MemberExpression || isEach(node)) && top === 'test' || node.callee.type === _experimentalUtils.AST_NODE_TYPES.TaggedTemplateExpression && top === 'template') {
95
95
  callStack.pop();
96
96
  }
97
97
  },
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
- var _tsUtils = require("./tsUtils");
8
+ var _utils = require("./utils");
9
9
 
10
10
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
11
11
 
@@ -15,7 +15,7 @@ function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d =
15
15
 
16
16
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
17
17
 
18
- var _default = (0, _tsUtils.createRule)({
18
+ var _default = (0, _utils.createRule)({
19
19
  name: __filename,
20
20
  meta: {
21
21
  docs: {
@@ -35,14 +35,14 @@ var _default = (0, _tsUtils.createRule)({
35
35
  create(context) {
36
36
  return {
37
37
  CallExpression(node) {
38
- if (!(0, _tsUtils.isTestCase)(node) || node.arguments.length !== 2) {
38
+ if (!(0, _utils.isTestCase)(node) || node.arguments.length !== 2) {
39
39
  return;
40
40
  }
41
41
 
42
42
  const _node$arguments = _slicedToArray(node.arguments, 2),
43
43
  callback = _node$arguments[1];
44
44
 
45
- if (!(0, _tsUtils.isFunction)(callback) || callback.params.length !== 1) {
45
+ if (!(0, _utils.isFunction)(callback) || callback.params.length !== 1) {
46
46
  return;
47
47
  }
48
48
 
@@ -55,7 +55,7 @@ var _default = (0, _tsUtils.createRule)({
55
55
 
56
56
  fix(fixer) {
57
57
  const body = callback.body;
58
- /* istanbul ignore if */
58
+ /* istanbul ignore if https://github.com/typescript-eslint/typescript-eslint/issues/734 */
59
59
 
60
60
  if (!body) {
61
61
  throw new Error(`Unexpected null when attempting to fix ${context.getFilename()} - please file a github issue at https://github.com/jest-community/eslint-plugin-jest`);
@@ -5,9 +5,9 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
- var _tsUtils = require("./tsUtils");
8
+ var _utils = require("./utils");
9
9
 
10
- var _default = (0, _tsUtils.createRule)({
10
+ var _default = (0, _utils.createRule)({
11
11
  name: __filename,
12
12
  meta: {
13
13
  docs: {
@@ -27,8 +27,8 @@ var _default = (0, _tsUtils.createRule)({
27
27
  create(context) {
28
28
  return {
29
29
  CallExpression(node) {
30
- const nodeName = (0, _tsUtils.getNodeName)(node.callee);
31
- if (!nodeName || !(0, _tsUtils.isDescribe)(node) && !(0, _tsUtils.isTestCase)(node)) return;
30
+ const nodeName = (0, _utils.getNodeName)(node.callee);
31
+ if (!nodeName || !(0, _utils.isDescribe)(node) && !(0, _utils.isTestCase)(node)) return;
32
32
  const preferredNodeName = getPreferredNodeName(nodeName);
33
33
  if (!preferredNodeName) return;
34
34
  context.report({
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
- var _tsUtils = require("./tsUtils");
8
+ var _utils = require("./utils");
9
9
 
10
10
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
11
11
 
@@ -22,14 +22,14 @@ const getBody = args => {
22
22
  const _args = _slicedToArray(args, 2),
23
23
  secondArg = _args[1];
24
24
 
25
- if (secondArg && (0, _tsUtils.isFunction)(secondArg) && secondArg.body && secondArg.body.type === BLOCK_STATEMENT) {
25
+ if (secondArg && (0, _utils.isFunction)(secondArg) && secondArg.body && secondArg.body.type === BLOCK_STATEMENT) {
26
26
  return secondArg.body.body;
27
27
  }
28
28
 
29
29
  return [];
30
30
  };
31
31
 
32
- var _default = (0, _tsUtils.createRule)({
32
+ var _default = (0, _utils.createRule)({
33
33
  name: __filename,
34
34
  meta: {
35
35
  docs: {
@@ -48,7 +48,7 @@ var _default = (0, _tsUtils.createRule)({
48
48
  create(context) {
49
49
  return {
50
50
  CallExpression(node) {
51
- if (!(0, _tsUtils.isTestCase)(node)) return;
51
+ if (!(0, _utils.isTestCase)(node)) return;
52
52
  const body = getBody(node.arguments);
53
53
  const returnStmt = body.find(t => t.type === RETURN_STATEMENT);
54
54
  if (!returnStmt) return;
@@ -5,41 +5,53 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
- var _util = require("./util");
8
+ var _utils = require("./utils");
9
9
 
10
- var _default = {
10
+ // todo: refactor into "ban-matchers"
11
+ var _default = (0, _utils.createRule)({
12
+ name: __filename,
11
13
  meta: {
12
14
  docs: {
13
- url: (0, _util.getDocsUrl)(__filename)
15
+ category: 'Best Practices',
16
+ description: 'Disallow using `toBeTruthy()` & `toBeFalsy()`',
17
+ recommended: false
14
18
  },
15
19
  messages: {
16
- avoidMessage: 'Avoid {{methodName}}'
20
+ avoidMessage: 'Avoid {{ methodName }}'
17
21
  },
22
+ type: 'suggestion',
18
23
  schema: []
19
24
  },
25
+ defaultOptions: [],
20
26
 
21
27
  create(context) {
22
28
  return {
23
29
  CallExpression(node) {
24
- if ((0, _util.expectCaseWithParent)(node) || (0, _util.expectNotCase)(node) || (0, _util.expectResolvesCase)(node) || (0, _util.expectRejectsCase)(node)) {
25
- const targetNode = node.parent.parent.type === 'MemberExpression' ? node.parent : node;
26
- const methodNode = (0, _util.method)(targetNode);
27
- const methodName = methodNode.name;
28
-
29
- if (methodName === 'toBeTruthy' || methodName === 'toBeFalsy') {
30
- context.report({
31
- data: {
32
- methodName
33
- },
34
- messageId: 'avoidMessage',
35
- node: methodNode
36
- });
37
- }
30
+ if (!(0, _utils.isExpectCall)(node)) {
31
+ return;
38
32
  }
33
+
34
+ const _parseExpectCall = (0, _utils.parseExpectCall)(node),
35
+ matcher = _parseExpectCall.matcher;
36
+
37
+ if (!matcher || !['toBeTruthy', 'toBeFalsy'].includes(matcher.name)) {
38
+ return;
39
+ }
40
+
41
+ context.report({
42
+ data: {
43
+ methodName: matcher.name
44
+ },
45
+ // todo: rename to 'matcherName'
46
+ messageId: 'avoidMessage',
47
+ // todo: rename to 'avoidMatcher'
48
+ node: matcher.node.property
49
+ });
39
50
  }
40
51
 
41
52
  };
42
53
  }
43
54
 
44
- };
55
+ });
56
+
45
57
  exports.default = _default;