Skip to content

Commit c2ddd3a

Browse files
committed
fix: generate static rules and configs
1 parent 9e82e66 commit c2ddd3a

File tree

13 files changed

+146
-88
lines changed

13 files changed

+146
-88
lines changed

lib/configs/angular.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// DO NOT EDIT THIS CODE BY HAND
33
// YOU CAN REGENERATE IT USING pnpm run generate:configs
44

5+
import type { Linter } from 'eslint';
6+
57
export = {
68
plugins: ['testing-library'],
79
rules: {
@@ -32,4 +34,4 @@ export = {
3234
'testing-library/prefer-screen-queries': 'error',
3335
'testing-library/render-result-naming-convention': 'error',
3436
},
35-
};
37+
} satisfies Linter.LegacyConfig;

lib/configs/dom.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// DO NOT EDIT THIS CODE BY HAND
33
// YOU CAN REGENERATE IT USING pnpm run generate:configs
44

5+
import type { Linter } from 'eslint';
6+
57
export = {
68
plugins: ['testing-library'],
79
rules: {
@@ -27,4 +29,4 @@ export = {
2729
'testing-library/prefer-query-by-disappearance': 'error',
2830
'testing-library/prefer-screen-queries': 'error',
2931
},
30-
};
32+
} satisfies Linter.LegacyConfig;

lib/configs/index.ts

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
1-
import { join } from 'path';
2-
3-
import { importDefault, SUPPORTED_TESTING_FRAMEWORKS } from '../utils';
1+
import angular from './angular';
2+
import dom from './dom';
3+
import marko from './marko';
4+
import react from './react';
5+
import svelte from './svelte';
6+
import vue from './vue';
47

58
import type { SupportedTestingFramework } from '../utils';
6-
import type { TSESLint } from '@typescript-eslint/utils';
7-
8-
const configsDir = __dirname;
9+
import type { Linter } from 'eslint';
910

10-
const getConfigForFramework = (framework: SupportedTestingFramework) =>
11-
importDefault<TSESLint.SharedConfig.RulesRecord>(join(configsDir, framework));
11+
const legacyConfigs: Record<SupportedTestingFramework, Linter.LegacyConfig> = {
12+
dom,
13+
angular,
14+
react,
15+
vue,
16+
svelte,
17+
marko,
18+
};
1219

13-
export default SUPPORTED_TESTING_FRAMEWORKS.reduce(
14-
(allConfigs, framework) => ({
15-
...allConfigs,
16-
[framework]: getConfigForFramework(framework),
17-
}),
18-
{}
19-
) as Record<SupportedTestingFramework, TSESLint.SharedConfig.RulesRecord>;
20+
export { legacyConfigs };

lib/configs/marko.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// DO NOT EDIT THIS CODE BY HAND
33
// YOU CAN REGENERATE IT USING pnpm run generate:configs
44

5+
import type { Linter } from 'eslint';
6+
57
export = {
68
plugins: ['testing-library'],
79
rules: {
@@ -29,4 +31,4 @@ export = {
2931
'testing-library/prefer-screen-queries': 'error',
3032
'testing-library/render-result-naming-convention': 'error',
3133
},
32-
};
34+
} satisfies Linter.LegacyConfig;

lib/configs/react.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// DO NOT EDIT THIS CODE BY HAND
33
// YOU CAN REGENERATE IT USING pnpm run generate:configs
44

5+
import type { Linter } from 'eslint';
6+
57
export = {
68
plugins: ['testing-library'],
79
rules: {
@@ -34,4 +36,4 @@ export = {
3436
'testing-library/prefer-screen-queries': 'error',
3537
'testing-library/render-result-naming-convention': 'error',
3638
},
37-
};
39+
} satisfies Linter.LegacyConfig;

lib/configs/svelte.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// DO NOT EDIT THIS CODE BY HAND
33
// YOU CAN REGENERATE IT USING pnpm run generate:configs
44

5+
import type { Linter } from 'eslint';
6+
57
export = {
68
plugins: ['testing-library'],
79
rules: {
@@ -29,4 +31,4 @@ export = {
2931
'testing-library/prefer-screen-queries': 'error',
3032
'testing-library/render-result-naming-convention': 'error',
3133
},
32-
};
34+
} satisfies Linter.LegacyConfig;

lib/configs/vue.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// DO NOT EDIT THIS CODE BY HAND
33
// YOU CAN REGENERATE IT USING pnpm run generate:configs
44

5+
import type { Linter } from 'eslint';
6+
57
export = {
68
plugins: ['testing-library'],
79
rules: {
@@ -29,4 +31,4 @@ export = {
2931
'testing-library/prefer-screen-queries': 'error',
3032
'testing-library/render-result-naming-convention': 'error',
3133
},
32-
};
34+
} satisfies Linter.LegacyConfig;

lib/index.ts

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,56 @@
1-
import configs from './configs';
1+
import { legacyConfigs } from './configs';
22
import rules from './rules';
33

44
import type { SupportedTestingFramework } from './utils';
55
import type { TSESLint } from '@typescript-eslint/utils';
66

7-
// we can't natively import package.json as tsc will copy it into dist/
87
const {
98
name: packageName,
109
version: packageVersion,
10+
// we can't natively import package.json as tsc will copy it into dist/
1111
// eslint-disable-next-line @typescript-eslint/no-require-imports
1212
} = require('../package.json') as { name: string; version: string };
1313

14+
type FinalConfigs = Record<
15+
SupportedTestingFramework | `flat/${SupportedTestingFramework}`,
16+
TSESLint.ClassicConfig.Config | TSESLint.FlatConfig.Config
17+
>;
18+
1419
const plugin = {
1520
meta: {
1621
name: packageName,
1722
version: packageVersion,
1823
},
19-
// ugly cast for now to keep TypeScript happy since
20-
// we don't have types for flat config yet
21-
configs: {} as Record<
22-
SupportedTestingFramework | `flat/${SupportedTestingFramework}`,
23-
TSESLint.SharedConfig.RulesRecord
24-
>,
24+
configs: {} as FinalConfigs,
2525
rules,
2626
};
2727

2828
plugin.configs = {
29-
...configs,
30-
...(Object.fromEntries(
31-
Object.entries(configs).map(([framework, config]) => [
32-
`flat/${framework}`,
33-
{
34-
plugins: { 'testing-library': plugin },
35-
rules: config.rules,
36-
},
37-
])
38-
) as unknown as Record<
39-
`flat/${SupportedTestingFramework}`,
40-
TSESLint.SharedConfig.RulesRecord & { plugins: unknown }
41-
>),
42-
};
29+
...legacyConfigs,
30+
'flat/dom': {
31+
plugins: { 'testing-library': plugin },
32+
rules: legacyConfigs.dom.rules,
33+
},
34+
'flat/angular': {
35+
plugins: { 'testing-library': plugin },
36+
rules: legacyConfigs.angular.rules,
37+
},
38+
'flat/react': {
39+
plugins: { 'testing-library': plugin },
40+
rules: legacyConfigs.react.rules,
41+
},
42+
'flat/vue': {
43+
plugins: { 'testing-library': plugin },
44+
rules: legacyConfigs.vue.rules,
45+
},
46+
'flat/svelte': {
47+
plugins: { 'testing-library': plugin },
48+
rules: legacyConfigs.svelte.rules,
49+
},
50+
'flat/marko': {
51+
plugins: { 'testing-library': plugin },
52+
rules: legacyConfigs.marko.rules,
53+
},
54+
} satisfies FinalConfigs;
4355

4456
export = plugin;

lib/rules/index.ts

Lines changed: 58 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,59 @@
1-
import { readdirSync } from 'fs';
2-
import { join, parse } from 'path';
1+
import awaitAsyncEvents from './await-async-events';
2+
import awaitAsyncQueries from './await-async-queries';
3+
import awaitAsyncUtils from './await-async-utils';
4+
import consistentDataTestid from './consistent-data-testid';
5+
import noAwaitSyncEvents from './no-await-sync-events';
6+
import noAwaitSyncQueries from './no-await-sync-queries';
7+
import noContainer from './no-container';
8+
import noDebuggingUtils from './no-debugging-utils';
9+
import noDomImport from './no-dom-import';
10+
import noGlobalRegexpFlagInQuery from './no-global-regexp-flag-in-query';
11+
import noManualCleanup from './no-manual-cleanup';
12+
import noNodeAccess from './no-node-access';
13+
import noPromiseInFireEvent from './no-promise-in-fire-event';
14+
import noRenderInLifecycle from './no-render-in-lifecycle';
15+
import noTestIdQueries from './no-test-id-queries';
16+
import noUnnecessaryAct from './no-unnecessary-act';
17+
import noWaitForMultipleAssertions from './no-wait-for-multiple-assertions';
18+
import noWaitForSideEffects from './no-wait-for-side-effects';
19+
import noWaitForSnapshot from './no-wait-for-snapshot';
20+
import preferExplicitAssert from './prefer-explicit-assert';
21+
import preferFindBy from './prefer-find-by';
22+
import preferImplicitAssert from './prefer-implicit-assert';
23+
import preferPresenceQueries from './prefer-presence-queries';
24+
import preferQueryByDisappearance from './prefer-query-by-disappearance';
25+
import preferQueryMatchers from './prefer-query-matchers';
26+
import preferScreenQueries from './prefer-screen-queries';
27+
import preferUserEvent from './prefer-user-event';
28+
import renderResultNamingConvention from './render-result-naming-convention';
329

4-
import { importDefault } from '../utils';
5-
6-
import type { TestingLibraryPluginRuleModule } from '../utils';
7-
8-
const rulesDir = __dirname;
9-
const excludedFiles = ['index'];
10-
11-
export default readdirSync(rulesDir)
12-
.map((rule) => parse(rule).name)
13-
.filter((ruleName) => !excludedFiles.includes(ruleName))
14-
.reduce<Record<string, TestingLibraryPluginRuleModule<string, unknown[]>>>(
15-
(allRules, ruleName) => ({
16-
...allRules,
17-
[ruleName]: importDefault<
18-
TestingLibraryPluginRuleModule<string, unknown[]>
19-
>(join(rulesDir, ruleName)),
20-
}),
21-
{}
22-
);
30+
export default {
31+
'await-async-events': awaitAsyncEvents,
32+
'await-async-queries': awaitAsyncQueries,
33+
'await-async-utils': awaitAsyncUtils,
34+
'consistent-data-testid': consistentDataTestid,
35+
'no-await-sync-events': noAwaitSyncEvents,
36+
'no-await-sync-queries': noAwaitSyncQueries,
37+
'no-container': noContainer,
38+
'no-debugging-utils': noDebuggingUtils,
39+
'no-dom-import': noDomImport,
40+
'no-global-regexp-flag-in-query': noGlobalRegexpFlagInQuery,
41+
'no-manual-cleanup': noManualCleanup,
42+
'no-node-access': noNodeAccess,
43+
'no-promise-in-fire-event': noPromiseInFireEvent,
44+
'no-render-in-lifecycle': noRenderInLifecycle,
45+
'no-test-id-queries': noTestIdQueries,
46+
'no-unnecessary-act': noUnnecessaryAct,
47+
'no-wait-for-multiple-assertions': noWaitForMultipleAssertions,
48+
'no-wait-for-side-effects': noWaitForSideEffects,
49+
'no-wait-for-snapshot': noWaitForSnapshot,
50+
'prefer-explicit-assert': preferExplicitAssert,
51+
'prefer-find-by': preferFindBy,
52+
'prefer-implicit-assert': preferImplicitAssert,
53+
'prefer-presence-queries': preferPresenceQueries,
54+
'prefer-query-by-disappearance': preferQueryByDisappearance,
55+
'prefer-query-matchers': preferQueryMatchers,
56+
'prefer-screen-queries': preferScreenQueries,
57+
'prefer-user-event': preferUserEvent,
58+
'render-result-naming-convention': renderResultNamingConvention,
59+
};

lib/utils/file-import.ts

Lines changed: 0 additions & 9 deletions
This file was deleted.

0 commit comments

Comments
 (0)