@putout/plugin-eslint v14.0.1
@putout/plugin-eslint 
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 -DRules
- β add-putout;
- β apply-define-config;
- β apply-dir-to-flat;
- β apply-ignores;
- β apply-create-eslint;
- β apply-match-to-flat;
- β apply-safe-align;
- β convert-export-match-to-declaration;
- β convert-files-to-array;
- β convert-ide-to-safe;
- β convert-node-to-n;
- β convert-plugins-array-to-object;
- β convert-rc-to-flat;
- β convert-require-to-import;
- β declare;
- β move-putout-to-end-of-extends;
- β remove-no-missing;
- β remove-useless-define-config;
- β remove-no-unpublished-require;
- β remove-no-unsupported-features;
- β remove-overrides-with-empty-rules;
- β remove-useless-slice;
- β remove-useless-properties;
- β remove-useless-match-to-flat;
- β remove-parser-options;
- β remove-suffix-config;
- β remove-create-eslint-config-with-one-argument;
- β remove-spread-from-create-eslint-config;
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, andparserOptionsare consolidated under thelanguageOptionskey;(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 configlooks very similar to using a plugin ineslintrc. The big difference is thateslintrcusedstrings whereasflat configsusesobjects. Instead of specifying the name of a plugin, you import the plugin directly and place it into the pluginskey.(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 months ago
7 months ago
8 months ago
9 months ago
8 months ago
9 months ago
9 months ago
9 months ago
9 months ago
7 months ago
7 months ago
8 months ago
8 months ago
8 months ago
9 months ago
9 months ago
9 months ago
9 months ago
9 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
4 years ago
4 years ago
5 years ago
5 years ago