eslint-plugin-jest 26.8.7 → 27.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/README.md +82 -78
  2. package/docs/rules/consistent-test-it.md +9 -4
  3. package/docs/rules/expect-expect.md +5 -0
  4. package/docs/rules/max-expects.md +3 -1
  5. package/docs/rules/max-nested-describe.md +3 -1
  6. package/docs/rules/no-alias-methods.md +13 -2
  7. package/docs/rules/no-commented-out-tests.md +6 -1
  8. package/docs/rules/no-conditional-expect.md +7 -2
  9. package/docs/rules/no-conditional-in-test.md +3 -1
  10. package/docs/rules/no-deprecated-functions.md +14 -7
  11. package/docs/rules/no-disabled-tests.md +6 -1
  12. package/docs/rules/no-done-callback.md +9 -1
  13. package/docs/rules/no-duplicate-hooks.md +3 -1
  14. package/docs/rules/no-export.md +6 -1
  15. package/docs/rules/no-focused-tests.md +10 -1
  16. package/docs/rules/no-hooks.md +3 -1
  17. package/docs/rules/no-identical-title.md +6 -1
  18. package/docs/rules/no-if.md +4 -4
  19. package/docs/rules/no-interpolation-in-snapshots.md +6 -1
  20. package/docs/rules/no-jasmine-globals.md +10 -2
  21. package/docs/rules/no-large-snapshots.md +4 -2
  22. package/docs/rules/no-mocks-import.md +6 -1
  23. package/docs/rules/no-restricted-jest-methods.md +51 -0
  24. package/docs/rules/no-restricted-matchers.md +19 -4
  25. package/docs/rules/no-standalone-expect.md +6 -1
  26. package/docs/rules/no-test-prefixes.md +9 -1
  27. package/docs/rules/no-test-return-statement.md +2 -0
  28. package/docs/rules/prefer-called-with.md +2 -0
  29. package/docs/rules/prefer-comparison-matcher.md +5 -0
  30. package/docs/rules/prefer-each.md +56 -0
  31. package/docs/rules/prefer-equality-matcher.md +5 -0
  32. package/docs/rules/prefer-expect-assertions.md +5 -2
  33. package/docs/rules/prefer-expect-resolves.md +8 -1
  34. package/docs/rules/prefer-hooks-in-order.md +3 -1
  35. package/docs/rules/prefer-hooks-on-top.md +3 -1
  36. package/docs/rules/prefer-lowercase-title.md +5 -0
  37. package/docs/rules/prefer-mock-promise-shorthand.md +6 -1
  38. package/docs/rules/prefer-snapshot-hint.md +2 -0
  39. package/docs/rules/prefer-spy-on.md +5 -2
  40. package/docs/rules/prefer-strict-equal.md +5 -2
  41. package/docs/rules/prefer-to-be.md +8 -0
  42. package/docs/rules/prefer-to-contain.md +8 -2
  43. package/docs/rules/prefer-to-have-length.md +8 -2
  44. package/docs/rules/prefer-todo.md +5 -2
  45. package/docs/rules/require-hook.md +2 -0
  46. package/docs/rules/require-to-throw-message.md +2 -2
  47. package/docs/rules/require-top-level-describe.md +5 -1
  48. package/docs/rules/unbound-method.md +7 -2
  49. package/docs/rules/valid-describe-callback.md +6 -1
  50. package/docs/rules/valid-expect-in-promise.md +6 -1
  51. package/docs/rules/valid-expect.md +5 -2
  52. package/docs/rules/valid-title.md +9 -1
  53. package/lib/index.js +14 -25
  54. package/lib/processors/snapshot-processor.js +3 -5
  55. package/lib/rules/consistent-test-it.js +1 -19
  56. package/lib/rules/expect-expect.js +1 -18
  57. package/lib/rules/max-expects.js +0 -16
  58. package/lib/rules/max-nested-describe.js +0 -13
  59. package/lib/rules/no-alias-methods.js +1 -10
  60. package/lib/rules/no-commented-out-tests.js +0 -10
  61. package/lib/rules/no-conditional-expect.js +2 -23
  62. package/lib/rules/no-conditional-in-test.js +0 -9
  63. package/lib/rules/no-deprecated-functions.js +2 -18
  64. package/lib/rules/no-disabled-tests.js +3 -19
  65. package/lib/rules/no-done-callback.js +20 -47
  66. package/lib/rules/no-duplicate-hooks.js +0 -12
  67. package/lib/rules/no-export.js +0 -12
  68. package/lib/rules/no-focused-tests.js +1 -17
  69. package/lib/rules/no-hooks.js +0 -7
  70. package/lib/rules/no-identical-title.js +0 -19
  71. package/lib/rules/no-if.js +0 -24
  72. package/lib/rules/no-interpolation-in-snapshots.js +0 -9
  73. package/lib/rules/no-jasmine-globals.js +1 -23
  74. package/lib/rules/no-large-snapshots.js +4 -24
  75. package/lib/rules/no-mocks-import.js +0 -12
  76. package/lib/rules/no-restricted-jest-methods.js +56 -0
  77. package/lib/rules/no-restricted-matchers.js +13 -28
  78. package/lib/rules/no-standalone-expect.js +7 -33
  79. package/lib/rules/no-test-prefixes.js +1 -13
  80. package/lib/rules/no-test-return-statement.js +0 -12
  81. package/lib/rules/prefer-called-with.js +0 -10
  82. package/lib/rules/prefer-comparison-matcher.js +8 -33
  83. package/lib/rules/prefer-each.js +80 -0
  84. package/lib/rules/prefer-equality-matcher.js +12 -25
  85. package/lib/rules/prefer-expect-assertions.js +14 -60
  86. package/lib/rules/prefer-expect-resolves.js +0 -12
  87. package/lib/rules/prefer-hooks-in-order.js +2 -16
  88. package/lib/rules/prefer-hooks-on-top.js +0 -9
  89. package/lib/rules/prefer-lowercase-title.js +0 -23
  90. package/lib/rules/prefer-mock-promise-shorthand.js +5 -26
  91. package/lib/rules/prefer-snapshot-hint.js +8 -34
  92. package/lib/rules/prefer-spy-on.js +0 -17
  93. package/lib/rules/prefer-strict-equal.js +1 -11
  94. package/lib/rules/prefer-to-be.js +12 -37
  95. package/lib/rules/prefer-to-contain.js +11 -21
  96. package/lib/rules/prefer-to-have-length.js +4 -16
  97. package/lib/rules/prefer-todo.js +2 -18
  98. package/lib/rules/require-hook.js +1 -25
  99. package/lib/rules/require-to-throw-message.js +0 -9
  100. package/lib/rules/require-top-level-describe.js +1 -18
  101. package/lib/rules/unbound-method.js +3 -30
  102. package/lib/rules/utils/accessors.js +6 -18
  103. package/lib/rules/utils/detectJestVersion.js +2 -7
  104. package/lib/rules/utils/followTypeAssertionChain.js +0 -4
  105. package/lib/rules/utils/index.js +0 -10
  106. package/lib/rules/utils/misc.js +14 -47
  107. package/lib/rules/utils/parseJestFnCall.js +51 -154
  108. package/lib/rules/valid-describe-callback.js +0 -17
  109. package/lib/rules/valid-expect-in-promise.js +28 -95
  110. package/lib/rules/valid-expect.js +5 -48
  111. package/lib/rules/valid-title.js +5 -40
  112. package/package.json +20 -16
  113. package/docs/rules/no-jest-import.md +0 -20
  114. package/lib/rules/no-jest-import.js +0 -48
@@ -4,32 +4,23 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  var _utils = require("@typescript-eslint/utils");
9
-
10
8
  var _utils2 = require("./utils");
11
-
12
- const trimFXprefix = word => ['f', 'x'].includes(word.charAt(0)) ? word.substr(1) : word;
13
-
9
+ const trimFXprefix = word => ['f', 'x'].includes(word.charAt(0)) ? word.substring(1) : word;
14
10
  const doesBinaryExpressionContainStringNode = binaryExp => {
15
11
  if ((0, _utils2.isStringNode)(binaryExp.right)) {
16
12
  return true;
17
13
  }
18
-
19
14
  if (binaryExp.left.type === _utils.AST_NODE_TYPES.BinaryExpression) {
20
15
  return doesBinaryExpressionContainStringNode(binaryExp.left);
21
16
  }
22
-
23
17
  return (0, _utils2.isStringNode)(binaryExp.left);
24
18
  };
25
-
26
19
  const quoteStringValue = node => node.type === _utils.AST_NODE_TYPES.TemplateLiteral ? `\`${node.quasis[0].value.raw}\`` : node.raw;
27
-
28
20
  const compileMatcherPattern = matcherMaybeWithMessage => {
29
21
  const [matcher, message] = Array.isArray(matcherMaybeWithMessage) ? matcherMaybeWithMessage : [matcherMaybeWithMessage];
30
22
  return [new RegExp(matcher, 'u'), message];
31
23
  };
32
-
33
24
  const compileMatcherPatterns = matchers => {
34
25
  if (typeof matchers === 'string' || Array.isArray(matchers)) {
35
26
  const compiledMatcher = compileMatcherPattern(matchers);
@@ -39,14 +30,12 @@ const compileMatcherPatterns = matchers => {
39
30
  it: compiledMatcher
40
31
  };
41
32
  }
42
-
43
33
  return {
44
34
  describe: matchers.describe ? compileMatcherPattern(matchers.describe) : null,
45
35
  test: matchers.test ? compileMatcherPattern(matchers.test) : null,
46
36
  it: matchers.it ? compileMatcherPattern(matchers.it) : null
47
37
  };
48
38
  };
49
-
50
39
  const MatcherAndMessageSchema = {
51
40
  type: 'array',
52
41
  items: {
@@ -56,7 +45,6 @@ const MatcherAndMessageSchema = {
56
45
  maxItems: 2,
57
46
  additionalItems: false
58
47
  };
59
-
60
48
  var _default = (0, _utils2.createRule)({
61
49
  name: __filename,
62
50
  meta: {
@@ -116,7 +104,6 @@ var _default = (0, _utils2.createRule)({
116
104
  ignoreTypeOfDescribeName: false,
117
105
  disallowedWords: []
118
106
  }],
119
-
120
107
  create(context, [{
121
108
  ignoreTypeOfDescribeName,
122
109
  disallowedWords = [],
@@ -124,41 +111,31 @@ var _default = (0, _utils2.createRule)({
124
111
  mustMatch
125
112
  }]) {
126
113
  const disallowedWordsRegexp = new RegExp(`\\b(${disallowedWords.join('|')})\\b`, 'iu');
127
- const mustNotMatchPatterns = compileMatcherPatterns(mustNotMatch !== null && mustNotMatch !== void 0 ? mustNotMatch : {});
128
- const mustMatchPatterns = compileMatcherPatterns(mustMatch !== null && mustMatch !== void 0 ? mustMatch : {});
114
+ const mustNotMatchPatterns = compileMatcherPatterns(mustNotMatch ?? {});
115
+ const mustMatchPatterns = compileMatcherPatterns(mustMatch ?? {});
129
116
  return {
130
117
  CallExpression(node) {
131
- var _mustNotMatchPatterns, _mustMatchPatterns$je;
132
-
133
118
  const jestFnCall = (0, _utils2.parseJestFnCall)(node, context);
134
-
135
119
  if ((jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'describe' && (jestFnCall === null || jestFnCall === void 0 ? void 0 : jestFnCall.type) !== 'test') {
136
120
  return;
137
121
  }
138
-
139
122
  const [argument] = node.arguments;
140
-
141
123
  if (!argument) {
142
124
  return;
143
125
  }
144
-
145
126
  if (!(0, _utils2.isStringNode)(argument)) {
146
127
  if (argument.type === _utils.AST_NODE_TYPES.BinaryExpression && doesBinaryExpressionContainStringNode(argument)) {
147
128
  return;
148
129
  }
149
-
150
130
  if (argument.type !== _utils.AST_NODE_TYPES.TemplateLiteral && !(ignoreTypeOfDescribeName && jestFnCall.type === 'describe')) {
151
131
  context.report({
152
132
  messageId: 'titleMustBeString',
153
133
  loc: argument.loc
154
134
  });
155
135
  }
156
-
157
136
  return;
158
137
  }
159
-
160
138
  const title = (0, _utils2.getStringValue)(argument);
161
-
162
139
  if (!title) {
163
140
  context.report({
164
141
  messageId: 'emptyTitle',
@@ -169,10 +146,8 @@ var _default = (0, _utils2.createRule)({
169
146
  });
170
147
  return;
171
148
  }
172
-
173
149
  if (disallowedWords.length > 0) {
174
150
  const disallowedMatch = disallowedWordsRegexp.exec(title);
175
-
176
151
  if (disallowedMatch) {
177
152
  context.report({
178
153
  data: {
@@ -184,7 +159,6 @@ var _default = (0, _utils2.createRule)({
184
159
  return;
185
160
  }
186
161
  }
187
-
188
162
  if (title.trim().length !== title.length) {
189
163
  context.report({
190
164
  messageId: 'accidentalSpace',
@@ -192,10 +166,8 @@ var _default = (0, _utils2.createRule)({
192
166
  fix: fixer => [fixer.replaceTextRange(argument.range, quoteStringValue(argument).replace(/^([`'"]) +?/u, '$1').replace(/ +?([`'"])$/u, '$1'))]
193
167
  });
194
168
  }
195
-
196
169
  const unprefixedName = trimFXprefix(jestFnCall.name);
197
170
  const [firstWord] = title.split(' ');
198
-
199
171
  if (firstWord.toLowerCase() === unprefixedName) {
200
172
  context.report({
201
173
  messageId: 'duplicatePrefix',
@@ -203,10 +175,8 @@ var _default = (0, _utils2.createRule)({
203
175
  fix: fixer => [fixer.replaceTextRange(argument.range, quoteStringValue(argument).replace(/^([`'"]).+? /u, '$1'))]
204
176
  });
205
177
  }
206
-
207
178
  const jestFunctionName = unprefixedName;
208
- const [mustNotMatchPattern, mustNotMatchMessage] = (_mustNotMatchPatterns = mustNotMatchPatterns[jestFunctionName]) !== null && _mustNotMatchPatterns !== void 0 ? _mustNotMatchPatterns : [];
209
-
179
+ const [mustNotMatchPattern, mustNotMatchMessage] = mustNotMatchPatterns[jestFunctionName] ?? [];
210
180
  if (mustNotMatchPattern) {
211
181
  if (mustNotMatchPattern.test(title)) {
212
182
  context.report({
@@ -221,9 +191,7 @@ var _default = (0, _utils2.createRule)({
221
191
  return;
222
192
  }
223
193
  }
224
-
225
- const [mustMatchPattern, mustMatchMessage] = (_mustMatchPatterns$je = mustMatchPatterns[jestFunctionName]) !== null && _mustMatchPatterns$je !== void 0 ? _mustMatchPatterns$je : [];
226
-
194
+ const [mustMatchPattern, mustMatchMessage] = mustMatchPatterns[jestFunctionName] ?? [];
227
195
  if (mustMatchPattern) {
228
196
  if (!mustMatchPattern.test(title)) {
229
197
  context.report({
@@ -239,10 +207,7 @@ var _default = (0, _utils2.createRule)({
239
207
  }
240
208
  }
241
209
  }
242
-
243
210
  };
244
211
  }
245
-
246
212
  });
247
-
248
213
  exports.default = _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-jest",
3
- "version": "26.8.7",
3
+ "version": "27.1.6",
4
4
  "description": "ESLint rules for Jest",
5
5
  "keywords": [
6
6
  "eslint",
@@ -29,7 +29,7 @@
29
29
  "prettier:write": "prettier --write 'docs/**/*.md' README.md '.github/**' package.json tsconfig.json src/globals.json .yarnrc.yml",
30
30
  "postpublish": "pinst --enable",
31
31
  "test": "jest",
32
- "tools:regenerate-docs": "ts-node -T tools/regenerate-docs",
32
+ "tools:regenerate-docs": "yarn prepack && eslint-doc-generator && yarn prettier:write",
33
33
  "typecheck": "tsc -p ."
34
34
  },
35
35
  "commitlint": {
@@ -103,34 +103,38 @@
103
103
  "@babel/core": "^7.4.4",
104
104
  "@babel/preset-env": "^7.4.4",
105
105
  "@babel/preset-typescript": "^7.3.3",
106
- "@commitlint/cli": "^16.0.0",
107
- "@commitlint/config-conventional": "^16.0.0",
106
+ "@commitlint/cli": "^17.0.3",
107
+ "@commitlint/config-conventional": "^17.0.3",
108
108
  "@schemastore/package": "^0.0.6",
109
109
  "@semantic-release/changelog": "^6.0.0",
110
110
  "@semantic-release/git": "^10.0.0",
111
+ "@tsconfig/node14": "^1.0.3",
111
112
  "@types/dedent": "^0.7.0",
112
- "@types/jest": "^28.0.0",
113
- "@types/node": "^16.0.0",
113
+ "@types/eslint": "^8.4.6",
114
+ "@types/jest": "^29.0.0",
115
+ "@types/node": "^14.18.26",
114
116
  "@types/prettier": "^2.0.0",
115
117
  "@typescript-eslint/eslint-plugin": "^5.0.0",
116
118
  "@typescript-eslint/parser": "^5.0.0",
117
- "babel-jest": "^28.0.0",
119
+ "babel-jest": "^29.0.0",
118
120
  "babel-plugin-replace-ts-export-assignment": "^0.0.2",
119
121
  "dedent": "^0.7.0",
120
122
  "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0",
121
123
  "eslint-config-prettier": "^8.3.0",
124
+ "eslint-doc-generator": "^0.26.0",
122
125
  "eslint-plugin-eslint-comments": "^3.1.2",
123
- "eslint-plugin-eslint-plugin": "^4.0.0",
126
+ "eslint-plugin-eslint-plugin": "^5.0.6",
124
127
  "eslint-plugin-import": "^2.25.1",
125
128
  "eslint-plugin-node": "^11.0.0",
126
- "eslint-plugin-prettier": "^3.4.1",
129
+ "eslint-plugin-prettier": "^4.2.1",
127
130
  "eslint-remote-tester": "^3.0.0",
128
131
  "eslint-remote-tester-repositories": "~0.0.5",
129
- "husky": "^7.0.2",
132
+ "husky": "^8.0.1",
130
133
  "is-ci": "^3.0.0",
131
- "jest": "^28.0.0",
132
- "jest-runner-eslint": "^1.0.0",
133
- "lint-staged": "^12.0.0",
134
+ "jest": "^29.0.0",
135
+ "jest-runner-eslint": "^1.1.0",
136
+ "lint-staged": "^13.0.3",
137
+ "markdown-link-check": "^3.10.2",
134
138
  "pinst": "^3.0.0",
135
139
  "prettier": "^2.0.5",
136
140
  "rimraf": "^3.0.0",
@@ -141,7 +145,7 @@
141
145
  },
142
146
  "peerDependencies": {
143
147
  "@typescript-eslint/eslint-plugin": "^5.0.0",
144
- "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
148
+ "eslint": "^7.0.0 || ^8.0.0"
145
149
  },
146
150
  "peerDependenciesMeta": {
147
151
  "@typescript-eslint/eslint-plugin": {
@@ -151,8 +155,8 @@
151
155
  "optional": true
152
156
  }
153
157
  },
154
- "packageManager": "yarn@3.2.2",
158
+ "packageManager": "yarn@3.3.0",
155
159
  "engines": {
156
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
160
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
157
161
  }
158
162
  }
@@ -1,20 +0,0 @@
1
- # Disallow importing Jest (`no-jest-import`)
2
-
3
- The `jest` object is automatically in scope within every test file. The methods
4
- in the `jest` object help create mocks and let you control Jest's overall
5
- behavior. It is therefore completely unnecessary to import in `jest`, as Jest
6
- doesn't export anything in the first place.
7
-
8
- ### Rule details
9
-
10
- This rule reports on any importing of Jest.
11
-
12
- To name a few: `var jest = require('jest');` `const jest = require('jest');`
13
- `import jest from 'jest';` `import {jest as test} from 'jest';`
14
-
15
- There is no correct usage of this code, other than to not import `jest` in the
16
- first place.
17
-
18
- ## Further Reading
19
-
20
- - [The Jest Object](https://facebook.github.io/jest/docs/en/jest-object.html)
@@ -1,48 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
-
8
- var _utils = require("./utils");
9
-
10
- var _default = (0, _utils.createRule)({
11
- name: __filename,
12
- meta: {
13
- type: 'problem',
14
- docs: {
15
- description: 'Disallow importing Jest',
16
- category: 'Best Practices',
17
- recommended: 'error'
18
- },
19
- messages: {
20
- unexpectedImport: `Jest is automatically in scope. Do not import "jest", as Jest doesn't export anything.`
21
- },
22
- schema: []
23
- },
24
- defaultOptions: [],
25
-
26
- create(context) {
27
- return {
28
- 'ImportDeclaration[source.value="jest"]'(node) {
29
- context.report({
30
- node,
31
- messageId: 'unexpectedImport'
32
- });
33
- },
34
-
35
- 'CallExpression[callee.name="require"][arguments.0.value="jest"]'(node) {
36
- context.report({
37
- loc: node.arguments[0].loc,
38
- messageId: 'unexpectedImport',
39
- node
40
- });
41
- }
42
-
43
- };
44
- }
45
-
46
- });
47
-
48
- exports.default = _default;