121 lines
3.2 KiB
Markdown
121 lines
3.2 KiB
Markdown
# @antfu/eslint-config
|
|
|
|
Flat ESLint config that handles both linting and formatting - replaces Prettier.
|
|
|
|
## Setup
|
|
|
|
```bash
|
|
pnpm add -D eslint @antfu/eslint-config
|
|
```
|
|
|
|
```js
|
|
// eslint.config.mjs
|
|
import antfu from '@antfu/eslint-config'
|
|
|
|
export default antfu()
|
|
```
|
|
|
|
```json
|
|
{ "scripts": { "lint": "eslint ." } }
|
|
```
|
|
|
|
## Configuration Options
|
|
|
|
```js
|
|
import antfu from '@antfu/eslint-config'
|
|
|
|
export default antfu({
|
|
type: 'lib', // 'lib' for libraries, 'app' for applications
|
|
ignores: ['**/fixtures', '**/dist'],
|
|
stylistic: { indent: 2, quotes: 'single' },
|
|
typescript: true, // Auto-detected
|
|
vue: true, // Auto-detected
|
|
})
|
|
```
|
|
|
|
## Framework Support
|
|
|
|
| Framework | Option | Required Package |
|
|
| --------- | -------------- | ------------------------------------------------------- |
|
|
| Vue | `vue: true` | (auto-detected) |
|
|
| React | `react: true` | `@eslint-react/eslint-plugin eslint-plugin-react-hooks` |
|
|
| Next.js | `nextjs: true` | `@next/eslint-plugin-next` |
|
|
| Svelte | `svelte: true` | `eslint-plugin-svelte` |
|
|
| Astro | `astro: true` | `eslint-plugin-astro` |
|
|
| Solid | `solid: true` | `eslint-plugin-solid` |
|
|
| UnoCSS | `unocss: true` | `@unocss/eslint-plugin` |
|
|
|
|
## Formatters (CSS, HTML, Markdown)
|
|
|
|
For files ESLint doesn't handle natively:
|
|
|
|
```js
|
|
export default antfu({
|
|
formatters: {
|
|
css: true, // Prettier for CSS/LESS/SCSS
|
|
html: true, // Prettier for HTML
|
|
markdown: 'prettier' // or 'dprint'
|
|
}
|
|
})
|
|
// Requires: pnpm add -D eslint-plugin-format
|
|
```
|
|
|
|
## Rule Overrides
|
|
|
|
### Global
|
|
|
|
```js
|
|
export default antfu(
|
|
{ /* config options */ },
|
|
{ rules: { 'style/semi': ['error', 'never'] } }
|
|
)
|
|
```
|
|
|
|
### Per-integration
|
|
|
|
```js
|
|
export default antfu({
|
|
vue: { overrides: { 'vue/operator-linebreak': ['error', 'before'] } },
|
|
typescript: { overrides: { 'ts/consistent-type-definitions': ['error', 'interface'] } },
|
|
})
|
|
```
|
|
|
|
## Plugin Prefix Renaming
|
|
|
|
| New Prefix | Original |
|
|
| ---------- | ---------------------- |
|
|
| `ts/*` | `@typescript-eslint/*` |
|
|
| `style/*` | `@stylistic/*` |
|
|
| `import/*` | `import-lite/*` |
|
|
| `node/*` | `n/*` |
|
|
| `test/*` | `vitest/*` |
|
|
|
|
```ts
|
|
// eslint-disable-next-line ts/consistent-type-definitions
|
|
```
|
|
|
|
## Type-Aware Rules
|
|
|
|
```js
|
|
export default antfu({
|
|
typescript: { tsconfigPath: 'tsconfig.json' },
|
|
})
|
|
```
|
|
|
|
## VS Code Settings
|
|
|
|
```jsonc
|
|
{
|
|
"prettier.enable": false,
|
|
"editor.formatOnSave": false,
|
|
"editor.codeActionsOnSave": { "source.fixAll.eslint": "explicit", "source.organizeImports": "never" },
|
|
"eslint.rules.customizations": [
|
|
{ "rule": "style/*", "severity": "off", "fixable": true },
|
|
{ "rule": "format/*", "severity": "off", "fixable": true },
|
|
{ "rule": "*-indent", "severity": "off", "fixable": true },
|
|
{ "rule": "*-spacing", "severity": "off", "fixable": true }
|
|
],
|
|
"eslint.validate": ["javascript", "typescript", "vue", "html", "markdown", "json", "yaml"]
|
|
}
|
|
```
|