14.0.1 β€’ Published 8 months ago

@putout/plugin-eslint v14.0.1

Weekly downloads
1,537
License
MIT
Repository
github
Last release
8 months ago

@putout/plugin-eslint NPM version

Find and fix problems in your JavaScript code

(c) eslint.org

🐊Putout plugin helps to automate fixing ESLint config.

Install

npm i @putout/plugin-eslint -D

Rules

Config

{
    "rules": {
        "eslint/add-putout": "on",
        "eslint/apply-define-config": "on",
        "eslint/apply-dir-to-flat": "on",
        "eslint/apply-create-eslint": "on",
        "eslint/apply-ignores": ["off", {
            "ignores": ["**/fixture"]
        }],
        "eslint/apply-safe-align": "on",
        "eslint/apply-match-to-flat": "on",
        "eslint/declare": "on",
        "eslint/move-putout-to-end-of-extends": "on",
        "eslint/convert-export-match-to-decleration": "on",
        "eslint/convert-files-to-array": "on",
        "eslint/convert-ide-to-safe": "on",
        "eslint/convert-require-to-import": "on",
        "eslint/convert-node-to-n": "on",
        "eslint/convert-plugins-array-to-object": "on",
        "eslint/convert-rc-to-flat": "off",
        "eslint/remove-no-missing": "on",
        "eslint/remove-no-unpublished-require": "on",
        "eslint/remove-no-unsupported-features": "on",
        "eslint/remove-overrides-with-empty-rules": "on",
        "eslint/remove-useless-slice": "on",
        "eslint/remove-useless-define-config": "on",
        "eslint/remove-useless-properties": "on",
        "eslint/remove-useless-match-to-flat": "on",
        "eslint/remove-parser-options": "on",
        "eslint/remove-suffix-config": "on",
        "eslint/remove-create-eslint-config-with-one-argument": "on",
        "eslint/remove-spread-from-create-eslint-config": "on"
    }
}

add-putout

{
    "extends": [
+       "plugin:putout/safe+align",
        "plugin:node/recommended"
    ],
    "plugins": [
+       "putout",
        "node"
    ]
}

apply-define-config

Checkout in 🐊Putout Editor.

❌ Example of incorrect code

import {safeAlign} from 'eslint-plugin-putout';
import {createESLintConfig} from '@putout/eslint-flat';

export default createESLintConfig([
    safeAlign, {
        ignores: ['**/fixture'],
    },
]);

βœ… Example of correct code

import {safeAlign} from 'eslint-plugin-putout';
import {defineConfig} from '@eslint/config';

export default defineConfig([
    safeAlign, {
        ignores: ['**/fixture'],
    },
]);

apply-ignores

Checkout in 🐊Putout Editor. Legacy config:

{
    "extends": [
        "plugin:putout/safe+align",
        "plugin:node/recommended"
    ],
    "plugins": [
        "putout",
        "node"
    ],
    "ignorePatterns": [
        "**/fixture"
    ]
}

Flat config:

-export default safeAlign;
+export default [
+   ...safeAlign, {
+   ignores: [
+       "**/fixture"
+   ]
+}];

apply-create-eslint

Checkout in 🐊Putout Editor.

❌ Example of incorrect code

export default [
    ...safeAlign, {
        ignores: ['**/fixture'],
    },
];

βœ… Example of correct code

export default createESLintConfig([
    safeAlign, {
        ignores: ['**/fixture'],
    },
]);

apply-safe-align

{
-    "rules": {
-       "putout/align-spaces": "error"
-    },
    "extends": [
-       "plugin:putout/safe",
+       "plugin:putout/safe+align",
        "plugin:node/recommended"
    ],
    "plugins": [
        "putout",
        "node"
    ]
}

apply-dir-to-flat

matchToFlatDir() and mergeESLintConfigs supports __dirname or import.meta.url starting from v2 of @putout/eslint-flat.

Check out in 🐊Putout Editor.

❌ Example of incorrect code

const scriptsConfig = await matchToFlatDir('scripts');
const monoConfig = await mergeESLintConfigs(['codemods', 'packages', 'rules']);

module.exports = [
    ...scriptsConfig,
    ...monoConfig,
];

βœ… Example of correct code

// CommonJS
const scriptsConfig = await matchToFlatDir(__dirname, 'scripts');

// ESM
const monoConfig = await mergeESLintConfigs(import.meta.url, ['codemods', 'packages', 'rules']);

module.exports = [
    ...scriptsConfig,
    ...monoConfig,
];

apply-match-to-flat

Check out in 🐊Putout Editor.

❌ Example of incorrect code

import {safeAlign} from 'eslint-plugin-putout/config';

export default [
    ...safeAlign, {
        files: ['*.d.ts'],
        rules: {
            'no-var': 'off',
        },
    }, {
        files: ['*.spec.*'],
        rules: {
            'node/no-extraneous-import': 'off',
        },
    },
];

βœ… Example of correct code

import {safeAlign} from 'eslint-plugin-putout/config';

const config = matchToFlat({
    '*.d.ts': {
        'no-var': 'off',
    },
    '*.spec.*': {
        'node/no-extraneous-import': 'off',
    },
});

export default [
    ...safeAlign,
    ...config,
];

move-putout-to-end-of-extends

❌ Example of incorrect code

{
    "extends": [
        "plugin:putout/recommended",
        "plugin:node/recommended"
    ],
    "plugins": [
        "putout",
        "node"
    ]
}

βœ… Example of correct code

{
    "extends": [
        "plugin:node/recommended",
        "plugin:putout/recommended"
    ],
    "plugins": [
        "putout",
        "node"
    ]
}

convert-ide-to-safe

❌ Example of incorrect code

{
    "extends": [
        "plugin:node/recommended",
        "plugin:putout/ide"
    ],
    "plugins": [
        "putout",
        "node"
    ]
}

βœ… Example of correct code

{
    "extends": [
        "plugin:node/recommended",
        "plugin:putout/safe"
    ],
    "plugins": [
        "putout",
        "node"
    ]
}

convert-files-to-array

Check it out in 🐊Putout Editor.

{
    "overrides": [{
-        "files": "test/*.js",
+        "files": ["test/*.js"],
         "rules": {
           "node/no-missing-require": "off"
        }
    }],
};

convert-require-to-import

node/no-missing-require has no sense when type=module in package.json. Check it out in 🐊Putout Editor.

{
    "overrides": [{
        "files": "test/*.js",
        "rules": {
-           "node/no-missing-require": "off"
+           "node/no-missing-import": "off"
        }
    }],
    "extends": [
        "plugin:node/recommended",
        "plugin:putout/recommended"
    ],
    "plugins": [
        "putout",
        "node"
    ]
};

remove-no-unpublished-require

node/remove-no-unpublished-require should be enabled, since this is a very useful rule, which shows what files should be add to .npmignore.

{
    "overrides": [{
        "files": "test/*.js",
        "rules": {
-           "node/no-unpublished-require": "off"
        }
    }],
    "extends": [
        "plugin:node/recommended",
        "plugin:putout/recommended"
    ],
    "plugins": [
        "putout",
        "node"
    ]
};

remove-no-unsupported-features

node/remove-no-unsupported-features is already disabled in eslint-plugin-putout.

{
    "overrides": [{
        "files": "test/*.js",
        "rules": {
-           "node/no-unpublished-require": "off"
        }
    }],
    "extends": [
        "plugin:node/recommended",
        "plugin:putout/recommended"
    ],
    "plugins": [
        "putout",
        "node"
    ]
};

remove-overrides-with-empty-rules

overrides with rules: {} has no sense. Check out in 🐊Putout Editor:

Remove overrides with one element with empty rules:

{
-   "overrides": [{
-       "files": "test/*.js",
-       "rules": {
-       }
-   }],
    "extends": [
        "plugin:node/recommended",
        "plugin:putout/recommended"
    ],
    "plugins": [
        "putout",
        "node"
    ]
};

Or remove empty overrides:

{
-   "overrides": [],
    "extends": [
        "plugin:node/recommended",
        "plugin:putout/recommended"
    ],
    "plugins": [
        "putout",
        "node"
    ]
};

And ofcourse remove only elements with empty rules:

{
  "overrides": [{
-   "files": "test/*.js",
-   "rules": {
-   }
- }, {
    "files": "test/*.js",
    "rules": {
      "no-semi": "off"
    }
  }],
    "extends": [
      "plugin:node/recommended",
      "plugin:putout/recommended"
    ],
    "plugins": [
      "putout",
      "node"
    ]
};

remove-parser-options

In flat config files, the globals, and parserOptions are consolidated under the languageOptions key;

(c) eslint.org

Check out in 🐊Putout Editor

❌ Example of incorrect code

const ruleTester = new RuleTester({
    languageOptions: {
        parserOptions: {
            ecmaVersion: 2025,
            sourceType: 'module',
        },
    },
});

βœ… Example of correct code

const ruleTester = new RuleTester({
    languageOptions: {
        ecmaVersion: 2025,
        sourceType: 'module',
    },
});

remove-suffix-config

Checkout in 🐊Putout Editor.

❌ Example of incorrect code

import {safeAlign} from 'eslint-plugin-putout/config';

βœ… Example of correct code

import {safeAlign} from 'eslint-plugin-putout';

remove-create-eslint-config-with-one-argument

Checkout in 🐊Putout Editor.

❌ Example of incorrect code

export default createESLintConfig([safeAlign]);

βœ… Example of correct code

export default safeAlign;

remove-spread-from-create-eslint-config

Checkout in 🐊Putout Editor.

❌ Example of incorrect code

export default createESLintConfig([
    safeAlign,
    ...matchToFlat(match),
]);

βœ… Example of correct code

export default createESLintConfig([safeAlign, matchToFlat(match)]);

convert-node-to-n

eslint-plugin-node is no longer supported. Better to use eslint-plugin-n.

{
    "extends": [
        "plugin:putout/safe+align",
-       "plugin:node/recommended"
+       "plugin:n/recommended"
    ],
    "plugins": [
        "putout",
-       "node"
+       "n"
    ]
}

remove-no-missing

node/remove-no-missing-require and node/remove-no-missing-import doesn't supports exports and already disabled by eslint-plugin-putout.

{
    "overrides": [{
        "files": "test/*.js",
        "rules": {
-           "node/no-missing-require": "off",
-           "node/no-missing-import": "off"
        }
    }],
    "extends": [
        "plugin:node/recommended",
        "plugin:putout/recommended"
    ],
    "plugins": [
        "putout",
        "node"
    ]
};

remove-useless-slice

Fixes code after convert-array-copy-to-slice.

Checkout in 🐊Putout Editor.

❌ Example of incorrect code

export default x.slice();

module.exports = x.slice();

βœ… Example of correct code

export default x;

module.exports = x;

remove-useless-define-config

Checkout in 🐊Putout Editor.

❌ Example of incorrect code

export default defineConfig([safeAlign]);

βœ… Example of correct code

export default safeAlign;

remove-useless-properties

Checkout in 🐊Putout Editor.

❌ Example of incorrect code

module.exports = [
    ...safeAlign, {
        rules: {},
    },
];

βœ… Example of correct code

module.exports = safeAlign;

remove-useless-match-to-flat

Checkout in 🐊Putout Editor.

❌ Example of incorrect code

import {safeAlign} from 'eslint-plugin-putout';

export let match;
export default createESLintConfig([safeAlign, matchToFlat(match)]);

βœ… Example of correct code

import {safeAlign} from 'eslint-plugin-putout';

export default safeAlign;

convert-export-match-to-declaration

Fixes apply-match-to-flat. Checkout in 🐊Putout Editor.

❌ Example of incorrect code

module.exports.match = {
    'bin/**': {
        'no-process-exit': 'off',
    },
};

module.exports = [
    ...safeAlign, {
        rules: {
            'node/no-unsupported-features/node-builtins': 'off',
        },
    },
    ...matchToFlat(match),
];

βœ… Example of correct code

const match = {
    'bin/**': {
        'no-process-exit': 'off',
    },
};

module.exports = [
    ...safeAlign, {
        rules: {
            'node/no-unsupported-features/node-builtins': 'off',
        },
    },
    ...matchToFlat(match),
];

module.exports.match = match;

declare

Declare:

convert-plugins-array-to-object

On the surface, using a plugin in flat config looks very similar to using a plugin in eslintrc. The big difference is that eslintrc used strings whereas flat configs uses objects. Instead of specifying the name of a plugin, you import the plugin directly and place it into the plugins key.

(c) eslint.org

Checkout in 🐊Putout Editor.

❌ Example of incorrect code

import {types} from 'putout';

const {react} = types;

export default {
    plugins: [react],
};

module.exports = {
    plugins: ['react'],
};

βœ… Example of correct code

import {types} from 'putout';

const {react} = types;

export default {
    plugins: {
        react,
    },
};

module.exports = {
    plugins: ['react'],
};

convert-rc-to-flat

Checkout in 🐊Putout Editor:

Converts .eslintrc.json:

{
    "root": true,
    "parser": "@typescript-eslint/parser",
    "env": {
        "node": true
    },
    "extends": ["eslint:recommended"],
    "plugins": ["@nx"],
    "rules": {
        "@typescript-eslint/explicit-module-boundary-types": "error"
    },
    "overrides": [{
        "files": ["*.json"],
        "parser": "jsonc-eslint-parser"
    }, {
        "files": [
            "*.ts",
            "*.tsx",
            "*.js",
            "*.jsx"
        ],
        "rules": {
            "@nx/enforce-module-boundaries": ["error", {
                "enforceBuildableLibDependency": true,
                "allow": [],
                "depConstraints": [{
                    "sourceTag": "*",
                    "onlyDependOnLibsWithTags": ["*"]
                }]
            }]
        }
    }]
}

To .eslint.config.js:

const nxPlugin = require('@nx/eslint-plugin');
const js = require('@eslint/js');
const globals = require('globals');
const jsoncParser = require('jsonc-eslint-parser');
const tsParser = require('@typescript-eslint/parser');

module.exports = [
    js.configs.recommended, {
        plugins: {
            '@nx': nxPlugin,
        },
    }, {
        languageOptions: {
            parser: tsParser,
            globals: {
                ...globals.node,
            },
        },
        rules: {
            '@typescript-eslint/explicit-module-boundary-types': ['error'],
        },
    }, {
        files: ['*.json'],
        languageOptions: {
            parser: jsoncParser,
        },
        rules: {},
    }, {
        files: [
            '*.ts',
            '*.tsx',
            '*.js',
            '*.jsx',
        ],
        rules: {
            '@nx/enforce-module-boundaries': ['error', {
                enforceBuildableLibDependency: true,
                allow: [],
                depConstraints: [{
                    sourceTag: '*',
                    onlyDependOnLibsWithTags: ['*'],
                }],
            }],
        },
    }];

License

MIT

10.0.0

11 months ago

13.1.0

9 months ago

12.4.0

10 months ago

12.0.0

10 months ago

12.2.0

10 months ago

11.6.0

10 months ago

11.4.0

10 months ago

11.2.0

10 months ago

11.0.0

10 months ago

14.0.0

8 months ago

14.0.1

8 months ago

13.0.0

9 months ago

13.0.1

9 months ago

12.3.0

10 months ago

12.1.0

10 months ago

11.7.0

10 months ago

11.5.0

10 months ago

11.3.0

10 months ago

11.1.0

10 months ago

8.13.0

1 year ago

9.1.0

1 year ago

9.0.0

1 year ago

8.12.0

2 years ago

8.12.1

2 years ago

8.11.1

2 years ago

8.11.2

2 years ago

8.11.0

2 years ago

8.10.1

2 years ago

8.10.0

2 years ago

8.9.0

2 years ago

8.8.1

2 years ago

8.8.2

2 years ago

8.8.0

2 years ago

8.7.0

2 years ago

8.6.0

2 years ago

8.5.0

2 years ago

8.4.0

2 years ago

8.5.1

2 years ago

8.3.0

2 years ago

8.2.0

2 years ago

8.1.0

2 years ago

8.0.1

2 years ago

8.0.0

2 years ago

7.2.0

2 years ago

7.1.0

2 years ago

7.0.0

2 years ago

6.0.0

2 years ago

5.0.0

3 years ago

4.1.0

3 years ago

4.0.0

4 years ago

4.2.0

3 years ago

3.2.0

4 years ago

3.1.0

4 years ago

3.0.0

4 years ago

2.1.0

4 years ago

2.0.0

4 years ago

1.1.0

4 years ago

1.0.1

5 years ago

1.0.0

5 years ago