eslint-plugin-jest 28.0.0-next.2 → 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 +1 -3
  5. package/lib/rules/max-nested-describe.js +1 -3
  6. package/lib/rules/no-alias-methods.js +1 -3
  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 +1 -3
  12. package/lib/rules/no-disabled-tests.js +1 -3
  13. package/lib/rules/no-done-callback.js +1 -3
  14. package/lib/rules/no-duplicate-hooks.js +1 -3
  15. package/lib/rules/no-export.js +1 -3
  16. package/lib/rules/no-focused-tests.js +1 -3
  17. package/lib/rules/no-hooks.js +2 -3
  18. package/lib/rules/no-identical-title.js +1 -3
  19. package/lib/rules/no-interpolation-in-snapshots.js +1 -3
  20. package/lib/rules/no-jasmine-globals.js +1 -3
  21. package/lib/rules/no-large-snapshots.js +1 -3
  22. package/lib/rules/no-mocks-import.js +1 -3
  23. package/lib/rules/no-restricted-jest-methods.js +1 -3
  24. package/lib/rules/no-restricted-matchers.js +1 -3
  25. package/lib/rules/no-standalone-expect.js +2 -3
  26. package/lib/rules/no-test-prefixes.js +1 -3
  27. package/lib/rules/no-test-return-statement.js +1 -3
  28. package/lib/rules/no-untyped-mock-factory.js +9 -6
  29. package/lib/rules/prefer-called-with.js +1 -3
  30. package/lib/rules/prefer-comparison-matcher.js +1 -3
  31. package/lib/rules/prefer-each.js +1 -3
  32. package/lib/rules/prefer-equality-matcher.js +1 -3
  33. package/lib/rules/prefer-expect-assertions.js +1 -3
  34. package/lib/rules/prefer-expect-resolves.js +1 -3
  35. package/lib/rules/prefer-hooks-in-order.js +1 -3
  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 +1 -3
  39. package/lib/rules/prefer-snapshot-hint.js +1 -3
  40. package/lib/rules/prefer-spy-on.js +1 -3
  41. package/lib/rules/prefer-strict-equal.js +1 -3
  42. package/lib/rules/prefer-to-be.js +1 -3
  43. package/lib/rules/prefer-to-contain.js +1 -3
  44. package/lib/rules/prefer-to-have-length.js +1 -3
  45. package/lib/rules/prefer-todo.js +1 -3
  46. package/lib/rules/require-hook.js +1 -3
  47. package/lib/rules/require-to-throw-message.js +1 -3
  48. package/lib/rules/require-top-level-describe.js +1 -3
  49. package/lib/rules/unbound-method.js +2 -2
  50. package/lib/rules/utils/misc.js +5 -17
  51. package/lib/rules/utils/parseJestFnCall.js +4 -0
  52. package/lib/rules/valid-describe-callback.js +1 -3
  53. package/lib/rules/valid-expect-in-promise.js +1 -3
  54. package/lib/rules/valid-expect.js +1 -3
  55. package/lib/rules/valid-title.js +2 -3
  56. package/package.json +3 -3
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 }}'
@@ -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 }}()`
@@ -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 }}`'
@@ -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',
@@ -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',
@@ -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'
@@ -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',
@@ -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
  },
@@ -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'
@@ -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',
@@ -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: [{
@@ -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: [{
@@ -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',
@@ -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'
@@ -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;
@@ -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 */)'
@@ -43,9 +43,7 @@ var _default = exports.default = (0, _utils2.createRule)({
43
43
  name: __filename,
44
44
  meta: {
45
45
  docs: {
46
- category: 'Best Practices',
47
- description: 'Suggest using the built-in comparison matchers',
48
- recommended: false
46
+ description: 'Suggest using the built-in comparison matchers'
49
47
  },
50
48
  messages: {
51
49
  useToBeComparison: 'Prefer using `{{ preferredMatcher }}` instead'
@@ -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: 'Prefer using `.each` rather than manual loops',
14
- recommended: false
12
+ description: 'Prefer using `.each` rather than manual loops'
15
13
  },
16
14
  messages: {
17
15
  preferEach: 'prefer using `{{ fn }}.each` rather than a manual loop'
@@ -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: 'Suggest using the built-in equality matchers',
15
- recommended: false
13
+ description: 'Suggest using the built-in equality matchers'
16
14
  },
17
15
  messages: {
18
16
  useEqualityMatcher: 'Prefer using one of the equality matchers instead',
@@ -32,9 +32,7 @@ var _default = exports.default = (0, _utils2.createRule)({
32
32
  name: __filename,
33
33
  meta: {
34
34
  docs: {
35
- category: 'Best Practices',
36
- description: 'Suggest using `expect.assertions()` OR `expect.hasAssertions()`',
37
- recommended: false
35
+ description: 'Suggest using `expect.assertions()` OR `expect.hasAssertions()`'
38
36
  },
39
37
  messages: {
40
38
  hasAssertionsTakesNoArguments: '`expect.hasAssertions` expects no arguments',
@@ -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: 'Prefer `await expect(...).resolves` over `expect(await ...)` syntax',
15
- recommended: false
13
+ description: 'Prefer `await expect(...).resolves` over `expect(await ...)` syntax'
16
14
  },
17
15
  fixable: 'code',
18
16
  messages: {
@@ -10,9 +10,7 @@ var _default = exports.default = (0, _utils.createRule)({
10
10
  name: __filename,
11
11
  meta: {
12
12
  docs: {
13
- category: 'Best Practices',
14
- description: 'Prefer having hooks in a consistent order',
15
- recommended: false
13
+ description: 'Prefer having hooks in a consistent order'
16
14
  },
17
15
  messages: {
18
16
  reorderHooks: `\`{{ currentHook }}\` hooks should be before any \`{{ previousHook }}\` hooks`
@@ -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 having hooks before any test cases',
14
- recommended: false
12
+ description: 'Suggest having hooks before any test cases'
15
13
  },
16
14
  messages: {
17
15
  noHookOnTop: 'Hooks should come before test cases'
@@ -24,9 +24,7 @@ var _default = exports.default = (0, _utils.createRule)({
24
24
  meta: {
25
25
  type: 'suggestion',
26
26
  docs: {
27
- description: 'Enforce lowercase test names',
28
- category: 'Best Practices',
29
- recommended: false
27
+ description: 'Enforce lowercase test names'
30
28
  },
31
29
  fixable: 'code',
32
30
  messages: {
@@ -38,6 +36,9 @@ var _default = exports.default = (0, _utils.createRule)({
38
36
  ignore: {
39
37
  type: 'array',
40
38
  items: {
39
+ type: 'string',
40
+ // for some reason TypeScript thinks this _must_ be a read-only
41
+ // array, so we have to explicitly cast it as a mutable array
41
42
  enum: [_utils.DescribeAlias.describe, _utils.TestCaseName.test, _utils.TestCaseName.it]
42
43
  },
43
44
  additionalItems: false
@@ -22,9 +22,7 @@ var _default = exports.default = (0, _utils2.createRule)({
22
22
  name: __filename,
23
23
  meta: {
24
24
  docs: {
25
- category: 'Best Practices',
26
- description: 'Prefer mock resolved/rejected shorthands for promises',
27
- recommended: false
25
+ description: 'Prefer mock resolved/rejected shorthands for promises'
28
26
  },
29
27
  messages: {
30
28
  useMockShorthand: 'Prefer {{ replacement }}'
@@ -36,9 +36,7 @@ var _default = exports.default = (0, _utils.createRule)({
36
36
  name: __filename,
37
37
  meta: {
38
38
  docs: {
39
- category: 'Best Practices',
40
- description: 'Prefer including a hint with external snapshots',
41
- recommended: false
39
+ description: 'Prefer including a hint with external snapshots'
42
40
  },
43
41
  messages,
44
42
  type: 'suggestion',
@@ -41,9 +41,7 @@ var _default = exports.default = (0, _utils2.createRule)({
41
41
  name: __filename,
42
42
  meta: {
43
43
  docs: {
44
- category: 'Best Practices',
45
- description: 'Suggest using `jest.spyOn()`',
46
- recommended: false
44
+ description: 'Suggest using `jest.spyOn()`'
47
45
  },
48
46
  messages: {
49
47
  useJestSpyOn: 'Use jest.spyOn() instead'
@@ -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 `toStrictEqual()`',
14
- recommended: false
12
+ description: 'Suggest using `toStrictEqual()`'
15
13
  },
16
14
  messages: {
17
15
  useToStrictEqual: 'Use `toStrictEqual()` instead',
@@ -46,9 +46,7 @@ var _default = exports.default = (0, _utils2.createRule)({
46
46
  name: __filename,
47
47
  meta: {
48
48
  docs: {
49
- category: 'Best Practices',
50
- description: 'Suggest using `toBe()` for primitive literals',
51
- recommended: false
49
+ description: 'Suggest using `toBe()` for primitive literals'
52
50
  },
53
51
  messages: {
54
52
  useToBe: 'Use `toBe` when expecting primitive literals',
@@ -21,9 +21,7 @@ var _default = exports.default = (0, _utils2.createRule)({
21
21
  name: __filename,
22
22
  meta: {
23
23
  docs: {
24
- category: 'Best Practices',
25
- description: 'Suggest using `toContain()`',
26
- recommended: false
24
+ description: 'Suggest using `toContain()`'
27
25
  },
28
26
  messages: {
29
27
  useToContain: 'Use toContain() instead'
@@ -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: 'Suggest using `toHaveLength()`',
15
- recommended: false
13
+ description: 'Suggest using `toHaveLength()`'
16
14
  },
17
15
  messages: {
18
16
  useToHaveLength: 'Use toHaveLength() instead'
@@ -33,9 +33,7 @@ var _default = exports.default = (0, _utils2.createRule)({
33
33
  name: __filename,
34
34
  meta: {
35
35
  docs: {
36
- category: 'Best Practices',
37
- description: 'Suggest using `test.todo`',
38
- recommended: false
36
+ description: 'Suggest using `test.todo`'
39
37
  },
40
38
  messages: {
41
39
  emptyTest: 'Prefer todo test case over empty test case',
@@ -38,9 +38,7 @@ var _default = exports.default = (0, _utils2.createRule)({
38
38
  name: __filename,
39
39
  meta: {
40
40
  docs: {
41
- category: 'Best Practices',
42
- description: 'Require setup and teardown code to be within a hook',
43
- recommended: false
41
+ description: 'Require setup and teardown code to be within a hook'
44
42
  },
45
43
  messages: {
46
44
  useHook: 'This should be done within a hook'
@@ -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: 'Require a message for `toThrow()`',
14
- recommended: false
12
+ description: 'Require a message for `toThrow()`'
15
13
  },
16
14
  messages: {
17
15
  addErrorMessage: 'Add an error message to {{ matcherName }}()'
@@ -14,9 +14,7 @@ var _default = exports.default = (0, _utils.createRule)({
14
14
  name: __filename,
15
15
  meta: {
16
16
  docs: {
17
- category: 'Best Practices',
18
- description: 'Require test cases and hooks to be inside a `describe` block',
19
- recommended: false
17
+ description: 'Require test cases and hooks to be inside a `describe` block'
20
18
  },
21
19
  messages,
22
20
  type: 'suggestion',
@@ -36,11 +36,11 @@ var _default = exports.default = (0, _utils2.createRule)({
36
36
  type: 'problem',
37
37
  ...baseRule?.meta,
38
38
  docs: {
39
- category: 'Best Practices',
40
39
  description: 'Enforce unbound methods are called with their expected scope',
41
40
  requiresTypeChecking: true,
42
41
  ...baseRule?.meta.docs,
43
- recommended: false
42
+ // mark this as not recommended
43
+ recommended: undefined
44
44
  }
45
45
  },
46
46
  create(context) {
@@ -160,42 +160,30 @@ const getFirstMatcherArg = expectFnCall => {
160
160
  /* istanbul ignore next */
161
161
  exports.getFirstMatcherArg = getFirstMatcherArg;
162
162
  const getFilename = context => {
163
- return 'filename' in context ? context.filename : context.getFilename();
163
+ return context.filename ?? context.getFilename();
164
164
  };
165
165
 
166
166
  /* istanbul ignore next */
167
167
  exports.getFilename = getFilename;
168
168
  const getSourceCode = context => {
169
- return 'sourceCode' in context ? context.sourceCode : context.getSourceCode();
169
+ return context.sourceCode ?? context.getSourceCode();
170
170
  };
171
171
 
172
172
  /* istanbul ignore next */
173
173
  exports.getSourceCode = getSourceCode;
174
174
  const getScope = (context, node) => {
175
- const sourceCode = getSourceCode(context);
176
- if ('getScope' in sourceCode) {
177
- return sourceCode.getScope(node);
178
- }
179
- return context.getScope();
175
+ return getSourceCode(context).getScope?.(node) ?? context.getScope();
180
176
  };
181
177
 
182
178
  /* istanbul ignore next */
183
179
  exports.getScope = getScope;
184
180
  const getAncestors = (context, node) => {
185
- const sourceCode = getSourceCode(context);
186
- if ('getAncestors' in sourceCode) {
187
- return sourceCode.getAncestors(node);
188
- }
189
- return context.getAncestors();
181
+ return getSourceCode(context).getAncestors?.(node) ?? context.getAncestors();
190
182
  };
191
183
 
192
184
  /* istanbul ignore next */
193
185
  exports.getAncestors = getAncestors;
194
186
  const getDeclaredVariables = (context, node) => {
195
- const sourceCode = getSourceCode(context);
196
- if ('getDeclaredVariables' in sourceCode) {
197
- return sourceCode.getDeclaredVariables(node);
198
- }
199
- return context.getDeclaredVariables(node);
187
+ return getSourceCode(context).getDeclaredVariables?.(node) ?? context.getDeclaredVariables(node);
200
188
  };
201
189
  exports.getDeclaredVariables = getDeclaredVariables;
@@ -50,6 +50,10 @@ const determineJestFnType = name => {
50
50
  return 'unknown';
51
51
  };
52
52
  const ValidJestFnCallChains = ['afterAll', 'afterEach', 'beforeAll', 'beforeEach', 'describe', 'describe.each', 'describe.only', 'describe.only.each', 'describe.skip', 'describe.skip.each', 'fdescribe', 'fdescribe.each', 'xdescribe', 'xdescribe.each', 'it', 'it.concurrent', 'it.concurrent.failing', 'it.concurrent.each', 'it.concurrent.failing.each', 'it.concurrent.failing.only.each', 'it.concurrent.failing.skip.each', 'it.concurrent.only.each', 'it.concurrent.skip.each', 'it.each', 'it.failing', 'it.failing.each', 'it.only', 'it.only.each', 'it.only.failing', 'it.only.failing.each', 'it.skip', 'it.skip.each', 'it.skip.failing', 'it.skip.failing.each', 'it.todo', 'fit', 'fit.each', 'fit.failing', 'fit.failing.each', 'xit', 'xit.each', 'xit.failing', 'xit.failing.each', 'test', 'test.concurrent', 'test.concurrent.failing', 'test.concurrent.each', 'test.concurrent.failing.each', 'test.concurrent.failing.only.each', 'test.concurrent.failing.skip.each', 'test.concurrent.only.each', 'test.concurrent.skip.each', 'test.each', 'test.failing', 'test.failing.each', 'test.only', 'test.only.each', 'test.only.failing', 'test.only.failing.each', 'test.skip', 'test.skip.each', 'test.skip.failing', 'test.skip.failing.each', 'test.todo', 'xtest', 'xtest.each', 'xtest.failing', 'xtest.failing.each'];
53
+
54
+ // todo: switch back to using declaration merging once https://github.com/typescript-eslint/typescript-eslint/pull/8485
55
+ // is landed
56
+
53
57
  const resolvePossibleAliasedGlobal = (global, context) => {
54
58
  const globalAliases = context.settings.jest?.globalAliases ?? {};
55
59
  const alias = Object.entries(globalAliases).find(([, aliases]) => aliases.includes(global));
@@ -19,9 +19,7 @@ var _default = exports.default = (0, _utils2.createRule)({
19
19
  meta: {
20
20
  type: 'problem',
21
21
  docs: {
22
- category: 'Possible Errors',
23
- description: 'Enforce valid `describe()` callback',
24
- recommended: 'error'
22
+ description: 'Enforce valid `describe()` callback'
25
23
  },
26
24
  messages: {
27
25
  nameAndCallback: 'Describe requires name and callback arguments',
@@ -205,9 +205,7 @@ var _default = exports.default = (0, _utils2.createRule)({
205
205
  name: __filename,
206
206
  meta: {
207
207
  docs: {
208
- category: 'Best Practices',
209
- description: 'Require promises that have expectations in their chain to be valid',
210
- recommended: 'error'
208
+ description: 'Require promises that have expectations in their chain to be valid'
211
209
  },
212
210
  messages: {
213
211
  expectInFloatingPromise: 'This promise should either be returned or awaited to ensure the expects in its chain are called'
@@ -54,9 +54,7 @@ var _default = exports.default = (0, _utils2.createRule)({
54
54
  name: __filename,
55
55
  meta: {
56
56
  docs: {
57
- category: 'Best Practices',
58
- description: 'Enforce valid `expect()` usage',
59
- recommended: 'error'
57
+ description: 'Enforce valid `expect()` usage'
60
58
  },
61
59
  messages: {
62
60
  tooManyArgs: 'Expect takes at most {{ amount }} argument{{ s }}',
@@ -49,9 +49,7 @@ var _default = exports.default = (0, _utils2.createRule)({
49
49
  name: __filename,
50
50
  meta: {
51
51
  docs: {
52
- category: 'Best Practices',
53
- description: 'Enforce valid titles',
54
- recommended: 'error'
52
+ description: 'Enforce valid titles'
55
53
  },
56
54
  messages: {
57
55
  titleMustBeString: 'Title must be a string',
@@ -93,6 +91,7 @@ var _default = exports.default = (0, _utils2.createRule)({
93
91
  type: 'string'
94
92
  }, MatcherAndMessageSchema, {
95
93
  type: 'object',
94
+ // @ts-expect-error https://github.com/eslint/eslint/discussions/17573
96
95
  propertyNames: {
97
96
  enum: ['describe', 'test', 'it']
98
97
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-jest",
3
- "version": "28.0.0-next.2",
3
+ "version": "28.0.0-next.3",
4
4
  "description": "ESLint rules for Jest",
5
5
  "keywords": [
6
6
  "eslint",
@@ -95,7 +95,7 @@
95
95
  ]
96
96
  },
97
97
  "dependencies": {
98
- "@typescript-eslint/utils": "^5.10.0"
98
+ "@typescript-eslint/utils": "^6.0.0"
99
99
  },
100
100
  "devDependencies": {
101
101
  "@babel/cli": "^7.4.4",
@@ -107,7 +107,7 @@
107
107
  "@schemastore/package": "^0.0.10",
108
108
  "@semantic-release/changelog": "^6.0.0",
109
109
  "@semantic-release/git": "^10.0.0",
110
- "@tsconfig/node14": "^14.1.0",
110
+ "@tsconfig/node16": "^16.0.0",
111
111
  "@types/eslint": "^8.4.6",
112
112
  "@types/jest": "^29.0.0",
113
113
  "@types/node": "^14.18.26",