145 lines
4.7 KiB
Markdown
145 lines
4.7 KiB
Markdown
<p>
|
||
<a href="https://www.npmjs.com/package/eslint-define-config" target="_blank">
|
||
<img alt="NPM package" src="https://img.shields.io/npm/v/eslint-define-config.svg">
|
||
</a>
|
||
<a href="https://www.npmjs.com/package/eslint-define-config" target="_blank">
|
||
<img alt="Downloads" src="https://img.shields.io/npm/dt/eslint-define-config.svg">
|
||
</a>
|
||
<a href="https://github.com/eslint-types/eslint-define-config/actions/workflows/ci.yml">
|
||
<img alt="Build Status" src="https://github.com/eslint-types/eslint-define-config/actions/workflows/ci.yml/badge.svg?branch=main">
|
||
</a>
|
||
<a href="https://github.com/eslint-types/eslint-define-config/blob/main/LICENSE">
|
||
<img alt="License: MIT" src="https://img.shields.io/github/license/eslint-types/eslint-define-config.svg">
|
||
</a>
|
||
<a href="https://prettier.io" target="_blank">
|
||
<img alt="Code Style: Prettier" src="https://img.shields.io/badge/code_style-prettier-ff69b4.svg">
|
||
</a>
|
||
<a href="https://www.paypal.com/donate?hosted_button_id=L7GY729FBKTZY" target="_blank">
|
||
<img alt="Donate: PayPal" src="https://img.shields.io/badge/Donate-PayPal-blue.svg">
|
||
</a>
|
||
</p>
|
||
|
||
# eslint-define-config
|
||
|
||
Provide a `defineConfig` function for `.eslintrc.js`, and a `defineFlatConfig` function for `eslint.config.js` files.
|
||
|
||
> This project is written by a human and only partially automatically generated!
|
||
> Some rules are even enhanced by hand!
|
||
> Unfortunately, this has the disadvantage that not everything is immediately defined. For example, if a rule is not defined, it falls back to a basic definition.
|
||
> However, the advantage is that you get documentation for pretty much everything in the code and usually get a direct link to the respective plugin or eslint rule. The types are also strictly typed.
|
||
>
|
||
> So if you are missing something like a rule or a plugin that should also be supported or a rule definition is e.g. out of date, feel free to open an issue or PR for it.
|
||
|
||
# Installation
|
||
|
||
```bash
|
||
# add eslint and eslint-define-config to project’s dev dependencies
|
||
npm add --save-dev eslint eslint-define-config
|
||
# or
|
||
yarn add --dev eslint eslint-define-config
|
||
# or
|
||
pnpm add --save-dev eslint eslint-define-config
|
||
```
|
||
|
||
# Usage
|
||
|
||
`.eslintrc.js`
|
||
|
||
```ts
|
||
// @ts-check
|
||
|
||
// To activate auto-suggestions for Rules of specific plugins, you need to add a `/// <reference types="eslint-plugin-PLUGIN_NAME/define-config-support" />` comment.
|
||
// ⚠️ This feature is very new and requires the support of the respective plugin owners.
|
||
|
||
/// <reference types="@typescript-eslint/eslint-plugin/define-config-support" />
|
||
|
||
const { defineConfig } = require('eslint-define-config');
|
||
|
||
module.exports = defineConfig({
|
||
root: true,
|
||
rules: {
|
||
// rules...
|
||
},
|
||
});
|
||
```
|
||
|
||
## Flat Config
|
||
|
||
`eslint.config.js`
|
||
|
||
```ts
|
||
// @ts-check
|
||
const { defineFlatConfig } = require('eslint-define-config');
|
||
|
||
module.exports = defineFlatConfig([
|
||
'eslint:recommended',
|
||
{
|
||
plugins: {
|
||
// plugins...
|
||
},
|
||
rules: {
|
||
// rules...
|
||
},
|
||
},
|
||
]);
|
||
```
|
||
|
||
# Why?
|
||
|
||
Improve your eslint configuration experience with:
|
||
|
||
- auto-suggestions
|
||
- type checking (Use `// @ts-check` at the first line in your `.eslintrc.js` or `eslint.config.js`)
|
||
- documentation
|
||
- deprecation warnings
|
||
|
||
<img src="https://user-images.githubusercontent.com/7195563/112484789-8a416480-8d7a-11eb-9337-d8b5bc16de17.png" alt="Image" width="600px"/>
|
||
|
||
## Video
|
||
|
||
_Click on the thumbnail to play the video_
|
||
|
||
<a href="https://user-images.githubusercontent.com/7195563/112726158-4a19e780-8f1c-11eb-8cc6-4ea6c100137f.mp4" target="_blank">
|
||
<img src="https://user-images.githubusercontent.com/7195563/112726343-30c56b00-8f1d-11eb-9b92-260c530caf1b.png" alt="Video" width="600px"/>
|
||
</a>
|
||
|
||
## Want to support your own plugin?
|
||
|
||
:warning: **This feature is very new and requires the support of the respective plugin owners**
|
||
|
||
Add a `declare module` to your plugin package like this:
|
||
|
||
```ts
|
||
declare module 'eslint-define-config' {
|
||
export interface CustomRuleOptions {
|
||
/**
|
||
* Require consistently using either `T[]` or `Array<T>` for arrays.
|
||
*
|
||
* @see [array-type](https://typescript-eslint.io/rules/array-type)
|
||
*/
|
||
'@typescript-eslint/array-type': [
|
||
{
|
||
default?: 'array' | 'generic' | 'array-simple';
|
||
readonly?: 'array' | 'generic' | 'array-simple';
|
||
},
|
||
];
|
||
|
||
// ... more Rules
|
||
}
|
||
}
|
||
```
|
||
|
||
There are other interfaces that can be extended.
|
||
|
||
- `CustomExtends`
|
||
- `CustomParserOptions`
|
||
- `CustomParsers`
|
||
- `CustomPlugins`
|
||
- `CustomSettings`
|
||
|
||
# Credits
|
||
|
||
- [Proposal Idea](https://github.com/eslint/eslint/issues/14249)
|
||
- [Vite](https://github.com/vitejs/vite) and [Evan You](https://github.com/yyx990803) for the idea
|
||
- [@antfu](https://github.com/antfu) and his [tweet](https://twitter.com/antfu7/status/1365907188338753536)
|