eslint-plugin-jest 28.0.0-next.2 → 28.0.0-next.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.js +0 -2
- package/lib/rules/consistent-test-it.js +3 -3
- package/lib/rules/expect-expect.js +1 -3
- package/lib/rules/max-expects.js +1 -3
- package/lib/rules/max-nested-describe.js +1 -3
- package/lib/rules/no-alias-methods.js +1 -3
- package/lib/rules/no-commented-out-tests.js +1 -3
- package/lib/rules/no-conditional-expect.js +1 -3
- package/lib/rules/no-conditional-in-test.js +1 -3
- package/lib/rules/no-confusing-set-timeout.js +1 -3
- package/lib/rules/no-deprecated-functions.js +1 -3
- package/lib/rules/no-disabled-tests.js +1 -3
- package/lib/rules/no-done-callback.js +1 -3
- package/lib/rules/no-duplicate-hooks.js +1 -3
- package/lib/rules/no-export.js +1 -3
- package/lib/rules/no-focused-tests.js +1 -3
- package/lib/rules/no-hooks.js +2 -3
- package/lib/rules/no-identical-title.js +1 -3
- package/lib/rules/no-interpolation-in-snapshots.js +1 -3
- package/lib/rules/no-jasmine-globals.js +1 -3
- package/lib/rules/no-large-snapshots.js +1 -3
- package/lib/rules/no-mocks-import.js +1 -3
- package/lib/rules/no-restricted-jest-methods.js +1 -3
- package/lib/rules/no-restricted-matchers.js +1 -3
- package/lib/rules/no-standalone-expect.js +2 -3
- package/lib/rules/no-test-prefixes.js +1 -3
- package/lib/rules/no-test-return-statement.js +1 -3
- package/lib/rules/no-untyped-mock-factory.js +3 -5
- package/lib/rules/prefer-called-with.js +1 -3
- package/lib/rules/prefer-comparison-matcher.js +1 -3
- package/lib/rules/prefer-each.js +1 -3
- package/lib/rules/prefer-equality-matcher.js +1 -3
- package/lib/rules/prefer-expect-assertions.js +1 -3
- package/lib/rules/prefer-expect-resolves.js +1 -3
- package/lib/rules/prefer-hooks-in-order.js +1 -3
- package/lib/rules/prefer-hooks-on-top.js +1 -3
- package/lib/rules/prefer-lowercase-title.js +4 -3
- package/lib/rules/prefer-mock-promise-shorthand.js +1 -3
- package/lib/rules/prefer-snapshot-hint.js +1 -3
- package/lib/rules/prefer-spy-on.js +1 -3
- package/lib/rules/prefer-strict-equal.js +1 -3
- package/lib/rules/prefer-to-be.js +1 -3
- package/lib/rules/prefer-to-contain.js +1 -3
- package/lib/rules/prefer-to-have-length.js +1 -3
- package/lib/rules/prefer-todo.js +1 -3
- package/lib/rules/require-hook.js +1 -3
- package/lib/rules/require-to-throw-message.js +1 -3
- package/lib/rules/require-top-level-describe.js +1 -3
- package/lib/rules/unbound-method.js +2 -2
- package/lib/rules/utils/misc.js +5 -17
- package/lib/rules/utils/parseJestFnCall.js +4 -0
- package/lib/rules/valid-describe-callback.js +1 -3
- package/lib/rules/valid-expect-in-promise.js +1 -3
- package/lib/rules/valid-expect.js +1 -3
- package/lib/rules/valid-title.js +2 -3
- package/package.json +6 -6
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
|
-
|
|
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
|
-
|
|
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'
|
package/lib/rules/max-expects.js
CHANGED
|
@@ -10,9 +10,7 @@ var _default = exports.default = (0, _utils2.createRule)({
|
|
|
10
10
|
name: __filename,
|
|
11
11
|
meta: {
|
|
12
12
|
docs: {
|
|
13
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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'
|
package/lib/rules/no-export.js
CHANGED
|
@@ -10,9 +10,7 @@ var _default = exports.default = (0, _utils2.createRule)({
|
|
|
10
10
|
name: __filename,
|
|
11
11
|
meta: {
|
|
12
12
|
docs: {
|
|
13
|
-
|
|
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
|
-
|
|
14
|
-
description: 'Disallow focused tests',
|
|
15
|
-
recommended: 'error'
|
|
13
|
+
description: 'Disallow focused tests'
|
|
16
14
|
},
|
|
17
15
|
messages: {
|
|
18
16
|
focusedTest: 'Unexpected focused test',
|
package/lib/rules/no-hooks.js
CHANGED
|
@@ -9,9 +9,7 @@ var _default = exports.default = (0, _utils.createRule)({
|
|
|
9
9
|
name: __filename,
|
|
10
10
|
meta: {
|
|
11
11
|
docs: {
|
|
12
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 }})`'
|
|
@@ -33,7 +31,7 @@ var _default = exports.default = (0, _utils2.createRule)({
|
|
|
33
31
|
CallExpression(node) {
|
|
34
32
|
const {
|
|
35
33
|
callee,
|
|
36
|
-
|
|
34
|
+
typeArguments
|
|
37
35
|
} = node;
|
|
38
36
|
if (callee.type !== _utils.AST_NODE_TYPES.MemberExpression) {
|
|
39
37
|
return;
|
|
@@ -43,7 +41,7 @@ var _default = exports.default = (0, _utils2.createRule)({
|
|
|
43
41
|
} = callee;
|
|
44
42
|
if (node.arguments.length === 2 && (0, _utils2.isTypeOfJestFnCall)(node, context, ['jest']) && (0, _utils2.isSupportedAccessor)(property) && ['mock', 'doMock'].includes((0, _utils2.getAccessorValue)(property))) {
|
|
45
43
|
const [nameNode, factoryNode] = node.arguments;
|
|
46
|
-
const hasTypeParameter =
|
|
44
|
+
const hasTypeParameter = typeArguments !== undefined && typeArguments.params.length > 0;
|
|
47
45
|
const hasReturnType = (0, _utils2.isFunction)(factoryNode) && factoryNode.returnType !== undefined;
|
|
48
46
|
if (hasTypeParameter || hasReturnType) {
|
|
49
47
|
return;
|
|
@@ -9,9 +9,7 @@ var _default = exports.default = (0, _utils.createRule)({
|
|
|
9
9
|
name: __filename,
|
|
10
10
|
meta: {
|
|
11
11
|
docs: {
|
|
12
|
-
|
|
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
|
-
|
|
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'
|
package/lib/rules/prefer-each.js
CHANGED
|
@@ -9,9 +9,7 @@ var _default = exports.default = (0, _utils.createRule)({
|
|
|
9
9
|
name: __filename,
|
|
10
10
|
meta: {
|
|
11
11
|
docs: {
|
|
12
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
14
|
-
description: 'Suggest using `toHaveLength()`',
|
|
15
|
-
recommended: false
|
|
13
|
+
description: 'Suggest using `toHaveLength()`'
|
|
16
14
|
},
|
|
17
15
|
messages: {
|
|
18
16
|
useToHaveLength: 'Use toHaveLength() instead'
|
package/lib/rules/prefer-todo.js
CHANGED
|
@@ -33,9 +33,7 @@ var _default = exports.default = (0, _utils2.createRule)({
|
|
|
33
33
|
name: __filename,
|
|
34
34
|
meta: {
|
|
35
35
|
docs: {
|
|
36
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
42
|
+
// mark this as not recommended
|
|
43
|
+
recommended: undefined
|
|
44
44
|
}
|
|
45
45
|
},
|
|
46
46
|
create(context) {
|
package/lib/rules/utils/misc.js
CHANGED
|
@@ -160,42 +160,30 @@ const getFirstMatcherArg = expectFnCall => {
|
|
|
160
160
|
/* istanbul ignore next */
|
|
161
161
|
exports.getFirstMatcherArg = getFirstMatcherArg;
|
|
162
162
|
const getFilename = context => {
|
|
163
|
-
return
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 }}',
|
package/lib/rules/valid-title.js
CHANGED
|
@@ -49,9 +49,7 @@ var _default = exports.default = (0, _utils2.createRule)({
|
|
|
49
49
|
name: __filename,
|
|
50
50
|
meta: {
|
|
51
51
|
docs: {
|
|
52
|
-
|
|
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.
|
|
3
|
+
"version": "28.0.0-next.4",
|
|
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": "^
|
|
98
|
+
"@typescript-eslint/utils": "^6.0.0"
|
|
99
99
|
},
|
|
100
100
|
"devDependencies": {
|
|
101
101
|
"@babel/cli": "^7.4.4",
|
|
@@ -107,12 +107,12 @@
|
|
|
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/
|
|
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",
|
|
114
|
-
"@typescript-eslint/eslint-plugin": "^
|
|
115
|
-
"@typescript-eslint/parser": "^
|
|
114
|
+
"@typescript-eslint/eslint-plugin": "^6.0.0",
|
|
115
|
+
"@typescript-eslint/parser": "^6.0.0",
|
|
116
116
|
"babel-jest": "^29.0.0",
|
|
117
117
|
"babel-plugin-replace-ts-export-assignment": "^0.0.2",
|
|
118
118
|
"dedent": "^1.5.0",
|
|
@@ -142,7 +142,7 @@
|
|
|
142
142
|
"typescript": "^5.0.4"
|
|
143
143
|
},
|
|
144
144
|
"peerDependencies": {
|
|
145
|
-
"@typescript-eslint/eslint-plugin": "^
|
|
145
|
+
"@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0",
|
|
146
146
|
"eslint": "^7.0.0 || ^8.0.0",
|
|
147
147
|
"jest": "*"
|
|
148
148
|
},
|