Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
4 changes: 2 additions & 2 deletions docs/angular.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions docs/cypress.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
6 changes: 3 additions & 3 deletions docs/graphql.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,17 @@ 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).
- If you're using [graphql-config](https://the-guild.dev/graphql/config/docs), then your GraphQL schema will be loaded automatically from your `.graphqlrc.yml` (or equivalent) file. So no extra setup is required in this case.
- 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'],
Expand Down
4 changes: 2 additions & 2 deletions docs/jest.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
4 changes: 2 additions & 2 deletions docs/ngrx.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 3 additions & 3 deletions docs/node.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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: {
Expand Down
4 changes: 2 additions & 2 deletions docs/playwright.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
4 changes: 2 additions & 2 deletions docs/react-testing-library.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
4 changes: 2 additions & 2 deletions docs/react.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
4 changes: 2 additions & 2 deletions docs/storybook.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
10 changes: 5 additions & 5 deletions docs/typescript.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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'],
Expand All @@ -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: {
Expand Down
4 changes: 2 additions & 2 deletions docs/vitest.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
4 changes: 2 additions & 2 deletions eslint.config.js
Original file line number Diff line number Diff line change
@@ -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'),
),
Expand Down
36 changes: 23 additions & 13 deletions scripts/docs.js
Original file line number Diff line number Diff line change
Expand Up @@ -217,14 +217,17 @@ 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) {
throw new Error(
`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(
Expand All @@ -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 }),
};
}

Expand All @@ -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);
}
10 changes: 5 additions & 5 deletions scripts/helpers/configs.js
Original file line number Diff line number Diff line change
Expand Up @@ -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'],
Expand All @@ -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: {
Expand Down Expand Up @@ -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: {
Expand All @@ -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'],
Expand Down
6 changes: 3 additions & 3 deletions scripts/helpers/format-config.js
Original file line number Diff line number Diff line change
Expand Up @@ -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] : []),
Expand Down
4 changes: 2 additions & 2 deletions scripts/helpers/format-readme.js
Original file line number Diff line number Diff line change
Expand Up @@ -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'),
)}`,
])
Expand Down
7 changes: 5 additions & 2 deletions src/configs/angular.js
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -20,14 +20,15 @@ import {
} from '../lib/rule-options.js';
import typescript from './typescript.js';

export default tseslint.config(
export default defineConfig(
...typescript,
{
plugins: {
'@angular-eslint': angular.tsPlugin,
},
},
{
name: 'code-pushup/angular',
files: TYPESCRIPT_FILE_PATTERNS,
processor: angular.processInlineTemplates,
languageOptions: {
Expand Down Expand Up @@ -118,6 +119,7 @@ export default tseslint.config(
],
},
{
name: 'code-pushup/angular/template',
files: HTML_FILE_PATTERNS,
extends: [
...angular.configs.templateRecommended,
Expand Down Expand Up @@ -158,6 +160,7 @@ export default tseslint.config(
],
},
{
name: 'code-pushup/angular/tests',
files: TEST_FILE_PATTERNS,
ignores: negatePatterns(TYPESCRIPT_FILE_PATTERNS),
extends: [
Expand Down
Loading