Skip to content

Commit 91b6dca

Browse files
refactor: automatically generate all rules (#346)
1 parent d4f460f commit 91b6dca

File tree

2 files changed

+30
-51
lines changed

2 files changed

+30
-51
lines changed

lib/index.ts

+1-51
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,4 @@
1-
import awaitAsyncQuery from './rules/await-async-query';
2-
import awaitAsyncUtils from './rules/await-async-utils';
3-
import awaitFireEvent from './rules/await-fire-event';
4-
import consistentDataTestid from './rules/consistent-data-testid';
5-
import noAwaitSyncEvents from './rules/no-await-sync-events';
6-
import noAwaitSyncQuery from './rules/no-await-sync-query';
7-
import noContainer from './rules/no-container';
8-
import noDebug from './rules/no-debug';
9-
import noDomImport from './rules/no-dom-import';
10-
import noManualCleanup from './rules/no-manual-cleanup';
11-
import noNodeAccess from './rules/no-node-access';
12-
import noPromiseInFireEvent from './rules/no-promise-in-fire-event';
13-
import noRenderInSetup from './rules/no-render-in-setup';
14-
import noWaitForEmptyCallback from './rules/no-wait-for-empty-callback';
15-
import noWaitForSnapshot from './rules/no-wait-for-snapshot';
16-
import preferExplicitAssert from './rules/prefer-explicit-assert';
17-
import preferPresenceQueries from './rules/prefer-presence-queries';
18-
import preferScreenQueries from './rules/prefer-screen-queries';
19-
import preferUserEvent from './rules/prefer-user-event';
20-
import preferWaitFor from './rules/prefer-wait-for';
21-
import noWaitForMultipleAssertions from './rules/no-wait-for-multiple-assertions';
22-
import preferFindBy from './rules/prefer-find-by';
23-
import noWaitForSideEffects from './rules/no-wait-for-side-effects';
24-
import renderResultNamingConvention from './rules/render-result-naming-convention';
25-
26-
const rules = {
27-
'await-async-query': awaitAsyncQuery,
28-
'await-async-utils': awaitAsyncUtils,
29-
'await-fire-event': awaitFireEvent,
30-
'consistent-data-testid': consistentDataTestid,
31-
'no-await-sync-events': noAwaitSyncEvents,
32-
'no-await-sync-query': noAwaitSyncQuery,
33-
'no-container': noContainer,
34-
'no-debug': noDebug,
35-
'no-dom-import': noDomImport,
36-
'no-manual-cleanup': noManualCleanup,
37-
'no-node-access': noNodeAccess,
38-
'no-promise-in-fire-event': noPromiseInFireEvent,
39-
'no-render-in-setup': noRenderInSetup,
40-
'no-wait-for-empty-callback': noWaitForEmptyCallback,
41-
'no-wait-for-multiple-assertions': noWaitForMultipleAssertions,
42-
'no-wait-for-side-effects': noWaitForSideEffects,
43-
'no-wait-for-snapshot': noWaitForSnapshot,
44-
'prefer-explicit-assert': preferExplicitAssert,
45-
'prefer-find-by': preferFindBy,
46-
'prefer-presence-queries': preferPresenceQueries,
47-
'prefer-screen-queries': preferScreenQueries,
48-
'prefer-user-event': preferUserEvent,
49-
'prefer-wait-for': preferWaitFor,
50-
'render-result-naming-convention': renderResultNamingConvention,
51-
};
1+
import rules from './rules';
522

533
const domRules = {
544
'testing-library/await-async-query': 'error',

lib/rules/index.ts

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { readdirSync } from 'fs';
2+
import { join, parse } from 'path';
3+
4+
import { TSESLint } from '@typescript-eslint/experimental-utils';
5+
6+
type RuleModule = TSESLint.RuleModule<string, unknown[]>;
7+
8+
// Copied from https://github.com/babel/babel/blob/b35c78f08dd854b08575fc66ebca323fdbc59dab/packages/babel-helpers/src/helpers.js#L615-L619
9+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
10+
const interopRequireDefault = (obj: any): { default: unknown } =>
11+
obj?.__esModule ? obj : { default: obj };
12+
13+
const importDefault = (moduleName: string) =>
14+
// eslint-disable-next-line @typescript-eslint/no-var-requires
15+
interopRequireDefault(require(moduleName)).default;
16+
17+
const rulesDir = __dirname;
18+
const excludedFiles = ['index'];
19+
20+
export default readdirSync(rulesDir)
21+
.map((rule) => parse(rule).name)
22+
.filter((ruleName) => !excludedFiles.includes(ruleName))
23+
.reduce<Record<string, RuleModule>>(
24+
(allRules, ruleName) => ({
25+
...allRules,
26+
[ruleName]: importDefault(join(rulesDir, ruleName)) as RuleModule,
27+
}),
28+
{}
29+
);

0 commit comments

Comments
 (0)