Skip to content

Commit d634eaf

Browse files
fix: lazy load optional plugins (#41)
1 parent 196e040 commit d634eaf

File tree

7 files changed

+624
-525
lines changed

7 files changed

+624
-525
lines changed

configs.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,9 @@ function getJavascriptConfig() {
182182
return configs["javascript/recommended"];
183183
}
184184

185+
/**
186+
* @returns {Promise<Record<string, string>>} config
187+
*/
185188
function getTypescriptJsdocConfig() {
186189
if (typeof packageJson.dependencies === "undefined") {
187190
return [];
@@ -197,6 +200,9 @@ function getTypescriptJsdocConfig() {
197200
return configs["typescript/jsdoc"];
198201
}
199202

203+
/**
204+
* @returns {Promise<Record<string, string>>} config
205+
*/
200206
function getJestConfig() {
201207
if (typeof packageJson.dependencies === "undefined") {
202208
return [];

configs/jest.js

Lines changed: 152 additions & 137 deletions
Original file line numberDiff line numberDiff line change
@@ -1,205 +1,220 @@
1-
import jestPlugin from "eslint-plugin-jest";
2-
3-
const recommendedConfig = {
4-
...jestPlugin.configs["flat/recommended"],
5-
name: "jest/recommended",
6-
settings: {
7-
jest: {
8-
version: 29,
1+
/**
2+
* @returns {Promise<Record<string, string>>} config
3+
*/
4+
async function getJestRecommendedConfig() {
5+
let jestPlugin;
6+
7+
try {
8+
jestPlugin = (await import("eslint-plugin-jest")).default;
9+
// eslint-disable-next-line unicorn/prefer-optional-catch-binding
10+
} catch (_err) {
11+
// Nothing
12+
}
13+
14+
const jsdocConfig =
15+
(jestPlugin && jestPlugin.configs["flat/recommended"]) || {};
16+
17+
return {
18+
...jsdocConfig,
19+
name: "jest/recommended",
20+
settings: {
21+
jest: {
22+
version: 29,
23+
},
924
},
10-
},
11-
files: [
12-
"**/{tests,test,__tests__}/**/*.?(c|m)[jt]s?(x)",
13-
"**/?(*.)+(spec|test).[jt]s?(x)",
14-
"**/test-*.[jt]s?(x)",
15-
"setupTest.{js,cjs,mjs,ts,cts,mjs}",
16-
],
17-
ignores: [
18-
"**/{tests,test,__tests__}/**/{helper,helpers,__helper__,__helpers__,fixture,fixtures,__fixture__,__fixtures__}/**/*",
19-
"**/helper?(s).{js,cjs,mjs}",
20-
],
21-
rules: {
22-
...jestPlugin.configs["flat/recommended"].rules,
25+
files: [
26+
"**/{tests,test,__tests__}/**/*.?(c|m)[jt]s?(x)",
27+
"**/?(*.)+(spec|test).[jt]s?(x)",
28+
"**/test-*.[jt]s?(x)",
29+
"setupTest.{js,cjs,mjs,ts,cts,mjs}",
30+
],
31+
ignores: [
32+
"**/{tests,test,__tests__}/**/{helper,helpers,__helper__,__helpers__,fixture,fixtures,__fixture__,__fixtures__}/**/*",
33+
"**/helper?(s).{js,cjs,mjs}",
34+
],
35+
rules: {
36+
...jsdocConfig.rules,
2337

24-
"jest/consistent-test-it": "error",
38+
"jest/consistent-test-it": "error",
2539

26-
"jest/expect-expect": "error",
40+
"jest/expect-expect": "error",
2741

28-
// No need
29-
// "jest/max-expects": "error",
42+
// No need
43+
// "jest/max-expects": "error",
3044

31-
// No need
32-
// "jest/max-nested-describe": "error",
45+
// No need
46+
// "jest/max-nested-describe": "error",
3347

34-
// From recommended
35-
// "jest/no-alias-methods": "error",
48+
// From recommended
49+
// "jest/no-alias-methods": "error",
3650

37-
"jest/no-commented-out-tests": "error",
51+
"jest/no-commented-out-tests": "error",
3852

39-
// No need
40-
// Makes too much noise, testing conditions can often be different
41-
"jest/no-conditional-expect": "off",
53+
// No need
54+
// Makes too much noise, testing conditions can often be different
55+
"jest/no-conditional-expect": "off",
4256

43-
// No need
44-
// "jest/no-conditional-in-test": "off",
57+
// No need
58+
// "jest/no-conditional-in-test": "off",
4559

46-
"jest/no-confusing-set-timeout": "error",
60+
"jest/no-confusing-set-timeout": "error",
4761

48-
// From recommended
49-
// "jest/no-deprecated-functions": "error",
62+
// From recommended
63+
// "jest/no-deprecated-functions": "error",
5064

51-
"jest/no-disabled-tests": "error",
65+
"jest/no-disabled-tests": "error",
5266

53-
// No need
54-
// Adding extra `await new Promise(...)` is very inconvenient when you have a lot of callback api
55-
"jest/no-done-callback": "off",
67+
// No need
68+
// Adding extra `await new Promise(...)` is very inconvenient when you have a lot of callback api
69+
"jest/no-done-callback": "off",
5670

57-
"jest/no-duplicate-hooks": "error",
71+
"jest/no-duplicate-hooks": "error",
5872

59-
// From recommended
60-
// "jest/no-export": "error",
73+
// From recommended
74+
// "jest/no-export": "error",
6175

62-
"jest/no-focused-tests": "error",
76+
"jest/no-focused-tests": "error",
6377

64-
// No need
65-
// "jest/no-hooks": "error",
78+
// No need
79+
// "jest/no-hooks": "error",
6680

67-
// From recommended
68-
// "jest/no-identical-title": "error",
81+
// From recommended
82+
// "jest/no-identical-title": "error",
6983

70-
// From recommended
71-
// "jest/no-interpolation-in-snapshots": "error",
84+
// From recommended
85+
// "jest/no-interpolation-in-snapshots": "error",
7286

73-
// From recommended
74-
// "jest/no-jasmine-globals": "error",
87+
// From recommended
88+
// "jest/no-jasmine-globals": "error",
7589

76-
// No need
77-
// "jest/no-large-snapshots": "error",
90+
// No need
91+
// "jest/no-large-snapshots": "error",
7892

79-
// From recommended
80-
// "jest/no-mocks-import": "error",
93+
// From recommended
94+
// "jest/no-mocks-import": "error",
8195

82-
// No need
83-
// "jest/no-restricted-jest-methods": ["error", {}],
96+
// No need
97+
// "jest/no-restricted-jest-methods": ["error", {}],
8498

85-
// No need
86-
// "jest/no-restricted-matchers": ["error", {}],
99+
// No need
100+
// "jest/no-restricted-matchers": ["error", {}],
87101

88-
// From recommended
89-
// "jest/no-standalone-expect": "error",
102+
// From recommended
103+
// "jest/no-standalone-expect": "error",
90104

91-
// From recommended
92-
// "jest/no-test-prefixes": "error",
105+
// From recommended
106+
// "jest/no-test-prefixes": "error",
93107

94-
// No need
95-
// "jest/no-test-return-statement": "error",
108+
// No need
109+
// "jest/no-test-return-statement": "error",
96110

97-
// No need
98-
// "jest/no-untyped-mock-factory": "error",
111+
// No need
112+
// "jest/no-untyped-mock-factory": "error",
99113

100-
"jest/padding-around-after-all-blocks": "error",
114+
"jest/padding-around-after-all-blocks": "error",
101115

102-
"jest/padding-around-after-each-blocks": "error",
116+
"jest/padding-around-after-each-blocks": "error",
103117

104-
// Not all padding required
105-
// "jest/padding-around-all": "off",
118+
// Not all padding required
119+
// "jest/padding-around-all": "off",
106120

107-
"jest/padding-around-before-all-blocks": "error",
121+
"jest/padding-around-before-all-blocks": "error",
108122

109-
"jest/padding-around-before-each-blocks": "error",
123+
"jest/padding-around-before-each-blocks": "error",
110124

111-
"jest/padding-around-describe-blocks": "error",
125+
"jest/padding-around-describe-blocks": "error",
112126

113-
"jest/padding-around-expect-groups": "off",
127+
"jest/padding-around-expect-groups": "off",
114128

115-
"jest/padding-around-test-blocks": "error",
129+
"jest/padding-around-test-blocks": "error",
116130

117-
// No need
118-
// "jest/prefer-called-with": "error",
131+
// No need
132+
// "jest/prefer-called-with": "error",
119133

120-
"jest/prefer-comparison-matcher": "error",
134+
"jest/prefer-comparison-matcher": "error",
121135

122-
// No need
123-
// "jest/prefer-each": "error",
136+
// No need
137+
// "jest/prefer-each": "error",
124138

125-
"jest/prefer-equality-matcher": "error",
139+
"jest/prefer-equality-matcher": "error",
126140

127-
// No need
128-
// "jest/prefer-expect-assertions": "error",
141+
// No need
142+
// "jest/prefer-expect-assertions": "error",
129143

130-
// No need
131-
// "jest/prefer-expect-resolves": "error",
144+
// No need
145+
// "jest/prefer-expect-resolves": "error",
132146

133-
"jest/prefer-hooks-in-order": "error",
147+
"jest/prefer-hooks-in-order": "error",
134148

135-
"jest/prefer-hooks-on-top": "error",
149+
"jest/prefer-hooks-on-top": "error",
136150

137-
// No need
138-
// "jest/prefer-importing-jest-globals": "error",
151+
// No need
152+
// "jest/prefer-importing-jest-globals": "error",
139153

140-
"jest/prefer-jest-mocked": "error",
154+
"jest/prefer-jest-mocked": "error",
141155

142-
// Allow to use `MyClass` title in describe for class testing
143-
"jest/prefer-lowercase-title": ["error", { ignore: ["describe"] }],
156+
// Allow to use `MyClass` title in describe for class testing
157+
"jest/prefer-lowercase-title": ["error", { ignore: ["describe"] }],
144158

145-
"jest/prefer-mock-promise-shorthand": "error",
159+
"jest/prefer-mock-promise-shorthand": "error",
146160

147-
// No need
148-
// "jest/prefer-snapshot-hint": "error",
161+
// No need
162+
// "jest/prefer-snapshot-hint": "error",
149163

150-
"jest/prefer-spy-on": "error",
164+
"jest/prefer-spy-on": "error",
151165

152-
// No need
153-
// "jest/prefer-strict-equal": "off",
166+
// No need
167+
// "jest/prefer-strict-equal": "off",
154168

155-
"jest/prefer-to-be": "error",
169+
"jest/prefer-to-be": "error",
156170

157-
"jest/prefer-to-contain": "error",
171+
"jest/prefer-to-contain": "error",
158172

159-
"jest/prefer-to-have-length": "error",
173+
"jest/prefer-to-have-length": "error",
160174

161-
// No need
162-
// "jest/prefer-todo": "error"
175+
// No need
176+
// "jest/prefer-todo": "error"
163177

164-
// No need
165-
// Does not allow using the function as test generation
166-
"jest/require-hook": "off",
178+
// No need
179+
// Does not allow using the function as test generation
180+
"jest/require-hook": "off",
167181

168-
"jest/require-to-throw-message": "error",
182+
"jest/require-to-throw-message": "error",
169183

170-
"jest/require-top-level-describe": "error",
184+
"jest/require-top-level-describe": "error",
171185

172-
// From recommended
173-
// "jest/valid-describe-callback": "error",
186+
// From recommended
187+
// "jest/valid-describe-callback": "error",
174188

175-
// From recommended
176-
// "jest/valid-expect": "error",
189+
// From recommended
190+
// "jest/valid-expect": "error",
177191

178-
// From recommended
179-
// "jest/valid-expect-in-promise": "error",
192+
// From recommended
193+
// "jest/valid-expect-in-promise": "error",
180194

181-
// From recommended
182-
"jest/valid-title": [
183-
"error",
184-
{
185-
// Allow to use variables in tests
186-
ignoreTypeOfDescribeName: true,
187-
// Allow to use variables in tests
188-
ignoreTypeOfTestName: true,
189-
},
190-
],
195+
// From recommended
196+
"jest/valid-title": [
197+
"error",
198+
{
199+
// Allow to use variables in tests
200+
ignoreTypeOfDescribeName: true,
201+
// Allow to use variables in tests
202+
ignoreTypeOfTestName: true,
203+
},
204+
],
191205

192-
// Disable it for tests, because often you can use `a`, `b`, `c` and etc variables
193-
"id-length": "off",
206+
// Disable it for tests, because often you can use `a`, `b`, `c` and etc variables
207+
"id-length": "off",
194208

195-
// In tests, we can have any names
196-
camelcase: "off",
209+
// In tests, we can have any names
210+
camelcase: "off",
197211

198-
// Doesn't require jsdoc for tests, they are either redundant or we have a separate task for checking types of tests
199-
"jsdoc/require-jsdoc": "off",
200-
},
201-
};
212+
// Doesn't require jsdoc for tests, they are either redundant or we have a separate task for checking types of tests
213+
"jsdoc/require-jsdoc": "off",
214+
},
215+
};
216+
}
202217

203218
export default {
204-
"jest/recommended": recommendedConfig,
219+
"jest/recommended": await getJestRecommendedConfig(),
205220
};

0 commit comments

Comments
 (0)