eslint-plugin-jest 28.0.0-next.1 → 28.0.0-next.3

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 (56) hide show
  1. package/lib/index.js +0 -2
  2. package/lib/rules/consistent-test-it.js +3 -3
  3. package/lib/rules/expect-expect.js +1 -3
  4. package/lib/rules/max-expects.js +3 -7
  5. package/lib/rules/max-nested-describe.js +1 -3
  6. package/lib/rules/no-alias-methods.js +2 -4
  7. package/lib/rules/no-commented-out-tests.js +1 -3
  8. package/lib/rules/no-conditional-expect.js +1 -3
  9. package/lib/rules/no-conditional-in-test.js +1 -3
  10. package/lib/rules/no-confusing-set-timeout.js +1 -3
  11. package/lib/rules/no-deprecated-functions.js +2 -5
  12. package/lib/rules/no-disabled-tests.js +1 -3
  13. package/lib/rules/no-done-callback.js +5 -9
  14. package/lib/rules/no-duplicate-hooks.js +4 -7
  15. package/lib/rules/no-export.js +1 -3
  16. package/lib/rules/no-focused-tests.js +2 -4
  17. package/lib/rules/no-hooks.js +3 -4
  18. package/lib/rules/no-identical-title.js +1 -3
  19. package/lib/rules/no-interpolation-in-snapshots.js +2 -4
  20. package/lib/rules/no-jasmine-globals.js +1 -3
  21. package/lib/rules/no-large-snapshots.js +2 -4
  22. package/lib/rules/no-mocks-import.js +1 -3
  23. package/lib/rules/no-restricted-jest-methods.js +2 -4
  24. package/lib/rules/no-restricted-matchers.js +2 -4
  25. package/lib/rules/no-standalone-expect.js +6 -9
  26. package/lib/rules/no-test-prefixes.js +2 -4
  27. package/lib/rules/no-test-return-statement.js +1 -3
  28. package/lib/rules/no-untyped-mock-factory.js +10 -7
  29. package/lib/rules/prefer-called-with.js +2 -4
  30. package/lib/rules/prefer-comparison-matcher.js +4 -6
  31. package/lib/rules/prefer-each.js +1 -3
  32. package/lib/rules/prefer-equality-matcher.js +4 -6
  33. package/lib/rules/prefer-expect-assertions.js +6 -10
  34. package/lib/rules/prefer-expect-resolves.js +4 -6
  35. package/lib/rules/prefer-hooks-in-order.js +2 -4
  36. package/lib/rules/prefer-hooks-on-top.js +1 -3
  37. package/lib/rules/prefer-lowercase-title.js +4 -3
  38. package/lib/rules/prefer-mock-promise-shorthand.js +3 -6
  39. package/lib/rules/prefer-snapshot-hint.js +3 -5
  40. package/lib/rules/prefer-spy-on.js +2 -5
  41. package/lib/rules/prefer-strict-equal.js +2 -4
  42. package/lib/rules/prefer-to-be.js +3 -6
  43. package/lib/rules/prefer-to-contain.js +3 -5
  44. package/lib/rules/prefer-to-have-length.js +4 -6
  45. package/lib/rules/prefer-todo.js +2 -4
  46. package/lib/rules/require-hook.js +2 -5
  47. package/lib/rules/require-to-throw-message.js +2 -4
  48. package/lib/rules/require-top-level-describe.js +1 -3
  49. package/lib/rules/unbound-method.js +8 -9
  50. package/lib/rules/utils/misc.js +6 -18
  51. package/lib/rules/utils/parseJestFnCall.js +12 -16
  52. package/lib/rules/valid-describe-callback.js +2 -4
  53. package/lib/rules/valid-expect-in-promise.js +7 -11
  54. package/lib/rules/valid-expect.js +7 -14
  55. package/lib/rules/valid-title.js +3 -4
  56. package/package.json +4 -4
package/lib/index.js CHANGED
@@ -8,8 +8,6 @@ var snapshotProcessor = _interopRequireWildcard(require("./processors/snapshot-p
8
8
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
9
9
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
10
10
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
- // v5 of `@typescript-eslint/experimental-utils` removed this
12
-
13
11
  // copied from https://github.com/babel/babel/blob/d8da63c929f2d28c401571e2a43166678c555bc4/packages/babel-helpers/src/helpers.js#L602-L606
14
12
  /* istanbul ignore next */
15
13
  const interopRequireDefault = obj => obj && obj.__esModule ? obj : {
@@ -11,9 +11,7 @@ var _default = exports.default = (0, _utils2.createRule)({
11
11
  name: __filename,
12
12
  meta: {
13
13
  docs: {
14
- category: 'Best Practices',
15
- description: 'Enforce `test` and `it` usage conventions',
16
- recommended: false
14
+ description: 'Enforce `test` and `it` usage conventions'
17
15
  },
18
16
  fixable: 'code',
19
17
  messages: {
@@ -24,9 +22,11 @@ var _default = exports.default = (0, _utils2.createRule)({
24
22
  type: 'object',
25
23
  properties: {
26
24
  fn: {
25
+ type: 'string',
27
26
  enum: [_utils2.TestCaseName.it, _utils2.TestCaseName.test]
28
27
  },
29
28
  withinDescribe: {
29
+ type: 'string',
30
30
  enum: [_utils2.TestCaseName.it, _utils2.TestCaseName.test]
31
31
  }
32
32
  },
@@ -30,9 +30,7 @@ var _default = exports.default = (0, _utils2.createRule)({
30
30
  name: __filename,
31
31
  meta: {
32
32
  docs: {
33
- category: 'Best Practices',
34
- description: 'Enforce assertion to be made in a test body',
35
- recommended: 'warn'
33
+ description: 'Enforce assertion to be made in a test body'
36
34
  },
37
35
  messages: {
38
36
  noAssertions: 'Test has no assertions'
@@ -10,9 +10,7 @@ var _default = exports.default = (0, _utils2.createRule)({
10
10
  name: __filename,
11
11
  meta: {
12
12
  docs: {
13
- category: 'Best Practices',
14
- description: 'Enforces a maximum number assertion calls in a test body',
15
- recommended: false
13
+ description: 'Enforces a maximum number assertion calls in a test body'
16
14
  },
17
15
  messages: {
18
16
  exceededMaxAssertion: 'Too many assertion calls ({{ count }}) - maximum allowed is {{ max }}'
@@ -37,8 +35,7 @@ var _default = exports.default = (0, _utils2.createRule)({
37
35
  }]) {
38
36
  let count = 0;
39
37
  const maybeResetCount = node => {
40
- var _node$parent;
41
- const isTestFn = ((_node$parent = node.parent) === null || _node$parent === void 0 ? void 0 : _node$parent.type) !== _utils.AST_NODE_TYPES.CallExpression || (0, _utils2.isTypeOfJestFnCall)(node.parent, context, ['test']);
38
+ const isTestFn = node.parent?.type !== _utils.AST_NODE_TYPES.CallExpression || (0, _utils2.isTypeOfJestFnCall)(node.parent, context, ['test']);
42
39
  if (isTestFn) {
43
40
  count = 0;
44
41
  }
@@ -49,9 +46,8 @@ var _default = exports.default = (0, _utils2.createRule)({
49
46
  ArrowFunctionExpression: maybeResetCount,
50
47
  'ArrowFunctionExpression:exit': maybeResetCount,
51
48
  CallExpression(node) {
52
- var _jestFnCall$head$node;
53
49
  const jestFnCall = (0, _utils2.parseJestFnCall)(node, context);
54
- if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'expect' || ((_jestFnCall$head$node = jestFnCall.head.node.parent) === null || _jestFnCall$head$node === void 0 ? void 0 : _jestFnCall$head$node.type) === _utils.AST_NODE_TYPES.MemberExpression) {
50
+ if (jestFnCall?.type !== 'expect' || jestFnCall.head.node.parent?.type === _utils.AST_NODE_TYPES.MemberExpression) {
55
51
  return;
56
52
  }
57
53
  count += 1;
@@ -9,9 +9,7 @@ var _default = exports.default = (0, _utils.createRule)({
9
9
  name: __filename,
10
10
  meta: {
11
11
  docs: {
12
- category: 'Best Practices',
13
- description: 'Enforces a maximum depth to nested describe calls',
14
- recommended: false
12
+ description: 'Enforces a maximum depth to nested describe calls'
15
13
  },
16
14
  messages: {
17
15
  exceededMaxDepth: 'Too many nested describe calls ({{ depth }}) - maximum allowed is {{ max }}'
@@ -9,9 +9,7 @@ var _default = exports.default = (0, _utils.createRule)({
9
9
  name: __filename,
10
10
  meta: {
11
11
  docs: {
12
- category: 'Best Practices',
13
- description: 'Disallow alias methods',
14
- recommended: 'error'
12
+ description: 'Disallow alias methods'
15
13
  },
16
14
  messages: {
17
15
  replaceAlias: `Replace {{ alias }}() with its canonical name of {{ canonical }}()`
@@ -39,7 +37,7 @@ var _default = exports.default = (0, _utils.createRule)({
39
37
  return {
40
38
  CallExpression(node) {
41
39
  const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
42
- if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'expect') {
40
+ if (jestFnCall?.type !== 'expect') {
43
41
  return;
44
42
  }
45
43
  const {
@@ -12,9 +12,7 @@ var _default = exports.default = (0, _utils.createRule)({
12
12
  name: __filename,
13
13
  meta: {
14
14
  docs: {
15
- category: 'Best Practices',
16
- description: 'Disallow commented out tests',
17
- recommended: 'warn'
15
+ description: 'Disallow commented out tests'
18
16
  },
19
17
  messages: {
20
18
  commentedTests: 'Some tests seem to be commented'
@@ -11,9 +11,7 @@ var _default = exports.default = (0, _utils2.createRule)({
11
11
  name: __filename,
12
12
  meta: {
13
13
  docs: {
14
- description: 'Disallow calling `expect` conditionally',
15
- category: 'Best Practices',
16
- recommended: 'error'
14
+ description: 'Disallow calling `expect` conditionally'
17
15
  },
18
16
  messages: {
19
17
  conditionalExpect: 'Avoid calling `expect` conditionally`'
@@ -9,9 +9,7 @@ var _default = exports.default = (0, _utils.createRule)({
9
9
  name: __filename,
10
10
  meta: {
11
11
  docs: {
12
- description: 'Disallow conditional logic in tests',
13
- category: 'Best Practices',
14
- recommended: false
12
+ description: 'Disallow conditional logic in tests'
15
13
  },
16
14
  messages: {
17
15
  conditionalInTest: 'Avoid having conditionals in tests'
@@ -12,9 +12,7 @@ var _default = exports.default = (0, _utils.createRule)({
12
12
  name: __filename,
13
13
  meta: {
14
14
  docs: {
15
- category: 'Best Practices',
16
- description: 'Disallow confusing usages of jest.setTimeout',
17
- recommended: false
15
+ description: 'Disallow confusing usages of jest.setTimeout'
18
16
  },
19
17
  messages: {
20
18
  globalSetTimeout: '`jest.setTimeout` should be call in `global` scope',
@@ -17,9 +17,7 @@ var _default = exports.default = (0, _utils2.createRule)({
17
17
  name: __filename,
18
18
  meta: {
19
19
  docs: {
20
- category: 'Best Practices',
21
- description: 'Disallow use of deprecated functions',
22
- recommended: 'error'
20
+ description: 'Disallow use of deprecated functions'
23
21
  },
24
22
  messages: {
25
23
  deprecatedFunction: '`{{ deprecation }}` has been deprecated in favor of `{{ replacement }}`'
@@ -30,8 +28,7 @@ var _default = exports.default = (0, _utils2.createRule)({
30
28
  },
31
29
  defaultOptions: [],
32
30
  create(context) {
33
- var _context$settings;
34
- const jestVersion = parseJestVersion(((_context$settings = context.settings) === null || _context$settings === void 0 || (_context$settings = _context$settings.jest) === null || _context$settings === void 0 ? void 0 : _context$settings.version) || (0, _utils2.detectJestVersion)());
31
+ const jestVersion = parseJestVersion(context.settings?.jest?.version || (0, _utils2.detectJestVersion)());
35
32
  const deprecations = {
36
33
  ...(jestVersion >= 15 && {
37
34
  'jest.resetModuleRegistry': 'jest.resetModules'
@@ -9,9 +9,7 @@ var _default = exports.default = (0, _utils.createRule)({
9
9
  name: __filename,
10
10
  meta: {
11
11
  docs: {
12
- category: 'Best Practices',
13
- description: 'Disallow disabled tests',
14
- recommended: 'warn'
12
+ description: 'Disallow disabled tests'
15
13
  },
16
14
  messages: {
17
15
  missingFunction: 'Test is missing function argument',
@@ -11,10 +11,10 @@ const findCallbackArg = (node, isJestEach, context) => {
11
11
  return node.arguments[1];
12
12
  }
13
13
  const jestFnCall = (0, _utils2.parseJestFnCall)(node, context);
14
- if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) === 'hook' && node.arguments.length >= 1) {
14
+ if (jestFnCall?.type === 'hook' && node.arguments.length >= 1) {
15
15
  return node.arguments[0];
16
16
  }
17
- if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) === 'test' && node.arguments.length >= 2) {
17
+ if (jestFnCall?.type === 'test' && node.arguments.length >= 2) {
18
18
  return node.arguments[1];
19
19
  }
20
20
  return null;
@@ -23,9 +23,7 @@ var _default = exports.default = (0, _utils2.createRule)({
23
23
  name: __filename,
24
24
  meta: {
25
25
  docs: {
26
- category: 'Best Practices',
27
- description: 'Disallow using a callback in asynchronous tests and hooks',
28
- recommended: 'error'
26
+ description: 'Disallow using a callback in asynchronous tests and hooks'
29
27
  },
30
28
  messages: {
31
29
  noDoneCallback: 'Return a Promise instead of relying on callback parameter',
@@ -40,9 +38,8 @@ var _default = exports.default = (0, _utils2.createRule)({
40
38
  create(context) {
41
39
  return {
42
40
  CallExpression(node) {
43
- var _getNodeName;
44
41
  // done is the second argument for it.each, not the first
45
- const isJestEach = ((_getNodeName = (0, _utils2.getNodeName)(node.callee)) === null || _getNodeName === void 0 ? void 0 : _getNodeName.endsWith('.each')) ?? false;
42
+ const isJestEach = (0, _utils2.getNodeName)(node.callee)?.endsWith('.each') ?? false;
46
43
  if (isJestEach && node.callee.type !== _utils.AST_NODE_TYPES.TaggedTemplateExpression) {
47
44
  // isJestEach but not a TaggedTemplateExpression, so this must be
48
45
  // the `jest.each([])()` syntax which this rule doesn't support due
@@ -78,7 +75,6 @@ var _default = exports.default = (0, _utils2.createRule)({
78
75
  callback: argument.name
79
76
  },
80
77
  fix(fixer) {
81
- var _tokenAfterLastParam;
82
78
  const {
83
79
  body,
84
80
  params
@@ -90,7 +86,7 @@ var _default = exports.default = (0, _utils2.createRule)({
90
86
  const lastParam = params[params.length - 1];
91
87
  const tokenBeforeFirstParam = sourceCode.getTokenBefore(firstParam);
92
88
  let tokenAfterLastParam = sourceCode.getTokenAfter(lastParam);
93
- if (((_tokenAfterLastParam = tokenAfterLastParam) === null || _tokenAfterLastParam === void 0 ? void 0 : _tokenAfterLastParam.value) === ',') {
89
+ if (tokenAfterLastParam?.value === ',') {
94
90
  tokenAfterLastParam = sourceCode.getTokenAfter(tokenAfterLastParam);
95
91
  }
96
92
 
@@ -9,9 +9,7 @@ var _default = exports.default = (0, _utils.createRule)({
9
9
  name: __filename,
10
10
  meta: {
11
11
  docs: {
12
- category: 'Best Practices',
13
- description: 'Disallow duplicate setup and teardown hooks',
14
- recommended: false
12
+ description: 'Disallow duplicate setup and teardown hooks'
15
13
  },
16
14
  messages: {
17
15
  noDuplicateHook: 'Duplicate {{hook}} in describe block'
@@ -24,16 +22,15 @@ var _default = exports.default = (0, _utils.createRule)({
24
22
  const hookContexts = [{}];
25
23
  return {
26
24
  CallExpression(node) {
27
- var _jestFnCall$name;
28
25
  const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
29
- if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) === 'describe') {
26
+ if (jestFnCall?.type === 'describe') {
30
27
  hookContexts.push({});
31
28
  }
32
- if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'hook') {
29
+ if (jestFnCall?.type !== 'hook') {
33
30
  return;
34
31
  }
35
32
  const currentLayer = hookContexts[hookContexts.length - 1];
36
- currentLayer[_jestFnCall$name = jestFnCall.name] || (currentLayer[_jestFnCall$name] = 0);
33
+ currentLayer[jestFnCall.name] ||= 0;
37
34
  currentLayer[jestFnCall.name] += 1;
38
35
  if (currentLayer[jestFnCall.name] > 1) {
39
36
  context.report({
@@ -10,9 +10,7 @@ var _default = exports.default = (0, _utils2.createRule)({
10
10
  name: __filename,
11
11
  meta: {
12
12
  docs: {
13
- category: 'Best Practices',
14
- description: 'Disallow using `exports` in files containing tests',
15
- recommended: 'error'
13
+ description: 'Disallow using `exports` in files containing tests'
16
14
  },
17
15
  messages: {
18
16
  unexpectedExport: `Do not export from a test file`
@@ -10,9 +10,7 @@ var _default = exports.default = (0, _utils2.createRule)({
10
10
  name: __filename,
11
11
  meta: {
12
12
  docs: {
13
- category: 'Best Practices',
14
- description: 'Disallow focused tests',
15
- recommended: 'error'
13
+ description: 'Disallow focused tests'
16
14
  },
17
15
  messages: {
18
16
  focusedTest: 'Unexpected focused test',
@@ -27,7 +25,7 @@ var _default = exports.default = (0, _utils2.createRule)({
27
25
  return {
28
26
  CallExpression(node) {
29
27
  const jestFnCall = (0, _utils2.parseJestFnCall)(node, context);
30
- if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'test' && (jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'describe') {
28
+ if (jestFnCall?.type !== 'test' && jestFnCall?.type !== 'describe') {
31
29
  return;
32
30
  }
33
31
  if (jestFnCall.name.startsWith('f')) {
@@ -9,9 +9,7 @@ var _default = exports.default = (0, _utils.createRule)({
9
9
  name: __filename,
10
10
  meta: {
11
11
  docs: {
12
- category: 'Best Practices',
13
- description: 'Disallow setup and teardown hooks',
14
- recommended: false
12
+ description: 'Disallow setup and teardown hooks'
15
13
  },
16
14
  messages: {
17
15
  unexpectedHook: "Unexpected '{{ hookName }}' hook"
@@ -21,6 +19,7 @@ var _default = exports.default = (0, _utils.createRule)({
21
19
  properties: {
22
20
  allow: {
23
21
  type: 'array',
22
+ // @ts-expect-error https://github.com/eslint/eslint/discussions/17573
24
23
  contains: ['beforeAll', 'beforeEach', 'afterAll', 'afterEach']
25
24
  }
26
25
  },
@@ -37,7 +36,7 @@ var _default = exports.default = (0, _utils.createRule)({
37
36
  return {
38
37
  CallExpression(node) {
39
38
  const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
40
- if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) === 'hook' && !allow.includes(jestFnCall.name)) {
39
+ if (jestFnCall?.type === 'hook' && !allow.includes(jestFnCall.name)) {
41
40
  context.report({
42
41
  node,
43
42
  messageId: 'unexpectedHook',
@@ -13,9 +13,7 @@ var _default = exports.default = (0, _utils.createRule)({
13
13
  name: __filename,
14
14
  meta: {
15
15
  docs: {
16
- category: 'Best Practices',
17
- description: 'Disallow identical titles',
18
- recommended: 'error'
16
+ description: 'Disallow identical titles'
19
17
  },
20
18
  messages: {
21
19
  multipleTestTitle: 'Test title is used multiple times in the same describe block',
@@ -10,9 +10,7 @@ var _default = exports.default = (0, _utils2.createRule)({
10
10
  name: __filename,
11
11
  meta: {
12
12
  docs: {
13
- category: 'Best Practices',
14
- description: 'Disallow string interpolation inside snapshots',
15
- recommended: 'error'
13
+ description: 'Disallow string interpolation inside snapshots'
16
14
  },
17
15
  messages: {
18
16
  noInterpolation: 'Do not use string interpolation inside of snapshots'
@@ -25,7 +23,7 @@ var _default = exports.default = (0, _utils2.createRule)({
25
23
  return {
26
24
  CallExpression(node) {
27
25
  const jestFnCall = (0, _utils2.parseJestFnCall)(node, context);
28
- if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'expect') {
26
+ if (jestFnCall?.type !== 'expect') {
29
27
  return;
30
28
  }
31
29
  if (['toMatchInlineSnapshot', 'toThrowErrorMatchingInlineSnapshot'].includes((0, _utils2.getAccessorValue)(jestFnCall.matcher))) {
@@ -10,9 +10,7 @@ var _default = exports.default = (0, _utils2.createRule)({
10
10
  name: __filename,
11
11
  meta: {
12
12
  docs: {
13
- category: 'Best Practices',
14
- description: 'Disallow Jasmine globals',
15
- recommended: 'error'
13
+ description: 'Disallow Jasmine globals'
16
14
  },
17
15
  messages: {
18
16
  illegalGlobal: 'Illegal usage of global `{{ global }}`, prefer `{{ replacement }}`',
@@ -47,9 +47,7 @@ var _default = exports.default = (0, _utils2.createRule)({
47
47
  name: __filename,
48
48
  meta: {
49
49
  docs: {
50
- category: 'Best Practices',
51
- description: 'Disallow large snapshots',
52
- recommended: false
50
+ description: 'Disallow large snapshots'
53
51
  },
54
52
  messages: {
55
53
  noSnapshot: '`{{ lineCount }}`s should begin with lowercase',
@@ -87,7 +85,7 @@ var _default = exports.default = (0, _utils2.createRule)({
87
85
  return {
88
86
  CallExpression(node) {
89
87
  const jestFnCall = (0, _utils2.parseJestFnCall)(node, context);
90
- if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'expect') {
88
+ if (jestFnCall?.type !== 'expect') {
91
89
  return;
92
90
  }
93
91
  if (['toMatchInlineSnapshot', 'toThrowErrorMatchingInlineSnapshot'].includes((0, _utils2.getAccessorValue)(jestFnCall.matcher)) && jestFnCall.args.length) {
@@ -14,9 +14,7 @@ var _default = exports.default = (0, _utils.createRule)({
14
14
  meta: {
15
15
  type: 'problem',
16
16
  docs: {
17
- category: 'Best Practices',
18
- description: 'Disallow manually importing from `__mocks__`',
19
- recommended: 'error'
17
+ description: 'Disallow manually importing from `__mocks__`'
20
18
  },
21
19
  messages: {
22
20
  noManualImport: `Mocks should not be manually imported from a ${mocksDirName} directory. Instead use \`jest.mock\` and import from the original module path`
@@ -13,9 +13,7 @@ var _default = exports.default = (0, _utils.createRule)({
13
13
  name: __filename,
14
14
  meta: {
15
15
  docs: {
16
- category: 'Best Practices',
17
- description: 'Disallow specific `jest.` methods',
18
- recommended: false
16
+ description: 'Disallow specific `jest.` methods'
19
17
  },
20
18
  type: 'suggestion',
21
19
  schema: [{
@@ -31,7 +29,7 @@ var _default = exports.default = (0, _utils.createRule)({
31
29
  return {
32
30
  CallExpression(node) {
33
31
  const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
34
- if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'jest' || jestFnCall.members.length === 0) {
32
+ if (jestFnCall?.type !== 'jest' || jestFnCall.members.length === 0) {
35
33
  return;
36
34
  }
37
35
  const method = (0, _utils.getAccessorValue)(jestFnCall.members[0]);
@@ -15,9 +15,7 @@ var _default = exports.default = (0, _utils.createRule)({
15
15
  name: __filename,
16
16
  meta: {
17
17
  docs: {
18
- category: 'Best Practices',
19
- description: 'Disallow specific matchers & modifiers',
20
- recommended: false
18
+ description: 'Disallow specific matchers & modifiers'
21
19
  },
22
20
  type: 'suggestion',
23
21
  schema: [{
@@ -36,7 +34,7 @@ var _default = exports.default = (0, _utils.createRule)({
36
34
  return {
37
35
  CallExpression(node) {
38
36
  const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
39
- if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'expect') {
37
+ if (jestFnCall?.type !== 'expect') {
40
38
  return;
41
39
  }
42
40
  const chain = jestFnCall.members.map(nod => (0, _utils.getAccessorValue)(nod)).join('.');
@@ -37,15 +37,14 @@ var _default = exports.default = (0, _utils2.createRule)({
37
37
  name: __filename,
38
38
  meta: {
39
39
  docs: {
40
- category: 'Best Practices',
41
- description: 'Disallow using `expect` outside of `it` or `test` blocks',
42
- recommended: 'error'
40
+ description: 'Disallow using `expect` outside of `it` or `test` blocks'
43
41
  },
44
42
  messages: {
45
43
  unexpectedExpect: 'Expect must be inside of a test block'
46
44
  },
47
45
  type: 'suggestion',
48
46
  schema: [{
47
+ type: 'object',
49
48
  properties: {
50
49
  additionalTestBlockFunctions: {
51
50
  type: 'array',
@@ -68,9 +67,8 @@ var _default = exports.default = (0, _utils2.createRule)({
68
67
  return {
69
68
  CallExpression(node) {
70
69
  const jestFnCall = (0, _utils2.parseJestFnCall)(node, context);
71
- if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) === 'expect') {
72
- var _jestFnCall$head$node;
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]))) {
70
+ if (jestFnCall?.type === 'expect') {
71
+ if (jestFnCall.head.node.parent?.type === _utils.AST_NODE_TYPES.MemberExpression && jestFnCall.members.length === 1 && !['assertions', 'hasAssertions'].includes((0, _utils2.getAccessorValue)(jestFnCall.members[0]))) {
74
72
  return;
75
73
  }
76
74
  const parent = callStack[callStack.length - 1];
@@ -82,7 +80,7 @@ var _default = exports.default = (0, _utils2.createRule)({
82
80
  }
83
81
  return;
84
82
  }
85
- if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) === 'test' || isCustomTestBlockFunction(node)) {
83
+ if (jestFnCall?.type === 'test' || isCustomTestBlockFunction(node)) {
86
84
  callStack.push('test');
87
85
  }
88
86
  if (node.callee.type === _utils.AST_NODE_TYPES.TaggedTemplateExpression) {
@@ -107,8 +105,7 @@ var _default = exports.default = (0, _utils2.createRule)({
107
105
  }
108
106
  },
109
107
  ArrowFunctionExpression(node) {
110
- var _node$parent;
111
- if (((_node$parent = node.parent) === null || _node$parent === void 0 ? void 0 : _node$parent.type) !== _utils.AST_NODE_TYPES.CallExpression) {
108
+ if (node.parent?.type !== _utils.AST_NODE_TYPES.CallExpression) {
112
109
  callStack.push('arrow');
113
110
  }
114
111
  },
@@ -10,9 +10,7 @@ var _default = exports.default = (0, _utils2.createRule)({
10
10
  name: __filename,
11
11
  meta: {
12
12
  docs: {
13
- category: 'Best Practices',
14
- description: 'Require using `.only` and `.skip` over `f` and `x`',
15
- recommended: 'error'
13
+ description: 'Require using `.only` and `.skip` over `f` and `x`'
16
14
  },
17
15
  messages: {
18
16
  usePreferredName: 'Use "{{ preferredNodeName }}" instead'
@@ -26,7 +24,7 @@ var _default = exports.default = (0, _utils2.createRule)({
26
24
  return {
27
25
  CallExpression(node) {
28
26
  const jestFnCall = (0, _utils2.parseJestFnCall)(node, context);
29
- if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'describe' && (jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'test') {
27
+ if (jestFnCall?.type !== 'describe' && jestFnCall?.type !== 'test') {
30
28
  return;
31
29
  }
32
30
  if (jestFnCall.name[0] !== 'f' && jestFnCall.name[0] !== 'x') {
@@ -17,9 +17,7 @@ var _default = exports.default = (0, _utils2.createRule)({
17
17
  name: __filename,
18
18
  meta: {
19
19
  docs: {
20
- category: 'Best Practices',
21
- description: 'Disallow explicitly returning from tests',
22
- recommended: false
20
+ description: 'Disallow explicitly returning from tests'
23
21
  },
24
22
  messages: {
25
23
  noReturnValue: 'Jest tests should not return a value'
@@ -16,9 +16,7 @@ var _default = exports.default = (0, _utils2.createRule)({
16
16
  name: __filename,
17
17
  meta: {
18
18
  docs: {
19
- category: 'Best Practices',
20
- description: 'Disallow using `jest.mock()` factories without an explicit type parameter',
21
- recommended: false
19
+ description: 'Disallow using `jest.mock()` factories without an explicit type parameter'
22
20
  },
23
21
  messages: {
24
22
  addTypeParameterToModuleMock: 'Add a type parameter to the mock factory such as `typeof import({{ moduleName }})`'
@@ -31,10 +29,15 @@ var _default = exports.default = (0, _utils2.createRule)({
31
29
  create(context) {
32
30
  return {
33
31
  CallExpression(node) {
34
- const {
32
+ let {
35
33
  callee,
36
- typeParameters
34
+ typeArguments
37
35
  } = node;
36
+
37
+ /* istanbul ignore next */
38
+ if (!('typeArguments' in node)) {
39
+ typeArguments = node.typeParameters;
40
+ }
38
41
  if (callee.type !== _utils.AST_NODE_TYPES.MemberExpression) {
39
42
  return;
40
43
  }
@@ -43,7 +46,7 @@ var _default = exports.default = (0, _utils2.createRule)({
43
46
  } = callee;
44
47
  if (node.arguments.length === 2 && (0, _utils2.isTypeOfJestFnCall)(node, context, ['jest']) && (0, _utils2.isSupportedAccessor)(property) && ['mock', 'doMock'].includes((0, _utils2.getAccessorValue)(property))) {
45
48
  const [nameNode, factoryNode] = node.arguments;
46
- const hasTypeParameter = typeParameters !== undefined && typeParameters.params.length > 0;
49
+ const hasTypeParameter = typeArguments !== undefined && typeArguments.params.length > 0;
47
50
  const hasReturnType = (0, _utils2.isFunction)(factoryNode) && factoryNode.returnType !== undefined;
48
51
  if (hasTypeParameter || hasReturnType) {
49
52
  return;
@@ -52,7 +55,7 @@ var _default = exports.default = (0, _utils2.createRule)({
52
55
  context.report({
53
56
  messageId: 'addTypeParameterToModuleMock',
54
57
  data: {
55
- moduleName: (moduleName === null || moduleName === void 0 ? void 0 : moduleName.raw) ?? './module-name'
58
+ moduleName: moduleName?.raw ?? './module-name'
56
59
  },
57
60
  node,
58
61
  fix(fixer) {
@@ -9,9 +9,7 @@ var _default = exports.default = (0, _utils.createRule)({
9
9
  name: __filename,
10
10
  meta: {
11
11
  docs: {
12
- category: 'Best Practices',
13
- description: 'Suggest using `toBeCalledWith()` or `toHaveBeenCalledWith()`',
14
- recommended: false
12
+ description: 'Suggest using `toBeCalledWith()` or `toHaveBeenCalledWith()`'
15
13
  },
16
14
  messages: {
17
15
  preferCalledWith: 'Prefer {{ matcherName }}With(/* expected args */)'
@@ -24,7 +22,7 @@ var _default = exports.default = (0, _utils.createRule)({
24
22
  return {
25
23
  CallExpression(node) {
26
24
  const jestFnCall = (0, _utils.parseJestFnCall)(node, context);
27
- if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'expect') {
25
+ if (jestFnCall?.type !== 'expect') {
28
26
  return;
29
27
  }
30
28
  if (jestFnCall.modifiers.some(nod => (0, _utils.getAccessorValue)(nod) === 'not')) {