eslint-plugin-jest 26.8.7 → 27.1.6

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 +20 -47
  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 +14 -60
  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 +12 -37
  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 +14 -47
  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,20 +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 parseJestVersion = rawVersion => {
13
10
  if (typeof rawVersion === 'number') {
14
11
  return rawVersion;
15
12
  }
16
-
17
13
  const [majorVersion] = rawVersion.split('.');
18
14
  return parseInt(majorVersion, 10);
19
15
  };
20
-
21
16
  var _default = (0, _utils2.createRule)({
22
17
  name: __filename,
23
18
  meta: {
@@ -34,12 +29,11 @@ var _default = (0, _utils2.createRule)({
34
29
  fixable: 'code'
35
30
  },
36
31
  defaultOptions: [],
37
-
38
32
  create(context) {
39
33
  var _context$settings, _context$settings$jes;
40
-
41
34
  const jestVersion = parseJestVersion(((_context$settings = context.settings) === null || _context$settings === void 0 ? void 0 : (_context$settings$jes = _context$settings.jest) === null || _context$settings$jes === void 0 ? void 0 : _context$settings$jes.version) || (0, _utils2.detectJestVersion)());
42
- const deprecations = { ...(jestVersion >= 15 && {
35
+ const deprecations = {
36
+ ...(jestVersion >= 15 && {
43
37
  'jest.resetModuleRegistry': 'jest.resetModules'
44
38
  }),
45
39
  ...(jestVersion >= 17 && {
@@ -61,13 +55,10 @@ var _default = (0, _utils2.createRule)({
61
55
  if (node.callee.type !== _utils.AST_NODE_TYPES.MemberExpression) {
62
56
  return;
63
57
  }
64
-
65
58
  const deprecation = (0, _utils2.getNodeName)(node);
66
-
67
59
  if (!deprecation || !(deprecation in deprecations)) {
68
60
  return;
69
61
  }
70
-
71
62
  const replacement = deprecations[deprecation];
72
63
  const {
73
64
  callee
@@ -79,23 +70,16 @@ var _default = (0, _utils2.createRule)({
79
70
  replacement
80
71
  },
81
72
  node,
82
-
83
73
  fix(fixer) {
84
74
  let [name, func] = replacement.split('.');
85
-
86
75
  if (callee.property.type === _utils.AST_NODE_TYPES.Literal) {
87
76
  func = `'${func}'`;
88
77
  }
89
-
90
78
  return [fixer.replaceText(callee.object, name), fixer.replaceText(callee.property, func)];
91
79
  }
92
-
93
80
  });
94
81
  }
95
-
96
82
  };
97
83
  }
98
-
99
84
  });
100
-
101
85
  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: {
@@ -27,25 +25,20 @@ var _default = (0, _utils.createRule)({
27
25
  type: 'suggestion'
28
26
  },
29
27
  defaultOptions: [],
30
-
31
28
  create(context) {
32
29
  let suiteDepth = 0;
33
30
  let testDepth = 0;
34
31
  return {
35
32
  CallExpression(node) {
36
33
  const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
37
-
38
34
  if (!jestFnCall) {
39
35
  return;
40
36
  }
41
-
42
37
  if (jestFnCall.type === 'describe') {
43
38
  suiteDepth++;
44
39
  }
45
-
46
40
  if (jestFnCall.type === 'test') {
47
41
  testDepth++;
48
-
49
42
  if (node.arguments.length < 2 && jestFnCall.members.every(s => (0, _utils.getAccessorValue)(s) !== 'todo')) {
50
43
  context.report({
51
44
  messageId: 'missingFunction',
@@ -53,8 +46,8 @@ var _default = (0, _utils.createRule)({
53
46
  });
54
47
  }
55
48
  }
56
-
57
- if ( // the only jest functions that are with "x" are "xdescribe", "xtest", and "xit"
49
+ if (
50
+ // the only jest functions that are with "x" are "xdescribe", "xtest", and "xit"
58
51
  jestFnCall.name.startsWith('x') || jestFnCall.members.some(s => (0, _utils.getAccessorValue)(s) === 'skip')) {
59
52
  context.report({
60
53
  messageId: jestFnCall.type === 'describe' ? 'disabledSuite' : 'disabledTest',
@@ -62,28 +55,22 @@ var _default = (0, _utils.createRule)({
62
55
  });
63
56
  }
64
57
  },
65
-
66
58
  'CallExpression:exit'(node) {
67
59
  const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
68
-
69
60
  if (!jestFnCall) {
70
61
  return;
71
62
  }
72
-
73
63
  if (jestFnCall.type === 'describe') {
74
64
  suiteDepth--;
75
65
  }
76
-
77
66
  if (jestFnCall.type === 'test') {
78
67
  testDepth--;
79
68
  }
80
69
  },
81
-
82
70
  'CallExpression[callee.name="pending"]'(node) {
83
- if ((0, _utils.scopeHasLocalReference)(context.getScope(), 'pending')) {
71
+ if ((0, _utils.resolveScope)(context.getScope(), 'pending')) {
84
72
  return;
85
73
  }
86
-
87
74
  if (testDepth > 0) {
88
75
  context.report({
89
76
  messageId: 'pendingTest',
@@ -101,10 +88,7 @@ var _default = (0, _utils.createRule)({
101
88
  });
102
89
  }
103
90
  }
104
-
105
91
  };
106
92
  }
107
-
108
93
  });
109
-
110
94
  exports.default = _default;
@@ -4,37 +4,28 @@ 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 findCallbackArg = (node, isJestEach, context) => {
13
10
  if (isJestEach) {
14
11
  return node.arguments[1];
15
12
  }
16
-
17
13
  const jestFnCall = (0, _utils2.parseJestFnCall)(node, context);
18
-
19
14
  if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) === 'hook' && node.arguments.length >= 1) {
20
15
  return node.arguments[0];
21
16
  }
22
-
23
17
  if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) === 'test' && node.arguments.length >= 2) {
24
18
  return node.arguments[1];
25
19
  }
26
-
27
20
  return null;
28
21
  };
29
-
30
22
  var _default = (0, _utils2.createRule)({
31
23
  name: __filename,
32
24
  meta: {
33
25
  docs: {
34
26
  category: 'Best Practices',
35
- description: 'Avoid using a callback in asynchronous tests and hooks',
36
- recommended: 'error',
37
- suggestion: true
27
+ description: 'Disallow using a callback in asynchronous tests and hooks',
28
+ recommended: 'error'
38
29
  },
39
30
  messages: {
40
31
  noDoneCallback: 'Return a Promise instead of relying on callback parameter',
@@ -46,31 +37,24 @@ var _default = (0, _utils2.createRule)({
46
37
  hasSuggestions: true
47
38
  },
48
39
  defaultOptions: [],
49
-
50
40
  create(context) {
51
41
  return {
52
42
  CallExpression(node) {
53
- var _getNodeName$endsWith, _getNodeName;
54
-
43
+ var _getNodeName;
55
44
  // done is the second argument for it.each, not the first
56
- const isJestEach = (_getNodeName$endsWith = (_getNodeName = (0, _utils2.getNodeName)(node.callee)) === null || _getNodeName === void 0 ? void 0 : _getNodeName.endsWith('.each')) !== null && _getNodeName$endsWith !== void 0 ? _getNodeName$endsWith : false;
57
-
45
+ const isJestEach = ((_getNodeName = (0, _utils2.getNodeName)(node.callee)) === null || _getNodeName === void 0 ? void 0 : _getNodeName.endsWith('.each')) ?? false;
58
46
  if (isJestEach && node.callee.type !== _utils.AST_NODE_TYPES.TaggedTemplateExpression) {
59
47
  // isJestEach but not a TaggedTemplateExpression, so this must be
60
48
  // the `jest.each([])()` syntax which this rule doesn't support due
61
49
  // to its complexity (see jest-community/eslint-plugin-jest#710)
62
50
  return;
63
51
  }
64
-
65
52
  const callback = findCallbackArg(node, isJestEach, context);
66
53
  const callbackArgIndex = Number(isJestEach);
67
-
68
54
  if (!callback || !(0, _utils2.isFunction)(callback) || callback.params.length !== 1 + callbackArgIndex) {
69
55
  return;
70
56
  }
71
-
72
57
  const argument = callback.params[callbackArgIndex];
73
-
74
58
  if (argument.type !== _utils.AST_NODE_TYPES.Identifier) {
75
59
  context.report({
76
60
  node: argument,
@@ -78,7 +62,6 @@ var _default = (0, _utils2.createRule)({
78
62
  });
79
63
  return;
80
64
  }
81
-
82
65
  if (callback.async) {
83
66
  context.report({
84
67
  node: argument,
@@ -86,7 +69,6 @@ var _default = (0, _utils2.createRule)({
86
69
  });
87
70
  return;
88
71
  }
89
-
90
72
  context.report({
91
73
  node: argument,
92
74
  messageId: 'noDoneCallback',
@@ -95,56 +77,47 @@ var _default = (0, _utils2.createRule)({
95
77
  data: {
96
78
  callback: argument.name
97
79
  },
98
-
99
80
  fix(fixer) {
81
+ var _tokenAfterLastParam;
100
82
  const {
101
- body
83
+ body,
84
+ params
102
85
  } = callback;
103
86
  const sourceCode = context.getSourceCode();
104
87
  const firstBodyToken = sourceCode.getFirstToken(body);
105
88
  const lastBodyToken = sourceCode.getLastToken(body);
106
- const tokenBeforeArgument = sourceCode.getTokenBefore(argument);
107
- const tokenAfterArgument = sourceCode.getTokenAfter(argument);
108
- /* istanbul ignore if */
109
-
110
- if (!firstBodyToken || !lastBodyToken || !tokenBeforeArgument || !tokenAfterArgument) {
111
- 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`);
89
+ const [firstParam] = params;
90
+ const lastParam = params[params.length - 1];
91
+ const tokenBeforeFirstParam = sourceCode.getTokenBefore(firstParam);
92
+ let tokenAfterLastParam = sourceCode.getTokenAfter(lastParam);
93
+ if (((_tokenAfterLastParam = tokenAfterLastParam) === null || _tokenAfterLastParam === void 0 ? void 0 : _tokenAfterLastParam.value) === ',') {
94
+ tokenAfterLastParam = sourceCode.getTokenAfter(tokenAfterLastParam);
112
95
  }
113
96
 
114
- const argumentInParens = tokenBeforeArgument.value === '(' && tokenAfterArgument.value === ')';
115
- let argumentFix = fixer.replaceText(argument, '()');
116
-
117
- if (argumentInParens) {
118
- argumentFix = fixer.remove(argument);
97
+ /* istanbul ignore if */
98
+ if (!firstBodyToken || !lastBodyToken || !tokenBeforeFirstParam || !tokenAfterLastParam) {
99
+ 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`);
119
100
  }
120
-
121
- let newCallback = argument.name;
122
-
123
- if (argumentInParens) {
124
- newCallback = `(${newCallback})`;
101
+ let argumentFix = fixer.replaceText(firstParam, '()');
102
+ if (tokenBeforeFirstParam.value === '(' && tokenAfterLastParam.value === ')') {
103
+ argumentFix = fixer.removeRange([tokenBeforeFirstParam.range[1], tokenAfterLastParam.range[0]]);
125
104
  }
126
-
105
+ const newCallback = argument.name;
127
106
  let beforeReplacement = `new Promise(${newCallback} => `;
128
107
  let afterReplacement = ')';
129
108
  let replaceBefore = true;
130
-
131
109
  if (body.type === _utils.AST_NODE_TYPES.BlockStatement) {
132
110
  const keyword = 'return';
133
111
  beforeReplacement = `${keyword} ${beforeReplacement}{`;
134
112
  afterReplacement += '}';
135
113
  replaceBefore = false;
136
114
  }
137
-
138
115
  return [argumentFix, replaceBefore ? fixer.insertTextBefore(firstBodyToken, beforeReplacement) : fixer.insertTextAfter(firstBodyToken, beforeReplacement), fixer.insertTextAfter(lastBodyToken, afterReplacement)];
139
116
  }
140
-
141
117
  }]
142
118
  });
143
119
  }
144
-
145
120
  };
146
121
  }
147
-
148
122
  });
149
-
150
123
  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,27 +20,21 @@ var _default = (0, _utils.createRule)({
22
20
  type: 'suggestion'
23
21
  },
24
22
  defaultOptions: [],
25
-
26
23
  create(context) {
27
24
  const hookContexts = [{}];
28
25
  return {
29
26
  CallExpression(node) {
30
27
  var _jestFnCall$name;
31
-
32
28
  const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
33
-
34
29
  if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) === 'describe') {
35
30
  hookContexts.push({});
36
31
  }
37
-
38
32
  if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'hook') {
39
33
  return;
40
34
  }
41
-
42
35
  const currentLayer = hookContexts[hookContexts.length - 1];
43
36
  currentLayer[_jestFnCall$name = jestFnCall.name] || (currentLayer[_jestFnCall$name] = 0);
44
37
  currentLayer[jestFnCall.name] += 1;
45
-
46
38
  if (currentLayer[jestFnCall.name] > 1) {
47
39
  context.report({
48
40
  messageId: 'noDuplicateHook',
@@ -53,16 +45,12 @@ var _default = (0, _utils.createRule)({
53
45
  });
54
46
  }
55
47
  },
56
-
57
48
  'CallExpression:exit'(node) {
58
49
  if ((0, _utils.isTypeOfJestFnCall)(node, context, ['describe'])) {
59
50
  hookContexts.pop();
60
51
  }
61
52
  }
62
-
63
53
  };
64
54
  }
65
-
66
55
  });
67
-
68
56
  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: {
@@ -24,7 +21,6 @@ var _default = (0, _utils2.createRule)({
24
21
  schema: []
25
22
  },
26
23
  defaultOptions: [],
27
-
28
24
  create(context) {
29
25
  const exportNodes = [];
30
26
  let hasTestCase = false;
@@ -39,38 +35,30 @@ var _default = (0, _utils2.createRule)({
39
35
  }
40
36
  }
41
37
  },
42
-
43
38
  CallExpression(node) {
44
39
  if ((0, _utils2.isTypeOfJestFnCall)(node, context, ['test'])) {
45
40
  hasTestCase = true;
46
41
  }
47
42
  },
48
-
49
43
  'ExportNamedDeclaration, ExportDefaultDeclaration'(node) {
50
44
  exportNodes.push(node);
51
45
  },
52
-
53
46
  'AssignmentExpression > MemberExpression'(node) {
54
47
  let {
55
48
  object,
56
49
  property
57
50
  } = node;
58
-
59
51
  if (object.type === _utils.AST_NODE_TYPES.MemberExpression) {
60
52
  ({
61
53
  object,
62
54
  property
63
55
  } = object);
64
56
  }
65
-
66
57
  if ('name' in object && object.name === 'module' && property.type === _utils.AST_NODE_TYPES.Identifier && /^exports?$/u.test(property.name)) {
67
58
  exportNodes.push(node);
68
59
  }
69
60
  }
70
-
71
61
  };
72
62
  }
73
-
74
63
  });
75
-
76
64
  exports.default = _default;
@@ -4,19 +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
  var _default = (0, _utils2.createRule)({
13
10
  name: __filename,
14
11
  meta: {
15
12
  docs: {
16
13
  category: 'Best Practices',
17
14
  description: 'Disallow focused tests',
18
- recommended: 'error',
19
- suggestion: true
15
+ recommended: 'error'
20
16
  },
21
17
  messages: {
22
18
  focusedTest: 'Unexpected focused test.',
@@ -27,43 +23,34 @@ var _default = (0, _utils2.createRule)({
27
23
  hasSuggestions: true
28
24
  },
29
25
  defaultOptions: [],
30
-
31
26
  create(context) {
32
27
  return {
33
28
  CallExpression(node) {
34
29
  const jestFnCall = (0, _utils2.parseJestFnCall)(node, context);
35
-
36
30
  if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'test' && (jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'describe') {
37
31
  return;
38
32
  }
39
-
40
33
  if (jestFnCall.name.startsWith('f')) {
41
34
  context.report({
42
35
  messageId: 'focusedTest',
43
36
  node,
44
37
  suggest: [{
45
38
  messageId: 'suggestRemoveFocus',
46
-
47
39
  fix(fixer) {
48
40
  // don't apply the fixer if we're an aliased import
49
41
  if (jestFnCall.head.type === 'import' && jestFnCall.name !== jestFnCall.head.local) {
50
42
  return null;
51
43
  }
52
-
53
44
  return fixer.removeRange([node.range[0], node.range[0] + 1]);
54
45
  }
55
-
56
46
  }]
57
47
  });
58
48
  return;
59
49
  }
60
-
61
50
  const onlyNode = jestFnCall.members.find(s => (0, _utils2.getAccessorValue)(s) === 'only');
62
-
63
51
  if (!onlyNode) {
64
52
  return;
65
53
  }
66
-
67
54
  context.report({
68
55
  messageId: 'focusedTest',
69
56
  node: onlyNode,
@@ -73,10 +60,7 @@ var _default = (0, _utils2.createRule)({
73
60
  }]
74
61
  });
75
62
  }
76
-
77
63
  };
78
64
  }
79
-
80
65
  });
81
-
82
66
  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: {
@@ -33,14 +31,12 @@ var _default = (0, _utils.createRule)({
33
31
  defaultOptions: [{
34
32
  allow: []
35
33
  }],
36
-
37
34
  create(context, [{
38
35
  allow = []
39
36
  }]) {
40
37
  return {
41
38
  CallExpression(node) {
42
39
  const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
43
-
44
40
  if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) === 'hook' && !allow.includes(jestFnCall.name)) {
45
41
  context.report({
46
42
  node,
@@ -51,10 +47,7 @@ var _default = (0, _utils.createRule)({
51
47
  });
52
48
  }
53
49
  }
54
-
55
50
  };
56
51
  }
57
-
58
52
  });
59
-
60
53
  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 newDescribeContext = () => ({
11
9
  describeTitles: [],
12
10
  testTitles: []
13
11
  });
14
-
15
12
  var _default = (0, _utils.createRule)({
16
13
  name: __filename,
17
14
  meta: {
@@ -28,34 +25,26 @@ var _default = (0, _utils.createRule)({
28
25
  type: 'suggestion'
29
26
  },
30
27
  defaultOptions: [],
31
-
32
28
  create(context) {
33
29
  const contexts = [newDescribeContext()];
34
30
  return {
35
31
  CallExpression(node) {
36
32
  const currentLayer = contexts[contexts.length - 1];
37
33
  const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
38
-
39
34
  if (!jestFnCall) {
40
35
  return;
41
36
  }
42
-
43
37
  if (jestFnCall.type === 'describe') {
44
38
  contexts.push(newDescribeContext());
45
39
  }
46
-
47
40
  if (jestFnCall.members.find(s => (0, _utils.isSupportedAccessor)(s, 'each'))) {
48
41
  return;
49
42
  }
50
-
51
43
  const [argument] = node.arguments;
52
-
53
44
  if (!argument || !(0, _utils.isStringNode)(argument)) {
54
45
  return;
55
46
  }
56
-
57
47
  const title = (0, _utils.getStringValue)(argument);
58
-
59
48
  if (jestFnCall.type === 'test') {
60
49
  if (currentLayer.testTitles.includes(title)) {
61
50
  context.report({
@@ -63,33 +52,25 @@ var _default = (0, _utils.createRule)({
63
52
  node: argument
64
53
  });
65
54
  }
66
-
67
55
  currentLayer.testTitles.push(title);
68
56
  }
69
-
70
57
  if (jestFnCall.type !== 'describe') {
71
58
  return;
72
59
  }
73
-
74
60
  if (currentLayer.describeTitles.includes(title)) {
75
61
  context.report({
76
62
  messageId: 'multipleDescribeTitle',
77
63
  node: argument
78
64
  });
79
65
  }
80
-
81
66
  currentLayer.describeTitles.push(title);
82
67
  },
83
-
84
68
  'CallExpression:exit'(node) {
85
69
  if ((0, _utils.isTypeOfJestFnCall)(node, context, ['describe'])) {
86
70
  contexts.pop();
87
71
  }
88
72
  }
89
-
90
73
  };
91
74
  }
92
-
93
75
  });
94
-
95
76
  exports.default = _default;