From c62e3080c310b668cd697dd92d9baa71f7141d36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20De=20Boey?= Date: Mon, 19 Apr 2021 13:01:14 +0200 Subject: [PATCH] refactor: automatically generate all rules --- lib/index.ts | 52 +--------------------------------------------- lib/rules/index.ts | 29 ++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 51 deletions(-) create mode 100644 lib/rules/index.ts diff --git a/lib/index.ts b/lib/index.ts index 4e874216..661a7129 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,54 +1,4 @@ -import awaitAsyncQuery from './rules/await-async-query'; -import awaitAsyncUtils from './rules/await-async-utils'; -import awaitFireEvent from './rules/await-fire-event'; -import consistentDataTestid from './rules/consistent-data-testid'; -import noAwaitSyncEvents from './rules/no-await-sync-events'; -import noAwaitSyncQuery from './rules/no-await-sync-query'; -import noContainer from './rules/no-container'; -import noDebug from './rules/no-debug'; -import noDomImport from './rules/no-dom-import'; -import noManualCleanup from './rules/no-manual-cleanup'; -import noNodeAccess from './rules/no-node-access'; -import noPromiseInFireEvent from './rules/no-promise-in-fire-event'; -import noRenderInSetup from './rules/no-render-in-setup'; -import noWaitForEmptyCallback from './rules/no-wait-for-empty-callback'; -import noWaitForSnapshot from './rules/no-wait-for-snapshot'; -import preferExplicitAssert from './rules/prefer-explicit-assert'; -import preferPresenceQueries from './rules/prefer-presence-queries'; -import preferScreenQueries from './rules/prefer-screen-queries'; -import preferUserEvent from './rules/prefer-user-event'; -import preferWaitFor from './rules/prefer-wait-for'; -import noWaitForMultipleAssertions from './rules/no-wait-for-multiple-assertions'; -import preferFindBy from './rules/prefer-find-by'; -import noWaitForSideEffects from './rules/no-wait-for-side-effects'; -import renderResultNamingConvention from './rules/render-result-naming-convention'; - -const rules = { - 'await-async-query': awaitAsyncQuery, - 'await-async-utils': awaitAsyncUtils, - 'await-fire-event': awaitFireEvent, - 'consistent-data-testid': consistentDataTestid, - 'no-await-sync-events': noAwaitSyncEvents, - 'no-await-sync-query': noAwaitSyncQuery, - 'no-container': noContainer, - 'no-debug': noDebug, - 'no-dom-import': noDomImport, - 'no-manual-cleanup': noManualCleanup, - 'no-node-access': noNodeAccess, - 'no-promise-in-fire-event': noPromiseInFireEvent, - 'no-render-in-setup': noRenderInSetup, - 'no-wait-for-empty-callback': noWaitForEmptyCallback, - 'no-wait-for-multiple-assertions': noWaitForMultipleAssertions, - 'no-wait-for-side-effects': noWaitForSideEffects, - 'no-wait-for-snapshot': noWaitForSnapshot, - 'prefer-explicit-assert': preferExplicitAssert, - 'prefer-find-by': preferFindBy, - 'prefer-presence-queries': preferPresenceQueries, - 'prefer-screen-queries': preferScreenQueries, - 'prefer-user-event': preferUserEvent, - 'prefer-wait-for': preferWaitFor, - 'render-result-naming-convention': renderResultNamingConvention, -}; +import rules from './rules'; const domRules = { 'testing-library/await-async-query': 'error', diff --git a/lib/rules/index.ts b/lib/rules/index.ts new file mode 100644 index 00000000..5229c62f --- /dev/null +++ b/lib/rules/index.ts @@ -0,0 +1,29 @@ +import { readdirSync } from 'fs'; +import { join, parse } from 'path'; + +import { TSESLint } from '@typescript-eslint/experimental-utils'; + +type RuleModule = TSESLint.RuleModule; + +// Copied from https://github.com/babel/babel/blob/b35c78f08dd854b08575fc66ebca323fdbc59dab/packages/babel-helpers/src/helpers.js#L615-L619 +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const interopRequireDefault = (obj: any): { default: unknown } => + obj?.__esModule ? obj : { default: obj }; + +const importDefault = (moduleName: string) => + // eslint-disable-next-line @typescript-eslint/no-var-requires + interopRequireDefault(require(moduleName)).default; + +const rulesDir = __dirname; +const excludedFiles = ['index']; + +export default readdirSync(rulesDir) + .map((rule) => parse(rule).name) + .filter((ruleName) => !excludedFiles.includes(ruleName)) + .reduce>( + (allRules, ruleName) => ({ + ...allRules, + [ruleName]: importDefault(join(rulesDir, ruleName)) as RuleModule, + }), + {} + );