diff --git a/README.md b/README.md index 5a34eef..555abc2 100644 --- a/README.md +++ b/README.md @@ -57,9 +57,9 @@ To use the default config, follow these steps: ```js import javascript from '@code-pushup/eslint-config/javascript.js'; - import tseslint from 'typescript-eslint'; + import { defineConfig } from 'eslint/config'; - export default tseslint.config(...javascript); + export default defineConfig(...javascript); ``` Depending on your tech stack, you may wish to extend other configs as well ([listed above](#⚙️-configs)). This will require installing additional peer dependencies. For more details, refer to setup docs for the configs you're interested in using. diff --git a/docs/angular.md b/docs/angular.md index 70461d5..a15009f 100644 --- a/docs/angular.md +++ b/docs/angular.md @@ -15,9 +15,9 @@ Config for **Angular** projects. ```js import angular from '@code-pushup/eslint-config/angular.js'; - import tseslint from 'typescript-eslint'; + import { defineConfig } from 'eslint/config'; - export default tseslint.config( + export default defineConfig( ...angular, { // It is recommended that selectors in Angular use a common custom prefix diff --git a/docs/cypress.md b/docs/cypress.md index f54c617..ae2d277 100644 --- a/docs/cypress.md +++ b/docs/cypress.md @@ -15,9 +15,9 @@ Config for projects using **Cypress** for testing. ```js import cypress from '@code-pushup/eslint-config/cypress.js'; - import tseslint from 'typescript-eslint'; + import { defineConfig } from 'eslint/config'; - export default tseslint.config(...cypress); + export default defineConfig(...cypress); ``` ## 📏 Rules (6) diff --git a/docs/graphql.md b/docs/graphql.md index fe543c9..b6696a5 100644 --- a/docs/graphql.md +++ b/docs/graphql.md @@ -15,9 +15,9 @@ Config for **GraphQL servers** implemented in Node.js. ```js import graphql from '@code-pushup/eslint-config/graphql.js'; - import tseslint from 'typescript-eslint'; + import { defineConfig } from 'eslint/config'; - export default tseslint.config(...graphql); + export default defineConfig(...graphql); ``` 4. The GraphQL ESLint plugin needs to know where your GraphQL schema is located. For more information, refer to [_Extended Linting Rules with GraphQL Schema_ in GraphQL ESLint docs](https://the-guild.dev/graphql/eslint/docs/getting-started#extended-linting-rules-with-graphql-schema). @@ -25,7 +25,7 @@ Config for **GraphQL servers** implemented in Node.js. - Otherwise, you can use [`parserOptions.schema`](https://the-guild.dev/graphql/eslint/docs/getting-started/parser-options#schema), e.g.: ```js - export default tseslint.config( + export default defineConfig( // ... { files: ['**/*.graphql'], diff --git a/docs/jest.md b/docs/jest.md index 330d237..89765b3 100644 --- a/docs/jest.md +++ b/docs/jest.md @@ -15,9 +15,9 @@ Config for projects using **Jest** for testing. ```js import jest from '@code-pushup/eslint-config/jest.js'; - import tseslint from 'typescript-eslint'; + import { defineConfig } from 'eslint/config'; - export default tseslint.config( + export default defineConfig( ...jest, { // customize rules if needed: diff --git a/docs/ngrx.md b/docs/ngrx.md index 567b99c..182a925 100644 --- a/docs/ngrx.md +++ b/docs/ngrx.md @@ -15,9 +15,9 @@ Config for **Angular** projects using **NgRx** library. ```js import ngrx from '@code-pushup/eslint-config/ngrx.js'; - import tseslint from 'typescript-eslint'; + import { defineConfig } from 'eslint/config'; - export default tseslint.config( + export default defineConfig( ...ngrx, { // It is recommended that selectors in Angular use a common custom prefix diff --git a/docs/node.md b/docs/node.md index 82ad887..0a4c8d5 100644 --- a/docs/node.md +++ b/docs/node.md @@ -15,9 +15,9 @@ Config for **Node.js** projects. ```js import node from '@code-pushup/eslint-config/node.js'; - import tseslint from 'typescript-eslint'; + import { defineConfig } from 'eslint/config'; - export default tseslint.config(...node); + export default defineConfig(...node); ``` 4. Some rules (e.g. `n/no-unsupported-features/node-builtins`) need to know which Node version is being used. Configuration options include: @@ -35,7 +35,7 @@ Config for **Node.js** projects. - `settings.node.version` in `eslint.config.js`: ```js - export default tseslint.config({ + export default defineConfig({ // ... { settings: { diff --git a/docs/playwright.md b/docs/playwright.md index a33ce64..d7ca3a8 100644 --- a/docs/playwright.md +++ b/docs/playwright.md @@ -15,9 +15,9 @@ Config for projects using **Playwright** for testing. ```js import playwright from '@code-pushup/eslint-config/playwright.js'; - import tseslint from 'typescript-eslint'; + import { defineConfig } from 'eslint/config'; - export default tseslint.config(...playwright); + export default defineConfig(...playwright); ``` ## 📏 Rules (42) diff --git a/docs/react-testing-library.md b/docs/react-testing-library.md index 7eadf1c..4b0d36f 100644 --- a/docs/react-testing-library.md +++ b/docs/react-testing-library.md @@ -15,9 +15,9 @@ Config for projects using **React Testing Library** for testing. ```js import react-testing-library from '@code-pushup/eslint-config/react-testing-library.js'; - import tseslint from 'typescript-eslint'; + import { defineConfig } from 'eslint/config'; - export default tseslint.config(...react-testing-library); + export default defineConfig(...react-testing-library); ``` ## 📏 Rules (25) diff --git a/docs/react.md b/docs/react.md index f3bee82..2c9c4f6 100644 --- a/docs/react.md +++ b/docs/react.md @@ -15,9 +15,9 @@ Config for **React** projects. ```js import react from '@code-pushup/eslint-config/react.js'; - import tseslint from 'typescript-eslint'; + import { defineConfig } from 'eslint/config'; - export default tseslint.config(...react); + export default defineConfig(...react); ``` ## 📏 Rules (420) diff --git a/docs/storybook.md b/docs/storybook.md index e32b802..9205d9b 100644 --- a/docs/storybook.md +++ b/docs/storybook.md @@ -15,9 +15,9 @@ Config for projects using **Storybook** for UI components. ```js import storybook from '@code-pushup/eslint-config/storybook.js'; - import tseslint from 'typescript-eslint'; + import { defineConfig } from 'eslint/config'; - export default tseslint.config(...storybook); + export default defineConfig(...storybook); ``` ## 📏 Rules (12) diff --git a/docs/typescript.md b/docs/typescript.md index a893a88..90b2e36 100644 --- a/docs/typescript.md +++ b/docs/typescript.md @@ -9,9 +9,9 @@ Config for strict **TypeScript** projects. ```js import typescript from '@code-pushup/eslint-config/typescript.js'; - import tseslint from 'typescript-eslint'; + import { defineConfig } from 'eslint/config'; - export default tseslint.config(...typescript); + export default defineConfig(...typescript); ``` 3. Because this config includes rules which require type information, make sure to configure `parserOptions.project` in your `eslint.config.js` points to your project's tsconfig. @@ -20,10 +20,10 @@ Config for strict **TypeScript** projects. - Example for library in Nx monorepo: ```js - import tseslint from 'typescript-eslint'; + import { defineConfig } from 'eslint/config'; import baseConfig from '../../eslint.config.js'; - export default tseslint.config( + export default defineConfig( ...baseConfig, { files: ['**/*.ts'], @@ -49,7 +49,7 @@ Config for strict **TypeScript** projects. - Example `eslint.config.js` for Nx monorepo: ```js - export default tseslint.config( + export default defineConfig( // ... { settings: { diff --git a/docs/vitest.md b/docs/vitest.md index 0aafa98..66d417c 100644 --- a/docs/vitest.md +++ b/docs/vitest.md @@ -15,9 +15,9 @@ Config for projects using **Vitest** for testing. ```js import vitest from '@code-pushup/eslint-config/vitest.js'; - import tseslint from 'typescript-eslint'; + import { defineConfig } from 'eslint/config'; - export default tseslint.config( + export default defineConfig( ...vitest, { // customize rules if needed: diff --git a/eslint.config.js b/eslint.config.js index 3026c62..d792d96 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,13 +1,13 @@ // @ts-check import { includeIgnoreFile } from '@eslint/compat'; +import { defineConfig } from 'eslint/config'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; -import tseslint from 'typescript-eslint'; import node from './src/configs/node.js'; import vitest from './src/configs/vitest.js'; -export default tseslint.config( +export default defineConfig( includeIgnoreFile( path.join(path.dirname(fileURLToPath(import.meta.url)), '.gitignore'), ), diff --git a/scripts/docs.js b/scripts/docs.js index a755b0c..a4caa0f 100644 --- a/scripts/docs.js +++ b/scripts/docs.js @@ -217,7 +217,9 @@ function findRuleData(id, config, rules) { id, ) ?? findRuleEntry( - config.flatConfig.filter(({ files }) => files !== TEST_FILE_PATTERNS), + config.flatConfig.filter( + ({ files }) => !patternsEqual(files, TEST_FILE_PATTERNS), + ), id, ); if (entry == null) { @@ -225,6 +227,7 @@ function findRuleData(id, config, rules) { `Internal logic error - no entry found for rule ${id} in ${config.name} config`, ); } + const options = Array.isArray(entry) && entry.length > 1 && entry.slice(1); const level = ruleLevelFromEntry(entry); if (level === 'off') { throw new Error( @@ -233,25 +236,20 @@ function findRuleData(id, config, rules) { } const testEntry = findRuleEntry( - config.flatConfig.filter(({ files }) => files === TEST_FILE_PATTERNS), + config.flatConfig.filter(({ files }) => + patternsEqual(files, TEST_FILE_PATTERNS), + ), id, ); const testLevel = testEntry == null ? null : ruleLevelFromEntry(testEntry); + const testOverride = testLevel && testLevel !== level && { level: testLevel }; return { id, meta, level, - ...(Array.isArray(entry) && - entry.length > 1 && { - options: entry.slice(1), - }), - ...(testLevel && - testLevel !== level && { - testOverride: { - level: testLevel, - }, - }), + ...(options && { options }), + ...(testOverride && { testOverride }), }; } @@ -265,9 +263,21 @@ function getExtendedConfigs(config) { config.flatConfig .map(cfg => cfg.name) .filter(name => name?.startsWith('code-pushup/')) - .map(name => name?.split('/')[1]) + .map(name => name?.split('/')[1]?.split(' > ')[0]) .filter(name => name != null), ), ]; return allExtended.filter(name => name !== config.name).slice(-1); } + +/** + * Checks if patterns are identical. + * + * ESLint's `defineConfig` copies `files` arrays, so `===` and `!==` can't be used. + * + * @param {(string | string[])[] | undefined} lhs Minimatch patterns (left-hand side) + * @param {(string | string[])[] | undefined} rhs Minimatch patterns (right-hand side) + */ +function patternsEqual(lhs, rhs) { + return JSON.stringify(lhs) === JSON.stringify(rhs); +} diff --git a/scripts/helpers/configs.js b/scripts/helpers/configs.js index 309eff1..fcb2f7d 100644 --- a/scripts/helpers/configs.js +++ b/scripts/helpers/configs.js @@ -80,10 +80,10 @@ For more information, refer to ${md.link('https://typescript-eslint.io/linting/t [ md`Example for library in Nx monorepo:${md.codeBlock( 'js', - `import tseslint from 'typescript-eslint'; + `import { defineConfig } from 'eslint/config'; import baseConfig from '../../eslint.config.js'; -export default tseslint.config( +export default defineConfig( ...baseConfig, { files: ['**/*.ts'], @@ -105,7 +105,7 @@ export default tseslint.config( md`Install additional import resolver:${md.codeBlock('sh', 'npm i -D eslint-import-resolver-typescript')}`, md`Example ${md.code(eslintConfig)} for Nx monorepo:${md.codeBlock( 'js', - `export default tseslint.config( + `export default defineConfig( // ... { settings: { @@ -139,7 +139,7 @@ export default tseslint.config( )}`, md`${md.code('settings.node.version')} in ${md.code(eslintConfig)}: ${md.codeBlock( 'js', - `export default tseslint.config({ + `export default defineConfig({ // ... { settings: { @@ -159,7 +159,7 @@ export default tseslint.config( md`If you're using ${md.link('https://the-guild.dev/graphql/config/docs', 'graphql-config')}, then your GraphQL schema will be loaded automatically from your ${md.code('.graphqlrc.yml')} (or equivalent) file. So no extra setup is required in this case.`, md`Otherwise, you can use ${md.link('https://the-guild.dev/graphql/eslint/docs/getting-started/parser-options#schema', md.code('parserOptions.schema'))}, e.g.:${md.codeBlock( 'js', - `export default tseslint.config( + `export default defineConfig( // ... { files: ['**/*.graphql'], diff --git a/scripts/helpers/format-config.js b/scripts/helpers/format-config.js index 5158e04..7fcecf5 100644 --- a/scripts/helpers/format-config.js +++ b/scripts/helpers/format-config.js @@ -78,15 +78,15 @@ function setupDocs(config, peerDeps) { 'js', [ `import ${config} from '@code-pushup/eslint-config/${config}.js';`, - "import tseslint from 'typescript-eslint';", + "import { defineConfig } from 'eslint/config';", '', ...(configsExtraEslintrc[config] ? [ - 'export default tseslint.config(', + 'export default defineConfig(', ` ...${config}${configsExtraEslintrc[config]}`, ');', ] - : [`export default tseslint.config(...${config});`]), + : [`export default defineConfig(...${config});`]), ].join('\n'), )}`, ...(extraSetupDocs ? [extraSetupDocs] : []), diff --git a/scripts/helpers/format-readme.js b/scripts/helpers/format-readme.js index 6cb405d..98ec3e5 100644 --- a/scripts/helpers/format-readme.js +++ b/scripts/helpers/format-readme.js @@ -93,9 +93,9 @@ function basicSetupDocs(peerDeps) { 'js', [ "import javascript from '@code-pushup/eslint-config/javascript.js';", - "import tseslint from 'typescript-eslint';", + "import { defineConfig } from 'eslint/config';", '', - 'export default tseslint.config(...javascript);', + 'export default defineConfig(...javascript);', ].join('\n'), )}`, ]) diff --git a/src/configs/angular.js b/src/configs/angular.js index f70acb4..63edbe9 100644 --- a/src/configs/angular.js +++ b/src/configs/angular.js @@ -2,8 +2,8 @@ import angular from 'angular-eslint'; import rxjs from 'eslint-plugin-rxjs-x'; +import { defineConfig } from 'eslint/config'; import globals from 'globals'; -import tseslint from 'typescript-eslint'; import { ANGULAR_COMPONENT_FILE_PATTERNS, ANGULAR_PIPE_FILE_PATTERNS, @@ -20,7 +20,7 @@ import { } from '../lib/rule-options.js'; import typescript from './typescript.js'; -export default tseslint.config( +export default defineConfig( ...typescript, { plugins: { @@ -28,6 +28,7 @@ export default tseslint.config( }, }, { + name: 'code-pushup/angular', files: TYPESCRIPT_FILE_PATTERNS, processor: angular.processInlineTemplates, languageOptions: { @@ -118,6 +119,7 @@ export default tseslint.config( ], }, { + name: 'code-pushup/angular/template', files: HTML_FILE_PATTERNS, extends: [ ...angular.configs.templateRecommended, @@ -158,6 +160,7 @@ export default tseslint.config( ], }, { + name: 'code-pushup/angular/tests', files: TEST_FILE_PATTERNS, ignores: negatePatterns(TYPESCRIPT_FILE_PATTERNS), extends: [ diff --git a/src/configs/cypress.js b/src/configs/cypress.js index a063754..3615bfa 100644 --- a/src/configs/cypress.js +++ b/src/configs/cypress.js @@ -1,10 +1,11 @@ // @ts-check import cypress from 'eslint-plugin-cypress/flat'; -import tseslint from 'typescript-eslint'; +import { defineConfig } from 'eslint/config'; import { CYPRESS_FILE_PATTERNS } from '../lib/patterns.js'; -export default tseslint.config({ +export default defineConfig({ + name: 'code-pushup/cypress', files: CYPRESS_FILE_PATTERNS, extends: [ cypress.configs.recommended, diff --git a/src/configs/graphql.js b/src/configs/graphql.js index e93d282..6f475f9 100644 --- a/src/configs/graphql.js +++ b/src/configs/graphql.js @@ -1,7 +1,7 @@ // @ts-check import * as graphqlEslint from '@graphql-eslint/eslint-plugin'; -import tseslint from 'typescript-eslint'; +import { defineConfig } from 'eslint/config'; import { GRAPHQL_FILE_PATTERNS, NODE_FILE_PATTERNS } from '../lib/patterns.js'; import node from './node.js'; @@ -12,9 +12,11 @@ export { NAMING_CONVENTION_OPTIONS_GRAPHQL } from '../lib/rule-options.js'; const v3FlatConfigs = 'flatConfigs' in graphqlEslint ? graphqlEslint.flatConfigs : undefined; -export default tseslint.config(...node, { +export default defineConfig(...node, { + name: 'code-pushup/graphql', files: GRAPHQL_FILE_PATTERNS, plugins: { + // @ts-expect-error incompatible meta.docs.category type in rules (`CategoryType | CategoryType[]` not assignable to `string | undefined`) '@graphql-eslint': graphqlEslint, }, extends: [ diff --git a/src/configs/javascript.js b/src/configs/javascript.js index d8056dd..806325c 100644 --- a/src/configs/javascript.js +++ b/src/configs/javascript.js @@ -6,6 +6,7 @@ import * as importPlugin from 'eslint-plugin-import'; import promise from 'eslint-plugin-promise'; import sonarjs from 'eslint-plugin-sonarjs'; import unicorn from 'eslint-plugin-unicorn'; +import { defineConfig } from 'eslint/config'; import tseslint from 'typescript-eslint'; import { COMMONJS_FILE_PATTERNS, @@ -20,8 +21,9 @@ import { } from '../lib/patterns.js'; import { convertErrorsToWarnings } from '../lib/utils.js'; -export default tseslint.config( +export default defineConfig( { + name: 'code-pushup/javascript', files: JAVASCRIPT_EXTENDED_FILE_PATTERNS, extends: [ eslint.configs.recommended, diff --git a/src/configs/jest.js b/src/configs/jest.js index 7fca549..389afc8 100644 --- a/src/configs/jest.js +++ b/src/configs/jest.js @@ -1,10 +1,11 @@ // @ts-check import jest from 'eslint-plugin-jest'; -import tseslint from 'typescript-eslint'; +import { defineConfig } from 'eslint/config'; import { UNIT_TEST_FILE_PATTERNS } from '../lib/patterns.js'; -export default tseslint.config({ +export default defineConfig({ + name: 'code-pushup/jest', files: UNIT_TEST_FILE_PATTERNS, extends: [ jest.configs['flat/recommended'], diff --git a/src/configs/ngrx.js b/src/configs/ngrx.js index bbf3d17..6096a9a 100644 --- a/src/configs/ngrx.js +++ b/src/configs/ngrx.js @@ -1,17 +1,22 @@ // @ts-check import ngrx from '@ngrx/eslint-plugin'; -import tseslint from 'typescript-eslint'; +import { defineConfig } from 'eslint/config'; import { TYPESCRIPT_FILE_PATTERNS } from '../lib/patterns.js'; import angular from './angular.js'; -export default tseslint.config(...angular, { +/** @type {import('eslint').ESLint.Plugin} */ +// @ts-expect-error rules in configs have string values instead of RuleConfig +const ngrxPlugin = ngrx; + +export default defineConfig(...angular, { + name: 'code-pushup/ngrx', files: TYPESCRIPT_FILE_PATTERNS, extends: [ { name: 'code-pushup/ngrx/ngrx', plugins: { - '@ngrx': ngrx, + '@ngrx': ngrxPlugin, }, rules: { // https://ngrx.io/guide/eslint-plugin#rules diff --git a/src/configs/node.js b/src/configs/node.js index f59b9ce..4e73fc9 100644 --- a/src/configs/node.js +++ b/src/configs/node.js @@ -1,12 +1,12 @@ // @ts-check import nodePlugin from 'eslint-plugin-n'; +import { defineConfig } from 'eslint/config'; import globals from 'globals'; -import tseslint from 'typescript-eslint'; import javascript from './javascript.js'; -export default tseslint.config(...javascript, { - name: 'code-pushup/node/custom', +export default defineConfig(...javascript, { + name: 'code-pushup/node', languageOptions: { globals: globals.node, }, diff --git a/src/configs/playwright.js b/src/configs/playwright.js index b7d26f0..e614a08 100644 --- a/src/configs/playwright.js +++ b/src/configs/playwright.js @@ -1,10 +1,11 @@ // @ts-check import playwright from 'eslint-plugin-playwright'; -import tseslint from 'typescript-eslint'; +import { defineConfig } from 'eslint/config'; import { PLAYWRIGHT_FILE_PATTERNS } from '../lib/patterns.js'; -export default tseslint.config({ +export default defineConfig({ + name: 'code-pushup/playwright', files: PLAYWRIGHT_FILE_PATTERNS, extends: [ playwright.configs['flat/recommended'], diff --git a/src/configs/react-testing-library.js b/src/configs/react-testing-library.js index 8459093..12b0900 100644 --- a/src/configs/react-testing-library.js +++ b/src/configs/react-testing-library.js @@ -1,10 +1,11 @@ // @ts-check import rtl from 'eslint-plugin-testing-library'; -import tseslint from 'typescript-eslint'; +import { defineConfig } from 'eslint/config'; import { UNIT_TEST_FILE_PATTERNS } from '../lib/patterns.js'; -export default tseslint.config({ +export default defineConfig({ + name: 'code-pushup/react-testing-library', files: UNIT_TEST_FILE_PATTERNS, extends: [ rtl.configs['flat/react'], diff --git a/src/configs/react.js b/src/configs/react.js index 1994fb7..9b1c2cd 100644 --- a/src/configs/react.js +++ b/src/configs/react.js @@ -3,12 +3,17 @@ import jsxA11y from 'eslint-plugin-jsx-a11y'; import react from 'eslint-plugin-react'; import reactHooks from 'eslint-plugin-react-hooks'; +import { defineConfig } from 'eslint/config'; import globals from 'globals'; -import tseslint from 'typescript-eslint'; import { REACT_FILE_PATTERNS } from '../lib/patterns.js'; import javascript from './javascript.js'; -export default tseslint.config(...javascript, { +/** @type {import('eslint').ESLint.Plugin} */ +// @ts-expect-error incompatible nesting in configs (e.g. flat -> recommended) +const reactHooksPlugin = reactHooks; + +export default defineConfig(...javascript, { + name: 'code-pushup/react', files: REACT_FILE_PATTERNS, languageOptions: { globals: globals.browser, @@ -19,7 +24,7 @@ export default tseslint.config(...javascript, { { name: 'code-pushup/react/react-hooks', plugins: { - 'react-hooks': reactHooks, + 'react-hooks': reactHooksPlugin, }, rules: { 'react-hooks/rules-of-hooks': 'error', diff --git a/src/configs/storybook.js b/src/configs/storybook.js index 88e9287..66638d2 100644 --- a/src/configs/storybook.js +++ b/src/configs/storybook.js @@ -1,9 +1,13 @@ // @ts-check import storybook from 'eslint-plugin-storybook'; -import tseslint from 'typescript-eslint'; +import { defineConfig } from 'eslint/config'; -export default tseslint.config( - ...storybook.configs['flat/recommended'], - ...storybook.configs['flat/csf'], -); +export default defineConfig({ + name: 'code-pushup/storybook', + // @ts-expect-error incompatible rules types (create function's context parameter) + extends: [ + ...storybook.configs['flat/recommended'], + ...storybook.configs['flat/csf'], + ], +}); diff --git a/src/configs/typescript.js b/src/configs/typescript.js index 61609d1..452fb9a 100644 --- a/src/configs/typescript.js +++ b/src/configs/typescript.js @@ -1,6 +1,7 @@ // @ts-check import * as importPlugin from 'eslint-plugin-import'; +import { defineConfig } from 'eslint/config'; import tseslint from 'typescript-eslint'; import { CONFIG_FILE_PATTERNS, @@ -21,9 +22,10 @@ const tseslintRules = ? Object.keys(tseslint.plugin.rules ?? {}) : []; -export default tseslint.config( +export default defineConfig( ...javascript, { + name: 'code-pushup/typescript', files: TYPESCRIPT_EXTENDED_FILE_PATTERNS, extends: [ ...tseslint.configs.recommendedTypeChecked, @@ -102,6 +104,7 @@ export default tseslint.config( ], }, { + name: 'code-pushup/typescript/tests', files: TEST_FILE_PATTERNS, ignores: negatePatterns(TYPESCRIPT_EXTENDED_FILE_PATTERNS), extends: [ @@ -163,6 +166,7 @@ export default tseslint.config( }, }, { + name: 'code-pushup/typescript/disable-type-checked-for-javascript', files: negatePatterns(TYPESCRIPT_EXTENDED_FILE_PATTERNS), ...tseslint.configs.disableTypeChecked, }, diff --git a/src/configs/vitest.js b/src/configs/vitest.js index f3ad273..021e90f 100644 --- a/src/configs/vitest.js +++ b/src/configs/vitest.js @@ -1,10 +1,11 @@ // @ts-check import vitest from '@vitest/eslint-plugin'; -import tseslint from 'typescript-eslint'; +import { defineConfig } from 'eslint/config'; import { UNIT_TEST_FILE_PATTERNS } from '../lib/patterns.js'; -export default tseslint.config({ +export default defineConfig({ + name: 'code-pushup/vitest', files: UNIT_TEST_FILE_PATTERNS, extends: [ vitest.configs.recommended, diff --git a/tests/configs/typescript.spec.js b/tests/configs/typescript.spec.js index b752b6e..d60cc7b 100644 --- a/tests/configs/typescript.spec.js +++ b/tests/configs/typescript.spec.js @@ -8,8 +8,6 @@ describe('typescript config', () => { setup, teardown, loadConfig, - loadRulesByIds, - getExplicitRuleIds, getEnabledRuleIds, loadRules, requiresTypeChecking, @@ -47,21 +45,6 @@ describe('typescript config', () => { ); }); - it('should only explicitly reference rules which require type checking (with specified exceptions)', async () => { - const { default: typescript } = await import( - '@code-pushup/eslint-config/typescript' - ); - const ruleIds = getExplicitRuleIds(typescript); - const rules = await loadRulesByIds(ruleIds); - const rulesWithoutTypes = Object.entries(rules) - .filter(([, meta]) => !requiresTypeChecking(meta)) - .map(([ruleId]) => ruleId) - .toSorted(); - expect(rulesWithoutTypes).toEqual([ - '@typescript-eslint/consistent-type-assertions', - ]); - }); - it('should have rule disabled if test file pattern matches', async () => { const config = await loadConfig('index.test.ts'); expect(config.rules?.['@typescript-eslint/no-unsafe-assignment']).toEqual([ diff --git a/tests/helpers/lint-utils.js b/tests/helpers/lint-utils.js index 330cebe..c34ba34 100644 --- a/tests/helpers/lint-utils.js +++ b/tests/helpers/lint-utils.js @@ -86,15 +86,6 @@ export default [ /** @param {string | string[]} patterns */ const lint = (patterns = defaultFilePath) => eslint.lintFiles(patterns); - /** - * @param {import('@typescript-eslint/utils').TSESLint.FlatConfig.ConfigArray} configs - * @returns {string[]} - */ - const getExplicitRuleIds = configs => - configs - .filter(config => config.name?.startsWith(`code-pushup/${configName}`)) - .flatMap(getEnabledRuleIds); - /** * @param {import('@typescript-eslint/utils').TSESLint.FlatConfig.Config} config * @returns {string[]} @@ -119,7 +110,6 @@ export default [ loadRules, loadRulesByIds, lint, - getExplicitRuleIds, getEnabledRuleIds, requiresTypeChecking, };