3.4.0 β€’ Published 8 days ago

@putout/eslint v3.4.0

Weekly downloads
-
License
MIT
Repository
github
Last release
8 days ago

@putout/eslint NPM version

Wrapper that simplifies ESLint API and makes it compatible with 🐊Putout.

☝️ FlatConfig supported from the box.

Install

npm i @putout/eslint

Environment Variables

  • ☝️ To set custom config file for ESLint use ESLINT_CONFIG_FILE env variable:
  • ☝️ To disable ESLint support use NO_ESLINT=1 env variable:
  • ☝️ If you want to ignore ESLint warnings (which is unfixable errors in 🐊Putout language) use NO_ESLINT_WARNINGS=1:
NO_ESLINT_WARNINGS=1 putout --fix lib

## API

### `eslint(options)`

**ESLint** begins his work as a formatter when 🐊**Putout** done his transformations. That's why it used a lot in different parts of application, for testing purpose and using **API** in a simplest possible way. You can access it with:

```js
import eslint from '@putout/eslint';

To use it simply write:

const [source, places] = await eslint({
    name: 'hello.js',
    code: `const t = 'hi'\n`,
    fix: false,
});

Isn't it looks similar to 🐊Putout way? It definitely is! But... It has a couple differences you should remember:

And you can even override any of ESLint βš™οΈ options with help of config property:

const [source, places] = await eslint({
    name: 'hello.js',
    code: `const t = 'hi'\n`,
    fix: false,
    config: {
        extends: ['plugin:putout/recommended'],
    },
});

If you want to apply 🐊Putout transformations using putout/putout ESLint rule, enable 🐊Putout with the same called but lowercased flag:

const [source, places] = await eslint({
    name: 'hello.js',
    code: `const t = 'hi'\n`,
    fix: true,
    putout: true,
    config: {
        extends: ['plugin:putout/recommended'],
    },
});

It is disabled by default, because ESLint always runs after 🐊Putout transformations, so there is no need to traverse tree again.

createPlugin(options)

You can also simplify creating of plugins for ESLint with help of createPlugin. 🐊Putout-based ESLint plugin are highly inspired by Putout Plugins API of Includer.

So it must contain classic 4 methods:

module.exports.report = () => 'debugger statement should not be used';

module.exports.fix = (path) => {
    return '';
};

module.exports.include = () => [
    'DebuggerStatement',
];

module.exports.filter = (path) => {
    return true;
};

The main difference with Includer is:

  • fix works with text;
  • include does not support 🦎PutoutScript;
  • there is no exclude;

Take a look at more sophisticated example, rule remove-duplicate-extensions:

const getValue = ({source}) => source?.value;

module.exports.report = () => 'Avoid duplicate extensions in relative imports';
module.exports.include = () => [
    'ImportDeclaration',
    'ImportExpression',
    'ExportAllDeclaration',
    'ExportNamedDeclaration',
];

module.exports.fix = ({text}) => {
    return text.replace('.js.js', '.js');
};

module.exports.filter = ({node}) => {
    const value = getValue(node);
    return /\.js\.js/.test(value);
};

To use it just add couple lines to your main plugin file:

const {createPlugin} = require('@putout/eslint/create-plugin');

const createRule = (a) => ({
    [a]: createPlugin(require(`./${a}`)),
});

module.exports.rules = {
    ...createRule('remove-duplicate-extensions'),
};

Or just:

const {createPlugin} = require('@putout/eslint/create-plugin');

module.exports.rules = {
    'remove-duplicate-extensions': createPlugin(require('./remove-duplicate-extensions')),
};

lint(source, {fix, plugins, options, filename})

When you need to run ESLint with one plugin (rule), just use lint it will do the thing.

const lint = require('@putout/eslint/lint');
const {createPlugin} = require('@putout/eslint/create-plugin');
const removeDebugger = require('./remove-debugger');

const [code, places] = lint('debugger', {
    fix: true, // default
    plugins: [
        ['remove-debugger', createPlugin(removeDebugger)],
    ],
});

When you want to skip plugins, and just provide options and filename you can:

const lint = require('@putout/eslint/lint');

const [code, places] = lint('debugger', {
    filename: 'index.js',
    options: [{
        rules: {
            semi: 'error',
        },
    }],
});

License

MIT

3.4.0

8 days ago

3.3.0

20 days ago

3.2.0

21 days ago

3.1.0

4 months ago

3.0.0

5 months ago

2.3.0

9 months ago

2.4.0

7 months ago

2.2.0

11 months ago

2.1.0

12 months ago

1.9.0

1 year ago

1.8.0

1 year ago

1.10.1

1 year ago

1.10.0

1 year ago

2.0.1

1 year ago

2.0.0

1 year ago

1.7.0

1 year ago

1.6.0

1 year ago

1.5.0

2 years ago

1.4.0

2 years ago

1.3.0

2 years ago

1.2.0

2 years ago

1.1.0

2 years ago

1.0.1

2 years ago

1.0.0

2 years ago