Skip to content

Commit

Permalink
feat!: new config factory instead of presets
Browse files Browse the repository at this point in the history
  • Loading branch information
antfu committed Sep 21, 2023
1 parent edb8424 commit 9ee683e
Show file tree
Hide file tree
Showing 11 changed files with 389 additions and 283 deletions.
103 changes: 59 additions & 44 deletions README.md
Expand Up @@ -29,14 +29,7 @@ pnpm add -D eslint @antfu/eslint-config
// eslint.config.js
import antfu from '@antfu/eslint-config'

export default [
...antfu,
{
rules: {
// your overrides
},
},
]
export default antfu()
```

> You don't need `.eslintignore` normally as it has been provided by the preset.
Expand Down Expand Up @@ -81,7 +74,11 @@ Add the following settings to your `settings.json`:
{ "rule": "*-indent", "severity": "off" },
{ "rule": "*-spacing", "severity": "off" },
{ "rule": "*-spaces", "severity": "off" },
{ "rule": "*-order", "severity": "off" }
{ "rule": "*-order", "severity": "off" },
{ "rule": "*-dangle", "severity": "off" },
{ "rule": "*-newline", "severity": "off" },
{ "rule": "*quotes", "severity": "off" },
{ "rule": "*semi", "severity": "off" }
],

// The following is optional.
Expand All @@ -107,28 +104,53 @@ Add the following settings to your `settings.json`:

Since v1.0, we migrated to [ESLint Flat config](https://eslint.org/docs/latest/use/configure/configuration-files-new), provides a much better organization and composition.

You can now compose your own config easily:
Normally you only need to import the `antfu` preset:

```js
// eslint.config.js
import {
presetAuto,
presetJavaScriptCore,
presetLangsExtensions,
presetTypeScript,
} from '@antfu/eslint-config'
import antfu from '@antfu/eslint-config'

export default [
// javascript, node, unicorn, jsdoc, imports, etc.
...presetJavaScriptCore,
// typescript support
...presetTypeScript,
// yaml, markdown, json, support
...presetLangsExtensions,
]
export default antfu()
```

Or even more granular:
You can configure each feature individually, for example:

```js
// eslint.config.js
import antfu from '@antfu/eslint-config'

export default antfu({
stylistic: true, // enable stylistic formatting rules
typescript: true,
vue: true,
jsonc: false,
yml: false,
})
```

The `antfu` factory functions also accepts arbitrary numbers of constom configs overrides:

```js
// eslint.config.js
import antfu from '@antfu/eslint-config'

export default antfu(
{
// Configures for antfu's config
},

// From the second arguments they are ESLint Flat Configs
// you can have multiple configs
{
rules: {},
},
{
rules: {},
},
)
```

Going more advanced, you can also import the very fine-grained configs and compose them as you wish:

```js
// eslint.config.js
Expand All @@ -153,48 +175,41 @@ import {

export default [
...ignores,
...javascript,
...javascript(),
...comments,
...node,
...jsdoc,
...imports,
...unicorn,
...javascriptStylistic,

...typescript,
...typescript(),
...typescriptStylistic,

...vue,

...vue(),
...jsonc,
...yml,
...markdown,
...markdown(),
]
```

Check out the [presets](https://github.com/antfu/eslint-config/blob/main/packages/eslint-config/src/presets.ts) and [configs](https://github.com/antfu/eslint-config/blob/main/packages/eslint-config/src/configs) for more details.
Check out the [configs](https://github.com/antfu/eslint-config/blob/main/packages/eslint-config/src/configs) and [factory](https://github.com/antfu/eslint-config/blob/main/packages/eslint-config/src/factory.ts) for more details.

> Thanks to [sxzz/eslint-config](https://github.com/sxzz/eslint-config) for the inspiration and reference.
### Type Aware Rules

You can optionally enable the [type aware rules](https://typescript-eslint.io/linting/typed-linting/) by importing `typescriptWithLanguageServer` config:
You can optionally enable the [type aware rules](https://typescript-eslint.io/linting/typed-linting/) by passing the options object to the `typescript` config:

```js
// eslint.config.js
import { presetAuto, typescriptWithLanguageServer } from '@antfu/eslint-config'
import antfu from '@antfu/eslint-config'

export default [
...presetAuto,
...typescriptWithLanguageServer({
tsconfig: 'tsconfig.json', // path to your tsconfig
}),
{
rules: {
// your overrides
},
export default antfu({
typescript: {
tsconfigPath: 'tsconfig.json',
},
]
})
```

### Lint Staged
Expand Down Expand Up @@ -240,7 +255,7 @@ This config does NOT lint CSS. I personally use [UnoCSS](https://github.com/unoc

### I prefer XXX...

Sure, you can override rules locally in your project to fit your needs. Or you can always fork this repo and make your own.
Sure, you can config and override rules locally in your project to fit your needs. If that still does not work for you, you can always fork this repo and maintain your own.

## Check Also

Expand Down
9 changes: 4 additions & 5 deletions eslint.config.js
@@ -1,10 +1,9 @@
import { defineFlatConfig } from 'eslint-define-config'
import { presetAuto } from '@antfu/eslint-config'
import antfu from '@antfu/eslint-config'
import stylisticMigrate from '@stylistic/eslint-plugin-migrate'
import sortKeys from 'eslint-plugin-sort-keys'

export default defineFlatConfig([
...presetAuto,
export default antfu(
undefined,
{
files: ['**/eslint-config/src/**/*.ts'],
plugins: {
Expand All @@ -16,4 +15,4 @@ export default defineFlatConfig([
'sort-keys/sort-keys-fix': 'error',
},
},
])
)
88 changes: 49 additions & 39 deletions packages/eslint-config/src/configs/markdown.ts
@@ -1,52 +1,62 @@
import type { FlatESLintConfigItem } from 'eslint-define-config'
import { GLOB_MARKDOWN, GLOB_SRC, GLOB_VUE } from '../globs'
import { GLOB_MARKDOWN, GLOB_MARKDOWN_CODE } from '../globs'
import { pluginMarkdown } from '../plugins'
import { OFF } from '../flags'
import type { OptionsComponentExts } from '../types'

export const markdown: FlatESLintConfigItem[] = [
{
files: [GLOB_MARKDOWN],
plugins: {
markdown: pluginMarkdown,
export function markdown(options: OptionsComponentExts = {}): FlatESLintConfigItem[] {
const {
componentExts = [],
} = options

return [
{
files: [GLOB_MARKDOWN],
plugins: {
markdown: pluginMarkdown,
},
processor: 'markdown/markdown',
},
processor: 'markdown/markdown',
},
{
files: [`${GLOB_MARKDOWN}/${GLOB_SRC}`, `${GLOB_MARKDOWN}/${GLOB_VUE}`],
languageOptions: {
parserOptions: {
ecmaFeatures: {
impliedStrict: true,
{
files: [
GLOB_MARKDOWN_CODE,
...componentExts.map(ext => `${GLOB_MARKDOWN}/**/*.${ext}`),
],
languageOptions: {
parserOptions: {
ecmaFeatures: {
impliedStrict: true,
},
},
},
},
rules: {
...pluginMarkdown.configs.recommended.overrides[1].rules,
'@typescript-eslint/comma-dangle': OFF,
'@typescript-eslint/consistent-type-imports': OFF,
'@typescript-eslint/no-namespace': OFF,
'@typescript-eslint/no-redeclare': OFF,
'@typescript-eslint/no-require-imports': OFF,
'@typescript-eslint/no-unused-vars': OFF,
'@typescript-eslint/no-use-before-define': OFF,
'@typescript-eslint/no-var-requires': OFF,
rules: {
...pluginMarkdown.configs.recommended.overrides[1].rules,
'@typescript-eslint/comma-dangle': OFF,
'@typescript-eslint/consistent-type-imports': OFF,
'@typescript-eslint/no-namespace': OFF,
'@typescript-eslint/no-redeclare': OFF,
'@typescript-eslint/no-require-imports': OFF,
'@typescript-eslint/no-unused-vars': OFF,
'@typescript-eslint/no-use-before-define': OFF,
'@typescript-eslint/no-var-requires': OFF,

'antfu/no-cjs-exports': OFF,
'antfu/no-ts-export-equal': OFF,
'antfu/no-cjs-exports': OFF,
'antfu/no-ts-export-equal': OFF,

'import/no-unresolved': OFF,
'import/no-unresolved': OFF,

'n/prefer-global/process': OFF,
'n/prefer-global/process': OFF,

'no-alert': OFF,
'no-console': OFF,
'no-restricted-imports': OFF,
'no-undef': OFF,
'no-unused-expressions': OFF,
'no-unused-vars': OFF,
'no-alert': OFF,
'no-console': OFF,
'no-restricted-imports': OFF,
'no-undef': OFF,
'no-unused-expressions': OFF,
'no-unused-vars': OFF,

'unused-imports/no-unused-imports': OFF,
'unused-imports/no-unused-vars': OFF,
'unused-imports/no-unused-imports': OFF,
'unused-imports/no-unused-vars': OFF,
},
},
},
]
]
}
1 change: 0 additions & 1 deletion packages/eslint-config/src/configs/sort.ts
Expand Up @@ -5,7 +5,6 @@ import type { FlatESLintConfigItem } from 'eslint-define-config'
*
* Requires `jsonc` config
*/

export const sortPackageJson: FlatESLintConfigItem[] = [
{
files: ['**/package.json'],
Expand Down
1 change: 0 additions & 1 deletion packages/eslint-config/src/configs/stylistic.ts
Expand Up @@ -9,7 +9,6 @@ export const javascriptStylistic: FlatESLintConfigItem[] = [
'@stylistic/js': pluginStylisticJs,
},
rules: {
// Stylistic
'@stylistic/js/array-bracket-spacing': ['error', 'never'],
'@stylistic/js/arrow-spacing': ['error', { after: true, before: true }],
'@stylistic/js/block-spacing': ['error', 'always'],
Expand Down

0 comments on commit 9ee683e

Please sign in to comment.