$ npm install putout
Perfection is finally attained not when there is no longer anything to add, but when there is no longer anything to take away.
(c) Antoine de Saint ExupΓ©ry
πPutout is a JavaScript Linter, pluggable and configurable code transformer, drop-in ESLint replacement with built-in code printer and ability to fix syntax errors. It has a lot of transformations that keeps your codebase in a clean state, removing any code smell and making code readable according to best practices.
The main target is JavaScript, but:
are also supported. Here is how it looks like:
Check out couple variants of plugins that does the same: linting debugger statement:
'use strict';
module.exports.report = () => 'Unexpected "debugger" statement';
module.exports.replace = () => ({
debugger: '',
});
Choose wisely, competitors cannot even fixβ¦ π€«
If I have seen further, it is by standing upon the shoulders of giants.
(c) Isaak Newton
API
.API
documented in Handbook
and responsiveness of a team.config
and plugins
support.βοΈ πPutout on the other hand can make more drastic code transformations that directly affects your codebase making it a better place to code π».
variables
;for-of variables
;typescripts
types;variables
;private fields
;expressions
;variables
;Object.assign()
;replace()
;map
;mapped types
;mapping modifiers
;continue
;operand
;array constructor
;conditions
;type conversion
;functions
;Array.from
;spread
;arguments
;escape
;async
;await
;typeof
;template expressions
;for-of
;array.entries()
;debugger
statement;iife
;process.exit
call;console.log
calls;empty block statements
;empty patterns
;strict mode
directive from esm
;constant conditions
;boolean
from assertion
;boolean
from logical expressions
;duplicates
from TypeScript Union
;unreachable code
;duplicate keys
;typescripts
types;typescripts
interface keys;test.only
to test
calls;test.skip
to test
calls;init
;variable declarations
;nested destructuring
;assignment
;ternary
;logical expressions
;strict mode
directive in commonjs
add it;const
to let
(when needed to avoid TypeError
);apply
to spread
;bitwise
to logical
operator;concat
to flat
;esm
to commonjs
(enabled for *.cjs
);commonjs
to esm
(enabled for *.mjs
);template
with one expression
to string
;equal
to strict equal
;indexOf
to includes
;replace
to replaceAll
;assignment
to arrow function
;forEach
to for...of
;map
to for...of
;reduce
to for...of
;Math.sqrt()
to Math.hypot()
;return await
;Promise.resolve
;Promise.reject
to throw
;reference
;undefined variables
;imports
first;as
type assertions;utility types
;array.at
;filter(Boolean)
;if condition
;await import
;flatMap()
;template literals
;imports
;functions
;npm i putout -D
Usage: putout [options] [path]
Options:
-h, --help display this help and exit
-v, --version output version information and exit
-f, --format [formatter] use a specific output format, the default is: 'progress-bar' locally and 'dump' on CI
-s, --staged add staged files when in git repository
-i, --interactive set lint options using interactive menu
--fix apply fixes of errors to code
--fix-count [count = 10] count of fixes rounds
--rulesdir use additional rules from directory
--transform [replacer] apply Replacer, for example 'var __a = __b -> const __a = __b', read about Replacer https://git.io/JqcMn
--plugins [plugins] a comma-separated list of plugins to use
--enable [rule] enable the rule and save it to '.putout.json' walking up parent directories
--disable [rule] disable the rule and save it to '.putout.json' walking up parent directories
--enable-all enable all found rules and save them to '.putout.json' walking up parent directories
--disable-all disable all found rules (set baseline) and save them to '.putout.json' walking up parent directories
--match [pattern] read '.putout.json' and convert 'rules' to 'match' according to 'pattern'
--flow enable flow
--fresh generate a fresh cache
--no-config avoid reading '.putout.json'
--no-ci disable the CI detection
--no-cache disable the cache
--no-worker disable worker thread
To find errors:
putout lib test
To fix errors:
putout lib test --fix
By default πPutout uses all enabled by default plugins, anyways it can be run with a couple mentioned plugins (split with ","):
putout lib --plugins remove-debugger,remove-unused-variables
πPutout supports next environment variables
:
PUTOUT_FILES
- files that should be processed by putout, divided by ",";PUTOUT_CONFIG_FILE
- path to πPutout config file;ESLINT_CONFIG_FILE
- path to ESLint config file;NO_ESLINT
- do not run ESLint after πPutout;NO_ESLINT_WARNINGS
- do not show ESLint warnings;PUTOUT_FILES=lib,test putout --fix
To configure create .putout.json
file and override any of default options.
When you need to match paths to rules you can use match
section for this purpose in .putout.json
:
{
"match": {
"server": {
"remove-process-exit": true
}
}
}
When you need to ignore some routes no metter what, you can use ignore
section in .putout.json
:
{
"ignore": ["test/fixture"]
}
πPutout supports two types of plugins
, prefix with:
@putout/plugin-
;putout-plugin-
;To use your plugin createnpm
package with keywords putout
, putout-plugin
and add it to .putout.json
.
For example if you need to remove-something
create πPutout plugin with name putout-plugin-remove-something
and it to package.json
:
{
"plugins": ["remove-something"]
}
πPutout supports codemodes
in the similar to plugins way, just create a directory ~/.putout
and put your plugins there. Here is example: convert-tape-to-supertape and this is examples of work.
All examples works both in ESM and CommonJS.
CommonJS:
const putout = require('putout');
ESM:
import {putout} from 'putout';
import {putout} from 'putout';
const source = `
const t = 'hello';
const m = t + '!';
console.log(t);
`;
putout(source, {
plugins: ['remove-unused-variables'],
});
// returns
`
const t = 'hello';
console.log(t);
`;
import {putoutAsync} from 'putout';
const source = `
const t = 'hello';
const m = t + '!';
console.log(t);
`;
await putoutAsync(source, {
plugins: ['remove-unused-variables'],
});
// returns
`
const t = 'hello';
console.log(t);
`;
MIT
© 2010 - cnpmjs.org x YWFE | Home | YWFE